Hi Artyom,
Yeah wow, this is really gross.
I'm pretty sure the gibberish in those "??????Default.script.bc" filenames is just whatever junk was in the (uninitialised) sieve_script_dir variable.
I've had a rummage around, and there's a user_sieve_path() function in imap/user.c that does the heavy lifting of finding a user's sieve script directory. Looks like sieve_script_dir wanted to be the result of that. Your fix is on the right track. :)
I've attached a patch for 2.5.x that fixes these paths using user_sieve_path(). It also fixes the assumption that the sievedir value will end in a "/", which it doesn't by default, and shouldn't need to. Can you try it out and see how it goes? (The patch should apply cleanly on any version of 2.5, this file has barely changed since it was created.)
The rest of the autocreate_sieve() function is pretty awful too -- there's almost certainly more bugs in there, and fixing the paths might just shake them out. I'd like to tidy this up significantly (and make some test cases for it), but in the meantime hopefully this will get you moving forward.
Cheers,
ellie
On Tue, Oct 6, 2015, at 12:56 AM, Artyom Aleksandrov wrote:
Guys I don't understand hot it can work.I added additional logging and found that sieve_script_dir is not defined.After adding this definition the problem gone.147 /* Check if autocreate_sieve_compiledscript is defined in imapd.conf */148 if(!(compiled_source_script = config_getstring(IMAPOPT_AUTOCREATE_SIEVE_SCRIPT_COMPILED))) {149 syslog(LOG_WARNING, "autocreate_sieve: autocreate_sieve_compiledscript option is not defined. Compiling it");150 do_compile = 1;151 }152153 char userletter[1];154 userletter[0]=userid[0];155 snprintf(sieve_script_dir, MAX_FILENAME, "%s%s/%s/",sieve_dir,userletter,userid);On Thu, Oct 1, 2015 at 8:49 PM, Artyom Aleksandrov <mailing.list@xxxxxxxxx> wrote:Is it works? Which version do you use?Could you guest the reason of the problem? How I can troubleshoot it?:/var/lib/cyrus# ls -latotal 2176-rw------- 1 cyrus mail 124 Sep 25 16:04 ??????Default.script.bc-rw------- 1 cyrus mail 231 Sep 25 16:04 ??????Default.script.scriptlrwxrwxrwx 1 cyrus mail 17 Sep 25 16:04 ??????defaultbc -> Default.script.bc-rw------- 1 cyrus mail 124 Jul 2 12:38 ??N???Default.script.bc-rw------- 1 cyrus mail 231 Jul 2 12:38 ??N???Default.script.scriptlrwxrwxrwx 1 cyrus mail 17 Jul 2 12:38 ??N???defaultbc -> Default.script.bc-rw------- 1 cyrus mail 124 Sep 22 15:10 0#?>??Default.script.bc-rw------- 1 cyrus mail 231 Sep 22 15:10 0#?>??Default.script.scriptlrwxrwxrwx 1 cyrus mail 17 Sep 22 15:10 0#?>??defaultbc -> Default.script.bcOn Thu, Oct 1, 2015 at 7:55 PM, Alvin Starr <alvin@xxxxxxxxxx> wrote:I use autocreate.So there is at least one.On 10/01/2015 12:18 PM, Artyom Aleksandrov wrote:Does anybody use autocreate_sieve?On Sat, Sep 26, 2015 at 1:30 AM, Artyom Aleksandrov <mailing.list@xxxxxxxxx> wrote:Hello,I want to create default sieve scipt for all my users but I stuck with strange problem that looks like the bug. Unfortunately I've never wrote on C so it's difficult for me to find it.
When Cyrus (2.5.3 or 2.5.6) create default sieve script it doesn't put file in sieve_dir/?/user folder. It jist creates tmp files in configdirectory with names like this
-rw------- 1 cyrus mail 124 Sep 26 00:41 ?&?P??default.script.bc
-rw------- 1 cyrus mail 231 Sep 26 00:41 ?&?P??default.script.script
lrwxrwxrwx 1 cyrus mail 17 Sep 26 00:41 ?&?P??defaultbc -> default.script.bcThere are not checks in this stage so my syslog is clean of error.Everything seems fine.
Sep 26 00:41:34 imapsync cyrus/imap[26117]: autocreate_sieve: Problem opening compiled script file: default.script.bc. Compiling it
Sep 26 00:41:34 imapsync cyrus/imap[26117]: autocreate_sieve: Compiled sieve script was successfully saved in default.script.bc
Sep 26 00:41:34 imapsync cyrus/imap[26117]: autocreate_sieve: User XXXX, default sieve script creation succeededMy setting:autocreate_sieve_script: /var/spool/sieve/global/default.script
autocreate_sieve_script_compile: yes
autocreate_sieve_script_compiled: default.script.bc
sievedir: /var/spool/sieve/
Distributive: Ubuntu 14.04.3I'll be glad for any help. )Best regards, Artyom---- Cyrus Home Page: http://www.cyrusimap.org/ List Archives/Info: http://lists.andrew.cmu.edu/pipermail/info-cyrus/ To Unsubscribe: https://lists.andrew.cmu.edu/mailman/listinfo/info-cyrus
-- Alvin Starr || voice: (905)513-7688 Netvel Inc. || Cell: (416)806-0133 alvin@xxxxxxxxxx ||----Cyrus Home Page: http://www.cyrusimap.org/List Archives/Info: http://lists.andrew.cmu.edu/pipermail/info-cyrus/To Unsubscribe:----Cyrus Home Page: http://www.cyrusimap.org/List Archives/Info: http://lists.andrew.cmu.edu/pipermail/info-cyrus/To Unsubscribe:
diff --git a/imap/autocreate.c b/imap/autocreate.c index 8b06473..2ffa95f 100644 --- a/imap/autocreate.c +++ b/imap/autocreate.c @@ -112,7 +112,6 @@ static const char *get_script_name(const char *filename) static int autocreate_sieve(const char *userid, const char *source_script) { /* XXX - this is really ugly, but too much work to tidy up right now -- Bron */ - const char *sieve_dir = NULL; sieve_script_t *s = NULL; bytecode_info_t *bc = NULL; char *err = NULL; @@ -121,8 +120,8 @@ static int autocreate_sieve(const char *userid, const char *source_script) int do_compile = 0; const char *compiled_source_script = NULL; const char *sievename = get_script_name(source_script); + const char *sieve_script_dir = NULL; char sieve_script_name[MAX_FILENAME]; - char sieve_script_dir[MAX_FILENAME]; char sieve_bcscript_name[MAX_FILENAME]; char sieve_default[MAX_FILENAME]; char sieve_tmpname[MAX_FILENAME]; @@ -139,7 +138,7 @@ static int autocreate_sieve(const char *userid, const char *source_script) } /* Check if sievedir is defined in imapd.conf */ - if(!(sieve_dir = config_getstring(IMAPOPT_SIEVEDIR))) { + if(config_getstring(IMAPOPT_SIEVEDIR)) { syslog(LOG_WARNING, "autocreate_sieve: sievedir option is not defined. Check imapd.conf"); return 1; } @@ -150,28 +149,34 @@ static int autocreate_sieve(const char *userid, const char *source_script) do_compile = 1; } - if(snprintf(sieve_tmpname, MAX_FILENAME, "%s%s.script.NEW",sieve_script_dir, sievename) >= MAX_FILENAME) { - syslog(LOG_WARNING, "autocreate_sieve: Invalid sieve path %s, %s, %s", sieve_dir, sievename, userid); + if (!(sieve_script_dir = user_sieve_path(userid))) { + syslog(LOG_WARNING, "autocreate_sieve: unable to determine sieve directory for user %s", userid); return 1; } - if(snprintf(sieve_bctmpname, MAX_FILENAME, "%s%s.bc.NEW",sieve_script_dir, sievename) >= MAX_FILENAME) { - syslog(LOG_WARNING, "autocreate_sieve: Invalid sieve path %s, %s, %s", sieve_dir, sievename, userid); + + if(snprintf(sieve_tmpname, MAX_FILENAME, "%s/%s.script.NEW",sieve_script_dir, sievename) >= MAX_FILENAME) { + syslog(LOG_WARNING, "autocreate_sieve: Invalid sieve path %s, %s, %s", sieve_script_dir, sievename, userid); + return 1; + } + if(snprintf(sieve_bctmpname, MAX_FILENAME, "%s/%s.bc.NEW",sieve_script_dir, sievename) >= MAX_FILENAME) { + syslog(LOG_WARNING, "autocreate_sieve: Invalid sieve path %s, %s, %s", sieve_script_dir, sievename, userid); return 1; } - if(snprintf(sieve_script_name, MAX_FILENAME, "%s%s.script",sieve_script_dir, sievename) >= MAX_FILENAME) { - syslog(LOG_WARNING, "autocreate_sieve: Invalid sieve path %s, %s, %s", sieve_dir, sievename, userid); + if(snprintf(sieve_script_name, MAX_FILENAME, "%s/%s.script",sieve_script_dir, sievename) >= MAX_FILENAME) { + syslog(LOG_WARNING, "autocreate_sieve: Invalid sieve path %s, %s, %s", sieve_script_dir, sievename, userid); return 1; } - if(snprintf(sieve_bcscript_name, MAX_FILENAME, "%s%s.bc",sieve_script_dir, sievename) >= MAX_FILENAME) { - syslog(LOG_WARNING, "autocreate_sieve: Invalid sieve path %s, %s, %s", sieve_dir, sievename, userid); + if(snprintf(sieve_bcscript_name, MAX_FILENAME, "%s/%s.bc",sieve_script_dir, sievename) >= MAX_FILENAME) { + syslog(LOG_WARNING, "autocreate_sieve: Invalid sieve path %s, %s, %s", sieve_script_dir, sievename, userid); return 1; } - if(snprintf(sieve_default, MAX_FILENAME, "%s%s",sieve_script_dir,"defaultbc") >= MAX_FILENAME) { - syslog(LOG_WARNING, "autocreate_sieve: Invalid sieve path %s, %s, %s", sieve_dir, sievename, userid); + if(snprintf(sieve_default, MAX_FILENAME, "%s/%s",sieve_script_dir,"defaultbc") >= MAX_FILENAME) { + syslog(LOG_WARNING, "autocreate_sieve: Invalid sieve path %s, %s, %s", sieve_script_dir, sievename, userid); return 1; } + /* XXX no directory? umm */ if(snprintf(sieve_bclink_name, MAX_FILENAME, "%s.bc", sievename) >= MAX_FILENAME) { - syslog(LOG_WARNING, "autocreate_sieve: Invalid sieve path %s, %s, %s", sieve_dir, sievename, userid); + syslog(LOG_WARNING, "autocreate_sieve: Invalid sieve path %s, %s, %s", sieve_script_dir, sievename, userid); return 1; }
---- Cyrus Home Page: http://www.cyrusimap.org/ List Archives/Info: http://lists.andrew.cmu.edu/pipermail/info-cyrus/ To Unsubscribe: https://lists.andrew.cmu.edu/mailman/listinfo/info-cyrus