Explorar el Código

userblacklist: exported user check functions to kemi framework

Daniel-Constantin Mierla hace 7 años
padre
commit
50c055a880
Se han modificado 2 ficheros con 243 adiciones y 55 borrados
  1. 119 18
      src/modules/tmrec/tmrec_mod.c
  2. 124 37
      src/modules/userblacklist/userblacklist.c

+ 119 - 18
src/modules/tmrec/tmrec_mod.c

@@ -38,6 +38,7 @@
 #include "../../core/ut.h"
 #include "../../core/ut.h"
 #include "../../core/pvar.h"
 #include "../../core/pvar.h"
 #include "../../core/mod_fix.h"
 #include "../../core/mod_fix.h"
+#include "../../core/kemi.h"
 #include "../../lib/srutils/tmrec.h"
 #include "../../lib/srutils/tmrec.h"
 #include "period.h"
 #include "period.h"
 
 
@@ -153,6 +154,28 @@ static int w_is_leap_year(struct sip_msg* msg, char* t, char* str2)
 	return -1;
 	return -1;
 }
 }
 
 
+static int ki_is_leap_year_now(sip_msg_t* msg)
+{
+	time_t tv;
+	struct tm *tb;
+	int y;
+
+	tv = time(NULL);
+	tb = localtime(&tv);
+	y = 1900 + tb->tm_year;
+
+	if(tr_is_leap_year(y))
+		return 1;
+	return -1;
+}
+
+static int ki_is_leap_year(sip_msg_t* msg, int y)
+{
+	if(tr_is_leap_year(y))
+		return 1;
+	return -1;
+}
+
 static int fixup_is_leap_year(void** param, int param_no)
 static int fixup_is_leap_year(void** param, int param_no)
 {
 {
 	if(param_no==1)
 	if(param_no==1)
@@ -161,40 +184,25 @@ static int fixup_is_leap_year(void** param, int param_no)
 	return 0;
 	return 0;
 }
 }
 
 
-static int w_tmrec_match(struct sip_msg* msg, char* rec, char* t)
+static int ki_tmrec_match_timestamp(sip_msg_t* msg, str *rv, int ti)
 {
 {
-	str rv;
 	time_t tv;
 	time_t tv;
-	int ti;
 	ac_tm_t act;
 	ac_tm_t act;
 	tmrec_t tmr;
 	tmrec_t tmr;
 
 
 	if(msg==NULL)
 	if(msg==NULL)
 		return -1;
 		return -1;
 
 
-	if(fixup_get_svalue(msg, (gparam_t*)rec, &rv)!=0)
-	{
-		LM_ERR("invalid time recurrence parameter value\n");
-		return -1;
-	}
-
-	if(t!=NULL)
-	{
-		if(fixup_get_ivalue(msg, (gparam_t*)t, &ti)!=0)
-		{
-			LM_ERR("invalid time stamp parameter value\n");
-			return -1;
-		}
+	if(ti!=0) {
 		tv = (time_t)ti;
 		tv = (time_t)ti;
 	} else {
 	} else {
 		tv = time(NULL);
 		tv = time(NULL);
 	}
 	}
-
 	memset(&act, 0, sizeof(act));
 	memset(&act, 0, sizeof(act));
 	memset(&tmr, 0, sizeof(tmr));
 	memset(&tmr, 0, sizeof(tmr));
 
 
 	/* parse time recurrence definition */
 	/* parse time recurrence definition */
-	if(tr_parse_recurrence_string(&tmr, rv.s, tmrec_separator)<0)
+	if(tr_parse_recurrence_string(&tmr, rv->s, tmrec_separator)<0)
 		return -1;
 		return -1;
 
 
 	/* if there is no dstart, timerec is valid */
 	/* if there is no dstart, timerec is valid */
@@ -220,6 +228,34 @@ error:
 	return -1;
 	return -1;
 }
 }
 
 
+static int ki_tmrec_match(sip_msg_t* msg, str *rv)
+{
+	return ki_tmrec_match_timestamp(msg, rv, 0);
+}
+
+static int w_tmrec_match(struct sip_msg* msg, char* rec, char* t)
+{
+	str rv;
+	int ti = 0;
+
+	if(fixup_get_svalue(msg, (gparam_t*)rec, &rv)!=0)
+	{
+		LM_ERR("invalid time recurrence parameter value\n");
+		return -1;
+	}
+
+	if(t!=NULL)
+	{
+		if(fixup_get_ivalue(msg, (gparam_t*)t, &ti)!=0)
+		{
+			LM_ERR("invalid time stamp parameter value\n");
+			return -1;
+		}
+	}
+
+	return ki_tmrec_match_timestamp(msg, &rv, ti);
+}
+
 static int fixup_tmrec_match(void** param, int param_no)
 static int fixup_tmrec_match(void** param, int param_no)
 {
 {
 	if(param_no==1)
 	if(param_no==1)
@@ -279,3 +315,68 @@ static int w_time_period_match(struct sip_msg* msg, char* period, char* t)
 		return 1;
 		return 1;
 	return -1;
 	return -1;
 }
 }
+
+static int ki_time_period_match_timestamp(sip_msg_t* msg, str* period, int ti)
+{
+	time_t tv;
+
+	if(ti!=0) {
+		tv = (time_t)ti;
+	} else {
+		tv = time(NULL);
+	}
+	if (in_period(tv, period->s))
+		return 1;
+	return -1;
+}
+
+static int ki_time_period_match(sip_msg_t* msg, str* period)
+{
+	return ki_time_period_match_timestamp(msg, period, 0);
+}
+
+/**
+ *
+ */
+/* clang-format off */
+static sr_kemi_t sr_kemi_tmrec_exports[] = {
+	{ str_init("tmrec"), str_init("is_leap_year_now"),
+		SR_KEMIP_INT, ki_is_leap_year_now,
+		{ SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE,
+			SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE }
+	},
+	{ str_init("tmrec"), str_init("is_leap_year"),
+		SR_KEMIP_INT, ki_is_leap_year,
+		{ SR_KEMIP_INT, SR_KEMIP_NONE, SR_KEMIP_NONE,
+			SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE }
+	},
+	{ str_init("tmrec"), str_init("match"),
+		SR_KEMIP_INT, ki_tmrec_match,
+		{ SR_KEMIP_STR, SR_KEMIP_NONE, SR_KEMIP_NONE,
+			SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE }
+	},
+	{ str_init("tmrec"), str_init("match_timestamp"),
+		SR_KEMIP_INT, ki_tmrec_match_timestamp,
+		{ SR_KEMIP_STR, SR_KEMIP_INT, SR_KEMIP_NONE,
+			SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE }
+	},
+	{ str_init("tmrec"), str_init("time_period_match"),
+		SR_KEMIP_INT, ki_time_period_match,
+		{ SR_KEMIP_STR, SR_KEMIP_NONE, SR_KEMIP_NONE,
+			SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE }
+	},
+	{ str_init("tmrec"), str_init("time_period_match_timestamp"),
+		SR_KEMIP_INT, ki_time_period_match_timestamp,
+		{ SR_KEMIP_STR, SR_KEMIP_INT, 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_tmrec_exports);
+	return 0;
+}

+ 124 - 37
src/modules/userblacklist/userblacklist.c

@@ -48,6 +48,7 @@
 #include "../../core/ut.h"
 #include "../../core/ut.h"
 #include "../../core/mod_fix.h"
 #include "../../core/mod_fix.h"
 #include "../../core/rpc_lookup.h"
 #include "../../core/rpc_lookup.h"
+#include "../../core/kemi.h"
 
 
 #include "../../lib/trie/dtrie.h"
 #include "../../lib/trie/dtrie.h"
 #include "db.h"
 #include "db.h"
@@ -210,47 +211,22 @@ static int check_user_blacklist_fixup(void** param, int param_no)
 }
 }
 
 
 
 
-static int check_user_list(sip_msg_t *msg, char* puser, char* pdomain,
-		char* pnumber, char* ptable, int listtype)
+static int ki_check_user_list(sip_msg_t *msg, str* suser, str* sdomain,
+		str* snumber, str* stable, int listtype)
 {
 {
-	str user = { .len = 0, .s = NULL };
-	str domain = { .len = 0, .s = NULL};
 	str table = { .len = 0, .s = NULL};
 	str table = { .len = 0, .s = NULL};
-	str number = { .len = 0, .s = NULL};
 
 
 	void **nodeflags;
 	void **nodeflags;
 	char *ptr;
 	char *ptr;
 	char req_number[MAXNUMBERLEN+1];
 	char req_number[MAXNUMBERLEN+1];
 
 
-	/* user */
-	if(fixup_get_svalue(msg, (gparam_t*)puser, &user)!=0) {
-		LM_ERR("cannot print user pseudo-variable\n");
-		return -1;
-	}
-	/* domain */
-	if(fixup_get_svalue(msg, (gparam_t*)pdomain, &domain)!=0) {
-		LM_ERR("cannot print domain pseudo-variable\n");
-		return -1;
-	}
-	/* source number */
-	if(pnumber != NULL) {
-		if(fixup_get_svalue(msg, (gparam_t*)pnumber, &number)!=0) {
-			LM_ERR("cannot print number pseudo-variable\n");
-			return -1;
-		}
-	}
-	/* table name */
-	if(ptable != NULL) {
-		if(fixup_get_svalue(msg, (gparam_t*)ptable, &table)!=0) {
-			LM_ERR("cannot print table pseudo-variable\n");
-			return -1;
-		}
-	}
-
-	if(table.len<=0) {
+	if(stable==NULL || stable->len<=0) {
 		/* use default table name */
 		/* use default table name */
 		table.len=userblacklist_table.len;
 		table.len=userblacklist_table.len;
 		table.s=userblacklist_table.s;
 		table.s=userblacklist_table.s;
+	} else {
+		table.len = stable->len;
+		table.s = stable->s;
 	}
 	}
 
 
 	if (msg->first_line.type != SIP_REQUEST) {
 	if (msg->first_line.type != SIP_REQUEST) {
@@ -258,7 +234,7 @@ static int check_user_list(sip_msg_t *msg, char* puser, char* pdomain,
 		return -1;
 		return -1;
 	}
 	}
 
 
-	if(number.s == NULL) {
+	if(snumber==NULL || snumber->s == NULL) {
 		/* use R-URI */
 		/* use R-URI */
 		if ((parse_sip_msg_uri(msg) < 0) || (!msg->parsed_uri.user.s)
 		if ((parse_sip_msg_uri(msg) < 0) || (!msg->parsed_uri.user.s)
 				|| (msg->parsed_uri.user.len > MAXNUMBERLEN)) {
 				|| (msg->parsed_uri.user.len > MAXNUMBERLEN)) {
@@ -268,17 +244,17 @@ static int check_user_list(sip_msg_t *msg, char* puser, char* pdomain,
 		strncpy(req_number, msg->parsed_uri.user.s, msg->parsed_uri.user.len);
 		strncpy(req_number, msg->parsed_uri.user.s, msg->parsed_uri.user.len);
 		req_number[msg->parsed_uri.user.len] = '\0';
 		req_number[msg->parsed_uri.user.len] = '\0';
 	} else {
 	} else {
-		if (number.len > MAXNUMBERLEN) {
+		if (snumber->len > MAXNUMBERLEN) {
 			LM_ERR("number to long\n");
 			LM_ERR("number to long\n");
 			return -1;
 			return -1;
 		}
 		}
-		strncpy(req_number, number.s, number.len);
-		req_number[number.len] = '\0';
+		strncpy(req_number, snumber->s, snumber->len);
+		req_number[snumber->len] = '\0';
 	}
 	}
 
 
 	LM_DBG("check entry %s for user %.*s on domain %.*s in table %.*s\n", req_number,
 	LM_DBG("check entry %s for user %.*s on domain %.*s in table %.*s\n", req_number,
-		user.len, user.s, domain.len, domain.s, table.len, table.s);
-	if (db_build_userbl_tree(&user, &domain, &table, dtrie_root, use_domain) < 0) {
+		suser->len, suser->s, sdomain->len, sdomain->s, table.len, table.s);
+	if (db_build_userbl_tree(suser, sdomain, &table, dtrie_root, use_domain) < 0) {
 		LM_ERR("cannot build d-tree\n");
 		LM_ERR("cannot build d-tree\n");
 		return -1;
 		return -1;
 	}
 	}
@@ -308,6 +284,41 @@ static int check_user_list(sip_msg_t *msg, char* puser, char* pdomain,
 	return -1;
 	return -1;
 }
 }
 
 
+static int check_user_list(sip_msg_t *msg, char* puser, char* pdomain,
+		char* pnumber, char* ptable, int listtype)
+{
+	str user = { .len = 0, .s = NULL };
+	str domain = { .len = 0, .s = NULL};
+	str table = { .len = 0, .s = NULL};
+	str number = { .len = 0, .s = NULL};
+
+	/* user */
+	if(fixup_get_svalue(msg, (gparam_t*)puser, &user)!=0) {
+		LM_ERR("cannot print user pseudo-variable\n");
+		return -1;
+	}
+	/* domain */
+	if(fixup_get_svalue(msg, (gparam_t*)pdomain, &domain)!=0) {
+		LM_ERR("cannot print domain pseudo-variable\n");
+		return -1;
+	}
+	/* source number */
+	if(pnumber != NULL) {
+		if(fixup_get_svalue(msg, (gparam_t*)pnumber, &number)!=0) {
+			LM_ERR("cannot print number pseudo-variable\n");
+			return -1;
+		}
+	}
+	/* table name */
+	if(ptable != NULL) {
+		if(fixup_get_svalue(msg, (gparam_t*)ptable, &table)!=0) {
+			LM_ERR("cannot print table pseudo-variable\n");
+			return -1;
+		}
+	}
+
+	return ki_check_user_list(msg, &user, &domain, &number, &table, listtype);
+}
 
 
 static int check_user_whitelist(sip_msg_t *msg, char* puser,
 static int check_user_whitelist(sip_msg_t *msg, char* puser,
 		char* pdomain, char* pnumber, char* ptable)
 		char* pdomain, char* pnumber, char* ptable)
@@ -315,6 +326,11 @@ static int check_user_whitelist(sip_msg_t *msg, char* puser,
 	return check_user_list(msg, puser, pdomain, pnumber, ptable, 1);
 	return check_user_list(msg, puser, pdomain, pnumber, ptable, 1);
 }
 }
 
 
+static int ki_check_user_whitelist_table(sip_msg_t *msg, str* suser,
+		str* sdomain, str* snumber, str* stable)
+{
+	return ki_check_user_list(msg, suser, sdomain, snumber, stable, 1);
+}
 
 
 static int check_user_blacklist(sip_msg_t *msg, char* puser,
 static int check_user_blacklist(sip_msg_t *msg, char* puser,
 		char* pdomain, char* pnumber, char* ptable)
 		char* pdomain, char* pnumber, char* ptable)
@@ -322,23 +338,43 @@ static int check_user_blacklist(sip_msg_t *msg, char* puser,
 	return check_user_list(msg, puser, pdomain, pnumber, ptable, 0);
 	return check_user_list(msg, puser, pdomain, pnumber, ptable, 0);
 }
 }
 
 
+static int ki_check_user_blacklist_table(sip_msg_t *msg, str* suser,
+		str* sdomain, str* snumber, str* stable)
+{
+	return ki_check_user_list(msg, suser, sdomain, snumber, stable, 0);
+}
+
 static int check_user_whitelist2(sip_msg_t *msg, char* puser, char* pdomain)
 static int check_user_whitelist2(sip_msg_t *msg, char* puser, char* pdomain)
 {
 {
 	return check_user_list(msg, puser, pdomain, NULL, NULL, 1);
 	return check_user_list(msg, puser, pdomain, NULL, NULL, 1);
 }
 }
 
 
+static int ki_check_user_whitelist(sip_msg_t *msg, str* suser, str* sdomain)
+{
+	return ki_check_user_list(msg, suser, sdomain, NULL, NULL, 1);
+}
 
 
 static int check_user_blacklist2(sip_msg_t *msg, char* puser, char* pdomain)
 static int check_user_blacklist2(sip_msg_t *msg, char* puser, char* pdomain)
 {
 {
 	return check_user_list(msg, puser, pdomain, NULL, NULL, 0);
 	return check_user_list(msg, puser, pdomain, NULL, NULL, 0);
 }
 }
 
 
+static int ki_check_user_blacklist(sip_msg_t *msg, str* suser, str* sdomain)
+{
+	return ki_check_user_list(msg, suser, sdomain, NULL, NULL, 0);
+}
+
 static int check_user_whitelist3(sip_msg_t *msg, char* puser, char* pdomain,
 static int check_user_whitelist3(sip_msg_t *msg, char* puser, char* pdomain,
 		char* pnumber)
 		char* pnumber)
 {
 {
 	return check_user_list(msg, puser, pdomain, pnumber, NULL, 1);
 	return check_user_list(msg, puser, pdomain, pnumber, NULL, 1);
 }
 }
 
 
+static int ki_check_user_whitelist_number(sip_msg_t *msg, str* suser,
+		str* sdomain, str* snumber)
+{
+	return ki_check_user_list(msg, suser, sdomain, snumber, NULL, 1);
+}
 
 
 static int check_user_blacklist3(sip_msg_t *msg, char* puser, char* pdomain,
 static int check_user_blacklist3(sip_msg_t *msg, char* puser, char* pdomain,
 		char* pnumber)
 		char* pnumber)
@@ -346,6 +382,11 @@ static int check_user_blacklist3(sip_msg_t *msg, char* puser, char* pdomain,
 	return check_user_list(msg, puser, pdomain, pnumber, NULL, 0);
 	return check_user_list(msg, puser, pdomain, pnumber, NULL, 0);
 }
 }
 
 
+static int ki_check_user_blacklist_number(sip_msg_t *msg, str* suser,
+		str* sdomain, str* snumber)
+{
+	return ki_check_user_list(msg, suser, sdomain, snumber, NULL, 0);
+}
 
 
 /**
 /**
  * Finds d-tree root for given table.
  * Finds d-tree root for given table.
@@ -1150,3 +1191,49 @@ static void mod_destroy(void)
 	userblacklist_db_close();
 	userblacklist_db_close();
 	dtrie_destroy(&dtrie_root, NULL, match_mode);
 	dtrie_destroy(&dtrie_root, NULL, match_mode);
 }
 }
+
+/**
+ *
+ */
+/* clang-format off */
+static sr_kemi_t sr_kemi_userblacklist_exports[] = {
+	{ str_init("userblacklist"), str_init("check_user_blacklist"),
+		SR_KEMIP_INT, ki_check_user_blacklist,
+		{ SR_KEMIP_STR, SR_KEMIP_STR, SR_KEMIP_NONE,
+			SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE }
+	},
+	{ str_init("userblacklist"), str_init("check_user_whitelist"),
+		SR_KEMIP_INT, ki_check_user_whitelist,
+		{ SR_KEMIP_STR, SR_KEMIP_STR, SR_KEMIP_NONE,
+			SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE }
+	},
+	{ str_init("userblacklist"), str_init("check_user_blacklist_number"),
+		SR_KEMIP_INT, ki_check_user_blacklist_number,
+		{ SR_KEMIP_STR, SR_KEMIP_STR, SR_KEMIP_STR,
+			SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE }
+	},
+	{ str_init("userblacklist"), str_init("check_user_whitelist_number"),
+		SR_KEMIP_INT, ki_check_user_whitelist_number,
+		{ SR_KEMIP_STR, SR_KEMIP_STR, SR_KEMIP_STR,
+			SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE }
+	},
+	{ str_init("userblacklist"), str_init("check_user_blacklist_table"),
+		SR_KEMIP_INT, ki_check_user_blacklist_table,
+		{ SR_KEMIP_STR, SR_KEMIP_STR, SR_KEMIP_STR,
+			SR_KEMIP_STR, SR_KEMIP_NONE, SR_KEMIP_NONE }
+	},
+	{ str_init("userblacklist"), str_init("check_user_whitelist_table"),
+		SR_KEMIP_INT, ki_check_user_whitelist_table,
+		{ SR_KEMIP_STR, SR_KEMIP_STR, SR_KEMIP_STR,
+			SR_KEMIP_STR, 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_userblacklist_exports);
+	return 0;
+}