Ver código fonte

uri_db: functions exported to kemi framework

Daniel-Constantin Mierla 7 anos atrás
pai
commit
2de661667c
3 arquivos alterados com 110 adições e 15 exclusões
  1. 62 15
      src/modules/uri_db/checks.c
  2. 6 0
      src/modules/uri_db/checks.h
  3. 42 0
      src/modules/uri_db/uri_db.c

+ 62 - 15
src/modules/uri_db/checks.c

@@ -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");
@@ -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");
@@ -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)
@@ -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;
@@ -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)
 {

+ 6 - 0
src/modules/uri_db/checks.h

@@ -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 - 0
src/modules/uri_db/uri_db.c

@@ -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"
 
@@ -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;
+}