summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Cady <d@jerkface.net>2016-01-20 14:14:54 -0500
committerAndrew Cady <d@jerkface.net>2016-01-20 14:14:54 -0500
commitc1dc81d18cc381d0b09147d0dbb778bbfd86f4da (patch)
treea08c6568f12a5913e9c39826f4d9a9722ac077d5
parenta00019a64306bcbc1597b016f72eaafda72e0f4b (diff)
Use a Wreq session.
Configure Wreq not to throw exceptions for non-200 status codes.
-rw-r--r--acme.hs27
1 files changed, 17 insertions, 10 deletions
diff --git a/acme.hs b/acme.hs
index 95a1bfb..49b8699 100644
--- a/acme.hs
+++ b/acme.hs
@@ -24,8 +24,8 @@ import Data.Digest.Pure.SHA (bytestringDigest, sha256)
24import Data.Maybe 24import Data.Maybe
25import qualified Data.Text as T 25import qualified Data.Text as T
26import Data.Text.Encoding (decodeUtf8) 26import Data.Text.Encoding (decodeUtf8)
27import Network.Wreq hiding (header, get, post, put) 27import Network.Wreq (Response, responseHeader, responseBody, defaults, checkStatus)
28import qualified Network.Wreq as W 28import qualified Network.Wreq.Session as WS
29import OpenSSL 29import OpenSSL
30import OpenSSL.EVP.Digest 30import OpenSSL.EVP.Digest
31import OpenSSL.EVP.PKey 31import OpenSSL.EVP.PKey
@@ -107,13 +107,13 @@ go (CmdOpts privKeyFile domain email termOverride) = do
107 107
108 return () 108 return ()
109 109
110data Env = Env { getDir :: Directory, getKeys :: Keys } 110data Env = Env { getDir :: Directory, getKeys :: Keys, getSession :: WS.Session }
111 111
112type ACME a = RWST Env () Nonce IO a 112type ACME a = RWST Env () Nonce IO a
113runACME :: String -> Keys -> ACME a -> IO a 113runACME :: String -> Keys -> ACME a -> IO a
114runACME url keys f = do 114runACME url keys f = WS.withSession $ \sess -> do
115 Just (dir, nonce) <- getDirectory url 115 Just (dir, nonce) <- getDirectory sess url
116 fst <$> evalRWST f (Env dir keys) nonce 116 fst <$> evalRWST f (Env dir keys sess) nonce
117 117
118data Directory = Directory { 118data Directory = Directory {
119 _newCert :: String, 119 _newCert :: String,
@@ -125,9 +125,9 @@ newtype Nonce = Nonce String
125testRegister :: String -> IO (Response LC.ByteString) 125testRegister :: String -> IO (Response LC.ByteString)
126testRegister email = readKeys "rsa.key" >>= flip (runACME directoryUrl) (register email defaultTerms) 126testRegister email = readKeys "rsa.key" >>= flip (runACME directoryUrl) (register email defaultTerms)
127 127
128getDirectory :: String -> IO (Maybe (Directory, Nonce)) 128getDirectory :: WS.Session -> String -> IO (Maybe (Directory, Nonce))
129getDirectory url = do 129getDirectory sess url = do
130 r <- W.get url 130 r <- WS.get sess url
131 let nonce = r ^? responseHeader "Replay-Nonce" . to (Nonce . T.unpack . decodeUtf8) 131 let nonce = r ^? responseHeader "Replay-Nonce" . to (Nonce . T.unpack . decodeUtf8)
132 k x = r ^? responseBody . JSON.key x . _String . to T.unpack 132 k x = r ^? responseBody . JSON.key x . _String . to T.unpack
133 return $ (,) <$> (Directory <$> k "new-cert" <*> k "new-authz" <*> k "revoke-cert" <*> k "new-reg") <*> nonce 133 return $ (,) <$> (Directory <$> k "new-cert" <*> k "new-authz" <*> k "revoke-cert" <*> k "new-reg") <*> nonce
@@ -141,10 +141,17 @@ sendPayload reqType payload = do
141 dir <- asks getDir 141 dir <- asks getDir
142 nonce <- gets coerce 142 nonce <- gets coerce
143 signed <- liftIO $ signPayload keys nonce payload 143 signed <- liftIO $ signPayload keys nonce payload
144 post (reqType dir) signed
144 145
145 r <- liftIO $ W.post (reqType dir) signed 146-- post :: (MonadReader Env m, MonadState Nonce m, MonadIO m, Postable a) => String -> a -> m (Response LC.ByteString)
147post url payload = do
148 sess <- asks getSession
149 r <- liftIO $ WS.postWith noStatusCheck sess url payload
146 put $ r ^?! responseHeader "Replay-Nonce" . to (Nonce . T.unpack . decodeUtf8) 150 put $ r ^?! responseHeader "Replay-Nonce" . to (Nonce . T.unpack . decodeUtf8)
147 return r 151 return r
152 where
153 noStatusCheck = defaults & checkStatus .~ Just nullChecker
154 nullChecker _ _ _ = Nothing
148 155
149-------------------------------------------------------------------------------- 156--------------------------------------------------------------------------------
150-- | Sign return a payload with a nonce-protected header. 157-- | Sign return a payload with a nonce-protected header.