mirror of
https://github.com/ckaczor/azuredatastudio.git
synced 2026-01-17 01:25:36 -05:00
Add support for AAD interactive connection strings for project data sources (#11761)
* add support for AAD interactive for project data sources * fix whitespace * remove warning message * choose azureMFA if a connection string has both integrated security=true and authentication=active directory interactive
This commit is contained in:
@@ -77,7 +77,6 @@ export const selectConnectionRadioButtonsTitle = localize('selectconnectionRadio
|
||||
export const dataSourceDropdownTitle = localize('dataSourceDropdownTitle', "Data source");
|
||||
export const noDataSourcesText = localize('noDataSourcesText', "No data sources in this project");
|
||||
export const loadProfileButtonText = localize('loadProfileButtonText', "Load Profile...");
|
||||
export const profileWarningText = localize('profileWarningText', "⚠ Warning: Connection strings using AAD Authentication are not supported at this time");
|
||||
export const profileReadError = localize('profileReadError', "Could not load the profile file.");
|
||||
export const sqlCmdTableLabel = localize('sqlCmdTableLabel', "SQLCMD Variables");
|
||||
export const sqlCmdVariableColumn = localize('sqlCmdVariableColumn', "Variable");
|
||||
@@ -197,9 +196,16 @@ export const targetConnectionString = 'TargetConnectionString';
|
||||
export const initialCatalogSetting = 'Initial Catalog';
|
||||
export const dataSourceSetting = 'Data Source';
|
||||
export const integratedSecuritySetting = 'Integrated Security';
|
||||
export const authenticationSetting = 'Authentication';
|
||||
export const activeDirectoryInteractive = 'active directory interactive';
|
||||
export const userIdSetting = 'User ID';
|
||||
export const passwordSetting = 'Password';
|
||||
|
||||
// Authentication types
|
||||
export const integratedAuth = 'Integrated';
|
||||
export const azureMfaAuth = 'AzureMFA';
|
||||
export const sqlAuth = 'SqlAuth';
|
||||
|
||||
// Tree item types
|
||||
export enum DatabaseProjectItemType {
|
||||
project = 'databaseProject.itemType.project',
|
||||
|
||||
@@ -122,7 +122,7 @@ export class PublishDatabaseDialog {
|
||||
title: constants.targetDatabaseSettings,
|
||||
components: [
|
||||
{
|
||||
title: constants.profileWarningText,
|
||||
title: '',
|
||||
component: <azdata.ButtonComponent>this.loadProfileButton
|
||||
},
|
||||
/* TODO : enable using this when data source creation is enabled
|
||||
|
||||
@@ -35,7 +35,21 @@ export class SqlConnectionDataSource extends DataSource {
|
||||
}
|
||||
|
||||
public get integratedSecurity(): boolean {
|
||||
return this.getSetting(constants.integratedSecuritySetting).toLowerCase() === 'true';
|
||||
return this.getSetting(constants.integratedSecuritySetting)?.toLowerCase() === 'true';
|
||||
}
|
||||
|
||||
public get azureMFA(): boolean {
|
||||
return this.getSetting(constants.authenticationSetting)?.toLowerCase().includes(constants.activeDirectoryInteractive);
|
||||
}
|
||||
|
||||
public get authType(): string {
|
||||
if (this.azureMFA) {
|
||||
return constants.azureMfaAuth;
|
||||
} else if (this.integratedSecurity) {
|
||||
return constants.integratedAuth;
|
||||
} else {
|
||||
return constants.sqlAuth;
|
||||
}
|
||||
}
|
||||
|
||||
public get username(): string {
|
||||
@@ -79,7 +93,7 @@ export class SqlConnectionDataSource extends DataSource {
|
||||
connectionName: this.name,
|
||||
userName: this.username,
|
||||
password: this.password,
|
||||
authenticationType: this.integratedSecurity ? 'Integrated' : 'SqlAuth',
|
||||
authenticationType: this.authType,
|
||||
savePassword: false,
|
||||
providerName: 'MSSQL',
|
||||
saveProfile: true,
|
||||
|
||||
@@ -16,6 +16,14 @@
|
||||
"data": {
|
||||
"connectionString": "Data Source=.;Initial Catalog=testDb2;Integrated Security=False"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "AAD Interactive Data Source",
|
||||
"type": "sql_connection_string",
|
||||
"version": "0.0.0",
|
||||
"data": {
|
||||
"connectionString": "Data Source=.;Initial Catalog=testDb3;Authentication='Active Directory Interactive'"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
@@ -18,7 +18,7 @@ describe.skip('Data Sources: DataSource operations', function (): void {
|
||||
const dataSourcePath = await testUtils.createTestDataSources(baselines.openDataSourcesBaseline);
|
||||
const dataSourceList = await dataSources.load(dataSourcePath);
|
||||
|
||||
should(dataSourceList.length).equal(2);
|
||||
should(dataSourceList.length).equal(3);
|
||||
|
||||
should(dataSourceList[0].name).equal('Test Data Source 1');
|
||||
should(dataSourceList[0].type).equal(sql.SqlConnectionDataSource.type);
|
||||
@@ -26,5 +26,9 @@ describe.skip('Data Sources: DataSource operations', function (): void {
|
||||
|
||||
should(dataSourceList[1].name).equal('My Other Data Source');
|
||||
should((dataSourceList[1] as sql.SqlConnectionDataSource).integratedSecurity).equal(false);
|
||||
|
||||
should(dataSourceList[2].name).equal('AAD Interactive Data Source');
|
||||
should((dataSourceList[2] as sql.SqlConnectionDataSource).integratedSecurity).equal(false);
|
||||
should((dataSourceList[2] as sql.SqlConnectionDataSource).azureMFA).equal(true);
|
||||
});
|
||||
});
|
||||
|
||||
@@ -84,7 +84,7 @@ describe('ProjectsController', function (): void {
|
||||
const project = await projController.openProject(vscode.Uri.file(sqlProjPath));
|
||||
|
||||
should(project.files.length).equal(9); // detailed sqlproj tests in their own test file
|
||||
should(project.dataSources.length).equal(2); // detailed datasources tests in their own test file
|
||||
should(project.dataSources.length).equal(3); // detailed datasources tests in their own test file
|
||||
});
|
||||
|
||||
it('Should load both project and referenced project', async function (): Promise<void> {
|
||||
|
||||
Reference in New Issue
Block a user