package org.isatools.isacreator.gs; import org.apache.log4j.Logger; import org.genomespace.client.GsSession; import org.genomespace.client.User; import org.genomespace.client.UserManagerClient; import org.genomespace.client.exceptions.AuthorizationException; import org.genomespace.client.exceptions.InternalServerException; import org.genomespace.client.exceptions.ServerNotFoundException; import org.isatools.isacreator.api.Authentication; import org.isatools.isacreator.api.AuthenticationManager; import org.isatools.isacreator.api.CreateProfile; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.IOException; import java.util.Collection; import java.util.HashMap; import java.util.Map; /** * Created by the ISATeam. * User: agbeltran * Date: 26/09/2012 * Time: 14:41 * * Identity Manager for Genome Space * * @author <a href="mailto:alejandra.gonzalez.beltran@gmail.com">Alejandra Gonzalez-Beltran</a> */ public class GSIdentityManager implements Authentication { //maintaining a single session private GsSession session = null; //private String gsUser = null; private String gsToken = null; private String tokenSaveDir = ".gs"; private String tokenSaveFileName = ".gstoken"; private String usernameSaveFileName = ".gsusername"; private AuthenticationManager authenticationManager = new AuthenticationManager(); private static final Logger log = Logger.getLogger(GSIdentityManager.class); private static GSIdentityManager instance = null; public static GSIdentityManager getInstance(){ if (instance==null){ instance = new GSIdentityManager(); } return instance; } /** * Empty constructor */ public GSIdentityManager(){ try{ session = new GsSession(); }catch(InternalServerException e){ e.printStackTrace(); } } /** * * @param username * @param pass an array of characters with the user's password * @return */ public boolean login(String username, char[] pass) { if (username==null || pass==null) return false; try{ String password = new String(pass); User user = session.login(username, password); log.info("Logged into GenomeSpace as "+username); //local login boolean result = authenticationManager.login(username, pass); if (!result){ //create user CreateProfile.createProfile(username, pass, "", "", "", ""); } return true; }catch(AuthorizationException e){ return false; }catch(InternalServerException isex){ return false; }catch(ServerNotFoundException snfex){ return false; } } /** * * * @param username * @return */ public boolean logout(String username) { if (session==null) return false; session.logout(); return true; } /** * The GSIdentityManager does not support single sign on, thus it returns false * * @return */ public boolean login(String u){ String token = getGSToken(); if (token==null) return false; try{ GsSession gsSession = new GsSession(token); setSession(gsSession); String username = gsSession.getUserManagerClient().getTokenUsername(token); //local login boolean result = authenticationManager.login(username); if (!result){ //create user CreateProfile.createProfile(username, username.toCharArray(), "", "", "", ""); } return true; }catch(InternalServerException e){ e.printStackTrace(); log.debug(e.getMessage()); return false; } } /** * * * @return */ public boolean isLoggedIn() { if (session==null) return false; return session.isLoggedIn(); } /** * * @param username * @param password * @param emailAddress * @return */ public static String registerUser(String username, String password, String emailAddress) { try { GsSession session = new GsSession(); User newUser = session.registerUser(username, password, emailAddress); return ""; }catch(InternalServerException isex){ isex.printStackTrace(); return "Error registering user "+isex.getMessage(); } } /** * Gets user session. * * * @return */ //public GsSession getSession(String userName){ public GsSession getSession(){ //return userSessions.get(userName); return session; } public void setSession(GsSession gsSession){ if (gsSession.isLoggedIn()){ UserManagerClient userManagerClient = gsSession.getUserManagerClient(); try{ long time = userManagerClient.getRemainingTokenTime(); if (time!=0){ String username = gsSession.getCachedUsernameForSSO(); //Collection<String> users = userManagerClient.getAllUsernames(); //for(String username: users){ //userSessions.put(username, gsSession); session = gsSession; //} } }catch(InternalServerException e){ e.printStackTrace(); } catch(Exception e){ e.printStackTrace(); } } } public GSDataManager getGsDataManager(){ return new GSDataManager(session); } private String getGSToken() { if (gsToken == null) { File file = getTokenFile(); if (file!=null && file.exists()) { BufferedReader br = null; try { br = new BufferedReader(new FileReader(file)); gsToken = br.readLine(); } catch (IOException e) { log.error("Error reading GS cookie", e); } finally { if (br != null) try { br.close(); } catch (IOException e) { e.printStackTrace(); } } } } return gsToken; } private File getTokenFile() { File gsDir = getTokenSaveDir(); return (gsDir != null && gsDir.exists()) ? new File(gsDir, tokenSaveFileName) : null; } private File getTokenSaveDir() { String userDir = System.getProperty("user.home"); File gsDir = new File(userDir, tokenSaveDir); if (!gsDir.exists()) { gsDir.mkdir(); } return gsDir; } }