@@ -2,12 +2,15 @@ package home
22
33import (
44 "encoding/binary"
5+ "io/fs"
56 "net/http"
67 "net/http/httptest"
78 "os"
9+ "path/filepath"
810 "testing"
911 "time"
1012
13+ "github.com/AdguardTeam/golibs/testutil"
1114 "github.com/AdguardTeam/golibs/timeutil"
1215 "github.com/stretchr/testify/assert"
1316 "github.com/stretchr/testify/require"
@@ -20,25 +23,42 @@ func TestAuthMiddlewareGLiNet(t *testing.T) {
2023 testTTL = 60 * time .Second
2124
2225 glTokenFileSuffix = "test"
26+
27+ testPerm fs.FileMode = 0o644
2328 )
2429
2530 tempDir := t .TempDir ()
26- glFilePrefix = tempDir + "/gl_token_"
27- glTokenFile := glFilePrefix + glTokenFileSuffix
31+ glTokenFolder := filepath .Join (tempDir , "foo" )
32+ err := os .MkdirAll (glTokenFolder , 0o755 )
33+ require .NoError (t , err )
34+
35+ tokenFileRoot , err := os .OpenRoot (glTokenFolder )
36+ require .NoError (t , err )
37+ testutil .CleanupAndRequireSuccess (t , tokenFileRoot .Close )
38+
39+ err = os .MkdirAll (filepath .Join (glTokenFolder , glFilePrefix ), testPerm )
40+ require .NoError (t , err )
41+
42+ glTokenFile := filepath .Join (glTokenFolder , glFilePrefix + glTokenFileSuffix )
2843
2944 glFileData := make ([]byte , 4 )
3045 binary .NativeEndian .PutUint32 (glFileData , uint32 (time .Now ().Add (testTTL ).Unix ()))
3146
32- err := os .WriteFile (glTokenFile , glFileData , 0o644 )
47+ err = os .WriteFile (glTokenFile , glFileData , testPerm )
48+ require .NoError (t , err )
49+
50+ // Mock token file for testing path traversal vulnerability. See AG-54304.
51+ passwdFile := filepath .Join (tempDir , "path_traversal_token" )
52+ err = os .WriteFile (passwdFile , glFileData , testPerm )
3353 require .NoError (t , err )
3454
3555 mw := newAuthMiddlewareGLiNet (& authMiddlewareGLiNetConfig {
36- logger : testLogger ,
37- mux : http .NewServeMux (),
38- clock : timeutil.SystemClock {},
39- tokenFilePrefix : glFilePrefix ,
40- maxTokenSize : MaxFileSize ,
41- ttl : testTTL ,
56+ logger : testLogger ,
57+ mux : http .NewServeMux (),
58+ clock : timeutil.SystemClock {},
59+ tokenFileRoot : tokenFileRoot ,
60+ maxTokenSize : MaxFileSize ,
61+ ttl : testTTL ,
4262 })
4363
4464 h := & testAuthHandler {}
@@ -50,6 +70,12 @@ func TestAuthMiddlewareGLiNet(t *testing.T) {
5070 reqInvalidCookie := httptest .NewRequest (http .MethodGet , "/" , nil )
5171 reqInvalidCookie .AddCookie (& http.Cookie {Name : glCookieName , Value : "invalid_cookie" })
5272
73+ reqPathTraversalToken := httptest .NewRequest (http .MethodGet , "/" , nil )
74+ reqPathTraversalToken .AddCookie (& http.Cookie {
75+ Name : glCookieName ,
76+ Value : "/../../path_traversal_token" ,
77+ })
78+
5379 testCases := []struct {
5480 req * http.Request
5581 name string
@@ -66,6 +92,10 @@ func TestAuthMiddlewareGLiNet(t *testing.T) {
6692 req : reqInvalidCookie ,
6793 name : "invalid_cookie" ,
6894 wantCode : http .StatusFound ,
95+ }, {
96+ req : reqPathTraversalToken ,
97+ name : "path_traversal_token" ,
98+ wantCode : http .StatusFound ,
6999 }}
70100
71101 for _ , tc := range testCases {
0 commit comments