Skip to content

fix: address 10 security, stability, and correctness issues#511

Merged
CybotTM merged 17 commits intomainfrom
fix/security-stability-review
Mar 11, 2026
Merged

fix: address 10 security, stability, and correctness issues#511
CybotTM merged 17 commits intomainfrom
fix/security-stability-review

Conversation

@CybotTM
Copy link
Copy Markdown
Member

@CybotTM CybotTM commented Mar 11, 2026

Summary

Comprehensive codebase review uncovered 10 security, stability, and correctness issues. Each fix has dedicated tests written first (TDD), all passing with -race detection.

Security fixes (4)

  • Credential leak via APIjson:"-" on WebPasswordHash/WebSecretKey to hide them from /api/config
  • CSRF bypass — Remove X-Requested-With header bypass that allowed skipping CSRF validation
  • Rate limiter memory DoS — Implement CleanupOldLimiters with lastAccess tracking (was an empty stub)
  • IP spoofing bypass — Only trust X-Forwarded-For/X-Real-IP from loopback addresses

Stability fixes (2)

  • Double-close panicsync.Once on daemon done channel to prevent crash when multiple goroutines detect errors
  • Concurrent map crashsync.RWMutex on Config job maps to prevent crash when Docker events race with config reload

Correctness fixes (4)

  • Workflow dependencies brokenDependencyProvider interface instead of *BareJob type assertion so depends-on/on-success/on-failure work for ExecJob, RunJob, etc.
  • Docker ops ignore cancellation — Propagate ctx.Ctx instead of context.Background() to Docker API calls
  • Shutdown priority ignored — Execute hooks in priority groups (sequential between groups, concurrent within)
  • Swarm exit codes swallowed — Return NonZeroExitError for non-zero service task exit codes

Test plan

  • All new tests written before fixes (TDD)
  • go test -race ./core/ ./web/ ./cli/ ./config/ ./middlewares/ ./metrics/ — all pass
  • go vet ./... — clean
  • Each commit is atomic and independently buildable
  • CI passes

CybotTM added 10 commits March 11, 2026 10:46
Add json:"-" tags to prevent credential leak via the config API endpoint.
Without this, an authenticated user (or anyone when auth is off) can
retrieve the bcrypt hash and JWT signing key, enabling token forgery.

Signed-off-by: Sebastian Mendel <sebastian.mendel@netresearch.de>
Signed-off-by: Sebastian Mendel <info@sebastianmendel.de>
Use sync.Once to protect the done channel close, preventing a runtime
panic when multiple goroutines (shutdown signal, pprof error, web server
error) attempt to close it concurrently.

Signed-off-by: Sebastian Mendel <sebastian.mendel@netresearch.de>
Signed-off-by: Sebastian Mendel <info@sebastianmendel.de>
Protect job map access in dockerContainersUpdate and iniConfigUpdate with
a sync.RWMutex. Without this, simultaneous Docker events and config file
reloads cause fatal concurrent map read/write panics.

Signed-off-by: Sebastian Mendel <sebastian.mendel@netresearch.de>
Signed-off-by: Sebastian Mendel <info@sebastianmendel.de>
Replace *BareJob type assertion with a DependencyProvider interface so
that ExecJob, RunJob, LocalJob, and all types embedding BareJob have
their depends-on/on-success/on-failure configurations correctly collected.
Previously the type assertion always failed for concrete job types,
silently breaking the entire DAG/workflow feature.

Signed-off-by: Sebastian Mendel <sebastian.mendel@netresearch.de>
Signed-off-by: Sebastian Mendel <info@sebastianmendel.de>
Replace context.Background() with ctx.Ctx in ExecJob, RunJob, and
RunServiceJob so that scheduler shutdown, job removal, and max-runtime
cancellation properly propagate to Docker API calls instead of being
silently ignored.

Signed-off-by: Sebastian Mendel <sebastian.mendel@netresearch.de>
Signed-off-by: Sebastian Mendel <info@sebastianmendel.de>
Always require CSRF tokens for login requests regardless of the
X-Requested-With header. The previous bypass allowed cross-origin
requests to skip CSRF validation entirely by setting this freely
controllable header.

Signed-off-by: Sebastian Mendel <sebastian.mendel@netresearch.de>
Signed-off-by: Sebastian Mendel <info@sebastianmendel.de>
Add lastAccess tracking to RateLimiter and implement CleanupOldLimiters
with a maxAge parameter. Previously the limiters map grew unbounded as
new client IPs made login attempts, enabling memory exhaustion attacks.

Signed-off-by: Sebastian Mendel <sebastian.mendel@netresearch.de>
Signed-off-by: Sebastian Mendel <info@sebastianmendel.de>
Group hooks by priority and execute groups sequentially (lower priority
first). Hooks within the same priority group still run concurrently.
Previously all hooks ran concurrently regardless of priority, defeating
the purpose of the priority system and causing the scheduler to shut
down simultaneously with the HTTP server.

Signed-off-by: Sebastian Mendel <sebastian.mendel@netresearch.de>
Signed-off-by: Sebastian Mendel <info@sebastianmendel.de>
Previously watchContainer returned nil when a service task exited with
a non-zero code, silently reporting success. Now it returns a proper
NonZeroExitError, matching the behavior of ExecJob and RunJob.

Signed-off-by: Sebastian Mendel <sebastian.mendel@netresearch.de>
Signed-off-by: Sebastian Mendel <info@sebastianmendel.de>
Ignore X-Forwarded-For and X-Real-IP when the direct connection is not
from a loopback address. This prevents attackers from spoofing IPs to
bypass per-IP rate limiting. Connections from local reverse proxies
(127.0.0.1, ::1) continue to trust forwarded headers.

Signed-off-by: Sebastian Mendel <sebastian.mendel@netresearch.de>
Signed-off-by: Sebastian Mendel <info@sebastianmendel.de>
Copilot AI review requested due to automatic review settings March 11, 2026 09:51
@github-actions
Copy link
Copy Markdown

github-actions bot commented Mar 11, 2026

Dependency Review

✅ No vulnerabilities or license issues or OpenSSF Scorecard issues found.

Scanned Files

None

github-actions[bot]
github-actions bot previously approved these changes Mar 11, 2026
Copy link
Copy Markdown

@github-actions github-actions bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Automated approval for solo maintainer project

All CI checks passed. See SECURITY.md for compensating controls.

@github-actions
Copy link
Copy Markdown

github-actions bot commented Mar 11, 2026

✅ Mutation Testing Results

Mutation Score: 71.88% (threshold: 60%)

✨ Good job! Mutation score meets the threshold.

What is mutation testing?

Mutation testing measures test quality by introducing small changes (mutations) to the code and checking if tests detect them. A higher score means better test effectiveness.

  • Killed mutants: Tests caught the mutation (good!)
  • Survived mutants: Tests missed the mutation (needs improvement)

Copy link
Copy Markdown

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Addresses a set of security, stability, and correctness issues across the web auth layer, scheduler/workflow wiring, Docker job execution, and daemon/config concurrency.

Changes:

  • Harden web auth and request handling (CSRF enforcement, rate-limiter cleanup, and forwarded-IP trust rules) and update/add tests accordingly.
  • Fix core correctness around workflow dependency extraction, Docker context cancellation propagation, shutdown hook ordering, and swarm service exit-code handling.
  • Improve daemon/config robustness (idempotent done-channel close, mutex-protected config job maps, and updated tests).

Reviewed changes

Copilot reviewed 23 out of 23 changed files in this pull request and generated 3 comments.

Show a summary per file
File Description
web/middleware.go Rate limiter now extracts host from RemoteAddr and only trusts XFF from loopback.
web/middleware_mutation_test.go Align tests with host-only rate-limit keying and trusted-loopback XFF behavior.
web/auth_secure.go Implement limiter cleanup with last-access tracking; enforce CSRF token for all login requests; tighten client IP extraction.
web/auth_secure_ext_test.go Add/adjust tests for CSRF bypass removal, limiter cleanup, and trusted proxy handling in getClientIP.
web/auth_secure_coverage_unit_test.go Update cleanup tests for new CleanupOldLimiters signature and behavior.
web/auth_integration_test.go Fetch CSRF token via /api/csrf-token and use it for /api/login integration flows.
web/missing_coverage_test.go Update cleanup invocation to pass maxAge.
core/workflow.go Replace *BareJob assertion with DependencyProvider interface to support embedded BareJob types.
core/workflow_test.go Update/add tests ensuring dependencies are collected for embedded BareJob job types (incl. ExecJob).
core/execjob.go Propagate ctx.Ctx to provider instead of context.Background().
core/runjob.go Propagate ctx.Ctx through Docker operations for cancellation correctness.
core/runservice.go Propagate ctx.Ctx; return NonZeroExitError for non-zero swarm task exit codes.
core/runservice_unit_test.go Add tests for watchContainer/run non-zero exit behavior (needs loop-var capture fix for parallel subtests).
core/context_propagation_test.go New tests verifying ctx propagation into provider calls for ExecJob/RunJob/RunServiceJob.
core/bare_job.go Add dependency accessors to support DependencyProvider interface.
core/shutdown.go Change shutdown hook execution to run concurrently within priority groups and sequentially between groups.
core/shutdown_test.go Add tests for priority-group ordering and same-priority concurrency.
cli/daemon.go Prevent double-close panics on done channel via sync.Once + helper.
cli/daemon_closedone_test.go New tests verifying closeDone is safe concurrently and sequentially.
cli/config.go Add RWMutex to protect job maps; lock around label/INI sync and use scheduler accessors for middleware updates.
cli/config_test.go Fix loop variable capture and avoid deep-equality on Config containing a mutex by comparing relevant fields.
cli/config_security_test.go Ensure JSON marshaling of Global config does not leak secret fields.
cli/config_concurrent_test.go New race-focused tests validating locked concurrent access patterns to job maps.
Comments suppressed due to low confidence (1)

core/shutdown.go:153

  • When shutdown hooks return errors, Shutdown() currently wraps them with ErrShutdownTimeout ("shutdown timed out") even though no timeout occurred. This makes it hard for callers to distinguish hook failures from an actual timeout and is semantically incorrect. Consider returning a dedicated hook-failure sentinel (or errors.Join of the hook errors) and reserve ErrShutdownTimeout only for ctx deadline expiry.
	sm.logger.Info("Graceful shutdown completed successfully")

	if len(shutdownErrors) > 0 {
		return fmt.Errorf("%w: %d errors occurred", ErrShutdownTimeout, len(shutdownErrors))
	}

@gemini-code-assist
Copy link
Copy Markdown

Summary of Changes

Hello, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!

This pull request delivers a significant upgrade to the codebase's resilience and security posture. It systematically addresses a total of ten identified issues across security, stability, and correctness domains. The changes ensure that sensitive data is protected, concurrent operations are safe, and critical system behaviors, such as job dependencies and graceful shutdowns, function as expected under various conditions. The thorough test coverage provides confidence in the reliability of these improvements.

Highlights

  • Security Fixes: Implemented four critical security enhancements: preventing credential leaks by hiding sensitive web authentication fields from API responses, closing a CSRF bypass vulnerability by enforcing CSRF token validation for all login requests, mitigating a rate limiter memory denial-of-service (DoS) attack by actively cleaning up old rate limiter entries, and preventing IP spoofing by only trusting X-Forwarded-For/X-Real-IP headers when the request originates from a loopback address.
  • Stability Improvements: Addressed two stability issues: preventing a double-close panic in the daemon's shutdown mechanism by using sync.Once to ensure the done channel is closed exactly once, and resolving concurrent map access crashes in configuration job maps by introducing sync.RWMutex for safe read/write operations during Docker event processing and config reloads.
  • Correctness Enhancements: Fixed four correctness issues: ensuring workflow dependencies (depends-on, on-success, on-failure) function correctly for all job types (ExecJob, RunJob, etc.) by using a DependencyProvider interface instead of a concrete type assertion, propagating context.Context to Docker API calls in ExecJob, RunJob, and RunServiceJob to enable proper cancellation and timeouts, enforcing shutdown hook execution based on priority groups (sequential between groups, concurrent within), and correctly reporting non-zero exit codes for Docker Swarm service tasks.
  • Comprehensive Testing: All fixes are accompanied by new, dedicated tests written using a Test-Driven Development (TDD) approach. Extensive testing with go test -race and go vet confirms the absence of data races and other common issues, ensuring the robustness of the implemented solutions.
Changelog
  • cli/config.go
    • Added sync package import.
    • Marked WebPasswordHash and WebSecretKey fields with json:"-" to prevent their serialization in JSON output.
    • Introduced sync.RWMutex (mu) to protect concurrent access to job maps.
    • Wrapped syncJobMap calls within dockerContainersUpdate with mu.Lock() and mu.Unlock().
    • Added mu.Lock() and defer mu.Unlock() to iniConfigUpdate to synchronize configuration updates.
    • Updated iniConfigUpdate to retrieve all jobs using c.sh.GetActiveJobs() and c.sh.GetDisabledJobs() for middleware updates.
  • cli/config_concurrent_test.go
    • Added new test file to verify concurrent read/write access to Config job maps using sync.RWMutex.
  • cli/config_security_test.go
    • Added new test file to ensure WebPasswordHash and WebSecretKey are not leaked in JSON API responses.
  • cli/config_test.go
    • Updated for loops in TestConfigIni and TestLabelsConfig to use for i := range for compatibility with t.Parallel().
    • Modified assertions in TestLabelsConfig to compare individual job maps and global config for more precise testing.
  • cli/daemon.go
    • Added sync package import.
    • Introduced sync.Once (doneOnce) to the DaemonCommand struct to protect the done channel.
    • Added closeDone() method to safely close the done channel at most once.
    • Replaced direct close(c.done) calls with c.closeDone() in start() method.
  • cli/daemon_closedone_test.go
    • Added new test file to verify the closeDone() method handles multiple concurrent and sequential calls without panicking.
  • core/bare_job.go
    • Added GetDependencies(), GetOnSuccess(), and GetOnFailure() methods to BareJob to expose workflow dependency information.
  • core/context_propagation_test.go
    • Added new test file to verify that context.Context is correctly propagated to Docker API calls within ExecJob, RunJob, and RunServiceJob.
  • core/execjob.go
    • Changed context.Background() to ctx.Ctx when calling j.Provider.RunExec() to ensure context propagation.
  • core/runjob.go
    • Replaced context.Background() with ctx.Ctx for all Docker provider calls (ensureImageAvailable, createOrInspectContainer, deleteContainer, startAndWait) to enable context propagation.
  • core/runservice.go
    • Replaced context.Background() with ctx.Ctx for all Docker provider calls (EnsureImage, buildService, watchContainer, deleteService) to enable context propagation.
    • Modified watchContainer to return NonZeroExitError for non-zero service task exit codes and ErrUnexpected for ExitCodeSwarmError.
  • core/runservice_unit_test.go
    • Added unit tests for watchContainer and Run methods to verify correct error handling for non-zero exit codes from Docker Swarm services.
  • core/shutdown.go
    • Added sort package import.
    • Refactored ShutdownManager.Shutdown() to execute hooks in priority groups, ensuring lower priority groups complete before higher priority groups start, while hooks within the same group run concurrently.
  • core/shutdown_test.go
    • Added tests to verify the correct priority ordering and concurrent execution of shutdown hooks.
  • core/workflow.go
    • Defined a new DependencyProvider interface to abstract access to job dependency information.
    • Updated collectDependencyEdges to use the DependencyProvider interface, allowing all job types embedding BareJob to correctly declare workflow dependencies.
  • core/workflow_test.go
    • Modified TestCollectDependencyEdges_NonBareJobCollected to assert that jobs embedding BareJob correctly provide dependency edges.
    • Updated TestCollectDependencyEdges_MixedJobTypes to reflect that both BareJob and embedded job types contribute edges.
    • Added TestCollectDependencyEdges_ExecJobWithDependencies to specifically test dependency collection for ExecJob via the new interface.
  • web/auth_integration_test.go
    • Added helper functions fetchCSRFToken and loginWithCSRF to streamline authentication tests.
    • Updated all login-related integration tests to use the new loginWithCSRF helper, ensuring CSRF token validation is part of the test flow and removing the X-Requested-With header.
  • web/auth_secure.go
    • Added lastAccess map to RateLimiter to track the last access time for each limiter.
    • Updated GetLimiter to record the current time in lastAccess upon retrieval.
    • Implemented CleanupOldLimiters to remove rate limiters and their lastAccess entries that are older than a specified maxAge.
    • Removed the X-Requested-With: XMLHttpRequest header bypass from CSRF token validation in SecureLoginHandler.ServeHTTP, enforcing CSRF for all login requests.
    • Modified getClientIP to only trust X-Forwarded-For and X-Real-IP headers if the direct client connection originates from a loopback address.
  • web/auth_secure_coverage_unit_test.go
    • Updated TestRateLimiter_CleanupOldLimiters to pass a maxAge parameter to CleanupOldLimiters.
  • web/auth_secure_ext_test.go
    • Updated calls to CleanupOldLimiters to include the maxAge parameter.
    • Added tests for RateLimiterCleanupRemovesOldEntries and RateLimiterCleanupPreservesRecentEntries to verify the new cleanup logic.
    • Added TestCSRF_XRequestedWithBypassRemoved to confirm the removal of the CSRF bypass.
    • Added tests for TestGetClientIP_IgnoresXFFFromNonLoopback, TestGetClientIP_TrustsXFFFromLoopback, and TestGetClientIP_IPv6Loopback to validate the trusted proxy IP extraction logic.
  • web/middleware.go
    • Added net and strings package imports.
    • Introduced extractRemoteIP and isLoopback helper functions for robust IP address parsing and loopback detection.
    • Modified the rate limiter middleware to use extractRemoteIP and isLoopback to conditionally trust X-Forwarded-For headers only when the request comes from a loopback address.
  • web/middleware_mutation_test.go
    • Adjusted tests to use host-only IP addresses for rate limiter keys, reflecting the updated IP extraction logic.
    • Modified RemoteAddr in TestMiddleware_XForwardedFor to simulate a loopback address, aligning with the new trusted proxy logic.
    • Added TestRateLimiterMiddleware_IgnoresXFFFromNonLoopback to verify that X-Forwarded-For is ignored for non-loopback clients.
  • web/missing_coverage_test.go
    • Updated TestRateLimiterCleanupOldLimiters to pass a maxAge parameter to CleanupOldLimiters.
Activity
  • The author, CybotTM, performed a comprehensive codebase review to identify and address 10 issues.
  • All fixes were developed using a Test-Driven Development (TDD) approach, with tests written before the corresponding code changes.
  • The changes were validated by running go test -race ./core/ ./web/ ./cli/ ./config/ ./middlewares/ ./metrics/, with all tests passing.
  • Static analysis with go vet ./... reported a clean codebase.
  • Each commit in the pull request is atomic and independently buildable, facilitating easier review and understanding of changes.
Using Gemini Code Assist

The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.

Invoking Gemini

You can request assistance from Gemini at any point by creating a comment using either /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands on the current page.

Feature Command Description
Code Review /gemini review Performs a code review for the current pull request in its current state.
Pull Request Summary /gemini summary Provides a summary of the current pull request in its current state.
Comment @gemini-code-assist Responds in comments when explicitly tagged, both in pull request comments and review comments.
Help /gemini help Displays a list of available commands.

Customization

To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a .gemini/ folder in the base of the repository. Detailed instructions can be found here.

Limitations & Feedback

Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for GitHub and other Google products, sign up here.

You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension.

Footnotes

  1. Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution.

CybotTM added 3 commits March 11, 2026 11:23
Add tc := tc before t.Run to prevent race on the loop variable when
subtests call t.Parallel(). Without this, parallel subtests may observe
the wrong tc values (typically the last iteration).

Signed-off-by: Sebastian Mendel <sebastian.mendel@netresearch.de>
Signed-off-by: Sebastian Mendel <info@sebastianmendel.de>
Replace blocking wg.Wait() with a select on both wg completion and
ctx.Done() per priority group. This ensures ErrShutdownTimeout is
returned within the configured deadline even when a hook ignores its
context and blocks indefinitely.

Signed-off-by: Sebastian Mendel <sebastian.mendel@netresearch.de>
Signed-off-by: Sebastian Mendel <info@sebastianmendel.de>
…only

Add web-trusted-proxies config option (CLI: --web-trusted-proxies,
env: OFELIA_WEB_TRUSTED_PROXIES) accepting CIDRs like "172.17.0.0/16".
When set, X-Forwarded-For is trusted from both loopback and the
configured ranges. This supports reverse proxies in other containers
or on non-loopback host IPs (e.g. nginx/traefik in Docker networks).

Loopback addresses remain implicitly trusted regardless of config.

Signed-off-by: Sebastian Mendel <sebastian.mendel@netresearch.de>
Signed-off-by: Sebastian Mendel <info@sebastianmendel.de>
github-actions[bot]
github-actions bot previously approved these changes Mar 11, 2026
Copy link
Copy Markdown

@github-actions github-actions bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Automated approval for solo maintainer project

All CI checks passed. See SECURITY.md for compensating controls.

Copy link
Copy Markdown

@gemini-code-assist gemini-code-assist bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request introduces a comprehensive set of fixes for 10 distinct security, stability, and correctness issues. The changes are well-structured, and each fix is accompanied by dedicated tests, many of which follow a TDD approach. Key improvements include patching a credential leak via the API, fixing a CSRF bypass, preventing a rate-limiter DoS, and hardening against IP spoofing. Stability is enhanced by preventing double-close panics and concurrent map access crashes. Correctness is improved by fixing workflow dependencies, ensuring context propagation for cancellation, respecting shutdown hook priorities, and correctly handling Swarm exit codes. My review found one area for improvement regarding the consistency of an IP spoofing fix. Overall, this is an excellent and impactful set of changes.

Note: Security Review did not run due to the size of the PR.

- Remove Go 1.22+ unnecessary tc := tc rebinding (copyloopvar)
- Fix import ordering (gci)
- Use integer range loops (intrange)
- Fix fatcontext: avoid reassigning context variable
- Use wrapped static error for ParseTrustedProxies (err113)
- Use require instead of assert for error checks (testifylint)
- Guard against nil ctx.Ctx in ExecJob/RunJob/RunServiceJob.Run()
  to prevent panic in tests that construct Context manually

Signed-off-by: Sebastian Mendel <sebastian.mendel@netresearch.de>
Signed-off-by: Sebastian Mendel <info@sebastianmendel.de>
github-actions[bot]
github-actions bot previously approved these changes Mar 11, 2026
Copy link
Copy Markdown

@github-actions github-actions bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Automated approval for solo maintainer project

All CI checks passed. See SECURITY.md for compensating controls.

CybotTM added 2 commits March 11, 2026 13:52
- Use integer range (Go 1.22+) in daemon_closedone_test.go
- Fix gci formatting (missing spaces) in context_propagation_test.go
- Add nolint:fatcontext for intentional context captures in test assertions

Signed-off-by: Sebastian Mendel <info@sebastianmendel.de>
Signed-off-by: Sebastian Mendel <info@sebastianmendel.de>
github-actions[bot]
github-actions bot previously approved these changes Mar 11, 2026
Copy link
Copy Markdown

@github-actions github-actions bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Automated approval for solo maintainer project

All CI checks passed. See SECURITY.md for compensating controls.

Aligns the rate limiter's forwarded header handling with getClientIP
in auth_secure.go, which already checks both X-Forwarded-For and
X-Real-IP from trusted proxies.

Signed-off-by: Sebastian Mendel <info@sebastianmendel.de>
Copy link
Copy Markdown

@github-actions github-actions bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Automated approval for solo maintainer project

All CI checks passed. See SECURITY.md for compensating controls.

@CybotTM CybotTM added this pull request to the merge queue Mar 11, 2026
Merged via the queue into main with commit cbd9335 Mar 11, 2026
29 checks passed
@CybotTM CybotTM deleted the fix/security-stability-review branch March 11, 2026 17:54
@github-actions github-actions bot added the released:v0.21.2 Included in v0.21.2 release label Mar 14, 2026
@github-actions
Copy link
Copy Markdown

🚀 Released in v0.21.2

Thank you for your contribution! 🙏

This is now available in the latest release. Please test and verify everything works as expected in your environment.

If you encounter any issues, please open a new issue.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

released:v0.21.2 Included in v0.21.2 release

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants