Grasscutter/src/main/java/emu/grasscutter/game/Account.java

187 lines
4.3 KiB
Java
Raw Normal View History

2022-04-17 12:43:07 +00:00
package emu.grasscutter.game;
import dev.morphia.annotations.*;
2022-05-07 04:00:55 +00:00
import emu.grasscutter.Grasscutter;
2022-04-17 12:43:07 +00:00
import emu.grasscutter.database.DatabaseHelper;
import emu.grasscutter.utils.Crypto;
import emu.grasscutter.utils.Utils;
2022-04-19 04:38:19 +00:00
import java.util.ArrayList;
2022-04-19 03:46:04 +00:00
import java.util.List;
import java.util.Locale;
2022-04-19 03:46:04 +00:00
import org.bson.Document;
import static emu.grasscutter.Configuration.*;
2022-04-21 01:11:57 +00:00
@Entity(value = "accounts", useDiscriminator = false)
2022-04-17 12:43:07 +00:00
public class Account {
@Id private String id;
@Indexed(options = @IndexOptions(unique = true))
@Collation(locale = "simple", caseLevel = true)
private String username;
private String password; // Unused for now
@AlsoLoad("playerUid") private int playerId;
2022-04-17 12:43:07 +00:00
private String email;
private String token;
private String sessionKey; // Session token for dispatch server
2022-04-19 03:46:04 +00:00
private List<String> permissions;
private Locale locale;
2022-04-17 12:43:07 +00:00
@Deprecated
2022-04-19 04:38:19 +00:00
public Account() {
this.permissions = new ArrayList<>();
this.locale = LANGUAGE;
2022-04-19 04:38:19 +00:00
}
2022-04-17 12:43:07 +00:00
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getToken() {
return token;
}
public void setToken(String token) {
this.token = token;
}
public int getPlayerUid() {
2022-04-17 12:43:07 +00:00
return this.playerId;
}
public void setPlayerId(int playerId) {
this.playerId = playerId;
}
public String getEmail() {
if(email != null && !email.isEmpty()) {
return email;
} else {
return "";
}
2022-04-17 12:43:07 +00:00
}
public void setEmail(String email) {
this.email = email;
}
public String getSessionKey() {
return this.sessionKey;
}
public String generateSessionKey() {
this.sessionKey = Utils.bytesToHex(Crypto.createSessionKey(32));
this.save();
return this.sessionKey;
}
2022-04-19 03:46:04 +00:00
public Locale getLocale() {
return locale;
}
public void setLocale(Locale locale) {
this.locale = locale;
}
2022-04-19 03:46:04 +00:00
/**
* The collection of a player's permissions.
*/
public List<String> getPermissions() {
return this.permissions;
}
public boolean addPermission(String permission) {
if(this.permissions.contains(permission)) return false;
this.permissions.add(permission); return true;
}
2022-05-07 04:00:55 +00:00
public static boolean permissionMatchesWildcard(String wildcard, String[] permissionParts) {
String[] wildcardParts = wildcard.split("\\.");
if (permissionParts.length < wildcardParts.length) { // A longer wildcard can never match a shorter permission
return false;
}
for (int i=0; i<wildcardParts.length; i++) {
switch (wildcardParts[i]) {
case "**": // Recursing match
return true;
case "*": // Match only one layer
if (i >= (permissionParts.length-1)) {
return true;
}
break;
default: // This layer isn't a wildcard, it needs to match exactly
if (!wildcardParts[i].equals(permissionParts[i])) {
return false;
}
}
}
// At this point the wildcard will have matched every layer, but if it is shorter then the permission then this is not a match at this point (no **).
return (wildcardParts.length == permissionParts.length);
}
public boolean hasPermission(String permission) {
2022-05-07 04:00:55 +00:00
if (this.permissions.contains(permission) || this.permissions.contains("*")) {
return true;
}
String[] permissionParts = permission.split("\\.");
for (String p : this.permissions) {
if (permissionMatchesWildcard(p, permissionParts)) {
return true;
}
}
return false;
}
2022-04-19 03:46:04 +00:00
public boolean removePermission(String permission) {
return this.permissions.remove(permission);
}
2022-04-17 12:43:07 +00:00
// TODO make unique
public String generateLoginToken() {
this.token = Utils.bytesToHex(Crypto.createSessionKey(32));
this.save();
return this.token;
}
public void save() {
DatabaseHelper.saveAccount(this);
}
@PreLoad
public void onLoad(Document document) {
// Grant the superuser permissions to accounts created before the permissions update
if (!document.containsKey("permissions")) {
this.addPermission("*");
}
// Set account default language as server default language
if (!document.containsKey("locale")) {
this.locale = LANGUAGE;
}
}
2022-04-17 12:43:07 +00:00
}