summaryrefslogtreecommitdiff
path: root/Presence/Presence.hs
diff options
context:
space:
mode:
authorjoe <joe@jerkface.net>2017-11-20 22:15:51 -0500
committerjoe <joe@jerkface.net>2017-11-20 22:15:51 -0500
commit99df8d61a79dd93fb8f2df28cfda1667ad6a47ab (patch)
tree90f5a3bcc98e149a72cc3857179dc9634ffdcc02 /Presence/Presence.hs
parent8413039df93b239ea3fcadc1872277201c1b5399 (diff)
Finished TODO stubs: Multiple identities/rosters for a single unix user.
Diffstat (limited to 'Presence/Presence.hs')
-rw-r--r--Presence/Presence.hs34
1 files changed, 20 insertions, 14 deletions
diff --git a/Presence/Presence.hs b/Presence/Presence.hs
index 9b91dc1d..4cb6266a 100644
--- a/Presence/Presence.hs
+++ b/Presence/Presence.hs
@@ -667,7 +667,8 @@ answerProbe :: PresenceState
667 -> Maybe Text -> ConnectionKey -> TChan Stanza -> IO () 667 -> Maybe Text -> ConnectionKey -> TChan Stanza -> IO ()
668answerProbe state mto k chan = do 668answerProbe state mto k chan = do
669 -- putStrLn $ "answerProbe! " ++ show (stanzaType stanza) 669 -- putStrLn $ "answerProbe! " ++ show (stanzaType stanza)
670 ktc <- atomically $ readTVar (keyToChan state) 670 (ktc,cmap) <- atomically $ (,) <$> readTVar (keyToChan state)
671 <*> readTVar (clients state)
671 muser <- runTraversableT $ do 672 muser <- runTraversableT $ do
672 to <- liftT $ mto 673 to <- liftT $ mto
673 conn <- liftT $ Map.lookup k ktc 674 conn <- liftT $ Map.lookup k ktc
@@ -675,12 +676,13 @@ answerProbe state mto k chan = do
675 -- probes. Is this correct? Check the spec. 676 -- probes. Is this correct? Check the spec.
676 liftMT $ guardPortStrippedAddress h (auxAddr conn) 677 liftMT $ guardPortStrippedAddress h (auxAddr conn)
677 u <- liftT mu 678 u <- liftT mu
678 let ch = addrToText (auxAddr conn) 679 let ch = addrToText (auxAddr conn)
679 return (u,conn,ch) 680 profile = fromMaybe "." $ clientProfile <$> Map.lookup k cmap
681 return (u,profile,conn,ch)
680 682
681 flip (maybe $ return ()) muser $ \(u,conn,ch) -> do 683 flip (maybe $ return ()) muser $ \(u,profile,conn,ch) -> do
682 684
683 resolved_subs <- resolvedFromRoster ConfigFiles.getSubscribers u (_todo {- profile -}) 685 resolved_subs <- resolvedFromRoster ConfigFiles.getSubscribers u profile
684 let gaddrs = groupBy (\a b -> snd a == snd b) (sort resolved_subs) 686 let gaddrs = groupBy (\a b -> snd a == snd b) (sort resolved_subs)
685 whitelist = do 687 whitelist = do
686 xs <- gaddrs 688 xs <- gaddrs
@@ -905,7 +907,8 @@ peerSubscriptionRequest state fail k stanza chan = do
905 (mfrom_u,from_h,_) = splitJID from 907 (mfrom_u,from_h,_) = splitJID from
906 to <- return $ unsplitJID (mto_u,h,Nothing) -- delete resource 908 to <- return $ unsplitJID (mto_u,h,Nothing) -- delete resource
907 from <- return $ unsplitJID (mfrom_u,from_h,Nothing) -- delete resource 909 from <- return $ unsplitJID (mfrom_u,from_h,Nothing) -- delete resource
908 ktc <- atomically . readTVar $ keyToChan state 910 (ktc,cmap) <- atomically $ (,) <$> readTVar (keyToChan state)
911 <*> readTVar (clients state)
909 flip (maybe fail) (Map.lookup k ktc) 912 flip (maybe fail) (Map.lookup k ktc)
910 $ \Conn { auxAddr=laddr } -> do 913 $ \Conn { auxAddr=laddr } -> do
911 (mine,totup) <- rewriteJIDForClient laddr to [] 914 (mine,totup) <- rewriteJIDForClient laddr to []
@@ -913,7 +916,8 @@ peerSubscriptionRequest state fail k stanza chan = do
913 (_,fromtup) <- rewriteJIDForClient laddr from [] 916 (_,fromtup) <- rewriteJIDForClient laddr from []
914 flip (maybe fail) mto_u $ \u -> do 917 flip (maybe fail) mto_u $ \u -> do
915 flip (maybe fail) mfrom_u $ \from_u -> do 918 flip (maybe fail) mfrom_u $ \from_u -> do
916 resolved_subs <- resolvedFromRoster ConfigFiles.getSubscribers u (_todo {- profile -}) 919 let profile = fromMaybe "." $ clientProfile <$> Map.lookup k cmap
920 resolved_subs <- resolvedFromRoster ConfigFiles.getSubscribers u profile
917 let already_subscribed = elem (mfrom_u,k) resolved_subs 921 let already_subscribed = elem (mfrom_u,k) resolved_subs
918 is_wanted = case stanzaType stanza of 922 is_wanted = case stanzaType stanza of
919 PresenceRequestSubscription b -> b 923 PresenceRequestSubscription b -> b
@@ -943,9 +947,9 @@ peerSubscriptionRequest state fail k stanza chan = do
943 947
944 already_pending <- 948 already_pending <-
945 if is_wanted then 949 if is_wanted then
946 addToRosterFile ConfigFiles.modifyPending u (_todo {- profile -}) from' addrs 950 addToRosterFile ConfigFiles.modifyPending u profile from' addrs
947 else do 951 else do
948 removeFromRosterFile ConfigFiles.modifySubscribers u (_todo {- profile -}) from' addrs 952 removeFromRosterFile ConfigFiles.modifySubscribers u profile from' addrs
949 reply <- makeInformSubscription "jabber:server" to from is_wanted 953 reply <- makeInformSubscription "jabber:server" to from is_wanted
950 sendModifiedStanzaToPeer reply chan 954 sendModifiedStanzaToPeer reply chan
951 return False 955 return False
@@ -1037,7 +1041,8 @@ peerInformSubscription state fail k stanza = do
1037 putStrLn $ "TODO: peerInformSubscription" 1041 putStrLn $ "TODO: peerInformSubscription"
1038 -- remove from solicited 1042 -- remove from solicited
1039 flip (maybe fail) (stanzaFrom stanza) $ \from -> do 1043 flip (maybe fail) (stanzaFrom stanza) $ \from -> do
1040 ktc <- atomically $ readTVar (keyToChan state) 1044 (ktc,cmap) <- atomically $ (,) <$> readTVar (keyToChan state)
1045 <*> readTVar (clients state)
1041 flip (maybe fail) (Map.lookup k ktc) 1046 flip (maybe fail) (Map.lookup k ktc)
1042 $ \(Conn { connChan=sender_chan 1047 $ \(Conn { connChan=sender_chan
1043 , auxAddr=laddr }) -> do 1048 , auxAddr=laddr }) -> do
@@ -1052,8 +1057,9 @@ peerInformSubscription state fail k stanza = do
1052 -- This would allow us to answer anonymous probes with 'unsubscribed'. 1057 -- This would allow us to answer anonymous probes with 'unsubscribed'.
1053 flip (maybe fail) muser $ \user -> do 1058 flip (maybe fail) muser $ \user -> do
1054 addrs <- resolvePeer from_h 1059 addrs <- resolvePeer from_h
1055 was_solicited <- removeFromRosterFile ConfigFiles.modifySolicited user (_todo {- profile -}) from'' addrs 1060 let profile = fromMaybe "." $ clientProfile <$> Map.lookup k cmap
1056 subs <- resolvedFromRoster ConfigFiles.getSubscribers user (_todo {- profile -}) 1061 was_solicited <- removeFromRosterFile ConfigFiles.modifySolicited user profile from'' addrs
1062 subs <- resolvedFromRoster ConfigFiles.getSubscribers user profile
1057 let is_sub = not . null $ map ((from_u,) . PeerKey) addrs `intersect` subs 1063 let is_sub = not . null $ map ((from_u,) . PeerKey) addrs `intersect` subs
1058 let (relationship,addf,remf) = 1064 let (relationship,addf,remf) =
1059 case stanzaType stanza of 1065 case stanzaType stanza of
@@ -1066,8 +1072,8 @@ peerInformSubscription state fail k stanza = do
1066 else "none") 1072 else "none")
1067 , ConfigFiles.modifyOthers 1073 , ConfigFiles.modifyOthers
1068 , ConfigFiles.modifyBuddies ) 1074 , ConfigFiles.modifyBuddies )
1069 addToRosterFile addf user (_todo {- profile -}) from'' addrs 1075 addToRosterFile addf user profile from'' addrs
1070 removeFromRosterFile remf user (_todo {- profile -}) from'' addrs 1076 removeFromRosterFile remf user profile from'' addrs
1071 1077
1072 hostname <- textHostName 1078 hostname <- textHostName
1073 let to' = unsplitJID (Just user, hostname, Nothing) 1079 let to' = unsplitJID (Just user, hostname, Nothing)