diff options
author | x-yl <kylepereira@mail.com> | 2021-06-01 19:10:20 +0400 |
---|---|---|
committer | Ali Mohammad Pur <Ali.mpfard@gmail.com> | 2021-06-11 23:58:28 +0430 |
commit | f00c2c0192c5f99b6924e99b574f014f5dc8ffc4 (patch) | |
tree | b86cad23e3e5f0658dbe6b3734b397ee55923975 /Userland/Libraries/LibIMAP | |
parent | 2f04d24b66f8bd234341f34c3f4047d77a639532 (diff) | |
download | serenity-f00c2c0192c5f99b6924e99b574f014f5dc8ffc4.zip |
LibIMAP: Support for LOGIN and LOGOUT
Diffstat (limited to 'Userland/Libraries/LibIMAP')
-rw-r--r-- | Userland/Libraries/LibIMAP/Client.cpp | 10 | ||||
-rw-r--r-- | Userland/Libraries/LibIMAP/Client.h | 1 | ||||
-rw-r--r-- | Userland/Libraries/LibIMAP/Objects.h | 16 | ||||
-rw-r--r-- | Userland/Libraries/LibIMAP/Parser.cpp | 4 |
4 files changed, 31 insertions, 0 deletions
diff --git a/Userland/Libraries/LibIMAP/Client.cpp b/Userland/Libraries/LibIMAP/Client.cpp index 07ad200a13..c3a2496aa7 100644 --- a/Userland/Libraries/LibIMAP/Client.cpp +++ b/Userland/Libraries/LibIMAP/Client.cpp @@ -114,6 +114,10 @@ static ReadonlyBytes command_byte_buffer(CommandType command) return "NOOP"sv.bytes(); case CommandType::Capability: return "CAPABILITY"sv.bytes(); + case CommandType::Logout: + return "LOGOUT"sv.bytes(); + case CommandType::Login: + return "LOGIN"sv.bytes(); case CommandType::List: return "LIST"sv.bytes(); case CommandType::Select: @@ -157,6 +161,12 @@ RefPtr<Promise<Optional<T>>> cast_promise(RefPtr<Promise<Optional<Response>>> pr return new_promise; } +RefPtr<Promise<Optional<SolidResponse>>> Client::login(StringView username, StringView password) +{ + auto command = Command { CommandType::Login, m_current_command, { username, password } }; + return cast_promise<SolidResponse>(send_command(move(command))); +} + RefPtr<Promise<Optional<SolidResponse>>> Client::list(StringView reference_name, StringView mailbox) { auto command = Command { CommandType::List, m_current_command, diff --git a/Userland/Libraries/LibIMAP/Client.h b/Userland/Libraries/LibIMAP/Client.h index 026173bae9..2709cef594 100644 --- a/Userland/Libraries/LibIMAP/Client.h +++ b/Userland/Libraries/LibIMAP/Client.h @@ -21,6 +21,7 @@ public: RefPtr<Promise<Optional<Response>>> send_command(Command&&); RefPtr<Promise<Optional<Response>>> send_simple_command(CommandType); void send_raw(StringView data); + RefPtr<Promise<Optional<SolidResponse>>> login(StringView username, StringView password); RefPtr<Promise<Optional<SolidResponse>>> list(StringView reference_name, StringView mailbox_name); RefPtr<Promise<Optional<SolidResponse>>> select(StringView string); diff --git a/Userland/Libraries/LibIMAP/Objects.h b/Userland/Libraries/LibIMAP/Objects.h index 819a125a1f..be79e6f624 100644 --- a/Userland/Libraries/LibIMAP/Objects.h +++ b/Userland/Libraries/LibIMAP/Objects.h @@ -19,6 +19,8 @@ namespace IMAP { enum class CommandType { Capability, List, + Login, + Logout, Noop, Select, }; @@ -50,6 +52,7 @@ enum class ResponseType : unsigned { UIDValidity = 1u << 6, Unseen = 1u << 7, PermanentFlags = 1u << 8, + Bye = 1u << 13, }; class Parser; @@ -208,6 +211,18 @@ public: return m_permanent_flags; } + void set_bye(Optional<String> message) + { + add_response_type(ResponseType::Bye); + m_bye_message = move(message); + } + + Optional<String>& bye_message() + { + VERIFY(contains_response_type(ResponseType::Bye)); + return m_bye_message; + } + private: unsigned m_response_type; @@ -222,6 +237,7 @@ private: unsigned m_unseen {}; Vector<String> m_permanent_flags; Vector<String> m_flags; + Optional<String> m_bye_message; }; class SolidResponse { diff --git a/Userland/Libraries/LibIMAP/Parser.cpp b/Userland/Libraries/LibIMAP/Parser.cpp index 72514d87e8..15b7a9df27 100644 --- a/Userland/Libraries/LibIMAP/Parser.cpp +++ b/Userland/Libraries/LibIMAP/Parser.cpp @@ -179,6 +179,10 @@ void Parser::parse_untagged() parse_while([](u8 x) { return x != '\r'; }); consume("\r\n"); } + } else if (try_consume("BYE")) { + auto message = parse_while([](u8 x) { return x != '\r'; }); + consume("\r\n"); + m_response.data().set_bye(message.is_empty() ? Optional<String>() : Optional<String>(message)); } else { auto x = parse_while([](u8 x) { return x != '\r'; }); consume("\r\n"); |