374 lines
8.7 KiB
Rust
374 lines
8.7 KiB
Rust
use idna::uts46::AsciiDenyList;
|
|
use idna::uts46::DnsLength;
|
|
use idna::uts46::Hyphens;
|
|
|
|
/// https://github.com/servo/rust-url/issues/373
|
|
#[test]
|
|
fn test_punycode_prefix_with_length_check() {
|
|
let config = idna::uts46::Uts46::new();
|
|
|
|
assert!(config
|
|
.to_ascii(
|
|
b"xn--",
|
|
AsciiDenyList::STD3,
|
|
Hyphens::Check,
|
|
DnsLength::Verify
|
|
)
|
|
.is_err());
|
|
assert!(config
|
|
.to_ascii(
|
|
b"xn---",
|
|
AsciiDenyList::STD3,
|
|
Hyphens::Check,
|
|
DnsLength::Verify
|
|
)
|
|
.is_err());
|
|
assert!(config
|
|
.to_ascii(
|
|
b"xn-----",
|
|
AsciiDenyList::STD3,
|
|
Hyphens::Check,
|
|
DnsLength::Verify,
|
|
)
|
|
.is_err());
|
|
assert!(config
|
|
.to_ascii(
|
|
b"xn--.",
|
|
AsciiDenyList::STD3,
|
|
Hyphens::Check,
|
|
DnsLength::Verify
|
|
)
|
|
.is_err());
|
|
assert!(config
|
|
.to_ascii(
|
|
b"xn--...",
|
|
AsciiDenyList::STD3,
|
|
Hyphens::Check,
|
|
DnsLength::Verify,
|
|
)
|
|
.is_err());
|
|
assert!(config
|
|
.to_ascii(
|
|
b".xn--",
|
|
AsciiDenyList::STD3,
|
|
Hyphens::Check,
|
|
DnsLength::Verify,
|
|
)
|
|
.is_err());
|
|
assert!(config
|
|
.to_ascii(
|
|
b"...xn--",
|
|
AsciiDenyList::STD3,
|
|
Hyphens::Check,
|
|
DnsLength::Verify,
|
|
)
|
|
.is_err());
|
|
assert!(config
|
|
.to_ascii(
|
|
b"xn--.xn--",
|
|
AsciiDenyList::STD3,
|
|
Hyphens::Check,
|
|
DnsLength::Verify,
|
|
)
|
|
.is_err());
|
|
assert!(config
|
|
.to_ascii(
|
|
b"xn--.example.org",
|
|
AsciiDenyList::STD3,
|
|
Hyphens::Check,
|
|
DnsLength::Verify,
|
|
)
|
|
.is_err());
|
|
}
|
|
|
|
/// https://github.com/servo/rust-url/issues/373
|
|
#[test]
|
|
fn test_punycode_prefix_without_length_check() {
|
|
let config = idna::uts46::Uts46::new();
|
|
|
|
assert!(config
|
|
.to_ascii(
|
|
b"xn--",
|
|
AsciiDenyList::URL,
|
|
Hyphens::Allow,
|
|
DnsLength::Ignore
|
|
)
|
|
.is_err());
|
|
assert!(config
|
|
.to_ascii(
|
|
b"xn---",
|
|
AsciiDenyList::URL,
|
|
Hyphens::Allow,
|
|
DnsLength::Ignore
|
|
)
|
|
.is_err());
|
|
assert!(config
|
|
.to_ascii(
|
|
b"xn-----",
|
|
AsciiDenyList::URL,
|
|
Hyphens::Allow,
|
|
DnsLength::Ignore
|
|
)
|
|
.is_err());
|
|
assert!(config
|
|
.to_ascii(
|
|
b"xn--.",
|
|
AsciiDenyList::URL,
|
|
Hyphens::Allow,
|
|
DnsLength::Ignore
|
|
)
|
|
.is_err());
|
|
assert!(config
|
|
.to_ascii(
|
|
b"xn--...",
|
|
AsciiDenyList::URL,
|
|
Hyphens::Allow,
|
|
DnsLength::Ignore
|
|
)
|
|
.is_err());
|
|
assert!(config
|
|
.to_ascii(
|
|
b".xn--",
|
|
AsciiDenyList::URL,
|
|
Hyphens::Allow,
|
|
DnsLength::Ignore
|
|
)
|
|
.is_err());
|
|
assert!(config
|
|
.to_ascii(
|
|
b"...xn--",
|
|
AsciiDenyList::URL,
|
|
Hyphens::Allow,
|
|
DnsLength::Ignore
|
|
)
|
|
.is_err());
|
|
assert!(config
|
|
.to_ascii(
|
|
b"xn--.xn--",
|
|
AsciiDenyList::URL,
|
|
Hyphens::Allow,
|
|
DnsLength::Ignore
|
|
)
|
|
.is_err());
|
|
assert!(config
|
|
.to_ascii(
|
|
b"xn--.example.org",
|
|
AsciiDenyList::URL,
|
|
Hyphens::Allow,
|
|
DnsLength::Ignore
|
|
)
|
|
.is_err());
|
|
}
|
|
/*
|
|
// http://www.unicode.org/reports/tr46/#Table_Example_Processing
|
|
#[test]
|
|
fn test_examples() {
|
|
let codec = idna::uts46bis::Uts46::new();
|
|
let mut out = String::new();
|
|
|
|
assert_matches!(codec.to_unicode("Bloß.de", &mut out), Ok(()));
|
|
assert_eq!(out, "bloß.de");
|
|
|
|
out.clear();
|
|
assert_matches!(codec.to_unicode("xn--blo-7ka.de", &mut out), Ok(()));
|
|
assert_eq!(out, "bloß.de");
|
|
|
|
out.clear();
|
|
assert_matches!(codec.to_unicode("u\u{308}.com", &mut out), Ok(()));
|
|
assert_eq!(out, "ü.com");
|
|
|
|
out.clear();
|
|
assert_matches!(codec.to_unicode("xn--tda.com", &mut out), Ok(()));
|
|
assert_eq!(out, "ü.com");
|
|
|
|
out.clear();
|
|
assert_matches!(codec.to_unicode("xn--u-ccb.com", &mut out), Err(_));
|
|
|
|
out.clear();
|
|
assert_matches!(codec.to_unicode("a⒈com", &mut out), Err(_));
|
|
|
|
out.clear();
|
|
assert_matches!(codec.to_unicode("xn--a-ecp.ru", &mut out), Err(_));
|
|
|
|
out.clear();
|
|
assert_matches!(codec.to_unicode("xn--0.pt", &mut out), Err(_));
|
|
|
|
out.clear();
|
|
assert_matches!(codec.to_unicode("日本語。JP", &mut out), Ok(()));
|
|
assert_eq!(out, "日本語.jp");
|
|
|
|
out.clear();
|
|
assert_matches!(codec.to_unicode("☕.us", &mut out), Ok(()));
|
|
assert_eq!(out, "☕.us");
|
|
}
|
|
*/
|
|
|
|
#[test]
|
|
fn test_v5() {
|
|
let config = idna::uts46::Uts46::new();
|
|
|
|
// IdnaTest:784 蔏。𑰺
|
|
assert!(config
|
|
.to_ascii(
|
|
"\u{11C3A}".as_bytes(),
|
|
AsciiDenyList::STD3,
|
|
Hyphens::Check,
|
|
DnsLength::Verify,
|
|
)
|
|
.is_err());
|
|
assert!(config
|
|
.to_ascii(
|
|
"\u{850f}.\u{11C3A}".as_bytes(),
|
|
AsciiDenyList::STD3,
|
|
Hyphens::Check,
|
|
DnsLength::Verify,
|
|
)
|
|
.is_err());
|
|
assert!(config
|
|
.to_ascii(
|
|
"\u{850f}\u{ff61}\u{11C3A}".as_bytes(),
|
|
AsciiDenyList::STD3,
|
|
Hyphens::Check,
|
|
DnsLength::Verify,
|
|
)
|
|
.is_err());
|
|
}
|
|
|
|
#[test]
|
|
fn test_v8_bidi_rules() {
|
|
let config = idna::uts46::Uts46::new();
|
|
|
|
assert_eq!(
|
|
config
|
|
.to_ascii(
|
|
b"abc",
|
|
AsciiDenyList::STD3,
|
|
Hyphens::Check,
|
|
DnsLength::Verify,
|
|
)
|
|
.unwrap(),
|
|
"abc"
|
|
);
|
|
assert_eq!(
|
|
config
|
|
.to_ascii(
|
|
b"123",
|
|
AsciiDenyList::STD3,
|
|
Hyphens::Check,
|
|
DnsLength::Verify,
|
|
)
|
|
.unwrap(),
|
|
"123"
|
|
);
|
|
assert_eq!(
|
|
config
|
|
.to_ascii(
|
|
"אבּג".as_bytes(),
|
|
AsciiDenyList::STD3,
|
|
Hyphens::Check,
|
|
DnsLength::Verify,
|
|
)
|
|
.unwrap(),
|
|
"xn--kdb3bdf"
|
|
);
|
|
assert_eq!(
|
|
config
|
|
.to_ascii(
|
|
"ابج".as_bytes(),
|
|
AsciiDenyList::STD3,
|
|
Hyphens::Check,
|
|
DnsLength::Verify,
|
|
)
|
|
.unwrap(),
|
|
"xn--mgbcm"
|
|
);
|
|
assert_eq!(
|
|
config
|
|
.to_ascii(
|
|
"abc.ابج".as_bytes(),
|
|
AsciiDenyList::STD3,
|
|
Hyphens::Check,
|
|
DnsLength::Verify,
|
|
)
|
|
.unwrap(),
|
|
"abc.xn--mgbcm"
|
|
);
|
|
assert_eq!(
|
|
config
|
|
.to_ascii(
|
|
"אבּג.ابج".as_bytes(),
|
|
AsciiDenyList::STD3,
|
|
Hyphens::Check,
|
|
DnsLength::Verify,
|
|
)
|
|
.unwrap(),
|
|
"xn--kdb3bdf.xn--mgbcm"
|
|
);
|
|
|
|
// Bidi domain names cannot start with digits
|
|
assert!(config
|
|
.to_ascii(
|
|
"0a.\u{05D0}".as_bytes(),
|
|
AsciiDenyList::STD3,
|
|
Hyphens::Check,
|
|
DnsLength::Verify,
|
|
)
|
|
.is_err());
|
|
assert!(config
|
|
.to_ascii(
|
|
"0à.\u{05D0}".as_bytes(),
|
|
AsciiDenyList::STD3,
|
|
Hyphens::Check,
|
|
DnsLength::Verify,
|
|
)
|
|
.is_err());
|
|
|
|
// Bidi chars may be punycode-encoded
|
|
assert!(config
|
|
.to_ascii(
|
|
b"xn--0ca24w",
|
|
AsciiDenyList::STD3,
|
|
Hyphens::Check,
|
|
DnsLength::Verify,
|
|
)
|
|
.is_err());
|
|
}
|
|
|
|
#[test]
|
|
fn emoji_domains() {
|
|
// HOT BEVERAGE is allowed here...
|
|
let config = idna::uts46::Uts46::new();
|
|
assert_eq!(
|
|
config
|
|
.to_ascii(
|
|
"☕.com".as_bytes(),
|
|
AsciiDenyList::STD3,
|
|
Hyphens::Check,
|
|
DnsLength::Verify,
|
|
)
|
|
.unwrap(),
|
|
"xn--53h.com"
|
|
);
|
|
}
|
|
|
|
#[test]
|
|
fn unicode_before_delimiter() {
|
|
let config = idna::uts46::Uts46::new();
|
|
assert!(config
|
|
.to_ascii(
|
|
"xn--f\u{34a}-PTP".as_bytes(),
|
|
AsciiDenyList::STD3,
|
|
Hyphens::Check,
|
|
DnsLength::Verify,
|
|
)
|
|
.is_err());
|
|
}
|
|
|
|
#[test]
|
|
fn upper_case_ascii_in_punycode() {
|
|
let config = idna::uts46::Uts46::new();
|
|
let (unicode, result) =
|
|
config.to_unicode("xn--A-1ga".as_bytes(), AsciiDenyList::STD3, Hyphens::Check);
|
|
assert!(result.is_ok());
|
|
assert_eq!(&unicode, "aö");
|
|
}
|