summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoman Smrž <roman.smrz@seznam.cz>2025-07-28 16:48:15 +0200
committerRoman Smrž <roman.smrz@seznam.cz>2025-07-28 21:40:34 +0200
commit8bcaaf5524504f01bd5643d74848cec625370aa9 (patch)
tree9a5e0e8a3564d1559851460f408903b87c32292a
parentae235831a83eb80910ad58f9a324a688ce5e2e47 (diff)
Peer address input in ServiceHandler
-rw-r--r--main/Main.hs17
-rw-r--r--main/Test.hs4
-rw-r--r--src/Erebos/Discovery.hs14
-rw-r--r--src/Erebos/Network.hs1
-rw-r--r--src/Erebos/Network.hs-boot1
-rw-r--r--src/Erebos/Service.hs1
6 files changed, 21 insertions, 17 deletions
diff --git a/main/Main.hs b/main/Main.hs
index e2e585a..6a6c565 100644
--- a/main/Main.hs
+++ b/main/Main.hs
@@ -172,17 +172,16 @@ options =
return sopt { soptService = service }
return opts { optServices = services' }
- provideTunnelFun :: Maybe String -> Writer [ String ] (Peer -> Bool)
- provideTunnelFun Nothing = return $ const True
- provideTunnelFun (Just "all") = return $ const True
- provideTunnelFun (Just "none") = return $ const False
- provideTunnelFun (Just "websocket") = return $ \peer ->
- case peerAddress peer of
- CustomPeerAddress addr | Just WebSocketAddress {} <- cast addr -> True
- _ -> False
+ provideTunnelFun :: Maybe String -> Writer [ String ] (Peer -> PeerAddress -> Bool)
+ provideTunnelFun Nothing = return $ \_ _ -> True
+ provideTunnelFun (Just "all") = return $ \_ _ -> True
+ provideTunnelFun (Just "none") = return $ \_ _ -> False
+ provideTunnelFun (Just "websocket") = return $ \_ -> \case
+ CustomPeerAddress addr | Just WebSocketAddress {} <- cast addr -> True
+ _ -> False
provideTunnelFun (Just name) = do
tell [ "Invalid value of --discovery-tunnel: ‘" <> name <> "’\n" ]
- return $ const False
+ return $ \_ _ -> False
servicesOptions :: [ OptDescr (Options -> Writer [ String ] Options) ]
servicesOptions = concatMap helper $ "all" : map soptName availableServices
diff --git a/main/Test.hs b/main/Test.hs
index b1c8f01..093d3ac 100644
--- a/main/Test.hs
+++ b/main/Test.hs
@@ -229,7 +229,7 @@ directMessageAttributes out = DirectMessageAttributes
discoveryAttributes :: DiscoveryAttributes
discoveryAttributes = (defaultServiceAttributes Proxy)
- { discoveryProvideTunnel = const False
+ { discoveryProvideTunnel = \_ _ -> False
}
dmReceivedWatcher :: Output -> Stored DirectMessage -> IO ()
@@ -524,7 +524,7 @@ cmdStartServer = do
( "chatroom", _ ) -> return $ someService @ChatroomService Proxy
( "contact", _ ) -> return $ someServiceAttr $ pairingAttributes (Proxy @ContactService) out rsPeers "contact"
( "discovery", params ) -> return $ someServiceAttr $ discoveryAttributes
- { discoveryProvideTunnel = const $ "tunnel" `elem` params
+ { discoveryProvideTunnel = \_ _ -> "tunnel" `elem` params
}
( "dm", _ ) -> return $ someServiceAttr $ directMessageAttributes out
( "sync", _ ) -> return $ someService @SyncService Proxy
diff --git a/src/Erebos/Discovery.hs b/src/Erebos/Discovery.hs
index 3c15f94..ff07964 100644
--- a/src/Erebos/Discovery.hs
+++ b/src/Erebos/Discovery.hs
@@ -66,7 +66,7 @@ data DiscoveryAttributes = DiscoveryAttributes
, discoveryStunServer :: Maybe Text
, discoveryTurnPort :: Maybe Word16
, discoveryTurnServer :: Maybe Text
- , discoveryProvideTunnel :: Peer -> Bool
+ , discoveryProvideTunnel :: Peer -> PeerAddress -> Bool
}
defaultDiscoveryAttributes :: DiscoveryAttributes
@@ -75,7 +75,7 @@ defaultDiscoveryAttributes = DiscoveryAttributes
, discoveryStunServer = Nothing
, discoveryTurnPort = Nothing
, discoveryTurnServer = Nothing
- , discoveryProvideTunnel = const False
+ , discoveryProvideTunnel = \_ _ -> False
}
data DiscoveryConnection = DiscoveryConnection
@@ -276,7 +276,7 @@ instance Service DiscoveryService where
(discoveryTurnPort attrs)
DiscoveryAcknowledged _ stunServer stunPort turnServer turnPort -> do
- paddr <- asks (peerAddress . svcPeer) >>= return . \case
+ paddr <- asks svcPeerAddress >>= return . \case
(DatagramAddress saddr) -> T.pack . show . fst <$> inetFromSockAddr saddr
_ -> Nothing
@@ -293,10 +293,11 @@ instance Service DiscoveryService where
DiscoverySearch edgst -> do
dpeer <- M.lookup (either refDigest id edgst) . dgsPeers <$> svcGetGlobal
peer <- asks svcPeer
+ paddr <- asks svcPeerAddress
attrs <- asks svcAttributes
let offerTunnel
- | discoveryProvideTunnel attrs peer = (++ [ DiscoveryTunnel ])
- | otherwise = id
+ | discoveryProvideTunnel attrs peer paddr = (++ [ DiscoveryTunnel ])
+ | otherwise = id
replyPacket $ DiscoveryResult edgst $ maybe [] (offerTunnel . dpAddress) dpeer
DiscoveryResult _ [] -> do
@@ -409,6 +410,7 @@ instance Service DiscoveryService where
else do
-- request to some of our peers, relay
peer <- asks svcPeer
+ paddr <- asks svcPeerAddress
mbdp <- M.lookup (either refDigest id $ dconnTarget conn) . dgsPeers <$> svcGetGlobal
streams <- receivedStreams
case mbdp of
@@ -416,7 +418,7 @@ instance Service DiscoveryService where
Just dp
| Just dpeer <- dpPeer dp -> if
| dconnTunnel conn -> if
- | not (discoveryProvideTunnel attrs peer) -> do
+ | not (discoveryProvideTunnel attrs peer paddr) -> do
replyPacket $ DiscoveryConnectionResponse rconn
| fromSource : _ <- streams -> do
void $ liftIO $ forkIO $ runPeerService @DiscoveryService dpeer $ do
diff --git a/src/Erebos/Network.hs b/src/Erebos/Network.hs
index 3aa1a3f..76ecd82 100644
--- a/src/Erebos/Network.hs
+++ b/src/Erebos/Network.hs
@@ -1001,6 +1001,7 @@ runPeerServiceOn mbservice newStreams peer handler = liftIO $ do
let inp = ServiceInput
{ svcAttributes = attr
, svcPeer = peer
+ , svcPeerAddress = peerAddress peer
, svcPeerIdentity = peerId
, svcServer = server
, svcPrintOp = atomically . logd
diff --git a/src/Erebos/Network.hs-boot b/src/Erebos/Network.hs-boot
index af77581..17a5275 100644
--- a/src/Erebos/Network.hs-boot
+++ b/src/Erebos/Network.hs-boot
@@ -4,5 +4,6 @@ import Erebos.Object.Internal
data Server
data Peer
+data PeerAddress
peerStorage :: Peer -> Storage
diff --git a/src/Erebos/Service.hs b/src/Erebos/Service.hs
index 4499ef9..afcf512 100644
--- a/src/Erebos/Service.hs
+++ b/src/Erebos/Service.hs
@@ -115,6 +115,7 @@ mkServiceID = maybe (error "Invalid service ID") ServiceID . U.fromString
data ServiceInput s = ServiceInput
{ svcAttributes :: ServiceAttributes s
, svcPeer :: Peer
+ , svcPeerAddress :: PeerAddress
, svcPeerIdentity :: UnifiedIdentity
, svcServer :: Server
, svcPrintOp :: String -> IO ()