Add controllers module with a handle_receive method to pass a payload to a protocol.

Suitable protocol will be identified via protocol identify_payload methods.
merge-requests/130/head
Jason Robinson 2015-07-03 13:09:40 +03:00
rodzic 7935417275
commit 001060a37f
5 zmienionych plików z 52 dodań i 7 usunięć

Wyświetl plik

@ -0,0 +1,23 @@
import importlib
from federation.exceptions import NoSuitableProtocolFoundError
PROTOCOLS = (
"diaspora",
)
def handle_receive(payload, user=None):
"""Takes a payload and passes it to the correct protocol."""
protocol = None
for protocol_name in PROTOCOLS:
protocol = importlib.import_module("federation.protocols.%s.protocol" % protocol_name)
if protocol.identify_payload(payload):
break
if protocol:
proto_obj = protocol.Protocol()
return proto_obj.receive(payload, user)
else:
raise NoSuitableProtocolFoundError()

Wyświetl plik

@ -1,5 +1,3 @@
class EncryptedMessageError(Exception): class EncryptedMessageError(Exception):
pass pass
@ -10,3 +8,7 @@ class NoHeaderInMessageError(Exception):
class NoSenderKeyFoundError(Exception): class NoSenderKeyFoundError(Exception):
pass pass
class NoSuitableProtocolFoundError(Exception):
pass

Wyświetl plik

@ -1,6 +1,18 @@
import logging import logging
def identify_payload(payload):
"""Each protocol module should define an 'identify_payload' method.
Args:
payload (str) - Payload blob
Returns:
True or False - A boolean whether the payload matches this protocol.
"""
raise NotImplementedError("Implement in protocol module")
class BaseProtocol(object): class BaseProtocol(object):
# Should be implemented by subclasses # Should be implemented by subclasses

Wyświetl plik

@ -12,7 +12,15 @@ from federation.exceptions import EncryptedMessageError, NoHeaderInMessageError,
from federation.protocols.base import BaseProtocol from federation.protocols.base import BaseProtocol
class DiasporaProtocol(BaseProtocol): def identify_payload(payload):
try:
xml = unquote_plus(payload)
return xml.find(identify_str = '<diaspora xmlns="%s"' % Protocol.protocol_ns) > -1
except Exception:
return False
class Protocol(BaseProtocol):
"""Diaspora protocol parts """Diaspora protocol parts
Mostly taken from Pyaspora (https://github.com/lukeross/pyaspora). Mostly taken from Pyaspora (https://github.com/lukeross/pyaspora).
@ -22,7 +30,7 @@ class DiasporaProtocol(BaseProtocol):
user_agent = 'social-federation/diaspora/0.1' user_agent = 'social-federation/diaspora/0.1'
def __init__(self, contact_key_fetcher=None, *args, **kwargs): def __init__(self, contact_key_fetcher=None, *args, **kwargs):
super(DiasporaProtocol, self).__init__() super(Protocol, self).__init__()
self.get_contact_key = contact_key_fetcher self.get_contact_key = contact_key_fetcher
def receive(self, payload, user=None, *args, **kwargs): def receive(self, payload, user=None, *args, **kwargs):

Wyświetl plik

@ -1,9 +1,9 @@
from base64 import urlsafe_b64decode from base64 import urlsafe_b64decode
from lxml import etree from lxml import etree
import pytest import pytest
from federation.exceptions import EncryptedMessageError, NoSenderKeyFoundError
from federation.protocols.diaspora.protocol import DiasporaProtocol from federation.exceptions import EncryptedMessageError, NoSenderKeyFoundError
from federation.protocols.diaspora.protocol import Protocol
UNENCRYPTED_DOCUMENT = """<?xml version='1.0'?> UNENCRYPTED_DOCUMENT = """<?xml version='1.0'?>
@ -97,7 +97,7 @@ class TestDiasporaProtocol():
assert body == urlsafe_b64decode("{data}".encode("ascii")) assert body == urlsafe_b64decode("{data}".encode("ascii"))
def init_protocol(self, contact_key_fetcher=None): def init_protocol(self, contact_key_fetcher=None):
return DiasporaProtocol(contact_key_fetcher=contact_key_fetcher) return Protocol(contact_key_fetcher=contact_key_fetcher)
def get_unencrypted_doc(self): def get_unencrypted_doc(self):
return etree.fromstring(UNENCRYPTED_DOCUMENT) return etree.fromstring(UNENCRYPTED_DOCUMENT)