summaryrefslogtreecommitdiffstats
path: root/src/main/java/org/openslx/imagemaster/session
diff options
context:
space:
mode:
authorSimon Rettberg2014-03-28 17:51:24 +0100
committerSimon Rettberg2014-03-28 17:51:24 +0100
commitfbbfee0a32ce83f5bfe36d78eddafed7226a041c (patch)
treef3d44e8b9e2bca678165cb3dd97ec1aa1380f244 /src/main/java/org/openslx/imagemaster/session
downloadmasterserver-fbbfee0a32ce83f5bfe36d78eddafed7226a041c.tar.gz
masterserver-fbbfee0a32ce83f5bfe36d78eddafed7226a041c.tar.xz
masterserver-fbbfee0a32ce83f5bfe36d78eddafed7226a041c.zip
Initial Commit
Diffstat (limited to 'src/main/java/org/openslx/imagemaster/session')
-rw-r--r--src/main/java/org/openslx/imagemaster/session/Authenticator.java31
-rw-r--r--src/main/java/org/openslx/imagemaster/session/Session.java58
-rw-r--r--src/main/java/org/openslx/imagemaster/session/SessionManager.java73
-rw-r--r--src/main/java/org/openslx/imagemaster/session/User.java48
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();
+ }
+
+}