2007-08-04 Johannes Schmid <johannes.schmid@openismus.com>
[modest] / src / modest-text-utils.c
index f01e706..51e340e 100644 (file)
  */
 
 
  */
 
 
+
+#ifndef _GNU_SOURCE
+#define _GNU_SOURCE
+#endif /*_GNU_SOURCE*/
+#include <string.h> /* for strcasestr */
+
+
 #include <glib.h>
 #include <glib.h>
-#include <string.h>
 #include <stdlib.h>
 #include <glib/gi18n.h>
 #include <regex.h>
 #include <stdlib.h>
 #include <glib/gi18n.h>
 #include <regex.h>
@@ -242,9 +248,9 @@ modest_text_utils_derived_subject (const gchar *subject, const gchar *prefix)
        gchar *tmp;
 
        g_return_val_if_fail (prefix, NULL);
        gchar *tmp;
 
        g_return_val_if_fail (prefix, NULL);
-       
-       if (!subject)
-               return g_strdup (prefix);
+
+       if (!subject || subject[0] == '\0')
+               subject = _("mail_va_no_subject");
 
        tmp = g_strchug (g_strdup (subject));
 
 
        tmp = g_strchug (g_strdup (subject));
 
@@ -1071,6 +1077,53 @@ modest_text_utils_get_display_date (time_t date)
 
 
 gboolean
 
 
 gboolean
+modest_text_utils_validate_folder_name (const gchar *folder_name)
+{
+       /* based on http://msdn2.microsoft.com/en-us/library/aa365247.aspx,
+        * with some extras */
+       
+       guint len;
+       const gchar **cursor;
+       const gchar *forbidden_chars[] = {
+               "<", ">", ":", "\"", "/", "\\", "|", "?", "*", "^", "%", "$", NULL
+       };
+       const gchar *forbidden_names[] = { /* windows does not like these */
+               "CON", "PRN", "AUX", "NUL", "COM1", "COM2", "COM3", "COM4", "COM5", "COM6",
+               "COM7", "COM8", "COM9", "LPT1", "LPT2", "LPT3", "LPT4", "LPT5", "LPT6", "LPT7", "LPT8", "LPT9",
+               ".", "..", NULL
+       };
+       
+       /* cannot be NULL */
+       if (!folder_name) 
+               return FALSE;
+
+       /* cannot be empty */
+       len = strlen(folder_name);
+       if (len == 0)
+               return FALSE;
+       
+       /* cannot start or end with a space */
+       if (g_ascii_isspace(folder_name[0]) || g_ascii_isspace(folder_name[len - 1]))
+               return FALSE; 
+
+       /* cannot contain a forbidden char */
+       for (cursor = forbidden_chars; cursor && *cursor; ++cursor)
+               if (strstr(folder_name, *cursor) != NULL)
+                       return FALSE;
+       
+       /* cannot contain a forbidden word */
+       if (len <= 4) {
+               for (cursor = forbidden_names; cursor && *cursor; ++cursor) {
+                       if (g_ascii_strcasecmp (folder_name, *cursor) == 0)
+                               return FALSE;
+               }
+       }
+       return TRUE; /* it's valid! */
+}
+
+
+
+gboolean
 modest_text_utils_validate_domain_name (const gchar *domain)
 {
        gboolean valid = FALSE;
 modest_text_utils_validate_domain_name (const gchar *domain)
 {
        gboolean valid = FALSE;
@@ -1104,7 +1157,14 @@ modest_text_utils_validate_email_address (const gchar *email_address, const gcha
 
        if (invalid_char_position != NULL)
                *invalid_char_position = NULL;
 
        if (invalid_char_position != NULL)
                *invalid_char_position = NULL;
-
+       
+       /* check that the email adress contains exactly one @ */
+       if (!strstr(email_address, "@") || 
+                       (strstr(email_address, "@") != g_strrstr(email_address, "@")))
+       {
+               return FALSE;
+       }
+       
        /* first we validate the name portion (name@domain) */
        for (c = email_address;  *c;  c++) {
                if (*c == '\"' && 
        /* first we validate the name portion (name@domain) */
        for (c = email_address;  *c;  c++) {
                if (*c == '\"' && 
@@ -1145,7 +1205,7 @@ modest_text_utils_validate_email_address (const gchar *email_address, const gcha
                return FALSE;
        do {
                if (*c == '.') {
                return FALSE;
        do {
                if (*c == '.') {
-                       if (c == domain || *(c - 1) == '.') 
+                       if (c == domain || *(c - 1) == '.' || *(c + 1) == '\0') 
                                return FALSE;
                        count++;
                }
                                return FALSE;
                        count++;
                }