module Net::IMAP::SASL::StringPrep
Regexps and utility methods for implementing stringprep profiles. The StringPrep algorithm is defined by RFC-3454. Each codepoint table defined in the RFC-3454 appendices is matched by a Regexp defined in this module.
Constants
- BIDI_DESC_REQ2
- BIDI_DESC_REQ3
- BIDI_FAILS_REQ2
- Bidirectional Characters [StringPrep, §6], Requirement 2
-
If a string contains any RandALCat character, the string MUST NOT contain any LCat character.
- BIDI_FAILS_REQ3
- Bidirectional Characters [StringPrep, §6], Requirement 3
-
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.
- BIDI_FAILURE
Bidirectional Characters [StringPrep, §6]
- IN_A_1
Unassigned code points in Unicode 3.2 StringPrep["A.1"]
- IN_B_1
Commonly mapped to nothing StringPrep["B.1"]
- IN_B_2
Mapping for case-folding used with NFKC StringPrep["B.2"]
- IN_B_3
Mapping for case-folding used with no normalization StringPrep["B.3"]
- IN_C_1_1
ASCII space characters StringPrep["C.1.1"]
- IN_C_1_2
Non-ASCII space characters StringPrep["C.1.2"]
- IN_C_2_1
ASCII control characters StringPrep["C.2.1"]
- IN_C_2_2
Non-ASCII control characters StringPrep["C.2.2"]
- IN_C_3
Private use StringPrep["C.3"]
- IN_C_4
Non-character code points StringPrep["C.4"]
- IN_C_5
Surrogate codes StringPrep["C.5"]
- IN_C_6
Inappropriate for plain text StringPrep["C.6"]
- IN_C_7
Inappropriate for canonical representation StringPrep["C.7"]
- IN_C_8
Change display properties or are deprecated StringPrep["C.8"]
- IN_C_9
Tagging characters StringPrep["C.9"]
- IN_D_1
Characters with bidirectional property “R” or “AL” StringPrep["D.1"]
- IN_D_1_NEGATED
Used to check req3 of bidirectional checks Matches the negation of the D.1 table
- IN_D_2
Characters with bidirectional property “L” StringPrep["D.2"]
- TABLE_REGEXPS
Regexps matching each codepoint table in the RFC-3454 appendices
- TABLE_TITLES
Names of each codepoint table in the RFC-3454 appendices
Public Class Methods
Returns a Regexp matching the given table
name.
# File net-imap-0.3.4/lib/net/imap/sasl/stringprep.rb, line 18 def self.[](table) TABLE_REGEXPS.fetch(table) end
Public Instance Methods
Checks that string
obeys all of the “Bidirectional Characters” requirements in RFC-3454, §6:
-
The characters in StringPrep["C.8"] 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).
# File net-imap-0.3.4/lib/net/imap/sasl/stringprep.rb, line 58 def check_bidi!(string, c_8: false, profile: nil) check_prohibited!(string, "C.8", profile: profile) if c_8 if BIDI_FAILS_REQ2.match?(string) raise BidiStringError.new( BIDI_DESC_REQ2, string: string, profile: profile, ) elsif BIDI_FAILS_REQ3.match?(string) raise BidiStringError.new( BIDI_DESC_REQ3, string: string, profile: profile, ) end end
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).
# File net-imap-0.3.4/lib/net/imap/sasl/stringprep.rb, line 32 def check_prohibited!(string, *tables, bidi: false, profile: nil) tables = TABLE_TITLES.keys.grep(/^C/) if tables.empty? tables |= %w[C.8] if bidi table = tables.find {|t| TABLE_REGEXPS[t].match?(string) } raise ProhibitedCodepoint.new( table, string: string, profile: nil ) if table check_bidi!(string, profile: profile) if bidi end