[SQL Migration] Properly respect user's encryptConnection and trustServerCertificate settings (#21824)

* WIP

* Always get latest current connection

* Update more references

* Clean up

* Clean up

* vbump

* Update comments

* Address PR feedback

* Separate into helper methods
This commit is contained in:
Raymond Truong
2023-02-08 10:12:11 -08:00
committed by GitHub
parent 99a924dbcd
commit 480d8e2cd0
25 changed files with 206 additions and 154 deletions

View File

@@ -17,6 +17,7 @@ import { logError, TelemetryViews } from '../telemetry';
import * as styles from '../constants/styles';
import { TableMigrationSelectionDialog } from '../dialog/tableMigrationSelection/tableMigrationSelectionDialog';
import { ValidateIrDialog } from '../dialog/validationResults/validateIrDialog';
import { getSourceConnectionCredentials, getSourceConnectionProfile, getSourceConnectionQueryProvider, getSourceConnectionUri } from '../api/sqlUtils';
const WIZARD_TABLE_COLUMN_WIDTH = '200px';
const WIZARD_TABLE_COLUMN_WIDTH_SMALL = '170px';
@@ -799,15 +800,12 @@ export class DatabaseBackupPage extends MigrationWizardPage {
: WIZARD_TABLE_COLUMN_WIDTH;
});
const connectionProfile = await this.migrationStateModel.getSourceConnectionProfile();
const queryProvider = azdata.dataprotocol.getProvider<azdata.QueryProvider>(
(await this.migrationStateModel.getSourceConnectionProfile()).providerId,
azdata.DataProviderType.QueryProvider);
const connectionProfile = await getSourceConnectionProfile();
const queryProvider = await getSourceConnectionQueryProvider();
let username = '';
try {
const query = 'select SUSER_NAME()';
const ownerUri = await azdata.connection.getUriForConnection(this.migrationStateModel.sourceConnectionId);
const ownerUri = await getSourceConnectionUri();
const results = await queryProvider.runQueryAndReturn(ownerUri, query);
username = results.rows[0][0]?.displayValue;
} catch (e) {
@@ -825,7 +823,7 @@ export class DatabaseBackupPage extends MigrationWizardPage {
connectionProfile.serverName);
this._sqlSourceUsernameInput.value = username;
this._sqlSourcePassword.value = (await azdata.connection.getCredentials(this.migrationStateModel.sourceConnectionId)).password;
this._sqlSourcePassword.value = (await getSourceConnectionCredentials()).password;
this._windowsUserAccountText.value =
this.migrationStateModel._databaseBackup.networkShares[0]?.windowsUser

View File

@@ -11,7 +11,7 @@ import * as constants from '../constants/strings';
import { debounce } from '../api/utils';
import * as styles from '../constants/styles';
import { IconPathHelper } from '../constants/iconPathHelper';
import { getDatabasesList, excludeDatabases, SourceDatabaseInfo } from '../api/sqlUtils';
import { getDatabasesList, excludeDatabases, SourceDatabaseInfo, getSourceConnectionProfile } from '../api/sqlUtils';
export class DatabaseSelectorPage extends MigrationWizardPage {
private _view!: azdata.ModelView;
@@ -228,7 +228,7 @@ export class DatabaseSelectorPage extends MigrationWizardPage {
}
private async _loadDatabaseList(stateMachine: MigrationStateModel, selectedDatabases: string[]): Promise<void> {
const allDatabases = (<azdata.DatabaseInfo[]>await getDatabasesList(await stateMachine.getSourceConnectionProfile()));
const allDatabases = (<azdata.DatabaseInfo[]>await getDatabasesList(await getSourceConnectionProfile()));
const databaseList = allDatabases
.filter(database => !excludeDatabases.includes(database.options.name))

View File

@@ -14,7 +14,7 @@ import { WIZARD_INPUT_COMPONENT_WIDTH } from './wizardController';
import * as utils from '../api/utils';
import { azureResource } from 'azurecore';
import { AzureSqlDatabaseServer, getVMInstanceView, SqlVMServer } from '../api/azure';
import { collectSourceLogins, collectTargetLogins, isSysAdmin, LoginTableInfo } from '../api/sqlUtils';
import { collectSourceLogins, collectTargetLogins, getSourceConnectionId, getSourceConnectionProfile, isSourceConnectionSysAdmin, LoginTableInfo } from '../api/sqlUtils';
import { NetworkInterfaceModel } from '../api/dataModels/azure/networkInterfaceModel';
export class LoginMigrationTargetSelectionPage extends MigrationWizardPage {
@@ -66,8 +66,8 @@ export class LoginMigrationTargetSelectionPage extends MigrationWizardPage {
CSSStyles: { ...styles.BODY_CSS }
}).component();
const hasSysAdminPermissions: boolean = await isSysAdmin(this.migrationStateModel.sourceConnectionId);
const connectionProfile: azdata.connection.ConnectionProfile = await this.migrationStateModel.getSourceConnectionProfile();
const hasSysAdminPermissions: boolean = await isSourceConnectionSysAdmin();
const connectionProfile: azdata.connection.ConnectionProfile = await getSourceConnectionProfile();
const permissionsInfoBox = this._view.modelBuilder.infoBox()
.withProps({
style: 'warning',
@@ -331,7 +331,7 @@ export class LoginMigrationTargetSelectionPage extends MigrationWizardPage {
// Collect source login info here, as it will speed up loading the next page
const sourceLogins: LoginTableInfo[] = [];
sourceLogins.push(...await collectSourceLogins(
this.migrationStateModel.sourceConnectionId,
await getSourceConnectionId(),
this.migrationStateModel.isWindowsAuthMigrationSupported));
this.migrationStateModel._loginMigrationModel.collectedSourceLogins = true;
this.migrationStateModel._loginMigrationModel.loginsOnSource = sourceLogins;

View File

@@ -10,7 +10,7 @@ import { MigrationStateModel, StateChangeEvent } from '../models/stateMachine';
import * as constants from '../constants/strings';
import { debounce, getLoginStatusImage, getLoginStatusMessage } from '../api/utils';
import * as styles from '../constants/styles';
import { collectSourceLogins, collectTargetLogins, LoginTableInfo } from '../api/sqlUtils';
import { collectSourceLogins, collectTargetLogins, getSourceConnectionId, LoginTableInfo } from '../api/sqlUtils';
import { IconPathHelper } from '../constants/iconPathHelper';
import * as utils from '../api/utils';
import { LoginType } from '../models/loginMigrationModel';
@@ -352,7 +352,7 @@ export class LoginSelectorPage extends MigrationWizardPage {
// execute a query against the source to get the logins
try {
sourceLogins.push(...await collectSourceLogins(
stateMachine.sourceConnectionId,
await getSourceConnectionId(),
stateMachine.isWindowsAuthMigrationSupported));
stateMachine._loginMigrationModel.collectedSourceLogins = true;
stateMachine._loginMigrationModel.loginsOnSource = sourceLogins;

View File

@@ -22,6 +22,7 @@ import { logError, TelemetryViews } from '../telemetry';
import { TdeConfigurationDialog } from '../dialog/tdeConfiguration/tdeConfigurationDialog';
import { TdeMigrationModel } from '../models/tdeModels';
import * as os from 'os';
import { getSourceConnectionProfile } from '../api/sqlUtils';
export interface Product {
type: MigrationTargetType;
@@ -404,7 +405,7 @@ export class SKURecommendationPage extends MigrationWizardPage {
CSSStyles: { 'margin': '12px 0' }
}).component();
this._serverName = this.migrationStateModel.serverName || (await this.migrationStateModel.getSourceConnectionProfile()).serverName;
this._serverName = this.migrationStateModel.serverName || (await getSourceConnectionProfile()).serverName;
const miDialog = new AssessmentResultsDialog('ownerUri', this.migrationStateModel, constants.ASSESSMENT_TILE(this._serverName), this, MigrationTargetType.SQLMI);
const vmDialog = new AssessmentResultsDialog('ownerUri', this.migrationStateModel, constants.ASSESSMENT_TILE(this._serverName), this, MigrationTargetType.SQLVM);

View File

@@ -9,6 +9,7 @@ import { MigrationWizardPage } from '../models/migrationWizardPage';
import { MigrationSourceAuthenticationType, MigrationStateModel, StateChangeEvent } from '../models/stateMachine';
import * as constants from '../constants/strings';
import { createLabelTextComponent, createHeadingTextComponent, WIZARD_INPUT_COMPONENT_WIDTH } from './wizardController';
import { getSourceConnectionCredentials, getSourceConnectionProfile, getSourceConnectionUri } from '../api/sqlUtils';
export class SqlSourceConfigurationPage extends MigrationWizardPage {
private _view!: azdata.ModelView;
@@ -51,10 +52,10 @@ export class SqlSourceConfigurationPage extends MigrationWizardPage {
private async createSourceCredentialContainer(): Promise<azdata.FormComponent> {
const connectionProfile = await this.migrationStateModel.getSourceConnectionProfile();
const queryProvider = azdata.dataprotocol.getProvider<azdata.QueryProvider>((await this.migrationStateModel.getSourceConnectionProfile()).providerId, azdata.DataProviderType.QueryProvider);
const connectionProfile = await getSourceConnectionProfile();
const queryProvider = azdata.dataprotocol.getProvider<azdata.QueryProvider>(connectionProfile.providerId, azdata.DataProviderType.QueryProvider);
const query = 'select SUSER_NAME()';
const results = await queryProvider.runQueryAndReturn(await (azdata.connection.getUriForConnection(this.migrationStateModel.sourceConnectionId)), query);
const results = await queryProvider.runQueryAndReturn(await getSourceConnectionUri(), query);
const username = results.rows[0][0].displayValue;
this.migrationStateModel._authenticationType = connectionProfile.authenticationType === azdata.connection.AuthenticationType.SqlLogin
? MigrationSourceAuthenticationType.Sql
@@ -129,7 +130,7 @@ export class SqlSourceConfigurationPage extends MigrationWizardPage {
}
}).component();
this._password = this._view.modelBuilder.inputBox().withProps({
value: (await azdata.connection.getCredentials(this.migrationStateModel.sourceConnectionId)).password,
value: (await getSourceConnectionCredentials()).password,
required: true,
inputType: 'password',
width: WIZARD_INPUT_COMPONENT_WIDTH

View File

@@ -22,6 +22,7 @@ import * as styles from '../constants/styles';
import { MigrationLocalStorage, MigrationServiceContext } from '../models/migrationLocalStorage';
import { azureResource } from 'azurecore';
import { ServiceContextChangeEvent } from '../dashboard/tabBase';
import { getSourceConnectionProfile } from '../api/sqlUtils';
export const WIZARD_INPUT_COMPONENT_WIDTH = '600px';
export class WizardController {
@@ -33,7 +34,7 @@ export class WizardController {
private readonly _serviceContextChangedEvent: vscode.EventEmitter<ServiceContextChangeEvent>) {
}
public async openWizard(connectionId: string): Promise<void> {
public async openWizard(): Promise<void> {
const api = (await vscode.extensions.getExtension(mssql.extension.name)?.activate()) as mssql.IExtension;
if (api) {
this.extensionContext.subscriptions.push(this._model);
@@ -41,7 +42,7 @@ export class WizardController {
}
}
public async openLoginWizard(connectionId: string): Promise<void> {
public async openLoginWizard(): Promise<void> {
const api = (await vscode.extensions.getExtension(mssql.extension.name)?.activate()) as mssql.IExtension;
if (api) {
this.extensionContext.subscriptions.push(this._model);
@@ -50,7 +51,7 @@ export class WizardController {
}
private async createWizard(stateModel: MigrationStateModel): Promise<void> {
const serverName = (await stateModel.getSourceConnectionProfile()).serverName;
const serverName = (await getSourceConnectionProfile()).serverName;
this._wizardObject = azdata.window.createWizard(
loc.WIZARD_TITLE(serverName),
'MigrationWizard',
@@ -198,7 +199,7 @@ export class WizardController {
}
private async createLoginWizard(stateModel: MigrationStateModel): Promise<void> {
const serverName = (await stateModel.getSourceConnectionProfile()).serverName;
const serverName = (await getSourceConnectionProfile()).serverName;
this._wizardObject = azdata.window.createWizard(
loc.LOGIN_WIZARD_TITLE(serverName),
'LoginMigrationWizard',