Skip to content

Commit 1f8ac8b

Browse files
committed
REST API: fix token invalidation after password change
Signed-off-by: Nicola Murino <nicola.murino@gmail.com>
1 parent aceecd9 commit 1f8ac8b

File tree

7 files changed

+56
-18
lines changed

7 files changed

+56
-18
lines changed

go.mod

+5-5
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ go 1.22.2
44

55
require (
66
cloud.google.com/go/storage v1.41.0
7-
github.com/Azure/azure-sdk-for-go/sdk/azcore v1.11.1
7+
github.com/Azure/azure-sdk-for-go/sdk/azcore v1.12.0
88
github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.3.2
99
github.com/GehirnInc/crypt v0.0.0-20230320061759-8cc1b52080c5
1010
github.com/alexedwards/argon2id v1.0.0
@@ -13,9 +13,9 @@ require (
1313
github.com/aws/aws-sdk-go-v2/config v1.27.17
1414
github.com/aws/aws-sdk-go-v2/credentials v1.17.17
1515
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.4
16-
github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.16.22
16+
github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.16.23
1717
github.com/aws/aws-sdk-go-v2/service/marketplacemetering v1.21.9
18-
github.com/aws/aws-sdk-go-v2/service/s3 v1.54.4
18+
github.com/aws/aws-sdk-go-v2/service/s3 v1.55.0
1919
github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.29.2
2020
github.com/aws/aws-sdk-go-v2/service/sts v1.28.11
2121
github.com/bmatcuk/doublestar/v4 v4.6.1
@@ -84,7 +84,7 @@ require (
8484
cloud.google.com/go/compute/metadata v0.3.0 // indirect
8585
cloud.google.com/go/iam v1.1.8 // indirect
8686
filippo.io/edwards25519 v1.1.0 // indirect
87-
github.com/Azure/azure-sdk-for-go/sdk/internal v1.8.0 // indirect
87+
github.com/Azure/azure-sdk-for-go/sdk/internal v1.9.0 // indirect
8888
github.com/ajg/form v1.5.1 // indirect
8989
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.2 // indirect
9090
github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.8 // indirect
@@ -126,7 +126,7 @@ require (
126126
github.com/hashicorp/yamux v0.1.1 // indirect
127127
github.com/inconshreveable/mousetrap v1.1.0 // indirect
128128
github.com/jackc/pgpassfile v1.0.0 // indirect
129-
github.com/jackc/pgservicefile v0.0.0-20231201235250-de7065d80cb9 // indirect
129+
github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 // indirect
130130
github.com/jackc/puddle/v2 v2.2.1 // indirect
131131
github.com/jmespath/go-jmespath v0.4.0 // indirect
132132
github.com/kr/fs v0.1.0 // indirect

go.sum

+10-10
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,12 @@ cloud.google.com/go/storage v1.41.0/go.mod h1:J1WCa/Z2FcgdEDuPUY8DxT5I+d9mFKsCep
1818
filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA=
1919
filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4=
2020
github.com/Azure/azure-sdk-for-go v68.0.0+incompatible h1:fcYLmCpyNYRnvJbPerq7U0hS+6+I79yEDJBqVNcqUzU=
21-
github.com/Azure/azure-sdk-for-go/sdk/azcore v1.11.1 h1:E+OJmp2tPvt1W+amx48v1eqbjDYsgN+RzP4q16yV5eM=
22-
github.com/Azure/azure-sdk-for-go/sdk/azcore v1.11.1/go.mod h1:a6xsAQUZg+VsS3TJ05SRp524Hs4pZ/AeFSr5ENf0Yjo=
21+
github.com/Azure/azure-sdk-for-go/sdk/azcore v1.12.0 h1:1nGuui+4POelzDwI7RG56yfQJHCnKvwfMoU7VsEp+Zg=
22+
github.com/Azure/azure-sdk-for-go/sdk/azcore v1.12.0/go.mod h1:99EvauvlcJ1U06amZiksfYz/3aFGyIhWGHVyiZXtBAI=
2323
github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.5.2 h1:FDif4R1+UUR+00q6wquyX90K7A8dN+R5E8GEadoP7sU=
2424
github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.5.2/go.mod h1:aiYBYui4BJ/BJCAIKs92XiPyQfTaBWqvHujDwKb6CBU=
25-
github.com/Azure/azure-sdk-for-go/sdk/internal v1.8.0 h1:jBQA3cKT4L2rWMpgE7Yt3Hwh2aUj8KXjIGLxjHeYNNo=
26-
github.com/Azure/azure-sdk-for-go/sdk/internal v1.8.0/go.mod h1:4OG6tQ9EOP/MT0NMjDlRzWoVFxfu9rN9B2X+tlSVktg=
25+
github.com/Azure/azure-sdk-for-go/sdk/internal v1.9.0 h1:H+U3Gk9zY56G3u872L82bk4thcsy2Gghb9ExT4Zvm1o=
26+
github.com/Azure/azure-sdk-for-go/sdk/internal v1.9.0/go.mod h1:mgrmMSgaLp9hmax62XQTd0N4aAqSE5E0DulSpVYK7vc=
2727
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storage/armstorage v1.5.0 h1:AifHbc4mg0x9zW52WOpKbsHaDKuRhlI7TVl47thgQ70=
2828
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storage/armstorage v1.5.0/go.mod h1:T5RfihdXtBDxt1Ch2wobif3TvzTdumDy29kahv6AV9A=
2929
github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.3.2 h1:YUUxeiOWgdAQE3pXt2H7QXzZs0q8UBjgRbl56qo8GYM=
@@ -49,8 +49,8 @@ github.com/aws/aws-sdk-go-v2/credentials v1.17.17 h1:b3Dk9uxQByS9sc6r0sc2jmxsJKO
4949
github.com/aws/aws-sdk-go-v2/credentials v1.17.17/go.mod h1:e4khg9iY08LnFK/HXQDWMf9GDaiMari7jWPnXvKAuBU=
5050
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.4 h1:0cSfTYYL9qiRcdi4Dvz+8s3JUgNR2qvbgZkXcwPEEEk=
5151
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.4/go.mod h1:Wjn5O9eS7uSi7vlPKt/v0MLTncANn9EMmoDvnzJli6o=
52-
github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.16.22 h1:1CO+m67soQzw6hfkfSS0hQzS/o05bCswr+gQfBfQgLQ=
53-
github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.16.22/go.mod h1:XUetvjVEuGFl1ABsTZ/5tufz0WXT+MpR9qcMnEJm0dw=
52+
github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.16.23 h1:g6IHovcexw51hcP0hxsT7Mr3/PG76hZvoodm9tuKuUc=
53+
github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.16.23/go.mod h1:8KSZ0CibxgOaPk28CFL4DGBdGrscHJr8FuxB+jnJBaM=
5454
github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.8 h1:RnLB7p6aaFMRfyQkD6ckxR7myCC9SABIqSz4czYUUbU=
5555
github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.8/go.mod h1:XH7dQJd+56wEbP1I4e4Duo+QhSMxNArE8VP7NuUOTeM=
5656
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.8 h1:jzApk2f58L9yW9q1GEab3BMMFWUkkiZhyrRUtbwUbKU=
@@ -69,8 +69,8 @@ github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.17.8 h1:iQNXVs1vtaq+y9
6969
github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.17.8/go.mod h1:yUQPRlWqGG0lfNsmjbRWKVwgilfBtZTOFSLEYALlAig=
7070
github.com/aws/aws-sdk-go-v2/service/marketplacemetering v1.21.9 h1:1Y6NAaK/9Wjxb4VAlUOMUQuTrOKNXfLrhaSzNdLKkwo=
7171
github.com/aws/aws-sdk-go-v2/service/marketplacemetering v1.21.9/go.mod h1:KpgKQ+ZF5kssRykR4yxANtddzYFatCqlv8yHddRHne4=
72-
github.com/aws/aws-sdk-go-v2/service/s3 v1.54.4 h1:4p9SCdZBO0PdEXLTF2fcQuxOEkEiqPQpK824cP2VKRo=
73-
github.com/aws/aws-sdk-go-v2/service/s3 v1.54.4/go.mod h1:oSkRFuHVWmUY4Ssk16ErGzBqvYEbvORJFzFXzWhTB2s=
72+
github.com/aws/aws-sdk-go-v2/service/s3 v1.55.0 h1:6kq0Xql9qiwNGL/Go87ZqR4otg9jnKs71OfWCVbPxLM=
73+
github.com/aws/aws-sdk-go-v2/service/s3 v1.55.0/go.mod h1:oSkRFuHVWmUY4Ssk16ErGzBqvYEbvORJFzFXzWhTB2s=
7474
github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.29.2 h1:vnONgeMo5TuAtGjVNjieDyaI6tzMDNm0TuBgkKzqkX4=
7575
github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.29.2/go.mod h1:OR529kEc7Ty9nsqvMuDBBHq5AZVih/MYd5/G9TcL5bQ=
7676
github.com/aws/aws-sdk-go-v2/service/sso v1.20.10 h1:ItKVmFwbyb/ZnCWf+nu3XBVmUirpO9eGEQd7urnBA0s=
@@ -231,8 +231,8 @@ github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2
231231
github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
232232
github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM=
233233
github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg=
234-
github.com/jackc/pgservicefile v0.0.0-20231201235250-de7065d80cb9 h1:L0QtFUgDarD7Fpv9jeVMgy/+Ec0mtnmYuImjTz6dtDA=
235-
github.com/jackc/pgservicefile v0.0.0-20231201235250-de7065d80cb9/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM=
234+
github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 h1:iCEnooe7UlwOQYpKFhBabPMi4aNAfoODPEFNiAnClxo=
235+
github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM=
236236
github.com/jackc/pgx/v5 v5.6.0 h1:SWJzexBzPL5jb0GEsrPMLIsi/3jOo7RHlzTjcAeDrPY=
237237
github.com/jackc/pgx/v5 v5.6.0/go.mod h1:DNZ/vlrUnhWCoFGxHAG8U2ljioxukquj7utPDgtQdTw=
238238
github.com/jackc/puddle/v2 v2.2.1 h1:RhxXJtFG022u4ibrCSMSiu5aOq1i77R3OHKNJj77OAk=

internal/httpd/api_admin.go

+1
Original file line numberDiff line numberDiff line change
@@ -297,6 +297,7 @@ func changeAdminPassword(w http.ResponseWriter, r *http.Request) {
297297
sendAPIResponse(w, r, err, "", getRespStatus(err))
298298
return
299299
}
300+
invalidateToken(r)
300301
sendAPIResponse(w, r, err, "Password updated", http.StatusOK)
301302
}
302303

internal/httpd/api_http_user.go

+1
Original file line numberDiff line numberDiff line change
@@ -531,6 +531,7 @@ func changeUserPassword(w http.ResponseWriter, r *http.Request) {
531531
sendAPIResponse(w, r, err, "", getRespStatus(err))
532532
return
533533
}
534+
invalidateToken(r)
534535
sendAPIResponse(w, r, err, "Password updated", http.StatusOK)
535536
}
536537

internal/httpd/httpd.go

+4
Original file line numberDiff line numberDiff line change
@@ -664,6 +664,10 @@ func (b *Binding) showClientLoginURL() bool {
664664
return true
665665
}
666666

667+
func (b *Binding) isMutualTLSEnabled() bool {
668+
return b.ClientAuthType == 1
669+
}
670+
667671
type defenderStatus struct {
668672
IsActive bool `json:"is_active"`
669673
}

internal/httpd/httpd_test.go

+34-2
Original file line numberDiff line numberDiff line change
@@ -11372,11 +11372,17 @@ func TestWebAPIChangeUserPwdMock(t *testing.T) {
1137211372
assert.NoError(t, err)
1137311373
token, err := getJWTAPIUserTokenFromTestServer(defaultUsername, defaultPassword)
1137411374
assert.NoError(t, err)
11375-
// invalid json
11376-
req, err := http.NewRequest(http.MethodPut, userPwdPath, bytes.NewBuffer([]byte("{")))
11375+
11376+
req, err := http.NewRequest(http.MethodGet, userProfilePath, nil)
1137711377
assert.NoError(t, err)
1137811378
setBearerForReq(req, token)
1137911379
rr := executeRequest(req)
11380+
checkResponseCode(t, http.StatusOK, rr)
11381+
// invalid json
11382+
req, err = http.NewRequest(http.MethodPut, userPwdPath, bytes.NewBuffer([]byte("{")))
11383+
assert.NoError(t, err)
11384+
setBearerForReq(req, token)
11385+
rr = executeRequest(req)
1138011386
checkResponseCode(t, http.StatusBadRequest, rr)
1138111387

1138211388
pwd := make(map[string]string)
@@ -11399,6 +11405,13 @@ func TestWebAPIChangeUserPwdMock(t *testing.T) {
1139911405
setBearerForReq(req, token)
1140011406
rr = executeRequest(req)
1140111407
checkResponseCode(t, http.StatusOK, rr)
11408+
11409+
req, err = http.NewRequest(http.MethodGet, userProfilePath, nil)
11410+
assert.NoError(t, err)
11411+
setBearerForReq(req, token)
11412+
rr = executeRequest(req)
11413+
checkResponseCode(t, http.StatusUnauthorized, rr)
11414+
1140211415
_, err = getJWTAPIUserTokenFromTestServer(defaultUsername, defaultPassword)
1140311416
assert.Error(t, err)
1140411417
token, err = getJWTAPIUserTokenFromTestServer(defaultUsername, altAdminPassword)
@@ -11548,6 +11561,12 @@ func TestChangeAdminPwdMock(t *testing.T) {
1154811561
setBearerForReq(req, altToken)
1154911562
rr = executeRequest(req)
1155011563
checkResponseCode(t, http.StatusOK, rr)
11564+
// try using the old token
11565+
req, err = http.NewRequest(http.MethodGet, versionPath, nil)
11566+
assert.NoError(t, err)
11567+
setBearerForReq(req, altToken)
11568+
rr = executeRequest(req)
11569+
checkResponseCode(t, http.StatusUnauthorized, rr)
1155111570

1155211571
_, err = getJWTAPITokenFromTestServer(altAdminUsername, altAdminPassword)
1155311572
assert.Error(t, err)
@@ -13599,6 +13618,13 @@ func TestWebClientChangePwd(t *testing.T) {
1359913618
checkResponseCode(t, http.StatusFound, rr)
1360013619
assert.Equal(t, webClientLoginPath, rr.Header().Get("Location"))
1360113620

13621+
req, err = http.NewRequest(http.MethodGet, webClientPingPath, nil)
13622+
assert.NoError(t, err)
13623+
req.RemoteAddr = defaultRemoteAddr
13624+
setJWTCookieForReq(req, webToken)
13625+
rr = executeRequest(req)
13626+
checkResponseCode(t, http.StatusFound, rr)
13627+
1360213628
_, err = getJWTWebClientTokenFromTestServer(defaultUsername, defaultPassword)
1360313629
assert.Error(t, err)
1360413630
_, err = getJWTWebClientTokenFromTestServer(defaultUsername+"1", defaultPassword+"1")
@@ -18850,6 +18876,12 @@ func TestWebAdminLoginMock(t *testing.T) {
1885018876
cookie := rr.Header().Get("Cookie")
1885118877
assert.Empty(t, cookie)
1885218878

18879+
req, _ = http.NewRequest(http.MethodGet, webStatusPath, nil)
18880+
req.RemoteAddr = defaultRemoteAddr
18881+
setJWTCookieForReq(req, webToken)
18882+
rr = executeRequest(req)
18883+
checkResponseCode(t, http.StatusFound, rr)
18884+
1885318885
req, _ = http.NewRequest(http.MethodGet, logoutPath, nil)
1885418886
setBearerForReq(req, apiToken)
1885518887
rr = executeRequest(req)

internal/httpd/server.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ func (s *httpdServer) listenAndServe() error {
120120
httpServer.TLSConfig = config
121121
logger.Debug(logSender, "", "configured TLS cipher suites for binding %q: %v, certID: %v",
122122
s.binding.GetAddress(), httpServer.TLSConfig.CipherSuites, certID)
123-
if s.binding.ClientAuthType == 1 {
123+
if s.binding.isMutualTLSEnabled() {
124124
httpServer.TLSConfig.ClientCAs = certMgr.GetRootCAs()
125125
httpServer.TLSConfig.ClientAuth = tls.RequireAndVerifyClientCert
126126
httpServer.TLSConfig.VerifyConnection = s.verifyTLSConnection

0 commit comments

Comments
 (0)