Mercurial > prosody-modules
annotate mod_pubsub_post/README.md @ 6299:5cf5ee23b361
mod_voipms: New Module to send and receive SMS/MMS via VoIP.ms APIs.
diff --git a/mod_voipms/README.md b/mod_voipms/README.md
new file mode 100644
--- /dev/null
+++ b/mod_voipms/README.md
@@ -0,0 +1,51 @@
+---
+labels:
+- 'Stage-Alpha'
+- 'Type-Web'
+summary: Send and receive SMS/MMS via VoIP.ms APIs.
+rockspec:
+ build:
+ modules:
+ mod_voipms: mod_voipms.lua
+...
+
+Introduction
+============
+
+This is a Prosody module to map JIDs to DIDs on VoIP.ms and support sending/receiving SMS/MMS.
+
+Configuration
+=============
+
+| option | type | default |
+|-----------------------|--------|---------|
+| voipms\_api\_username | string | nil |
+| voipms\_api\_password | string | nil |
+| voipms\_query\_key | string | nil |
+| voipms\_jid\_map | table | nil |
+```
+VirtualHost "sms.example.com"
+modules_enabled = {
+ "voipms";
+}
+voipms_api_username = john@example.com -- E-mail registered with VoIP.ms
+voipms_api_password = abcd1234 -- API password configured in VoIP.ms
+voipms_query_key = some_query_key -- query param 'key' part of your URL callback
+voipms_jid_map = {
+ ["your_jid@your_domain.com"] = "+1234567890"
+}
+```
+
+HTTP
+====
+
+The module is served on Prosody's default HTTP ports at the path /voipms. More details on configuring HTTP modules in Prosody can be found in the HTTP documentation.
+
+VoIP.ms Webhook URL
+===================
+
+This module receives the VoIP.ms Webhook URL (POST) at the /voipms endpoint. It uses the sendSMS/sendMMS GET methods against the VoIP.ms APIs. This is an example webhook to use in VoIP.ms:
+
+```
+https://sms.example.com/voipms?key=some_query_key
+```
diff --git a/mod_voipms/mod_voipms.lua b/mod_voipms/mod_voipms.lua
new file mode 100644
--- /dev/null
+++ b/mod_voipms/mod_voipms.lua
@@ -0,0 +1,166 @@
+local http = require "net.http"
+local json = require "util.json"
+local st = require "util.stanza"
+
+local api_username = module:get_option_string("voipms_api_username")
+local api_password = module:get_option_string("voipms_api_password")
+local query_key = module:get_option("voipms_query_key")
+local jid_map = module:get_option("voipms_jid_map") or {}
+local rest_endpoint = "https://voip.ms/api/v1/rest.php"
+
+if not api_username or not api_password or not query_key then
+ module:log("error", "Missing required config values (voipms_api_username, voipms_api_password, voipms_query_key)")
+ return
+end
+
+module:depends("http")
+
+local function normalize_number(num)
+ if not num then return nil end
+ if num:sub(1, 1) ~= "+" then
+ return "+1" .. num
+ end
+ return num
+end
+
+local function extract_query_key(event)
+ return (event.request.url.query or ""):match("key=([^&]+)")
+end
+
+module:provides("http", {
+ route = {
+ ["POST"] = function(event)
+ local req = event.request
+ local body = req.body or ""
+
+ if extract_query_key(event) ~= query_key then
+ module:log("warn", "Unauthorized webhook: missing or invalid key")
+ return { status_code = 403 }
+ end
+
+ local json_payload, err = json.decode(body)
+ if not json_payload then
+ module:log("warn", "Invalid JSON: %s", err or "unknown error")
+ return { status_code = 400 }
+ end
+
+ local payload = json_payload.data and json_payload.data.payload
+ if not payload then
+ module:log("warn", "Missing payload in JSON")
+ return { status_code = 400 }
+ end
+
+ local from = payload.from and payload.from.phone_number
+ local to_list = payload.to or {}
+ local to = #to_list > 0 and to_list[1].phone_number or nil
+
+ if not from or not to then
+ module:log("warn", "Missing phone numbers (from: %s, to: %s)", tostring(from), tostring(to))
+ return { status_code = 400 }
+ end
+
+ local normalized_to = normalize_number(to)
+ local target_jid = nil
+
+ for jid, did in pairs(jid_map) do
+ if normalize_number(did) == normalized_to then
+ target_jid = jid
+ break
+ end
+ end
+
+ if not target_jid then
+ module:log("warn", "No JID mapping for DID %s", normalized_to)
+ return { status_code = 404 }
+ end
+
+ local normalized_from = normalize_number(from)
+ local message_text = payload.text or ""
+
+ local message = st.message({
+ from = normalized_from .. "@" .. module.host,
+ to = target_jid,
+ type = "chat"
+ }):tag("body"):text(message_text):up()
+
+ if payload.media and #payload.media > 0 then
+ for _, media_item in ipairs(payload.media) do
+ if media_item.url then
+ message_text = message_text .. "\n" .. media_item.url
+ message:tag("x", { xmlns = "jabber:x:oob" })
+ :tag("url"):text(media_item.url):up():up()
+ end
+ end
+ end
+
+ module:send(message)
+ module:log("info", "Delivered SMS from %s to %s", normalized_from, target_jid)
+
+ return { status_code = 204 }
+ end
+ }
+})
+
+module:hook("message/bare", function(event)
+ local stanza = event.stanza
+ if stanza.attr.type ~= "chat" then return end
+
+ local from_jid = stanza.attr.from
+ local to_jid = stanza.attr.to
+ local body = stanza:get_child_text("body")
+ if not body or body == "" then return end
+
+ local from_number = jid_map[from_jid]
+ if not from_number then
+ module:log("warn", "No DID mapping for JID %s", from_jid)
+ return
+ end
+
+ local to_number = to_jid:match("^([^@]+)")
+ if not to_number then
+ module:log("warn", "Malformed JID in message.to: %s", to_jid)
+ return
+ end
+
+ to_number = normalize_number(to_number)
+
+ local media_urls = {}
+ for line in body:gmatch("[^\r\n]+") do
+ if line:match("^https?://") then
+ table.insert(media_urls, line)
+ end
+ end
+
+ local method = (#media_urls > 0) and "sendMMS" or "sendSMS"
+ local query = {
+ api_username = api_username,
+ api_password = api_password,
+ method = method,
+ did = from_number,
+ dst = to_number,
+ message = body
+ }
+
+ if method == "sendMMS" then
+ for i, url in ipairs(media_urls) do
+ query["media_url[" .. (i - 1) .. "]"] = url
+ end
+ end
+
+ local query_str = http.formencode(query)
+
+ http.request(rest_endpoint .. "?" .. query_str, {
+ method = "GET";
+ }, function(response_body, code)
+ if code == 200 then
+ local resp, err = json.decode(response_body)
+ if not resp or resp.status ~= "success" then
+ module:log("error", "Failed to send %s: %s", method, err or (resp and resp.status) or "unknown")
+ else
+ module:log("info", "Sent %s from %s to %s", method, from_number, to_number)
+ end
+ else
+ module:log("error", "HTTP error sending %s: code %s", method, tostring(code))
+ end
+ end)
+end)
| author | Chaz <menel@snikket.de> |
|---|---|
| date | Mon, 21 Jul 2025 23:57:37 +0200 |
| parents | fe081789f7b5 |
| children |
| rev | line source |
|---|---|
|
3505
106b4ae4469b
mod_pubsub_post/README: Mention use as a webhook receiver
Kim Alvefur <zash@zash.se>
parents:
3503
diff
changeset
|
1 --- |
|
3506
7b1eede1a840
mod_pubsub_post/README: Set stage label to stable
Kim Alvefur <zash@zash.se>
parents:
3505
diff
changeset
|
2 labels: |
|
7b1eede1a840
mod_pubsub_post/README: Set stage label to stable
Kim Alvefur <zash@zash.se>
parents:
3505
diff
changeset
|
3 - 'Stage-Stable' |
|
3505
106b4ae4469b
mod_pubsub_post/README: Mention use as a webhook receiver
Kim Alvefur <zash@zash.se>
parents:
3503
diff
changeset
|
4 summary: Publish to PubSub nodes from via HTTP POST/WebHooks |
|
106b4ae4469b
mod_pubsub_post/README: Mention use as a webhook receiver
Kim Alvefur <zash@zash.se>
parents:
3503
diff
changeset
|
5 --- |
|
106b4ae4469b
mod_pubsub_post/README: Mention use as a webhook receiver
Kim Alvefur <zash@zash.se>
parents:
3503
diff
changeset
|
6 |
| 3100 | 7 # Introduction |
| 8 | |
|
3505
106b4ae4469b
mod_pubsub_post/README: Mention use as a webhook receiver
Kim Alvefur <zash@zash.se>
parents:
3503
diff
changeset
|
9 This module is a fairly generic WebHook receiver that lets you easily |
|
106b4ae4469b
mod_pubsub_post/README: Mention use as a webhook receiver
Kim Alvefur <zash@zash.se>
parents:
3503
diff
changeset
|
10 publish data to PubSub using a HTTP POST request. The payload can be |
|
106b4ae4469b
mod_pubsub_post/README: Mention use as a webhook receiver
Kim Alvefur <zash@zash.se>
parents:
3503
diff
changeset
|
11 Atom feeds, arbitrary XML, or arbitrary JSON. The type should be |
|
106b4ae4469b
mod_pubsub_post/README: Mention use as a webhook receiver
Kim Alvefur <zash@zash.se>
parents:
3503
diff
changeset
|
12 indicated via the `Content-Type` header. |
| 3100 | 13 |
|
3719
a6db99c1420a
mod_pubsub_post/README: Add an example of curl-ing Atom data
Kim Alvefur <zash@zash.se>
parents:
3506
diff
changeset
|
14 - JSON data is wrapped in a [XEP-0335] container. |
|
a6db99c1420a
mod_pubsub_post/README: Add an example of curl-ing Atom data
Kim Alvefur <zash@zash.se>
parents:
3506
diff
changeset
|
15 - An Atom feed may have many `<entry>` and each one is published as |
|
a6db99c1420a
mod_pubsub_post/README: Add an example of curl-ing Atom data
Kim Alvefur <zash@zash.se>
parents:
3506
diff
changeset
|
16 its own PubSub item. |
|
4636
6bcccc63b542
mod_pubsub_post: fix incorrect claim
Jonas Schäfer <jonas@wielicki.name>
parents:
4552
diff
changeset
|
17 - Other XML is simply published to the item with ID `current`. |
|
3719
a6db99c1420a
mod_pubsub_post/README: Add an example of curl-ing Atom data
Kim Alvefur <zash@zash.se>
parents:
3506
diff
changeset
|
18 |
|
a6db99c1420a
mod_pubsub_post/README: Add an example of curl-ing Atom data
Kim Alvefur <zash@zash.se>
parents:
3506
diff
changeset
|
19 ## JSON example |
|
a6db99c1420a
mod_pubsub_post/README: Add an example of curl-ing Atom data
Kim Alvefur <zash@zash.se>
parents:
3506
diff
changeset
|
20 |
| 3100 | 21 ``` {.bash} |
| 22 curl http://localhost:5280/pubsub_post/princely_musings \ | |
| 23 -H "Content-Type: application/json" \ | |
| 24 --data-binary '{"musing":"To be, or not to be: that is the question"}' | |
| 25 ``` | |
| 26 | |
|
3719
a6db99c1420a
mod_pubsub_post/README: Add an example of curl-ing Atom data
Kim Alvefur <zash@zash.se>
parents:
3506
diff
changeset
|
27 ## Atom example |
|
a6db99c1420a
mod_pubsub_post/README: Add an example of curl-ing Atom data
Kim Alvefur <zash@zash.se>
parents:
3506
diff
changeset
|
28 |
|
a6db99c1420a
mod_pubsub_post/README: Add an example of curl-ing Atom data
Kim Alvefur <zash@zash.se>
parents:
3506
diff
changeset
|
29 ``` {.bash} |
|
a6db99c1420a
mod_pubsub_post/README: Add an example of curl-ing Atom data
Kim Alvefur <zash@zash.se>
parents:
3506
diff
changeset
|
30 curl http://localhost:5280/pubsub_post/princely_musings \ |
|
a6db99c1420a
mod_pubsub_post/README: Add an example of curl-ing Atom data
Kim Alvefur <zash@zash.se>
parents:
3506
diff
changeset
|
31 -H "Content-Type: application/xml" \ |
|
a6db99c1420a
mod_pubsub_post/README: Add an example of curl-ing Atom data
Kim Alvefur <zash@zash.se>
parents:
3506
diff
changeset
|
32 --data-binary '<feed xmlns="http://www.w3.org/2005/Atom"> |
|
a6db99c1420a
mod_pubsub_post/README: Add an example of curl-ing Atom data
Kim Alvefur <zash@zash.se>
parents:
3506
diff
changeset
|
33 <entry><title>Hello</title></entry></feed>' |
|
4552
c87181a98f29
mod_pubsub_post: Add support for urlencoded form-data
Kim Alvefur <zash@zash.se>
parents:
3719
diff
changeset
|
34 ``` |
|
3719
a6db99c1420a
mod_pubsub_post/README: Add an example of curl-ing Atom data
Kim Alvefur <zash@zash.se>
parents:
3506
diff
changeset
|
35 |
|
4552
c87181a98f29
mod_pubsub_post: Add support for urlencoded form-data
Kim Alvefur <zash@zash.se>
parents:
3719
diff
changeset
|
36 ## Simple form-data |
|
c87181a98f29
mod_pubsub_post: Add support for urlencoded form-data
Kim Alvefur <zash@zash.se>
parents:
3719
diff
changeset
|
37 |
|
c87181a98f29
mod_pubsub_post: Add support for urlencoded form-data
Kim Alvefur <zash@zash.se>
parents:
3719
diff
changeset
|
38 ``` {.bash} |
|
c87181a98f29
mod_pubsub_post: Add support for urlencoded form-data
Kim Alvefur <zash@zash.se>
parents:
3719
diff
changeset
|
39 curl http://localhost:5280/pubsub_post/princely_musings \ |
|
c87181a98f29
mod_pubsub_post: Add support for urlencoded form-data
Kim Alvefur <zash@zash.se>
parents:
3719
diff
changeset
|
40 --data musing="To be, or not to be: that is the question" |
|
3719
a6db99c1420a
mod_pubsub_post/README: Add an example of curl-ing Atom data
Kim Alvefur <zash@zash.se>
parents:
3506
diff
changeset
|
41 ``` |
|
3153
e0de1fdbc80a
mod_pubsub_post/README: Describe what happens to different data types
Kim Alvefur <zash@zash.se>
parents:
3152
diff
changeset
|
42 |
| 3100 | 43 # Configuration |
| 44 | |
|
3503
882180b459a0
mod_pubsub_post: Restructure authentication and authorization (BC)
Kim Alvefur <zash@zash.se>
parents:
3502
diff
changeset
|
45 All settings are optional. |
| 3100 | 46 |
|
3503
882180b459a0
mod_pubsub_post: Restructure authentication and authorization (BC)
Kim Alvefur <zash@zash.se>
parents:
3502
diff
changeset
|
47 ## Actor identification |
| 3100 | 48 |
|
3503
882180b459a0
mod_pubsub_post: Restructure authentication and authorization (BC)
Kim Alvefur <zash@zash.se>
parents:
3502
diff
changeset
|
49 First we have to figure out who is making the request. |
|
882180b459a0
mod_pubsub_post: Restructure authentication and authorization (BC)
Kim Alvefur <zash@zash.se>
parents:
3502
diff
changeset
|
50 This is configured on a per-node basis like this: |
|
3501
1df139b157fb
mod_pubsub_post: Add support for WebSub authentication
Kim Alvefur <zash@zash.se>
parents:
3256
diff
changeset
|
51 |
|
1df139b157fb
mod_pubsub_post: Add support for WebSub authentication
Kim Alvefur <zash@zash.se>
parents:
3256
diff
changeset
|
52 ``` {.lua} |
|
1df139b157fb
mod_pubsub_post: Add support for WebSub authentication
Kim Alvefur <zash@zash.se>
parents:
3256
diff
changeset
|
53 -- Per node secrets |
|
3503
882180b459a0
mod_pubsub_post: Restructure authentication and authorization (BC)
Kim Alvefur <zash@zash.se>
parents:
3502
diff
changeset
|
54 pubsub_post_actors = { |
|
882180b459a0
mod_pubsub_post: Restructure authentication and authorization (BC)
Kim Alvefur <zash@zash.se>
parents:
3502
diff
changeset
|
55 princely_musings = "hamlet@denmark.lit" |
|
3501
1df139b157fb
mod_pubsub_post: Add support for WebSub authentication
Kim Alvefur <zash@zash.se>
parents:
3256
diff
changeset
|
56 } |
|
3503
882180b459a0
mod_pubsub_post: Restructure authentication and authorization (BC)
Kim Alvefur <zash@zash.se>
parents:
3502
diff
changeset
|
57 pubsub_post_default_actor = "nobody@nowhere.invalid" |
|
3501
1df139b157fb
mod_pubsub_post: Add support for WebSub authentication
Kim Alvefur <zash@zash.se>
parents:
3256
diff
changeset
|
58 ``` |
|
1df139b157fb
mod_pubsub_post: Add support for WebSub authentication
Kim Alvefur <zash@zash.se>
parents:
3256
diff
changeset
|
59 |
|
3503
882180b459a0
mod_pubsub_post: Restructure authentication and authorization (BC)
Kim Alvefur <zash@zash.se>
parents:
3502
diff
changeset
|
60 `pubsub_post_default_actor` is used when trying to publish to a node |
|
882180b459a0
mod_pubsub_post: Restructure authentication and authorization (BC)
Kim Alvefur <zash@zash.se>
parents:
3502
diff
changeset
|
61 that is not listed in `pubsub_post_actors`. Otherwise the IP address |
|
882180b459a0
mod_pubsub_post: Restructure authentication and authorization (BC)
Kim Alvefur <zash@zash.se>
parents:
3502
diff
changeset
|
62 of the connection is used. |
|
882180b459a0
mod_pubsub_post: Restructure authentication and authorization (BC)
Kim Alvefur <zash@zash.se>
parents:
3502
diff
changeset
|
63 |
|
882180b459a0
mod_pubsub_post: Restructure authentication and authorization (BC)
Kim Alvefur <zash@zash.se>
parents:
3502
diff
changeset
|
64 ## Authentication |
|
882180b459a0
mod_pubsub_post: Restructure authentication and authorization (BC)
Kim Alvefur <zash@zash.se>
parents:
3502
diff
changeset
|
65 |
|
3501
1df139b157fb
mod_pubsub_post: Add support for WebSub authentication
Kim Alvefur <zash@zash.se>
parents:
3256
diff
changeset
|
66 [WebSub](https://www.w3.org/TR/2018/REC-websub-20180123/) [Authenticated |
|
1df139b157fb
mod_pubsub_post: Add support for WebSub authentication
Kim Alvefur <zash@zash.se>
parents:
3256
diff
changeset
|
67 Content |
|
1df139b157fb
mod_pubsub_post: Add support for WebSub authentication
Kim Alvefur <zash@zash.se>
parents:
3256
diff
changeset
|
68 Distribution](https://www.w3.org/TR/2018/REC-websub-20180123/#authenticated-content-distribution) |
|
3503
882180b459a0
mod_pubsub_post: Restructure authentication and authorization (BC)
Kim Alvefur <zash@zash.se>
parents:
3502
diff
changeset
|
69 authentication is used. |
|
882180b459a0
mod_pubsub_post: Restructure authentication and authorization (BC)
Kim Alvefur <zash@zash.se>
parents:
3502
diff
changeset
|
70 |
|
882180b459a0
mod_pubsub_post: Restructure authentication and authorization (BC)
Kim Alvefur <zash@zash.se>
parents:
3502
diff
changeset
|
71 ``` {.lua} |
|
882180b459a0
mod_pubsub_post: Restructure authentication and authorization (BC)
Kim Alvefur <zash@zash.se>
parents:
3502
diff
changeset
|
72 pubsub_post_secrets = { |
|
882180b459a0
mod_pubsub_post: Restructure authentication and authorization (BC)
Kim Alvefur <zash@zash.se>
parents:
3502
diff
changeset
|
73 princely_musings = "shared secret" |
|
882180b459a0
mod_pubsub_post: Restructure authentication and authorization (BC)
Kim Alvefur <zash@zash.se>
parents:
3502
diff
changeset
|
74 } |
|
882180b459a0
mod_pubsub_post: Restructure authentication and authorization (BC)
Kim Alvefur <zash@zash.se>
parents:
3502
diff
changeset
|
75 pubsub_post_default_secret = "default secret" |
|
882180b459a0
mod_pubsub_post: Restructure authentication and authorization (BC)
Kim Alvefur <zash@zash.se>
parents:
3502
diff
changeset
|
76 ``` |
|
3501
1df139b157fb
mod_pubsub_post: Add support for WebSub authentication
Kim Alvefur <zash@zash.se>
parents:
3256
diff
changeset
|
77 |
|
3503
882180b459a0
mod_pubsub_post: Restructure authentication and authorization (BC)
Kim Alvefur <zash@zash.se>
parents:
3502
diff
changeset
|
78 `pubsub_post_default_secret` is used when trying to publish to a node |
|
882180b459a0
mod_pubsub_post: Restructure authentication and authorization (BC)
Kim Alvefur <zash@zash.se>
parents:
3502
diff
changeset
|
79 that is not listed in `pubsub_post_secrets`. Otherwise the request |
|
882180b459a0
mod_pubsub_post: Restructure authentication and authorization (BC)
Kim Alvefur <zash@zash.se>
parents:
3502
diff
changeset
|
80 proceeds with the previously identified actor. |
|
882180b459a0
mod_pubsub_post: Restructure authentication and authorization (BC)
Kim Alvefur <zash@zash.se>
parents:
3502
diff
changeset
|
81 |
|
882180b459a0
mod_pubsub_post: Restructure authentication and authorization (BC)
Kim Alvefur <zash@zash.se>
parents:
3502
diff
changeset
|
82 ::: {.alert .alert-danger} |
|
882180b459a0
mod_pubsub_post: Restructure authentication and authorization (BC)
Kim Alvefur <zash@zash.se>
parents:
3502
diff
changeset
|
83 If configured without a secret and a default actor that has permission |
|
882180b459a0
mod_pubsub_post: Restructure authentication and authorization (BC)
Kim Alvefur <zash@zash.se>
parents:
3502
diff
changeset
|
84 to create nodes the service becomes wide open. |
|
882180b459a0
mod_pubsub_post: Restructure authentication and authorization (BC)
Kim Alvefur <zash@zash.se>
parents:
3502
diff
changeset
|
85 ::: |
|
882180b459a0
mod_pubsub_post: Restructure authentication and authorization (BC)
Kim Alvefur <zash@zash.se>
parents:
3502
diff
changeset
|
86 |
|
882180b459a0
mod_pubsub_post: Restructure authentication and authorization (BC)
Kim Alvefur <zash@zash.se>
parents:
3502
diff
changeset
|
87 ## Authorization |
|
882180b459a0
mod_pubsub_post: Restructure authentication and authorization (BC)
Kim Alvefur <zash@zash.se>
parents:
3502
diff
changeset
|
88 |
|
882180b459a0
mod_pubsub_post: Restructure authentication and authorization (BC)
Kim Alvefur <zash@zash.se>
parents:
3502
diff
changeset
|
89 Authorization is handled via pubsub affiliations. Publishing requires an |
|
882180b459a0
mod_pubsub_post: Restructure authentication and authorization (BC)
Kim Alvefur <zash@zash.se>
parents:
3502
diff
changeset
|
90 affiliation with the _publish_ capability, usually `"publisher"`. |
|
882180b459a0
mod_pubsub_post: Restructure authentication and authorization (BC)
Kim Alvefur <zash@zash.se>
parents:
3502
diff
changeset
|
91 |
|
882180b459a0
mod_pubsub_post: Restructure authentication and authorization (BC)
Kim Alvefur <zash@zash.se>
parents:
3502
diff
changeset
|
92 ### Setting up affiliations |
|
3256
0992c0398783
mod_pubsub_post/README: Add a heading for affiliation related text
Kim Alvefur <zash@zash.se>
parents:
3153
diff
changeset
|
93 |
|
3152
882f7d5c3ce8
mod_pubsub_post/README: Affiliation management in trunk now
Kim Alvefur <zash@zash.se>
parents:
3151
diff
changeset
|
94 Prosodys PubSub module supports [setting affiliations via |
|
4961
18774cc621d6
mod_pubsub_post/README: Update references to trunk with release numbers
Kim Alvefur <zash@zash.se>
parents:
4842
diff
changeset
|
95 XMPP](https://xmpp.org/extensions/xep-0060.html#owner-affiliations), |
|
18774cc621d6
mod_pubsub_post/README: Update references to trunk with release numbers
Kim Alvefur <zash@zash.se>
parents:
4842
diff
changeset
|
96 since 0.11.0, so affiliations can be configured with a capable client. |
| 3100 | 97 |
| 98 It can however be done from another plugin: | |
| 99 | |
| 100 ``` {.lua} | |
| 101 local mod_pubsub = module:depends("pubsub"); | |
| 102 local pubsub = mod_pubsub.service; | |
| 103 | |
| 104 pubsub:create("princely_musings", true); | |
| 105 pubsub:set_affiliation("princely_musings", true, "127.0.0.1", "publisher"); | |
| 106 ``` | |
|
4842
8d4b91a703af
mod_pubsub_post: Document JSON to XML mapping capability
Kim Alvefur <zash@zash.se>
parents:
4636
diff
changeset
|
107 |
|
8d4b91a703af
mod_pubsub_post: Document JSON to XML mapping capability
Kim Alvefur <zash@zash.se>
parents:
4636
diff
changeset
|
108 ## Data mappings |
|
8d4b91a703af
mod_pubsub_post: Document JSON to XML mapping capability
Kim Alvefur <zash@zash.se>
parents:
4636
diff
changeset
|
109 |
|
4961
18774cc621d6
mod_pubsub_post/README: Update references to trunk with release numbers
Kim Alvefur <zash@zash.se>
parents:
4842
diff
changeset
|
110 The datamapper library added in 0.12.0 allows posting JSON and having it |
|
4842
8d4b91a703af
mod_pubsub_post: Document JSON to XML mapping capability
Kim Alvefur <zash@zash.se>
parents:
4636
diff
changeset
|
111 converted to XML based on a special JSON Schema. |
|
8d4b91a703af
mod_pubsub_post: Document JSON to XML mapping capability
Kim Alvefur <zash@zash.se>
parents:
4636
diff
changeset
|
112 |
|
8d4b91a703af
mod_pubsub_post: Document JSON to XML mapping capability
Kim Alvefur <zash@zash.se>
parents:
4636
diff
changeset
|
113 ``` json |
|
8d4b91a703af
mod_pubsub_post: Document JSON to XML mapping capability
Kim Alvefur <zash@zash.se>
parents:
4636
diff
changeset
|
114 { |
|
8d4b91a703af
mod_pubsub_post: Document JSON to XML mapping capability
Kim Alvefur <zash@zash.se>
parents:
4636
diff
changeset
|
115 "properties" : { |
|
8d4b91a703af
mod_pubsub_post: Document JSON to XML mapping capability
Kim Alvefur <zash@zash.se>
parents:
4636
diff
changeset
|
116 "content" : { |
|
8d4b91a703af
mod_pubsub_post: Document JSON to XML mapping capability
Kim Alvefur <zash@zash.se>
parents:
4636
diff
changeset
|
117 "type" : "string" |
|
8d4b91a703af
mod_pubsub_post: Document JSON to XML mapping capability
Kim Alvefur <zash@zash.se>
parents:
4636
diff
changeset
|
118 }, |
|
8d4b91a703af
mod_pubsub_post: Document JSON to XML mapping capability
Kim Alvefur <zash@zash.se>
parents:
4636
diff
changeset
|
119 "title" : { |
|
8d4b91a703af
mod_pubsub_post: Document JSON to XML mapping capability
Kim Alvefur <zash@zash.se>
parents:
4636
diff
changeset
|
120 "type" : "string" |
|
8d4b91a703af
mod_pubsub_post: Document JSON to XML mapping capability
Kim Alvefur <zash@zash.se>
parents:
4636
diff
changeset
|
121 } |
|
8d4b91a703af
mod_pubsub_post: Document JSON to XML mapping capability
Kim Alvefur <zash@zash.se>
parents:
4636
diff
changeset
|
122 }, |
|
8d4b91a703af
mod_pubsub_post: Document JSON to XML mapping capability
Kim Alvefur <zash@zash.se>
parents:
4636
diff
changeset
|
123 "type" : "object", |
|
8d4b91a703af
mod_pubsub_post: Document JSON to XML mapping capability
Kim Alvefur <zash@zash.se>
parents:
4636
diff
changeset
|
124 "xml" : { |
|
8d4b91a703af
mod_pubsub_post: Document JSON to XML mapping capability
Kim Alvefur <zash@zash.se>
parents:
4636
diff
changeset
|
125 "name" : "musings", |
|
8d4b91a703af
mod_pubsub_post: Document JSON to XML mapping capability
Kim Alvefur <zash@zash.se>
parents:
4636
diff
changeset
|
126 "namespace" : "urn:example:princely" |
|
8d4b91a703af
mod_pubsub_post: Document JSON to XML mapping capability
Kim Alvefur <zash@zash.se>
parents:
4636
diff
changeset
|
127 } |
|
8d4b91a703af
mod_pubsub_post: Document JSON to XML mapping capability
Kim Alvefur <zash@zash.se>
parents:
4636
diff
changeset
|
128 } |
|
8d4b91a703af
mod_pubsub_post: Document JSON to XML mapping capability
Kim Alvefur <zash@zash.se>
parents:
4636
diff
changeset
|
129 ``` |
|
8d4b91a703af
mod_pubsub_post: Document JSON to XML mapping capability
Kim Alvefur <zash@zash.se>
parents:
4636
diff
changeset
|
130 |
|
8d4b91a703af
mod_pubsub_post: Document JSON to XML mapping capability
Kim Alvefur <zash@zash.se>
parents:
4636
diff
changeset
|
131 And in the Prosody config file: |
|
8d4b91a703af
mod_pubsub_post: Document JSON to XML mapping capability
Kim Alvefur <zash@zash.se>
parents:
4636
diff
changeset
|
132 |
|
8d4b91a703af
mod_pubsub_post: Document JSON to XML mapping capability
Kim Alvefur <zash@zash.se>
parents:
4636
diff
changeset
|
133 ``` lua |
|
8d4b91a703af
mod_pubsub_post: Document JSON to XML mapping capability
Kim Alvefur <zash@zash.se>
parents:
4636
diff
changeset
|
134 pubsub_post_mappings = { |
|
8d4b91a703af
mod_pubsub_post: Document JSON to XML mapping capability
Kim Alvefur <zash@zash.se>
parents:
4636
diff
changeset
|
135 princely_musings = "musings.json"; |
|
8d4b91a703af
mod_pubsub_post: Document JSON to XML mapping capability
Kim Alvefur <zash@zash.se>
parents:
4636
diff
changeset
|
136 } |
|
8d4b91a703af
mod_pubsub_post: Document JSON to XML mapping capability
Kim Alvefur <zash@zash.se>
parents:
4636
diff
changeset
|
137 ``` |
|
8d4b91a703af
mod_pubsub_post: Document JSON to XML mapping capability
Kim Alvefur <zash@zash.se>
parents:
4636
diff
changeset
|
138 |
|
8d4b91a703af
mod_pubsub_post: Document JSON to XML mapping capability
Kim Alvefur <zash@zash.se>
parents:
4636
diff
changeset
|
139 Then, POSTing a JSON payload like |
|
8d4b91a703af
mod_pubsub_post: Document JSON to XML mapping capability
Kim Alvefur <zash@zash.se>
parents:
4636
diff
changeset
|
140 |
|
8d4b91a703af
mod_pubsub_post: Document JSON to XML mapping capability
Kim Alvefur <zash@zash.se>
parents:
4636
diff
changeset
|
141 ``` json |
|
8d4b91a703af
mod_pubsub_post: Document JSON to XML mapping capability
Kim Alvefur <zash@zash.se>
parents:
4636
diff
changeset
|
142 { |
|
8d4b91a703af
mod_pubsub_post: Document JSON to XML mapping capability
Kim Alvefur <zash@zash.se>
parents:
4636
diff
changeset
|
143 "content" : "To be, or not to be: that is the question", |
|
8d4b91a703af
mod_pubsub_post: Document JSON to XML mapping capability
Kim Alvefur <zash@zash.se>
parents:
4636
diff
changeset
|
144 "title" : "Soliloquy" |
|
8d4b91a703af
mod_pubsub_post: Document JSON to XML mapping capability
Kim Alvefur <zash@zash.se>
parents:
4636
diff
changeset
|
145 } |
|
8d4b91a703af
mod_pubsub_post: Document JSON to XML mapping capability
Kim Alvefur <zash@zash.se>
parents:
4636
diff
changeset
|
146 ``` |
|
8d4b91a703af
mod_pubsub_post: Document JSON to XML mapping capability
Kim Alvefur <zash@zash.se>
parents:
4636
diff
changeset
|
147 |
|
8d4b91a703af
mod_pubsub_post: Document JSON to XML mapping capability
Kim Alvefur <zash@zash.se>
parents:
4636
diff
changeset
|
148 results in a payload like |
|
8d4b91a703af
mod_pubsub_post: Document JSON to XML mapping capability
Kim Alvefur <zash@zash.se>
parents:
4636
diff
changeset
|
149 |
|
8d4b91a703af
mod_pubsub_post: Document JSON to XML mapping capability
Kim Alvefur <zash@zash.se>
parents:
4636
diff
changeset
|
150 ``` xml |
|
8d4b91a703af
mod_pubsub_post: Document JSON to XML mapping capability
Kim Alvefur <zash@zash.se>
parents:
4636
diff
changeset
|
151 <musings xmlns="urn:example:princely"> |
|
8d4b91a703af
mod_pubsub_post: Document JSON to XML mapping capability
Kim Alvefur <zash@zash.se>
parents:
4636
diff
changeset
|
152 <title>Soliloquy</title> |
|
8d4b91a703af
mod_pubsub_post: Document JSON to XML mapping capability
Kim Alvefur <zash@zash.se>
parents:
4636
diff
changeset
|
153 <content>To be, or not to be: that is the question</content> |
|
8d4b91a703af
mod_pubsub_post: Document JSON to XML mapping capability
Kim Alvefur <zash@zash.se>
parents:
4636
diff
changeset
|
154 </musings> |
|
8d4b91a703af
mod_pubsub_post: Document JSON to XML mapping capability
Kim Alvefur <zash@zash.se>
parents:
4636
diff
changeset
|
155 ``` |
|
8d4b91a703af
mod_pubsub_post: Document JSON to XML mapping capability
Kim Alvefur <zash@zash.se>
parents:
4636
diff
changeset
|
156 |
|
8d4b91a703af
mod_pubsub_post: Document JSON to XML mapping capability
Kim Alvefur <zash@zash.se>
parents:
4636
diff
changeset
|
157 being published to the node. |
