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



33
34
35
36
37
38
39
40
41
42
43
# File 'lib/openid/yadis/xri.rb', line 33

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



11
12
13
14
15
16
17
18
19
20
# File 'lib/openid/yadis/xri.rb', line 11

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



53
54
55
56
57
58
# File 'lib/openid/yadis/xri.rb', line 53

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



81
82
83
84
85
86
# File 'lib/openid/yadis/xri.rb', line 81

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



60
61
62
63
64
65
# File 'lib/openid/yadis/xri.rb', line 60

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



67
68
69
70
71
72
73
74
75
76
77
78
79
# File 'lib/openid/yadis/xri.rb', line 67

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



25
26
27
28
29
# File 'lib/openid/yadis/xri.rb', line 25

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



48
49
50
# File 'lib/openid/yadis/xri.rb', line 48

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