| 30 | |
| 31 | @PluginManager.acceptPlugins |
| 32 | class Site(object): |
| 33 | |
| 34 | def __init__(self, address, allow_create=True, settings=None): |
| 35 | self.address = str(re.sub("[^A-Za-z0-9]", "", address)) # Make sure its correct address |
| 36 | self.address_hash = hashlib.sha256(self.address.encode("ascii")).digest() |
| 37 | self.address_sha1 = hashlib.sha1(self.address.encode("ascii")).digest() |
| 38 | self.address_short = "%s..%s" % (self.address[:6], self.address[-4:]) # Short address for logging |
| 39 | self.log = logging.getLogger("Site:%s" % self.address_short) |
| 40 | self.addEventListeners() |
| 41 | |
| 42 | self.content = None # Load content.json |
| 43 | self.peers = {} # Key: ip:port, Value: Peer.Peer |
| 44 | self.peers_recent = collections.deque(maxlen=100) |
| 45 | self.peer_blacklist = SiteManager.peer_blacklist # Ignore this peers (eg. myself) |
| 46 | self.worker_manager = WorkerManager(self) # Handle site download from other peers |
| 47 | self.bad_files = {} # SHA check failed files, need to redownload {"inner.content": 1} (key: file, value: failed accept) |
| 48 | self.content_updated = None # Content.js update time |
| 49 | self.notifications = [] # Pending notifications displayed once on page load [error|ok|info, message, timeout] |
| 50 | self.page_requested = False # Page viewed in browser |
| 51 | self.websockets = [] # Active site websocket connections |
| 52 | |
| 53 | self.connection_server = None |
| 54 | self.loadSettings(settings) # Load settings from sites.json |
| 55 | self.storage = SiteStorage(self, allow_create=allow_create) # Save and load site files |
| 56 | self.content_manager = ContentManager(self) |
| 57 | self.content_manager.loadContents() # Load content.json files |
| 58 | if "main" in sys.modules: # import main has side-effects, breaks tests |
| 59 | import main |
| 60 | if "file_server" in dir(main): # Use global file server by default if possible |
| 61 | self.connection_server = main.file_server |
| 62 | else: |
| 63 | main.file_server = FileServer() |
| 64 | self.connection_server = main.file_server |
| 65 | else: |
| 66 | self.connection_server = FileServer() |
| 67 | |
| 68 | self.announcer = SiteAnnouncer(self) # Announce and get peer list from other nodes |
| 69 | |
| 70 | if not self.settings.get("auth_key"): # To auth user in site (Obsolete, will be removed) |
| 71 | self.settings["auth_key"] = CryptHash.random() |
| 72 | self.log.debug("New auth key: %s" % self.settings["auth_key"]) |
| 73 | |
| 74 | if not self.settings.get("wrapper_key"): # To auth websocket permissions |
| 75 | self.settings["wrapper_key"] = CryptHash.random() |
| 76 | self.log.debug("New wrapper key: %s" % self.settings["wrapper_key"]) |
| 77 | |
| 78 | if not self.settings.get("ajax_key"): # To auth websocket permissions |
| 79 | self.settings["ajax_key"] = CryptHash.random() |
| 80 | self.log.debug("New ajax key: %s" % self.settings["ajax_key"]) |
| 81 | |
| 82 | def __str__(self): |
| 83 | return "Site %s" % self.address_short |
| 84 | |
| 85 | def __repr__(self): |
| 86 | return "<%s>" % self.__str__() |
| 87 | |
| 88 | # Load site settings from data/sites.json |
| 89 | def loadSettings(self, settings=None): |
no outgoing calls