diff options
Diffstat (limited to 'SessionID.hs')
-rw-r--r-- | SessionID.hs | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/SessionID.hs b/SessionID.hs new file mode 100644 index 0000000..a47de8f --- /dev/null +++ b/SessionID.hs @@ -0,0 +1,28 @@ +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) |