Module: sems Branch: master Commit: 7fbe92bbd7011b05ea2a357b59610f15a44bdcca URL: http://git.sip-router.org/cgi-bin/gitweb.cgi/sems/?a=commit;h=7fbe92bbd7011b05ea2a357b59610f15a44bdcca
Author: Stefan Sayer <[email protected]> Committer: Stefan Sayer <[email protected]> Date: Fri Jul 16 00:16:47 2010 +0200 fix authentication on outgoing calls uac auth now resets the dialog status back to what it was before the failed request, if a request is retried with authentication. --- apps/webconference/WebConferenceDialog.cpp | 5 +++++ core/AmB2BSession.cpp | 2 +- core/AmSession.cpp | 2 +- core/AmSessionEventHandler.cpp | 2 +- core/AmSessionEventHandler.h | 2 +- core/AmSipDialog.cpp | 7 +++++++ core/AmSipDialog.h | 2 ++ core/plug-in/session_timer/SessionTimer.cpp | 2 +- core/plug-in/session_timer/SessionTimer.h | 2 +- core/plug-in/uac_auth/UACAuth.cpp | 5 ++++- core/plug-in/uac_auth/UACAuth.h | 2 +- 11 files changed, 25 insertions(+), 8 deletions(-) diff --git a/apps/webconference/WebConferenceDialog.cpp b/apps/webconference/WebConferenceDialog.cpp index b26806c..229d44c 100644 --- a/apps/webconference/WebConferenceDialog.cpp +++ b/apps/webconference/WebConferenceDialog.cpp @@ -179,6 +179,11 @@ void WebConferenceDialog::onSipReply(const AmSipReply& reply, int old_dlg_status AmSession::onSipReply(reply,old_dlg_status); + DBG("reply: %u %s, old_dlg_status = %s, status = %s\n", + reply.code, reply.reason.c_str(), + AmSipDialog::status2str[old_dlg_status], + AmSipDialog::status2str[dlg.getStatus()]); + if ((old_dlg_status < AmSipDialog::Connected) && (dlg.getStatus() == AmSipDialog::Disconnected)) { DBG("Call failed.\n"); diff --git a/core/AmB2BSession.cpp b/core/AmB2BSession.cpp index cb867cc..2963769 100644 --- a/core/AmB2BSession.cpp +++ b/core/AmB2BSession.cpp @@ -236,7 +236,7 @@ void AmB2BSession::onSipReply(const AmSipReply& reply, int old_dlg_status) if (is_offer) { // onSipReply from AmSession without do_200_ack in dlg.updateStatus(reply) // todo (?): add do_200_ack flag to AmSession::onSipReply and call AmSession::onSipReply - CALL_EVENT_H(onSipReply,reply); + CALL_EVENT_H(onSipReply,reply,old_dlg_status); //int status = dlg.getStatus(); //dlg.updateStatus(reply, false); diff --git a/core/AmSession.cpp b/core/AmSession.cpp index d622dab..7427e92 100644 --- a/core/AmSession.cpp +++ b/core/AmSession.cpp @@ -713,7 +713,7 @@ void AmSession::onSipRequest(const AmSipRequest& req) void AmSession::onSipReply(const AmSipReply& reply, int old_dlg_status) { - CALL_EVENT_H(onSipReply,reply); + CALL_EVENT_H(onSipReply,reply,old_dlg_status); if (old_dlg_status != dlg.getStatus()) DBG("Dialog status changed %s -> %s (stopped=%s) \n", diff --git a/core/AmSessionEventHandler.cpp b/core/AmSessionEventHandler.cpp index 9446921..42ecefd 100644 --- a/core/AmSessionEventHandler.cpp +++ b/core/AmSessionEventHandler.cpp @@ -43,7 +43,7 @@ bool AmSessionEventHandler::onSipRequest(const AmSipRequest&) return false; } -bool AmSessionEventHandler::onSipReply(const AmSipReply& reply) +bool AmSessionEventHandler::onSipReply(const AmSipReply& reply, int old_dlg_status) { return false; } diff --git a/core/AmSessionEventHandler.h b/core/AmSessionEventHandler.h index 9f7379c..6acd2c7 100644 --- a/core/AmSessionEventHandler.h +++ b/core/AmSessionEventHandler.h @@ -66,7 +66,7 @@ public: virtual bool process(AmEvent*); virtual bool onSipRequest(const AmSipRequest&); - virtual bool onSipReply(const AmSipReply&); + virtual bool onSipReply(const AmSipReply&, int old_dlg_status); virtual bool onSendRequest(const string& method, const string& content_type, diff --git a/core/AmSipDialog.cpp b/core/AmSipDialog.cpp index c7070ee..5436a15 100644 --- a/core/AmSipDialog.cpp +++ b/core/AmSipDialog.cpp @@ -69,6 +69,13 @@ AmSipDialog::~AmSipDialog() } } +void AmSipDialog::setStatus(int new_status) { + DBG("setting SIP dialog status: %s->%s\n", + status2str[status], status2str[new_status]); + + status = new_status; +} + void AmSipDialog::updateStatus(const AmSipRequest& req) { DBG("AmSipDialog::updateStatus(request)\n"); diff --git a/core/AmSipDialog.h b/core/AmSipDialog.h index f4c2990..6d6c6fc 100644 --- a/core/AmSipDialog.h +++ b/core/AmSipDialog.h @@ -161,6 +161,8 @@ class AmSipDialog bool getUACTransPending() { return !uac_trans.empty(); } int getStatus() { return status; } + void setStatus(int new_status); + string getContactHdr(); /** update Status from locally originated request (e.g. INVITE) */ diff --git a/core/plug-in/session_timer/SessionTimer.cpp b/core/plug-in/session_timer/SessionTimer.cpp index e9f8ef7..9a842e0 100644 --- a/core/plug-in/session_timer/SessionTimer.cpp +++ b/core/plug-in/session_timer/SessionTimer.cpp @@ -77,7 +77,7 @@ bool SessionTimer::onSipRequest(const AmSipRequest& req) return false; } -bool SessionTimer::onSipReply(const AmSipReply& reply) +bool SessionTimer::onSipReply(const AmSipReply& reply, int old_dlg_status) { updateTimer(s,reply); return false; diff --git a/core/plug-in/session_timer/SessionTimer.h b/core/plug-in/session_timer/SessionTimer.h index 456f681..533a7ed 100644 --- a/core/plug-in/session_timer/SessionTimer.h +++ b/core/plug-in/session_timer/SessionTimer.h @@ -139,7 +139,7 @@ class SessionTimer: public AmSessionEventHandler virtual bool process(AmEvent*); virtual bool onSipRequest(const AmSipRequest&); - virtual bool onSipReply(const AmSipReply&); + virtual bool onSipReply(const AmSipReply&, int old_dlg_status); virtual bool onSendRequest(const string& method, const string& content_type, diff --git a/core/plug-in/uac_auth/UACAuth.cpp b/core/plug-in/uac_auth/UACAuth.cpp index e259f83..fbe3416 100644 --- a/core/plug-in/uac_auth/UACAuth.cpp +++ b/core/plug-in/uac_auth/UACAuth.cpp @@ -118,7 +118,7 @@ bool UACAuth::onSipRequest(const AmSipRequest& req) return false; } -bool UACAuth::onSipReply(const AmSipReply& reply) +bool UACAuth::onSipReply(const AmSipReply& reply, int old_dlg_status) { bool processed = false; if (reply.code==407 || reply.code==401) { @@ -167,6 +167,9 @@ bool UACAuth::onSipReply(const AmSipReply& reply) ri->second.body, hdrs) == 0) processed = true; + // undo SIP dialog status change + if (dlg->getStatus() != old_dlg_status) + dlg->setStatus(old_dlg_status); } } } diff --git a/core/plug-in/uac_auth/UACAuth.h b/core/plug-in/uac_auth/UACAuth.h index 9636bd1..01f20d1 100644 --- a/core/plug-in/uac_auth/UACAuth.h +++ b/core/plug-in/uac_auth/UACAuth.h @@ -138,7 +138,7 @@ class UACAuth : public AmSessionEventHandler virtual bool process(AmEvent*); virtual bool onSipEvent(AmSipEvent*); virtual bool onSipRequest(const AmSipRequest&); - virtual bool onSipReply(const AmSipReply&); + virtual bool onSipReply(const AmSipReply&, int old_dlg_status); virtual bool onSendRequest(const string& method, const string& content_type, _______________________________________________ Semsdev mailing list [email protected] http://lists.iptel.org/mailman/listinfo/semsdev
