module OpenID::Util

Constants

BASE64_CHARS
BASE64_RE
ESCAPE_TABLE

Public Class Methods

append_args(url, args) click to toggle source
# File lib/openid/util.rb, line 67
def Util.append_args(url, args)
  url = url.dup
  return url if args.length == 0

  if args.respond_to?('each_pair')
    args = args.sort
  end

  url << (url.include?("?") ? "&" : "?")
  url << Util.urlencode(args)
end
assert(value, message=nil) click to toggle source
# File lib/openid/util.rb, line 27
def Util.assert(value, message=nil)
  if not value
    raise AssertionError, message or value
  end
end
auto_submit_html(form, title='OpenID transaction in progress') click to toggle source
# File lib/openid/util.rb, line 95
    def Util.auto_submit_html(form, title='OpenID transaction in progress')
      return "
<html>
<head>
  <title>#{title}</title>
</head>
<body onload='document.forms[0].submit();'>
#{form}
<script>
var elements = document.forms[0].elements;
for (var i = 0; i < elements.length; i++) {
  elements[i].style.display = \"none\";
}
</script>
</body>
</html>
"
    end
dict_to_kv(d) click to toggle source
# File lib/openid/kvform.rb, line 127
def Util.dict_to_kv(d)
  return seq_to_kv(d.entries.sort)
end
from_base64(s) click to toggle source
# File lib/openid/util.rb, line 37
def Util.from_base64(s)
  without_newlines = s.gsub(/[\r\n]+/, '')
  if !BASE64_RE.match(without_newlines)
    raise ArgumentError, "Malformed input: #{s.inspect}"
  end
  without_newlines.unpack('m').first
end
html_encode(str) click to toggle source

Modified from ERb's ::html_encode

# File lib/openid/util.rb, line 116
def Util.html_encode(str)
  str.to_s.gsub(/[&<>"']/) {|s| ESCAPE_TABLE[s] }
end
kv_to_dict(s) click to toggle source
# File lib/openid/kvform.rb, line 131
def Util.kv_to_dict(s)
  seq = kv_to_seq(s)
  return Hash[*seq.flatten]
end
kv_to_seq(data, strict=false) click to toggle source
# File lib/openid/kvform.rb, line 63
def Util.kv_to_seq(data, strict=false)
  # After one parse, seq_to_kv and kv_to_seq are inverses, with no
  # warnings:
  #
  # seq = kv_to_seq(s)
  # seq_to_kv(kv_to_seq(seq)) == seq
  err = lambda { |msg|
    msg = "kv_to_seq warning: #{msg}: #{data.inspect}"
    if strict
      raise KVFormError, msg
    else
      Util.log(msg)
    end
  }

  lines = data.split("\n")
  if data.length == 0
    return []
  end

  if data[-1].chr != "\n"
    err.call("Does not end in a newline")
    # We don't expect the last element of lines to be an empty
    # string because split() doesn't behave that way.
  end

  pairs = []
  line_num = 0
  lines.each { |line|
    line_num += 1

    # Ignore blank lines
    if line.strip() == ""
      next
    end

    pair = line.split(':', 2)
    if pair.length == 2
      k, v = pair
      k_s = k.strip()
      if k_s != k
        msg = "In line #{line_num}, ignoring leading or trailing whitespace in key #{k.inspect}"
        err.call(msg)
      end

      if k_s.length == 0
        err.call("In line #{line_num}, got empty key")
      end

      v_s = v.strip()
      if v_s != v
        msg = "In line #{line_num}, ignoring leading or trailing whitespace in value #{v.inspect}"
        err.call(msg)
      end

      pairs << [k_s, v_s]
    else
      err.call("Line #{line_num} does not contain a colon")
    end
  }

  return pairs
end
log(message) click to toggle source

change the message below to do whatever you like for logging

# File lib/openid/util.rb, line 91
def Util.log(message)
  logger.info(message)
end
logger() click to toggle source
# File lib/openid/util.rb, line 86
def Util.logger
  @@logger
end
logger=(logger) click to toggle source
# File lib/openid/util.rb, line 82
def Util.logger=(logger)
  @@logger = logger
end
parse_query(qs) click to toggle source
# File lib/openid/util.rb, line 61
def Util.parse_query(qs)
  query = {}
  CGI::parse(qs).each {|k,v| query[k] = v[0]}
  return query
end
seq_to_kv(seq, strict=false) click to toggle source
# File lib/openid/kvform.rb, line 9
def Util.seq_to_kv(seq, strict=false)
  # Represent a sequence of pairs of strings as newline-terminated
  # key:value pairs. The pairs are generated in the order given.
  #
  # @param seq: The pairs
  #
  # returns a string representation of the sequence
  err = lambda { |msg|
    msg = "seq_to_kv warning: #{msg}: #{seq.inspect}"
    if strict
      raise KVFormError, msg
    else
      Util.log(msg)
    end
  }

  lines = []
  seq.each { |k, v|
    if !k.is_a?(String)
      err.call("Converting key to string: #{k.inspect}")
      k = k.to_s
    end

    if !k.index("\n").nil?
      raise KVFormError, "Invalid input for seq_to_kv: key contains newline: #{k.inspect}"
    end

    if !k.index(":").nil?
      raise KVFormError, "Invalid input for seq_to_kv: key contains colon: #{k.inspect}"
    end

    if k.strip() != k
      err.call("Key has whitespace at beginning or end: #{k.inspect}")
    end

    if !v.is_a?(String)
      err.call("Converting value to string: #{v.inspect}")
      v = v.to_s
    end

    if !v.index("\n").nil?
      raise KVFormError, "Invalid input for seq_to_kv: value contains newline: #{v.inspect}"
    end

    if v.strip() != v
      err.call("Value has whitespace at beginning or end: #{v.inspect}")
    end

    lines << k + ":" + v + "\n"
  }

  return lines.join("")
end
to_base64(s) click to toggle source
# File lib/openid/util.rb, line 33
def Util.to_base64(s)
  [s].pack('m').gsub("\n", "")
end
urlencode(args) click to toggle source
# File lib/openid/util.rb, line 45
def Util.urlencode(args)
  a = []
  args.each do |key, val|
    if val.nil?
      val = '' 
    elsif !!val == val
      #it's boolean let's convert it to string representation
      # or else CGI::escape won't like it
      val = val.to_s
    end  

    a << (CGI::escape(key) + "=" + CGI::escape(val))
  end
  a.join("&")
end