Module: Net::IMAP::StringPrep
- Defined in:
- lib/net/imap/stringprep.rb,
lib/net/imap/stringprep/trace.rb,
lib/net/imap/stringprep/tables.rb,
lib/net/imap/stringprep/nameprep.rb,
lib/net/imap/stringprep/saslprep.rb,
lib/net/imap/stringprep/saslprep_tables.rb
Overview
– This file is generated from RFC3454, by rake. Don’t edit directly. ++
Defined Under Namespace
Modules: NamePrep, SASLprep, Tables, Trace Classes: BidiStringError, ProhibitedCodepoint, StringPrepError
Class Method Summary collapse
-
.[](table) ⇒ Object
Returns a Regexp matching the given
table
name. -
.check_bidi!(string, c_8: false, profile: nil) ⇒ Object
Checks that
string
obeys all of the “Bidirectional Characters” requirements in RFC-3454, §6:. -
.check_prohibited!(string, *tables, bidi: false, unassigned: "A.1", stored: false, profile: nil) ⇒ Object
Checks
string
for any codepoint intables
. - .map_tables!(string, *tables) ⇒ Object
-
.stringprep(string, maps:, normalization:, prohibited:, **opts) ⇒ Object
>>> 1.
Class Method Details
.[](table) ⇒ Object
Returns a Regexp matching the given table
name.
49 50 51 |
# File 'lib/net/imap/stringprep.rb', line 49 def self.[](table) Tables::REGEXPS.fetch(table) end |
.check_bidi!(string, c_8: false, profile: nil) ⇒ Object
Checks that string
obeys all of the “Bidirectional Characters” requirements in RFC-3454, §6:
-
The characters in StringPrep MUST be prohibited
-
If a string contains any RandALCat character, the string MUST NOT contain any LCat character.
-
If a string contains any RandALCat character, a RandALCat character MUST be the first character of the string, and a RandALCat character MUST be the last character of the string.
This is usually combined with #check_prohibited!, so table “C.8” is only checked when c_8: true
.
Raises either ProhibitedCodepoint or BidiStringError unless all requirements are met. profile
is an optional string which will be added to any exception that is raised (it does not affect behavior).
144 145 146 147 148 149 150 151 152 153 154 155 |
# File 'lib/net/imap/stringprep.rb', line 144 def check_bidi!(string, c_8: false, profile: nil) check_prohibited!(string, "C.8", profile: profile) if c_8 if Tables::BIDI_FAILS_REQ2.match?(string) raise BidiStringError.new( Tables::BIDI_DESC_REQ2, string: string, profile: profile, ) elsif Tables::BIDI_FAILS_REQ3.match?(string) raise BidiStringError.new( Tables::BIDI_DESC_REQ3, string: string, profile: profile, ) end end |
.check_prohibited!(string, *tables, bidi: false, unassigned: "A.1", stored: false, profile: nil) ⇒ Object
Checks string
for any codepoint in tables
. Raises a ProhibitedCodepoint describing the first matching table.
Also checks bidirectional characters, when bidi: true
, which may raise a BidiStringError.
profile
is an optional string which will be added to any exception that is raised (it does not affect behavior).
104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 |
# File 'lib/net/imap/stringprep.rb', line 104 def check_prohibited!(string, *tables, bidi: false, unassigned: "A.1", stored: false, profile: nil) tables = Tables::TITLES.keys.grep(/^C/) if tables.empty? tables |= [unassigned] if stored tables |= %w[C.8] if bidi table = tables.find {|t| case t when String then Tables::REGEXPS.fetch(t).match?(string) when Regexp then t.match?(string) else raise ArgumentError, "only table names and regexps can be checked" end } if table raise ProhibitedCodepoint.new( table, string: string, profile: profile ) end check_bidi!(string, profile: profile) if bidi end |
.map_tables!(string, *tables) ⇒ Object
88 89 90 91 92 93 94 |
# File 'lib/net/imap/stringprep.rb', line 88 def map_tables!(string, *tables) tables.each do |table| regexp, replacements = Tables::MAPPINGS.fetch(table) string.gsub!(regexp, replacements) end string end |
.stringprep(string, maps:, normalization:, prohibited:, **opts) ⇒ Object
Map – For each character in the input, check if it has a mapping and, if so, replace it with its mapping. This is described in section 3.
Normalize – Possibly normalize the result of step 1 using Unicode normalization. This is described in section 4.
Prohibit – Check for any characters that are not allowed in the output. If any are found, return an error. This is described in section 5.
Check bidi – Possibly check for right-to-left characters, and if any are found, make sure that the whole string satisfies the requirements for bidirectional strings. If the string does not satisfy the requirements for bidirectional strings, return an error. This is described in section 6.
The above steps MUST be performed in the order given to comply with this specification.
76 77 78 79 80 81 82 83 84 85 86 |
# File 'lib/net/imap/stringprep.rb', line 76 def stringprep(string, maps:, normalization:, prohibited:, **opts) string = string.encode("UTF-8") # also dups (and raises invalid encoding) map_tables!(string, *maps) if maps string.unicode_normalize!(normalization) if normalization check_prohibited!(string, *prohibited, **opts) if prohibited string end |