import { useBoolean } from "@fluentui/react-hooks"; import { userContext } from "UserContext"; import { useNewPortalBackendEndpoint } from "Utils/EndpointUtils"; import * as React from "react"; import ConnectImage from "../../../../images/HdeConnectCosmosDB.svg"; import ErrorImage from "../../../../images/error.svg"; import { AuthType } from "../../../AuthType"; import { BackendApi, HttpHeaders } from "../../../Common/Constants"; import { configContext } from "../../../ConfigContext"; import { GenerateTokenResponse } from "../../../Contracts/DataModels"; import { isResourceTokenConnectionString } from "../Helpers/ResourceTokenUtils"; interface Props { connectionString: string; login: () => void; setEncryptedToken: (token: string) => void; setConnectionString: (connectionString: string) => void; setAuthType: (authType: AuthType) => void; } export const fetchEncryptedToken = async (connectionString: string): Promise => { if (!useNewPortalBackendEndpoint(BackendApi.GenerateToken)) { return await fetchEncryptedToken_ToBeDeprecated(connectionString); } const headers = new Headers(); headers.append(HttpHeaders.connectionString, connectionString); const url = configContext.PORTAL_BACKEND_ENDPOINT + "/api/connectionstring/token/generatetoken"; const response = await fetch(url, { headers, method: "POST" }); if (!response.ok) { throw response; } const encryptedTokenResponse: string = await response.json(); return decodeURIComponent(encryptedTokenResponse); }; export const fetchEncryptedToken_ToBeDeprecated = async (connectionString: string): Promise => { const headers = new Headers(); headers.append(HttpHeaders.connectionString, connectionString); const url = configContext.BACKEND_ENDPOINT + "/api/guest/tokens/generateToken"; const response = await fetch(url, { headers, method: "POST" }); if (!response.ok) { throw response; } // This API has a quirk where it must be parsed twice const result: GenerateTokenResponse = JSON.parse(await response.json()); return decodeURIComponent(result.readWrite || result.read); }; export const isAccountRestrictedForConnectionStringLogin = async (connectionString: string): Promise => { const headers = new Headers(); headers.append(HttpHeaders.connectionString, connectionString); const backendEndpoint: string = useNewPortalBackendEndpoint(BackendApi.PortalSettings) ? configContext.PORTAL_BACKEND_ENDPOINT : configContext.BACKEND_ENDPOINT; const url = backendEndpoint + "/api/guest/accountrestrictions/checkconnectionstringlogin"; const response = await fetch(url, { headers, method: "POST" }); if (!response.ok) { throw response; } return (await response.text()).toLowerCase() === "true"; }; export const ConnectExplorer: React.FunctionComponent = ({ setEncryptedToken, login, setAuthType, connectionString, setConnectionString, }: Props) => { const [isFormVisible, { setTrue: showForm }] = useBoolean(false); const [errorMessage, setErrorMessage] = React.useState(""); const enableConnectionStringLogin = !userContext.features.disableConnectionStringLogin; return (

Azure Cosmos DB

Welcome to Azure Cosmos DB

{isFormVisible && enableConnectionStringLogin ? (
{ event.preventDefault(); setErrorMessage(""); if (await isAccountRestrictedForConnectionStringLogin(connectionString)) { setErrorMessage( "This account has been blocked from connection-string login. Please go to cosmos.azure.com/aad for AAD based login.", ); return; } if (isResourceTokenConnectionString(connectionString)) { setAuthType(AuthType.ResourceToken); return; } const encryptedToken = await fetchEncryptedToken(connectionString); setEncryptedToken(encryptedToken); setAuthType(AuthType.ConnectionString); }} >

Connect to your account with connection string

{ setConnectionString(event.target.value); }} /> {errorMessage.length > 0 && ( Error notification {errorMessage} )}

Sign In with Azure Account

) : (
{enableConnectionStringLogin && (

Connect to your account with connection string

)}
)}
); };