Forking what is left of ZeroNet and hopefully adding an AT Proto Frontend/Proxy
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)