2020-08-05 00:08:41 +00:00
|
|
|
#!/usr/bin/env python3
|
|
|
|
import pdb
|
|
|
|
from mitmproxy import ctx
|
|
|
|
import threading
|
2020-08-09 12:38:41 +00:00
|
|
|
from queue import Queue, Empty
|
2020-08-05 00:08:41 +00:00
|
|
|
import time
|
|
|
|
import zmq
|
2020-08-08 11:44:16 +00:00
|
|
|
import json
|
2020-08-10 22:24:08 +00:00
|
|
|
from enum import Enum
|
2020-08-05 00:08:41 +00:00
|
|
|
|
2020-08-09 12:38:41 +00:00
|
|
|
NO_MSG = {"msg": None}
|
2020-08-08 11:44:16 +00:00
|
|
|
INIT_MSG = {"msg": "init"}
|
|
|
|
ACK_MSG = {"msg": "ack"}
|
|
|
|
PING_MSG = {"msg": "ping"}
|
|
|
|
PONG_MSG = {"msg": "pong"}
|
|
|
|
|
2020-08-10 22:24:08 +00:00
|
|
|
class NetworkState(Enum):
|
|
|
|
DISCONNECTED = auto()
|
|
|
|
CONNECTED = auto()
|
|
|
|
PING = auto()
|
|
|
|
SENDING = auto()
|
|
|
|
|
2020-08-08 11:44:16 +00:00
|
|
|
def convert_to_strings(obj):
|
|
|
|
if isinstance(obj, dict):
|
|
|
|
return {convert_to_strings(key): convert_to_strings(value)
|
|
|
|
for key, value in obj.items()}
|
|
|
|
elif isinstance(obj, list) or isinstance(obj, tuple):
|
|
|
|
return [convert_to_strings(element) for element in obj]
|
|
|
|
elif isinstance(obj, bytes):
|
|
|
|
return str(obj)[2:-1]
|
|
|
|
return obj
|
|
|
|
|
|
|
|
def get_msg(socket):
|
|
|
|
|
|
|
|
msg = socket.recv()
|
|
|
|
try:
|
|
|
|
if msg:
|
|
|
|
return json.loads(msg)
|
|
|
|
except json.JSONDecodeError:
|
2020-08-09 12:38:41 +00:00
|
|
|
print(f"malformed message received {msg}")
|
2020-08-08 11:44:16 +00:00
|
|
|
|
|
|
|
return NO_MSG
|
|
|
|
|
|
|
|
|
|
|
|
def send_msg(msg, socket):
|
|
|
|
a = convert_to_strings(msg)
|
|
|
|
socket.send(str.encode(json.dumps(a)))
|
|
|
|
|
2020-08-05 00:08:41 +00:00
|
|
|
def networking(q):
|
|
|
|
print("starting thread")
|
|
|
|
|
|
|
|
context = zmq.Context()
|
2020-08-08 11:44:16 +00:00
|
|
|
connected = False
|
2020-08-09 12:07:14 +00:00
|
|
|
a = None
|
2020-08-08 11:44:16 +00:00
|
|
|
while not connected:
|
|
|
|
socket = context.socket(zmq.PAIR)
|
|
|
|
socket.connect("tcp://127.0.0.1:12345")
|
|
|
|
msg = get_msg(socket)
|
|
|
|
if msg["msg"] == "init":
|
|
|
|
send_msg(ACK_MSG, socket)
|
|
|
|
connected = True
|
|
|
|
|
|
|
|
timer = time.monotonic()
|
|
|
|
while connected:
|
|
|
|
if timer - time.monotonic() >= 5:
|
|
|
|
timer = time.monotonic()
|
|
|
|
send_msg(PING_MSG,socket)
|
|
|
|
msg = get_msg(socket)
|
|
|
|
if msg["msg"] != "pong":
|
|
|
|
connected = False
|
|
|
|
|
|
|
|
msg = get_msg(socket)
|
|
|
|
if msg['msg'] == "ping":
|
|
|
|
send_msg(PONG_MSG, socket)
|
|
|
|
timer = time.monotonic()
|
2020-08-09 12:07:14 +00:00
|
|
|
|
|
|
|
if not a:
|
2020-08-09 12:38:41 +00:00
|
|
|
try:
|
|
|
|
a = q.get(block=False)
|
|
|
|
except Empty:
|
|
|
|
pass
|
2020-08-08 11:44:16 +00:00
|
|
|
if a:
|
2020-08-09 12:07:14 +00:00
|
|
|
send_msg(a, socket)
|
2020-08-08 11:44:16 +00:00
|
|
|
msg = get_msg(socket)
|
|
|
|
if msg["msg"] == "ack":
|
|
|
|
timer = time.monotonic()
|
2020-08-09 12:07:14 +00:00
|
|
|
a = None
|
|
|
|
self.q.task_done()
|
2020-08-08 11:44:16 +00:00
|
|
|
else:
|
|
|
|
connected = False
|
2020-08-05 00:08:41 +00:00
|
|
|
|
|
|
|
class Counter:
|
|
|
|
def __init__(self):
|
|
|
|
self.q = Queue()
|
|
|
|
self.thread = threading.Thread(name="NetworkThread", target=networking, args=(self.q,))
|
|
|
|
self.thread.start()
|
|
|
|
|
|
|
|
def request(self, flow):
|
2020-08-09 12:07:14 +00:00
|
|
|
self.q.put({'msg': 'request', 'flow': flow.get_state()})
|
2020-08-05 00:08:41 +00:00
|
|
|
self.q.join()
|
|
|
|
|
|
|
|
def response(self, flow):
|
2020-08-09 12:07:14 +00:00
|
|
|
self.q.put({'msg': 'response', 'flow': flow.get_state()})
|
2020-08-05 00:08:41 +00:00
|
|
|
self.q.join()
|
|
|
|
|
|
|
|
addons = [
|
|
|
|
Counter()
|
|
|
|
]
|