agent_xmpp 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (73) hide show
  1. data/.document +5 -0
  2. data/.gitignore +11 -0
  3. data/LICENSE +20 -0
  4. data/README.rdoc +417 -0
  5. data/Rakefile +75 -0
  6. data/VERSION +1 -0
  7. data/agent_xmpp.gemspec +144 -0
  8. data/lib/agent_xmpp.rb +22 -0
  9. data/lib/agent_xmpp/admin.rb +113 -0
  10. data/lib/agent_xmpp/client.rb +7 -0
  11. data/lib/agent_xmpp/client/boot.rb +83 -0
  12. data/lib/agent_xmpp/client/client.rb +64 -0
  13. data/lib/agent_xmpp/client/connection.rb +108 -0
  14. data/lib/agent_xmpp/client/controller.rb +394 -0
  15. data/lib/agent_xmpp/client/message_delegate.rb +720 -0
  16. data/lib/agent_xmpp/client/message_pipe.rb +193 -0
  17. data/lib/agent_xmpp/client/response.rb +102 -0
  18. data/lib/agent_xmpp/config.rb +48 -0
  19. data/lib/agent_xmpp/main.rb +175 -0
  20. data/lib/agent_xmpp/models.rb +7 -0
  21. data/lib/agent_xmpp/models/contact.rb +85 -0
  22. data/lib/agent_xmpp/models/message.rb +152 -0
  23. data/lib/agent_xmpp/models/publication.rb +53 -0
  24. data/lib/agent_xmpp/models/roster.rb +107 -0
  25. data/lib/agent_xmpp/models/service.rb +91 -0
  26. data/lib/agent_xmpp/models/subscription.rb +61 -0
  27. data/lib/agent_xmpp/models/table_definitions.rb +107 -0
  28. data/lib/agent_xmpp/patches.rb +7 -0
  29. data/lib/agent_xmpp/patches/array.rb +32 -0
  30. data/lib/agent_xmpp/patches/float.rb +10 -0
  31. data/lib/agent_xmpp/patches/hash.rb +13 -0
  32. data/lib/agent_xmpp/patches/object.rb +15 -0
  33. data/lib/agent_xmpp/patches/rexml.rb +69 -0
  34. data/lib/agent_xmpp/patches/string.rb +15 -0
  35. data/lib/agent_xmpp/xmpp.rb +18 -0
  36. data/lib/agent_xmpp/xmpp/element.rb +158 -0
  37. data/lib/agent_xmpp/xmpp/entry.rb +36 -0
  38. data/lib/agent_xmpp/xmpp/error_response.rb +189 -0
  39. data/lib/agent_xmpp/xmpp/iq.rb +90 -0
  40. data/lib/agent_xmpp/xmpp/iq_command.rb +54 -0
  41. data/lib/agent_xmpp/xmpp/iq_disco.rb +206 -0
  42. data/lib/agent_xmpp/xmpp/iq_pubsub.rb +270 -0
  43. data/lib/agent_xmpp/xmpp/iq_roster.rb +183 -0
  44. data/lib/agent_xmpp/xmpp/iq_version.rb +89 -0
  45. data/lib/agent_xmpp/xmpp/jid.rb +150 -0
  46. data/lib/agent_xmpp/xmpp/message.rb +82 -0
  47. data/lib/agent_xmpp/xmpp/presence.rb +127 -0
  48. data/lib/agent_xmpp/xmpp/sasl.rb +241 -0
  49. data/lib/agent_xmpp/xmpp/stanza.rb +107 -0
  50. data/lib/agent_xmpp/xmpp/x_data.rb +357 -0
  51. data/test/app/app.rb +339 -0
  52. data/test/cases/test_application_message_processing.rb +65 -0
  53. data/test/cases/test_errors.rb +24 -0
  54. data/test/cases/test_presence_management.rb +139 -0
  55. data/test/cases/test_roster_management.rb +214 -0
  56. data/test/cases/test_service_discovery.rb +168 -0
  57. data/test/cases/test_session_management.rb +120 -0
  58. data/test/cases/test_version_discovery.rb +67 -0
  59. data/test/helpers/matchers.rb +23 -0
  60. data/test/helpers/mocks.rb +82 -0
  61. data/test/helpers/test_case_extensions.rb +45 -0
  62. data/test/helpers/test_client.rb +44 -0
  63. data/test/helpers/test_delegate.rb +60 -0
  64. data/test/helpers/test_helper.rb +91 -0
  65. data/test/messages/application_messages.rb +206 -0
  66. data/test/messages/error_messages.rb +35 -0
  67. data/test/messages/presence_messages.rb +66 -0
  68. data/test/messages/roster_messages.rb +126 -0
  69. data/test/messages/service_discovery_messages.rb +201 -0
  70. data/test/messages/session_messages.rb +158 -0
  71. data/test/messages/version_discovery_messages.rb +69 -0
  72. data/test/peer/peer.rb +21 -0
  73. metadata +187 -0
@@ -0,0 +1,35 @@
1
+ ##############################################################################################################
2
+ module ErrorMessages
3
+
4
+ #####-------------------------------------------------------------------------------------------------------
5
+ class << self
6
+
7
+ #### received messages
8
+ #.........................................................................................................
9
+ def recv_iq_error(client, from)
10
+ <<-MSG
11
+ <iq from='#{from}' to='#{client.client.jid.to_s}' id='1' type='get' xmlns='jabber:client'>
12
+ <query node='http://jabber.org/protocol/nothing' xmlns='http://jabber.org/protocol/nothing'/>
13
+ </iq>
14
+ MSG
15
+ end
16
+
17
+
18
+ #### sent messages
19
+ #.........................................................................................................
20
+ def send_iq_error(client, to)
21
+ <<-MSG
22
+ <iq id='1' to='#{to}' type='error' xmlns='jabber:client'>
23
+ <error code='501' type='cancel'>
24
+ <feature-not-implemented xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/>
25
+ <text xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'>feature not implemented</text>
26
+ </error>
27
+ </iq>
28
+ MSG
29
+ end
30
+
31
+ ## self
32
+ end
33
+
34
+ #### VersionDiscoveryMessages
35
+ end
@@ -0,0 +1,66 @@
1
+ ##############################################################################################################
2
+ module PresenceMessages
3
+
4
+ #####-------------------------------------------------------------------------------------------------------
5
+ class << self
6
+
7
+ #### received messages
8
+ #.........................................................................................................
9
+ def recv_presence_self(client)
10
+ <<-MSG
11
+ <presence from='#{client.client.jid.to_s}' to='#{client.client.jid.to_s}' xmlns='jabber:client'>
12
+ <priority>1</priority>
13
+ </presence>
14
+ MSG
15
+ end
16
+
17
+ #.........................................................................................................
18
+ def recv_presence_available(client, from)
19
+ <<-MSG
20
+ <presence from='#{from}' to='#{client.client.jid.to_s}' xmlns='jabber:client'>
21
+ <priority>1</priority>
22
+ </presence>
23
+ MSG
24
+ end
25
+
26
+ #.........................................................................................................
27
+ def recv_presence_unavailable(client, from)
28
+ "<presence from='#{from}' to='#{client.client.jid.to_s}' type='unavailable' xmlns='jabber:client'/>"
29
+ end
30
+
31
+ #.........................................................................................................
32
+ def recv_presence_subscribe(client, from)
33
+ "<presence from='#{from}' to='#{client.client.jid.to_s}' type='subscribe' xmlns='jabber:client'/>"
34
+ end
35
+
36
+ #.........................................................................................................
37
+ def recv_presence_subscribed(client, from)
38
+ "<presence from='#{from}' to='#{client.client.jid.to_s}' type='subscribed' xmlns='jabber:client'/>"
39
+ end
40
+
41
+ #.........................................................................................................
42
+ def recv_presence_unsubscribed(client, from)
43
+ "<presence from='#{from}' to='#{client.client.jid.to_s}' type='unsubscribed' xmlns='jabber:client'/>"
44
+ end
45
+
46
+ #### sent messages
47
+ #.........................................................................................................
48
+ def send_presence_subscribe(client, to)
49
+ "<presence to='#{to}' type='subscribe' xmlns='jabber:client'/>"
50
+ end
51
+
52
+ #.........................................................................................................
53
+ def send_presence_subscribed(client, to)
54
+ "<presence to='#{to}' type='subscribed' xmlns='jabber:client'/>"
55
+ end
56
+
57
+ #.........................................................................................................
58
+ def send_presence_unsubscribed(client, to)
59
+ "<presence to='#{to}' type='unsubscribed' xmlns='jabber:client'/>"
60
+ end
61
+
62
+ ## self
63
+ end
64
+
65
+ #### PresenceMessages
66
+ end
@@ -0,0 +1,126 @@
1
+ ##############################################################################################################
2
+ module RosterMessages
3
+
4
+ #####-------------------------------------------------------------------------------------------------------
5
+ class << self
6
+
7
+ #### received messages
8
+ #.........................................................................................................
9
+ def recv_iq_result_query_roster(client, roster_jids)
10
+ subscriptions = roster_jids.inject("") {|s, r| s += "<item subscription='both' jid='#{r}'/>"}
11
+ <<-MSG
12
+ <iq from='#{client.client.jid.to_s}' to='#{client.client.jid.to_s}' id='1' type='result' xmlns='jabber:client'>
13
+ <query xmlns='jabber:iq:roster'>
14
+ #{subscriptions}
15
+ </query>
16
+ </iq>
17
+ MSG
18
+ end
19
+
20
+ #.........................................................................................................
21
+ def recv_iq_result_query_roster_ack(client)
22
+ "<iq from='#{client.client.jid.to_s}' to='#{client.client.jid.to_s}' id='1' type='result' xmlns='jabber:client'/>"
23
+ end
24
+
25
+ #.........................................................................................................
26
+ def recv_error_query_roster_add(client)
27
+ "<iq from='#{client.client.jid.to_s}' to='#{client.client.jid.to_s}' id='1' type='error' xmlns='jabber:client'/>"
28
+ end
29
+
30
+ #.........................................................................................................
31
+ def recv_error_query_roster_remove(client)
32
+ "<iq from='#{client.client.jid.to_s}' to='#{client.client.jid.to_s}' id='1' type='error' xmlns='jabber:client'/>"
33
+ end
34
+
35
+ #.........................................................................................................
36
+ def recv_iq_set_query_roster_none(client, roster_jid)
37
+ <<-MSG
38
+ <iq from='#{client.client.jid.to_s}' to='#{client.client.jid.to_s}' id='1' type='set' xmlns='jabber:client'>
39
+ <query xmlns='jabber:iq:roster'>
40
+ <item subscription='none' jid='#{roster_jid}'/>
41
+ </query>
42
+ </iq>
43
+ MSG
44
+ end
45
+
46
+ #.........................................................................................................
47
+ def recv_iq_set_query_roster_none_subscribe(client, roster_jid)
48
+ <<-MSG
49
+ <iq from='#{client.client.jid.to_s}' to='#{client.client.jid.to_s}' id='1' type='set' xmlns='jabber:client'>
50
+ <query xmlns='jabber:iq:roster'>
51
+ <item ask='subscribe' subscription='none' jid='#{roster_jid}'/>
52
+ </query>
53
+ </iq>
54
+ MSG
55
+ end
56
+
57
+ #.........................................................................................................
58
+ def recv_iq_set_query_roster_to(client, roster_jid)
59
+ <<-MSG
60
+ <iq from='#{client.client.jid.to_s}' to='#{client.client.jid.to_s}' id='1' type='set' xmlns='jabber:client'>
61
+ <query xmlns='jabber:iq:roster'>
62
+ <item subscription='to' jid='#{roster_jid}'/>
63
+ </query>
64
+ </iq>
65
+ MSG
66
+ end
67
+
68
+ #.........................................................................................................
69
+ def recv_iq_set_query_roster_both(client, roster_jid)
70
+ <<-MSG
71
+ <iq from='#{client.client.jid.to_s}' to='#{client.client.jid.to_s}' id='1' type='set' xmlns='jabber:client'>
72
+ <query xmlns='jabber:iq:roster'>
73
+ <item subscription='both' jid='#{roster_jid}'/>
74
+ </query>
75
+ </iq>
76
+ MSG
77
+ end
78
+
79
+ #.........................................................................................................
80
+ def recv_iq_set_query_roster_remove(client, roster_jid)
81
+ <<-MSG
82
+ <iq from='#{client.client.jid.to_s}' to='#{client.client.jid.to_s}' id='1' type='set' xmlns='jabber:client'>
83
+ <query xmlns='jabber:iq:roster'>
84
+ <item jid='#{roster_jid}' subscription='remove'/>
85
+ </query>
86
+ </iq>
87
+ MSG
88
+ end
89
+
90
+ #### sent messages
91
+ #.........................................................................................................
92
+ def send_iq_get_query_roster(client)
93
+ <<-MSG
94
+ <iq id='3' type='get' xmlns='jabber:client'>
95
+ <query xmlns='jabber:iq:roster'/>
96
+ </iq>
97
+ MSG
98
+ end
99
+
100
+ #.........................................................................................................
101
+ def send_iq_set_query_roster(client, roster_jid)
102
+ <<-MSG
103
+ <iq id='5' type='set' xmlns='jabber:client'>
104
+ <query xmlns='jabber:iq:roster'>
105
+ <item jid='#{roster_jid}'/>
106
+ </query>
107
+ </iq>
108
+ MSG
109
+ end
110
+
111
+ #.........................................................................................................
112
+ def send_iq_set_query_roster_remove(client, roster_jid)
113
+ <<-MSG
114
+ <iq id='5' type='set' xmlns='jabber:client'>
115
+ <query xmlns='jabber:iq:roster'>
116
+ <item jid='#{roster_jid}' subscription='remove'/>
117
+ </query>
118
+ </iq>
119
+ MSG
120
+ end
121
+
122
+ ## self
123
+ end
124
+
125
+ #### RosterMessages
126
+ end
@@ -0,0 +1,201 @@
1
+ ##############################################################################################################
2
+ module ServiceDiscoveryMessages
3
+
4
+ #####-------------------------------------------------------------------------------------------------------
5
+ class << self
6
+
7
+ #### received messages
8
+ #.........................................................................................................
9
+ def recv_iq_get_query_discoinfo(client, from)
10
+ <<-MSG
11
+ <iq from='#{from}' to='#{client.client.jid.to_s}' id='1' type='get' xmlns='jabber:client'>
12
+ <query xmlns='http://jabber.org/protocol/disco#info'/>
13
+ </iq>
14
+ MSG
15
+ end
16
+
17
+ #.........................................................................................................
18
+ def recv_iq_get_query_discoinfo_error(client, from)
19
+ <<-MSG
20
+ <iq from='#{from}' to='#{client.client.jid.to_s}' id='1' type='get' xmlns='jabber:client'>
21
+ <query node='http://jabber.org/protocol/nothing' xmlns='http://jabber.org/protocol/disco#info'/>
22
+ </iq>
23
+ MSG
24
+ end
25
+
26
+
27
+ #.........................................................................................................
28
+ def recv_iq_get_query_discoitems(client, from)
29
+ <<-MSG
30
+ <iq from='#{from}' to='#{client.client.jid.to_s}' id='1' type='get' xmlns='jabber:client'>
31
+ <query xmlns='http://jabber.org/protocol/disco#items'/>
32
+ </iq>
33
+ MSG
34
+ end
35
+
36
+ #.........................................................................................................
37
+ def recv_iq_get_query_discoitems_for_commands_node(client, from)
38
+ <<-MSG
39
+ <iq from='#{from}' to='#{client.client.jid.to_s}' id='1' type='get' xmlns='jabber:client'>
40
+ <query node='http://jabber.org/protocol/commands' xmlns='http://jabber.org/protocol/disco#items'/>
41
+ </iq>
42
+ MSG
43
+ end
44
+
45
+ #.........................................................................................................
46
+ def recv_iq_get_query_discoitems_error(client, from)
47
+ <<-MSG
48
+ <iq from='#{from}' to='#{client.client.jid.to_s}' id='1' type='get' xmlns='jabber:client'>
49
+ <query node='http://jabber.org/protocol/nothing' xmlns='http://jabber.org/protocol/disco#items'/>
50
+ </iq>
51
+ MSG
52
+ end
53
+
54
+ #.........................................................................................................
55
+ def recv_iq_result_query_discoinfo(client, from)
56
+ <<-MSG
57
+ <iq from='#{from}' to='#{client.client.jid.to_s}' id='2' type='result' xmlns='jabber:client'>
58
+ <query xmlns='http://jabber.org/protocol/disco#info'>
59
+ <identity name='Gajim' category='client' type='pc'/>
60
+ <feature var='http://jabber.org/protocol/bytestreams'/>
61
+ <feature var='http://jabber.org/protocol/si'/>
62
+ <feature var='http://jabber.org/protocol/si/profile/file-transfer'/>
63
+ <feature var='http://jabber.org/protocol/muc'/>
64
+ <feature var='http://jabber.org/protocol/commands'/>
65
+ <feature var='http://jabber.org/protocol/disco#info'/>
66
+ <feature var='http://jabber.org/protocol/chatstates'/>
67
+ <feature var='http://jabber.org/protocol/xhtml-im'/>
68
+ <feature var='urn:xmpp:time'/>
69
+ </query>
70
+ </iq>
71
+ MSG
72
+ end
73
+
74
+ #.........................................................................................................
75
+ def recv_iq_error_query_discoinfo(client, from)
76
+ <<-MSG
77
+ <iq from='#{from}' to='#{client.client.jid.to_s}' id='2' type='error' xmlns='jabber:client'>
78
+ <query xmlns='http://jabber.org/protocol/disco#info'/>
79
+ <error code='503' type='cancel'>
80
+ <service-unavailable xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/>
81
+ </error>
82
+ </iq>
83
+ MSG
84
+ end
85
+
86
+ #.........................................................................................................
87
+ def recv_iq_result_query_discoitems(client, from)
88
+ <<-MSG
89
+ <iq from='#{from}' to='#{client.client.jid.to_s}' id='1' type='result' xmlns='jabber:client'>
90
+ <query xmlns='http://jabber.org/protocol/disco#items'>
91
+ <item jid='conference.plan-b.ath.cx'/>
92
+ <item jid='irc.plan-b.ath.cx'/>
93
+ <item jid='proxy.plan-b.ath.cx'/>
94
+ <item jid='pubsub.plan-b.ath.cx'/>
95
+ <item jid='vjud.plan-b.ath.cx'/>
96
+ </query>
97
+ </iq>
98
+ MSG
99
+ end
100
+
101
+ #.........................................................................................................
102
+ def recv_iq_error_query_discoitems(client, from)
103
+ <<-MSG
104
+ <iq from='#{from}' to='#{client.client.jid.to_s}' id='1' type='error' xmlns='jabber:client'>
105
+ <query xmlns='http://jabber.org/protocol/disco#items'/>
106
+ <error code='503' type='cancel'>
107
+ <service-unavailable xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/>
108
+ </error>
109
+ </iq>
110
+ MSG
111
+ end
112
+
113
+ #### sent messages
114
+ #.........................................................................................................
115
+ def send_iq_get_query_discoinfo(client, to)
116
+ <<-MSG
117
+ <iq id='2' to='#{to}' type='get' xmlns='jabber:client'>
118
+ <query xmlns='http://jabber.org/protocol/disco#info'/>
119
+ </iq>
120
+ MSG
121
+ end
122
+
123
+ #.........................................................................................................
124
+ def send_iq_result_query_discoinfo(client, to)
125
+ <<-MSG
126
+ <iq id='1' to='#{to}' type='result' xmlns='jabber:client'>
127
+ <query xmlns='http://jabber.org/protocol/disco#info'>
128
+ <identity name='AgentXMPP' category='client' type='bot'/>
129
+ <feature var='http://jabber.org/protocol/disco#info'/>
130
+ <feature var='http://jabber.org/protocol/disco#items'/>
131
+ <feature var='jabber:iq:version'/><feature var='jabber:x:data'/>
132
+ <feature var='http://jabber.org/protocol/commands'/>
133
+ <feature var='http://jabber.org/protocol/muc'/>
134
+ </query>
135
+ </iq>
136
+ MSG
137
+ end
138
+
139
+ #.........................................................................................................
140
+ def send_iq_error_discoinfo_service_unavailable(client, to)
141
+ <<-MSG
142
+ <iq id='1' to='#{to}' type='error' xmlns='jabber:client'>
143
+ <query node='http://jabber.org/protocol/nothing' xmlns='http://jabber.org/protocol/disco#info'/>
144
+ <error code='503' type='cancel'><service-unavailable xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/>
145
+ <text xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'>service unavailable</text>
146
+ </error>
147
+ </iq>
148
+ MSG
149
+ end
150
+
151
+ #.........................................................................................................
152
+ def send_iq_get_query_discoitems(client, to)
153
+ <<-MSG
154
+ <iq id='1' to='#{to}' type='get' xmlns='jabber:client'>
155
+ <query xmlns='http://jabber.org/protocol/disco#items'/>
156
+ </iq>
157
+ MSG
158
+ end
159
+
160
+ #.........................................................................................................
161
+ def send_iq_result_query_discoitems(client, to)
162
+ <<-MSG
163
+ <iq id='1' to='#{to}' type='result' xmlns='jabber:client'>
164
+ <query xmlns='http://jabber.org/protocol/disco#items'/>
165
+ </iq>
166
+ MSG
167
+ end
168
+
169
+ #.........................................................................................................
170
+ def send_iq_error_discoitems_item_not_found(client, to)
171
+ <<-MSG
172
+ <iq id='1' to='#{to}' type='error' xmlns='jabber:client'>
173
+ <query node='http://jabber.org/protocol/nothing' xmlns='http://jabber.org/protocol/disco#items'/>
174
+ <error code='404' type='cancel'><item-not-found xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/>
175
+ <text xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'>item not found</text>
176
+ </error>
177
+ </iq>
178
+ MSG
179
+ end
180
+
181
+ #.........................................................................................................
182
+ def send_iq_result_query_discoitems_for_commands_node(client, to)
183
+ <<-MSG
184
+ <iq id='1' to='#{to}' type='result' xmlns='jabber:client'>
185
+ <query node='http://jabber.org/protocol/commands' xmlns='http://jabber.org/protocol/disco#items'>
186
+ <item name='scalar' node='scalar' jid='#{client.client.jid.to_s}'/>
187
+ <item name='hash' node='hash' jid='#{client.client.jid.to_s}'/>
188
+ <item name='scalar array' node='scalar_array' jid='#{client.client.jid.to_s}'/>
189
+ <item name='hash array' node='hash_array' jid='#{client.client.jid.to_s}'/>
190
+ <item name='array hash' node='array_hash' jid='#{client.client.jid.to_s}'/>
191
+ <item name='array hash array' node='array_hash_array' jid='#{client.client.jid.to_s}'/>
192
+ </query>
193
+ </iq>
194
+ MSG
195
+ end
196
+
197
+ ## self
198
+ end
199
+
200
+ #### ServiceDiscoveryMessages
201
+ end
@@ -0,0 +1,158 @@
1
+ ##############################################################################################################
2
+ module SessionMessages
3
+
4
+ #####-------------------------------------------------------------------------------------------------------
5
+ class << self
6
+
7
+ #### received messages
8
+ #.........................................................................................................
9
+ def recv_preauthentication_stream_features_with_plain_SASL(client)
10
+ <<-MSG
11
+ <stream:stream xmlns='jabber:client' xmlns:stream='http://etherx.jabber.org/streams' id='1' from='#{client.client.jid.domain}' version='1.0' xml:lang='en'>
12
+ <stream:features>
13
+ <mechanisms xmlns='urn:ietf:params:xml:ns:xmpp-sasl'>
14
+ <mechanism>DIGEST-MD5</mechanism>
15
+ <mechanism>PLAIN</mechanism>
16
+ </mechanisms>
17
+ <register xmlns='http://jabber.org/features/iq-register'/>
18
+ </stream:features>
19
+ </stream:stream>
20
+ MSG
21
+ end
22
+
23
+ #.........................................................................................................
24
+ def recv_preauthentication_stream_features_without_plain_SASL(client)
25
+ <<-MSG
26
+ <stream:stream xmlns='jabber:client' xmlns:stream='http://etherx.jabber.org/streams' id='1' from='#{client.client.jid.domain}' version='1.0' xml:lang='en'>
27
+ <stream:features>
28
+ <mechanisms xmlns='urn:ietf:params:xml:ns:xmpp-sasl'>
29
+ <mechanism>DIGEST-MD5</mechanism>
30
+ </mechanisms>
31
+ <register xmlns='http://jabber.org/features/iq-register'/>
32
+ </stream:features>
33
+ </stream:stream>
34
+ MSG
35
+ end
36
+
37
+ #.........................................................................................................
38
+ def recv_auth_success(client)
39
+ "<success xmlns='urn:ietf:params:xml:ns:xmpp-sasl'/>"
40
+ end
41
+
42
+ #.........................................................................................................
43
+ def recv_auth_failure(client)
44
+ <<-MSG
45
+ <failure xmlns='urn:ietf:params:xml:ns:xmpp-sasl'>
46
+ <not-authorized/>
47
+ </failure>
48
+ MSG
49
+ end
50
+
51
+ #.........................................................................................................
52
+ def recv_postauthentication_stream_features(client)
53
+ <<-MSG
54
+ <stream:stream xmlns='jabber:client' xmlns:stream='http://etherx.jabber.org/streams' id='1' from='#{client.client.jid.domain}' version='1.0' xml:lang='en'>
55
+ <stream:features>
56
+ <bind xmlns='urn:ietf:params:xml:ns:xmpp-bind'/>
57
+ <session xmlns='urn:ietf:params:xml:ns:xmpp-session'/>
58
+ </stream:features>
59
+ </stream:stream>
60
+ MSG
61
+ end
62
+
63
+ #.........................................................................................................
64
+ def recv_iq_result_bind(client)
65
+ <<-MSG
66
+ <iq id='1' type='result' xmlns='jabber:client'>
67
+ <bind xmlns='urn:ietf:params:xml:ns:xmpp-bind'>
68
+ <jid>#{client.client.jid.to_s}</jid>
69
+ </bind>
70
+ </iq>
71
+ MSG
72
+ end
73
+
74
+ #.........................................................................................................
75
+ def recv_iq_result_session(client)
76
+ <<-MSG
77
+ <iq type='result' id='1' xmlns='jabber:client'>
78
+ <session xmlns='urn:ietf:params:xml:ns:xmpp-session'/>
79
+ </iq>
80
+ MSG
81
+ end
82
+
83
+ #.........................................................................................................
84
+ def recv_error_bind(client)
85
+ <<-MSG
86
+ <iq type='error' id='1' xmlns='jabber:client'>
87
+ <bind xmlns='urn:ietf:params:xml:ns:xmpp-bind'>
88
+ <resource>someresource</resource>
89
+ </bind>
90
+ <error type='cancel'>
91
+ <not-allowed xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/>
92
+ </error>
93
+ </iq>
94
+ MSG
95
+ end
96
+
97
+ #.........................................................................................................
98
+ def recv_error_session(client)
99
+ <<-MSG
100
+ <iq from='#{client.client.jid.domain}' type='error' id='1' xmlns='jabber:client'>
101
+ <session xmlns='urn:ietf:params:xml:ns:xmpp-session'/>
102
+ <error type='wait'>
103
+ <internal-server-error xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/>
104
+ </error>
105
+ </iq>
106
+ MSG
107
+ end
108
+
109
+ #### sent messages
110
+ #.........................................................................................................
111
+ def send_supported_xml_version(client)
112
+ "<?xml version='1.0' ?>"
113
+ end
114
+
115
+ #.........................................................................................................
116
+ def send_stream(client)
117
+ "<stream:stream xmlns='jabber:client' xmlns:stream='http://etherx.jabber.org/streams' version='1.0' to='plan-b.ath.cx'>"
118
+ end
119
+
120
+ #.........................................................................................................
121
+ def send_auth_plain(client)
122
+ "<auth mechanism='PLAIN' xmlns='urn:ietf:params:xml:ns:xmpp-sasl'>"
123
+ end
124
+
125
+ #.........................................................................................................
126
+ def send_iq_set_bind(client)
127
+ <<-MSG
128
+ <iq id='1' type='set' xmlns='jabber:client'>
129
+ <bind xmlns='urn:ietf:params:xml:ns:xmpp-bind'>
130
+ <resource>#{client.client.jid.resource}</resource>
131
+ </bind>
132
+ </iq>
133
+ MSG
134
+ end
135
+
136
+ #.........................................................................................................
137
+ def send_iq_set_session(client)
138
+ <<-MSG
139
+ <iq id='1' type='set' xmlns='jabber:client'>
140
+ <session xmlns='urn:ietf:params:xml:ns:xmpp-session'/>
141
+ </iq>
142
+ MSG
143
+ end
144
+
145
+ #.........................................................................................................
146
+ def send_presence_init(client)
147
+ <<-MSG
148
+ <presence xmlns='jabber:client'>
149
+ <priority>1</priority>
150
+ </presence>
151
+ MSG
152
+ end
153
+
154
+ ## self
155
+ end
156
+
157
+ #### SessionMessages
158
+ end