Пример #1
0
static int getinclude(void *sc, const char *script, int isglobal,
		      char *fname, size_t size)
{
    script_data_t *sdata = (script_data_t *) sc;
    char userbuf[MAX_MAILBOX_BUFFER], *user, *domain = NULL;
    struct stat sbuf;
    int r;

    if (strstr(script, "../")) {
	syslog(LOG_NOTICE, "Illegal script name '%s' for user '%s'",
	       script, sdata->username);
	return SIEVE_FAIL;
    }

    user = (char *) sdata->username;
    if (config_virtdomains && strchr(user, '@')) {
	/* split the user and domain */
	strlcpy(userbuf, sdata->username, sizeof(userbuf));
	user = userbuf;
	if ((domain = strrchr(user, '@'))) *domain++ = '\0';
    }

    r = sieve_find_script(isglobal ? NULL : user, domain, script,
			  fname, size);

    if (!r && isglobal && domain && stat(fname, &sbuf) != 0) {
	/* if the domain-specific global script doesn't exist,
	   try a server-wide global script */
	r = sieve_find_script(NULL, NULL, script, fname, size);
    }

    return r;
}
Пример #2
0
static int getinclude(void *sc, const char *script, int isglobal,
                      char *fname, size_t size)
{
    script_data_t *sdata = (script_data_t *) sc;
    struct stat sbuf;
    int r;

    if (strstr(script, "../")) {
        syslog(LOG_NOTICE, "Illegal script name '%s' for user '%s'",
               script, mbname_userid(sdata->mbname));
        return SIEVE_FAIL;
    }

    r = sieve_find_script(isglobal ? NULL : mbname_localpart(sdata->mbname),
                          mbname_domain(sdata->mbname), script, fname, size);

    if (!r && isglobal && mbname_domain(sdata->mbname) && stat(fname, &sbuf) != 0) {
        /* if the domain-specific global script doesn't exist,
           try a server-wide global script */
        r = sieve_find_script(NULL, NULL, script, fname, size);
    }

    return r;
}