Commit Graph

41 Commits

Author SHA1 Message Date
Alec Murphy
d73bad14ea LibIMAP+Mail: Show unseen message count for mailboxes
This PR implements the standard behavior of displaying the mailbox name
and parenthesized unseen message count in bold when the unseen message
count is greater than zero.
2024-08-24 21:52:44 -04:00
Alec Murphy
430c6cc43d LibIMAP: Handle escaped quotes in parse_quoted_string()
This PR fixes truncation of quoted strings containing escaped quotes,
which were not being handled properly by the parser, resulting in
occasional crashes.
2024-07-27 17:33:50 -04:00
Alec Murphy
787d8344d9 LibIMAP: Properly parse parenthesized address lists
This PR fixes a crash where the parser assumes parenthesized lists of
address structures should be separated by whitespace. Per RFC-9051,
there is no indication of this.
2024-07-27 13:20:25 -04:00
Alec Murphy
dd59bfd52b LibIMAP: Avoid crashing on Group Addresses
This PR avoids crashing the parser when a group address is encountered,
and keeps the Mail reader happy :^).

Eventually, when we are able to send messages, we may want some kind of
GroupAddress object, but for now this should be ok.
2024-07-27 10:26:37 -04:00
Shannon Booth
e2e7c4d574 Everywhere: Use to_number<T> instead of to_{int,uint,float,double}
In a bunch of cases, this actually ends up simplifying the code as
to_number will handle something such as:

```
Optional<I> opt;
if constexpr (IsSigned<I>)
    opt = view.to_int<I>();
else
    opt = view.to_uint<I>();
```

For us.

The main goal here however is to have a single generic number conversion
API between all of the String classes.
2023-12-23 20:41:07 +01:00
Ali Mohammad Pur
5e1499d104 Everywhere: Rename {Deprecated => Byte}String
This commit un-deprecates DeprecatedString, and repurposes it as a byte
string.
As the null state has already been removed, there are no other
particularly hairy blockers in repurposing this type as a byte string
(what it _really_ is).

This commit is auto-generated:
  $ xs=$(ack -l \bDeprecatedString\b\|deprecated_string AK Userland \
    Meta Ports Ladybird Tests Kernel)
  $ perl -pie 's/\bDeprecatedString\b/ByteString/g;
    s/deprecated_string/byte_string/g' $xs
  $ clang-format --style=file -i \
    $(git diff --name-only | grep \.cpp\|\.h)
  $ gn format $(git ls-files '*.gn' '*.gni')
2023-12-17 18:25:10 +03:30
Tim Ledbetter
4b995542c4 LibIMAP: Make parsing of atom data fallible
We now return an error where `parse_atom()` would have previously
returned an empty StringView. This is consistent with RFC3501, which
says that an atom consists of one or more characters.

This prevents a few cases where parsing an invalid atom could lead to
an infinite loop.
2023-11-08 09:36:37 +01:00
Tim Ledbetter
54a28afc13 LibIMAP: Stop parsing immediately on error
This makes the parser more resilient to invalid IMAP messages.

Usages of `Optional` have also been removed where the empty case is
equivalent to an empty object.
2023-10-13 11:12:18 -06:00
Tim Ledbetter
29c477598c LibIMAP: Rename Parser::try_consume() to consume_if() 2023-10-13 11:12:18 -06:00
Karol Kosek
f789d26e37 LibIMAP+Mail: Rename MultiPartBody's mime_type to multipart_subtype 2023-09-09 11:19:37 -06:00
Karol Kosek
642a3f85ef LibIMAP: Parse body-type-msg to spec 2023-09-09 11:19:37 -06:00
Karol Kosek
4a92d712ea LibIMAP: Don't parse starting space directly in parse_envelope
Makes parse_envelope() look like the defined ABNF rule and the parser
will no longer try to consume double spaces in body-type-msg.
2023-09-09 11:19:37 -06:00
Karol Kosek
e9cf35fd60 LibIMAP: Parse body-ext-1part for every one part body type
Previously we were only doing it only for body-type-text, which isn't
correct to spec.

Fixes a crash when parsing a BODYSTRUCTURE response on a mail with
attachments.
2023-09-09 11:19:37 -06:00
Karol Kosek
a61a66c685 LibIMAP: Simplify parsing one part body structure
Each branch was very similar, so let's merge common parts together for
clarity. Also added corresponding ABNF rules names while I'm here. :^)

No behavior change.
2023-09-09 11:19:37 -06:00
Valtteri Koskivuori
2b23f3f216 LibIMAP: Fix Parser::parse_disposition()
It didn't consume the initial opening "(" before.
2023-08-12 11:45:52 -06:00
Valtteri Koskivuori
35f1cec7ca LibIMAP: Propagate errors from Parser::parse_number()
More error propagation is still needed, we really want the parser to
just crash early when it encounters unexpected input, instead of trying
to carry on like nothing happened.
I think ErrorOr<unsigned> is *much* better than returning (unsigned)-1
to indicate an error ;)
2023-08-12 11:45:52 -06:00
Valtteri Koskivuori
0b7e18177b LibIMAP: Rename position -> m_position in IMAP::Parser
No functional changes, just renaming this member variable to bring that
in line with current coding style.
2023-08-12 11:45:52 -06:00
Valtteri Koskivuori
8451c4d91c LibIMAP: Add useful dbgln_if() printouts to IMAP::Parser
I couldn't run the parser in a debugger like I normally would, so I
added printouts to understand where the parser is failing.
More could be added, but these are enough to get a good idea of what
the parser is doing. It's very spammy, though, so enable it by flicking
the IMAP_PARSER_DEBUG switch :^)
2023-08-12 11:45:52 -06:00
Valtteri Koskivuori
c2ed1547ba LibIMAP: Remove needless conversion to DeprecatedString
We're comparing the return value to StringViews right after, so there is
no need to do the conversion twice.
2023-08-12 11:45:52 -06:00
Andreas Kling
a504ac3e2a Everywhere: Rename equals_ignoring_case => equals_ignoring_ascii_case
Let's make it clear that these functions deal with ASCII case only.
2023-03-10 13:15:44 +01:00
Linus Groh
6e7459322d AK: Remove StringBuilder::build() in favor of to_deprecated_string()
Having an alias function that only wraps another one is silly, and
keeping the more obvious name should flush out more uses of deprecated
strings.
No behavior change.
2023-01-27 20:38:49 +00:00
Linus Groh
57dc179b1f Everywhere: Rename to_{string => deprecated_string}() where applicable
This will make it easier to support both string types at the same time
while we convert code, and tracking down remaining uses.

One big exception is Value::to_string() in LibJS, where the name is
dictated by the ToString AO.
2022-12-06 08:54:33 +01:00
Linus Groh
6e19ab2bbc AK+Everywhere: Rename String to DeprecatedString
We have a new, improved string type coming up in AK (OOM aware, no null
state), and while it's going to use UTF-8, the name UTF8String is a
mouthful - so let's free up the String name by renaming the existing
class.
Making the old one have an annoying name will hopefully also help with
quick adoption :^)
2022-12-06 08:54:33 +01:00
sin-ack
3f3f45580a Everywhere: Add sv suffix to strings relying on StringView(char const*)
Each of these strings would previously rely on StringView's char const*
constructor overload, which would call __builtin_strlen on the string.
Since we now have operator ""sv, we can replace these with much simpler
versions. This opens the door to being able to remove
StringView(char const*).

No functional changes.
2022-07-12 23:11:35 +02:00
Idan Horowitz
ace36681ff LibJS+LibIMAP: Use the new Optional<U>(Optional<T>) constructor
These look much nicer than these repeated ternaries :^)
2022-01-23 18:53:42 +02:00
Linus Groh
028e4bd2ae LibIMAP: Parse (but ignore) OK [HIGHESTMODSEQ <mod-sequence-value>]
Parse it to avoid dbgln() spam, but ignore the value for now. See:
https://datatracker.ietf.org/doc/html/rfc4551#section-3.1.1
2021-07-24 22:22:41 +01:00
Linus Groh
66e47d05c5 LibIMAP: Parse OK [CLOSED]
In my case the mail server responded with the following after selecting
a mailbox (in the Mail application):

    * OK [CLOSED] Previous mailbox closed.
    * FLAGS (\Answered \Flagged ...)
    * OK [PERMANENTFLAGS (\Answered \Flagged ... \*)] Flags permitted.
    * 2 EXISTS
    * 0 RECENT
    * OK [UIDVALIDITY 1234567890] UIDs valid
    * OK [UIDNEXT 12345] Predicted next UID
    * OK [HIGHESTMODSEQ 123456] Highest
    A6 OK [READ-WRITE] Select completed (0.002 secs).

The [CLOSED] part threw the parser off as it was expecting a space after
the atom following the opening bracket, which would actually lead to a
crash of Mail (AK::Optional::value() without value).
2021-07-24 22:22:41 +01:00
Linus Groh
73a9d2ec32 LibIMAP: Replace abuse of String::matches() with == in the parser
matches() is for globs. These are not globs.
2021-07-24 22:22:41 +01:00
Linus Groh
ddd11b98d9 LibIMAP: Add and use Parser::consume_until_end_of_line() 2021-07-24 22:22:41 +01:00
Linus Groh
8c05b4e137 LibIMAP: Rename IMAP::Parser::{parse => consume}_while()
This isn't parsing anything.
2021-07-24 22:22:41 +01:00
Luke
e80f8746b1 LibIMAP: Use try_parse_number instead of parse_number when parsing parts
This makes it so we can use Optional instead of relying on an error
number.
2021-07-24 20:11:28 +04:30
Luke
2c793d5935 LibIMAP: Make Section::parts unsigned 2021-07-24 20:11:28 +04:30
x-yl
9174fabf05 LibIMAP: Support for remaining IMAP commands
These include APPEND, AUTHENTICATE, CHECK, CLOSE, EXAMINE, EXPUNGE,
LSUB, SUBSCRIBE, UNSUBSCRIBE
2021-06-11 23:58:28 +04:30
x-yl
076c708d0a LibIMAP: Support for STORE and STATUS 2021-06-11 23:58:28 +04:30
x-yl
a6339297ec LibIMAP: Support for the SEARCH command 2021-06-11 23:58:28 +04:30
x-yl
318709c8ca LibIMAP: Support for FETCH BodyStructure
This completes the implementation of the FETCH command.
2021-06-11 23:58:28 +04:30
x-yl
c152a9a594 LibIMAP: Support for the FETCH command (*mostly)
This commit doesn't include support for FETCH BODY, because it's a bit
big already. Rest assured, FETCH is the most complicated IMAP command,
and we'll go back to simple boring ones shortly.
2021-06-11 23:58:28 +04:30
x-yl
f00c2c0192 LibIMAP: Support for LOGIN and LOGOUT 2021-06-11 23:58:28 +04:30
x-yl
2f04d24b66 LibIMAP: Support for the LIST and SELECT commands 2021-06-11 23:58:28 +04:30
x-yl
0f42ea6770 LibIMAP: Support for CAPABILITY command & response
This involves parsing messages with untagged responses
2021-06-11 23:58:28 +04:30
x-yl
8c6061fc4a LibIMAP: Add a new IMAP client and support NOOP
A large commit, but sets up the framework for how the IMAP library will
work. Right now only the NOOP command and response is supported.
2021-06-11 23:58:28 +04:30