Sfoglia il codice sorgente

tls: added tls_set_connect_server_id(srvid) function

- set the server id of the tls profile to be used by next client
connect, being reset after use
- alternative to use of xavp to specify server id for client profile for
the cases when xavps are no longer available (e.g., after
event_route[tm:local-request])
Daniel-Constantin Mierla 4 anni fa
parent
commit
e979a341c1
3 ha cambiato i file con 79 aggiunte e 1 eliminazioni
  1. 30 0
      src/modules/tls/tls_mod.c
  2. 47 1
      src/modules/tls/tls_server.c
  3. 2 0
      src/modules/tls/tls_server.h

+ 30 - 0
src/modules/tls/tls_mod.c

@@ -40,6 +40,7 @@
 #include "../../core/rpc_lookup.h"
 #include "../../core/cfg/cfg.h"
 #include "../../core/dprint.h"
+#include "../../core/mod_fix.h"
 #include "../../core/kemi.h"
 #include "tls_init.h"
 #include "tls_server.h"
@@ -80,6 +81,7 @@ static int mod_child(int rank);
 static void destroy(void);
 
 static int w_is_peer_verified(struct sip_msg* msg, char* p1, char* p2);
+static int w_tls_set_connect_server_id(sip_msg_t* msg, char* psrvid, char* p2);
 
 int ksr_rand_engine_param(modparam_t type, void* val);
 
@@ -199,6 +201,8 @@ int sr_tls_renegotiation = 0;
 static cmd_export_t cmds[] = {
 	{"is_peer_verified", (cmd_function)w_is_peer_verified,   0, 0, 0,
 			REQUEST_ROUTE},
+	{"tls_set_connect_server_id", (cmd_function)w_tls_set_connect_server_id,
+		1, fixup_spve_null, fixup_free_spve_null, ANY_ROUTE},
 	{0,0,0,0,0,0}
 };
 
@@ -550,6 +554,27 @@ static int w_is_peer_verified(struct sip_msg* msg, char* foo, char* foo2)
 	return ki_is_peer_verified(msg);
 }
 
+static int ki_tls_set_connect_server_id(sip_msg_t* msg, str* srvid)
+{
+	if(ksr_tls_set_connect_server_id(srvid)<0) {
+		return -1;
+	}
+
+	return 1;
+}
+
+static int w_tls_set_connect_server_id(sip_msg_t* msg, char* psrvid, char* p2)
+{
+	str ssrvid = STR_NULL;
+
+	if(fixup_get_svalue(msg, (gparam_t*)psrvid, &ssrvid)<0) {
+		LM_ERR("failed to get server id parameter\n");
+		return -1;
+	}
+
+	return ki_tls_set_connect_server_id(msg, &ssrvid);
+}
+
 /**
  *
  */
@@ -568,6 +593,11 @@ static sr_kemi_t sr_kemi_tls_exports[] = {
 		{ SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE,
 			SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE }
 	},
+	{ str_init("tls"), str_init("set_connect_server_id"),
+		SR_KEMIP_INT, ki_tls_set_connect_server_id,
+		{ SR_KEMIP_STR, SR_KEMIP_NONE, SR_KEMIP_NONE,
+			SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE }
+	},
 	{ str_init("tls"), str_init("cget"),
 		SR_KEMIP_XVAL, ki_tls_cget,
 		{ SR_KEMIP_STR, SR_KEMIP_NONE, SR_KEMIP_NONE,

+ 47 - 1
src/modules/tls/tls_server.c

@@ -132,14 +132,59 @@ int tls_run_event_routes(struct tcp_connection *c);
 
 extern str sr_tls_xavp_cfg;
 
+static str _ksr_tls_connect_server_id = STR_NULL;
+
+int ksr_tls_set_connect_server_id(str *srvid)
+{
+	if(srvid==NULL || srvid->len<=0) {
+		if(_ksr_tls_connect_server_id.s) {
+			pkg_free(_ksr_tls_connect_server_id.s);
+		}
+		_ksr_tls_connect_server_id.s = NULL;
+		_ksr_tls_connect_server_id.len = 0;
+		return 0;
+	}
+
+	if(_ksr_tls_connect_server_id.len>=srvid->len) {
+		memcpy(_ksr_tls_connect_server_id.s, srvid->s, srvid->len);
+		_ksr_tls_connect_server_id.len = srvid->len;
+		return 0;
+	}
+
+	if(_ksr_tls_connect_server_id.s) {
+		pkg_free(_ksr_tls_connect_server_id.s);
+	}
+	_ksr_tls_connect_server_id.len = 0;
+
+	_ksr_tls_connect_server_id.s = (char*)pkg_mallocxz(srvid->len + 1);
+	if(_ksr_tls_connect_server_id.s==NULL) {
+		PKG_MEM_ERROR;
+		return -1;
+	}
+
+	memcpy(_ksr_tls_connect_server_id.s, srvid->s, srvid->len);
+	_ksr_tls_connect_server_id.len = srvid->len;
+
+	return 0;
+}
+
 static str *tls_get_connect_server_id(void)
 {
 	sr_xavp_t *vavp = NULL;
 	str sid = {"server_id", 9};
-	if(sr_tls_xavp_cfg.s!=NULL)
+
+	if(sr_tls_xavp_cfg.s!=NULL) {
 		vavp = xavp_get_child_with_sval(&sr_tls_xavp_cfg, &sid);
+	}
 	if(vavp==NULL || vavp->val.v.s.len<=0) {
 		LM_DBG("xavp with outbound server id not found\n");
+		if(_ksr_tls_connect_server_id.len>0) {
+			LM_DBG("found global outbound server id: %.*s\n",
+					_ksr_tls_connect_server_id.len,
+					_ksr_tls_connect_server_id.s);
+			return &_ksr_tls_connect_server_id;
+		}
+		LM_DBG("outbound server id not set\n");
 		return NULL;
 	}
 	LM_DBG("found xavp with outbound server id: %s\n", vavp->val.v.s.s);
@@ -218,6 +263,7 @@ static int tls_complete_init(struct tcp_connection* c)
 		srvid = tls_get_connect_server_id();
 		dom = tls_lookup_cfg(cfg, TLS_DOMAIN_CLI,
 						&c->rcv.dst_ip, c->rcv.dst_port, sname, srvid);
+		ksr_tls_set_connect_server_id(NULL);
 	}
 	if (unlikely(c->state<0)) {
 		BUG("Invalid connection (state %d)\n", c->state);

+ 2 - 0
src/modules/tls/tls_server.h

@@ -96,4 +96,6 @@ int tls_connect(struct tcp_connection *c, int* error);
 int tls_accept(struct tcp_connection *c, int* error);
 
 void tls_lookup_event_routes(void);
+int ksr_tls_set_connect_server_id(str *srvid);
+
 #endif /* _TLS_SERVER_H */