Use portal mailer in tests instead of stub mailer

This commit is contained in:
Taras Kushnir
2026-01-11 15:44:15 +02:00
parent 17f577a4f7
commit f3dd1fafcb
12 changed files with 162 additions and 112 deletions

View File

@@ -10,23 +10,37 @@ import (
type StubMailer struct {
LastCode int
LastEmail string
Mailer common.Mailer
}
var _ common.Mailer = (*StubMailer)(nil)
func (sm *StubMailer) SendTwoFactor(ctx context.Context, email string, code int, ua string, location string) error {
slog.InfoContext(ctx, "Sent two factor code via email", "code", code, "email", email)
sm.LastCode = code
sm.LastEmail = email
if sm.Mailer != nil {
return sm.Mailer.SendTwoFactor(ctx, email, code, ua, location)
}
slog.InfoContext(ctx, "Sent two factor code via email", "code", code, "email", email)
return nil
}
func (sm *StubMailer) SendWelcome(ctx context.Context, email, name string) error {
if sm.Mailer != nil {
return sm.Mailer.SendWelcome(ctx, email, name)
}
slog.InfoContext(ctx, "Sent welcome email", "email", email, "name", name)
return nil
}
func (sm *StubMailer) SendOrgInvite(ctx context.Context, email, name string, orgName, orgOwnerEmail, orgOwnerName, orgURL string, requiresRegister bool) error {
if sm.Mailer != nil {
return sm.Mailer.SendOrgInvite(ctx, email, name, orgName, orgOwnerEmail, orgOwnerName, orgURL, requiresRegister)
}
slog.InfoContext(ctx, "Sent org invite email", "email", email, "name", name, "requiresRegister", requiresRegister)
return nil
}

View File

@@ -14,7 +14,6 @@ import (
"github.com/PrivateCaptcha/PrivateCaptcha/pkg/db"
dbgen "github.com/PrivateCaptcha/PrivateCaptcha/pkg/db/generated"
db_tests "github.com/PrivateCaptcha/PrivateCaptcha/pkg/db/tests"
"github.com/PrivateCaptcha/PrivateCaptcha/pkg/email"
portal_tests "github.com/PrivateCaptcha/PrivateCaptcha/pkg/portal/tests"
)
@@ -531,7 +530,7 @@ func TestGetAuditLogs(t *testing.T) {
srv := http.NewServeMux()
server.Setup(portalDomain(), common.NoopMiddleware).Register(srv)
cookie, err := portal_tests.AuthenticateSuite(ctx, user.Email, srv, server.XSRF, server.Sessions.CookieName, server.Mailer.(*email.StubMailer))
cookie, err := portal_tests.AuthenticateSuite(ctx, user.Email, srv, server.XSRF, server.Sessions)
if err != nil {
t.Fatal(err)
}
@@ -878,7 +877,7 @@ func TestAuditLogEndpointsInvalidParams(t *testing.T) {
srv := http.NewServeMux()
server.Setup(portalDomain(), common.NoopMiddleware).Register(srv)
cookie, err := portal_tests.AuthenticateSuite(ctx, user.Email, srv, server.XSRF, server.Sessions.CookieName, server.Mailer.(*email.StubMailer))
cookie, err := portal_tests.AuthenticateSuite(ctx, user.Email, srv, server.XSRF, server.Sessions)
if err != nil {
t.Fatal(err)
}
@@ -933,7 +932,7 @@ func TestExportAuditLogsCSV(t *testing.T) {
srv := http.NewServeMux()
server.Setup(portalDomain(), common.NoopMiddleware).Register(srv)
cookie, err := portal_tests.AuthenticateSuite(ctx, user.Email, srv, server.XSRF, server.Sessions.CookieName, server.Mailer.(*email.StubMailer))
cookie, err := portal_tests.AuthenticateSuite(ctx, user.Email, srv, server.XSRF, server.Sessions)
if err != nil {
t.Fatal(err)
}

View File

@@ -9,7 +9,6 @@ import (
"github.com/PrivateCaptcha/PrivateCaptcha/pkg/common"
db_tests "github.com/PrivateCaptcha/PrivateCaptcha/pkg/db/tests"
"github.com/PrivateCaptcha/PrivateCaptcha/pkg/email"
portal_tests "github.com/PrivateCaptcha/PrivateCaptcha/pkg/portal/tests"
)
@@ -91,7 +90,7 @@ func TestPostClientSideError(t *testing.T) {
srv := http.NewServeMux()
server.Setup(portalDomain(), common.NoopMiddleware).Register(srv)
cookie, err := portal_tests.AuthenticateSuite(ctx, user.Email, srv, server.XSRF, server.Sessions.CookieName, server.Mailer.(*email.StubMailer))
cookie, err := portal_tests.AuthenticateSuite(ctx, user.Email, srv, server.XSRF, server.Sessions)
if err != nil {
t.Fatal(err)
}

View File

@@ -13,7 +13,6 @@ import (
"github.com/PrivateCaptcha/PrivateCaptcha/pkg/common"
db_tests "github.com/PrivateCaptcha/PrivateCaptcha/pkg/db/tests"
"github.com/PrivateCaptcha/PrivateCaptcha/pkg/email"
portal_tests "github.com/PrivateCaptcha/PrivateCaptcha/pkg/portal/tests"
"github.com/PrivateCaptcha/PrivateCaptcha/pkg/session"
)
@@ -140,18 +139,14 @@ func TestPostLogin(t *testing.T) {
req.Header.Set(common.HeaderContentType, common.ContentTypeURLEncoded)
rr = httptest.NewRecorder()
server.postLogin(rr, req)
resp := rr.Result()
if rr.Code != http.StatusOK {
t.Errorf("Unexpected post login code: %v", rr.Code)
if resp.StatusCode != http.StatusOK {
t.Errorf("Unexpected post login code: %v", resp.StatusCode)
}
// Check if the two-factor code is set in the StubMailer
stubMailer, ok := server.Mailer.(*email.StubMailer)
if !ok {
t.Fatal("failed to cast Mailer to StubMailer")
}
if stubMailer.LastCode == 0 {
t.Error("two-factor code not set in StubMailer")
if _, err := portal_tests.TwoFactorCodeFromResponse(ctx, resp, server.Sessions); err != nil {
t.Error(err)
}
}
@@ -319,7 +314,7 @@ func TestLogout(t *testing.T) {
t.Fatalf("failed to create new account: %v", err)
}
cookie, err := portal_tests.AuthenticateSuite(ctx, user.Email, srv, server.XSRF, server.Sessions.CookieName, server.Mailer.(*email.StubMailer))
cookie, err := portal_tests.AuthenticateSuite(ctx, user.Email, srv, server.XSRF, server.Sessions)
if err != nil {
t.Fatal(err)
}

View File

@@ -8,7 +8,6 @@ import (
"github.com/PrivateCaptcha/PrivateCaptcha/pkg/common"
db_tests "github.com/PrivateCaptcha/PrivateCaptcha/pkg/db/tests"
"github.com/PrivateCaptcha/PrivateCaptcha/pkg/email"
portal_tests "github.com/PrivateCaptcha/PrivateCaptcha/pkg/portal/tests"
"github.com/PrivateCaptcha/PrivateCaptcha/pkg/session"
)
@@ -36,7 +35,7 @@ func TestDismissNotification(t *testing.T) {
t.Fatalf("Failed to create notification: %v", err)
}
cookie, err := portal_tests.AuthenticateSuite(ctx, user.Email, srv, server.XSRF, server.Sessions.CookieName, server.Mailer.(*email.StubMailer))
cookie, err := portal_tests.AuthenticateSuite(ctx, user.Email, srv, server.XSRF, server.Sessions)
if err != nil {
t.Fatalf("Failed to authenticate: %v", err)
}
@@ -92,7 +91,7 @@ func TestDismissNotificationInvalidID(t *testing.T) {
t.Fatalf("Failed to create account: %v", err)
}
cookie, err := portal_tests.AuthenticateSuite(ctx, user.Email, srv, server.XSRF, server.Sessions.CookieName, server.Mailer.(*email.StubMailer))
cookie, err := portal_tests.AuthenticateSuite(ctx, user.Email, srv, server.XSRF, server.Sessions)
if err != nil {
t.Fatalf("Failed to authenticate: %v", err)
}

View File

@@ -12,7 +12,6 @@ import (
"github.com/PrivateCaptcha/PrivateCaptcha/pkg/common"
dbgen "github.com/PrivateCaptcha/PrivateCaptcha/pkg/db/generated"
db_tests "github.com/PrivateCaptcha/PrivateCaptcha/pkg/db/tests"
"github.com/PrivateCaptcha/PrivateCaptcha/pkg/email"
portal_tests "github.com/PrivateCaptcha/PrivateCaptcha/pkg/portal/tests"
)
@@ -36,7 +35,7 @@ func TestGetAnotherUsersOrg(t *testing.T) {
srv := http.NewServeMux()
server.Setup(portalDomain(), common.NoopMiddleware).Register(srv)
cookie, err := portal_tests.AuthenticateSuite(ctx, user2.Email, srv, server.XSRF, server.Sessions.CookieName, server.Mailer.(*email.StubMailer))
cookie, err := portal_tests.AuthenticateSuite(ctx, user2.Email, srv, server.XSRF, server.Sessions)
if err != nil {
t.Fatal(err)
}
@@ -84,7 +83,7 @@ func TestInviteUser(t *testing.T) {
srv := http.NewServeMux()
server.Setup(portalDomain(), common.NoopMiddleware).Register(srv)
cookie, err := portal_tests.AuthenticateSuite(ctx, user1.Email, srv, server.XSRF, server.Sessions.CookieName, server.Mailer.(*email.StubMailer))
cookie, err := portal_tests.AuthenticateSuite(ctx, user1.Email, srv, server.XSRF, server.Sessions)
if err != nil {
t.Fatal(err)
}
@@ -154,7 +153,7 @@ func TestDeleteUserFromOrgPermissions(t *testing.T) {
srv := http.NewServeMux()
server.Setup(portalDomain(), common.NoopMiddleware).Register(srv)
cookie, err := portal_tests.AuthenticateSuite(ctx, userMember1.Email, srv, server.XSRF, server.Sessions.CookieName, server.Mailer.(*email.StubMailer))
cookie, err := portal_tests.AuthenticateSuite(ctx, userMember1.Email, srv, server.XSRF, server.Sessions)
if err != nil {
t.Fatal(err)
}
@@ -202,7 +201,7 @@ func TestGetNewOrg(t *testing.T) {
srv := http.NewServeMux()
server.Setup(portalDomain(), common.NoopMiddleware).Register(srv)
cookie, err := portal_tests.AuthenticateSuite(ctx, user.Email, srv, server.XSRF, server.Sessions.CookieName, server.Mailer.(*email.StubMailer))
cookie, err := portal_tests.AuthenticateSuite(ctx, user.Email, srv, server.XSRF, server.Sessions)
if err != nil {
t.Fatal(err)
}
@@ -249,7 +248,7 @@ func TestGetOrgDashboard(t *testing.T) {
srv := http.NewServeMux()
server.Setup(portalDomain(), common.NoopMiddleware).Register(srv)
cookie, err := portal_tests.AuthenticateSuite(ctx, user.Email, srv, server.XSRF, server.Sessions.CookieName, server.Mailer.(*email.StubMailer))
cookie, err := portal_tests.AuthenticateSuite(ctx, user.Email, srv, server.XSRF, server.Sessions)
if err != nil {
t.Fatal(err)
}
@@ -305,7 +304,7 @@ func TestGetOrgProperties(t *testing.T) {
srv := http.NewServeMux()
server.Setup(portalDomain(), common.NoopMiddleware).Register(srv)
cookie, err := portal_tests.AuthenticateSuite(ctx, user.Email, srv, server.XSRF, server.Sessions.CookieName, server.Mailer.(*email.StubMailer))
cookie, err := portal_tests.AuthenticateSuite(ctx, user.Email, srv, server.XSRF, server.Sessions)
if err != nil {
t.Fatal(err)
}
@@ -353,7 +352,7 @@ func TestGetOrgMembers(t *testing.T) {
srv := http.NewServeMux()
server.Setup(portalDomain(), common.NoopMiddleware).Register(srv)
cookie, err := portal_tests.AuthenticateSuite(ctx, user.Email, srv, server.XSRF, server.Sessions.CookieName, server.Mailer.(*email.StubMailer))
cookie, err := portal_tests.AuthenticateSuite(ctx, user.Email, srv, server.XSRF, server.Sessions)
if err != nil {
t.Fatal(err)
}
@@ -401,7 +400,7 @@ func TestGetOrgSettings(t *testing.T) {
srv := http.NewServeMux()
server.Setup(portalDomain(), common.NoopMiddleware).Register(srv)
cookie, err := portal_tests.AuthenticateSuite(ctx, user.Email, srv, server.XSRF, server.Sessions.CookieName, server.Mailer.(*email.StubMailer))
cookie, err := portal_tests.AuthenticateSuite(ctx, user.Email, srv, server.XSRF, server.Sessions)
if err != nil {
t.Fatal(err)
}
@@ -453,7 +452,7 @@ func TestGetOrgAuditLogs(t *testing.T) {
srv := http.NewServeMux()
server.Setup(portalDomain(), common.NoopMiddleware).Register(srv)
cookie, err := portal_tests.AuthenticateSuite(ctx, user.Email, srv, server.XSRF, server.Sessions.CookieName, server.Mailer.(*email.StubMailer))
cookie, err := portal_tests.AuthenticateSuite(ctx, user.Email, srv, server.XSRF, server.Sessions)
if err != nil {
t.Fatal(err)
}
@@ -501,7 +500,7 @@ func TestPutOrg(t *testing.T) {
srv := http.NewServeMux()
server.Setup(portalDomain(), common.NoopMiddleware).Register(srv)
cookie, err := portal_tests.AuthenticateSuite(ctx, user.Email, srv, server.XSRF, server.Sessions.CookieName, server.Mailer.(*email.StubMailer))
cookie, err := portal_tests.AuthenticateSuite(ctx, user.Email, srv, server.XSRF, server.Sessions)
if err != nil {
t.Fatal(err)
}
@@ -561,7 +560,7 @@ func TestPostNewOrg(t *testing.T) {
srv := http.NewServeMux()
server.Setup(portalDomain(), common.NoopMiddleware).Register(srv)
cookie, err := portal_tests.AuthenticateSuite(ctx, user.Email, srv, server.XSRF, server.Sessions.CookieName, server.Mailer.(*email.StubMailer))
cookie, err := portal_tests.AuthenticateSuite(ctx, user.Email, srv, server.XSRF, server.Sessions)
if err != nil {
t.Fatal(err)
}
@@ -616,7 +615,7 @@ func TestJoinOrg(t *testing.T) {
srv := http.NewServeMux()
server.Setup(portalDomain(), common.NoopMiddleware).Register(srv)
cookie, err := portal_tests.AuthenticateSuite(ctx, user.Email, srv, server.XSRF, server.Sessions.CookieName, server.Mailer.(*email.StubMailer))
cookie, err := portal_tests.AuthenticateSuite(ctx, user.Email, srv, server.XSRF, server.Sessions)
if err != nil {
t.Fatal(err)
}
@@ -678,7 +677,7 @@ func TestLeaveOrg(t *testing.T) {
srv := http.NewServeMux()
server.Setup(portalDomain(), common.NoopMiddleware).Register(srv)
cookie, err := portal_tests.AuthenticateSuite(ctx, user.Email, srv, server.XSRF, server.Sessions.CookieName, server.Mailer.(*email.StubMailer))
cookie, err := portal_tests.AuthenticateSuite(ctx, user.Email, srv, server.XSRF, server.Sessions)
if err != nil {
t.Fatal(err)
}
@@ -728,7 +727,7 @@ func TestDeleteOrg(t *testing.T) {
srv := http.NewServeMux()
server.Setup(portalDomain(), common.NoopMiddleware).Register(srv)
cookie, err := portal_tests.AuthenticateSuite(ctx, user.Email, srv, server.XSRF, server.Sessions.CookieName, server.Mailer.(*email.StubMailer))
cookie, err := portal_tests.AuthenticateSuite(ctx, user.Email, srv, server.XSRF, server.Sessions)
if err != nil {
t.Fatal(err)
}
@@ -787,7 +786,7 @@ func TestTransferOrg(t *testing.T) {
srv := http.NewServeMux()
server.Setup(portalDomain(), common.NoopMiddleware).Register(srv)
cookie, err := portal_tests.AuthenticateSuite(ctx, owner.Email, srv, server.XSRF, server.Sessions.CookieName, server.Mailer.(*email.StubMailer))
cookie, err := portal_tests.AuthenticateSuite(ctx, owner.Email, srv, server.XSRF, server.Sessions)
if err != nil {
t.Fatal(err)
}
@@ -853,7 +852,7 @@ func TestTransferOrgInvalidParams(t *testing.T) {
srv := http.NewServeMux()
server.Setup(portalDomain(), common.NoopMiddleware).Register(srv)
cookie, err := portal_tests.AuthenticateSuite(ctx, owner.Email, srv, server.XSRF, server.Sessions.CookieName, server.Mailer.(*email.StubMailer))
cookie, err := portal_tests.AuthenticateSuite(ctx, owner.Email, srv, server.XSRF, server.Sessions)
if err != nil {
t.Fatal(err)
}
@@ -910,7 +909,7 @@ func TestTransferOrgNotOwner(t *testing.T) {
server.Setup(portalDomain(), common.NoopMiddleware).Register(srv)
// Authenticate as the member (not the owner)
cookie, err := portal_tests.AuthenticateSuite(ctx, member.Email, srv, server.XSRF, server.Sessions.CookieName, server.Mailer.(*email.StubMailer))
cookie, err := portal_tests.AuthenticateSuite(ctx, member.Email, srv, server.XSRF, server.Sessions)
if err != nil {
t.Fatal(err)
}
@@ -958,7 +957,7 @@ func TestTransferOrgToNonMember(t *testing.T) {
srv := http.NewServeMux()
server.Setup(portalDomain(), common.NoopMiddleware).Register(srv)
cookie, err := portal_tests.AuthenticateSuite(ctx, owner.Email, srv, server.XSRF, server.Sessions.CookieName, server.Mailer.(*email.StubMailer))
cookie, err := portal_tests.AuthenticateSuite(ctx, owner.Email, srv, server.XSRF, server.Sessions)
if err != nil {
t.Fatal(err)
}
@@ -1011,7 +1010,7 @@ func TestTransferOrgToInvitedMember(t *testing.T) {
srv := http.NewServeMux()
server.Setup(portalDomain(), common.NoopMiddleware).Register(srv)
cookie, err := portal_tests.AuthenticateSuite(ctx, owner.Email, srv, server.XSRF, server.Sessions.CookieName, server.Mailer.(*email.StubMailer))
cookie, err := portal_tests.AuthenticateSuite(ctx, owner.Email, srv, server.XSRF, server.Sessions)
if err != nil {
t.Fatal(err)
}
@@ -1053,7 +1052,7 @@ func TestOrgEndpointsInvalidPathArg(t *testing.T) {
srv := http.NewServeMux()
server.Setup(portalDomain(), common.NoopMiddleware).Register(srv)
cookie, err := portal_tests.AuthenticateSuite(ctx, user.Email, srv, server.XSRF, server.Sessions.CookieName, server.Mailer.(*email.StubMailer))
cookie, err := portal_tests.AuthenticateSuite(ctx, user.Email, srv, server.XSRF, server.Sessions)
if err != nil {
t.Fatal(err)
}
@@ -1106,7 +1105,7 @@ func TestOrgEndpointsWrongOwnership(t *testing.T) {
srv := http.NewServeMux()
server.Setup(portalDomain(), common.NoopMiddleware).Register(srv)
cookie, err := portal_tests.AuthenticateSuite(ctx, user2.Email, srv, server.XSRF, server.Sessions.CookieName, server.Mailer.(*email.StubMailer))
cookie, err := portal_tests.AuthenticateSuite(ctx, user2.Email, srv, server.XSRF, server.Sessions)
if err != nil {
t.Fatal(err)
}
@@ -1170,7 +1169,7 @@ func TestOrgEndpointsMissingSubscription(t *testing.T) {
srv := http.NewServeMux()
server.Setup(portalDomain(), common.NoopMiddleware).Register(srv)
cookie, err := portal_tests.AuthenticateSuite(ctx, user.Email, srv, server.XSRF, server.Sessions.CookieName, server.Mailer.(*email.StubMailer))
cookie, err := portal_tests.AuthenticateSuite(ctx, user.Email, srv, server.XSRF, server.Sessions)
if err != nil {
t.Fatal(err)
}
@@ -1214,7 +1213,7 @@ func TestOrgEndpointsInvalidFormArgs(t *testing.T) {
srv := http.NewServeMux()
server.Setup(portalDomain(), common.NoopMiddleware).Register(srv)
cookie, err := portal_tests.AuthenticateSuite(ctx, user.Email, srv, server.XSRF, server.Sessions.CookieName, server.Mailer.(*email.StubMailer))
cookie, err := portal_tests.AuthenticateSuite(ctx, user.Email, srv, server.XSRF, server.Sessions)
if err != nil {
t.Fatal(err)
}
@@ -1271,7 +1270,7 @@ func TestOrgMemberEndpointsInvalidForm(t *testing.T) {
srv := http.NewServeMux()
server.Setup(portalDomain(), common.NoopMiddleware).Register(srv)
cookie, err := portal_tests.AuthenticateSuite(ctx, user.Email, srv, server.XSRF, server.Sessions.CookieName, server.Mailer.(*email.StubMailer))
cookie, err := portal_tests.AuthenticateSuite(ctx, user.Email, srv, server.XSRF, server.Sessions)
if err != nil {
t.Fatal(err)
}
@@ -1333,7 +1332,7 @@ func TestOrgMemberEndpointsInvalidPathArg(t *testing.T) {
srv := http.NewServeMux()
server.Setup(portalDomain(), common.NoopMiddleware).Register(srv)
cookie, err := portal_tests.AuthenticateSuite(ctx, user.Email, srv, server.XSRF, server.Sessions.CookieName, server.Mailer.(*email.StubMailer))
cookie, err := portal_tests.AuthenticateSuite(ctx, user.Email, srv, server.XSRF, server.Sessions)
if err != nil {
t.Fatal(err)
}
@@ -1387,7 +1386,7 @@ func TestInviteNonExistingUserByEmail(t *testing.T) {
srv := http.NewServeMux()
server.Setup(portalDomain(), common.NoopMiddleware).Register(srv)
cookie, err := portal_tests.AuthenticateSuite(ctx, user1.Email, srv, server.XSRF, server.Sessions.CookieName, server.Mailer.(*email.StubMailer))
cookie, err := portal_tests.AuthenticateSuite(ctx, user1.Email, srv, server.XSRF, server.Sessions)
if err != nil {
t.Fatal(err)
}
@@ -1590,7 +1589,7 @@ func TestOrgMembersShowsEmailInvites(t *testing.T) {
srv := http.NewServeMux()
server.Setup(portalDomain(), common.NoopMiddleware).Register(srv)
cookie, err := portal_tests.AuthenticateSuite(ctx, owner.Email, srv, server.XSRF, server.Sessions.CookieName, server.Mailer.(*email.StubMailer))
cookie, err := portal_tests.AuthenticateSuite(ctx, owner.Email, srv, server.XSRF, server.Sessions)
if err != nil {
t.Fatal(err)
}
@@ -1677,7 +1676,7 @@ func TestOrgMemberBecomesMemberAfterJoining(t *testing.T) {
srv := http.NewServeMux()
server.Setup(portalDomain(), common.NoopMiddleware).Register(srv)
cookie, err := portal_tests.AuthenticateSuite(ctx, owner.Email, srv, server.XSRF, server.Sessions.CookieName, server.Mailer.(*email.StubMailer))
cookie, err := portal_tests.AuthenticateSuite(ctx, owner.Email, srv, server.XSRF, server.Sessions)
if err != nil {
t.Fatal(err)
}
@@ -1766,7 +1765,7 @@ func TestDeleteOrgMembers(t *testing.T) {
server.Setup(portalDomain(), common.NoopMiddleware).Register(srv)
// Authenticate as owner
cookie, err := portal_tests.AuthenticateSuite(ctx, owner.Email, srv, server.XSRF, server.Sessions.CookieName, server.Mailer.(*email.StubMailer))
cookie, err := portal_tests.AuthenticateSuite(ctx, owner.Email, srv, server.XSRF, server.Sessions)
if err != nil {
t.Fatal(err)
}

View File

@@ -15,9 +15,8 @@ import (
"github.com/PrivateCaptcha/PrivateCaptcha/pkg/db"
dbgen "github.com/PrivateCaptcha/PrivateCaptcha/pkg/db/generated"
db_tests "github.com/PrivateCaptcha/PrivateCaptcha/pkg/db/tests"
"github.com/PrivateCaptcha/PrivateCaptcha/pkg/email"
"github.com/PrivateCaptcha/PrivateCaptcha/pkg/puzzle"
portal_tests "github.com/PrivateCaptcha/PrivateCaptcha/pkg/portal/tests"
"github.com/PrivateCaptcha/PrivateCaptcha/pkg/puzzle"
)
func TestGetNewOrgProperty(t *testing.T) {
@@ -34,7 +33,7 @@ func TestGetNewOrgProperty(t *testing.T) {
srv := http.NewServeMux()
server.Setup(portalDomain(), common.NoopMiddleware).Register(srv)
cookie, err := portal_tests.AuthenticateSuite(ctx, user.Email, srv, server.XSRF, server.Sessions.CookieName, server.Mailer.(*email.StubMailer))
cookie, err := portal_tests.AuthenticateSuite(ctx, user.Email, srv, server.XSRF, server.Sessions)
if err != nil {
t.Fatal(err)
}
@@ -108,7 +107,7 @@ func TestPutPropertyInsufficientPermissions(t *testing.T) {
srv := http.NewServeMux()
server.Setup(portalDomain(), common.NoopMiddleware).Register(srv)
cookie, err := portal_tests.AuthenticateSuite(ctx, user2.Email, srv, server.XSRF, server.Sessions.CookieName, server.Mailer.(*email.StubMailer))
cookie, err := portal_tests.AuthenticateSuite(ctx, user2.Email, srv, server.XSRF, server.Sessions)
if err != nil {
t.Fatal(err)
}
@@ -152,7 +151,7 @@ func TestPostNewOrgProperty(t *testing.T) {
srv := http.NewServeMux()
server.Setup(portalDomain(), common.NoopMiddleware).Register(srv)
cookie, err := portal_tests.AuthenticateSuite(ctx, user.Email, srv, server.XSRF, server.Sessions.CookieName, server.Mailer.(*email.StubMailer))
cookie, err := portal_tests.AuthenticateSuite(ctx, user.Email, srv, server.XSRF, server.Sessions)
if err != nil {
t.Fatal(err)
}
@@ -225,7 +224,7 @@ func TestMoveProperty(t *testing.T) {
srv := http.NewServeMux()
server.Setup(portalDomain(), common.NoopMiddleware).Register(srv)
cookie, err := portal_tests.AuthenticateSuite(ctx, user.Email, srv, server.XSRF, server.Sessions.CookieName, server.Mailer.(*email.StubMailer))
cookie, err := portal_tests.AuthenticateSuite(ctx, user.Email, srv, server.XSRF, server.Sessions)
if err != nil {
t.Fatal(err)
}
@@ -319,7 +318,7 @@ func TestGetPropertyStats(t *testing.T) {
srv := http.NewServeMux()
server.Setup(portalDomain(), common.NoopMiddleware).Register(srv)
cookie, err := portal_tests.AuthenticateSuite(ctx, user.Email, srv, server.XSRF, server.Sessions.CookieName, server.Mailer.(*email.StubMailer))
cookie, err := portal_tests.AuthenticateSuite(ctx, user.Email, srv, server.XSRF, server.Sessions)
if err != nil {
t.Fatal(err)
}
@@ -434,7 +433,7 @@ func TestGetOrgProperty(t *testing.T) {
srv := http.NewServeMux()
server.Setup(portalDomain(), common.NoopMiddleware).Register(srv)
cookie, err := portal_tests.AuthenticateSuite(ctx, user.Email, srv, server.XSRF, server.Sessions.CookieName, server.Mailer.(*email.StubMailer))
cookie, err := portal_tests.AuthenticateSuite(ctx, user.Email, srv, server.XSRF, server.Sessions)
if err != nil {
t.Fatal(err)
}
@@ -491,7 +490,7 @@ func TestGetOrgPropertySettings(t *testing.T) {
srv := http.NewServeMux()
server.Setup(portalDomain(), common.NoopMiddleware).Register(srv)
cookie, err := portal_tests.AuthenticateSuite(ctx, user.Email, srv, server.XSRF, server.Sessions.CookieName, server.Mailer.(*email.StubMailer))
cookie, err := portal_tests.AuthenticateSuite(ctx, user.Email, srv, server.XSRF, server.Sessions)
if err != nil {
t.Fatal(err)
}
@@ -540,7 +539,7 @@ func TestGetPropertyDashboard(t *testing.T) {
srv := http.NewServeMux()
server.Setup(portalDomain(), common.NoopMiddleware).Register(srv)
cookie, err := portal_tests.AuthenticateSuite(ctx, user.Email, srv, server.XSRF, server.Sessions.CookieName, server.Mailer.(*email.StubMailer))
cookie, err := portal_tests.AuthenticateSuite(ctx, user.Email, srv, server.XSRF, server.Sessions)
if err != nil {
t.Fatal(err)
}
@@ -585,7 +584,7 @@ func TestGetPropertyReportsTab(t *testing.T) {
srv := http.NewServeMux()
server.Setup(portalDomain(), common.NoopMiddleware).Register(srv)
cookie, err := portal_tests.AuthenticateSuite(ctx, user.Email, srv, server.XSRF, server.Sessions.CookieName, server.Mailer.(*email.StubMailer))
cookie, err := portal_tests.AuthenticateSuite(ctx, user.Email, srv, server.XSRF, server.Sessions)
if err != nil {
t.Fatal(err)
}
@@ -630,7 +629,7 @@ func TestGetPropertySettingsTab(t *testing.T) {
srv := http.NewServeMux()
server.Setup(portalDomain(), common.NoopMiddleware).Register(srv)
cookie, err := portal_tests.AuthenticateSuite(ctx, user.Email, srv, server.XSRF, server.Sessions.CookieName, server.Mailer.(*email.StubMailer))
cookie, err := portal_tests.AuthenticateSuite(ctx, user.Email, srv, server.XSRF, server.Sessions)
if err != nil {
t.Fatal(err)
}
@@ -679,7 +678,7 @@ func TestGetPropertyIntegrationsTab(t *testing.T) {
srv := http.NewServeMux()
server.Setup(portalDomain(), common.NoopMiddleware).Register(srv)
cookie, err := portal_tests.AuthenticateSuite(ctx, user.Email, srv, server.XSRF, server.Sessions.CookieName, server.Mailer.(*email.StubMailer))
cookie, err := portal_tests.AuthenticateSuite(ctx, user.Email, srv, server.XSRF, server.Sessions)
if err != nil {
t.Fatal(err)
}
@@ -724,7 +723,7 @@ func TestGetPropertyAuditLogsTab(t *testing.T) {
srv := http.NewServeMux()
server.Setup(portalDomain(), common.NoopMiddleware).Register(srv)
cookie, err := portal_tests.AuthenticateSuite(ctx, user.Email, srv, server.XSRF, server.Sessions.CookieName, server.Mailer.(*email.StubMailer))
cookie, err := portal_tests.AuthenticateSuite(ctx, user.Email, srv, server.XSRF, server.Sessions)
if err != nil {
t.Fatal(err)
}
@@ -769,7 +768,7 @@ func TestDeleteProperty(t *testing.T) {
srv := http.NewServeMux()
server.Setup(portalDomain(), common.NoopMiddleware).Register(srv)
cookie, err := portal_tests.AuthenticateSuite(ctx, user.Email, srv, server.XSRF, server.Sessions.CookieName, server.Mailer.(*email.StubMailer))
cookie, err := portal_tests.AuthenticateSuite(ctx, user.Email, srv, server.XSRF, server.Sessions)
if err != nil {
t.Fatal(err)
}
@@ -912,7 +911,7 @@ func TestEchoPuzzle(t *testing.T) {
srv := http.NewServeMux()
server.Setup(portalDomain(), common.NoopMiddleware).Register(srv)
cookie, err := portal_tests.AuthenticateSuite(ctx, user.Email, srv, server.XSRF, server.Sessions.CookieName, server.Mailer.(*email.StubMailer))
cookie, err := portal_tests.AuthenticateSuite(ctx, user.Email, srv, server.XSRF, server.Sessions)
if err != nil {
t.Fatal(err)
}
@@ -942,7 +941,7 @@ func TestPropertyEndpointsInvalidPathArg(t *testing.T) {
srv := http.NewServeMux()
server.Setup(portalDomain(), common.NoopMiddleware).Register(srv)
cookie, err := portal_tests.AuthenticateSuite(ctx, user.Email, srv, server.XSRF, server.Sessions.CookieName, server.Mailer.(*email.StubMailer))
cookie, err := portal_tests.AuthenticateSuite(ctx, user.Email, srv, server.XSRF, server.Sessions)
if err != nil {
t.Fatal(err)
}
@@ -1002,7 +1001,7 @@ func TestPropertyEndpointsWrongOwnership(t *testing.T) {
srv := http.NewServeMux()
server.Setup(portalDomain(), common.NoopMiddleware).Register(srv)
cookie, err := portal_tests.AuthenticateSuite(ctx, user2.Email, srv, server.XSRF, server.Sessions.CookieName, server.Mailer.(*email.StubMailer))
cookie, err := portal_tests.AuthenticateSuite(ctx, user2.Email, srv, server.XSRF, server.Sessions)
if err != nil {
t.Fatal(err)
}
@@ -1056,7 +1055,7 @@ func TestPropertyEndpointsMissingSubscription(t *testing.T) {
srv := http.NewServeMux()
server.Setup(portalDomain(), common.NoopMiddleware).Register(srv)
cookie, err := portal_tests.AuthenticateSuite(ctx, user.Email, srv, server.XSRF, server.Sessions.CookieName, server.Mailer.(*email.StubMailer))
cookie, err := portal_tests.AuthenticateSuite(ctx, user.Email, srv, server.XSRF, server.Sessions)
if err != nil {
t.Fatal(err)
}
@@ -1108,7 +1107,7 @@ func TestPropertyEndpointsInvalidFormArgs(t *testing.T) {
srv := http.NewServeMux()
server.Setup(portalDomain(), common.NoopMiddleware).Register(srv)
cookie, err := portal_tests.AuthenticateSuite(ctx, user.Email, srv, server.XSRF, server.Sessions.CookieName, server.Mailer.(*email.StubMailer))
cookie, err := portal_tests.AuthenticateSuite(ctx, user.Email, srv, server.XSRF, server.Sessions)
if err != nil {
t.Fatal(err)
}
@@ -1194,7 +1193,7 @@ func TestMovePropertyInvalidPathArgs(t *testing.T) {
srv := http.NewServeMux()
server.Setup(portalDomain(), common.NoopMiddleware).Register(srv)
cookie, err := portal_tests.AuthenticateSuite(ctx, user.Email, srv, server.XSRF, server.Sessions.CookieName, server.Mailer.(*email.StubMailer))
cookie, err := portal_tests.AuthenticateSuite(ctx, user.Email, srv, server.XSRF, server.Sessions)
if err != nil {
t.Fatal(err)
}
@@ -1264,7 +1263,7 @@ func TestMovePropertyInvalidForm(t *testing.T) {
srv := http.NewServeMux()
server.Setup(portalDomain(), common.NoopMiddleware).Register(srv)
cookie, err := portal_tests.AuthenticateSuite(ctx, user.Email, srv, server.XSRF, server.Sessions.CookieName, server.Mailer.(*email.StubMailer))
cookie, err := portal_tests.AuthenticateSuite(ctx, user.Email, srv, server.XSRF, server.Sessions)
if err != nil {
t.Fatal(err)
}
@@ -1280,8 +1279,8 @@ func TestMovePropertyInvalidForm(t *testing.T) {
wantCode int
}{
{
name: "MovePropertyMissingOrgParam",
path: fmt.Sprintf("/org/%s/property/%s/move", orgID, propertyID),
name: "MovePropertyMissingOrgParam",
path: fmt.Sprintf("/org/%s/property/%s/move", orgID, propertyID),
formBody: url.Values{
// Missing org param
},

View File

@@ -10,7 +10,7 @@ import (
"testing"
"github.com/PrivateCaptcha/PrivateCaptcha/pkg/common"
emailpkg "github.com/PrivateCaptcha/PrivateCaptcha/pkg/email"
portal_tests "github.com/PrivateCaptcha/PrivateCaptcha/pkg/portal/tests"
)
func registerSuite(srv *http.ServeMux, name, email, token string) *http.Response {
@@ -51,8 +51,13 @@ func TestPostRegister(t *testing.T) {
}
cookie := resp.Cookies()[idx]
stubMailer := server.Mailer.(*emailpkg.StubMailer)
resp = twoFactorSuite(srv, email, server.XSRF.Token(email), stubMailer.LastCode, cookie)
ctx := t.Context()
code, err := portal_tests.TwoFactorCodeFromSession(ctx, cookie.Value, server.Sessions.Store)
if err != nil {
t.Fatal(err)
}
resp = twoFactorSuite(srv, email, server.XSRF.Token(email), code, cookie)
if resp.StatusCode != http.StatusSeeOther {
t.Errorf("unexpected post twofactor code: %v", resp.StatusCode)
@@ -62,7 +67,6 @@ func TestPostRegister(t *testing.T) {
t.Errorf("unexpected redirect: %v", location)
}
ctx := t.Context()
user, err := store.Impl().FindUserByEmail(ctx, email)
if err != nil {
t.Fatal(err)

View File

@@ -119,6 +119,11 @@ func TestMain(m *testing.M) {
sessionStore := db.NewSessionStore(store, session.KeyPersistent)
ctx := context.TODO()
cdnURLConfig := config.AsURL(ctx, cfg.Get(common.CDNBaseURLKey))
portalURLConfig := config.AsURL(ctx, cfg.Get(common.PortalBaseURLKey))
mailer := NewPortalMailer("https:"+cdnURLConfig.URL(), "https:"+portalURLConfig.URL(), &email.StubSender{}, cfg)
server = &Server{
Stage: common.StageTest,
Store: store,
@@ -130,7 +135,7 @@ func TestMain(m *testing.M) {
Store: sessionStore,
MaxLifetime: sessionStore.TTL(),
},
Mailer: &email.StubMailer{},
Mailer: mailer,
RateLimiter: &ratelimit.StubRateLimiter{Header: cfg.Get(common.RateLimitHeaderKey).Value()},
PuzzleEngine: puzzleEngine,
Metrics: monitoring.NewStub(),
@@ -144,7 +149,6 @@ func TestMain(m *testing.M) {
EmailVerifier: &PortalEmailVerifier{},
}
ctx := context.TODO()
templatesBuilder := NewTemplatesBuilder()
if err := templatesBuilder.AddFS(ctx, web.Templates(), "core"); err != nil {
panic(err)

View File

@@ -15,7 +15,6 @@ import (
"github.com/PrivateCaptcha/PrivateCaptcha/pkg/db"
"github.com/PrivateCaptcha/PrivateCaptcha/pkg/db/tests"
db_tests "github.com/PrivateCaptcha/PrivateCaptcha/pkg/db/tests"
"github.com/PrivateCaptcha/PrivateCaptcha/pkg/email"
portal_tests "github.com/PrivateCaptcha/PrivateCaptcha/pkg/portal/tests"
)
@@ -51,7 +50,7 @@ func TestCreateAPIKey(t *testing.T) {
srv := http.NewServeMux()
server.Setup(portalDomain(), common.NoopMiddleware).Register(srv)
cookie, err := portal_tests.AuthenticateSuite(ctx, user.Email, srv, server.XSRF, server.Sessions.CookieName, server.Mailer.(*email.StubMailer))
cookie, err := portal_tests.AuthenticateSuite(ctx, user.Email, srv, server.XSRF, server.Sessions)
if err != nil {
t.Fatal(err)
}
@@ -96,7 +95,7 @@ func TestDeleteAPIKey(t *testing.T) {
srv := http.NewServeMux()
server.Setup(portalDomain(), common.NoopMiddleware).Register(srv)
cookie, err := portal_tests.AuthenticateSuite(ctx, user.Email, srv, server.XSRF, server.Sessions.CookieName, server.Mailer.(*email.StubMailer))
cookie, err := portal_tests.AuthenticateSuite(ctx, user.Email, srv, server.XSRF, server.Sessions)
if err != nil {
t.Fatal(err)
}
@@ -142,7 +141,7 @@ func TestRotateAPIKey(t *testing.T) {
srv := http.NewServeMux()
server.Setup(portalDomain(), common.NoopMiddleware).Register(srv)
cookie, err := portal_tests.AuthenticateSuite(ctx, user.Email, srv, server.XSRF, server.Sessions.CookieName, server.Mailer.(*email.StubMailer))
cookie, err := portal_tests.AuthenticateSuite(ctx, user.Email, srv, server.XSRF, server.Sessions)
if err != nil {
t.Fatal(err)
}
@@ -197,7 +196,7 @@ func TestGetSettings(t *testing.T) {
srv := http.NewServeMux()
server.Setup(portalDomain(), common.NoopMiddleware).Register(srv)
cookie, err := portal_tests.AuthenticateSuite(ctx, user.Email, srv, server.XSRF, server.Sessions.CookieName, server.Mailer.(*email.StubMailer))
cookie, err := portal_tests.AuthenticateSuite(ctx, user.Email, srv, server.XSRF, server.Sessions)
if err != nil {
t.Fatal(err)
}
@@ -235,7 +234,7 @@ func TestGetGeneralSettings(t *testing.T) {
srv := http.NewServeMux()
server.Setup(portalDomain(), common.NoopMiddleware).Register(srv)
cookie, err := portal_tests.AuthenticateSuite(ctx, user.Email, srv, server.XSRF, server.Sessions.CookieName, server.Mailer.(*email.StubMailer))
cookie, err := portal_tests.AuthenticateSuite(ctx, user.Email, srv, server.XSRF, server.Sessions)
if err != nil {
t.Fatal(err)
}
@@ -282,7 +281,7 @@ func TestGetAPIKeysSettings(t *testing.T) {
srv := http.NewServeMux()
server.Setup(portalDomain(), common.NoopMiddleware).Register(srv)
cookie, err := portal_tests.AuthenticateSuite(ctx, user.Email, srv, server.XSRF, server.Sessions.CookieName, server.Mailer.(*email.StubMailer))
cookie, err := portal_tests.AuthenticateSuite(ctx, user.Email, srv, server.XSRF, server.Sessions)
if err != nil {
t.Fatal(err)
}
@@ -329,7 +328,7 @@ func TestGetUsageSettings(t *testing.T) {
srv := http.NewServeMux()
server.Setup(portalDomain(), common.NoopMiddleware).Register(srv)
cookie, err := portal_tests.AuthenticateSuite(ctx, user.Email, srv, server.XSRF, server.Sessions.CookieName, server.Mailer.(*email.StubMailer))
cookie, err := portal_tests.AuthenticateSuite(ctx, user.Email, srv, server.XSRF, server.Sessions)
if err != nil {
t.Fatal(err)
}
@@ -372,7 +371,7 @@ func TestGetSettingsTab(t *testing.T) {
srv := http.NewServeMux()
server.Setup(portalDomain(), common.NoopMiddleware).Register(srv)
cookie, err := portal_tests.AuthenticateSuite(ctx, user.Email, srv, server.XSRF, server.Sessions.CookieName, server.Mailer.(*email.StubMailer))
cookie, err := portal_tests.AuthenticateSuite(ctx, user.Email, srv, server.XSRF, server.Sessions)
if err != nil {
t.Fatal(err)
}
@@ -411,7 +410,7 @@ func TestEditEmail(t *testing.T) {
srv := http.NewServeMux()
server.Setup(portalDomain(), common.NoopMiddleware).Register(srv)
cookie, err := portal_tests.AuthenticateSuite(ctx, user.Email, srv, server.XSRF, server.Sessions.CookieName, server.Mailer.(*email.StubMailer))
cookie, err := portal_tests.AuthenticateSuite(ctx, user.Email, srv, server.XSRF, server.Sessions)
if err != nil {
t.Fatal(err)
}
@@ -458,7 +457,7 @@ func TestPutGeneralSettings(t *testing.T) {
srv := http.NewServeMux()
server.Setup(portalDomain(), common.NoopMiddleware).Register(srv)
cookie, err := portal_tests.AuthenticateSuite(ctx, user.Email, srv, server.XSRF, server.Sessions.CookieName, server.Mailer.(*email.StubMailer))
cookie, err := portal_tests.AuthenticateSuite(ctx, user.Email, srv, server.XSRF, server.Sessions)
if err != nil {
t.Fatal(err)
}
@@ -497,7 +496,7 @@ func TestDeleteAccount(t *testing.T) {
srv := http.NewServeMux()
server.Setup(portalDomain(), common.NoopMiddleware).Register(srv)
cookie, err := portal_tests.AuthenticateSuite(ctx, user.Email, srv, server.XSRF, server.Sessions.CookieName, server.Mailer.(*email.StubMailer))
cookie, err := portal_tests.AuthenticateSuite(ctx, user.Email, srv, server.XSRF, server.Sessions)
if err != nil {
t.Fatal(err)
}
@@ -539,7 +538,7 @@ func TestGetAccountStats(t *testing.T) {
srv := http.NewServeMux()
server.Setup(portalDomain(), common.NoopMiddleware).Register(srv)
cookie, err := portal_tests.AuthenticateSuite(ctx, user.Email, srv, server.XSRF, server.Sessions.CookieName, server.Mailer.(*email.StubMailer))
cookie, err := portal_tests.AuthenticateSuite(ctx, user.Email, srv, server.XSRF, server.Sessions)
if err != nil {
t.Fatal(err)
}
@@ -624,7 +623,7 @@ func TestAPIKeyEndpointsInvalidPathArg(t *testing.T) {
srv := http.NewServeMux()
server.Setup(portalDomain(), common.NoopMiddleware).Register(srv)
cookie, err := portal_tests.AuthenticateSuite(ctx, user.Email, srv, server.XSRF, server.Sessions.CookieName, server.Mailer.(*email.StubMailer))
cookie, err := portal_tests.AuthenticateSuite(ctx, user.Email, srv, server.XSRF, server.Sessions)
if err != nil {
t.Fatal(err)
}
@@ -681,7 +680,7 @@ func TestAPIKeyEndpointsWrongOwnership(t *testing.T) {
srv := http.NewServeMux()
server.Setup(portalDomain(), common.NoopMiddleware).Register(srv)
cookie, err := portal_tests.AuthenticateSuite(ctx, user2.Email, srv, server.XSRF, server.Sessions.CookieName, server.Mailer.(*email.StubMailer))
cookie, err := portal_tests.AuthenticateSuite(ctx, user2.Email, srv, server.XSRF, server.Sessions)
if err != nil {
t.Fatal(err)
}
@@ -729,7 +728,7 @@ func TestSettingsEndpointsInvalidFormArgs(t *testing.T) {
srv := http.NewServeMux()
server.Setup(portalDomain(), common.NoopMiddleware).Register(srv)
cookie, err := portal_tests.AuthenticateSuite(ctx, user.Email, srv, server.XSRF, server.Sessions.CookieName, server.Mailer.(*email.StubMailer))
cookie, err := portal_tests.AuthenticateSuite(ctx, user.Email, srv, server.XSRF, server.Sessions)
if err != nil {
t.Fatal(err)
}
@@ -797,7 +796,7 @@ func TestSettingsTabInvalidTab(t *testing.T) {
srv := http.NewServeMux()
server.Setup(portalDomain(), common.NoopMiddleware).Register(srv)
cookie, err := portal_tests.AuthenticateSuite(ctx, user.Email, srv, server.XSRF, server.Sessions.CookieName, server.Mailer.(*email.StubMailer))
cookie, err := portal_tests.AuthenticateSuite(ctx, user.Email, srv, server.XSRF, server.Sessions)
if err != nil {
t.Fatal(err)
}

View File

@@ -19,8 +19,8 @@ import (
"time"
"github.com/PrivateCaptcha/PrivateCaptcha/pkg/common"
emailpkg "github.com/PrivateCaptcha/PrivateCaptcha/pkg/email"
"github.com/PrivateCaptcha/PrivateCaptcha/pkg/puzzle"
"github.com/PrivateCaptcha/PrivateCaptcha/pkg/session"
"github.com/PuerkitoBio/goquery"
"golang.org/x/net/html"
)
@@ -116,7 +116,30 @@ func Text(node *html.Node) string {
return strings.TrimSpace(sel.Text())
}
func AuthenticateSuite(ctx context.Context, email string, srv *http.ServeMux, xsrf *common.XSRFMiddleware, cookieName string, stubMailer *emailpkg.StubMailer) (*http.Cookie, error) {
func TwoFactorCodeFromResponse(ctx context.Context, resp *http.Response, sessions *session.Manager) (int, error) {
idx := slices.IndexFunc(resp.Cookies(), func(c *http.Cookie) bool { return c.Name == sessions.CookieName })
if idx == -1 {
return 0, errors.New("failed to find a cookie " + sessions.CookieName)
}
cookie := resp.Cookies()[idx]
return TwoFactorCodeFromSession(ctx, cookie.Value, sessions.Store)
}
func TwoFactorCodeFromSession(ctx context.Context, cookie string, store session.Store) (int, error) {
sess, err := store.Read(ctx, cookie, false /*skip cache*/)
if err != nil {
return 0, err
}
if code, ok := sess.Get(ctx, session.KeyTwoFactorCode).(int); ok {
return code, nil
}
return 0, errors.New("2FA code not found in session")
}
func AuthenticateSuite(ctx context.Context, email string, srv *http.ServeMux, xsrf *common.XSRFMiddleware, sessions *session.Manager) (*http.Cookie, error) {
form := url.Values{}
form.Add(common.ParamCSRFToken, xsrf.Token(""))
form.Add(common.ParamEmail, email)
@@ -129,16 +152,27 @@ func AuthenticateSuite(ctx context.Context, email string, srv *http.ServeMux, xs
srv.ServeHTTP(w, req)
resp := w.Result()
idx := slices.IndexFunc(resp.Cookies(), func(c *http.Cookie) bool { return c.Name == cookieName })
idx := slices.IndexFunc(resp.Cookies(), func(c *http.Cookie) bool { return c.Name == sessions.CookieName })
if idx == -1 {
return nil, errors.New("cannot find session cookie in response")
}
cookie := resp.Cookies()[idx]
sess, err := sessions.Store.Read(ctx, cookie.Value, false /*skip cache*/)
if err != nil {
slog.ErrorContext(ctx, "Failed to read server session from session cookie", common.ErrAttr(err))
return cookie, err
}
code, ok := sess.Get(ctx, session.KeyTwoFactorCode).(int)
if !ok {
return nil, errors.New("2FA code not found in session")
}
form = url.Values{}
form.Add(common.ParamCSRFToken, xsrf.Token(email))
form.Add(common.ParamEmail, email)
form.Add(common.ParamVerificationCode, strconv.Itoa(stubMailer.LastCode))
form.Add(common.ParamVerificationCode, strconv.Itoa(code))
// now send the 2fa request
req = httptest.NewRequest("POST", "/"+common.TwoFactorEndpoint, bytes.NewBufferString(form.Encode()))

View File

@@ -13,7 +13,6 @@ import (
"github.com/PrivateCaptcha/PrivateCaptcha/pkg/common"
"github.com/PrivateCaptcha/PrivateCaptcha/pkg/db"
db_tests "github.com/PrivateCaptcha/PrivateCaptcha/pkg/db/tests"
"github.com/PrivateCaptcha/PrivateCaptcha/pkg/email"
portal_tests "github.com/PrivateCaptcha/PrivateCaptcha/pkg/portal/tests"
)
@@ -32,7 +31,7 @@ func TestPostTwoFactor(t *testing.T) {
t.Fatalf("failed to create new account: %v", err)
}
cookie, err := portal_tests.AuthenticateSuite(ctx, user.Email, srv, server.XSRF, server.Sessions.CookieName, server.Mailer.(*email.StubMailer))
cookie, err := portal_tests.AuthenticateSuite(ctx, user.Email, srv, server.XSRF, server.Sessions)
if err != nil {
t.Fatal(err)
}
@@ -123,8 +122,12 @@ func TestPostTwoFactorOtherServer(t *testing.T) {
t.Fatal("Didn't delete cached session")
}
stubMailer := server.Mailer.(*email.StubMailer)
resp = twoFactorSuite(srv, user.Email, server.XSRF.Token(user.Email), stubMailer.LastCode, cookie)
code, err := portal_tests.TwoFactorCodeFromSession(ctx, cookie.Value, server.Sessions.Store)
if err != nil {
t.Fatal(err)
}
resp = twoFactorSuite(srv, user.Email, server.XSRF.Token(user.Email), code, cookie)
if resp.StatusCode != http.StatusSeeOther {
t.Errorf("unexpected post twofactor code: %v", resp.StatusCode)
@@ -174,8 +177,10 @@ func TestResend2FA(t *testing.T) {
}
cookie := resp.Cookies()[idx]
stubMailer := server.Mailer.(*email.StubMailer)
originalCode := stubMailer.LastCode
originalCode, err := portal_tests.TwoFactorCodeFromSession(ctx, cookie.Value, server.Sessions.Store)
if err != nil {
t.Fatal(err)
}
// Try to use a wrong code first (but don't complete login)
// This simulates a user who received the code but wants to resend
@@ -192,9 +197,9 @@ func TestResend2FA(t *testing.T) {
}
// The code should have been reissued and should be different
newCode := stubMailer.LastCode
if newCode == 0 {
t.Error("New 2FA code was not generated")
newCode, err := portal_tests.TwoFactorCodeFromSession(ctx, cookie.Value, server.Sessions.Store)
if err != nil {
t.Fatal(err)
}
// Verify that the new code is different from the original
@@ -260,7 +265,7 @@ func TestResend2FAWithCompletedSession(t *testing.T) {
}
// Complete the full authentication
cookie, err := portal_tests.AuthenticateSuite(ctx, user.Email, srv, server.XSRF, server.Sessions.CookieName, server.Mailer.(*email.StubMailer))
cookie, err := portal_tests.AuthenticateSuite(ctx, user.Email, srv, server.XSRF, server.Sessions)
if err != nil {
t.Fatal(err)
}