1
0
mirror of https://github.com/bitwarden/directory-connector synced 2025-12-16 00:04:34 +00:00

Compare commits

..

7 Commits

Author SHA1 Message Date
Jimmy Vo
30c34d4fd6 Merge branch 'main' into renovate/lock-file-maintenance 2025-06-26 10:28:29 -04:00
Brandon
05aaf6d9ba wip testing error 2025-05-29 12:34:20 -04:00
Brandon
773015ba74 npm ci 2025-05-29 12:13:47 -04:00
Brandon
bfb09194e9 cleanup 2025-05-29 12:12:05 -04:00
Brandon
19e74d11ac clean up 2025-05-29 12:10:56 -04:00
Brandon
4628b280b6 pin parse5 to <7.3.0 2025-05-29 11:49:01 -04:00
renovate[bot]
86f117927a [deps]: Lock file maintenance 2025-05-19 14:25:07 +00:00
18 changed files with 103 additions and 238 deletions

View File

@@ -16,8 +16,6 @@ jobs:
cloc: cloc:
name: CLOC name: CLOC
runs-on: ubuntu-24.04 runs-on: ubuntu-24.04
permissions:
contents: read
steps: steps:
- name: Checkout repo - name: Checkout repo
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
@@ -34,8 +32,6 @@ jobs:
setup: setup:
name: Setup name: Setup
runs-on: ubuntu-24.04 runs-on: ubuntu-24.04
permissions:
contents: read
outputs: outputs:
package_version: ${{ steps.retrieve-version.outputs.package_version }} package_version: ${{ steps.retrieve-version.outputs.package_version }}
steps: steps:
@@ -57,8 +53,6 @@ jobs:
_PACKAGE_VERSION: ${{ needs.setup.outputs.package_version }} _PACKAGE_VERSION: ${{ needs.setup.outputs.package_version }}
_PKG_FETCH_NODE_VERSION: 18.5.0 _PKG_FETCH_NODE_VERSION: 18.5.0
_PKG_FETCH_VERSION: 3.4 _PKG_FETCH_VERSION: 3.4
permissions:
contents: read
steps: steps:
- name: Checkout repo - name: Checkout repo
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
@@ -138,8 +132,6 @@ jobs:
name: Build Mac CLI name: Build Mac CLI
runs-on: macos-13 runs-on: macos-13
needs: setup needs: setup
permissions:
contents: read
env: env:
_PACKAGE_VERSION: ${{ needs.setup.outputs.package_version }} _PACKAGE_VERSION: ${{ needs.setup.outputs.package_version }}
_PKG_FETCH_NODE_VERSION: 18.5.0 _PKG_FETCH_NODE_VERSION: 18.5.0
@@ -216,8 +208,6 @@ jobs:
name: Build Windows CLI name: Build Windows CLI
runs-on: windows-2022 runs-on: windows-2022
needs: setup needs: setup
permissions:
contents: read
env: env:
_PACKAGE_VERSION: ${{ needs.setup.outputs.package_version }} _PACKAGE_VERSION: ${{ needs.setup.outputs.package_version }}
_WIN_PKG_FETCH_VERSION: 18.5.0 _WIN_PKG_FETCH_VERSION: 18.5.0
@@ -351,9 +341,6 @@ jobs:
name: Build Windows GUI name: Build Windows GUI
runs-on: windows-2022 runs-on: windows-2022
needs: setup needs: setup
permissions:
contents: read
id-token: write
env: env:
NODE_OPTIONS: --max_old_space_size=4096 NODE_OPTIONS: --max_old_space_size=4096
_PACKAGE_VERSION: ${{ needs.setup.outputs.package_version }} _PACKAGE_VERSION: ${{ needs.setup.outputs.package_version }}
@@ -385,12 +372,10 @@ jobs:
- name: Install Node dependencies - name: Install Node dependencies
run: npm install run: npm install
- name: Log in to Azure - name: Login to Azure
uses: bitwarden/gh-actions/azure-login@main uses: Azure/login@e15b166166a8746d1a47596803bd8c1b595455cf # v1.6.0
with: with:
subscription_id: ${{ secrets.AZURE_SUBSCRIPTION_ID }} creds: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }}
tenant_id: ${{ secrets.AZURE_TENANT_ID }}
client_id: ${{ secrets.AZURE_CLIENT_ID }}
- name: Retrieve secrets - name: Retrieve secrets
id: retrieve-secrets id: retrieve-secrets
@@ -403,9 +388,6 @@ jobs:
code-signing-client-secret, code-signing-client-secret,
code-signing-cert-name" code-signing-cert-name"
- name: Log out from Azure
uses: bitwarden/gh-actions/azure-logout@main
- name: Build & Sign - name: Build & Sign
run: npm run dist:win run: npm run dist:win
env: env:
@@ -449,8 +431,6 @@ jobs:
name: Build Linux GUI name: Build Linux GUI
runs-on: ubuntu-24.04 runs-on: ubuntu-24.04
needs: setup needs: setup
permissions:
contents: read
env: env:
NODE_OPTIONS: --max_old_space_size=4096 NODE_OPTIONS: --max_old_space_size=4096
_PACKAGE_VERSION: ${{ needs.setup.outputs.package_version }} _PACKAGE_VERSION: ${{ needs.setup.outputs.package_version }}
@@ -505,9 +485,6 @@ jobs:
name: Build MacOS GUI name: Build MacOS GUI
runs-on: macos-13 runs-on: macos-13
needs: setup needs: setup
permissions:
contents: read
id-token: write
env: env:
NODE_OPTIONS: --max_old_space_size=4096 NODE_OPTIONS: --max_old_space_size=4096
_PACKAGE_VERSION: ${{ needs.setup.outputs.package_version }} _PACKAGE_VERSION: ${{ needs.setup.outputs.package_version }}
@@ -535,19 +512,10 @@ jobs:
echo "GitHub ref: $GITHUB_REF" echo "GitHub ref: $GITHUB_REF"
echo "GitHub event: $GITHUB_EVENT" echo "GitHub event: $GITHUB_EVENT"
- name: Log in to Azure - name: Login to Azure
uses: bitwarden/gh-actions/azure-login@main uses: Azure/login@e15b166166a8746d1a47596803bd8c1b595455cf # v1.6.0
with: with:
subscription_id: ${{ secrets.AZURE_SUBSCRIPTION_ID }} creds: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }}
tenant_id: ${{ secrets.AZURE_TENANT_ID }}
client_id: ${{ secrets.AZURE_CLIENT_ID }}
- name: Get Azure Key Vault secrets
id: get-kv-secrets
uses: bitwarden/gh-actions/get-keyvault-secrets@main
with:
keyvault: gh-directory-connector
secrets: "KEYCHAIN-PASSWORD,APP-STORE-CONNECT-AUTH-KEY,APP-STORE-CONNECT-TEAM-ISSUER"
- name: Get certificates - name: Get certificates
run: | run: |
@@ -562,12 +530,9 @@ jobs:
az keyvault secret show --id https://bitwarden-ci.vault.azure.net/certificates/macdev-cert | az keyvault secret show --id https://bitwarden-ci.vault.azure.net/certificates/macdev-cert |
jq -r .value | base64 -d > $HOME/certificates/macdev-cert.p12 jq -r .value | base64 -d > $HOME/certificates/macdev-cert.p12
- name: Log out from Azure
uses: bitwarden/gh-actions/azure-logout@main
- name: Set up keychain - name: Set up keychain
env: env:
KEYCHAIN_PASSWORD: ${{ steps.get-kv-secrets.outputs.KEYCHAIN-PASSWORD }} KEYCHAIN_PASSWORD: ${{ secrets.KEYCHAIN_PASSWORD }}
run: | run: |
security create-keychain -p $KEYCHAIN_PASSWORD build.keychain security create-keychain -p $KEYCHAIN_PASSWORD build.keychain
security default-keychain -s build.keychain security default-keychain -s build.keychain
@@ -601,13 +566,13 @@ jobs:
run: | run: |
mkdir ~/private_keys mkdir ~/private_keys
cat << EOF > ~/private_keys/AuthKey_UFD296548T.p8 cat << EOF > ~/private_keys/AuthKey_UFD296548T.p8
${{ steps.get-kv-secrets.outputs.APP-STORE-CONNECT-AUTH-KEY }} ${{ secrets.APP_STORE_CONNECT_AUTH_KEY }}
EOF EOF
- name: Build application - name: Build application
run: npm run dist:mac run: npm run dist:mac
env: env:
APP_STORE_CONNECT_TEAM_ISSUER: ${{ steps.get-kv-secrets.outputs.APP-STORE-CONNECT-TEAM-ISSUER }} APP_STORE_CONNECT_TEAM_ISSUER: ${{ secrets.APP_STORE_CONNECT_TEAM_ISSUER }}
APP_STORE_CONNECT_AUTH_KEY: UFD296548T APP_STORE_CONNECT_AUTH_KEY: UFD296548T
APP_STORE_CONNECT_AUTH_KEY_PATH: ~/private_keys/AuthKey_UFD296548T.p8 APP_STORE_CONNECT_AUTH_KEY_PATH: ~/private_keys/AuthKey_UFD296548T.p8
CSC_FOR_PULL_REQUEST: true CSC_FOR_PULL_REQUEST: true
@@ -653,8 +618,6 @@ jobs:
- windows-gui - windows-gui
- linux-gui - linux-gui
- macos-gui - macos-gui
permissions:
id-token: write
steps: steps:
- name: Check if any job failed - name: Check if any job failed
if: | if: |
@@ -664,13 +627,11 @@ jobs:
&& contains(needs.*.result, 'failure') && contains(needs.*.result, 'failure')
run: exit 1 run: exit 1
- name: Log in to Azure - name: Login to Azure - CI subscription
uses: Azure/login@e15b166166a8746d1a47596803bd8c1b595455cf # v1.6.0
if: failure() if: failure()
uses: bitwarden/gh-actions/azure-login@main
with: with:
subscription_id: ${{ secrets.AZURE_SUBSCRIPTION_ID }} creds: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }}
tenant_id: ${{ secrets.AZURE_TENANT_ID }}
client_id: ${{ secrets.AZURE_CLIENT_ID }}
- name: Retrieve secrets - name: Retrieve secrets
id: retrieve-secrets id: retrieve-secrets
@@ -680,9 +641,6 @@ jobs:
keyvault: "bitwarden-ci" keyvault: "bitwarden-ci"
secrets: "devops-alerts-slack-webhook-url" secrets: "devops-alerts-slack-webhook-url"
- name: Log out from Azure
uses: bitwarden/gh-actions/azure-logout@main
- name: Notify Slack on failure - name: Notify Slack on failure
uses: act10ns/slack@44541246747a30eb3102d87f7a4cc5471b0ffb7d # v2.1.0 uses: act10ns/slack@44541246747a30eb3102d87f7a4cc5471b0ffb7d # v2.1.0
if: failure() if: failure()

View File

@@ -20,8 +20,6 @@ jobs:
setup: setup:
name: Setup name: Setup
runs-on: ubuntu-24.04 runs-on: ubuntu-24.04
permissions:
contents: read
outputs: outputs:
release_version: ${{ steps.version.outputs.version }} release_version: ${{ steps.version.outputs.version }}
steps: steps:
@@ -50,10 +48,6 @@ jobs:
name: Release name: Release
runs-on: ubuntu-24.04 runs-on: ubuntu-24.04
needs: setup needs: setup
permissions:
actions: read
packages: read
contents: write
steps: steps:
- name: Download all artifacts - name: Download all artifacts
if: ${{ inputs.release_type != 'Dry Run' }} if: ${{ inputs.release_type != 'Dry Run' }}

View File

@@ -12,7 +12,7 @@ on:
pull_request_target: pull_request_target:
types: [opened, synchronize, reopened] types: [opened, synchronize, reopened]
branches: branches:
- main - "main"
permissions: {} permissions: {}
@@ -31,7 +31,6 @@ jobs:
contents: read contents: read
pull-requests: write pull-requests: write
security-events: write security-events: write
id-token: write
steps: steps:
- name: Check out repo - name: Check out repo
@@ -39,33 +38,16 @@ jobs:
with: with:
ref: ${{ github.event.pull_request.head.sha }} ref: ${{ github.event.pull_request.head.sha }}
- name: Log in to Azure
uses: bitwarden/gh-actions/azure-login@main
with:
subscription_id: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
tenant_id: ${{ secrets.AZURE_TENANT_ID }}
client_id: ${{ secrets.AZURE_CLIENT_ID }}
- name: Get Azure Key Vault secrets
id: get-kv-secrets
uses: bitwarden/gh-actions/get-keyvault-secrets@main
with:
keyvault: gh-org-bitwarden
secrets: "CHECKMARX-TENANT,CHECKMARX-CLIENT-ID,CHECKMARX-SECRET"
- name: Log out from Azure
uses: bitwarden/gh-actions/azure-logout@main
- name: Scan with Checkmarx - name: Scan with Checkmarx
uses: checkmarx/ast-github-action@184bf2f64f55d1c93fd6636d539edf274703e434 # 2.0.41 uses: checkmarx/ast-github-action@184bf2f64f55d1c93fd6636d539edf274703e434 # 2.0.41
env: env:
INCREMENTAL: "${{ contains(github.event_name, 'pull_request') && '--sast-incremental' || '' }}" INCREMENTAL: "${{ contains(github.event_name, 'pull_request') && '--sast-incremental' || '' }}"
with: with:
project_name: ${{ github.repository }} project_name: ${{ github.repository }}
cx_tenant: ${{ steps.get-kv-secrets.outputs.CHECKMARX-TENANT }} cx_tenant: ${{ secrets.CHECKMARX_TENANT }}
base_uri: https://ast.checkmarx.net/ base_uri: https://ast.checkmarx.net/
cx_client_id: ${{ steps.get-kv-secrets.outputs.CHECKMARX-CLIENT-ID }} cx_client_id: ${{ secrets.CHECKMARX_CLIENT_ID }}
cx_client_secret: ${{ steps.get-kv-secrets.outputs.CHECKMARX-SECRET }} cx_client_secret: ${{ secrets.CHECKMARX_SECRET }}
additional_params: | additional_params: |
--report-format sarif \ --report-format sarif \
--filter "state=TO_VERIFY;PROPOSED_NOT_EXPLOITABLE;CONFIRMED;URGENT" \ --filter "state=TO_VERIFY;PROPOSED_NOT_EXPLOITABLE;CONFIRMED;URGENT" \
@@ -85,7 +67,6 @@ jobs:
permissions: permissions:
contents: read contents: read
pull-requests: write pull-requests: write
id-token: write
steps: steps:
- name: Check out repo - name: Check out repo
@@ -94,27 +75,10 @@ jobs:
fetch-depth: 0 fetch-depth: 0
ref: ${{ github.event.pull_request.head.sha }} ref: ${{ github.event.pull_request.head.sha }}
- name: Log in to Azure
uses: bitwarden/gh-actions/azure-login@main
with:
subscription_id: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
tenant_id: ${{ secrets.AZURE_TENANT_ID }}
client_id: ${{ secrets.AZURE_CLIENT_ID }}
- name: Get Azure Key Vault secrets
id: get-kv-secrets
uses: bitwarden/gh-actions/get-keyvault-secrets@main
with:
keyvault: gh-org-bitwarden
secrets: "SONAR-TOKEN"
- name: Log out from Azure
uses: bitwarden/gh-actions/azure-logout@main
- name: Scan with SonarCloud - name: Scan with SonarCloud
uses: sonarsource/sonarqube-scan-action@2500896589ef8f7247069a56136f8dc177c27ccf # v5.2.0 uses: sonarsource/sonarqube-scan-action@2500896589ef8f7247069a56136f8dc177c27ccf # v5.2.0
env: env:
SONAR_TOKEN: ${{ steps.get-kv-secrets.outputs.SONAR-TOKEN }} SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
with: with:
args: > args: >
-Dsonar.organization=${{ github.repository_owner }} -Dsonar.organization=${{ github.repository_owner }}

View File

@@ -12,9 +12,6 @@ jobs:
bump_version: bump_version:
name: Bump Version name: Bump Version
runs-on: ubuntu-24.04 runs-on: ubuntu-24.04
permissions:
contents: write
id-token: write
steps: steps:
- name: Validate version input - name: Validate version input
if: ${{ inputs.version_number_override != '' }} if: ${{ inputs.version_number_override != '' }}
@@ -22,29 +19,12 @@ jobs:
with: with:
version: ${{ inputs.version_number_override }} version: ${{ inputs.version_number_override }}
- name: Log in to Azure
uses: bitwarden/gh-actions/azure-login@main
with:
subscription_id: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
tenant_id: ${{ secrets.AZURE_TENANT_ID }}
client_id: ${{ secrets.AZURE_CLIENT_ID }}
- name: Get Azure Key Vault secrets
id: get-kv-secrets
uses: bitwarden/gh-actions/get-keyvault-secrets@main
with:
keyvault: gh-org-bitwarden
secrets: "BW-GHAPP-ID,BW-GHAPP-KEY"
- name: Log out from Azure
uses: bitwarden/gh-actions/azure-logout@main
- name: Generate GH App token - name: Generate GH App token
uses: actions/create-github-app-token@c1a285145b9d317df6ced56c09f525b5c2b6f755 # v1.11.1 uses: actions/create-github-app-token@c1a285145b9d317df6ced56c09f525b5c2b6f755 # v1.11.1
id: app-token id: app-token
with: with:
app-id: ${{ steps.get-kv-secrets.outputs.BW-GHAPP-ID }} app-id: ${{ secrets.BW_GHAPP_ID }}
private-key: ${{ steps.get-kv-secrets.outputs.BW-GHAPP-KEY }} private-key: ${{ secrets.BW_GHAPP_KEY }}
- name: Checkout Branch - name: Checkout Branch
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2

View File

@@ -9,7 +9,7 @@ Supported directories:
- Active Directory - Active Directory
- Any other LDAP-based directory - Any other LDAP-based directory
- Microsoft Entra ID - Azure Active Directory
- G Suite (Google) - G Suite (Google)
- Okta - Okta

View File

@@ -2,7 +2,7 @@
"name": "@bitwarden/directory-connector", "name": "@bitwarden/directory-connector",
"productName": "Bitwarden Directory Connector", "productName": "Bitwarden Directory Connector",
"description": "Sync your user directory to your Bitwarden organization.", "description": "Sync your user directory to your Bitwarden organization.",
"version": "2025.6.1", "version": "2025.6.0",
"keywords": [ "keywords": [
"bitwarden", "bitwarden",
"password", "password",

View File

@@ -3,7 +3,7 @@ import { StorageOptions } from "@/jslib/common/src/models/domain/storageOptions"
import { DirectoryType } from "@/src/enums/directoryType"; import { DirectoryType } from "@/src/enums/directoryType";
import { Account } from "@/src/models/account"; import { Account } from "@/src/models/account";
import { EntraIdConfiguration } from "@/src/models/entraIdConfiguration"; import { AzureConfiguration } from "@/src/models/azureConfiguration";
import { GSuiteConfiguration } from "@/src/models/gsuiteConfiguration"; import { GSuiteConfiguration } from "@/src/models/gsuiteConfiguration";
import { LdapConfiguration } from "@/src/models/ldapConfiguration"; import { LdapConfiguration } from "@/src/models/ldapConfiguration";
import { OktaConfiguration } from "@/src/models/oktaConfiguration"; import { OktaConfiguration } from "@/src/models/oktaConfiguration";
@@ -17,7 +17,7 @@ export abstract class StateService extends BaseStateServiceAbstraction<Account>
config: config:
| LdapConfiguration | LdapConfiguration
| GSuiteConfiguration | GSuiteConfiguration
| EntraIdConfiguration | AzureConfiguration
| OktaConfiguration | OktaConfiguration
| OneLoginConfiguration, | OneLoginConfiguration,
) => Promise<any>; ) => Promise<any>;
@@ -25,8 +25,8 @@ export abstract class StateService extends BaseStateServiceAbstraction<Account>
setLdapConfiguration: (value: LdapConfiguration, options?: StorageOptions) => Promise<void>; setLdapConfiguration: (value: LdapConfiguration, options?: StorageOptions) => Promise<void>;
getGsuiteConfiguration: (options?: StorageOptions) => Promise<GSuiteConfiguration>; getGsuiteConfiguration: (options?: StorageOptions) => Promise<GSuiteConfiguration>;
setGsuiteConfiguration: (value: GSuiteConfiguration, options?: StorageOptions) => Promise<void>; setGsuiteConfiguration: (value: GSuiteConfiguration, options?: StorageOptions) => Promise<void>;
getEntraConfiguration: (options?: StorageOptions) => Promise<EntraIdConfiguration>; getAzureConfiguration: (options?: StorageOptions) => Promise<AzureConfiguration>;
setEntraConfiguration: (value: EntraIdConfiguration, options?: StorageOptions) => Promise<void>; setAzureConfiguration: (value: AzureConfiguration, options?: StorageOptions) => Promise<void>;
getOktaConfiguration: (options?: StorageOptions) => Promise<OktaConfiguration>; getOktaConfiguration: (options?: StorageOptions) => Promise<OktaConfiguration>;
setOktaConfiguration: (value: OktaConfiguration, options?: StorageOptions) => Promise<void>; setOktaConfiguration: (value: OktaConfiguration, options?: StorageOptions) => Promise<void>;
getOneLoginConfiguration: (options?: StorageOptions) => Promise<OneLoginConfiguration>; getOneLoginConfiguration: (options?: StorageOptions) => Promise<OneLoginConfiguration>;

View File

@@ -242,7 +242,7 @@
</div> </div>
</div> </div>
</div> </div>
<div [hidden]="directory != directoryType.EntraID"> <div [hidden]="directory != directoryType.AzureActiveDirectory">
<div class="mb-3"> <div class="mb-3">
<label for="identityAuthority" class="form-label">{{ <label for="identityAuthority" class="form-label">{{
"identityAuthority" | i18n "identityAuthority" | i18n
@@ -251,10 +251,10 @@
class="form-select" class="form-select"
id="identityAuthority" id="identityAuthority"
name="IdentityAuthority" name="IdentityAuthority"
[(ngModel)]="entra.identityAuthority" [(ngModel)]="azure.identityAuthority"
> >
<option value="login.microsoftonline.com">Entra Id Public</option> <option value="login.microsoftonline.com">Azure AD Public</option>
<option value="login.microsoftonline.us">Entra Id Government</option> <option value="login.microsoftonline.us">Azure AD Government</option>
</select> </select>
</div> </div>
<div class="mb-3"> <div class="mb-3">
@@ -264,7 +264,7 @@
class="form-control" class="form-control"
id="tenant" id="tenant"
name="Tenant" name="Tenant"
[(ngModel)]="entra.tenant" [(ngModel)]="azure.tenant"
/> />
<div class="form-text">{{ "ex" | i18n }} companyad.onmicrosoft.com</div> <div class="form-text">{{ "ex" | i18n }} companyad.onmicrosoft.com</div>
</div> </div>
@@ -275,29 +275,29 @@
class="form-control" class="form-control"
id="applicationId" id="applicationId"
name="ApplicationId" name="ApplicationId"
[(ngModel)]="entra.applicationId" [(ngModel)]="azure.applicationId"
/> />
</div> </div>
<div class="mb-3"> <div class="mb-3">
<label for="secretKey" class="form-label">{{ "secretKey" | i18n }}</label> <label for="secretKey" class="form-label">{{ "secretKey" | i18n }}</label>
<div class="input-group"> <div class="input-group">
<input <input
type="{{ showEntraKey ? 'text' : 'password' }}" type="{{ showAzureKey ? 'text' : 'password' }}"
class="form-control" class="form-control"
id="secretKey" id="secretKey"
name="SecretKey" name="SecretKey"
[(ngModel)]="entra.key" [(ngModel)]="azure.key"
/> />
<button <button
type="button" type="button"
class="btn btn-outline-secondary" class="btn btn-outline-secondary"
appA11yTitle="{{ 'toggleVisibility' | i18n }}" appA11yTitle="{{ 'toggleVisibility' | i18n }}"
(click)="toggleEntraKey()" (click)="toggleAzureKey()"
> >
<i <i
class="bwi bwi-lg" class="bwi bwi-lg"
aria-hidden="true" aria-hidden="true"
[ngClass]="showEntraKey ? 'bwi-eye-slash' : 'bwi-eye'" [ngClass]="showAzureKey ? 'bwi-eye-slash' : 'bwi-eye'"
></i> ></i>
</button> </button>
</div> </div>
@@ -607,7 +607,7 @@
<div class="form-text" *ngIf="directory === directoryType.Ldap"> <div class="form-text" *ngIf="directory === directoryType.Ldap">
{{ "ex" | i18n }} (&amp;(givenName=John)(|(l=Dallas)(l=Austin))) {{ "ex" | i18n }} (&amp;(givenName=John)(|(l=Dallas)(l=Austin)))
</div> </div>
<div class="form-text" *ngIf="directory === directoryType.EntraID"> <div class="form-text" *ngIf="directory === directoryType.AzureActiveDirectory">
{{ "ex" | i18n }} exclude:joe&#64;company.com {{ "ex" | i18n }} exclude:joe&#64;company.com
</div> </div>
<div class="form-text" *ngIf="directory === directoryType.Okta"> <div class="form-text" *ngIf="directory === directoryType.Okta">
@@ -684,7 +684,7 @@
<div class="form-text" *ngIf="directory === directoryType.Ldap"> <div class="form-text" *ngIf="directory === directoryType.Ldap">
{{ "ex" | i18n }} (&amp;(objectClass=group)(!(cn=Sales*))(!(cn=IT*))) {{ "ex" | i18n }} (&amp;(objectClass=group)(!(cn=Sales*))(!(cn=IT*)))
</div> </div>
<div class="form-text" *ngIf="directory === directoryType.EntraID"> <div class="form-text" *ngIf="directory === directoryType.AzureActiveDirectory">
{{ "ex" | i18n }} include:Sales,IT {{ "ex" | i18n }} include:Sales,IT
</div> </div>
<div class="form-text" *ngIf="directory === directoryType.Okta"> <div class="form-text" *ngIf="directory === directoryType.Okta">

View File

@@ -5,7 +5,7 @@ import { LogService } from "@/jslib/common/src/abstractions/log.service";
import { StateService } from "../../abstractions/state.service"; import { StateService } from "../../abstractions/state.service";
import { DirectoryType } from "../../enums/directoryType"; import { DirectoryType } from "../../enums/directoryType";
import { EntraIdConfiguration } from "../../models/entraIdConfiguration"; import { AzureConfiguration } from "../../models/azureConfiguration";
import { GSuiteConfiguration } from "../../models/gsuiteConfiguration"; import { GSuiteConfiguration } from "../../models/gsuiteConfiguration";
import { LdapConfiguration } from "../../models/ldapConfiguration"; import { LdapConfiguration } from "../../models/ldapConfiguration";
import { OktaConfiguration } from "../../models/oktaConfiguration"; import { OktaConfiguration } from "../../models/oktaConfiguration";
@@ -22,13 +22,13 @@ export class SettingsComponent implements OnInit, OnDestroy {
directoryType = DirectoryType; directoryType = DirectoryType;
ldap = new LdapConfiguration(); ldap = new LdapConfiguration();
gsuite = new GSuiteConfiguration(); gsuite = new GSuiteConfiguration();
entra = new EntraIdConfiguration(); azure = new AzureConfiguration();
okta = new OktaConfiguration(); okta = new OktaConfiguration();
oneLogin = new OneLoginConfiguration(); oneLogin = new OneLoginConfiguration();
sync = new SyncConfiguration(); sync = new SyncConfiguration();
directoryOptions: any[]; directoryOptions: any[];
showLdapPassword = false; showLdapPassword = false;
showEntraKey = false; showAzureKey = false;
showOktaKey = false; showOktaKey = false;
showOneLoginSecret = false; showOneLoginSecret = false;
@@ -42,7 +42,7 @@ export class SettingsComponent implements OnInit, OnDestroy {
this.directoryOptions = [ this.directoryOptions = [
{ name: this.i18nService.t("select"), value: null }, { name: this.i18nService.t("select"), value: null },
{ name: "Active Directory / LDAP", value: DirectoryType.Ldap }, { name: "Active Directory / LDAP", value: DirectoryType.Ldap },
{ name: "Entra ID", value: DirectoryType.EntraID }, { name: "Azure Active Directory", value: DirectoryType.AzureActiveDirectory },
{ name: "G Suite (Google)", value: DirectoryType.GSuite }, { name: "G Suite (Google)", value: DirectoryType.GSuite },
{ name: "Okta", value: DirectoryType.Okta }, { name: "Okta", value: DirectoryType.Okta },
{ name: "OneLogin", value: DirectoryType.OneLogin }, { name: "OneLogin", value: DirectoryType.OneLogin },
@@ -56,9 +56,10 @@ export class SettingsComponent implements OnInit, OnDestroy {
this.gsuite = this.gsuite =
(await this.stateService.getDirectory<GSuiteConfiguration>(DirectoryType.GSuite)) || (await this.stateService.getDirectory<GSuiteConfiguration>(DirectoryType.GSuite)) ||
this.gsuite; this.gsuite;
this.entra = this.azure =
(await this.stateService.getDirectory<EntraIdConfiguration>(DirectoryType.EntraID)) || (await this.stateService.getDirectory<AzureConfiguration>(
this.entra; DirectoryType.AzureActiveDirectory,
)) || this.azure;
this.okta = this.okta =
(await this.stateService.getDirectory<OktaConfiguration>(DirectoryType.Okta)) || this.okta; (await this.stateService.getDirectory<OktaConfiguration>(DirectoryType.Okta)) || this.okta;
this.oneLogin = this.oneLogin =
@@ -79,7 +80,7 @@ export class SettingsComponent implements OnInit, OnDestroy {
await this.stateService.setDirectoryType(this.directory); await this.stateService.setDirectoryType(this.directory);
await this.stateService.setDirectory(DirectoryType.Ldap, this.ldap); await this.stateService.setDirectory(DirectoryType.Ldap, this.ldap);
await this.stateService.setDirectory(DirectoryType.GSuite, this.gsuite); await this.stateService.setDirectory(DirectoryType.GSuite, this.gsuite);
await this.stateService.setDirectory(DirectoryType.EntraID, this.entra); await this.stateService.setDirectory(DirectoryType.AzureActiveDirectory, this.azure);
await this.stateService.setDirectory(DirectoryType.Okta, this.okta); await this.stateService.setDirectory(DirectoryType.Okta, this.okta);
await this.stateService.setDirectory(DirectoryType.OneLogin, this.oneLogin); await this.stateService.setDirectory(DirectoryType.OneLogin, this.oneLogin);
await this.stateService.setSync(this.sync); await this.stateService.setSync(this.sync);
@@ -134,8 +135,8 @@ export class SettingsComponent implements OnInit, OnDestroy {
document.getElementById("password").focus(); document.getElementById("password").focus();
} }
toggleEntraKey() { toggleAzureKey() {
this.showEntraKey = !this.showEntraKey; this.showAzureKey = !this.showAzureKey;
document.getElementById("secretKey").focus(); document.getElementById("secretKey").focus();
} }

View File

@@ -8,7 +8,7 @@ import { MessageResponse } from "@/jslib/node/src/cli/models/response/messageRes
import { StateService } from "../abstractions/state.service"; import { StateService } from "../abstractions/state.service";
import { DirectoryType } from "../enums/directoryType"; import { DirectoryType } from "../enums/directoryType";
import { EntraIdConfiguration } from "../models/entraIdConfiguration"; import { AzureConfiguration } from "../models/azureConfiguration";
import { GSuiteConfiguration } from "../models/gsuiteConfiguration"; import { GSuiteConfiguration } from "../models/gsuiteConfiguration";
import { LdapConfiguration } from "../models/ldapConfiguration"; import { LdapConfiguration } from "../models/ldapConfiguration";
import { OktaConfiguration } from "../models/oktaConfiguration"; import { OktaConfiguration } from "../models/oktaConfiguration";
@@ -20,7 +20,7 @@ export class ConfigCommand {
private directory: DirectoryType; private directory: DirectoryType;
private ldap = new LdapConfiguration(); private ldap = new LdapConfiguration();
private gsuite = new GSuiteConfiguration(); private gsuite = new GSuiteConfiguration();
private entra = new EntraIdConfiguration(); private azure = new AzureConfiguration();
private okta = new OktaConfiguration(); private okta = new OktaConfiguration();
private oneLogin = new OneLoginConfiguration(); private oneLogin = new OneLoginConfiguration();
private sync = new SyncConfiguration(); private sync = new SyncConfiguration();
@@ -54,11 +54,8 @@ export class ConfigCommand {
case "gsuite.key": case "gsuite.key":
await this.setGSuiteKey(value); await this.setGSuiteKey(value);
break; break;
// Azure Active Directory was renamed to Entra ID, but we've kept the old key name
// to be backwards compatible with existing configurations.
case "azure.key": case "azure.key":
case "entra.key": await this.setAzureKey(value);
await this.setEntraIdKey(value);
break; break;
case "okta.token": case "okta.token":
await this.setOktaToken(value); await this.setOktaToken(value);
@@ -105,9 +102,9 @@ export class ConfigCommand {
await this.saveConfig(); await this.saveConfig();
} }
private async setEntraIdKey(key: string) { private async setAzureKey(key: string) {
await this.loadConfig(); await this.loadConfig();
this.entra.key = key; this.azure.key = key;
await this.saveConfig(); await this.saveConfig();
} }
@@ -130,9 +127,10 @@ export class ConfigCommand {
this.gsuite = this.gsuite =
(await this.stateService.getDirectory<GSuiteConfiguration>(DirectoryType.GSuite)) || (await this.stateService.getDirectory<GSuiteConfiguration>(DirectoryType.GSuite)) ||
this.gsuite; this.gsuite;
this.entra = this.azure =
(await this.stateService.getDirectory<EntraIdConfiguration>(DirectoryType.EntraID)) || (await this.stateService.getDirectory<AzureConfiguration>(
this.entra; DirectoryType.AzureActiveDirectory,
)) || this.azure;
this.okta = this.okta =
(await this.stateService.getDirectory<OktaConfiguration>(DirectoryType.Okta)) || this.okta; (await this.stateService.getDirectory<OktaConfiguration>(DirectoryType.Okta)) || this.okta;
this.oneLogin = this.oneLogin =
@@ -146,7 +144,7 @@ export class ConfigCommand {
await this.stateService.setDirectoryType(this.directory); await this.stateService.setDirectoryType(this.directory);
await this.stateService.setDirectory(DirectoryType.Ldap, this.ldap); await this.stateService.setDirectory(DirectoryType.Ldap, this.ldap);
await this.stateService.setDirectory(DirectoryType.GSuite, this.gsuite); await this.stateService.setDirectory(DirectoryType.GSuite, this.gsuite);
await this.stateService.setDirectory(DirectoryType.EntraID, this.entra); await this.stateService.setDirectory(DirectoryType.AzureActiveDirectory, this.azure);
await this.stateService.setDirectory(DirectoryType.Okta, this.okta); await this.stateService.setDirectory(DirectoryType.Okta, this.okta);
await this.stateService.setDirectory(DirectoryType.OneLogin, this.oneLogin); await this.stateService.setDirectory(DirectoryType.OneLogin, this.oneLogin);
await this.stateService.setSync(this.sync); await this.stateService.setSync(this.sync);

View File

@@ -1,6 +1,6 @@
export enum DirectoryType { export enum DirectoryType {
Ldap = 0, Ldap = 0,
EntraID = 1, AzureActiveDirectory = 1,
GSuite = 2, GSuite = 2,
Okta = 3, Okta = 3,
OneLogin = 4, OneLogin = 4,

View File

@@ -2,7 +2,7 @@ import { Account as BaseAccount } from "@/jslib/common/src/models/domain/account
import { DirectoryType } from "@/src/enums/directoryType"; import { DirectoryType } from "@/src/enums/directoryType";
import { EntraIdConfiguration } from "./entraIdConfiguration"; import { AzureConfiguration } from "./azureConfiguration";
import { GSuiteConfiguration } from "./gsuiteConfiguration"; import { GSuiteConfiguration } from "./gsuiteConfiguration";
import { LdapConfiguration } from "./ldapConfiguration"; import { LdapConfiguration } from "./ldapConfiguration";
import { OktaConfiguration } from "./oktaConfiguration"; import { OktaConfiguration } from "./oktaConfiguration";
@@ -29,10 +29,7 @@ export class ClientKeys {
export class DirectoryConfigurations { export class DirectoryConfigurations {
ldap: LdapConfiguration; ldap: LdapConfiguration;
gsuite: GSuiteConfiguration; gsuite: GSuiteConfiguration;
entra: EntraIdConfiguration; azure: AzureConfiguration;
// Azure Active Directory was renamed to Entra ID, but we've kept the old account property name
// to be backwards compatible with existing configurations.
azure: EntraIdConfiguration;
okta: OktaConfiguration; okta: OktaConfiguration;
oneLogin: OneLoginConfiguration; oneLogin: OneLoginConfiguration;
} }

View File

@@ -1,6 +1,6 @@
import { IConfiguration } from "./IConfiguration"; import { IConfiguration } from "./IConfiguration";
export class EntraIdConfiguration implements IConfiguration { export class AzureConfiguration implements IConfiguration {
identityAuthority: string; identityAuthority: string;
tenant: string; tenant: string;
applicationId: string; applicationId: string;

View File

@@ -190,7 +190,7 @@ export class Program extends BaseProgram {
writeLn(" server - On-premise hosted installation URL."); writeLn(" server - On-premise hosted installation URL.");
writeLn(" directory - The type of directory to use."); writeLn(" directory - The type of directory to use.");
writeLn(" ldap.password - The password for connection to this LDAP server."); writeLn(" ldap.password - The password for connection to this LDAP server.");
writeLn(" entra.key - The Entra Id secret key."); writeLn(" azure.key - The Azure AD secret key.");
writeLn(" gsuite.key - The G Suite private key."); writeLn(" gsuite.key - The G Suite private key.");
writeLn(" okta.token - The Okta token."); writeLn(" okta.token - The Okta token.");
writeLn(" onelogin.secret - The OneLogin client secret."); writeLn(" onelogin.secret - The OneLogin client secret.");
@@ -202,7 +202,7 @@ export class Program extends BaseProgram {
writeLn(" bwdc config directory 1"); writeLn(" bwdc config directory 1");
writeLn(" bwdc config ldap.password <password>"); writeLn(" bwdc config ldap.password <password>");
writeLn(" bwdc config ldap.password --secretenv LDAP_PWD"); writeLn(" bwdc config ldap.password --secretenv LDAP_PWD");
writeLn(" bwdc config entra.key <key>"); writeLn(" bwdc config azure.key <key>");
writeLn(" bwdc config gsuite.key <key>"); writeLn(" bwdc config gsuite.key <key>");
writeLn(" bwdc config okta.token <token>"); writeLn(" bwdc config okta.token <token>");
writeLn(" bwdc config onelogin.secret <secret>"); writeLn(" bwdc config onelogin.secret <secret>");

View File

@@ -9,7 +9,7 @@ import { LogService } from "@/jslib/common/src/abstractions/log.service";
import { StateService } from "../abstractions/state.service"; import { StateService } from "../abstractions/state.service";
import { DirectoryType } from "../enums/directoryType"; import { DirectoryType } from "../enums/directoryType";
import { EntraIdConfiguration } from "../models/entraIdConfiguration"; import { AzureConfiguration } from "../models/azureConfiguration";
import { GroupEntry } from "../models/groupEntry"; import { GroupEntry } from "../models/groupEntry";
import { SyncConfiguration } from "../models/syncConfiguration"; import { SyncConfiguration } from "../models/syncConfiguration";
import { UserEntry } from "../models/userEntry"; import { UserEntry } from "../models/userEntry";
@@ -17,10 +17,10 @@ import { UserEntry } from "../models/userEntry";
import { BaseDirectoryService } from "./baseDirectory.service"; import { BaseDirectoryService } from "./baseDirectory.service";
import { IDirectoryService } from "./directory.service"; import { IDirectoryService } from "./directory.service";
const EntraIdPublicIdentityAuthority = "login.microsoftonline.com"; const AzurePublicIdentityAuhtority = "login.microsoftonline.com";
const EntraIdPublicGraphEndpoint = "https://graph.microsoft.com"; const AzurePublicGraphEndpoint = "https://graph.microsoft.com";
const EntraIdGovernmentIdentityAuthority = "login.microsoftonline.us"; const AzureGovermentIdentityAuhtority = "login.microsoftonline.us";
const EntraIdGovernmentGraphEndpoint = "https://graph.microsoft.us"; const AzureGovernmentGraphEndpoint = "https://graph.microsoft.us";
const NextLink = "@odata.nextLink"; const NextLink = "@odata.nextLink";
const DeltaLink = "@odata.deltaLink"; const DeltaLink = "@odata.deltaLink";
@@ -34,9 +34,9 @@ enum UserSetType {
ExcludeGroup, ExcludeGroup,
} }
export class EntraIdDirectoryService extends BaseDirectoryService implements IDirectoryService { export class AzureDirectoryService extends BaseDirectoryService implements IDirectoryService {
private client: graph.Client; private client: graph.Client;
private dirConfig: EntraIdConfiguration; private dirConfig: AzureConfiguration;
private syncConfig: SyncConfiguration; private syncConfig: SyncConfiguration;
private accessToken: string; private accessToken: string;
private accessTokenExpiration: Date; private accessTokenExpiration: Date;
@@ -52,12 +52,12 @@ export class EntraIdDirectoryService extends BaseDirectoryService implements IDi
async getEntries(force: boolean, test: boolean): Promise<[GroupEntry[], UserEntry[]]> { async getEntries(force: boolean, test: boolean): Promise<[GroupEntry[], UserEntry[]]> {
const type = await this.stateService.getDirectoryType(); const type = await this.stateService.getDirectoryType();
if (type !== DirectoryType.EntraID) { if (type !== DirectoryType.AzureActiveDirectory) {
return; return;
} }
this.dirConfig = await this.stateService.getDirectory<EntraIdConfiguration>( this.dirConfig = await this.stateService.getDirectory<AzureConfiguration>(
DirectoryType.EntraID, DirectoryType.AzureActiveDirectory,
); );
if (this.dirConfig == null) { if (this.dirConfig == null) {
return; return;
@@ -459,10 +459,10 @@ export class EntraIdDirectoryService extends BaseDirectoryService implements IDi
const identityAuthority = const identityAuthority =
this.dirConfig.identityAuthority != null this.dirConfig.identityAuthority != null
? this.dirConfig.identityAuthority ? this.dirConfig.identityAuthority
: EntraIdPublicIdentityAuthority; : AzurePublicIdentityAuhtority;
if ( if (
identityAuthority !== EntraIdPublicIdentityAuthority && identityAuthority !== AzurePublicIdentityAuhtority &&
identityAuthority !== EntraIdGovernmentIdentityAuthority identityAuthority !== AzureGovermentIdentityAuhtority
) { ) {
done(new Error(this.i18nService.t("dirConfigIncomplete")), null); done(new Error(this.i18nService.t("dirConfigIncomplete")), null);
return; return;
@@ -546,8 +546,8 @@ export class EntraIdDirectoryService extends BaseDirectoryService implements IDi
} }
private getGraphApiEndpoint(): string { private getGraphApiEndpoint(): string {
return this.dirConfig.identityAuthority === EntraIdGovernmentIdentityAuthority return this.dirConfig.identityAuthority === AzureGovermentIdentityAuhtority
? EntraIdGovernmentGraphEndpoint ? AzureGovernmentGraphEndpoint
: EntraIdPublicGraphEndpoint; : AzurePublicGraphEndpoint;
} }
} }

View File

@@ -5,7 +5,7 @@ import { DirectoryFactoryService } from "../abstractions/directory-factory.servi
import { StateService } from "../abstractions/state.service"; import { StateService } from "../abstractions/state.service";
import { DirectoryType } from "../enums/directoryType"; import { DirectoryType } from "../enums/directoryType";
import { EntraIdDirectoryService } from "./entra-id-directory.service"; import { AzureDirectoryService } from "./azure-directory.service";
import { GSuiteDirectoryService } from "./gsuite-directory.service"; import { GSuiteDirectoryService } from "./gsuite-directory.service";
import { LdapDirectoryService } from "./ldap-directory.service"; import { LdapDirectoryService } from "./ldap-directory.service";
import { OktaDirectoryService } from "./okta-directory.service"; import { OktaDirectoryService } from "./okta-directory.service";
@@ -22,8 +22,8 @@ export class DefaultDirectoryFactoryService implements DirectoryFactoryService {
switch (directoryType) { switch (directoryType) {
case DirectoryType.GSuite: case DirectoryType.GSuite:
return new GSuiteDirectoryService(this.logService, this.i18nService, this.stateService); return new GSuiteDirectoryService(this.logService, this.i18nService, this.stateService);
case DirectoryType.EntraID: case DirectoryType.AzureActiveDirectory:
return new EntraIdDirectoryService(this.logService, this.i18nService, this.stateService); return new AzureDirectoryService(this.logService, this.i18nService, this.stateService);
case DirectoryType.Ldap: case DirectoryType.Ldap:
return new LdapDirectoryService(this.logService, this.i18nService, this.stateService); return new LdapDirectoryService(this.logService, this.i18nService, this.stateService);
case DirectoryType.Okta: case DirectoryType.Okta:

View File

@@ -11,7 +11,7 @@ import { StateService as StateServiceAbstraction } from "@/src/abstractions/stat
import { DirectoryType } from "@/src/enums/directoryType"; import { DirectoryType } from "@/src/enums/directoryType";
import { IConfiguration } from "@/src/models/IConfiguration"; import { IConfiguration } from "@/src/models/IConfiguration";
import { Account } from "@/src/models/account"; import { Account } from "@/src/models/account";
import { EntraIdConfiguration } from "@/src/models/entraIdConfiguration"; import { AzureConfiguration } from "@/src/models/azureConfiguration";
import { GSuiteConfiguration } from "@/src/models/gsuiteConfiguration"; import { GSuiteConfiguration } from "@/src/models/gsuiteConfiguration";
import { LdapConfiguration } from "@/src/models/ldapConfiguration"; import { LdapConfiguration } from "@/src/models/ldapConfiguration";
import { OktaConfiguration } from "@/src/models/oktaConfiguration"; import { OktaConfiguration } from "@/src/models/oktaConfiguration";
@@ -21,10 +21,7 @@ import { SyncConfiguration } from "@/src/models/syncConfiguration";
const SecureStorageKeys = { const SecureStorageKeys = {
ldap: "ldapPassword", ldap: "ldapPassword",
gsuite: "gsuitePrivateKey", gsuite: "gsuitePrivateKey",
// Azure Active Directory was renamed to Entra ID, but we've kept the old property name
// to be backwards compatible with existing configurations.
azure: "azureKey", azure: "azureKey",
entra: "entraKey",
okta: "oktaToken", okta: "oktaToken",
oneLogin: "oneLoginClientSecret", oneLogin: "oneLoginClientSecret",
userDelta: "userDeltaToken", userDelta: "userDeltaToken",
@@ -71,8 +68,8 @@ export class StateService
case DirectoryType.Ldap: case DirectoryType.Ldap:
(configWithSecrets as any).password = await this.getLdapKey(); (configWithSecrets as any).password = await this.getLdapKey();
break; break;
case DirectoryType.EntraID: case DirectoryType.AzureActiveDirectory:
(configWithSecrets as any).key = await this.getEntraKey(); (configWithSecrets as any).key = await this.getAzureKey();
break; break;
case DirectoryType.Okta: case DirectoryType.Okta:
(configWithSecrets as any).token = await this.getOktaKey(); (configWithSecrets as any).token = await this.getOktaKey();
@@ -96,7 +93,7 @@ export class StateService
config: config:
| LdapConfiguration | LdapConfiguration
| GSuiteConfiguration | GSuiteConfiguration
| EntraIdConfiguration | AzureConfiguration
| OktaConfiguration | OktaConfiguration
| OneLoginConfiguration, | OneLoginConfiguration,
): Promise<any> { ): Promise<any> {
@@ -109,11 +106,11 @@ export class StateService
await this.setLdapConfiguration(ldapConfig); await this.setLdapConfiguration(ldapConfig);
break; break;
} }
case DirectoryType.EntraID: { case DirectoryType.AzureActiveDirectory: {
const entraConfig = config as EntraIdConfiguration; const azureConfig = config as AzureConfiguration;
await this.setEntraKey(entraConfig.key); await this.setAzureKey(azureConfig.key);
entraConfig.key = StoredSecurely; azureConfig.key = StoredSecurely;
await this.setEntraConfiguration(entraConfig); await this.setAzureConfiguration(azureConfig);
break; break;
} }
case DirectoryType.Okta: { case DirectoryType.Okta: {
@@ -190,32 +187,23 @@ export class StateService
); );
} }
private async getEntraKey(options?: StorageOptions): Promise<string> { private async getAzureKey(options?: StorageOptions): Promise<string> {
options = this.reconcileOptions(options, await this.defaultSecureStorageOptions()); options = this.reconcileOptions(options, await this.defaultSecureStorageOptions());
if (options?.userId == null) { if (options?.userId == null) {
return null; return null;
} }
const entraKey = await this.secureStorageService.get<string>(
`${options.userId}_${SecureStorageKeys.entra}`,
);
if (entraKey != null) {
return entraKey;
}
return await this.secureStorageService.get<string>( return await this.secureStorageService.get<string>(
`${options.userId}_${SecureStorageKeys.azure}`, `${options.userId}_${SecureStorageKeys.azure}`,
); );
} }
private async setEntraKey(value: string, options?: StorageOptions): Promise<void> { private async setAzureKey(value: string, options?: StorageOptions): Promise<void> {
options = this.reconcileOptions(options, await this.defaultSecureStorageOptions()); options = this.reconcileOptions(options, await this.defaultSecureStorageOptions());
if (options?.userId == null) { if (options?.userId == null) {
return; return;
} }
await this.secureStorageService.save( await this.secureStorageService.save(
`${options.userId}_${SecureStorageKeys.entra}`, `${options.userId}_${SecureStorageKeys.azure}`,
value, value,
options, options,
); );
@@ -271,8 +259,8 @@ export class StateService
return await this.getLdapConfiguration(); return await this.getLdapConfiguration();
case DirectoryType.GSuite: case DirectoryType.GSuite:
return await this.getGsuiteConfiguration(); return await this.getGsuiteConfiguration();
case DirectoryType.EntraID: case DirectoryType.AzureActiveDirectory:
return await this.getEntraConfiguration(); return await this.getAzureConfiguration();
case DirectoryType.Okta: case DirectoryType.Okta:
return await this.getOktaConfiguration(); return await this.getOktaConfiguration();
case DirectoryType.OneLogin: case DirectoryType.OneLogin:
@@ -317,28 +305,17 @@ export class StateService
); );
} }
async getEntraConfiguration(options?: StorageOptions): Promise<EntraIdConfiguration> { async getAzureConfiguration(options?: StorageOptions): Promise<AzureConfiguration> {
const entraConfig = (
await this.getAccount(this.reconcileOptions(options, await this.defaultOnDiskOptions()))
)?.directoryConfigurations?.entra;
if (entraConfig != null) {
return entraConfig;
}
return ( return (
await this.getAccount(this.reconcileOptions(options, await this.defaultOnDiskOptions())) await this.getAccount(this.reconcileOptions(options, await this.defaultOnDiskOptions()))
)?.directoryConfigurations?.azure; )?.directoryConfigurations?.azure;
} }
async setEntraConfiguration( async setAzureConfiguration(value: AzureConfiguration, options?: StorageOptions): Promise<void> {
value: EntraIdConfiguration,
options?: StorageOptions,
): Promise<void> {
const account = await this.getAccount( const account = await this.getAccount(
this.reconcileOptions(options, await this.defaultOnDiskOptions()), this.reconcileOptions(options, await this.defaultOnDiskOptions()),
); );
account.directoryConfigurations.entra = value; account.directoryConfigurations.azure = value;
await this.saveAccount( await this.saveAccount(
account, account,
this.reconcileOptions(options, await this.defaultOnDiskOptions()), this.reconcileOptions(options, await this.defaultOnDiskOptions()),

View File

@@ -3,7 +3,7 @@ import { StateMigrationService as BaseStateMigrationService } from "@/jslib/comm
import { DirectoryType } from "@/src/enums/directoryType"; import { DirectoryType } from "@/src/enums/directoryType";
import { Account, DirectoryConfigurations, DirectorySettings } from "@/src/models/account"; import { Account, DirectoryConfigurations, DirectorySettings } from "@/src/models/account";
import { EntraIdConfiguration } from "@/src/models/entraIdConfiguration"; import { AzureConfiguration } from "@/src/models/azureConfiguration";
import { GSuiteConfiguration } from "@/src/models/gsuiteConfiguration"; import { GSuiteConfiguration } from "@/src/models/gsuiteConfiguration";
import { LdapConfiguration } from "@/src/models/ldapConfiguration"; import { LdapConfiguration } from "@/src/models/ldapConfiguration";
import { OktaConfiguration } from "@/src/models/oktaConfiguration"; import { OktaConfiguration } from "@/src/models/oktaConfiguration";
@@ -14,7 +14,6 @@ const SecureStorageKeys: { [key: string]: any } = {
ldap: "ldapPassword", ldap: "ldapPassword",
gsuite: "gsuitePrivateKey", gsuite: "gsuitePrivateKey",
azure: "azureKey", azure: "azureKey",
entra: "entraIdKey",
okta: "oktaToken", okta: "oktaToken",
oneLogin: "oneLoginClientSecret", oneLogin: "oneLoginClientSecret",
directoryConfigPrefix: "directoryConfig_", directoryConfigPrefix: "directoryConfig_",
@@ -105,16 +104,13 @@ export class StateMigrationService extends BaseStateMigrationService {
} }
}; };
// Initialize typed objects from key/value pairs in storage to either be saved temporarily until an account is authed or applied to the active account // Initilize typed objects from key/value pairs in storage to either be saved temporarily until an account is authed or applied to the active account
const getDirectoryConfig = async <T>(type: DirectoryType) => const getDirectoryConfig = async <T>(type: DirectoryType) =>
await this.get<T>(SecureStorageKeys.directoryConfigPrefix + type); await this.get<T>(SecureStorageKeys.directoryConfigPrefix + type);
const directoryConfigs: DirectoryConfigurations = { const directoryConfigs: DirectoryConfigurations = {
ldap: await getDirectoryConfig<LdapConfiguration>(DirectoryType.Ldap), ldap: await getDirectoryConfig<LdapConfiguration>(DirectoryType.Ldap),
gsuite: await getDirectoryConfig<GSuiteConfiguration>(DirectoryType.GSuite), gsuite: await getDirectoryConfig<GSuiteConfiguration>(DirectoryType.GSuite),
// Azure Active Directory was renamed to Entra ID, but we've kept the old property name azure: await getDirectoryConfig<AzureConfiguration>(DirectoryType.AzureActiveDirectory),
// to be backwards compatible with existing configurations.
azure: await getDirectoryConfig<EntraIdConfiguration>(DirectoryType.EntraID),
entra: await getDirectoryConfig<EntraIdConfiguration>(DirectoryType.EntraID),
okta: await getDirectoryConfig<OktaConfiguration>(DirectoryType.Okta), okta: await getDirectoryConfig<OktaConfiguration>(DirectoryType.Okta),
oneLogin: await getDirectoryConfig<OneLoginConfiguration>(DirectoryType.OneLogin), oneLogin: await getDirectoryConfig<OneLoginConfiguration>(DirectoryType.OneLogin),
}; };