mirror of
https://github.com/pomerium/pomerium.git
synced 2025-04-29 10:26:29 +02:00
* chore(deps): bump the go group across 1 directory with 44 updates Bumps the go group with 26 updates in the / directory: | Package | From | To | | --- | --- | --- | | [cloud.google.com/go/storage](https://github.com/googleapis/google-cloud-go) | `1.49.0` | `1.50.0` | | [github.com/aws/aws-sdk-go-v2](https://github.com/aws/aws-sdk-go-v2) | `1.32.7` | `1.36.3` | | [github.com/aws/aws-sdk-go-v2/config](https://github.com/aws/aws-sdk-go-v2) | `1.28.7` | `1.29.8` | | [github.com/aws/aws-sdk-go-v2/service/s3](https://github.com/aws/aws-sdk-go-v2) | `1.71.1` | `1.78.0` | | [github.com/bits-and-blooms/bitset](https://github.com/bits-and-blooms/bitset) | `1.20.0` | `1.21.0` | | [github.com/caddyserver/certmagic](https://github.com/caddyserver/certmagic) | `0.21.4` | `0.21.7` | | [github.com/cloudflare/circl](https://github.com/cloudflare/circl) | `1.5.0` | `1.6.0` | | [github.com/coreos/go-oidc/v3](https://github.com/coreos/go-oidc) | `3.11.0` | `3.12.0` | | [github.com/docker/docker](https://github.com/docker/docker) | `27.4.1+incompatible` | `28.0.1+incompatible` | | [github.com/envoyproxy/go-control-plane/envoy](https://github.com/envoyproxy/go-control-plane) | `1.32.3` | `1.32.4` | | [github.com/exaring/otelpgx](https://github.com/exaring/otelpgx) | `0.8.0` | `0.9.0` | | [github.com/go-chi/chi/v5](https://github.com/go-chi/chi) | `5.2.0` | `5.2.1` | | [github.com/google/go-cmp](https://github.com/google/go-cmp) | `0.6.0` | `0.7.0` | | [github.com/grpc-ecosystem/go-grpc-middleware/v2](https://github.com/grpc-ecosystem/go-grpc-middleware) | `2.2.0` | `2.3.0` | | [github.com/klauspost/compress](https://github.com/klauspost/compress) | `1.17.11` | `1.18.0` | | [github.com/minio/minio-go/v7](https://github.com/minio/minio-go) | `7.0.82` | `7.0.87` | | [github.com/open-policy-agent/opa](https://github.com/open-policy-agent/opa) | `1.0.0` | `1.2.0` | | [github.com/pomerium/envoy-custom](https://github.com/pomerium/envoy-custom) | `1.32.4-0.20250114182541-6f6d2147bea6` | `1.33.0` | | [github.com/quic-go/quic-go](https://github.com/quic-go/quic-go) | `0.48.2` | `0.50.0` | | [github.com/testcontainers/testcontainers-go](https://github.com/testcontainers/testcontainers-go) | `0.34.0` | `0.35.0` | | [go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc](https://github.com/open-telemetry/opentelemetry-go-contrib) | `0.57.0` | `0.59.0` | | [go.opentelemetry.io/contrib/propagators/autoprop](https://github.com/open-telemetry/opentelemetry-go-contrib) | `0.57.0` | `0.59.0` | | [go.opentelemetry.io/otel/bridge/opencensus](https://github.com/open-telemetry/opentelemetry-go) | `1.32.0` | `1.34.0` | | [go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc](https://github.com/open-telemetry/opentelemetry-go) | `1.32.0` | `1.34.0` | | [go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp](https://github.com/open-telemetry/opentelemetry-go) | `1.32.0` | `1.34.0` | | [google.golang.org/api](https://github.com/googleapis/google-api-go-client) | `0.214.0` | `0.223.0` | Updates `cloud.google.com/go/storage` from 1.49.0 to 1.50.0 - [Release notes](https://github.com/googleapis/google-cloud-go/releases) - [Changelog](https://github.com/googleapis/google-cloud-go/blob/main/CHANGES.md) - [Commits](https://github.com/googleapis/google-cloud-go/compare/spanner/v1.49.0...spanner/v1.50.0) Updates `github.com/aws/aws-sdk-go-v2` from 1.32.7 to 1.36.3 - [Release notes](https://github.com/aws/aws-sdk-go-v2/releases) - [Changelog](https://github.com/aws/aws-sdk-go-v2/blob/main/changelog-template.json) - [Commits](https://github.com/aws/aws-sdk-go-v2/compare/v1.32.7...v1.36.3) Updates `github.com/aws/aws-sdk-go-v2/config` from 1.28.7 to 1.29.8 - [Release notes](https://github.com/aws/aws-sdk-go-v2/releases) - [Changelog](https://github.com/aws/aws-sdk-go-v2/blob/main/changelog-template.json) - [Commits](https://github.com/aws/aws-sdk-go-v2/compare/config/v1.28.7...config/v1.29.8) Updates `github.com/aws/aws-sdk-go-v2/service/s3` from 1.71.1 to 1.78.0 - [Release notes](https://github.com/aws/aws-sdk-go-v2/releases) - [Changelog](https://github.com/aws/aws-sdk-go-v2/blob/main/changelog-template.json) - [Commits](https://github.com/aws/aws-sdk-go-v2/compare/service/s3/v1.71.1...service/s3/v1.78.0) Updates `github.com/bits-and-blooms/bitset` from 1.20.0 to 1.21.0 - [Release notes](https://github.com/bits-and-blooms/bitset/releases) - [Commits](https://github.com/bits-and-blooms/bitset/compare/v1.20.0...v1.21.0) Updates `github.com/caddyserver/certmagic` from 0.21.4 to 0.21.7 - [Release notes](https://github.com/caddyserver/certmagic/releases) - [Commits](https://github.com/caddyserver/certmagic/compare/v0.21.4...v0.21.7) Updates `github.com/cloudflare/circl` from 1.5.0 to 1.6.0 - [Release notes](https://github.com/cloudflare/circl/releases) - [Commits](https://github.com/cloudflare/circl/compare/v1.5.0...v1.6.0) Updates `github.com/coreos/go-oidc/v3` from 3.11.0 to 3.12.0 - [Release notes](https://github.com/coreos/go-oidc/releases) - [Commits](https://github.com/coreos/go-oidc/compare/v3.11.0...v3.12.0) Updates `github.com/docker/docker` from 27.4.1+incompatible to 28.0.1+incompatible - [Release notes](https://github.com/docker/docker/releases) - [Commits](https://github.com/docker/docker/compare/v27.4.1...v28.0.1) Updates `github.com/envoyproxy/go-control-plane/envoy` from 1.32.3 to 1.32.4 - [Release notes](https://github.com/envoyproxy/go-control-plane/releases) - [Changelog](https://github.com/envoyproxy/go-control-plane/blob/main/CHANGELOG.md) - [Commits](https://github.com/envoyproxy/go-control-plane/compare/envoy/v1.32.3...envoy/v1.32.4) Updates `github.com/envoyproxy/protoc-gen-validate` from 1.1.0 to 1.2.1 - [Release notes](https://github.com/envoyproxy/protoc-gen-validate/releases) - [Changelog](https://github.com/bufbuild/protoc-gen-validate/blob/main/.goreleaser.yaml) - [Commits](https://github.com/envoyproxy/protoc-gen-validate/compare/v1.1.0...v1.2.1) Updates `github.com/exaring/otelpgx` from 0.8.0 to 0.9.0 - [Release notes](https://github.com/exaring/otelpgx/releases) - [Commits](https://github.com/exaring/otelpgx/compare/v0.8.0...v0.9.0) Updates `github.com/go-chi/chi/v5` from 5.2.0 to 5.2.1 - [Release notes](https://github.com/go-chi/chi/releases) - [Changelog](https://github.com/go-chi/chi/blob/master/CHANGELOG.md) - [Commits](https://github.com/go-chi/chi/compare/v5.2.0...v5.2.1) Updates `github.com/google/go-cmp` from 0.6.0 to 0.7.0 - [Release notes](https://github.com/google/go-cmp/releases) - [Commits](https://github.com/google/go-cmp/compare/v0.6.0...v0.7.0) Updates `github.com/grpc-ecosystem/go-grpc-middleware/v2` from 2.2.0 to 2.3.0 - [Release notes](https://github.com/grpc-ecosystem/go-grpc-middleware/releases) - [Commits](https://github.com/grpc-ecosystem/go-grpc-middleware/compare/v2.2.0...v2.3.0) Updates `github.com/klauspost/compress` from 1.17.11 to 1.18.0 - [Release notes](https://github.com/klauspost/compress/releases) - [Changelog](https://github.com/klauspost/compress/blob/master/.goreleaser.yml) - [Commits](https://github.com/klauspost/compress/compare/v1.17.11...v1.18.0) Updates `github.com/minio/minio-go/v7` from 7.0.82 to 7.0.87 - [Release notes](https://github.com/minio/minio-go/releases) - [Commits](https://github.com/minio/minio-go/compare/v7.0.82...v7.0.87) Updates `github.com/open-policy-agent/opa` from 1.0.0 to 1.2.0 - [Release notes](https://github.com/open-policy-agent/opa/releases) - [Changelog](https://github.com/open-policy-agent/opa/blob/main/CHANGELOG.md) - [Commits](https://github.com/open-policy-agent/opa/compare/v1.0.0...v1.2.0) Updates `github.com/pomerium/envoy-custom` from 1.32.4-0.20250114182541-6f6d2147bea6 to 1.33.0 - [Release notes](https://github.com/pomerium/envoy-custom/releases) - [Commits](https://github.com/pomerium/envoy-custom/commits/v1.33.0) Updates `github.com/prometheus/client_golang` from 1.20.5 to 1.21.0 - [Release notes](https://github.com/prometheus/client_golang/releases) - [Changelog](https://github.com/prometheus/client_golang/blob/main/CHANGELOG.md) - [Commits](https://github.com/prometheus/client_golang/compare/v1.20.5...v1.21.0) Updates `github.com/prometheus/common` from 0.61.0 to 0.62.0 - [Release notes](https://github.com/prometheus/common/releases) - [Changelog](https://github.com/prometheus/common/blob/main/RELEASE.md) - [Commits](https://github.com/prometheus/common/compare/v0.61.0...v0.62.0) Updates `github.com/quic-go/quic-go` from 0.48.2 to 0.50.0 - [Release notes](https://github.com/quic-go/quic-go/releases) - [Changelog](https://github.com/quic-go/quic-go/blob/master/Changelog.md) - [Commits](https://github.com/quic-go/quic-go/compare/v0.48.2...v0.50.0) Updates `github.com/spf13/cobra` from 1.8.1 to 1.9.1 - [Release notes](https://github.com/spf13/cobra/releases) - [Commits](https://github.com/spf13/cobra/compare/v1.8.1...v1.9.1) Updates `github.com/testcontainers/testcontainers-go` from 0.34.0 to 0.35.0 - [Release notes](https://github.com/testcontainers/testcontainers-go/releases) - [Commits](https://github.com/testcontainers/testcontainers-go/compare/v0.34.0...v0.35.0) Updates `go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc` from 0.57.0 to 0.59.0 - [Release notes](https://github.com/open-telemetry/opentelemetry-go-contrib/releases) - [Changelog](https://github.com/open-telemetry/opentelemetry-go-contrib/blob/main/CHANGELOG.md) - [Commits](https://github.com/open-telemetry/opentelemetry-go-contrib/compare/zpages/v0.57.0...zpages/v0.59.0) Updates `go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp` from 0.58.0 to 0.59.0 - [Release notes](https://github.com/open-telemetry/opentelemetry-go-contrib/releases) - [Changelog](https://github.com/open-telemetry/opentelemetry-go-contrib/blob/main/CHANGELOG.md) - [Commits](https://github.com/open-telemetry/opentelemetry-go-contrib/compare/zpages/v0.58.0...zpages/v0.59.0) Updates `go.opentelemetry.io/contrib/propagators/autoprop` from 0.57.0 to 0.59.0 - [Release notes](https://github.com/open-telemetry/opentelemetry-go-contrib/releases) - [Changelog](https://github.com/open-telemetry/opentelemetry-go-contrib/blob/main/CHANGELOG.md) - [Commits](https://github.com/open-telemetry/opentelemetry-go-contrib/compare/zpages/v0.57.0...zpages/v0.59.0) Updates `go.opentelemetry.io/otel/bridge/opencensus` from 1.32.0 to 1.34.0 - [Release notes](https://github.com/open-telemetry/opentelemetry-go/releases) - [Changelog](https://github.com/open-telemetry/opentelemetry-go/blob/main/CHANGELOG.md) - [Commits](https://github.com/open-telemetry/opentelemetry-go/compare/v1.32.0...v1.34.0) Updates `go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc` from 1.32.0 to 1.34.0 - [Release notes](https://github.com/open-telemetry/opentelemetry-go/releases) - [Changelog](https://github.com/open-telemetry/opentelemetry-go/blob/main/CHANGELOG.md) - [Commits](https://github.com/open-telemetry/opentelemetry-go/compare/v1.32.0...v1.34.0) Updates `go.opentelemetry.io/otel/exporters/otlp/otlptrace` from 1.33.0 to 1.34.0 - [Release notes](https://github.com/open-telemetry/opentelemetry-go/releases) - [Changelog](https://github.com/open-telemetry/opentelemetry-go/blob/main/CHANGELOG.md) - [Commits](https://github.com/open-telemetry/opentelemetry-go/compare/v1.33.0...v1.34.0) Updates `go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc` from 1.33.0 to 1.34.0 - [Release notes](https://github.com/open-telemetry/opentelemetry-go/releases) - [Changelog](https://github.com/open-telemetry/opentelemetry-go/blob/main/CHANGELOG.md) - [Commits](https://github.com/open-telemetry/opentelemetry-go/compare/v1.33.0...v1.34.0) Updates `go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp` from 1.32.0 to 1.34.0 - [Release notes](https://github.com/open-telemetry/opentelemetry-go/releases) - [Changelog](https://github.com/open-telemetry/opentelemetry-go/blob/main/CHANGELOG.md) - [Commits](https://github.com/open-telemetry/opentelemetry-go/compare/v1.32.0...v1.34.0) Updates `go.opentelemetry.io/otel/sdk` from 1.33.0 to 1.34.0 - [Release notes](https://github.com/open-telemetry/opentelemetry-go/releases) - [Changelog](https://github.com/open-telemetry/opentelemetry-go/blob/main/CHANGELOG.md) - [Commits](https://github.com/open-telemetry/opentelemetry-go/compare/v1.33.0...v1.34.0) Updates `go.opentelemetry.io/otel/sdk/metric` from 1.32.0 to 1.34.0 - [Release notes](https://github.com/open-telemetry/opentelemetry-go/releases) - [Changelog](https://github.com/open-telemetry/opentelemetry-go/blob/main/CHANGELOG.md) - [Commits](https://github.com/open-telemetry/opentelemetry-go/compare/v1.32.0...v1.34.0) Updates `go.opentelemetry.io/proto/otlp` from 1.4.0 to 1.5.0 - [Release notes](https://github.com/open-telemetry/opentelemetry-proto-go/releases) - [Commits](https://github.com/open-telemetry/opentelemetry-proto-go/compare/v1.4.0...v1.5.0) Updates `golang.org/x/crypto` from 0.32.0 to 0.33.0 - [Commits](https://github.com/golang/crypto/compare/v0.32.0...v0.33.0) Updates `golang.org/x/net` from 0.33.0 to 0.35.0 - [Commits](https://github.com/golang/net/compare/v0.33.0...v0.35.0) Updates `golang.org/x/sync` from 0.10.0 to 0.11.0 - [Commits](https://github.com/golang/sync/compare/v0.10.0...v0.11.0) Updates `golang.org/x/sys` from 0.29.0 to 0.30.0 - [Commits](https://github.com/golang/sys/compare/v0.29.0...v0.30.0) Updates `golang.org/x/time` from 0.8.0 to 0.10.0 - [Commits](https://github.com/golang/time/compare/v0.8.0...v0.10.0) Updates `google.golang.org/api` from 0.214.0 to 0.223.0 - [Release notes](https://github.com/googleapis/google-api-go-client/releases) - [Changelog](https://github.com/googleapis/google-api-go-client/blob/main/CHANGES.md) - [Commits](https://github.com/googleapis/google-api-go-client/compare/v0.214.0...v0.223.0) Updates `google.golang.org/genproto/googleapis/rpc` from 0.0.0-20241209162323-e6fa225c2576 to 0.0.0-20250219182151-9fdb1cabc7b2 - [Commits](https://github.com/googleapis/go-genproto/commits) Updates `google.golang.org/grpc` from 1.69.2 to 1.70.0 - [Release notes](https://github.com/grpc/grpc-go/releases) - [Commits](https://github.com/grpc/grpc-go/compare/v1.69.2...v1.70.0) Updates `google.golang.org/protobuf` from 1.36.2 to 1.36.5 --- updated-dependencies: - dependency-name: cloud.google.com/go/storage dependency-type: direct:production update-type: version-update:semver-minor dependency-group: go - dependency-name: github.com/aws/aws-sdk-go-v2 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: go - dependency-name: github.com/aws/aws-sdk-go-v2/config dependency-type: direct:production update-type: version-update:semver-minor dependency-group: go - dependency-name: github.com/aws/aws-sdk-go-v2/service/s3 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: go - dependency-name: github.com/bits-and-blooms/bitset dependency-type: direct:production update-type: version-update:semver-minor dependency-group: go - dependency-name: github.com/caddyserver/certmagic dependency-type: direct:production update-type: version-update:semver-patch dependency-group: go - dependency-name: github.com/cloudflare/circl dependency-type: direct:production update-type: version-update:semver-minor dependency-group: go - dependency-name: github.com/coreos/go-oidc/v3 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: go - dependency-name: github.com/docker/docker dependency-type: direct:production update-type: version-update:semver-major dependency-group: go - dependency-name: github.com/envoyproxy/go-control-plane/envoy dependency-type: direct:production update-type: version-update:semver-patch dependency-group: go - dependency-name: github.com/envoyproxy/protoc-gen-validate dependency-type: direct:production update-type: version-update:semver-minor dependency-group: go - dependency-name: github.com/exaring/otelpgx dependency-type: direct:production update-type: version-update:semver-minor dependency-group: go - dependency-name: github.com/go-chi/chi/v5 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: go - dependency-name: github.com/google/go-cmp dependency-type: direct:production update-type: version-update:semver-minor dependency-group: go - dependency-name: github.com/grpc-ecosystem/go-grpc-middleware/v2 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: go - dependency-name: github.com/klauspost/compress dependency-type: direct:production update-type: version-update:semver-minor dependency-group: go - dependency-name: github.com/minio/minio-go/v7 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: go - dependency-name: github.com/open-policy-agent/opa dependency-type: direct:production update-type: version-update:semver-minor dependency-group: go - dependency-name: github.com/pomerium/envoy-custom dependency-type: direct:production update-type: version-update:semver-minor dependency-group: go - dependency-name: github.com/prometheus/client_golang dependency-type: direct:production update-type: version-update:semver-minor dependency-group: go - dependency-name: github.com/prometheus/common dependency-type: direct:production update-type: version-update:semver-minor dependency-group: go - dependency-name: github.com/quic-go/quic-go dependency-type: direct:production update-type: version-update:semver-minor dependency-group: go - dependency-name: github.com/spf13/cobra dependency-type: direct:production update-type: version-update:semver-minor dependency-group: go - dependency-name: github.com/testcontainers/testcontainers-go dependency-type: direct:production update-type: version-update:semver-minor dependency-group: go - dependency-name: go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc dependency-type: direct:production update-type: version-update:semver-minor dependency-group: go - dependency-name: go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp dependency-type: direct:production update-type: version-update:semver-minor dependency-group: go - dependency-name: go.opentelemetry.io/contrib/propagators/autoprop dependency-type: direct:production update-type: version-update:semver-minor dependency-group: go - dependency-name: go.opentelemetry.io/otel/bridge/opencensus dependency-type: direct:production update-type: version-update:semver-minor dependency-group: go - dependency-name: go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc dependency-type: direct:production update-type: version-update:semver-minor dependency-group: go - dependency-name: go.opentelemetry.io/otel/exporters/otlp/otlptrace dependency-type: direct:production update-type: version-update:semver-minor dependency-group: go - dependency-name: go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc dependency-type: direct:production update-type: version-update:semver-minor dependency-group: go - dependency-name: go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp dependency-type: direct:production update-type: version-update:semver-minor dependency-group: go - dependency-name: go.opentelemetry.io/otel/sdk dependency-type: direct:production update-type: version-update:semver-minor dependency-group: go - dependency-name: go.opentelemetry.io/otel/sdk/metric dependency-type: direct:production update-type: version-update:semver-minor dependency-group: go - dependency-name: go.opentelemetry.io/proto/otlp dependency-type: direct:production update-type: version-update:semver-minor dependency-group: go - dependency-name: golang.org/x/crypto dependency-type: direct:production update-type: version-update:semver-minor dependency-group: go - dependency-name: golang.org/x/net dependency-type: direct:production update-type: version-update:semver-minor dependency-group: go - dependency-name: golang.org/x/sync dependency-type: direct:production update-type: version-update:semver-minor dependency-group: go - dependency-name: golang.org/x/sys dependency-type: direct:production update-type: version-update:semver-minor dependency-group: go - dependency-name: golang.org/x/time dependency-type: direct:production update-type: version-update:semver-minor dependency-group: go - dependency-name: google.golang.org/api dependency-type: direct:production update-type: version-update:semver-minor dependency-group: go - dependency-name: google.golang.org/genproto/googleapis/rpc dependency-type: direct:production update-type: version-update:semver-patch dependency-group: go - dependency-name: google.golang.org/grpc dependency-type: direct:production update-type: version-update:semver-minor dependency-group: go - dependency-name: google.golang.org/protobuf dependency-type: direct:production update-type: version-update:semver-patch dependency-group: go ... Signed-off-by: dependabot[bot] <support@github.com> * fix go.mod * bump acmez * bump docker build * bump docker build --------- Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Denis Mishin <dmishin@pomerium.com>
652 lines
18 KiB
Go
652 lines
18 KiB
Go
package autocert
|
|
|
|
import (
|
|
"bytes"
|
|
"context"
|
|
"crypto/ecdsa"
|
|
"crypto/elliptic"
|
|
"crypto/rand"
|
|
"crypto/x509"
|
|
"crypto/x509/pkix"
|
|
"encoding/base64"
|
|
"encoding/json"
|
|
"encoding/pem"
|
|
"fmt"
|
|
"io"
|
|
"math/big"
|
|
"net"
|
|
"net/http"
|
|
"net/http/httptest"
|
|
"os"
|
|
"path/filepath"
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/caddyserver/certmagic"
|
|
"github.com/go-chi/chi/v5"
|
|
"github.com/go-chi/chi/v5/middleware"
|
|
"github.com/google/go-cmp/cmp"
|
|
"github.com/google/go-cmp/cmp/cmpopts"
|
|
"github.com/google/uuid"
|
|
"github.com/mholt/acmez/v3/acme"
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
"golang.org/x/crypto/ocsp"
|
|
|
|
"github.com/pomerium/pomerium/config"
|
|
"github.com/pomerium/pomerium/internal/log"
|
|
)
|
|
|
|
type M = map[string]any
|
|
|
|
type testCA struct {
|
|
key *ecdsa.PrivateKey
|
|
cert *x509.Certificate
|
|
certPEM []byte
|
|
}
|
|
|
|
func newTestCA() (*testCA, error) {
|
|
key, err := ecdsa.GenerateKey(elliptic.P256(), rand.Reader)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
tpl := &x509.Certificate{
|
|
SerialNumber: big.NewInt(time.Now().Unix()),
|
|
Subject: pkix.Name{
|
|
CommonName: "Test CA",
|
|
},
|
|
NotBefore: time.Now(),
|
|
NotAfter: time.Now().Add(time.Minute * 10),
|
|
|
|
KeyUsage: x509.KeyUsageCertSign | x509.KeyUsageDigitalSignature,
|
|
BasicConstraintsValid: true,
|
|
IsCA: true,
|
|
}
|
|
|
|
der, err := x509.CreateCertificate(rand.Reader, tpl, tpl, &key.PublicKey, key)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
cert, err := x509.ParseCertificate(der)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return &testCA{
|
|
key,
|
|
cert,
|
|
pem.EncodeToMemory(&pem.Block{Type: "CERTIFICATE", Bytes: der}),
|
|
}, nil
|
|
}
|
|
|
|
func newMockACME(ca *testCA, srv *httptest.Server) http.Handler {
|
|
var certBuffer bytes.Buffer
|
|
|
|
var certs []*x509.Certificate
|
|
findCert := func(serial *big.Int) *x509.Certificate {
|
|
for _, c := range certs {
|
|
if c.SerialNumber.Cmp(serial) == 0 {
|
|
return c
|
|
}
|
|
}
|
|
return nil
|
|
}
|
|
|
|
r := chi.NewRouter()
|
|
r.Use(middleware.Logger)
|
|
r.Get("/acme/directory", func(w http.ResponseWriter, _ *http.Request) {
|
|
w.Header().Set("Content-Type", "application/json")
|
|
_ = json.NewEncoder(w).Encode(M{
|
|
"keyChange": srv.URL + "/acme/key-change",
|
|
"newAccount": srv.URL + "/acme/new-acct",
|
|
"newNonce": srv.URL + "/acme/new-nonce",
|
|
"newOrder": srv.URL + "/acme/new-order",
|
|
"revokeCert": srv.URL + "/acme/revoke-cert",
|
|
})
|
|
})
|
|
r.Head("/acme/new-nonce", func(w http.ResponseWriter, _ *http.Request) {
|
|
w.Header().Set("Replay-Nonce", "NONCE")
|
|
w.WriteHeader(http.StatusOK)
|
|
})
|
|
r.Post("/acme/new-acct", func(w http.ResponseWriter, _ *http.Request) {
|
|
w.Header().Set("Replay-Nonce", "NONCE")
|
|
w.Header().Set("Content-Type", "application/json")
|
|
w.WriteHeader(http.StatusCreated)
|
|
_ = json.NewEncoder(w).Encode(M{
|
|
"status": "valid",
|
|
})
|
|
})
|
|
r.Post("/acme/new-order", func(w http.ResponseWriter, r *http.Request) {
|
|
var payload struct {
|
|
Identifiers []struct {
|
|
Type string `json:"type"`
|
|
Value string `json:"value"`
|
|
} `json:"identifiers"`
|
|
}
|
|
readJWSPayload(r.Body, &payload)
|
|
w.Header().Set("Replay-Nonce", "NONCE")
|
|
w.Header().Set("Content-Type", "application/json")
|
|
w.WriteHeader(http.StatusCreated)
|
|
_ = json.NewEncoder(w).Encode(M{
|
|
"status": "pending",
|
|
"finalize": srv.URL + "/acme/finalize",
|
|
})
|
|
})
|
|
r.Post("/ocsp/request", func(w http.ResponseWriter, r *http.Request) {
|
|
reqData, _ := io.ReadAll(r.Body)
|
|
ocspReq, _ := ocsp.ParseRequest(reqData)
|
|
ocspResp := ocsp.Response{
|
|
Status: ocsp.Good,
|
|
SerialNumber: ocspReq.SerialNumber,
|
|
ThisUpdate: time.Now(),
|
|
NextUpdate: time.Now().Add(time.Second),
|
|
}
|
|
|
|
cert := findCert(ocspReq.SerialNumber)
|
|
data, _ := ocsp.CreateResponse(ca.cert, cert, ocspResp, ca.key)
|
|
|
|
w.WriteHeader(http.StatusOK)
|
|
_, _ = w.Write(data)
|
|
})
|
|
r.Post("/acme/finalize", func(w http.ResponseWriter, r *http.Request) {
|
|
var payload struct {
|
|
CSR string `json:"csr"`
|
|
}
|
|
readJWSPayload(r.Body, &payload)
|
|
bs, _ := base64.RawURLEncoding.DecodeString(payload.CSR)
|
|
csr, _ := x509.ParseCertificateRequest(bs)
|
|
tpl := &x509.Certificate{
|
|
SerialNumber: big.NewInt(time.Now().Unix()),
|
|
DNSNames: csr.DNSNames,
|
|
IPAddresses: csr.IPAddresses,
|
|
Subject: pkix.Name{
|
|
CommonName: csr.DNSNames[0],
|
|
},
|
|
NotBefore: time.Now(),
|
|
NotAfter: time.Now().Add(time.Second * 2),
|
|
|
|
KeyUsage: x509.KeyUsageDigitalSignature | x509.KeyUsageKeyEncipherment,
|
|
ExtKeyUsage: []x509.ExtKeyUsage{x509.ExtKeyUsageServerAuth, x509.ExtKeyUsageClientAuth},
|
|
BasicConstraintsValid: true,
|
|
IsCA: false,
|
|
|
|
IssuingCertificateURL: []string{srv.URL + "/certs/ca"},
|
|
OCSPServer: []string{srv.URL + "/ocsp/request"},
|
|
}
|
|
der, _ := x509.CreateCertificate(rand.Reader, tpl, ca.cert, csr.PublicKey, ca.key)
|
|
certBuffer.Reset()
|
|
_ = pem.Encode(&certBuffer, &pem.Block{Type: "CERTIFICATE", Bytes: der})
|
|
cert, _ := x509.ParseCertificate(der)
|
|
certs = append(certs, cert)
|
|
|
|
w.Header().Set("Replay-Nonce", "NONCE")
|
|
w.Header().Set("Content-Type", "application/json")
|
|
w.WriteHeader(http.StatusCreated)
|
|
_ = json.NewEncoder(w).Encode(M{
|
|
"status": "valid",
|
|
"finalize": srv.URL + "/acme/finalize",
|
|
"certificate": srv.URL + "/acme/certificate",
|
|
})
|
|
})
|
|
r.Post("/acme/certificate", func(w http.ResponseWriter, _ *http.Request) {
|
|
w.Header().Set("Replay-Nonce", "NONCE")
|
|
w.Header().Set("Content-Type", "application/pem-certificate-chain")
|
|
w.WriteHeader(http.StatusOK)
|
|
_, _ = w.Write(certBuffer.Bytes())
|
|
})
|
|
r.Get("/certs/ca", func(w http.ResponseWriter, _ *http.Request) {
|
|
w.Header().Set("Content-Type", "application/pkix-cert")
|
|
w.WriteHeader(http.StatusOK)
|
|
_, _ = w.Write(ca.cert.Raw)
|
|
})
|
|
return r
|
|
}
|
|
|
|
func TestConfig(t *testing.T) {
|
|
ctx, cancel := context.WithCancel(context.Background())
|
|
defer cancel()
|
|
|
|
var mockACME http.Handler
|
|
srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
mockACME.ServeHTTP(w, r)
|
|
}))
|
|
defer srv.Close()
|
|
|
|
ca, err := newTestCA()
|
|
require.NoError(t, err)
|
|
|
|
mockACME = newMockACME(ca, srv)
|
|
|
|
// avoid using t.TempDir so tests don't fail: https://github.com/pomerium/pomerium/issues/4757
|
|
tmpdir := filepath.Join(os.TempDir(), uuid.New().String())
|
|
_ = os.MkdirAll(tmpdir, 0o755)
|
|
defer os.RemoveAll(tmpdir)
|
|
|
|
li, err := net.Listen("tcp", "127.0.0.1:0")
|
|
require.NoError(t, err)
|
|
addr := li.Addr().String()
|
|
_ = li.Close()
|
|
|
|
to, err := config.ParseWeightedUrls("http://to.example.com")
|
|
require.NoError(t, err)
|
|
|
|
p1 := config.Policy{
|
|
From: "http://from.example.com", To: to,
|
|
}
|
|
_ = p1.Validate()
|
|
|
|
mgr, err := newManager(ctx, config.NewStaticSource(&config.Config{
|
|
Options: &config.Options{
|
|
AutocertOptions: config.AutocertOptions{
|
|
Enable: true,
|
|
UseStaging: true,
|
|
Email: "pomerium-test@example.com",
|
|
MustStaple: true,
|
|
Folder: tmpdir,
|
|
},
|
|
HTTPRedirectAddr: addr,
|
|
Policies: []config.Policy{p1},
|
|
},
|
|
}), certmagic.ACMEIssuer{
|
|
CA: srv.URL + "/acme/directory",
|
|
TestCA: srv.URL + "/acme/directory",
|
|
}, time.Millisecond*100)
|
|
if !assert.NoError(t, err) {
|
|
return
|
|
}
|
|
|
|
domainRenewed := make(chan bool)
|
|
ocspUpdated := make(chan bool)
|
|
|
|
var initialOCSPStaple []byte
|
|
var certValidTime *time.Time
|
|
mgr.OnConfigChange(ctx, func(ctx context.Context, cfg *config.Config) {
|
|
if len(cfg.AutoCertificates) == 0 {
|
|
return
|
|
}
|
|
|
|
cert := cfg.AutoCertificates[0]
|
|
if initialOCSPStaple == nil {
|
|
initialOCSPStaple = cert.OCSPStaple
|
|
} else {
|
|
if !bytes.Equal(initialOCSPStaple, cert.OCSPStaple) {
|
|
log.Ctx(ctx).Info().Msg("OCSP updated")
|
|
ocspUpdated <- true
|
|
}
|
|
}
|
|
if certValidTime == nil {
|
|
certValidTime = &cert.Leaf.NotAfter
|
|
} else {
|
|
if !certValidTime.Equal(cert.Leaf.NotAfter) {
|
|
log.Ctx(ctx).Info().Msg("domain renewed")
|
|
domainRenewed <- true
|
|
}
|
|
}
|
|
})
|
|
|
|
domainRenewedOK := false
|
|
ocspUpdatedOK := false
|
|
|
|
for !domainRenewedOK || !ocspUpdatedOK {
|
|
select {
|
|
case <-time.After(time.Second * 10):
|
|
t.Error("timeout waiting for certs renewal")
|
|
return
|
|
case domainRenewedOK = <-domainRenewed:
|
|
case ocspUpdatedOK = <-ocspUpdated:
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestRedirect(t *testing.T) {
|
|
li, err := net.Listen("tcp", "127.0.0.1:0")
|
|
if !assert.NoError(t, err) {
|
|
return
|
|
}
|
|
addr := li.Addr().String()
|
|
_ = li.Close()
|
|
|
|
src := config.NewStaticSource(&config.Config{
|
|
Options: &config.Options{
|
|
HTTPRedirectAddr: addr,
|
|
SetResponseHeaders: map[string]string{
|
|
"X-Frame-Options": "SAMEORIGIN",
|
|
"X-XSS-Protection": "1; mode=block",
|
|
"Strict-Transport-Security": "max-age=31536000; includeSubDomains; preload",
|
|
},
|
|
},
|
|
})
|
|
_, err = New(context.Background(), src)
|
|
if !assert.NoError(t, err) {
|
|
return
|
|
}
|
|
err = waitFor(addr)
|
|
if !assert.NoError(t, err) {
|
|
return
|
|
}
|
|
|
|
client := &http.Client{
|
|
CheckRedirect: func(_ *http.Request, _ []*http.Request) error {
|
|
return http.ErrUseLastResponse
|
|
},
|
|
}
|
|
|
|
res, err := client.Get(fmt.Sprintf("http://%s", addr))
|
|
if !assert.NoError(t, err) {
|
|
return
|
|
}
|
|
defer res.Body.Close()
|
|
|
|
assert.Equal(t, http.StatusMovedPermanently, res.StatusCode, "should redirect to https")
|
|
for k, v := range src.GetConfig().Options.SetResponseHeaders {
|
|
assert.NotEqual(t, v, res.Header.Get(k), "should ignore options header")
|
|
}
|
|
}
|
|
|
|
func waitFor(addr string) error {
|
|
var err error
|
|
deadline := time.Now().Add(time.Second * 30)
|
|
for time.Now().Before(deadline) {
|
|
var conn net.Conn
|
|
conn, err = net.Dial("tcp", addr)
|
|
if err == nil {
|
|
conn.Close()
|
|
return nil
|
|
}
|
|
time.Sleep(time.Second)
|
|
}
|
|
return err
|
|
}
|
|
|
|
func readJWSPayload(r io.Reader, dst any) {
|
|
var req struct {
|
|
Protected string `json:"protected"`
|
|
Payload string `json:"payload"`
|
|
Signature string `json:"signature"`
|
|
}
|
|
_ = json.NewDecoder(r).Decode(&req)
|
|
|
|
bs, _ := base64.RawURLEncoding.DecodeString(req.Payload)
|
|
_ = json.Unmarshal(bs, dst)
|
|
}
|
|
|
|
func newACMEIssuer() *certmagic.ACMEIssuer {
|
|
return &certmagic.ACMEIssuer{
|
|
CA: certmagic.DefaultACME.CA,
|
|
TestCA: certmagic.DefaultACME.TestCA,
|
|
}
|
|
}
|
|
|
|
func Test_configureCertificateAuthority(t *testing.T) {
|
|
type args struct {
|
|
acmeMgr *certmagic.ACMEIssuer
|
|
opts config.AutocertOptions
|
|
}
|
|
type test struct {
|
|
args args
|
|
expected *certmagic.ACMEIssuer
|
|
wantErr bool
|
|
}
|
|
tests := map[string]func(t *testing.T) test{
|
|
"ok/default": func(_ *testing.T) test {
|
|
return test{
|
|
args: args{
|
|
acmeMgr: newACMEIssuer(),
|
|
opts: config.AutocertOptions{},
|
|
},
|
|
expected: &certmagic.ACMEIssuer{
|
|
Agreed: true,
|
|
CA: certmagic.DefaultACME.CA,
|
|
Email: " ",
|
|
TestCA: certmagic.DefaultACME.TestCA,
|
|
},
|
|
wantErr: false,
|
|
}
|
|
},
|
|
"ok/staging": func(_ *testing.T) test {
|
|
return test{
|
|
args: args{
|
|
acmeMgr: newACMEIssuer(),
|
|
opts: config.AutocertOptions{
|
|
UseStaging: true,
|
|
},
|
|
},
|
|
expected: &certmagic.ACMEIssuer{
|
|
Agreed: true,
|
|
CA: certmagic.DefaultACME.TestCA,
|
|
Email: " ",
|
|
TestCA: certmagic.DefaultACME.TestCA,
|
|
},
|
|
wantErr: false,
|
|
}
|
|
},
|
|
"ok/custom-ca-staging": func(_ *testing.T) test {
|
|
return test{
|
|
args: args{
|
|
acmeMgr: newACMEIssuer(),
|
|
opts: config.AutocertOptions{
|
|
CA: "test-ca.example.com/directory",
|
|
Email: "test@example.com",
|
|
UseStaging: true,
|
|
},
|
|
},
|
|
expected: &certmagic.ACMEIssuer{
|
|
Agreed: true,
|
|
CA: "test-ca.example.com/directory",
|
|
Email: "test@example.com",
|
|
TestCA: certmagic.DefaultACME.TestCA,
|
|
},
|
|
wantErr: false,
|
|
}
|
|
},
|
|
}
|
|
for name, run := range tests {
|
|
tc := run(t)
|
|
t.Run(name, func(t *testing.T) {
|
|
if err := configureCertificateAuthority(tc.args.acmeMgr, tc.args.opts); (err != nil) != tc.wantErr {
|
|
t.Errorf("configureCertificateAuthority() error = %v, wantErr %v", err, tc.wantErr)
|
|
}
|
|
if !cmp.Equal(tc.expected, tc.args.acmeMgr, cmpopts.IgnoreUnexported(certmagic.ACMEIssuer{})) {
|
|
t.Errorf("configureCertificateAuthority() diff = %s", cmp.Diff(tc.expected, tc.args.acmeMgr, cmpopts.IgnoreUnexported(certmagic.ACMEIssuer{})))
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
func Test_configureExternalAccountBinding(t *testing.T) {
|
|
type args struct {
|
|
acmeMgr *certmagic.ACMEIssuer
|
|
opts config.AutocertOptions
|
|
}
|
|
type test struct {
|
|
args args
|
|
expected *certmagic.ACMEIssuer
|
|
wantErr bool
|
|
}
|
|
tests := map[string]func(t *testing.T) test{
|
|
"ok": func(_ *testing.T) test {
|
|
return test{
|
|
args: args{
|
|
acmeMgr: newACMEIssuer(),
|
|
opts: config.AutocertOptions{
|
|
EABKeyID: "keyID",
|
|
EABMACKey: "29D7t6-mOuEV5vvBRX0UYF5T7x6fomidhM1kMJco-yw",
|
|
},
|
|
},
|
|
expected: &certmagic.ACMEIssuer{
|
|
CA: certmagic.DefaultACME.CA,
|
|
TestCA: certmagic.DefaultACME.TestCA,
|
|
ExternalAccount: &acme.EAB{
|
|
KeyID: "keyID",
|
|
MACKey: "29D7t6-mOuEV5vvBRX0UYF5T7x6fomidhM1kMJco-yw",
|
|
},
|
|
},
|
|
wantErr: false,
|
|
}
|
|
},
|
|
"fail/error-decoding-mac-key": func(_ *testing.T) test {
|
|
return test{
|
|
args: args{
|
|
acmeMgr: newACMEIssuer(),
|
|
opts: config.AutocertOptions{
|
|
EABKeyID: "keyID",
|
|
EABMACKey: ">invalid-base-64-data<",
|
|
},
|
|
},
|
|
wantErr: true,
|
|
}
|
|
},
|
|
}
|
|
|
|
for name, run := range tests {
|
|
tc := run(t)
|
|
t.Run(name, func(t *testing.T) {
|
|
err := configureExternalAccountBinding(tc.args.acmeMgr, tc.args.opts)
|
|
if (err != nil) != tc.wantErr {
|
|
t.Errorf("configureExternalAccountBinding() error = %v, wantErr %v", err, tc.wantErr)
|
|
}
|
|
if err == nil && !cmp.Equal(tc.expected, tc.args.acmeMgr, cmpopts.IgnoreUnexported(certmagic.ACMEIssuer{})) {
|
|
t.Errorf("configureCertificateAuthority() diff = %s", cmp.Diff(tc.expected, tc.args.acmeMgr, cmpopts.IgnoreUnexported(certmagic.ACMEIssuer{})))
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
func Test_configureTrustedRoots(t *testing.T) {
|
|
ca, err := newTestCA()
|
|
require.NoError(t, err)
|
|
type args struct {
|
|
acmeMgr *certmagic.ACMEIssuer
|
|
opts config.AutocertOptions
|
|
}
|
|
type test struct {
|
|
args args
|
|
expected *certmagic.ACMEIssuer
|
|
wantErr bool
|
|
cleanup func()
|
|
}
|
|
tests := map[string]func(t *testing.T) test{
|
|
"ok/pem": func(t *testing.T) test {
|
|
roots, err := x509.SystemCertPool()
|
|
require.NoError(t, err)
|
|
ok := roots.AppendCertsFromPEM(ca.certPEM)
|
|
require.Equal(t, true, ok)
|
|
return test{
|
|
args: args{
|
|
acmeMgr: newACMEIssuer(),
|
|
opts: config.AutocertOptions{
|
|
TrustedCA: base64.StdEncoding.EncodeToString(ca.certPEM),
|
|
},
|
|
},
|
|
expected: &certmagic.ACMEIssuer{
|
|
CA: certmagic.DefaultACME.CA,
|
|
TestCA: certmagic.DefaultACME.TestCA,
|
|
TrustedRoots: roots,
|
|
},
|
|
wantErr: false,
|
|
}
|
|
},
|
|
"ok/file": func(t *testing.T) test {
|
|
roots, err := x509.SystemCertPool()
|
|
require.NoError(t, err)
|
|
ok := roots.AppendCertsFromPEM(ca.certPEM)
|
|
require.Equal(t, true, ok)
|
|
f, err := os.CreateTemp("", "pomerium-test-ca")
|
|
require.NoError(t, err)
|
|
n, err := f.Write(ca.certPEM)
|
|
require.NoError(t, err)
|
|
require.Equal(t, len(ca.certPEM), n)
|
|
return test{
|
|
args: args{
|
|
acmeMgr: newACMEIssuer(),
|
|
opts: config.AutocertOptions{
|
|
TrustedCAFile: f.Name(),
|
|
},
|
|
},
|
|
expected: &certmagic.ACMEIssuer{
|
|
CA: certmagic.DefaultACME.CA,
|
|
TestCA: certmagic.DefaultACME.TestCA,
|
|
TrustedRoots: roots,
|
|
},
|
|
wantErr: false,
|
|
cleanup: func() {
|
|
os.Remove(f.Name())
|
|
},
|
|
}
|
|
},
|
|
"fail/pem": func(t *testing.T) test {
|
|
roots, err := x509.SystemCertPool()
|
|
require.NoError(t, err)
|
|
return test{
|
|
args: args{
|
|
acmeMgr: newACMEIssuer(),
|
|
opts: config.AutocertOptions{
|
|
TrustedCA: ">invalid-base-64-ca-pem<",
|
|
},
|
|
},
|
|
expected: &certmagic.ACMEIssuer{
|
|
CA: certmagic.DefaultACME.CA,
|
|
TestCA: certmagic.DefaultACME.TestCA,
|
|
TrustedRoots: roots,
|
|
},
|
|
wantErr: true,
|
|
}
|
|
},
|
|
"fail/file": func(t *testing.T) test {
|
|
roots, err := x509.SystemCertPool()
|
|
require.NoError(t, err)
|
|
return test{
|
|
args: args{
|
|
acmeMgr: newACMEIssuer(),
|
|
opts: config.AutocertOptions{
|
|
TrustedCAFile: "some-non-existing-file",
|
|
},
|
|
},
|
|
expected: &certmagic.ACMEIssuer{
|
|
CA: certmagic.DefaultACME.CA,
|
|
TestCA: certmagic.DefaultACME.TestCA,
|
|
TrustedRoots: roots,
|
|
},
|
|
wantErr: true,
|
|
}
|
|
},
|
|
}
|
|
for name, run := range tests {
|
|
tc := run(t)
|
|
t.Run(name, func(t *testing.T) {
|
|
err := configureTrustedRoots(tc.args.acmeMgr, tc.args.opts)
|
|
if (err != nil) != tc.wantErr {
|
|
t.Errorf("configureTrustedRoots() error = %v, wantErr %v", err, tc.wantErr)
|
|
}
|
|
if err == nil && !cmp.Equal(tc.expected, tc.args.acmeMgr, cmpopts.IgnoreUnexported(certmagic.ACMEIssuer{}, x509.CertPool{})) {
|
|
t.Errorf("configureCertificateAuthority() diff = %s", cmp.Diff(tc.expected, tc.args.acmeMgr, cmpopts.IgnoreUnexported(certmagic.ACMEIssuer{}, x509.CertPool{})))
|
|
}
|
|
if err == nil && !cmp.Equal(tc.expected.TrustedRoots.Subjects(), tc.args.acmeMgr.TrustedRoots.Subjects()) {
|
|
t.Errorf("configureCertificateAuthority() subjects diff = %s", cmp.Diff(tc.expected.TrustedRoots.Subjects(), tc.args.acmeMgr.TrustedRoots.Subjects()))
|
|
}
|
|
if tc.cleanup != nil {
|
|
tc.cleanup()
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestShouldEnableHTTPChallenge(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
assert.False(t, shouldEnableHTTPChallenge(nil))
|
|
assert.False(t, shouldEnableHTTPChallenge(&config.Config{}))
|
|
assert.False(t, shouldEnableHTTPChallenge(&config.Config{Options: &config.Options{}}))
|
|
assert.False(t, shouldEnableHTTPChallenge(&config.Config{Options: &config.Options{
|
|
HTTPRedirectAddr: ":8080",
|
|
}}))
|
|
assert.False(t, shouldEnableHTTPChallenge(&config.Config{Options: &config.Options{
|
|
HTTPRedirectAddr: "127.0.0.1:8080",
|
|
}}))
|
|
assert.True(t, shouldEnableHTTPChallenge(&config.Config{Options: &config.Options{
|
|
HTTPRedirectAddr: ":80",
|
|
}}))
|
|
assert.True(t, shouldEnableHTTPChallenge(&config.Config{Options: &config.Options{
|
|
HTTPRedirectAddr: "127.0.0.1:80",
|
|
}}))
|
|
}
|