diff --git a/pom.xml b/pom.xml
index 5fd7fa3..3e28914 100644
--- a/pom.xml
+++ b/pom.xml
@@ -72,6 +72,11 @@
mandrillClient
1.1
+
+ org.mindrot
+ jbcrypt
+ 0.3m
+
org.mongodb.morphia
morphia
diff --git a/src/main/java/net/frozenorb/apiv3/models/User.java b/src/main/java/net/frozenorb/apiv3/models/User.java
index be8deca..8eea1a2 100644
--- a/src/main/java/net/frozenorb/apiv3/models/User.java
+++ b/src/main/java/net/frozenorb/apiv3/models/User.java
@@ -1,9 +1,11 @@
package net.frozenorb.apiv3.models;
import lombok.Getter;
+import lombok.Setter;
import net.frozenorb.apiv3.APIv3;
import net.frozenorb.apiv3.weirdStuff.ExcludeFromReplies;
import org.bson.Document;
+import org.mindrot.jbcrypt.BCrypt;
import org.mongodb.morphia.annotations.Entity;
import org.mongodb.morphia.annotations.Id;
@@ -16,9 +18,10 @@ public final class User {
@Getter private String lastName;
@Getter @ExcludeFromReplies private Map aliases;
@Getter @ExcludeFromReplies private String otpCode;
+ @Getter @ExcludeFromReplies @Setter private String emailToken;
+ @Getter @ExcludeFromReplies @Setter private Date emailTokenSet;
@Getter @ExcludeFromReplies private String password;
- @Getter @ExcludeFromReplies private String passwordSalt;
- @Getter private String email;
+ @Getter @Setter private String email;
@Getter private int phoneNumber;
@Getter private String lastSeenOn;
@Getter private Date lastSeenAt;
@@ -52,6 +55,10 @@ public final class User {
return APIv3.getDatastore().createQuery(User.class).field("lastName").equalIgnoreCase(name).get();
}
+ public static User byEmailToken(String name) {
+ return APIv3.getDatastore().createQuery(User.class).field("emailToken").equal(name).get();
+ }
+
public static List values() {
return APIv3.getDatastore().createQuery(User.class).asList();
}
@@ -64,7 +71,6 @@ public final class User {
this.aliases = new HashMap<>();
this.otpCode = null;
this.password = null;
- this.passwordSalt = null;
this.email = null;
this.phoneNumber = -1;
this.lastSeenOn = null;
@@ -101,8 +107,8 @@ public final class User {
return APIv3.getDatastore().createQuery(Punishment.class).field("target").equal(id).asList();
}
- public List getPunishments(Punishment.PunishmentType type) {
- return APIv3.getDatastore().createQuery(Punishment.class).field("target").equal(id).field("type").equal(type).asList();
+ public List getPunishments(Collection types) {
+ return APIv3.getDatastore().createQuery(Punishment.class).field("target").equal(id).field("type").in(types).asList();
}
public UserMetaEntry getMeta(ServerGroup group) {
@@ -120,4 +126,12 @@ public final class User {
}
}
+ public void setPassword(char[] unencrypted) {
+ this.password = BCrypt.hashpw(new String(unencrypted), BCrypt.gensalt());
+ }
+
+ public boolean checkPassword(char[] unencrypted) {
+ return BCrypt.checkpw(new String(unencrypted), password);
+ }
+
}
\ No newline at end of file
diff --git a/src/main/java/net/frozenorb/apiv3/routes/GETRoutes.java b/src/main/java/net/frozenorb/apiv3/routes/GETRoutes.java
index eb8bbc6..a157e89 100644
--- a/src/main/java/net/frozenorb/apiv3/routes/GETRoutes.java
+++ b/src/main/java/net/frozenorb/apiv3/routes/GETRoutes.java
@@ -19,6 +19,7 @@ public final class GETRoutes implements Route {
private Field pathField;
private Field targetField;
+ @SuppressWarnings("unchecked") // Casting List to List