From a7849cadfa2513b8e978464d401589bedf386264 Mon Sep 17 00:00:00 2001
From: Stephan Bosch <stephan@rename-it.nl>
Date: Fri, 30 Jul 2010 16:32:19 +0200
Subject: [PATCH] Variables extension: fixed :length set modifier to recognize
 utf8 characters in stead of octets.

---
 .../plugins/variables/ext-variables-modifiers.c      |  7 +++++--
 tests/extensions/variables/modifiers.svtest          | 12 ++++++++++++
 2 files changed, 17 insertions(+), 2 deletions(-)

diff --git a/src/lib-sieve/plugins/variables/ext-variables-modifiers.c b/src/lib-sieve/plugins/variables/ext-variables-modifiers.c
index b867dd8cc..1ef691928 100644
--- a/src/lib-sieve/plugins/variables/ext-variables-modifiers.c
+++ b/src/lib-sieve/plugins/variables/ext-variables-modifiers.c
@@ -1,6 +1,9 @@
 /* Copyright (c) 2002-2010 Dovecot Sieve authors, see the included COPYING file
  */
 
+#include "lib.h"
+#include "unichar.h"
+
 #include "sieve-common.h"
 #include "sieve-commands.h"
 #include "sieve-code.h"
@@ -238,8 +241,8 @@ bool mod_lower_modify(string_t *in, string_t **result)
 bool mod_length_modify(string_t *in, string_t **result)
 {
 	*result = t_str_new(64);
-	str_printfa(*result, "%llu", (unsigned long long) str_len(in));
-
+	str_printfa(*result, "%llu", (unsigned long long) 
+		uni_utf8_strlen_n(str_data(in), str_len(in)));
 	return TRUE;
 }
 
diff --git a/tests/extensions/variables/modifiers.svtest b/tests/extensions/variables/modifiers.svtest
index 7252331a7..6948aecab 100644
--- a/tests/extensions/variables/modifiers.svtest
+++ b/tests/extensions/variables/modifiers.svtest
@@ -1,5 +1,6 @@
 require "vnd.dovecot.testsuite";
 require "variables";
+require "encoded-character";
 
 /*
  * Modifiers
@@ -138,3 +139,14 @@ test "RFC examples" {
 		test_fail "modified assignment failed (6): ${a}";
 	}	
 }
+
+/* RFC mentions `characters' and not octets */
+
+test "Modifier :length utf8" {
+	set "a" "Das ist ${unicode: 00fc}berhaupt nicht m${unicode: 00f6}glich.";
+
+	set :length "b" "${a}";
+    if not string "${b}" "32" {
+        test_fail "incorrect number of unicode characters reported: ${b}/32";
+    }
+}
-- 
GitLab