Mercurial > ~mikael > mcabber > hg
diff mcabber/src/commands.c @ 1299:3b338a5c01fc
OTR support
author | Frank Zschockelt <mcabber_otr[at]freakysoft.de> |
---|---|
date | Thu, 30 Aug 2007 00:52:51 +0200 |
parents | 382ec54b584e |
children | 37b41ed9ed35 |
line wrap: on
line diff
--- a/mcabber/src/commands.c Tue Aug 28 18:56:50 2007 +0200 +++ b/mcabber/src/commands.c Thu Aug 30 00:52:51 2007 +0200 @@ -32,6 +32,7 @@ #include "utils.h" #include "settings.h" #include "events.h" +#include "otr.h" #define IMSTATUS_AWAY "away" #define IMSTATUS_ONLINE "online" @@ -78,6 +79,8 @@ static void do_chat_disable(char *arg); static void do_source(char *arg); static void do_color(char *arg); +static void do_otr(char *arg); +static void do_otrpolicy(char *arg); // Global variable for the commands list static GSList *Commands; @@ -129,6 +132,8 @@ cmd_add("msay", "Send a multi-lines message to the selected buddy", COMPL_MULTILINE, 0, &do_msay); cmd_add("pgp", "Manage PGP settings", COMPL_PGP, COMPL_JID, &do_pgp); + cmd_add("otr", "Manage OTR settings", COMPL_OTR, COMPL_JID, &do_otr); + cmd_add("otrpolicy", "Manage OTR policies", COMPL_JID, COMPL_OTRPOLICY, &do_otrpolicy); cmd_add("quit", "Exit the software", 0, 0, NULL); cmd_add("rawxml", "Send a raw XML string", 0, 0, &do_rawxml); cmd_add("rename", "Rename the current buddy", 0, 0, &do_rename); @@ -255,6 +260,22 @@ compl_add_category_word(COMPL_PGP, "info"); compl_add_category_word(COMPL_PGP, "setkey"); + // OTR category + compl_add_category_word(COMPL_OTR, "start"); + compl_add_category_word(COMPL_OTR, "stop"); + compl_add_category_word(COMPL_OTR, "fingerprint"); + compl_add_category_word(COMPL_OTR, "smpq"); + compl_add_category_word(COMPL_OTR, "smpr"); + compl_add_category_word(COMPL_OTR, "smpa"); + compl_add_category_word(COMPL_OTR, "info"); + compl_add_category_word(COMPL_OTR, "key"); + + // OTR Policy category + compl_add_category_word(COMPL_OTRPOLICY, "plain"); + compl_add_category_word(COMPL_OTRPOLICY, "manual"); + compl_add_category_word(COMPL_OTRPOLICY, "opportunistic"); + compl_add_category_word(COMPL_OTRPOLICY, "always"); + // Color category compl_add_category_word(COMPL_COLOR, "roster"); compl_add_category_word(COMPL_COLOR, "muc"); @@ -2883,6 +2904,223 @@ free_arg_lst(paramlst); } +static void do_otr(char *arg) +{ +#ifdef HAVE_LIBOTR + char **paramlst; + char *fjid, *subcmd, *keyid; + enum { + otr_none, + otr_start, + otr_stop, + otr_fpr, + otr_smpq, + otr_smpr, + otr_smpa, + otr_k, + otr_info + } op = 0; + + paramlst = split_arg(arg, 3, 0); // subcmd, jid, [key] + subcmd = *paramlst; + fjid = *(paramlst+1); + keyid = *(paramlst+2); + + if (!subcmd) + fjid = NULL; + if (!fjid) + keyid = NULL; + + if (subcmd) { + if (!strcasecmp(subcmd, "start")) + op = otr_start; + else if (!strcasecmp(subcmd, "stop")) + op = otr_stop; + else if (!strcasecmp(subcmd, "fingerprint")) + op = otr_fpr; + else if (!strcasecmp(subcmd, "smpq")) + op = otr_smpq; + else if (!strcasecmp(subcmd, "smpr")) + op = otr_smpr; + else if (!strcasecmp(subcmd, "smpa")) + op = otr_smpa; + else if (!strcasecmp(subcmd, "key")) + op = otr_k; + else if (!strcasecmp(subcmd, "info")) + op = otr_info; + } + + if (!op) { + scr_LogPrint(LPRINT_NORMAL, "Unrecognized or missing parameter!"); + free_arg_lst(paramlst); + return; + } + + if(op == otr_k) + otr_key(); + else { + // Allow special jid "" or "." (current buddy) + if (fjid && (!*fjid || !strcmp(fjid, "."))) + fjid = NULL; + + if (fjid) { + // The JID has been specified. Quick check... + if (check_jid_syntax(fjid) || !strchr(fjid, '@')) { + scr_LogPrint(LPRINT_NORMAL|LPRINT_NOTUTF8, + "<%s> is not a valid Jabber ID.", fjid); + fjid = NULL; + } else { + // Convert jid to lowercase and strip resource + char *p; + for (p = fjid; *p && *p != JID_RESOURCE_SEPARATOR; p++) + *p = tolower(*p); + if (*p == JID_RESOURCE_SEPARATOR) + *p = '\0'; + } + } else { + gpointer bud = NULL; + if (current_buddy) + bud = BUDDATA(current_buddy); + if (bud) { + guint type = buddy_gettype(bud); + if (type & ROSTER_TYPE_USER) // Is it a user? + fjid = (char*)buddy_getjid(bud); + else + scr_LogPrint(LPRINT_NORMAL, "The selected item should be a user."); + } + } + + if (fjid) { // fjid is actually a bare jid... + switch (op) { + case otr_start: + otr_establish(fjid); break; + case otr_stop: + otr_disconnect(fjid); break; + case otr_fpr: + otr_fingerprint(fjid, keyid); break; + case otr_smpq: + otr_smp_query(fjid, keyid); break; + case otr_smpr: + otr_smp_respond(fjid, keyid); break; + case otr_smpa: + otr_smp_abort(fjid); break; + case otr_info: + otr_print_info(fjid); break; + default: + break; + } + } else + scr_LogPrint(LPRINT_NORMAL, "Please specify a valid Jabber ID."); + } + free_arg_lst(paramlst); + +#else + scr_LogPrint(LPRINT_NORMAL, "Please recompile mcabber with libotr enabled."); +#endif /* HAVE_LIBOTR */ +} + +#ifdef HAVE_LIBOTR +static char * string_for_otrpolicy(enum otr_policy p) +{ + switch (p) { + case plain: return "plain"; + case opportunistic: return "opportunistic"; + case manual: return "manual"; + case always: return "always"; + default: return "unknown"; + } +} + +static void dump_otrpolicy(char * k, char * v, void * nothing) +{ + scr_LogPrint(LPRINT_NORMAL|LPRINT_NOTUTF8, "otrpolicy for %s: %s", k, + string_for_otrpolicy(*(enum otr_policy*)v)); +} +#endif + +static void do_otrpolicy(char *arg) +{ +#ifdef HAVE_LIBOTR + char **paramlst; + char *fjid, *policy; + enum otr_policy p; + + paramlst = split_arg(arg, 2, 0); // [jid|default] policy + fjid = *paramlst; + policy = *(paramlst+1); + + if (!fjid && !policy) { + scr_LogPrint(LPRINT_NORMAL, "default otrpolicy: %s", + string_for_otrpolicy(settings_otr_getpolicy(NULL))); + settings_foreach(SETTINGS_TYPE_OTR, &dump_otrpolicy, NULL); + return; + } + + if (!policy) { + scr_LogPrint(LPRINT_NORMAL, "Unrecognized or missing parameter!"); + free_arg_lst(paramlst); + return; + } + + if (!strcasecmp(policy, "plain")) + p = plain; + else if (!strcasecmp(policy, "manual")) + p = manual; + else if (!strcasecmp(policy, "opportunistic")) + p = opportunistic; + else if (!strcasecmp(policy, "always")) + p = always; + else { + /* Fail, we don't know _this_ policy*/ + } + + if(!strcasecmp(fjid, "default")){ + /*set default policy*/ + settings_otr_setpolicy(NULL, p); + return; + } + // Allow special jid "" or "." (current buddy) + if (fjid && (!*fjid || !strcmp(fjid, "."))) + fjid = NULL; + + if (fjid) { + // The JID has been specified. Quick check... + if (check_jid_syntax(fjid) || !strchr(fjid, '@')) { + scr_LogPrint(LPRINT_NORMAL|LPRINT_NOTUTF8, + "<%s> is not a valid Jabber ID.", fjid); + fjid = NULL; + } else { + // Convert jid to lowercase and strip resource + char *p; + for (p = fjid; *p && *p != JID_RESOURCE_SEPARATOR; p++) + *p = tolower(*p); + if (*p == JID_RESOURCE_SEPARATOR) + *p = '\0'; + } + } else { + gpointer bud = NULL; + if (current_buddy) + bud = BUDDATA(current_buddy); + if (bud) { + guint type = buddy_gettype(bud); + if (type & ROSTER_TYPE_USER) // Is it a user? + fjid = (char*)buddy_getjid(bud); + else + scr_LogPrint(LPRINT_NORMAL, "The selected item should be a user."); + } + } + + if (fjid) + settings_otr_setpolicy(fjid, p); + else + scr_LogPrint(LPRINT_NORMAL, "Please specify a valid Jabber ID."); + + free_arg_lst(paramlst); +#else + scr_LogPrint(LPRINT_NORMAL, "Please recompile mcabber with libotr enabled."); +#endif /* HAVE_LIBOTR */ +} + /* !!! After changing the /iline arguments names here, you must change ones in init_bindings().