def can_connect(data): try: opener = get_opener(data['id']) headers = { 'User-Agent': settings.USER_AGENT, 'X-Node-Protocol': settings.NODE_PROTOCOL, 'Accept-Encoding': 'gzip', } if ':' in data['host']: url = 'https://[{host}]:{port}'.format(**data) else: url = 'https://{host}:{port}'.format(**data) opener.addheaders = list(zip(headers.keys(), headers.values())) opener.timeout = 1 r = opener.open(url) version = r.headers.get('X-Node-Protocol', None) if version != settings.NODE_PROTOCOL: logger.debug('version does not match local: %s remote %s', settings.NODE_PROTOCOL, version) return False c = r.read() return True except: pass #logger.debug('failed to connect to local node %s', data, exc_info=1) return False
def get(vk): id = vk.to_ascii(encoding='base64').decode() url = '%s/%s' % (base, id) headers = { 'User-Agent': settings.USER_AGENT } try: opener = tor_request.get_opener() opener.addheaders = list(zip(headers.keys(), headers.values())) r = opener.open(url) except: logger.info('get failed %s', url, exc_info=1) return None sig = r.headers.get('X-Ed25519-Signature') data = r.read() if sig and data: vk = ed25519.VerifyingKey(id, encoding='base64') try: vk.verify(sig, data, encoding='base64') data = json.loads(data.decode('utf-8')) except ed25519.BadSignatureError: logger.debug('invalid signature') data = None return data
def __init__(self, nodes, user): self._nodes = nodes self.user_id = user.id self._opener = get_opener(self.user_id) self._q = Queue() Thread.__init__(self) self.daemon = True self.start() self._pull = PeriodicCallback(self.pull, 60000) self._pull.start() self.ping()
def migrate_id(self): key = self.user_id.encode() vk = ed25519.VerifyingKey(key, encoding=ENCODING) try: r = directory.get(vk) except: logger.debug('directory failed', exc_info=1) r = None if r and 'id' in r and len(r['id']) == 16: u = self.user self.user_id = r['id'] u.migrate_id(self.user_id) self._opener = get_opener(self.user_id)
def put(sk, data): id = sk.get_verifying_key().to_ascii(encoding='base64').decode() data = json.dumps(data).encode() sig = sk.sign(data, encoding='base64') url ='%s/%s' % (base, id) headers = { 'User-Agent': settings.USER_AGENT, 'X-Ed25519-Signature': sig } try: #r = requests.put(url, data, headers=headers, timeout=2) opener = tor_request.get_opener() opener.addheaders = list(zip(headers.keys(), headers.values())) r = opener.open(url, data) except: logger.info('put failed: %s', data, exc_info=1) return False return r.status == 200