* Add client-side connection-string login for SQL, Tables, and Gremlin
SQL, Tables, and Gremlin now sign data-plane requests client-side with the account key and skip the Portal Backend proxy (generatetoken/accessinputmetadata/authorizationtokens). Adds client-side host/account validation mirroring the backend ValidateHostAndAccount, plus a real CosmosClient connectivity probe that gates opening the Data Explorer. Mongo and Cassandra continue to use the encrypted-token proxy path.
* Localize connection-string login validation and connectivity messages
Move the hardcoded SQL/Tables/Gremlin connection-string login strings into en/Resources.json and reference them via the type-safe Keys object (t(Keys.connectExplorer.errors.*)).
* Drop unused mongodb:// branch from endpoint host extraction
* Remove Data Explorer references from connectivity probe comment
* Reword proxy reference in ConnectionString comment
* Fix trailing whitespace in connectivity probe comment
* Send connection string in Authorization header for Mongo/Cassandra token request
* Add E2E connection string login tests for SQL, Gremlin, and Tables
* Add wrong account key test for SQL connection string login
* Add access token to authorization header for encrypted token flow
* Wire connection string login E2E tests to dedicated connstring accounts in CI
Add TestAuthType and fold connection-string account resolution into getAccountName; seed and target the dedicated *-connstring accounts in CI while falling back to the standard per-API account locally.
* Handle connection string account types in getTestExplorerUrl switch
* Move globalThis.crypto polyfill to fx.ts so it runs for all specs
* Remove connection string validation for connection string login
- Remove validateDirectConnectionStringLogin and its helpers (extractEndpointHostFromConnectionString, extractHostToken, directLoginAllowlistedEndpointZones)
- Remove old extractMasterKeyfromConnectionString (Gremlin-specific), rename extractAccountKeyFromConnectionString to extractMasterKeyfromConnectionString
- Change validateDirectConnectionStringConnectivity to throw on error instead of returning string|undefined
- Simplify direct-login flow: submit connection string to CosmosClient as-is, no format or endpoint validation
- Keep connectivity pre-check (throws if CosmosClient cannot reach account)
- Remove 6 unused localization keys for validation errors
- Update tests to match new behavior
* Send authorization header for connection string login backend calls
* Simplify connection string login error handling
- Lift the login error state into HostedExplorer so failures from the connect form and from a postMessage login share one source of truth
- Show the message returned by the service instead of falling back to a generic unreachable message
- Move isAuthorizationError into AuthorizationUtils alongside the other shared auth helpers
- Widen getErrorMessage to accept unknown so catch variables no longer need a cast
- Show the connect screen error tooltip beside the icon and widen it so long service messages fit
- Consolidate the repeated account lookup and login steps in the SQL connection string spec
* Consolidate hosted login account metadata into a single state
Encrypted-token and direct connection-string logins now write to one accountMetadata state instead of two, which also fixes the connect form staying mounted after a successful SQL/Tables/Gremlin login. Deletes the now-unused useTokenMetadata hook and moves fetchAccessData to Platform/Hosted/Helpers/PortalAccessData.ts.
* Accept connection string logins without validating them
SQL, Tables, and Gremlin logins probed the account before signing in, so a user whose key was wrong or whose account was unreachable was blocked at the connect form. The probe is now gone: the connection string is accepted as-is and any bad key surfaces on the data-plane requests made from inside the explorer.
Removes validateDirectConnectionStringConnectivity, isAuthorizationError, and the connectExplorer.errors.connectFailed string along with their tests.
Also takes documentEndpoint straight from the AccountEndpoint in SQL and Gremlin connection strings instead of rebuilding it from the account name and a hardcoded DNS zone. Tables still derives it, since a Tables connection string only carries the table endpoint.
* Keep the connect form login error local to ConnectExplorer
The error state was lifted into HostedExplorer so a postMessage login could report failures, which meant the connect screen needed a second copy of the error markup for the AAD view. That copy fell outside the connectExplorerContent selector the tooltip styles are scoped to, so it rendered the message as unstyled inline text.
Move the state back into ConnectExplorer and let connectWithConnectionString log the failure as it did before. A failed postMessage login still leaves the user on the connect screen either way.
* Move Portal Backend calls into a PortalBackendClient helper
fetchEncryptedToken and isAccountRestrictedForConnectionStringLogin lived in ConnectExplorer.tsx, so HostedExplorer imported a network call from a React component. Merge them with fetchAccessData into src/Platform/Hosted/Helpers/PortalBackendClient.ts along with the PortalBackendError type, leaving ConnectExplorer as UI only.
* Leave the encrypted token login path as it is on master
The direct connection string login work does not change how Mongo and Cassandra logins fail, so drop the 401/403 handling this branch added around fetchEncryptedToken along with the now unused isAuthorizationError helper.
* Move the Portal Backend connection string calls out of Helpers
Helpers holds pure string utilities, and every other *Client in the repo sits at its domain root, so name the module for the endpoints it wraps and place it beside HostedUtils. Also drop the branch's ConnectScreen.less tooltip restyle, which was unrelated to connection string login.
* Move the Portal Backend client to Common
The module is a plain service client with no dependency on the hosted platform, and CosmosClient and MetricEvents already hand roll their own Portal Backend calls, so Common is where a shared client belongs.
* Add an E2E test that SQL connection string login skips the Portal Backend
Nothing asserted the defining behavior of the direct login path, so reverting the short-circuit in connectWithConnectionString would have gone unnoticed. The listener filters on the connectionstring route so it covers both generatetoken and accessinputmetadata, and leaves the account restriction check alone since that still runs for every API.
* Refer to the Table API as Table in comments
The comments added by this branch alternated between Table and Tables when naming the API alongside SQL and Gremlin. TablesDB is left alone since that is the literal database name, as is the plural noun where it refers to actual tables.
---------
Co-authored-by: Asier Isayas <aisayas@microsoft.com>
* Add standin region selection to settings menu.
* Retrieve read and write regions from user context and populate dropdown menu. Update local storage value.
Need to now connect with updating read region of primary cosmos client.
* Change to only selecting region for cosmos client. Not setting up separate read and write clients.
* Add read and write endpoint logging to cosmos client.
* Pass changing endpoint from settings menu to client. Encountered token issues using new endpoint in client.
* Rough implementation of region selection of endpoint for cosmos client. Still need to:
1 - Use separate context var to track selected region. Directly updating database account context throws off token generation by acquireMSALTokenForAccount
2 - Remove href overrides in acquireMSALTokenForAccount.
* Update region selection to include global endpoint and generate a unique list of read and write endpoints.
Need to continue with clearing out selected endpoint when global is selected again.
Write operations stall when read region is selected even though 403 returned when region rejects operation.
Need to limit feature availablility to nosql, table, gremlin (maybe).
* Update cosmos client to fix bug.
Clients continuously generate after changing RBAC setting.
* Swapping back to default endpoint value.
* Rebase on client refresh bug fix.
* Enable region selection for NoSql, Table, Gremlin
* Add logic to reset regional endpoint when global is selected.
* Fix state changing when selecting region or resetting to global.
* Rough implementation of configuring regional endpoint when DE is loaded in portal or hosted with AAD/Entra auth.
* Ininitial attempt at adding error handling, but still having issues with errors caught at proxy plugin.
* Added rough error handling in local requestPlugin used in local environments. Passes new error to calling code.
Might need to add specific error handling for request plugin to the handleError class.
* Change how request plugin returns error so existing error handling utility can process and present error.
* Only enable region selection for nosql accounts.
* Limit region selection to portal and hosted AAD auth. SQL accounts only. Could possibly enable on table and gremlin later.
* Update error handling to account for generic error code.
* Refactor error code extraction.
* Update test snapshots and remove unneeded logging.
* Change error handling to use only the message rather than casting to any.
* Clean up debug logging in cosmos client.
* Remove unused storage keys.
* Use endpoint instead of region name to track selected region. Prevents having to do endpoint lookups.
* Add initial button state update depending on region selection.
Need to update with the API and react to user context changes.
* Disable CRUD buttons when read region selected.
* Default to write enabled in react.
* Disable query saving when read region is selected.
* Patch clientWidth error on conflicts tab.
* Resolve merge conflicts from rebase.
* Make sure proxy endpoints return in all cases.
* Remove excess client logging and match main for ConflictsTab.
* Cleaning up logging and fixing endpoint discovery bug.
* Fix formatting.
* Reformatting if statements with preferred formatting.
* Migrate region selection to local persistence. Fixes account swapping bug.
TODO: Inspect better way to reset interface elements when deleteAllStates is called. Need to react to regional endpoint being reset.
* Relocate resetting interface context to helper function.
* Remove legacy state storage for regional endpoint selection.
* Laurent suggestion updates.
* Implement fabric native path
* Fix default values to work with current fabric clients
* Fix Fabric native mode
* Fix unit test
* export Fabric context
* Dynamically close Home tab for Mirrored databases in Fabric rather than conditional init (which doesn't work for Native)
* For Fabric native, don't show "Delete Database" in context menu and reading databases should return the database from the context.
* Update to V3 messaging
* For data plane operations, skip ARM for Fabric native. Refine the tests for fabric to make the distinction between mirrored key, mirrored AAD and native. Fix FabricUtil to strict compile.
* Add support for refreshing access tokens
* Buf fix: don't wait for refresh is async
* Fix format
* Fix strict compile issue
---------
Co-authored-by: Laurent Nguyen <languye@microsoft.com>
* Default to new backend endpoint if the endpoint in current context does not match existing set in constants.
* Remove some env references.
* Added comments with reasoning for selecting new backend by default.
* Update comment.
* Remove all references to useNewPortalBackendEndpoint now that old backend is disabled in all environments.
* Resolve lint issues.
* Removed references to old backend from Cassandra and Mongo Apis
* fix unit tests
---------
Co-authored-by: Asier Isayas <aisayas@microsoft.com>
* Added throughput bucketing
* fix bugs
* enable/disable per autoscale selection
* Added logic
* change query bucket to group
* Updated to a tab
* Fixed unit tests
* Edit package-lock
* Compile build fix
* fix unit tests
* moving the throughput bucket flag to the client generation level
* Reset hasDataPlaneRbacSettingChanged back to false after cosmos client is refreshed with new settings.
Dispose of old client before new one is created.
* Update client refresh variable after settings change.
* Only refresh client when related settings are changed.
* Update comparisons in settings menu.
* Remove unnecessary comments.
* Update refresh variable naming.
* Attempting to sync package.json and package-lock.json in CI.
* Remove npm install from CI after successful CI run.
* Only show retry settings with those APIs using the cosmos client -> NoSQL, Table, Gremlin
* Add a silent parameter to acquireTokenWithMsal
If true, the function won't retry to sign in using a Popup if silent token acquisition fails.
* Improve Login for Entra ID RBAC button logic
Try to reuse an existing signed-in MSAL account to get the AAD token
and fall back to full sign-in otherwise.
Also move the logic to AuthorizationUtils
* Try to acquire an Entra ID token silently on startup.
When running in Portal MSAL should be able to reuse the
MSAL account from Portal and allow us to silently get
the RBAC token. If it fails we'll show the Login for Entry ID RBAC
button as usual.
* Small code improvements
* Remove the RBAC notice from settings pane
and try to acquire RBAC token silently after enabling RBAC.
* Use msal.ssoSilent with an optional login hint
to avoid more sign-in popups.
msal.loginPopup will be used as a backup option if ssoSilent fails.
Ideally the parent environment (Portal/Fabric) should send
a loginHint with the username of the currently signed in user that
can be passed to the token acquisition flow.
* Improve RBAC error wording, clarifying where to find the Login button.
* Fix API endpoint for CassandraProxy query API
* activate Mongo Proxy and Cassandra Proxy in Prod
* Add CP Prod endpoint
* Run npm format and tests
* Revert code
* fix bug that blocked local mongo proxy and cassandra proxy development
* Add prod endpoint
* fix pr check tests
* Remove prod
* Remove prod endpoint
* Remove dev endpoint
* Support data plane RBAC
* Support data plane RBAC
* Add additional changes for Portal RBAC functionality
* Remove unnecessary code
* Remove unnecessary code
* Add code to fix VCoreMongo/PG bug
* Address feedback
* Add more logs for RBAC feature
* Add more logs for RBAC features
* Fix login for Entra ID text
* Address comments
---------
Co-authored-by: Asier Isayas <aisayas@microsoft.com>
* Fix API endpoint for CassandraProxy query API
* activate Mongo Proxy and Cassandra Proxy in Prod
* Add CP Prod endpoint
* Run npm format and tests
* Revert code
* fix bug that blocked local mongo proxy and cassandra proxy development
* Add prod endpoint
* fix pr check tests
* Remove prod
* Remove prod endpoint
* Remove dev endpoint
* Support data plane RBAC
* Support data plane RBAC
* Add additional changes for Portal RBAC functionality
* Remove unnecessary code
* Remove unnecessary code
* Add code to fix VCoreMongo/PG bug
* Address feedback
* Add more logs for RBAC feature
* Add more logs for RBAC features
---------
Co-authored-by: Asier Isayas <aisayas@microsoft.com>
* Fix API endpoint for CassandraProxy query API
* activate Mongo Proxy and Cassandra Proxy in Prod
* Add CP Prod endpoint
* Run npm format and tests
* Revert code
* fix bug that blocked local mongo proxy and cassandra proxy development
* Add prod endpoint
* fix pr check tests
* Remove prod
* Remove prod endpoint
* Remove dev endpoint
* Support data plane RBAC
* Support data plane RBAC
* Add additional changes for Portal RBAC functionality
* Address errors and checks
* Cleanup DP RBAC code
* Run format
* Fix unit tests
* Remove unnecessary code
* Run npm format
* Fix enableAadDataPlane feature flag behavior
* Fix enable AAD dataplane feature flag behavior
* Address feedback comments
* Minor fix
* Add new fixes
* Fix Tables test
* Run npm format
* Address Local storage default setting issue
* Run npm format
* Address lint error
* Run format
* Address bug in fetching data for Tables Account
* Add fetchAndUpdate Keys
* Add fix for MPAC Tables account issue
* Fix issue with Cosmos Client
* Run np format
* Address bugs
* Remove unused import
---------
Co-authored-by: Asier Isayas <aisayas@microsoft.com>
* Fix API endpoint for CassandraProxy query API
* activate Mongo Proxy and Cassandra Proxy in Prod
* Add CP Prod endpoint
* Run npm format and tests
* Revert code
* fix bug that blocked local mongo proxy and cassandra proxy development
* Add prod endpoint
* fix pr check tests
* Remove prod
* Remove prod endpoint
* Remove dev endpoint
* Support data plane RBAC
* Support data plane RBAC
* Add additional changes for Portal RBAC functionality
* Address errors and checks
* Cleanup DP RBAC code
* Run format
* Fix unit tests
* Remove unnecessary code
* Run npm format
* Fix enableAadDataPlane feature flag behavior
* Fix enable AAD dataplane feature flag behavior
* Address feedback comments
* Minor fix
* Add new fixes
* Fix Tables test
* Run npm format
---------
Co-authored-by: Asier Isayas <aisayas@microsoft.com>
* Update message de->fabric to v3
* Reinstate get authorization token path which doesn't get called every 5 minutes anymore
* Remove obsolete comment
* Add missing types
* Fix format
* Fix build issue
* Revert "Reinstate get authorization token path which doesn't get called every 5 minutes anymore"
This reverts commit a3f3511043.
* Keep 3 old fabric message types enums for compatibility with the portal
* Re-add warning comment about not changing existing message type enums
---------
Co-authored-by: Laurent Nguyen <languye@microsoft.com>
* Use Promise for allResourceToken fabric message. Cleanup token message handling and add debounce.
* Improve rpc and update initalization flow
* Fix format
* Rev up message names for new version
* Refactor RPC with Fabric
* Build fix
* Fix build
* Fix format
* Update Message types
* Fix format
* Fix comments
* Fabric toolbar style and support to show/hide it (#1720)
* Add Fabric specific Toolbar design
* Add Fabric message to show/hide the Toolbar
* Fix CommandBarUtil formatting
* Update zustand state on setToolbarStatus to trigger a redraw of the command bar with updated visibility
---------
Co-authored-by: Laurent Nguyen <laurent.nguyen@microsoft.com>
* Fix format
---------
Co-authored-by: Vsevolod Kukol <sevoku@microsoft.com>
* Added query retry settings
* prettier run
* Fixed tests and queryDocuments
* Fixed tests
* corrected logic
* Updated tests and logic
* Removed optional flag
* Added default value text
* Reworded text
* moved retry options to CosmosClient
* removed unused references to retryOptions
* Reverting formatting
* reverting
* revert
* prettier run
* Correct default and added options directly to the client
* Prettier run and unit test update
* Corrected tooltip and constant name
* Added inSeconds to WaitTime
* Setting enableEndpointDiscovery to true to test client resilience during region outage.
When this is set to false, it can impact the SDK's failover behavior.
* Update contracts for new all resource messages
* Add timestamp to token message signature
* Reconstruct resource tree with databases and collections parsed from token dictionary keys
* Create FabricDatabase and FabricCollection to turn off interaction
* Remove unnecessary FabricCollection derived class
* Handle resource tokens
* Bug fix
* Fix linting issues
* Fix update document
* Fix partitition keys
* Remove special case for FabricDatabase tree node
* Modify readCollections to follow normal flow with Fabric
* Move fabric databases refresh to data access and remove special case in Explorer
* Revert Explorer.tsx changes
* Disable database context menu and delete container context menu
* Remove create database/container button for Fabric
* Fix format
* Renew token logic
* Parallelize read collections calls to speed up
* Disable readDatabaseOffer, because it is too slow for now
* Reduce TOKEN_VALIDITY_MS a bit to make sure renewal happens before expiration. Receving new tokens new refreshes databases
* Add container element for Main app in HTML
* Do not handle "openTab" message anymore
* Fix style of main div
* Simplify conditional load of the fabric .css
* Fix format
* Fix tsc can't find dynamic less import
---------
Co-authored-by: Armando Trejo Oliver <artrejo@microsoft.com>
* For Fabric, send message to get Authorization token from iframe parent
* tokenProvider: set date header and return token
* Expect account endpoint on initialize message from Fabric
* Fix format
---------
Co-authored-by: artrejo <artrejo@microsoft.com>
* For connection-string based authentication, the request would be made with low priority request header and for AAD based authentication, users can select the priority-request option from the settings panel
* removed unused imports
* prettier checks
---------
Co-authored-by: Faiz Chachiya <faizchachiya@microsoft.com>
* changed the variable enablePriorityBasedThrottling to enablePriorityBasedExecution
* Update the arm client version to '2023-09-15-preview' to fetch the status for the 'enablePriorityBasedExecution' property and performed the respective changes for priority based execution to grab the changes from the DatabaseAccount data model
* formatting changes to all the committed files
* review comments - removed the variable and added the check in the if loop itself
* check style changes
---------
Co-authored-by: Faiz Chachiya <faizchachiya@microsoft.com>
* Execute the queries with high/low priority
* improvement made to the Cosmos client and created separate plugin class for setting priority header
* added test cases for the priority execution utility
* removed unwanted code
* fix compile time issues
* fix compile time issues
* fixed lint and stylinkg issues
* fixed lint and styling issues
* skip the lint check for src/Utils/PriorityBasedExecutionUtils.ts
* incorporating review comments, added the default priority level changes
* changed the priority to default instead of low
* removed the unwanted if condition
---------
Co-authored-by: Faiz Chachiya <faizchachiya@microsoft.com>
- created `getErrorMessage` function which takes in an error string or any type of error object and returns the correct error message
- replaced `error.message` with `getErrorMessage` since `error` could be a string in some cases
- merged sendNotificationForError.ts with ErrorHandlingUtils.ts
- some minor refactoring
In part 2, I will make the following changes:
- Make `Logger.logError` function take an error message string instead of an error object. This will reduce some redundancy where the `getErrorMessage` function is being called twice (the error object passed by the caller is already an error message).
- Update every `TelemetryProcessor.traceFailure` call to make sure we pass in an error message instead of an error object since we stringify the data we send.
Things like ConfigContext.BACKEND_ENDPOINT are dynamically changed, and assigning them statically like this only bypasses that mechanism :(
Co-authored-by: Steve Faulkner <471400+southpolesteve@users.noreply.github.com>