2017-10-19 15:46:38 +02:00
|
|
|
package zall.manager;
|
|
|
|
|
|
|
|
|
|
import zall.bean.Folder;
|
|
|
|
|
import zall.bean.Media;
|
|
|
|
|
import zall.bean.User;
|
2018-07-27 15:29:00 +02:00
|
|
|
import zall.util.ServletUtil;
|
2017-11-13 16:34:13 +01:00
|
|
|
import zutil.Hasher;
|
|
|
|
|
import zutil.db.DBConnection;
|
|
|
|
|
import zutil.log.LogUtil;
|
|
|
|
|
|
|
|
|
|
import javax.servlet.http.HttpServletRequest;
|
2018-07-24 16:23:53 +02:00
|
|
|
import javax.servlet.http.HttpSession;
|
2017-11-13 16:34:13 +01:00
|
|
|
import java.sql.SQLException;
|
2018-07-27 15:29:00 +02:00
|
|
|
import java.sql.Timestamp;
|
2017-11-13 16:34:13 +01:00
|
|
|
import java.util.logging.Logger;
|
2017-10-19 15:46:38 +02:00
|
|
|
|
2018-07-24 16:23:53 +02:00
|
|
|
|
2017-10-19 15:46:38 +02:00
|
|
|
/**
|
|
|
|
|
*
|
|
|
|
|
*/
|
|
|
|
|
public class AuthenticationManager {
|
2017-11-13 16:34:13 +01:00
|
|
|
private static final Logger logger = LogUtil.getLogger();
|
|
|
|
|
|
2018-07-27 15:29:00 +02:00
|
|
|
public static final String SESSION_KEY_USER = "zall_user";
|
|
|
|
|
public static final String SESSION_KEY_AUTH_HASH = "zall_ueser_session_hash";
|
|
|
|
|
public static final long SESSION_TIMEOUT = 1000*60*60*24*3; // 3day
|
|
|
|
|
|
|
|
|
|
|
2017-11-13 16:34:13 +01:00
|
|
|
/**
|
|
|
|
|
* Authenticate a username and password and return the associated Uaer object
|
|
|
|
|
*/
|
|
|
|
|
public static User authenticate(DBConnection db, String email, String password) throws SQLException {
|
|
|
|
|
User user = User.load(db, email);
|
|
|
|
|
|
|
|
|
|
// Valid email?
|
|
|
|
|
if( user != null ){
|
|
|
|
|
if (user.getPassword().equals(Hasher.MD5(password))) {
|
2018-07-27 15:29:00 +02:00
|
|
|
userAuthenticated(db, user, User.AuthType.USER_INPUT);
|
|
|
|
|
return user;
|
2017-11-13 16:34:13 +01:00
|
|
|
}
|
|
|
|
|
}
|
2018-07-27 15:29:00 +02:00
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Uses a cookie to authenticate a user,
|
|
|
|
|
*
|
|
|
|
|
* @return a user object or null authentications fails
|
|
|
|
|
*/
|
|
|
|
|
public static User authenticate(DBConnection db, HttpServletRequest request) throws SQLException{
|
|
|
|
|
String sessionHash = ServletUtil.getCookieValue(request.getCookies(), SESSION_KEY_AUTH_HASH);
|
|
|
|
|
User user = User.loadBySessionHash(db, sessionHash);
|
|
|
|
|
|
|
|
|
|
if( user != null &&
|
|
|
|
|
user.getIpHost().equals(request.getRemoteAddr()) &&
|
|
|
|
|
user.getLoginDate().getTime() + SESSION_TIMEOUT > System.currentTimeMillis()){
|
|
|
|
|
userAuthenticated(db, user, User.AuthType.COOKIE);
|
|
|
|
|
return user;
|
|
|
|
|
}
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private static void userAuthenticated(DBConnection db, User user, User.AuthType authType) throws SQLException {
|
|
|
|
|
user.setLoginDate(new Timestamp(System.currentTimeMillis()));
|
|
|
|
|
user.setAuthBy(authType);
|
|
|
|
|
user.save(db);
|
|
|
|
|
logger.info("User(" + user.getName() + ") authenticated by " + user.getAuthBy());
|
2017-11-13 16:34:13 +01:00
|
|
|
}
|
|
|
|
|
|
2018-07-24 16:23:53 +02:00
|
|
|
/**
|
|
|
|
|
* @return the User associated with the provided session.
|
|
|
|
|
*/
|
|
|
|
|
public static User getUserSession(HttpSession session) {
|
|
|
|
|
return (User) session.getAttribute(SESSION_KEY_USER);
|
|
|
|
|
}
|
|
|
|
|
public static void setUserSession(User user, HttpSession session) {
|
|
|
|
|
session.setAttribute(SESSION_KEY_USER, user);
|
|
|
|
|
}
|
|
|
|
|
public static void rmUserSession(HttpSession session) {
|
|
|
|
|
session.removeAttribute(SESSION_KEY_USER);
|
|
|
|
|
}
|
|
|
|
|
|
2017-11-13 16:34:13 +01:00
|
|
|
/**
|
2018-07-25 15:36:57 +02:00
|
|
|
* @return true if the user has a isValid authentication session
|
2017-11-13 16:34:13 +01:00
|
|
|
*/
|
2018-07-25 15:36:57 +02:00
|
|
|
public static boolean isValid(User user, HttpServletRequest request) {
|
2017-11-13 16:34:13 +01:00
|
|
|
if(user == null)
|
|
|
|
|
return false;
|
|
|
|
|
if(!user.isEnabled())
|
|
|
|
|
return false;
|
|
|
|
|
if(user.getSessionHash() == null || user.getSessionHash().isEmpty() )
|
|
|
|
|
return false;
|
|
|
|
|
|
2018-07-24 16:23:53 +02:00
|
|
|
switch(user.getAuthBy()){
|
2017-11-13 16:34:13 +01:00
|
|
|
case USER_INPUT:
|
|
|
|
|
if (!user.isEmailVerified()) return false;
|
|
|
|
|
case COOKIE:
|
2018-07-27 15:29:00 +02:00
|
|
|
String sessionHash = ServletUtil.getCookieValue(request.getCookies(), SESSION_KEY_AUTH_HASH);
|
|
|
|
|
return user.getSessionHash().equals(sessionHash) &&
|
2018-07-24 16:23:53 +02:00
|
|
|
user.getIpHost().equals(request.getRemoteAddr());
|
2017-11-13 16:34:13 +01:00
|
|
|
}
|
|
|
|
|
return false;
|
|
|
|
|
}
|
2017-10-19 15:46:38 +02:00
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @return true if the specified user can edit the media
|
|
|
|
|
*/
|
|
|
|
|
public static boolean canEdit(User user, Media target) {
|
|
|
|
|
return target != null && (user.isSuperUser() || target.getUser().equals(user));
|
|
|
|
|
}
|
|
|
|
|
/**
|
|
|
|
|
* @return true if the specified user can edit the media
|
|
|
|
|
*/
|
|
|
|
|
public static boolean canEdit(User user, Folder target) {
|
|
|
|
|
return target != null && (user.isSuperUser() || user.equals( target.getUser() ));
|
|
|
|
|
}
|
|
|
|
|
/**
|
|
|
|
|
* @return true if the specified user can edit the profile of the other user
|
|
|
|
|
*/
|
|
|
|
|
public static boolean canEdit(User user, User target){
|
|
|
|
|
return user.equals( target ) || user.isSuperUser();
|
|
|
|
|
}
|
2017-11-13 16:34:13 +01:00
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Reset the user authentication. In plain word: logout user.
|
|
|
|
|
*/
|
|
|
|
|
public static void reset(DBConnection db, User user) throws SQLException {
|
|
|
|
|
user.setSessionHash(null);
|
|
|
|
|
user.save(db);
|
|
|
|
|
}
|
2018-07-24 16:23:53 +02:00
|
|
|
|
2017-10-19 15:46:38 +02:00
|
|
|
}
|