Skip to content
New issue

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

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

Already on GitHub? Sign in to your account

Resolve conflicts with master #2433

Open
wants to merge 87 commits into
base: nitro-payments-dev
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 51 commits
Commits
Show all changes
87 commits
Select commit Hold shift + click to select a range
9a45bf9
Update hashicorp vault (#2250)
pavelbrm Jan 4, 2024
ac49405
feat: implement solana address linking (#2280)
clD11 Jan 9, 2024
dcb328f
Add bonk mapping for ratios service (#2283)
onyb Jan 10, 2024
45f5c27
fix: add submit receipt validation error check (#2285)
clD11 Jan 10, 2024
875466d
Add self custody available field to get wallet endpoint (#2287)
clD11 Jan 10, 2024
8d59e8b
Set proper type (#2289)
pavelbrm Jan 11, 2024
d70fe73
refactor: remove extra validation check from submit receipt endpoint …
clD11 Jan 11, 2024
360e2a3
fix: add logging to submit receipt (#2293)
clD11 Jan 11, 2024
79ae3a2
refactor: add specific challenge not found error (#2291)
clD11 Jan 11, 2024
df58e91
refactor: use generic internal server error on sol link endpoint (#2300)
clD11 Jan 15, 2024
29be8e7
feat: allow multiple cors origins for dapp (#2299)
clD11 Jan 15, 2024
418c59a
fix: use proper handler method in local env (#2304)
pavelbrm Jan 18, 2024
d0f21dd
feat: add option endpoints for challenge and connect solana (#2302)
clD11 Jan 18, 2024
d83f0e5
fix: fix legacy creds by item id (#2308)
evq Jan 18, 2024
a935a0c
feat: remove expired challenges from the database (#2307)
clD11 Jan 19, 2024
83b8cd2
feat: increase rate limit on get v4 wallets (#2311)
clD11 Jan 22, 2024
c3de1bc
fix: add is allowed check to allow list entry (#2310)
clD11 Jan 22, 2024
9f0b7aa
Refactor: Improve Receipt Validation (#2306)
pavelbrm Jan 22, 2024
2d2552a
feat: add solana to country code allow block list (#2315)
clD11 Jan 25, 2024
972a597
fix: update uphold intermediate certs (#2319)
clD11 Jan 29, 2024
243166c
feat: add jwt validation to android webhook (#2318)
clD11 Jan 29, 2024
b67875f
update parameters endpoint to include solana payout-status (#2322)
husobee Jan 29, 2024
dcf50be
feat: add new endpoint for creating order with receipt (#2313)
pavelbrm Jan 30, 2024
fc29a86
multiple device refresh improvements (#2281)
husobee Jan 31, 2024
a32650a
feat: add check order receipt endpoint (#2327)
pavelbrm Feb 2, 2024
6b09228
Revert "multiple device refresh improvements (#2281)" (#2329)
husobee Feb 2, 2024
f802f7b
feat: add specific linking limit error for solana (#2332)
clD11 Feb 5, 2024
21d0bec
fix: return order_id instead of id in json (#2334)
pavelbrm Feb 6, 2024
8821bc1
fix: return orderId instead of order_id json (#2336)
pavelbrm Feb 6, 2024
62d5bd9
fix: use equals check for payment id validation instead of govalidato…
clD11 Feb 6, 2024
0780c62
check for mismatch on tlv2 credential submissions across request ids …
husobee Feb 6, 2024
e0b3c24
fix query to check for request id conflict case ( mismatch ) (#2344)
evq Feb 6, 2024
2156da0
fix: do not delete credentials upon order renewal (#2349)
pavelbrm Feb 8, 2024
ba81407
fix: don't attempt to cancel sub in Stripe for iOS orders (#2347)
pavelbrm Feb 13, 2024
74f7ac2
fix: don't move order to pending on invoice update (#2351)
pavelbrm Feb 13, 2024
87f80eb
Fix chronic mapping issues in ratios service (#2342)
onyb Feb 16, 2024
671b2ad
fix: fix bug in rate limiter (#2353)
pavelbrm Feb 19, 2024
191eef6
refactor: remove vbat related jobs (#2355)
clD11 Feb 21, 2024
1a47f0e
feat: allow empty payment methods in orders-new (#2356)
pavelbrm Feb 22, 2024
fbc146b
fix: add return to default case stripe invoice paid (#2359)
clD11 Feb 22, 2024
b16fe7a
feat: add terms of service version to parameters endpoint (#2358)
clD11 Feb 22, 2024
62fbeba
build: update docker compose command in makefile (#2375)
clD11 Feb 22, 2024
d425fd7
refactor: return 409 on repeated receipt submission (#2388)
pavelbrm Feb 23, 2024
8fc94d0
fix: validate google submit receipt (#2360)
clD11 Feb 23, 2024
3a74575
Revert "fix: validate google submit receipt (#2360)" (#2391)
clD11 Feb 26, 2024
a86fb90
fix: reapply validate google submit receipt (#2392)
clD11 Feb 26, 2024
8f5e7d8
feat: support VPN in creating anon orders (#2395)
pavelbrm Mar 5, 2024
afbf612
renovate.json: add company config (#2397)
thypon Mar 8, 2024
dd38a86
feat: update leo monthly price to 14.99 (#2426)
pavelbrm Mar 19, 2024
b808db8
Revert "fix: reapply validate google submit receipt (#2392)" (#2427)
pavelbrm Mar 19, 2024
c071e9b
Resolve conflicts
Sneagan Mar 21, 2024
96100f7
fix: check ios purchase carefully (#2437)
pavelbrm Mar 22, 2024
07a2d9e
chore: update dependencies (#2429)
pavelbrm Mar 26, 2024
76c47af
test: add tests for verifyApple (#2439)
pavelbrm Mar 26, 2024
df07a02
Attempt to update CA certificates for Uphold (#2444)
hspencer77 Mar 28, 2024
3b6cce0
Remove BraveX Sandbox Lambda Deployment Resources (#2443)
hspencer77 Mar 28, 2024
4ce4a32
fix: search for ios purchase in latest_receipt_info (#2448)
pavelbrm Apr 2, 2024
8a10f5f
fix: check for legacy subscription_id values in iOS receipt validatio…
pavelbrm Apr 15, 2024
1071e11
fix: address inconsistency in ios client with vpn linking (#2466)
pavelbrm Apr 24, 2024
f003305
fix: take grace period into account (#2467)
pavelbrm Apr 24, 2024
57962c9
refactor: carefully handle app store server notifications (#2483)
pavelbrm May 9, 2024
92012d3
chore: improve logging in ios webhook handling (#2526)
pavelbrm May 16, 2024
06d2213
Update Uphold CA (#2535)
Sneagan May 28, 2024
becfddf
feat: change request_id to disallow null and update index (#2506)
pavelbrm May 29, 2024
d3b91f4
feat: check existing creds by number of batches (#2522)
pavelbrm May 29, 2024
d2f01b1
feat: delete tlv2 creds with req_id matching item_id (#2524)
pavelbrm May 29, 2024
152209a
feat: expose endpoint for checking currently active sets of tlv2 cred…
pavelbrm May 29, 2024
c84e19f
fix: attach forgotten tlv2 repository (#2542)
pavelbrm May 30, 2024
13ed2c0
chore: remove promotion.Service.hotWallet (#2549)
ibukanov Jun 4, 2024
a917f9e
fix: improve and simplify android receipt verification (#2545)
pavelbrm Jun 5, 2024
57c94a7
Avoid fingerprint verification when checking IsUserKYC (#2548)
ibukanov Jun 6, 2024
762ab57
Update actions, enable reproducible builds (#2550)
tarikdem Jun 14, 2024
e987b7c
refactor: remove unused cohort vars (#2579)
clD11 Jun 24, 2024
a5c6d12
chore: update dependencies (#2583)
pavelbrm Jun 26, 2024
45df6ac
feat: reject linkings based on wallet geo country (#2580)
clD11 Jun 26, 2024
1a78678
build: use aws ecr public image for docker images (#2584)
clD11 Jun 27, 2024
1a00cb8
feat: add solana linking metrics (#2586)
clD11 Jun 27, 2024
7361af8
feat: add new products for ios nightly and beta (#2592)
pavelbrm Jul 11, 2024
c7749a2
feat: handle play store developer notifications (#2560)
pavelbrm Jul 16, 2024
dc4a9d3
fix: use pointer receiver instead of value (#2595)
pavelbrm Jul 16, 2024
9db3baa
feat: add leeway for expiry time on mobile webhooks (#2603)
pavelbrm Jul 17, 2024
1eda1a0
fix: io read timeout on create item creds endpoint (#2599)
clD11 Jul 17, 2024
7d05017
feat: use docker login (#2607)
pavelbrm Jul 18, 2024
0ad379f
feat: log package in mobile webhooks (#2606)
pavelbrm Jul 18, 2024
9a185fb
fix: set proper order expiration upon linking (#2596)
pavelbrm Jul 18, 2024
25f4e94
Resolve conflicts
Sneagan Jul 19, 2024
dc9538d
resolve conflicts
Sneagan Jul 19, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions .github/renovate.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{
"$schema": "https://docs.renovatebot.com/renovate-schema.json",
"extends": [
"local>brave-intl/renovate-config"
]
}
5 changes: 3 additions & 2 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ share-0.gpg

fetch-quote.json
main/main
zebpay_test.env
zebpay_stage.pem
prepare-*response.log

go.work
go.work.sum
16 changes: 8 additions & 8 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -114,30 +114,30 @@ docker-payments:
docker tag bat-go/payments:$(GIT_VERSION)$(BUILD_TIME) bat-go/payments:latest

docker-up-dev:
COMMIT=$(GIT_COMMIT) VERSION=$(GIT_VERSION) BUILD_TIME=$(BUILD_TIME) docker-compose \
COMMIT=$(GIT_COMMIT) VERSION=$(GIT_VERSION) BUILD_TIME=$(BUILD_TIME) docker compose \
-f docker-compose.yml -f docker-compose.dev.yml up -d

docker-up-dev-rep:
COMMIT=$(GIT_COMMIT) VERSION=$(GIT_VERSION) BUILD_TIME=$(BUILD_TIME) docker-compose \
COMMIT=$(GIT_COMMIT) VERSION=$(GIT_VERSION) BUILD_TIME=$(BUILD_TIME) docker compose \
-f docker-compose.yml -f docker-compose.reputation.yml -f docker-compose.dev.yml up -d

docker-test:
COMMIT=$(GIT_COMMIT) VERSION=$(GIT_VERSION) BUILD_TIME=$(BUILD_TIME) docker-compose \
COMMIT=$(GIT_COMMIT) VERSION=$(GIT_VERSION) BUILD_TIME=$(BUILD_TIME) docker compose \
-f docker-compose.yml -f docker-compose.dev.yml up -d vault
$(eval VAULT_TOKEN = $(shell docker logs grant-vault 2>&1 | grep "Root Token" | tail -1 | cut -d ' ' -f 3 ))
VAULT_TOKEN=$(VAULT_TOKEN) PKG=$(TEST_PKG) RUN=$(TEST_RUN) docker-compose -f docker-compose.yml -f docker-compose.dev.yml run --rm dev make test && cd main && go run main.go generate json-schema
VAULT_TOKEN=$(VAULT_TOKEN) PKG=$(TEST_PKG) RUN=$(TEST_RUN) docker compose -f docker-compose.yml -f docker-compose.dev.yml run --rm dev make test && cd main && go run main.go generate json-schema

docker-dev:
$(eval VAULT_TOKEN = $(shell docker logs grant-vault 2>&1 | grep "Root Token" | tail -1 | cut -d ' ' -f 3 ))
VAULT_TOKEN=$(VAULT_TOKEN) docker-compose -f docker-compose.yml -f docker-compose.dev.yml run --rm -p 3333:3333 dev /bin/bash
VAULT_TOKEN=$(VAULT_TOKEN) docker compose -f docker-compose.yml -f docker-compose.dev.yml run --rm -p 3333:3333 dev /bin/bash

docker-refresh-dev:
$(eval VAULT_TOKEN = $(shell docker logs grant-vault 2>&1 | grep "Root Token" | tail -1 | cut -d ' ' -f 3 ))
VAULT_TOKEN=$(VAULT_TOKEN) docker-compose -f docker-compose.yml -f docker-compose.dev-refresh.yml up -d dev-refresh
VAULT_TOKEN=$(VAULT_TOKEN) docker compose -f docker-compose.yml -f docker-compose.dev-refresh.yml up -d dev-refresh

docker-refresh-skus:
$(eval VAULT_TOKEN = $(shell docker logs grant-vault 2>&1 | grep "Root Token" | tail -1 | cut -d ' ' -f 3 ))
VAULT_TOKEN=$(VAULT_TOKEN) docker-compose -f docker-compose.yml -f docker-compose.skus-refresh.yml up -d skus-refresh
VAULT_TOKEN=$(VAULT_TOKEN) docker compose -f docker-compose.yml -f docker-compose.skus-refresh.yml up -d skus-refresh

settlement-tools:
$(eval GOOS?=darwin)
Expand Down Expand Up @@ -219,7 +219,7 @@ download-mod:

docker-up-ext: ensure-shared-net
$(eval VAULT_TOKEN = $(shell docker logs grant-vault 2>&1 | grep "Root Token" | tail -1 | cut -d ' ' -f 3 ))
VAULT_TOKEN=$(VAULT_TOKEN) docker-compose -f docker-compose.yml -f docker-compose.dev.yml -f docker-compose.ext.yml run --rm -p 3333:3333 dev /bin/bash
VAULT_TOKEN=$(VAULT_TOKEN) docker compose -f docker-compose.yml -f docker-compose.dev.yml -f docker-compose.ext.yml run --rm -p 3333:3333 dev /bin/bash

ensure-gomod-volume:
docker volume create batgo_lint_gomod
Expand Down
1 change: 1 addition & 0 deletions docker-compose.dev-refresh.yml
Original file line number Diff line number Diff line change
Expand Up @@ -56,3 +56,4 @@ services:
- UPHOLD_ACCESS_TOKEN
- "RATIOS_SERVICE=https://ratios.rewards.bravesoftware.com"
- RATIOS_TOKEN
- "DAPP_ALLOWED_CORS_ORIGINS=https://my-dapp.com"
2 changes: 2 additions & 0 deletions docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,7 @@ services:
- TEST_RUN
- TOKEN_LIST
- UPHOLD_ACCESS_TOKEN
- "DAPP_ALLOWED_CORS_ORIGINS=https://my-dapp.com"
volumes:
- ./test/secrets:/etc/kafka/secrets
- ./migrations:/src/migrations
Expand Down Expand Up @@ -172,6 +173,7 @@ services:
- TEST_RUN
- TOKEN_LIST
- UPHOLD_ACCESS_TOKEN
- "DAPP_ALLOWED_CORS_ORIGINS=https://my-dapp.com"
volumes:
- ./test/secrets:/etc/kafka/secrets
- ./migrations:/src/migrations
Expand Down
2 changes: 2 additions & 0 deletions libs/context/keys.go
Original file line number Diff line number Diff line change
Expand Up @@ -146,6 +146,8 @@ const (
DisableGeminiLinkingCTXKey CTXKey = "disable_gemini_linking"
// DisableBitflyerLinkingCTXKey - this informs if bitflyer linking is enabled
DisableBitflyerLinkingCTXKey CTXKey = "disable_bitflyer_linking"
// DisableSolanaLinkingCTXKey - this informs if solana linking is enabled
DisableSolanaLinkingCTXKey CTXKey = "disable_solana_linking"

// RadomWebhookSecretCTXKey - the webhook secret key for radom integration
RadomWebhookSecretCTXKey CTXKey = "radom_webhook_secret"
Expand Down
7 changes: 4 additions & 3 deletions libs/custodian/regions.go
Original file line number Diff line number Diff line change
Expand Up @@ -103,6 +103,7 @@ type PayoutStatus struct {
Gemini string `json:"gemini" valid:"in(off|processing|complete)"`
Bitflyer string `json:"bitflyer" valid:"in(off|processing|complete)"`
Zebpay string `json:"zebpay" valid:"in(off|processing|complete)"`
Solana string `json:"solana" valid:"in(off|processing|complete)"`
Date string `json:"payoutDate" valid:"-"`
}

Expand All @@ -117,7 +118,6 @@ func contains(countries, allowblock []string) bool {
for _, ab := range allowblock {
for _, country := range countries {
if strings.EqualFold(ab, country) {
fmt.Println("contains ", ab, country)
return true
}
}
Expand All @@ -141,6 +141,7 @@ type Regions struct {
Gemini GeoAllowBlockMap `json:"gemini" valid:"-"`
Bitflyer GeoAllowBlockMap `json:"bitflyer" valid:"-"`
Zebpay GeoAllowBlockMap `json:"zebpay" valid:"-"`
Solana GeoAllowBlockMap `json:"solana" valid:"-"`
}

// HandleErrors - handle any errors in input
Expand All @@ -149,12 +150,12 @@ func (cr *Regions) HandleErrors(err error) *handlers.AppError {
}

// Decode - implement decodable
func (cr *Regions) Decode(ctx context.Context, input []byte) error {
func (cr *Regions) Decode(_ context.Context, input []byte) error {
return json.Unmarshal(input, cr)
}

// Validate - implement validatable
func (cr *Regions) Validate(ctx context.Context) error {
func (cr *Regions) Validate(_ context.Context) error {
isValid, err := govalidator.ValidateStruct(cr)
if err != nil {
return err
Expand Down
51 changes: 50 additions & 1 deletion libs/custodian/regions_test.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,12 @@
package custodian

import "testing"
import (
"context"
"testing"

"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)

func TestVerdictAllowList(t *testing.T) {
gabm := GeoAllowBlockMap{
Expand All @@ -27,3 +33,46 @@ func TestVerdictBlockList(t *testing.T) {
t.Error("should have been false, US in block list")
}
}

func TestRegions_Decode(t *testing.T) {
type tcGiven struct {
input []byte
}

type exp struct {
allow []string
block []string
}

type testCase struct {
name string
given tcGiven
exp exp
}

testCases := []testCase{
{
name: "solana",
given: tcGiven{
input: []byte(`{"solana":{"allow":["AA"],"block":["AB"]}}`),
},
exp: exp{
allow: []string{"AA"},
block: []string{"AB"},
},
},
}

for i := range testCases {
tc := testCases[i]

t.Run(tc.name, func(t *testing.T) {
regions := Regions{}
err := regions.Decode(context.Background(), tc.given.input)
require.NoError(t, err)

assert.Equal(t, tc.exp.allow, regions.Solana.Allow)
assert.Equal(t, tc.exp.block, regions.Solana.Block)
})
}
}
6 changes: 3 additions & 3 deletions libs/datastore/postgres.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,8 @@ import (
appctx "github.com/brave-intl/bat-go/libs/context"
"github.com/brave-intl/bat-go/libs/logging"
"github.com/brave-intl/bat-go/libs/metrics"
sentry "github.com/getsentry/sentry-go"
migrate "github.com/golang-migrate/migrate/v4"
"github.com/getsentry/sentry-go"
"github.com/golang-migrate/migrate/v4"
"github.com/golang-migrate/migrate/v4/database/postgres"
"github.com/jmoiron/sqlx"
"github.com/prometheus/client_golang/prometheus"
Expand All @@ -41,7 +41,7 @@ var (
}
dbs = map[string]*sqlx.DB{}
// CurrentMigrationVersion holds the default migration version
CurrentMigrationVersion = uint(63)
CurrentMigrationVersion = uint(66)
// MigrationTracks holds the migration version for a given track (eyeshade, promotion, wallet)
MigrationTracks = map[string]uint{
"eyeshade": 20,
Expand Down
21 changes: 5 additions & 16 deletions libs/handlers/handlers.go
Original file line number Diff line number Diff line change
Expand Up @@ -25,16 +25,17 @@ type AppError struct {
}

// Error makes app error an error
func (e AppError) Error() string {
msg := fmt.Sprintf("error: %s", e.Message)
func (e *AppError) Error() string {
msg := "error: " + e.Message
if e.Cause != nil {
msg = fmt.Sprintf("%s: %s", msg, e.Cause)
msg = msg + ": " + e.Cause.Error()
}

return msg
}

// ServeHTTP responds according to the passed AppError
func (e AppError) ServeHTTP(w http.ResponseWriter, r *http.Request) {
func (e *AppError) ServeHTTP(w http.ResponseWriter, r *http.Request) {
w.Header().Set("content-type", "application/json")
w.WriteHeader(e.Code)
if err := json.NewEncoder(w).Encode(e); err != nil {
Expand Down Expand Up @@ -100,18 +101,6 @@ func WrapValidationError(err error) *AppError {
return ValidationError("request body", govalidator.ErrorsByField(err))
}

// CodedValidationError creates an error to communicate a bad request was formed
func CodedValidationError(message string, errorCode string, validationErrors interface{}) *AppError {
return &AppError{
Message: "Error validating " + message,
ErrorCode: errorCode,
Code: http.StatusBadRequest,
Data: map[string]interface{}{
"validationErrors": validationErrors,
},
}
}

// ValidationError creates an error to communicate a bad request was formed
func ValidationError(message string, validationErrors interface{}) *AppError {
return &AppError{
Expand Down
41 changes: 39 additions & 2 deletions libs/middleware/http_signed.go
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ func VerifyHTTPSignedOnly(verifier httpsignature.ParameterizedKeystoreVerifier)

if len(r.Header.Get("Signature")) == 0 {
logger.Warn().Msg("signature must be present for signed middleware")
ae := handlers.AppError{
ae := &handlers.AppError{
Cause: errMissingSignature,
Message: "signature must be present for signed middleware",
Code: http.StatusUnauthorized,
Expand All @@ -78,7 +78,7 @@ func VerifyHTTPSignedOnly(verifier httpsignature.ParameterizedKeystoreVerifier)

if err != nil {
logger.Error().Err(err).Msg("failed to verify request")
ae := handlers.AppError{
ae := &handlers.AppError{
Cause: errInvalidSignature,
Message: "request signature verification failure",
Code: http.StatusForbidden,
Expand All @@ -87,6 +87,43 @@ func VerifyHTTPSignedOnly(verifier httpsignature.ParameterizedKeystoreVerifier)
return
}

if contains.Str(verifier.SignatureParams.Headers, "date") {
// Date: Wed, 21 Oct 2015 07:28:00 GMT
dateStr := r.Header.Get("date")
date, err := time.Parse(time.RFC1123, dateStr)
if err != nil {
logger.Error().Err(err).Msg("failed to parse the date header")
ae := &handlers.AppError{
Cause: errInvalidHeader,
Message: "Invalid date header",
Code: http.StatusBadRequest,
}
ae.ServeHTTP(w, r)
return
}

if time.Now().Add(10 * time.Minute).Before(date) {
logger.Error().Err(err).Msg("date is invalid")
ae := &handlers.AppError{
Cause: errInvalidHeader,
Message: "date is invalid",
Code: http.StatusTooEarly,
}
ae.ServeHTTP(w, r)
return
}
if time.Now().Add(-10 * time.Minute).After(date) {
logger.Error().Err(err).Msg("date is invalid")
ae := &handlers.AppError{
Cause: errInvalidHeader,
Message: "date is invalid",
Code: http.StatusRequestTimeout,
}
ae.ServeHTTP(w, r)
return
}
}

ctx = context.WithValue(ctx, httpSignedKeyID{}, keyID)
next.ServeHTTP(w, r.WithContext(ctx))
})
Expand Down
1 change: 1 addition & 0 deletions libs/middleware/rate_limiter.go
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@ func IPRateLimiterWithStore(
// override for OPTIONS request methods, as sometimes many cors requests happen quickly??
if r.Method == http.MethodOptions {
next.ServeHTTP(w, r)
return
}

if !isSimpleTokenInContext(r.Context()) {
Expand Down
Loading