Skip to content

Commit

Permalink
tls: added tls_set_connect_server_id(srvid) function
Browse files Browse the repository at this point in the history
- 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])
  • Loading branch information
miconda committed Mar 31, 2021
1 parent 30cb2e4 commit e979a34
Show file tree
Hide file tree
Showing 3 changed files with 79 additions and 1 deletion.
30 changes: 30 additions & 0 deletions src/modules/tls/tls_mod.c
Expand Up @@ -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"
Expand Down Expand Up @@ -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);

Expand Down Expand Up @@ -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}
};

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

/**
*
*/
Expand All @@ -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,
Expand Down
48 changes: 47 additions & 1 deletion src/modules/tls/tls_server.c
Expand Up @@ -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);
Expand Down Expand Up @@ -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);
Expand Down
2 changes: 2 additions & 0 deletions src/modules/tls/tls_server.h
Expand Up @@ -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 */

0 comments on commit e979a34

Please sign in to comment.