summaryrefslogtreecommitdiffhomepage
path: root/SessionID.hs
diff options
context:
space:
mode:
Diffstat (limited to 'SessionID.hs')
-rw-r--r--SessionID.hs28
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)