mirror of
https://github.com/bitwarden/browser
synced 2025-12-11 13:53:34 +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:
@@ -189,6 +189,33 @@ describe("IntegrationContext", () => {
|
|||||||
|
|
||||||
expect(result).toBe("");
|
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", () => {
|
describe("generatedBy", () => {
|
||||||
@@ -211,5 +238,15 @@ describe("IntegrationContext", () => {
|
|||||||
expect(result).toBe("result");
|
expect(result).toBe("result");
|
||||||
expect(i18n.t).toHaveBeenCalledWith("forwarderGeneratedByWithWebsite", "www.example.com");
|
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", "");
|
||||||
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -79,24 +79,40 @@ export class IntegrationContext<Settings extends object> {
|
|||||||
|
|
||||||
/** look up the website the integration is working with.
|
/** look up the website the integration is working with.
|
||||||
* @param request supplies information about the state of the extension site
|
* @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
|
* @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
|
* @remarks `website` is usually supplied when generating a credential from the vault
|
||||||
*/
|
*/
|
||||||
website(request: IntegrationRequest) {
|
website(
|
||||||
return request.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.
|
/** look up localized text indicating Bitwarden requested the forwarding address.
|
||||||
* @param request supplies information about the state of the extension site
|
* @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
|
* @returns localized text describing a generated forwarding address
|
||||||
*/
|
*/
|
||||||
generatedBy(request: IntegrationRequest) {
|
generatedBy(
|
||||||
const website = this.website(request);
|
request: IntegrationRequest,
|
||||||
|
options?: { extractHostname?: boolean; maxLength?: number },
|
||||||
|
) {
|
||||||
|
const website = this.website(request, { extractHostname: options?.extractHostname ?? false });
|
||||||
|
|
||||||
const descriptionId =
|
const descriptionId =
|
||||||
website === "" ? "forwarderGeneratedBy" : "forwarderGeneratedByWithWebsite";
|
website === "" ? "forwarderGeneratedBy" : "forwarderGeneratedByWithWebsite";
|
||||||
const description = this.i18n.t(descriptionId, website);
|
const description = this.i18n.t(descriptionId, website);
|
||||||
|
|
||||||
return description;
|
return description.slice(0, options?.maxLength);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -55,6 +55,10 @@ describe("Addy.io forwarder", () => {
|
|||||||
|
|
||||||
const result = AddyIo.forwarder.createForwardingEmail.body(null, context);
|
const result = AddyIo.forwarder.createForwardingEmail.body(null, context);
|
||||||
|
|
||||||
|
expect(context.generatedBy).toHaveBeenCalledWith(null, {
|
||||||
|
extractHostname: true,
|
||||||
|
maxLength: 200,
|
||||||
|
});
|
||||||
expect(result).toEqual({
|
expect(result).toEqual({
|
||||||
domain: "domain",
|
domain: "domain",
|
||||||
description: "generated by",
|
description: "generated by",
|
||||||
|
|||||||
@@ -39,7 +39,7 @@ const createForwardingEmail = Object.freeze({
|
|||||||
body(request: IntegrationRequest, context: ForwarderContext<AddyIoSettings>) {
|
body(request: IntegrationRequest, context: ForwarderContext<AddyIoSettings>) {
|
||||||
return {
|
return {
|
||||||
domain: context.emailDomain(),
|
domain: context.emailDomain(),
|
||||||
description: context.generatedBy(request),
|
description: context.generatedBy(request, { extractHostname: true, maxLength: 200 }),
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
hasJsonPayload(response: Response) {
|
hasJsonPayload(response: Response) {
|
||||||
|
|||||||
@@ -56,6 +56,11 @@ describe("Firefox Relay forwarder", () => {
|
|||||||
|
|
||||||
const result = FirefoxRelay.forwarder.createForwardingEmail.body(null, context);
|
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({
|
expect(result).toEqual({
|
||||||
enabled: true,
|
enabled: true,
|
||||||
generated_for: "website",
|
generated_for: "website",
|
||||||
|
|||||||
@@ -33,8 +33,8 @@ const createForwardingEmail = Object.freeze({
|
|||||||
body(request: IntegrationRequest, context: ForwarderContext<FirefoxRelaySettings>) {
|
body(request: IntegrationRequest, context: ForwarderContext<FirefoxRelaySettings>) {
|
||||||
return {
|
return {
|
||||||
enabled: true,
|
enabled: true,
|
||||||
generated_for: context.website(request),
|
generated_for: context.website(request, { maxLength: 255 }),
|
||||||
description: context.generatedBy(request),
|
description: context.generatedBy(request, { extractHostname: true, maxLength: 64 }),
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
hasJsonPayload(response: Response) {
|
hasJsonPayload(response: Response) {
|
||||||
|
|||||||
Reference in New Issue
Block a user