@@ -34,6 +34,7 @@ class AuditSubscriber implements EventSubscriber
34
34
35
35
protected $ auditedEntities = [];
36
36
protected $ unauditedEntities = [];
37
+ protected $ unauditedFields = [];
37
38
38
39
protected $ inserted = []; // [$source, $changeset]
39
40
protected $ updated = []; // [$source, $changeset]
@@ -81,6 +82,15 @@ public function addUnauditedEntities(array $unauditedEntities)
81
82
}
82
83
}
83
84
85
+ public function addUnauditedFields (array $ unauditedFields )
86
+ {
87
+ foreach ($ unauditedFields as $ unauditedField ) {
88
+ foreach ($ unauditedField as $ key => $ unauditedFieldChild ) {
89
+ $ this ->unauditedFields [$ key ] = $ unauditedFieldChild ;
90
+ }
91
+ }
92
+ }
93
+
84
94
public function getUnauditedEntities ()
85
95
{
86
96
return array_keys ($ this ->unauditedEntities );
@@ -365,13 +375,57 @@ protected function id(EntityManager $em, $entity)
365
375
return $ pk ;
366
376
}
367
377
378
+
379
+ function is_json ($ string ) {
380
+ json_decode ($ string );
381
+ return (json_last_error () == JSON_ERROR_NONE ) ? true : false ;
382
+ }
383
+
384
+ protected function filterRecursive ($ unauditedFields , $ array ){
385
+ foreach ($ array as $ key => $ value ){
386
+ if (is_string ($ key ) && in_array ($ key , $ unauditedFields )){
387
+ $ array [$ key ] = "* " ;
388
+ }
389
+ if (is_array ($ value )){
390
+ $ array [$ key ] = $ this ->filterRecursive ($ unauditedFields , $ value );
391
+ }
392
+ }
393
+ return $ array ;
394
+ }
395
+
396
+ protected function removeUnauditedFields ($ fieldName , $ unauditedFields , $ data ){
397
+ if (is_string ($ fieldName ) && in_array ($ fieldName , $ unauditedFields )){
398
+ return "* " ;
399
+ }
400
+ foreach ($ unauditedFields as $ unauditedField ){
401
+ if (is_string ($ data ) && preg_match ('/\b ' .$ unauditedField .'\b/ ' , $ data )){
402
+ if ($ this ->is_json ($ data )) {
403
+ $ decoded = json_decode ($ data , true );
404
+ $ decoded = $ this ->filterRecursive ($ unauditedFields , $ decoded );
405
+ $ data = json_encode ($ decoded );
406
+ return $ data ;
407
+ } else {
408
+ return "* " ;
409
+ }
410
+ }
411
+ }
412
+ return $ data ;
413
+ }
414
+
368
415
protected function diff (EntityManager $ em , $ entity , array $ ch )
369
416
{
370
417
$ uow = $ em ->getUnitOfWork ();
371
418
$ meta = $ em ->getClassMetadata (get_class ($ entity ));
372
419
$ diff = [];
373
420
foreach ($ ch as $ fieldName => list ($ old , $ new )) {
374
421
if ($ meta ->hasField ($ fieldName ) && !array_key_exists ($ fieldName , $ meta ->embeddedClasses )) {
422
+
423
+ // Filter sensitive data
424
+ if (array_key_exists ($ meta ->getName (), $ this ->unauditedFields )) {
425
+ $ old = $ this ->removeUnauditedFields ($ fieldName , $ this ->unauditedFields [$ meta ->getName ()], $ old );
426
+ $ new = $ this ->removeUnauditedFields ($ fieldName , $ this ->unauditedFields [$ meta ->getName ()], $ new );
427
+ }
428
+
375
429
$ mapping = $ meta ->fieldMappings [$ fieldName ];
376
430
$ diff [$ fieldName ] = [
377
431
'old ' => $ this ->value ($ em , Type::getType ($ mapping ['type ' ]), $ old ),
@@ -382,11 +436,26 @@ protected function diff(EntityManager $em, $entity, array $ch)
382
436
$ mapping = $ meta ->associationMappings [$ fieldName ];
383
437
$ colName = $ meta ->getSingleAssociationJoinColumnName ($ fieldName );
384
438
$ assocMeta = $ em ->getClassMetadata ($ mapping ['targetEntity ' ]);
385
- $ diff [$ fieldName ] = [
386
- 'old ' => $ this ->assoc ($ em , $ old , true ),
387
- 'new ' => $ this ->assoc ($ em , $ new , true ),
388
- 'col ' => $ colName ,
389
- ];
439
+
440
+ // Filter sensitive data
441
+ if (array_key_exists ($ meta ->getName (), $ this ->unauditedFields )) {
442
+ $ old = $ this ->removeUnauditedFields ($ fieldName , $ this ->unauditedFields [$ meta ->getName ()], $ old );
443
+ $ new = $ this ->removeUnauditedFields ($ fieldName , $ this ->unauditedFields [$ meta ->getName ()], $ new );
444
+ }
445
+
446
+ if ($ old == "* " && $ new == "* " ){
447
+ $ diff [$ fieldName ] = [
448
+ 'old ' => $ old ,
449
+ 'new ' => $ new ,
450
+ 'col ' => $ colName ,
451
+ ];
452
+ } else {
453
+ $ diff [$ fieldName ] = [
454
+ 'old ' => $ this ->assoc ($ em , $ old , true ),
455
+ 'new ' => $ this ->assoc ($ em , $ new , true ),
456
+ 'col ' => $ colName ,
457
+ ];
458
+ }
390
459
}
391
460
}
392
461
return $ diff ;
@@ -499,4 +568,4 @@ public function getUser()
499
568
500
569
return $ user ;
501
570
}
502
- }
571
+ }
0 commit comments