Skip to content

Commit e6810ec

Browse files
committed
Fix the parameters with double quotes in the Authentication header,
and the unknown parameters are saved to auth_params.
1 parent c59cc4d commit e6810ec

File tree

4 files changed

+177
-65
lines changed

4 files changed

+177
-65
lines changed

lib/src/data.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ class ParsedData {
3333
List<String> qop = <String>[];
3434
String protocol;
3535
String realm;
36-
List<String> auth_params = <String>[];
36+
Map<String, dynamic> auth_params = <String, dynamic>{};
3737
int cause;
3838
int expires;
3939
String refresher;

lib/src/grammar.peg

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -897,19 +897,20 @@ Proxy_Authenticate <- proxy_authenticate: challenge
897897
challenge <- (("Digest"i LWS digest_cln (COMMA digest_cln)*)
898898
/ other_challenge) {return data;}
899899

900-
other_challenge <- auth_scheme LWS auth_param (COMMA auth_param)*
900+
other_challenge <- auth_scheme LWS auth_param (COMMA auth_param)*
901+
{return data;}
901902

902903
auth_scheme <- token
903904

904-
auth_param <- key: auth_param_name EQUAL value: ( token / quoted_string ) {
905-
print(key + ' => ' + value);
906-
if(data.auth_params == null) data.auth_params = [];
905+
auth_param <- key: auth_param_name EQUAL value: ( token / quoted_string_clean ) {
906+
// print('other_auth_param: ' + key + ' => ' + value);
907+
if(data.auth_params == null) data.auth_params = {};
907908
data.auth_params[key] = value;
908909
}
909910

910911
auth_param_name <- token
911912

912-
digest_cln <- realm / domain / nonce / opaque / stale / algorithm / qop_options
913+
digest_cln <- realm / domain / nonce / opaque / stale / algorithm / qop_options / auth_param
913914

914915
realm <- "realm"i EQUAL realm_value
915916

@@ -931,7 +932,7 @@ stale <- "stale"i EQUAL stale: token {
931932
data.stale = stale.toLowerCase() == 'true';
932933
return stale;}
933934

934-
algorithm <- "algorithm"i EQUAL algorithm: ( "MD5"i / "MD5-sess"i / token ) {
935+
algorithm <- "algorithm"i EQUAL algorithm: ( "MD5"i / "MD5"i / "MD5-sess"i / token / quoted_string_clean) {
935936
data.algorithm=algorithm.toUpperCase(); return data.algorithm;}
936937

937938
qop_options <- "qop"i EQUAL LDQUOT (qop_value ("," qop_value)*) RDQUOT

lib/src/grammar_parser.dart

Lines changed: 159 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ class GrammarParser {
1818

1919
static final List<String> _expect100 = <String>["Digest"];
2020

21-
static final List<String> _expect101 = <String>["algorithm", "domain", "nonce", "opaque", "qop", "realm", "stale"];
21+
static final List<String> _expect101 = <String>["!", "%", "\'", "*", "+", "-", ".", "_", "`", "algorithm", "alphanum", "domain", "nonce", "opaque", "qop", "realm", "stale", "~"];
2222

2323
static final List<String> _expect102 = <String>["realm"];
2424

@@ -34,7 +34,7 @@ class GrammarParser {
3434

3535
static final List<String> _expect108 = <String>["algorithm"];
3636

37-
static final List<String> _expect109 = <String>["!", "%", "\'", "*", "+", "-", ".", "MD5", "MD5-sess", "_", "`", "alphanum", "~"];
37+
static final List<String> _expect109 = <String>["!", "%", "\'", "*", "+", "-", ".", "DQUOTE", "MD5", "MD5-sess", "_", "`", "alphanum", "~"];
3838

3939
static final List<String> _expect11 = <String>["mark"];
4040

@@ -282,7 +282,7 @@ class GrammarParser {
282282

283283
static final List<String> _expect99 = <String>["!", "%", "\'", "*", "+", "-", ".", "Digest", "_", "`", "alphanum", "~"];
284284

285-
static final List<bool> _lookahead = _unmap([0x2800001, 0x1fc0093, 0x700000, 0x51a00000, 0x7e03ff6c, 0x7f0fffff, 0x271fffff, 0x7dafffdf, 0x7effffff, 0x77fffff, 0x780ffd9e, 0x743fffff, 0xc7fffff, 0x33c, 0x8000000, 0x18000000, 0x603ff2ca, 0x70ffffff, 0x31ffffff, 0x557ffffe, 0x21ffffff, 0x63ffffff, 0xffcb28, 0x47ffffff, 0x47ffffff, 0x3fff7f9, 0x2ffffffe, 0xffffffd, 0x7ffefb3, 0x5ffffffd, 0x1ffffffa, 0x5ffeffe6, 0x1ffffffe, 0x3ffffff4, 0x3fffffcc, 0x3ffffffd, 0x7fffffe8, 0x3ffbff98, 0x7ffffff2, 0x7fffffd0, 0x7ff7ff31, 0x7fffffe5, 0x7fffffa1, 0x7f000063, 0x7e07ffff, 0x3fffffff, 0x7fffffc0, 0x7fffff81, 0x7ff80fff, 0x7ff07fff, 0x440ffff, 0x840, 0x442d00, 0x4, 0x3f01ffd0, 0x7e000000, 0x7e07ff, 0x7ffc0000, 0x7, 0x3f800, 0x200, 0x580130b0, 0x54004c2e, 0x9800011, 0xec0]);
285+
static final List<bool> _lookahead = _unmap([0x2800001, 0x1fc0093, 0x700000, 0x51a00000, 0x7e03ff6c, 0x7f0fffff, 0x271fffff, 0x7dafffdf, 0x7effffff, 0x77fffff, 0x780ffd9e, 0x743fffff, 0xc7fffff, 0x33c, 0x8000000, 0x18000000, 0x603ff2ca, 0x70ffffff, 0x31ffffff, 0x557ffffe, 0x21ffffff, 0x63ffffff, 0xffcb28, 0x47ffffff, 0x47ffffff, 0x3fff7f9, 0x2ffffffe, 0xffffffd, 0x7ffefb3, 0x5ffffffd, 0x1ffffffa, 0x5ffeffe6, 0x1ffffffe, 0x3ffffff4, 0x3fffffcc, 0x3ffffffd, 0x7fffffe8, 0x3ffbff98, 0x7ffffff2, 0x7fffffd0, 0x7ff7ff31, 0x7fffffe5, 0x7fffffa1, 0x7f000063, 0x7e07ffff, 0x3fffffff, 0x7fffffc0, 0x7fffff81, 0x7ff80fff, 0x7ff07fff, 0x440ffff, 0x840, 0x442d00, 0x4, 0x1ffd0, 0x7e000000, 0x7e03ff, 0x7ffc0000, 0xfc0f, 0x3f800, 0x200, 0x580130b0, 0x54004c2e, 0x800011]);
286286

287287
static final List<bool> _mapping0 = _unmap([0x3ffffff, 0x7fffffe]);
288288

@@ -604,11 +604,11 @@ class GrammarParser {
604604

605605
static final List<List<int>> _transitions7 = [[9, 9, 13, 13, 32, 32]];
606606

607-
static final List<List<int>> _transitions70 = [[97, 97], [100, 100], [110, 110], [111, 111], [113, 113], [114, 114], [115, 115]];
607+
static final List<List<int>> _transitions70 = [[33, 33, 37, 37, 39, 39, 42, 43, 45, 46, 48, 57, 65, 90, 95, 96, 98, 99, 101, 109, 112, 112, 116, 122, 126, 126], [97, 97], [100, 100], [110, 110], [111, 111], [113, 113], [114, 114], [115, 115]];
608608

609609
static final List<List<int>> _transitions71 = [[47, 47], [65, 90, 97, 122]];
610610

611-
static final List<List<int>> _transitions72 = [[33, 33, 37, 37, 39, 39, 42, 43, 45, 46, 48, 57, 65, 76, 78, 90, 95, 122, 126, 126], [77, 109]];
611+
static final List<List<int>> _transitions72 = [[0, 32, 34, 36, 38, 38, 40, 41, 44, 44, 47, 47, 58, 64, 91, 94, 123, 125, 127, 1114111], [33, 33, 37, 37, 39, 39, 42, 43, 45, 46, 48, 57, 65, 76, 78, 90, 95, 122, 126, 126], [77, 109]];
612612

613613
static final List<List<int>> _transitions73 = [[33, 33, 37, 37, 39, 39, 42, 43, 45, 46, 48, 57, 65, 90, 95, 96, 98, 122, 126, 126], [65, 97]];
614614

@@ -6298,31 +6298,55 @@ class GrammarParser {
62986298
seq[1] = $$;
62996299
switch (_getState(_transitions72)) {
63006300
case 0:
6301+
case 4:
63016302
var startPos1 = _startPos;
63026303
_startPos = _cursor;
6303-
$$ = _parse_token();
6304+
$$ = _parse_quoted_string_clean();
63046305
_startPos = startPos1;
63056306
break;
63066307
case 1:
63076308
while (true) {
63086309
var startPos2 = _startPos;
63096310
_startPos = _cursor;
6310-
$$ = _matchString(_strings52, 'MD5', true);
6311+
$$ = _parse_token();
63116312
_startPos = startPos2;
63126313
if (success) break;
63136314
var startPos3 = _startPos;
63146315
_startPos = _cursor;
6315-
$$ = _matchString(_strings53, 'MD5-sess', true);
6316+
$$ = _parse_quoted_string_clean();
63166317
_startPos = startPos3;
6317-
if (success) break;
6318+
break;
6319+
}
6320+
break;
6321+
case 2:
6322+
while (true) {
63186323
var startPos4 = _startPos;
63196324
_startPos = _cursor;
6320-
$$ = _parse_token();
6325+
$$ = _matchString(_strings52, 'MD5', true);
63216326
_startPos = startPos4;
6327+
if (success) break;
6328+
var startPos5 = _startPos;
6329+
_startPos = _cursor;
6330+
$$ = _matchString(_strings52, 'MD5', true);
6331+
_startPos = startPos5;
6332+
if (success) break;
6333+
var startPos6 = _startPos;
6334+
_startPos = _cursor;
6335+
$$ = _matchString(_strings53, 'MD5-sess', true);
6336+
_startPos = startPos6;
6337+
if (success) break;
6338+
var startPos7 = _startPos;
6339+
_startPos = _cursor;
6340+
$$ = _parse_token();
6341+
_startPos = startPos7;
6342+
if (success) break;
6343+
var startPos8 = _startPos;
6344+
_startPos = _cursor;
6345+
$$ = _parse_quoted_string_clean();
6346+
_startPos = startPos8;
63226347
break;
63236348
}
63246349
break;
6325-
case 2:
63266350
case 3:
63276351
$$ = null;
63286352
success = false;
@@ -6430,7 +6454,7 @@ class GrammarParser {
64306454
case 3:
64316455
var startPos1 = _startPos;
64326456
_startPos = _cursor;
6433-
$$ = _parse_quoted_string();
6457+
$$ = _parse_quoted_string_clean();
64346458
_startPos = startPos1;
64356459
break;
64366460
case 1:
@@ -6442,7 +6466,7 @@ class GrammarParser {
64426466
if (success) break;
64436467
var startPos3 = _startPos;
64446468
_startPos = _cursor;
6445-
$$ = _parse_quoted_string();
6469+
$$ = _parse_quoted_string_clean();
64466470
_startPos = startPos3;
64476471
break;
64486472
}
@@ -6466,8 +6490,8 @@ class GrammarParser {
64666490
var pos0 = _startPos;
64676491
$$ = ((offset, key, value) {
64686492
///CODE_START
6469-
print(key + ' => ' + value);
6470-
if(data.auth_params == null) data.auth_params = [];
6493+
// print('other_auth_param: ' + key + ' => ' + value);
6494+
if(data.auth_params == null) data.auth_params = {};
64716495
data.auth_params[key] = value;
64726496
///CODE_END
64736497
})($start, $1, $3);
@@ -7504,85 +7528,152 @@ class GrammarParser {
75047528
case 0:
75057529
var startPos0 = _startPos;
75067530
_startPos = _cursor;
7507-
$$ = _parse_algorithm();
7531+
$$ = _parse_auth_param();
75087532
_startPos = startPos0;
75097533
break;
75107534
case 1:
7511-
var startPos1 = _startPos;
7512-
_startPos = _cursor;
7513-
$$ = _parse_domain();
7514-
_startPos = startPos1;
7535+
while (true) {
7536+
var startPos1 = _startPos;
7537+
_startPos = _cursor;
7538+
$$ = _parse_algorithm();
7539+
_startPos = startPos1;
7540+
if (success) break;
7541+
var startPos2 = _startPos;
7542+
_startPos = _cursor;
7543+
$$ = _parse_auth_param();
7544+
_startPos = startPos2;
7545+
break;
7546+
}
75157547
break;
75167548
case 2:
7517-
var startPos2 = _startPos;
7518-
_startPos = _cursor;
7519-
$$ = _parse_nonce();
7520-
_startPos = startPos2;
7549+
while (true) {
7550+
var startPos3 = _startPos;
7551+
_startPos = _cursor;
7552+
$$ = _parse_domain();
7553+
_startPos = startPos3;
7554+
if (success) break;
7555+
var startPos4 = _startPos;
7556+
_startPos = _cursor;
7557+
$$ = _parse_auth_param();
7558+
_startPos = startPos4;
7559+
break;
7560+
}
75217561
break;
75227562
case 3:
7523-
var startPos3 = _startPos;
7524-
_startPos = _cursor;
7525-
$$ = _parse_opaque();
7526-
_startPos = startPos3;
7563+
while (true) {
7564+
var startPos5 = _startPos;
7565+
_startPos = _cursor;
7566+
$$ = _parse_nonce();
7567+
_startPos = startPos5;
7568+
if (success) break;
7569+
var startPos6 = _startPos;
7570+
_startPos = _cursor;
7571+
$$ = _parse_auth_param();
7572+
_startPos = startPos6;
7573+
break;
7574+
}
75277575
break;
75287576
case 4:
7529-
var startPos4 = _startPos;
7530-
_startPos = _cursor;
7531-
$$ = _parse_qop_options();
7532-
_startPos = startPos4;
7577+
while (true) {
7578+
var startPos7 = _startPos;
7579+
_startPos = _cursor;
7580+
$$ = _parse_opaque();
7581+
_startPos = startPos7;
7582+
if (success) break;
7583+
var startPos8 = _startPos;
7584+
_startPos = _cursor;
7585+
$$ = _parse_auth_param();
7586+
_startPos = startPos8;
7587+
break;
7588+
}
75337589
break;
75347590
case 5:
7535-
var startPos5 = _startPos;
7536-
_startPos = _cursor;
7537-
$$ = _parse_realm();
7538-
_startPos = startPos5;
7591+
while (true) {
7592+
var startPos9 = _startPos;
7593+
_startPos = _cursor;
7594+
$$ = _parse_qop_options();
7595+
_startPos = startPos9;
7596+
if (success) break;
7597+
var startPos10 = _startPos;
7598+
_startPos = _cursor;
7599+
$$ = _parse_auth_param();
7600+
_startPos = startPos10;
7601+
break;
7602+
}
75397603
break;
75407604
case 6:
7541-
var startPos6 = _startPos;
7542-
_startPos = _cursor;
7543-
$$ = _parse_stale();
7544-
_startPos = startPos6;
7605+
while (true) {
7606+
var startPos11 = _startPos;
7607+
_startPos = _cursor;
7608+
$$ = _parse_realm();
7609+
_startPos = startPos11;
7610+
if (success) break;
7611+
var startPos12 = _startPos;
7612+
_startPos = _cursor;
7613+
$$ = _parse_auth_param();
7614+
_startPos = startPos12;
7615+
break;
7616+
}
75457617
break;
75467618
case 7:
7619+
while (true) {
7620+
var startPos13 = _startPos;
7621+
_startPos = _cursor;
7622+
$$ = _parse_stale();
7623+
_startPos = startPos13;
7624+
if (success) break;
7625+
var startPos14 = _startPos;
7626+
_startPos = _cursor;
7627+
$$ = _parse_auth_param();
7628+
_startPos = startPos14;
7629+
break;
7630+
}
7631+
break;
7632+
case 8:
75477633
$$ = null;
75487634
success = false;
75497635
break;
7550-
case 8:
7636+
case 9:
75517637
while (true) {
7552-
var startPos7 = _startPos;
7638+
var startPos15 = _startPos;
75537639
_startPos = _cursor;
75547640
$$ = _parse_realm();
7555-
_startPos = startPos7;
7641+
_startPos = startPos15;
75567642
if (success) break;
7557-
var startPos8 = _startPos;
7643+
var startPos16 = _startPos;
75587644
_startPos = _cursor;
75597645
$$ = _parse_domain();
7560-
_startPos = startPos8;
7646+
_startPos = startPos16;
75617647
if (success) break;
7562-
var startPos9 = _startPos;
7648+
var startPos17 = _startPos;
75637649
_startPos = _cursor;
75647650
$$ = _parse_nonce();
7565-
_startPos = startPos9;
7651+
_startPos = startPos17;
75667652
if (success) break;
7567-
var startPos10 = _startPos;
7653+
var startPos18 = _startPos;
75687654
_startPos = _cursor;
75697655
$$ = _parse_opaque();
7570-
_startPos = startPos10;
7656+
_startPos = startPos18;
75717657
if (success) break;
7572-
var startPos11 = _startPos;
7658+
var startPos19 = _startPos;
75737659
_startPos = _cursor;
75747660
$$ = _parse_stale();
7575-
_startPos = startPos11;
7661+
_startPos = startPos19;
75767662
if (success) break;
7577-
var startPos12 = _startPos;
7663+
var startPos20 = _startPos;
75787664
_startPos = _cursor;
75797665
$$ = _parse_algorithm();
7580-
_startPos = startPos12;
7666+
_startPos = startPos20;
75817667
if (success) break;
7582-
var startPos13 = _startPos;
7668+
var startPos21 = _startPos;
75837669
_startPos = _cursor;
75847670
$$ = _parse_qop_options();
7585-
_startPos = startPos13;
7671+
_startPos = startPos21;
7672+
if (success) break;
7673+
var startPos22 = _startPos;
7674+
_startPos = _cursor;
7675+
$$ = _parse_auth_param();
7676+
_startPos = startPos22;
75867677
break;
75877678
}
75887679
break;
@@ -11131,6 +11222,19 @@ class GrammarParser {
1113111222
if (!success) break;
1113211223
seq[3] = $$;
1113311224
$$ = seq;
11225+
if (success) {
11226+
final $1 = seq[0];
11227+
final $2 = seq[1];
11228+
final $3 = seq[2];
11229+
final $4 = seq[3];
11230+
final $start = startPos0;
11231+
var pos0 = _startPos, offset = $start;
11232+
$$ = ((offset) {
11233+
///CODE_START
11234+
return data;
11235+
///CODE_END
11236+
})($start);
11237+
}
1113411238
break;
1113511239
}
1113611240
if (!success) {

0 commit comments

Comments
 (0)