@@ -65,8 +65,8 @@ class HttpToolkitServer extends Command {
65
65
path . join ( dataDir , 'client' ) ;
66
66
67
67
// Be careful - if the server path isn't clearly ours somehow, ignore it.
68
- if ( ! serverUpdatesPath . split ( path . sep ) . includes ( 'httptoolkit-server' ) ) {
69
- reportError ( `Unexpected server path (${ serverUpdatesPath } ), ignoring` ) ;
68
+ if ( ! isOwnedPath ( serverUpdatesPath ) ) {
69
+ reportError ( `Unexpected server updates path (${ serverUpdatesPath } ), ignoring` ) ;
70
70
return ;
71
71
}
72
72
@@ -114,6 +114,7 @@ class HttpToolkitServer extends Command {
114
114
}
115
115
}
116
116
117
+ // Delete a folder recursively, with checks to ensure its safe to do so at every stage
117
118
async function deleteFolder ( folder : string ) {
118
119
const contents : string [ ] = await fs . readdir ( folder )
119
120
. catch ( ( e ) => {
@@ -125,14 +126,25 @@ async function deleteFolder(folder: string) {
125
126
contents . map ( async ( filename ) => {
126
127
const filePath = path . join ( folder , filename ) ;
127
128
if ( ( await fs . lstat ( filePath ) ) . isDirectory ( ) ) {
128
- await deleteFolder ( filePath ) ;
129
- } else {
129
+ await deleteFolder ( filePath ) ; // Recurse
130
+ } else if ( isOwnedPath ( filePath ) ) {
130
131
await fs . unlink ( filePath ) ;
131
132
}
132
133
} )
133
134
) ;
134
135
135
- await fs . rmdir ( folder ) ;
136
+ if ( isOwnedPath ( folder ) ) await fs . rmdir ( folder ) ;
136
137
} ;
137
138
139
+ // Before deleting anything anywhere, we check it's an HTK-related path.
140
+ // Not a perfect check, but good safety against somehow deleting / or similar.
141
+ function isOwnedPath ( input : string ) {
142
+ if ( input . split ( path . sep ) . includes ( 'httptoolkit-server' ) ) {
143
+ return true ;
144
+ } else {
145
+ reportError ( `Unexpected unowned path ${ input } ` ) ;
146
+ return false ;
147
+ }
148
+ }
149
+
138
150
export = HttpToolkitServer ;
0 commit comments