diff mbox series

[bug#51853,2/2] gnu: sendgmail: Don't limit domain name of sender.

Message ID 20211114204649.94670-2-philip@philipmcgrath.com
State Accepted
Headers show
Series gnu: sendgmail: Rename package; don't limit domain. | expand

Checks

Context Check Description
cbaines/comparison success View comparision
cbaines/git branch success View Git branch
cbaines/applying patch success View Laminar job
cbaines/issue success View issue

Commit Message

Philip McGrath Nov. 14, 2021, 8:46 p.m. UTC
There are three open pull requests adding this functionality:

  - https://github.com/google/gmail-oauth2-tools/pull/17 (October 2019)
  - https://github.com/google/gmail-oauth2-tools/pull/26 (May 2020)
  - https://github.com/google/gmail-oauth2-tools/pull/37 (May 2021)
    (The patch here is identical to #26, so I just closed this one.)

Meanwhile, the most recent commit to the upstream repository was in
May 2019: that was the commit that first added `sendgmail`.

This commit adjusts Guix's `sendgmail`, following Postel's advice,
to make the command "liberal in its receiving behavior" (RFC 760):
it always accepts email addresses with any domain name, as in #26,
and it accepts (and ignores) the `-gsuite` flag used in #17.

* gnu/packages/patches/sendgmail-remove-domain-restriction.patch:
New file. This is the patch from #26.
* gnu/packages/patches/sendgmail-accept-ignored-gsuite-flag.patch:
New file, based on #17.
* gnu/local.mk (dist_patch_DATA): Add the new patches.
* gnu/packages/mail.scm (sendgmail)[source]: Apply the new patches.
Increment the "revision" argument to `git-version` from 0 to 1.
---

In case you are asking, "What does it mean for send*G*mail to support
non-`@gmail.com` email addresses?", here's some more context. As part of the
product variously known as Google Apps for Your Domain, GSuite, and, most
recently, Google Workspace, Google offers email hosting for arbitrary domains
(e.g. for work or schol, or from the "legacy free [gratis] edition"). The
Gmail API works for all of these domains, but the upstream version of the
`sendgmail` command checks that the email address passed as `-sender=` ends
with "@gmail.com".

The first fork to remove this limitation seems to have
been <https://github.com/google/gmail-oauth2-tools/pull/17>
by Flameeyes (Diego Elio Pettenò), which added an optional `-gsuite` flag to
disable the check, and thereby enable alternate domains. This approach has a
number of nice features. (I tried it for a while, and I've sent patches to
Guix with this fork.) In particular, by making alternative domains opt-in, it
preserves the nice error message for people who have merely made a typo.

The main disadvantage is that, in the time since the pull request was opened,
the product has been renamed, so it seems unlikely that the `-gsuite` flag
will be merged upstream. The history of this product's name also suggests that
a `-googleworkspace` flag might suffer the same fate eventually.

A second approach was taken by Tamas K Lengyel
in <https://github.com/google/gmail-oauth2-tools/pull/26>, which simply removes
the "@gmail.com" check altogether. On the other hand, this fork's `sendgmail`
fails with a usage note if it is passed a `-gsuite` flag.
(Later, I came up with exactly the same patch; I only realized after I
opened <https://github.com/google/gmail-oauth2-tools/pull/37> that of course I
wasn't the first to want this feature.)

Usually I want to err on the side of validation, but I've come to think that
being permissive is the right trade-off in this case. The usual way of using
`sendgmail` is as a backend to `git send-email`, and, in that case, you aren't
supplying `-sender=` interactively: you'll set it up once with `git config`
when you get your API token, and then you'll forget about it until you set up
a new machine (or accidently remove the root that was protecting your command
from `guix gc` ...). Ultimately, the standard for whether a `-sender=` is
valid is whether the server you're talking to will accept it. If the server's
error message does turn out to be slightly less good, people who are using
`git send-email` seem likely to be able to cope.

In that spirit, this commit applies Tamas's patch, but also adds another patch
to gracefully accept and ignore the `-gsuite` flag from Flameeyes's fork. If
your configuration or script worked with any of these `sendgmail` forks, it
should also work with the revised Guix package.

P.S. I've put the two patches to `sendgmail` in a Git repository at

    https://github.com/LiberalArtist/gmail-oauth2-tools/tree/guix-issue-51853

to make it easier to see the changes in context.

~Philip


 gnu/local.mk                                  |  2 +
 gnu/packages/mail.scm                         | 11 +++++-
 ...sendgmail-accept-ignored-gsuite-flag.patch | 39 +++++++++++++++++++
 .../sendgmail-remove-domain-restriction.patch | 34 ++++++++++++++++
 4 files changed, 84 insertions(+), 2 deletions(-)
 create mode 100644 gnu/packages/patches/sendgmail-accept-ignored-gsuite-flag.patch
 create mode 100644 gnu/packages/patches/sendgmail-remove-domain-restriction.patch
diff mbox series

Patch

diff --git a/gnu/local.mk b/gnu/local.mk
index 208875754b..37ad7bf7d7 100644
--- a/gnu/local.mk
+++ b/gnu/local.mk
@@ -1772,6 +1772,8 @@  dist_patch_DATA =						\
   %D%/packages/patches/screen-hurd-path-max.patch		\
   %D%/packages/patches/sdl-libx11-1.6.patch			\
   %D%/packages/patches/seed-webkit.patch			\
+  %D%/packages/patches/sendgmail-accept-ignored-gsuite-flag.patch	\
+  %D%/packages/patches/sendgmail-remove-domain-restriction.patch	\
   %D%/packages/patches/seq24-rename-mutex.patch			\
   %D%/packages/patches/serf-python3.patch			\
   %D%/packages/patches/shakespeare-spl-fix-grammar.patch		\
diff --git a/gnu/packages/mail.scm b/gnu/packages/mail.scm
index 4ee878d4c6..f29044608f 100644
--- a/gnu/packages/mail.scm
+++ b/gnu/packages/mail.scm
@@ -4607,7 +4607,7 @@  (define-public rss2email
 
 (define-public sendgmail
   (let ((commit "e3229155a4037267ce40f1a3a681f53221aa4d8d")
-        (revision "0"))
+        (revision "1"))
     (package
       (name "sendgmail")
       (version (git-version "0.0.0" revision commit))
@@ -4618,6 +4618,9 @@  (define-public sendgmail
                (url "https://github.com/google/gmail-oauth2-tools")
                (commit commit)))
          (file-name (git-file-name name version))
+         (patches (search-patches
+                   "sendgmail-remove-domain-restriction.patch"
+                   "sendgmail-accept-ignored-gsuite-flag.patch"))
          (sha256
           (base32
            "1cxpkiaajhq1gjsg47r2b5xgck0r63pvkyrkm7af8c8dw7fyn64f"))))
@@ -4637,5 +4640,9 @@  (define-public sendgmail
        "The @command{sendgmail} command provides a minimal sendmail-compatible
 front-end that connects to Gmail using OAuth2.  It is specifically designed
 for use with @code{git send-email}.  The command needs a Gmail API key to
-function.")
+function.
+
+Guix's version of @command{sendgmail} has been patched for compatibility with
+all known forks, including support for non-@code{@@gmail.com} email
+addresses.")
       (license license:asl2.0))))
diff --git a/gnu/packages/patches/sendgmail-accept-ignored-gsuite-flag.patch b/gnu/packages/patches/sendgmail-accept-ignored-gsuite-flag.patch
new file mode 100644
index 0000000000..8405ff4e42
--- /dev/null
+++ b/gnu/packages/patches/sendgmail-accept-ignored-gsuite-flag.patch
@@ -0,0 +1,39 @@ 
+From 854490dc4a8a6a661b4750730c3ff749519f6e36 Mon Sep 17 00:00:00 2001
+From: Philip McGrath <philip@philipmcgrath.com>
+Date: Sun, 14 Nov 2021 10:14:24 -0500
+Subject: [PATCH] sendgmail: accept and ignore a "-gsuite" flag
+
+Accepting a "-gsuite" flag provides compatability with
+https://github.com/Flameeyes/gmail-oauth2-tools/commit/eabb456
+so users do not have to change their scripts or config files.
+
+Full hash of original: eabb45608ff4ce04045ff4ea92d05450e789ac81
+
+Related to https://github.com/google/gmail-oauth2-tools/pull/17
+---
+ go/sendgmail/main.go | 2 ++
+ 1 file changed, 2 insertions(+)
+
+diff --git a/go/sendgmail/main.go b/go/sendgmail/main.go
+index 405aa1b..5cfd0c1 100644
+--- a/go/sendgmail/main.go
++++ b/go/sendgmail/main.go
+@@ -40,6 +40,7 @@ var (
+ 	setUp  bool
+ 	dummyF string
+ 	dummyI bool
++	gsuite bool
+ )
+ 
+ func init() {
+@@ -47,6 +48,7 @@ func init() {
+ 	flag.BoolVar(&setUp, "setup", false, "If true, sendgmail sets up the sender's OAuth2 token and then exits.")
+ 	flag.StringVar(&dummyF, "f", "", "Dummy flag for compatibility with sendmail.")
+ 	flag.BoolVar(&dummyI, "i", true, "Dummy flag for compatibility with sendmail.")
++	flag.BoolVar(&gsuite, "gsuite", true, "Dummy flag for compatibility with other forks of sendgmail.")
+ }
+ 
+ func main() {
+-- 
+2.32.0
+
diff --git a/gnu/packages/patches/sendgmail-remove-domain-restriction.patch b/gnu/packages/patches/sendgmail-remove-domain-restriction.patch
new file mode 100644
index 0000000000..d23af33375
--- /dev/null
+++ b/gnu/packages/patches/sendgmail-remove-domain-restriction.patch
@@ -0,0 +1,34 @@ 
+From a5ecd1b2302d0def2f6f8349747022a615a9f017 Mon Sep 17 00:00:00 2001
+From: Tamas K Lengyel <tamas@tklengyel.com>
+Date: Tue, 26 May 2020 13:27:50 -0600
+Subject: [PATCH] Don't limit to email with @gmail.com
+
+---
+ go/sendgmail/main.go | 4 ----
+ 1 file changed, 4 deletions(-)
+
+diff --git a/go/sendgmail/main.go b/go/sendgmail/main.go
+index b35ef23..405aa1b 100644
+--- a/go/sendgmail/main.go
++++ b/go/sendgmail/main.go
+@@ -30,7 +30,6 @@ import (
+ 	"log"
+ 	"net/smtp"
+ 	"os"
+-	"strings"
+ 
+ 	"golang.org/x/oauth2"
+ 	googleOAuth2 "golang.org/x/oauth2/google"
+@@ -52,9 +51,6 @@ func init() {
+ 
+ func main() {
+ 	flag.Parse()
+-	if atDomain := "@gmail.com"; !strings.HasSuffix(sender, atDomain) {
+-		log.Fatalf("-sender must specify an %v email address.", atDomain)
+-	}
+ 	config := getConfig()
+ 	tokenPath := fmt.Sprintf("%v/.sendgmail.%v.json", os.Getenv("HOME"), sender)
+ 	if setUp {
+-- 
+2.32.0
+