agent_xmpp 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
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