commit 608834c6f1fa117513c737b7fbe4f87665ce564d
Author: Oswald Buddenhagen <[email protected]>
Date:   Sat Oct 4 12:16:10 2014 +0200

    permit Maildir Stores without a Path
    
    it is perfectly reasonable to have a Store which has only an Inbox.

 src/config.c      |    2 -
 src/drv_imap.c    |    2 +
 src/drv_maildir.c |   46 ++++++++++++++++++++++++++++++++++----------
 3 files changed, 37 insertions(+), 13 deletions(-)

diff --git a/src/config.c b/src/config.c
index 8fc0949..cf3b165 100644
--- a/src/config.c
+++ b/src/config.c
@@ -354,8 +354,6 @@ load_config( const char *where, int pseudo )
                for (i = 0; i < N_DRIVERS; i++)
                        if (drivers[i]->parse_store( &cfile, &store )) {
                                if (store) {
-                                       if (!store->path)
-                                               store->path = "";
                                        if (!store->max_size)
                                                store->max_size = INT_MAX;
                                        *storeapp = store;
diff --git a/src/drv_imap.c b/src/drv_imap.c
index 67c24b9..f79cdb8 100644
--- a/src/drv_imap.c
+++ b/src/drv_imap.c
@@ -2382,6 +2382,8 @@ imap_parse_store( conffile_t *cfg, store_conf_t **storep )
                        error( "%s '%s' has both Account and account-specific 
options\n", type, name );
                        cfg->err = 1;
                }
+               if (!store->gen.path)
+                       store->gen.path = "";
        }
        return 1;
 }
diff --git a/src/drv_maildir.c b/src/drv_maildir.c
index cc2161f..6f5a7ea 100644
--- a/src/drv_maildir.c
+++ b/src/drv_maildir.c
@@ -121,23 +121,39 @@ maildir_join_path( const char *prefix, const char *box )
        return out;
 }
 
-static void
-maildir_open_store( store_conf_t *conf, const char *label ATTR_UNUSED,
-                    void (*cb)( store_t *ctx, void *aux ), void *aux )
+static int
+maildir_validate_path( const store_conf_t *conf )
 {
-       maildir_store_t *ctx;
        struct stat st;
 
+       if (!conf->path) {
+               error( "Maildir error: store '%s' has no Path\n", conf->name );
+               return -1;
+       }
        if (stat( conf->path, &st ) || !S_ISDIR(st.st_mode)) {
                error( "Maildir error: cannot open store '%s'\n", conf->path );
-               cb( 0, aux );
-               return;
+               return -1;
        }
+       return 0;
+}
+
+static void
+maildir_open_store( store_conf_t *conf, const char *label ATTR_UNUSED,
+                    void (*cb)( store_t *ctx, void *aux ), void *aux )
+{
+       maildir_store_t *ctx;
+
        ctx = nfcalloc( sizeof(*ctx) );
        ctx->gen.conf = conf;
        ctx->uvfd = -1;
-       if (conf->trash)
+       if (conf->trash) {
+               if (maildir_validate_path( conf ) < 0) {
+                       free( ctx );
+                       cb( 0, aux );
+                       return;
+               }
                ctx->trash = maildir_join_path( conf->path, conf->trash );
+       }
        cb( &ctx->gen, aux );
 }
 
@@ -267,6 +283,8 @@ maildir_list_path( store_t *gctx, int *flags )
 {
        char path[_POSIX_PATH_MAX], name[_POSIX_PATH_MAX];
 
+       if (maildir_validate_path( gctx->conf ) < 0)
+               return -1;
        return maildir_list_recurse(
                gctx, 0, flags, ((maildir_store_conf_t *)gctx->conf)->inbox,
                path, nfsnprintf( path, _POSIX_PATH_MAX, "%s", gctx->conf->path 
),
@@ -922,10 +940,16 @@ maildir_select( store_t *gctx, int create,
 #ifdef USE_DB
        ctx->db = 0;
 #endif /* USE_DB */
-       gctx->path =
-               (!memcmp( gctx->name, "INBOX", 5 ) && (!gctx->name[5] || 
gctx->name[5] == '/')) ?
-                       maildir_join_path( ((maildir_store_conf_t 
*)gctx->conf)->inbox, gctx->name + 5 ) :
-                       maildir_join_path( gctx->conf->path, gctx->name );
+       if (!memcmp( gctx->name, "INBOX", 5 ) && (!gctx->name[5] || 
gctx->name[5] == '/')) {
+               gctx->path = maildir_join_path( ((maildir_store_conf_t 
*)gctx->conf)->inbox, gctx->name + 5 );
+       } else {
+               if (maildir_validate_path( gctx->conf ) < 0) {
+                       maildir_invoke_bad_callback( gctx );
+                       cb( DRV_CANCELED, aux );
+                       return;
+               }
+               gctx->path = maildir_join_path( gctx->conf->path, gctx->name );
+       }
 
        if ((ret = maildir_validate( gctx->path, create, ctx )) != DRV_OK) {
                cb( ret, aux );

------------------------------------------------------------------------------
Meet PCI DSS 3.0 Compliance Requirements with EventLog Analyzer
Achieve PCI DSS 3.0 Compliant Status with Out-of-the-box PCI DSS Reports
Are you Audit-Ready for PCI DSS 3.0 Compliance? Download White paper
Comply to PCI DSS 3.0 Requirement 10 and 11.5 with EventLog Analyzer
http://pubads.g.doubleclick.net/gampad/clk?id=154622311&iu=/4140/ostg.clktrk
_______________________________________________
isync-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/isync-devel

Reply via email to