mod_http_roster_admin/README.markdown
author Matthew Wild <mwild1@gmail.com>
Sun, 29 Apr 2018 08:33:54 +0100
changeset 3010 e6f91e00b507
parent 2316 234d679076c4
child 3011 af1b3cef52e1
permissions -rw-r--r--
mod_http_roster_admin: Add missing protocol docs
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
2315
73967121cf5e Add labels
JC Brand <jcbrand@minddistrict.com>
parents: 2314
diff changeset
     1
---
73967121cf5e Add labels
JC Brand <jcbrand@minddistrict.com>
parents: 2314
diff changeset
     2
labels:
73967121cf5e Add labels
JC Brand <jcbrand@minddistrict.com>
parents: 2314
diff changeset
     3
- 'Stage-Beta'
73967121cf5e Add labels
JC Brand <jcbrand@minddistrict.com>
parents: 2314
diff changeset
     4
summary: Delegate roster management to an external service
73967121cf5e Add labels
JC Brand <jcbrand@minddistrict.com>
parents: 2314
diff changeset
     5
...
2165
95a9f2d234da Add mod_http_roster_admin
JC Brand <jc@opkode.com>
parents:
diff changeset
     6
2316
234d679076c4 Proper markdown syntax
JC Brand <jcbrand@minddistrict.com>
parents: 2315
diff changeset
     7
*NOTE: THIS MODULE IS RELEASED UNDER THE MOZILLA PUBLIC LICENSE VERSION 2.*
2165
95a9f2d234da Add mod_http_roster_admin
JC Brand <jc@opkode.com>
parents:
diff changeset
     8
95a9f2d234da Add mod_http_roster_admin
JC Brand <jc@opkode.com>
parents:
diff changeset
     9
Normally the XMPP server will store and maintain the users' contact
95a9f2d234da Add mod_http_roster_admin
JC Brand <jc@opkode.com>
parents:
diff changeset
    10
rosters. This module lets you delegate roster management to an external
95a9f2d234da Add mod_http_roster_admin
JC Brand <jc@opkode.com>
parents:
diff changeset
    11
service.
95a9f2d234da Add mod_http_roster_admin
JC Brand <jc@opkode.com>
parents:
diff changeset
    12
95a9f2d234da Add mod_http_roster_admin
JC Brand <jc@opkode.com>
parents:
diff changeset
    13
Prosody will make an HTTP request to fetch the roster from the external
95a9f2d234da Add mod_http_roster_admin
JC Brand <jc@opkode.com>
parents:
diff changeset
    14
service. The service will need to notify Prosody whenever a user's roster
95a9f2d234da Add mod_http_roster_admin
JC Brand <jc@opkode.com>
parents:
diff changeset
    15
changes, so that Prosody can fetch a new roster for that user.
95a9f2d234da Add mod_http_roster_admin
JC Brand <jc@opkode.com>
parents:
diff changeset
    16
2316
234d679076c4 Proper markdown syntax
JC Brand <jcbrand@minddistrict.com>
parents: 2315
diff changeset
    17
## Configuring this module
2165
95a9f2d234da Add mod_http_roster_admin
JC Brand <jc@opkode.com>
parents:
diff changeset
    18
95a9f2d234da Add mod_http_roster_admin
JC Brand <jc@opkode.com>
parents:
diff changeset
    19
This module relies on `mod_storage_memory` and `mod_block_subscriptions`.
95a9f2d234da Add mod_http_roster_admin
JC Brand <jc@opkode.com>
parents:
diff changeset
    20
95a9f2d234da Add mod_http_roster_admin
JC Brand <jc@opkode.com>
parents:
diff changeset
    21
In `.parts/prosody/etc/prosody/prosody.cfg.lua`, where your particular
95a9f2d234da Add mod_http_roster_admin
JC Brand <jc@opkode.com>
parents:
diff changeset
    22
`VirtualHost` is being configured, add the following:
95a9f2d234da Add mod_http_roster_admin
JC Brand <jc@opkode.com>
parents:
diff changeset
    23
95a9f2d234da Add mod_http_roster_admin
JC Brand <jc@opkode.com>
parents:
diff changeset
    24
    modules_enabled = {
95a9f2d234da Add mod_http_roster_admin
JC Brand <jc@opkode.com>
parents:
diff changeset
    25
        "http_roster_admin",
95a9f2d234da Add mod_http_roster_admin
JC Brand <jc@opkode.com>
parents:
diff changeset
    26
        "block_subscriptions",
95a9f2d234da Add mod_http_roster_admin
JC Brand <jc@opkode.com>
parents:
diff changeset
    27
        "storage_memory",
95a9f2d234da Add mod_http_roster_admin
JC Brand <jc@opkode.com>
parents:
diff changeset
    28
        "http_files"
95a9f2d234da Add mod_http_roster_admin
JC Brand <jc@opkode.com>
parents:
diff changeset
    29
    }
95a9f2d234da Add mod_http_roster_admin
JC Brand <jc@opkode.com>
parents:
diff changeset
    30
    modules_disabled = {
95a9f2d234da Add mod_http_roster_admin
JC Brand <jc@opkode.com>
parents:
diff changeset
    31
         -- Prosody will get the roster from the backend app,
95a9f2d234da Add mod_http_roster_admin
JC Brand <jc@opkode.com>
parents:
diff changeset
    32
         -- so we disable the default roster module.
95a9f2d234da Add mod_http_roster_admin
JC Brand <jc@opkode.com>
parents:
diff changeset
    33
        "roster"
95a9f2d234da Add mod_http_roster_admin
JC Brand <jc@opkode.com>
parents:
diff changeset
    34
    }
95a9f2d234da Add mod_http_roster_admin
JC Brand <jc@opkode.com>
parents:
diff changeset
    35
    storage = { roster = "memory" }
95a9f2d234da Add mod_http_roster_admin
JC Brand <jc@opkode.com>
parents:
diff changeset
    36
    http_roster_url = "http://localhost/contacts/%s" -- %s will be replaced by an URL-encoded username
95a9f2d234da Add mod_http_roster_admin
JC Brand <jc@opkode.com>
parents:
diff changeset
    37
95a9f2d234da Add mod_http_roster_admin
JC Brand <jc@opkode.com>
parents:
diff changeset
    38
The `http_roster_url` parameter needs to be configured to point to the
95a9f2d234da Add mod_http_roster_admin
JC Brand <jc@opkode.com>
parents:
diff changeset
    39
URL in the backend application which returns users' contacts rosters.
95a9f2d234da Add mod_http_roster_admin
JC Brand <jc@opkode.com>
parents:
diff changeset
    40
95a9f2d234da Add mod_http_roster_admin
JC Brand <jc@opkode.com>
parents:
diff changeset
    41
In this URL, the pattern `%s` is replaced by an URL-encoded username.
95a9f2d234da Add mod_http_roster_admin
JC Brand <jc@opkode.com>
parents:
diff changeset
    42
95a9f2d234da Add mod_http_roster_admin
JC Brand <jc@opkode.com>
parents:
diff changeset
    43
When the user *john* then connects to Prosody, and `http_roster_url` is
95a9f2d234da Add mod_http_roster_admin
JC Brand <jc@opkode.com>
parents:
diff changeset
    44
set to “http://app.example.org/contacts/%s”, then Prosody will make a
95a9f2d234da Add mod_http_roster_admin
JC Brand <jc@opkode.com>
parents:
diff changeset
    45
GET request to http://app.example.org/contacts/john
95a9f2d234da Add mod_http_roster_admin
JC Brand <jc@opkode.com>
parents:
diff changeset
    46
3010
e6f91e00b507 mod_http_roster_admin: Add missing protocol docs
Matthew Wild <mwild1@gmail.com>
parents: 2316
diff changeset
    47
## Protocol
e6f91e00b507 mod_http_roster_admin: Add missing protocol docs
Matthew Wild <mwild1@gmail.com>
parents: 2316
diff changeset
    48
e6f91e00b507 mod_http_roster_admin: Add missing protocol docs
Matthew Wild <mwild1@gmail.com>
parents: 2316
diff changeset
    49
### Fetching rosters (Prosody to web app)
e6f91e00b507 mod_http_roster_admin: Add missing protocol docs
Matthew Wild <mwild1@gmail.com>
parents: 2316
diff changeset
    50
e6f91e00b507 mod_http_roster_admin: Add missing protocol docs
Matthew Wild <mwild1@gmail.com>
parents: 2316
diff changeset
    51
Prosody considers the web application to always hold the most accurate and up-to-date
e6f91e00b507 mod_http_roster_admin: Add missing protocol docs
Matthew Wild <mwild1@gmail.com>
parents: 2316
diff changeset
    52
version of the user's roster. When a user first connects, Prosody fetches the roster
e6f91e00b507 mod_http_roster_admin: Add missing protocol docs
Matthew Wild <mwild1@gmail.com>
parents: 2316
diff changeset
    53
from the web application and caches it internally.
e6f91e00b507 mod_http_roster_admin: Add missing protocol docs
Matthew Wild <mwild1@gmail.com>
parents: 2316
diff changeset
    54
e6f91e00b507 mod_http_roster_admin: Add missing protocol docs
Matthew Wild <mwild1@gmail.com>
parents: 2316
diff changeset
    55
Prosody will make a GET request to the URL specified in Prosody's configuration parameter
e6f91e00b507 mod_http_roster_admin: Add missing protocol docs
Matthew Wild <mwild1@gmail.com>
parents: 2316
diff changeset
    56
'http_roster_url'. In this URL, the pattern '%s' is replaced by an URL-encoded username.
e6f91e00b507 mod_http_roster_admin: Add missing protocol docs
Matthew Wild <mwild1@gmail.com>
parents: 2316
diff changeset
    57
e6f91e00b507 mod_http_roster_admin: Add missing protocol docs
Matthew Wild <mwild1@gmail.com>
parents: 2316
diff changeset
    58
For example, when the user 'john' connects to Prosody, and http_roster_url is set
e6f91e00b507 mod_http_roster_admin: Add missing protocol docs
Matthew Wild <mwild1@gmail.com>
parents: 2316
diff changeset
    59
to "http://app.example.com/contacts/%s", Prosody will make a GET request to "http://app.example.com/contacts/john".
e6f91e00b507 mod_http_roster_admin: Add missing protocol docs
Matthew Wild <mwild1@gmail.com>
parents: 2316
diff changeset
    60
e6f91e00b507 mod_http_roster_admin: Add missing protocol docs
Matthew Wild <mwild1@gmail.com>
parents: 2316
diff changeset
    61
The web app must return a JSON object, where each key is the JID of a contact, and the corresponding
e6f91e00b507 mod_http_roster_admin: Add missing protocol docs
Matthew Wild <mwild1@gmail.com>
parents: 2316
diff changeset
    62
value is data about that contact.
e6f91e00b507 mod_http_roster_admin: Add missing protocol docs
Matthew Wild <mwild1@gmail.com>
parents: 2316
diff changeset
    63
e6f91e00b507 mod_http_roster_admin: Add missing protocol docs
Matthew Wild <mwild1@gmail.com>
parents: 2316
diff changeset
    64
If the user 'john' has friends 'marie' and 'michael', the web app would return a HTTP '200 OK' response
e6f91e00b507 mod_http_roster_admin: Add missing protocol docs
Matthew Wild <mwild1@gmail.com>
parents: 2316
diff changeset
    65
with the following contents:
e6f91e00b507 mod_http_roster_admin: Add missing protocol docs
Matthew Wild <mwild1@gmail.com>
parents: 2316
diff changeset
    66
e6f91e00b507 mod_http_roster_admin: Add missing protocol docs
Matthew Wild <mwild1@gmail.com>
parents: 2316
diff changeset
    67
    {
e6f91e00b507 mod_http_roster_admin: Add missing protocol docs
Matthew Wild <mwild1@gmail.com>
parents: 2316
diff changeset
    68
        "marie@example.com": {
e6f91e00b507 mod_http_roster_admin: Add missing protocol docs
Matthew Wild <mwild1@gmail.com>
parents: 2316
diff changeset
    69
            "name": "Marie"
e6f91e00b507 mod_http_roster_admin: Add missing protocol docs
Matthew Wild <mwild1@gmail.com>
parents: 2316
diff changeset
    70
        },
e6f91e00b507 mod_http_roster_admin: Add missing protocol docs
Matthew Wild <mwild1@gmail.com>
parents: 2316
diff changeset
    71
    
e6f91e00b507 mod_http_roster_admin: Add missing protocol docs
Matthew Wild <mwild1@gmail.com>
parents: 2316
diff changeset
    72
        "michael@example.com": {
e6f91e00b507 mod_http_roster_admin: Add missing protocol docs
Matthew Wild <mwild1@gmail.com>
parents: 2316
diff changeset
    73
            "name": "Michael"
e6f91e00b507 mod_http_roster_admin: Add missing protocol docs
Matthew Wild <mwild1@gmail.com>
parents: 2316
diff changeset
    74
        }
e6f91e00b507 mod_http_roster_admin: Add missing protocol docs
Matthew Wild <mwild1@gmail.com>
parents: 2316
diff changeset
    75
    }
e6f91e00b507 mod_http_roster_admin: Add missing protocol docs
Matthew Wild <mwild1@gmail.com>
parents: 2316
diff changeset
    76
e6f91e00b507 mod_http_roster_admin: Add missing protocol docs
Matthew Wild <mwild1@gmail.com>
parents: 2316
diff changeset
    77
### Notifying Prosody of roster changes
2165
95a9f2d234da Add mod_http_roster_admin
JC Brand <jc@opkode.com>
parents:
diff changeset
    78
95a9f2d234da Add mod_http_roster_admin
JC Brand <jc@opkode.com>
parents:
diff changeset
    79
The external service needs to notify Prosody whenever a user's roster
95a9f2d234da Add mod_http_roster_admin
JC Brand <jc@opkode.com>
parents:
diff changeset
    80
changes. To do this, it must make an HTTP POST request to either:
95a9f2d234da Add mod_http_roster_admin
JC Brand <jc@opkode.com>
parents:
diff changeset
    81
2316
234d679076c4 Proper markdown syntax
JC Brand <jcbrand@minddistrict.com>
parents: 2315
diff changeset
    82
- http://localhost:5280/roster_admin/refresh
234d679076c4 Proper markdown syntax
JC Brand <jcbrand@minddistrict.com>
parents: 2315
diff changeset
    83
- https://localhost:5281/roster_admin/refresh
2165
95a9f2d234da Add mod_http_roster_admin
JC Brand <jc@opkode.com>
parents:
diff changeset
    84
95a9f2d234da Add mod_http_roster_admin
JC Brand <jc@opkode.com>
parents:
diff changeset
    85
Make sure that the "http_files" module is enabled in Prosody's configuration,
95a9f2d234da Add mod_http_roster_admin
JC Brand <jc@opkode.com>
parents:
diff changeset
    86
for the above URLs to served.
95a9f2d234da Add mod_http_roster_admin
JC Brand <jc@opkode.com>
parents:
diff changeset
    87
95a9f2d234da Add mod_http_roster_admin
JC Brand <jc@opkode.com>
parents:
diff changeset
    88
Ports 5280/5281 can be firewalled and the web server (i.e. Apache or Nginx)
95a9f2d234da Add mod_http_roster_admin
JC Brand <jc@opkode.com>
parents:
diff changeset
    89
can be configured to reverse proxy those URLs to for example
95a9f2d234da Add mod_http_roster_admin
JC Brand <jc@opkode.com>
parents:
diff changeset
    90
https://example.org/http-bind.
95a9f2d234da Add mod_http_roster_admin
JC Brand <jc@opkode.com>
parents:
diff changeset
    91
95a9f2d234da Add mod_http_roster_admin
JC Brand <jc@opkode.com>
parents:
diff changeset
    92
The contents of the POST should be a JSON encoded array of usernames whose
95a9f2d234da Add mod_http_roster_admin
JC Brand <jc@opkode.com>
parents:
diff changeset
    93
rosters have changed.
95a9f2d234da Add mod_http_roster_admin
JC Brand <jc@opkode.com>
parents:
diff changeset
    94
95a9f2d234da Add mod_http_roster_admin
JC Brand <jc@opkode.com>
parents:
diff changeset
    95
For example, if user ‘john’ became friends with ‘aaron’, both john’s
95a9f2d234da Add mod_http_roster_admin
JC Brand <jc@opkode.com>
parents:
diff changeset
    96
contact list and aaron’s contact lists have changed:
95a9f2d234da Add mod_http_roster_admin
JC Brand <jc@opkode.com>
parents:
diff changeset
    97
95a9f2d234da Add mod_http_roster_admin
JC Brand <jc@opkode.com>
parents:
diff changeset
    98
    ["john", "aaron"]
95a9f2d234da Add mod_http_roster_admin
JC Brand <jc@opkode.com>
parents:
diff changeset
    99
95a9f2d234da Add mod_http_roster_admin
JC Brand <jc@opkode.com>
parents:
diff changeset
   100
When the operation is complete Prosody will reply with a summary of the
95a9f2d234da Add mod_http_roster_admin
JC Brand <jc@opkode.com>
parents:
diff changeset
   101
operation - a JSON object containing:
95a9f2d234da Add mod_http_roster_admin
JC Brand <jc@opkode.com>
parents:
diff changeset
   102
2316
234d679076c4 Proper markdown syntax
JC Brand <jcbrand@minddistrict.com>
parents: 2315
diff changeset
   103
- **status**: either “ok” (success) or “error” (operation completely failed)
234d679076c4 Proper markdown syntax
JC Brand <jcbrand@minddistrict.com>
parents: 2315
diff changeset
   104
- **message**: A human-readable message (for logging and debugging purposes)
234d679076c4 Proper markdown syntax
JC Brand <jcbrand@minddistrict.com>
parents: 2315
diff changeset
   105
- **updated**: The number of rosters successfully updated
234d679076c4 Proper markdown syntax
JC Brand <jcbrand@minddistrict.com>
parents: 2315
diff changeset
   106
- **errors**: The number of rosters that failed to update
2165
95a9f2d234da Add mod_http_roster_admin
JC Brand <jc@opkode.com>
parents:
diff changeset
   107
95a9f2d234da Add mod_http_roster_admin
JC Brand <jc@opkode.com>
parents:
diff changeset
   108
Example:
95a9f2d234da Add mod_http_roster_admin
JC Brand <jc@opkode.com>
parents:
diff changeset
   109
95a9f2d234da Add mod_http_roster_admin
JC Brand <jc@opkode.com>
parents:
diff changeset
   110
    {
95a9f2d234da Add mod_http_roster_admin
JC Brand <jc@opkode.com>
parents:
diff changeset
   111
        "status":  "ok",
95a9f2d234da Add mod_http_roster_admin
JC Brand <jc@opkode.com>
parents:
diff changeset
   112
        "message": "roster update complete",
95a9f2d234da Add mod_http_roster_admin
JC Brand <jc@opkode.com>
parents:
diff changeset
   113
        "updated": 2,
95a9f2d234da Add mod_http_roster_admin
JC Brand <jc@opkode.com>
parents:
diff changeset
   114
        "errors":  0
95a9f2d234da Add mod_http_roster_admin
JC Brand <jc@opkode.com>
parents:
diff changeset
   115
    }
95a9f2d234da Add mod_http_roster_admin
JC Brand <jc@opkode.com>
parents:
diff changeset
   116
95a9f2d234da Add mod_http_roster_admin
JC Brand <jc@opkode.com>
parents:
diff changeset
   117
Prosody may also return status codes `400` or `500` in case of errors (such
95a9f2d234da Add mod_http_roster_admin
JC Brand <jc@opkode.com>
parents:
diff changeset
   118
as a missing/malformed body).