[geary/wip/156-mailbox-not-exist-3-32: 3/3] No folders listed when STATUS returns not found for a child
- From: Michael Gratton <mjog src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [geary/wip/156-mailbox-not-exist-3-32: 3/3] No folders listed when STATUS returns not found for a child
- Date: Mon, 1 Apr 2019 13:32:46 +0000 (UTC)
commit d4a9849b54e8c77994df451a56e49819cee54cc0
Author: Michael Gratton <mike vee net>
Date: Mon Apr 1 13:19:39 2019 +0000
No folders listed when STATUS returns not found for a child
Cherry picked from 71d8c8b1a4aee86cb358ef7ce80449e5b648759b
Fixes #156
See merge request GNOME/geary!189
src/engine/imap/command/imap-command.vala | 27 +++++-------
src/engine/imap/transport/imap-client-session.vala | 51 ++++++++++++++--------
2 files changed, 45 insertions(+), 33 deletions(-)
---
diff --git a/src/engine/imap/command/imap-command.vala b/src/engine/imap/command/imap-command.vala
index 76964b17..990b0fc9 100644
--- a/src/engine/imap/command/imap-command.vala
+++ b/src/engine/imap/command/imap-command.vala
@@ -243,9 +243,17 @@ public class Geary.Imap.Command : BaseObject {
);
}
+ check_has_status();
+
// Since this is part of the public API, perform a strict
// check on the status code.
- check_status(true);
+ if (this.status.status == Status.BAD) {
+ throw new ImapError.SERVER_ERROR(
+ "%s: Command failed: %s",
+ to_brief_string(),
+ this.status.to_string()
+ );
+ }
}
public virtual string to_string() {
@@ -276,9 +284,8 @@ public class Geary.Imap.Command : BaseObject {
this.response_timer.reset();
this.complete_lock.blind_notify();
cancel_send();
- // Since this gets called by the client connection only check
- // for an expected server response, good or bad
- check_status(false);
+
+ check_has_status();
}
/**
@@ -340,7 +347,7 @@ public class Geary.Imap.Command : BaseObject {
}
}
- private void check_status(bool require_okay) throws ImapError {
+ private void check_has_status() throws ImapError {
if (this.status == null) {
throw new ImapError.SERVER_ERROR(
"%s: No command response was received",
@@ -355,16 +362,6 @@ public class Geary.Imap.Command : BaseObject {
this.status.to_string()
);
}
-
- // XXX should we be distinguishing between NO and BAD
- // responses here?
- if (require_okay && this.status.status != Status.OK) {
- throw new ImapError.SERVER_ERROR(
- "%s: Command failed: %s",
- to_brief_string(),
- this.status.to_string()
- );
- }
}
private string to_brief_string() {
diff --git a/src/engine/imap/transport/imap-client-session.vala
b/src/engine/imap/transport/imap-client-session.vala
index 0b62370f..d0d86baa 100644
--- a/src/engine/imap/transport/imap-client-session.vala
+++ b/src/engine/imap/transport/imap-client-session.vala
@@ -835,6 +835,10 @@ public class Geary.Imap.ClientSession : BaseObject {
/**
* Performs the LOGIN command using the supplied credentials.
*
+ * Throws {@link ImapError.UNAUTHENTICATED} if the credentials are
+ * bad, unsupported, or if authentication actually failed. Returns
+ * the status response for the command otherwise.
+ *
* @see initiate_session_async
*/
public async StatusResponse login_async(Geary.Credentials credentials,
@@ -877,32 +881,40 @@ public class Geary.Imap.ClientSession : BaseObject {
// should always proceed; only an Error could change this
assert(params.proceed);
- GLib.Error? login_err = null;
- try {
- yield command_transaction_async(cmd, cancellable);
- } catch (Error err) {
- login_err = err;
- }
+ StatusResponse response = yield command_transaction_async(
+ cmd, cancellable
+ );
- if (login_err != null) {
+ if (response.status != Status.OK) {
// Throw an error indicating auth failed here, unless
// there is a status response and it indicates that the
// server is merely reporting login as being unavailable,
// then don't since the creds might actually be fine.
- ResponseCodeType? code_type = null;
- if (cmd.status != null) {
- ResponseCode? code = cmd.status.response_code;
- if (code != null) {
- code_type = code.get_response_code_type();
+ ResponseCode? code = response.response_code;
+ if (code != null) {
+ ResponseCodeType? code_type = code.get_response_code_type();
+ if (code_type != null) {
+ switch (code_type.value) {
+ case ResponseCodeType.UNAVAILABLE:
+ throw new ImapError.UNAVAILABLE(
+ "Login restricted: %s: ", response.to_string()
+ );
+
+ case ResponseCodeType.AUTHENTICATIONFAILED:
+ // pass through to the error being thrown below
+ break;
+
+ default:
+ throw new ImapError.SERVER_ERROR(
+ "Login error: %s: ", response.to_string()
+ );
+ }
}
}
- if (code_type == null ||
- code_type.value != ResponseCodeType.UNAVAILABLE) {
- throw new ImapError.UNAUTHENTICATED(login_err.message);
- } else {
- throw login_err;
- }
+ throw new ImapError.UNAUTHENTICATED(
+ "Bad credentials: %s: ", response.to_string()
+ );
}
return cmd.status;
@@ -1715,6 +1727,9 @@ public class Geary.Imap.ClientSession : BaseObject {
this.cx.send_command(cmd);
yield cmd.wait_until_complete(cancellable);
+
+ // This won't be null since the Command.wait_until_complete
+ // will throw an error if it is.
return cmd.status;
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]