Example #1
0
File: reader.py Project: blanu/Dust
  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')
Example #2
0
File: reader.py Project: blanu/Dust
  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
Example #3
0
  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
Example #5
0
  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())
Example #8
0
  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)
Example #9
0
  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)
Example #11
0
  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
Example #12
0
 def addHost(self, address, pubkey):
   print('addHost:', address, pubkey)
   addressKey=encodeAddress(address)
   self.knownHosts[addressKey]=pubkey
   print('knownHosts:', self.knownHosts)
   self.saveKnownHosts()
Example #13
0
    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()
Example #15
0
 def handle(self, msock, msg, addr):
   print('Tracker message from '+encodeAddress(addr)+':')
   trackback=ServiceHandler(TrackbackHandler(self.router))
   trackback.handleRequest(msg.decode('utf-8'))
Example #16
0
 def getSessionKeyForHost(self, address):
   addressKey=encodeAddress(address)
   return self.getSessionKeyForAddress(addressKey)
Example #17
0
File: add.py Project: blanu/Dust
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
Example #18
0
 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')
Example #20
0
 def handle(self, msock, msg, addr):
   print('Trackback message from '+encodeAddress(addr)+':')
   self.trackback.handleRequest(msg.decode('utf-8'))
Example #21
0
 def getSessionKeyForHost(self, address):
   addressKey=encodeAddress(address)
   return self.getSessionKeyForAddress(addressKey)
Example #22
0
 def handle(self, msock, msg, addr):
     print('Tracker message from ' + encodeAddress(addr) + ':')
     trackback = ServiceHandler(TrackbackHandler(self.router))
     trackback.handleRequest(msg.decode('utf-8'))
Example #23
0
 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'))
Example #26
0
 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'))
Example #27
0
File: serve.py Project: blanu/Dust
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()
Example #28
0
 def setAddress(self, address):
     self.introducer = Introducer(self.keys, address)
     self.myAddress = address
     self.myAddressKey = encodeAddress(address)
Example #29
0
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)
Example #30
0
 def setAddress(self, address):
   self.introducer=Introducer(self.keys, address)
   self.myAddress=address
   self.myAddressKey=encodeAddress(address)
Example #31
0
 def addHost(self, address, pubkey):
   print('addHost:', address, pubkey)
   addressKey=encodeAddress(address)
   self.knownHosts[addressKey]=pubkey
   print('knownHosts:', self.knownHosts)
   self.saveKnownHosts()
Example #32
0
 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()