[Pkg-privacy-commits] [irssi-plugin-otr] 34/267: A bunch of things after a long pause.

Ximin Luo infinity0 at moszumanska.debian.org
Sat Aug 22 12:41:25 UTC 2015


This is an automated email from the git hooks/post-receive script.

infinity0 pushed a commit to branch debian
in repository irssi-plugin-otr.

commit 244c0e9ffd9fccae88d07851f4372f9907d09c02
Author: Uli Meis <a.sporto+bee at gmail.com>
Date:   Fri Jan 16 21:17:14 2009 +0100

    A bunch of things after a long pause.
    
    * two bugs (segfaults at otr.c:104 and otrutil.c:304)
    * libotr is given a temporary file for key generation
      (problem is that it truncates an existing file)
    * /otr commands now take a nick at server argument
      (useful for single message window mode)
---
 README      |   8 ++---
 formats.txt |   2 +-
 otr.c       |  58 ++++++++++++++++++++++-----------
 otr.h       |  13 ++++----
 otr_key.c   |   9 +++++-
 otrutil.c   | 104 ++++++++++++++++++++++++++++++++++++++++++++++++++++++------
 6 files changed, 155 insertions(+), 39 deletions(-)

diff --git a/README b/README
index f46d3d5..d1d3c54 100644
--- a/README
+++ b/README
@@ -37,18 +37,18 @@ Commands:
 
 /otr genkey nick at irc.server.com 
 	Manually generate a key for the given account(also done on demand)
-/otr auth <secret>
+/otr auth [<nick>@<server>] <secret>
 	Initiate or respond to an authentication challenge
-/otr authabort
+/otr authabort [<nick>@<server>] 
 	Abort any ongoing authentication
-/otr trust
+/otr trust [<nick>@<server>]
 	Trust the fingerprint of the user in the current window.
 	You should only do this after comparing fingerprints over a secure line
 /otr debug
 	Switch debug mode on/off
 /otr contexts
 	List all OTR contexts along with their fingerprints and status
-/otr finish
+/otr finish [<nick>@<server>]
 	Finish an OTR conversation
 /otr version
 	Display irssi-otr version. Might be a git commit
diff --git a/formats.txt b/formats.txt
index d7b03e4..87c80aa 100644
--- a/formats.txt
+++ b/formats.txt
@@ -65,7 +65,7 @@ auth_successful	Authentication successful!
 auth_failed	Authentication failed!
 Commands
 cmd_otr	We're alive
-cmd_qnotfound	failed: Can't get query details
+cmd_qnotfound	Failed: Can't get nick and server of current query window. (Or maybe you're doing this in the status window?)
 cmd_auth	Please agree on a secret with your peer and then initiate the authentication with /otr auth <secret> or let him initiate. Should you initiate your peer will after a little while be instructed to enter the secret as well. Once he has done so the authentication will finish up. Should you have both typed in the same secret the authentication should be successful.
 cmd_debug_on	Debug mode is on
 cmd_debug_off	Debug mode is off
diff --git a/otr.c b/otr.c
index fce39fd..dc3c5f9 100644
--- a/otr.c
+++ b/otr.c
@@ -74,7 +74,7 @@ static void sig_message_private(SERVER_REC *server, const char *msg,
  */
 static void sig_query_destroyed(QUERY_REC *query) {
 	if (query&&query->server&&query->server->connrec) {
-		otr_finish(query->server,query->name,FALSE);
+		otr_finish(query->server,query->name,NULL,FALSE);
 	}
 }
 
@@ -91,31 +91,35 @@ static void cmd_otr(const char *data,void *server,WI_ITEM_REC *item)
 }
 
 /*
- * /otr finish
+ * /otr finish [peername]
  */
 static void cmd_finish(const char *data, void *server, WI_ITEM_REC *item)
 {
 	QUERY_REC *query = QUERY(item);
-	if (query&&query->server&&query->server->connrec) {
-		otr_finish(query->server,query->name,TRUE);
+	if (*data != '\0') {
+		otr_finish(NULL,NULL,data,TRUE);
 		statusbar_items_redraw("otr");
-	}
-	else
-		otr_notice(item->server,query ? query->name : NULL,
+	} else if (query&&query->server&&query->server->connrec) {
+		otr_finish(query->server,query->name,NULL,TRUE);
+		statusbar_items_redraw("otr");
+	} else
+		otr_notice(item ? item->server : NULL,query ? query->name : NULL,
 			   TXT_CMD_QNOTFOUND);
 }
 
 /*
- * /otr trust
+ * /otr trust [peername]
  */
 static void cmd_trust(const char *data, void *server, WI_ITEM_REC *item)
 {
 	QUERY_REC *query = QUERY(item);
-	if (query&&query->server&&query->server->connrec) {
-		otr_trust(query->server,query->name);
+	if (*data != '\0') {
+		otr_trust(NULL,NULL,data);
 		statusbar_items_redraw("otr");
-	}
-	else
+	} else if (query&&query->server&&query->server->connrec) {
+		otr_trust(query->server,query->name,NULL);
+		statusbar_items_redraw("otr");
+	} else
 		otr_notice(item->server,query ? query->name : NULL,
 			   TXT_CMD_QNOTFOUND);
 }
@@ -134,33 +138,51 @@ static void cmd_genkey(const char *data, void *server, WI_ITEM_REC *item)
 }
 
 /*
- * /otr auth <secret>
+ * /otr auth [peername] <secret>
  */
 static void cmd_auth(const char *data, void *server, WI_ITEM_REC *item)
 {
 	WI_ITEM_REC *wi = active_win->active;
 	QUERY_REC *query = QUERY(wi);
+	char *secret;
+
+	if ((secret = strchr(data,' '))) {
+		*secret = '\0';
+		if (!strchr(data,'@')) {
+			/* it's not an account name after all */
+			*secret = ' ';
+			secret = NULL;
+		} else
+			secret++;
+	}
 
-	if (query&&query->server&&query->server->connrec) {
+	if (secret) {
+		otr_auth(NULL,NULL,data,secret);
+		*(secret-1) = ' ';
+	} else if (query&&query->server&&query->server->connrec) {
 		if (!data||(*data=='\0')) {
 			otr_notice(server,query->name,
 				   TXT_CMD_AUTH);
 			return;
 		}
-		otr_auth(query->server,query->name,data);
+		otr_auth(query->server,query->name,NULL,data);
 	}
+
 }
 
 /*
- * /otr authabort
+ * /otr authabort [peername]
  */
 static void cmd_authabort(const char *data, void *server, WI_ITEM_REC *item)
 {
 	WI_ITEM_REC *wi = active_win->active;
 	QUERY_REC *query = QUERY(wi);
 
-	if (query&&query->server&&query->server->connrec) {
-		otr_authabort(query->server,query->name);
+	if (*data != '\0') {
+		otr_authabort(NULL,NULL,data);
+		statusbar_items_redraw("otr");
+	} else if (query&&query->server&&query->server->connrec) {
+		otr_authabort(query->server,query->name,NULL);
 		statusbar_items_redraw("otr");
 	}
 }
diff --git a/otr.h b/otr.h
index fd88e18..8f2fca3 100644
--- a/otr.h
+++ b/otr.h
@@ -66,8 +66,9 @@
 /* otr protocol id */
 #define PROTOCOLID "IRC"
 
-#define KEYFILE "/otr/otr.key"
-#define FPSFILE "/otr/otr.fp"
+#define KEYFILE    "/otr/otr.key"
+#define TMPKEYFILE "/otr/otr.key.tmp"
+#define FPSFILE    "/otr/otr.fp"
 
 /* one for each OTR context (=communication pair) */
 struct co_info {
@@ -116,10 +117,10 @@ ConnContext *otr_getcontext(const char *accname,const char *nick,int create,void
 
 /* user interaction */
 
-void otr_trust(SERVER_REC *server, char *nick);
-void otr_finish(SERVER_REC *server, char *nick,int inquery);
-void otr_auth(SERVER_REC *server, char *nick, const char *secret);
-void otr_authabort(SERVER_REC *server, char *nick);
+void otr_trust(SERVER_REC *server, char *nick, const char *peername);
+void otr_finish(SERVER_REC *server, char *nick, const char *peername, int inquery);
+void otr_auth(SERVER_REC *server, char *nick, const char *peername, const char *secret);
+void otr_authabort(SERVER_REC *server, char *nick, const char *peername);
 struct ctxlist_ *otr_contexts();
 
 
diff --git a/otr_key.c b/otr_key.c
index 3331040..374bee5 100644
--- a/otr_key.c
+++ b/otr_key.c
@@ -90,6 +90,9 @@ gboolean keygen_complete(GIOChannel *source, GIOCondition condition,
 			 gpointer data)
 {
 	gcry_error_t err;
+	const char *irssidir = get_irssi_dir();
+	char *filename    = g_strconcat(irssidir,KEYFILE,NULL);
+	char *tmpfilename = g_strconcat(irssidir,TMPKEYFILE,NULL);
 
 	read(g_io_channel_unix_get_fd(kg_st.ch[0]),&err,sizeof(err));
 
@@ -108,6 +111,7 @@ gboolean keygen_complete(GIOChannel *source, GIOCondition condition,
 		otr_noticest(TXT_KG_COMPLETED,
 			     kg_st.accountname,
 			     time(NULL)-kg_st.started);
+		rename(tmpfilename,filename);
 		//otrl_privkey_forget_all(otr_state); <-- done by lib
 		key_load();
 	}
@@ -118,6 +122,9 @@ gboolean keygen_complete(GIOChannel *source, GIOCondition condition,
 	kg_st.status = KEYGEN_NO;
 	g_free(kg_st.accountname);
 
+	g_free(filename);
+	g_free(tmpfilename);
+
 	return FALSE;
 }
 
@@ -131,7 +138,7 @@ void keygen_run(const char *accname)
 	gcry_error_t err;
 	int ret;
 	int fds[2];
-	char *filename = g_strconcat(get_irssi_dir(),KEYFILE,NULL);
+	char *filename = g_strconcat(get_irssi_dir(),TMPKEYFILE,NULL);
 	char *dir = dirname(g_strdup(filename));
 
 	if (kg_st.status!=KEYGEN_NO) {
diff --git a/otrutil.c b/otrutil.c
index 104870e..f0f531a 100644
--- a/otrutil.c
+++ b/otrutil.c
@@ -272,21 +272,52 @@ int otr_getstatus(char *mynick, char *nick, char *server)
 	}
 }
 
+SERVER_REC *server_find_address(char *address)
+{
+        GSList *tmp;
+
+        g_return_val_if_fail(address != NULL, NULL);
+        if (*address == '\0') return NULL;
+
+        for (tmp = servers; tmp != NULL; tmp = tmp->next) {
+                SERVER_REC *server = tmp->data;
+
+                if (g_strcasecmp(server->connrec->address, address) == 0)
+                        return server;
+        }
+
+        return NULL;
+}
+
 /*
  * Finish the conversation.
  */
-void otr_finish(SERVER_REC *server, char *nick, int inquery)
+void otr_finish(SERVER_REC *server, char *nick, const char *peername, int inquery)
 {
 	ConnContext *co;
 	char accname[128];
 	struct co_info *coi;
+	char *pserver = NULL;
+
+	if (peername) {
+		pserver = strchr(peername,'@');
+		if (!pserver)
+			return;
+		server = server_find_address(pserver+1);
+		if (!server)
+			return;
+		*pserver = '\0';
+		nick = (char*)peername;
+	}
 
-	sprintf(accname, "%s@%s", server->nick, server->connrec->address);
+	sprintf((char*)accname, "%s@%s", server->nick, server->connrec->address);
 
 	if (!(co = otr_getcontext(accname,nick,FALSE,NULL))) {
 		if (inquery)
 			otr_noticest(TXT_CTX_NOT_FOUND,
 				     accname,nick);
+		if (peername)
+			*pserver = '@';
 		return;
 	}
 
@@ -301,23 +332,41 @@ void otr_finish(SERVER_REC *server, char *nick, int inquery)
 
 	/* finish if /otr finish has been issued. Reset if
 	 * we're called cause the query window has been closed. */
-	coi->finished = inquery;
+	if (coi) 
+		coi->finished = inquery;
+
+	if (peername)
+		*pserver = '@';
 }
 
 /*
  * Trust our peer.
  */
-void otr_trust(SERVER_REC *server, char *nick)
+void otr_trust(SERVER_REC *server, char *nick, const char *peername)
 {
 	ConnContext *co;
 	char accname[128];
 	struct co_info *coi;
+	char *pserver = NULL;
+
+	if (peername) {
+		pserver = strchr(peername,'@');
+		if (!pserver)
+			return;
+		server = server_find_address(pserver+1);
+		if (!server)
+			return;
+		*pserver = '\0';
+		nick = (char*)peername;
+	}
 
-	sprintf(accname, "%s@%s", server->nick, server->connrec->address);
+	sprintf((char*)accname, "%s@%s", server->nick, server->connrec->address);
 
 	if (!(co = otr_getcontext(accname,nick,FALSE,NULL))) {
 		otr_noticest(TXT_CTX_NOT_FOUND,
 			     accname,nick);
+		if (peername)
+			*pserver = '@';
 		return;
 	}
 
@@ -327,6 +376,9 @@ void otr_trust(SERVER_REC *server, char *nick)
 	coi->smp_failed = FALSE;
 
 	otr_notice(server,nick,TXT_FP_TRUST,nick);
+
+	if (peername)
+		*pserver = '@';
 }
 
 /*
@@ -351,36 +403,67 @@ void otr_abort_auth(ConnContext *co, SERVER_REC *server, const char *nick)
 /*
  * implements /otr authabort
  */
-void otr_authabort(SERVER_REC *server, char *nick)
+void otr_authabort(SERVER_REC *server, char *nick, const char *peername)
 {
 	ConnContext *co;
 	char accname[128];
+	char *pserver = NULL;
+
+	if (peername) {
+		pserver = strchr(peername,'@');
+		if (!pserver)
+			return;
+		server = server_find_address(pserver+1);
+		if (!server)
+			return;
+		*pserver = '\0';
+		nick = (char*)peername;
+	}
 
-	sprintf(accname, "%s@%s", server->nick, server->connrec->address);
+	sprintf((char*)accname, "%s@%s", server->nick, server->connrec->address);
 
 	if (!(co = otr_getcontext(accname,nick,FALSE,NULL))) {
 		otr_noticest(TXT_CTX_NOT_FOUND,
 			     accname,nick);
+		if (peername)
+			*pserver = '@';
 		return;
 	}
 
 	otr_abort_auth(co,server,nick);
+
+	if (peername)
+		*pserver = '@';
 }
 
 /*
  * Initiate or respond to SMP authentication.
  */
-void otr_auth(SERVER_REC *server, char *nick, const char *secret)
+void otr_auth(SERVER_REC *server, char *nick, const char *peername, const char *secret)
 {
 	ConnContext *co;
 	char accname[128];
 	struct co_info *coi;
+	char *pserver = NULL;
+
+	if (peername) {
+		pserver = strchr(peername,'@');
+		if (!pserver)
+			return;
+		server = server_find_address(pserver+1);
+		if (!server)
+			return;
+		*pserver = '\0';
+		nick = (char*)peername;
+	}
 
-	sprintf(accname, "%s@%s", server->nick, server->connrec->address);
+	sprintf((char*)accname, "%s@%s", server->nick, server->connrec->address);
 
 	if (!(co = otr_getcontext(accname,nick,FALSE,NULL))) {
 		otr_noticest(TXT_CTX_NOT_FOUND,
 			     accname,nick);
+		if (peername)
+			*pserver = '@';
 		return;
 	}
 
@@ -424,6 +507,9 @@ void otr_auth(SERVER_REC *server, char *nick, const char *secret)
 		   TXT_AUTH_INITIATED);
 
 	statusbar_items_redraw("otr");
+
+	if (peername)
+		*pserver = '@';
 }
 
 /* 

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-privacy/packages/irssi-plugin-otr.git



More information about the Pkg-privacy-commits mailing list