1 /*
   2  * Copyright (c) 2005, 2012, 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.jgss.wrapper;
  27 
  28 import java.util.HashMap;
  29 import java.security.Provider;
  30 import java.security.AccessController;
  31 import java.security.PrivilegedAction;
  32 import org.ietf.jgss.Oid;
  33 import sun.security.action.PutAllAction;
  34 
  35 /**
  36  * Defines the Sun NativeGSS provider for plugging in the
  37  * native GSS mechanisms to Java GSS.
  38  *
  39  * List of supported mechanisms depends on the local
  40  * machine configuration.
  41  *
  42  * @author Yu-Ching Valerie Peng
  43  */
  44 
  45 public final class SunNativeProvider extends Provider {
  46 
  47     private static final long serialVersionUID = -238911724858694204L;
  48 
  49     private static final String NAME = "SunNativeGSS";
  50     private static final String INFO = "Sun Native GSS provider";
  51     private static final String MF_CLASS =
  52         "sun.security.jgss.wrapper.NativeGSSFactory";
  53     private static final String LIB_PROP = "sun.security.jgss.lib";
  54     private static final String DEBUG_PROP = "sun.security.nativegss.debug";
  55     private static HashMap<String, String> MECH_MAP;
  56     static final Provider INSTANCE = new SunNativeProvider();
  57     static boolean DEBUG;
  58     static void debug(String message) {
  59         if (DEBUG) {
  60             if (message == null) {
  61                 throw new NullPointerException();
  62             }
  63             System.out.println(NAME + ": " + message);
  64         }
  65     }
  66 
  67     static {
  68         MECH_MAP =
  69             AccessController.doPrivileged(
  70                 new PrivilegedAction<HashMap<String, String>>() {
  71                     public HashMap<String, String> run() {
  72                         DEBUG = Boolean.parseBoolean
  73                             (System.getProperty(DEBUG_PROP));
  74                         try {
  75                             System.loadLibrary("j2gss");
  76                         } catch (Error err) {
  77                             debug("No j2gss library found!");
  78                             if (DEBUG) err.printStackTrace();
  79                             return null;
  80                         }
  81                         String gssLibs[] = new String[0];
  82                         String defaultLib = System.getProperty(LIB_PROP);
  83                         if (defaultLib == null || defaultLib.trim().equals("")) {
  84                             String osname = System.getProperty("os.name");
  85                             if (osname.startsWith("SunOS")) {
  86                                 gssLibs = new String[]{ "libgss.so" };
  87                             } else if (osname.startsWith("Linux")) {
  88                                 gssLibs = new String[]{
  89                                     "libgssapi.so",
  90                                     "libgssapi_krb5.so",
  91                                     "libgssapi_krb5.so.2",
  92                                 };
  93                             }
  94                         } else {
  95                             gssLibs = new String[]{ defaultLib };
  96                         }
  97                         for (String libName: gssLibs) {
  98                             if (GSSLibStub.init(libName)) {
  99                                 debug("Loaded GSS library: " + libName);
 100                                 Oid[] mechs = GSSLibStub.indicateMechs();
 101                                 HashMap<String, String> map =
 102                                             new HashMap<String, String>();
 103                                 for (int i = 0; i < mechs.length; i++) {
 104                                     debug("Native MF for " + mechs[i]);
 105                                     map.put("GssApiMechanism." + mechs[i],
 106                                             MF_CLASS);
 107                                 }
 108                                 return map;
 109                             }
 110                         }
 111                         return null;
 112                     }
 113                 });
 114     }
 115 
 116     public SunNativeProvider() {
 117         /* We are the Sun NativeGSS provider */
 118         super(NAME, 1.0, INFO);
 119 
 120         if (MECH_MAP != null) {
 121             AccessController.doPrivileged(new PutAllAction(this, MECH_MAP));
 122         }
 123     }
 124 }