summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorWerner Koch <wk@gnupg.org>2007-01-25 11:26:55 +0100
committerWerner Koch <wk@gnupg.org>2007-01-25 11:26:55 +0100
commit0d4b2056307ebb9ff2b938c1518014fbdf2c8f49 (patch)
tree5e17e51e33b0844372f8c0523e6e512ab485837f
parentagent/ (diff)
downloadgnupg2-0d4b2056307ebb9ff2b938c1518014fbdf2c8f49.tar.xz
gnupg2-0d4b2056307ebb9ff2b938c1518014fbdf2c8f49.zip
jnlib/
* stringhelp.c (utf8_charcount): New. agent/ * genkey.c (check_passphrase_constraints): Use UTF-8 aware strlen.
-rw-r--r--TODO4
-rw-r--r--agent/ChangeLog5
-rw-r--r--agent/genkey.c2
-rw-r--r--jnlib/ChangeLog4
-rw-r--r--jnlib/stringhelp.c17
-rw-r--r--jnlib/stringhelp.h3
6 files changed, 29 insertions, 6 deletions
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 <wk@g10code.com>
- * 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 <wk@g10code.com>
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 <wk@g10code.com>
+
+ * stringhelp.c (utf8_charcount): New.
+
2006-11-29 Werner Koch <wk@g10code.com>
* 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