1818
1919Api::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
2645function 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
84132function 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