mirror of
https://github.com/mjl-/mox.git
synced 2024-12-26 16:33:47 +03:00
614576e409
per listener, you could enable the admin/account/webmail/webapi handlers. but that would serve those services on their configured paths (/admin/, /, /webmail/, /webapi/) on all domains mox would be webserving, including any non-mail domains. so your www.example/admin/ would be serving the admin web interface, with no way to disabled that. with this change, the admin interface is only served on requests to (based on Host header): - ip addresses - the listener host name (explicitly configured in the listener, with fallback to global hostname) - "localhost" (for ssh tunnel/forwarding scenario's) the account/webmail/webapi interfaces are served on the same domains as the admin interface, and additionally: - the client settings domains, as optionally configured in each Domain in domains.conf. typically "mail.<yourdomain>". this means the internal services are no longer served on other domains configured in the webserver, e.g. www.example.org/admin/ will not be handled specially. the order of evaluation of routes/services is also changed: before this change, the internal handlers would always be evaluated first. with this change, only the system handlers for MTA-STS/autoconfig/ACME-validation will be evaluated first. then the webserver handlers. and finally the internal services (admin/account/webmail/webapi). this allows an admin to configure overrides for some of the domains (per hostname-matching rules explained above) that would normally serve these services. webserver handlers can now be configured that pass the request to an internal service: in addition to the existing static/redirect/forward config options, there is now an "internal" config option, naming the service (admin/account/webmail/webapi) for handling the request. this allows enabling the internal services on custom domains. for issue #160 by TragicLifeHu, thanks for reporting!
75 lines
3.2 KiB
Go
75 lines
3.2 KiB
Go
package http
|
|
|
|
import (
|
|
"bytes"
|
|
"net/http"
|
|
"net/http/httptest"
|
|
"os"
|
|
"path/filepath"
|
|
"testing"
|
|
|
|
"github.com/mjl-/mox/mox-"
|
|
)
|
|
|
|
func TestServeHTTP(t *testing.T) {
|
|
os.RemoveAll("../testdata/web/data")
|
|
mox.ConfigStaticPath = filepath.FromSlash("../testdata/web/mox.conf")
|
|
mox.ConfigDynamicPath = filepath.Join(filepath.Dir(mox.ConfigStaticPath), "domains.conf")
|
|
mox.MustLoadConfig(true, false)
|
|
|
|
portSrvs := portServes(mox.Conf.Static.Listeners["local"])
|
|
srv := portSrvs[80]
|
|
|
|
test := func(method, target string, expCode int, expContent string, expHeaders map[string]string) {
|
|
t.Helper()
|
|
|
|
req := httptest.NewRequest(method, target, nil)
|
|
rw := httptest.NewRecorder()
|
|
rw.Body = &bytes.Buffer{}
|
|
srv.ServeHTTP(rw, req)
|
|
resp := rw.Result()
|
|
if resp.StatusCode != expCode {
|
|
t.Errorf("got statuscode %d, expected %d", resp.StatusCode, expCode)
|
|
}
|
|
if expContent != "" {
|
|
s := rw.Body.String()
|
|
if s != expContent {
|
|
t.Errorf("got response data %q, expected %q", s, expContent)
|
|
}
|
|
}
|
|
for k, v := range expHeaders {
|
|
if xv := resp.Header.Get(k); xv != v {
|
|
t.Errorf("got %q for header %q, expected %q", xv, k, v)
|
|
}
|
|
}
|
|
}
|
|
|
|
test("GET", "http://mta-sts.mox.example/.well-known/mta-sts.txt", http.StatusOK, "version: STSv1\nmode: enforce\nmax_age: 86400\nmx: mox.example\n", nil)
|
|
test("GET", "http://mox.example/.well-known/mta-sts.txt", http.StatusNotFound, "", nil) // mta-sts endpoint not in this domain.
|
|
test("GET", "http://mta-sts.mox.example/static/", http.StatusNotFound, "", nil) // static not served on this domain.
|
|
test("GET", "http://mta-sts.mox.example/other", http.StatusNotFound, "", nil)
|
|
test("GET", "http://mox.example/static/", http.StatusOK, "html\n", map[string]string{"X-Test": "mox"}) // index.html is served
|
|
test("GET", "http://mox.example/static/index.html", http.StatusOK, "html\n", map[string]string{"X-Test": "mox"})
|
|
test("GET", "http://mox.example/static/dir/", http.StatusOK, "", map[string]string{"X-Test": "mox"}) // Dir listing.
|
|
test("GET", "http://mox.example/other", http.StatusNotFound, "", nil)
|
|
|
|
// Webmail on IP, localhost, mail host, clientsettingsdomain, not others.
|
|
test("GET", "http://127.0.0.1/webmail/", http.StatusOK, "", nil)
|
|
test("GET", "http://localhost/webmail/", http.StatusOK, "", nil)
|
|
test("GET", "http://mox.example/webmail/", http.StatusOK, "", nil)
|
|
test("GET", "http://mail.mox.example/webmail/", http.StatusOK, "", nil)
|
|
test("GET", "http://mail.other.example/webmail/", http.StatusNotFound, "", nil)
|
|
test("GET", "http://remotehost/webmail/", http.StatusNotFound, "", nil)
|
|
|
|
// admin on IP, localhost, mail host, not clientsettingsdomain.
|
|
test("GET", "http://127.0.0.1/admin/", http.StatusOK, "", nil)
|
|
test("GET", "http://localhost/admin/", http.StatusOK, "", nil)
|
|
test("GET", "http://mox.example/admin/", http.StatusPermanentRedirect, "", nil) // Override by WebHandler.
|
|
test("GET", "http://mail.mox.example/admin/", http.StatusNotFound, "", nil)
|
|
|
|
// account is off.
|
|
test("GET", "http://127.0.0.1/", http.StatusNotFound, "", nil)
|
|
test("GET", "http://localhost/", http.StatusNotFound, "", nil)
|
|
test("GET", "http://mox.example/", http.StatusNotFound, "", nil)
|
|
test("GET", "http://mail.mox.example/", http.StatusNotFound, "", nil)
|
|
}
|