From e7bf8cf4687c32b089b9c026f0823d7c854cf903 Mon Sep 17 00:00:00 2001 From: Gayathri Date: Wed, 25 Jul 2018 18:21:10 +0530 Subject: [PATCH 1/5] Parse comma(,) separated partner_id to get partner_ids list --- src/partners_check.c | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/src/partners_check.c b/src/partners_check.c index 9df498d..ea1f844 100644 --- a/src/partners_check.c +++ b/src/partners_check.c @@ -39,6 +39,30 @@ /*----------------------------------------------------------------------------*/ /* External functions */ /*----------------------------------------------------------------------------*/ +static void parse_partner_id(char *partnerId, char ***partnersList, int *retCount) +{ + 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 = (char **)malloc(sizeof(char *) * count+1); + while ((token = strsep(&partnerId, ",")) != NULL) + { + ParodusPrint("token=%s\n", token); + (*partnersList)[j] = strdup(token); + j++; + } + *retCount = count+1; +} + int validate_partner_id(wrp_msg_t *msg, partners_t **partnerIds) { int matchFlag = 0, i = 0, count = 0; From 1e05869dedb4c026b1ad3a6448c98b10d5ea2835 Mon Sep 17 00:00:00 2001 From: Gayathri Date: Thu, 26 Jul 2018 17:27:26 +0530 Subject: [PATCH 2/5] To validate array of partner_ids --- src/partners_check.c | 90 ++++++++++++++++++++++++++++--------- tests/test_partners_check.c | 12 ++--- 2 files changed, 74 insertions(+), 28 deletions(-) diff --git a/src/partners_check.c b/src/partners_check.c index ea1f844..a63e13d 100644 --- a/src/partners_check.c +++ b/src/partners_check.c @@ -65,12 +65,29 @@ static void parse_partner_id(char *partnerId, char ***partnersList, int *retCoun int validate_partner_id(wrp_msg_t *msg, partners_t **partnerIds) { - int matchFlag = 0, i = 0, count = 0; + int matchFlag = 0, i = 0, count = 0, partnerCount = 0, j = 0; + char **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(strlen(temp) > 0) + { + partnerId = strdup(temp); + } + ParodusPrint("partnerId = %s\n",partnerId); + if(partnerId != NULL) + { + parse_partner_id(partnerId, &partnersList, &partnerCount); + } + ParodusPrint("partnerCount = %d\n", partnerCount); + if(partnerCount == 0) { ParodusPrint("partner_id is not available to validate\n"); + if(partnerId != NULL) + { + free(partnerId); + } return 0; } @@ -82,36 +99,54 @@ int validate_partner_id(wrp_msg_t *msg, partners_t **partnerIds) 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) + for(j = 0; ju.event.partner_ids->partner_ids[i]) == 0) + { + ParodusInfo("partner_id match found\n"); + matchFlag = 1; + break; + } + } + if(matchFlag == 1) { - 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; + (*partnerIds) = (partners_t *) malloc(sizeof(partners_t) + (sizeof(char *) * (count+partnerCount))); + (*partnerIds)->count = count+partnerCount; 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]); + j = 0; + for(i = count; i<(count+partnerCount); i++) + { + (*partnerIds)->partner_ids[i] = (char *) malloc(sizeof(char) * 64); + parStrncpy((*partnerIds)->partner_ids[i], partnersList[j], 64); + ParodusPrint("(*partnerIds)->partner_ids[%d] : %s\n",i,(*partnerIds)->partner_ids[i]); + j++; + } } } 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]); + (*partnerIds) = (partners_t *) malloc(sizeof(partners_t) + (sizeof(char *) * partnerCount)); + (*partnerIds)->count = partnerCount; + j=0; + for(i = 0; ipartner_ids[i] = (char *) malloc(sizeof(char) * 64); + parStrncpy((*partnerIds)->partner_ids[i], partnersList[j], 64); + ParodusPrint("(*partnerIds)->partner_ids[%d] : %s\n",i,(*partnerIds)->partner_ids[i]); + j++; + } } } else if(msg->msg_type == WRP_MSG_TYPE__REQ) @@ -122,17 +157,25 @@ int validate_partner_id(wrp_msg_t *msg, partners_t **partnerIds) 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) + for(j = 0; ju.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); + ParodusError("Invalid partner_id %s\n",temp); + if(partnerId != NULL) + { + free(partnerId); + } return -1; } } @@ -141,7 +184,10 @@ int validate_partner_id(wrp_msg_t *msg, partners_t **partnerIds) ParodusPrint("partner_ids list is NULL\n"); } } - + if(partnerId != NULL) + { + free(partnerId); + } 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); From 7b496769fce924cbf91254db4f50dec8d3607788 Mon Sep 17 00:00:00 2001 From: Gayathri Date: Fri, 27 Jul 2018 12:50:52 +0530 Subject: [PATCH 3/5] Returing with 403 error on mismatch of partner_id --- src/downstream.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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"); } From 6a1d908407eef9ce3dced5ba9fdfea6a06a03f7c Mon Sep 17 00:00:00 2001 From: Gayathri Date: Fri, 27 Jul 2018 13:14:34 +0530 Subject: [PATCH 4/5] Avoiding triple pointer to get list of partner_ids --- src/partners_check.c | 212 +++++++++++++++++++++++-------------------- 1 file changed, 113 insertions(+), 99 deletions(-) diff --git a/src/partners_check.c b/src/partners_check.c index a63e13d..8e6e33b 100644 --- a/src/partners_check.c +++ b/src/partners_check.c @@ -39,7 +39,7 @@ /*----------------------------------------------------------------------------*/ /* External functions */ /*----------------------------------------------------------------------------*/ -static void parse_partner_id(char *partnerId, char ***partnersList, int *retCount) +static void parse_partner_id(char *partnerId, partners_t **partnersList) { char *token; int i = 0, j = 0, count = 0; @@ -53,20 +53,23 @@ static void parse_partner_id(char *partnerId, char ***partnersList, int *retCoun i++; } ParodusPrint("count = %d\n", count+1); - *partnersList = (char **)malloc(sizeof(char *) * 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)[j] = strdup(token); + (*partnersList)->partner_ids[j] = strdup(token); + ParodusPrint("(*partnersList)->partner_ids[%d] = %s\n",j,(*partnersList)->partner_ids[j]); j++; } - *retCount = count+1; } int validate_partner_id(wrp_msg_t *msg, partners_t **partnerIds) { - int matchFlag = 0, i = 0, count = 0, partnerCount = 0, j = 0; - char **partnersList = NULL; + int matchFlag = 0, i = 0, count = 0; + size_t j = 0; + partners_t *partnersList = NULL; char *partnerId = NULL; ParodusPrint("********* %s ********\n",__FUNCTION__); char *temp = get_parodus_cfg()->partner_id; @@ -78,116 +81,127 @@ int validate_partner_id(wrp_msg_t *msg, partners_t **partnerIds) ParodusPrint("partnerId = %s\n",partnerId); if(partnerId != NULL) { - parse_partner_id(partnerId, &partnersList, &partnerCount); - } - ParodusPrint("partnerCount = %d\n", partnerCount); - if(partnerCount == 0) - { - ParodusPrint("partner_id is not available to validate\n"); - if(partnerId != NULL) + parse_partner_id(partnerId, &partnersList); + ParodusPrint("partnersList->count = %lu\n", partnersList->count); + if(msg->msg_type == WRP_MSG_TYPE__EVENT) { - free(partnerId); - } - 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(msg->u.event.partner_ids != NULL) { - for(j = 0; ju.event.partner_ids->partner_ids[i]) == 0) - { - ParodusInfo("partner_id match found\n"); - matchFlag = 1; - break; - } - } - if(matchFlag == 1) - { - break; - } - } - - if(matchFlag != 1) - { - (*partnerIds) = (partners_t *) malloc(sizeof(partners_t) + (sizeof(char *) * (count+partnerCount))); - (*partnerIds)->count = count+partnerCount; + count = (int) msg->u.event.partner_ids->count; + ParodusPrint("partner_ids count is %d\n",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]); - } - j = 0; - for(i = count; i<(count+partnerCount); i++) - { - (*partnerIds)->partner_ids[i] = (char *) malloc(sizeof(char) * 64); - parStrncpy((*partnerIds)->partner_ids[i], partnersList[j], 64); - ParodusPrint("(*partnerIds)->partner_ids[%d] : %s\n",i,(*partnerIds)->partner_ids[i]); - j++; - } - } - } - else - { - ParodusPrint("partner_ids list is NULL\n"); - (*partnerIds) = (partners_t *) malloc(sizeof(partners_t) + (sizeof(char *) * partnerCount)); - (*partnerIds)->count = partnerCount; - j=0; - for(i = 0; ipartner_ids[i] = (char *) malloc(sizeof(char) * 64); - parStrncpy((*partnerIds)->partner_ids[i], partnersList[j], 64); - ParodusPrint("(*partnerIds)->partner_ids[%d] : %s\n",i,(*partnerIds)->partner_ids[i]); - j++; - } - } - } - 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; ju.req.partner_ids->partner_ids[i]) == 0) + 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; + } + } + if(matchFlag == 1) { - ParodusInfo("partner_id match found\n"); - matchFlag = 1; break; } } - } - if(matchFlag != 1) - { - ParodusError("Invalid partner_id %s\n",temp); - if(partnerId != NULL) + if(matchFlag != 1) { - free(partnerId); + (*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++; } - return -1; } } - else + else if(msg->msg_type == WRP_MSG_TYPE__REQ) { - ParodusPrint("partner_ids list is NULL\n"); + 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; + } + } + } + + 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); } - } - if(partnerId != NULL) - { free(partnerId); } + else + { + ParodusPrint("partner_id is not available to validate\n"); + return 0; + } return 1; } From 558f007bdf4ab80e24a0d2e5575857d3693816e1 Mon Sep 17 00:00:00 2001 From: Gayathri Date: Thu, 2 Aug 2018 10:53:35 +0530 Subject: [PATCH 5/5] Added comments --- src/partners_check.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/partners_check.c b/src/partners_check.c index 8e6e33b..ae3e80e 100644 --- a/src/partners_check.c +++ b/src/partners_check.c @@ -74,7 +74,7 @@ int validate_partner_id(wrp_msg_t *msg, partners_t **partnerIds) ParodusPrint("********* %s ********\n",__FUNCTION__); char *temp = get_parodus_cfg()->partner_id; ParodusPrint("temp = %s\n",temp); - if(strlen(temp) > 0) + if(temp[0] != '\0' && strlen(temp) > 0) { partnerId = strdup(temp); } @@ -101,12 +101,14 @@ int validate_partner_id(wrp_msg_t *msg, partners_t **partnerIds) 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))); @@ -161,6 +163,7 @@ int validate_partner_id(wrp_msg_t *msg, partners_t **partnerIds) } } + /* Commandline input partner_ids not matching with partner_ids from request, ignoring request*/ if(matchFlag != 1) { ParodusError("Invalid partner_id %s\n",temp);