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)
- ESCAPE_TABLE =
{ '&' => '&', '<' => '<', '>' => '>', '"' => '"', "'" => ''' }
- @@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
-
.html_encode(s) ⇒ Object
Modified from ERb’s html_encode.
- .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
65 66 67 68 69 70 71 72 73 74 75 |
# File 'lib/openid/util.rb', line 65 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
32 33 34 35 36 |
# File 'lib/openid/util.rb', line 32 def Util.assert(value, =nil) if not value raise AssertionError, or value end end |
.auto_submit_html(form, title = 'OpenID transaction in progress') ⇒ Object
93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 |
# File 'lib/openid/util.rb', line 93 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
42 43 44 45 46 47 48 |
# File 'lib/openid/util.rb', line 42 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(s) ⇒ Object
Modified from ERb’s html_encode
114 115 116 |
# File 'lib/openid/util.rb', line 114 def Util.html_encode(s) s.to_s.gsub(/[&<>"']/) {|s| ESCAPE_TABLE[s] } 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
89 90 91 |
# File 'lib/openid/util.rb', line 89 def Util.log() logger.info() end |
.logger ⇒ Object
84 85 86 |
# File 'lib/openid/util.rb', line 84 def Util.logger @@logger end |
.logger=(logger) ⇒ Object
80 81 82 |
# File 'lib/openid/util.rb', line 80 def Util.logger=(logger) @@logger = logger end |
.parse_query(qs) ⇒ Object
59 60 61 62 63 |
# File 'lib/openid/util.rb', line 59 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
38 39 40 |
# File 'lib/openid/util.rb', line 38 def Util.to_base64(s) [s].pack('m').gsub("\n", "") end |
.urlencode(args) ⇒ Object
50 51 52 53 54 55 56 57 |
# File 'lib/openid/util.rb', line 50 def Util.urlencode(args) a = [] args.each do |key, val| val = '' unless val a << (CGI::escape(key) + "=" + CGI::escape(val)) end a.join("&") end |