import { UtilsService } from '@abp/utils/utils.service'; import { CompilerOptions, NgModuleRef, Type } from '@angular/core'; import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; import { AppAuthService } from '@app/shared/common/auth/app-auth.service'; import { AppConsts } from '@shared/AppConsts'; import { SubdomainTenancyNameFinder } from '@shared/helpers/SubdomainTenancyNameFinder'; import * as moment from 'moment'; import { LocalizedResourcesHelper } from './shared/helpers/LocalizedResourcesHelper'; import { UrlHelper } from './shared/helpers/UrlHelper'; import { environment } from './environments/environment'; export class AppPreBootstrap { static run(appRootUrl: string, callback: () => void, resolve: any, reject: any): void { AppPreBootstrap.getApplicationConfig(appRootUrl, () => { if (UrlHelper.isInstallUrl(location.href)) { LocalizedResourcesHelper.loadLocalizedStylesForTheme("default", false); callback(); return; } const queryStringObj = UrlHelper.getQueryParameters(); if (queryStringObj.redirect && queryStringObj.redirect === 'TenantRegistration') { if (queryStringObj.forceNewRegistration) { new AppAuthService().logout(); } location.href = AppConsts.appBaseUrl + '/account/select-edition'; } else if (queryStringObj.impersonationToken) { AppPreBootstrap.impersonatedAuthenticate(queryStringObj.impersonationToken, queryStringObj.tenantId, () => { AppPreBootstrap.getUserConfiguration(callback); }); } else if (queryStringObj.switchAccountToken) { AppPreBootstrap.linkedAccountAuthenticate(queryStringObj.switchAccountToken, queryStringObj.tenantId, () => { AppPreBootstrap.getUserConfiguration(callback); }); } else { AppPreBootstrap.getUserConfiguration(callback); } }); } static bootstrap(moduleType: Type, compilerOptions?: CompilerOptions | CompilerOptions[]): Promise> { return platformBrowserDynamic().bootstrapModule(moduleType, compilerOptions); } private static getApplicationConfig(appRootUrl: string, callback: () => void) { return abp.ajax({ url: appRootUrl + 'assets/' + environment.appConfig, method: 'GET', headers: { 'Abp.TenantId': abp.multiTenancy.getTenantIdCookie() } }).done(result => { const subdomainTenancyNameFinder = new SubdomainTenancyNameFinder(); const tenancyName = subdomainTenancyNameFinder.getCurrentTenancyNameOrNull(result.appBaseUrl); AppConsts.appBaseUrlFormat = result.appBaseUrl; AppConsts.remoteServiceBaseUrlFormat = result.remoteServiceBaseUrl; AppConsts.localeMappings = result.localeMappings; if (tenancyName == null) { AppConsts.appBaseUrl = result.appBaseUrl.replace(AppConsts.tenancyNamePlaceHolderInUrl + '.', ''); AppConsts.remoteServiceBaseUrl = result.remoteServiceBaseUrl.replace(AppConsts.tenancyNamePlaceHolderInUrl + '.', ''); } else { AppConsts.appBaseUrl = result.appBaseUrl.replace(AppConsts.tenancyNamePlaceHolderInUrl, tenancyName); AppConsts.remoteServiceBaseUrl = result.remoteServiceBaseUrl.replace(AppConsts.tenancyNamePlaceHolderInUrl, tenancyName); } callback(); }); } private static getCurrentClockProvider(currentProviderName: string): abp.timing.IClockProvider { if (currentProviderName === 'unspecifiedClockProvider') { return abp.timing.unspecifiedClockProvider; } if (currentProviderName === 'utcClockProvider') { return abp.timing.utcClockProvider; } return abp.timing.localClockProvider; } private static impersonatedAuthenticate(impersonationToken: string, tenantId: number, callback: () => void): JQueryPromise { abp.multiTenancy.setTenantIdCookie(tenantId); const cookieLangValue = abp.utils.getCookieValue('Abp.Localization.CultureName'); return abp.ajax({ url: AppConsts.remoteServiceBaseUrl + '/api/TokenAuth/ImpersonatedAuthenticate?impersonationToken=' + impersonationToken, method: 'POST', headers: { '.AspNetCore.Culture': ('c=' + cookieLangValue + '|uic=' + cookieLangValue), 'Abp.TenantId': abp.multiTenancy.getTenantIdCookie() } }).done(result => { abp.auth.setToken(result.accessToken); AppPreBootstrap.setEncryptedTokenCookie(result.encryptedAccessToken); location.search = ''; callback(); }); } private static linkedAccountAuthenticate(switchAccountToken: string, tenantId: number, callback: () => void): JQueryPromise { abp.multiTenancy.setTenantIdCookie(tenantId); const cookieLangValue = abp.utils.getCookieValue('Abp.Localization.CultureName'); return abp.ajax({ url: AppConsts.remoteServiceBaseUrl + '/api/TokenAuth/LinkedAccountAuthenticate?switchAccountToken=' + switchAccountToken, method: 'POST', headers: { '.AspNetCore.Culture': ('c=' + cookieLangValue + '|uic=' + cookieLangValue), 'Abp.TenantId': abp.multiTenancy.getTenantIdCookie() } }).done(result => { abp.auth.setToken(result.accessToken); AppPreBootstrap.setEncryptedTokenCookie(result.encryptedAccessToken); location.search = ''; callback(); }); } private static getUserConfiguration(callback: () => void): JQueryPromise { const cookieLangValue = abp.utils.getCookieValue('Abp.Localization.CultureName'); const token = abp.auth.getToken(); let requestHeaders = { '.AspNetCore.Culture': ('c=' + cookieLangValue + '|uic=' + cookieLangValue), 'Abp.TenantId': abp.multiTenancy.getTenantIdCookie() }; if (token) { requestHeaders['Authorization'] = 'Bearer ' + token; } return abp.ajax({ url: AppConsts.remoteServiceBaseUrl + '/AbpUserConfiguration/GetAll', method: 'GET', headers: requestHeaders }).done(result => { $.extend(true, abp, result); abp.clock.provider = this.getCurrentClockProvider(result.clock.provider); moment.locale(abp.localization.currentLanguage.name); (window as any).moment.locale(abp.localization.currentLanguage.name); if (abp.clock.provider.supportsMultipleTimezone) { moment.tz.setDefault(abp.timing.timeZoneInfo.iana.timeZoneId); (window as any).moment.tz.setDefault(abp.timing.timeZoneInfo.iana.timeZoneId); } abp.event.trigger('abp.dynamicScriptsInitialized'); AppConsts.recaptchaSiteKey = abp.setting.get('Recaptcha.SiteKey'); AppConsts.subscriptionExpireNootifyDayCount = parseInt(abp.setting.get('App.TenantManagement.SubscriptionExpireNotifyDayCount')); LocalizedResourcesHelper.loadResources(callback); }); } private static setEncryptedTokenCookie(encryptedToken: string) { new UtilsService().setCookieValue(AppConsts.authorization.encrptedAuthTokenName, encryptedToken, new Date(new Date().getTime() + 365 * 86400000), //1 year abp.appPath ); } }