Module: OpenID::Yadis::XRI

Defined in:
lib/openid/yadis/xri.rb,
lib/openid/yadis/xrires.rb

Defined Under Namespace

Classes: ProxyResolver, XRIHTTPError

Constant Summary collapse

XRI_AUTHORITIES =

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

["!", "=", "@", "+", "$", "("]

Class Method Summary collapse

Class Method Details

.append_args(url, args) ⇒ Object



77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
# 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) ⇒ Object

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



34
35
36
37
38
39
40
41
42
43
44
# 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) ⇒ Object



12
13
14
15
16
17
18
19
20
21
# 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) ⇒ Object

RFC 3987 section 3.1



54
55
56
57
58
59
# 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) ⇒ Object



82
83
84
85
86
87
# 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) ⇒ Object



61
62
63
64
65
66
# 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) ⇒ Object



68
69
70
71
72
73
74
75
76
77
78
79
80
# 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) ⇒ Object

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



26
27
28
29
30
# 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) ⇒ Object

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



49
50
51
# 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) ⇒ Object



69
70
71
72
73
74
75
# 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