Require approval to run actions for fork pull request (#22803)

Currently, Gitea will run actions automatically which are triggered by
fork pull request. It's a security risk, people can create a PR and
modify the workflow yamls to execute a malicious script.

So we should require approval for first-time contributors, which is the
default strategy of a public repo on GitHub, see [Approving workflow
runs from public
forks](https://docs.github.com/en/actions/managing-workflow-runs/approving-workflow-runs-from-public-forks).

Current strategy:

- don't need approval if it's not a fork PR;
- always need approval if the user is restricted;
- don't need approval if the user can write;
- don't need approval if the user has been approved before;
- otherwise, need approval.

https://user-images.githubusercontent.com/9418365/217207121-badf50a8-826c-4425-bef1-d82d1979bc81.mov

GitHub has an option for that, you can see that at
`/<owner>/<repo>/settings/actions`, and we can support that later.

<img width="835" alt="image"
src="https://user-images.githubusercontent.com/9418365/217199990-2967e68b-e693-4e59-8186-ab33a1314a16.png">

---------

Co-authored-by: Lunny Xiao <xiaolunwen@gmail.com>
This commit is contained in:
Jason Song 2023-02-24 15:58:49 +08:00 committed by GitHub
parent a6175b01d9
commit edf98a2dc3
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
10 changed files with 154 additions and 16 deletions

View file

@ -3,7 +3,10 @@
<div class="action-view-header">
<div class="action-info-summary">
{{ run.title }}
<button class="run_cancel" @click="cancelRun()" v-if="run.canCancel">
<button class="run_approve" @click="approveRun()" v-if="run.canApprove">
<i class="play circle outline icon"/>
</button>
<button class="run_cancel" @click="cancelRun()" v-else-if="run.canCancel">
<i class="stop circle outline icon"/>
</button>
</div>
@ -97,6 +100,7 @@ const sfc = {
link: '',
title: '',
canCancel: false,
canApprove: false,
done: false,
jobs: [
// {
@ -173,6 +177,10 @@ const sfc = {
cancelRun() {
this.fetchPost(`${this.run.link}/cancel`);
},
// approve a run
approveRun() {
this.fetchPost(`${this.run.link}/approve`);
},
createLogLine(line) {
const div = document.createElement('div');
@ -303,7 +311,15 @@ export function initRepositoryActionView() {
cursor: pointer;
transition:transform 0.2s;
};
.run_cancel:hover{
.run_approve {
border: none;
color: var(--color-green);
background-color: transparent;
outline: none;
cursor: pointer;
transition:transform 0.2s;
};
.run_cancel:hover, .run_approve:hover {
transform:scale(130%);
};
}