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

Reply via email to