package scrum.server.admin;
import ilarkesto.base.Crypt;
import ilarkesto.base.Str;
import ilarkesto.base.Utl;
import ilarkesto.core.logging.Log;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Set;
import java.util.UUID;
import scrum.server.ScrumWebApplication;
import scrum.server.project.Project;
public class User extends GUser {
private static final int HOURS_FOR_EMAIL_VERIFICATION = 72;
private static Log log = Log.get(User.class);
// --- dependencies ---
private static ScrumWebApplication webApplication;
public static void setWebApplication(ScrumWebApplication webApplication) {
User.webApplication = webApplication;
}
// --- ---
public String getLabel() {
if (isEmailSet()) return getName() + " (" + getEmail() + ")";
return getName();
}
public Set<Project> getProjects() {
return projectDao.getProjectsByParticipant(this);
}
private String password;
public void triggerEmailVerification() {
if (!isEmailSet()) {
log.info("User has no email. Skipping email verification:", this);
return;
}
String urlBase = webApplication.getBaseUrl();
StringBuilder sb = new StringBuilder();
sb.append("You have created a Kunagi account on ").append(urlBase).append("\n");
sb.append("\n");
sb.append("Please visit the following link, to confirm your email: ").append(urlBase)
.append("confirmEmail?user=").append(getId()).append("&email=").append(getEmail()).append("\n");
sb.append("\n");
sb.append("Please confirm your email within " + HOURS_FOR_EMAIL_VERIFICATION
+ " hours, otherwise your account will be deleted.\n");
webApplication.sendEmail(null, getEmail(), "Kunagi email verification: " + getEmail(), sb.toString());
}
public void triggerNewPasswordRequest() {
if (!isEmailSet()) {
log.info("User has no email. Skipping new password request:", this);
return;
}
String newPassword = Str.generatePassword(8);
StringBuilder sb = new StringBuilder();
sb.append("You requested a new password for your Kunagi account on ").append(webApplication.getBaseUrl())
.append("\n");
sb.append("\n");
sb.append("Email: ").append(getEmail()).append("\n");
sb.append("Password: ").append(newPassword).append("\n");
sb.append("\n");
sb.append("You sould change this password, since somebody else could read this email.");
webApplication.sendEmail(null, getEmail(), "Kunagi password", sb.toString());
setPassword(newPassword);
log.info("Password changed for", this);
}
public void triggerPasswordReset() {
String urlBase = webApplication.getBaseUrl();
String newPassword = Str.generatePassword(8);
setPassword(newPassword);
log.info("Password changed for", this);
StringBuilder sb = new StringBuilder();
sb.append("An admin created a new password for your Kunagi account on ").append(urlBase).append("\n");
sb.append("\n");
sb.append("Email: ").append(getEmail()).append("\n");
sb.append("Password: ").append(newPassword).append("\n");
sb.append("\n");
sb.append("You sould change this password, since somebody else could read this email.");
webApplication.sendEmail(null, getEmail(), "Kunagi password", sb.toString());
}
@Override
public String getRealName() {
return getName();
}
@Override
public boolean matchesPassword(String password) {
return Crypt.cryptWebPassword(password).equals(this.password);
}
@Override
public void setPassword(String value) {
this.password = Crypt.cryptWebPassword(value);
fireModified("password=xxx");
}
@Override
public String getAutoLoginString() {
return getLoginToken();
}
public void createLoginToken() {
setLoginToken(UUID.randomUUID().toString());
}
@Override
public void ensureIntegrity() {
super.ensureIntegrity();
if (!isColorSet()) setColor(getDefaultColor());
if (!isLoginTokenSet()) createLoginToken();
}
@Override
public boolean isVisibleFor(User user) {
return true;
}
@Override
public boolean isEditableBy(User user) {
return user == this || user.isAdmin();
}
@Override
public String toString() {
return getName();
}
public static String getDefaultColor() {
return Utl.randomElement(getDefaultColors());
}
public static List<String> getDefaultColors() {
List<String> colors = new ArrayList<String>();
colors.add("black");
colors.add("darkred");
colors.add("darkgreen");
colors.add("darkblue");
colors.add("darkorange");
colors.add("darkorchid");
colors.add("darkslateblue");
colors.add("darkgray");
colors.add("orange");
colors.add("green");
return colors;
}
public static List<String> getNames(Collection<User> users) {
List<String> names = new ArrayList<String>(users.size());
for (User user : users) {
names.add(user.getName());
}
return names;
}
public boolean isEmailVerificationOverdue() {
if (!isRegistrationDateAndTimeSet()) return false;
if (isEmailVerified()) return false;
return getRegistrationDateAndTime().getPeriodToNow().abs().toHours() > HOURS_FOR_EMAIL_VERIFICATION;
}
}