module Network.OpenID.AttributeExchange (
AXFieldTy(..),
AXFieldVal,
axName, axSpec, axTyFromName,
axEmailRequired,
axExtParams,
axExtParams',
getAxFields
) where
import Prelude()
import Prelude.Compat
import Control.Monad (guard)
import Network.OpenID.Types
import Data.Maybe (listToMaybe, mapMaybe, fromMaybe)
import Data.List (intercalate, nub, isPrefixOf)
defaultAlias :: String
defaultAlias = "ax"
extNamespace, extNamespacePrefix, extMode_fetchRequest :: String
extNamespace = "http://openid.net/srv/ax/1.0"
extNamespacePrefix = "http://openid.net/srv/ax/1."
extMode_fetchRequest = "fetch_request"
data AXFieldTy
= AXBirthdate
| AXEmail
| AXFirstName
| AXFullName
| AXGender
| AXLanguage
| AXLastName
| AXNickname
deriving (Eq, Show, Ord, Read)
axName :: AXFieldTy -> String
axName AXBirthdate = "birthdate"
axName AXEmail = "email"
axName AXFirstName = "firstname"
axName AXFullName = "fullname"
axName AXGender = "gender"
axName AXLanguage = "language"
axName AXLastName = "lastname"
axName AXNickname = "friendly"
axSpec :: AXFieldTy -> String
axSpec AXBirthdate = "http://axschema.org/birthDate"
axSpec AXEmail = "http://axschema.org/contact/email"
axSpec AXFirstName = "http://axschema.org/namePerson/first"
axSpec AXFullName = "http://axschema.org/namePerson"
axSpec AXGender = "http://axschema.org/person/gender"
axSpec AXLanguage = "http://axschema.org/pref/language"
axSpec AXLastName = "http://axschema.org/namePerson/last"
axSpec AXNickname = "http://axschema.org/namePerson/friendly"
axTyFromName :: String -> Maybe AXFieldTy
axTyFromName "birthdate" = Just AXBirthdate
axTyFromName "email" = Just AXEmail
axTyFromName "firstname" = Just AXFirstName
axTyFromName "fullname" = Just AXFullName
axTyFromName "gender" = Just AXGender
axTyFromName "language" = Just AXLanguage
axTyFromName "lastname" = Just AXLastName
axTyFromName "friendly" = Just AXNickname
axTyFromName _ = Nothing
type AXFieldVal = (AXFieldTy, String)
axEmailRequired :: Params
axEmailRequired = axExtParams [AXEmail]
axExtParams :: [AXFieldTy]
-> Params
axExtParams = axExtParams' defaultAlias
axExtParams' :: String
-> [AXFieldTy]
-> Params
axExtParams' alias extsRequired =
[ ("openid.ns." ++ alias, extNamespace)
, ("openid." ++ alias ++ ".mode", extMode_fetchRequest)
, ("openid." ++ alias ++ ".required", formatRequiredVal extsRequired')
] ++ exts
where
exts = map (formatRequestField alias) extsRequired'
extsRequired' = nub extsRequired
formatRequestField :: String -> AXFieldTy -> (String, String)
formatRequestField alias field =
("openid." ++ alias ++ ".type." ++ axName field, axSpec field)
formatRequiredVal :: [AXFieldTy] -> String
formatRequiredVal =
intercalate "," . map axName
getAxFields :: Params -> [AXFieldVal]
getAxFields ps =
fromMaybe [] fieldsMb
where
fieldsMb :: Maybe [AXFieldVal]
fieldsMb = getAxFields' ps <$> aliasMb
aliasMb :: Maybe String
aliasMb = listToMaybe $ mapMaybe getAxAlias ps
getAxFields' :: Params -> String -> [AXFieldVal]
getAxFields' ps alias =
mapMaybe getAxFieldTypes' ps
where
getAxFieldTypes' :: (String, String) -> Maybe AXFieldVal
getAxFieldTypes' (n,v) = do
guard (valueAliasPrefix `isPrefixOf` n)
ty <- axTyFromName $ drop (length valueAliasPrefix) n
return (ty,v)
valueAliasPrefix = "openid." ++ alias ++ ".value."
getAxAlias :: (String, String) -> Maybe String
getAxAlias (n,v) = do
guard ("openid.ns." `isPrefixOf` n && extNamespacePrefix `isPrefixOf` v)
return (drop (length "openid.ns.") n)