|
13 | 13 | runs-on: ubuntu-latest
|
14 | 14 |
|
15 | 15 | steps:
|
| 16 | + - uses: actions/github-script@v7 |
| 17 | + id: sanitize-title |
| 18 | + with: |
| 19 | + script: | |
| 20 | + const isPR = !!context.payload.pull_request; |
| 21 | + const isIssue = !!context.payload.issue; |
| 22 | + const item = isPR ? context.payload.pull_request : isIssue ? context.payload.issue : context.payload.issue_comment.issue; |
| 23 | + |
| 24 | + // Sanitization functions |
| 25 | + const sanitizeTitle = (title) => { |
| 26 | + return title |
| 27 | + // Remove potential markdown formatting |
| 28 | + .replace(/[*_~`]/g, '') |
| 29 | + // Remove potential HTML tags |
| 30 | + .replace(/<[^>]*>/g, '') |
| 31 | + // Remove multiple spaces |
| 32 | + .replace(/\s{2,}/g, ' ') |
| 33 | + // Trim whitespace |
| 34 | + .trim() |
| 35 | + // Enforce max length of 100 |
| 36 | + .substring(0, 100); |
| 37 | + }; |
| 38 | + |
| 39 | + // Escape special characters for Slack |
| 40 | + const escapeForSlack = (text) => { |
| 41 | + return text |
| 42 | + .replace(/&/g, '&') |
| 43 | + .replace(/</g, '<') |
| 44 | + .replace(/[@]/g, '\\@') |
| 45 | + .replace(/>/g, '>') |
| 46 | + .replace(/&lt;/g, '<') |
| 47 | + .replace(/&gt;/g, '>'); |
| 48 | + }; |
| 49 | +
|
| 50 | + const sanitizedTitle = escapeForSlack(sanitizeTitle(item.title)); |
| 51 | + console.log('Sanitized Title: ', sanitizedTitle); |
| 52 | + core.setOutput('safe-title', sanitizedTitle); |
16 | 53 | - name: Send notifications on Pull Request
|
17 | 54 | if: ${{ github.event_name == 'pull_request'}}
|
18 | 55 | id: slack_PR
|
|
23 | 60 | "Notification Type": "Pull Request",
|
24 | 61 | "Notification URL":"${{ github.event.pull_request.html_url }}",
|
25 | 62 | "GitHub Repo": "${{ github.repository }}",
|
26 |
| - "Notification Title": "${{ github.event.pull_request.title }}" |
| 63 | + "Notification Title": "${{ steps.sanitize-title.outputs.safe-title }}" |
27 | 64 | }
|
28 | 65 | env:
|
29 | 66 | SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}
|
|
37 | 74 | "Notification Type": "Issue",
|
38 | 75 | "Notification URL":"${{ github.event.issue.html_url }}",
|
39 | 76 | "GitHub Repo": "${{ github.repository }}",
|
40 |
| - "Notification Title": "${{ github.event.issue.title }}" |
| 77 | + "Notification Title": "${{ steps.sanitize-title.outputs.safe-title }}" |
41 | 78 | }
|
42 | 79 | env:
|
43 | 80 | SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}
|
|
51 | 88 | "Notification Type": "Issue comment",
|
52 | 89 | "Notification URL":"${{ github.event.comment.html_url }}",
|
53 | 90 | "GitHub Repo": "${{ github.repository }}",
|
54 |
| - "Notification Title": "${{ github.event.issue_comment.issue.title }}" |
| 91 | + "Notification Title": "${{ steps.sanitize-title.outputs.safe-title }}" |
55 | 92 | }
|
56 | 93 | env:
|
57 | 94 | SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}
|
0 commit comments