1
0
mirror of https://github.com/quay/quay.git synced 2025-04-18 10:44:06 +03:00
quay/static/js/quay-run.ts
Kenny Lee Sin Cheong a839a78eb5
chore: allows Quay to run for account recoveries (PROJQUAY-970) (#793)
Adds ACCOUNT_RECOVERY_MODE to allow Quay to run with some core
features disabled. When this is set, the instance should only be used
in order by existing users who hasn't linked their account to an
external login service, after database authentication has been
disabled.
2021-07-07 12:45:24 -04:00

171 lines
5.3 KiB
TypeScript

import { INJECTED_CONFIG } from "./constants/injected-values.constant";
/**
* Provider function for the application runtime configuration.
* See https://hotell.gitbooks.io/ng-metadata/content/docs/recipes/startup-logic.html
*/
provideRun.$inject = [
'$rootScope',
'Restangular',
'PlanService',
'$http',
'CookieService',
'UserService',
'StateService',
'Features',
'$anchorScroll',
'MetaService',
];
export function provideRun($rootScope: QuayRunScope,
restangular: any,
planService: any,
$http: ng.IHttpService,
cookieService: any,
userService: any,
stateService: any,
features: any,
$anchorScroll: ng.IAnchorScrollService,
metaService: any): void {
const defaultTitle: string = INJECTED_CONFIG['REGISTRY_TITLE'] || 'Quay Container Registry';
if ((<any>window).__registry_state == 'readonly') {
stateService.setInReadOnlyMode();
}
if ((<any>window).__account_recovery_mode) {
stateService.setInAccountRecoveryMode();
}
// Handle session security.
restangular.setDefaultHeaders({
'X-Requested-With': 'XMLHttpRequest',
'X-CSRF-Token': (<any>window).__token || ''
});
restangular.setResponseInterceptor(function(data, operation, what, url, response, deferred) {
var headers = response.headers();
if (headers['x-next-csrf-token']) {
(<any>window).__token = headers['x-next-csrf-token'];
restangular.setDefaultHeaders({
'X-Requested-With': 'XMLHttpRequest',
'X-CSRF-Token': (<any>window).__token || ''
});
}
return data;
});
// Handle session expiration.
restangular.setErrorInterceptor(function(response) {
if (response !== undefined && response.status == 503) {
if (response.data['errors'] &&
response.data['errors'].length > 0 &&
response.data['errors'][0]['code'] == "READ_ONLY_MODE") {
stateService.setInReadOnlyMode();
(<any>$('#readOnlyService')).modal({});
} else {
(<any>$('#cannotContactService')).modal({});
}
return false;
}
if (response !== undefined && response.status == 500) {
window.location.href = '/500';
return false;
}
if (response !== undefined && !response.data) {
return true;
}
const invalid_token: boolean = response.data['title'] == 'invalid_token' ||
response.data['error_type'] == 'invalid_token';
if (response !== undefined &&
response.status == 401 &&
invalid_token &&
response.data['session_required'] !== false) {
(<any>$('#sessionexpiredModal')).modal({});
return false;
}
return true;
});
// Check if we need to redirect based on a previously chosen plan.
const result: boolean = planService.handleNotedPlan();
// Check to see if we need to show a redirection page.
const redirectUrl: string = cookieService.get('quay.redirectAfterLoad');
cookieService.clear('quay.redirectAfterLoad');
if (!result && redirectUrl && redirectUrl.indexOf((<any>window).location.href) == 0) {
(<any>window).location = redirectUrl;
return;
}
$rootScope.$watch('description', (description: string) => {
if (!description) {
description = `Hosted private Docker repositories. Includes full user management and history.
Free for public repositories.`;
}
// Note: We set the content of the description tag manually here rather than using Angular binding
// because we need the <meta> tag to have a default description that is not of the form "{{ description }}",
// we read by tools that do not properly invoke the Angular code.
$('#descriptionTag').attr('content', description);
});
$rootScope.$on('$routeChangeSuccess', (event, current, previous) => {
$rootScope.current = current.$$route;
$rootScope.currentPage = current;
$rootScope.pageClass = '';
if (!current.$$route) { return; }
var pageClass: string | Function = current.$$route.pageClass || '';
if (typeof pageClass != 'string') {
pageClass = pageClass(features);
}
$rootScope.pageClass = pageClass;
$rootScope.newLayout = !!current.$$route.newLayout;
$rootScope.fixFooter = !!current.$$route.fixFooter;
$anchorScroll();
});
// Listen for route changes and update the title and description accordingly.
$rootScope.$on('$routeChangeSuccess', async(event, current, previous) => {
const title = await metaService.getTitle(current);
const description = await metaService.getDescription(current);
$rootScope.title = title || defaultTitle;
if ($rootScope.description != description) {
$rootScope.description = description;
}
});
var initallyChecked: boolean = false;
(<any>window).__isLoading = function() {
if (!initallyChecked) {
initallyChecked = true;
return true;
}
return $http.pendingRequests.length > 0;
};
// Load the inital user information.
userService.load();
}
interface QuayRunScope extends ng.IRootScopeService {
currentPage: any;
current: any;
title: any;
description: string;
pageClass: any;
newLayout: any;
fixFooter: any;
}