GitLab repository storage has been migrated to hashed layout. Please contact Infrastructure team if you notice any issues with repositories or hooks.

Commit 2d0116a9 authored by Milan Crha's avatar Milan Crha

I#392 - Template user variables not replaced with Alternative Reply

Closes GNOME/evolution#392
parent 1b67f794
......@@ -31,22 +31,17 @@
#include "e-mail-templates.h"
/* Replaces $ORIG[variable] in given template by given replacement from the original message */
static void
replace_template_variable (GString *text,
const gchar *variable,
const gchar *replacement)
replace_in_string (GString *text,
const gchar *find,
const gchar *replacement)
{
const gchar *p, *next;
GString *str;
gint find_len;
gchar *find;
g_return_if_fail (text != NULL);
g_return_if_fail (variable != NULL);
g_return_if_fail (*variable);
find = g_strconcat ("$ORIG[", variable, "]", NULL);
g_return_if_fail (find != NULL);
find_len = strlen (find);
str = g_string_new ("");
......@@ -58,14 +53,79 @@ replace_template_variable (GString *text,
g_string_append (str, replacement);
p = next + find_len;
}
g_string_append (str, p);
g_string_assign (text, str->str);
/* Avoid unnecessary allocation when the 'text' doesn't contain the variable */
if (p != text->str) {
g_string_append (str, p);
g_string_assign (text, str->str);
}
g_string_free (str, TRUE);
}
/* Replaces $ORIG[variable] in given template by given replacement from the original message */
static void
replace_template_variable (GString *text,
const gchar *variable,
const gchar *replacement)
{
gchar *find;
g_return_if_fail (text != NULL);
g_return_if_fail (variable != NULL);
g_return_if_fail (*variable);
find = g_strconcat ("$ORIG[", variable, "]", NULL);
replace_in_string (text, find, replacement);
g_free (find);
}
static void
replace_user_variables (GString *text,
CamelMimeMessage *source_message)
{
CamelInternetAddress *to;
const gchar *name, *addr;
GSettings *settings;
gchar **strv;
gint ii;
g_return_if_fail (text);
g_return_if_fail (CAMEL_IS_MIME_MESSAGE (source_message));
settings = e_util_ref_settings ("org.gnome.evolution.plugin.templates");
strv = g_settings_get_strv (settings, "template-placeholders");
g_object_unref (settings);
for (ii = 0; strv && strv[ii]; ii++) {
gchar *equal_sign, *find, *var_name = strv[ii];
const gchar *var_value;
equal_sign = strchr (var_name, '=');
if (!equal_sign)
continue;
*equal_sign = '\0';
var_value = equal_sign + 1;
find = g_strconcat ("$", var_name, NULL);
replace_in_string (text, find, var_value);
g_free (find);
*equal_sign = '=';
}
g_strfreev (strv);
to = camel_mime_message_get_recipients (source_message, CAMEL_RECIPIENT_TYPE_TO);
if (to && camel_internet_address_get (to, 0, &name, &addr)) {
replace_in_string (text, "$sender_name", name);
replace_in_string (text, "$sender_email", addr);
}
}
static void
replace_email_addresses (GString *template,
CamelInternetAddress *internet_address,
......@@ -335,6 +395,8 @@ fill_template (CamelMimeMessage *message,
g_free (reply_credits);
}
replace_user_variables (template_body, message);
return_part = camel_mime_part_new ();
if (template_html)
......@@ -478,10 +540,14 @@ e_mail_templates_apply_sync (CamelMimeMessage *source_message,
g_ascii_strcasecmp (m_header_name, "subject") != 0)
replace_template_variable (subject, m_header_name, m_header_value);
}
/* Now replace $ORIG[subject] variable, handling possible base64 encryption */
replace_template_variable (
subject, "subject",
camel_mime_message_get_subject (source_message));
replace_user_variables (subject, source_message);
new_header_value = g_string_free (subject, FALSE);
}
......
......@@ -1877,155 +1877,6 @@ em_utils_compose_new_message_with_mailto_and_selection (EShell *shell,
e_msg_composer_new (shell, msg_composer_created_with_mailto_cb, ccd);
}
static gboolean
replace_variables (GSList *clues,
CamelMimeMessage *message,
gchar **pstr)
{
gint i;
gboolean string_changed = FALSE, count1 = FALSE;
gchar *str;
g_return_val_if_fail (pstr != NULL, FALSE);
g_return_val_if_fail (*pstr != NULL, FALSE);
g_return_val_if_fail (message != NULL, FALSE);
str = *pstr;
for (i = 0; i < strlen (str); i++) {
const gchar *cur = str + i;
if (!g_ascii_strncasecmp (cur, "$", 1)) {
const gchar *end = cur + 1;
gchar *out;
gchar **temp_str;
GSList *list;
while (*end && (g_unichar_isalnum (*end) || *end == '_'))
end++;
out = g_strndup ((const gchar *) cur, end - cur);
temp_str = g_strsplit (str, out, 2);
for (list = clues; list; list = g_slist_next (list)) {
gchar **temp = g_strsplit (list->data, "=", 2);
if (!g_ascii_strcasecmp (temp[0], out + 1)) {
g_free (str);
str = g_strconcat (temp_str[0], temp[1], temp_str[1], NULL);
count1 = TRUE;
string_changed = TRUE;
} else
count1 = FALSE;
g_strfreev (temp);
}
if (!count1) {
if (getenv (out + 1)) {
g_free (str);
str = g_strconcat (
temp_str[0],
getenv (out + 1),
temp_str[1], NULL);
count1 = TRUE;
string_changed = TRUE;
} else
count1 = FALSE;
}
if (!count1) {
CamelInternetAddress *to;
const gchar *name, *addr;
to = camel_mime_message_get_recipients (
message, CAMEL_RECIPIENT_TYPE_TO);
if (!camel_internet_address_get (to, 0, &name, &addr))
continue;
if (name && g_ascii_strcasecmp ("sender_name", out + 1) == 0) {
g_free (str);
str = g_strconcat (temp_str[0], name, temp_str[1], NULL);
count1 = TRUE;
string_changed = TRUE;
} else if (addr && g_ascii_strcasecmp ("sender_email", out + 1) == 0) {
g_free (str);
str = g_strconcat (temp_str[0], addr, temp_str[1], NULL);
count1 = TRUE;
string_changed = TRUE;
}
}
g_strfreev (temp_str);
g_free (out);
}
}
*pstr = str;
return string_changed;
}
static void
traverse_parts (GSList *clues,
CamelMimeMessage *message,
CamelDataWrapper *content)
{
g_return_if_fail (message != NULL);
if (!content)
return;
if (CAMEL_IS_MULTIPART (content)) {
guint i, n;
CamelMultipart *multipart = CAMEL_MULTIPART (content);
CamelMimePart *part;
n = camel_multipart_get_number (multipart);
for (i = 0; i < n; i++) {
part = camel_multipart_get_part (multipart, i);
if (!part)
continue;
traverse_parts (clues, message, CAMEL_DATA_WRAPPER (part));
}
} else if (CAMEL_IS_MIME_PART (content)) {
CamelMimePart *part = CAMEL_MIME_PART (content);
CamelContentType *type;
CamelStream *stream;
GByteArray *byte_array;
gchar *str;
content = camel_medium_get_content (CAMEL_MEDIUM (part));
if (!content)
return;
if (CAMEL_IS_MULTIPART (content)) {
traverse_parts (clues, message, CAMEL_DATA_WRAPPER (content));
return;
}
type = camel_mime_part_get_content_type (part);
if (!camel_content_type_is (type, "text", "*"))
return;
byte_array = g_byte_array_new ();
stream = camel_stream_mem_new_with_byte_array (byte_array);
camel_data_wrapper_decode_to_stream_sync (
content, stream, NULL, NULL);
str = g_strndup ((gchar *) byte_array->data, byte_array->len);
g_object_unref (stream);
if (replace_variables (clues, message, &str)) {
stream = camel_stream_mem_new_with_buffer (str, strlen (str));
camel_data_wrapper_construct_from_stream_sync (
content, stream, NULL, NULL);
g_object_unref (stream);
}
g_free (str);
}
}
static ESource *
emcu_ref_identity_source_from_composer (EMsgComposer *composer)
{
......@@ -2352,31 +2203,6 @@ em_utils_edit_message (EMsgComposer *composer,
folder_is_outbox = FALSE;
folder_is_templates = FALSE;
}
/* Template specific code follows. */
if (folder_is_templates) {
CamelDataWrapper *content;
GSettings *settings;
gchar **strv;
gint i;
GSList *clue_list = NULL;
settings = e_util_ref_settings ("org.gnome.evolution.plugin.templates");
/* Get the list from GSettings */
strv = g_settings_get_strv (settings, "template-placeholders");
for (i = 0; strv[i] != NULL; i++)
clue_list = g_slist_append (clue_list, g_strdup (strv[i]));
g_object_unref (settings);
g_strfreev (strv);
content = camel_medium_get_content (CAMEL_MEDIUM (message));
traverse_parts (clue_list, message, content);
g_slist_foreach (clue_list, (GFunc) g_free, NULL);
g_slist_free (clue_list);
}
if (folder) {
if ((!folder_is_sent && !folder_is_drafts && !folder_is_outbox && !folder_is_templates) ||
(!folder_is_outbox && !folder_is_templates && !emcu_message_references_existing_account (message, composer))) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment