Skip to content

Commit a1da673

Browse files
authored
fix: Add authorization check for knowledge_delete node (#1865)
1 parent 2ffd7a8 commit a1da673

File tree

3 files changed

+50
-10
lines changed

3 files changed

+50
-10
lines changed

backend/api/model/crossdomain/knowledge/knowledge.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -329,7 +329,8 @@ type CreateDocumentResponse struct {
329329
}
330330

331331
type DeleteDocumentRequest struct {
332-
DocumentID string
332+
DocumentID int64
333+
KnowledgeID int64
333334
}
334335

335336
type DeleteDocumentResponse struct {

backend/crossdomain/impl/knowledge/knowledge.go

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@ import (
2020
"context"
2121
"errors"
2222
"fmt"
23-
"strconv"
2423

2524
"github.com/coze-dev/coze-studio/backend/api/model/crossdomain/knowledge"
2625
model "github.com/coze-dev/coze-studio/backend/api/model/crossdomain/knowledge"
@@ -29,7 +28,9 @@ import (
2928
"github.com/coze-dev/coze-studio/backend/domain/knowledge/entity"
3029
"github.com/coze-dev/coze-studio/backend/domain/knowledge/service"
3130
"github.com/coze-dev/coze-studio/backend/infra/contract/document/parser"
31+
"github.com/coze-dev/coze-studio/backend/pkg/errorx"
3232
"github.com/coze-dev/coze-studio/backend/pkg/lang/slices"
33+
"github.com/coze-dev/coze-studio/backend/types/errno"
3334
)
3435

3536
var defaultSVC crossknowledge.Knowledge
@@ -132,13 +133,24 @@ func (i *impl) Store(ctx context.Context, document *model.CreateDocumentRequest)
132133
}
133134

134135
func (i *impl) Delete(ctx context.Context, r *model.DeleteDocumentRequest) (*model.DeleteDocumentResponse, error) {
135-
docID, err := strconv.ParseInt(r.DocumentID, 10, 64)
136+
if r.KnowledgeID == 0 {
137+
return nil, errorx.New(errno.ErrKnowledgeInvalidParamCode, errorx.KV("msg", "knowledge id cannot be 0"))
138+
}
139+
140+
docs, err := i.DomainSVC.ListDocument(ctx, &service.ListDocumentRequest{
141+
KnowledgeID: r.KnowledgeID,
142+
DocumentIDs: []int64{r.DocumentID},
143+
SelectAll: true,
144+
})
136145
if err != nil {
137-
return nil, fmt.Errorf("invalid document id: %s", r.DocumentID)
146+
return nil, err
147+
}
148+
if len(docs.Documents) == 0 {
149+
return nil, errorx.New(errno.ErrKnowledgeDocumentNotExistCode, errorx.KV("msg", "the specified document is not part of this knowledge base"))
138150
}
139151

140152
err = i.DomainSVC.DeleteDocument(ctx, &service.DeleteDocumentRequest{
141-
DocumentID: docID,
153+
DocumentID: r.DocumentID,
142154
})
143155
if err != nil {
144156
return &model.DeleteDocumentResponse{IsSuccess: false}, err

backend/domain/workflow/internal/nodes/knowledge/knowledge_deleter.go

Lines changed: 32 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@ package knowledge
1919
import (
2020
"context"
2121
"errors"
22+
"fmt"
23+
"strconv"
2224

2325
"github.com/coze-dev/coze-studio/backend/api/model/crossdomain/knowledge"
2426
crossknowledge "github.com/coze-dev/coze-studio/backend/crossdomain/contract/knowledge"
@@ -27,9 +29,12 @@ import (
2729
"github.com/coze-dev/coze-studio/backend/domain/workflow/internal/canvas/convert"
2830
"github.com/coze-dev/coze-studio/backend/domain/workflow/internal/nodes"
2931
"github.com/coze-dev/coze-studio/backend/domain/workflow/internal/schema"
32+
"github.com/spf13/cast"
3033
)
3134

32-
type DeleterConfig struct{}
35+
type DeleterConfig struct {
36+
KnowledgeID int64
37+
}
3338

3439
func (d *DeleterConfig) Adapt(_ context.Context, n *vo.Node, _ ...nodes.AdaptOption) (*schema.NodeSchema, error) {
3540
ns := &schema.NodeSchema{
@@ -39,6 +44,18 @@ func (d *DeleterConfig) Adapt(_ context.Context, n *vo.Node, _ ...nodes.AdaptOpt
3944
Configs: d,
4045
}
4146

47+
inputs := n.Data.Inputs
48+
datasetListInfoParam := inputs.DatasetParam[0]
49+
datasetIDs := datasetListInfoParam.Input.Value.Content.([]any)
50+
if len(datasetIDs) == 0 {
51+
return nil, fmt.Errorf("dataset ids is required")
52+
}
53+
knowledgeID, err := cast.ToInt64E(datasetIDs[0])
54+
if err != nil {
55+
return nil, err
56+
}
57+
d.KnowledgeID = knowledgeID
58+
4259
if err := convert.SetInputsForNodeSchema(n, ns); err != nil {
4360
return nil, err
4461
}
@@ -51,19 +68,29 @@ func (d *DeleterConfig) Adapt(_ context.Context, n *vo.Node, _ ...nodes.AdaptOpt
5168
}
5269

5370
func (d *DeleterConfig) Build(_ context.Context, _ *schema.NodeSchema, _ ...schema.BuildOption) (any, error) {
54-
return &Deleter{}, nil
71+
return &Deleter{
72+
KnowledgeID: d.KnowledgeID,
73+
}, nil
5574
}
5675

57-
type Deleter struct{}
76+
type Deleter struct {
77+
KnowledgeID int64
78+
}
5879

59-
func (k *Deleter) Invoke(ctx context.Context, input map[string]any) (map[string]any, error) {
80+
func (d *Deleter) Invoke(ctx context.Context, input map[string]any) (map[string]any, error) {
6081
documentID, ok := input["documentID"].(string)
6182
if !ok {
6283
return nil, errors.New("documentID is required and must be a string")
6384
}
6485

86+
docID, err := strconv.ParseInt(documentID, 10, 64)
87+
if err != nil {
88+
return nil, fmt.Errorf("invalid document id: %s", documentID)
89+
}
90+
6591
req := &knowledge.DeleteDocumentRequest{
66-
DocumentID: documentID,
92+
DocumentID: docID,
93+
KnowledgeID: d.KnowledgeID,
6794
}
6895

6996
response, err := crossknowledge.DefaultSVC().Delete(ctx, req)

0 commit comments

Comments
 (0)