diff --git a/wikisync/plugin.py b/wikisync/plugin.py index f1483be..cac0e69 100644 --- a/wikisync/plugin.py +++ b/wikisync/plugin.py @@ -148,7 +148,8 @@ def wiki_page_deleted(self, page): self.log.debug("Removed wikisync '%s'" % item.name) def wiki_page_version_deleted(self, page): - self.wiki_page_version_deleted(page) + # self.wiki_page_version_deleted(page) + pass def wiki_page_renamed(self, page, old_name): # Treat as new page @@ -173,6 +174,10 @@ def render_admin_panel(self, req, cat, page, path_info): username = req.args.get("username", "") password = req.args.get("password", "") proxy = req.args.get("proxy", "") + proxy_type = req.args.get("proxy_type", "") + proxy_username = req.args.get("proxy_username", "") + proxy_password = req.args.get("proxy_password", "") + proxy_port = req.args.get("proxy_port", "") if password == password_stud: password = self._get_config("password") ignorelist = req.args.get("ignorelist", "") @@ -185,15 +190,16 @@ def render_admin_panel(self, req, cat, page, path_info): if server_info_changed and url: # remote server info has changed, test connection try: - wc = WebClient(url, username, password, proxy, True) + wc = WebClient(url, username, password, proxy, proxy_type, proxy_username, proxy_password, proxy_port, True) wc.test() except Exception, e: if hasattr(e, "code") and e.code == 401: add_warning(req, "Authentication failed, " "settings are not saved") else: - add_warning(req, "Cannot connect to remote server, " - "settings are not saved") + add_warning(req, "Cannot connect to remote server: %s . Settings are not saved" % str(e)) + print e + is_error = True if not is_error: self._set_config("url", url) @@ -201,6 +207,10 @@ def render_admin_panel(self, req, cat, page, path_info): self._set_config("password", password) self._set_config("ignorelist", ignorelist) self._set_config("proxy", proxy) + self._set_config("proxy_type", proxy_type) + self._set_config("proxy_username", proxy_username) + self._set_config("proxy_password", proxy_password) + self._set_config("proxy_port", proxy_port) self._save_config(req) if not url: add_warning(req, "Remote server not set, " @@ -217,6 +227,10 @@ def render_admin_panel(self, req, cat, page, path_info): "url": self._get_config("url", ""), "username": self._get_config("username", ""), "proxy": self._get_config("proxy", ""), + "proxy_type": self._get_config("proxy_type", ""), + "proxy_username": self._get_config("proxy_username", ""), + "proxy_password": self._get_config("proxy_password", ""), + "proxy_port": self._get_config("proxy_port", ""), "password": password, "ignorelist": self._get_config("ignorelist", ""), } @@ -393,12 +407,14 @@ def _process_action(self, req): self.log.debug("Pulled wiki '%s'" % item.name) elif action == "push": wiki = WikiPage(self.env, item.name) + author = get_reporter_id(req) or "wikisync" assert wiki.version > 0, "Cannot find wiki '%s'" % item.name item = item.replace( **wc.push( item.name, wiki.text, - wiki.comment + wiki.comment, + author ) ).synchronized() dao.update(item) @@ -458,10 +474,14 @@ def _get_web_client(self): username = self._get_config("username") password = self._get_config("password") proxy = self._get_config("proxy") + proxy_type = self._get_config("proxy_type") + proxy_username = self._get_config("proxy_username") + proxy_password = self._get_config("proxy_password") + proxy_port = self._get_config("proxy_port") if password: try: password = str_unmask(password) except ValueError: # assume its in clear text pass - return WebClient(baseurl, username, password, proxy, debug=False) + return WebClient(baseurl, username, password, proxy, proxy_type, proxy_username, proxy_password, proxy_port, debug=False) diff --git a/wikisync/templates/wikisync_admin.html b/wikisync/templates/wikisync_admin.html index 19af22f..6238c05 100644 --- a/wikisync/templates/wikisync_admin.html +++ b/wikisync/templates/wikisync_admin.html @@ -19,10 +19,6 @@

Wiki Synchronization

-
-
- -

: @@ -35,6 +31,32 @@

Wiki Synchronization

+
+ Proxy +
+
+

+ +

+ + + +

+

+

+

+ Proxy-Username:
+ +

+ Proxy-Password:
+ +

+
+
Advance Options
@@ -54,6 +76,55 @@

Wiki Synchronization

+ + diff --git a/wikisync/util.py b/wikisync/util.py index d98e58b..bdf1772 100644 --- a/wikisync/util.py +++ b/wikisync/util.py @@ -222,7 +222,7 @@ def matches(self, name): class WebClient(object): - def __init__(self, baseurl, username=None, password=None, proxy=None, debug=False): + def __init__(self, baseurl, username=None, password=None, proxy=None, proxy_type=None, proxy_username=None, proxy_password=None, proxy_port=None, debug=False): assert isinstance(baseurl, basestring) and len(baseurl), \ "'baseurl' expects string, got '%s'" % baseurl if baseurl.endswith("/"): @@ -235,6 +235,10 @@ def __init__(self, baseurl, username=None, password=None, proxy=None, debug=Fals self._opener = None self._authenticated = False self.proxy = proxy + self.proxy_type = proxy_type + self.proxy_username = proxy_username + self.proxy_password = proxy_password + self.proxy_port = proxy_port def open(self, path, data=None, method="GET"): self.authenticate() @@ -251,7 +255,14 @@ def open(self, path, data=None, method="GET"): self.authenticate() return self.opener().open(req, data) else: - raise e + print "=========================================================" + print "Code: %s" % e.code + print "Message: %s" % e.msg + print "Headers: %s" % e.headers + print e.fp.read() + print "=========================================================" + except Exception, e: + print "ERROR: %s" % e def opener(self, no_cache=False): if not self._opener: @@ -271,16 +282,22 @@ def opener(self, no_cache=False): if self.debug: handlers.append(urllib2.HTTPHandler(debuglevel=1)) if self.proxy: - import socks - import socket - split = self.proxy.split(":") - port = split.pop() - hostname = split[1].split("//")[1] - # port = 9050 - # hostname = '127.0.0.1' - socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS5, str(hostname), int(port)) - socket.socket = socks.socksocket - # handlers.append(urllib2.ProxyHandler({self.proxy_type or 'http': self.proxy})) + if self.proxy_type == 'socks': + import socks + import socket + socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS5, self.proxy, int(self.proxy_port)) + socket.socket = socks.socksocket + elif self.proxy_type == 'http': + if self.proxy_username and self.proxy_password: + proxy_cat = ':'.join([self.proxy, self.proxy_port]) # proxy concatenated + proxypassmgr = urllib2.HTTPPasswordMgrWithDefaultRealm() + proxypassmgr.add_password(None, proxy_cat, self.proxy_username, self.proxy_password) + authinfo = urllib2.ProxyBasicAuthHandler(proxypassmgr) + proxy_support = urllib2.ProxyHandler({"http" : proxy_cat}) + opener = urllib2.build_opener(proxy_support, authinfo) + urllib2.install_opener(opener) + handlers.append(proxy_support) + handlers.append(authinfo) if has_cookie: cookie_jar.load(ignore_discard=True) opener = urllib2.build_opener(*handlers) @@ -349,7 +366,7 @@ def pull(self, name, version=None): f = self.open("wiki/%s" % name, data, "GET") return safe_unicode(f.read()) - def push(self, name, text, comments=None): + def push(self, name, text, comments=None, author=None): data = { "action":"edit" } params = parse_form_params( self.open("wiki/%s" % name, data, "GET"), @@ -361,12 +378,16 @@ def push(self, name, text, comments=None): self.url(path)) params["text"] = text params["comment"] = self._format_comment(comments) + if author: + params["comment"] = params["comment"].replace("wikisync", author) info = parse_wiki( self.open("wiki/%s" % name, params, "POST"), self.basepath("wiki") ) if not info: raise RuntimeError("Unable to post data to remote server") + self._opener = None + self.test() return info[0] def _format_comment(self, comments=""):