1
0
mirror of https://github.com/bitwarden/browser synced 2025-12-06 00:13:28 +00:00

[PM-19914][PM-19913] trim domains and long fields in forwarders (#14141)

* PM-19913: Added max length to the generated_for and description peroperties in the FirefoxRelay API payload
* [PM-19913] Added maxLength restriction to the website and generatedBy methods. Added maxLength limit of 200 to the description of addy.io
This commit is contained in:
Alexander Aronov
2025-04-14 14:42:41 +02:00
committed by GitHub
parent 5cc3ed7c5f
commit 8885f5da24
6 changed files with 70 additions and 8 deletions

View File

@@ -189,6 +189,33 @@ describe("IntegrationContext", () => {
expect(result).toBe("");
});
it("extracts the hostname when extractHostname is true", () => {
const context = new IntegrationContext(EXAMPLE_META, null, i18n);
const result = context.website(
{ website: "https://www.example.com/path" },
{ extractHostname: true },
);
expect(result).toBe("www.example.com");
});
it("falls back to the full URL when Utils.getHost cannot extract the hostname", () => {
const context = new IntegrationContext(EXAMPLE_META, null, i18n);
const result = context.website({ website: "invalid-url" }, { extractHostname: true });
expect(result).toBe("invalid-url");
});
it("truncates the website to maxLength", () => {
const context = new IntegrationContext(EXAMPLE_META, null, i18n);
const result = context.website({ website: "www.example.com" }, { maxLength: 3 });
expect(result).toBe("www");
});
});
describe("generatedBy", () => {
@@ -211,5 +238,15 @@ describe("IntegrationContext", () => {
expect(result).toBe("result");
expect(i18n.t).toHaveBeenCalledWith("forwarderGeneratedByWithWebsite", "www.example.com");
});
it("truncates generated text to maxLength", () => {
const context = new IntegrationContext(EXAMPLE_META, null, i18n);
i18n.t.mockReturnValue("This is the result text");
const result = context.generatedBy({ website: null }, { maxLength: 4 });
expect(result).toBe("This");
expect(i18n.t).toHaveBeenCalledWith("forwarderGeneratedBy", "");
});
});
});

View File

@@ -79,24 +79,40 @@ export class IntegrationContext<Settings extends object> {
/** look up the website the integration is working with.
* @param request supplies information about the state of the extension site
* @param options optional parameters
* @param options.extractHostname when `true`, tries to extract the hostname from the website URL, returns full URL otherwise
* @param options.maxLength limits the length of the return value
* @returns The website or an empty string if a website isn't available
* @remarks `website` is usually supplied when generating a credential from the vault
*/
website(request: IntegrationRequest) {
return request.website ?? "";
website(
request: IntegrationRequest,
options?: { extractHostname?: boolean; maxLength?: number },
) {
let url = request.website ?? "";
if (options?.extractHostname) {
url = Utils.getHost(url) ?? url;
}
return url.slice(0, options?.maxLength);
}
/** look up localized text indicating Bitwarden requested the forwarding address.
* @param request supplies information about the state of the extension site
* @param options optional parameters
* @param options.extractHostname when `true`, extracts the hostname from the website URL
* @param options.maxLength limits the length of the return value
* @returns localized text describing a generated forwarding address
*/
generatedBy(request: IntegrationRequest) {
const website = this.website(request);
generatedBy(
request: IntegrationRequest,
options?: { extractHostname?: boolean; maxLength?: number },
) {
const website = this.website(request, { extractHostname: options?.extractHostname ?? false });
const descriptionId =
website === "" ? "forwarderGeneratedBy" : "forwarderGeneratedByWithWebsite";
const description = this.i18n.t(descriptionId, website);
return description;
return description.slice(0, options?.maxLength);
}
}

View File

@@ -55,6 +55,10 @@ describe("Addy.io forwarder", () => {
const result = AddyIo.forwarder.createForwardingEmail.body(null, context);
expect(context.generatedBy).toHaveBeenCalledWith(null, {
extractHostname: true,
maxLength: 200,
});
expect(result).toEqual({
domain: "domain",
description: "generated by",

View File

@@ -39,7 +39,7 @@ const createForwardingEmail = Object.freeze({
body(request: IntegrationRequest, context: ForwarderContext<AddyIoSettings>) {
return {
domain: context.emailDomain(),
description: context.generatedBy(request),
description: context.generatedBy(request, { extractHostname: true, maxLength: 200 }),
};
},
hasJsonPayload(response: Response) {

View File

@@ -56,6 +56,11 @@ describe("Firefox Relay forwarder", () => {
const result = FirefoxRelay.forwarder.createForwardingEmail.body(null, context);
expect(context.website).toHaveBeenCalledWith(null, { maxLength: 255 });
expect(context.generatedBy).toHaveBeenCalledWith(null, {
extractHostname: true,
maxLength: 64,
});
expect(result).toEqual({
enabled: true,
generated_for: "website",

View File

@@ -33,8 +33,8 @@ const createForwardingEmail = Object.freeze({
body(request: IntegrationRequest, context: ForwarderContext<FirefoxRelaySettings>) {
return {
enabled: true,
generated_for: context.website(request),
description: context.generatedBy(request),
generated_for: context.website(request, { maxLength: 255 }),
description: context.generatedBy(request, { extractHostname: true, maxLength: 64 }),
};
},
hasJsonPayload(response: Response) {