diff options
Diffstat (limited to 'src/command')
-rw-r--r-- | src/command/command.c | 313 | ||||
-rw-r--r-- | src/command/command.h | 9 | ||||
-rw-r--r-- | src/command/commands.c | 994 | ||||
-rw-r--r-- | src/command/commands.h | 167 |
4 files changed, 968 insertions, 515 deletions
diff --git a/src/command/command.c b/src/command/command.c index 4086278c..105e41e5 100644 --- a/src/command/command.c +++ b/src/command/command.c @@ -66,42 +66,41 @@ #include "xmpp/xmpp.h" #include "xmpp/bookmark.h" #include "ui/ui.h" -#include "ui/windows.h" - -typedef char*(*autocompleter)(char*, int*); - -static gboolean _cmd_execute(const char * const command, const char * const inp); - -static char * _cmd_complete_parameters(const char * const input); - -static char * _sub_autocomplete(const char * const input); -static char * _notify_autocomplete(const char * const input); -static char * _theme_autocomplete(const char * const input); -static char * _autoaway_autocomplete(const char * const input); -static char * _autoconnect_autocomplete(const char * const input); -static char * _account_autocomplete(const char * const input); -static char * _who_autocomplete(const char * const input); -static char * _roster_autocomplete(const char * const input); -static char * _group_autocomplete(const char * const input); -static char * _bookmark_autocomplete(const char * const input); -static char * _otr_autocomplete(const char * const input); -static char * _connect_autocomplete(const char * const input); -static char * _statuses_autocomplete(const char * const input); -static char * _alias_autocomplete(const char * const input); -static char * _join_autocomplete(const char * const input); -static char * _log_autocomplete(const char * const input); -static char * _form_autocomplete(const char * const input); -static char * _form_field_autocomplete(const char * const input); -static char * _occupants_autocomplete(const char * const input); -static char * _kick_autocomplete(const char * const input); -static char * _ban_autocomplete(const char * const input); -static char * _affiliation_autocomplete(const char * const input); -static char * _role_autocomplete(const char * const input); -static char * _resource_autocomplete(const char * const input); -static char * _titlebar_autocomplete(const char * const input); -static char * _inpblock_autocomplete(const char * const input); -static char * _time_autocomplete(const char * const input); -static char * _receipts_autocomplete(const char * const input); +#include "window_list.h" + +static gboolean _cmd_execute(ProfWin *window, const char * const command, const char * const inp); + +static char * _cmd_complete_parameters(ProfWin *window, const char * const input); + +static char * _sub_autocomplete(ProfWin *window, const char * const input); +static char * _notify_autocomplete(ProfWin *window, const char * const input); +static char * _theme_autocomplete(ProfWin *window, const char * const input); +static char * _autoaway_autocomplete(ProfWin *window, const char * const input); +static char * _autoconnect_autocomplete(ProfWin *window, const char * const input); +static char * _account_autocomplete(ProfWin *window, const char * const input); +static char * _who_autocomplete(ProfWin *window, const char * const input); +static char * _roster_autocomplete(ProfWin *window, const char * const input); +static char * _group_autocomplete(ProfWin *window, const char * const input); +static char * _bookmark_autocomplete(ProfWin *window, const char * const input); +static char * _otr_autocomplete(ProfWin *window, const char * const input); +static char * _pgp_autocomplete(ProfWin *window, const char * const input); +static char * _connect_autocomplete(ProfWin *window, const char * const input); +static char * _statuses_autocomplete(ProfWin *window, const char * const input); +static char * _alias_autocomplete(ProfWin *window, const char * const input); +static char * _join_autocomplete(ProfWin *window, const char * const input); +static char * _log_autocomplete(ProfWin *window, const char * const input); +static char * _form_autocomplete(ProfWin *window, const char * const input); +static char * _form_field_autocomplete(ProfWin *window, const char * const input); +static char * _occupants_autocomplete(ProfWin *window, const char * const input); +static char * _kick_autocomplete(ProfWin *window, const char * const input); +static char * _ban_autocomplete(ProfWin *window, const char * const input); +static char * _affiliation_autocomplete(ProfWin *window, const char * const input); +static char * _role_autocomplete(ProfWin *window, const char * const input); +static char * _resource_autocomplete(ProfWin *window, const char * const input); +static char * _titlebar_autocomplete(ProfWin *window, const char * const input); +static char * _inpblock_autocomplete(ProfWin *window, const char * const input); +static char * _time_autocomplete(ProfWin *window, const char * const input); +static char * _receipts_autocomplete(ProfWin *window, const char * const input); GHashTable *commands = NULL; @@ -206,6 +205,7 @@ static struct cmd_t command_defs[] = "size : Percentage of the screen taken up by the roster (1-99).", "add jid [nick] : Add a new item to the roster.", "remove jid : Removes an item from the roster.", + "empty : Remove all items from roster." "nick jid nick : Change a contacts nickname.", "clearnick jid : Removes the current nickname.", "", @@ -668,6 +668,14 @@ static struct cmd_t command_defs[] = "If the terminal does not support sounds, it may attempt to flash the screen instead.", NULL } } }, + { "/encwarn", + cmd_encwarn, parse_args, 1, 1, &cons_encwarn_setting, + { "/encwarn on|off", "Titlebar encryption warning.", + { "/encwarn on|off", + "---------------", + "Enabled or disable the unencrypted warning message in the titlebar.", + NULL } } }, + { "/presence", cmd_presence, parse_args, 1, 1, &cons_presence_setting, { "/presence on|off", "Show the contacts presence in the titlebar.", @@ -684,6 +692,14 @@ static struct cmd_t command_defs[] = "Enable or disable word wrapping in the main window.", NULL } } }, + { "/winstidy", + cmd_winstidy, parse_args, 1, 1, &cons_winstidy_setting, + { "/winstidy on|off", "Auto tidy windows.", + { "/winstidy on|off", + "----------------", + "Enable or disable auto window tidy.", + NULL } } }, + { "/time", cmd_time, parse_args, 1, 3, &cons_time_setting, { "/time main|statusbar set|off [format]", "Time display.", @@ -855,6 +871,22 @@ static struct cmd_t command_defs[] = "Send chat state notifications during chat sessions.", NULL } } }, + { "/pgp", + cmd_pgp, parse_args, 1, 3, NULL, + { "/pgp command [args..]", "Open PGP commands.", + { "/pgp command [args..]", + "---------------------", + "Open PGP commands.", + "", + "keys : List all keys.", + "libver : Show which version of the libgpgme library is being used.", + "fps : Show known fingerprints.", + "setkey contact keyid : Manually associate a key ID with a JID.", + "start [contact] : Start PGP encrypted chat, current contact will be used if not specified.", + "end : End PGP encrypted chat with the current recipient.", + "log on|off|redact : PGP message logging, default: redact.", + NULL } } }, + { "/otr", cmd_otr, parse_args, 1, 3, NULL, { "/otr command [args..]", "Off The Record encryption commands.", @@ -1210,6 +1242,8 @@ static Autocomplete time_format_ac; static Autocomplete resource_ac; static Autocomplete inpblock_ac; static Autocomplete receipts_ac; +static Autocomplete pgp_ac; +static Autocomplete pgp_log_ac; /* * Initialise command autocompleter and history @@ -1269,6 +1303,7 @@ cmd_init(void) autocomplete_add(prefs_ac, "conn"); autocomplete_add(prefs_ac, "presence"); autocomplete_add(prefs_ac, "otr"); + autocomplete_add(prefs_ac, "pgp"); notify_ac = autocomplete_new(); autocomplete_add(notify_ac, "message"); @@ -1366,6 +1401,7 @@ cmd_init(void) autocomplete_add(account_set_ac, "muc"); autocomplete_add(account_set_ac, "nick"); autocomplete_add(account_set_ac, "otr"); + autocomplete_add(account_set_ac, "pgpkeyid"); account_clear_ac = autocomplete_new(); autocomplete_add(account_clear_ac, "password"); @@ -1373,6 +1409,7 @@ cmd_init(void) autocomplete_add(account_clear_ac, "server"); autocomplete_add(account_clear_ac, "port"); autocomplete_add(account_clear_ac, "otr"); + autocomplete_add(account_clear_ac, "pgpkeyid"); account_default_ac = autocomplete_new(); autocomplete_add(account_default_ac, "set"); @@ -1393,6 +1430,7 @@ cmd_init(void) autocomplete_add(roster_ac, "nick"); autocomplete_add(roster_ac, "clearnick"); autocomplete_add(roster_ac, "remove"); + autocomplete_add(roster_ac, "empty"); autocomplete_add(roster_ac, "show"); autocomplete_add(roster_ac, "hide"); autocomplete_add(roster_ac, "by"); @@ -1462,7 +1500,6 @@ cmd_init(void) autocomplete_add(otr_ac, "untrust"); autocomplete_add(otr_ac, "secret"); autocomplete_add(otr_ac, "log"); - autocomplete_add(otr_ac, "warn"); autocomplete_add(otr_ac, "libver"); autocomplete_add(otr_ac, "policy"); autocomplete_add(otr_ac, "question"); @@ -1571,6 +1608,20 @@ cmd_init(void) receipts_ac = autocomplete_new(); autocomplete_add(receipts_ac, "send"); autocomplete_add(receipts_ac, "request"); + + pgp_ac = autocomplete_new(); + autocomplete_add(pgp_ac, "keys"); + autocomplete_add(pgp_ac, "fps"); + autocomplete_add(pgp_ac, "setkey"); + autocomplete_add(pgp_ac, "libver"); + autocomplete_add(pgp_ac, "start"); + autocomplete_add(pgp_ac, "end"); + autocomplete_add(pgp_ac, "log"); + + pgp_log_ac = autocomplete_new(); + autocomplete_add(pgp_log_ac, "on"); + autocomplete_add(pgp_log_ac, "off"); + autocomplete_add(pgp_log_ac, "redact"); } void @@ -1630,6 +1681,8 @@ cmd_uninit(void) autocomplete_free(resource_ac); autocomplete_free(inpblock_ac); autocomplete_free(receipts_ac); + autocomplete_free(pgp_ac); + autocomplete_free(pgp_log_ac); } gboolean @@ -1714,7 +1767,7 @@ cmd_alias_remove(char *value) // Command autocompletion functions char* -cmd_autocomplete(const char * const input) +cmd_autocomplete(ProfWin *window, const char * const input) { // autocomplete command if ((strncmp(input, "/", 1) == 0) && (!str_contains(input, strlen(input), ' '))) { @@ -1726,7 +1779,7 @@ cmd_autocomplete(const char * const input) // autocomplete parameters } else { - char *found = _cmd_complete_parameters(input); + char *found = _cmd_complete_parameters(window, input); if (found) { return found; } @@ -1736,7 +1789,7 @@ cmd_autocomplete(const char * const input) } void -cmd_reset_autocomplete() +cmd_reset_autocomplete(ProfWin *window) { roster_reset_search_attempts(); muc_invites_reset_ac(); @@ -1802,23 +1855,28 @@ cmd_reset_autocomplete() autocomplete_reset(resource_ac); autocomplete_reset(inpblock_ac); autocomplete_reset(receipts_ac); + autocomplete_reset(pgp_ac); + autocomplete_reset(pgp_log_ac); - if (ui_current_win_type() == WIN_CHAT) { - ProfChatWin *chatwin = wins_get_current_chat(); + if (window->type == WIN_CHAT) { + ProfChatWin *chatwin = (ProfChatWin*)window; + assert(chatwin->memcheck == PROFCHATWIN_MEMCHECK); PContact contact = roster_get_contact(chatwin->barejid); if (contact) { p_contact_resource_ac_reset(contact); } } - if (ui_current_win_type() == WIN_MUC) { - ProfMucWin *mucwin = wins_get_current_muc(); + if (window->type == WIN_MUC) { + ProfMucWin *mucwin = (ProfMucWin*)window; + assert(mucwin->memcheck == PROFMUCWIN_MEMCHECK); muc_autocomplete_reset(mucwin->roomjid); muc_jid_autocomplete_reset(mucwin->roomjid); } - if (ui_current_win_type() == WIN_MUC_CONFIG) { - ProfMucConfWin *confwin = wins_get_current_muc_conf(); + if (window->type == WIN_MUC_CONFIG) { + ProfMucConfWin *confwin = (ProfMucConfWin*)window; + assert(confwin->memcheck == PROFCONFWIN_MEMCHECK); if (confwin->form) { form_reset_autocompleters(confwin->form); } @@ -1832,11 +1890,11 @@ cmd_reset_autocomplete() * continue, FALSE otherwise */ gboolean -cmd_process_input(char *inp) +cmd_process_input(ProfWin *window, char *inp) { log_debug("Input received: %s", inp); gboolean result = FALSE; - g_strstrip(inp); + g_strchomp(inp); // just carry on if no input if (strlen(inp) == 0) { @@ -1846,12 +1904,12 @@ cmd_process_input(char *inp) } else if (inp[0] == '/') { char *inp_cpy = strdup(inp); char *command = strtok(inp_cpy, " "); - result = _cmd_execute(command, inp); + result = _cmd_execute(window, command, inp); free(inp_cpy); // call a default handler if input didn't start with '/' } else { - result = cmd_execute_default(inp); + result = cmd_execute_default(window, inp); } return result; @@ -1860,18 +1918,18 @@ cmd_process_input(char *inp) // Command execution void -cmd_execute_connect(const char * const account) +cmd_execute_connect(ProfWin *window, const char * const account) { GString *command = g_string_new("/connect "); g_string_append(command, account); - cmd_process_input(command->str); + cmd_process_input(window, command->str); g_string_free(command, TRUE); } static gboolean -_cmd_execute(const char * const command, const char * const inp) +_cmd_execute(ProfWin *window, const char * const command, const char * const inp) { - if (g_str_has_prefix(command, "/field") && ui_current_win_type() == WIN_MUC_CONFIG) { + if (g_str_has_prefix(command, "/field") && window->type == WIN_MUC_CONFIG) { gboolean result = FALSE; gchar **args = parse_args_with_freetext(inp, 1, 2, &result); if (!result) { @@ -1880,7 +1938,7 @@ _cmd_execute(const char * const command, const char * const inp) } else { gchar **tokens = g_strsplit(inp, " ", 2); char *field = tokens[0] + 1; - result = cmd_form_field(field, args); + result = cmd_form_field(window, field, args); g_strfreev(tokens); } @@ -1897,15 +1955,15 @@ _cmd_execute(const char * const command, const char * const inp) ui_invalid_command_usage(cmd->help.usage, cmd->setting_func); return TRUE; } else { - gboolean result = cmd->func(args, cmd->help); + gboolean result = cmd->func(window, args, cmd->help); g_strfreev(args); return result; } } else { gboolean ran_alias = FALSE; - gboolean alias_result = cmd_execute_alias(inp, &ran_alias); + gboolean alias_result = cmd_execute_alias(window, inp, &ran_alias); if (!ran_alias) { - return cmd_execute_default(inp); + return cmd_execute_default(window, inp); } else { return alias_result; } @@ -1913,7 +1971,7 @@ _cmd_execute(const char * const command, const char * const inp) } static char * -_cmd_complete_parameters(const char * const input) +_cmd_complete_parameters(ProfWin *window, const char * const input) { int i; char *result = NULL; @@ -1921,7 +1979,7 @@ _cmd_complete_parameters(const char * const input) // autocomplete boolean settings gchar *boolean_choices[] = { "/beep", "/intype", "/states", "/outtype", "/flash", "/splash", "/chlog", "/grlog", "/mouse", "/history", - "/vercheck", "/privileges", "/presence", "/wrap", "/carbons" }; + "/vercheck", "/privileges", "/presence", "/wrap", "/winstidy", "/carbons", "/encwarn" }; for (i = 0; i < ARRAY_SIZE(boolean_choices); i++) { result = autocomplete_param_with_func(input, boolean_choices[i], prefs_autocomplete_boolean_choice); @@ -1931,8 +1989,9 @@ _cmd_complete_parameters(const char * const input) } // autocomplete nickname in chat rooms - if (ui_current_win_type() == WIN_MUC) { - ProfMucWin *mucwin = wins_get_current_muc(); + if (window->type == WIN_MUC) { + ProfMucWin *mucwin = (ProfMucWin*)window; + assert(mucwin->memcheck == PROFMUCWIN_MEMCHECK); Autocomplete nick_ac = muc_roster_ac(mucwin->roomjid); if (nick_ac) { gchar *nick_choices[] = { "/msg", "/info", "/caps", "/status", "/software" } ; @@ -2008,6 +2067,7 @@ _cmd_complete_parameters(const char * const input) g_hash_table_insert(ac_funcs, "/bookmark", _bookmark_autocomplete); g_hash_table_insert(ac_funcs, "/autoconnect", _autoconnect_autocomplete); g_hash_table_insert(ac_funcs, "/otr", _otr_autocomplete); + g_hash_table_insert(ac_funcs, "/pgp", _pgp_autocomplete); g_hash_table_insert(ac_funcs, "/connect", _connect_autocomplete); g_hash_table_insert(ac_funcs, "/statuses", _statuses_autocomplete); g_hash_table_insert(ac_funcs, "/alias", _alias_autocomplete); @@ -2037,9 +2097,9 @@ _cmd_complete_parameters(const char * const input) } parsed[i] = '\0'; - char * (*ac_func)(const char * const) = g_hash_table_lookup(ac_funcs, parsed); + char * (*ac_func)(ProfWin*, const char * const) = g_hash_table_lookup(ac_funcs, parsed); if (ac_func) { - result = ac_func(input); + result = ac_func(window, input); if (result) { g_hash_table_destroy(ac_funcs); return result; @@ -2048,7 +2108,7 @@ _cmd_complete_parameters(const char * const input) g_hash_table_destroy(ac_funcs); if (g_str_has_prefix(input, "/field")) { - result = _form_field_autocomplete(input); + result = _form_field_autocomplete(window, input); if (result) { return result; } @@ -2058,7 +2118,7 @@ _cmd_complete_parameters(const char * const input) } static char * -_sub_autocomplete(const char * const input) +_sub_autocomplete(ProfWin *window, const char * const input) { char *result = NULL; result = autocomplete_param_with_func(input, "/sub allow", presence_sub_request_find); @@ -2078,12 +2138,11 @@ _sub_autocomplete(const char * const input) } static char * -_who_autocomplete(const char * const input) +_who_autocomplete(ProfWin *window, const char * const input) { char *result = NULL; - win_type_t win_type = ui_current_win_type(); - if (win_type == WIN_MUC) { + if (window->type == WIN_MUC) { result = autocomplete_param_with_ac(input, "/who", who_room_ac, TRUE); if (result) { return result; @@ -2111,7 +2170,7 @@ _who_autocomplete(const char * const input) } static char * -_roster_autocomplete(const char * const input) +_roster_autocomplete(ProfWin *window, const char * const input) { char *result = NULL; result = autocomplete_param_with_func(input, "/roster nick", roster_barejid_autocomplete); @@ -2147,7 +2206,7 @@ _roster_autocomplete(const char * const input) } static char * -_group_autocomplete(const char * const input) +_group_autocomplete(ProfWin *window, const char * const input) { char *result = NULL; result = autocomplete_param_with_func(input, "/group show", roster_group_autocomplete); @@ -2180,7 +2239,7 @@ _group_autocomplete(const char * const input) } static char * -_bookmark_autocomplete(const char * const input) +_bookmark_autocomplete(ProfWin *window, const char * const input) { char *found = NULL; @@ -2259,7 +2318,7 @@ _bookmark_autocomplete(const char * const input) } static char * -_notify_autocomplete(const char * const input) +_notify_autocomplete(ProfWin *window, const char * const input) { int i = 0; char *result = NULL; @@ -2322,7 +2381,7 @@ _notify_autocomplete(const char * const input) } static char * -_autoaway_autocomplete(const char * const input) +_autoaway_autocomplete(ProfWin *window, const char * const input) { char *result = NULL; @@ -2344,7 +2403,7 @@ _autoaway_autocomplete(const char * const input) } static char * -_log_autocomplete(const char * const input) +_log_autocomplete(ProfWin *window, const char * const input) { char *result = NULL; @@ -2367,7 +2426,7 @@ _log_autocomplete(const char * const input) } static char * -_autoconnect_autocomplete(const char * const input) +_autoconnect_autocomplete(ProfWin *window, const char * const input) { char *result = NULL; @@ -2385,7 +2444,7 @@ _autoconnect_autocomplete(const char * const input) } static char * -_otr_autocomplete(const char * const input) +_otr_autocomplete(ProfWin *window, const char * const input) { char *found = NULL; @@ -2423,13 +2482,35 @@ _otr_autocomplete(const char * const input) return found; } - found = autocomplete_param_with_func(input, "/otr warn", - prefs_autocomplete_boolean_choice); + found = autocomplete_param_with_ac(input, "/otr", otr_ac, TRUE); if (found) { return found; } - found = autocomplete_param_with_ac(input, "/otr", otr_ac, TRUE); + return NULL; +} + +static char * +_pgp_autocomplete(ProfWin *window, const char * const input) +{ + char *found = NULL; + + found = autocomplete_param_with_func(input, "/pgp start", roster_contact_autocomplete); + if (found) { + return found; + } + + found = autocomplete_param_with_ac(input, "/pgp log", pgp_log_ac, TRUE); + if (found) { + return found; + } + + found = autocomplete_param_with_func(input, "/pgp setkey", roster_barejid_autocomplete); + if (found) { + return found; + } + + found = autocomplete_param_with_ac(input, "/pgp", pgp_ac, TRUE); if (found) { return found; } @@ -2438,7 +2519,7 @@ _otr_autocomplete(const char * const input) } static char * -_theme_autocomplete(const char * const input) +_theme_autocomplete(ProfWin *window, const char * const input) { char *result = NULL; if ((strncmp(input, "/theme load ", 12) == 0) && (strlen(input) > 12)) { @@ -2467,13 +2548,13 @@ _theme_autocomplete(const char * const input) } static char * -_resource_autocomplete(const char * const input) +_resource_autocomplete(ProfWin *window, const char * const input) { char *found = NULL; - ProfWin *current = wins_get_current(); - if (current && current->type == WIN_CHAT) { - ProfChatWin *chatwin = wins_get_current_chat(); + if (window->type == WIN_CHAT) { + ProfChatWin *chatwin = (ProfChatWin*)window; + assert(chatwin->memcheck == PROFCHATWIN_MEMCHECK); PContact contact = roster_get_contact(chatwin->barejid); if (contact) { Autocomplete ac = p_contact_resource_ac(contact); @@ -2503,7 +2584,7 @@ _resource_autocomplete(const char * const input) } static char * -_titlebar_autocomplete(const char * const input) +_titlebar_autocomplete(ProfWin *window, const char * const input) { char *found = NULL; @@ -2526,7 +2607,7 @@ _titlebar_autocomplete(const char * const input) } static char * -_inpblock_autocomplete(const char * const input) +_inpblock_autocomplete(ProfWin *window, const char * const input) { char *found = NULL; @@ -2544,16 +2625,15 @@ _inpblock_autocomplete(const char * const input) } static char * -_form_autocomplete(const char * const input) +_form_autocomplete(ProfWin *window, const char * const input) { - ProfWin *current = wins_get_current(); - if (current->type != WIN_MUC_CONFIG) { + if (window->type != WIN_MUC_CONFIG) { return NULL; } char *found = NULL; - ProfMucConfWin *confwin = (ProfMucConfWin*)current; + ProfMucConfWin *confwin = (ProfMucConfWin*)window; DataForm *form = confwin->form; if (form) { found = autocomplete_param_with_ac(input, "/form help", form->tag_ac, TRUE); @@ -2571,16 +2651,15 @@ _form_autocomplete(const char * const input) } static char * -_form_field_autocomplete(const char * const input) +_form_field_autocomplete(ProfWin *window, const char * const input) { - ProfWin *current = wins_get_current(); - if (current->type != WIN_MUC_CONFIG) { + if (window->type != WIN_MUC_CONFIG) { return NULL; } char *found = NULL; - ProfMucConfWin *confwin = (ProfMucConfWin*)current; + ProfMucConfWin *confwin = (ProfMucConfWin*)window; DataForm *form = confwin->form; if (form == NULL) { return NULL; @@ -2642,7 +2721,7 @@ _form_field_autocomplete(const char * const input) } static char * -_occupants_autocomplete(const char * const input) +_occupants_autocomplete(ProfWin *window, const char * const input) { char *found = NULL; @@ -2680,7 +2759,7 @@ _occupants_autocomplete(const char * const input) } static char * -_time_autocomplete(const char * const input) +_time_autocomplete(ProfWin *window, const char * const input) { char *found = NULL; @@ -2703,12 +2782,13 @@ _time_autocomplete(const char * const input) } static char * -_kick_autocomplete(const char * const input) +_kick_autocomplete(ProfWin *window, const char * const input) { char *result = NULL; - if (ui_current_win_type() == WIN_MUC) { - ProfMucWin *mucwin = wins_get_current_muc(); + if (window->type == WIN_MUC) { + ProfMucWin *mucwin = (ProfMucWin*)window; + assert(mucwin->memcheck == PROFMUCWIN_MEMCHECK); Autocomplete nick_ac = muc_roster_ac(mucwin->roomjid); if (nick_ac) { @@ -2723,12 +2803,13 @@ _kick_autocomplete(const char * const input) } static char * -_ban_autocomplete(const char * const input) +_ban_autocomplete(ProfWin *window, const char * const input) { char *result = NULL; - if (ui_current_win_type() == WIN_MUC) { - ProfMucWin *mucwin = wins_get_current_muc(); + if (window->type == WIN_MUC) { + ProfMucWin *mucwin = (ProfMucWin*)window; + assert(mucwin->memcheck == PROFMUCWIN_MEMCHECK); Autocomplete jid_ac = muc_roster_jid_ac(mucwin->roomjid); if (jid_ac) { @@ -2743,12 +2824,13 @@ _ban_autocomplete(const char * const input) } static char * -_affiliation_autocomplete(const char * const input) +_affiliation_autocomplete(ProfWin *window, const char * const input) { char *result = NULL; - if (ui_current_win_type() == WIN_MUC) { - ProfMucWin *mucwin = wins_get_current_muc(); + if (window->type == WIN_MUC) { + ProfMucWin *mucwin = (ProfMucWin*)window; + assert(mucwin->memcheck == PROFMUCWIN_MEMCHECK); gboolean parse_result; Autocomplete jid_ac = muc_roster_jid_ac(mucwin->roomjid); @@ -2790,12 +2872,13 @@ _affiliation_autocomplete(const char * const input) } static char * -_role_autocomplete(const char * const input) +_role_autocomplete(ProfWin *window, const char * const input) { char *result = NULL; - if (ui_current_win_type() == WIN_MUC) { - ProfMucWin *mucwin = wins_get_current_muc(); + if (window->type == WIN_MUC) { + ProfMucWin *mucwin = (ProfMucWin*)window; + assert(mucwin->memcheck == PROFMUCWIN_MEMCHECK); gboolean parse_result; Autocomplete nick_ac = muc_roster_ac(mucwin->roomjid); @@ -2837,7 +2920,7 @@ _role_autocomplete(const char * const input) } static char * -_statuses_autocomplete(const char * const input) +_statuses_autocomplete(ProfWin *window, const char * const input) { char *result = NULL; @@ -2865,7 +2948,7 @@ _statuses_autocomplete(const char * const input) } static char * -_receipts_autocomplete(const char * const input) +_receipts_autocomplete(ProfWin *window, const char * const input) { char *result = NULL; @@ -2888,7 +2971,7 @@ _receipts_autocomplete(const char * const input) } static char * -_alias_autocomplete(const char * const input) +_alias_autocomplete(ProfWin *window, const char * const input) { char *result = NULL; @@ -2906,7 +2989,7 @@ _alias_autocomplete(const char * const input) } static char * -_connect_autocomplete(const char * const input) +_connect_autocomplete(ProfWin *window, const char * const input) { char *found = NULL; gboolean result = FALSE; @@ -2941,7 +3024,7 @@ _connect_autocomplete(const char * const input) } static char * -_join_autocomplete(const char * const input) +_join_autocomplete(ProfWin *window, const char * const input) { char *found = NULL; gboolean result = FALSE; @@ -2976,7 +3059,7 @@ _join_autocomplete(const char * const input) } static char * -_account_autocomplete(const char * const input) +_account_autocomplete(ProfWin *window, const char * const input) { char *found = NULL; gboolean result = FALSE; diff --git a/src/command/command.h b/src/command/command.h index b500404b..e6fc7ead 100644 --- a/src/command/command.h +++ b/src/command/command.h @@ -38,14 +38,15 @@ #include <glib.h> #include "xmpp/form.h" +#include "ui/ui.h" GHashTable *commands; void cmd_init(void); void cmd_uninit(void); -char* cmd_autocomplete(const char * const input); -void cmd_reset_autocomplete(void); +char* cmd_autocomplete(ProfWin *window, const char * const input); +void cmd_reset_autocomplete(ProfWin *window); void cmd_autocomplete_add(char *value); void cmd_autocomplete_remove(char *value); void cmd_autocomplete_add_form_fields(DataForm *form); @@ -53,8 +54,8 @@ void cmd_autocomplete_remove_form_fields(DataForm *form); void cmd_alias_add(char *value); void cmd_alias_remove(char *value); -gboolean cmd_process_input(char *inp); -void cmd_execute_connect(const char * const account); +gboolean cmd_process_input(ProfWin *window, char *inp); +void cmd_execute_connect(ProfWin *window, const char * const account); gboolean cmd_exists(char *cmd); diff --git a/src/command/commands.c b/src/command/commands.c index c5350519..7f13d5f5 100644 --- a/src/command/commands.c +++ b/src/command/commands.c @@ -57,6 +57,9 @@ #ifdef HAVE_LIBOTR #include "otr/otr.h" #endif +#ifdef HAVE_LIBGPGME +#include "pgp/gpg.h" +#endif #include "profanity.h" #include "tools/autocomplete.h" #include "tools/parser.h" @@ -64,7 +67,7 @@ #include "xmpp/xmpp.h" #include "xmpp/bookmark.h" #include "ui/ui.h" -#include "ui/windows.h" +#include "window_list.h" #include "event/client_events.h" #include "event/ui_events.h" @@ -74,13 +77,13 @@ static gboolean _cmd_set_boolean_preference(gchar *arg, struct cmd_help_t help, const char * const display, preference_t pref); static void _cmd_show_filtered_help(char *heading, gchar *cmd_filter[], int filter_size); static gint _compare_commands(Command *a, Command *b); -static void _who_room(gchar **args, struct cmd_help_t help); -static void _who_roster(gchar **args, struct cmd_help_t help); +static void _who_room(ProfWin *window, gchar **args, struct cmd_help_t help); +static void _who_roster(ProfWin *window, gchar **args, struct cmd_help_t help); extern GHashTable *commands; gboolean -cmd_execute_default(const char * inp) +cmd_execute_default(ProfWin *window, const char * inp) { // handle escaped commands - treat as normal message if (g_str_has_prefix(inp, "//")) { @@ -94,8 +97,7 @@ cmd_execute_default(const char * inp) } // handle non commands in non chat windows - ProfWin *current = wins_get_current(); - if (current->type != WIN_CHAT && current->type != WIN_MUC && current->type != WIN_PRIVATE) { + if (window->type != WIN_CHAT && window->type != WIN_MUC && window->type != WIN_PRIVATE) { cons_show("Unknown command: %s", inp); return TRUE; } @@ -106,22 +108,25 @@ cmd_execute_default(const char * inp) return TRUE; } - switch (current->type) { + switch (window->type) { case WIN_CHAT: { - ProfChatWin *chatwin = wins_get_current_chat(); + ProfChatWin *chatwin = (ProfChatWin*)window; + assert(chatwin->memcheck == PROFCHATWIN_MEMCHECK); cl_ev_send_msg(chatwin, inp); break; } case WIN_PRIVATE: { - ProfPrivateWin *privatewin = wins_get_current_private(); + ProfPrivateWin *privatewin = (ProfPrivateWin*)window; + assert(privatewin->memcheck == PROFPRIVATEWIN_MEMCHECK); cl_ev_send_priv_msg(privatewin, inp); break; } case WIN_MUC: { - ProfMucWin *mucwin = wins_get_current_muc(); + ProfMucWin *mucwin = (ProfMucWin*)window; + assert(mucwin->memcheck == PROFMUCWIN_MEMCHECK); cl_ev_send_muc_msg(mucwin, inp); break; } @@ -133,7 +138,7 @@ cmd_execute_default(const char * inp) } gboolean -cmd_execute_alias(const char * const inp, gboolean *ran) +cmd_execute_alias(ProfWin *window, const char * const inp, gboolean *ran) { if (inp[0] != '/') { ran = FALSE; @@ -145,7 +150,7 @@ cmd_execute_alias(const char * const inp, gboolean *ran) free(alias); if (value) { *ran = TRUE; - return cmd_process_input(value); + return cmd_process_input(window, value); } *ran = FALSE; @@ -153,7 +158,7 @@ cmd_execute_alias(const char * const inp, gboolean *ran) } gboolean -cmd_connect(gchar **args, struct cmd_help_t help) +cmd_connect(ProfWin *window, gchar **args, struct cmd_help_t help) { jabber_conn_status_t conn_status = jabber_get_connection_status(); if ((conn_status != JABBER_DISCONNECTED) && (conn_status != JABBER_STARTED)) { @@ -221,6 +226,7 @@ cmd_connect(gchar **args, struct cmd_help_t help) } else { cons_show("Error evaluating password, see logs for details."); g_free(lower); + account_free(account); return TRUE; } @@ -233,6 +239,7 @@ cmd_connect(gchar **args, struct cmd_help_t help) } jid = account_create_full_jid(account); + account_free(account); // connect with JID } else { @@ -255,7 +262,7 @@ cmd_connect(gchar **args, struct cmd_help_t help) } gboolean -cmd_account(gchar **args, struct cmd_help_t help) +cmd_account(ProfWin *window, gchar **args, struct cmd_help_t help) { char *command = args[0]; @@ -431,7 +438,11 @@ cmd_account(gchar **args, struct cmd_help_t help) } } else if (strcmp(property, "resource") == 0) { accounts_set_resource(account_name, value); - cons_show("Updated resource for account %s: %s", account_name, value); + if (jabber_get_connection_status() == JABBER_CONNECTED) { + cons_show("Updated resource for account %s: %s, you will need to reconnect to pick up the change.", account_name, value); + } else { + cons_show("Updated resource for account %s: %s", account_name, value); + } cons_show(""); } else if (strcmp(property, "password") == 0) { if(accounts_get_account(account_name)->eval_password) { @@ -475,6 +486,10 @@ cmd_account(gchar **args, struct cmd_help_t help) cons_show("Updated login status for account %s: %s", account_name, value); } cons_show(""); + } else if (strcmp(property, "pgpkeyid") == 0) { + accounts_set_pgp_keyid(account_name, value); + cons_show("Updated PGP key ID for account %s: %s", account_name, value); + cons_show(""); } else if (valid_resource_presence_string(property)) { int intval; char *err_msg = NULL; @@ -553,6 +568,10 @@ cmd_account(gchar **args, struct cmd_help_t help) accounts_clear_otr(account_name); cons_show("OTR policy removed for account %s", account_name); cons_show(""); + } else if (strcmp(property, "pgpkeyid") == 0) { + accounts_clear_pgp_keyid(account_name); + cons_show("Removed PGP key ID for account %s", account_name); + cons_show(""); } else { cons_show("Invalid property: %s", property); cons_show(""); @@ -567,7 +586,7 @@ cmd_account(gchar **args, struct cmd_help_t help) } gboolean -cmd_sub(gchar **args, struct cmd_help_t help) +cmd_sub(ProfWin *window, gchar **args, struct cmd_help_t help) { jabber_conn_status_t conn_status = jabber_get_connection_status(); @@ -595,14 +614,14 @@ cmd_sub(gchar **args, struct cmd_help_t help) return TRUE; } - win_type_t win_type = ui_current_win_type(); - if ((win_type != WIN_CHAT) && (jid == NULL)) { + if ((window->type != WIN_CHAT) && (jid == NULL)) { cons_show("You must specify a contact."); return TRUE; } if (jid == NULL) { - ProfChatWin *chatwin = wins_get_current_chat(); + ProfChatWin *chatwin = (ProfChatWin*)window; + assert(chatwin->memcheck == PROFCHATWIN_MEMCHECK); jid = chatwin->barejid; } @@ -623,13 +642,13 @@ cmd_sub(gchar **args, struct cmd_help_t help) } else if (strcmp(subcmd, "show") == 0) { PContact contact = roster_get_contact(jidp->barejid); if ((contact == NULL) || (p_contact_subscription(contact) == NULL)) { - if (win_type == WIN_CHAT) { + if (window->type == WIN_CHAT) { ui_current_print_line("No subscription information for %s.", jidp->barejid); } else { cons_show("No subscription information for %s.", jidp->barejid); } } else { - if (win_type == WIN_CHAT) { + if (window->type == WIN_CHAT) { if (p_contact_pending_out(contact)) { ui_current_print_line("%s subscription status: %s, request pending.", jidp->barejid, p_contact_subscription(contact)); @@ -657,7 +676,7 @@ cmd_sub(gchar **args, struct cmd_help_t help) } gboolean -cmd_disconnect(gchar **args, struct cmd_help_t help) +cmd_disconnect(ProfWin *window, gchar **args, struct cmd_help_t help) { if (jabber_get_connection_status() == JABBER_CONNECTED) { char *jid = strdup(jabber_get_fulljid()); @@ -667,6 +686,9 @@ cmd_disconnect(gchar **args, struct cmd_help_t help) muc_invites_clear(); chat_sessions_clear(); ui_disconnected(); +#ifdef HAVE_LIBGPGME + p_gpg_on_disconnect(); +#endif free(jid); } else { cons_show("You are not currently connected."); @@ -676,7 +698,7 @@ cmd_disconnect(gchar **args, struct cmd_help_t help) } gboolean -cmd_quit(gchar **args, struct cmd_help_t help) +cmd_quit(ProfWin *window, gchar **args, struct cmd_help_t help) { log_info("Profanity is shutting down..."); exit(0); @@ -684,12 +706,16 @@ cmd_quit(gchar **args, struct cmd_help_t help) } gboolean -cmd_wins(gchar **args, struct cmd_help_t help) +cmd_wins(ProfWin *window, gchar **args, struct cmd_help_t help) { if (args[0] == NULL) { cons_show_wins(); } else if (strcmp(args[0], "tidy") == 0) { - ui_tidy_wins(); + if (ui_tidy_wins()) { + cons_show("Windows tidied."); + } else { + cons_show("No tidy needed."); + } } else if (strcmp(args[0], "prune") == 0) { ui_prune_wins(); } else if (strcmp(args[0], "swap") == 0) { @@ -719,22 +745,34 @@ cmd_wins(gchar **args, struct cmd_help_t help) } gboolean -cmd_win(gchar **args, struct cmd_help_t help) +cmd_winstidy(ProfWin *window, gchar **args, struct cmd_help_t help) +{ + gboolean result = _cmd_set_boolean_preference(args[0], help, "Wins Auto Tidy", PREF_WINS_AUTO_TIDY); + + if (result && g_strcmp0(args[0], "on") == 0) { + ui_tidy_wins(); + } + + return result; +} + +gboolean +cmd_win(ProfWin *window, gchar **args, struct cmd_help_t help) { int num = atoi(args[0]); - ProfWin *window = wins_get_by_num(num); - if (!window) { + ProfWin *focuswin = wins_get_by_num(num); + if (!focuswin) { cons_show("Window %d does not exist.", num); } else { - ui_ev_focus_win(window); + ui_ev_focus_win(focuswin); } return TRUE; } gboolean -cmd_help(gchar **args, struct cmd_help_t help) +cmd_help(ProfWin *window, gchar **args, struct cmd_help_t help) { int num_args = g_strv_length(args); if (num_args == 0) { @@ -804,7 +842,7 @@ cmd_help(gchar **args, struct cmd_help_t help) "/carbons", "/chlog", "/flash", "/gone", "/grlog", "/history", "/intype", "/log", "/mouse", "/notify", "/outtype", "/prefs", "/priority", "/reconnect", "/roster", "/splash", "/states", "/statuses", "/theme", - "/titlebar", "/vercheck", "/privileges", "/occupants", "/presence", "/wrap" }; + "/titlebar", "/vercheck", "/privileges", "/occupants", "/presence", "/wrap", "/winstidy" }; _cmd_show_filtered_help("Settings commands", filter, ARRAY_SIZE(filter)); } else if (strcmp(args[0], "navigation") == 0) { @@ -836,14 +874,14 @@ cmd_help(gchar **args, struct cmd_help_t help) } gboolean -cmd_about(gchar **args, struct cmd_help_t help) +cmd_about(ProfWin *window, gchar **args, struct cmd_help_t help) { ui_about(); return TRUE; } gboolean -cmd_prefs(gchar **args, struct cmd_help_t help) +cmd_prefs(ProfWin *window, gchar **args, struct cmd_help_t help) { if (args[0] == NULL) { cons_prefs(); @@ -876,6 +914,10 @@ cmd_prefs(gchar **args, struct cmd_help_t help) cons_show(""); cons_show_otr_prefs(); cons_show(""); + } else if (strcmp(args[0], "pgp") == 0) { + cons_show(""); + cons_show_pgp_prefs(); + cons_show(""); } else { cons_show("Usage: %s", help.usage); } @@ -884,7 +926,7 @@ cmd_prefs(gchar **args, struct cmd_help_t help) } gboolean -cmd_theme(gchar **args, struct cmd_help_t help) +cmd_theme(ProfWin *window, gchar **args, struct cmd_help_t help) { // list themes if (g_strcmp0(args[0], "list") == 0) { @@ -926,7 +968,7 @@ cmd_theme(gchar **args, struct cmd_help_t help) } static void -_who_room(gchar **args, struct cmd_help_t help) +_who_room(ProfWin *window, gchar **args, struct cmd_help_t help) { if ((g_strv_length(args) == 2) && args[1]) { cons_show("Argument group is not applicable to chat rooms."); @@ -954,7 +996,8 @@ _who_room(gchar **args, struct cmd_help_t help) return; } - ProfMucWin *mucwin = wins_get_current_muc(); + ProfMucWin *mucwin = (ProfMucWin*)window; + assert(mucwin->memcheck == PROFMUCWIN_MEMCHECK); // presence filter if (args[0] == NULL || @@ -1055,7 +1098,7 @@ _who_room(gchar **args, struct cmd_help_t help) } static void -_who_roster(gchar **args, struct cmd_help_t help) +_who_roster(ProfWin *window, gchar **args, struct cmd_help_t help) { char *presence = args[0]; @@ -1268,20 +1311,19 @@ _who_roster(gchar **args, struct cmd_help_t help) } gboolean -cmd_who(gchar **args, struct cmd_help_t help) +cmd_who(ProfWin *window, gchar **args, struct cmd_help_t help) { jabber_conn_status_t conn_status = jabber_get_connection_status(); - win_type_t win_type = ui_current_win_type(); if (conn_status != JABBER_CONNECTED) { cons_show("You are not currently connected."); - } else if (win_type == WIN_MUC) { - _who_room(args, help); + } else if (window->type == WIN_MUC) { + _who_room(window, args, help); } else { - _who_roster(args, help); + _who_roster(window, args, help); } - if (win_type != WIN_CONSOLE && win_type != WIN_MUC) { + if (window->type != WIN_CONSOLE && window->type != WIN_MUC) { ui_statusbar_new(1); } @@ -1289,13 +1331,12 @@ cmd_who(gchar **args, struct cmd_help_t help) } gboolean -cmd_msg(gchar **args, struct cmd_help_t help) +cmd_msg(ProfWin *window, gchar **args, struct cmd_help_t help) { char *usr = args[0]; char *msg = args[1]; jabber_conn_status_t conn_status = jabber_get_connection_status(); - win_type_t win_type = ui_current_win_type(); if (conn_status != JABBER_CONNECTED) { cons_show("You are not currently connected."); @@ -1303,8 +1344,9 @@ cmd_msg(gchar **args, struct cmd_help_t help) } // send private message when in MUC room - if (win_type == WIN_MUC) { - ProfMucWin *mucwin = wins_get_current_muc(); + if (window->type == WIN_MUC) { + ProfMucWin *mucwin = (ProfMucWin*)window; + assert(mucwin->memcheck == PROFMUCWIN_MEMCHECK); if (muc_roster_contains_nick(mucwin->roomjid, usr)) { GString *full_jid = g_string_new(mucwin->roomjid); g_string_append(full_jid, "/"); @@ -1356,7 +1398,7 @@ cmd_msg(gchar **args, struct cmd_help_t help) } gboolean -cmd_group(gchar **args, struct cmd_help_t help) +cmd_group(ProfWin *window, gchar **args, struct cmd_help_t help) { jabber_conn_status_t conn_status = jabber_get_connection_status(); @@ -1463,17 +1505,17 @@ cmd_group(gchar **args, struct cmd_help_t help) } gboolean -cmd_roster(gchar **args, struct cmd_help_t help) +cmd_roster(ProfWin *window, gchar **args, struct cmd_help_t help) { jabber_conn_status_t conn_status = jabber_get_connection_status(); - if (conn_status != JABBER_CONNECTED) { - cons_show("You are not currently connected."); - return TRUE; - } - // show roster if (args[0] == NULL) { + if (conn_status != JABBER_CONNECTED) { + cons_show("You are not currently connected."); + return TRUE; + } + GSList *list = roster_get_contacts(); cons_show_roster(list); g_slist_free(list); @@ -1481,6 +1523,11 @@ cmd_roster(gchar **args, struct cmd_help_t help) // show roster, only online contacts } else if(g_strcmp0(args[0], "online") == 0){ + if (conn_status != JABBER_CONNECTED) { + cons_show("You are not currently connected."); + return TRUE; + } + GSList *list = roster_get_contacts_online(); cons_show_roster(list); g_slist_free(list); @@ -1498,7 +1545,7 @@ cmd_roster(gchar **args, struct cmd_help_t help) if (res) { prefs_set_roster_size(intval); cons_show("Roster screen size set to: %d%%", intval); - if (prefs_get_boolean(PREF_ROSTER)) { + if (conn_status == JABBER_CONNECTED && prefs_get_boolean(PREF_ROSTER)) { wins_resize_all(); } return TRUE; @@ -1513,17 +1560,23 @@ cmd_roster(gchar **args, struct cmd_help_t help) if (args[1] == NULL) { cons_show("Roster enabled."); prefs_set_boolean(PREF_ROSTER, TRUE); - ui_show_roster(); + if (conn_status == JABBER_CONNECTED) { + ui_show_roster(); + } return TRUE; } else if (g_strcmp0(args[1], "offline") == 0) { cons_show("Roster offline enabled"); prefs_set_boolean(PREF_ROSTER_OFFLINE, TRUE); - rosterwin_roster(); + if (conn_status == JABBER_CONNECTED) { + rosterwin_roster(); + } return TRUE; } else if (g_strcmp0(args[1], "resource") == 0) { cons_show("Roster resource enabled"); prefs_set_boolean(PREF_ROSTER_RESOURCE, TRUE); - rosterwin_roster(); + if (conn_status == JABBER_CONNECTED) { + rosterwin_roster(); + } return TRUE; } else { cons_show("Usage: %s", help.usage); @@ -1533,17 +1586,23 @@ cmd_roster(gchar **args, struct cmd_help_t help) if (args[1] == NULL) { cons_show("Roster disabled."); prefs_set_boolean(PREF_ROSTER, FALSE); - ui_hide_roster(); + if (conn_status == JABBER_CONNECTED) { + ui_hide_roster(); + } return TRUE; } else if (g_strcmp0(args[1], "offline") == 0) { cons_show("Roster offline disabled"); prefs_set_boolean(PREF_ROSTER_OFFLINE, FALSE); - rosterwin_roster(); + if (conn_status == JABBER_CONNECTED) { + rosterwin_roster(); + } return TRUE; } else if (g_strcmp0(args[1], "resource") == 0) { cons_show("Roster resource disabled"); prefs_set_boolean(PREF_ROSTER_RESOURCE, FALSE); - rosterwin_roster(); + if (conn_status == JABBER_CONNECTED) { + rosterwin_roster(); + } return TRUE; } else { cons_show("Usage: %s", help.usage); @@ -1554,17 +1613,23 @@ cmd_roster(gchar **args, struct cmd_help_t help) if (g_strcmp0(args[1], "group") == 0) { cons_show("Grouping roster by roster group"); prefs_set_string(PREF_ROSTER_BY, "group"); - rosterwin_roster(); + if (conn_status == JABBER_CONNECTED) { + rosterwin_roster(); + } return TRUE; } else if (g_strcmp0(args[1], "presence") == 0) { cons_show("Grouping roster by presence"); prefs_set_string(PREF_ROSTER_BY, "presence"); - rosterwin_roster(); + if (conn_status == JABBER_CONNECTED) { + rosterwin_roster(); + } return TRUE; } else if (g_strcmp0(args[1], "none") == 0) { cons_show("Roster grouping disabled"); prefs_set_string(PREF_ROSTER_BY, "none"); - rosterwin_roster(); + if (conn_status == JABBER_CONNECTED) { + rosterwin_roster(); + } return TRUE; } else { cons_show("Usage: %s", help.usage); @@ -1572,6 +1637,10 @@ cmd_roster(gchar **args, struct cmd_help_t help) } // add contact } else if (strcmp(args[0], "add") == 0) { + if (conn_status != JABBER_CONNECTED) { + cons_show("You are not currently connected."); + return TRUE; + } char *jid = args[1]; if (jid == NULL) { cons_show("Usage: %s", help.usage); @@ -1583,6 +1652,10 @@ cmd_roster(gchar **args, struct cmd_help_t help) // remove contact } else if (strcmp(args[0], "remove") == 0) { + if (conn_status != JABBER_CONNECTED) { + cons_show("You are not currently connected."); + return TRUE; + } char *jid = args[1]; if (jid == NULL) { cons_show("Usage: %s", help.usage); @@ -1591,8 +1664,29 @@ cmd_roster(gchar **args, struct cmd_help_t help) } return TRUE; + } else if (strcmp(args[0], "empty") == 0) { + if (conn_status != JABBER_CONNECTED) { + cons_show("You are not currently connected."); + return TRUE; + } + + GSList *all = roster_get_contacts(); + GSList *curr = all; + while (curr) { + PContact contact = curr->data; + roster_send_remove(p_contact_barejid(contact)); + curr = g_slist_next(curr); + } + + g_slist_free(all); + return TRUE; + // change nickname } else if (strcmp(args[0], "nick") == 0) { + if (conn_status != JABBER_CONNECTED) { + cons_show("You are not currently connected."); + return TRUE; + } char *jid = args[1]; if (jid == NULL) { cons_show("Usage: %s", help.usage); @@ -1623,6 +1717,10 @@ cmd_roster(gchar **args, struct cmd_help_t help) // remove nickname } else if (strcmp(args[0], "clearnick") == 0) { + if (conn_status != JABBER_CONNECTED) { + cons_show("You are not currently connected."); + return TRUE; + } char *jid = args[1]; if (jid == NULL) { cons_show("Usage: %s", help.usage); @@ -1651,7 +1749,7 @@ cmd_roster(gchar **args, struct cmd_help_t help) } gboolean -cmd_resource(gchar **args, struct cmd_help_t help) +cmd_resource(ProfWin *window, gchar **args, struct cmd_help_t help) { char *cmd = args[0]; char *setting = NULL; @@ -1673,12 +1771,11 @@ cmd_resource(gchar **args, struct cmd_help_t help) } } - ProfWin *current = wins_get_current(); - if (current->type != WIN_CHAT) { + if (window->type != WIN_CHAT) { cons_show("Resource can only be changed in chat windows."); return TRUE; } - ProfChatWin *chatwin = (ProfChatWin*)current; + ProfChatWin *chatwin = (ProfChatWin*)window; if (g_strcmp0(cmd, "set") == 0) { char *resource = args[1]; @@ -1724,24 +1821,23 @@ cmd_resource(gchar **args, struct cmd_help_t help) } gboolean -cmd_status(gchar **args, struct cmd_help_t help) +cmd_status(ProfWin *window, gchar **args, struct cmd_help_t help) { char *usr = args[0]; jabber_conn_status_t conn_status = jabber_get_connection_status(); - win_type_t win_type = ui_current_win_type(); if (conn_status != JABBER_CONNECTED) { cons_show("You are not currently connected."); return TRUE; } - switch (win_type) + switch (window->type) { case WIN_MUC: if (usr) { - ProfMucWin *mucwin = wins_get_current_muc(); - ProfWin *window = (ProfWin*) mucwin; + ProfMucWin *mucwin = (ProfMucWin*)window; + assert(mucwin->memcheck == PROFMUCWIN_MEMCHECK); Occupant *occupant = muc_roster_item(mucwin->roomjid, usr); if (occupant) { win_show_occupant(window, occupant); @@ -1756,8 +1852,8 @@ cmd_status(gchar **args, struct cmd_help_t help) if (usr) { ui_current_print_line("No parameter required when in chat."); } else { - ProfChatWin *chatwin = wins_get_current_chat(); - ProfWin *window = (ProfWin*) chatwin; + ProfChatWin *chatwin = (ProfChatWin*)window; + assert(chatwin->memcheck == PROFCHATWIN_MEMCHECK); PContact pcontact = roster_get_contact(chatwin->barejid); if (pcontact) { win_show_contact(window, pcontact); @@ -1770,8 +1866,8 @@ cmd_status(gchar **args, struct cmd_help_t help) if (usr) { ui_current_print_line("No parameter required when in chat."); } else { - ProfPrivateWin *privatewin = wins_get_current_private(); - ProfWin *window = (ProfWin*) privatewin; + ProfPrivateWin *privatewin = (ProfPrivateWin*)window; + assert(privatewin->memcheck == PROFPRIVATEWIN_MEMCHECK); Jid *jid = jid_create(privatewin->fulljid); Occupant *occupant = muc_roster_item(jid->barejid, jid->resourcepart); if (occupant) { @@ -1801,12 +1897,11 @@ cmd_status(gchar **args, struct cmd_help_t help) } gboolean -cmd_info(gchar **args, struct cmd_help_t help) +cmd_info(ProfWin *window, gchar **args, struct cmd_help_t help) { char *usr = args[0]; jabber_conn_status_t conn_status = jabber_get_connection_status(); - win_type_t win_type = ui_current_win_type(); PContact pcontact = NULL; if (conn_status != JABBER_CONNECTED) { @@ -1814,20 +1909,21 @@ cmd_info(gchar **args, struct cmd_help_t help) return TRUE; } - switch (win_type) + switch (window->type) { case WIN_MUC: if (usr) { - ProfMucWin *mucwin = wins_get_current_muc(); + ProfMucWin *mucwin = (ProfMucWin*)window; + assert(mucwin->memcheck == PROFMUCWIN_MEMCHECK); Occupant *occupant = muc_roster_item(mucwin->roomjid, usr); if (occupant) { - ProfWin *current = wins_get_current(); - win_show_occupant_info(current, mucwin->roomjid, occupant); + win_show_occupant_info(window, mucwin->roomjid, occupant); } else { ui_current_print_line("No such occupant \"%s\" in room.", usr); } } else { - ProfMucWin *mucwin = wins_get_current_muc(); + ProfMucWin *mucwin = (ProfMucWin*)window; + assert(mucwin->memcheck == PROFMUCWIN_MEMCHECK); iq_room_info_request(mucwin->roomjid, TRUE); ui_show_room_info(mucwin); return TRUE; @@ -1837,8 +1933,8 @@ cmd_info(gchar **args, struct cmd_help_t help) if (usr) { ui_current_print_line("No parameter required when in chat."); } else { - ProfChatWin *chatwin = wins_get_current_chat(); - ProfWin *window = (ProfWin*) chatwin; + ProfChatWin *chatwin = (ProfChatWin*)window; + assert(chatwin->memcheck == PROFCHATWIN_MEMCHECK); PContact pcontact = roster_get_contact(chatwin->barejid); if (pcontact) { win_show_info(window, pcontact); @@ -1851,8 +1947,8 @@ cmd_info(gchar **args, struct cmd_help_t help) if (usr) { ui_current_print_line("No parameter required when in chat."); } else { - ProfPrivateWin *privatewin = wins_get_current_private(); - ProfWin *window = (ProfWin*) privatewin; + ProfPrivateWin *privatewin = (ProfPrivateWin*)window; + assert(privatewin->memcheck == PROFPRIVATEWIN_MEMCHECK); Jid *jid = jid_create(privatewin->fulljid); Occupant *occupant = muc_roster_item(jid->barejid, jid->resourcepart); if (occupant) { @@ -1887,10 +1983,9 @@ cmd_info(gchar **args, struct cmd_help_t help) } gboolean -cmd_caps(gchar **args, struct cmd_help_t help) +cmd_caps(ProfWin *window, gchar **args, struct cmd_help_t help) { jabber_conn_status_t conn_status = jabber_get_connection_status(); - win_type_t win_type = ui_current_win_type(); PContact pcontact = NULL; Occupant *occupant = NULL; @@ -1899,11 +1994,12 @@ cmd_caps(gchar **args, struct cmd_help_t help) return TRUE; } - switch (win_type) + switch (window->type) { case WIN_MUC: if (args[0]) { - ProfMucWin *mucwin = wins_get_current_muc(); + ProfMucWin *mucwin = (ProfMucWin*)window; + assert(mucwin->memcheck == PROFMUCWIN_MEMCHECK); occupant = muc_roster_item(mucwin->roomjid, args[0]); if (occupant) { Jid *jidp = jid_create_from_bare_and_resource(mucwin->roomjid, args[0]); @@ -1945,7 +2041,8 @@ cmd_caps(gchar **args, struct cmd_help_t help) if (args[0]) { cons_show("No parameter needed to /caps when in private chat."); } else { - ProfPrivateWin *privatewin = wins_get_current_private(); + ProfPrivateWin *privatewin = (ProfPrivateWin*)window; + assert(privatewin->memcheck == PROFPRIVATEWIN_MEMCHECK); Jid *jid = jid_create(privatewin->fulljid); if (jid) { occupant = muc_roster_item(jid->barejid, jid->resourcepart); @@ -1963,10 +2060,9 @@ cmd_caps(gchar **args, struct cmd_help_t help) gboolean -cmd_software(gchar **args, struct cmd_help_t help) +cmd_software(ProfWin *window, gchar **args, struct cmd_help_t help) { jabber_conn_status_t conn_status = jabber_get_connection_status(); - win_type_t win_type = ui_current_win_type(); Occupant *occupant = NULL; if (conn_status != JABBER_CONNECTED) { @@ -1974,11 +2070,12 @@ cmd_software(gchar **args, struct cmd_help_t help) return TRUE; } - switch (win_type) + switch (window->type) { case WIN_MUC: if (args[0]) { - ProfMucWin *mucwin = wins_get_current_muc(); + ProfMucWin *mucwin = (ProfMucWin*)window; + assert(mucwin->memcheck == PROFMUCWIN_MEMCHECK); occupant = muc_roster_item(mucwin->roomjid, args[0]); if (occupant) { Jid *jid = jid_create_from_bare_and_resource(mucwin->roomjid, args[0]); @@ -2010,7 +2107,8 @@ cmd_software(gchar **args, struct cmd_help_t help) if (args[0]) { cons_show("No parameter needed to /software when in private chat."); } else { - ProfPrivateWin *privatewin = wins_get_current_private(); + ProfPrivateWin *privatewin = (ProfPrivateWin*)window; + assert(privatewin->memcheck == PROFPRIVATEWIN_MEMCHECK); iq_send_software_version(privatewin->fulljid); } break; @@ -2022,7 +2120,7 @@ cmd_software(gchar **args, struct cmd_help_t help) } gboolean -cmd_join(gchar **args, struct cmd_help_t help) +cmd_join(ProfWin *window, gchar **args, struct cmd_help_t help) { jabber_conn_status_t conn_status = jabber_get_connection_status(); if (conn_status != JABBER_CONNECTED) { @@ -2086,6 +2184,7 @@ cmd_join(gchar **args, struct cmd_help_t help) if (!parsed) { cons_show("Usage: %s", help.usage); cons_show(""); + jid_destroy(room_arg); return TRUE; } @@ -2119,7 +2218,7 @@ cmd_join(gchar **args, struct cmd_help_t help) } gboolean -cmd_invite(gchar **args, struct cmd_help_t help) +cmd_invite(ProfWin *window, gchar **args, struct cmd_help_t help) { char *contact = args[0]; char *reason = args[1]; @@ -2130,7 +2229,7 @@ cmd_invite(gchar **args, struct cmd_help_t help) return TRUE; } - if (ui_current_win_type() != WIN_MUC) { + if (window->type != WIN_MUC) { cons_show("You must be in a chat room to send an invite."); return TRUE; } @@ -2140,7 +2239,8 @@ cmd_invite(gchar **args, struct cmd_help_t help) usr_jid = contact; } - ProfMucWin *mucwin = wins_get_current_muc(); + ProfMucWin *mucwin = (ProfMucWin*)window; + assert(mucwin->memcheck == PROFMUCWIN_MEMCHECK); message_send_invite(mucwin->roomjid, usr_jid, reason); if (reason) { cons_show("Room invite sent, contact: %s, room: %s, reason: \"%s\".", @@ -2154,7 +2254,7 @@ cmd_invite(gchar **args, struct cmd_help_t help) } gboolean -cmd_invites(gchar **args, struct cmd_help_t help) +cmd_invites(ProfWin *window, gchar **args, struct cmd_help_t help) { GSList *invites = muc_invites(); cons_show_room_invites(invites); @@ -2163,7 +2263,7 @@ cmd_invites(gchar **args, struct cmd_help_t help) } gboolean -cmd_decline(gchar **args, struct cmd_help_t help) +cmd_decline(ProfWin *window, gchar **args, struct cmd_help_t help) { if (!muc_invites_contain(args[0])) { cons_show("No such invite exists."); @@ -2176,14 +2276,13 @@ cmd_decline(gchar **args, struct cmd_help_t help) } gboolean -cmd_form_field(char *tag, gchar **args) +cmd_form_field(ProfWin *window, char *tag, gchar **args) { - ProfWin *current = wins_get_current(); - if (current->type != WIN_MUC_CONFIG) { + if (window->type != WIN_MUC_CONFIG) { return TRUE; } - ProfMucConfWin *confwin = (ProfMucConfWin*)current; + ProfMucConfWin *confwin = (ProfMucConfWin*)window; DataForm *form = confwin->form; if (form) { if (!form_tag_exists(form, tag)) { @@ -2204,11 +2303,11 @@ cmd_form_field(char *tag, gchar **args) if (g_strcmp0(value, "on") == 0) { form_set_value(form, tag, "1"); ui_current_print_line("Field updated..."); - ui_show_form_field(current, form, tag); + ui_show_form_field(window, form, tag); } else if (g_strcmp0(value, "off") == 0) { form_set_value(form, tag, "0"); ui_current_print_line("Field updated..."); - ui_show_form_field(current, form, tag); + ui_show_form_field(window, form, tag); } else { ui_current_print_line("Invalid command, usage:"); ui_show_form_field_help(confwin, tag); @@ -2227,7 +2326,7 @@ cmd_form_field(char *tag, gchar **args) } else { form_set_value(form, tag, value); ui_current_print_line("Field updated..."); - ui_show_form_field(current, form, tag); + ui_show_form_field(window, form, tag); } break; case FIELD_LIST_SINGLE: @@ -2239,7 +2338,7 @@ cmd_form_field(char *tag, gchar **args) } else { form_set_value(form, tag, value); ui_current_print_line("Field updated..."); - ui_show_form_field(current, form, tag); + ui_show_form_field(window, form, tag); } break; @@ -2263,7 +2362,7 @@ cmd_form_field(char *tag, gchar **args) if (g_strcmp0(cmd, "add") == 0) { form_add_value(form, tag, value); ui_current_print_line("Field updated..."); - ui_show_form_field(current, form, tag); + ui_show_form_field(window, form, tag); break; } if (g_strcmp0(args[0], "remove") == 0) { @@ -2291,7 +2390,7 @@ cmd_form_field(char *tag, gchar **args) removed = form_remove_text_multi_value(form, tag, index); if (removed) { ui_current_print_line("Field updated..."); - ui_show_form_field(current, form, tag); + ui_show_form_field(window, form, tag); } else { ui_current_print_line("Could not remove %s from %s", value, tag); } @@ -2320,7 +2419,7 @@ cmd_form_field(char *tag, gchar **args) added = form_add_unique_value(form, tag, value); if (added) { ui_current_print_line("Field updated..."); - ui_show_form_field(current, form, tag); + ui_show_form_field(window, form, tag); } else { ui_current_print_line("Value %s already selected for %s", value, tag); } @@ -2337,7 +2436,7 @@ cmd_form_field(char *tag, gchar **args) removed = form_remove_value(form, tag, value); if (removed) { ui_current_print_line("Field updated..."); - ui_show_form_field(current, form, tag); + ui_show_form_field(window, form, tag); } else { ui_current_print_line("Value %s is not currently set for %s", value, tag); } @@ -2369,7 +2468,7 @@ cmd_form_field(char *tag, gchar **args) added = form_add_unique_value(form, tag, value); if (added) { ui_current_print_line("Field updated..."); - ui_show_form_field(current, form, tag); + ui_show_form_field(window, form, tag); } else { ui_current_print_line("JID %s already exists in %s", value, tag); } @@ -2379,7 +2478,7 @@ cmd_form_field(char *tag, gchar **args) removed = form_remove_value(form, tag, value); if (removed) { ui_current_print_line("Field updated..."); - ui_show_form_field(current, form, tag); + ui_show_form_field(window, form, tag); } else { ui_current_print_line("Field %s does not contain %s", tag, value); } @@ -2395,7 +2494,7 @@ cmd_form_field(char *tag, gchar **args) } gboolean -cmd_form(gchar **args, struct cmd_help_t help) +cmd_form(ProfWin *window, gchar **args, struct cmd_help_t help) { jabber_conn_status_t conn_status = jabber_get_connection_status(); @@ -2404,8 +2503,7 @@ cmd_form(gchar **args, struct cmd_help_t help) return TRUE; } - win_type_t win_type = ui_current_win_type(); - if (win_type != WIN_MUC_CONFIG) { + if (window->type != WIN_MUC_CONFIG) { cons_show("Command '/form' does not apply to this window."); return TRUE; } @@ -2418,7 +2516,8 @@ cmd_form(gchar **args, struct cmd_help_t help) return TRUE; } - ProfMucConfWin *confwin = wins_get_current_muc_conf(); + ProfMucConfWin *confwin = (ProfMucConfWin*)window; + assert(confwin->memcheck == PROFCONFWIN_MEMCHECK); if (g_strcmp0(args[0], "show") == 0) { ui_show_form(confwin); @@ -2447,7 +2546,6 @@ cmd_form(gchar **args, struct cmd_help_t help) if (g_strcmp0(args[0], "submit") == 0) { iq_submit_room_config(confwin->roomjid, confwin->form); - } if (g_strcmp0(args[0], "cancel") == 0) { @@ -2470,7 +2568,7 @@ cmd_form(gchar **args, struct cmd_help_t help) } gboolean -cmd_kick(gchar **args, struct cmd_help_t help) +cmd_kick(ProfWin *window, gchar **args, struct cmd_help_t help) { jabber_conn_status_t conn_status = jabber_get_connection_status(); @@ -2479,13 +2577,13 @@ cmd_kick(gchar **args, struct cmd_help_t help) return TRUE; } - win_type_t win_type = ui_current_win_type(); - if (win_type != WIN_MUC) { + if (window->type != WIN_MUC) { cons_show("Command '/kick' only applies in chat rooms."); return TRUE; } - ProfMucWin *mucwin = wins_get_current_muc(); + ProfMucWin *mucwin = (ProfMucWin*)window; + assert(mucwin->memcheck == PROFMUCWIN_MEMCHECK); char *nick = args[0]; if (nick) { @@ -2503,7 +2601,7 @@ cmd_kick(gchar **args, struct cmd_help_t help) } gboolean -cmd_ban(gchar **args, struct cmd_help_t help) +cmd_ban(ProfWin *window, gchar **args, struct cmd_help_t help) { jabber_conn_status_t conn_status = jabber_get_connection_status(); @@ -2512,13 +2610,13 @@ cmd_ban(gchar **args, struct cmd_help_t help) return TRUE; } - win_type_t win_type = ui_current_win_type(); - if (win_type != WIN_MUC) { + if (window->type != WIN_MUC) { cons_show("Command '/ban' only applies in chat rooms."); return TRUE; } - ProfMucWin *mucwin = wins_get_current_muc(); + ProfMucWin *mucwin = (ProfMucWin*)window; + assert(mucwin->memcheck == PROFMUCWIN_MEMCHECK); char *jid = args[0]; if (jid) { @@ -2531,7 +2629,7 @@ cmd_ban(gchar **args, struct cmd_help_t help) } gboolean -cmd_subject(gchar **args, struct cmd_help_t help) +cmd_subject(ProfWin *window, gchar **args, struct cmd_help_t help) { jabber_conn_status_t conn_status = jabber_get_connection_status(); @@ -2540,14 +2638,13 @@ cmd_subject(gchar **args, struct cmd_help_t help) return TRUE; } - win_type_t win_type = ui_current_win_type(); - if (win_type != WIN_MUC) { + if (window->type != WIN_MUC) { cons_show("Command '/room' does not apply to this window."); return TRUE; } - ProfMucWin *mucwin = wins_get_current_muc(); - ProfWin *window = (ProfWin*) mucwin; + ProfMucWin *mucwin = (ProfMucWin*)window; + assert(mucwin->memcheck == PROFMUCWIN_MEMCHECK); if (args[0] == NULL) { char *subject = muc_subject(mucwin->roomjid); @@ -2579,7 +2676,7 @@ cmd_subject(gchar **args, struct cmd_help_t help) } gboolean -cmd_affiliation(gchar **args, struct cmd_help_t help) +cmd_affiliation(ProfWin *window, gchar **args, struct cmd_help_t help) { jabber_conn_status_t conn_status = jabber_get_connection_status(); @@ -2588,8 +2685,7 @@ cmd_affiliation(gchar **args, struct cmd_help_t help) return TRUE; } - win_type_t win_type = ui_current_win_type(); - if (win_type != WIN_MUC) { + if (window->type != WIN_MUC) { cons_show("Command '/affiliation' does not apply to this window."); return TRUE; } @@ -2611,7 +2707,8 @@ cmd_affiliation(gchar **args, struct cmd_help_t help) return TRUE; } - ProfMucWin *mucwin = wins_get_current_muc(); + ProfMucWin *mucwin = (ProfMucWin*)window; + assert(mucwin->memcheck == PROFMUCWIN_MEMCHECK); if (g_strcmp0(cmd, "list") == 0) { if (!affiliation) { @@ -2649,7 +2746,7 @@ cmd_affiliation(gchar **args, struct cmd_help_t help) } gboolean -cmd_role(gchar **args, struct cmd_help_t help) +cmd_role(ProfWin *window, gchar **args, struct cmd_help_t help) { jabber_conn_status_t conn_status = jabber_get_connection_status(); @@ -2658,8 +2755,7 @@ cmd_role(gchar **args, struct cmd_help_t help) return TRUE; } - win_type_t win_type = ui_current_win_type(); - if (win_type != WIN_MUC) { + if (window->type != WIN_MUC) { cons_show("Command '/role' does not apply to this window."); return TRUE; } @@ -2680,7 +2776,8 @@ cmd_role(gchar **args, struct cmd_help_t help) return TRUE; } - ProfMucWin *mucwin = wins_get_current_muc(); + ProfMucWin *mucwin = (ProfMucWin*)window; + assert(mucwin->memcheck == PROFMUCWIN_MEMCHECK); if (g_strcmp0(cmd, "list") == 0) { if (!role) { @@ -2717,7 +2814,7 @@ cmd_role(gchar **args, struct cmd_help_t help) } gboolean -cmd_room(gchar **args, struct cmd_help_t help) +cmd_room(ProfWin *window, gchar **args, struct cmd_help_t help) { jabber_conn_status_t conn_status = jabber_get_connection_status(); @@ -2726,8 +2823,7 @@ cmd_room(gchar **args, struct cmd_help_t help) return TRUE; } - win_type_t win_type = ui_current_win_type(); - if (win_type != WIN_MUC) { + if (window->type != WIN_MUC) { cons_show("Command '/room' does not apply to this window."); return TRUE; } @@ -2739,8 +2835,8 @@ cmd_room(gchar **args, struct cmd_help_t help) return TRUE; } - ProfMucWin *mucwin = wins_get_current_muc(); - ProfWin *window = (ProfWin*) mucwin; + ProfMucWin *mucwin = (ProfMucWin*)window; + assert(mucwin->memcheck == PROFMUCWIN_MEMCHECK); int num = wins_get_num(window); int ui_index = num; @@ -2781,7 +2877,7 @@ cmd_room(gchar **args, struct cmd_help_t help) } gboolean -cmd_occupants(gchar **args, struct cmd_help_t help) +cmd_occupants(ProfWin *window, gchar **args, struct cmd_help_t help) { jabber_conn_status_t conn_status = jabber_get_connection_status(); @@ -2836,13 +2932,13 @@ cmd_occupants(gchar **args, struct cmd_help_t help) } } - win_type_t win_type = ui_current_win_type(); - if (win_type != WIN_MUC) { + if (window->type != WIN_MUC) { cons_show("Cannot apply setting when not in chat room."); return TRUE; } - ProfMucWin *mucwin = wins_get_current_muc(); + ProfMucWin *mucwin = (ProfMucWin*)window; + assert(mucwin->memcheck == PROFMUCWIN_MEMCHECK); if (g_strcmp0(args[0], "show") == 0) { if (g_strcmp0(args[1], "jid") == 0) { @@ -2866,7 +2962,7 @@ cmd_occupants(gchar **args, struct cmd_help_t help) } gboolean -cmd_rooms(gchar **args, struct cmd_help_t help) +cmd_rooms(ProfWin *window, gchar **args, struct cmd_help_t help) { jabber_conn_status_t conn_status = jabber_get_connection_status(); @@ -2887,7 +2983,7 @@ cmd_rooms(gchar **args, struct cmd_help_t help) } gboolean -cmd_bookmark(gchar **args, struct cmd_help_t help) +cmd_bookmark(ProfWin *window, gchar **args, struct cmd_help_t help) { jabber_conn_status_t conn_status = jabber_get_connection_status(); @@ -2896,12 +2992,11 @@ cmd_bookmark(gchar **args, struct cmd_help_t help) return TRUE; } - win_type_t win_type = ui_current_win_type(); - gchar *cmd = args[0]; - if (win_type == WIN_MUC && cmd == NULL) { + if (window->type == WIN_MUC && cmd == NULL) { // default to current nickname, password, and autojoin "on" - ProfMucWin *mucwin = wins_get_current_muc(); + ProfMucWin *mucwin = (ProfMucWin*)window; + assert(mucwin->memcheck == PROFMUCWIN_MEMCHECK); char *nick = muc_nick(mucwin->roomjid); char *password = muc_password(mucwin->roomjid); gboolean added = bookmark_add(mucwin->roomjid, nick, password, "on"); @@ -2999,7 +3094,7 @@ cmd_bookmark(gchar **args, struct cmd_help_t help) } gboolean -cmd_disco(gchar **args, struct cmd_help_t help) +cmd_disco(ProfWin *window, gchar **args, struct cmd_help_t help) { jabber_conn_status_t conn_status = jabber_get_connection_status(); @@ -3029,7 +3124,7 @@ cmd_disco(gchar **args, struct cmd_help_t help) } gboolean -cmd_nick(gchar **args, struct cmd_help_t help) +cmd_nick(ProfWin *window, gchar **args, struct cmd_help_t help) { jabber_conn_status_t conn_status = jabber_get_connection_status(); @@ -3037,12 +3132,13 @@ cmd_nick(gchar **args, struct cmd_help_t help) cons_show("You are not currently connected."); return TRUE; } - if (ui_current_win_type() != WIN_MUC) { + if (window->type != WIN_MUC) { cons_show("You can only change your nickname in a chat room window."); return TRUE; } - ProfMucWin *mucwin = wins_get_current_muc(); + ProfMucWin *mucwin = (ProfMucWin*)window; + assert(mucwin->memcheck == PROFMUCWIN_MEMCHECK); char *nick = args[0]; presence_change_room_nick(mucwin->roomjid, nick); @@ -3050,7 +3146,7 @@ cmd_nick(gchar **args, struct cmd_help_t help) } gboolean -cmd_alias(gchar **args, struct cmd_help_t help) +cmd_alias(ProfWin *window, gchar **args, struct cmd_help_t help) { char *subcmd = args[0]; @@ -3122,43 +3218,45 @@ cmd_alias(gchar **args, struct cmd_help_t help) } gboolean -cmd_tiny(gchar **args, struct cmd_help_t help) +cmd_tiny(ProfWin *window, gchar **args, struct cmd_help_t help) { char *url = args[0]; - ProfWin *current = wins_get_current(); - if (current->type != WIN_CHAT && current->type != WIN_MUC && current->type != WIN_PRIVATE) { + if (window->type != WIN_CHAT && window->type != WIN_MUC && window->type != WIN_PRIVATE) { cons_show("/tiny can only be used in chat windows"); return TRUE; } if (!tinyurl_valid(url)) { - win_vprint(current, '-', NULL, 0, THEME_ERROR, "", "/tiny, badly formed URL: %s", url); + win_vprint(window, '-', NULL, 0, THEME_ERROR, "", "/tiny, badly formed URL: %s", url); return TRUE; } char *tiny = tinyurl_get(url); if (!tiny) { - win_print(current, '-', NULL, 0, THEME_ERROR, "", "Couldn't create tinyurl."); + win_print(window, '-', NULL, 0, THEME_ERROR, "", "Couldn't create tinyurl."); return TRUE; } - switch (current->type){ + switch (window->type){ case WIN_CHAT: { - ProfChatWin *chatwin = wins_get_current_chat(); + ProfChatWin *chatwin = (ProfChatWin*)window; + assert(chatwin->memcheck == PROFCHATWIN_MEMCHECK); cl_ev_send_msg(chatwin, tiny); break; } case WIN_PRIVATE: { - ProfPrivateWin *privatewin = wins_get_current_private(); + ProfPrivateWin *privatewin = (ProfPrivateWin*)window; + assert(privatewin->memcheck == PROFPRIVATEWIN_MEMCHECK); cl_ev_send_priv_msg(privatewin, tiny); break; } case WIN_MUC: { - ProfMucWin *mucwin = wins_get_current_muc(); + ProfMucWin *mucwin = (ProfMucWin*)window; + assert(mucwin->memcheck == PROFMUCWIN_MEMCHECK); cl_ev_send_muc_msg(mucwin, tiny); break; } @@ -3172,14 +3270,14 @@ cmd_tiny(gchar **args, struct cmd_help_t help) } gboolean -cmd_clear(gchar **args, struct cmd_help_t help) +cmd_clear(ProfWin *window, gchar **args, struct cmd_help_t help) { - ui_clear_current(); + ui_clear_win(window); return TRUE; } gboolean -cmd_close(gchar **args, struct cmd_help_t help) +cmd_close(ProfWin *window, gchar **args, struct cmd_help_t help) { jabber_conn_status_t conn_status = jabber_get_connection_status(); int index = 0; @@ -3221,8 +3319,8 @@ cmd_close(gchar **args, struct cmd_help_t help) return TRUE; } - ProfWin *window = wins_get_by_num(index); - if (!window) { + ProfWin *toclose = wins_get_by_num(index); + if (!toclose) { cons_show("Window is not open."); return TRUE; } @@ -3242,17 +3340,21 @@ cmd_close(gchar **args, struct cmd_help_t help) ui_close_win(index); cons_show("Closed window %d", index); + // Tidy up the window list. + if (prefs_get_boolean(PREF_WINS_AUTO_TIDY)) { + ui_tidy_wins(); + } + return TRUE; } gboolean -cmd_leave(gchar **args, struct cmd_help_t help) +cmd_leave(ProfWin *window, gchar **args, struct cmd_help_t help) { jabber_conn_status_t conn_status = jabber_get_connection_status(); - win_type_t win_type = ui_current_win_type(); int index = wins_get_current_num(); - if (win_type != WIN_MUC) { + if (window->type != WIN_MUC) { cons_show("You can only use the /leave command in a chat room."); cons_alert(); return TRUE; @@ -3270,7 +3372,7 @@ cmd_leave(gchar **args, struct cmd_help_t help) } gboolean -cmd_privileges(gchar **args, struct cmd_help_t help) +cmd_privileges(ProfWin *window, gchar **args, struct cmd_help_t help) { gboolean result = _cmd_set_boolean_preference(args[0], help, "MUC privileges", PREF_MUC_PRIVILEGES); @@ -3280,19 +3382,19 @@ cmd_privileges(gchar **args, struct cmd_help_t help) } gboolean -cmd_beep(gchar **args, struct cmd_help_t help) +cmd_beep(ProfWin *window, gchar **args, struct cmd_help_t help) { return _cmd_set_boolean_preference(args[0], help, "Sound", PREF_BEEP); } gboolean -cmd_presence(gchar **args, struct cmd_help_t help) +cmd_presence(ProfWin *window, gchar **args, struct cmd_help_t help) { return _cmd_set_boolean_preference(args[0], help, "Contact presence", PREF_PRESENCE); } gboolean -cmd_wrap(gchar **args, struct cmd_help_t help) +cmd_wrap(ProfWin *window, gchar **args, struct cmd_help_t help) { gboolean result = _cmd_set_boolean_preference(args[0], help, "Word wrap", PREF_WRAP); @@ -3302,7 +3404,7 @@ cmd_wrap(gchar **args, struct cmd_help_t help) } gboolean -cmd_time(gchar **args, struct cmd_help_t help) +cmd_time(ProfWin *window, gchar **args, struct cmd_help_t help) { if (g_strcmp0(args[0], "statusbar") == 0) { if (args[1] == NULL) { @@ -3347,7 +3449,7 @@ cmd_time(gchar **args, struct cmd_help_t help) } gboolean -cmd_states(gchar **args, struct cmd_help_t help) +cmd_states(ProfWin *window, gchar **args, struct cmd_help_t help) { gboolean result = _cmd_set_boolean_preference(args[0], help, "Sending chat states", PREF_STATES); @@ -3362,7 +3464,7 @@ cmd_states(gchar **args, struct cmd_help_t help) } gboolean -cmd_titlebar(gchar **args, struct cmd_help_t help) +cmd_titlebar(ProfWin *window, gchar **args, struct cmd_help_t help) { if (g_strcmp0(args[0], "show") != 0 && g_strcmp0(args[0], "goodbye") != 0) { cons_show("Usage: %s", help.usage); @@ -3379,7 +3481,7 @@ cmd_titlebar(gchar **args, struct cmd_help_t help) } gboolean -cmd_outtype(gchar **args, struct cmd_help_t help) +cmd_outtype(ProfWin *window, gchar **args, struct cmd_help_t help) { gboolean result = _cmd_set_boolean_preference(args[0], help, "Sending typing notifications", PREF_OUTTYPE); @@ -3393,7 +3495,7 @@ cmd_outtype(gchar **args, struct cmd_help_t help) } gboolean -cmd_gone(gchar **args, struct cmd_help_t help) +cmd_gone(ProfWin *window, gchar **args, struct cmd_help_t help) { char *value = args[0]; @@ -3417,7 +3519,7 @@ cmd_gone(gchar **args, struct cmd_help_t help) gboolean -cmd_notify(gchar **args, struct cmd_help_t help) +cmd_notify(ProfWin *window, gchar **args, struct cmd_help_t help) { char *kind = args[0]; @@ -3560,7 +3662,7 @@ cmd_notify(gchar **args, struct cmd_help_t help) } gboolean -cmd_inpblock(gchar **args, struct cmd_help_t help) +cmd_inpblock(ProfWin *window, gchar **args, struct cmd_help_t help) { char *subcmd = args[0]; char *value = args[1]; @@ -3606,7 +3708,7 @@ cmd_inpblock(gchar **args, struct cmd_help_t help) } gboolean -cmd_log(gchar **args, struct cmd_help_t help) +cmd_log(ProfWin *window, gchar **args, struct cmd_help_t help) { char *subcmd = args[0]; char *value = args[1]; @@ -3662,7 +3764,7 @@ cmd_log(gchar **args, struct cmd_help_t help) } gboolean -cmd_reconnect(gchar **args, struct cmd_help_t help) +cmd_reconnect(ProfWin *window, gchar **args, struct cmd_help_t help) { char *value = args[0]; @@ -3686,7 +3788,7 @@ cmd_reconnect(gchar **args, struct cmd_help_t help) } gboolean -cmd_autoping(gchar **args, struct cmd_help_t help) +cmd_autoping(ProfWin *window, gchar **args, struct cmd_help_t help) { char *value = args[0]; @@ -3711,7 +3813,7 @@ cmd_autoping(gchar **args, struct cmd_help_t help) } gboolean -cmd_ping(gchar **args, struct cmd_help_t help) +cmd_ping(ProfWin *window, gchar **args, struct cmd_help_t help) { jabber_conn_status_t conn_status = jabber_get_connection_status(); @@ -3731,7 +3833,7 @@ cmd_ping(gchar **args, struct cmd_help_t help) } gboolean -cmd_autoaway(gchar **args, struct cmd_help_t help) +cmd_autoaway(ProfWin *window, gchar **args, struct cmd_help_t help) { char *setting = args[0]; char *value = args[1]; @@ -3790,7 +3892,7 @@ cmd_autoaway(gchar **args, struct cmd_help_t help) } gboolean -cmd_priority(gchar **args, struct cmd_help_t help) +cmd_priority(ProfWin *window, gchar **args, struct cmd_help_t help) { jabber_conn_status_t conn_status = jabber_get_connection_status(); @@ -3818,7 +3920,7 @@ cmd_priority(gchar **args, struct cmd_help_t help) } gboolean -cmd_statuses(gchar **args, struct cmd_help_t help) +cmd_statuses(ProfWin *window, gchar **args, struct cmd_help_t help) { if (strcmp(args[0], "console") != 0 && strcmp(args[0], "chat") != 0 && @@ -3871,7 +3973,7 @@ cmd_statuses(gchar **args, struct cmd_help_t help) } gboolean -cmd_vercheck(gchar **args, struct cmd_help_t help) +cmd_vercheck(ProfWin *window, gchar **args, struct cmd_help_t help) { int num_args = g_strv_length(args); @@ -3885,7 +3987,7 @@ cmd_vercheck(gchar **args, struct cmd_help_t help) } gboolean -cmd_xmlconsole(gchar **args, struct cmd_help_t help) +cmd_xmlconsole(ProfWin *window, gchar **args, struct cmd_help_t help) { if (!ui_xmlconsole_exists()) { ui_create_xmlconsole_win(); @@ -3897,28 +3999,28 @@ cmd_xmlconsole(gchar **args, struct cmd_help_t help) } gboolean -cmd_flash(gchar **args, struct cmd_help_t help) +cmd_flash(ProfWin *window, gchar **args, struct cmd_help_t help) { return _cmd_set_boolean_preference(args[0], help, "Screen flash", PREF_FLASH); } gboolean -cmd_intype(gchar **args, struct cmd_help_t help) +cmd_intype(ProfWin *window, gchar **args, struct cmd_help_t help) { return _cmd_set_boolean_preference(args[0], help, "Show contact typing", PREF_INTYPE); } gboolean -cmd_splash(gchar **args, struct cmd_help_t help) +cmd_splash(ProfWin *window, gchar **args, struct cmd_help_t help) { return _cmd_set_boolean_preference(args[0], help, "Splash screen", PREF_SPLASH); } gboolean -cmd_autoconnect(gchar **args, struct cmd_help_t help) +cmd_autoconnect(ProfWin *window, gchar **args, struct cmd_help_t help) { if (strcmp(args[0], "off") == 0) { prefs_set_string(PREF_CONNECT_ACCOUNT, NULL); @@ -3933,7 +4035,7 @@ cmd_autoconnect(gchar **args, struct cmd_help_t help) } gboolean -cmd_chlog(gchar **args, struct cmd_help_t help) +cmd_chlog(ProfWin *window, gchar **args, struct cmd_help_t help) { gboolean result = _cmd_set_boolean_preference(args[0], help, "Chat logging", PREF_CHLOG); @@ -3947,7 +4049,7 @@ cmd_chlog(gchar **args, struct cmd_help_t help) } gboolean -cmd_grlog(gchar **args, struct cmd_help_t help) +cmd_grlog(ProfWin *window, gchar **args, struct cmd_help_t help) { gboolean result = _cmd_set_boolean_preference(args[0], help, "Groupchat logging", PREF_GRLOG); @@ -3956,14 +4058,14 @@ cmd_grlog(gchar **args, struct cmd_help_t help) } gboolean -cmd_mouse(gchar **args, struct cmd_help_t help) +cmd_mouse(ProfWin *window, gchar **args, struct cmd_help_t help) { return _cmd_set_boolean_preference(args[0], help, "Mouse handling", PREF_MOUSE); } gboolean -cmd_history(gchar **args, struct cmd_help_t help) +cmd_history(ProfWin *window, gchar **args, struct cmd_help_t help) { gboolean result = _cmd_set_boolean_preference(args[0], help, "Chat history", PREF_HISTORY); @@ -3977,7 +4079,7 @@ cmd_history(gchar **args, struct cmd_help_t help) } gboolean -cmd_carbons(gchar **args, struct cmd_help_t help) +cmd_carbons(ProfWin *window, gchar **args, struct cmd_help_t help) { gboolean result = _cmd_set_boolean_preference(args[0], help, "Message carbons preference", PREF_CARBONS); @@ -3998,7 +4100,7 @@ cmd_carbons(gchar **args, struct cmd_help_t help) } gboolean -cmd_receipts(gchar **args, struct cmd_help_t help) +cmd_receipts(ProfWin *window, gchar **args, struct cmd_help_t help) { if (g_strcmp0(args[0], "send") == 0) { return _cmd_set_boolean_preference(args[1], help, @@ -4013,42 +4115,254 @@ cmd_receipts(gchar **args, struct cmd_help_t help) } gboolean -cmd_away(gchar **args, struct cmd_help_t help) +cmd_away(ProfWin *window, gchar **args, struct cmd_help_t help) { _update_presence(RESOURCE_AWAY, "away", args); return TRUE; } gboolean -cmd_online(gchar **args, struct cmd_help_t help) +cmd_online(ProfWin *window, gchar **args, struct cmd_help_t help) { _update_presence(RESOURCE_ONLINE, "online", args); return TRUE; } gboolean -cmd_dnd(gchar **args, struct cmd_help_t help) +cmd_dnd(ProfWin *window, gchar **args, struct cmd_help_t help) { _update_presence(RESOURCE_DND, "dnd", args); return TRUE; } gboolean -cmd_chat(gchar **args, struct cmd_help_t help) +cmd_chat(ProfWin *window, gchar **args, struct cmd_help_t help) { _update_presence(RESOURCE_CHAT, "chat", args); return TRUE; } gboolean -cmd_xa(gchar **args, struct cmd_help_t help) +cmd_xa(ProfWin *window, gchar **args, struct cmd_help_t help) { _update_presence(RESOURCE_XA, "xa", args); return TRUE; } gboolean -cmd_otr(gchar **args, struct cmd_help_t help) +cmd_pgp(ProfWin *window, gchar **args, struct cmd_help_t help) +{ +#ifdef HAVE_LIBGPGME + if (args[0] == NULL) { + cons_show("Usage: %s", help.usage); + return TRUE; + } + + if (g_strcmp0(args[0], "log") == 0) { + char *choice = args[1]; + if (g_strcmp0(choice, "on") == 0) { + prefs_set_string(PREF_PGP_LOG, "on"); + cons_show("PGP messages will be logged as plaintext."); + if (!prefs_get_boolean(PREF_CHLOG)) { + cons_show("Chat logging is currently disabled, use '/chlog on' to enable."); + } + } else if (g_strcmp0(choice, "off") == 0) { + prefs_set_string(PREF_PGP_LOG, "off"); + cons_show("PGP message logging disabled."); + } else if (g_strcmp0(choice, "redact") == 0) { + prefs_set_string(PREF_PGP_LOG, "redact"); + cons_show("PGP messages will be logged as '[redacted]'."); + if (!prefs_get_boolean(PREF_CHLOG)) { + cons_show("Chat logging is currently disabled, use '/chlog on' to enable."); + } + } else { + cons_show("Usage: %s", help.usage); + } + return TRUE; + } + + if (g_strcmp0(args[0], "keys") == 0) { + GSList *keys = p_gpg_list_keys(); + if (!keys) { + cons_show("No keys found"); + return TRUE; + } + + cons_show("PGP keys:"); + GSList *curr = keys; + while (curr) { + ProfPGPKey *key = curr->data; + cons_show(" %s", key->name); + cons_show(" ID : %s", key->id); + cons_show(" Fingerprint : %s", key->fp); + curr = g_slist_next(curr); + } + g_slist_free_full(keys, (GDestroyNotify)p_gpg_free_key); + return TRUE; + } + + if (g_strcmp0(args[0], "setkey") == 0) { + jabber_conn_status_t conn_status = jabber_get_connection_status(); + if (conn_status != JABBER_CONNECTED) { + cons_show("You are not currently connected."); + return TRUE; + } + + char *jid = args[1]; + if (!args[1]) { + cons_show("Usage: %s", help.usage); + return TRUE; + } + + char *keyid = args[2]; + if (!args[2]) { + cons_show("Usage: %s", help.usage); + return TRUE; + } + + gboolean res = p_gpg_addkey(jid, keyid); + if (!res) { + cons_show("Key ID not found."); + } else { + cons_show("Key %s set for %s.", keyid, jid); + } + + return TRUE; + } + + if (g_strcmp0(args[0], "fps") == 0) { + jabber_conn_status_t conn_status = jabber_get_connection_status(); + if (conn_status != JABBER_CONNECTED) { + cons_show("You are not currently connected."); + return TRUE; + } + GHashTable *fingerprints = p_gpg_fingerprints(); + GList *jids = g_hash_table_get_keys(fingerprints); + if (!jids) { + cons_show("No PGP fingerprints available."); + return TRUE; + } + + cons_show("Known PGP fingerprints:"); + GList *curr = jids; + while (curr) { + char *jid = curr->data; + char *fingerprint = g_hash_table_lookup(fingerprints, jid); + cons_show(" %s: %s", jid, fingerprint); + curr = g_list_next(curr); + } + g_list_free(jids); + return TRUE; + } + + if (g_strcmp0(args[0], "libver") == 0) { + const char *libver = p_gpg_libver(); + if (!libver) { + cons_show("Could not get libgpgme version"); + return TRUE; + } + + GString *fullstr = g_string_new("Using libgpgme version "); + g_string_append(fullstr, libver); + cons_show("%s", fullstr->str); + g_string_free(fullstr, TRUE); + + return TRUE; + } + + if (g_strcmp0(args[0], "start") == 0) { + jabber_conn_status_t conn_status = jabber_get_connection_status(); + if (conn_status != JABBER_CONNECTED) { + cons_show("You must be connected to start PGP encrpytion."); + return TRUE; + } + + if (window->type != WIN_CHAT && args[1] == NULL) { + cons_show("You must be in a regular chat window to start PGP encrpytion."); + return TRUE; + } + + ProfChatWin *chatwin = NULL; + + if (args[1]) { + char *contact = args[1]; + char *barejid = roster_barejid_from_name(contact); + if (barejid == NULL) { + barejid = contact; + } + + chatwin = wins_get_chat(barejid); + if (!chatwin) { + chatwin = ui_ev_new_chat_win(barejid); + } + ui_ev_focus_win((ProfWin*)chatwin); + } else { + chatwin = (ProfChatWin*)window; + assert(chatwin->memcheck == PROFCHATWIN_MEMCHECK); + } + + if (chatwin->enc_mode == PROF_ENC_OTR) { + ui_current_print_formatted_line('!', 0, "You must end the OTR session to start PGP encryption."); + return TRUE; + } + + if (chatwin->enc_mode == PROF_ENC_PGP) { + ui_current_print_formatted_line('!', 0, "You have already started PGP encryption."); + return TRUE; + } + + ProfAccount *account = accounts_get_account(jabber_get_account_name()); + if (!account->pgp_keyid) { + ui_current_print_formatted_line('!', 0, "You must specify a PGP key ID for this account to start PGP encryption."); + account_free(account); + return TRUE; + } + account_free(account); + + if (!p_gpg_available(chatwin->barejid)) { + ui_current_print_formatted_line('!', 0, "No PGP key found for %s.", chatwin->barejid); + return TRUE; + } + + chatwin->enc_mode = PROF_ENC_PGP; + ui_current_print_formatted_line('!', 0, "PGP encyption enabled."); + return TRUE; + } + + if (g_strcmp0(args[0], "end") == 0) { + jabber_conn_status_t conn_status = jabber_get_connection_status(); + if (conn_status != JABBER_CONNECTED) { + cons_show("You are not currently connected."); + return TRUE; + } + + if (window->type != WIN_CHAT) { + cons_show("You must be in a regular chat window to end PGP encrpytion."); + return TRUE; + } + + ProfChatWin *chatwin = (ProfChatWin*)window; + if (chatwin->enc_mode != PROF_ENC_PGP) { + ui_current_print_formatted_line('!', 0, "PGP encryption is not currently enabled."); + return TRUE; + } + + chatwin->enc_mode = PROF_ENC_NONE; + ui_current_print_formatted_line('!', 0, "PGP encyption disabled."); + return TRUE; + } + + cons_show("Usage: %s", help.usage); + return TRUE; +#else + cons_show("This version of Profanity has not been built with PGP support enabled"); + return TRUE; +#endif + +} + +gboolean +cmd_otr(ProfWin *window, gchar **args, struct cmd_help_t help) { #ifdef HAVE_LIBOTR if (args[0] == NULL) { @@ -4078,11 +4392,6 @@ cmd_otr(gchar **args, struct cmd_help_t help) } return TRUE; - } else if (strcmp(args[0], "warn") == 0) { - gboolean result = _cmd_set_boolean_preference(args[1], help, - "OTR warning message", PREF_OTR_WARN); - return result; - } else if (strcmp(args[0], "libver") == 0) { char *version = otr_libotr_version(); cons_show("Using libotr version %s", version); @@ -4138,29 +4447,34 @@ cmd_otr(gchar **args, struct cmd_help_t help) } else if (strcmp(args[0], "myfp") == 0) { if (!otr_key_loaded()) { ui_current_print_formatted_line('!', 0, "You have not generated or loaded a private key, use '/otr gen'"); - } else { - char *fingerprint = otr_get_my_fingerprint(); - ui_current_print_formatted_line('!', 0, "Your OTR fingerprint: %s", fingerprint); - free(fingerprint); + return TRUE; } + + char *fingerprint = otr_get_my_fingerprint(); + ui_current_print_formatted_line('!', 0, "Your OTR fingerprint: %s", fingerprint); + free(fingerprint); return TRUE; } else if (strcmp(args[0], "theirfp") == 0) { - win_type_t win_type = ui_current_win_type(); - - if (win_type != WIN_CHAT) { + if (window->type != WIN_CHAT) { ui_current_print_line("You must be in a regular chat window to view a recipient's fingerprint."); - } else if (!ui_current_win_is_otr()) { + return TRUE; + } + + ProfChatWin *chatwin = (ProfChatWin*)window; + assert(chatwin->memcheck == PROFCHATWIN_MEMCHECK); + if (chatwin->enc_mode != PROF_ENC_OTR) { ui_current_print_formatted_line('!', 0, "You are not currently in an OTR session."); - } else { - ProfChatWin *chatwin = ui_get_current_chat(); - char *fingerprint = otr_get_their_fingerprint(chatwin->barejid); - ui_current_print_formatted_line('!', 0, "%s's OTR fingerprint: %s", chatwin->barejid, fingerprint); - free(fingerprint); + return TRUE; } + + char *fingerprint = otr_get_their_fingerprint(chatwin->barejid); + ui_current_print_formatted_line('!', 0, "%s's OTR fingerprint: %s", chatwin->barejid, fingerprint); + free(fingerprint); return TRUE; } else if (strcmp(args[0], "start") == 0) { + // recipient supplied if (args[1]) { char *contact = args[1]; char *barejid = roster_barejid_from_name(contact); @@ -4174,131 +4488,175 @@ cmd_otr(gchar **args, struct cmd_help_t help) } ui_ev_focus_win((ProfWin*)chatwin); - if (ui_current_win_is_otr()) { + if (chatwin->enc_mode == PROF_ENC_PGP) { + ui_current_print_formatted_line('!', 0, "You must disable PGP encryption before starting an OTR session."); + return TRUE; + } + + if (chatwin->enc_mode == PROF_ENC_OTR) { ui_current_print_formatted_line('!', 0, "You are already in an OTR session."); - } else { - if (!otr_key_loaded()) { - ui_current_print_formatted_line('!', 0, "You have not generated or loaded a private key, use '/otr gen'"); - } else if (!otr_is_secure(barejid)) { - char *otr_query_message = otr_start_query(); - message_send_chat_encrypted(barejid, otr_query_message); - } else { - ui_gone_secure(barejid, otr_is_trusted(barejid)); - } + return TRUE; } - } else { - win_type_t win_type = ui_current_win_type(); - if (win_type != WIN_CHAT) { + if (!otr_key_loaded()) { + ui_current_print_formatted_line('!', 0, "You have not generated or loaded a private key, use '/otr gen'"); + return TRUE; + } + + if (!otr_is_secure(barejid)) { + char *otr_query_message = otr_start_query(); + message_send_chat_otr(barejid, otr_query_message); + return TRUE; + } + + ui_gone_secure(barejid, otr_is_trusted(barejid)); + return TRUE; + + // no recipient, use current chat + } else { + if (window->type != WIN_CHAT) { ui_current_print_line("You must be in a regular chat window to start an OTR session."); - } else if (ui_current_win_is_otr()) { + return TRUE; + } + + ProfChatWin *chatwin = (ProfChatWin*)window; + assert(chatwin->memcheck == PROFCHATWIN_MEMCHECK); + if (chatwin->enc_mode == PROF_ENC_PGP) { + ui_current_print_formatted_line('!', 0, "You must disable PGP encryption before starting an OTR session."); + return TRUE; + } + + if (chatwin->enc_mode == PROF_ENC_OTR) { ui_current_print_formatted_line('!', 0, "You are already in an OTR session."); - } else { - if (!otr_key_loaded()) { - ui_current_print_formatted_line('!', 0, "You have not generated or loaded a private key, use '/otr gen'"); - } else { - ProfChatWin *chatwin = ui_get_current_chat(); - char *otr_query_message = otr_start_query(); - message_send_chat_encrypted(chatwin->barejid, otr_query_message); - } + return TRUE; } + + if (!otr_key_loaded()) { + ui_current_print_formatted_line('!', 0, "You have not generated or loaded a private key, use '/otr gen'"); + return TRUE; + } + + char *otr_query_message = otr_start_query(); + message_send_chat_otr(chatwin->barejid, otr_query_message); + return TRUE; } - return TRUE; } else if (strcmp(args[0], "end") == 0) { - win_type_t win_type = ui_current_win_type(); - - if (win_type != WIN_CHAT) { + if (window->type != WIN_CHAT) { ui_current_print_line("You must be in a regular chat window to use OTR."); - } else if (!ui_current_win_is_otr()) { + return TRUE; + } + + ProfChatWin *chatwin = (ProfChatWin*)window; + assert(chatwin->memcheck == PROFCHATWIN_MEMCHECK); + if (chatwin->enc_mode != PROF_ENC_OTR) { ui_current_print_formatted_line('!', 0, "You are not currently in an OTR session."); - } else { - ProfChatWin *chatwin = wins_get_current_chat(); - ui_gone_insecure(chatwin->barejid); - otr_end_session(chatwin->barejid); + return TRUE; } + + ui_gone_insecure(chatwin->barejid); + otr_end_session(chatwin->barejid); return TRUE; } else if (strcmp(args[0], "trust") == 0) { - win_type_t win_type = ui_current_win_type(); - - if (win_type != WIN_CHAT) { + if (window->type != WIN_CHAT) { ui_current_print_line("You must be in an OTR session to trust a recipient."); - } else if (!ui_current_win_is_otr()) { + return TRUE; + } + + ProfChatWin *chatwin = (ProfChatWin*)window; + assert(chatwin->memcheck == PROFCHATWIN_MEMCHECK); + if (chatwin->enc_mode != PROF_ENC_OTR) { ui_current_print_formatted_line('!', 0, "You are not currently in an OTR session."); - } else { - ProfChatWin *chatwin = wins_get_current_chat(); - ui_trust(chatwin->barejid); - otr_trust(chatwin->barejid); + return TRUE; } + + ui_trust(chatwin->barejid); + otr_trust(chatwin->barejid); return TRUE; } else if (strcmp(args[0], "untrust") == 0) { - win_type_t win_type = ui_current_win_type(); - - if (win_type != WIN_CHAT) { + if (window->type != WIN_CHAT) { ui_current_print_line("You must be in an OTR session to untrust a recipient."); - } else if (!ui_current_win_is_otr()) { + return TRUE; + } + + ProfChatWin *chatwin = (ProfChatWin*)window; + assert(chatwin->memcheck == PROFCHATWIN_MEMCHECK); + if (chatwin->enc_mode != PROF_ENC_OTR) { ui_current_print_formatted_line('!', 0, "You are not currently in an OTR session."); - } else { - ProfChatWin *chatwin = wins_get_current_chat(); - ui_untrust(chatwin->barejid); - otr_untrust(chatwin->barejid); + return TRUE; } + + ui_untrust(chatwin->barejid); + otr_untrust(chatwin->barejid); return TRUE; } else if (strcmp(args[0], "secret") == 0) { - win_type_t win_type = ui_current_win_type(); - if (win_type != WIN_CHAT) { + if (window->type != WIN_CHAT) { ui_current_print_line("You must be in an OTR session to trust a recipient."); - } else if (!ui_current_win_is_otr()) { + return TRUE; + } + + ProfChatWin *chatwin = (ProfChatWin*)window; + assert(chatwin->memcheck == PROFCHATWIN_MEMCHECK); + if (chatwin->enc_mode != PROF_ENC_OTR) { ui_current_print_formatted_line('!', 0, "You are not currently in an OTR session."); - } else { - char *secret = args[1]; - if (secret == NULL) { - cons_show("Usage: %s", help.usage); - } else { - ProfChatWin *chatwin = wins_get_current_chat(); - otr_smp_secret(chatwin->barejid, secret); - } + return TRUE; + } + + char *secret = args[1]; + if (secret == NULL) { + cons_show("Usage: %s", help.usage); + return TRUE; } + + otr_smp_secret(chatwin->barejid, secret); return TRUE; } else if (strcmp(args[0], "question") == 0) { char *question = args[1]; char *answer = args[2]; - if (question == NULL || answer == NULL) { cons_show("Usage: %s", help.usage); return TRUE; - } else { - win_type_t win_type = ui_current_win_type(); - if (win_type != WIN_CHAT) { - ui_current_print_line("You must be in an OTR session to trust a recipient."); - } else if (!ui_current_win_is_otr()) { - ui_current_print_formatted_line('!', 0, "You are not currently in an OTR session."); - } else { - ProfChatWin *chatwin = wins_get_current_chat(); - otr_smp_question(chatwin->barejid, question, answer); - } + } + + if (window->type != WIN_CHAT) { + ui_current_print_line("You must be in an OTR session to trust a recipient."); + return TRUE; + } + + ProfChatWin *chatwin = (ProfChatWin*)window; + assert(chatwin->memcheck == PROFCHATWIN_MEMCHECK); + if (chatwin->enc_mode != PROF_ENC_OTR) { + ui_current_print_formatted_line('!', 0, "You are not currently in an OTR session."); return TRUE; } + otr_smp_question(chatwin->barejid, question, answer); + return TRUE; + } else if (strcmp(args[0], "answer") == 0) { - win_type_t win_type = ui_current_win_type(); - if (win_type != WIN_CHAT) { + if (window->type != WIN_CHAT) { ui_current_print_line("You must be in an OTR session to trust a recipient."); - } else if (!ui_current_win_is_otr()) { + return TRUE; + } + + ProfChatWin *chatwin = (ProfChatWin*)window; + assert(chatwin->memcheck == PROFCHATWIN_MEMCHECK); + if (chatwin->enc_mode != PROF_ENC_OTR) { ui_current_print_formatted_line('!', 0, "You are not currently in an OTR session."); - } else { - char *answer = args[1]; - if (answer == NULL) { - cons_show("Usage: %s", help.usage); - } else { - ProfChatWin *chatwin = wins_get_current_chat(); - otr_smp_answer(chatwin->barejid, answer); - } + return TRUE; } + + char *answer = args[1]; + if (answer == NULL) { + cons_show("Usage: %s", help.usage); + return TRUE; + } + + otr_smp_answer(chatwin->barejid, answer); return TRUE; } else { @@ -4311,6 +4669,12 @@ cmd_otr(gchar **args, struct cmd_help_t help) #endif } +gboolean +cmd_encwarn(ProfWin *window, gchar **args, struct cmd_help_t help) +{ + return _cmd_set_boolean_preference(args[0], help, "Encryption warning message", PREF_ENC_WARN); +} + // helper function for status change commands static void _update_presence(const resource_presence_t resource_presence, diff --git a/src/command/commands.h b/src/command/commands.h index 7b7e7c93..6f2bada2 100644 --- a/src/command/commands.h +++ b/src/command/commands.h @@ -35,6 +35,8 @@ #ifndef COMMANDS_H #define COMMANDS_H +#include "ui/ui.h" + // Command help strings typedef struct cmd_help_t { const gchar *usage; @@ -54,7 +56,7 @@ typedef struct cmd_help_t { */ typedef struct cmd_t { gchar *cmd; - gboolean (*func)(gchar **args, struct cmd_help_t help); + gboolean (*func)(ProfWin *window, gchar **args, struct cmd_help_t help); gchar** (*parser)(const char * const inp, int min, int max, gboolean *result); int min_args; int max_args; @@ -62,87 +64,90 @@ typedef struct cmd_t { CommandHelp help; } Command; -gboolean cmd_execute_alias(const char * const inp, gboolean *ran); -gboolean cmd_execute_default(const char * inp); +gboolean cmd_execute_alias(ProfWin *window, const char * const inp, gboolean *ran); +gboolean cmd_execute_default(ProfWin *window, const char * inp); -gboolean cmd_about(gchar **args, struct cmd_help_t help); -gboolean cmd_account(gchar **args, struct cmd_help_t help); -gboolean cmd_autoaway(gchar **args, struct cmd_help_t help); -gboolean cmd_autoconnect(gchar **args, struct cmd_help_t help); -gboolean cmd_autoping(gchar **args, struct cmd_help_t help); -gboolean cmd_away(gchar **args, struct cmd_help_t help); -gboolean cmd_beep(gchar **args, struct cmd_help_t help); -gboolean cmd_caps(gchar **args, struct cmd_help_t help); -gboolean cmd_chat(gchar **args, struct cmd_help_t help); -gboolean cmd_chlog(gchar **args, struct cmd_help_t help); -gboolean cmd_clear(gchar **args, struct cmd_help_t help); -gboolean cmd_close(gchar **args, struct cmd_help_t help); -gboolean cmd_connect(gchar **args, struct cmd_help_t help); -gboolean cmd_decline(gchar **args, struct cmd_help_t help); -gboolean cmd_disco(gchar **args, struct cmd_help_t help); -gboolean cmd_disconnect(gchar **args, struct cmd_help_t help); -gboolean cmd_dnd(gchar **args, struct cmd_help_t help); -gboolean cmd_flash(gchar **args, struct cmd_help_t help); -gboolean cmd_gone(gchar **args, struct cmd_help_t help); -gboolean cmd_grlog(gchar **args, struct cmd_help_t help); -gboolean cmd_group(gchar **args, struct cmd_help_t help); -gboolean cmd_help(gchar **args, struct cmd_help_t help); -gboolean cmd_history(gchar **args, struct cmd_help_t help); -gboolean cmd_carbons(gchar **args, struct cmd_help_t help); -gboolean cmd_receipts(gchar **args, struct cmd_help_t help); -gboolean cmd_info(gchar **args, struct cmd_help_t help); -gboolean cmd_intype(gchar **args, struct cmd_help_t help); -gboolean cmd_invite(gchar **args, struct cmd_help_t help); -gboolean cmd_invites(gchar **args, struct cmd_help_t help); -gboolean cmd_join(gchar **args, struct cmd_help_t help); -gboolean cmd_leave(gchar **args, struct cmd_help_t help); -gboolean cmd_log(gchar **args, struct cmd_help_t help); -gboolean cmd_mouse(gchar **args, struct cmd_help_t help); -gboolean cmd_msg(gchar **args, struct cmd_help_t help); -gboolean cmd_nick(gchar **args, struct cmd_help_t help); -gboolean cmd_notify(gchar **args, struct cmd_help_t help); -gboolean cmd_online(gchar **args, struct cmd_help_t help); -gboolean cmd_otr(gchar **args, struct cmd_help_t help); -gboolean cmd_outtype(gchar **args, struct cmd_help_t help); -gboolean cmd_prefs(gchar **args, struct cmd_help_t help); -gboolean cmd_priority(gchar **args, struct cmd_help_t help); -gboolean cmd_quit(gchar **args, struct cmd_help_t help); -gboolean cmd_reconnect(gchar **args, struct cmd_help_t help); -gboolean cmd_room(gchar **args, struct cmd_help_t help); -gboolean cmd_rooms(gchar **args, struct cmd_help_t help); -gboolean cmd_bookmark(gchar **args, struct cmd_help_t help); -gboolean cmd_roster(gchar **args, struct cmd_help_t help); -gboolean cmd_software(gchar **args, struct cmd_help_t help); -gboolean cmd_splash(gchar **args, struct cmd_help_t help); -gboolean cmd_states(gchar **args, struct cmd_help_t help); -gboolean cmd_status(gchar **args, struct cmd_help_t help); -gboolean cmd_statuses(gchar **args, struct cmd_help_t help); -gboolean cmd_sub(gchar **args, struct cmd_help_t help); -gboolean cmd_theme(gchar **args, struct cmd_help_t help); -gboolean cmd_tiny(gchar **args, struct cmd_help_t help); -gboolean cmd_titlebar(gchar **args, struct cmd_help_t help); -gboolean cmd_vercheck(gchar **args, struct cmd_help_t help); -gboolean cmd_who(gchar **args, struct cmd_help_t help); -gboolean cmd_win(gchar **args, struct cmd_help_t help); -gboolean cmd_wins(gchar **args, struct cmd_help_t help); -gboolean cmd_xa(gchar **args, struct cmd_help_t help); -gboolean cmd_alias(gchar **args, struct cmd_help_t help); -gboolean cmd_xmlconsole(gchar **args, struct cmd_help_t help); -gboolean cmd_ping(gchar **args, struct cmd_help_t help); -gboolean cmd_form(gchar **args, struct cmd_help_t help); -gboolean cmd_occupants(gchar **args, struct cmd_help_t help); -gboolean cmd_kick(gchar **args, struct cmd_help_t help); -gboolean cmd_ban(gchar **args, struct cmd_help_t help); -gboolean cmd_subject(gchar **args, struct cmd_help_t help); -gboolean cmd_affiliation(gchar **args, struct cmd_help_t help); -gboolean cmd_role(gchar **args, struct cmd_help_t help); -gboolean cmd_privileges(gchar **args, struct cmd_help_t help); -gboolean cmd_presence(gchar **args, struct cmd_help_t help); -gboolean cmd_wrap(gchar **args, struct cmd_help_t help); -gboolean cmd_time(gchar **args, struct cmd_help_t help); -gboolean cmd_resource(gchar **args, struct cmd_help_t help); -gboolean cmd_inpblock(gchar **args, struct cmd_help_t help); +gboolean cmd_about(ProfWin *window, gchar **args, struct cmd_help_t help); +gboolean cmd_account(ProfWin *window, gchar **args, struct cmd_help_t help); +gboolean cmd_autoaway(ProfWin *window, gchar **args, struct cmd_help_t help); +gboolean cmd_autoconnect(ProfWin *window, gchar **args, struct cmd_help_t help); +gboolean cmd_autoping(ProfWin *window, gchar **args, struct cmd_help_t help); +gboolean cmd_away(ProfWin *window, gchar **args, struct cmd_help_t help); +gboolean cmd_beep(ProfWin *window, gchar **args, struct cmd_help_t help); +gboolean cmd_caps(ProfWin *window, gchar **args, struct cmd_help_t help); +gboolean cmd_chat(ProfWin *window, gchar **args, struct cmd_help_t help); +gboolean cmd_chlog(ProfWin *window, gchar **args, struct cmd_help_t help); +gboolean cmd_clear(ProfWin *window, gchar **args, struct cmd_help_t help); +gboolean cmd_close(ProfWin *window, gchar **args, struct cmd_help_t help); +gboolean cmd_connect(ProfWin *window, gchar **args, struct cmd_help_t help); +gboolean cmd_decline(ProfWin *window, gchar **args, struct cmd_help_t help); +gboolean cmd_disco(ProfWin *window, gchar **args, struct cmd_help_t help); +gboolean cmd_disconnect(ProfWin *window, gchar **args, struct cmd_help_t help); +gboolean cmd_dnd(ProfWin *window, gchar **args, struct cmd_help_t help); +gboolean cmd_flash(ProfWin *window, gchar **args, struct cmd_help_t help); +gboolean cmd_gone(ProfWin *window, gchar **args, struct cmd_help_t help); +gboolean cmd_grlog(ProfWin *window, gchar **args, struct cmd_help_t help); +gboolean cmd_group(ProfWin *window, gchar **args, struct cmd_help_t help); +gboolean cmd_help(ProfWin *window, gchar **args, struct cmd_help_t help); +gboolean cmd_history(ProfWin *window, gchar **args, struct cmd_help_t help); +gboolean cmd_carbons(ProfWin *window, gchar **args, struct cmd_help_t help); +gboolean cmd_receipts(ProfWin *window, gchar **args, struct cmd_help_t help); +gboolean cmd_info(ProfWin *window, gchar **args, struct cmd_help_t help); +gboolean cmd_intype(ProfWin *window, gchar **args, struct cmd_help_t help); +gboolean cmd_invite(ProfWin *window, gchar **args, struct cmd_help_t help); +gboolean cmd_invites(ProfWin *window, gchar **args, struct cmd_help_t help); +gboolean cmd_join(ProfWin *window, gchar **args, struct cmd_help_t help); +gboolean cmd_leave(ProfWin *window, gchar **args, struct cmd_help_t help); +gboolean cmd_log(ProfWin *window, gchar **args, struct cmd_help_t help); +gboolean cmd_mouse(ProfWin *window, gchar **args, struct cmd_help_t help); +gboolean cmd_msg(ProfWin *window, gchar **args, struct cmd_help_t help); +gboolean cmd_nick(ProfWin *window, gchar **args, struct cmd_help_t help); +gboolean cmd_notify(ProfWin *window, gchar **args, struct cmd_help_t help); +gboolean cmd_online(ProfWin *window, gchar **args, struct cmd_help_t help); +gboolean cmd_otr(ProfWin *window, gchar **args, struct cmd_help_t help); +gboolean cmd_pgp(ProfWin *window, gchar **args, struct cmd_help_t help); +gboolean cmd_outtype(ProfWin *window, gchar **args, struct cmd_help_t help); +gboolean cmd_prefs(ProfWin *window, gchar **args, struct cmd_help_t help); +gboolean cmd_priority(ProfWin *window, gchar **args, struct cmd_help_t help); +gboolean cmd_quit(ProfWin *window, gchar **args, struct cmd_help_t help); +gboolean cmd_reconnect(ProfWin *window, gchar **args, struct cmd_help_t help); +gboolean cmd_room(ProfWin *window, gchar **args, struct cmd_help_t help); +gboolean cmd_rooms(ProfWin *window, gchar **args, struct cmd_help_t help); +gboolean cmd_bookmark(ProfWin *window, gchar **args, struct cmd_help_t help); +gboolean cmd_roster(ProfWin *window, gchar **args, struct cmd_help_t help); +gboolean cmd_software(ProfWin *window, gchar **args, struct cmd_help_t help); +gboolean cmd_splash(ProfWin *window, gchar **args, struct cmd_help_t help); +gboolean cmd_states(ProfWin *window, gchar **args, struct cmd_help_t help); +gboolean cmd_status(ProfWin *window, gchar **args, struct cmd_help_t help); +gboolean cmd_statuses(ProfWin *window, gchar **args, struct cmd_help_t help); +gboolean cmd_sub(ProfWin *window, gchar **args, struct cmd_help_t help); +gboolean cmd_theme(ProfWin *window, gchar **args, struct cmd_help_t help); +gboolean cmd_tiny(ProfWin *window, gchar **args, struct cmd_help_t help); +gboolean cmd_titlebar(ProfWin *window, gchar **args, struct cmd_help_t help); +gboolean cmd_vercheck(ProfWin *window, gchar **args, struct cmd_help_t help); +gboolean cmd_who(ProfWin *window, gchar **args, struct cmd_help_t help); +gboolean cmd_win(ProfWin *window, gchar **args, struct cmd_help_t help); +gboolean cmd_wins(ProfWin *window, gchar **args, struct cmd_help_t help); +gboolean cmd_winstidy(ProfWin *window, gchar **args, struct cmd_help_t help); +gboolean cmd_xa(ProfWin *window, gchar **args, struct cmd_help_t help); +gboolean cmd_alias(ProfWin *window, gchar **args, struct cmd_help_t help); +gboolean cmd_xmlconsole(ProfWin *window, gchar **args, struct cmd_help_t help); +gboolean cmd_ping(ProfWin *window, gchar **args, struct cmd_help_t help); +gboolean cmd_form(ProfWin *window, gchar **args, struct cmd_help_t help); +gboolean cmd_occupants(ProfWin *window, gchar **args, struct cmd_help_t help); +gboolean cmd_kick(ProfWin *window, gchar **args, struct cmd_help_t help); +gboolean cmd_ban(ProfWin *window, gchar **args, struct cmd_help_t help); +gboolean cmd_subject(ProfWin *window, gchar **args, struct cmd_help_t help); +gboolean cmd_affiliation(ProfWin *window, gchar **args, struct cmd_help_t help); +gboolean cmd_role(ProfWin *window, gchar **args, struct cmd_help_t help); +gboolean cmd_privileges(ProfWin *window, gchar **args, struct cmd_help_t help); +gboolean cmd_presence(ProfWin *window, gchar **args, struct cmd_help_t help); +gboolean cmd_wrap(ProfWin *window, gchar **args, struct cmd_help_t help); +gboolean cmd_time(ProfWin *window, gchar **args, struct cmd_help_t help); +gboolean cmd_resource(ProfWin *window, gchar **args, struct cmd_help_t help); +gboolean cmd_inpblock(ProfWin *window, gchar **args, struct cmd_help_t help); +gboolean cmd_encwarn(ProfWin *window, gchar **args, struct cmd_help_t help); -gboolean cmd_form_field(char *tag, gchar **args); +gboolean cmd_form_field(ProfWin *window, char *tag, gchar **args); #endif |