trustedDomains.ts 5.3 KB
Newer Older
P
Pine Wu 已提交
1 2 3 4 5
/*---------------------------------------------------------------------------------------------
 *  Copyright (c) Microsoft Corporation. All rights reserved.
 *  Licensed under the MIT License. See License.txt in the project root for license information.
 *--------------------------------------------------------------------------------------------*/

P
Pine Wu 已提交
6
import { URI } from 'vs/base/common/uri';
P
Pine Wu 已提交
7 8
import { localize } from 'vs/nls';
import { ServicesAccessor } from 'vs/platform/instantiation/common/instantiation';
9
import { IProductService } from 'vs/platform/product/common/productService';
P
Pine Wu 已提交
10 11
import { IQuickInputService, IQuickPickItem } from 'vs/platform/quickinput/common/quickInput';
import { IStorageService, StorageScope } from 'vs/platform/storage/common/storage';
P
Pine Wu 已提交
12
import { IEditorService } from 'vs/workbench/services/editor/common/editorService';
P
Pine Wu 已提交
13
import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry';
14
import { IAuthenticationService } from 'vs/workbench/services/authentication/browser/authenticationService';
P
Pine Wu 已提交
15

P
Pine Wu 已提交
16
const TRUSTED_DOMAINS_URI = URI.parse('trustedDomains:/Trusted Domains');
P
Pine Wu 已提交
17

P
Pine Wu 已提交
18 19 20
export const TRUSTED_DOMAINS_STORAGE_KEY = 'http.linkProtectionTrustedDomains';
export const TRUSTED_DOMAINS_CONTENT_STORAGE_KEY = 'http.linkProtectionTrustedDomainsContent';

P
Pine Wu 已提交
21 22
export const manageTrustedDomainSettingsCommand = {
	id: 'workbench.action.manageTrustedDomain',
P
Pine Wu 已提交
23
	description: {
P
Pine Wu 已提交
24
		description: localize('trustedDomain.manageTrustedDomain', 'Manage Trusted Domains'),
P
Pine Wu 已提交
25 26 27
		args: []
	},
	handler: async (accessor: ServicesAccessor) => {
P
Pine Wu 已提交
28 29 30
		const editorService = accessor.get(IEditorService);
		editorService.openEditor({ resource: TRUSTED_DOMAINS_URI, mode: 'jsonc' });
		return;
P
Pine Wu 已提交
31 32 33
	}
};

P
Pine Wu 已提交
34 35 36 37 38 39 40 41
type ConfigureTrustedDomainChoice = 'trustDomain' | 'trustSubdomain' | 'trustAll' | 'manage';
interface ConfigureTrustedDomainsQuickPickItem extends IQuickPickItem {
	id: ConfigureTrustedDomainChoice;
}
type ConfigureTrustedDomainsChoiceClassification = {
	choice: { classification: 'SystemMetaData', purpose: 'FeatureInsight' };
};

P
Pine Wu 已提交
42 43 44 45
export async function configureOpenerTrustedDomainsHandler(
	trustedDomains: string[],
	domainToConfigure: string,
	quickInputService: IQuickInputService,
P
Pine Wu 已提交
46
	storageService: IStorageService,
P
Pine Wu 已提交
47 48
	editorService: IEditorService,
	telemetryService: ITelemetryService
P
Pine Wu 已提交
49
) {
P
Pine Wu 已提交
50
	const parsedDomainToConfigure = URI.parse(domainToConfigure);
P
Pine Wu 已提交
51
	const toplevelDomainSegements = parsedDomainToConfigure.authority.split('.');
P
Pine Wu 已提交
52
	const domainEnd = toplevelDomainSegements.slice(toplevelDomainSegements.length - 2).join('.');
P
Pine Wu 已提交
53
	const topLevelDomain = '*.' + domainEnd;
P
Pine Wu 已提交
54

P
Pine Wu 已提交
55
	const trustDomainAndOpenLinkItem: ConfigureTrustedDomainsQuickPickItem = {
P
Pine Wu 已提交
56
		type: 'item',
P
Pine Wu 已提交
57
		label: localize('trustedDomain.trustDomain', 'Trust {0}', domainToConfigure),
P
Pine Wu 已提交
58
		id: 'trustDomain',
P
Pine Wu 已提交
59 60
		picked: true
	};
P
Pine Wu 已提交
61
	const trustSubDomainAndOpenLinkItem: ConfigureTrustedDomainsQuickPickItem = {
P
Pine Wu 已提交
62
		type: 'item',
P
Pine Wu 已提交
63
		label: localize('trustedDomain.trustSubDomain', 'Trust {0} and all its subdomains', domainEnd),
P
Pine Wu 已提交
64
		id: 'trustSubdomain'
P
Pine Wu 已提交
65
	};
P
Pine Wu 已提交
66
	const openAllLinksItem: ConfigureTrustedDomainsQuickPickItem = {
P
Pine Wu 已提交
67
		type: 'item',
P
Pine Wu 已提交
68
		label: localize('trustedDomain.trustAllDomains', 'Trust all domains (disables link protection)'),
P
Pine Wu 已提交
69
		id: 'trustAll'
P
Pine Wu 已提交
70
	};
P
Pine Wu 已提交
71
	const manageTrustedDomainItem: ConfigureTrustedDomainsQuickPickItem = {
P
Pine Wu 已提交
72
		type: 'item',
P
Pine Wu 已提交
73 74
		label: localize('trustedDomain.manageTrustedDomains', 'Manage Trusted Domains'),
		id: 'manage'
P
Pine Wu 已提交
75
	};
P
Pine Wu 已提交
76

P
Pine Wu 已提交
77
	const pickedResult = await quickInputService.pick<ConfigureTrustedDomainsQuickPickItem>(
P
Pine Wu 已提交
78
		[trustDomainAndOpenLinkItem, trustSubDomainAndOpenLinkItem, openAllLinksItem, manageTrustedDomainItem],
P
polish  
Pine Wu 已提交
79 80 81 82
		{
			activeItem: trustDomainAndOpenLinkItem
		}
	);
P
Pine Wu 已提交
83

P
Pine Wu 已提交
84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104
	if (pickedResult && pickedResult.id) {
		telemetryService.publicLog2<{ choice: string }, ConfigureTrustedDomainsChoiceClassification>(
			'trustedDomains.configureTrustedDomainsQuickPickChoice',
			{ choice: pickedResult.id }
		);

		switch (pickedResult.id) {
			case 'manage':
				editorService.openEditor({
					resource: TRUSTED_DOMAINS_URI,
					mode: 'jsonc'
				});
				return trustedDomains;
			case 'trustDomain':
			case 'trustSubdomain':
			case 'trustAll':
				const itemToTrust = pickedResult.id === 'trustDomain'
					? domainToConfigure
					: pickedResult.id === 'trustSubdomain' ? topLevelDomain : '*';

				if (trustedDomains.indexOf(itemToTrust) === -1) {
P
Pine Wu 已提交
105
					storageService.remove(TRUSTED_DOMAINS_CONTENT_STORAGE_KEY, StorageScope.GLOBAL);
P
Pine Wu 已提交
106
					storageService.store(
P
Pine Wu 已提交
107
						TRUSTED_DOMAINS_STORAGE_KEY,
P
Pine Wu 已提交
108 109 110
						JSON.stringify([...trustedDomains, itemToTrust]),
						StorageScope.GLOBAL
					);
P
Pine Wu 已提交
111

P
Pine Wu 已提交
112 113
					return [...trustedDomains, pickedResult.id];
				}
P
Pine Wu 已提交
114 115 116 117 118
		}
	}

	return [];
}
P
Pine Wu 已提交
119

120
export async function readTrustedDomains(storageService: IStorageService, productService: IProductService, authenticationService: IAuthenticationService) {
P
Pine Wu 已提交
121
	const defaultTrustedDomains: string[] = productService.linkProtectionTrustedDomains
P
Pine Wu 已提交
122 123 124
		? [...productService.linkProtectionTrustedDomains]
		: [];

P
Pine Wu 已提交
125
	let trustedDomains: string[] = [];
P
Pine Wu 已提交
126
	try {
P
Pine Wu 已提交
127
		const trustedDomainsSrc = storageService.get(TRUSTED_DOMAINS_STORAGE_KEY, StorageScope.GLOBAL);
P
Pine Wu 已提交
128 129 130 131 132
		if (trustedDomainsSrc) {
			trustedDomains = JSON.parse(trustedDomainsSrc);
		}
	} catch (err) { }

133 134 135 136
	const userDomains = ((await authenticationService.getSessions('github')) ?? [])
		.map(session => session.account.displayName)
		.map(username => `https://github.com/${username}/`);

P
Pine Wu 已提交
137 138
	return {
		defaultTrustedDomains,
139 140
		trustedDomains,
		userDomains
P
Pine Wu 已提交
141
	};
P
Pine Wu 已提交
142
}