enowars5-service-stldoctor

STL-Analyzing A/D Service for ENOWARS5 in 2021
git clone https://git.sinitax.com/sinitax/enowars5-service-stldoctor
Log | Files | Refs | README | LICENSE | sfeed.txt

commit 3fbf5317832f3f78918a2cd76e85b9fa3d1af381
parent 4192fe6ca9bdf6e6f31daa13501541b187a58681
Author: Louis Burda <quent.burda@gmail.com>
Date:   Sat, 26 Jun 2021 14:28:44 +0200

check hash format and added more checks to returned stlinfo

Diffstat:
Mchecker/src/checker.py | 55++++++++++++++++++++++++++++++++++++++++++++-----------
1 file changed, 44 insertions(+), 11 deletions(-)

diff --git a/checker/src/checker.py b/checker/src/checker.py @@ -87,6 +87,9 @@ def parse_float(floatstr): except: return None +def has_alph(data, alph): + return len([v for v in data if v not in alph]) == 0 + def assert_match(data, pattern, exception): rem = re.search(pattern, data) if rem is None: @@ -389,7 +392,12 @@ class STLDoctorChecker(BaseChecker): raise BrokenServiceException(f"Unexpectedly {modelname} info contains one of {includes}: {combined}") return resp - def check_stlinfo(self, resp, ref_info): + def check_hash(self, hashstr): + if not has_alph(hashstr, b"0123456789abcdef"): + raise BrokenServiceException("Hash is not a hexadecimal number") + + def check_stlinfo(self, resp, ref_info, ref_modelid = None, + ref_modelname = None, ref_solidname = None): size = parse_int(assert_match(resp, b"File Size: (.*)\n", BrokenServiceException)) if not size or size != ref_info["size"]: raise BrokenServiceException(f"STL info returned no / invalid file size: {size} != {ref_info['size']}") @@ -403,14 +411,34 @@ class STLDoctorChecker(BaseChecker): if None in bb_size: raise BrokenServiceException(f"STL info returned invalid bounding box size: {bb_size_str}") if False in [approx_equal(bb_size[i], ref_info["bb_size"][i]) for i in range(3)]: - raise BrokenServiceException(f"Returned bounding box size is too far off: (REF) {ref_info['bb_size']} {bb_size}") + raise BrokenServiceException(f"Bounding box size doesnt match: (REF) {ref_info['bb_size']} {bb_size}") bb_origin_str = assert_match(resp, b"Bounding Box Origin: (.*)\n", BrokenServiceException) bb_origin = [parse_float(v) for v in bb_origin_str.split(b" x ")] if None in bb_origin: raise BrokenServiceException(f"STL info returned invalid bounding box origin: {bb_origin_str}") if False in [approx_equal(bb_origin[i], ref_info["bb_origin"][i]) for i in range(3)]: - raise BrokenServiceException(f"Returned bounding box origin is too far off: (REF) {ref_info['bb_origin']} {bb_origin}") + raise BrokenServiceException(f"Bounding box origin doesnt match: (REF) {ref_info['bb_origin']} {bb_origin}") + + triangle_count = parse_float(assert_match(resp, b"Triangle Count: (.*)\n", BrokenServiceException)) + if triangle_count is None or triangle_count != ref_info["triangle_count"]: + raise BrokenServiceException(f"Triangle count {triangle_count} doesnt match expected: {ref_info['triangle_count']}") + + if ref_modelname: + modelname = assert_match(resp, b"Model Name: (.*)\n", BrokenServiceException) + if modelname != ref_modelname: + raise BrokenServiceException(f"Got modelname {modelname}, expected {ref_modelname}") + + if ref_modelid: + modelid = assert_match(resp, b"Model ID: (.*)\n", BrokenServiceException) + if modelid != ref_modelid: + raise BrokenServiceException(f"Got modelid {modelid}, expected {ref_modelid}") + + if ref_solidname: + solidname = assert_match(resp, b"Solid Name: (.*)\n", BrokenServiceException) + if solidname != ref_solidname: + raise BrokenServiceException(f"Got solidname {solidname}, expected {ref_solidname}") + # TEST METHODS # @@ -429,11 +457,13 @@ class STLDoctorChecker(BaseChecker): if register: self.do_auth(conn, authstr) modelid = self.do_upload(conn, modelname, stlfile) + self.check_hash(modelid) expected = [modelname, solidname, stlfile, modelid] info, stlfile = self.check_in_search(conn, modelname, expected, download = True) - self.check_stlinfo(info, ref_info) + self.check_stlinfo(info, ref_info, ref_modelname = modelname, + ref_modelid = modelid, ref_solidname = solidname) if register: - resp = self.check_listed(conn, [modelname, modelid]) + resp = self.check_listed(conn, [modelname, modelid + b"-"]) self.closeconn(conn) # Try getting file from a new session @@ -442,11 +472,13 @@ class STLDoctorChecker(BaseChecker): self.check_not_in_search(conn, modelname, expected, download = True, fail = True) self.do_auth(conn, authstr) info, stlfile = self.check_in_search(conn, modelname, expected, download = True) - self.check_stlinfo(info, ref_info) - self.check_listed(conn, [modelid, modelname]) + self.check_stlinfo(info, ref_info, ref_modelname = modelname, + ref_modelid = modelid, ref_solidname = solidname) + self.check_listed(conn, [modelname, modelid + b"-"]) else: info, stlfile = self.check_in_search(conn, modelname, expected, download = True) - self.check_stlinfo(info, ref_info) + self.check_stlinfo(info, ref_info, ref_modelname = modelname, + ref_modelid = modelid, ref_solidname = solidname) self.closeconn(conn) @@ -484,7 +516,7 @@ class STLDoctorChecker(BaseChecker): conn = self.openconn() self.do_auth(conn, authstr) modelid = self.do_upload(conn, modelname, stlfile) - self.check_listed(conn, [modelid, modelname]) + self.check_listed(conn, [modelname, modelid + b"-"]) self.closeconn(conn) if registered: @@ -667,8 +699,9 @@ class STLDoctorChecker(BaseChecker): if not self.do_auth(conn, user): self.closeconn(conn) # We dont raise an exception, because it could be that user dir was cleaned - # up just before we logged in, not necessarily because of an invalid prehash - # raise EnoException(f"Reversing of hash {u} returned invalid preimage {user}") + # up just before we logged in, not necessarily because of an invalid prehash. + # If there was a problem with the preimage generation, we wont find a flag and + # an exception will be raised later anways... continue # List all private files of user