Skip to content

Commit 94bbd04

Browse files
committed
Improved logging in update-encryption-key script
1 parent a5544f0 commit 94bbd04

1 file changed

Lines changed: 89 additions & 39 deletions

File tree

update-encryption-key.php

Lines changed: 89 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,28 @@
1818

1919
Api::Init();
2020

21-
function logMessage($output, $message) {
22-
$output->writeln($message);
23-
Api::Log($message, \Aurora\System\Enums\LogLevel::Full, 'update-encryption-key-');
21+
abstract class Enums
22+
{
23+
public const file = 1;
24+
public const console = 2;
25+
public const both = 3;
26+
}
27+
function logMessage($output, $message, $mode = Enums::both) {
28+
if ($mode === Enums::console || $mode === Enums::both) {
29+
$output->writeln($message);
30+
}
31+
if ($mode === Enums::file || $mode === Enums::both) {
32+
Api::Log($message, \Aurora\System\Enums\LogLevel::Full, 'update-encryption-key-');
33+
}
34+
}
35+
36+
function logObjectResults($output, $data, $title) {
37+
logMessage($output, " $title:");
38+
foreach ($data as $propName => $ids) {
39+
logMessage($output, " Property: $propName");
40+
logMessage($output, " Ids: " . implode(', ', $ids));
41+
}
42+
logMessage($output, "");
2443
}
2544

2645
function updateEncryptedProp($class, $shortClassName, $propNames, $oldEncryptionKey, $newEncryptionKey, $count, $output) {
@@ -29,61 +48,92 @@ function updateEncryptedProp($class, $shortClassName, $propNames, $oldEncryption
2948
$progressBar->setBarCharacter('<info>=</info>');
3049

3150
$progressBar->start();
32-
$aSkipedProps = [];
51+
$aObjectResults= [
52+
'missing' => [],
53+
'updated' => [],
54+
'error' => [],
55+
'empty' => [],
56+
];
3357

34-
if (!is_array($propNames)) {
35-
$propNames = [$propNames];
58+
foreach ($propNames as $propName) {
59+
$aObjectResults['missing'][$propName] = [];
60+
$aObjectResults['updated'][$propName] = [];
61+
$aObjectResults['error'][$propName] = [];
62+
$aObjectResults['empty'][$propName] = [];
3663
}
37-
$class::where('Properties->EncryptionKeyIsUpdated', false)->orWhere('Properties->EncryptionKeyIsUpdated', null)->chunk(10000, function ($items) use ($propNames, $oldEncryptionKey, $newEncryptionKey, $progressBar, &$aSkipedProps) {
64+
65+
$class::where('Properties->EncryptionKeyIsUpdated', false)->orWhere('Properties->EncryptionKeyIsUpdated', null)->chunk(10000, function ($items) use ($propNames, $oldEncryptionKey, $newEncryptionKey, $progressBar, &$aObjectResults, $output) {
3866
foreach ($items as $item) {
67+
$bObjectError = false;
3968
foreach ($propNames as $propName) {
40-
Api::$sEncryptionKey = $oldEncryptionKey;
41-
$propValue = $item->{$propName};
42-
if ($propValue) {
43-
$decryptedValue = \Aurora\System\Utils::DecryptValue($propValue);
69+
if (strpos($propName, '::') !== false) {
70+
$propValue = $item->getExtendedProp($propName);
4471

45-
Api::$sEncryptionKey = $newEncryptionKey;
72+
$decryptedValue = \Aurora\System\Utils::DecryptValue($propValue);
73+
4674
if ($decryptedValue) {
47-
$item->{$propName} = \Aurora\System\Utils::EncryptValue($decryptedValue);
75+
Api::$sEncryptionKey = $newEncryptionKey;
76+
$item->setExtendedProp($propName, \Aurora\System\Utils::EncryptValue($decryptedValue));
77+
//store updated item id
78+
$aObjectResults['updated'][$propName][] = $item->Id;
4879
} else {
49-
$item->{$propName} = $propValue;
50-
}
51-
} elseif ($propValue !== null) {
52-
if (!isset($aSkipedProps[$propName])) {
53-
$aSkipedProps[$propName] = [];
80+
//store failed item id
81+
$bObjectError = true;
82+
$aObjectResults['error'][$propName][] = $item->Id;
5483
}
55-
if (!in_array($item->Id, $aSkipedProps[$propName])) {
56-
$aSkipedProps[$propName][] = $item->Id;
84+
} else {
85+
$rawValue = trim($item->getRawOriginal($propName));
86+
if ($rawValue !== '') {
87+
Api::$sEncryptionKey = $oldEncryptionKey;
88+
89+
// Most of model properties are decrypted automatically when they are read.
90+
$propValue = $item->{$propName};
91+
92+
if ($propValue) {
93+
Api::$sEncryptionKey = $newEncryptionKey;
94+
$item->{$propName} = $propValue;
95+
//store updated item id
96+
$aObjectResults['updated'][$propName][] = $item->Id;
97+
} elseif ($propValue === false || $rawValue !== '' && trim($propValue) === '') {
98+
// false means decryption error, but currently auto encrypted fields return empty strings when value cannot be decrypted
99+
$bObjectError = true;
100+
$aObjectResults['error'][$propName][] = $item->Id;
101+
} elseif ($propValue === null) {
102+
$aObjectResults['missing'][$propName][] = $item->Id;
103+
} elseif (trim($propValue) === '') {
104+
$aObjectResults['empty'][$propName][] = $item->Id;
105+
}
106+
} else {
107+
$aObjectResults['empty'][$propName][] = $item->Id;
57108
}
58109
}
59110
}
60-
$item->setExtendedProp('EncryptionKeyIsUpdated', true);
111+
112+
// $item->setExtendedProp('EncryptionKeyIsUpdated', !$bObjectError);
113+
logMessage($output, "EncryptionKeyIsUpdated: $item->Id: " . (!$bObjectError ? "true" : "false"));
61114
if ($item->save()) {
62115
$progressBar->advance();
63116
} else {
64-
// log
117+
logMessage($output, "Object saving error: $item->getName(): $item->Id");
65118
}
66119
}
67120
});
121+
68122
$progressBar->finish();
69-
logMessage($output, '');
70-
if ($aSkipedProps) {
71-
foreach ($aSkipedProps as $propName => $ids) {
72-
if (count($ids) === 0) {
73-
unset($aSkipedProps[$propName]);
74-
}
75-
}
76-
logMessage($output, "Can't read encrypted property for $shortClassName");
77-
foreach ($aSkipedProps as $propName => $ids) {
78-
logMessage($output, 'Prop name: ' . $propName);
79-
logMessage($output, $shortClassName . ' ids: ' . implode(', ', $ids));
80-
}
81-
}
123+
logMessage($output, "");
124+
logMessage($output, "'$shortClassName' objects updating results:");
125+
126+
logObjectResults($output, $aObjectResults['updated'], "Updated");
127+
logObjectResults($output, $aObjectResults['error'], "Errors");
128+
logObjectResults($output, $aObjectResults['missing'], "Missing");
129+
logObjectResults($output, $aObjectResults['empty'], "Empty");
82130
}
83131

84132
function updateEncryptedConfig($moduleName, $configName, $oldEncryptionKey, $newEncryptionKey, $output) {
85133
if (Api::$oModuleManager->isModuleLoaded($moduleName)) {
86-
$output->write("$moduleName->$configName: ");
134+
135+
logMessage($output, "Processing $moduleName->$configName: ");
136+
87137
$configValue = Api::$oModuleManager->getModuleConfigValue($moduleName, $configName);
88138
if ($configValue) {
89139
Api::$sEncryptionKey = $oldEncryptionKey;
@@ -110,7 +160,7 @@ function processObject($class, $props, $oldEncryptionKey, $newEncryptionKey, $in
110160
$classParts = explode('\\', $class);
111161
$shortClassName = end($classParts);
112162

113-
logMessage($output, "Process $shortClassName objects");
163+
logMessage($output, "Processing $class objects");
114164

115165
if (class_exists($class)) {
116166
$classTablename = with(new $class)->getTable();
@@ -175,8 +225,8 @@ function processObject($class, $props, $oldEncryptionKey, $newEncryptionKey, $in
175225
logMessage($output, 'Encryption key file not found');
176226
}
177227

178-
logMessage($output, "Old encryption key: $oldEncryptionKey");
179-
logMessage($output, "New encryption key: $newEncryptionKey");
228+
logMessage($output, "Old encryption key: $oldEncryptionKey", Enums::console);
229+
logMessage($output, "New encryption key: $newEncryptionKey", Enums::console);
180230
logMessage($output, "");
181231

182232
// update encrypted data for classes

0 commit comments

Comments
 (0)