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.
- data/LICENSE +2 -0
- data/README.rdoc +100 -0
- data/Rakefile +110 -0
- data/examples/drb_client.rb +5 -0
- data/examples/echo.rb +18 -0
- data/ext/extconf.rb +65 -0
- data/ext/push_parser.c +231 -0
- data/lib/blather/client.rb +219 -44
- data/lib/blather/{core/sugar.rb → core_ext/active_support.rb} +25 -13
- data/lib/blather/core_ext/libxml.rb +28 -0
- data/lib/blather/errors/sasl_error.rb +87 -0
- data/lib/blather/errors/stanza_error.rb +262 -0
- data/lib/blather/errors/stream_error.rb +253 -0
- data/lib/blather/errors.rb +48 -0
- data/lib/blather/{core/jid.rb → jid.rb} +15 -26
- data/lib/blather/{core/roster.rb → roster.rb} +22 -0
- data/lib/blather/{core/roster_item.rb → roster_item.rb} +39 -8
- data/lib/blather/stanza/iq/disco.rb +11 -0
- data/lib/blather/stanza/iq/discos/disco_info.rb +86 -0
- data/lib/blather/stanza/iq/discos/disco_items.rb +61 -0
- data/lib/blather/stanza/iq/query.rb +51 -0
- data/lib/blather/stanza/iq/roster.rb +90 -0
- data/lib/blather/stanza/iq.rb +38 -0
- data/lib/blather/stanza/message.rb +58 -0
- data/lib/blather/stanza/presence/status.rb +78 -0
- data/lib/blather/stanza/presence/subscription.rb +72 -0
- data/lib/blather/stanza/presence.rb +45 -0
- data/lib/blather/stanza.rb +101 -0
- data/lib/blather/stream/client.rb +26 -0
- data/lib/blather/stream/component.rb +34 -0
- data/lib/blather/stream/parser.rb +70 -0
- data/lib/blather/stream/resource.rb +48 -0
- data/lib/blather/stream/sasl.rb +173 -0
- data/lib/blather/stream/session.rb +36 -0
- data/lib/blather/stream/stream_handler.rb +39 -0
- data/lib/blather/stream/tls.rb +33 -0
- data/lib/blather/stream.rb +249 -0
- data/lib/blather/xmpp_node.rb +199 -0
- data/lib/blather.rb +40 -41
- data/spec/blather/core_ext/libxml_spec.rb +58 -0
- data/spec/blather/errors/sasl_error_spec.rb +56 -0
- data/spec/blather/errors/stanza_error_spec.rb +148 -0
- data/spec/blather/errors/stream_error_spec.rb +114 -0
- data/spec/blather/errors_spec.rb +40 -0
- data/spec/blather/{core/jid_spec.rb → jid_spec.rb} +9 -1
- data/spec/blather/{core/roster_item_spec.rb → roster_item_spec.rb} +6 -1
- data/spec/blather/{core/roster_spec.rb → roster_spec.rb} +16 -6
- data/spec/blather/stanza/iq/discos/disco_info_spec.rb +207 -0
- data/spec/blather/stanza/iq/discos/disco_items_spec.rb +136 -0
- data/spec/blather/stanza/iq/query_spec.rb +34 -0
- data/spec/blather/stanza/iq/roster_spec.rb +123 -0
- data/spec/blather/stanza/iq_spec.rb +40 -0
- data/spec/blather/stanza/message_spec.rb +52 -0
- data/spec/blather/stanza/presence/status_spec.rb +102 -0
- data/spec/blather/stanza/presence/subscription_spec.rb +85 -0
- data/spec/blather/stanza/presence_spec.rb +53 -0
- data/spec/blather/{core/stanza_spec.rb → stanza_spec.rb} +14 -2
- data/spec/blather/stream/client_spec.rb +787 -0
- data/spec/blather/stream/component_spec.rb +86 -0
- data/spec/blather/{core/xmpp_node_spec.rb → xmpp_node_spec.rb} +76 -23
- data/spec/build_safe.rb +20 -0
- data/spec/spec_helper.rb +7 -17
- metadata +79 -59
- data/CHANGELOG +0 -1
- data/blather.gemspec +0 -73
- data/lib/blather/callback.rb +0 -24
- data/lib/blather/core/errors.rb +0 -24
- data/lib/blather/core/stanza.rb +0 -90
- data/lib/blather/core/stream.rb +0 -179
- data/lib/blather/core/xmpp_node.rb +0 -95
- data/lib/blather/extensions/last_activity.rb +0 -57
- data/lib/blather/extensions/version.rb +0 -85
- 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
|