From bcbfec5764cbe92f3cb84d26160f02de5d224810 Mon Sep 17 00:00:00 2001
From: Stephan Bosch <stephan.bosch@open-xchange.com>
Date: Mon, 7 Oct 2024 12:41:38 +0200
Subject: [PATCH] lib-sieve: sieve - Add sieve_error_create_internal() and use
 it

---
 src/lib-sieve/sieve-common.h  |  7 +++++++
 src/lib-sieve/sieve-storage.c | 20 +++-----------------
 src/lib-sieve/sieve.c         | 26 ++++++++++++++++++++++++++
 3 files changed, 36 insertions(+), 17 deletions(-)

diff --git a/src/lib-sieve/sieve-common.h b/src/lib-sieve/sieve-common.h
index 6d1c78ad5..53ccffbd1 100644
--- a/src/lib-sieve/sieve-common.h
+++ b/src/lib-sieve/sieve-common.h
@@ -206,6 +206,13 @@ struct sieve_instance {
 	const struct smtp_address *user_email_implicit;
 };
 
+/*
+ * Errors
+ */
+
+void sieve_error_create_internal(enum sieve_error *error_code_r,
+				 const char **error_r);
+
 /*
  * Script trace log
  */
diff --git a/src/lib-sieve/sieve-storage.c b/src/lib-sieve/sieve-storage.c
index ca92b431d..c8be0c32b 100644
--- a/src/lib-sieve/sieve-storage.c
+++ b/src/lib-sieve/sieve-storage.c
@@ -22,10 +22,6 @@
 #include <time.h>
 #include <utime.h>
 
-#define CRITICAL_MSG \
-  "Internal error occurred. Refer to server log for more information."
-#define CRITICAL_MSG_STAMP CRITICAL_MSG " [%Y-%m-%d %H:%M:%S]"
-
 struct event_category event_category_sieve_storage = {
 	.parent = &event_category_sieve,
 	.name = "sieve-storage",
@@ -1544,21 +1540,11 @@ void sieve_storage_copy_error(struct sieve_storage *storage,
 
 void sieve_storage_set_internal_error(struct sieve_storage *storage)
 {
-	struct tm *tm;
-	char str[256];
+	const char *error;
 
 	sieve_storage_clear_error(storage);
-
-	/* critical errors may contain sensitive data, so let user
-	   see only "Internal error" with a timestamp to make it
-	   easier to look from log files the actual error message. */
-	tm = localtime(&ioloop_time);
-
-	storage->error =
-		(strftime(str, sizeof(str), CRITICAL_MSG_STAMP, tm) > 0 ?
-		 i_strdup(str) : i_strdup(CRITICAL_MSG));
-
-	storage->error_code = SIEVE_ERROR_TEMP_FAILURE;
+	sieve_error_create_internal(&storage->error_code, &error);
+	storage->error = i_strdup(error);
 }
 
 void sieve_storage_set_critical(struct sieve_storage *storage,
diff --git a/src/lib-sieve/sieve.c b/src/lib-sieve/sieve.c
index f3625c1b7..fd74d1929 100644
--- a/src/lib-sieve/sieve.c
+++ b/src/lib-sieve/sieve.c
@@ -1011,6 +1011,32 @@ size_t sieve_max_script_size(struct sieve_instance *svinst)
 	return svinst->set->max_script_size;
 }
 
+/*
+ * Errors
+ */
+
+#define CRITICAL_MSG \
+	"Internal error occurred. Refer to server log for more information."
+#define CRITICAL_MSG_STAMP CRITICAL_MSG " [%Y-%m-%d %H:%M:%S]"
+
+void sieve_error_create_internal(enum sieve_error *error_code_r,
+				 const char **error_r)
+{
+	struct tm *tm;
+	char buf[256];
+
+	/* Critical errors may contain sensitive data, so let user see only
+	   "Internal error" with a timestamp to make it easier to look from log
+	   files the actual error message. */
+	tm = localtime(&ioloop_time);
+
+	if (strftime(buf, sizeof(buf), CRITICAL_MSG_STAMP, tm) > 0)
+		*error_r = t_strdup(buf);
+	else
+		*error_r = CRITICAL_MSG;
+	*error_code_r = SIEVE_ERROR_TEMP_FAILURE;
+}
+
 /*
  * User log
  */
-- 
GitLab