Skip to content

Commit 319016e

Browse files
committed
ING-1187: Return appropriate status for bad credentials
1 parent f865f35 commit 319016e

File tree

5 files changed

+65
-17
lines changed

5 files changed

+65
-17
lines changed

gateway/dataimpl/server_v1/errorhandler.go

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -529,6 +529,29 @@ func (e ErrorHandler) NewSearchSourceNotFoundStatus(baseErr error, indexName str
529529
return st
530530
}
531531

532+
func (e ErrorHandler) NewSearchIndexAuthenticationFailureStatus(baseErr error, bucketName, scopeName *string) *status.Status {
533+
var path string
534+
var resource string
535+
if bucketName != nil {
536+
path = *bucketName
537+
resource = "bucket"
538+
if scopeName != nil {
539+
path = path + "/" + *scopeName
540+
resource = "scope"
541+
}
542+
}
543+
544+
msg := fmt.Sprintf("Insufficient permissions to perform search index operation against %s.", path)
545+
st := status.New(codes.PermissionDenied, msg)
546+
st = e.tryAttachStatusDetails(st, &epb.ResourceInfo{
547+
ResourceType: resource,
548+
ResourceName: path,
549+
Description: "",
550+
})
551+
st = e.tryAttachExtraContext(st, baseErr)
552+
return st
553+
}
554+
532555
func (e ErrorHandler) NewDocMissingStatus(baseErr error, bucketName, scopeName, collectionName, docId string) *status.Status {
533556
st := status.New(codes.NotFound,
534557
fmt.Sprintf("Document '%s' not found in '%s/%s/%s'.",

gateway/dataimpl/server_v1/searchadminserver.go

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,8 @@ func (s *SearchIndexAdminServer) CreateIndex(ctx context.Context, in *admin_sear
111111
return nil, s.errorHandler.NewIncorrectSearchSourceTypeStatus(err, in.Name, in.SourceType).Err()
112112
} else if errors.Is(err, cbsearchx.ErrSourceNotFound) {
113113
return nil, s.errorHandler.NewSearchSourceNotFoundStatus(err, in.Name, in.SourceName).Err()
114+
} else if errors.Is(err, cbsearchx.ErrAuthenticationFailure) {
115+
return nil, s.errorHandler.NewSearchIndexAuthenticationFailureStatus(err, in.BucketName, in.ScopeName).Err()
114116
}
115117
return nil, s.errorHandler.NewGenericStatus(err).Err()
116118
}
@@ -217,6 +219,8 @@ func (s *SearchIndexAdminServer) UpdateIndex(ctx context.Context, in *admin_sear
217219
return nil, s.errorHandler.NewIncorrectSearchSourceTypeStatus(err, in.Index.Name, in.Index.SourceType).Err()
218220
} else if errors.Is(err, cbsearchx.ErrSourceNotFound) {
219221
return nil, s.errorHandler.NewSearchSourceNotFoundStatus(err, in.Index.Name, in.Index.SourceName).Err()
222+
} else if errors.Is(err, cbsearchx.ErrAuthenticationFailure) {
223+
return nil, s.errorHandler.NewSearchIndexAuthenticationFailureStatus(err, in.BucketName, in.ScopeName).Err()
220224
}
221225
return nil, s.errorHandler.NewGenericStatus(err).Err()
222226
}
@@ -264,6 +268,8 @@ func (s *SearchIndexAdminServer) DeleteIndex(ctx context.Context, in *admin_sear
264268
return nil, s.errorHandler.NewSearchIndexNameEmptyStatus(err).Err()
265269
} else if errors.Is(err, cbsearchx.ErrOnlyBucketOrScopeSet) {
266270
return nil, s.errorHandler.NewOnlyBucketOrScopeSetStatus(err, in.Name).Err()
271+
} else if errors.Is(err, cbsearchx.ErrAuthenticationFailure) {
272+
return nil, s.errorHandler.NewSearchIndexAuthenticationFailureStatus(err, in.BucketName, in.ScopeName).Err()
267273
}
268274
return nil, s.errorHandler.NewGenericStatus(err).Err()
269275
}
@@ -311,6 +317,8 @@ func (s *SearchIndexAdminServer) GetIndex(ctx context.Context, in *admin_search_
311317
return nil, s.errorHandler.NewSearchIndexNameEmptyStatus(err).Err()
312318
} else if errors.Is(err, cbsearchx.ErrOnlyBucketOrScopeSet) {
313319
return nil, s.errorHandler.NewOnlyBucketOrScopeSetStatus(err, in.Name).Err()
320+
} else if errors.Is(err, cbsearchx.ErrAuthenticationFailure) {
321+
return nil, s.errorHandler.NewSearchIndexAuthenticationFailureStatus(err, in.BucketName, in.ScopeName).Err()
314322
}
315323
return nil, s.errorHandler.NewGenericStatus(err).Err()
316324
}
@@ -346,6 +354,8 @@ func (s *SearchIndexAdminServer) ListIndexes(ctx context.Context, in *admin_sear
346354
return nil, s.errorHandler.NewSearchServiceNotAvailableStatus(err, "").Err()
347355
} else if errors.Is(err, cbsearchx.ErrOnlyBucketOrScopeSet) {
348356
return nil, s.errorHandler.NewOnlyBucketOrScopeSetStatus(err, "").Err()
357+
} else if errors.Is(err, cbsearchx.ErrAuthenticationFailure) {
358+
return nil, s.errorHandler.NewSearchIndexAuthenticationFailureStatus(err, in.BucketName, in.ScopeName).Err()
349359
}
350360
return nil, s.errorHandler.NewGenericStatus(err).Err()
351361
}
@@ -393,6 +403,8 @@ func (s *SearchIndexAdminServer) AnalyzeDocument(ctx context.Context, in *admin_
393403
return nil, s.errorHandler.NewOnlyBucketOrScopeSetStatus(err, in.Name).Err()
394404
} else if errors.Is(err, cbsearchx.ErrNoIndexPartitionsFound) {
395405
return nil, s.errorHandler.NewSearchIndexNotReadyStatus(err, in.Name).Err()
406+
} else if errors.Is(err, cbsearchx.ErrAuthenticationFailure) {
407+
return nil, s.errorHandler.NewSearchIndexAuthenticationFailureStatus(err, in.BucketName, in.ScopeName).Err()
396408
}
397409
return nil, s.errorHandler.NewGenericStatus(err).Err()
398410
}
@@ -432,6 +444,8 @@ func (s *SearchIndexAdminServer) GetIndexedDocumentsCount(ctx context.Context, i
432444
return nil, s.errorHandler.NewSearchIndexNameEmptyStatus(err).Err()
433445
} else if errors.Is(err, cbsearchx.ErrOnlyBucketOrScopeSet) {
434446
return nil, s.errorHandler.NewOnlyBucketOrScopeSetStatus(err, in.Name).Err()
447+
} else if errors.Is(err, cbsearchx.ErrAuthenticationFailure) {
448+
return nil, s.errorHandler.NewSearchIndexAuthenticationFailureStatus(err, in.BucketName, in.ScopeName).Err()
435449
}
436450
return nil, s.errorHandler.NewGenericStatus(err).Err()
437451
}
@@ -470,6 +484,8 @@ func (s *SearchIndexAdminServer) PauseIndexIngest(ctx context.Context, in *admin
470484
return nil, s.errorHandler.NewSearchIndexNameEmptyStatus(err).Err()
471485
} else if errors.Is(err, cbsearchx.ErrOnlyBucketOrScopeSet) {
472486
return nil, s.errorHandler.NewOnlyBucketOrScopeSetStatus(err, in.Name).Err()
487+
} else if errors.Is(err, cbsearchx.ErrAuthenticationFailure) {
488+
return nil, s.errorHandler.NewSearchIndexAuthenticationFailureStatus(err, in.BucketName, in.ScopeName).Err()
473489
}
474490
return nil, s.errorHandler.NewGenericStatus(err).Err()
475491
}
@@ -506,6 +522,8 @@ func (s *SearchIndexAdminServer) ResumeIndexIngest(ctx context.Context, in *admi
506522
return nil, s.errorHandler.NewSearchIndexNameEmptyStatus(err).Err()
507523
} else if errors.Is(err, cbsearchx.ErrOnlyBucketOrScopeSet) {
508524
return nil, s.errorHandler.NewOnlyBucketOrScopeSetStatus(err, in.Name).Err()
525+
} else if errors.Is(err, cbsearchx.ErrAuthenticationFailure) {
526+
return nil, s.errorHandler.NewSearchIndexAuthenticationFailureStatus(err, in.BucketName, in.ScopeName).Err()
509527
}
510528
return nil, s.errorHandler.NewGenericStatus(err).Err()
511529
}
@@ -542,6 +560,8 @@ func (s *SearchIndexAdminServer) AllowIndexQuerying(ctx context.Context, in *adm
542560
return nil, s.errorHandler.NewSearchIndexNameEmptyStatus(err).Err()
543561
} else if errors.Is(err, cbsearchx.ErrOnlyBucketOrScopeSet) {
544562
return nil, s.errorHandler.NewOnlyBucketOrScopeSetStatus(err, in.Name).Err()
563+
} else if errors.Is(err, cbsearchx.ErrAuthenticationFailure) {
564+
return nil, s.errorHandler.NewSearchIndexAuthenticationFailureStatus(err, in.BucketName, in.ScopeName).Err()
545565
}
546566
return nil, s.errorHandler.NewGenericStatus(err).Err()
547567
}
@@ -578,6 +598,8 @@ func (s *SearchIndexAdminServer) DisallowIndexQuerying(ctx context.Context, in *
578598
return nil, s.errorHandler.NewSearchIndexNameEmptyStatus(err).Err()
579599
} else if errors.Is(err, cbsearchx.ErrOnlyBucketOrScopeSet) {
580600
return nil, s.errorHandler.NewOnlyBucketOrScopeSetStatus(err, in.Name).Err()
601+
} else if errors.Is(err, cbsearchx.ErrAuthenticationFailure) {
602+
return nil, s.errorHandler.NewSearchIndexAuthenticationFailureStatus(err, in.BucketName, in.ScopeName).Err()
581603
}
582604
return nil, s.errorHandler.NewGenericStatus(err).Err()
583605
}
@@ -614,6 +636,8 @@ func (s *SearchIndexAdminServer) FreezeIndexPlan(ctx context.Context, in *admin_
614636
return nil, s.errorHandler.NewSearchIndexNameEmptyStatus(err).Err()
615637
} else if errors.Is(err, cbsearchx.ErrOnlyBucketOrScopeSet) {
616638
return nil, s.errorHandler.NewOnlyBucketOrScopeSetStatus(err, in.Name).Err()
639+
} else if errors.Is(err, cbsearchx.ErrAuthenticationFailure) {
640+
return nil, s.errorHandler.NewSearchIndexAuthenticationFailureStatus(err, in.BucketName, in.ScopeName).Err()
617641
}
618642
return nil, s.errorHandler.NewGenericStatus(err).Err()
619643
}
@@ -650,6 +674,8 @@ func (s *SearchIndexAdminServer) UnfreezeIndexPlan(ctx context.Context, in *admi
650674
return nil, s.errorHandler.NewSearchIndexNameEmptyStatus(err).Err()
651675
} else if errors.Is(err, cbsearchx.ErrOnlyBucketOrScopeSet) {
652676
return nil, s.errorHandler.NewOnlyBucketOrScopeSetStatus(err, in.Name).Err()
677+
} else if errors.Is(err, cbsearchx.ErrAuthenticationFailure) {
678+
return nil, s.errorHandler.NewSearchIndexAuthenticationFailureStatus(err, in.BucketName, in.ScopeName).Err()
653679
}
654680
return nil, s.errorHandler.NewGenericStatus(err).Err()
655681
}

gateway/test/search_mgmt_test.go

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ func (s *GatewayOpsTestSuite) RunCommonIndexErrorCases(
2929
indexName string,
3030
fn func(ctx context.Context, opts *commonIndexErrorTestData) (interface{}, error),
3131
) {
32-
_, scope := s.initialiseBucketAndScope()
32+
bucket, scope := s.initialiseBucketAndScope()
3333

3434
s.Run("BucketNotFound", func() {
3535
_, err := fn(ctx, &commonIndexErrorTestData{
@@ -57,19 +57,18 @@ func (s *GatewayOpsTestSuite) RunCommonIndexErrorCases(
5757
})
5858
})
5959

60-
// TODO - ING-1187
61-
// s.Run("BadCredentials", func() {
62-
// _, err := fn(ctx, &commonIndexErrorTestData{
63-
// IndexName: indexName,
64-
// BucketName: bucket,
65-
// ScopeName: scope,
66-
// Creds: s.badRpcCreds,
67-
// })
68-
// assertRpcStatus(s.T(), err, codes.Unauthenticated)
69-
// assertRpcErrorDetails(s.T(), err, func(d *epb.ResourceInfo) {
70-
// assert.Equal(s.T(), "searchindex", d.ResourceType)
71-
// })
72-
// })
60+
s.Run("BadCredentials", func() {
61+
_, err := fn(ctx, &commonIndexErrorTestData{
62+
IndexName: indexName,
63+
BucketName: bucket,
64+
ScopeName: scope,
65+
Creds: s.badRpcCreds,
66+
})
67+
assertRpcStatus(s.T(), err, codes.PermissionDenied)
68+
assertRpcErrorDetails(s.T(), err, func(d *epb.ResourceInfo) {
69+
assert.Equal(s.T(), "", d.ResourceType)
70+
})
71+
})
7372
}
7473

7574
func (s *GatewayOpsTestSuite) TestGetIndex() {

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ require (
1010
github.com/Azure/azure-sdk-for-go/sdk/keyvault/azsecrets v0.12.0
1111
github.com/aws/aws-sdk-go-v2/config v1.28.8
1212
github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.34.9
13-
github.com/couchbase/gocbcorex v0.0.0-20251022095750-491da08faa75
13+
github.com/couchbase/gocbcorex v0.0.0-20251103090415-9c1017f074ad
1414
github.com/couchbase/goprotostellar v1.0.3-0.20250811181441-159acea69746
1515
github.com/couchbaselabs/gocbconnstr v1.0.5
1616
github.com/couchbaselabs/gocbconnstr/v2 v2.0.0-20240607131231-fb385523de28

go.sum

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -67,8 +67,8 @@ github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XL
6767
github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
6868
github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
6969
github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
70-
github.com/couchbase/gocbcorex v0.0.0-20251022095750-491da08faa75 h1:H53znXKq5qgA0SLMgF5XuV0sHGQQ0wrmjJ1Cz7vxgEU=
71-
github.com/couchbase/gocbcorex v0.0.0-20251022095750-491da08faa75/go.mod h1:6dno13KSKXpYALSx1KkYNHCwIQiuZdfL1xc3dDcYl1o=
70+
github.com/couchbase/gocbcorex v0.0.0-20251103090415-9c1017f074ad h1:73Mp0a/Psf3CMKllTBXpXA6XMkLrwXy20EkNBqWL1uo=
71+
github.com/couchbase/gocbcorex v0.0.0-20251103090415-9c1017f074ad/go.mod h1:6dno13KSKXpYALSx1KkYNHCwIQiuZdfL1xc3dDcYl1o=
7272
github.com/couchbase/goprotostellar v1.0.3-0.20250811181441-159acea69746 h1:kibnwIhBQ50egj2wCX3cd+MtwPXKre4DTDnXuoXQCGQ=
7373
github.com/couchbase/goprotostellar v1.0.3-0.20250811181441-159acea69746/go.mod h1:x/he3raYF/EspPXAfuVsBdLFNEYUxgFhlicJTRduPZ4=
7474
github.com/couchbaselabs/gocbconnstr v1.0.5 h1:e0JokB5qbcz7rfnxEhNRTKz8q1svoRvDoZihsiwNigA=

0 commit comments

Comments
 (0)