def __init__(self, router, endpoint): self.router=router self.endpoint=endpoint self.keys=router.keys self.maildir='spool/'+encode(endpoint.public.bytes) self.addressBook=YamlMap('config/dustmail-addressbook.yaml') self.done=Event() self.commandDone=Event() self.book=YamlMap('config/dustmail-addressbook.yaml') dustmailConfig=YamlMap('config/dustmail-config.yaml') try: destAddress=dustmailConfig['tracker'] except: entry=self.addInvite() destAddress=entry['tracker'] dustmailConfig['tracker']=destAddress dest, outport, v6=decodeAddress(destAddress) print('Registering with tracker...') self.tracker=TrackerClient(self.router, addr=(dest, outport)) host=getPublicIP(v6) inport=dustmailConfig['port'] self.tracker.putPeerForEndpoint(encode(self.endpoint.public.bytes), [encode(self.endpoint.public.bytes), encodeAddress((host,inport))]) invite=self.keys.generateInvite(inport, v6=v6) self.tracker.putInviteForPeer(encodeAddress((host, inport)), encode(invite.message)) self.trackback=self.router.getService('trackback')
def addInvite(self): pf=input("Load invite from Paste or File [P/f]? ") if pf=='f': filename=input("Load invite from filename: ").strip() f=open(filename, 'rb') data=f.read() f.close() else: data=decode(input("Past invite: ")) passwd=input("Decrypt invite with password: "******"Name for this endpoint: ") try: entry=self.book[name] except: entry={} entry['pubkey']=encode(packet.pubkey) entry['tracker']=encodeAddress((invite.ip, invite.port)) self.book[name]=entry self.commandDone.set() return entry
def handle(self, msock, msg, addr): print('-----------------') print(msg.decode('ascii')) msg=msg.decode('ascii') mail=email.message_from_string(msg) to=mail['To'] frm=mail['From'] print('To:', to, 'From:', frm) tod=to.split('@')[1] frmd=frm.split('@')[1] addressKey=encodeAddress(addr) try: sender=self.config['senders'][addressKey] except: print('Unknown sender', addr, 'trying generic...') try: sender=self.config['senders']['*'] except: print('No generic sender rules, rejecting.') return if not tod in sender['to']: print('Illegal to address', tod, sender['to']) elif not frmd in sender['from']: print('Illegal from address', frmd, sender['from']) else: print('Sending...')
def addInvite(self): pf = input("Load invite from Paste or File [P/f]? ") if pf == 'f': filename = input("Load invite from filename: ").strip() f = open(filename, 'rb') data = f.read() f.close() else: data = decode(input("Past invite: ")) passwd = input("Decrypt invite with password: "******"Name for this endpoint: ") try: entry = self.book[name] except: entry = {} entry['pubkey'] = encode(packet.pubkey) entry['tracker'] = encodeAddress((invite.ip, invite.port)) self.book[name] = entry self.commandDone.set() return entry
def makeSession(self, address, tryInvite): addressKey=encodeAddress(address) if addressKey in self.sessionKeys: return self.sessionKeys[addressKey] h1=hash(addressKey.encode('ascii')) h2=hash(self.myAddressKey.encode('ascii')) sessionKey=xor(h1, h2) self.sessionKeys[addressKey]=sessionKey print('SessionKey:', len(self.sessionKeys[addressKey])) return sessionKey
def __init__(self, router, endpoint): self.router = router self.endpoint = endpoint self.keys = router.keys self.maildir = 'spool/' + encode(endpoint.public.bytes) self.addressBook = YamlMap('config/dustmail-addressbook.yaml') self.done = Event() self.commandDone = Event() self.book = YamlMap('config/dustmail-addressbook.yaml') dustmailConfig = YamlMap('config/dustmail-config.yaml') try: destAddress = dustmailConfig['tracker'] except: entry = self.addInvite() destAddress = entry['tracker'] dustmailConfig['tracker'] = destAddress dest, outport, v6 = decodeAddress(destAddress) print('Registering with tracker...') self.tracker = TrackerClient(self.router, addr=(dest, outport)) host = getPublicIP(v6) inport = dustmailConfig['port'] self.tracker.putPeerForEndpoint(encode(self.endpoint.public.bytes), [ encode(self.endpoint.public.bytes), encodeAddress((host, inport)) ]) invite = self.keys.generateInvite(inport, v6=v6) self.tracker.putInviteForPeer(encodeAddress((host, inport)), encode(invite.message)) self.trackback = self.router.getService('trackback')
def handle(self, msock, msg, addr): # data=msg.decode('ascii') # data=bz2.decompress(msg).decode('ascii') print('HTTP Proxyback message from '+encodeAddress(addr)+': ') print(msg) packet=ProxybackMessage() packet.decodeProxybackMessage(msg) print(packet) q=self.qs[packet.reqid] q.put(packet.data) if packet.fin: print('EOF') q.put(None) del self.qs[packet.reqid] print(q.qsize())
def handle(self, msock, msg, addr): packet=ProxyMessage() packet.decodeProxyMessage(msg) reqid=packet.reqid data=packet.data.decode('ascii') print('HTTP Proxy message from '+encodeAddress(addr)+':') print(data) parts=data.split(' ') print('parts: '+str(parts)) url=parts[1] print('url: '+str(url)) try: host=urlparse(url).netloc conn=httplib.HTTPConnection(host) conn.request('GET', url) resp=conn.getresponse() if resp.version==10: result=b"HTTP/1.0" elif resp.version==11: result=b"HTTP/1.1" else: result=b"HTTP/1.1" result=result+b' '+bytes(str(resp.status), 'ascii')+b' '+bytes(resp.reason, 'ascii')+b"\r\n" for key, value in resp.getheaders(): result=result+bytes(key, 'ascii')+b': '+bytes(value, 'ascii')+b"\r\n" result=result+b"\r\n" result=result+resp.read() except Exception as e: print(e) traceback.print_exc() result=b"HTTP/1.1 500 Error\r\n\r\n" # comp=bz2.compress(result) chunkSize=512 n=int(math.ceil(len(result)/chunkSize)) for i in range(n): start=chunkSize*i end=chunkSize*(i+1) print('sending '+str(i)) packet=ProxybackMessage() packet.createProxybackMessage(reqid, i, (i==n-1), result[start:end]) self.router.sendto(packet.msg, addr, service='httpProxyback') time.sleep(1)
def handle(self, msock, msg, addr): packet=ProxyMessage() packet.decodeProxyMessage(msg) print('Socks Proxy message from '+encodeAddress(addr)+':') print(packet) reqid=packet.reqid seq=packet.seq data=packet.data if seq==0: host, port=self.readRequest(data) conn=TcpProxyHandler(reqid, host, port, self, addr) conn.start() self.conns[reqid]=conn else: conn=self.conns[reqid] conn.inq.put(data)
def handle(self, msock, msg, addr): packet = ProxyMessage() packet.decodeProxyMessage(msg) print('Socks Proxy message from ' + encodeAddress(addr) + ':') print(packet) reqid = packet.reqid seq = packet.seq data = packet.data if seq == 0: host, port = self.readRequest(data) conn = TcpProxyHandler(reqid, host, port, self, addr) conn.start() self.conns[reqid] = conn else: conn = self.conns[reqid] conn.inq.put(data)
def makeSession(self, address, tryInvite): addressKey=encodeAddress(address) if addressKey in self.sessionKeys: return self.sessionKeys[addressKey] if self.keys.isKnown(addressKey): sessionKey=self.keys.getSessionKeyForAddress(addressKey) self.sessionKeys[addressKey]=sessionKey return sessionKey else: if self.introducer and tryInvite: print('Unknown address', addressKey, 'trying introduction...') sessionKey=self.introducer.makeIntroduction(address, self.sock) if not sessionKey: print('Introduction failed.') return else: return sessionKey else: print('Failed to connect, no introducer (or tryInvite=False) and unknown address') return
def addHost(self, address, pubkey): print('addHost:', address, pubkey) addressKey=encodeAddress(address) self.knownHosts[addressKey]=pubkey print('knownHosts:', self.knownHosts) self.saveKnownHosts()
def __init__(self, tracker, trackback, dustmail, keypair, endkey, msg): self.dustmail = dustmail self.keypair = keypair self.endkey = endkey self.msg = msg trackback.setPutPeerForEndpointCallback(encode(endkey.bytes), self.foundPeer) tracker.getPeerForEndpoint(encode(endkey.bytes)) def foundPeer(self, endkey, peer): print('foundPeer!!! ' + str(endkey) + ' ' + str(peer)) destkey = decode(peer[0]) addr = peer[1] data = self.msg.encode('ascii') sessionKey = keypair.createSession(Key(destkey, False)) print('session ' + str(sessionKey.bytes)) packet = DataPacket() packet.createDataPacket(sessionKey.bytes, data, keys.entropy) self.dustmail.sendMessage(encode(self.keypair.public.bytes), encode(destkey), encode(packet.packet)) tracker.putPeerForEndpoint( pubkeyhex, [pubkeyhex, encodeAddress((host, inport))]) msg = 'message.........' msg = PendingMessage(tracker, trackback, dustmail, keypair, destpubkey, msg) while True: time.sleep(1)
keys.loadKeypair('config/id.yaml') except: print('Generating server keypair...') keys.createKeypair() keys.saveKeypair('config/id.yaml') keys.loadKnownHosts('config/knownhosts.yaml') keys.loadIncomingInvites('config/incoming_invites.ip') keys.loadOutgoingInvites('config/outgoing_invites.ip') router = PacketRouter(v6, inport, keys, passwd) router.connect(trackerAddr[0], trackerAddr[1]) tracker = TrackerClient(router) router.start() keypair = keys.getKeypair() pubkey = keypair.public invite = keys.generateInvite(inport, v6=v6) tracker.putInviteForPeer(encodeAddress((host, inport)), encode(invite.message)) endpoints = YamlMap('config/endpoints.yaml') for key in endpoints.values(): tracker.putPeerForEndpoint( key, [encode(pubkey.bytes), encodeAddress((host, inport))]) wait()
def handle(self, msock, msg, addr): print('Tracker message from '+encodeAddress(addr)+':') trackback=ServiceHandler(TrackbackHandler(self.router)) trackback.handleRequest(msg.decode('utf-8'))
def getSessionKeyForHost(self, address): addressKey=encodeAddress(address) return self.getSessionKeyForAddress(addressKey)
keys.loadOutgoingInvites('config/outgoing_invites.ip') endpoint=keys.loadEndpoint(os.path.expanduser('~/.dust/endpoint.yaml')) pf=input("Load invite from Paste or File [P/f]? ") if pf=='f': filename=input("Load invite from filename: ").strip() f=open(filename, 'rb') data=f.read() f.close() else: data=decode(input("Past invite: ")) passwd=input("Decrypt invite with password: "******"pubkey: "+encode(packet.pubkey)) print("invite: "+encode(packet.invite)) invite=InviteMessage() invite.decodeInviteMessage(packet.invite) keys.addInvite(invite) name=input("Name for this endpoint: ") book=YamlMap('config/dustmail-addressbook.yaml') try: entry=book[name] except: entry={} entry['pubkey']=encode(packet.pubkey) entry['tracker']=encodeAddress((invite.ip, invite.port)) book[name]=entry
def handle(self, msock, msg, addr): print('Message from '+encodeAddress(addr)+':') print(msg.decode('ascii')) print('-----------------')
def handle(self, msock, msg, addr): packet=ProxyMessage() packet.decodeProxyMessage(msg) reqid=packet.reqid data=packet.data.decode('ascii') print('HTTP Proxy message from '+encodeAddress(addr)+':') print(data) parts=data.split(' ') print('parts: '+str(parts)) url=parts[1] print('url: '+str(url)) try: print('connecting to '+str(urlparse(url).netloc)) parts=urlparse(url) print(parts) print(parts.username) print(parts.password) host=parts.hostname port=parts.port if not port: port=80 if parts.username and parts.password: auth=base64.b64encode(parts.username+':'+parts.password) else: auth=None headers={'Connection': 'close'} if auth: headers['Authentication']=auth print(headers) conn=httplib.HTTPConnection(host, port) conn.request('GET', url, headers=headers) resp=conn.getresponse() if resp.version==10: result=b"HTTP/1.0" elif resp.version==11: result=b"HTTP/1.1" else: result=b"HTTP/1.1" result=result+b' '+bytes(str(resp.status), 'ascii')+b' '+bytes(resp.reason, 'ascii')+b"\r\n" for key, value in resp.getheaders(): if key!='Connection': result=result+bytes(key, 'ascii')+b': '+bytes(value, 'ascii')+b"\r\n" result=result+b"Connection: close\r\n" result=result+b"Proxy-Connection: close\r\n" result=result+b"\r\n" result=result+resp.read() except Exception as e: print(e) traceback.print_exc() result=b"HTTP/1.1 500 Error\r\n\r\n" # comp=bz2.compress(result) chunkSize=512 n=int(math.ceil(len(result)/chunkSize)) for i in range(n): start=chunkSize*i end=chunkSize*(i+1) print('sending '+str(i)) packet=ProxybackMessage() packet.createProxybackMessage(reqid, i, (i==n-1), result[start:end]) self.router.sendto(packet.msg, addr, service='httpProxyback')
def handle(self, msock, msg, addr): print('Trackback message from '+encodeAddress(addr)+':') self.trackback.handleRequest(msg.decode('utf-8'))
def handle(self, msock, msg, addr): print('Tracker message from ' + encodeAddress(addr) + ':') trackback = ServiceHandler(TrackbackHandler(self.router)) trackback.handleRequest(msg.decode('utf-8'))
def handle(self, msock, msg, addr): print('Dustmail message from '+encodeAddress(addr)+': '+msg.decode('ascii')) dustmail=ServiceHandler(DustmailHandler(self.router)) dustmail.handleRequest(msg.decode('ascii'))
keys.loadOutgoingInvites('config/outgoing_invites.ip') endpoint = keys.loadEndpoint(os.path.expanduser('~/.dust/endpoint.yaml')) pf = input("Load invite from Paste or File [P/f]? ") if pf == 'f': filename = input("Load invite from filename: ").strip() f = open(filename, 'rb') data = f.read() f.close() else: data = decode(input("Past invite: ")) passwd = input("Decrypt invite with password: "******"pubkey: " + encode(packet.pubkey)) print("invite: " + encode(packet.invite)) invite = InviteMessage() invite.decodeInviteMessage(packet.invite) keys.addInvite(invite) name = input("Name for this endpoint: ") book = YamlMap('config/dustmail-addressbook.yaml') try: entry = book[name] except: entry = {} entry['pubkey'] = encode(packet.pubkey) entry['tracker'] = encodeAddress((invite.ip, invite.port)) book[name] = entry
def handle(self, msock, msg, addr): print('Dustmail message from ' + encodeAddress(addr) + ': ' + msg.decode('ascii')) dustmail = ServiceHandler(DustmailHandler(self.router)) dustmail.handleRequest(msg.decode('ascii'))
def handle(self, msock, msg, addr): print('Tracker message from ' + encodeAddress(addr) + ': ' + msg.decode('ascii')) tracker = ServiceHandler(TrackerHandler(self.router, addr)) print('tracker: ' + str(tracker)) tracker.handleRequest(msg.decode('ascii'))
try: keys.loadKeypair('config/id.yaml') except: print('Generating server keypair...') keys.createKeypair() keys.saveKeypair('config/id.yaml') keys.loadKnownHosts('config/knownhosts.yaml') keys.loadIncomingInvites('config/incoming_invites.ip') keys.loadOutgoingInvites('config/outgoing_invites.ip') router=PacketRouter(v6, inport, keys, passwd) router.connect(trackerAddr[0], trackerAddr[1]) tracker=TrackerClient(router) router.start() keypair=keys.getKeypair() pubkey=keypair.public invite=keys.generateInvite(inport, v6=v6) tracker.putInviteForPeer(encodeAddress((host, inport)), encode(invite.message)) endpoints=YamlMap('config/endpoints.yaml') for key in endpoints.values(): tracker.putPeerForEndpoint(key, [encode(pubkey.bytes), encodeAddress((host,inport))]) wait()
def setAddress(self, address): self.introducer = Introducer(self.keys, address) self.myAddress = address self.myAddressKey = encodeAddress(address)
ipv=int(sys.argv[5]) if ipv==6: v6=True else: v6=False host=getPublicIP(v6) print('Host: '+str(host)) keys=KeyManager() keys.setInvitePassword(passwd) keys.loadKnownHosts('config/knownhosts.yaml') keys.loadKeypair('config/id.yaml') keys.loadIncomingInvites('config/incoming_invites.ip') keys.loadOutgoingInvites('config/outgoing_invites.ip') router=PacketRouter(v6, inport, keys, passwd) router.connect(dest, outport) tracker=TrackerClient(router) trackback=router.getService('trackback') router.start() tracker.putPeerForEndpoint('43aafb64bc96460f3928f6068b2a01aa87bac16da6dc034b4525d1837e9cb85e', ['43aafb64bc96460f3928f6068b2a01aa87bac16da6dc034b4525d1837e9cb85e', encodeAddress((host, inport))]) trackback.setPutPeerForEndpointCallback('43aafb64bc96460f3928f6068b2a01aa87bac16da6dc034b4525d1837e9cb85e', foundPeer) tracker.getPeerForEndpoint('43aafb64bc96460f3928f6068b2a01aa87bac16da6dc034b4525d1837e9cb85e') while True: time.sleep(1)
def setAddress(self, address): self.introducer=Introducer(self.keys, address) self.myAddress=address self.myAddressKey=encodeAddress(address)
def handle(self, msock, msg, addr): print('Tracker message from '+encodeAddress(addr)+': '+msg.decode('ascii')) tracker=ServiceHandler(TrackerHandler(self.router, addr)) print('tracker: '+str(tracker)) tracker.handleRequest(msg.decode('ascii'))
if keys.isKnown(addr) or self.keys.outgoingInvites.getInviteForHost(False, decodeAddress(addr)): self.sendMessage(decodeAddress(addr)) else: trackback.setPutInviteForPeerCallback(addr, self.foundInvite) tracker.getInviteForPeer(addr) def foundInvite(self, addr, invite): self.sendMessage(decodeAddress(addr)) def sendMessage(self, addr): print('sending message to '+str(addr)) data=self.msg.encode('ascii') onion=OnionPacket() onion.createOnionPacket(self.keypair, self.endkey, data, self.keys.entropy) dustmail=DustmailClient(self.router, addr) dustmail.sendMessage(encode(onion.packet)) router=PacketRouter(v6, inport, keys, passwd) router.connect(dest, outport) tracker=TrackerClient(router) trackback=router.getService('trackback') router.start() tracker.putPeerForEndpoint(pubkeyhex, [pubkeyhex, encodeAddress((host,inport))]) pending=PendingMessage(keys, router, tracker, trackback, endpoint, endkey, message) wait()