1 /* 2 * Copyright 2009 Sun Microsystems, Inc. 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. Sun designates this 8 * particular file as subject to the "Classpath" exception as provided 9 * by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, 22 * CA 95054 USA or visit www.sun.com if you need additional information or 23 * have any questions. 24 */ 25 26 package sun.net.www.protocol.http; 27 28 import java.io.IOException; 29 import java.lang.reflect.Constructor; 30 import sun.util.logging.PlatformLogger; 31 32 /** 33 * This abstract class is a bridge to connect NegotiteAuthentication and 34 * NegotiatorImpl, so that JAAS and JGSS calls can be made 35 */ 36 public abstract class Negotiator { 37 static Negotiator getSupported(HttpCallerInfo hci) 38 throws Exception { 39 40 // These lines are equivalent to 41 // return new NegotiatorImpl(hci); 42 // The current implementation will make sure NegotiatorImpl is not 43 // directly referenced when compiling, thus smooth the way of building 44 // the J2SE platform where HttpURLConnection is a bootstrap class. 45 // 46 // Makes NegotiatorImpl, and the security classes it references, a 47 // runtime dependency rather than a static one. 48 49 Class clazz; 50 Constructor c; 51 try { 52 clazz = Class.forName("sun.net.www.protocol.http.spnego.NegotiatorImpl", true, null); 53 c = clazz.getConstructor(HttpCallerInfo.class); 54 } catch (ClassNotFoundException cnfe) { 55 finest(cnfe); 56 throw cnfe; 57 } catch (ReflectiveOperationException roe) { 58 // if the class is there then something seriously wrong if 59 // the constructor is not. 60 throw new AssertionError(roe); 61 } 62 63 try { 64 return (Negotiator) (c.newInstance(hci)); 65 } catch (ReflectiveOperationException roe) { 66 finest(roe); 67 Throwable t = roe.getCause(); 68 if (t != null && t instanceof Exception) 69 finest((Exception)t); 70 throw roe; 71 } 72 } 73 74 public abstract byte[] firstToken() throws IOException; 75 76 public abstract byte[] nextToken(byte[] in) throws IOException; 77 78 private static void finest(Exception e) { 79 PlatformLogger logger = HttpURLConnection.getHttpLogger(); 80 logger.finest("NegotiateAuthentication: " + e); 81 } 82 } 83