Skip to content

Commit

Permalink
uri_db: functions exported to kemi framework
Browse files Browse the repository at this point in the history
(cherry picked from commit 2de6616)
  • Loading branch information
miconda committed Dec 7, 2017
1 parent 7b15819 commit 2c75d27
Show file tree
Hide file tree
Showing 3 changed files with 110 additions and 15 deletions.
77 changes: 62 additions & 15 deletions src/modules/uri_db/checks.c
Original file line number Diff line number Diff line change
Expand Up @@ -153,7 +153,7 @@ static inline int check_username(struct sip_msg* _m, struct sip_uri *_uri,
/*
* Check username part in To header field
*/
int check_to(struct sip_msg* _m, char* _s1, char* _s2)
int ki_check_to(struct sip_msg* _m)
{
if (!_m->to && ((parse_headers(_m, HDR_TO_F, 0) == -1) || (!_m->to))) {
LM_ERR("Error while parsing To header field\n");
Expand All @@ -168,10 +168,18 @@ int check_to(struct sip_msg* _m, char* _s1, char* _s2)
}


/*
* Check username part in To header field
*/
int check_to(struct sip_msg* _m, char* _s1, char* _s2)
{
return ki_check_to(_m);
}

/*
* Check username part in From header field
*/
int check_from(struct sip_msg* _m, char* _s1, char* _s2)
int ki_check_from(struct sip_msg* _m)
{
if (parse_from_header(_m) < 0) {
LM_ERR("Error while parsing From header field\n");
Expand All @@ -186,32 +194,60 @@ int check_from(struct sip_msg* _m, char* _s1, char* _s2)
}


/*
* Check username part in From header field
*/
int check_from(struct sip_msg* _m, char* _s1, char* _s2)
{
return ki_check_from(_m);
}

/*
* Checks username part of the supplied sip URI.
* Optinal with supplied credentials.
*/
int ki_check_uri_realm(struct sip_msg* msg, str *suri, str *susername,
str *srealm)
{
struct sip_uri parsed_uri;

if(suri==NULL || suri->s==NULL || suri->len<=0) {
LM_ERR("invalid uri parameter\n");
return -1;
}

if (parse_uri(suri->s, suri->len, &parsed_uri) != 0)
{
LM_ERR("Error while parsing URI: %.*s\n", suri->len, suri->s);
return -1;
}

if(susername==NULL || susername->len<=0 || srealm==NULL || srealm->len<=0) {
return check_username(msg, &parsed_uri, NULL, NULL);
}

return check_username(msg, &parsed_uri, susername, srealm);
}

int ki_check_uri(struct sip_msg* msg, str *suri)
{
return ki_check_uri_realm(msg, suri, NULL, NULL);
}

int check_uri(struct sip_msg* msg, char* uri, char* username, char* realm)
{
str suri;
str susername;
str srealm;

struct sip_uri parsed_uri;

if (get_str_fparam(&suri, msg, (fparam_t*) uri) != 0)
{
LM_ERR("Error while getting URI value\n");
return -1;
}

if (parse_uri(suri.s, suri.len, &parsed_uri) != 0)
{
LM_ERR("Error while parsing URI\n");
return -1;
}

if (!username || !realm) {
return check_username(msg, &parsed_uri, NULL, NULL);
return ki_check_uri_realm(msg, &suri, NULL, NULL);
}

if (get_str_fparam(&susername, msg, (fparam_t*) username) != 0)
Expand All @@ -225,21 +261,24 @@ int check_uri(struct sip_msg* msg, char* uri, char* username, char* realm)
LM_ERR("Error while getting realm value\n");
return -1;
}

return check_username(msg, &parsed_uri, &susername, &srealm);
return ki_check_uri_realm(msg, &suri, &susername, &srealm);
}


/*
* Check if uri belongs to a local user
*/
int does_uri_exist(struct sip_msg* _msg, char* _s1, char* _s2)
int ki_does_uri_exist(struct sip_msg* _msg)
{
db_key_t keys[2];
db_val_t vals[2];
db_key_t cols[1];
db1_res_t* res = NULL;

if(db_handle==NULL) {
LM_ERR("database connection does not exist\n");
return -1;
}

if (parse_sip_msg_uri(_msg) < 0) {
LM_ERR("Error while parsing URI\n");
return -1;
Expand Down Expand Up @@ -286,6 +325,14 @@ int does_uri_exist(struct sip_msg* _msg, char* _s1, char* _s2)
}


/*
* Check if uri belongs to a local user
*/
int does_uri_exist(struct sip_msg* _msg, char* _s1, char* _s2)
{
return ki_does_uri_exist(_msg);
}


int uridb_db_init(const str* db_url)
{
Expand Down
6 changes: 6 additions & 0 deletions src/modules/uri_db/checks.h
Original file line number Diff line number Diff line change
Expand Up @@ -60,4 +60,10 @@ int uridb_db_bind(const str* db_url);
void uridb_db_close(void);
int uridb_db_ver(const str* db_url, str* name);

int ki_check_to(struct sip_msg* _m);
int ki_check_from(struct sip_msg* _m);
int ki_check_uri(struct sip_msg* msg, str *suri);
int ki_check_uri_realm(struct sip_msg* msg, str *suri, str *susername, str *srelam);
int ki_does_uri_exist(struct sip_msg* _msg);

#endif /* CHECKS_H */
42 changes: 42 additions & 0 deletions src/modules/uri_db/uri_db.c
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@
#include "../../core/error.h"
#include "../../core/mem/mem.h"
#include "../../core/mod_fix.h"
#include "../../core/kemi.h"
#include "uri_db.h"
#include "checks.h"

Expand Down Expand Up @@ -203,3 +204,44 @@ static int w_check_uri1(struct sip_msg* msg, char* uri, char* _s)
{
return check_uri(msg, uri, NULL, NULL);
}

/**
*
*/
/* clang-format off */
static sr_kemi_t sr_kemi_uri_db_exports[] = {
{ str_init("uri_db"), str_init("check_from"),
SR_KEMIP_INT, ki_check_from,
{ SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE,
SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE }
},
{ str_init("uri_db"), str_init("check_to"),
SR_KEMIP_INT, ki_check_to,
{ SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE,
SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE }
},
{ str_init("uri_db"), str_init("does_uri_exist"),
SR_KEMIP_INT, ki_does_uri_exist,
{ SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE,
SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE }
},
{ str_init("uri_db"), str_init("check_uri"),
SR_KEMIP_INT, ki_check_uri,
{ SR_KEMIP_STR, SR_KEMIP_NONE, SR_KEMIP_NONE,
SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE }
},
{ str_init("uri_db"), str_init("check_uri_realm"),
SR_KEMIP_INT, ki_check_uri_realm,
{ 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 } }
};
/* clang-format on */

int mod_register(char *path, int *dlflags, void *p1, void *p2)
{
sr_kemi_modules_add(sr_kemi_uri_db_exports);
return 0;
}

0 comments on commit 2c75d27

Please sign in to comment.