gchar *get_part_as_string(MimeInfo *mimeinfo) { gchar *textdata = NULL; gchar *filename = NULL; FILE *fp; cm_return_val_if_fail(mimeinfo != NULL, 0); procmime_decode_content(mimeinfo); if (mimeinfo->content == MIMECONTENT_MEM) textdata = g_strdup(mimeinfo->data.mem); else { filename = procmime_get_tmp_file_name(mimeinfo); if (procmime_get_part(filename, mimeinfo) < 0) { g_warning("error dumping temporary file '%s'", filename); g_free(filename); return NULL; } fp = claws_fopen(filename,"rb"); if (!fp) { g_warning("error opening temporary file '%s'", filename); g_free(filename); return NULL; } textdata = fp_read_noconv(fp); claws_fclose(fp); g_unlink(filename); g_free(filename); } if (!g_utf8_validate(textdata, -1, NULL)) { gchar *tmp = NULL; codeconv_set_strict(TRUE); if (procmime_mimeinfo_get_parameter(mimeinfo, "charset")) { tmp = conv_codeset_strdup(textdata, procmime_mimeinfo_get_parameter(mimeinfo, "charset"), CS_UTF_8); } if (!tmp) { tmp = conv_codeset_strdup(textdata, conv_get_locale_charset_str_no_utf8(), CS_UTF_8); } codeconv_set_strict(FALSE); if (!tmp) { tmp = conv_codeset_strdup(textdata, conv_get_locale_charset_str_no_utf8(), CS_UTF_8); } if (tmp) { g_free(textdata); textdata = tmp; } } return textdata; }
/** * Specify common name for person object. * \param person Person object. * \param value name. */ void addritem_person_set_common_name( ItemPerson *person, const gchar *value ) { if (!value || g_utf8_validate(value, -1, NULL)) ADDRITEM_NAME(person) = mgu_replace_string( ADDRITEM_NAME(person), value ); else { gchar *out = conv_codeset_strdup(value, conv_get_locale_charset_str_no_utf8(), CS_INTERNAL); if (out) ADDRITEM_NAME(person) = mgu_replace_string( ADDRITEM_NAME(person), out ); g_free(out); } }
/** * Specify nick name for person object. * \param person Person object. * \param value name. */ void addritem_person_set_nick_name( ItemPerson *person, const gchar *value ) { if (!value || g_utf8_validate(value, -1, NULL)) person->nickName = mgu_replace_string( person->nickName, value ); else { gchar *out = conv_codeset_strdup(value, conv_get_locale_charset_str_no_utf8(), CS_INTERNAL); if (out) person->nickName = mgu_replace_string( person->nickName, out ); g_free(out); } }
/** * Builds a single regular expresion from an array of srings. * * @param strings The lines containing the different sub-regexp. * * @return The newly allocated regexp. */ static gchar *build_complete_regexp(gchar **strings) { int i = 0; gchar *expr = NULL; while (strings && strings[i] && *strings[i]) { int old_len = expr ? strlen(expr):0; int new_len = 0; gchar *tmpstr = NULL; if (g_utf8_validate(strings[i], -1, NULL)) tmpstr = g_strdup(strings[i]); else tmpstr = conv_codeset_strdup(strings[i], conv_get_locale_charset_str_no_utf8(), CS_INTERNAL); if (strstr(tmpstr, "\n")) *(strstr(tmpstr, "\n")) = '\0'; new_len = strlen(tmpstr); expr = g_realloc(expr, expr ? (old_len + strlen("|()") + new_len + 1) : (strlen("()") + new_len + 1)); if (old_len) { strcpy(expr + old_len, "|("); strcpy(expr + old_len + 2, tmpstr); strcpy(expr + old_len + 2 + new_len, ")"); } else { strcpy(expr+old_len, "("); strcpy(expr+old_len + 1, tmpstr); strcpy(expr+old_len + 1 + new_len, ")"); } g_free(tmpstr); i++; } return expr; }
static gint pgpinline_check_signature(MimeInfo *mimeinfo) { PrivacyDataPGP *data = NULL; gchar *textdata = NULL, *tmp = NULL; gpgme_data_t plain = NULL, cipher = NULL; gpgme_error_t err; cm_return_val_if_fail(mimeinfo != NULL, 0); if (procmime_mimeinfo_parent(mimeinfo) == NULL) { privacy_set_error(_("Incorrect part")); return 0; /* not parent */ } if (mimeinfo->type != MIMETYPE_TEXT) { privacy_set_error(_("Not a text part")); debug_print("type %d\n", mimeinfo->type); return 0; } cm_return_val_if_fail(mimeinfo->privacy != NULL, 0); data = (PrivacyDataPGP *) mimeinfo->privacy; textdata = get_part_as_string(mimeinfo); if (!textdata) { g_free(textdata); privacy_set_error(_("Couldn't get text data.")); return 0; } /* gtk2: convert back from utf8 */ tmp = conv_codeset_strdup(textdata, CS_UTF_8, procmime_mimeinfo_get_parameter(mimeinfo, "charset")); if (!tmp) { tmp = conv_codeset_strdup(textdata, CS_UTF_8, conv_get_locale_charset_str_no_utf8()); } if (!tmp) { g_warning("Can't convert charset to anything sane"); tmp = conv_codeset_strdup(textdata, CS_UTF_8, CS_US_ASCII); } g_free(textdata); if (!tmp) { privacy_set_error(_("Couldn't convert text data to any sane charset.")); return 0; } textdata = g_strdup(tmp); g_free(tmp); if ((err = gpgme_new(&data->ctx)) != GPG_ERR_NO_ERROR) { debug_print(("Couldn't initialize GPG context, %s"), gpgme_strerror(err)); privacy_set_error(_("Couldn't initialize GPG context, %s"), gpgme_strerror(err)); g_free(textdata); return 0; } gpgme_set_textmode(data->ctx, 1); gpgme_set_armor(data->ctx, 1); gpgme_data_new_from_mem(&plain, textdata, (size_t)strlen(textdata), 1); gpgme_data_new(&cipher); data->sigstatus = sgpgme_verify_signature(data->ctx, plain, NULL, cipher); gpgme_data_release(plain); gpgme_data_release(cipher); g_free(textdata); return 0; }