[ADF-3191] Fix userprefrence oauth2 (#3488)

* remove user preference setting save

* fix host setting test

* remove userPreferences test

* fix title service test

* remove unused imports

* restore input align

* fix service import in test tag rating
This commit is contained in:
Eugenio Romano
2018-06-15 08:32:16 +01:00
committed by GitHub
parent af2cde0791
commit 8966e22487
43 changed files with 417 additions and 528 deletions

View File

@@ -21,7 +21,7 @@ import { AuthenticationService } from '../services/authentication.service';
import { BpmProductVersionModel, EcmProductVersionModel } from '../models/product-version.model';
import { DiscoveryApiService } from '../services/discovery-api.service';
import { ObjectDataTableAdapter } from '../datatable/data/object-datatable-adapter';
import { UserPreferencesService } from '../services/user-preferences.service';
import { AppConfigService, AppConfigValues } from '../app-config/app-config.service';
@Component({
selector: 'adf-about',
@@ -44,7 +44,7 @@ export class AboutComponent implements OnInit {
bpmVersion: BpmProductVersionModel = null;
constructor(private http: Http,
private userPreference: UserPreferencesService,
private appConfig: AppConfigService,
private authService: AuthenticationService,
private discovery: DiscoveryApiService) {
}
@@ -114,8 +114,8 @@ export class AboutComponent implements OnInit {
});
this.ecmHost = this.userPreference.ecmHost;
this.bpmHost = this.userPreference.bpmHost;
this.ecmHost = this.appConfig.get<string>(AppConfigValues.ECMHOST);
this.bpmHost = this.appConfig.get<string>(AppConfigValues.BPMHOST);
}
private gitHubLinkCreation(alfrescoPackagesTableRepresentation): void {

View File

@@ -21,11 +21,24 @@ import { ObjectUtils } from '../utils/object-utils';
import { BehaviorSubject } from 'rxjs/BehaviorSubject';
import { Observable } from 'rxjs/Observable';
export enum AppConfigValues {
APP_CONFIG_LANGUAGES_KEY = 'languages',
PROVIDERS = 'providers',
OAUTHCONFIG = 'oauth2',
ECMHOST = 'ecmHost',
BPMHOST = 'bpmHost',
AUTHTYPE = 'authType',
CONTEXTROOTECM = 'contextRootEcm',
CONTEXTROOTBPM = 'contextRootBpm',
ALFRESCO_REPOSITORY_NAME = 'alfrescoRepositoryName',
LOG_LEVEL = 'logLevel',
LOGIN_ROUTE = 'loginRoute',
DISABLECSRF = 'disableCSRF'
}
@Injectable()
export class AppConfigService {
static APP_CONFIG_LANGUAGES_KEY = 'languages';
config: any = {
application: {
name: 'Alfresco ADF Application'

View File

@@ -0,0 +1,37 @@
/*!
* @license
* Copyright 2016 Alfresco Software, Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { StorageService } from '../services/storage.service';
import { AppConfigService, AppConfigValues } from '../app-config/app-config.service';
@Injectable()
export class DebugAppConfigService extends AppConfigService {
constructor(private storage: StorageService, http: HttpClient) {
super(http);
}
/** @override */
get<T>(key: string, defaultValue?: T): T {
if (key === AppConfigValues.OAUTHCONFIG) {
return <T> (JSON.parse(this.storage.getItem(key)) || super.get<T>(key, defaultValue));
} else {
return <T> (<any> this.storage.getItem(key) || super.get<T>(key, defaultValue));
}
}
}

View File

@@ -16,6 +16,7 @@
*/
export * from './app-config.service';
export * from './debug-app-config.service';
export * from './app-config.pipe';
export * from './app-config.module';

View File

@@ -273,10 +273,19 @@
"description": "BPM host",
"type": "string"
},
"providers": {
"description": "This parameter can accept as value ECM BPM or ALL you can set it accordingly where you want log-in",
"type": "string",
"enum": [ "ECM", "BPM", "ALL"]
},
"contextRootBpm": {
"description": "The context root of the BPM host",
"type": "string"
},
"disableCSRF": {
"description": "The context root of the BPM host",
"type": "boolean"
},
"application": {
"description": "Application's global configuration",
"type": "object",
@@ -460,7 +469,8 @@
},
"authType": {
"description": "Kind of authentication BASIC or OAUTH, default value BASIC",
"type": "string"
"type": "string",
"enum": [ "BASIC", "OAUTH" ]
},
"oauth2": {
"description": "AUTH configuration parameters",

View File

@@ -16,12 +16,11 @@
*/
import { SimpleChange } from '@angular/core';
import { fakeAsync, tick, TestBed } from '@angular/core/testing';
import { fakeAsync, tick } from '@angular/core/testing';
import { NodeFavoriteDirective } from './node-favorite.directive';
import { AlfrescoApiServiceMock } from '../mock/alfresco-api.service.mock';
import { AppConfigService } from '../app-config/app-config.service';
import { StorageService } from '../services/storage.service';
import { UserPreferencesService } from '../services/user-preferences.service';
import { setupTestBed } from '../testing/setupTestBed';
import { CoreTestingModule } from '../testing/core.testing.module';
@@ -29,15 +28,13 @@ describe('NodeFavoriteDirective', () => {
let directive;
let alfrescoApiService;
let userPreferences;
setupTestBed({
imports: [CoreTestingModule]
});
beforeEach(() => {
userPreferences = TestBed.get(UserPreferencesService);
alfrescoApiService = new AlfrescoApiServiceMock(new AppConfigService(null), userPreferences, new StorageService());
alfrescoApiService = new AlfrescoApiServiceMock(new AppConfigService(null), new StorageService());
directive = new NodeFavoriteDirective( alfrescoApiService);
});

View File

@@ -122,7 +122,6 @@
"BASIC": "Basic Auth",
"SSO": "SSO",
"IMPLICIT-FLOW": "implicitFlow",
"TYPE-AUTH": "Authentication type",
"PROVIDER": "Provider",
"REQUIRED": "The field is required",
"CS_URL_ERROR": "Content Services address doesn't match the URL format",

View File

@@ -16,7 +16,7 @@
*/
import { Component, OnInit } from '@angular/core';
import { AppConfigService } from '../app-config/app-config.service';
import { AppConfigService, AppConfigValues } from '../app-config/app-config.service';
import { UserPreferencesService } from '../services/user-preferences.service';
@Component({
@@ -35,7 +35,7 @@ export class LanguageMenuComponent implements OnInit {
}
ngOnInit() {
const languagesCongifApp = this.appConfig.get<Array<any>>(AppConfigService.APP_CONFIG_LANGUAGES_KEY);
const languagesCongifApp = this.appConfig.get<Array<any>>(AppConfigValues.APP_CONFIG_LANGUAGES_KEY);
if (languagesCongifApp) {
this.languages = languagesCongifApp;
}

View File

@@ -20,12 +20,14 @@ import { Validators } from '@angular/forms';
import { Router } from '@angular/router';
import { UserPreferencesService } from '../../services/user-preferences.service';
import { AppConfigService } from '../../app-config/app-config.service';
import { AuthenticationService } from '../../services/authentication.service';
import { LoginErrorEvent } from '../models/login-error.event';
import { LoginSuccessEvent } from '../models/login-success.event';
import { LoginComponent } from './login.component';
import { Observable } from 'rxjs/Observable';
import { OauthConfigModel } from '../../models/oauth-config.model';
import { AlfrescoApiService } from '../../services/alfresco-api.service';
import { setupTestBed } from '../../testing/setupTestBed';
import { CoreTestingModule } from '../../testing/core.testing.module';
@@ -37,6 +39,8 @@ describe('LoginComponent', () => {
let authService: AuthenticationService;
let router: Router;
let userPreferences: UserPreferencesService;
let appConfigService: AppConfigService;
let alfrescoApiService: AlfrescoApiService;
let usernameInput, passwordInput;
@@ -70,6 +74,8 @@ describe('LoginComponent', () => {
authService = TestBed.get(AuthenticationService);
router = TestBed.get(Router);
userPreferences = TestBed.get(UserPreferencesService);
appConfigService = TestBed.get(AppConfigService);
alfrescoApiService = TestBed.get(AlfrescoApiService);
fixture.detectChanges();
@@ -577,11 +583,9 @@ describe('LoginComponent', () => {
describe('SSO', () => {
beforeEach(() => {
userPreferences.oauthConfig = <OauthConfigModel> { implicitFlow: true };
});
afterEach(() => {
userPreferences.oauthConfig = null;
appConfigService.config.oauth2 = <OauthConfigModel> { implicitFlow: true };
appConfigService.load();
alfrescoApiService.reset();
});
it('should not show login username and password if SSO implicit flow is active', async(() => {
@@ -590,29 +594,34 @@ describe('LoginComponent', () => {
component.ngOnInit();
fixture.detectChanges();
expect(element.querySelector('#username')).toBeNull();
expect(element.querySelector('#password')).toBeNull();
fixture.detectChanges();
fixture.whenStable().then(() => {
expect(element.querySelector('#username')).toBeNull();
expect(element.querySelector('#password')).toBeNull();
});
}));
it('should not show the login base auth button', async(() => {
spyOn(authService, 'isOauth').and.returnValue(true);
userPreferences.oauthConfig = <OauthConfigModel> { implicitFlow: true };
component.ngOnInit();
fixture.detectChanges();
expect(element.querySelector('#login-button')).toBeNull();
fixture.whenStable().then(() => {
expect(element.querySelector('#login-button')).toBeNull();
});
}));
it('should show the login SSO button', async(() => {
spyOn(authService, 'isOauth').and.returnValue(true);
userPreferences.oauthConfig = <OauthConfigModel> { implicitFlow: true };
component.ngOnInit();
fixture.detectChanges();
expect(element.querySelector('#login-button-sso')).toBeDefined();
fixture.whenStable().then(() => {
expect(element.querySelector('#login-button-sso')).toBeDefined();
});
}));
});

View File

@@ -15,9 +15,8 @@
* limitations under the License.
*/
import {
Component, ElementRef, EventEmitter, Input, OnInit,
Output, TemplateRef, ViewEncapsulation
import { Component, ElementRef, EventEmitter,
Input, OnInit, Output, TemplateRef, ViewEncapsulation
} from '@angular/core';
import { AbstractControl, FormBuilder, FormGroup, Validators } from '@angular/forms';
import { Router } from '@angular/router';
@@ -30,6 +29,11 @@ import { UserPreferencesService } from '../../services/user-preferences.service'
import { LoginErrorEvent } from '../models/login-error.event';
import { LoginSubmitEvent } from '../models/login-submit.event';
import { LoginSuccessEvent } from '../models/login-success.event';
import {
AppConfigService,
AppConfigValues
} from '../../app-config/app-config.service';
import { OauthConfigModel } from '../../models/oauth-config.model';
enum LoginSteps {
Landing = 0,
@@ -43,12 +47,11 @@ enum LoginSteps {
styleUrls: ['./login.component.scss'],
encapsulation: ViewEncapsulation.None,
host: {
'class': 'adf-login',
class: 'adf-login',
'(blur)': 'onBlur($event)'
}
})
export class LoginComponent implements OnInit {
isPasswordShow: boolean = false;
/**
@@ -136,25 +139,29 @@ export class LoginComponent implements OnInit {
* @param authService
* @param translate
*/
constructor(private _fb: FormBuilder,
private authService: AuthenticationService,
private translateService: TranslationService,
private logService: LogService,
private elementRef: ElementRef,
private router: Router,
private userPreferences: UserPreferencesService) {
constructor(
private _fb: FormBuilder,
private authService: AuthenticationService,
private translateService: TranslationService,
private logService: LogService,
private elementRef: ElementRef,
private router: Router,
private appConfig: AppConfigService,
private userPreferences: UserPreferencesService
) {
this.initFormError();
this.initFormFieldsMessages();
}
ngOnInit() {
if (this.authService.isOauth()) {
if (this.userPreferences.oauthConfig && this.userPreferences.oauthConfig.implicitFlow) {
let oauth: OauthConfigModel = this.appConfig.get<OauthConfigModel>(AppConfigValues.OAUTHCONFIG, null);
if (oauth && oauth.implicitFlow) {
this.implicitFlow = true;
}
}
if (this.hasCustomFiledsValidation()) {
if (this.hasCustomFieldsValidation()) {
this.form = this._fb.group(this.fieldsValidation);
} else {
this.initFormFieldsDefault();
@@ -170,11 +177,13 @@ export class LoginComponent implements OnInit {
*/
onSubmit(values: any) {
if (this.disableCsrf !== null && this.disableCsrf !== undefined) {
this.userPreferences.disableCSRF = this.disableCsrf;
this.appConfig.get<boolean>(AppConfigValues.DISABLECSRF);
}
this.disableError();
const args = new LoginSubmitEvent({ controls: { username: this.form.controls.username } });
const args = new LoginSubmitEvent({
controls: { username: this.form.controls.username }
});
this.executeSubmit.emit(args);
if (args.defaultPrevented) {
@@ -185,7 +194,7 @@ export class LoginComponent implements OnInit {
}
implicitLogin() {
this.authService.ssoImplictiLogin();
this.authService.ssoImplicitLogin();
}
/**
@@ -197,12 +206,15 @@ export class LoginComponent implements OnInit {
for (let field in this.formError) {
if (field) {
this.formError[field] = '';
let hasError = (this.form.controls[field].errors && data[field] !== '') ||
(this.form.controls[field].dirty && !this.form.controls[field].valid);
let hasError =
(this.form.controls[field].errors && data[field] !== '') ||
(this.form.controls[field].dirty &&
!this.form.controls[field].valid);
if (hasError) {
for (let key in this.form.controls[field].errors) {
if (key) {
this.formError[field] += this._message[field][key] + '';
this.formError[field] +=
this._message[field][key] + '';
}
}
}
@@ -216,15 +228,20 @@ export class LoginComponent implements OnInit {
*/
private performLogin(values: any) {
this.actualLoginStep = LoginSteps.Checking;
this.authService.login(values.username, values.password, this.rememberMe)
this.authService
.login(values.username, values.password, this.rememberMe)
.subscribe(
(token: any) => {
const redirectUrl = this.authService.getRedirect(this.providers);
const redirectUrl = this.authService.getRedirect(
this.providers
);
this.actualLoginStep = LoginSteps.Welcome;
this.userPreferences.setStoragePrefix(values.username);
values.password = null;
this.success.emit(new LoginSuccessEvent(token, values.username, null));
this.success.emit(
new LoginSuccessEvent(token, values.username, null)
);
if (redirectUrl) {
this.authService.setRedirect(null);
@@ -247,16 +264,25 @@ export class LoginComponent implements OnInit {
* Check and display the right error message in the UI
*/
private displayErrorMessage(err: any): void {
if (err.error && err.error.crossDomain && err.error.message.indexOf('Access-Control-Allow-Origin') !== -1) {
if (
err.error &&
err.error.crossDomain &&
err.error.message.indexOf('Access-Control-Allow-Origin') !== -1
) {
this.errorMsg = err.error.message;
} else if (err.status === 403 && err.message.indexOf('Invalid CSRF-token') !== -1) {
} else if (
err.status === 403 &&
err.message.indexOf('Invalid CSRF-token') !== -1
) {
this.errorMsg = 'LOGIN.MESSAGES.LOGIN-ERROR-CSRF';
} else if (err.status === 403 && err.message.indexOf('The system is currently in read-only mode') !== -1) {
} else if (
err.status === 403 &&
err.message.indexOf('The system is currently in read-only mode') !==
-1
) {
this.errorMsg = 'LOGIN.MESSAGES.LOGIN-ECM-LICENSE';
} else {
this.errorMsg = 'LOGIN.MESSAGES.LOGIN-ERROR-CREDENTIALS';
}
}
@@ -275,7 +301,12 @@ export class LoginComponent implements OnInit {
* @param ruleId - i.e. required | minlength | maxlength
* @param msg
*/
addCustomValidationError(field: string, ruleId: string, msg: string, params?: any) {
addCustomValidationError(
field: string,
ruleId: string,
msg: string,
params?: any
) {
if (params) {
this.translateService.get(msg, params).subscribe((res: string) => {
this._message[field][ruleId] = res;
@@ -290,7 +321,10 @@ export class LoginComponent implements OnInit {
*/
toggleShowPassword() {
this.isPasswordShow = !this.isPasswordShow;
this.elementRef.nativeElement.querySelector('#password').type = this.isPasswordShow ? 'text' : 'password';
this.elementRef.nativeElement.querySelector('#password').type = this
.isPasswordShow
? 'text'
: 'password';
}
/**
@@ -313,8 +347,8 @@ export class LoginComponent implements OnInit {
*/
private initFormError() {
this.formError = {
'username': '',
'password': ''
username: '',
password: ''
};
}
@@ -323,8 +357,8 @@ export class LoginComponent implements OnInit {
*/
private initFormFieldsMessages() {
this._message = {
'username': {},
'password': {}
username: {},
password: {}
};
}
@@ -333,17 +367,19 @@ export class LoginComponent implements OnInit {
*/
private initFormFieldsMessagesDefault() {
this._message = {
'username': {
'required': 'LOGIN.MESSAGES.USERNAME-REQUIRED'
username: {
required: 'LOGIN.MESSAGES.USERNAME-REQUIRED'
},
'password': {
'required': 'LOGIN.MESSAGES.PASSWORD-REQUIRED'
password: {
required: 'LOGIN.MESSAGES.PASSWORD-REQUIRED'
}
};
this.translateService.get('LOGIN.MESSAGES.USERNAME-MIN', { minLength: this.minLength }).subscribe((res: string) => {
this._message['username']['minlength'] = res;
});
this.translateService
.get('LOGIN.MESSAGES.USERNAME-MIN', { minLength: this.minLength })
.subscribe((res: string) => {
this._message['username']['minlength'] = res;
});
}
private initFormFieldsDefault() {
@@ -368,7 +404,7 @@ export class LoginComponent implements OnInit {
this.isError = true;
}
private hasCustomFiledsValidation(): boolean {
private hasCustomFieldsValidation(): boolean {
return this.fieldsValidation !== undefined;
}
}

View File

@@ -19,16 +19,14 @@ import { Injectable } from '@angular/core';
import { AppConfigService } from '../app-config/app-config.service';
import { StorageService } from '../services/storage.service';
import { AlfrescoApiService } from '../services/alfresco-api.service';
import { UserPreferencesService } from '../services/user-preferences.service';
/* tslint:disable:adf-file-name */
@Injectable()
export class AlfrescoApiServiceMock extends AlfrescoApiService {
constructor(protected appConfig: AppConfigService,
protected userPreference: UserPreferencesService,
protected storage: StorageService) {
super(appConfig, userPreference, storage);
super(appConfig, storage);
if (!this.alfrescoApi) {
this.initAlfrescoApi();
}

View File

@@ -18,7 +18,6 @@
import { Injectable } from '@angular/core';
import { AppConfigService } from '../app-config/app-config.service';
import { HttpClient } from '@angular/common/http';
@Injectable()
export class AppConfigServiceMock extends AppConfigService {

View File

@@ -17,22 +17,30 @@
import { Injectable } from '@angular/core';
import {
AlfrescoApi, ContentApi, FavoritesApi, NodesApi,
PeopleApi, RenditionsApi, SharedlinksApi, SitesApi,
VersionsApi, ClassesApi, SearchApi, GroupsApi, MinimalNodeEntryEntity
AlfrescoApi,
ContentApi,
FavoritesApi,
NodesApi,
PeopleApi,
RenditionsApi,
SharedlinksApi,
SitesApi,
VersionsApi,
ClassesApi,
SearchApi,
GroupsApi,
MinimalNodeEntryEntity
} from 'alfresco-js-api';
import * as alfrescoApi from 'alfresco-js-api';
import { AppConfigService } from '../app-config/app-config.service';
import { AppConfigService, AppConfigValues } from '../app-config/app-config.service';
import { StorageService } from './storage.service';
import { Subject } from 'rxjs/Subject';
import { UserPreferencesService, UserPreferenceValues } from './user-preferences.service';
import { merge } from 'rxjs/observable/merge';
import { OauthConfigModel } from '../models/oauth-config.model';
/* tslint:disable:adf-file-name */
@Injectable()
export class AlfrescoApiService {
/**
* Publish/subscribe to events related to node updates.
*/
@@ -96,19 +104,7 @@ export class AlfrescoApiService {
return this.getInstance().core.groupsApi;
}
constructor(protected appConfig: AppConfigService,
protected userPreferencesService: UserPreferencesService,
protected storage: StorageService) {
merge(this.userPreferencesService.select(UserPreferenceValues.oauthConfig),
this.userPreferencesService.select(UserPreferenceValues.ecmHost),
this.userPreferencesService.select(UserPreferenceValues.bpmHost),
this.userPreferencesService.select(UserPreferenceValues.authType),
this.userPreferencesService.select(UserPreferenceValues.providers)).subscribe(() => {
this.reset();
});
}
constructor(protected appConfig: AppConfigService, protected storage: StorageService) {}
async load() {
await this.appConfig.load().then(() => {
@@ -121,21 +117,22 @@ export class AlfrescoApiService {
}
protected initAlfrescoApi() {
let oauth;
if (this.userPreferencesService.oauthConfig) {
oauth = Object.assign({}, this.userPreferencesService.oauthConfig);
let oauth: OauthConfigModel = this.appConfig.get<OauthConfigModel>(AppConfigValues.OAUTHCONFIG, null);
if (oauth) {
oauth.redirectUri = window.location.origin + (oauth.redirectUri || '/');
oauth.redirectUriLogout = window.location.origin + (oauth.redirectUriLogout || '/');
}
const config = {
provider: this.userPreferencesService.providers,
provider: this.appConfig.get<string>(AppConfigValues.PROVIDERS),
ticketEcm: this.storage.getItem('ticket-ECM'),
ticketBpm: this.storage.getItem('ticket-BPM'),
hostEcm: this.userPreferencesService.ecmHost,
hostBpm: this.userPreferencesService.bpmHost,
authType: this.userPreferencesService.authType,
contextRootBpm: this.appConfig.get<string>('contextRootBpm'),
contextRoot: this.appConfig.get<string>('contextRootEcm'),
hostEcm: this.appConfig.get<string>(AppConfigValues.ECMHOST),
hostBpm: this.appConfig.get<string>(AppConfigValues.BPMHOST),
authType: this.appConfig.get<string>(AppConfigValues.AUTHTYPE),
contextRootBpm: this.appConfig.get<string>(AppConfigValues.CONTEXTROOTBPM),
contextRoot: this.appConfig.get<string>(AppConfigValues.CONTEXTROOTECM),
disableCsrf: this.storage.getItem('DISABLE_CSRF') === 'true',
oauth2: oauth
};

View File

@@ -16,20 +16,14 @@
*/
import { Injectable } from '@angular/core';
import {
ActivatedRouteSnapshot, CanActivate, CanActivateChild, RouterStateSnapshot,
Router
} from '@angular/router';
import { AppConfigService } from '../app-config/app-config.service';
import { ActivatedRouteSnapshot, CanActivate, CanActivateChild, RouterStateSnapshot, Router } from '@angular/router';
import { AppConfigService, AppConfigValues } from '../app-config/app-config.service';
import { AuthenticationService } from './authentication.service';
import { UserPreferencesService } from './user-preferences.service';
import { OauthConfigModel } from '../models/oauth-config.model';
@Injectable()
export class AuthGuardBpm implements CanActivate, CanActivateChild {
constructor(private authService: AuthenticationService,
private router: Router,
private userPreference: UserPreferencesService,
private appConfig: AppConfigService) {}
constructor(private authService: AuthenticationService, private router: Router, private appConfig: AppConfigService) {}
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean {
return this.checkLogin(state.url);
@@ -44,7 +38,7 @@ export class AuthGuardBpm implements CanActivate, CanActivateChild {
return true;
}
if (!this.authService.isOauth() || this.isOAuthWithoutSilentLogin() ) {
if (!this.authService.isOauth() || this.isOAuthWithoutSilentLogin()) {
this.authService.setRedirect({ provider: 'BPM', url: redirectUrl });
const pathToLogin = this.getRouteDestinationForLogin();
this.router.navigate(['/' + pathToLogin]);
@@ -54,12 +48,11 @@ export class AuthGuardBpm implements CanActivate, CanActivateChild {
}
isOAuthWithoutSilentLogin() {
return this.authService.isOauth() && this.userPreference.oauthConfig.silentLogin === false;
let oauth: OauthConfigModel = this.appConfig.get<OauthConfigModel>(AppConfigValues.OAUTHCONFIG, null);
return this.authService.isOauth() && oauth.silentLogin === false;
}
private getRouteDestinationForLogin(): string {
return this.appConfig &&
this.appConfig.get<string>('loginRoute') ?
this.appConfig.get<string>('loginRoute') : 'login';
return this.appConfig && this.appConfig.get<string>(AppConfigValues.LOGIN_ROUTE) ? this.appConfig.get<string>(AppConfigValues.LOGIN_ROUTE) : 'login';
}
}

View File

@@ -20,14 +20,14 @@ import {
ActivatedRouteSnapshot, CanActivate, RouterStateSnapshot, Router
} from '@angular/router';
import { AuthenticationService } from './authentication.service';
import { AppConfigService } from '../app-config/app-config.service';
import { AppConfigService, AppConfigValues } from '../app-config/app-config.service';
import { OauthConfigModel } from '../models/oauth-config.model';
@Injectable()
export class AuthGuardEcm implements CanActivate {
constructor(
private authService: AuthenticationService,
private router: Router,
private appConfig: AppConfigService) {
constructor(private authService: AuthenticationService,
private router: Router,
private appConfig: AppConfigService) {
}
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean {
@@ -43,16 +43,23 @@ export class AuthGuardEcm implements CanActivate {
return true;
}
this.authService.setRedirect({ provider: 'ECM', url: redirectUrl });
const pathToLogin = this.getRouteDestinationForLogin();
this.router.navigate(['/' + pathToLogin]);
if (!this.authService.isOauth() || this.isOAuthWithoutSilentLogin()) {
this.authService.setRedirect({ provider: 'ECM', url: redirectUrl });
const pathToLogin = this.getRouteDestinationForLogin();
this.router.navigate(['/' + pathToLogin]);
}
return false;
}
isOAuthWithoutSilentLogin() {
let oauth: OauthConfigModel = this.appConfig.get<OauthConfigModel>(AppConfigValues.OAUTHCONFIG, null);
return this.authService.isOauth() && oauth.silentLogin === false;
}
private getRouteDestinationForLogin(): string {
return this.appConfig &&
this.appConfig.get<string>('loginRoute') ?
this.appConfig.get<string>('loginRoute') : 'login';
this.appConfig.get<string>(AppConfigValues.LOGIN_ROUTE) ?
this.appConfig.get<string>(AppConfigValues.LOGIN_ROUTE) : 'login';
}
}

View File

@@ -17,20 +17,20 @@
import { Injectable } from '@angular/core';
import {
ActivatedRouteSnapshot, CanActivate,
CanActivateChild, RouterStateSnapshot, Router
ActivatedRouteSnapshot, CanActivate,
CanActivateChild, RouterStateSnapshot, Router
} from '@angular/router';
import { AuthenticationService } from './authentication.service';
import { Observable } from 'rxjs/Observable';
import { AppConfigService } from '../app-config/app-config.service';
import { UserPreferencesService } from './user-preferences.service';
import { AppConfigService, AppConfigValues } from '../app-config/app-config.service';
import { OauthConfigModel } from '../models/oauth-config.model';
@Injectable()
export class AuthGuard implements CanActivate, CanActivateChild {
constructor(private authService: AuthenticationService,
private router: Router,
private userPreference: UserPreferencesService,
private appConfig: AppConfigService) {}
private appConfig: AppConfigService) {
}
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean | Observable<boolean> {
const redirectUrl = state.url;
@@ -45,8 +45,8 @@ export class AuthGuard implements CanActivate, CanActivateChild {
if (this.authService.isLoggedIn()) {
return true;
}
if (!this.authService.isOauth() || this.isOAuthWithoutSilentLogin() ) {
this.authService.setRedirect({ provider: 'ALL', url: redirectUrl } );
if (!this.authService.isOauth() || this.isOAuthWithoutSilentLogin()) {
this.authService.setRedirect({ provider: 'ALL', url: redirectUrl });
const pathToLogin = this.getRouteDestinationForLogin();
this.router.navigate(['/' + pathToLogin]);
@@ -56,12 +56,13 @@ export class AuthGuard implements CanActivate, CanActivateChild {
}
isOAuthWithoutSilentLogin() {
return this.authService.isOauth() && this.userPreference.oauthConfig.silentLogin === false;
let oauth: OauthConfigModel = this.appConfig.get<OauthConfigModel>(AppConfigValues.OAUTHCONFIG, null);
return this.authService.isOauth() && oauth.silentLogin === false;
}
public getRouteDestinationForLogin(): string {
return this.appConfig &&
this.appConfig.get<string>('loginRoute') ?
this.appConfig.get<string>('loginRoute') : 'login';
this.appConfig.get<string>(AppConfigValues.LOGIN_ROUTE) ?
this.appConfig.get<string>(AppConfigValues.LOGIN_ROUTE) : 'login';
}
}

View File

@@ -20,7 +20,7 @@ import { AlfrescoApiService } from './alfresco-api.service';
import { AuthenticationService } from './authentication.service';
import { CookieService } from './cookie.service';
import { StorageService } from './storage.service';
import { UserPreferencesService } from './user-preferences.service';
import { AppConfigService } from '../app-config/app-config.service';
import { setupTestBed } from '../testing/setupTestBed';
import { CoreTestingModule } from '../testing/core.testing.module';
@@ -29,7 +29,7 @@ declare let jasmine: any;
describe('AuthenticationService', () => {
let apiService: AlfrescoApiService;
let authService: AuthenticationService;
let preferences: UserPreferencesService;
let appConfigService: AppConfigService;
let storage: StorageService;
let cookie: CookieService;
@@ -40,7 +40,6 @@ describe('AuthenticationService', () => {
beforeEach(() => {
apiService = TestBed.get(AlfrescoApiService);
authService = TestBed.get(AuthenticationService);
preferences = TestBed.get(UserPreferencesService);
cookie = TestBed.get(CookieService);
cookie.clear();
@@ -60,7 +59,9 @@ describe('AuthenticationService', () => {
describe('remember me', () => {
beforeEach(() => {
preferences.providers = 'ECM';
appConfigService = TestBed.get(AppConfigService);
appConfigService.config.providers = 'ECM';
appConfigService.load();
apiService.reset();
});
@@ -124,7 +125,8 @@ describe('AuthenticationService', () => {
describe('when the setting is ECM', () => {
beforeEach(() => {
preferences.providers = 'ECM';
appConfigService.config.providers = 'ECM';
appConfigService.load();
apiService.reset();
});
@@ -276,26 +278,27 @@ describe('AuthenticationService', () => {
it('[ECM] should set/get redirectUrl when provider is ECM', () => {
authService.setRedirect({ provider: 'ECM', url: 'some-url' });
expect(authService.getRedirect(preferences.providers)).toEqual('some-url');
expect(authService.getRedirect(appConfigService.config.providers)).toEqual('some-url');
});
it('[ECM] should set/get redirectUrl when provider is BPM', () => {
authService.setRedirect({ provider: 'BPM', url: 'some-url' });
expect(authService.getRedirect(preferences.providers)).toBeNull();
expect(authService.getRedirect(appConfigService.config.providers)).toBeNull();
});
it('[ECM] should return null as redirectUrl when redirectUrl field is not set', () => {
authService.setRedirect(null);
expect(authService.getRedirect(preferences.providers)).toBeNull();
expect(authService.getRedirect(appConfigService.config.providers)).toBeNull();
});
});
describe('when the setting is BPM', () => {
beforeEach(() => {
preferences.providers = 'BPM';
appConfigService.config.providers = 'BPM';
appConfigService.load();
apiService.reset();
});
@@ -429,26 +432,27 @@ describe('AuthenticationService', () => {
it('[BPM] should set/get redirectUrl when provider is BPM', () => {
authService.setRedirect({ provider: 'BPM', url: 'some-url' });
expect(authService.getRedirect(preferences.providers)).toEqual('some-url');
expect(authService.getRedirect(appConfigService.config.providers)).toEqual('some-url');
});
it('[BPM] should set/get redirectUrl when provider is ECM', () => {
authService.setRedirect({ provider: 'ECM', url: 'some-url' });
expect(authService.getRedirect(preferences.providers)).toBeNull();
expect(authService.getRedirect(appConfigService.config.providers)).toBeNull();
});
it('[BPM] should return null as redirectUrl when redirectUrl field is not set', () => {
authService.setRedirect(null);
expect(authService.getRedirect(preferences.providers)).toBeNull();
expect(authService.getRedirect(appConfigService.config.providers)).toBeNull();
});
});
describe('when the setting is both ECM and BPM ', () => {
beforeEach(() => {
preferences.providers = 'ALL';
appConfigService.config.providers = 'ALL';
appConfigService.load();
apiService.reset();
});
@@ -546,25 +550,25 @@ describe('AuthenticationService', () => {
it('[ALL] should set/get redirectUrl when provider is ALL', () => {
authService.setRedirect({ provider: 'ALL', url: 'some-url' });
expect(authService.getRedirect(preferences.providers)).toEqual('some-url');
expect(authService.getRedirect(appConfigService.config.providers)).toEqual('some-url');
});
it('[ALL] should set/get redirectUrl when provider is BPM', () => {
authService.setRedirect({ provider: 'BPM', url: 'some-url' });
expect(authService.getRedirect(preferences.providers)).toEqual('some-url');
expect(authService.getRedirect(appConfigService.config.providers)).toEqual('some-url');
});
it('[ALL] should set/get redirectUrl when provider is ECM', () => {
authService.setRedirect({ provider: 'ECM', url: 'some-url' });
expect(authService.getRedirect(preferences.providers)).toEqual('some-url');
expect(authService.getRedirect(appConfigService.config.providers)).toEqual('some-url');
});
it('[ALL] should return null as redirectUrl when redirectUrl field is not set', () => {
authService.setRedirect(null);
expect(authService.getRedirect(preferences.providers)).toBeNull();
expect(authService.getRedirect(appConfigService.config.providers)).toBeNull();
});
});

View File

@@ -22,11 +22,11 @@ import { AlfrescoApiService } from './alfresco-api.service';
import { CookieService } from './cookie.service';
import { LogService } from './log.service';
import { StorageService } from './storage.service';
import { UserPreferencesService } from './user-preferences.service';
import 'rxjs/add/observable/fromPromise';
import 'rxjs/add/operator/catch';
import 'rxjs/add/observable/throw';
import { RedirectionModel } from '../models/redirection.model';
import { AppConfigService, AppConfigValues } from '../app-config/app-config.service';
const REMEMBER_ME_COOKIE_KEY = 'ALFRESCO_REMEMBER_ME';
const REMEMBER_ME_UNTIL = 1000 * 60 * 60 * 24 * 30 ;
@@ -39,7 +39,7 @@ export class AuthenticationService {
onLogout: Subject<any> = new Subject<any>();
constructor(
private preferences: UserPreferencesService,
private appConfig: AppConfigService,
private alfrescoApi: AlfrescoApiService,
private storage: StorageService,
private cookie: CookieService,
@@ -73,7 +73,7 @@ export class AuthenticationService {
this.saveTickets();
this.onLogin.next(response);
return {
type: this.preferences.providers,
type: this.appConfig.get(AppConfigValues.PROVIDERS),
ticket: response
};
})
@@ -83,7 +83,7 @@ export class AuthenticationService {
/**
* Logs the user in with SSO
*/
ssoImplictiLogin() {
ssoImplicitLogin() {
this.alfrescoApi.getInstance().implicitLogin();
}

View File

@@ -18,7 +18,7 @@
/* tslint:disable:no-console */
import { Injectable } from '@angular/core';
import { AppConfigService } from '../app-config/app-config.service';
import { AppConfigService, AppConfigValues } from '../app-config/app-config.service';
import { logLevels, LogLevelsEnum } from '../models/log-levels.model';
import { Subject } from 'rxjs/Subject';
@@ -26,7 +26,7 @@ import { Subject } from 'rxjs/Subject';
export class LogService {
get currentLogLevel() {
let configLevel: string = this.appConfig.get<string>('logLevel');
let configLevel: string = this.appConfig.get<string>(AppConfigValues.LOG_LEVEL);
if (configLevel) {
return this.getLogLevel(configLevel);

View File

@@ -15,115 +15,64 @@
* limitations under the License.
*/
import { inject, TestBed } from '@angular/core/testing';
import { Title } from '@angular/platform-browser';
import { Observable } from 'rxjs/Observable';
import { TestBed } from '@angular/core/testing';
import { setupTestBed } from '../testing/setupTestBed';
import { CoreModule } from '../core.module';
import { AppConfigService } from '../app-config/app-config.service';
import { PageTitleService } from './page-title.service';
import { CoreTestingModule } from '../testing/core.testing.module';
import { TranslationService } from './translation.service';
import { TranslationMock } from '../mock/translation.service.mock';
class TestConfig {
private setup: any = {
applicationName: undefined
};
titleService: Title = null;
appTitleService: PageTitleService = null;
translationService: TranslationService;
constructor(setup: any = {}) {
Object.assign(this.setup, setup);
const titleServiceProvider = {
provide: Title,
useValue: {
setTitle: jasmine.createSpy('setTitleSpy')
}
};
const appConfigProvider = {
provide: AppConfigService,
useValue: {
config: {
application: {
name: this.setup.applicationName
}
},
get: () => this.setup.applicationName,
load: () => {
return Promise.resolve();
},
onLoad: Observable.of({})
}
};
TestBed.configureTestingModule({
imports: [
CoreTestingModule
],
providers: [
titleServiceProvider,
appConfigProvider,
PageTitleService,
{
provide: TranslationService,
useClass: TranslationMock
}
]
});
inject([Title, PageTitleService, TranslationService], (titleService, appTitleService, translationService) => {
this.titleService = titleService;
this.appTitleService = appTitleService;
this.translationService = translationService;
})();
}
}
import { Title } from '@angular/platform-browser';
describe('AppTitle service', () => {
it('should set default application name', () => {
const { appTitleService, titleService } = new TestConfig({
applicationName: undefined
});
appTitleService.setTitle();
expect(titleService.setTitle).toHaveBeenCalledWith('Alfresco ADF Application');
let titleService: any;
let translationService: any;
let pageTitleService: any;
let appConfigService: any;
let titleServiceSpy: any;
setupTestBed({
imports: [
CoreModule.forRoot()
]
});
beforeEach(() => {
titleService = TestBed.get(Title);
pageTitleService = TestBed.get(PageTitleService);
translationService = TestBed.get(TranslationService);
appConfigService = TestBed.get(AppConfigService);
titleServiceSpy = spyOn(titleService, 'setTitle').and.callThrough();
appConfigService.config.application.name = 'My application';
});
it('should set default application name', () => {
appConfigService.config.application = {};
pageTitleService.setTitle();
expect(titleServiceSpy).toHaveBeenCalledWith('Alfresco ADF Application');
});
it('should set only the application name', () => {
const { appTitleService, titleService } = new TestConfig({
applicationName: 'My application'
});
appTitleService.setTitle();
expect(titleService.setTitle).toHaveBeenCalledWith('My application');
pageTitleService.setTitle();
expect(titleServiceSpy).toHaveBeenCalledWith('My application');
});
it('should append application name to the title', () => {
const { appTitleService, titleService } = new TestConfig({
applicationName: 'My application'
});
appTitleService.setTitle('My page');
expect(titleService.setTitle).toHaveBeenCalledWith('My page - My application');
pageTitleService.setTitle('My page');
expect(titleServiceSpy).toHaveBeenCalledWith('My page - My application');
});
it('should update title on language change', () => {
const { appTitleService, titleService, translationService } = new TestConfig({
applicationName: 'My application'
});
spyOn(translationService, 'instant').and.returnValues('hello', 'привет');
appTitleService.setTitle('key');
expect(titleService.setTitle).toHaveBeenCalledWith('hello - My application');
pageTitleService.setTitle('key');
expect(titleServiceSpy).toHaveBeenCalledWith('hello - My application');
(<any> titleService).setTitle.calls.reset();
translationService.translate.onLangChange.next(<any> {});
expect(titleService.setTitle).toHaveBeenCalledWith('привет - My application');
expect(titleServiceSpy).toHaveBeenCalledWith('привет - My application');
});
});

View File

@@ -16,29 +16,25 @@
*/
import { Injectable } from '@angular/core';
import { AppConfigService } from '../app-config/app-config.service';
import { AppConfigService, AppConfigValues } from '../app-config/app-config.service';
import { LogService } from './log.service';
import { UserPreferencesService } from './user-preferences.service';
@Injectable()
export class SettingsService {
constructor(
private appConfig: AppConfigService,
private logService: LogService,
private preferences: UserPreferencesService) {
constructor(private appConfig: AppConfigService,
private logService: LogService) {
}
/** @deprecated in 1.6.0 */
public get ecmHost(): string {
this.logService.log('SettingsService.ecmHost is deprecated. Use AppConfigService instead.');
return this.appConfig.get<string>('ecmHost');
return this.appConfig.get<string>(AppConfigValues.ECMHOST);
}
/** @deprecated in 1.7.0 */
public set csrfDisabled(csrfDisabled: boolean) {
this.logService.log(`SettingsService.csrfDisabled is deprecated. Use UserPreferencesService.disableCSRF instead.`);
this.preferences.disableCSRF = csrfDisabled;
}
/** @deprecated in 1.6.0 */
@@ -49,7 +45,7 @@ export class SettingsService {
/** @deprecated in 1.6.0 */
public get bpmHost(): string {
this.logService.log('SettingsService.bpmHost is deprecated. Use AppConfigService instead.');
return this.appConfig.get<string>('bpmHost');
return this.appConfig.get<string>(AppConfigValues.BPMHOST);
}
/** @deprecated in 1.6.0 */
@@ -66,12 +62,11 @@ export class SettingsService {
/** @deprecated in 1.7.0 */
public getProviders(): string {
this.logService.log(`SettingsService.getProviders is deprecated. Use UserPreferencesService.authType instead.`);
return this.preferences.providers;
return this.appConfig.get<string>(AppConfigValues.PROVIDERS);
}
/** @deprecated in 1.7.0 */
public setProviders(providers: string) {
this.logService.log(`SettingsService.getProviders is deprecated. Use UserPreferencesService.authType instead.`);
this.preferences.providers = providers;
this.logService.log(`SettingsService.aetProviders is deprecated. Use the app-config.json`);
}
}

View File

@@ -20,7 +20,6 @@ import { TranslateService } from '@ngx-translate/core';
import { AppConfigService } from '../app-config/app-config.service';
import { StorageService } from './storage.service';
import { UserPreferencesService } from './user-preferences.service';
import { UserPreferenceValues } from './user-preferences.service';
import { setupTestBed } from '../testing/setupTestBed';
import { CoreTestingModule } from '../testing/core.testing.module';
@@ -154,13 +153,4 @@ describe('UserPreferencesService', () => {
done();
});
});
it('should stream only the selected attribute changes when using select', (done) => {
preferences.disableCSRF = false;
preferences.select(UserPreferenceValues.DisableCSRF).subscribe((disableCSRFFlag) => {
expect(disableCSRFFlag).toBeFalsy();
done();
});
});
});

View File

@@ -22,18 +22,11 @@ import { Observable } from 'rxjs/Observable';
import { AppConfigService } from '../app-config/app-config.service';
import { StorageService } from './storage.service';
import 'rxjs/add/operator/distinctUntilChanged';
import { OauthConfigModel } from '../models/oauth-config.model';
export enum UserPreferenceValues {
PaginationSize = 'PAGINATION_SIZE',
DisableCSRF = 'DISABLE_CSRF',
Locale = 'LOCALE',
SupportedPageSizes = 'supportedPageSizes',
oauthConfig = 'oauthConfig',
ecmHost = 'ecmHost',
bpmHost = 'bpmHost',
providers = 'providers',
authType = 'authType'
SupportedPageSizes = 'supportedPageSizes'
}
@Injectable()
@@ -45,11 +38,7 @@ export class UserPreferencesService {
locale: 'en'
};
private userPreferenceStatus: any = {
paginationSize: 25,
supportedPageSizes: [5, 10, 15, 20],
LOCALE: 'en'
};
private userPreferenceStatus: any = this.defaults;
/**
* @deprecated we are grouping every value changed on the user preference in a single stream : userPreferenceValue$
@@ -75,7 +64,6 @@ export class UserPreferencesService {
this.userPreferenceStatus[UserPreferenceValues.PaginationSize] = this.paginationSize ?
this.paginationSize : this.appConfig.get('pagination.size', this.defaults.paginationSize);
this.userPreferenceStatus[UserPreferenceValues.SupportedPageSizes] = this.appConfig.get('pagination.supportedPageSizes', this.defaults.supportedPageSizes);
this.userPreferenceStatus[UserPreferenceValues.DisableCSRF] = this.disableCSRF;
}
/**
@@ -119,6 +107,19 @@ export class UserPreferencesService {
this.onChangeSubject.next(this.userPreferenceStatus);
}
/**
* Check if an item is present in the storage
* @param property Name of the property
*/
hasItem(property: string) {
if (!property) {
return;
}
return this.storage.hasItem(
this.getPropertyKey(property)
);
}
/**
* Gets the active storage prefix for preferences.
* @returns Storage prefix
@@ -152,21 +153,6 @@ export class UserPreferencesService {
return this.defaults.supportedPageSizes;
}
/** Prevents the CSRF Token from being submitted if true. Only valid for Process Services. */
set disableCSRF(csrf: boolean) {
let storedCSRF = this.storage.getItem('DISABLE_CSRF');
if (csrf !== null && csrf !== undefined) {
if (csrf.toString() === storedCSRF) {
this.set('DISABLE_CSRF', csrf);
}
}
}
get disableCSRF(): boolean {
return this.get('DISABLE_CSRF') === 'true';
}
/** Pagination size. */
set paginationSize(value: number) {
this.set('PAGINATION_SIZE', value);
@@ -195,74 +181,4 @@ export class UserPreferencesService {
return this.appConfig.get<string>('locale') || this.translate.getBrowserLang() || 'en';
}
get providers(): string {
if (this.storage.hasItem('providers')) {
return this.storage.getItem('providers');
} else {
return this.appConfig.get('providers', 'ECM');
}
}
set providers(providers: string) {
if (providers !== this.providers) {
this.storage.setItem('providers', providers);
}
}
get bpmHost(): string {
if (this.storage.hasItem('bpmHost')) {
return this.storage.getItem('bpmHost');
} else {
return this.appConfig.get('bpmHost');
}
}
set bpmHost(bpmHost: string) {
if (bpmHost !== this.bpmHost) {
this.storage.setItem('bpmHost', bpmHost);
}
}
get ecmHost(): string {
if (this.storage.hasItem('ecmHost')) {
return this.storage.getItem('ecmHost');
} else {
return this.appConfig.get('ecmHost');
}
}
set ecmHost(ecmHost: string) {
if (ecmHost !== this.ecmHost) {
this.storage.setItem('ecmHost', ecmHost);
}
}
get oauthConfig(): OauthConfigModel {
if (this.storage.hasItem('oauthConfig')) {
return JSON.parse(this.storage.getItem('oauthConfig'));
} else {
return this.appConfig.get<OauthConfigModel>('oauth2');
}
}
set oauthConfig(oauthConfig: OauthConfigModel) {
if (JSON.stringify(oauthConfig) !== JSON.stringify(this.oauthConfig)) {
this.storage.setItem('oauthConfig', JSON.stringify(oauthConfig));
}
}
get authType(): string {
if (this.storage.hasItem('authType')) {
return this.storage.getItem('authType');
} else {
return this.appConfig.get<string>('authType', 'BASIC');
}
}
set authType(authType: string) {
if (authType !== this.authType) {
this.storage.setItem('authType', authType);
}
}
}

View File

@@ -19,13 +19,13 @@ import { ComponentFixture, TestBed } from '@angular/core/testing';
import { HostSettingsComponent } from './host-settings.component';
import { setupTestBed } from '../testing/setupTestBed';
import { CoreTestingModule } from '../testing/core.testing.module';
import { UserPreferencesService } from '../services/user-preferences.service';
import { AppConfigService } from '../app-config/app-config.service';
describe('HostSettingsComponent', () => {
let fixture: ComponentFixture<HostSettingsComponent>;
let component: HostSettingsComponent;
let userPreferences: UserPreferencesService;
let appConfigService: AppConfigService;
let element: any;
setupTestBed({
@@ -35,7 +35,7 @@ describe('HostSettingsComponent', () => {
beforeEach(() => {
fixture = TestBed.createComponent(HostSettingsComponent);
component = fixture.componentInstance;
userPreferences = TestBed.get(UserPreferencesService);
appConfigService = TestBed.get(AppConfigService);
element = fixture.nativeElement;
});
@@ -46,9 +46,9 @@ describe('HostSettingsComponent', () => {
describe('Providers', () => {
beforeEach(() => {
userPreferences.providers = 'ECM';
userPreferences.authType = 'OAUTH';
userPreferences.oauthConfig = {
appConfigService.config.providers = 'ECM';
appConfigService.config.authType = 'OAUTH';
appConfigService.config.oauth2 = {
host: 'http://localhost:6543',
redirectUri: '/',
silentLogin: false,
@@ -57,6 +57,8 @@ describe('HostSettingsComponent', () => {
scope: 'openid',
secret: ''
};
appConfigService.load();
fixture.detectChanges();
});
@@ -64,7 +66,7 @@ describe('HostSettingsComponent', () => {
fixture.destroy();
});
it('should not show the providers select box if you hav eine porovider', (done) => {
it('should not show the providers select box if you have any provider', (done) => {
component.providers = ['BPM'];
component.ngOnInit();
@@ -76,7 +78,7 @@ describe('HostSettingsComponent', () => {
});
});
it('should show the providers select box if you hav eine porovider', (done) => {
it('should show the providers select box if you have any provider', (done) => {
component.providers = ['BPM', 'ECM'];
component.ngOnInit();
@@ -96,7 +98,8 @@ describe('HostSettingsComponent', () => {
let bpmUrlInput;
beforeEach(() => {
userPreferences.providers = 'BPM';
appConfigService.config.providers = 'BPM';
appConfigService.load();
fixture.detectChanges();
bpmUrlInput = element.querySelector('#bpmHost');
ecmUrlInput = element.querySelector('#ecmHost');
@@ -148,7 +151,8 @@ describe('HostSettingsComponent', () => {
let bpmUrlInput;
beforeEach(() => {
userPreferences.providers = 'ECM';
appConfigService.config.providers = 'ECM';
appConfigService.load();
fixture.detectChanges();
bpmUrlInput = element.querySelector('#bpmHost');
ecmUrlInput = element.querySelector('#ecmHost');
@@ -195,7 +199,8 @@ describe('HostSettingsComponent', () => {
let bpmUrlInput;
beforeEach(() => {
userPreferences.providers = 'ALL';
appConfigService.config.providers = 'ALL';
appConfigService.load();
fixture.detectChanges();
bpmUrlInput = element.querySelector('#bpmHost');
ecmUrlInput = element.querySelector('#ecmHost');
@@ -269,9 +274,9 @@ describe('HostSettingsComponent', () => {
let clientIdInput;
beforeEach(() => {
userPreferences.providers = 'ALL';
userPreferences.authType = 'OAUTH';
userPreferences.oauthConfig = {
appConfigService.config.providers = 'ALL';
appConfigService.config.authType = 'OAUTH';
appConfigService.config.oauth2 = {
host: 'http://localhost:6543',
redirectUri: '/',
silentLogin: false,
@@ -280,6 +285,7 @@ describe('HostSettingsComponent', () => {
scope: 'openid',
secret: ''
};
appConfigService.load();
fixture.detectChanges();
bpmUrlInput = element.querySelector('#bpmHost');
ecmUrlInput = element.querySelector('#ecmHost');

View File

@@ -17,7 +17,10 @@
import { Component, EventEmitter, Output, ViewEncapsulation, OnInit, Input } from '@angular/core';
import { Validators, FormGroup, FormBuilder, AbstractControl, FormControl } from '@angular/forms';
import { UserPreferencesService } from '../services/user-preferences.service';
import { AppConfigService, AppConfigValues } from '../app-config/app-config.service';
import { StorageService } from '../services/storage.service';
import { AlfrescoApiService } from '../services/alfresco-api.service';
import { OauthConfigModel } from '../models/oauth-config.model';
@Component({
selector: 'adf-host-settings',
@@ -62,7 +65,9 @@ export class HostSettingsComponent implements OnInit {
bpmHostChange = new EventEmitter<string>();
constructor(private formBuilder: FormBuilder,
private userPreferencesService: UserPreferencesService) {
private storageService: StorageService,
private alfrescoApiService: AlfrescoApiService,
private appConfig: AppConfigService) {
}
ngOnInit() {
@@ -70,16 +75,16 @@ export class HostSettingsComponent implements OnInit {
this.showSelectProviders = false;
}
let providerSelected = this.userPreferencesService.providers;
let providerSelected = this.appConfig.get<string>(AppConfigValues.PROVIDERS);
this.form = this.formBuilder.group({
providersControl: [providerSelected, Validators.required],
authType: this.userPreferencesService.authType
authType: this.appConfig.get<string>(AppConfigValues.AUTHTYPE)
});
this.addFormGroups();
if (this.userPreferencesService.authType === 'OAUTH') {
if (this.appConfig.get<string>(AppConfigValues.AUTHTYPE) === 'OAUTH') {
this.addOAuthFormGroup();
}
@@ -127,24 +132,25 @@ export class HostSettingsComponent implements OnInit {
}
private createOAuthFormGroup(): AbstractControl {
const oAuthConfig: any = this.userPreferencesService.oauthConfig ? this.userPreferencesService.oauthConfig : {};
let oauth = <OauthConfigModel> this.appConfig.get(AppConfigValues.OAUTHCONFIG, {});
return this.formBuilder.group({
host: [oAuthConfig.host, [Validators.required, Validators.pattern(this.HOST_REGEX)]],
clientId: [oAuthConfig.clientId, Validators.required],
redirectUri: [oAuthConfig.redirectUri, Validators.required],
scope: [oAuthConfig.scope, Validators.required],
secret: oAuthConfig.secret,
silentLogin: oAuthConfig.silentLogin,
implicitFlow: oAuthConfig.implicitFlow
host: [oauth.host, [Validators.required, Validators.pattern(this.HOST_REGEX)]],
clientId: [oauth.clientId, Validators.required],
redirectUri: [oauth.redirectUri, Validators.required],
scope: [oauth.scope, Validators.required],
secret: oauth.secret,
silentLogin: oauth.silentLogin,
implicitFlow: oauth.implicitFlow
});
}
private createBPMFormControl(): AbstractControl {
return new FormControl(this.userPreferencesService.bpmHost, [Validators.required, Validators.pattern(this.HOST_REGEX)]);
return new FormControl(this.appConfig.get<string>(AppConfigValues.BPMHOST), [Validators.required, Validators.pattern(this.HOST_REGEX)]);
}
private createECMFormControl(): AbstractControl {
return new FormControl(this.userPreferencesService.ecmHost, [Validators.required, Validators.pattern(this.HOST_REGEX)]);
return new FormControl(this.appConfig.get<string>(AppConfigValues.ECMHOST), [Validators.required, Validators.pattern(this.HOST_REGEX)]);
}
onCancel() {
@@ -152,7 +158,7 @@ export class HostSettingsComponent implements OnInit {
}
onSubmit(values: any) {
this.userPreferencesService.providers = values.providersControl;
this.storageService.setItem(AppConfigValues.PROVIDERS, values.providersControl);
if (this.isBPM()) {
this.saveBPMValues(values);
@@ -167,21 +173,22 @@ export class HostSettingsComponent implements OnInit {
this.saveOAuthValues(values);
}
this.userPreferencesService.authType = values.authType;
this.storageService.setItem(AppConfigValues.AUTHTYPE, values.authType);
this.alfrescoApiService.reset();
this.success.emit(true);
}
private saveOAuthValues(values: any) {
this.userPreferencesService.oauthConfig = values.oauthConfig;
this.storageService.setItem(AppConfigValues.OAUTHCONFIG, JSON.stringify(values.oauthConfig));
}
private saveBPMValues(values: any) {
this.userPreferencesService.bpmHost = values.bpmHost;
this.storageService.setItem(AppConfigValues.BPMHOST, values.bpmHost);
}
private saveECMValues(values: any) {
this.userPreferencesService.ecmHost = values.ecmHost;
this.storageService.setItem(AppConfigValues.ECMHOST, values.ecmHost);
}
isBPM(): boolean {