module Network.HTTP.Lucu.Authorization
( AuthChallenge(..)
, AuthCredential(..)
, Realm
, UserID
, Password
, authCredentialP
)
where
import qualified Data.ByteString.Base64 as B64
import qualified Data.ByteString.Char8 as C8
import Network.HTTP.Lucu.Parser
import Network.HTTP.Lucu.Parser.Http
import Network.HTTP.Lucu.Utils
import Prelude.Unicode
data AuthChallenge
= BasicAuthChallenge Realm
deriving (Eq)
type Realm = String
data AuthCredential
= BasicAuthCredential UserID Password
deriving (Show, Eq)
type UserID = String
type Password = String
instance Show AuthChallenge where
show (BasicAuthChallenge realm)
= "Basic realm=" ⧺ quoteStr realm
authCredentialP ∷ Parser AuthCredential
authCredentialP
= allowEOF $!
do _ ← string "Basic"
_ ← many1 lws
b64 ← many1
$ satisfy (\c → (c ≥ 'a' ∧ c ≤ 'z') ∨
(c ≥ 'A' ∧ c ≤ 'Z') ∨
(c ≥ '0' ∧ c ≤ '9') ∨
c ≡ '+' ∨
c ≡ '/' ∨
c ≡ '=')
case break (≡ ':') (decode b64) of
(uid, ':' : password)
→ return (BasicAuthCredential uid password)
_ → failP
where
decode ∷ String → String
decode = C8.unpack ∘ B64.decodeLenient ∘ C8.pack