Class: Jabber::Component

Inherits:
Connection show all
Defined in:
lib/xmpp4r/component.rb

Overview

The component class provides everything needed to build a XMPP Component.

Components are more flexible as they are only restricted in the use of a fixed domain. node and resource of JIDs are freely choosable for all stanzas.

Constant Summary

Constants inherited from Stream

Stream::CONNECTED, Stream::DISCONNECTED

Instance Attribute Summary collapse

Attributes inherited from Connection

#allow_tls, #features_timeout, #host, #keepalive_interval, #port, #ssl_capath, #ssl_verifycb, #use_ssl

Attributes inherited from Stream

#fd, #processing, #status

Instance Method Summary collapse

Methods inherited from Connection

#accept_features, #close!, #is_tls?, #starttls

Methods inherited from Stream

#add_iq_callback, #add_message_callback, #add_presence_callback, #add_stanza_callback, #add_xml_callback, #close!, #delete_iq_callback, #delete_message_callback, #delete_presence_callback, #delete_stanza_callback, #delete_xml_callback, #iq_callbacks, #is_connected?, #is_disconnected?, #message_callbacks, #on_exception, #parse_failure, #parser_end, #presence_callbacks, #receive, #send, #send_data, #send_with_id, #stanza_callbacks, #stop, #xml_callbacks

Constructor Details

#initialize(jid, server_address = nil, server_port = 5347) ⇒ Component

Create a new Component

jid
JID

26
27
28
29
30
31
32
33
34
35
36
37
38
# File 'lib/xmpp4r/component.rb', line 26

def initialize(jid, server_address=nil, server_port=5347)
  super()
  @jid = (jid.kind_of?(JID) ? jid : JID.new(jid.to_s))

  if server_address
    $stderr.puts "Passing server and port to Jabber::Component.new is " +
                 "obsolete and will vanish in some later XMPP4R release. " +
                 "Please use these arguments when calling " +
                 "Jabber::Client#connect"
    @server_address = server_address
    @server_port = server_port
  end
end

Instance Attribute Details

#jidObject (readonly)

The component's JID


16
17
18
# File 'lib/xmpp4r/component.rb', line 16

def jid
  @jid
end

#server_addressObject (readonly)

The server's address


19
20
21
# File 'lib/xmpp4r/component.rb', line 19

def server_address
  @server_address
end

#server_portObject (readonly)

The server's port


22
23
24
# File 'lib/xmpp4r/component.rb', line 22

def server_port
  @server_port
end

Instance Method Details

#auth(secret) ⇒ Object

Send auth with given secret and wait for result

Throws ComponentAuthenticationFailure

secret
String

the shared secret


85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
# File 'lib/xmpp4r/component.rb', line 85

def auth(secret)
  hash = Digest::SHA1::hexdigest(@streamid.to_s + secret)
  authenticated = false
  send("<handshake>#{hash}</handshake>") { |r|
    if r.prefix == 'stream' and r.name == 'error'
      true
    elsif r.name == 'handshake'
      authenticated = true
      true
    else
      false
    end
  }
  unless authenticated
    raise ComponentAuthenticationFailure.new, "Component authentication failed"
  end
end

#closeObject

Close the connection, sends </stream:stream> tag first


57
58
59
60
# File 'lib/xmpp4r/component.rb', line 57

def close
  send("</stream:stream>")
  super
end

#connect(server = nil, port = 5347) ⇒ Object

Connect to the server (chaining-friendly)

server
String

Hostname

port
Integer

TCP port (5347)

return

self


45
46
47
48
49
50
51
52
# File 'lib/xmpp4r/component.rb', line 45

def connect(server=nil, port=5347)
  if server
    super(server, port)
  else
    super(@server_address, @server_port)
  end
  self
end

#startObject

Start the stream-parser and send the component-specific stream opening element


69
70
71
72
73
74
75
76
77
78
# File 'lib/xmpp4r/component.rb', line 69

def start
  super
  send(generate_stream_start(@jid)) { |e|
    if e.name == 'stream'
      true
    else
      false
    end
  }
end