started on auth
This commit is contained in:
parent
b5b3d8cde2
commit
08371c3745
6 changed files with 76 additions and 16 deletions
|
@ -24,7 +24,16 @@ import Control.Concurrent.STM
|
||||||
cmd :: Command
|
cmd :: Command
|
||||||
cmd = command "p2phttp" SectionPlumbing
|
cmd = command "p2phttp" SectionPlumbing
|
||||||
"communicate in P2P protocol over http"
|
"communicate in P2P protocol over http"
|
||||||
paramNothing (withParams seek)
|
paramNothing (seek <$$> optParser)
|
||||||
|
|
||||||
|
data Options = Options
|
||||||
|
{ cmdParams :: CmdParams
|
||||||
|
, authEnvOption :: Bool
|
||||||
|
, authEnvHttpOption :: Bool
|
||||||
|
, readOnlyOption :: Bool
|
||||||
|
, appendOnlyOption :: Bool
|
||||||
|
, wideOpenOption :: Bool
|
||||||
|
}
|
||||||
|
|
||||||
seek :: CmdParams -> CommandSeek
|
seek :: CmdParams -> CommandSeek
|
||||||
seek ["server"] = startConcurrency commandStages $
|
seek ["server"] = startConcurrency commandStages $
|
||||||
|
|
|
@ -119,6 +119,7 @@ type GetAPI
|
||||||
:> BypassUUIDs
|
:> BypassUUIDs
|
||||||
:> AssociatedFileParam
|
:> AssociatedFileParam
|
||||||
:> OffsetParam
|
:> OffsetParam
|
||||||
|
:> AuthHeader
|
||||||
:> StreamGet NoFraming OctetStream
|
:> StreamGet NoFraming OctetStream
|
||||||
(Headers '[DataLengthHeader] (SourceIO B.ByteString))
|
(Headers '[DataLengthHeader] (SourceIO B.ByteString))
|
||||||
|
|
||||||
|
@ -132,6 +133,7 @@ serveGet
|
||||||
-> [B64UUID Bypass]
|
-> [B64UUID Bypass]
|
||||||
-> Maybe B64FilePath
|
-> Maybe B64FilePath
|
||||||
-> Maybe Offset
|
-> Maybe Offset
|
||||||
|
-> Maybe Auth
|
||||||
-> Handler (Headers '[DataLengthHeader] (S.SourceT IO B.ByteString))
|
-> Handler (Headers '[DataLengthHeader] (S.SourceT IO B.ByteString))
|
||||||
serveGet = undefined
|
serveGet = undefined
|
||||||
|
|
||||||
|
@ -143,6 +145,7 @@ clientGet
|
||||||
-> [B64UUID Bypass]
|
-> [B64UUID Bypass]
|
||||||
-> Maybe B64FilePath
|
-> Maybe B64FilePath
|
||||||
-> Maybe Offset
|
-> Maybe Offset
|
||||||
|
-> Maybe Auth
|
||||||
-> ClientM (Headers '[DataLengthHeader] (S.SourceT IO B.ByteString))
|
-> ClientM (Headers '[DataLengthHeader] (S.SourceT IO B.ByteString))
|
||||||
clientGet (ProtocolVersion ver) = case ver of
|
clientGet (ProtocolVersion ver) = case ver of
|
||||||
3 -> v3 V3
|
3 -> v3 V3
|
||||||
|
@ -563,3 +566,5 @@ type OffsetParam = QueryParam "offset" Offset
|
||||||
type DataLengthHeader = Header "X-git-annex-data-length" Integer
|
type DataLengthHeader = Header "X-git-annex-data-length" Integer
|
||||||
|
|
||||||
type LockIDParam = QueryParam' '[Required] "lockid" LockID
|
type LockIDParam = QueryParam' '[Required] "lockid" LockID
|
||||||
|
|
||||||
|
type AuthHeader = Header "Authorization" Auth
|
||||||
|
|
|
@ -26,12 +26,14 @@ import Control.Concurrent.STM
|
||||||
|
|
||||||
data P2PHttpServerState = P2PHttpServerState
|
data P2PHttpServerState = P2PHttpServerState
|
||||||
{ acquireP2PConnection :: AcquireP2PConnection
|
{ acquireP2PConnection :: AcquireP2PConnection
|
||||||
|
, getServerMode :: GetServerMode
|
||||||
, openLocks :: TMVar (M.Map LockID Locker)
|
, openLocks :: TMVar (M.Map LockID Locker)
|
||||||
}
|
}
|
||||||
|
|
||||||
mkP2PHttpServerState :: AcquireP2PConnection -> IO P2PHttpServerState
|
mkP2PHttpServerState :: AcquireP2PConnection -> GetServerMode -> IO P2PHttpServerState
|
||||||
mkP2PHttpServerState acquireconn = P2PHttpServerState
|
mkP2PHttpServerState acquireconn getservermode = P2PHttpServerState
|
||||||
<$> pure acquireconn
|
<$> pure acquireconn
|
||||||
|
<*> pure getservermode
|
||||||
<*> newTMVarIO mempty
|
<*> newTMVarIO mempty
|
||||||
|
|
||||||
withP2PConnection
|
withP2PConnection
|
||||||
|
@ -61,6 +63,8 @@ withP2PConnection apiver st cu su bypass connaction = do
|
||||||
, connectionServerMode = P2P.ServeReadWrite -- XXX auth
|
, connectionServerMode = P2P.ServeReadWrite -- XXX auth
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type GetServerMode = IsSecure -> Maybe BasicAuthData -> Maybe P2P.ServerMode
|
||||||
|
|
||||||
data ConnectionParams = ConnectionParams
|
data ConnectionParams = ConnectionParams
|
||||||
{ connectionProtocolVersion :: P2P.ProtocolVersion
|
{ connectionProtocolVersion :: P2P.ProtocolVersion
|
||||||
, connectionServerUUID :: UUID
|
, connectionServerUUID :: UUID
|
||||||
|
|
|
@ -98,6 +98,12 @@ data LockResult = LockResult Bool (Maybe LockID)
|
||||||
newtype UnlockRequest = UnlockRequest Bool
|
newtype UnlockRequest = UnlockRequest Bool
|
||||||
deriving (Show, Generic, NFData)
|
deriving (Show, Generic, NFData)
|
||||||
|
|
||||||
|
-- Not using servant's build-in basic authentication support,
|
||||||
|
-- because whether authentication is needed depends on server
|
||||||
|
-- configuration.
|
||||||
|
data Auth = Auth T.Text T.Text
|
||||||
|
deriving (Show, Generic, NFData)
|
||||||
|
|
||||||
newtype ConnectionKeepAlive = ConnectionKeepAlive T.Text
|
newtype ConnectionKeepAlive = ConnectionKeepAlive T.Text
|
||||||
|
|
||||||
connectionKeepAlive :: ConnectionKeepAlive
|
connectionKeepAlive :: ConnectionKeepAlive
|
||||||
|
|
|
@ -19,16 +19,15 @@ underlying data is.
|
||||||
|
|
||||||
## authentication
|
## authentication
|
||||||
|
|
||||||
A git-annex protocol endpoint can optionally operate in readonly mode without
|
Some requests need authentication. Which requests do depends on the
|
||||||
authentication.
|
configuration of the HTTP server. When a request needs authentication,
|
||||||
|
it will fail with 401 Unauthorized.
|
||||||
|
|
||||||
Authentication is required to make any changes.
|
Authentication is done using HTTP basic auth. The realm to use when
|
||||||
|
authenticating is "git-annex".
|
||||||
|
|
||||||
Authentication is done using HTTP basic auth.
|
Note that HTTP basic auth is not encrypted so is only secure when used
|
||||||
|
over HTTPS.
|
||||||
The user is recommended to only authenticate over HTTPS, since otherwise
|
|
||||||
HTTP basic auth (as well as git-annex data) can be snooped. But some users
|
|
||||||
may want git-annex to use HTTP in eg a LAN.
|
|
||||||
|
|
||||||
## protocol version
|
## protocol version
|
||||||
|
|
||||||
|
@ -82,15 +81,13 @@ It is not part of the P2P protocol per se, but is provided to let
|
||||||
other clients than git-annex easily download the content of keys from the
|
other clients than git-annex easily download the content of keys from the
|
||||||
http server.
|
http server.
|
||||||
|
|
||||||
When the key is not present on the server, this returns a 404 Not Found.
|
When the key is not present on the server, it will respond
|
||||||
|
with 404 Not Found.
|
||||||
|
|
||||||
### GET /git-annex/v3/key/$key
|
### GET /git-annex/v3/key/$key
|
||||||
|
|
||||||
Get the content of a key from the server.
|
Get the content of a key from the server.
|
||||||
|
|
||||||
This is designed so it can be used both by a peer in the P2P protocol,
|
|
||||||
and by a regular HTTP client that just wants to download a file.
|
|
||||||
|
|
||||||
Example:
|
Example:
|
||||||
|
|
||||||
> GET /git-annex/v3/key/SHA1--foo&associatedfile=bar&clientuuid=79a5a1f4-07e8-11ef-873d-97f93ca91925&serveruuid=ecf6d4ca-07e8-11ef-8990-9b8c1f696bf6 HTTP/1.1
|
> GET /git-annex/v3/key/SHA1--foo&associatedfile=bar&clientuuid=79a5a1f4-07e8-11ef-873d-97f93ca91925&serveruuid=ecf6d4ca-07e8-11ef-8990-9b8c1f696bf6 HTTP/1.1
|
||||||
|
|
|
@ -4,7 +4,7 @@ git-annex-p2phttp - HTTP server for git-annex P2P protocol
|
||||||
|
|
||||||
# SYNOPSIS
|
# SYNOPSIS
|
||||||
|
|
||||||
git-annex p2phttp [params ...]
|
git-annex p2phttp
|
||||||
|
|
||||||
# DESCRIPTION
|
# DESCRIPTION
|
||||||
|
|
||||||
|
@ -12,6 +12,45 @@ This allows a git-annex repository to be accessed over HTTP.
|
||||||
It is the git-annex equivilant of git-http-backend(1), for serving
|
It is the git-annex equivilant of git-http-backend(1), for serving
|
||||||
a repository over HTTP with write access for authenticated users.
|
a repository over HTTP with write access for authenticated users.
|
||||||
|
|
||||||
|
# OPTIONS
|
||||||
|
|
||||||
|
* `--authenv`
|
||||||
|
|
||||||
|
Allows users to be authenticated with a username and password.
|
||||||
|
For security, this only allows authentication when the user connects over
|
||||||
|
HTTPS.
|
||||||
|
|
||||||
|
To configure the passwords, set environment variables
|
||||||
|
like `GIT_ANNEX_P2PHTTP_PASSWORD_alice=foo123`
|
||||||
|
|
||||||
|
The permissions of users can also be configured by setting
|
||||||
|
environment variables like
|
||||||
|
`GIT_ANNEX_P2PHTTP_PERMISSIONS_alice=readonly`. The value
|
||||||
|
can be either "readonly" or "appendonly". When this is not set,
|
||||||
|
the default is to give the user full write access.
|
||||||
|
|
||||||
|
* `--authenv-http`
|
||||||
|
|
||||||
|
Like `--authenv`, but allows authentication when the user connects
|
||||||
|
over HTTP. This is not secure, since HTTP basic authentication is not
|
||||||
|
encrypted.
|
||||||
|
|
||||||
|
* `--readonly`
|
||||||
|
|
||||||
|
Allows unauthenticated users to read the repository, but not make
|
||||||
|
modifications to it.
|
||||||
|
|
||||||
|
* `--appendonly`
|
||||||
|
|
||||||
|
Allows unauthenticated users to read the repository, and store data in
|
||||||
|
it, but not remove data from it.
|
||||||
|
|
||||||
|
* `--wideopen`
|
||||||
|
|
||||||
|
Gives unauthenticated users full access to the repository.
|
||||||
|
|
||||||
|
Please think carefully before enabling this option.
|
||||||
|
|
||||||
# SEE ALSO
|
# SEE ALSO
|
||||||
|
|
||||||
[[git-annex]](1)
|
[[git-annex]](1)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue