Module: OpenID::Util
- Defined in:
- lib/openid/util.rb,
lib/openid/kvform.rb
Constant Summary collapse
- BASE64_CHARS =
('ABCDEFGHIJKLMNOPQRSTUVWXYZ' \ 'abcdefghijklmnopqrstuvwxyz0123456789+/')
- BASE64_RE =
Regexp.compile(" \\A ([#{BASE64_CHARS}]{4})* ([#{BASE64_CHARS}]{2}==| [#{BASE64_CHARS}]{3}=)? \\Z", Regexp::EXTENDED)
- @@logger =
Logger.new(STDERR)
Class Method Summary collapse
- .append_args(url, args) ⇒ Object
- .assert(value, message = nil) ⇒ Object
- .auto_submit_html(form, title = 'OpenID transaction in progress') ⇒ Object
- .dict_to_kv(d) ⇒ Object
- .from_base64(s) ⇒ Object
- .kv_to_dict(s) ⇒ Object
- .kv_to_seq(data, strict = false) ⇒ Object
-
.log(message) ⇒ Object
change the message below to do whatever you like for logging.
- .logger ⇒ Object
- .logger=(logger) ⇒ Object
- .parse_query(qs) ⇒ Object
- .seq_to_kv(seq, strict = false) ⇒ Object
- .to_base64(s) ⇒ Object
- .urlencode(args) ⇒ Object
Class Method Details
.append_args(url, args) ⇒ Object
62 63 64 65 66 67 68 69 70 71 72 |
# File 'lib/openid/util.rb', line 62 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) ⇒ Object
29 30 31 32 33 |
# File 'lib/openid/util.rb', line 29 def Util.assert(value, =nil) if not value raise AssertionError, or value end end |
.auto_submit_html(form, title = 'OpenID transaction in progress') ⇒ Object
90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 |
# File 'lib/openid/util.rb', line 90 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) ⇒ Object
127 128 129 |
# File 'lib/openid/kvform.rb', line 127 def Util.dict_to_kv(d) return seq_to_kv(d.entries.sort) end |
.from_base64(s) ⇒ Object
39 40 41 42 43 44 45 |
# File 'lib/openid/util.rb', line 39 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 |
.kv_to_dict(s) ⇒ Object
131 132 133 134 |
# 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) ⇒ Object
63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 |
# 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) ⇒ Object
change the message below to do whatever you like for logging
86 87 88 |
# File 'lib/openid/util.rb', line 86 def Util.log() logger.info() end |
.logger ⇒ Object
81 82 83 |
# File 'lib/openid/util.rb', line 81 def Util.logger @@logger end |
.logger=(logger) ⇒ Object
77 78 79 |
# File 'lib/openid/util.rb', line 77 def Util.logger=(logger) @@logger = logger end |
.parse_query(qs) ⇒ Object
56 57 58 59 60 |
# File 'lib/openid/util.rb', line 56 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) ⇒ Object
9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 |
# 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) ⇒ Object
35 36 37 |
# File 'lib/openid/util.rb', line 35 def Util.to_base64(s) [s].pack('m').gsub("\n", "") end |
.urlencode(args) ⇒ Object
47 48 49 50 51 52 53 54 |
# File 'lib/openid/util.rb', line 47 def Util.urlencode(args) a = [] args.each do |key, val| val = '' unless val a << (CGI::escape(key) + "=" + CGI::escape(val)) end a.join("&") end |