135 lines
4.2 KiB
Java
135 lines
4.2 KiB
Java
package de.srsoftware.widerhall.data;
|
|
|
|
import de.srsoftware.widerhall.Util;
|
|
import org.slf4j.Logger;
|
|
import org.slf4j.LoggerFactory;
|
|
|
|
import java.security.InvalidKeyException;
|
|
import java.sql.ResultSet;
|
|
import java.sql.SQLException;
|
|
import java.time.LocalDate;
|
|
import java.util.ArrayList;
|
|
import java.util.List;
|
|
import java.util.Map;
|
|
|
|
import static de.srsoftware.widerhall.data.Database.*;
|
|
import static de.srsoftware.widerhall.Constants.*;
|
|
|
|
public class User {
|
|
public static final String TABLE_NAME = "Users";
|
|
private static final Logger LOG = LoggerFactory.getLogger(User.class);
|
|
private String email, salt, hashedPass, name;
|
|
|
|
public User(String email, String name, String salt, String hashedPass) {
|
|
this.email = email;
|
|
this.name = name;
|
|
this.salt = salt;
|
|
this.hashedPass = hashedPass;
|
|
}
|
|
|
|
public static User create(String email, String name, String password) throws SQLException {
|
|
var salt = Util.sha256(email + name + LocalDate.now());
|
|
var hashedPass = Util.sha256(password+salt);
|
|
return new User(email,name,salt,hashedPass).save();
|
|
}
|
|
|
|
public static void createTable() throws SQLException {
|
|
var sql = new StringBuilder()
|
|
.append("CREATE TABLE ").append(TABLE_NAME)
|
|
.append(" (")
|
|
.append(EMAIL).append(" ").append(VARCHAR).append(" NOT NULL PRIMARY KEY, ")
|
|
.append(SALT).append(" ").append(VARCHAR).append(", ")
|
|
.append(HASHED_PASS).append(" ").append(VARCHAR).append(", ")
|
|
.append(NAME).append(" ").append(VARCHAR)
|
|
.append(");");
|
|
Database.open().query(sql.toString()).run();
|
|
}
|
|
|
|
public String email() {
|
|
return email;
|
|
}
|
|
|
|
|
|
public String hashedPassword() {
|
|
return hashedPass;
|
|
}
|
|
|
|
public boolean is(String test){
|
|
if (test == null) return false;
|
|
return test.equals(name) || test.equals(email);
|
|
}
|
|
|
|
public static List<User> list() {
|
|
var userList = new ArrayList<User>();
|
|
try {
|
|
var rs = Database.open().query("SELECT * FROM Users").exec();
|
|
while (rs.next()){
|
|
var email = rs.getString(EMAIL);
|
|
var name = rs.getString(NAME);
|
|
var salt = rs.getString(SALT);
|
|
var hashedPassword = rs.getString(HASHED_PASS);
|
|
userList.add(new User(email,name,salt,hashedPassword));
|
|
}
|
|
} catch (SQLException e) {
|
|
LOG.warn("Error loading user list!",e);
|
|
}
|
|
return userList;
|
|
}
|
|
|
|
public static User load(String email, String password) throws InvalidKeyException, SQLException {
|
|
ResultSet rs = Database.open()
|
|
.query("SELECT * FROM Users")
|
|
.where(EMAIL,email)
|
|
.exec();
|
|
|
|
try {
|
|
if (rs.next()) {
|
|
email = rs.getString(EMAIL);
|
|
var name = rs.getString(NAME);
|
|
var hashedPassword = rs.getString(HASHED_PASS);
|
|
var salt = rs.getString(SALT);
|
|
var loadedUser = new User(email, name, salt, hashedPassword);
|
|
if (loadedUser.matching(password)) return loadedUser;
|
|
} else if (noUsers()){
|
|
return User.create(email,"Admin",password);
|
|
}
|
|
} finally {
|
|
rs.close();
|
|
}
|
|
|
|
throw new InvalidKeyException();
|
|
}
|
|
|
|
|
|
private boolean matching(String password) {
|
|
return hashedPass.equals(Util.sha256(password+salt));
|
|
}
|
|
|
|
public String name() {
|
|
return name;
|
|
}
|
|
|
|
public static boolean noUsers() throws SQLException {
|
|
var rs = Database.open().query("SELECT count(*) FROM users").exec();
|
|
try {
|
|
if (rs.next()) {
|
|
return rs.getInt(1) < 1;
|
|
}
|
|
} finally {
|
|
rs.close();
|
|
}
|
|
return false;
|
|
}
|
|
|
|
public Map<String,String> safeMap(){
|
|
return Map.of(NAME,name,EMAIL,email,PASSWORD,hashedPassword() == null ? "no" : "yes");
|
|
}
|
|
|
|
private User save() throws SQLException {
|
|
Database.open().insertInto(TABLE_NAME)
|
|
.values(Map.of(EMAIL,email,NAME,name,SALT,salt,HASHED_PASS,hashedPass))
|
|
.run();
|
|
return this;
|
|
}
|
|
}
|