Skip to content
This repository was archived by the owner on Jul 1, 2024. It is now read-only.

Commit 7f7d695

Browse files
authored
Merge pull request #25 from oxygenpay/develop
merge: develop
2 parents 4173ea8 + 79b56a5 commit 7f7d695

File tree

13 files changed

+1460
-641
lines changed

13 files changed

+1460
-641
lines changed

go.mod

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,8 @@ require (
2020
github.com/jackc/pgx/v4 v4.16.1
2121
github.com/jellydator/ttlcache/v3 v3.0.1
2222
github.com/labstack/echo-contrib v0.12.0
23-
github.com/labstack/echo/v4 v4.7.2
24-
github.com/labstack/gommon v0.3.1
23+
github.com/labstack/echo/v4 v4.11.1
24+
github.com/labstack/gommon v0.4.0
2525
github.com/olekukonko/tablewriter v0.0.5
2626
github.com/oxygenpay/tatum-sdk v0.0.0-20230529210116-d986b7743613
2727
github.com/pkg/errors v0.9.1
@@ -36,7 +36,7 @@ require (
3636
github.com/ziflex/lecho/v3 v3.1.0
3737
go.etcd.io/bbolt v1.3.6
3838
go.uber.org/atomic v1.10.0
39-
golang.org/x/crypto v0.7.0
39+
golang.org/x/crypto v0.11.0
4040
golang.org/x/exp v0.0.0-20230206171751-46f607a40771
4141
golang.org/x/oauth2 v0.1.0
4242
golang.org/x/sync v0.1.0
@@ -80,7 +80,7 @@ require (
8080
github.com/josharian/intern v1.0.0 // indirect
8181
github.com/mailru/easyjson v0.7.7 // indirect
8282
github.com/mattn/go-colorable v0.1.13 // indirect
83-
github.com/mattn/go-isatty v0.0.16 // indirect
83+
github.com/mattn/go-isatty v0.0.19 // indirect
8484
github.com/mattn/go-runewidth v0.0.9 // indirect
8585
github.com/mitchellh/mapstructure v1.5.0 // indirect
8686
github.com/oklog/ulid v1.3.1 // indirect
@@ -95,12 +95,12 @@ require (
9595
github.com/tklauser/go-sysconf v0.3.5 // indirect
9696
github.com/tklauser/numcpus v0.2.2 // indirect
9797
github.com/valyala/bytebufferpool v1.0.0 // indirect
98-
github.com/valyala/fasttemplate v1.2.1 // indirect
98+
github.com/valyala/fasttemplate v1.2.2 // indirect
9999
go.mongodb.org/mongo-driver v1.8.3 // indirect
100-
golang.org/x/net v0.8.0 // indirect
101-
golang.org/x/sys v0.6.0 // indirect
102-
golang.org/x/text v0.8.0 // indirect
103-
golang.org/x/time v0.0.0-20220922220347-f3bd1da661af // indirect
100+
golang.org/x/net v0.12.0 // indirect
101+
golang.org/x/sys v0.10.0 // indirect
102+
golang.org/x/text v0.11.0 // indirect
103+
golang.org/x/time v0.3.0 // indirect
104104
google.golang.org/appengine v1.6.7 // indirect
105105
google.golang.org/protobuf v1.28.1 // indirect
106106
gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce // indirect

go.sum

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,7 @@ github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs
116116
github.com/deckarep/golang-set/v2 v2.1.0 h1:g47V4Or+DUdzbs8FxCCmgb6VYd+ptPAngjM6dtGktsI=
117117
github.com/deckarep/golang-set/v2 v2.1.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4=
118118
github.com/decred/dcrd/crypto/blake256 v1.0.0 h1:/8DMNYp9SGi5f0w7uCm6d6M4OU2rGFK09Y2A4Xv7EE0=
119+
github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc=
119120
github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 h1:HbphB4TFFXpv7MNrT52FGrrgVXF1owhMVTHFZIlnvd4=
120121
github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0/go.mod h1:DZGJHZMqrU4JJqFAWUS2UO1+lbSKsdiOoYi9Zzey7Fc=
121122
github.com/denisenkom/go-mssqldb v0.9.0/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU=
@@ -425,9 +426,13 @@ github.com/labstack/echo-contrib v0.12.0/go.mod h1:kR62TbwsBgmpV2HVab5iQRsQtLuhP
425426
github.com/labstack/echo/v4 v4.6.1/go.mod h1:RnjgMWNDB9g/HucVWhQYNQP9PvbYf6adqftqryo7s9k=
426427
github.com/labstack/echo/v4 v4.7.2 h1:Kv2/p8OaQ+M6Ex4eGimg9b9e6icoxA42JSlOR3msKtI=
427428
github.com/labstack/echo/v4 v4.7.2/go.mod h1:xkCDAdFCIf8jsFQ5NnbK7oqaF/yU1A1X20Ltm0OvSks=
429+
github.com/labstack/echo/v4 v4.11.1 h1:dEpLU2FLg4UVmvCGPuk/APjlH6GDpbEPti61srUUUs4=
430+
github.com/labstack/echo/v4 v4.11.1/go.mod h1:YuYRTSM3CHs2ybfrL8Px48bO6BAnYIN4l8wSTMP6BDQ=
428431
github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k=
429432
github.com/labstack/gommon v0.3.1 h1:OomWaJXm7xR6L1HmEtGyQf26TEn7V6X88mktX9kee9o=
430433
github.com/labstack/gommon v0.3.1/go.mod h1:uW6kP17uPlLJsD3ijUYn3/M5bAxtlZhMI6m3MFxTMTM=
434+
github.com/labstack/gommon v0.4.0 h1:y7cvthEAEbU0yHOf4axH8ZG2NH8knB9iNSoTO8dyIk8=
435+
github.com/labstack/gommon v0.4.0/go.mod h1:uW6kP17uPlLJsD3ijUYn3/M5bAxtlZhMI6m3MFxTMTM=
431436
github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
432437
github.com/lib/pq v1.1.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
433438
github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
@@ -464,6 +469,8 @@ github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Ky
464469
github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=
465470
github.com/mattn/go-isatty v0.0.16 h1:bq3VjFmv/sOjHtdEhmkEV4x1AJtvUvOJ2PFAZ5+peKQ=
466471
github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
472+
github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA=
473+
github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
467474
github.com/mattn/go-oci8 v0.1.1/go.mod h1:wjDx6Xm9q7dFtHJvIlrI99JytznLw5wQ4R+9mNXJwGI=
468475
github.com/mattn/go-runewidth v0.0.9 h1:Lm995f3rfxdpd6TSmuVCHVb/QhupuXlYr8sCI/QdE+0=
469476
github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI=
@@ -611,6 +618,8 @@ github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyC
611618
github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8=
612619
github.com/valyala/fasttemplate v1.2.1 h1:TVEnxayobAdVkhQfrfes2IzOB6o+z4roRkPF52WA1u4=
613620
github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ=
621+
github.com/valyala/fasttemplate v1.2.2 h1:lxLXG0uE3Qnshl9QyaK6XJxMXlQZELvChBOCmQD0Loo=
622+
github.com/valyala/fasttemplate v1.2.2/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ=
614623
github.com/wemeetagain/go-hdwallet v0.1.0 h1:ELpLLaz47CgYyXfyLDGnZgGJSkG9eWvK/RF4f0WmLyM=
615624
github.com/wemeetagain/go-hdwallet v0.1.0/go.mod h1:V2AxcXVscy8NML27VJNpnqpkU68pJfuPFSCIIzWnrKU=
616625
github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI=
@@ -686,6 +695,8 @@ golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5y
686695
golang.org/x/crypto v0.0.0-20211215165025-cf75a172585e/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8=
687696
golang.org/x/crypto v0.7.0 h1:AvwMYaRytfdeVt3u6mLaxYtErKYjxA2OXjJ1HHq6t3A=
688697
golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU=
698+
golang.org/x/crypto v0.11.0 h1:6Ewdq3tDic1mg5xRO4milcWCfMVQhI4NkqWWvqejpuA=
699+
golang.org/x/crypto v0.11.0/go.mod h1:xgJhtzW8F9jGdVFWZESrid1U1bjeNy4zgy5cRr/CIio=
689700
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
690701
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
691702
golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
@@ -768,6 +779,8 @@ golang.org/x/net v0.0.0-20210913180222-943fd674d43e/go.mod h1:9nx3DQGgdP8bBQD5qx
768779
golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
769780
golang.org/x/net v0.8.0 h1:Zrh2ngAOFYneWTAIAPethzeaQLuHwhuBkuV6ZiRnUaQ=
770781
golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc=
782+
golang.org/x/net v0.12.0 h1:cfawfvKITfUsFCeJIHJrbSxpeu/E81khclypR0GVT50=
783+
golang.org/x/net v0.12.0/go.mod h1:zEVYFnQC7m/vmpQFELhcD1EWkZlX69l4oqgmer6hfKA=
771784
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
772785
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
773786
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
@@ -861,10 +874,13 @@ golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBc
861874
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
862875
golang.org/x/sys v0.6.0 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ=
863876
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
877+
golang.org/x/sys v0.10.0 h1:SqMFp9UcQJZa+pmYuAKjd9xq1f0j5rLcDIk0mj4qAsA=
878+
golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
864879
golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
865880
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
866881
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
867882
golang.org/x/term v0.6.0 h1:clScbb1cHjoCkyRbWwBEUZ5H/tIFu5TAXIqaZD0Gcjw=
883+
golang.org/x/term v0.10.0 h1:3R7pNqamzBraeqj/Tj8qt1aQ2HpmlC+Cx/qL/7hn4/c=
868884
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
869885
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
870886
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
@@ -876,12 +892,16 @@ golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
876892
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
877893
golang.org/x/text v0.8.0 h1:57P1ETyNKtuIjB4SRd15iJxuhj8Gc416Y78H3qgMh68=
878894
golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
895+
golang.org/x/text v0.11.0 h1:LAntKIrcmeSKERyiOh0XMV39LXS8IE9UL2yP7+f5ij4=
896+
golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
879897
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
880898
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
881899
golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
882900
golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
883901
golang.org/x/time v0.0.0-20220922220347-f3bd1da661af h1:Yx9k8YCG3dvF87UAn2tu2HQLf2dt/eR1bXxpLMWeH+Y=
884902
golang.org/x/time v0.0.0-20220922220347-f3bd1da661af/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
903+
golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4=
904+
golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
885905
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
886906
golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
887907
golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
@@ -950,6 +970,7 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T
950970
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
951971
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
952972
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
973+
golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8=
953974
google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=
954975
google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=
955976
google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=

internal/auth/google.go

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"encoding/json"
66
"io"
77

8+
"github.com/oxygenpay/oxygen/internal/util"
89
"github.com/pkg/errors"
910
"github.com/rs/zerolog"
1011
"golang.org/x/oauth2"
@@ -46,9 +47,11 @@ func NewGoogleOAuth(cfg GoogleConfig, logger *zerolog.Logger) *GoogleOAuthManage
4647
}
4748
}
4849

49-
// RedirectURL return URL to Google auth screen.
50-
func (a *GoogleOAuthManager) RedirectURL() string {
51-
return a.config.AuthCodeURL("")
50+
// RedirectURLWithState return URL to Google auth screen.
51+
func (a *GoogleOAuthManager) RedirectURLWithState() (string, string) {
52+
state := util.Strings.Random(16)
53+
54+
return a.config.AuthCodeURL(state), state
5255
}
5356

5457
func (a *GoogleOAuthManager) ResolveUser(ctx context.Context, code string) (*GoogleUser, error) {

internal/server/http/internalapi/wallet.go

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import (
1515
"github.com/pkg/errors"
1616
)
1717

18-
const defaultPaginationLimit = 30
18+
const defaultPaginationLimit = int32(30)
1919
const maxPaginationLimit = 100
2020

2121
const paramWalletID = "walletID"
@@ -221,14 +221,16 @@ func (h *Handler) ListWallets(c echo.Context) error {
221221

222222
paginationLimit := defaultPaginationLimit
223223
if limit != "" {
224-
paginationLimit, err = strconv.Atoi(limit)
225-
if err != nil {
224+
l, errParse := strconv.ParseInt(limit, 10, 32)
225+
if errParse != nil {
226226
return c.JSON(http.StatusBadRequest, &admin.ErrorResponse{
227227
Errors: nil,
228228
Message: "Invalid query param: limit",
229229
Status: "validation_error",
230230
})
231231
}
232+
233+
paginationLimit = int32(l)
232234
}
233235

234236
invalid := startID < 1 || paginationLimit > maxPaginationLimit ||
@@ -245,7 +247,7 @@ func (h *Handler) ListWallets(c echo.Context) error {
245247
ctx := c.Request().Context()
246248
wallets, nextPageID, err := h.wallet.List(ctx, wallet.Pagination{
247249
Start: int64(startID),
248-
Limit: int64(paginationLimit),
250+
Limit: paginationLimit,
249251
FilterByBlockchain: blockchain,
250252
})
251253

internal/server/http/merchantapi/auth/email.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,8 @@ func (h *Handler) PostLogin(c echo.Context) error {
3232
return errors.Wrap(err, "unable to resolve user")
3333
}
3434

35-
if err := h.persistSessionUserID(c, person.ID, "email"); err != nil {
35+
setSession := map[string]any{middleware.UserIDContextKey: person.ID}
36+
if err := h.persistSession(c, "email", setSession); err != nil {
3637
return common.ErrorResponse(c, "internal error")
3738
}
3839

internal/server/http/merchantapi/auth/google.go

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,18 +15,34 @@ func (h *Handler) GetRedirect(c echo.Context) error {
1515
return c.Redirect(http.StatusTemporaryRedirect, h.googleAuth.GetAuthenticatedRedirectURL())
1616
}
1717

18-
return c.Redirect(http.StatusTemporaryRedirect, h.googleAuth.RedirectURL())
18+
redirect, state := h.googleAuth.RedirectURLWithState()
19+
20+
setSession := map[string]any{middleware.SessionStateKey: state}
21+
if err := h.persistSession(c, "google", setSession); err != nil {
22+
return common.ErrorResponse(c, "internal error")
23+
}
24+
25+
return c.Redirect(http.StatusTemporaryRedirect, redirect)
1926
}
2027

2128
func (h *Handler) GetCallback(c echo.Context) error {
29+
ctx := c.Request().Context()
30+
2231
if person := middleware.ResolveUser(c); person != nil {
2332
return c.Redirect(http.StatusTemporaryRedirect, h.googleAuth.GetAuthenticatedRedirectURL())
2433
}
2534

26-
ctx := c.Request().Context()
35+
query := c.Request().URL.Query()
36+
37+
expectedState, stateExists := middleware.ResolveSessionOAuthState(c)
38+
switch {
39+
case !stateExists:
40+
return common.ValidationErrorResponse(c, "Missing OAuth state")
41+
case expectedState != query.Get("state"):
42+
return common.ValidationErrorResponse(c, "OAuth state mismatch")
43+
}
2744

28-
code := c.Request().URL.Query().Get("code")
29-
googleUser, err := h.googleAuth.ResolveUser(ctx, code)
45+
googleUser, err := h.googleAuth.ResolveUser(ctx, query.Get("code"))
3046
if err != nil {
3147
msg := "unable to resolve googleUser"
3248
h.logger.Error().Err(err).Msg(msg)
@@ -43,7 +59,8 @@ func (h *Handler) GetCallback(c echo.Context) error {
4359
return errors.Wrap(err, "unable to resolve google user")
4460
}
4561

46-
if err := h.persistSessionUserID(c, person.ID, "google"); err != nil {
62+
setSession := map[string]any{middleware.UserIDContextKey: person.ID}
63+
if err := h.persistSession(c, "google", setSession); err != nil {
4764
return common.ErrorResponse(c, "internal error")
4865
}
4966

internal/server/http/merchantapi/auth/handler.go

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -80,12 +80,15 @@ func (h *Handler) PostLogout(c echo.Context) error {
8080
return c.NoContent(http.StatusNoContent)
8181
}
8282

83-
func (h *Handler) persistSessionUserID(c echo.Context, id int64, provider string) error {
83+
func (h *Handler) persistSession(c echo.Context, source string, values map[string]any) error {
8484
s := middleware.ResolveSession(c)
85-
s.Values[middleware.UserIDContextKey] = id
85+
86+
for k, v := range values {
87+
s.Values[k] = v
88+
}
8689

8790
if err := s.Save(c.Request(), c.Response()); err != nil {
88-
h.logger.Error().Err(err).Str("provider", provider).Msg("unable to persist user session")
91+
h.logger.Error().Err(err).Str("source", source).Msg("unable to persist user session")
8992
return err
9093
}
9194

internal/server/http/middleware/auth.go

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ const (
2323
IsTokenAuthContextKey = "token_auth"
2424
MerchantContextKey = "merchant"
2525

26+
SessionStateKey = "session_state"
27+
2628
ParamMerchantID = "merchantId"
2729
)
2830

@@ -216,6 +218,22 @@ func ResolveSession(c echo.Context) *sessions.Session {
216218
return userSession
217219
}
218220

221+
func ResolveSessionOAuthState(c echo.Context) (string, bool) {
222+
s := ResolveSession(c)
223+
224+
raw, ok := s.Values[SessionStateKey]
225+
if !ok {
226+
return "", false
227+
}
228+
229+
state, ok := raw.(string)
230+
if !ok {
231+
return "", false
232+
}
233+
234+
return state, true
235+
}
236+
219237
func ResolveUser(c echo.Context) *user.User {
220238
personRaw := c.Get(UserContextKey)
221239
person, ok := personRaw.(*user.User)

internal/service/wallet/service.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ type Type string
5858

5959
type Pagination struct {
6060
Start int64
61-
Limit int64
61+
Limit int32
6262
FilterByBlockchain kmswallet.Blockchain
6363
FilterByType Type
6464
}
@@ -204,7 +204,7 @@ func (s *Service) GetByUUID(ctx context.Context, id uuid.UUID) (*Wallet, error)
204204
func (s *Service) List(ctx context.Context, pagination Pagination) ([]*Wallet, *int64, error) {
205205
results, err := s.store.PaginateWalletsByID(ctx, repository.PaginateWalletsByIDParams{
206206
ID: pagination.Start,
207-
Limit: int32(pagination.Limit),
207+
Limit: pagination.Limit,
208208
FilterByBlockchain: pagination.FilterByBlockchain != "",
209209
Blockchain: string(pagination.FilterByBlockchain),
210210
FilterByType: pagination.FilterByType != "",

0 commit comments

Comments
 (0)