模块 Net::IMAP::StringPrep::SASLprep

SASLprep#saslprep 可以用来根据 [RFC4013] 准备字符串。

SASLprep 以三种方式映射字符:映射为空,映射为空格,以及 Unicode 规范化形式 KC。SASLprep 禁止几乎所有标准 StringPrep 表格 (RFC3454, 附录 “C”) 中的代码点,并使用 StringPrep 的标准双向字符要求 (附录 “D”)。SASLprep 还使用 StringPrep 对 “未分配” 代码点 (附录 “A”) 的定义。

常量

ASCII_NO_CTRLS

用于短路不需要准备的字符串。

BIDI_FAILURE

双向字符 [StringPrep, §6]

一个用于匹配不满足 StringPrep 双向字符规则的字符串的正则表达式。

等于 StringPrep::Tables::BIDI_FAILURE。在此重新定义以避免加载 StringPrep::Tables,除非必要。

MAP_TO_NOTHING

RFC4013 §2.1 映射 - 映射为空

可以映射为空的 “通常映射为空” 的字符 (StringPrep[“B.1”])。

等于 StringPrep[“B.1”]。在此重新定义以避免加载 StringPrep::Tables,除非必要。

MAP_TO_SPACE

RFC4013 §2.1 映射 - 映射为空格

可以映射为空格 (U+0020) 的非 ASCII 空格字符 (StringPrep[“C.1.2”])

等于 StringPrep[“C.1.2”]。在此重新定义以避免加载 StringPrep::Tables,除非必要。

PROHIBITED

一个用于匹配 RFC4013 §2.3 和 §2.4 禁止的字符串的正则表达式。

这结合了 PROHIBITED_OUTPUTBIDI_FAILURE

PROHIBITED_OUTPUT

一个用于匹配 RFC4013 §2.3 禁止的代码点的正则表达式。

这结合了所有 TABLES_PROHIBITED 表格。

PROHIBITED_OUTPUT_STORED

一个用于匹配 RFC4013 §2.3 和 §2.5 禁止的代码点的正则表达式。

这结合了 PROHIBITED_OUTPUTUNASSIGNED

PROHIBITED_STORED

一个用于匹配 RFC4013 §2.3、§2.4 和 §2.5 禁止的字符串的正则表达式。

这结合了 PROHIBITED_OUTPUT_STOREDBIDI_FAILURE

TABLES_PROHIBITED

RFC4013 §2.3 禁止的输出

  • 非 ASCII 空格字符 — StringPrep[“C.1.2”]

  • ASCII 控制字符 — StringPrep[“C.2.1”]

  • 非 ASCII 控制字符 — StringPrep[“C.2.2”]

  • 私有使用字符 — StringPrep[“C.3”]

  • 非字符代码点 — StringPrep[“C.4”]

  • 代理代码点 — StringPrep[“C.5”]

  • 不适合纯文本字符 — StringPrep[“C.6”]

  • 不适合规范表示字符 — StringPrep[“C.7”]

  • 更改显示属性或已弃用的字符 — StringPrep[“C.8”]

  • 标记字符 — StringPrep[“C.9”]

TABLES_PROHIBITED_STORED

将未分配的 (根据 Unicode 3.2) 代码点添加到 TABLES_PROHIBITED

RFC4013 §2.5 未分配的代码点

此配置文件将 StringPrep[“A.1”] 表格指定为其未分配代码点的列表。

UNASSIGNED

RFC4013 §2.5 未分配的代码点

此配置文件将 StringPrep[“A.1”] 表格指定为其未分配代码点的列表。

等于 StringPrep[“A.1”]。在此重新定义以避免加载 StringPrep::Tables,除非必要。

公共实例方法

saslprep(str, stored: false, exception: false) 点击切换源代码

使用 StringPrep 算法 RFC3454 的 SASLprep 配置文件 RFC4013,准备用于比较的 UTF-8 string

默认情况下,禁止的字符串将返回 nil。当 exceptiontrue 时,将引发描述违规的 StringPrepError

storedtrue 时,将禁止 “未分配” 的代码点。对于 StringPrep 和 SASLprep 配置文件,“未分配” 是指 Unicode 3.2,而不是更高版本。有关更多信息,请参见 RFC3454 §7。

# File net-imap-0.5.4/lib/net/imap/stringprep/saslprep.rb, line 42
def saslprep(str, stored: false, exception: false)
  return str if ASCII_NO_CTRLS.match?(str) # incompatible encoding raises
  str = str.encode("UTF-8") # also dups (and raises for invalid encoding)
  str.gsub!(MAP_TO_SPACE, " ")
  str.gsub!(MAP_TO_NOTHING, "")
  str.unicode_normalize!(:nfkc)
  # These regexps combine the prohibited and bidirectional checks
  return str unless str.match?(stored ? PROHIBITED_STORED : PROHIBITED)
  return nil unless exception
  # raise helpful errors to indicate *why* it failed:
  tables = stored ? TABLES_PROHIBITED_STORED : TABLES_PROHIBITED
  StringPrep.check_prohibited! str, *tables, bidi: true, profile: "SASLprep"
  raise InvalidStringError.new(
    "unknown error", string: string, profile: "SASLprep"
  )
rescue ArgumentError, Encoding::CompatibilityError => ex
  if /invalid byte sequence|incompatible encoding/.match? ex.message
    return nil unless exception
    raise StringPrepError.new(ex.message, string: str, profile: "saslprep")
  end
  raise ex
end