1
1
/*
2
- * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved.
2
+ * Copyright (c) 2023, 2024, Oracle and/or its affiliates. All rights reserved.
3
3
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4
4
*
5
5
* This code is free software; you can redistribute it and/or modify it
37
37
import java .nio .file .WatchKey ;
38
38
import java .nio .file .WatchService ;
39
39
import java .nio .file .attribute .PosixFilePermission ;
40
+ import java .security .AccessController ;
41
+ import java .security .PrivilegedAction ;
40
42
import java .util .Arrays ;
41
43
import java .util .HashSet ;
42
44
import java .util .LinkedHashSet ;
58
60
* The restore token allows the ScreenCast session to be restored
59
61
* with previously granted screen access permissions.
60
62
*/
63
+ @ SuppressWarnings ("removal" )
61
64
final class TokenStorage {
62
65
63
66
private TokenStorage () {}
@@ -69,8 +72,24 @@ private TokenStorage() {}
69
72
private static final Path PROPS_PATH ;
70
73
private static final Path PROP_FILENAME ;
71
74
75
+ private static void doPrivilegedRunnable (Runnable runnable ) {
76
+ AccessController .doPrivileged (new PrivilegedAction <Void >() {
77
+ @ Override
78
+ public Void run () {
79
+ runnable .run ();
80
+ return null ;
81
+ }
82
+ });
83
+ }
84
+
72
85
static {
73
- PROPS_PATH = setupPath ();
86
+ PROPS_PATH = AccessController .doPrivileged (new PrivilegedAction <Path >() {
87
+ @ Override
88
+ public Path run () {
89
+ return setupPath ();
90
+ }
91
+ });
92
+
74
93
if (PROPS_PATH != null ) {
75
94
PROP_FILENAME = PROPS_PATH .getFileName ();
76
95
if (SCREENCAST_DEBUG ) {
@@ -192,9 +211,9 @@ public void run() {
192
211
}
193
212
194
213
if (kind == ENTRY_CREATE ) {
195
- setFilePermission (PROPS_PATH );
214
+ doPrivilegedRunnable (() -> setFilePermission (PROPS_PATH ) );
196
215
} else if (kind == ENTRY_MODIFY ) {
197
- readTokens (PROPS_PATH );
216
+ doPrivilegedRunnable (() -> readTokens (PROPS_PATH ) );
198
217
} else if (kind == ENTRY_DELETE ) {
199
218
synchronized (PROPS ) {
200
219
PROPS .clear ();
@@ -207,24 +226,31 @@ public void run() {
207
226
}
208
227
}
209
228
229
+ private static WatchService watchService ;
230
+
210
231
private static void setupWatch () {
211
- try {
212
- WatchService watchService =
213
- FileSystems .getDefault ().newWatchService ();
232
+ doPrivilegedRunnable (() -> {
233
+ try {
234
+ watchService =
235
+ FileSystems .getDefault ().newWatchService ();
214
236
215
- PROPS_PATH
216
- .getParent ()
217
- .register (watchService ,
218
- ENTRY_CREATE ,
219
- ENTRY_DELETE ,
220
- ENTRY_MODIFY );
237
+ PROPS_PATH
238
+ .getParent ()
239
+ .register (watchService ,
240
+ ENTRY_CREATE ,
241
+ ENTRY_DELETE ,
242
+ ENTRY_MODIFY );
221
243
222
- new WatcherThread ( watchService ). start ();
223
- } catch ( Exception e ) {
224
- if ( SCREENCAST_DEBUG ) {
225
- System . err . printf ( "Token storage: failed to setup " +
226
- "file watch %s \n " , e );
244
+ } catch ( Exception e ) {
245
+ if ( SCREENCAST_DEBUG ) {
246
+ System . err . printf ( "Token storage: failed to setup " +
247
+ "file watch %s \n " , e );
248
+ }
227
249
}
250
+ });
251
+
252
+ if (watchService != null ) {
253
+ new WatcherThread (watchService ).start ();
228
254
}
229
255
}
230
256
@@ -276,7 +302,7 @@ private static void storeTokenFromNative(String oldToken,
276
302
}
277
303
278
304
if (changed ) {
279
- store ("save tokens" );
305
+ doPrivilegedRunnable (() -> store ("save tokens" ) );
280
306
}
281
307
}
282
308
}
@@ -331,7 +357,7 @@ static Set<TokenItem> getTokens(List<Rectangle> affectedScreenBounds) {
331
357
.toList ();
332
358
}
333
359
334
- removeMalformedRecords (malformed );
360
+ doPrivilegedRunnable (() -> removeMalformedRecords (malformed ) );
335
361
336
362
// 1. Try to find exact matches
337
363
for (TokenItem tokenItem : allTokenItems ) {
0 commit comments