{-# 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