Mercurial > dive4elements > river
diff flys-client/src/main/java/org/dive4elements/river/client/server/auth/plain/Authenticator.java @ 5834:f507086aa94b
Repaired internal references.
author | Sascha L. Teichmann <teichmann@intevation.de> |
---|---|
date | Thu, 25 Apr 2013 12:31:32 +0200 |
parents | flys-client/src/main/java/de/intevation/flys/client/server/auth/plain/Authenticator.java@2e12518ff5b4 |
children | 821a02bbfb4e |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/flys-client/src/main/java/org/dive4elements/river/client/server/auth/plain/Authenticator.java Thu Apr 25 12:31:32 2013 +0200 @@ -0,0 +1,134 @@ +package de.intevation.flys.client.server.auth.plain; + +import de.intevation.flys.client.server.auth.AuthenticationException; +import de.intevation.flys.client.server.auth.DefaultUser; +import de.intevation.flys.client.server.auth.User; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileReader; +import java.io.IOException; + +import java.util.ArrayList; +import java.util.List; + +import org.apache.log4j.Logger; + +import de.intevation.flys.client.server.features.Features; + +/** + * Authenticator that uses a local file as user backend. + */ +public class Authenticator +implements de.intevation.flys.client.server.auth.Authenticator +{ + private static final Logger log = + Logger.getLogger(Authenticator.class); + + public static class Authentication + implements de.intevation.flys.client.server.auth.Authentication + { + protected String user; + protected String password; + protected List<String> roles; + protected Features features; + + public Authentication( + String user, + String password, + List<String> roles, + Features features + ) { + this.user = user; + this.password = password; + this.roles = roles; + this.features = features; + } + + @Override + public boolean isSuccess() { + return user != null; + } + + @Override + public User getUser() { + return isSuccess() + ? new DefaultUser(user, password, false, roles, this.features.getFeatures(roles)) + : null; + } + } // class Authentication + + public Authenticator() { + } + + private static File credentialsFile() { + String env = System.getenv("FLYS_USER_FILE"); + if (env == null) { + env = System.getProperty( + "flys.user.file", + System.getProperty("user.home", ".") + + System.getProperty("file.separator") + + "flys_user_file"); + } + log.debug("Using credentials file " + env); + return new File(env); + + } + + @Override + public de.intevation.flys.client.server.auth.Authentication auth( + String username, + String password, + String encoding, + Features features + ) + throws AuthenticationException, IOException + { + File file = credentialsFile(); + if (!file.canRead() || !file.isFile()) { + log.error("cannot find user file '" + file + "'"); + return new Authentication(null, null, new ArrayList<String>(0), features); + } + + BufferedReader reader = + new BufferedReader( + new FileReader(file)); + try { + String line; + while ((line = reader.readLine()) != null) { + if ((line = line.trim()).length() == 0 + || line.startsWith("#")) { + continue; + } + + String[] parts = line.split("\\s+"); + if (parts.length < 2) { + continue; + } + + if (parts[0].equals(username)) { + log.debug("user '" + username + "' found."); + if (parts[1].equals(password)) { + List<String> roles = + new ArrayList<String>(parts.length - 2); + + for (int i = 2; i < parts.length; i++) { + roles.add(parts[i]); + } + + log.debug("success"); + return new Authentication(username, password, roles, features); + } + // Stop: user found, wrong password + break; + } + } + } + finally { + reader.close(); + } + log.debug("failed"); + return null; + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :