kopia lustrzana https://gitlab.com/jaywink/federation
Add configuration for Matrix appservice registration file
Includes a function to print it out in YAML. Currently requires Django configured.matrix-appservice
rodzic
aeb1b37e2c
commit
01dac38921
|
@ -105,3 +105,25 @@ the complex protocol related details. This library will then aim to abstract muc
|
||||||
appservice gives or takes behind the same API as is provided for the other protocols.
|
appservice gives or takes behind the same API as is provided for the other protocols.
|
||||||
|
|
||||||
Currently support is being added, please visit back in future versions.
|
Currently support is being added, please visit back in future versions.
|
||||||
|
|
||||||
|
NOTE! Current features also assume Django is configured, though this is likely to not be
|
||||||
|
the case in the future.
|
||||||
|
|
||||||
|
Appservice
|
||||||
|
..........
|
||||||
|
|
||||||
|
To generate the appservice registration file you must ensure you've added the relevant
|
||||||
|
configuration (see :ref:`usage-configuration`), at minimum providing the following:
|
||||||
|
|
||||||
|
* ``base_url``
|
||||||
|
* ``matrix_config_function``
|
||||||
|
|
||||||
|
Then launch a Django shell inside your project and run the following:
|
||||||
|
|
||||||
|
::
|
||||||
|
|
||||||
|
from federation.protocols.matrix.appservice import print_registration_yaml
|
||||||
|
print_registration_yaml()
|
||||||
|
|
||||||
|
This YAML needs to be registered with the linked Matrix homeserver as instructed in the
|
||||||
|
relevant homeserver documentation.
|
||||||
|
|
|
@ -195,6 +195,8 @@ It must be installed separately.
|
||||||
.. autofunction:: federation.hostmeta.django.generators.matrix_server_wellknown_view
|
.. autofunction:: federation.hostmeta.django.generators.matrix_server_wellknown_view
|
||||||
.. autofunction:: federation.hostmeta.django.generators.nodeinfo2_view
|
.. autofunction:: federation.hostmeta.django.generators.nodeinfo2_view
|
||||||
|
|
||||||
|
.. _usage-configuration:
|
||||||
|
|
||||||
Configuration
|
Configuration
|
||||||
.............
|
.............
|
||||||
|
|
||||||
|
@ -233,6 +235,15 @@ Some settings need to be set in Django settings. An example is below:
|
||||||
"homeserver_base_url": "https://matrix.domain.tld",
|
"homeserver_base_url": "https://matrix.domain.tld",
|
||||||
# Homeserver domain and port (not server domain)
|
# Homeserver domain and port (not server domain)
|
||||||
"homeserver_domain_with_port": "matrix.domain.tld:443",
|
"homeserver_domain_with_port": "matrix.domain.tld:443",
|
||||||
|
# Appservice details
|
||||||
|
"appservice": {
|
||||||
|
# Unique ID to register with at the homeserver. Don't change this after creating.
|
||||||
|
"id": "uniqueid",
|
||||||
|
# Appservice user localpart (lowercase, should ideally start with _)
|
||||||
|
"sender_localpart": "_myawesomeapp",
|
||||||
|
# Secret token for communication
|
||||||
|
"token": "secret_token",
|
||||||
|
},
|
||||||
# (Optional) location of identity server
|
# (Optional) location of identity server
|
||||||
"identity_server_base_url": "https://id.domain.tld",
|
"identity_server_base_url": "https://id.domain.tld",
|
||||||
# (Optional) other keys to include in the client well-known (must be a dictionary)
|
# (Optional) other keys to include in the client well-known (must be a dictionary)
|
||||||
|
|
|
@ -0,0 +1,52 @@
|
||||||
|
from typing import Dict
|
||||||
|
|
||||||
|
import yaml
|
||||||
|
|
||||||
|
from federation.utils.django import get_configuration
|
||||||
|
from federation.utils.matrix import get_matrix_configuration
|
||||||
|
|
||||||
|
|
||||||
|
def get_registration_config() -> Dict:
|
||||||
|
"""
|
||||||
|
Get registration config.
|
||||||
|
|
||||||
|
Requires Django support currently.
|
||||||
|
"""
|
||||||
|
config = get_configuration()
|
||||||
|
matrix_config = get_matrix_configuration()
|
||||||
|
|
||||||
|
if not matrix_config.get("appservice"):
|
||||||
|
raise Exception("No appservice configured")
|
||||||
|
|
||||||
|
return {
|
||||||
|
"id": matrix_config["appservice"]["id"],
|
||||||
|
"url": f"{config['base_url']}/matrix/appservice",
|
||||||
|
"as_token": matrix_config["appservice"]["token"],
|
||||||
|
"hs_token": matrix_config["appservice"]["token"],
|
||||||
|
"sender_localpart": matrix_config["appservice"]["sender_localpart"],
|
||||||
|
"namespaces": {
|
||||||
|
"users": [
|
||||||
|
{
|
||||||
|
"exclusive": False,
|
||||||
|
"regex": "@.*",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
"aliases": [
|
||||||
|
{
|
||||||
|
"exclusive": False,
|
||||||
|
"regex": "#.*",
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"rooms": [],
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
def print_registration_yaml():
|
||||||
|
"""
|
||||||
|
Print registration file details.
|
||||||
|
|
||||||
|
Requires Django support currently.
|
||||||
|
"""
|
||||||
|
registration = get_registration_config()
|
||||||
|
print(yaml.safe_dump(registration))
|
|
@ -7,6 +7,7 @@ FEDERATION = {
|
||||||
"get_object_function": "federation.tests.django.utils.get_object_function",
|
"get_object_function": "federation.tests.django.utils.get_object_function",
|
||||||
"get_private_key_function": "federation.tests.django.utils.get_private_key",
|
"get_private_key_function": "federation.tests.django.utils.get_private_key",
|
||||||
"get_profile_function": "federation.tests.django.utils.get_profile",
|
"get_profile_function": "federation.tests.django.utils.get_profile",
|
||||||
|
"matrix_config_function": "federation.tests.django.utils.matrix_config_func",
|
||||||
"process_payload_function": "federation.tests.django.utils.process_payload",
|
"process_payload_function": "federation.tests.django.utils.process_payload",
|
||||||
"search_path": "/search?q=",
|
"search_path": "/search?q=",
|
||||||
"tags_path": "/tag/:tag:/",
|
"tags_path": "/tag/:tag:/",
|
||||||
|
|
|
@ -1,3 +1,6 @@
|
||||||
|
from typing import Dict
|
||||||
|
|
||||||
|
# noinspection PyPackageRequirements
|
||||||
from Crypto.PublicKey.RSA import RsaKey
|
from Crypto.PublicKey.RSA import RsaKey
|
||||||
|
|
||||||
from federation.entities.base import Profile
|
from federation.entities.base import Profile
|
||||||
|
@ -27,5 +30,22 @@ def get_profile(fid=None, handle=None, guid=None, request=None):
|
||||||
return dummy_profile()
|
return dummy_profile()
|
||||||
|
|
||||||
|
|
||||||
|
def matrix_config_func() -> Dict:
|
||||||
|
return {
|
||||||
|
"homeserver_base_url": "https://matrix.domain.tld",
|
||||||
|
"homeserver_domain_with_port": "matrix.domain.tld:443",
|
||||||
|
"appservice": {
|
||||||
|
"id": "uniqueid",
|
||||||
|
"sender_localpart": "_myawesomeapp",
|
||||||
|
"token": "secret_token",
|
||||||
|
},
|
||||||
|
"identity_server_base_url": "https://id.domain.tld",
|
||||||
|
"client_wellknown_other_keys": {
|
||||||
|
"org.foo.key" "barfoo",
|
||||||
|
},
|
||||||
|
"registration_shared_secret": "supersecretstring",
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
def process_payload(request):
|
def process_payload(request):
|
||||||
return True
|
return True
|
||||||
|
|
|
@ -0,0 +1,34 @@
|
||||||
|
from federation.protocols.matrix.appservice import get_registration_config, print_registration_yaml
|
||||||
|
|
||||||
|
|
||||||
|
def test_get_registration():
|
||||||
|
config = get_registration_config()
|
||||||
|
assert config == {
|
||||||
|
"id": "uniqueid",
|
||||||
|
"url": "https://example.com/matrix/appservice",
|
||||||
|
"as_token": "secret_token",
|
||||||
|
"hs_token": "secret_token",
|
||||||
|
"sender_localpart": "_myawesomeapp",
|
||||||
|
"namespaces": {
|
||||||
|
"users": [
|
||||||
|
{
|
||||||
|
"exclusive": False,
|
||||||
|
"regex": "@.*",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
"aliases": [
|
||||||
|
{
|
||||||
|
"exclusive": False,
|
||||||
|
"regex": "#.*",
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"rooms": [],
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
def test_print_registration_yaml():
|
||||||
|
"""
|
||||||
|
Just execute and ensure doesn't crash.
|
||||||
|
"""
|
||||||
|
print_registration_yaml()
|
|
@ -1,7 +1,7 @@
|
||||||
import hashlib
|
import hashlib
|
||||||
import hmac
|
import hmac
|
||||||
import uuid
|
import uuid
|
||||||
from typing import Dict
|
from typing import Dict, Optional
|
||||||
|
|
||||||
import requests
|
import requests
|
||||||
|
|
||||||
|
@ -26,6 +26,19 @@ def generate_dendrite_mac(shared_secret: str, username: str, password: str, admi
|
||||||
return mac.hexdigest()
|
return mac.hexdigest()
|
||||||
|
|
||||||
|
|
||||||
|
def get_matrix_configuration() -> Optional[Dict]:
|
||||||
|
"""
|
||||||
|
Return Matrix configuration.
|
||||||
|
|
||||||
|
Requires Django support currently.
|
||||||
|
"""
|
||||||
|
try:
|
||||||
|
matrix_config_func = get_function_from_config("matrix_config_function")
|
||||||
|
except AttributeError:
|
||||||
|
raise AttributeError("Not configured for Matrix support")
|
||||||
|
return matrix_config_func()
|
||||||
|
|
||||||
|
|
||||||
def register_dendrite_user(username: str) -> Dict:
|
def register_dendrite_user(username: str) -> Dict:
|
||||||
"""
|
"""
|
||||||
Shared secret registration for Dendrite.
|
Shared secret registration for Dendrite.
|
||||||
|
@ -43,11 +56,7 @@ def register_dendrite_user(username: str) -> Dict:
|
||||||
'device_id': 'randomdevice'
|
'device_id': 'randomdevice'
|
||||||
}
|
}
|
||||||
"""
|
"""
|
||||||
try:
|
matrix_config = get_matrix_configuration
|
||||||
matrix_config_func = get_function_from_config("matrix_config_function")
|
|
||||||
except AttributeError:
|
|
||||||
raise AttributeError("Not configured for Matrix support")
|
|
||||||
matrix_config = matrix_config_func()
|
|
||||||
|
|
||||||
password = str(uuid.uuid4())
|
password = str(uuid.uuid4())
|
||||||
mac = generate_dendrite_mac(
|
mac = generate_dendrite_mac(
|
||||||
|
|
3
setup.py
3
setup.py
|
@ -40,6 +40,7 @@ setup(
|
||||||
"python-dateutil>=2.4.0",
|
"python-dateutil>=2.4.0",
|
||||||
"python-xrd>=0.1",
|
"python-xrd>=0.1",
|
||||||
"pytz",
|
"pytz",
|
||||||
|
"PyYAML",
|
||||||
"requests>=2.8.0",
|
"requests>=2.8.0",
|
||||||
"requests-http-signature-jaywink>=0.1.0.dev0",
|
"requests-http-signature-jaywink>=0.1.0.dev0",
|
||||||
],
|
],
|
||||||
|
@ -59,5 +60,5 @@ setup(
|
||||||
'Topic :: Internet',
|
'Topic :: Internet',
|
||||||
'Topic :: Software Development :: Libraries :: Python Modules',
|
'Topic :: Software Development :: Libraries :: Python Modules',
|
||||||
],
|
],
|
||||||
keywords='federation diaspora activitypub federate fediverse social',
|
keywords='federation diaspora activitypub matrix protocols federate fediverse social',
|
||||||
)
|
)
|
||||||
|
|
Ładowanie…
Reference in New Issue