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
Beispiel #2
0
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
Beispiel #3
0
 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()
Beispiel #4
0
 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()
Beispiel #5
0
 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)
Beispiel #6
0
 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)
Beispiel #7
0
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