mirror of
https://github.com/ckaczor/azuredatastudio.git
synced 2026-01-23 09:35:39 -05:00
* Fix initial build breaks from 1.67 merge (#2514) * Update yarn lock files * Update build scripts * Fix tsconfig * Build breaks * WIP * Update yarn lock files * Misc breaks * Updates to package.json * Breaks * Update yarn * Fix breaks * Breaks * Build breaks * Breaks * Breaks * Breaks * Breaks * Breaks * Missing file * Breaks * Breaks * Breaks * Breaks * Breaks * Fix several runtime breaks (#2515) * Missing files * Runtime breaks * Fix proxy ordering issue * Remove commented code * Fix breaks with opening query editor * Fix post merge break * Updates related to setup build and other breaks (#2516) * Fix bundle build issues * Update distro * Fix distro merge and update build JS files * Disable pipeline steps * Remove stats call * Update license name * Make new RPM dependencies a warning * Fix extension manager version checks * Update JS file * Fix a few runtime breaks * Fixes * Fix runtime issues * Fix build breaks * Update notebook tests (part 1) * Fix broken tests * Linting errors * Fix hygiene * Disable lint rules * Bump distro * Turn off smoke tests * Disable integration tests * Remove failing "activate" test * Remove failed test assertion * Disable other broken test * Disable query history tests * Disable extension unit tests * Disable failing tasks
106 lines
3.2 KiB
TypeScript
106 lines
3.2 KiB
TypeScript
/*---------------------------------------------------------------------------------------------
|
|
* Copyright (c) Microsoft Corporation. All rights reserved.
|
|
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
|
*--------------------------------------------------------------------------------------------*/
|
|
|
|
import { window, InputBoxOptions, Uri, OutputChannel, Disposable, workspace } from 'vscode';
|
|
import { IDisposable, EmptyDisposable, toDisposable, logTimestamp } from './util';
|
|
import * as path from 'path';
|
|
import { IIPCHandler, IIPCServer, createIPCServer } from './ipc/ipcServer';
|
|
import { CredentialsProvider, Credentials } from './api/git';
|
|
|
|
export class Askpass implements IIPCHandler {
|
|
|
|
private disposable: IDisposable = EmptyDisposable;
|
|
private cache = new Map<string, Credentials>();
|
|
private credentialsProviders = new Set<CredentialsProvider>();
|
|
|
|
static async create(outputChannel: OutputChannel, context?: string): Promise<Askpass> {
|
|
try {
|
|
return new Askpass(await createIPCServer(context));
|
|
} catch (err) {
|
|
outputChannel.appendLine(`${logTimestamp()} [error] Failed to create git askpass IPC: ${err}`);
|
|
return new Askpass();
|
|
}
|
|
}
|
|
|
|
private constructor(private ipc?: IIPCServer) {
|
|
if (ipc) {
|
|
this.disposable = ipc.registerHandler('askpass', this);
|
|
}
|
|
}
|
|
|
|
async handle({ request, host }: { request: string; host: string }): Promise<string> {
|
|
const config = workspace.getConfiguration('git', null);
|
|
const enabled = config.get<boolean>('enabled');
|
|
|
|
if (!enabled) {
|
|
return '';
|
|
}
|
|
|
|
const uri = Uri.parse(host);
|
|
const authority = uri.authority.replace(/^.*@/, '');
|
|
const password = /password/i.test(request);
|
|
const cached = this.cache.get(authority);
|
|
|
|
if (cached && password) {
|
|
this.cache.delete(authority);
|
|
return cached.password;
|
|
}
|
|
|
|
if (!password) {
|
|
for (const credentialsProvider of this.credentialsProviders) {
|
|
try {
|
|
const credentials = await credentialsProvider.getCredentials(uri);
|
|
|
|
if (credentials) {
|
|
this.cache.set(authority, credentials);
|
|
setTimeout(() => this.cache.delete(authority), 60_000);
|
|
return credentials.username;
|
|
}
|
|
} catch { }
|
|
}
|
|
}
|
|
|
|
const options: InputBoxOptions = {
|
|
password,
|
|
placeHolder: request,
|
|
prompt: `Git: ${host}`,
|
|
ignoreFocusOut: true
|
|
};
|
|
|
|
return await window.showInputBox(options) || '';
|
|
}
|
|
|
|
getEnv(): { [key: string]: string } {
|
|
if (!this.ipc) {
|
|
return {
|
|
GIT_ASKPASS: path.join(__dirname, 'askpass-empty.sh')
|
|
};
|
|
}
|
|
|
|
let env: { [key: string]: string } = {
|
|
...this.ipc.getEnv(),
|
|
VSCODE_GIT_ASKPASS_NODE: process.execPath,
|
|
VSCODE_GIT_ASKPASS_EXTRA_ARGS: (process.versions['electron'] && process.versions['microsoft-build']) ? '--ms-enable-electron-run-as-node' : '',
|
|
VSCODE_GIT_ASKPASS_MAIN: path.join(__dirname, 'askpass-main.js')
|
|
};
|
|
|
|
const config = workspace.getConfiguration('git');
|
|
if (config.get<boolean>('useIntegratedAskPass')) {
|
|
env.GIT_ASKPASS = path.join(__dirname, 'askpass.sh');
|
|
}
|
|
|
|
return env;
|
|
}
|
|
|
|
registerCredentialsProvider(provider: CredentialsProvider): Disposable {
|
|
this.credentialsProviders.add(provider);
|
|
return toDisposable(() => this.credentialsProviders.delete(provider));
|
|
}
|
|
|
|
dispose(): void {
|
|
this.disposable.dispose();
|
|
}
|
|
}
|