Преглед на файлове

2022-09-28/Jerry Wang
[OCPP 1.6][OCPP 1.6PH]
Action:
1. Improve JsonParser logic to avoid task crash caused by illegal message.
2. Improve TCCI occupancy related logic.
3. Improve adding and parsing LocalList logic.
4. Improve handleCertificateSignedRequest() logic.

File:
1. EVSE/Modularization/ocppfiles/MessageHandler.c
--> Action 2-4
2. EVSE/Modularization/ocppfiles/JsonParser.c
--> Action 1
3. EVSE/Modularization/ocppph/JsonParser.c
--> Action 1

Jerry Wang преди 2 години
родител
ревизия
7881e345c2
променени са 3 файла, в които са добавени 45 реда и са изтрити 11 реда
  1. 15 1
      EVSE/Modularization/ocppfiles/JsonParser.c
  2. 15 9
      EVSE/Modularization/ocppfiles/MessageHandler.c
  3. 15 1
      EVSE/Modularization/ocppph/JsonParser.c

+ 15 - 1
EVSE/Modularization/ocppfiles/JsonParser.c

@@ -132,7 +132,7 @@ void ReceivedMessage(void *in, size_t len)
 
 	if(tempin[0] != '\0')
 	{
-		if(strcmp((const char *)tempin,"[ ]") == 0)
+		if(strcmp((const char *)tempin,"[ ]") == 0 || strcmp((const char *)tempin,"[]") == 0)
 		{
 			DEBUG_WARN("Message is empty array.\n");
 			return;
@@ -142,6 +142,20 @@ void ReceivedMessage(void *in, size_t len)
 		obj = json_tokener_parse(tempin);
 		if(!is_error(obj))
 		{
+			if(json_object_is_type(obj, json_type_array))
+			{
+				if(json_object_array_length(obj) < 3)
+				{
+					DEBUG_WARN("Message parsed array count is less than 3.\n");
+					return;
+				}
+			}
+			else
+			{
+				DEBUG_WARN("Message is not an array type.\n");
+				return;
+			}
+
 			MsgType = json_object_get_int(json_object_array_get_idx(obj, 0));
 			sprintf(UniqueId, "%s", json_object_get_string(json_object_array_get_idx(obj, 1)));
 

+ 15 - 9
EVSE/Modularization/ocppfiles/MessageHandler.c

@@ -6313,13 +6313,13 @@ int sendAuthorizeRequest(int gun_index)
 		OCPP_getIdTagFromLocalCache((char *)ShmSysConfigAndInfo->SysConfig.UserId);
 
 		// Query from list
-		if((strcmp(idTagQuery.idTagstr,"") == 0) || (strcmp(idTagQuery.idTagstatus,"Accepted") != 0) )
+		if((strcmp(idTagQuery.idTagstr,"") == 0) || (strstr(idTagQuery.idTagstatus,"Accepted") == NULL) )
 		{
 			DEBUG_INFO("Authorize from list.\n");
 			OCPP_getIdTagFromLocalList((char *)ShmSysConfigAndInfo->SysConfig.UserId);
 		}
 
-		if((strcmp(idTagQuery.idTagstr,"") == 0) || (strcmp(idTagQuery.idTagstatus,"Accepted") != 0) )
+		if((strcmp(idTagQuery.idTagstr,"") == 0) || (strstr(idTagQuery.idTagstatus,"Accepted") == NULL) )
 		{
 			if(strcmp(idTagQuery.idTagstr,"") == 0)
 			{
@@ -12486,7 +12486,7 @@ int handleDataTransferRequest(char *uuid, char *payload)
 
 				if(json_object_object_get(data, "ConnectorId") != NULL)
 				{
-					gun_index = json_object_get_int(json_object_object_get(data, "ConnectorId"));
+					gun_index = json_object_get_int(json_object_object_get(data, "ConnectorId"))-1;
 					if(json_object_object_get(data, "occupancySN") != NULL)
 					{
 						sprintf((char *)ShmOCPP16Data->TcciCustomData.OccupancyFeeDisplay[gun_index].occupancySN, "%s", json_object_get_string(json_object_object_get(data,"occupancySN")));
@@ -14771,6 +14771,7 @@ int handleSendLocalListRequest(char *uuid, char *payload)
 
 	// Parsing payload
 	SendLocalList = json_tokener_parse(payload);
+
 	if(!is_error(SendLocalList))
 	{
 		// Required data
@@ -14825,17 +14826,17 @@ int handleSendLocalListRequest(char *uuid, char *payload)
 			memset(ShmOCPP16Data->SendLocalList.LocalAuthorizationList, 0 , sizeof(struct StructLocalAuthorizationList)*1);
 			for(int idx=0;idx<json_object_array_length(json_object_object_get(SendLocalList, "localAuthorizationList"));idx++)
 			{
-				sprintf((char*)ShmOCPP16Data->SendLocalList.LocalAuthorizationList[0].IdTag, "%s", json_object_get_string(json_object_object_get(json_object_array_get_idx(json_object_object_get(SendLocalList, "localAuthorizationList"), idx), "idTag")));
+				sprintf((char*)ShmOCPP16Data->SendLocalList.LocalAuthorizationList[0].IdTag, "%s", stringtrimspace((char *)json_object_get_string(json_object_object_get(json_object_array_get_idx(json_object_object_get(SendLocalList, "localAuthorizationList"), idx), "idTag"))));
 
 				if(json_object_object_get(json_object_array_get_idx(json_object_object_get(SendLocalList, "localAuthorizationList"), idx), "idTagInfo") != NULL)
 				{
-					sprintf((char*)ShmOCPP16Data->SendLocalList.LocalAuthorizationList[0].IdTagInfo.Status, "%s", json_object_get_string(json_object_object_get(json_object_object_get(json_object_array_get_idx(json_object_object_get(SendLocalList, "localAuthorizationList"), idx), "idTagInfo"), "status")));
+					sprintf((char*)ShmOCPP16Data->SendLocalList.LocalAuthorizationList[0].IdTagInfo.Status, "%s", stringtrimspace((char *)json_object_get_string(json_object_object_get(json_object_object_get(json_object_array_get_idx(json_object_object_get(SendLocalList, "localAuthorizationList"), idx), "idTagInfo"), "status"))));
 
 					if(json_object_object_get(json_object_object_get(json_object_array_get_idx(json_object_object_get(SendLocalList, "localAuthorizationList"), idx), "idTagInfo"), "expiryDate") != NULL)
-						sprintf((char*)ShmOCPP16Data->SendLocalList.LocalAuthorizationList[0].IdTagInfo.ExpiryDate, "%s", json_object_get_string(json_object_object_get(json_object_object_get(json_object_array_get_idx(json_object_object_get(SendLocalList, "localAuthorizationList"), idx), "idTagInfo"), "expiryDate")));
+						sprintf((char*)ShmOCPP16Data->SendLocalList.LocalAuthorizationList[0].IdTagInfo.ExpiryDate, "%s", stringtrimspace((char *)json_object_get_string(json_object_object_get(json_object_object_get(json_object_array_get_idx(json_object_object_get(SendLocalList, "localAuthorizationList"), idx), "idTagInfo"), "expiryDate"))));
 
 					if(json_object_object_get(json_object_object_get(json_object_array_get_idx(json_object_object_get(SendLocalList, "localAuthorizationList"), idx), "idTagInfo"), "parentIdTag") != NULL)
-						sprintf((char*)ShmOCPP16Data->SendLocalList.LocalAuthorizationList[0].IdTagInfo.ParentIdTag, "%s", json_object_get_string(json_object_object_get(json_object_object_get(json_object_array_get_idx(json_object_object_get(SendLocalList, "localAuthorizationList"), idx), "idTagInfo"), "parentIdTag")));
+						sprintf((char*)ShmOCPP16Data->SendLocalList.LocalAuthorizationList[0].IdTagInfo.ParentIdTag, "%s", stringtrimspace((char *)json_object_get_string(json_object_object_get(json_object_object_get(json_object_array_get_idx(json_object_object_get(SendLocalList, "localAuthorizationList"), idx), "idTagInfo"), "parentIdTag"))));
 				}
 
 				// Add to db
@@ -16331,15 +16332,20 @@ int handleCertificateSignedRequest(char *uuid, char *payload)
 	}
 	json_object_put(CertificateSigned);
 
-	FILE *fp = fopen(CERTIFICATE_CP, "w");
+	FILE *fp = fopen("/Storage/OCPP/tempCP.pem", "w");
 	fprintf(fp, "%s", ShmOCPP16Data->CertificateSigned.certificateChain);
 	fclose(fp);
 	system("/bin/fsync -d /dev/mtdblock13;/bin/sync &");
 
 	ShmOCPP16Data->MsMsg.bits.CertificateSignedReq = 1;
 
-	if(certVerify(PRIVATE_KEY_CP, CERTIFICATE_CP) == PASS)
+	if(certVerify(PRIVATE_KEY_CP, "/Storage/OCPP/tempCP.pem") == PASS)
+	{
 		sprintf((char*)ShmOCPP16Data->CertificateSigned.Response_status, "Accepted");
+		system("rm -f /Storage/OCPP/certCP_fallback.pem");
+		rename(CERTIFICATE_CP, "/Storage/OCPP/certCP_fallback.pem");
+		rename("/Storage/OCPP/tempCP.pem", CERTIFICATE_CP);
+	}
 	else
 	{
 		sprintf((char*)ShmOCPP16Data->CertificateSigned.Response_status, "Rejected");

+ 15 - 1
EVSE/Modularization/ocppph/JsonParser.c

@@ -132,7 +132,7 @@ void ReceivedMessage(void *in, size_t len)
 
 	if(tempin[0] != '\0')
 	{
-		if(strcmp((const char *)tempin,"[ ]") == 0)
+		if(strcmp((const char *)tempin,"[ ]") == 0 || strcmp((const char *)tempin,"[]") == 0)
 		{
 			DEBUG_WARN("Message is empty array.\n");
 			return;
@@ -142,6 +142,20 @@ void ReceivedMessage(void *in, size_t len)
 		obj = json_tokener_parse(tempin);
 		if(!is_error(obj))
 		{
+			if(json_object_is_type(obj, json_type_array))
+			{
+				if(json_object_array_length(obj) < 3)
+				{
+					DEBUG_WARN("Message parsed array count is less than 3.\n");
+					return;
+				}
+			}
+			else
+			{
+				DEBUG_WARN("Message is not an array type.\n");
+				return;
+			}
+
 			MsgType = json_object_get_int(json_object_array_get_idx(obj, 0));
 			sprintf(UniqueId, "%s", json_object_get_string(json_object_array_get_idx(obj, 1)));