Mercurial > prosody-modules
diff mod_http_roster_admin/README.md @ 5975:fe081789f7b5
All community modules: Unify file extention of Markdown files to .md
| author | Menel <menel@snikket.de> |
|---|---|
| date | Tue, 22 Oct 2024 10:26:01 +0200 |
| parents | mod_http_roster_admin/README.markdown@af1b3cef52e1 |
| children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mod_http_roster_admin/README.md Tue Oct 22 10:26:01 2024 +0200 @@ -0,0 +1,126 @@ +--- +labels: +- 'Stage-Beta' +summary: Delegate roster management to an external service +... + +*NOTE: THIS MODULE IS RELEASED UNDER THE MOZILLA PUBLIC LICENSE VERSION 2.* + +Normally the XMPP server will store and maintain the users' contact +rosters. This module lets you delegate roster management to an external +service. + +Prosody will make an HTTP request to fetch the roster from the external +service. The service will need to notify Prosody whenever a user's roster +changes, so that Prosody can fetch a new roster for that user. + +## Configuring this module + +This module relies on `mod_storage_memory` and `mod_block_subscriptions`. + +In `.parts/prosody/etc/prosody/prosody.cfg.lua`, where your particular +`VirtualHost` is being configured, add the following: + +``` lua +modules_enabled = { + "http_roster_admin", + "block_subscriptions", + "storage_memory", + "http_files" +} +modules_disabled = { + -- Prosody will get the roster from the backend app, + -- so we disable the default roster module. + "roster" +} +storage = { roster = "memory" } +http_roster_url = "http://localhost/contacts/%s" -- %s will be replaced by an URL-encoded username +``` + +The `http_roster_url` parameter needs to be configured to point to the +URL in the backend application which returns users' contacts rosters. + +In this URL, the pattern `%s` is replaced by an URL-encoded username. + +When the user *john* then connects to Prosody, and `http_roster_url` is +set to “http://app.example.org/contacts/%s”, then Prosody will make a +GET request to http://app.example.org/contacts/john + +## Protocol + +### Fetching rosters (Prosody to web app) + +Prosody considers the web application to always hold the most accurate and up-to-date +version of the user's roster. When a user first connects, Prosody fetches the roster +from the web application and caches it internally. + +Prosody will make a GET request to the URL specified in Prosody's configuration parameter +'http_roster_url'. In this URL, the pattern '%s' is replaced by an URL-encoded username. + +For example, when the user 'john' connects to Prosody, and http_roster_url is set +to "http://app.example.com/contacts/%s", Prosody will make a GET request to "http://app.example.com/contacts/john". + +The web app must return a JSON object, where each key is the JID of a contact, and the corresponding +value is data about that contact. + +If the user 'john' has friends 'marie' and 'michael', the web app would return a HTTP '200 OK' response +with the following contents: + +``` json +{ + "marie@example.com": { + "name": "Marie" + }, + + "michael@example.com": { + "name": "Michael" + } +} +``` + +### Notifying Prosody of roster changes + +The external service needs to notify Prosody whenever a user's roster +changes. To do this, it must make an HTTP POST request to either: + +- http://localhost:5280/roster_admin/refresh +- https://localhost:5281/roster_admin/refresh + +Make sure that the "http_files" module is enabled in Prosody's configuration, +for the above URLs to served. + +Ports 5280/5281 can be firewalled and the web server (i.e. Apache or Nginx) +can be configured to reverse proxy those URLs to for example +https://example.org/http-bind. + +The contents of the POST should be a JSON encoded array of usernames whose +rosters have changed. + +For example, if user ‘john’ became friends with ‘aaron’, both john’s +contact list and aaron’s contact lists have changed: + +``` json +["john", "aaron"] +``` + +When the operation is complete Prosody will reply with a summary of the +operation - a JSON object containing: + +- **status**: either “ok” (success) or “error” (operation completely failed) +- **message**: A human-readable message (for logging and debugging purposes) +- **updated**: The number of rosters successfully updated +- **errors**: The number of rosters that failed to update + +Example: + +``` json +{ + "status": "ok", + "message": "roster update complete", + "updated": 2, + "errors": 0 +} +``` + +Prosody may also return status codes `400` or `500` in case of errors (such +as a missing/malformed body).
