📄 sasl.java
字号:
* a list of realms to choose from, and by using a {@link RealmCallback} if * the realm must be entered. * @return a possibly <code>null</code> {@link SaslClient} created using the * parameters supplied. If <code>null</code>, the method could not find a * {@link SaslClientFactory} that will produce one. * @throws SaslException if a {@link SaslClient} cannot be created because * of an error. */ public static SaslClient createSaslClient(String[] mechanisms, String authorizationID, String protocol, String serverName, Map props, CallbackHandler cbh) throws SaslException { if (mechanisms == null) { return null; } Provider[] providers = Security.getProviders(); if (providers == null || providers.length == 0) { return null; } SaslClient result = null; SaslClientFactory factory = null; String m, clazz = null, upper, alias; int j; Provider p; for (int i = 0; i < mechanisms.length; i++) { m = mechanisms[i]; if (m == null) continue; for (j = 0; j < providers.length; j++) { p = providers[j]; if (p != null) { // try the name as is clazz = p.getProperty(CLIENT_FACTORY_SVC + m); if (clazz == null) // try all uppercase { upper = m.toUpperCase(); clazz = p.getProperty(CLIENT_FACTORY_SVC + upper); if (clazz == null) // try if it's an alias { alias = p.getProperty(ALIAS + CLIENT_FACTORY_SVC + m); if (alias == null) // try all-uppercase alias name { alias = p.getProperty(ALIAS + CLIENT_FACTORY_SVC + upper); if (alias == null) // spit the dummy continue; } clazz = p.getProperty(CLIENT_FACTORY_SVC + alias); } } if (clazz == null) continue; else clazz = clazz.trim(); } try { result = null; factory = (SaslClientFactory) Class.forName(clazz).newInstance(); result = factory.createSaslClient(mechanisms, authorizationID, protocol, serverName, props, cbh); } catch (ClassCastException ignored) // ignore instantiation exceptions { } catch (ClassNotFoundException ignored) { } catch (InstantiationException ignored) { } catch (IllegalAccessException ignored) { } if (result != null) return result; } } return null; } /** * Gets an enumeration of known factories for producing a {@link SaslClient} * instance. This method uses the same sources for locating factories as * <code>createSaslClient()</code>. * * @return a non-null {@link Enumeration} of known factories for producing a * {@link SaslClient} instance. * @see #createSaslClient(String[],String,String,String,Map,CallbackHandler) */ public static Enumeration getSaslClientFactories() { Vector result = new Vector(); HashSet names = new HashSet(); Provider[] providers = Security.getProviders(); Iterator it; if (providers != null) { Provider p; String key; for (int i = 0; i < providers.length; i++) { p = providers[i]; for (it = p.keySet().iterator(); it.hasNext(); ) { key = (String) it.next(); // add key's binding (a) it is a class of a client factory, // and (b) the key does not include blanks if (key.startsWith(CLIENT_FACTORY_SVC) && key.indexOf(" ") == -1) { names.add(p.getProperty(key)); break; } } } } // we have the factory class names in names; instantiate and enumerate String c; for (it = names.iterator(); it.hasNext(); ) { c = (String) it.next(); try { SaslClientFactory f = (SaslClientFactory) Class.forName(c).newInstance(); if (f != null) result.add(f); } catch (ClassCastException ignored) { // ignore instantiation exceptions } catch (ClassNotFoundException ignored) { } catch (InstantiationException ignored) { } catch (IllegalAccessException ignored) { } } return result.elements(); } /** * Creates a {@link SaslServer} for the specified mechanism. * * <p>This method uses the JCA Security Provider Framework, described in the * "Java Cryptography Architecture API Specification & Reference", for * locating and selecting a SaslServer implementation.</p> * * <p>First, it obtains an ordered list of {@link SaslServerFactory} * instances from the registered security providers for the * <code>"SaslServerFactory"</code> service and the specified mechanism. It * then invokes <code>createSaslServer()</code> on each factory instance on * the list until one produces a non-null {@link SaslServer} instance. It * returns the non-null {@link SaslServer} instance, or <code>null</code> if * the search fails to produce a non-null {@link SaslServer} instance.</p> * * <p>A security provider for {@link SaslServerFactory} registers with the * JCA Security Provider Framework keys of the form:</p> * * <pre> * SaslServerFactory.mechanism_name * </pre> * * <p>and values that are class names of implementations of {@link * SaslServerFactory}.</p> * * <p>For example, a provider that contains a factory class, * <code>com.wiz.sasl.digest.ServerFactory</code>, that supports the * <code>"DIGEST-MD5"</code> mechanism would register the following entry * with the JCA:</p> * * <pre> * SaslServerFactory.DIGEST-MD5 com.wiz.sasl.digest.ServerFactory * </pre> * * <p>See the "Java Cryptography Architecture API Specification & * Reference" for information about how to install and configure security * service providers.</p> * * @param mechanism the non-null mechanism name. It must be an * IANA-registered name of a SASL mechanism. (e.g. "GSSAPI", "CRAM-MD5"). * @param protocol the non-null string name of the protocol for which the * authentication is being performed (e.g. "ldap"). * @param serverName the non-null fully qualified host name of the server. * @param props the possibly <code>null</code> set of properties used to * select the SASL mechanism and to configure the authentication exchange of * the selected mechanism. For example, if props contains the {@link * Sasl#POLICY_NOPLAINTEXT} property with the value <code>"true"</code>, then * the selected SASL mechanism must not be susceptible to simple plain * passive attacks. In addition to the standard properties declared in this * class, other, possibly mechanism-specific, properties can be included. * Properties not relevant to the selected mechanism are ignored. * @param cbh the possibly <code>null</code> callback handler to used by the * SASL mechanisms to get further information from the application/library to * complete the authentication. For example, a SASL mechanism might require * the authentication ID, password and realm from the caller. The * authentication ID is requested by using a * {@link javax.security.auth.callback.NameCallback}. The password is * requested by using a {@link javax.security.auth.callback.PasswordCallback}. * The realm is requested by using a {@link RealmChoiceCallback} if there is * a list of realms to choose from, and by using a {@link RealmCallback} if * the realm must be entered. * @return a possibly <code>null</code> {@link SaslServer} created using the * parameters supplied. If <code>null</code>, the method cannot find a * {@link SaslServerFactory} instance that will produce one. * @throws SaslException if a {@link SaslServer} instance cannot be created * because of an error. */ public static SaslServer createSaslServer(String mechanism, String protocol, String serverName, Map props, CallbackHandler cbh) throws SaslException { if (mechanism == null) return null; Provider[] providers = Security.getProviders(); if (providers == null || providers.length == 0) return null; SaslServer result = null; SaslServerFactory factory = null; String clazz = null, upper, alias = null; int j; Provider p; for (j = 0; j < providers.length; j++) { p = providers[j]; if (p != null) { // try the name as is clazz = p.getProperty(SERVER_FACTORY_SVC + mechanism); if (clazz == null) // try all uppercase { upper = mechanism.toUpperCase(); clazz = p.getProperty(SERVER_FACTORY_SVC + upper); if (clazz == null) // try if it's an alias { alias = p.getProperty(ALIAS + SERVER_FACTORY_SVC + mechanism); if (alias == null) // try all-uppercase alias name { alias = p.getProperty(ALIAS + SERVER_FACTORY_SVC + upper); if (alias == null) // spit the dummy continue; } } clazz = p.getProperty(SERVER_FACTORY_SVC + alias); } } if (clazz == null) continue; else clazz = clazz.trim(); try { result = null; factory = (SaslServerFactory) Class.forName(clazz).newInstance(); result = factory.createSaslServer(mechanism, protocol, serverName, props, cbh); } catch (ClassCastException ignored) // ignore instantiation exceptions { } catch (ClassNotFoundException ignored) { } catch (InstantiationException ignored) { } catch (IllegalAccessException ignored) { } if (result != null) return result; } return null; } /** * Gets an enumeration of known factories for producing a {@link SaslServer} * instance. This method uses the same sources for locating factories as * <code>createSaslServer()</code>. * * @return a non-null {@link Enumeration} of known factories for producing a * {@link SaslServer} instance. * @see #createSaslServer(String,String,String,Map,CallbackHandler) */ public static Enumeration getSaslServerFactories() { Vector result = new Vector(); HashSet names = new HashSet(); Provider[] providers = Security.getProviders(); Iterator it; if (providers != null) { Provider p; String key; for (int i = 0; i < providers.length; i++) { p = providers[i]; for (it = p.keySet().iterator(); it.hasNext(); ) { key = (String) it.next(); // add key's binding (a) it is a class of a server factory, // and (b) the key does not include blanks if (key.startsWith(SERVER_FACTORY_SVC) && key.indexOf(" ") == -1) { names.add(p.getProperty(key)); break; } } } } // we have the factory class names in names; instantiate and enumerate String c; for (it = names.iterator(); it.hasNext(); ) { c = (String) it.next(); try { SaslServerFactory f = (SaslServerFactory) Class.forName(c).newInstance(); if (f != null) result.add(f); } catch (ClassCastException ignored) // ignore instantiation exceptions { } catch (ClassNotFoundException ignored) { } catch (InstantiationException ignored) { } catch (IllegalAccessException ignored) { } } return result.elements(); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -