001: /*
002: * @(#)Debug.java 1.16 06/10/10
003: *
004: * Copyright 1990-2006 Sun Microsystems, Inc. All Rights Reserved.
005: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
006: *
007: * This program is free software; you can redistribute it and/or
008: * modify it under the terms of the GNU General Public License version
009: * 2 only, as published by the Free Software Foundation.
010: *
011: * This program is distributed in the hope that it will be useful, but
012: * WITHOUT ANY WARRANTY; without even the implied warranty of
013: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
014: * General Public License version 2 for more details (a copy is
015: * included at /legal/license.txt).
016: *
017: * You should have received a copy of the GNU General Public License
018: * version 2 along with this work; if not, write to the Free Software
019: * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
020: * 02110-1301 USA
021: *
022: * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
023: * Clara, CA 95054 or visit www.sun.com if you need additional
024: * information or have any questions.
025: *
026: */
027:
028: package sun.security.util;
029:
030: import java.math.BigInteger;
031:
032: /**
033: * A utility class for debuging.
034: *
035: * @version 1.9
036: * @author Roland Schemers
037: */
038: public class Debug {
039:
040: private String prefix;
041:
042: private static String args;
043:
044: static {
045: args = (String) java.security.AccessController
046: .doPrivileged(new sun.security.action.GetPropertyAction(
047: "java.security.debug"));
048:
049: String args2 = (String) java.security.AccessController
050: .doPrivileged(new sun.security.action.GetPropertyAction(
051: "java.security.auth.debug"));
052:
053: if (args == null) {
054: args = args2;
055: } else {
056: if (args2 != null)
057: args = args + "," + args2;
058: }
059:
060: if (args != null) {
061: args = args.toLowerCase();
062: if (args.equals("help")) {
063: Help();
064: }
065: }
066: }
067:
068: public static void Help() {
069: System.err.println();
070: System.err.println("all turn on all debugging");
071: System.err
072: .println("access print all checkPermission results");
073: System.err
074: .println("combiner SubjectDomainCombiner debugging");
075: System.err.println("jar jar verification");
076: System.err.println("logincontext login context results");
077: System.err.println("policy loading and granting");
078: System.err.println("provider security provider debugging");
079: System.err
080: .println("scl permissions SecureClassLoader assigns");
081: System.err.println();
082: System.err.println("The following can be used with access:");
083: System.err.println();
084: System.err.println("stack include stack trace");
085: System.err.println("domain dumps all domains in context");
086: System.err
087: .println("failure before throwing exception, dump stack");
088: System.err
089: .println(" and domain that didn't have permission");
090: System.err.println();
091: System.err
092: .println("Note: Separate multiple options with a comma");
093: System.exit(0);
094: }
095:
096: /**
097: * Get a Debug object corresponding to whether or not the given
098: * option is set. Set the prefix to be the same as option.
099: */
100:
101: public static Debug getInstance(String option) {
102: return getInstance(option, option);
103: }
104:
105: /**
106: * Get a Debug object corresponding to whether or not the given
107: * option is set. Set the prefix to be prefix.
108: */
109: public static Debug getInstance(String option, String prefix) {
110: if (isOn(option)) {
111: Debug d = new Debug();
112: d.prefix = prefix;
113: return d;
114: } else {
115: return null;
116: }
117: }
118:
119: /**
120: * True if the system property "security.debug" contains the
121: * string "option".
122: */
123: public static boolean isOn(String option) {
124: if (args == null)
125: return false;
126: else {
127: if (args.indexOf("all") != -1)
128: return true;
129: else
130: return (args.indexOf(option) != -1);
131: }
132: }
133:
134: /**
135: * print a message to stderr that is prefixed with the prefix
136: * created from the call to getInstance.
137: */
138:
139: public void println(String message) {
140: System.err.println(prefix + ": " + message);
141: }
142:
143: /**
144: * print a blank line to stderr that is prefixed with the prefix.
145: */
146:
147: public void println() {
148: System.err.println(prefix + ":");
149: }
150:
151: /**
152: * print a message to stderr that is prefixed with the prefix.
153: */
154:
155: public static void println(String prefix, String message) {
156: System.err.println(prefix + ": " + message);
157: }
158:
159: /**
160: * return a hexadecimal printed representation of the specified
161: * BigInteger object. the value is formatted to fit on lines of
162: * at least 75 characters, with embedded newlines. Words are
163: * separated for readability, with eight words (32 bytes) per line.
164: */
165: public static String toHexString(BigInteger b) {
166: String hexValue = b.toString(16);
167: StringBuffer buf = new StringBuffer(hexValue.length() * 2);
168:
169: if (hexValue.startsWith("-")) {
170: buf.append(" -");
171: hexValue = hexValue.substring(1);
172: } else {
173: buf.append(" "); // four spaces
174: }
175: if ((hexValue.length() % 2) != 0) {
176: // add back the leading 0
177: hexValue = "0" + hexValue;
178: }
179: int i = 0;
180: while (i < hexValue.length()) {
181: // one byte at a time
182: buf.append(hexValue.substring(i, i + 2));
183: i += 2;
184: if (i != hexValue.length()) {
185: if ((i % 64) == 0) {
186: buf.append("\n "); // line after eight words
187: } else if (i % 8 == 0) {
188: buf.append(" "); // space between words
189: }
190: }
191: }
192: return buf.toString();
193: }
194: }
|