hg site extension
 
(Arne Babenhauserheide)
2013-08-23: use FTPS instead of FTP to avoid streaming cleartext passwords.

use FTPS instead of FTP to avoid streaming cleartext passwords.

diff --git a/staticsite.py b/staticsite.py
--- a/staticsite.py
+++ b/staticsite.py
@@ -403,7 +403,7 @@ def getincoming(ui, repo, otheruri, othe
         pass
     # cannot do that for ftp or freenet insertion uris (freenet
     # separates insertion and retrieval by private/public key)
-    isftpuri = otheruri.startswith("ftp://")
+    isftpuri = otheruri.startswith("ftp://") or otheruri.startswith("ftps://")
     isfreenetpriv = _freenetprivkeystring in otheruri
     if isftpuri or isfreenetpriv:
         chlist = []
@@ -434,7 +434,8 @@ def getoutgoing(ui, repo, otheruri, othe
     # cannot do that for ftp or freenet insertion uris (freenet
     # separates insertion and retrieval by private/public key)
     ui.debug("[staticsite] getoutgoing: checkkeys\n")
-    isftpuri = otheruri.startswith("ftp://")
+    isftpuri = otheruri.startswith("ftp://") or otheruri.startswith("ftps://")
+
     isfreenetpriv = "AQECAAE/" in otheruri
     if isftpuri or isfreenetpriv:
         chlist = []
@@ -861,7 +862,8 @@ def upload(ui, repo, target, ftpstring, 
     ftppath = "/".join(serverandpath.split("/")[1:])
     timeout = 10
     try:
-        ftp = ftplib.FTP(server, user, password, "", timeout)
+        ftp = ftplib.FTP_TLS(server, user, password, "", timeout=timeout)
+        ftp.prot_p()
     except socket.timeout:
         ui.warn(_("connection to "), server, _(" timed out after "), timeout, _(" seconds.\n"))
         return
@@ -1024,6 +1026,7 @@ def ftppush(orig, *args, **opts):
     # first create the site at ._site
     target = "._site"
     ftpstring = path.replace("ftp://", "")
+    ftpstring = path.replace("ftps://", "")
     # fix the options to fit those of the site command
     opts["name"] = opts["sitename"]
     opts["upload"] = ftpstring
@@ -1056,7 +1059,7 @@ class FTPRepository(peerrepository):
         self.create = create
         self.ui = ui
         self.path = path
-        self.capabilities = set(["ftp"])
+        self.capabilities = set(["ftp", "ftps"])
 
     def lock(self):
         """We cannot really lock FTP repos, yet.
@@ -1113,6 +1116,7 @@ class RepoContainer(object):
         return FTPRepository(ui, url, create)
 
 hg.schemes["ftp"] = RepoContainer()
+hg.schemes["ftps"] = RepoContainer()
 
 def test():
     import subprocess as sp