From 14899733c8c5962a8b4ed5c13836f86a34bd29a0 Mon Sep 17 00:00:00 2001
From: kim <89579420+NyaaaWhatsUpDoc@users.noreply.github.com>
Date: Fri, 18 Apr 2025 15:37:50 +0000
Subject: [PATCH] [bugfix] new token API issues (#4022)
* fix incorrect endpoint being registered for /token/{id}
* update the maximum page value for tokens endpoint to 100
* update the available tokens page options
* set a default limit of 25 to match the first available settings panel option
* ensure OnInvalidateToken() hook is called during token delete
---
internal/api/client/tokens/tokens.go | 2 +-
internal/api/client/tokens/tokensget.go | 6 +--
internal/db/bundb/application.go | 54 ++++++++++++-------
.../settings/views/user/tokens/search.tsx | 7 +--
4 files changed, 43 insertions(+), 26 deletions(-)
diff --git a/internal/api/client/tokens/tokens.go b/internal/api/client/tokens/tokens.go
index ce00a6459..aadaf72c2 100644
--- a/internal/api/client/tokens/tokens.go
+++ b/internal/api/client/tokens/tokens.go
@@ -43,6 +43,6 @@ func New(processor *processing.Processor) *Module {
func (m *Module) Route(attachHandler func(method string, path string, f ...gin.HandlerFunc) gin.IRoutes) {
attachHandler(http.MethodGet, BasePath, m.TokensInfoGETHandler)
- attachHandler(http.MethodGet, BasePathWithID, m.TokensInfoGETHandler)
+ attachHandler(http.MethodGet, BasePathWithID, m.TokenInfoGETHandler)
attachHandler(http.MethodPost, InvalidateTokenPath, m.TokenInvalidatePOSTHandler)
}
diff --git a/internal/api/client/tokens/tokensget.go b/internal/api/client/tokens/tokensget.go
index 15fc5511f..5c92beccc 100644
--- a/internal/api/client/tokens/tokensget.go
+++ b/internal/api/client/tokens/tokensget.go
@@ -117,9 +117,9 @@ func (m *Module) TokensInfoGETHandler(c *gin.Context) {
}
page, errWithCode := paging.ParseIDPage(c,
- 0, // min limit
- 80, // max limit
- 20, // default limit
+ 0, // min limit
+ 100, // max limit
+ 25, // default limit
)
if errWithCode != nil {
apiutil.ErrorHandler(c, errWithCode, m.processor.InstanceGetV1)
diff --git a/internal/db/bundb/application.go b/internal/db/bundb/application.go
index 1a600d620..562614e5e 100644
--- a/internal/db/bundb/application.go
+++ b/internal/db/bundb/application.go
@@ -19,8 +19,10 @@ package bundb
import (
"context"
+ "errors"
"slices"
+ "github.com/superseriousbusiness/gotosocial/internal/db"
"github.com/superseriousbusiness/gotosocial/internal/gtserror"
"github.com/superseriousbusiness/gotosocial/internal/gtsmodel"
"github.com/superseriousbusiness/gotosocial/internal/paging"
@@ -409,8 +411,11 @@ func (a *applicationDB) UpdateToken(ctx context.Context, token *gtsmodel.Token,
}
func (a *applicationDB) DeleteTokenByID(ctx context.Context, id string) error {
+ var token gtsmodel.Token
+ token.ID = id
+
_, err := a.db.NewDelete().
- Table("tokens").
+ Model(&token).
Where("? = ?", bun.Ident("id"), id).
Exec(ctx)
if err != nil {
@@ -418,68 +423,79 @@ func (a *applicationDB) DeleteTokenByID(ctx context.Context, id string) error {
}
a.state.Caches.DB.Token.Invalidate("ID", id)
+ a.state.Caches.OnInvalidateToken(&token)
return nil
}
func (a *applicationDB) DeleteTokenByCode(ctx context.Context, code string) error {
+ var token gtsmodel.Token
+
_, err := a.db.NewDelete().
- Table("tokens").
+ Model(&token).
Where("? = ?", bun.Ident("code"), code).
+ Returning("?", bun.Ident("id")).
Exec(ctx)
- if err != nil {
+ if err != nil && !errors.Is(err, db.ErrNoEntries) {
return err
}
a.state.Caches.DB.Token.Invalidate("Code", code)
+ a.state.Caches.OnInvalidateToken(&token)
return nil
}
func (a *applicationDB) DeleteTokenByAccess(ctx context.Context, access string) error {
+ var token gtsmodel.Token
+
_, err := a.db.NewDelete().
- Table("tokens").
+ Model(&token).
Where("? = ?", bun.Ident("access"), access).
+ Returning("?", bun.Ident("id")).
Exec(ctx)
- if err != nil {
+ if err != nil && !errors.Is(err, db.ErrNoEntries) {
return err
}
a.state.Caches.DB.Token.Invalidate("Access", access)
+ a.state.Caches.OnInvalidateToken(&token)
return nil
}
func (a *applicationDB) DeleteTokenByRefresh(ctx context.Context, refresh string) error {
+ var token gtsmodel.Token
+
_, err := a.db.NewDelete().
- Table("tokens").
+ Model(&token).
Where("? = ?", bun.Ident("refresh"), refresh).
+ Returning("?", bun.Ident("id")).
Exec(ctx)
- if err != nil {
+ if err != nil && !errors.Is(err, db.ErrNoEntries) {
return err
}
a.state.Caches.DB.Token.Invalidate("Refresh", refresh)
+ a.state.Caches.OnInvalidateToken(&token)
return nil
}
func (a *applicationDB) DeleteTokensByClientID(ctx context.Context, clientID string) error {
+ var tokens []*gtsmodel.Token
+
// Delete tokens owned by
// clientID and gather token IDs.
- var tokenIDs []string
- if _, err := a.db.
- NewDelete().
- Table("tokens").
+ if _, err := a.db.NewDelete().
+ Model(&tokens).
Where("? = ?", bun.Ident("client_id"), clientID).
- Returning("id").
- Exec(ctx, &tokenIDs); err != nil {
+ Returning("?", bun.Ident("id")).
+ Exec(ctx); err != nil && !errors.Is(err, db.ErrNoEntries) {
return err
}
- if len(tokenIDs) == 0 {
- // Nothing was deleted,
- // nothing to invalidate.
- return nil
+ // Invalidate all deleted tokens.
+ for _, token := range tokens {
+ a.state.Caches.DB.Token.Invalidate("ID", token.ID)
+ a.state.Caches.OnInvalidateToken(token)
}
- // Invalidate all deleted tokens.
- a.state.Caches.DB.Token.InvalidateIDs("ID", tokenIDs)
return nil
}
diff --git a/web/source/settings/views/user/tokens/search.tsx b/web/source/settings/views/user/tokens/search.tsx
index 87080cc8f..8025c7bb5 100644
--- a/web/source/settings/views/user/tokens/search.tsx
+++ b/web/source/settings/views/user/tokens/search.tsx
@@ -36,7 +36,7 @@ export default function TokensSearchForm() {
// Populate search form using values from
// urlQueryParams, to allow paging.
const form = {
- limit: useTextInput("limit", { defaultValue: urlQueryParams.get("limit") ?? "20" })
+ limit: useTextInput("limit", { defaultValue: urlQueryParams.get("limit") ?? "25" })
};
// On mount, trigger search.
@@ -93,9 +93,10 @@ export default function TokensSearchForm() {
label="Items per page"
options={
<>
-
+
-
+
+
>
}
>