2012-11-17 19:30:11 +00:00
|
|
|
{- git-annex assistant webapp configurators for WebDAV remotes
|
|
|
|
-
|
2015-01-21 16:50:09 +00:00
|
|
|
- Copyright 2012, 2013 Joey Hess <id@joeyh.name>
|
2012-11-17 19:30:11 +00:00
|
|
|
-
|
|
|
|
- Licensed under the GNU AGPL version 3 or higher.
|
|
|
|
-}
|
|
|
|
|
2013-10-02 05:06:59 +00:00
|
|
|
{-# LANGUAGE CPP, TemplateHaskell, OverloadedStrings #-}
|
2012-11-17 19:30:11 +00:00
|
|
|
|
|
|
|
module Assistant.WebApp.Configurators.WebDAV where
|
|
|
|
|
2012-11-25 04:26:46 +00:00
|
|
|
import Assistant.WebApp.Common
|
2013-04-20 23:25:50 +00:00
|
|
|
import Creds
|
2012-11-25 18:36:24 +00:00
|
|
|
#ifdef WITH_WEBDAV
|
2012-11-17 19:30:11 +00:00
|
|
|
import qualified Remote.WebDAV as WebDAV
|
2013-10-28 15:33:14 +00:00
|
|
|
import Assistant.WebApp.MakeRemote
|
2012-11-17 19:30:11 +00:00
|
|
|
import qualified Remote
|
2020-01-15 17:47:31 +00:00
|
|
|
import Types.Remote (RemoteConfig, configParser)
|
2012-11-17 19:30:11 +00:00
|
|
|
import Types.StandardGroups
|
2012-11-17 19:58:27 +00:00
|
|
|
import Logs.Remote
|
2013-11-07 22:02:00 +00:00
|
|
|
import Git.Types (RemoteName)
|
2017-08-17 16:26:14 +00:00
|
|
|
import Assistant.Gpg
|
|
|
|
import Types.GitConfig
|
2019-10-10 17:08:17 +00:00
|
|
|
import Annex.SpecialRemote.Config
|
2020-01-10 18:10:20 +00:00
|
|
|
import Types.ProposedAccepted
|
2012-11-17 19:30:11 +00:00
|
|
|
|
|
|
|
import qualified Data.Map as M
|
2013-04-20 23:25:50 +00:00
|
|
|
#endif
|
|
|
|
import qualified Data.Text as T
|
2013-04-27 19:16:06 +00:00
|
|
|
import Network.URI
|
2012-11-17 19:30:11 +00:00
|
|
|
|
2013-06-27 05:15:28 +00:00
|
|
|
webDAVConfigurator :: Widget -> Handler Html
|
2012-12-30 03:10:18 +00:00
|
|
|
webDAVConfigurator = page "Add a WebDAV repository" (Just Configuration)
|
2012-11-17 19:58:27 +00:00
|
|
|
|
2012-11-17 19:30:11 +00:00
|
|
|
data WebDAVInput = WebDAVInput
|
|
|
|
{ user :: Text
|
|
|
|
, password :: Text
|
2012-11-28 17:31:49 +00:00
|
|
|
, embedCreds :: Bool
|
2012-11-17 19:30:11 +00:00
|
|
|
, directory :: Text
|
2012-12-04 17:28:22 +00:00
|
|
|
, enableEncryption :: EnableEncryption
|
2012-11-17 19:30:11 +00:00
|
|
|
}
|
|
|
|
|
2012-11-28 17:31:49 +00:00
|
|
|
toCredPair :: WebDAVInput -> CredPair
|
|
|
|
toCredPair input = (T.unpack $ user input, T.unpack $ password input)
|
|
|
|
|
2013-06-03 20:33:05 +00:00
|
|
|
webDAVCredsAForm :: Maybe CredPair -> MkAForm WebDAVInput
|
2013-04-27 19:16:06 +00:00
|
|
|
webDAVCredsAForm defcreds = WebDAVInput
|
2014-04-18 00:07:09 +00:00
|
|
|
<$> areq textField (bfs "Username or Email") (T.pack . fst <$> defcreds)
|
|
|
|
<*> areq passwordField (bfs "Password") (T.pack . snd <$> defcreds)
|
2012-11-28 17:31:49 +00:00
|
|
|
<*> pure False
|
|
|
|
<*> pure T.empty
|
2012-12-04 17:28:22 +00:00
|
|
|
<*> pure NoEncryption -- not used!
|
2012-11-17 19:58:27 +00:00
|
|
|
|
2013-06-27 05:15:28 +00:00
|
|
|
getEnableWebDAVR :: UUID -> Handler Html
|
2013-03-16 22:48:23 +00:00
|
|
|
getEnableWebDAVR = postEnableWebDAVR
|
2013-06-27 05:15:28 +00:00
|
|
|
postEnableWebDAVR :: UUID -> Handler Html
|
2012-11-25 18:36:24 +00:00
|
|
|
#ifdef WITH_WEBDAV
|
2013-03-16 22:48:23 +00:00
|
|
|
postEnableWebDAVR uuid = do
|
2013-03-04 20:36:38 +00:00
|
|
|
m <- liftAnnex readRemoteLog
|
2012-11-17 19:58:27 +00:00
|
|
|
let c = fromJust $ M.lookup uuid m
|
2019-10-10 17:08:17 +00:00
|
|
|
let name = fromJust $ lookupName c
|
2020-01-10 18:10:20 +00:00
|
|
|
let url = fromProposedAccepted $ fromJust $ M.lookup (Accepted "url") c
|
2017-08-17 16:26:14 +00:00
|
|
|
mcreds <- liftAnnex $ do
|
|
|
|
dummycfg <- liftIO dummyRemoteGitConfig
|
2020-01-15 17:47:31 +00:00
|
|
|
pc <- either mempty id . parseRemoteConfig c
|
add LISTCONFIGS to external special remote protocol
Special remote programs that use GETCONFIG/SETCONFIG are recommended
to implement it.
The description is not yet used, but will be useful later when adding a way
to make initremote list all accepted configs.
configParser now takes a RemoteConfig parameter. Normally, that's not
needed, because configParser returns a parter, it does not parse it
itself. But, it's needed to look at externaltype and work out what
external remote program to run for LISTCONFIGS.
Note that, while externalUUID is changed to a Maybe UUID, checkExportSupported
used to use NoUUID. The code that now checks for Nothing used to behave
in some undefined way if the external program made requests that
triggered it.
Also, note that in externalSetup, once it generates external,
it parses the RemoteConfig strictly. That generates a
ParsedRemoteConfig, which is thrown away. The reason it's ok to throw
that away, is that, if the strict parse succeeded, the result must be
the same as the earlier, lenient parse.
initremote of an external special remote now runs the program three
times. First for LISTCONFIGS, then EXPORTSUPPORTED, and again
LISTCONFIGS+INITREMOTE. It would not be hard to eliminate at least
one of those, and it should be possible to only run the program once.
2020-01-17 19:30:14 +00:00
|
|
|
<$> configParser WebDAV.remote c
|
2020-01-15 17:47:31 +00:00
|
|
|
getRemoteCredPairFor "webdav" pc dummycfg (WebDAV.davCreds uuid)
|
2012-11-28 17:31:49 +00:00
|
|
|
case mcreds of
|
2013-06-03 17:51:54 +00:00
|
|
|
Just creds -> webDAVConfigurator $ liftH $
|
2013-09-27 04:15:50 +00:00
|
|
|
makeWebDavRemote enableSpecialRemote name creds M.empty
|
2019-01-22 15:48:35 +00:00
|
|
|
Nothing -> webDAVConfigurator $ showform name url
|
2012-11-17 19:58:27 +00:00
|
|
|
where
|
2012-11-28 17:31:49 +00:00
|
|
|
showform name url = do
|
2013-04-27 19:16:06 +00:00
|
|
|
defcreds <- liftAnnex $
|
|
|
|
maybe (pure Nothing) previouslyUsedWebDAVCreds $
|
|
|
|
urlHost url
|
2013-06-03 17:51:54 +00:00
|
|
|
((result, form), enctype) <- liftH $
|
2014-04-18 00:07:09 +00:00
|
|
|
runFormPostNoToken $ renderBootstrap3 bootstrapFormLayout $
|
|
|
|
webDAVCredsAForm defcreds
|
2012-11-17 19:58:27 +00:00
|
|
|
case result of
|
2013-06-03 17:51:54 +00:00
|
|
|
FormSuccess input -> liftH $
|
2013-09-27 04:15:50 +00:00
|
|
|
makeWebDavRemote enableSpecialRemote name (toCredPair input) M.empty
|
2012-11-17 19:58:27 +00:00
|
|
|
_ -> do
|
2013-03-16 04:12:28 +00:00
|
|
|
description <- liftAnnex $
|
2013-04-03 21:01:40 +00:00
|
|
|
T.pack <$> Remote.prettyUUID uuid
|
2012-11-17 19:58:27 +00:00
|
|
|
$(widgetFile "configurators/enablewebdav")
|
2012-11-25 18:36:24 +00:00
|
|
|
#else
|
2016-11-16 01:29:54 +00:00
|
|
|
postEnableWebDAVR _ = giveup "WebDAV not supported by this build"
|
2012-11-25 18:36:24 +00:00
|
|
|
#endif
|
2012-11-17 19:58:27 +00:00
|
|
|
|
2012-11-25 18:36:24 +00:00
|
|
|
#ifdef WITH_WEBDAV
|
2013-09-27 04:15:50 +00:00
|
|
|
makeWebDavRemote :: SpecialRemoteMaker -> RemoteName -> CredPair -> RemoteConfig -> Handler ()
|
2014-02-11 18:06:50 +00:00
|
|
|
makeWebDavRemote maker name creds config =
|
2013-09-29 18:39:10 +00:00
|
|
|
setupCloudRemote TransferGroup Nothing $
|
2014-02-11 18:06:50 +00:00
|
|
|
maker name WebDAV.remote (Just creds) config
|
2013-04-27 19:16:06 +00:00
|
|
|
|
|
|
|
{- Only returns creds previously used for the same hostname. -}
|
|
|
|
previouslyUsedWebDAVCreds :: String -> Annex (Maybe CredPair)
|
|
|
|
previouslyUsedWebDAVCreds hostname =
|
|
|
|
previouslyUsedCredPair WebDAV.davCreds WebDAV.remote samehost
|
|
|
|
where
|
|
|
|
samehost url = case urlHost =<< WebDAV.configUrl url of
|
|
|
|
Nothing -> False
|
|
|
|
Just h -> h == hostname
|
2013-05-08 16:20:10 +00:00
|
|
|
#endif
|
2013-04-27 19:16:06 +00:00
|
|
|
|
|
|
|
urlHost :: String -> Maybe String
|
|
|
|
urlHost url = uriRegName <$> (uriAuthority =<< parseURI url)
|