diff options
| author | Simon Rettberg | 2014-03-28 17:51:24 +0100 |
|---|---|---|
| committer | Simon Rettberg | 2014-03-28 17:51:24 +0100 |
| commit | fbbfee0a32ce83f5bfe36d78eddafed7226a041c (patch) | |
| tree | f3d44e8b9e2bca678165cb3dd97ec1aa1380f244 /src/main/java/org/openslx/imagemaster/session | |
| download | masterserver-fbbfee0a32ce83f5bfe36d78eddafed7226a041c.tar.gz masterserver-fbbfee0a32ce83f5bfe36d78eddafed7226a041c.tar.xz masterserver-fbbfee0a32ce83f5bfe36d78eddafed7226a041c.zip | |
Initial Commit
Diffstat (limited to 'src/main/java/org/openslx/imagemaster/session')
4 files changed, 210 insertions, 0 deletions
diff --git a/src/main/java/org/openslx/imagemaster/session/Authenticator.java b/src/main/java/org/openslx/imagemaster/session/Authenticator.java new file mode 100644 index 0000000..f730c72 --- /dev/null +++ b/src/main/java/org/openslx/imagemaster/session/Authenticator.java @@ -0,0 +1,31 @@ +package org.openslx.imagemaster.session; + +import org.apache.log4j.Logger; +import org.openslx.imagemaster.db.DbUser; +import org.openslx.imagemaster.thrift.iface.AuthenticationError; +import org.openslx.imagemaster.thrift.iface.AuthenticationException; +import org.openslx.imagemaster.util.Sha512Crypt; + +public class Authenticator +{ + private static Logger log = Logger.getLogger( Authenticator.class ); + + /** + * Authenticate the user against whatever backend... currently MySQL only + * @param username + * @param password + * @return + * @throws AuthenticationException + */ + public static User authenticate( String username, String password ) throws AuthenticationException + { + DbUser user = DbUser.forLogin( username ); + if ( user == null || !Sha512Crypt.verifyPassword( password, user.password ) ) { + log.debug( "Login failed: " + username ); + throw new AuthenticationException( AuthenticationError.INVALID_CREDENTIALS, "Invalid username or password!" ); + } + log.debug( "Login successful: " + username ); + return user; + } + // +} diff --git a/src/main/java/org/openslx/imagemaster/session/Session.java b/src/main/java/org/openslx/imagemaster/session/Session.java new file mode 100644 index 0000000..8dc7f2b --- /dev/null +++ b/src/main/java/org/openslx/imagemaster/session/Session.java @@ -0,0 +1,58 @@ +package org.openslx.imagemaster.session; + +/** + * Simple representation of a user session. Contains user-related data and + * information on whether the session is still valid. + * + */ +public class Session +{ + private static final long TIMEOUT = 600L * 1000L; // TODO: config + + private long timeOut = 0; + private final User user; + + public Session(final User dbuser) + { + this.user = dbuser; + this.timeOut = System.currentTimeMillis() + TIMEOUT; + } + + public synchronized void refresh() + { + if ( timedOut() ) + return; // Don't allow refreshing timed out session + this.timeOut = System.currentTimeMillis() + TIMEOUT; + } + + public synchronized boolean timedOut() + { + return System.currentTimeMillis() > this.timeOut; + } + + public String getSatelliteAddress() + { + return user.satelliteAddress; + } + + public String getUserId() + { + return user.username + "@" + user.organization; + } + + public String getFirstName() + { + return user.firstName; + } + + public String getLastName() + { + return user.lastName; + } + + public String getEMail() + { + return user.eMail; + } + +} diff --git a/src/main/java/org/openslx/imagemaster/session/SessionManager.java b/src/main/java/org/openslx/imagemaster/session/SessionManager.java new file mode 100644 index 0000000..cc68d0b --- /dev/null +++ b/src/main/java/org/openslx/imagemaster/session/SessionManager.java @@ -0,0 +1,73 @@ +package org.openslx.imagemaster.session; + +import java.util.Iterator; +import java.util.LinkedHashMap; +import java.util.Map; +import java.util.UUID; + +import org.apache.log4j.Logger; +import org.openslx.imagemaster.thrift.iface.SessionData; +import org.openslx.imagemaster.util.Hash; + +/** + * Class for managing active user sessions. This class and all its function are + * (supposed to be) thread-safe. + */ +public class SessionManager +{ + private static Logger log = Logger.getLogger( SessionManager.class ); + + // Map of currently known sessions + private static final Map<String, Session> sessions = new LinkedHashMap<>(); + private static final Thread gcThread; + + public static SessionData addSession( Session session ) + { + final String authToken = Hash.md5( UUID.randomUUID().toString() ); + final String sessionId = Hash.sha256( UUID.randomUUID().toString() ); + + synchronized ( sessions ) { + sessions.put( authToken, session ); + } + return new SessionData( sessionId, authToken, session.getSatelliteAddress() ); + } + + public static Session getSession( String token ) + { + final Session session; + synchronized ( sessions ) { + session = sessions.get( token ); + } + if ( session == null || session.timedOut() ) { + return null; + } + return session; + } + + static { + gcThread = new Thread( new Runnable() { + @Override + public void run() + { + for ( ;; ) { + try { + Thread.sleep( 1800L * 1000L ); + } catch ( InterruptedException e ) { + } + synchronized ( sessions ) { + Iterator<Session> it = sessions.values().iterator(); + while ( it.hasNext() ) { + final Session s = it.next(); + if ( s.timedOut() ) { + log.debug( "Removing old session of " + s.getUserId() ); + it.remove(); + } + } + } + } + } + } ); + gcThread.start(); + } + +} diff --git a/src/main/java/org/openslx/imagemaster/session/User.java b/src/main/java/org/openslx/imagemaster/session/User.java new file mode 100644 index 0000000..52c8c78 --- /dev/null +++ b/src/main/java/org/openslx/imagemaster/session/User.java @@ -0,0 +1,48 @@ +package org.openslx.imagemaster.session; + +/** + * Represents a user. Should be extended and given an according static method to + * instantiate by loading data from some backend. + * + */ +public abstract class User +{ + + public final String username, organization; + public final String password; + public final String firstName, lastName; + public final String eMail; + public final String satelliteAddress; + + protected User(String username, String password, String organization, String firstName, String lastName, String eMail, + String satelliteAddress) + { + this.username = username; + this.organization = organization; + this.password = password; + this.firstName = firstName; + this.lastName = lastName; + this.eMail = eMail; + this.satelliteAddress = satelliteAddress; + } + + @Override + public String toString() + { + final StringBuilder sb = new StringBuilder( this.username ); + sb.append( "@" ); + sb.append( this.organization ); + sb.append( ": " ); + sb.append( this.firstName ); + sb.append( ' ' ); + sb.append( this.lastName ); + sb.append( ' ' ); + sb.append( this.eMail ); + if ( this.satelliteAddress != null ) { + sb.append( ' ' ); + sb.append( this.satelliteAddress ); + } + return sb.toString(); + } + +} |
