summaryrefslogtreecommitdiff
path: root/Userland/Libraries/LibIMAP
diff options
context:
space:
mode:
authorx-yl <kylepereira@mail.com>2021-06-01 19:10:20 +0400
committerAli Mohammad Pur <Ali.mpfard@gmail.com>2021-06-11 23:58:28 +0430
commitf00c2c0192c5f99b6924e99b574f014f5dc8ffc4 (patch)
treeb86cad23e3e5f0658dbe6b3734b397ee55923975 /Userland/Libraries/LibIMAP
parent2f04d24b66f8bd234341f34c3f4047d77a639532 (diff)
downloadserenity-f00c2c0192c5f99b6924e99b574f014f5dc8ffc4.zip
LibIMAP: Support for LOGIN and LOGOUT
Diffstat (limited to 'Userland/Libraries/LibIMAP')
-rw-r--r--Userland/Libraries/LibIMAP/Client.cpp10
-rw-r--r--Userland/Libraries/LibIMAP/Client.h1
-rw-r--r--Userland/Libraries/LibIMAP/Objects.h16
-rw-r--r--Userland/Libraries/LibIMAP/Parser.cpp4
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");