static guchar *_make_key_deriv(const gchar *passphrase, guint rounds, guint length) { guchar *kd, *salt; gchar *saltpref = prefs_common_get_prefs()->master_passphrase_salt; gsize saltlen; gint ret; /* Grab our salt, generating and saving a new random one if needed. */ if (saltpref == NULL || strlen(saltpref) == 0) { _generate_salt(); saltpref = prefs_common_get_prefs()->master_passphrase_salt; } salt = g_base64_decode(saltpref, &saltlen); kd = g_malloc0(length); START_TIMING("PBKDF2"); ret = pkcs5_pbkdf2(passphrase, strlen(passphrase), salt, saltlen, kd, length, rounds); END_TIMING(); g_free(salt); if (ret == 0) { return kd; } g_free(kd); return NULL; }
static void mh_write_sequences(FolderItem *item, gboolean remove_unseen) { gchar *mh_sequences_old, *mh_sequences_new; FILE *mh_sequences_old_fp, *mh_sequences_new_fp; gchar buf[BUFFSIZE]; gchar *path = NULL; gboolean err = FALSE; START_TIMING(""); if (!item) return; path = folder_item_get_path(item); mh_sequences_old = g_strconcat(path, G_DIR_SEPARATOR_S, ".mh_sequences", NULL); mh_sequences_new = g_strconcat(path, G_DIR_SEPARATOR_S, ".mh_sequences.new", NULL); if ((mh_sequences_new_fp = g_fopen(mh_sequences_new, "w+b")) != NULL) { GSList *msglist = folder_item_get_msg_list(item); GSList *cur; MsgInfo *info = NULL; gint start = -1, end = -1; gchar *sequence = g_strdup(""); gint seq_len = 0; msglist = g_slist_sort(msglist, sort_cache_list_by_msgnum); cur = msglist; /* write the unseen sequence if we don't have to scrap it */ if (!remove_unseen) do { info = (MsgInfo *)(cur ? cur->data:NULL); if (info && (MSG_IS_UNREAD(info->flags) || MSG_IS_NEW(info->flags))) { if (start < 0) start = end = info->msgnum; else end = info->msgnum; } else { if (start > 0 && end > 0) { gchar tmp[32]; gint tmp_len = 0; if (start != end) snprintf(tmp, 31, " %d-%d", start, end); else snprintf(tmp, 31, " %d", start); tmp_len = strlen(tmp); sequence = g_realloc(sequence, seq_len+tmp_len+1); strcpy(sequence+seq_len, tmp); seq_len += tmp_len; start = end = -1; } } cur = cur ? cur->next:NULL; } while (cur || (start > 0 && end > 0)); if (sequence && *sequence) { if (fprintf(mh_sequences_new_fp, "%s%s\n", get_unseen_seq_name(), sequence) < 0) err = TRUE; else debug_print("wrote unseen sequence: '%s%s'\n", get_unseen_seq_name(), sequence); } /* rewrite the rest of the file */ if ((mh_sequences_old_fp = g_fopen(mh_sequences_old, "r+b")) != NULL) { while (fgets(buf, sizeof(buf), mh_sequences_old_fp) != NULL) { if (strncmp(buf, get_unseen_seq_name(), strlen(get_unseen_seq_name()))) if (fprintf(mh_sequences_new_fp, "%s", buf) < 0) { err = TRUE; break; } } fclose(mh_sequences_old_fp); } fflush(mh_sequences_new_fp); #if 0 fsync(fileno(mh_sequences_new_fp)); #endif if (fclose(mh_sequences_new_fp) == EOF) err = TRUE; if (!err) { if (g_rename(mh_sequences_new, mh_sequences_old) < 0) FILE_OP_ERROR(mh_sequences_new, "rename"); } g_free(sequence); procmsg_msg_list_free(msglist); } g_free(mh_sequences_old); g_free(mh_sequences_new); g_free(path); END_TIMING(); }