1
0
mirror of https://github.com/bitwarden/directory-connector synced 2025-12-05 23:53:21 +00:00

Compare commits

...

5 Commits

Author SHA1 Message Date
github-actions[bot]
c999d40917 Bump version to 2.10.2 (#270)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
(cherry picked from commit 167c5e0108)
2022-05-03 12:12:22 -06:00
Robyn MacCallum
9d8ed5ea8d [EC-176] Fix CLI errors caused by server URLs (#269)
* Only get global environment urls

* remove unnecessary await
2022-05-03 07:35:44 -04:00
Thomas Rittson
f041c2b703 [EC-182] Refactor StateService secrets handling (#268) 2022-05-03 07:35:35 -04:00
github-actions[bot]
14a7833512 Bumped version to 2.10.1 (#265)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
(cherry picked from commit 2d02d54b56)
2022-04-25 08:49:25 -07:00
Joseph Flinn
94d3ece7a9 Bumping pinned commit of the download-artifact action to bypass the broken GitHub api (#260)
(cherry picked from commit 7753749b62)
2022-04-18 14:35:15 -07:00
4 changed files with 60 additions and 51 deletions

View File

@@ -61,7 +61,7 @@ jobs:
echo "::set-output name=branch-name::$BRANCH_NAME" echo "::set-output name=branch-name::$BRANCH_NAME"
- name: Download all artifacts - name: Download all artifacts
uses: bitwarden/gh-actions/download-artifacts@23433be15ed6fd046ce12b6889c5184a8d9c8783 uses: bitwarden/gh-actions/download-artifacts@c1fa8e09871a860862d6bbe36184b06d2c7e35a8
with: with:
workflow: build.yml workflow: build.yml
workflow_conclusion: success workflow_conclusion: success

View File

@@ -21,16 +21,6 @@ export abstract class StateService extends BaseStateServiceAbstraction<Account>
| OktaConfiguration | OktaConfiguration
| OneLoginConfiguration | OneLoginConfiguration
) => Promise<any>; ) => Promise<any>;
getLdapKey: (options?: StorageOptions) => Promise<string>;
setLdapKey: (value: string, options?: StorageOptions) => Promise<void>;
getGsuiteKey: (options?: StorageOptions) => Promise<string>;
setGsuiteKey: (value: string, options?: StorageOptions) => Promise<void>;
getAzureKey: (options?: StorageOptions) => Promise<string>;
setAzureKey: (value: string, options?: StorageOptions) => Promise<void>;
getOktaKey: (options?: StorageOptions) => Promise<string>;
setOktaKey: (value: string, options?: StorageOptions) => Promise<void>;
getOneLoginKey: (options?: StorageOptions) => Promise<string>;
setOneLoginKey: (value: string, options?: StorageOptions) => Promise<void>;
getLdapConfiguration: (options?: StorageOptions) => Promise<LdapConfiguration>; getLdapConfiguration: (options?: StorageOptions) => Promise<LdapConfiguration>;
setLdapConfiguration: (value: LdapConfiguration, options?: StorageOptions) => Promise<void>; setLdapConfiguration: (value: LdapConfiguration, options?: StorageOptions) => Promise<void>;
getGsuiteConfiguration: (options?: StorageOptions) => Promise<GSuiteConfiguration>; getGsuiteConfiguration: (options?: StorageOptions) => Promise<GSuiteConfiguration>;

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": "2.10.0", "version": "2.10.2",
"author": "Bitwarden Inc. <hello@bitwarden.com> (https://bitwarden.com)", "author": "Bitwarden Inc. <hello@bitwarden.com> (https://bitwarden.com)",
"homepage": "https://bitwarden.com", "homepage": "https://bitwarden.com",
"license": "GPL-3.0", "license": "GPL-3.0",

View File

@@ -2,6 +2,7 @@ import { LogService } from "jslib-common/abstractions/log.service";
import { StateMigrationService } from "jslib-common/abstractions/stateMigration.service"; import { StateMigrationService } from "jslib-common/abstractions/stateMigration.service";
import { StorageService } from "jslib-common/abstractions/storage.service"; import { StorageService } from "jslib-common/abstractions/storage.service";
import { StateFactory } from "jslib-common/factories/stateFactory"; import { StateFactory } from "jslib-common/factories/stateFactory";
import { EnvironmentUrls } from "jslib-common/models/domain/environmentUrls";
import { GlobalState } from "jslib-common/models/domain/globalState"; import { GlobalState } from "jslib-common/models/domain/globalState";
import { StorageOptions } from "jslib-common/models/domain/storageOptions"; import { StorageOptions } from "jslib-common/models/domain/storageOptions";
import { StateService as BaseStateService } from "jslib-common/services/state.service"; import { StateService as BaseStateService } from "jslib-common/services/state.service";
@@ -60,24 +61,30 @@ export class StateService
} }
if (this.useSecureStorageForSecrets) { if (this.useSecureStorageForSecrets) {
// Do not introduce secrets into the in-memory account object
const configWithSecrets = Object.assign({}, config);
switch (type) { switch (type) {
case DirectoryType.Ldap: case DirectoryType.Ldap:
(config as any).password = await this.getLdapKey(); (configWithSecrets as any).password = await this.getLdapKey();
break; break;
case DirectoryType.AzureActiveDirectory: case DirectoryType.AzureActiveDirectory:
(config as any).key = await this.getAzureKey(); (configWithSecrets as any).key = await this.getAzureKey();
break; break;
case DirectoryType.Okta: case DirectoryType.Okta:
(config as any).token = await this.getOktaKey(); (configWithSecrets as any).token = await this.getOktaKey();
break; break;
case DirectoryType.GSuite: case DirectoryType.GSuite:
(config as any).privateKey = await this.getGsuiteKey(); (configWithSecrets as any).privateKey = await this.getGsuiteKey();
break; break;
case DirectoryType.OneLogin: case DirectoryType.OneLogin:
(config as any).clientSecret = await this.getOneLoginKey(); (configWithSecrets as any).clientSecret = await this.getOneLoginKey();
break; break;
} }
return configWithSecrets as T;
} }
return config as T; return config as T;
} }
@@ -90,45 +97,53 @@ export class StateService
| OktaConfiguration | OktaConfiguration
| OneLoginConfiguration | OneLoginConfiguration
): Promise<any> { ): Promise<any> {
const savedConfig: any = Object.assign({}, config);
if (this.useSecureStorageForSecrets) { if (this.useSecureStorageForSecrets) {
switch (type) { switch (type) {
case DirectoryType.Ldap: case DirectoryType.Ldap: {
await this.setLdapKey(savedConfig.password); const ldapConfig = config as LdapConfiguration;
savedConfig.password = StoredSecurely; await this.setLdapKey(ldapConfig.password);
await this.setLdapConfiguration(savedConfig); ldapConfig.password = StoredSecurely;
await this.setLdapConfiguration(ldapConfig);
break; break;
case DirectoryType.AzureActiveDirectory: }
await this.setAzureKey(savedConfig.key); case DirectoryType.AzureActiveDirectory: {
savedConfig.key = StoredSecurely; const azureConfig = config as AzureConfiguration;
await this.setAzureConfiguration(savedConfig); await this.setAzureKey(azureConfig.key);
azureConfig.key = StoredSecurely;
await this.setAzureConfiguration(azureConfig);
break; break;
case DirectoryType.Okta: }
await this.setOktaKey(savedConfig.token); case DirectoryType.Okta: {
savedConfig.token = StoredSecurely; const oktaConfig = config as OktaConfiguration;
await this.setOktaConfiguration(savedConfig); await this.setOktaKey(oktaConfig.token);
oktaConfig.token = StoredSecurely;
await this.setOktaConfiguration(oktaConfig);
break; break;
case DirectoryType.GSuite: }
if (savedConfig.privateKey == null) { case DirectoryType.GSuite: {
const gsuiteConfig = config as GSuiteConfiguration;
if (gsuiteConfig.privateKey == null) {
await this.setGsuiteKey(null); await this.setGsuiteKey(null);
} else { } else {
(config as GSuiteConfiguration).privateKey = savedConfig.privateKey = const normalizedPrivateKey = gsuiteConfig.privateKey.replace(/\\n/g, "\n");
savedConfig.privateKey.replace(/\\n/g, "\n"); await this.setGsuiteKey(normalizedPrivateKey);
await this.setGsuiteKey(savedConfig.privateKey); gsuiteConfig.privateKey = StoredSecurely;
savedConfig.privateKey = StoredSecurely;
} }
await this.setGsuiteConfiguration(savedConfig); await this.setGsuiteConfiguration(gsuiteConfig);
break; break;
case DirectoryType.OneLogin: }
await this.setOneLoginKey(savedConfig.clientSecret); case DirectoryType.OneLogin: {
savedConfig.clientSecret = StoredSecurely; const oneLoginConfig = config as OneLoginConfiguration;
await this.setOneLoginConfiguration(savedConfig); await this.setOneLoginKey(oneLoginConfig.clientSecret);
oneLoginConfig.clientSecret = StoredSecurely;
await this.setOneLoginConfiguration(oneLoginConfig);
break; break;
}
} }
} }
} }
async getLdapKey(options?: StorageOptions): Promise<string> { private async getLdapKey(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;
@@ -138,7 +153,7 @@ export class StateService
); );
} }
async setLdapKey(value: string, options?: StorageOptions): Promise<void> { private async setLdapKey(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;
@@ -150,7 +165,7 @@ export class StateService
); );
} }
async getGsuiteKey(options?: StorageOptions): Promise<string> { private async getGsuiteKey(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;
@@ -160,7 +175,7 @@ export class StateService
); );
} }
async setGsuiteKey(value: string, options?: StorageOptions): Promise<void> { private async setGsuiteKey(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;
@@ -172,7 +187,7 @@ export class StateService
); );
} }
async getAzureKey(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;
@@ -182,7 +197,7 @@ export class StateService
); );
} }
async setAzureKey(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;
@@ -194,7 +209,7 @@ export class StateService
); );
} }
async getOktaKey(options?: StorageOptions): Promise<string> { private async getOktaKey(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;
@@ -204,7 +219,7 @@ export class StateService
); );
} }
async setOktaKey(value: string, options?: StorageOptions): Promise<void> { private async setOktaKey(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;
@@ -216,7 +231,7 @@ export class StateService
); );
} }
async getOneLoginKey(options?: StorageOptions): Promise<string> { private async getOneLoginKey(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;
@@ -226,7 +241,7 @@ export class StateService
); );
} }
async setOneLoginKey(value: string, options?: StorageOptions): Promise<void> { private async setOneLoginKey(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;
@@ -568,4 +583,8 @@ export class StateService
}; };
return Object.assign(this.createAccount(), persistentAccountInformation); return Object.assign(this.createAccount(), persistentAccountInformation);
} }
async getEnvironmentUrls(options?: StorageOptions): Promise<EnvironmentUrls> {
return this.getGlobalEnvironmentUrls(options);
}
} }