summaryrefslogtreecommitdiff
path: root/net-mail/dovecot/files/pigeonhole-fix-vacation-handle.patch
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--net-mail/dovecot/files/pigeonhole-fix-vacation-handle.patch140
1 files changed, 140 insertions, 0 deletions
diff --git a/net-mail/dovecot/files/pigeonhole-fix-vacation-handle.patch b/net-mail/dovecot/files/pigeonhole-fix-vacation-handle.patch
new file mode 100644
index 0000000..744b67e
--- /dev/null
+++ b/net-mail/dovecot/files/pigeonhole-fix-vacation-handle.patch
@@ -0,0 +1,140 @@
+
+--- a/src/lib-sieve/plugins/vacation/cmd-vacation.c Tue Aug 02 17:50:15 2011 +0200
++++ b/src/lib-sieve/plugins/vacation/cmd-vacation.c Wed Sep 21 00:55:58 2011 +0200
+@@ -231,7 +231,7 @@
+
+ bool mime;
+
+- string_t *handle;
++ struct sieve_ast_argument *handle_arg;
+ };
+
+ /*
+@@ -348,10 +348,10 @@
+ *arg = sieve_ast_argument_next(*arg);
+
+ } else if ( sieve_argument_is(tag, vacation_handle_tag) ) {
+- ctx_data->handle = sieve_ast_argument_str(*arg);
+-
++ ctx_data->handle_arg = *arg;
++
+ /* Detach optional argument (emitted as mandatory) */
+- *arg = sieve_ast_arguments_detach(*arg,1);
++ *arg = sieve_ast_arguments_detach(*arg, 1);
+ }
+
+ return TRUE;
+@@ -468,34 +468,48 @@
+ return FALSE;
+
+ /* Construct handle if not set explicitly */
+- if ( ctx_data->handle == NULL ) {
+- string_t *reason = sieve_ast_argument_str(arg);
+- unsigned int size = str_len(reason);
++ if ( ctx_data->handle_arg == NULL ) {
++ T_BEGIN {
++ string_t *handle;
++ string_t *reason = sieve_ast_argument_str(arg);
++ unsigned int size = str_len(reason);
+
+- /* Precalculate the size of it all */
+- size += ctx_data->subject == NULL ?
+- sizeof(_handle_empty_subject) - 1 : str_len(ctx_data->subject);
+- size += ctx_data->from == NULL ?
+- sizeof(_handle_empty_from) - 1 : str_len(ctx_data->from);
+- size += ctx_data->mime ?
+- sizeof(_handle_mime_enabled) - 1 : sizeof(_handle_mime_disabled) - 1;
++ /* Precalculate the size of it all */
++ size += ctx_data->subject == NULL ?
++ sizeof(_handle_empty_subject) - 1 : str_len(ctx_data->subject);
++ size += ctx_data->from == NULL ?
++ sizeof(_handle_empty_from) - 1 : str_len(ctx_data->from);
++ size += ctx_data->mime ?
++ sizeof(_handle_mime_enabled) - 1 : sizeof(_handle_mime_disabled) - 1;
+
+- /* Construct the string */
+- ctx_data->handle = str_new(sieve_command_pool(cmd), size);
+- str_append_str(ctx_data->handle, reason);
++ /* Construct the string */
++ handle = t_str_new(size);
++ str_append_str(handle, reason);
+
+- if ( ctx_data->subject != NULL )
+- str_append_str(ctx_data->handle, ctx_data->subject);
+- else
+- str_append(ctx_data->handle, _handle_empty_subject);
++ if ( ctx_data->subject != NULL )
++ str_append_str(handle, ctx_data->subject);
++ else
++ str_append(handle, _handle_empty_subject);
+
+- if ( ctx_data->from != NULL )
+- str_append_str(ctx_data->handle, ctx_data->from);
+- else
+- str_append(ctx_data->handle, _handle_empty_from);
++ if ( ctx_data->from != NULL )
++ str_append_str(handle, ctx_data->from);
++ else
++ str_append(handle, _handle_empty_from);
+
+- str_append(ctx_data->handle,
+- ctx_data->mime ? _handle_mime_enabled : _handle_mime_disabled );
++ str_append(handle,
++ ctx_data->mime ? _handle_mime_enabled : _handle_mime_disabled );
++
++ /* Create positional handle argument */
++ ctx_data->handle_arg = sieve_ast_argument_string_create
++ (cmd->ast_node, handle, sieve_ast_node_line(cmd->ast_node));
++ } T_END;
++
++ if ( !sieve_validator_argument_activate
++ (valdtr, cmd, ctx_data->handle_arg, TRUE) )
++ return FALSE;
++ } else {
++ /* Attach explicit handle argument as positional */
++ (void)sieve_ast_argument_attach(cmd->ast_node, ctx_data->handle_arg);
+ }
+
+ return TRUE;
+@@ -507,18 +521,12 @@
+
+ static bool cmd_vacation_generate
+ (const struct sieve_codegen_env *cgenv, struct sieve_command *cmd)
+-{
+- struct cmd_vacation_context_data *ctx_data =
+- (struct cmd_vacation_context_data *) cmd->data;
+-
++{
+ sieve_operation_emit(cgenv->sblock, cmd->ext, &vacation_operation);
+
+ /* Generate arguments */
+ if ( !sieve_generate_arguments(cgenv, cmd, NULL) )
+ return FALSE;
+-
+- /* FIXME: this will not allow the handle to be a variable */
+- sieve_opr_string_emit(cgenv->sblock, ctx_data->handle);
+
+ return TRUE;
+ }
+@@ -779,13 +787,13 @@
+ (struct act_vacation_context *) action->context;
+
+ sieve_result_action_printf( rpenv, "send vacation message:");
+- sieve_result_printf(rpenv, " => seconds : %d\n", ctx->seconds);
++ sieve_result_printf(rpenv, " => seconds : %d\n", ctx->seconds);
+ if ( ctx->subject != NULL )
+- sieve_result_printf(rpenv, " => subject: %s\n", ctx->subject);
++ sieve_result_printf(rpenv, " => subject : %s\n", ctx->subject);
+ if ( ctx->from != NULL )
+- sieve_result_printf(rpenv, " => from : %s\n", ctx->from);
++ sieve_result_printf(rpenv, " => from : %s\n", ctx->from);
+ if ( ctx->handle != NULL )
+- sieve_result_printf(rpenv, " => handle : %s\n", ctx->handle);
++ sieve_result_printf(rpenv, " => handle : %s\n", ctx->handle);
+ sieve_result_printf(rpenv, "\nSTART MESSAGE\n%s\nEND MESSAGE\n", ctx->reason);
+ }
+
+
+
+
+