]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-imap: Added imap_utf7_is_valid()
authorTimo Sirainen <tss@iki.fi>
Wed, 5 Jun 2013 14:48:48 +0000 (17:48 +0300)
committerTimo Sirainen <tss@iki.fi>
Wed, 5 Jun 2013 14:48:48 +0000 (17:48 +0300)
src/lib-imap/imap-utf7.c
src/lib-imap/imap-utf7.h
src/lib-imap/test-imap-utf7.c

index e499156c5e40845fb174a4c013c09e51f1206352..4c58a9118b270762049d611800322a9fd6ed2c29 100644 (file)
@@ -271,3 +271,22 @@ int imap_utf7_to_utf8(const char *src, string_t *dest)
        }
        return 0;
 }
+
+bool imap_utf7_is_valid(const char *src)
+{
+       const char *p;
+       int ret;
+
+       for (p = src; *p != '\0'; p++) {
+               if (*p == '&' || (unsigned char)*p >= 0x80) {
+                       /* slow scan */
+                       T_BEGIN {
+                               string_t *tmp = t_str_new(128);
+                               ret = imap_utf7_to_utf8(p, tmp);
+                       } T_END;
+                       if (ret < 0)
+                               return FALSE;
+               }
+       }
+       return TRUE;
+}
index f41b8db30918151a74f3f778874e1ce9cd25b120..5d7875f198c899910c133fca93b17af39bf024bd 100644 (file)
@@ -8,5 +8,7 @@ int t_imap_utf8_to_utf7(const char *src, const char **dest_r);
 /* Convert IMAP-UTF-7 string to UTF-8. Returns 0 if ok, -1 if src isn't
    valid IMAP-UTF-7. */
 int imap_utf7_to_utf8(const char *src, string_t *dest);
+/* Returns TRUE if the string is valid IMAP-UTF-7 string. */
+bool imap_utf7_is_valid(const char *src);
 
 #endif
index 93360de7da6450cce2a251f1b6b3a4a2e2404328..e08dbf3f9040ea51120db40f23767b42ab3d5c5d 100644 (file)
@@ -8,53 +8,46 @@
 
 static void test_imap_utf7(void)
 {
-       static const char *to_utf7[] = {
-               "&&x&&", "&-&-x&-&-",
-               "~peter/mail/台北/日本語", "~peter/mail/&U,BTFw-/&ZeVnLIqe-",
-               "tietäjä", "tiet&AOQ-j&AOQ-",
-               "p\xe4\xe4", NULL,
-               NULL
-       };
-       static const char *invalid_utf7[] = {
-               "&Jjo!",
-               "&U,BTFw-&ZeVnLIqe-",
-               NULL
+       static struct test {
+               const char *utf8;
+               const char *mutf7;
+       } tests[] = {
+               { "&&x&&", "&-&-x&-&-" },
+               { "~peter/mail/台北/日本語", "~peter/mail/&U,BTFw-/&ZeVnLIqe-" },
+               { "tietäjä", "tiet&AOQ-j&AOQ-" },
+               { "p\xe4\xe4", NULL },
+               { NULL, "&" },
+               { NULL, "&Jjo" },
+               { NULL, "&Jjo!" },
+               { NULL, "&U,BTFw-&ZeVnLIqe-" }
        };
        string_t *src, *dest;
        const char *orig_src;
        unsigned int i, j;
        unichar_t chr;
-       bool success, all_success = TRUE;
 
        src = t_str_new(256);
        dest = t_str_new(256);
 
-       for (i = 0; to_utf7[i] != NULL; i += 2) {
-               str_truncate(dest, 0);
-               if (imap_utf8_to_utf7(to_utf7[i], dest) < 0)
-                       success = to_utf7[i+1] == NULL;
-               else {
-                       success = to_utf7[i+1] != NULL &&
-                               strcmp(to_utf7[i+1], str_c(dest)) == 0;
+       test_begin("imap mutf7");
+       for (i = 0; i < N_ELEMENTS(tests); i++) {
+               if (tests[i].utf8 != NULL) {
+                       str_truncate(dest, 0);
+                       if (imap_utf8_to_utf7(tests[i].utf8, dest) < 0)
+                               test_assert(tests[i].mutf7 == NULL);
+                       else
+                               test_assert(null_strcmp(tests[i].mutf7, str_c(dest)) == 0);
                }
-               if (!success) {
-                       test_out(t_strdup_printf("imap_utf8_to_utf7(%d)", i/2),
-                                FALSE);
-                       all_success = FALSE;
-               } else if (to_utf7[i+1] != NULL) {
+               if (tests[i].mutf7 != NULL) {
                        str_truncate(dest, 0);
-                       if (imap_utf7_to_utf8(to_utf7[i+1], dest) < 0 ||
-                           strcmp(to_utf7[i], str_c(dest)) != 0) {
-                               test_out(t_strdup_printf("imap_utf7_to_utf8(%d)", i/2),
-                                        FALSE);
-                               all_success = FALSE;
-                       }
+                       if (imap_utf7_to_utf8(tests[i].mutf7, dest) < 0)
+                               test_assert(tests[i].utf8 == NULL);
+                       else
+                               test_assert(null_strcmp(tests[i].utf8, str_c(dest)) == 0);
+                       test_assert(imap_utf7_is_valid(tests[i].mutf7) != (tests[i].utf8 == NULL));
                }
        }
-       if (all_success)
-               test_out("imap_utf8_to_utf7()", TRUE);
 
-       success = TRUE;
        for (chr = 0xffff; chr <= 0x10010; chr++) {
                for (i = 1; i <= 10; i++) {
                        str_truncate(src, 0);
@@ -70,28 +63,12 @@ static void test_imap_utf7(void)
                        orig_src = t_strdup(str_c(src));
                        str_truncate(src, 0);
 
-                       if (imap_utf8_to_utf7(orig_src, dest) < 0)
-                               success = FALSE;
-                       else if (imap_utf7_to_utf8(str_c(dest), src) < 0)
-                               success = FALSE;
-                       else
-                               success = strcmp(str_c(src), orig_src) == 0;
-                       if (!success)
-                               goto end;
-               }
-       }
-end:
-       test_out("imap_utf7_to_utf8(reverse)", success);
-       for (i = 0; invalid_utf7[i] != NULL; i++) {
-               str_truncate(dest, 0);
-               if (imap_utf7_to_utf8(invalid_utf7[i], dest) == 0) {
-                       test_out(t_strdup_printf("imap_utf7_to_utf8(invalid.%d)", i),
-                                FALSE);
-                       all_success = FALSE;
+                       test_assert(imap_utf8_to_utf7(orig_src, dest) == 0);
+                       test_assert(imap_utf7_to_utf8(str_c(dest), src) == 0);
+                       test_assert(strcmp(str_c(src), orig_src) == 0);
                }
        }
-       if (all_success)
-               test_out("imap_utf7_to_utf8(invalid)", TRUE);
+       test_end();
 }
 
 int main(void)