@@ -103,7 +103,8 @@ isValidHex = \s -> not (s == "") && bytesToHex (bytesFromHex s) == s
104containsBadUrlChar = \s ->
104containsBadUrlChar = \s ->
105 if s == "" then False {}
105 if s == "" then False {}
106− else if take 1 s == "/" || take 1 s == "?" || take 1 s == "#" || take 1 s == " " || take 1 s == "@"
106+ else if take 1 s == "/" || take 1 s == "?" || take 1 s == "#" || take 1 s == " " || take 1 s == "@" || take 1 s == "%"
107+ || take 1 (bytesToHex (textToBytes (take 1 s))) == "0" || take 1 (bytesToHex (textToBytes (take 1 s))) == "1" || bytesToHex (textToBytes (take 1 s)) == "7f"
107 then True {}
108 then True {}
108 else containsBadUrlChar (drop 1 s)
109 else containsBadUrlChar (drop 1 s)
@@ -115,7 +116,13 @@ lookupSession = \sessions token t ->
117extractToken = \authHeader ->
118extractToken = \authHeader ->
118− if take 7 authHeader == "Bearer " || take 7 authHeader == "bearer "
119+ if (take 1 authHeader == "B" || take 1 authHeader == "b")
120+ && (take 1 (drop 1 authHeader) == "e" || take 1 (drop 1 authHeader) == "E")
121+ && (take 1 (drop 2 authHeader) == "a" || take 1 (drop 2 authHeader) == "A")
122+ && (take 1 (drop 3 authHeader) == "r" || take 1 (drop 3 authHeader) == "R")
123+ && (take 1 (drop 4 authHeader) == "e" || take 1 (drop 4 authHeader) == "E")
124+ && (take 1 (drop 5 authHeader) == "r" || take 1 (drop 5 authHeader) == "R")
125+ && take 1 (drop 6 authHeader) == " "
119 then drop 7 authHeader
126 then drop 7 authHeader
@@ -514,7 +521,6 @@ serve = \req -> case req of
514 where not (tooLong e.server maxPubkeyLen)
521 where not (tooLong e.server maxPubkeyLen)
515 where not (containsBadUrlChar e.server)
522 where not (containsBadUrlChar e.server)
516 where isValidHex e.pubkey
523 where isValidHex e.pubkey
517− where e.server == fromServer
518 where not (e.server == serverHost)
524 where not (e.server == serverHost)
519 where e.timestamp <= t + clockSkewTolerance
525 where e.timestamp <= t + clockSkewTolerance
520 where e.timestamp + (clampTtl e.ttl) * 1000 > t
526 where e.timestamp + (clampTtl e.ttl) * 1000 > t
@@ -529,7 +535,6 @@ serve = \req -> case req of
529 where not (tooLong e.server maxPubkeyLen)
535 where not (tooLong e.server maxPubkeyLen)
530 where not (containsBadUrlChar e.server)
536 where not (containsBadUrlChar e.server)
531 where isValidHex e.pubkey
537 where isValidHex e.pubkey
532− where e.server == fromServer
533 where not (e.server == serverHost)
538 where not (e.server == serverHost)
534 where e.timestamp <= t + clockSkewTolerance
539 where e.timestamp <= t + clockSkewTolerance
535 where t - e.timestamp < (clampTtl e.ttl) * 1000
540 where t - e.timestamp < (clampTtl e.ttl) * 1000
@@ -681,7 +686,6 @@ serve = \req -> case req of
681 where not (tooLong e.server maxPubkeyLen)
686 where not (tooLong e.server maxPubkeyLen)
682 where not (containsBadUrlChar e.server)
687 where not (containsBadUrlChar e.server)
683 where isValidHex e.pubkey
688 where isValidHex e.pubkey
684− where e.server == fromServer
685 where not (e.server == serverHost)
689 where not (e.server == serverHost)
686 where e.timestamp <= t + clockSkewTolerance
690 where e.timestamp <= t + clockSkewTolerance
687 where e.timestamp + (clampTtl e.ttl) * 1000 > t
691 where e.timestamp + (clampTtl e.ttl) * 1000 > t