diff --git a/onionr/apimanager.py b/onionr/apimanager.py new file mode 100644 index 00000000..05a1ba91 --- /dev/null +++ b/onionr/apimanager.py @@ -0,0 +1,75 @@ +''' + Onionr - P2P Anonymous Storage Network + + Handles api data exchange, interfaced by both public and client http api +''' +''' + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +''' +import config, apipublic, apiprivate, core, socket, random, threading, time +config.reload() + +PRIVATE_API_VERSION = 0 +PUBLIC_API_VERSION = 1 + +DEV_MODE = config.get('general.dev_mode') + +def getOpenPort(): + '''Get a random open port''' + p = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + p.bind(("127.0.0.1",0)) + p.listen(1) + port = s.getsockname()[1] + p.close() + return port + +def getRandomLocalIP(): + '''Get a random local ip address''' + hostOctets = [str(127), str(random.randint(0x02, 0xFF)), str(random.randint(0x02, 0xFF)), str(random.randint(0x02, 0xFF))] + host = '.'.join(hostOctets) + return host + +class APIManager: + def __init__(self, coreInst): + assert isinstance(coreInst, core.Core) + self.core = core + self.utils = core._utils + self.crypto = core._crypto + + # if this gets set to true, both the public and private apis will shutdown + self.shutdown = False + + publicIP = '127.0.0.1' + privateIP = '127.0.0.1' + if DEV_MODE: + # set private and local api servers bind IPs to random localhost (127.x.x.x), make sure not the same + privateIP = getRandomLocalIP() + while True: + publicIP = getRandomLocalIP() + if publicIP != privateIP: + break + + # Make official the IPs and Ports + self.publicIP = publicIP + self.privateIP = privateIP + self.publicPort = getOpenPort() + self.privatePort = getOpenPort() + + # Run the API servers in new threads + self.publicAPI = apipublic.APIPublic() + self.privateAPI = apiprivate.privateAPI() + threading.Thread(target=self.publicAPI.run).start() + threading.Thread(target=self.privateAPI.run).start() + while not self.shutdown: + time.sleep(1) \ No newline at end of file diff --git a/onionr/apiprivate.py b/onionr/apiprivate.py new file mode 100644 index 00000000..7f62b9d5 --- /dev/null +++ b/onionr/apiprivate.py @@ -0,0 +1,32 @@ +''' + Onionr - P2P Anonymous Storage Network + + Handle incoming commands from the client. Intended for localhost use +''' +''' + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +''' +import flask, apimanager +from flask import request, Response, abort, send_from_directory +from gevent.pywsgi import WSGIServer + +class APIPrivate: + def __init__(self, managerInst): + assert isinstance(managerInst, apimanager.APIManager) + self.app = flask.Flask(__name__) # The flask application, which recieves data from the greenlet wsgiserver + self.httpServer = WSGIServer((managerInst.privateIP, managerInst.privatePort), self.app, log=None) + + def run(self): + self.httpServer.serve_forever() + return \ No newline at end of file diff --git a/onionr/apipublic.py b/onionr/apipublic.py new file mode 100644 index 00000000..110a6934 --- /dev/null +++ b/onionr/apipublic.py @@ -0,0 +1,32 @@ +''' + Onionr - P2P Anonymous Storage Network + + Handle incoming commands from other Onionr nodes, over HTTP +''' +''' + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +''' +import flask, apimanager +from flask import request, Response, abort, send_from_directory +from gevent.pywsgi import WSGIServer + +class APIPublic: + def __init__(self, managerInst): + assert isinstance(managerInst, apimanager.APIManager) + self.app = flask.Flask(__name__) # The flask application, which recieves data from the greenlet wsgiserver + self.httpServer = WSGIServer((managerInst.publicIP, managerInst.publicPort), self.app, log=None) + + def run(self): + self.httpServer.serve_forever() + return \ No newline at end of file