annotate mod_voipms/mod_voipms.lua @ 6319:04c3273cb81f

mod_auth_cyrus: Add empty 'profile' table to SASL handler objects This is for compatibility with Prosody's built-in util.sasl objects. A SASL profile table usually includes methods supported by the backend, which can be used by SASL mechanism handlers to perform operations (such as testing the password). It also optionally contains a 'cb' field with channel binding method handlers. The Cyrus backend doesn't support channel binding, and doesn't have the same concept of auth backend methods (it handles all that internally, and Prosody has no insight or control over it). Thus, we create an empty profile which informs Prosody that the SASL handler does not support any of the auth or channel binding methods. Some features will not work, but they didn't work anyway. This just makes it explicit. This fixes a traceback in mod_sasl2_fast, which expected SASL handlers to always contain a 'profile' field.
author Matthew Wild <mwild1@gmail.com>
date Thu, 04 Sep 2025 10:14:46 +0100
parents 8f2de6652930
children fa976338928c
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
6299
5cf5ee23b361 mod_voipms: New Module to send and receive SMS/MMS via VoIP.ms APIs.
Chaz <menel@snikket.de>
parents:
diff changeset
1 local http = require "net.http"
5cf5ee23b361 mod_voipms: New Module to send and receive SMS/MMS via VoIP.ms APIs.
Chaz <menel@snikket.de>
parents:
diff changeset
2 local json = require "util.json"
5cf5ee23b361 mod_voipms: New Module to send and receive SMS/MMS via VoIP.ms APIs.
Chaz <menel@snikket.de>
parents:
diff changeset
3 local st = require "util.stanza"
5cf5ee23b361 mod_voipms: New Module to send and receive SMS/MMS via VoIP.ms APIs.
Chaz <menel@snikket.de>
parents:
diff changeset
4
5cf5ee23b361 mod_voipms: New Module to send and receive SMS/MMS via VoIP.ms APIs.
Chaz <menel@snikket.de>
parents:
diff changeset
5 local api_username = module:get_option_string("voipms_api_username")
5cf5ee23b361 mod_voipms: New Module to send and receive SMS/MMS via VoIP.ms APIs.
Chaz <menel@snikket.de>
parents:
diff changeset
6 local api_password = module:get_option_string("voipms_api_password")
5cf5ee23b361 mod_voipms: New Module to send and receive SMS/MMS via VoIP.ms APIs.
Chaz <menel@snikket.de>
parents:
diff changeset
7 local query_key = module:get_option("voipms_query_key")
5cf5ee23b361 mod_voipms: New Module to send and receive SMS/MMS via VoIP.ms APIs.
Chaz <menel@snikket.de>
parents:
diff changeset
8 local jid_map = module:get_option("voipms_jid_map") or {}
5cf5ee23b361 mod_voipms: New Module to send and receive SMS/MMS via VoIP.ms APIs.
Chaz <menel@snikket.de>
parents:
diff changeset
9 local rest_endpoint = "https://voip.ms/api/v1/rest.php"
5cf5ee23b361 mod_voipms: New Module to send and receive SMS/MMS via VoIP.ms APIs.
Chaz <menel@snikket.de>
parents:
diff changeset
10
5cf5ee23b361 mod_voipms: New Module to send and receive SMS/MMS via VoIP.ms APIs.
Chaz <menel@snikket.de>
parents:
diff changeset
11 if not api_username or not api_password or not query_key then
5cf5ee23b361 mod_voipms: New Module to send and receive SMS/MMS via VoIP.ms APIs.
Chaz <menel@snikket.de>
parents:
diff changeset
12 module:log("error", "Missing required config values (voipms_api_username, voipms_api_password, voipms_query_key)")
5cf5ee23b361 mod_voipms: New Module to send and receive SMS/MMS via VoIP.ms APIs.
Chaz <menel@snikket.de>
parents:
diff changeset
13 return
5cf5ee23b361 mod_voipms: New Module to send and receive SMS/MMS via VoIP.ms APIs.
Chaz <menel@snikket.de>
parents:
diff changeset
14 end
5cf5ee23b361 mod_voipms: New Module to send and receive SMS/MMS via VoIP.ms APIs.
Chaz <menel@snikket.de>
parents:
diff changeset
15
6300
8689f49d21ef mod_voipms: Updates
Menel <menel@snikket.de>
parents: 6299
diff changeset
16 for jid, dids in pairs(jid_map) do
8689f49d21ef mod_voipms: Updates
Menel <menel@snikket.de>
parents: 6299
diff changeset
17 if type(dids) ~= "table" then
8689f49d21ef mod_voipms: Updates
Menel <menel@snikket.de>
parents: 6299
diff changeset
18 module:log("error", "Invalid voipms_jid_map entry for %s: must be a list of DIDs", jid)
8689f49d21ef mod_voipms: Updates
Menel <menel@snikket.de>
parents: 6299
diff changeset
19 return
8689f49d21ef mod_voipms: Updates
Menel <menel@snikket.de>
parents: 6299
diff changeset
20 end
8689f49d21ef mod_voipms: Updates
Menel <menel@snikket.de>
parents: 6299
diff changeset
21 end
8689f49d21ef mod_voipms: Updates
Menel <menel@snikket.de>
parents: 6299
diff changeset
22
6299
5cf5ee23b361 mod_voipms: New Module to send and receive SMS/MMS via VoIP.ms APIs.
Chaz <menel@snikket.de>
parents:
diff changeset
23 module:depends("http")
5cf5ee23b361 mod_voipms: New Module to send and receive SMS/MMS via VoIP.ms APIs.
Chaz <menel@snikket.de>
parents:
diff changeset
24
5cf5ee23b361 mod_voipms: New Module to send and receive SMS/MMS via VoIP.ms APIs.
Chaz <menel@snikket.de>
parents:
diff changeset
25 local function normalize_number(num)
5cf5ee23b361 mod_voipms: New Module to send and receive SMS/MMS via VoIP.ms APIs.
Chaz <menel@snikket.de>
parents:
diff changeset
26 if not num then return nil end
5cf5ee23b361 mod_voipms: New Module to send and receive SMS/MMS via VoIP.ms APIs.
Chaz <menel@snikket.de>
parents:
diff changeset
27 if num:sub(1, 1) ~= "+" then
5cf5ee23b361 mod_voipms: New Module to send and receive SMS/MMS via VoIP.ms APIs.
Chaz <menel@snikket.de>
parents:
diff changeset
28 return "+1" .. num
5cf5ee23b361 mod_voipms: New Module to send and receive SMS/MMS via VoIP.ms APIs.
Chaz <menel@snikket.de>
parents:
diff changeset
29 end
5cf5ee23b361 mod_voipms: New Module to send and receive SMS/MMS via VoIP.ms APIs.
Chaz <menel@snikket.de>
parents:
diff changeset
30 return num
5cf5ee23b361 mod_voipms: New Module to send and receive SMS/MMS via VoIP.ms APIs.
Chaz <menel@snikket.de>
parents:
diff changeset
31 end
5cf5ee23b361 mod_voipms: New Module to send and receive SMS/MMS via VoIP.ms APIs.
Chaz <menel@snikket.de>
parents:
diff changeset
32
5cf5ee23b361 mod_voipms: New Module to send and receive SMS/MMS via VoIP.ms APIs.
Chaz <menel@snikket.de>
parents:
diff changeset
33 local function extract_query_key(event)
5cf5ee23b361 mod_voipms: New Module to send and receive SMS/MMS via VoIP.ms APIs.
Chaz <menel@snikket.de>
parents:
diff changeset
34 return (event.request.url.query or ""):match("key=([^&]+)")
5cf5ee23b361 mod_voipms: New Module to send and receive SMS/MMS via VoIP.ms APIs.
Chaz <menel@snikket.de>
parents:
diff changeset
35 end
5cf5ee23b361 mod_voipms: New Module to send and receive SMS/MMS via VoIP.ms APIs.
Chaz <menel@snikket.de>
parents:
diff changeset
36
5cf5ee23b361 mod_voipms: New Module to send and receive SMS/MMS via VoIP.ms APIs.
Chaz <menel@snikket.de>
parents:
diff changeset
37 module:provides("http", {
5cf5ee23b361 mod_voipms: New Module to send and receive SMS/MMS via VoIP.ms APIs.
Chaz <menel@snikket.de>
parents:
diff changeset
38 route = {
5cf5ee23b361 mod_voipms: New Module to send and receive SMS/MMS via VoIP.ms APIs.
Chaz <menel@snikket.de>
parents:
diff changeset
39 ["POST"] = function(event)
5cf5ee23b361 mod_voipms: New Module to send and receive SMS/MMS via VoIP.ms APIs.
Chaz <menel@snikket.de>
parents:
diff changeset
40 local req = event.request
5cf5ee23b361 mod_voipms: New Module to send and receive SMS/MMS via VoIP.ms APIs.
Chaz <menel@snikket.de>
parents:
diff changeset
41 local body = req.body or ""
5cf5ee23b361 mod_voipms: New Module to send and receive SMS/MMS via VoIP.ms APIs.
Chaz <menel@snikket.de>
parents:
diff changeset
42
5cf5ee23b361 mod_voipms: New Module to send and receive SMS/MMS via VoIP.ms APIs.
Chaz <menel@snikket.de>
parents:
diff changeset
43 if extract_query_key(event) ~= query_key then
5cf5ee23b361 mod_voipms: New Module to send and receive SMS/MMS via VoIP.ms APIs.
Chaz <menel@snikket.de>
parents:
diff changeset
44 module:log("warn", "Unauthorized webhook: missing or invalid key")
5cf5ee23b361 mod_voipms: New Module to send and receive SMS/MMS via VoIP.ms APIs.
Chaz <menel@snikket.de>
parents:
diff changeset
45 return { status_code = 403 }
5cf5ee23b361 mod_voipms: New Module to send and receive SMS/MMS via VoIP.ms APIs.
Chaz <menel@snikket.de>
parents:
diff changeset
46 end
5cf5ee23b361 mod_voipms: New Module to send and receive SMS/MMS via VoIP.ms APIs.
Chaz <menel@snikket.de>
parents:
diff changeset
47
5cf5ee23b361 mod_voipms: New Module to send and receive SMS/MMS via VoIP.ms APIs.
Chaz <menel@snikket.de>
parents:
diff changeset
48 local json_payload, err = json.decode(body)
5cf5ee23b361 mod_voipms: New Module to send and receive SMS/MMS via VoIP.ms APIs.
Chaz <menel@snikket.de>
parents:
diff changeset
49 if not json_payload then
5cf5ee23b361 mod_voipms: New Module to send and receive SMS/MMS via VoIP.ms APIs.
Chaz <menel@snikket.de>
parents:
diff changeset
50 module:log("warn", "Invalid JSON: %s", err or "unknown error")
5cf5ee23b361 mod_voipms: New Module to send and receive SMS/MMS via VoIP.ms APIs.
Chaz <menel@snikket.de>
parents:
diff changeset
51 return { status_code = 400 }
5cf5ee23b361 mod_voipms: New Module to send and receive SMS/MMS via VoIP.ms APIs.
Chaz <menel@snikket.de>
parents:
diff changeset
52 end
5cf5ee23b361 mod_voipms: New Module to send and receive SMS/MMS via VoIP.ms APIs.
Chaz <menel@snikket.de>
parents:
diff changeset
53
5cf5ee23b361 mod_voipms: New Module to send and receive SMS/MMS via VoIP.ms APIs.
Chaz <menel@snikket.de>
parents:
diff changeset
54 local payload = json_payload.data and json_payload.data.payload
5cf5ee23b361 mod_voipms: New Module to send and receive SMS/MMS via VoIP.ms APIs.
Chaz <menel@snikket.de>
parents:
diff changeset
55 if not payload then
5cf5ee23b361 mod_voipms: New Module to send and receive SMS/MMS via VoIP.ms APIs.
Chaz <menel@snikket.de>
parents:
diff changeset
56 module:log("warn", "Missing payload in JSON")
5cf5ee23b361 mod_voipms: New Module to send and receive SMS/MMS via VoIP.ms APIs.
Chaz <menel@snikket.de>
parents:
diff changeset
57 return { status_code = 400 }
5cf5ee23b361 mod_voipms: New Module to send and receive SMS/MMS via VoIP.ms APIs.
Chaz <menel@snikket.de>
parents:
diff changeset
58 end
5cf5ee23b361 mod_voipms: New Module to send and receive SMS/MMS via VoIP.ms APIs.
Chaz <menel@snikket.de>
parents:
diff changeset
59
5cf5ee23b361 mod_voipms: New Module to send and receive SMS/MMS via VoIP.ms APIs.
Chaz <menel@snikket.de>
parents:
diff changeset
60 local from = payload.from and payload.from.phone_number
5cf5ee23b361 mod_voipms: New Module to send and receive SMS/MMS via VoIP.ms APIs.
Chaz <menel@snikket.de>
parents:
diff changeset
61 local to_list = payload.to or {}
5cf5ee23b361 mod_voipms: New Module to send and receive SMS/MMS via VoIP.ms APIs.
Chaz <menel@snikket.de>
parents:
diff changeset
62 local to = #to_list > 0 and to_list[1].phone_number or nil
5cf5ee23b361 mod_voipms: New Module to send and receive SMS/MMS via VoIP.ms APIs.
Chaz <menel@snikket.de>
parents:
diff changeset
63
5cf5ee23b361 mod_voipms: New Module to send and receive SMS/MMS via VoIP.ms APIs.
Chaz <menel@snikket.de>
parents:
diff changeset
64 if not from or not to then
5cf5ee23b361 mod_voipms: New Module to send and receive SMS/MMS via VoIP.ms APIs.
Chaz <menel@snikket.de>
parents:
diff changeset
65 module:log("warn", "Missing phone numbers (from: %s, to: %s)", tostring(from), tostring(to))
5cf5ee23b361 mod_voipms: New Module to send and receive SMS/MMS via VoIP.ms APIs.
Chaz <menel@snikket.de>
parents:
diff changeset
66 return { status_code = 400 }
5cf5ee23b361 mod_voipms: New Module to send and receive SMS/MMS via VoIP.ms APIs.
Chaz <menel@snikket.de>
parents:
diff changeset
67 end
5cf5ee23b361 mod_voipms: New Module to send and receive SMS/MMS via VoIP.ms APIs.
Chaz <menel@snikket.de>
parents:
diff changeset
68
6300
8689f49d21ef mod_voipms: Updates
Menel <menel@snikket.de>
parents: 6299
diff changeset
69 local normalized_from = normalize_number(from)
6299
5cf5ee23b361 mod_voipms: New Module to send and receive SMS/MMS via VoIP.ms APIs.
Chaz <menel@snikket.de>
parents:
diff changeset
70 local normalized_to = normalize_number(to)
5cf5ee23b361 mod_voipms: New Module to send and receive SMS/MMS via VoIP.ms APIs.
Chaz <menel@snikket.de>
parents:
diff changeset
71 local target_jid = nil
5cf5ee23b361 mod_voipms: New Module to send and receive SMS/MMS via VoIP.ms APIs.
Chaz <menel@snikket.de>
parents:
diff changeset
72
6300
8689f49d21ef mod_voipms: Updates
Menel <menel@snikket.de>
parents: 6299
diff changeset
73 for jid, dids in pairs(jid_map) do
8689f49d21ef mod_voipms: Updates
Menel <menel@snikket.de>
parents: 6299
diff changeset
74 for _, did in ipairs(dids) do
8689f49d21ef mod_voipms: Updates
Menel <menel@snikket.de>
parents: 6299
diff changeset
75 if normalize_number(did) == normalized_to then
8689f49d21ef mod_voipms: Updates
Menel <menel@snikket.de>
parents: 6299
diff changeset
76 target_jid = jid
8689f49d21ef mod_voipms: Updates
Menel <menel@snikket.de>
parents: 6299
diff changeset
77 break
8689f49d21ef mod_voipms: Updates
Menel <menel@snikket.de>
parents: 6299
diff changeset
78 end
6299
5cf5ee23b361 mod_voipms: New Module to send and receive SMS/MMS via VoIP.ms APIs.
Chaz <menel@snikket.de>
parents:
diff changeset
79 end
6300
8689f49d21ef mod_voipms: Updates
Menel <menel@snikket.de>
parents: 6299
diff changeset
80 if target_jid then break end
6299
5cf5ee23b361 mod_voipms: New Module to send and receive SMS/MMS via VoIP.ms APIs.
Chaz <menel@snikket.de>
parents:
diff changeset
81 end
5cf5ee23b361 mod_voipms: New Module to send and receive SMS/MMS via VoIP.ms APIs.
Chaz <menel@snikket.de>
parents:
diff changeset
82
5cf5ee23b361 mod_voipms: New Module to send and receive SMS/MMS via VoIP.ms APIs.
Chaz <menel@snikket.de>
parents:
diff changeset
83 if not target_jid then
5cf5ee23b361 mod_voipms: New Module to send and receive SMS/MMS via VoIP.ms APIs.
Chaz <menel@snikket.de>
parents:
diff changeset
84 module:log("warn", "No JID mapping for DID %s", normalized_to)
5cf5ee23b361 mod_voipms: New Module to send and receive SMS/MMS via VoIP.ms APIs.
Chaz <menel@snikket.de>
parents:
diff changeset
85 return { status_code = 404 }
5cf5ee23b361 mod_voipms: New Module to send and receive SMS/MMS via VoIP.ms APIs.
Chaz <menel@snikket.de>
parents:
diff changeset
86 end
5cf5ee23b361 mod_voipms: New Module to send and receive SMS/MMS via VoIP.ms APIs.
Chaz <menel@snikket.de>
parents:
diff changeset
87
5cf5ee23b361 mod_voipms: New Module to send and receive SMS/MMS via VoIP.ms APIs.
Chaz <menel@snikket.de>
parents:
diff changeset
88 local message_text = payload.text or ""
6300
8689f49d21ef mod_voipms: Updates
Menel <menel@snikket.de>
parents: 6299
diff changeset
89 local from_jid = normalized_from .. "%" .. normalized_to .. "@" .. module.host
6299
5cf5ee23b361 mod_voipms: New Module to send and receive SMS/MMS via VoIP.ms APIs.
Chaz <menel@snikket.de>
parents:
diff changeset
90
6300
8689f49d21ef mod_voipms: Updates
Menel <menel@snikket.de>
parents: 6299
diff changeset
91 if message_text ~= "" then
8689f49d21ef mod_voipms: Updates
Menel <menel@snikket.de>
parents: 6299
diff changeset
92 local text_message = st.message({
8689f49d21ef mod_voipms: Updates
Menel <menel@snikket.de>
parents: 6299
diff changeset
93 from = from_jid,
8689f49d21ef mod_voipms: Updates
Menel <menel@snikket.de>
parents: 6299
diff changeset
94 to = target_jid,
8689f49d21ef mod_voipms: Updates
Menel <menel@snikket.de>
parents: 6299
diff changeset
95 type = "chat"
8689f49d21ef mod_voipms: Updates
Menel <menel@snikket.de>
parents: 6299
diff changeset
96 }):tag("body"):text(message_text):up()
8689f49d21ef mod_voipms: Updates
Menel <menel@snikket.de>
parents: 6299
diff changeset
97
8689f49d21ef mod_voipms: Updates
Menel <menel@snikket.de>
parents: 6299
diff changeset
98 module:send(text_message)
8689f49d21ef mod_voipms: Updates
Menel <menel@snikket.de>
parents: 6299
diff changeset
99 module:log("info", "Delivered text SMS from %s to %s", normalized_from, target_jid)
8689f49d21ef mod_voipms: Updates
Menel <menel@snikket.de>
parents: 6299
diff changeset
100 end
6299
5cf5ee23b361 mod_voipms: New Module to send and receive SMS/MMS via VoIP.ms APIs.
Chaz <menel@snikket.de>
parents:
diff changeset
101
5cf5ee23b361 mod_voipms: New Module to send and receive SMS/MMS via VoIP.ms APIs.
Chaz <menel@snikket.de>
parents:
diff changeset
102 if payload.media and #payload.media > 0 then
5cf5ee23b361 mod_voipms: New Module to send and receive SMS/MMS via VoIP.ms APIs.
Chaz <menel@snikket.de>
parents:
diff changeset
103 for _, media_item in ipairs(payload.media) do
5cf5ee23b361 mod_voipms: New Module to send and receive SMS/MMS via VoIP.ms APIs.
Chaz <menel@snikket.de>
parents:
diff changeset
104 if media_item.url then
6300
8689f49d21ef mod_voipms: Updates
Menel <menel@snikket.de>
parents: 6299
diff changeset
105 local media_message = st.message({
8689f49d21ef mod_voipms: Updates
Menel <menel@snikket.de>
parents: 6299
diff changeset
106 from = from_jid,
8689f49d21ef mod_voipms: Updates
Menel <menel@snikket.de>
parents: 6299
diff changeset
107 to = target_jid,
8689f49d21ef mod_voipms: Updates
Menel <menel@snikket.de>
parents: 6299
diff changeset
108 type = "chat"
8689f49d21ef mod_voipms: Updates
Menel <menel@snikket.de>
parents: 6299
diff changeset
109 })
8689f49d21ef mod_voipms: Updates
Menel <menel@snikket.de>
parents: 6299
diff changeset
110 :tag("body"):text(media_item.url):up()
8689f49d21ef mod_voipms: Updates
Menel <menel@snikket.de>
parents: 6299
diff changeset
111 :tag("x", { xmlns = "jabber:x:oob" })
8689f49d21ef mod_voipms: Updates
Menel <menel@snikket.de>
parents: 6299
diff changeset
112 :tag("url"):text(media_item.url):up()
8689f49d21ef mod_voipms: Updates
Menel <menel@snikket.de>
parents: 6299
diff changeset
113 :up()
8689f49d21ef mod_voipms: Updates
Menel <menel@snikket.de>
parents: 6299
diff changeset
114
8689f49d21ef mod_voipms: Updates
Menel <menel@snikket.de>
parents: 6299
diff changeset
115 module:send(media_message)
8689f49d21ef mod_voipms: Updates
Menel <menel@snikket.de>
parents: 6299
diff changeset
116 module:log("info", "Delivered media URL from %s to %s: %s", normalized_from, target_jid, media_item.url)
6299
5cf5ee23b361 mod_voipms: New Module to send and receive SMS/MMS via VoIP.ms APIs.
Chaz <menel@snikket.de>
parents:
diff changeset
117 end
5cf5ee23b361 mod_voipms: New Module to send and receive SMS/MMS via VoIP.ms APIs.
Chaz <menel@snikket.de>
parents:
diff changeset
118 end
5cf5ee23b361 mod_voipms: New Module to send and receive SMS/MMS via VoIP.ms APIs.
Chaz <menel@snikket.de>
parents:
diff changeset
119 end
5cf5ee23b361 mod_voipms: New Module to send and receive SMS/MMS via VoIP.ms APIs.
Chaz <menel@snikket.de>
parents:
diff changeset
120
5cf5ee23b361 mod_voipms: New Module to send and receive SMS/MMS via VoIP.ms APIs.
Chaz <menel@snikket.de>
parents:
diff changeset
121 return { status_code = 204 }
5cf5ee23b361 mod_voipms: New Module to send and receive SMS/MMS via VoIP.ms APIs.
Chaz <menel@snikket.de>
parents:
diff changeset
122 end
5cf5ee23b361 mod_voipms: New Module to send and receive SMS/MMS via VoIP.ms APIs.
Chaz <menel@snikket.de>
parents:
diff changeset
123 }
5cf5ee23b361 mod_voipms: New Module to send and receive SMS/MMS via VoIP.ms APIs.
Chaz <menel@snikket.de>
parents:
diff changeset
124 })
5cf5ee23b361 mod_voipms: New Module to send and receive SMS/MMS via VoIP.ms APIs.
Chaz <menel@snikket.de>
parents:
diff changeset
125
5cf5ee23b361 mod_voipms: New Module to send and receive SMS/MMS via VoIP.ms APIs.
Chaz <menel@snikket.de>
parents:
diff changeset
126 module:hook("message/bare", function(event)
5cf5ee23b361 mod_voipms: New Module to send and receive SMS/MMS via VoIP.ms APIs.
Chaz <menel@snikket.de>
parents:
diff changeset
127 local stanza = event.stanza
5cf5ee23b361 mod_voipms: New Module to send and receive SMS/MMS via VoIP.ms APIs.
Chaz <menel@snikket.de>
parents:
diff changeset
128 if stanza.attr.type ~= "chat" then return end
5cf5ee23b361 mod_voipms: New Module to send and receive SMS/MMS via VoIP.ms APIs.
Chaz <menel@snikket.de>
parents:
diff changeset
129
5cf5ee23b361 mod_voipms: New Module to send and receive SMS/MMS via VoIP.ms APIs.
Chaz <menel@snikket.de>
parents:
diff changeset
130 local from_jid = stanza.attr.from
5cf5ee23b361 mod_voipms: New Module to send and receive SMS/MMS via VoIP.ms APIs.
Chaz <menel@snikket.de>
parents:
diff changeset
131 local to_jid = stanza.attr.to
5cf5ee23b361 mod_voipms: New Module to send and receive SMS/MMS via VoIP.ms APIs.
Chaz <menel@snikket.de>
parents:
diff changeset
132 local body = stanza:get_child_text("body")
5cf5ee23b361 mod_voipms: New Module to send and receive SMS/MMS via VoIP.ms APIs.
Chaz <menel@snikket.de>
parents:
diff changeset
133 if not body or body == "" then return end
5cf5ee23b361 mod_voipms: New Module to send and receive SMS/MMS via VoIP.ms APIs.
Chaz <menel@snikket.de>
parents:
diff changeset
134
6300
8689f49d21ef mod_voipms: Updates
Menel <menel@snikket.de>
parents: 6299
diff changeset
135 local to_node = to_jid:match("^(.-)@")
8689f49d21ef mod_voipms: Updates
Menel <menel@snikket.de>
parents: 6299
diff changeset
136 if not to_node then
6299
5cf5ee23b361 mod_voipms: New Module to send and receive SMS/MMS via VoIP.ms APIs.
Chaz <menel@snikket.de>
parents:
diff changeset
137 module:log("warn", "Malformed JID in message.to: %s", to_jid)
5cf5ee23b361 mod_voipms: New Module to send and receive SMS/MMS via VoIP.ms APIs.
Chaz <menel@snikket.de>
parents:
diff changeset
138 return
5cf5ee23b361 mod_voipms: New Module to send and receive SMS/MMS via VoIP.ms APIs.
Chaz <menel@snikket.de>
parents:
diff changeset
139 end
5cf5ee23b361 mod_voipms: New Module to send and receive SMS/MMS via VoIP.ms APIs.
Chaz <menel@snikket.de>
parents:
diff changeset
140
6300
8689f49d21ef mod_voipms: Updates
Menel <menel@snikket.de>
parents: 6299
diff changeset
141 local dst_number, from_number = to_node:match("([^%%]+)%%(.+)")
8689f49d21ef mod_voipms: Updates
Menel <menel@snikket.de>
parents: 6299
diff changeset
142 if not dst_number or not from_number then
8689f49d21ef mod_voipms: Updates
Menel <menel@snikket.de>
parents: 6299
diff changeset
143 module:log("warn", "Malformed to JID node: %s", to_node)
8689f49d21ef mod_voipms: Updates
Menel <menel@snikket.de>
parents: 6299
diff changeset
144 return
8689f49d21ef mod_voipms: Updates
Menel <menel@snikket.de>
parents: 6299
diff changeset
145 end
8689f49d21ef mod_voipms: Updates
Menel <menel@snikket.de>
parents: 6299
diff changeset
146
8689f49d21ef mod_voipms: Updates
Menel <menel@snikket.de>
parents: 6299
diff changeset
147 dst_number = normalize_number(dst_number)
8689f49d21ef mod_voipms: Updates
Menel <menel@snikket.de>
parents: 6299
diff changeset
148 from_number = normalize_number(from_number)
6299
5cf5ee23b361 mod_voipms: New Module to send and receive SMS/MMS via VoIP.ms APIs.
Chaz <menel@snikket.de>
parents:
diff changeset
149
5cf5ee23b361 mod_voipms: New Module to send and receive SMS/MMS via VoIP.ms APIs.
Chaz <menel@snikket.de>
parents:
diff changeset
150 local media_urls = {}
5cf5ee23b361 mod_voipms: New Module to send and receive SMS/MMS via VoIP.ms APIs.
Chaz <menel@snikket.de>
parents:
diff changeset
151 for line in body:gmatch("[^\r\n]+") do
5cf5ee23b361 mod_voipms: New Module to send and receive SMS/MMS via VoIP.ms APIs.
Chaz <menel@snikket.de>
parents:
diff changeset
152 if line:match("^https?://") then
5cf5ee23b361 mod_voipms: New Module to send and receive SMS/MMS via VoIP.ms APIs.
Chaz <menel@snikket.de>
parents:
diff changeset
153 table.insert(media_urls, line)
5cf5ee23b361 mod_voipms: New Module to send and receive SMS/MMS via VoIP.ms APIs.
Chaz <menel@snikket.de>
parents:
diff changeset
154 end
5cf5ee23b361 mod_voipms: New Module to send and receive SMS/MMS via VoIP.ms APIs.
Chaz <menel@snikket.de>
parents:
diff changeset
155 end
5cf5ee23b361 mod_voipms: New Module to send and receive SMS/MMS via VoIP.ms APIs.
Chaz <menel@snikket.de>
parents:
diff changeset
156
5cf5ee23b361 mod_voipms: New Module to send and receive SMS/MMS via VoIP.ms APIs.
Chaz <menel@snikket.de>
parents:
diff changeset
157 local method = (#media_urls > 0) and "sendMMS" or "sendSMS"
5cf5ee23b361 mod_voipms: New Module to send and receive SMS/MMS via VoIP.ms APIs.
Chaz <menel@snikket.de>
parents:
diff changeset
158 local query = {
5cf5ee23b361 mod_voipms: New Module to send and receive SMS/MMS via VoIP.ms APIs.
Chaz <menel@snikket.de>
parents:
diff changeset
159 api_username = api_username,
5cf5ee23b361 mod_voipms: New Module to send and receive SMS/MMS via VoIP.ms APIs.
Chaz <menel@snikket.de>
parents:
diff changeset
160 api_password = api_password,
5cf5ee23b361 mod_voipms: New Module to send and receive SMS/MMS via VoIP.ms APIs.
Chaz <menel@snikket.de>
parents:
diff changeset
161 method = method,
5cf5ee23b361 mod_voipms: New Module to send and receive SMS/MMS via VoIP.ms APIs.
Chaz <menel@snikket.de>
parents:
diff changeset
162 did = from_number,
6300
8689f49d21ef mod_voipms: Updates
Menel <menel@snikket.de>
parents: 6299
diff changeset
163 dst = dst_number,
6299
5cf5ee23b361 mod_voipms: New Module to send and receive SMS/MMS via VoIP.ms APIs.
Chaz <menel@snikket.de>
parents:
diff changeset
164 message = body
5cf5ee23b361 mod_voipms: New Module to send and receive SMS/MMS via VoIP.ms APIs.
Chaz <menel@snikket.de>
parents:
diff changeset
165 }
5cf5ee23b361 mod_voipms: New Module to send and receive SMS/MMS via VoIP.ms APIs.
Chaz <menel@snikket.de>
parents:
diff changeset
166
5cf5ee23b361 mod_voipms: New Module to send and receive SMS/MMS via VoIP.ms APIs.
Chaz <menel@snikket.de>
parents:
diff changeset
167 if method == "sendMMS" then
5cf5ee23b361 mod_voipms: New Module to send and receive SMS/MMS via VoIP.ms APIs.
Chaz <menel@snikket.de>
parents:
diff changeset
168 for i, url in ipairs(media_urls) do
5cf5ee23b361 mod_voipms: New Module to send and receive SMS/MMS via VoIP.ms APIs.
Chaz <menel@snikket.de>
parents:
diff changeset
169 query["media_url[" .. (i - 1) .. "]"] = url
5cf5ee23b361 mod_voipms: New Module to send and receive SMS/MMS via VoIP.ms APIs.
Chaz <menel@snikket.de>
parents:
diff changeset
170 end
5cf5ee23b361 mod_voipms: New Module to send and receive SMS/MMS via VoIP.ms APIs.
Chaz <menel@snikket.de>
parents:
diff changeset
171 end
5cf5ee23b361 mod_voipms: New Module to send and receive SMS/MMS via VoIP.ms APIs.
Chaz <menel@snikket.de>
parents:
diff changeset
172
5cf5ee23b361 mod_voipms: New Module to send and receive SMS/MMS via VoIP.ms APIs.
Chaz <menel@snikket.de>
parents:
diff changeset
173 local query_str = http.formencode(query)
5cf5ee23b361 mod_voipms: New Module to send and receive SMS/MMS via VoIP.ms APIs.
Chaz <menel@snikket.de>
parents:
diff changeset
174
5cf5ee23b361 mod_voipms: New Module to send and receive SMS/MMS via VoIP.ms APIs.
Chaz <menel@snikket.de>
parents:
diff changeset
175 http.request(rest_endpoint .. "?" .. query_str, {
5cf5ee23b361 mod_voipms: New Module to send and receive SMS/MMS via VoIP.ms APIs.
Chaz <menel@snikket.de>
parents:
diff changeset
176 method = "GET";
5cf5ee23b361 mod_voipms: New Module to send and receive SMS/MMS via VoIP.ms APIs.
Chaz <menel@snikket.de>
parents:
diff changeset
177 }, function(response_body, code)
5cf5ee23b361 mod_voipms: New Module to send and receive SMS/MMS via VoIP.ms APIs.
Chaz <menel@snikket.de>
parents:
diff changeset
178 if code == 200 then
5cf5ee23b361 mod_voipms: New Module to send and receive SMS/MMS via VoIP.ms APIs.
Chaz <menel@snikket.de>
parents:
diff changeset
179 local resp, err = json.decode(response_body)
5cf5ee23b361 mod_voipms: New Module to send and receive SMS/MMS via VoIP.ms APIs.
Chaz <menel@snikket.de>
parents:
diff changeset
180 if not resp or resp.status ~= "success" then
6316
8f2de6652930 mod_voipms: Send client error messages in additon to logging
Chaz Kettleson <chaz@pyr3x.com>
parents: 6307
diff changeset
181 local err_msg = string.format("Failed to send %s: %s", method, err or (resp and resp.status) or "unknown")
8f2de6652930 mod_voipms: Send client error messages in additon to logging
Chaz Kettleson <chaz@pyr3x.com>
parents: 6307
diff changeset
182 module:log("error", "%s", err_msg)
8f2de6652930 mod_voipms: Send client error messages in additon to logging
Chaz Kettleson <chaz@pyr3x.com>
parents: 6307
diff changeset
183 local err_reply = st.error_reply(stanza, "cancel", "remote-server-error", err_msg)
8f2de6652930 mod_voipms: Send client error messages in additon to logging
Chaz Kettleson <chaz@pyr3x.com>
parents: 6307
diff changeset
184 module:send(err_reply)
6299
5cf5ee23b361 mod_voipms: New Module to send and receive SMS/MMS via VoIP.ms APIs.
Chaz <menel@snikket.de>
parents:
diff changeset
185 else
6300
8689f49d21ef mod_voipms: Updates
Menel <menel@snikket.de>
parents: 6299
diff changeset
186 module:log("info", "Sent %s from %s to %s", method, from_number, dst_number)
6299
5cf5ee23b361 mod_voipms: New Module to send and receive SMS/MMS via VoIP.ms APIs.
Chaz <menel@snikket.de>
parents:
diff changeset
187 end
5cf5ee23b361 mod_voipms: New Module to send and receive SMS/MMS via VoIP.ms APIs.
Chaz <menel@snikket.de>
parents:
diff changeset
188 else
6316
8f2de6652930 mod_voipms: Send client error messages in additon to logging
Chaz Kettleson <chaz@pyr3x.com>
parents: 6307
diff changeset
189 local err_msg = string.format("HTTP error sending %s: code %s", method, tostring(code))
8f2de6652930 mod_voipms: Send client error messages in additon to logging
Chaz Kettleson <chaz@pyr3x.com>
parents: 6307
diff changeset
190 module:log("error", "%s", err_msg)
8f2de6652930 mod_voipms: Send client error messages in additon to logging
Chaz Kettleson <chaz@pyr3x.com>
parents: 6307
diff changeset
191 local err_reply = st.error_reply(stanza, "cancel", "remote-server-error", err_msg)
8f2de6652930 mod_voipms: Send client error messages in additon to logging
Chaz Kettleson <chaz@pyr3x.com>
parents: 6307
diff changeset
192 module:send(err_reply)
6299
5cf5ee23b361 mod_voipms: New Module to send and receive SMS/MMS via VoIP.ms APIs.
Chaz <menel@snikket.de>
parents:
diff changeset
193 end
5cf5ee23b361 mod_voipms: New Module to send and receive SMS/MMS via VoIP.ms APIs.
Chaz <menel@snikket.de>
parents:
diff changeset
194 end)
6307
c194bec4b56d mod_voipms: Fix bug from not returning in message/bare hook
Chaz Kettleson <chaz@pyr3x.com>
parents: 6300
diff changeset
195
c194bec4b56d mod_voipms: Fix bug from not returning in message/bare hook
Chaz Kettleson <chaz@pyr3x.com>
parents: 6300
diff changeset
196 return true
6299
5cf5ee23b361 mod_voipms: New Module to send and receive SMS/MMS via VoIP.ms APIs.
Chaz <menel@snikket.de>
parents:
diff changeset
197 end)