View Javadoc
1   /*
2    * Copyright (c) 2005, 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.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                              } else if (osname.contains("OS X")) {
94                                  gssLibs = new String[]{
95                                      "libgssapi_krb5.dylib",
96                                      "/usr/lib/sasl2/libgssapiv2.2.so",
97                                 };
98                              }
99                          } else {
100                             gssLibs = new String[]{ defaultLib };
101                         }
102                         for (String libName: gssLibs) {
103                             if (GSSLibStub.init(libName)) {
104                                 debug("Loaded GSS library: " + libName);
105                                 Oid[] mechs = GSSLibStub.indicateMechs();
106                                 HashMap<String, String> map =
107                                             new HashMap<String, String>();
108                                 for (int i = 0; i < mechs.length; i++) {
109                                     debug("Native MF for " + mechs[i]);
110                                     map.put("GssApiMechanism." + mechs[i],
111                                             MF_CLASS);
112                                 }
113                                 return map;
114                             }
115                         }
116                         return null;
117                     }
118                 });
119     }
120 
121     public SunNativeProvider() {
122         /* We are the Sun NativeGSS provider */
123         super(NAME, 1.8d, INFO);
124 
125         if (MECH_MAP != null) {
126             AccessController.doPrivileged(new PutAllAction(this, MECH_MAP));
127         }
128     }
129 }