1 package com.nilhcem.fakesmtp.server; 2 3 import org.subethamail.smtp.AuthenticationHandler; 4 5 /** 6 * Simulates an authentication handler to allow capturing emails that are set up with login authentication. 7 * 8 * @author jasonpenny 9 * @since 1.2 10 */ 11 /*package*/ final class SMTPAuthHandler implements AuthenticationHandler { 12 private static final String USER_IDENTITY = "User"; 13 private static final String PROMPT_USERNAME = "334 VXNlcm5hbWU6"; // VXNlcm5hbWU6 is base64 for "Username:" 14 private static final String PROMPT_PASSWORD = "334 UGFzc3dvcmQ6"; // UGFzc3dvcmQ6 is base64 for "Password:" 15 16 private int pass = 0; 17 18 /** 19 * Simulates an authentication process. 20 * <p> 21 * <ul> 22 * <li>first prompts for username;</li> 23 * <li>then, prompts for password;</li> 24 * <li>finally, returns {@code null} to finish the authentication process;</li> 25 * </ul> 26 * </p> 27 * 28 * @return <code>null</code> if the authentication process is finished, otherwise a string to hand back to the client. 29 * @param clientInput The client's input, eg "AUTH PLAIN dGVzdAB0ZXN0ADEyMzQ=" 30 */ 31 @Override 32 public String auth(String clientInput) { 33 String prompt; 34 35 if (++pass == 1) { 36 prompt = SMTPAuthHandler.PROMPT_USERNAME; 37 } else if (pass == 2) { 38 prompt = SMTPAuthHandler.PROMPT_PASSWORD; 39 } else { 40 pass = 0; 41 prompt = null; 42 } 43 return prompt; 44 } 45 46 /** 47 * If the authentication process was successful, this returns the identity 48 * of the user. The type defining the identity can vary depending on the 49 * authentication mechanism used, but typically this returns a String username. 50 * If authentication was not successful, the return value is undefined. 51 */ 52 @Override 53 public Object getIdentity() { 54 return SMTPAuthHandler.USER_IDENTITY; 55 } 56 }