diff options
author | Nils Schwabe | 2014-05-05 16:26:07 +0200 |
---|---|---|
committer | Nils Schwabe | 2014-05-05 16:26:07 +0200 |
commit | 0048997b91e3fb4502c8c754b1c9ddd9fc8c4700 (patch) | |
tree | bd0f68131a0994e3abf571a4257dbe8acc05cc71 /src/main/java/org/openslx/imagemaster/db/LdapUser.java | |
parent | Fix login format (diff) | |
download | masterserver-0048997b91e3fb4502c8c754b1c9ddd9fc8c4700.tar.gz masterserver-0048997b91e3fb4502c8c754b1c9ddd9fc8c4700.tar.xz masterserver-0048997b91e3fb4502c8c754b1c9ddd9fc8c4700.zip |
Add user auth when ldap server is down
Diffstat (limited to 'src/main/java/org/openslx/imagemaster/db/LdapUser.java')
-rw-r--r-- | src/main/java/org/openslx/imagemaster/db/LdapUser.java | 33 |
1 files changed, 29 insertions, 4 deletions
diff --git a/src/main/java/org/openslx/imagemaster/db/LdapUser.java b/src/main/java/org/openslx/imagemaster/db/LdapUser.java index f9554c0..ae6aae2 100644 --- a/src/main/java/org/openslx/imagemaster/db/LdapUser.java +++ b/src/main/java/org/openslx/imagemaster/db/LdapUser.java @@ -52,9 +52,10 @@ public class LdapUser extends User */ public static LdapUser forLogin( final String login, final String password ) throws AuthenticationException { - String username, organization, firstName, lastName, eMail, satelliteAddress; + String username, organization, firstName, lastName, eMail, satelliteAddress = ""; - if (login.split( "_" ).length != 2) + final String[] split = login.split( "_" ); + if (split.length != 2) throw new AuthenticationException(AuthenticationError.GENERIC_ERROR, "Login must be in form: prefix_username"); LdapConnection connection = null; @@ -117,6 +118,13 @@ public class LdapUser extends User // everything went fine return new LdapUser( 0, username, Sha512Crypt.Sha512_crypt( password, null, 0 ), organization, firstName, lastName, eMail, satelliteAddress ); } catch ( LdapException e) { + if ( e.getMessage().contains( "Cannot connect on the server" ) ) { + DbSatellite dbSatellite = DbSatellite.fromPrefix(split[0]); + if (dbSatellite == null) throw new AuthenticationException(AuthenticationError.INVALID_CREDENTIALS, "Credentials invalid."); + String lo = split[1] + "@" + dbSatellite.getOrganization(); + log.info( "LDAP server could not be reached. Trying to connect locally with: " + lo ); + return LdapUser.localLogin(lo, password); + } e.printStackTrace(); throw new AuthenticationException( AuthenticationError.GENERIC_ERROR, "Something went wrong." ); } catch ( CursorException e ) { @@ -137,10 +145,27 @@ public class LdapUser extends User connection.unBind(); connection.close(); } catch ( IOException | LdapException e ) { - e.printStackTrace(); - throw new AuthenticationException( AuthenticationError.GENERIC_ERROR, "Something went very wrong." ); + // was not connected so don't do anything... } } return null; } + + /** + * Login user locally if external Ldap server is not available + * @param username Must be in form "userid@organization" + * @param password The user's password + */ + private static LdapUser localLogin( String login, String password ) + { + DbUser user = DbUser.forLogin( login ); + if (user == null) return null; // no user found + + // check users password + if (!Sha512Crypt.verifyPassword( password, user.password )) return null; + + // return ldapuser if valid + return new LdapUser( user.userId, user.username, Sha512Crypt.Sha512_crypt( password, null, 0 ), user.organization, user.firstName, + user.lastName, user.eMail, user.satelliteAddress ); + } } |