xmpp4r 0.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 (142) hide show
  1. data/COPYING +340 -0
  2. data/ChangeLog +28 -0
  3. data/LICENSE +59 -0
  4. data/README +20 -0
  5. data/Rakefile +103 -0
  6. data/UPDATING +40 -0
  7. data/data/doc/xmpp4r/examples/advanced/adventure/README +57 -0
  8. data/data/doc/xmpp4r/examples/advanced/adventure/adventure.rb +23 -0
  9. data/data/doc/xmpp4r/examples/advanced/adventure/adventuremuc.rb +136 -0
  10. data/data/doc/xmpp4r/examples/advanced/adventure/cube.xml +15 -0
  11. data/data/doc/xmpp4r/examples/advanced/adventure/tower.xml +69 -0
  12. data/data/doc/xmpp4r/examples/advanced/adventure/world.rb +425 -0
  13. data/data/doc/xmpp4r/examples/advanced/fileserve.conf +11 -0
  14. data/data/doc/xmpp4r/examples/advanced/fileserve.rb +344 -0
  15. data/data/doc/xmpp4r/examples/advanced/getonline.rb +56 -0
  16. data/data/doc/xmpp4r/examples/advanced/gtkmucclient.rb +315 -0
  17. data/data/doc/xmpp4r/examples/advanced/migrate.rb +89 -0
  18. data/data/doc/xmpp4r/examples/advanced/minimuc.rb +266 -0
  19. data/data/doc/xmpp4r/examples/advanced/recvfile.rb +83 -0
  20. data/data/doc/xmpp4r/examples/advanced/rosterdiscovery.rb +130 -0
  21. data/data/doc/xmpp4r/examples/advanced/sendfile.conf +10 -0
  22. data/data/doc/xmpp4r/examples/advanced/sendfile.rb +72 -0
  23. data/data/doc/xmpp4r/examples/advanced/shellmgr/shellmgr.rb +51 -0
  24. data/data/doc/xmpp4r/examples/advanced/shellmgr/shellmgr_jabber.rb +43 -0
  25. data/data/doc/xmpp4r/examples/advanced/shellmgr/shellmgr_test.rb +10 -0
  26. data/data/doc/xmpp4r/examples/advanced/versionpoll.rb +90 -0
  27. data/data/doc/xmpp4r/examples/advanced/xmpping.rb +134 -0
  28. data/data/doc/xmpp4r/examples/advanced/xmppingrc.sample +9 -0
  29. data/data/doc/xmpp4r/examples/basic/change_password.rb +41 -0
  30. data/data/doc/xmpp4r/examples/basic/client.rb +68 -0
  31. data/data/doc/xmpp4r/examples/basic/component.rb +11 -0
  32. data/data/doc/xmpp4r/examples/basic/echo_nonthreaded.rb +32 -0
  33. data/data/doc/xmpp4r/examples/basic/echo_threaded.rb +32 -0
  34. data/data/doc/xmpp4r/examples/basic/jabbersend.rb +41 -0
  35. data/data/doc/xmpp4r/examples/basic/mass_sender.rb +67 -0
  36. data/data/doc/xmpp4r/examples/basic/mucinfo.rb +39 -0
  37. data/data/doc/xmpp4r/examples/basic/mucsimplebot.rb +83 -0
  38. data/data/doc/xmpp4r/examples/basic/register.rb +25 -0
  39. data/data/doc/xmpp4r/examples/basic/remove_registration.rb +18 -0
  40. data/data/doc/xmpp4r/examples/basic/roster.rb +42 -0
  41. data/data/doc/xmpp4r/examples/basic/rosterprint.rb +50 -0
  42. data/data/doc/xmpp4r/examples/basic/rosterrename.rb +34 -0
  43. data/data/doc/xmpp4r/examples/basic/rosterwatch.rb +172 -0
  44. data/data/doc/xmpp4r/examples/basic/send_vcard.rb +68 -0
  45. data/data/doc/xmpp4r/examples/basic/versionbot.rb +75 -0
  46. data/data/doc/xmpp4r/examples/buggy/jabber2jabber/jabber2jabber.rb +18 -0
  47. data/data/doc/xmpp4r/examples/buggy/miniedgarr_cgi.rb +192 -0
  48. data/data/doc/xmpp4r/examples/buggy/miniedgarr_watch.rb +82 -0
  49. data/lib/callbacks.rb +122 -0
  50. data/lib/xmpp4r/authenticationfailure.rb +13 -0
  51. data/lib/xmpp4r/bytestreams/helper/filetransfer.rb +315 -0
  52. data/lib/xmpp4r/bytestreams/helper/ibb/base.rb +256 -0
  53. data/lib/xmpp4r/bytestreams/helper/ibb/initiator.rb +30 -0
  54. data/lib/xmpp4r/bytestreams/helper/ibb/target.rb +46 -0
  55. data/lib/xmpp4r/bytestreams/helper/socks5bytestreams/base.rb +151 -0
  56. data/lib/xmpp4r/bytestreams/helper/socks5bytestreams/initiator.rb +85 -0
  57. data/lib/xmpp4r/bytestreams/helper/socks5bytestreams/server.rb +178 -0
  58. data/lib/xmpp4r/bytestreams/helper/socks5bytestreams/socks5.rb +56 -0
  59. data/lib/xmpp4r/bytestreams/helper/socks5bytestreams/target.rb +61 -0
  60. data/lib/xmpp4r/bytestreams/iq/bytestreams.rb +177 -0
  61. data/lib/xmpp4r/bytestreams/iq/si.rb +221 -0
  62. data/lib/xmpp4r/bytestreams.rb +11 -0
  63. data/lib/xmpp4r/client.rb +249 -0
  64. data/lib/xmpp4r/component.rb +103 -0
  65. data/lib/xmpp4r/connection.rb +166 -0
  66. data/lib/xmpp4r/dataforms/x/data.rb +248 -0
  67. data/lib/xmpp4r/dataforms.rb +1 -0
  68. data/lib/xmpp4r/debuglog.rb +34 -0
  69. data/lib/xmpp4r/delay/x/delay.rb +100 -0
  70. data/lib/xmpp4r/delay.rb +1 -0
  71. data/lib/xmpp4r/discovery/iq/discoinfo.rb +225 -0
  72. data/lib/xmpp4r/discovery/iq/discoitems.rb +162 -0
  73. data/lib/xmpp4r/discovery.rb +2 -0
  74. data/lib/xmpp4r/error.rb +230 -0
  75. data/lib/xmpp4r/errorexception.rb +32 -0
  76. data/lib/xmpp4r/feature_negotiation/iq/feature.rb +42 -0
  77. data/lib/xmpp4r/feature_negotiation.rb +1 -0
  78. data/lib/xmpp4r/idgenerator.rb +37 -0
  79. data/lib/xmpp4r/iq.rb +229 -0
  80. data/lib/xmpp4r/jid.rb +167 -0
  81. data/lib/xmpp4r/message.rb +171 -0
  82. data/lib/xmpp4r/muc/helper/mucbrowser.rb +107 -0
  83. data/lib/xmpp4r/muc/helper/mucclient.rb +382 -0
  84. data/lib/xmpp4r/muc/helper/simplemucclient.rb +222 -0
  85. data/lib/xmpp4r/muc/x/muc.rb +98 -0
  86. data/lib/xmpp4r/muc/x/mucuserinvite.rb +58 -0
  87. data/lib/xmpp4r/muc/x/mucuseritem.rb +148 -0
  88. data/lib/xmpp4r/muc.rb +6 -0
  89. data/lib/xmpp4r/presence.rb +255 -0
  90. data/lib/xmpp4r/query.rb +43 -0
  91. data/lib/xmpp4r/rexmladdons.rb +826 -0
  92. data/lib/xmpp4r/roster/helper/roster.rb +514 -0
  93. data/lib/xmpp4r/roster/iq/roster.rb +244 -0
  94. data/lib/xmpp4r/roster/x/roster.rb +155 -0
  95. data/lib/xmpp4r/roster.rb +4 -0
  96. data/lib/xmpp4r/sasl.rb +167 -0
  97. data/lib/xmpp4r/stream.rb +543 -0
  98. data/lib/xmpp4r/streamparser.rb +77 -0
  99. data/lib/xmpp4r/vcard/helper/vcard.rb +86 -0
  100. data/lib/xmpp4r/vcard/iq/vcard.rb +102 -0
  101. data/lib/xmpp4r/vcard.rb +3 -0
  102. data/lib/xmpp4r/version/helper/responder.rb +71 -0
  103. data/lib/xmpp4r/version/helper/simpleresponder.rb +44 -0
  104. data/lib/xmpp4r/version/iq/version.rb +118 -0
  105. data/lib/xmpp4r/version.rb +3 -0
  106. data/lib/xmpp4r/x.rb +43 -0
  107. data/lib/xmpp4r/xmlstanza.rb +174 -0
  108. data/lib/xmpp4r/xmpp4r.rb +16 -0
  109. data/lib/xmpp4r.rb +122 -0
  110. data/setup.rb +1360 -0
  111. data/test/bytestreams/tc_ibb.rb +186 -0
  112. data/test/bytestreams/tc_socks5bytestreams.rb +57 -0
  113. data/test/delay/tc_xdelay.rb +51 -0
  114. data/test/lib/clienttester.rb +110 -0
  115. data/test/muc/tc_muc_mucclient.rb +569 -0
  116. data/test/muc/tc_muc_simplemucclient.rb +72 -0
  117. data/test/roster/.tc_helper.rb.swp +0 -0
  118. data/test/roster/tc_helper.rb +389 -0
  119. data/test/roster/tc_iqqueryroster.rb +140 -0
  120. data/test/roster/tc_xroster.rb +70 -0
  121. data/test/tc_callbacks.rb +128 -0
  122. data/test/tc_class_names.rb +129 -0
  123. data/test/tc_client.rb +30 -0
  124. data/test/tc_error.rb +103 -0
  125. data/test/tc_idgenerator.rb +30 -0
  126. data/test/tc_iq.rb +109 -0
  127. data/test/tc_iqquery.rb +31 -0
  128. data/test/tc_jid.rb +202 -0
  129. data/test/tc_message.rb +114 -0
  130. data/test/tc_presence.rb +148 -0
  131. data/test/tc_stream.rb +182 -0
  132. data/test/tc_streamError.rb +87 -0
  133. data/test/tc_streamSend.rb +59 -0
  134. data/test/tc_streamThreaded.rb +168 -0
  135. data/test/tc_xmlstanza.rb +76 -0
  136. data/test/ts_xmpp4r.rb +34 -0
  137. data/test/vcard/tc_iqvcard.rb +52 -0
  138. data/test/version/tc_helper.rb +46 -0
  139. data/test/version/tc_iqqueryversion.rb +96 -0
  140. data/tools/doctoweb.bash +30 -0
  141. data/tools/gen_requires.bash +10 -0
  142. metadata +232 -0
@@ -0,0 +1,186 @@
1
+ #!/usr/bin/ruby
2
+
3
+ $:.unshift File::dirname(__FILE__) + '/../../lib'
4
+
5
+ require 'test/unit'
6
+ require File::dirname(__FILE__) + '/../lib/clienttester'
7
+
8
+ require 'xmpp4r'
9
+ require 'xmpp4r/bytestreams'
10
+ include Jabber
11
+
12
+ class IBBTest < Test::Unit::TestCase
13
+ include ClientTester
14
+
15
+ def create_buffer(size)
16
+ ([nil] * size).collect { rand(256).chr }.join
17
+ end
18
+
19
+ def test_ibb_target2initiator
20
+ target = Bytestreams::IBBTarget.new(@server, '1', nil, '1@a.com/1')
21
+ initiator = Bytestreams::IBBInitiator.new(@client, '1', nil, '1@a.com/1')
22
+
23
+ buffer = create_buffer(9999)
24
+
25
+ Thread.new do
26
+ target.accept
27
+ target.write(buffer)
28
+ Thread.pass
29
+ target.close
30
+ end
31
+
32
+
33
+ initiator.open
34
+
35
+ received = ''
36
+ while buf = initiator.read
37
+ received += buf
38
+ end
39
+
40
+ initiator.close
41
+
42
+ assert_equal(buffer, received)
43
+ end
44
+
45
+ def test_ibb_initiator2target
46
+ target = Bytestreams::IBBTarget.new(@server, '1', nil, '1@a.com/1')
47
+ initiator = Bytestreams::IBBInitiator.new(@client, '1', nil, '1@a.com/1')
48
+
49
+ buffer = create_buffer(9999)
50
+
51
+ Thread.new do
52
+ Thread.pass
53
+ initiator.open
54
+ initiator.write(buffer)
55
+ Thread.pass
56
+ initiator.close
57
+ end
58
+
59
+
60
+ target.accept
61
+
62
+ received = ''
63
+ while buf = target.read
64
+ received += buf
65
+ end
66
+
67
+ target.close
68
+
69
+ assert_equal(buffer, received)
70
+ end
71
+
72
+ def test_ibb_pingpong
73
+ ignored_stanzas = 0
74
+ wait = Mutex.new
75
+ wait.lock
76
+ @server.add_message_callback { ignored_stanzas += 1; wait.unlock }
77
+ @server.add_iq_callback { ignored_stanzas += 1; wait.unlock }
78
+
79
+
80
+ target = Bytestreams::IBBTarget.new(@server, '1', nil, '1@a.com/1')
81
+ initiator = Bytestreams::IBBInitiator.new(@client, '1', nil, '1@a.com/1')
82
+
83
+ Thread.new do
84
+ target.accept
85
+
86
+ while buf = target.read
87
+ target.write(buf)
88
+ target.flush
89
+ end
90
+
91
+ target.close
92
+ end
93
+
94
+
95
+ assert_equal(0, ignored_stanzas)
96
+ @client.send("<iq from='1@a.com/1' type='set'>
97
+ <close xmlns='http://jabber.org/protocol/ibb' sid='another session id'/>
98
+ </iq>")
99
+ wait.lock
100
+ assert_equal(1, ignored_stanzas)
101
+
102
+
103
+ initiator.open
104
+
105
+
106
+ assert_equal(1, ignored_stanzas)
107
+ @client.send("<message from='1@a.com/1' type='error'>
108
+ <data xmlns='http://jabber.org/protocol/ibb' sid='another session id' seq='0'/>
109
+ </message>")
110
+ wait.lock
111
+ assert_equal(2, ignored_stanzas)
112
+ @client.send("<iq from='1@a.com/1' type='set'>
113
+ <close xmlns='http://jabber.org/protocol/ibb' sid='another session id'/>
114
+ </iq>")
115
+ wait.lock
116
+ assert_equal(3, ignored_stanzas)
117
+
118
+
119
+ 10.times do
120
+ buf = create_buffer(9999)
121
+ initiator.write(buf)
122
+ initiator.flush
123
+
124
+ bufr = ''
125
+ begin
126
+ bufr += initiator.read
127
+ end while bufr.size < buf.size
128
+ assert_equal(buf, bufr)
129
+ end
130
+
131
+ initiator.close
132
+
133
+
134
+ assert_equal(3, ignored_stanzas)
135
+ end
136
+
137
+ def test_ibb_error
138
+ target = Bytestreams::IBBTarget.new(@server, '1', nil, '1@a.com/1')
139
+ initiator = Bytestreams::IBBInitiator.new(@client, '1', nil, '1@a.com/1')
140
+
141
+ Thread.new do
142
+ target.accept
143
+
144
+ @server.send("<message from='1@a.com/1' type='error'>
145
+ <data xmlns='http://jabber.org/protocol/ibb' sid='#{target.instance_variable_get(:@session_id)}' seq='0'/>
146
+ </message>")
147
+ end
148
+
149
+
150
+ initiator.open
151
+
152
+ assert_nil(initiator.read)
153
+
154
+ initiator.close
155
+ end
156
+
157
+ def test_ibb_inactive
158
+ target = Bytestreams::IBBTarget.new(@server, '1', nil, '1@a.com/1')
159
+ initiator = Bytestreams::IBBInitiator.new(@client, '1', nil, '1@a.com/1')
160
+
161
+ assert_nil(target.read)
162
+ assert_nil(initiator.read)
163
+
164
+ assert_raise(RuntimeError) {
165
+ target.write('a' * target.block_size)
166
+ }
167
+ assert_raise(RuntimeError) {
168
+ initiator.write('a' * initiator.block_size)
169
+ }
170
+ end
171
+
172
+ def test_ibb_queueitem
173
+ i1 = Bytestreams::IBBQueueItem.new(:close)
174
+ assert_equal(:close, i1.type)
175
+ assert_nil(i1.seq)
176
+
177
+ i2 = Bytestreams::IBBQueueItem.new(:data, 1, Base64::encode64('blah'))
178
+ assert_equal(:data, i2.type)
179
+ assert_equal(1, i2.seq)
180
+ assert_equal('blah', i2.data)
181
+
182
+ assert_raise(RuntimeError) {
183
+ i3 = Bytestreams::IBBQueueItem.new(:invalid)
184
+ }
185
+ end
186
+ end
@@ -0,0 +1,57 @@
1
+ #!/usr/bin/ruby
2
+
3
+ $:.unshift File::dirname(__FILE__) + '/../../lib'
4
+
5
+ require 'test/unit'
6
+ require File::dirname(__FILE__) + '/../lib/clienttester'
7
+
8
+ require 'xmpp4r'
9
+ require 'xmpp4r/bytestreams'
10
+ include Jabber
11
+
12
+ class SOCKS5BytestreamsTest < Test::Unit::TestCase
13
+ include ClientTester
14
+
15
+ @@server = Bytestreams::SOCKS5BytestreamsServer.new(65005)
16
+ @@server.add_address('localhost')
17
+
18
+ def create_buffer(size)
19
+ ([nil] * size).collect { rand(256).chr }.join
20
+ end
21
+
22
+ def test_pingpong
23
+ target = Bytestreams::SOCKS5BytestreamsTarget.new(@server, '1', '1@a.com/1', '1@a.com/2')
24
+ initiator = Bytestreams::SOCKS5BytestreamsInitiator.new(@client, '1', '1@a.com/1', '1@a.com/2')
25
+ initiator.add_streamhost(@@server)
26
+
27
+
28
+ Thread.new do
29
+ target.accept
30
+
31
+ while buf = target.read(256)
32
+ target.write(buf)
33
+ target.flush
34
+ end
35
+
36
+ target.close
37
+ end
38
+
39
+
40
+ initiator.open
41
+
42
+ 10.times do
43
+ buf = create_buffer(8192)
44
+ initiator.write(buf)
45
+ initiator.flush
46
+
47
+ bufr = ''
48
+ begin
49
+ bufr += initiator.read(256)
50
+ end while bufr.size < buf.size
51
+ assert_equal(buf, bufr)
52
+ end
53
+
54
+ initiator.close
55
+ end
56
+
57
+ end
@@ -0,0 +1,51 @@
1
+ #!/usr/bin/ruby
2
+
3
+ $:.unshift File::dirname(__FILE__) + '/../../lib'
4
+
5
+ require 'test/unit'
6
+ require 'xmpp4r/rexmladdons'
7
+ require 'xmpp4r/delay/x/delay'
8
+ include Jabber
9
+
10
+ class XDelayTest < Test::Unit::TestCase
11
+ def test_create1
12
+ d = Delay::XDelay.new(false)
13
+ assert_equal(nil, d.stamp)
14
+ assert_equal(nil, d.from)
15
+ assert_equal('jabber:x:delay', d.namespace)
16
+ end
17
+
18
+ def test_create2
19
+ d = Delay::XDelay.new
20
+ # Hopefully the seconds don't change here...
21
+ assert_equal(Time.now.to_s, d.stamp.to_s)
22
+ assert_equal(nil, d.from)
23
+ assert_equal('jabber:x:delay', d.namespace)
24
+ end
25
+
26
+ def test_from
27
+ d = Delay::XDelay.new
28
+ assert_equal(nil, d.from)
29
+ d.from = JID::new('astro@spaceboyz.net')
30
+ assert_equal(JID::new('astro@spaceboyz.net'), d.from)
31
+ assert_equal(d, d.set_from(nil))
32
+ assert_equal(nil, d.from)
33
+ end
34
+
35
+ def test_stamp
36
+ d = Delay::XDelay.new(false)
37
+ assert_equal(nil, d.stamp)
38
+ now = Time.now
39
+ d.stamp = now
40
+ assert_equal(now.to_s, d.stamp.to_s)
41
+ assert_equal(d, d.set_stamp(nil))
42
+ assert_equal(nil, d.stamp)
43
+ end
44
+
45
+ def test_import
46
+ x1 = X.new
47
+ x1.add_namespace('jabber:x:delay')
48
+ x2 = X::import(x1)
49
+ assert_equal(Delay::XDelay, x2.class)
50
+ end
51
+ end
@@ -0,0 +1,110 @@
1
+ $:.unshift '../lib'
2
+ require 'xmpp4r'
3
+ require 'test/unit'
4
+ require 'socket'
5
+
6
+ # Turn $VERBOSE off to suppress warnings about redefinition
7
+ oldverbose = $VERBOSE
8
+ $VERBOSE = false
9
+
10
+ module Jabber
11
+ ##
12
+ # The ClientTester is a mix-in which provides a setup and teardown
13
+ # method to prepare a Stream object (@client) and two methods
14
+ # interfacing as the "server side":
15
+ # * send(xml):: Send a stanza to @client
16
+ # * receive:: (Wait and) retrieve a stanza sent by the client (in order)
17
+ #
18
+ # The server side is a stream, too: add your callbacks to @server
19
+ #
20
+ # ClientTester is written to test complex helper classes.
21
+ module ClientTester
22
+ @@SOCKET_PORT = 65223
23
+
24
+ def setup
25
+ Thread::abort_on_exception = true
26
+
27
+ servlisten = TCPServer.new(@@SOCKET_PORT)
28
+ serverwait = Mutex.new
29
+ serverwait.lock
30
+ Thread.new {
31
+ serversock = servlisten.accept
32
+ servlisten.close
33
+ serversock.sync = true
34
+ @server = Stream.new(true)
35
+ @server.add_xml_callback { |xml|
36
+ if xml.prefix == 'stream' and xml.name == 'stream'
37
+ send('<stream:stream>')
38
+ true
39
+ else
40
+ false
41
+ end
42
+ }
43
+ @server.start(serversock)
44
+
45
+ serverwait.unlock
46
+ }
47
+
48
+ clientsock = TCPSocket.new('localhost', @@SOCKET_PORT)
49
+ clientsock.sync = true
50
+ @client = Stream.new(true)
51
+ @client.start(clientsock)
52
+
53
+ @client.send('<stream:stream>') { |reply|
54
+ true
55
+ }
56
+
57
+ @state = 0
58
+ @states = []
59
+ @state_wait = Mutex.new
60
+ @state_wait.lock
61
+ @server.add_stanza_callback { |stanza|
62
+ if @state < @states.size
63
+ @states[@state].call(stanza)
64
+ @state += 1
65
+ end
66
+ @state_wait.unlock
67
+
68
+ false
69
+ }
70
+
71
+ serverwait.lock
72
+ end
73
+
74
+ def teardown
75
+ @client.close
76
+ @server.close
77
+ end
78
+
79
+ def send(xml)
80
+ @server.send(xml)
81
+ end
82
+
83
+ def receive
84
+ @receive_lock.lock
85
+
86
+ loop {
87
+ @stanzas_lock.synchronize {
88
+ if @stanzas.size > 0
89
+ @receive_lock.unlock
90
+ return @stanzas.shift
91
+ end
92
+ }
93
+
94
+ @receive_lock.lock
95
+ @receive_lock.unlock
96
+ }
97
+ end
98
+
99
+ def state(&block)
100
+ @states << block
101
+ end
102
+
103
+ def wait_state
104
+ @state_wait.lock
105
+ end
106
+ end
107
+ end
108
+
109
+ # Restore the old $VERBOSE setting
110
+ $VERBOSE = oldverbose