sprsquish-blather 0.1 → 0.2.3

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/LICENSE +2 -0
  2. data/README.rdoc +100 -0
  3. data/Rakefile +110 -0
  4. data/examples/drb_client.rb +5 -0
  5. data/examples/echo.rb +18 -0
  6. data/ext/extconf.rb +65 -0
  7. data/ext/push_parser.c +231 -0
  8. data/lib/blather/client.rb +219 -44
  9. data/lib/blather/{core/sugar.rb → core_ext/active_support.rb} +25 -13
  10. data/lib/blather/core_ext/libxml.rb +28 -0
  11. data/lib/blather/errors/sasl_error.rb +87 -0
  12. data/lib/blather/errors/stanza_error.rb +262 -0
  13. data/lib/blather/errors/stream_error.rb +253 -0
  14. data/lib/blather/errors.rb +48 -0
  15. data/lib/blather/{core/jid.rb → jid.rb} +15 -26
  16. data/lib/blather/{core/roster.rb → roster.rb} +22 -0
  17. data/lib/blather/{core/roster_item.rb → roster_item.rb} +39 -8
  18. data/lib/blather/stanza/iq/disco.rb +11 -0
  19. data/lib/blather/stanza/iq/discos/disco_info.rb +86 -0
  20. data/lib/blather/stanza/iq/discos/disco_items.rb +61 -0
  21. data/lib/blather/stanza/iq/query.rb +51 -0
  22. data/lib/blather/stanza/iq/roster.rb +90 -0
  23. data/lib/blather/stanza/iq.rb +38 -0
  24. data/lib/blather/stanza/message.rb +58 -0
  25. data/lib/blather/stanza/presence/status.rb +78 -0
  26. data/lib/blather/stanza/presence/subscription.rb +72 -0
  27. data/lib/blather/stanza/presence.rb +45 -0
  28. data/lib/blather/stanza.rb +101 -0
  29. data/lib/blather/stream/client.rb +26 -0
  30. data/lib/blather/stream/component.rb +34 -0
  31. data/lib/blather/stream/parser.rb +70 -0
  32. data/lib/blather/stream/resource.rb +48 -0
  33. data/lib/blather/stream/sasl.rb +173 -0
  34. data/lib/blather/stream/session.rb +36 -0
  35. data/lib/blather/stream/stream_handler.rb +39 -0
  36. data/lib/blather/stream/tls.rb +33 -0
  37. data/lib/blather/stream.rb +249 -0
  38. data/lib/blather/xmpp_node.rb +199 -0
  39. data/lib/blather.rb +40 -41
  40. data/spec/blather/core_ext/libxml_spec.rb +58 -0
  41. data/spec/blather/errors/sasl_error_spec.rb +56 -0
  42. data/spec/blather/errors/stanza_error_spec.rb +148 -0
  43. data/spec/blather/errors/stream_error_spec.rb +114 -0
  44. data/spec/blather/errors_spec.rb +40 -0
  45. data/spec/blather/{core/jid_spec.rb → jid_spec.rb} +9 -1
  46. data/spec/blather/{core/roster_item_spec.rb → roster_item_spec.rb} +6 -1
  47. data/spec/blather/{core/roster_spec.rb → roster_spec.rb} +16 -6
  48. data/spec/blather/stanza/iq/discos/disco_info_spec.rb +207 -0
  49. data/spec/blather/stanza/iq/discos/disco_items_spec.rb +136 -0
  50. data/spec/blather/stanza/iq/query_spec.rb +34 -0
  51. data/spec/blather/stanza/iq/roster_spec.rb +123 -0
  52. data/spec/blather/stanza/iq_spec.rb +40 -0
  53. data/spec/blather/stanza/message_spec.rb +52 -0
  54. data/spec/blather/stanza/presence/status_spec.rb +102 -0
  55. data/spec/blather/stanza/presence/subscription_spec.rb +85 -0
  56. data/spec/blather/stanza/presence_spec.rb +53 -0
  57. data/spec/blather/{core/stanza_spec.rb → stanza_spec.rb} +14 -2
  58. data/spec/blather/stream/client_spec.rb +787 -0
  59. data/spec/blather/stream/component_spec.rb +86 -0
  60. data/spec/blather/{core/xmpp_node_spec.rb → xmpp_node_spec.rb} +76 -23
  61. data/spec/build_safe.rb +20 -0
  62. data/spec/spec_helper.rb +7 -17
  63. metadata +79 -59
  64. data/CHANGELOG +0 -1
  65. data/blather.gemspec +0 -73
  66. data/lib/blather/callback.rb +0 -24
  67. data/lib/blather/core/errors.rb +0 -24
  68. data/lib/blather/core/stanza.rb +0 -90
  69. data/lib/blather/core/stream.rb +0 -179
  70. data/lib/blather/core/xmpp_node.rb +0 -95
  71. data/lib/blather/extensions/last_activity.rb +0 -57
  72. data/lib/blather/extensions/version.rb +0 -85
  73. data/spec/blather/core/stream_spec.rb +0 -263
@@ -1,263 +0,0 @@
1
- require File.join(File.dirname(__FILE__), *%w[.. .. spec_helper])
2
-
3
- describe 'Blather::Stream' do
4
- class MockStream; include Stream; end
5
- def mock_stream(&block)
6
- @client = mock()
7
- @client.stubs(:jid=)
8
- stream = MockStream.new @client, JID.new('n@d/r'), 'pass'
9
-
10
- stream.expects(:send_data).at_least(1).with &block
11
- stream
12
- end
13
-
14
- it 'can be started' do
15
- client = mock()
16
- params = [client, 'n@d/r', 'pass', 'host', 1234]
17
- EM.expects(:connect).with do |*parms|
18
- parms[0] == 'host' &&
19
- parms[1] == 1234 &&
20
- parms[3] == client &&
21
- parms[5] == 'pass' &&
22
- parms[4] == JID.new('n@d/r')
23
- end
24
-
25
- Stream.start *(params)
26
- end
27
-
28
- it 'can figure out the host to use based on the jid' do
29
- client = mock()
30
- params = [client, 'n@d/r', 'pass', 'd', 5222]
31
- EM.expects(:connect).with do |*parms|
32
- parms[0] == 'd' &&
33
- parms[1] == 5222 &&
34
- parms[3] == client &&
35
- parms[5] == 'pass' &&
36
- parms[4] == JID.new('n@d/r')
37
- end
38
-
39
- Stream.start client, 'n@d/r', 'pass'
40
- end
41
-
42
- it 'starts the stream once the connection is complete' do
43
- s = mock_stream { |d| d =~ /stream:stream/ }
44
- s.connection_completed
45
- end
46
-
47
- it 'starts TLS when asked' do
48
- state = nil
49
- @stream = mock_stream do |val|
50
- case
51
- when state.nil? && val =~ /stream:stream/ then state = :started
52
- when state == :started && val =~ /starttls/ then true
53
- else false
54
- end
55
- end
56
- @stream.connection_completed
57
- @stream.receive_data "<stream:stream><stream:features><starttls xmlns='urn:ietf:params:xml:ns:xmpp-tls' /></stream:features>"
58
- end
59
-
60
- it 'connects via SASL MD5 when asked' do
61
- Time.any_instance.stubs(:to_f).returns(1.1)
62
-
63
- state = nil
64
- client = mock()
65
- client.stubs(:jid=)
66
- stream = MockStream.new client, JID.new('n@d/r'), 'pass'
67
-
68
- stream.expects(:send_data).times(5).with do |val|
69
- case state
70
- when nil
71
- val.must_match(/stream:stream/)
72
- state = :started
73
- stream.receive_data "<stream:stream><stream:features><mechanisms xmlns='urn:ietf:params:xml:ns:xmpp-sasl'><mechanism>DIGEST-MD5</mechanism></mechanisms></stream:features>"
74
- true
75
-
76
- when :started
77
- val.must_match(/auth.*DIGEST\-MD5/)
78
- state = :auth_sent
79
- stream.receive_data "<challenge xmlns='urn:ietf:params:xml:ns:xmpp-sasl'>cmVhbG09InNvbWVyZWFsbSIsbm9uY2U9Ik9BNk1HOXRFUUdtMmhoIixxb3A9ImF1dGgiLGNoYXJzZXQ9dXRmLTgsYWxnb3JpdGhtPW1kNS1zZXNzCg==</challenge>"
80
- true
81
-
82
- when :auth_sent
83
- val.must_equal('<response xmlns="urn:ietf:params:xml:ns:xmpp-sasl">bm9uY2U9Ik9BNk1HOXRFUUdtMmhoIixjaGFyc2V0PXV0Zi04LHVzZXJuYW1lPSJuIixyZWFsbT0ic29tZXJlYWxtIixjbm9uY2U9Ijc3N2Q0NWJiYmNkZjUwZDQ5YzQyYzcwYWQ3YWNmNWZlIixuYz0wMDAwMDAwMSxxb3A9YXV0aCxkaWdlc3QtdXJpPSJ4bXBwL2Qi</response>')
84
- state = :response1_sent
85
- stream.receive_data "<challenge xmlns='urn:ietf:params:xml:ns:xmpp-sasl'>cnNwYXV0aD1lYTQwZjYwMzM1YzQyN2I1NTI3Yjg0ZGJhYmNkZmZmZAo=</challenge>"
86
- true
87
-
88
- when :response1_sent
89
- val.must_equal('<response xmlns="urn:ietf:params:xml:ns:xmpp-sasl"/>')
90
- state = :response2_sent
91
- stream.receive_data "<success xmlns='urn:ietf:params:xml:ns:xmpp-sasl'/>"
92
- true
93
-
94
- when :response2_sent
95
- val.must_match(/stream:stream/)
96
- state = :complete
97
- true
98
-
99
- else
100
- false
101
-
102
- end
103
- end
104
- stream.connection_completed
105
- end
106
-
107
- it 'will connect via SSL PLAIN when asked' do
108
- state = nil
109
- client = mock()
110
- client.stubs(:jid=)
111
- stream = MockStream.new client, JID.new('n@d/r'), 'pass'
112
-
113
- stream.expects(:send_data).times(3).with do |val|
114
- case state
115
- when nil
116
- val.must_match(/stream:stream/)
117
- state = :started
118
- stream.receive_data "<stream:stream><stream:features><mechanisms xmlns='urn:ietf:params:xml:ns:xmpp-sasl'><mechanism>PLAIN</mechanism></mechanisms></stream:features>"
119
- true
120
-
121
- when :started
122
- val.must_equal('<auth xmlns="urn:ietf:params:xml:ns:xmpp-sasl" mechanism="PLAIN">bkBkAG4AcGFzcw==</auth>')
123
- state = :auth_sent
124
- stream.receive_data "<success xmlns='urn:ietf:params:xml:ns:xmpp-sasl'/>"
125
- true
126
-
127
- when :auth_sent
128
- val.must_match(/stream:stream/)
129
- state = :complete
130
- true
131
-
132
- else
133
- false
134
-
135
- end
136
- end
137
- stream.connection_completed
138
- end
139
-
140
- it 'will connect via SSL ANONYMOUS when asked' do
141
- state = nil
142
- client = mock()
143
- client.stubs(:jid=)
144
- stream = MockStream.new client, JID.new('n@d/r'), 'pass'
145
-
146
- stream.expects(:send_data).times(3).with do |val|
147
- case state
148
- when nil
149
- val.must_match(/stream:stream/)
150
- state = :started
151
- stream.receive_data "<stream:stream><stream:features><mechanisms xmlns='urn:ietf:params:xml:ns:xmpp-sasl'><mechanism>ANONYMOUS</mechanism></mechanisms></stream:features>"
152
- true
153
-
154
- when :started
155
- val.must_equal('<auth xmlns="urn:ietf:params:xml:ns:xmpp-sasl" mechanism="ANONYMOUS">bg==</auth>')
156
- state = :auth_sent
157
- stream.receive_data "<success xmlns='urn:ietf:params:xml:ns:xmpp-sasl'/>"
158
- true
159
-
160
- when :auth_sent
161
- val.must_match(/stream:stream/)
162
- state = :complete
163
- true
164
-
165
- else
166
- false
167
-
168
- end
169
- end
170
- stream.connection_completed
171
- end
172
-
173
- it 'will bind to a resource set by the server' do
174
- state = nil
175
- class Client; attr_accessor :jid; end
176
- client = Client.new
177
-
178
- jid = JID.new('n@d')
179
- stream = MockStream.new client, jid, 'pass'
180
-
181
- stream.expects(:send_data).times(2).with do |val|
182
- case state
183
- when nil
184
- val.must_match(/stream:stream/)
185
- state = :started
186
- stream.receive_data "<stream:stream><stream:features><bind xmlns='urn:ietf:params:xml:ns:xmpp-bind'/></stream:features>"
187
- true
188
-
189
- when :started
190
- val.must_match(%r{<bind xmlns="urn:ietf:params:xml:ns:xmpp-bind"\s*/>})
191
- val =~ %r{<iq[^>]+id="([^"]+)"}
192
- state = :complete
193
- stream.receive_data "<iq type='result' id='#{$1}'><bind xmlns='urn:ietf:params:xml:ns:xmpp-bind'><jid>#{jid}/server_resource</jid></bind></iq>"
194
- client.jid.must_equal JID.new('n@d/server_resource')
195
- true
196
-
197
- else
198
- false
199
-
200
- end
201
- end
202
- stream.connection_completed
203
- end
204
-
205
- it 'will bind to a resource set by the client' do
206
- state = nil
207
- class Client; attr_accessor :jid; end
208
- client = Client.new
209
-
210
- jid = JID.new('n@d/r')
211
- stream = MockStream.new client, jid, 'pass'
212
-
213
- stream.expects(:send_data).times(2).with do |val|
214
- case state
215
- when nil
216
- val.must_match(/stream:stream/)
217
- state = :started
218
- stream.receive_data "<stream:stream><stream:features><bind xmlns='urn:ietf:params:xml:ns:xmpp-bind'/></stream:features>"
219
- true
220
-
221
- when :started
222
- val.must_match(%r{<bind xmlns="urn:ietf:params:xml:ns:xmpp-bind"><resource>r</resource></bind>})
223
- val =~ %r{<iq[^>]+id="([^"]+)"}
224
- state = :complete
225
- stream.receive_data "<iq type='result' id='#{$1}'><bind xmlns='urn:ietf:params:xml:ns:xmpp-bind'><jid>#{jid}</jid></bind></iq>"
226
- client.jid.must_equal JID.new('n@d/r')
227
- true
228
-
229
- else
230
- false
231
-
232
- end
233
- end
234
- stream.connection_completed
235
- end
236
-
237
- it 'will establish a session if requested' do
238
- state = nil
239
- client = mock()
240
- client.stubs(:jid=)
241
- stream = MockStream.new client, JID.new('n@d/r'), 'pass'
242
-
243
- stream.expects(:send_data).times(2).with do |val|
244
- case state
245
- when nil
246
- val.must_match(/stream:stream/)
247
- state = :started
248
- stream.receive_data "<stream:stream><stream:features><session xmlns='urn:ietf:params:xml:ns:xmpp-session'/></stream:features>"
249
- true
250
-
251
- when :started
252
- val.must_match('<iq id="[^"]+" type="set" to="d"><session xmlns="urn:ietf:params:xml:ns:xmpp-session"/></iq>')
253
- state = :completed
254
- true
255
-
256
- else
257
- false
258
-
259
- end
260
- end
261
- stream.connection_completed
262
- end
263
- end