isync

mailbox synchronization program
git clone https://git.code.sf.net/p/isync/isync
Log | Files | Refs | README | LICENSE

commit 3bfc3c5063b5c5a02d77c97dd43461e7e19ca0f7
parent acd6b4b0b89d8e706f1463c97582868dec3c190b
Author: Oswald Buddenhagen <ossi@users.sf.net>
Date:   Fri,  3 Jun 2022 18:06:50 +0200

forbid nesting maildir Path under Inbox again

it was never documented, and i can't really think of a case where
someone would actually want it, as the MUA side of things would be just
weird. additionally, the case of Path being Inbox+'/' did not work
anyway. will reconsider and fix the latter case if someone complains.

reverts 98bd2b11.

Diffstat:
Msrc/drv_maildir.c | 25+++++++++++++++----------
1 file changed, 15 insertions(+), 10 deletions(-)

diff --git a/src/drv_maildir.c b/src/drv_maildir.c @@ -365,7 +365,7 @@ maildir_list_maildirpp( maildir_store_t *ctx, int flags, const char *inbox ) static int maildir_list_recurse( maildir_store_t *ctx, int isBox, int flags, - const char *inbox, uint inboxLen, const char *basePath, uint basePathLen, + const char *inbox, uint inboxLen, char *path, int pathLen, char *name, int nameLen ) { DIR *dir; @@ -402,8 +402,6 @@ maildir_list_recurse( maildir_store_t *ctx, int isBox, int flags, pl += pathLen; if (inbox && equals( path, pl, inbox, inboxLen )) { // Inbox nested into Path. - } else if (basePath && equals( path, pl, basePath, basePathLen )) { - // Path nested into Inbox. } else { if (style == SUB_LEGACY) { if (*ent == '.') { @@ -431,7 +429,7 @@ maildir_list_recurse( maildir_store_t *ctx, int isBox, int flags, add_string_list( &ctx->boxes, name ); path[pl] = 0; name[nl++] = '/'; - if (maildir_list_recurse( ctx, isBox + 1, flags, inbox, inboxLen, basePath, basePathLen, path, pl, name, nl ) < 0) { + if (maildir_list_recurse( ctx, isBox + 1, flags, inbox, inboxLen, path, pl, name, nl ) < 0) { closedir( dir ); return -1; } @@ -451,9 +449,8 @@ maildir_list_inbox( maildir_store_t *ctx, int flags ) ctx->listed |= LIST_INBOX; add_string_list( &ctx->boxes, "INBOX" ); - const char *basePath = ctx->conf->path; return maildir_list_recurse( - ctx, 1, flags, NULL, 0, basePath, basePath ? strlen( basePath ) - 1 : 0, + ctx, 1, flags, NULL, 0, path, nfsnprintf( path, _POSIX_PATH_MAX, "%s/", ctx->conf->inbox ), name, nfsnprintf( name, _POSIX_PATH_MAX, "INBOX/" ) ); } @@ -471,7 +468,7 @@ maildir_list_path( maildir_store_t *ctx, int flags ) return -1; const char *inbox = ctx->conf->inbox; return maildir_list_recurse( - ctx, 0, flags, inbox, strlen( inbox ), NULL, 0, + ctx, 0, flags, inbox, strlen( inbox ), path, nfsnprintf( path, _POSIX_PATH_MAX, "%s", ctx->conf->path ), name, 0 ); } @@ -1908,9 +1905,17 @@ maildir_parse_store( conffile_t *cfg, store_conf_t **storep ) } if (!store->inbox) store->inbox = expand_strdup( "~/Maildir", NULL ); - if (store->sub_style == SUB_MAILDIRPP && store->path) { - error( "Maildir store '%s': Setting Path is incompatible with 'SubFolders Maildir++'\n", store->name ); - cfg->err = 1; + if (store->path) { + if (store->sub_style == SUB_MAILDIRPP) { + error( "Maildir store '%s': Setting Path is incompatible with 'SubFolders Maildir++'\n", store->name ); + cfg->err = 1; + } else { + uint inboxLen = strlen( store->inbox ); + if (starts_with( store->path, -1, store->inbox, inboxLen ) && store->path[inboxLen] == '/') { + error( "Maildir store '%s': Path cannot be nested under Inbox\n", store->name ); + cfg->err = 1; + } + } } nfasprintf( &store->info_prefix, "%c2,", store->info_delimiter ); nfasprintf( &store->info_stop, "%c,", store->info_delimiter );