struct sieve_script *sieve_dict_storage_active_script_open (struct sieve_storage *storage) { struct sieve_dict_storage *dstorage = (struct sieve_dict_storage *)storage; struct sieve_dict_script *dscript; dscript = sieve_dict_script_init (dstorage, storage->script_name); if ( sieve_script_open(&dscript->script, NULL) < 0 ) { struct sieve_script *script = &dscript->script; sieve_script_unref(&script); return NULL; } return &dscript->script; }
bool cmd_getscript(struct client_command_context *cmd) { struct client *client = cmd->client; struct cmd_getscript_context *ctx; const char *scriptname; enum sieve_error error; /* <scriptname> */ if ( !client_read_string_args(cmd, 1, TRUE, &scriptname) ) return FALSE; ctx = p_new(cmd->pool, struct cmd_getscript_context, 1); ctx->cmd = cmd; ctx->client = client; ctx->storage = client->storage; ctx->failed = FALSE; ctx->script = sieve_storage_script_init(client->storage, scriptname); if (ctx->script == NULL) { ctx->failed = TRUE; return cmd_getscript_finish(ctx); } ctx->script_stream = sieve_script_open(ctx->script, &error); if ( ctx->script_stream == NULL ) { ctx->failed = TRUE; if ( error == SIEVE_ERROR_NOT_FOUND ) sieve_storage_set_error(client->storage, error, "Script does not exist."); return cmd_getscript_finish(ctx); } ctx->script_size = sieve_script_get_size(ctx->script); ctx->script_offset = 0; client_send_line (client, t_strdup_printf("{%"PRIuUOFF_T"}", ctx->script_size)); client->command_pending = TRUE; cmd->func = cmd_getscript_continue; cmd->context = ctx; return cmd_getscript_continue(cmd); }
static int sieve_ldap_script_binary_read_metadata (struct sieve_script *script, struct sieve_binary_block *sblock, sieve_size_t *offset) { struct sieve_ldap_script *lscript = (struct sieve_ldap_script *)script; struct sieve_instance *svinst = script->storage->svinst; struct sieve_ldap_storage *lstorage = (struct sieve_ldap_storage *)script->storage; struct sieve_binary *sbin = sieve_binary_block_get_binary(sblock); time_t bmtime = sieve_binary_mtime(sbin); string_t *dn, *modattr; /* config file changed? */ if ( bmtime <= lstorage->set_mtime ) { if ( svinst->debug ) { sieve_script_sys_debug(script, "Sieve binary `%s' is not newer " "than the LDAP configuration `%s' (%s <= %s)", sieve_binary_path(sbin), lstorage->config_file, t_strflocaltime("%Y-%m-%d %H:%M:%S", bmtime), t_strflocaltime("%Y-%m-%d %H:%M:%S", lstorage->set_mtime)); } return 0; } /* open script if not open already */ if ( lscript->dn == NULL && sieve_script_open(script, NULL) < 0 ) return 0; /* if modattr not found, recompile always */ if ( lscript->modattr == NULL || *lscript->modattr == '\0' ) { sieve_script_sys_error(script, "LDAP entry for script `%s' " "has no modified attribute `%s'", sieve_script_location(script), lstorage->set.sieve_ldap_mod_attr); return 0; } /* compare DN in binary and from search result */ if ( !sieve_binary_read_string(sblock, offset, &dn) ) { sieve_script_sys_error(script, "Binary `%s' has invalid metadata for script `%s': " "Invalid DN", sieve_binary_path(sbin), sieve_script_location(script)); return -1; } i_assert( lscript->dn != NULL ); if ( strcmp(str_c(dn), lscript->dn) != 0 ) { sieve_script_sys_debug(script, "Binary `%s' reports different LDAP DN for script `%s' " "(`%s' rather than `%s')", sieve_binary_path(sbin), sieve_script_location(script), str_c(dn), lscript->dn); return 0; } /* compare modattr in binary and from search result */ if ( !sieve_binary_read_string(sblock, offset, &modattr) ) { sieve_script_sys_error(script, "Binary `%s' has invalid metadata for script `%s': " "Invalid modified attribute", sieve_binary_path(sbin), sieve_script_location(script)); return -1; } if ( strcmp(str_c(modattr), lscript->modattr) != 0 ) { sieve_script_sys_debug(script, "Binary `%s' reports different modified attribute content " "for script `%s' (`%s' rather than `%s')", sieve_binary_path(sbin), sieve_script_location(script), str_c(modattr), lscript->modattr); return 0; } return 1; }