Change to Python3 coding style

This commit is contained in:
shortcutme 2019-03-15 21:06:59 +01:00
parent fc0fe0557b
commit b0b9a4d33c
No known key found for this signature in database
GPG key ID: 5B63BAE6CB9613AE
137 changed files with 910 additions and 913 deletions

View file

@ -3,7 +3,8 @@ import re
import os
import mimetypes
import json
import cgi
import html
import urllib
import gevent
@ -157,7 +158,8 @@ class UiRequest(object):
if func:
return func()
else:
return self.error404(path)
ret = self.error404(path)
return ret
# The request is proxied by chrome extension or a transparent proxy
def isProxyRequest(self):
@ -190,7 +192,7 @@ class UiRequest(object):
# Return: <dict> Posted variables
def getPosted(self):
if self.env['REQUEST_METHOD'] == "POST":
return dict(cgi.parse_qsl(
return dict(urllib.parse.parse_qsl(
self.env['wsgi.input'].readline().decode()
))
else:
@ -200,7 +202,7 @@ class UiRequest(object):
def getCookies(self):
raw_cookies = self.env.get('HTTP_COOKIE')
if raw_cookies:
cookies = cgi.parse_qsl(raw_cookies)
cookies = urllib.parse.parse_qsl(raw_cookies)
return {key.strip(): val for key, val in cookies}
else:
return {}
@ -282,12 +284,12 @@ class UiRequest(object):
headers["Cache-Control"] = "no-cache, no-store, private, must-revalidate, max-age=0" # No caching at all
headers["Content-Type"] = content_type
headers.update(extra_headers)
return self.start_response(status_texts[status], headers.items())
return self.start_response(status_texts[status], list(headers.items()))
# Renders a template
def render(self, template_path, *args, **kwargs):
template = open(template_path).read()
for key, val in kwargs.items():
for key, val in list(kwargs.items()):
template = template.replace("{%s}" % key, "%s" % val)
return template.encode("utf8")
@ -296,7 +298,7 @@ class UiRequest(object):
# Redirect to an url
def actionRedirect(self, url):
self.start_response('301 Redirect', [('Location', str(url))])
yield "Location changed: %s" % url
yield b"Location changed: %s" % url.encode("utf8")
def actionIndex(self):
return self.actionRedirect("/" + config.homepage)
@ -447,11 +449,11 @@ class UiRequest(object):
content = site.content_manager.contents["content.json"]
if content.get("background-color"):
background_color = content.get("background-color-%s" % theme, content["background-color"])
body_style += "background-color: %s;" % cgi.escape(background_color, True)
body_style += "background-color: %s;" % html.escape(background_color)
if content.get("viewport"):
meta_tags += '<meta name="viewport" id="viewport" content="%s">' % cgi.escape(content["viewport"], True)
meta_tags += '<meta name="viewport" id="viewport" content="%s">' % html.escape(content["viewport"])
if content.get("favicon"):
meta_tags += '<link rel="icon" href="%s%s">' % (root_url, cgi.escape(content["favicon"], True))
meta_tags += '<link rel="icon" href="%s%s">' % (root_url, html.escape(content["favicon"]))
if content.get("postmessage_nonce_security"):
postmessage_nonce_security = "true"
@ -470,7 +472,7 @@ class UiRequest(object):
file_url=re.escape(file_url),
file_inner_path=re.escape(file_inner_path),
address=site.address,
title=cgi.escape(title, True),
title=html.escape(title),
body_style=body_style,
meta_tags=meta_tags,
query_string=re.escape(inner_query_string),
@ -612,7 +614,7 @@ class UiRequest(object):
return self.error400()
def actionSiteAdd(self):
post = dict(cgi.parse_qsl(self.env["wsgi.input"].read()))
post = dict(urllib.parse.parse_qsl(self.env["wsgi.input"].read()))
if post["add_nonce"] not in self.server.add_nonces:
return self.error403("Add nonce error.")
self.server.add_nonces.remove(post["add_nonce"])
@ -626,7 +628,7 @@ class UiRequest(object):
self.sendHeader(200, "text/html", noscript=True)
template = open("src/Ui/template/site_add.html").read()
template = template.replace("{url}", cgi.escape(self.env["PATH_INFO"], True))
template = template.replace("{url}", html.escape(self.env["PATH_INFO"]))
template = template.replace("{address}", path_parts["address"])
template = template.replace("{add_nonce}", self.getAddNonce())
return template
@ -634,7 +636,7 @@ class UiRequest(object):
def replaceHtmlVariables(self, block, path_parts):
user = self.getCurrentUser()
themeclass = "theme-%-6s" % re.sub("[^a-z]", "", user.settings.get("theme", "light"))
block = block.replace("{themeclass}", themeclass.encode("utf8"))
block = block.replace(b"{themeclass}", themeclass.encode("utf8"))
if path_parts:
site = self.server.sites.get(path_parts.get("address"))
@ -642,7 +644,7 @@ class UiRequest(object):
modified = int(time.time())
else:
modified = int(site.content_manager.contents["content.json"]["modified"])
block = block.replace("{site_modified}", str(modified))
block = block.replace(b"{site_modified}", str(modified).encode("utf8"))
return block
@ -708,14 +710,14 @@ class UiRequest(object):
wrapper_key = self.get["wrapper_key"]
# Find site by wrapper_key
site = None
for site_check in self.server.sites.values():
for site_check in list(self.server.sites.values()):
if site_check.settings["wrapper_key"] == wrapper_key:
site = site_check
if site: # Correct wrapper key
try:
user = self.getCurrentUser()
except Exception, err:
except Exception as err:
self.log.error("Error in data/user.json: %s" % err)
return self.error500()
if not user:
@ -726,7 +728,7 @@ class UiRequest(object):
self.server.websockets.append(ui_websocket)
ui_websocket.start()
self.server.websockets.remove(ui_websocket)
for site_check in self.server.sites.values():
for site_check in list(self.server.sites.values()):
# Remove websocket from every site (admin sites allowed to join other sites event channels)
if ui_websocket in site_check.websockets:
site_check.websockets.remove(ui_websocket)
@ -744,10 +746,10 @@ class UiRequest(object):
import sys
last_error = sys.modules["main"].DebugHook.last_error
if last_error:
raise last_error[0], last_error[1], last_error[2]
raise last_error[0](last_error[1]).with_traceback(last_error[2])
else:
self.sendHeader()
return "No error! :)"
return [b"No error! :)"]
# Just raise an error to get console
def actionConsole(self):
@ -793,19 +795,19 @@ class UiRequest(object):
# Send file not found error
def error404(self, path=""):
self.sendHeader(404)
return self.formatError("Not Found", cgi.escape(path.encode("utf8")), details=False)
return self.formatError("Not Found", html.escape(path), details=False)
# Internal server error
def error500(self, message=":("):
self.sendHeader(500)
return self.formatError("Server error", cgi.escape(message))
return self.formatError("Server error", html.escape(message))
def formatError(self, title, message, details=True):
import sys
import gevent
if details:
details = {key: val for key, val in self.env.items() if hasattr(val, "endswith") and "COOKIE" not in key}
details = {key: val for key, val in list(self.env.items()) if hasattr(val, "endswith") and "COOKIE" not in key}
details["version_zeronet"] = "%s r%s" % (config.version, config.rev)
details["version_python"] = sys.version
details["version_gevent"] = gevent.__version__

View file

@ -7,12 +7,13 @@ import gevent
from gevent.pywsgi import WSGIServer
from gevent.pywsgi import WSGIHandler
from lib.geventwebsocket.handler import WebSocketHandler
from geventwebsocket.handler import WebSocketHandler
from UiRequest import UiRequest
from .UiRequest import UiRequest
from Site import SiteManager
from Config import config
from Debug import Debug
import importlib
# Skip websocket handler if not necessary
@ -30,7 +31,7 @@ class UiWSGIHandler(WSGIHandler):
ws_handler = WebSocketHandler(*self.args, **self.kwargs)
ws_handler.__dict__ = self.__dict__ # Match class variables
ws_handler.run_application()
except Exception, err:
except Exception as err:
logging.error("UiWSGIHandler websocket error: %s" % Debug.formatException(err))
if config.debug: # Allow websocket errors to appear on /Debug
import sys
@ -38,7 +39,7 @@ class UiWSGIHandler(WSGIHandler):
else: # Standard HTTP request
try:
super(UiWSGIHandler, self).run_application()
except Exception, err:
except Exception as err:
logging.error("UiWSGIHandler error: %s" % Debug.formatException(err))
if config.debug: # Allow websocket errors to appear on /Debug
import sys
@ -101,7 +102,7 @@ class UiServer:
else: # Catch and display the error
try:
return ui_request.route(path)
except Exception, err:
except Exception as err:
logging.debug("UiRequest error: %s" % Debug.formatException(err))
return ui_request.error500("Err: %s" % Debug.formatException(err))
@ -110,8 +111,8 @@ class UiServer:
global UiRequest
import imp
import sys
reload(sys.modules["User.UserManager"])
reload(sys.modules["Ui.UiWebsocket"])
importlib.reload(sys.modules["User.UserManager"])
importlib.reload(sys.modules["Ui.UiWebsocket"])
UiRequest = imp.load_source("UiRequest", "src/Ui/UiRequest.py").UiRequest
# UiRequest.reload()
@ -128,7 +129,7 @@ class UiServer:
try:
from werkzeug.debug import DebuggedApplication
handler = DebuggedApplication(self.handleRequest, evalex=True)
except Exception, err:
except Exception as err:
self.log.info("%s: For debugging please download Werkzeug (http://werkzeug.pocoo.org/)" % err)
from Debug import DebugReloader
self.log.write = lambda msg: self.log.debug(msg.strip()) # For Wsgi access.log
@ -147,14 +148,14 @@ class UiServer:
url = "http://%s:%s/%s" % (config.ui_ip if config.ui_ip != "*" else "127.0.0.1", config.ui_port, config.homepage)
gevent.spawn_later(0.3, browser.open, url, new=2)
except Exception as err:
print "Error starting browser: %s" % err
print("Error starting browser: %s" % err)
self.server = WSGIServer((self.ip, self.port), handler, handler_class=UiWSGIHandler, log=self.log)
self.server.sockets = {}
self.afterStarted()
try:
self.server.serve_forever()
except Exception, err:
except Exception as err:
self.log.error("Web interface bind error, must be running already, exiting.... %s" % err)
sys.modules["main"].file_server.stop()
self.log.debug("Stopped.")
@ -163,18 +164,18 @@ class UiServer:
self.log.debug("Stopping...")
# Close WS sockets
if "clients" in dir(self.server):
for client in self.server.clients.values():
for client in list(self.server.clients.values()):
client.ws.close()
# Close http sockets
sock_closed = 0
for sock in self.server.sockets.values():
for sock in list(self.server.sockets.values()):
try:
sock.send("bye")
sock.send(b"bye")
sock.shutdown(socket.SHUT_RDWR)
# sock._sock.close()
# sock.close()
sock_closed += 1
except Exception, err:
except Exception as err:
self.log.debug("Http connection close error: %s" % err)
self.log.debug("Socket closed: %s" % sock_closed)
time.sleep(0.1)

View file

@ -55,7 +55,7 @@ class UiWebsocket(object):
else:
try:
self.addHomepageNotifications()
except Exception, err:
except Exception as err:
self.log.error("Uncaught Exception: " + Debug.formatException(err))
for notification in self.site.notifications: # Send pending notification messages
@ -73,7 +73,7 @@ class UiWebsocket(object):
break
else:
message = ws.receive()
except Exception, err:
except Exception as err:
self.log.error("WebSocket receive error: %s" % Debug.formatException(err))
break
@ -81,7 +81,7 @@ class UiWebsocket(object):
try:
req = json.loads(message)
self.handleRequest(req)
except Exception, err:
except Exception as err:
if config.debug: # Allow websocket errors to appear on /Debug
sys.modules["main"].DebugHook.handleError()
self.log.error("WebSocket handleRequest error: %s \n %s" % (Debug.formatException(err), message))
@ -99,7 +99,7 @@ class UiWebsocket(object):
if ("0.0.0.0" == bind_ip or "*" == bind_ip) and (not whitelist):
self.site.notifications.append([
"error",
_(u"You are not going to set up a public gateway. However, <b>your Web UI is<br>" +
_("You are not going to set up a public gateway. However, <b>your Web UI is<br>" +
"open to the whole Internet.</b> " +
"Please check your configuration.")
])
@ -114,7 +114,7 @@ class UiWebsocket(object):
elif config.tor == "always" and file_server.tor_manager.start_onions:
self.site.notifications.append([
"done",
_(u"""
_("""
{_[Tor mode active, every connection using Onion route.]}<br>
{_[Successfully started Tor onion hidden services.]}
"""),
@ -123,7 +123,7 @@ class UiWebsocket(object):
elif config.tor == "always" and file_server.tor_manager.start_onions is not False:
self.site.notifications.append([
"error",
_(u"""
_("""
{_[Tor mode active, every connection using Onion route.]}<br>
{_[Unable to start hidden services, please check your config.]}
"""),
@ -132,7 +132,7 @@ class UiWebsocket(object):
elif file_server.tor_manager.start_onions:
self.site.notifications.append([
"done",
_(u"""
_("""
{_[Successfully started Tor onion hidden services.]}<br>
{_[For faster connections open <b>{0}</b> port on your router.]}
""").format(config.fileserver_port),
@ -141,7 +141,7 @@ class UiWebsocket(object):
else:
self.site.notifications.append([
"error",
_(u"""
_("""
{_[Your connection is restricted. Please, open <b>{0}</b> port on your router]}<br>
{_[or configure Tor to become a full member of the ZeroNet network.]}
""").format(config.fileserver_port),
@ -213,7 +213,7 @@ class UiWebsocket(object):
message = self.send_queue.pop(0)
self.ws.send(json.dumps(message))
self.state["sending"] = False
except Exception, err:
except Exception as err:
self.log.debug("Websocket send error: %s" % Debug.formatException(err))
self.state["sending"] = False
@ -230,7 +230,7 @@ class UiWebsocket(object):
result = func(*args, **kwargs)
if result is not None:
self.response(args[0], result)
except Exception, err:
except Exception as err:
if config.debug: # Allow websocket errors to appear on /Debug
sys.modules["main"].DebugHook.handleError()
self.log.error("WebSocket handleRequest error: %s" % Debug.formatException(err))
@ -403,14 +403,14 @@ class UiWebsocket(object):
def actionAnnouncerStats(self, to):
back = {}
trackers = self.site.announcer.getTrackers()
for site in self.server.sites.values():
for tracker, stats in site.announcer.stats.iteritems():
for site in list(self.server.sites.values()):
for tracker, stats in site.announcer.stats.items():
if tracker not in trackers:
continue
if tracker not in back:
back[tracker] = {}
is_latest_data = bool(stats["time_request"] > back[tracker].get("time_request", 0) and stats["status"])
for key, val in stats.iteritems():
for key, val in stats.items():
if key.startswith("num_"):
back[tracker][key] = back[tracker].get(key, 0) + val
elif is_latest_data:
@ -548,7 +548,7 @@ class UiWebsocket(object):
if notification:
self.cmd("notification", [
"info",
_(u"""{_[Your network connection is restricted. Please, open <b>{0}</b> port]}<br>
_("""{_[Your network connection is restricted. Please, open <b>{0}</b> port]}<br>
{_[on your router to make your site accessible for everyone.]}""").format(config.fileserver_port)
])
if callback:
@ -580,7 +580,7 @@ class UiWebsocket(object):
self.cmd(
"confirm",
[_["This file still in sync, if you write it now, then the previous content may be lost."], _["Write content anyway"]],
lambda (res): self.actionFileWrite(to, inner_path, content_base64, ignore_bad_files=True)
lambda res: self.actionFileWrite(to, inner_path, content_base64, ignore_bad_files=True)
)
return False
@ -601,7 +601,7 @@ class UiWebsocket(object):
shutil.copyfileobj(f_old, f_new)
self.site.storage.write(inner_path, content)
except Exception, err:
except Exception as err:
self.log.error("File write error: %s" % Debug.formatException(err))
return self.response(to, {"error": "Write error: %s" % Debug.formatException(err)})
@ -636,7 +636,7 @@ class UiWebsocket(object):
if need_delete:
try:
self.site.storage.delete(inner_path)
except Exception, err:
except Exception as err:
self.log.error("File delete error: %s" % err)
return self.response(to, {"error": "Delete error: %s" % err})
@ -676,7 +676,7 @@ class UiWebsocket(object):
rows = []
try:
res = self.site.storage.query(query, params)
except Exception, err: # Response the error to client
except Exception as err: # Response the error to client
self.log.error("DbQuery error: %s" % err)
return self.response(to, {"error": str(err)})
# Convert result to dict
@ -693,7 +693,7 @@ class UiWebsocket(object):
with gevent.Timeout(timeout):
self.site.needFile(inner_path, priority=6)
body = self.site.storage.read(inner_path, "rb")
except Exception, err:
except Exception as err:
self.log.error("%s fileGet error: %s" % (inner_path, err))
body = None
if body and format == "base64":
@ -705,7 +705,7 @@ class UiWebsocket(object):
try:
with gevent.Timeout(timeout):
self.site.needFile(inner_path, priority=6)
except Exception, err:
except Exception as err:
return self.response(to, {"error": str(err)})
return self.response(to, "ok")
@ -725,7 +725,7 @@ class UiWebsocket(object):
rules = self.site.content_manager.getRules(inner_path, content)
if inner_path.endswith("content.json") and rules:
if content:
rules["current_size"] = len(json.dumps(content)) + sum([file["size"] for file in content.get("files", {}).values()])
rules["current_size"] = len(json.dumps(content)) + sum([file["size"] for file in list(content.get("files", {}).values())])
else:
rules["current_size"] = 0
return self.response(to, rules)
@ -749,11 +749,11 @@ class UiWebsocket(object):
self.cmd(
"confirm",
[body, _("Change it to {auth_type}/{auth_user_name}@{domain}")],
lambda (res): self.cbCertAddConfirm(to, domain, auth_type, auth_user_name, cert)
lambda res: self.cbCertAddConfirm(to, domain, auth_type, auth_user_name, cert)
)
else:
self.response(to, "Not changed")
except Exception, err:
except Exception as err:
self.log.error("CertAdd error: Exception - %s (%s)" % (err.message, Debug.formatException(err)))
self.response(to, {"error": err.message})
@ -781,7 +781,7 @@ class UiWebsocket(object):
if not accepted_domains and not accepted_pattern: # Accept any if no filter defined
accept_any = True
for domain, cert in self.user.certs.items():
for domain, cert in list(self.user.certs.items()):
if auth_address == cert["auth_address"] and domain == site_data.get("cert"):
active = domain
title = cert["auth_user_name"] + "@" + domain
@ -797,7 +797,7 @@ class UiWebsocket(object):
for domain, account, css_class in accounts:
if domain == active:
css_class += " active" # Currently selected option
title = _(u"<b>%s</b> <small>({_[currently selected]})</small>") % account
title = _("<b>%s</b> <small>({_[currently selected]})</small>") % account
else:
title = "<b>%s</b>" % account
body += "<a href='#Select+account' class='select select-close cert %s' title='%s'>%s</a>" % (css_class, domain, title)
@ -807,7 +807,7 @@ class UiWebsocket(object):
# body+= "<small style='margin-top: 10px; display: block'>Accepted authorization providers by the site:</small>"
body += "<div style='background-color: #F7F7F7; margin-right: -30px'>"
for domain in more_domains:
body += _(u"""
body += _("""
<a href='/{domain}' target='_top' class='select'>
<small style='float: right; margin-right: 40px; margin-top: -1px'>{_[Register]} &raquo;</small>{domain}
</a>
@ -858,7 +858,7 @@ class UiWebsocket(object):
def actionCertList(self, to):
back = []
auth_address = self.user.getAuthAddress(self.site.address)
for domain, cert in self.user.certs.items():
for domain, cert in list(self.user.certs.items()):
back.append({
"auth_address": cert["auth_address"],
"auth_type": cert["auth_type"],
@ -872,7 +872,7 @@ class UiWebsocket(object):
def actionSiteList(self, to, connecting_sites=False):
ret = []
SiteManager.site_manager.load() # Reload sites
for site in self.server.sites.values():
for site in list(self.server.sites.values()):
if not site.content_manager.contents.get("content.json") and not connecting_sites:
continue # Incomplete site
ret.append(self.formatSiteInfo(site, create_user=False)) # Dont generate the auth_address on listing
@ -883,7 +883,7 @@ class UiWebsocket(object):
if channel not in self.channels: # Add channel to channels
self.channels.append(channel)
for site in self.server.sites.values(): # Add websocket to every channel
for site in list(self.server.sites.values()): # Add websocket to every channel
if self not in site.websockets:
site.websockets.append(self)
@ -970,7 +970,7 @@ class UiWebsocket(object):
site = self.server.sites.get(address)
if site.bad_files:
for bad_inner_path in site.bad_files.keys():
for bad_inner_path in list(site.bad_files.keys()):
is_user_file = "cert_signers" in site.content_manager.getRules(bad_inner_path)
if not is_user_file:
self.cmd("notification", ["error", _["Clone error: Site still in sync"]])
@ -982,7 +982,7 @@ class UiWebsocket(object):
self.cmd(
"confirm",
[_["Clone site <b>%s</b>?"] % address, _["Clone"]],
lambda (res): self.cbSiteClone(to, address, root_inner_path, target_address)
lambda res: self.cbSiteClone(to, address, root_inner_path, target_address)
)
def actionSiteSetLimit(self, to, size_limit):
@ -1013,7 +1013,7 @@ class UiWebsocket(object):
min_mtime = self.site.settings["cache"].get("time_modified_files_check")
modified_files = self.site.settings["cache"].get("modified_files", [])
inner_paths = [content_inner_path] + content.get("includes", {}).keys() + content.get("files", {}).keys()
inner_paths = [content_inner_path] + list(content.get("includes", {}).keys()) + list(content.get("files", {}).keys())
for relative_inner_path in inner_paths:
inner_path = helper.getDirname(content_inner_path) + relative_inner_path

View file

@ -1,3 +1,3 @@
from UiServer import UiServer
from UiRequest import UiRequest
from UiWebsocket import UiWebsocket
from .UiServer import UiServer
from .UiRequest import UiRequest
from .UiWebsocket import UiWebsocket