Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitaly.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPatrick Steinhardt <psteinhardt@gitlab.com>2023-06-05 13:07:35 +0300
committerPatrick Steinhardt <psteinhardt@gitlab.com>2023-06-05 14:02:16 +0300
commitc2a53b00585a5da36b3469d1174aed9ce35856e0 (patch)
tree4207d7092cdcf04bebfd1a70a031f0903cec987b
parentf3d70f4d6c286815b1af11c1cfee86f9dafa0cb0 (diff)
commit: Convert `ListCommits()` to use `VerifyRevisions()`
The `ListCommits()` RPC has an open-coded version of revision validation. This validation is both too lenient and too restrictive as it does not reject known-bad patterns while also restricting pseudo-revisions which would be perfectly fine. Refactor the RPC to use `ValidateRevision()` as our new single source of truth for revision validation. Note that we do not allow path-scoped revisions here given that commits cannot ever live at a path anyway.
-rw-r--r--internal/gitaly/service/commit/list_commits.go6
-rw-r--r--internal/gitaly/service/commit/list_commits_test.go12
2 files changed, 10 insertions, 8 deletions
diff --git a/internal/gitaly/service/commit/list_commits.go b/internal/gitaly/service/commit/list_commits.go
index ea55433c5..00a66a771 100644
--- a/internal/gitaly/service/commit/list_commits.go
+++ b/internal/gitaly/service/commit/list_commits.go
@@ -2,8 +2,6 @@ package commit
import (
"errors"
- "fmt"
- "strings"
"gitlab.com/gitlab-org/gitaly/v16/internal/git"
"gitlab.com/gitlab-org/gitaly/v16/internal/git/catfile"
@@ -22,8 +20,8 @@ func verifyListCommitsRequest(request *gitalypb.ListCommitsRequest) error {
return errors.New("missing revisions")
}
for _, revision := range request.Revisions {
- if strings.HasPrefix(revision, "-") && revision != "--all" && revision != "--not" {
- return fmt.Errorf("invalid revision: %q", revision)
+ if err := git.ValidateRevision([]byte(revision), git.AllowPseudoRevision()); err != nil {
+ return structerr.NewInvalidArgument("invalid revision: %w", err).WithMetadata("revision", revision)
}
}
return nil
diff --git a/internal/gitaly/service/commit/list_commits_test.go b/internal/gitaly/service/commit/list_commits_test.go
index 2563f3c71..e06302179 100644
--- a/internal/gitaly/service/commit/list_commits_test.go
+++ b/internal/gitaly/service/commit/list_commits_test.go
@@ -9,6 +9,7 @@ import (
"github.com/stretchr/testify/require"
"gitlab.com/gitlab-org/gitaly/v16/internal/git/gittest"
+ "gitlab.com/gitlab-org/gitaly/v16/internal/structerr"
"gitlab.com/gitlab-org/gitaly/v16/internal/testhelper"
"gitlab.com/gitlab-org/gitaly/v16/proto/go/gitalypb"
"google.golang.org/grpc/codes"
@@ -338,12 +339,15 @@ func TestListCommits_verify(t *testing.T) {
{
desc: "no revisions",
req: &gitalypb.ListCommitsRequest{Repository: repo},
- expectedErr: status.Error(codes.InvalidArgument, "missing revisions"),
+ expectedErr: structerr.NewInvalidArgument("missing revisions"),
},
{
- desc: "invalid revision",
- req: &gitalypb.ListCommitsRequest{Repository: repo, Revisions: []string{"asdf", "-invalid"}},
- expectedErr: status.Error(codes.InvalidArgument, `invalid revision: "-invalid"`),
+ desc: "invalid revision",
+ req: &gitalypb.ListCommitsRequest{Repository: repo, Revisions: []string{"asdf", "-invalid"}},
+ expectedErr: testhelper.WithInterceptedMetadata(
+ structerr.NewInvalidArgument("invalid revision: revision can't start with '-'"),
+ "revision", "-invalid",
+ ),
},
} {
t.Run(tc.desc, func(t *testing.T) {