.. _components: =================== Libervia Components =================== Libervia can act as an XMPP server component, which can be seen as a generic plugin for XMPP servers. This page explains which components are available and how to use them. Running a component =================== Components are linked to a Libervia profile in the same way as normal clients. To run a component, you'll need to know its *entry point*, which is the name of the import name of plugin managing it. The entry point to use will be specified in the component installation documentation. You'll also have to declare the component on your XMPP server, this is a server dependent step and you'll have to check your server documentation for details. You'll have to specify a **shared secret** (can also be named simply *password*) that must be set both on the XMPP server and as the XMPP password of the Libervia profile. Here is a list of relevant documentation for most common servers: ejabberd https://docs.ejabberd.im/admin/configuration/listen-options/ MongooseIm https://esl.github.io/MongooseDocs/latest/configuration/listen/#xmpp-components-listenservice OpenFire use the web-based admin panel Prosody https://prosody.im/doc/components Tigase https://docs.tigase.net/tigase-server/stable-snapshot/Administration_Guide/webhelp/externalComponentConfiguration.html On Libervia, setup is done with Libervia CLI's :ref:`profile create ` command. You'll usually want to have the component to start automatically when the backend is started, for this you must unset the profile password (not to be confused with the XMPP password which is the one also set on the server configuration) with ``-p ""`` and set auto-connection with ``-A``. You'll specify the XMPP password (also named *shared secret* in `XEP-0144`_ terminology) with ``-x `` and the JID to use with ``-j .``. The component entry point is specified with ``-C ``. .. _XEP-0144: https://xmpp.org/extensions/xep-0114.html example ------- Louise wants to run an ActivityPub gateway on her server ``example.org`` with the JID ``ap.example.org``. The shared secret is ``xmpp_rocks`` and she wants the component to start automatically with the backend, thus she doesn't set a profile password. The entry-point for ActivityPub component is ``ap-gateway``, and she wants to use the same name for the profile. To do this, she enters the following command:: $ li profile create ap-gateway -j ap.example.org -p "" -x xmpp_rocks -C ap-gateway -A The component will then be started next time Libervia Backend is launched. If Louise wants to connect it immediately, she can use:: $ li profile connect -cp ap-gateway Available Components ==================== Below is a list of currently available components in Libervia, and instructions on what they do and how to use them. File Sharing ------------ **entry_point:** ``file-sharing`` File Sharing component manage the hosting of user files. Users can upload file there using either `Jingle File Transfer`_ or `HTTP File Upload`_. There is no limit to the size of files which can be uploaded, but administrators can set a quota to limit the space that can be used. Files can be retrieved using `File Information Sharing`_, and deleted using `Ad-Hoc Commands`_. Files can be shared with a public HTTP link, or made available only to a specified list of entities (JIDs). Permissions can be set through Ad-Hoc Commands. .. _Jingle File Transfer: https://xmpp.org/extensions/ .. _HTTP File Upload: https://xmpp.org/extensions/xep-0363.html .. _File Information Sharing: https://xmpp.org/extensions/xep-0329.html .. _Ad-Hoc Commands: https://xmpp.org/extensions/xep-0050.html Configuration ~~~~~~~~~~~~~ All options are to be set in ``[component file-sharing]`` section. ``http_upload_port`` port to use for HTTP File Upload **default**: 8888 ``http_upload_connection_type`` either ``http`` or ``https``. **default**: ``https`` Note that HTTP Upload should always be ``https`` to end-user, the ``http`` option is to be used only if you use a HTTP server as a proxy, and this server is already set for TLS. ``http_upload_public_facing_url`` must be set to the URL that end-user will see. Notably useful if the component is behind a proxy. **default**: ``https://:` stanzas, i.e. the ones used for instant messaging). Of course it also converts in a similar way in the other direction (XMPP → ActivityPub). A received AP item will be converted to an XMPP pubsub item if any of the following conditions is fulfilled: - it is addressed to the special `*public* collection`_ - it is addressed to a local *followers* collection A received AP item will be converted to an XMPP message if all the following conditions are fulfilled: - it is **not** addressed to the special *public* collection - it is **not** addressed to a any local *followers* collection. In other words, if an AP item is addressed directly to one or more local users, is not public and is not addressed to a *followers* collection, it will be converted to an XMPP message, otherwise it will be converted to an XMPP pubsub item. The behaviour is symmetric, thus if you send an XMPP message it will be converted to an AP item which will be only addressed to your recipient. If you write using XMPP pubsub, the suitable followers collections of the target AP actor will be automatically added, and the item will have the special *public* collection added. .. note:: ActivyPub doesn't do any kind of `end-to-end encryption`_, it is **not** the same level of privacy as XMPP. Messages will be at minimum readable by the administrators of the AP gateway and of the ActivyPub server of the destinee. Be sure to understand that before sending messages. If you need more privacy, you need to use either XMPP only (without the ActivityPub gateway) with clients implementing correctly end-to-end encryption, or an other software. Depending of the level of pricacy required, you may want to use authentication by a separated channel, a client which has been audited, encryption by default, etc. This is beyond the scope of this AP gateway documentation. In short, don't use ActivityPub if you need a high level of privacy. This is a current protocol limitation, and there is nothing that this gateway can do about this until ActivityPub and its implementations evolve. .. _XEP-0277 (Microblogging over XMPP): https://xmpp.org/extensions/xep-0277.html .. _*public* collection: https://www.w3.org/TR/activitypub/#public-addressing .. _end-to-end encryption: https://en.wikipedia.org/wiki/End-to-end_encryption Message/Item Retraction ~~~~~~~~~~~~~~~~~~~~~~~ If you retract a pubsub item (e.g. a blog post), that is followed by ActivityPub actors, a suitable `Delete` activity will be emitted. In other words, the ActivityPub servers will be notified of the retraction. Similarly if an AP actor is deleting an item, a suitable `XEP-0060 retraction event`_ will be sent to subscribers. In the case of direct messages (see :ref:`ap-message_delivery`), `XEP-0424 (Message Retraction)`_ is used in both reception (AP ``Delete`` activity is converted to XEP-0424 and vice versa). All of this should be transparent to users as long as their clients support the mentioned XEPs. .. note:: When retracting a message/item, a retraction request (or equivalent AP "Delete" activity) is sent, so the other end clients **may** delete the item. However, there is no way to be sure that the item will be actually deleted: once something is sent on the network, any recipient can see it, copy it, share it, etc. There is no way to forbid that, and this is true for software, decentralized or not (and not only ActivityPub or XMPP). Be sure to understand that before sending anything sensitive. .. note:: When deleting an item on ActivityPub, the item is often replaced by a "tombstone", and it's not possible to send a new item with the same ID. Some software (it's at least the case with Mastodon), will silently reject the item, and thus people won't see it. This is a different behaviour from XMPP where you can publish a pubsub item, retract it, and publish a new item with the same ID. Thus if you retract an item, be sure to publish any new one with new and unique ID, otherwise the item may not appear to ActivityPub users (and as the item may be rejected silently, you may not be notified). However this should not be a problem in the vast majority of cases, as most XMPP client implementing pubsub or pubsub service will generate automatically unique IDs for new items. .. _XEP-0060 retraction event: https://xmpp.org/extensions/xep-0060.html#publisher-delete .. _XEP-0424 (Message Retraction): https://xmpp.org/extensions/xep-0424.html Blocking an User ~~~~~~~~~~~~~~~~ You can block AP actors using :ref:`its virtual JID ` in the same way as for any XMPP entity, by using `XEP-0191 (Blocking Command)`_. This is done at the XMPP server level and your server must support it. From client side, many clients support it, and you can use Libervia CLI to do it from command-line (see :ref:`libervia-cli_blocking`). .. _XEP-0191 (Blocking Command): https://xmpp.org/extensions/xep-0191.html Identity and Avatar ~~~~~~~~~~~~~~~~~~~ The gateway does the conversion between XMPP identity and AP actor metadata. XMPP "identity" is actually a compilation of data coming from various locations and in particular `XEP-0292 (vCard4 Over XMPP)`_. In those data, vCard's ``nickname`` (first found) is used as AP ``name`` field, and vCard's ``note`` is used as AP's ``summary`` (it's generally a self-description of users). For avatars, `XEP-0084 (User Avatar)`_ is used (and actor's ``icon`` field is used on AP side). Avatars are downloaded the first time that they are requested, and kept in cache for future requests. Even if XEP-0292 and XEP-0084 are the main XEPs used, Libervia checks various locations, and other extensions like `XEP-0054 (vcard-temp)`_ may be used as fallback. .. _XEP-0292 (vCard4 Over XMPP): https://xmpp.org/extensions/xep-0292.html .. _XEP-0084 (User Avatar): https://xmpp.org/extensions/xep-0084.html .. _XEP-0054 (vcard-temp): https://xmpp.org/extensions/xep-0054.html Mentions ~~~~~~~~ Mentions are converted by the gateway under some conditions explained below. When receiving an AP item which converts to a pubsub item (i.e. not a direct message), for any local user mentioned (using a tag of type ``Mention``) or directly specified in a target field (``to``, ``bto``, ``cc`` or ``bcc``), a `XEP-0372 (References)`_ type mention will be emitted. This is not done for direct message as the recipients are already specified, and sending reference is most probably not desired for a private message. In the direction XMPP 🠞 ActivityPub, it's more complicated because XMPP sends references separately from the pubsub item, while ActivityPub links them in the same item. If a XEP-0372 reference targeting an AP actor is received and anchor a pubsub item, the item will be looked after in cache. If found, it will be converted to an AP item, a mention will be added, and the item will be delivered to the mentioned entity. This only works if the mentioned actor is on a server which has not already received the original item, because otherwise the AP implementation will most probably ignore the new item which has the same ID. It is hard to avoid sending first published item, then the same item with the reference, because XEP-0372 references are received after the published items. To work around that, when an XMPP blog item is received, its body is scanned to find ``@user@server.tld`` type mention, and if found a mention is automatically added to the resulting AP item. It is not ideal to parse the body, but that's an acceptable trade-off to make mention working. This behaviour is activated by default, but can be deactivated by setting ``auto_mentions`` option to ``false``. Auto mentions are only used for pubsub items, and not for direct messages for the same reason as mention are not checked in AP direct messages (see above). .. note:: For auto mentions, it's the AP actor handle which must be used, not the corresponding virtual JID. If you want to mention ``louise@example.org`` then you must use directly ``@louise@example.org``, and NOT something like ``@louise\40example.org@ap.example.net``. To mention XMPP entities, your client must use XEP-0372 references directly. .. _XEP-0372 (References): https://xmpp.org/extensions/xep-0372.html Using the Component (for developers) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Publication of AP items can be tested using the following method (with can be accessed through the ``APSend`` bridge method, client is then replaced by the ``profile`` name, as last argument): .. automethod:: sat.plugins.plugin_comp_ap_gateway.APGateway.publishMessage The method can be used either with CLI's :ref:`debug bridge method ` or with any D-Bus tool like ``qdbus`` or ``d-feet`` (only if you use the D-Bus bridge). example ~~~~~~~ On its ``example.net`` Mastodon instance, Pierre has published a message with the id ``https://example.net/@pierre/106986412193109832``. To send a reply to this message, Louise can use the following command:: $ li debug bridge method -c APSend '"{\"node\": \"https://example.net/@pierre/106986412193109832\", \"content\": \"A lille hello from XMPP\"}","pierre\\40example.net@ap.example.org", "louise"' Note the double escaping, one for the shell argument, and the other to specify JSON object.