1
0
mirror of https://github.com/lensapp/lens.git synced 2025-05-20 05:10:56 +00:00

Block renderering non http(s):// links via <Icon>

Signed-off-by: Sebastian Malton <sebastian@malton.name>
This commit is contained in:
Sebastian Malton 2022-11-16 09:37:23 -05:00
parent 18f73d8a39
commit 41bcfd1278

View File

@ -34,6 +34,11 @@ import User from "./user.svg";
import Users from "./users.svg"; import Users from "./users.svg";
import Wheel from "./wheel.svg"; import Wheel from "./wheel.svg";
import Workloads from "./workloads.svg"; import Workloads from "./workloads.svg";
import type { Logger } from "../../../common/logger";
import { withInjectables } from "@ogre-tools/injectable-react";
import loggerInjectable from "../../../common/logger.injectable";
const hrefValidation = /https?:\/\//;
/** /**
* Mapping between the local file names and the svgs * Mapping between the local file names and the svgs
@ -155,16 +160,21 @@ export function isSvg(content: string): boolean {
return String(content).includes("<svg"); return String(content).includes("<svg");
} }
const RawIcon = withTooltip((props: IconProps) => { interface Dependencies {
logger: Logger;
}
const RawIcon = withTooltip((props: IconProps & Dependencies) => {
const ref = createRef<HTMLAnchorElement>(); const ref = createRef<HTMLAnchorElement>();
const { const {
// skip passing props to icon's html element // skip passing props to icon's html element
className, href, link, material, svg, size, smallest, small, big, className, href, link, material, svg, size, smallest, small, big,
disabled, sticker, active, disabled, sticker, active,
focusable = true, focusable = true,
children, children,
interactive, onClick, onKeyDown, interactive, onClick, onKeyDown,
logger,
...elemProps ...elemProps
} = props; } = props;
const isInteractive = interactive ?? !!(onClick || href || link); const isInteractive = interactive ?? !!(onClick || href || link);
@ -245,6 +255,12 @@ const RawIcon = withTooltip((props: IconProps) => {
} }
if (href) { if (href) {
if (hrefValidation.exec(href) === null) {
logger.warn("[ICON]: href prop is unsafe, blocking", { href });
return null;
}
return ( return (
<a <a
{...iconProps} {...iconProps}
@ -257,4 +273,11 @@ const RawIcon = withTooltip((props: IconProps) => {
return <i {...iconProps} ref={ref} />; return <i {...iconProps} ref={ref} />;
}); });
export const Icon = Object.assign(RawIcon, { isSvg }); const InjectedIcon = withInjectables<Dependencies, IconProps>(RawIcon, {
getProps: (di, props) => ({
...props,
logger: di.inject(loggerInjectable),
}),
});
export const Icon = Object.assign(InjectedIcon, { isSvg });