77use Tempest \Http \IsResponse ;
88use Tempest \Http \Request ;
99use Tempest \Http \Response ;
10+ use Tempest \Http \Sensitive ;
1011use Tempest \Http \Session \Session ;
1112use Tempest \Http \Status ;
13+ use Tempest \Reflection \ClassReflector ;
1214use Tempest \Support \Json ;
1315use Tempest \Validation \Rule ;
1416use Tempest \Validation \Validator ;
@@ -24,10 +26,14 @@ final class Invalid implements Response
2426 get => get (Validator::class);
2527 }
2628
29+ /**
30+ * @param class-string|null $targetClass
31+ */
2732 public function __construct (
2833 Request $ request ,
2934 /** @var \Tempest\Validation\Rule[][] $failingRules */
3035 array $ failingRules = [],
36+ ?string $ targetClass = null ,
3137 ) {
3238 if ($ referer = $ request ->headers ['referer ' ] ?? null ) {
3339 $ this ->addHeader ('Location ' , $ referer );
@@ -37,7 +43,7 @@ public function __construct(
3743 }
3844
3945 $ this ->flash (Session::VALIDATION_ERRORS , $ failingRules );
40- $ this ->flash (Session::ORIGINAL_VALUES , $ request -> body );
46+ $ this ->flash (Session::ORIGINAL_VALUES , $ this -> filterSensitiveFields ( $ request , $ targetClass ) );
4147 $ this ->addHeader (
4248 'x-validation ' ,
4349 Json \encode (
@@ -49,4 +55,26 @@ public function __construct(
4955 ),
5056 );
5157 }
58+
59+ /**
60+ * @param class-string|null $targetClass
61+ */
62+ private function filterSensitiveFields (Request $ request , ?string $ targetClass ): array
63+ {
64+ $ body = $ request ->body ;
65+
66+ if ($ targetClass === null ) {
67+ return $ body ;
68+ }
69+
70+ $ reflector = new ClassReflector ($ targetClass );
71+
72+ foreach ($ reflector ->getPublicProperties () as $ property ) {
73+ if ($ property ->hasAttribute (Sensitive::class)) {
74+ unset($ body [$ property ->getName ()]);
75+ }
76+ }
77+
78+ return $ body ;
79+ }
5280}
0 commit comments