]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
mgr/dashboard: Fix iSCSI Discovery user permissions
authorTiago Melo <tmelo@suse.com>
Thu, 18 Apr 2019 09:31:38 +0000 (09:31 +0000)
committerTiago Melo <tmelo@suse.com>
Thu, 18 Apr 2019 12:29:01 +0000 (12:29 +0000)
Fixes: http://tracker.ceph.com/issues/39328
Signed-off-by: Tiago Melo <tmelo@suse.com>
src/pybind/mgr/dashboard/controllers/iscsi.py
src/pybind/mgr/dashboard/frontend/src/app/ceph/block/iscsi-target-discovery-modal/iscsi-target-discovery-modal.component.html
src/pybind/mgr/dashboard/frontend/src/app/ceph/block/iscsi-target-discovery-modal/iscsi-target-discovery-modal.component.spec.ts
src/pybind/mgr/dashboard/frontend/src/app/ceph/block/iscsi-target-discovery-modal/iscsi-target-discovery-modal.component.ts
src/pybind/mgr/dashboard/frontend/src/app/ceph/block/iscsi-target-list/iscsi-target-list.component.html
src/pybind/mgr/dashboard/frontend/src/locale/messages.xlf

index f8b0e3063b5ef93aae7634a1ba98bba2f45a210e..744e4c8d8f3efdf4248af0f0d2838b342fcd50c3 100644 (file)
@@ -144,7 +144,7 @@ class IscsiUi(BaseController):
 class Iscsi(BaseController):
 
     @Endpoint('GET', 'discoveryauth')
-    @UpdatePermission
+    @ReadPermission
     def get_discoveryauth(self):
         return self._get_discoveryauth()
 
index fbd603f4754c05b7331f4531f3a9c78d2dc2deac..9fe64e8317158a0e409091079d93f67d45743e14 100644 (file)
         <div class="button-group text-right">
           <cd-submit-button (submitAction)="submitAction()"
                             [form]="discoveryForm"
+                            *ngIf="hasPermission"
                             i18n>Submit</cd-submit-button>
           <cd-back-button [back]="bsModalRef.hide"
                           name="Cancel"
index 21005c80c524a8d4763b4cd93adb0f7dc132aa88..69b59047cf78c2a1dd7a3c21d8e056efddc89484 100644 (file)
@@ -5,12 +5,14 @@ import {
 } from '@angular/common/http/testing';
 import { ComponentFixture, TestBed } from '@angular/core/testing';
 import { ReactiveFormsModule } from '@angular/forms';
+import { By } from '@angular/platform-browser';
 import { RouterTestingModule } from '@angular/router/testing';
 
 import { ToastModule } from 'ng2-toastr';
 import { BsModalRef } from 'ngx-bootstrap/modal';
 
 import { configureTestBed, i18nProviders } from '../../../../testing/unit-test-helper';
+import { Permission } from '../../../shared/models/permissions';
 import { SharedModule } from '../../../shared/shared.module';
 import { IscsiTargetDiscoveryModalComponent } from './iscsi-target-discovery-modal.component';
 
@@ -20,6 +22,9 @@ describe('IscsiTargetDiscoveryModalComponent', () => {
   let httpTesting: HttpTestingController;
   let req: TestRequest;
 
+  const elem = (css) => fixture.debugElement.query(By.css(css));
+  const elemDisabled = (css) => elem(css).nativeElement.disabled;
+
   configureTestBed({
     declarations: [IscsiTargetDiscoveryModalComponent],
     imports: [
@@ -36,54 +41,80 @@ describe('IscsiTargetDiscoveryModalComponent', () => {
     fixture = TestBed.createComponent(IscsiTargetDiscoveryModalComponent);
     component = fixture.componentInstance;
     httpTesting = TestBed.get(HttpTestingController);
-    fixture.detectChanges();
-    req = httpTesting.expectOne('api/iscsi/discoveryauth');
   });
 
-  it('should create', () => {
-    expect(component).toBeTruthy();
-  });
+  describe('with update permissions', () => {
+    beforeEach(() => {
+      component.permission = new Permission(['update']);
+      fixture.detectChanges();
+      req = httpTesting.expectOne('api/iscsi/discoveryauth');
+    });
 
-  it('should create form', () => {
-    expect(component.discoveryForm.value).toEqual({
-      user: '',
-      password: '',
-      mutual_user: '',
-      mutual_password: ''
+    it('should create', () => {
+      expect(component).toBeTruthy();
     });
-  });
 
-  it('should patch form', () => {
-    req.flush({
-      user: 'foo',
-      password: 'bar',
-      mutual_user: 'mutual_foo',
-      mutual_password: 'mutual_bar'
+    it('should create form', () => {
+      expect(component.discoveryForm.value).toEqual({
+        user: '',
+        password: '',
+        mutual_user: '',
+        mutual_password: ''
+      });
     });
-    expect(component.discoveryForm.value).toEqual({
-      user: 'foo',
-      password: 'bar',
-      mutual_user: 'mutual_foo',
-      mutual_password: 'mutual_bar'
+
+    it('should patch form', () => {
+      req.flush({
+        user: 'foo',
+        password: 'bar',
+        mutual_user: 'mutual_foo',
+        mutual_password: 'mutual_bar'
+      });
+      expect(component.discoveryForm.value).toEqual({
+        user: 'foo',
+        password: 'bar',
+        mutual_user: 'mutual_foo',
+        mutual_password: 'mutual_bar'
+      });
     });
-  });
 
-  it('should submit new values', () => {
-    component.discoveryForm.patchValue({
-      user: 'new_user',
-      password: 'new_pass',
-      mutual_user: 'mutual_new_user',
-      mutual_password: 'mutual_new_pass'
+    it('should submit new values', () => {
+      component.discoveryForm.patchValue({
+        user: 'new_user',
+        password: 'new_pass',
+        mutual_user: 'mutual_new_user',
+        mutual_password: 'mutual_new_pass'
+      });
+      component.submitAction();
+
+      const submit_req = httpTesting.expectOne('api/iscsi/discoveryauth');
+      expect(submit_req.request.method).toBe('PUT');
+      expect(submit_req.request.body).toEqual({
+        user: 'new_user',
+        password: 'new_pass',
+        mutual_user: 'mutual_new_user',
+        mutual_password: 'mutual_new_pass'
+      });
     });
-    component.submitAction();
 
-    const submit_req = httpTesting.expectOne('api/iscsi/discoveryauth');
-    expect(submit_req.request.method).toBe('PUT');
-    expect(submit_req.request.body).toEqual({
-      user: 'new_user',
-      password: 'new_pass',
-      mutual_user: 'mutual_new_user',
-      mutual_password: 'mutual_new_pass'
+    it('should enable form if user has update permission', () => {
+      expect(elemDisabled('input#user')).toBeFalsy();
+      expect(elemDisabled('input#password')).toBeFalsy();
+      expect(elemDisabled('input#mutual_user')).toBeFalsy();
+      expect(elemDisabled('input#mutual_password')).toBeFalsy();
+      expect(elem('cd-submit-button')).toBeDefined();
     });
   });
+
+  it('should disabled form if user does not have update permission', () => {
+    component.permission = new Permission(['read', 'create', 'delete']);
+    fixture.detectChanges();
+    req = httpTesting.expectOne('api/iscsi/discoveryauth');
+
+    expect(elemDisabled('input#user')).toBeTruthy();
+    expect(elemDisabled('input#password')).toBeTruthy();
+    expect(elemDisabled('input#mutual_user')).toBeTruthy();
+    expect(elemDisabled('input#mutual_password')).toBeTruthy();
+    expect(elem('cd-submit-button')).toBeNull();
+  });
 });
index 4b8c1809ab138078c143432730b67641d63bdfb0..2060b81b8674ee09a0dab315e943f4bdb6c5b305 100644 (file)
@@ -8,6 +8,8 @@ import { IscsiService } from '../../../shared/api/iscsi.service';
 import { NotificationType } from '../../../shared/enum/notification-type.enum';
 import { CdFormGroup } from '../../../shared/forms/cd-form-group';
 import { CdValidators } from '../../../shared/forms/cd-validators';
+import { Permission } from '../../../shared/models/permissions';
+import { AuthStorageService } from '../../../shared/services/auth-storage.service';
 import { NotificationService } from '../../../shared/services/notification.service';
 
 @Component({
@@ -17,21 +19,36 @@ import { NotificationService } from '../../../shared/services/notification.servi
 })
 export class IscsiTargetDiscoveryModalComponent implements OnInit {
   discoveryForm: CdFormGroup;
+  permission: Permission;
+  hasPermission: boolean;
 
   USER_REGEX = /[\w\.:@_-]{8,64}/;
   PASSWORD_REGEX = /[\w@\-_\/]{12,16}/;
 
   constructor(
+    private authStorageService: AuthStorageService,
     public bsModalRef: BsModalRef,
     private iscsiService: IscsiService,
     private notificationService: NotificationService,
     private i18n: I18n
   ) {
+    this.permission = this.authStorageService.getPermissions().iscsi;
+  }
+
+  ngOnInit() {
+    this.hasPermission = this.permission.update;
+    this.createForm();
+    this.iscsiService.getDiscovery().subscribe((auth) => {
+      this.discoveryForm.patchValue(auth);
+    });
+  }
+
+  createForm() {
     this.discoveryForm = new CdFormGroup({
-      user: new FormControl(''),
-      password: new FormControl(''),
-      mutual_user: new FormControl(''),
-      mutual_password: new FormControl('')
+      user: new FormControl({ value: '', disabled: !this.hasPermission }),
+      password: new FormControl({ value: '', disabled: !this.hasPermission }),
+      mutual_user: new FormControl({ value: '', disabled: !this.hasPermission }),
+      mutual_password: new FormControl({ value: '', disabled: !this.hasPermission })
     });
 
     CdValidators.validateIf(
@@ -89,12 +106,6 @@ export class IscsiTargetDiscoveryModalComponent implements OnInit {
     );
   }
 
-  ngOnInit() {
-    this.iscsiService.getDiscovery().subscribe((auth) => {
-      this.discoveryForm.patchValue(auth);
-    });
-  }
-
   submitAction() {
     this.iscsiService.updateDiscovery(this.discoveryForm.value).subscribe(
       () => {
index aef54596c5f02705fad7887bcf7a47618adba5b6..084182df963ca801867a54502b0e0ca6a772ade3 100644 (file)
@@ -36,7 +36,7 @@
       <i class="fa fa-fw fa-key-modern"
          aria-hidden="true">
       </i>
-      <ng-container i18n>Set discovery authentication</ng-container>
+      <ng-container i18n>Discovery authentication</ng-container>
     </button>
   </div>
 
index 8a1f6be6909b4ecf0bbe0fe2285bf1bdd77c15a8..90434a0993af99e9c58d80c686b8f1efea372746 100644 (file)
         </context-group>
         <context-group purpose="location">
           <context context-type="sourcefile">app/ceph/block/iscsi-target-discovery-modal/iscsi-target-discovery-modal.component.html</context>
-          <context context-type="linenumber">135</context>
+          <context context-type="linenumber">136</context>
         </context-group>
         <context-group purpose="location">
           <context context-type="sourcefile">app/ceph/block/rbd-trash-purge-modal/rbd-trash-purge-modal.component.html</context>
         </context-group>
         <context-group purpose="location">
           <context context-type="sourcefile">app/ceph/block/iscsi-target-discovery-modal/iscsi-target-discovery-modal.component.html</context>
-          <context context-type="linenumber">133</context>
+          <context context-type="linenumber">134</context>
         </context-group>
         <context-group purpose="location">
           <context context-type="sourcefile">app/ceph/block/mirroring/pool-edit-peer-modal/pool-edit-peer-modal.component.html</context>
           <context context-type="sourcefile">app/ceph/block/iscsi-target-list/iscsi-target-list.component.html</context>
           <context context-type="linenumber">4</context>
         </context-group>
-      </trans-unit><trans-unit id="8f4c079a38df7c3b64a4dfe8daa4d02aeffefbfa" datatype="html">
-        <source>Set discovery authentication</source>
+      </trans-unit><trans-unit id="8414a5cb9d71cc1b21b10e4a9d1f2dad558f3361" datatype="html">
+        <source>Discovery authentication</source>
         <context-group purpose="location">
           <context context-type="sourcefile">app/ceph/block/iscsi-target-list/iscsi-target-list.component.html</context>
           <context context-type="linenumber">39</context>