Skip to content

Commit c342321

Browse files
committed
fixed JSON parsing error + replaced md5 with sha1 (non-crypto purpose)
1 parent 55a92a5 commit c342321

File tree

3 files changed

+35
-35
lines changed

3 files changed

+35
-35
lines changed

flask_shell2http/api.py

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -36,27 +36,27 @@ class shell2httpAPI(MethodView):
3636

3737
def get(self):
3838
try:
39-
md5: str = request.args.get("key")
40-
logger.info(f"Report requested for key:'{md5}'.")
41-
if not md5:
39+
key: str = request.args.get("key")
40+
logger.info(f"Report requested for key:'{key}'.")
41+
if not key:
4242
raise Exception("No key provided in arguments.")
4343
# check if job has been finished
44-
future = self.executor.get_job(md5)
44+
future = self.executor.get_job(key)
4545
if future:
4646
if not future.done:
47-
return make_response(jsonify(status="running", md5=md5), 200)
47+
return make_response(jsonify(status="running", key=key), 200)
4848

4949
# pop future object since it has been finished
50-
self.executor.pop_job(md5)
50+
self.executor.pop_job(key)
5151

5252
# if yes, get result from store
53-
report = self.store.get_one(md5)
53+
report = self.store.get_one(key)
5454
if not report:
55-
raise Exception(f"Report does not exist for key:{md5}.")
55+
raise Exception(f"Report does not exist for key:{key}.")
5656

57-
resp = report.to_json()
57+
resp = report.to_dict()
5858
logger.debug(f"Requested report: {resp}")
59-
return make_response(resp, HTTPStatus.OK)
59+
return make_response(jsonify(resp), HTTPStatus.OK)
6060

6161
except Exception as e:
6262
logger.exception(e)
@@ -66,12 +66,12 @@ def post(self):
6666
try:
6767
logger.info(f"Received request for endpoint: '{request.url_rule}'.")
6868
# Check if command is correct and parse it
69-
cmd, md5 = self.request_parser.parse_req(request)
69+
cmd, key = self.request_parser.parse_req(request)
7070

7171
# run executor job in background
72-
job_key = JobExecutor.make_key(md5)
72+
job_key = JobExecutor.make_key(key)
7373
future = self.executor.new_job(
74-
future_key=job_key, fn=self.executor.run_command, cmd=cmd, md5=md5
74+
future_key=job_key, fn=self.executor.run_command, cmd=cmd, key=key
7575
)
7676
# callback that adds result to store
7777
future.add_done_callback(self.store.save_result)
@@ -80,7 +80,7 @@ def post(self):
8080

8181
logger.info(f"Job: '{job_key}' added to queue for command: {cmd}")
8282
return make_response(
83-
jsonify(status="running", key=md5), HTTPStatus.ACCEPTED,
83+
jsonify(status="running", key=key), HTTPStatus.ACCEPTED,
8484
)
8585

8686
except Exception as e:

flask_shell2http/classes.py

Lines changed: 17 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -22,18 +22,17 @@ class Report:
2222
Internal use only.
2323
"""
2424

25-
def __init__(self, md5, report, error, start_time, status="failed"):
25+
def __init__(self, key, report, error, start_time, status="failed"):
2626
self.start_time = start_time
2727
self.end_time = time.time()
2828
self.process_time = self.end_time - self.start_time
29-
self.md5 = md5
29+
self.key = key
3030
self.report = report
3131
self.error = error
3232
self.status = status
3333

34-
def to_json(self):
34+
def to_dict(self):
3535
resp = self.__dict__
36-
# resp["report"] = json.loads(self.report)
3736
return resp
3837

3938

@@ -46,36 +45,36 @@ class JobExecutor:
4645
executor: Executor
4746

4847
@staticmethod
49-
def make_key(md5) -> str:
50-
return f"job_{md5}"
48+
def make_key(k) -> str:
49+
return f"job_{k}"
5150

52-
def get_job(self, md5):
53-
key = self.make_key(md5)
51+
def get_job(self, k):
52+
key = self.make_key(k)
5453
return self.executor.futures._futures.get(key, None)
5554

56-
def cancel_job(self, md5):
57-
key = self.make_key(md5)
55+
def cancel_job(self, k):
56+
key = self.make_key(k)
5857
return self.executor.futures._futures.get(key).cancel()
5958

6059
def new_job(self, **kwargs):
6160
return self.executor.submit_stored(**kwargs)
6261

63-
def pop_job(self, md5):
64-
key = self.make_key(md5)
62+
def pop_job(self, k):
63+
key = self.make_key(k)
6564
return self.executor.futures.pop(key)
6665

6766
def __init__(self, executor) -> None:
6867
self.executor = executor
6968

70-
def run_command(self, cmd, md5) -> Report:
69+
def run_command(self, cmd, key) -> Report:
7170
"""
7271
This function is called by the executor to run given command
7372
using a subprocess asynchronously.
7473
7574
:returns:
7675
A ConcurrentFuture object where future.result = Report()
7776
"""
78-
job_key: str = self.make_key(md5)
77+
job_key: str = self.make_key(key)
7978
start_time = time.time()
8079
try:
8180
proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
@@ -89,10 +88,9 @@ def run_command(self, cmd, md5) -> Report:
8988
else:
9089
status = "failed"
9190

92-
stdout = {"result": stdout}
9391
logger.info(f"Job: '{job_key}' finished with status: '{status}'.")
9492
return Report(
95-
md5=md5,
93+
key=key,
9694
report=stdout,
9795
error=stderr,
9896
start_time=start_time,
@@ -101,10 +99,10 @@ def run_command(self, cmd, md5) -> Report:
10199

102100
except Exception as e:
103101
str_err = str(e)
104-
self.cancel_job(md5)
102+
self.cancel_job(key)
105103
logger.error(f"Job: '{job_key}' failed. Reason: {str_err}.")
106104
return Report(
107-
md5=md5,
105+
key=key,
108106
report=None,
109107
error=str_err,
110108
start_time=start_time,
@@ -125,7 +123,7 @@ def save_result(self, future) -> None:
125123
"""
126124
# get job result from future
127125
job_res = future.result()
128-
self.__results.update({job_res.md5: job_res})
126+
self.__results.update({job_res.key: job_res})
129127

130128
def get_all(self):
131129
return self.__results

flask_shell2http/helpers.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,12 @@ def list_replace(lst: list, old, new) -> None:
1717
def calc_hash(lst: list) -> str:
1818
"""
1919
Internal use only.
20-
Calculates md5sum of given command with it's byte-string.
20+
Calculates sha1sum of given command with it's byte-string.
21+
This is for non-cryptographic purpose,
22+
that's why a faster and insecure hashing algorithm is chosen.
2123
"""
2224
to_hash = " ".join(lst).encode("ascii")
23-
return __import__("hashlib").md5(to_hash).hexdigest()
25+
return __import__("hashlib").sha1(to_hash).hexdigest()
2426

2527

2628
def get_logger() -> logging.Logger:

0 commit comments

Comments
 (0)