From 5982df9112b7e5fe7bcab62434771f1ca979e14d Mon Sep 17 00:00:00 2001 From: joe Date: Mon, 17 Jun 2013 13:28:07 -0400 Subject: Now determines username for session. --- Presence/LocalPeerCred.hs | 6 ++++-- Presence/main.hs | 41 ++++++++++++++++++++++++++++++++++++----- 2 files changed, 40 insertions(+), 7 deletions(-) (limited to 'Presence') diff --git a/Presence/LocalPeerCred.hs b/Presence/LocalPeerCred.hs index c58fe288..990975ee 100644 --- a/Presence/LocalPeerCred.hs +++ b/Presence/LocalPeerCred.hs @@ -49,9 +49,11 @@ getLocalPeerCred sock = do addr <- getPeerName sock muid <- getLocalPeerCred' addr case muid of - Just uid -> return uid - Nothing -> return undefined -- trace "proc failed." $ fmap (CUid . fromIntegral . sndOf3) (getPeerCred sock) + Just uid -> return (Just uid) + Nothing -> trace "proc failed." $ fmap (validate . CUid . fromIntegral . sndOf3) (getPeerCred sock) where sndOf3 (pid,uid,gid) = uid + where + validate uid = Just uid -- TODO from16 :: Word16 -> Int from16 = fromEnum diff --git a/Presence/main.hs b/Presence/main.hs index 7a5939ff..d679fdba 100644 --- a/Presence/main.hs +++ b/Presence/main.hs @@ -18,6 +18,11 @@ import XMPPServer import Data.HList import Network.Socket (sClose) import Control.Exception +import LocalPeerCred +import ByteStringOperators +import qualified Data.ByteString.Lazy.Char8 as L +import System.Posix.User + jid user host rsrc = user ++ "@" ++ host ++ "/" ++ rsrc @@ -37,14 +42,40 @@ utmp_event e = do forM_ ids putStrLn #endif -data UnixSession = UnixSession +data UnixSession = UnixSession { + unix_uid :: (IORef (Maybe UserID)), + unix_resource :: (IORef (Maybe L.ByteString)) +} instance XMPPSession UnixSession where data XMPPClass UnixSession = UnixSessions - newSession _ sock handle = putStrLn "SESSION: open" >> return UnixSession - setResource _ resource = putStrLn "SESSION: resource" - getJID _ = putStrLn "SESSION: jid" >> return "nobody@fake.bad" - closeSession _ = putStrLn "SESSION: close" >> return () + newSession _ sock handle = do + muid <- getLocalPeerCred sock + putStrLn $ "SESSION: open " ++ show muid + uid_ref <- newIORef muid + res_ref <- newIORef Nothing + return $ UnixSession uid_ref res_ref + setResource s resource = do + writeIORef (unix_resource s) (Just resource) + L.putStrLn $ "SESSION: resource " <++> resource + getJID s = do + let host = "localhost" -- TODO + muid <- readIORef (unix_uid s) + user <- maybe (return "nobody") + (\uid -> + handle (\(SomeException _) -> + return . L.append "uid." . L.pack . show $ uid) + $ do + user <- fmap userName $ getUserEntryForID uid + return (L.pack user) + ) + muid + rsc <- readIORef (unix_resource s) + let suf = maybe "" ("/"<++>) rsc + jid = user <++> "@" <++> L.pack host <++> suf + L.putStrLn $ "SESSION: jid " <++> jid + return jid + closeSession _ = putStrLn "SESSION: close" on_chvt vtnum = do putStrLn $ "changed vt to "++ show vtnum -- cgit v1.2.3