module SessionID (SessionID, mkSessionID, sessionLogFile, withSessionID) where import System.FilePath import Data.Text import System.IO -- | A SessionID is the base name of the log file to use, -- and may not contain any path information. newtype SessionID = SessionID FilePath deriving (Show, Eq, Ord) -- | Smart constructor that enforces security requirements. mkSessionID :: Text -> Maybe SessionID mkSessionID t = let f = unpack t in if takeFileName f == f then Just (SessionID f) else Nothing sessionLogFile :: FilePath -> SessionID -> FilePath sessionLogFile dir (SessionID f) = dir "debug-me." ++ f ++ ".log" -- | Allocate a new SessionID and return an open Handle to its log file. withSessionID :: FilePath -> ((Handle, SessionID) -> IO a) -> IO a withSessionID dir a = do -- TODO find an unused log file and open it let sid = SessionID "1" withFile "debug-me-server.log" WriteMode $ \h -> a (h, sid)