Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
307 changes: 299 additions & 8 deletions source/parodusStart/start_parodus.c
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* If not stated otherwise in this file or this component's Licenses.txt file the

Check failure on line 2 in source/parodusStart/start_parodus.c

View workflow job for this annotation

GitHub Actions / call-fossid-workflow / Fossid Annotate PR

FossID Detected License Issue

Snippet with 'Apache-2.0' file license found (1379 lines) Location: source/parodusStart/start_parodus.c (link unavailable) Component: rdkb/components/generic/startParodus/rdkb/components/generic/startParodus@RDKB-RELEASE-TEST-DUNFELL-1 Download: https://code.rdkcentral.com/r/plugins/gitiles/rdkb/components/generic/startParodus/+archive/RDKB-RELEASE-TEST-DUNFELL-1.tar.gz
* following copyright and licenses apply:
*
* Copyright 2019 RDK Management
Expand Down Expand Up @@ -88,6 +88,10 @@
#define DEVICE_CERT_REF "/tmp/.cfgDynamicxpki"
#define STATIC_CERT_REF "/tmp/.cfgStaticxpki"

#define WEBPA_SERVER_URL_PARAM "Device.X_RDKCENTRAL-COM_Webpa.Server.URL"
#define TOKEN_SERVER_URL_PARAM "Device.X_RDKCENTRAL-COM_Webpa.TokenServer.URL"
#define DNS_TEXT_URL_PARAM "Device.X_RDKCENTRAL-COM_Webpa.DNSText.URL"

#if defined(_COSA_QCA_ARM_)
#define CONFIG_VENDOR_NAME "QTI"
#endif
Expand Down Expand Up @@ -146,12 +150,15 @@
int s_sysevent_connect (token_t *out_se_token);
#endif
static char *pathPrefix = "eRT.com.cisco.spvtg.ccsp.webpa.";
static char *WEBPA_SERVER_URL = "";
static char *TOKEN_SERVER_URL = "";
static char *DNS_TEXT_URL = "";

STATIC char *WEBPA_SERVER_URL = NULL;
STATIC char *TOKEN_SERVER_URL = NULL;
STATIC char *DNS_TEXT_URL = NULL;
Comment thread
guruchandru marked this conversation as resolved.

STATIC void getSECertSupport(char *seCert_support);
static int getDeviceConfigFile();
STATIC int getPartnerSpecificParam(const char *partner_id, const char *param_name, char **value);
STATIC void updateWebpaCrucialUrlFromPartnerJson(char *partner_id);

FILE* g_fArmConsoleLog = NULL;
/*----------------------------------------------------------------------------*/
Expand Down Expand Up @@ -620,14 +627,49 @@
free(psmValues[i]);
}
}
LogInfo("WEBPA_SERVER_URL = %s\n", WEBPA_SERVER_URL);
LogInfo("TOKEN_SERVER_URL = %s\n", TOKEN_SERVER_URL);
LogInfo("DNS_TEXT_URL = %s\n", DNS_TEXT_URL);
LogInfo("WEBPA_SERVER_URL = %s\n", WEBPA_SERVER_URL ? WEBPA_SERVER_URL : "(null)");
LogInfo("TOKEN_SERVER_URL = %s\n", TOKEN_SERVER_URL ? TOKEN_SERVER_URL : "(null)");
LogInfo("DNS_TEXT_URL = %s\n", DNS_TEXT_URL ? DNS_TEXT_URL : "(null)");

// Update from partner JSON if webpa related crucial URLs are empty
if (partner_id[0] != '\0')
{
updateWebpaCrucialUrlFromPartnerJson(partner_id);
}
Comment thread
guruchandru marked this conversation as resolved.
Comment thread
guruchandru marked this conversation as resolved.

if(webpaUrl == NULL)
if(webpaUrl == NULL || webpaUrl[0] == '\0')
{
LogInfo("Setting webpaUrl to default server IP\n");
webpaUrl = strdup(WEBPA_SERVER_URL);
if(WEBPA_SERVER_URL != NULL && WEBPA_SERVER_URL[0] != '\0')
{
/* Free existing allocation if webpaUrl is non-NULL but empty */
if(webpaUrl != NULL)
{
free(webpaUrl);
webpaUrl = NULL;
}

webpaUrl = strdup(WEBPA_SERVER_URL);
if(webpaUrl != NULL)
{
LogInfo("webpaUrl is %s\n", webpaUrl);
}
else
{
LogError("strdup failed for WEBPA_SERVER_URL\n");
}
}
else
{
LogError("WEBPA_SERVER_URL is NULL or empty, cannot set webpaUrl\n");
}
}

/* Validate webpaUrl is set before proceeding */
if(webpaUrl == NULL || webpaUrl[0] == '\0')
{
LogError("Unable to determine webpa URL, cannot start parodus\n");
goto RETURN_ERROR;
}


Expand Down Expand Up @@ -1815,6 +1857,255 @@
}
}


STATIC int getPartnerSpecificParam(const char *partner_id, const char *param_name, char **value)
{
FILE *fileRead = NULL;
char *data = NULL;
cJSON *json = NULL;
cJSON *partnerObj = NULL;
cJSON *paramObj = NULL;
long len = 0;
errno_t rc = -1;
char cleanPartnerId[MAX_PARTNERID_LEN] = {'\0'};
char *partnerKey = NULL;

// Handle empty partner_id
if (partner_id == NULL || partner_id[0] == '\0')
{
LogError("Partner ID is NULL or empty\n");
return -1;
}
Comment thread
guruchandru marked this conversation as resolved.

// Strip "*," prefix if present to get actual partner key for JSON lookup
if (strncmp(partner_id, "*,", 2) == 0)
{
partnerKey = (char *)(partner_id + 2); // Skip "*,"
}
else
{
partnerKey = (char *)partner_id;
}

rc = strcpy_s(cleanPartnerId, sizeof(cleanPartnerId), partnerKey);
if (rc != EOK)
{
ERR_CHK(rc);
LogError("Failed to copy partner ID\n");
return -1;
}

LogInfo("Looking up partner '%s' in JSON config\n", cleanPartnerId);

// Open the partner defaults JSON file
fileRead = fopen("/etc/partners_defaults.json", "r");
if (fileRead == NULL)
{
LogError("Failed to open /etc/partners_defaults.json file\n");
return -1;
Comment thread
guruchandru marked this conversation as resolved.
Comment thread
guruchandru marked this conversation as resolved.
}

// Get file size
fseek(fileRead, 0, SEEK_END);
len = ftell(fileRead);
fseek(fileRead, 0, SEEK_SET);

if (len <= 0)
{
LogError("Invalid file length\n");
fclose(fileRead);
Comment thread
guruchandru marked this conversation as resolved.
return -1;
}

// Allocate memory and read file
data = (char *)malloc(sizeof(char) * (len + 1));
Comment thread
guruchandru marked this conversation as resolved.
if (data == NULL)
{
LogError("Failed to allocate memory\n");
fclose(fileRead);
return -1;
}

memset(data, 0, (sizeof(char) * (len + 1)));
Comment thread
guruchandru marked this conversation as resolved.
size_t bytesRead = fread(data, 1, len, fileRead);
fclose(fileRead);
if (bytesRead != (size_t)len)
{
LogError("Failed to read complete JSON file: expected %ld bytes, got %zu\n", len, bytesRead);
free(data);
return -1;
}

// Parse JSON
json = cJSON_Parse(data);
if (json == NULL)
{
LogError("Failed to parse JSON data\n");
free(data);
return -1;
}

// Navigate to partner ID object
partnerObj = cJSON_GetObjectItem(json, cleanPartnerId);
if (partnerObj == NULL)
{
LogError("Partner ID '%s' not found in JSON\n", cleanPartnerId);
cJSON_Delete(json);
free(data);
return -1;
}

// Get the specific parameter from partner object
paramObj = cJSON_GetObjectItem(partnerObj, param_name);
if (paramObj == NULL || !cJSON_IsString(paramObj))
{
LogError("Parameter '%s' not found for partner '%s'\n", param_name, cleanPartnerId);
cJSON_Delete(json);
free(data);
return -1;
}

// Allocate and copy the value
*value = strdup(paramObj->valuestring);
if (*value == NULL)
{
LogError("Failed to allocate memory for value\n");
cJSON_Delete(json);
free(data);
return -1;
}

LogInfo("Retrieved %s = %s for partner %s\n", param_name, *value, cleanPartnerId);

// Cleanup
cJSON_Delete(json);
free(data);

return 0;
}

STATIC void updateWebpaCrucialUrlFromPartnerJson(char *partner_id)
{
char *partnerServerUrl = NULL;

// Check if WEBPA_SERVER_URL is NULL or empty
if (WEBPA_SERVER_URL == NULL || WEBPA_SERVER_URL[0] == '\0')
{
LogInfo("WEBPA_SERVER_URL is NULL or empty, fetching from partner JSON\n");

// Get the value from partner-specific JSON
if (getPartnerSpecificParam(partner_id,
WEBPA_SERVER_URL_PARAM,
&partnerServerUrl) == 0)
Comment thread
guruchandru marked this conversation as resolved.
{
Comment thread
guruchandru marked this conversation as resolved.
if (partnerServerUrl != NULL && partnerServerUrl[0] != '\0')
{
Comment thread
guruchandru marked this conversation as resolved.
/* Free any previous heap-allocated value before updating. */
if (WEBPA_SERVER_URL != NULL && WEBPA_SERVER_URL != partnerServerUrl)
{
free(WEBPA_SERVER_URL);
}
Comment thread
guruchandru marked this conversation as resolved.
WEBPA_SERVER_URL = partnerServerUrl;
LogInfo("Updated WEBPA_SERVER_URL from partner JSON: %s\n", WEBPA_SERVER_URL);
}
else
{
LogError("Retrieved empty value from partner JSON for WEBPA_SERVER_URL\n");
if (partnerServerUrl != NULL)
{
free(partnerServerUrl);
}
Comment thread
guruchandru marked this conversation as resolved.
}
}
else
{
LogError("Failed to retrieve WEBPA_SERVER_URL from partner JSON\n");
}
}
else
{
LogInfo("WEBPA_SERVER_URL already set: %s\n", WEBPA_SERVER_URL);
}

//Check if TOKEN_SERVER_URL is NULL or empty
if (TOKEN_SERVER_URL == NULL || TOKEN_SERVER_URL[0] == '\0')
{
LogInfo("TOKEN_SERVER_URL is NULL or empty, fetching from partner JSON\n");

// Get the value from partner-specific JSON
if (getPartnerSpecificParam(partner_id,
TOKEN_SERVER_URL_PARAM,
&partnerServerUrl) == 0)
{
if (partnerServerUrl != NULL && partnerServerUrl[0] != '\0')
{
/* Free any previous heap-allocated value before updating. */
if (TOKEN_SERVER_URL != NULL && TOKEN_SERVER_URL != partnerServerUrl)
{
free(TOKEN_SERVER_URL);
}
TOKEN_SERVER_URL = partnerServerUrl;
LogInfo("Updated TOKEN_SERVER_URL from partner JSON: %s\n", TOKEN_SERVER_URL);
}
else
{
LogError("Retrieved empty value from partner JSON for TOKEN_SERVER_URL\n");
if (partnerServerUrl != NULL)
{
free(partnerServerUrl);
}
Comment thread
guruchandru marked this conversation as resolved.
}
}
else
{
LogError("Failed to retrieve TOKEN_SERVER_URL from partner JSON\n");
}
}
else
{
LogInfo("TOKEN_SERVER_URL already set: %s\n", TOKEN_SERVER_URL);
}

//Check if DNS_TEXT_URL is NULL or empty
if (DNS_TEXT_URL == NULL || DNS_TEXT_URL[0] == '\0')
{
LogInfo("DNS_TEXT_URL is NULL or empty, fetching from partner JSON\n");

// Get the value from partner-specific JSON
if (getPartnerSpecificParam(partner_id,
DNS_TEXT_URL_PARAM,
&partnerServerUrl) == 0)
{
if (partnerServerUrl != NULL && partnerServerUrl[0] != '\0')
{
/* Free any previous heap-allocated value before updating. */
if (DNS_TEXT_URL != NULL && DNS_TEXT_URL != partnerServerUrl)
{
free(DNS_TEXT_URL);
}
DNS_TEXT_URL = partnerServerUrl;
LogInfo("Updated DNS_TEXT_URL from partner JSON: %s\n", DNS_TEXT_URL);
}
else
{
LogError("Retrieved empty value from partner JSON for DNS_TEXT_URL\n");
if (partnerServerUrl != NULL)
{
free(partnerServerUrl);
}
Comment thread
guruchandru marked this conversation as resolved.
}
}
else
{
LogError("Failed to retrieve DNS_TEXT_URL from partner JSON\n");
}
}
else
{
LogInfo("DNS_TEXT_URL already set: %s\n", DNS_TEXT_URL);
}
}

static int getDeviceConfigFile()
{
int rv = -1;
Expand Down
Loading
Loading