From 8e14d81baa49bd386034f79b4c45752b7c4665f0 Mon Sep 17 00:00:00 2001 From: quadrismegistus Date: Sat, 5 Sep 2020 22:11:42 +0100 Subject: [PATCH] fixes --- komrade/api/persona.py | 2 +- komrade/{operators => backend}/__init__.py | 0 komrade/{operators => backend}/crypt.py | 0 komrade/{operators => backend}/ether.py | 0 komrade/{operators => backend}/keymaker.py | 2 +- komrade/{operators => backend}/mazes.py | 7 +- komrade/{operators => backend}/operators.py | 99 +--------------- komrade/{operators => backend}/operators.pyc | Bin komrade/backend/run_op.py | 11 ++ komrade/backend/switchboard.py | 117 +++++++++++++++++++ komrade/constants.py | 4 +- komrade/operators/run_op.py | 3 - 12 files changed, 142 insertions(+), 103 deletions(-) rename komrade/{operators => backend}/__init__.py (100%) rename komrade/{operators => backend}/crypt.py (100%) rename komrade/{operators => backend}/ether.py (100%) rename komrade/{operators => backend}/keymaker.py (99%) rename komrade/{operators => backend}/mazes.py (96%) rename komrade/{operators => backend}/operators.py (53%) rename komrade/{operators => backend}/operators.pyc (100%) create mode 100755 komrade/backend/run_op.py create mode 100644 komrade/backend/switchboard.py delete mode 100755 komrade/operators/run_op.py diff --git a/komrade/api/persona.py b/komrade/api/persona.py index 4651bc0..072a8bb 100644 --- a/komrade/api/persona.py +++ b/komrade/api/persona.py @@ -1,6 +1,6 @@ # mine imports import os,sys; sys.path.append(os.path.abspath(os.path.join(os.path.abspath(os.path.join(os.path.dirname(__file__),'..')),'..'))) -from komrade.operators.caller import Caller +from komrade.backend.caller import Caller from komrade import KomradeException,Logger # other imports diff --git a/komrade/operators/__init__.py b/komrade/backend/__init__.py similarity index 100% rename from komrade/operators/__init__.py rename to komrade/backend/__init__.py diff --git a/komrade/operators/crypt.py b/komrade/backend/crypt.py similarity index 100% rename from komrade/operators/crypt.py rename to komrade/backend/crypt.py diff --git a/komrade/operators/ether.py b/komrade/backend/ether.py similarity index 100% rename from komrade/operators/ether.py rename to komrade/backend/ether.py diff --git a/komrade/operators/keymaker.py b/komrade/backend/keymaker.py similarity index 99% rename from komrade/operators/keymaker.py rename to komrade/backend/keymaker.py index 51289e8..d774821 100644 --- a/komrade/operators/keymaker.py +++ b/komrade/backend/keymaker.py @@ -1,6 +1,6 @@ import os,sys; sys.path.append(os.path.abspath(os.path.join(os.path.abspath(os.path.join(os.path.dirname(__file__),'..')),'..'))) from komrade import * -from komrade.operators.crypt import * +from komrade.backend.crypt import * class Keymaker(Logger): def __init__(self,name=None,passphrase=None): diff --git a/komrade/operators/mazes.py b/komrade/backend/mazes.py similarity index 96% rename from komrade/operators/mazes.py rename to komrade/backend/mazes.py index 66f8be1..d3b0c56 100644 --- a/komrade/operators/mazes.py +++ b/komrade/backend/mazes.py @@ -24,8 +24,13 @@ def tor_request_in_python(url): s.mount('http://', adapter) s.mount('https://', adapter) - r = s.get(url, timeout=30) + # r = s.get(url, timeout=30) + # r = s.post('http://u7spnj3dmwumzoa4.onion/op/',data=b'hello world', timeout=30) + _dat = 'Z29iYmxlZHlnb29rZ29iYmxlZHlnb29rZ29iYmxlZHlnb29rZ29iYmxlZHlnb29rZ29iYmxlZHlnb29rZ29iYmxlZHlnb29rZ29iYmxlZHlnb29rZ29iYmxlZHlnb29rZ29iYmxlZHlnb29r' + r = s.get('http://u7spnj3dmwumzoa4.onion/op/'+_dat, timeout=30) + return r + #return r # #r = s.get('http://u7spnj3dmwumzoa4.onion',timeout=30) # print (r, r.text[:1000]) diff --git a/komrade/operators/operators.py b/komrade/backend/operators.py similarity index 53% rename from komrade/operators/operators.py rename to komrade/backend/operators.py index dd24d4c..4976ce1 100644 --- a/komrade/operators/operators.py +++ b/komrade/backend/operators.py @@ -5,13 +5,9 @@ Running on node prime. # internal imports import os,sys; sys.path.append(os.path.abspath(os.path.join(os.path.abspath(os.path.join(os.path.dirname(__file__),'..')),'..'))) from komrade import * -from komrade.operators.crypt import * -from komrade.operators.keymaker import * -from komrade.operators.mazes import * - -# external imports -from flask import Flask, request, jsonify -from flask_classful import FlaskView +from komrade.backend.crypt import * +from komrade.backend.keymaker import * +from komrade.backend.mazes import * OPERATOR_NAME = 'TheOperator' @@ -100,95 +96,6 @@ class TheOperator(Operator): print(data) -### ACTUAL PHONE CONNECTIONS -class TheTelephone(Logger): - """ - API client class for Caller to interact with The Operator. - """ - def __init__(self, caller): - self.caller = caller - - @property - def sess(self): - """ - Get connection to Tor - """ - if not hasattr(self,'_sess'): - self._sess = get_tor_proxy_session() - return self._sess - - def req(self,json_coming_from_phone={},json_coming_from_caller={}): - # Two parts of every request: - - # 1) only overall encryption layer E2EE Telephone -> Operator: - - req_data = [] - if json_coming_from_phone: - json_coming_from_phone_s = json.dumps(json_coming_from_phone) - json_coming_from_phone_b = json_coming_from_phone_s.encode() - #json_coming_from_phone_b_encr = SMessage(TELEPHONE_PRIVKEY,OPERATOR_PUBKEY).wrap(json_coming_from_phone_b) - else: - json_coming_from_phone_b=b'' - - # 2) (optional) extra E2EE encrypted layer Caller -> Operator - if json_coming_from_caller: - json_coming_from_caller_s = json.dumps(json_coming_from_caller) - json_coming_from_caller_b = json_coming_from_caller_s.encode() - json_coming_from_caller_b_encr = SMessage(self.caller.privkey_,OPERATOR_PUBKEY).wrap(json_coming_from_caller_b) - else: - json_coming_from_caller_b_encr = b'' - - # encrypt whole package E2EE, Telephone to Operator - req_data = json_coming_from_phone_b + BSEP + json_coming_from_caller_b_encr - req_data_encr = SMessage(TELEPHONE_PRIVKEY, OPERATOR_PUBKEY).wrap(req_data) - req_data_encr_b64 = b64encode(req_data_encr) - self.log('req_data_encr_b64 <--',req_data_encr_b64) - - # send! - res = self.sess.post(OPERATOR_API_URL, data=req_data_encr_b64) - self.log('result from operator?',res) - - return res - - - def forge_new_keys(self, name, pubkey_is_public=False): - req_json = {'name':name, 'pubkey_is_public':pubkey_is_public} - req_json_s = jsonify(req_json) - req_json_s_encr = SMessage() - return self.sess.post(json=req_json) - - -OPERATOR = None -class TheSwitchboard(FlaskView, Logger): - #default_methods = ['POST'] - - def get(self): - return "We're sorry; we are unable to complete your call as dialed. Please check the number and dial again, or call your operator to help you." - - def post(self): - data = request.data - self.log('incoming_data! <--',data) - - # step 1: decode - data = b64decode(data) - self.log('decoded data:',data) - - # step 2: decrypt from phone - data = SMessage(OPERATOR.privkey_, TELEPHONE_PUBKEY).unwrap(data) - self.log('decrypted data:',data) - - # step 3: give to The Operator - res = OPERATOR.route(data) - - # return response to caller - return res - -def run_forever(port='8080'): - global OPERATOR - OPERATOR = TheOperator() - app = Flask(__name__) - TheSwitchboard.register(app, route_base='/op/', route_prefix=None) - app.run(debug=True, port=port, host='0.0.0.0') def init_operators(): op = Operator(name=OPERATOR_NAME) diff --git a/komrade/operators/operators.pyc b/komrade/backend/operators.pyc similarity index 100% rename from komrade/operators/operators.pyc rename to komrade/backend/operators.pyc diff --git a/komrade/backend/run_op.py b/komrade/backend/run_op.py new file mode 100755 index 0000000..ab7cfe4 --- /dev/null +++ b/komrade/backend/run_op.py @@ -0,0 +1,11 @@ +import os,sys; sys.path.append(os.path.abspath(os.path.join(os.path.abspath(os.path.join(os.path.dirname(__file__),'..')),'..'))) +# from komrade import * + +import sys +port = '8080' if len(sys.argv)<2 or not sys.argv[1].isdigit() else sys.argv[1] + + + + +from switchboard import run_forever +run_forever(port = port) \ No newline at end of file diff --git a/komrade/backend/switchboard.py b/komrade/backend/switchboard.py new file mode 100644 index 0000000..7eac698 --- /dev/null +++ b/komrade/backend/switchboard.py @@ -0,0 +1,117 @@ +# internal imports +import os,sys; sys.path.append(os.path.abspath(os.path.join(os.path.abspath(os.path.join(os.path.dirname(__file__),'..')),'..'))) +from komrade import * +from komrade.backend.crypt import * +from komrade.backend.keymaker import * +from komrade.backend.mazes import * +from komrade.backend.operators import * + +# external imports +from flask import Flask, request, jsonify +from flask_classful import FlaskView + + + +### ACTUAL PHONE CONNECTIONS +class TheTelephone(Logger): + """ + API client class for Caller to interact with The Operator. + """ + def __init__(self, caller): + self.caller = caller + + @property + def sess(self): + """ + Get connection to Tor + """ + if not hasattr(self,'_sess'): + self._sess = get_tor_proxy_session() + return self._sess + + def req(self,json_coming_from_phone={},json_coming_from_caller={}): + # Two parts of every request: + + # 1) only overall encryption layer E2EE Telephone -> Operator: + + req_data = [] + if json_coming_from_phone: + json_coming_from_phone_s = json.dumps(json_coming_from_phone) + json_coming_from_phone_b = json_coming_from_phone_s.encode() + #json_coming_from_phone_b_encr = SMessage(TELEPHONE_PRIVKEY,OPERATOR_PUBKEY).wrap(json_coming_from_phone_b) + else: + json_coming_from_phone_b=b'' + + # 2) (optional) extra E2EE encrypted layer Caller -> Operator + if json_coming_from_caller: + json_coming_from_caller_s = json.dumps(json_coming_from_caller) + json_coming_from_caller_b = json_coming_from_caller_s.encode() + json_coming_from_caller_b_encr = SMessage(self.caller.privkey_,OPERATOR_PUBKEY).wrap(json_coming_from_caller_b) + else: + json_coming_from_caller_b_encr = b'' + + # encrypt whole package E2EE, Telephone to Operator + req_data = json_coming_from_phone_b + BSEP + json_coming_from_caller_b_encr + req_data_encr = SMessage(TELEPHONE_PRIVKEY, OPERATOR_PUBKEY).wrap(req_data) + req_data_encr_b64 = b64encode(req_data_encr) + self.log('req_data_encr_b64 <--',req_data_encr_b64) + + # send! + req_data_encr_b64_str = req_data_encr_b64.decode('utf-8') + res = self.sess.post(OPERATOR_API_URL + req_data_encr_b64) + self.log('result from operator?',res) + return res + + + def forge_new_keys(self, name, pubkey_is_public=False): + req_json = {'name':name, 'pubkey_is_public':pubkey_is_public} + req_json_s = jsonify(req_json) + req_json_s_encr = SMessage() + return self.sess.post(json=req_json) + + +OPERATOR = None +class TheSwitchboard(FlaskView, Logger): + #default_methods = ['POST'] + + #def get(self): + # return "We're sorry; we are unable to complete your call as dialed. Please check the number and dial again, or call your operator to help you." + + def get(self,encr_b64_str): + # first try to get from string to bytes + self.log('incoming <--',encr_b64_str) + + try: + encr_b64_b = encr_b64_str.decode('utf-8') + self.log('encr_b64_b',encr_b64_b) + encr_b = b64decode(encr_b64_b) + self.log('encr_b',encr_b) + except UnicodeDecodeError: + return OPERATOR_INTERCEPT_MESSAGE + + if not encr_b64_str: return OPERATOR_INTERCEPT_MESSAGE + + + data = request.data + self.log('incoming_data! <--',data) + + # step 1: decode + data = b64decode(data) + self.log('decoded data:',data) + + # step 2: decrypt from phone + data = SMessage(OPERATOR.privkey_, TELEPHONE_PUBKEY).unwrap(data) + self.log('decrypted data:',data) + + # step 3: give to The Operator + res = OPERATOR.route(data) + + # return response to caller + return res + +def run_forever(port='8080'): + global OPERATOR + OPERATOR = TheOperator() + app = Flask(__name__) + TheSwitchboard.register(app, route_base='/op/', route_prefix=None) + app.run(debug=True, port=port, host='0.0.0.0') \ No newline at end of file diff --git a/komrade/constants.py b/komrade/constants.py index b773706..da6891b 100644 --- a/komrade/constants.py +++ b/komrade/constants.py @@ -4,7 +4,7 @@ KOMRADE_ONION = 'u7spnj3dmwumzoa4.onion' KOMRADE_ONION2 = 'rwg4zcnpwshv4laq.onion' #'128.232.229.63' #'komrade.app' -OPERATOR_API_URL = f'http://{KOMRADE_ONION}:6999/op/' +OPERATOR_API_URL = f'http://{KOMRADE_ONION2}/op/' # paths @@ -35,3 +35,5 @@ KEYNAMES = [ 'pubkey_decr_encr','privkey_decr_encr','adminkey_decr_encr', 'pubkey_decr_decr','privkey_decr_decr','adminkey_decr_decr' ] + +OPERATOR_INTERCEPT_MESSAGE = "If you'd like to make a call, please hang up and try again. If you need help, hang up, and then dial your operator." \ No newline at end of file diff --git a/komrade/operators/run_op.py b/komrade/operators/run_op.py deleted file mode 100755 index 2744e8f..0000000 --- a/komrade/operators/run_op.py +++ /dev/null @@ -1,3 +0,0 @@ -import sys -port = '8080' if len(sys.argv)<2 or not sys.argv[1].isdigit() else sys.argv[1] -from operators import run_forever; run_forever(port = port) \ No newline at end of file