diff --git a/go.mod b/go.mod index 1d1c8837f..9661fefbd 100644 --- a/go.mod +++ b/go.mod @@ -13,7 +13,10 @@ require ( github.com/andig/gosunspec v0.0.0-20240918203654-860ce51d602b github.com/andig/mbserver v0.0.0-20230310211055-1d29cbb5820e github.com/asaskevich/EventBus v0.0.0-20200907212545-49d423059eef - github.com/aws/aws-sdk-go v1.55.7 + github.com/aws/aws-sdk-go-v2 v1.37.1 + github.com/aws/aws-sdk-go-v2/config v1.30.2 + github.com/aws/aws-sdk-go-v2/credentials v1.18.2 + github.com/aws/aws-sdk-go-v2/service/cognitoidentity v1.30.1 github.com/basgys/goxml2json v1.1.0 github.com/basvdlei/gotsmart v0.0.3 github.com/benbjohnson/clock v1.3.5 @@ -50,7 +53,7 @@ require ( github.com/gosimple/slug v1.15.0 github.com/gregdel/pushover v1.3.1 github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79 - github.com/grid-x/modbus v0.0.0-20250717144429-344b140e33c1 + github.com/grid-x/modbus v0.0.0-20250801110857-752051ed9df7 github.com/hashicorp/go-version v1.7.0 github.com/hasura/go-graphql-client v0.14.4 github.com/influxdata/influxdb-client-go/v2 v2.14.0 @@ -77,7 +80,7 @@ require ( github.com/olekukonko/tablewriter v1.0.9 github.com/philippseith/signalr v0.7.0 github.com/prometheus-community/pro-bing v0.7.0 - github.com/prometheus/client_golang v1.22.0 + github.com/prometheus/client_golang v1.23.0 github.com/prometheus/common v0.65.0 github.com/robertkrimen/otto v0.5.1 github.com/samber/lo v1.51.0 @@ -91,7 +94,7 @@ require ( github.com/spf13/pflag v1.0.7 github.com/spf13/viper v1.20.1 github.com/stretchr/testify v1.10.0 - github.com/teslamotors/vehicle-command v0.3.4 + github.com/teslamotors/vehicle-command v0.4.0 github.com/traefik/yaegi v0.16.1 github.com/tv42/httpunix v0.0.0-20191220191345-2ba4b9c3382c github.com/volkszaehler/mbmd v0.0.0-20250608084036-9a13257a4991 @@ -100,7 +103,7 @@ require ( go.uber.org/mock v0.5.2 go.yaml.in/yaml/v4 v4.0.0-20250730171608-926dd0b54a90 golang.org/x/crypto v0.40.0 - golang.org/x/crypto/x509roots/fallback v0.0.0-20250711192710-b903b535d3ef + golang.org/x/crypto/x509roots/fallback v0.0.0-20250803194717-c247dead11de golang.org/x/exp v0.0.0-20250718183923-645b1fa84792 golang.org/x/net v0.42.0 golang.org/x/oauth2 v0.30.0 @@ -119,6 +122,16 @@ require ( github.com/andybalholm/cascadia v1.3.3 // indirect github.com/antihax/optional v1.0.0 // indirect github.com/apapsch/go-jsonmerge/v2 v2.0.0 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.1 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.1 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.1 // indirect + github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.0 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.1 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.26.1 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.31.1 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.35.1 // indirect + github.com/aws/smithy-go v1.22.5 // indirect github.com/azihsoyn/rijndael256 v0.0.0-20200316065338-d14eefa2b66b // indirect github.com/bahlo/generic-list-go v0.2.0 // indirect github.com/beorn7/perks v1.0.1 // indirect @@ -168,7 +181,6 @@ require ( github.com/invopop/jsonschema v0.13.0 // indirect github.com/itchyny/timefmt-go v0.1.6 // indirect github.com/jinzhu/inflection v1.0.0 // indirect - github.com/jmespath/go-jmespath v0.4.0 // indirect github.com/josharian/intern v1.0.0 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/leodido/go-urn v1.4.0 // indirect @@ -198,7 +210,7 @@ require ( github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect github.com/prometheus/client_model v0.6.2 // indirect - github.com/prometheus/procfs v0.15.1 // indirect + github.com/prometheus/procfs v0.16.1 // indirect github.com/quic-go/qpack v0.5.1 // indirect github.com/quic-go/quic-go v0.48.2 // indirect github.com/quic-go/webtransport-go v0.8.1-0.20241018022711-4ac2c9250e66 // indirect diff --git a/go.sum b/go.sum index 306bbd527..173e50362 100644 --- a/go.sum +++ b/go.sum @@ -55,9 +55,35 @@ github.com/asaskevich/EventBus v0.0.0-20200907212545-49d423059eef h1:2JGTg6JapxP github.com/asaskevich/EventBus v0.0.0-20200907212545-49d423059eef/go.mod h1:JS7hed4L1fj0hXcyEejnW57/7LCetXggd+vwrRnYeII= github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU= github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= -github.com/aws/aws-sdk-go v1.55.7 h1:UJrkFq7es5CShfBwlWAC8DA077vp8PyVbQd3lqLiztE= -github.com/aws/aws-sdk-go v1.55.7/go.mod h1:eRwEWoyTWFMVYVQzKMNHWP5/RV4xIUGMQfXQHfHkpNU= github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g= +github.com/aws/aws-sdk-go-v2 v1.37.1 h1:SMUxeNz3Z6nqGsXv0JuJXc8w5YMtrQMuIBmDx//bBDY= +github.com/aws/aws-sdk-go-v2 v1.37.1/go.mod h1:9Q0OoGQoboYIAJyslFyF1f5K1Ryddop8gqMhWx/n4Wg= +github.com/aws/aws-sdk-go-v2/config v1.30.2 h1:YE1BmSc4fFYqFgN1mN8uzrtc7R9x+7oSWeX8ckoltAw= +github.com/aws/aws-sdk-go-v2/config v1.30.2/go.mod h1:UNrLGZ6jfAVjgVJpkIxjLufRJqTXCVYOpkeVf83kwBo= +github.com/aws/aws-sdk-go-v2/credentials v1.18.2 h1:mfm0GKY/PHLhs7KO0sUaOtFnIQ15Qqxt+wXbO/5fIfs= +github.com/aws/aws-sdk-go-v2/credentials v1.18.2/go.mod h1:v0SdJX6ayPeZFQxgXUKw5RhLpAoZUuynxWDfh8+Eknc= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.1 h1:owmNBboeA0kHKDcdF8KiSXmrIuXZustfMGGytv6OMkM= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.1/go.mod h1:Bg1miN59SGxrZqlP8vJZSmXW+1N8Y1MjQDq1OfuNod8= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.1 h1:ksZXBYv80EFTcgc8OJO48aQ8XDWXIQL7gGasPeCoTzI= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.1/go.mod h1:HSksQyyJETVZS7uM54cir0IgxttTD+8aEoJMPGepHBI= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.1 h1:+dn/xF/05utS7tUhjIcndbuaPjfll2LhbH1cCDGLYUQ= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.1/go.mod h1:hyAGz30LHdm5KBZDI58MXx5lDVZ5CUfvfTZvMu4HCZo= +github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3 h1:bIqFDwgGXXN1Kpp99pDOdKMTTb5d2KyU5X/BZxjOkRo= +github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3/go.mod h1:H5O/EsxDWyU+LP/V8i5sm8cxoZgc2fdNR9bxlOFrQTo= +github.com/aws/aws-sdk-go-v2/service/cognitoidentity v1.30.1 h1:NB1+cWutptq+UHLSodvhdhNw8mSf3L2slhysVs5HCh8= +github.com/aws/aws-sdk-go-v2/service/cognitoidentity v1.30.1/go.mod h1:nPuM/gz996X+i7RSnw1LNdaP9NFBMgEpamx6YB2mrQQ= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.0 h1:6+lZi2JeGKtCraAj1rpoZfKqnQ9SptseRZioejfUOLM= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.0/go.mod h1:eb3gfbVIxIoGgJsi9pGne19dhCBpK6opTYpQqAmdy44= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.1 h1:ky79ysLMxhwk5rxJtS+ILd3Mc8kC5fhsLBrP27r6h4I= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.1/go.mod h1:+2MmkvFvPYM1vsozBWduoLJUi5maxFk5B7KJFECujhY= +github.com/aws/aws-sdk-go-v2/service/sso v1.26.1 h1:uWaz3DoNK9MNhm7i6UGxqufwu3BEuJZm72WlpGwyVtY= +github.com/aws/aws-sdk-go-v2/service/sso v1.26.1/go.mod h1:ILpVNjL0BO+Z3Mm0SbEeUoYS9e0eJWV1BxNppp0fcb8= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.31.1 h1:XdG6/o1/ZDmn3wJU5SRAejHaWgKS4zHv0jBamuKuS2k= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.31.1/go.mod h1:oiotGTKadCOCl3vg/tYh4k45JlDF81Ka8rdumNhEnIQ= +github.com/aws/aws-sdk-go-v2/service/sts v1.35.1 h1:iF4Xxkc0H9c/K2dS0zZw3SCkj0Z7n6AMnUiiyoJND+I= +github.com/aws/aws-sdk-go-v2/service/sts v1.35.1/go.mod h1:0bxIatfN0aLq4mjoLDeBpOjOke68OsFlXPDFJ7V0MYw= +github.com/aws/smithy-go v1.22.5 h1:P9ATCXPMb2mPjYBgueqJNCA5S9UfktsW0tTxi+a7eqw= +github.com/aws/smithy-go v1.22.5/go.mod h1:t1ufH5HMublsJYulve2RKmHDC15xu1f26kHCp/HgceI= github.com/azihsoyn/rijndael256 v0.0.0-20200316065338-d14eefa2b66b h1:/2dABok/UswXOj5rjbR5bZ411ApGBq1pAEZdy5rvFrY= github.com/azihsoyn/rijndael256 v0.0.0-20200316065338-d14eefa2b66b/go.mod h1:ef+2vMUkiKcy2Tz7HykB01KbgUnkK4gQKq4ZeR4RYVs= github.com/bahlo/generic-list-go v0.2.0 h1:5sz/EEAK+ls5wF+NeqDpk5+iNdMDXrh3z3nPnH1Wvgk= @@ -388,10 +414,6 @@ github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkr github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ= github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= -github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= -github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= -github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= -github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= github.com/joeshaw/carwings v0.0.0-20250704173606-1708e349f36c h1:qAJHVJ+s+pbLuvNiYhYVblTfgkFiPwUuAJMUNKh0uJc= github.com/joeshaw/carwings v0.0.0-20250704173606-1708e349f36c/go.mod h1:rNwwhAzMSNqlTsRQZ7a+jXHu4Mgn2ztr3aYCqRgWGlA= github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0= @@ -589,8 +611,8 @@ github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5Fsn github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeDPbaTKGT+JTgUa3og= github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= github.com/prometheus/client_golang v1.10.0/go.mod h1:WJM3cc3yu7XKBKa/I8WeZm+V3eltZnBwfENSU7mdogU= -github.com/prometheus/client_golang v1.22.0 h1:rb93p9lokFEsctTys46VnV1kLCDpVZ0a/Y92Vm0Zc6Q= -github.com/prometheus/client_golang v1.22.0/go.mod h1:R7ljNsLXhuQXYZYtw6GAE9AZg8Y7vEW5scdCXrWRXC0= +github.com/prometheus/client_golang v1.23.0 h1:ust4zpdl9r4trLY/gSjlm07PuiBq2ynaXXlptpfy8Uc= +github.com/prometheus/client_golang v1.23.0/go.mod h1:i/o0R9ByOnHX0McrTMTyhYvKE4haaf2mW08I+jGAjEE= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= @@ -612,8 +634,8 @@ github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsT github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc= -github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk= +github.com/prometheus/procfs v0.16.1 h1:hZ15bTNuirocR6u0JZ6BAHHmwS1p8B4P6MRqxtzMyRg= +github.com/prometheus/procfs v0.16.1/go.mod h1:teAbpZRB1iIAJYREa1LsoWUXykVXA1KlTmWl8x/U+Is= github.com/quic-go/qpack v0.5.1 h1:giqksBPnT/HDtZ6VhtFKgoLOWmlyo9Ei6u9PqzIMbhI= github.com/quic-go/qpack v0.5.1/go.mod h1:+PC4XFrEskIVkcLzpEkbLqq1uCoxPhQuvK5rH1ZgaEg= github.com/quic-go/quic-go v0.48.2 h1:wsKXZPeGWpMpCGSWqOcqpW2wZYic/8T3aqiOID0/KWE= @@ -718,8 +740,8 @@ github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSW github.com/tarm/serial v0.0.0-20180830185346-98f6abe2eb07/go.mod h1:kDXzergiv9cbyO7IOYJZWg1U88JhDg3PB6klq9Hg2pA= github.com/teivah/onecontext v1.3.0 h1:tbikMhAlo6VhAuEGCvhc8HlTnpX4xTNPTOseWuhO1J0= github.com/teivah/onecontext v1.3.0/go.mod h1:hoW1nmdPVK/0jrvGtcx8sCKYs2PiS4z0zzfdeuEVyb0= -github.com/teslamotors/vehicle-command v0.3.4 h1:77admcqrFSF2Qa00z1paLYq8h8w4+cZ1nwadg/vghno= -github.com/teslamotors/vehicle-command v0.3.4/go.mod h1:l7Rxdpd/9QBnQnj6NQ/w4Vb5OSE1cB7okS4qmf+rIwI= +github.com/teslamotors/vehicle-command v0.4.0 h1:39JJ7wGdS3dmW3tlsshg2C9/YWx+fxaUw6aRKfqWmpc= +github.com/teslamotors/vehicle-command v0.4.0/go.mod h1:aL0IRpLu+l205NxejRkuxpqAovw69rDKriBKKyP8gLI= github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/traefik/yaegi v0.16.1 h1:f1De3DVJqIDKmnasUF6MwmWv1dSEEat0wcpXhD2On3E= github.com/traefik/yaegi v0.16.1/go.mod h1:4eVhbPb3LnD2VigQjhYbEJ69vDRFdT2HQNrXx8eEwUY= @@ -774,8 +796,8 @@ go.opentelemetry.io/otel/trace v1.36.0/go.mod h1:gQ+OnDZzrybY4k4seLzPAWNwVBBVlF2 go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= -go.uber.org/goleak v1.1.12 h1:gZAh5/EyT/HQwlpkCy6wTpqfH9H8Lz8zbm3dZh+OyzA= -go.uber.org/goleak v1.1.12/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/mock v0.5.2 h1:LbtPTcP8A5k9WPXj54PPPbjcI4Y6lhyOZXn+VS7wNko= go.uber.org/mock v0.5.2/go.mod h1:wLlUxC2vVTPTaE3UD51E0BGOAElKrILxhVSDYQLld5o= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= @@ -801,8 +823,8 @@ golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= golang.org/x/crypto v0.40.0 h1:r4x+VvoG5Fm+eJcxMaY8CQM7Lb0l1lsmjGBQ6s8BfKM= golang.org/x/crypto v0.40.0/go.mod h1:Qr1vMER5WyS2dfPHAlsOj01wgLbsyWtFn/aY+5+ZdxY= -golang.org/x/crypto/x509roots/fallback v0.0.0-20250711192710-b903b535d3ef h1:EJekzaXZlPQg739ghq7w/XWZVcuAOY6mh35JX2D+7Gc= -golang.org/x/crypto/x509roots/fallback v0.0.0-20250711192710-b903b535d3ef/go.mod h1:lxN5T34bK4Z/i6cMaU7frUU57VkDXFD4Kamfl/cp9oU= +golang.org/x/crypto/x509roots/fallback v0.0.0-20250803194717-c247dead11de h1:iGd5rLguHodZ8KhaKSNKl9QamKsae5egSDQVQC0PLJ0= +golang.org/x/crypto/x509roots/fallback v0.0.0-20250803194717-c247dead11de/go.mod h1:lxN5T34bK4Z/i6cMaU7frUU57VkDXFD4Kamfl/cp9oU= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20250718183923-645b1fa84792 h1:R9PFI6EUdfVKgwKjZef7QIwGcBKu86OEFpJ9nUEP2l4= golang.org/x/exp v0.0.0-20250718183923-645b1fa84792/go.mod h1:A+z0yzpGtvnG90cToK5n2tu8UJVP2XUATh+r+sfOOOc= @@ -1027,7 +1049,6 @@ gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.7/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= diff --git a/vehicle/fiat.go b/vehicle/fiat.go index 55d8adf12..24d1345f9 100644 --- a/vehicle/fiat.go +++ b/vehicle/fiat.go @@ -1,6 +1,7 @@ package vehicle import ( + "context" "fmt" "time" @@ -19,11 +20,11 @@ type Fiat struct { } func init() { - registry.Add("fiat", NewFiatFromConfig) + registry.AddCtx("fiat", NewFiatFromConfig) } // NewFiatFromConfig creates a new vehicle -func NewFiatFromConfig(other map[string]interface{}) (api.Vehicle, error) { +func NewFiatFromConfig(ctx context.Context, other map[string]interface{}) (api.Vehicle, error) { cc := struct { embed `mapstructure:",squash"` User, Password, VIN, PIN string @@ -47,7 +48,7 @@ func NewFiatFromConfig(other map[string]interface{}) (api.Vehicle, error) { } log := util.NewLogger("fiat").Redact(cc.User, cc.Password, cc.VIN) - identity := fiat.NewIdentity(log, cc.User, cc.Password) + identity := fiat.NewIdentity(log, ctx, cc.User, cc.Password) err := identity.Login() if err != nil { diff --git a/vehicle/fiat/identity.go b/vehicle/fiat/identity.go index c33127c0c..a6e8c0440 100644 --- a/vehicle/fiat/identity.go +++ b/vehicle/fiat/identity.go @@ -1,6 +1,9 @@ package fiat import ( + "context" + "crypto/sha256" + "encoding/hex" "fmt" "io" "net/http" @@ -9,11 +12,11 @@ import ( "strings" "time" - "github.com/aws/aws-sdk-go/aws" - "github.com/aws/aws-sdk-go/aws/credentials" - "github.com/aws/aws-sdk-go/aws/session" - v4 "github.com/aws/aws-sdk-go/aws/signer/v4" - "github.com/aws/aws-sdk-go/service/cognitoidentity" + v4 "github.com/aws/aws-sdk-go-v2/aws/signer/v4" + "github.com/aws/aws-sdk-go-v2/config" + "github.com/aws/aws-sdk-go-v2/credentials" + "github.com/aws/aws-sdk-go-v2/service/cognitoidentity" + "github.com/aws/aws-sdk-go-v2/service/cognitoidentity/types" "github.com/evcc-io/evcc/util" "github.com/evcc-io/evcc/util/request" "github.com/samber/lo" @@ -28,13 +31,14 @@ const ( type Identity struct { *request.Helper + ctx context.Context user, password string uid string - creds *cognitoidentity.Credentials + creds *types.Credentials } // NewIdentity creates Fiat identity -func NewIdentity(log *util.Logger, user, password string) *Identity { +func NewIdentity(log *util.Logger, ctx context.Context, user, password string) *Identity { return &Identity{ Helper: request.NewHelper(log), user: user, @@ -46,8 +50,6 @@ func NewIdentity(log *util.Logger, user, password string) *Identity { func (v *Identity) Login() error { v.Client.Jar, _ = cookiejar.New(nil) - uri := fmt.Sprintf("%s/accounts.webSdkBootstrap", LoginURI) - data := url.Values{ "APIKey": {ApiKey}, "pageURL": {"https://myuconnect.fiat.com/de/de/vehicle-services"}, @@ -56,18 +58,12 @@ func (v *Identity) Login() error { "format": {"json"}, } - headers := map[string]string{ + uri := fmt.Sprintf("%s/accounts.webSdkBootstrap?%s", LoginURI, data.Encode()) + req, _ := request.New(http.MethodGet, uri, nil, map[string]string{ "Accept": "*/*", - } - - req, err := request.New(http.MethodGet, uri, nil, headers) - if err == nil { - req.URL.RawQuery = data.Encode() - - var resp *http.Response - if resp, err = v.Do(req); err == nil { - resp.Body.Close() - } + }) + if _, err := v.Do(req); err != nil { + return err } var res struct { @@ -80,115 +76,109 @@ func (v *Identity) Login() error { } } - if err == nil { - uri = fmt.Sprintf("%s/accounts.login", LoginURI) + uri = fmt.Sprintf("%s/accounts.login", LoginURI) - data := url.Values{ - "loginID": {v.user}, - "password": {v.password}, - "sessionExpiration": {"7776000"}, - "APIKey": {ApiKey}, - "pageURL": {"https://myuconnect.fiat.com/de/de/login"}, - "sdk": {"js_latest"}, - "sdkBuild": {"12234"}, - "format": {"json"}, - "targetEnv": {"jssdk"}, - "include": {"profile,data,emails"}, // subscriptions,preferences - "includeUserInfo": {"true"}, - "loginMode": {"standard"}, - "lang": {"de0de"}, - "source": {"showScreenSet"}, - "authMode": {"cookie"}, - } - - headers := map[string]string{ - "Accept": "*/*", - "Content-Type": "application/x-www-form-urlencoded", - } - - if req, err = request.New(http.MethodPost, uri, strings.NewReader(data.Encode()), headers); err == nil { - if err = v.DoJSON(req, &res); err == nil { - err = res.ErrorInfo.Error() - v.uid = res.UID - } - } + data = url.Values{ + "loginID": {v.user}, + "password": {v.password}, + "sessionExpiration": {"7776000"}, + "APIKey": {ApiKey}, + "pageURL": {"https://myuconnect.fiat.com/de/de/login"}, + "sdk": {"js_latest"}, + "sdkBuild": {"12234"}, + "format": {"json"}, + "targetEnv": {"jssdk"}, + "include": {"profile,data,emails"}, // subscriptions,preferences + "includeUserInfo": {"true"}, + "loginMode": {"standard"}, + "lang": {"de0de"}, + "source": {"showScreenSet"}, + "authMode": {"cookie"}, } + req, _ = request.New(http.MethodPost, uri, strings.NewReader(data.Encode()), map[string]string{ + "Accept": "*/*", + "Content-Type": "application/x-www-form-urlencoded", + }) + if err := v.DoJSON(req, &res); err != nil { + return err + } + if err := res.ErrorInfo.Error(); err != nil { + return err + } + + v.uid = res.UID + var token struct { ErrorInfo StatusReason string IDToken string `json:"id_token"` } - if err == nil { - uri = fmt.Sprintf("%s/accounts.getJWT", LoginURI) + data = url.Values{ + "fields": {"profile.firstName,profile.lastName,profile.email,country,locale,data.disclaimerCodeGSDP"}, // data.GSDPisVerified + "APIKey": {ApiKey}, + "pageURL": {"https://myuconnect.fiat.com/de/de/dashboard"}, + "sdk": {"js_latest"}, + "sdkBuild": {"12234"}, + "format": {"json"}, + "login_token": {res.SessionInfo.LoginToken}, + "authMode": {"cookie"}, + } - data := url.Values{ - "fields": {"profile.firstName,profile.lastName,profile.email,country,locale,data.disclaimerCodeGSDP"}, // data.GSDPisVerified - "APIKey": {ApiKey}, - "pageURL": {"https://myuconnect.fiat.com/de/de/dashboard"}, - "sdk": {"js_latest"}, - "sdkBuild": {"12234"}, - "format": {"json"}, - "login_token": {res.SessionInfo.LoginToken}, - "authMode": {"cookie"}, - } + uri = fmt.Sprintf("%s/accounts.getJWT?%s", LoginURI, data.Encode()) - headers := map[string]string{ - "Accept": "*/*", - } - - if req, err = request.New(http.MethodGet, uri, nil, headers); err == nil { - req.URL.RawQuery = data.Encode() - if err = v.DoJSON(req, &token); err == nil { - err = token.ErrorInfo.Error() - } - } + req, _ = request.New(http.MethodGet, uri, nil, map[string]string{ + "Accept": "*/*", + }) + if err := v.DoJSON(req, &token); err != nil { + return err + } + if err := token.ErrorInfo.Error(); err != nil { + return err } var identity struct { Token, IdentityID string } - if err == nil { - data := struct { - GigyaToken string `json:"gigya_token"` - }{ - GigyaToken: token.IDToken, - } - - headers := map[string]string{ - "Content-Type": "application/json", - "X-Clientapp-Version": "1.0", - "ClientRequestId": lo.RandomString(16, lo.LettersCharset), - "X-Api-Key": XApiKey, - "X-Originator-Type": "web", - } - - if req, err = request.New(http.MethodPost, TokenURI, request.MarshalJSON(data), headers); err == nil { - err = v.DoJSON(req, &identity) - } + gigya := struct { + GigyaToken string `json:"gigya_token"` + }{ + GigyaToken: token.IDToken, } - var credRes *cognitoidentity.GetCredentialsForIdentityOutput - - if err == nil { - session := session.Must(session.NewSession(&aws.Config{Region: aws.String(Region)})) - svc := cognitoidentity.New(session) - - credRes, err = svc.GetCredentialsForIdentity(&cognitoidentity.GetCredentialsForIdentityInput{ - IdentityId: &identity.IdentityID, - Logins: map[string]*string{ - "cognito-identity.amazonaws.com": &identity.Token, - }, - }) + headers := map[string]string{ + "Content-Type": "application/json", + "X-Clientapp-Version": "1.0", + "ClientRequestId": lo.RandomString(16, lo.LettersCharset), + "X-Api-Key": XApiKey, + "X-Originator-Type": "web", } - if err == nil { - v.creds = credRes.Credentials + req, _ = request.New(http.MethodPost, TokenURI, request.MarshalJSON(gigya), headers) + if err := v.DoJSON(req, &identity); err != nil { + return err } - return err + cfg, err := config.LoadDefaultConfig(v.ctx, config.WithRegion(Region)) + if err != nil { + return err + } + svc := cognitoidentity.NewFromConfig(cfg) + + credRes, err := svc.GetCredentialsForIdentity(v.ctx, &cognitoidentity.GetCredentialsForIdentityInput{ + IdentityId: &identity.IdentityID, + Logins: map[string]string{ + "cognito-identity.amazonaws.com": identity.Token, + }, + }) + if err != nil { + return err + } + + v.creds = credRes.Credentials + return nil } // UID returns the logged in users uid @@ -206,10 +196,41 @@ func (v *Identity) Sign(req *http.Request, body io.ReadSeeker) error { } // sign request - signer := v4.NewSigner(credentials.NewStaticCredentials( + credProvider := credentials.NewStaticCredentialsProvider( *v.creds.AccessKeyId, *v.creds.SecretKey, *v.creds.SessionToken, - )) - _, err := signer.Sign(req, body, "execute-api", Region, time.Now()) + ) + credentials, err := credProvider.Retrieve(v.ctx) + if err != nil { + return err + } - return err + payloadHash, err := hashBody(body) + if err != nil { + return err + } + + signer := v4.NewSigner() + return signer.SignHTTP(v.ctx, credentials, req, payloadHash, "execute-api", Region, time.Now()) +} + +func hashBody(body io.ReadSeeker) (string, error) { + if body == nil { + // For empty payloads, use the SHA-256 hash of empty string + return "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", nil + } + + // Read the body content + bodyBytes, err := io.ReadAll(body) + if err != nil { + return "", err + } + + // Reset the body seeker to the beginning + if _, err := body.Seek(0, io.SeekStart); err != nil { + return "", err + } + + // Calculate SHA-256 hash + hash := sha256.Sum256(bodyBytes) + return hex.EncodeToString(hash[:]), nil }