diff options
Diffstat (limited to 'SessionID.hs')
-rw-r--r-- | SessionID.hs | 21 |
1 files changed, 8 insertions, 13 deletions
diff --git a/SessionID.hs b/SessionID.hs index 8bf8f7d..449f58c 100644 --- a/SessionID.hs +++ b/SessionID.hs @@ -14,9 +14,6 @@ import System.FilePath import System.IO import System.Directory import Network.Wai.Handler.Warp (Port) -import Network.WebSockets hiding (Message) -import qualified Data.Aeson -import Data.Maybe import Data.List import Data.UUID import Data.UUID.V4 @@ -28,17 +25,15 @@ import Control.Exception newtype SessionID = SessionID FilePath deriving (Show, Eq, Ord, Generic) +-- | Custom JSON deserialization so we can check smart constructor +-- to verify it's legal. +instance FromJSON SessionID where + parseJSON v = verify =<< genericParseJSON defaultOptions v + where + verify (SessionID unverified) = + maybe (fail "illegal SessionID") return + (mkSessionID unverified) instance ToJSON SessionID -instance FromJSON SessionID - -instance WebSocketsData SessionID where - -- fromDataMessage = fromLazyByteString . fromDataMessage - fromLazyByteString b = - -- Down't trust a legal SessionID to be deserialized; - -- use smart constructor to verify it's legal. - let SessionID unverified = fromMaybe (error "bad SessionID serialization") (Data.Aeson.decode b) - in fromMaybe (error "illegal SessionID") (mkSessionID unverified) - toLazyByteString = Data.Aeson.encode -- | Smart constructor that enforces legal SessionID contents. -- |