Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/openjdk-multiarch-jdk8u
Path: blob/aarch64-shenandoah-jdk8u272-b10/jdk/src/share/classes/sun/security/tools/policytool/PolicyTool.java
38832 views
1
/*
2
* Copyright (c) 1997, 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. Oracle designates this
8
* particular file as subject to the "Classpath" exception as provided
9
* by Oracle in the LICENSE file that accompanied this code.
10
*
11
* This code is distributed in the hope that it will be useful, but WITHOUT
12
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14
* version 2 for more details (a copy is included in the LICENSE file that
15
* accompanied this code).
16
*
17
* You should have received a copy of the GNU General Public License version
18
* 2 along with this work; if not, write to the Free Software Foundation,
19
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20
*
21
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22
* or visit www.oracle.com if you need additional information or have any
23
* questions.
24
*/
25
26
package sun.security.tools.policytool;
27
28
import java.io.*;
29
import java.util.LinkedList;
30
import java.util.ListIterator;
31
import java.util.Vector;
32
import java.util.Enumeration;
33
import java.net.URL;
34
import java.net.MalformedURLException;
35
import java.lang.reflect.*;
36
import java.text.Collator;
37
import java.text.MessageFormat;
38
import sun.security.util.PropertyExpander;
39
import sun.security.util.PropertyExpander.ExpandException;
40
import java.awt.Component;
41
import java.awt.Container;
42
import java.awt.Dimension;
43
import java.awt.FileDialog;
44
import java.awt.GridBagConstraints;
45
import java.awt.GridBagLayout;
46
import java.awt.Insets;
47
import java.awt.Point;
48
import java.awt.Toolkit;
49
import java.awt.Window;
50
import java.awt.event.*;
51
import java.security.cert.Certificate;
52
import java.security.cert.CertificateException;
53
import java.security.*;
54
import sun.security.provider.*;
55
import sun.security.util.PolicyUtil;
56
import javax.security.auth.x500.X500Principal;
57
import javax.swing.*;
58
import javax.swing.border.EmptyBorder;
59
60
/**
61
* PolicyTool may be used by users and administrators to configure the
62
* overall java security policy (currently stored in the policy file).
63
* Using PolicyTool administrators may add and remove policies from
64
* the policy file. <p>
65
*
66
* @see java.security.Policy
67
* @since 1.2
68
*/
69
70
public class PolicyTool {
71
72
// for i18n
73
static final java.util.ResourceBundle rb =
74
java.util.ResourceBundle.getBundle(
75
"sun.security.tools.policytool.Resources");
76
static final Collator collator = Collator.getInstance();
77
static {
78
// this is for case insensitive string comparisons
79
collator.setStrength(Collator.PRIMARY);
80
81
// Support for Apple menu bar
82
if (System.getProperty("apple.laf.useScreenMenuBar") == null) {
83
System.setProperty("apple.laf.useScreenMenuBar", "true");
84
}
85
System.setProperty("apple.awt.application.name", getMessage("Policy.Tool"));
86
87
// Apply the system L&F if not specified with a system property.
88
if (System.getProperty("swing.defaultlaf") == null) {
89
try {
90
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
91
} catch (Exception e) {
92
// ignore
93
}
94
}
95
}
96
97
// anyone can add warnings
98
Vector<String> warnings;
99
boolean newWarning = false;
100
101
// set to true if policy modified.
102
// this way upon exit we know if to ask the user to save changes
103
boolean modified = false;
104
105
private static final boolean testing = false;
106
private static final Class<?>[] TWOPARAMS = { String.class, String.class };
107
private static final Class<?>[] ONEPARAMS = { String.class };
108
private static final Class<?>[] NOPARAMS = {};
109
/*
110
* All of the policy entries are read in from the
111
* policy file and stored here. Updates to the policy entries
112
* using addEntry() and removeEntry() are made here. To ultimately save
113
* the policy entries back to the policy file, the SavePolicy button
114
* must be clicked.
115
**/
116
private static String policyFileName = null;
117
private Vector<PolicyEntry> policyEntries = null;
118
private PolicyParser parser = null;
119
120
/* The public key alias information is stored here. */
121
private KeyStore keyStore = null;
122
private String keyStoreName = " ";
123
private String keyStoreType = " ";
124
private String keyStoreProvider = " ";
125
private String keyStorePwdURL = " ";
126
127
/* standard PKCS11 KeyStore type */
128
private static final String P11KEYSTORE = "PKCS11";
129
130
/* reserved word for PKCS11 KeyStores */
131
private static final String NONE = "NONE";
132
133
/**
134
* default constructor
135
*/
136
private PolicyTool() {
137
policyEntries = new Vector<PolicyEntry>();
138
parser = new PolicyParser();
139
warnings = new Vector<String>();
140
}
141
142
/**
143
* get the PolicyFileName
144
*/
145
String getPolicyFileName() {
146
return policyFileName;
147
}
148
149
/**
150
* set the PolicyFileName
151
*/
152
void setPolicyFileName(String policyFileName) {
153
PolicyTool.policyFileName = policyFileName;
154
}
155
156
/**
157
* clear keyStore info
158
*/
159
void clearKeyStoreInfo() {
160
this.keyStoreName = null;
161
this.keyStoreType = null;
162
this.keyStoreProvider = null;
163
this.keyStorePwdURL = null;
164
165
this.keyStore = null;
166
}
167
168
/**
169
* get the keyStore URL name
170
*/
171
String getKeyStoreName() {
172
return keyStoreName;
173
}
174
175
/**
176
* get the keyStore Type
177
*/
178
String getKeyStoreType() {
179
return keyStoreType;
180
}
181
182
/**
183
* get the keyStore Provider
184
*/
185
String getKeyStoreProvider() {
186
return keyStoreProvider;
187
}
188
189
/**
190
* get the keyStore password URL
191
*/
192
String getKeyStorePwdURL() {
193
return keyStorePwdURL;
194
}
195
196
/**
197
* Open and read a policy file
198
*/
199
void openPolicy(String filename) throws FileNotFoundException,
200
PolicyParser.ParsingException,
201
KeyStoreException,
202
CertificateException,
203
InstantiationException,
204
MalformedURLException,
205
IOException,
206
NoSuchAlgorithmException,
207
IllegalAccessException,
208
NoSuchMethodException,
209
UnrecoverableKeyException,
210
NoSuchProviderException,
211
ClassNotFoundException,
212
PropertyExpander.ExpandException,
213
InvocationTargetException {
214
215
newWarning = false;
216
217
// start fresh - blow away the current state
218
policyEntries = new Vector<PolicyEntry>();
219
parser = new PolicyParser();
220
warnings = new Vector<String>();
221
setPolicyFileName(null);
222
clearKeyStoreInfo();
223
224
// see if user is opening a NEW policy file
225
if (filename == null) {
226
modified = false;
227
return;
228
}
229
230
// Read in the policy entries from the file and
231
// populate the parser vector table. The parser vector
232
// table only holds the entries as strings, so it only
233
// guarantees that the policies are syntactically
234
// correct.
235
setPolicyFileName(filename);
236
parser.read(new FileReader(filename));
237
238
// open the keystore
239
openKeyStore(parser.getKeyStoreUrl(), parser.getKeyStoreType(),
240
parser.getKeyStoreProvider(), parser.getStorePassURL());
241
242
// Update the local vector with the same policy entries.
243
// This guarantees that the policy entries are not only
244
// syntactically correct, but semantically valid as well.
245
Enumeration<PolicyParser.GrantEntry> enum_ = parser.grantElements();
246
while (enum_.hasMoreElements()) {
247
PolicyParser.GrantEntry ge = enum_.nextElement();
248
249
// see if all the signers have public keys
250
if (ge.signedBy != null) {
251
252
String signers[] = parseSigners(ge.signedBy);
253
for (int i = 0; i < signers.length; i++) {
254
PublicKey pubKey = getPublicKeyAlias(signers[i]);
255
if (pubKey == null) {
256
newWarning = true;
257
MessageFormat form = new MessageFormat(getMessage
258
("Warning.A.public.key.for.alias.signers.i.does.not.exist.Make.sure.a.KeyStore.is.properly.configured."));
259
Object[] source = {signers[i]};
260
warnings.addElement(form.format(source));
261
}
262
}
263
}
264
265
// check to see if the Principals are valid
266
ListIterator<PolicyParser.PrincipalEntry> prinList =
267
ge.principals.listIterator(0);
268
while (prinList.hasNext()) {
269
PolicyParser.PrincipalEntry pe = prinList.next();
270
try {
271
verifyPrincipal(pe.getPrincipalClass(),
272
pe.getPrincipalName());
273
} catch (ClassNotFoundException fnfe) {
274
newWarning = true;
275
MessageFormat form = new MessageFormat(getMessage
276
("Warning.Class.not.found.class"));
277
Object[] source = {pe.getPrincipalClass()};
278
warnings.addElement(form.format(source));
279
}
280
}
281
282
// check to see if the Permissions are valid
283
Enumeration<PolicyParser.PermissionEntry> perms =
284
ge.permissionElements();
285
while (perms.hasMoreElements()) {
286
PolicyParser.PermissionEntry pe = perms.nextElement();
287
try {
288
verifyPermission(pe.permission, pe.name, pe.action);
289
} catch (ClassNotFoundException fnfe) {
290
newWarning = true;
291
MessageFormat form = new MessageFormat(getMessage
292
("Warning.Class.not.found.class"));
293
Object[] source = {pe.permission};
294
warnings.addElement(form.format(source));
295
} catch (InvocationTargetException ite) {
296
newWarning = true;
297
MessageFormat form = new MessageFormat(getMessage
298
("Warning.Invalid.argument.s.for.constructor.arg"));
299
Object[] source = {pe.permission};
300
warnings.addElement(form.format(source));
301
}
302
303
// see if all the permission signers have public keys
304
if (pe.signedBy != null) {
305
306
String signers[] = parseSigners(pe.signedBy);
307
308
for (int i = 0; i < signers.length; i++) {
309
PublicKey pubKey = getPublicKeyAlias(signers[i]);
310
if (pubKey == null) {
311
newWarning = true;
312
MessageFormat form = new MessageFormat(getMessage
313
("Warning.A.public.key.for.alias.signers.i.does.not.exist.Make.sure.a.KeyStore.is.properly.configured."));
314
Object[] source = {signers[i]};
315
warnings.addElement(form.format(source));
316
}
317
}
318
}
319
}
320
PolicyEntry pEntry = new PolicyEntry(this, ge);
321
policyEntries.addElement(pEntry);
322
}
323
324
// just read in the policy -- nothing has been modified yet
325
modified = false;
326
}
327
328
329
/**
330
* Save a policy to a file
331
*/
332
void savePolicy(String filename)
333
throws FileNotFoundException, IOException {
334
// save the policy entries to a file
335
parser.setKeyStoreUrl(keyStoreName);
336
parser.setKeyStoreType(keyStoreType);
337
parser.setKeyStoreProvider(keyStoreProvider);
338
parser.setStorePassURL(keyStorePwdURL);
339
parser.write(new FileWriter(filename));
340
modified = false;
341
}
342
343
/**
344
* Open the KeyStore
345
*/
346
void openKeyStore(String name,
347
String type,
348
String provider,
349
String pwdURL) throws KeyStoreException,
350
NoSuchAlgorithmException,
351
UnrecoverableKeyException,
352
IOException,
353
CertificateException,
354
NoSuchProviderException,
355
ExpandException {
356
357
if (name == null && type == null &&
358
provider == null && pwdURL == null) {
359
360
// policy did not specify a keystore during open
361
// or use wants to reset keystore values
362
363
this.keyStoreName = null;
364
this.keyStoreType = null;
365
this.keyStoreProvider = null;
366
this.keyStorePwdURL = null;
367
368
// caller will set (tool.modified = true) if appropriate
369
370
return;
371
}
372
373
URL policyURL = null;
374
if (policyFileName != null) {
375
File pfile = new File(policyFileName);
376
policyURL = new URL("file:" + pfile.getCanonicalPath());
377
}
378
379
// although PolicyUtil.getKeyStore may properly handle
380
// defaults and property expansion, we do it here so that
381
// if the call is successful, we can set the proper values
382
// (PolicyUtil.getKeyStore does not return expanded values)
383
384
if (name != null && name.length() > 0) {
385
name = PropertyExpander.expand(name).replace
386
(File.separatorChar, '/');
387
}
388
if (type == null || type.length() == 0) {
389
type = KeyStore.getDefaultType();
390
}
391
if (pwdURL != null && pwdURL.length() > 0) {
392
pwdURL = PropertyExpander.expand(pwdURL).replace
393
(File.separatorChar, '/');
394
}
395
396
try {
397
this.keyStore = PolicyUtil.getKeyStore(policyURL,
398
name,
399
type,
400
provider,
401
pwdURL,
402
null);
403
} catch (IOException ioe) {
404
405
// copied from sun.security.pkcs11.SunPKCS11
406
String MSG = "no password provided, and no callback handler " +
407
"available for retrieving password";
408
409
Throwable cause = ioe.getCause();
410
if (cause != null &&
411
cause instanceof javax.security.auth.login.LoginException &&
412
MSG.equals(cause.getMessage())) {
413
414
// throw a more friendly exception message
415
throw new IOException(MSG);
416
} else {
417
throw ioe;
418
}
419
}
420
421
this.keyStoreName = name;
422
this.keyStoreType = type;
423
this.keyStoreProvider = provider;
424
this.keyStorePwdURL = pwdURL;
425
426
// caller will set (tool.modified = true)
427
}
428
429
/**
430
* Add a Grant entry to the overall policy at the specified index.
431
* A policy entry consists of a CodeSource.
432
*/
433
boolean addEntry(PolicyEntry pe, int index) {
434
435
if (index < 0) {
436
// new entry -- just add it to the end
437
policyEntries.addElement(pe);
438
parser.add(pe.getGrantEntry());
439
} else {
440
// existing entry -- replace old one
441
PolicyEntry origPe = policyEntries.elementAt(index);
442
parser.replace(origPe.getGrantEntry(), pe.getGrantEntry());
443
policyEntries.setElementAt(pe, index);
444
}
445
return true;
446
}
447
448
/**
449
* Add a Principal entry to an existing PolicyEntry at the specified index.
450
* A Principal entry consists of a class, and name.
451
*
452
* If the principal already exists, it is not added again.
453
*/
454
boolean addPrinEntry(PolicyEntry pe,
455
PolicyParser.PrincipalEntry newPrin,
456
int index) {
457
458
// first add the principal to the Policy Parser entry
459
PolicyParser.GrantEntry grantEntry = pe.getGrantEntry();
460
if (grantEntry.contains(newPrin) == true)
461
return false;
462
463
LinkedList<PolicyParser.PrincipalEntry> prinList =
464
grantEntry.principals;
465
if (index != -1)
466
prinList.set(index, newPrin);
467
else
468
prinList.add(newPrin);
469
470
modified = true;
471
return true;
472
}
473
474
/**
475
* Add a Permission entry to an existing PolicyEntry at the specified index.
476
* A Permission entry consists of a permission, name, and actions.
477
*
478
* If the permission already exists, it is not added again.
479
*/
480
boolean addPermEntry(PolicyEntry pe,
481
PolicyParser.PermissionEntry newPerm,
482
int index) {
483
484
// first add the permission to the Policy Parser Vector
485
PolicyParser.GrantEntry grantEntry = pe.getGrantEntry();
486
if (grantEntry.contains(newPerm) == true)
487
return false;
488
489
Vector<PolicyParser.PermissionEntry> permList =
490
grantEntry.permissionEntries;
491
if (index != -1)
492
permList.setElementAt(newPerm, index);
493
else
494
permList.addElement(newPerm);
495
496
modified = true;
497
return true;
498
}
499
500
/**
501
* Remove a Permission entry from an existing PolicyEntry.
502
*/
503
boolean removePermEntry(PolicyEntry pe,
504
PolicyParser.PermissionEntry perm) {
505
506
// remove the Permission from the GrantEntry
507
PolicyParser.GrantEntry ppge = pe.getGrantEntry();
508
modified = ppge.remove(perm);
509
return modified;
510
}
511
512
/**
513
* remove an entry from the overall policy
514
*/
515
boolean removeEntry(PolicyEntry pe) {
516
517
parser.remove(pe.getGrantEntry());
518
modified = true;
519
return (policyEntries.removeElement(pe));
520
}
521
522
/**
523
* retrieve all Policy Entries
524
*/
525
PolicyEntry[] getEntry() {
526
527
if (policyEntries.size() > 0) {
528
PolicyEntry entries[] = new PolicyEntry[policyEntries.size()];
529
for (int i = 0; i < policyEntries.size(); i++)
530
entries[i] = policyEntries.elementAt(i);
531
return entries;
532
}
533
return null;
534
}
535
536
/**
537
* Retrieve the public key mapped to a particular name.
538
* If the key has expired, a KeyException is thrown.
539
*/
540
PublicKey getPublicKeyAlias(String name) throws KeyStoreException {
541
if (keyStore == null) {
542
return null;
543
}
544
545
Certificate cert = keyStore.getCertificate(name);
546
if (cert == null) {
547
return null;
548
}
549
PublicKey pubKey = cert.getPublicKey();
550
return pubKey;
551
}
552
553
/**
554
* Retrieve all the alias names stored in the certificate database
555
*/
556
String[] getPublicKeyAlias() throws KeyStoreException {
557
558
int numAliases = 0;
559
String aliases[] = null;
560
561
if (keyStore == null) {
562
return null;
563
}
564
Enumeration<String> enum_ = keyStore.aliases();
565
566
// first count the number of elements
567
while (enum_.hasMoreElements()) {
568
enum_.nextElement();
569
numAliases++;
570
}
571
572
if (numAliases > 0) {
573
// now copy them into an array
574
aliases = new String[numAliases];
575
numAliases = 0;
576
enum_ = keyStore.aliases();
577
while (enum_.hasMoreElements()) {
578
aliases[numAliases] = new String(enum_.nextElement());
579
numAliases++;
580
}
581
}
582
return aliases;
583
}
584
585
/**
586
* This method parses a single string of signers separated by commas
587
* ("jordan, duke, pippen") into an array of individual strings.
588
*/
589
String[] parseSigners(String signedBy) {
590
591
String signers[] = null;
592
int numSigners = 1;
593
int signedByIndex = 0;
594
int commaIndex = 0;
595
int signerNum = 0;
596
597
// first pass thru "signedBy" counts the number of signers
598
while (commaIndex >= 0) {
599
commaIndex = signedBy.indexOf(',', signedByIndex);
600
if (commaIndex >= 0) {
601
numSigners++;
602
signedByIndex = commaIndex + 1;
603
}
604
}
605
signers = new String[numSigners];
606
607
// second pass thru "signedBy" transfers signers to array
608
commaIndex = 0;
609
signedByIndex = 0;
610
while (commaIndex >= 0) {
611
if ((commaIndex = signedBy.indexOf(',', signedByIndex)) >= 0) {
612
// transfer signer and ignore trailing part of the string
613
signers[signerNum] =
614
signedBy.substring(signedByIndex, commaIndex).trim();
615
signerNum++;
616
signedByIndex = commaIndex + 1;
617
} else {
618
// we are at the end of the string -- transfer signer
619
signers[signerNum] = signedBy.substring(signedByIndex).trim();
620
}
621
}
622
return signers;
623
}
624
625
/**
626
* Check to see if the Principal contents are OK
627
*/
628
void verifyPrincipal(String type, String name)
629
throws ClassNotFoundException,
630
InstantiationException
631
{
632
if (type.equals(PolicyParser.PrincipalEntry.WILDCARD_CLASS) ||
633
type.equals(PolicyParser.PrincipalEntry.REPLACE_NAME)) {
634
return;
635
}
636
Class<?> PRIN = Class.forName("java.security.Principal");
637
Class<?> pc = Class.forName(type, true,
638
Thread.currentThread().getContextClassLoader());
639
if (!PRIN.isAssignableFrom(pc)) {
640
MessageFormat form = new MessageFormat(getMessage
641
("Illegal.Principal.Type.type"));
642
Object[] source = {type};
643
throw new InstantiationException(form.format(source));
644
}
645
646
if (ToolDialog.X500_PRIN_CLASS.equals(pc.getName())) {
647
// PolicyParser checks validity of X500Principal name
648
// - PolicyTool needs to as well so that it doesn't store
649
// an invalid name that can't be read in later
650
//
651
// this can throw an IllegalArgumentException
652
X500Principal newP = new X500Principal(name);
653
}
654
}
655
656
/**
657
* Check to see if the Permission contents are OK
658
*/
659
@SuppressWarnings("fallthrough")
660
void verifyPermission(String type,
661
String name,
662
String actions)
663
throws ClassNotFoundException,
664
InstantiationException,
665
IllegalAccessException,
666
NoSuchMethodException,
667
InvocationTargetException
668
{
669
670
//XXX we might want to keep a hash of created factories...
671
Class<?> pc = Class.forName(type, true,
672
Thread.currentThread().getContextClassLoader());
673
Constructor<?> c = null;
674
Vector<String> objects = new Vector<>(2);
675
if (name != null) objects.add(name);
676
if (actions != null) objects.add(actions);
677
switch (objects.size()) {
678
case 0:
679
try {
680
c = pc.getConstructor(NOPARAMS);
681
break;
682
} catch (NoSuchMethodException ex) {
683
// proceed to the one-param constructor
684
objects.add(null);
685
}
686
/* fall through */
687
case 1:
688
try {
689
c = pc.getConstructor(ONEPARAMS);
690
break;
691
} catch (NoSuchMethodException ex) {
692
// proceed to the two-param constructor
693
objects.add(null);
694
}
695
/* fall through */
696
case 2:
697
c = pc.getConstructor(TWOPARAMS);
698
break;
699
}
700
Object parameters[] = objects.toArray();
701
Permission p = (Permission)c.newInstance(parameters);
702
}
703
704
/*
705
* Parse command line arguments.
706
*/
707
static void parseArgs(String args[]) {
708
/* parse flags */
709
int n = 0;
710
711
for (n=0; (n < args.length) && args[n].startsWith("-"); n++) {
712
713
String flags = args[n];
714
715
if (collator.compare(flags, "-file") == 0) {
716
if (++n == args.length) usage();
717
policyFileName = args[n];
718
} else {
719
MessageFormat form = new MessageFormat(getMessage
720
("Illegal.option.option"));
721
Object[] source = { flags };
722
System.err.println(form.format(source));
723
usage();
724
}
725
}
726
}
727
728
static void usage() {
729
System.out.println(getMessage("Usage.policytool.options."));
730
System.out.println();
731
System.out.println(getMessage
732
(".file.file.policy.file.location"));
733
System.out.println();
734
735
System.exit(1);
736
}
737
738
/**
739
* run the PolicyTool
740
*/
741
public static void main(String args[]) {
742
parseArgs(args);
743
SwingUtilities.invokeLater(new Runnable() {
744
public void run() {
745
ToolWindow tw = new ToolWindow(new PolicyTool());
746
tw.displayToolWindow(args);
747
}
748
});
749
}
750
751
// split instr to words according to capitalization,
752
// like, AWTControl -> A W T Control
753
// this method is for easy pronounciation
754
static String splitToWords(String instr) {
755
return instr.replaceAll("([A-Z])", " $1");
756
}
757
758
/**
759
* Returns the message corresponding to the key in the bundle.
760
* This is preferred over {@link #getString} because it removes
761
* any mnemonic '&' character in the string.
762
*
763
* @param key the key
764
*
765
* @return the message
766
*/
767
static String getMessage(String key) {
768
return removeMnemonicAmpersand(rb.getString(key));
769
}
770
771
772
/**
773
* Returns the mnemonic for a message.
774
*
775
* @param key the key
776
*
777
* @return the mnemonic <code>int</code>
778
*/
779
static int getMnemonicInt(String key) {
780
String message = rb.getString(key);
781
return (findMnemonicInt(message));
782
}
783
784
/**
785
* Returns the mnemonic display index for a message.
786
*
787
* @param key the key
788
*
789
* @return the mnemonic display index
790
*/
791
static int getDisplayedMnemonicIndex(String key) {
792
String message = rb.getString(key);
793
return (findMnemonicIndex(message));
794
}
795
796
/**
797
* Finds the mnemonic character in a message.
798
*
799
* The mnemonic character is the first character followed by the first
800
* <code>&</code> that is not followed by another <code>&</code>.
801
*
802
* @return the mnemonic as an <code>int</code>, or <code>0</code> if it
803
* can't be found.
804
*/
805
private static int findMnemonicInt(String s) {
806
for (int i = 0; i < s.length() - 1; i++) {
807
if (s.charAt(i) == '&') {
808
if (s.charAt(i + 1) != '&') {
809
return KeyEvent.getExtendedKeyCodeForChar(s.charAt(i + 1));
810
} else {
811
i++;
812
}
813
}
814
}
815
return 0;
816
}
817
818
/**
819
* Finds the index of the mnemonic character in a message.
820
*
821
* The mnemonic character is the first character followed by the first
822
* <code>&</code> that is not followed by another <code>&</code>.
823
*
824
* @return the mnemonic character index as an <code>int</code>, or <code>-1</code> if it
825
* can't be found.
826
*/
827
private static int findMnemonicIndex(String s) {
828
for (int i = 0; i < s.length() - 1; i++) {
829
if (s.charAt(i) == '&') {
830
if (s.charAt(i + 1) != '&') {
831
// Return the index of the '&' since it will be removed
832
return i;
833
} else {
834
i++;
835
}
836
}
837
}
838
return -1;
839
}
840
841
/**
842
* Removes the mnemonic identifier (<code>&</code>) from a string unless
843
* it's escaped by <code>&&</code> or placed at the end.
844
*
845
* @param message the message
846
*
847
* @return a message with the mnemonic identifier removed
848
*/
849
private static String removeMnemonicAmpersand(String message) {
850
StringBuilder s = new StringBuilder();
851
for (int i = 0; i < message.length(); i++) {
852
char current = message.charAt(i);
853
if (current != '&' || i == message.length() - 1
854
|| message.charAt(i + 1) == '&') {
855
s.append(current);
856
}
857
}
858
return s.toString();
859
}
860
}
861
862
/**
863
* Each entry in the policy configuration file is represented by a
864
* PolicyEntry object.
865
*
866
* A PolicyEntry is a (CodeSource,Permission) pair. The
867
* CodeSource contains the (URL, PublicKey) that together identify
868
* where the Java bytecodes come from and who (if anyone) signed
869
* them. The URL could refer to localhost. The URL could also be
870
* null, meaning that this policy entry is given to all comers, as
871
* long as they match the signer field. The signer could be null,
872
* meaning the code is not signed.
873
*
874
* The Permission contains the (Type, Name, Action) triplet.
875
*
876
*/
877
class PolicyEntry {
878
879
private CodeSource codesource;
880
private PolicyTool tool;
881
private PolicyParser.GrantEntry grantEntry;
882
private boolean testing = false;
883
884
/**
885
* Create a PolicyEntry object from the information read in
886
* from a policy file.
887
*/
888
PolicyEntry(PolicyTool tool, PolicyParser.GrantEntry ge)
889
throws MalformedURLException, NoSuchMethodException,
890
ClassNotFoundException, InstantiationException, IllegalAccessException,
891
InvocationTargetException, CertificateException,
892
IOException, NoSuchAlgorithmException, UnrecoverableKeyException {
893
894
this.tool = tool;
895
896
URL location = null;
897
898
// construct the CodeSource
899
if (ge.codeBase != null)
900
location = new URL(ge.codeBase);
901
this.codesource = new CodeSource(location,
902
(java.security.cert.Certificate[]) null);
903
904
if (testing) {
905
System.out.println("Adding Policy Entry:");
906
System.out.println(" CodeBase = " + location);
907
System.out.println(" Signers = " + ge.signedBy);
908
System.out.println(" with " + ge.principals.size() +
909
" Principals");
910
}
911
912
this.grantEntry = ge;
913
}
914
915
/**
916
* get the codesource associated with this PolicyEntry
917
*/
918
CodeSource getCodeSource() {
919
return codesource;
920
}
921
922
/**
923
* get the GrantEntry associated with this PolicyEntry
924
*/
925
PolicyParser.GrantEntry getGrantEntry() {
926
return grantEntry;
927
}
928
929
/**
930
* convert the header portion, i.e. codebase, signer, principals, of
931
* this policy entry into a string
932
*/
933
String headerToString() {
934
String pString = principalsToString();
935
if (pString.length() == 0) {
936
return codebaseToString();
937
} else {
938
return codebaseToString() + ", " + pString;
939
}
940
}
941
942
/**
943
* convert the Codebase/signer portion of this policy entry into a string
944
*/
945
String codebaseToString() {
946
947
String stringEntry = new String();
948
949
if (grantEntry.codeBase != null &&
950
grantEntry.codeBase.equals("") == false)
951
stringEntry = stringEntry.concat
952
("CodeBase \"" +
953
grantEntry.codeBase +
954
"\"");
955
956
if (grantEntry.signedBy != null &&
957
grantEntry.signedBy.equals("") == false)
958
stringEntry = ((stringEntry.length() > 0) ?
959
stringEntry.concat(", SignedBy \"" +
960
grantEntry.signedBy +
961
"\"") :
962
stringEntry.concat("SignedBy \"" +
963
grantEntry.signedBy +
964
"\""));
965
966
if (stringEntry.length() == 0)
967
return new String("CodeBase <ALL>");
968
return stringEntry;
969
}
970
971
/**
972
* convert the Principals portion of this policy entry into a string
973
*/
974
String principalsToString() {
975
String result = "";
976
if ((grantEntry.principals != null) &&
977
(!grantEntry.principals.isEmpty())) {
978
StringBuffer buffer = new StringBuffer(200);
979
ListIterator<PolicyParser.PrincipalEntry> list =
980
grantEntry.principals.listIterator();
981
while (list.hasNext()) {
982
PolicyParser.PrincipalEntry pppe = list.next();
983
buffer.append(" Principal " + pppe.getDisplayClass() + " " +
984
pppe.getDisplayName(true));
985
if (list.hasNext()) buffer.append(", ");
986
}
987
result = buffer.toString();
988
}
989
return result;
990
}
991
992
/**
993
* convert this policy entry into a PolicyParser.PermissionEntry
994
*/
995
PolicyParser.PermissionEntry toPermissionEntry(Permission perm) {
996
997
String actions = null;
998
999
// get the actions
1000
if (perm.getActions() != null &&
1001
perm.getActions().trim() != "")
1002
actions = perm.getActions();
1003
1004
PolicyParser.PermissionEntry pe = new PolicyParser.PermissionEntry
1005
(perm.getClass().getName(),
1006
perm.getName(),
1007
actions);
1008
return pe;
1009
}
1010
}
1011
1012
/**
1013
* The main window for the PolicyTool
1014
*/
1015
class ToolWindow extends JFrame {
1016
// use serialVersionUID from JDK 1.2.2 for interoperability
1017
private static final long serialVersionUID = 5682568601210376777L;
1018
1019
/* ESCAPE key */
1020
static final KeyStroke escKey = KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0);
1021
1022
/* external paddings */
1023
public static final Insets TOP_PADDING = new Insets(25,0,0,0);
1024
public static final Insets BOTTOM_PADDING = new Insets(0,0,25,0);
1025
public static final Insets LITE_BOTTOM_PADDING = new Insets(0,0,10,0);
1026
public static final Insets LR_PADDING = new Insets(0,10,0,10);
1027
public static final Insets TOP_BOTTOM_PADDING = new Insets(15, 0, 15, 0);
1028
public static final Insets L_TOP_BOTTOM_PADDING = new Insets(5,10,15,0);
1029
public static final Insets LR_TOP_BOTTOM_PADDING = new Insets(15, 4, 15, 4);
1030
public static final Insets LR_BOTTOM_PADDING = new Insets(0,10,5,10);
1031
public static final Insets L_BOTTOM_PADDING = new Insets(0,10,5,0);
1032
public static final Insets R_BOTTOM_PADDING = new Insets(0, 0, 25, 5);
1033
public static final Insets R_PADDING = new Insets(0, 0, 0, 5);
1034
1035
/* buttons and menus */
1036
public static final String NEW_POLICY_FILE = "New";
1037
public static final String OPEN_POLICY_FILE = "Open";
1038
public static final String SAVE_POLICY_FILE = "Save";
1039
public static final String SAVE_AS_POLICY_FILE = "Save.As";
1040
public static final String VIEW_WARNINGS = "View.Warning.Log";
1041
public static final String QUIT = "Exit";
1042
public static final String ADD_POLICY_ENTRY = "Add.Policy.Entry";
1043
public static final String EDIT_POLICY_ENTRY = "Edit.Policy.Entry";
1044
public static final String REMOVE_POLICY_ENTRY = "Remove.Policy.Entry";
1045
public static final String EDIT_KEYSTORE = "Edit";
1046
public static final String ADD_PUBKEY_ALIAS = "Add.Public.Key.Alias";
1047
public static final String REMOVE_PUBKEY_ALIAS = "Remove.Public.Key.Alias";
1048
1049
/* gridbag index for components in the main window (MW) */
1050
public static final int MW_FILENAME_LABEL = 0;
1051
public static final int MW_FILENAME_TEXTFIELD = 1;
1052
public static final int MW_PANEL = 2;
1053
public static final int MW_ADD_BUTTON = 0;
1054
public static final int MW_EDIT_BUTTON = 1;
1055
public static final int MW_REMOVE_BUTTON = 2;
1056
public static final int MW_POLICY_LIST = 3; // follows MW_PANEL
1057
1058
/* The preferred height of JTextField should match JComboBox. */
1059
static final int TEXTFIELD_HEIGHT = new JComboBox().getPreferredSize().height;
1060
1061
private PolicyTool tool;
1062
1063
/**
1064
* Constructor
1065
*/
1066
ToolWindow(PolicyTool tool) {
1067
this.tool = tool;
1068
}
1069
1070
/**
1071
* Don't call getComponent directly on the window
1072
*/
1073
public Component getComponent(int n) {
1074
Component c = getContentPane().getComponent(n);
1075
if (c instanceof JScrollPane) {
1076
c = ((JScrollPane)c).getViewport().getView();
1077
}
1078
return c;
1079
}
1080
1081
/**
1082
* Initialize the PolicyTool window with the necessary components
1083
*/
1084
private void initWindow() {
1085
// The ToolWindowListener will handle closing the window.
1086
setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
1087
1088
// create the top menu bar
1089
JMenuBar menuBar = new JMenuBar();
1090
1091
// create a File menu
1092
JMenu menu = new JMenu();
1093
configureButton(menu, "File");
1094
ActionListener actionListener = new FileMenuListener(tool, this);
1095
addMenuItem(menu, NEW_POLICY_FILE, actionListener, "N");
1096
addMenuItem(menu, OPEN_POLICY_FILE, actionListener, "O");
1097
addMenuItem(menu, SAVE_POLICY_FILE, actionListener, "S");
1098
addMenuItem(menu, SAVE_AS_POLICY_FILE, actionListener, null);
1099
addMenuItem(menu, VIEW_WARNINGS, actionListener, null);
1100
addMenuItem(menu, QUIT, actionListener, null);
1101
menuBar.add(menu);
1102
1103
// create a KeyStore menu
1104
menu = new JMenu();
1105
configureButton(menu, "KeyStore");
1106
actionListener = new MainWindowListener(tool, this);
1107
addMenuItem(menu, EDIT_KEYSTORE, actionListener, null);
1108
menuBar.add(menu);
1109
setJMenuBar(menuBar);
1110
1111
// Create some space around components
1112
((JPanel)getContentPane()).setBorder(new EmptyBorder(6, 6, 6, 6));
1113
1114
// policy entry listing
1115
JLabel label = new JLabel(PolicyTool.getMessage("Policy.File."));
1116
addNewComponent(this, label, MW_FILENAME_LABEL,
1117
0, 0, 1, 1, 0.0, 0.0, GridBagConstraints.BOTH,
1118
LR_TOP_BOTTOM_PADDING);
1119
JTextField tf = new JTextField(50);
1120
tf.setPreferredSize(new Dimension(tf.getPreferredSize().width, TEXTFIELD_HEIGHT));
1121
tf.getAccessibleContext().setAccessibleName(
1122
PolicyTool.getMessage("Policy.File."));
1123
tf.setEditable(false);
1124
addNewComponent(this, tf, MW_FILENAME_TEXTFIELD,
1125
1, 0, 1, 1, 0.0, 0.0, GridBagConstraints.BOTH,
1126
LR_TOP_BOTTOM_PADDING);
1127
1128
1129
// add ADD/REMOVE/EDIT buttons in a new panel
1130
JPanel panel = new JPanel();
1131
panel.setLayout(new GridBagLayout());
1132
1133
JButton button = new JButton();
1134
configureButton(button, ADD_POLICY_ENTRY);
1135
button.addActionListener(new MainWindowListener(tool, this));
1136
addNewComponent(panel, button, MW_ADD_BUTTON,
1137
0, 0, 1, 1, 0.0, 0.0, GridBagConstraints.BOTH,
1138
LR_PADDING);
1139
1140
button = new JButton();
1141
configureButton(button, EDIT_POLICY_ENTRY);
1142
button.addActionListener(new MainWindowListener(tool, this));
1143
addNewComponent(panel, button, MW_EDIT_BUTTON,
1144
1, 0, 1, 1, 0.0, 0.0, GridBagConstraints.BOTH,
1145
LR_PADDING);
1146
1147
button = new JButton();
1148
configureButton(button, REMOVE_POLICY_ENTRY);
1149
button.addActionListener(new MainWindowListener(tool, this));
1150
addNewComponent(panel, button, MW_REMOVE_BUTTON,
1151
2, 0, 1, 1, 0.0, 0.0, GridBagConstraints.BOTH,
1152
LR_PADDING);
1153
1154
addNewComponent(this, panel, MW_PANEL,
1155
0, 2, 2, 1, 0.0, 0.0, GridBagConstraints.BOTH,
1156
BOTTOM_PADDING);
1157
1158
1159
String policyFile = tool.getPolicyFileName();
1160
if (policyFile == null) {
1161
String userHome;
1162
userHome = java.security.AccessController.doPrivileged(
1163
new sun.security.action.GetPropertyAction("user.home"));
1164
policyFile = userHome + File.separatorChar + ".java.policy";
1165
}
1166
1167
try {
1168
// open the policy file
1169
tool.openPolicy(policyFile);
1170
1171
// display the policy entries via the policy list textarea
1172
DefaultListModel listModel = new DefaultListModel();
1173
JList list = new JList(listModel);
1174
list.setVisibleRowCount(15);
1175
list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
1176
list.addMouseListener(new PolicyListListener(tool, this));
1177
PolicyEntry entries[] = tool.getEntry();
1178
if (entries != null) {
1179
for (int i = 0; i < entries.length; i++) {
1180
listModel.addElement(entries[i].headerToString());
1181
}
1182
}
1183
JTextField newFilename = (JTextField)
1184
getComponent(MW_FILENAME_TEXTFIELD);
1185
newFilename.setText(policyFile);
1186
initPolicyList(list);
1187
1188
} catch (FileNotFoundException fnfe) {
1189
// add blank policy listing
1190
JList list = new JList(new DefaultListModel());
1191
list.setVisibleRowCount(15);
1192
list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
1193
list.addMouseListener(new PolicyListListener(tool, this));
1194
initPolicyList(list);
1195
tool.setPolicyFileName(null);
1196
tool.modified = false;
1197
1198
// just add warning
1199
tool.warnings.addElement(fnfe.toString());
1200
1201
} catch (Exception e) {
1202
// add blank policy listing
1203
JList list = new JList(new DefaultListModel());
1204
list.setVisibleRowCount(15);
1205
list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
1206
list.addMouseListener(new PolicyListListener(tool, this));
1207
initPolicyList(list);
1208
tool.setPolicyFileName(null);
1209
tool.modified = false;
1210
1211
// display the error
1212
MessageFormat form = new MessageFormat(PolicyTool.getMessage
1213
("Could.not.open.policy.file.policyFile.e.toString."));
1214
Object[] source = {policyFile, e.toString()};
1215
displayErrorDialog(null, form.format(source));
1216
}
1217
}
1218
1219
1220
// Platform specific modifier (control / command).
1221
private int shortCutModifier = Toolkit.getDefaultToolkit().getMenuShortcutKeyMask();
1222
1223
private void addMenuItem(JMenu menu, String key, ActionListener actionListener, String accelerator) {
1224
JMenuItem menuItem = new JMenuItem();
1225
configureButton(menuItem, key);
1226
1227
if (PolicyTool.rb.containsKey(key + ".accelerator")) {
1228
// Accelerator from resources takes precedence
1229
accelerator = PolicyTool.getMessage(key + ".accelerator");
1230
}
1231
1232
if (accelerator != null && !accelerator.isEmpty()) {
1233
KeyStroke keyStroke;
1234
if (accelerator.length() == 1) {
1235
keyStroke = KeyStroke.getKeyStroke(KeyEvent.getExtendedKeyCodeForChar(accelerator.charAt(0)),
1236
shortCutModifier);
1237
} else {
1238
keyStroke = KeyStroke.getKeyStroke(accelerator);
1239
}
1240
menuItem.setAccelerator(keyStroke);
1241
}
1242
1243
menuItem.addActionListener(actionListener);
1244
menu.add(menuItem);
1245
}
1246
1247
static void configureButton(AbstractButton button, String key) {
1248
button.setText(PolicyTool.getMessage(key));
1249
button.setActionCommand(key);
1250
1251
int mnemonicInt = PolicyTool.getMnemonicInt(key);
1252
if (mnemonicInt > 0) {
1253
button.setMnemonic(mnemonicInt);
1254
button.setDisplayedMnemonicIndex(PolicyTool.getDisplayedMnemonicIndex(key));
1255
}
1256
}
1257
1258
static void configureLabelFor(JLabel label, JComponent component, String key) {
1259
label.setText(PolicyTool.getMessage(key));
1260
label.setLabelFor(component);
1261
1262
int mnemonicInt = PolicyTool.getMnemonicInt(key);
1263
if (mnemonicInt > 0) {
1264
label.setDisplayedMnemonic(mnemonicInt);
1265
label.setDisplayedMnemonicIndex(PolicyTool.getDisplayedMnemonicIndex(key));
1266
}
1267
}
1268
1269
1270
/**
1271
* Add a component to the PolicyTool window
1272
*/
1273
void addNewComponent(Container container, JComponent component,
1274
int index, int gridx, int gridy, int gridwidth, int gridheight,
1275
double weightx, double weighty, int fill, Insets is) {
1276
1277
if (container instanceof JFrame) {
1278
container = ((JFrame)container).getContentPane();
1279
} else if (container instanceof JDialog) {
1280
container = ((JDialog)container).getContentPane();
1281
}
1282
1283
// add the component at the specified gridbag index
1284
container.add(component, index);
1285
1286
// set the constraints
1287
GridBagLayout gbl = (GridBagLayout)container.getLayout();
1288
GridBagConstraints gbc = new GridBagConstraints();
1289
gbc.gridx = gridx;
1290
gbc.gridy = gridy;
1291
gbc.gridwidth = gridwidth;
1292
gbc.gridheight = gridheight;
1293
gbc.weightx = weightx;
1294
gbc.weighty = weighty;
1295
gbc.fill = fill;
1296
if (is != null) gbc.insets = is;
1297
gbl.setConstraints(component, gbc);
1298
}
1299
1300
1301
/**
1302
* Add a component to the PolicyTool window without external padding
1303
*/
1304
void addNewComponent(Container container, JComponent component,
1305
int index, int gridx, int gridy, int gridwidth, int gridheight,
1306
double weightx, double weighty, int fill) {
1307
1308
// delegate with "null" external padding
1309
addNewComponent(container, component, index, gridx, gridy,
1310
gridwidth, gridheight, weightx, weighty,
1311
fill, null);
1312
}
1313
1314
1315
/**
1316
* Init the policy_entry_list TEXTAREA component in the
1317
* PolicyTool window
1318
*/
1319
void initPolicyList(JList policyList) {
1320
1321
// add the policy list to the window
1322
//policyList.setPreferredSize(new Dimension(500, 350));
1323
JScrollPane scrollPane = new JScrollPane(policyList);
1324
addNewComponent(this, scrollPane, MW_POLICY_LIST,
1325
0, 3, 2, 1, 1.0, 1.0, GridBagConstraints.BOTH);
1326
}
1327
1328
/**
1329
* Replace the policy_entry_list TEXTAREA component in the
1330
* PolicyTool window with an updated one.
1331
*/
1332
void replacePolicyList(JList policyList) {
1333
1334
// remove the original list of Policy Entries
1335
// and add the new list of entries
1336
JList list = (JList)getComponent(MW_POLICY_LIST);
1337
list.setModel(policyList.getModel());
1338
}
1339
1340
/**
1341
* display the main PolicyTool window
1342
*/
1343
void displayToolWindow(String args[]) {
1344
1345
setTitle(PolicyTool.getMessage("Policy.Tool"));
1346
setResizable(true);
1347
addWindowListener(new ToolWindowListener(tool, this));
1348
//setBounds(135, 80, 500, 500);
1349
getContentPane().setLayout(new GridBagLayout());
1350
1351
initWindow();
1352
pack();
1353
setLocationRelativeTo(null);
1354
1355
// display it
1356
setVisible(true);
1357
1358
if (tool.newWarning == true) {
1359
displayStatusDialog(this, PolicyTool.getMessage
1360
("Errors.have.occurred.while.opening.the.policy.configuration.View.the.Warning.Log.for.more.information."));
1361
}
1362
}
1363
1364
/**
1365
* displays a dialog box describing an error which occurred.
1366
*/
1367
void displayErrorDialog(Window w, String error) {
1368
ToolDialog ed = new ToolDialog
1369
(PolicyTool.getMessage("Error"), tool, this, true);
1370
1371
// find where the PolicyTool gui is
1372
Point location = ((w == null) ?
1373
getLocationOnScreen() : w.getLocationOnScreen());
1374
//ed.setBounds(location.x + 50, location.y + 50, 600, 100);
1375
ed.setLayout(new GridBagLayout());
1376
1377
JLabel label = new JLabel(error);
1378
addNewComponent(ed, label, 0,
1379
0, 0, 1, 1, 0.0, 0.0, GridBagConstraints.BOTH);
1380
1381
JButton okButton = new JButton(PolicyTool.getMessage("OK"));
1382
ActionListener okListener = new ErrorOKButtonListener(ed);
1383
okButton.addActionListener(okListener);
1384
addNewComponent(ed, okButton, 1,
1385
0, 1, 1, 1, 0.0, 0.0, GridBagConstraints.VERTICAL);
1386
1387
ed.getRootPane().setDefaultButton(okButton);
1388
ed.getRootPane().registerKeyboardAction(okListener, escKey, JComponent.WHEN_IN_FOCUSED_WINDOW);
1389
1390
ed.pack();
1391
ed.setLocationRelativeTo(w);
1392
ed.setVisible(true);
1393
}
1394
1395
/**
1396
* displays a dialog box describing an error which occurred.
1397
*/
1398
void displayErrorDialog(Window w, Throwable t) {
1399
if (t instanceof NoDisplayException) {
1400
return;
1401
}
1402
displayErrorDialog(w, t.toString());
1403
}
1404
1405
/**
1406
* displays a dialog box describing the status of an event
1407
*/
1408
void displayStatusDialog(Window w, String status) {
1409
ToolDialog sd = new ToolDialog
1410
(PolicyTool.getMessage("Status"), tool, this, true);
1411
1412
// find the location of the PolicyTool gui
1413
Point location = ((w == null) ?
1414
getLocationOnScreen() : w.getLocationOnScreen());
1415
//sd.setBounds(location.x + 50, location.y + 50, 500, 100);
1416
sd.setLayout(new GridBagLayout());
1417
1418
JLabel label = new JLabel(status);
1419
addNewComponent(sd, label, 0,
1420
0, 0, 1, 1, 0.0, 0.0, GridBagConstraints.BOTH);
1421
1422
JButton okButton = new JButton(PolicyTool.getMessage("OK"));
1423
ActionListener okListener = new StatusOKButtonListener(sd);
1424
okButton.addActionListener(okListener);
1425
addNewComponent(sd, okButton, 1,
1426
0, 1, 1, 1, 0.0, 0.0, GridBagConstraints.VERTICAL);
1427
1428
sd.getRootPane().setDefaultButton(okButton);
1429
sd.getRootPane().registerKeyboardAction(okListener, escKey, JComponent.WHEN_IN_FOCUSED_WINDOW);
1430
1431
sd.pack();
1432
sd.setLocationRelativeTo(w);
1433
sd.setVisible(true);
1434
}
1435
1436
/**
1437
* display the warning log
1438
*/
1439
void displayWarningLog(Window w) {
1440
1441
ToolDialog wd = new ToolDialog
1442
(PolicyTool.getMessage("Warning"), tool, this, true);
1443
1444
// find the location of the PolicyTool gui
1445
Point location = ((w == null) ?
1446
getLocationOnScreen() : w.getLocationOnScreen());
1447
//wd.setBounds(location.x + 50, location.y + 50, 500, 100);
1448
wd.setLayout(new GridBagLayout());
1449
1450
JTextArea ta = new JTextArea();
1451
ta.setEditable(false);
1452
for (int i = 0; i < tool.warnings.size(); i++) {
1453
ta.append(tool.warnings.elementAt(i));
1454
ta.append(PolicyTool.getMessage("NEWLINE"));
1455
}
1456
addNewComponent(wd, ta, 0,
1457
0, 0, 1, 1, 0.0, 0.0, GridBagConstraints.BOTH,
1458
BOTTOM_PADDING);
1459
ta.setFocusable(false);
1460
1461
JButton okButton = new JButton(PolicyTool.getMessage("OK"));
1462
ActionListener okListener = new CancelButtonListener(wd);
1463
okButton.addActionListener(okListener);
1464
addNewComponent(wd, okButton, 1,
1465
0, 1, 1, 1, 0.0, 0.0, GridBagConstraints.VERTICAL,
1466
LR_PADDING);
1467
1468
wd.getRootPane().setDefaultButton(okButton);
1469
wd.getRootPane().registerKeyboardAction(okListener, escKey, JComponent.WHEN_IN_FOCUSED_WINDOW);
1470
1471
wd.pack();
1472
wd.setLocationRelativeTo(w);
1473
wd.setVisible(true);
1474
}
1475
1476
char displayYesNoDialog(Window w, String title, String prompt, String yes, String no) {
1477
1478
final ToolDialog tw = new ToolDialog
1479
(title, tool, this, true);
1480
Point location = ((w == null) ?
1481
getLocationOnScreen() : w.getLocationOnScreen());
1482
//tw.setBounds(location.x + 75, location.y + 100, 400, 150);
1483
tw.setLayout(new GridBagLayout());
1484
1485
JTextArea ta = new JTextArea(prompt, 10, 50);
1486
ta.setEditable(false);
1487
ta.setLineWrap(true);
1488
ta.setWrapStyleWord(true);
1489
JScrollPane scrollPane = new JScrollPane(ta,
1490
JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
1491
JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
1492
addNewComponent(tw, scrollPane, 0,
1493
0, 0, 1, 1, 0.0, 0.0, GridBagConstraints.BOTH);
1494
ta.setFocusable(false);
1495
1496
JPanel panel = new JPanel();
1497
panel.setLayout(new GridBagLayout());
1498
1499
// StringBuffer to store button press. Must be final.
1500
final StringBuffer chooseResult = new StringBuffer();
1501
1502
JButton button = new JButton(yes);
1503
button.addActionListener(new ActionListener() {
1504
public void actionPerformed(ActionEvent e) {
1505
chooseResult.append('Y');
1506
tw.setVisible(false);
1507
tw.dispose();
1508
}
1509
});
1510
addNewComponent(panel, button, 0,
1511
0, 0, 1, 1, 0.0, 0.0, GridBagConstraints.VERTICAL,
1512
LR_PADDING);
1513
1514
button = new JButton(no);
1515
button.addActionListener(new ActionListener() {
1516
public void actionPerformed(ActionEvent e) {
1517
chooseResult.append('N');
1518
tw.setVisible(false);
1519
tw.dispose();
1520
}
1521
});
1522
addNewComponent(panel, button, 1,
1523
1, 0, 1, 1, 0.0, 0.0, GridBagConstraints.VERTICAL,
1524
LR_PADDING);
1525
1526
addNewComponent(tw, panel, 1,
1527
0, 1, 1, 1, 0.0, 0.0, GridBagConstraints.VERTICAL);
1528
1529
tw.pack();
1530
tw.setLocationRelativeTo(w);
1531
tw.setVisible(true);
1532
if (chooseResult.length() > 0) {
1533
return chooseResult.charAt(0);
1534
} else {
1535
// I did encounter this once, don't why.
1536
return 'N';
1537
}
1538
}
1539
1540
}
1541
1542
/**
1543
* General dialog window
1544
*/
1545
class ToolDialog extends JDialog {
1546
// use serialVersionUID from JDK 1.2.2 for interoperability
1547
private static final long serialVersionUID = -372244357011301190L;
1548
1549
/* ESCAPE key */
1550
static final KeyStroke escKey = KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0);
1551
1552
/* necessary constants */
1553
public static final int NOACTION = 0;
1554
public static final int QUIT = 1;
1555
public static final int NEW = 2;
1556
public static final int OPEN = 3;
1557
1558
public static final String ALL_PERM_CLASS =
1559
"java.security.AllPermission";
1560
public static final String FILE_PERM_CLASS =
1561
"java.io.FilePermission";
1562
1563
public static final String X500_PRIN_CLASS =
1564
"javax.security.auth.x500.X500Principal";
1565
1566
/* popup menus */
1567
public static final String PERM =
1568
PolicyTool.getMessage
1569
("Permission.");
1570
1571
public static final String PRIN_TYPE =
1572
PolicyTool.getMessage("Principal.Type.");
1573
public static final String PRIN_NAME =
1574
PolicyTool.getMessage("Principal.Name.");
1575
1576
/* more popu menus */
1577
public static final String PERM_NAME =
1578
PolicyTool.getMessage
1579
("Target.Name.");
1580
1581
/* and more popup menus */
1582
public static final String PERM_ACTIONS =
1583
PolicyTool.getMessage
1584
("Actions.");
1585
1586
/* gridbag index for display PolicyEntry (PE) components */
1587
public static final int PE_CODEBASE_LABEL = 0;
1588
public static final int PE_CODEBASE_TEXTFIELD = 1;
1589
public static final int PE_SIGNEDBY_LABEL = 2;
1590
public static final int PE_SIGNEDBY_TEXTFIELD = 3;
1591
1592
public static final int PE_PANEL0 = 4;
1593
public static final int PE_ADD_PRIN_BUTTON = 0;
1594
public static final int PE_EDIT_PRIN_BUTTON = 1;
1595
public static final int PE_REMOVE_PRIN_BUTTON = 2;
1596
1597
public static final int PE_PRIN_LABEL = 5;
1598
public static final int PE_PRIN_LIST = 6;
1599
1600
public static final int PE_PANEL1 = 7;
1601
public static final int PE_ADD_PERM_BUTTON = 0;
1602
public static final int PE_EDIT_PERM_BUTTON = 1;
1603
public static final int PE_REMOVE_PERM_BUTTON = 2;
1604
1605
public static final int PE_PERM_LIST = 8;
1606
1607
public static final int PE_PANEL2 = 9;
1608
public static final int PE_CANCEL_BUTTON = 1;
1609
public static final int PE_DONE_BUTTON = 0;
1610
1611
/* the gridbag index for components in the Principal Dialog (PRD) */
1612
public static final int PRD_DESC_LABEL = 0;
1613
public static final int PRD_PRIN_CHOICE = 1;
1614
public static final int PRD_PRIN_TEXTFIELD = 2;
1615
public static final int PRD_NAME_LABEL = 3;
1616
public static final int PRD_NAME_TEXTFIELD = 4;
1617
public static final int PRD_CANCEL_BUTTON = 6;
1618
public static final int PRD_OK_BUTTON = 5;
1619
1620
/* the gridbag index for components in the Permission Dialog (PD) */
1621
public static final int PD_DESC_LABEL = 0;
1622
public static final int PD_PERM_CHOICE = 1;
1623
public static final int PD_PERM_TEXTFIELD = 2;
1624
public static final int PD_NAME_CHOICE = 3;
1625
public static final int PD_NAME_TEXTFIELD = 4;
1626
public static final int PD_ACTIONS_CHOICE = 5;
1627
public static final int PD_ACTIONS_TEXTFIELD = 6;
1628
public static final int PD_SIGNEDBY_LABEL = 7;
1629
public static final int PD_SIGNEDBY_TEXTFIELD = 8;
1630
public static final int PD_CANCEL_BUTTON = 10;
1631
public static final int PD_OK_BUTTON = 9;
1632
1633
/* modes for KeyStore */
1634
public static final int EDIT_KEYSTORE = 0;
1635
1636
/* the gridbag index for components in the Change KeyStore Dialog (KSD) */
1637
public static final int KSD_NAME_LABEL = 0;
1638
public static final int KSD_NAME_TEXTFIELD = 1;
1639
public static final int KSD_TYPE_LABEL = 2;
1640
public static final int KSD_TYPE_TEXTFIELD = 3;
1641
public static final int KSD_PROVIDER_LABEL = 4;
1642
public static final int KSD_PROVIDER_TEXTFIELD = 5;
1643
public static final int KSD_PWD_URL_LABEL = 6;
1644
public static final int KSD_PWD_URL_TEXTFIELD = 7;
1645
public static final int KSD_CANCEL_BUTTON = 9;
1646
public static final int KSD_OK_BUTTON = 8;
1647
1648
/* the gridbag index for components in the User Save Changes Dialog (USC) */
1649
public static final int USC_LABEL = 0;
1650
public static final int USC_PANEL = 1;
1651
public static final int USC_YES_BUTTON = 0;
1652
public static final int USC_NO_BUTTON = 1;
1653
public static final int USC_CANCEL_BUTTON = 2;
1654
1655
/* gridbag index for the ConfirmRemovePolicyEntryDialog (CRPE) */
1656
public static final int CRPE_LABEL1 = 0;
1657
public static final int CRPE_LABEL2 = 1;
1658
public static final int CRPE_PANEL = 2;
1659
public static final int CRPE_PANEL_OK = 0;
1660
public static final int CRPE_PANEL_CANCEL = 1;
1661
1662
/* some private static finals */
1663
private static final int PERMISSION = 0;
1664
private static final int PERMISSION_NAME = 1;
1665
private static final int PERMISSION_ACTIONS = 2;
1666
private static final int PERMISSION_SIGNEDBY = 3;
1667
private static final int PRINCIPAL_TYPE = 4;
1668
private static final int PRINCIPAL_NAME = 5;
1669
1670
/* The preferred height of JTextField should match JComboBox. */
1671
static final int TEXTFIELD_HEIGHT = new JComboBox().getPreferredSize().height;
1672
1673
public static java.util.ArrayList<Perm> PERM_ARRAY;
1674
public static java.util.ArrayList<Prin> PRIN_ARRAY;
1675
PolicyTool tool;
1676
ToolWindow tw;
1677
1678
static {
1679
1680
// set up permission objects
1681
1682
PERM_ARRAY = new java.util.ArrayList<Perm>();
1683
PERM_ARRAY.add(new AllPerm());
1684
PERM_ARRAY.add(new AudioPerm());
1685
PERM_ARRAY.add(new AuthPerm());
1686
PERM_ARRAY.add(new AWTPerm());
1687
PERM_ARRAY.add(new DelegationPerm());
1688
PERM_ARRAY.add(new FilePerm());
1689
PERM_ARRAY.add(new URLPerm());
1690
PERM_ARRAY.add(new InqSecContextPerm());
1691
PERM_ARRAY.add(new LogPerm());
1692
PERM_ARRAY.add(new MgmtPerm());
1693
PERM_ARRAY.add(new MBeanPerm());
1694
PERM_ARRAY.add(new MBeanSvrPerm());
1695
PERM_ARRAY.add(new MBeanTrustPerm());
1696
PERM_ARRAY.add(new NetPerm());
1697
PERM_ARRAY.add(new PrivCredPerm());
1698
PERM_ARRAY.add(new PropPerm());
1699
PERM_ARRAY.add(new ReflectPerm());
1700
PERM_ARRAY.add(new RuntimePerm());
1701
PERM_ARRAY.add(new SecurityPerm());
1702
PERM_ARRAY.add(new SerialPerm());
1703
PERM_ARRAY.add(new ServicePerm());
1704
PERM_ARRAY.add(new SocketPerm());
1705
PERM_ARRAY.add(new SQLPerm());
1706
PERM_ARRAY.add(new SSLPerm());
1707
PERM_ARRAY.add(new SubjDelegPerm());
1708
1709
// set up principal objects
1710
1711
PRIN_ARRAY = new java.util.ArrayList<Prin>();
1712
PRIN_ARRAY.add(new KrbPrin());
1713
PRIN_ARRAY.add(new X500Prin());
1714
}
1715
1716
ToolDialog(String title, PolicyTool tool, ToolWindow tw, boolean modal) {
1717
super(tw, modal);
1718
setTitle(title);
1719
this.tool = tool;
1720
this.tw = tw;
1721
addWindowListener(new ChildWindowListener(this));
1722
1723
// Create some space around components
1724
((JPanel)getContentPane()).setBorder(new EmptyBorder(6, 6, 6, 6));
1725
}
1726
1727
/**
1728
* Don't call getComponent directly on the window
1729
*/
1730
public Component getComponent(int n) {
1731
Component c = getContentPane().getComponent(n);
1732
if (c instanceof JScrollPane) {
1733
c = ((JScrollPane)c).getViewport().getView();
1734
}
1735
return c;
1736
}
1737
1738
/**
1739
* get the Perm instance based on either the (shortened) class name
1740
* or the fully qualified class name
1741
*/
1742
static Perm getPerm(String clazz, boolean fullClassName) {
1743
for (int i = 0; i < PERM_ARRAY.size(); i++) {
1744
Perm next = PERM_ARRAY.get(i);
1745
if (fullClassName) {
1746
if (next.FULL_CLASS.equals(clazz)) {
1747
return next;
1748
}
1749
} else {
1750
if (next.CLASS.equals(clazz)) {
1751
return next;
1752
}
1753
}
1754
}
1755
return null;
1756
}
1757
1758
/**
1759
* get the Prin instance based on either the (shortened) class name
1760
* or the fully qualified class name
1761
*/
1762
static Prin getPrin(String clazz, boolean fullClassName) {
1763
for (int i = 0; i < PRIN_ARRAY.size(); i++) {
1764
Prin next = PRIN_ARRAY.get(i);
1765
if (fullClassName) {
1766
if (next.FULL_CLASS.equals(clazz)) {
1767
return next;
1768
}
1769
} else {
1770
if (next.CLASS.equals(clazz)) {
1771
return next;
1772
}
1773
}
1774
}
1775
return null;
1776
}
1777
1778
/**
1779
* pop up a dialog so the user can enter info to add a new PolicyEntry
1780
* - if edit is TRUE, then the user is editing an existing entry
1781
* and we should display the original info as well.
1782
*
1783
* - the other reason we need the 'edit' boolean is we need to know
1784
* when we are adding a NEW policy entry. in this case, we can
1785
* not simply update the existing entry, because it doesn't exist.
1786
* we ONLY update the GUI listing/info, and then when the user
1787
* finally clicks 'OK' or 'DONE', then we can collect that info
1788
* and add it to the policy.
1789
*/
1790
void displayPolicyEntryDialog(boolean edit) {
1791
1792
int listIndex = 0;
1793
PolicyEntry entries[] = null;
1794
TaggedList prinList = new TaggedList(3, false);
1795
prinList.getAccessibleContext().setAccessibleName(
1796
PolicyTool.getMessage("Principal.List"));
1797
prinList.addMouseListener
1798
(new EditPrinButtonListener(tool, tw, this, edit));
1799
TaggedList permList = new TaggedList(10, false);
1800
permList.getAccessibleContext().setAccessibleName(
1801
PolicyTool.getMessage("Permission.List"));
1802
permList.addMouseListener
1803
(new EditPermButtonListener(tool, tw, this, edit));
1804
1805
// find where the PolicyTool gui is
1806
Point location = tw.getLocationOnScreen();
1807
//setBounds(location.x + 75, location.y + 200, 650, 500);
1808
setLayout(new GridBagLayout());
1809
setResizable(true);
1810
1811
if (edit) {
1812
// get the selected item
1813
entries = tool.getEntry();
1814
JList policyList = (JList)tw.getComponent(ToolWindow.MW_POLICY_LIST);
1815
listIndex = policyList.getSelectedIndex();
1816
1817
// get principal list
1818
LinkedList<PolicyParser.PrincipalEntry> principals =
1819
entries[listIndex].getGrantEntry().principals;
1820
for (int i = 0; i < principals.size(); i++) {
1821
String prinString = null;
1822
PolicyParser.PrincipalEntry nextPrin = principals.get(i);
1823
prinList.addTaggedItem(PrincipalEntryToUserFriendlyString(nextPrin), nextPrin);
1824
}
1825
1826
// get permission list
1827
Vector<PolicyParser.PermissionEntry> permissions =
1828
entries[listIndex].getGrantEntry().permissionEntries;
1829
for (int i = 0; i < permissions.size(); i++) {
1830
String permString = null;
1831
PolicyParser.PermissionEntry nextPerm =
1832
permissions.elementAt(i);
1833
permList.addTaggedItem(ToolDialog.PermissionEntryToUserFriendlyString(nextPerm), nextPerm);
1834
}
1835
}
1836
1837
// codebase label and textfield
1838
JLabel label = new JLabel();
1839
tw.addNewComponent(this, label, PE_CODEBASE_LABEL,
1840
0, 0, 1, 1, 0.0, 0.0, GridBagConstraints.BOTH,
1841
ToolWindow.R_PADDING);
1842
JTextField tf;
1843
tf = (edit ?
1844
new JTextField(entries[listIndex].getGrantEntry().codeBase) :
1845
new JTextField());
1846
ToolWindow.configureLabelFor(label, tf, "CodeBase.");
1847
tf.setPreferredSize(new Dimension(tf.getPreferredSize().width, TEXTFIELD_HEIGHT));
1848
tf.getAccessibleContext().setAccessibleName(
1849
PolicyTool.getMessage("Code.Base"));
1850
tw.addNewComponent(this, tf, PE_CODEBASE_TEXTFIELD,
1851
1, 0, 1, 1, 1.0, 0.0, GridBagConstraints.BOTH);
1852
1853
// signedby label and textfield
1854
label = new JLabel();
1855
tw.addNewComponent(this, label, PE_SIGNEDBY_LABEL,
1856
0, 1, 1, 1, 0.0, 0.0, GridBagConstraints.BOTH,
1857
ToolWindow.R_PADDING);
1858
tf = (edit ?
1859
new JTextField(entries[listIndex].getGrantEntry().signedBy) :
1860
new JTextField());
1861
ToolWindow.configureLabelFor(label, tf, "SignedBy.");
1862
tf.setPreferredSize(new Dimension(tf.getPreferredSize().width, TEXTFIELD_HEIGHT));
1863
tf.getAccessibleContext().setAccessibleName(
1864
PolicyTool.getMessage("Signed.By."));
1865
tw.addNewComponent(this, tf, PE_SIGNEDBY_TEXTFIELD,
1866
1, 1, 1, 1, 1.0, 0.0, GridBagConstraints.BOTH);
1867
1868
// panel for principal buttons
1869
JPanel panel = new JPanel();
1870
panel.setLayout(new GridBagLayout());
1871
1872
JButton button = new JButton();
1873
ToolWindow.configureButton(button, "Add.Principal");
1874
button.addActionListener
1875
(new AddPrinButtonListener(tool, tw, this, edit));
1876
tw.addNewComponent(panel, button, PE_ADD_PRIN_BUTTON,
1877
0, 0, 1, 1, 100.0, 0.0, GridBagConstraints.HORIZONTAL);
1878
1879
button = new JButton();
1880
ToolWindow.configureButton(button, "Edit.Principal");
1881
button.addActionListener(new EditPrinButtonListener
1882
(tool, tw, this, edit));
1883
tw.addNewComponent(panel, button, PE_EDIT_PRIN_BUTTON,
1884
1, 0, 1, 1, 100.0, 0.0, GridBagConstraints.HORIZONTAL);
1885
1886
button = new JButton();
1887
ToolWindow.configureButton(button, "Remove.Principal");
1888
button.addActionListener(new RemovePrinButtonListener
1889
(tool, tw, this, edit));
1890
tw.addNewComponent(panel, button, PE_REMOVE_PRIN_BUTTON,
1891
2, 0, 1, 1, 100.0, 0.0, GridBagConstraints.HORIZONTAL);
1892
1893
tw.addNewComponent(this, panel, PE_PANEL0,
1894
1, 2, 1, 1, 0.0, 0.0, GridBagConstraints.HORIZONTAL,
1895
ToolWindow.LITE_BOTTOM_PADDING);
1896
1897
// principal label and list
1898
label = new JLabel();
1899
tw.addNewComponent(this, label, PE_PRIN_LABEL,
1900
0, 3, 1, 1, 0.0, 0.0, GridBagConstraints.BOTH,
1901
ToolWindow.R_BOTTOM_PADDING);
1902
JScrollPane scrollPane = new JScrollPane(prinList);
1903
ToolWindow.configureLabelFor(label, scrollPane, "Principals.");
1904
tw.addNewComponent(this, scrollPane, PE_PRIN_LIST,
1905
1, 3, 3, 1, 0.0, prinList.getVisibleRowCount(), GridBagConstraints.BOTH,
1906
ToolWindow.BOTTOM_PADDING);
1907
1908
// panel for permission buttons
1909
panel = new JPanel();
1910
panel.setLayout(new GridBagLayout());
1911
1912
button = new JButton();
1913
ToolWindow.configureButton(button, ".Add.Permission");
1914
button.addActionListener(new AddPermButtonListener
1915
(tool, tw, this, edit));
1916
tw.addNewComponent(panel, button, PE_ADD_PERM_BUTTON,
1917
0, 0, 1, 1, 100.0, 0.0, GridBagConstraints.HORIZONTAL);
1918
1919
button = new JButton();
1920
ToolWindow.configureButton(button, ".Edit.Permission");
1921
button.addActionListener(new EditPermButtonListener
1922
(tool, tw, this, edit));
1923
tw.addNewComponent(panel, button, PE_EDIT_PERM_BUTTON,
1924
1, 0, 1, 1, 100.0, 0.0, GridBagConstraints.HORIZONTAL);
1925
1926
1927
button = new JButton();
1928
ToolWindow.configureButton(button, "Remove.Permission");
1929
button.addActionListener(new RemovePermButtonListener
1930
(tool, tw, this, edit));
1931
tw.addNewComponent(panel, button, PE_REMOVE_PERM_BUTTON,
1932
2, 0, 1, 1, 100.0, 0.0, GridBagConstraints.HORIZONTAL);
1933
1934
tw.addNewComponent(this, panel, PE_PANEL1,
1935
0, 4, 2, 1, 0.0, 0.0, GridBagConstraints.HORIZONTAL,
1936
ToolWindow.LITE_BOTTOM_PADDING);
1937
1938
// permission list
1939
scrollPane = new JScrollPane(permList);
1940
tw.addNewComponent(this, scrollPane, PE_PERM_LIST,
1941
0, 5, 3, 1, 0.0, permList.getVisibleRowCount(), GridBagConstraints.BOTH,
1942
ToolWindow.BOTTOM_PADDING);
1943
1944
1945
// panel for Done and Cancel buttons
1946
panel = new JPanel();
1947
panel.setLayout(new GridBagLayout());
1948
1949
// Done Button
1950
JButton okButton = new JButton(PolicyTool.getMessage("Done"));
1951
okButton.addActionListener
1952
(new AddEntryDoneButtonListener(tool, tw, this, edit));
1953
tw.addNewComponent(panel, okButton, PE_DONE_BUTTON,
1954
0, 0, 1, 1, 0.0, 0.0, GridBagConstraints.VERTICAL,
1955
ToolWindow.LR_PADDING);
1956
1957
// Cancel Button
1958
JButton cancelButton = new JButton(PolicyTool.getMessage("Cancel"));
1959
ActionListener cancelListener = new CancelButtonListener(this);
1960
cancelButton.addActionListener(cancelListener);
1961
tw.addNewComponent(panel, cancelButton, PE_CANCEL_BUTTON,
1962
1, 0, 1, 1, 0.0, 0.0, GridBagConstraints.VERTICAL,
1963
ToolWindow.LR_PADDING);
1964
1965
// add the panel
1966
tw.addNewComponent(this, panel, PE_PANEL2,
1967
0, 6, 2, 1, 0.0, 0.0, GridBagConstraints.VERTICAL);
1968
1969
getRootPane().setDefaultButton(okButton);
1970
getRootPane().registerKeyboardAction(cancelListener, escKey, JComponent.WHEN_IN_FOCUSED_WINDOW);
1971
1972
pack();
1973
setLocationRelativeTo(tw);
1974
setVisible(true);
1975
}
1976
1977
/**
1978
* Read all the Policy information data in the dialog box
1979
* and construct a PolicyEntry object with it.
1980
*/
1981
PolicyEntry getPolicyEntryFromDialog()
1982
throws InvalidParameterException, MalformedURLException,
1983
NoSuchMethodException, ClassNotFoundException, InstantiationException,
1984
IllegalAccessException, InvocationTargetException,
1985
CertificateException, IOException, Exception {
1986
1987
// get the Codebase
1988
JTextField tf = (JTextField)getComponent(PE_CODEBASE_TEXTFIELD);
1989
String codebase = null;
1990
if (tf.getText().trim().equals("") == false)
1991
codebase = new String(tf.getText().trim());
1992
1993
// get the SignedBy
1994
tf = (JTextField)getComponent(PE_SIGNEDBY_TEXTFIELD);
1995
String signedby = null;
1996
if (tf.getText().trim().equals("") == false)
1997
signedby = new String(tf.getText().trim());
1998
1999
// construct a new GrantEntry
2000
PolicyParser.GrantEntry ge =
2001
new PolicyParser.GrantEntry(signedby, codebase);
2002
2003
// get the new Principals
2004
LinkedList<PolicyParser.PrincipalEntry> prins = new LinkedList<>();
2005
TaggedList prinList = (TaggedList)getComponent(PE_PRIN_LIST);
2006
for (int i = 0; i < prinList.getModel().getSize(); i++) {
2007
prins.add((PolicyParser.PrincipalEntry)prinList.getObject(i));
2008
}
2009
ge.principals = prins;
2010
2011
// get the new Permissions
2012
Vector<PolicyParser.PermissionEntry> perms = new Vector<>();
2013
TaggedList permList = (TaggedList)getComponent(PE_PERM_LIST);
2014
for (int i = 0; i < permList.getModel().getSize(); i++) {
2015
perms.addElement((PolicyParser.PermissionEntry)permList.getObject(i));
2016
}
2017
ge.permissionEntries = perms;
2018
2019
// construct a new PolicyEntry object
2020
PolicyEntry entry = new PolicyEntry(tool, ge);
2021
2022
return entry;
2023
}
2024
2025
/**
2026
* display a dialog box for the user to enter KeyStore information
2027
*/
2028
void keyStoreDialog(int mode) {
2029
2030
// find where the PolicyTool gui is
2031
Point location = tw.getLocationOnScreen();
2032
//setBounds(location.x + 25, location.y + 100, 500, 300);
2033
setLayout(new GridBagLayout());
2034
2035
if (mode == EDIT_KEYSTORE) {
2036
2037
// KeyStore label and textfield
2038
JLabel label = new JLabel();
2039
tw.addNewComponent(this, label, KSD_NAME_LABEL,
2040
0, 0, 1, 1, 0.0, 0.0, GridBagConstraints.BOTH,
2041
ToolWindow.R_BOTTOM_PADDING);
2042
JTextField tf = new JTextField(tool.getKeyStoreName(), 30);
2043
ToolWindow.configureLabelFor(label, tf, "KeyStore.URL.");
2044
tf.setPreferredSize(new Dimension(tf.getPreferredSize().width, TEXTFIELD_HEIGHT));
2045
2046
// URL to U R L, so that accessibility reader will pronounce well
2047
tf.getAccessibleContext().setAccessibleName(
2048
PolicyTool.getMessage("KeyStore.U.R.L."));
2049
tw.addNewComponent(this, tf, KSD_NAME_TEXTFIELD,
2050
1, 0, 1, 1, 1.0, 0.0, GridBagConstraints.BOTH,
2051
ToolWindow.BOTTOM_PADDING);
2052
2053
// KeyStore type and textfield
2054
label = new JLabel();
2055
tw.addNewComponent(this, label, KSD_TYPE_LABEL,
2056
0, 1, 1, 1, 0.0, 0.0, GridBagConstraints.BOTH,
2057
ToolWindow.R_BOTTOM_PADDING);
2058
tf = new JTextField(tool.getKeyStoreType(), 30);
2059
ToolWindow.configureLabelFor(label, tf, "KeyStore.Type.");
2060
tf.setPreferredSize(new Dimension(tf.getPreferredSize().width, TEXTFIELD_HEIGHT));
2061
tf.getAccessibleContext().setAccessibleName(
2062
PolicyTool.getMessage("KeyStore.Type."));
2063
tw.addNewComponent(this, tf, KSD_TYPE_TEXTFIELD,
2064
1, 1, 1, 1, 1.0, 0.0, GridBagConstraints.BOTH,
2065
ToolWindow.BOTTOM_PADDING);
2066
2067
// KeyStore provider and textfield
2068
label = new JLabel();
2069
tw.addNewComponent(this, label, KSD_PROVIDER_LABEL,
2070
0, 2, 1, 1, 0.0, 0.0, GridBagConstraints.BOTH,
2071
ToolWindow.R_BOTTOM_PADDING);
2072
tf = new JTextField(tool.getKeyStoreProvider(), 30);
2073
ToolWindow.configureLabelFor(label, tf, "KeyStore.Provider.");
2074
tf.setPreferredSize(new Dimension(tf.getPreferredSize().width, TEXTFIELD_HEIGHT));
2075
tf.getAccessibleContext().setAccessibleName(
2076
PolicyTool.getMessage("KeyStore.Provider."));
2077
tw.addNewComponent(this, tf, KSD_PROVIDER_TEXTFIELD,
2078
1, 2, 1, 1, 1.0, 0.0, GridBagConstraints.BOTH,
2079
ToolWindow.BOTTOM_PADDING);
2080
2081
// KeyStore password URL and textfield
2082
label = new JLabel();
2083
tw.addNewComponent(this, label, KSD_PWD_URL_LABEL,
2084
0, 3, 1, 1, 0.0, 0.0, GridBagConstraints.BOTH,
2085
ToolWindow.R_BOTTOM_PADDING);
2086
tf = new JTextField(tool.getKeyStorePwdURL(), 30);
2087
ToolWindow.configureLabelFor(label, tf, "KeyStore.Password.URL.");
2088
tf.setPreferredSize(new Dimension(tf.getPreferredSize().width, TEXTFIELD_HEIGHT));
2089
tf.getAccessibleContext().setAccessibleName(
2090
PolicyTool.getMessage("KeyStore.Password.U.R.L."));
2091
tw.addNewComponent(this, tf, KSD_PWD_URL_TEXTFIELD,
2092
1, 3, 1, 1, 1.0, 0.0, GridBagConstraints.BOTH,
2093
ToolWindow.BOTTOM_PADDING);
2094
2095
// OK button
2096
JButton okButton = new JButton(PolicyTool.getMessage("OK"));
2097
okButton.addActionListener
2098
(new ChangeKeyStoreOKButtonListener(tool, tw, this));
2099
tw.addNewComponent(this, okButton, KSD_OK_BUTTON,
2100
0, 4, 1, 1, 0.0, 0.0, GridBagConstraints.VERTICAL);
2101
2102
// cancel button
2103
JButton cancelButton = new JButton(PolicyTool.getMessage("Cancel"));
2104
ActionListener cancelListener = new CancelButtonListener(this);
2105
cancelButton.addActionListener(cancelListener);
2106
tw.addNewComponent(this, cancelButton, KSD_CANCEL_BUTTON,
2107
1, 4, 1, 1, 0.0, 0.0, GridBagConstraints.VERTICAL);
2108
2109
getRootPane().setDefaultButton(okButton);
2110
getRootPane().registerKeyboardAction(cancelListener, escKey, JComponent.WHEN_IN_FOCUSED_WINDOW);
2111
}
2112
2113
pack();
2114
setLocationRelativeTo(tw);
2115
setVisible(true);
2116
}
2117
2118
/**
2119
* display a dialog box for the user to input Principal info
2120
*
2121
* if editPolicyEntry is false, then we are adding Principals to
2122
* a new PolicyEntry, and we only update the GUI listing
2123
* with the new Principal.
2124
*
2125
* if edit is true, then we are editing an existing Policy entry.
2126
*/
2127
void displayPrincipalDialog(boolean editPolicyEntry, boolean edit) {
2128
2129
PolicyParser.PrincipalEntry editMe = null;
2130
2131
// get the Principal selected from the Principal List
2132
TaggedList prinList = (TaggedList)getComponent(PE_PRIN_LIST);
2133
int prinIndex = prinList.getSelectedIndex();
2134
2135
if (edit) {
2136
editMe = (PolicyParser.PrincipalEntry)prinList.getObject(prinIndex);
2137
}
2138
2139
ToolDialog newTD = new ToolDialog
2140
(PolicyTool.getMessage("Principals"), tool, tw, true);
2141
newTD.addWindowListener(new ChildWindowListener(newTD));
2142
2143
// find where the PolicyTool gui is
2144
Point location = getLocationOnScreen();
2145
//newTD.setBounds(location.x + 50, location.y + 100, 650, 190);
2146
newTD.setLayout(new GridBagLayout());
2147
newTD.setResizable(true);
2148
2149
// description label
2150
JLabel label = (edit ?
2151
new JLabel(PolicyTool.getMessage(".Edit.Principal.")) :
2152
new JLabel(PolicyTool.getMessage(".Add.New.Principal.")));
2153
tw.addNewComponent(newTD, label, PRD_DESC_LABEL,
2154
0, 0, 1, 1, 0.0, 0.0, GridBagConstraints.BOTH,
2155
ToolWindow.TOP_BOTTOM_PADDING);
2156
2157
// principal choice
2158
JComboBox choice = new JComboBox();
2159
choice.addItem(PRIN_TYPE);
2160
choice.getAccessibleContext().setAccessibleName(PRIN_TYPE);
2161
for (int i = 0; i < PRIN_ARRAY.size(); i++) {
2162
Prin next = PRIN_ARRAY.get(i);
2163
choice.addItem(next.CLASS);
2164
}
2165
2166
if (edit) {
2167
if (PolicyParser.PrincipalEntry.WILDCARD_CLASS.equals
2168
(editMe.getPrincipalClass())) {
2169
choice.setSelectedItem(PRIN_TYPE);
2170
} else {
2171
Prin inputPrin = getPrin(editMe.getPrincipalClass(), true);
2172
if (inputPrin != null) {
2173
choice.setSelectedItem(inputPrin.CLASS);
2174
}
2175
}
2176
}
2177
// Add listener after selected item is set
2178
choice.addItemListener(new PrincipalTypeMenuListener(newTD));
2179
2180
tw.addNewComponent(newTD, choice, PRD_PRIN_CHOICE,
2181
0, 1, 1, 1, 0.0, 0.0, GridBagConstraints.BOTH,
2182
ToolWindow.LR_PADDING);
2183
2184
// principal textfield
2185
JTextField tf;
2186
tf = (edit ?
2187
new JTextField(editMe.getDisplayClass(), 30) :
2188
new JTextField(30));
2189
tf.setPreferredSize(new Dimension(tf.getPreferredSize().width, TEXTFIELD_HEIGHT));
2190
tf.getAccessibleContext().setAccessibleName(PRIN_TYPE);
2191
tw.addNewComponent(newTD, tf, PRD_PRIN_TEXTFIELD,
2192
1, 1, 1, 1, 1.0, 0.0, GridBagConstraints.BOTH,
2193
ToolWindow.LR_PADDING);
2194
2195
// name label and textfield
2196
label = new JLabel(PRIN_NAME);
2197
tf = (edit ?
2198
new JTextField(editMe.getDisplayName(), 40) :
2199
new JTextField(40));
2200
tf.setPreferredSize(new Dimension(tf.getPreferredSize().width, TEXTFIELD_HEIGHT));
2201
tf.getAccessibleContext().setAccessibleName(PRIN_NAME);
2202
2203
tw.addNewComponent(newTD, label, PRD_NAME_LABEL,
2204
0, 2, 1, 1, 0.0, 0.0, GridBagConstraints.BOTH,
2205
ToolWindow.LR_PADDING);
2206
tw.addNewComponent(newTD, tf, PRD_NAME_TEXTFIELD,
2207
1, 2, 1, 1, 1.0, 0.0, GridBagConstraints.BOTH,
2208
ToolWindow.LR_PADDING);
2209
2210
// OK button
2211
JButton okButton = new JButton(PolicyTool.getMessage("OK"));
2212
okButton.addActionListener(
2213
new NewPolicyPrinOKButtonListener
2214
(tool, tw, this, newTD, edit));
2215
tw.addNewComponent(newTD, okButton, PRD_OK_BUTTON,
2216
0, 3, 1, 1, 0.0, 0.0, GridBagConstraints.VERTICAL,
2217
ToolWindow.TOP_BOTTOM_PADDING);
2218
// cancel button
2219
JButton cancelButton = new JButton(PolicyTool.getMessage("Cancel"));
2220
ActionListener cancelListener = new CancelButtonListener(newTD);
2221
cancelButton.addActionListener(cancelListener);
2222
tw.addNewComponent(newTD, cancelButton, PRD_CANCEL_BUTTON,
2223
1, 3, 1, 1, 0.0, 0.0, GridBagConstraints.VERTICAL,
2224
ToolWindow.TOP_BOTTOM_PADDING);
2225
2226
newTD.getRootPane().setDefaultButton(okButton);
2227
newTD.getRootPane().registerKeyboardAction(cancelListener, escKey, JComponent.WHEN_IN_FOCUSED_WINDOW);
2228
2229
newTD.pack();
2230
newTD.setLocationRelativeTo(tw);
2231
newTD.setVisible(true);
2232
}
2233
2234
/**
2235
* display a dialog box for the user to input Permission info
2236
*
2237
* if editPolicyEntry is false, then we are adding Permissions to
2238
* a new PolicyEntry, and we only update the GUI listing
2239
* with the new Permission.
2240
*
2241
* if edit is true, then we are editing an existing Permission entry.
2242
*/
2243
void displayPermissionDialog(boolean editPolicyEntry, boolean edit) {
2244
2245
PolicyParser.PermissionEntry editMe = null;
2246
2247
// get the Permission selected from the Permission List
2248
TaggedList permList = (TaggedList)getComponent(PE_PERM_LIST);
2249
int permIndex = permList.getSelectedIndex();
2250
2251
if (edit) {
2252
editMe = (PolicyParser.PermissionEntry)permList.getObject(permIndex);
2253
}
2254
2255
ToolDialog newTD = new ToolDialog
2256
(PolicyTool.getMessage("Permissions"), tool, tw, true);
2257
newTD.addWindowListener(new ChildWindowListener(newTD));
2258
2259
// find where the PolicyTool gui is
2260
Point location = getLocationOnScreen();
2261
//newTD.setBounds(location.x + 50, location.y + 100, 700, 250);
2262
newTD.setLayout(new GridBagLayout());
2263
newTD.setResizable(true);
2264
2265
// description label
2266
JLabel label = (edit ?
2267
new JLabel(PolicyTool.getMessage(".Edit.Permission.")) :
2268
new JLabel(PolicyTool.getMessage(".Add.New.Permission.")));
2269
tw.addNewComponent(newTD, label, PD_DESC_LABEL,
2270
0, 0, 1, 1, 0.0, 0.0, GridBagConstraints.BOTH,
2271
ToolWindow.TOP_BOTTOM_PADDING);
2272
2273
// permission choice (added in alphabetical order)
2274
JComboBox choice = new JComboBox();
2275
choice.addItem(PERM);
2276
choice.getAccessibleContext().setAccessibleName(PERM);
2277
for (int i = 0; i < PERM_ARRAY.size(); i++) {
2278
Perm next = PERM_ARRAY.get(i);
2279
choice.addItem(next.CLASS);
2280
}
2281
tw.addNewComponent(newTD, choice, PD_PERM_CHOICE,
2282
0, 1, 1, 1, 0.0, 0.0, GridBagConstraints.BOTH,
2283
ToolWindow.LR_BOTTOM_PADDING);
2284
2285
// permission textfield
2286
JTextField tf;
2287
tf = (edit ? new JTextField(editMe.permission, 30) : new JTextField(30));
2288
tf.setPreferredSize(new Dimension(tf.getPreferredSize().width, TEXTFIELD_HEIGHT));
2289
tf.getAccessibleContext().setAccessibleName(PERM);
2290
if (edit) {
2291
Perm inputPerm = getPerm(editMe.permission, true);
2292
if (inputPerm != null) {
2293
choice.setSelectedItem(inputPerm.CLASS);
2294
}
2295
}
2296
tw.addNewComponent(newTD, tf, PD_PERM_TEXTFIELD,
2297
1, 1, 1, 1, 1.0, 0.0, GridBagConstraints.BOTH,
2298
ToolWindow.LR_BOTTOM_PADDING);
2299
choice.addItemListener(new PermissionMenuListener(newTD));
2300
2301
// name label and textfield
2302
choice = new JComboBox();
2303
choice.addItem(PERM_NAME);
2304
choice.getAccessibleContext().setAccessibleName(PERM_NAME);
2305
tf = (edit ? new JTextField(editMe.name, 40) : new JTextField(40));
2306
tf.setPreferredSize(new Dimension(tf.getPreferredSize().width, TEXTFIELD_HEIGHT));
2307
tf.getAccessibleContext().setAccessibleName(PERM_NAME);
2308
if (edit) {
2309
setPermissionNames(getPerm(editMe.permission, true), choice, tf);
2310
}
2311
tw.addNewComponent(newTD, choice, PD_NAME_CHOICE,
2312
0, 2, 1, 1, 0.0, 0.0, GridBagConstraints.BOTH,
2313
ToolWindow.LR_BOTTOM_PADDING);
2314
tw.addNewComponent(newTD, tf, PD_NAME_TEXTFIELD,
2315
1, 2, 1, 1, 1.0, 0.0, GridBagConstraints.BOTH,
2316
ToolWindow.LR_BOTTOM_PADDING);
2317
choice.addItemListener(new PermissionNameMenuListener(newTD));
2318
2319
// actions label and textfield
2320
choice = new JComboBox();
2321
choice.addItem(PERM_ACTIONS);
2322
choice.getAccessibleContext().setAccessibleName(PERM_ACTIONS);
2323
tf = (edit ? new JTextField(editMe.action, 40) : new JTextField(40));
2324
tf.setPreferredSize(new Dimension(tf.getPreferredSize().width, TEXTFIELD_HEIGHT));
2325
tf.getAccessibleContext().setAccessibleName(PERM_ACTIONS);
2326
if (edit) {
2327
setPermissionActions(getPerm(editMe.permission, true), choice, tf);
2328
}
2329
tw.addNewComponent(newTD, choice, PD_ACTIONS_CHOICE,
2330
0, 3, 1, 1, 0.0, 0.0, GridBagConstraints.BOTH,
2331
ToolWindow.LR_BOTTOM_PADDING);
2332
tw.addNewComponent(newTD, tf, PD_ACTIONS_TEXTFIELD,
2333
1, 3, 1, 1, 1.0, 0.0, GridBagConstraints.BOTH,
2334
ToolWindow.LR_BOTTOM_PADDING);
2335
choice.addItemListener(new PermissionActionsMenuListener(newTD));
2336
2337
// signedby label and textfield
2338
label = new JLabel(PolicyTool.getMessage("Signed.By."));
2339
tw.addNewComponent(newTD, label, PD_SIGNEDBY_LABEL,
2340
0, 4, 1, 1, 0.0, 0.0, GridBagConstraints.BOTH,
2341
ToolWindow.LR_BOTTOM_PADDING);
2342
tf = (edit ? new JTextField(editMe.signedBy, 40) : new JTextField(40));
2343
tf.setPreferredSize(new Dimension(tf.getPreferredSize().width, TEXTFIELD_HEIGHT));
2344
tf.getAccessibleContext().setAccessibleName(
2345
PolicyTool.getMessage("Signed.By."));
2346
tw.addNewComponent(newTD, tf, PD_SIGNEDBY_TEXTFIELD,
2347
1, 4, 1, 1, 1.0, 0.0, GridBagConstraints.BOTH,
2348
ToolWindow.LR_BOTTOM_PADDING);
2349
2350
// OK button
2351
JButton okButton = new JButton(PolicyTool.getMessage("OK"));
2352
okButton.addActionListener(
2353
new NewPolicyPermOKButtonListener
2354
(tool, tw, this, newTD, edit));
2355
tw.addNewComponent(newTD, okButton, PD_OK_BUTTON,
2356
0, 5, 1, 1, 0.0, 0.0, GridBagConstraints.VERTICAL,
2357
ToolWindow.TOP_BOTTOM_PADDING);
2358
2359
// cancel button
2360
JButton cancelButton = new JButton(PolicyTool.getMessage("Cancel"));
2361
ActionListener cancelListener = new CancelButtonListener(newTD);
2362
cancelButton.addActionListener(cancelListener);
2363
tw.addNewComponent(newTD, cancelButton, PD_CANCEL_BUTTON,
2364
1, 5, 1, 1, 0.0, 0.0, GridBagConstraints.VERTICAL,
2365
ToolWindow.TOP_BOTTOM_PADDING);
2366
2367
newTD.getRootPane().setDefaultButton(okButton);
2368
newTD.getRootPane().registerKeyboardAction(cancelListener, escKey, JComponent.WHEN_IN_FOCUSED_WINDOW);
2369
2370
newTD.pack();
2371
newTD.setLocationRelativeTo(tw);
2372
newTD.setVisible(true);
2373
}
2374
2375
/**
2376
* construct a Principal object from the Principal Info Dialog Box
2377
*/
2378
PolicyParser.PrincipalEntry getPrinFromDialog() throws Exception {
2379
2380
JTextField tf = (JTextField)getComponent(PRD_PRIN_TEXTFIELD);
2381
String pclass = new String(tf.getText().trim());
2382
tf = (JTextField)getComponent(PRD_NAME_TEXTFIELD);
2383
String pname = new String(tf.getText().trim());
2384
if (pclass.equals("*")) {
2385
pclass = PolicyParser.PrincipalEntry.WILDCARD_CLASS;
2386
}
2387
if (pname.equals("*")) {
2388
pname = PolicyParser.PrincipalEntry.WILDCARD_NAME;
2389
}
2390
2391
PolicyParser.PrincipalEntry pppe = null;
2392
2393
if ((pclass.equals(PolicyParser.PrincipalEntry.WILDCARD_CLASS)) &&
2394
(!pname.equals(PolicyParser.PrincipalEntry.WILDCARD_NAME))) {
2395
throw new Exception
2396
(PolicyTool.getMessage("Cannot.Specify.Principal.with.a.Wildcard.Class.without.a.Wildcard.Name"));
2397
} else if (pname.equals("")) {
2398
throw new Exception
2399
(PolicyTool.getMessage("Cannot.Specify.Principal.without.a.Name"));
2400
} else if (pclass.equals("")) {
2401
// make this consistent with what PolicyParser does
2402
// when it sees an empty principal class
2403
pclass = PolicyParser.PrincipalEntry.REPLACE_NAME;
2404
tool.warnings.addElement(
2405
"Warning: Principal name '" + pname +
2406
"' specified without a Principal class.\n" +
2407
"\t'" + pname + "' will be interpreted " +
2408
"as a key store alias.\n" +
2409
"\tThe final principal class will be " +
2410
ToolDialog.X500_PRIN_CLASS + ".\n" +
2411
"\tThe final principal name will be " +
2412
"determined by the following:\n" +
2413
"\n" +
2414
"\tIf the key store entry identified by '"
2415
+ pname + "'\n" +
2416
"\tis a key entry, then the principal name will be\n" +
2417
"\tthe subject distinguished name from the first\n" +
2418
"\tcertificate in the entry's certificate chain.\n" +
2419
"\n" +
2420
"\tIf the key store entry identified by '" +
2421
pname + "'\n" +
2422
"\tis a trusted certificate entry, then the\n" +
2423
"\tprincipal name will be the subject distinguished\n" +
2424
"\tname from the trusted public key certificate.");
2425
tw.displayStatusDialog(this,
2426
"'" + pname + "' will be interpreted as a key " +
2427
"store alias. View Warning Log for details.");
2428
}
2429
return new PolicyParser.PrincipalEntry(pclass, pname);
2430
}
2431
2432
2433
/**
2434
* construct a Permission object from the Permission Info Dialog Box
2435
*/
2436
PolicyParser.PermissionEntry getPermFromDialog() {
2437
2438
JTextField tf = (JTextField)getComponent(PD_PERM_TEXTFIELD);
2439
String permission = new String(tf.getText().trim());
2440
tf = (JTextField)getComponent(PD_NAME_TEXTFIELD);
2441
String name = null;
2442
if (tf.getText().trim().equals("") == false)
2443
name = new String(tf.getText().trim());
2444
if (permission.equals("") ||
2445
(!permission.equals(ALL_PERM_CLASS) && name == null)) {
2446
throw new InvalidParameterException(PolicyTool.getMessage
2447
("Permission.and.Target.Name.must.have.a.value"));
2448
}
2449
2450
// When the permission is FilePermission, we need to check the name
2451
// to make sure it's not escaped. We believe --
2452
//
2453
// String name.lastIndexOf("\\\\")
2454
// ---------------- ------------------------
2455
// c:\foo\bar -1, legal
2456
// c:\\foo\\bar 2, illegal
2457
// \\server\share 0, legal
2458
// \\\\server\share 2, illegal
2459
2460
if (permission.equals(FILE_PERM_CLASS) && name.lastIndexOf("\\\\") > 0) {
2461
char result = tw.displayYesNoDialog(this,
2462
PolicyTool.getMessage("Warning"),
2463
PolicyTool.getMessage(
2464
"Warning.File.name.may.include.escaped.backslash.characters.It.is.not.necessary.to.escape.backslash.characters.the.tool.escapes"),
2465
PolicyTool.getMessage("Retain"),
2466
PolicyTool.getMessage("Edit")
2467
);
2468
if (result != 'Y') {
2469
// an invisible exception
2470
throw new NoDisplayException();
2471
}
2472
}
2473
// get the Actions
2474
tf = (JTextField)getComponent(PD_ACTIONS_TEXTFIELD);
2475
String actions = null;
2476
if (tf.getText().trim().equals("") == false)
2477
actions = new String(tf.getText().trim());
2478
2479
// get the Signed By
2480
tf = (JTextField)getComponent(PD_SIGNEDBY_TEXTFIELD);
2481
String signedBy = null;
2482
if (tf.getText().trim().equals("") == false)
2483
signedBy = new String(tf.getText().trim());
2484
2485
PolicyParser.PermissionEntry pppe = new PolicyParser.PermissionEntry
2486
(permission, name, actions);
2487
pppe.signedBy = signedBy;
2488
2489
// see if the signers have public keys
2490
if (signedBy != null) {
2491
String signers[] = tool.parseSigners(pppe.signedBy);
2492
for (int i = 0; i < signers.length; i++) {
2493
try {
2494
PublicKey pubKey = tool.getPublicKeyAlias(signers[i]);
2495
if (pubKey == null) {
2496
MessageFormat form = new MessageFormat
2497
(PolicyTool.getMessage
2498
("Warning.A.public.key.for.alias.signers.i.does.not.exist.Make.sure.a.KeyStore.is.properly.configured."));
2499
Object[] source = {signers[i]};
2500
tool.warnings.addElement(form.format(source));
2501
tw.displayStatusDialog(this, form.format(source));
2502
}
2503
} catch (Exception e) {
2504
tw.displayErrorDialog(this, e);
2505
}
2506
}
2507
}
2508
return pppe;
2509
}
2510
2511
/**
2512
* confirm that the user REALLY wants to remove the Policy Entry
2513
*/
2514
void displayConfirmRemovePolicyEntry() {
2515
2516
// find the entry to be removed
2517
JList list = (JList)tw.getComponent(ToolWindow.MW_POLICY_LIST);
2518
int index = list.getSelectedIndex();
2519
PolicyEntry entries[] = tool.getEntry();
2520
2521
// find where the PolicyTool gui is
2522
Point location = tw.getLocationOnScreen();
2523
//setBounds(location.x + 25, location.y + 100, 600, 400);
2524
setLayout(new GridBagLayout());
2525
2526
// ask the user do they really want to do this?
2527
JLabel label = new JLabel
2528
(PolicyTool.getMessage("Remove.this.Policy.Entry."));
2529
tw.addNewComponent(this, label, CRPE_LABEL1,
2530
0, 0, 2, 1, 0.0, 0.0, GridBagConstraints.BOTH,
2531
ToolWindow.BOTTOM_PADDING);
2532
2533
// display the policy entry
2534
label = new JLabel(entries[index].codebaseToString());
2535
tw.addNewComponent(this, label, CRPE_LABEL2,
2536
0, 1, 2, 1, 0.0, 0.0, GridBagConstraints.BOTH);
2537
label = new JLabel(entries[index].principalsToString().trim());
2538
tw.addNewComponent(this, label, CRPE_LABEL2+1,
2539
0, 2, 2, 1, 0.0, 0.0, GridBagConstraints.BOTH);
2540
Vector<PolicyParser.PermissionEntry> perms =
2541
entries[index].getGrantEntry().permissionEntries;
2542
for (int i = 0; i < perms.size(); i++) {
2543
PolicyParser.PermissionEntry nextPerm = perms.elementAt(i);
2544
String permString = ToolDialog.PermissionEntryToUserFriendlyString(nextPerm);
2545
label = new JLabel(" " + permString);
2546
if (i == (perms.size()-1)) {
2547
tw.addNewComponent(this, label, CRPE_LABEL2 + 2 + i,
2548
1, 3 + i, 1, 1, 0.0, 0.0,
2549
GridBagConstraints.BOTH,
2550
ToolWindow.BOTTOM_PADDING);
2551
} else {
2552
tw.addNewComponent(this, label, CRPE_LABEL2 + 2 + i,
2553
1, 3 + i, 1, 1, 0.0, 0.0,
2554
GridBagConstraints.BOTH);
2555
}
2556
}
2557
2558
2559
// add OK/CANCEL buttons in a new panel
2560
JPanel panel = new JPanel();
2561
panel.setLayout(new GridBagLayout());
2562
2563
// OK button
2564
JButton okButton = new JButton(PolicyTool.getMessage("OK"));
2565
okButton.addActionListener
2566
(new ConfirmRemovePolicyEntryOKButtonListener(tool, tw, this));
2567
tw.addNewComponent(panel, okButton, CRPE_PANEL_OK,
2568
0, 0, 1, 1, 0.0, 0.0,
2569
GridBagConstraints.VERTICAL, ToolWindow.LR_PADDING);
2570
2571
// cancel button
2572
JButton cancelButton = new JButton(PolicyTool.getMessage("Cancel"));
2573
ActionListener cancelListener = new CancelButtonListener(this);
2574
cancelButton.addActionListener(cancelListener);
2575
tw.addNewComponent(panel, cancelButton, CRPE_PANEL_CANCEL,
2576
1, 0, 1, 1, 0.0, 0.0,
2577
GridBagConstraints.VERTICAL, ToolWindow.LR_PADDING);
2578
2579
tw.addNewComponent(this, panel, CRPE_LABEL2 + 2 + perms.size(),
2580
0, 3 + perms.size(), 2, 1, 0.0, 0.0,
2581
GridBagConstraints.VERTICAL, ToolWindow.TOP_BOTTOM_PADDING);
2582
2583
getRootPane().setDefaultButton(okButton);
2584
getRootPane().registerKeyboardAction(cancelListener, escKey, JComponent.WHEN_IN_FOCUSED_WINDOW);
2585
2586
pack();
2587
setLocationRelativeTo(tw);
2588
setVisible(true);
2589
}
2590
2591
/**
2592
* perform SAVE AS
2593
*/
2594
void displaySaveAsDialog(int nextEvent) {
2595
2596
// pop up a dialog box for the user to enter a filename.
2597
FileDialog fd = new FileDialog
2598
(tw, PolicyTool.getMessage("Save.As"), FileDialog.SAVE);
2599
fd.addWindowListener(new WindowAdapter() {
2600
public void windowClosing(WindowEvent e) {
2601
e.getWindow().setVisible(false);
2602
}
2603
});
2604
fd.setVisible(true);
2605
2606
// see if the user hit cancel
2607
if (fd.getFile() == null ||
2608
fd.getFile().equals(""))
2609
return;
2610
2611
// get the entered filename
2612
File saveAsFile = new File(fd.getDirectory(), fd.getFile());
2613
String filename = saveAsFile.getPath();
2614
fd.dispose();
2615
2616
try {
2617
// save the policy entries to a file
2618
tool.savePolicy(filename);
2619
2620
// display status
2621
MessageFormat form = new MessageFormat(PolicyTool.getMessage
2622
("Policy.successfully.written.to.filename"));
2623
Object[] source = {filename};
2624
tw.displayStatusDialog(null, form.format(source));
2625
2626
// display the new policy filename
2627
JTextField newFilename = (JTextField)tw.getComponent
2628
(ToolWindow.MW_FILENAME_TEXTFIELD);
2629
newFilename.setText(filename);
2630
tw.setVisible(true);
2631
2632
// now continue with the originally requested command
2633
// (QUIT, NEW, or OPEN)
2634
userSaveContinue(tool, tw, this, nextEvent);
2635
2636
} catch (FileNotFoundException fnfe) {
2637
if (filename == null || filename.equals("")) {
2638
tw.displayErrorDialog(null, new FileNotFoundException
2639
(PolicyTool.getMessage("null.filename")));
2640
} else {
2641
tw.displayErrorDialog(null, fnfe);
2642
}
2643
} catch (Exception ee) {
2644
tw.displayErrorDialog(null, ee);
2645
}
2646
}
2647
2648
/**
2649
* ask user if they want to save changes
2650
*/
2651
void displayUserSave(int select) {
2652
2653
if (tool.modified == true) {
2654
2655
// find where the PolicyTool gui is
2656
Point location = tw.getLocationOnScreen();
2657
//setBounds(location.x + 75, location.y + 100, 400, 150);
2658
setLayout(new GridBagLayout());
2659
2660
JLabel label = new JLabel
2661
(PolicyTool.getMessage("Save.changes."));
2662
tw.addNewComponent(this, label, USC_LABEL,
2663
0, 0, 3, 1, 0.0, 0.0, GridBagConstraints.BOTH,
2664
ToolWindow.L_TOP_BOTTOM_PADDING);
2665
2666
JPanel panel = new JPanel();
2667
panel.setLayout(new GridBagLayout());
2668
2669
JButton yesButton = new JButton();
2670
ToolWindow.configureButton(yesButton, "Yes");
2671
yesButton.addActionListener
2672
(new UserSaveYesButtonListener(this, tool, tw, select));
2673
tw.addNewComponent(panel, yesButton, USC_YES_BUTTON,
2674
0, 0, 1, 1, 0.0, 0.0,
2675
GridBagConstraints.VERTICAL,
2676
ToolWindow.LR_BOTTOM_PADDING);
2677
JButton noButton = new JButton();
2678
ToolWindow.configureButton(noButton, "No");
2679
noButton.addActionListener
2680
(new UserSaveNoButtonListener(this, tool, tw, select));
2681
tw.addNewComponent(panel, noButton, USC_NO_BUTTON,
2682
1, 0, 1, 1, 0.0, 0.0,
2683
GridBagConstraints.VERTICAL,
2684
ToolWindow.LR_BOTTOM_PADDING);
2685
JButton cancelButton = new JButton();
2686
ToolWindow.configureButton(cancelButton, "Cancel");
2687
ActionListener cancelListener = new CancelButtonListener(this);
2688
cancelButton.addActionListener(cancelListener);
2689
tw.addNewComponent(panel, cancelButton, USC_CANCEL_BUTTON,
2690
2, 0, 1, 1, 0.0, 0.0,
2691
GridBagConstraints.VERTICAL,
2692
ToolWindow.LR_BOTTOM_PADDING);
2693
2694
tw.addNewComponent(this, panel, USC_PANEL,
2695
0, 1, 1, 1, 0.0, 0.0, GridBagConstraints.BOTH);
2696
2697
getRootPane().registerKeyboardAction(cancelListener, escKey, JComponent.WHEN_IN_FOCUSED_WINDOW);
2698
2699
pack();
2700
setLocationRelativeTo(tw);
2701
setVisible(true);
2702
} else {
2703
// just do the original request (QUIT, NEW, or OPEN)
2704
userSaveContinue(tool, tw, this, select);
2705
}
2706
}
2707
2708
/**
2709
* when the user sees the 'YES', 'NO', 'CANCEL' buttons on the
2710
* displayUserSave dialog, and the click on one of them,
2711
* we need to continue the originally requested action
2712
* (either QUITting, opening NEW policy file, or OPENing an existing
2713
* policy file. do that now.
2714
*/
2715
@SuppressWarnings("fallthrough")
2716
void userSaveContinue(PolicyTool tool, ToolWindow tw,
2717
ToolDialog us, int select) {
2718
2719
// now either QUIT, open a NEW policy file, or OPEN an existing policy
2720
switch(select) {
2721
case ToolDialog.QUIT:
2722
2723
tw.setVisible(false);
2724
tw.dispose();
2725
System.exit(0);
2726
2727
case ToolDialog.NEW:
2728
2729
try {
2730
tool.openPolicy(null);
2731
} catch (Exception ee) {
2732
tool.modified = false;
2733
tw.displayErrorDialog(null, ee);
2734
}
2735
2736
// display the policy entries via the policy list textarea
2737
JList list = new JList(new DefaultListModel());
2738
list.setVisibleRowCount(15);
2739
list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
2740
list.addMouseListener(new PolicyListListener(tool, tw));
2741
tw.replacePolicyList(list);
2742
2743
// display null policy filename and keystore
2744
JTextField newFilename = (JTextField)tw.getComponent(
2745
ToolWindow.MW_FILENAME_TEXTFIELD);
2746
newFilename.setText("");
2747
tw.setVisible(true);
2748
break;
2749
2750
case ToolDialog.OPEN:
2751
2752
// pop up a dialog box for the user to enter a filename.
2753
FileDialog fd = new FileDialog
2754
(tw, PolicyTool.getMessage("Open"), FileDialog.LOAD);
2755
fd.addWindowListener(new WindowAdapter() {
2756
public void windowClosing(WindowEvent e) {
2757
e.getWindow().setVisible(false);
2758
}
2759
});
2760
fd.setVisible(true);
2761
2762
// see if the user hit 'cancel'
2763
if (fd.getFile() == null ||
2764
fd.getFile().equals(""))
2765
return;
2766
2767
// get the entered filename
2768
String policyFile = new File(fd.getDirectory(), fd.getFile()).getPath();
2769
2770
try {
2771
// open the policy file
2772
tool.openPolicy(policyFile);
2773
2774
// display the policy entries via the policy list textarea
2775
DefaultListModel listModel = new DefaultListModel();
2776
list = new JList(listModel);
2777
list.setVisibleRowCount(15);
2778
list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
2779
list.addMouseListener(new PolicyListListener(tool, tw));
2780
PolicyEntry entries[] = tool.getEntry();
2781
if (entries != null) {
2782
for (int i = 0; i < entries.length; i++) {
2783
listModel.addElement(entries[i].headerToString());
2784
}
2785
}
2786
tw.replacePolicyList(list);
2787
tool.modified = false;
2788
2789
// display the new policy filename
2790
newFilename = (JTextField)tw.getComponent(
2791
ToolWindow.MW_FILENAME_TEXTFIELD);
2792
newFilename.setText(policyFile);
2793
tw.setVisible(true);
2794
2795
// inform user of warnings
2796
if (tool.newWarning == true) {
2797
tw.displayStatusDialog(null, PolicyTool.getMessage
2798
("Errors.have.occurred.while.opening.the.policy.configuration.View.the.Warning.Log.for.more.information."));
2799
}
2800
2801
} catch (Exception e) {
2802
// add blank policy listing
2803
list = new JList(new DefaultListModel());
2804
list.setVisibleRowCount(15);
2805
list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
2806
list.addMouseListener(new PolicyListListener(tool, tw));
2807
tw.replacePolicyList(list);
2808
tool.setPolicyFileName(null);
2809
tool.modified = false;
2810
2811
// display a null policy filename
2812
newFilename = (JTextField)tw.getComponent(
2813
ToolWindow.MW_FILENAME_TEXTFIELD);
2814
newFilename.setText("");
2815
tw.setVisible(true);
2816
2817
// display the error
2818
MessageFormat form = new MessageFormat(PolicyTool.getMessage
2819
("Could.not.open.policy.file.policyFile.e.toString."));
2820
Object[] source = {policyFile, e.toString()};
2821
tw.displayErrorDialog(null, form.format(source));
2822
}
2823
break;
2824
}
2825
}
2826
2827
/**
2828
* Return a Menu list of names for a given permission
2829
*
2830
* If inputPerm's TARGETS are null, then this means TARGETS are
2831
* not allowed to be entered (and the TextField is set to be
2832
* non-editable).
2833
*
2834
* If TARGETS are valid but there are no standard ones
2835
* (user must enter them by hand) then the TARGETS array may be empty
2836
* (and of course non-null).
2837
*/
2838
void setPermissionNames(Perm inputPerm, JComboBox names, JTextField field) {
2839
names.removeAllItems();
2840
names.addItem(PERM_NAME);
2841
2842
if (inputPerm == null) {
2843
// custom permission
2844
field.setEditable(true);
2845
} else if (inputPerm.TARGETS == null) {
2846
// standard permission with no targets
2847
field.setEditable(false);
2848
} else {
2849
// standard permission with standard targets
2850
field.setEditable(true);
2851
for (int i = 0; i < inputPerm.TARGETS.length; i++) {
2852
names.addItem(inputPerm.TARGETS[i]);
2853
}
2854
}
2855
}
2856
2857
/**
2858
* Return a Menu list of actions for a given permission
2859
*
2860
* If inputPerm's ACTIONS are null, then this means ACTIONS are
2861
* not allowed to be entered (and the TextField is set to be
2862
* non-editable). This is typically true for BasicPermissions.
2863
*
2864
* If ACTIONS are valid but there are no standard ones
2865
* (user must enter them by hand) then the ACTIONS array may be empty
2866
* (and of course non-null).
2867
*/
2868
void setPermissionActions(Perm inputPerm, JComboBox actions, JTextField field) {
2869
actions.removeAllItems();
2870
actions.addItem(PERM_ACTIONS);
2871
2872
if (inputPerm == null) {
2873
// custom permission
2874
field.setEditable(true);
2875
} else if (inputPerm.ACTIONS == null) {
2876
// standard permission with no actions
2877
field.setEditable(false);
2878
} else {
2879
// standard permission with standard actions
2880
field.setEditable(true);
2881
for (int i = 0; i < inputPerm.ACTIONS.length; i++) {
2882
actions.addItem(inputPerm.ACTIONS[i]);
2883
}
2884
}
2885
}
2886
2887
static String PermissionEntryToUserFriendlyString(PolicyParser.PermissionEntry pppe) {
2888
String result = pppe.permission;
2889
if (pppe.name != null) {
2890
result += " " + pppe.name;
2891
}
2892
if (pppe.action != null) {
2893
result += ", \"" + pppe.action + "\"";
2894
}
2895
if (pppe.signedBy != null) {
2896
result += ", signedBy " + pppe.signedBy;
2897
}
2898
return result;
2899
}
2900
2901
static String PrincipalEntryToUserFriendlyString(PolicyParser.PrincipalEntry pppe) {
2902
StringWriter sw = new StringWriter();
2903
PrintWriter pw = new PrintWriter(sw);
2904
pppe.write(pw);
2905
return sw.toString();
2906
}
2907
}
2908
2909
/**
2910
* Event handler for the PolicyTool window
2911
*/
2912
class ToolWindowListener implements WindowListener {
2913
2914
private PolicyTool tool;
2915
private ToolWindow tw;
2916
2917
ToolWindowListener(PolicyTool tool, ToolWindow tw) {
2918
this.tool = tool;
2919
this.tw = tw;
2920
}
2921
2922
public void windowOpened(WindowEvent we) {
2923
}
2924
2925
public void windowClosing(WindowEvent we) {
2926
// Closing the window acts the same as choosing Menu->Exit.
2927
2928
// ask user if they want to save changes
2929
ToolDialog td = new ToolDialog(PolicyTool.getMessage("Save.Changes"), tool, tw, true);
2930
td.displayUserSave(ToolDialog.QUIT);
2931
2932
// the above method will perform the QUIT as long as the
2933
// user does not CANCEL the request
2934
}
2935
2936
public void windowClosed(WindowEvent we) {
2937
System.exit(0);
2938
}
2939
2940
public void windowIconified(WindowEvent we) {
2941
}
2942
2943
public void windowDeiconified(WindowEvent we) {
2944
}
2945
2946
public void windowActivated(WindowEvent we) {
2947
}
2948
2949
public void windowDeactivated(WindowEvent we) {
2950
}
2951
}
2952
2953
/**
2954
* Event handler for the Policy List
2955
*/
2956
class PolicyListListener extends MouseAdapter implements ActionListener {
2957
2958
private PolicyTool tool;
2959
private ToolWindow tw;
2960
2961
PolicyListListener(PolicyTool tool, ToolWindow tw) {
2962
this.tool = tool;
2963
this.tw = tw;
2964
2965
}
2966
2967
public void actionPerformed(ActionEvent e) {
2968
2969
// display the permission list for a policy entry
2970
ToolDialog td = new ToolDialog
2971
(PolicyTool.getMessage("Policy.Entry"), tool, tw, true);
2972
td.displayPolicyEntryDialog(true);
2973
}
2974
2975
public void mouseClicked(MouseEvent evt) {
2976
if (evt.getClickCount() == 2) {
2977
actionPerformed(null);
2978
}
2979
}
2980
}
2981
2982
/**
2983
* Event handler for the File Menu
2984
*/
2985
class FileMenuListener implements ActionListener {
2986
2987
private PolicyTool tool;
2988
private ToolWindow tw;
2989
2990
FileMenuListener(PolicyTool tool, ToolWindow tw) {
2991
this.tool = tool;
2992
this.tw = tw;
2993
}
2994
2995
public void actionPerformed(ActionEvent e) {
2996
2997
if (PolicyTool.collator.compare(e.getActionCommand(),
2998
ToolWindow.QUIT) == 0) {
2999
3000
// ask user if they want to save changes
3001
ToolDialog td = new ToolDialog
3002
(PolicyTool.getMessage("Save.Changes"), tool, tw, true);
3003
td.displayUserSave(ToolDialog.QUIT);
3004
3005
// the above method will perform the QUIT as long as the
3006
// user does not CANCEL the request
3007
3008
} else if (PolicyTool.collator.compare(e.getActionCommand(),
3009
ToolWindow.NEW_POLICY_FILE) == 0) {
3010
3011
// ask user if they want to save changes
3012
ToolDialog td = new ToolDialog
3013
(PolicyTool.getMessage("Save.Changes"), tool, tw, true);
3014
td.displayUserSave(ToolDialog.NEW);
3015
3016
// the above method will perform the NEW as long as the
3017
// user does not CANCEL the request
3018
3019
} else if (PolicyTool.collator.compare(e.getActionCommand(),
3020
ToolWindow.OPEN_POLICY_FILE) == 0) {
3021
3022
// ask user if they want to save changes
3023
ToolDialog td = new ToolDialog
3024
(PolicyTool.getMessage("Save.Changes"), tool, tw, true);
3025
td.displayUserSave(ToolDialog.OPEN);
3026
3027
// the above method will perform the OPEN as long as the
3028
// user does not CANCEL the request
3029
3030
} else if (PolicyTool.collator.compare(e.getActionCommand(),
3031
ToolWindow.SAVE_POLICY_FILE) == 0) {
3032
3033
// get the previously entered filename
3034
String filename = ((JTextField)tw.getComponent(
3035
ToolWindow.MW_FILENAME_TEXTFIELD)).getText();
3036
3037
// if there is no filename, do a SAVE_AS
3038
if (filename == null || filename.length() == 0) {
3039
// user wants to SAVE AS
3040
ToolDialog td = new ToolDialog
3041
(PolicyTool.getMessage("Save.As"), tool, tw, true);
3042
td.displaySaveAsDialog(ToolDialog.NOACTION);
3043
} else {
3044
try {
3045
// save the policy entries to a file
3046
tool.savePolicy(filename);
3047
3048
// display status
3049
MessageFormat form = new MessageFormat
3050
(PolicyTool.getMessage
3051
("Policy.successfully.written.to.filename"));
3052
Object[] source = {filename};
3053
tw.displayStatusDialog(null, form.format(source));
3054
} catch (FileNotFoundException fnfe) {
3055
if (filename == null || filename.equals("")) {
3056
tw.displayErrorDialog(null, new FileNotFoundException
3057
(PolicyTool.getMessage("null.filename")));
3058
} else {
3059
tw.displayErrorDialog(null, fnfe);
3060
}
3061
} catch (Exception ee) {
3062
tw.displayErrorDialog(null, ee);
3063
}
3064
}
3065
} else if (PolicyTool.collator.compare(e.getActionCommand(),
3066
ToolWindow.SAVE_AS_POLICY_FILE) == 0) {
3067
3068
// user wants to SAVE AS
3069
ToolDialog td = new ToolDialog
3070
(PolicyTool.getMessage("Save.As"), tool, tw, true);
3071
td.displaySaveAsDialog(ToolDialog.NOACTION);
3072
3073
} else if (PolicyTool.collator.compare(e.getActionCommand(),
3074
ToolWindow.VIEW_WARNINGS) == 0) {
3075
tw.displayWarningLog(null);
3076
}
3077
}
3078
}
3079
3080
/**
3081
* Event handler for the main window buttons and Edit Menu
3082
*/
3083
class MainWindowListener implements ActionListener {
3084
3085
private PolicyTool tool;
3086
private ToolWindow tw;
3087
3088
MainWindowListener(PolicyTool tool, ToolWindow tw) {
3089
this.tool = tool;
3090
this.tw = tw;
3091
}
3092
3093
public void actionPerformed(ActionEvent e) {
3094
3095
if (PolicyTool.collator.compare(e.getActionCommand(),
3096
ToolWindow.ADD_POLICY_ENTRY) == 0) {
3097
3098
// display a dialog box for the user to enter policy info
3099
ToolDialog td = new ToolDialog
3100
(PolicyTool.getMessage("Policy.Entry"), tool, tw, true);
3101
td.displayPolicyEntryDialog(false);
3102
3103
} else if (PolicyTool.collator.compare(e.getActionCommand(),
3104
ToolWindow.REMOVE_POLICY_ENTRY) == 0) {
3105
3106
// get the selected entry
3107
JList list = (JList)tw.getComponent(ToolWindow.MW_POLICY_LIST);
3108
int index = list.getSelectedIndex();
3109
if (index < 0) {
3110
tw.displayErrorDialog(null, new Exception
3111
(PolicyTool.getMessage("No.Policy.Entry.selected")));
3112
return;
3113
}
3114
3115
// ask the user if they really want to remove the policy entry
3116
ToolDialog td = new ToolDialog(PolicyTool.getMessage
3117
("Remove.Policy.Entry"), tool, tw, true);
3118
td.displayConfirmRemovePolicyEntry();
3119
3120
} else if (PolicyTool.collator.compare(e.getActionCommand(),
3121
ToolWindow.EDIT_POLICY_ENTRY) == 0) {
3122
3123
// get the selected entry
3124
JList list = (JList)tw.getComponent(ToolWindow.MW_POLICY_LIST);
3125
int index = list.getSelectedIndex();
3126
if (index < 0) {
3127
tw.displayErrorDialog(null, new Exception
3128
(PolicyTool.getMessage("No.Policy.Entry.selected")));
3129
return;
3130
}
3131
3132
// display the permission list for a policy entry
3133
ToolDialog td = new ToolDialog
3134
(PolicyTool.getMessage("Policy.Entry"), tool, tw, true);
3135
td.displayPolicyEntryDialog(true);
3136
3137
} else if (PolicyTool.collator.compare(e.getActionCommand(),
3138
ToolWindow.EDIT_KEYSTORE) == 0) {
3139
3140
// display a dialog box for the user to enter keystore info
3141
ToolDialog td = new ToolDialog
3142
(PolicyTool.getMessage("KeyStore"), tool, tw, true);
3143
td.keyStoreDialog(ToolDialog.EDIT_KEYSTORE);
3144
}
3145
}
3146
}
3147
3148
/**
3149
* Event handler for AddEntryDoneButton button
3150
*
3151
* -- if edit is TRUE, then we are EDITing an existing PolicyEntry
3152
* and we need to update both the policy and the GUI listing.
3153
* if edit is FALSE, then we are ADDing a new PolicyEntry,
3154
* so we only need to update the GUI listing.
3155
*/
3156
class AddEntryDoneButtonListener implements ActionListener {
3157
3158
private PolicyTool tool;
3159
private ToolWindow tw;
3160
private ToolDialog td;
3161
private boolean edit;
3162
3163
AddEntryDoneButtonListener(PolicyTool tool, ToolWindow tw,
3164
ToolDialog td, boolean edit) {
3165
this.tool = tool;
3166
this.tw = tw;
3167
this.td = td;
3168
this.edit = edit;
3169
}
3170
3171
public void actionPerformed(ActionEvent e) {
3172
3173
try {
3174
// get a PolicyEntry object from the dialog policy info
3175
PolicyEntry newEntry = td.getPolicyEntryFromDialog();
3176
PolicyParser.GrantEntry newGe = newEntry.getGrantEntry();
3177
3178
// see if all the signers have public keys
3179
if (newGe.signedBy != null) {
3180
String signers[] = tool.parseSigners(newGe.signedBy);
3181
for (int i = 0; i < signers.length; i++) {
3182
PublicKey pubKey = tool.getPublicKeyAlias(signers[i]);
3183
if (pubKey == null) {
3184
MessageFormat form = new MessageFormat
3185
(PolicyTool.getMessage
3186
("Warning.A.public.key.for.alias.signers.i.does.not.exist.Make.sure.a.KeyStore.is.properly.configured."));
3187
Object[] source = {signers[i]};
3188
tool.warnings.addElement(form.format(source));
3189
tw.displayStatusDialog(td, form.format(source));
3190
}
3191
}
3192
}
3193
3194
// add the entry
3195
JList policyList = (JList)tw.getComponent(ToolWindow.MW_POLICY_LIST);
3196
if (edit) {
3197
int listIndex = policyList.getSelectedIndex();
3198
tool.addEntry(newEntry, listIndex);
3199
String newCodeBaseStr = newEntry.headerToString();
3200
if (PolicyTool.collator.compare
3201
(newCodeBaseStr, policyList.getModel().getElementAt(listIndex)) != 0)
3202
tool.modified = true;
3203
((DefaultListModel)policyList.getModel()).set(listIndex, newCodeBaseStr);
3204
} else {
3205
tool.addEntry(newEntry, -1);
3206
((DefaultListModel)policyList.getModel()).addElement(newEntry.headerToString());
3207
tool.modified = true;
3208
}
3209
td.setVisible(false);
3210
td.dispose();
3211
3212
} catch (Exception eee) {
3213
tw.displayErrorDialog(td, eee);
3214
}
3215
}
3216
}
3217
3218
/**
3219
* Event handler for ChangeKeyStoreOKButton button
3220
*/
3221
class ChangeKeyStoreOKButtonListener implements ActionListener {
3222
3223
private PolicyTool tool;
3224
private ToolWindow tw;
3225
private ToolDialog td;
3226
3227
ChangeKeyStoreOKButtonListener(PolicyTool tool, ToolWindow tw,
3228
ToolDialog td) {
3229
this.tool = tool;
3230
this.tw = tw;
3231
this.td = td;
3232
}
3233
3234
public void actionPerformed(ActionEvent e) {
3235
3236
String URLString = ((JTextField)td.getComponent(
3237
ToolDialog.KSD_NAME_TEXTFIELD)).getText().trim();
3238
String type = ((JTextField)td.getComponent(
3239
ToolDialog.KSD_TYPE_TEXTFIELD)).getText().trim();
3240
String provider = ((JTextField)td.getComponent(
3241
ToolDialog.KSD_PROVIDER_TEXTFIELD)).getText().trim();
3242
String pwdURL = ((JTextField)td.getComponent(
3243
ToolDialog.KSD_PWD_URL_TEXTFIELD)).getText().trim();
3244
3245
try {
3246
tool.openKeyStore
3247
((URLString.length() == 0 ? null : URLString),
3248
(type.length() == 0 ? null : type),
3249
(provider.length() == 0 ? null : provider),
3250
(pwdURL.length() == 0 ? null : pwdURL));
3251
tool.modified = true;
3252
} catch (Exception ex) {
3253
MessageFormat form = new MessageFormat(PolicyTool.getMessage
3254
("Unable.to.open.KeyStore.ex.toString."));
3255
Object[] source = {ex.toString()};
3256
tw.displayErrorDialog(td, form.format(source));
3257
return;
3258
}
3259
3260
td.dispose();
3261
}
3262
}
3263
3264
/**
3265
* Event handler for AddPrinButton button
3266
*/
3267
class AddPrinButtonListener implements ActionListener {
3268
3269
private PolicyTool tool;
3270
private ToolWindow tw;
3271
private ToolDialog td;
3272
private boolean editPolicyEntry;
3273
3274
AddPrinButtonListener(PolicyTool tool, ToolWindow tw,
3275
ToolDialog td, boolean editPolicyEntry) {
3276
this.tool = tool;
3277
this.tw = tw;
3278
this.td = td;
3279
this.editPolicyEntry = editPolicyEntry;
3280
}
3281
3282
public void actionPerformed(ActionEvent e) {
3283
3284
// display a dialog box for the user to enter principal info
3285
td.displayPrincipalDialog(editPolicyEntry, false);
3286
}
3287
}
3288
3289
/**
3290
* Event handler for AddPermButton button
3291
*/
3292
class AddPermButtonListener implements ActionListener {
3293
3294
private PolicyTool tool;
3295
private ToolWindow tw;
3296
private ToolDialog td;
3297
private boolean editPolicyEntry;
3298
3299
AddPermButtonListener(PolicyTool tool, ToolWindow tw,
3300
ToolDialog td, boolean editPolicyEntry) {
3301
this.tool = tool;
3302
this.tw = tw;
3303
this.td = td;
3304
this.editPolicyEntry = editPolicyEntry;
3305
}
3306
3307
public void actionPerformed(ActionEvent e) {
3308
3309
// display a dialog box for the user to enter permission info
3310
td.displayPermissionDialog(editPolicyEntry, false);
3311
}
3312
}
3313
3314
/**
3315
* Event handler for AddPrinOKButton button
3316
*/
3317
class NewPolicyPrinOKButtonListener implements ActionListener {
3318
3319
private PolicyTool tool;
3320
private ToolWindow tw;
3321
private ToolDialog listDialog;
3322
private ToolDialog infoDialog;
3323
private boolean edit;
3324
3325
NewPolicyPrinOKButtonListener(PolicyTool tool,
3326
ToolWindow tw,
3327
ToolDialog listDialog,
3328
ToolDialog infoDialog,
3329
boolean edit) {
3330
this.tool = tool;
3331
this.tw = tw;
3332
this.listDialog = listDialog;
3333
this.infoDialog = infoDialog;
3334
this.edit = edit;
3335
}
3336
3337
public void actionPerformed(ActionEvent e) {
3338
3339
try {
3340
// read in the new principal info from Dialog Box
3341
PolicyParser.PrincipalEntry pppe =
3342
infoDialog.getPrinFromDialog();
3343
if (pppe != null) {
3344
try {
3345
tool.verifyPrincipal(pppe.getPrincipalClass(),
3346
pppe.getPrincipalName());
3347
} catch (ClassNotFoundException cnfe) {
3348
MessageFormat form = new MessageFormat
3349
(PolicyTool.getMessage
3350
("Warning.Class.not.found.class"));
3351
Object[] source = {pppe.getPrincipalClass()};
3352
tool.warnings.addElement(form.format(source));
3353
tw.displayStatusDialog(infoDialog, form.format(source));
3354
}
3355
3356
// add the principal to the GUI principal list
3357
TaggedList prinList =
3358
(TaggedList)listDialog.getComponent(ToolDialog.PE_PRIN_LIST);
3359
3360
String prinString = ToolDialog.PrincipalEntryToUserFriendlyString(pppe);
3361
if (edit) {
3362
// if editing, replace the original principal
3363
int index = prinList.getSelectedIndex();
3364
prinList.replaceTaggedItem(prinString, pppe, index);
3365
} else {
3366
// if adding, just add it to the end
3367
prinList.addTaggedItem(prinString, pppe);
3368
}
3369
}
3370
infoDialog.dispose();
3371
} catch (Exception ee) {
3372
tw.displayErrorDialog(infoDialog, ee);
3373
}
3374
}
3375
}
3376
3377
/**
3378
* Event handler for AddPermOKButton button
3379
*/
3380
class NewPolicyPermOKButtonListener implements ActionListener {
3381
3382
private PolicyTool tool;
3383
private ToolWindow tw;
3384
private ToolDialog listDialog;
3385
private ToolDialog infoDialog;
3386
private boolean edit;
3387
3388
NewPolicyPermOKButtonListener(PolicyTool tool,
3389
ToolWindow tw,
3390
ToolDialog listDialog,
3391
ToolDialog infoDialog,
3392
boolean edit) {
3393
this.tool = tool;
3394
this.tw = tw;
3395
this.listDialog = listDialog;
3396
this.infoDialog = infoDialog;
3397
this.edit = edit;
3398
}
3399
3400
public void actionPerformed(ActionEvent e) {
3401
3402
try {
3403
// read in the new permission info from Dialog Box
3404
PolicyParser.PermissionEntry pppe =
3405
infoDialog.getPermFromDialog();
3406
3407
try {
3408
tool.verifyPermission(pppe.permission, pppe.name, pppe.action);
3409
} catch (ClassNotFoundException cnfe) {
3410
MessageFormat form = new MessageFormat(PolicyTool.getMessage
3411
("Warning.Class.not.found.class"));
3412
Object[] source = {pppe.permission};
3413
tool.warnings.addElement(form.format(source));
3414
tw.displayStatusDialog(infoDialog, form.format(source));
3415
}
3416
3417
// add the permission to the GUI permission list
3418
TaggedList permList =
3419
(TaggedList)listDialog.getComponent(ToolDialog.PE_PERM_LIST);
3420
3421
String permString = ToolDialog.PermissionEntryToUserFriendlyString(pppe);
3422
if (edit) {
3423
// if editing, replace the original permission
3424
int which = permList.getSelectedIndex();
3425
permList.replaceTaggedItem(permString, pppe, which);
3426
} else {
3427
// if adding, just add it to the end
3428
permList.addTaggedItem(permString, pppe);
3429
}
3430
infoDialog.dispose();
3431
3432
} catch (InvocationTargetException ite) {
3433
tw.displayErrorDialog(infoDialog, ite.getTargetException());
3434
} catch (Exception ee) {
3435
tw.displayErrorDialog(infoDialog, ee);
3436
}
3437
}
3438
}
3439
3440
/**
3441
* Event handler for RemovePrinButton button
3442
*/
3443
class RemovePrinButtonListener implements ActionListener {
3444
3445
private PolicyTool tool;
3446
private ToolWindow tw;
3447
private ToolDialog td;
3448
private boolean edit;
3449
3450
RemovePrinButtonListener(PolicyTool tool, ToolWindow tw,
3451
ToolDialog td, boolean edit) {
3452
this.tool = tool;
3453
this.tw = tw;
3454
this.td = td;
3455
this.edit = edit;
3456
}
3457
3458
public void actionPerformed(ActionEvent e) {
3459
3460
// get the Principal selected from the Principal List
3461
TaggedList prinList = (TaggedList)td.getComponent(
3462
ToolDialog.PE_PRIN_LIST);
3463
int prinIndex = prinList.getSelectedIndex();
3464
3465
if (prinIndex < 0) {
3466
tw.displayErrorDialog(td, new Exception
3467
(PolicyTool.getMessage("No.principal.selected")));
3468
return;
3469
}
3470
// remove the principal from the display
3471
prinList.removeTaggedItem(prinIndex);
3472
}
3473
}
3474
3475
/**
3476
* Event handler for RemovePermButton button
3477
*/
3478
class RemovePermButtonListener implements ActionListener {
3479
3480
private PolicyTool tool;
3481
private ToolWindow tw;
3482
private ToolDialog td;
3483
private boolean edit;
3484
3485
RemovePermButtonListener(PolicyTool tool, ToolWindow tw,
3486
ToolDialog td, boolean edit) {
3487
this.tool = tool;
3488
this.tw = tw;
3489
this.td = td;
3490
this.edit = edit;
3491
}
3492
3493
public void actionPerformed(ActionEvent e) {
3494
3495
// get the Permission selected from the Permission List
3496
TaggedList permList = (TaggedList)td.getComponent(
3497
ToolDialog.PE_PERM_LIST);
3498
int permIndex = permList.getSelectedIndex();
3499
3500
if (permIndex < 0) {
3501
tw.displayErrorDialog(td, new Exception
3502
(PolicyTool.getMessage("No.permission.selected")));
3503
return;
3504
}
3505
// remove the permission from the display
3506
permList.removeTaggedItem(permIndex);
3507
3508
}
3509
}
3510
3511
/**
3512
* Event handler for Edit Principal button
3513
*
3514
* We need the editPolicyEntry boolean to tell us if the user is
3515
* adding a new PolicyEntry at this time, or editing an existing entry.
3516
* If the user is adding a new PolicyEntry, we ONLY update the
3517
* GUI listing. If the user is editing an existing PolicyEntry, we
3518
* update both the GUI listing and the actual PolicyEntry.
3519
*/
3520
class EditPrinButtonListener extends MouseAdapter implements ActionListener {
3521
3522
private PolicyTool tool;
3523
private ToolWindow tw;
3524
private ToolDialog td;
3525
private boolean editPolicyEntry;
3526
3527
EditPrinButtonListener(PolicyTool tool, ToolWindow tw,
3528
ToolDialog td, boolean editPolicyEntry) {
3529
this.tool = tool;
3530
this.tw = tw;
3531
this.td = td;
3532
this.editPolicyEntry = editPolicyEntry;
3533
}
3534
3535
public void actionPerformed(ActionEvent e) {
3536
3537
// get the Principal selected from the Principal List
3538
TaggedList list = (TaggedList)td.getComponent(
3539
ToolDialog.PE_PRIN_LIST);
3540
int prinIndex = list.getSelectedIndex();
3541
3542
if (prinIndex < 0) {
3543
tw.displayErrorDialog(td, new Exception
3544
(PolicyTool.getMessage("No.principal.selected")));
3545
return;
3546
}
3547
td.displayPrincipalDialog(editPolicyEntry, true);
3548
}
3549
3550
public void mouseClicked(MouseEvent evt) {
3551
if (evt.getClickCount() == 2) {
3552
actionPerformed(null);
3553
}
3554
}
3555
}
3556
3557
/**
3558
* Event handler for Edit Permission button
3559
*
3560
* We need the editPolicyEntry boolean to tell us if the user is
3561
* adding a new PolicyEntry at this time, or editing an existing entry.
3562
* If the user is adding a new PolicyEntry, we ONLY update the
3563
* GUI listing. If the user is editing an existing PolicyEntry, we
3564
* update both the GUI listing and the actual PolicyEntry.
3565
*/
3566
class EditPermButtonListener extends MouseAdapter implements ActionListener {
3567
3568
private PolicyTool tool;
3569
private ToolWindow tw;
3570
private ToolDialog td;
3571
private boolean editPolicyEntry;
3572
3573
EditPermButtonListener(PolicyTool tool, ToolWindow tw,
3574
ToolDialog td, boolean editPolicyEntry) {
3575
this.tool = tool;
3576
this.tw = tw;
3577
this.td = td;
3578
this.editPolicyEntry = editPolicyEntry;
3579
}
3580
3581
public void actionPerformed(ActionEvent e) {
3582
3583
// get the Permission selected from the Permission List
3584
JList list = (JList)td.getComponent(ToolDialog.PE_PERM_LIST);
3585
int permIndex = list.getSelectedIndex();
3586
3587
if (permIndex < 0) {
3588
tw.displayErrorDialog(td, new Exception
3589
(PolicyTool.getMessage("No.permission.selected")));
3590
return;
3591
}
3592
td.displayPermissionDialog(editPolicyEntry, true);
3593
}
3594
3595
public void mouseClicked(MouseEvent evt) {
3596
if (evt.getClickCount() == 2) {
3597
actionPerformed(null);
3598
}
3599
}
3600
}
3601
3602
/**
3603
* Event handler for Principal Popup Menu
3604
*/
3605
class PrincipalTypeMenuListener implements ItemListener {
3606
3607
private ToolDialog td;
3608
3609
PrincipalTypeMenuListener(ToolDialog td) {
3610
this.td = td;
3611
}
3612
3613
public void itemStateChanged(ItemEvent e) {
3614
if (e.getStateChange() == ItemEvent.DESELECTED) {
3615
// We're only interested in SELECTED events
3616
return;
3617
}
3618
3619
JComboBox prin = (JComboBox)td.getComponent(ToolDialog.PRD_PRIN_CHOICE);
3620
JTextField prinField = (JTextField)td.getComponent(
3621
ToolDialog.PRD_PRIN_TEXTFIELD);
3622
JTextField nameField = (JTextField)td.getComponent(
3623
ToolDialog.PRD_NAME_TEXTFIELD);
3624
3625
prin.getAccessibleContext().setAccessibleName(
3626
PolicyTool.splitToWords((String)e.getItem()));
3627
if (((String)e.getItem()).equals(ToolDialog.PRIN_TYPE)) {
3628
// ignore if they choose "Principal Type:" item
3629
if (prinField.getText() != null &&
3630
prinField.getText().length() > 0) {
3631
Prin inputPrin = ToolDialog.getPrin(prinField.getText(), true);
3632
prin.setSelectedItem(inputPrin.CLASS);
3633
}
3634
return;
3635
}
3636
3637
// if you change the principal, clear the name
3638
if (prinField.getText().indexOf((String)e.getItem()) == -1) {
3639
nameField.setText("");
3640
}
3641
3642
// set the text in the textfield and also modify the
3643
// pull-down choice menus to reflect the correct possible
3644
// set of names and actions
3645
Prin inputPrin = ToolDialog.getPrin((String)e.getItem(), false);
3646
if (inputPrin != null) {
3647
prinField.setText(inputPrin.FULL_CLASS);
3648
}
3649
}
3650
}
3651
3652
/**
3653
* Event handler for Permission Popup Menu
3654
*/
3655
class PermissionMenuListener implements ItemListener {
3656
3657
private ToolDialog td;
3658
3659
PermissionMenuListener(ToolDialog td) {
3660
this.td = td;
3661
}
3662
3663
public void itemStateChanged(ItemEvent e) {
3664
if (e.getStateChange() == ItemEvent.DESELECTED) {
3665
// We're only interested in SELECTED events
3666
return;
3667
}
3668
3669
JComboBox perms = (JComboBox)td.getComponent(
3670
ToolDialog.PD_PERM_CHOICE);
3671
JComboBox names = (JComboBox)td.getComponent(
3672
ToolDialog.PD_NAME_CHOICE);
3673
JComboBox actions = (JComboBox)td.getComponent(
3674
ToolDialog.PD_ACTIONS_CHOICE);
3675
JTextField nameField = (JTextField)td.getComponent(
3676
ToolDialog.PD_NAME_TEXTFIELD);
3677
JTextField actionsField = (JTextField)td.getComponent(
3678
ToolDialog.PD_ACTIONS_TEXTFIELD);
3679
JTextField permField = (JTextField)td.getComponent(
3680
ToolDialog.PD_PERM_TEXTFIELD);
3681
JTextField signedbyField = (JTextField)td.getComponent(
3682
ToolDialog.PD_SIGNEDBY_TEXTFIELD);
3683
3684
perms.getAccessibleContext().setAccessibleName(
3685
PolicyTool.splitToWords((String)e.getItem()));
3686
3687
// ignore if they choose the 'Permission:' item
3688
if (PolicyTool.collator.compare((String)e.getItem(),
3689
ToolDialog.PERM) == 0) {
3690
if (permField.getText() != null &&
3691
permField.getText().length() > 0) {
3692
3693
Perm inputPerm = ToolDialog.getPerm(permField.getText(), true);
3694
if (inputPerm != null) {
3695
perms.setSelectedItem(inputPerm.CLASS);
3696
}
3697
}
3698
return;
3699
}
3700
3701
// if you change the permission, clear the name, actions, and signedBy
3702
if (permField.getText().indexOf((String)e.getItem()) == -1) {
3703
nameField.setText("");
3704
actionsField.setText("");
3705
signedbyField.setText("");
3706
}
3707
3708
// set the text in the textfield and also modify the
3709
// pull-down choice menus to reflect the correct possible
3710
// set of names and actions
3711
3712
Perm inputPerm = ToolDialog.getPerm((String)e.getItem(), false);
3713
if (inputPerm == null) {
3714
permField.setText("");
3715
} else {
3716
permField.setText(inputPerm.FULL_CLASS);
3717
}
3718
td.setPermissionNames(inputPerm, names, nameField);
3719
td.setPermissionActions(inputPerm, actions, actionsField);
3720
}
3721
}
3722
3723
/**
3724
* Event handler for Permission Name Popup Menu
3725
*/
3726
class PermissionNameMenuListener implements ItemListener {
3727
3728
private ToolDialog td;
3729
3730
PermissionNameMenuListener(ToolDialog td) {
3731
this.td = td;
3732
}
3733
3734
public void itemStateChanged(ItemEvent e) {
3735
if (e.getStateChange() == ItemEvent.DESELECTED) {
3736
// We're only interested in SELECTED events
3737
return;
3738
}
3739
3740
JComboBox names = (JComboBox)td.getComponent(ToolDialog.PD_NAME_CHOICE);
3741
names.getAccessibleContext().setAccessibleName(
3742
PolicyTool.splitToWords((String)e.getItem()));
3743
3744
if (((String)e.getItem()).indexOf(ToolDialog.PERM_NAME) != -1)
3745
return;
3746
3747
JTextField tf = (JTextField)td.getComponent(ToolDialog.PD_NAME_TEXTFIELD);
3748
tf.setText((String)e.getItem());
3749
}
3750
}
3751
3752
/**
3753
* Event handler for Permission Actions Popup Menu
3754
*/
3755
class PermissionActionsMenuListener implements ItemListener {
3756
3757
private ToolDialog td;
3758
3759
PermissionActionsMenuListener(ToolDialog td) {
3760
this.td = td;
3761
}
3762
3763
public void itemStateChanged(ItemEvent e) {
3764
if (e.getStateChange() == ItemEvent.DESELECTED) {
3765
// We're only interested in SELECTED events
3766
return;
3767
}
3768
3769
JComboBox actions = (JComboBox)td.getComponent(
3770
ToolDialog.PD_ACTIONS_CHOICE);
3771
actions.getAccessibleContext().setAccessibleName((String)e.getItem());
3772
3773
if (((String)e.getItem()).indexOf(ToolDialog.PERM_ACTIONS) != -1)
3774
return;
3775
3776
JTextField tf = (JTextField)td.getComponent(
3777
ToolDialog.PD_ACTIONS_TEXTFIELD);
3778
if (tf.getText() == null || tf.getText().equals("")) {
3779
tf.setText((String)e.getItem());
3780
} else {
3781
if (tf.getText().indexOf((String)e.getItem()) == -1)
3782
tf.setText(tf.getText() + ", " + (String)e.getItem());
3783
}
3784
}
3785
}
3786
3787
/**
3788
* Event handler for all the children dialogs/windows
3789
*/
3790
class ChildWindowListener implements WindowListener {
3791
3792
private ToolDialog td;
3793
3794
ChildWindowListener(ToolDialog td) {
3795
this.td = td;
3796
}
3797
3798
public void windowOpened(WindowEvent we) {
3799
}
3800
3801
public void windowClosing(WindowEvent we) {
3802
// same as pressing the "cancel" button
3803
td.setVisible(false);
3804
td.dispose();
3805
}
3806
3807
public void windowClosed(WindowEvent we) {
3808
}
3809
3810
public void windowIconified(WindowEvent we) {
3811
}
3812
3813
public void windowDeiconified(WindowEvent we) {
3814
}
3815
3816
public void windowActivated(WindowEvent we) {
3817
}
3818
3819
public void windowDeactivated(WindowEvent we) {
3820
}
3821
}
3822
3823
/**
3824
* Event handler for CancelButton button
3825
*/
3826
class CancelButtonListener implements ActionListener {
3827
3828
private ToolDialog td;
3829
3830
CancelButtonListener(ToolDialog td) {
3831
this.td = td;
3832
}
3833
3834
public void actionPerformed(ActionEvent e) {
3835
td.setVisible(false);
3836
td.dispose();
3837
}
3838
}
3839
3840
/**
3841
* Event handler for ErrorOKButton button
3842
*/
3843
class ErrorOKButtonListener implements ActionListener {
3844
3845
private ToolDialog ed;
3846
3847
ErrorOKButtonListener(ToolDialog ed) {
3848
this.ed = ed;
3849
}
3850
3851
public void actionPerformed(ActionEvent e) {
3852
ed.setVisible(false);
3853
ed.dispose();
3854
}
3855
}
3856
3857
/**
3858
* Event handler for StatusOKButton button
3859
*/
3860
class StatusOKButtonListener implements ActionListener {
3861
3862
private ToolDialog sd;
3863
3864
StatusOKButtonListener(ToolDialog sd) {
3865
this.sd = sd;
3866
}
3867
3868
public void actionPerformed(ActionEvent e) {
3869
sd.setVisible(false);
3870
sd.dispose();
3871
}
3872
}
3873
3874
/**
3875
* Event handler for UserSaveYes button
3876
*/
3877
class UserSaveYesButtonListener implements ActionListener {
3878
3879
private ToolDialog us;
3880
private PolicyTool tool;
3881
private ToolWindow tw;
3882
private int select;
3883
3884
UserSaveYesButtonListener(ToolDialog us, PolicyTool tool,
3885
ToolWindow tw, int select) {
3886
this.us = us;
3887
this.tool = tool;
3888
this.tw = tw;
3889
this.select = select;
3890
}
3891
3892
public void actionPerformed(ActionEvent e) {
3893
3894
// first get rid of the window
3895
us.setVisible(false);
3896
us.dispose();
3897
3898
try {
3899
String filename = ((JTextField)tw.getComponent(
3900
ToolWindow.MW_FILENAME_TEXTFIELD)).getText();
3901
if (filename == null || filename.equals("")) {
3902
us.displaySaveAsDialog(select);
3903
3904
// the above dialog will continue with the originally
3905
// requested command if necessary
3906
} else {
3907
// save the policy entries to a file
3908
tool.savePolicy(filename);
3909
3910
// display status
3911
MessageFormat form = new MessageFormat
3912
(PolicyTool.getMessage
3913
("Policy.successfully.written.to.filename"));
3914
Object[] source = {filename};
3915
tw.displayStatusDialog(null, form.format(source));
3916
3917
// now continue with the originally requested command
3918
// (QUIT, NEW, or OPEN)
3919
us.userSaveContinue(tool, tw, us, select);
3920
}
3921
} catch (Exception ee) {
3922
// error -- just report it and bail
3923
tw.displayErrorDialog(null, ee);
3924
}
3925
}
3926
}
3927
3928
/**
3929
* Event handler for UserSaveNoButton
3930
*/
3931
class UserSaveNoButtonListener implements ActionListener {
3932
3933
private PolicyTool tool;
3934
private ToolWindow tw;
3935
private ToolDialog us;
3936
private int select;
3937
3938
UserSaveNoButtonListener(ToolDialog us, PolicyTool tool,
3939
ToolWindow tw, int select) {
3940
this.us = us;
3941
this.tool = tool;
3942
this.tw = tw;
3943
this.select = select;
3944
}
3945
3946
public void actionPerformed(ActionEvent e) {
3947
us.setVisible(false);
3948
us.dispose();
3949
3950
// now continue with the originally requested command
3951
// (QUIT, NEW, or OPEN)
3952
us.userSaveContinue(tool, tw, us, select);
3953
}
3954
}
3955
3956
/**
3957
* Event handler for UserSaveCancelButton
3958
*/
3959
class UserSaveCancelButtonListener implements ActionListener {
3960
3961
private ToolDialog us;
3962
3963
UserSaveCancelButtonListener(ToolDialog us) {
3964
this.us = us;
3965
}
3966
3967
public void actionPerformed(ActionEvent e) {
3968
us.setVisible(false);
3969
us.dispose();
3970
3971
// do NOT continue with the originally requested command
3972
// (QUIT, NEW, or OPEN)
3973
}
3974
}
3975
3976
/**
3977
* Event handler for ConfirmRemovePolicyEntryOKButtonListener
3978
*/
3979
class ConfirmRemovePolicyEntryOKButtonListener implements ActionListener {
3980
3981
private PolicyTool tool;
3982
private ToolWindow tw;
3983
private ToolDialog us;
3984
3985
ConfirmRemovePolicyEntryOKButtonListener(PolicyTool tool,
3986
ToolWindow tw, ToolDialog us) {
3987
this.tool = tool;
3988
this.tw = tw;
3989
this.us = us;
3990
}
3991
3992
public void actionPerformed(ActionEvent e) {
3993
// remove the entry
3994
JList list = (JList)tw.getComponent(ToolWindow.MW_POLICY_LIST);
3995
int index = list.getSelectedIndex();
3996
PolicyEntry entries[] = tool.getEntry();
3997
tool.removeEntry(entries[index]);
3998
3999
// redraw the window listing
4000
DefaultListModel listModel = new DefaultListModel();
4001
list = new JList(listModel);
4002
list.setVisibleRowCount(15);
4003
list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
4004
list.addMouseListener(new PolicyListListener(tool, tw));
4005
entries = tool.getEntry();
4006
if (entries != null) {
4007
for (int i = 0; i < entries.length; i++) {
4008
listModel.addElement(entries[i].headerToString());
4009
}
4010
}
4011
tw.replacePolicyList(list);
4012
us.setVisible(false);
4013
us.dispose();
4014
}
4015
}
4016
4017
/**
4018
* Just a special name, so that the codes dealing with this exception knows
4019
* it's special, and does not pop out a warning box.
4020
*/
4021
class NoDisplayException extends RuntimeException {
4022
private static final long serialVersionUID = -4611761427108719794L;
4023
}
4024
4025
/**
4026
* This is a java.awt.List that bind an Object to each String it holds.
4027
*/
4028
class TaggedList extends JList {
4029
private static final long serialVersionUID = -5676238110427785853L;
4030
4031
private java.util.List<Object> data = new LinkedList<>();
4032
public TaggedList(int i, boolean b) {
4033
super(new DefaultListModel());
4034
setVisibleRowCount(i);
4035
setSelectionMode(b ? ListSelectionModel.MULTIPLE_INTERVAL_SELECTION : ListSelectionModel.SINGLE_SELECTION);
4036
}
4037
4038
public Object getObject(int index) {
4039
return data.get(index);
4040
}
4041
4042
public void addTaggedItem(String string, Object object) {
4043
((DefaultListModel)getModel()).addElement(string);
4044
data.add(object);
4045
}
4046
4047
public void replaceTaggedItem(String string, Object object, int index) {
4048
((DefaultListModel)getModel()).set(index, string);
4049
data.set(index, object);
4050
}
4051
4052
public void removeTaggedItem(int index) {
4053
((DefaultListModel)getModel()).remove(index);
4054
data.remove(index);
4055
}
4056
}
4057
4058
/**
4059
* Convenience Principal Classes
4060
*/
4061
4062
class Prin {
4063
public final String CLASS;
4064
public final String FULL_CLASS;
4065
4066
public Prin(String clazz, String fullClass) {
4067
this.CLASS = clazz;
4068
this.FULL_CLASS = fullClass;
4069
}
4070
}
4071
4072
class KrbPrin extends Prin {
4073
public KrbPrin() {
4074
super("KerberosPrincipal",
4075
"javax.security.auth.kerberos.KerberosPrincipal");
4076
}
4077
}
4078
4079
class X500Prin extends Prin {
4080
public X500Prin() {
4081
super("X500Principal",
4082
"javax.security.auth.x500.X500Principal");
4083
}
4084
}
4085
4086
/**
4087
* Convenience Permission Classes
4088
*/
4089
4090
class Perm {
4091
public final String CLASS;
4092
public final String FULL_CLASS;
4093
public final String[] TARGETS;
4094
public final String[] ACTIONS;
4095
4096
public Perm(String clazz, String fullClass,
4097
String[] targets, String[] actions) {
4098
4099
this.CLASS = clazz;
4100
this.FULL_CLASS = fullClass;
4101
this.TARGETS = targets;
4102
this.ACTIONS = actions;
4103
}
4104
}
4105
4106
class AllPerm extends Perm {
4107
public AllPerm() {
4108
super("AllPermission", "java.security.AllPermission", null, null);
4109
}
4110
}
4111
4112
class AudioPerm extends Perm {
4113
public AudioPerm() {
4114
super("AudioPermission",
4115
"javax.sound.sampled.AudioPermission",
4116
new String[] {
4117
"play",
4118
"record"
4119
},
4120
null);
4121
}
4122
}
4123
4124
class AuthPerm extends Perm {
4125
public AuthPerm() {
4126
super("AuthPermission",
4127
"javax.security.auth.AuthPermission",
4128
new String[] {
4129
"doAs",
4130
"doAsPrivileged",
4131
"getSubject",
4132
"getSubjectFromDomainCombiner",
4133
"setReadOnly",
4134
"modifyPrincipals",
4135
"modifyPublicCredentials",
4136
"modifyPrivateCredentials",
4137
"refreshCredential",
4138
"destroyCredential",
4139
"createLoginContext.<" + PolicyTool.getMessage("name") + ">",
4140
"getLoginConfiguration",
4141
"setLoginConfiguration",
4142
"createLoginConfiguration.<" +
4143
PolicyTool.getMessage("configuration.type") + ">",
4144
"refreshLoginConfiguration"
4145
},
4146
null);
4147
}
4148
}
4149
4150
class AWTPerm extends Perm {
4151
public AWTPerm() {
4152
super("AWTPermission",
4153
"java.awt.AWTPermission",
4154
new String[] {
4155
"accessClipboard",
4156
"accessEventQueue",
4157
"accessSystemTray",
4158
"createRobot",
4159
"fullScreenExclusive",
4160
"listenToAllAWTEvents",
4161
"readDisplayPixels",
4162
"replaceKeyboardFocusManager",
4163
"setAppletStub",
4164
"setWindowAlwaysOnTop",
4165
"showWindowWithoutWarningBanner",
4166
"toolkitModality",
4167
"watchMousePointer"
4168
},
4169
null);
4170
}
4171
}
4172
4173
class DelegationPerm extends Perm {
4174
public DelegationPerm() {
4175
super("DelegationPermission",
4176
"javax.security.auth.kerberos.DelegationPermission",
4177
new String[] {
4178
// allow user input
4179
},
4180
null);
4181
}
4182
}
4183
4184
class FilePerm extends Perm {
4185
public FilePerm() {
4186
super("FilePermission",
4187
"java.io.FilePermission",
4188
new String[] {
4189
"<<ALL FILES>>"
4190
},
4191
new String[] {
4192
"read",
4193
"write",
4194
"delete",
4195
"execute"
4196
});
4197
}
4198
}
4199
4200
class URLPerm extends Perm {
4201
public URLPerm() {
4202
super("URLPermission",
4203
"java.net.URLPermission",
4204
new String[] {
4205
"<"+ PolicyTool.getMessage("url") + ">",
4206
},
4207
new String[] {
4208
"<" + PolicyTool.getMessage("method.list") + ">:<"
4209
+ PolicyTool.getMessage("request.headers.list") + ">",
4210
});
4211
}
4212
}
4213
4214
class InqSecContextPerm extends Perm {
4215
public InqSecContextPerm() {
4216
super("InquireSecContextPermission",
4217
"com.sun.security.jgss.InquireSecContextPermission",
4218
new String[] {
4219
"KRB5_GET_SESSION_KEY",
4220
"KRB5_GET_TKT_FLAGS",
4221
"KRB5_GET_AUTHZ_DATA",
4222
"KRB5_GET_AUTHTIME"
4223
},
4224
null);
4225
}
4226
}
4227
4228
class LogPerm extends Perm {
4229
public LogPerm() {
4230
super("LoggingPermission",
4231
"java.util.logging.LoggingPermission",
4232
new String[] {
4233
"control"
4234
},
4235
null);
4236
}
4237
}
4238
4239
class MgmtPerm extends Perm {
4240
public MgmtPerm() {
4241
super("ManagementPermission",
4242
"java.lang.management.ManagementPermission",
4243
new String[] {
4244
"control",
4245
"monitor"
4246
},
4247
null);
4248
}
4249
}
4250
4251
class MBeanPerm extends Perm {
4252
public MBeanPerm() {
4253
super("MBeanPermission",
4254
"javax.management.MBeanPermission",
4255
new String[] {
4256
// allow user input
4257
},
4258
new String[] {
4259
"addNotificationListener",
4260
"getAttribute",
4261
"getClassLoader",
4262
"getClassLoaderFor",
4263
"getClassLoaderRepository",
4264
"getDomains",
4265
"getMBeanInfo",
4266
"getObjectInstance",
4267
"instantiate",
4268
"invoke",
4269
"isInstanceOf",
4270
"queryMBeans",
4271
"queryNames",
4272
"registerMBean",
4273
"removeNotificationListener",
4274
"setAttribute",
4275
"unregisterMBean"
4276
});
4277
}
4278
}
4279
4280
class MBeanSvrPerm extends Perm {
4281
public MBeanSvrPerm() {
4282
super("MBeanServerPermission",
4283
"javax.management.MBeanServerPermission",
4284
new String[] {
4285
"createMBeanServer",
4286
"findMBeanServer",
4287
"newMBeanServer",
4288
"releaseMBeanServer"
4289
},
4290
null);
4291
}
4292
}
4293
4294
class MBeanTrustPerm extends Perm {
4295
public MBeanTrustPerm() {
4296
super("MBeanTrustPermission",
4297
"javax.management.MBeanTrustPermission",
4298
new String[] {
4299
"register"
4300
},
4301
null);
4302
}
4303
}
4304
4305
class NetPerm extends Perm {
4306
public NetPerm() {
4307
super("NetPermission",
4308
"java.net.NetPermission",
4309
new String[] {
4310
"setDefaultAuthenticator",
4311
"requestPasswordAuthentication",
4312
"specifyStreamHandler",
4313
"setProxySelector",
4314
"getProxySelector",
4315
"setCookieHandler",
4316
"getCookieHandler",
4317
"setResponseCache",
4318
"getResponseCache"
4319
},
4320
null);
4321
}
4322
}
4323
4324
class PrivCredPerm extends Perm {
4325
public PrivCredPerm() {
4326
super("PrivateCredentialPermission",
4327
"javax.security.auth.PrivateCredentialPermission",
4328
new String[] {
4329
// allow user input
4330
},
4331
new String[] {
4332
"read"
4333
});
4334
}
4335
}
4336
4337
class PropPerm extends Perm {
4338
public PropPerm() {
4339
super("PropertyPermission",
4340
"java.util.PropertyPermission",
4341
new String[] {
4342
// allow user input
4343
},
4344
new String[] {
4345
"read",
4346
"write"
4347
});
4348
}
4349
}
4350
4351
class ReflectPerm extends Perm {
4352
public ReflectPerm() {
4353
super("ReflectPermission",
4354
"java.lang.reflect.ReflectPermission",
4355
new String[] {
4356
"suppressAccessChecks"
4357
},
4358
null);
4359
}
4360
}
4361
4362
class RuntimePerm extends Perm {
4363
public RuntimePerm() {
4364
super("RuntimePermission",
4365
"java.lang.RuntimePermission",
4366
new String[] {
4367
"createClassLoader",
4368
"getClassLoader",
4369
"setContextClassLoader",
4370
"enableContextClassLoaderOverride",
4371
"setSecurityManager",
4372
"createSecurityManager",
4373
"getenv.<" +
4374
PolicyTool.getMessage("environment.variable.name") + ">",
4375
"exitVM",
4376
"shutdownHooks",
4377
"setFactory",
4378
"setIO",
4379
"modifyThread",
4380
"stopThread",
4381
"modifyThreadGroup",
4382
"getProtectionDomain",
4383
"readFileDescriptor",
4384
"writeFileDescriptor",
4385
"loadLibrary.<" +
4386
PolicyTool.getMessage("library.name") + ">",
4387
"accessClassInPackage.<" +
4388
PolicyTool.getMessage("package.name")+">",
4389
"defineClassInPackage.<" +
4390
PolicyTool.getMessage("package.name")+">",
4391
"accessDeclaredMembers",
4392
"queuePrintJob",
4393
"getStackTrace",
4394
"setDefaultUncaughtExceptionHandler",
4395
"preferences",
4396
"usePolicy",
4397
// "inheritedChannel"
4398
},
4399
null);
4400
}
4401
}
4402
4403
class SecurityPerm extends Perm {
4404
public SecurityPerm() {
4405
super("SecurityPermission",
4406
"java.security.SecurityPermission",
4407
new String[] {
4408
"createAccessControlContext",
4409
"getDomainCombiner",
4410
"getPolicy",
4411
"setPolicy",
4412
"createPolicy.<" +
4413
PolicyTool.getMessage("policy.type") + ">",
4414
"getProperty.<" +
4415
PolicyTool.getMessage("property.name") + ">",
4416
"setProperty.<" +
4417
PolicyTool.getMessage("property.name") + ">",
4418
"insertProvider.<" +
4419
PolicyTool.getMessage("provider.name") + ">",
4420
"removeProvider.<" +
4421
PolicyTool.getMessage("provider.name") + ">",
4422
//"setSystemScope",
4423
//"setIdentityPublicKey",
4424
//"setIdentityInfo",
4425
//"addIdentityCertificate",
4426
//"removeIdentityCertificate",
4427
//"printIdentity",
4428
"clearProviderProperties.<" +
4429
PolicyTool.getMessage("provider.name") + ">",
4430
"putProviderProperty.<" +
4431
PolicyTool.getMessage("provider.name") + ">",
4432
"removeProviderProperty.<" +
4433
PolicyTool.getMessage("provider.name") + ">",
4434
//"getSignerPrivateKey",
4435
//"setSignerKeyPair"
4436
},
4437
null);
4438
}
4439
}
4440
4441
class SerialPerm extends Perm {
4442
public SerialPerm() {
4443
super("SerializablePermission",
4444
"java.io.SerializablePermission",
4445
new String[] {
4446
"enableSubclassImplementation",
4447
"enableSubstitution"
4448
},
4449
null);
4450
}
4451
}
4452
4453
class ServicePerm extends Perm {
4454
public ServicePerm() {
4455
super("ServicePermission",
4456
"javax.security.auth.kerberos.ServicePermission",
4457
new String[] {
4458
// allow user input
4459
},
4460
new String[] {
4461
"initiate",
4462
"accept"
4463
});
4464
}
4465
}
4466
4467
class SocketPerm extends Perm {
4468
public SocketPerm() {
4469
super("SocketPermission",
4470
"java.net.SocketPermission",
4471
new String[] {
4472
// allow user input
4473
},
4474
new String[] {
4475
"accept",
4476
"connect",
4477
"listen",
4478
"resolve"
4479
});
4480
}
4481
}
4482
4483
class SQLPerm extends Perm {
4484
public SQLPerm() {
4485
super("SQLPermission",
4486
"java.sql.SQLPermission",
4487
new String[] {
4488
"setLog",
4489
"callAbort",
4490
"setSyncFactory",
4491
"setNetworkTimeout",
4492
},
4493
null);
4494
}
4495
}
4496
4497
class SSLPerm extends Perm {
4498
public SSLPerm() {
4499
super("SSLPermission",
4500
"javax.net.ssl.SSLPermission",
4501
new String[] {
4502
"setHostnameVerifier",
4503
"getSSLSessionContext"
4504
},
4505
null);
4506
}
4507
}
4508
4509
class SubjDelegPerm extends Perm {
4510
public SubjDelegPerm() {
4511
super("SubjectDelegationPermission",
4512
"javax.management.remote.SubjectDelegationPermission",
4513
new String[] {
4514
// allow user input
4515
},
4516
null);
4517
}
4518
}
4519
4520