}
}
-static void subst_chars(gchar *str, gchar *orig, gchar subst)
+void subst_chars(gchar *str, gchar *orig, gchar subst)
{
register gchar *p = str;
}
gint scan_mailto_url(const gchar *mailto, gchar **to, gchar **cc, gchar **bcc,
- gchar **subject, gchar **body, gchar **attach)
+ gchar **subject, gchar **body, gchar ***attach)
{
gchar *tmp_mailto;
gchar *p;
"/etc/passwd",
"/etc/shadow",
NULL };
+ gint num_attach = 0;
+ gchar **my_att = NULL;
Xstrdup_a(tmp_mailto, mailto, return -1);
if (to && !*to)
*to = decode_uri_gdup(tmp_mailto);
+ my_att = g_malloc(sizeof(char *));
+ my_att[0] = NULL;
+
while (p) {
gchar *field, *value;
if (*value == '\0') continue;
- if (cc && !*cc && !g_ascii_strcasecmp(field, "cc")) {
- *cc = decode_uri_gdup(value);
- } else if (bcc && !*bcc && !g_ascii_strcasecmp(field, "bcc")) {
- *bcc = decode_uri_gdup(value);
+ if (cc && !g_ascii_strcasecmp(field, "cc")) {
+ if (!*cc) {
+ *cc = decode_uri_gdup(value);
+ } else {
+ gchar *tmp = decode_uri_gdup(value);
+ gchar *new_cc = g_strdup_printf("%s, %s", *cc, tmp);
+ g_free(*cc);
+ *cc = new_cc;
+ }
+ } else if (bcc && !g_ascii_strcasecmp(field, "bcc")) {
+ if (!*bcc) {
+ *bcc = decode_uri_gdup(value);
+ } else {
+ gchar *tmp = decode_uri_gdup(value);
+ gchar *new_bcc = g_strdup_printf("%s, %s", *bcc, tmp);
+ g_free(*bcc);
+ *bcc = new_bcc;
+ }
} else if (subject && !*subject &&
!g_ascii_strcasecmp(field, "subject")) {
*subject = decode_uri_gdup(value);
} else if (body && !*body && !g_ascii_strcasecmp(field, "body")) {
*body = decode_uri_gdup(value);
- } else if (attach && !*attach && !g_ascii_strcasecmp(field, "attach")) {
+ } else if (attach && !g_ascii_strcasecmp(field, "attach")) {
int i = 0;
- *attach = decode_uri_gdup(value);
+ gchar *tmp = decode_uri_gdup(value);
for (; forbidden_uris[i]; i++) {
- if (strstr(*attach, forbidden_uris[i])) {
+ if (strstr(tmp, forbidden_uris[i])) {
g_print("Refusing to attach '%s', potential private data leak\n",
- *attach);
- g_free(*attach);
- *attach = NULL;
+ tmp);
+ g_free(tmp);
+ tmp = NULL;
break;
}
}
+ if (tmp) {
+ /* attach is correct */
+ num_attach++;
+ printf("realloc my_att %d\n", (num_attach+1));
+ my_att = g_realloc(my_att, (sizeof(char *))*(num_attach+1));
+ my_att[num_attach-1] = tmp;
+ my_att[num_attach] = NULL;
+ }
}
}
+ if (attach)
+ *attach = my_att;
return 0;
}
return 0;
}
-gchar *file_read_to_str(const gchar *file)
-{
- FILE *fp;
- gchar *str;
-
- g_return_val_if_fail(file != NULL, NULL);
-
- if ((fp = g_fopen(file, "rb")) == NULL) {
- FILE_OP_ERROR(file, "fopen");
- return NULL;
- }
-
- str = file_read_stream_to_str(fp);
-
- fclose(fp);
-
- return str;
-}
-
-gchar *file_read_stream_to_str(FILE *fp)
+static gchar *file_read_stream_to_str_full(FILE *fp, gboolean recode)
{
GByteArray *array;
guchar buf[BUFSIZ];
str = (gchar *)array->data;
g_byte_array_free(array, FALSE);
- if (!g_utf8_validate(str, -1, NULL)) {
+ if (recode && !g_utf8_validate(str, -1, NULL)) {
const gchar *src_codeset, *dest_codeset;
gchar *tmp = NULL;
src_codeset = conv_get_locale_charset_str();
return str;
}
+static gchar *file_read_to_str_full(const gchar *file, gboolean recode)
+{
+ FILE *fp;
+ gchar *str;
+
+ g_return_val_if_fail(file != NULL, NULL);
+
+ if ((fp = g_fopen(file, "rb")) == NULL) {
+ FILE_OP_ERROR(file, "fopen");
+ return NULL;
+ }
+
+ str = file_read_stream_to_str_full(fp, recode);
+
+ fclose(fp);
+
+ return str;
+}
+
+gchar *file_read_to_str(const gchar *file)
+{
+ return file_read_to_str_full(file, TRUE);
+}
+gchar *file_read_stream_to_str(FILE *fp)
+{
+ return file_read_stream_to_str_full(fp, TRUE);
+}
+
+gchar *file_read_to_str_no_recode(const gchar *file)
+{
+ return file_read_to_str_full(file, FALSE);
+}
+gchar *file_read_stream_to_str_no_recode(FILE *fp)
+{
+ return file_read_stream_to_str_full(fp, FALSE);
+}
char *fgets_crlf(char *buf, int size, FILE *stream)
{
"bz", "ca", "cc", "cd", "cf", "cg", "ch", "ci", "ck", "cl",
"cm", "cn", "co", "cr", "cu", "cv", "cx", "cy", "cz", "de",
"dj", "dk", "dm", "do", "dz", "ec", "ee", "eg", "eh", "er",
- "es", "et", "fi", "fj", "fk", "fm", "fo", "fr", "ga", "gd",
+ "es", "et", "eu", "fi", "fj", "fk", "fm", "fo", "fr", "ga", "gd",
"ge", "gf", "gg", "gh", "gi", "gl", "gm", "gn", "gp", "gq",
"gr", "gs", "gt", "gu", "gw", "gy", "hk", "hm", "hn", "hr",
"ht", "hu", "id", "ie", "il", "im", "in", "io", "iq", "ir",