Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package forgejo-runner for openSUSE:Factory checked in at 2026-04-28 11:57:08 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/forgejo-runner (Old) and /work/SRC/openSUSE:Factory/.forgejo-runner.new.11940 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "forgejo-runner" Tue Apr 28 11:57:08 2026 rev:45 rq:1349474 version:12.9.0 Changes: -------- --- /work/SRC/openSUSE:Factory/forgejo-runner/forgejo-runner.changes 2026-04-10 18:02:04.036270795 +0200 +++ /work/SRC/openSUSE:Factory/.forgejo-runner.new.11940/forgejo-runner.changes 2026-04-28 12:00:53.164772495 +0200 @@ -1,0 +2,7 @@ +Mon Apr 27 00:42:43 UTC 2026 - Richard Rahl <[email protected]> + +- Update to version 12.9.0: + + feat: trim whitespace around token, validate it + + fix: interpolation of workflow_call inputs + +------------------------------------------------------------------- Old: ---- forgejo-runner-12.8.2.obscpio New: ---- forgejo-runner-12.9.0.obscpio ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ forgejo-runner.spec ++++++ --- /var/tmp/diff_new_pack.oa6Z6A/_old 2026-04-28 12:00:53.908803307 +0200 +++ /var/tmp/diff_new_pack.oa6Z6A/_new 2026-04-28 12:00:53.908803307 +0200 @@ -18,7 +18,7 @@ %define services %{name}.service Name: forgejo-runner -Version: 12.8.2 +Version: 12.9.0 Release: 0 Summary: Daemon that connects to a Forgejo instance and runs CI jobs License: GPL-3.0-or-later ++++++ _service ++++++ --- /var/tmp/diff_new_pack.oa6Z6A/_old 2026-04-28 12:00:53.952805129 +0200 +++ /var/tmp/diff_new_pack.oa6Z6A/_new 2026-04-28 12:00:53.956805294 +0200 @@ -2,7 +2,7 @@ <service name="obs_scm" mode="manual"> <param name="url">https://code.forgejo.org/forgejo/runner</param> <param name="scm">git</param> - <param name="revision">refs/tags/v12.8.2</param> + <param name="revision">refs/tags/v12.9.0</param> <param name="versionformat">@PARENT_TAG@</param> <param name="changesgenerate">disable</param> <param name="versionrewrite-pattern">v(.*)</param> ++++++ forgejo-runner-12.8.2.obscpio -> forgejo-runner-12.9.0.obscpio ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/forgejo-runner-12.8.2/act/runner/expression.go new/forgejo-runner-12.9.0/act/runner/expression.go --- old/forgejo-runner-12.8.2/act/runner/expression.go 2026-04-07 17:51:41.000000000 +0200 +++ new/forgejo-runner-12.9.0/act/runner/expression.go 2026-04-20 22:33:05.000000000 +0200 @@ -441,6 +441,14 @@ } } + for k, v := range env { + if after, ok := strings.CutPrefix(k, "INPUT_"); ok { + inputs[strings.ToLower(after)] = v + } + } + + setupWorkflowInputs(ctx, &inputs, rc) + if ghc.EventName == "workflow_call" { config := rc.Run.Workflow.WorkflowCallConfig() if config != nil && config.Inputs != nil { @@ -458,14 +466,6 @@ } } - for k, v := range env { - if after, ok := strings.CutPrefix(k, "INPUT_"); ok { - inputs[strings.ToLower(after)] = v - } - } - - setupWorkflowInputs(ctx, &inputs, rc) - return inputs } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/forgejo-runner-12.8.2/act/runner/runner_test.go new/forgejo-runner-12.9.0/act/runner/runner_test.go --- old/forgejo-runner-12.8.2/act/runner/runner_test.go 2026-04-07 17:51:41.000000000 +0200 +++ new/forgejo-runner-12.9.0/act/runner/runner_test.go 2026-04-20 22:33:05.000000000 +0200 @@ -326,6 +326,7 @@ {workdir, "GITHUB_ENV-use-in-env-ctx", "push", "", platforms, secrets}, {workdir, "ensure-post-steps", "push", "Job 'second-post-step-should-fail' failed", platforms, secrets}, {workdir, "workflow_call_inputs", "workflow_call", "", platforms, secrets}, + {workdir, "workflow-call-inputs-precedence", "workflow_call", "", platforms, secrets}, {workdir, "workflow_dispatch", "workflow_dispatch", "", platforms, secrets}, {workdir, "workflow_dispatch_no_inputs_mapping", "workflow_dispatch", "", platforms, secrets}, {workdir, "workflow_dispatch-scalar", "workflow_dispatch", "", platforms, secrets}, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/forgejo-runner-12.8.2/act/runner/testdata/workflow-call-inputs-precedence/event.json new/forgejo-runner-12.9.0/act/runner/testdata/workflow-call-inputs-precedence/event.json --- old/forgejo-runner-12.8.2/act/runner/testdata/workflow-call-inputs-precedence/event.json 1970-01-01 01:00:00.000000000 +0100 +++ new/forgejo-runner-12.9.0/act/runner/testdata/workflow-call-inputs-precedence/event.json 2026-04-20 22:33:05.000000000 +0200 @@ -0,0 +1 @@ +{} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/forgejo-runner-12.8.2/act/runner/testdata/workflow-call-inputs-precedence/workflow_call.yml new/forgejo-runner-12.9.0/act/runner/testdata/workflow-call-inputs-precedence/workflow_call.yml --- old/forgejo-runner-12.8.2/act/runner/testdata/workflow-call-inputs-precedence/workflow_call.yml 1970-01-01 01:00:00.000000000 +0100 +++ new/forgejo-runner-12.9.0/act/runner/testdata/workflow-call-inputs-precedence/workflow_call.yml 2026-04-20 22:33:05.000000000 +0200 @@ -0,0 +1,32 @@ +name: workflow_call + +on: + workflow_call: + inputs: + # The purpose of this variable is to verify that *default* values are injected correctly. + # If you change the variable's name, you also have to change the name of the env variable. + name: + name: name of the person to greet + default: Mona the Octocat + +jobs: + test: + runs-on: ubuntu-latest + env: + # The name of the env variable must be `INPUT_` followed by the capitalized name of the input + # variable. That's because the expression parser uses variables named like that for storing + # input variables. That can cause precedence problems if they are not handled correctly. + INPUT_NAME: ${{ inputs.name }} + steps: + - name: Validate inputs + run: | + echo "inputs.name=${{ inputs.name }}" + [[ "${{ inputs.name }}" = "Mona the Octocat" ]] || exit 1 + - name: Validate env + run: | + echo "env.INPUT_NAME=${{ env.INPUT_NAME }}" + [[ "${{ env.INPUT_NAME }}" = "Mona the Octocat" ]] || exit 1 + - name: Validate environment variables + run: | + echo "INPUT_NAME=$INPUT_NAME" + [[ "$INPUT_NAME" = "Mona the Octocat" ]] || exit 1 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/forgejo-runner-12.8.2/examples/docker-compose/compose-forgejo-and-runner.yml new/forgejo-runner-12.9.0/examples/docker-compose/compose-forgejo-and-runner.yml --- old/forgejo-runner-12.8.2/examples/docker-compose/compose-forgejo-and-runner.yml 2026-04-07 17:51:41.000000000 +0200 +++ new/forgejo-runner-12.9.0/examples/docker-compose/compose-forgejo-and-runner.yml 2026-04-20 22:33:05.000000000 +0200 @@ -57,7 +57,7 @@ - 8080:3000 runner-register: - image: data.forgejo.org/forgejo/runner:12.7.2 + image: data.forgejo.org/forgejo/runner:12.8.2 links: - docker-in-docker - forgejo @@ -81,7 +81,7 @@ ' runner-daemon: - image: data.forgejo.org/forgejo/runner:12.7.2 + image: data.forgejo.org/forgejo/runner:12.8.2 links: - docker-in-docker - forgejo diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/forgejo-runner-12.8.2/examples/lxc-systemd/forgejo-runner-service.sh new/forgejo-runner-12.9.0/examples/lxc-systemd/forgejo-runner-service.sh --- old/forgejo-runner-12.8.2/examples/lxc-systemd/forgejo-runner-service.sh 2026-04-07 17:51:41.000000000 +0200 +++ new/forgejo-runner-12.9.0/examples/lxc-systemd/forgejo-runner-service.sh 2026-04-20 22:33:05.000000000 +0200 @@ -22,7 +22,7 @@ : ${INPUTS_LIFETIME:=7d} DEFAULT_LXC_HELPERS_VERSION=1.1.3 # renovate: datasource=forgejo-tags depName=forgejo/lxc-helpers : ${INPUTS_LXC_HELPERS_VERSION:=$DEFAULT_LXC_HELPERS_VERSION} -DEFAULT_RUNNER_VERSION=12.7.2 # renovate: datasource=forgejo-releases depName=forgejo/runner +DEFAULT_RUNNER_VERSION=12.8.2 # renovate: datasource=forgejo-releases depName=forgejo/runner : ${INPUTS_RUNNER_VERSION:=$DEFAULT_RUNNER_VERSION} : ${KILL_AFTER:=21600} # 6h == 21600 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/forgejo-runner-12.8.2/go.mod new/forgejo-runner-12.9.0/go.mod --- old/forgejo-runner-12.8.2/go.mod 2026-04-07 17:51:41.000000000 +0200 +++ new/forgejo-runner-12.9.0/go.mod 2026-04-20 22:33:05.000000000 +0200 @@ -2,7 +2,7 @@ go 1.25.0 -toolchain go1.25.8 +toolchain go1.25.9 require ( code.forgejo.org/forgejo/actions-proto v0.7.0 @@ -19,7 +19,7 @@ github.com/docker/docker v28.5.2+incompatible github.com/docker/go-connections v0.6.0 github.com/go-git/go-billy/v5 v5.8.0 - github.com/go-git/go-git/v5 v5.17.1 + github.com/go-git/go-git/v5 v5.18.0 github.com/gobwas/glob v0.2.3 github.com/google/go-cmp v0.7.0 github.com/google/uuid v1.6.0 @@ -99,16 +99,15 @@ github.com/xeipuuv/gojsonschema v1.2.0 // indirect go.opentelemetry.io/auto/sdk v1.2.1 // indirect go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.46.1 // indirect - go.opentelemetry.io/otel v1.40.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.21.0 // indirect - go.opentelemetry.io/otel/metric v1.40.0 // indirect - go.opentelemetry.io/otel/sdk v1.40.0 // indirect - go.opentelemetry.io/otel/trace v1.40.0 // indirect + go.opentelemetry.io/otel v1.43.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.43.0 // indirect + go.opentelemetry.io/otel/metric v1.43.0 // indirect + go.opentelemetry.io/otel/sdk v1.43.0 // indirect + go.opentelemetry.io/otel/trace v1.43.0 // indirect go.yaml.in/yaml/v4 v4.0.0-rc.3 // indirect - golang.org/x/crypto v0.45.0 // indirect - golang.org/x/net v0.47.0 // indirect + golang.org/x/crypto v0.49.0 // indirect + golang.org/x/net v0.52.0 // indirect golang.org/x/sync v0.19.0 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20231120223509-83a465c0220f // indirect gopkg.in/warnings.v0 v0.1.2 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/forgejo-runner-12.8.2/go.sum new/forgejo-runner-12.9.0/go.sum --- old/forgejo-runner-12.8.2/go.sum 2026-04-07 17:51:41.000000000 +0200 +++ new/forgejo-runner-12.9.0/go.sum 2026-04-20 22:33:05.000000000 +0200 @@ -25,8 +25,8 @@ github.com/avast/retry-go/v4 v4.7.0/go.mod h1:ZMPDa3sY2bKgpLtap9JRUgk2yTAba7cgiFhqxY2Sg6Q= github.com/bmatcuk/doublestar/v4 v4.9.1 h1:X8jg9rRZmJd4yRy7ZeNDRnM+T3ZfHv15JiBJ/avrEXE= github.com/bmatcuk/doublestar/v4 v4.9.1/go.mod h1:xBQ8jztBU6kakFMg+8WGxn0c6z1fTSPVIjEY1Wr7jzc= -github.com/cenkalti/backoff/v4 v4.2.1 h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqylYbM= -github.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= +github.com/cenkalti/backoff/v5 v5.0.3 h1:ZN+IMa753KfX5hd8vVaMixjnqRZ3y8CuJKRKj1xcsSM= +github.com/cenkalti/backoff/v5 v5.0.3/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw= github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cloudflare/circl v1.6.3 h1:9GPOhQGF9MCYUeXyMYlqTR6a5gTrgR/fBLXvUgtVcg8= @@ -78,8 +78,8 @@ github.com/go-git/go-billy/v5 v5.8.0/go.mod h1:RpvI/rw4Vr5QA+Z60c6d6LXH0rYJo0uD5SqfmrrheCY= github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399 h1:eMje31YglSBqCdIqdhKBW8lokaMrL3uTkpGYlE2OOT4= github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399/go.mod h1:1OCfN199q1Jm3HZlxleg+Dw/mwps2Wbk9frAWm+4FII= -github.com/go-git/go-git/v5 v5.17.1 h1:WnljyxIzSj9BRRUlnmAU35ohDsjRK0EKmL0evDqi5Jk= -github.com/go-git/go-git/v5 v5.17.1/go.mod h1:pW/VmeqkanRFqR6AljLcs7EA7FbZaN5MQqO7oZADXpo= +github.com/go-git/go-git/v5 v5.18.0 h1:O831KI+0PR51hM2kep6T8k+w0/LIAD490gvqMCvL5hM= +github.com/go-git/go-git/v5 v5.18.0/go.mod h1:pW/VmeqkanRFqR6AljLcs7EA7FbZaN5MQqO7oZADXpo= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= @@ -97,8 +97,8 @@ github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 h1:YBftPWNWd4WwGqtY2yeZL2ef8rHAxPBD8KFhJpmcqms= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0/go.mod h1:YN5jB8ie0yfIUg6VvR9Kz84aCaG7AsGZnLjhHbUqwPg= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.28.0 h1:HWRh5R2+9EifMyIHV7ZV+MIZqgz+PMpZ14Jynv3O2Zs= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.28.0/go.mod h1:JfhWUomR1baixubs02l85lZYYOm7LV6om4ceouMv45c= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A= @@ -216,32 +216,32 @@ go.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.46.1 h1:aFJWCqJMNjENlcleuuOkGAPH82y0yULBScfXcIEdS24= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.46.1/go.mod h1:sEGXWArGqc3tVa+ekntsN65DmVbVeW+7lTKTjZF3/Fo= -go.opentelemetry.io/otel v1.40.0 h1:oA5YeOcpRTXq6NN7frwmwFR0Cn3RhTVZvXsP4duvCms= -go.opentelemetry.io/otel v1.40.0/go.mod h1:IMb+uXZUKkMXdPddhwAHm6UfOwJyh4ct1ybIlV14J0g= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0 h1:cl5P5/GIfFh4t6xyruOgJP5QiA1pw4fYYdv6nc6CBWw= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0/go.mod h1:zgBdWWAu7oEEMC06MMKc5NLbA/1YDXV1sMpSqEeLQLg= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.21.0 h1:digkEZCJWobwBqMwC0cwCq8/wkkRy/OowZg5OArWZrM= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.21.0/go.mod h1:/OpE/y70qVkndM0TrxT4KBoN3RsFZP0QaofcfYrj76I= -go.opentelemetry.io/otel/metric v1.40.0 h1:rcZe317KPftE2rstWIBitCdVp89A2HqjkxR3c11+p9g= -go.opentelemetry.io/otel/metric v1.40.0/go.mod h1:ib/crwQH7N3r5kfiBZQbwrTge743UDc7DTFVZrrXnqc= -go.opentelemetry.io/otel/sdk v1.40.0 h1:KHW/jUzgo6wsPh9At46+h4upjtccTmuZCFAc9OJ71f8= -go.opentelemetry.io/otel/sdk v1.40.0/go.mod h1:Ph7EFdYvxq72Y8Li9q8KebuYUr2KoeyHx0DRMKrYBUE= -go.opentelemetry.io/otel/trace v1.40.0 h1:WA4etStDttCSYuhwvEa8OP8I5EWu24lkOzp+ZYblVjw= -go.opentelemetry.io/otel/trace v1.40.0/go.mod h1:zeAhriXecNGP/s2SEG3+Y8X9ujcJOTqQ5RgdEJcawiA= -go.opentelemetry.io/proto/otlp v1.0.0 h1:T0TX0tmXU8a3CbNXzEKGeU5mIVOdf0oykP+u2lIVU/I= -go.opentelemetry.io/proto/otlp v1.0.0/go.mod h1:Sy6pihPLfYHkr3NkUbEhGHFhINUSI/v80hjKIs5JXpM= +go.opentelemetry.io/otel v1.43.0 h1:mYIM03dnh5zfN7HautFE4ieIig9amkNANT+xcVxAj9I= +go.opentelemetry.io/otel v1.43.0/go.mod h1:JuG+u74mvjvcm8vj8pI5XiHy1zDeoCS2LB1spIq7Ay0= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.43.0 h1:88Y4s2C8oTui1LGM6bTWkw0ICGcOLCAI5l6zsD1j20k= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.43.0/go.mod h1:Vl1/iaggsuRlrHf/hfPJPvVag77kKyvrLeD10kpMl+A= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.43.0 h1:3iZJKlCZufyRzPzlQhUIWVmfltrXuGyfjREgGP3UUjc= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.43.0/go.mod h1:/G+nUPfhq2e+qiXMGxMwumDrP5jtzU+mWN7/sjT2rak= +go.opentelemetry.io/otel/metric v1.43.0 h1:d7638QeInOnuwOONPp4JAOGfbCEpYb+K6DVWvdxGzgM= +go.opentelemetry.io/otel/metric v1.43.0/go.mod h1:RDnPtIxvqlgO8GRW18W6Z/4P462ldprJtfxHxyKd2PY= +go.opentelemetry.io/otel/sdk v1.43.0 h1:pi5mE86i5rTeLXqoF/hhiBtUNcrAGHLKQdhg4h4V9Dg= +go.opentelemetry.io/otel/sdk v1.43.0/go.mod h1:P+IkVU3iWukmiit/Yf9AWvpyRDlUeBaRg6Y+C58QHzg= +go.opentelemetry.io/otel/trace v1.43.0 h1:BkNrHpup+4k4w+ZZ86CZoHHEkohws8AY+WTX09nk+3A= +go.opentelemetry.io/otel/trace v1.43.0/go.mod h1:/QJhyVBUUswCphDVxq+8mld+AvhXZLhe+8WVFxiFff0= +go.opentelemetry.io/proto/otlp v1.10.0 h1:IQRWgT5srOCYfiWnpqUYz9CVmbO8bFmKcwYxpuCSL2g= +go.opentelemetry.io/proto/otlp v1.10.0/go.mod h1:/CV4QoCR/S9yaPj8utp3lvQPoqMtxXdzn7ozvvozVqk= go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= go.yaml.in/yaml/v4 v4.0.0-rc.3 h1:3h1fjsh1CTAPjW7q/EMe+C8shx5d8ctzZTrLcs/j8Go= go.yaml.in/yaml/v4 v4.0.0-rc.3/go.mod h1:aZqd9kCMsGL7AuUv/m/PvWLdg5sjJsZ4oHDEnfPPfY0= golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.45.0 h1:jMBrvKuj23MTlT0bQEOBcAE0mjg8mK9RXFhRH6nyF3Q= -golang.org/x/crypto v0.45.0/go.mod h1:XTGrrkGJve7CYK7J8PEww4aY7gM3qMCElcJQ8n8JdX4= +golang.org/x/crypto v0.49.0 h1:+Ng2ULVvLHnJ/ZFEq4KdcDd/cfjrrjjNSXNzxg0Y4U4= +golang.org/x/crypto v0.49.0/go.mod h1:ErX4dUh2UM+CFYiXZRTcMpEcN8b/1gxEuv3nODoYtCA= golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 h1:2dVuKD2vS7b0QIHQbpyTISPd0LeHDbnYEryqj5Q1ug8= golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56/go.mod h1:M4RDyNAINzryxdtnbRXRL/OHtkFuWGRjvuhBJpk2IlY= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.47.0 h1:Mx+4dIFzqraBXUugkia1OOvlD6LemFo1ALMHjrXDOhY= -golang.org/x/net v0.47.0/go.mod h1:/jNxtkgq5yWUGYkaZGqo27cfGZ1c5Nen03aYrrKpVRU= +golang.org/x/net v0.52.0 h1:He/TN1l0e4mmR3QqHMT2Xab3Aj3L9qjbhRm78/6jrW0= +golang.org/x/net v0.52.0/go.mod h1:R1MAz7uMZxVMualyPXb+VaqGSa3LIaUqk0eEt3w36Sw= golang.org/x/sync v0.19.0 h1:vV+1eWNmZ5geRlYjzm2adRgW2/mcpevXNg50YZtPCE4= golang.org/x/sync v0.19.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -260,18 +260,17 @@ golang.org/x/term v0.41.0 h1:QCgPso/Q3RTJx2Th4bDLqML4W6iJiaXFq2/ftQF13YU= golang.org/x/term v0.41.0/go.mod h1:3pfBgksrReYfZ5lvYM0kSO0LIkAl4Yl2bXOkKP7Ec2A= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.31.0 h1:aC8ghyu4JhP8VojJ2lEHBnochRno1sgL6nEi9WGFGMM= -golang.org/x/text v0.31.0/go.mod h1:tKRAlv61yKIjGGHX/4tP1LTbc13YSec1pxVEWXzfoeM= +golang.org/x/text v0.35.0 h1:JOVx6vVDFokkpaq1AEptVzLTpDe9KGpj5tR4/X+ybL8= +golang.org/x/text v0.35.0/go.mod h1:khi/HExzZJ2pGnjenulevKNX1W67CUy0AsXcNubPGCA= golang.org/x/time v0.15.0 h1:bbrp8t3bGUeFOx08pvsMYRTCVSMk89u4tKbNOZbp88U= golang.org/x/time v0.15.0/go.mod h1:Y4YMaQmXwGQZoFaVFk4YpCt4FLQMYKZe9oeV/f4MSno= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -google.golang.org/genproto v0.0.0-20231106174013-bbf56f31fb17 h1:wpZ8pe2x1Q3f2KyT5f8oP/fa9rHAKgFPr/HZdNuS+PQ= -google.golang.org/genproto/googleapis/api v0.0.0-20231120223509-83a465c0220f h1:2yNACc1O40tTnrsbk9Cv6oxiW8pxI/pXj0wRtdlYmgY= -google.golang.org/genproto/googleapis/api v0.0.0-20231120223509-83a465c0220f/go.mod h1:Uy9bTZJqmfrw2rIBxgGLnamc78euZULUBrLZ9XTITKI= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 h1:pPJltXNxVzT4pK9yD8vR9X75DaWYYmLGMsEvBfFQZzQ= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= -google.golang.org/grpc v1.67.0 h1:IdH9y6PF5MPSdAntIcpjQ+tXO41pcQsfZV2RxtQgVcw= -google.golang.org/grpc v1.67.0/go.mod h1:1gLDyUQU7CTLJI90u3nXZ9ekeghjeM7pTDZlqFNg2AA= +google.golang.org/genproto/googleapis/api v0.0.0-20260401024825-9d38bb4040a9 h1:VPWxll4HlMw1Vs/qXtN7BvhZqsS9cdAittCNvVENElA= +google.golang.org/genproto/googleapis/api v0.0.0-20260401024825-9d38bb4040a9/go.mod h1:7QBABkRtR8z+TEnmXTqIqwJLlzrZKVfAUm7tY3yGv0M= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260401024825-9d38bb4040a9 h1:m8qni9SQFH0tJc1X0vmnpw/0t+AImlSvp30sEupozUg= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260401024825-9d38bb4040a9/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= +google.golang.org/grpc v1.80.0 h1:Xr6m2WmWZLETvUNvIUmeD5OAagMw3FiKmMlTdViWsHM= +google.golang.org/grpc v1.80.0/go.mod h1:ho/dLnxwi3EDJA4Zghp7k2Ec1+c2jqup0bFkw07bwF4= google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE= google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/forgejo-runner-12.8.2/internal/app/cmd/args.go new/forgejo-runner-12.9.0/internal/app/cmd/args.go --- old/forgejo-runner-12.8.2/internal/app/cmd/args.go 2026-04-07 17:51:41.000000000 +0200 +++ new/forgejo-runner-12.9.0/internal/app/cmd/args.go 2026-04-20 22:33:05.000000000 +0200 @@ -7,6 +7,7 @@ "errors" "fmt" "net/url" + "strings" "time" "code.forgejo.org/forgejo/runner/v12/internal/pkg/config" @@ -74,6 +75,10 @@ return fmt.Errorf("invalid `token-url`: %w", err) } } + resolvedToken = strings.TrimSpace(resolvedToken) + if !config.IsValidToken(resolvedToken) { + return errors.New("token contains invalid characters") + } if cfg.Server.Connections == nil { cfg.Server.Connections = map[string]*config.Connection{} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/forgejo-runner-12.8.2/internal/app/cmd/args_test.go new/forgejo-runner-12.9.0/internal/app/cmd/args_test.go --- old/forgejo-runner-12.8.2/internal/app/cmd/args_test.go 2026-04-07 17:51:41.000000000 +0200 +++ new/forgejo-runner-12.9.0/internal/app/cmd/args_test.go 2026-04-20 22:33:05.000000000 +0200 @@ -211,6 +211,46 @@ assert.Equal(t, "8tBZOQlSaH", cfg.Server.Connections["default"].Token) }) + t.Run("trims token from token_url", func(t *testing.T) { + tokenURL, err := prepareTokenFile(t, "\n8tBZOQlSaH\r\n") + require.NoError(t, err) + + serverURL, err := url.Parse("https://example.com/") + require.NoError(t, err) + + conn := connection{ + url: serverURL.String(), + uuid: "009e3230-0881-4690-8e0e-43ce2c01d2f9", + tokenURL: tokenURL.String(), + labels: []string{"label-1"}, + } + + cfg := config.Config{} + err = connectionFromArguments(&conn)(&cfg) + require.NoError(t, err) + + assert.Equal(t, "8tBZOQlSaH", cfg.Server.Connections["default"].Token) + }) + + t.Run("rejects token from token_url containing invalid characters", func(t *testing.T) { + tokenURL, err := prepareTokenFile(t, "8tBZ\nOQ\rlSaH") + require.NoError(t, err) + + serverURL, err := url.Parse("https://example.com/") + require.NoError(t, err) + + conn := connection{ + url: serverURL.String(), + uuid: "009e3230-0881-4690-8e0e-43ce2c01d2f9", + tokenURL: tokenURL.String(), + labels: []string{"label-1"}, + } + + cfg := config.Config{} + err = connectionFromArguments(&conn)(&cfg) + require.ErrorContains(t, err, "token contains invalid characters") + }) + t.Run("rejects malformed label", func(t *testing.T) { serverURL, err := url.Parse("https://example.com/") require.NoError(t, err) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/forgejo-runner-12.8.2/internal/pkg/config/config.go new/forgejo-runner-12.9.0/internal/pkg/config/config.go --- old/forgejo-runner-12.8.2/internal/pkg/config/config.go 2026-04-07 17:51:41.000000000 +0200 +++ new/forgejo-runner-12.9.0/internal/pkg/config/config.go 2026-04-20 22:33:05.000000000 +0200 @@ -10,6 +10,7 @@ "net/url" "os" "path/filepath" + "regexp" "strings" "time" @@ -471,11 +472,15 @@ var resolvedToken string if s.TokenURL != "" { if resolvedToken, err = ResolveSecretURL(s.TokenURL); err != nil { - return fmt.Errorf("invalid `secret_url`: %w", err) + return fmt.Errorf("invalid `token_url`: %w", err) } } else { resolvedToken = s.Token } + resolvedToken = strings.TrimSpace(resolvedToken) + if !IsValidToken(resolvedToken) { + return errors.New("token contains invalid characters") + } if config.Server.Connections == nil { config.Server.Connections = map[string]*Connection{} @@ -636,3 +641,10 @@ return string(value), nil } + +var validTokenPattern = regexp.MustCompile("(?i)^[a-z0-9]*$") + +// IsValidToken tests whether the given string does not contain characters that are not allowed in a runner token. +func IsValidToken(str string) bool { + return validTokenPattern.MatchString(str) +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/forgejo-runner-12.8.2/internal/pkg/config/config_test.go new/forgejo-runner-12.9.0/internal/pkg/config/config_test.go --- old/forgejo-runner-12.8.2/internal/pkg/config/config_test.go 2026-04-07 17:51:41.000000000 +0200 +++ new/forgejo-runner-12.9.0/internal/pkg/config/config_test.go 2026-04-20 22:33:05.000000000 +0200 @@ -1296,6 +1296,96 @@ assert.Equal(t, "8tBZOQlSaH", config.Server.Connections["example"].Token) }) + t.Run("rejects token from token containing invalid characters", func(t *testing.T) { + serverURL, err := url.Parse("https://example.com/") + require.NoError(t, err) + + serialized := serializedConnectionSettings{ + URL: serverURL.String(), + UUID: "009e3230-0881-4690-8e0e-43ce2c01d2f9", + Token: "VV\nb1\n\teuy", + TokenURL: "", + Labels: []string{"label-1"}, + } + + config := Config{} + err = serialized.applyTo(&config, "example") + require.ErrorContains(t, err, "token contains invalid characters") + }) + + t.Run("rejects token from token_url containing invalid characters", func(t *testing.T) { + tempDir := t.TempDir() + secretPath := filepath.Join(tempDir, "secret.txt") + + err := os.WriteFile(secretPath, []byte("VV\nb1\r\teuy"), 0o644) + require.NoError(t, err) + + serverURL, err := url.Parse("https://example.com/") + require.NoError(t, err) + + tokenURL, err := fileuri.FromFilePath(secretPath) + require.NoError(t, err) + + serialized := serializedConnectionSettings{ + URL: serverURL.String(), + UUID: "009e3230-0881-4690-8e0e-43ce2c01d2f9", + Token: "", + TokenURL: tokenURL.String(), + Labels: []string{"label-1"}, + } + + config := Config{} + err = serialized.applyTo(&config, "example") + require.ErrorContains(t, err, "token contains invalid characters") + }) + + t.Run("trims whitespace from token", func(t *testing.T) { + serverURL, err := url.Parse("https://example.com/") + require.NoError(t, err) + + serialized := serializedConnectionSettings{ + URL: serverURL.String(), + UUID: "009e3230-0881-4690-8e0e-43ce2c01d2f9", + Token: "\nVVb1teuy\r\n", + TokenURL: "", + Labels: []string{"label-1"}, + } + + config := Config{} + err = serialized.applyTo(&config, "example") + require.NoError(t, err) + + assert.Equal(t, "VVb1teuy", config.Server.Connections["example"].Token) + }) + + t.Run("trims whitespace from token from token_url", func(t *testing.T) { + tempDir := t.TempDir() + secretPath := filepath.Join(tempDir, "secret.txt") + + err := os.WriteFile(secretPath, []byte("\nVVb1teuy\r\n"), 0o644) + require.NoError(t, err) + + serverURL, err := url.Parse("https://example.com/") + require.NoError(t, err) + + tokenURL, err := fileuri.FromFilePath(secretPath) + require.NoError(t, err) + + serialized := serializedConnectionSettings{ + URL: serverURL.String(), + UUID: "009e3230-0881-4690-8e0e-43ce2c01d2f9", + Token: "", + TokenURL: tokenURL.String(), + Labels: []string{"label-1"}, + } + + config := Config{} + err = serialized.applyTo(&config, "example") + require.NoError(t, err) + + assert.Equal(t, "VVb1teuy", config.Server.Connections["example"].Token) + }) + t.Run("rejects malformed label", func(t *testing.T) { serverURL, err := url.Parse("https://example.com/") require.NoError(t, err) ++++++ forgejo-runner.obsinfo ++++++ --- /var/tmp/diff_new_pack.oa6Z6A/_old 2026-04-28 12:00:55.756879837 +0200 +++ /var/tmp/diff_new_pack.oa6Z6A/_new 2026-04-28 12:00:55.760880003 +0200 @@ -1,5 +1,5 @@ name: forgejo-runner -version: 12.8.2 -mtime: 1775577101 -commit: 483dc418ecb029b3c0f05faefebac547847aa950 +version: 12.9.0 +mtime: 1776717185 +commit: 66625efb26ca57e9e5d9d37111a017d243b5a63c ++++++ vendor.tar.gz ++++++ ++++ 35602 lines of diff (skipped)
