xmpp4r 0.4 → 0.5
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/CHANGELOG +8 -0
- data/README.rdoc +4 -1
- data/Rakefile +10 -20
- data/data/doc/xmpp4r/examples/advanced/versionpoll.rb +20 -1
- data/lib/xmpp4r/bytestreams/helper/ibb/target.rb +7 -0
- data/lib/xmpp4r/bytestreams/helper/socks5bytestreams/target.rb +7 -1
- data/lib/xmpp4r/callbacks.rb +9 -0
- data/lib/xmpp4r/caps/c.rb +14 -0
- data/lib/xmpp4r/caps/helper/helper.rb +1 -4
- data/lib/xmpp4r/client.rb +42 -15
- data/lib/xmpp4r/connection.rb +7 -3
- data/lib/xmpp4r/debuglog.rb +22 -1
- data/lib/xmpp4r/discovery.rb +1 -0
- data/lib/xmpp4r/discovery/helper/helper.rb +58 -0
- data/lib/xmpp4r/discovery/iq/discoinfo.rb +2 -2
- data/lib/xmpp4r/discovery/iq/discoitems.rb +2 -2
- data/lib/xmpp4r/errors.rb +5 -2
- data/lib/xmpp4r/httpbinding/client.rb +9 -19
- data/lib/xmpp4r/last.rb +2 -0
- data/lib/xmpp4r/last/helper/helper.rb +37 -0
- data/lib/xmpp4r/last/iq/last.rb +67 -0
- data/lib/xmpp4r/location.rb +2 -0
- data/lib/xmpp4r/location/helper/helper.rb +56 -0
- data/lib/xmpp4r/location/location.rb +179 -0
- data/lib/xmpp4r/message.rb +32 -0
- data/lib/xmpp4r/presence.rb +1 -1
- data/lib/xmpp4r/pubsub/children/configuration.rb +1 -1
- data/lib/xmpp4r/pubsub/children/items.rb +11 -2
- data/lib/xmpp4r/pubsub/children/publish.rb +14 -0
- data/lib/xmpp4r/pubsub/children/retract.rb +41 -0
- data/lib/xmpp4r/pubsub/helper/nodebrowser.rb +2 -3
- data/lib/xmpp4r/pubsub/helper/nodehelper.rb +4 -4
- data/lib/xmpp4r/pubsub/helper/oauth_service_helper.rb +90 -0
- data/lib/xmpp4r/pubsub/helper/servicehelper.rb +58 -19
- data/lib/xmpp4r/reliable.rb +168 -0
- data/lib/xmpp4r/rexmladdons.rb +6 -0
- data/lib/xmpp4r/roster/helper/roster.rb +5 -2
- data/lib/xmpp4r/sasl.rb +19 -8
- data/lib/xmpp4r/stream.rb +133 -31
- data/lib/xmpp4r/streamparser.rb +9 -1
- data/lib/xmpp4r/test/listener_mocker.rb +118 -0
- data/lib/xmpp4r/xmpp4r.rb +3 -1
- data/test/bytestreams/tc_ibb.rb +6 -4
- data/test/bytestreams/tc_socks5bytestreams.rb +3 -2
- data/test/caps/tc_helper.rb +4 -2
- data/test/dataforms/tc_data.rb +1 -1
- data/test/last/tc_helper.rb +75 -0
- data/test/lib/clienttester.rb +43 -14
- data/test/muc/tc_muc_mucclient.rb +6 -2
- data/test/pubsub/tc_helper.rb +131 -8
- data/test/pubsub/tc_nodeconfig.rb +7 -0
- data/test/reliable/tc_disconnect_cleanup.rb +334 -0
- data/test/reliable/tc_disconnect_exception.rb +37 -0
- data/test/reliable/tc_listener_mocked_test.rb +68 -0
- data/test/reliable/tc_reliable_connection.rb +31 -0
- data/test/roster/tc_helper.rb +21 -11
- data/test/rpc/tc_helper.rb +2 -2
- data/test/tc_callbacks.rb +3 -3
- data/test/tc_message.rb +15 -0
- data/test/tc_stream.rb +59 -121
- data/test/tc_streamError.rb +2 -4
- data/test/tc_streamparser.rb +26 -13
- data/test/ts_xmpp4r.rb +0 -9
- data/test/tune/tc_helper_recv.rb +0 -2
- data/test/vcard/tc_helper.rb +1 -1
- data/xmpp4r.gemspec +31 -84
- metadata +116 -167
- data/lib/xmpp4r/bytestreams/helper/socks5bytestreams/target.rb.orig +0 -62
data/lib/xmpp4r/message.rb
CHANGED
@@ -11,6 +11,8 @@ module Jabber
|
|
11
11
|
# which is used for all messaging communication.
|
12
12
|
class Message < XMPPStanza
|
13
13
|
|
14
|
+
CHAT_STATES = %w(active composing gone inactive paused).freeze
|
15
|
+
|
14
16
|
name_xmlns 'message', 'jabber:client'
|
15
17
|
force_xmlns true
|
16
18
|
|
@@ -144,5 +146,35 @@ module Jabber
|
|
144
146
|
def thread
|
145
147
|
first_element_text('thread')
|
146
148
|
end
|
149
|
+
|
150
|
+
##
|
151
|
+
# Returns the current chat state, or nil if no chat state is set
|
152
|
+
def chat_state
|
153
|
+
each_elements(*CHAT_STATES) { |el| return el.name.to_sym }
|
154
|
+
return nil
|
155
|
+
end
|
156
|
+
|
157
|
+
##
|
158
|
+
# Sets the chat state :active, :composing, :gone, :inactive, :paused
|
159
|
+
def chat_state=(s)
|
160
|
+
s = s.to_s
|
161
|
+
raise InvalidChatState, "Chat state must be one of #{CHAT_STATES.join(', ')}" unless CHAT_STATES.include?(s)
|
162
|
+
CHAT_STATES.each { |state| delete_elements(state) }
|
163
|
+
add_element(REXML::Element.new(s).add_namespace('http://jabber.org/protocol/chatstates'))
|
164
|
+
end
|
165
|
+
|
166
|
+
##
|
167
|
+
# Sets the message's chat state
|
168
|
+
def set_chat_state(s)
|
169
|
+
self.state = s
|
170
|
+
self
|
171
|
+
end
|
172
|
+
|
173
|
+
CHAT_STATES.each do |state|
|
174
|
+
define_method("#{state}?") do
|
175
|
+
chat_state == state.to_sym
|
176
|
+
end
|
177
|
+
end
|
178
|
+
|
147
179
|
end
|
148
180
|
end
|
data/lib/xmpp4r/presence.rb
CHANGED
@@ -18,7 +18,7 @@ module Jabber
|
|
18
18
|
|
19
19
|
##
|
20
20
|
# Create presence stanza
|
21
|
-
# show:: [
|
21
|
+
# show:: [Symbol] Initial Availability Status (see show)
|
22
22
|
# status:: [String] Initial status message
|
23
23
|
# priority:: [Fixnum] Initial priority value
|
24
24
|
def initialize(show=nil, status=nil, priority=nil)
|
@@ -10,6 +10,7 @@ module Jabber
|
|
10
10
|
# Items
|
11
11
|
# a collection of Items
|
12
12
|
class Items < XMPPElement
|
13
|
+
include Enumerable
|
13
14
|
name_xmlns 'items', NS_PUBSUB
|
14
15
|
|
15
16
|
def node
|
@@ -22,13 +23,21 @@ module Jabber
|
|
22
23
|
attributes['subid']
|
23
24
|
end
|
24
25
|
def subid=(mysubid)
|
25
|
-
attributes['subid'] = mysubid
|
26
|
+
attributes['subid'] = mysubid.to_s
|
26
27
|
end
|
27
28
|
def max_items
|
28
29
|
attributes['max_items']
|
29
30
|
end
|
30
31
|
def max_items=(mymaxitems)
|
31
|
-
attributes['max_items'] = mymaxitems
|
32
|
+
attributes['max_items'] = mymaxitems.to_s
|
33
|
+
end
|
34
|
+
|
35
|
+
def items
|
36
|
+
get_elements("item")
|
37
|
+
end
|
38
|
+
|
39
|
+
def each(&block)
|
40
|
+
items.each(&block)
|
32
41
|
end
|
33
42
|
end
|
34
43
|
|
@@ -13,7 +13,21 @@ module Jabber
|
|
13
13
|
# A <publish> XMPP element, see example 1 in
|
14
14
|
# http://www.xmpp.org/extensions/xep-0060.html#intro-howitworks
|
15
15
|
class Publish < XMPPElement
|
16
|
+
include Enumerable
|
16
17
|
name_xmlns 'publish', NS_PUBSUB
|
18
|
+
|
19
|
+
##
|
20
|
+
# support for enumerating <item> elements
|
21
|
+
def each(&block)
|
22
|
+
items.each(&block)
|
23
|
+
end
|
24
|
+
|
25
|
+
##
|
26
|
+
# return child <item> elements
|
27
|
+
def items
|
28
|
+
get_elements("item")
|
29
|
+
end
|
30
|
+
|
17
31
|
##
|
18
32
|
# return the node for this publication
|
19
33
|
def node
|
@@ -0,0 +1,41 @@
|
|
1
|
+
# =XMPP4R - XMPP Library for Ruby
|
2
|
+
# License:: Ruby's license (see the LICENSE file) or GNU GPL, at your option.
|
3
|
+
# Website::http://home.gna.org/xmpp4r/
|
4
|
+
|
5
|
+
require 'xmpp4r/xmppelement'
|
6
|
+
|
7
|
+
module Jabber
|
8
|
+
module PubSub
|
9
|
+
|
10
|
+
##
|
11
|
+
# Retract
|
12
|
+
#
|
13
|
+
# A <retract> XMPP element, see example 103 in
|
14
|
+
# http://xmpp.org/extensions/xep-0060.html#publisher-delete
|
15
|
+
class Retract < XMPPElement
|
16
|
+
name_xmlns 'retract', NS_PUBSUB
|
17
|
+
##
|
18
|
+
# get the node for this retraction
|
19
|
+
def node
|
20
|
+
attributes['node']
|
21
|
+
end
|
22
|
+
|
23
|
+
##
|
24
|
+
# set the node for this retraction
|
25
|
+
def node=(s)
|
26
|
+
attributes['node'] = s
|
27
|
+
end
|
28
|
+
|
29
|
+
##
|
30
|
+
# Get <item/> children
|
31
|
+
def items
|
32
|
+
res = []
|
33
|
+
each_element('item') { |item|
|
34
|
+
res << item
|
35
|
+
}
|
36
|
+
res
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
@@ -45,10 +45,10 @@ module Jabber
|
|
45
45
|
iq.from = @stream.jid
|
46
46
|
iq.add(Discovery::IqQueryDiscoItems.new)
|
47
47
|
nodes = []
|
48
|
-
@stream.send_with_id(iq)
|
48
|
+
@stream.send_with_id(iq) do |answer|
|
49
49
|
answer.query.each_element('item') do |item|
|
50
50
|
nodes.push( {'node' => item.node,'name' => item.iname } )
|
51
|
-
|
51
|
+
end
|
52
52
|
end
|
53
53
|
nodes
|
54
54
|
end
|
@@ -95,7 +95,6 @@ module Jabber
|
|
95
95
|
info['type'] = identity.type
|
96
96
|
info['category'] = identity.category
|
97
97
|
info['features'] = answer.query.features
|
98
|
-
|
99
98
|
answer.query.each_element('x') { |x|
|
100
99
|
info['nodeinformation'] = x
|
101
100
|
}
|
@@ -30,7 +30,7 @@ module Jabber
|
|
30
30
|
@jid = jid
|
31
31
|
@stream = stream
|
32
32
|
|
33
|
-
if create_if_not_exist and
|
33
|
+
if create_if_not_exist and !node_exist?
|
34
34
|
# if no nodename is given a instant node will created
|
35
35
|
# (if the service supports instant nodes)
|
36
36
|
@nodename = create_node
|
@@ -87,7 +87,7 @@ module Jabber
|
|
87
87
|
# gets all items from the node
|
88
88
|
# get_all_items
|
89
89
|
def get_all_items
|
90
|
-
|
90
|
+
get_items_from(@nodename)
|
91
91
|
end
|
92
92
|
|
93
93
|
##
|
@@ -95,7 +95,7 @@ module Jabber
|
|
95
95
|
# get_items(count)
|
96
96
|
# count:: [Fixnum]
|
97
97
|
def get_items(count)
|
98
|
-
|
98
|
+
get_items_from(@nodename,count)
|
99
99
|
end
|
100
100
|
|
101
101
|
##
|
@@ -153,4 +153,4 @@ module Jabber
|
|
153
153
|
|
154
154
|
end #class
|
155
155
|
end #module
|
156
|
-
end #module
|
156
|
+
end #module
|
@@ -0,0 +1,90 @@
|
|
1
|
+
module Jabber
|
2
|
+
module PubSub
|
3
|
+
# Jabber::Stream helper that will transparently sign PubSub requests
|
4
|
+
module OAuthPubSubStreamHelper
|
5
|
+
attr_accessor :pubsubjid, :oauth_consumer, :oauth_token, :oauth_options
|
6
|
+
|
7
|
+
# enhanced #send_with_id method that signs stanzas
|
8
|
+
def send_with_id(iq)
|
9
|
+
if iq.first_element("pubsub")
|
10
|
+
oauth = OAuthServiceHelper.create_oauth_node(self.jid, self.pubsubjid, self.oauth_consumer, self.oauth_token, self.oauth_options)
|
11
|
+
iq.pubsub.add(oauth)
|
12
|
+
end
|
13
|
+
|
14
|
+
super(iq)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
# PubSub service helper for use with OAuth-authenticated nodes
|
19
|
+
class OAuthServiceHelper < ServiceHelper
|
20
|
+
def initialize(stream, pubsubjid, oauth_consumer, oauth_token, options = {})
|
21
|
+
# imbue the stream with magical OAuth signing powers
|
22
|
+
stream.extend(OAuthPubSubStreamHelper)
|
23
|
+
stream.oauth_consumer = oauth_consumer
|
24
|
+
stream.oauth_token = oauth_token
|
25
|
+
stream.oauth_options = options
|
26
|
+
stream.pubsubjid = pubsubjid
|
27
|
+
|
28
|
+
super(stream, pubsubjid)
|
29
|
+
end
|
30
|
+
|
31
|
+
# add the OAuth sauce (XEP-0235)
|
32
|
+
# The `options` hash may contain the following parameters:
|
33
|
+
# :oauth_nonce => nonce (one will be generated otherwise)
|
34
|
+
# :oauth_timestamp => timestamp (one will be generated otherwise)
|
35
|
+
# :oauth_signature_method => signature method (defaults to HMAC-SHA1)
|
36
|
+
# :oauth_version => OAuth version (defaults to "1.0")
|
37
|
+
def self.create_oauth_node(jid, pubsubjid, oauth_consumer, oauth_token, options = {})
|
38
|
+
require 'oauth'
|
39
|
+
|
40
|
+
request = OAuth::RequestProxy.proxy \
|
41
|
+
"method" => "iq",
|
42
|
+
"uri" => [jid.strip.to_s, pubsubjid.strip.to_s] * "&",
|
43
|
+
"parameters" => {
|
44
|
+
"oauth_consumer_key" => oauth_consumer.key,
|
45
|
+
"oauth_nonce" => options[:oauth_nonce] || OAuth::Helper.generate_nonce,
|
46
|
+
"oauth_timestamp" => options[:oauth_timestamp] || OAuth::Helper.generate_timestamp,
|
47
|
+
"oauth_token" => oauth_token.token,
|
48
|
+
"oauth_signature_method" => options[:oauth_signature_method] || "HMAC-SHA1",
|
49
|
+
"oauth_version" => options[:oauth_version] || "1.0"
|
50
|
+
}
|
51
|
+
|
52
|
+
request.sign!(:consumer => oauth_consumer, :token => oauth_token)
|
53
|
+
|
54
|
+
# TODO create XMPPElements for OAuth elements
|
55
|
+
oauth = REXML::Element.new("oauth")
|
56
|
+
oauth.attributes['xmlns'] = 'urn:xmpp:oauth:0'
|
57
|
+
|
58
|
+
oauth_consumer_key = REXML::Element.new("oauth_consumer_key")
|
59
|
+
oauth_consumer_key.text = request.oauth_consumer_key
|
60
|
+
oauth.add(oauth_consumer_key)
|
61
|
+
|
62
|
+
oauth_token_node = REXML::Element.new("oauth_token")
|
63
|
+
oauth_token_node.text = request.oauth_token
|
64
|
+
oauth.add(oauth_token_node)
|
65
|
+
|
66
|
+
oauth_signature_method = REXML::Element.new("oauth_signature_method")
|
67
|
+
oauth_signature_method.text = request.oauth_signature_method
|
68
|
+
oauth.add(oauth_signature_method)
|
69
|
+
|
70
|
+
oauth_signature = REXML::Element.new("oauth_signature")
|
71
|
+
oauth_signature.text = request.oauth_signature
|
72
|
+
oauth.add(oauth_signature)
|
73
|
+
|
74
|
+
oauth_timestamp = REXML::Element.new("oauth_timestamp")
|
75
|
+
oauth_timestamp.text = request.oauth_timestamp
|
76
|
+
oauth.add(oauth_timestamp)
|
77
|
+
|
78
|
+
oauth_nonce = REXML::Element.new("oauth_nonce")
|
79
|
+
oauth_nonce.text = request.oauth_nonce
|
80
|
+
oauth.add(oauth_nonce)
|
81
|
+
|
82
|
+
oauth_version = REXML::Element.new("oauth_version")
|
83
|
+
oauth_version.text = request.oauth_version
|
84
|
+
oauth.add(oauth_version)
|
85
|
+
|
86
|
+
oauth
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
@@ -2,11 +2,11 @@
|
|
2
2
|
# License:: Ruby's license (see the LICENSE file) or GNU GPL, at your option.
|
3
3
|
# Website::http://home.gna.org/xmpp4r/
|
4
4
|
#
|
5
|
-
# It's recommented to read the XEP-0060 before you use this Helper. (Maybe its
|
5
|
+
# It's recommented to read the XEP-0060 before you use this Helper. (Maybe its
|
6
6
|
# better not use the helper for now ) ;)
|
7
7
|
# The whole code is getting better, but may still contain bugs - be careful!
|
8
|
-
#
|
9
|
-
# Maybe the following structure is good
|
8
|
+
#
|
9
|
+
# Maybe the following structure is good
|
10
10
|
# ( taken from the xep-0060 )
|
11
11
|
#
|
12
12
|
# entity usecases
|
@@ -31,12 +31,12 @@
|
|
31
31
|
# process pending subscriptions
|
32
32
|
# manage subscriptions
|
33
33
|
# manage affiliations
|
34
|
-
#
|
34
|
+
#
|
35
35
|
# collection nodes
|
36
|
-
#
|
37
|
-
# If someone want to implement something i think its better to do this in
|
36
|
+
#
|
37
|
+
# If someone want to implement something i think its better to do this in
|
38
38
|
# this order because everyone who reads the xep-0060 do know where to search in the file
|
39
|
-
#
|
39
|
+
#
|
40
40
|
require 'xmpp4r/pubsub/iq/pubsub'
|
41
41
|
require 'xmpp4r/pubsub/children/event'
|
42
42
|
require 'xmpp4r/pubsub/children/item'
|
@@ -45,6 +45,7 @@ require 'xmpp4r/pubsub/children/subscription'
|
|
45
45
|
require 'xmpp4r/pubsub/children/unsubscribe'
|
46
46
|
require 'xmpp4r/pubsub/children/node_config'
|
47
47
|
require 'xmpp4r/pubsub/children/subscription_config'
|
48
|
+
require 'xmpp4r/pubsub/children/retract'
|
48
49
|
require 'xmpp4r/dataforms'
|
49
50
|
|
50
51
|
module Jabber
|
@@ -118,12 +119,12 @@ module Jabber
|
|
118
119
|
unsub.jid = @stream.jid.strip
|
119
120
|
iq.pubsub.add(unsub)
|
120
121
|
ret = false
|
121
|
-
@stream.send_with_id(iq) { |reply|
|
122
|
+
@stream.send_with_id(iq) { |reply|
|
122
123
|
ret = reply.kind_of?(Jabber::Iq) and reply.type == :result
|
123
124
|
} # @stream.send_with_id(iq)
|
124
125
|
ret
|
125
126
|
end
|
126
|
-
|
127
|
+
|
127
128
|
##
|
128
129
|
# gets all items from a pubsub node
|
129
130
|
# node:: [String]
|
@@ -132,6 +133,7 @@ module Jabber
|
|
132
133
|
def get_items_from(node, count=nil)
|
133
134
|
iq = basic_pubsub_query(:get)
|
134
135
|
items = Jabber::PubSub::Items.new
|
136
|
+
items.max_items = count
|
135
137
|
items.node = node
|
136
138
|
iq.pubsub.add(items)
|
137
139
|
res = nil
|
@@ -148,19 +150,17 @@ module Jabber
|
|
148
150
|
end
|
149
151
|
|
150
152
|
##
|
151
|
-
# NOTE: this method sends only one item per publish request because some services
|
153
|
+
# NOTE: this method sends only one item per publish request because some services
|
152
154
|
# may not allow batch processing. Maybe this will changed in the future?
|
153
155
|
# node:: [String]
|
154
156
|
# item:: [Jabber::PubSub::Item]
|
155
157
|
# return:: true
|
156
|
-
# it automatically generates an id for the item
|
157
158
|
def publish_item_to(node,item)
|
158
159
|
iq = basic_pubsub_query(:set)
|
159
160
|
publish = iq.pubsub.add(REXML::Element.new('publish'))
|
160
161
|
publish.attributes['node'] = node
|
161
|
-
|
162
|
+
|
162
163
|
if item.kind_of?(Jabber::PubSub::Item)
|
163
|
-
item.id = Jabber::IdGenerator.generate_id
|
164
164
|
publish.add(item)
|
165
165
|
@stream.send_with_id(iq)
|
166
166
|
end
|
@@ -175,7 +175,7 @@ module Jabber
|
|
175
175
|
iq = basic_pubsub_query(:set)
|
176
176
|
publish = iq.pubsub.add(REXML::Element.new('publish'))
|
177
177
|
publish.attributes['node'] = node
|
178
|
-
|
178
|
+
|
179
179
|
if item.kind_of?(REXML::Element)
|
180
180
|
xmlitem = Jabber::PubSub::Item.new
|
181
181
|
xmlitem.id = id
|
@@ -187,6 +187,32 @@ module Jabber
|
|
187
187
|
@stream.send_with_id(iq)
|
188
188
|
end
|
189
189
|
|
190
|
+
##
|
191
|
+
# deletes an item from a persistent node
|
192
|
+
# node:: [String]
|
193
|
+
# item_id:: [String] or [Array] of [String]
|
194
|
+
# return:: true
|
195
|
+
def delete_item_from(node, item_id)
|
196
|
+
iq = basic_pubsub_query(:set)
|
197
|
+
retract = iq.pubsub.add(Jabber::PubSub::Retract.new)
|
198
|
+
retract.node = node
|
199
|
+
|
200
|
+
if item_id.kind_of? Array
|
201
|
+
item_id.each { |id|
|
202
|
+
xmlitem = Jabber::PubSub::Item.new
|
203
|
+
xmlitem.id = id
|
204
|
+
retract.add(xmlitem)
|
205
|
+
}
|
206
|
+
else
|
207
|
+
xmlitem = Jabber::PubSub::Item.new
|
208
|
+
xmlitem.id = item_id
|
209
|
+
retract.add(xmlitem)
|
210
|
+
end
|
211
|
+
|
212
|
+
@stream.send_with_id(iq)
|
213
|
+
end
|
214
|
+
|
215
|
+
|
190
216
|
##
|
191
217
|
# purges all items on a persistent node
|
192
218
|
# node:: [String]
|
@@ -256,8 +282,8 @@ module Jabber
|
|
256
282
|
# options:: [Jabber::PubSub::NodeConfig]
|
257
283
|
# return:: true on success
|
258
284
|
def set_config_for(node, config)
|
259
|
-
iq = basic_pubsub_query(
|
260
|
-
iq.pubsub.add(config
|
285
|
+
iq = basic_pubsub_query(:set, true)
|
286
|
+
iq.pubsub.add(config)
|
261
287
|
@stream.send_with_id(iq)
|
262
288
|
end
|
263
289
|
|
@@ -271,6 +297,19 @@ module Jabber
|
|
271
297
|
@stream.send_with_id(iq)
|
272
298
|
end
|
273
299
|
|
300
|
+
def set_affiliations(node, jid, role = 'publisher')
|
301
|
+
iq = basic_pubsub_query(:set, true)
|
302
|
+
affiliations = iq.pubsub.add(REXML::Element.new('affiliations'))
|
303
|
+
affiliations.attributes['node'] = node
|
304
|
+
affiliation = affiliations.add(REXML::Element.new('affiliation'))
|
305
|
+
affiliation.attributes['jid'] = jid.to_s
|
306
|
+
affiliation.attributes['affiliation'] = role.to_s
|
307
|
+
res = nil
|
308
|
+
@stream.send_with_id(iq) { |reply|
|
309
|
+
true
|
310
|
+
}
|
311
|
+
res
|
312
|
+
end
|
274
313
|
|
275
314
|
##
|
276
315
|
# shows the affiliations on a pubsub service
|
@@ -316,7 +355,7 @@ module Jabber
|
|
316
355
|
if reply.pubsub.first_element('subscriptions').attributes['node'] == node
|
317
356
|
reply.pubsub.first_element('subscriptions').each_element('subscription') { |subscription|
|
318
357
|
res << PubSub::Subscription.import(subscription)
|
319
|
-
}
|
358
|
+
}
|
320
359
|
end
|
321
360
|
end
|
322
361
|
true
|
@@ -359,7 +398,7 @@ module Jabber
|
|
359
398
|
# jid:: [Jabber::JID] or [String]
|
360
399
|
# options:: [Jabber::PubSub::SubscriptionConfig} specifying configuration options
|
361
400
|
# subid:: [String] or nil
|
362
|
-
# return:: true
|
401
|
+
# return:: true
|
363
402
|
def set_options_for(node, jid, options, subid = nil)
|
364
403
|
iq = basic_pubsub_query(:set)
|
365
404
|
iq.pubsub.add(Jabber::PubSub::SubscriptionConfig.new(node, jid.kind_of?(String) ? Jabber::JID.new(jid).strip: jid.strip, options, subid))
|
@@ -370,7 +409,7 @@ module Jabber
|
|
370
409
|
|
371
410
|
ret
|
372
411
|
end
|
373
|
-
|
412
|
+
|
374
413
|
##
|
375
414
|
# String representation
|
376
415
|
# result:: [String] The PubSub service's JID
|