diff src/main/java/edu/harvard/iq/dataverse/LoginPage.java @ 10:a50cf11e5178

Rewrite LGDataverse completely upgrading to dataverse4.0
author Zoe Hong <zhong@mpiwg-berlin.mpg.de>
date Tue, 08 Sep 2015 17:00:21 +0200
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/java/edu/harvard/iq/dataverse/LoginPage.java	Tue Sep 08 17:00:21 2015 +0200
@@ -0,0 +1,230 @@
+package edu.harvard.iq.dataverse;
+
+import static edu.harvard.iq.dataverse.util.JsfHelper.JH;
+
+import java.io.UnsupportedEncodingException;
+import java.net.URLDecoder;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import javax.ejb.EJB;
+import javax.faces.application.FacesMessage;
+import javax.faces.event.AjaxBehaviorEvent;
+import javax.faces.view.ViewScoped;
+import javax.inject.Inject;
+import javax.inject.Named;
+
+import edu.harvard.iq.dataverse.authorization.AuthenticationProvider;
+import edu.harvard.iq.dataverse.authorization.AuthenticationProviderDisplayInfo;
+import edu.harvard.iq.dataverse.authorization.AuthenticationRequest;
+import edu.harvard.iq.dataverse.authorization.AuthenticationResponse;
+import edu.harvard.iq.dataverse.authorization.AuthenticationServiceBean;
+import edu.harvard.iq.dataverse.authorization.CredentialsAuthenticationProvider;
+import edu.harvard.iq.dataverse.authorization.exceptions.AuthenticationFailedException;
+import edu.harvard.iq.dataverse.authorization.providers.builtin.BuiltinUserServiceBean;
+import edu.harvard.iq.dataverse.authorization.users.AuthenticatedUser;
+import edu.harvard.iq.dataverse.settings.SettingsServiceBean;
+import edu.harvard.iq.dataverse.util.JsfHelper;
+
+/**
+ *
+ * @author xyang
+ * @author Michael Bar-Sinai
+ */
+@ViewScoped
+@Named("LoginPage")
+public class LoginPage implements java.io.Serializable {
+    private static final Logger logger = Logger.getLogger(LoginPage.class.getName());
+    public static class FilledCredential {
+        CredentialsAuthenticationProvider.Credential credential;
+        String value;
+
+        public FilledCredential() {
+        }
+
+        public FilledCredential(CredentialsAuthenticationProvider.Credential credential, String value) {
+            this.credential = credential;
+            this.value = value;
+        }
+        
+        public CredentialsAuthenticationProvider.Credential getCredential() {
+            return credential;
+        }
+
+        public void setCredential(CredentialsAuthenticationProvider.Credential credential) {
+            this.credential = credential;
+        }
+
+        public String getValue() {
+            return value;
+        }
+
+        public void setValue(String value) {
+            this.value = value;
+        }
+        
+    }
+    
+    public enum EditMode {LOGIN, SUCCESS, FAILED};
+    
+    @Inject DataverseSession session;    
+    
+    @EJB
+    DataverseServiceBean dataverseService;
+    
+    @EJB
+    BuiltinUserServiceBean dataverseUserService;
+    
+    @EJB
+    UserServiceBean userService;
+    
+    @EJB
+    AuthenticationServiceBean authSvc;
+
+    @EJB
+    SettingsServiceBean settingsService;
+    
+    private String credentialsAuthProviderId;
+    
+    private List<FilledCredential> filledCredentials;
+    
+    private String redirectPage = "dataverse.xhtml";
+    
+    public void init() {
+        Iterator<String> credentialsIterator = authSvc.getAuthenticationProviderIdsOfType( CredentialsAuthenticationProvider.class ).iterator();
+        if ( credentialsIterator.hasNext() ) {
+            setCredentialsAuthProviderId(credentialsIterator.next());
+        }
+        resetFilledCredentials(null);
+    }
+    
+    public boolean isAuthenticationProvidersAvailable() {
+        return ! authSvc.getAuthenticationProviderIds().isEmpty();
+    }
+    
+    public List<AuthenticationProviderDisplayInfo> listCredentialsAuthenticationProviders() {
+        List<AuthenticationProviderDisplayInfo> infos = new LinkedList<>();
+        for ( String id : authSvc.getAuthenticationProviderIdsOfType( CredentialsAuthenticationProvider.class ) ) {
+            AuthenticationProvider authenticationProvider = authSvc.getAuthenticationProvider(id);
+            infos.add( authenticationProvider.getInfo());
+        }
+        return infos;
+    }
+    
+    public List<AuthenticationProviderDisplayInfo> listAuthenticationProviders() {
+        List<AuthenticationProviderDisplayInfo> infos = new LinkedList<>();
+        for ( String id : authSvc.getAuthenticationProviderIds() ) {
+            AuthenticationProvider authenticationProvider = authSvc.getAuthenticationProvider(id);
+            infos.add( authenticationProvider.getInfo());
+        }
+        return infos;
+    }
+   
+    public CredentialsAuthenticationProvider selectedCredentialsProvider() {
+        return (CredentialsAuthenticationProvider) authSvc.getAuthenticationProvider(getCredentialsAuthProviderId());
+    }
+    
+    public boolean validatePassword(String username, String password) {
+        return false;
+    }
+
+    public String login() {
+        
+        AuthenticationRequest authReq = new AuthenticationRequest();
+        List<FilledCredential> filledCredentialsList = getFilledCredentials();
+        if ( filledCredentialsList == null ) {
+            logger.info("Credential list is null!");
+            return null;
+        }
+        
+        logger.info("Credential list:" + filledCredentialsList);
+        
+        for ( FilledCredential fc : filledCredentialsList ) {
+            if(fc.getValue()==null || fc.getValue().isEmpty()){
+                JH.addMessage(FacesMessage.SEVERITY_ERROR, "Please enter a "+fc.getCredential().getTitle());
+            }
+            authReq.putCredential(fc.getCredential().getTitle(), fc.getValue());
+        }
+        authReq.setIpAddress( session.getUser().getRequestMetadata().getIpAddress() );
+        try {
+            AuthenticatedUser r = authSvc.authenticate(credentialsAuthProviderId, authReq);
+            logger.log(Level.FINE, "User authenticated: {0}", r.getEmail());
+            session.setUser(r);
+            
+            if ("dataverse.xhtml".equals(redirectPage)) {
+                redirectPage = redirectPage + "&alias=" + dataverseService.findRootDataverse().getAlias();
+            }
+            
+            try {            
+                redirectPage = URLDecoder.decode(redirectPage, "UTF-8");
+            } catch (UnsupportedEncodingException ex) {
+                Logger.getLogger(LoginPage.class.getName()).log(Level.SEVERE, null, ex);
+                redirectPage = "dataverse.xhtml&alias=" + dataverseService.findRootDataverse().getAlias();
+            }
+
+            logger.log(Level.FINE, "Sending user to = {0}", redirectPage);
+
+            return redirectPage + (!redirectPage.contains("?") ? "?" : "&") + "faces-redirect=true";
+
+            
+        } catch (AuthenticationFailedException ex) {
+            AuthenticationResponse response = ex.getResponse();
+            switch ( response.getStatus() ) {
+                case FAIL:
+                    JsfHelper.addErrorMessage(JH.localize("login.invaliduserpassword"));
+                    return null;
+                case ERROR:
+                    JsfHelper.addErrorMessage(JH.localize("login.error"));
+                    logger.log( Level.WARNING, "Error logging in: " + response.getMessage(), response.getError() );
+                    return null;
+                case BREAKOUT:
+                    return response.getMessage();
+                default:
+                    JsfHelper.addErrorMessage("INTERNAL ERROR");
+                    return null;
+            }
+        }
+        
+    }
+
+    public String getCredentialsAuthProviderId() {
+        return credentialsAuthProviderId;
+    }
+    
+    public void resetFilledCredentials( AjaxBehaviorEvent event) {
+        if ( selectedCredentialsProvider()==null ) return;
+        
+        filledCredentials = new LinkedList<>();
+        for ( CredentialsAuthenticationProvider.Credential c : selectedCredentialsProvider().getRequiredCredentials() ) {
+            filledCredentials.add( new FilledCredential(c, ""));
+        }
+    }
+    
+    public void setCredentialsAuthProviderId(String authProviderId) {
+        this.credentialsAuthProviderId = authProviderId;
+    }
+
+    public List<FilledCredential> getFilledCredentials() {
+        return filledCredentials;
+    }
+
+    public void setFilledCredentials(List<FilledCredential> filledCredentials) {
+        this.filledCredentials = filledCredentials;
+    }
+
+    public boolean isMultipleProvidersAvailable() {
+        return authSvc.getAuthenticationProviderIds().size()>1;
+    }
+
+    public String getRedirectPage() {
+        return redirectPage;
+    }
+
+    public void setRedirectPage(String redirectPage) {
+        this.redirectPage = redirectPage;
+    }
+    
+}