{-# LANGUAGE OverloadedStrings #-} module XTLS (start) where import Network.XMPP import Control.Concurrent (forkIO) import Control.Concurrent.Chan (Chan, newChan, readChan, writeChan) import Data.XML.Types import Network.XMPP.Stanza import Control.Monad ((>=>)) import Data.Maybe data State = State {} start :: IO () start = putStrLn "Test" stateLoop :: State -> Chan XMPPInEvent -> Chan XMPPOutEvent -> IO () stateLoop s c c_ = do e <- readChan c s' <- processEvent e s c_ stateLoop s' c c_ processEvent :: XMPPInEvent -> State -> Chan XMPPOutEvent -> IO State -- processEvent (PATTERN_MATCHING) s c = do -- return s processEvent (XIEIQ iq) s c = do -- putStrLn case xtlsOrJingle iq of 'j' -> return s 'x' -> return s 'n' -> return s xtlsOrJingle :: IQ -> Char xtlsOrJingle iq = case iqPayloadNamespace iq of Just "urn:xmpp:jingle:1" -> case isXTLS $ head $ getContent (fromJust $ iqPayload iq) of [] -> 'j' other -> 'x' other -> 'n' where isXTLS :: Element -> [Element] isXTLS = elementChildren >=> isNamed xtlsName getContent :: Element -> [Element] getContent = elementChildren >=> isNamed "content" xtlsName :: Name xtlsName = ( "{urn:xmpp:jingle:security:xtls:0}security" :: Name ) -- Jingle Event base on the XEP-166 data JingleEvent = ContentAccept | ContentAdd | ContentModify | ContentReject | ContentRemove | DiscriptionInfo | TransportAccept | TransportInfo | TransportReject | TransportReplace data JingleSession = Initiated { sid :: String , candidate :: [Candidate] } | Accepted { sid :: String , candidate :: [Candidate] } | Media { sid :: String } | Terminated { sid :: String } data Candidate = Candidate { id :: Int , ip :: String , portNum :: Int , priority :: Int } data Transport = IBB { transid :: String , blockSize :: Int} | OBB { transid :: String } -- TODO : define the OBB data XTLSSecurity = XTLSSecurity { fingerPrint :: String , methods :: [MethodName]} data MethodName = SRP | X509