@@ -74,8 +74,8 @@ public static bool TryParse(
74
74
{
75
75
"c" , new MappingHandler < DkimSignatureDataFragmentV1 >
76
76
{
77
- Map = ( dataFragment , value ) => dataFragment . MessageCanonicalization = value
78
- //TODO: Add validate logic
77
+ Map = ( dataFragment , value ) => dataFragment . MessageCanonicalization = value ,
78
+ Validate = ValidateMessageCanonicalization
79
79
}
80
80
} ,
81
81
{
@@ -122,13 +122,15 @@ public static bool TryParse(
122
122
{
123
123
"q" , new MappingHandler < DkimSignatureDataFragmentV1 >
124
124
{
125
- Map = ( dataFragment , value ) => dataFragment . QueryMethods = value
125
+ Map = ( dataFragment , value ) => dataFragment . QueryMethods = value ,
126
+ Validate = ValidateQueryMethods
126
127
}
127
128
} ,
128
129
{
129
130
"i" , new MappingHandler < DkimSignatureDataFragmentV1 >
130
131
{
131
- Map = ( dataFragment , value ) => dataFragment . AgentOrUserIdentifier = value
132
+ Map = ( dataFragment , value ) => dataFragment . AgentOrUserIdentifier = value ,
133
+ Validate = ValidateAgentOrUserIdentifier
132
134
}
133
135
}
134
136
} ;
@@ -371,6 +373,121 @@ private static ParsingResult[] ValidateBodyLengthCount(ValidateRequest validateR
371
373
return ValidatePositiveNumber ( validateRequest , CheckBodyLengthCount ) ;
372
374
}
373
375
376
+ private static ParsingResult [ ] ValidateMessageCanonicalization ( ValidateRequest validateRequest )
377
+ {
378
+ var parsingResults = new List < ParsingResult > ( ) ;
379
+
380
+ if ( string . IsNullOrEmpty ( validateRequest . Value ) )
381
+ {
382
+ parsingResults . Add ( new ParsingResult
383
+ {
384
+ Status = ParsingStatus . Error ,
385
+ Field = validateRequest . Field ,
386
+ Message = "Is empty"
387
+ } ) ;
388
+
389
+ return [ .. parsingResults ] ;
390
+ }
391
+
392
+ var allowedModes = new string [ ] { "relaxed" , "simple" } ;
393
+
394
+ var parts = validateRequest . Value . Split ( '/' ) ;
395
+ if ( parts . Length == 1 )
396
+ {
397
+ var part = parts [ 0 ] . ToLower ( ) ;
398
+
399
+ if ( allowedModes . Contains ( part ) )
400
+ {
401
+ return [ ] ;
402
+ }
403
+
404
+ parsingResults . Add ( new ParsingResult
405
+ {
406
+ Status = ParsingStatus . Error ,
407
+ Field = validateRequest . Field ,
408
+ Message = $ "Unknown mode { part } detected"
409
+ } ) ;
410
+
411
+ return [ .. parsingResults ] ;
412
+ }
413
+
414
+ if ( parts . Length == 2 )
415
+ {
416
+ if ( parts . Count ( part => allowedModes . Contains ( part . ToLower ( ) ) ) == 2 )
417
+ {
418
+ return [ ] ;
419
+ }
420
+
421
+ parsingResults . Add ( new ParsingResult
422
+ {
423
+ Status = ParsingStatus . Error ,
424
+ Field = validateRequest . Field ,
425
+ Message = "Unknown mode detected"
426
+ } ) ;
427
+
428
+ return [ .. parsingResults ] ;
429
+ }
430
+
431
+ parsingResults . Add ( new ParsingResult
432
+ {
433
+ Status = ParsingStatus . Error ,
434
+ Field = validateRequest . Field ,
435
+ Message = "Too much parts"
436
+ } ) ;
437
+
438
+ return [ .. parsingResults ] ;
439
+ }
440
+
441
+ private static ParsingResult [ ] ValidateQueryMethods ( ValidateRequest validateRequest )
442
+ {
443
+ var parsingResults = new List < ParsingResult > ( ) ;
444
+
445
+ if ( string . IsNullOrEmpty ( validateRequest . Value ) )
446
+ {
447
+ parsingResults . Add ( new ParsingResult
448
+ {
449
+ Status = ParsingStatus . Error ,
450
+ Field = validateRequest . Field ,
451
+ Message = "Is empty"
452
+ } ) ;
453
+
454
+ return [ .. parsingResults ] ;
455
+ }
456
+
457
+ if ( validateRequest . Value . Equals ( "dns/txt" , StringComparison . OrdinalIgnoreCase ) )
458
+ {
459
+ return [ ] ;
460
+ }
461
+
462
+ parsingResults . Add ( new ParsingResult
463
+ {
464
+ Status = ParsingStatus . Error ,
465
+ Field = validateRequest . Field ,
466
+ Message = "Invalid query method"
467
+ } ) ;
468
+
469
+ return [ ] ;
470
+ }
471
+
472
+ private static ParsingResult [ ] ValidateAgentOrUserIdentifier ( ValidateRequest validateRequest )
473
+ {
474
+ var parsingResults = new List < ParsingResult > ( ) ;
475
+
476
+ if ( string . IsNullOrEmpty ( validateRequest . Value ) )
477
+ {
478
+ parsingResults . Add ( new ParsingResult
479
+ {
480
+ Status = ParsingStatus . Error ,
481
+ Field = validateRequest . Field ,
482
+ Message = "Is empty"
483
+ } ) ;
484
+
485
+ return [ .. parsingResults ] ;
486
+ }
487
+
488
+ return [ ] ;
489
+ }
490
+
374
491
private static ParsingResult [ ] ValidateSignedHeaderFields ( ValidateRequest validateRequest )
375
492
{
376
493
var parsingResults = new List < ParsingResult > ( ) ;
0 commit comments