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(str) ⇒ 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
67 68 69 70 71 72 73 74 75 76 77 |
# 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) ⇒ Object
27 28 29 30 31 |
# File 'lib/openid/util.rb', line 27 def Util.assert(value, =nil) if not value raise AssertionError, or value end end |
.auto_submit_html(form, title = 'OpenID transaction in progress') ⇒ Object
95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 |
# 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) ⇒ 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
37 38 39 40 41 42 43 |
# 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) ⇒ Object
Modified from ERb’s html_encode
116 117 118 |
# 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) ⇒ 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
91 92 93 |
# File 'lib/openid/util.rb', line 91 def Util.log() logger.info() end |
.logger ⇒ Object
86 87 88 |
# File 'lib/openid/util.rb', line 86 def Util.logger @@logger end |
.logger=(logger) ⇒ Object
82 83 84 |
# File 'lib/openid/util.rb', line 82 def Util.logger=(logger) @@logger = logger end |
.parse_query(qs) ⇒ Object
61 62 63 64 65 |
# 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) ⇒ 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
33 34 35 |
# File 'lib/openid/util.rb', line 33 def Util.to_base64(s) [s].pack('m').gsub("\n", "") end |
.urlencode(args) ⇒ Object
45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 |
# 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 |