mirror of https://github.com/nucypher/nucypher.git
more DRY
parent
e5688bdb42
commit
dff13f256d
|
@ -16,14 +16,12 @@ from nucypher.characters.control.interfaces import (
|
||||||
EnricoInterface,
|
EnricoInterface,
|
||||||
BobInterface
|
BobInterface
|
||||||
)
|
)
|
||||||
from nucypher.characters.control.serializers import (
|
|
||||||
AliceControlJSONSerializer,
|
|
||||||
BobControlJSONSerializer,
|
|
||||||
EnricoControlJSONSerializer,
|
|
||||||
CharacterControlSerializer
|
|
||||||
)
|
|
||||||
|
|
||||||
from nucypher.characters.control.specifications import AliceSpecification
|
from nucypher.characters.control.specifications import (
|
||||||
|
AliceSpecification,
|
||||||
|
BobSpecification,
|
||||||
|
EnricoSpecification
|
||||||
|
)
|
||||||
|
|
||||||
from nucypher.characters.control.specifications import CharacterSpecification
|
from nucypher.characters.control.specifications import CharacterSpecification
|
||||||
from nucypher.cli.processes import JSONRPCLineReceiver
|
from nucypher.cli.processes import JSONRPCLineReceiver
|
||||||
|
@ -40,18 +38,12 @@ class CharacterControllerBase(ABC):
|
||||||
|
|
||||||
(stdio, http, in-memory python containers, other IPC, or another protocol.)
|
(stdio, http, in-memory python containers, other IPC, or another protocol.)
|
||||||
"""
|
"""
|
||||||
|
|
||||||
_control_serializer_class = NotImplemented
|
|
||||||
_emitter_class = NotImplemented
|
_emitter_class = NotImplemented
|
||||||
|
|
||||||
def __init__(self, control_serializer=None, serialize: bool = False):
|
def __init__(self, serialize: bool = False):
|
||||||
|
|
||||||
# Control Serializer
|
|
||||||
self.serializer = control_serializer or self._control_serializer_class()
|
|
||||||
|
|
||||||
# Control Emitter
|
# Control Emitter
|
||||||
self.emitter = self._emitter_class()
|
self.emitter = self._emitter_class()
|
||||||
self.emitter.transport_serializer = self.serializer
|
|
||||||
|
|
||||||
# Disables request & response serialization
|
# Disables request & response serialization
|
||||||
self.serialize = serialize
|
self.serialize = serialize
|
||||||
|
@ -59,103 +51,79 @@ class CharacterControllerBase(ABC):
|
||||||
def get_serializer(self, interface_name: str):
|
def get_serializer(self, interface_name: str):
|
||||||
return self.specification.get_serializer(inteface_name)
|
return self.specification.get_serializer(inteface_name)
|
||||||
|
|
||||||
|
def _perform_action(self, action: str, request: dict) -> dict:
|
||||||
|
serializer = self.get_serializer(action)
|
||||||
|
response_data = serializer.dump(
|
||||||
|
getattr(
|
||||||
|
super(self.__class__, self),
|
||||||
|
action
|
||||||
|
)(
|
||||||
|
**serializer.load(request)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
return response_data
|
||||||
|
|
||||||
|
|
||||||
class AliceJSONController(AliceInterface, CharacterControllerBase):
|
class AliceJSONController(AliceInterface, CharacterControllerBase):
|
||||||
"""Serialized and validated JSON controller; Implements Alice's public interfaces"""
|
"""Serialized and validated JSON controller; Implements Alice's public interfaces"""
|
||||||
|
|
||||||
_control_serializer_class = AliceSpecification
|
|
||||||
specification = AliceSpecification
|
specification = AliceSpecification
|
||||||
_emitter_class = StdoutEmitter
|
_emitter_class = StdoutEmitter
|
||||||
|
|
||||||
@character_control_interface
|
@character_control_interface
|
||||||
def create_policy(self, request):
|
def create_policy(self, request):
|
||||||
serializer = self.get_serializer('create_policy')
|
return self._perform_action('create_policy', request)
|
||||||
response_data = serializer.dump(super().create_policy(**serializer.load(request)))
|
|
||||||
return response_data
|
|
||||||
|
|
||||||
@character_control_interface
|
@character_control_interface
|
||||||
def derive_policy_encrypting_key(self, label: str = None, request=None):
|
def derive_policy_encrypting_key(self, label: str = None, request=None):
|
||||||
label = label or request.get('label')
|
label = label or request.get('label')
|
||||||
serializer = self.get_serializer('derive_policy_encrypting_key')
|
return self._perform_action('derive_policy_encrypting_key', dict(label=label))
|
||||||
data = serializer.load(dict(label=label))
|
|
||||||
response_data = serializer.dump(super().derive_policy_encrypting_key(**data))
|
|
||||||
return response_data
|
|
||||||
|
|
||||||
|
|
||||||
@character_control_interface
|
@character_control_interface
|
||||||
def grant(self, request):
|
def grant(self, request):
|
||||||
serializer = self.get_serializer('grant')
|
return self._perform_action('grant', request)
|
||||||
response_data = serializer.dump(super().grant(**serializer.load(request)))
|
|
||||||
return response_data
|
|
||||||
|
|
||||||
@character_control_interface
|
@character_control_interface
|
||||||
def revoke(self, request):
|
def revoke(self, request):
|
||||||
serializer = self.get_serializer('revoke')
|
return self._perform_action('revoke', request)
|
||||||
response_data = serializer.dump(super().revoke(**serializer.load(request)))
|
|
||||||
return response_data
|
|
||||||
|
|
||||||
@character_control_interface
|
@character_control_interface
|
||||||
def decrypt(self, request: dict):
|
def decrypt(self, request: dict):
|
||||||
serializer = self.get_serializer('decrypt')
|
return self._perform_action('decrypt', request)
|
||||||
response_data = serializer.dump(super().decrypt(**serializer.load(request)))
|
|
||||||
return response_data
|
|
||||||
|
|
||||||
@character_control_interface
|
@character_control_interface
|
||||||
def public_keys(self, request):
|
def public_keys(self, request):
|
||||||
"""
|
return self._perform_action('public_keys', request)
|
||||||
Character control endpoint for getting Bob's encrypting and signing public keys
|
|
||||||
"""
|
|
||||||
serializer = self.get_serializer('public_keys')
|
|
||||||
response_data = serializer.dump(super().public_keys(**serializer.load(request)))
|
|
||||||
return response_data
|
|
||||||
|
|
||||||
|
|
||||||
class BobJSONController(BobInterface, CharacterControllerBase):
|
class BobJSONController(BobInterface, CharacterControllerBase):
|
||||||
"""Serialized and validated JSON controller; Implements Bob's public interfaces"""
|
"""Serialized and validated JSON controller; Implements Bob's public interfaces"""
|
||||||
|
|
||||||
_control_serializer_class = BobControlJSONSerializer
|
specification = BobSpecification
|
||||||
_emitter_class = StdoutEmitter
|
_emitter_class = StdoutEmitter
|
||||||
|
|
||||||
@character_control_interface
|
@character_control_interface
|
||||||
def join_policy(self, request):
|
def join_policy(self, request):
|
||||||
"""
|
return self._perform_action('join_policy', request)
|
||||||
Character control endpoint for joining a policy on the network.
|
|
||||||
"""
|
|
||||||
serialized_output = self.serializer.load_join_policy_input(request=request)
|
|
||||||
_result = super().join_policy(**serialized_output)
|
|
||||||
response = {'policy_encrypting_key': 'OK'} # FIXME
|
|
||||||
return response
|
|
||||||
|
|
||||||
@character_control_interface
|
@character_control_interface
|
||||||
def retrieve(self, request):
|
def retrieve(self, request):
|
||||||
"""
|
return self._perform_action('retrieve', request)
|
||||||
Character control endpoint for re-encrypting and decrypting policy data.
|
|
||||||
"""
|
|
||||||
result = super().retrieve(**self.serializer.load_retrieve_input(request=request))
|
|
||||||
response_data = self.serializer.dump_retrieve_output(response=result)
|
|
||||||
return response_data
|
|
||||||
|
|
||||||
@character_control_interface
|
@character_control_interface
|
||||||
def public_keys(self, request):
|
def public_keys(self, request):
|
||||||
"""
|
return self._perform_action('public_keys', request)
|
||||||
Character control endpoint for getting Bob's encrypting and signing public keys
|
|
||||||
"""
|
|
||||||
result = super().public_keys()
|
|
||||||
response_data = self.serializer.dump_public_keys_output(response=result)
|
|
||||||
return response_data
|
|
||||||
|
|
||||||
|
|
||||||
class EnricoJSONController(EnricoInterface, CharacterControllerBase):
|
class EnricoJSONController(EnricoInterface, CharacterControllerBase):
|
||||||
"""Serialized and validated JSON controller; Implements Enrico's public interfaces"""
|
"""Serialized and validated JSON controller; Implements Enrico's public interfaces"""
|
||||||
|
|
||||||
_control_serializer_class = EnricoControlJSONSerializer
|
specification = EnricoSpecification
|
||||||
_emitter_class = StdoutEmitter
|
_emitter_class = StdoutEmitter
|
||||||
|
|
||||||
@character_control_interface
|
@character_control_interface
|
||||||
def encrypt_message(self, request: str):
|
def encrypt_message(self, request: str):
|
||||||
result = super().encrypt_message(**self.serializer.load_encrypt_message_input(request=request))
|
return self._perform_action('encrypt_message', request)
|
||||||
response_data = self.serializer.dump_encrypt_message_output(response=result)
|
|
||||||
return response_data
|
|
||||||
|
|
||||||
|
|
||||||
class CharacterControlServer(CharacterControllerBase):
|
class CharacterControlServer(CharacterControllerBase):
|
||||||
|
@ -185,7 +153,7 @@ class CharacterControlServer(CharacterControllerBase):
|
||||||
self._internal_controller = character_controller
|
self._internal_controller = character_controller
|
||||||
self._internal_controller.emitter = self.emitter
|
self._internal_controller.emitter = self.emitter
|
||||||
|
|
||||||
super().__init__(control_serializer=self._internal_controller.serializer)
|
super().__init__()
|
||||||
|
|
||||||
self.log = Logger(app_name)
|
self.log = Logger(app_name)
|
||||||
|
|
||||||
|
@ -403,7 +371,7 @@ class WebController(CharacterControlServer):
|
||||||
|
|
||||||
_400_exceptions = (CharacterSpecification.MissingField,
|
_400_exceptions = (CharacterSpecification.MissingField,
|
||||||
CharacterSpecification.InvalidInputField,
|
CharacterSpecification.InvalidInputField,
|
||||||
CharacterControlSerializer.SerializerError)
|
)
|
||||||
try:
|
try:
|
||||||
response = interface(request=control_request.data, *args, **kwargs) # < ------- INLET
|
response = interface(request=control_request.data, *args, **kwargs) # < ------- INLET
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue