1
0
mirror of https://github.com/bitwarden/browser.git synced 2025-02-08 00:01:28 +01:00

[EC-598] feat: half-implemented user interfacing

This commit is contained in:
Andreas Coroiu 2022-12-05 15:11:16 +01:00
parent 02e9621fa2
commit 8e955a7ccd
No known key found for this signature in database
GPG Key ID: E70B5FFC81DFEC1A
10 changed files with 101 additions and 15 deletions

View File

@ -9,6 +9,7 @@ import { CryptoFunctionService as CryptoFunctionServiceAbstraction } from "@bitw
import { EncryptService } from "@bitwarden/common/abstractions/encrypt.service"; import { EncryptService } from "@bitwarden/common/abstractions/encrypt.service";
import { EventService as EventServiceAbstraction } from "@bitwarden/common/abstractions/event.service"; import { EventService as EventServiceAbstraction } from "@bitwarden/common/abstractions/event.service";
import { ExportService as ExportServiceAbstraction } from "@bitwarden/common/abstractions/export.service"; import { ExportService as ExportServiceAbstraction } from "@bitwarden/common/abstractions/export.service";
import { Fido2UserInterfaceService as Fido2UserInterfaceServiceAbstraction } from "@bitwarden/common/abstractions/fido2/fido2-user-interface.service.abstraction";
import { Fido2Service as Fido2ServiceAbstraction } from "@bitwarden/common/abstractions/fido2/fido2.service.abstraction"; import { Fido2Service as Fido2ServiceAbstraction } from "@bitwarden/common/abstractions/fido2/fido2.service.abstraction";
import { FileUploadService as FileUploadServiceAbstraction } from "@bitwarden/common/abstractions/fileUpload.service"; import { FileUploadService as FileUploadServiceAbstraction } from "@bitwarden/common/abstractions/fileUpload.service";
import { FolderApiServiceAbstraction } from "@bitwarden/common/abstractions/folder/folder-api.service.abstraction"; import { FolderApiServiceAbstraction } from "@bitwarden/common/abstractions/folder/folder-api.service.abstraction";
@ -99,6 +100,7 @@ import BrowserLocalStorageService from "../services/browserLocalStorage.service"
import BrowserMessagingService from "../services/browserMessaging.service"; import BrowserMessagingService from "../services/browserMessaging.service";
import BrowserMessagingPrivateModeBackgroundService from "../services/browserMessagingPrivateModeBackground.service"; import BrowserMessagingPrivateModeBackgroundService from "../services/browserMessagingPrivateModeBackground.service";
import BrowserPlatformUtilsService from "../services/browserPlatformUtils.service"; import BrowserPlatformUtilsService from "../services/browserPlatformUtils.service";
import { BrowserFido2UserInterfaceService } from "../services/fido2/browser-fido2-user-interface.service";
import { FolderService } from "../services/folders/folder.service"; import { FolderService } from "../services/folders/folder.service";
import I18nService from "../services/i18n.service"; import I18nService from "../services/i18n.service";
import { KeyGenerationService } from "../services/keyGeneration.service"; import { KeyGenerationService } from "../services/keyGeneration.service";
@ -117,6 +119,16 @@ import RuntimeBackground from "./runtime.background";
import TabsBackground from "./tabs.background"; import TabsBackground from "./tabs.background";
import WebRequestBackground from "./webRequest.background"; import WebRequestBackground from "./webRequest.background";
export class Fido2UserInterfaceService implements Fido2UserInterfaceServiceAbstraction {
async verifyUser(): Promise<boolean> {
return false;
}
async verifyPresence(): Promise<boolean> {
return false;
}
}
export default class MainBackground { export default class MainBackground {
messagingService: MessagingServiceAbstraction; messagingService: MessagingServiceAbstraction;
storageService: AbstractStorageService; storageService: AbstractStorageService;
@ -167,6 +179,7 @@ export default class MainBackground {
policyApiService: PolicyApiServiceAbstraction; policyApiService: PolicyApiServiceAbstraction;
userVerificationApiService: UserVerificationApiServiceAbstraction; userVerificationApiService: UserVerificationApiServiceAbstraction;
syncNotifierService: SyncNotifierServiceAbstraction; syncNotifierService: SyncNotifierServiceAbstraction;
fido2UserInterfaceService: Fido2UserInterfaceServiceAbstraction;
fido2Service: Fido2ServiceAbstraction; fido2Service: Fido2ServiceAbstraction;
// Passed to the popup for Safari to workaround issues with theming, downloading, etc. // Passed to the popup for Safari to workaround issues with theming, downloading, etc.
@ -355,7 +368,7 @@ export default class MainBackground {
// AuthService should send the messages to the background not popup. // AuthService should send the messages to the background not popup.
send = (subscriber: string, arg: any = {}) => { send = (subscriber: string, arg: any = {}) => {
const message = Object.assign({}, { command: subscriber }, arg); const message = Object.assign({}, { command: subscriber }, arg);
that.runtimeBackground.processMessage(message, that, null); that.runtimeBackground.processMessage(message, that);
}; };
})(); })();
this.authService = new AuthService( this.authService = new AuthService(
@ -464,7 +477,8 @@ export default class MainBackground {
this.userVerificationApiService this.userVerificationApiService
); );
this.fido2Service = new Fido2Service(); this.fido2UserInterfaceService = new BrowserFido2UserInterfaceService(this.popupUtilsService);
this.fido2Service = new Fido2Service(this.fido2UserInterfaceService);
const systemUtilsServiceReloadCallback = () => { const systemUtilsServiceReloadCallback = () => {
const forceWindowReload = const forceWindowReload =

View File

@ -334,7 +334,7 @@ export class NativeMessagingBackground {
return; return;
} }
this.runtimeBackground.processMessage({ command: "unlocked" }, null, null); this.runtimeBackground.processMessage({ command: "unlocked" }, null);
} }
break; break;
} }

View File

@ -47,16 +47,20 @@ export default class RuntimeBackground {
sender: chrome.runtime.MessageSender, sender: chrome.runtime.MessageSender,
sendResponse: any sendResponse: any
) => { ) => {
await this.processMessage(msg, sender, sendResponse); const response = await this.processMessage(msg, sender);
sendResponse(response);
}; };
BrowserApi.messageListener("runtime.background", backgroundMessageListener); BrowserApi.messageListener("runtime.background", (msg, sender, sendResponse) => {
backgroundMessageListener(msg, sender, sendResponse);
return true;
});
if (this.main.popupOnlyContext) { if (this.main.popupOnlyContext) {
(window as any).bitwardenBackgroundMessageListener = backgroundMessageListener; (window as any).bitwardenBackgroundMessageListener = backgroundMessageListener;
} }
} }
async processMessage(msg: any, sender: any, sendResponse: any) { async processMessage(msg: any, sender: any): Promise<unknown> {
switch (msg.command) { switch (msg.command) {
case "loggedIn": case "loggedIn":
case "unlocked": { case "unlocked": {
@ -205,11 +209,9 @@ export default class RuntimeBackground {
this.platformUtilsService.copyToClipboard(msg.identifier, { window: window }); this.platformUtilsService.copyToClipboard(msg.identifier, { window: window });
break; break;
case "fido2RegisterCredentialRequest": case "fido2RegisterCredentialRequest":
sendResponse(await this.main.fido2Service.createCredential(msg.data)); return await this.main.fido2Service.createCredential(msg.data);
break;
default:
break;
} }
return undefined;
} }
private async autofillPage(tabToAutoFill: chrome.tabs.Tab) { private async autofillPage(tabToAutoFill: chrome.tabs.Tab) {

View File

@ -126,13 +126,21 @@ export class BrowserApi {
chrome.tabs.create({ url: url, active: active }); chrome.tabs.create({ url: url, active: active });
} }
static createNewWindow(
url: string,
focused = true,
type: chrome.windows.createTypeEnum = "normal"
) {
chrome.windows.create({ url, focused, type });
}
static messageListener( static messageListener(
name: string, name: string,
callback: (message: any, sender: chrome.runtime.MessageSender, response: any) => void callback: (message: any, sender: chrome.runtime.MessageSender, response: any) => unknown
) { ) {
chrome.runtime.onMessage.addListener( chrome.runtime.onMessage.addListener(
(msg: any, sender: chrome.runtime.MessageSender, response: any) => { (msg: any, sender: chrome.runtime.MessageSender, response: any) => {
callback(msg, sender, response); return callback(msg, sender, response);
} }
); );
} }

View File

@ -67,7 +67,7 @@ export class PopupUtilsService {
height: Math.round(bodyRect.height || 600), height: Math.round(bodyRect.height || 600),
}); });
if (this.inPopup(win)) { if (win && this.inPopup(win)) {
BrowserApi.closePopup(win); BrowserApi.closePopup(win);
} }
} else if (typeof chrome !== "undefined" && chrome.tabs && chrome.tabs.create) { } else if (typeof chrome !== "undefined" && chrome.tabs && chrome.tabs.create) {

View File

@ -0,0 +1,43 @@
import { Fido2UserInterfaceService as Fido2UserInterfaceServiceAbstraction } from "@bitwarden/common/abstractions/fido2/fido2-user-interface.service.abstraction";
import { BrowserApi } from "../../browser/browserApi";
import { PopupUtilsService } from "../../popup/services/popup-utils.service";
const BrowserFido2MessageName = "BrowserFido2UserInterfaceServiceMessage";
type BrowserFido2Message = {
type: "VerifyUserRequest";
id: string;
};
export interface BrowserFido2UserInterfaceRequestData {
requestId: string;
}
export class BrowserFido2UserInterfaceService implements Fido2UserInterfaceServiceAbstraction {
constructor(private popupUtilsService: PopupUtilsService) {
BrowserApi.messageListener(BrowserFido2MessageName, this.processMessage.bind(this));
}
async verifyUser(): Promise<boolean> {
return false;
}
async verifyPresence(): Promise<boolean> {
// eslint-disable-next-line no-console
console.log("User Presence Verification requested");
const id = "test";
this.popupUtilsService.popOut(null, `popup/index.html?uilocation=popout#/fido2?id=${id}`);
return await new Promise((resolve) => setTimeout(resolve, 60000));
}
private processMessage(msg: BrowserFido2Message) {
// eslint-disable-next-line no-console
console.log("BrowserFido2UserInterfaceService.processMessage", { msg });
}
private sendMessage(msg: BrowserFido2Message) {
chrome.runtime.sendMessage({ test: "wat" });
BrowserApi.sendMessage(BrowserFido2MessageName, msg);
}
}

View File

@ -0,0 +1,4 @@
export abstract class Fido2UserInterfaceService {
verifyUser: () => Promise<boolean>;
verifyPresence: () => Promise<boolean>;
}

View File

@ -34,6 +34,6 @@ export interface CredentialRegistrationParams {
} }
export abstract class Fido2Service { export abstract class Fido2Service {
createCredential: (params: CredentialRegistrationParams) => unknown; createCredential: (params: CredentialRegistrationParams) => Promise<unknown>;
assertCredential: () => unknown; assertCredential: () => unknown;
} }

View File

@ -1,10 +1,14 @@
import { Fido2UserInterfaceService } from "../../abstractions/fido2/fido2-user-interface.service.abstraction";
import { import {
CredentialRegistrationParams, CredentialRegistrationParams,
Fido2Service as Fido2ServiceAbstraction, Fido2Service as Fido2ServiceAbstraction,
} from "../../abstractions/fido2/fido2.service.abstraction"; } from "../../abstractions/fido2/fido2.service.abstraction";
export class Fido2Service implements Fido2ServiceAbstraction { export class Fido2Service implements Fido2ServiceAbstraction {
createCredential(params: CredentialRegistrationParams): unknown { constructor(private fido2UserInterfaceService: Fido2UserInterfaceService) {}
async createCredential(params: CredentialRegistrationParams): Promise<unknown> {
await this.fido2UserInterfaceService.verifyPresence();
// eslint-disable-next-line no-console // eslint-disable-next-line no-console
console.log("Fido2Service.registerCredential", params); console.log("Fido2Service.registerCredential", params);
return "createCredential response"; return "createCredential response";

View File

@ -0,0 +1,11 @@
import { Fido2UserInterfaceService as Fido2UserInterfaceServiceAbstraction } from "../../abstractions/fido2/fido2-user-interface.service.abstraction";
export class Fido2UserInterfaceService implements Fido2UserInterfaceServiceAbstraction {
async verifyUser(): Promise<boolean> {
return false;
}
async verifyPresence(): Promise<boolean> {
return false;
}
}