Software /
code /
prosody
Diff
util-src/encodings.c @ 10261:010c67532ed0
util.encodings: Switch ICU binding to IDNA2008 (fixes #533, #1301)
author | Kim Alvefur <zash@zash.se> |
---|---|
date | Wed, 11 Sep 2019 00:14:59 +0200 |
parent | 10006:5a5fd234dec7 |
child | 10262:b1209bc15cd1 |
line wrap: on
line diff
--- a/util-src/encodings.c Thu Sep 12 15:17:12 2019 +0200 +++ b/util-src/encodings.c Wed Sep 11 00:14:59 2019 +0200 @@ -269,6 +269,7 @@ #include <unicode/ustring.h> #include <unicode/utrace.h> #include <unicode/uspoof.h> +#include <unicode/uidna.h> static int icu_stringprep_prep(lua_State *L, const UStringPrepProfile *profile) { size_t input_len; @@ -323,6 +324,7 @@ UStringPrepProfile *icu_resourceprep; UStringPrepProfile *icu_saslprep; USpoofChecker *icu_spoofcheck; +UIDNA *icu_idna2008; #if (U_ICU_VERSION_MAJOR_NUM < 58) /* COMPAT */ @@ -339,6 +341,7 @@ icu_saslprep = usprep_openByType(USPREP_RFC4013_SASLPREP, &err); icu_spoofcheck = uspoof_open(&err); uspoof_setChecks(icu_spoofcheck, USPOOF_CONFUSABLE, &err); + icu_idna2008 = uidna_openUTS46(UIDNA_USE_STD3_RULES, &err); if(U_FAILURE(err)) { fprintf(stderr, "[c] util.encodings: error: %s\n", u_errorName((UErrorCode)err)); @@ -434,9 +437,10 @@ return 1; } - dest_len = uidna_IDNToASCII(ustr, ulen, dest, 1024, UIDNA_USE_STD3_RULES, NULL, &err); + UIDNAInfo info = UIDNA_INFO_INITIALIZER; + dest_len = uidna_nameToASCII(icu_idna2008, ustr, ulen, dest, 256, &info, &err); - if(U_FAILURE(err)) { + if(U_FAILURE(err) || info.errors) { lua_pushnil(L); return 1; } else { @@ -468,9 +472,10 @@ return 1; } - dest_len = uidna_IDNToUnicode(ustr, ulen, dest, 1024, UIDNA_USE_STD3_RULES, NULL, &err); + UIDNAInfo info = UIDNA_INFO_INITIALIZER; + dest_len = uidna_nameToUnicode(icu_idna2008, ustr, ulen, dest, 1024, &info, &err); - if(U_FAILURE(err)) { + if(U_FAILURE(err) || info.errors) { lua_pushnil(L); return 1; } else {