diff --git a/src/downstream.c b/src/downstream.c index 7c7e982..54c9cb3 100644 --- a/src/downstream.c +++ b/src/downstream.c @@ -90,7 +90,7 @@ void listenerOnMessage(void * msg, size_t msgSize) if(ret < 0) { response = cJSON_CreateObject(); - cJSON_AddNumberToObject(response, "statusCode", 430); + cJSON_AddNumberToObject(response, "statusCode", 403); cJSON_AddStringToObject(response, "message", "Invalid partner_id"); } diff --git a/src/partners_check.c b/src/partners_check.c index 9df498d..ae3e80e 100644 --- a/src/partners_check.c +++ b/src/partners_check.c @@ -39,85 +39,172 @@ /*----------------------------------------------------------------------------*/ /* External functions */ /*----------------------------------------------------------------------------*/ +static void parse_partner_id(char *partnerId, partners_t **partnersList) +{ + char *token; + int i = 0, j = 0, count = 0; + ParodusPrint("********* %s ********\n",__FUNCTION__); + while(partnerId[i] != '\0') + { + if(partnerId[i] == ',') + { + count++; + } + i++; + } + ParodusPrint("count = %d\n", count+1); + *partnersList = (partners_t *)malloc(sizeof(partners_t)+ sizeof( char * ) * (count+1)); + memset(*partnersList, 0, sizeof(partners_t)); + (*partnersList)->count = count+1; + while ((token = strsep(&partnerId, ",")) != NULL) + { + ParodusPrint("token=%s\n", token); + (*partnersList)->partner_ids[j] = strdup(token); + ParodusPrint("(*partnersList)->partner_ids[%d] = %s\n",j,(*partnersList)->partner_ids[j]); + j++; + } +} + int validate_partner_id(wrp_msg_t *msg, partners_t **partnerIds) { int matchFlag = 0, i = 0, count = 0; + size_t j = 0; + partners_t *partnersList = NULL; + char *partnerId = NULL; ParodusPrint("********* %s ********\n",__FUNCTION__); - char *partnerId = get_parodus_cfg()->partner_id; - if(strlen(partnerId) <= 0) + char *temp = get_parodus_cfg()->partner_id; + ParodusPrint("temp = %s\n",temp); + if(temp[0] != '\0' && strlen(temp) > 0) + { + partnerId = strdup(temp); + } + ParodusPrint("partnerId = %s\n",partnerId); + if(partnerId != NULL) + { + parse_partner_id(partnerId, &partnersList); + ParodusPrint("partnersList->count = %lu\n", partnersList->count); + if(msg->msg_type == WRP_MSG_TYPE__EVENT) + { + if(msg->u.event.partner_ids != NULL) + { + count = (int) msg->u.event.partner_ids->count; + ParodusPrint("partner_ids count is %d\n",count); + for(i = 0; i < count; i++) + { + for(j = 0; jcount; j++) + { + ParodusPrint("partnersList->partner_ids[%lu] = %s\n",j, partnersList->partner_ids[j]); + if(strcmp(partnersList->partner_ids[j], msg->u.event.partner_ids->partner_ids[i]) == 0) + { + ParodusInfo("partner_id match found\n"); + matchFlag = 1; + break; + } + } + /* Commandline input partner_ids matched with partner_ids from request */ + if(matchFlag == 1) + { + break; + } + } + + /* Commandline input partner_ids not matching with partner_ids from request, appending to request partner_ids*/ + if(matchFlag != 1) + { + (*partnerIds) = (partners_t *) malloc(sizeof(partners_t) + (sizeof(char *) * (count+partnersList->count))); + (*partnerIds)->count = count+partnersList->count; + for(i = 0; i < count; i++) + { + (*partnerIds)->partner_ids[i] = msg->u.event.partner_ids->partner_ids[i]; + ParodusPrint("(*partnerIds)->partner_ids[%d] : %s\n",i,(*partnerIds)->partner_ids[i]); + } + i = 0; + for(j = count; j<(count+partnersList->count); j++) + { + (*partnerIds)->partner_ids[j] = (char *) malloc(sizeof(char) * 64); + parStrncpy((*partnerIds)->partner_ids[j], partnersList->partner_ids[i], 64); + ParodusPrint("(*partnerIds)->partner_ids[%lu] : %s\n",j,(*partnerIds)->partner_ids[j]); + i++; + } + } + } + else + { + ParodusPrint("partner_ids list is NULL\n"); + (*partnerIds) = (partners_t *) malloc(sizeof(partners_t) + (sizeof(char *) * partnersList->count)); + (*partnerIds)->count = partnersList->count; + i=0; + for(j = 0; jcount; j++) + { + (*partnerIds)->partner_ids[j] = (char *) malloc(sizeof(char) * 64); + parStrncpy((*partnerIds)->partner_ids[j], partnersList->partner_ids[i], 64); + ParodusPrint("(*partnerIds)->partner_ids[%lu] : %s\n",j,(*partnerIds)->partner_ids[j]); + i++; + } + } + } + else if(msg->msg_type == WRP_MSG_TYPE__REQ) + { + if(msg->u.req.partner_ids != NULL) + { + count = (int) msg->u.req.partner_ids->count; + ParodusPrint("partner_ids count is %d\n",count); + for(i = 0; i < count; i++) + { + for(j = 0; jcount; j++) + { + ParodusPrint("partnersList->partner_ids[%lu] = %s\n",j, partnersList->partner_ids[j]); + if(strcmp(partnersList->partner_ids[j], msg->u.req.partner_ids->partner_ids[i]) == 0) + { + ParodusInfo("partner_id match found\n"); + matchFlag = 1; + break; + } + } + } + + /* Commandline input partner_ids not matching with partner_ids from request, ignoring request*/ + if(matchFlag != 1) + { + ParodusError("Invalid partner_id %s\n",temp); + if(partnersList != NULL) + { + for(j=0; jcount; j++) + { + if(partnersList->partner_ids[j] != NULL) + { + free(partnersList->partner_ids[j]); + } + } + free(partnersList); + } + free(partnerId); + return -1; + } + } + else + { + ParodusPrint("partner_ids list is NULL\n"); + } + } + if(partnersList != NULL) + { + for(j=0; jcount; j++) + { + if(partnersList->partner_ids[j] != NULL) + { + free(partnersList->partner_ids[j]); + } + } + free(partnersList); + } + free(partnerId); + } + else { ParodusPrint("partner_id is not available to validate\n"); return 0; } - - if(msg->msg_type == WRP_MSG_TYPE__EVENT) - { - if(msg->u.event.partner_ids != NULL) - { - count = (int) msg->u.event.partner_ids->count; - ParodusPrint("partner_ids count is %d\n",count); - for(i = 0; i < count; i++) - { - if(strcmp(partnerId, msg->u.event.partner_ids->partner_ids[i]) == 0) - { - ParodusInfo("partner_id match found\n"); - matchFlag = 1; - break; - } - } - - if(matchFlag != 1) - { - (*partnerIds) = (partners_t *) malloc(sizeof(partners_t) + (sizeof(char *) * (count+1))); - (*partnerIds)->count = count+1; - for(i = 0; i < count; i++) - { - (*partnerIds)->partner_ids[i] = msg->u.event.partner_ids->partner_ids[i]; - ParodusPrint("(*partnerIds)->partner_ids[%d] : %s\n",i,(*partnerIds)->partner_ids[i]); - } - (*partnerIds)->partner_ids[count] = (char *) malloc(sizeof(char) * 64); - parStrncpy((*partnerIds)->partner_ids[count], partnerId, 64); - ParodusPrint("(*partnerIds)->partner_ids[%d] : %s\n",count,(*partnerIds)->partner_ids[count]); - } - } - else - { - ParodusPrint("partner_ids list is NULL\n"); - (*partnerIds) = (partners_t *) malloc(sizeof(partners_t) + (sizeof(char *) * 1)); - (*partnerIds)->count = 1; - (*partnerIds)->partner_ids[0] = (char *) malloc(sizeof(char) * 64); - parStrncpy((*partnerIds)->partner_ids[0], partnerId, 64); - ParodusPrint("(*partnerIds)->partner_ids[0] : %s\n",(*partnerIds)->partner_ids[0]); - } - } - else if(msg->msg_type == WRP_MSG_TYPE__REQ) - { - if(msg->u.req.partner_ids != NULL) - { - count = (int) msg->u.req.partner_ids->count; - ParodusPrint("partner_ids count is %d\n",count); - for(i = 0; i < count; i++) - { - if(strcmp(partnerId, msg->u.req.partner_ids->partner_ids[i]) == 0) - { - ParodusInfo("partner_id match found\n"); - matchFlag = 1; - break; - } - } - - if(matchFlag != 1) - { - ParodusError("Invalid partner_id %s\n",partnerId); - return -1; - } - } - else - { - ParodusPrint("partner_ids list is NULL\n"); - } - } - return 1; } diff --git a/tests/test_partners_check.c b/tests/test_partners_check.c index a3ad973..8332a30 100755 --- a/tests/test_partners_check.c +++ b/tests/test_partners_check.c @@ -43,7 +43,7 @@ ParodusCfg *get_parodus_cfg(void) void test_validate_partner_id_for_req() { - static partners_t partner_ids = {1,{"comcast"}}; + static partners_t partner_ids = {3,{"shaw","","comcast"}}; wrp_msg_t *msg = (wrp_msg_t*) malloc(sizeof(wrp_msg_t)); memset(msg, 0, sizeof(wrp_msg_t)); msg->msg_type = WRP_MSG_TYPE__REQ; @@ -51,7 +51,7 @@ void test_validate_partner_id_for_req() ParodusCfg cfg; memset(&cfg, 0, sizeof(ParodusCfg)); - parStrncpy(cfg.partner_id, "comcast", sizeof(cfg.partner_id)); + parStrncpy(cfg.partner_id, "shaw,bar,comcast", sizeof(cfg.partner_id)); will_return(get_parodus_cfg, (intptr_t)&cfg); expect_function_call(get_parodus_cfg); @@ -68,7 +68,7 @@ void test_validate_partner_id_for_req_listNULL() ParodusCfg cfg; memset(&cfg, 0, sizeof(ParodusCfg)); - parStrncpy(cfg.partner_id, "comcast", sizeof(cfg.partner_id)); + parStrncpy(cfg.partner_id, "*,comcast", sizeof(cfg.partner_id)); will_return(get_parodus_cfg, (intptr_t)&cfg); expect_function_call(get_parodus_cfg); @@ -103,7 +103,7 @@ void err_validate_partner_id_for_req() ParodusCfg cfg; memset(&cfg, 0, sizeof(ParodusCfg)); - parStrncpy(cfg.partner_id, "comcast", sizeof(cfg.partner_id)); + parStrncpy(cfg.partner_id, "*,,comcast", sizeof(cfg.partner_id)); will_return(get_parodus_cfg, (intptr_t)&cfg); expect_function_call(get_parodus_cfg); @@ -114,7 +114,7 @@ void err_validate_partner_id_for_req() void test_validate_partner_id_for_event() { - static partners_t partner_ids = {1,{"comcast"}}; + static partners_t partner_ids = {4,{"shaw","","*","comcast"}}; wrp_msg_t *msg = (wrp_msg_t*) malloc(sizeof(wrp_msg_t)); memset(msg, 0, sizeof(wrp_msg_t)); msg->msg_type = WRP_MSG_TYPE__EVENT; @@ -122,7 +122,7 @@ void test_validate_partner_id_for_event() ParodusCfg cfg; memset(&cfg, 0, sizeof(ParodusCfg)); - parStrncpy(cfg.partner_id, "comcast", sizeof(cfg.partner_id)); + parStrncpy(cfg.partner_id, "abc,*,comcast", sizeof(cfg.partner_id)); will_return(get_parodus_cfg, (intptr_t)&cfg); expect_function_call(get_parodus_cfg);