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
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); } } } }