@@ -30,3 +30,119 @@ func Test_extractZip(t *testing.T) {
3030 _ , err = os .Stat (filepath .Join ("src" , "main.go" ))
3131 require .NoError (t , err )
3232}
33+
34+ func Test_filepathDescendsFrom (t * testing.T ) {
35+ type args struct {
36+ p string
37+ dir string
38+ }
39+ tests := []struct {
40+ name string
41+ args args
42+ want bool
43+ }{
44+ {
45+ name : "root child" ,
46+ args : args {
47+ p : filepath .FromSlash ("/hoi.txt" ),
48+ dir : filepath .FromSlash ("/" ),
49+ },
50+ want : true ,
51+ },
52+ {
53+ name : "abs descendant" ,
54+ args : args {
55+ p : filepath .FromSlash ("/var/logs/hoi.txt" ),
56+ dir : filepath .FromSlash ("/" ),
57+ },
58+ want : true ,
59+ },
60+ {
61+ name : "abs trailing slash" ,
62+ args : args {
63+ p : filepath .FromSlash ("/var/logs/hoi.txt" ),
64+ dir : filepath .FromSlash ("/var/logs/" ),
65+ },
66+ want : true ,
67+ },
68+ {
69+ name : "abs mismatch" ,
70+ args : args {
71+ p : filepath .FromSlash ("/var/logs/hoi.txt" ),
72+ dir : filepath .FromSlash ("/var/pids" ),
73+ },
74+ want : false ,
75+ },
76+ {
77+ name : "abs partial prefix" ,
78+ args : args {
79+ p : filepath .FromSlash ("/var/logs/hoi.txt" ),
80+ dir : filepath .FromSlash ("/var/log" ),
81+ },
82+ want : false ,
83+ },
84+ {
85+ name : "rel child" ,
86+ args : args {
87+ p : filepath .FromSlash ("hoi.txt" ),
88+ dir : filepath .FromSlash ("." ),
89+ },
90+ want : true ,
91+ },
92+ {
93+ name : "rel descendant" ,
94+ args : args {
95+ p : filepath .FromSlash ("./log/hoi.txt" ),
96+ dir : filepath .FromSlash ("." ),
97+ },
98+ want : true ,
99+ },
100+ {
101+ name : "mixed rel styles" ,
102+ args : args {
103+ p : filepath .FromSlash ("./log/hoi.txt" ),
104+ dir : filepath .FromSlash ("log" ),
105+ },
106+ want : true ,
107+ },
108+ {
109+ name : "rel clean" ,
110+ args : args {
111+ p : filepath .FromSlash ("cats/../dogs/pug.txt" ),
112+ dir : filepath .FromSlash ("dogs" ),
113+ },
114+ want : true ,
115+ },
116+ {
117+ name : "rel mismatch" ,
118+ args : args {
119+ p : filepath .FromSlash ("dogs/pug.txt" ),
120+ dir : filepath .FromSlash ("dog" ),
121+ },
122+ want : false ,
123+ },
124+ {
125+ name : "rel breakout" ,
126+ args : args {
127+ p : filepath .FromSlash ("../escape.txt" ),
128+ dir : filepath .FromSlash ("." ),
129+ },
130+ want : false ,
131+ },
132+ {
133+ name : "rel sneaky breakout" ,
134+ args : args {
135+ p : filepath .FromSlash ("dogs/../../escape.txt" ),
136+ dir : filepath .FromSlash ("dogs" ),
137+ },
138+ want : false ,
139+ },
140+ }
141+ for _ , tt := range tests {
142+ t .Run (tt .name , func (t * testing.T ) {
143+ if got := filepathDescendsFrom (tt .args .p , tt .args .dir ); got != tt .want {
144+ t .Errorf ("filepathDescendsFrom() = %v, want %v" , got , tt .want )
145+ }
146+ })
147+ }
148+ }
0 commit comments