You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

66 lines
1.6 KiB

Sign merges, CRUD, Wiki and Repository initialisation with gpg key (#7631) This PR fixes #7598 by providing a configurable way of signing commits across the Gitea instance. Per repository configurability and import/generation of trusted secure keys is not provided by this PR - from a security PoV that's probably impossible to do properly. Similarly web-signing, that is asking the user to sign something, is not implemented - this could be done at a later stage however. ## Features - [x] If commit.gpgsign is set in .gitconfig sign commits and files created through repofiles. (merges should already have been signed.) - [x] Verify commits signed with the default gpg as valid - [x] Signer, Committer and Author can all be different - [x] Allow signer to be arbitrarily different - We still require the key to have an activated email on Gitea. A more complete implementation would be to use a keyserver and mark external-or-unactivated with an "unknown" trust level icon. - [x] Add a signing-key.gpg endpoint to get the default gpg pub key if available - Rather than add a fake web-flow user I've added this as an endpoint on /api/v1/signing-key.gpg - [x] Try to match the default key with a user on gitea - this is done at verification time - [x] Make things configurable? - app.ini configuration done - [x] when checking commits are signed need to check if they're actually verifiable too - [x] Add documentation I have decided that adjusting the docker to create a default gpg key is not the correct thing to do and therefore have not implemented this.
5 years ago
  1. // Copyright 2020 The Gitea Authors. All rights reserved.
  2. // Use of this source code is governed by a MIT-style
  3. // license that can be found in the LICENSE file.
  4. package misc
  5. import (
  6. "fmt"
  7. "net/http"
  8. "code.gitea.io/gitea/models"
  9. "code.gitea.io/gitea/modules/context"
  10. "code.gitea.io/gitea/modules/log"
  11. )
  12. // SigningKey returns the public key of the default signing key if it exists
  13. func SigningKey(ctx *context.Context) {
  14. // swagger:operation GET /signing-key.gpg miscellaneous getSigningKey
  15. // ---
  16. // summary: Get default signing-key.gpg
  17. // produces:
  18. // - text/plain
  19. // responses:
  20. // "200":
  21. // description: "GPG armored public key"
  22. // schema:
  23. // type: string
  24. // swagger:operation GET /repos/{owner}/{repo}/signing-key.gpg repository repoSigningKey
  25. // ---
  26. // summary: Get signing-key.gpg for given repository
  27. // produces:
  28. // - text/plain
  29. // parameters:
  30. // - name: owner
  31. // in: path
  32. // description: owner of the repo
  33. // type: string
  34. // required: true
  35. // - name: repo
  36. // in: path
  37. // description: name of the repo
  38. // type: string
  39. // required: true
  40. // responses:
  41. // "200":
  42. // description: "GPG armored public key"
  43. // schema:
  44. // type: string
  45. path := ""
  46. if ctx.Repo != nil && ctx.Repo.Repository != nil {
  47. path = ctx.Repo.Repository.RepoPath()
  48. }
  49. content, err := models.PublicSigningKey(path)
  50. if err != nil {
  51. ctx.ServerError("gpg export", err)
  52. return
  53. }
  54. _, err = ctx.Write([]byte(content))
  55. if err != nil {
  56. log.Error("Error writing key content %v", err)
  57. ctx.Error(http.StatusInternalServerError, fmt.Sprintf("%v", err))
  58. }
  59. }