mirror of
				https://github.com/optim-enterprises-bv/kubernetes.git
				synced 2025-11-04 04:08:16 +00:00 
			
		
		
		
	feat: add missing SOCKS5 features
Goal of this commit is to add some missing features when the Kubernetes API is accessed through a SOCKS5 proxy. That's for example the case when port-forwarding is used (`kubectl port-forward`) or when exec'ing inside a container (`kubectl exec`), with this commit it'll now be possible to use both. Signed-off-by: Romain Aviolat <romain.aviolat@kudelskisecurity.com> Signed-off-by: Romain Jufer <romain.jufer@kudelskisecurity.com>
This commit is contained in:
		
							
								
								
									
										24
									
								
								LICENSES/vendor/github.com/armon/go-socks5/LICENSE
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								LICENSES/vendor/github.com/armon/go-socks5/LICENSE
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,24 @@
 | 
			
		||||
= vendor/github.com/armon/go-socks5 licensed under: =
 | 
			
		||||
 | 
			
		||||
The MIT License (MIT)
 | 
			
		||||
 | 
			
		||||
Copyright (c) 2014 Armon Dadgar
 | 
			
		||||
 | 
			
		||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
 | 
			
		||||
this software and associated documentation files (the "Software"), to deal in
 | 
			
		||||
the Software without restriction, including without limitation the rights to
 | 
			
		||||
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
 | 
			
		||||
the Software, and to permit persons to whom the Software is furnished to do so,
 | 
			
		||||
subject to the following conditions:
 | 
			
		||||
 | 
			
		||||
The above copyright notice and this permission notice shall be included in all
 | 
			
		||||
copies or substantial portions of the Software.
 | 
			
		||||
 | 
			
		||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 | 
			
		||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
 | 
			
		||||
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
 | 
			
		||||
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
 | 
			
		||||
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 | 
			
		||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 | 
			
		||||
 | 
			
		||||
= vendor/github.com/armon/go-socks5/LICENSE cb04212e101fbbd028f325e04ad45778
 | 
			
		||||
@@ -17,10 +17,11 @@ See the License for the specific language governing permissions and
 | 
			
		||||
limitations under the License.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
// This package imports things required by build scripts, to force `go mod` to see them as dependencies
 | 
			
		||||
// This package imports things required by build scripts and test packages of submodules, to force `go mod` to see them as dependencies
 | 
			
		||||
package tools
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	// build script dependencies
 | 
			
		||||
	_ "github.com/onsi/ginkgo/ginkgo"
 | 
			
		||||
	_ "k8s.io/code-generator/cmd/go-to-protobuf"
 | 
			
		||||
	_ "k8s.io/code-generator/cmd/go-to-protobuf/protoc-gen-gogo"
 | 
			
		||||
@@ -29,4 +30,7 @@ import (
 | 
			
		||||
	_ "k8s.io/gengo/examples/import-boss/generators"
 | 
			
		||||
	_ "k8s.io/gengo/examples/set-gen/generators"
 | 
			
		||||
	_ "k8s.io/kube-openapi/cmd/openapi-gen"
 | 
			
		||||
 | 
			
		||||
	// submodule test dependencies
 | 
			
		||||
	_ "github.com/armon/go-socks5" // for staging/src/k8s.io/apimachinery/pkg/util/httpstream/spdy/roundtripper_test.go
 | 
			
		||||
)
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										2
									
								
								go.mod
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								go.mod
									
									
									
									
									
								
							@@ -19,6 +19,7 @@ require (
 | 
			
		||||
	github.com/Microsoft/go-winio v0.4.17
 | 
			
		||||
	github.com/Microsoft/hcsshim v0.8.22
 | 
			
		||||
	github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e
 | 
			
		||||
	github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5
 | 
			
		||||
	github.com/auth0/go-jwt-middleware v1.0.1 // indirect
 | 
			
		||||
	github.com/aws/aws-sdk-go v1.38.49
 | 
			
		||||
	github.com/blang/semver v3.5.1+incompatible
 | 
			
		||||
@@ -173,6 +174,7 @@ replace (
 | 
			
		||||
	github.com/armon/circbuf => github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e
 | 
			
		||||
	github.com/armon/go-metrics => github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da
 | 
			
		||||
	github.com/armon/go-radix => github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310
 | 
			
		||||
	github.com/armon/go-socks5 => github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5
 | 
			
		||||
	github.com/asaskevich/govalidator => github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a
 | 
			
		||||
	github.com/auth0/go-jwt-middleware => github.com/auth0/go-jwt-middleware v1.0.1
 | 
			
		||||
	github.com/aws/aws-sdk-go => github.com/aws/aws-sdk-go v1.38.49
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										2
									
								
								go.sum
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								go.sum
									
									
									
									
									
								
							@@ -57,6 +57,8 @@ github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e h1:QEF07wC0T1rKkctt1
 | 
			
		||||
github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=
 | 
			
		||||
github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=
 | 
			
		||||
github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=
 | 
			
		||||
github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio=
 | 
			
		||||
github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs=
 | 
			
		||||
github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a h1:idn718Q4B6AGu/h5Sxe66HYVdqdGu2l9Iebqhi/AEoA=
 | 
			
		||||
github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY=
 | 
			
		||||
github.com/auth0/go-jwt-middleware v1.0.1 h1:/fsQ4vRr4zod1wKReUH+0A3ySRjGiT9G34kypO/EKwI=
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										1
									
								
								staging/src/k8s.io/api/go.sum
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										1
									
								
								staging/src/k8s.io/api/go.sum
									
									
									
										generated
									
									
									
								
							@@ -3,6 +3,7 @@ github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03
 | 
			
		||||
github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ=
 | 
			
		||||
github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0=
 | 
			
		||||
github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE=
 | 
			
		||||
github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs=
 | 
			
		||||
github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY=
 | 
			
		||||
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
 | 
			
		||||
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
 | 
			
		||||
 
 | 
			
		||||
@@ -66,8 +66,13 @@ github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kd
 | 
			
		||||
github.com/antlr/antlr4/runtime/Go/antlr v0.0.0-20210826220005-b48c857c3a0e h1:GCzyKMDDjSGnlpl3clrdAK7I1AaVoaiKDOYkUzChZzg=
 | 
			
		||||
github.com/antlr/antlr4/runtime/Go/antlr v0.0.0-20210826220005-b48c857c3a0e/go.mod h1:F7bn7fEU90QkQ3tnmaTx3LTKLEDqnwWODIYppRQ5hnY=
 | 
			
		||||
github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=
 | 
			
		||||
github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=
 | 
			
		||||
github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=
 | 
			
		||||
github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=
 | 
			
		||||
github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=
 | 
			
		||||
github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=
 | 
			
		||||
github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs=
 | 
			
		||||
github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs=
 | 
			
		||||
github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a h1:idn718Q4B6AGu/h5Sxe66HYVdqdGu2l9Iebqhi/AEoA=
 | 
			
		||||
github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY=
 | 
			
		||||
github.com/benbjohnson/clock v1.0.3/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM=
 | 
			
		||||
 
 | 
			
		||||
@@ -5,6 +5,7 @@ module k8s.io/apimachinery
 | 
			
		||||
go 1.16
 | 
			
		||||
 | 
			
		||||
require (
 | 
			
		||||
	github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5
 | 
			
		||||
	github.com/davecgh/go-spew v1.1.1
 | 
			
		||||
	github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153
 | 
			
		||||
	github.com/evanphx/json-patch v4.12.0+incompatible
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										9
									
								
								staging/src/k8s.io/apimachinery/go.sum
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										9
									
								
								staging/src/k8s.io/apimachinery/go.sum
									
									
									
										generated
									
									
									
								
							@@ -3,6 +3,8 @@ github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03
 | 
			
		||||
github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ=
 | 
			
		||||
github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0=
 | 
			
		||||
github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE=
 | 
			
		||||
github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio=
 | 
			
		||||
github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs=
 | 
			
		||||
github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY=
 | 
			
		||||
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
 | 
			
		||||
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
 | 
			
		||||
@@ -57,6 +59,7 @@ github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/
 | 
			
		||||
github.com/google/gofuzz v1.1.0 h1:Hsa8mG0dQ46ij8Sl2AYJDUv1oA9/d6Vk+3LG99Oe02g=
 | 
			
		||||
github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
 | 
			
		||||
github.com/google/uuid v1.1.2 h1:EVhdT+1Kseyi1/pUmXKaFxYsDNy9RQYkMWRH68J/W7Y=
 | 
			
		||||
github.com/google/uuid v1.1.2 h1:EVhdT+1Kseyi1/pUmXKaFxYsDNy9RQYkMWRH68J/W7Y=
 | 
			
		||||
github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
 | 
			
		||||
github.com/googleapis/gnostic v0.5.1/go.mod h1:6U4PtQXGIEt/Z3h5MAT7FNofLnw9vXk2cUuW7uA/OeU=
 | 
			
		||||
github.com/googleapis/gnostic v0.5.5 h1:9fHAtK0uDfpveeqqo1hkEZJcFvYXAiCN3UutL8F9xHw=
 | 
			
		||||
@@ -99,16 +102,19 @@ github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108
 | 
			
		||||
github.com/onsi/ginkgo v1.14.0 h1:2mOpI4JVVPBN+WQRa0WKH2eXR+Ey+uK4n7Zj0aYpIQA=
 | 
			
		||||
github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY=
 | 
			
		||||
github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA=
 | 
			
		||||
github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA=
 | 
			
		||||
github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=
 | 
			
		||||
github.com/onsi/gomega v1.10.1 h1:o0+MgICZLuZ7xjH7Vx6zS/zcu93/BEp1VwkIW1mEXCE=
 | 
			
		||||
github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=
 | 
			
		||||
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
 | 
			
		||||
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
 | 
			
		||||
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
 | 
			
		||||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
 | 
			
		||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
 | 
			
		||||
github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
 | 
			
		||||
github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk=
 | 
			
		||||
github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
 | 
			
		||||
github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
 | 
			
		||||
github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
 | 
			
		||||
github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8=
 | 
			
		||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
 | 
			
		||||
@@ -212,7 +218,10 @@ google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQ
 | 
			
		||||
google.golang.org/protobuf v1.27.1 h1:SnqbnDw1V7RiZcXPx5MEeqPv2s79L9i7BJUlG/+RurQ=
 | 
			
		||||
google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
 | 
			
		||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 | 
			
		||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 | 
			
		||||
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 | 
			
		||||
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 | 
			
		||||
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 | 
			
		||||
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 | 
			
		||||
gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU=
 | 
			
		||||
gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 | 
			
		||||
 
 | 
			
		||||
@@ -22,6 +22,7 @@ import (
 | 
			
		||||
	"context"
 | 
			
		||||
	"crypto/tls"
 | 
			
		||||
	"encoding/base64"
 | 
			
		||||
	"errors"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"io"
 | 
			
		||||
	"io/ioutil"
 | 
			
		||||
@@ -32,6 +33,7 @@ import (
 | 
			
		||||
	"strings"
 | 
			
		||||
	"time"
 | 
			
		||||
 | 
			
		||||
	"golang.org/x/net/proxy"
 | 
			
		||||
	apierrors "k8s.io/apimachinery/pkg/api/errors"
 | 
			
		||||
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 | 
			
		||||
	"k8s.io/apimachinery/pkg/runtime"
 | 
			
		||||
@@ -101,7 +103,7 @@ func NewRoundTripperWithProxy(tlsConfig *tls.Config, followRedirects, requireSam
 | 
			
		||||
	})
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// NewRoundTripperWithProxy creates a new SpdyRoundTripper with the specified
 | 
			
		||||
// NewRoundTripperWithConfig creates a new SpdyRoundTripper with the specified
 | 
			
		||||
// configuration.
 | 
			
		||||
func NewRoundTripperWithConfig(cfg RoundTripperConfig) *SpdyRoundTripper {
 | 
			
		||||
	if cfg.Proxier == nil {
 | 
			
		||||
@@ -163,6 +165,18 @@ func (s *SpdyRoundTripper) dial(req *http.Request) (net.Conn, error) {
 | 
			
		||||
		return s.dialWithoutProxy(req.Context(), req.URL)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	switch proxyURL.Scheme {
 | 
			
		||||
	case "socks5":
 | 
			
		||||
		return s.dialWithSocks5Proxy(req, proxyURL)
 | 
			
		||||
	case "https", "http", "":
 | 
			
		||||
		return s.dialWithHttpProxy(req, proxyURL)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return nil, fmt.Errorf("proxy URL scheme not supported: %s", proxyURL.Scheme)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// dialWithHttpProxy dials the host specified by url through an http or an https proxy.
 | 
			
		||||
func (s *SpdyRoundTripper) dialWithHttpProxy(req *http.Request, proxyURL *url.URL) (net.Conn, error) {
 | 
			
		||||
	// ensure we use a canonical host with proxyReq
 | 
			
		||||
	targetHost := netutil.CanonicalAddr(req.URL)
 | 
			
		||||
 | 
			
		||||
@@ -196,9 +210,58 @@ func (s *SpdyRoundTripper) dial(req *http.Request) (net.Conn, error) {
 | 
			
		||||
 | 
			
		||||
	rwc, _ := proxyClientConn.Hijack()
 | 
			
		||||
 | 
			
		||||
	if req.URL.Scheme != "https" {
 | 
			
		||||
		return rwc, nil
 | 
			
		||||
	if req.URL.Scheme == "https" {
 | 
			
		||||
		return s.tlsConn(proxyReq.Context(), rwc, targetHost)
 | 
			
		||||
	}
 | 
			
		||||
	return rwc, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// dialWithSocks5Proxy dials the host specified by url through a socks5 proxy.
 | 
			
		||||
func (s *SpdyRoundTripper) dialWithSocks5Proxy(req *http.Request, proxyURL *url.URL) (net.Conn, error) {
 | 
			
		||||
	// ensure we use a canonical host with proxyReq
 | 
			
		||||
	targetHost := netutil.CanonicalAddr(req.URL)
 | 
			
		||||
	proxyDialAddr := netutil.CanonicalAddr(proxyURL)
 | 
			
		||||
 | 
			
		||||
	var auth *proxy.Auth
 | 
			
		||||
	if proxyURL.User != nil {
 | 
			
		||||
		pass, _ := proxyURL.User.Password()
 | 
			
		||||
		auth = &proxy.Auth{
 | 
			
		||||
			User:     proxyURL.User.Username(),
 | 
			
		||||
			Password: pass,
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	dialer := s.Dialer
 | 
			
		||||
	if dialer == nil {
 | 
			
		||||
		dialer = &net.Dialer{
 | 
			
		||||
			Timeout: 30 * time.Second,
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	proxyDialer, err := proxy.SOCKS5("tcp", proxyDialAddr, auth, dialer)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// According to the implementation of proxy.SOCKS5, the type assertion will always succeed
 | 
			
		||||
	contextDialer, ok := proxyDialer.(proxy.ContextDialer)
 | 
			
		||||
	if !ok {
 | 
			
		||||
		return nil, errors.New("SOCKS5 Dialer must implement ContextDialer")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	proxyDialConn, err := contextDialer.DialContext(req.Context(), "tcp", targetHost)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if req.URL.Scheme == "https" {
 | 
			
		||||
		return s.tlsConn(req.Context(), proxyDialConn, targetHost)
 | 
			
		||||
	}
 | 
			
		||||
	return proxyDialConn, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// tlsConn returns a TLS client side connection using rwc as the underlying transport.
 | 
			
		||||
func (s *SpdyRoundTripper) tlsConn(ctx context.Context, rwc net.Conn, targetHost string) (net.Conn, error) {
 | 
			
		||||
 | 
			
		||||
	host, _, err := net.SplitHostPort(targetHost)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
@@ -217,7 +280,7 @@ func (s *SpdyRoundTripper) dial(req *http.Request) (net.Conn, error) {
 | 
			
		||||
	tlsConn := tls.Client(rwc, tlsConfig)
 | 
			
		||||
 | 
			
		||||
	// need to manually call Handshake() so we can call VerifyHostname() below
 | 
			
		||||
	if err := tlsConn.Handshake(); err != nil {
 | 
			
		||||
	if err := tlsConn.HandshakeContext(ctx); err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -17,33 +17,69 @@ limitations under the License.
 | 
			
		||||
package spdy
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"context"
 | 
			
		||||
	"crypto/tls"
 | 
			
		||||
	"crypto/x509"
 | 
			
		||||
	"encoding/base64"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"io"
 | 
			
		||||
	"net"
 | 
			
		||||
	"net/http"
 | 
			
		||||
	"net/http/httptest"
 | 
			
		||||
	"net/url"
 | 
			
		||||
	"strconv"
 | 
			
		||||
	"strings"
 | 
			
		||||
	"sync/atomic"
 | 
			
		||||
	"testing"
 | 
			
		||||
 | 
			
		||||
	"github.com/armon/go-socks5"
 | 
			
		||||
	"github.com/elazarl/goproxy"
 | 
			
		||||
 | 
			
		||||
	"k8s.io/apimachinery/pkg/util/httpstream"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// be sure to unset environment variable https_proxy (if exported) before testing, otherwise the testing will fail unexpectedly.
 | 
			
		||||
func TestRoundTripAndNewConnection(t *testing.T) {
 | 
			
		||||
	for _, redirect := range []bool{false, true} {
 | 
			
		||||
		t.Run(fmt.Sprintf("redirect = %t", redirect), func(t *testing.T) {
 | 
			
		||||
			localhostPool := x509.NewCertPool()
 | 
			
		||||
			if !localhostPool.AppendCertsFromPEM(localhostCert) {
 | 
			
		||||
				t.Errorf("error setting up localhostCert pool")
 | 
			
		||||
type serverHandlerConfig struct {
 | 
			
		||||
	shouldError      bool
 | 
			
		||||
	statusCode       int
 | 
			
		||||
	connectionHeader string
 | 
			
		||||
	upgradeHeader    string
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func serverHandler(t *testing.T, config serverHandlerConfig) http.HandlerFunc {
 | 
			
		||||
	return func(w http.ResponseWriter, req *http.Request) {
 | 
			
		||||
		if config.shouldError {
 | 
			
		||||
			if e, a := httpstream.HeaderUpgrade, req.Header.Get(httpstream.HeaderConnection); e != a {
 | 
			
		||||
				t.Fatalf("expected connection=upgrade header, got '%s", a)
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			httpsServerInvalidHostname := func(h http.Handler) *httptest.Server {
 | 
			
		||||
			w.Header().Set(httpstream.HeaderConnection, config.connectionHeader)
 | 
			
		||||
			w.Header().Set(httpstream.HeaderUpgrade, config.upgradeHeader)
 | 
			
		||||
			w.WriteHeader(config.statusCode)
 | 
			
		||||
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		streamCh := make(chan httpstream.Stream)
 | 
			
		||||
 | 
			
		||||
		responseUpgrader := NewResponseUpgrader()
 | 
			
		||||
		spdyConn := responseUpgrader.UpgradeResponse(w, req, func(s httpstream.Stream, replySent <-chan struct{}) error {
 | 
			
		||||
			streamCh <- s
 | 
			
		||||
			return nil
 | 
			
		||||
		})
 | 
			
		||||
		if spdyConn == nil {
 | 
			
		||||
			t.Fatal("unexpected nil spdyConn")
 | 
			
		||||
		}
 | 
			
		||||
		defer spdyConn.Close()
 | 
			
		||||
 | 
			
		||||
		stream := <-streamCh
 | 
			
		||||
		io.Copy(stream, stream)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type serverFunc func(http.Handler) *httptest.Server
 | 
			
		||||
 | 
			
		||||
func httpsServerInvalidHostname(t *testing.T) serverFunc {
 | 
			
		||||
	return func(h http.Handler) *httptest.Server {
 | 
			
		||||
		cert, err := tls.X509KeyPair(exampleCert, exampleKey)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			t.Errorf("https (invalid hostname): proxy_test: %v", err)
 | 
			
		||||
@@ -55,8 +91,10 @@ func TestRoundTripAndNewConnection(t *testing.T) {
 | 
			
		||||
		ts.StartTLS()
 | 
			
		||||
		return ts
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
			httpsServerValidHostname := func(h http.Handler) *httptest.Server {
 | 
			
		||||
func httpsServerValidHostname(t *testing.T) serverFunc {
 | 
			
		||||
	return func(h http.Handler) *httptest.Server {
 | 
			
		||||
		cert, err := tls.X509KeyPair(localhostCert, localhostKey)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			t.Errorf("https (valid hostname): proxy_test: %v", err)
 | 
			
		||||
@@ -68,6 +106,22 @@ func TestRoundTripAndNewConnection(t *testing.T) {
 | 
			
		||||
		ts.StartTLS()
 | 
			
		||||
		return ts
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func localhostCertPool(t *testing.T) *x509.CertPool {
 | 
			
		||||
	localhostPool := x509.NewCertPool()
 | 
			
		||||
 | 
			
		||||
	if !localhostPool.AppendCertsFromPEM(localhostCert) {
 | 
			
		||||
		t.Errorf("error setting up localhostCert pool")
 | 
			
		||||
	}
 | 
			
		||||
	return localhostPool
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// be sure to unset environment variable https_proxy (if exported) before testing, otherwise the testing will fail unexpectedly.
 | 
			
		||||
func TestRoundTripAndNewConnection(t *testing.T) {
 | 
			
		||||
	for _, redirect := range []bool{false, true} {
 | 
			
		||||
		t.Run(fmt.Sprintf("redirect = %t", redirect), func(t *testing.T) {
 | 
			
		||||
			localhostPool := localhostCertPool(t)
 | 
			
		||||
 | 
			
		||||
			testCases := map[string]struct {
 | 
			
		||||
				serverFunc             func(http.Handler) *httptest.Server
 | 
			
		||||
@@ -115,7 +169,7 @@ func TestRoundTripAndNewConnection(t *testing.T) {
 | 
			
		||||
					shouldError:            false,
 | 
			
		||||
				},
 | 
			
		||||
				"https (invalid hostname + InsecureSkipVerify)": {
 | 
			
		||||
					serverFunc:             httpsServerInvalidHostname,
 | 
			
		||||
					serverFunc:             httpsServerInvalidHostname(t),
 | 
			
		||||
					clientTLS:              &tls.Config{InsecureSkipVerify: true},
 | 
			
		||||
					serverConnectionHeader: "Upgrade",
 | 
			
		||||
					serverUpgradeHeader:    "SPDY/3.1",
 | 
			
		||||
@@ -123,7 +177,7 @@ func TestRoundTripAndNewConnection(t *testing.T) {
 | 
			
		||||
					shouldError:            false,
 | 
			
		||||
				},
 | 
			
		||||
				"https (invalid hostname + hostname verification)": {
 | 
			
		||||
					serverFunc:             httpsServerInvalidHostname,
 | 
			
		||||
					serverFunc:             httpsServerInvalidHostname(t),
 | 
			
		||||
					clientTLS:              &tls.Config{InsecureSkipVerify: false},
 | 
			
		||||
					serverConnectionHeader: "Upgrade",
 | 
			
		||||
					serverUpgradeHeader:    "SPDY/3.1",
 | 
			
		||||
@@ -131,7 +185,7 @@ func TestRoundTripAndNewConnection(t *testing.T) {
 | 
			
		||||
					shouldError:            true,
 | 
			
		||||
				},
 | 
			
		||||
				"https (valid hostname + RootCAs)": {
 | 
			
		||||
					serverFunc:             httpsServerValidHostname,
 | 
			
		||||
					serverFunc:             httpsServerValidHostname(t),
 | 
			
		||||
					clientTLS:              &tls.Config{RootCAs: localhostPool},
 | 
			
		||||
					serverConnectionHeader: "Upgrade",
 | 
			
		||||
					serverUpgradeHeader:    "SPDY/3.1",
 | 
			
		||||
@@ -148,7 +202,7 @@ func TestRoundTripAndNewConnection(t *testing.T) {
 | 
			
		||||
				},
 | 
			
		||||
				"proxied https (invalid hostname + InsecureSkipVerify) -> http": {
 | 
			
		||||
					serverFunc:             httptest.NewServer,
 | 
			
		||||
					proxyServerFunc:        httpsServerInvalidHostname,
 | 
			
		||||
					proxyServerFunc:        httpsServerInvalidHostname(t),
 | 
			
		||||
					clientTLS:              &tls.Config{InsecureSkipVerify: true},
 | 
			
		||||
					serverConnectionHeader: "Upgrade",
 | 
			
		||||
					serverUpgradeHeader:    "SPDY/3.1",
 | 
			
		||||
@@ -157,7 +211,7 @@ func TestRoundTripAndNewConnection(t *testing.T) {
 | 
			
		||||
				},
 | 
			
		||||
				"proxied https with auth (invalid hostname + InsecureSkipVerify) -> http": {
 | 
			
		||||
					serverFunc:             httptest.NewServer,
 | 
			
		||||
					proxyServerFunc:        httpsServerInvalidHostname,
 | 
			
		||||
					proxyServerFunc:        httpsServerInvalidHostname(t),
 | 
			
		||||
					proxyAuth:              url.UserPassword("proxyuser", "proxypasswd"),
 | 
			
		||||
					clientTLS:              &tls.Config{InsecureSkipVerify: true},
 | 
			
		||||
					serverConnectionHeader: "Upgrade",
 | 
			
		||||
@@ -167,7 +221,7 @@ func TestRoundTripAndNewConnection(t *testing.T) {
 | 
			
		||||
				},
 | 
			
		||||
				"proxied https (invalid hostname + hostname verification) -> http": {
 | 
			
		||||
					serverFunc:             httptest.NewServer,
 | 
			
		||||
					proxyServerFunc:        httpsServerInvalidHostname,
 | 
			
		||||
					proxyServerFunc:        httpsServerInvalidHostname(t),
 | 
			
		||||
					clientTLS:              &tls.Config{InsecureSkipVerify: false},
 | 
			
		||||
					serverConnectionHeader: "Upgrade",
 | 
			
		||||
					serverUpgradeHeader:    "SPDY/3.1",
 | 
			
		||||
@@ -176,7 +230,7 @@ func TestRoundTripAndNewConnection(t *testing.T) {
 | 
			
		||||
				},
 | 
			
		||||
				"proxied https (valid hostname + RootCAs) -> http": {
 | 
			
		||||
					serverFunc:             httptest.NewServer,
 | 
			
		||||
					proxyServerFunc:        httpsServerValidHostname,
 | 
			
		||||
					proxyServerFunc:        httpsServerValidHostname(t),
 | 
			
		||||
					clientTLS:              &tls.Config{RootCAs: localhostPool},
 | 
			
		||||
					serverConnectionHeader: "Upgrade",
 | 
			
		||||
					serverUpgradeHeader:    "SPDY/3.1",
 | 
			
		||||
@@ -185,7 +239,7 @@ func TestRoundTripAndNewConnection(t *testing.T) {
 | 
			
		||||
				},
 | 
			
		||||
				"proxied https with auth (valid hostname + RootCAs) -> http": {
 | 
			
		||||
					serverFunc:             httptest.NewServer,
 | 
			
		||||
					proxyServerFunc:        httpsServerValidHostname,
 | 
			
		||||
					proxyServerFunc:        httpsServerValidHostname(t),
 | 
			
		||||
					proxyAuth:              url.UserPassword("proxyuser", "proxypasswd"),
 | 
			
		||||
					clientTLS:              &tls.Config{RootCAs: localhostPool},
 | 
			
		||||
					serverConnectionHeader: "Upgrade",
 | 
			
		||||
@@ -194,8 +248,8 @@ func TestRoundTripAndNewConnection(t *testing.T) {
 | 
			
		||||
					shouldError:            false,
 | 
			
		||||
				},
 | 
			
		||||
				"proxied https (invalid hostname + InsecureSkipVerify) -> https (invalid hostname)": {
 | 
			
		||||
					serverFunc:             httpsServerInvalidHostname,
 | 
			
		||||
					proxyServerFunc:        httpsServerInvalidHostname,
 | 
			
		||||
					serverFunc:             httpsServerInvalidHostname(t),
 | 
			
		||||
					proxyServerFunc:        httpsServerInvalidHostname(t),
 | 
			
		||||
					clientTLS:              &tls.Config{InsecureSkipVerify: true},
 | 
			
		||||
					serverConnectionHeader: "Upgrade",
 | 
			
		||||
					serverUpgradeHeader:    "SPDY/3.1",
 | 
			
		||||
@@ -203,8 +257,8 @@ func TestRoundTripAndNewConnection(t *testing.T) {
 | 
			
		||||
					shouldError:            false, // works because the test proxy ignores TLS errors
 | 
			
		||||
				},
 | 
			
		||||
				"proxied https with auth (invalid hostname + InsecureSkipVerify) -> https (invalid hostname)": {
 | 
			
		||||
					serverFunc:             httpsServerInvalidHostname,
 | 
			
		||||
					proxyServerFunc:        httpsServerInvalidHostname,
 | 
			
		||||
					serverFunc:             httpsServerInvalidHostname(t),
 | 
			
		||||
					proxyServerFunc:        httpsServerInvalidHostname(t),
 | 
			
		||||
					proxyAuth:              url.UserPassword("proxyuser", "proxypasswd"),
 | 
			
		||||
					clientTLS:              &tls.Config{InsecureSkipVerify: true},
 | 
			
		||||
					serverConnectionHeader: "Upgrade",
 | 
			
		||||
@@ -213,8 +267,8 @@ func TestRoundTripAndNewConnection(t *testing.T) {
 | 
			
		||||
					shouldError:            false, // works because the test proxy ignores TLS errors
 | 
			
		||||
				},
 | 
			
		||||
				"proxied https (invalid hostname + hostname verification) -> https (invalid hostname)": {
 | 
			
		||||
					serverFunc:             httpsServerInvalidHostname,
 | 
			
		||||
					proxyServerFunc:        httpsServerInvalidHostname,
 | 
			
		||||
					serverFunc:             httpsServerInvalidHostname(t),
 | 
			
		||||
					proxyServerFunc:        httpsServerInvalidHostname(t),
 | 
			
		||||
					clientTLS:              &tls.Config{InsecureSkipVerify: false},
 | 
			
		||||
					serverConnectionHeader: "Upgrade",
 | 
			
		||||
					serverUpgradeHeader:    "SPDY/3.1",
 | 
			
		||||
@@ -222,8 +276,8 @@ func TestRoundTripAndNewConnection(t *testing.T) {
 | 
			
		||||
					shouldError:            true, // fails because the client doesn't trust the proxy
 | 
			
		||||
				},
 | 
			
		||||
				"proxied https (valid hostname + RootCAs) -> https (valid hostname + RootCAs)": {
 | 
			
		||||
					serverFunc:             httpsServerValidHostname,
 | 
			
		||||
					proxyServerFunc:        httpsServerValidHostname,
 | 
			
		||||
					serverFunc:             httpsServerValidHostname(t),
 | 
			
		||||
					proxyServerFunc:        httpsServerValidHostname(t),
 | 
			
		||||
					clientTLS:              &tls.Config{RootCAs: localhostPool},
 | 
			
		||||
					serverConnectionHeader: "Upgrade",
 | 
			
		||||
					serverUpgradeHeader:    "SPDY/3.1",
 | 
			
		||||
@@ -231,8 +285,8 @@ func TestRoundTripAndNewConnection(t *testing.T) {
 | 
			
		||||
					shouldError:            false,
 | 
			
		||||
				},
 | 
			
		||||
				"proxied https with auth (valid hostname + RootCAs) -> https (valid hostname + RootCAs)": {
 | 
			
		||||
					serverFunc:             httpsServerValidHostname,
 | 
			
		||||
					proxyServerFunc:        httpsServerValidHostname,
 | 
			
		||||
					serverFunc:             httpsServerValidHostname(t),
 | 
			
		||||
					proxyServerFunc:        httpsServerValidHostname(t),
 | 
			
		||||
					proxyAuth:              url.UserPassword("proxyuser", "proxypasswd"),
 | 
			
		||||
					clientTLS:              &tls.Config{RootCAs: localhostPool},
 | 
			
		||||
					serverConnectionHeader: "Upgrade",
 | 
			
		||||
@@ -243,43 +297,24 @@ func TestRoundTripAndNewConnection(t *testing.T) {
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			for k, testCase := range testCases {
 | 
			
		||||
				server := testCase.serverFunc(http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) {
 | 
			
		||||
					if testCase.shouldError {
 | 
			
		||||
						if e, a := httpstream.HeaderUpgrade, req.Header.Get(httpstream.HeaderConnection); e != a {
 | 
			
		||||
							t.Fatalf("%s: Expected connection=upgrade header, got '%s", k, a)
 | 
			
		||||
						}
 | 
			
		||||
 | 
			
		||||
						w.Header().Set(httpstream.HeaderConnection, testCase.serverConnectionHeader)
 | 
			
		||||
						w.Header().Set(httpstream.HeaderUpgrade, testCase.serverUpgradeHeader)
 | 
			
		||||
						w.WriteHeader(testCase.serverStatusCode)
 | 
			
		||||
 | 
			
		||||
						return
 | 
			
		||||
					}
 | 
			
		||||
 | 
			
		||||
					streamCh := make(chan httpstream.Stream)
 | 
			
		||||
 | 
			
		||||
					responseUpgrader := NewResponseUpgrader()
 | 
			
		||||
					spdyConn := responseUpgrader.UpgradeResponse(w, req, func(s httpstream.Stream, replySent <-chan struct{}) error {
 | 
			
		||||
						streamCh <- s
 | 
			
		||||
						return nil
 | 
			
		||||
					})
 | 
			
		||||
					if spdyConn == nil {
 | 
			
		||||
						t.Fatalf("%s: unexpected nil spdyConn", k)
 | 
			
		||||
					}
 | 
			
		||||
					defer spdyConn.Close()
 | 
			
		||||
 | 
			
		||||
					stream := <-streamCh
 | 
			
		||||
					io.Copy(stream, stream)
 | 
			
		||||
				}))
 | 
			
		||||
				t.Run(k, func(t *testing.T) {
 | 
			
		||||
					server := testCase.serverFunc(serverHandler(
 | 
			
		||||
						t, serverHandlerConfig{
 | 
			
		||||
							shouldError:      testCase.shouldError,
 | 
			
		||||
							statusCode:       testCase.serverStatusCode,
 | 
			
		||||
							connectionHeader: testCase.serverConnectionHeader,
 | 
			
		||||
							upgradeHeader:    testCase.serverUpgradeHeader,
 | 
			
		||||
						},
 | 
			
		||||
					))
 | 
			
		||||
					defer server.Close()
 | 
			
		||||
 | 
			
		||||
					serverURL, err := url.Parse(server.URL)
 | 
			
		||||
					if err != nil {
 | 
			
		||||
					t.Fatalf("%s: Error creating request: %s", k, err)
 | 
			
		||||
						t.Fatalf("error creating request: %s", err)
 | 
			
		||||
					}
 | 
			
		||||
					req, err := http.NewRequest("GET", server.URL, nil)
 | 
			
		||||
					if err != nil {
 | 
			
		||||
					t.Fatalf("%s: Error creating request: %s", k, err)
 | 
			
		||||
						t.Fatalf("error creating request: %s", err)
 | 
			
		||||
					}
 | 
			
		||||
 | 
			
		||||
					spdyTransport := NewRoundTripper(testCase.clientTLS, redirect, redirect)
 | 
			
		||||
@@ -323,48 +358,48 @@ func TestRoundTripAndNewConnection(t *testing.T) {
 | 
			
		||||
					}
 | 
			
		||||
					haveErr := err != nil
 | 
			
		||||
					if e, a := testCase.shouldError, haveErr; e != a {
 | 
			
		||||
					t.Fatalf("%s: shouldError=%t, got %t: %v", k, e, a, err)
 | 
			
		||||
						t.Fatalf("shouldError=%t, got %t: %v", e, a, err)
 | 
			
		||||
					}
 | 
			
		||||
					if testCase.shouldError {
 | 
			
		||||
					continue
 | 
			
		||||
						return
 | 
			
		||||
					}
 | 
			
		||||
					defer conn.Close()
 | 
			
		||||
 | 
			
		||||
					if resp.StatusCode != http.StatusSwitchingProtocols {
 | 
			
		||||
					t.Fatalf("%s: expected http 101 switching protocols, got %d", k, resp.StatusCode)
 | 
			
		||||
						t.Fatalf("expected http 101 switching protocols, got %d", resp.StatusCode)
 | 
			
		||||
					}
 | 
			
		||||
 | 
			
		||||
					stream, err := conn.CreateStream(http.Header{})
 | 
			
		||||
					if err != nil {
 | 
			
		||||
					t.Fatalf("%s: error creating client stream: %s", k, err)
 | 
			
		||||
						t.Fatalf("error creating client stream: %s", err)
 | 
			
		||||
					}
 | 
			
		||||
 | 
			
		||||
					n, err := stream.Write([]byte("hello"))
 | 
			
		||||
					if err != nil {
 | 
			
		||||
					t.Fatalf("%s: error writing to stream: %s", k, err)
 | 
			
		||||
						t.Fatalf("error writing to stream: %s", err)
 | 
			
		||||
					}
 | 
			
		||||
					if n != 5 {
 | 
			
		||||
					t.Fatalf("%s: Expected to write 5 bytes, but actually wrote %d", k, n)
 | 
			
		||||
						t.Fatalf("expected to write 5 bytes, but actually wrote %d", n)
 | 
			
		||||
					}
 | 
			
		||||
 | 
			
		||||
					b := make([]byte, 5)
 | 
			
		||||
					n, err = stream.Read(b)
 | 
			
		||||
					if err != nil {
 | 
			
		||||
					t.Fatalf("%s: error reading from stream: %s", k, err)
 | 
			
		||||
						t.Fatalf("error reading from stream: %s", err)
 | 
			
		||||
					}
 | 
			
		||||
					if n != 5 {
 | 
			
		||||
					t.Fatalf("%s: Expected to read 5 bytes, but actually read %d", k, n)
 | 
			
		||||
						t.Fatalf("expected to read 5 bytes, but actually read %d", n)
 | 
			
		||||
					}
 | 
			
		||||
					if e, a := "hello", string(b[0:n]); e != a {
 | 
			
		||||
					t.Fatalf("%s: expected '%s', got '%s'", k, e, a)
 | 
			
		||||
						t.Fatalf("expected '%s', got '%s'", e, a)
 | 
			
		||||
					}
 | 
			
		||||
 | 
			
		||||
					if testCase.proxyServerFunc != nil {
 | 
			
		||||
						if !proxierCalled {
 | 
			
		||||
						t.Fatalf("%s: Expected to use a proxy but proxier in SpdyRoundTripper wasn't called", k)
 | 
			
		||||
							t.Fatal("expected to use a proxy but proxier in SpdyRoundTripper wasn't called")
 | 
			
		||||
						}
 | 
			
		||||
						if proxyCalledWithHost != serverURL.Host {
 | 
			
		||||
						t.Fatalf("%s: Expected to see a call to the proxy for backend %q, got %q", k, serverURL.Host, proxyCalledWithHost)
 | 
			
		||||
							t.Fatalf("expected to see a call to the proxy for backend %q, got %q", serverURL.Host, proxyCalledWithHost)
 | 
			
		||||
						}
 | 
			
		||||
					}
 | 
			
		||||
 | 
			
		||||
@@ -374,11 +409,281 @@ func TestRoundTripAndNewConnection(t *testing.T) {
 | 
			
		||||
						expectedProxyAuth = "Basic " + encodedCredentials
 | 
			
		||||
					}
 | 
			
		||||
					if len(expectedProxyAuth) == 0 && proxyCalledWithAuth {
 | 
			
		||||
					t.Fatalf("%s: Proxy authorization unexpected, got %q", k, proxyCalledWithAuthHeader)
 | 
			
		||||
						t.Fatalf("proxy authorization unexpected, got %q", proxyCalledWithAuthHeader)
 | 
			
		||||
					}
 | 
			
		||||
					if proxyCalledWithAuthHeader != expectedProxyAuth {
 | 
			
		||||
					t.Fatalf("%s: Expected to see a call to the proxy with credentials %q, got %q", k, testCase.proxyAuth, proxyCalledWithAuthHeader)
 | 
			
		||||
						t.Fatalf("expected to see a call to the proxy with credentials %q, got %q", testCase.proxyAuth, proxyCalledWithAuthHeader)
 | 
			
		||||
					}
 | 
			
		||||
 | 
			
		||||
				})
 | 
			
		||||
			}
 | 
			
		||||
		})
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type Interceptor struct {
 | 
			
		||||
	Authorization       socks5.AuthContext
 | 
			
		||||
	proxyCalledWithHost *string
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (i *Interceptor) GetAuthContext() (int, map[string]string) {
 | 
			
		||||
	return int(i.Authorization.Method), i.Authorization.Payload
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (i *Interceptor) Rewrite(ctx context.Context, req *socks5.Request) (context.Context, *socks5.AddrSpec) {
 | 
			
		||||
	*i.proxyCalledWithHost = req.DestAddr.Address()
 | 
			
		||||
	i.Authorization = socks5.AuthContext(*req.AuthContext)
 | 
			
		||||
	return ctx, req.DestAddr
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// be sure to unset environment variable https_proxy (if exported) before testing, otherwise the testing will fail unexpectedly.
 | 
			
		||||
func TestRoundTripSocks5AndNewConnection(t *testing.T) {
 | 
			
		||||
	localhostPool := localhostCertPool(t)
 | 
			
		||||
 | 
			
		||||
	for _, redirect := range []bool{false, true} {
 | 
			
		||||
		t.Run(fmt.Sprintf("redirect = %t", redirect), func(t *testing.T) {
 | 
			
		||||
			socks5Server := func(creds *socks5.StaticCredentials, interceptor *Interceptor) *socks5.Server {
 | 
			
		||||
				var conf *socks5.Config
 | 
			
		||||
				if creds != nil {
 | 
			
		||||
					authenticator := socks5.UserPassAuthenticator{Credentials: creds}
 | 
			
		||||
					conf = &socks5.Config{
 | 
			
		||||
						AuthMethods: []socks5.Authenticator{authenticator},
 | 
			
		||||
						Rewriter:    interceptor,
 | 
			
		||||
					}
 | 
			
		||||
				} else {
 | 
			
		||||
					conf = &socks5.Config{Rewriter: interceptor}
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
				ts, err := socks5.New(conf)
 | 
			
		||||
				if err != nil {
 | 
			
		||||
					t.Errorf("failed to create sock5 server: %v", err)
 | 
			
		||||
				}
 | 
			
		||||
				return ts
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			testCases := map[string]struct {
 | 
			
		||||
				clientTLS              *tls.Config
 | 
			
		||||
				proxyAuth              *url.Userinfo
 | 
			
		||||
				serverConnectionHeader string
 | 
			
		||||
				serverFunc             serverFunc
 | 
			
		||||
				serverStatusCode       int
 | 
			
		||||
				serverUpgradeHeader    string
 | 
			
		||||
				shouldError            bool
 | 
			
		||||
			}{
 | 
			
		||||
				"proxied without auth -> http": {
 | 
			
		||||
					serverFunc:             httptest.NewServer,
 | 
			
		||||
					serverConnectionHeader: "Upgrade",
 | 
			
		||||
					serverStatusCode:       http.StatusSwitchingProtocols,
 | 
			
		||||
					serverUpgradeHeader:    "SPDY/3.1",
 | 
			
		||||
					shouldError:            false,
 | 
			
		||||
				},
 | 
			
		||||
				"proxied with invalid auth -> http": {
 | 
			
		||||
					serverFunc:             httptest.NewServer,
 | 
			
		||||
					proxyAuth:              url.UserPassword("invalid", "auth"),
 | 
			
		||||
					serverConnectionHeader: "Upgrade",
 | 
			
		||||
					serverStatusCode:       http.StatusSwitchingProtocols,
 | 
			
		||||
					serverUpgradeHeader:    "SPDY/3.1",
 | 
			
		||||
					shouldError:            true,
 | 
			
		||||
				},
 | 
			
		||||
				"proxied with valid auth -> http": {
 | 
			
		||||
					serverFunc:             httptest.NewServer,
 | 
			
		||||
					proxyAuth:              url.UserPassword("proxyuser", "proxypasswd"),
 | 
			
		||||
					serverConnectionHeader: "Upgrade",
 | 
			
		||||
					serverStatusCode:       http.StatusSwitchingProtocols,
 | 
			
		||||
					serverUpgradeHeader:    "SPDY/3.1",
 | 
			
		||||
					shouldError:            false,
 | 
			
		||||
				},
 | 
			
		||||
				"proxied with valid auth -> https (invalid hostname + InsecureSkipVerify)": {
 | 
			
		||||
					serverFunc:             httpsServerInvalidHostname(t),
 | 
			
		||||
					proxyAuth:              url.UserPassword("proxyuser", "proxypasswd"),
 | 
			
		||||
					clientTLS:              &tls.Config{InsecureSkipVerify: true},
 | 
			
		||||
					serverConnectionHeader: "Upgrade",
 | 
			
		||||
					serverUpgradeHeader:    "SPDY/3.1",
 | 
			
		||||
					serverStatusCode:       http.StatusSwitchingProtocols,
 | 
			
		||||
					shouldError:            false,
 | 
			
		||||
				},
 | 
			
		||||
				"proxied with valid auth -> https (invalid hostname + hostname verification)": {
 | 
			
		||||
					serverFunc:             httpsServerInvalidHostname(t),
 | 
			
		||||
					proxyAuth:              url.UserPassword("proxyuser", "proxypasswd"),
 | 
			
		||||
					clientTLS:              &tls.Config{InsecureSkipVerify: false},
 | 
			
		||||
					serverConnectionHeader: "Upgrade",
 | 
			
		||||
					serverUpgradeHeader:    "SPDY/3.1",
 | 
			
		||||
					serverStatusCode:       http.StatusSwitchingProtocols,
 | 
			
		||||
					shouldError:            true,
 | 
			
		||||
				},
 | 
			
		||||
				"proxied with valid auth -> https (valid hostname + RootCAs)": {
 | 
			
		||||
					serverFunc:             httpsServerValidHostname(t),
 | 
			
		||||
					proxyAuth:              url.UserPassword("proxyuser", "proxypasswd"),
 | 
			
		||||
					clientTLS:              &tls.Config{RootCAs: localhostPool},
 | 
			
		||||
					serverConnectionHeader: "Upgrade",
 | 
			
		||||
					serverUpgradeHeader:    "SPDY/3.1",
 | 
			
		||||
					serverStatusCode:       http.StatusSwitchingProtocols,
 | 
			
		||||
					shouldError:            false,
 | 
			
		||||
				},
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			for name, testCase := range testCases {
 | 
			
		||||
				t.Run(name, func(t *testing.T) {
 | 
			
		||||
					server := testCase.serverFunc(serverHandler(
 | 
			
		||||
						t, serverHandlerConfig{
 | 
			
		||||
							shouldError:      testCase.shouldError,
 | 
			
		||||
							statusCode:       testCase.serverStatusCode,
 | 
			
		||||
							connectionHeader: testCase.serverConnectionHeader,
 | 
			
		||||
							upgradeHeader:    testCase.serverUpgradeHeader,
 | 
			
		||||
						},
 | 
			
		||||
					))
 | 
			
		||||
					defer server.Close()
 | 
			
		||||
 | 
			
		||||
					req, err := http.NewRequest("GET", server.URL, nil)
 | 
			
		||||
					if err != nil {
 | 
			
		||||
						t.Fatalf("error creating request: %s", err)
 | 
			
		||||
					}
 | 
			
		||||
 | 
			
		||||
					spdyTransport := NewRoundTripper(testCase.clientTLS, redirect, redirect)
 | 
			
		||||
					var proxierCalled bool
 | 
			
		||||
					var proxyCalledWithHost string
 | 
			
		||||
 | 
			
		||||
					interceptor := &Interceptor{proxyCalledWithHost: &proxyCalledWithHost}
 | 
			
		||||
 | 
			
		||||
					proxyHandler := socks5Server(nil, interceptor)
 | 
			
		||||
 | 
			
		||||
					if testCase.proxyAuth != nil {
 | 
			
		||||
						proxyHandler = socks5Server(&socks5.StaticCredentials{
 | 
			
		||||
							"proxyuser": "proxypasswd", // Socks5 server static credentials when client authentication is expected
 | 
			
		||||
						}, interceptor)
 | 
			
		||||
					}
 | 
			
		||||
 | 
			
		||||
					closed := make(chan struct{})
 | 
			
		||||
					isClosed := func() bool {
 | 
			
		||||
						select {
 | 
			
		||||
						case <-closed:
 | 
			
		||||
							return true
 | 
			
		||||
						default:
 | 
			
		||||
							return false
 | 
			
		||||
						}
 | 
			
		||||
					}
 | 
			
		||||
 | 
			
		||||
					l, err := net.Listen("tcp", "127.0.0.1:0")
 | 
			
		||||
					if err != nil {
 | 
			
		||||
						t.Fatalf("socks5Server: proxy_test: Listen: %v", err)
 | 
			
		||||
					}
 | 
			
		||||
					defer func() {
 | 
			
		||||
						close(closed)
 | 
			
		||||
						l.Close()
 | 
			
		||||
					}()
 | 
			
		||||
 | 
			
		||||
					go func(shoulderror bool) {
 | 
			
		||||
						conn, err := l.Accept()
 | 
			
		||||
						if err != nil {
 | 
			
		||||
							if isClosed() {
 | 
			
		||||
								return
 | 
			
		||||
							}
 | 
			
		||||
 | 
			
		||||
							t.Errorf("error accepting connection: %s", err)
 | 
			
		||||
						}
 | 
			
		||||
 | 
			
		||||
						if err := proxyHandler.ServeConn(conn); err != nil && !shoulderror {
 | 
			
		||||
							if isClosed() {
 | 
			
		||||
								return
 | 
			
		||||
							}
 | 
			
		||||
 | 
			
		||||
							t.Errorf("ServeConn error: %s", err)
 | 
			
		||||
						}
 | 
			
		||||
					}(testCase.shouldError)
 | 
			
		||||
					spdyTransport.proxier = func(proxierReq *http.Request) (*url.URL, error) {
 | 
			
		||||
						proxierCalled = true
 | 
			
		||||
						return &url.URL{
 | 
			
		||||
							Scheme: "socks5",
 | 
			
		||||
							Host:   net.JoinHostPort("127.0.0.1", strconv.Itoa(l.Addr().(*net.TCPAddr).Port)),
 | 
			
		||||
							User:   testCase.proxyAuth,
 | 
			
		||||
						}, nil
 | 
			
		||||
					}
 | 
			
		||||
 | 
			
		||||
					client := &http.Client{Transport: spdyTransport}
 | 
			
		||||
 | 
			
		||||
					resp, err := client.Do(req)
 | 
			
		||||
					haveErr := err != nil
 | 
			
		||||
					if e, a := testCase.shouldError, haveErr; e != a {
 | 
			
		||||
						t.Fatalf("shouldError=%t, got %t: %v", e, a, err)
 | 
			
		||||
					}
 | 
			
		||||
					if testCase.shouldError {
 | 
			
		||||
						return
 | 
			
		||||
					}
 | 
			
		||||
 | 
			
		||||
					conn, err := spdyTransport.NewConnection(resp)
 | 
			
		||||
					haveErr = err != nil
 | 
			
		||||
					if e, a := testCase.shouldError, haveErr; e != a {
 | 
			
		||||
						t.Fatalf("shouldError=%t, got %t: %v", e, a, err)
 | 
			
		||||
					}
 | 
			
		||||
					if testCase.shouldError {
 | 
			
		||||
						return
 | 
			
		||||
					}
 | 
			
		||||
 | 
			
		||||
					defer conn.Close()
 | 
			
		||||
 | 
			
		||||
					if resp.StatusCode != http.StatusSwitchingProtocols {
 | 
			
		||||
						t.Fatalf("expected http 101 switching protocols, got %d", resp.StatusCode)
 | 
			
		||||
					}
 | 
			
		||||
 | 
			
		||||
					stream, err := conn.CreateStream(http.Header{})
 | 
			
		||||
					if err != nil {
 | 
			
		||||
						t.Fatalf("error creating client stream: %s", err)
 | 
			
		||||
					}
 | 
			
		||||
 | 
			
		||||
					n, err := stream.Write([]byte("hello"))
 | 
			
		||||
					if err != nil {
 | 
			
		||||
						t.Fatalf("error writing to stream: %s", err)
 | 
			
		||||
					}
 | 
			
		||||
					if n != 5 {
 | 
			
		||||
						t.Fatalf("expected to write 5 bytes, but actually wrote %d", n)
 | 
			
		||||
					}
 | 
			
		||||
 | 
			
		||||
					b := make([]byte, 5)
 | 
			
		||||
					n, err = stream.Read(b)
 | 
			
		||||
					if err != nil {
 | 
			
		||||
						t.Fatalf("error reading from stream: %s", err)
 | 
			
		||||
					}
 | 
			
		||||
					if n != 5 {
 | 
			
		||||
						t.Fatalf("expected to read 5 bytes, but actually read %d", n)
 | 
			
		||||
					}
 | 
			
		||||
					if e, a := "hello", string(b[0:n]); e != a {
 | 
			
		||||
						t.Fatalf("expected '%s', got '%s'", e, a)
 | 
			
		||||
					}
 | 
			
		||||
 | 
			
		||||
					if !proxierCalled {
 | 
			
		||||
						t.Fatal("xpected to use a proxy but proxier in SpdyRoundTripper wasn't called")
 | 
			
		||||
					}
 | 
			
		||||
 | 
			
		||||
					serverURL, err := url.Parse(server.URL)
 | 
			
		||||
					if err != nil {
 | 
			
		||||
						t.Fatalf("error creating request: %s", err)
 | 
			
		||||
					}
 | 
			
		||||
					if proxyCalledWithHost != serverURL.Host {
 | 
			
		||||
						t.Fatalf("expected to see a call to the proxy for backend %q, got %q", serverURL.Host, proxyCalledWithHost)
 | 
			
		||||
					}
 | 
			
		||||
 | 
			
		||||
					authMethod, authUser := interceptor.GetAuthContext()
 | 
			
		||||
 | 
			
		||||
					if testCase.proxyAuth != nil {
 | 
			
		||||
						expectedSocks5AuthMethod := 2
 | 
			
		||||
						expectedSocks5AuthUser := "proxyuser"
 | 
			
		||||
 | 
			
		||||
						if expectedSocks5AuthMethod != authMethod {
 | 
			
		||||
							t.Fatalf("socks5 Proxy authorization unexpected, got %d, expected %d", authMethod, expectedSocks5AuthMethod)
 | 
			
		||||
						}
 | 
			
		||||
 | 
			
		||||
						if expectedSocks5AuthUser != authUser["Username"] {
 | 
			
		||||
							t.Fatalf("socks5 Proxy authorization user unexpected, got %q, expected %q", authUser["Username"], expectedSocks5AuthUser)
 | 
			
		||||
						}
 | 
			
		||||
					} else {
 | 
			
		||||
						if authMethod != 0 {
 | 
			
		||||
							t.Fatalf("proxy authentication method unexpected, got %d", authMethod)
 | 
			
		||||
						}
 | 
			
		||||
						if len(authUser) != 0 {
 | 
			
		||||
							t.Fatalf("unexpected proxy user: %v", authUser)
 | 
			
		||||
						}
 | 
			
		||||
					}
 | 
			
		||||
				})
 | 
			
		||||
			}
 | 
			
		||||
		})
 | 
			
		||||
	}
 | 
			
		||||
 
 | 
			
		||||
@@ -14,6 +14,7 @@ func hasPort(s string) bool { return strings.LastIndex(s, ":") > strings.LastInd
 | 
			
		||||
var portMap = map[string]string{
 | 
			
		||||
	"http":   "80",
 | 
			
		||||
	"https":  "443",
 | 
			
		||||
	"socks5": "1080",
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// FROM: http://golang.org/src/net/http/transport.go
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										3
									
								
								staging/src/k8s.io/apiserver/go.sum
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										3
									
								
								staging/src/k8s.io/apiserver/go.sum
									
									
									
										generated
									
									
									
								
							@@ -66,6 +66,9 @@ github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kd
 | 
			
		||||
github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=
 | 
			
		||||
github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=
 | 
			
		||||
github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=
 | 
			
		||||
github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs=
 | 
			
		||||
github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY=
 | 
			
		||||
github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY=
 | 
			
		||||
github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY=
 | 
			
		||||
github.com/benbjohnson/clock v1.0.3/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM=
 | 
			
		||||
github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8=
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										1
									
								
								staging/src/k8s.io/cli-runtime/go.sum
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										1
									
								
								staging/src/k8s.io/cli-runtime/go.sum
									
									
									
										generated
									
									
									
								
							@@ -59,6 +59,7 @@ github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hC
 | 
			
		||||
github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8=
 | 
			
		||||
github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=
 | 
			
		||||
github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=
 | 
			
		||||
github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs=
 | 
			
		||||
github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY=
 | 
			
		||||
github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
 | 
			
		||||
github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										2
									
								
								staging/src/k8s.io/client-go/go.sum
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										2
									
								
								staging/src/k8s.io/client-go/go.sum
									
									
									
										generated
									
									
									
								
							@@ -56,6 +56,8 @@ github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym
 | 
			
		||||
github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ=
 | 
			
		||||
github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0=
 | 
			
		||||
github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE=
 | 
			
		||||
github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio=
 | 
			
		||||
github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs=
 | 
			
		||||
github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY=
 | 
			
		||||
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
 | 
			
		||||
github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										2
									
								
								staging/src/k8s.io/cloud-provider/go.sum
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										2
									
								
								staging/src/k8s.io/cloud-provider/go.sum
									
									
									
										generated
									
									
									
								
							@@ -67,6 +67,8 @@ github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kd
 | 
			
		||||
github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=
 | 
			
		||||
github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=
 | 
			
		||||
github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=
 | 
			
		||||
github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs=
 | 
			
		||||
github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY=
 | 
			
		||||
github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY=
 | 
			
		||||
github.com/benbjohnson/clock v1.0.3/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM=
 | 
			
		||||
github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8=
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										1
									
								
								staging/src/k8s.io/cluster-bootstrap/go.sum
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										1
									
								
								staging/src/k8s.io/cluster-bootstrap/go.sum
									
									
									
										generated
									
									
									
								
							@@ -3,6 +3,7 @@ github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03
 | 
			
		||||
github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ=
 | 
			
		||||
github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0=
 | 
			
		||||
github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE=
 | 
			
		||||
github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs=
 | 
			
		||||
github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY=
 | 
			
		||||
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
 | 
			
		||||
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
 | 
			
		||||
 
 | 
			
		||||
@@ -50,6 +50,7 @@ github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tN
 | 
			
		||||
github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0=
 | 
			
		||||
github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M=
 | 
			
		||||
github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE=
 | 
			
		||||
github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs=
 | 
			
		||||
github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY=
 | 
			
		||||
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
 | 
			
		||||
github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										2
									
								
								staging/src/k8s.io/component-base/go.sum
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										2
									
								
								staging/src/k8s.io/component-base/go.sum
									
									
									
										generated
									
									
									
								
							@@ -61,6 +61,8 @@ github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kd
 | 
			
		||||
github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=
 | 
			
		||||
github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=
 | 
			
		||||
github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=
 | 
			
		||||
github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs=
 | 
			
		||||
github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY=
 | 
			
		||||
github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY=
 | 
			
		||||
github.com/benbjohnson/clock v1.0.3/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM=
 | 
			
		||||
github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8=
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										1
									
								
								staging/src/k8s.io/component-helpers/go.sum
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										1
									
								
								staging/src/k8s.io/component-helpers/go.sum
									
									
									
										generated
									
									
									
								
							@@ -48,6 +48,7 @@ github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym
 | 
			
		||||
github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ=
 | 
			
		||||
github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0=
 | 
			
		||||
github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE=
 | 
			
		||||
github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs=
 | 
			
		||||
github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY=
 | 
			
		||||
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
 | 
			
		||||
github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										1
									
								
								staging/src/k8s.io/controller-manager/go.sum
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										1
									
								
								staging/src/k8s.io/controller-manager/go.sum
									
									
									
										generated
									
									
									
								
							@@ -78,6 +78,7 @@ github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kd
 | 
			
		||||
github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=
 | 
			
		||||
github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=
 | 
			
		||||
github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=
 | 
			
		||||
github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs=
 | 
			
		||||
github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY=
 | 
			
		||||
github.com/benbjohnson/clock v1.0.3/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM=
 | 
			
		||||
github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8=
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										1
									
								
								staging/src/k8s.io/csi-translation-lib/go.sum
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										1
									
								
								staging/src/k8s.io/csi-translation-lib/go.sum
									
									
									
										generated
									
									
									
								
							@@ -3,6 +3,7 @@ github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03
 | 
			
		||||
github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ=
 | 
			
		||||
github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0=
 | 
			
		||||
github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE=
 | 
			
		||||
github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs=
 | 
			
		||||
github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY=
 | 
			
		||||
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
 | 
			
		||||
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										2
									
								
								staging/src/k8s.io/kube-aggregator/go.sum
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										2
									
								
								staging/src/k8s.io/kube-aggregator/go.sum
									
									
									
										generated
									
									
									
								
							@@ -66,6 +66,8 @@ github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kd
 | 
			
		||||
github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=
 | 
			
		||||
github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=
 | 
			
		||||
github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=
 | 
			
		||||
github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs=
 | 
			
		||||
github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY=
 | 
			
		||||
github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY=
 | 
			
		||||
github.com/benbjohnson/clock v1.0.3/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM=
 | 
			
		||||
github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8=
 | 
			
		||||
 
 | 
			
		||||
@@ -61,6 +61,8 @@ github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kd
 | 
			
		||||
github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=
 | 
			
		||||
github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=
 | 
			
		||||
github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=
 | 
			
		||||
github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs=
 | 
			
		||||
github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY=
 | 
			
		||||
github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY=
 | 
			
		||||
github.com/benbjohnson/clock v1.0.3/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM=
 | 
			
		||||
github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										3
									
								
								staging/src/k8s.io/kube-proxy/go.sum
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										3
									
								
								staging/src/k8s.io/kube-proxy/go.sum
									
									
									
										generated
									
									
									
								
							@@ -60,6 +60,9 @@ github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kd
 | 
			
		||||
github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=
 | 
			
		||||
github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=
 | 
			
		||||
github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=
 | 
			
		||||
github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs=
 | 
			
		||||
github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY=
 | 
			
		||||
github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY=
 | 
			
		||||
github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY=
 | 
			
		||||
github.com/benbjohnson/clock v1.0.3/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM=
 | 
			
		||||
github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										3
									
								
								staging/src/k8s.io/kube-scheduler/go.sum
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										3
									
								
								staging/src/k8s.io/kube-scheduler/go.sum
									
									
									
										generated
									
									
									
								
							@@ -60,6 +60,9 @@ github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kd
 | 
			
		||||
github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=
 | 
			
		||||
github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=
 | 
			
		||||
github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=
 | 
			
		||||
github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs=
 | 
			
		||||
github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY=
 | 
			
		||||
github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY=
 | 
			
		||||
github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY=
 | 
			
		||||
github.com/benbjohnson/clock v1.0.3/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM=
 | 
			
		||||
github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										4
									
								
								staging/src/k8s.io/kubectl/go.sum
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										4
									
								
								staging/src/k8s.io/kubectl/go.sum
									
									
									
										generated
									
									
									
								
							@@ -64,8 +64,12 @@ github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk5
 | 
			
		||||
github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=
 | 
			
		||||
github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=
 | 
			
		||||
github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8=
 | 
			
		||||
github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8=
 | 
			
		||||
github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=
 | 
			
		||||
github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=
 | 
			
		||||
github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio=
 | 
			
		||||
github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs=
 | 
			
		||||
github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY=
 | 
			
		||||
github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY=
 | 
			
		||||
github.com/benbjohnson/clock v1.0.3/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM=
 | 
			
		||||
github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										2
									
								
								staging/src/k8s.io/kubelet/go.sum
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										2
									
								
								staging/src/k8s.io/kubelet/go.sum
									
									
									
										generated
									
									
									
								
							@@ -60,6 +60,8 @@ github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kd
 | 
			
		||||
github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=
 | 
			
		||||
github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=
 | 
			
		||||
github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=
 | 
			
		||||
github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs=
 | 
			
		||||
github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY=
 | 
			
		||||
github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY=
 | 
			
		||||
github.com/benbjohnson/clock v1.0.3/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM=
 | 
			
		||||
github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										1
									
								
								staging/src/k8s.io/legacy-cloud-providers/go.sum
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										1
									
								
								staging/src/k8s.io/legacy-cloud-providers/go.sum
									
									
									
										generated
									
									
									
								
							@@ -77,6 +77,7 @@ github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kd
 | 
			
		||||
github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=
 | 
			
		||||
github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=
 | 
			
		||||
github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=
 | 
			
		||||
github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs=
 | 
			
		||||
github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY=
 | 
			
		||||
github.com/aws/aws-sdk-go v1.38.49 h1:E31vxjCe6a5I+mJLmUGaZobiWmg9KdWaud9IfceYeYQ=
 | 
			
		||||
github.com/aws/aws-sdk-go v1.38.49/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro=
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										1
									
								
								staging/src/k8s.io/metrics/go.sum
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										1
									
								
								staging/src/k8s.io/metrics/go.sum
									
									
									
										generated
									
									
									
								
							@@ -50,6 +50,7 @@ github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tN
 | 
			
		||||
github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0=
 | 
			
		||||
github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M=
 | 
			
		||||
github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE=
 | 
			
		||||
github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs=
 | 
			
		||||
github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY=
 | 
			
		||||
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
 | 
			
		||||
github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										1
									
								
								staging/src/k8s.io/pod-security-admission/go.sum
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										1
									
								
								staging/src/k8s.io/pod-security-admission/go.sum
									
									
									
										generated
									
									
									
								
							@@ -66,6 +66,7 @@ github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kd
 | 
			
		||||
github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=
 | 
			
		||||
github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=
 | 
			
		||||
github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=
 | 
			
		||||
github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs=
 | 
			
		||||
github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY=
 | 
			
		||||
github.com/benbjohnson/clock v1.0.3/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM=
 | 
			
		||||
github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8=
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										2
									
								
								staging/src/k8s.io/sample-apiserver/go.sum
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										2
									
								
								staging/src/k8s.io/sample-apiserver/go.sum
									
									
									
										generated
									
									
									
								
							@@ -66,6 +66,8 @@ github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kd
 | 
			
		||||
github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=
 | 
			
		||||
github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=
 | 
			
		||||
github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=
 | 
			
		||||
github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs=
 | 
			
		||||
github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY=
 | 
			
		||||
github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY=
 | 
			
		||||
github.com/benbjohnson/clock v1.0.3/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM=
 | 
			
		||||
github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8=
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										1
									
								
								staging/src/k8s.io/sample-cli-plugin/go.sum
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										1
									
								
								staging/src/k8s.io/sample-cli-plugin/go.sum
									
									
									
										generated
									
									
									
								
							@@ -59,6 +59,7 @@ github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hC
 | 
			
		||||
github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8=
 | 
			
		||||
github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=
 | 
			
		||||
github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=
 | 
			
		||||
github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs=
 | 
			
		||||
github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY=
 | 
			
		||||
github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
 | 
			
		||||
github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										1
									
								
								staging/src/k8s.io/sample-controller/go.sum
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										1
									
								
								staging/src/k8s.io/sample-controller/go.sum
									
									
									
										generated
									
									
									
								
							@@ -50,6 +50,7 @@ github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tN
 | 
			
		||||
github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0=
 | 
			
		||||
github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M=
 | 
			
		||||
github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE=
 | 
			
		||||
github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs=
 | 
			
		||||
github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY=
 | 
			
		||||
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
 | 
			
		||||
github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										22
									
								
								vendor/github.com/armon/go-socks5/.gitignore
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								vendor/github.com/armon/go-socks5/.gitignore
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,22 @@
 | 
			
		||||
# Compiled Object files, Static and Dynamic libs (Shared Objects)
 | 
			
		||||
*.o
 | 
			
		||||
*.a
 | 
			
		||||
*.so
 | 
			
		||||
 | 
			
		||||
# Folders
 | 
			
		||||
_obj
 | 
			
		||||
_test
 | 
			
		||||
 | 
			
		||||
# Architecture specific extensions/prefixes
 | 
			
		||||
*.[568vq]
 | 
			
		||||
[568vq].out
 | 
			
		||||
 | 
			
		||||
*.cgo1.go
 | 
			
		||||
*.cgo2.c
 | 
			
		||||
_cgo_defun.c
 | 
			
		||||
_cgo_gotypes.go
 | 
			
		||||
_cgo_export.*
 | 
			
		||||
 | 
			
		||||
_testmain.go
 | 
			
		||||
 | 
			
		||||
*.exe
 | 
			
		||||
							
								
								
									
										4
									
								
								vendor/github.com/armon/go-socks5/.travis.yml
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								vendor/github.com/armon/go-socks5/.travis.yml
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,4 @@
 | 
			
		||||
language: go
 | 
			
		||||
go:
 | 
			
		||||
  - 1.1
 | 
			
		||||
  - tip
 | 
			
		||||
							
								
								
									
										20
									
								
								vendor/github.com/armon/go-socks5/LICENSE
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								vendor/github.com/armon/go-socks5/LICENSE
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,20 @@
 | 
			
		||||
The MIT License (MIT)
 | 
			
		||||
 | 
			
		||||
Copyright (c) 2014 Armon Dadgar
 | 
			
		||||
 | 
			
		||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
 | 
			
		||||
this software and associated documentation files (the "Software"), to deal in
 | 
			
		||||
the Software without restriction, including without limitation the rights to
 | 
			
		||||
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
 | 
			
		||||
the Software, and to permit persons to whom the Software is furnished to do so,
 | 
			
		||||
subject to the following conditions:
 | 
			
		||||
 | 
			
		||||
The above copyright notice and this permission notice shall be included in all
 | 
			
		||||
copies or substantial portions of the Software.
 | 
			
		||||
 | 
			
		||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 | 
			
		||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
 | 
			
		||||
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
 | 
			
		||||
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
 | 
			
		||||
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 | 
			
		||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 | 
			
		||||
							
								
								
									
										45
									
								
								vendor/github.com/armon/go-socks5/README.md
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										45
									
								
								vendor/github.com/armon/go-socks5/README.md
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,45 @@
 | 
			
		||||
go-socks5 [](https://travis-ci.org/armon/go-socks5)
 | 
			
		||||
=========
 | 
			
		||||
 | 
			
		||||
Provides the `socks5` package that implements a [SOCKS5 server](http://en.wikipedia.org/wiki/SOCKS).
 | 
			
		||||
SOCKS (Secure Sockets) is used to route traffic between a client and server through
 | 
			
		||||
an intermediate proxy layer. This can be used to bypass firewalls or NATs.
 | 
			
		||||
 | 
			
		||||
Feature
 | 
			
		||||
=======
 | 
			
		||||
 | 
			
		||||
The package has the following features:
 | 
			
		||||
* "No Auth" mode
 | 
			
		||||
* User/Password authentication
 | 
			
		||||
* Support for the CONNECT command
 | 
			
		||||
* Rules to do granular filtering of commands
 | 
			
		||||
* Custom DNS resolution
 | 
			
		||||
* Unit tests
 | 
			
		||||
 | 
			
		||||
TODO
 | 
			
		||||
====
 | 
			
		||||
 | 
			
		||||
The package still needs the following:
 | 
			
		||||
* Support for the BIND command
 | 
			
		||||
* Support for the ASSOCIATE command
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Example
 | 
			
		||||
=======
 | 
			
		||||
 | 
			
		||||
Below is a simple example of usage
 | 
			
		||||
 | 
			
		||||
```go
 | 
			
		||||
// Create a SOCKS5 server
 | 
			
		||||
conf := &socks5.Config{}
 | 
			
		||||
server, err := socks5.New(conf)
 | 
			
		||||
if err != nil {
 | 
			
		||||
  panic(err)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Create SOCKS5 proxy on localhost port 8000
 | 
			
		||||
if err := server.ListenAndServe("tcp", "127.0.0.1:8000"); err != nil {
 | 
			
		||||
  panic(err)
 | 
			
		||||
}
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										151
									
								
								vendor/github.com/armon/go-socks5/auth.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										151
									
								
								vendor/github.com/armon/go-socks5/auth.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,151 @@
 | 
			
		||||
package socks5
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"io"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
const (
 | 
			
		||||
	NoAuth          = uint8(0)
 | 
			
		||||
	noAcceptable    = uint8(255)
 | 
			
		||||
	UserPassAuth    = uint8(2)
 | 
			
		||||
	userAuthVersion = uint8(1)
 | 
			
		||||
	authSuccess     = uint8(0)
 | 
			
		||||
	authFailure     = uint8(1)
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
var (
 | 
			
		||||
	UserAuthFailed  = fmt.Errorf("User authentication failed")
 | 
			
		||||
	NoSupportedAuth = fmt.Errorf("No supported authentication mechanism")
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// A Request encapsulates authentication state provided
 | 
			
		||||
// during negotiation
 | 
			
		||||
type AuthContext struct {
 | 
			
		||||
	// Provided auth method
 | 
			
		||||
	Method uint8
 | 
			
		||||
	// Payload provided during negotiation.
 | 
			
		||||
	// Keys depend on the used auth method.
 | 
			
		||||
	// For UserPassauth contains Username
 | 
			
		||||
	Payload map[string]string
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type Authenticator interface {
 | 
			
		||||
	Authenticate(reader io.Reader, writer io.Writer) (*AuthContext, error)
 | 
			
		||||
	GetCode() uint8
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// NoAuthAuthenticator is used to handle the "No Authentication" mode
 | 
			
		||||
type NoAuthAuthenticator struct{}
 | 
			
		||||
 | 
			
		||||
func (a NoAuthAuthenticator) GetCode() uint8 {
 | 
			
		||||
	return NoAuth
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (a NoAuthAuthenticator) Authenticate(reader io.Reader, writer io.Writer) (*AuthContext, error) {
 | 
			
		||||
	_, err := writer.Write([]byte{socks5Version, NoAuth})
 | 
			
		||||
	return &AuthContext{NoAuth, nil}, err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// UserPassAuthenticator is used to handle username/password based
 | 
			
		||||
// authentication
 | 
			
		||||
type UserPassAuthenticator struct {
 | 
			
		||||
	Credentials CredentialStore
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (a UserPassAuthenticator) GetCode() uint8 {
 | 
			
		||||
	return UserPassAuth
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (a UserPassAuthenticator) Authenticate(reader io.Reader, writer io.Writer) (*AuthContext, error) {
 | 
			
		||||
	// Tell the client to use user/pass auth
 | 
			
		||||
	if _, err := writer.Write([]byte{socks5Version, UserPassAuth}); err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Get the version and username length
 | 
			
		||||
	header := []byte{0, 0}
 | 
			
		||||
	if _, err := io.ReadAtLeast(reader, header, 2); err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Ensure we are compatible
 | 
			
		||||
	if header[0] != userAuthVersion {
 | 
			
		||||
		return nil, fmt.Errorf("Unsupported auth version: %v", header[0])
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Get the user name
 | 
			
		||||
	userLen := int(header[1])
 | 
			
		||||
	user := make([]byte, userLen)
 | 
			
		||||
	if _, err := io.ReadAtLeast(reader, user, userLen); err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Get the password length
 | 
			
		||||
	if _, err := reader.Read(header[:1]); err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Get the password
 | 
			
		||||
	passLen := int(header[0])
 | 
			
		||||
	pass := make([]byte, passLen)
 | 
			
		||||
	if _, err := io.ReadAtLeast(reader, pass, passLen); err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Verify the password
 | 
			
		||||
	if a.Credentials.Valid(string(user), string(pass)) {
 | 
			
		||||
		if _, err := writer.Write([]byte{userAuthVersion, authSuccess}); err != nil {
 | 
			
		||||
			return nil, err
 | 
			
		||||
		}
 | 
			
		||||
	} else {
 | 
			
		||||
		if _, err := writer.Write([]byte{userAuthVersion, authFailure}); err != nil {
 | 
			
		||||
			return nil, err
 | 
			
		||||
		}
 | 
			
		||||
		return nil, UserAuthFailed
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Done
 | 
			
		||||
	return &AuthContext{UserPassAuth, map[string]string{"Username": string(user)}}, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// authenticate is used to handle connection authentication
 | 
			
		||||
func (s *Server) authenticate(conn io.Writer, bufConn io.Reader) (*AuthContext, error) {
 | 
			
		||||
	// Get the methods
 | 
			
		||||
	methods, err := readMethods(bufConn)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, fmt.Errorf("Failed to get auth methods: %v", err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Select a usable method
 | 
			
		||||
	for _, method := range methods {
 | 
			
		||||
		cator, found := s.authMethods[method]
 | 
			
		||||
		if found {
 | 
			
		||||
			return cator.Authenticate(bufConn, conn)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// No usable method found
 | 
			
		||||
	return nil, noAcceptableAuth(conn)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// noAcceptableAuth is used to handle when we have no eligible
 | 
			
		||||
// authentication mechanism
 | 
			
		||||
func noAcceptableAuth(conn io.Writer) error {
 | 
			
		||||
	conn.Write([]byte{socks5Version, noAcceptable})
 | 
			
		||||
	return NoSupportedAuth
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// readMethods is used to read the number of methods
 | 
			
		||||
// and proceeding auth methods
 | 
			
		||||
func readMethods(r io.Reader) ([]byte, error) {
 | 
			
		||||
	header := []byte{0}
 | 
			
		||||
	if _, err := r.Read(header); err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	numMethods := int(header[0])
 | 
			
		||||
	methods := make([]byte, numMethods)
 | 
			
		||||
	_, err := io.ReadAtLeast(r, methods, numMethods)
 | 
			
		||||
	return methods, err
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										17
									
								
								vendor/github.com/armon/go-socks5/credentials.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								vendor/github.com/armon/go-socks5/credentials.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,17 @@
 | 
			
		||||
package socks5
 | 
			
		||||
 | 
			
		||||
// CredentialStore is used to support user/pass authentication
 | 
			
		||||
type CredentialStore interface {
 | 
			
		||||
	Valid(user, password string) bool
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// StaticCredentials enables using a map directly as a credential store
 | 
			
		||||
type StaticCredentials map[string]string
 | 
			
		||||
 | 
			
		||||
func (s StaticCredentials) Valid(user, password string) bool {
 | 
			
		||||
	pass, ok := s[user]
 | 
			
		||||
	if !ok {
 | 
			
		||||
		return false
 | 
			
		||||
	}
 | 
			
		||||
	return password == pass
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										364
									
								
								vendor/github.com/armon/go-socks5/request.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										364
									
								
								vendor/github.com/armon/go-socks5/request.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,364 @@
 | 
			
		||||
package socks5
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"io"
 | 
			
		||||
	"net"
 | 
			
		||||
	"strconv"
 | 
			
		||||
	"strings"
 | 
			
		||||
 | 
			
		||||
	"golang.org/x/net/context"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
const (
 | 
			
		||||
	ConnectCommand   = uint8(1)
 | 
			
		||||
	BindCommand      = uint8(2)
 | 
			
		||||
	AssociateCommand = uint8(3)
 | 
			
		||||
	ipv4Address      = uint8(1)
 | 
			
		||||
	fqdnAddress      = uint8(3)
 | 
			
		||||
	ipv6Address      = uint8(4)
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
const (
 | 
			
		||||
	successReply uint8 = iota
 | 
			
		||||
	serverFailure
 | 
			
		||||
	ruleFailure
 | 
			
		||||
	networkUnreachable
 | 
			
		||||
	hostUnreachable
 | 
			
		||||
	connectionRefused
 | 
			
		||||
	ttlExpired
 | 
			
		||||
	commandNotSupported
 | 
			
		||||
	addrTypeNotSupported
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
var (
 | 
			
		||||
	unrecognizedAddrType = fmt.Errorf("Unrecognized address type")
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// AddressRewriter is used to rewrite a destination transparently
 | 
			
		||||
type AddressRewriter interface {
 | 
			
		||||
	Rewrite(ctx context.Context, request *Request) (context.Context, *AddrSpec)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// AddrSpec is used to return the target AddrSpec
 | 
			
		||||
// which may be specified as IPv4, IPv6, or a FQDN
 | 
			
		||||
type AddrSpec struct {
 | 
			
		||||
	FQDN string
 | 
			
		||||
	IP   net.IP
 | 
			
		||||
	Port int
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (a *AddrSpec) String() string {
 | 
			
		||||
	if a.FQDN != "" {
 | 
			
		||||
		return fmt.Sprintf("%s (%s):%d", a.FQDN, a.IP, a.Port)
 | 
			
		||||
	}
 | 
			
		||||
	return fmt.Sprintf("%s:%d", a.IP, a.Port)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Address returns a string suitable to dial; prefer returning IP-based
 | 
			
		||||
// address, fallback to FQDN
 | 
			
		||||
func (a AddrSpec) Address() string {
 | 
			
		||||
	if 0 != len(a.IP) {
 | 
			
		||||
		return net.JoinHostPort(a.IP.String(), strconv.Itoa(a.Port))
 | 
			
		||||
	}
 | 
			
		||||
	return net.JoinHostPort(a.FQDN, strconv.Itoa(a.Port))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// A Request represents request received by a server
 | 
			
		||||
type Request struct {
 | 
			
		||||
	// Protocol version
 | 
			
		||||
	Version uint8
 | 
			
		||||
	// Requested command
 | 
			
		||||
	Command uint8
 | 
			
		||||
	// AuthContext provided during negotiation
 | 
			
		||||
	AuthContext *AuthContext
 | 
			
		||||
	// AddrSpec of the the network that sent the request
 | 
			
		||||
	RemoteAddr *AddrSpec
 | 
			
		||||
	// AddrSpec of the desired destination
 | 
			
		||||
	DestAddr *AddrSpec
 | 
			
		||||
	// AddrSpec of the actual destination (might be affected by rewrite)
 | 
			
		||||
	realDestAddr *AddrSpec
 | 
			
		||||
	bufConn      io.Reader
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type conn interface {
 | 
			
		||||
	Write([]byte) (int, error)
 | 
			
		||||
	RemoteAddr() net.Addr
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// NewRequest creates a new Request from the tcp connection
 | 
			
		||||
func NewRequest(bufConn io.Reader) (*Request, error) {
 | 
			
		||||
	// Read the version byte
 | 
			
		||||
	header := []byte{0, 0, 0}
 | 
			
		||||
	if _, err := io.ReadAtLeast(bufConn, header, 3); err != nil {
 | 
			
		||||
		return nil, fmt.Errorf("Failed to get command version: %v", err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Ensure we are compatible
 | 
			
		||||
	if header[0] != socks5Version {
 | 
			
		||||
		return nil, fmt.Errorf("Unsupported command version: %v", header[0])
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Read in the destination address
 | 
			
		||||
	dest, err := readAddrSpec(bufConn)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	request := &Request{
 | 
			
		||||
		Version:  socks5Version,
 | 
			
		||||
		Command:  header[1],
 | 
			
		||||
		DestAddr: dest,
 | 
			
		||||
		bufConn:  bufConn,
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return request, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// handleRequest is used for request processing after authentication
 | 
			
		||||
func (s *Server) handleRequest(req *Request, conn conn) error {
 | 
			
		||||
	ctx := context.Background()
 | 
			
		||||
 | 
			
		||||
	// Resolve the address if we have a FQDN
 | 
			
		||||
	dest := req.DestAddr
 | 
			
		||||
	if dest.FQDN != "" {
 | 
			
		||||
		ctx_, addr, err := s.config.Resolver.Resolve(ctx, dest.FQDN)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			if err := sendReply(conn, hostUnreachable, nil); err != nil {
 | 
			
		||||
				return fmt.Errorf("Failed to send reply: %v", err)
 | 
			
		||||
			}
 | 
			
		||||
			return fmt.Errorf("Failed to resolve destination '%v': %v", dest.FQDN, err)
 | 
			
		||||
		}
 | 
			
		||||
		ctx = ctx_
 | 
			
		||||
		dest.IP = addr
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Apply any address rewrites
 | 
			
		||||
	req.realDestAddr = req.DestAddr
 | 
			
		||||
	if s.config.Rewriter != nil {
 | 
			
		||||
		ctx, req.realDestAddr = s.config.Rewriter.Rewrite(ctx, req)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Switch on the command
 | 
			
		||||
	switch req.Command {
 | 
			
		||||
	case ConnectCommand:
 | 
			
		||||
		return s.handleConnect(ctx, conn, req)
 | 
			
		||||
	case BindCommand:
 | 
			
		||||
		return s.handleBind(ctx, conn, req)
 | 
			
		||||
	case AssociateCommand:
 | 
			
		||||
		return s.handleAssociate(ctx, conn, req)
 | 
			
		||||
	default:
 | 
			
		||||
		if err := sendReply(conn, commandNotSupported, nil); err != nil {
 | 
			
		||||
			return fmt.Errorf("Failed to send reply: %v", err)
 | 
			
		||||
		}
 | 
			
		||||
		return fmt.Errorf("Unsupported command: %v", req.Command)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// handleConnect is used to handle a connect command
 | 
			
		||||
func (s *Server) handleConnect(ctx context.Context, conn conn, req *Request) error {
 | 
			
		||||
	// Check if this is allowed
 | 
			
		||||
	if ctx_, ok := s.config.Rules.Allow(ctx, req); !ok {
 | 
			
		||||
		if err := sendReply(conn, ruleFailure, nil); err != nil {
 | 
			
		||||
			return fmt.Errorf("Failed to send reply: %v", err)
 | 
			
		||||
		}
 | 
			
		||||
		return fmt.Errorf("Connect to %v blocked by rules", req.DestAddr)
 | 
			
		||||
	} else {
 | 
			
		||||
		ctx = ctx_
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Attempt to connect
 | 
			
		||||
	dial := s.config.Dial
 | 
			
		||||
	if dial == nil {
 | 
			
		||||
		dial = func(ctx context.Context, net_, addr string) (net.Conn, error) {
 | 
			
		||||
			return net.Dial(net_, addr)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	target, err := dial(ctx, "tcp", req.realDestAddr.Address())
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		msg := err.Error()
 | 
			
		||||
		resp := hostUnreachable
 | 
			
		||||
		if strings.Contains(msg, "refused") {
 | 
			
		||||
			resp = connectionRefused
 | 
			
		||||
		} else if strings.Contains(msg, "network is unreachable") {
 | 
			
		||||
			resp = networkUnreachable
 | 
			
		||||
		}
 | 
			
		||||
		if err := sendReply(conn, resp, nil); err != nil {
 | 
			
		||||
			return fmt.Errorf("Failed to send reply: %v", err)
 | 
			
		||||
		}
 | 
			
		||||
		return fmt.Errorf("Connect to %v failed: %v", req.DestAddr, err)
 | 
			
		||||
	}
 | 
			
		||||
	defer target.Close()
 | 
			
		||||
 | 
			
		||||
	// Send success
 | 
			
		||||
	local := target.LocalAddr().(*net.TCPAddr)
 | 
			
		||||
	bind := AddrSpec{IP: local.IP, Port: local.Port}
 | 
			
		||||
	if err := sendReply(conn, successReply, &bind); err != nil {
 | 
			
		||||
		return fmt.Errorf("Failed to send reply: %v", err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Start proxying
 | 
			
		||||
	errCh := make(chan error, 2)
 | 
			
		||||
	go proxy(target, req.bufConn, errCh)
 | 
			
		||||
	go proxy(conn, target, errCh)
 | 
			
		||||
 | 
			
		||||
	// Wait
 | 
			
		||||
	for i := 0; i < 2; i++ {
 | 
			
		||||
		e := <-errCh
 | 
			
		||||
		if e != nil {
 | 
			
		||||
			// return from this function closes target (and conn).
 | 
			
		||||
			return e
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// handleBind is used to handle a connect command
 | 
			
		||||
func (s *Server) handleBind(ctx context.Context, conn conn, req *Request) error {
 | 
			
		||||
	// Check if this is allowed
 | 
			
		||||
	if ctx_, ok := s.config.Rules.Allow(ctx, req); !ok {
 | 
			
		||||
		if err := sendReply(conn, ruleFailure, nil); err != nil {
 | 
			
		||||
			return fmt.Errorf("Failed to send reply: %v", err)
 | 
			
		||||
		}
 | 
			
		||||
		return fmt.Errorf("Bind to %v blocked by rules", req.DestAddr)
 | 
			
		||||
	} else {
 | 
			
		||||
		ctx = ctx_
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// TODO: Support bind
 | 
			
		||||
	if err := sendReply(conn, commandNotSupported, nil); err != nil {
 | 
			
		||||
		return fmt.Errorf("Failed to send reply: %v", err)
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// handleAssociate is used to handle a connect command
 | 
			
		||||
func (s *Server) handleAssociate(ctx context.Context, conn conn, req *Request) error {
 | 
			
		||||
	// Check if this is allowed
 | 
			
		||||
	if ctx_, ok := s.config.Rules.Allow(ctx, req); !ok {
 | 
			
		||||
		if err := sendReply(conn, ruleFailure, nil); err != nil {
 | 
			
		||||
			return fmt.Errorf("Failed to send reply: %v", err)
 | 
			
		||||
		}
 | 
			
		||||
		return fmt.Errorf("Associate to %v blocked by rules", req.DestAddr)
 | 
			
		||||
	} else {
 | 
			
		||||
		ctx = ctx_
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// TODO: Support associate
 | 
			
		||||
	if err := sendReply(conn, commandNotSupported, nil); err != nil {
 | 
			
		||||
		return fmt.Errorf("Failed to send reply: %v", err)
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// readAddrSpec is used to read AddrSpec.
 | 
			
		||||
// Expects an address type byte, follwed by the address and port
 | 
			
		||||
func readAddrSpec(r io.Reader) (*AddrSpec, error) {
 | 
			
		||||
	d := &AddrSpec{}
 | 
			
		||||
 | 
			
		||||
	// Get the address type
 | 
			
		||||
	addrType := []byte{0}
 | 
			
		||||
	if _, err := r.Read(addrType); err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Handle on a per type basis
 | 
			
		||||
	switch addrType[0] {
 | 
			
		||||
	case ipv4Address:
 | 
			
		||||
		addr := make([]byte, 4)
 | 
			
		||||
		if _, err := io.ReadAtLeast(r, addr, len(addr)); err != nil {
 | 
			
		||||
			return nil, err
 | 
			
		||||
		}
 | 
			
		||||
		d.IP = net.IP(addr)
 | 
			
		||||
 | 
			
		||||
	case ipv6Address:
 | 
			
		||||
		addr := make([]byte, 16)
 | 
			
		||||
		if _, err := io.ReadAtLeast(r, addr, len(addr)); err != nil {
 | 
			
		||||
			return nil, err
 | 
			
		||||
		}
 | 
			
		||||
		d.IP = net.IP(addr)
 | 
			
		||||
 | 
			
		||||
	case fqdnAddress:
 | 
			
		||||
		if _, err := r.Read(addrType); err != nil {
 | 
			
		||||
			return nil, err
 | 
			
		||||
		}
 | 
			
		||||
		addrLen := int(addrType[0])
 | 
			
		||||
		fqdn := make([]byte, addrLen)
 | 
			
		||||
		if _, err := io.ReadAtLeast(r, fqdn, addrLen); err != nil {
 | 
			
		||||
			return nil, err
 | 
			
		||||
		}
 | 
			
		||||
		d.FQDN = string(fqdn)
 | 
			
		||||
 | 
			
		||||
	default:
 | 
			
		||||
		return nil, unrecognizedAddrType
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Read the port
 | 
			
		||||
	port := []byte{0, 0}
 | 
			
		||||
	if _, err := io.ReadAtLeast(r, port, 2); err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	d.Port = (int(port[0]) << 8) | int(port[1])
 | 
			
		||||
 | 
			
		||||
	return d, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// sendReply is used to send a reply message
 | 
			
		||||
func sendReply(w io.Writer, resp uint8, addr *AddrSpec) error {
 | 
			
		||||
	// Format the address
 | 
			
		||||
	var addrType uint8
 | 
			
		||||
	var addrBody []byte
 | 
			
		||||
	var addrPort uint16
 | 
			
		||||
	switch {
 | 
			
		||||
	case addr == nil:
 | 
			
		||||
		addrType = ipv4Address
 | 
			
		||||
		addrBody = []byte{0, 0, 0, 0}
 | 
			
		||||
		addrPort = 0
 | 
			
		||||
 | 
			
		||||
	case addr.FQDN != "":
 | 
			
		||||
		addrType = fqdnAddress
 | 
			
		||||
		addrBody = append([]byte{byte(len(addr.FQDN))}, addr.FQDN...)
 | 
			
		||||
		addrPort = uint16(addr.Port)
 | 
			
		||||
 | 
			
		||||
	case addr.IP.To4() != nil:
 | 
			
		||||
		addrType = ipv4Address
 | 
			
		||||
		addrBody = []byte(addr.IP.To4())
 | 
			
		||||
		addrPort = uint16(addr.Port)
 | 
			
		||||
 | 
			
		||||
	case addr.IP.To16() != nil:
 | 
			
		||||
		addrType = ipv6Address
 | 
			
		||||
		addrBody = []byte(addr.IP.To16())
 | 
			
		||||
		addrPort = uint16(addr.Port)
 | 
			
		||||
 | 
			
		||||
	default:
 | 
			
		||||
		return fmt.Errorf("Failed to format address: %v", addr)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Format the message
 | 
			
		||||
	msg := make([]byte, 6+len(addrBody))
 | 
			
		||||
	msg[0] = socks5Version
 | 
			
		||||
	msg[1] = resp
 | 
			
		||||
	msg[2] = 0 // Reserved
 | 
			
		||||
	msg[3] = addrType
 | 
			
		||||
	copy(msg[4:], addrBody)
 | 
			
		||||
	msg[4+len(addrBody)] = byte(addrPort >> 8)
 | 
			
		||||
	msg[4+len(addrBody)+1] = byte(addrPort & 0xff)
 | 
			
		||||
 | 
			
		||||
	// Send the message
 | 
			
		||||
	_, err := w.Write(msg)
 | 
			
		||||
	return err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type closeWriter interface {
 | 
			
		||||
	CloseWrite() error
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// proxy is used to suffle data from src to destination, and sends errors
 | 
			
		||||
// down a dedicated channel
 | 
			
		||||
func proxy(dst io.Writer, src io.Reader, errCh chan error) {
 | 
			
		||||
	_, err := io.Copy(dst, src)
 | 
			
		||||
	if tcpConn, ok := dst.(closeWriter); ok {
 | 
			
		||||
		tcpConn.CloseWrite()
 | 
			
		||||
	}
 | 
			
		||||
	errCh <- err
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										23
									
								
								vendor/github.com/armon/go-socks5/resolver.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								vendor/github.com/armon/go-socks5/resolver.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,23 @@
 | 
			
		||||
package socks5
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"net"
 | 
			
		||||
 | 
			
		||||
	"golang.org/x/net/context"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// NameResolver is used to implement custom name resolution
 | 
			
		||||
type NameResolver interface {
 | 
			
		||||
	Resolve(ctx context.Context, name string) (context.Context, net.IP, error)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// DNSResolver uses the system DNS to resolve host names
 | 
			
		||||
type DNSResolver struct{}
 | 
			
		||||
 | 
			
		||||
func (d DNSResolver) Resolve(ctx context.Context, name string) (context.Context, net.IP, error) {
 | 
			
		||||
	addr, err := net.ResolveIPAddr("ip", name)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return ctx, nil, err
 | 
			
		||||
	}
 | 
			
		||||
	return ctx, addr.IP, err
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										41
									
								
								vendor/github.com/armon/go-socks5/ruleset.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										41
									
								
								vendor/github.com/armon/go-socks5/ruleset.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,41 @@
 | 
			
		||||
package socks5
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"golang.org/x/net/context"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// RuleSet is used to provide custom rules to allow or prohibit actions
 | 
			
		||||
type RuleSet interface {
 | 
			
		||||
	Allow(ctx context.Context, req *Request) (context.Context, bool)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// PermitAll returns a RuleSet which allows all types of connections
 | 
			
		||||
func PermitAll() RuleSet {
 | 
			
		||||
	return &PermitCommand{true, true, true}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// PermitNone returns a RuleSet which disallows all types of connections
 | 
			
		||||
func PermitNone() RuleSet {
 | 
			
		||||
	return &PermitCommand{false, false, false}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// PermitCommand is an implementation of the RuleSet which
 | 
			
		||||
// enables filtering supported commands
 | 
			
		||||
type PermitCommand struct {
 | 
			
		||||
	EnableConnect   bool
 | 
			
		||||
	EnableBind      bool
 | 
			
		||||
	EnableAssociate bool
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (p *PermitCommand) Allow(ctx context.Context, req *Request) (context.Context, bool) {
 | 
			
		||||
	switch req.Command {
 | 
			
		||||
	case ConnectCommand:
 | 
			
		||||
		return ctx, p.EnableConnect
 | 
			
		||||
	case BindCommand:
 | 
			
		||||
		return ctx, p.EnableBind
 | 
			
		||||
	case AssociateCommand:
 | 
			
		||||
		return ctx, p.EnableAssociate
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return ctx, false
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										169
									
								
								vendor/github.com/armon/go-socks5/socks5.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										169
									
								
								vendor/github.com/armon/go-socks5/socks5.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,169 @@
 | 
			
		||||
package socks5
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"bufio"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"log"
 | 
			
		||||
	"net"
 | 
			
		||||
	"os"
 | 
			
		||||
 | 
			
		||||
	"golang.org/x/net/context"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
const (
 | 
			
		||||
	socks5Version = uint8(5)
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// Config is used to setup and configure a Server
 | 
			
		||||
type Config struct {
 | 
			
		||||
	// AuthMethods can be provided to implement custom authentication
 | 
			
		||||
	// By default, "auth-less" mode is enabled.
 | 
			
		||||
	// For password-based auth use UserPassAuthenticator.
 | 
			
		||||
	AuthMethods []Authenticator
 | 
			
		||||
 | 
			
		||||
	// If provided, username/password authentication is enabled,
 | 
			
		||||
	// by appending a UserPassAuthenticator to AuthMethods. If not provided,
 | 
			
		||||
	// and AUthMethods is nil, then "auth-less" mode is enabled.
 | 
			
		||||
	Credentials CredentialStore
 | 
			
		||||
 | 
			
		||||
	// Resolver can be provided to do custom name resolution.
 | 
			
		||||
	// Defaults to DNSResolver if not provided.
 | 
			
		||||
	Resolver NameResolver
 | 
			
		||||
 | 
			
		||||
	// Rules is provided to enable custom logic around permitting
 | 
			
		||||
	// various commands. If not provided, PermitAll is used.
 | 
			
		||||
	Rules RuleSet
 | 
			
		||||
 | 
			
		||||
	// Rewriter can be used to transparently rewrite addresses.
 | 
			
		||||
	// This is invoked before the RuleSet is invoked.
 | 
			
		||||
	// Defaults to NoRewrite.
 | 
			
		||||
	Rewriter AddressRewriter
 | 
			
		||||
 | 
			
		||||
	// BindIP is used for bind or udp associate
 | 
			
		||||
	BindIP net.IP
 | 
			
		||||
 | 
			
		||||
	// Logger can be used to provide a custom log target.
 | 
			
		||||
	// Defaults to stdout.
 | 
			
		||||
	Logger *log.Logger
 | 
			
		||||
 | 
			
		||||
	// Optional function for dialing out
 | 
			
		||||
	Dial func(ctx context.Context, network, addr string) (net.Conn, error)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Server is reponsible for accepting connections and handling
 | 
			
		||||
// the details of the SOCKS5 protocol
 | 
			
		||||
type Server struct {
 | 
			
		||||
	config      *Config
 | 
			
		||||
	authMethods map[uint8]Authenticator
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// New creates a new Server and potentially returns an error
 | 
			
		||||
func New(conf *Config) (*Server, error) {
 | 
			
		||||
	// Ensure we have at least one authentication method enabled
 | 
			
		||||
	if len(conf.AuthMethods) == 0 {
 | 
			
		||||
		if conf.Credentials != nil {
 | 
			
		||||
			conf.AuthMethods = []Authenticator{&UserPassAuthenticator{conf.Credentials}}
 | 
			
		||||
		} else {
 | 
			
		||||
			conf.AuthMethods = []Authenticator{&NoAuthAuthenticator{}}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Ensure we have a DNS resolver
 | 
			
		||||
	if conf.Resolver == nil {
 | 
			
		||||
		conf.Resolver = DNSResolver{}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Ensure we have a rule set
 | 
			
		||||
	if conf.Rules == nil {
 | 
			
		||||
		conf.Rules = PermitAll()
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Ensure we have a log target
 | 
			
		||||
	if conf.Logger == nil {
 | 
			
		||||
		conf.Logger = log.New(os.Stdout, "", log.LstdFlags)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	server := &Server{
 | 
			
		||||
		config: conf,
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	server.authMethods = make(map[uint8]Authenticator)
 | 
			
		||||
 | 
			
		||||
	for _, a := range conf.AuthMethods {
 | 
			
		||||
		server.authMethods[a.GetCode()] = a
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return server, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ListenAndServe is used to create a listener and serve on it
 | 
			
		||||
func (s *Server) ListenAndServe(network, addr string) error {
 | 
			
		||||
	l, err := net.Listen(network, addr)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	return s.Serve(l)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Serve is used to serve connections from a listener
 | 
			
		||||
func (s *Server) Serve(l net.Listener) error {
 | 
			
		||||
	for {
 | 
			
		||||
		conn, err := l.Accept()
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
		go s.ServeConn(conn)
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ServeConn is used to serve a single connection.
 | 
			
		||||
func (s *Server) ServeConn(conn net.Conn) error {
 | 
			
		||||
	defer conn.Close()
 | 
			
		||||
	bufConn := bufio.NewReader(conn)
 | 
			
		||||
 | 
			
		||||
	// Read the version byte
 | 
			
		||||
	version := []byte{0}
 | 
			
		||||
	if _, err := bufConn.Read(version); err != nil {
 | 
			
		||||
		s.config.Logger.Printf("[ERR] socks: Failed to get version byte: %v", err)
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Ensure we are compatible
 | 
			
		||||
	if version[0] != socks5Version {
 | 
			
		||||
		err := fmt.Errorf("Unsupported SOCKS version: %v", version)
 | 
			
		||||
		s.config.Logger.Printf("[ERR] socks: %v", err)
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Authenticate the connection
 | 
			
		||||
	authContext, err := s.authenticate(conn, bufConn)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		err = fmt.Errorf("Failed to authenticate: %v", err)
 | 
			
		||||
		s.config.Logger.Printf("[ERR] socks: %v", err)
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	request, err := NewRequest(bufConn)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		if err == unrecognizedAddrType {
 | 
			
		||||
			if err := sendReply(conn, addrTypeNotSupported, nil); err != nil {
 | 
			
		||||
				return fmt.Errorf("Failed to send reply: %v", err)
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		return fmt.Errorf("Failed to read destination address: %v", err)
 | 
			
		||||
	}
 | 
			
		||||
	request.AuthContext = authContext
 | 
			
		||||
	if client, ok := conn.RemoteAddr().(*net.TCPAddr); ok {
 | 
			
		||||
		request.RemoteAddr = &AddrSpec{IP: client.IP, Port: client.Port}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Process the client request
 | 
			
		||||
	if err := s.handleRequest(request, conn); err != nil {
 | 
			
		||||
		err = fmt.Errorf("Failed to handle request: %v", err)
 | 
			
		||||
		s.config.Logger.Printf("[ERR] socks: %v", err)
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										168
									
								
								vendor/golang.org/x/net/internal/socks/client.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										168
									
								
								vendor/golang.org/x/net/internal/socks/client.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,168 @@
 | 
			
		||||
// Copyright 2018 The Go Authors. All rights reserved.
 | 
			
		||||
// Use of this source code is governed by a BSD-style
 | 
			
		||||
// license that can be found in the LICENSE file.
 | 
			
		||||
 | 
			
		||||
package socks
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"context"
 | 
			
		||||
	"errors"
 | 
			
		||||
	"io"
 | 
			
		||||
	"net"
 | 
			
		||||
	"strconv"
 | 
			
		||||
	"time"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
var (
 | 
			
		||||
	noDeadline   = time.Time{}
 | 
			
		||||
	aLongTimeAgo = time.Unix(1, 0)
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func (d *Dialer) connect(ctx context.Context, c net.Conn, address string) (_ net.Addr, ctxErr error) {
 | 
			
		||||
	host, port, err := splitHostPort(address)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	if deadline, ok := ctx.Deadline(); ok && !deadline.IsZero() {
 | 
			
		||||
		c.SetDeadline(deadline)
 | 
			
		||||
		defer c.SetDeadline(noDeadline)
 | 
			
		||||
	}
 | 
			
		||||
	if ctx != context.Background() {
 | 
			
		||||
		errCh := make(chan error, 1)
 | 
			
		||||
		done := make(chan struct{})
 | 
			
		||||
		defer func() {
 | 
			
		||||
			close(done)
 | 
			
		||||
			if ctxErr == nil {
 | 
			
		||||
				ctxErr = <-errCh
 | 
			
		||||
			}
 | 
			
		||||
		}()
 | 
			
		||||
		go func() {
 | 
			
		||||
			select {
 | 
			
		||||
			case <-ctx.Done():
 | 
			
		||||
				c.SetDeadline(aLongTimeAgo)
 | 
			
		||||
				errCh <- ctx.Err()
 | 
			
		||||
			case <-done:
 | 
			
		||||
				errCh <- nil
 | 
			
		||||
			}
 | 
			
		||||
		}()
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	b := make([]byte, 0, 6+len(host)) // the size here is just an estimate
 | 
			
		||||
	b = append(b, Version5)
 | 
			
		||||
	if len(d.AuthMethods) == 0 || d.Authenticate == nil {
 | 
			
		||||
		b = append(b, 1, byte(AuthMethodNotRequired))
 | 
			
		||||
	} else {
 | 
			
		||||
		ams := d.AuthMethods
 | 
			
		||||
		if len(ams) > 255 {
 | 
			
		||||
			return nil, errors.New("too many authentication methods")
 | 
			
		||||
		}
 | 
			
		||||
		b = append(b, byte(len(ams)))
 | 
			
		||||
		for _, am := range ams {
 | 
			
		||||
			b = append(b, byte(am))
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	if _, ctxErr = c.Write(b); ctxErr != nil {
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if _, ctxErr = io.ReadFull(c, b[:2]); ctxErr != nil {
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	if b[0] != Version5 {
 | 
			
		||||
		return nil, errors.New("unexpected protocol version " + strconv.Itoa(int(b[0])))
 | 
			
		||||
	}
 | 
			
		||||
	am := AuthMethod(b[1])
 | 
			
		||||
	if am == AuthMethodNoAcceptableMethods {
 | 
			
		||||
		return nil, errors.New("no acceptable authentication methods")
 | 
			
		||||
	}
 | 
			
		||||
	if d.Authenticate != nil {
 | 
			
		||||
		if ctxErr = d.Authenticate(ctx, c, am); ctxErr != nil {
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	b = b[:0]
 | 
			
		||||
	b = append(b, Version5, byte(d.cmd), 0)
 | 
			
		||||
	if ip := net.ParseIP(host); ip != nil {
 | 
			
		||||
		if ip4 := ip.To4(); ip4 != nil {
 | 
			
		||||
			b = append(b, AddrTypeIPv4)
 | 
			
		||||
			b = append(b, ip4...)
 | 
			
		||||
		} else if ip6 := ip.To16(); ip6 != nil {
 | 
			
		||||
			b = append(b, AddrTypeIPv6)
 | 
			
		||||
			b = append(b, ip6...)
 | 
			
		||||
		} else {
 | 
			
		||||
			return nil, errors.New("unknown address type")
 | 
			
		||||
		}
 | 
			
		||||
	} else {
 | 
			
		||||
		if len(host) > 255 {
 | 
			
		||||
			return nil, errors.New("FQDN too long")
 | 
			
		||||
		}
 | 
			
		||||
		b = append(b, AddrTypeFQDN)
 | 
			
		||||
		b = append(b, byte(len(host)))
 | 
			
		||||
		b = append(b, host...)
 | 
			
		||||
	}
 | 
			
		||||
	b = append(b, byte(port>>8), byte(port))
 | 
			
		||||
	if _, ctxErr = c.Write(b); ctxErr != nil {
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if _, ctxErr = io.ReadFull(c, b[:4]); ctxErr != nil {
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	if b[0] != Version5 {
 | 
			
		||||
		return nil, errors.New("unexpected protocol version " + strconv.Itoa(int(b[0])))
 | 
			
		||||
	}
 | 
			
		||||
	if cmdErr := Reply(b[1]); cmdErr != StatusSucceeded {
 | 
			
		||||
		return nil, errors.New("unknown error " + cmdErr.String())
 | 
			
		||||
	}
 | 
			
		||||
	if b[2] != 0 {
 | 
			
		||||
		return nil, errors.New("non-zero reserved field")
 | 
			
		||||
	}
 | 
			
		||||
	l := 2
 | 
			
		||||
	var a Addr
 | 
			
		||||
	switch b[3] {
 | 
			
		||||
	case AddrTypeIPv4:
 | 
			
		||||
		l += net.IPv4len
 | 
			
		||||
		a.IP = make(net.IP, net.IPv4len)
 | 
			
		||||
	case AddrTypeIPv6:
 | 
			
		||||
		l += net.IPv6len
 | 
			
		||||
		a.IP = make(net.IP, net.IPv6len)
 | 
			
		||||
	case AddrTypeFQDN:
 | 
			
		||||
		if _, err := io.ReadFull(c, b[:1]); err != nil {
 | 
			
		||||
			return nil, err
 | 
			
		||||
		}
 | 
			
		||||
		l += int(b[0])
 | 
			
		||||
	default:
 | 
			
		||||
		return nil, errors.New("unknown address type " + strconv.Itoa(int(b[3])))
 | 
			
		||||
	}
 | 
			
		||||
	if cap(b) < l {
 | 
			
		||||
		b = make([]byte, l)
 | 
			
		||||
	} else {
 | 
			
		||||
		b = b[:l]
 | 
			
		||||
	}
 | 
			
		||||
	if _, ctxErr = io.ReadFull(c, b); ctxErr != nil {
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	if a.IP != nil {
 | 
			
		||||
		copy(a.IP, b)
 | 
			
		||||
	} else {
 | 
			
		||||
		a.Name = string(b[:len(b)-2])
 | 
			
		||||
	}
 | 
			
		||||
	a.Port = int(b[len(b)-2])<<8 | int(b[len(b)-1])
 | 
			
		||||
	return &a, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func splitHostPort(address string) (string, int, error) {
 | 
			
		||||
	host, port, err := net.SplitHostPort(address)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return "", 0, err
 | 
			
		||||
	}
 | 
			
		||||
	portnum, err := strconv.Atoi(port)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return "", 0, err
 | 
			
		||||
	}
 | 
			
		||||
	if 1 > portnum || portnum > 0xffff {
 | 
			
		||||
		return "", 0, errors.New("port number out of range " + port)
 | 
			
		||||
	}
 | 
			
		||||
	return host, portnum, nil
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										317
									
								
								vendor/golang.org/x/net/internal/socks/socks.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										317
									
								
								vendor/golang.org/x/net/internal/socks/socks.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,317 @@
 | 
			
		||||
// Copyright 2018 The Go Authors. All rights reserved.
 | 
			
		||||
// Use of this source code is governed by a BSD-style
 | 
			
		||||
// license that can be found in the LICENSE file.
 | 
			
		||||
 | 
			
		||||
// Package socks provides a SOCKS version 5 client implementation.
 | 
			
		||||
//
 | 
			
		||||
// SOCKS protocol version 5 is defined in RFC 1928.
 | 
			
		||||
// Username/Password authentication for SOCKS version 5 is defined in
 | 
			
		||||
// RFC 1929.
 | 
			
		||||
package socks
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"context"
 | 
			
		||||
	"errors"
 | 
			
		||||
	"io"
 | 
			
		||||
	"net"
 | 
			
		||||
	"strconv"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// A Command represents a SOCKS command.
 | 
			
		||||
type Command int
 | 
			
		||||
 | 
			
		||||
func (cmd Command) String() string {
 | 
			
		||||
	switch cmd {
 | 
			
		||||
	case CmdConnect:
 | 
			
		||||
		return "socks connect"
 | 
			
		||||
	case cmdBind:
 | 
			
		||||
		return "socks bind"
 | 
			
		||||
	default:
 | 
			
		||||
		return "socks " + strconv.Itoa(int(cmd))
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// An AuthMethod represents a SOCKS authentication method.
 | 
			
		||||
type AuthMethod int
 | 
			
		||||
 | 
			
		||||
// A Reply represents a SOCKS command reply code.
 | 
			
		||||
type Reply int
 | 
			
		||||
 | 
			
		||||
func (code Reply) String() string {
 | 
			
		||||
	switch code {
 | 
			
		||||
	case StatusSucceeded:
 | 
			
		||||
		return "succeeded"
 | 
			
		||||
	case 0x01:
 | 
			
		||||
		return "general SOCKS server failure"
 | 
			
		||||
	case 0x02:
 | 
			
		||||
		return "connection not allowed by ruleset"
 | 
			
		||||
	case 0x03:
 | 
			
		||||
		return "network unreachable"
 | 
			
		||||
	case 0x04:
 | 
			
		||||
		return "host unreachable"
 | 
			
		||||
	case 0x05:
 | 
			
		||||
		return "connection refused"
 | 
			
		||||
	case 0x06:
 | 
			
		||||
		return "TTL expired"
 | 
			
		||||
	case 0x07:
 | 
			
		||||
		return "command not supported"
 | 
			
		||||
	case 0x08:
 | 
			
		||||
		return "address type not supported"
 | 
			
		||||
	default:
 | 
			
		||||
		return "unknown code: " + strconv.Itoa(int(code))
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Wire protocol constants.
 | 
			
		||||
const (
 | 
			
		||||
	Version5 = 0x05
 | 
			
		||||
 | 
			
		||||
	AddrTypeIPv4 = 0x01
 | 
			
		||||
	AddrTypeFQDN = 0x03
 | 
			
		||||
	AddrTypeIPv6 = 0x04
 | 
			
		||||
 | 
			
		||||
	CmdConnect Command = 0x01 // establishes an active-open forward proxy connection
 | 
			
		||||
	cmdBind    Command = 0x02 // establishes a passive-open forward proxy connection
 | 
			
		||||
 | 
			
		||||
	AuthMethodNotRequired         AuthMethod = 0x00 // no authentication required
 | 
			
		||||
	AuthMethodUsernamePassword    AuthMethod = 0x02 // use username/password
 | 
			
		||||
	AuthMethodNoAcceptableMethods AuthMethod = 0xff // no acceptable authentication methods
 | 
			
		||||
 | 
			
		||||
	StatusSucceeded Reply = 0x00
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// An Addr represents a SOCKS-specific address.
 | 
			
		||||
// Either Name or IP is used exclusively.
 | 
			
		||||
type Addr struct {
 | 
			
		||||
	Name string // fully-qualified domain name
 | 
			
		||||
	IP   net.IP
 | 
			
		||||
	Port int
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (a *Addr) Network() string { return "socks" }
 | 
			
		||||
 | 
			
		||||
func (a *Addr) String() string {
 | 
			
		||||
	if a == nil {
 | 
			
		||||
		return "<nil>"
 | 
			
		||||
	}
 | 
			
		||||
	port := strconv.Itoa(a.Port)
 | 
			
		||||
	if a.IP == nil {
 | 
			
		||||
		return net.JoinHostPort(a.Name, port)
 | 
			
		||||
	}
 | 
			
		||||
	return net.JoinHostPort(a.IP.String(), port)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// A Conn represents a forward proxy connection.
 | 
			
		||||
type Conn struct {
 | 
			
		||||
	net.Conn
 | 
			
		||||
 | 
			
		||||
	boundAddr net.Addr
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// BoundAddr returns the address assigned by the proxy server for
 | 
			
		||||
// connecting to the command target address from the proxy server.
 | 
			
		||||
func (c *Conn) BoundAddr() net.Addr {
 | 
			
		||||
	if c == nil {
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
	return c.boundAddr
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// A Dialer holds SOCKS-specific options.
 | 
			
		||||
type Dialer struct {
 | 
			
		||||
	cmd          Command // either CmdConnect or cmdBind
 | 
			
		||||
	proxyNetwork string  // network between a proxy server and a client
 | 
			
		||||
	proxyAddress string  // proxy server address
 | 
			
		||||
 | 
			
		||||
	// ProxyDial specifies the optional dial function for
 | 
			
		||||
	// establishing the transport connection.
 | 
			
		||||
	ProxyDial func(context.Context, string, string) (net.Conn, error)
 | 
			
		||||
 | 
			
		||||
	// AuthMethods specifies the list of request authentication
 | 
			
		||||
	// methods.
 | 
			
		||||
	// If empty, SOCKS client requests only AuthMethodNotRequired.
 | 
			
		||||
	AuthMethods []AuthMethod
 | 
			
		||||
 | 
			
		||||
	// Authenticate specifies the optional authentication
 | 
			
		||||
	// function. It must be non-nil when AuthMethods is not empty.
 | 
			
		||||
	// It must return an error when the authentication is failed.
 | 
			
		||||
	Authenticate func(context.Context, io.ReadWriter, AuthMethod) error
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// DialContext connects to the provided address on the provided
 | 
			
		||||
// network.
 | 
			
		||||
//
 | 
			
		||||
// The returned error value may be a net.OpError. When the Op field of
 | 
			
		||||
// net.OpError contains "socks", the Source field contains a proxy
 | 
			
		||||
// server address and the Addr field contains a command target
 | 
			
		||||
// address.
 | 
			
		||||
//
 | 
			
		||||
// See func Dial of the net package of standard library for a
 | 
			
		||||
// description of the network and address parameters.
 | 
			
		||||
func (d *Dialer) DialContext(ctx context.Context, network, address string) (net.Conn, error) {
 | 
			
		||||
	if err := d.validateTarget(network, address); err != nil {
 | 
			
		||||
		proxy, dst, _ := d.pathAddrs(address)
 | 
			
		||||
		return nil, &net.OpError{Op: d.cmd.String(), Net: network, Source: proxy, Addr: dst, Err: err}
 | 
			
		||||
	}
 | 
			
		||||
	if ctx == nil {
 | 
			
		||||
		proxy, dst, _ := d.pathAddrs(address)
 | 
			
		||||
		return nil, &net.OpError{Op: d.cmd.String(), Net: network, Source: proxy, Addr: dst, Err: errors.New("nil context")}
 | 
			
		||||
	}
 | 
			
		||||
	var err error
 | 
			
		||||
	var c net.Conn
 | 
			
		||||
	if d.ProxyDial != nil {
 | 
			
		||||
		c, err = d.ProxyDial(ctx, d.proxyNetwork, d.proxyAddress)
 | 
			
		||||
	} else {
 | 
			
		||||
		var dd net.Dialer
 | 
			
		||||
		c, err = dd.DialContext(ctx, d.proxyNetwork, d.proxyAddress)
 | 
			
		||||
	}
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		proxy, dst, _ := d.pathAddrs(address)
 | 
			
		||||
		return nil, &net.OpError{Op: d.cmd.String(), Net: network, Source: proxy, Addr: dst, Err: err}
 | 
			
		||||
	}
 | 
			
		||||
	a, err := d.connect(ctx, c, address)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		c.Close()
 | 
			
		||||
		proxy, dst, _ := d.pathAddrs(address)
 | 
			
		||||
		return nil, &net.OpError{Op: d.cmd.String(), Net: network, Source: proxy, Addr: dst, Err: err}
 | 
			
		||||
	}
 | 
			
		||||
	return &Conn{Conn: c, boundAddr: a}, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// DialWithConn initiates a connection from SOCKS server to the target
 | 
			
		||||
// network and address using the connection c that is already
 | 
			
		||||
// connected to the SOCKS server.
 | 
			
		||||
//
 | 
			
		||||
// It returns the connection's local address assigned by the SOCKS
 | 
			
		||||
// server.
 | 
			
		||||
func (d *Dialer) DialWithConn(ctx context.Context, c net.Conn, network, address string) (net.Addr, error) {
 | 
			
		||||
	if err := d.validateTarget(network, address); err != nil {
 | 
			
		||||
		proxy, dst, _ := d.pathAddrs(address)
 | 
			
		||||
		return nil, &net.OpError{Op: d.cmd.String(), Net: network, Source: proxy, Addr: dst, Err: err}
 | 
			
		||||
	}
 | 
			
		||||
	if ctx == nil {
 | 
			
		||||
		proxy, dst, _ := d.pathAddrs(address)
 | 
			
		||||
		return nil, &net.OpError{Op: d.cmd.String(), Net: network, Source: proxy, Addr: dst, Err: errors.New("nil context")}
 | 
			
		||||
	}
 | 
			
		||||
	a, err := d.connect(ctx, c, address)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		proxy, dst, _ := d.pathAddrs(address)
 | 
			
		||||
		return nil, &net.OpError{Op: d.cmd.String(), Net: network, Source: proxy, Addr: dst, Err: err}
 | 
			
		||||
	}
 | 
			
		||||
	return a, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Dial connects to the provided address on the provided network.
 | 
			
		||||
//
 | 
			
		||||
// Unlike DialContext, it returns a raw transport connection instead
 | 
			
		||||
// of a forward proxy connection.
 | 
			
		||||
//
 | 
			
		||||
// Deprecated: Use DialContext or DialWithConn instead.
 | 
			
		||||
func (d *Dialer) Dial(network, address string) (net.Conn, error) {
 | 
			
		||||
	if err := d.validateTarget(network, address); err != nil {
 | 
			
		||||
		proxy, dst, _ := d.pathAddrs(address)
 | 
			
		||||
		return nil, &net.OpError{Op: d.cmd.String(), Net: network, Source: proxy, Addr: dst, Err: err}
 | 
			
		||||
	}
 | 
			
		||||
	var err error
 | 
			
		||||
	var c net.Conn
 | 
			
		||||
	if d.ProxyDial != nil {
 | 
			
		||||
		c, err = d.ProxyDial(context.Background(), d.proxyNetwork, d.proxyAddress)
 | 
			
		||||
	} else {
 | 
			
		||||
		c, err = net.Dial(d.proxyNetwork, d.proxyAddress)
 | 
			
		||||
	}
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		proxy, dst, _ := d.pathAddrs(address)
 | 
			
		||||
		return nil, &net.OpError{Op: d.cmd.String(), Net: network, Source: proxy, Addr: dst, Err: err}
 | 
			
		||||
	}
 | 
			
		||||
	if _, err := d.DialWithConn(context.Background(), c, network, address); err != nil {
 | 
			
		||||
		c.Close()
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	return c, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (d *Dialer) validateTarget(network, address string) error {
 | 
			
		||||
	switch network {
 | 
			
		||||
	case "tcp", "tcp6", "tcp4":
 | 
			
		||||
	default:
 | 
			
		||||
		return errors.New("network not implemented")
 | 
			
		||||
	}
 | 
			
		||||
	switch d.cmd {
 | 
			
		||||
	case CmdConnect, cmdBind:
 | 
			
		||||
	default:
 | 
			
		||||
		return errors.New("command not implemented")
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (d *Dialer) pathAddrs(address string) (proxy, dst net.Addr, err error) {
 | 
			
		||||
	for i, s := range []string{d.proxyAddress, address} {
 | 
			
		||||
		host, port, err := splitHostPort(s)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return nil, nil, err
 | 
			
		||||
		}
 | 
			
		||||
		a := &Addr{Port: port}
 | 
			
		||||
		a.IP = net.ParseIP(host)
 | 
			
		||||
		if a.IP == nil {
 | 
			
		||||
			a.Name = host
 | 
			
		||||
		}
 | 
			
		||||
		if i == 0 {
 | 
			
		||||
			proxy = a
 | 
			
		||||
		} else {
 | 
			
		||||
			dst = a
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// NewDialer returns a new Dialer that dials through the provided
 | 
			
		||||
// proxy server's network and address.
 | 
			
		||||
func NewDialer(network, address string) *Dialer {
 | 
			
		||||
	return &Dialer{proxyNetwork: network, proxyAddress: address, cmd: CmdConnect}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const (
 | 
			
		||||
	authUsernamePasswordVersion = 0x01
 | 
			
		||||
	authStatusSucceeded         = 0x00
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// UsernamePassword are the credentials for the username/password
 | 
			
		||||
// authentication method.
 | 
			
		||||
type UsernamePassword struct {
 | 
			
		||||
	Username string
 | 
			
		||||
	Password string
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Authenticate authenticates a pair of username and password with the
 | 
			
		||||
// proxy server.
 | 
			
		||||
func (up *UsernamePassword) Authenticate(ctx context.Context, rw io.ReadWriter, auth AuthMethod) error {
 | 
			
		||||
	switch auth {
 | 
			
		||||
	case AuthMethodNotRequired:
 | 
			
		||||
		return nil
 | 
			
		||||
	case AuthMethodUsernamePassword:
 | 
			
		||||
		if len(up.Username) == 0 || len(up.Username) > 255 || len(up.Password) == 0 || len(up.Password) > 255 {
 | 
			
		||||
			return errors.New("invalid username/password")
 | 
			
		||||
		}
 | 
			
		||||
		b := []byte{authUsernamePasswordVersion}
 | 
			
		||||
		b = append(b, byte(len(up.Username)))
 | 
			
		||||
		b = append(b, up.Username...)
 | 
			
		||||
		b = append(b, byte(len(up.Password)))
 | 
			
		||||
		b = append(b, up.Password...)
 | 
			
		||||
		// TODO(mikio): handle IO deadlines and cancelation if
 | 
			
		||||
		// necessary
 | 
			
		||||
		if _, err := rw.Write(b); err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
		if _, err := io.ReadFull(rw, b[:2]); err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
		if b[0] != authUsernamePasswordVersion {
 | 
			
		||||
			return errors.New("invalid username/password version")
 | 
			
		||||
		}
 | 
			
		||||
		if b[1] != authStatusSucceeded {
 | 
			
		||||
			return errors.New("username/password authentication failed")
 | 
			
		||||
		}
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
	return errors.New("unsupported authentication method " + strconv.Itoa(int(auth)))
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										54
									
								
								vendor/golang.org/x/net/proxy/dial.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										54
									
								
								vendor/golang.org/x/net/proxy/dial.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,54 @@
 | 
			
		||||
// Copyright 2019 The Go Authors. All rights reserved.
 | 
			
		||||
// Use of this source code is governed by a BSD-style
 | 
			
		||||
// license that can be found in the LICENSE file.
 | 
			
		||||
 | 
			
		||||
package proxy
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"context"
 | 
			
		||||
	"net"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// A ContextDialer dials using a context.
 | 
			
		||||
type ContextDialer interface {
 | 
			
		||||
	DialContext(ctx context.Context, network, address string) (net.Conn, error)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Dial works like DialContext on net.Dialer but using a dialer returned by FromEnvironment.
 | 
			
		||||
//
 | 
			
		||||
// The passed ctx is only used for returning the Conn, not the lifetime of the Conn.
 | 
			
		||||
//
 | 
			
		||||
// Custom dialers (registered via RegisterDialerType) that do not implement ContextDialer
 | 
			
		||||
// can leak a goroutine for as long as it takes the underlying Dialer implementation to timeout.
 | 
			
		||||
//
 | 
			
		||||
// A Conn returned from a successful Dial after the context has been cancelled will be immediately closed.
 | 
			
		||||
func Dial(ctx context.Context, network, address string) (net.Conn, error) {
 | 
			
		||||
	d := FromEnvironment()
 | 
			
		||||
	if xd, ok := d.(ContextDialer); ok {
 | 
			
		||||
		return xd.DialContext(ctx, network, address)
 | 
			
		||||
	}
 | 
			
		||||
	return dialContext(ctx, d, network, address)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// WARNING: this can leak a goroutine for as long as the underlying Dialer implementation takes to timeout
 | 
			
		||||
// A Conn returned from a successful Dial after the context has been cancelled will be immediately closed.
 | 
			
		||||
func dialContext(ctx context.Context, d Dialer, network, address string) (net.Conn, error) {
 | 
			
		||||
	var (
 | 
			
		||||
		conn net.Conn
 | 
			
		||||
		done = make(chan struct{}, 1)
 | 
			
		||||
		err  error
 | 
			
		||||
	)
 | 
			
		||||
	go func() {
 | 
			
		||||
		conn, err = d.Dial(network, address)
 | 
			
		||||
		close(done)
 | 
			
		||||
		if conn != nil && ctx.Err() != nil {
 | 
			
		||||
			conn.Close()
 | 
			
		||||
		}
 | 
			
		||||
	}()
 | 
			
		||||
	select {
 | 
			
		||||
	case <-ctx.Done():
 | 
			
		||||
		err = ctx.Err()
 | 
			
		||||
	case <-done:
 | 
			
		||||
	}
 | 
			
		||||
	return conn, err
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										31
									
								
								vendor/golang.org/x/net/proxy/direct.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								vendor/golang.org/x/net/proxy/direct.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,31 @@
 | 
			
		||||
// Copyright 2011 The Go Authors. All rights reserved.
 | 
			
		||||
// Use of this source code is governed by a BSD-style
 | 
			
		||||
// license that can be found in the LICENSE file.
 | 
			
		||||
 | 
			
		||||
package proxy
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"context"
 | 
			
		||||
	"net"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type direct struct{}
 | 
			
		||||
 | 
			
		||||
// Direct implements Dialer by making network connections directly using net.Dial or net.DialContext.
 | 
			
		||||
var Direct = direct{}
 | 
			
		||||
 | 
			
		||||
var (
 | 
			
		||||
	_ Dialer        = Direct
 | 
			
		||||
	_ ContextDialer = Direct
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// Dial directly invokes net.Dial with the supplied parameters.
 | 
			
		||||
func (direct) Dial(network, addr string) (net.Conn, error) {
 | 
			
		||||
	return net.Dial(network, addr)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// DialContext instantiates a net.Dialer and invokes its DialContext receiver with the supplied parameters.
 | 
			
		||||
func (direct) DialContext(ctx context.Context, network, addr string) (net.Conn, error) {
 | 
			
		||||
	var d net.Dialer
 | 
			
		||||
	return d.DialContext(ctx, network, addr)
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										155
									
								
								vendor/golang.org/x/net/proxy/per_host.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										155
									
								
								vendor/golang.org/x/net/proxy/per_host.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,155 @@
 | 
			
		||||
// Copyright 2011 The Go Authors. All rights reserved.
 | 
			
		||||
// Use of this source code is governed by a BSD-style
 | 
			
		||||
// license that can be found in the LICENSE file.
 | 
			
		||||
 | 
			
		||||
package proxy
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"context"
 | 
			
		||||
	"net"
 | 
			
		||||
	"strings"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// A PerHost directs connections to a default Dialer unless the host name
 | 
			
		||||
// requested matches one of a number of exceptions.
 | 
			
		||||
type PerHost struct {
 | 
			
		||||
	def, bypass Dialer
 | 
			
		||||
 | 
			
		||||
	bypassNetworks []*net.IPNet
 | 
			
		||||
	bypassIPs      []net.IP
 | 
			
		||||
	bypassZones    []string
 | 
			
		||||
	bypassHosts    []string
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// NewPerHost returns a PerHost Dialer that directs connections to either
 | 
			
		||||
// defaultDialer or bypass, depending on whether the connection matches one of
 | 
			
		||||
// the configured rules.
 | 
			
		||||
func NewPerHost(defaultDialer, bypass Dialer) *PerHost {
 | 
			
		||||
	return &PerHost{
 | 
			
		||||
		def:    defaultDialer,
 | 
			
		||||
		bypass: bypass,
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Dial connects to the address addr on the given network through either
 | 
			
		||||
// defaultDialer or bypass.
 | 
			
		||||
func (p *PerHost) Dial(network, addr string) (c net.Conn, err error) {
 | 
			
		||||
	host, _, err := net.SplitHostPort(addr)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return p.dialerForRequest(host).Dial(network, addr)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// DialContext connects to the address addr on the given network through either
 | 
			
		||||
// defaultDialer or bypass.
 | 
			
		||||
func (p *PerHost) DialContext(ctx context.Context, network, addr string) (c net.Conn, err error) {
 | 
			
		||||
	host, _, err := net.SplitHostPort(addr)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	d := p.dialerForRequest(host)
 | 
			
		||||
	if x, ok := d.(ContextDialer); ok {
 | 
			
		||||
		return x.DialContext(ctx, network, addr)
 | 
			
		||||
	}
 | 
			
		||||
	return dialContext(ctx, d, network, addr)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (p *PerHost) dialerForRequest(host string) Dialer {
 | 
			
		||||
	if ip := net.ParseIP(host); ip != nil {
 | 
			
		||||
		for _, net := range p.bypassNetworks {
 | 
			
		||||
			if net.Contains(ip) {
 | 
			
		||||
				return p.bypass
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		for _, bypassIP := range p.bypassIPs {
 | 
			
		||||
			if bypassIP.Equal(ip) {
 | 
			
		||||
				return p.bypass
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		return p.def
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for _, zone := range p.bypassZones {
 | 
			
		||||
		if strings.HasSuffix(host, zone) {
 | 
			
		||||
			return p.bypass
 | 
			
		||||
		}
 | 
			
		||||
		if host == zone[1:] {
 | 
			
		||||
			// For a zone ".example.com", we match "example.com"
 | 
			
		||||
			// too.
 | 
			
		||||
			return p.bypass
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	for _, bypassHost := range p.bypassHosts {
 | 
			
		||||
		if bypassHost == host {
 | 
			
		||||
			return p.bypass
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return p.def
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// AddFromString parses a string that contains comma-separated values
 | 
			
		||||
// specifying hosts that should use the bypass proxy. Each value is either an
 | 
			
		||||
// IP address, a CIDR range, a zone (*.example.com) or a host name
 | 
			
		||||
// (localhost). A best effort is made to parse the string and errors are
 | 
			
		||||
// ignored.
 | 
			
		||||
func (p *PerHost) AddFromString(s string) {
 | 
			
		||||
	hosts := strings.Split(s, ",")
 | 
			
		||||
	for _, host := range hosts {
 | 
			
		||||
		host = strings.TrimSpace(host)
 | 
			
		||||
		if len(host) == 0 {
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
		if strings.Contains(host, "/") {
 | 
			
		||||
			// We assume that it's a CIDR address like 127.0.0.0/8
 | 
			
		||||
			if _, net, err := net.ParseCIDR(host); err == nil {
 | 
			
		||||
				p.AddNetwork(net)
 | 
			
		||||
			}
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
		if ip := net.ParseIP(host); ip != nil {
 | 
			
		||||
			p.AddIP(ip)
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
		if strings.HasPrefix(host, "*.") {
 | 
			
		||||
			p.AddZone(host[1:])
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
		p.AddHost(host)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// AddIP specifies an IP address that will use the bypass proxy. Note that
 | 
			
		||||
// this will only take effect if a literal IP address is dialed. A connection
 | 
			
		||||
// to a named host will never match an IP.
 | 
			
		||||
func (p *PerHost) AddIP(ip net.IP) {
 | 
			
		||||
	p.bypassIPs = append(p.bypassIPs, ip)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// AddNetwork specifies an IP range that will use the bypass proxy. Note that
 | 
			
		||||
// this will only take effect if a literal IP address is dialed. A connection
 | 
			
		||||
// to a named host will never match.
 | 
			
		||||
func (p *PerHost) AddNetwork(net *net.IPNet) {
 | 
			
		||||
	p.bypassNetworks = append(p.bypassNetworks, net)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// AddZone specifies a DNS suffix that will use the bypass proxy. A zone of
 | 
			
		||||
// "example.com" matches "example.com" and all of its subdomains.
 | 
			
		||||
func (p *PerHost) AddZone(zone string) {
 | 
			
		||||
	if strings.HasSuffix(zone, ".") {
 | 
			
		||||
		zone = zone[:len(zone)-1]
 | 
			
		||||
	}
 | 
			
		||||
	if !strings.HasPrefix(zone, ".") {
 | 
			
		||||
		zone = "." + zone
 | 
			
		||||
	}
 | 
			
		||||
	p.bypassZones = append(p.bypassZones, zone)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// AddHost specifies a host name that will use the bypass proxy.
 | 
			
		||||
func (p *PerHost) AddHost(host string) {
 | 
			
		||||
	if strings.HasSuffix(host, ".") {
 | 
			
		||||
		host = host[:len(host)-1]
 | 
			
		||||
	}
 | 
			
		||||
	p.bypassHosts = append(p.bypassHosts, host)
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										149
									
								
								vendor/golang.org/x/net/proxy/proxy.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										149
									
								
								vendor/golang.org/x/net/proxy/proxy.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,149 @@
 | 
			
		||||
// Copyright 2011 The Go Authors. All rights reserved.
 | 
			
		||||
// Use of this source code is governed by a BSD-style
 | 
			
		||||
// license that can be found in the LICENSE file.
 | 
			
		||||
 | 
			
		||||
// Package proxy provides support for a variety of protocols to proxy network
 | 
			
		||||
// data.
 | 
			
		||||
package proxy // import "golang.org/x/net/proxy"
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"errors"
 | 
			
		||||
	"net"
 | 
			
		||||
	"net/url"
 | 
			
		||||
	"os"
 | 
			
		||||
	"sync"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// A Dialer is a means to establish a connection.
 | 
			
		||||
// Custom dialers should also implement ContextDialer.
 | 
			
		||||
type Dialer interface {
 | 
			
		||||
	// Dial connects to the given address via the proxy.
 | 
			
		||||
	Dial(network, addr string) (c net.Conn, err error)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Auth contains authentication parameters that specific Dialers may require.
 | 
			
		||||
type Auth struct {
 | 
			
		||||
	User, Password string
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// FromEnvironment returns the dialer specified by the proxy-related
 | 
			
		||||
// variables in the environment and makes underlying connections
 | 
			
		||||
// directly.
 | 
			
		||||
func FromEnvironment() Dialer {
 | 
			
		||||
	return FromEnvironmentUsing(Direct)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// FromEnvironmentUsing returns the dialer specify by the proxy-related
 | 
			
		||||
// variables in the environment and makes underlying connections
 | 
			
		||||
// using the provided forwarding Dialer (for instance, a *net.Dialer
 | 
			
		||||
// with desired configuration).
 | 
			
		||||
func FromEnvironmentUsing(forward Dialer) Dialer {
 | 
			
		||||
	allProxy := allProxyEnv.Get()
 | 
			
		||||
	if len(allProxy) == 0 {
 | 
			
		||||
		return forward
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	proxyURL, err := url.Parse(allProxy)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return forward
 | 
			
		||||
	}
 | 
			
		||||
	proxy, err := FromURL(proxyURL, forward)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return forward
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	noProxy := noProxyEnv.Get()
 | 
			
		||||
	if len(noProxy) == 0 {
 | 
			
		||||
		return proxy
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	perHost := NewPerHost(proxy, forward)
 | 
			
		||||
	perHost.AddFromString(noProxy)
 | 
			
		||||
	return perHost
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// proxySchemes is a map from URL schemes to a function that creates a Dialer
 | 
			
		||||
// from a URL with such a scheme.
 | 
			
		||||
var proxySchemes map[string]func(*url.URL, Dialer) (Dialer, error)
 | 
			
		||||
 | 
			
		||||
// RegisterDialerType takes a URL scheme and a function to generate Dialers from
 | 
			
		||||
// a URL with that scheme and a forwarding Dialer. Registered schemes are used
 | 
			
		||||
// by FromURL.
 | 
			
		||||
func RegisterDialerType(scheme string, f func(*url.URL, Dialer) (Dialer, error)) {
 | 
			
		||||
	if proxySchemes == nil {
 | 
			
		||||
		proxySchemes = make(map[string]func(*url.URL, Dialer) (Dialer, error))
 | 
			
		||||
	}
 | 
			
		||||
	proxySchemes[scheme] = f
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// FromURL returns a Dialer given a URL specification and an underlying
 | 
			
		||||
// Dialer for it to make network requests.
 | 
			
		||||
func FromURL(u *url.URL, forward Dialer) (Dialer, error) {
 | 
			
		||||
	var auth *Auth
 | 
			
		||||
	if u.User != nil {
 | 
			
		||||
		auth = new(Auth)
 | 
			
		||||
		auth.User = u.User.Username()
 | 
			
		||||
		if p, ok := u.User.Password(); ok {
 | 
			
		||||
			auth.Password = p
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	switch u.Scheme {
 | 
			
		||||
	case "socks5", "socks5h":
 | 
			
		||||
		addr := u.Hostname()
 | 
			
		||||
		port := u.Port()
 | 
			
		||||
		if port == "" {
 | 
			
		||||
			port = "1080"
 | 
			
		||||
		}
 | 
			
		||||
		return SOCKS5("tcp", net.JoinHostPort(addr, port), auth, forward)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// If the scheme doesn't match any of the built-in schemes, see if it
 | 
			
		||||
	// was registered by another package.
 | 
			
		||||
	if proxySchemes != nil {
 | 
			
		||||
		if f, ok := proxySchemes[u.Scheme]; ok {
 | 
			
		||||
			return f(u, forward)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return nil, errors.New("proxy: unknown scheme: " + u.Scheme)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var (
 | 
			
		||||
	allProxyEnv = &envOnce{
 | 
			
		||||
		names: []string{"ALL_PROXY", "all_proxy"},
 | 
			
		||||
	}
 | 
			
		||||
	noProxyEnv = &envOnce{
 | 
			
		||||
		names: []string{"NO_PROXY", "no_proxy"},
 | 
			
		||||
	}
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// envOnce looks up an environment variable (optionally by multiple
 | 
			
		||||
// names) once. It mitigates expensive lookups on some platforms
 | 
			
		||||
// (e.g. Windows).
 | 
			
		||||
// (Borrowed from net/http/transport.go)
 | 
			
		||||
type envOnce struct {
 | 
			
		||||
	names []string
 | 
			
		||||
	once  sync.Once
 | 
			
		||||
	val   string
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (e *envOnce) Get() string {
 | 
			
		||||
	e.once.Do(e.init)
 | 
			
		||||
	return e.val
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (e *envOnce) init() {
 | 
			
		||||
	for _, n := range e.names {
 | 
			
		||||
		e.val = os.Getenv(n)
 | 
			
		||||
		if e.val != "" {
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// reset is used by tests
 | 
			
		||||
func (e *envOnce) reset() {
 | 
			
		||||
	e.once = sync.Once{}
 | 
			
		||||
	e.val = ""
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										42
									
								
								vendor/golang.org/x/net/proxy/socks5.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										42
									
								
								vendor/golang.org/x/net/proxy/socks5.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,42 @@
 | 
			
		||||
// Copyright 2011 The Go Authors. All rights reserved.
 | 
			
		||||
// Use of this source code is governed by a BSD-style
 | 
			
		||||
// license that can be found in the LICENSE file.
 | 
			
		||||
 | 
			
		||||
package proxy
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"context"
 | 
			
		||||
	"net"
 | 
			
		||||
 | 
			
		||||
	"golang.org/x/net/internal/socks"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// SOCKS5 returns a Dialer that makes SOCKSv5 connections to the given
 | 
			
		||||
// address with an optional username and password.
 | 
			
		||||
// See RFC 1928 and RFC 1929.
 | 
			
		||||
func SOCKS5(network, address string, auth *Auth, forward Dialer) (Dialer, error) {
 | 
			
		||||
	d := socks.NewDialer(network, address)
 | 
			
		||||
	if forward != nil {
 | 
			
		||||
		if f, ok := forward.(ContextDialer); ok {
 | 
			
		||||
			d.ProxyDial = func(ctx context.Context, network string, address string) (net.Conn, error) {
 | 
			
		||||
				return f.DialContext(ctx, network, address)
 | 
			
		||||
			}
 | 
			
		||||
		} else {
 | 
			
		||||
			d.ProxyDial = func(ctx context.Context, network string, address string) (net.Conn, error) {
 | 
			
		||||
				return dialContext(ctx, forward, network, address)
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	if auth != nil {
 | 
			
		||||
		up := socks.UsernamePassword{
 | 
			
		||||
			Username: auth.User,
 | 
			
		||||
			Password: auth.Password,
 | 
			
		||||
		}
 | 
			
		||||
		d.AuthMethods = []socks.AuthMethod{
 | 
			
		||||
			socks.AuthMethodNotRequired,
 | 
			
		||||
			socks.AuthMethodUsernamePassword,
 | 
			
		||||
		}
 | 
			
		||||
		d.Authenticate = up.Authenticate
 | 
			
		||||
	}
 | 
			
		||||
	return d, nil
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										6
									
								
								vendor/modules.txt
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										6
									
								
								vendor/modules.txt
									
									
									
									
										vendored
									
									
								
							@@ -92,6 +92,9 @@ github.com/antlr/antlr4/runtime/Go/antlr
 | 
			
		||||
# github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e => github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e
 | 
			
		||||
## explicit
 | 
			
		||||
github.com/armon/circbuf
 | 
			
		||||
# github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 => github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5
 | 
			
		||||
## explicit
 | 
			
		||||
github.com/armon/go-socks5
 | 
			
		||||
# github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a => github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a
 | 
			
		||||
github.com/asaskevich/govalidator
 | 
			
		||||
# github.com/auth0/go-jwt-middleware v1.0.1 => github.com/auth0/go-jwt-middleware v1.0.1
 | 
			
		||||
@@ -981,7 +984,9 @@ golang.org/x/net/http/httpguts
 | 
			
		||||
golang.org/x/net/http2
 | 
			
		||||
golang.org/x/net/http2/hpack
 | 
			
		||||
golang.org/x/net/idna
 | 
			
		||||
golang.org/x/net/internal/socks
 | 
			
		||||
golang.org/x/net/internal/timeseries
 | 
			
		||||
golang.org/x/net/proxy
 | 
			
		||||
golang.org/x/net/trace
 | 
			
		||||
golang.org/x/net/websocket
 | 
			
		||||
# golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f => golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f
 | 
			
		||||
@@ -2442,6 +2447,7 @@ sigs.k8s.io/yaml
 | 
			
		||||
# github.com/armon/circbuf => github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e
 | 
			
		||||
# github.com/armon/go-metrics => github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da
 | 
			
		||||
# github.com/armon/go-radix => github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310
 | 
			
		||||
# github.com/armon/go-socks5 => github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5
 | 
			
		||||
# github.com/asaskevich/govalidator => github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a
 | 
			
		||||
# github.com/auth0/go-jwt-middleware => github.com/auth0/go-jwt-middleware v1.0.1
 | 
			
		||||
# github.com/aws/aws-sdk-go => github.com/aws/aws-sdk-go v1.38.49
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user