diff --git a/src/modules/tls/tls_mod.c b/src/modules/tls/tls_mod.c index fed9749624c..4c2a7436829 100644 --- a/src/modules/tls/tls_mod.c +++ b/src/modules/tls/tls_mod.c @@ -546,6 +546,14 @@ static int w_is_peer_verified(struct sip_msg* msg, char* foo, char* foo2) return ki_is_peer_verified(msg); } +/** + * + */ +static sr_kemi_xval_t* ki_tls_cget(sip_msg_t *msg, str *aname) +{ + return ki_tls_cget_attr(msg, aname); +} + /** * */ @@ -556,6 +564,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("cget"), + SR_KEMIP_XVAL, ki_tls_cget, + { SR_KEMIP_STR, SR_KEMIP_NONE, SR_KEMIP_NONE, + SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE } + }, { {0, 0}, {0, 0}, 0, NULL, { 0, 0, 0, 0, 0, 0 } } }; diff --git a/src/modules/tls/tls_select.c b/src/modules/tls/tls_select.c index fffcddbd159..89b6a44b670 100644 --- a/src/modules/tls/tls_select.c +++ b/src/modules/tls/tls_select.c @@ -1404,7 +1404,7 @@ pv_export_t tls_pv[] = { {{"tls_my_serial", sizeof("tls_my_serial")-1}, PVT_OTHER, pv_sn,0, 0, 0, pv_init_iname, PV_CERT_LOCAL }, - /* certificate parameters for peer and local, for subject and issuer*/ + /* certificate parameters for peer and local, for subject and issuer*/ {{"tls_peer_subject", sizeof("tls_peer_subject")-1}, PVT_OTHER, pv_comp, 0, 0, 0, pv_init_iname, PV_CERT_PEER | PV_CERT_SUBJECT }, @@ -1496,7 +1496,7 @@ pv_export_t tls_pv[] = { {{"tls_my_subject_uid", sizeof("tls_my_subject_uid")-1}, PVT_OTHER, pv_comp, 0, 0, 0, pv_init_iname, PV_CERT_LOCAL | PV_CERT_SUBJECT | PV_COMP_UID }, - /* subject alternative name parameters for peer and local */ + /* subject alternative name parameters for peer and local */ {{"tls_peer_san_email", sizeof("tls_peer_san_email")-1}, PVT_OTHER, pv_alt, 0, 0, 0, pv_init_iname, PV_CERT_PEER | PV_COMP_E }, @@ -1521,7 +1521,7 @@ pv_export_t tls_pv[] = { {{"tls_my_san_ip", sizeof("tls_my_san_ip")-1}, PVT_OTHER, pv_alt, 0, 0, 0, pv_init_iname, PV_CERT_LOCAL | PV_COMP_IP }, - /* peer certificate validation parameters */ + /* peer certificate validation parameters */ {{"tls_peer_verified", sizeof("tls_peer_verified")-1}, PVT_OTHER, pv_check_cert, 0, 0, 0, pv_init_iname, PV_CERT_VERIFIED }, @@ -1540,11 +1540,71 @@ pv_export_t tls_pv[] = { {{"tls_peer_notAfter", sizeof("tls_peer_notAfter")-1}, PVT_OTHER, pv_validity, 0, 0, 0, pv_init_iname, PV_CERT_NOTAFTER }, - /* peer certificate validation parameters */ + /* peer certificate validation parameters */ {{"tls_peer_server_name", sizeof("tls_peer_server_name")-1}, PVT_OTHER, pv_tlsext_sn, 0, 0, 0, pv_init_iname, PV_TLSEXT_SNI }, { {0, 0}, 0, 0, 0, 0, 0, 0, 0 } -}; +}; + + +/** + * + */ +static sr_kemi_xval_t _ksr_kemi_tls_xval = {0}; + + +/** + * + */ +sr_kemi_xval_t* ki_tls_cget_attr(sip_msg_t* msg, str *aname) +{ + pv_param_t param; + pv_value_t value; + int i; + + memset(&_ksr_kemi_tls_xval, 0, sizeof(sr_kemi_xval_t)); + for(i=0; tls_pv[i].name.s != NULL; i++) { + if((tls_pv[i].name.len == aname->len) + && strncmp(tls_pv[i].name.s, aname->s, aname->len) == 0) { + break; + } + } + if(tls_pv[i].name.s==NULL) { + LM_WARN("unknown attribute: %.*s\n", aname->len, aname->s); + sr_kemi_xval_null(&_ksr_kemi_tls_xval, SR_KEMI_XVAL_NULL_EMPTY); + return &_ksr_kemi_tls_xval; + } + if(tls_pv[i].parse_name!=NULL || tls_pv[i].parse_index!=NULL) { + LM_WARN("unsupported attribute: %.*s\n", aname->len, aname->s); + sr_kemi_xval_null(&_ksr_kemi_tls_xval, SR_KEMI_XVAL_NULL_EMPTY); + return &_ksr_kemi_tls_xval; + } + memset(¶m, 0, sizeof(pv_param_t)); + memset(&value, 0, sizeof(pv_value_t)); + + if(tls_pv[i].getf(msg, ¶m, &value) != 0) { + sr_kemi_xval_null(&_ksr_kemi_tls_xval, SR_KEMI_XVAL_NULL_EMPTY); + return &_ksr_kemi_tls_xval; + } + if(value.flags & PV_VAL_NULL) { + sr_kemi_xval_null(&_ksr_kemi_tls_xval, SR_KEMI_XVAL_NULL_EMPTY); + return &_ksr_kemi_tls_xval; + } + if(value.flags & PV_TYPE_INT) { + _ksr_kemi_tls_xval.vtype = SR_KEMIP_INT; + _ksr_kemi_tls_xval.v.n = value.ri; + return &_ksr_kemi_tls_xval; + } + if(value.flags & PV_VAL_STR) { + _ksr_kemi_tls_xval.vtype = SR_KEMIP_STR; + _ksr_kemi_tls_xval.v.s = value.rs; + return &_ksr_kemi_tls_xval; + } + + LM_WARN("unsupported value for attribute: %.*s\n", aname->len, aname->s); + sr_kemi_xval_null(&_ksr_kemi_tls_xval, SR_KEMI_XVAL_NULL_EMPTY); + return &_ksr_kemi_tls_xval; +} diff --git a/src/modules/tls/tls_select.h b/src/modules/tls/tls_select.h index 53ee77e7a05..b30e445806d 100644 --- a/src/modules/tls/tls_select.h +++ b/src/modules/tls/tls_select.h @@ -38,6 +38,7 @@ #include "../../core/select.h" #include "../../core/pvar.h" +#include "../../core/kemi.h" #include "../../core/tcp_conn.h" extern select_row_t tls_sel[]; @@ -46,4 +47,6 @@ extern pv_export_t tls_pv[]; void tls_set_pv_con(struct tcp_connection *c); +sr_kemi_xval_t* ki_tls_cget_attr(sip_msg_t* msg, str *aname); + #endif /* _TLS_SELECT_H */