static int sieve_attribute_set_active(struct mail_storage *storage, struct sieve_storage *svstorage, const struct mail_attribute_value *value) { const char *scriptname; struct sieve_script *script; int ret; if (mailbox_attribute_value_to_string(storage, value, &scriptname) < 0) return -1; if (scriptname == NULL) { /* don't affect non-link active script */ if ((ret=sieve_storage_is_singular(svstorage)) != 0) { if (ret < 0) { mail_storage_set_internal_error(storage); return -1; } return 0; } /* deactivate current script */ if (sieve_storage_deactivate(svstorage, value->last_change) < 0) { mail_storage_set_critical(storage, "Failed to deactivate Sieve: %s", sieve_storage_get_last_error(svstorage, NULL)); return -1; } return 0; } i_assert(scriptname[0] == MAILBOX_ATTRIBUTE_SIEVE_DEFAULT_LINK); scriptname++; /* activate specified script */ script = sieve_storage_open_script(svstorage, scriptname, NULL); ret = script == NULL ? -1 : sieve_script_activate(script, value->last_change); if (ret < 0) { mail_storage_set_critical(storage, "Failed to activate Sieve script '%s': %s", scriptname, sieve_storage_get_last_error(svstorage, NULL)); } if (script != NULL) sieve_script_unref(&script); sieve_storage_set_modified(svstorage, value->last_change); return ret; }
static const char * sieve_attribute_iter_next_script(struct sieve_mailbox_attribute_iter *siter) { struct mail_user *user = siter->iter.box->storage->user; struct sieve_mail_user *suser = SIEVE_USER_CONTEXT(user); struct sieve_storage *svstorage = suser->sieve_storage; const char *scriptname; bool active; int ret; if (siter->sieve_list == NULL) return NULL; /* Iterate through all scripts in sieve_dir */ while ((scriptname = sieve_storage_list_next(siter->sieve_list, &active)) != NULL) { if (active) siter->have_active = TRUE; str_truncate(siter->name, strlen(MAILBOX_ATTRIBUTE_PREFIX_SIEVE_FILES)); str_append(siter->name, scriptname); return str_c(siter->name); } if (sieve_storage_list_deinit(&siter->sieve_list) < 0) { mail_storage_set_critical(siter->iter.box->storage, "Failed to iterate sieve scripts: %s", sieve_storage_get_last_error(svstorage, NULL)); siter->failed = TRUE; return NULL; } /* Check whether active script is a proper symlink or a regular file */ if ((ret=sieve_storage_is_singular(svstorage)) < 0) { mail_storage_set_critical(siter->iter.box->storage, "Failed to iterate sieve scripts: %s", sieve_storage_get_last_error(svstorage, NULL)); return NULL; } /* Regular file */ if (ret > 0) return MAILBOX_ATTRIBUTE_SIEVE_DEFAULT; /* Symlink or none active */ return siter->have_active ? MAILBOX_ATTRIBUTE_SIEVE_DEFAULT : NULL; }
static int sieve_attribute_unset_active_script(struct mail_storage *storage, struct sieve_storage *svstorage, time_t last_change) { int ret; if ((ret=sieve_storage_is_singular(svstorage)) != 0) { if (ret < 0) mail_storage_set_internal_error(storage); return ret; } if (sieve_storage_deactivate(svstorage, last_change) < 0) { mail_storage_set_critical(storage, "Failed to deactivate sieve: %s", sieve_storage_get_last_error(svstorage, NULL)); return -1; } return 0; }