summaryrefslogtreecommitdiff
path: root/src/Network/Tox
diff options
context:
space:
mode:
authorJames Crayne <jim.crayne@gmail.com>2017-11-15 06:47:38 +0000
committerJames Crayne <jim.crayne@gmail.com>2017-11-19 23:40:14 +0000
commit2ebea62ba6e49a653bfa47760e3089799b1bb9a7 (patch)
tree526189b4c6da91aa64a8a809f474a5f7e67ac020 /src/Network/Tox
parent43219aa4da88fbf3187230af0b5ad5b2d17f177a (diff)
netCryptoSessionsByKey
Diffstat (limited to 'src/Network/Tox')
-rw-r--r--src/Network/Tox/Crypto/Handlers.hs19
1 files changed, 18 insertions, 1 deletions
diff --git a/src/Network/Tox/Crypto/Handlers.hs b/src/Network/Tox/Crypto/Handlers.hs
index b92d4805..dcc63ae0 100644
--- a/src/Network/Tox/Crypto/Handlers.hs
+++ b/src/Network/Tox/Crypto/Handlers.hs
@@ -90,6 +90,7 @@ data NetCryptoSession = NCrypto { ncState :: TVar NetCryptoSessionStatus
90 } 90 }
91 91
92data NetCryptoSessions = NCSessions { netCryptoSessions :: TVar (Map.Map SockAddr NetCryptoSession) 92data NetCryptoSessions = NCSessions { netCryptoSessions :: TVar (Map.Map SockAddr NetCryptoSession)
93 , netCryptoSessionsByKey :: TVar (Map.Map PublicKey [NetCryptoSession])
93 , transportCrypto :: TransportCrypto 94 , transportCrypto :: TransportCrypto
94 , defaultHooks :: Map.Map MessageType [NetCryptoHook] 95 , defaultHooks :: Map.Map MessageType [NetCryptoHook]
95 , defaultUnrecognizedHook :: MessageType -> NetCryptoHook 96 , defaultUnrecognizedHook :: MessageType -> NetCryptoHook
@@ -98,12 +99,21 @@ data NetCryptoSessions = NCSessions { netCryptoSessions :: TVar (Map.Map SockAdd
98 , inboundQueueCapacity :: Word32 99 , inboundQueueCapacity :: Word32
99 } 100 }
100 101
102-- | initiate a netcrypto session, blocking
103netCrypto :: TransportCrypto -> NetCryptoSessions -> SecretKey -> PublicKey -> IO NetCryptoSession
104netCrypto crypto allsessions myseckey theirpubkey = do
105 -- convert public key to NodeInfo check Roster
106 -- if no session:
107 -- 1) send dht key
108 error "todo"
109
101newSessionsState :: TransportCrypto 110newSessionsState :: TransportCrypto
102 -> (MessageType -> NetCryptoHook) -- ^ default hook 111 -> (MessageType -> NetCryptoHook) -- ^ default hook
103 -> Map.Map MessageType [NetCryptoHook] -- ^ all hooks, can be empty to start 112 -> Map.Map MessageType [NetCryptoHook] -- ^ all hooks, can be empty to start
104 -> IO NetCryptoSessions 113 -> IO NetCryptoSessions
105newSessionsState crypto unrechook hooks = do 114newSessionsState crypto unrechook hooks = do
106 x <- atomically $ newTVar Map.empty 115 x <- atomically $ newTVar Map.empty
116 x2 <- atomically $ newTVar Map.empty
107 nick <- atomically $ newTVar B.empty 117 nick <- atomically $ newTVar B.empty
108 status <- atomically $ newTVar Online 118 status <- atomically $ newTVar Online
109 statusmsg <- atomically $ newTVar B.empty 119 statusmsg <- atomically $ newTVar B.empty
@@ -115,6 +125,7 @@ newSessionsState crypto unrechook hooks = do
115 homedir <- getHomeDirectory 125 homedir <- getHomeDirectory
116 svDownloadDir0 <- atomically $ newTVar (homedir </> "Downloads") 126 svDownloadDir0 <- atomically $ newTVar (homedir </> "Downloads")
117 return NCSessions { netCryptoSessions = x 127 return NCSessions { netCryptoSessions = x
128 , netCryptoSessionsByKey = x2
118 , transportCrypto = crypto 129 , transportCrypto = crypto
119 , defaultHooks = hooks 130 , defaultHooks = hooks
120 , defaultUnrecognizedHook = unrechook 131 , defaultUnrecognizedHook = unrechook
@@ -182,6 +193,7 @@ freshCryptoSession sessions
182 }) = do 193 }) = do
183 let crypto = transportCrypto sessions 194 let crypto = transportCrypto sessions
184 allsessions = netCryptoSessions sessions 195 allsessions = netCryptoSessions sessions
196 allsessionsByKey = netCryptoSessionsByKey sessions
185 ncState0 <- atomically $ newTVar Accepted 197 ncState0 <- atomically $ newTVar Accepted
186 ncTheirBaseNonce0 <- atomically $ newTVar theirBaseNonce 198 ncTheirBaseNonce0 <- atomically $ newTVar theirBaseNonce
187 n24 <- atomically $ transportNewNonce crypto 199 n24 <- atomically $ transportNewNonce crypto
@@ -233,7 +245,12 @@ freshCryptoSession sessions
233 _ <- runCryptoHook (netCryptoSession0 {ncDequeueThread=tid}) cd 245 _ <- runCryptoHook (netCryptoSession0 {ncDequeueThread=tid}) cd
234 loop 246 loop
235 let netCryptoSession = netCryptoSession0 {ncDequeueThread=threadid} 247 let netCryptoSession = netCryptoSession0 {ncDequeueThread=threadid}
236 atomically $ modifyTVar allsessions (Map.insert addr netCryptoSession) 248 atomically $ do
249 modifyTVar allsessions (Map.insert addr netCryptoSession)
250 byKeyResult <- readTVar allsessionsByKey >>= return . Map.lookup remotePublicKey
251 case byKeyResult of
252 Nothing -> modifyTVar allsessionsByKey (Map.insert remotePublicKey [netCryptoSession])
253 Just xs -> modifyTVar allsessionsByKey (Map.insert remotePublicKey (netCryptoSession:xs))
237 254
238-- | Called when we get a handshake, but there's already a session entry. 255-- | Called when we get a handshake, but there's already a session entry.
239updateCryptoSession :: NetCryptoSessions -> SockAddr -> HandshakeParams -> NetCryptoSession -> IO () 256updateCryptoSession :: NetCryptoSessions -> SockAddr -> HandshakeParams -> NetCryptoSession -> IO ()