From f0bcc809a4ae904c0f60656b2ac5e7395d8a0df9 Mon Sep 17 00:00:00 2001 From: Zeger-Jan van de Weg Date: Tue, 26 Sep 2017 13:07:01 +0200 Subject: Don't overwrite namespaces while renaming This is checked on the GitLab side, but better safe than sorry. --- CHANGELOG.md | 2 ++ internal/service/namespace/namespace.go | 9 +++++++++ internal/service/namespace/namespace_test.go | 9 +++++++++ 3 files changed, 20 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5592f91d6..b4948e5c4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,8 @@ v0.42.0 https://gitlab.com/gitlab-org/gitaly/merge_requests/374 - Return pre-receive errors in UserDeleteTag response https://gitlab.com/gitlab-org/gitaly/merge_requests/378 +- Check if we don't overwrite a namespace moved to gitaly + https://gitlab.com/gitlab-org/gitaly/merge_requests/375 v0.41.0 diff --git a/internal/service/namespace/namespace.go b/internal/service/namespace/namespace.go index 0f8c6d645..ebd284067 100644 --- a/internal/service/namespace/namespace.go +++ b/internal/service/namespace/namespace.go @@ -66,6 +66,15 @@ func (s *server) RenameNamespace(ctx context.Context, in *pb.RenameNamespaceRequ return nil, grpc.Errorf(codes.InvalidArgument, "from and to cannot be empty") } + // No need to check if the from path exists, if it doesn't, we'd later get an + // os.LinkError + toExistsCheck := &pb.NamespaceExistsRequest{StorageName: in.StorageName, Name: in.GetTo()} + if exists, err := s.NamespaceExists(ctx, toExistsCheck); err != nil { + return nil, err + } else if exists.Exists { + return nil, grpc.Errorf(codes.InvalidArgument, "to directory %s already exists", in.GetTo()) + } + err = os.Rename(namespacePath(storagePath, in.GetFrom()), namespacePath(storagePath, in.GetTo())) if _, ok := err.(*os.LinkError); ok { return nil, grpc.Errorf(codes.InvalidArgument, "from directory not found") diff --git a/internal/service/namespace/namespace_test.go b/internal/service/namespace/namespace_test.go index ca8875ddc..c051289a3 100644 --- a/internal/service/namespace/namespace_test.go +++ b/internal/service/namespace/namespace_test.go @@ -265,6 +265,15 @@ func TestRenameNamespace(t *testing.T) { }, errorCode: codes.InvalidArgument, }, + { + desc: "existing destination namespace", + request: &pb.RenameNamespaceRequest{ + From: "existing", + To: "existing", + StorageName: "default", + }, + errorCode: codes.InvalidArgument, + }, } _, err := client.AddNamespace(ctx, &pb.AddNamespaceRequest{"default", "existing"}) -- cgit v1.2.3