* add a function to check for valid folder name;
authorDirk-Jan C. Binnema <dirk-jan.binnema@nokia.com>
Fri, 3 Aug 2007 09:47:02 +0000 (09:47 +0000)
committerDirk-Jan C. Binnema <dirk-jan.binnema@nokia.com>
Fri, 3 Aug 2007 09:47:02 +0000 (09:47 +0000)
  we do a comprehensive test, also disallowing names which are not
  valid on Windows filesystems (like AUX, or ':'); thus, it
  should also work on MMC, and also make sure that user-created local folders
  can be moved there.

pmo-trunk-r2919

src/modest-text-utils.c
src/modest-text-utils.h

index 3c63385..da5859d 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>
@@ -1071,6 +1077,54 @@ 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) {
+                       g_warning ("%s", *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;
index 5425d60..1c7fe41 100644 (file)
@@ -292,6 +292,20 @@ gboolean modest_text_utils_validate_domain_name (const gchar *domain);
 gboolean     modest_text_utils_validate_email_address (const gchar *email_address, 
                                                       const gchar **invalid_char_position);
 
 gboolean     modest_text_utils_validate_email_address (const gchar *email_address, 
                                                       const gchar **invalid_char_position);
 
+
+/**
+ * modest_text_utils_validate_folder_name:
+ * @folder_name: a string
+ * 
+ * validates the folder name passed as argument. a 'valid folder name'
+ * is a name which should be valid on both Unix and Windows file systems.
+ * of course, this might be stricter than strictly needed in some cases,
+ * but it's better to err on the safe side.
+ * 
+ * Returns: TRUE if the folder name is valid, FALSE otherwise
+ **/
+gboolean modest_text_utils_validate_folder_name (const gchar *folder_name);
+
 /**
  * modest_text_utils_validate_recipient:
  * @recipient: a string
 /**
  * modest_text_utils_validate_recipient:
  * @recipient: a string