m3 Security Fixes

This commit is contained in:
Mark Gregory
2026-09-17 10:37:56 +01:00
parent a094477840
commit 1644efed9c
5 changed files with 356 additions and 821 deletions
+66 -60
View File
@@ -159,74 +159,80 @@ class Helper
// Read M3 JSON and Analyse it for Errors
public static function checkM3Errors($responseResult)
{
// dd($responseResult);
// M3 Response Types
$M3TypesResponse = ['CloseShipment', 'Move', 'COCharge', 'Replenish', 'MoveDock'];
// CloseShipment Types And Contents
$M3CloseShipmentResp = ['AddPackage', 'PickingListClose', 'TrailerNo', 'TrackingNo', 'ContentLabel', 'DeliveryNote', 'ShipLabel'];
// 'ContentLabel', 'DeliveryNote','ShipLabel'
$ErrorMessages = '';
if (! is_object($responseResult)) {
return 'Invalid M3 response ';
}
$typesErrors = 0;
$messages = [];
$inactiveTypes = 0;
$closeShipmentInactive = self::collectCloseShipmentErrors($responseResult, $messages);
foreach ($M3TypesResponse as $key => $Type) {
// dump($responseResult->$Type);
if ($Type == 'CloseShipment') {
// dump($Type);
$CloseShipmentErr = 0;
$M3RespClose = $responseResult->$Type;
foreach ($M3CloseShipmentResp as $key => $closeType) {
$ErrorMessage = $M3RespClose->$closeType->ErrorMessage;
$ErrorMessage = $ErrorMessage == '' ? '' : $ErrorMessage;
$Result = $M3RespClose->$closeType->Result;
$ResultT = $M3RespClose->$closeType->Result;
$Result = $Result == 'N/A' || $Result == 'OK' ? '' : $Result;
if ($ErrorMessage != '' || $Result != '') {
$ErrorMessages .= $closeType . '-' . $Result . '-' . $ErrorMessage . ' ';
}
// dump($closeType);// dump($ErrorMessage);// dump($Result);
foreach (['Move', 'COCharge', 'Replenish', 'MoveDock'] as $type) {
$result = self::extractM3Result($responseResult, $type);
self::appendM3Error($messages, $type, $result);
if ($ResultT == 'N/A') {
$CloseShipmentErr++;
}
}
} elseif ($Type == 'MoveDock') {
$MoveDockRes = isset($responseResult->$Type->Move) ? $responseResult->$Type->Move : '';
$ErrorMessage = isset($MoveDockRes->ErrorMessage) ? $MoveDockRes->ErrorMessage : '';
$ErrorMessage = $ErrorMessage == '' ? '' : $ErrorMessage;
$Result = isset($MoveDockRes->Result) ? $MoveDockRes->Result : '';
$ResultT = $Result;
$Result = $Result == 'N/A' || $Result == 'OK' ? '' : $Result;
if ($ErrorMessage != '' || $Result != '') {
$ErrorMessages .= $Type . '-' . $Result . '-' . $ErrorMessage . ' ';
}
// dump($Type);// dump($ErrorMessage);// dump($Result);// dump($responseResult->$Type);
if ($ResultT == 'N/A') {
$typesErrors++;
}
} else {
$ErrorMessage = isset($responseResult->$Type->ErrorMessage) ? $responseResult->$Type->ErrorMessage : '';
$ErrorMessage = $ErrorMessage == '' ? '' : $ErrorMessage;
$Result = isset($responseResult->$Type->Result) ? $responseResult->$Type->Result : '';
$ResultT = $Result;
$Result = $Result == 'N/A' || $Result == 'OK' ? '' : $Result;
if ($ErrorMessage != '' || $Result != '') {
$ErrorMessages .= $Type . '-' . $Result . '-' . $ErrorMessage . ' ';
}
// dump($Type); // dump($ErrorMessage); // dump($Result); // dump($responseResult->$Type);
if ($ResultT == 'N/A') {
$typesErrors++;
}
if ($result['rawResult'] === 'N/A') {
$inactiveTypes++;
}
}
// dd($ErrorMessages);
if ($CloseShipmentErr == count($M3CloseShipmentResp) && $typesErrors == count($M3TypesResponse) - 1) {
$ErrorMessages .= '-M3 did not call any method or type ';
if ($closeShipmentInactive === 7 && $inactiveTypes === 4) {
$messages[] = '-M3 did not call any method or type';
}
return $ErrorMessages;
return $messages === [] ? '' : implode(' ', $messages) . ' ';
}
private static function collectCloseShipmentErrors(object $responseResult, array &$messages): int
{
$closeShipment = $responseResult->CloseShipment ?? null;
if (! is_object($closeShipment)) {
return 7;
}
$inactive = 0;
foreach (['AddPackage', 'PickingListClose', 'TrailerNo', 'TrackingNo', 'ContentLabel', 'DeliveryNote', 'ShipLabel'] as $type) {
$result = self::extractResultNode($closeShipment->{$type} ?? null);
self::appendM3Error($messages, $type, $result);
if ($result['rawResult'] === 'N/A') {
$inactive++;
}
}
return $inactive;
}
private static function extractM3Result(object $responseResult, string $type): array
{
$node = $responseResult->{$type} ?? null;
if ($type === 'MoveDock' && is_object($node)) {
$node = $node->Move ?? null;
}
return self::extractResultNode($node);
}
private static function extractResultNode(mixed $node): array
{
if (! is_object($node)) {
return ['error' => '', 'result' => '', 'rawResult' => 'N/A'];
}
$error = trim((string) ($node->ErrorMessage ?? ''));
$rawResult = trim((string) ($node->Result ?? ''));
$result = in_array($rawResult, ['N/A', 'OK'], true) ? '' : $rawResult;
return ['error' => $error, 'result' => $result, 'rawResult' => $rawResult];
}
private static function appendM3Error(array &$messages, string $type, array $result): void
{
if ($result['error'] === '' && $result['result'] === '') {
return;
}
$messages[] = $type . '-' . $result['result'] . '-' . $result['error'];
}
// Log All Success And Error to ICM699M