module Network.Protocol.OAuth.Consumer (Token(),Consumer(..),request,response,oauth_token,oauth_token_secret,oauth_extra) where
import Network.Protocol.OAuth.Request as R
import qualified Data.ByteString.Lazy as B
import qualified Network.Protocol.OAuth.Signature as S
import qualified Data.List as L
data Token = Token { oauth_token :: String,
oauth_token_secret :: String,
oauth_extra :: [R.Parameter]
}
deriving (Show,Read,Eq)
data Consumer =
Unauthenticated String String
| Authenticated String String Token
deriving (Show,Read,Eq)
request :: (S.Signer s,Show s) => Consumer -> s -> R.Request -> R.Request
request (Unauthenticated ckey csec) s r = _oauth ckey csec Nothing s r
request (Authenticated ckey csec tk) s r = let req = r >>+ ("oauth_token", (Just . oauth_token) tk)
in _oauth ckey csec ((Just . oauth_token_secret) tk) s req
response :: Consumer -> B.ByteString -> Maybe Consumer
response cons u = let postdata = R.read_urlencoded u
otken0 = lookup "oauth_token" postdata
otkensec0 = lookup "oauth_token_secret" postdata
otkextra0 = Just $ filter (\(k,_) -> k/="oauth_token"&&k/="oauth_token_secret") postdata
in otken0 >>= \otken1 ->
otken1 >>= \otken ->
otkensec0 >>= \otkensec1 ->
otkensec1 >>= \otkensec ->
otkextra0 >>= \otkextra ->
case cons
of (Unauthenticated ckey csec) -> Just $ Authenticated ckey csec (Token otken otkensec otkextra)
(Authenticated ckey csec _) -> Just $ Authenticated ckey csec (Token otken otkensec otkextra)
_oauth :: (S.Signer s,Show s) => String -> String -> Maybe String -> s -> R.Request -> R.Request
_oauth ckey csec tsec met req = req >>+ ("oauth_consumer_key",Just ckey)
>>+ ("oauth_version",Just "1.0")
>>+ ("oauth_signature_method",(Just . show) met)
>>| _sign csec tsec met
_sign :: (S.Signer s,Show s) => String -> Maybe String -> s -> R.Request -> R.Request
_sign csec tsec met req = let sig = S.sign met csec tsec req
in req >>+ ("oauth_signature",Just sig)