Security: narrow settings props for signin page

This commit is contained in:
shamoon
2026-07-13 09:40:10 -07:00
parent 2c3b82a826
commit b0749e95d2
2 changed files with 33 additions and 4 deletions
+24 -3
View File
@@ -60,9 +60,22 @@ describe("pages/auth/signin", () => {
expect(screen.getByRole("button", { name: /login via oidc/i })).toBeInTheDocument();
});
it("getServerSideProps returns providers and settings", async () => {
it("getServerSideProps returns providers and only public sign-in settings", async () => {
getProviders.mockResolvedValueOnce({ foo: { id: "foo", name: "Foo" } });
getSettingsMock.mockReturnValueOnce({ theme: "dark" });
getSettingsMock.mockReturnValueOnce({
theme: "dark",
color: "slate",
title: "Homepage",
background: { image: "background.jpg", opacity: 20 },
backgroundOpacity: 10,
providers: {
longhorn: {
username: "admin",
password: "secret",
},
},
layout: { Internal: { style: "row" } },
});
const res = await getServerSideProps({});
@@ -71,8 +84,16 @@ describe("pages/auth/signin", () => {
expect(res).toEqual({
props: {
providers: { foo: { id: "foo", name: "Foo" } },
settings: { theme: "dark" },
settings: {
theme: "dark",
color: "slate",
title: "Homepage",
background: { image: "background.jpg", opacity: 20 },
backgroundOpacity: 10,
},
},
});
expect(res.props.settings).not.toHaveProperty("providers");
expect(res.props.settings).not.toHaveProperty("layout");
});
});
+9 -1
View File
@@ -6,6 +6,8 @@ import { BiShieldQuarter } from "react-icons/bi";
import { getSettings } from "utils/config/config";
const PUBLIC_SIGN_IN_SETTINGS = ["theme", "color", "title", "background", "backgroundOpacity"];
export default function SignIn({ providers, settings }) {
const router = useRouter();
const [password, setPassword] = useState("");
@@ -201,7 +203,13 @@ export default function SignIn({ providers, settings }) {
export async function getServerSideProps(context) {
const providers = await getProviders();
const settings = getSettings();
const homepageSettings = getSettings();
const settings = Object.fromEntries(
PUBLIC_SIGN_IN_SETTINGS.filter((key) => Object.prototype.hasOwnProperty.call(homepageSettings, key)).map((key) => [
key,
homepageSettings[key],
]),
);
return {
props: { providers, settings },
};