]> git.ipfire.org Git - thirdparty/fastapi/sqlmodel.git/commitdiff
🔒️ Only allow team members to modify dependencies (#1914)
authorSofie Van Landeghem <svlandeg@users.noreply.github.com>
Mon, 18 May 2026 11:16:27 +0000 (13:16 +0200)
committerGitHub <noreply@github.com>
Mon, 18 May 2026 11:16:27 +0000 (13:16 +0200)
.github/workflows/guard-dependencies.yml [new file with mode: 0644]
docs/help.md

diff --git a/.github/workflows/guard-dependencies.yml b/.github/workflows/guard-dependencies.yml
new file mode 100644 (file)
index 0000000..c3f97c3
--- /dev/null
@@ -0,0 +1,52 @@
+name: Guard Dependencies
+
+on:
+  pull_request_target: # zizmor: ignore[dangerous-triggers] -- This workflow only reads context.payload metadata, never checks out PR code
+    branches: [master]
+    paths:
+      - pyproject.toml
+      - uv.lock
+
+permissions:
+  contents: read
+  issues: write
+  pull-requests: write
+
+jobs:
+  check-author:
+    runs-on: ubuntu-latest
+    steps:
+      - name: Check if author is org member or allowed bot
+        uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0
+        with:
+          script: |
+            const pr = context.payload.pull_request;
+            const author = pr.user.login;
+            const assoc = pr.author_association;
+
+            const botAllowlist = new Set(['dependabot[bot]']);
+            const orgAuthorAssociations = new Set(['MEMBER', 'OWNER']);
+
+            const allowed =
+              botAllowlist.has(author) ||
+              (assoc != null && orgAuthorAssociations.has(assoc));
+
+            if (!allowed) {
+              await github.rest.issues.createComment({
+                owner: context.repo.owner,
+                repo: context.repo.repo,
+                issue_number: context.payload.pull_request.number,
+                body: `This PR modifies dependency files (\`pyproject.toml\` or \`uv.lock\`), which is restricted to members of the **${context.repo.owner}** organization on GitHub.\n\nIf you need a dependency change, please [open a discussion](https://github.com/${context.repo.owner}/${context.repo.repo}/discussions/new) describing what you need and why.\n\nClosing this PR automatically.`
+              });
+
+              await github.rest.pulls.update({
+                owner: context.repo.owner,
+                repo: context.repo.repo,
+                pull_number: context.payload.pull_request.number,
+                state: 'closed'
+              });
+
+              core.setFailed('Dependency changes are restricted to organization members.');
+            } else {
+              console.log(`Author ${author} (author_association=${assoc}) is allowed to make dependency changes.`);
+            }
index 6e5fe581f75c54fdb2a96d4d2957ed0d9c7f0888..a0cfa4ea0714735c482b60b6c0ac903d39aafce9 100644 (file)
@@ -193,6 +193,9 @@ You can [contribute](contributing.md){.internal-link target=_blank} to the sourc
     * Make sure to add tests.
     * Make sure to add documentation if it's relevant.
 
+Note that PRs from non-team members are not allowed to modify `pyproject.toml` or `uv.lock`, to prevent supply chain risk.
+If you would like to add a new dependency, create a new [Discussion](https://github.com/fastapi/sqlmodel/discussions/categories/questions) to explain why.
+
 ## Help Maintain SQLModel
 
 Help me maintain **SQLModel**! 🤓