diff --git a/TODO b/TODO index 1d3c0eaea..6733d1cc2 100644 --- a/TODO +++ b/TODO @@ -120,6 +120,4 @@ There is at least one couple of duplicate files: inttype[_-]h.m4. * UTF-8 -** we need a function to count characters. - Something like utf8_strlen. This is needed to correclty count the - lengtgh of a passphrase. + UTF-8 specific TODO. diff --git a/agent/ChangeLog b/agent/ChangeLog index 319cb5d35..39f02b115 100644 --- a/agent/ChangeLog +++ b/agent/ChangeLog @@ -1,9 +1,10 @@ 2007-01-25 Werner Koch - * genkey.c (check_passphrase_constraints): Get ngettext call right. + * genkey.c (check_passphrase_constraints): Get ngettext call right + and use UTF-8 aware strlen. * protect-tool.c (get_passphrase): New arg OPT_CHECK. - (get_new_passphrase): Enable OTP_CHECK on the first call. + (get_new_passphrase): Enable OPT_CHECK on the first call. * command.c (cmd_get_passphrase): Implement option --check. 2007-01-24 Werner Koch diff --git a/agent/genkey.c b/agent/genkey.c index 5a25d4771..9396e54d5 100644 --- a/agent/genkey.c +++ b/agent/genkey.c @@ -84,7 +84,7 @@ check_passphrase_constraints (ctrl_t ctrl, const char *pw) if (!pw) pw = ""; - if (strlen (pw) < minlen ) /* FIXME: should be an utf-8 length. */ + if (utf8_charcount (pw) < minlen ) { char *desc = xtryasprintf ( ngettext ("Warning: You have entered a passphrase that%%0A" diff --git a/jnlib/ChangeLog b/jnlib/ChangeLog index e120319cd..3f9ef1539 100644 --- a/jnlib/ChangeLog +++ b/jnlib/ChangeLog @@ -1,3 +1,7 @@ +2007-01-25 Werner Koch + + * stringhelp.c (utf8_charcount): New. + 2006-11-29 Werner Koch * utf8conv.c (set_native_charset) [HAVE_W32_SYSTEM]: Fixed typo in diff --git a/jnlib/stringhelp.c b/jnlib/stringhelp.c index 1731dd946..b74f84a9c 100644 --- a/jnlib/stringhelp.c +++ b/jnlib/stringhelp.c @@ -547,6 +547,23 @@ sanitize_buffer (const void *p_arg, size_t n, int delim) } +/* Given a string containing an UTF-8 encoded text, return the number + of characters in this string. It differs from strlen in that it + only counts complete UTF-8 characters. Note, that this function + does not take combined characters into account. */ +size_t +utf8_charcount (const char *s) +{ + size_t n; + + for (n=0; *s; s++) + if ( (*s&0xc0) != 0x80 ) /* Exclude continuation bytes: 10xxxxxx */ + n++; + + return n; +} + + /**************************************************** ********** W32 specific functions **************** ****************************************************/ diff --git a/jnlib/stringhelp.h b/jnlib/stringhelp.h index adbd9bf02..869b0f00e 100644 --- a/jnlib/stringhelp.h +++ b/jnlib/stringhelp.h @@ -57,6 +57,9 @@ size_t print_sanitized_utf8_string (FILE *fp, const char *string, int delim); char *sanitize_buffer (const void *p, size_t n, int delim); +size_t utf8_charcount (const char *s); + + #ifdef HAVE_W32_SYSTEM const char *w32_strerror (int ec); #endif