Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Use a shared SASL implementation #69

Draft
wants to merge 9 commits into
base: master
Choose a base branch
from

Conversation

nevans
Copy link
Contributor

@nevans nevans commented Oct 9, 2023

Builds on the following other PRs:

As currently written, this also depends on the following net-imap PRs:

After those PRs are applied, this PR creates an adapter that is compatible with Authenticator and #authenticate and registers it as a generic default for mechanisms that haven't otherwise been added (as subclasses of Authenticator). This adapter then delegates to net-imap's SASL implementation. Every other mechanism supported by net-imap v0.4.1 is added here:

  • ANONYMOUS
  • DIGEST-MD5 (deprecated)
  • EXTERNAL
  • OAUTHBEARER
  • SCRAM-SHA-1 and SCRAM-SHA-256
  • XOAUTH

TODO: Ideally, net-smtp and net-imap should both depend on a shared sasl or net-sasl gem, rather than keep the SASL implementation inside one or the other. See ruby/net-imap#23.

In this PR, the current Net::SMTP::Authenticator implementation is still used by the PLAIN, LOGIN, and CRAM-MD5 mechanisms. PR #70 removes the current authenticators are replaces them with this.

Related issues:

@nevans nevans force-pushed the sasl/net-imap-fallback branch 2 times, most recently from 6bb82aa to a5b654b Compare October 9, 2023 22:14
@nevans nevans changed the title Use net-imap SASL implementation Use a shared SASL implementation Oct 9, 2023
@nevans nevans marked this pull request as draft October 9, 2023 22:20
@nevans nevans force-pushed the sasl/net-imap-fallback branch 7 times, most recently from dcfc541 to 4913bf4 Compare October 14, 2023 17:06
@nevans nevans force-pushed the sasl/net-imap-fallback branch 8 times, most recently from 7e8fa6f to 08eff09 Compare October 21, 2023 00:28
@nevans nevans force-pushed the sasl/net-imap-fallback branch 2 times, most recently from 45f893a to 92b67d4 Compare November 9, 2023 15:42
This adds a new `auth` keyword param to `Net::SMTP.start` and `#start`
that can be used to pass any arbitrary keyword parameters to
`#authenticate`.  The pre-existing `username`, `secret`, etc keyword
params will retain their existing behavior as positional arguments to
`#authenticate`.
Although "user" is a reasonable abbreviation, the parameter is more
accurately described as a "username" or an "authentication identity".
They are synonomous here, with "username" winning when both are present.
Username can be set by args[0], authcid, username, or user.
Secret can be set by args[1], secret, or password.

Since all of the existing authenticators have the same API, it is
sufficient to update `check_args` in the base class.
This API is a little bit confusing, IMO.  But it does preserve backward
compatibility, while allowing authenticators that don't allow positional
parameters to work without crashing.  But, authenticators that require
only one parameter—or more than three—will still be inaccessible.
This is convenient for `smtp.start auth: {type:, **etc}`.
Although `#authenticate` can be updated to make username and secret
_both_ optional, by placing the mechanism last and making it optional,
it's not possible to use an authenticator with a _single_ positional
parameter or with more than two positional parameters.  By placing
`type` first among positional parameters or as a keyword argument, we
avoid this problem.
The net-imap dependency requires 2.7.3, to deal with kwargs.
This commit adds the `net-imap` as a default fallback for mechanisms
that haven't otherwise been added.  In this commit, the original
implementation is still used by `#authenticate` for the `PLAIN`,
`XOAUTH2`, `LOGIN`, and `CRAM-MD5` mechanisms.  Every other mechanism
supported by `net-imap` v0.4.0 is added here:
* `ANONYMOUS`
* `DIGEST-MD5` _(deprecated)_
* `EXTERNAL`
* `OAUTHBEARER`
* `SCRAM-SHA-1` and `SCRAM-SHA-256`

**TODO:** Ideally, `net-smtp` and `net-imap` should both depend on a
shared `sasl` or `net-sasl` gem, rather than keep the SASL
implementation inside one or the other.  See
ruby/net-imap#23.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
1 participant