Example #1
0
static int
mail_sieve_user_init
(struct mail_user *user, struct sieve_storage **svstorage_r)
{
	struct sieve_mail_user *suser = SIEVE_USER_CONTEXT(user);
	enum sieve_storage_flags storage_flags =
		SIEVE_STORAGE_FLAG_READWRITE |
		SIEVE_STORAGE_FLAG_SYNCHRONIZING;
	struct sieve_environment svenv;

	i_assert( suser != NULL );

	if ( suser->svinst != NULL ) {
		*svstorage_r = suser->sieve_storage;
		return suser->sieve_storage != NULL ? 1 : 0;
	}

	/* Delayed initialization of sieve storage until it's actually needed */
	memset(&svenv, 0, sizeof(svenv));
	svenv.username = user->username;
	(void)mail_user_get_home(user, &svenv.home_dir);
	svenv.base_dir = user->set->base_dir;
	svenv.flags = SIEVE_FLAG_HOME_RELATIVE;

	suser->svinst = sieve_init(&svenv, &mail_sieve_callbacks,
				   user, user->mail_debug);
	suser->sieve_storage = sieve_storage_create_main
			(suser->svinst, user, storage_flags, NULL);

	*svstorage_r = suser->sieve_storage;
	return suser->sieve_storage != NULL ? 1 : 0;
}
static int
doveadm_sieve_cmd_run
(struct doveadm_mail_cmd_context *_ctx,
	struct mail_user *user)
{
	struct doveadm_sieve_cmd_context *ctx =
		(struct doveadm_sieve_cmd_context *)_ctx;
	struct sieve_environment svenv;
	enum sieve_error error;
	int ret;

	memset((void*)&svenv, 0, sizeof(svenv));
	svenv.username = user->username;
	(void)mail_user_get_home(user, &svenv.home_dir);
	svenv.base_dir = user->set->base_dir;
	svenv.flags = SIEVE_FLAG_HOME_RELATIVE;

	ctx->svinst = sieve_init
		(&svenv, &sieve_callbacks, (void *)ctx, user->mail_debug);

	ctx->storage = sieve_storage_create_main
		(ctx->svinst, user, SIEVE_STORAGE_FLAG_READWRITE, &error);
	if ( ctx->storage == NULL ) {
		switch ( error ) {
		case SIEVE_ERROR_NOT_FOUND:
			i_error("Failed to open Sieve storage: Sieve disabled for user");
			break;
		default:
			i_error("Failed to open Sieve storage.");
		}
		doveadm_sieve_cmd_failed_error(ctx, error);
		ret =  -1;

	} else {
		i_assert( ctx->v.run != NULL );
		ret = ctx->v.run(ctx);
		sieve_storage_unref(&ctx->storage);
	}

	sieve_deinit(&ctx->svinst);
	return ret;
}
Example #3
0
static int
imap_sieve_get_storage(struct imap_sieve *isieve,
                       struct sieve_storage **storage_r)
{
    enum sieve_storage_flags storage_flags = 0;
    enum sieve_error error;

    if (isieve->storage != NULL) {
        *storage_r = isieve->storage;
        return 1;
    }

    // FIXME: limit interval between retries

    isieve->storage = sieve_storage_create_main
                      (isieve->svinst, isieve->user, storage_flags, &error);
    if (isieve->storage == NULL) {
        if (error == SIEVE_ERROR_TEMP_FAILURE)
            return -1;
        return 0;
    }
    *storage_r = isieve->storage;
    return 1;
}