Mercurial > prosody-modules
annotate mod_component_client/mod_component_client.lua @ 5366:db4c66a1d24b
mod_http_oauth2: Fill in some client metadata defaults
Explicit > Implicit
Maybe we should actually use these for something as well? :)
It's is somewhat an open question of how strictly we should enforce
things in the client metadata given that it is somewhat extensible.
Especially some of these enum fields which have corresponding IANA
registries.
author | Kim Alvefur <zash@zash.se> |
---|---|
date | Tue, 25 Apr 2023 18:09:08 +0200 |
parents | 3e00cd4a02bc |
children |
rev | line source |
---|---|
993
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
1 --[[ |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
2 |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
3 mod_component_client.lua |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
4 |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
5 This module turns Prosody hosts into components of other XMPP servers. |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
6 |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
7 Config: |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
8 |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
9 VirtualHost "component.example.com" |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
10 component_client = { |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
11 host = "localhost"; |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
12 port = 5347; |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
13 secret = "hunter2"; |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
14 } |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
15 |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
16 |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
17 ]] |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
18 |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
19 |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
20 local socket = require "socket" |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
21 |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
22 local logger = require "util.logger"; |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
23 local sha1 = require "util.hashes".sha1; |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
24 local st = require "util.stanza"; |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
25 |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
26 local jid_split = require "util.jid".split; |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
27 local new_xmpp_stream = require "util.xmppstream".new; |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
28 local uuid_gen = require "util.uuid".generate; |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
29 |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
30 local core_process_stanza = prosody.core_process_stanza; |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
31 local hosts = prosody.hosts; |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
32 |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
33 local log = module._log; |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
34 |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
35 local config = module:get_option("component_client", {}); |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
36 local server_host = config.host or "localhost"; |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
37 local server_port = config.port or 5347; |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
38 local server_secret = config.secret or error("client_component.secret not provided"); |
1209
fc39f78e2b36
mod_component_client: Added component_client.exit_on_disconnect config option
Waqas Hussain <waqas20@gmail.com>
parents:
1208
diff
changeset
|
39 local exit_on_disconnect = config.exit_on_disconnect; |
1214
a234ad611633
mod_component_client: Add config option component_client.keepalive_interval (default is one hour: 3600).
Waqas Hussain <waqas20@gmail.com>
parents:
1210
diff
changeset
|
40 local keepalive_interval = config.keepalive_interval or 3600; |
993
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
41 |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
42 local __conn; |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
43 |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
44 local listener = {}; |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
45 local session; |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
46 |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
47 local xmlns_component = 'jabber:component:accept'; |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
48 local stream_callbacks = { default_ns = xmlns_component }; |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
49 |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
50 local xmlns_xmpp_streams = "urn:ietf:params:xml:ns:xmpp-streams"; |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
51 |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
52 function stream_callbacks.error(session, error, data, data2) |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
53 if session.destroyed then return; end |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
54 module:log("warn", "Error processing component stream: %s", tostring(error)); |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
55 if error == "no-stream" then |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
56 session:close("invalid-namespace"); |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
57 elseif error == "parse-error" then |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
58 session.log("warn", "External component %s XML parse error: %s", tostring(session.host), tostring(data)); |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
59 session:close("not-well-formed"); |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
60 elseif error == "stream-error" then |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
61 local condition, text = "undefined-condition"; |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
62 for child in data:children() do |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
63 if child.attr.xmlns == xmlns_xmpp_streams then |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
64 if child.name ~= "text" then |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
65 condition = child.name; |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
66 else |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
67 text = child:get_text(); |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
68 end |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
69 if condition ~= "undefined-condition" and text then |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
70 break; |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
71 end |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
72 end |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
73 end |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
74 text = condition .. (text and (" ("..text..")") or ""); |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
75 session.log("info", "Session closed by remote with error: %s", text); |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
76 session:close(nil, text); |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
77 end |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
78 end |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
79 |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
80 function stream_callbacks.streamopened(session, attr) |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
81 -- TODO check id~=nil, from==module.host |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
82 module:log("debug", "Sending handshake"); |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
83 local handshake = st.stanza("handshake"):text(sha1(attr.id..server_secret, true)); |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
84 session.send(handshake); |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
85 session.notopen = nil; |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
86 end |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
87 |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
88 function stream_callbacks.streamclosed(session) |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
89 session.log("debug", "Received </stream:stream>"); |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
90 session:close(); |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
91 end |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
92 |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
93 module:hook("stanza/jabber:component:accept:handshake", function(event) |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
94 session.type = "component"; |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
95 module:log("debug", "Handshake complete"); |
1208
defa479a7d53
mod_component_client: Fire connect (logged in) and disconnect events
Waqas Hussain <waqas20@gmail.com>
parents:
993
diff
changeset
|
96 module:fire_event("component_client/connected", {}); |
993
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
97 return true; -- READY! |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
98 end); |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
99 |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
100 module:hook("route/remote", function(event) |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
101 return session and session.send(event.stanza); |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
102 end); |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
103 |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
104 function stream_callbacks.handlestanza(session, stanza) |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
105 -- Namespaces are icky. |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
106 if not stanza.attr.xmlns and stanza.name == "handshake" then |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
107 stanza.attr.xmlns = xmlns_component; |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
108 end |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
109 if not stanza.attr.xmlns or stanza.attr.xmlns == "jabber:client" then |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
110 if not stanza.attr.from then |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
111 session.log("warn", "Rejecting stanza with no 'from' address"); |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
112 session.send(st.error_reply(stanza, "modify", "bad-request", "Components MUST get a 'from' address on stanzas")); |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
113 return; |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
114 end |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
115 local _, domain = jid_split(stanza.attr.to); |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
116 if not domain then |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
117 session.log("warn", "Rejecting stanza with no 'to' address"); |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
118 session.send(st.error_reply(stanza, "modify", "bad-request", "Components MUST get a 'to' address on stanzas")); |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
119 return; |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
120 elseif domain ~= session.host then |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
121 session.log("warn", "Component received stanza with unknown 'to' address"); |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
122 session.send(st.error_reply(stanza, "cancel", "not-allowed", "Component doesn't serve this JID")); |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
123 return; |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
124 end |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
125 end |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
126 return core_process_stanza(session, stanza); |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
127 end |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
128 |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
129 local stream_xmlns_attr = {xmlns='urn:ietf:params:xml:ns:xmpp-streams'}; |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
130 local default_stream_attr = { ["xmlns:stream"] = "http://etherx.jabber.org/streams", xmlns = stream_callbacks.default_ns, version = "1.0", id = "" }; |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
131 local function session_close(session, reason) |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
132 if session.destroyed then return; end |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
133 if session.conn then |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
134 if session.notopen then |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
135 session.send("<?xml version='1.0'?>"); |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
136 session.send(st.stanza("stream:stream", default_stream_attr):top_tag()); |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
137 end |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
138 if reason then |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
139 if type(reason) == "string" then -- assume stream error |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
140 module:log("info", "Disconnecting component, <stream:error> is: %s", reason); |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
141 session.send(st.stanza("stream:error"):tag(reason, {xmlns = 'urn:ietf:params:xml:ns:xmpp-streams' })); |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
142 elseif type(reason) == "table" then |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
143 if reason.condition then |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
144 local stanza = st.stanza("stream:error"):tag(reason.condition, stream_xmlns_attr):up(); |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
145 if reason.text then |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
146 stanza:tag("text", stream_xmlns_attr):text(reason.text):up(); |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
147 end |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
148 if reason.extra then |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
149 stanza:add_child(reason.extra); |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
150 end |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
151 module:log("info", "Disconnecting component, <stream:error> is: %s", tostring(stanza)); |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
152 session.send(stanza); |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
153 elseif reason.name then -- a stanza |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
154 module:log("info", "Disconnecting component, <stream:error> is: %s", tostring(reason)); |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
155 session.send(reason); |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
156 end |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
157 end |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
158 end |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
159 session.send("</stream:stream>"); |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
160 session.conn:close(); |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
161 listener.ondisconnect(session.conn, "stream error"); |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
162 end |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
163 end |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
164 |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
165 function listener.onconnect(conn) |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
166 session = { type = "component_unauthed", conn = conn, send = function (data) return conn:write(tostring(data)); end, host = module.host }; |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
167 |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
168 -- Logging functions -- |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
169 local conn_name = "jcp"..tostring(session):match("[a-f0-9]+$"); |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
170 session.log = logger.init(conn_name); |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
171 session.close = session_close; |
1343
7dbde05b48a9
all the things: Remove trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents:
1222
diff
changeset
|
172 |
993
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
173 session.log("info", "Outgoing Jabber component connection"); |
1343
7dbde05b48a9
all the things: Remove trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents:
1222
diff
changeset
|
174 |
993
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
175 local stream = new_xmpp_stream(session, stream_callbacks); |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
176 session.stream = stream; |
1343
7dbde05b48a9
all the things: Remove trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents:
1222
diff
changeset
|
177 |
993
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
178 function session.data(conn, data) |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
179 local ok, err = stream:feed(data); |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
180 if ok then return; end |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
181 module:log("debug", "Received invalid XML (%s) %d bytes: %s", tostring(err), #data, data:sub(1, 300):gsub("[\r\n]+", " "):gsub("[%z\1-\31]", "_")); |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
182 session:close("not-well-formed"); |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
183 end |
1343
7dbde05b48a9
all the things: Remove trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents:
1222
diff
changeset
|
184 |
993
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
185 session.dispatch_stanza = stream_callbacks.handlestanza; |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
186 |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
187 session.notopen = true; |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
188 session.send(st.stanza("stream:stream", { |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
189 to = session.host; |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
190 ["xmlns:stream"] = 'http://etherx.jabber.org/streams'; |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
191 xmlns = xmlns_component; |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
192 }):top_tag()); |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
193 |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
194 --sessions[conn] = session; |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
195 end |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
196 function listener.onincoming(conn, data) |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
197 --local session = sessions[conn]; |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
198 session.data(conn, data); |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
199 end |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
200 function listener.ondisconnect(conn, err) |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
201 --local session = sessions[conn]; |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
202 if session then |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
203 (session.log or log)("info", "component disconnected: %s (%s)", tostring(session.host), tostring(err)); |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
204 if session.on_destroy then session:on_destroy(err); end |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
205 --sessions[conn] = nil; |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
206 for k in pairs(session) do |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
207 if k ~= "log" and k ~= "close" then |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
208 session[k] = nil; |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
209 end |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
210 end |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
211 session.destroyed = true; |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
212 session = nil; |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
213 end |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
214 __conn = nil; |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
215 module:log("error", "connection lost"); |
1208
defa479a7d53
mod_component_client: Fire connect (logged in) and disconnect events
Waqas Hussain <waqas20@gmail.com>
parents:
993
diff
changeset
|
216 module:fire_event("component_client/disconnected", { reason = err }); |
1220
6b9a56b959b8
mod_component_client: When exit_on_disconnect=true, don't try to shutdown Prosody when it's already shutting down.
Waqas Hussain <waqas20@gmail.com>
parents:
1218
diff
changeset
|
217 if exit_on_disconnect and not prosody.shutdown_reason then |
2029
3e00cd4a02bc
mod_component_client: Pass a non-zero exit code on shutdown due to lost connection
daurnimator <quae@daurnimator.com>
parents:
1343
diff
changeset
|
218 prosody.shutdown("Shutdown by component_client disconnect", 1); |
1209
fc39f78e2b36
mod_component_client: Added component_client.exit_on_disconnect config option
Waqas Hussain <waqas20@gmail.com>
parents:
1208
diff
changeset
|
219 end |
993
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
220 end |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
221 |
1214
a234ad611633
mod_component_client: Add config option component_client.keepalive_interval (default is one hour: 3600).
Waqas Hussain <waqas20@gmail.com>
parents:
1210
diff
changeset
|
222 -- send whitespace keep-alive one an hour |
a234ad611633
mod_component_client: Add config option component_client.keepalive_interval (default is one hour: 3600).
Waqas Hussain <waqas20@gmail.com>
parents:
1210
diff
changeset
|
223 if keepalive_interval ~= 0 then |
a234ad611633
mod_component_client: Add config option component_client.keepalive_interval (default is one hour: 3600).
Waqas Hussain <waqas20@gmail.com>
parents:
1210
diff
changeset
|
224 module:add_timer(keepalive_interval, function() |
a234ad611633
mod_component_client: Add config option component_client.keepalive_interval (default is one hour: 3600).
Waqas Hussain <waqas20@gmail.com>
parents:
1210
diff
changeset
|
225 if __conn then |
a234ad611633
mod_component_client: Add config option component_client.keepalive_interval (default is one hour: 3600).
Waqas Hussain <waqas20@gmail.com>
parents:
1210
diff
changeset
|
226 __conn:write(" "); |
a234ad611633
mod_component_client: Add config option component_client.keepalive_interval (default is one hour: 3600).
Waqas Hussain <waqas20@gmail.com>
parents:
1210
diff
changeset
|
227 end |
a234ad611633
mod_component_client: Add config option component_client.keepalive_interval (default is one hour: 3600).
Waqas Hussain <waqas20@gmail.com>
parents:
1210
diff
changeset
|
228 return keepalive_interval; |
a234ad611633
mod_component_client: Add config option component_client.keepalive_interval (default is one hour: 3600).
Waqas Hussain <waqas20@gmail.com>
parents:
1210
diff
changeset
|
229 end); |
a234ad611633
mod_component_client: Add config option component_client.keepalive_interval (default is one hour: 3600).
Waqas Hussain <waqas20@gmail.com>
parents:
1210
diff
changeset
|
230 end |
a234ad611633
mod_component_client: Add config option component_client.keepalive_interval (default is one hour: 3600).
Waqas Hussain <waqas20@gmail.com>
parents:
1210
diff
changeset
|
231 |
993
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
232 function connect() |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
233 ------------------------ |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
234 -- Taken from net.http |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
235 local conn = socket.tcp ( ) |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
236 conn:settimeout ( 10 ) |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
237 local ok, err = conn:connect ( server_host , server_port ) |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
238 if not ok and err ~= "timeout" then |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
239 return nil, err; |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
240 end |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
241 |
1222
e3a766045ef6
mod_component_client: Don't read the socket in line mode.
Waqas Hussain <waqas20@gmail.com>
parents:
1220
diff
changeset
|
242 local handler , conn = server.wrapclient ( conn , server_host , server_port , listener , "*a") |
1216
81a3bf8aba90
mod_component_client: Use the net.server connection abstraction for sending whitespace keep-alive, and not the raw socket (fixes a traceback which lead to an infinite timer loop in libevent)
Waqas Hussain <waqas20@gmail.com>
parents:
1214
diff
changeset
|
243 __conn = handler; |
993
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
244 ------------------------ |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
245 return true; |
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
246 end |
1210
be5334e3f6ca
mod_component_client: Fix traceback when connection fails during module load
Waqas Hussain <waqas20@gmail.com>
parents:
1209
diff
changeset
|
247 local s, err = connect(); |
be5334e3f6ca
mod_component_client: Fix traceback when connection fails during module load
Waqas Hussain <waqas20@gmail.com>
parents:
1209
diff
changeset
|
248 if not s then |
be5334e3f6ca
mod_component_client: Fix traceback when connection fails during module load
Waqas Hussain <waqas20@gmail.com>
parents:
1209
diff
changeset
|
249 listener.ondisconnect(nil, err); |
be5334e3f6ca
mod_component_client: Fix traceback when connection fails during module load
Waqas Hussain <waqas20@gmail.com>
parents:
1209
diff
changeset
|
250 end |
993
8b14cdfe0213
mod_component_client: Initial commit. Allows Prosody to act as an external component for other XMPP servers.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
251 |
1218
4c4536481be1
mod_component_client: Do a proper disconnect when the server is shutting down
Waqas Hussain <waqas20@gmail.com>
parents:
1216
diff
changeset
|
252 module:hook_global("server-stopping", function(event) |
4c4536481be1
mod_component_client: Do a proper disconnect when the server is shutting down
Waqas Hussain <waqas20@gmail.com>
parents:
1216
diff
changeset
|
253 local reason = event.reason; |
4c4536481be1
mod_component_client: Do a proper disconnect when the server is shutting down
Waqas Hussain <waqas20@gmail.com>
parents:
1216
diff
changeset
|
254 if session then |
4c4536481be1
mod_component_client: Do a proper disconnect when the server is shutting down
Waqas Hussain <waqas20@gmail.com>
parents:
1216
diff
changeset
|
255 session:close{ condition = "system-shutdown", text = reason }; |
4c4536481be1
mod_component_client: Do a proper disconnect when the server is shutting down
Waqas Hussain <waqas20@gmail.com>
parents:
1216
diff
changeset
|
256 end |
4c4536481be1
mod_component_client: Do a proper disconnect when the server is shutting down
Waqas Hussain <waqas20@gmail.com>
parents:
1216
diff
changeset
|
257 end, 1000); |
4c4536481be1
mod_component_client: Do a proper disconnect when the server is shutting down
Waqas Hussain <waqas20@gmail.com>
parents:
1216
diff
changeset
|
258 |