package org.openslx.imagemaster.db;
import java.util.List;
import org.apache.log4j.Logger;
import org.openslx.imagemaster.session.User;
import org.openslx.imagemaster.thrift.iface.UserInfo;
import org.openslx.imagemaster.util.Sha512Crypt;
/**
* Represents a user that can login against the masterserver.
*/
public class DbUser extends User
{
private static Logger log = Logger.getLogger( DbUser.class );
public DbUser( int userId, String login, String password, String organizationId,
String firstName, String lastName, String eMail,
String satelliteAddress )
{
super( userId, login, password, organizationId, firstName, lastName, eMail,
satelliteAddress );
}
/**
* Query database for user with given login
*
* @param login
* (user@organizationSuffix)
* @return instance of DbUser for matching entry from DB, or null if not
* found
*/
public static DbUser forLogin( final String login )
{
return MySQL
.findUniqueOrNull(
DbUser.class,
"SELECT user.userid, user.login, user.password, user.organizationid, user.firstname, user.lastname, user.email, satellite.address FROM user"
+ " LEFT JOIN satellite USING (organizationid)"
+ " WHERE user.login = ? LIMIT 1",
login );
}
/**
* Query database for user with given userId
*
* @param userid
* @return instance of DbUser for matching entry from DB, or null if not
* found
*/
public static DbUser forLogin( final int userid )
{
return MySQL
.findUniqueOrNull(
DbUser.class,
"SELECT user.userid, user.login, user.password, user.organizationid, user.firstname, user.lastname, user.email, satellite.address FROM user"
+ " LEFT JOIN satellite USING (organizationid)"
+ " WHERE user.userid = ? LIMIT 1",
userid );
}
public static boolean exists( final String login )
{
return forLogin( login ) != null;
}
public static DbUser forLogin( String login, String password )
{
DbUser user = forLogin( login );
if ( user == null || !Sha512Crypt.verifyPassword( password, user.password ) )
return null;
return user;
}
public static boolean insertOrUpdate( User user )
{
log.debug( "Inserted user '" + user.login + "' into db." );
MySQL.update(
"INSERT INTO user (login, password, organizationid, firstname, lastname, email) VALUES (?, ?, ?, ?, ?, ?) ON DUPLICATE KEY UPDATE password=VALUES(password), organizationid=VALUES(organizationid), firstname=VALUES(firstname), lastname=VALUES(lastname), email=VALUES(email)",
user.login, user.password, user.organizationId, user.firstName, user.lastName, user.eMail );
return false;
}
public static boolean insertOrUpdate(UserInfo userInfo) {
log.debug( "Inserted user '" + userInfo.userId + "' into db." );
int ret = MySQL.update(
"INSERT INTO user (login, password, organizationid, firstname, lastname, email) VALUES (?, '', ?, ?, ?, ?) ON DUPLICATE KEY UPDATE organizationid=VALUES(organizationid), firstname=VALUES(firstname), lastname=VALUES(lastname), email=VALUES(email)",
userInfo.userId, userInfo.organizationId, userInfo.firstName, userInfo.lastName, userInfo.eMail );
return (ret != 0);
}
public static List<UserInfo> findUser( String organizationId, String searchTerm )
{
final String str = "%" + searchTerm + "%"; // TODO: Better handling, escape LIKE chars, or even make this use REGEXP
if ( organizationId == null )
return MySQL.findAll( UserInfo.class, "SELECT login, firstname, lastname, email, organizationid"
+ " FROM user"
+ " WHERE login LIKE ? OR firstname LIKE ? OR lastname LIKE ? OR email LIKE ?"
+ " LIMIT 100", str, str, str );
return MySQL.findAll( UserInfo.class, "SELECT login, firstname, lastname, email, organizationid"
+ " FROM user"
+ " WHERE organizationid = ? AND (login LIKE ? OR firstname LIKE ? OR lastname LIKE ? OR email LIKE ?)"
+ " LIMIT 100", organizationId, str, str, str );
}
}