gitea源码

commit_test.go 4.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. // Copyright 2025 The Gitea Authors. All rights reserved.
  2. // SPDX-License-Identifier: MIT
  3. package asymkey
  4. import (
  5. "strings"
  6. "testing"
  7. asymkey_model "code.gitea.io/gitea/models/asymkey"
  8. "code.gitea.io/gitea/models/db"
  9. "code.gitea.io/gitea/models/unittest"
  10. user_model "code.gitea.io/gitea/models/user"
  11. "code.gitea.io/gitea/modules/git"
  12. "code.gitea.io/gitea/modules/setting"
  13. "code.gitea.io/gitea/modules/test"
  14. "github.com/stretchr/testify/assert"
  15. "github.com/stretchr/testify/require"
  16. )
  17. func TestParseCommitWithSSHSignature(t *testing.T) {
  18. assert.NoError(t, unittest.PrepareTestDatabase())
  19. // Here we only need to do some tests that "tests/integration/gpg_ssh_git_test.go" doesn't cover
  20. // -----BEGIN OPENSSH PRIVATE KEY-----
  21. // b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAAAMwAAAAtzc2gtZW
  22. // QyNTUxOQAAACC6T6zF0oPak8dOIzzT1kXB7LrcsVo04SKc3GjuvMllZwAAAJgy08upMtPL
  23. // qQAAAAtzc2gtZWQyNTUxOQAAACC6T6zF0oPak8dOIzzT1kXB7LrcsVo04SKc3GjuvMllZw
  24. // AAAEDWqPHTH51xb4hy1y1f1VeWL/2A9Q0b6atOyv5fx8x5prpPrMXSg9qTx04jPNPWRcHs
  25. // utyxWjThIpzcaO68yWVnAAAAEXVzZXIyQGV4YW1wbGUuY29tAQIDBA==
  26. // -----END OPENSSH PRIVATE KEY-----
  27. sshPubKey, err := asymkey_model.AddPublicKey(t.Context(), 999, "user-ssh-key-any-name", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAILpPrMXSg9qTx04jPNPWRcHsutyxWjThIpzcaO68yWVn", 0)
  28. require.NoError(t, err)
  29. _, err = db.GetEngine(t.Context()).ID(sshPubKey.ID).Cols("verified").Update(&asymkey_model.PublicKey{Verified: true})
  30. require.NoError(t, err)
  31. t.Run("UserSSHKey", func(t *testing.T) {
  32. commit, err := git.CommitFromReader(nil, git.Sha1ObjectFormat.EmptyObjectID(), strings.NewReader(`tree a3b1fad553e0f9a2b4a58327bebde36c7da75aa2
  33. author user2 <user2@example.com> 1752194028 -0700
  34. committer user2 <user2@example.com> 1752194028 -0700
  35. gpgsig -----BEGIN SSH SIGNATURE-----
  36. U1NIU0lHAAAAAQAAADMAAAALc3NoLWVkMjU1MTkAAAAguk+sxdKD2pPHTiM809ZFwey63L
  37. FaNOEinNxo7rzJZWcAAAADZ2l0AAAAAAAAAAZzaGE1MTIAAABTAAAAC3NzaC1lZDI1NTE5
  38. AAAAQBfX+6mcKZBnXckwHcBFqRuXMD3vTKi1yv5wgrqIxTyr2LWB97xxmO92cvjsr0POQ2
  39. 2YA7mQS510Cg2s1uU1XAk=
  40. -----END SSH SIGNATURE-----
  41. init project
  42. `))
  43. require.NoError(t, err)
  44. // the committingUser is guaranteed by the caller, parseCommitWithSSHSignature doesn't do any more checks
  45. committingUser := &user_model.User{ID: 999, Name: "user-x"}
  46. ret := parseCommitWithSSHSignature(t.Context(), commit, committingUser)
  47. require.NotNil(t, ret)
  48. assert.True(t, ret.Verified)
  49. assert.Equal(t, committingUser.Name+" / "+sshPubKey.Fingerprint, ret.Reason)
  50. assert.False(t, ret.Warning)
  51. assert.Equal(t, committingUser, ret.SigningUser)
  52. assert.Equal(t, committingUser, ret.CommittingUser)
  53. assert.Equal(t, sshPubKey.ID, ret.SigningSSHKey.ID)
  54. })
  55. t.Run("TrustedSSHKey", func(t *testing.T) {
  56. defer test.MockVariableValue(&setting.Repository.Signing.SigningName, "gitea")()
  57. defer test.MockVariableValue(&setting.Repository.Signing.SigningEmail, "gitea@fake.local")()
  58. defer test.MockVariableValue(&setting.Repository.Signing.TrustedSSHKeys, []string{"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIH6Y4idVaW3E+bLw1uqoAfJD7o5Siu+HqS51E9oQLPE9"})()
  59. commit, err := git.CommitFromReader(nil, git.Sha1ObjectFormat.EmptyObjectID(), strings.NewReader(`tree 9a93ffa76e8b72bdb6431910b3a506fa2b39f42e
  60. author User Two <user2@example.com> 1749230009 +0200
  61. committer User Two <user2@example.com> 1749230009 +0200
  62. gpgsig -----BEGIN SSH SIGNATURE-----
  63. U1NIU0lHAAAAAQAAADMAAAALc3NoLWVkMjU1MTkAAAAgfpjiJ1VpbcT5svDW6qgB8kPujl
  64. KK74epLnUT2hAs8T0AAAADZ2l0AAAAAAAAAAZzaGE1MTIAAABTAAAAC3NzaC1lZDI1NTE5
  65. AAAAQDX2t2iHuuLxEWHLJetYXKsgayv3c43r0pJNfAzdLN55Q65pC5M7rG6++gT2bxcpOu
  66. Y6EXbpLqia9sunEF3+LQY=
  67. -----END SSH SIGNATURE-----
  68. Initial commit with signed file
  69. `))
  70. require.NoError(t, err)
  71. committingUser := &user_model.User{
  72. ID: 2,
  73. Name: "User Two",
  74. Email: "user2@example.com",
  75. }
  76. ret := parseCommitWithSSHSignature(t.Context(), commit, committingUser)
  77. require.NotNil(t, ret)
  78. assert.True(t, ret.Verified)
  79. assert.False(t, ret.Warning)
  80. assert.Equal(t, committingUser, ret.CommittingUser)
  81. if assert.NotNil(t, ret.SigningUser) {
  82. assert.Equal(t, "gitea", ret.SigningUser.Name)
  83. assert.Equal(t, "gitea@fake.local", ret.SigningUser.Email)
  84. }
  85. })
  86. }