Skip to content

Commit 4c4d60d

Browse files
Add allowed origin env (#405)
1 parent 2de656c commit 4c4d60d

File tree

11 files changed

+50
-31
lines changed

11 files changed

+50
-31
lines changed

packages/brain/src/index.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,8 @@ const { uiServer, launchpadServer, brainApiServer } = getServers({
6060
validatorApi,
6161
beaconchainApi,
6262
brainDb,
63-
reloadValidatorsCronTask
63+
reloadValidatorsCronTask,
64+
allowedOriginsFromEnv: config.apis.cors
6465
});
6566

6667
// Graceful shutdown
Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1 @@
1-
export const corsOptions = {
2-
origin: ["http://csm-lido.dappnode", "http://csm-lido.testnet.dappnode"] // TODO: update with DAppNodePackage-lido-csm.dnp.dappnode.eth domains
3-
};
1+
export const allowedOrigins = ["http://ui.lido-csm-holesky.dappnode", "http://ui.lido-csm-mainnet.dappnode"];

packages/brain/src/modules/apiServers/brain/startBrainApi.ts

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,20 @@ import cors from "cors";
33
import logger from "../../logger/index.js";
44
import http from "node:http";
55
import { params } from "../../../params.js";
6-
import { corsOptions } from "./config.js";
6+
import { allowedOrigins } from "./config.js";
77
import { createBrainValidatorsRouter } from "./routes/index.js";
88
import { BrainDataBase } from "../../db/index.js";
99

10-
export function startBrainApi({ brainDb }: { brainDb: BrainDataBase }): http.Server {
10+
export function startBrainApi({
11+
brainDb,
12+
allowedOriginsFromEnv
13+
}: {
14+
brainDb: BrainDataBase;
15+
allowedOriginsFromEnv: string[] | null;
16+
}): http.Server {
1117
const app = express();
1218
app.use(express.json());
13-
app.use(cors(corsOptions));
19+
app.use(cors({ origin: allowedOriginsFromEnv ?? allowedOrigins }));
1420

1521
app.use(createBrainValidatorsRouter({ brainDb }));
1622

packages/brain/src/modules/apiServers/index.ts

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,8 @@ export const getServers = ({
2020
validatorApi,
2121
beaconchainApi,
2222
brainDb,
23-
reloadValidatorsCronTask
23+
reloadValidatorsCronTask,
24+
allowedOriginsFromEnv
2425
}: {
2526
brainConfig: BrainConfig;
2627
uiBuildPath: string;
@@ -31,6 +32,7 @@ export const getServers = ({
3132
beaconchainApi: BeaconchainApi;
3233
brainDb: BrainDataBase;
3334
reloadValidatorsCronTask: CronJob;
35+
allowedOriginsFromEnv: string[] | null;
3436
}): {
3537
uiServer: http.Server;
3638
launchpadServer: http.Server;
@@ -46,7 +48,8 @@ export const getServers = ({
4648
validatorApi,
4749
blockExplorerApi,
4850
beaconchainApi,
49-
postgresClient
51+
postgresClient,
52+
allowedOriginsFromEnv
5053
}),
5154
launchpadServer: startLaunchpadApi({
5255
brainDb,
@@ -55,10 +58,12 @@ export const getServers = ({
5558
beaconchainApi,
5659
reloadValidatorsCronTask,
5760
network: brainConfig.chain.network,
58-
signerUrl: brainConfig.apis.signerUrl
61+
signerUrl: brainConfig.apis.signerUrl,
62+
allowedOriginsFromEnv
5963
}),
6064
brainApiServer: startBrainApi({
61-
brainDb
65+
brainDb,
66+
allowedOriginsFromEnv
6267
})
6368
};
6469
};
Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,8 @@
1-
export const corsOptions = {
2-
origin: [
3-
"http://rocketpool-testnet.public.dappnode",
4-
"http://rocketpool.dappnode",
5-
"http://stader-testnet.dappnode",
6-
"http://stader.dappnode",
7-
"http://ui.lido-csm-holesky.dappnode",
8-
"http://ui.lido-csm-mainnet.dappnode"
9-
]
10-
};
1+
export const allowedOrigins = [
2+
"http://rocketpool-testnet.public.dappnode",
3+
"http://rocketpool.dappnode",
4+
"http://stader-testnet.dappnode",
5+
"http://stader.dappnode",
6+
"http://ui.lido-csm-holesky.dappnode",
7+
"http://ui.lido-csm-mainnet.dappnode"
8+
];

packages/brain/src/modules/apiServers/launchpad/startLaunchpadApi.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import cors from "cors";
33
import logger from "../../logger/index.js";
44
import http from "node:http";
55
import { params } from "../../../params.js";
6-
import { corsOptions } from "./config.js";
6+
import { allowedOrigins } from "./config.js";
77
import { createKeystoresRouter, createFeeRecipientsRouter } from "./routes/index.js";
88
import { CronJob } from "../../cron/cron.js";
99
import { BrainDataBase } from "../../db/index.js";
@@ -19,7 +19,8 @@ export function startLaunchpadApi({
1919
reloadValidatorsCronTask,
2020
brainDb,
2121
network,
22-
signerUrl
22+
signerUrl,
23+
allowedOriginsFromEnv
2324
}: {
2425
signerApi: Web3SignerApi;
2526
validatorApi: ValidatorApi;
@@ -28,10 +29,11 @@ export function startLaunchpadApi({
2829
brainDb: BrainDataBase;
2930
network: Network;
3031
signerUrl: string;
32+
allowedOriginsFromEnv: string[] | null;
3133
}): http.Server {
3234
const app = express();
3335
app.use(express.json());
34-
app.use(cors(corsOptions));
36+
app.use(cors({ origin: allowedOriginsFromEnv ?? allowedOrigins }));
3537

3638
app.use(createKeystoresRouter({ reloadValidatorsCronTask, brainDb, network, validatorApi, signerApi, signerUrl }));
3739
app.use(
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
import { BRAIN_UI_DOMAIN, Network } from "@stakingbrain/common";
2+
3+
export const allowedOrigins = (network: Network) => ["http://my.dappnode", `http://${BRAIN_UI_DOMAIN(network)}`];

packages/brain/src/modules/apiServers/ui/startUiServer.ts

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { BRAIN_UI_DOMAIN, Network } from "@stakingbrain/common";
1+
import { Network } from "@stakingbrain/common";
22
import cors from "cors";
33
import express from "express";
44
import path from "path";
@@ -19,6 +19,7 @@ import {
1919
ValidatorApi,
2020
Web3SignerApi
2121
} from "../../apiClients/index.js";
22+
import { allowedOrigins } from "./config.js";
2223

2324
// Define the type for the RPC request
2425
interface RpcRequest {
@@ -38,7 +39,8 @@ export function startUiServer({
3839
postgresClient,
3940
uiBuildPath,
4041
brainConfig,
41-
reloadValidatorsCronTask
42+
reloadValidatorsCronTask,
43+
allowedOriginsFromEnv
4244
}: {
4345
brainDb: BrainDataBase;
4446
blockExplorerApi: BlockExplorerApi;
@@ -49,6 +51,7 @@ export function startUiServer({
4951
uiBuildPath: string;
5052
brainConfig: BrainConfig;
5153
reloadValidatorsCronTask: CronJob;
54+
allowedOriginsFromEnv: string[] | null;
5255
}): http.Server {
5356
const { network } = brainConfig.chain;
5457
// create index.html modified with network
@@ -114,10 +117,9 @@ export function startUiServer({
114117
});
115118

116119
// Express
117-
const allowedOrigins = ["http://my.dappnode", `http://${BRAIN_UI_DOMAIN(network)}`];
118120
app.use(
119121
cors({
120-
origin: allowedOrigins
122+
origin: allowedOriginsFromEnv ?? allowedOrigins(network)
121123
})
122124
);
123125
app.use(express.json());

packages/brain/src/modules/config/index.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import { getValidatorToken } from "./getValidatorToken.js";
66
import { getTlsCert } from "./getTlsCert.js";
77

88
export const brainConfig = (): BrainConfig => {
9-
const { network, executionClient, consensusClient, isMevBoostSet } = loadEnvs();
9+
const { network, executionClient, consensusClient, isMevBoostSet, cors } = loadEnvs();
1010

1111
// Determine the validator URL based on the consensus client and network.
1212
// All this logic is needed because Teku has a TLS certificate that points to the old
@@ -44,7 +44,8 @@ export const brainConfig = (): BrainConfig => {
4444
postgresUrl: getPostgresUrl(network),
4545
token: getValidatorToken(consensusClient),
4646
host: network === "mainnet" ? `brain.web3signer.dappnode` : `brain.web3signer-${network}.dappnode`,
47-
tlsCert: getTlsCert(consensusClient, network) // To avoid Teku edge case it is necessary to update TLS certificate in both: validator and brain
47+
tlsCert: getTlsCert(consensusClient, network), // To avoid Teku edge case it is necessary to update TLS certificate in both: validator and brain
48+
cors
4849
}
4950
};
5051
};

packages/brain/src/modules/config/loadEnvs.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ export function loadEnvs(): {
55
executionClient: ExecutionClient;
66
consensusClient: ConsensusClient;
77
isMevBoostSet: boolean;
8+
cors: string[] | null;
89
} {
910
const network = getNetwork();
1011

@@ -17,7 +18,8 @@ export function loadEnvs(): {
1718
network: network as Network,
1819
executionClient,
1920
consensusClient,
20-
isMevBoostSet
21+
isMevBoostSet,
22+
cors: process.env.CORS ? process.env.CORS.split(",") : null
2123
};
2224
}
2325

0 commit comments

Comments
 (0)