diff --git a/plugins/ZeronameLocal/SiteManagerPlugin.py b/plugins/ZeronameLocal/SiteManagerPlugin.py new file mode 100644 index 00000000..54c06eef --- /dev/null +++ b/plugins/ZeronameLocal/SiteManagerPlugin.py @@ -0,0 +1,133 @@ +import logging, json, os, re, sys, time, requests +import gevent +from Plugin import PluginManager +from Config import config +from Debug import Debug + +allow_reload = False # No reload supported + +log = logging.getLogger("ZeronameLocalPlugin") + + +@PluginManager.registerTo("SiteManager") +class SiteManagerPlugin(object): + + def load(self, *args, **kwargs): + super(SiteManagerPlugin, self).load(*args, **kwargs) + self.url = "http://%(host)s:%(port)s" % {"host": config.namecoin_host, "port": config.namecoin_rpcport} + self.cache = dict() + + # Checks if it's a valid address + def isAddress(self, address): + print("ISADDRESS") + return self.isBitDomain(address) or super(SiteManagerPlugin, self).isAddress(address) + + # Return: True if the address is domain + def isDomain(self, address): + print("ISDOMAIN : ", address) + return self.isBitDomain(address) or super(SiteManagerPlugin, self).isDomain(address) + + # Return: True if the address is .bit domain + def isBitDomain(self, address): + print("ISBITDOMAIN : ", address) + return re.match(r"(.*?)([A-Za-z0-9_-]+\.bit)$", address) + + # Return: Site object or None if not found + def get(self, address): + print("GET : ", address) + if self.isBitDomain(address): # Its looks like a domain + address_resolved = self.resolveDomain(address) + if address_resolved: # Domain found + site = self.sites.get(address_resolved) + if site: + site_domain = site.settings.get("domain") + if site_domain != address: + site.settings["domain"] = address + else: # Domain not found + site = self.sites.get(address) + + else: # Access by site address + site = super(SiteManagerPlugin, self).get(address) + return site + + # Return or create site and start download site files + # Return: Site or None if dns resolve failed + def need(self, address, *args, **kwargs): + print("NEED : ", address) + if self.isBitDomain(address): # Its looks like a domain + address_resolved = self.resolveDomain(address) + if address_resolved: + address = address_resolved + else: + return None + + return super(SiteManagerPlugin, self).need(address, *args, **kwargs) + + # Resolve domain + # Return: The address or None + def resolveDomain(self, domain): + print("RESOLVEDOMAIN : ", domain) + domain = domain.lower() + + #remove .bit on end + if domain[-4:] == ".bit": + domain = domain[0:-4] + + domain_array = domain.split(".") + + if len(domain_array) > 2: + raise Error("Too many subdomains! Can only handle one level (eg. staging.mixtape.bit)") + + subdomain = "" + if len(domain_array) == 1: + domain = domain_array[0] + else: + subdomain = domain_array[0] + domain = domain_array[1] + + print(domain) + + if domain in self.cache: + delta = time.time() - self.cache[domain]["time"] + if delta < 3600: + # Must have been less than 1hour + return self.cache[domain]["addresses_resolved"][subdomain] + + payload = json.dumps({ + "jsonrpc": "2.0", + "id": "zeronet", + "method": "name_show", + "params": ["d/"+domain] + }) + + try: + #domain_object = self.rpc.name_show("d/"+domain) + response = requests.post(self.url, auth=(config.namecoin_rpcuser, config.namecoin_rpcpassword), data=payload) + print(response) + domain_object = response.json()["result"] + except Exception as err: + #domain doesn't exist + print("FAILED TO RESOLVE NAME : ", err) + return None + + print(domain_object) + if "zeronet" in domain_object["value"]: + # Has a subdomain? + zeronet_domains = json.loads(domain_object["value"])["zeronet"] + + self.cache[domain] = {"addresses_resolved": zeronet_domains, "time": time.time()} + + print(self.cache[domain]) + + return self.cache[domain]["addresses_resolved"][subdomain] + +@PluginManager.registerTo("ConfigPlugin") +class ConfigPlugin(object): + def createArguments(self): + group = self.parser.add_argument_group("Zeroname Local plugin") + group.add_argument('--namecoin_host', help="Host to namecoin node (eg. 127.0.0.1)") + group.add_argument('--namecoin_rpcport', help="Port to connect (eg. 8336)") + group.add_argument('--namecoin_rpcuser', help="RPC user to connect to the namecoin node (eg. nofish)") + group.add_argument('--namecoin_rpcpassword', help="RPC password to connect to namecoin node") + + return super(ConfigPlugin, self).createArguments() diff --git a/plugins/ZeronameLocal/UiRequestPlugin.py b/plugins/ZeronameLocal/UiRequestPlugin.py new file mode 100644 index 00000000..0ccfb530 --- /dev/null +++ b/plugins/ZeronameLocal/UiRequestPlugin.py @@ -0,0 +1,39 @@ +import re +from Plugin import PluginManager + +@PluginManager.registerTo("UiRequest") +class UiRequestPlugin(object): + def __init__(self, *args, **kwargs): + from Site import SiteManager + self.site_manager = SiteManager.site_manager + super(UiRequestPlugin, self).__init__(*args, **kwargs) + + + # Media request + def actionSiteMedia(self, path): + match = re.match(r"/media/(?P
[A-Za-z0-9-]+\.[A-Za-z0-9\.-]+)(?P/.*|$)", path) + if match: # Its a valid domain, resolve first + domain = match.group("address") + address = self.site_manager.resolveDomain(domain) + if address: + path = "/media/"+address+match.group("inner_path") + return super(UiRequestPlugin, self).actionSiteMedia(path) # Get the wrapper frame output + + + # Is mediarequest allowed from that referer + def isMediaRequestAllowed(self, site_address, referer): + referer_path = re.sub("http[s]{0,1}://.*?/", "/", referer).replace("/media", "") # Remove site address + referer_path = re.sub(r"\?.*", "", referer_path) # Remove http params + + if self.isProxyRequest(): # Match to site domain + referer = re.sub("^http://zero[/]+", "http://", referer) # Allow /zero access + referer_site_address = re.match("http[s]{0,1}://(.*?)(/|$)", referer).group(1) + else: # Match to request path + referer_site_address = re.match(r"/(?P
[A-Za-z0-9\.-]+)(?P/.*|$)", referer_path).group("address") + + if referer_site_address == site_address: # Referer site address as simple address + return True + elif self.site_manager.resolveDomain(referer_site_address) == site_address: # Referer site address as dns + return True + else: # Invalid referer + return False diff --git a/plugins/ZeronameLocal/__init__.py b/plugins/ZeronameLocal/__init__.py new file mode 100644 index 00000000..cf724069 --- /dev/null +++ b/plugins/ZeronameLocal/__init__.py @@ -0,0 +1,2 @@ +from . import UiRequestPlugin +from . import SiteManagerPlugin \ No newline at end of file