mirror of
https://github.com/bitwarden/browser
synced 2025-12-18 01:03:35 +00:00
[PM-16793] port credential generator service to providers (#14071)
* introduce extension service * deprecate legacy forwarder types * eliminate repeat algorithm emissions * extend logging to preference management * align forwarder ids with vendor ids * fix duplicate policy emissions; debugging required logger enhancements ----- Co-authored-by: Daniel James Smith <2670567+djsmith85@users.noreply.github.com>
This commit is contained in:
@@ -7,19 +7,40 @@ import { ApiService } from "@bitwarden/common/abstractions/api.service";
|
||||
import { PolicyService } from "@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction";
|
||||
import { EncryptService } from "@bitwarden/common/key-management/crypto/abstractions/encrypt.service";
|
||||
import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service";
|
||||
import { LogService } from "@bitwarden/common/platform/abstractions/log.service";
|
||||
import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service";
|
||||
import { StateProvider } from "@bitwarden/common/platform/state";
|
||||
import { KeyServiceLegacyEncryptorProvider } from "@bitwarden/common/tools/cryptography/key-service-legacy-encryptor-provider";
|
||||
import { LegacyEncryptorProvider } from "@bitwarden/common/tools/cryptography/legacy-encryptor-provider";
|
||||
import { disabledSemanticLoggerProvider } from "@bitwarden/common/tools/log";
|
||||
import { Site } from "@bitwarden/common/tools/extension";
|
||||
import { ExtensionRegistry } from "@bitwarden/common/tools/extension/extension-registry.abstraction";
|
||||
import { ExtensionService } from "@bitwarden/common/tools/extension/extension.service";
|
||||
import { DefaultFields, DefaultSites, Extension } from "@bitwarden/common/tools/extension/metadata";
|
||||
import { RuntimeExtensionRegistry } from "@bitwarden/common/tools/extension/runtime-extension-registry";
|
||||
import { VendorExtensions, Vendors } from "@bitwarden/common/tools/extension/vendor";
|
||||
import { RestClient } from "@bitwarden/common/tools/integration/rpc";
|
||||
import {
|
||||
LogProvider,
|
||||
disabledSemanticLoggerProvider,
|
||||
enableLogForTypes,
|
||||
} from "@bitwarden/common/tools/log";
|
||||
import { SystemServiceProvider } from "@bitwarden/common/tools/providers";
|
||||
import { UserStateSubjectDependencyProvider } from "@bitwarden/common/tools/state/user-state-subject-dependency-provider";
|
||||
import {
|
||||
BuiltIn,
|
||||
createRandomizer,
|
||||
CredentialGeneratorService,
|
||||
Randomizer,
|
||||
providers,
|
||||
DefaultCredentialGeneratorService,
|
||||
} from "@bitwarden/generator-core";
|
||||
import { KeyService } from "@bitwarden/key-management";
|
||||
|
||||
export const RANDOMIZER = new SafeInjectionToken<Randomizer>("Randomizer");
|
||||
const GENERATOR_SERVICE_PROVIDER = new SafeInjectionToken<providers.CredentialGeneratorProviders>(
|
||||
"CredentialGeneratorProviders",
|
||||
);
|
||||
const SYSTEM_SERVICE_PROVIDER = new SafeInjectionToken<SystemServiceProvider>("SystemServices");
|
||||
|
||||
/** Shared module containing generator component dependencies */
|
||||
@NgModule({
|
||||
@@ -35,6 +56,116 @@ export const RANDOMIZER = new SafeInjectionToken<Randomizer>("Randomizer");
|
||||
useClass: KeyServiceLegacyEncryptorProvider,
|
||||
deps: [EncryptService, KeyService],
|
||||
}),
|
||||
safeProvider({
|
||||
provide: ExtensionRegistry,
|
||||
useFactory: () => {
|
||||
const registry = new RuntimeExtensionRegistry(DefaultSites, DefaultFields);
|
||||
|
||||
registry.registerSite(Extension[Site.forwarder]);
|
||||
for (const vendor of Vendors) {
|
||||
registry.registerVendor(vendor);
|
||||
}
|
||||
for (const extension of VendorExtensions) {
|
||||
registry.registerExtension(extension);
|
||||
}
|
||||
registry.setPermission({ all: true }, "default");
|
||||
|
||||
return registry;
|
||||
},
|
||||
deps: [],
|
||||
}),
|
||||
safeProvider({
|
||||
provide: SYSTEM_SERVICE_PROVIDER,
|
||||
useFactory: (
|
||||
encryptor: LegacyEncryptorProvider,
|
||||
state: StateProvider,
|
||||
policy: PolicyService,
|
||||
registry: ExtensionRegistry,
|
||||
logger: LogService,
|
||||
environment: PlatformUtilsService,
|
||||
) => {
|
||||
let log: LogProvider;
|
||||
if (environment.isDev()) {
|
||||
log = enableLogForTypes(logger, []);
|
||||
} else {
|
||||
log = disabledSemanticLoggerProvider;
|
||||
}
|
||||
|
||||
const extension = new ExtensionService(registry, {
|
||||
encryptor,
|
||||
state,
|
||||
log,
|
||||
now: Date.now,
|
||||
});
|
||||
|
||||
return {
|
||||
policy,
|
||||
extension,
|
||||
log,
|
||||
};
|
||||
},
|
||||
deps: [
|
||||
LegacyEncryptorProvider,
|
||||
StateProvider,
|
||||
PolicyService,
|
||||
ExtensionRegistry,
|
||||
LogService,
|
||||
PlatformUtilsService,
|
||||
],
|
||||
}),
|
||||
safeProvider({
|
||||
provide: GENERATOR_SERVICE_PROVIDER,
|
||||
useFactory: (
|
||||
system: SystemServiceProvider,
|
||||
random: Randomizer,
|
||||
encryptor: LegacyEncryptorProvider,
|
||||
state: StateProvider,
|
||||
i18n: I18nService,
|
||||
api: ApiService,
|
||||
) => {
|
||||
const userStateDeps = {
|
||||
encryptor,
|
||||
state,
|
||||
log: system.log,
|
||||
now: Date.now,
|
||||
} satisfies UserStateSubjectDependencyProvider;
|
||||
|
||||
const metadata = new providers.GeneratorMetadataProvider(
|
||||
userStateDeps,
|
||||
system,
|
||||
Object.values(BuiltIn),
|
||||
);
|
||||
const profile = new providers.GeneratorProfileProvider(userStateDeps, system.policy);
|
||||
|
||||
const generator: providers.GeneratorDependencyProvider = {
|
||||
randomizer: random,
|
||||
client: new RestClient(api, i18n),
|
||||
i18nService: i18n,
|
||||
};
|
||||
|
||||
const userState: UserStateSubjectDependencyProvider = {
|
||||
encryptor,
|
||||
state,
|
||||
log: system.log,
|
||||
now: Date.now,
|
||||
};
|
||||
|
||||
return {
|
||||
userState,
|
||||
generator,
|
||||
profile,
|
||||
metadata,
|
||||
} satisfies providers.CredentialGeneratorProviders;
|
||||
},
|
||||
deps: [
|
||||
SYSTEM_SERVICE_PROVIDER,
|
||||
RANDOMIZER,
|
||||
LegacyEncryptorProvider,
|
||||
StateProvider,
|
||||
I18nService,
|
||||
ApiService,
|
||||
],
|
||||
}),
|
||||
safeProvider({
|
||||
provide: UserStateSubjectDependencyProvider,
|
||||
useFactory: (encryptor: LegacyEncryptorProvider, state: StateProvider) =>
|
||||
@@ -42,19 +173,14 @@ export const RANDOMIZER = new SafeInjectionToken<Randomizer>("Randomizer");
|
||||
encryptor,
|
||||
state,
|
||||
log: disabledSemanticLoggerProvider,
|
||||
now: Date.now,
|
||||
}),
|
||||
deps: [LegacyEncryptorProvider, StateProvider],
|
||||
}),
|
||||
safeProvider({
|
||||
provide: CredentialGeneratorService,
|
||||
useClass: CredentialGeneratorService,
|
||||
deps: [
|
||||
RANDOMIZER,
|
||||
PolicyService,
|
||||
ApiService,
|
||||
I18nService,
|
||||
UserStateSubjectDependencyProvider,
|
||||
],
|
||||
useClass: DefaultCredentialGeneratorService,
|
||||
deps: [GENERATOR_SERVICE_PROVIDER, SYSTEM_SERVICE_PROVIDER],
|
||||
}),
|
||||
],
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user