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 StringBuilder sb = new StringBuilder(200); 979 ListIterator<PolicyParser.PrincipalEntry> list = 980 grantEntry.principals.listIterator(); 981 while (list.hasNext()) { 982 PolicyParser.PrincipalEntry pppe = list.next(); 983 sb.append(" Principal " + pppe.getDisplayClass() + " " + 984 pppe.getDisplayName(true)); 985 if (list.hasNext()) sb.append(", "); 986 } 987 result = sb.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 (PrivilegedAction<String>) () -> System.getProperty("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<String> listModel = new DefaultListModel<>(); 1173 JList<String> 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<String> 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<String> 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<String> 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<String> policyList) { 1333 1334 // remove the original list of Policy Entries 1335 // and add the new list of entries 1336 @SuppressWarnings("unchecked") 1337 JList<String> list = (JList<String>)getComponent(MW_POLICY_LIST); 1338 list.setModel(policyList.getModel()); 1339 } 1340 1341 /** 1342 * display the main PolicyTool window 1343 */ 1344 void displayToolWindow(String args[]) { 1345 1346 setTitle(PolicyTool.getMessage("Policy.Tool")); 1347 setResizable(true); 1348 addWindowListener(new ToolWindowListener(tool, this)); 1349 //setBounds(135, 80, 500, 500); 1350 getContentPane().setLayout(new GridBagLayout()); 1351 1352 initWindow(); 1353 pack(); 1354 setLocationRelativeTo(null); 1355 1356 // display it 1357 setVisible(true); 1358 1359 if (tool.newWarning == true) { 1360 displayStatusDialog(this, PolicyTool.getMessage 1361 ("Errors.have.occurred.while.opening.the.policy.configuration.View.the.Warning.Log.for.more.information.")); 1362 } 1363 } 1364 1365 /** 1366 * displays a dialog box describing an error which occurred. 1367 */ 1368 void displayErrorDialog(Window w, String error) { 1369 ToolDialog ed = new ToolDialog 1370 (PolicyTool.getMessage("Error"), tool, this, true); 1371 1372 // find where the PolicyTool gui is 1373 Point location = ((w == null) ? 1374 getLocationOnScreen() : w.getLocationOnScreen()); 1375 //ed.setBounds(location.x + 50, location.y + 50, 600, 100); 1376 ed.setLayout(new GridBagLayout()); 1377 1378 JLabel label = new JLabel(error); 1379 addNewComponent(ed, label, 0, 1380 0, 0, 1, 1, 0.0, 0.0, GridBagConstraints.BOTH); 1381 1382 JButton okButton = new JButton(PolicyTool.getMessage("OK")); 1383 ActionListener okListener = new ErrorOKButtonListener(ed); 1384 okButton.addActionListener(okListener); 1385 addNewComponent(ed, okButton, 1, 1386 0, 1, 1, 1, 0.0, 0.0, GridBagConstraints.VERTICAL); 1387 1388 ed.getRootPane().setDefaultButton(okButton); 1389 ed.getRootPane().registerKeyboardAction(okListener, escKey, JComponent.WHEN_IN_FOCUSED_WINDOW); 1390 1391 ed.pack(); 1392 ed.setLocationRelativeTo(w); 1393 ed.setVisible(true); 1394 } 1395 1396 /** 1397 * displays a dialog box describing an error which occurred. 1398 */ 1399 void displayErrorDialog(Window w, Throwable t) { 1400 if (t instanceof NoDisplayException) { 1401 return; 1402 } 1403 displayErrorDialog(w, t.toString()); 1404 } 1405 1406 /** 1407 * displays a dialog box describing the status of an event 1408 */ 1409 void displayStatusDialog(Window w, String status) { 1410 ToolDialog sd = new ToolDialog 1411 (PolicyTool.getMessage("Status"), tool, this, true); 1412 1413 // find the location of the PolicyTool gui 1414 Point location = ((w == null) ? 1415 getLocationOnScreen() : w.getLocationOnScreen()); 1416 //sd.setBounds(location.x + 50, location.y + 50, 500, 100); 1417 sd.setLayout(new GridBagLayout()); 1418 1419 JLabel label = new JLabel(status); 1420 addNewComponent(sd, label, 0, 1421 0, 0, 1, 1, 0.0, 0.0, GridBagConstraints.BOTH); 1422 1423 JButton okButton = new JButton(PolicyTool.getMessage("OK")); 1424 ActionListener okListener = new StatusOKButtonListener(sd); 1425 okButton.addActionListener(okListener); 1426 addNewComponent(sd, okButton, 1, 1427 0, 1, 1, 1, 0.0, 0.0, GridBagConstraints.VERTICAL); 1428 1429 sd.getRootPane().setDefaultButton(okButton); 1430 sd.getRootPane().registerKeyboardAction(okListener, escKey, JComponent.WHEN_IN_FOCUSED_WINDOW); 1431 1432 sd.pack(); 1433 sd.setLocationRelativeTo(w); 1434 sd.setVisible(true); 1435 } 1436 1437 /** 1438 * display the warning log 1439 */ 1440 void displayWarningLog(Window w) { 1441 1442 ToolDialog wd = new ToolDialog 1443 (PolicyTool.getMessage("Warning"), tool, this, true); 1444 1445 // find the location of the PolicyTool gui 1446 Point location = ((w == null) ? 1447 getLocationOnScreen() : w.getLocationOnScreen()); 1448 //wd.setBounds(location.x + 50, location.y + 50, 500, 100); 1449 wd.setLayout(new GridBagLayout()); 1450 1451 JTextArea ta = new JTextArea(); 1452 ta.setEditable(false); 1453 for (int i = 0; i < tool.warnings.size(); i++) { 1454 ta.append(tool.warnings.elementAt(i)); 1455 ta.append(PolicyTool.getMessage("NEWLINE")); 1456 } 1457 addNewComponent(wd, ta, 0, 1458 0, 0, 1, 1, 0.0, 0.0, GridBagConstraints.BOTH, 1459 BOTTOM_PADDING); 1460 ta.setFocusable(false); 1461 1462 JButton okButton = new JButton(PolicyTool.getMessage("OK")); 1463 ActionListener okListener = new CancelButtonListener(wd); 1464 okButton.addActionListener(okListener); 1465 addNewComponent(wd, okButton, 1, 1466 0, 1, 1, 1, 0.0, 0.0, GridBagConstraints.VERTICAL, 1467 LR_PADDING); 1468 1469 wd.getRootPane().setDefaultButton(okButton); 1470 wd.getRootPane().registerKeyboardAction(okListener, escKey, JComponent.WHEN_IN_FOCUSED_WINDOW); 1471 1472 wd.pack(); 1473 wd.setLocationRelativeTo(w); 1474 wd.setVisible(true); 1475 } 1476 1477 char displayYesNoDialog(Window w, String title, String prompt, String yes, String no) { 1478 1479 final ToolDialog tw = new ToolDialog 1480 (title, tool, this, true); 1481 Point location = ((w == null) ? 1482 getLocationOnScreen() : w.getLocationOnScreen()); 1483 //tw.setBounds(location.x + 75, location.y + 100, 400, 150); 1484 tw.setLayout(new GridBagLayout()); 1485 1486 JTextArea ta = new JTextArea(prompt, 10, 50); 1487 ta.setEditable(false); 1488 ta.setLineWrap(true); 1489 ta.setWrapStyleWord(true); 1490 JScrollPane scrollPane = new JScrollPane(ta, 1491 JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, 1492 JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); 1493 addNewComponent(tw, scrollPane, 0, 1494 0, 0, 1, 1, 0.0, 0.0, GridBagConstraints.BOTH); 1495 ta.setFocusable(false); 1496 1497 JPanel panel = new JPanel(); 1498 panel.setLayout(new GridBagLayout()); 1499 1500 // StringBuffer to store button press. Must be final. 1501 final StringBuffer chooseResult = new StringBuffer(); 1502 1503 JButton button = new JButton(yes); 1504 button.addActionListener(new ActionListener() { 1505 public void actionPerformed(ActionEvent e) { 1506 chooseResult.append('Y'); 1507 tw.setVisible(false); 1508 tw.dispose(); 1509 } 1510 }); 1511 addNewComponent(panel, button, 0, 1512 0, 0, 1, 1, 0.0, 0.0, GridBagConstraints.VERTICAL, 1513 LR_PADDING); 1514 1515 button = new JButton(no); 1516 button.addActionListener(new ActionListener() { 1517 public void actionPerformed(ActionEvent e) { 1518 chooseResult.append('N'); 1519 tw.setVisible(false); 1520 tw.dispose(); 1521 } 1522 }); 1523 addNewComponent(panel, button, 1, 1524 1, 0, 1, 1, 0.0, 0.0, GridBagConstraints.VERTICAL, 1525 LR_PADDING); 1526 1527 addNewComponent(tw, panel, 1, 1528 0, 1, 1, 1, 0.0, 0.0, GridBagConstraints.VERTICAL); 1529 1530 tw.pack(); 1531 tw.setLocationRelativeTo(w); 1532 tw.setVisible(true); 1533 if (chooseResult.length() > 0) { 1534 return chooseResult.charAt(0); 1535 } else { 1536 // I did encounter this once, don't why. 1537 return 'N'; 1538 } 1539 } 1540 1541 } 1542 1543 /** 1544 * General dialog window 1545 */ 1546 class ToolDialog extends JDialog { 1547 // use serialVersionUID from JDK 1.2.2 for interoperability 1548 private static final long serialVersionUID = -372244357011301190L; 1549 1550 /* ESCAPE key */ 1551 static final KeyStroke escKey = KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0); 1552 1553 /* necessary constants */ 1554 public static final int NOACTION = 0; 1555 public static final int QUIT = 1; 1556 public static final int NEW = 2; 1557 public static final int OPEN = 3; 1558 1559 public static final String ALL_PERM_CLASS = 1560 "java.security.AllPermission"; 1561 public static final String FILE_PERM_CLASS = 1562 "java.io.FilePermission"; 1563 1564 public static final String X500_PRIN_CLASS = 1565 "javax.security.auth.x500.X500Principal"; 1566 1567 /* popup menus */ 1568 public static final String PERM = 1569 PolicyTool.getMessage 1570 ("Permission."); 1571 1572 public static final String PRIN_TYPE = 1573 PolicyTool.getMessage("Principal.Type."); 1574 public static final String PRIN_NAME = 1575 PolicyTool.getMessage("Principal.Name."); 1576 1577 /* more popu menus */ 1578 public static final String PERM_NAME = 1579 PolicyTool.getMessage 1580 ("Target.Name."); 1581 1582 /* and more popup menus */ 1583 public static final String PERM_ACTIONS = 1584 PolicyTool.getMessage 1585 ("Actions."); 1586 1587 /* gridbag index for display PolicyEntry (PE) components */ 1588 public static final int PE_CODEBASE_LABEL = 0; 1589 public static final int PE_CODEBASE_TEXTFIELD = 1; 1590 public static final int PE_SIGNEDBY_LABEL = 2; 1591 public static final int PE_SIGNEDBY_TEXTFIELD = 3; 1592 1593 public static final int PE_PANEL0 = 4; 1594 public static final int PE_ADD_PRIN_BUTTON = 0; 1595 public static final int PE_EDIT_PRIN_BUTTON = 1; 1596 public static final int PE_REMOVE_PRIN_BUTTON = 2; 1597 1598 public static final int PE_PRIN_LABEL = 5; 1599 public static final int PE_PRIN_LIST = 6; 1600 1601 public static final int PE_PANEL1 = 7; 1602 public static final int PE_ADD_PERM_BUTTON = 0; 1603 public static final int PE_EDIT_PERM_BUTTON = 1; 1604 public static final int PE_REMOVE_PERM_BUTTON = 2; 1605 1606 public static final int PE_PERM_LIST = 8; 1607 1608 public static final int PE_PANEL2 = 9; 1609 public static final int PE_CANCEL_BUTTON = 1; 1610 public static final int PE_DONE_BUTTON = 0; 1611 1612 /* the gridbag index for components in the Principal Dialog (PRD) */ 1613 public static final int PRD_DESC_LABEL = 0; 1614 public static final int PRD_PRIN_CHOICE = 1; 1615 public static final int PRD_PRIN_TEXTFIELD = 2; 1616 public static final int PRD_NAME_LABEL = 3; 1617 public static final int PRD_NAME_TEXTFIELD = 4; 1618 public static final int PRD_CANCEL_BUTTON = 6; 1619 public static final int PRD_OK_BUTTON = 5; 1620 1621 /* the gridbag index for components in the Permission Dialog (PD) */ 1622 public static final int PD_DESC_LABEL = 0; 1623 public static final int PD_PERM_CHOICE = 1; 1624 public static final int PD_PERM_TEXTFIELD = 2; 1625 public static final int PD_NAME_CHOICE = 3; 1626 public static final int PD_NAME_TEXTFIELD = 4; 1627 public static final int PD_ACTIONS_CHOICE = 5; 1628 public static final int PD_ACTIONS_TEXTFIELD = 6; 1629 public static final int PD_SIGNEDBY_LABEL = 7; 1630 public static final int PD_SIGNEDBY_TEXTFIELD = 8; 1631 public static final int PD_CANCEL_BUTTON = 10; 1632 public static final int PD_OK_BUTTON = 9; 1633 1634 /* modes for KeyStore */ 1635 public static final int EDIT_KEYSTORE = 0; 1636 1637 /* the gridbag index for components in the Change KeyStore Dialog (KSD) */ 1638 public static final int KSD_NAME_LABEL = 0; 1639 public static final int KSD_NAME_TEXTFIELD = 1; 1640 public static final int KSD_TYPE_LABEL = 2; 1641 public static final int KSD_TYPE_TEXTFIELD = 3; 1642 public static final int KSD_PROVIDER_LABEL = 4; 1643 public static final int KSD_PROVIDER_TEXTFIELD = 5; 1644 public static final int KSD_PWD_URL_LABEL = 6; 1645 public static final int KSD_PWD_URL_TEXTFIELD = 7; 1646 public static final int KSD_CANCEL_BUTTON = 9; 1647 public static final int KSD_OK_BUTTON = 8; 1648 1649 /* the gridbag index for components in the User Save Changes Dialog (USC) */ 1650 public static final int USC_LABEL = 0; 1651 public static final int USC_PANEL = 1; 1652 public static final int USC_YES_BUTTON = 0; 1653 public static final int USC_NO_BUTTON = 1; 1654 public static final int USC_CANCEL_BUTTON = 2; 1655 1656 /* gridbag index for the ConfirmRemovePolicyEntryDialog (CRPE) */ 1657 public static final int CRPE_LABEL1 = 0; 1658 public static final int CRPE_LABEL2 = 1; 1659 public static final int CRPE_PANEL = 2; 1660 public static final int CRPE_PANEL_OK = 0; 1661 public static final int CRPE_PANEL_CANCEL = 1; 1662 1663 /* some private static finals */ 1664 private static final int PERMISSION = 0; 1665 private static final int PERMISSION_NAME = 1; 1666 private static final int PERMISSION_ACTIONS = 2; 1667 private static final int PERMISSION_SIGNEDBY = 3; 1668 private static final int PRINCIPAL_TYPE = 4; 1669 private static final int PRINCIPAL_NAME = 5; 1670 1671 /* The preferred height of JTextField should match JComboBox. */ 1672 static final int TEXTFIELD_HEIGHT = new JComboBox<>().getPreferredSize().height; 1673 1674 public static java.util.ArrayList<Perm> PERM_ARRAY; 1675 public static java.util.ArrayList<Prin> PRIN_ARRAY; 1676 PolicyTool tool; 1677 ToolWindow tw; 1678 1679 static { 1680 1681 // set up permission objects 1682 1683 PERM_ARRAY = new java.util.ArrayList<Perm>(); 1684 PERM_ARRAY.add(new AllPerm()); 1685 PERM_ARRAY.add(new AudioPerm()); 1686 PERM_ARRAY.add(new AuthPerm()); 1687 PERM_ARRAY.add(new AWTPerm()); 1688 PERM_ARRAY.add(new DelegationPerm()); 1689 PERM_ARRAY.add(new FilePerm()); 1690 PERM_ARRAY.add(new URLPerm()); 1691 PERM_ARRAY.add(new InqSecContextPerm()); 1692 PERM_ARRAY.add(new LogPerm()); 1693 PERM_ARRAY.add(new MgmtPerm()); 1694 PERM_ARRAY.add(new MBeanPerm()); 1695 PERM_ARRAY.add(new MBeanSvrPerm()); 1696 PERM_ARRAY.add(new MBeanTrustPerm()); 1697 PERM_ARRAY.add(new NetPerm()); 1698 PERM_ARRAY.add(new PrivCredPerm()); 1699 PERM_ARRAY.add(new PropPerm()); 1700 PERM_ARRAY.add(new ReflectPerm()); 1701 PERM_ARRAY.add(new RuntimePerm()); 1702 PERM_ARRAY.add(new SecurityPerm()); 1703 PERM_ARRAY.add(new SerialPerm()); 1704 PERM_ARRAY.add(new ServicePerm()); 1705 PERM_ARRAY.add(new SocketPerm()); 1706 PERM_ARRAY.add(new SQLPerm()); 1707 PERM_ARRAY.add(new SSLPerm()); 1708 PERM_ARRAY.add(new SubjDelegPerm()); 1709 1710 // set up principal objects 1711 1712 PRIN_ARRAY = new java.util.ArrayList<Prin>(); 1713 PRIN_ARRAY.add(new KrbPrin()); 1714 PRIN_ARRAY.add(new X500Prin()); 1715 } 1716 1717 ToolDialog(String title, PolicyTool tool, ToolWindow tw, boolean modal) { 1718 super(tw, modal); 1719 setTitle(title); 1720 this.tool = tool; 1721 this.tw = tw; 1722 addWindowListener(new ChildWindowListener(this)); 1723 1724 // Create some space around components 1725 ((JPanel)getContentPane()).setBorder(new EmptyBorder(6, 6, 6, 6)); 1726 } 1727 1728 /** 1729 * Don't call getComponent directly on the window 1730 */ 1731 public Component getComponent(int n) { 1732 Component c = getContentPane().getComponent(n); 1733 if (c instanceof JScrollPane) { 1734 c = ((JScrollPane)c).getViewport().getView(); 1735 } 1736 return c; 1737 } 1738 1739 /** 1740 * get the Perm instance based on either the (shortened) class name 1741 * or the fully qualified class name 1742 */ 1743 static Perm getPerm(String clazz, boolean fullClassName) { 1744 for (int i = 0; i < PERM_ARRAY.size(); i++) { 1745 Perm next = PERM_ARRAY.get(i); 1746 if (fullClassName) { 1747 if (next.FULL_CLASS.equals(clazz)) { 1748 return next; 1749 } 1750 } else { 1751 if (next.CLASS.equals(clazz)) { 1752 return next; 1753 } 1754 } 1755 } 1756 return null; 1757 } 1758 1759 /** 1760 * get the Prin instance based on either the (shortened) class name 1761 * or the fully qualified class name 1762 */ 1763 static Prin getPrin(String clazz, boolean fullClassName) { 1764 for (int i = 0; i < PRIN_ARRAY.size(); i++) { 1765 Prin next = PRIN_ARRAY.get(i); 1766 if (fullClassName) { 1767 if (next.FULL_CLASS.equals(clazz)) { 1768 return next; 1769 } 1770 } else { 1771 if (next.CLASS.equals(clazz)) { 1772 return next; 1773 } 1774 } 1775 } 1776 return null; 1777 } 1778 1779 /** 1780 * pop up a dialog so the user can enter info to add a new PolicyEntry 1781 * - if edit is TRUE, then the user is editing an existing entry 1782 * and we should display the original info as well. 1783 * 1784 * - the other reason we need the 'edit' boolean is we need to know 1785 * when we are adding a NEW policy entry. in this case, we can 1786 * not simply update the existing entry, because it doesn't exist. 1787 * we ONLY update the GUI listing/info, and then when the user 1788 * finally clicks 'OK' or 'DONE', then we can collect that info 1789 * and add it to the policy. 1790 */ 1791 void displayPolicyEntryDialog(boolean edit) { 1792 1793 int listIndex = 0; 1794 PolicyEntry entries[] = null; 1795 TaggedList prinList = new TaggedList(3, false); 1796 prinList.getAccessibleContext().setAccessibleName( 1797 PolicyTool.getMessage("Principal.List")); 1798 prinList.addMouseListener 1799 (new EditPrinButtonListener(tool, tw, this, edit)); 1800 TaggedList permList = new TaggedList(10, false); 1801 permList.getAccessibleContext().setAccessibleName( 1802 PolicyTool.getMessage("Permission.List")); 1803 permList.addMouseListener 1804 (new EditPermButtonListener(tool, tw, this, edit)); 1805 1806 // find where the PolicyTool gui is 1807 Point location = tw.getLocationOnScreen(); 1808 //setBounds(location.x + 75, location.y + 200, 650, 500); 1809 setLayout(new GridBagLayout()); 1810 setResizable(true); 1811 1812 if (edit) { 1813 // get the selected item 1814 entries = tool.getEntry(); 1815 @SuppressWarnings("unchecked") 1816 JList<String> policyList = (JList<String>)tw.getComponent(ToolWindow.MW_POLICY_LIST); 1817 listIndex = policyList.getSelectedIndex(); 1818 1819 // get principal list 1820 LinkedList<PolicyParser.PrincipalEntry> principals = 1821 entries[listIndex].getGrantEntry().principals; 1822 for (int i = 0; i < principals.size(); i++) { 1823 String prinString = null; 1824 PolicyParser.PrincipalEntry nextPrin = principals.get(i); 1825 prinList.addTaggedItem(PrincipalEntryToUserFriendlyString(nextPrin), nextPrin); 1826 } 1827 1828 // get permission list 1829 Vector<PolicyParser.PermissionEntry> permissions = 1830 entries[listIndex].getGrantEntry().permissionEntries; 1831 for (int i = 0; i < permissions.size(); i++) { 1832 String permString = null; 1833 PolicyParser.PermissionEntry nextPerm = 1834 permissions.elementAt(i); 1835 permList.addTaggedItem(ToolDialog.PermissionEntryToUserFriendlyString(nextPerm), nextPerm); 1836 } 1837 } 1838 1839 // codebase label and textfield 1840 JLabel label = new JLabel(); 1841 tw.addNewComponent(this, label, PE_CODEBASE_LABEL, 1842 0, 0, 1, 1, 0.0, 0.0, GridBagConstraints.BOTH, 1843 ToolWindow.R_PADDING); 1844 JTextField tf; 1845 tf = (edit ? 1846 new JTextField(entries[listIndex].getGrantEntry().codeBase) : 1847 new JTextField()); 1848 ToolWindow.configureLabelFor(label, tf, "CodeBase."); 1849 tf.setPreferredSize(new Dimension(tf.getPreferredSize().width, TEXTFIELD_HEIGHT)); 1850 tf.getAccessibleContext().setAccessibleName( 1851 PolicyTool.getMessage("Code.Base")); 1852 tw.addNewComponent(this, tf, PE_CODEBASE_TEXTFIELD, 1853 1, 0, 1, 1, 1.0, 0.0, GridBagConstraints.BOTH); 1854 1855 // signedby label and textfield 1856 label = new JLabel(); 1857 tw.addNewComponent(this, label, PE_SIGNEDBY_LABEL, 1858 0, 1, 1, 1, 0.0, 0.0, GridBagConstraints.BOTH, 1859 ToolWindow.R_PADDING); 1860 tf = (edit ? 1861 new JTextField(entries[listIndex].getGrantEntry().signedBy) : 1862 new JTextField()); 1863 ToolWindow.configureLabelFor(label, tf, "SignedBy."); 1864 tf.setPreferredSize(new Dimension(tf.getPreferredSize().width, TEXTFIELD_HEIGHT)); 1865 tf.getAccessibleContext().setAccessibleName( 1866 PolicyTool.getMessage("Signed.By.")); 1867 tw.addNewComponent(this, tf, PE_SIGNEDBY_TEXTFIELD, 1868 1, 1, 1, 1, 1.0, 0.0, GridBagConstraints.BOTH); 1869 1870 // panel for principal buttons 1871 JPanel panel = new JPanel(); 1872 panel.setLayout(new GridBagLayout()); 1873 1874 JButton button = new JButton(); 1875 ToolWindow.configureButton(button, "Add.Principal"); 1876 button.addActionListener 1877 (new AddPrinButtonListener(tool, tw, this, edit)); 1878 tw.addNewComponent(panel, button, PE_ADD_PRIN_BUTTON, 1879 0, 0, 1, 1, 100.0, 0.0, GridBagConstraints.HORIZONTAL); 1880 1881 button = new JButton(); 1882 ToolWindow.configureButton(button, "Edit.Principal"); 1883 button.addActionListener(new EditPrinButtonListener 1884 (tool, tw, this, edit)); 1885 tw.addNewComponent(panel, button, PE_EDIT_PRIN_BUTTON, 1886 1, 0, 1, 1, 100.0, 0.0, GridBagConstraints.HORIZONTAL); 1887 1888 button = new JButton(); 1889 ToolWindow.configureButton(button, "Remove.Principal"); 1890 button.addActionListener(new RemovePrinButtonListener 1891 (tool, tw, this, edit)); 1892 tw.addNewComponent(panel, button, PE_REMOVE_PRIN_BUTTON, 1893 2, 0, 1, 1, 100.0, 0.0, GridBagConstraints.HORIZONTAL); 1894 1895 tw.addNewComponent(this, panel, PE_PANEL0, 1896 1, 2, 1, 1, 0.0, 0.0, GridBagConstraints.HORIZONTAL, 1897 ToolWindow.LITE_BOTTOM_PADDING); 1898 1899 // principal label and list 1900 label = new JLabel(); 1901 tw.addNewComponent(this, label, PE_PRIN_LABEL, 1902 0, 3, 1, 1, 0.0, 0.0, GridBagConstraints.BOTH, 1903 ToolWindow.R_BOTTOM_PADDING); 1904 JScrollPane scrollPane = new JScrollPane(prinList); 1905 ToolWindow.configureLabelFor(label, scrollPane, "Principals."); 1906 tw.addNewComponent(this, scrollPane, PE_PRIN_LIST, 1907 1, 3, 3, 1, 0.0, prinList.getVisibleRowCount(), GridBagConstraints.BOTH, 1908 ToolWindow.BOTTOM_PADDING); 1909 1910 // panel for permission buttons 1911 panel = new JPanel(); 1912 panel.setLayout(new GridBagLayout()); 1913 1914 button = new JButton(); 1915 ToolWindow.configureButton(button, ".Add.Permission"); 1916 button.addActionListener(new AddPermButtonListener 1917 (tool, tw, this, edit)); 1918 tw.addNewComponent(panel, button, PE_ADD_PERM_BUTTON, 1919 0, 0, 1, 1, 100.0, 0.0, GridBagConstraints.HORIZONTAL); 1920 1921 button = new JButton(); 1922 ToolWindow.configureButton(button, ".Edit.Permission"); 1923 button.addActionListener(new EditPermButtonListener 1924 (tool, tw, this, edit)); 1925 tw.addNewComponent(panel, button, PE_EDIT_PERM_BUTTON, 1926 1, 0, 1, 1, 100.0, 0.0, GridBagConstraints.HORIZONTAL); 1927 1928 1929 button = new JButton(); 1930 ToolWindow.configureButton(button, "Remove.Permission"); 1931 button.addActionListener(new RemovePermButtonListener 1932 (tool, tw, this, edit)); 1933 tw.addNewComponent(panel, button, PE_REMOVE_PERM_BUTTON, 1934 2, 0, 1, 1, 100.0, 0.0, GridBagConstraints.HORIZONTAL); 1935 1936 tw.addNewComponent(this, panel, PE_PANEL1, 1937 0, 4, 2, 1, 0.0, 0.0, GridBagConstraints.HORIZONTAL, 1938 ToolWindow.LITE_BOTTOM_PADDING); 1939 1940 // permission list 1941 scrollPane = new JScrollPane(permList); 1942 tw.addNewComponent(this, scrollPane, PE_PERM_LIST, 1943 0, 5, 3, 1, 0.0, permList.getVisibleRowCount(), GridBagConstraints.BOTH, 1944 ToolWindow.BOTTOM_PADDING); 1945 1946 1947 // panel for Done and Cancel buttons 1948 panel = new JPanel(); 1949 panel.setLayout(new GridBagLayout()); 1950 1951 // Done Button 1952 JButton okButton = new JButton(PolicyTool.getMessage("Done")); 1953 okButton.addActionListener 1954 (new AddEntryDoneButtonListener(tool, tw, this, edit)); 1955 tw.addNewComponent(panel, okButton, PE_DONE_BUTTON, 1956 0, 0, 1, 1, 0.0, 0.0, GridBagConstraints.VERTICAL, 1957 ToolWindow.LR_PADDING); 1958 1959 // Cancel Button 1960 JButton cancelButton = new JButton(PolicyTool.getMessage("Cancel")); 1961 ActionListener cancelListener = new CancelButtonListener(this); 1962 cancelButton.addActionListener(cancelListener); 1963 tw.addNewComponent(panel, cancelButton, PE_CANCEL_BUTTON, 1964 1, 0, 1, 1, 0.0, 0.0, GridBagConstraints.VERTICAL, 1965 ToolWindow.LR_PADDING); 1966 1967 // add the panel 1968 tw.addNewComponent(this, panel, PE_PANEL2, 1969 0, 6, 2, 1, 0.0, 0.0, GridBagConstraints.VERTICAL); 1970 1971 getRootPane().setDefaultButton(okButton); 1972 getRootPane().registerKeyboardAction(cancelListener, escKey, JComponent.WHEN_IN_FOCUSED_WINDOW); 1973 1974 pack(); 1975 setLocationRelativeTo(tw); 1976 setVisible(true); 1977 } 1978 1979 /** 1980 * Read all the Policy information data in the dialog box 1981 * and construct a PolicyEntry object with it. 1982 */ 1983 PolicyEntry getPolicyEntryFromDialog() 1984 throws InvalidParameterException, MalformedURLException, 1985 NoSuchMethodException, ClassNotFoundException, InstantiationException, 1986 IllegalAccessException, InvocationTargetException, 1987 CertificateException, IOException, Exception { 1988 1989 // get the Codebase 1990 JTextField tf = (JTextField)getComponent(PE_CODEBASE_TEXTFIELD); 1991 String codebase = null; 1992 if (tf.getText().trim().equals("") == false) 1993 codebase = new String(tf.getText().trim()); 1994 1995 // get the SignedBy 1996 tf = (JTextField)getComponent(PE_SIGNEDBY_TEXTFIELD); 1997 String signedby = null; 1998 if (tf.getText().trim().equals("") == false) 1999 signedby = new String(tf.getText().trim()); 2000 2001 // construct a new GrantEntry 2002 PolicyParser.GrantEntry ge = 2003 new PolicyParser.GrantEntry(signedby, codebase); 2004 2005 // get the new Principals 2006 LinkedList<PolicyParser.PrincipalEntry> prins = new LinkedList<>(); 2007 TaggedList prinList = (TaggedList)getComponent(PE_PRIN_LIST); 2008 for (int i = 0; i < prinList.getModel().getSize(); i++) { 2009 prins.add((PolicyParser.PrincipalEntry)prinList.getObject(i)); 2010 } 2011 ge.principals = prins; 2012 2013 // get the new Permissions 2014 Vector<PolicyParser.PermissionEntry> perms = new Vector<>(); 2015 TaggedList permList = (TaggedList)getComponent(PE_PERM_LIST); 2016 for (int i = 0; i < permList.getModel().getSize(); i++) { 2017 perms.addElement((PolicyParser.PermissionEntry)permList.getObject(i)); 2018 } 2019 ge.permissionEntries = perms; 2020 2021 // construct a new PolicyEntry object 2022 PolicyEntry entry = new PolicyEntry(tool, ge); 2023 2024 return entry; 2025 } 2026 2027 /** 2028 * display a dialog box for the user to enter KeyStore information 2029 */ 2030 void keyStoreDialog(int mode) { 2031 2032 // find where the PolicyTool gui is 2033 Point location = tw.getLocationOnScreen(); 2034 //setBounds(location.x + 25, location.y + 100, 500, 300); 2035 setLayout(new GridBagLayout()); 2036 2037 if (mode == EDIT_KEYSTORE) { 2038 2039 // KeyStore label and textfield 2040 JLabel label = new JLabel(); 2041 tw.addNewComponent(this, label, KSD_NAME_LABEL, 2042 0, 0, 1, 1, 0.0, 0.0, GridBagConstraints.BOTH, 2043 ToolWindow.R_BOTTOM_PADDING); 2044 JTextField tf = new JTextField(tool.getKeyStoreName(), 30); 2045 ToolWindow.configureLabelFor(label, tf, "KeyStore.URL."); 2046 tf.setPreferredSize(new Dimension(tf.getPreferredSize().width, TEXTFIELD_HEIGHT)); 2047 2048 // URL to U R L, so that accessibility reader will pronounce well 2049 tf.getAccessibleContext().setAccessibleName( 2050 PolicyTool.getMessage("KeyStore.U.R.L.")); 2051 tw.addNewComponent(this, tf, KSD_NAME_TEXTFIELD, 2052 1, 0, 1, 1, 1.0, 0.0, GridBagConstraints.BOTH, 2053 ToolWindow.BOTTOM_PADDING); 2054 2055 // KeyStore type and textfield 2056 label = new JLabel(); 2057 tw.addNewComponent(this, label, KSD_TYPE_LABEL, 2058 0, 1, 1, 1, 0.0, 0.0, GridBagConstraints.BOTH, 2059 ToolWindow.R_BOTTOM_PADDING); 2060 tf = new JTextField(tool.getKeyStoreType(), 30); 2061 ToolWindow.configureLabelFor(label, tf, "KeyStore.Type."); 2062 tf.setPreferredSize(new Dimension(tf.getPreferredSize().width, TEXTFIELD_HEIGHT)); 2063 tf.getAccessibleContext().setAccessibleName( 2064 PolicyTool.getMessage("KeyStore.Type.")); 2065 tw.addNewComponent(this, tf, KSD_TYPE_TEXTFIELD, 2066 1, 1, 1, 1, 1.0, 0.0, GridBagConstraints.BOTH, 2067 ToolWindow.BOTTOM_PADDING); 2068 2069 // KeyStore provider and textfield 2070 label = new JLabel(); 2071 tw.addNewComponent(this, label, KSD_PROVIDER_LABEL, 2072 0, 2, 1, 1, 0.0, 0.0, GridBagConstraints.BOTH, 2073 ToolWindow.R_BOTTOM_PADDING); 2074 tf = new JTextField(tool.getKeyStoreProvider(), 30); 2075 ToolWindow.configureLabelFor(label, tf, "KeyStore.Provider."); 2076 tf.setPreferredSize(new Dimension(tf.getPreferredSize().width, TEXTFIELD_HEIGHT)); 2077 tf.getAccessibleContext().setAccessibleName( 2078 PolicyTool.getMessage("KeyStore.Provider.")); 2079 tw.addNewComponent(this, tf, KSD_PROVIDER_TEXTFIELD, 2080 1, 2, 1, 1, 1.0, 0.0, GridBagConstraints.BOTH, 2081 ToolWindow.BOTTOM_PADDING); 2082 2083 // KeyStore password URL and textfield 2084 label = new JLabel(); 2085 tw.addNewComponent(this, label, KSD_PWD_URL_LABEL, 2086 0, 3, 1, 1, 0.0, 0.0, GridBagConstraints.BOTH, 2087 ToolWindow.R_BOTTOM_PADDING); 2088 tf = new JTextField(tool.getKeyStorePwdURL(), 30); 2089 ToolWindow.configureLabelFor(label, tf, "KeyStore.Password.URL."); 2090 tf.setPreferredSize(new Dimension(tf.getPreferredSize().width, TEXTFIELD_HEIGHT)); 2091 tf.getAccessibleContext().setAccessibleName( 2092 PolicyTool.getMessage("KeyStore.Password.U.R.L.")); 2093 tw.addNewComponent(this, tf, KSD_PWD_URL_TEXTFIELD, 2094 1, 3, 1, 1, 1.0, 0.0, GridBagConstraints.BOTH, 2095 ToolWindow.BOTTOM_PADDING); 2096 2097 // OK button 2098 JButton okButton = new JButton(PolicyTool.getMessage("OK")); 2099 okButton.addActionListener 2100 (new ChangeKeyStoreOKButtonListener(tool, tw, this)); 2101 tw.addNewComponent(this, okButton, KSD_OK_BUTTON, 2102 0, 4, 1, 1, 0.0, 0.0, GridBagConstraints.VERTICAL); 2103 2104 // cancel button 2105 JButton cancelButton = new JButton(PolicyTool.getMessage("Cancel")); 2106 ActionListener cancelListener = new CancelButtonListener(this); 2107 cancelButton.addActionListener(cancelListener); 2108 tw.addNewComponent(this, cancelButton, KSD_CANCEL_BUTTON, 2109 1, 4, 1, 1, 0.0, 0.0, GridBagConstraints.VERTICAL); 2110 2111 getRootPane().setDefaultButton(okButton); 2112 getRootPane().registerKeyboardAction(cancelListener, escKey, JComponent.WHEN_IN_FOCUSED_WINDOW); 2113 } 2114 2115 pack(); 2116 setLocationRelativeTo(tw); 2117 setVisible(true); 2118 } 2119 2120 /** 2121 * display a dialog box for the user to input Principal info 2122 * 2123 * if editPolicyEntry is false, then we are adding Principals to 2124 * a new PolicyEntry, and we only update the GUI listing 2125 * with the new Principal. 2126 * 2127 * if edit is true, then we are editing an existing Policy entry. 2128 */ 2129 void displayPrincipalDialog(boolean editPolicyEntry, boolean edit) { 2130 2131 PolicyParser.PrincipalEntry editMe = null; 2132 2133 // get the Principal selected from the Principal List 2134 TaggedList prinList = (TaggedList)getComponent(PE_PRIN_LIST); 2135 int prinIndex = prinList.getSelectedIndex(); 2136 2137 if (edit) { 2138 editMe = (PolicyParser.PrincipalEntry)prinList.getObject(prinIndex); 2139 } 2140 2141 ToolDialog newTD = new ToolDialog 2142 (PolicyTool.getMessage("Principals"), tool, tw, true); 2143 newTD.addWindowListener(new ChildWindowListener(newTD)); 2144 2145 // find where the PolicyTool gui is 2146 Point location = getLocationOnScreen(); 2147 //newTD.setBounds(location.x + 50, location.y + 100, 650, 190); 2148 newTD.setLayout(new GridBagLayout()); 2149 newTD.setResizable(true); 2150 2151 // description label 2152 JLabel label = (edit ? 2153 new JLabel(PolicyTool.getMessage(".Edit.Principal.")) : 2154 new JLabel(PolicyTool.getMessage(".Add.New.Principal."))); 2155 tw.addNewComponent(newTD, label, PRD_DESC_LABEL, 2156 0, 0, 1, 1, 0.0, 0.0, GridBagConstraints.BOTH, 2157 ToolWindow.TOP_BOTTOM_PADDING); 2158 2159 // principal choice 2160 JComboBox<String> choice = new JComboBox<>(); 2161 choice.addItem(PRIN_TYPE); 2162 choice.getAccessibleContext().setAccessibleName(PRIN_TYPE); 2163 for (int i = 0; i < PRIN_ARRAY.size(); i++) { 2164 Prin next = PRIN_ARRAY.get(i); 2165 choice.addItem(next.CLASS); 2166 } 2167 2168 if (edit) { 2169 if (PolicyParser.PrincipalEntry.WILDCARD_CLASS.equals 2170 (editMe.getPrincipalClass())) { 2171 choice.setSelectedItem(PRIN_TYPE); 2172 } else { 2173 Prin inputPrin = getPrin(editMe.getPrincipalClass(), true); 2174 if (inputPrin != null) { 2175 choice.setSelectedItem(inputPrin.CLASS); 2176 } 2177 } 2178 } 2179 // Add listener after selected item is set 2180 choice.addItemListener(new PrincipalTypeMenuListener(newTD)); 2181 2182 tw.addNewComponent(newTD, choice, PRD_PRIN_CHOICE, 2183 0, 1, 1, 1, 0.0, 0.0, GridBagConstraints.BOTH, 2184 ToolWindow.LR_PADDING); 2185 2186 // principal textfield 2187 JTextField tf; 2188 tf = (edit ? 2189 new JTextField(editMe.getDisplayClass(), 30) : 2190 new JTextField(30)); 2191 tf.setPreferredSize(new Dimension(tf.getPreferredSize().width, TEXTFIELD_HEIGHT)); 2192 tf.getAccessibleContext().setAccessibleName(PRIN_TYPE); 2193 tw.addNewComponent(newTD, tf, PRD_PRIN_TEXTFIELD, 2194 1, 1, 1, 1, 1.0, 0.0, GridBagConstraints.BOTH, 2195 ToolWindow.LR_PADDING); 2196 2197 // name label and textfield 2198 label = new JLabel(PRIN_NAME); 2199 tf = (edit ? 2200 new JTextField(editMe.getDisplayName(), 40) : 2201 new JTextField(40)); 2202 tf.setPreferredSize(new Dimension(tf.getPreferredSize().width, TEXTFIELD_HEIGHT)); 2203 tf.getAccessibleContext().setAccessibleName(PRIN_NAME); 2204 2205 tw.addNewComponent(newTD, label, PRD_NAME_LABEL, 2206 0, 2, 1, 1, 0.0, 0.0, GridBagConstraints.BOTH, 2207 ToolWindow.LR_PADDING); 2208 tw.addNewComponent(newTD, tf, PRD_NAME_TEXTFIELD, 2209 1, 2, 1, 1, 1.0, 0.0, GridBagConstraints.BOTH, 2210 ToolWindow.LR_PADDING); 2211 2212 // OK button 2213 JButton okButton = new JButton(PolicyTool.getMessage("OK")); 2214 okButton.addActionListener( 2215 new NewPolicyPrinOKButtonListener 2216 (tool, tw, this, newTD, edit)); 2217 tw.addNewComponent(newTD, okButton, PRD_OK_BUTTON, 2218 0, 3, 1, 1, 0.0, 0.0, GridBagConstraints.VERTICAL, 2219 ToolWindow.TOP_BOTTOM_PADDING); 2220 // cancel button 2221 JButton cancelButton = new JButton(PolicyTool.getMessage("Cancel")); 2222 ActionListener cancelListener = new CancelButtonListener(newTD); 2223 cancelButton.addActionListener(cancelListener); 2224 tw.addNewComponent(newTD, cancelButton, PRD_CANCEL_BUTTON, 2225 1, 3, 1, 1, 0.0, 0.0, GridBagConstraints.VERTICAL, 2226 ToolWindow.TOP_BOTTOM_PADDING); 2227 2228 newTD.getRootPane().setDefaultButton(okButton); 2229 newTD.getRootPane().registerKeyboardAction(cancelListener, escKey, JComponent.WHEN_IN_FOCUSED_WINDOW); 2230 2231 newTD.pack(); 2232 newTD.setLocationRelativeTo(tw); 2233 newTD.setVisible(true); 2234 } 2235 2236 /** 2237 * display a dialog box for the user to input Permission info 2238 * 2239 * if editPolicyEntry is false, then we are adding Permissions to 2240 * a new PolicyEntry, and we only update the GUI listing 2241 * with the new Permission. 2242 * 2243 * if edit is true, then we are editing an existing Permission entry. 2244 */ 2245 void displayPermissionDialog(boolean editPolicyEntry, boolean edit) { 2246 2247 PolicyParser.PermissionEntry editMe = null; 2248 2249 // get the Permission selected from the Permission List 2250 TaggedList permList = (TaggedList)getComponent(PE_PERM_LIST); 2251 int permIndex = permList.getSelectedIndex(); 2252 2253 if (edit) { 2254 editMe = (PolicyParser.PermissionEntry)permList.getObject(permIndex); 2255 } 2256 2257 ToolDialog newTD = new ToolDialog 2258 (PolicyTool.getMessage("Permissions"), tool, tw, true); 2259 newTD.addWindowListener(new ChildWindowListener(newTD)); 2260 2261 // find where the PolicyTool gui is 2262 Point location = getLocationOnScreen(); 2263 //newTD.setBounds(location.x + 50, location.y + 100, 700, 250); 2264 newTD.setLayout(new GridBagLayout()); 2265 newTD.setResizable(true); 2266 2267 // description label 2268 JLabel label = (edit ? 2269 new JLabel(PolicyTool.getMessage(".Edit.Permission.")) : 2270 new JLabel(PolicyTool.getMessage(".Add.New.Permission."))); 2271 tw.addNewComponent(newTD, label, PD_DESC_LABEL, 2272 0, 0, 1, 1, 0.0, 0.0, GridBagConstraints.BOTH, 2273 ToolWindow.TOP_BOTTOM_PADDING); 2274 2275 // permission choice (added in alphabetical order) 2276 JComboBox<String> choice = new JComboBox<>(); 2277 choice.addItem(PERM); 2278 choice.getAccessibleContext().setAccessibleName(PERM); 2279 for (int i = 0; i < PERM_ARRAY.size(); i++) { 2280 Perm next = PERM_ARRAY.get(i); 2281 choice.addItem(next.CLASS); 2282 } 2283 tw.addNewComponent(newTD, choice, PD_PERM_CHOICE, 2284 0, 1, 1, 1, 0.0, 0.0, GridBagConstraints.BOTH, 2285 ToolWindow.LR_BOTTOM_PADDING); 2286 2287 // permission textfield 2288 JTextField tf; 2289 tf = (edit ? new JTextField(editMe.permission, 30) : new JTextField(30)); 2290 tf.setPreferredSize(new Dimension(tf.getPreferredSize().width, TEXTFIELD_HEIGHT)); 2291 tf.getAccessibleContext().setAccessibleName(PERM); 2292 if (edit) { 2293 Perm inputPerm = getPerm(editMe.permission, true); 2294 if (inputPerm != null) { 2295 choice.setSelectedItem(inputPerm.CLASS); 2296 } 2297 } 2298 tw.addNewComponent(newTD, tf, PD_PERM_TEXTFIELD, 2299 1, 1, 1, 1, 1.0, 0.0, GridBagConstraints.BOTH, 2300 ToolWindow.LR_BOTTOM_PADDING); 2301 choice.addItemListener(new PermissionMenuListener(newTD)); 2302 2303 // name label and textfield 2304 choice = new JComboBox<>(); 2305 choice.addItem(PERM_NAME); 2306 choice.getAccessibleContext().setAccessibleName(PERM_NAME); 2307 tf = (edit ? new JTextField(editMe.name, 40) : new JTextField(40)); 2308 tf.setPreferredSize(new Dimension(tf.getPreferredSize().width, TEXTFIELD_HEIGHT)); 2309 tf.getAccessibleContext().setAccessibleName(PERM_NAME); 2310 if (edit) { 2311 setPermissionNames(getPerm(editMe.permission, true), choice, tf); 2312 } 2313 tw.addNewComponent(newTD, choice, PD_NAME_CHOICE, 2314 0, 2, 1, 1, 0.0, 0.0, GridBagConstraints.BOTH, 2315 ToolWindow.LR_BOTTOM_PADDING); 2316 tw.addNewComponent(newTD, tf, PD_NAME_TEXTFIELD, 2317 1, 2, 1, 1, 1.0, 0.0, GridBagConstraints.BOTH, 2318 ToolWindow.LR_BOTTOM_PADDING); 2319 choice.addItemListener(new PermissionNameMenuListener(newTD)); 2320 2321 // actions label and textfield 2322 choice = new JComboBox<>(); 2323 choice.addItem(PERM_ACTIONS); 2324 choice.getAccessibleContext().setAccessibleName(PERM_ACTIONS); 2325 tf = (edit ? new JTextField(editMe.action, 40) : new JTextField(40)); 2326 tf.setPreferredSize(new Dimension(tf.getPreferredSize().width, TEXTFIELD_HEIGHT)); 2327 tf.getAccessibleContext().setAccessibleName(PERM_ACTIONS); 2328 if (edit) { 2329 setPermissionActions(getPerm(editMe.permission, true), choice, tf); 2330 } 2331 tw.addNewComponent(newTD, choice, PD_ACTIONS_CHOICE, 2332 0, 3, 1, 1, 0.0, 0.0, GridBagConstraints.BOTH, 2333 ToolWindow.LR_BOTTOM_PADDING); 2334 tw.addNewComponent(newTD, tf, PD_ACTIONS_TEXTFIELD, 2335 1, 3, 1, 1, 1.0, 0.0, GridBagConstraints.BOTH, 2336 ToolWindow.LR_BOTTOM_PADDING); 2337 choice.addItemListener(new PermissionActionsMenuListener(newTD)); 2338 2339 // signedby label and textfield 2340 label = new JLabel(PolicyTool.getMessage("Signed.By.")); 2341 tw.addNewComponent(newTD, label, PD_SIGNEDBY_LABEL, 2342 0, 4, 1, 1, 0.0, 0.0, GridBagConstraints.BOTH, 2343 ToolWindow.LR_BOTTOM_PADDING); 2344 tf = (edit ? new JTextField(editMe.signedBy, 40) : new JTextField(40)); 2345 tf.setPreferredSize(new Dimension(tf.getPreferredSize().width, TEXTFIELD_HEIGHT)); 2346 tf.getAccessibleContext().setAccessibleName( 2347 PolicyTool.getMessage("Signed.By.")); 2348 tw.addNewComponent(newTD, tf, PD_SIGNEDBY_TEXTFIELD, 2349 1, 4, 1, 1, 1.0, 0.0, GridBagConstraints.BOTH, 2350 ToolWindow.LR_BOTTOM_PADDING); 2351 2352 // OK button 2353 JButton okButton = new JButton(PolicyTool.getMessage("OK")); 2354 okButton.addActionListener( 2355 new NewPolicyPermOKButtonListener 2356 (tool, tw, this, newTD, edit)); 2357 tw.addNewComponent(newTD, okButton, PD_OK_BUTTON, 2358 0, 5, 1, 1, 0.0, 0.0, GridBagConstraints.VERTICAL, 2359 ToolWindow.TOP_BOTTOM_PADDING); 2360 2361 // cancel button 2362 JButton cancelButton = new JButton(PolicyTool.getMessage("Cancel")); 2363 ActionListener cancelListener = new CancelButtonListener(newTD); 2364 cancelButton.addActionListener(cancelListener); 2365 tw.addNewComponent(newTD, cancelButton, PD_CANCEL_BUTTON, 2366 1, 5, 1, 1, 0.0, 0.0, GridBagConstraints.VERTICAL, 2367 ToolWindow.TOP_BOTTOM_PADDING); 2368 2369 newTD.getRootPane().setDefaultButton(okButton); 2370 newTD.getRootPane().registerKeyboardAction(cancelListener, escKey, JComponent.WHEN_IN_FOCUSED_WINDOW); 2371 2372 newTD.pack(); 2373 newTD.setLocationRelativeTo(tw); 2374 newTD.setVisible(true); 2375 } 2376 2377 /** 2378 * construct a Principal object from the Principal Info Dialog Box 2379 */ 2380 PolicyParser.PrincipalEntry getPrinFromDialog() throws Exception { 2381 2382 JTextField tf = (JTextField)getComponent(PRD_PRIN_TEXTFIELD); 2383 String pclass = new String(tf.getText().trim()); 2384 tf = (JTextField)getComponent(PRD_NAME_TEXTFIELD); 2385 String pname = new String(tf.getText().trim()); 2386 if (pclass.equals("*")) { 2387 pclass = PolicyParser.PrincipalEntry.WILDCARD_CLASS; 2388 } 2389 if (pname.equals("*")) { 2390 pname = PolicyParser.PrincipalEntry.WILDCARD_NAME; 2391 } 2392 2393 PolicyParser.PrincipalEntry pppe = null; 2394 2395 if ((pclass.equals(PolicyParser.PrincipalEntry.WILDCARD_CLASS)) && 2396 (!pname.equals(PolicyParser.PrincipalEntry.WILDCARD_NAME))) { 2397 throw new Exception 2398 (PolicyTool.getMessage("Cannot.Specify.Principal.with.a.Wildcard.Class.without.a.Wildcard.Name")); 2399 } else if (pname.equals("")) { 2400 throw new Exception 2401 (PolicyTool.getMessage("Cannot.Specify.Principal.without.a.Name")); 2402 } else if (pclass.equals("")) { 2403 // make this consistent with what PolicyParser does 2404 // when it sees an empty principal class 2405 pclass = PolicyParser.PrincipalEntry.REPLACE_NAME; 2406 tool.warnings.addElement( 2407 "Warning: Principal name '" + pname + 2408 "' specified without a Principal class.\n" + 2409 "\t'" + pname + "' will be interpreted " + 2410 "as a key store alias.\n" + 2411 "\tThe final principal class will be " + 2412 ToolDialog.X500_PRIN_CLASS + ".\n" + 2413 "\tThe final principal name will be " + 2414 "determined by the following:\n" + 2415 "\n" + 2416 "\tIf the key store entry identified by '" 2417 + pname + "'\n" + 2418 "\tis a key entry, then the principal name will be\n" + 2419 "\tthe subject distinguished name from the first\n" + 2420 "\tcertificate in the entry's certificate chain.\n" + 2421 "\n" + 2422 "\tIf the key store entry identified by '" + 2423 pname + "'\n" + 2424 "\tis a trusted certificate entry, then the\n" + 2425 "\tprincipal name will be the subject distinguished\n" + 2426 "\tname from the trusted public key certificate."); 2427 tw.displayStatusDialog(this, 2428 "'" + pname + "' will be interpreted as a key " + 2429 "store alias. View Warning Log for details."); 2430 } 2431 return new PolicyParser.PrincipalEntry(pclass, pname); 2432 } 2433 2434 2435 /** 2436 * construct a Permission object from the Permission Info Dialog Box 2437 */ 2438 PolicyParser.PermissionEntry getPermFromDialog() { 2439 2440 JTextField tf = (JTextField)getComponent(PD_PERM_TEXTFIELD); 2441 String permission = new String(tf.getText().trim()); 2442 tf = (JTextField)getComponent(PD_NAME_TEXTFIELD); 2443 String name = null; 2444 if (tf.getText().trim().equals("") == false) 2445 name = new String(tf.getText().trim()); 2446 if (permission.equals("") || 2447 (!permission.equals(ALL_PERM_CLASS) && name == null)) { 2448 throw new InvalidParameterException(PolicyTool.getMessage 2449 ("Permission.and.Target.Name.must.have.a.value")); 2450 } 2451 2452 // When the permission is FilePermission, we need to check the name 2453 // to make sure it's not escaped. We believe -- 2454 // 2455 // String name.lastIndexOf("\\\\") 2456 // ---------------- ------------------------ 2457 // c:\foo\bar -1, legal 2458 // c:\\foo\\bar 2, illegal 2459 // \\server\share 0, legal 2460 // \\\\server\share 2, illegal 2461 2462 if (permission.equals(FILE_PERM_CLASS) && name.lastIndexOf("\\\\") > 0) { 2463 char result = tw.displayYesNoDialog(this, 2464 PolicyTool.getMessage("Warning"), 2465 PolicyTool.getMessage( 2466 "Warning.File.name.may.include.escaped.backslash.characters.It.is.not.necessary.to.escape.backslash.characters.the.tool.escapes"), 2467 PolicyTool.getMessage("Retain"), 2468 PolicyTool.getMessage("Edit") 2469 ); 2470 if (result != 'Y') { 2471 // an invisible exception 2472 throw new NoDisplayException(); 2473 } 2474 } 2475 // get the Actions 2476 tf = (JTextField)getComponent(PD_ACTIONS_TEXTFIELD); 2477 String actions = null; 2478 if (tf.getText().trim().equals("") == false) 2479 actions = new String(tf.getText().trim()); 2480 2481 // get the Signed By 2482 tf = (JTextField)getComponent(PD_SIGNEDBY_TEXTFIELD); 2483 String signedBy = null; 2484 if (tf.getText().trim().equals("") == false) 2485 signedBy = new String(tf.getText().trim()); 2486 2487 PolicyParser.PermissionEntry pppe = new PolicyParser.PermissionEntry 2488 (permission, name, actions); 2489 pppe.signedBy = signedBy; 2490 2491 // see if the signers have public keys 2492 if (signedBy != null) { 2493 String signers[] = tool.parseSigners(pppe.signedBy); 2494 for (int i = 0; i < signers.length; i++) { 2495 try { 2496 PublicKey pubKey = tool.getPublicKeyAlias(signers[i]); 2497 if (pubKey == null) { 2498 MessageFormat form = new MessageFormat 2499 (PolicyTool.getMessage 2500 ("Warning.A.public.key.for.alias.signers.i.does.not.exist.Make.sure.a.KeyStore.is.properly.configured.")); 2501 Object[] source = {signers[i]}; 2502 tool.warnings.addElement(form.format(source)); 2503 tw.displayStatusDialog(this, form.format(source)); 2504 } 2505 } catch (Exception e) { 2506 tw.displayErrorDialog(this, e); 2507 } 2508 } 2509 } 2510 return pppe; 2511 } 2512 2513 /** 2514 * confirm that the user REALLY wants to remove the Policy Entry 2515 */ 2516 void displayConfirmRemovePolicyEntry() { 2517 2518 // find the entry to be removed 2519 @SuppressWarnings("unchecked") 2520 JList<String> list = (JList<String>)tw.getComponent(ToolWindow.MW_POLICY_LIST); 2521 int index = list.getSelectedIndex(); 2522 PolicyEntry entries[] = tool.getEntry(); 2523 2524 // find where the PolicyTool gui is 2525 Point location = tw.getLocationOnScreen(); 2526 //setBounds(location.x + 25, location.y + 100, 600, 400); 2527 setLayout(new GridBagLayout()); 2528 2529 // ask the user do they really want to do this? 2530 JLabel label = new JLabel 2531 (PolicyTool.getMessage("Remove.this.Policy.Entry.")); 2532 tw.addNewComponent(this, label, CRPE_LABEL1, 2533 0, 0, 2, 1, 0.0, 0.0, GridBagConstraints.BOTH, 2534 ToolWindow.BOTTOM_PADDING); 2535 2536 // display the policy entry 2537 label = new JLabel(entries[index].codebaseToString()); 2538 tw.addNewComponent(this, label, CRPE_LABEL2, 2539 0, 1, 2, 1, 0.0, 0.0, GridBagConstraints.BOTH); 2540 label = new JLabel(entries[index].principalsToString().trim()); 2541 tw.addNewComponent(this, label, CRPE_LABEL2+1, 2542 0, 2, 2, 1, 0.0, 0.0, GridBagConstraints.BOTH); 2543 Vector<PolicyParser.PermissionEntry> perms = 2544 entries[index].getGrantEntry().permissionEntries; 2545 for (int i = 0; i < perms.size(); i++) { 2546 PolicyParser.PermissionEntry nextPerm = perms.elementAt(i); 2547 String permString = ToolDialog.PermissionEntryToUserFriendlyString(nextPerm); 2548 label = new JLabel(" " + permString); 2549 if (i == (perms.size()-1)) { 2550 tw.addNewComponent(this, label, CRPE_LABEL2 + 2 + i, 2551 1, 3 + i, 1, 1, 0.0, 0.0, 2552 GridBagConstraints.BOTH, 2553 ToolWindow.BOTTOM_PADDING); 2554 } else { 2555 tw.addNewComponent(this, label, CRPE_LABEL2 + 2 + i, 2556 1, 3 + i, 1, 1, 0.0, 0.0, 2557 GridBagConstraints.BOTH); 2558 } 2559 } 2560 2561 2562 // add OK/CANCEL buttons in a new panel 2563 JPanel panel = new JPanel(); 2564 panel.setLayout(new GridBagLayout()); 2565 2566 // OK button 2567 JButton okButton = new JButton(PolicyTool.getMessage("OK")); 2568 okButton.addActionListener 2569 (new ConfirmRemovePolicyEntryOKButtonListener(tool, tw, this)); 2570 tw.addNewComponent(panel, okButton, CRPE_PANEL_OK, 2571 0, 0, 1, 1, 0.0, 0.0, 2572 GridBagConstraints.VERTICAL, ToolWindow.LR_PADDING); 2573 2574 // cancel button 2575 JButton cancelButton = new JButton(PolicyTool.getMessage("Cancel")); 2576 ActionListener cancelListener = new CancelButtonListener(this); 2577 cancelButton.addActionListener(cancelListener); 2578 tw.addNewComponent(panel, cancelButton, CRPE_PANEL_CANCEL, 2579 1, 0, 1, 1, 0.0, 0.0, 2580 GridBagConstraints.VERTICAL, ToolWindow.LR_PADDING); 2581 2582 tw.addNewComponent(this, panel, CRPE_LABEL2 + 2 + perms.size(), 2583 0, 3 + perms.size(), 2, 1, 0.0, 0.0, 2584 GridBagConstraints.VERTICAL, ToolWindow.TOP_BOTTOM_PADDING); 2585 2586 getRootPane().setDefaultButton(okButton); 2587 getRootPane().registerKeyboardAction(cancelListener, escKey, JComponent.WHEN_IN_FOCUSED_WINDOW); 2588 2589 pack(); 2590 setLocationRelativeTo(tw); 2591 setVisible(true); 2592 } 2593 2594 /** 2595 * perform SAVE AS 2596 */ 2597 void displaySaveAsDialog(int nextEvent) { 2598 2599 // pop up a dialog box for the user to enter a filename. 2600 FileDialog fd = new FileDialog 2601 (tw, PolicyTool.getMessage("Save.As"), FileDialog.SAVE); 2602 fd.addWindowListener(new WindowAdapter() { 2603 public void windowClosing(WindowEvent e) { 2604 e.getWindow().setVisible(false); 2605 } 2606 }); 2607 fd.setVisible(true); 2608 2609 // see if the user hit cancel 2610 if (fd.getFile() == null || 2611 fd.getFile().equals("")) 2612 return; 2613 2614 // get the entered filename 2615 File saveAsFile = new File(fd.getDirectory(), fd.getFile()); 2616 String filename = saveAsFile.getPath(); 2617 fd.dispose(); 2618 2619 try { 2620 // save the policy entries to a file 2621 tool.savePolicy(filename); 2622 2623 // display status 2624 MessageFormat form = new MessageFormat(PolicyTool.getMessage 2625 ("Policy.successfully.written.to.filename")); 2626 Object[] source = {filename}; 2627 tw.displayStatusDialog(null, form.format(source)); 2628 2629 // display the new policy filename 2630 JTextField newFilename = (JTextField)tw.getComponent 2631 (ToolWindow.MW_FILENAME_TEXTFIELD); 2632 newFilename.setText(filename); 2633 tw.setVisible(true); 2634 2635 // now continue with the originally requested command 2636 // (QUIT, NEW, or OPEN) 2637 userSaveContinue(tool, tw, this, nextEvent); 2638 2639 } catch (FileNotFoundException fnfe) { 2640 if (filename == null || filename.equals("")) { 2641 tw.displayErrorDialog(null, new FileNotFoundException 2642 (PolicyTool.getMessage("null.filename"))); 2643 } else { 2644 tw.displayErrorDialog(null, fnfe); 2645 } 2646 } catch (Exception ee) { 2647 tw.displayErrorDialog(null, ee); 2648 } 2649 } 2650 2651 /** 2652 * ask user if they want to save changes 2653 */ 2654 void displayUserSave(int select) { 2655 2656 if (tool.modified == true) { 2657 2658 // find where the PolicyTool gui is 2659 Point location = tw.getLocationOnScreen(); 2660 //setBounds(location.x + 75, location.y + 100, 400, 150); 2661 setLayout(new GridBagLayout()); 2662 2663 JLabel label = new JLabel 2664 (PolicyTool.getMessage("Save.changes.")); 2665 tw.addNewComponent(this, label, USC_LABEL, 2666 0, 0, 3, 1, 0.0, 0.0, GridBagConstraints.BOTH, 2667 ToolWindow.L_TOP_BOTTOM_PADDING); 2668 2669 JPanel panel = new JPanel(); 2670 panel.setLayout(new GridBagLayout()); 2671 2672 JButton yesButton = new JButton(); 2673 ToolWindow.configureButton(yesButton, "Yes"); 2674 yesButton.addActionListener 2675 (new UserSaveYesButtonListener(this, tool, tw, select)); 2676 tw.addNewComponent(panel, yesButton, USC_YES_BUTTON, 2677 0, 0, 1, 1, 0.0, 0.0, 2678 GridBagConstraints.VERTICAL, 2679 ToolWindow.LR_BOTTOM_PADDING); 2680 JButton noButton = new JButton(); 2681 ToolWindow.configureButton(noButton, "No"); 2682 noButton.addActionListener 2683 (new UserSaveNoButtonListener(this, tool, tw, select)); 2684 tw.addNewComponent(panel, noButton, USC_NO_BUTTON, 2685 1, 0, 1, 1, 0.0, 0.0, 2686 GridBagConstraints.VERTICAL, 2687 ToolWindow.LR_BOTTOM_PADDING); 2688 JButton cancelButton = new JButton(); 2689 ToolWindow.configureButton(cancelButton, "Cancel"); 2690 ActionListener cancelListener = new CancelButtonListener(this); 2691 cancelButton.addActionListener(cancelListener); 2692 tw.addNewComponent(panel, cancelButton, USC_CANCEL_BUTTON, 2693 2, 0, 1, 1, 0.0, 0.0, 2694 GridBagConstraints.VERTICAL, 2695 ToolWindow.LR_BOTTOM_PADDING); 2696 2697 tw.addNewComponent(this, panel, USC_PANEL, 2698 0, 1, 1, 1, 0.0, 0.0, GridBagConstraints.BOTH); 2699 2700 getRootPane().registerKeyboardAction(cancelListener, escKey, JComponent.WHEN_IN_FOCUSED_WINDOW); 2701 2702 pack(); 2703 setLocationRelativeTo(tw); 2704 setVisible(true); 2705 } else { 2706 // just do the original request (QUIT, NEW, or OPEN) 2707 userSaveContinue(tool, tw, this, select); 2708 } 2709 } 2710 2711 /** 2712 * when the user sees the 'YES', 'NO', 'CANCEL' buttons on the 2713 * displayUserSave dialog, and the click on one of them, 2714 * we need to continue the originally requested action 2715 * (either QUITting, opening NEW policy file, or OPENing an existing 2716 * policy file. do that now. 2717 */ 2718 @SuppressWarnings("fallthrough") 2719 void userSaveContinue(PolicyTool tool, ToolWindow tw, 2720 ToolDialog us, int select) { 2721 2722 // now either QUIT, open a NEW policy file, or OPEN an existing policy 2723 switch(select) { 2724 case ToolDialog.QUIT: 2725 2726 tw.setVisible(false); 2727 tw.dispose(); 2728 System.exit(0); 2729 2730 case ToolDialog.NEW: 2731 2732 try { 2733 tool.openPolicy(null); 2734 } catch (Exception ee) { 2735 tool.modified = false; 2736 tw.displayErrorDialog(null, ee); 2737 } 2738 2739 // display the policy entries via the policy list textarea 2740 JList<String> list = new JList<>(new DefaultListModel<>()); 2741 list.setVisibleRowCount(15); 2742 list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); 2743 list.addMouseListener(new PolicyListListener(tool, tw)); 2744 tw.replacePolicyList(list); 2745 2746 // display null policy filename and keystore 2747 JTextField newFilename = (JTextField)tw.getComponent( 2748 ToolWindow.MW_FILENAME_TEXTFIELD); 2749 newFilename.setText(""); 2750 tw.setVisible(true); 2751 break; 2752 2753 case ToolDialog.OPEN: 2754 2755 // pop up a dialog box for the user to enter a filename. 2756 FileDialog fd = new FileDialog 2757 (tw, PolicyTool.getMessage("Open"), FileDialog.LOAD); 2758 fd.addWindowListener(new WindowAdapter() { 2759 public void windowClosing(WindowEvent e) { 2760 e.getWindow().setVisible(false); 2761 } 2762 }); 2763 fd.setVisible(true); 2764 2765 // see if the user hit 'cancel' 2766 if (fd.getFile() == null || 2767 fd.getFile().equals("")) 2768 return; 2769 2770 // get the entered filename 2771 String policyFile = new File(fd.getDirectory(), fd.getFile()).getPath(); 2772 2773 try { 2774 // open the policy file 2775 tool.openPolicy(policyFile); 2776 2777 // display the policy entries via the policy list textarea 2778 DefaultListModel<String> listModel = new DefaultListModel<>(); 2779 list = new JList<>(listModel); 2780 list.setVisibleRowCount(15); 2781 list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); 2782 list.addMouseListener(new PolicyListListener(tool, tw)); 2783 PolicyEntry entries[] = tool.getEntry(); 2784 if (entries != null) { 2785 for (int i = 0; i < entries.length; i++) { 2786 listModel.addElement(entries[i].headerToString()); 2787 } 2788 } 2789 tw.replacePolicyList(list); 2790 tool.modified = false; 2791 2792 // display the new policy filename 2793 newFilename = (JTextField)tw.getComponent( 2794 ToolWindow.MW_FILENAME_TEXTFIELD); 2795 newFilename.setText(policyFile); 2796 tw.setVisible(true); 2797 2798 // inform user of warnings 2799 if (tool.newWarning == true) { 2800 tw.displayStatusDialog(null, PolicyTool.getMessage 2801 ("Errors.have.occurred.while.opening.the.policy.configuration.View.the.Warning.Log.for.more.information.")); 2802 } 2803 2804 } catch (Exception e) { 2805 // add blank policy listing 2806 list = new JList<>(new DefaultListModel<>()); 2807 list.setVisibleRowCount(15); 2808 list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); 2809 list.addMouseListener(new PolicyListListener(tool, tw)); 2810 tw.replacePolicyList(list); 2811 tool.setPolicyFileName(null); 2812 tool.modified = false; 2813 2814 // display a null policy filename 2815 newFilename = (JTextField)tw.getComponent( 2816 ToolWindow.MW_FILENAME_TEXTFIELD); 2817 newFilename.setText(""); 2818 tw.setVisible(true); 2819 2820 // display the error 2821 MessageFormat form = new MessageFormat(PolicyTool.getMessage 2822 ("Could.not.open.policy.file.policyFile.e.toString.")); 2823 Object[] source = {policyFile, e.toString()}; 2824 tw.displayErrorDialog(null, form.format(source)); 2825 } 2826 break; 2827 } 2828 } 2829 2830 /** 2831 * Return a Menu list of names for a given permission 2832 * 2833 * If inputPerm's TARGETS are null, then this means TARGETS are 2834 * not allowed to be entered (and the TextField is set to be 2835 * non-editable). 2836 * 2837 * If TARGETS are valid but there are no standard ones 2838 * (user must enter them by hand) then the TARGETS array may be empty 2839 * (and of course non-null). 2840 */ 2841 void setPermissionNames(Perm inputPerm, JComboBox<String> names, JTextField field) { 2842 names.removeAllItems(); 2843 names.addItem(PERM_NAME); 2844 2845 if (inputPerm == null) { 2846 // custom permission 2847 field.setEditable(true); 2848 } else if (inputPerm.TARGETS == null) { 2849 // standard permission with no targets 2850 field.setEditable(false); 2851 } else { 2852 // standard permission with standard targets 2853 field.setEditable(true); 2854 for (int i = 0; i < inputPerm.TARGETS.length; i++) { 2855 names.addItem(inputPerm.TARGETS[i]); 2856 } 2857 } 2858 } 2859 2860 /** 2861 * Return a Menu list of actions for a given permission 2862 * 2863 * If inputPerm's ACTIONS are null, then this means ACTIONS are 2864 * not allowed to be entered (and the TextField is set to be 2865 * non-editable). This is typically true for BasicPermissions. 2866 * 2867 * If ACTIONS are valid but there are no standard ones 2868 * (user must enter them by hand) then the ACTIONS array may be empty 2869 * (and of course non-null). 2870 */ 2871 void setPermissionActions(Perm inputPerm, JComboBox<String> actions, JTextField field) { 2872 actions.removeAllItems(); 2873 actions.addItem(PERM_ACTIONS); 2874 2875 if (inputPerm == null) { 2876 // custom permission 2877 field.setEditable(true); 2878 } else if (inputPerm.ACTIONS == null) { 2879 // standard permission with no actions 2880 field.setEditable(false); 2881 } else { 2882 // standard permission with standard actions 2883 field.setEditable(true); 2884 for (int i = 0; i < inputPerm.ACTIONS.length; i++) { 2885 actions.addItem(inputPerm.ACTIONS[i]); 2886 } 2887 } 2888 } 2889 2890 static String PermissionEntryToUserFriendlyString(PolicyParser.PermissionEntry pppe) { 2891 String result = pppe.permission; 2892 if (pppe.name != null) { 2893 result += " " + pppe.name; 2894 } 2895 if (pppe.action != null) { 2896 result += ", \"" + pppe.action + "\""; 2897 } 2898 if (pppe.signedBy != null) { 2899 result += ", signedBy " + pppe.signedBy; 2900 } 2901 return result; 2902 } 2903 2904 static String PrincipalEntryToUserFriendlyString(PolicyParser.PrincipalEntry pppe) { 2905 StringWriter sw = new StringWriter(); 2906 PrintWriter pw = new PrintWriter(sw); 2907 pppe.write(pw); 2908 return sw.toString(); 2909 } 2910 } 2911 2912 /** 2913 * Event handler for the PolicyTool window 2914 */ 2915 class ToolWindowListener implements WindowListener { 2916 2917 private PolicyTool tool; 2918 private ToolWindow tw; 2919 2920 ToolWindowListener(PolicyTool tool, ToolWindow tw) { 2921 this.tool = tool; 2922 this.tw = tw; 2923 } 2924 2925 public void windowOpened(WindowEvent we) { 2926 } 2927 2928 public void windowClosing(WindowEvent we) { 2929 // Closing the window acts the same as choosing Menu->Exit. 2930 2931 // ask user if they want to save changes 2932 ToolDialog td = new ToolDialog(PolicyTool.getMessage("Save.Changes"), tool, tw, true); 2933 td.displayUserSave(ToolDialog.QUIT); 2934 2935 // the above method will perform the QUIT as long as the 2936 // user does not CANCEL the request 2937 } 2938 2939 public void windowClosed(WindowEvent we) { 2940 System.exit(0); 2941 } 2942 2943 public void windowIconified(WindowEvent we) { 2944 } 2945 2946 public void windowDeiconified(WindowEvent we) { 2947 } 2948 2949 public void windowActivated(WindowEvent we) { 2950 } 2951 2952 public void windowDeactivated(WindowEvent we) { 2953 } 2954 } 2955 2956 /** 2957 * Event handler for the Policy List 2958 */ 2959 class PolicyListListener extends MouseAdapter implements ActionListener { 2960 2961 private PolicyTool tool; 2962 private ToolWindow tw; 2963 2964 PolicyListListener(PolicyTool tool, ToolWindow tw) { 2965 this.tool = tool; 2966 this.tw = tw; 2967 2968 } 2969 2970 public void actionPerformed(ActionEvent e) { 2971 2972 // display the permission list for a policy entry 2973 ToolDialog td = new ToolDialog 2974 (PolicyTool.getMessage("Policy.Entry"), tool, tw, true); 2975 td.displayPolicyEntryDialog(true); 2976 } 2977 2978 public void mouseClicked(MouseEvent evt) { 2979 if (evt.getClickCount() == 2) { 2980 actionPerformed(null); 2981 } 2982 } 2983 } 2984 2985 /** 2986 * Event handler for the File Menu 2987 */ 2988 class FileMenuListener implements ActionListener { 2989 2990 private PolicyTool tool; 2991 private ToolWindow tw; 2992 2993 FileMenuListener(PolicyTool tool, ToolWindow tw) { 2994 this.tool = tool; 2995 this.tw = tw; 2996 } 2997 2998 public void actionPerformed(ActionEvent e) { 2999 3000 if (PolicyTool.collator.compare(e.getActionCommand(), 3001 ToolWindow.QUIT) == 0) { 3002 3003 // ask user if they want to save changes 3004 ToolDialog td = new ToolDialog 3005 (PolicyTool.getMessage("Save.Changes"), tool, tw, true); 3006 td.displayUserSave(ToolDialog.QUIT); 3007 3008 // the above method will perform the QUIT as long as the 3009 // user does not CANCEL the request 3010 3011 } else if (PolicyTool.collator.compare(e.getActionCommand(), 3012 ToolWindow.NEW_POLICY_FILE) == 0) { 3013 3014 // ask user if they want to save changes 3015 ToolDialog td = new ToolDialog 3016 (PolicyTool.getMessage("Save.Changes"), tool, tw, true); 3017 td.displayUserSave(ToolDialog.NEW); 3018 3019 // the above method will perform the NEW as long as the 3020 // user does not CANCEL the request 3021 3022 } else if (PolicyTool.collator.compare(e.getActionCommand(), 3023 ToolWindow.OPEN_POLICY_FILE) == 0) { 3024 3025 // ask user if they want to save changes 3026 ToolDialog td = new ToolDialog 3027 (PolicyTool.getMessage("Save.Changes"), tool, tw, true); 3028 td.displayUserSave(ToolDialog.OPEN); 3029 3030 // the above method will perform the OPEN as long as the 3031 // user does not CANCEL the request 3032 3033 } else if (PolicyTool.collator.compare(e.getActionCommand(), 3034 ToolWindow.SAVE_POLICY_FILE) == 0) { 3035 3036 // get the previously entered filename 3037 String filename = ((JTextField)tw.getComponent( 3038 ToolWindow.MW_FILENAME_TEXTFIELD)).getText(); 3039 3040 // if there is no filename, do a SAVE_AS 3041 if (filename == null || filename.length() == 0) { 3042 // user wants to SAVE AS 3043 ToolDialog td = new ToolDialog 3044 (PolicyTool.getMessage("Save.As"), tool, tw, true); 3045 td.displaySaveAsDialog(ToolDialog.NOACTION); 3046 } else { 3047 try { 3048 // save the policy entries to a file 3049 tool.savePolicy(filename); 3050 3051 // display status 3052 MessageFormat form = new MessageFormat 3053 (PolicyTool.getMessage 3054 ("Policy.successfully.written.to.filename")); 3055 Object[] source = {filename}; 3056 tw.displayStatusDialog(null, form.format(source)); 3057 } catch (FileNotFoundException fnfe) { 3058 if (filename == null || filename.equals("")) { 3059 tw.displayErrorDialog(null, new FileNotFoundException 3060 (PolicyTool.getMessage("null.filename"))); 3061 } else { 3062 tw.displayErrorDialog(null, fnfe); 3063 } 3064 } catch (Exception ee) { 3065 tw.displayErrorDialog(null, ee); 3066 } 3067 } 3068 } else if (PolicyTool.collator.compare(e.getActionCommand(), 3069 ToolWindow.SAVE_AS_POLICY_FILE) == 0) { 3070 3071 // user wants to SAVE AS 3072 ToolDialog td = new ToolDialog 3073 (PolicyTool.getMessage("Save.As"), tool, tw, true); 3074 td.displaySaveAsDialog(ToolDialog.NOACTION); 3075 3076 } else if (PolicyTool.collator.compare(e.getActionCommand(), 3077 ToolWindow.VIEW_WARNINGS) == 0) { 3078 tw.displayWarningLog(null); 3079 } 3080 } 3081 } 3082 3083 /** 3084 * Event handler for the main window buttons and Edit Menu 3085 */ 3086 class MainWindowListener implements ActionListener { 3087 3088 private PolicyTool tool; 3089 private ToolWindow tw; 3090 3091 MainWindowListener(PolicyTool tool, ToolWindow tw) { 3092 this.tool = tool; 3093 this.tw = tw; 3094 } 3095 3096 public void actionPerformed(ActionEvent e) { 3097 3098 if (PolicyTool.collator.compare(e.getActionCommand(), 3099 ToolWindow.ADD_POLICY_ENTRY) == 0) { 3100 3101 // display a dialog box for the user to enter policy info 3102 ToolDialog td = new ToolDialog 3103 (PolicyTool.getMessage("Policy.Entry"), tool, tw, true); 3104 td.displayPolicyEntryDialog(false); 3105 3106 } else if (PolicyTool.collator.compare(e.getActionCommand(), 3107 ToolWindow.REMOVE_POLICY_ENTRY) == 0) { 3108 3109 // get the selected entry 3110 @SuppressWarnings("unchecked") 3111 JList<String> list = (JList<String>)tw.getComponent(ToolWindow.MW_POLICY_LIST); 3112 int index = list.getSelectedIndex(); 3113 if (index < 0) { 3114 tw.displayErrorDialog(null, new Exception 3115 (PolicyTool.getMessage("No.Policy.Entry.selected"))); 3116 return; 3117 } 3118 3119 // ask the user if they really want to remove the policy entry 3120 ToolDialog td = new ToolDialog(PolicyTool.getMessage 3121 ("Remove.Policy.Entry"), tool, tw, true); 3122 td.displayConfirmRemovePolicyEntry(); 3123 3124 } else if (PolicyTool.collator.compare(e.getActionCommand(), 3125 ToolWindow.EDIT_POLICY_ENTRY) == 0) { 3126 3127 // get the selected entry 3128 @SuppressWarnings("unchecked") 3129 JList<String> list = (JList<String>)tw.getComponent(ToolWindow.MW_POLICY_LIST); 3130 int index = list.getSelectedIndex(); 3131 if (index < 0) { 3132 tw.displayErrorDialog(null, new Exception 3133 (PolicyTool.getMessage("No.Policy.Entry.selected"))); 3134 return; 3135 } 3136 3137 // display the permission list for a policy entry 3138 ToolDialog td = new ToolDialog 3139 (PolicyTool.getMessage("Policy.Entry"), tool, tw, true); 3140 td.displayPolicyEntryDialog(true); 3141 3142 } else if (PolicyTool.collator.compare(e.getActionCommand(), 3143 ToolWindow.EDIT_KEYSTORE) == 0) { 3144 3145 // display a dialog box for the user to enter keystore info 3146 ToolDialog td = new ToolDialog 3147 (PolicyTool.getMessage("KeyStore"), tool, tw, true); 3148 td.keyStoreDialog(ToolDialog.EDIT_KEYSTORE); 3149 } 3150 } 3151 } 3152 3153 /** 3154 * Event handler for AddEntryDoneButton button 3155 * 3156 * -- if edit is TRUE, then we are EDITing an existing PolicyEntry 3157 * and we need to update both the policy and the GUI listing. 3158 * if edit is FALSE, then we are ADDing a new PolicyEntry, 3159 * so we only need to update the GUI listing. 3160 */ 3161 class AddEntryDoneButtonListener implements ActionListener { 3162 3163 private PolicyTool tool; 3164 private ToolWindow tw; 3165 private ToolDialog td; 3166 private boolean edit; 3167 3168 AddEntryDoneButtonListener(PolicyTool tool, ToolWindow tw, 3169 ToolDialog td, boolean edit) { 3170 this.tool = tool; 3171 this.tw = tw; 3172 this.td = td; 3173 this.edit = edit; 3174 } 3175 3176 public void actionPerformed(ActionEvent e) { 3177 3178 try { 3179 // get a PolicyEntry object from the dialog policy info 3180 PolicyEntry newEntry = td.getPolicyEntryFromDialog(); 3181 PolicyParser.GrantEntry newGe = newEntry.getGrantEntry(); 3182 3183 // see if all the signers have public keys 3184 if (newGe.signedBy != null) { 3185 String signers[] = tool.parseSigners(newGe.signedBy); 3186 for (int i = 0; i < signers.length; i++) { 3187 PublicKey pubKey = tool.getPublicKeyAlias(signers[i]); 3188 if (pubKey == null) { 3189 MessageFormat form = new MessageFormat 3190 (PolicyTool.getMessage 3191 ("Warning.A.public.key.for.alias.signers.i.does.not.exist.Make.sure.a.KeyStore.is.properly.configured.")); 3192 Object[] source = {signers[i]}; 3193 tool.warnings.addElement(form.format(source)); 3194 tw.displayStatusDialog(td, form.format(source)); 3195 } 3196 } 3197 } 3198 3199 // add the entry 3200 @SuppressWarnings("unchecked") 3201 JList<String> policyList = (JList<String>)tw.getComponent(ToolWindow.MW_POLICY_LIST); 3202 if (edit) { 3203 int listIndex = policyList.getSelectedIndex(); 3204 tool.addEntry(newEntry, listIndex); 3205 String newCodeBaseStr = newEntry.headerToString(); 3206 if (PolicyTool.collator.compare 3207 (newCodeBaseStr, policyList.getModel().getElementAt(listIndex)) != 0) 3208 tool.modified = true; 3209 ((DefaultListModel<String>)policyList.getModel()).set(listIndex, newCodeBaseStr); 3210 } else { 3211 tool.addEntry(newEntry, -1); 3212 ((DefaultListModel<String>)policyList.getModel()).addElement(newEntry.headerToString()); 3213 tool.modified = true; 3214 } 3215 td.setVisible(false); 3216 td.dispose(); 3217 3218 } catch (Exception eee) { 3219 tw.displayErrorDialog(td, eee); 3220 } 3221 } 3222 } 3223 3224 /** 3225 * Event handler for ChangeKeyStoreOKButton button 3226 */ 3227 class ChangeKeyStoreOKButtonListener implements ActionListener { 3228 3229 private PolicyTool tool; 3230 private ToolWindow tw; 3231 private ToolDialog td; 3232 3233 ChangeKeyStoreOKButtonListener(PolicyTool tool, ToolWindow tw, 3234 ToolDialog td) { 3235 this.tool = tool; 3236 this.tw = tw; 3237 this.td = td; 3238 } 3239 3240 public void actionPerformed(ActionEvent e) { 3241 3242 String URLString = ((JTextField)td.getComponent( 3243 ToolDialog.KSD_NAME_TEXTFIELD)).getText().trim(); 3244 String type = ((JTextField)td.getComponent( 3245 ToolDialog.KSD_TYPE_TEXTFIELD)).getText().trim(); 3246 String provider = ((JTextField)td.getComponent( 3247 ToolDialog.KSD_PROVIDER_TEXTFIELD)).getText().trim(); 3248 String pwdURL = ((JTextField)td.getComponent( 3249 ToolDialog.KSD_PWD_URL_TEXTFIELD)).getText().trim(); 3250 3251 try { 3252 tool.openKeyStore 3253 ((URLString.length() == 0 ? null : URLString), 3254 (type.length() == 0 ? null : type), 3255 (provider.length() == 0 ? null : provider), 3256 (pwdURL.length() == 0 ? null : pwdURL)); 3257 tool.modified = true; 3258 } catch (Exception ex) { 3259 MessageFormat form = new MessageFormat(PolicyTool.getMessage 3260 ("Unable.to.open.KeyStore.ex.toString.")); 3261 Object[] source = {ex.toString()}; 3262 tw.displayErrorDialog(td, form.format(source)); 3263 return; 3264 } 3265 3266 td.dispose(); 3267 } 3268 } 3269 3270 /** 3271 * Event handler for AddPrinButton button 3272 */ 3273 class AddPrinButtonListener implements ActionListener { 3274 3275 private PolicyTool tool; 3276 private ToolWindow tw; 3277 private ToolDialog td; 3278 private boolean editPolicyEntry; 3279 3280 AddPrinButtonListener(PolicyTool tool, ToolWindow tw, 3281 ToolDialog td, boolean editPolicyEntry) { 3282 this.tool = tool; 3283 this.tw = tw; 3284 this.td = td; 3285 this.editPolicyEntry = editPolicyEntry; 3286 } 3287 3288 public void actionPerformed(ActionEvent e) { 3289 3290 // display a dialog box for the user to enter principal info 3291 td.displayPrincipalDialog(editPolicyEntry, false); 3292 } 3293 } 3294 3295 /** 3296 * Event handler for AddPermButton button 3297 */ 3298 class AddPermButtonListener implements ActionListener { 3299 3300 private PolicyTool tool; 3301 private ToolWindow tw; 3302 private ToolDialog td; 3303 private boolean editPolicyEntry; 3304 3305 AddPermButtonListener(PolicyTool tool, ToolWindow tw, 3306 ToolDialog td, boolean editPolicyEntry) { 3307 this.tool = tool; 3308 this.tw = tw; 3309 this.td = td; 3310 this.editPolicyEntry = editPolicyEntry; 3311 } 3312 3313 public void actionPerformed(ActionEvent e) { 3314 3315 // display a dialog box for the user to enter permission info 3316 td.displayPermissionDialog(editPolicyEntry, false); 3317 } 3318 } 3319 3320 /** 3321 * Event handler for AddPrinOKButton button 3322 */ 3323 class NewPolicyPrinOKButtonListener implements ActionListener { 3324 3325 private PolicyTool tool; 3326 private ToolWindow tw; 3327 private ToolDialog listDialog; 3328 private ToolDialog infoDialog; 3329 private boolean edit; 3330 3331 NewPolicyPrinOKButtonListener(PolicyTool tool, 3332 ToolWindow tw, 3333 ToolDialog listDialog, 3334 ToolDialog infoDialog, 3335 boolean edit) { 3336 this.tool = tool; 3337 this.tw = tw; 3338 this.listDialog = listDialog; 3339 this.infoDialog = infoDialog; 3340 this.edit = edit; 3341 } 3342 3343 public void actionPerformed(ActionEvent e) { 3344 3345 try { 3346 // read in the new principal info from Dialog Box 3347 PolicyParser.PrincipalEntry pppe = 3348 infoDialog.getPrinFromDialog(); 3349 if (pppe != null) { 3350 try { 3351 tool.verifyPrincipal(pppe.getPrincipalClass(), 3352 pppe.getPrincipalName()); 3353 } catch (ClassNotFoundException cnfe) { 3354 MessageFormat form = new MessageFormat 3355 (PolicyTool.getMessage 3356 ("Warning.Class.not.found.class")); 3357 Object[] source = {pppe.getPrincipalClass()}; 3358 tool.warnings.addElement(form.format(source)); 3359 tw.displayStatusDialog(infoDialog, form.format(source)); 3360 } 3361 3362 // add the principal to the GUI principal list 3363 TaggedList prinList = 3364 (TaggedList)listDialog.getComponent(ToolDialog.PE_PRIN_LIST); 3365 3366 String prinString = ToolDialog.PrincipalEntryToUserFriendlyString(pppe); 3367 if (edit) { 3368 // if editing, replace the original principal 3369 int index = prinList.getSelectedIndex(); 3370 prinList.replaceTaggedItem(prinString, pppe, index); 3371 } else { 3372 // if adding, just add it to the end 3373 prinList.addTaggedItem(prinString, pppe); 3374 } 3375 } 3376 infoDialog.dispose(); 3377 } catch (Exception ee) { 3378 tw.displayErrorDialog(infoDialog, ee); 3379 } 3380 } 3381 } 3382 3383 /** 3384 * Event handler for AddPermOKButton button 3385 */ 3386 class NewPolicyPermOKButtonListener implements ActionListener { 3387 3388 private PolicyTool tool; 3389 private ToolWindow tw; 3390 private ToolDialog listDialog; 3391 private ToolDialog infoDialog; 3392 private boolean edit; 3393 3394 NewPolicyPermOKButtonListener(PolicyTool tool, 3395 ToolWindow tw, 3396 ToolDialog listDialog, 3397 ToolDialog infoDialog, 3398 boolean edit) { 3399 this.tool = tool; 3400 this.tw = tw; 3401 this.listDialog = listDialog; 3402 this.infoDialog = infoDialog; 3403 this.edit = edit; 3404 } 3405 3406 public void actionPerformed(ActionEvent e) { 3407 3408 try { 3409 // read in the new permission info from Dialog Box 3410 PolicyParser.PermissionEntry pppe = 3411 infoDialog.getPermFromDialog(); 3412 3413 try { 3414 tool.verifyPermission(pppe.permission, pppe.name, pppe.action); 3415 } catch (ClassNotFoundException cnfe) { 3416 MessageFormat form = new MessageFormat(PolicyTool.getMessage 3417 ("Warning.Class.not.found.class")); 3418 Object[] source = {pppe.permission}; 3419 tool.warnings.addElement(form.format(source)); 3420 tw.displayStatusDialog(infoDialog, form.format(source)); 3421 } 3422 3423 // add the permission to the GUI permission list 3424 TaggedList permList = 3425 (TaggedList)listDialog.getComponent(ToolDialog.PE_PERM_LIST); 3426 3427 String permString = ToolDialog.PermissionEntryToUserFriendlyString(pppe); 3428 if (edit) { 3429 // if editing, replace the original permission 3430 int which = permList.getSelectedIndex(); 3431 permList.replaceTaggedItem(permString, pppe, which); 3432 } else { 3433 // if adding, just add it to the end 3434 permList.addTaggedItem(permString, pppe); 3435 } 3436 infoDialog.dispose(); 3437 3438 } catch (InvocationTargetException ite) { 3439 tw.displayErrorDialog(infoDialog, ite.getTargetException()); 3440 } catch (Exception ee) { 3441 tw.displayErrorDialog(infoDialog, ee); 3442 } 3443 } 3444 } 3445 3446 /** 3447 * Event handler for RemovePrinButton button 3448 */ 3449 class RemovePrinButtonListener implements ActionListener { 3450 3451 private PolicyTool tool; 3452 private ToolWindow tw; 3453 private ToolDialog td; 3454 private boolean edit; 3455 3456 RemovePrinButtonListener(PolicyTool tool, ToolWindow tw, 3457 ToolDialog td, boolean edit) { 3458 this.tool = tool; 3459 this.tw = tw; 3460 this.td = td; 3461 this.edit = edit; 3462 } 3463 3464 public void actionPerformed(ActionEvent e) { 3465 3466 // get the Principal selected from the Principal List 3467 TaggedList prinList = (TaggedList)td.getComponent( 3468 ToolDialog.PE_PRIN_LIST); 3469 int prinIndex = prinList.getSelectedIndex(); 3470 3471 if (prinIndex < 0) { 3472 tw.displayErrorDialog(td, new Exception 3473 (PolicyTool.getMessage("No.principal.selected"))); 3474 return; 3475 } 3476 // remove the principal from the display 3477 prinList.removeTaggedItem(prinIndex); 3478 } 3479 } 3480 3481 /** 3482 * Event handler for RemovePermButton button 3483 */ 3484 class RemovePermButtonListener implements ActionListener { 3485 3486 private PolicyTool tool; 3487 private ToolWindow tw; 3488 private ToolDialog td; 3489 private boolean edit; 3490 3491 RemovePermButtonListener(PolicyTool tool, ToolWindow tw, 3492 ToolDialog td, boolean edit) { 3493 this.tool = tool; 3494 this.tw = tw; 3495 this.td = td; 3496 this.edit = edit; 3497 } 3498 3499 public void actionPerformed(ActionEvent e) { 3500 3501 // get the Permission selected from the Permission List 3502 TaggedList permList = (TaggedList)td.getComponent( 3503 ToolDialog.PE_PERM_LIST); 3504 int permIndex = permList.getSelectedIndex(); 3505 3506 if (permIndex < 0) { 3507 tw.displayErrorDialog(td, new Exception 3508 (PolicyTool.getMessage("No.permission.selected"))); 3509 return; 3510 } 3511 // remove the permission from the display 3512 permList.removeTaggedItem(permIndex); 3513 3514 } 3515 } 3516 3517 /** 3518 * Event handler for Edit Principal button 3519 * 3520 * We need the editPolicyEntry boolean to tell us if the user is 3521 * adding a new PolicyEntry at this time, or editing an existing entry. 3522 * If the user is adding a new PolicyEntry, we ONLY update the 3523 * GUI listing. If the user is editing an existing PolicyEntry, we 3524 * update both the GUI listing and the actual PolicyEntry. 3525 */ 3526 class EditPrinButtonListener extends MouseAdapter implements ActionListener { 3527 3528 private PolicyTool tool; 3529 private ToolWindow tw; 3530 private ToolDialog td; 3531 private boolean editPolicyEntry; 3532 3533 EditPrinButtonListener(PolicyTool tool, ToolWindow tw, 3534 ToolDialog td, boolean editPolicyEntry) { 3535 this.tool = tool; 3536 this.tw = tw; 3537 this.td = td; 3538 this.editPolicyEntry = editPolicyEntry; 3539 } 3540 3541 public void actionPerformed(ActionEvent e) { 3542 3543 // get the Principal selected from the Principal List 3544 TaggedList list = (TaggedList)td.getComponent( 3545 ToolDialog.PE_PRIN_LIST); 3546 int prinIndex = list.getSelectedIndex(); 3547 3548 if (prinIndex < 0) { 3549 tw.displayErrorDialog(td, new Exception 3550 (PolicyTool.getMessage("No.principal.selected"))); 3551 return; 3552 } 3553 td.displayPrincipalDialog(editPolicyEntry, true); 3554 } 3555 3556 public void mouseClicked(MouseEvent evt) { 3557 if (evt.getClickCount() == 2) { 3558 actionPerformed(null); 3559 } 3560 } 3561 } 3562 3563 /** 3564 * Event handler for Edit Permission button 3565 * 3566 * We need the editPolicyEntry boolean to tell us if the user is 3567 * adding a new PolicyEntry at this time, or editing an existing entry. 3568 * If the user is adding a new PolicyEntry, we ONLY update the 3569 * GUI listing. If the user is editing an existing PolicyEntry, we 3570 * update both the GUI listing and the actual PolicyEntry. 3571 */ 3572 class EditPermButtonListener extends MouseAdapter implements ActionListener { 3573 3574 private PolicyTool tool; 3575 private ToolWindow tw; 3576 private ToolDialog td; 3577 private boolean editPolicyEntry; 3578 3579 EditPermButtonListener(PolicyTool tool, ToolWindow tw, 3580 ToolDialog td, boolean editPolicyEntry) { 3581 this.tool = tool; 3582 this.tw = tw; 3583 this.td = td; 3584 this.editPolicyEntry = editPolicyEntry; 3585 } 3586 3587 public void actionPerformed(ActionEvent e) { 3588 3589 // get the Permission selected from the Permission List 3590 @SuppressWarnings("unchecked") 3591 JList<String> list = (JList<String>)td.getComponent(ToolDialog.PE_PERM_LIST); 3592 int permIndex = list.getSelectedIndex(); 3593 3594 if (permIndex < 0) { 3595 tw.displayErrorDialog(td, new Exception 3596 (PolicyTool.getMessage("No.permission.selected"))); 3597 return; 3598 } 3599 td.displayPermissionDialog(editPolicyEntry, true); 3600 } 3601 3602 public void mouseClicked(MouseEvent evt) { 3603 if (evt.getClickCount() == 2) { 3604 actionPerformed(null); 3605 } 3606 } 3607 } 3608 3609 /** 3610 * Event handler for Principal Popup Menu 3611 */ 3612 class PrincipalTypeMenuListener implements ItemListener { 3613 3614 private ToolDialog td; 3615 3616 PrincipalTypeMenuListener(ToolDialog td) { 3617 this.td = td; 3618 } 3619 3620 public void itemStateChanged(ItemEvent e) { 3621 if (e.getStateChange() == ItemEvent.DESELECTED) { 3622 // We're only interested in SELECTED events 3623 return; 3624 } 3625 3626 @SuppressWarnings("unchecked") 3627 JComboBox<String> prin = (JComboBox<String>)td.getComponent(ToolDialog.PRD_PRIN_CHOICE); 3628 JTextField prinField = (JTextField)td.getComponent( 3629 ToolDialog.PRD_PRIN_TEXTFIELD); 3630 JTextField nameField = (JTextField)td.getComponent( 3631 ToolDialog.PRD_NAME_TEXTFIELD); 3632 3633 prin.getAccessibleContext().setAccessibleName( 3634 PolicyTool.splitToWords((String)e.getItem())); 3635 if (((String)e.getItem()).equals(ToolDialog.PRIN_TYPE)) { 3636 // ignore if they choose "Principal Type:" item 3637 if (prinField.getText() != null && 3638 prinField.getText().length() > 0) { 3639 Prin inputPrin = ToolDialog.getPrin(prinField.getText(), true); 3640 prin.setSelectedItem(inputPrin.CLASS); 3641 } 3642 return; 3643 } 3644 3645 // if you change the principal, clear the name 3646 if (prinField.getText().indexOf((String)e.getItem()) == -1) { 3647 nameField.setText(""); 3648 } 3649 3650 // set the text in the textfield and also modify the 3651 // pull-down choice menus to reflect the correct possible 3652 // set of names and actions 3653 Prin inputPrin = ToolDialog.getPrin((String)e.getItem(), false); 3654 if (inputPrin != null) { 3655 prinField.setText(inputPrin.FULL_CLASS); 3656 } 3657 } 3658 } 3659 3660 /** 3661 * Event handler for Permission Popup Menu 3662 */ 3663 class PermissionMenuListener implements ItemListener { 3664 3665 private ToolDialog td; 3666 3667 PermissionMenuListener(ToolDialog td) { 3668 this.td = td; 3669 } 3670 3671 public void itemStateChanged(ItemEvent e) { 3672 if (e.getStateChange() == ItemEvent.DESELECTED) { 3673 // We're only interested in SELECTED events 3674 return; 3675 } 3676 3677 @SuppressWarnings("unchecked") 3678 JComboBox<String> perms = (JComboBox<String>)td.getComponent( 3679 ToolDialog.PD_PERM_CHOICE); 3680 @SuppressWarnings("unchecked") 3681 JComboBox<String> names = (JComboBox<String>)td.getComponent( 3682 ToolDialog.PD_NAME_CHOICE); 3683 @SuppressWarnings("unchecked") 3684 JComboBox<String> actions = (JComboBox<String>)td.getComponent( 3685 ToolDialog.PD_ACTIONS_CHOICE); 3686 JTextField nameField = (JTextField)td.getComponent( 3687 ToolDialog.PD_NAME_TEXTFIELD); 3688 JTextField actionsField = (JTextField)td.getComponent( 3689 ToolDialog.PD_ACTIONS_TEXTFIELD); 3690 JTextField permField = (JTextField)td.getComponent( 3691 ToolDialog.PD_PERM_TEXTFIELD); 3692 JTextField signedbyField = (JTextField)td.getComponent( 3693 ToolDialog.PD_SIGNEDBY_TEXTFIELD); 3694 3695 perms.getAccessibleContext().setAccessibleName( 3696 PolicyTool.splitToWords((String)e.getItem())); 3697 3698 // ignore if they choose the 'Permission:' item 3699 if (PolicyTool.collator.compare((String)e.getItem(), 3700 ToolDialog.PERM) == 0) { 3701 if (permField.getText() != null && 3702 permField.getText().length() > 0) { 3703 3704 Perm inputPerm = ToolDialog.getPerm(permField.getText(), true); 3705 if (inputPerm != null) { 3706 perms.setSelectedItem(inputPerm.CLASS); 3707 } 3708 } 3709 return; 3710 } 3711 3712 // if you change the permission, clear the name, actions, and signedBy 3713 if (permField.getText().indexOf((String)e.getItem()) == -1) { 3714 nameField.setText(""); 3715 actionsField.setText(""); 3716 signedbyField.setText(""); 3717 } 3718 3719 // set the text in the textfield and also modify the 3720 // pull-down choice menus to reflect the correct possible 3721 // set of names and actions 3722 3723 Perm inputPerm = ToolDialog.getPerm((String)e.getItem(), false); 3724 if (inputPerm == null) { 3725 permField.setText(""); 3726 } else { 3727 permField.setText(inputPerm.FULL_CLASS); 3728 } 3729 td.setPermissionNames(inputPerm, names, nameField); 3730 td.setPermissionActions(inputPerm, actions, actionsField); 3731 } 3732 } 3733 3734 /** 3735 * Event handler for Permission Name Popup Menu 3736 */ 3737 class PermissionNameMenuListener implements ItemListener { 3738 3739 private ToolDialog td; 3740 3741 PermissionNameMenuListener(ToolDialog td) { 3742 this.td = td; 3743 } 3744 3745 public void itemStateChanged(ItemEvent e) { 3746 if (e.getStateChange() == ItemEvent.DESELECTED) { 3747 // We're only interested in SELECTED events 3748 return; 3749 } 3750 3751 @SuppressWarnings("unchecked") 3752 JComboBox<String> names = (JComboBox<String>)td.getComponent(ToolDialog.PD_NAME_CHOICE); 3753 names.getAccessibleContext().setAccessibleName( 3754 PolicyTool.splitToWords((String)e.getItem())); 3755 3756 if (((String)e.getItem()).indexOf(ToolDialog.PERM_NAME) != -1) 3757 return; 3758 3759 JTextField tf = (JTextField)td.getComponent(ToolDialog.PD_NAME_TEXTFIELD); 3760 tf.setText((String)e.getItem()); 3761 } 3762 } 3763 3764 /** 3765 * Event handler for Permission Actions Popup Menu 3766 */ 3767 class PermissionActionsMenuListener implements ItemListener { 3768 3769 private ToolDialog td; 3770 3771 PermissionActionsMenuListener(ToolDialog td) { 3772 this.td = td; 3773 } 3774 3775 public void itemStateChanged(ItemEvent e) { 3776 if (e.getStateChange() == ItemEvent.DESELECTED) { 3777 // We're only interested in SELECTED events 3778 return; 3779 } 3780 3781 @SuppressWarnings("unchecked") 3782 JComboBox<String> actions = (JComboBox<String>)td.getComponent( 3783 ToolDialog.PD_ACTIONS_CHOICE); 3784 actions.getAccessibleContext().setAccessibleName((String)e.getItem()); 3785 3786 if (((String)e.getItem()).indexOf(ToolDialog.PERM_ACTIONS) != -1) 3787 return; 3788 3789 JTextField tf = (JTextField)td.getComponent( 3790 ToolDialog.PD_ACTIONS_TEXTFIELD); 3791 if (tf.getText() == null || tf.getText().equals("")) { 3792 tf.setText((String)e.getItem()); 3793 } else { 3794 if (tf.getText().indexOf((String)e.getItem()) == -1) 3795 tf.setText(tf.getText() + ", " + (String)e.getItem()); 3796 } 3797 } 3798 } 3799 3800 /** 3801 * Event handler for all the children dialogs/windows 3802 */ 3803 class ChildWindowListener implements WindowListener { 3804 3805 private ToolDialog td; 3806 3807 ChildWindowListener(ToolDialog td) { 3808 this.td = td; 3809 } 3810 3811 public void windowOpened(WindowEvent we) { 3812 } 3813 3814 public void windowClosing(WindowEvent we) { 3815 // same as pressing the "cancel" button 3816 td.setVisible(false); 3817 td.dispose(); 3818 } 3819 3820 public void windowClosed(WindowEvent we) { 3821 } 3822 3823 public void windowIconified(WindowEvent we) { 3824 } 3825 3826 public void windowDeiconified(WindowEvent we) { 3827 } 3828 3829 public void windowActivated(WindowEvent we) { 3830 } 3831 3832 public void windowDeactivated(WindowEvent we) { 3833 } 3834 } 3835 3836 /** 3837 * Event handler for CancelButton button 3838 */ 3839 class CancelButtonListener implements ActionListener { 3840 3841 private ToolDialog td; 3842 3843 CancelButtonListener(ToolDialog td) { 3844 this.td = td; 3845 } 3846 3847 public void actionPerformed(ActionEvent e) { 3848 td.setVisible(false); 3849 td.dispose(); 3850 } 3851 } 3852 3853 /** 3854 * Event handler for ErrorOKButton button 3855 */ 3856 class ErrorOKButtonListener implements ActionListener { 3857 3858 private ToolDialog ed; 3859 3860 ErrorOKButtonListener(ToolDialog ed) { 3861 this.ed = ed; 3862 } 3863 3864 public void actionPerformed(ActionEvent e) { 3865 ed.setVisible(false); 3866 ed.dispose(); 3867 } 3868 } 3869 3870 /** 3871 * Event handler for StatusOKButton button 3872 */ 3873 class StatusOKButtonListener implements ActionListener { 3874 3875 private ToolDialog sd; 3876 3877 StatusOKButtonListener(ToolDialog sd) { 3878 this.sd = sd; 3879 } 3880 3881 public void actionPerformed(ActionEvent e) { 3882 sd.setVisible(false); 3883 sd.dispose(); 3884 } 3885 } 3886 3887 /** 3888 * Event handler for UserSaveYes button 3889 */ 3890 class UserSaveYesButtonListener implements ActionListener { 3891 3892 private ToolDialog us; 3893 private PolicyTool tool; 3894 private ToolWindow tw; 3895 private int select; 3896 3897 UserSaveYesButtonListener(ToolDialog us, PolicyTool tool, 3898 ToolWindow tw, int select) { 3899 this.us = us; 3900 this.tool = tool; 3901 this.tw = tw; 3902 this.select = select; 3903 } 3904 3905 public void actionPerformed(ActionEvent e) { 3906 3907 // first get rid of the window 3908 us.setVisible(false); 3909 us.dispose(); 3910 3911 try { 3912 String filename = ((JTextField)tw.getComponent( 3913 ToolWindow.MW_FILENAME_TEXTFIELD)).getText(); 3914 if (filename == null || filename.equals("")) { 3915 us.displaySaveAsDialog(select); 3916 3917 // the above dialog will continue with the originally 3918 // requested command if necessary 3919 } else { 3920 // save the policy entries to a file 3921 tool.savePolicy(filename); 3922 3923 // display status 3924 MessageFormat form = new MessageFormat 3925 (PolicyTool.getMessage 3926 ("Policy.successfully.written.to.filename")); 3927 Object[] source = {filename}; 3928 tw.displayStatusDialog(null, form.format(source)); 3929 3930 // now continue with the originally requested command 3931 // (QUIT, NEW, or OPEN) 3932 us.userSaveContinue(tool, tw, us, select); 3933 } 3934 } catch (Exception ee) { 3935 // error -- just report it and bail 3936 tw.displayErrorDialog(null, ee); 3937 } 3938 } 3939 } 3940 3941 /** 3942 * Event handler for UserSaveNoButton 3943 */ 3944 class UserSaveNoButtonListener implements ActionListener { 3945 3946 private PolicyTool tool; 3947 private ToolWindow tw; 3948 private ToolDialog us; 3949 private int select; 3950 3951 UserSaveNoButtonListener(ToolDialog us, PolicyTool tool, 3952 ToolWindow tw, int select) { 3953 this.us = us; 3954 this.tool = tool; 3955 this.tw = tw; 3956 this.select = select; 3957 } 3958 3959 public void actionPerformed(ActionEvent e) { 3960 us.setVisible(false); 3961 us.dispose(); 3962 3963 // now continue with the originally requested command 3964 // (QUIT, NEW, or OPEN) 3965 us.userSaveContinue(tool, tw, us, select); 3966 } 3967 } 3968 3969 /** 3970 * Event handler for UserSaveCancelButton 3971 */ 3972 class UserSaveCancelButtonListener implements ActionListener { 3973 3974 private ToolDialog us; 3975 3976 UserSaveCancelButtonListener(ToolDialog us) { 3977 this.us = us; 3978 } 3979 3980 public void actionPerformed(ActionEvent e) { 3981 us.setVisible(false); 3982 us.dispose(); 3983 3984 // do NOT continue with the originally requested command 3985 // (QUIT, NEW, or OPEN) 3986 } 3987 } 3988 3989 /** 3990 * Event handler for ConfirmRemovePolicyEntryOKButtonListener 3991 */ 3992 class ConfirmRemovePolicyEntryOKButtonListener implements ActionListener { 3993 3994 private PolicyTool tool; 3995 private ToolWindow tw; 3996 private ToolDialog us; 3997 3998 ConfirmRemovePolicyEntryOKButtonListener(PolicyTool tool, 3999 ToolWindow tw, ToolDialog us) { 4000 this.tool = tool; 4001 this.tw = tw; 4002 this.us = us; 4003 } 4004 4005 public void actionPerformed(ActionEvent e) { 4006 // remove the entry 4007 @SuppressWarnings("unchecked") 4008 JList<String> list = (JList<String>)tw.getComponent(ToolWindow.MW_POLICY_LIST); 4009 int index = list.getSelectedIndex(); 4010 PolicyEntry entries[] = tool.getEntry(); 4011 tool.removeEntry(entries[index]); 4012 4013 // redraw the window listing 4014 DefaultListModel<String> listModel = new DefaultListModel<>(); 4015 list = new JList<>(listModel); 4016 list.setVisibleRowCount(15); 4017 list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); 4018 list.addMouseListener(new PolicyListListener(tool, tw)); 4019 entries = tool.getEntry(); 4020 if (entries != null) { 4021 for (int i = 0; i < entries.length; i++) { 4022 listModel.addElement(entries[i].headerToString()); 4023 } 4024 } 4025 tw.replacePolicyList(list); 4026 us.setVisible(false); 4027 us.dispose(); 4028 } 4029 } 4030 4031 /** 4032 * Just a special name, so that the codes dealing with this exception knows 4033 * it's special, and does not pop out a warning box. 4034 */ 4035 class NoDisplayException extends RuntimeException { 4036 private static final long serialVersionUID = -4611761427108719794L; 4037 } 4038 4039 /** 4040 * This is a java.awt.List that bind an Object to each String it holds. 4041 */ 4042 class TaggedList extends JList<String> { 4043 private static final long serialVersionUID = -5676238110427785853L; 4044 4045 private java.util.List<Object> data = new LinkedList<>(); 4046 public TaggedList(int i, boolean b) { 4047 super(new DefaultListModel<>()); 4048 setVisibleRowCount(i); 4049 setSelectionMode(b ? ListSelectionModel.MULTIPLE_INTERVAL_SELECTION : ListSelectionModel.SINGLE_SELECTION); 4050 } 4051 4052 public Object getObject(int index) { 4053 return data.get(index); 4054 } 4055 4056 public void addTaggedItem(String string, Object object) { 4057 ((DefaultListModel<String>)getModel()).addElement(string); 4058 data.add(object); 4059 } 4060 4061 public void replaceTaggedItem(String string, Object object, int index) { 4062 ((DefaultListModel<String>)getModel()).set(index, string); 4063 data.set(index, object); 4064 } 4065 4066 public void removeTaggedItem(int index) { 4067 ((DefaultListModel<String>)getModel()).remove(index); 4068 data.remove(index); 4069 } 4070 } 4071 4072 /** 4073 * Convenience Principal Classes 4074 */ 4075 4076 class Prin { 4077 public final String CLASS; 4078 public final String FULL_CLASS; 4079 4080 public Prin(String clazz, String fullClass) { 4081 this.CLASS = clazz; 4082 this.FULL_CLASS = fullClass; 4083 } 4084 } 4085 4086 class KrbPrin extends Prin { 4087 public KrbPrin() { 4088 super("KerberosPrincipal", 4089 "javax.security.auth.kerberos.KerberosPrincipal"); 4090 } 4091 } 4092 4093 class X500Prin extends Prin { 4094 public X500Prin() { 4095 super("X500Principal", 4096 "javax.security.auth.x500.X500Principal"); 4097 } 4098 } 4099 4100 /** 4101 * Convenience Permission Classes 4102 */ 4103 4104 class Perm { 4105 public final String CLASS; 4106 public final String FULL_CLASS; 4107 public final String[] TARGETS; 4108 public final String[] ACTIONS; 4109 4110 public Perm(String clazz, String fullClass, 4111 String[] targets, String[] actions) { 4112 4113 this.CLASS = clazz; 4114 this.FULL_CLASS = fullClass; 4115 this.TARGETS = targets; 4116 this.ACTIONS = actions; 4117 } 4118 } 4119 4120 class AllPerm extends Perm { 4121 public AllPerm() { 4122 super("AllPermission", "java.security.AllPermission", null, null); 4123 } 4124 } 4125 4126 class AudioPerm extends Perm { 4127 public AudioPerm() { 4128 super("AudioPermission", 4129 "javax.sound.sampled.AudioPermission", 4130 new String[] { 4131 "play", 4132 "record" 4133 }, 4134 null); 4135 } 4136 } 4137 4138 class AuthPerm extends Perm { 4139 public AuthPerm() { 4140 super("AuthPermission", 4141 "javax.security.auth.AuthPermission", 4142 new String[] { 4143 "doAs", 4144 "doAsPrivileged", 4145 "getSubject", 4146 "getSubjectFromDomainCombiner", 4147 "setReadOnly", 4148 "modifyPrincipals", 4149 "modifyPublicCredentials", 4150 "modifyPrivateCredentials", 4151 "refreshCredential", 4152 "destroyCredential", 4153 "createLoginContext.<" + PolicyTool.getMessage("name") + ">", 4154 "getLoginConfiguration", 4155 "setLoginConfiguration", 4156 "createLoginConfiguration.<" + 4157 PolicyTool.getMessage("configuration.type") + ">", 4158 "refreshLoginConfiguration" 4159 }, 4160 null); 4161 } 4162 } 4163 4164 class AWTPerm extends Perm { 4165 public AWTPerm() { 4166 super("AWTPermission", 4167 "java.awt.AWTPermission", 4168 new String[] { 4169 "accessClipboard", 4170 "accessEventQueue", 4171 "accessSystemTray", 4172 "createRobot", 4173 "fullScreenExclusive", 4174 "listenToAllAWTEvents", 4175 "readDisplayPixels", 4176 "replaceKeyboardFocusManager", 4177 "setAppletStub", 4178 "setWindowAlwaysOnTop", 4179 "showWindowWithoutWarningBanner", 4180 "toolkitModality", 4181 "watchMousePointer" 4182 }, 4183 null); 4184 } 4185 } 4186 4187 class DelegationPerm extends Perm { 4188 public DelegationPerm() { 4189 super("DelegationPermission", 4190 "javax.security.auth.kerberos.DelegationPermission", 4191 new String[] { 4192 // allow user input 4193 }, 4194 null); 4195 } 4196 } 4197 4198 class FilePerm extends Perm { 4199 public FilePerm() { 4200 super("FilePermission", 4201 "java.io.FilePermission", 4202 new String[] { 4203 "<<ALL FILES>>" 4204 }, 4205 new String[] { 4206 "read", 4207 "write", 4208 "delete", 4209 "execute" 4210 }); 4211 } 4212 } 4213 4214 class URLPerm extends Perm { 4215 public URLPerm() { 4216 super("URLPermission", 4217 "java.net.URLPermission", 4218 new String[] { 4219 "<"+ PolicyTool.getMessage("url") + ">", 4220 }, 4221 new String[] { 4222 "<" + PolicyTool.getMessage("method.list") + ">:<" 4223 + PolicyTool.getMessage("request.headers.list") + ">", 4224 }); 4225 } 4226 } 4227 4228 class InqSecContextPerm extends Perm { 4229 public InqSecContextPerm() { 4230 super("InquireSecContextPermission", 4231 "com.sun.security.jgss.InquireSecContextPermission", 4232 new String[] { 4233 "KRB5_GET_SESSION_KEY", 4234 "KRB5_GET_TKT_FLAGS", 4235 "KRB5_GET_AUTHZ_DATA", 4236 "KRB5_GET_AUTHTIME" 4237 }, 4238 null); 4239 } 4240 } 4241 4242 class LogPerm extends Perm { 4243 public LogPerm() { 4244 super("LoggingPermission", 4245 "java.util.logging.LoggingPermission", 4246 new String[] { 4247 "control" 4248 }, 4249 null); 4250 } 4251 } 4252 4253 class MgmtPerm extends Perm { 4254 public MgmtPerm() { 4255 super("ManagementPermission", 4256 "java.lang.management.ManagementPermission", 4257 new String[] { 4258 "control", 4259 "monitor" 4260 }, 4261 null); 4262 } 4263 } 4264 4265 class MBeanPerm extends Perm { 4266 public MBeanPerm() { 4267 super("MBeanPermission", 4268 "javax.management.MBeanPermission", 4269 new String[] { 4270 // allow user input 4271 }, 4272 new String[] { 4273 "addNotificationListener", 4274 "getAttribute", 4275 "getClassLoader", 4276 "getClassLoaderFor", 4277 "getClassLoaderRepository", 4278 "getDomains", 4279 "getMBeanInfo", 4280 "getObjectInstance", 4281 "instantiate", 4282 "invoke", 4283 "isInstanceOf", 4284 "queryMBeans", 4285 "queryNames", 4286 "registerMBean", 4287 "removeNotificationListener", 4288 "setAttribute", 4289 "unregisterMBean" 4290 }); 4291 } 4292 } 4293 4294 class MBeanSvrPerm extends Perm { 4295 public MBeanSvrPerm() { 4296 super("MBeanServerPermission", 4297 "javax.management.MBeanServerPermission", 4298 new String[] { 4299 "createMBeanServer", 4300 "findMBeanServer", 4301 "newMBeanServer", 4302 "releaseMBeanServer" 4303 }, 4304 null); 4305 } 4306 } 4307 4308 class MBeanTrustPerm extends Perm { 4309 public MBeanTrustPerm() { 4310 super("MBeanTrustPermission", 4311 "javax.management.MBeanTrustPermission", 4312 new String[] { 4313 "register" 4314 }, 4315 null); 4316 } 4317 } 4318 4319 class NetPerm extends Perm { 4320 public NetPerm() { 4321 super("NetPermission", 4322 "java.net.NetPermission", 4323 new String[] { 4324 "setDefaultAuthenticator", 4325 "requestPasswordAuthentication", 4326 "specifyStreamHandler", 4327 "setProxySelector", 4328 "getProxySelector", 4329 "setCookieHandler", 4330 "getCookieHandler", 4331 "setResponseCache", 4332 "getResponseCache" 4333 }, 4334 null); 4335 } 4336 } 4337 4338 class PrivCredPerm extends Perm { 4339 public PrivCredPerm() { 4340 super("PrivateCredentialPermission", 4341 "javax.security.auth.PrivateCredentialPermission", 4342 new String[] { 4343 // allow user input 4344 }, 4345 new String[] { 4346 "read" 4347 }); 4348 } 4349 } 4350 4351 class PropPerm extends Perm { 4352 public PropPerm() { 4353 super("PropertyPermission", 4354 "java.util.PropertyPermission", 4355 new String[] { 4356 // allow user input 4357 }, 4358 new String[] { 4359 "read", 4360 "write" 4361 }); 4362 } 4363 } 4364 4365 class ReflectPerm extends Perm { 4366 public ReflectPerm() { 4367 super("ReflectPermission", 4368 "java.lang.reflect.ReflectPermission", 4369 new String[] { 4370 "suppressAccessChecks" 4371 }, 4372 null); 4373 } 4374 } 4375 4376 class RuntimePerm extends Perm { 4377 public RuntimePerm() { 4378 super("RuntimePermission", 4379 "java.lang.RuntimePermission", 4380 new String[] { 4381 "createClassLoader", 4382 "getClassLoader", 4383 "setContextClassLoader", 4384 "enableContextClassLoaderOverride", 4385 "setSecurityManager", 4386 "createSecurityManager", 4387 "getenv.<" + 4388 PolicyTool.getMessage("environment.variable.name") + ">", 4389 "exitVM", 4390 "shutdownHooks", 4391 "setFactory", 4392 "setIO", 4393 "modifyThread", 4394 "stopThread", 4395 "modifyThreadGroup", 4396 "getProtectionDomain", 4397 "readFileDescriptor", 4398 "writeFileDescriptor", 4399 "loadLibrary.<" + 4400 PolicyTool.getMessage("library.name") + ">", 4401 "accessClassInPackage.<" + 4402 PolicyTool.getMessage("package.name")+">", 4403 "defineClassInPackage.<" + 4404 PolicyTool.getMessage("package.name")+">", 4405 "accessDeclaredMembers", 4406 "queuePrintJob", 4407 "getStackTrace", 4408 "setDefaultUncaughtExceptionHandler", 4409 "preferences", 4410 "usePolicy", 4411 // "inheritedChannel" 4412 }, 4413 null); 4414 } 4415 } 4416 4417 class SecurityPerm extends Perm { 4418 public SecurityPerm() { 4419 super("SecurityPermission", 4420 "java.security.SecurityPermission", 4421 new String[] { 4422 "createAccessControlContext", 4423 "getDomainCombiner", 4424 "getPolicy", 4425 "setPolicy", 4426 "createPolicy.<" + 4427 PolicyTool.getMessage("policy.type") + ">", 4428 "getProperty.<" + 4429 PolicyTool.getMessage("property.name") + ">", 4430 "setProperty.<" + 4431 PolicyTool.getMessage("property.name") + ">", 4432 "insertProvider.<" + 4433 PolicyTool.getMessage("provider.name") + ">", 4434 "removeProvider.<" + 4435 PolicyTool.getMessage("provider.name") + ">", 4436 //"setSystemScope", 4437 //"setIdentityPublicKey", 4438 //"setIdentityInfo", 4439 //"addIdentityCertificate", 4440 //"removeIdentityCertificate", 4441 //"printIdentity", 4442 "clearProviderProperties.<" + 4443 PolicyTool.getMessage("provider.name") + ">", 4444 "putProviderProperty.<" + 4445 PolicyTool.getMessage("provider.name") + ">", 4446 "removeProviderProperty.<" + 4447 PolicyTool.getMessage("provider.name") + ">", 4448 //"getSignerPrivateKey", 4449 //"setSignerKeyPair" 4450 }, 4451 null); 4452 } 4453 } 4454 4455 class SerialPerm extends Perm { 4456 public SerialPerm() { 4457 super("SerializablePermission", 4458 "java.io.SerializablePermission", 4459 new String[] { 4460 "enableSubclassImplementation", 4461 "enableSubstitution" 4462 }, 4463 null); 4464 } 4465 } 4466 4467 class ServicePerm extends Perm { 4468 public ServicePerm() { 4469 super("ServicePermission", 4470 "javax.security.auth.kerberos.ServicePermission", 4471 new String[] { 4472 // allow user input 4473 }, 4474 new String[] { 4475 "initiate", 4476 "accept" 4477 }); 4478 } 4479 } 4480 4481 class SocketPerm extends Perm { 4482 public SocketPerm() { 4483 super("SocketPermission", 4484 "java.net.SocketPermission", 4485 new String[] { 4486 // allow user input 4487 }, 4488 new String[] { 4489 "accept", 4490 "connect", 4491 "listen", 4492 "resolve" 4493 }); 4494 } 4495 } 4496 4497 class SQLPerm extends Perm { 4498 public SQLPerm() { 4499 super("SQLPermission", 4500 "java.sql.SQLPermission", 4501 new String[] { 4502 "setLog", 4503 "callAbort", 4504 "setSyncFactory", 4505 "setNetworkTimeout", 4506 }, 4507 null); 4508 } 4509 } 4510 4511 class SSLPerm extends Perm { 4512 public SSLPerm() { 4513 super("SSLPermission", 4514 "javax.net.ssl.SSLPermission", 4515 new String[] { 4516 "setHostnameVerifier", 4517 "getSSLSessionContext" 4518 }, 4519 null); 4520 } 4521 } 4522 4523 class SubjDelegPerm extends Perm { 4524 public SubjDelegPerm() { 4525 super("SubjectDelegationPermission", 4526 "javax.management.remote.SubjectDelegationPermission", 4527 new String[] { 4528 // allow user input 4529 }, 4530 null); 4531 } 4532 }