Implement per-project webhook secret

This commit is contained in:
simon987
2019-02-24 15:30:38 -05:00
parent c736cc3d98
commit 397805f915
22 changed files with 378 additions and 59 deletions

View File

@@ -106,4 +106,12 @@ export class ApiService {
return this.http.post(this.url + `/project/secret/${pid}`, {"secret": secret})
}
getWebhookSecret(pid: number) {
return this.http.get(this.url + `/project/webhook_secret/${pid}`,)
}
setWebhookSecret(pid: number, secret: string) {
return this.http.post(this.url + `/project/webhook_secret/${pid}`, {"webhook_secret": secret})
}
}

View File

@@ -51,4 +51,16 @@ export class ManagerRoleOnProject {
this.role &= ~4
}
}
get secretRole(): boolean {
return (this.role & 8) != 0
}
set secretRole(role: boolean) {
if (role) {
this.role |= 8
} else {
this.role &= ~8
}
}
}

View File

@@ -366,13 +366,14 @@ export class ProjectDashboardComponent implements OnInit {
this.dialog.open(AreYouSureComponent, {
width: '250px',
}).afterClosed().subscribe(result => {
if (result) {
this.project.paused = paused;
this.apiService.updateProject(this.project).subscribe(() => {
this.translate.get("messenger.acknowledged").subscribe(t =>
this.messenger.show(t))
})
}
this.project.paused = paused;
this.apiService.updateProject(this.project).subscribe(() => {
this.translate.get("messenger.acknowledged").subscribe(t =>
this.messenger.show(t))
}, error => {
this.translate.get("messenger.unauthorized").subscribe(t =>
this.messenger.show(t))
})
});
}

View File

@@ -33,6 +33,7 @@
<button mat-raised-button color="primary"
*ngIf="authService.logged"
[routerLink]="'/project/' + project.id + '/secret'">
<mat-icon>security</mat-icon>
{{"project.secret" | translate}}</button>
</div>
</mat-expansion-panel>

View File

@@ -55,6 +55,10 @@
(change)="onRoleChange(m)"
[disabled]="m.manager.id==auth.account.id"
>{{"perms.manage"|translate}}</mat-checkbox>
<mat-checkbox [(ngModel)]="m.secretRole"
(change)="onRoleChange(m)"
[disabled]="m.manager.id==auth.account.id"
>{{"perms.secret"|translate}}</mat-checkbox>
</mat-list-item>
</mat-list>
</mat-card-content>

View File

@@ -1,22 +1,47 @@
<div class="container">
<mat-card>
<mat-card class="mat-elevation-z8">
<button mat-button [title]="'perms.refresh' | translate" style="float:right"
(click)="refresh()">
<mat-icon>refresh</mat-icon>
</button>
<mat-card-header>
<mat-card-title>{{"secret.title" | translate}}</mat-card-title>
<mat-card-subtitle>{{"secret.subtitle" | translate}}</mat-card-subtitle>
</mat-card-header>
<mat-card-content>
<mat-form-field appearance="outline">
<mat-label>{{"secret.secret" | translate}}</mat-label>
<textarea matInput [(ngModel)]="secret"
[placeholder]="'secret.secret'|translate"
name="secret"></textarea>
</mat-form-field>
</mat-card-content>
<mat-card-actions>
<button mat-raised-button color="primary"
(click)="onUpdate()">{{"secret.update" | translate}}
</button>
</mat-card-actions>
</mat-card>
<mat-form-field appearance="outline">
<mat-label>{{"secret.secret" | translate}}</mat-label>
<textarea matInput [(ngModel)]="secret"
[placeholder]="'secret.secret'|translate"
name="secret"></textarea>
</mat-form-field>
<mat-card style="margin-top: 2em" class="mat-elevation-z8">
<mat-card-header>
<mat-card-title>{{"secret.webhook_title" | translate}}</mat-card-title>
<mat-card-subtitle>{{"secret.webhook_subtitle" | translate}}</mat-card-subtitle>
</mat-card-header>
<mat-card-content>
<mat-form-field appearance="outline">
<mat-label>{{"secret.webhook_secret" | translate}}</mat-label>
<textarea matInput [(ngModel)]="webhookSecret"
[placeholder]="'secret.webhook_secret'|translate"
name="webhook_secret"></textarea>
</mat-form-field>
</mat-card-content>
<mat-card-actions>
<button mat-raised-button [routerLink]="'../'">Back</button>
<button mat-raised-button color="primary"
(click)="onUpdate()">{{"secret.update" | translate}}</button>
(click)="onWebhookUpdate()">{{"secret.update" | translate}}</button>
</mat-card-actions>
</mat-card>
</div>

View File

@@ -13,6 +13,7 @@ import {MessengerService} from "../messenger.service";
export class ProjectSecretComponent implements OnInit {
secret: string;
webhookSecret: string;
projectId: number;
constructor(private auth: AuthService,
@@ -26,6 +27,7 @@ export class ProjectSecretComponent implements OnInit {
this.route.params.subscribe(params => {
this.projectId = params["id"];
this.getSecret();
this.getWebhookSecret();
});
}
@@ -37,10 +39,28 @@ export class ProjectSecretComponent implements OnInit {
})
}
getWebhookSecret() {
this.apiService.getWebhookSecret(this.projectId).subscribe(data => {
this.webhookSecret = data["content"]["webhook_secret"]
}, error => {
this.translate.get("messenger.unauthorized").subscribe(t => this.messenger.show(t))
})
}
onUpdate() {
this.apiService.setSecret(this.projectId, this.secret).subscribe(data => {
this.translate.get("secret.ok").subscribe(t => this.messenger.show(t))
})
}
onWebhookUpdate() {
this.apiService.setWebhookSecret(this.projectId, this.webhookSecret).subscribe(data => {
this.translate.get("secret.ok").subscribe(t => this.messenger.show(t))
})
}
refresh() {
this.getWebhookSecret();
this.getSecret();
}
}

View File

@@ -8,7 +8,8 @@
"login": "Login",
"worker_dashboard": "Workers",
"account": "Account",
"manager_list": "Managers"
"manager_list": "Managers",
"back": "back"
},
"logs": {
"title": "Logs",
@@ -119,6 +120,7 @@
"read": "Read",
"edit": "Edit",
"manage": "Manage permissions",
"secret": "Configure secrets",
"set": "Changes saved",
"workers": "Workers",
"no_workers": "No workers have explicit access to this project",
@@ -152,6 +154,9 @@
"secret": {
"title": "Project secret",
"subtitle": "You can set project configuration here. It is only accessible by workers with ASSIGN access to this project",
"webhook_title": "Webhook secret",
"webhook_subtitle": "You need to supply this to Github/Gogs for delivery to work",
"webhook_secret": "Webhook secret",
"secret": "Secret",
"update": "Update",
"ok": "Updated"

View File

@@ -8,7 +8,8 @@
"login": "Ouvrir un session",
"worker_dashboard": "Workers",
"account": "Compte",
"manager_list": "Managers"
"manager_list": "Managers",
"back": "Arrière"
},
"logs": {
"title": "Journaux",
@@ -116,11 +117,11 @@
"read": "Lecture",
"edit": "Modification",
"manage": "Gestion des permissions",
"secret": "Gestion des secrets",
"set": "Changements enregistrés",
"workers": "Workers",
"no_workers": "Aucun Worker n'a explicitement accès à ce projet",
"managers": "Managers",
"secret": "Secret"
"managers": "Managers"
},
"messenger": {
"close": "Fermer",
@@ -148,8 +149,11 @@
"alias": "Alias pertinent"
},
"secret": {
"title": "Secret",
"title": "Secret du projet",
"subtitle": "Vous pouvez définir la configuration du projet ici. Ce n'est accessible que par les Workers ayant accès au projet",
"webhook_title": "Secret (Webhook)",
"webhook_subtitle": "Vous devez le donner à Github/Gogs.",
"webhook_secret": "Secret (Webhook)",
"secret": "Secret",
"update": "Mettre à jour",
"ok": "Mis à jour"