removed logs & added pwndpasswords.com api to CSP

This commit is contained in:
Joel Biddle
2023-08-22 17:50:43 +10:00
parent d6222d5cee
commit 196beb8355
2 changed files with 35 additions and 23 deletions
+35 -13
View File
@@ -24,7 +24,7 @@ import {
secretSnapshot as eeSecretSnapshotRouter, secretSnapshot as eeSecretSnapshotRouter,
users as eeUsersRouter, users as eeUsersRouter,
workspace as eeWorkspaceRouter, workspace as eeWorkspaceRouter,
secretScanning as v1SecretScanningRouter, secretScanning as v1SecretScanningRouter
} from "./ee/routes/v1"; } from "./ee/routes/v1";
import { import {
auth as v1AuthRouter, auth as v1AuthRouter,
@@ -58,7 +58,7 @@ import {
signup as v2SignupRouter, signup as v2SignupRouter,
tags as v2TagsRouter, tags as v2TagsRouter,
users as v2UsersRouter, users as v2UsersRouter,
workspace as v2WorkspaceRouter, workspace as v2WorkspaceRouter
} from "./routes/v2"; } from "./routes/v2";
import { import {
auth as v3AuthRouter, auth as v3AuthRouter,
@@ -70,14 +70,21 @@ import { healthCheck } from "./routes/status";
import { getLogger } from "./utils/logger"; import { getLogger } from "./utils/logger";
import { RouteNotFoundError } from "./utils/errors"; import { RouteNotFoundError } from "./utils/errors";
import { requestErrorHandler } from "./middleware/requestErrorHandler"; import { requestErrorHandler } from "./middleware/requestErrorHandler";
import { getNodeEnv, getPort, getSecretScanningGitAppId, getSecretScanningPrivateKey, getSecretScanningWebhookProxy, getSecretScanningWebhookSecret, getSiteURL } from "./config"; import {
getNodeEnv,
getPort,
getSecretScanningGitAppId,
getSecretScanningPrivateKey,
getSecretScanningWebhookProxy,
getSecretScanningWebhookSecret,
getSiteURL
} from "./config";
import { setup } from "./utils/setup"; import { setup } from "./utils/setup";
import { syncSecretsToThirdPartyServices } from "./queues/integrations/syncSecretsToThirdPartyServices"; import { syncSecretsToThirdPartyServices } from "./queues/integrations/syncSecretsToThirdPartyServices";
import { githubPushEventSecretScan } from "./queues/secret-scanning/githubScanPushEvent"; import { githubPushEventSecretScan } from "./queues/secret-scanning/githubScanPushEvent";
const SmeeClient = require('smee-client') // eslint-disable-line const SmeeClient = require("smee-client"); // eslint-disable-line
const main = async () => { const main = async () => {
await setup(); await setup();
await EELicenseService.initGlobalFeatureSet(); await EELicenseService.initGlobalFeatureSet();
@@ -94,11 +101,15 @@ const main = async () => {
}) })
); );
if (await getSecretScanningGitAppId() && await getSecretScanningWebhookSecret() && await getSecretScanningPrivateKey()) { if (
(await getSecretScanningGitAppId()) &&
(await getSecretScanningWebhookSecret()) &&
(await getSecretScanningPrivateKey())
) {
const probot = new Probot({ const probot = new Probot({
appId: await getSecretScanningGitAppId(), appId: await getSecretScanningGitAppId(),
privateKey: await getSecretScanningPrivateKey(), privateKey: await getSecretScanningPrivateKey(),
secret: await getSecretScanningWebhookSecret(), secret: await getSecretScanningWebhookSecret()
}); });
if ((await getNodeEnv()) != "production") { if ((await getNodeEnv()) != "production") {
@@ -106,12 +117,14 @@ const main = async () => {
source: await getSecretScanningWebhookProxy(), source: await getSecretScanningWebhookProxy(),
target: "http://backend:4000/ss-webhook", target: "http://backend:4000/ss-webhook",
logger: console logger: console
}) });
smee.start() smee.start();
} }
app.use(createNodeMiddleware(GithubSecretScanningService, { probot, webhooksPath: "/ss-webhook" })); // secret scanning webhook app.use(
createNodeMiddleware(GithubSecretScanningService, { probot, webhooksPath: "/ss-webhook" })
); // secret scanning webhook
} }
if ((await getNodeEnv()) === "production") { if ((await getNodeEnv()) === "production") {
@@ -119,7 +132,16 @@ const main = async () => {
// in production // in production
app.disable("x-powered-by"); app.disable("x-powered-by");
app.use(apiLimiter); app.use(apiLimiter);
app.use(helmet()); app.use(
helmet.contentSecurityPolicy({
useDefaults: true,
directives: {
defaultSrc: ["'self'"],
imgSrc: ["*", "data:"],
connectSrc: ["'self'", "https://api.pwnedpasswords.com/range/"]
}
})
);
} }
app.use((req, res, next) => { app.use((req, res, next) => {
@@ -207,8 +229,8 @@ const main = async () => {
server.on("close", async () => { server.on("close", async () => {
await DatabaseService.closeDatabase(); await DatabaseService.closeDatabase();
syncSecretsToThirdPartyServices.close() syncSecretsToThirdPartyServices.close();
githubPushEventSecretScan.close() githubPushEventSecretScan.close();
}); });
return server; return server;
@@ -1,28 +1,18 @@
import axios from "axios"; import axios from "axios";
import crypto from "crypto"; // added types from @types/node import crypto from "crypto"; // added types from @types/node
///// REMINDER: ensure all logs are deleted!!! /////
export const checkIsPasswordBreached = async (password: string) => { export const checkIsPasswordBreached = async (password: string) => {
const dataBreachCheckAPIBaseURL = "https://api.pwnedpasswords.com/range/"; const dataBreachCheckAPIBaseURL = "https://api.pwnedpasswords.com/range/";
try { try {
console.log("password:", password); // delete later!!!
const textEncoder = new TextEncoder(); const textEncoder = new TextEncoder();
const encodedPwd = textEncoder.encode(password); const encodedPwd = textEncoder.encode(password);
console.log("encodedPwd:", encodedPwd); // delete later!!!
const hash = crypto.createHash("sha1").update(encodedPwd).digest(); const hash = crypto.createHash("sha1").update(encodedPwd).digest();
console.log("hash:", hash); // delete later!!!
const hashedPwd = Array.from(new Uint8Array(hash)) const hashedPwd = Array.from(new Uint8Array(hash))
.map((byte) => byte.toString(16).padStart(2, "0")) .map((byte) => byte.toString(16).padStart(2, "0"))
.join("") .join("")
.toUpperCase(); .toUpperCase();
console.log("hashedPwd:", hashedPwd); // delete later!!!
const response = await axios.get(`${dataBreachCheckAPIBaseURL}${hashedPwd.slice(0, 5)}`); const response = await axios.get(`${dataBreachCheckAPIBaseURL}${hashedPwd.slice(0, 5)}`);
console.log("response:", response); // delete later!!! console.log("response:", response); // delete later!!!