jabber4r-revive 0.9.0 → 0.10.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (45) hide show
  1. data/.gitignore +5 -4
  2. data/.rspec +3 -3
  3. data/.travis.yml +7 -7
  4. data/CHANGELOG +11 -1
  5. data/Gemfile +3 -3
  6. data/README.md +29 -29
  7. data/Rakefile +70 -70
  8. data/jabber4r-revive.gemspec +25 -25
  9. data/lib/jabber4r.rb +38 -33
  10. data/lib/jabber4r/bosh.rb +21 -0
  11. data/lib/jabber4r/bosh/authentication.rb +13 -0
  12. data/lib/jabber4r/bosh/authentication/non_sasl.rb +219 -0
  13. data/lib/jabber4r/bosh/authentication/sasl.rb +239 -0
  14. data/lib/jabber4r/bosh/session.rb +144 -0
  15. data/lib/jabber4r/connection.rb +259 -258
  16. data/lib/jabber4r/debugger.rb +60 -60
  17. data/lib/jabber4r/jid.rb +20 -19
  18. data/lib/jabber4r/protocol.rb +249 -257
  19. data/lib/jabber4r/protocol/authentication.rb +14 -0
  20. data/lib/jabber4r/protocol/authentication/non_sasl.rb +138 -0
  21. data/lib/jabber4r/protocol/authentication/sasl.rb +88 -0
  22. data/lib/jabber4r/protocol/iq.rb +259 -259
  23. data/lib/jabber4r/protocol/message.rb +245 -245
  24. data/lib/jabber4r/protocol/parsed_xml_element.rb +207 -207
  25. data/lib/jabber4r/protocol/presence.rb +160 -160
  26. data/lib/jabber4r/protocol/xml_element.rb +143 -143
  27. data/lib/jabber4r/rexml_1.8_patch.rb +15 -15
  28. data/lib/jabber4r/roster.rb +38 -38
  29. data/lib/jabber4r/session.rb +615 -615
  30. data/lib/jabber4r/version.rb +10 -3
  31. data/spec/lib/jabber4r/bosh/authentication/non_sasl_spec.rb +79 -0
  32. data/spec/lib/jabber4r/bosh/authentication/sasl_spec.rb +42 -0
  33. data/spec/lib/jabber4r/bosh/session_spec.rb +406 -0
  34. data/spec/lib/jabber4r/bosh_spec.rb +0 -0
  35. data/spec/lib/jabber4r/connection_spec.rb +174 -174
  36. data/spec/lib/jabber4r/debugger_spec.rb +35 -35
  37. data/spec/lib/jabber4r/jid_spec.rb +197 -197
  38. data/spec/lib/jabber4r/protocol/authentication/non_sasl_spec.rb +79 -0
  39. data/spec/lib/jabber4r/protocol/authentication/sasl_spec.rb +42 -0
  40. data/spec/spec_helper.rb +11 -11
  41. data/spec/support/mocks/tcp_socket_mock.rb +8 -8
  42. metadata +61 -45
  43. data/Gemfile.lock +0 -45
  44. data/lib/jabber4r/bosh_session.rb +0 -224
  45. data/spec/lib/jabber4r/bosh_session_spec.rb +0 -150
@@ -0,0 +1,79 @@
1
+ # coding: utf-8
2
+ require "spec_helper"
3
+
4
+ describe Jabber::Protocol::Authentication::NonSASL do
5
+ let(:jid) { Jabber::JID.new("strech@localhost/my-resource") }
6
+
7
+ describe "#initialize" do
8
+ context "when create plain non-sasl authentication" do
9
+ let(:auth) { described_class.new(jid, "my-password") }
10
+
11
+ it { expect(auth.stream_id).to be_nil }
12
+ end
13
+
14
+ context "when jid is a String" do
15
+ let(:auth) { described_class.new("hello@localhost/my-res", "my-password") }
16
+
17
+ it { expect { auth }.not_to raise_error TypeError }
18
+ end
19
+
20
+ context "when jid is not instance of Jabber::JID or String" do
21
+ let(:auth) { described_class.new(:hello, "my-password") }
22
+
23
+ it { expect { auth }.to raise_error TypeError }
24
+ end
25
+
26
+ context "when mechanism doesn't exists" do
27
+ let(:auth) { described_class.new("hello@localhost/my-res", "my-password", mechanism: :unknown) }
28
+
29
+ it { expect { auth }.to raise_error ArgumentError }
30
+ end
31
+
32
+ context "when mechanism is digest and no stream_id is given" do
33
+ let(:auth) { described_class.new("hello@localhost/my-res", "my-password", mechanism: :digest) }
34
+
35
+ it { expect { auth }.to raise_error KeyError }
36
+ end
37
+ end
38
+
39
+ describe "#plain" do
40
+ let(:auth) { described_class.new(jid, "my-password") }
41
+ let(:auth_xml) { auth.dump.strip.gsub(/[\r\n]+|\s{2,}/, "") }
42
+ let(:correct_xml) do
43
+ '<iq xmlns="jabber:client" type="set" id="auth2"><query xmlns="jabber:iq:auth">' +
44
+ '<username>strech</username><password>my-password</password>' +
45
+ '<resource>my-resource</resource></query></iq>'
46
+ end
47
+
48
+ before { Jabber.stub(:gen_random_id).and_return "auth2" }
49
+
50
+ it { expect(auth_xml).to eq correct_xml }
51
+ end
52
+
53
+ describe "#digest" do
54
+ let(:auth) { described_class.new(jid, "my-password", stream_id: 1, mechanism: :digest) }
55
+ let(:auth_xml) { auth.dump.strip.gsub(/[\r\n]+|\s{2,}/, "") }
56
+ let(:correct_xml) do
57
+ '<iq xmlns="jabber:client" type="set" id="auth2"><query xmlns="jabber:iq:auth">' +
58
+ '<username>strech</username><digest>0123456789</digest>' +
59
+ '<resource>my-resource</resource></query></iq>'
60
+ end
61
+
62
+ before { Jabber.stub(:gen_random_id).and_return "auth2" }
63
+ before { described_class.stub(:generate_digest).and_return "0123456789" }
64
+
65
+ it { expect(auth_xml).to eq correct_xml }
66
+ end
67
+
68
+ describe "#plain?" do
69
+ let(:auth) { described_class.new(jid, "my-password") }
70
+
71
+ it { expect(auth).to be_plain }
72
+ end
73
+
74
+ describe "#digest?" do
75
+ let(:auth) { described_class.new(jid, "my-password", mechanism: :digest, stream_id: 1) }
76
+
77
+ it { expect(auth).to be_digest }
78
+ end
79
+ end
@@ -0,0 +1,42 @@
1
+ # coding: utf-8
2
+ require "spec_helper"
3
+
4
+ describe Jabber::Protocol::Authentication::SASL do
5
+ let(:jid) { Jabber::JID.new("strech@localhost/my-resource") }
6
+
7
+ describe "#initialize" do
8
+ context "when jid is a String" do
9
+ let(:auth) { described_class.new("hello@localhost/my-res", "my-password") }
10
+
11
+ it { expect { auth }.not_to raise_error TypeError }
12
+ end
13
+
14
+ context "when jid is not instance of Jabber::JID or String" do
15
+ let(:auth) { described_class.new(:hello, "my-password") }
16
+
17
+ it { expect { auth }.to raise_error TypeError }
18
+ end
19
+
20
+ context "when mechanism doesn't exists" do
21
+ let(:auth) { described_class.new("hello@localhost/my-res", "my-password", mechanism: :unknown) }
22
+
23
+ it { expect { auth }.to raise_error ArgumentError }
24
+ end
25
+ end
26
+
27
+ describe "#plain" do
28
+ let(:auth) { described_class.new(jid, "my-password") }
29
+ let(:auth_xml) { auth.dump.strip.gsub(/[\r\n]+|\s{2,}/, "") }
30
+ let(:correct_xml) { '<auth xmlns="urn:ietf:params:xml:ns:xmpp-sasl" mechanism="PLAIN">0123456789</auth>' }
31
+
32
+ before { described_class.stub(:generate_plain).and_return "0123456789" }
33
+
34
+ it { expect(auth_xml).to eq correct_xml }
35
+ end
36
+
37
+ describe "#plain?" do
38
+ let(:auth) { described_class.new(jid, "my-password") }
39
+
40
+ it { expect(auth).to be_plain }
41
+ end
42
+ end
data/spec/spec_helper.rb CHANGED
@@ -1,11 +1,11 @@
1
- # coding: utf-8
2
- $LOAD_PATH.unshift File.expand_path("../../", __FILE__)
3
-
4
- require "webmock/rspec"
5
-
6
- require "jabber4r"
7
- Dir["spec/support/**/*.rb"].sort.each { |f| require f }
8
-
9
- RSpec.configure do |config|
10
- # ... rspec options
11
- end
1
+ # coding: utf-8
2
+ $LOAD_PATH.unshift File.expand_path("../../", __FILE__)
3
+
4
+ require "webmock/rspec"
5
+
6
+ require "jabber4r"
7
+ Dir["spec/support/**/*.rb"].sort.each { |f| require f }
8
+
9
+ RSpec.configure do |config|
10
+ # ... rspec options
11
+ end
@@ -1,8 +1,8 @@
1
- # coding: utf-8
2
-
3
- # Mock of TCPSocket
4
- class TCPSocketMock < StringIO
5
- def to_s
6
- rewind; read
7
- end
8
- end
1
+ # coding: utf-8
2
+
3
+ # Mock of TCPSocket
4
+ class TCPSocketMock < StringIO
5
+ def to_s
6
+ rewind; read
7
+ end
8
+ end
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: jabber4r-revive
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 0.9.0
5
+ version: 0.10.0
6
6
  platform: ruby
7
7
  authors:
8
8
  - Richard Kilmer
@@ -10,72 +10,72 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2013-06-26 00:00:00.000000000 Z
13
+ date: 2013-07-08 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
+ name: ox
16
17
  version_requirements: !ruby/object:Gem::Requirement
18
+ none: false
17
19
  requirements:
18
- - - ! '>='
20
+ - - ~>
19
21
  - !ruby/object:Gem::Version
20
- version: '0'
21
- none: false
22
- name: ox
23
- type: :runtime
24
- prerelease: false
22
+ version: 2.0.4
25
23
  requirement: !ruby/object:Gem::Requirement
24
+ none: false
26
25
  requirements:
27
- - - ! '>='
26
+ - - ~>
28
27
  - !ruby/object:Gem::Version
29
- version: '0'
30
- none: false
28
+ version: 2.0.4
29
+ type: :runtime
30
+ prerelease: false
31
31
  - !ruby/object:Gem::Dependency
32
+ name: rspec
32
33
  version_requirements: !ruby/object:Gem::Requirement
34
+ none: false
33
35
  requirements:
34
- - - ! '>='
36
+ - - ~>
35
37
  - !ruby/object:Gem::Version
36
- version: '0'
37
- none: false
38
- name: rspec
39
- type: :development
40
- prerelease: false
38
+ version: 2.13.0
41
39
  requirement: !ruby/object:Gem::Requirement
40
+ none: false
42
41
  requirements:
43
- - - ! '>='
42
+ - - ~>
44
43
  - !ruby/object:Gem::Version
45
- version: '0'
46
- none: false
44
+ version: 2.13.0
45
+ type: :development
46
+ prerelease: false
47
47
  - !ruby/object:Gem::Dependency
48
+ name: webmock
48
49
  version_requirements: !ruby/object:Gem::Requirement
50
+ none: false
49
51
  requirements:
50
- - - ! '>='
52
+ - - ~>
51
53
  - !ruby/object:Gem::Version
52
- version: '0'
53
- none: false
54
- name: webmock
55
- type: :development
56
- prerelease: false
54
+ version: 1.11.0
57
55
  requirement: !ruby/object:Gem::Requirement
56
+ none: false
58
57
  requirements:
59
- - - ! '>='
58
+ - - ~>
60
59
  - !ruby/object:Gem::Version
61
- version: '0'
62
- none: false
60
+ version: 1.11.0
61
+ type: :development
62
+ prerelease: false
63
63
  - !ruby/object:Gem::Dependency
64
+ name: changelogger
64
65
  version_requirements: !ruby/object:Gem::Requirement
66
+ none: false
65
67
  requirements:
66
- - - ! '>='
68
+ - - ~>
67
69
  - !ruby/object:Gem::Version
68
- version: '0'
69
- none: false
70
- name: changelogger
71
- type: :development
72
- prerelease: false
70
+ version: 0.0.3
73
71
  requirement: !ruby/object:Gem::Requirement
72
+ none: false
74
73
  requirements:
75
- - - ! '>='
74
+ - - ~>
76
75
  - !ruby/object:Gem::Version
77
- version: '0'
78
- none: false
76
+ version: 0.0.3
77
+ type: :development
78
+ prerelease: false
79
79
  description: The purpose of this library is to allow Ruby applications to talk to
80
80
  a Jabber IM system. Jabber is an open-source instant messaging service, which can
81
81
  be learned about at http://www.jabber.org
@@ -91,17 +91,23 @@ files:
91
91
  - .travis.yml
92
92
  - CHANGELOG
93
93
  - Gemfile
94
- - Gemfile.lock
95
94
  - LICENSE
96
95
  - README.md
97
96
  - Rakefile
98
97
  - jabber4r-revive.gemspec
99
98
  - lib/jabber4r.rb
100
- - lib/jabber4r/bosh_session.rb
99
+ - lib/jabber4r/bosh.rb
100
+ - lib/jabber4r/bosh/authentication.rb
101
+ - lib/jabber4r/bosh/authentication/non_sasl.rb
102
+ - lib/jabber4r/bosh/authentication/sasl.rb
103
+ - lib/jabber4r/bosh/session.rb
101
104
  - lib/jabber4r/connection.rb
102
105
  - lib/jabber4r/debugger.rb
103
106
  - lib/jabber4r/jid.rb
104
107
  - lib/jabber4r/protocol.rb
108
+ - lib/jabber4r/protocol/authentication.rb
109
+ - lib/jabber4r/protocol/authentication/non_sasl.rb
110
+ - lib/jabber4r/protocol/authentication/sasl.rb
105
111
  - lib/jabber4r/protocol/iq.rb
106
112
  - lib/jabber4r/protocol/message.rb
107
113
  - lib/jabber4r/protocol/parsed_xml_element.rb
@@ -112,10 +118,15 @@ files:
112
118
  - lib/jabber4r/session.rb
113
119
  - lib/jabber4r/vcard.rb
114
120
  - lib/jabber4r/version.rb
115
- - spec/lib/jabber4r/bosh_session_spec.rb
121
+ - spec/lib/jabber4r/bosh/authentication/non_sasl_spec.rb
122
+ - spec/lib/jabber4r/bosh/authentication/sasl_spec.rb
123
+ - spec/lib/jabber4r/bosh/session_spec.rb
124
+ - spec/lib/jabber4r/bosh_spec.rb
116
125
  - spec/lib/jabber4r/connection_spec.rb
117
126
  - spec/lib/jabber4r/debugger_spec.rb
118
127
  - spec/lib/jabber4r/jid_spec.rb
128
+ - spec/lib/jabber4r/protocol/authentication/non_sasl_spec.rb
129
+ - spec/lib/jabber4r/protocol/authentication/sasl_spec.rb
119
130
  - spec/spec_helper.rb
120
131
  - spec/support/mocks/tcp_socket_mock.rb
121
132
  homepage: https://github.com/Strech/jabber4r-revive
@@ -125,27 +136,32 @@ rdoc_options: []
125
136
  require_paths:
126
137
  - lib
127
138
  required_ruby_version: !ruby/object:Gem::Requirement
139
+ none: false
128
140
  requirements:
129
141
  - - ! '>='
130
142
  - !ruby/object:Gem::Version
131
143
  version: '0'
132
- none: false
133
144
  required_rubygems_version: !ruby/object:Gem::Requirement
145
+ none: false
134
146
  requirements:
135
147
  - - ! '>='
136
148
  - !ruby/object:Gem::Version
137
149
  version: '0'
138
- none: false
139
150
  requirements: []
140
151
  rubyforge_project:
141
- rubygems_version: 1.8.24
152
+ rubygems_version: 1.8.25
142
153
  signing_key:
143
154
  specification_version: 3
144
155
  summary: Read more http://jabber4r.rubyforge.org
145
156
  test_files:
146
- - spec/lib/jabber4r/bosh_session_spec.rb
157
+ - spec/lib/jabber4r/bosh/authentication/non_sasl_spec.rb
158
+ - spec/lib/jabber4r/bosh/authentication/sasl_spec.rb
159
+ - spec/lib/jabber4r/bosh/session_spec.rb
160
+ - spec/lib/jabber4r/bosh_spec.rb
147
161
  - spec/lib/jabber4r/connection_spec.rb
148
162
  - spec/lib/jabber4r/debugger_spec.rb
149
163
  - spec/lib/jabber4r/jid_spec.rb
164
+ - spec/lib/jabber4r/protocol/authentication/non_sasl_spec.rb
165
+ - spec/lib/jabber4r/protocol/authentication/sasl_spec.rb
150
166
  - spec/spec_helper.rb
151
167
  - spec/support/mocks/tcp_socket_mock.rb
data/Gemfile.lock DELETED
@@ -1,45 +0,0 @@
1
- PATH
2
- remote: .
3
- specs:
4
- jabber4r-revive (0.9.0)
5
- ox
6
-
7
- GEM
8
- remote: https://rubygems.org/
9
- specs:
10
- addressable (2.3.4)
11
- changelogger (0.0.3)
12
- grit (~> 2.5.0)
13
- thor (~> 0.16.0)
14
- crack (0.4.0)
15
- safe_yaml (~> 0.9.0)
16
- diff-lcs (1.2.4)
17
- grit (2.5.0)
18
- diff-lcs (~> 1.1)
19
- mime-types (~> 1.15)
20
- posix-spawn (~> 0.3.6)
21
- mime-types (1.23)
22
- ox (2.0.4)
23
- posix-spawn (0.3.6)
24
- rspec (2.13.0)
25
- rspec-core (~> 2.13.0)
26
- rspec-expectations (~> 2.13.0)
27
- rspec-mocks (~> 2.13.0)
28
- rspec-core (2.13.1)
29
- rspec-expectations (2.13.0)
30
- diff-lcs (>= 1.1.3, < 2.0)
31
- rspec-mocks (2.13.1)
32
- safe_yaml (0.9.3)
33
- thor (0.16.0)
34
- webmock (1.11.0)
35
- addressable (>= 2.2.7)
36
- crack (>= 0.3.2)
37
-
38
- PLATFORMS
39
- ruby
40
-
41
- DEPENDENCIES
42
- changelogger
43
- jabber4r-revive!
44
- rspec
45
- webmock
@@ -1,224 +0,0 @@
1
- # coding: utf-8
2
-
3
- # License: see LICENSE
4
- # Jabber4R - Jabber Instant Messaging Library for Ruby
5
- # Copyright (C) 2002 Rich Kilmer <rich@infoether.com>
6
- # Copyright (C) 2013 Sergey Fedorov <strech_ftf@mail.ru>
7
-
8
- require "ox"
9
- require "json"
10
- require "net/http"
11
- require "digest/sha1"
12
-
13
- module Jabber
14
- # XMPP Over BOSH class
15
- # NOTE: http://xmpp.org/extensions/xep-0206.html
16
- class BoshSession
17
- # Public: Default connection options
18
- DEFAULTS = {
19
- host: "localhost",
20
- port: 5280,
21
- bind_uri: "/http-bind"
22
- }.freeze
23
-
24
- attr_reader :stream_id
25
- attr_reader :jid, :rid, :sid
26
- attr_reader :host, :port, :bind_uri
27
-
28
- # Public: Create new BOSH-session and bind it to jabber http-bind service
29
- #
30
- # username - String the login of jabber server user
31
- # password - String the password of jabber server user
32
- # options - Hash the options for jabber http-bind service (default: Empty hash)
33
- # :host - String the jabber server host
34
- # :port - [String|Fixnum] the port of http-bind endpoint of jabber server
35
- # :bind_uri - String the http-bind uri
36
- #
37
- #
38
- # Examples
39
- #
40
- # Jabber::BoshSession.bind("strech@localhost/res-1", "secret-pass")
41
- # Jabber::BoshSession.bind("strech@localhost/res-1", "secret-pass", )
42
- #
43
- # Raises Jabber::AuthenticationError
44
- # Returns Jabber::BoshSession
45
- def self.bind(username, password, options = {})
46
- host, port, bind_uri = DEFAULTS.dup.merge!(options).values
47
-
48
- session = new(host, port, bind_uri)
49
- raise AuthenticationError, "Failed to login" unless session.authenticate(username, password)
50
-
51
- session
52
- end
53
-
54
- # Public: Create new BOSH-session (not binded to http-bind service)
55
- #
56
- # host - String the jabber server host
57
- # port - [String|Fixnum] the port of http-bind endpoint of jabber server
58
- # bind_uri - String the http-bind uri
59
- #
60
- # Examples
61
- #
62
- # Jabber::BoshSession.new("localhost", 5280, "/http-bind")
63
- #
64
- # Returns Jabber::BoshSession
65
- def initialize(host, port, bind_uri)
66
- @host, @port, @bind_uri = host, port, bind_uri
67
- @alive = false
68
- end
69
-
70
- # Public: Authenticate user in jabber server by his username and password
71
- # NOTE: This authentication is Non-SASL http://xmpp.org/extensions/xep-0078.html
72
- #
73
- # Examples
74
- #
75
- # bosh = Jabber::BoshSession.new ...
76
- # bosh.authenticate("strech@localhost/my-resource", "super-secret-password") # => true
77
- # bosh.alive? # => true
78
- #
79
- # Returns boolean
80
- def authenticate(username, password)
81
- open_new_stream
82
-
83
- @jid = username.is_a?(JID) ? username : JID.new(username)
84
- @alive = login(jid, password)
85
- end
86
-
87
- # Public: Is BOSH-session active? (no polling consider)
88
- #
89
- # Returns boolean
90
- def alive?
91
- @alive
92
- end
93
-
94
- # Public: Represent BOSH-session as json object
95
- #
96
- # Returns String
97
- def to_json
98
- {jid: jid.to_s, rid: rid, sid: sid}.to_json
99
- end
100
-
101
- private
102
- # Internal: Send open stream command to jabber server
103
- #
104
- # Raises XMLMalformedError
105
- # Returns boolean
106
- def open_new_stream
107
- Jabber.debug("Open stream for bosh session")
108
-
109
- body = Ox::Element.new("body").tap do |element|
110
- element[:xmlns] = "http://jabber.org/protocol/httpbind"
111
- element[:content] = "text/xml; charset=utf-8"
112
- element[:rid] = generate_next_rid
113
- element[:to] = host
114
- element[:secure] = true
115
- element[:wait] = 60
116
- element[:hold] = 1
117
- end
118
-
119
- response = post(Ox.dump body)
120
- xml = Ox.parse(response.body.tr("'", '"'))
121
-
122
- [:sid, :authid].each do |m|
123
- raise XMLMalformedError,
124
- "Couldn't find <body /> attribute [#{m}]" if xml[m].nil?
125
- end
126
-
127
- @sid, @stream_id = xml.sid, xml.authid
128
-
129
- true
130
- end
131
-
132
- # Internal: Send login request to jabber server
133
- #
134
- # jid - Jabber::JID the jid of jabber user
135
- # password - String the password of jabber user
136
- #
137
- # Raises ArgumentError
138
- # Raises XMLMalformedError
139
- # Returns boolean
140
- def login(jid, password)
141
- raise ArgumentError,
142
- "Jabber::JID expected, but #{jid.class} was given" unless jid.is_a?(JID)
143
-
144
- query = Ox::Element.new("query").tap do |element|
145
- element[:xmlns] = "jabber:iq:auth"
146
-
147
- element << (Ox::Element.new("username") << jid.node)
148
- element << (Ox::Element.new("digest") << generate_digest_for(stream_id, password))
149
- element << (Ox::Element.new("resource") << jid.resource)
150
- end
151
-
152
- iq = Ox::Element.new("iq").tap do |element|
153
- element[:xmlns] = "jabber:client"
154
- element[:type] = "set"
155
- element[:id] = Jabber.gen_random_id
156
-
157
- element << query
158
- end
159
-
160
- body = Ox::Element.new("body").tap do |element|
161
- element[:xmlns] = 'http://jabber.org/protocol/httpbind'
162
- element[:content] = "text/xml; charset=utf-8"
163
- element[:rid] = generate_next_rid
164
- element[:sid] = sid
165
-
166
- element << iq
167
- end
168
-
169
- response = post(Ox.dump body)
170
- xml = Ox.parse(response.body.tr("'", '"'))
171
-
172
- raise XMLMalformedError, "Couldn't find xml tag <iq/>" if xml.locate("iq").empty?
173
- return false unless xml.iq[:type] == "result"
174
-
175
- @rid = body.rid
176
-
177
- true
178
- end
179
-
180
- # Internal: Send HTTP-post request on HTTP-bind uri
181
- #
182
- # body - String data, which will be sended
183
- #
184
- # Examples
185
- #
186
- # post(%Q[<body><iq id="1"/></body>]) # => Net::HTTPSuccess
187
- #
188
- # Raises Net::HTTPBadResponse
189
- # Returns Net:HttpResponse
190
- def post(body)
191
- request = Net::HTTP::Post.new(bind_uri)
192
- request.body = body
193
- request.content_length = request.body.size
194
- request["Content-Type"] = "text/xml; charset=utf-8"
195
-
196
- Jabber.debug("Sending POST request - #{body.strip}")
197
-
198
- response = Net::HTTP.new(host, port).start { |http| http.request(request) }
199
-
200
- Jabber.debug("Receiving - #{response.code}: #{response.body.inspect}")
201
-
202
- unless response.is_a?(Net::HTTPSuccess)
203
- raise Net::HTTPBadResponse, "Net::HTTPSuccess expected, but #{response.class} was received"
204
- end
205
-
206
- response
207
- end
208
-
209
- # Internal: Generate hex string consist of concatination of all arguments
210
- #
211
- # Returns String
212
- def generate_digest_for(*args)
213
- Digest::SHA1.hexdigest(args.join)
214
- end
215
-
216
- # Internal: Generate next request id for http post request
217
- #
218
- # Returns Fixnum
219
- def generate_next_rid
220
- @rid ||= rand(1_000_000_000)
221
- @rid += 1
222
- end
223
- end
224
- end