diff --git a/opentaxii/cli/auth.py b/opentaxii/cli/auth.py index 428b81fe..26af5afc 100644 --- a/opentaxii/cli/auth.py +++ b/opentaxii/cli/auth.py @@ -21,6 +21,7 @@ def create_account(argv=None): account = app.taxii_server.auth.api.create_account( username=args.username, password=args.password, + is_admin=args.admin, ) token = app.taxii_server.auth.authenticate( username=account.username, diff --git a/opentaxii/entities.py b/opentaxii/entities.py index 9ff27a15..4c317e30 100644 --- a/opentaxii/entities.py +++ b/opentaxii/entities.py @@ -20,12 +20,12 @@ def __init__( def can_read(self, collection_name): return ( self.is_admin or - self.permissions.get(collection_name) in ('read', 'modify')) + self.permissions.get(str(collection_name)) in ('read', 'modify')) def can_modify(self, collection_name): return ( self.is_admin or - self.permissions.get(collection_name) == 'modify') + self.permissions.get(str(collection_name)) == 'modify') def __repr__(self): return ( diff --git a/opentaxii/taxii2/entities.py b/opentaxii/taxii2/entities.py index e660f225..004c1ad5 100644 --- a/opentaxii/taxii2/entities.py +++ b/opentaxii/taxii2/entities.py @@ -66,7 +66,7 @@ def can_read(self, account: Optional[Account]): return self.is_public or ( account and ( - account.is_admin or "read" in set(account.permissions.get(self.id, [])) + account.is_admin or "read" in set(account.permissions.get(str(self.id), [])) ) ) @@ -75,7 +75,7 @@ def can_write(self, account: Optional[Account]): return self.is_public_write or ( account and ( - account.is_admin or "write" in set(account.permissions.get(self.id, [])) + account.is_admin or "write" in set(account.permissions.get(str(self.id), [])) ) ) diff --git a/opentaxii/taxii2/http.py b/opentaxii/taxii2/http.py index a0408d33..989330e9 100644 --- a/opentaxii/taxii2/http.py +++ b/opentaxii/taxii2/http.py @@ -3,12 +3,25 @@ from typing import Dict, Optional from flask import Response, make_response +from uuid import UUID + + +class Taxii2JSONEncoder(json.JSONEncoder): + """ + Extended JSONEncoder class with additional data types support. + """ + def default(self, o): + """Implements UUID serialization""" + if isinstance(o, UUID): + return str(o) + + return super().default(o) def make_taxii2_response(data, status: Optional[int] = 200, extra_headers: Optional[Dict] = None) -> Response: """Turn input data into valid taxii2 response.""" if not isinstance(data, str): - data = json.dumps(data) + data = json.dumps(data, cls=Taxii2JSONEncoder) response = make_response((data, status)) response.content_type = "application/taxii+json;version=2.1" response.headers.update(extra_headers or {})