diff --git a/.github/workflows/build-test.yml b/.github/workflows/build-test.yml index 826346a3..6b1b49b3 100644 --- a/.github/workflows/build-test.yml +++ b/.github/workflows/build-test.yml @@ -18,7 +18,7 @@ jobs: - name: Set up Go uses: actions/setup-go@v4 with: - go-version: 1.19 + go-version: 1.20.x - name: Check out code uses: actions/checkout@v3 diff --git a/.github/workflows/lint-test.yml b/.github/workflows/lint-test.yml index 214328bd..b59f78d3 100644 --- a/.github/workflows/lint-test.yml +++ b/.github/workflows/lint-test.yml @@ -19,7 +19,7 @@ jobs: - name: Set up Go uses: actions/setup-go@v4 with: - go-version: 1.19 + go-version: 1.20.x - name: Run golangci-lint uses: golangci/golangci-lint-action@v3.4.0 diff --git a/.github/workflows/release-binary.yml b/.github/workflows/release-binary.yml index c9b5097b..e4934567 100644 --- a/.github/workflows/release-binary.yml +++ b/.github/workflows/release-binary.yml @@ -18,7 +18,7 @@ jobs: - name: "Set up Go" uses: actions/setup-go@v4 with: - go-version: 1.19 + go-version: 1.20.x - name: "Create release on GitHub" uses: goreleaser/goreleaser-action@v4 diff --git a/go.mod b/go.mod index 44f8bf4b..1bd03274 100644 --- a/go.mod +++ b/go.mod @@ -1,25 +1,24 @@ module github.com/projectdiscovery/proxify -go 1.19 +go 1.20 require ( github.com/Knetic/govaluate v3.0.0+incompatible - github.com/Mzack9999/roundrobin v0.0.0-20211108110706-e876335f5ad4 github.com/Shopify/sarama v1.38.1 github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 github.com/elastic/go-elasticsearch/v7 v7.17.7 github.com/elazarl/goproxy v0.0.0-20221015165544-a0805db90819 - github.com/hashicorp/golang-lru v0.5.4 github.com/haxii/fastproxy v0.5.37 github.com/pkg/errors v0.9.1 github.com/projectdiscovery/dsl v0.0.5 github.com/projectdiscovery/fastdialer v0.0.24 github.com/projectdiscovery/goflags v0.1.8 github.com/projectdiscovery/gologger v1.1.8 + github.com/projectdiscovery/martian/v3 v3.0.0-20230327175357-82434c1bb926 + github.com/projectdiscovery/roundrobin v0.0.6 github.com/projectdiscovery/tinydns v0.0.3 github.com/projectdiscovery/utils v0.0.19 - github.com/rs/xid v1.4.0 golang.org/x/net v0.9.0 gopkg.in/yaml.v3 v3.0.1 ) @@ -81,7 +80,7 @@ require ( github.com/pierrec/lz4 v2.6.1+incompatible // indirect github.com/pierrec/lz4/v4 v4.1.17 // indirect github.com/projectdiscovery/blackrock v0.0.0-20230328171319-f24b18d05b64 // indirect - github.com/projectdiscovery/hmap v0.0.10 // indirect + github.com/projectdiscovery/hmap v0.0.11 // indirect github.com/projectdiscovery/iputil v0.0.2 // indirect github.com/projectdiscovery/mapcidr v1.1.1 // indirect github.com/projectdiscovery/networkpolicy v0.0.4 // indirect @@ -120,7 +119,9 @@ require ( golang.org/x/text v0.9.0 // indirect golang.org/x/tools v0.7.0 // indirect google.golang.org/appengine v1.6.7 // indirect + google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84 // indirect + google.golang.org/grpc v1.38.0 // indirect google.golang.org/protobuf v1.28.1 // indirect gopkg.in/djherbis/times.v1 v1.3.0 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect -) +) \ No newline at end of file diff --git a/go.sum b/go.sum index 2b9b89a5..f1862207 100644 --- a/go.sum +++ b/go.sum @@ -1,13 +1,13 @@ aead.dev/minisign v0.2.0 h1:kAWrq/hBRu4AARY6AlciO83xhNnW9UaC8YipS2uhLPk= aead.dev/minisign v0.2.0/go.mod h1:zdq6LdSd9TbuSxchxwhpA9zEb9YXcVGoE8JakuiGaIQ= +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/Knetic/govaluate v3.0.0+incompatible h1:7o6+MAPhYTCF0+fdvoz1xDedhRb4f6s9Tn1Tt7/WTEg= github.com/Knetic/govaluate v3.0.0+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= github.com/Masterminds/semver/v3 v3.2.0 h1:3MEsd0SM6jqZojhjLWWeBY+Kcjy9i6MQAeY7YgDP83g= github.com/Masterminds/semver/v3 v3.2.0/go.mod h1:qvl/7zhW3nngYb5+80sSMF+FG2BjYrf8m9wsX0PNOMQ= github.com/Mzack9999/go-http-digest-auth-client v0.6.1-0.20220414142836-eb8883508809 h1:ZbFL+BDfBqegi+/Ssh7im5+aQfBRx6it+kHnC7jaDU8= github.com/Mzack9999/go-http-digest-auth-client v0.6.1-0.20220414142836-eb8883508809/go.mod h1:upgc3Zs45jBDnBT4tVRgRcgm26ABpaP7MoTSdgysca4= -github.com/Mzack9999/roundrobin v0.0.0-20211108110706-e876335f5ad4 h1:cwC6b8AEqAsM+bvX/hmrQ+UNQq2seG9FyYvriLVAcEo= -github.com/Mzack9999/roundrobin v0.0.0-20211108110706-e876335f5ad4/go.mod h1:jaPtvFne4154rQDj6lyDdPnvHc9II1X/3uXfJtjGKBQ= github.com/Shopify/sarama v1.38.1 h1:lqqPUPQZ7zPqYlWpTh+LQ9bhYNu2xJL6k1SJN4WVe2A= github.com/Shopify/sarama v1.38.1/go.mod h1:iwv9a67Ha8VNa+TifujYoWGxWnu2kNVAQdSdZ4X2o5g= github.com/Shopify/toxiproxy/v2 v2.5.0 h1:i4LPT+qrSlKNtQf5QliVjdP08GyAH8+BUIc9gT0eahc= @@ -28,10 +28,13 @@ github.com/aymerick/douceur v0.2.0 h1:Mv+mAeH1Q+n9Fr+oyamOlAkUNPWPlA8PPGR0QAaYuP github.com/aymerick/douceur v0.2.0/go.mod h1:wlT5vV2O3h55X9m7iVYN0TBM0NH/MmbLnd30/FjWUq4= github.com/bits-and-blooms/bitset v1.3.1 h1:y+qrlmq3XsWi+xZqSaueaE8ry8Y127iMxlMfqcK8p0g= github.com/bits-and-blooms/bloom/v3 v3.3.1 h1:K2+A19bXT8gJR5mU7y+1yW6hsKfNCjcP2uNfLFKncjQ= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/charmbracelet/glamour v0.6.0 h1:wi8fse3Y7nfcabbbDuwolqTqMQPMnVPeZhDM273bISc= github.com/charmbracelet/glamour v0.6.0/go.mod h1:taqWV4swIMMbWALc0m7AfE9JkPSU8om2538k9ITBxOc= github.com/cheggaaa/pb/v3 v3.1.2 h1:FIxT3ZjOj9XJl0U4o2XbEhjFfZl7jCVCDOGq1ZAB7wQ= github.com/cheggaaa/pb/v3 v3.1.2/go.mod h1:SNjnd0yKcW+kw0brSusraeDd5Bf1zBfxAzTL2ss3yQ4= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cnf/structhash v0.0.0-20201127153200-e1b16c1ebc08 h1:ox2F0PSMlrAAiAdknSRMDrAr8mfxPCfSZolH+/qQnyQ= github.com/cnf/structhash v0.0.0-20201127153200-e1b16c1ebc08/go.mod h1:pCxVEbcm3AMg7ejXyorUXi6HQCzOIBf7zEDVPtw0/U4= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= @@ -59,6 +62,10 @@ github.com/elazarl/goproxy v0.0.0-20221015165544-a0805db90819/go.mod h1:Ro8st/El github.com/elazarl/goproxy/ext v0.0.0-20190711103511-473e67f1d7d2/go.mod h1:gNh8nYJoAm43RfaxurUnxr+N1PwuFV3ZMl/efxlIlY8= github.com/elazarl/goproxy/ext v0.0.0-20210110162100-a92cc753f88e h1:CQn2/8fi3kmpT9BTiHEELgdxAOQNVZc9GoPA4qnQzrs= github.com/elazarl/goproxy/ext v0.0.0-20210110162100-a92cc753f88e/go.mod h1:gNh8nYJoAm43RfaxurUnxr+N1PwuFV3ZMl/efxlIlY8= +github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/fatih/color v1.14.1 h1:qfhVLaG5s+nCROl1zJsZRxFeYrHLqWroPOQ8BWiNb4w= github.com/fatih/color v1.14.1/go.mod h1:2oHN61fhTpgcxD3TSWCgKDiH1+x4OiDVVGH8WlgGZGg= github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw= @@ -66,9 +73,18 @@ github.com/frankban/quicktest v1.11.3 h1:8sXhOn0uLys67V8EsXLc6eszDs8VXWxL3iRvebP github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= +github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= @@ -76,6 +92,11 @@ github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8l github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= @@ -88,6 +109,7 @@ github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8= github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/gorilla/css v1.0.0 h1:BQqNyPTi50JCFMTw/b67hByjMVXZRwGha6wxVGkeihY= github.com/gorilla/css v1.0.0/go.mod h1:Dn721qIggHpt4+EFCcTLTU/vk5ySda2ReITrtgBl60c= github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+HVt/4epWDjd4= @@ -102,8 +124,6 @@ github.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/C github.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-version v1.6.0 h1:feTTfFNnjP967rlCxM/I9g701jU+RN74YKx2mOkIeek= github.com/hashicorp/go-version v1.6.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc= -github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/golang-lru/v2 v2.0.1 h1:5pv5N1lT1fjLg2VQ5KWc7kmucp2x/kvFOnxuVTqZ6x4= github.com/haxii/fastproxy v0.5.37 h1:grfso8V9sNO8jZjI/vkizFXzz8fE/yrsgl+XxTb3fio= github.com/haxii/fastproxy v0.5.37/go.mod h1:VFy3M4EmTbeKu+IccQ6UiJ1W4sPeQ75GV+1JDa8h864= @@ -201,24 +221,29 @@ github.com/projectdiscovery/goflags v0.1.8 h1:Urhm2Isq2BdRt8h4h062lHKYXO65RHRjGT github.com/projectdiscovery/goflags v0.1.8/go.mod h1:Yxi9tclgwGczzDU65ntrwaIql5cXeTvW5j2WxFuF+Jk= github.com/projectdiscovery/gologger v1.1.8 h1:CFlCzGlqAhPqWIrAXBt1OVh5jkMs1qgoR/z4xhdzLNE= github.com/projectdiscovery/gologger v1.1.8/go.mod h1:bNyVaC1U/NpJtFkJltcesn01NR3K8Hg6RsLVce6yvrw= -github.com/projectdiscovery/hmap v0.0.10 h1:O6ALGW3BK+FmknLXW7ENwQevLs+faRJuoRbDtakZZus= -github.com/projectdiscovery/hmap v0.0.10/go.mod h1:xdtyejCgl5LJW7yz7nf/ut32tWuV/l7FjUzItiCtJIg= +github.com/projectdiscovery/hmap v0.0.11 h1:nA3qCFzWPcOw27T8PII5IWI3ZP0ys7TGCi2nLSnHXVA= +github.com/projectdiscovery/hmap v0.0.11/go.mod h1:5sbLn2OHexvpVupStNOhusWO9jLCyEm5jcHwWB2nOkI= github.com/projectdiscovery/iputil v0.0.2 h1:f6IGnZF4RImJLysPSPG3D84jyTH34q3lihCFeP+eZzI= github.com/projectdiscovery/iputil v0.0.2/go.mod h1:J3Pcz1q51pi4/JL871mQztg0KOzyWDPxnPLOYJm2pVQ= github.com/projectdiscovery/mapcidr v1.1.1 h1:68Xvw9cKugNeAVxHE3Nl1Ej26nm1taWq6e1WPXpluc0= github.com/projectdiscovery/mapcidr v1.1.1/go.mod h1:yyp9ghqmmC0+r5DySgDBXE4cf2QW8SBloVESCteWiAg= +github.com/projectdiscovery/martian/v3 v3.0.0-20230327175357-82434c1bb926 h1:xzUYoMEg9W6I1RXVbB8RDr520A8xekqMSBV9ymfWr54= +github.com/projectdiscovery/martian/v3 v3.0.0-20230327175357-82434c1bb926/go.mod h1:wPvVUl2C/XOFacugXwsUp65GN0upmKfwKMyimA/AAaM= github.com/projectdiscovery/networkpolicy v0.0.4 h1:zcGjEqZbyECZEdyCy1jVuwOS7Ww1mzgCefQU75XqdJA= github.com/projectdiscovery/networkpolicy v0.0.4/go.mod h1:DIXwKs3sQyfCoWHKRLQiRrEorSQW4Zrh4ftu7oDVK6w= github.com/projectdiscovery/retryabledns v1.0.21 h1:vOpPQR1q8Z824uoA8JXCI/RyvDAssPeD68Onz9hP/ds= github.com/projectdiscovery/retryabledns v1.0.21/go.mod h1:6oTPKMRlKZ7lIIEzTH723K6RvNRjmm6fe9br4Dom3UI= github.com/projectdiscovery/retryablehttp-go v1.0.10 h1:A8tsJZhzpijgnvHT41JNrhiXtn8F8s7TWMC5ZxLV/Cg= github.com/projectdiscovery/retryablehttp-go v1.0.10/go.mod h1:a5bmSbaxgHvC0P80csOymMOwKaJirMnsS6otRUH/vcU= +github.com/projectdiscovery/roundrobin v0.0.6 h1:zoJAFRgP9XK7B+iKSjR+djRAuDYxnc57+Fx+qpoPvds= +github.com/projectdiscovery/roundrobin v0.0.6/go.mod h1:vTxcWqNLyMH6VE2Q/hsNNvDHFLiIzHozC1rLLT/vocQ= github.com/projectdiscovery/stringsutil v0.0.2 h1:uzmw3IVLJSMW1kEg8eCStG/cGbYYZAja8BH3LqqJXMA= github.com/projectdiscovery/stringsutil v0.0.2/go.mod h1:EJ3w6bC5fBYjVou6ryzodQq37D5c6qbAYQpGmAy+DC0= github.com/projectdiscovery/tinydns v0.0.3 h1:2ld565znZWEIYLKAL57uh141Hx6Df5tkPzQ5sdQWm8I= github.com/projectdiscovery/tinydns v0.0.3/go.mod h1:e/VD4DHbQG7KeP44f7tRdO9cp01JfPDe8BdEADKLq0I= github.com/projectdiscovery/utils v0.0.19 h1:5m70xVhBq86h5KsOMVWSO0H+PTmkwlOGAekWcHsaTxI= github.com/projectdiscovery/utils v0.0.19/go.mod h1:Cu216AlQ7rAYa8aDBqB2OgNfu5p24Uj+tG9RxV8Wbfs= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 h1:N/ElC8H3+5XpJzTSTfLsJV/mx9Q9g7kxmchpfZyxgzM= github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= @@ -227,8 +252,6 @@ github.com/rivo/uniseg v0.4.4 h1:8TfxU8dW6PdqD27gjM8MVNuicgxIjxpm4K7x4jp8sis= github.com/rivo/uniseg v0.4.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= github.com/rogpeppe/go-charset v0.0.0-20180617210344-2471d30d28b4/go.mod h1:qgYeAmZ5ZIpBWTGllZSQnw97Dj+woV0toclVaRGI8pc= github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= -github.com/rs/xid v1.4.0 h1:qd7wPTDkN6KQx2VmMBLrpHkiyQwgFXRnkOLacUiaSNY= -github.com/rs/xid v1.4.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= github.com/rs/zerolog v1.11.0/go.mod h1:YbFCdg8HfsridGWAh22vktObvhZbQsZXe4/zB0OKkWU= github.com/saintfish/chardet v0.0.0-20120816061221-3af4cd4741ca/go.mod h1:uugorj2VCxiV1x+LzaIdVa9b4S4qGAcH6cbhh4qVxOU= github.com/saintfish/chardet v0.0.0-20230101081208-5e3ef4b5456d h1:hrujxIzL1woJ7AwssoOcM/tq5JjjG2yYOc8odClEiXA= @@ -242,6 +265,7 @@ github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSS github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= @@ -284,6 +308,7 @@ github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8/go.mod h1:HUYIGzjTL3rfEspMx github.com/yl2chen/cidranger v1.0.2 h1:lbOWZVCG1tCRX4u24kuM1Tb4nHqWkDxwLdoS+SevawU= github.com/yl2chen/cidranger v1.0.2/go.mod h1:9U1yz7WPYDwf0vpNWFaeRh0bjwz5RVgRy/9UEQfHl0g= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.5.2/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= github.com/yuin/goldmark v1.5.4 h1:2uY/xC0roWy8IBEGLgB1ywIoEJFGmRrX21YQcvGZzjU= github.com/yuin/goldmark v1.5.4/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= @@ -301,6 +326,7 @@ go.uber.org/multierr v1.10.0 h1:S0h4aNzvfcFsC3dRF1jLoaov7oRaKqRGC/pUEJ2yvPQ= go.uber.org/multierr v1.10.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201124201722-c8d3bf9c5392/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= @@ -308,17 +334,29 @@ golang.org/x/crypto v0.0.0-20211209193657-4570a0811e8b/go.mod h1:IxCIyHEi3zRg3s0 golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.7.0 h1:AvwMYaRytfdeVt3u6mLaxYtErKYjxA2OXjJ1HHq6t3A= golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20230315142452-642cacee5cc0 h1:pVgRXcIictcr+lBQIFeiwuwtDIs4eL21OuM9nyAADmo= golang.org/x/exp v0.0.0-20230315142452-642cacee5cc0/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.9.0 h1:KENHtAZL2y3NLMYZeHY9DW8HW8V+kQyJsY/V9JlKvCs= golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220725212005-46097bf591d3/go.mod h1:AaygXjzTFtRAg2ttMY5RMuhpJ3cNnI0XpyFJD1iQRSM= golang.org/x/net v0.0.0-20221002022538-bcab6841153b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= @@ -328,7 +366,11 @@ golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAG golang.org/x/oauth2 v0.5.0 h1:HuArIo48skDwlrvM3sEdHXElYslAMsf3KwRkkW4MC4s= golang.org/x/oauth2 v0.5.0/go.mod h1:9/XBHVqLaWO3/BRHs5jbpYCnOZVjj5V0ndyaAM7KB4I= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -337,7 +379,9 @@ golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210228012217-479acdf4ea46/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -350,17 +394,49 @@ golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuX golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.9.0 h1:2sjJmO8cDvYveuX97RDLsxlyUxLl+GHoLxBiRdHllBE= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.7.0 h1:W4OVu8VVOaIO0yzWMNdepAulS7YfoS3Zabrm8DOXXU4= golang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= +google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84 h1:R1r5J0u6Cx+RNl/6mezTw6oA14cmKC96FeUwL6A9bd4= +google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= +google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.38.0 h1:/9BgsAsa5nWe26HqOlvlgJnqBuktYOLCgjCPqsa56W0= +google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w= @@ -383,3 +459,5 @@ gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= diff --git a/internal/runner/options.go b/internal/runner/options.go index 69f94534..429fc24d 100644 --- a/internal/runner/options.go +++ b/internal/runner/options.go @@ -37,6 +37,7 @@ type Options struct { UpstreamProxyRequestsNumber int // Number of requests before switching upstream proxy DumpRequest bool // Dump requests in separate files DumpResponse bool // Dump responses in separate files + OutCAFile string Deny goflags.StringSlice // Deny ip/cidr Allow goflags.StringSlice // Allow ip/cidr Elastic elastic.Options @@ -63,6 +64,7 @@ func ParseOptions() *Options { flagSet.StringVarP(&options.OutputDirectory, "output", "o", "logs", "Output Directory to store HTTP proxy logs"), flagSet.BoolVar(&options.DumpRequest, "dump-req", false, "Dump only HTTP requests to output file"), flagSet.BoolVar(&options.DumpResponse, "dump-resp", false, "Dump only HTTP responses to output file"), + flagSet.StringVarP(&options.OutCAFile, "out-ca", "oca", "", "Generate and Save CA File to filename"), ) flagSet.CreateGroup("update", "Update", diff --git a/internal/runner/runner.go b/internal/runner/runner.go index 1da2ca5c..53d6794c 100644 --- a/internal/runner/runner.go +++ b/internal/runner/runner.go @@ -1,12 +1,14 @@ package runner import ( + "os" "strings" "github.com/Knetic/govaluate" "github.com/projectdiscovery/dsl" "github.com/projectdiscovery/gologger" "github.com/projectdiscovery/proxify" + "github.com/projectdiscovery/proxify/pkg/certs" ) // Runner contains the internal logic of the program @@ -17,6 +19,19 @@ type Runner struct { // NewRunner instance func NewRunner(options *Options) (*Runner, error) { + if err := certs.LoadCerts(options.Directory); err != nil { + gologger.Fatal().Msgf("%s\n", err) + } + + if options.OutCAFile != "" { + err := certs.SaveCAToFile(options.OutCAFile) + if err != nil { + return nil, err + } + gologger.Print().Msgf("Saved CA File at %v", options.OutCAFile) + os.Exit(0) + } + proxy, err := proxify.NewProxy(&proxify.Options{ Directory: options.Directory, CertCacheSize: options.CertCacheSize, @@ -63,6 +78,7 @@ func (r *Runner) validateExpressions(expressionsGroups ...[]string) error { // Run polling and notification func (r *Runner) Run() error { + if err := r.validateExpressions(r.options.RequestDSL, r.options.ResponseDSL, r.options.RequestMatchReplaceDSL, r.options.ResponseMatchReplaceDSL); err != nil { return err } diff --git a/pkg/certs/ca.go b/pkg/certs/ca.go deleted file mode 100644 index b1486a01..00000000 --- a/pkg/certs/ca.go +++ /dev/null @@ -1,153 +0,0 @@ -package certs - -import ( - "crypto/rand" - "crypto/rsa" - "crypto/tls" - "crypto/x509" - "crypto/x509/pkix" - "encoding/pem" - "errors" - "math/big" - "net" - "os" - "time" -) - -// Constants used for the SSL Certificates -const ( - bits = 2048 - organization = "Proxify CA" - country = "US" - province = "CA" - locality = "San Francisco" - streetAddress = "548 Market St" - postalCode = "94104" -) - -// createCertificateAuthority creates a new certificate authority -func (m *Manager) createAuthority(certPath, keyPath string) error { - priv, err := rsa.GenerateKey(rand.Reader, bits) - if err != nil { - return err - } - - notBefore := time.Now() - notAfter := notBefore.Add(time.Duration(365*24) * time.Hour) - serialNumberLimit := new(big.Int).Lsh(big.NewInt(1), 128) - serialNumber, err := rand.Int(rand.Reader, serialNumberLimit) - if err != nil { - return err - } - - template := x509.Certificate{ - SerialNumber: serialNumber, - Subject: pkix.Name{ - Organization: []string{organization}, - Country: []string{country}, - Province: []string{province}, - Locality: []string{locality}, - StreetAddress: []string{streetAddress}, - PostalCode: []string{postalCode}, - CommonName: organization, - }, - NotBefore: notBefore, - NotAfter: notAfter, - KeyUsage: x509.KeyUsageKeyEncipherment | x509.KeyUsageDigitalSignature | x509.KeyUsageCertSign, - ExtKeyUsage: []x509.ExtKeyUsage{x509.ExtKeyUsageClientAuth, x509.ExtKeyUsageServerAuth}, - BasicConstraintsValid: true, - IsCA: true, - } - cert, err := x509.CreateCertificate(rand.Reader, &template, &template, &priv.PublicKey, priv) - if err != nil { - return err - } - - keyFile, err := os.Create(keyPath) - if err != nil { - return err - } - defer keyFile.Close() - - certFile, err := os.Create(certPath) - if err != nil { - return err - } - defer certFile.Close() - - if err := pem.Encode(keyFile, &pem.Block{Type: "RSA PRIVATE KEY", Bytes: x509.MarshalPKCS1PrivateKey(priv)}); err != nil { - return err - } - return pem.Encode(certFile, &pem.Block{Type: "CERTIFICATE", Bytes: cert}) -} - -var errExpiredCert = errors.New("expired cert error") - -// readCertificateDisk reads a certificate and key file from disk -func (m *Manager) readCertificateDisk(certFile, keyFile string) (*tls.Certificate, error) { - cert, err := tls.LoadX509KeyPair(certFile, keyFile) - if err != nil { - return nil, err - } - cert.Leaf, err = x509.ParseCertificate(cert.Certificate[0]) - if err != nil { - return nil, err - } - // Check the expiration. - if time.Now().After(cert.Leaf.NotAfter) { - return nil, errExpiredCert - } - return &cert, nil -} - -// signCertificate signs a TLS Certificate for a host -func (m *Manager) signCertificate(host string) (*tls.Certificate, error) { - x509ca, err := x509.ParseCertificate(m.cert.Certificate[0]) - if err != nil { - return nil, err - } - - notBefore := time.Now() - notAfter := notBefore.Add(time.Duration(365*24) * time.Hour) - serialNumberLimit := new(big.Int).Lsh(big.NewInt(1), 128) - serialNumber, err := rand.Int(rand.Reader, serialNumberLimit) - if err != nil { - return nil, err - } - - template := x509.Certificate{ - SerialNumber: serialNumber, - Issuer: x509ca.Subject, - Subject: pkix.Name{ - Organization: []string{organization}, - Country: []string{country}, - Province: []string{province}, - Locality: []string{locality}, - StreetAddress: []string{streetAddress}, - PostalCode: []string{postalCode}, - CommonName: host, - }, - NotBefore: notBefore, - NotAfter: notAfter, - KeyUsage: x509.KeyUsageKeyEncipherment | x509.KeyUsageDigitalSignature, - ExtKeyUsage: []x509.ExtKeyUsage{x509.ExtKeyUsageClientAuth, x509.ExtKeyUsageServerAuth}, - BasicConstraintsValid: true, - } - - if ip := net.ParseIP(host); ip != nil { - template.IPAddresses = append(template.IPAddresses, ip) - } else { - template.DNSNames = append(template.DNSNames, host) - } - - certpriv, err := rsa.GenerateKey(rand.Reader, bits) - if err != nil { - return nil, err - } - - derBytes, err := x509.CreateCertificate(rand.Reader, &template, x509ca, &certpriv.PublicKey, m.cert.PrivateKey) - if err != nil { - return nil, err - } - return &tls.Certificate{Certificate: [][]byte{derBytes, m.cert.Certificate[0]}, PrivateKey: certpriv}, nil -} diff --git a/pkg/certs/certs.go b/pkg/certs/certs.go deleted file mode 100644 index cd2a9297..00000000 --- a/pkg/certs/certs.go +++ /dev/null @@ -1,116 +0,0 @@ -// Package certs implements a certificate signing authority implementation -// to sign MITM-ed hosts certificates using a self-signed authority. -// -// It uses an LRU-based certificate caching implementation for -// caching the generated certificates for frequently accessed hosts. -package certs - -import ( - "bytes" - "crypto/tls" - "encoding/pem" - "path/filepath" - "strings" - - "github.com/elazarl/goproxy" - lru "github.com/hashicorp/golang-lru" - "github.com/pkg/errors" - fileutil "github.com/projectdiscovery/utils/file" -) - -// Manager implements a certificate signing authority for TLS Mitm. -type Manager struct { - cert *tls.Certificate - cache *lru.Cache -} - -// Options contains the configuration options for certificate signing client. -type Options struct { - CacheSize int - Directory string -} - -const ( - caKeyName = "cakey.pem" - caCertName = "cacert.pem" -) - -// New creates a new certificate manager signing client instance -func New(options *Options) (*Manager, error) { - manager := &Manager{} - - certFile := filepath.Join(options.Directory, caCertName) - keyFile := filepath.Join(options.Directory, caKeyName) - - if !fileutil.FileExists(certFile) || !fileutil.FileExists(keyFile) { - if err := manager.createAuthority(certFile, keyFile); err != nil { - return nil, errors.Wrap(err, "could not create certificate authority") - } - } -retryRead: - cert, err := manager.readCertificateDisk(certFile, keyFile) - if err != nil { - // Check if we have an expired cert and regenerate - if err == errExpiredCert { - if err := manager.createAuthority(certFile, keyFile); err != nil { - return nil, errors.Wrap(err, "could not create certificate authority") - } - goto retryRead - } - return nil, errors.Wrap(err, "could not read certificate authority") - } - - cache, err := lru.New(options.CacheSize) - if err != nil { - return nil, errors.Wrap(err, "could not create lru cache") - } - return &Manager{cert: cert, cache: cache}, nil -} - -// GetCA returns the CA certificate in PEM Encoded format. -func (m *Manager) GetCA() (tls.Certificate, []byte) { - buffer := &bytes.Buffer{} - - _ = pem.Encode(buffer, &pem.Block{Type: "CERTIFICATE", Bytes: m.cert.Certificate[0]}) - return *m.cert, buffer.Bytes() -} - -// Get returns a certificate for the current host. -func (m *Manager) Get(host string) (*tls.Certificate, error) { - if value, ok := m.cache.Get(host); ok { - return value.(*tls.Certificate), nil - } - cert, err := m.signCertificate(host) - if err != nil { - return nil, err - } - m.cache.Add(host, cert) - return cert, nil -} - -// TLSConfigFromCA generates a spoofed TLS certificate for a host -func (m *Manager) TLSConfigFromCA() func(host string, ctx *goproxy.ProxyCtx) (*tls.Config, error) { - return func(host string, ctx *goproxy.ProxyCtx) (c *tls.Config, err error) { - hostname := stripPort(host) - - value, ok := m.cache.Get(host) - if !ok { - certificate, err := m.signCertificate(hostname) - if err != nil { - return nil, err - } - value = certificate - m.cache.Add(host, certificate) - } - - return &tls.Config{InsecureSkipVerify: true, Certificates: []tls.Certificate{*value.(*tls.Certificate)}}, nil - } -} - -func stripPort(s string) string { - ix := strings.IndexRune(s, ':') - if ix == -1 { - return s - } - return s[:ix] -} diff --git a/pkg/certs/mitm.go b/pkg/certs/mitm.go new file mode 100644 index 00000000..163fd3bf --- /dev/null +++ b/pkg/certs/mitm.go @@ -0,0 +1,121 @@ +package certs + +import ( + "bytes" + "crypto/rsa" + "crypto/x509" + "encoding/pem" + "errors" + "fmt" + "os" + "path/filepath" + "time" + + "github.com/projectdiscovery/gologger" + "github.com/projectdiscovery/martian/v3/mitm" + fileutil "github.com/projectdiscovery/utils/file" +) + +var ( + cert *x509.Certificate + pkey *rsa.PrivateKey +) + +const ( + caKeyName = "cakey.pem" + caCertName = "cacert.pem" + bits = 2048 + organization = "Proxify CA" + country = "US" + province = "CA" + locality = "San Francisco" + streetAddress = "548 Market St" + postalCode = "94104" +) + +// GetMitMConfig returns mitm config for martian +func GetMitMConfig() *mitm.Config { + cfg, err := mitm.NewConfig(cert, pkey) + if err != nil { + gologger.Fatal().Msgf("failed to create mitm config") + } + return cfg +} + +func SaveCAToFile(filename string) error { + buffer := &bytes.Buffer{} + _ = pem.Encode(buffer, &pem.Block{Type: "CERTIFICATE", Bytes: cert.Raw}) + return os.WriteFile(filename, buffer.Bytes(), 0600) +} + +// generateCertificate creates new certificate +func generateCertificate(certFile, keyFile string) error { + var err error + cert, pkey, err = mitm.NewAuthority("Proxify CA", organization, time.Duration(24*365)*time.Hour) + if err != nil { + gologger.Fatal().Msgf("failed to generate CA Certificate") + } + if err = SaveCAToFile(certFile); err != nil { + gologger.Fatal().Msgf("failed to save certFile to disk got %v", err) + } + kf, err := os.OpenFile(keyFile, os.O_WRONLY, 0600) + if err != nil { + gologger.Fatal().Msgf("failed to load open %v while saving private key got %v", keyFile, err) + } + if err := pem.Encode(kf, &pem.Block{Type: "RSA PRIVATE KEY", Bytes: x509.MarshalPKCS1PrivateKey(pkey)}); err != nil { + gologger.Fatal().Msgf("failed to write private key to file got %v", err) + } + _ = kf.Close() + return nil +} + +func readCertNKeyFromDisk(certFile, keyFile string) error { + block, err := readPemFromDisk(certFile) + if err != nil { + return err + } + cert, err = x509.ParseCertificate(block.Bytes) + if err != nil { + return err + } + if time.Now().After(cert.NotAfter) { + return fmt.Errorf("expired certificate found") + } + block, err = readPemFromDisk(keyFile) + if err != nil { + return err + } + pkey, err = x509.ParsePKCS1PrivateKey(block.Bytes) + if err != nil { + return err + } + return nil +} + +func readPemFromDisk(filename string) (*pem.Block, error) { + Bin, err := os.ReadFile(filename) + if err != nil { + return nil, err + } + block, _ := pem.Decode(Bin) + if block == nil { + return nil, fmt.Errorf("failed to decode pem block got nil") + } + return block, nil +} + +func LoadCerts(dir string) error { + certFile := filepath.Join(dir, caCertName) + keyFile := filepath.Join(dir, caKeyName) + + if !fileutil.FileExists(certFile) || !fileutil.FileExists(keyFile) { + return generateCertificate(certFile, keyFile) + } + if err := readCertNKeyFromDisk(certFile, keyFile); err != nil { + return fmt.Errorf("malformed/expired certificate found generating new ones\nNote: Certificates must be reinstalled") + } + if cert == nil || pkey == nil { + return errors.New("something went wrong, cannot start proxify") + } + return nil +} diff --git a/proxy.go b/proxy.go index 700515c3..162e637d 100644 --- a/proxy.go +++ b/proxy.go @@ -2,7 +2,6 @@ package proxify import ( "bufio" - "bytes" "context" "crypto/tls" "fmt" @@ -12,32 +11,31 @@ import ( "net/http" "net/http/httputil" "net/url" - "regexp" "strconv" "strings" - rbtransport "github.com/Mzack9999/roundrobin/transport" "github.com/armon/go-socks5" - "github.com/elazarl/goproxy" "github.com/haxii/fastproxy/bufiopool" "github.com/haxii/fastproxy/superproxy" "github.com/projectdiscovery/dsl" "github.com/projectdiscovery/fastdialer/fastdialer" "github.com/projectdiscovery/gologger" + "github.com/projectdiscovery/martian/v3" + martianlog "github.com/projectdiscovery/martian/v3/log" "github.com/projectdiscovery/proxify/pkg/certs" "github.com/projectdiscovery/proxify/pkg/logger" "github.com/projectdiscovery/proxify/pkg/logger/elastic" "github.com/projectdiscovery/proxify/pkg/logger/kafka" "github.com/projectdiscovery/proxify/pkg/types" "github.com/projectdiscovery/proxify/pkg/util" + rbtransport "github.com/projectdiscovery/roundrobin/transport" "github.com/projectdiscovery/tinydns" - "github.com/rs/xid" + errorutil "github.com/projectdiscovery/utils/errors" "golang.org/x/net/proxy" ) -type OnRequestFunc func(*http.Request, *goproxy.ProxyCtx) (*http.Request, *http.Response) -type OnResponseFunc func(*http.Response, *goproxy.ProxyCtx) *http.Response -type OnConnectFunc func(string, *goproxy.ProxyCtx) (*goproxy.ConnectAction, string) +type OnRequestFunc func(req *http.Request, ctx *martian.Context) error +type OnResponseFunc func(resp *http.Response, ctx *martian.Context) error type Options struct { DumpRequest bool @@ -58,8 +56,6 @@ type Options struct { DNSFallbackResolver string RequestMatchReplaceDSL []string ResponseMatchReplaceDSL []string - OnConnectHTTPCallback OnConnectFunc - OnConnectHTTPSCallback OnConnectFunc OnRequestCallback OnRequestFunc OnResponseCallback OnResponseFunc Deny []string @@ -74,8 +70,7 @@ type Proxy struct { Dialer *fastdialer.Dialer options *Options logger *logger.Logger - certs *certs.Manager - httpproxy *goproxy.ProxyHttpServer + httpProxy *martian.Proxy socks5proxy *socks5.Server socks5tunnel *superproxy.SuperProxy bufioPool *bufiopool.Pool @@ -84,78 +79,94 @@ type Proxy struct { rbsocks5 *rbtransport.RoundTransport } -func (p *Proxy) OnRequest(req *http.Request, ctx *goproxy.ProxyCtx) (*http.Request, *http.Response) { - var userdata types.UserData - if ctx.UserData != nil { - userdata = ctx.UserData.(types.UserData) - } else { - userdata.Host = req.URL.Host +// ModifyRequest +func (p *Proxy) ModifyRequest(req *http.Request) error { + ctx := martian.NewContext(req) + // disable upgrading http connections to https by default + ctx.Session().MarkInsecure() + // setup passthrought and hijack here + userData := types.UserData{ + ID: ctx.ID(), + Host: req.Host, + } + + // If callbacks are given use them (for library use cases) + if p.options.OnRequestCallback != nil { + return p.options.OnRequestCallback(req, ctx) } - // check dsl for _, expr := range p.options.RequestDSL { - if !userdata.Match { + if !userData.Match { m, _ := util.HTTPRequesToMap(req) v, err := dsl.EvalExpr(expr, m) if err != nil { gologger.Warning().Msgf("Could not evaluate request dsl: %s\n", err) } - userdata.Match = err == nil && v.(bool) + userData.Match = err == nil && v.(bool) } } - - id := xid.New().String() - userdata.ID = id + ctx.Set("user-data", userData) // perform match and replace if len(p.options.RequestMatchReplaceDSL) != 0 { _ = p.MatchReplaceRequest(req) } + _ = p.logger.LogRequest(req, userData) + return nil +} - _ = p.logger.LogRequest(req, userdata) - ctx.UserData = userdata +// ModifyResponse +func (p *Proxy) ModifyResponse(resp *http.Response) error { + ctx := martian.NewContext(resp.Request) + var userData *types.UserData + if w, ok := ctx.Get("user-data"); ok { + if data, ok2 := w.(types.UserData); ok2 { + userData = &data + } + } + if userData == nil { + gologger.Error().Msgf("something went wrong got response without userData") + // pass empty struct to avoid panic + userData = &types.UserData{} + } + userData.HasResponse = true - return req, nil -} + // If callbacks are given use them (for library use cases) + if p.options.OnResponseCallback != nil { + return p.options.OnResponseCallback(resp, ctx) + } -func (p *Proxy) OnResponse(resp *http.Response, ctx *goproxy.ProxyCtx) *http.Response { - userdata := ctx.UserData.(types.UserData) - userdata.HasResponse = true + // TODO: match in request seems to be seperate from response + // but share same `Match` value. investigate this + matchStatus := false for _, expr := range p.options.ResponseDSL { - if !userdata.Match { + if !matchStatus { m, _ := util.HTTPResponseToMap(resp) v, err := dsl.EvalExpr(expr, m) if err != nil { gologger.Warning().Msgf("Could not evaluate response dsl: %s\n", err) } - userdata.Match = err == nil && v.(bool) + matchStatus = err == nil && v.(bool) } } - + userData.Match = matchStatus // perform match and replace if len(p.options.ResponseMatchReplaceDSL) != 0 { _ = p.MatchReplaceResponse(resp) } - - _ = p.logger.LogResponse(resp, userdata) - ctx.UserData = userdata - return resp -} - -func (p *Proxy) OnConnectHTTP(host string, ctx *goproxy.ProxyCtx) (*goproxy.ConnectAction, string) { - if util.MatchAnyRegex(p.options.PassThrough, host) { - return goproxy.OkConnect, host - } - ctx.UserData = types.UserData{Host: host} - return goproxy.HTTPMitmConnect, host -} - -func (p *Proxy) OnConnectHTTPS(host string, ctx *goproxy.ProxyCtx) (*goproxy.ConnectAction, string) { - if util.MatchAnyRegex(p.options.PassThrough, host) { - return goproxy.OkConnect, host + _ = p.logger.LogResponse(resp, *userData) + if resp.StatusCode == 301 || resp.StatusCode == 302 { + // set connection close header + // close connection if redirected to different host + if loc, err := resp.Location(); err == nil { + if loc.Host == resp.Request.Host { + // if same host redirect do not close connection + return nil + } + } + resp.Close = true } - ctx.UserData = types.UserData{Host: host} - return goproxy.MitmConnect, host + return nil } // MatchReplaceRequest strings or regex @@ -244,86 +255,55 @@ func (p *Proxy) Run() error { } // http proxy - if p.httpproxy != nil { - if len(p.options.UpstreamHTTPProxies) > 0 { - p.httpproxy.Tr = &http.Transport{Proxy: func(req *http.Request) (*url.URL, error) { - return url.Parse(p.rbhttp.Next()) - }, TLSClientConfig: &tls.Config{InsecureSkipVerify: true}} - p.httpproxy.ConnectDial = nil - } else if len(p.options.UpstreamSock5Proxies) > 0 { - // for each socks5 proxy create a dialer - socks5Dialers := make(map[string]proxy.Dialer) - for _, socks5proxy := range p.options.UpstreamSock5Proxies { - dialer, err := proxy.SOCKS5("tcp", socks5proxy, nil, proxy.Direct) - if err != nil { - return err - } - socks5Dialers[socks5proxy] = dialer - } - p.httpproxy.Tr = &http.Transport{Dial: func(network, addr string) (net.Conn, error) { - // lookup next dialer - socks5Proxy := p.rbsocks5.Next() - socks5Dialer := socks5Dialers[socks5Proxy] - // use it to perform the request - return socks5Dialer.Dial(network, addr) - }, TLSClientConfig: &tls.Config{InsecureSkipVerify: true}} - p.httpproxy.ConnectDial = nil - } else { - p.httpproxy.Tr.DialContext = p.Dialer.Dial + if p.httpProxy != nil { + p.httpProxy.TLSPassthroughFunc = func(req *http.Request) bool { + // if !stringsutil.ContainsAny(req.URL.Host, "avatars") { + // log.Printf("Skipped MITM for %v", req.URL.Host) + // return true + // } + return false } - onConnectHTTP := p.OnConnectHTTP - if p.options.OnConnectHTTPCallback != nil { - onConnectHTTP = p.options.OnConnectHTTPCallback - } - onConnectHTTPS := p.OnConnectHTTPS - if p.options.OnConnectHTTPSCallback != nil { - onConnectHTTPS = p.options.OnConnectHTTPSCallback - } - onRequest := p.OnRequest - if p.options.OnRequestCallback != nil { - onRequest = p.options.OnRequestCallback - } - onResponse := p.OnResponse - if p.options.OnResponseCallback != nil { - onResponse = p.options.OnResponseCallback - } - p.httpproxy.OnRequest(goproxy.ReqHostMatches(regexp.MustCompile("^.*:80$"))).HandleConnectFunc(onConnectHTTP) - p.httpproxy.OnRequest(goproxy.ReqHostMatches(regexp.MustCompile("^.*:443$"))).HandleConnectFunc(onConnectHTTPS) - // catch all - p.httpproxy.OnRequest().HandleConnectFunc(onConnectHTTPS) - p.httpproxy.OnRequest().DoFunc(onRequest) - p.httpproxy.OnResponse().DoFunc(onResponse) - - // Serve the certificate when the user makes requests to /proxify - p.httpproxy.OnRequest(goproxy.DstHostIs("proxify")).DoFunc( - func(r *http.Request, ctx *goproxy.ProxyCtx) (*http.Request, *http.Response) { - if r.URL.Path != "/cacert.crt" { - return r, goproxy.NewResponse(r, "text/plain", 404, "Invalid path given") - } - - _, ca := p.certs.GetCA() - reader := bytes.NewReader(ca) - - header := http.Header{} - header.Set("Content-Type", "application/pkix-cert") - resp := &http.Response{ - Request: r, - TransferEncoding: r.TransferEncoding, - Header: header, - StatusCode: 200, - Status: http.StatusText(200), - ContentLength: int64(reader.Len()), - Body: io.NopCloser(reader), - } - return r, resp - }, - ) - go http.ListenAndServe(p.options.ListenAddrHTTP, p.httpproxy) // nolint + + p.httpProxy.SetRequestModifier(p) + p.httpProxy.SetResponseModifier(p) + + go func() { + l, err := net.Listen("tcp", p.options.ListenAddrHTTP) + if err != nil { + gologger.Fatal().Msgf("failed to setup listener got %v", err) + } + gologger.Fatal().Msgf("%v", p.httpProxy.Serve(l)) + }() + + // // Serve the certificate when the user makes requests to /proxify + // p.httpproxy.OnRequest(goproxy.DstHostIs("proxify")).DoFunc( + // func(r *http.Request, ctx *goproxy.ProxyCtx) (*http.Request, *http.Response) { + // if r.URL.Path != "/cacert.crt" { + // return r, goproxy.NewResponse(r, "text/plain", 404, "Invalid path given") + // } + + // _, ca := p.certs.GetCA() + // reader := bytes.NewReader(ca) + + // header := http.Header{} + // header.Set("Content-Type", "application/pkix-cert") + // resp := &http.Response{ + // Request: r, + // TransferEncoding: r.TransferEncoding, + // Header: header, + // StatusCode: 200, + // Status: http.StatusText(200), + // ContentLength: int64(reader.Len()), + // Body: io.NopCloser(reader), + // } + // return r, resp + // }, + // ) } // socks5 proxy if p.socks5proxy != nil { - if p.httpproxy != nil { + if p.httpProxy != nil { httpProxyIP, httpProxyPort, err := net.SplitHostPort(p.options.ListenAddrHTTP) if err != nil { return err @@ -345,37 +325,78 @@ func (p *Proxy) Run() error { return nil } -func (p *Proxy) Stop() { - +// setupHTTPProxy configures proxy with settings +func (p *Proxy) setupHTTPProxy() error { + hp := martian.NewProxy() + hp.Miscellaneous.SetH1ConnectionHeader = true + hp.Miscellaneous.StripProxyHeaders = true + hp.Miscellaneous.IgnoreWebSocketError = true + rt, err := p.getRoundTripper() + if err != nil { + return errorutil.NewWithErr(err).Msgf("failed to setup transport") + } + hp.SetRoundTripper(rt) + dialContextFunc := func(ctx context.Context, a, b string) (net.Conn, error) { + return p.Dialer.Dial(ctx, a, b) + } + hp.SetDialContext(dialContextFunc) + hp.SetMITM(certs.GetMitMConfig()) + p.httpProxy = hp + return nil } -func NewProxy(options *Options) (*Proxy, error) { - certs, err := certs.New(&certs.Options{ - CacheSize: options.CertCacheSize, - Directory: options.Directory, - }) - if err != nil { - return nil, err +// getRoundTripper returns RoundTripper configured with options +func (p *Proxy) getRoundTripper() (http.RoundTripper, error) { + roundtrip := &http.Transport{ + MaxIdleConnsPerHost: -1, + MaxIdleConns: 0, + MaxConnsPerHost: 0, + TLSClientConfig: &tls.Config{ + InsecureSkipVerify: true, + }, } - var httpproxy *goproxy.ProxyHttpServer - if options.ListenAddrHTTP != "" { - httpproxy = goproxy.NewProxyHttpServer() - if options.Verbosity <= types.VerbositySilent { - httpproxy.Logger = log.New(io.Discard, "", log.Ltime|log.Lshortfile) - } else if options.Verbosity >= types.VerbosityVerbose { - httpproxy.Verbose = true - } else { - httpproxy.Verbose = false + if len(p.options.UpstreamHTTPProxies) > 0 { + roundtrip = &http.Transport{Proxy: func(req *http.Request) (*url.URL, error) { + return url.Parse(p.rbhttp.Next()) + }, TLSClientConfig: &tls.Config{InsecureSkipVerify: true}} + } else if len(p.options.UpstreamSock5Proxies) > 0 { + // for each socks5 proxy create a dialer + socks5Dialers := make(map[string]proxy.Dialer) + for _, socks5proxy := range p.options.UpstreamSock5Proxies { + dialer, err := proxy.SOCKS5("tcp", socks5proxy, nil, proxy.Direct) + if err != nil { + return nil, err + } + socks5Dialers[socks5proxy] = dialer } + roundtrip = &http.Transport{Dial: func(network, addr string) (net.Conn, error) { + // lookup next dialer + socks5Proxy := p.rbsocks5.Next() + socks5Dialer := socks5Dialers[socks5Proxy] + // use it to perform the request + return socks5Dialer.Dial(network, addr) + }, TLSClientConfig: &tls.Config{InsecureSkipVerify: true}} } + return roundtrip, nil +} - ca, _ := certs.GetCA() - goproxy.GoproxyCa = ca - goproxy.OkConnect = &goproxy.ConnectAction{Action: goproxy.ConnectAccept, TLSConfig: certs.TLSConfigFromCA()} - goproxy.MitmConnect = &goproxy.ConnectAction{Action: goproxy.ConnectMitm, TLSConfig: certs.TLSConfigFromCA()} - goproxy.HTTPMitmConnect = &goproxy.ConnectAction{Action: goproxy.ConnectHTTPMitm, TLSConfig: certs.TLSConfigFromCA()} - goproxy.RejectConnect = &goproxy.ConnectAction{Action: goproxy.ConnectReject, TLSConfig: certs.TLSConfigFromCA()} +func (p *Proxy) Stop() { + // p.httpProxy.Close() +} + +func NewProxy(options *Options) (*Proxy, error) { + + switch options.Verbosity { + case types.VerbositySilent: + martianlog.SetLevel(martianlog.Silent) + case types.VerbosityVerbose: + martianlog.SetLevel(martianlog.Info) + case types.VerbosityVeryVerbose: + martianlog.SetLevel(martianlog.Debug) + default: + martianlog.SetLevel(martianlog.Error) + } logger := logger.NewLogger(&logger.OptionsLogger{ Verbosity: options.Verbosity, @@ -402,6 +423,7 @@ func NewProxy(options *Options) (*Proxy, error) { } dnsmapping[data[0]] = &tinydns.DnsRecord{A: []string{data[1]}} } + var err error tdns, err = tinydns.New(&tinydns.Options{ ListenAddress: options.ListenDNSAddr, Net: "udp", @@ -433,14 +455,16 @@ func NewProxy(options *Options) (*Proxy, error) { } proxy := &Proxy{ - httpproxy: httpproxy, - certs: certs, - logger: logger, - options: options, - Dialer: dialer, - tinydns: tdns, - rbhttp: rbhttp, - rbsocks5: rbsocks5, + logger: logger, + options: options, + Dialer: dialer, + tinydns: tdns, + rbhttp: rbhttp, + rbsocks5: rbsocks5, + } + + if err := proxy.setupHTTPProxy(); err != nil { + return nil, err } var socks5proxy *socks5.Server diff --git a/socket.go b/socket.go index 876ebb9e..3aac7142 100644 --- a/socket.go +++ b/socket.go @@ -22,7 +22,7 @@ type SocketProxy struct { // SocketConn represent the single full duplex pipe type SocketConn struct { - laddr, raddr net.Addr //nolint + // laddr, raddr net.Addr //nolint lconn, rconn net.Conn erred bool errsig chan bool