mirror of
				https://github.com/go-gitea/gitea
				synced 2025-10-31 11:28:24 +00:00 
			
		
		
		
	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.
This commit is contained in:
		| @@ -231,3 +231,38 @@ func doAPIMergePullRequest(ctx APITestContext, owner, repo string, index int64) | ||||
| 		ctx.Session.MakeRequest(t, req, 200) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func doAPIGetBranch(ctx APITestContext, branch string, callback ...func(*testing.T, api.Branch)) func(*testing.T) { | ||||
| 	return func(t *testing.T) { | ||||
| 		req := NewRequestf(t, "GET", "/api/v1/repos/%s/%s/branches/%s?token=%s", ctx.Username, ctx.Reponame, branch, ctx.Token) | ||||
| 		if ctx.ExpectedCode != 0 { | ||||
| 			ctx.Session.MakeRequest(t, req, ctx.ExpectedCode) | ||||
| 			return | ||||
| 		} | ||||
| 		resp := ctx.Session.MakeRequest(t, req, http.StatusOK) | ||||
|  | ||||
| 		var branch api.Branch | ||||
| 		DecodeJSON(t, resp, &branch) | ||||
| 		if len(callback) > 0 { | ||||
| 			callback[0](t, branch) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func doAPICreateFile(ctx APITestContext, treepath string, options *api.CreateFileOptions, callback ...func(*testing.T, api.FileResponse)) func(*testing.T) { | ||||
| 	return func(t *testing.T) { | ||||
| 		url := fmt.Sprintf("/api/v1/repos/%s/%s/contents/%s?token=%s", ctx.Username, ctx.Reponame, treepath, ctx.Token) | ||||
| 		req := NewRequestWithJSON(t, "POST", url, &options) | ||||
| 		if ctx.ExpectedCode != 0 { | ||||
| 			ctx.Session.MakeRequest(t, req, ctx.ExpectedCode) | ||||
| 			return | ||||
| 		} | ||||
| 		resp := ctx.Session.MakeRequest(t, req, http.StatusCreated) | ||||
|  | ||||
| 		var contents api.FileResponse | ||||
| 		DecodeJSON(t, resp, &contents) | ||||
| 		if len(callback) > 0 { | ||||
| 			callback[0](t, contents) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user