module OpenID::Yadis::XRI

Constants

XRI_AUTHORITIES

The '(' is for cross-reference authorities, and hopefully has a matching ')' somewhere.

Public Class Methods

append_args(url, args) click to toggle source
# File lib/openid/yadis/xrires.rb, line 77
def self.append_args(url, args)
  return url if args.length == 0

  # rstrip question marks
  rstripped = url.dup
  while rstripped[-1].chr == '?'
    rstripped = rstripped[0...rstripped.length-1]
  end

  if rstripped.index('?')
    sep = '&'
  else
    sep = '?'
  end

  return url + sep + XRI.urlencode(args)
end
escape_for_iri(xri) click to toggle source

Note this is not not idempotent, so do not apply this more than once. XRI Syntax section 2.3.2

# File lib/openid/yadis/xri.rb, line 34
def self.escape_for_iri(xri)
  esc = xri.dup
  # encode all %
  esc.gsub!(/%/, '%25')
  esc.gsub!(/\((.*?)\)/) { |xref_match|
    xref_match.gsub(/[\/\?\#]/) { |char_match|
      CGI::escape(char_match)
    }
  }
  return esc
end
identifier_scheme(identifier) click to toggle source
# File lib/openid/yadis/xri.rb, line 12
def self.identifier_scheme(identifier)
  if (!identifier.nil? and
      identifier.length > 0 and
      (identifier.match('^xri://') or
       XRI_AUTHORITIES.member?(identifier[0].chr)))
    return :xri
  else
    return :uri
  end
end
iri_to_uri(iri) click to toggle source

RFC 3987 section 3.1

# File lib/openid/yadis/xri.rb, line 54
def self.iri_to_uri(iri)
  uri = iri.dup
  # for char in ucschar or iprivate
  # convert each char to %HH%HH%HH (as many %HH as octets)
  return uri
end
make_xri(xri) click to toggle source
# File lib/openid/yadis/xri.rb, line 82
def self.make_xri(xri)
  if xri.index('xri://') != 0
    xri = 'xri://' + xri
  end
  return xri
end
provider_is_authoritative(provider_id, canonical_id) click to toggle source
# File lib/openid/yadis/xri.rb, line 61
def self.provider_is_authoritative(provider_id, canonical_id)
  lastbang = canonical_id.rindex('!')
  return false unless lastbang
  parent = canonical_id[0...lastbang]
  return parent == provider_id
end
root_authority(xri) click to toggle source
# File lib/openid/yadis/xri.rb, line 68
def self.root_authority(xri)
  xri = xri[6..-1] if xri.index('xri://') == 0
  authority = xri.split('/', 2)[0]
  if authority[0].chr == '('
    root = authority[0...authority.index(')')+1]
  elsif XRI_AUTHORITIES.member?(authority[0].chr)
    root = authority[0].chr
  else
    root = authority.split(/[!*]/)[0]
  end

  self.make_xri(root)
end
to_iri_normal(xri) click to toggle source

Transform an XRI reference to an IRI reference. Note this is not not idempotent, so do not apply this to an identifier more than once. XRI Syntax section 2.3.1

# File lib/openid/yadis/xri.rb, line 26
def self.to_iri_normal(xri)
  iri = xri.dup
  iri.insert(0, 'xri://') if not iri.match('^xri://')
  return escape_for_iri(iri)
end
to_uri_normal(xri) click to toggle source

Transform an XRI reference to a URI reference. Note this is not not idempotent, so do not apply this to an identifier more than once. XRI Syntax section 2.3.1

# File lib/openid/yadis/xri.rb, line 49
def self.to_uri_normal(xri)
  return iri_to_uri(to_iri_normal(xri))
end
urlencode(args) click to toggle source
# File lib/openid/yadis/xrires.rb, line 69
def self.urlencode(args)
  a = []
  args.each do |key, val|
    a << (CGI::escape(key) + "=" + CGI::escape(val))
  end
  a.join("&")
end