void prof_run(const int disable_tls, char *log_level, char *account_name) { _init(disable_tls, log_level); log_info("Starting main event loop"); inp_non_block(); GTimer *timer = g_timer_new(); gboolean cmd_result = TRUE; jabber_conn_status_t conn_status = jabber_get_connection_status(); char inp[INP_WIN_MAX]; int size = 0; ui_update_screen(); if (account_name != NULL) { char *cmd = "/connect"; snprintf(inp, sizeof(inp), "%s %s", cmd, account_name); process_input(inp); } else if (prefs_get_string(PREF_CONNECT_ACCOUNT) != NULL) { char *cmd = "/connect"; snprintf(inp, sizeof(inp), "%s %s", cmd, prefs_get_string(PREF_CONNECT_ACCOUNT)); process_input(inp); } while(cmd_result == TRUE) { wint_t ch = ERR; size = 0; while(ch != '\n') { conn_status = jabber_get_connection_status(); if (conn_status == JABBER_CONNECTED) { _handle_idle_time(); } gdouble elapsed = g_timer_elapsed(timer, NULL); gint remind_period = prefs_get_notify_remind(); if (remind_period > 0 && elapsed >= remind_period) { notify_remind(); g_timer_start(timer); } ui_handle_special_keys(&ch, inp, size); ui_update_screen(); jabber_process_events(); ch = inp_get_char(inp, &size); if (ch != ERR) { ui_reset_idle_time(); } } inp[size++] = '\0'; cmd_result = process_input(inp); } g_timer_destroy(timer); }
static void _otr_keygen(ProfAccount *account) { if (data_loaded) { cons_show("OTR key already generated."); return; } jid = strdup(account->jid); log_info("Generating OTR key for %s", jid); jid = strdup(account->jid); gchar *data_home = xdg_get_data_home(); gchar *account_dir = str_replace(jid, "@", "_at_"); GString *basedir = g_string_new(data_home); g_string_append(basedir, "/profanity/otr/"); g_string_append(basedir, account_dir); g_string_append(basedir, "/"); free(account_dir); if (!mkdir_recursive(basedir->str)) { log_error("Could not create %s for account %s.", basedir->str, jid); cons_show_error("Could not create %s for account %s.", basedir->str, jid); g_string_free(basedir, TRUE); return; } gcry_error_t err = 0; GString *keysfilename = g_string_new(basedir->str); g_string_append(keysfilename, "keys.txt"); log_debug("Generating private key file %s for %s", keysfilename->str, jid); cons_show("Generating private key, this may take some time."); cons_show("Moving the mouse randomly around the screen may speed up the process!"); ui_current_page_off(); ui_update_screen(); err = otrl_privkey_generate(user_state, keysfilename->str, account->jid, "xmpp"); if (!err == GPG_ERR_NO_ERROR) { g_string_free(basedir, TRUE); g_string_free(keysfilename, TRUE); log_error("Failed to generate private key"); cons_show_error("Failed to generate private key"); return; } log_info("Private key generated"); cons_show(""); cons_show("Private key generation complete."); GString *fpsfilename = g_string_new(basedir->str); g_string_append(fpsfilename, "fingerprints.txt"); log_debug("Generating fingerprints file %s for %s", fpsfilename->str, jid); err = otrl_privkey_write_fingerprints(user_state, fpsfilename->str); if (!err == GPG_ERR_NO_ERROR) { g_string_free(basedir, TRUE); g_string_free(keysfilename, TRUE); log_error("Failed to create fingerprints file"); cons_show_error("Failed to create fingerprints file"); return; } log_info("Fingerprints file created"); err = otrl_privkey_read(user_state, keysfilename->str); if (!err == GPG_ERR_NO_ERROR) { g_string_free(basedir, TRUE); g_string_free(keysfilename, TRUE); log_error("Failed to load private key"); data_loaded = FALSE; return; } err = otrl_privkey_read_fingerprints(user_state, fpsfilename->str, NULL, NULL); if (!err == GPG_ERR_NO_ERROR) { g_string_free(basedir, TRUE); g_string_free(keysfilename, TRUE); log_error("Failed to load fingerprints"); data_loaded = FALSE; return; } data_loaded = TRUE; g_string_free(basedir, TRUE); g_string_free(keysfilename, TRUE); g_string_free(fpsfilename, TRUE); return; }