Forráskód Böngészése

group: is_user_in() exported to kemi framework

Daniel-Constantin Mierla 7 éve
szülő
commit
9139bd2991
3 módosított fájl, 81 hozzáadás és 14 törlés
  1. 57 14
      src/modules/group/group.c
  2. 2 0
      src/modules/group/group.h
  3. 22 0
      src/modules/group/group_mod.c

+ 57 - 14
src/modules/group/group.c

@@ -134,33 +134,38 @@ int get_username_domain(struct sip_msg *msg, group_check_p gcp,
  * \param _grp checked table
  * \return 1 on success, negative on failure 
  */
-int is_user_in(struct sip_msg* _msg, char* _hf, char* _grp)
+int is_user_in_helper(sip_msg_t* _msg, str *user, str *domain, str *grp)
 {
 	db_key_t keys[3];
 	db_val_t vals[3];
 	db_key_t col[1];
 	db1_res_t* res = NULL;
 
+	if (user==NULL || user->s==NULL || user->len==0 ) {
+		LM_DBG("no username part\n");
+		return -1;
+	}
+
+	if (grp==NULL || grp->s==NULL || grp->len==0 ) {
+		LM_DBG("no group\n");
+		return -1;
+	}
+
 	keys[0] = &user_column;
 	keys[1] = &group_column;
 	keys[2] = &domain_column;
 	col[0]  = &group_column;
 
-	if ( get_username_domain( _msg, (group_check_p)_hf, &(VAL_STR(vals)),
-	&(VAL_STR(vals+2)))!=0) {
-		LM_ERR("failed to get username@domain\n");
-		return -1;
-	}
+	VAL_STR(vals) = *user;
 
-	if (VAL_STR(vals).s==NULL || VAL_STR(vals).len==0 ) {
-		LM_DBG("no username part\n");
-		return -1;
+	if(domain) {
+		VAL_STR(vals + 2) = *domain;
 	}
 
 	VAL_TYPE(vals) = VAL_TYPE(vals + 1) = VAL_TYPE(vals + 2) = DB1_STR;
 	VAL_NULL(vals) = VAL_NULL(vals + 1) = VAL_NULL(vals + 2) = 0;
 
-	VAL_STR(vals + 1) = *((str*)_grp);
+	VAL_STR(vals + 1) = *grp;
 
 	if (group_dbf.use_table(group_dbh, &table) < 0) {
 		LM_ERR("failed to use_table\n");
@@ -174,18 +179,56 @@ int is_user_in(struct sip_msg* _msg, char* _hf, char* _grp)
 	}
 
 	if (RES_ROW_N(res) == 0) {
-		LM_DBG("user is not in group '%.*s'\n", 
-		    ((str*)_grp)->len, ZSW(((str*)_grp)->s));
+		LM_DBG("user is not in group '%.*s'\n", grp->len, grp->s);
 		group_dbf.free_result(group_dbh, res);
 		return -6;
 	} else {
-		LM_DBG("user is in group '%.*s'\n", 
-			((str*)_grp)->len, ZSW(((str*)_grp)->s));
+		LM_DBG("user is in group '%.*s'\n", grp->len, grp->s);
 		group_dbf.free_result(group_dbh, res);
 		return 1;
 	}
 }
 
+/*!
+ * \brief Check if username in specified header field is in a table
+ * \param _msg SIP message
+ * \param _hf Header field
+ * \param _grp checked table
+ * \return 1 on success, negative on failure 
+ */
+int is_user_in(sip_msg_t* _msg, char* _hf, char* _grp)
+{
+	str user = STR_NULL;
+	str domain = STR_NULL;
+	str group = STR_NULL;
+
+	if ( get_username_domain( _msg, (group_check_p)_hf, &user,  &group)!=0) {
+		LM_ERR("failed to get username@domain\n");
+		return -1;
+	}
+
+	return is_user_in_helper(_msg, &user, &domain, (str*)_grp);
+}
+
+/**
+ * 
+ */
+int ki_is_user_in(sip_msg_t *msg, str *uri, str *grp)
+{
+	sip_uri_t puri;
+
+	if (uri==NULL || uri->s==NULL || uri->len==0 ) {
+		LM_DBG("no uri parameter\n");
+		return -1;
+	}
+
+	if(parse_uri(uri->s, uri->len, &puri) < 0) {
+		LM_ERR("failed to parse SIP URI <%.*s>\n", uri->len, uri->s);
+		return -1;
+	}
+
+	return is_user_in_helper(msg, &puri.user, &puri.host, grp);
+}
 
 /*!
  * \brief Initialize the DB connection

+ 2 - 0
src/modules/group/group.h

@@ -87,4 +87,6 @@ int group_db_bind(const str* db_url);
  */
 void group_db_close(void);
 
+int ki_is_user_in(sip_msg_t *msg, str *uri, str *grp);
+
 #endif

+ 22 - 0
src/modules/group/group_mod.c

@@ -42,6 +42,7 @@
 #include "../../core/error.h"
 #include "../../core/mem/mem.h"
 #include "../../core/usr_avp.h"
+#include "../../core/kemi.h"
 #include "group_mod.h"
 #include "group.h"
 #include "re_group.h"
@@ -318,3 +319,24 @@ static int get_gid_fixup(void** param, int param_no)
 
 	return 0;
 }
+
+/**
+ *
+ */
+/* clang-format off */
+static sr_kemi_t sr_kemi_group_exports[] = {
+	{ str_init("group"), str_init("is_user_in"),
+		SR_KEMIP_INT, ki_is_user_in,
+		{ SR_KEMIP_STR, SR_KEMIP_STR, 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_group_exports);
+	return 0;
+}