From 68210888bf7afe27f6464560b1f35e2312601bb3 Mon Sep 17 00:00:00 2001 From: Richard Kettlewell Date: Sun, 29 Jun 2008 12:39:20 +0100 Subject: [PATCH] Make Disobedience login window work even when you're logged in. The previous code attempted to stop constant error messages when you had a wrong password set by suppressing all disorder connection activity when the login window was up. This broke most activity in the login window. I don't really know why... The new model has eclient stop making new connection attempts if it gets an authentication error (it also disconnects when this happens). So Disobedience now re-enables connection attempts when a believed-good password is set. Perhaps a future version will make this less ugly. --- CHANGES.html | 9 +++++++++ disobedience/client.c | 9 +++++---- disobedience/disobedience.c | 2 ++ disobedience/login.c | 2 ++ lib/eclient.c | 20 +++++++++++++++++++- lib/eclient.h | 4 +++- 6 files changed, 40 insertions(+), 6 deletions(-) diff --git a/CHANGES.html b/CHANGES.html index 2a3c894..31f55ad 100644 --- a/CHANGES.html +++ b/CHANGES.html @@ -57,6 +57,15 @@ span.command {

This file documents recent user-visible changes to DisOrder.

+

Changes up to version 4.1.1

+ +
+ +

Disobedience's “Login” window now works when you are logged + in.

+ +
+

Changes up to version 4.1

diff --git a/disobedience/client.c b/disobedience/client.c index d81aac2..66a5bfc 100644 --- a/disobedience/client.c +++ b/disobedience/client.c @@ -68,8 +68,7 @@ static gboolean gtkclient_dispatch(GSource *source, if(revents & (G_IO_OUT|G_IO_HUP|G_IO_ERR)) mode |= DISORDER_POLL_WRITE; time(&esource->last_poll); - if(!login_window) - disorder_eclient_polled(esource->client, mode); + disorder_eclient_polled(esource->client, mode); return TRUE; /* ??? not documented */ } @@ -126,7 +125,8 @@ static void gtkclient_comms_error(void attribute((unused)) *u, /** @brief Report a protocol-level error * * The error will not be retried. We offer a callback to the submitter of the - * original command and if none is supplied we pop up an error box. + * original command and if none is supplied we drop the error message in the + * status bar. */ static void gtkclient_protocol_error(void attribute((unused)) *u, void *v, @@ -134,11 +134,12 @@ static void gtkclient_protocol_error(void attribute((unused)) *u, const char *msg) { struct callbackdata *cbd = v; + fprintf(stderr, "protocol error: %s\n", msg); D(("gtkclient_protocol_error %s", msg)); if(cbd && cbd->onerror) cbd->onerror(cbd, code, msg); else - popup_protocol_error(code, msg); + gtk_label_set_text(GTK_LABEL(report_label), msg); } /** @brief Report callback from eclient */ diff --git a/disobedience/disobedience.c b/disobedience/disobedience.c index ce6eb03..ce94e96 100644 --- a/disobedience/disobedience.c +++ b/disobedience/disobedience.c @@ -422,6 +422,8 @@ void logged_in(void) { periodic_fast(0); /* Recheck server version */ disorder_eclient_version(client, version_completed, 0); + disorder_eclient_enable_connect(client); + disorder_eclient_enable_connect(logclient); } int main(int argc, char **argv) { diff --git a/disobedience/login.c b/disobedience/login.c index b1047d6..c9bf826 100644 --- a/disobedience/login.c +++ b/disobedience/login.c @@ -163,6 +163,8 @@ static void login_ok(GtkButton attribute((unused)) *button, } else { /* Failed to connect - report the error */ popup_msg(GTK_MESSAGE_ERROR, disorder_last(c)); + /* TODO it would be nice to restore the config (not the entry contents!) to + * the last known good one if we were already connected to something. */ } disorder_close(c); /* no use for this any more */ } diff --git a/lib/eclient.c b/lib/eclient.c index 48ae7e2..e7353df 100644 --- a/lib/eclient.c +++ b/lib/eclient.c @@ -144,6 +144,9 @@ struct disorder_eclient { /** @brief Protocol version */ int protocol; + + /** @brief True if enabled */ + int enabled; }; /* Forward declarations ******************************************************/ @@ -234,6 +237,7 @@ disorder_eclient *disorder_eclient_new(const disorder_eclient_callbacks *cb, c->callbacks = cb; c->u = u; c->opstail = &c->ops; + c->enabled = 1; vector_init(&c->vec); dynstr_init(&c->input); dynstr_init(&c->output); @@ -271,6 +275,16 @@ void disorder_eclient_close(disorder_eclient *c) { c->log_callbacks->state(c->log_v, c->statebits); } +/** @brief Permit new connection activity */ +void disorder_eclient_enable_connect(disorder_eclient *c) { + c->enabled = 1; +} + +/** @brief Suppress new connection activity */ +void disorder_eclient_disable_connect(disorder_eclient *c) { + c->enabled = 0; +} + /** @brief Return current state */ unsigned long disorder_eclient_state(const disorder_eclient *c) { return c->statebits | (c->state > state_connected ? DISORDER_CONNECTED : 0); @@ -340,9 +354,12 @@ void disorder_eclient_polled(disorder_eclient *c, unsigned mode) { /* If there is no password yet then we cannot connect */ if(!config->password) { comms_error(c, "no password is configured"); + c->enabled = 0; return; } - start_connect(c); + /* Only try to connect if enabled */ + if(c->enabled) + start_connect(c); /* might now be state_disconnected (on error), state_connecting (slow * connect) or state_connected (fast connect). If state_disconnected then * we just rely on a periodic callback from the event loop sometime. */ @@ -597,6 +614,7 @@ static void authuser_opcallback(disorder_eclient *c, if(c->rc / 100 != 2) { /* Wrong password or something. We cannot proceed. */ protocol_error(c, op, c->rc, "%s: %s", c->ident, c->line); + c->enabled = 0; disorder_eclient_close(c); return; } diff --git a/lib/eclient.h b/lib/eclient.h index efb6b2d..6901961 100644 --- a/lib/eclient.h +++ b/lib/eclient.h @@ -483,7 +483,9 @@ int disorder_eclient_adduser(disorder_eclient *c, const char *password, const char *rights, void *v); - +void disorder_eclient_enable_connect(disorder_eclient *c); +void disorder_eclient_disable_connect(disorder_eclient *c); + #endif /* -- 2.11.0