work on sockets
parent
4e8f7e2761
commit
759da55094
|
@ -109,6 +109,7 @@ class OnionrCommunicatorDaemon:
|
||||||
announceTimer.count = (cleanupTimer.frequency - 60)
|
announceTimer.count = (cleanupTimer.frequency - 60)
|
||||||
|
|
||||||
self.socketServer = onionrsockets.OnionrSocketServer(self._core)
|
self.socketServer = onionrsockets.OnionrSocketServer(self._core)
|
||||||
|
self.socketClient = onionrsockets.OnionrSocketClient(self._core)
|
||||||
|
|
||||||
# Main daemon loop, mainly for calling timers, don't do any complex operations here to avoid locking
|
# Main daemon loop, mainly for calling timers, don't do any complex operations here to avoid locking
|
||||||
try:
|
try:
|
||||||
|
@ -469,10 +470,13 @@ class OnionrCommunicatorDaemon:
|
||||||
elif cmd[0] == 'uploadBlock':
|
elif cmd[0] == 'uploadBlock':
|
||||||
self.blockToUpload = cmd[1]
|
self.blockToUpload = cmd[1]
|
||||||
threading.Thread(target=self.uploadBlock).start()
|
threading.Thread(target=self.uploadBlock).start()
|
||||||
elif cmd[0] == 'addSocket':
|
elif cmd[0] == 'startSocket':
|
||||||
socketInfo = json.loads(cmd[1])
|
socketInfo = json.loads(cmd[1])
|
||||||
if socketInfo['reason'] in ('chat'):
|
peer = socketInfo['peer']
|
||||||
onionrsockets.OnionrSocketClient(self._core, socketInfo['peer'])
|
reason = socketInfo['reason']
|
||||||
|
self.socketServer.addSocket(peer, reason)
|
||||||
|
elif cmd[0] == 'connectSocket':
|
||||||
|
pass
|
||||||
else:
|
else:
|
||||||
logger.info('Recieved daemonQueue command:' + cmd[0])
|
logger.info('Recieved daemonQueue command:' + cmd[0])
|
||||||
|
|
||||||
|
|
|
@ -271,9 +271,8 @@ class Onionr:
|
||||||
'''
|
'''
|
||||||
|
|
||||||
def startChat(self):
|
def startChat(self):
|
||||||
peer = sys.argv[2]
|
data = json.dumps({'peer': sys.argv[2], 'reason': 'chat'})
|
||||||
socketInfo = json.dumps({'peer': '', 'address': peer, 'port': 1337, 'create': True, 'reason': 'chat'})
|
self.onionrCore.daemonQueueAdd('startSocket', data)
|
||||||
self.onionrCore.daemonQueueAdd('startSocket', socketInfo)
|
|
||||||
|
|
||||||
def getCommands(self):
|
def getCommands(self):
|
||||||
return self.cmds
|
return self.cmds
|
||||||
|
|
|
@ -19,7 +19,7 @@
|
||||||
'''
|
'''
|
||||||
import stem.control
|
import stem.control
|
||||||
import socks, config, uuid
|
import socks, config, uuid
|
||||||
import onionrexceptions, time, requests
|
import onionrexceptions, time, requests, onionrblockapi
|
||||||
from dependencies import secrets
|
from dependencies import secrets
|
||||||
from flask import request, Response, abort
|
from flask import request, Response, abort
|
||||||
|
|
||||||
|
@ -27,10 +27,12 @@ class OnionrSocketServer:
|
||||||
def __init__(self, coreInst):
|
def __init__(self, coreInst):
|
||||||
self.sockets = {} # pubkey: tor address
|
self.sockets = {} # pubkey: tor address
|
||||||
self.connPool = {}
|
self.connPool = {}
|
||||||
|
|
||||||
self.bindPort = 1337
|
self.bindPort = 1337
|
||||||
self._core = coreInst
|
self._core = coreInst
|
||||||
self.responseData = {}
|
self.responseData = {}
|
||||||
self.killSocket = False
|
self.killSocket = False
|
||||||
|
|
||||||
app = flask.Flask(__name__)
|
app = flask.Flask(__name__)
|
||||||
|
|
||||||
http_server = WSGIServer((socket.service_id, bindPort), app)
|
http_server = WSGIServer((socket.service_id, bindPort), app)
|
||||||
|
@ -55,7 +57,7 @@ class OnionrSocketServer:
|
||||||
def setResponseData(self, host, data):
|
def setResponseData(self, host, data):
|
||||||
self.responseData[host] = data
|
self.responseData[host] = data
|
||||||
|
|
||||||
def addSocket(self, peer):
|
def addSocket(self, peer, reason=''):
|
||||||
bindPort = 1337
|
bindPort = 1337
|
||||||
with stem.control.Controller.from_port(port=config.get('tor.controlPort')) as controller:
|
with stem.control.Controller.from_port(port=config.get('tor.controlPort')) as controller:
|
||||||
controller.authenticate(config.get('tor.controlpassword'))
|
controller.authenticate(config.get('tor.controlpassword'))
|
||||||
|
@ -65,7 +67,7 @@ class OnionrSocketServer:
|
||||||
|
|
||||||
self.responseData[socket.service_id] = ''
|
self.responseData[socket.service_id] = ''
|
||||||
|
|
||||||
self._core.insertBlock(uuid.uuid4(), header='startSocket', sign=True, encryptType='asym', asymPeer=peer, meta={})
|
self._core.insertBlock(uuid.uuid4(), header='startSocket', sign=True, encryptType='asym', asymPeer=peer, meta={'reason': reason})
|
||||||
|
|
||||||
while not self.killSocket:
|
while not self.killSocket:
|
||||||
time.sleep(3)
|
time.sleep(3)
|
||||||
|
@ -75,11 +77,47 @@ class OnionrSocketClient:
|
||||||
def __init__(self, coreInst):
|
def __init__(self, coreInst):
|
||||||
self.sockets = {} # pubkey: tor address
|
self.sockets = {} # pubkey: tor address
|
||||||
self.connPool = {}
|
self.connPool = {}
|
||||||
|
self.sendData = {}
|
||||||
self.bindPort = 1337
|
self.bindPort = 1337
|
||||||
self._core = coreInst
|
self._core = coreInst
|
||||||
self.response = ''
|
self.response = ''
|
||||||
self.request = ''
|
self.request = ''
|
||||||
self.connected = False
|
self.connected = False
|
||||||
|
self.killSocket = False
|
||||||
|
|
||||||
|
def startSocket(self, peer):
|
||||||
|
address = ''
|
||||||
|
# Find the newest open socket for a given peer
|
||||||
|
for block in self._core.getBlocksByType('openSocket'):
|
||||||
|
block = onionrblockapi.Block(block, core=self._myCore)
|
||||||
|
if block.decrypt():
|
||||||
|
if block.verifySig() and block.signer == peer:
|
||||||
|
address = block.getMetadata('address')
|
||||||
|
if self._core._utils.validateID(address):
|
||||||
|
# If we got their address, it is valid, and verified, we can break out
|
||||||
|
break
|
||||||
|
else:
|
||||||
|
address = ''
|
||||||
|
if address != '':
|
||||||
|
self.sockets[peer] = address
|
||||||
|
data = ''
|
||||||
|
while not self.killSocket:
|
||||||
|
try:
|
||||||
|
data = self.sendData[peer]
|
||||||
|
except KeyError:
|
||||||
|
pass
|
||||||
|
else:
|
||||||
|
self.sendData[peer] = ''
|
||||||
|
postData = {'data': data}
|
||||||
|
self.connPool[peer] = self._core._utils.doPostRequest('http://' + address + '/dc/', data=postData)
|
||||||
|
|
||||||
def getResponse(self, peer):
|
def getResponse(self, peer):
|
||||||
self._core._utils.doPostRequest(self.)
|
retData = ''
|
||||||
|
try:
|
||||||
|
retData = self.connPool[peer]
|
||||||
|
except KeyError:
|
||||||
|
pass
|
||||||
|
return
|
||||||
|
|
||||||
|
def sendData(self, peer, data):
|
||||||
|
self.sendData[peer] = data
|
Loading…
Reference in New Issue