static int sieve_attribute_set(struct mailbox_transaction_context *t, enum mail_attribute_type type, const char *key, const struct mail_attribute_value *value) { struct mail_user *user = t->box->storage->user; union mailbox_module_context *sbox = SIEVE_MAIL_CONTEXT(t->box); if (t->box->storage->user->dsyncing && type == MAIL_ATTRIBUTE_TYPE_PRIVATE && strncmp(key, MAILBOX_ATTRIBUTE_PREFIX_SIEVE, strlen(MAILBOX_ATTRIBUTE_PREFIX_SIEVE)) == 0) { time_t ts = (value->last_change != 0 ? value->last_change : ioloop_time); if (sieve_attribute_set_sieve(t->box->storage, key, value) < 0) return -1; if (user->mail_debug) { const char *change; if (value->last_change != 0) { change = t_strflocaltime ("(last change: %Y-%m-%d %H:%M:%S)", value->last_change); } else { change = t_strflocaltime ("(time: %Y-%m-%d %H:%M:%S)", ioloop_time); } i_debug("doveadm-sieve: Assigned value for key `%s' %s", key, change); } /* FIXME: set value len to sieve script size / active name length */ if (value->value != NULL || value->value_stream != NULL) mail_index_attribute_set(t->itrans, TRUE, key, ts, 0); else mail_index_attribute_unset(t->itrans, TRUE, key, ts); return 0; } return sbox->super.attribute_set(t, type, key, value); }
int index_storage_attribute_set(struct mailbox_transaction_context *t, enum mail_attribute_type type, const char *key, const struct mail_attribute_value *value, bool internal_attribute) { struct dict_transaction_context *dtrans; const char *mailbox_prefix; bool pvt = type == MAIL_ATTRIBUTE_TYPE_PRIVATE; time_t ts = value->last_change != 0 ? value->last_change : ioloop_time; int ret = 0; if (!internal_attribute && !MAILBOX_ATTRIBUTE_KEY_IS_USER_ACCESSIBLE(key)) { mail_storage_set_error(t->box->storage, MAIL_ERROR_PARAMS, "Internal attributes cannot be changed directly"); return -1; } if (index_storage_attribute_get_dict_trans(t, type, &dtrans, &mailbox_prefix) < 0) return -1; T_BEGIN { const char *prefixed_key = key_get_prefixed(type, mailbox_prefix, key); const char *value_str; if (mailbox_attribute_value_to_string(t->box->storage, value, &value_str) < 0) { ret = -1; } else if (value_str != NULL) { dict_set(dtrans, prefixed_key, value_str); mail_index_attribute_set(t->itrans, pvt, key, ts, strlen(value_str)); } else { dict_unset(dtrans, prefixed_key); mail_index_attribute_unset(t->itrans, pvt, key, ts); } } T_END; return ret; }
int acl_mailbox_update_acl(struct mailbox_transaction_context *t, const struct acl_rights_update *update) { struct acl_object *aclobj; const char *key; time_t ts = update->last_change != 0 ? update->last_change : ioloop_time; key = t_strdup_printf(MAILBOX_ATTRIBUTE_PREFIX_ACL"%s", acl_rights_get_id(&update->rights)); aclobj = acl_mailbox_get_aclobj(t->box); if (acl_object_update(aclobj, update) < 0) { mail_storage_set_critical(t->box->storage, "Failed to set ACL"); return -1; } /* FIXME: figure out some value lengths, so maybe some day quota could apply to ACLs as well. */ if (acl_mailbox_update_removed_id(aclobj, update)) mail_index_attribute_unset(t->itrans, FALSE, key, ts); else mail_index_attribute_set(t->itrans, FALSE, key, ts, 0); return 0; }