Guest User

Untitled

a guest
Dec 6th, 2017
139
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.92 KB | None | 0 0
  1. public void changePassword(String username, String password) {
  2. ModificationItem[] mods = new ModificationItem[1];
  3. String newQuotedPassword = """ + password + """;
  4. byte[] newUnicodePassword = newQuotedPassword.getBytes();
  5. try {
  6. newUnicodePassword = newQuotedPassword.getBytes("UTF-16LE");
  7. } catch (UnsupportedEncodingException e) {
  8. e.printStackTrace();
  9. }
  10. mods[0] = new ModificationItem(DirContext.REPLACE_ATTRIBUTE, new BasicAttribute("unicodePwd", newUnicodePassword));
  11. try {
  12.  
  13. ldapContext.modifyAttributes(username, mods);
  14. } catch (NamingException e) {
  15. System.out.println("Error changing password for '" + username + "': " + e.getMessage());
  16. e.printStackTrace();
  17. }
  18. }
  19.  
  20. package io.fouad.ldap;
  21.  
  22. import javax.naming.AuthenticationException;
  23. import javax.naming.Context;
  24. import javax.naming.NamingEnumeration;
  25. import javax.naming.NamingException;
  26. import javax.naming.directory.*;
  27. import java.io.UnsupportedEncodingException;
  28. import java.util.Hashtable;
  29.  
  30. public class Main
  31. {
  32. public static void main(String[] args)
  33. {
  34. final String LDAP_SERVERS = "ldap://AD_SERVER:636 ldap://AD_SERVER2:636"; // separated by single spaces
  35. final String LDAP_CONNECT_TIMEOUT_MS = "10000"; // 10 seconds
  36. final String LDAP_READ_TIMEOUT_MS = "10000"; // 10 seconds
  37. final String AUTHENTICATION_DOMAIN = "domain.com";
  38. final String USERNAME = "username";
  39. final String OLD_PASSWORD = "123";
  40. final String NEW_PASSWORD = "456";
  41. final String TARGET_BASE_DN = "dc=domain,dc=com";
  42.  
  43. Hashtable<String, String> ldapEnv = new Hashtable<>();
  44. ldapEnv.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
  45. ldapEnv.put(Context.PROVIDER_URL, LDAP_SERVERS);
  46. ldapEnv.put(Context.SECURITY_AUTHENTICATION, "simple");
  47. ldapEnv.put("java.naming.ldap.version", "3");
  48. ldapEnv.put(Context.SECURITY_PRINCIPAL, USERNAME + "@" + AUTHENTICATION_DOMAIN);
  49. ldapEnv.put(Context.SECURITY_CREDENTIALS, OLD_PASSWORD);
  50. ldapEnv.put(Context.SECURITY_PROTOCOL, "ssl");
  51. ldapEnv.put("java.naming.ldap.factory.socket", "io.fouad.ldap.MySSLSocketFactory");
  52. ldapEnv.put("com.sun.jndi.ldap.connect.timeout", LDAP_CONNECT_TIMEOUT_MS);
  53. ldapEnv.put("com.sun.jndi.ldap.read.timeout", LDAP_READ_TIMEOUT_MS);
  54. DirContext ldapContext = null;
  55.  
  56. try
  57. {
  58. ldapContext = new InitialDirContext(ldapEnv);
  59. }
  60. catch(AuthenticationException e)
  61. {
  62. System.out.println("Wrong username/password!");
  63. e.printStackTrace();
  64. }
  65. catch(NamingException e)
  66. {
  67. e.printStackTrace();
  68. }
  69.  
  70. if(ldapContext == null) return;
  71.  
  72.  
  73. SearchControls searchControls = new SearchControls();
  74. searchControls.setSearchScope(SearchControls.SUBTREE_SCOPE);
  75. NamingEnumeration objects = null;
  76. try
  77. {
  78. objects = ldapContext.search(TARGET_BASE_DN, String.format("(&(objectClass=user)(sAMAccountName=%s))", USERNAME), searchControls);
  79. }
  80. catch(NamingException e)
  81. {
  82. e.printStackTrace();
  83. }
  84.  
  85. if(objects == null) return;
  86.  
  87. try
  88. {
  89. if(objects.hasMore())
  90. {
  91. SearchResult entry = (SearchResult) objects.next();
  92. ModificationItem[] mods = new ModificationItem[2];
  93. mods[0] = new ModificationItem(DirContext.REMOVE_ATTRIBUTE, new BasicAttribute("unicodePwd", getPasswordByteArray(OLD_PASSWORD)));
  94. mods[1] = new ModificationItem(DirContext.ADD_ATTRIBUTE, new BasicAttribute("unicodePwd", getPasswordByteArray(NEW_PASSWORD)));
  95. ldapContext.modifyAttributes(entry.getName() + "," + TARGET_BASE_DN, mods);
  96.  
  97. System.out.println("Successfully changed the password!");
  98. }
  99. else
  100. {
  101. System.out.println("User (" + USERNAME + ") was not found!");
  102. }
  103. }
  104. catch(NamingException e)
  105. {
  106. e.printStackTrace();
  107. }
  108.  
  109. System.out.println("DONE!");
  110.  
  111. }
  112.  
  113. private static byte[] getPasswordByteArray(String password)
  114. {
  115. String quotedPassword = """ + password + """;
  116. try
  117. {
  118. return quotedPassword.getBytes("UTF-16LE");
  119. }
  120. catch(UnsupportedEncodingException e)
  121. {
  122. e.printStackTrace();
  123. return null;
  124. }
  125. }
  126. }
  127.  
  128. package io.fouad.ldap;
  129.  
  130. import javax.net.SocketFactory;
  131. import javax.net.ssl.SSLContext;
  132. import javax.net.ssl.SSLSocketFactory;
  133. import javax.net.ssl.TrustManager;
  134. import javax.net.ssl.X509TrustManager;
  135. import java.io.IOException;
  136. import java.net.InetAddress;
  137. import java.net.Socket;
  138. import java.security.SecureRandom;
  139. import java.security.cert.X509Certificate;
  140.  
  141. public class MySSLSocketFactory extends SSLSocketFactory
  142. {
  143. private SSLSocketFactory socketFactory;
  144.  
  145. public MySSLSocketFactory()
  146. {
  147. try
  148. {
  149. SSLContext ctx = SSLContext.getInstance("TLS");
  150. ctx.init(null, new TrustManager[] {new X509TrustManager()
  151. {
  152. @Override
  153. public void checkClientTrusted(X509Certificate[] x509Certificates, String s){}
  154.  
  155. @Override
  156. public void checkServerTrusted(X509Certificate[] x509Certificates, String s){}
  157.  
  158. @Override
  159. public X509Certificate[] getAcceptedIssuers()
  160. {
  161. return new X509Certificate[0];
  162. }
  163. }}, new SecureRandom());
  164.  
  165. socketFactory = ctx.getSocketFactory();
  166. }
  167. catch(Exception ex)
  168. {
  169. ex.printStackTrace(System.err);
  170. }
  171. }
  172.  
  173. public static SocketFactory getDefault()
  174. {
  175. return new MySSLSocketFactory();
  176. }
  177.  
  178. @Override
  179. public String[] getDefaultCipherSuites()
  180. {
  181. return socketFactory.getDefaultCipherSuites();
  182. }
  183.  
  184. @Override
  185. public String[] getSupportedCipherSuites()
  186. {
  187. return socketFactory.getSupportedCipherSuites();
  188. }
  189.  
  190. @Override
  191. public Socket createSocket(Socket socket, String string, int i, boolean bln) throws IOException
  192. {
  193. return socketFactory.createSocket(socket, string, i, bln);
  194. }
  195.  
  196. @Override
  197. public Socket createSocket(String string, int i) throws IOException
  198. {
  199. return socketFactory.createSocket(string, i);
  200. }
  201.  
  202. @Override
  203. public Socket createSocket(String string, int i, InetAddress ia, int i1) throws IOException
  204. {
  205. return socketFactory.createSocket(string, i, ia, i1);
  206. }
  207.  
  208. @Override
  209. public Socket createSocket(InetAddress ia, int i) throws IOException
  210. {
  211. return socketFactory.createSocket(ia, i);
  212. }
  213.  
  214. @Override
  215. public Socket createSocket(InetAddress ia, int i, InetAddress ia1, int i1) throws IOException
  216. {
  217. return socketFactory.createSocket(ia, i, ia1, i1);
  218. }
  219. }
Add Comment
Please, Sign In to add comment