view mod_http_roster_admin/README.md @ 6082:1a6cd0bbb7ab

mod_compliance_2023: Add 2023 Version of the compliance module, basis is the 2021 Version. diff --git a/mod_compliance_2023/README.md b/mod_compliance_2023/README.md new file mode 100644 --- /dev/null +++ b/mod_compliance_2023/README.md @@ -0,0 +1,22 @@ +--- +summary: XMPP Compliance Suites 2023 self-test +labels: +- Stage-Beta +rockspec: + dependencies: + - mod_cloud_notify + +... + +Compare the list of enabled modules with +[XEP-0479: XMPP Compliance Suites 2023] and produce basic report to the +Prosody log file. + +If installed with the Prosody plugin installer then all modules needed for a green checkmark should be included. (With prosody 0.12 only [mod_cloud_notify] is not included with prosody and we need the community module) + +# Compatibility + + Prosody-Version Status + --------------- ---------------------- + trunk Works as of 2024-12-21 + 0.12 Works diff --git a/mod_compliance_2023/mod_compliance_2023.lua b/mod_compliance_2023/mod_compliance_2023.lua new file mode 100644 --- /dev/null +++ b/mod_compliance_2023/mod_compliance_2023.lua @@ -0,0 +1,79 @@ +-- Copyright (c) 2021 Kim Alvefur +-- +-- This module is MIT licensed. + +local hostmanager = require "core.hostmanager"; + +local array = require "util.array"; +local set = require "util.set"; + +local modules_enabled = module:get_option_inherited_set("modules_enabled"); + +for host in pairs(hostmanager.get_children(module.host)) do + local component = module:context(host):get_option_string("component_module"); + if component then + modules_enabled:add(component); + modules_enabled:include(module:context(host):get_option_set("modules_enabled", {})); + end +end + +local function check(suggested, alternate, ...) + if set.intersection(modules_enabled, set.new({suggested; alternate; ...})):empty() then return suggested; end + return false; +end + +local compliance = { + array {"Server"; check("tls"); check("disco")}; + + array {"Advanced Server"; check("pep", "pep_simple")}; + + array {"Web"; check("bosh"); check("websocket")}; + + -- No Server requirements for Advanced Web + + array {"IM"; check("vcard_legacy", "vcard"); check("carbons"); check("http_file_share", "http_upload")}; + + array { + "Advanced IM"; + check("vcard_legacy", "vcard"); + check("blocklist"); + check("muc"); + check("private"); + check("smacks"); + check("mam"); + check("bookmarks"); + }; + + array {"Mobile"; check("smacks"); check("csi_simple", "csi_battery_saver")}; + + array {"Advanced Mobile"; check("cloud_notify")}; + + array {"A/V Calling"; check("turn_external", "external_services", "turncredentials", "extdisco")}; + +}; + +function check_compliance() + local compliant = true; + for _, suite in ipairs(compliance) do + local section = suite:pop(1); + if module:get_option_boolean("compliance_" .. section:lower():gsub("%A", "_"), true) then + local missing = set.new(suite:filter(function(m) return type(m) == "string" end):map(function(m) return "mod_" .. m end)); + if suite[1] then + if compliant then + compliant = false; + module:log("warn", "Missing some modules for XMPP Compliance 2023"); + end + module:log("info", "%s Compliance: %s", section, missing); + end + end + end + + if compliant then module:log("info", "XMPP Compliance 2023: Compliant ✔️"); end +end + +if prosody.start_time then + check_compliance() +else + module:hook_global("server-started", check_compliance); +end +
author Menel <menel@snikket.de>
date Sun, 22 Dec 2024 16:06:28 +0100
parents fe081789f7b5
children
line wrap: on
line source

---
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).