History

My first initial commit with all of mine experimental changes.

Dmitry Kabak (userdima committed 13 years ago

Commit d37b88d1 parent 3f5b46618352 files · +2598093 −-8690Browse files

Showing the changes to java/pkg/sun/security/util/Debug.java (1 of 18352 files). Show all

Unified · Split

java/pkg/sun/security/util/Debug.java+292−0
@@ -0,0 +1,292 @@
1/*
2 * Copyright (c) 1998, 2010, 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
26package sun.security.util;
27
28import java.math.BigInteger;
29import java.util.regex.Pattern;
30import java.util.regex.Matcher;
31import java.util.Locale;
32
33/**
34 * A utility class for debuging.
35 *
36 * @author Roland Schemers
37 */
38public class Debug {
39
40 private String prefix;
41
42 private static String args;
43
44 static {
45 args = java.security.AccessController.doPrivileged
46 (new sun.security.action.GetPropertyAction
47 ("java.security.debug"));
48
49 String args2 = java.security.AccessController.doPrivileged
50 (new sun.security.action.GetPropertyAction
51 ("java.security.auth.debug"));
52
53 if (args == null) {
54 args = args2;
55 } else {
56 if (args2 != null)
57 args = args + "," + args2;
58 }
59
60 if (args != null) {
61 args = marshal(args);
62 if (args.equals("help")) {
63 Help();
64 }
65 }
66 }
67
68 public static void Help()
69 {
70 System.err.println();
71 System.err.println("all turn on all debugging");
72 System.err.println("access print all checkPermission results");
73 System.err.println("combiner SubjectDomainCombiner debugging");
74 System.err.println("gssloginconfig");
75 System.err.println("configfile JAAS ConfigFile loading");
76 System.err.println("configparser JAAS ConfigFile parsing");
77 System.err.println(" GSS LoginConfigImpl debugging");
78 System.err.println("jar jar verification");
79 System.err.println("logincontext login context results");
80 System.err.println("policy loading and granting");
81 System.err.println("provider security provider debugging");
82 System.err.println("scl permissions SecureClassLoader assigns");
83 System.err.println();
84 System.err.println("The following can be used with access:");
85 System.err.println();
86 System.err.println("stack include stack trace");
87 System.err.println("domain dump all domains in context");
88 System.err.println("failure before throwing exception, dump stack");
89 System.err.println(" and domain that didn't have permission");
90 System.err.println();
91 System.err.println("The following can be used with stack and domain:");
92 System.err.println();
93 System.err.println("permission=<classname>");
94 System.err.println(" only dump output if specified permission");
95 System.err.println(" is being checked");
96 System.err.println("codebase=<URL>");
97 System.err.println(" only dump output if specified codebase");
98 System.err.println(" is being checked");
99
100 System.err.println();
101 System.err.println("Note: Separate multiple options with a comma");
102 System.exit(0);
103 }
104
105
106 /**
107 * Get a Debug object corresponding to whether or not the given
108 * option is set. Set the prefix to be the same as option.
109 */
110
111 public static Debug getInstance(String option)
112 {
113 return getInstance(option, option);
114 }
115
116 /**
117 * Get a Debug object corresponding to whether or not the given
118 * option is set. Set the prefix to be prefix.
119 */
120 public static Debug getInstance(String option, String prefix)
121 {
122 if (isOn(option)) {
123 Debug d = new Debug();
124 d.prefix = prefix;
125 return d;
126 } else {
127 return null;
128 }
129 }
130
131 /**
132 * True if the system property "security.debug" contains the
133 * string "option".
134 */
135 public static boolean isOn(String option)
136 {
137 if (args == null)
138 return false;
139 else {
140 if (args.indexOf("all") != -1)
141 return true;
142 else
143 return (args.indexOf(option) != -1);
144 }
145 }
146
147 /**
148 * print a message to stderr that is prefixed with the prefix
149 * created from the call to getInstance.
150 */
151
152 public void println(String message)
153 {
154 System.err.println(prefix + ": "+message);
155 }
156
157 /**
158 * print a blank line to stderr that is prefixed with the prefix.
159 */
160
161 public void println()
162 {
163 System.err.println(prefix + ":");
164 }
165
166 /**
167 * print a message to stderr that is prefixed with the prefix.
168 */
169
170 public static void println(String prefix, String message)
171 {
172 System.err.println(prefix + ": "+message);
173 }
174
175 /**
176 * return a hexadecimal printed representation of the specified
177 * BigInteger object. the value is formatted to fit on lines of
178 * at least 75 characters, with embedded newlines. Words are
179 * separated for readability, with eight words (32 bytes) per line.
180 */
181 public static String toHexString(BigInteger b) {
182 String hexValue = b.toString(16);
183 StringBuffer buf = new StringBuffer(hexValue.length()*2);
184
185 if (hexValue.startsWith("-")) {
186 buf.append(" -");
187 hexValue = hexValue.substring(1);
188 } else {
189 buf.append(" "); // four spaces
190 }
191 if ((hexValue.length()%2) != 0) {
192 // add back the leading 0
193 hexValue = "0" + hexValue;
194 }
195 int i=0;
196 while (i < hexValue.length()) {
197 // one byte at a time
198 buf.append(hexValue.substring(i, i+2));
199 i+=2;
200 if (i!= hexValue.length()) {
201 if ((i%64) == 0) {
202 buf.append("\n "); // line after eight words
203 } else if (i%8 == 0) {
204 buf.append(" "); // space between words
205 }
206 }
207 }
208 return buf.toString();
209 }
210
211 /**
212 * change a string into lower case except permission classes and URLs.
213 */
214 private static String marshal(String args) {
215 if (args != null) {
216 StringBuffer target = new StringBuffer();
217 StringBuffer source = new StringBuffer(args);
218
219 // obtain the "permission=<classname>" options
220 // the syntax of classname: IDENTIFIER.IDENTIFIER
221 // the regular express to match a class name:
222 // "[a-zA-Z_$][a-zA-Z0-9_$]*([.][a-zA-Z_$][a-zA-Z0-9_$]*)*"
223 String keyReg = "[Pp][Ee][Rr][Mm][Ii][Ss][Ss][Ii][Oo][Nn]=";
224 String keyStr = "permission=";
225 String reg = keyReg +
226 "[a-zA-Z_$][a-zA-Z0-9_$]*([.][a-zA-Z_$][a-zA-Z0-9_$]*)*";
227 Pattern pattern = Pattern.compile(reg);
228 Matcher matcher = pattern.matcher(source);
229 StringBuffer left = new StringBuffer();
230 while (matcher.find()) {
231 String matched = matcher.group();
232 target.append(matched.replaceFirst(keyReg, keyStr));
233 target.append(" ");
234
235 // delete the matched sequence
236 matcher.appendReplacement(left, "");
237 }
238 matcher.appendTail(left);
239 source = left;
240
241 // obtain the "codebase=<URL>" options
242 // the syntax of URL is too flexible, and here assumes that the
243 // URL contains no space, comma(','), and semicolon(';'). That
244 // also means those characters also could be used as separator
245 // after codebase option.
246 // However, the assumption is incorrect in some special situation
247 // when the URL contains comma or semicolon
248 keyReg = "[Cc][Oo][Dd][Ee][Bb][Aa][Ss][Ee]=";
249 keyStr = "codebase=";
250 reg = keyReg + "[^, ;]*";
251 pattern = Pattern.compile(reg);
252 matcher = pattern.matcher(source);
253 left = new StringBuffer();
254 while (matcher.find()) {
255 String matched = matcher.group();
256 target.append(matched.replaceFirst(keyReg, keyStr));
257 target.append(" ");
258
259 // delete the matched sequence
260 matcher.appendReplacement(left, "");
261 }
262 matcher.appendTail(left);
263 source = left;
264
265 // convert the rest to lower-case characters
266 target.append(source.toString().toLowerCase(Locale.ENGLISH));
267
268 return target.toString();
269 }
270
271 return null;
272 }
273
274 private final static char[] hexDigits = "0123456789abcdef".toCharArray();
275
276 public static String toString(byte[] b) {
277 if (b == null) {
278 return "(null)";
279 }
280 StringBuilder sb = new StringBuilder(b.length * 3);
281 for (int i = 0; i < b.length; i++) {
282 int k = b[i] & 0xff;
283 if (i != 0) {
284 sb.append(':');
285 }
286 sb.append(hexDigits[k >>> 4]);
287 sb.append(hexDigits[k & 0xf]);
288 }
289 return sb.toString();
290 }
291
292}