packages feed

pontarius-xmpp-0.0.3.0: XTLS.hs

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