Fix/controller ad (#7445)

Reapply my previous commit
add kerberos to excludes in the webpack for the extension
Fixes #7443
Verified on Windows and MacOS
This commit is contained in:
Kevin Cunnane
2019-10-01 14:52:09 -07:00
committed by GitHub
parent 7162272f1e
commit ee98ce5c18
16 changed files with 2245 additions and 107 deletions

View File

@@ -7,40 +7,74 @@
import * as azdata from 'azdata';
import * as nls from 'vscode-nls';
import { getEndPoints, ControllerError } from '../controller/clusterControllerApi';
import { ClusterController, ControllerError } from '../controller/clusterControllerApi';
import { ControllerTreeDataProvider } from '../tree/controllerTreeDataProvider';
import { TreeNode } from '../tree/treeNode';
import { showErrorMessage } from '../utils';
import { AuthType } from '../constants';
const localize = nls.loadMessageBundle();
const basicAuthDisplay = localize('basicAuthName', "Basic");
const integratedAuthDisplay = localize('integratedAuthName', "Windows Authentication");
function getAuthCategory(name: AuthType): azdata.CategoryValue {
if (name === 'basic') {
return { name: name, displayName: basicAuthDisplay };
}
return { name: name, displayName: integratedAuthDisplay };
}
export class AddControllerDialogModel {
private _canceled = false;
private _authTypes: azdata.CategoryValue[];
constructor(
public treeDataProvider: ControllerTreeDataProvider,
public node?: TreeNode,
public prefilledUrl?: string,
public prefilledAuth?: azdata.CategoryValue,
public prefilledUsername?: string,
public prefilledPassword?: string,
public prefilledRememberPassword?: boolean
) {
this.prefilledUrl = prefilledUrl || (node && node['url']);
this.prefilledAuth = prefilledAuth;
if (!prefilledAuth) {
let auth = (node && node['auth']) || 'basic';
this.prefilledAuth = getAuthCategory(auth);
}
this.prefilledUsername = prefilledUsername || (node && node['username']);
this.prefilledPassword = prefilledPassword || (node && node['password']);
this.prefilledRememberPassword = prefilledRememberPassword || (node && node['rememberPassword']);
}
public async onComplete(url: string, username: string, password: string, rememberPassword: boolean): Promise<void> {
public get authCategories(): azdata.CategoryValue[] {
if (!this._authTypes) {
this._authTypes = [getAuthCategory('basic'), getAuthCategory('integrated')];
}
return this._authTypes;
}
public async onComplete(url: string, auth: AuthType, username: string, password: string, rememberPassword: boolean): Promise<void> {
try {
if (auth === 'basic') {
// Verify username and password as we can't make them required in the UI
if (!username) {
throw new Error(localize('err.controller.username.required', "Username is required"));
} else if (!password) {
throw new Error(localize('err.controller.password.required', "Password is required"));
}
}
// We pre-fetch the endpoints here to verify that the information entered is correct (the user is able to connect)
let response = await getEndPoints(url, username, password, true);
let controller = new ClusterController(url, auth, username, password, true);
let response = await controller.getEndPoints();
if (response && response.endPoints) {
if (this._canceled) {
return;
}
this.treeDataProvider.addController(url, username, password, rememberPassword);
this.treeDataProvider.addController(url, auth, username, password, rememberPassword);
await this.treeDataProvider.saveControllers();
}
} catch (error) {
@@ -70,6 +104,7 @@ export class AddControllerDialog {
private uiModelBuilder: azdata.ModelBuilder;
private urlInputBox: azdata.InputBoxComponent;
private authDropdown: azdata.DropDownComponent;
private usernameInputBox: azdata.InputBoxComponent;
private passwordInputBox: azdata.InputBoxComponent;
private rememberPwCheckBox: azdata.CheckBoxComponent;
@@ -92,6 +127,12 @@ export class AddControllerDialog {
placeHolder: localize('textUrlLower', 'url'),
value: this.model.prefilledUrl
}).component();
this.authDropdown = this.uiModelBuilder.dropDown().withProperties({
values: this.model.authCategories,
value: this.model.prefilledAuth,
editable: false,
}).component();
this.authDropdown.onValueChanged(e => this.onAuthChanged());
this.usernameInputBox = this.uiModelBuilder.inputBox()
.withProperties<azdata.InputBoxProperties>({
placeHolder: localize('textUsernameLower', 'username'),
@@ -117,14 +158,18 @@ export class AddControllerDialog {
component: this.urlInputBox,
title: localize('textUrlCapital', 'URL'),
required: true
}, {
component: this.authDropdown,
title: localize('textAuthCapital', 'Authentication type'),
required: true
}, {
component: this.usernameInputBox,
title: localize('textUsernameCapital', 'Username'),
required: true
required: false
}, {
component: this.passwordInputBox,
title: localize('textPasswordCapital', 'Password'),
required: true
required: false
}, {
component: this.rememberPwCheckBox,
title: ''
@@ -142,17 +187,36 @@ export class AddControllerDialog {
this.dialog.cancelButton.label = localize('textCancel', 'Cancel');
}
private get authValue(): AuthType {
return (<azdata.CategoryValue>this.authDropdown.value).name as AuthType;
}
private onAuthChanged(): void {
let isBasic = this.authValue === 'basic';
this.usernameInputBox.enabled = isBasic;
this.passwordInputBox.enabled = isBasic;
this.rememberPwCheckBox.enabled = isBasic;
if (!isBasic) {
this.usernameInputBox.value = '';
this.passwordInputBox.value = '';
}
}
private async validate(): Promise<boolean> {
let url = this.urlInputBox && this.urlInputBox.value;
let auth = this.authValue;
let username = this.usernameInputBox && this.usernameInputBox.value;
let password = this.passwordInputBox && this.passwordInputBox.value;
let rememberPassword = this.passwordInputBox && !!this.rememberPwCheckBox.checked;
try {
await this.model.onComplete(url, username, password, rememberPassword);
await this.model.onComplete(url, auth, username, password, rememberPassword);
return true;
} catch (error) {
showErrorMessage(error);
this.dialog.message = {
text: (typeof error === 'string') ? error : error.message,
level: azdata.window.MessageLevel.Error
};
if (this.model && this.model.onError) {
await this.model.onError(error as ControllerError);
}