@@ -103,7 +103,8 @@ isValidHex = \s -> not (s == "") && bytesToHex (bytesFromHex s) == s
103103
104104containsBadUrlChar = \s ->
105105 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"
107108 then True {}
108109 else containsBadUrlChar (drop 1 s)
109110
@@ -115,7 +116,13 @@ lookupSession = \sessions token t ->
115116 yield s)
116117
117118extractToken = \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) == " "
119126 then drop 7 authHeader
120127 else ""
121128
@@ -514,7 +521,6 @@ serve = \req -> case req of
514521 where not (tooLong e.server maxPubkeyLen)
515522 where not (containsBadUrlChar e.server)
516523 where isValidHex e.pubkey
517− where e.server == fromServer
518524 where not (e.server == serverHost)
519525 where e.timestamp <= t + clockSkewTolerance
520526 where e.timestamp + (clampTtl e.ttl) * 1000 > t
@@ -529,7 +535,6 @@ serve = \req -> case req of
529535 where not (tooLong e.server maxPubkeyLen)
530536 where not (containsBadUrlChar e.server)
531537 where isValidHex e.pubkey
532− where e.server == fromServer
533538 where not (e.server == serverHost)
534539 where e.timestamp <= t + clockSkewTolerance
535540 where t - e.timestamp < (clampTtl e.ttl) * 1000
@@ -681,7 +686,6 @@ serve = \req -> case req of
681686 where not (tooLong e.server maxPubkeyLen)
682687 where not (containsBadUrlChar e.server)
683688 where isValidHex e.pubkey
684− where e.server == fromServer
685689 where not (e.server == serverHost)
686690 where e.timestamp <= t + clockSkewTolerance
687691 where e.timestamp + (clampTtl e.ttl) * 1000 > t