diff --git a/src/Site/Site.py b/src/Site/Site.py index c7f8a20b..56b5dce3 100644 --- a/src/Site/Site.py +++ b/src/Site/Site.py @@ -150,13 +150,14 @@ class Site: return changed - def publisher(self,inner_path, peers, published, limit): + def publisher(self, inner_path, peers, published, limit): + timeout = 5+int(os.path.getsize(self.getPath(inner_path))/1024) # Timeout: 5sec + size in kb while 1: if not peers or len(published) >= limit: break # All peers done, or published engouht peer = peers.pop(0) result = {"exception": "Timeout"} try: - with gevent.Timeout(60, False): # 60 sec timeout + with gevent.Timeout(timeout, False): result = peer.sendCmd("update", { "site": self.address, "inner_path": inner_path, @@ -240,11 +241,11 @@ class Site: def announce(self, force=False): if time.time() < self.last_announce+15 and not force: return # No reannouncing within 15 secs self.last_announce = time.time() - error = 0 + errors = [] for protocol, ip, port in SiteManager.TRACKERS: if protocol == "udp": - self.log.debug("Announcing to %s://%s:%s..." % (protocol, ip, port)) + # self.log.debug("Announcing to %s://%s:%s..." % (protocol, ip, port)) tracker = UdpTrackerClient(ip, port) tracker.peer_port = config.fileserver_port try: @@ -254,7 +255,7 @@ class Site: back = tracker.poll_once() peers = back["response"]["peers"] except Exception, err: - error += 1 + errors.append("%s://%s:%s" % (protocol, ip, port)) continue added = 0 @@ -269,8 +270,8 @@ class Site: else: pass # TODO: http tracker support - if error < len(SiteManager.TRACKERS): # Less errors than total tracker nums - self.log.debug("Announced to %s trackers, error: %s" % (len(SiteManager.TRACKERS), error)) + if len(errors) < len(SiteManager.TRACKERS): # Less errors than total tracker nums + self.log.debug("Announced to %s trackers, errors: %s" % (len(SiteManager.TRACKERS), errors)) else: self.log.error("Announced to %s trackers, failed" % len(SiteManager.TRACKERS)) diff --git a/src/Ui/UiRequest.py b/src/Ui/UiRequest.py index 05444935..ce648ebf 100644 --- a/src/Ui/UiRequest.py +++ b/src/Ui/UiRequest.py @@ -1,4 +1,4 @@ -import time, re, os, mimetypes, json +import time, re, os, mimetypes, json, cgi from Config import config from Site import SiteManager from User import UserManager @@ -124,18 +124,24 @@ class UiRequest: self.sendHeader(extra_headers=[("X-Frame-Options", "DENY")]) # Wrapper variable inits - if self.env.get("QUERY_STRING"): - query_string = "?"+self.env["QUERY_STRING"] - else: - query_string = "" + query_string = "" body_style = "" - if site.content_manager.contents.get("content.json") and site.content_manager.contents["content.json"].get("background-color"): body_style += "background-color: "+site.content_manager.contents["content.json"]["background-color"]+";" + meta_tags = "" + + if self.env.get("QUERY_STRING"): query_string = "?"+self.env["QUERY_STRING"] + if site.content_manager.contents.get("content.json") : # Got content.json + content = site.content_manager.contents["content.json"] + if content.get("background-color"): + body_style += "background-color: "+cgi.escape(site.content_manager.contents["content.json"]["background-color"], True)+";" + if content.get("viewport"): + meta_tags += '' % cgi.escape(content["viewport"], True) return self.render("src/Ui/template/wrapper.html", inner_path=inner_path, address=match.group("site"), title=title, body_style=body_style, + meta_tags=meta_tags, query_string=query_string, wrapper_key=site.settings["wrapper_key"], permissions=json.dumps(site.settings["permissions"]), diff --git a/src/Ui/media/Wrapper.coffee b/src/Ui/media/Wrapper.coffee index 4cc8b0fb..36167c09 100644 --- a/src/Ui/media/Wrapper.coffee +++ b/src/Ui/media/Wrapper.coffee @@ -67,6 +67,8 @@ class Wrapper @actionWrapperConfirm(message) else if cmd == "wrapperPrompt" # Prompt input @actionWrapperPrompt(message) + else if cmd == "wrapperSetViewport" # Set the viewport + @actionSetViewport(message) else # Send to websocket @ws.send(message) # Pass message to websocket @@ -108,10 +110,20 @@ class Wrapper return false body.append(button) - @notifications.add("notification-#{message.id}", "ask", body) + actionSetViewport: (message) -> + @log "actionSetViewport", message + if $("#viewport").length > 0 + $("#viewport").attr("content", @toHtmlSafe message.params) + else + $('').attr("content", @toHtmlSafe message.params).appendTo("head") + + + # EOF actions + + onOpenWebsocket: (e) => @ws.cmd "channelJoin", {"channel": "siteChanged"} # Get info on modifications @log "onOpenWebsocket", @inner_ready, @wrapperWsInited @@ -200,8 +212,14 @@ class Wrapper @site_info = site_info - toHtmlSafe: (unsafe) -> - return unsafe + toHtmlSafe: (values) -> + if values not instanceof Array then values = [values] # Convert to array if its not + for value, i in values + value = String(value).replace(/&/g, '&').replace(//g, '>').replace(/"/g, '"') # Escape + value = value.replace(/<([\/]{0,1}(br|b|u|i))>/g, "<$1>") # Unescape b, i, u, br tags + values[i] = value + return values + log: (args...) -> diff --git a/src/Ui/media/all.js b/src/Ui/media/all.js index cb5fa543..37721640 100644 --- a/src/Ui/media/all.js +++ b/src/Ui/media/all.js @@ -799,6 +799,8 @@ jQuery.extend( jQuery.easing, return this.actionWrapperConfirm(message); } else if (cmd === "wrapperPrompt") { return this.actionWrapperPrompt(message); + } else if (cmd === "wrapperSetViewport") { + return this.actionSetViewport(message); } else { return this.ws.send(message); } @@ -862,6 +864,15 @@ jQuery.extend( jQuery.easing, return this.notifications.add("notification-" + message.id, "ask", body); }; + Wrapper.prototype.actionSetViewport = function(message) { + this.log("actionSetViewport", message); + if ($("#viewport").length > 0) { + return $("#viewport").attr("content", this.toHtmlSafe(message.params)); + } else { + return $('').attr("content", this.toHtmlSafe(message.params)).appendTo("head"); + } + }; + Wrapper.prototype.onOpenWebsocket = function(e) { this.ws.cmd("channelJoin", { "channel": "siteChanged" @@ -974,8 +985,18 @@ jQuery.extend( jQuery.easing, return this.site_info = site_info; }; - Wrapper.prototype.toHtmlSafe = function(unsafe) { - return unsafe; + Wrapper.prototype.toHtmlSafe = function(values) { + var i, value, _i, _len; + if (!(values instanceof Array)) { + values = [values]; + } + for (i = _i = 0, _len = values.length; _i < _len; i = ++_i) { + value = values[i]; + value = String(value).replace(/&/g, '&').replace(//g, '>').replace(/"/g, '"'); + value = value.replace(/<([\/]{0,1}(br|b|u|i))>/g, "<$1>"); + values[i] = value; + } + return values; }; Wrapper.prototype.log = function() { diff --git a/src/Ui/template/wrapper.html b/src/Ui/template/wrapper.html index b267f82f..95b9a525 100644 --- a/src/Ui/template/wrapper.html +++ b/src/Ui/template/wrapper.html @@ -7,6 +7,7 @@ + {meta_tags}