Skip to content
Snippets Groups Projects
Commit 021c1e62 authored by Lukasz Lopatowski's avatar Lukasz Lopatowski
Browse files

Merge branch '234-allow-an-admin-to-view-edit-and-remove-ssh-keys-for-a-user' into 'develop'

Resolve "Allow an admin to view, edit, and remove SSH keys for a user"

See merge request !79
parents 7e410167 11d676a1
No related branches found
No related tags found
2 merge requests!108Develop,!79Resolve "Allow an admin to view, edit, and remove SSH keys for a user"
...@@ -160,6 +160,15 @@ ...@@ -160,6 +160,15 @@
</div> </div>
</div> </div>
<div class="" style="padding-bottom: 5rem;">
<label for="id" class="col-sm-2 control-label text-right mt-2">{{ 'BULK.LIST.APP_NAME' | translate }}</label>
<div class="col-sm-10">
<input type="text" class="form-control" id="id" name="id" [disabled]="true"
[(ngModel)]="bulk.details['appName']" #name="ngModel">
</div>
</div>
<div class="" style="padding-bottom: 5rem"> <div class="" style="padding-bottom: 5rem">
<label for="creator" <label for="creator"
class="col-sm-2 control-label text-right mt-2">{{ 'BULK.LIST.CREATOR' | translate }}</label> class="col-sm-2 control-label text-right mt-2">{{ 'BULK.LIST.CREATOR' | translate }}</label>
...@@ -196,14 +205,7 @@ ...@@ -196,14 +205,7 @@
</div> </div>
</div> </div>
<div class="" style="padding-bottom: 5rem;">
<label for="id" class="col-sm-2 control-label text-right mt-2">{{ 'BULK.LIST.APP_NAME' | translate }}</label>
<div class="col-sm-10">
<input type="text" class="form-control" id="id" name="id" [disabled]="true"
[(ngModel)]="bulk.details['appName']" #name="ngModel">
</div>
</div>
<div *ngIf="bulk.state !== 'REMOVED'" class="flex justify-content-end" style="padding-right: 1.5rem"> <div *ngIf="bulk.state !== 'REMOVED'" class="flex justify-content-end" style="padding-right: 1.5rem">
<button class="btn btn-primary mr-2" (click)="refreshStates()">{{'BULK.APP.REFRESH' | translate}}</button> <button class="btn btn-primary mr-2" (click)="refreshStates()">{{'BULK.APP.REFRESH' | translate}}</button>
......
...@@ -7,5 +7,6 @@ ...@@ -7,5 +7,6 @@
<div> <div>
<nmaas-userdetails [user]="user" [(userDetailsMode)]="userDetailsMode" [allowedModes]="[ComponentMode.VIEW, ComponentMode.EDIT]" [(errorMessage)]="errorMessage" (onSave)="onSave($event)" (refresh)="onRefresh()"></nmaas-userdetails> <nmaas-userdetails [user]="user" [(userDetailsMode)]="userDetailsMode" [allowedModes]="[ComponentMode.VIEW, ComponentMode.EDIT]" [(errorMessage)]="errorMessage" (onSave)="onSave($event)" (refresh)="onRefresh()"></nmaas-userdetails>
<nmaas-userprivileges [allowedModes]="[ComponentMode.VIEW, ComponentMode.CREATE]" [user]="user"></nmaas-userprivileges> <nmaas-userprivileges [allowedModes]="[ComponentMode.VIEW, ComponentMode.CREATE]" [user]="user"></nmaas-userprivileges>
<nmaas-ssh-keys *roles="['ROLE_SYSTEM_ADMIN']" [userMode]="true" [userId]="user?.id"></nmaas-ssh-keys>
</div> </div>
</div> </div>
...@@ -26,4 +26,17 @@ export class SSHKeyService extends GenericDataService { ...@@ -26,4 +26,17 @@ export class SSHKeyService extends GenericDataService {
public invalidate(id: number): Observable<any> { public invalidate(id: number): Observable<any> {
return this.delete(this.appConfig.getApiUrl() + '/user/keys/' + id); return this.delete(this.appConfig.getApiUrl() + '/user/keys/' + id);
} }
public getAllByUserId(userId: number): Observable<SSHKeyView[]> {
return this.get<SSHKeyView[]>(this.appConfig.getApiUrl() + '/user/keys/view/' + userId);
}
public createKeyForUser(request: SSHKeyRequest, userId: number ): Observable<any> {
return this.put<SSHKeyRequest, any>(this.appConfig.getApiUrl() + '/user/keys/view/' + userId, request);
}
public invalidateUserKey(keyId: number, userId: number): Observable<any> {
return this.delete(this.appConfig.getApiUrl() + '/user/keys/view/' + userId + "/" + keyId);
}
} }
import {Component, EventEmitter, OnInit, Output, ViewChild} from '@angular/core'; import {Component, EventEmitter, Input, OnInit, Output, ViewChild} from '@angular/core';
import {SSHKeyService} from '../../../service/sshkey.service'; import {SSHKeyService} from '../../../service/sshkey.service';
import {SSHKeyRequest} from '../../../model/sshkey-request'; import {SSHKeyRequest} from '../../../model/sshkey-request';
import {UntypedFormBuilder, UntypedFormGroup, Validators} from '@angular/forms'; import {UntypedFormBuilder, UntypedFormGroup, Validators} from '@angular/forms';
...@@ -17,6 +17,12 @@ export class NewSshKeyComponent implements OnInit { ...@@ -17,6 +17,12 @@ export class NewSshKeyComponent implements OnInit {
@Output() @Output()
public out: EventEmitter<any> = new EventEmitter<any>(); public out: EventEmitter<any> = new EventEmitter<any>();
@Input()
public userMode = false;
@Input()
public userId : number;
public error: string = undefined; public error: string = undefined;
public requestForm: UntypedFormGroup = undefined; public requestForm: UntypedFormGroup = undefined;
...@@ -38,17 +44,34 @@ export class NewSshKeyComponent implements OnInit { ...@@ -38,17 +44,34 @@ export class NewSshKeyComponent implements OnInit {
console.log(this.requestForm); console.log(this.requestForm);
request.name = this.requestForm.value.name.trim(); request.name = this.requestForm.value.name.trim();
request.key = this.requestForm.value.key.trim(); request.key = this.requestForm.value.key.trim();
if(this.userMode) {
if(this.userId !== null) {
this.keyService.createKeyForUser(request, this.userId).subscribe(
data => {
this.error = undefined;
this.requestForm.reset();
this.modal.hide();
this.out.emit();
},
error => {
this.error = error.message;
}
);
}
} else { // profile view
this.keyService.createKey(request).subscribe( this.keyService.createKey(request).subscribe(
data => { data => {
this.error = undefined; this.error = undefined;
this.requestForm.reset(); this.requestForm.reset();
this.modal.hide(); this.modal.hide();
this.out.emit(); this.out.emit();
}, },
error => { error => {
this.error = error.message; this.error = error.message;
} }
); );
}
} }
get name() { get name() {
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
<div class="panel-heading">{{'SSH_KEYS.HEADER' | translate}}</div> <div class="panel-heading">{{'SSH_KEYS.HEADER' | translate}}</div>
<div class="panel-body"> <div class="panel-body">
<div class="flex justify-content-end mb-4"> <div class="flex justify-content-end mb-4">
<app-new-ssh-key (out)="getData()"></app-new-ssh-key> <app-new-ssh-key [userMode]="userMode" [userId]="userId" (out)="getData()"></app-new-ssh-key>
</div> </div>
<table class="table table-hover" aria-describedby="User ssh keys table"> <table class="table table-hover" aria-describedby="User ssh keys table">
<thead> <thead>
......
import {Component, OnInit} from '@angular/core'; import {Component, Input, OnChanges, OnInit, SimpleChanges} from '@angular/core';
import {SSHKeyService} from '../../../service/sshkey.service'; import {SSHKeyService} from '../../../service/sshkey.service';
import {Observable} from 'rxjs'; import {Observable} from 'rxjs';
import {SSHKeyView} from '../../../model/sshkey-view'; import {SSHKeyView} from '../../../model/sshkey-view';
...@@ -8,16 +8,37 @@ import {SSHKeyView} from '../../../model/sshkey-view'; ...@@ -8,16 +8,37 @@ import {SSHKeyView} from '../../../model/sshkey-view';
templateUrl: './ssh-keys.component.html', templateUrl: './ssh-keys.component.html',
styleUrls: ['./ssh-keys.component.css'] styleUrls: ['./ssh-keys.component.css']
}) })
export class SshKeysComponent implements OnInit { export class SshKeysComponent implements OnInit, OnChanges {
public keys: Observable<SSHKeyView[]> = undefined; public keys: Observable<SSHKeyView[]> = undefined;
public keysList: SSHKeyView[] = []; public keysList: SSHKeyView[] = [];
@Input()
public userMode = false;
@Input()
public userId : number;
constructor(private keyService: SSHKeyService) { } constructor(private keyService: SSHKeyService) { }
ngOnInit() { ngOnInit() {
this.keys = this.keyService.getAll(); if(this.userMode) {
this.getData(); if(this.userId !== null) {
this.keys = this.keyService.getAllByUserId(this.userId);
this.getData();
}
} else { // profile view
this.keys = this.keyService.getAll();
this.getData();
}
}
ngOnChanges(changes: SimpleChanges) {
if (changes['userId']) {
this.ngOnInit();
console.log('Nowa wartość userId:', this.userId);
}
} }
getData() { getData() {
...@@ -33,15 +54,28 @@ export class SshKeysComponent implements OnInit { ...@@ -33,15 +54,28 @@ export class SshKeysComponent implements OnInit {
} }
invalidate(id: number) { invalidate(id: number) {
this.keyService.invalidate(id).subscribe( if(this.userMode) {
data => { this.keyService.invalidateUserKey(id, this.userId).subscribe(
console.log('invalidating ssh key id: ' + id + ' success'); data => {
this.getData(); console.log('invalidating ssh key id: ' + id + ' success');
}, this.getData();
error => { },
console.error(error); error => {
} console.error(error);
); }
);
} else {
this.keyService.invalidate(id).subscribe(
data => {
console.log('invalidating ssh key id: ' + id + ' success');
this.getData();
},
error => {
console.error(error);
}
);
}
} }
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment