| 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 */  | 
 | 
 | 
 | 
package sun.security.jgss;  | 
 | 
 | 
 | 
import org.ietf.jgss.*;  | 
 | 
import sun.security.jgss.spi.*;  | 
 | 
import java.security.Provider;  | 
 | 
import java.security.AccessController;  | 
 | 
import java.security.PrivilegedAction;  | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 */  | 
 | 
public class GSSManagerImpl extends GSSManager { | 
 | 
 | 
 | 
      | 
 | 
    private static final String USE_NATIVE_PROP =  | 
 | 
        "sun.security.jgss.native";  | 
 | 
    private static final Boolean USE_NATIVE;  | 
 | 
 | 
 | 
    static { | 
 | 
        USE_NATIVE =  | 
 | 
            AccessController.doPrivileged(new PrivilegedAction<Boolean>() { | 
 | 
                    public Boolean run() { | 
 | 
                            String osname = System.getProperty("os.name"); | 
 | 
                            if (osname.startsWith("SunOS") || | 
 | 
                                osname.contains("OS X") || | 
 | 
                                osname.startsWith("Linux")) { | 
 | 
                                return new Boolean(System.getProperty  | 
 | 
                                    (USE_NATIVE_PROP));  | 
 | 
                            }  | 
 | 
                            return Boolean.FALSE;  | 
 | 
                    }  | 
 | 
            });  | 
 | 
 | 
 | 
    }  | 
 | 
 | 
 | 
    private ProviderList list;  | 
 | 
 | 
 | 
      | 
 | 
    public GSSManagerImpl(GSSCaller caller, boolean useNative) { | 
 | 
        list = new ProviderList(caller, useNative);  | 
 | 
    }  | 
 | 
 | 
 | 
      | 
 | 
    public GSSManagerImpl(GSSCaller caller) { | 
 | 
        list = new ProviderList(caller, USE_NATIVE);  | 
 | 
    }  | 
 | 
 | 
 | 
    public GSSManagerImpl() { | 
 | 
        list = new ProviderList(GSSCaller.CALLER_UNKNOWN, USE_NATIVE);  | 
 | 
    }  | 
 | 
 | 
 | 
    public Oid[] getMechs(){ | 
 | 
        return list.getMechs();  | 
 | 
    }  | 
 | 
 | 
 | 
    public Oid[] getNamesForMech(Oid mech)  | 
 | 
        throws GSSException { | 
 | 
        MechanismFactory factory = list.getMechFactory(mech);  | 
 | 
        return factory.getNameTypes().clone();  | 
 | 
    }  | 
 | 
 | 
 | 
    public Oid[] getMechsForName(Oid nameType){ | 
 | 
        Oid[] mechs = list.getMechs();  | 
 | 
        Oid[] retVal = new Oid[mechs.length];  | 
 | 
        int pos = 0;  | 
 | 
 | 
 | 
          | 
 | 
        if (nameType.equals(GSSNameImpl.oldHostbasedServiceName)) { | 
 | 
            nameType = GSSName.NT_HOSTBASED_SERVICE;  | 
 | 
        }  | 
 | 
 | 
 | 
          | 
 | 
        for (int i = 0; i < mechs.length; i++) { | 
 | 
              | 
 | 
            Oid mech = mechs[i];  | 
 | 
            try { | 
 | 
                Oid[] namesForMech = getNamesForMech(mech);  | 
 | 
                  | 
 | 
                if (nameType.containedIn(namesForMech)) { | 
 | 
                    retVal[pos++] = mech;  | 
 | 
                }  | 
 | 
            } catch (GSSException e) { | 
 | 
                  | 
 | 
                GSSUtil.debug("Skip " + mech + | 
 | 
                              ": error retrieving supported name types");  | 
 | 
            }  | 
 | 
        }  | 
 | 
 | 
 | 
          | 
 | 
        if (pos < retVal.length) { | 
 | 
            Oid[] temp = new Oid[pos];  | 
 | 
            for (int i = 0; i < pos; i++)  | 
 | 
                temp[i] = retVal[i];  | 
 | 
            retVal = temp;  | 
 | 
        }  | 
 | 
 | 
 | 
        return retVal;  | 
 | 
    }  | 
 | 
 | 
 | 
    public GSSName createName(String nameStr, Oid nameType)  | 
 | 
        throws GSSException { | 
 | 
        return new GSSNameImpl(this, nameStr, nameType);  | 
 | 
    }  | 
 | 
 | 
 | 
    public GSSName createName(byte name[], Oid nameType)  | 
 | 
        throws GSSException { | 
 | 
        return new GSSNameImpl(this, name, nameType);  | 
 | 
    }  | 
 | 
 | 
 | 
    public GSSName createName(String nameStr, Oid nameType,  | 
 | 
                              Oid mech) throws GSSException { | 
 | 
        return new GSSNameImpl(this, nameStr, nameType, mech);  | 
 | 
    }  | 
 | 
 | 
 | 
    public GSSName createName(byte name[], Oid nameType, Oid mech)  | 
 | 
        throws GSSException { | 
 | 
        return new GSSNameImpl(this, name, nameType, mech);  | 
 | 
    }  | 
 | 
 | 
 | 
    public GSSCredential createCredential(int usage)  | 
 | 
        throws GSSException { | 
 | 
        return new GSSCredentialImpl(this, usage);  | 
 | 
    }  | 
 | 
 | 
 | 
    public GSSCredential createCredential(GSSName aName,  | 
 | 
                                          int lifetime, Oid mech, int usage)  | 
 | 
        throws GSSException { | 
 | 
        return new GSSCredentialImpl(this, aName, lifetime, mech, usage);  | 
 | 
    }  | 
 | 
 | 
 | 
    public GSSCredential createCredential(GSSName aName,  | 
 | 
                                          int lifetime, Oid mechs[], int usage)  | 
 | 
        throws GSSException { | 
 | 
        return new GSSCredentialImpl(this, aName, lifetime, mechs, usage);  | 
 | 
    }  | 
 | 
 | 
 | 
    public GSSContext createContext(GSSName peer, Oid mech,  | 
 | 
                                    GSSCredential myCred, int lifetime)  | 
 | 
        throws GSSException { | 
 | 
        return new GSSContextImpl(this, peer, mech, myCred, lifetime);  | 
 | 
    }  | 
 | 
 | 
 | 
    public GSSContext createContext(GSSCredential myCred)  | 
 | 
        throws GSSException { | 
 | 
        return new GSSContextImpl(this, myCred);  | 
 | 
    }  | 
 | 
 | 
 | 
    public GSSContext createContext(byte[] interProcessToken)  | 
 | 
        throws GSSException { | 
 | 
        return new GSSContextImpl(this, interProcessToken);  | 
 | 
    }  | 
 | 
 | 
 | 
    public void addProviderAtFront(Provider p, Oid mech)  | 
 | 
        throws GSSException { | 
 | 
        list.addProviderAtFront(p, mech);  | 
 | 
    }  | 
 | 
 | 
 | 
    public void addProviderAtEnd(Provider p, Oid mech)  | 
 | 
        throws GSSException { | 
 | 
        list.addProviderAtEnd(p, mech);  | 
 | 
    }  | 
 | 
 | 
 | 
    public GSSCredentialSpi getCredentialElement(GSSNameSpi name, int initLifetime,  | 
 | 
                                          int acceptLifetime, Oid mech, int usage)  | 
 | 
        throws GSSException { | 
 | 
        MechanismFactory factory = list.getMechFactory(mech);  | 
 | 
        return factory.getCredentialElement(name, initLifetime,  | 
 | 
                                            acceptLifetime, usage);  | 
 | 
    }  | 
 | 
 | 
 | 
      | 
 | 
    public GSSNameSpi getNameElement(String name, Oid nameType, Oid mech)  | 
 | 
        throws GSSException { | 
 | 
        // Just use the most preferred MF impl assuming GSSNameSpi  | 
 | 
          | 
 | 
        MechanismFactory factory = list.getMechFactory(mech);  | 
 | 
        return factory.getNameElement(name, nameType);  | 
 | 
    }  | 
 | 
 | 
 | 
      | 
 | 
    public GSSNameSpi getNameElement(byte[] name, Oid nameType, Oid mech)  | 
 | 
        throws GSSException { | 
 | 
        // Just use the most preferred MF impl assuming GSSNameSpi  | 
 | 
          | 
 | 
        MechanismFactory factory = list.getMechFactory(mech);  | 
 | 
        return factory.getNameElement(name, nameType);  | 
 | 
    }  | 
 | 
 | 
 | 
    GSSContextSpi getMechanismContext(GSSNameSpi peer,  | 
 | 
                                      GSSCredentialSpi myInitiatorCred,  | 
 | 
                                      int lifetime, Oid mech)  | 
 | 
        throws GSSException { | 
 | 
        Provider p = null;  | 
 | 
        if (myInitiatorCred != null) { | 
 | 
            p = myInitiatorCred.getProvider();  | 
 | 
        }  | 
 | 
        MechanismFactory factory = list.getMechFactory(mech, p);  | 
 | 
        return factory.getMechanismContext(peer, myInitiatorCred, lifetime);  | 
 | 
    }  | 
 | 
 | 
 | 
    GSSContextSpi getMechanismContext(GSSCredentialSpi myAcceptorCred,  | 
 | 
                                      Oid mech)  | 
 | 
        throws GSSException { | 
 | 
        Provider p = null;  | 
 | 
        if (myAcceptorCred != null) { | 
 | 
            p = myAcceptorCred.getProvider();  | 
 | 
        }  | 
 | 
        MechanismFactory factory = list.getMechFactory(mech, p);  | 
 | 
        return factory.getMechanismContext(myAcceptorCred);  | 
 | 
    }  | 
 | 
 | 
 | 
    GSSContextSpi getMechanismContext(byte[] exportedContext)  | 
 | 
        throws GSSException { | 
 | 
        if ((exportedContext == null) || (exportedContext.length == 0)) { | 
 | 
            throw new GSSException(GSSException.NO_CONTEXT);  | 
 | 
        }  | 
 | 
        GSSContextSpi result = null;  | 
 | 
 | 
 | 
        // Only allow context import with native provider since JGSS  | 
 | 
          | 
 | 
        Oid[] mechs = list.getMechs();  | 
 | 
        for (int i = 0; i < mechs.length; i++) { | 
 | 
            MechanismFactory factory = list.getMechFactory(mechs[i]);  | 
 | 
            if (factory.getProvider().getName().equals("SunNativeGSS")) { | 
 | 
                result = factory.getMechanismContext(exportedContext);  | 
 | 
                if (result != null) break;  | 
 | 
            }  | 
 | 
        }  | 
 | 
        if (result == null) { | 
 | 
            throw new GSSException(GSSException.UNAVAILABLE);  | 
 | 
        }  | 
 | 
        return result;  | 
 | 
    }  | 
 | 
}  |