mirror of
https://github.com/simon987/task_tracker.git
synced 2025-12-10 13:44:30 +00:00
Implement per-project webhook secret
This commit is contained in:
@@ -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})
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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))
|
||||
})
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
Reference in New Issue
Block a user