zeronet/plugins/Zeroname/SiteManagerPlugin.py
Vadim Ushakov ea40d212c2 Allow using other domain resolver plugins along with Zeroname
Fixes several closely related bugs in Zeroname Plugin, those prevent correct work of other domain resolvers:

1. get(), isDomain(): when an address doesn't look like a valid domain, pass control to the next plugin in a chain.

3. Move the .bit-domain matching logic to a separate method isBitDomain().

2. get(), need(): use isBitDomain(), not isDomain() to check if domain resolving is needed in order to not interfere with other domain resolvers.

4. Also rewrite isAddress() to make it look similar to the new implementation of isDomain().
2018-10-06 12:35:14 +07:00

84 lines
3.2 KiB
Python

import logging
import re
import time
from Config import config
from Plugin import PluginManager
allow_reload = False # No reload supported
log = logging.getLogger("ZeronamePlugin")
@PluginManager.registerTo("SiteManager")
class SiteManagerPlugin(object):
site_zeroname = None
db_domains = None
db_domains_modified = None
def load(self, *args, **kwargs):
super(SiteManagerPlugin, self).load(*args, **kwargs)
if not self.get(config.bit_resolver):
self.need(config.bit_resolver) # Need ZeroName site
# Checks if it's a valid address
def isAddress(self, address):
return self.isBitDomain(address) or super(SiteManagerPlugin, self).isAddress(address)
# Return: True if the address is domain
def isDomain(self, address):
return self.isBitDomain(address) or super(SiteManagerPlugin, self).isDomain(address)
# Return: True if the address is .bit domain
def isBitDomain(self, address):
return re.match("(.*?)([A-Za-z0-9_-]+\.bit)$", address)
# Resolve domain
# Return: The address or None
def resolveDomain(self, domain):
domain = domain.lower()
if not self.site_zeroname:
self.site_zeroname = self.need(config.bit_resolver)
site_zeroname_modified = self.site_zeroname.content_manager.contents.get("content.json", {}).get("modified", 0)
if not self.db_domains or self.db_domains_modified != site_zeroname_modified:
self.site_zeroname.needFile("data/names.json", priority=10)
s = time.time()
self.db_domains = self.site_zeroname.storage.loadJson("data/names.json")
log.debug(
"Domain db with %s entries loaded in %.3fs (modification: %s -> %s)" %
(len(self.db_domains), time.time() - s, self.db_domains_modified, site_zeroname_modified)
)
self.db_domains_modified = site_zeroname_modified
return self.db_domains.get(domain)
# Return or create site and start download site files
# Return: Site or None if dns resolve failed
def need(self, address, *args, **kwargs):
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)
# Return: Site object or None if not found
def get(self, address):
if not self.loaded: # Not loaded yet
self.load()
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