diff --git a/.github/workflows/pr_notify.yml b/.github/workflows/pr_notify.yml new file mode 100644 index 0000000000..2b34036d06 --- /dev/null +++ b/.github/workflows/pr_notify.yml @@ -0,0 +1,20 @@ +name: PR Notifier + +on: + pull_request: + types: [opened, reopened, closed] + +jobs: + notify: + runs-on: ubuntu-latest + steps: + - name: Notify Discord + env: + DISCORD_WEBHOOK_URL: ${{ secrets.DISCORD_WEBHOOK_URL }} + run: | + curl -H "Content-Type: application/json" -d '{"content": "🔔 Pull Request [${{ github.event.pull_request.title }}](${{ github.event.pull_request.html_url }}) by ${{ github.event.pull_request.user.login }} - ${{ github.event.action }}"}' $DISCORD_WEBHOOK_URL + - name: Notify Slack + env: + SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }} + run: | + curl -H "Content-Type: application/json" -d '{"text": ":bell: Pull Request <${{ github.event.pull_request.html_url }}|${{ github.event.pull_request.title }}> by ${{ github.event.pull_request.user.login }} - ${{ github.event.action }}"}' $SLACK_WEBHOOK_URL diff --git a/app/routes/contributions.js b/app/routes/contributions.js index 7f68170b94..ead0071e11 100644 --- a/app/routes/contributions.js +++ b/app/routes/contributions.js @@ -29,9 +29,9 @@ function ContributionsHandler(db) { /*jslint evil: true */ // Insecure use of eval() to parse inputs - const preTax = eval(req.body.preTax); - const afterTax = eval(req.body.afterTax); - const roth = eval(req.body.roth); + const preTax = parseFloat(req.body.preTax); + const afterTax = parseFloat(req.body.afterTax); + const roth = parseFloat(req.body.roth); /* //Fix for A1 -1 SSJS Injection attacks - uses alternate method to eval diff --git a/app/routes/index.js b/app/routes/index.js index a9e55426bf..d7c73ed6c2 100644 --- a/app/routes/index.js +++ b/app/routes/index.js @@ -69,7 +69,13 @@ const index = (app, db) => { // Handle redirect for learning resources link app.get("/learn", isLoggedIn, (req, res) => { // Insecure way to handle redirects by taking redirect url from query string - return res.redirect(req.query.url); + const allowedUrls = ['https://trusted.com/resource1', 'https://trusted.com/resource2']; + const redirectUrl = req.query.url; + if (allowedUrls.includes(redirectUrl)) { + return res.redirect(redirectUrl); + } else { + return res.status(400).send('Invalid redirect URL'); + } }); // Research Page diff --git a/server.js b/server.js index d6bb500a2d..5df321be19 100644 --- a/server.js +++ b/server.js @@ -82,23 +82,19 @@ MongoClient.connect(db, (err, db) => { secret: cookieSecret, // Both mandatory in Express v4 saveUninitialized: true, - resave: true - /* + resave: true, // Fix for A5 - Security MisConfig // Use generic cookie name key: "sessionId", - */ - - /* // Fix for A3 - XSS // TODO: Add "maxAge" cookie: { - httpOnly: true - // Remember to start an HTTPS server to get this working - // secure: true + httpOnly: true, + secure: true, + domain: 'example.com', // Replace with your domain + path: '/', + expires: new Date(Date.now() + 60 * 60 * 1000) // 1 hour } - */ - })); /*