diff --git a/.editorconfig b/.editorconfig index 561cd5e..7c42757 100644 --- a/.editorconfig +++ b/.editorconfig @@ -1,12 +1,35 @@ +# EditorConfig houdt de opmaak gelijk tussen editors en IDE's. +# VS Code, JetBrains en anderen lezen dit bestand vanzelf. +# Meer info: https://editorconfig.org +# +# Deze versie is organisatiebreed gelijk. Wijk hier niet per repository van af: +# vijf licht verschillende varianten leverden alleen ruis op, geen voordeel. +# +# De configbestanden die zelf geen comments kunnen dragen omdat het JSON is, +# staan hier genoemd zodat er ergens een aanwijzing is wat ze doen: +# +# .htmlhintrc - HTML-linting (HTMLHint). Structuur- en toegankelijkheidsregels. +# renovate.json - Renovate-bot. Automatische dependency-updates via pull requests. + root = true [*] charset = utf-8 end_of_line = lf +insert_final_newline = true +trim_trailing_whitespace = true indent_style = space indent_size = 2 -trim_trailing_whitespace = true -insert_final_newline = true [*.md] +# Trailing whitespace betekent iets in Markdown (regeleinde) trim_trailing_whitespace = false + +[*.{yml,yaml}] +indent_size = 2 + +[*.py] +indent_size = 4 + +[*.sh] +indent_size = 4 diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..45ff4d7 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,24 @@ +# .gitattributes zorgt voor consistente regeleindes tussen Windows, Mac en Linux. +# Zonder dit kunnen regeleindes per ontwikkelaar of OS verschillen, wat leidt +# tot onnodige git-diffs en merge-conflicten. +# +# Deze versie is organisatiebreed gelijk. Wijk hier niet per repository van af: +# vier licht verschillende varianten leverden alleen ruis op, geen voordeel. + +# Standaard: forceer LF voor alle tekstbestanden +* text=auto eol=lf + +# Binaire bestanden: geen regeleindeconversie +*.png binary +*.jpg binary +*.jpeg binary +*.gif binary +*.ico binary +*.webp binary +*.avif binary +*.pdf binary +*.woff binary +*.woff2 binary +*.ttf binary +*.otf binary +*.zip binary diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 6ed39bc..867b553 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -1 +1,4 @@ -* @Stensel8 +# Beide eigenaren worden om review gevraagd, maar de goedkeuring van één van +# hen is genoeg om de merge vrij te geven. Zo ligt het werk niet stil als de +# ander er even niet is. +* @Stensel8 @AdiH1310 diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index 0fc3731..5bbf081 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -13,6 +13,7 @@ - [ ] `chore` — maintenance (dependencies, config, CI/CD) - [ ] `refactor` — restructuring without content changes - [ ] `style` — formatting, whitespace, typos +- [ ] `revert` — reverting a previous commit > [PR title and commit types must follow these standards — view the contributing guide](https://github.com/THectic-NL/Zephyrus-Linux/blob/main/CONTRIBUTING.md#commit-messages) diff --git a/.github/workflows/config-validation.yml b/.github/workflows/config-validation.yml index cc32e8b..a38c79c 100644 --- a/.github/workflows/config-validation.yml +++ b/.github/workflows/config-validation.yml @@ -2,9 +2,9 @@ # SPDX-License-Identifier: MIT name: Config validation -# The bot configs are the one part of CI that nothing else exercises: a broken -# renovate.json or dependabot.yml does not fail a build, it just quietly stops -# doing its job. This workflow is the thing that notices. +# De bot-configs zijn het enige deel van CI dat verder nergens door wordt +# geraakt: een kapotte renovate.json of dependabot.yml laat geen build falen, +# die houdt gewoon stilletjes op met zijn werk. Deze workflow merkt dat op. on: push: @@ -50,33 +50,33 @@ jobs: with: node-version: 'lts/*' - # Renovate's own validator. --strict also fails on warnings, such as an - # option that is valid but deprecated. Given no arguments it finds the - # config files itself and validates them as repository config; passing a - # path instead makes it validate them as global config, which is a - # different and weaker set of rules. + # Renovates eigen validator. --strict laat hem ook falen op warnings, + # bijvoorbeeld een optie die geldig maar verouderd is. Zonder argumenten + # zoekt hij de configbestanden zelf op en valideert hij ze als + # repository-config; geef je een pad mee, dan valideert hij ze als + # global config, en dat is een andere en zwakkere set regels. # - # Deliberately unpinned. This is a linter for our config, not something we - # ship, and the newest release is the one that knows about the newest - # deprecations. Its own version is not worth a pull request. + # Bewust niet vastgezet. Dit is een linter op onze eigen config en geen + # onderdeel van wat we uitleveren, en juist de nieuwste release kent de + # nieuwste deprecations. Zijn eigen versie is geen pull request waard. # - # NPM_CONFIG_LOGLEVEL: npm prints "npm warn deprecated ..." for packages - # deep inside Renovate's own dependency tree. Those say nothing about the - # config being validated, and reading them as if they did is the obvious - # mistake to make when they appear directly above the validator's output. + # NPM_CONFIG_LOGLEVEL: npm print "npm warn deprecated ..." voor packages + # diep in Renovates eigen dependency-boom. Die zeggen niets over de config + # die gevalideerd wordt, en ze lezen alsof dat wel zo is, is de fout die + # je vanzelf maakt als ze vlak boven de output van de validator staan. - name: Validate Renovate config env: NPM_CONFIG_LOGLEVEL: error run: npx --yes --package renovate -- renovate-config-validator --strict - # The validator above accepts a well-formed pattern that matches nothing, - # so this covers the gap it leaves. + # De validator hierboven accepteert een correct gevormd patroon dat + # nergens op matcht; dit dekt het gat dat hij daarmee laat. - name: Check Renovate file patterns run: python3 .github/scripts/check-renovate-patterns.py renovate.json .github/renovate.json - # GitHub validates dependabot.yml only after it is on the default branch, - # and reports the result on a tab nobody opens. This brings that forward - # to the pull request. + # GitHub valideert dependabot.yml pas als die op de default branch staat, + # en meldt het resultaat op een tabblad dat niemand opent. Dit haalt dat + # naar voren, naar de pull request. - name: Validate Dependabot config env: # renovate: datasource=pypi depName=check-jsonschema @@ -96,23 +96,19 @@ jobs: pipx install "check-jsonschema==${CHECK_JSONSCHEMA_VERSION}" check-jsonschema --builtin-schema vendor.dependabot "$config" - # The workflow files are config too. The other repositories in the - # organisation run actionlint from their quality workflow; this one had no - # equivalent, so it lives here. - workflow-lint: - name: Check workflow files - runs-on: ubuntu-latest - permissions: - contents: read - steps: - - name: Check out source code - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 - with: - persist-credentials: false - - # Pinned release plus checksum, rather than piping a script from a - # branch straight into bash. + # De workflowbestanden zijn ook config. De andere repositories draaien + # actionlint vanuit hun quality-workflow; deze had geen equivalent, dus + # het hoort hier. + # + # Als stap en niet als eigen job: GitHub rekent per job en rondt naar + # boven af op een hele minuut. actionlint is in vijf seconden klaar en + # heeft dezelfde checkout nodig als de stappen hierboven, dus een eigen + # job kostte een volle minuut extra voor niets. + # + # Vanaf hier draait elke stap op !cancelled(), zodat één rode controle de + # andere niet verbergt. De job faalt alsnog zodra er iets fout is. - name: Install actionlint + if: ${{ !cancelled() }} env: # renovate: datasource=github-releases depName=rhysd/actionlint ACTIONLINT_VERSION: "1.7.12" @@ -126,4 +122,5 @@ jobs: sudo install -m 0755 actionlint /usr/local/bin/actionlint - name: Run actionlint + if: ${{ !cancelled() }} run: actionlint -color diff --git a/.github/workflows/pr-checks.yml b/.github/workflows/pr-checks.yml index 8500642..9be2d63 100644 --- a/.github/workflows/pr-checks.yml +++ b/.github/workflows/pr-checks.yml @@ -4,80 +4,83 @@ on: pull_request: branches: [main, development] -# Nothing by default; each job asks for exactly what it needs. Granting -# pull-requests: write at the top handed it to every job, including the ones -# that only read the checkout. +# Snel achter elkaar naar dezelfde pull request pushen startte evenveel volledige +# runs, en de eerste zijn dan al achterhaald. +concurrency: + group: pr-checks-${{ github.event.pull_request.number }} + cancel-in-progress: true + permissions: {} jobs: - - # ── 1. PR title follows conventional commits ──────────────────────────────── - pr-title: - name: Conventional commit title - runs-on: ubuntu-latest - permissions: - pull-requests: read - steps: - - uses: amannn/action-semantic-pull-request@48f256284bd46cdaab1048c3721360e808335d50 # v6.1.1 - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - with: - types: | - feat - fix - content - docs - chore - refactor - style - revert - - # ── 2. Markdown formatting ────────────────────────────────────────────────── - markdown: - name: Markdown lint + # Alle controles op een pull request, in een job. + # + # Dit waren er zes: markdownlint, de EN/NL-pariteit, de AVIF-controle, de + # Hugo-build, de linkcheck en het bijwerken van de checklist. Ze duurden 3, 4, + # 3, 12, 6 en 6 seconden -- vierendertig seconden werk, verdeeld over zes + # runners. GitHub rekent per job en rondt elke job naar boven af op een hele + # minuut, dus dat waren zes gefactureerde minuten. + # + # Er verdwijnt meer dan die vijf minuten. De linkcheck kreeg de gebouwde site + # via een artefact aangeleverd, met een upload, een download en de opslag + # erbij; nu leest hij gewoon de map die de build ernaast heeft neergezet. + # + # Elke stap draait op !cancelled(), zodat een rode markdownlint de Hugo-build + # niet verbergt. Je wilt alle fouten in een run zien, niet de tweede pas nadat + # je de eerste hebt opgelost. De job faalt alsnog zodra er iets fout is. + # + # De job draagt `pull-requests: write` omdat twee stappen op de pull request + # zelf schrijven: de AVIF-controle plaatst een comment en de laatste stap werkt + # de checklist bij. Dat is de prijs van het samenvoegen; alle actions staan op + # een vastgezette SHA. + pr-checks: + name: PR checks runs-on: ubuntu-latest permissions: contents: read + pull-requests: write + env: + HUGO_VERSION: 0.165.0 steps: - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 with: + # fetch-depth: 0 voor Hugo's .GitInfo en .Lastmod. + fetch-depth: 0 persist-credentials: false - - uses: DavidAnson/markdownlint-cli2-action@21c1be1b93ad9ed58fa840aacc3f279cde2a72ff # v24.2.0 - with: - globs: "src/content/**/*.md" - # ── 3. Python security scan ───────────────────────────────────────────────── - python-security: - name: Python security (bandit) - runs-on: ubuntu-latest - permissions: - contents: read - steps: - - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 - with: - persist-credentials: false - - uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0 + # ── 1. Markdown-opmaak ────────────────────────────────────────────────── + - name: Markdown lint + id: markdown + if: ${{ !cancelled() }} + uses: DavidAnson/markdownlint-cli2-action@21c1be1b93ad9ed58fa840aacc3f279cde2a72ff # v24.2.0 with: - python-version: "3.x" - - run: pip install bandit - - name: Run bandit - run: bandit -r src/static/scripts/ -ll + globs: "src/content/**/*.md" - # ── 4. Images must be AVIF ────────────────────────────────────────────────── - image-format: - name: No PNG/JPG in static/images - runs-on: ubuntu-latest - # pull-requests: write for the comment this job posts when it finds a PNG. - permissions: - contents: read - pull-requests: write - steps: - - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 - with: - persist-credentials: false + # ── 2. Elk Engels document heeft een Nederlandse tegenhanger ──────────── + - name: Check every .md has a matching .nl.md + id: bilingual + if: ${{ !cancelled() }} + run: | + missing="" + for en in src/content/docs/*.md; do + base="${en%.md}" + nl="${base}.nl.md" + # Bestanden die zelf al .nl.md zijn overslaan + [[ "$en" == *.nl.md ]] && continue + if [ ! -f "$nl" ]; then + missing="$missing\n $en → $nl missing" + fi + done + if [ -n "$missing" ]; then + echo -e "::error::Missing Dutch translation(s):$missing" + exit 1 + fi + echo "All docs have EN + NL versions." + # ── 3. Afbeeldingen moeten AVIF zijn ──────────────────────────────────── - name: Find non-AVIF images - id: check + id: images + if: ${{ !cancelled() }} run: | { echo "files<.+)$ LYCHEE_VERSION: "0.24.2" - # From the release's own lychee-x86_64-unknown-linux-gnu.tar.gz.sha256 + # Uit de lychee-x86_64-unknown-linux-gnu.tar.gz.sha256 van de release zelf LYCHEE_SHA256: "1f4e0ef7f6554a6ed33dd7ac144fb2e1bbed98598e7af973042fc5cd43951c9a" run: | curl -sSL --fail-with-body -o lychee.tar.gz \ @@ -238,38 +221,42 @@ jobs: sudo install -m 0755 lychee-x86_64-unknown-linux-gnu/lychee /usr/local/bin/lychee lychee --version - # --index-files: without it lychee treats a link to /docs/applications/ as - # a link to a directory and stops there, so it can never look inside for - # the #fragment. Every anchor into another page then reports "Cannot find - # fragment" even though the heading is right there. Hugo serves every page - # as /index.html, so this flag is what makes --include-fragments - # usable at all here. + # Leest src/public rechtstreeks. Dat ging via een artefact omdat de + # linkcheck een eigen runner was; nu staat de build ernaast. + # + # --index-files: zonder die vlag ziet lychee een link naar + # /docs/applications/ als een link naar een map en stopt hij daar, dus kan + # hij nooit naar binnen kijken voor het #fragment. Elke anker-link naar een + # andere pagina meldt dan "Cannot find fragment" terwijl de kop er gewoon + # staat. Hugo levert elke pagina uit als /index.html, dus deze vlag + # is wat --include-fragments hier bruikbaar maakt. # - # The glob is quoted deliberately. Unquoted, bash expands it first, and - # without globstar ** collapses to a single level -- which is why this job - # was checking 95 links instead of 3379. + # De glob staat bewust tussen quotes. Zonder quotes expandeert bash hem + # eerst, en zonder globstar klapt ** dan in tot een mapniveau -- daardoor + # controleerde deze stap ooit 95 links in plaats van 3379. - name: Check internal links + id: links + if: ${{ !cancelled() }} run: | lychee --offline --include-fragments --index-files index.html \ - --root-dir ./public "public/**/*.html" + --root-dir "${GITHUB_WORKSPACE}/src/public" "src/public/**/*.html" - # ── 8. Auto-tick PR checklist ──────────────────────────────────────────────── - update-checklist: - name: Update PR checklist - runs-on: ubuntu-latest - # pull-requests: write to rewrite the description's checklist. - permissions: - pull-requests: write - if: always() - needs: [pr-title, bilingual, image-format, hugo-build, link-check] - steps: - - uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 + # ── 7. Checklist in de omschrijving bijwerken ─────────────────────────── + # + # Leest de uitkomst van de stappen hierboven in plaats van van losse jobs. + # Dat was hiervoor `needs: [...]` met vier jobresultaten; in een job is het + # steps..outcome, en dat scheelt de zesde runner. + # + # Draait op !cancelled() en niet op success(), want juist bij een rode + # controle wil je de checklist bijgewerkt zien. + - name: Update PR checklist + if: ${{ !cancelled() }} + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 env: - RESULT_PR_TITLE: ${{ needs.pr-title.result }} - RESULT_BILINGUAL: ${{ needs.bilingual.result }} - RESULT_IMAGE_FORMAT: ${{ needs.image-format.result }} - RESULT_HUGO_BUILD: ${{ needs.hugo-build.result }} - RESULT_LINK_CHECK: ${{ needs.link-check.result }} + RESULT_BILINGUAL: ${{ steps.bilingual.outcome }} + RESULT_IMAGES: ${{ steps.images.outputs.found }} + RESULT_HUGO: ${{ steps.hugo.outcome }} + RESULT_LINKS: ${{ steps.links.outcome }} with: script: | const { data: pr } = await github.rest.pulls.get({ @@ -279,8 +266,8 @@ jobs: }); let body = pr.body || ''; + if (!body.trim()) return; - // ── Tick checklist items based on CI results ────────────────────── const setCheck = (keyword, passed) => { body = body.replace( new RegExp(`- \\[[ xX]\\] (.*${keyword}.*)`, 'i'), @@ -288,21 +275,36 @@ jobs: ); }; - setCheck('PR title follows', process.env.RESULT_PR_TITLE === 'success'); - setCheck('Both EN and NL', process.env.RESULT_BILINGUAL === 'success'); - setCheck('Media is in AVIF', process.env.RESULT_IMAGE_FORMAT === 'success'); - setCheck('No broken image', process.env.RESULT_LINK_CHECK === 'success'); - setCheck('Tested locally', process.env.RESULT_HUGO_BUILD === 'success'); + // Dezelfde typelijst als pr-title.yml en CONTRIBUTING.md. Een scope + // en een `!` voor een breaking change zijn toegestaan: feat(nav)!: ... + const TITLE_RE = + /^(feat|fix|content|docs|chore|refactor|style|revert)(\([^)]+\))?!?: .+/; - // ── Remove unchecked "Type of change" options ───────────────────── - body = body.replace(/^- \[ \] `\w+` —[^\n]*\n?/gm, ''); + setCheck('PR title follows', TITLE_RE.test(pr.title)); + setCheck('Both EN and NL', process.env.RESULT_BILINGUAL === 'success'); + // De AVIF-stap slaagt ook als hij bestanden vindt; het oordeel zit + // in zijn output, niet in zijn uitkomst. + setCheck('Media is in AVIF', process.env.RESULT_IMAGES === 'false'); + setCheck('No broken image', process.env.RESULT_LINKS === 'success'); + setCheck('Tested locally', process.env.RESULT_HUGO === 'success'); + + // De niet-gekozen types weghalen, maar alleen als er al een gekozen + // is. Zonder die voorwaarde stript de eerste run alle acht regels weg + // voordat de auteur er een heeft aangevinkt. + const TYPE_LINE = /^- \[([ xX])\] `\w+` —[^\n]*\n?/gm; + const ticked = [...body.matchAll(TYPE_LINE)] + .some(m => m[1].toLowerCase() === 'x'); + if (ticked) { + body = body.replace(/^- \[ \] `\w+` —[^\n]*\n?/gm, ''); + } - // ── Collapse leftover blank lines ───────────────────────────────── body = body.replace(/\n{3,}/g, '\n\n'); - await github.rest.pulls.update({ - owner: context.repo.owner, - repo: context.repo.repo, - pull_number: context.payload.pull_request.number, - body, - }); + if (body !== pr.body) { + await github.rest.pulls.update({ + owner: context.repo.owner, + repo: context.repo.repo, + pull_number: context.payload.pull_request.number, + body, + }); + } diff --git a/.github/workflows/pr-title.yml b/.github/workflows/pr-title.yml new file mode 100644 index 0000000..e7840e9 --- /dev/null +++ b/.github/workflows/pr-title.yml @@ -0,0 +1,45 @@ +# Copyright (C) 2026 Sten Tijhuis +# SPDX-License-Identifier: MIT +name: PR title + +# De titel van de pull request is wat er op main terechtkomt zodra je squasht, +# dus dat is de plek waar Conventional Commits gecontroleerd moet worden en niet +# op de losse commits in de branch. +# +# Renovate levert zijn eigen titels al in dit formaat aan; dat is de +# semanticCommits-instelling in renovate.json. Deze controle dekt de rest. + +on: + pull_request: + # edited hoort erbij: zonder dat blijft de check rood staan nadat iemand de + # titel heeft verbeterd, want een titelwijziging is geen nieuwe push. + types: [opened, edited, synchronize, reopened] + +# Snel achter elkaar de omschrijving aanpassen startte evenveel runs. Alleen +# de laatste zegt nog iets, dus de rest mag weg. +concurrency: + group: pr-title-${{ github.event.pull_request.number }} + cancel-in-progress: true + +permissions: {} + +jobs: + pr-title: + name: Conventional commit title + runs-on: ubuntu-latest + permissions: + pull-requests: read + steps: + - uses: amannn/action-semantic-pull-request@48f256284bd46cdaab1048c3721360e808335d50 # v6.1.1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + types: | + feat + fix + content + docs + chore + refactor + style + revert diff --git a/.github/workflows/python-checks.yml b/.github/workflows/python-checks.yml index 7c1e761..7edfc5c 100644 --- a/.github/workflows/python-checks.yml +++ b/.github/workflows/python-checks.yml @@ -1,15 +1,18 @@ name: Python Checks +# Geen pull_request meer: flake8 en bandit draaien daar als stap in +# pr-checks.yml, waar ze geen eigen gefactureerde job kosten. Hier bleven de +# wekelijkse run en de run op main staan, en daar zit de waarde van een +# herhaalde scan: bandit vindt met nieuwe regels iets in code die zelf niet +# veranderd is, en dat merk je nooit als hij alleen op gewijzigde code draait. on: push: branches: [ main, development ] - pull_request: - branches: [ main, development ] schedule: - cron: '0 5 * * 0' workflow_dispatch: -# Without this the workflow inherits whatever the repository default is. +# Zonder dit erft de workflow wat de repository-default ook is. permissions: {} jobs: @@ -33,7 +36,7 @@ jobs: pip install flake8 bandit - name: Lint with flake8 - run: flake8 src/static/scripts/saxion-eduroam.py --max-line-length=120 + run: flake8 src/static/scripts/ --max-line-length=120 - name: Security scan with bandit - run: bandit -r src/static/scripts/saxion-eduroam.py -ll + run: bandit -r src/static/scripts/ -ll diff --git a/.github/workflows/update-checksums.yml b/.github/workflows/update-checksums.yml index 3d6f56f..80119e0 100644 --- a/.github/workflows/update-checksums.yml +++ b/.github/workflows/update-checksums.yml @@ -2,14 +2,14 @@ # SPDX-License-Identifier: MIT name: Update tool SHA256 checksums -# Renovate bumps the pinned tool versions but cannot compute a checksum, so on -# its own every bump lands with the previous release's hash still in place and -# the build stops at "computed checksum did NOT match". This recalculates the -# hashes on Renovate's pull requests and commits them back onto the branch. +# Renovate bumpt de vastgezette toolversies maar kan geen checksum berekenen, +# dus op eigen kracht landt elke bump met de hash van de vorige release er nog +# in, en stopt de build op "computed checksum did NOT match". Dit herberekent +# de hashes op Renovates pull requests en commit ze terug op de branch. # -# Renovate must be told to ignore those commits, or it treats the branch as -# modified by someone else and stops maintaining the pull request. That is the -# gitIgnoredAuthors entry in renovate.json. +# Renovate moet die commits leren negeren, anders ziet hij de branch als door +# iemand anders gewijzigd en onderhoudt hij de pull request niet meer. Dat is +# de gitIgnoredAuthors-regel in renovate.json. on: pull_request: @@ -26,14 +26,15 @@ jobs: update-checksums: name: Recalculate SHA256 checksums runs-on: ubuntu-latest - # Only Renovate's own branches. Running this on a human's pull request - # would mean pushing commits to a branch someone is actively working on. + # Alleen Renovates eigen branches. Dit op een pull request van een mens + # draaien betekent commits pushen naar een branch waar iemand op dat moment + # aan werkt. # - # The author of the pull request, not github.actor. actor is whoever - # triggered the most recent event, which on a synchronize is whoever pushed - # last; comparing that to a bot name is a check zizmor rightly calls - # spoofable. The author is fixed when the pull request is opened and cannot - # be set to another account. + # De auteur van de pull request, niet github.actor. actor is degene die het + # meest recente event veroorzaakte, en dat is bij een synchronize degene die + # als laatste pushte; dat vergelijken met een botnaam is een controle die + # zizmor terecht spoofbaar noemt. De auteur ligt vast zodra de pull request + # geopend wordt en is niet naar een ander account te zetten. # # Also require the head repo to be this repo, not a fork. This job checks # out github.head_ref and runs a script from it with a write token, so a @@ -46,10 +47,10 @@ jobs: permissions: contents: write steps: - # persist-credentials: false, even though this job pushes. Otherwise the - # token sits in .git/config for the whole job, including while the script - # below downloads release tarballs off the internet. The push step gets - # the token explicitly instead, for exactly one command. + # persist-credentials: false, ook al pusht deze job. Anders staat het + # token de hele job in .git/config, ook terwijl het script hieronder + # release-tarballs van internet haalt. De push-stap krijgt het token in + # plaats daarvan expliciet mee, voor precies één commando. # Pinned to the exact commit the pull_request event fired for, not the # mutable branch name. head_ref is a moving target: a push to the # renovate/* branch between the job's "if:" check above and this step @@ -61,9 +62,9 @@ jobs: ref: ${{ github.event.pull_request.head.sha }} persist-credentials: false - # The script verifies each download against the checksum the project - # publishes next to the release before writing anything, so a hash only - # lands here if upstream vouches for it too. + # Het script controleert elke download tegen de checksum die het project + # naast de release publiceert voordat er iets wordt weggeschreven, dus een + # hash landt hier alleen als upstream er ook voor instaat. - name: Recalculate and apply checksums run: .github/scripts/update-tool-checksums.sh --apply diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 0000000..18c87cd --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,24 @@ +# Beveiligingsbeleid + +## Ondersteunde versies + +Alleen `main` wordt ondersteund. Er is geen releasehistorie om bij te houden; +wat op `main` staat is de actuele staat. + +## Een kwetsbaarheid melden + +Vind je een beveiligingsprobleem, meld het dan privé in plaats van via een +openbaar issue. + +Gebruik daarvoor GitHubs [private vulnerability reporting](https://github.com/THectic-NL/Zephyrus-Linux/security/advisories/new) +voor deze repository. Je krijgt binnen enkele werkdagen een eerste reactie. + +Kan dat niet, of gaat het om iets dat breder speelt dan deze repository: + +- **E-mail:** +- **PGP-sleutel:** + +De ondertekende, canonieke contactgegevens staan in +[security.txt](https://thectic.nl/.well-known/security.txt). + +Meld kwetsbaarheden in software van derden niet hier maar bij het project zelf. diff --git a/renovate.json b/renovate.json index d8e6177..1c1dde5 100644 --- a/renovate.json +++ b/renovate.json @@ -102,5 +102,13 @@ ], "automerge": true, "automergeType": "pr", - "semanticCommits": "enabled" + "semanticCommits": "enabled", + "assignees": [ + "Stensel8", + "AdiH1310" + ], + "reviewers": [ + "Stensel8", + "AdiH1310" + ] }