mirror of
https://github.com/hanzoai/mail.git
synced 2026-09-23 23:53:02 +00:00
Rename Go module path to github.com/hanzoai/mail
Fork of github.com/mjl-/mox at 5656ca6d1b
(upstream v0.0.15 plus 55 commits).
Rename the module path in go.mod and the import paths in 268 Go files. Also
update the five scripts that "go install" the module (genwebsite.sh,
docker-release.sh, apidiff.sh, test-upgrade.sh, Dockerfile.release), which
would otherwise build upstream rather than this fork.
Add NOTICE recording the upstream project, author, license, and fork point,
and stating which license covers which files: MIT for the mox source and our
changes, MPL-2.0 for publicsuffix/public_suffix_list.txt alone, and the
vendored dependencies' own licenses under licenses/. Embed NOTICE so
"mail licenses" prints the lineage from the running binary. LICENSE.MIT,
LICENSE.MPLv2.0 and the licenses/ tree are preserved verbatim; no code is
relicensed.
The mox command name, config keys, data directory layout and website content
are unchanged. LLM.md records the fork point, the rename, what was left alone,
and the steps to stand the server up.
Co-authored-by: Hanzo Dev <[email protected]>
This commit is contained in:
+1
-1
@@ -5,7 +5,7 @@ ARG goos
|
||||
ARG goarch
|
||||
WORKDIR /
|
||||
ARG moxversion
|
||||
RUN CGO_ENABLED=0 GOOS=$goos GOARCH=$goarch go install -mod mod -trimpath github.com/mjl-/mox@$moxversion
|
||||
RUN CGO_ENABLED=0 GOOS=$goos GOARCH=$goarch go install -mod mod -trimpath github.com/hanzoai/mail@$moxversion
|
||||
RUN test -f /go/bin/mox && cp /go/bin/mox /bin/mox || cp /go/bin/${goos}_${goarch}/mox /bin/mox
|
||||
|
||||
# Using latest may break at some point, but will hopefully be convenient most of the time.
|
||||
|
||||
@@ -0,0 +1,141 @@
|
||||
# Hanzo Mail
|
||||
|
||||
Fork of Mox. Mail server (SMTP, IMAP4, webmail, DKIM/SPF/DMARC, autoconfig, ACME).
|
||||
This is the foundation for replacing Google Workspace email at Hanzo.
|
||||
|
||||
## Lineage
|
||||
|
||||
| | |
|
||||
|---|---|
|
||||
| Upstream | [github.com/mjl-/mox](https://github.com/mjl-/mox) |
|
||||
| Upstream author | Mechiel Lukkien <mechiel@ueber.net> |
|
||||
| Upstream license | MIT |
|
||||
| Fork point | `9bbad6af30ae1c429dde9cdc2d04130532e1fed1` (v0.0.15 + 55 commits, 2026-07-21) |
|
||||
| This repo | [github.com/hanzoai/mail](https://github.com/hanzoai/mail) |
|
||||
| Module path | `github.com/hanzoai/mail` |
|
||||
|
||||
This is a real GitHub fork (`isFork: true`, parent `mjl-/mox`), matching how
|
||||
`hanzoai/git` (← go-gitea/gitea) and `hanzoai/deploy` (← argoproj/argo-cd) were
|
||||
done. Provenance is therefore visible in the GitHub UI as well as in `NOTICE`.
|
||||
Full upstream history is preserved; `git remote upstream` points at mjl-/mox.
|
||||
|
||||
## Licensing — what applies to what
|
||||
|
||||
Verified by reading the tree, not assumed. `NOTICE` is the authoritative
|
||||
statement; `mail licenses` prints it from the running binary.
|
||||
|
||||
1. **Mox source + Hanzo's changes** — MIT (`LICENSE.MIT`), © 2021 Mechiel
|
||||
Lukkien, plus Hanzo AI, Inc. for modifications. Not relicensed.
|
||||
2. **`publicsuffix/public_suffix_list.txt`** — MPL-2.0 (`LICENSE.MPLv2.0`),
|
||||
Mozilla's Public Suffix List. **This one data file is the only thing the MPL
|
||||
covers.** Mox is *not* dual-licensed. Proof: `mox-/licenses.go` labels
|
||||
`LICENSE.MPLv2.0` as `https://publicsuffix.org - Public Suffix List Mozilla`,
|
||||
separate from mox's own MIT, and `README.md` says the same.
|
||||
3. **`vendor/**`** — third-party deps under their own licenses. Copies collected
|
||||
verbatim in `licenses/` (42 files) by `genlicenses.sh`, which reads `vendor/`.
|
||||
Includes BSD-3-Clause from The Go Authors (`golang.org/x/...` and the
|
||||
Go-derived forks `mjl-/{adns,autocert,flate,sherpa}`) and Apache-2.0
|
||||
(Prometheus, protobuf). The `licenses/` tree is *dependency* licenses — it is
|
||||
not a license grant over Mox or Hanzo Mail.
|
||||
|
||||
Mox was chosen over Stalwart deliberately: Stalwart is AGPL-3.0-only plus a
|
||||
proprietary per-file SELv2 enterprise license. AGPL's network clause would force
|
||||
publishing our fork and the SELv2 files cannot be forked commercially. Mox is
|
||||
MIT and Go, which matches our stack and our licensing posture.
|
||||
|
||||
## What was renamed
|
||||
|
||||
Only the Go module path, and only where it affects the build:
|
||||
|
||||
- `go.mod` module line.
|
||||
- 268 `.go` files — import paths `github.com/mjl-/mox/...` → `github.com/hanzoai/mail/...`.
|
||||
- 5 scripts that `go install` the module and would otherwise build **upstream**
|
||||
instead of this fork: `genwebsite.sh`, `docker-release.sh`, `apidiff.sh`,
|
||||
`test-upgrade.sh`, `Dockerfile.release`.
|
||||
- `licenses.go` — embeds `NOTICE`; `mox-/licenses.go` prints it first and labels
|
||||
the MIT section as a fork of mjl-/mox, so the binary states its own lineage.
|
||||
|
||||
## What was NOT touched — and why
|
||||
|
||||
- **`LICENSE.MIT`, `LICENSE.MPLv2.0`, `licenses/`** — preserved verbatim. Never
|
||||
edit these.
|
||||
- **`vendor/`** — no dependency was added, removed, or bumped.
|
||||
- **`apidiff/v0.0.9.txt`, `v0.0.10.txt`, `v0.0.11.txt`, `next.txt`** — historical
|
||||
records of *upstream's* API at upstream releases. Rewriting the paths in them
|
||||
would falsify a historical record. Leave them.
|
||||
- **`website/**`, `develop.txt`** — upstream's own website/docs content.
|
||||
(`develop.txt` also references `mjl-/mox-website-files`, a different repo —
|
||||
do not let a careless `sed` catch that prefix.)
|
||||
- **The `mox` command name, config keys, data directory layout, and the `mox`
|
||||
Go package name in `mox-/`.** Renaming these is a separate, larger job that
|
||||
breaks on-disk config and data compatibility. The binary still prints
|
||||
`usage: mox ...`. Deliberate: the module rename is what makes the fork
|
||||
independently buildable; the rest is branding with real breakage risk.
|
||||
- **`webmail/webmail.ts` / `webmail.js`** — still link to `mjl-/mox/issues` for
|
||||
bug reports. `webmail.js` is generated from the `.ts`, so this needs the
|
||||
frontend toolchain, not a `sed`. **Blocking before any deploy** — otherwise our
|
||||
webmail sends Hanzo users to file bugs on upstream's tracker.
|
||||
|
||||
## Build and test
|
||||
|
||||
```sh
|
||||
export PATH=$PATH:/usr/local/go/bin
|
||||
export GOWORK=off GOFLAGS=-mod=vendor # a parent go.work in ~/work/hanzo shadows this repo
|
||||
go build ./...
|
||||
go test ./...
|
||||
```
|
||||
|
||||
`GOWORK=off` is required — without it `go build ./...` fails with "directory
|
||||
prefix . does not contain modules listed in go.work".
|
||||
|
||||
Integration tests are behind `//go:build integration` and need Docker; the
|
||||
default `go test ./...` excludes them.
|
||||
|
||||
**Test flakiness is pre-existing upstream, not caused by the fork.** `go test
|
||||
./...` runs up to 32 package binaries at once on this box; mox's server tests
|
||||
use hard 1s deadlines (`server_test.go:414` "server not done within 1s") and
|
||||
starve. The failing set differs every run — baseline upstream (before any change)
|
||||
failed `TestQresyncUIDOnly`/`TestSubscribe`; the renamed tree failed a different
|
||||
set. Both pass in isolation. Use `go test -p 1 ./...` for a clean signal.
|
||||
|
||||
## Standing it up — next steps
|
||||
|
||||
Nothing is deployed. No DNS points anywhere. Repo setup only.
|
||||
|
||||
1. **Mailbox storage.** Per-account BoltDB index plus message files on disk:
|
||||
`<DataDir>/accounts/<name>/index.db` and `<DataDir>/accounts/<name>/msg/<shard>/<id>`.
|
||||
This is a *stateful, single-writer* design — it is not a stateless service and
|
||||
does not shard across replicas. It needs a real PersistentVolume with backups
|
||||
(`mail backup <destdir>` and `mail verifydata <data-dir>` are built in), not
|
||||
an emptyDir. Decide the storage class and backup target before anything else;
|
||||
this is the main architectural constraint of the whole project.
|
||||
2. **Config and keys.** `mail quickstart user@domain` generates `mox.conf`,
|
||||
`domains.conf`, and DKIM keys. DKIM private keys and the admin/account
|
||||
password hashes are secrets — they go in KMS (`kms.hanzo.ai`) and reach the
|
||||
cluster via KMSSecret CRDs. Never commit them. Passwords are hashed by mox
|
||||
(bcrypt/SCRAM credentials); do not add any plaintext path.
|
||||
3. **DKIM / SPF / DMARC / MX / DNS.** `mail config dnsrecords <domain>` prints
|
||||
every record to publish; `mail config dnscheck <domain>` verifies them.
|
||||
Publish in Cloudflare. MX records must **not** be proxied. Sequence matters:
|
||||
stand the server up and verify with `dnscheck` *before* moving MX off Google,
|
||||
or mail bounces.
|
||||
4. **Migration from Google.** There is **no built-in IMAP puller** — verified, not
|
||||
assumed. Two real options: (a) Google Takeout → mbox → `mail import mbox
|
||||
<account> <mailbox> <file>` (also available as mbox/maildir `.zip`/`.tgz`
|
||||
upload in the web account UI); or (b) an external IMAP-to-IMAP sync tool run
|
||||
against Hanzo Mail's IMAP server. Pick one and pilot it on a single throwaway
|
||||
account before touching anyone's real mail.
|
||||
5. **CI/CD and image.** Images build in CI only — never locally — and publish to
|
||||
`ghcr.io/hanzoai/mail`. Note `docker-release.sh`/`Dockerfile.release` still
|
||||
carry upstream's release flow and registry; repoint them (or replace with a
|
||||
`.hanzo/workflows` pipeline) as part of the deploy work, not before.
|
||||
6. **IAM.** Mox has its own account/password store. Integrating Hanzo IAM
|
||||
(hanzo.id, OIDC) is a genuine design question, because IMAP and SMTP clients
|
||||
authenticate with SASL, not OIDC — expect app passwords or a SASL-to-IAM
|
||||
bridge. Design it before promising SSO.
|
||||
|
||||
## Syncing upstream
|
||||
|
||||
`git fetch upstream && git merge upstream/main`. The module rename touches nearly
|
||||
every `.go` file, so import-path conflicts are expected on merge; resolve by
|
||||
keeping our path. Do not resolve a conflict by reverting `go.mod`.
|
||||
@@ -0,0 +1,68 @@
|
||||
Hanzo Mail
|
||||
==========
|
||||
|
||||
Hanzo Mail is a fork of Mox, a mail server by Mechiel Lukkien.
|
||||
|
||||
Upstream project: Mox
|
||||
Upstream URL: https://github.com/mjl-/mox
|
||||
Upstream author: Mechiel Lukkien <[email protected]>
|
||||
Upstream license: MIT (see LICENSE.MIT)
|
||||
|
||||
Fork point: 9bbad6af30ae1c429dde9cdc2d04130532e1fed1
|
||||
(upstream tag v0.0.15 plus 55 commits, 2026-07-21)
|
||||
Fork repository: https://github.com/hanzoai/mail
|
||||
Go module path: github.com/hanzoai/mail
|
||||
|
||||
Hanzo Mail is not affiliated with or endorsed by the Mox project or its author.
|
||||
|
||||
|
||||
Licensing
|
||||
---------
|
||||
|
||||
This repository is MIT licensed. The fork does not relicense any upstream code,
|
||||
and modifications made by Hanzo are released under the same MIT license.
|
||||
|
||||
Three distinct sets of terms apply to the files in this repository:
|
||||
|
||||
1. Mox source code, and Hanzo's modifications to it — the great majority of
|
||||
this repository.
|
||||
|
||||
License: MIT, in LICENSE.MIT
|
||||
Copyright: 2021 Mechiel Lukkien <[email protected]>, and Hanzo AI, Inc.
|
||||
for subsequent modifications
|
||||
|
||||
The MIT copyright notice is preserved verbatim. Upstream's copyright line
|
||||
is retained as-is; Hanzo claims copyright only over its own changes.
|
||||
|
||||
2. publicsuffix/public_suffix_list.txt — the Public Suffix List, published by
|
||||
Mozilla. This single data file is the only content in this repository
|
||||
covered by the Mozilla Public License.
|
||||
|
||||
License: MPL-2.0, in LICENSE.MPLv2.0
|
||||
Source: https://publicsuffix.org
|
||||
|
||||
LICENSE.MPLv2.0 is present solely to cover this file. Neither Mox nor Hanzo
|
||||
Mail is dual-licensed: the MPL applies to the Public Suffix List data and to
|
||||
nothing else in this repository.
|
||||
|
||||
3. vendor/** — third-party Go dependencies, each under its own license as
|
||||
published by its respective authors. These include BSD-3-Clause code from
|
||||
The Go Authors (golang.org/x/..., and the Go-derived forks
|
||||
github.com/mjl-/{adns,autocert,flate,sherpa}), Apache-2.0 code (the
|
||||
Prometheus client libraries, google.golang.org/protobuf), and others.
|
||||
|
||||
Licenses: collected verbatim under licenses/
|
||||
|
||||
The licenses/ tree is generated from vendor/ by genlicenses.sh and is
|
||||
preserved intact from upstream. It contains the dependencies' license files,
|
||||
not any license grant covering Mox or Hanzo Mail themselves.
|
||||
|
||||
The command `mail licenses` prints all of the above from the running binary.
|
||||
|
||||
|
||||
Changes from upstream
|
||||
---------------------
|
||||
|
||||
The Go module path was renamed from github.com/mjl-/mox to
|
||||
github.com/hanzoai/mail, and import paths were updated to match. See LLM.md for
|
||||
the full record of what was and was not changed.
|
||||
@@ -1,3 +1,19 @@
|
||||
# Hanzo Mail
|
||||
|
||||
Hanzo Mail is a fork of [Mox](https://github.com/mjl-/mox) by Mechiel Lukkien,
|
||||
taken at upstream commit `9bbad6af30ae1c429dde9cdc2d04130532e1fed1` (v0.0.15
|
||||
plus 55 commits). Mox is MIT licensed; this fork stays MIT and does not
|
||||
relicense any upstream code. See [NOTICE](NOTICE) for the full lineage and for
|
||||
exactly which license applies to which files, and [LLM.md](LLM.md) for what this
|
||||
fork changes.
|
||||
|
||||
Hanzo Mail is not affiliated with or endorsed by the Mox project or its author.
|
||||
|
||||
The Go module path is `github.com/hanzoai/mail`. Apart from that rename, the
|
||||
documentation below is upstream's and still describes the software accurately.
|
||||
|
||||
---
|
||||
|
||||
Mox is a modern full-featured open source secure mail server for low-maintenance self-hosted email.
|
||||
|
||||
For more details, see the mox website, https://www.xmox.nl.
|
||||
|
||||
+9
-9
@@ -19,15 +19,15 @@ import (
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/mjl-/mox/config"
|
||||
"github.com/mjl-/mox/dns"
|
||||
"github.com/mjl-/mox/junk"
|
||||
"github.com/mjl-/mox/mlog"
|
||||
"github.com/mjl-/mox/mox-"
|
||||
"github.com/mjl-/mox/mtasts"
|
||||
"github.com/mjl-/mox/queue"
|
||||
"github.com/mjl-/mox/smtp"
|
||||
"github.com/mjl-/mox/store"
|
||||
"github.com/hanzoai/mail/config"
|
||||
"github.com/hanzoai/mail/dns"
|
||||
"github.com/hanzoai/mail/junk"
|
||||
"github.com/hanzoai/mail/mlog"
|
||||
"github.com/hanzoai/mail/mox-"
|
||||
"github.com/hanzoai/mail/mtasts"
|
||||
"github.com/hanzoai/mail/queue"
|
||||
"github.com/hanzoai/mail/smtp"
|
||||
"github.com/hanzoai/mail/store"
|
||||
)
|
||||
|
||||
var pkglog = mlog.New("admin", nil)
|
||||
|
||||
@@ -5,9 +5,9 @@ import (
|
||||
"maps"
|
||||
"slices"
|
||||
|
||||
"github.com/mjl-/mox/config"
|
||||
"github.com/mjl-/mox/dns"
|
||||
"github.com/mjl-/mox/mox-"
|
||||
"github.com/hanzoai/mail/config"
|
||||
"github.com/hanzoai/mail/dns"
|
||||
"github.com/hanzoai/mail/mox-"
|
||||
)
|
||||
|
||||
type TLSMode uint8
|
||||
|
||||
+9
-9
@@ -12,14 +12,14 @@ import (
|
||||
|
||||
"github.com/mjl-/adns"
|
||||
|
||||
"github.com/mjl-/mox/config"
|
||||
"github.com/mjl-/mox/dkim"
|
||||
"github.com/mjl-/mox/dmarc"
|
||||
"github.com/mjl-/mox/dns"
|
||||
"github.com/mjl-/mox/mox-"
|
||||
"github.com/mjl-/mox/smtp"
|
||||
"github.com/mjl-/mox/spf"
|
||||
"github.com/mjl-/mox/tlsrpt"
|
||||
"github.com/hanzoai/mail/config"
|
||||
"github.com/hanzoai/mail/dkim"
|
||||
"github.com/hanzoai/mail/dmarc"
|
||||
"github.com/hanzoai/mail/dns"
|
||||
"github.com/hanzoai/mail/mox-"
|
||||
"github.com/hanzoai/mail/smtp"
|
||||
"github.com/hanzoai/mail/spf"
|
||||
"github.com/hanzoai/mail/tlsrpt"
|
||||
"slices"
|
||||
)
|
||||
|
||||
@@ -261,7 +261,7 @@ func DomainRecords(domConf config.Domain, domain dns.Domain, hasDNSSEC bool, cer
|
||||
// ../rfc/6186:133 ../rfc/8314:692
|
||||
// ../rfc/2782:202 says we MUST NOT have a CNAME as the target to a SRV record, but
|
||||
// arnt says it's safe to ignore that statement, see
|
||||
// https://github.com/mjl-/mox/pull/367#issuecomment-3486518824. Software isn't
|
||||
// https://github.com/hanzoai/mail/pull/367#issuecomment-3486518824. Software isn't
|
||||
// likely to actually update their configs to the targets of CNAMEs, and the
|
||||
// additional lookups won't cause relevant delays or traffic.
|
||||
"; For secure IMAP and submission autoconfig, point to mail host.",
|
||||
|
||||
+1
-1
@@ -1,7 +1,7 @@
|
||||
#!/bin/sh
|
||||
set -e
|
||||
|
||||
prevversion=$(go list -mod=readonly -m -f '{{ .Version }}' github.com/mjl-/mox@latest)
|
||||
prevversion=$(go list -mod=readonly -m -f '{{ .Version }}' github.com/hanzoai/mail@latest)
|
||||
if ! test -d tmp/mox-$prevversion; then
|
||||
mkdir -p tmp/mox-$prevversion
|
||||
git archive --format=tar $prevversion | tar -C tmp/mox-$prevversion -xf -
|
||||
|
||||
+3
-3
@@ -36,9 +36,9 @@ import (
|
||||
|
||||
"github.com/mjl-/autocert"
|
||||
|
||||
"github.com/mjl-/mox/dns"
|
||||
"github.com/mjl-/mox/mlog"
|
||||
"github.com/mjl-/mox/moxvar"
|
||||
"github.com/hanzoai/mail/dns"
|
||||
"github.com/hanzoai/mail/mlog"
|
||||
"github.com/hanzoai/mail/moxvar"
|
||||
)
|
||||
|
||||
var (
|
||||
|
||||
@@ -11,8 +11,8 @@ import (
|
||||
|
||||
"github.com/mjl-/autocert"
|
||||
|
||||
"github.com/mjl-/mox/dns"
|
||||
"github.com/mjl-/mox/mlog"
|
||||
"github.com/hanzoai/mail/dns"
|
||||
"github.com/hanzoai/mail/mlog"
|
||||
)
|
||||
|
||||
func TestAutotls(t *testing.T) {
|
||||
|
||||
@@ -18,13 +18,13 @@ import (
|
||||
|
||||
"github.com/mjl-/bstore"
|
||||
|
||||
"github.com/mjl-/mox/dmarcdb"
|
||||
"github.com/mjl-/mox/mox-"
|
||||
"github.com/mjl-/mox/moxvar"
|
||||
"github.com/mjl-/mox/mtastsdb"
|
||||
"github.com/mjl-/mox/queue"
|
||||
"github.com/mjl-/mox/store"
|
||||
"github.com/mjl-/mox/tlsrptdb"
|
||||
"github.com/hanzoai/mail/dmarcdb"
|
||||
"github.com/hanzoai/mail/mox-"
|
||||
"github.com/hanzoai/mail/moxvar"
|
||||
"github.com/hanzoai/mail/mtastsdb"
|
||||
"github.com/hanzoai/mail/queue"
|
||||
"github.com/hanzoai/mail/store"
|
||||
"github.com/hanzoai/mail/tlsrptdb"
|
||||
)
|
||||
|
||||
func xbackupctl(ctx context.Context, xctl *ctl) {
|
||||
|
||||
+5
-5
@@ -11,11 +11,11 @@ import (
|
||||
"regexp"
|
||||
"time"
|
||||
|
||||
"github.com/mjl-/mox/autotls"
|
||||
"github.com/mjl-/mox/dns"
|
||||
"github.com/mjl-/mox/junk"
|
||||
"github.com/mjl-/mox/mtasts"
|
||||
"github.com/mjl-/mox/smtp"
|
||||
"github.com/hanzoai/mail/autotls"
|
||||
"github.com/hanzoai/mail/dns"
|
||||
"github.com/hanzoai/mail/junk"
|
||||
"github.com/hanzoai/mail/mtasts"
|
||||
"github.com/hanzoai/mail/smtp"
|
||||
)
|
||||
|
||||
// todo: better default values, so less has to be specified in the config file.
|
||||
|
||||
@@ -22,18 +22,18 @@ import (
|
||||
|
||||
"github.com/mjl-/bstore"
|
||||
|
||||
"github.com/mjl-/mox/admin"
|
||||
"github.com/mjl-/mox/config"
|
||||
"github.com/mjl-/mox/dns"
|
||||
"github.com/mjl-/mox/imapserver"
|
||||
"github.com/mjl-/mox/message"
|
||||
"github.com/mjl-/mox/metrics"
|
||||
"github.com/mjl-/mox/mlog"
|
||||
"github.com/mjl-/mox/mox-"
|
||||
"github.com/mjl-/mox/queue"
|
||||
"github.com/mjl-/mox/smtp"
|
||||
"github.com/mjl-/mox/store"
|
||||
"github.com/mjl-/mox/webapi"
|
||||
"github.com/hanzoai/mail/admin"
|
||||
"github.com/hanzoai/mail/config"
|
||||
"github.com/hanzoai/mail/dns"
|
||||
"github.com/hanzoai/mail/imapserver"
|
||||
"github.com/hanzoai/mail/message"
|
||||
"github.com/hanzoai/mail/metrics"
|
||||
"github.com/hanzoai/mail/mlog"
|
||||
"github.com/hanzoai/mail/mox-"
|
||||
"github.com/hanzoai/mail/queue"
|
||||
"github.com/hanzoai/mail/smtp"
|
||||
"github.com/hanzoai/mail/store"
|
||||
"github.com/hanzoai/mail/webapi"
|
||||
)
|
||||
|
||||
// ctl represents a connection to the ctl unix domain socket of a running mox instance.
|
||||
|
||||
+11
-11
@@ -17,17 +17,17 @@ import (
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/mjl-/mox/config"
|
||||
"github.com/mjl-/mox/dmarcdb"
|
||||
"github.com/mjl-/mox/dns"
|
||||
"github.com/mjl-/mox/imapclient"
|
||||
"github.com/mjl-/mox/mlog"
|
||||
"github.com/mjl-/mox/mox-"
|
||||
"github.com/mjl-/mox/mtastsdb"
|
||||
"github.com/mjl-/mox/queue"
|
||||
"github.com/mjl-/mox/smtp"
|
||||
"github.com/mjl-/mox/store"
|
||||
"github.com/mjl-/mox/tlsrptdb"
|
||||
"github.com/hanzoai/mail/config"
|
||||
"github.com/hanzoai/mail/dmarcdb"
|
||||
"github.com/hanzoai/mail/dns"
|
||||
"github.com/hanzoai/mail/imapclient"
|
||||
"github.com/hanzoai/mail/mlog"
|
||||
"github.com/hanzoai/mail/mox-"
|
||||
"github.com/hanzoai/mail/mtastsdb"
|
||||
"github.com/hanzoai/mail/queue"
|
||||
"github.com/hanzoai/mail/smtp"
|
||||
"github.com/hanzoai/mail/store"
|
||||
"github.com/hanzoai/mail/tlsrptdb"
|
||||
)
|
||||
|
||||
var ctxbg = context.Background()
|
||||
|
||||
+3
-3
@@ -62,9 +62,9 @@ import (
|
||||
|
||||
"github.com/mjl-/adns"
|
||||
|
||||
"github.com/mjl-/mox/dns"
|
||||
"github.com/mjl-/mox/mlog"
|
||||
"github.com/mjl-/mox/stub"
|
||||
"github.com/hanzoai/mail/dns"
|
||||
"github.com/hanzoai/mail/mlog"
|
||||
"github.com/hanzoai/mail/stub"
|
||||
"slices"
|
||||
)
|
||||
|
||||
|
||||
+2
-2
@@ -22,8 +22,8 @@ import (
|
||||
|
||||
"github.com/mjl-/adns"
|
||||
|
||||
"github.com/mjl-/mox/dns"
|
||||
"github.com/mjl-/mox/mlog"
|
||||
"github.com/hanzoai/mail/dns"
|
||||
"github.com/hanzoai/mail/mlog"
|
||||
)
|
||||
|
||||
func tcheckf(t *testing.T, err error, format string, args ...any) {
|
||||
|
||||
@@ -8,8 +8,8 @@ import (
|
||||
|
||||
"github.com/mjl-/adns"
|
||||
|
||||
"github.com/mjl-/mox/dane"
|
||||
"github.com/mjl-/mox/dns"
|
||||
"github.com/hanzoai/mail/dane"
|
||||
"github.com/hanzoai/mail/dns"
|
||||
)
|
||||
|
||||
func ExampleDial() {
|
||||
|
||||
+6
-6
@@ -25,12 +25,12 @@ import (
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/mjl-/mox/dns"
|
||||
"github.com/mjl-/mox/mlog"
|
||||
"github.com/mjl-/mox/moxio"
|
||||
"github.com/mjl-/mox/publicsuffix"
|
||||
"github.com/mjl-/mox/smtp"
|
||||
"github.com/mjl-/mox/stub"
|
||||
"github.com/hanzoai/mail/dns"
|
||||
"github.com/hanzoai/mail/mlog"
|
||||
"github.com/hanzoai/mail/moxio"
|
||||
"github.com/hanzoai/mail/publicsuffix"
|
||||
"github.com/hanzoai/mail/smtp"
|
||||
"github.com/hanzoai/mail/stub"
|
||||
"slices"
|
||||
)
|
||||
|
||||
|
||||
+2
-2
@@ -16,8 +16,8 @@ import (
|
||||
"strings"
|
||||
"testing"
|
||||
|
||||
"github.com/mjl-/mox/dns"
|
||||
"github.com/mjl-/mox/mlog"
|
||||
"github.com/hanzoai/mail/dns"
|
||||
"github.com/hanzoai/mail/mlog"
|
||||
)
|
||||
|
||||
var pkglog = mlog.New("dkim", nil)
|
||||
|
||||
+2
-2
@@ -8,8 +8,8 @@ import (
|
||||
|
||||
"golang.org/x/text/unicode/norm"
|
||||
|
||||
"github.com/mjl-/mox/dns"
|
||||
"github.com/mjl-/mox/smtp"
|
||||
"github.com/hanzoai/mail/dns"
|
||||
"github.com/hanzoai/mail/smtp"
|
||||
)
|
||||
|
||||
// Pedantic enables stricter parsing.
|
||||
|
||||
+3
-3
@@ -7,9 +7,9 @@ import (
|
||||
"fmt"
|
||||
"strings"
|
||||
|
||||
"github.com/mjl-/mox/dns"
|
||||
"github.com/mjl-/mox/message"
|
||||
"github.com/mjl-/mox/smtp"
|
||||
"github.com/hanzoai/mail/dns"
|
||||
"github.com/hanzoai/mail/message"
|
||||
"github.com/hanzoai/mail/smtp"
|
||||
)
|
||||
|
||||
// Sig is a DKIM-Signature header.
|
||||
|
||||
+2
-2
@@ -7,8 +7,8 @@ import (
|
||||
"strings"
|
||||
"testing"
|
||||
|
||||
"github.com/mjl-/mox/dns"
|
||||
"github.com/mjl-/mox/smtp"
|
||||
"github.com/hanzoai/mail/dns"
|
||||
"github.com/hanzoai/mail/smtp"
|
||||
)
|
||||
|
||||
func TestSig(t *testing.T) {
|
||||
|
||||
+6
-6
@@ -18,12 +18,12 @@ import (
|
||||
mathrand2 "math/rand/v2"
|
||||
"time"
|
||||
|
||||
"github.com/mjl-/mox/dkim"
|
||||
"github.com/mjl-/mox/dns"
|
||||
"github.com/mjl-/mox/mlog"
|
||||
"github.com/mjl-/mox/publicsuffix"
|
||||
"github.com/mjl-/mox/spf"
|
||||
"github.com/mjl-/mox/stub"
|
||||
"github.com/hanzoai/mail/dkim"
|
||||
"github.com/hanzoai/mail/dns"
|
||||
"github.com/hanzoai/mail/mlog"
|
||||
"github.com/hanzoai/mail/publicsuffix"
|
||||
"github.com/hanzoai/mail/spf"
|
||||
"github.com/hanzoai/mail/stub"
|
||||
)
|
||||
|
||||
var (
|
||||
|
||||
+4
-4
@@ -6,10 +6,10 @@ import (
|
||||
"reflect"
|
||||
"testing"
|
||||
|
||||
"github.com/mjl-/mox/dkim"
|
||||
"github.com/mjl-/mox/dns"
|
||||
"github.com/mjl-/mox/mlog"
|
||||
"github.com/mjl-/mox/spf"
|
||||
"github.com/hanzoai/mail/dkim"
|
||||
"github.com/hanzoai/mail/dns"
|
||||
"github.com/hanzoai/mail/mlog"
|
||||
"github.com/hanzoai/mail/spf"
|
||||
)
|
||||
|
||||
var pkglog = mlog.New("dmarc", nil)
|
||||
|
||||
@@ -7,11 +7,11 @@ import (
|
||||
"net"
|
||||
"strings"
|
||||
|
||||
"github.com/mjl-/mox/dkim"
|
||||
"github.com/mjl-/mox/dmarc"
|
||||
"github.com/mjl-/mox/dns"
|
||||
"github.com/mjl-/mox/message"
|
||||
"github.com/mjl-/mox/spf"
|
||||
"github.com/hanzoai/mail/dkim"
|
||||
"github.com/hanzoai/mail/dmarc"
|
||||
"github.com/hanzoai/mail/dns"
|
||||
"github.com/hanzoai/mail/message"
|
||||
"github.com/hanzoai/mail/spf"
|
||||
)
|
||||
|
||||
func ExampleLookup() {
|
||||
|
||||
+3
-3
@@ -19,9 +19,9 @@ import (
|
||||
|
||||
"github.com/mjl-/bstore"
|
||||
|
||||
"github.com/mjl-/mox/mlog"
|
||||
"github.com/mjl-/mox/mox-"
|
||||
"github.com/mjl-/mox/moxvar"
|
||||
"github.com/hanzoai/mail/mlog"
|
||||
"github.com/hanzoai/mail/mox-"
|
||||
"github.com/hanzoai/mail/moxvar"
|
||||
)
|
||||
|
||||
// Init opens the databases.
|
||||
|
||||
+14
-14
@@ -27,20 +27,20 @@ import (
|
||||
|
||||
"github.com/mjl-/bstore"
|
||||
|
||||
"github.com/mjl-/mox/dkim"
|
||||
"github.com/mjl-/mox/dmarc"
|
||||
"github.com/mjl-/mox/dmarcrpt"
|
||||
"github.com/mjl-/mox/dns"
|
||||
"github.com/mjl-/mox/message"
|
||||
"github.com/mjl-/mox/metrics"
|
||||
"github.com/mjl-/mox/mlog"
|
||||
"github.com/mjl-/mox/mox-"
|
||||
"github.com/mjl-/mox/moxio"
|
||||
"github.com/mjl-/mox/moxvar"
|
||||
"github.com/mjl-/mox/publicsuffix"
|
||||
"github.com/mjl-/mox/queue"
|
||||
"github.com/mjl-/mox/smtp"
|
||||
"github.com/mjl-/mox/store"
|
||||
"github.com/hanzoai/mail/dkim"
|
||||
"github.com/hanzoai/mail/dmarc"
|
||||
"github.com/hanzoai/mail/dmarcrpt"
|
||||
"github.com/hanzoai/mail/dns"
|
||||
"github.com/hanzoai/mail/message"
|
||||
"github.com/hanzoai/mail/metrics"
|
||||
"github.com/hanzoai/mail/mlog"
|
||||
"github.com/hanzoai/mail/mox-"
|
||||
"github.com/hanzoai/mail/moxio"
|
||||
"github.com/hanzoai/mail/moxvar"
|
||||
"github.com/hanzoai/mail/publicsuffix"
|
||||
"github.com/hanzoai/mail/queue"
|
||||
"github.com/hanzoai/mail/smtp"
|
||||
"github.com/hanzoai/mail/store"
|
||||
)
|
||||
|
||||
var (
|
||||
|
||||
@@ -13,12 +13,12 @@ import (
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/mjl-/mox/dmarcrpt"
|
||||
"github.com/mjl-/mox/dns"
|
||||
"github.com/mjl-/mox/mlog"
|
||||
"github.com/mjl-/mox/mox-"
|
||||
"github.com/mjl-/mox/moxio"
|
||||
"github.com/mjl-/mox/queue"
|
||||
"github.com/hanzoai/mail/dmarcrpt"
|
||||
"github.com/hanzoai/mail/dns"
|
||||
"github.com/hanzoai/mail/mlog"
|
||||
"github.com/hanzoai/mail/mox-"
|
||||
"github.com/hanzoai/mail/moxio"
|
||||
"github.com/hanzoai/mail/queue"
|
||||
"slices"
|
||||
)
|
||||
|
||||
|
||||
@@ -5,7 +5,7 @@ import (
|
||||
"os"
|
||||
"testing"
|
||||
|
||||
"github.com/mjl-/mox/metrics"
|
||||
"github.com/hanzoai/mail/metrics"
|
||||
)
|
||||
|
||||
func TestMain(m *testing.M) {
|
||||
|
||||
+2
-2
@@ -10,8 +10,8 @@ import (
|
||||
|
||||
"github.com/mjl-/bstore"
|
||||
|
||||
"github.com/mjl-/mox/dmarcrpt"
|
||||
"github.com/mjl-/mox/dns"
|
||||
"github.com/hanzoai/mail/dmarcrpt"
|
||||
"github.com/hanzoai/mail/dns"
|
||||
)
|
||||
|
||||
var (
|
||||
|
||||
@@ -8,9 +8,9 @@ import (
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/mjl-/mox/dmarcrpt"
|
||||
"github.com/mjl-/mox/dns"
|
||||
"github.com/mjl-/mox/mox-"
|
||||
"github.com/hanzoai/mail/dmarcrpt"
|
||||
"github.com/hanzoai/mail/dns"
|
||||
"github.com/hanzoai/mail/mox-"
|
||||
)
|
||||
|
||||
var ctxbg = context.Background()
|
||||
|
||||
+3
-3
@@ -13,9 +13,9 @@ import (
|
||||
"net/http"
|
||||
"strings"
|
||||
|
||||
"github.com/mjl-/mox/message"
|
||||
"github.com/mjl-/mox/mlog"
|
||||
"github.com/mjl-/mox/moxio"
|
||||
"github.com/hanzoai/mail/message"
|
||||
"github.com/hanzoai/mail/mlog"
|
||||
"github.com/hanzoai/mail/moxio"
|
||||
)
|
||||
|
||||
var ErrNoReport = errors.New("no dmarc aggregate report found in message")
|
||||
|
||||
@@ -8,7 +8,7 @@ import (
|
||||
"strings"
|
||||
"testing"
|
||||
|
||||
"github.com/mjl-/mox/mlog"
|
||||
"github.com/hanzoai/mail/mlog"
|
||||
)
|
||||
|
||||
var pkglog = mlog.New("dmarcrpt", nil)
|
||||
|
||||
@@ -4,7 +4,7 @@ import (
|
||||
"fmt"
|
||||
"log"
|
||||
|
||||
"github.com/mjl-/mox/dns"
|
||||
"github.com/hanzoai/mail/dns"
|
||||
)
|
||||
|
||||
func ExampleParseDomain() {
|
||||
|
||||
+2
-2
@@ -13,8 +13,8 @@ import (
|
||||
|
||||
"github.com/mjl-/adns"
|
||||
|
||||
"github.com/mjl-/mox/mlog"
|
||||
"github.com/mjl-/mox/stub"
|
||||
"github.com/hanzoai/mail/mlog"
|
||||
"github.com/hanzoai/mail/stub"
|
||||
)
|
||||
|
||||
// todo future: replace with a dnssec capable resolver
|
||||
|
||||
+3
-3
@@ -24,9 +24,9 @@ import (
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/mjl-/mox/dns"
|
||||
"github.com/mjl-/mox/mlog"
|
||||
"github.com/mjl-/mox/stub"
|
||||
"github.com/hanzoai/mail/dns"
|
||||
"github.com/hanzoai/mail/mlog"
|
||||
"github.com/hanzoai/mail/stub"
|
||||
)
|
||||
|
||||
var (
|
||||
|
||||
+2
-2
@@ -5,8 +5,8 @@ import (
|
||||
"net"
|
||||
"testing"
|
||||
|
||||
"github.com/mjl-/mox/dns"
|
||||
"github.com/mjl-/mox/mlog"
|
||||
"github.com/hanzoai/mail/dns"
|
||||
"github.com/hanzoai/mail/mlog"
|
||||
)
|
||||
|
||||
func TestDNSBL(t *testing.T) {
|
||||
|
||||
@@ -6,8 +6,8 @@ import (
|
||||
"log/slog"
|
||||
"net"
|
||||
|
||||
"github.com/mjl-/mox/dns"
|
||||
"github.com/mjl-/mox/dnsbl"
|
||||
"github.com/hanzoai/mail/dns"
|
||||
"github.com/hanzoai/mail/dnsbl"
|
||||
)
|
||||
|
||||
func ExampleLookup() {
|
||||
|
||||
+2
-2
@@ -11,10 +11,10 @@ set -e
|
||||
platforms=linux/amd64,linux/arm64,linux/arm,linux/386,linux/ppc64le,linux/s390x
|
||||
# todo: linux/riscv64 currently absent for alpine:latest, only at alpine:edge
|
||||
|
||||
# We are building by "go install github.com/mjl-/mox@$moxversion", to ensure the
|
||||
# We are building by "go install github.com/hanzoai/mail@$moxversion", to ensure the
|
||||
# binary gets a proper version stamped into its buildinfo. It also helps to ensure
|
||||
# there is no accidental local change in the image.
|
||||
moxversion=$(go list -mod mod -m github.com/mjl-/mox@$(git rev-parse HEAD) | cut -f2 -d' ')
|
||||
moxversion=$(go list -mod mod -m github.com/hanzoai/mail@$(git rev-parse HEAD) | cut -f2 -d' ')
|
||||
echo Building mox $moxversion for $platforms, without local/uncommitted changes
|
||||
|
||||
# Ensure latest golang and alpine docker images.
|
||||
|
||||
+3
-3
@@ -14,9 +14,9 @@ import (
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/mjl-/mox/message"
|
||||
"github.com/mjl-/mox/mlog"
|
||||
"github.com/mjl-/mox/smtp"
|
||||
"github.com/hanzoai/mail/message"
|
||||
"github.com/hanzoai/mail/mlog"
|
||||
"github.com/hanzoai/mail/smtp"
|
||||
)
|
||||
|
||||
// Message represents a DSN message, with basic message headers, human-readable text,
|
||||
|
||||
+4
-4
@@ -10,10 +10,10 @@ import (
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/mjl-/mox/dns"
|
||||
"github.com/mjl-/mox/message"
|
||||
"github.com/mjl-/mox/mlog"
|
||||
"github.com/mjl-/mox/smtp"
|
||||
"github.com/hanzoai/mail/dns"
|
||||
"github.com/hanzoai/mail/message"
|
||||
"github.com/hanzoai/mail/mlog"
|
||||
"github.com/hanzoai/mail/smtp"
|
||||
)
|
||||
|
||||
var pkglog = mlog.New("dsn", nil)
|
||||
|
||||
+4
-4
@@ -10,10 +10,10 @@ import (
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/mjl-/mox/dns"
|
||||
"github.com/mjl-/mox/message"
|
||||
"github.com/mjl-/mox/mlog"
|
||||
"github.com/mjl-/mox/smtp"
|
||||
"github.com/hanzoai/mail/dns"
|
||||
"github.com/hanzoai/mail/message"
|
||||
"github.com/hanzoai/mail/mlog"
|
||||
"github.com/hanzoai/mail/smtp"
|
||||
"slices"
|
||||
)
|
||||
|
||||
|
||||
+4
-4
@@ -12,10 +12,10 @@ import (
|
||||
|
||||
"github.com/mjl-/sconf"
|
||||
|
||||
"github.com/mjl-/mox/config"
|
||||
"github.com/mjl-/mox/mox-"
|
||||
"github.com/mjl-/mox/smtp"
|
||||
"github.com/mjl-/mox/webhook"
|
||||
"github.com/hanzoai/mail/config"
|
||||
"github.com/hanzoai/mail/mox-"
|
||||
"github.com/hanzoai/mail/smtp"
|
||||
"github.com/hanzoai/mail/webhook"
|
||||
)
|
||||
|
||||
func cmdExample(c *cmd) {
|
||||
|
||||
@@ -8,7 +8,7 @@ import (
|
||||
|
||||
"github.com/mjl-/bstore"
|
||||
|
||||
"github.com/mjl-/mox/store"
|
||||
"github.com/hanzoai/mail/store"
|
||||
)
|
||||
|
||||
func cmdExportMaildir(c *cmd) {
|
||||
|
||||
+14
-14
@@ -12,20 +12,20 @@ import (
|
||||
"github.com/mjl-/bstore"
|
||||
"github.com/mjl-/sconf"
|
||||
|
||||
"github.com/mjl-/mox/config"
|
||||
"github.com/mjl-/mox/dmarcdb"
|
||||
"github.com/mjl-/mox/dmarcrpt"
|
||||
"github.com/mjl-/mox/dns"
|
||||
"github.com/mjl-/mox/mlog"
|
||||
"github.com/mjl-/mox/mox-"
|
||||
"github.com/mjl-/mox/moxvar"
|
||||
"github.com/mjl-/mox/mtasts"
|
||||
"github.com/mjl-/mox/mtastsdb"
|
||||
"github.com/mjl-/mox/queue"
|
||||
"github.com/mjl-/mox/smtp"
|
||||
"github.com/mjl-/mox/store"
|
||||
"github.com/mjl-/mox/tlsrpt"
|
||||
"github.com/mjl-/mox/tlsrptdb"
|
||||
"github.com/hanzoai/mail/config"
|
||||
"github.com/hanzoai/mail/dmarcdb"
|
||||
"github.com/hanzoai/mail/dmarcrpt"
|
||||
"github.com/hanzoai/mail/dns"
|
||||
"github.com/hanzoai/mail/mlog"
|
||||
"github.com/hanzoai/mail/mox-"
|
||||
"github.com/hanzoai/mail/moxvar"
|
||||
"github.com/hanzoai/mail/mtasts"
|
||||
"github.com/hanzoai/mail/mtastsdb"
|
||||
"github.com/hanzoai/mail/queue"
|
||||
"github.com/hanzoai/mail/smtp"
|
||||
"github.com/hanzoai/mail/store"
|
||||
"github.com/hanzoai/mail/tlsrpt"
|
||||
"github.com/hanzoai/mail/tlsrptdb"
|
||||
)
|
||||
|
||||
func cmdGentestdata(c *cmd) {
|
||||
|
||||
+3
-3
@@ -97,13 +97,13 @@ const init = () => {
|
||||
elem('p', 'Compile or download any version of mox, by tag (release), branch or commit hash.'),
|
||||
elem('h1', 'Compile'),
|
||||
elem('p', 'Run:'),
|
||||
elem('pre', 'CGO_ENABLED=0 GOBIN=$PWD go install github.com/mjl-/mox@'+h),
|
||||
elem('pre', 'CGO_ENABLED=0 GOBIN=$PWD go install github.com/hanzoai/mail@'+h),
|
||||
elem('p', 'Mox is tested with the Go toolchain versions that are still have support: The most recent version, and the version before.'),
|
||||
elem('h1', 'Download'),
|
||||
elem('p', 'Download a binary for your platform:'),
|
||||
elem('blockquote', ok ?
|
||||
link('https://beta.gobuilds.org/github.com/mjl-/mox@'+h) :
|
||||
'https://beta.gobuilds.org/github.com/mjl-/mox@'+h
|
||||
link('https://beta.gobuilds.org/github.com/hanzoai/mail@'+h) :
|
||||
'https://beta.gobuilds.org/github.com/hanzoai/mail@'+h
|
||||
),
|
||||
elem('p', 'Because mox is written in Go, builds are reproducible, also when cross-compiling. Gobuilds.org is a service that builds Go applications on-demand with the latest Go toolchain/runtime.'),
|
||||
elem('h1', 'Localserve'),
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
module github.com/mjl-/mox
|
||||
module github.com/hanzoai/mail
|
||||
|
||||
go 1.25.0
|
||||
|
||||
|
||||
+3
-3
@@ -11,9 +11,9 @@ import (
|
||||
"github.com/prometheus/client_golang/prometheus/promauto"
|
||||
"rsc.io/qr"
|
||||
|
||||
"github.com/mjl-/mox/admin"
|
||||
"github.com/mjl-/mox/dns"
|
||||
"github.com/mjl-/mox/smtp"
|
||||
"github.com/hanzoai/mail/admin"
|
||||
"github.com/hanzoai/mail/dns"
|
||||
"github.com/hanzoai/mail/smtp"
|
||||
)
|
||||
|
||||
var (
|
||||
|
||||
+1
-1
@@ -17,7 +17,7 @@ import (
|
||||
"sync"
|
||||
"time"
|
||||
|
||||
"github.com/mjl-/mox/mlog"
|
||||
"github.com/hanzoai/mail/mlog"
|
||||
)
|
||||
|
||||
// todo: consider caching gzipped responses from forward handlers too. we would need to read the responses (handle up to perhaps 2mb), hash the data (blake2b seems fast), check if we have the gzip content for that hash, cache it on second request. keep around entries for non-yet-cached hashes, with some limit and lru eviction policy. we have to recognize some content-types as not applicable and do direct streaming compression, e.g. for text/event-stream. and we need to detect when backend server could be slowly sending out data and abort the caching attempt. downside is always that we need to read the whole response before and hash it before we can send our response. it is best if the backend just responds with gzip itself though. compression needs more cpu than hashing (at least 10x), but it's only worth it with enough hits.
|
||||
|
||||
+1
-1
@@ -5,7 +5,7 @@ import (
|
||||
"os"
|
||||
"testing"
|
||||
|
||||
"github.com/mjl-/mox/metrics"
|
||||
"github.com/hanzoai/mail/metrics"
|
||||
)
|
||||
|
||||
func TestMain(m *testing.M) {
|
||||
|
||||
@@ -10,8 +10,8 @@ import (
|
||||
"slices"
|
||||
"strings"
|
||||
|
||||
"github.com/mjl-/mox/admin"
|
||||
"github.com/mjl-/mox/smtp"
|
||||
"github.com/hanzoai/mail/admin"
|
||||
"github.com/hanzoai/mail/smtp"
|
||||
)
|
||||
|
||||
// Apple software isn't good at autoconfig/autodiscovery, but it can import a
|
||||
|
||||
+4
-4
@@ -7,10 +7,10 @@ import (
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/mjl-/mox/dns"
|
||||
"github.com/mjl-/mox/mlog"
|
||||
"github.com/mjl-/mox/mox-"
|
||||
"github.com/mjl-/mox/mtasts"
|
||||
"github.com/hanzoai/mail/dns"
|
||||
"github.com/hanzoai/mail/mlog"
|
||||
"github.com/hanzoai/mail/mox-"
|
||||
"github.com/hanzoai/mail/mtasts"
|
||||
)
|
||||
|
||||
func mtastsPolicyHandle(w http.ResponseWriter, r *http.Request) {
|
||||
|
||||
+12
-12
@@ -30,18 +30,18 @@ import (
|
||||
"github.com/prometheus/client_golang/prometheus/promauto"
|
||||
"github.com/prometheus/client_golang/prometheus/promhttp"
|
||||
|
||||
"github.com/mjl-/mox/autotls"
|
||||
"github.com/mjl-/mox/config"
|
||||
"github.com/mjl-/mox/dns"
|
||||
"github.com/mjl-/mox/imapserver"
|
||||
"github.com/mjl-/mox/mlog"
|
||||
"github.com/mjl-/mox/mox-"
|
||||
"github.com/mjl-/mox/ratelimit"
|
||||
"github.com/mjl-/mox/smtpserver"
|
||||
"github.com/mjl-/mox/webaccount"
|
||||
"github.com/mjl-/mox/webadmin"
|
||||
"github.com/mjl-/mox/webapisrv"
|
||||
"github.com/mjl-/mox/webmail"
|
||||
"github.com/hanzoai/mail/autotls"
|
||||
"github.com/hanzoai/mail/config"
|
||||
"github.com/hanzoai/mail/dns"
|
||||
"github.com/hanzoai/mail/imapserver"
|
||||
"github.com/hanzoai/mail/mlog"
|
||||
"github.com/hanzoai/mail/mox-"
|
||||
"github.com/hanzoai/mail/ratelimit"
|
||||
"github.com/hanzoai/mail/smtpserver"
|
||||
"github.com/hanzoai/mail/webaccount"
|
||||
"github.com/hanzoai/mail/webadmin"
|
||||
"github.com/hanzoai/mail/webapisrv"
|
||||
"github.com/hanzoai/mail/webmail"
|
||||
)
|
||||
|
||||
var pkglog = mlog.New("http", nil)
|
||||
|
||||
+1
-1
@@ -8,7 +8,7 @@ import (
|
||||
"path/filepath"
|
||||
"testing"
|
||||
|
||||
"github.com/mjl-/mox/mox-"
|
||||
"github.com/hanzoai/mail/mox-"
|
||||
)
|
||||
|
||||
func TestServeHTTP(t *testing.T) {
|
||||
|
||||
+4
-4
@@ -25,10 +25,10 @@ import (
|
||||
"syscall"
|
||||
"time"
|
||||
|
||||
"github.com/mjl-/mox/config"
|
||||
"github.com/mjl-/mox/dns"
|
||||
"github.com/mjl-/mox/mlog"
|
||||
"github.com/mjl-/mox/mox-"
|
||||
"github.com/hanzoai/mail/config"
|
||||
"github.com/hanzoai/mail/dns"
|
||||
"github.com/hanzoai/mail/mlog"
|
||||
"github.com/hanzoai/mail/mox-"
|
||||
)
|
||||
|
||||
func recvid(r *http.Request) string {
|
||||
|
||||
@@ -16,7 +16,7 @@ import (
|
||||
|
||||
"golang.org/x/net/websocket"
|
||||
|
||||
"github.com/mjl-/mox/mox-"
|
||||
"github.com/hanzoai/mail/mox-"
|
||||
)
|
||||
|
||||
func tcheck(t *testing.T, err error, msg string) {
|
||||
|
||||
@@ -19,8 +19,8 @@ import (
|
||||
"net"
|
||||
"strings"
|
||||
|
||||
"github.com/mjl-/mox/mlog"
|
||||
"github.com/mjl-/mox/moxio"
|
||||
"github.com/hanzoai/mail/mlog"
|
||||
"github.com/hanzoai/mail/moxio"
|
||||
)
|
||||
|
||||
// Conn is an connection to an IMAP server.
|
||||
|
||||
+3
-3
@@ -12,9 +12,9 @@ import (
|
||||
|
||||
"github.com/mjl-/flate"
|
||||
|
||||
"github.com/mjl-/mox/mlog"
|
||||
"github.com/mjl-/mox/moxio"
|
||||
"github.com/mjl-/mox/scram"
|
||||
"github.com/hanzoai/mail/mlog"
|
||||
"github.com/hanzoai/mail/moxio"
|
||||
"github.com/hanzoai/mail/scram"
|
||||
)
|
||||
|
||||
// Capability writes the IMAP4 "CAPABILITY" command, requesting a list of
|
||||
|
||||
+1
-1
@@ -7,7 +7,7 @@ import (
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/mjl-/mox/mlog"
|
||||
"github.com/hanzoai/mail/mlog"
|
||||
)
|
||||
|
||||
// todo: stricter parsing. xnonspace() and xword() should be replaced by proper parsers
|
||||
|
||||
@@ -3,7 +3,7 @@ package imapserver
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/mjl-/mox/imapclient"
|
||||
"github.com/hanzoai/mail/imapclient"
|
||||
)
|
||||
|
||||
func TestAppend(t *testing.T) {
|
||||
|
||||
@@ -20,10 +20,10 @@ import (
|
||||
|
||||
"golang.org/x/text/secure/precis"
|
||||
|
||||
"github.com/mjl-/mox/imapclient"
|
||||
"github.com/mjl-/mox/mox-"
|
||||
"github.com/mjl-/mox/scram"
|
||||
"github.com/mjl-/mox/store"
|
||||
"github.com/hanzoai/mail/imapclient"
|
||||
"github.com/hanzoai/mail/mox-"
|
||||
"github.com/hanzoai/mail/scram"
|
||||
"github.com/hanzoai/mail/store"
|
||||
)
|
||||
|
||||
func TestAuthenticateLogin(t *testing.T) {
|
||||
|
||||
@@ -7,9 +7,9 @@ import (
|
||||
|
||||
"github.com/mjl-/bstore"
|
||||
|
||||
"github.com/mjl-/mox/imapclient"
|
||||
"github.com/mjl-/mox/mox-"
|
||||
"github.com/mjl-/mox/store"
|
||||
"github.com/hanzoai/mail/imapclient"
|
||||
"github.com/hanzoai/mail/mox-"
|
||||
"github.com/hanzoai/mail/store"
|
||||
"slices"
|
||||
)
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@ package imapserver
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/mjl-/mox/imapclient"
|
||||
"github.com/hanzoai/mail/imapclient"
|
||||
)
|
||||
|
||||
func TestCopy(t *testing.T) {
|
||||
|
||||
@@ -3,7 +3,7 @@ package imapserver
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/mjl-/mox/imapclient"
|
||||
"github.com/hanzoai/mail/imapclient"
|
||||
)
|
||||
|
||||
func TestCreate(t *testing.T) {
|
||||
|
||||
@@ -3,7 +3,7 @@ package imapserver
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/mjl-/mox/imapclient"
|
||||
"github.com/hanzoai/mail/imapclient"
|
||||
)
|
||||
|
||||
func TestDelete(t *testing.T) {
|
||||
|
||||
@@ -3,7 +3,7 @@ package imapserver
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/mjl-/mox/imapclient"
|
||||
"github.com/hanzoai/mail/imapclient"
|
||||
)
|
||||
|
||||
func TestExpunge(t *testing.T) {
|
||||
|
||||
+5
-5
@@ -16,11 +16,11 @@ import (
|
||||
|
||||
"github.com/mjl-/bstore"
|
||||
|
||||
"github.com/mjl-/mox/message"
|
||||
"github.com/mjl-/mox/mlog"
|
||||
"github.com/mjl-/mox/mox-"
|
||||
"github.com/mjl-/mox/moxio"
|
||||
"github.com/mjl-/mox/store"
|
||||
"github.com/hanzoai/mail/message"
|
||||
"github.com/hanzoai/mail/mlog"
|
||||
"github.com/hanzoai/mail/mox-"
|
||||
"github.com/hanzoai/mail/moxio"
|
||||
"github.com/hanzoai/mail/store"
|
||||
)
|
||||
|
||||
// functions to handle fetch attribute requests are defined on fetchCmd.
|
||||
|
||||
@@ -7,8 +7,8 @@ import (
|
||||
|
||||
"github.com/mjl-/bstore"
|
||||
|
||||
"github.com/mjl-/mox/imapclient"
|
||||
"github.com/mjl-/mox/store"
|
||||
"github.com/hanzoai/mail/imapclient"
|
||||
"github.com/hanzoai/mail/store"
|
||||
)
|
||||
|
||||
func TestFetch(t *testing.T) {
|
||||
|
||||
@@ -12,10 +12,10 @@ import (
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/mjl-/mox/imapclient"
|
||||
"github.com/mjl-/mox/mlog"
|
||||
"github.com/mjl-/mox/mox-"
|
||||
"github.com/mjl-/mox/store"
|
||||
"github.com/hanzoai/mail/imapclient"
|
||||
"github.com/hanzoai/mail/mlog"
|
||||
"github.com/hanzoai/mail/mox-"
|
||||
"github.com/hanzoai/mail/store"
|
||||
)
|
||||
|
||||
// Fuzz the server. For each fuzz string, we set up servers in various connection states, and write the string as command.
|
||||
|
||||
@@ -5,7 +5,7 @@ import (
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/mjl-/mox/imapclient"
|
||||
"github.com/hanzoai/mail/imapclient"
|
||||
)
|
||||
|
||||
func TestIdle(t *testing.T) {
|
||||
|
||||
+2
-2
@@ -8,8 +8,8 @@ import (
|
||||
|
||||
"github.com/mjl-/bstore"
|
||||
|
||||
"github.com/mjl-/mox/mox-"
|
||||
"github.com/mjl-/mox/store"
|
||||
"github.com/hanzoai/mail/mox-"
|
||||
"github.com/hanzoai/mail/store"
|
||||
)
|
||||
|
||||
// LIST command, for listing mailboxes with various attributes, including about subscriptions and children.
|
||||
|
||||
@@ -3,8 +3,8 @@ package imapserver
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/mjl-/mox/imapclient"
|
||||
"github.com/mjl-/mox/store"
|
||||
"github.com/hanzoai/mail/imapclient"
|
||||
"github.com/hanzoai/mail/store"
|
||||
)
|
||||
|
||||
func TestListBasic(t *testing.T) {
|
||||
|
||||
@@ -3,7 +3,7 @@ package imapserver
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/mjl-/mox/imapclient"
|
||||
"github.com/hanzoai/mail/imapclient"
|
||||
)
|
||||
|
||||
func TestLsub(t *testing.T) {
|
||||
|
||||
@@ -5,7 +5,7 @@ import (
|
||||
"os"
|
||||
"testing"
|
||||
|
||||
"github.com/mjl-/mox/metrics"
|
||||
"github.com/hanzoai/mail/metrics"
|
||||
)
|
||||
|
||||
func TestMain(m *testing.M) {
|
||||
|
||||
@@ -7,7 +7,7 @@ import (
|
||||
|
||||
"github.com/mjl-/bstore"
|
||||
|
||||
"github.com/mjl-/mox/store"
|
||||
"github.com/hanzoai/mail/store"
|
||||
)
|
||||
|
||||
// Changed during tests.
|
||||
|
||||
@@ -5,7 +5,7 @@ import (
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/mjl-/mox/imapclient"
|
||||
"github.com/hanzoai/mail/imapclient"
|
||||
)
|
||||
|
||||
func TestMetadata(t *testing.T) {
|
||||
|
||||
@@ -3,7 +3,7 @@ package imapserver
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/mjl-/mox/imapclient"
|
||||
"github.com/hanzoai/mail/imapclient"
|
||||
)
|
||||
|
||||
func TestMove(t *testing.T) {
|
||||
|
||||
@@ -7,7 +7,7 @@ import (
|
||||
|
||||
"github.com/mjl-/bstore"
|
||||
|
||||
"github.com/mjl-/mox/store"
|
||||
"github.com/hanzoai/mail/store"
|
||||
)
|
||||
|
||||
// Max number of pending changes for selected-delayed mailbox before we write a
|
||||
|
||||
@@ -5,8 +5,8 @@ import (
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/mjl-/mox/imapclient"
|
||||
"github.com/mjl-/mox/store"
|
||||
"github.com/hanzoai/mail/imapclient"
|
||||
"github.com/hanzoai/mail/store"
|
||||
)
|
||||
|
||||
func TestNotify(t *testing.T) {
|
||||
|
||||
+1
-1
@@ -5,7 +5,7 @@ import (
|
||||
"io"
|
||||
"strings"
|
||||
|
||||
"github.com/mjl-/mox/mlog"
|
||||
"github.com/hanzoai/mail/mlog"
|
||||
)
|
||||
|
||||
type token interface {
|
||||
|
||||
@@ -4,7 +4,7 @@ import (
|
||||
"fmt"
|
||||
"time"
|
||||
|
||||
"github.com/mjl-/mox/store"
|
||||
"github.com/hanzoai/mail/store"
|
||||
)
|
||||
|
||||
type numSet struct {
|
||||
|
||||
@@ -3,7 +3,7 @@ package imapserver
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/mjl-/mox/store"
|
||||
"github.com/hanzoai/mail/store"
|
||||
)
|
||||
|
||||
func TestNumSetContains(t *testing.T) {
|
||||
|
||||
@@ -3,7 +3,7 @@ package imapserver
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/mjl-/mox/imapclient"
|
||||
"github.com/hanzoai/mail/imapclient"
|
||||
)
|
||||
|
||||
func TestQuota1(t *testing.T) {
|
||||
|
||||
@@ -3,7 +3,7 @@ package imapserver
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/mjl-/mox/imapclient"
|
||||
"github.com/hanzoai/mail/imapclient"
|
||||
)
|
||||
|
||||
func TestRename(t *testing.T) {
|
||||
|
||||
@@ -8,9 +8,9 @@ import (
|
||||
|
||||
"github.com/mjl-/bstore"
|
||||
|
||||
"github.com/mjl-/mox/message"
|
||||
"github.com/mjl-/mox/mlog"
|
||||
"github.com/mjl-/mox/store"
|
||||
"github.com/hanzoai/mail/message"
|
||||
"github.com/hanzoai/mail/mlog"
|
||||
"github.com/hanzoai/mail/store"
|
||||
)
|
||||
|
||||
// Replace relaces a message for another, atomically, possibly in another mailbox,
|
||||
|
||||
@@ -3,7 +3,7 @@ package imapserver
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/mjl-/mox/imapclient"
|
||||
"github.com/hanzoai/mail/imapclient"
|
||||
)
|
||||
|
||||
func TestReplace(t *testing.T) {
|
||||
|
||||
@@ -12,8 +12,8 @@ import (
|
||||
|
||||
"github.com/mjl-/bstore"
|
||||
|
||||
"github.com/mjl-/mox/message"
|
||||
"github.com/mjl-/mox/store"
|
||||
"github.com/hanzoai/mail/message"
|
||||
"github.com/hanzoai/mail/store"
|
||||
)
|
||||
|
||||
// If last search output was this long ago, we write an untagged inprogress
|
||||
|
||||
@@ -7,7 +7,7 @@ import (
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/mjl-/mox/imapclient"
|
||||
"github.com/hanzoai/mail/imapclient"
|
||||
)
|
||||
|
||||
var searchMsg = strings.ReplaceAll(`Date: Mon, 1 Jan 2022 10:00:00 +0100 (CEST)
|
||||
|
||||
@@ -4,7 +4,7 @@ import (
|
||||
"strings"
|
||||
"testing"
|
||||
|
||||
"github.com/mjl-/mox/imapclient"
|
||||
"github.com/hanzoai/mail/imapclient"
|
||||
)
|
||||
|
||||
func TestSelect(t *testing.T) {
|
||||
|
||||
+11
-11
@@ -67,17 +67,17 @@ import (
|
||||
"github.com/mjl-/bstore"
|
||||
"github.com/mjl-/flate"
|
||||
|
||||
"github.com/mjl-/mox/config"
|
||||
"github.com/mjl-/mox/junk"
|
||||
"github.com/mjl-/mox/message"
|
||||
"github.com/mjl-/mox/metrics"
|
||||
"github.com/mjl-/mox/mlog"
|
||||
"github.com/mjl-/mox/mox-"
|
||||
"github.com/mjl-/mox/moxio"
|
||||
"github.com/mjl-/mox/moxvar"
|
||||
"github.com/mjl-/mox/ratelimit"
|
||||
"github.com/mjl-/mox/scram"
|
||||
"github.com/mjl-/mox/store"
|
||||
"github.com/hanzoai/mail/config"
|
||||
"github.com/hanzoai/mail/junk"
|
||||
"github.com/hanzoai/mail/message"
|
||||
"github.com/hanzoai/mail/metrics"
|
||||
"github.com/hanzoai/mail/mlog"
|
||||
"github.com/hanzoai/mail/mox-"
|
||||
"github.com/hanzoai/mail/moxio"
|
||||
"github.com/hanzoai/mail/moxvar"
|
||||
"github.com/hanzoai/mail/ratelimit"
|
||||
"github.com/hanzoai/mail/scram"
|
||||
"github.com/hanzoai/mail/store"
|
||||
)
|
||||
|
||||
var (
|
||||
|
||||
@@ -21,11 +21,11 @@ import (
|
||||
|
||||
"github.com/mjl-/bstore"
|
||||
|
||||
"github.com/mjl-/mox/imapclient"
|
||||
"github.com/mjl-/mox/mlog"
|
||||
"github.com/mjl-/mox/mox-"
|
||||
"github.com/mjl-/mox/moxvar"
|
||||
"github.com/mjl-/mox/store"
|
||||
"github.com/hanzoai/mail/imapclient"
|
||||
"github.com/hanzoai/mail/mlog"
|
||||
"github.com/hanzoai/mail/mox-"
|
||||
"github.com/hanzoai/mail/moxvar"
|
||||
"github.com/hanzoai/mail/store"
|
||||
"slices"
|
||||
)
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@ package imapserver
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/mjl-/mox/imapclient"
|
||||
"github.com/hanzoai/mail/imapclient"
|
||||
)
|
||||
|
||||
func TestStatus(t *testing.T) {
|
||||
|
||||
@@ -4,7 +4,7 @@ import (
|
||||
"strings"
|
||||
"testing"
|
||||
|
||||
"github.com/mjl-/mox/imapclient"
|
||||
"github.com/hanzoai/mail/imapclient"
|
||||
)
|
||||
|
||||
func TestStore(t *testing.T) {
|
||||
|
||||
@@ -3,7 +3,7 @@ package imapserver
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/mjl-/mox/imapclient"
|
||||
"github.com/hanzoai/mail/imapclient"
|
||||
)
|
||||
|
||||
func TestSubscribe(t *testing.T) {
|
||||
|
||||
@@ -3,7 +3,7 @@ package imapserver
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/mjl-/mox/imapclient"
|
||||
"github.com/hanzoai/mail/imapclient"
|
||||
)
|
||||
|
||||
func TestUnselect(t *testing.T) {
|
||||
|
||||
@@ -3,7 +3,7 @@ package imapserver
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/mjl-/mox/imapclient"
|
||||
"github.com/hanzoai/mail/imapclient"
|
||||
)
|
||||
|
||||
func TestUnsubscribe(t *testing.T) {
|
||||
|
||||
@@ -18,12 +18,12 @@ import (
|
||||
|
||||
"golang.org/x/text/unicode/norm"
|
||||
|
||||
"github.com/mjl-/mox/config"
|
||||
"github.com/mjl-/mox/message"
|
||||
"github.com/mjl-/mox/metrics"
|
||||
"github.com/mjl-/mox/mox-"
|
||||
"github.com/mjl-/mox/moxio"
|
||||
"github.com/mjl-/mox/store"
|
||||
"github.com/hanzoai/mail/config"
|
||||
"github.com/hanzoai/mail/message"
|
||||
"github.com/hanzoai/mail/metrics"
|
||||
"github.com/hanzoai/mail/mox-"
|
||||
"github.com/hanzoai/mail/moxio"
|
||||
"github.com/hanzoai/mail/store"
|
||||
)
|
||||
|
||||
// todo: add option to trust imported messages, causing us to look at Authentication-Results and Received-SPF headers and add eg verified spf/dkim/dmarc domains to our store, to jumpstart reputation.
|
||||
|
||||
+6
-6
@@ -17,12 +17,12 @@ import (
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/mjl-/mox/dns"
|
||||
"github.com/mjl-/mox/imapclient"
|
||||
"github.com/mjl-/mox/mlog"
|
||||
"github.com/mjl-/mox/mox-"
|
||||
"github.com/mjl-/mox/sasl"
|
||||
"github.com/mjl-/mox/smtpclient"
|
||||
"github.com/hanzoai/mail/dns"
|
||||
"github.com/hanzoai/mail/imapclient"
|
||||
"github.com/hanzoai/mail/mlog"
|
||||
"github.com/hanzoai/mail/mox-"
|
||||
"github.com/hanzoai/mail/sasl"
|
||||
"github.com/hanzoai/mail/smtpclient"
|
||||
)
|
||||
|
||||
func tcheck(t *testing.T, err error, errmsg string) {
|
||||
|
||||
+3
-3
@@ -11,9 +11,9 @@ import (
|
||||
"slices"
|
||||
"time"
|
||||
|
||||
"github.com/mjl-/mox/dns"
|
||||
"github.com/mjl-/mox/mlog"
|
||||
"github.com/mjl-/mox/stub"
|
||||
"github.com/hanzoai/mail/dns"
|
||||
"github.com/hanzoai/mail/mlog"
|
||||
"github.com/hanzoai/mail/stub"
|
||||
)
|
||||
|
||||
var xlog = mlog.New("iprev", nil)
|
||||
|
||||
+1
-1
@@ -7,7 +7,7 @@ import (
|
||||
"strings"
|
||||
"testing"
|
||||
|
||||
"github.com/mjl-/mox/dns"
|
||||
"github.com/hanzoai/mail/dns"
|
||||
)
|
||||
|
||||
func TestIPRev(t *testing.T) {
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user