[sr-dev] git:master: uac(k): stop trying to re-auth if first attempt fails

Daniel-Constantin Mierla miconda at gmail.com
Wed Dec 8 00:27:03 CET 2010


Module: sip-router
Branch: master
Commit: 9ebbbf3f53d88729add23980695ff84dace90342
URL:    http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=9ebbbf3f53d88729add23980695ff84dace90342

Author: Daniel-Constantin Mierla <miconda at gmail.com>
Committer: Daniel-Constantin Mierla <miconda at gmail.com>
Date:   Wed Dec  8 00:20:44 2010 +0100

uac(k): stop trying to re-auth if first attempt fails

- don't do cascade authentication if server keeps sending 401 for new
  attepts
- reported by Bernhard Suttner, part of FS#108

---

 modules_k/uac/uac_reg.c |   14 +++++++++++++-
 1 files changed, 13 insertions(+), 1 deletions(-)

diff --git a/modules_k/uac/uac_reg.c b/modules_k/uac/uac_reg.c
index 8fb4e78..e8827a0 100644
--- a/modules_k/uac/uac_reg.c
+++ b/modules_k/uac/uac_reg.c
@@ -43,6 +43,7 @@
 #define UAC_REG_DISABLED	(1<<0)
 #define UAC_REG_ONGOING		(1<<1)
 #define UAC_REG_ONLINE		(1<<2)
+#define UAC_REG_AUTHSENT	(1<<3)
 
 #define MAX_UACH_SIZE 2048
 
@@ -470,7 +471,7 @@ void uac_reg_tm_callback( struct cell *t, int type, struct tmcb_params *ps)
 					str2int(&c->expires->body, (unsigned int*)(&expires));
 				}
 				ri->timer_expires = ri->timer_expires + expires;
-				ri->flags &= ~UAC_REG_ONGOING;
+				ri->flags &= ~(UAC_REG_ONGOING|UAC_REG_AUTHSENT);
 				ri->flags |= UAC_REG_ONLINE;
 				goto done;
 			}
@@ -484,6 +485,14 @@ void uac_reg_tm_callback( struct cell *t, int type, struct tmcb_params *ps)
 
 	if(ps->code == 401)
 	{
+		if(ri->flags & UAC_REG_AUTHSENT)
+		{
+			LM_ERR("authentication failed for <%.*s>\n",
+					ri->l_uuid.len, ri->l_uuid.s);
+			ri->flags &= ~UAC_REG_ONGOING;
+			ri->flags |= UAC_REG_DISABLED;
+			goto done;
+		}
 		hdr = get_autenticate_hdr(ps->rpl, 401);
 		if (hdr==0)
 		{
@@ -552,6 +561,7 @@ void uac_reg_tm_callback( struct cell *t, int type, struct tmcb_params *ps)
 				&s_turi, /* From */
 				(ri->auth_proxy.len)?&ri->auth_proxy:NULL /* outbound uri */
 			);
+		ri->flags |= UAC_REG_AUTHSENT;
 
 		if(ret<0)
 			goto done;
@@ -584,6 +594,8 @@ int uac_reg_update(reg_uac_t *reg, time_t tn)
 		return 2;
 	if(reg->timer_expires > tn + reg_timer_interval + 3)
 		return 3;
+	if(reg->flags&UAC_REG_DISABLED)
+		return 4;
 	reg->timer_expires = tn;
 	reg->flags |= UAC_REG_ONGOING;
 	reg->flags &= ~UAC_REG_ONLINE;




More information about the sr-dev mailing list