|
|
|
|
@ -18,8 +18,7 @@ import Network.XMPP.Stream
@@ -18,8 +18,7 @@ import Network.XMPP.Stream
|
|
|
|
|
import Network.XMPP.Types |
|
|
|
|
|
|
|
|
|
starttlsE :: Element |
|
|
|
|
starttlsE = |
|
|
|
|
Element "{urn:ietf:params:xml:ns:xmpp-tls}starttls" [] [] |
|
|
|
|
starttlsE = Element "{urn:ietf:params:xml:ns:xmpp-tls}starttls" [] [] |
|
|
|
|
|
|
|
|
|
exampleParams :: TLS.TLSParams |
|
|
|
|
exampleParams = TLS.defaultParams |
|
|
|
|
@ -40,14 +39,16 @@ data XMPPTLSError = TLSError TLSError
@@ -40,14 +39,16 @@ data XMPPTLSError = TLSError TLSError
|
|
|
|
|
| TLSNoServerSupport |
|
|
|
|
| TLSNoConnection |
|
|
|
|
| TLSStreamError StreamError |
|
|
|
|
| XMPPTLSError -- General instance used for the Error instance |
|
|
|
|
deriving (Show, Eq, Typeable) |
|
|
|
|
|
|
|
|
|
instance Error XMPPTLSError where |
|
|
|
|
noMsg = TLSNoConnection -- TODO: What should we choose here? |
|
|
|
|
noMsg = XMPPTLSError |
|
|
|
|
|
|
|
|
|
-- Pushes "<starttls/>, waits for "<proceed/>", performs the TLS handshake, and |
|
|
|
|
-- restarts the stream. May throw errors. |
|
|
|
|
startTLS :: TLS.TLSParams -> XMPPConMonad (Either XMPPTLSError ()) |
|
|
|
|
startTLS params = Ex.handle (return . Left . TLSError) |
|
|
|
|
. runErrorT $ do |
|
|
|
|
startTLS params = Ex.handle (return . Left . TLSError) . runErrorT $ do |
|
|
|
|
features <- lift $ gets sFeatures |
|
|
|
|
handle' <- lift $ gets sConHandle |
|
|
|
|
handle <- maybe (throwError TLSNoConnection) return handle' |
|
|
|
|
@ -56,11 +57,11 @@ startTLS params = Ex.handle (return . Left . TLSError)
@@ -56,11 +57,11 @@ startTLS params = Ex.handle (return . Left . TLSError)
|
|
|
|
|
answer <- lift $ pullElement |
|
|
|
|
case answer of |
|
|
|
|
Element "{urn:ietf:params:xml:ns:xmpp-tls}proceed" [] [] -> return () |
|
|
|
|
Element "{urn:ietf:params:xml:ns:xmpp-tls}failure" _ _ |
|
|
|
|
-> lift . Ex.throwIO $ StreamConnectionError |
|
|
|
|
Element "{urn:ietf:params:xml:ns:xmpp-tls}failure" _ _ -> |
|
|
|
|
lift . Ex.throwIO $ StreamConnectionError |
|
|
|
|
-- TODO: find something more suitable |
|
|
|
|
e -> lift . Ex.throwIO . StreamXMLError |
|
|
|
|
$ "Unexpected element: " ++ ppElement e |
|
|
|
|
e -> lift . Ex.throwIO . StreamXMLError $ |
|
|
|
|
"Unexpected element: " ++ ppElement e |
|
|
|
|
(raw, _snk, psh, ctx) <- lift $ TLS.tlsinit params handle |
|
|
|
|
lift $ modify ( \x -> x |
|
|
|
|
{ sRawSrc = raw |
|
|
|
|
@ -72,4 +73,3 @@ startTLS params = Ex.handle (return . Left . TLSError)
@@ -72,4 +73,3 @@ startTLS params = Ex.handle (return . Left . TLSError)
|
|
|
|
|
either (lift . Ex.throwIO) return =<< lift xmppRestartStream |
|
|
|
|
modify (\s -> s{sConnectionState = XmppConnectionSecured}) |
|
|
|
|
return () |
|
|
|
|
|
|
|
|
|
|