p2phttp: Allow unauthenticated users to lock content by default
* p2phttp: Allow unauthenticated users to lock content by default. * p2phttp: Added --unauth-nolocking option to prevent unauthenticated users from locking content. The rationalle for this is that locking is not really a write operation, so makes sense to allow in a repository that only allows read-only access. Not supporting locking in that situation will prevent the user from dropping content from a special remote they control in cases where the other copy of the content is on the p2phttp server. Also, when p2phttp is configured to also allow authenticated access, lockcontent was resulting in a password prompt for users who had no way to authenticate. And there is no good way to distinguish between the two types of users client side. --unauth-nolocking anticipates that this might be abused, and seems better than disabling unauthenticated access entirely if a server is being attacked. It may be that rate limiting locking by IP address or similar would be an effective measure in such a situation. Or just limiting the number of locks by anonymous users that can be live at any one time. Since the impact of such an DOS attempt is limited to preventing dropping content from the server, it seems not a very appealing target anyway.
This commit is contained in:
parent
87c88025d1
commit
de138c642b
7 changed files with 60 additions and 10 deletions
|
@ -40,6 +40,7 @@ data Options = Options
|
|||
, authEnvHttpOption :: Bool
|
||||
, unauthReadOnlyOption :: Bool
|
||||
, unauthAppendOnlyOption :: Bool
|
||||
, unauthNoLockingOption :: Bool
|
||||
, wideOpenOption :: Bool
|
||||
, proxyConnectionsOption :: Maybe Integer
|
||||
, clusterJobsOption :: Maybe Int
|
||||
|
@ -83,6 +84,10 @@ optParser _ = Options
|
|||
( long "unauth-appendonly"
|
||||
<> help "allow unauthenticated users to read and append to the repository"
|
||||
)
|
||||
<*> switch
|
||||
( long "unauth-nolocking"
|
||||
<> help "prevent unauthenticated users from locking content in the repository"
|
||||
)
|
||||
<*> switch
|
||||
( long "wideopen"
|
||||
<> help "give unauthenticated users full read+write access"
|
||||
|
@ -128,15 +133,25 @@ seek o = getAnnexWorkerPool $ \workerpool ->
|
|||
|
||||
mkGetServerMode :: M.Map Auth P2P.ServerMode -> Options -> GetServerMode
|
||||
mkGetServerMode _ o _ Nothing
|
||||
| wideOpenOption o =
|
||||
ServerMode P2P.ServeReadWrite False
|
||||
| unauthAppendOnlyOption o =
|
||||
ServerMode P2P.ServeAppendOnly canauth
|
||||
| unauthReadOnlyOption o =
|
||||
ServerMode P2P.ServeReadOnly canauth
|
||||
| wideOpenOption o = ServerMode
|
||||
{ serverMode = P2P.ServeReadWrite
|
||||
, unauthenticatedLockingAllowed = unauthlock
|
||||
, authenticationAllowed = False
|
||||
}
|
||||
| unauthAppendOnlyOption o = ServerMode
|
||||
{ serverMode = P2P.ServeAppendOnly
|
||||
, unauthenticatedLockingAllowed = unauthlock
|
||||
, authenticationAllowed = canauth
|
||||
}
|
||||
| unauthReadOnlyOption o = ServerMode
|
||||
{ serverMode = P2P.ServeReadOnly
|
||||
, unauthenticatedLockingAllowed = unauthlock
|
||||
, authenticationAllowed = canauth
|
||||
}
|
||||
| otherwise = CannotServeRequests
|
||||
where
|
||||
canauth = authEnvOption o || authEnvHttpOption o
|
||||
unauthlock = not (unauthNoLockingOption o)
|
||||
mkGetServerMode authenv o issecure (Just auth) =
|
||||
case (issecure, authEnvOption o, authEnvHttpOption o) of
|
||||
(Secure, True, _) -> checkauth
|
||||
|
@ -144,7 +159,11 @@ mkGetServerMode authenv o issecure (Just auth) =
|
|||
_ -> noauth
|
||||
where
|
||||
checkauth = case M.lookup auth authenv of
|
||||
Just servermode -> ServerMode servermode False
|
||||
Just servermode -> ServerMode
|
||||
{ serverMode = servermode
|
||||
, authenticationAllowed = False
|
||||
, unauthenticatedLockingAllowed = False
|
||||
}
|
||||
Nothing -> noauth
|
||||
noauth = mkGetServerMode authenv noautho issecure Nothing
|
||||
noautho = o { authEnvOption = False, authEnvHttpOption = False }
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue