Forking what is left of ZeroNet and hopefully adding an AT Proto Frontend/Proxy
at main 90 lines 3.5 kB view raw
1import io 2import os 3import re 4import urllib 5 6from Plugin import PluginManager 7from Config import config 8from Translate import Translate 9 10plugin_dir = os.path.dirname(__file__) 11 12if "_" not in locals(): 13 _ = Translate(plugin_dir + "/languages/") 14 15 16@PluginManager.registerTo("UiRequest") 17class UiFileManagerPlugin(object): 18 def actionWrapper(self, path, extra_headers=None): 19 match = re.match("/list/(.*?)(/.*|)$", path) 20 if not match: 21 return super().actionWrapper(path, extra_headers) 22 23 if not extra_headers: 24 extra_headers = {} 25 26 request_address, inner_path = match.groups() 27 28 script_nonce = self.getScriptNonce() 29 30 self.sendHeader(extra_headers=extra_headers, script_nonce=script_nonce) 31 32 site = self.server.site_manager.need(request_address) 33 34 if not site: 35 return super().actionWrapper(path, extra_headers) 36 37 request_params = urllib.parse.urlencode( 38 {"address": site.address, "site": request_address, "inner_path": inner_path.strip("/")} 39 ) 40 41 is_content_loaded = "content.json" in site.content_manager.contents 42 43 return iter([super().renderWrapper( 44 site, path, "uimedia/plugins/uifilemanager/list.html?%s" % request_params, 45 "List", extra_headers, show_loadingscreen=not is_content_loaded, script_nonce=script_nonce 46 )]) 47 48 def actionUiMedia(self, path, *args, **kwargs): 49 if path.startswith("/uimedia/plugins/uifilemanager/"): 50 file_path = path.replace("/uimedia/plugins/uifilemanager/", plugin_dir + "/media/") 51 if config.debug and (file_path.endswith("all.js") or file_path.endswith("all.css")): 52 # If debugging merge *.css to all.css and *.js to all.js 53 from Debug import DebugMedia 54 DebugMedia.merge(file_path) 55 56 if file_path.endswith("js"): 57 data = _.translateData(open(file_path).read(), mode="js").encode("utf8") 58 elif file_path.endswith("html"): 59 if self.get.get("address"): 60 site = self.server.site_manager.need(self.get.get("address")) 61 if "content.json" not in site.content_manager.contents: 62 site.needFile("content.json") 63 data = _.translateData(open(file_path).read(), mode="html").encode("utf8") 64 else: 65 data = open(file_path, "rb").read() 66 67 return self.actionFile(file_path, file_obj=io.BytesIO(data), file_size=len(data)) 68 else: 69 return super().actionUiMedia(path) 70 71 def error404(self, path=""): 72 if not path.endswith("index.html") and not path.endswith("/"): 73 return super().error404(path) 74 75 path_parts = self.parsePath(path) 76 if not path_parts: 77 return super().error404(path) 78 79 site = self.server.site_manager.get(path_parts["request_address"]) 80 81 if not site or not site.content_manager.contents.get("content.json"): 82 return super().error404(path) 83 84 if path_parts["inner_path"] in site.content_manager.contents.get("content.json").get("files", {}): 85 return super().error404(path) 86 87 self.sendHeader(200) 88 path_redirect = "/list" + re.sub("^/media/", "/", path) 89 self.log.debug("Index.html not found: %s, redirecting to: %s" % (path, path_redirect)) 90 return self.formatRedirect(path_redirect)