:> ClientUUID Required
:> ServerUUID Required
:> BypassUUIDs
+ :> AuthHeader
:> Post '[JSON] CheckPresentResult
serveCheckPresent
-> B64UUID ClientSide
-> B64UUID ServerSide
-> [B64UUID Bypass]
+ -> Maybe Auth
-> Handler CheckPresentResult
-serveCheckPresent st apiver (B64Key k) cu su bypass = do
- res <- withP2PConnection apiver st cu su bypass $ \runst conn ->
- liftIO $ runNetProto runst conn $ checkPresent k
+serveCheckPresent st apiver (B64Key k) cu su bypass auth = do
+ res <- withP2PConnection apiver st cu su bypass auth ReadAction
+ $ \runst conn ->
+ liftIO $ runNetProto runst conn $ checkPresent k
case res of
Right (Right b) -> return (CheckPresentResult b)
Right (Left err) -> throwError $ err500 { errBody = encodeBL err }
-> B64UUID ClientSide
-> B64UUID ServerSide
-> [B64UUID Bypass]
+ -> Maybe Auth
-> ClientM CheckPresentResult
clientCheckPresent' (ProtocolVersion ver) = case ver of
3 -> v3 V3
-> B64UUID ClientSide
-> B64UUID ServerSide
-> [B64UUID Bypass]
+ -> Maybe Auth
-> IO Bool
-clientCheckPresent clientenv protover key cu su bypass = do
- let cli = clientCheckPresent' protover key cu su bypass
+clientCheckPresent clientenv protover key cu su bypass auth = do
+ let cli = clientCheckPresent' protover key cu su bypass auth
withClientM cli clientenv $ \case
Left err -> throwM err
Right (CheckPresentResult res) -> return res
:> ClientUUID Required
:> ServerUUID Required
:> BypassUUIDs
+ :> AuthHeader
:> Post '[JSON] result
serveRemove
-> B64UUID ClientSide
-> B64UUID ServerSide
-> [B64UUID Bypass]
+ -> Maybe Auth
-> Handler t
serveRemove = undefined
-> B64UUID ClientSide
-> B64UUID ServerSide
-> [B64UUID Bypass]
+ -> Maybe Auth
-> ClientM RemoveResultPlus
-clientRemove (ProtocolVersion ver) k cu su bypass = case ver of
- 3 -> v3 V3 k cu su bypass
- 2 -> v2 V2 k cu su bypass
- 1 -> plus <$> v1 V1 k cu su bypass
- 0 -> plus <$> v0 V0 k cu su bypass
+clientRemove (ProtocolVersion ver) k cu su bypass auth = case ver of
+ 3 -> v3 V3 k cu su bypass auth
+ 2 -> v2 V2 k cu su bypass auth
+ 1 -> plus <$> v1 V1 k cu su bypass auth
+ 0 -> plus <$> v0 V0 k cu su bypass auth
_ -> error "unsupported protocol version"
where
_ :<|> _ :<|> _ :<|> _ :<|>
<*> pure getservermode
<*> newTMVarIO mempty
+data ActionClass = ReadAction | WriteAction | RemoveAction
+ deriving (Eq)
+
withP2PConnection
:: APIVersion v
=> v
-> B64UUID ClientSide
-> B64UUID ServerSide
-> [B64UUID Bypass]
+ -> Maybe Auth
+ -> ActionClass
-> (RunState -> P2PConnection -> Handler a)
-> Handler a
-withP2PConnection apiver st cu su bypass connaction = do
- liftIO (acquireP2PConnection st cp) >>= \case
+withP2PConnection apiver st cu su bypass auth actionclass connaction =
+ case (getServerMode st auth, actionclass) of
+ (Just P2P.ServeReadWrite, _) -> go P2P.ServeReadWrite
+ (Just P2P.ServeAppendOnly, RemoveAction) -> throwError err403
+ (Just P2P.ServeAppendOnly, _) -> go P2P.ServeAppendOnly
+ (Just P2P.ServeReadOnly, ReadAction) -> go P2P.ServeReadOnly
+ (Just P2P.ServeReadOnly, _) -> throwError err403
+ (Nothing, _) -> throwError err401
+ where
+ go servermode = liftIO (acquireP2PConnection st cp) >>= \case
Left (ConnectionFailed err) ->
throwError err502 { errBody = encodeBL err }
Left TooManyConnections ->
Right (runst, conn, releaseconn) ->
connaction runst conn
`finally` liftIO releaseconn
- where
- cp = ConnectionParams
- { connectionProtocolVersion = protocolVersion apiver
- , connectionServerUUID = fromB64UUID su
- , connectionClientUUID = fromB64UUID cu
- , connectionBypass = map fromB64UUID bypass
- , connectionServerMode = P2P.ServeReadWrite -- XXX auth
- }
-
-type GetServerMode = IsSecure -> Maybe BasicAuthData -> Maybe P2P.ServerMode
+ where
+ cp = ConnectionParams
+ { connectionProtocolVersion = protocolVersion apiver
+ , connectionServerUUID = fromB64UUID su
+ , connectionClientUUID = fromB64UUID cu
+ , connectionBypass = map fromB64UUID bypass
+ , connectionServerMode = servermode
+ }
+
+-- Nothing when the server is not allowed to serve any requests.
+type GetServerMode = Maybe Auth -> Maybe P2P.ServerMode
data ConnectionParams = ConnectionParams
{ connectionProtocolVersion :: P2P.ProtocolVersion