Skip to content

Commit 4a88165

Browse files
sakshigupta12febSakshi Gupta
andauthored
added a pop up in click of mongo shell if its entra only flow (#2531)
* added a pop up in click of mongo shell if its entra only flow * formatting updated --------- Co-authored-by: Sakshi Gupta <sakshig@microsoft.com>
1 parent f678f55 commit 4a88165

6 files changed

Lines changed: 97 additions & 13 deletions

File tree

‎src/Explorer/Menus/CommandBar/CommandBarComponentButtonFactory.tsx‎

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,16 @@ import { AuthType } from "../../../AuthType";
1919
import * as Constants from "../../../Common/Constants";
2020
import { Platform, configContext } from "../../../ConfigContext";
2121
import * as ViewModels from "../../../Contracts/ViewModels";
22-
import { userContext } from "../../../UserContext";
22+
import {
23+
userContext,
24+
isVCoreMongoNativeAuthDisabled,
25+
VCoreMongoNativeAuthDisabledMessage,
26+
VCoreMongoNativeAuthLearnMoreUrl,
27+
} from "../../../UserContext";
2328
import { isRunningOnNationalCloud } from "../../../Utils/CloudUtils";
2429
import { useSidePanel } from "../../../hooks/useSidePanel";
2530
import { CommandButtonComponentProps } from "../../Controls/CommandButton/CommandButtonComponent";
31+
import { useDialog } from "../../Controls/Dialog";
2632
import Explorer from "../../Explorer";
2733
import { useNotebook } from "../../Notebook/useNotebook";
2834
import { BrowseQueriesPane } from "../../Panes/BrowseQueriesPane/BrowseQueriesPane";
@@ -499,12 +505,21 @@ function createOpenTerminalButtonByKind(
499505
const label = `Open ${terminalFriendlyName()} shell`;
500506
const tooltip =
501507
"This feature is not yet available in your account's region. View supported regions here: https://aka.ms/cosmos-enable-notebooks.";
508+
const isNativeAuthDisabled = terminalKind === ViewModels.TerminalKind.VCoreMongo && isVCoreMongoNativeAuthDisabled();
502509
const disableButton =
503-
!useNotebook.getState().isNotebooksEnabledForAccount && !useNotebook.getState().isNotebookEnabled;
510+
(!useNotebook.getState().isNotebooksEnabledForAccount && !useNotebook.getState().isNotebookEnabled) ||
511+
isNativeAuthDisabled;
504512
return {
505513
iconSrc: HostedTerminalIcon,
506514
iconAlt: label,
507515
onCommandClick: () => {
516+
if (isNativeAuthDisabled) {
517+
useDialog.getState().showOkModalDialog("Native Authentication Disabled", VCoreMongoNativeAuthDisabledMessage, {
518+
linkText: "Learn more",
519+
linkUrl: VCoreMongoNativeAuthLearnMoreUrl,
520+
});
521+
return;
522+
}
508523
if (useNotebook.getState().isNotebookEnabled || userContext.features.enableCloudShell) {
509524
container.openNotebookTerminal(terminalKind);
510525
}
@@ -513,7 +528,7 @@ function createOpenTerminalButtonByKind(
513528
hasPopup: false,
514529
disabled: disableButton,
515530
ariaLabel: label,
516-
tooltipText: !disableButton ? "" : tooltip,
531+
tooltipText: isNativeAuthDisabled ? VCoreMongoNativeAuthDisabledMessage : !disableButton ? "" : tooltip,
517532
};
518533
}
519534

‎src/Explorer/SplashScreen/SplashScreen.tsx‎

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,14 @@ import QuickStartIcon from "../../../images/Quickstart_Lightning.svg";
3333
import VisualStudioIcon from "../../../images/VisualStudio.svg";
3434
import CollectionIcon from "../../../images/tree-collection.svg";
3535
import * as Constants from "../../Common/Constants";
36-
import { userContext } from "../../UserContext";
36+
import {
37+
isVCoreMongoNativeAuthDisabled,
38+
userContext,
39+
VCoreMongoNativeAuthDisabledMessage,
40+
VCoreMongoNativeAuthLearnMoreUrl,
41+
} from "../../UserContext";
3742
import { getCollectionName } from "../../Utils/APITypeUtils";
43+
import { useDialog } from "../Controls/Dialog";
3844
import Explorer from "../Explorer";
3945
import * as MostRecentActivity from "../MostRecentActivity/MostRecentActivity";
4046
import { useNotebook } from "../Notebook/useNotebook";
@@ -413,11 +419,23 @@ export const SplashScreen: React.FC<SplashScreenProps> = ({ explorer }) => {
413419
}
414420

415421
if (userContext.apiType === "VCoreMongo") {
422+
const isNativeAuthDisabled = isVCoreMongoNativeAuthDisabled();
416423
return {
417424
iconSrc: PowerShellIcon,
418425
title: t(Keys.splashScreen.shell.vcoreMongo.title),
419426
description: t(Keys.splashScreen.shell.vcoreMongo.description),
420-
onClick: () => container.openNotebookTerminal(TerminalKind.VCoreMongo),
427+
onClick: () => {
428+
if (isNativeAuthDisabled) {
429+
useDialog
430+
.getState()
431+
.showOkModalDialog("Native Authentication Disabled", VCoreMongoNativeAuthDisabledMessage, {
432+
linkText: "Learn more",
433+
linkUrl: VCoreMongoNativeAuthLearnMoreUrl,
434+
});
435+
} else {
436+
container.openNotebookTerminal(TerminalKind.VCoreMongo);
437+
}
438+
},
421439
};
422440
}
423441

‎src/Explorer/Tabs/VCoreMongoQuickstartTab.tsx‎

Lines changed: 28 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,44 @@
1-
import { Stack } from "@fluentui/react";
1+
import { Link, MessageBar, MessageBarType, Stack, Text } from "@fluentui/react";
22

33
import { TerminalKind } from "Contracts/ViewModels";
44
import { VcoreMongoQuickstartGuide } from "Explorer/Quickstart/VCoreMongoQuickstartGuide";
55
import { CloudShellTerminalComponent } from "Explorer/Tabs/CloudShellTab/CloudShellTerminalComponent";
6-
import { userContext } from "UserContext";
6+
import {
7+
isVCoreMongoNativeAuthDisabled,
8+
userContext,
9+
VCoreMongoNativeAuthDisabledMessage,
10+
VCoreMongoNativeAuthLearnMoreUrl,
11+
} from "UserContext";
712
import React from "react";
813

914
export const VcoreMongoQuickstartTab: React.FC = (): JSX.Element => {
15+
const isNativeAuthDisabled = isVCoreMongoNativeAuthDisabled();
16+
1017
return (
1118
<Stack style={{ width: "100%" }} horizontal>
1219
<Stack style={{ width: "50%" }}>
1320
<VcoreMongoQuickstartGuide />
1421
</Stack>
1522
<Stack style={{ width: "50%", borderLeft: "black solid 1px" }}>
16-
<CloudShellTerminalComponent
17-
databaseAccount={userContext.databaseAccount}
18-
tabId="QuickstartVcoreMongoShell"
19-
username={userContext.vcoreMongoConnectionParams?.adminLogin}
20-
shellType={TerminalKind.VCoreMongo}
21-
/>
23+
{isNativeAuthDisabled ? (
24+
<Stack style={{ margin: "auto", padding: 20 }}>
25+
<MessageBar messageBarType={MessageBarType.warning} isMultiline={true}>
26+
<Text>
27+
{VCoreMongoNativeAuthDisabledMessage}{" "}
28+
<Link href={VCoreMongoNativeAuthLearnMoreUrl} target="_blank">
29+
Learn more
30+
</Link>
31+
</Text>
32+
</MessageBar>
33+
</Stack>
34+
) : (
35+
<CloudShellTerminalComponent
36+
databaseAccount={userContext.databaseAccount}
37+
tabId="QuickstartVcoreMongoShell"
38+
username={userContext.vcoreMongoConnectionParams?.adminLogin}
39+
shellType={TerminalKind.VCoreMongo}
40+
/>
41+
)}
2242
</Stack>
2343
</Stack>
2444
);

‎src/Platform/Hosted/extractFeatures.ts‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ export type Features = {
3636
readonly enableContainerCopy: boolean;
3737
readonly enableCloudShell: boolean;
3838
readonly enableRestoreContainer: boolean; // only for Fabric
39+
readonly mongoDisableNativeAuth: boolean;
3940

4041
// can be set via both flight and feature flag
4142
autoscaleDefault: boolean;
@@ -103,6 +104,7 @@ export function extractFeatures(given = new URLSearchParams(window.location.sear
103104
enableContainerCopy: "true" === get("enablecontainercopy"),
104105
enableRestoreContainer: "true" === get("enablerestorecontainer"),
105106
enableCloudShell: true,
107+
mongoDisableNativeAuth: "true" === get("mongodisablenativeauth"),
106108
};
107109
}
108110

‎src/UserContext.ts‎

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,9 +42,37 @@ export interface PostgresConnectionStrParams {
4242
isFreeTier: boolean;
4343
}
4444

45+
export type VCoreMongoAuthMode = "NativeAuth" | "MicrosoftEntraID";
46+
47+
export interface VCoreMongoAuthConfig {
48+
allowedModes?: VCoreMongoAuthMode[];
49+
}
50+
4551
export interface VCoreMongoConnectionParams {
4652
adminLogin: string;
4753
connectionString: string;
54+
authConfig?: VCoreMongoAuthConfig;
55+
isNativeAuthDisabled?: boolean;
56+
}
57+
58+
export const VCoreMongoNativeAuthLearnMoreUrl = "https://go.microsoft.com/fwlink/?linkid=2340100";
59+
60+
export const VCoreMongoNativeAuthDisabledMessage =
61+
"Native DocumentDB authentication is disabled on this cluster. You can use MongoDB Shell with Entra ID authentication outside of the Azure portal.";
62+
63+
export function isVCoreMongoNativeAuthDisabled(): boolean {
64+
if (userContext.features?.mongoDisableNativeAuth) {
65+
return true;
66+
}
67+
const params = userContext.vcoreMongoConnectionParams;
68+
if (!params) {
69+
return false;
70+
}
71+
if (params.isNativeAuthDisabled) {
72+
return true;
73+
}
74+
const allowedModes = params.authConfig?.allowedModes || [];
75+
return allowedModes.length > 0 && !allowedModes.includes("NativeAuth");
4876
}
4977

5078
export interface FabricArtifactInfo {

‎src/Utils/AuthorizationUtils.test.ts‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ describe("AuthorizationUtils", () => {
4848
partitionKeyDefault2: false,
4949
notebooksDownBanner: false,
5050
enableRestoreContainer: false,
51+
mongoDisableNativeAuth: false,
5152
},
5253
});
5354
};

0 commit comments

Comments
 (0)