From 7efe763ee984017d6a893cbbe6aaae46a4948e14 Mon Sep 17 00:00:00 2001 From: Neil MacDougall Date: Sun, 22 Sep 2019 22:36:15 +0100 Subject: [PATCH 01/18] E2E Test should run as user not admin (#3894) --- .../cloud-foundry/space-level/cf-space-level-e2e.spec.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/test-e2e/cloud-foundry/space-level/cf-space-level-e2e.spec.ts b/src/test-e2e/cloud-foundry/space-level/cf-space-level-e2e.spec.ts index ebe3690d44..36ef6c6792 100644 --- a/src/test-e2e/cloud-foundry/space-level/cf-space-level-e2e.spec.ts +++ b/src/test-e2e/cloud-foundry/space-level/cf-space-level-e2e.spec.ts @@ -129,8 +129,8 @@ describe('CF - Space Level -', () => { describe('As User -', () => { beforeAll(() => { - e2e.setup(ConsoleUserType.admin) - .loginAs(ConsoleUserType.admin); + e2e.setup(ConsoleUserType.user) + .loginAs(ConsoleUserType.user); }); describe('Basic Tests -', () => { From 8cd1aa667da4ad380a33de08f94502ceabfabd42 Mon Sep 17 00:00:00 2001 From: Neil MacDougall Date: Sun, 22 Sep 2019 23:46:32 +0100 Subject: [PATCH 02/18] Ensure stepper buttons are always visible and content scrolls (#3890) --- .../shared/components/stepper/steppers/steppers.component.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/frontend/packages/core/src/shared/components/stepper/steppers/steppers.component.scss b/src/frontend/packages/core/src/shared/components/stepper/steppers/steppers.component.scss index 82950c5d34..c899e137ca 100644 --- a/src/frontend/packages/core/src/shared/components/stepper/steppers/steppers.component.scss +++ b/src/frontend/packages/core/src/shared/components/stepper/steppers/steppers.component.scss @@ -59,7 +59,7 @@ } &__contents { display: flex; - flex: 1; + flex: 1 1 auto; height: 0; min-height: 160px; overflow-y: auto; From 7b8f2362f410cdcdefdaa10fe9392af1b7edfd98 Mon Sep 17 00:00:00 2001 From: Neil MacDougall Date: Mon, 23 Sep 2019 00:14:08 +0100 Subject: [PATCH 03/18] FIx setup detection for local users (#3888) --- .../repository/interfaces/structs.go | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/src/jetstream/repository/interfaces/structs.go b/src/jetstream/repository/interfaces/structs.go index 31d99dfb0d..70082958ba 100644 --- a/src/jetstream/repository/interfaces/structs.go +++ b/src/jetstream/repository/interfaces/structs.go @@ -255,8 +255,41 @@ type ConsoleConfig struct { UseSSO bool `json:"use_sso" configName:"SSO_LOGIN"` } +const defaultAdminScope = "stratos.admin" + // IsSetupComplete indicates if we have enough config func (consoleConfig *ConsoleConfig) IsSetupComplete() bool { + + // Local user - check setup complete + if AuthEndpointTypes[consoleConfig.AuthEndpointType] == Local { + + // Need LocalUser and LocalUserPassword + if len(consoleConfig.LocalUser) == 0 || len(consoleConfig.LocalUserPassword) == 0 { + return false + } + + // Also, we will make sure that admin scopes are set up for admin, if not specified + if len(consoleConfig.LocalUserScope) == 0 { + if len(consoleConfig.ConsoleAdminScope) == 0 { + // Neither set, so use default for both + consoleConfig.LocalUserScope = defaultAdminScope + consoleConfig.ConsoleAdminScope = defaultAdminScope + } else { + // admin scope set, so just use that + consoleConfig.LocalUserScope = consoleConfig.ConsoleAdminScope + } + } else { + if len(consoleConfig.ConsoleAdminScope) == 0 { + // Console admin scope not set, so use local user scope + consoleConfig.ConsoleAdminScope = consoleConfig.LocalUserScope + } + } + + // Setup is complete if we have LocalUser and LocalUserPassword set + return true + } + + // UAA - check setup complete for UAA if consoleConfig.UAAEndpoint == nil { return false } From 07aa1376c3cb9e3ef4a77039d00dcba0f6f8a92f Mon Sep 17 00:00:00 2001 From: Neil MacDougall Date: Mon, 23 Sep 2019 06:34:16 +0100 Subject: [PATCH 04/18] Add fix to wait until delete indicator has been removed (#3889) --- src/test-e2e/cloud-foundry/cf-level/manage-quota-e2e.spec.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/test-e2e/cloud-foundry/cf-level/manage-quota-e2e.spec.ts b/src/test-e2e/cloud-foundry/cf-level/manage-quota-e2e.spec.ts index c06c33d7d9..f9c62f5ce0 100644 --- a/src/test-e2e/cloud-foundry/cf-level/manage-quota-e2e.spec.ts +++ b/src/test-e2e/cloud-foundry/cf-level/manage-quota-e2e.spec.ts @@ -6,6 +6,7 @@ import { ConsoleUserType, E2EHelpers } from '../../helpers/e2e-helpers'; import { extendE2ETestTime } from '../../helpers/extend-test-helpers'; import { CfTopLevelPage } from './cf-top-level-page.po'; import { QuotaFormPage } from './quota-form-page.po'; +import { TableComponent } from '../../po/table.po'; describe('Manage Quota', () => { let e2eSetup; @@ -103,6 +104,9 @@ describe('Manage Quota', () => { it('- should not delete quota if attached to org', () => { expect(element(by.tagName('app-table')).getText()).toContain(quotaName); cfTopLevelPage.deleteQuota(quotaName, false); + // Wait until the delete operation has finished + const table = new TableComponent(); + table.waitUntilNotBusy(); expect(element(by.css('.table-row__error')).getText()).toContain('Please delete the organization associations'); }); }); From 39323bbe153cc24fe2f8c05a34d01d7f835585ea Mon Sep 17 00:00:00 2001 From: Neil MacDougall Date: Mon, 23 Sep 2019 08:12:01 +0100 Subject: [PATCH 05/18] Add support for view and edit profile for local user (#3883) * Add support for view and edit profile for local user * Fix required on profile edit --- .../edit-profile-info.component.html | 9 +- .../edit-profile-info.component.ts | 12 +- .../profile-info/profile-info.component.html | 20 ++- .../profile-info/profile-info.component.ts | 2 + .../user-profile-banner.component.html | 7 +- .../user-profile-banner.component.ts | 10 +- .../store/src/effects/user-profile.effects.ts | 6 +- src/jetstream/auth.go | 4 + .../20190918092300_LocalUsersUpdates.go | 33 ++++ src/jetstream/plugins/userinfo/local_user.go | 152 ++++++++++++++++++ src/jetstream/plugins/userinfo/main.go | 145 ++++++++++++++++- src/jetstream/plugins/userinfo/types.go | 40 +++++ .../userinfo/{user_info.go => uaa_user.go} | 75 ++++++--- .../repository/interfaces/localuser.go | 2 + .../repository/localusers/psql_localusers.go | 22 ++- src/jetstream/setup_console.go | 10 +- 16 files changed, 497 insertions(+), 52 deletions(-) create mode 100644 src/jetstream/datastore/20190918092300_LocalUsersUpdates.go create mode 100644 src/jetstream/plugins/userinfo/local_user.go create mode 100644 src/jetstream/plugins/userinfo/types.go rename src/jetstream/plugins/userinfo/{user_info.go => uaa_user.go} (57%) diff --git a/src/frontend/packages/core/src/features/user-profile/edit-profile-info/edit-profile-info.component.html b/src/frontend/packages/core/src/features/user-profile/edit-profile-info/edit-profile-info.component.html index f83ef80ba6..8377145582 100644 --- a/src/frontend/packages/core/src/features/user-profile/edit-profile-info/edit-profile-info.component.html +++ b/src/frontend/packages/core/src/features/user-profile/edit-profile-info/edit-profile-info.component.html @@ -19,13 +19,16 @@

Edit User Profile

-

Current password is required when changing email address

-

Current password is required when changing email address or password

- +

Current password is required when changing email address

+

Current password is required when changing email address or password

+

Change Password (Leave blank to keep current password)

+ + + diff --git a/src/frontend/packages/core/src/features/user-profile/edit-profile-info/edit-profile-info.component.ts b/src/frontend/packages/core/src/features/user-profile/edit-profile-info/edit-profile-info.component.ts index c05f60543f..d76fa89193 100644 --- a/src/frontend/packages/core/src/features/user-profile/edit-profile-info/edit-profile-info.component.ts +++ b/src/frontend/packages/core/src/features/user-profile/edit-profile-info/edit-profile-info.component.ts @@ -23,6 +23,8 @@ export class EditProfileInfoComponent implements OnInit, OnDestroy { editProfileForm: FormGroup; + needsPasswordForEmailChange: boolean; + constructor( private userProfileService: UserProfileService, private fb: FormBuilder, @@ -36,6 +38,8 @@ export class EditProfileInfoComponent implements OnInit, OnDestroy { newPassword: '', confirmPassword: '', }); + + this.needsPasswordForEmailChange = false; } private sub: Subscription; @@ -56,6 +60,9 @@ export class EditProfileInfoComponent implements OnInit, OnDestroy { ngOnInit() { this.userProfileService.fetchUserProfile(); this.userProfileService.userProfile$.pipe(first()).subscribe(profile => { + // UAA needs the user's password for email changes. Local user does not + // Both need it for password change + this.needsPasswordForEmailChange = (profile.origin === 'uaa'); this.profile = profile; this.emailAddress = this.userProfileService.getPrimaryEmailAddress(profile); this.editProfileForm.setValue({ @@ -76,7 +83,10 @@ export class EditProfileInfoComponent implements OnInit, OnDestroy { onChanges() { this.sub = this.editProfileForm.valueChanges.subscribe(values => { - const required = values.emailAddress !== this.emailAddress || values.newPassword.length; + // Old password is required if either email or new pw is specified (uaa) + // or only if new pw is specified (local account) + const required = this.needsPasswordForEmailChange ? + values.emailAddress !== this.emailAddress || values.newPassword.length : values.newPassword.length; this.passwordRequired = !!required; if (required !== this.lastRequired) { this.lastRequired = required; diff --git a/src/frontend/packages/core/src/features/user-profile/profile-info/profile-info.component.html b/src/frontend/packages/core/src/features/user-profile/profile-info/profile-info.component.html index b949cbccb2..92ae47a731 100644 --- a/src/frontend/packages/core/src/features/user-profile/profile-info/profile-info.component.html +++ b/src/frontend/packages/core/src/features/user-profile/profile-info/profile-info.component.html @@ -12,7 +12,7 @@

User Profile

text: '' }"> + name="{{ profile.name.givenName }} {{ profile.name.familyName }}" email="{{ primaryEmailAddress$ | async }}" username="{{ profile.userName }}">