模块 Net::IMAP::StringPrep

用于实现 stringprep 配置文件的正则表达式和实用方法。StringPrep 算法在 RFC-3454 中定义。RFC-3454 附录中定义的每个码位表都与此模块中定义的正则表达式匹配。

公共类方法

[](table) 点击以切换源代码

返回与给定 table 名称匹配的正则表达式。

# File net-imap-0.5.4/lib/net/imap/stringprep.rb, line 49
def self.[](table)
  Tables::REGEXPS.fetch(table)
end

公共实例方法

check_bidi!(string, c_8: false, profile: nil) 点击以切换源代码

检查 string 是否遵守 RFC-3454, §6 中所有 “双向字符” 的要求

  • StringPrep["C.8"] 中的字符必须被禁止

  • 如果字符串包含任何 RandALCat 字符,则该字符串不能包含任何 LCat 字符。

  • 如果字符串包含任何 RandALCat 字符,则 RandALCat 字符必须是字符串的第一个字符,并且 RandALCat 字符必须是字符串的最后一个字符。

这通常与 check_prohibited! 结合使用,因此仅当 c_8: true 时才会检查表 “C.8”。

除非满足所有要求,否则会引发 ProhibitedCodepointBidiStringErrorprofile 是一个可选字符串,它将被添加到任何引发的异常中(它不会影响行为)。

# File net-imap-0.5.4/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) 点击以切换源代码

检查 string 中是否存在 tables 中的任何码位。引发一个 ProhibitedCodepoint,描述第一个匹配的表。

bidi: true 时,还会检查双向字符,这可能会引发 BidiStringError

profile 是一个可选字符串,它将被添加到任何引发的异常中(它不会影响行为)。

# File net-imap-0.5.4/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) 点击以切换源代码
# File net-imap-0.5.4/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) 点击以切换源代码
  1. 映射 – 对于输入中的每个字符,检查它是否有映射,如果有,则将其替换为其映射。这在第 3 节中描述。

  2. 规范化 – 可能使用 Unicode 规范化来规范化步骤 1 的结果。这在第 4 节中描述。

  3. 禁止 – 检查输出中是否不允许任何字符。如果找到任何不允许的字符,则返回错误。这在第 5 节中描述。

  4. 检查 bidi – 可能检查从右到左的字符,如果找到任何此类字符,请确保整个字符串满足双向字符串的要求。如果该字符串不满足双向字符串的要求,则返回错误。这在第 6 节中描述。

必须按照给定的顺序执行上述步骤,以符合本规范。

# File net-imap-0.5.4/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