From 5effb1a89b8297c113dbf17c13a92c78225082d8 Mon Sep 17 00:00:00 2001 From: Joshua Casey Date: Tue, 29 Aug 2023 16:54:38 -0500 Subject: [PATCH 1/6] Bump to golang 1.21.0, and bump all golang deps --- Dockerfile | 2 +- go.mod | 24 +++++++++++------------ go.sum | 40 +++++++++++++++++++-------------------- hack/Dockerfile_fips | 2 +- hack/update-go-mod/go.mod | 2 +- 5 files changed, 35 insertions(+), 35 deletions(-) diff --git a/Dockerfile b/Dockerfile index e8d9ba12f..2e67e5546 100644 --- a/Dockerfile +++ b/Dockerfile @@ -3,7 +3,7 @@ # Copyright 2020-2023 the Pinniped contributors. All Rights Reserved. # SPDX-License-Identifier: Apache-2.0 -FROM golang:1.20.7 as build-env +FROM golang:1.21.0 as build-env WORKDIR /work COPY . . diff --git a/go.mod b/go.mod index dfd7f8fed..51ef4c912 100644 --- a/go.mod +++ b/go.mod @@ -1,13 +1,13 @@ module go.pinniped.dev -go 1.19 +go 1.20 // This version taken from https://github.com/kubernetes/apiserver/blob/v0.28.0/go.mod#L50 replace k8s.io/kube-openapi => k8s.io/kube-openapi v0.0.0-20230717233707-2695361300d9 require ( github.com/MakeNowJust/heredoc/v2 v2.0.1 - github.com/chromedp/cdproto v0.0.0-20230828023241-f357fd93b5d6 + github.com/chromedp/cdproto v0.0.0-20230901104747-bfe71bcbd1c0 github.com/chromedp/chromedp v0.9.2 github.com/coreos/go-oidc/v3 v3.6.0 github.com/coreos/go-semver v0.3.1 @@ -34,14 +34,14 @@ require ( github.com/spf13/cobra v1.7.0 github.com/spf13/pflag v1.0.5 github.com/stretchr/testify v1.8.4 - github.com/tdewolff/minify/v2 v2.12.8 + github.com/tdewolff/minify/v2 v2.12.9 go.uber.org/zap v1.25.0 - golang.org/x/crypto v0.12.0 - golang.org/x/net v0.14.0 - golang.org/x/oauth2 v0.11.0 + golang.org/x/crypto v0.13.0 + golang.org/x/net v0.15.0 + golang.org/x/oauth2 v0.12.0 golang.org/x/sync v0.3.0 - golang.org/x/term v0.11.0 - golang.org/x/text v0.12.0 + golang.org/x/term v0.12.0 + golang.org/x/text v0.13.0 gopkg.in/square/go-jose.v2 v2.6.0 k8s.io/api v0.28.1 k8s.io/apiextensions-apiserver v0.28.1 @@ -49,10 +49,10 @@ require ( k8s.io/apiserver v0.28.1 k8s.io/client-go v0.28.1 k8s.io/component-base v0.28.1 - k8s.io/gengo v0.0.0-20230825065918-3239622df7ae + k8s.io/gengo v0.0.0-20230829151522-9cce18d56c01 k8s.io/klog/v2 v2.100.1 k8s.io/kube-aggregator v0.28.1 - k8s.io/kube-openapi v0.0.0-20230816210353-14e408962443 + k8s.io/kube-openapi v0.0.0-20230905202853-d090da108d2f k8s.io/utils v0.0.0-20230726121419-3b25d923346b sigs.k8s.io/yaml v1.3.0 ) @@ -129,7 +129,7 @@ require ( github.com/spf13/jwalterweatherman v1.1.0 // indirect github.com/stoewer/go-strcase v1.2.0 // indirect github.com/subosito/gotenv v1.4.0 // indirect - github.com/tdewolff/parse/v2 v2.6.7 // indirect + github.com/tdewolff/parse/v2 v2.6.8 // indirect go.etcd.io/etcd/api/v3 v3.5.9 // indirect go.etcd.io/etcd/client/pkg/v3 v3.5.9 // indirect go.etcd.io/etcd/client/v3 v3.5.9 // indirect @@ -146,7 +146,7 @@ require ( go.uber.org/multierr v1.11.0 // indirect golang.org/x/exp v0.0.0-20220722155223-a9213eeb770e // indirect golang.org/x/mod v0.10.0 // indirect - golang.org/x/sys v0.11.0 // indirect + golang.org/x/sys v0.12.0 // indirect golang.org/x/time v0.3.0 // indirect golang.org/x/tools v0.8.0 // indirect google.golang.org/appengine v1.6.7 // indirect diff --git a/go.sum b/go.sum index 67b1e0514..d5faa888c 100644 --- a/go.sum +++ b/go.sum @@ -75,8 +75,8 @@ github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XL github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/chromedp/cdproto v0.0.0-20230802225258-3cf4e6d46a89/go.mod h1:GKljq0VrfU4D5yc+2qA6OVr8pmO/MBbPEWqWQ/oqGEs= -github.com/chromedp/cdproto v0.0.0-20230828023241-f357fd93b5d6 h1:lyUj4I0kT1UjLOHtAY1Pbx5rH9LfGFXhvY8oWmuIZ1w= -github.com/chromedp/cdproto v0.0.0-20230828023241-f357fd93b5d6/go.mod h1:GKljq0VrfU4D5yc+2qA6OVr8pmO/MBbPEWqWQ/oqGEs= +github.com/chromedp/cdproto v0.0.0-20230901104747-bfe71bcbd1c0 h1:hK7r7hm+LpvnJ2486YnQYFTBeh/knxvCfNfWrlTNcxY= +github.com/chromedp/cdproto v0.0.0-20230901104747-bfe71bcbd1c0/go.mod h1:GKljq0VrfU4D5yc+2qA6OVr8pmO/MBbPEWqWQ/oqGEs= github.com/chromedp/chromedp v0.9.2 h1:dKtNz4kApb06KuSXoTQIyUC2TrA0fhGDwNZf3bcgfKw= github.com/chromedp/chromedp v0.9.2/go.mod h1:LkSXJKONWTCHAfQasKFUZI+mxqS4tZqhmtGzzhLsnLs= github.com/chromedp/sysutil v1.0.0 h1:+ZxhTpfpZlmchB58ih/LBHX52ky7w2VhQVKQMucy3Ic= @@ -478,10 +478,10 @@ github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXl github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= github.com/subosito/gotenv v1.4.0 h1:yAzM1+SmVcz5R4tXGsNMu1jUl2aOJXoiWUCEwwnGrvs= github.com/subosito/gotenv v1.4.0/go.mod h1:mZd6rFysKEcUhUHXJk0C/08wAgyDBFuwEYL7vWWGaGo= -github.com/tdewolff/minify/v2 v2.12.8 h1:Q2BqOTmlMjoutkuD/OPCnJUpIqrzT3nRPkw+q+KpXS0= -github.com/tdewolff/minify/v2 v2.12.8/go.mod h1:YRgk7CC21LZnbuke2fmYnCTq+zhCgpb0yJACOTUNJ1E= -github.com/tdewolff/parse/v2 v2.6.7 h1:WrFllrqmzAcrKHzoYgMupqgUBIfBVOb0yscFzDf8bBg= -github.com/tdewolff/parse/v2 v2.6.7/go.mod h1:XHDhaU6IBgsryfdnpzUXBlT6leW/l25yrFBTEb4eIyM= +github.com/tdewolff/minify/v2 v2.12.9 h1:dvn5MtmuQ/DFMwqf5j8QhEVpPX6fi3WGImhv8RUB4zA= +github.com/tdewolff/minify/v2 v2.12.9/go.mod h1:qOqdlDfL+7v0/fyymB+OP497nIxJYSvX4MQWA8OoiXU= +github.com/tdewolff/parse/v2 v2.6.8 h1:mhNZXYCx//xG7Yq2e/kVLNZw4YfYmeHbhx+Zc0OvFMA= +github.com/tdewolff/parse/v2 v2.6.8/go.mod h1:XHDhaU6IBgsryfdnpzUXBlT6leW/l25yrFBTEb4eIyM= github.com/tdewolff/test v1.0.9 h1:SswqJCmeN4B+9gEAi/5uqT0qpi1y2/2O47V/1hhGZT0= github.com/tdewolff/test v1.0.9/go.mod h1:6DAvZliBAAnD7rhVgwaM7DE5/d9NMOAJ09SqYqeK4QE= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= @@ -559,8 +559,8 @@ golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= -golang.org/x/crypto v0.12.0 h1:tFM/ta59kqch6LlvYnPa0yx5a83cL2nHflFhYKvv9Yk= -golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= +golang.org/x/crypto v0.13.0 h1:mvySKfSWJ+UKUii46M40LOvyWfN0s2U+46/jDd0e6Ck= +golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -639,8 +639,8 @@ golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96b golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= -golang.org/x/net v0.14.0 h1:BONx9s002vGdD9umnlX1Po8vOZmrgH34qlHcD1MfK14= -golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= +golang.org/x/net v0.15.0 h1:ugBLEUaxABaB5AJqW9enI0ACdci2RUd4eP51NTBvuJ8= +golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -651,8 +651,8 @@ golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.11.0 h1:vPL4xzxBM4niKCW6g9whtaWVXTJf1U5e4aZxxFx/gbU= -golang.org/x/oauth2 v0.11.0/go.mod h1:LdF7O/8bLR/qWK9DrpXmbHLTouvRHK0SgJl0GmDBchk= +golang.org/x/oauth2 v0.12.0 h1:smVPGxink+n1ZI5pkQa8y6fZT0RW0MgCO5bFpepy4B4= +golang.org/x/oauth2 v0.12.0/go.mod h1:A74bZ3aGXgCY0qaIC9Ahg6Lglin4AMAco8cIv9baba4= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -716,14 +716,14 @@ golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.11.0 h1:eG7RXZHdqOJ1i+0lgLgCpSXAp6M3LYlAo6osgSi0xOM= -golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.12.0 h1:CM0HF96J0hcLAwsHPJZjfdNzs0gftsLfgKt57wWHJ0o= +golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= -golang.org/x/term v0.11.0 h1:F9tnn/DA/Im8nCwm+fX+1/eBwi4qFjRT++MhtVC4ZX0= -golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU= +golang.org/x/term v0.12.0 h1:/ZfYdc3zq+q02Rv9vGqTeSItdzZTSNDmfTi0mBAuidU= +golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -734,8 +734,8 @@ golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/text v0.12.0 h1:k+n5B8goJNdU7hSvEtMUz3d1Q6D/XW4COJSJR6fN0mc= -golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= +golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -962,8 +962,8 @@ k8s.io/client-go v0.28.1 h1:pRhMzB8HyLfVwpngWKE8hDcXRqifh1ga2Z/PU9SXVK8= k8s.io/client-go v0.28.1/go.mod h1:pEZA3FqOsVkCc07pFVzK076R+P/eXqsgx5zuuRWukNE= k8s.io/component-base v0.28.1 h1:LA4AujMlK2mr0tZbQDZkjWbdhTV5bRyEyAFe0TJxlWg= k8s.io/component-base v0.28.1/go.mod h1:jI11OyhbX21Qtbav7JkhehyBsIRfnO8oEgoAR12ArIU= -k8s.io/gengo v0.0.0-20230825065918-3239622df7ae h1:hNgjZGMeTuB+RGxdIVdX3sLtqtv16SDFGWlPKy7R9Kg= -k8s.io/gengo v0.0.0-20230825065918-3239622df7ae/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= +k8s.io/gengo v0.0.0-20230829151522-9cce18d56c01 h1:pWEwq4Asjm4vjW7vcsmijwBhOr1/shsbSYiWXmNGlks= +k8s.io/gengo v0.0.0-20230829151522-9cce18d56c01/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= k8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= k8s.io/klog/v2 v2.100.1 h1:7WCHKK6K8fNhTqfBhISHQ97KrnJNFZMcQvKp7gP/tmg= k8s.io/klog/v2 v2.100.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= diff --git a/hack/Dockerfile_fips b/hack/Dockerfile_fips index c0d34ba3a..1a75ea3f4 100644 --- a/hack/Dockerfile_fips +++ b/hack/Dockerfile_fips @@ -15,7 +15,7 @@ # hidden behind a `GOEXPERIMENT=boringcrypto` env var. # See https://go.googlesource.com/go/+/dev.boringcrypto/README.boringcrypto.md # and https://kupczynski.info/posts/fips-golang/ for details. -FROM golang:1.20.7 as build-env +FROM golang:1.21.0 as build-env WORKDIR /work COPY . . diff --git a/hack/update-go-mod/go.mod b/hack/update-go-mod/go.mod index ad69ff154..e3b4e5521 100644 --- a/hack/update-go-mod/go.mod +++ b/hack/update-go-mod/go.mod @@ -1,5 +1,5 @@ module go.pinniped.dev/update-go-mod -go 1.19 +go 1.20 require golang.org/x/mod v0.12.0 From 05a1187e2ef8d4f961dc60919237e2ced8b7baf8 Mon Sep 17 00:00:00 2001 From: Joshua Casey Date: Tue, 29 Aug 2023 16:59:24 -0500 Subject: [PATCH 2/6] Simplify build tags associated with unsupported golang versions --- internal/crypto/ptls/old.go | 8 ++++---- internal/testutil/tempdir.go | 5 +---- internal/testutil/tempdir_go1.14.go | 25 ------------------------- test/testlib/iplookup.go | 19 ++++++++++++++----- test/testlib/iplookup_go1.14.go | 29 ----------------------------- 5 files changed, 19 insertions(+), 67 deletions(-) delete mode 100644 internal/testutil/tempdir_go1.14.go delete mode 100644 test/testlib/iplookup_go1.14.go diff --git a/internal/crypto/ptls/old.go b/internal/crypto/ptls/old.go index a8987673b..0d9ca1966 100644 --- a/internal/crypto/ptls/old.go +++ b/internal/crypto/ptls/old.go @@ -1,8 +1,8 @@ -// Copyright 2021 the Pinniped contributors. All Rights Reserved. +// Copyright 2021-2023 the Pinniped contributors. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 -//go:build !go1.17 -// +build !go1.17 +//go:build !go1.19 +// +build !go1.19 package ptls @@ -10,6 +10,6 @@ func init() { // cause compile time failure if an older version of Go is used `Pinniped's TLS configuration makes assumptions about how the Go standard library implementation of TLS works. It particular, we rely on the server controlling cipher suite selection. For these assumptions to hold, Pinniped -must be compiled with Go 1.17+. If you are seeing this error message, your attempt to compile Pinniped with an +must be compiled with Go 1.19+. If you are seeing this error message, your attempt to compile Pinniped with an older Go compiler was explicitly failed to prevent an unsafe configuration.` } diff --git a/internal/testutil/tempdir.go b/internal/testutil/tempdir.go index 81c2759e0..485de6992 100644 --- a/internal/testutil/tempdir.go +++ b/internal/testutil/tempdir.go @@ -1,9 +1,6 @@ -// Copyright 2020-2022 the Pinniped contributors. All Rights Reserved. +// Copyright 2020-2023 the Pinniped contributors. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 -//go:build !go1.14 -// +build !go1.14 - package testutil import ( diff --git a/internal/testutil/tempdir_go1.14.go b/internal/testutil/tempdir_go1.14.go deleted file mode 100644 index 7f3f1bcc1..000000000 --- a/internal/testutil/tempdir_go1.14.go +++ /dev/null @@ -1,25 +0,0 @@ -// Copyright 2020-2022 the Pinniped contributors. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -//go:build go1.14 -// +build go1.14 - -package testutil - -import ( - "io/ioutil" //nolint:staticcheck // ioutil is deprecated, but this file is for go1.14 - "os" - "testing" - - "github.com/stretchr/testify/require" -) - -func TempDir(t *testing.T) string { - t.Helper() - dir, err := ioutil.TempDir("", "test-*") - require.NoError(t, err) - t.Cleanup(func() { - require.NoError(t, os.RemoveAll(dir)) - }) - return dir -} diff --git a/test/testlib/iplookup.go b/test/testlib/iplookup.go index 1a6d55535..2a492ebb4 100644 --- a/test/testlib/iplookup.go +++ b/test/testlib/iplookup.go @@ -1,9 +1,6 @@ -// Copyright 2020-2022 the Pinniped contributors. All Rights Reserved. +// Copyright 2020-2023 the Pinniped contributors. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 -//go:build !go1.14 -// +build !go1.14 - package testlib import ( @@ -13,5 +10,17 @@ import ( // LookupIP looks up the IP address of the provided hostname, preferring IPv4. func LookupIP(ctx context.Context, hostname string) ([]net.IP, error) { - return net.DefaultResolver.LookupIP(ctx, "ip4", hostname) + ips, err := net.DefaultResolver.LookupIPAddr(ctx, hostname) + if err != nil { + return nil, err + } + + // Filter out to only IPv4 addresses + var results []net.IP + for _, ip := range ips { + if ip.IP.To4() != nil { + results = append(results, ip.IP) + } + } + return results, nil } diff --git a/test/testlib/iplookup_go1.14.go b/test/testlib/iplookup_go1.14.go deleted file mode 100644 index 42f18e893..000000000 --- a/test/testlib/iplookup_go1.14.go +++ /dev/null @@ -1,29 +0,0 @@ -// Copyright 2020-2022 the Pinniped contributors. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -//go:build go1.14 -// +build go1.14 - -package testlib - -import ( - "context" - "net" -) - -// LookupIP looks up the IP address of the provided hostname, preferring IPv4. -func LookupIP(ctx context.Context, hostname string) ([]net.IP, error) { - ips, err := net.DefaultResolver.LookupIPAddr(ctx, hostname) - if err != nil { - return nil, err - } - - // Filter out to only IPv4 addresses - var results []net.IP - for _, ip := range ips { - if ip.IP.To4() != nil { - results = append(results, ip.IP) - } - } - return results, nil -} From 12f18cbed88f90f8ff6e9ce7afe029d7ea7ab113 Mon Sep 17 00:00:00 2001 From: Joshua Casey Date: Tue, 29 Aug 2023 17:03:11 -0500 Subject: [PATCH 3/6] Inline and remove testutil.TempDir --- cmd/pinniped/cmd/flag_types_test.go | 5 ++-- cmd/pinniped/cmd/kubeconfig_test.go | 2 +- cmd/pinniped/cmd/login_oidc_test.go | 5 ++-- cmd/pinniped/cmd/login_static_test.go | 3 +- internal/execcredcache/cachefile_test.go | 8 ++--- internal/execcredcache/execcredcache_test.go | 10 +++---- internal/testutil/tempdir.go | 12 -------- pkg/oidcclient/filesession/cachefile_test.go | 7 ++--- .../filesession/filesession_test.go | 9 +++--- test/integration/cli_test.go | 11 ++++--- .../concierge_impersonation_proxy_test.go | 2 +- test/integration/e2e_test.go | 30 +++++++++---------- test/integration/supervisor_warnings_test.go | 3 +- test/testlib/cli.go | 4 +-- 14 files changed, 43 insertions(+), 68 deletions(-) delete mode 100644 internal/testutil/tempdir.go diff --git a/cmd/pinniped/cmd/flag_types_test.go b/cmd/pinniped/cmd/flag_types_test.go index 1d731494e..255ad2a8d 100644 --- a/cmd/pinniped/cmd/flag_types_test.go +++ b/cmd/pinniped/cmd/flag_types_test.go @@ -1,4 +1,4 @@ -// Copyright 2021-2022 the Pinniped contributors. All Rights Reserved. +// Copyright 2021-2023 the Pinniped contributors. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 package cmd @@ -15,7 +15,6 @@ import ( configv1alpha1 "go.pinniped.dev/generated/latest/apis/concierge/config/v1alpha1" "go.pinniped.dev/internal/certauthority" - "go.pinniped.dev/internal/testutil" ) func TestConciergeModeFlag(t *testing.T) { @@ -52,7 +51,7 @@ func TestConciergeModeFlag(t *testing.T) { func TestCABundleFlag(t *testing.T) { testCA, err := certauthority.New("Test CA", 1*time.Hour) require.NoError(t, err) - tmpdir := testutil.TempDir(t) + tmpdir := t.TempDir() emptyFilePath := filepath.Join(tmpdir, "empty") require.NoError(t, os.WriteFile(emptyFilePath, []byte{}, 0600)) diff --git a/cmd/pinniped/cmd/kubeconfig_test.go b/cmd/pinniped/cmd/kubeconfig_test.go index ca8b762c3..d0d4220b3 100644 --- a/cmd/pinniped/cmd/kubeconfig_test.go +++ b/cmd/pinniped/cmd/kubeconfig_test.go @@ -32,7 +32,7 @@ import ( func TestGetKubeconfig(t *testing.T) { testOIDCCA, err := certauthority.New("Test CA", 1*time.Hour) require.NoError(t, err) - tmpdir := testutil.TempDir(t) + tmpdir := t.TempDir() testOIDCCABundlePath := filepath.Join(tmpdir, "testca.pem") require.NoError(t, os.WriteFile(testOIDCCABundlePath, testOIDCCA.Bundle(), 0600)) diff --git a/cmd/pinniped/cmd/login_oidc_test.go b/cmd/pinniped/cmd/login_oidc_test.go index b2b97077f..c73565a59 100644 --- a/cmd/pinniped/cmd/login_oidc_test.go +++ b/cmd/pinniped/cmd/login_oidc_test.go @@ -23,7 +23,6 @@ import ( "go.pinniped.dev/internal/certauthority" "go.pinniped.dev/internal/here" "go.pinniped.dev/internal/plog" - "go.pinniped.dev/internal/testutil" "go.pinniped.dev/pkg/conciergeclient" "go.pinniped.dev/pkg/oidcclient" "go.pinniped.dev/pkg/oidcclient/oidctypes" @@ -34,7 +33,7 @@ func TestLoginOIDCCommand(t *testing.T) { testCA, err := certauthority.New("Test CA", 1*time.Hour) require.NoError(t, err) - tmpdir := testutil.TempDir(t) + tmpdir := t.TempDir() testCABundlePath := filepath.Join(tmpdir, "testca.pem") require.NoError(t, os.WriteFile(testCABundlePath, testCA.Bundle(), 0600)) @@ -513,7 +512,7 @@ func TestLoginOIDCCommand(t *testing.T) { "--concierge-endpoint", "https://127.0.0.1:1234/", "--concierge-ca-bundle-data", base64.StdEncoding.EncodeToString(testCA.Bundle()), "--concierge-api-group-suffix", "some.suffix.com", - "--credential-cache", testutil.TempDir(t) + "/credentials.yaml", // must specify --credential-cache or else the cache file on disk causes test pollution + "--credential-cache", t.TempDir() + "/credentials.yaml", // must specify --credential-cache or else the cache file on disk causes test pollution "--upstream-identity-provider-name", "some-upstream-name", "--upstream-identity-provider-type", "ldap", }, diff --git a/cmd/pinniped/cmd/login_static_test.go b/cmd/pinniped/cmd/login_static_test.go index 53456d915..f11a76bad 100644 --- a/cmd/pinniped/cmd/login_static_test.go +++ b/cmd/pinniped/cmd/login_static_test.go @@ -21,7 +21,6 @@ import ( "go.pinniped.dev/internal/certauthority" "go.pinniped.dev/internal/here" "go.pinniped.dev/internal/plog" - "go.pinniped.dev/internal/testutil" "go.pinniped.dev/pkg/conciergeclient" ) @@ -30,7 +29,7 @@ func TestLoginStaticCommand(t *testing.T) { testCA, err := certauthority.New("Test CA", 1*time.Hour) require.NoError(t, err) - tmpdir := testutil.TempDir(t) + tmpdir := t.TempDir() testCABundlePath := filepath.Join(tmpdir, "testca.pem") require.NoError(t, os.WriteFile(testCABundlePath, testCA.Bundle(), 0600)) diff --git a/internal/execcredcache/cachefile_test.go b/internal/execcredcache/cachefile_test.go index e05444481..c4c719486 100644 --- a/internal/execcredcache/cachefile_test.go +++ b/internal/execcredcache/cachefile_test.go @@ -1,4 +1,4 @@ -// Copyright 2021 the Pinniped contributors. All Rights Reserved. +// Copyright 2021-2023 the Pinniped contributors. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 package execcredcache @@ -11,8 +11,6 @@ import ( "github.com/stretchr/testify/require" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" clientauthenticationv1beta1 "k8s.io/client-go/pkg/apis/clientauthentication/v1beta1" - - "go.pinniped.dev/internal/testutil" ) var ( @@ -100,7 +98,7 @@ func TestWriteTo(t *testing.T) { t.Parallel() t.Run("io error", func(t *testing.T) { t.Parallel() - tmp := testutil.TempDir(t) + "/credentials.yaml" + tmp := t.TempDir() + "/credentials.yaml" require.NoError(t, os.Mkdir(tmp, 0700)) err := validCache.writeTo(tmp) require.EqualError(t, err, "open "+tmp+": is a directory") @@ -108,7 +106,7 @@ func TestWriteTo(t *testing.T) { t.Run("success", func(t *testing.T) { t.Parallel() - require.NoError(t, validCache.writeTo(testutil.TempDir(t)+"/credentials.yaml")) + require.NoError(t, validCache.writeTo(t.TempDir()+"/credentials.yaml")) }) } diff --git a/internal/execcredcache/execcredcache_test.go b/internal/execcredcache/execcredcache_test.go index c9b161e5f..1b92a5b87 100644 --- a/internal/execcredcache/execcredcache_test.go +++ b/internal/execcredcache/execcredcache_test.go @@ -1,4 +1,4 @@ -// Copyright 2021-2022 the Pinniped contributors. All Rights Reserved. +// Copyright 2021-2023 the Pinniped contributors. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 package execcredcache @@ -14,13 +14,11 @@ import ( "github.com/stretchr/testify/require" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" clientauthenticationv1beta1 "k8s.io/client-go/pkg/apis/clientauthentication/v1beta1" - - "go.pinniped.dev/internal/testutil" ) func TestNew(t *testing.T) { t.Parallel() - tmp := testutil.TempDir(t) + "/credentials.yaml" + tmp := t.TempDir() + "/credentials.yaml" c := New(tmp) require.NotNil(t, c) require.Equal(t, tmp, c.path) @@ -167,7 +165,7 @@ func TestGet(t *testing.T) { tt := tt t.Run(tt.name, func(t *testing.T) { t.Parallel() - tmp := testutil.TempDir(t) + "/sessions.yaml" + tmp := t.TempDir() + "/sessions.yaml" if tt.makeTestFile != nil { tt.makeTestFile(t, tmp) } @@ -333,7 +331,7 @@ func TestPutToken(t *testing.T) { tt := tt t.Run(tt.name, func(t *testing.T) { t.Parallel() - tmp := testutil.TempDir(t) + "/cachedir/credentials.yaml" + tmp := t.TempDir() + "/cachedir/credentials.yaml" if tt.makeTestFile != nil { tt.makeTestFile(t, tmp) } diff --git a/internal/testutil/tempdir.go b/internal/testutil/tempdir.go deleted file mode 100644 index 485de6992..000000000 --- a/internal/testutil/tempdir.go +++ /dev/null @@ -1,12 +0,0 @@ -// Copyright 2020-2023 the Pinniped contributors. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package testutil - -import ( - "testing" -) - -func TempDir(t *testing.T) string { - return t.TempDir() -} diff --git a/pkg/oidcclient/filesession/cachefile_test.go b/pkg/oidcclient/filesession/cachefile_test.go index 39ac87fb1..413cd5f02 100644 --- a/pkg/oidcclient/filesession/cachefile_test.go +++ b/pkg/oidcclient/filesession/cachefile_test.go @@ -1,4 +1,4 @@ -// Copyright 2020 the Pinniped contributors. All Rights Reserved. +// Copyright 2020-2023 the Pinniped contributors. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 package filesession @@ -11,7 +11,6 @@ import ( "github.com/stretchr/testify/require" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "go.pinniped.dev/internal/testutil" "go.pinniped.dev/pkg/oidcclient" "go.pinniped.dev/pkg/oidcclient/oidctypes" ) @@ -120,7 +119,7 @@ func TestWriteTo(t *testing.T) { t.Parallel() t.Run("io error", func(t *testing.T) { t.Parallel() - tmp := testutil.TempDir(t) + "/sessions.yaml" + tmp := t.TempDir() + "/sessions.yaml" require.NoError(t, os.Mkdir(tmp, 0700)) err := validSession.writeTo(tmp) require.EqualError(t, err, "open "+tmp+": is a directory") @@ -128,7 +127,7 @@ func TestWriteTo(t *testing.T) { t.Run("success", func(t *testing.T) { t.Parallel() - require.NoError(t, validSession.writeTo(testutil.TempDir(t)+"/sessions.yaml")) + require.NoError(t, validSession.writeTo(t.TempDir()+"/sessions.yaml")) }) } diff --git a/pkg/oidcclient/filesession/filesession_test.go b/pkg/oidcclient/filesession/filesession_test.go index ed684825e..f2ff116c3 100644 --- a/pkg/oidcclient/filesession/filesession_test.go +++ b/pkg/oidcclient/filesession/filesession_test.go @@ -1,4 +1,4 @@ -// Copyright 2020-2022 the Pinniped contributors. All Rights Reserved. +// Copyright 2020-2023 the Pinniped contributors. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 package filesession @@ -14,14 +14,13 @@ import ( "github.com/stretchr/testify/require" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "go.pinniped.dev/internal/testutil" "go.pinniped.dev/pkg/oidcclient" "go.pinniped.dev/pkg/oidcclient/oidctypes" ) func TestNew(t *testing.T) { t.Parallel() - tmp := testutil.TempDir(t) + "/sessions.yaml" + tmp := t.TempDir() + "/sessions.yaml" c := New(tmp) require.NotNil(t, c) require.Equal(t, tmp, c.path) @@ -222,7 +221,7 @@ func TestGetToken(t *testing.T) { tt := tt t.Run(tt.name, func(t *testing.T) { t.Parallel() - tmp := testutil.TempDir(t) + "/sessions.yaml" + tmp := t.TempDir() + "/sessions.yaml" if tt.makeTestFile != nil { tt.makeTestFile(t, tmp) } @@ -480,7 +479,7 @@ func TestPutToken(t *testing.T) { tt := tt t.Run(tt.name, func(t *testing.T) { t.Parallel() - tmp := testutil.TempDir(t) + "/sessiondir/sessions.yaml" + tmp := t.TempDir() + "/sessiondir/sessions.yaml" if tt.makeTestFile != nil { tt.makeTestFile(t, tmp) } diff --git a/test/integration/cli_test.go b/test/integration/cli_test.go index 8f0cadc29..910bd3628 100644 --- a/test/integration/cli_test.go +++ b/test/integration/cli_test.go @@ -28,7 +28,6 @@ import ( identityv1alpha1 "go.pinniped.dev/generated/latest/apis/concierge/identity/v1alpha1" conciergescheme "go.pinniped.dev/internal/concierge/scheme" - "go.pinniped.dev/internal/testutil" "go.pinniped.dev/pkg/oidcclient" "go.pinniped.dev/pkg/oidcclient/filesession" "go.pinniped.dev/test/testlib" @@ -48,7 +47,7 @@ func TestCLIGetKubeconfigStaticToken_Parallel(t *testing.T) { // Build pinniped CLI. pinnipedExe := testlib.PinnipedCLIPath(t) - credCacheDir := testutil.TempDir(t) + credCacheDir := t.TempDir() stdout, stderr := runPinnipedCLI(t, nil, pinnipedExe, "get", "kubeconfig", "--static-token", env.TestUser.Token, "--concierge-api-group-suffix", env.APIGroupSuffix, @@ -92,7 +91,7 @@ func TestCLIGetKubeconfigStaticToken_Parallel(t *testing.T) { t.Run("whoami", func(t *testing.T) { // Validate that `pinniped whoami` returns the correct identity. - kubeconfigPath := filepath.Join(testutil.TempDir(t), "whoami-kubeconfig") + kubeconfigPath := filepath.Join(t.TempDir(), "whoami-kubeconfig") require.NoError(t, os.WriteFile(kubeconfigPath, []byte(stdout), 0600)) assertWhoami( ctx, @@ -277,7 +276,7 @@ func runPinnipedLoginOIDC( env := testlib.IntegrationEnv(t) // Make a temp directory to hold the session cache for this test. - sessionCachePath := testutil.TempDir(t) + "/sessions.yaml" + sessionCachePath := t.TempDir() + "/sessions.yaml" // Start the browser driver. browser := browsertest.OpenBrowser(t) @@ -417,13 +416,13 @@ func oidcLoginCommand(ctx context.Context, t *testing.T, pinnipedExe string, ses "--scopes", "offline_access,openid,email,profile", "--listen-port", callbackURL.Port(), "--session-cache", sessionCachePath, - "--credential-cache", testutil.TempDir(t)+"/credentials.yaml", + "--credential-cache", t.TempDir()+"/credentials.yaml", "--skip-browser", ) // If there is a custom CA bundle, pass it via --ca-bundle and a temporary file. if env.CLIUpstreamOIDC.CABundle != "" { - path := filepath.Join(testutil.TempDir(t), "test-ca.pem") + path := filepath.Join(t.TempDir(), "test-ca.pem") require.NoError(t, os.WriteFile(path, []byte(env.CLIUpstreamOIDC.CABundle), 0600)) cmd.Args = append(cmd.Args, "--ca-bundle", path) } diff --git a/test/integration/concierge_impersonation_proxy_test.go b/test/integration/concierge_impersonation_proxy_test.go index 8fa6e69c9..dd1dadb3c 100644 --- a/test/integration/concierge_impersonation_proxy_test.go +++ b/test/integration/concierge_impersonation_proxy_test.go @@ -2325,7 +2325,7 @@ func getImpersonationKubeconfig(t *testing.T, env *testlib.TestEnv, impersonatio t.Helper() pinnipedExe := testlib.PinnipedCLIPath(t) - tempDir := testutil.TempDir(t) + tempDir := t.TempDir() var envVarsWithProxy []string if !env.HasCapability(testlib.HasExternalLoadBalancerProvider) { diff --git a/test/integration/e2e_test.go b/test/integration/e2e_test.go index bb8720987..7b43b6929 100644 --- a/test/integration/e2e_test.go +++ b/test/integration/e2e_test.go @@ -79,7 +79,7 @@ func TestE2EFullIntegration_Browser(t *testing.T) { require.NoError(t, err) // Save that bundle plus the one that signs the upstream issuer, for test purposes. - testCABundlePath := filepath.Join(testutil.TempDir(t), "test-ca.pem") + testCABundlePath := filepath.Join(t.TempDir(), "test-ca.pem") testCABundlePEM := []byte(string(ca.Bundle()) + "\n" + env.SupervisorUpstreamOIDC.CABundle) testCABundleBase64 := base64.StdEncoding.EncodeToString(testCABundlePEM) require.NoError(t, os.WriteFile(testCABundlePath, testCABundlePEM, 0600)) @@ -119,7 +119,7 @@ func TestE2EFullIntegration_Browser(t *testing.T) { testCtx, cancel := context.WithTimeout(context.Background(), 5*time.Minute) t.Cleanup(cancel) - tempDir := testutil.TempDir(t) // per-test tmp dir to avoid sharing files between tests + tempDir := t.TempDir() // per-test tmp dir to avoid sharing files between tests // Start a fresh browser driver because we don't want to share cookies between the various tests in this file. browser := browsertest.OpenBrowser(t) @@ -200,7 +200,7 @@ func TestE2EFullIntegration_Browser(t *testing.T) { testCtx, cancel := context.WithTimeout(context.Background(), 5*time.Minute) t.Cleanup(cancel) - tempDir := testutil.TempDir(t) // per-test tmp dir to avoid sharing files between tests + tempDir := t.TempDir() // per-test tmp dir to avoid sharing files between tests // Start a fresh browser driver because we don't want to share cookies between the various tests in this file. browser := browsertest.OpenBrowser(t) @@ -284,7 +284,7 @@ func TestE2EFullIntegration_Browser(t *testing.T) { testCtx, cancel := context.WithTimeout(context.Background(), 5*time.Minute) t.Cleanup(cancel) - tempDir := testutil.TempDir(t) // per-test tmp dir to avoid sharing files between tests + tempDir := t.TempDir() // per-test tmp dir to avoid sharing files between tests // Start a fresh browser driver because we don't want to share cookies between the various tests in this file. browser := browsertest.OpenBrowser(t) @@ -395,7 +395,7 @@ func TestE2EFullIntegration_Browser(t *testing.T) { testCtx, cancel := context.WithTimeout(context.Background(), 5*time.Minute) t.Cleanup(cancel) - tempDir := testutil.TempDir(t) // per-test tmp dir to avoid sharing files between tests + tempDir := t.TempDir() // per-test tmp dir to avoid sharing files between tests // Start a fresh browser driver because we don't want to share cookies between the various tests in this file. browser := browsertest.OpenBrowser(t) @@ -531,7 +531,7 @@ func TestE2EFullIntegration_Browser(t *testing.T) { testCtx, cancel := context.WithTimeout(context.Background(), 5*time.Minute) t.Cleanup(cancel) - tempDir := testutil.TempDir(t) // per-test tmp dir to avoid sharing files between tests + tempDir := t.TempDir() // per-test tmp dir to avoid sharing files between tests expectedUsername := env.SupervisorUpstreamOIDC.Username expectedGroups := env.SupervisorUpstreamOIDC.ExpectedGroups @@ -614,7 +614,7 @@ func TestE2EFullIntegration_Browser(t *testing.T) { testCtx, cancel := context.WithTimeout(context.Background(), 5*time.Minute) t.Cleanup(cancel) - tempDir := testutil.TempDir(t) // per-test tmp dir to avoid sharing files between tests + tempDir := t.TempDir() // per-test tmp dir to avoid sharing files between tests // Create upstream OIDC provider and wait for it to become ready. oidcIdentityProvider := testlib.CreateTestOIDCIdentityProvider(t, idpv1alpha1.OIDCIdentityProviderSpec{ @@ -700,7 +700,7 @@ func TestE2EFullIntegration_Browser(t *testing.T) { testCtx, cancel := context.WithTimeout(context.Background(), 5*time.Minute) t.Cleanup(cancel) - tempDir := testutil.TempDir(t) // per-test tmp dir to avoid sharing files between tests + tempDir := t.TempDir() // per-test tmp dir to avoid sharing files between tests expectedUsername := env.SupervisorUpstreamLDAP.TestUserMailAttributeValue expectedGroups := env.SupervisorUpstreamLDAP.TestUserDirectGroupsDNs @@ -754,7 +754,7 @@ func TestE2EFullIntegration_Browser(t *testing.T) { testCtx, cancel := context.WithTimeout(context.Background(), 5*time.Minute) t.Cleanup(cancel) - tempDir := testutil.TempDir(t) // per-test tmp dir to avoid sharing files between tests + tempDir := t.TempDir() // per-test tmp dir to avoid sharing files between tests expectedUsername := env.SupervisorUpstreamLDAP.TestUserMailAttributeValue expectedGroups := env.SupervisorUpstreamLDAP.TestUserDirectGroupsDNs @@ -813,7 +813,7 @@ func TestE2EFullIntegration_Browser(t *testing.T) { testCtx, cancel := context.WithTimeout(context.Background(), 5*time.Minute) t.Cleanup(cancel) - tempDir := testutil.TempDir(t) // per-test tmp dir to avoid sharing files between tests + tempDir := t.TempDir() // per-test tmp dir to avoid sharing files between tests expectedUsername := env.SupervisorUpstreamLDAP.TestUserMailAttributeValue expectedGroups := env.SupervisorUpstreamLDAP.TestUserDirectGroupsDNs @@ -879,7 +879,7 @@ func TestE2EFullIntegration_Browser(t *testing.T) { testCtx, cancel := context.WithTimeout(context.Background(), 5*time.Minute) t.Cleanup(cancel) - tempDir := testutil.TempDir(t) // per-test tmp dir to avoid sharing files between tests + tempDir := t.TempDir() // per-test tmp dir to avoid sharing files between tests expectedUsername := env.SupervisorUpstreamActiveDirectory.TestUserPrincipalNameValue expectedGroups := env.SupervisorUpstreamActiveDirectory.TestUserIndirectGroupsSAMAccountPlusDomainNames @@ -933,7 +933,7 @@ func TestE2EFullIntegration_Browser(t *testing.T) { testCtx, cancel := context.WithTimeout(context.Background(), 5*time.Minute) t.Cleanup(cancel) - tempDir := testutil.TempDir(t) // per-test tmp dir to avoid sharing files between tests + tempDir := t.TempDir() // per-test tmp dir to avoid sharing files between tests expectedUsername := env.SupervisorUpstreamActiveDirectory.TestUserPrincipalNameValue expectedGroups := env.SupervisorUpstreamActiveDirectory.TestUserIndirectGroupsSAMAccountPlusDomainNames @@ -998,7 +998,7 @@ func TestE2EFullIntegration_Browser(t *testing.T) { testCtx, cancel := context.WithTimeout(context.Background(), 5*time.Minute) t.Cleanup(cancel) - tempDir := testutil.TempDir(t) // per-test tmp dir to avoid sharing files between tests + tempDir := t.TempDir() // per-test tmp dir to avoid sharing files between tests // Start a fresh browser driver because we don't want to share cookies between the various tests in this file. browser := browsertest.OpenBrowser(t) @@ -1048,7 +1048,7 @@ func TestE2EFullIntegration_Browser(t *testing.T) { testCtx, cancel := context.WithTimeout(context.Background(), 5*time.Minute) t.Cleanup(cancel) - tempDir := testutil.TempDir(t) // per-test tmp dir to avoid sharing files between tests + tempDir := t.TempDir() // per-test tmp dir to avoid sharing files between tests // Start a fresh browser driver because we don't want to share cookies between the various tests in this file. browser := browsertest.OpenBrowser(t) @@ -1098,7 +1098,7 @@ func TestE2EFullIntegration_Browser(t *testing.T) { testCtx, cancel := context.WithTimeout(context.Background(), 5*time.Minute) t.Cleanup(cancel) - tempDir := testutil.TempDir(t) // per-test tmp dir to avoid sharing files between tests + tempDir := t.TempDir() // per-test tmp dir to avoid sharing files between tests // Start a fresh browser driver because we don't want to share cookies between the various tests in this file. browser := browsertest.OpenBrowser(t) diff --git a/test/integration/supervisor_warnings_test.go b/test/integration/supervisor_warnings_test.go index b8acd3683..f84b5358d 100644 --- a/test/integration/supervisor_warnings_test.go +++ b/test/integration/supervisor_warnings_test.go @@ -31,7 +31,6 @@ import ( "go.pinniped.dev/internal/oidc" "go.pinniped.dev/internal/oidc/oidcclientvalidator" "go.pinniped.dev/internal/psession" - "go.pinniped.dev/internal/testutil" "go.pinniped.dev/pkg/oidcclient" "go.pinniped.dev/pkg/oidcclient/filesession" "go.pinniped.dev/test/testlib" @@ -46,7 +45,7 @@ func TestSupervisorWarnings_Browser(t *testing.T) { // Build pinniped CLI. pinnipedExe := testlib.PinnipedCLIPath(t) - tempDir := testutil.TempDir(t) + tempDir := t.TempDir() // Infer the downstream issuer URL from the callback associated with the upstream test client registration. issuerURL, err := url.Parse(env.SupervisorUpstreamOIDC.CallbackURL) diff --git a/test/testlib/cli.go b/test/testlib/cli.go index 303087d7c..63c524ed4 100644 --- a/test/testlib/cli.go +++ b/test/testlib/cli.go @@ -12,8 +12,6 @@ import ( "time" "github.com/stretchr/testify/require" - - "go.pinniped.dev/internal/testutil" ) //nolint:gochecknoglobals @@ -34,7 +32,7 @@ func PinnipedCLIPath(t *testing.T) string { pinnipedCLIBinaryCache.mutex.Lock() defer pinnipedCLIBinaryCache.mutex.Unlock() - path := filepath.Join(testutil.TempDir(t), "pinniped") + path := filepath.Join(t.TempDir(), "pinniped") if pinnipedCLIBinaryCache.buf != nil { t.Log("using previously built pinniped CLI binary") //nolint:gosec // this is test code. From 3908097c544df380cd279c02fff92558a674cce5 Mon Sep 17 00:00:00 2001 From: Joshua Casey Date: Tue, 29 Aug 2023 17:28:12 -0500 Subject: [PATCH 4/6] Run 'go fix ./...' with go1.21.0 --- .../v1alpha1/zz_generated.deepcopy.go | 1 - .../config/v1alpha1/zz_generated.deepcopy.go | 1 - .../v1alpha1/zz_generated.conversion.go | 1 - .../v1alpha1/zz_generated.deepcopy.go | 1 - .../v1alpha1/zz_generated.defaults.go | 1 - .../identity/zz_generated.deepcopy.go | 1 - .../login/v1alpha1/zz_generated.conversion.go | 1 - .../login/v1alpha1/zz_generated.deepcopy.go | 1 - .../login/v1alpha1/zz_generated.defaults.go | 1 - .../concierge/login/zz_generated.deepcopy.go | 1 - .../v1alpha1/zz_generated.conversion.go | 1 - .../v1alpha1/zz_generated.deepcopy.go | 1 - .../v1alpha1/zz_generated.defaults.go | 1 - .../clientsecret/zz_generated.deepcopy.go | 1 - .../config/v1alpha1/zz_generated.deepcopy.go | 1 - .../idp/v1alpha1/zz_generated.deepcopy.go | 1 - .../concierge/openapi/zz_generated.openapi.go | 3 +- .../openapi/zz_generated.openapi.go | 105 +++++++++--------- internal/crypto/fips/fips_strict.go | 1 - internal/crypto/ptls/default.go | 3 +- internal/crypto/ptls/fips_strict.go | 1 - internal/crypto/ptls/old.go | 1 - internal/crypto/ptls/secure.go | 3 +- test/integration/securetls_fips_test.go | 3 +- test/testlib/securetls_preference_fips.go | 3 +- test/testlib/securetls_preference_nonfips.go | 3 +- 26 files changed, 58 insertions(+), 84 deletions(-) diff --git a/generated/latest/apis/concierge/authentication/v1alpha1/zz_generated.deepcopy.go b/generated/latest/apis/concierge/authentication/v1alpha1/zz_generated.deepcopy.go index 9a0828bc4..246171929 100644 --- a/generated/latest/apis/concierge/authentication/v1alpha1/zz_generated.deepcopy.go +++ b/generated/latest/apis/concierge/authentication/v1alpha1/zz_generated.deepcopy.go @@ -1,5 +1,4 @@ //go:build !ignore_autogenerated -// +build !ignore_autogenerated // Copyright 2020-2023 the Pinniped contributors. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 diff --git a/generated/latest/apis/concierge/config/v1alpha1/zz_generated.deepcopy.go b/generated/latest/apis/concierge/config/v1alpha1/zz_generated.deepcopy.go index d4a01ba48..4a3373989 100644 --- a/generated/latest/apis/concierge/config/v1alpha1/zz_generated.deepcopy.go +++ b/generated/latest/apis/concierge/config/v1alpha1/zz_generated.deepcopy.go @@ -1,5 +1,4 @@ //go:build !ignore_autogenerated -// +build !ignore_autogenerated // Copyright 2020-2023 the Pinniped contributors. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 diff --git a/generated/latest/apis/concierge/identity/v1alpha1/zz_generated.conversion.go b/generated/latest/apis/concierge/identity/v1alpha1/zz_generated.conversion.go index 700a55988..1786f06ad 100644 --- a/generated/latest/apis/concierge/identity/v1alpha1/zz_generated.conversion.go +++ b/generated/latest/apis/concierge/identity/v1alpha1/zz_generated.conversion.go @@ -1,5 +1,4 @@ //go:build !ignore_autogenerated -// +build !ignore_autogenerated // Copyright 2020-2023 the Pinniped contributors. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 diff --git a/generated/latest/apis/concierge/identity/v1alpha1/zz_generated.deepcopy.go b/generated/latest/apis/concierge/identity/v1alpha1/zz_generated.deepcopy.go index 2feed25b2..533b24ce7 100644 --- a/generated/latest/apis/concierge/identity/v1alpha1/zz_generated.deepcopy.go +++ b/generated/latest/apis/concierge/identity/v1alpha1/zz_generated.deepcopy.go @@ -1,5 +1,4 @@ //go:build !ignore_autogenerated -// +build !ignore_autogenerated // Copyright 2020-2023 the Pinniped contributors. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 diff --git a/generated/latest/apis/concierge/identity/v1alpha1/zz_generated.defaults.go b/generated/latest/apis/concierge/identity/v1alpha1/zz_generated.defaults.go index abdbfa5fb..8d370915b 100644 --- a/generated/latest/apis/concierge/identity/v1alpha1/zz_generated.defaults.go +++ b/generated/latest/apis/concierge/identity/v1alpha1/zz_generated.defaults.go @@ -1,5 +1,4 @@ //go:build !ignore_autogenerated -// +build !ignore_autogenerated // Copyright 2020-2023 the Pinniped contributors. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 diff --git a/generated/latest/apis/concierge/identity/zz_generated.deepcopy.go b/generated/latest/apis/concierge/identity/zz_generated.deepcopy.go index 840da45eb..e7ca4d6f8 100644 --- a/generated/latest/apis/concierge/identity/zz_generated.deepcopy.go +++ b/generated/latest/apis/concierge/identity/zz_generated.deepcopy.go @@ -1,5 +1,4 @@ //go:build !ignore_autogenerated -// +build !ignore_autogenerated // Copyright 2020-2023 the Pinniped contributors. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 diff --git a/generated/latest/apis/concierge/login/v1alpha1/zz_generated.conversion.go b/generated/latest/apis/concierge/login/v1alpha1/zz_generated.conversion.go index bc409d261..0461660e1 100644 --- a/generated/latest/apis/concierge/login/v1alpha1/zz_generated.conversion.go +++ b/generated/latest/apis/concierge/login/v1alpha1/zz_generated.conversion.go @@ -1,5 +1,4 @@ //go:build !ignore_autogenerated -// +build !ignore_autogenerated // Copyright 2020-2023 the Pinniped contributors. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 diff --git a/generated/latest/apis/concierge/login/v1alpha1/zz_generated.deepcopy.go b/generated/latest/apis/concierge/login/v1alpha1/zz_generated.deepcopy.go index 0d64c87a3..fb5263c8f 100644 --- a/generated/latest/apis/concierge/login/v1alpha1/zz_generated.deepcopy.go +++ b/generated/latest/apis/concierge/login/v1alpha1/zz_generated.deepcopy.go @@ -1,5 +1,4 @@ //go:build !ignore_autogenerated -// +build !ignore_autogenerated // Copyright 2020-2023 the Pinniped contributors. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 diff --git a/generated/latest/apis/concierge/login/v1alpha1/zz_generated.defaults.go b/generated/latest/apis/concierge/login/v1alpha1/zz_generated.defaults.go index abdbfa5fb..8d370915b 100644 --- a/generated/latest/apis/concierge/login/v1alpha1/zz_generated.defaults.go +++ b/generated/latest/apis/concierge/login/v1alpha1/zz_generated.defaults.go @@ -1,5 +1,4 @@ //go:build !ignore_autogenerated -// +build !ignore_autogenerated // Copyright 2020-2023 the Pinniped contributors. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 diff --git a/generated/latest/apis/concierge/login/zz_generated.deepcopy.go b/generated/latest/apis/concierge/login/zz_generated.deepcopy.go index f332880e5..ecf3a3c42 100644 --- a/generated/latest/apis/concierge/login/zz_generated.deepcopy.go +++ b/generated/latest/apis/concierge/login/zz_generated.deepcopy.go @@ -1,5 +1,4 @@ //go:build !ignore_autogenerated -// +build !ignore_autogenerated // Copyright 2020-2023 the Pinniped contributors. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 diff --git a/generated/latest/apis/supervisor/clientsecret/v1alpha1/zz_generated.conversion.go b/generated/latest/apis/supervisor/clientsecret/v1alpha1/zz_generated.conversion.go index 3c9326d59..692c322df 100644 --- a/generated/latest/apis/supervisor/clientsecret/v1alpha1/zz_generated.conversion.go +++ b/generated/latest/apis/supervisor/clientsecret/v1alpha1/zz_generated.conversion.go @@ -1,5 +1,4 @@ //go:build !ignore_autogenerated -// +build !ignore_autogenerated // Copyright 2020-2023 the Pinniped contributors. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 diff --git a/generated/latest/apis/supervisor/clientsecret/v1alpha1/zz_generated.deepcopy.go b/generated/latest/apis/supervisor/clientsecret/v1alpha1/zz_generated.deepcopy.go index cd9c904e4..0280f8ca6 100644 --- a/generated/latest/apis/supervisor/clientsecret/v1alpha1/zz_generated.deepcopy.go +++ b/generated/latest/apis/supervisor/clientsecret/v1alpha1/zz_generated.deepcopy.go @@ -1,5 +1,4 @@ //go:build !ignore_autogenerated -// +build !ignore_autogenerated // Copyright 2020-2023 the Pinniped contributors. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 diff --git a/generated/latest/apis/supervisor/clientsecret/v1alpha1/zz_generated.defaults.go b/generated/latest/apis/supervisor/clientsecret/v1alpha1/zz_generated.defaults.go index abdbfa5fb..8d370915b 100644 --- a/generated/latest/apis/supervisor/clientsecret/v1alpha1/zz_generated.defaults.go +++ b/generated/latest/apis/supervisor/clientsecret/v1alpha1/zz_generated.defaults.go @@ -1,5 +1,4 @@ //go:build !ignore_autogenerated -// +build !ignore_autogenerated // Copyright 2020-2023 the Pinniped contributors. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 diff --git a/generated/latest/apis/supervisor/clientsecret/zz_generated.deepcopy.go b/generated/latest/apis/supervisor/clientsecret/zz_generated.deepcopy.go index 4153df600..49a60f3d1 100644 --- a/generated/latest/apis/supervisor/clientsecret/zz_generated.deepcopy.go +++ b/generated/latest/apis/supervisor/clientsecret/zz_generated.deepcopy.go @@ -1,5 +1,4 @@ //go:build !ignore_autogenerated -// +build !ignore_autogenerated // Copyright 2020-2023 the Pinniped contributors. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 diff --git a/generated/latest/apis/supervisor/config/v1alpha1/zz_generated.deepcopy.go b/generated/latest/apis/supervisor/config/v1alpha1/zz_generated.deepcopy.go index 682013782..318bb4ec3 100644 --- a/generated/latest/apis/supervisor/config/v1alpha1/zz_generated.deepcopy.go +++ b/generated/latest/apis/supervisor/config/v1alpha1/zz_generated.deepcopy.go @@ -1,5 +1,4 @@ //go:build !ignore_autogenerated -// +build !ignore_autogenerated // Copyright 2020-2023 the Pinniped contributors. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 diff --git a/generated/latest/apis/supervisor/idp/v1alpha1/zz_generated.deepcopy.go b/generated/latest/apis/supervisor/idp/v1alpha1/zz_generated.deepcopy.go index 62cd7d8e5..f9e50dd46 100644 --- a/generated/latest/apis/supervisor/idp/v1alpha1/zz_generated.deepcopy.go +++ b/generated/latest/apis/supervisor/idp/v1alpha1/zz_generated.deepcopy.go @@ -1,5 +1,4 @@ //go:build !ignore_autogenerated -// +build !ignore_autogenerated // Copyright 2020-2023 the Pinniped contributors. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 diff --git a/generated/latest/client/concierge/openapi/zz_generated.openapi.go b/generated/latest/client/concierge/openapi/zz_generated.openapi.go index 6ca76a9b0..7d65fd3f7 100644 --- a/generated/latest/client/concierge/openapi/zz_generated.openapi.go +++ b/generated/latest/client/concierge/openapi/zz_generated.openapi.go @@ -1,5 +1,4 @@ //go:build !ignore_autogenerated -// +build !ignore_autogenerated // Copyright 2020-2023 the Pinniped contributors. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 @@ -29,7 +28,7 @@ func GetOpenAPIDefinitions(ref common.ReferenceCallback) map[string]common.OpenA "go.pinniped.dev/generated/latest/apis/concierge/login/v1alpha1.TokenCredentialRequestList": schema_apis_concierge_login_v1alpha1_TokenCredentialRequestList(ref), "go.pinniped.dev/generated/latest/apis/concierge/login/v1alpha1.TokenCredentialRequestSpec": schema_apis_concierge_login_v1alpha1_TokenCredentialRequestSpec(ref), "go.pinniped.dev/generated/latest/apis/concierge/login/v1alpha1.TokenCredentialRequestStatus": schema_apis_concierge_login_v1alpha1_TokenCredentialRequestStatus(ref), - "k8s.io/api/core/v1.AWSElasticBlockStoreVolumeSource": schema_k8sio_api_core_v1_AWSElasticBlockStoreVolumeSource(ref), + "k8s.io/api/core/v1.AWSElasticBlockStoreVolumeSource": schema_k8sio_api_core_v1_AWSElasticBlockStoreVolumeSource(ref), "k8s.io/api/core/v1.Affinity": schema_k8sio_api_core_v1_Affinity(ref), "k8s.io/api/core/v1.AttachedVolume": schema_k8sio_api_core_v1_AttachedVolume(ref), "k8s.io/api/core/v1.AvoidPods": schema_k8sio_api_core_v1_AvoidPods(ref), diff --git a/generated/latest/client/supervisor/openapi/zz_generated.openapi.go b/generated/latest/client/supervisor/openapi/zz_generated.openapi.go index 6612e5488..d525b9065 100644 --- a/generated/latest/client/supervisor/openapi/zz_generated.openapi.go +++ b/generated/latest/client/supervisor/openapi/zz_generated.openapi.go @@ -1,5 +1,4 @@ //go:build !ignore_autogenerated -// +build !ignore_autogenerated // Copyright 2020-2023 the Pinniped contributors. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 @@ -22,58 +21,58 @@ func GetOpenAPIDefinitions(ref common.ReferenceCallback) map[string]common.OpenA "go.pinniped.dev/generated/latest/apis/supervisor/clientsecret/v1alpha1.OIDCClientSecretRequestList": schema_apis_supervisor_clientsecret_v1alpha1_OIDCClientSecretRequestList(ref), "go.pinniped.dev/generated/latest/apis/supervisor/clientsecret/v1alpha1.OIDCClientSecretRequestSpec": schema_apis_supervisor_clientsecret_v1alpha1_OIDCClientSecretRequestSpec(ref), "go.pinniped.dev/generated/latest/apis/supervisor/clientsecret/v1alpha1.OIDCClientSecretRequestStatus": schema_apis_supervisor_clientsecret_v1alpha1_OIDCClientSecretRequestStatus(ref), - "k8s.io/apimachinery/pkg/apis/meta/v1.APIGroup": schema_pkg_apis_meta_v1_APIGroup(ref), - "k8s.io/apimachinery/pkg/apis/meta/v1.APIGroupList": schema_pkg_apis_meta_v1_APIGroupList(ref), - "k8s.io/apimachinery/pkg/apis/meta/v1.APIResource": schema_pkg_apis_meta_v1_APIResource(ref), - "k8s.io/apimachinery/pkg/apis/meta/v1.APIResourceList": schema_pkg_apis_meta_v1_APIResourceList(ref), - "k8s.io/apimachinery/pkg/apis/meta/v1.APIVersions": schema_pkg_apis_meta_v1_APIVersions(ref), - "k8s.io/apimachinery/pkg/apis/meta/v1.ApplyOptions": schema_pkg_apis_meta_v1_ApplyOptions(ref), - "k8s.io/apimachinery/pkg/apis/meta/v1.Condition": schema_pkg_apis_meta_v1_Condition(ref), - "k8s.io/apimachinery/pkg/apis/meta/v1.CreateOptions": schema_pkg_apis_meta_v1_CreateOptions(ref), - "k8s.io/apimachinery/pkg/apis/meta/v1.DeleteOptions": schema_pkg_apis_meta_v1_DeleteOptions(ref), - "k8s.io/apimachinery/pkg/apis/meta/v1.Duration": schema_pkg_apis_meta_v1_Duration(ref), - "k8s.io/apimachinery/pkg/apis/meta/v1.FieldsV1": schema_pkg_apis_meta_v1_FieldsV1(ref), - "k8s.io/apimachinery/pkg/apis/meta/v1.GetOptions": schema_pkg_apis_meta_v1_GetOptions(ref), - "k8s.io/apimachinery/pkg/apis/meta/v1.GroupKind": schema_pkg_apis_meta_v1_GroupKind(ref), - "k8s.io/apimachinery/pkg/apis/meta/v1.GroupResource": schema_pkg_apis_meta_v1_GroupResource(ref), - "k8s.io/apimachinery/pkg/apis/meta/v1.GroupVersion": schema_pkg_apis_meta_v1_GroupVersion(ref), - "k8s.io/apimachinery/pkg/apis/meta/v1.GroupVersionForDiscovery": schema_pkg_apis_meta_v1_GroupVersionForDiscovery(ref), - "k8s.io/apimachinery/pkg/apis/meta/v1.GroupVersionKind": schema_pkg_apis_meta_v1_GroupVersionKind(ref), - "k8s.io/apimachinery/pkg/apis/meta/v1.GroupVersionResource": schema_pkg_apis_meta_v1_GroupVersionResource(ref), - "k8s.io/apimachinery/pkg/apis/meta/v1.InternalEvent": schema_pkg_apis_meta_v1_InternalEvent(ref), - "k8s.io/apimachinery/pkg/apis/meta/v1.LabelSelector": schema_pkg_apis_meta_v1_LabelSelector(ref), - "k8s.io/apimachinery/pkg/apis/meta/v1.LabelSelectorRequirement": schema_pkg_apis_meta_v1_LabelSelectorRequirement(ref), - "k8s.io/apimachinery/pkg/apis/meta/v1.List": schema_pkg_apis_meta_v1_List(ref), - "k8s.io/apimachinery/pkg/apis/meta/v1.ListMeta": schema_pkg_apis_meta_v1_ListMeta(ref), - "k8s.io/apimachinery/pkg/apis/meta/v1.ListOptions": schema_pkg_apis_meta_v1_ListOptions(ref), - "k8s.io/apimachinery/pkg/apis/meta/v1.ManagedFieldsEntry": schema_pkg_apis_meta_v1_ManagedFieldsEntry(ref), - "k8s.io/apimachinery/pkg/apis/meta/v1.MicroTime": schema_pkg_apis_meta_v1_MicroTime(ref), - "k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta": schema_pkg_apis_meta_v1_ObjectMeta(ref), - "k8s.io/apimachinery/pkg/apis/meta/v1.OwnerReference": schema_pkg_apis_meta_v1_OwnerReference(ref), - "k8s.io/apimachinery/pkg/apis/meta/v1.PartialObjectMetadata": schema_pkg_apis_meta_v1_PartialObjectMetadata(ref), - "k8s.io/apimachinery/pkg/apis/meta/v1.PartialObjectMetadataList": schema_pkg_apis_meta_v1_PartialObjectMetadataList(ref), - "k8s.io/apimachinery/pkg/apis/meta/v1.Patch": schema_pkg_apis_meta_v1_Patch(ref), - "k8s.io/apimachinery/pkg/apis/meta/v1.PatchOptions": schema_pkg_apis_meta_v1_PatchOptions(ref), - "k8s.io/apimachinery/pkg/apis/meta/v1.Preconditions": schema_pkg_apis_meta_v1_Preconditions(ref), - "k8s.io/apimachinery/pkg/apis/meta/v1.RootPaths": schema_pkg_apis_meta_v1_RootPaths(ref), - "k8s.io/apimachinery/pkg/apis/meta/v1.ServerAddressByClientCIDR": schema_pkg_apis_meta_v1_ServerAddressByClientCIDR(ref), - "k8s.io/apimachinery/pkg/apis/meta/v1.Status": schema_pkg_apis_meta_v1_Status(ref), - "k8s.io/apimachinery/pkg/apis/meta/v1.StatusCause": schema_pkg_apis_meta_v1_StatusCause(ref), - "k8s.io/apimachinery/pkg/apis/meta/v1.StatusDetails": schema_pkg_apis_meta_v1_StatusDetails(ref), - "k8s.io/apimachinery/pkg/apis/meta/v1.Table": schema_pkg_apis_meta_v1_Table(ref), - "k8s.io/apimachinery/pkg/apis/meta/v1.TableColumnDefinition": schema_pkg_apis_meta_v1_TableColumnDefinition(ref), - "k8s.io/apimachinery/pkg/apis/meta/v1.TableOptions": schema_pkg_apis_meta_v1_TableOptions(ref), - "k8s.io/apimachinery/pkg/apis/meta/v1.TableRow": schema_pkg_apis_meta_v1_TableRow(ref), - "k8s.io/apimachinery/pkg/apis/meta/v1.TableRowCondition": schema_pkg_apis_meta_v1_TableRowCondition(ref), - "k8s.io/apimachinery/pkg/apis/meta/v1.Time": schema_pkg_apis_meta_v1_Time(ref), - "k8s.io/apimachinery/pkg/apis/meta/v1.Timestamp": schema_pkg_apis_meta_v1_Timestamp(ref), - "k8s.io/apimachinery/pkg/apis/meta/v1.TypeMeta": schema_pkg_apis_meta_v1_TypeMeta(ref), - "k8s.io/apimachinery/pkg/apis/meta/v1.UpdateOptions": schema_pkg_apis_meta_v1_UpdateOptions(ref), - "k8s.io/apimachinery/pkg/apis/meta/v1.WatchEvent": schema_pkg_apis_meta_v1_WatchEvent(ref), - "k8s.io/apimachinery/pkg/runtime.RawExtension": schema_k8sio_apimachinery_pkg_runtime_RawExtension(ref), - "k8s.io/apimachinery/pkg/runtime.TypeMeta": schema_k8sio_apimachinery_pkg_runtime_TypeMeta(ref), - "k8s.io/apimachinery/pkg/runtime.Unknown": schema_k8sio_apimachinery_pkg_runtime_Unknown(ref), - "k8s.io/apimachinery/pkg/version.Info": schema_k8sio_apimachinery_pkg_version_Info(ref), + "k8s.io/apimachinery/pkg/apis/meta/v1.APIGroup": schema_pkg_apis_meta_v1_APIGroup(ref), + "k8s.io/apimachinery/pkg/apis/meta/v1.APIGroupList": schema_pkg_apis_meta_v1_APIGroupList(ref), + "k8s.io/apimachinery/pkg/apis/meta/v1.APIResource": schema_pkg_apis_meta_v1_APIResource(ref), + "k8s.io/apimachinery/pkg/apis/meta/v1.APIResourceList": schema_pkg_apis_meta_v1_APIResourceList(ref), + "k8s.io/apimachinery/pkg/apis/meta/v1.APIVersions": schema_pkg_apis_meta_v1_APIVersions(ref), + "k8s.io/apimachinery/pkg/apis/meta/v1.ApplyOptions": schema_pkg_apis_meta_v1_ApplyOptions(ref), + "k8s.io/apimachinery/pkg/apis/meta/v1.Condition": schema_pkg_apis_meta_v1_Condition(ref), + "k8s.io/apimachinery/pkg/apis/meta/v1.CreateOptions": schema_pkg_apis_meta_v1_CreateOptions(ref), + "k8s.io/apimachinery/pkg/apis/meta/v1.DeleteOptions": schema_pkg_apis_meta_v1_DeleteOptions(ref), + "k8s.io/apimachinery/pkg/apis/meta/v1.Duration": schema_pkg_apis_meta_v1_Duration(ref), + "k8s.io/apimachinery/pkg/apis/meta/v1.FieldsV1": schema_pkg_apis_meta_v1_FieldsV1(ref), + "k8s.io/apimachinery/pkg/apis/meta/v1.GetOptions": schema_pkg_apis_meta_v1_GetOptions(ref), + "k8s.io/apimachinery/pkg/apis/meta/v1.GroupKind": schema_pkg_apis_meta_v1_GroupKind(ref), + "k8s.io/apimachinery/pkg/apis/meta/v1.GroupResource": schema_pkg_apis_meta_v1_GroupResource(ref), + "k8s.io/apimachinery/pkg/apis/meta/v1.GroupVersion": schema_pkg_apis_meta_v1_GroupVersion(ref), + "k8s.io/apimachinery/pkg/apis/meta/v1.GroupVersionForDiscovery": schema_pkg_apis_meta_v1_GroupVersionForDiscovery(ref), + "k8s.io/apimachinery/pkg/apis/meta/v1.GroupVersionKind": schema_pkg_apis_meta_v1_GroupVersionKind(ref), + "k8s.io/apimachinery/pkg/apis/meta/v1.GroupVersionResource": schema_pkg_apis_meta_v1_GroupVersionResource(ref), + "k8s.io/apimachinery/pkg/apis/meta/v1.InternalEvent": schema_pkg_apis_meta_v1_InternalEvent(ref), + "k8s.io/apimachinery/pkg/apis/meta/v1.LabelSelector": schema_pkg_apis_meta_v1_LabelSelector(ref), + "k8s.io/apimachinery/pkg/apis/meta/v1.LabelSelectorRequirement": schema_pkg_apis_meta_v1_LabelSelectorRequirement(ref), + "k8s.io/apimachinery/pkg/apis/meta/v1.List": schema_pkg_apis_meta_v1_List(ref), + "k8s.io/apimachinery/pkg/apis/meta/v1.ListMeta": schema_pkg_apis_meta_v1_ListMeta(ref), + "k8s.io/apimachinery/pkg/apis/meta/v1.ListOptions": schema_pkg_apis_meta_v1_ListOptions(ref), + "k8s.io/apimachinery/pkg/apis/meta/v1.ManagedFieldsEntry": schema_pkg_apis_meta_v1_ManagedFieldsEntry(ref), + "k8s.io/apimachinery/pkg/apis/meta/v1.MicroTime": schema_pkg_apis_meta_v1_MicroTime(ref), + "k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta": schema_pkg_apis_meta_v1_ObjectMeta(ref), + "k8s.io/apimachinery/pkg/apis/meta/v1.OwnerReference": schema_pkg_apis_meta_v1_OwnerReference(ref), + "k8s.io/apimachinery/pkg/apis/meta/v1.PartialObjectMetadata": schema_pkg_apis_meta_v1_PartialObjectMetadata(ref), + "k8s.io/apimachinery/pkg/apis/meta/v1.PartialObjectMetadataList": schema_pkg_apis_meta_v1_PartialObjectMetadataList(ref), + "k8s.io/apimachinery/pkg/apis/meta/v1.Patch": schema_pkg_apis_meta_v1_Patch(ref), + "k8s.io/apimachinery/pkg/apis/meta/v1.PatchOptions": schema_pkg_apis_meta_v1_PatchOptions(ref), + "k8s.io/apimachinery/pkg/apis/meta/v1.Preconditions": schema_pkg_apis_meta_v1_Preconditions(ref), + "k8s.io/apimachinery/pkg/apis/meta/v1.RootPaths": schema_pkg_apis_meta_v1_RootPaths(ref), + "k8s.io/apimachinery/pkg/apis/meta/v1.ServerAddressByClientCIDR": schema_pkg_apis_meta_v1_ServerAddressByClientCIDR(ref), + "k8s.io/apimachinery/pkg/apis/meta/v1.Status": schema_pkg_apis_meta_v1_Status(ref), + "k8s.io/apimachinery/pkg/apis/meta/v1.StatusCause": schema_pkg_apis_meta_v1_StatusCause(ref), + "k8s.io/apimachinery/pkg/apis/meta/v1.StatusDetails": schema_pkg_apis_meta_v1_StatusDetails(ref), + "k8s.io/apimachinery/pkg/apis/meta/v1.Table": schema_pkg_apis_meta_v1_Table(ref), + "k8s.io/apimachinery/pkg/apis/meta/v1.TableColumnDefinition": schema_pkg_apis_meta_v1_TableColumnDefinition(ref), + "k8s.io/apimachinery/pkg/apis/meta/v1.TableOptions": schema_pkg_apis_meta_v1_TableOptions(ref), + "k8s.io/apimachinery/pkg/apis/meta/v1.TableRow": schema_pkg_apis_meta_v1_TableRow(ref), + "k8s.io/apimachinery/pkg/apis/meta/v1.TableRowCondition": schema_pkg_apis_meta_v1_TableRowCondition(ref), + "k8s.io/apimachinery/pkg/apis/meta/v1.Time": schema_pkg_apis_meta_v1_Time(ref), + "k8s.io/apimachinery/pkg/apis/meta/v1.Timestamp": schema_pkg_apis_meta_v1_Timestamp(ref), + "k8s.io/apimachinery/pkg/apis/meta/v1.TypeMeta": schema_pkg_apis_meta_v1_TypeMeta(ref), + "k8s.io/apimachinery/pkg/apis/meta/v1.UpdateOptions": schema_pkg_apis_meta_v1_UpdateOptions(ref), + "k8s.io/apimachinery/pkg/apis/meta/v1.WatchEvent": schema_pkg_apis_meta_v1_WatchEvent(ref), + "k8s.io/apimachinery/pkg/runtime.RawExtension": schema_k8sio_apimachinery_pkg_runtime_RawExtension(ref), + "k8s.io/apimachinery/pkg/runtime.TypeMeta": schema_k8sio_apimachinery_pkg_runtime_TypeMeta(ref), + "k8s.io/apimachinery/pkg/runtime.Unknown": schema_k8sio_apimachinery_pkg_runtime_Unknown(ref), + "k8s.io/apimachinery/pkg/version.Info": schema_k8sio_apimachinery_pkg_version_Info(ref), } } diff --git a/internal/crypto/fips/fips_strict.go b/internal/crypto/fips/fips_strict.go index b0679c302..f9459b625 100644 --- a/internal/crypto/fips/fips_strict.go +++ b/internal/crypto/fips/fips_strict.go @@ -2,7 +2,6 @@ // SPDX-License-Identifier: Apache-2.0 //go:build fips_strict -// +build fips_strict package fips diff --git a/internal/crypto/ptls/default.go b/internal/crypto/ptls/default.go index d929a4eba..98a700155 100644 --- a/internal/crypto/ptls/default.go +++ b/internal/crypto/ptls/default.go @@ -1,8 +1,7 @@ -// Copyright 2021-2022 the Pinniped contributors. All Rights Reserved. +// Copyright 2021-2023 the Pinniped contributors. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 //go:build !fips_strict -// +build !fips_strict package ptls diff --git a/internal/crypto/ptls/fips_strict.go b/internal/crypto/ptls/fips_strict.go index 2db12fcf8..d5039854b 100644 --- a/internal/crypto/ptls/fips_strict.go +++ b/internal/crypto/ptls/fips_strict.go @@ -5,7 +5,6 @@ // configs when Pinniped is built in fips-only mode. // All of these are the same because FIPs is already so limited. //go:build fips_strict -// +build fips_strict package ptls diff --git a/internal/crypto/ptls/old.go b/internal/crypto/ptls/old.go index 0d9ca1966..0848df7d3 100644 --- a/internal/crypto/ptls/old.go +++ b/internal/crypto/ptls/old.go @@ -2,7 +2,6 @@ // SPDX-License-Identifier: Apache-2.0 //go:build !go1.19 -// +build !go1.19 package ptls diff --git a/internal/crypto/ptls/secure.go b/internal/crypto/ptls/secure.go index ddea08166..68e65b0ec 100644 --- a/internal/crypto/ptls/secure.go +++ b/internal/crypto/ptls/secure.go @@ -1,8 +1,7 @@ -// Copyright 2021-2022 the Pinniped contributors. All Rights Reserved. +// Copyright 2021-2023 the Pinniped contributors. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 //go:build !fips_strict -// +build !fips_strict package ptls diff --git a/test/integration/securetls_fips_test.go b/test/integration/securetls_fips_test.go index 19cfea789..5a35ab5ef 100644 --- a/test/integration/securetls_fips_test.go +++ b/test/integration/securetls_fips_test.go @@ -1,8 +1,7 @@ -// Copyright 2021-2022 the Pinniped contributors. All Rights Reserved. +// Copyright 2021-2023 the Pinniped contributors. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 //go:build fips_strict -// +build fips_strict package integration diff --git a/test/testlib/securetls_preference_fips.go b/test/testlib/securetls_preference_fips.go index e61fc2051..3d76932e6 100644 --- a/test/testlib/securetls_preference_fips.go +++ b/test/testlib/securetls_preference_fips.go @@ -1,8 +1,7 @@ -// Copyright 2022 the Pinniped contributors. All Rights Reserved. +// Copyright 2022-2023 the Pinniped contributors. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 //go:build fips_strict -// +build fips_strict package testlib diff --git a/test/testlib/securetls_preference_nonfips.go b/test/testlib/securetls_preference_nonfips.go index 002d329d7..3306a9c1b 100644 --- a/test/testlib/securetls_preference_nonfips.go +++ b/test/testlib/securetls_preference_nonfips.go @@ -1,8 +1,7 @@ -// Copyright 2022 the Pinniped contributors. All Rights Reserved. +// Copyright 2022-2023 the Pinniped contributors. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 //go:build !fips_strict -// +build !fips_strict package testlib From 8fd55a1d813cd5f5cd80cd6004336c118a85a0ef Mon Sep 17 00:00:00 2001 From: Joshua Casey Date: Wed, 30 Aug 2023 16:52:23 -0500 Subject: [PATCH 5/6] Adjust test expectations for compilation differences with 1.21 - Requires some production code changes, to use pointers to function variables instead of pointers to functions --- .../active_directory_upstream_watcher.go | 9 ++- internal/plog/config_test.go | 59 +++++++++++-------- internal/plog/plog_test.go | 54 +++++++++-------- internal/upstreamldap/upstreamldap.go | 3 +- 4 files changed, 71 insertions(+), 54 deletions(-) diff --git a/internal/controller/supervisorconfig/activedirectoryupstreamwatcher/active_directory_upstream_watcher.go b/internal/controller/supervisorconfig/activedirectoryupstreamwatcher/active_directory_upstream_watcher.go index 9cb773b51..150c903a3 100644 --- a/internal/controller/supervisorconfig/activedirectoryupstreamwatcher/active_directory_upstream_watcher.go +++ b/internal/controller/supervisorconfig/activedirectoryupstreamwatcher/active_directory_upstream_watcher.go @@ -387,7 +387,8 @@ func (c *activeDirectoryWatcherController) updateStatus(ctx context.Context, ups } } -func microsoftUUIDFromBinaryAttr(attributeName string) func(entry *ldap.Entry) (string, error) { +//nolint:gochecknoglobals // this needs to be a global variable so that tests can check pointer equality +var microsoftUUIDFromBinaryAttr = func(attributeName string) func(*ldap.Entry) (string, error) { // validation has already been done so we can just get the attribute... return func(entry *ldap.Entry) (string, error) { binaryUUID := entry.GetRawAttributeValue(attributeName) @@ -442,7 +443,8 @@ func getDomainFromDistinguishedName(distinguishedName string) (string, error) { return strings.Join(domainComponents[1:], "."), nil } -func validUserAccountControl(entry *ldap.Entry, _ provider.RefreshAttributes) error { +//nolint:gochecknoglobals // this needs to be a global variable so that tests can check pointer equality +var validUserAccountControl = func(entry *ldap.Entry, _ provider.RefreshAttributes) error { userAccountControl, err := strconv.Atoi(entry.GetAttributeValue(userAccountControlAttribute)) if err != nil { return err @@ -455,7 +457,8 @@ func validUserAccountControl(entry *ldap.Entry, _ provider.RefreshAttributes) er return nil } -func validComputedUserAccountControl(entry *ldap.Entry, _ provider.RefreshAttributes) error { +//nolint:gochecknoglobals // this needs to be a global variable so that tests can check pointer equality +var validComputedUserAccountControl = func(entry *ldap.Entry, _ provider.RefreshAttributes) error { userAccountControl, err := strconv.Atoi(entry.GetAttributeValue(userAccountControlComputedAttribute)) if err != nil { return err diff --git a/internal/plog/config_test.go b/internal/plog/config_test.go index a3e7425e7..4645cb62e 100644 --- a/internal/plog/config_test.go +++ b/internal/plog/config_test.go @@ -11,7 +11,6 @@ import ( "os" "runtime" "strconv" - "strings" "testing" "time" @@ -44,8 +43,6 @@ func TestFormat(t *testing.T) { wd, err := os.Getwd() require.NoError(t, err) - const startLogLine = 47 // make this match the current line number - Info("hello", "happy", "day", "duration", time.Hour+time.Minute) require.True(t, scanner.Scan()) require.NoError(t, scanner.Err()) @@ -57,7 +54,7 @@ func TestFormat(t *testing.T) { "message": "hello", "happy": "day", "duration": "1h1m0s" -}`, wd, startLogLine+2), scanner.Text()) +}`, wd, getLineNumberOfCaller()-11), scanner.Text()) Logr().WithName("burrito").Error(errInvalidLogLevel, "wee", "a", "b") require.True(t, scanner.Scan()) @@ -71,7 +68,7 @@ func TestFormat(t *testing.T) { "a": "b", "error": "invalid log level, valid choices are the empty string, info, debug, trace and all", "logger": "burrito" -}`, wd, startLogLine+2+13), scanner.Text()) +}`, wd, getLineNumberOfCaller()-12), scanner.Text()) Logr().V(klogLevelWarning).Info("hey") // note that this fails to set the custom warning key because it is not via plog require.True(t, scanner.Scan()) @@ -82,7 +79,7 @@ func TestFormat(t *testing.T) { "timestamp": "2022-11-21T23:37:26.953313Z", "caller": "%s/config_test.go:%d$plog.TestFormat", "message": "hey" -}`, wd, startLogLine+2+13+14), scanner.Text()) +}`, wd, getLineNumberOfCaller()-9), scanner.Text()) Warning("bad stuff") // note that this sets the custom warning key because it is via plog require.True(t, scanner.Scan()) @@ -94,7 +91,7 @@ func TestFormat(t *testing.T) { "caller": "%s/config_test.go:%d$plog.TestFormat", "message": "bad stuff", "warning": true -}`, wd, startLogLine+2+13+14+11), scanner.Text()) +}`, wd, getLineNumberOfCaller()-10), scanner.Text()) func() { DebugErr("something happened", errInvalidLogFormat, "an", "item") }() require.True(t, scanner.Scan()) @@ -107,7 +104,7 @@ func TestFormat(t *testing.T) { "message": "something happened", "error": "invalid log format, valid choices are the empty string, json and text", "an": "item" -}`, wd, startLogLine+2+13+14+11+12), scanner.Text()) +}`, wd, getLineNumberOfCaller()-11), scanner.Text()) Trace("should not be logged", "for", "sure") require.Empty(t, buf.String()) @@ -124,11 +121,6 @@ func TestFormat(t *testing.T) { require.True(t, scanner.Scan()) require.NoError(t, scanner.Err()) - line := "1576" - if strings.Contains(runtime.Version(), "1.19") { - line = "1446" - } - require.JSONEq(t, fmt.Sprintf(` { "level": "info", @@ -137,14 +129,14 @@ func TestFormat(t *testing.T) { "message": "has a stack trace!", "logger": "stacky.does", "stacktrace": %s -}`, wd, startLogLine+2+13+14+11+12+24, +}`, wd, getLineNumberOfCaller()-12, strconv.Quote( fmt.Sprintf( `go.pinniped.dev/internal/plog.TestFormat %s/config_test.go:%d testing.tRunner - %s/src/testing/testing.go:%s`, - wd, startLogLine+2+13+14+11+12+24, runtime.GOROOT(), line, + %s/src/testing/testing.go:%d`, + wd, getLineNumberOfCaller()-19, runtime.GOROOT(), getLineNumberOfCaller(2), ), ), ), scanner.Text()) @@ -158,13 +150,13 @@ testing.tRunner require.True(t, scanner.Scan()) require.NoError(t, scanner.Err()) require.Equal(t, fmt.Sprintf(nowStr+` plog/config_test.go:%d something happened {"error": "invalid log format, valid choices are the empty string, json and text", "an": "item"}`, - startLogLine+2+13+14+11+12+24+28+6), scanner.Text()) + getLineNumberOfCaller()-4), scanner.Text()) Logr().WithName("burrito").Error(errInvalidLogLevel, "wee", "a", "b", "slightly less than a year", 363*24*time.Hour, "slightly more than 2 years", 2*367*24*time.Hour) require.True(t, scanner.Scan()) require.NoError(t, scanner.Err()) require.Equal(t, fmt.Sprintf(nowStr+` burrito plog/config_test.go:%d wee {"a": "b", "slightly less than a year": "363d", "slightly more than 2 years": "2y4d", "error": "invalid log level, valid choices are the empty string, info, debug, trace and all"}`, - startLogLine+2+13+14+11+12+24+28+6+6), scanner.Text()) + getLineNumberOfCaller()-4), scanner.Text()) origTimeNow := textlogger.TimeNow t.Cleanup(func() { @@ -190,19 +182,19 @@ testing.tRunner require.True(t, scanner.Scan()) require.NoError(t, scanner.Err()) require.Equal(t, fmt.Sprintf(`I1121 23:37:26.953313%8d config_test.go:%d] "what is happening" does klog="work?"`, - pid, startLogLine+2+13+14+11+12+24+28+6+26+6), scanner.Text()) + pid, getLineNumberOfCaller()-4), scanner.Text()) Logr().WithName("panda").V(KlogLevelDebug).Info("are the best", "yes?", "yes.") require.True(t, scanner.Scan()) require.NoError(t, scanner.Err()) require.Equal(t, fmt.Sprintf(`I1121 23:37:26.953313%8d config_test.go:%d] "panda: are the best" yes?="yes."`, - pid, startLogLine+2+13+14+11+12+24+28+6+26+6+6), scanner.Text()) + pid, getLineNumberOfCaller()-4), scanner.Text()) New().WithName("hi").WithName("there").WithValues("a", 1, "b", 2).Always("do it") require.True(t, scanner.Scan()) require.NoError(t, scanner.Err()) require.Equal(t, fmt.Sprintf(`I1121 23:37:26.953313%8d config_test.go:%d] "hi/there: do it" a=1 b=2`, - pid, startLogLine+2+13+14+11+12+24+28+6+26+6+6+6), scanner.Text()) + pid, getLineNumberOfCaller()-4), scanner.Text()) l := WithValues("x", 33, "z", 22) l.Debug("what to do") @@ -210,17 +202,17 @@ testing.tRunner require.True(t, scanner.Scan()) require.NoError(t, scanner.Err()) require.Equal(t, fmt.Sprintf(`I1121 23:37:26.953313%8d config_test.go:%d] "what to do" x=33 z=22`, - pid, startLogLine+2+13+14+11+12+24+28+6+26+6+6+7+6), scanner.Text()) + pid, getLineNumberOfCaller()-5), scanner.Text()) require.True(t, scanner.Scan()) require.NoError(t, scanner.Err()) require.Equal(t, fmt.Sprintf(`I1121 23:37:26.953313%8d config_test.go:%d] "and why" x=33 z=22`, - pid, startLogLine+2+13+14+11+12+24+28+6+26+6+6+7+1+6), scanner.Text()) + pid, getLineNumberOfCaller()-8), scanner.Text()) old.Always("should be klog text format", "for", "sure") require.True(t, scanner.Scan()) require.NoError(t, scanner.Err()) require.Equal(t, fmt.Sprintf(`I1121 23:37:26.953313%8d config_test.go:%d] "created before mode change: should be klog text format" is="old" for="sure"`, - pid, startLogLine+2+13+14+11+12+24+28+6+26+6+6+7+1+10+6), scanner.Text()) + pid, getLineNumberOfCaller()-4), scanner.Text()) // make sure child loggers do not share state old1 := old.WithValues("i am", "old1") @@ -230,11 +222,11 @@ testing.tRunner require.True(t, scanner.Scan()) require.NoError(t, scanner.Err()) require.Equal(t, fmt.Sprintf(`I1121 23:37:26.953313%8d config_test.go:%d] "created before mode change: warn" is="old" i am="old1" warning=true`, - pid, startLogLine+2+13+14+11+12+24+28+6+26+6+6+7+1+10+9+6), scanner.Text()) + pid, getLineNumberOfCaller()-5), scanner.Text()) require.True(t, scanner.Scan()) require.NoError(t, scanner.Err()) require.Equal(t, fmt.Sprintf(`I1121 23:37:26.953313%8d config_test.go:%d] "created before mode change/old2: info" is="old"`, - pid, startLogLine+2+13+14+11+12+24+28+6+26+6+6+7+1+10+9+1+6), scanner.Text()) + pid, getLineNumberOfCaller()-8), scanner.Text()) Trace("should not be logged", "for", "sure") require.Empty(t, buf.String()) @@ -364,3 +356,18 @@ func getKlogLevel() klog.Level { return -1 } + +// getLineNumberOfCaller returns the line number of the source code that invoked this function. +// If maybeSkip is provided, returns the line number from a different point in the call stack. +// This is useful to test log output that prints a call stack with line numbers. +func getLineNumberOfCaller(maybeSkip ...int) int { + skip := 1 + if len(maybeSkip) > 0 { + skip = maybeSkip[0] + } + + if _, _, line, ok := runtime.Caller(skip); ok { + return line + } + return -1 +} diff --git a/internal/plog/plog_test.go b/internal/plog/plog_test.go index c873747ed..c0d1007fb 100644 --- a/internal/plog/plog_test.go +++ b/internal/plog/plog_test.go @@ -6,6 +6,7 @@ package plog import ( "bytes" "fmt" + "runtime" "strings" "testing" "time" @@ -156,17 +157,17 @@ func TestPlog(t *testing.T) { testAllPlogMethods(l.withDepth(2)) }, want: ` -{"level":"error","timestamp":"2099-08-08T13:57:36.123456Z","caller":"plog/plog_test.go:$plog.TestPlog.func15","message":"e","panda":2,"error":"some err"} -{"level":"info","timestamp":"2099-08-08T13:57:36.123456Z","caller":"plog/plog_test.go:$plog.TestPlog.func15","message":"w","warning":true,"panda":2} -{"level":"info","timestamp":"2099-08-08T13:57:36.123456Z","caller":"plog/plog_test.go:$plog.TestPlog.func15","message":"we","warning":true,"error":"some err","panda":2} -{"level":"info","timestamp":"2099-08-08T13:57:36.123456Z","caller":"plog/plog_test.go:$plog.TestPlog.func15","message":"i","panda":2} -{"level":"info","timestamp":"2099-08-08T13:57:36.123456Z","caller":"plog/plog_test.go:$plog.TestPlog.func15","message":"ie","error":"some err","panda":2} -{"level":"debug","timestamp":"2099-08-08T13:57:36.123456Z","caller":"plog/plog_test.go:$plog.TestPlog.func15","message":"d","panda":2} -{"level":"debug","timestamp":"2099-08-08T13:57:36.123456Z","caller":"plog/plog_test.go:$plog.TestPlog.func15","message":"de","error":"some err","panda":2} -{"level":"trace","timestamp":"2099-08-08T13:57:36.123456Z","caller":"plog/plog_test.go:$plog.TestPlog.func15","message":"t","panda":2} -{"level":"trace","timestamp":"2099-08-08T13:57:36.123456Z","caller":"plog/plog_test.go:$plog.TestPlog.func15","message":"te","error":"some err","panda":2} -{"level":"all","timestamp":"2099-08-08T13:57:36.123456Z","caller":"plog/plog_test.go:$plog.TestPlog.func15","message":"all","panda":2} -{"level":"info","timestamp":"2099-08-08T13:57:36.123456Z","caller":"plog/plog_test.go:$plog.TestPlog.func15","message":"always","panda":2} +{"level":"error","timestamp":"2099-08-08T13:57:36.123456Z","caller":"plog/plog_test.go:$plog.TestPlog.func16","message":"e","panda":2,"error":"some err"} +{"level":"info","timestamp":"2099-08-08T13:57:36.123456Z","caller":"plog/plog_test.go:$plog.TestPlog.func16","message":"w","warning":true,"panda":2} +{"level":"info","timestamp":"2099-08-08T13:57:36.123456Z","caller":"plog/plog_test.go:$plog.TestPlog.func16","message":"we","warning":true,"error":"some err","panda":2} +{"level":"info","timestamp":"2099-08-08T13:57:36.123456Z","caller":"plog/plog_test.go:$plog.TestPlog.func16","message":"i","panda":2} +{"level":"info","timestamp":"2099-08-08T13:57:36.123456Z","caller":"plog/plog_test.go:$plog.TestPlog.func16","message":"ie","error":"some err","panda":2} +{"level":"debug","timestamp":"2099-08-08T13:57:36.123456Z","caller":"plog/plog_test.go:$plog.TestPlog.func16","message":"d","panda":2} +{"level":"debug","timestamp":"2099-08-08T13:57:36.123456Z","caller":"plog/plog_test.go:$plog.TestPlog.func16","message":"de","error":"some err","panda":2} +{"level":"trace","timestamp":"2099-08-08T13:57:36.123456Z","caller":"plog/plog_test.go:$plog.TestPlog.func16","message":"t","panda":2} +{"level":"trace","timestamp":"2099-08-08T13:57:36.123456Z","caller":"plog/plog_test.go:$plog.TestPlog.func16","message":"te","error":"some err","panda":2} +{"level":"all","timestamp":"2099-08-08T13:57:36.123456Z","caller":"plog/plog_test.go:$plog.TestPlog.func16","message":"all","panda":2} +{"level":"info","timestamp":"2099-08-08T13:57:36.123456Z","caller":"plog/plog_test.go:$plog.TestPlog.func16","message":"always","panda":2} `, }, { @@ -284,19 +285,24 @@ func TestPlog(t *testing.T) { }() }() }, - want: ` -{"level":"error","timestamp":"2099-08-08T13:57:36.123456Z","caller":"plog/plog_test.go:$plog.TestPlog.func13.1.1","message":"e","panda":2,"error":"some err"} -{"level":"info","timestamp":"2099-08-08T13:57:36.123456Z","caller":"plog/plog_test.go:$plog.TestPlog.func13.1.1","message":"w","warning":true,"panda":2} -{"level":"info","timestamp":"2099-08-08T13:57:36.123456Z","caller":"plog/plog_test.go:$plog.TestPlog.func13.1.1","message":"we","warning":true,"error":"some err","panda":2} -{"level":"info","timestamp":"2099-08-08T13:57:36.123456Z","caller":"plog/plog_test.go:$plog.TestPlog.func13.1.1","message":"i","panda":2} -{"level":"info","timestamp":"2099-08-08T13:57:36.123456Z","caller":"plog/plog_test.go:$plog.TestPlog.func13.1.1","message":"ie","error":"some err","panda":2} -{"level":"debug","timestamp":"2099-08-08T13:57:36.123456Z","caller":"plog/plog_test.go:$plog.TestPlog.func13.1.1","message":"d","panda":2} -{"level":"debug","timestamp":"2099-08-08T13:57:36.123456Z","caller":"plog/plog_test.go:$plog.TestPlog.func13.1.1","message":"de","error":"some err","panda":2} -{"level":"trace","timestamp":"2099-08-08T13:57:36.123456Z","caller":"plog/plog_test.go:$plog.TestPlog.func13.1.1","message":"t","panda":2} -{"level":"trace","timestamp":"2099-08-08T13:57:36.123456Z","caller":"plog/plog_test.go:$plog.TestPlog.func13.1.1","message":"te","error":"some err","panda":2} -{"level":"all","timestamp":"2099-08-08T13:57:36.123456Z","caller":"plog/plog_test.go:$plog.TestPlog.func13.1.1","message":"all","panda":2} -{"level":"info","timestamp":"2099-08-08T13:57:36.123456Z","caller":"plog/plog_test.go:$plog.TestPlog.func13.1.1","message":"always","panda":2} -`, + want: fmt.Sprintf(` +{"level":"error","timestamp":"2099-08-08T13:57:36.123456Z","caller":"plog/plog_test.go:$plog.TestPlog.%[1]s","message":"e","panda":2,"error":"some err"} +{"level":"info","timestamp":"2099-08-08T13:57:36.123456Z","caller":"plog/plog_test.go:$plog.TestPlog.%[1]s","message":"w","warning":true,"panda":2} +{"level":"info","timestamp":"2099-08-08T13:57:36.123456Z","caller":"plog/plog_test.go:$plog.TestPlog.%[1]s","message":"we","warning":true,"error":"some err","panda":2} +{"level":"info","timestamp":"2099-08-08T13:57:36.123456Z","caller":"plog/plog_test.go:$plog.TestPlog.%[1]s","message":"i","panda":2} +{"level":"info","timestamp":"2099-08-08T13:57:36.123456Z","caller":"plog/plog_test.go:$plog.TestPlog.%[1]s","message":"ie","error":"some err","panda":2} +{"level":"debug","timestamp":"2099-08-08T13:57:36.123456Z","caller":"plog/plog_test.go:$plog.TestPlog.%[1]s","message":"d","panda":2} +{"level":"debug","timestamp":"2099-08-08T13:57:36.123456Z","caller":"plog/plog_test.go:$plog.TestPlog.%[1]s","message":"de","error":"some err","panda":2} +{"level":"trace","timestamp":"2099-08-08T13:57:36.123456Z","caller":"plog/plog_test.go:$plog.TestPlog.%[1]s","message":"t","panda":2} +{"level":"trace","timestamp":"2099-08-08T13:57:36.123456Z","caller":"plog/plog_test.go:$plog.TestPlog.%[1]s","message":"te","error":"some err","panda":2} +{"level":"all","timestamp":"2099-08-08T13:57:36.123456Z","caller":"plog/plog_test.go:$plog.TestPlog.%[1]s","message":"all","panda":2} +{"level":"info","timestamp":"2099-08-08T13:57:36.123456Z","caller":"plog/plog_test.go:$plog.TestPlog.%[1]s","message":"always","panda":2} +`, func() string { + if strings.Contains(runtime.Version(), "1.21") { + return "func13.TestPlog.func13.1.func2" + } + return "func13.1.1" + }()), }, { name: "closure depth -1", diff --git a/internal/upstreamldap/upstreamldap.go b/internal/upstreamldap/upstreamldap.go index bbf645c17..6488cca1f 100644 --- a/internal/upstreamldap/upstreamldap.go +++ b/internal/upstreamldap/upstreamldap.go @@ -871,7 +871,8 @@ func (p *Provider) traceRefreshFailure(t *trace.Trace, err error) { ) } -func AttributeUnchangedSinceLogin(attribute string) func(*ldap.Entry, provider.RefreshAttributes) error { +//nolint:gochecknoglobals // this needs to be a global variable so that tests can check pointer equality +var AttributeUnchangedSinceLogin = func(attribute string) func(*ldap.Entry, provider.RefreshAttributes) error { return func(entry *ldap.Entry, storedAttributes provider.RefreshAttributes) error { prevAttributeValue := storedAttributes.AdditionalAttributes[attribute] newValues := entry.GetRawAttributeValues(attribute) From cd91edf26c1ba5ef5f4b1684007eb4b5bd3c0357 Mon Sep 17 00:00:00 2001 From: Joshua Casey Date: Wed, 30 Aug 2023 16:34:03 -0500 Subject: [PATCH 6/6] [LDAP] move attributeUnchangedSinceLogin from upstreamldap to activedirectoryupstreamwatcher --- .../active_directory_upstream_watcher.go | 20 +++- .../active_directory_upstream_watcher_test.go | 104 +++++++++++++++--- internal/upstreamldap/upstreamldap.go | 17 --- internal/upstreamldap/upstreamldap_test.go | 86 ++------------- 4 files changed, 117 insertions(+), 110 deletions(-) diff --git a/internal/controller/supervisorconfig/activedirectoryupstreamwatcher/active_directory_upstream_watcher.go b/internal/controller/supervisorconfig/activedirectoryupstreamwatcher/active_directory_upstream_watcher.go index 150c903a3..a375361d9 100644 --- a/internal/controller/supervisorconfig/activedirectoryupstreamwatcher/active_directory_upstream_watcher.go +++ b/internal/controller/supervisorconfig/activedirectoryupstreamwatcher/active_directory_upstream_watcher.go @@ -6,6 +6,7 @@ package activedirectoryupstreamwatcher import ( "context" + "encoding/base64" "fmt" "regexp" "strconv" @@ -344,7 +345,7 @@ func (c *activeDirectoryWatcherController) validateUpstream(ctx context.Context, "objectGUID": microsoftUUIDFromBinaryAttr("objectGUID"), }, RefreshAttributeChecks: map[string]func(*ldap.Entry, provider.RefreshAttributes) error{ - pwdLastSetAttribute: upstreamldap.AttributeUnchangedSinceLogin(pwdLastSetAttribute), + pwdLastSetAttribute: attributeUnchangedSinceLogin(pwdLastSetAttribute), userAccountControlAttribute: validUserAccountControl, userAccountControlComputedAttribute: validComputedUserAccountControl, }, @@ -470,3 +471,20 @@ var validComputedUserAccountControl = func(entry *ldap.Entry, _ provider.Refresh } return nil } + +//nolint:gochecknoglobals // this needs to be a global variable so that tests can check pointer equality +var attributeUnchangedSinceLogin = func(attribute string) func(*ldap.Entry, provider.RefreshAttributes) error { + return func(entry *ldap.Entry, storedAttributes provider.RefreshAttributes) error { + prevAttributeValue := storedAttributes.AdditionalAttributes[attribute] + newValues := entry.GetRawAttributeValues(attribute) + + if len(newValues) != 1 { + return fmt.Errorf(`expected to find 1 value for %q attribute, but found %d`, attribute, len(newValues)) + } + encodedNewValue := base64.RawURLEncoding.EncodeToString(newValues[0]) + if prevAttributeValue != encodedNewValue { + return fmt.Errorf(`value for attribute %q has changed since initial value at login`, attribute) + } + return nil + } +} diff --git a/internal/controller/supervisorconfig/activedirectoryupstreamwatcher/active_directory_upstream_watcher_test.go b/internal/controller/supervisorconfig/activedirectoryupstreamwatcher/active_directory_upstream_watcher_test.go index 9d8d88404..40ee4a4c9 100644 --- a/internal/controller/supervisorconfig/activedirectoryupstreamwatcher/active_directory_upstream_watcher_test.go +++ b/internal/controller/supervisorconfig/activedirectoryupstreamwatcher/active_directory_upstream_watcher_test.go @@ -230,7 +230,7 @@ func TestActiveDirectoryUpstreamWatcherControllerSync(t *testing.T) { }, UIDAttributeParsingOverrides: map[string]func(*ldap.Entry) (string, error){"objectGUID": microsoftUUIDFromBinaryAttr("objectGUID")}, RefreshAttributeChecks: map[string]func(*ldap.Entry, provider.RefreshAttributes) error{ - "pwdLastSet": upstreamldap.AttributeUnchangedSinceLogin("pwdLastSet"), + "pwdLastSet": attributeUnchangedSinceLogin("pwdLastSet"), "userAccountControl": validUserAccountControl, "msDS-User-Account-Control-Computed": validComputedUserAccountControl, }, @@ -573,7 +573,7 @@ func TestActiveDirectoryUpstreamWatcherControllerSync(t *testing.T) { }, UIDAttributeParsingOverrides: map[string]func(*ldap.Entry) (string, error){"objectGUID": microsoftUUIDFromBinaryAttr("objectGUID")}, RefreshAttributeChecks: map[string]func(*ldap.Entry, provider.RefreshAttributes) error{ - "pwdLastSet": upstreamldap.AttributeUnchangedSinceLogin("pwdLastSet"), + "pwdLastSet": attributeUnchangedSinceLogin("pwdLastSet"), "userAccountControl": validUserAccountControl, "msDS-User-Account-Control-Computed": validComputedUserAccountControl, }, @@ -643,7 +643,7 @@ func TestActiveDirectoryUpstreamWatcherControllerSync(t *testing.T) { }, UIDAttributeParsingOverrides: map[string]func(*ldap.Entry) (string, error){"objectGUID": microsoftUUIDFromBinaryAttr("objectGUID")}, RefreshAttributeChecks: map[string]func(*ldap.Entry, provider.RefreshAttributes) error{ - "pwdLastSet": upstreamldap.AttributeUnchangedSinceLogin("pwdLastSet"), + "pwdLastSet": attributeUnchangedSinceLogin("pwdLastSet"), "userAccountControl": validUserAccountControl, "msDS-User-Account-Control-Computed": validComputedUserAccountControl, }, @@ -716,7 +716,7 @@ func TestActiveDirectoryUpstreamWatcherControllerSync(t *testing.T) { }, UIDAttributeParsingOverrides: map[string]func(*ldap.Entry) (string, error){"objectGUID": microsoftUUIDFromBinaryAttr("objectGUID")}, RefreshAttributeChecks: map[string]func(*ldap.Entry, provider.RefreshAttributes) error{ - "pwdLastSet": upstreamldap.AttributeUnchangedSinceLogin("pwdLastSet"), + "pwdLastSet": attributeUnchangedSinceLogin("pwdLastSet"), "userAccountControl": validUserAccountControl, "msDS-User-Account-Control-Computed": validComputedUserAccountControl, }, @@ -796,7 +796,7 @@ func TestActiveDirectoryUpstreamWatcherControllerSync(t *testing.T) { }, UIDAttributeParsingOverrides: map[string]func(*ldap.Entry) (string, error){"objectGUID": microsoftUUIDFromBinaryAttr("objectGUID")}, RefreshAttributeChecks: map[string]func(*ldap.Entry, provider.RefreshAttributes) error{ - "pwdLastSet": upstreamldap.AttributeUnchangedSinceLogin("pwdLastSet"), + "pwdLastSet": attributeUnchangedSinceLogin("pwdLastSet"), "userAccountControl": validUserAccountControl, "msDS-User-Account-Control-Computed": validComputedUserAccountControl, }, @@ -860,7 +860,7 @@ func TestActiveDirectoryUpstreamWatcherControllerSync(t *testing.T) { }, UIDAttributeParsingOverrides: map[string]func(*ldap.Entry) (string, error){"objectGUID": microsoftUUIDFromBinaryAttr("objectGUID")}, RefreshAttributeChecks: map[string]func(*ldap.Entry, provider.RefreshAttributes) error{ - "pwdLastSet": upstreamldap.AttributeUnchangedSinceLogin("pwdLastSet"), + "pwdLastSet": attributeUnchangedSinceLogin("pwdLastSet"), "userAccountControl": validUserAccountControl, "msDS-User-Account-Control-Computed": validComputedUserAccountControl, }, @@ -1011,7 +1011,7 @@ func TestActiveDirectoryUpstreamWatcherControllerSync(t *testing.T) { }, UIDAttributeParsingOverrides: map[string]func(*ldap.Entry) (string, error){"objectGUID": microsoftUUIDFromBinaryAttr("objectGUID")}, RefreshAttributeChecks: map[string]func(*ldap.Entry, provider.RefreshAttributes) error{ - "pwdLastSet": upstreamldap.AttributeUnchangedSinceLogin("pwdLastSet"), + "pwdLastSet": attributeUnchangedSinceLogin("pwdLastSet"), "userAccountControl": validUserAccountControl, "msDS-User-Account-Control-Computed": validComputedUserAccountControl, }, @@ -1161,7 +1161,7 @@ func TestActiveDirectoryUpstreamWatcherControllerSync(t *testing.T) { }, UIDAttributeParsingOverrides: map[string]func(*ldap.Entry) (string, error){"objectGUID": microsoftUUIDFromBinaryAttr("objectGUID")}, RefreshAttributeChecks: map[string]func(*ldap.Entry, provider.RefreshAttributes) error{ - "pwdLastSet": upstreamldap.AttributeUnchangedSinceLogin("pwdLastSet"), + "pwdLastSet": attributeUnchangedSinceLogin("pwdLastSet"), "userAccountControl": validUserAccountControl, "msDS-User-Account-Control-Computed": validComputedUserAccountControl, }}, @@ -1233,7 +1233,7 @@ func TestActiveDirectoryUpstreamWatcherControllerSync(t *testing.T) { }, UIDAttributeParsingOverrides: map[string]func(*ldap.Entry) (string, error){"objectGUID": microsoftUUIDFromBinaryAttr("objectGUID")}, RefreshAttributeChecks: map[string]func(*ldap.Entry, provider.RefreshAttributes) error{ - "pwdLastSet": upstreamldap.AttributeUnchangedSinceLogin("pwdLastSet"), + "pwdLastSet": attributeUnchangedSinceLogin("pwdLastSet"), "userAccountControl": validUserAccountControl, "msDS-User-Account-Control-Computed": validComputedUserAccountControl, }, @@ -1500,7 +1500,7 @@ func TestActiveDirectoryUpstreamWatcherControllerSync(t *testing.T) { UIDAttributeParsingOverrides: map[string]func(*ldap.Entry) (string, error){"objectGUID": microsoftUUIDFromBinaryAttr("objectGUID")}, GroupAttributeParsingOverrides: map[string]func(*ldap.Entry) (string, error){"sAMAccountName": groupSAMAccountNameWithDomainSuffix}, RefreshAttributeChecks: map[string]func(*ldap.Entry, provider.RefreshAttributes) error{ - "pwdLastSet": upstreamldap.AttributeUnchangedSinceLogin("pwdLastSet"), + "pwdLastSet": attributeUnchangedSinceLogin("pwdLastSet"), "userAccountControl": validUserAccountControl, "msDS-User-Account-Control-Computed": validComputedUserAccountControl, }, @@ -1560,7 +1560,7 @@ func TestActiveDirectoryUpstreamWatcherControllerSync(t *testing.T) { }, UIDAttributeParsingOverrides: map[string]func(*ldap.Entry) (string, error){"objectGUID": microsoftUUIDFromBinaryAttr("objectGUID")}, RefreshAttributeChecks: map[string]func(*ldap.Entry, provider.RefreshAttributes) error{ - "pwdLastSet": upstreamldap.AttributeUnchangedSinceLogin("pwdLastSet"), + "pwdLastSet": attributeUnchangedSinceLogin("pwdLastSet"), "userAccountControl": validUserAccountControl, "msDS-User-Account-Control-Computed": validComputedUserAccountControl, }, @@ -1624,7 +1624,7 @@ func TestActiveDirectoryUpstreamWatcherControllerSync(t *testing.T) { }, UIDAttributeParsingOverrides: map[string]func(*ldap.Entry) (string, error){"objectGUID": microsoftUUIDFromBinaryAttr("objectGUID")}, RefreshAttributeChecks: map[string]func(*ldap.Entry, provider.RefreshAttributes) error{ - "pwdLastSet": upstreamldap.AttributeUnchangedSinceLogin("pwdLastSet"), + "pwdLastSet": attributeUnchangedSinceLogin("pwdLastSet"), "userAccountControl": validUserAccountControl, "msDS-User-Account-Control-Computed": validComputedUserAccountControl, }, @@ -1688,7 +1688,7 @@ func TestActiveDirectoryUpstreamWatcherControllerSync(t *testing.T) { }, UIDAttributeParsingOverrides: map[string]func(*ldap.Entry) (string, error){"objectGUID": microsoftUUIDFromBinaryAttr("objectGUID")}, RefreshAttributeChecks: map[string]func(*ldap.Entry, provider.RefreshAttributes) error{ - "pwdLastSet": upstreamldap.AttributeUnchangedSinceLogin("pwdLastSet"), + "pwdLastSet": attributeUnchangedSinceLogin("pwdLastSet"), "userAccountControl": validUserAccountControl, "msDS-User-Account-Control-Computed": validComputedUserAccountControl, }, @@ -1900,7 +1900,7 @@ func TestActiveDirectoryUpstreamWatcherControllerSync(t *testing.T) { }, UIDAttributeParsingOverrides: map[string]func(*ldap.Entry) (string, error){"objectGUID": microsoftUUIDFromBinaryAttr("objectGUID")}, RefreshAttributeChecks: map[string]func(*ldap.Entry, provider.RefreshAttributes) error{ - "pwdLastSet": upstreamldap.AttributeUnchangedSinceLogin("pwdLastSet"), + "pwdLastSet": attributeUnchangedSinceLogin("pwdLastSet"), "userAccountControl": validUserAccountControl, "msDS-User-Account-Control-Computed": validComputedUserAccountControl, }, @@ -1963,7 +1963,7 @@ func TestActiveDirectoryUpstreamWatcherControllerSync(t *testing.T) { }, UIDAttributeParsingOverrides: map[string]func(*ldap.Entry) (string, error){"objectGUID": microsoftUUIDFromBinaryAttr("objectGUID")}, RefreshAttributeChecks: map[string]func(*ldap.Entry, provider.RefreshAttributes) error{ - "pwdLastSet": upstreamldap.AttributeUnchangedSinceLogin("pwdLastSet"), + "pwdLastSet": attributeUnchangedSinceLogin("pwdLastSet"), "userAccountControl": validUserAccountControl, "msDS-User-Account-Control-Computed": validComputedUserAccountControl, }, @@ -2426,3 +2426,77 @@ func TestValidComputedUserAccountControl(t *testing.T) { }) } } + +func TestAttributeUnchangedSinceLogin(t *testing.T) { + initialVal := "some-attribute-value" + changedVal := "some-different-attribute-value" + attributeName := "some-attribute-name" + tests := []struct { + name string + entry *ldap.Entry + wantResult bool + wantErr string + }{ + { + name: "happy path where value has not changed since login", + entry: &ldap.Entry{ + DN: "some-dn", + Attributes: []*ldap.EntryAttribute{ + { + Name: attributeName, + Values: []string{initialVal}, + ByteValues: [][]byte{[]byte(initialVal)}, + }, + }, + }, + }, + { + name: "password has been reset since login", + entry: &ldap.Entry{ + DN: "some-dn", + Attributes: []*ldap.EntryAttribute{ + { + Name: attributeName, + Values: []string{changedVal}, + ByteValues: [][]byte{[]byte(changedVal)}, + }, + }, + }, + wantErr: "value for attribute \"some-attribute-name\" has changed since initial value at login", + }, + { + name: "no value for attribute attribute", + entry: &ldap.Entry{ + DN: "some-dn", + Attributes: []*ldap.EntryAttribute{}, + }, + wantErr: "expected to find 1 value for \"some-attribute-name\" attribute, but found 0", + }, + { + name: "too many values for attribute", + entry: &ldap.Entry{ + DN: "some-dn", + Attributes: []*ldap.EntryAttribute{ + { + Name: attributeName, + ByteValues: [][]byte{[]byte("val1"), []byte("val2")}, + }, + }, + }, + wantErr: "expected to find 1 value for \"some-attribute-name\" attribute, but found 2", + }, + } + for _, test := range tests { + tt := test + t.Run(tt.name, func(t *testing.T) { + initialValRawEncoded := base64.RawURLEncoding.EncodeToString([]byte(initialVal)) + err := attributeUnchangedSinceLogin(attributeName)(tt.entry, provider.RefreshAttributes{AdditionalAttributes: map[string]string{attributeName: initialValRawEncoded}}) + if tt.wantErr != "" { + require.Error(t, err) + require.Equal(t, tt.wantErr, err.Error()) + } else { + require.NoError(t, err) + } + }) + } +} diff --git a/internal/upstreamldap/upstreamldap.go b/internal/upstreamldap/upstreamldap.go index 6488cca1f..beb6a037e 100644 --- a/internal/upstreamldap/upstreamldap.go +++ b/internal/upstreamldap/upstreamldap.go @@ -870,20 +870,3 @@ func (p *Provider) traceRefreshFailure(t *trace.Trace, err error) { trace.Field{Key: "reason", Value: err.Error()}, ) } - -//nolint:gochecknoglobals // this needs to be a global variable so that tests can check pointer equality -var AttributeUnchangedSinceLogin = func(attribute string) func(*ldap.Entry, provider.RefreshAttributes) error { - return func(entry *ldap.Entry, storedAttributes provider.RefreshAttributes) error { - prevAttributeValue := storedAttributes.AdditionalAttributes[attribute] - newValues := entry.GetRawAttributeValues(attribute) - - if len(newValues) != 1 { - return fmt.Errorf(`expected to find 1 value for %q attribute, but found %d`, attribute, len(newValues)) - } - encodedNewValue := base64.RawURLEncoding.EncodeToString(newValues[0]) - if prevAttributeValue != encodedNewValue { - return fmt.Errorf(`value for attribute %q has changed since initial value at login`, attribute) - } - return nil - } -} diff --git a/internal/upstreamldap/upstreamldap_test.go b/internal/upstreamldap/upstreamldap_test.go index c6d1d1269..7de3f8282 100644 --- a/internal/upstreamldap/upstreamldap_test.go +++ b/internal/upstreamldap/upstreamldap_test.go @@ -1576,7 +1576,7 @@ func TestUpstreamRefresh(t *testing.T) { GroupNameAttribute: testGroupSearchGroupNameAttribute, }, RefreshAttributeChecks: map[string]func(*ldap.Entry, provider.RefreshAttributes) error{ - pwdLastSetAttribute: AttributeUnchangedSinceLogin(pwdLastSetAttribute), + pwdLastSetAttribute: func(*ldap.Entry, provider.RefreshAttributes) error { return nil }, }, } if editFunc != nil { @@ -2200,8 +2200,14 @@ func TestUpstreamRefresh(t *testing.T) { wantErr: "found 2 values for attribute \"some-upstream-uid-attribute\" while searching for user \"some-upstream-user-dn\", but expected 1 result", }, { - name: "search result has a changed pwdLastSet value", - providerConfig: providerConfig(nil), + name: "search result has a changed pwdLastSet value", + providerConfig: providerConfig(func(p *ProviderConfig) { + p.RefreshAttributeChecks = map[string]func(*ldap.Entry, provider.RefreshAttributes) error{ + pwdLastSetAttribute: func(*ldap.Entry, provider.RefreshAttributes) error { + return errors.New(`value for attribute "pwdLastSet" has changed since initial value at login`) + }, + } + }), setupMocks: func(conn *mockldapconn.MockConn) { conn.EXPECT().Bind(testBindUsername, testBindPassword).Times(1) conn.EXPECT().Search(expectedUserSearch(nil)).Return(&ldap.SearchResult{ @@ -2588,77 +2594,3 @@ func TestRealTLSDialing(t *testing.T) { }) } } - -func TestAttributeUnchangedSinceLogin(t *testing.T) { - initialVal := "some-attribute-value" - changedVal := "some-different-attribute-value" - attributeName := "some-attribute-name" - tests := []struct { - name string - entry *ldap.Entry - wantResult bool - wantErr string - }{ - { - name: "happy path where value has not changed since login", - entry: &ldap.Entry{ - DN: "some-dn", - Attributes: []*ldap.EntryAttribute{ - { - Name: attributeName, - Values: []string{initialVal}, - ByteValues: [][]byte{[]byte(initialVal)}, - }, - }, - }, - }, - { - name: "password has been reset since login", - entry: &ldap.Entry{ - DN: "some-dn", - Attributes: []*ldap.EntryAttribute{ - { - Name: attributeName, - Values: []string{changedVal}, - ByteValues: [][]byte{[]byte(changedVal)}, - }, - }, - }, - wantErr: "value for attribute \"some-attribute-name\" has changed since initial value at login", - }, - { - name: "no value for attribute attribute", - entry: &ldap.Entry{ - DN: "some-dn", - Attributes: []*ldap.EntryAttribute{}, - }, - wantErr: "expected to find 1 value for \"some-attribute-name\" attribute, but found 0", - }, - { - name: "too many values for attribute", - entry: &ldap.Entry{ - DN: "some-dn", - Attributes: []*ldap.EntryAttribute{ - { - Name: attributeName, - ByteValues: [][]byte{[]byte("val1"), []byte("val2")}, - }, - }, - }, - wantErr: "expected to find 1 value for \"some-attribute-name\" attribute, but found 2", - }, - } - for _, test := range tests { - tt := test - t.Run(tt.name, func(t *testing.T) { - initialValRawEncoded := base64.RawURLEncoding.EncodeToString([]byte(initialVal)) - err := AttributeUnchangedSinceLogin(attributeName)(tt.entry, provider.RefreshAttributes{AdditionalAttributes: map[string]string{attributeName: initialValRawEncoded}}) - if tt.wantErr != "" { - require.Error(t, err) - require.Equal(t, tt.wantErr, err.Error()) - } else { - require.NoError(t, err) - } - }) - } -}