diff --git a/lib/wind/ChangeLog b/lib/wind/ChangeLog index f7f6167d8..b5ffef211 100644 --- a/lib/wind/ChangeLog +++ b/lib/wind/ChangeLog @@ -1,3 +1,12 @@ +2008-02-11 Love Hörnquist Åstrand + + * Add partial support for LDAP-prep Insignificant Character Handling + + * normalize.c: use generated constant for length, check for + overruns, dont use gcc/c99 extentions + + * gen-normalize.py, test-normalize.c: use generated constant for length + 2008-02-05 Love Hörnquist Åstrand * utf8.c: Make wind_utf8ucs4_length() work again. diff --git a/lib/wind/Makefile.am b/lib/wind/Makefile.am index df9584422..9bb2b2fe7 100644 --- a/lib/wind/Makefile.am +++ b/lib/wind/Makefile.am @@ -14,6 +14,7 @@ libwind_la_SOURCES = \ errorlist_table.c \ map_table.c \ map.c \ + ldap.c \ normalize.c \ normalize_table.c \ punycode.c \ @@ -59,6 +60,7 @@ check_PROGRAMS = \ test-normalize \ test-prohibited \ test-punycode \ + test-ldap \ test-utf8 test_punycode_SOURCES = \ diff --git a/lib/wind/stringprep.c b/lib/wind/stringprep.c index 6ab171dfb..12f9f553b 100644 --- a/lib/wind/stringprep.c +++ b/lib/wind/stringprep.c @@ -62,6 +62,7 @@ wind_stringprep(const uint32_t *in, size_t in_len, size_t tmp_len = in_len * 3; uint32_t *tmp = malloc(tmp_len * sizeof(uint32_t)); int ret; + size_t olen; if (tmp == NULL) return ENOMEM; @@ -71,17 +72,39 @@ wind_stringprep(const uint32_t *in, size_t in_len, free(tmp); return ret; } - ret = _wind_stringprep_normalize(tmp, tmp_len, out, out_len); + + olen = *out_len; + ret = _wind_stringprep_normalize(tmp, tmp_len, tmp, &olen); + if (ret) { + free(tmp); + return ret; + } + ret = _wind_stringprep_prohibited(tmp, olen, flags); + if (ret) { + free(tmp); + return ret; + } + ret = _wind_stringprep_testbidi(tmp, olen, flags); + if (ret) { + free(tmp); + return ret; + } + + /* Insignificant Character Handling for ldap-prep */ + if (flags & WIND_PROFILE_LDAP_CASE_EXACT_ATTRIBUTE) { + ret = _wind_ldap_case_exact_attribute(tmp, olen, out, out_len); +#if 0 + } else if (flags & WIND_PROFILE_LDAP_CASE_EXACT_ASSERTION) { + } else if (flags & WIND_PROFILE_LDAP_NUMERIC) { + } else if (flags & WIND_PROFILE_LDAP_TELEPHONE) { + } else { +#endif + memcpy(out, tmp, sizeof(out[0]) * olen); + *out_len = olen; + } free(tmp); - if (ret) - return ret; - ret = _wind_stringprep_prohibited(out, *out_len, flags); - if (ret) - return ret; - ret = _wind_stringprep_testbidi(out, *out_len, flags); - if (ret) - return ret; - return 0; + + return ret; } static struct { diff --git a/lib/wind/version-script.map b/lib/wind/version-script.map index 533e0d522..2d87425f6 100644 --- a/lib/wind/version-script.map +++ b/lib/wind/version-script.map @@ -18,6 +18,7 @@ HEIMDAL_WIND_1.0 { _wind_stringprep_prohibited; _wind_stringprep_map; _wind_stringprep_normalize; + _wind_ldap_case_exact_attribute; _wind_ucs2read; local: *; diff --git a/lib/wind/wind.h b/lib/wind/wind.h index ecda75939..8d832214a 100644 --- a/lib/wind/wind.h +++ b/lib/wind/wind.h @@ -39,11 +39,19 @@ #include #include +#include + typedef unsigned int wind_profile_flags; -#define WIND_PROFILE_NAME 1 -#define WIND_PROFILE_LDAP 2 -#define WIND_PROFILE_SASL 4 +#define WIND_PROFILE_NAME 0x00000001 +#define WIND_PROFILE_SASL 0x00000002 +#define WIND_PROFILE_LDAP 0x00000004 + +#define WIND_PROFILE_LDAP_CASE_EXACT_ATTRIBUTE 0x00010000 +#define WIND_PROFILE_LDAP_CASE_EXACT_ASSERTION 0x00020000 +#define WIND_PROFILE_LDAP_NUMERIC 0x00040000 +#define WIND_PROFILE_LDAP_TELEPHONE 0x00080000 + /* flags to wind_ucs2read/wind_ucs2write */ #define WIND_RW_LE 1 diff --git a/lib/wind/windlocl.h b/lib/wind/windlocl.h index 7add4eb5a..1b6ffa36e 100644 --- a/lib/wind/windlocl.h +++ b/lib/wind/windlocl.h @@ -57,4 +57,8 @@ int _wind_stringprep_map(const uint32_t *, size_t, int _wind_stringprep_normalize(const uint32_t *, size_t, uint32_t *, size_t *); +int _wind_ldap_case_exact_attribute(const uint32_t *, size_t, + uint32_t *, size_t *); + + #endif /* _WINDLOCL_H_ */