Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/openjdk-multiarch-jdk8u
Path: blob/aarch64-shenandoah-jdk8u272-b10/jdk/test/java/nio/file/Files/CheckPermissions.java
38828 views
1
/*
2
* Copyright (c) 2009, 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 6866804 7006126 8028270
26
* @summary Unit test for java.nio.file.Files
27
* @library ..
28
* @build CheckPermissions
29
* @run main/othervm CheckPermissions
30
*/
31
32
import java.nio.ByteBuffer;
33
import java.nio.file.*;
34
import static java.nio.file.Files.*;
35
import static java.nio.file.StandardOpenOption.*;
36
import java.nio.file.attribute.*;
37
import java.nio.channels.SeekableByteChannel;
38
import java.security.Permission;
39
import java.io.*;
40
import java.util.*;
41
42
/**
43
* Checks each method that accesses the file system does the right permission
44
* check when there is a security manager set.
45
*/
46
47
public class CheckPermissions {
48
49
static class Checks {
50
private List<Permission> permissionsChecked = new ArrayList<>();
51
private Set<String> propertiesChecked = new HashSet<>();
52
private List<String> readsChecked = new ArrayList<>();
53
private List<String> writesChecked = new ArrayList<>();
54
private List<String> deletesChecked = new ArrayList<>();
55
private List<String> execsChecked = new ArrayList<>();
56
57
List<Permission> permissionsChecked() { return permissionsChecked; }
58
Set<String> propertiesChecked() { return propertiesChecked; }
59
List<String> readsChecked() { return readsChecked; }
60
List<String> writesChecked() { return writesChecked; }
61
List<String> deletesChecked() { return deletesChecked; }
62
List<String> execsChecked() { return execsChecked; }
63
}
64
65
static ThreadLocal<Checks> myChecks =
66
new ThreadLocal<Checks>() {
67
@Override protected Checks initialValue() {
68
return null;
69
}
70
};
71
72
static void prepare() {
73
myChecks.set(new Checks());
74
}
75
76
static void assertCheckPermission(Permission expected) {
77
if (!myChecks.get().permissionsChecked().contains(expected))
78
throw new RuntimeException(expected + " not checked");
79
}
80
81
static void assertCheckPropertyAccess(String key) {
82
if (!myChecks.get().propertiesChecked().contains(key))
83
throw new RuntimeException("Property " + key + " not checked");
84
}
85
86
static void assertChecked(Path file, List<String> list) {
87
String s = file.toString();
88
for (String f: list) {
89
if (f.endsWith(s))
90
return;
91
}
92
throw new RuntimeException("Access not checked");
93
}
94
95
static void assertCheckRead(Path file) {
96
assertChecked(file, myChecks.get().readsChecked());
97
}
98
99
static void assertCheckWrite(Path file) {
100
assertChecked(file, myChecks.get().writesChecked());
101
}
102
103
static void assertCheckWriteToDirectory(Path dir) {
104
String s = dir.toString();
105
List<String> list = myChecks.get().writesChecked();
106
for (String f: list) {
107
if (f.startsWith(s)) {
108
return;
109
}
110
}
111
throw new RuntimeException("Access not checked");
112
}
113
114
static void assertCheckDelete(Path file) {
115
assertChecked(file, myChecks.get().deletesChecked());
116
}
117
118
static void assertCheckExec(Path file) {
119
assertChecked(file, myChecks.get().execsChecked());
120
}
121
122
static class LoggingSecurityManager extends SecurityManager {
123
static void install() {
124
System.setSecurityManager(new LoggingSecurityManager());
125
}
126
127
@Override
128
public void checkPermission(Permission perm) {
129
Checks checks = myChecks.get();
130
if (checks != null)
131
checks.permissionsChecked().add(perm);
132
}
133
134
@Override
135
public void checkPropertyAccess(String key) {
136
Checks checks = myChecks.get();
137
if (checks != null)
138
checks.propertiesChecked().add(key);
139
}
140
141
@Override
142
public void checkRead(String file) {
143
Checks checks = myChecks.get();
144
if (checks != null)
145
checks.readsChecked().add(file);
146
}
147
148
@Override
149
public void checkWrite(String file) {
150
Checks checks = myChecks.get();
151
if (checks != null)
152
checks.writesChecked().add(file);
153
}
154
155
@Override
156
public void checkDelete(String file) {
157
Checks checks = myChecks.get();
158
if (checks != null)
159
checks.deletesChecked().add(file);
160
}
161
162
@Override
163
public void checkExec(String file) {
164
Checks checks = myChecks.get();
165
if (checks != null)
166
checks.execsChecked().add(file);
167
}
168
}
169
170
static void testBasicFileAttributeView(BasicFileAttributeView view, Path file)
171
throws IOException
172
{
173
prepare();
174
view.readAttributes();
175
assertCheckRead(file);
176
177
prepare();
178
FileTime now = FileTime.fromMillis(System.currentTimeMillis());
179
view.setTimes(null, now, now);
180
assertCheckWrite(file);
181
}
182
183
static void testPosixFileAttributeView(PosixFileAttributeView view, Path file)
184
throws IOException
185
{
186
prepare();
187
PosixFileAttributes attrs = view.readAttributes();
188
assertCheckRead(file);
189
assertCheckPermission(new RuntimePermission("accessUserInformation"));
190
191
prepare();
192
view.setPermissions(attrs.permissions());
193
assertCheckWrite(file);
194
assertCheckPermission(new RuntimePermission("accessUserInformation"));
195
196
prepare();
197
view.setOwner(attrs.owner());
198
assertCheckWrite(file);
199
assertCheckPermission(new RuntimePermission("accessUserInformation"));
200
201
prepare();
202
view.setOwner(attrs.owner());
203
assertCheckWrite(file);
204
assertCheckPermission(new RuntimePermission("accessUserInformation"));
205
}
206
207
public static void main(String[] args) throws IOException {
208
final Path testdir = Paths.get(System.getProperty("test.dir", ".")).toAbsolutePath();
209
final Path tmpdir = Paths.get(System.getProperty("java.io.tmpdir"));
210
211
Path file = createFile(testdir.resolve("file1234"));
212
try {
213
LoggingSecurityManager.install();
214
215
// -- check access --
216
217
prepare();
218
exists(file);
219
assertCheckRead(file);
220
221
prepare();
222
isReadable(file);
223
assertCheckRead(file);
224
225
prepare();
226
isWritable(file);
227
assertCheckWrite(file);
228
229
prepare();
230
isExecutable(file);
231
assertCheckExec(file);
232
233
// -- copy --
234
235
Path target = testdir.resolve("target1234");
236
prepare();
237
copy(file, target);
238
try {
239
assertCheckRead(file);
240
assertCheckWrite(target);
241
} finally {
242
delete(target);
243
}
244
245
if (TestUtil.supportsLinks(testdir)) {
246
Path link = testdir.resolve("link1234");
247
createSymbolicLink(link, file);
248
try {
249
prepare();
250
copy(link, target, LinkOption.NOFOLLOW_LINKS);
251
try {
252
assertCheckRead(link);
253
assertCheckWrite(target);
254
assertCheckPermission(new LinkPermission("symbolic"));
255
} finally {
256
delete(target);
257
}
258
259
prepare();
260
readSymbolicLink(link);
261
assertCheckPermission(new FilePermission(link.toString(), "readlink"));
262
} finally {
263
delete(link);
264
}
265
}
266
267
// -- createDirectory --
268
269
Path subdir = testdir.resolve("subdir1234");
270
prepare();
271
createDirectory(subdir);
272
try {
273
assertCheckWrite(subdir);
274
} finally {
275
delete(subdir);
276
}
277
278
// -- createFile --
279
280
Path fileToCreate = testdir.resolve("file7890");
281
prepare();
282
createFile(fileToCreate);
283
try {
284
assertCheckWrite(fileToCreate);
285
} finally {
286
delete(fileToCreate);
287
}
288
289
// -- createSymbolicLink --
290
291
if (TestUtil.supportsLinks(testdir)) {
292
prepare();
293
Path link = testdir.resolve("link1234");
294
createSymbolicLink(link, file);
295
try {
296
assertCheckWrite(link);
297
assertCheckPermission(new LinkPermission("symbolic"));
298
} finally {
299
delete(link);
300
}
301
}
302
303
// -- createLink --
304
305
if (TestUtil.supportsLinks(testdir)) {
306
prepare();
307
Path link = testdir.resolve("entry234");
308
createLink(link, file);
309
try {
310
assertCheckWrite(link);
311
assertCheckPermission(new LinkPermission("hard"));
312
} finally {
313
delete(link);
314
}
315
}
316
317
// -- createTempFile --
318
319
prepare();
320
Path tmpfile1 = createTempFile("foo", null);
321
try {
322
assertCheckWriteToDirectory(tmpdir);
323
} finally {
324
delete(tmpfile1);
325
}
326
prepare();
327
Path tmpfile2 = createTempFile(testdir, "foo", ".tmp");
328
try {
329
assertCheckWriteToDirectory(testdir);
330
} finally {
331
delete(tmpfile2);
332
}
333
334
// -- createTempDirectory --
335
336
prepare();
337
Path tmpdir1 = createTempDirectory("foo");
338
try {
339
assertCheckWriteToDirectory(tmpdir);
340
} finally {
341
delete(tmpdir1);
342
}
343
prepare();
344
Path tmpdir2 = createTempDirectory(testdir, "foo");
345
try {
346
assertCheckWriteToDirectory(testdir);
347
} finally {
348
delete(tmpdir2);
349
}
350
351
// -- delete/deleteIfExists --
352
353
Path fileToDelete = testdir.resolve("file7890");
354
355
createFile(fileToDelete);
356
prepare();
357
delete(fileToDelete);
358
assertCheckDelete(fileToDelete);
359
360
createFile(fileToDelete);
361
prepare();
362
deleteIfExists(fileToDelete); // file exists
363
assertCheckDelete(fileToDelete);
364
365
prepare();
366
deleteIfExists(fileToDelete); // file does not exist
367
assertCheckDelete(fileToDelete);
368
369
// -- exists/notExists --
370
371
prepare();
372
exists(file);
373
assertCheckRead(file);
374
375
prepare();
376
notExists(file);
377
assertCheckRead(file);
378
379
// -- getFileStore --
380
381
prepare();
382
getFileStore(file);
383
assertCheckRead(file);
384
assertCheckPermission(new RuntimePermission("getFileStoreAttributes"));
385
386
// -- isSameFile --
387
388
prepare();
389
isSameFile(file, testdir);
390
assertCheckRead(file);
391
assertCheckRead(testdir);
392
393
// -- move --
394
395
Path target2 = testdir.resolve("target1234");
396
prepare();
397
move(file, target2);
398
try {
399
assertCheckWrite(file);
400
assertCheckWrite(target2);
401
} finally {
402
// restore file
403
move(target2, file);
404
}
405
406
// -- newByteChannel --
407
408
prepare();
409
try (SeekableByteChannel sbc = newByteChannel(file)) {
410
assertCheckRead(file);
411
}
412
prepare();
413
try (SeekableByteChannel sbc = newByteChannel(file, WRITE)) {
414
assertCheckWrite(file);
415
}
416
prepare();
417
try (SeekableByteChannel sbc = newByteChannel(file, READ, WRITE)) {
418
assertCheckRead(file);
419
assertCheckWrite(file);
420
}
421
422
prepare();
423
try (SeekableByteChannel sbc = newByteChannel(file, DELETE_ON_CLOSE)) {
424
assertCheckRead(file);
425
assertCheckDelete(file);
426
}
427
createFile(file); // restore file
428
429
430
// -- newInputStream/newOutptuStream --
431
432
prepare();
433
try (InputStream in = newInputStream(file)) {
434
assertCheckRead(file);
435
}
436
prepare();
437
try (OutputStream out = newOutputStream(file)) {
438
assertCheckWrite(file);
439
}
440
441
// -- newDirectoryStream --
442
443
prepare();
444
try (DirectoryStream<Path> stream = newDirectoryStream(testdir)) {
445
assertCheckRead(testdir);
446
447
if (stream instanceof SecureDirectoryStream<?>) {
448
Path entry;
449
SecureDirectoryStream<Path> sds =
450
(SecureDirectoryStream<Path>)stream;
451
452
// newByteChannel
453
entry = file.getFileName();
454
prepare();
455
try (SeekableByteChannel sbc = sds.newByteChannel(entry, EnumSet.of(READ))) {
456
assertCheckRead(file);
457
}
458
prepare();
459
try (SeekableByteChannel sbc = sds.newByteChannel(entry, EnumSet.of(WRITE))) {
460
assertCheckWrite(file);
461
}
462
463
// deleteFile
464
entry = file.getFileName();
465
prepare();
466
sds.deleteFile(entry);
467
assertCheckDelete(file);
468
createFile(testdir.resolve(entry)); // restore file
469
470
// deleteDirectory
471
entry = Paths.get("subdir1234");
472
createDirectory(testdir.resolve(entry));
473
prepare();
474
sds.deleteDirectory(entry);
475
assertCheckDelete(testdir.resolve(entry));
476
477
// move
478
entry = Paths.get("tempname1234");
479
prepare();
480
sds.move(file.getFileName(), sds, entry);
481
assertCheckWrite(file);
482
assertCheckWrite(testdir.resolve(entry));
483
sds.move(entry, sds, file.getFileName()); // restore file
484
485
// newDirectoryStream
486
entry = Paths.get("subdir1234");
487
createDirectory(testdir.resolve(entry));
488
try {
489
prepare();
490
sds.newDirectoryStream(entry).close();
491
assertCheckRead(testdir.resolve(entry));
492
} finally {
493
delete(testdir.resolve(entry));
494
}
495
496
// getFileAttributeView to access attributes of directory
497
testBasicFileAttributeView(sds
498
.getFileAttributeView(BasicFileAttributeView.class), testdir);
499
testPosixFileAttributeView(sds
500
.getFileAttributeView(PosixFileAttributeView.class), testdir);
501
502
// getFileAttributeView to access attributes of entry
503
entry = file.getFileName();
504
testBasicFileAttributeView(sds
505
.getFileAttributeView(entry, BasicFileAttributeView.class), file);
506
testPosixFileAttributeView(sds
507
.getFileAttributeView(entry, PosixFileAttributeView.class), file);
508
509
} else {
510
System.out.println("SecureDirectoryStream not tested");
511
}
512
}
513
514
// -- toAbsolutePath --
515
516
prepare();
517
file.getFileName().toAbsolutePath();
518
assertCheckPropertyAccess("user.dir");
519
520
// -- toRealPath --
521
522
prepare();
523
file.toRealPath();
524
assertCheckRead(file);
525
526
prepare();
527
file.toRealPath(LinkOption.NOFOLLOW_LINKS);
528
assertCheckRead(file);
529
530
prepare();
531
Paths.get(".").toRealPath();
532
assertCheckPropertyAccess("user.dir");
533
534
prepare();
535
Paths.get(".").toRealPath(LinkOption.NOFOLLOW_LINKS);
536
assertCheckPropertyAccess("user.dir");
537
538
// -- register --
539
540
try (WatchService watcher = FileSystems.getDefault().newWatchService()) {
541
prepare();
542
testdir.register(watcher, StandardWatchEventKinds.ENTRY_DELETE);
543
assertCheckRead(testdir);
544
}
545
546
// -- getAttribute/setAttribute/readAttributes --
547
548
prepare();
549
getAttribute(file, "size");
550
assertCheckRead(file);
551
552
prepare();
553
setAttribute(file, "lastModifiedTime",
554
FileTime.fromMillis(System.currentTimeMillis()));
555
assertCheckWrite(file);
556
557
prepare();
558
readAttributes(file, "*");
559
assertCheckRead(file);
560
561
// -- BasicFileAttributeView --
562
testBasicFileAttributeView(
563
getFileAttributeView(file, BasicFileAttributeView.class), file);
564
565
// -- PosixFileAttributeView --
566
567
{
568
PosixFileAttributeView view =
569
getFileAttributeView(file, PosixFileAttributeView.class);
570
if (view != null &&
571
getFileStore(file).supportsFileAttributeView(PosixFileAttributeView.class))
572
{
573
testPosixFileAttributeView(view, file);
574
} else {
575
System.out.println("PosixFileAttributeView not tested");
576
}
577
}
578
579
// -- DosFileAttributeView --
580
581
{
582
DosFileAttributeView view =
583
getFileAttributeView(file, DosFileAttributeView.class);
584
if (view != null &&
585
getFileStore(file).supportsFileAttributeView(DosFileAttributeView.class))
586
{
587
prepare();
588
view.readAttributes();
589
assertCheckRead(file);
590
591
prepare();
592
view.setArchive(false);
593
assertCheckWrite(file);
594
595
prepare();
596
view.setHidden(false);
597
assertCheckWrite(file);
598
599
prepare();
600
view.setReadOnly(false);
601
assertCheckWrite(file);
602
603
prepare();
604
view.setSystem(false);
605
assertCheckWrite(file);
606
} else {
607
System.out.println("DosFileAttributeView not tested");
608
}
609
}
610
611
// -- FileOwnerAttributeView --
612
613
{
614
FileOwnerAttributeView view =
615
getFileAttributeView(file, FileOwnerAttributeView.class);
616
if (view != null &&
617
getFileStore(file).supportsFileAttributeView(FileOwnerAttributeView.class))
618
{
619
prepare();
620
UserPrincipal owner = view.getOwner();
621
assertCheckRead(file);
622
assertCheckPermission(new RuntimePermission("accessUserInformation"));
623
624
prepare();
625
view.setOwner(owner);
626
assertCheckWrite(file);
627
assertCheckPermission(new RuntimePermission("accessUserInformation"));
628
629
} else {
630
System.out.println("FileOwnerAttributeView not tested");
631
}
632
}
633
634
// -- UserDefinedFileAttributeView --
635
636
{
637
UserDefinedFileAttributeView view =
638
getFileAttributeView(file, UserDefinedFileAttributeView.class);
639
if (view != null &&
640
getFileStore(file).supportsFileAttributeView(UserDefinedFileAttributeView.class))
641
{
642
prepare();
643
view.write("test", ByteBuffer.wrap(new byte[100]));
644
assertCheckWrite(file);
645
assertCheckPermission(new RuntimePermission("accessUserDefinedAttributes"));
646
647
prepare();
648
view.read("test", ByteBuffer.allocate(100));
649
assertCheckRead(file);
650
assertCheckPermission(new RuntimePermission("accessUserDefinedAttributes"));
651
652
prepare();
653
view.size("test");
654
assertCheckRead(file);
655
assertCheckPermission(new RuntimePermission("accessUserDefinedAttributes"));
656
657
prepare();
658
view.list();
659
assertCheckRead(file);
660
assertCheckPermission(new RuntimePermission("accessUserDefinedAttributes"));
661
662
prepare();
663
view.delete("test");
664
assertCheckWrite(file);
665
assertCheckPermission(new RuntimePermission("accessUserDefinedAttributes"));
666
} else {
667
System.out.println("UserDefinedFileAttributeView not tested");
668
}
669
}
670
671
// -- AclFileAttributeView --
672
{
673
AclFileAttributeView view =
674
getFileAttributeView(file, AclFileAttributeView.class);
675
if (view != null &&
676
getFileStore(file).supportsFileAttributeView(AclFileAttributeView.class))
677
{
678
prepare();
679
List<AclEntry> acl = view.getAcl();
680
assertCheckRead(file);
681
assertCheckPermission(new RuntimePermission("accessUserInformation"));
682
prepare();
683
view.setAcl(acl);
684
assertCheckWrite(file);
685
assertCheckPermission(new RuntimePermission("accessUserInformation"));
686
} else {
687
System.out.println("AclFileAttributeView not tested");
688
}
689
}
690
691
// -- UserPrincipalLookupService
692
693
UserPrincipalLookupService lookupService =
694
FileSystems.getDefault().getUserPrincipalLookupService();
695
UserPrincipal owner = getOwner(file);
696
697
prepare();
698
lookupService.lookupPrincipalByName(owner.getName());
699
assertCheckPermission(new RuntimePermission("lookupUserInformation"));
700
701
try {
702
UserPrincipal group = readAttributes(file, PosixFileAttributes.class).group();
703
prepare();
704
lookupService.lookupPrincipalByGroupName(group.getName());
705
assertCheckPermission(new RuntimePermission("lookupUserInformation"));
706
} catch (UnsupportedOperationException ignore) {
707
System.out.println("lookupPrincipalByGroupName not tested");
708
}
709
710
711
} finally {
712
deleteIfExists(file);
713
}
714
}
715
}
716
717