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:
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