class Vines::Stream::Server::Outbound::Auth

Constants

FEATURES
REQUIRED

Public Class Methods

new(stream, success=AuthDialbackResult) click to toggle source
Calls superclass method
# File lib/vines/stream/server/outbound/auth.rb, line 11
def initialize(stream, success=AuthDialbackResult)
  super
end

Public Instance Methods

node(node) click to toggle source
# File lib/vines/stream/server/outbound/auth.rb, line 15
def node(node)
  # We have to remember tls_require for
  # closing or restarting the stream
  stream.outbound_tls_required(tls_required?(node))

  if stream.dialback_verify_key?
    @success = Authoritative
    stream.callback!
    advance
  elsif dialback?(node)
    secret = Kit.auth_token
    dialback_key = Kit.dialback_key(secret, stream.remote_domain, stream.domain, stream.id)
    stream.write("<db:result xmlns:db='#{NAMESPACES[:legacy_dialback]}' " \
      "from='#{stream.domain}' to='#{stream.remote_domain}'>#{dialback_key}</db:result>")
    advance
    stream.router << stream # We need to be discoverable for the dialback connection
    stream.state.dialback_secret = secret
  elsif tls?(node)
    @success = TLSResult
    stream.write("<starttls xmlns='#{NAMESPACES[:tls]}'/>")
    advance
  else
    raise StreamErrors::NotAuthorized
  end
end

Private Instance Methods

dialback?(node) click to toggle source
# File lib/vines/stream/server/outbound/auth.rb, line 48
def dialback?(node)
  dialback = node.xpath('ns:dialback', 'ns' => NAMESPACES[:dialback]).any?
  features?(node) && dialback
end
features?(node) click to toggle source
# File lib/vines/stream/server/outbound/auth.rb, line 58
def features?(node)
  node.name == FEATURES && namespace(node) == NAMESPACES[:stream]
end
tls?(node) click to toggle source
# File lib/vines/stream/server/outbound/auth.rb, line 53
def tls?(node)
  tls = node.xpath('ns:starttls', 'ns' => NAMESPACES[:tls]).any?
  features?(node) && tls
end
tls_required?(node) click to toggle source
# File lib/vines/stream/server/outbound/auth.rb, line 43
def tls_required?(node)
  child = node.xpath('ns:starttls', 'ns' => NAMESPACES[:tls]).children.first
  child && child.name == REQUIRED
end