1 28 package net.sf.jguard.ext.authentication.loginmodules; 29 30 import java.io.IOException ; 31 import java.util.Map ; 32 import java.util.logging.Level ; 33 import java.util.logging.Logger ; 34 35 import javax.security.auth.Subject ; 36 import javax.security.auth.callback.Callback ; 37 import javax.security.auth.callback.CallbackHandler ; 38 import javax.security.auth.callback.UnsupportedCallbackException ; 39 import javax.security.auth.login.LoginException ; 40 import javax.security.auth.spi.LoginModule ; 41 42 import net.sf.jguard.ext.authentication.callbacks.JCaptchaCallback; 43 44 import com.octo.captcha.module.config.CaptchaModuleConfig; 45 import com.octo.captcha.service.CaptchaService; 46 import com.octo.captcha.service.CaptchaServiceException; 47 52 public class JCaptchaLoginModule implements LoginModule { 53 private static Logger logger = Logger.getLogger(JCaptchaLoginModule.class.getName()); 54 private static final String CAPTCHA_ANSWER_FIELD = "captchaAnswerField"; 55 private Class serviceClass; 56 private CaptchaService service; 57 private String captchaAnswerField; 58 private CallbackHandler callbackHandler; 59 private Subject subject; 60 private Map options; 61 private Map sharedState; 62 private boolean loginOK = true; 63 64 public void initialize(Subject subj,CallbackHandler cbkHandler,Map sState,Map opts){ 65 this.subject = subj; 66 this.callbackHandler = cbkHandler; 67 this.sharedState = sState; 68 this.options = opts; 69 captchaAnswerField = (String ) opts.get(JCaptchaLoginModule.CAPTCHA_ANSWER_FIELD); 70 if(captchaAnswerField==null ||captchaAnswerField.equals("")){ 71 captchaAnswerField="captchaAnswer"; 72 } 73 74 try { 75 serviceClass = Class.forName(CaptchaModuleConfig.getInstance().getServiceClass()); 76 } catch (ClassNotFoundException e) { 77 logger.severe(" JCaptcha service class cannot be found "); 78 } 79 } 80 81 public boolean login() throws LoginException { 82 String sessionID = "-1"; 83 String captchaAnswer = ""; 84 boolean skipJCaptchaChallenge = false; 85 86 if (callbackHandler == null){ 87 loginOK = false; 88 throw new JCaptchaLoginException("there is no CallbackHandler to validate the JCaptcha Answer"); 89 } 90 Callback [] callbacks = new Callback [1]; 91 callbacks[0] = new JCaptchaCallback(); 92 93 try { 94 callbackHandler.handle(callbacks); 95 JCaptchaCallback jcaptchaCallback = (JCaptchaCallback) callbacks[0]; 96 captchaAnswer = jcaptchaCallback.getCaptchaAnswer(); 97 skipJCaptchaChallenge = jcaptchaCallback.isSkipJCaptchaChallenge(); 98 sessionID = jcaptchaCallback.getSessionID(); 99 logger.log(Level.FINE,"session ID="+sessionID); 100 service = jcaptchaCallback.getCaptchaService(); 101 logger.log(Level.FINE,"service="+service); 102 103 if(skipJCaptchaChallenge==true){ 104 return false; 105 } 106 107 if(service == null){ 108 loginOK = false; 109 throw new JCaptchaLoginException(" JCaptcha service is null: it has not been properly initialized "); 110 } 111 } catch (IOException e) { 112 loginOK = false; 113 throw new JCaptchaLoginException(e.getMessage()); 114 } catch (UnsupportedCallbackException e) { 115 loginOK = false; 116 throw new JCaptchaLoginException(e.getMessage()); 117 } 118 Boolean valid = null; 119 try{ 120 valid = service.validateResponseForID(sessionID,captchaAnswer); 121 }catch(CaptchaServiceException e){ 122 logger.log(Level.WARNING,e.getMessage()); 123 loginOK = false; 124 throw new JCaptchaLoginException(" an error has occured in CAPTCHA validation "); 125 } 126 127 if(valid.booleanValue()==false){ 128 loginOK = false; 129 throw new JCaptchaLoginException(" invalid JCaptcha Answer "); 130 } 131 return true; 132 } 133 134 public boolean commit() throws LoginException { 135 if(loginOK){ 136 return true; 137 }else{ 138 return false; 139 } 140 } 141 142 public boolean abort() throws LoginException { 143 return true; 144 } 145 146 public boolean logout() throws LoginException { 147 return true; 148 } 149 150 } 151 | Popular Tags |