1314 lines · 47.9 KB · Java
RawDownload
            result = EncryptedData.ETYPE_NULL;        }         return result;    }     /**     * Resets the default kdc realm.     * We do not need to synchronize these methods since assignments are atomic     *     * This method was useless. Kept here in case some class still calls it.     */    public void resetDefaultRealm(String realm) {        if (DEBUG) {            System.out.println(">>> Config try resetting default kdc " + realm);        }    }     /**     * Check to use addresses in tickets     * use addresses if "no_addresses" or "noaddresses" is set to false     */    public boolean useAddresses() {        boolean useAddr = false;        // use addresses if "no_addresses" is set to false        String value = getDefault("no_addresses", "libdefaults");        useAddr = (value != null && value.equalsIgnoreCase("false"));        if (useAddr == false) {            // use addresses if "noaddresses" is set to false            value = getDefault("noaddresses", "libdefaults");            useAddr = (value != null && value.equalsIgnoreCase("false"));        }        return useAddr;    }     /**     * Check if need to use DNS to locate Kerberos services     */    public boolean useDNS(String name) {        String value = getDefault(name, "libdefaults");        if (value == null) {            value = getDefault("dns_fallback", "libdefaults");            if ("false".equalsIgnoreCase(value)) {                return false;            } else {                return true;            }        } else {            return value.equalsIgnoreCase("true");        }    }     /**     * Check if need to use DNS to locate the KDC     */    public boolean useDNS_KDC() {        return useDNS("dns_lookup_kdc");    }     /*     * Check if need to use DNS to locate the Realm     */    public boolean useDNS_Realm() {        return useDNS("dns_lookup_realm");    }     /**     * Gets default realm.     * @throws KrbException where no realm can be located     * @return the default realm, always non null     */    public String getDefaultRealm() throws KrbException {        if (defaultRealm != null) {            return defaultRealm;        }        Exception cause = null;        String realm = getDefault("default_realm", "libdefaults");        if ((realm == null) && useDNS_Realm()) {            // use DNS to locate Kerberos realm            try {                realm = getRealmFromDNS();            } catch (KrbException ke) {                cause = ke;            }        }        if (realm == null) {            realm = java.security.AccessController.doPrivileged(                    new java.security.PrivilegedAction<String>() {                @Override                public String run() {                    String osname = System.getProperty("os.name");                    if (osname.startsWith("Windows")) {                        return System.getenv("USERDNSDOMAIN");                    }                    return null;                }            });        }        if (realm == null) {            KrbException ke = new KrbException("Cannot locate default realm");            if (cause != null) {                ke.initCause(cause);            }            throw ke;        }        return realm;    }     /**     * Returns a list of KDC's with each KDC separated by a space     *     * @param realm the realm for which the KDC list is desired     * @throws KrbException if there's no way to find KDC for the realm     * @return the list of KDCs separated by a space, always non null     */    public String getKDCList(String realm) throws KrbException {        if (realm == null) {            realm = getDefaultRealm();        }        if (realm.equalsIgnoreCase(defaultRealm)) {            return defaultKDC;        }        Exception cause = null;        String kdcs = getDefault("kdc", realm);        if ((kdcs == null) && useDNS_KDC()) {            // use DNS to locate KDC            try {                kdcs = getKDCFromDNS(realm);            } catch (KrbException ke) {                cause = ke;            }        }        if (kdcs == null) {            kdcs = java.security.AccessController.doPrivileged(                    new java.security.PrivilegedAction<String>() {                @Override                public String run() {                    String osname = System.getProperty("os.name");                    if (osname.startsWith("Windows")) {                        String logonServer = System.getenv("LOGONSERVER");                        if (logonServer != null                                && logonServer.startsWith("\\\\")) {                            logonServer = logonServer.substring(2);                        }                        return logonServer;                    }                    return null;                }            });        }        if (kdcs == null) {            if (defaultKDC != null) {                return defaultKDC;            }            KrbException ke = new KrbException("Cannot locate KDC");            if (cause != null) {                ke.initCause(cause);            }            throw ke;        }        return kdcs;    }     /**     * Locate Kerberos realm using DNS     *     * @return the Kerberos realm     */    private String getRealmFromDNS() throws KrbException {        // use DNS to locate Kerberos realm        String realm = null;        String hostName = null;        try {            hostName = InetAddress.getLocalHost().getCanonicalHostName();        } catch (UnknownHostException e) {            KrbException ke = new KrbException(Krb5.KRB_ERR_GENERIC,                "Unable to locate Kerberos realm: " + e.getMessage());            ke.initCause(e);            throw (ke);        }        // get the domain realm mapping from the configuration        String mapRealm = PrincipalName.mapHostToRealm(hostName);        if (mapRealm == null) {            // No match. Try search and/or domain in /etc/resolv.conf            List<String> srchlist = ResolverConfiguration.open().searchlist();            for (String domain: srchlist) {                realm = checkRealm(domain);                if (realm != null) {                    break;                }            }        } else {            realm = checkRealm(mapRealm);        }        if (realm == null) {            throw new KrbException(Krb5.KRB_ERR_GENERIC,                                "Unable to locate Kerberos realm");        }        return realm;    }     /**     * Check if the provided realm is the correct realm     * @return the realm if correct, or null otherwise     */    private static String checkRealm(String mapRealm) {        if (DEBUG) {            System.out.println("getRealmFromDNS: trying " + mapRealm);        }        String[] records = null;        String newRealm = mapRealm;        while ((records == null) && (newRealm != null)) {            // locate DNS TXT record            records = KrbServiceLocator.getKerberosService(newRealm);            newRealm = Realm.parseRealmComponent(newRealm);            // if no DNS TXT records found, try again using sub-realm        }        if (records != null) {            for (int i = 0; i < records.length; i++) {                if (records[i].equalsIgnoreCase(mapRealm)) {                    return records[i];                }            }        }        return null;    }     /**     * Locate KDC using DNS     *     * @param realm the realm for which the master KDC is desired     * @return the KDC     */    private String getKDCFromDNS(String realm) throws KrbException {        // use DNS to locate KDC        String kdcs = null;        String[] srvs = null;        // locate DNS SRV record using UDP        if (DEBUG) {            System.out.println("getKDCFromDNS using UDP");        }        srvs = KrbServiceLocator.getKerberosService(realm, "_udp");        if (srvs == null) {            // locate DNS SRV record using TCP            if (DEBUG) {                System.out.println("getKDCFromDNS using UDP");            }            srvs = KrbServiceLocator.getKerberosService(realm, "_tcp");        }        if (srvs == null) {            // no DNS SRV records            throw new KrbException(Krb5.KRB_ERR_GENERIC,                "Unable to locate KDC for realm " + realm);        }        for (int i = 0; i < srvs.length; i++) {            String value = srvs[i];            for (int j = 0; j < srvs[i].length(); j++) {                // filter the KDC name                if (value.charAt(j) == ':') {                    kdcs = (value.substring(0, j)).trim();                }            }        }        return kdcs;    }     private boolean fileExists(String name) {        return java.security.AccessController.doPrivileged(                                new FileExistsAction(name));    }     static class FileExistsAction        implements java.security.PrivilegedAction<Boolean> {         private String fileName;         public FileExistsAction(String fileName) {            this.fileName = fileName;        }         public Boolean run() {            return new File(fileName).exists();        }    }     @Override    public String toString() {        StringBuffer sb = new StringBuffer();        toStringIndented("", stanzaTable, sb);        return sb.toString();    }    private static void toStringIndented(String prefix, Object obj,            StringBuffer sb) {        if (obj instanceof String) {            sb.append(prefix);            sb.append(obj);            sb.append('\n');        } else if (obj instanceof Hashtable) {            Hashtable tab = (Hashtable)obj;            for (Object o: tab.keySet()) {                sb.append(prefix);                sb.append(o);                sb.append(" = {\n");                toStringIndented(prefix + "    ", tab.get(o), sb);                sb.append(prefix + "}\n");            }        } else if (obj instanceof Vector) {            Vector v = (Vector)obj;            for (Object o: v.toArray()) {                toStringIndented(prefix + "    ", o, sb);            }        }    }}

Lines 1001–1314 of 1314. Previous lines