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.
sayer/1.4-spce2.6
Stefan Sayer 16 years ago
parent e94d828e52
commit 7fbe92bbd7

@ -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");

@ -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);

@ -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",

@ -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;
}

@ -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,

@ -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");

@ -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) */

@ -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;

@ -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,

@ -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);
}
}
}

@ -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,

Loading…
Cancel
Save