From b91743d4a947326bf60887a069e101d6dd904265 Mon Sep 17 00:00:00 2001 From: Seongmin Lee Date: Sat, 13 Jun 2026 02:04:18 +0900 Subject: [PATCH] knotmirror/xrpc/gitea: parse commit extra headers this will fix the verified mark bug Signed-off-by: Seongmin Lee --- knotmirror/xrpc/gitea/batch.go | 13 +++-- knotmirror/xrpc/gitea/commit_test.go | 73 ++++++++++++++++++++++++++++ 2 files changed, 79 insertions(+), 7 deletions(-) create mode 100644 knotmirror/xrpc/gitea/commit_test.go diff --git a/knotmirror/xrpc/gitea/batch.go b/knotmirror/xrpc/gitea/batch.go index fe49ba6e..a8e3191d 100644 --- a/knotmirror/xrpc/gitea/batch.go +++ b/knotmirror/xrpc/gitea/batch.go @@ -186,7 +186,8 @@ func ReadBatchLine(reader io.Reader) (sha []byte, typ string, size int64, err er // can lead to panic. func ReadCommit(oid plumbing.Hash, reader io.Reader) (*object.Commit, error) { commit := &object.Commit{ - Hash: oid, + Hash: oid, + ExtraHeaders: make(map[string][]byte), } payloadSB := new(strings.Builder) @@ -231,13 +232,9 @@ readLoop: continue } - split := bytes.SplitN(trimmed, []byte{' '}, 2) - var data []byte - if len(split) > 1 { - data = split[1] - } + k, data, _ := bytes.Cut(line, []byte{' '}) - switch string(split[0]) { + switch string(k) { case "tree": commit.TreeHash = plumbing.NewHash(string(data)) _, _ = payloadSB.Write(line) @@ -257,6 +254,7 @@ readLoop: _ = signatureSB.WriteByte('\n') pgpsig = true default: + commit.ExtraHeaders[string(k)] = bytes.TrimSpace(data) // If the first line is not any of the known headers, then it is probably the prefix added when git cat-file is called with --batch, and that is not part of the payload if !firstLine { // Every subsequent header field is added to the payload @@ -271,6 +269,7 @@ readLoop: firstLine = false } commit.Message = messageSB.String() + // TODO: pass raw payload so we can verify it without reconstructing the payload commit.PGPSignature = signatureSB.String() return commit, nil diff --git a/knotmirror/xrpc/gitea/commit_test.go b/knotmirror/xrpc/gitea/commit_test.go new file mode 100644 index 00000000..bf97affc --- /dev/null +++ b/knotmirror/xrpc/gitea/commit_test.go @@ -0,0 +1,73 @@ +// Copyright 2021 The Gitea Authors. All rights reserved. +// SPDX-License-Identifier: MIT + +package gitea + +import ( + "strings" + "testing" + + "github.com/go-git/go-git/v5/plumbing" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "tangled.org/core/types" +) + +func TestCommitFromReader(t *testing.T) { + commitString := `tree f1a6cb52b2d16773290cefe49ad0684b50a4f930 +parent 37991dec2c8e592043f47155ce4808d4580f9123 +author silverwind 1563741793 +0200 +committer silverwind 1563741793 +0200 +gpgsig -----BEGIN PGP SIGNATURE----- + iQIzBAABCAAdFiEEWPb2jX6FS2mqyJRQLmK0HJOGlEMFAl00zmEACgkQLmK0HJOG + lEMDFBAAhQKKqLD1VICygJMEB8t1gBmNLgvziOLfpX4KPWdPtBk3v/QJ7OrfMrVK + xlC4ZZyx6yMm1Q7GzmuWykmZQJ9HMaHJ49KAbh5MMjjV/+OoQw9coIdo8nagRUld + vX8QHzNZ6Agx77xHuDJZgdHKpQK3TrMDsxzoYYMvlqoLJIDXE1Sp7KYNy12nhdRg + R6NXNmW8oMZuxglkmUwayMiPS+N4zNYqv0CXYzlEqCOgq9MJUcAMHt+KpiST+sm6 + FWkJ9D+biNPyQ9QKf1AE4BdZia4lHfPYU/C/DEL/a5xQuuop/zMQZoGaIA4p2zGQ + /maqYxEIM/yRBQpT1jlODKPJrMEgx7SgY2hRU47YZ4fj6350fb6fNBtiiMAfJbjL + S3Gh85E9fm3hJaNSPKAaJFYL1Ya2svuWfgHj677C56UcmYis7fhiiy1aJuYdHnSm + sD53z/f0J+We4VZjY+pidvA9BGZPFVdR3wd3xGs8/oH6UWaLJAMGkLG6dDb3qDLm + 1LFZwsX8sdD32i1SiWanYQYSYMyFWr0awi4xdoMtYCL7uKBYtwtPyvq3cj4IrJlb + mfeFhT57UbE4qukTDIQ0Y0WM40UYRTakRaDY7ubhXgLgx09Cnp9XTVMsHgT6j9/i + 1pxsB104XLWjQHTjr1JtiaBQEwFh9r2OKTcpvaLcbNtYpo7CzOs= + =FRsO + -----END PGP SIGNATURE----- + +empty commit` + + sha := plumbing.NewHash("feaf4ba6bc635fec442f46ddd4512416ec43c2c2") + + commitFromReader, err := ReadCommit(sha, strings.NewReader(commitString)) + assert.NoError(t, err) + require.NotNil(t, commitFromReader) + + tcommit := types.Commit{} + tcommit.FromGoGitCommit(commitFromReader) + assert.EqualValues(t, sha, tcommit.Hash) + + assert.Equal(t, `-----BEGIN PGP SIGNATURE----- + +iQIzBAABCAAdFiEEWPb2jX6FS2mqyJRQLmK0HJOGlEMFAl00zmEACgkQLmK0HJOG +lEMDFBAAhQKKqLD1VICygJMEB8t1gBmNLgvziOLfpX4KPWdPtBk3v/QJ7OrfMrVK +xlC4ZZyx6yMm1Q7GzmuWykmZQJ9HMaHJ49KAbh5MMjjV/+OoQw9coIdo8nagRUld +vX8QHzNZ6Agx77xHuDJZgdHKpQK3TrMDsxzoYYMvlqoLJIDXE1Sp7KYNy12nhdRg +R6NXNmW8oMZuxglkmUwayMiPS+N4zNYqv0CXYzlEqCOgq9MJUcAMHt+KpiST+sm6 +FWkJ9D+biNPyQ9QKf1AE4BdZia4lHfPYU/C/DEL/a5xQuuop/zMQZoGaIA4p2zGQ +/maqYxEIM/yRBQpT1jlODKPJrMEgx7SgY2hRU47YZ4fj6350fb6fNBtiiMAfJbjL +S3Gh85E9fm3hJaNSPKAaJFYL1Ya2svuWfgHj677C56UcmYis7fhiiy1aJuYdHnSm +sD53z/f0J+We4VZjY+pidvA9BGZPFVdR3wd3xGs8/oH6UWaLJAMGkLG6dDb3qDLm +1LFZwsX8sdD32i1SiWanYQYSYMyFWr0awi4xdoMtYCL7uKBYtwtPyvq3cj4IrJlb +mfeFhT57UbE4qukTDIQ0Y0WM40UYRTakRaDY7ubhXgLgx09Cnp9XTVMsHgT6j9/i +1pxsB104XLWjQHTjr1JtiaBQEwFh9r2OKTcpvaLcbNtYpo7CzOs= +=FRsO +-----END PGP SIGNATURE----- +`, commitFromReader.PGPSignature) + assert.Equal(t, `tree f1a6cb52b2d16773290cefe49ad0684b50a4f930 +parent 37991dec2c8e592043f47155ce4808d4580f9123 +author silverwind 1563741793 +0200 +committer silverwind 1563741793 +0200 + +empty commit`, tcommit.Payload()) + assert.Equal(t, "silverwind ", commitFromReader.Author.String()) +} -- 2.51.2