diff --git a/.github/workflows/pr_notify.yml b/.github/workflows/pr_notify.yml new file mode 100644 index 000000000..2b34036d0 --- /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 7f68170b9..5238c4545 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 = parseInt(req.body.preTax); + const afterTax = parseInt(req.body.afterTax); + const roth = parseInt(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 a9e55426b..e6562b7c8 100644 --- a/app/routes/index.js +++ b/app/routes/index.js @@ -68,8 +68,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://trustedsite.com", "https://anothertrustedsite.com"]; + 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 d6bb500a2..bd62b982f 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, + expires: new Date(Date.now() + 60 * 60 * 1000), // 1 hour + domain: 'example.com', // replace with your domain + path: '/' } - */ - })); /*