Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/mobile
Path: blob/master/test/jdk/java/io/File/CheckPermission.java
41149 views
1
/*
2
* Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
3
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4
*
5
* This code is free software; you can redistribute it and/or modify it
6
* under the terms of the GNU General Public License version 2 only, as
7
* published by the Free Software Foundation.
8
*
9
* This code is distributed in the hope that it will be useful, but WITHOUT
10
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12
* version 2 for more details (a copy is included in the LICENSE file that
13
* accompanied this code).
14
*
15
* You should have received a copy of the GNU General Public License version
16
* 2 along with this work; if not, write to the Free Software Foundation,
17
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18
*
19
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20
* or visit www.oracle.com if you need additional information or have any
21
* questions.
22
*/
23
24
/* @test
25
* @bug 8017212
26
* @summary Examine methods in File.java that access the file system do the
27
* right permission check when a security manager exists.
28
* @run main/othervm -Djava.security.manager=allow CheckPermission
29
* @author Dan Xu
30
*/
31
32
import java.io.File;
33
import java.io.FilenameFilter;
34
import java.io.FileFilter;
35
import java.io.IOException;
36
import java.security.Permission;
37
import java.util.ArrayList;
38
import java.util.EnumMap;
39
import java.util.EnumSet;
40
import java.util.HashSet;
41
import java.util.List;
42
import java.util.Map;
43
import java.util.Set;
44
45
public class CheckPermission {
46
47
private static final String CHECK_PERMISSION_TEST = "CheckPermissionTest";
48
49
public enum FileOperation {
50
READ, WRITE, DELETE, EXEC
51
}
52
53
static class Checks {
54
private List<Permission> permissionsChecked = new ArrayList<>();
55
private Set<String> propertiesChecked = new HashSet<>();
56
57
private Map<FileOperation, List<String>> fileOperationChecked =
58
new EnumMap<>(FileOperation.class);
59
60
List<Permission> permissionsChecked() {
61
return permissionsChecked;
62
}
63
64
Set<String> propertiesChecked() {
65
return propertiesChecked;
66
}
67
68
List<String> fileOperationChecked(FileOperation op) {
69
return fileOperationChecked.get(op);
70
}
71
72
void addFileOperation(FileOperation op, String file) {
73
List<String> opList = fileOperationChecked.get(op);
74
if (opList == null) {
75
opList = new ArrayList<>();
76
fileOperationChecked.put(op, opList);
77
}
78
opList.add(file);
79
}
80
}
81
82
static ThreadLocal<Checks> myChecks = new ThreadLocal<>();
83
84
static void prepare() {
85
myChecks.set(new Checks());
86
}
87
88
static class LoggingSecurityManager extends SecurityManager {
89
static void install() {
90
System.setSecurityManager(new LoggingSecurityManager());
91
}
92
93
private void checkFileOperation(FileOperation op, String file) {
94
Checks checks = myChecks.get();
95
if (checks != null)
96
checks.addFileOperation(op, file);
97
}
98
99
@Override
100
public void checkRead(String file) {
101
checkFileOperation(FileOperation.READ, file);
102
}
103
104
@Override
105
public void checkWrite(String file) {
106
checkFileOperation(FileOperation.WRITE, file);
107
}
108
109
@Override
110
public void checkDelete(String file) {
111
checkFileOperation(FileOperation.DELETE, file);
112
}
113
114
@Override
115
public void checkExec(String file) {
116
checkFileOperation(FileOperation.EXEC, file);
117
}
118
119
@Override
120
public void checkPermission(Permission perm) {
121
Checks checks = myChecks.get();
122
if (checks != null)
123
checks.permissionsChecked().add(perm);
124
}
125
126
@Override
127
public void checkPropertyAccess(String key) {
128
Checks checks = myChecks.get();
129
if (checks != null)
130
checks.propertiesChecked().add(key);
131
}
132
}
133
134
static void assertCheckPermission(Class<? extends Permission> type,
135
String name)
136
{
137
for (Permission perm : myChecks.get().permissionsChecked()) {
138
if (type.isInstance(perm) && perm.getName().equals(name))
139
return;
140
}
141
throw new RuntimeException(type.getName() + "(\"" + name
142
+ "\") not checked");
143
}
144
145
static void assertCheckPropertyAccess(String key) {
146
if (!myChecks.get().propertiesChecked().contains(key))
147
throw new RuntimeException("Property " + key + " not checked");
148
}
149
150
static void assertChecked(File file, List<String> list) {
151
if (list != null && !list.isEmpty()) {
152
for (String path : list) {
153
if (path.equals(file.getPath()))
154
return;
155
}
156
}
157
throw new RuntimeException("Access not checked");
158
}
159
160
static void assertNotChecked(File file, List<String> list) {
161
if (list != null && !list.isEmpty()) {
162
for (String path : list) {
163
if (path.equals(file.getPath()))
164
throw new RuntimeException("Access checked");
165
}
166
}
167
}
168
169
static void assertCheckOperation(File file, Set<FileOperation> ops) {
170
for (FileOperation op : ops)
171
assertChecked(file, myChecks.get().fileOperationChecked(op));
172
}
173
174
static void assertNotCheckOperation(File file, Set<FileOperation> ops) {
175
for (FileOperation op : ops)
176
assertNotChecked(file, myChecks.get().fileOperationChecked(op));
177
}
178
179
static void assertOnlyCheckOperation(File file,
180
EnumSet<FileOperation> ops)
181
{
182
assertCheckOperation(file, ops);
183
assertNotCheckOperation(file, EnumSet.complementOf(ops));
184
}
185
186
static File testFile, another;
187
188
static void setup() {
189
testFile = new File(CHECK_PERMISSION_TEST + System.currentTimeMillis());
190
if (testFile.exists()) {
191
testFile.delete();
192
}
193
194
another = new File(CHECK_PERMISSION_TEST + "Another"
195
+ System.currentTimeMillis());
196
if (another.exists()) {
197
another.delete();
198
}
199
200
LoggingSecurityManager.install();
201
}
202
203
public static void main(String[] args) throws IOException {
204
setup();
205
206
prepare();
207
testFile.canRead();
208
assertOnlyCheckOperation(testFile, EnumSet.of(FileOperation.READ));
209
210
prepare();
211
testFile.canWrite();
212
assertOnlyCheckOperation(testFile, EnumSet.of(FileOperation.WRITE));
213
214
prepare();
215
testFile.exists();
216
assertOnlyCheckOperation(testFile, EnumSet.of(FileOperation.READ));
217
218
prepare();
219
testFile.isDirectory();
220
assertOnlyCheckOperation(testFile, EnumSet.of(FileOperation.READ));
221
222
prepare();
223
testFile.isFile();
224
assertOnlyCheckOperation(testFile, EnumSet.of(FileOperation.READ));
225
226
prepare();
227
testFile.isHidden();
228
assertOnlyCheckOperation(testFile, EnumSet.of(FileOperation.READ));
229
230
prepare();
231
testFile.lastModified();
232
assertOnlyCheckOperation(testFile, EnumSet.of(FileOperation.READ));
233
234
prepare();
235
testFile.length();
236
assertOnlyCheckOperation(testFile, EnumSet.of(FileOperation.READ));
237
238
prepare();
239
testFile.createNewFile();
240
assertOnlyCheckOperation(testFile, EnumSet.of(FileOperation.WRITE));
241
242
prepare();
243
testFile.list();
244
assertOnlyCheckOperation(testFile, EnumSet.of(FileOperation.READ));
245
246
prepare();
247
testFile.list(new FilenameFilter() {
248
@Override
249
public boolean accept(File dir, String name) {
250
return false;
251
}
252
});
253
assertOnlyCheckOperation(testFile, EnumSet.of(FileOperation.READ));
254
255
prepare();
256
testFile.listFiles();
257
assertOnlyCheckOperation(testFile, EnumSet.of(FileOperation.READ));
258
259
prepare();
260
testFile.listFiles(new FilenameFilter() {
261
@Override
262
public boolean accept(File dir, String name) {
263
return false;
264
}
265
});
266
assertOnlyCheckOperation(testFile, EnumSet.of(FileOperation.READ));
267
268
prepare();
269
testFile.listFiles(new FileFilter() {
270
@Override
271
public boolean accept(File file) {
272
return false;
273
}
274
});
275
assertOnlyCheckOperation(testFile, EnumSet.of(FileOperation.READ));
276
277
prepare();
278
testFile.mkdir();
279
assertOnlyCheckOperation(testFile, EnumSet.of(FileOperation.WRITE));
280
281
if (testFile.exists()) {
282
prepare();
283
testFile.mkdirs();
284
assertOnlyCheckOperation(testFile, EnumSet.of(FileOperation.READ));
285
}
286
287
if (!another.exists()) {
288
prepare();
289
another.mkdirs();
290
assertOnlyCheckOperation(another,
291
EnumSet.of(FileOperation.READ, FileOperation.WRITE));
292
}
293
294
prepare();
295
another.delete();
296
assertOnlyCheckOperation(another, EnumSet.of(FileOperation.DELETE));
297
298
prepare();
299
boolean renRst = testFile.renameTo(another);
300
assertOnlyCheckOperation(testFile, EnumSet.of(FileOperation.WRITE));
301
assertOnlyCheckOperation(another, EnumSet.of(FileOperation.WRITE));
302
303
if (renRst) {
304
if (testFile.exists())
305
throw new RuntimeException(testFile + " is already renamed to "
306
+ another);
307
testFile = another;
308
}
309
310
prepare();
311
testFile.setLastModified(0);
312
assertOnlyCheckOperation(testFile, EnumSet.of(FileOperation.WRITE));
313
314
prepare();
315
testFile.setReadOnly();
316
assertOnlyCheckOperation(testFile, EnumSet.of(FileOperation.WRITE));
317
318
prepare();
319
testFile.setWritable(true, true);
320
assertOnlyCheckOperation(testFile, EnumSet.of(FileOperation.WRITE));
321
322
prepare();
323
testFile.setWritable(true);
324
assertOnlyCheckOperation(testFile, EnumSet.of(FileOperation.WRITE));
325
326
prepare();
327
testFile.setReadable(true, true);
328
assertOnlyCheckOperation(testFile, EnumSet.of(FileOperation.WRITE));
329
330
prepare();
331
testFile.setReadable(true);
332
assertOnlyCheckOperation(testFile, EnumSet.of(FileOperation.WRITE));
333
334
prepare();
335
testFile.setExecutable(true, true);
336
assertOnlyCheckOperation(testFile, EnumSet.of(FileOperation.WRITE));
337
338
prepare();
339
testFile.setExecutable(true);
340
assertOnlyCheckOperation(testFile, EnumSet.of(FileOperation.WRITE));
341
342
prepare();
343
testFile.canExecute();
344
assertOnlyCheckOperation(testFile, EnumSet.of(FileOperation.EXEC));
345
346
prepare();
347
testFile.getTotalSpace();
348
assertOnlyCheckOperation(testFile, EnumSet.of(FileOperation.READ));
349
assertCheckPermission(RuntimePermission.class,
350
"getFileSystemAttributes");
351
352
prepare();
353
testFile.getFreeSpace();
354
assertOnlyCheckOperation(testFile, EnumSet.of(FileOperation.READ));
355
assertCheckPermission(RuntimePermission.class,
356
"getFileSystemAttributes");
357
358
prepare();
359
testFile.getUsableSpace();
360
assertOnlyCheckOperation(testFile, EnumSet.of(FileOperation.READ));
361
assertCheckPermission(RuntimePermission.class,
362
"getFileSystemAttributes");
363
364
prepare();
365
File tmpFile = File.createTempFile(CHECK_PERMISSION_TEST, null);
366
assertOnlyCheckOperation(tmpFile, EnumSet.of(FileOperation.WRITE));
367
tmpFile.delete();
368
assertCheckOperation(tmpFile, EnumSet.of(FileOperation.DELETE));
369
370
prepare();
371
tmpFile = File.createTempFile(CHECK_PERMISSION_TEST, null, null);
372
assertOnlyCheckOperation(tmpFile, EnumSet.of(FileOperation.WRITE));
373
tmpFile.delete();
374
assertCheckOperation(tmpFile, EnumSet.of(FileOperation.DELETE));
375
376
prepare();
377
testFile.deleteOnExit();
378
assertOnlyCheckOperation(testFile, EnumSet.of(FileOperation.DELETE));
379
}
380
}
381
382