[geary/wip/156-mailbox-not-exist: 2/2] Update Imap.ClientSession now IMAP NO commands aren't treated as errors
- From: Michael Gratton <mjog src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [geary/wip/156-mailbox-not-exist: 2/2] Update Imap.ClientSession now IMAP NO commands aren't treated as errors
- Date: Sun, 31 Mar 2019 15:02:58 +0000 (UTC)
commit 71d8c8b1a4aee86cb358ef7ce80449e5b648759b
Author: Michael Gratton <mike vee net>
Date: Mon Apr 1 02:01:04 2019 +1100
Update Imap.ClientSession now IMAP NO commands aren't treated as errors
Check the response code when logging in for the command, and handle as
appropriate.
src/engine/imap/transport/imap-client-session.vala | 51 ++++++++++++++--------
test/integration/imap/client-session.vala | 6 +++
2 files changed, 39 insertions(+), 18 deletions(-)
---
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;
}
diff --git a/test/integration/imap/client-session.vala b/test/integration/imap/client-session.vala
index 6cf5ec2e..957cbde6 100644
--- a/test/integration/imap/client-session.vala
+++ b/test/integration/imap/client-session.vala
@@ -62,6 +62,12 @@ class Integration.Imap.ClientSession : TestCase {
assert_not_reached();
} catch (Geary.ImapError.UNAUTHENTICATED err) {
// All good
+ } catch (Geary.ImapError.SERVER_ERROR err) {
+ // Some servers (Y!) return AUTHORIZATIONFAILED response
+ // code if the login (not password) is bad
+ if (!("AUTHORIZATIONFAILED" in err.message)) {
+ throw err;
+ }
}
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]