Skip to content

Commit

Permalink
Add Groups File, Model and Functions | Add missing backend Methods
Browse files Browse the repository at this point in the history
  • Loading branch information
ToBiDi0410 committed Dec 30, 2021
1 parent cbc1a0d commit e46328b
Show file tree
Hide file tree
Showing 10 changed files with 283 additions and 5 deletions.
20 changes: 19 additions & 1 deletion src/main/java/de/tobias/spigotdash/main.java
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ public class main extends JavaPlugin {
public static long latestStart = 0;
public static WebServerFileRoot webroot;
public static usersFile UsersFile;
public static groupsFile GroupsFile;

public static SkriptIntegration skriptIntegration;

Expand Down Expand Up @@ -63,12 +64,29 @@ public void onEnable() {
configuration.init();
translations.load();

//GROUPS
GroupsFile = groupsFile.getFromFile(new File(main.pl.getDataFolder(), "groups.json"));
GroupsFile.save();

Group adminGroup = new Group("Admin", new PermissionSet());
adminGroup.permissions.setAllTo(true);
adminGroup.html_color = "#c73f45";
adminGroup.LEVEL = 100;
GroupsFile.add(adminGroup);
adminGroup = GroupsFile.getGroupByName("Admin");

Group defaultGroup = new Group("Default", new PermissionSet());
defaultGroup.html_color = "#4a4a4a";
GroupsFile.add(defaultGroup);
defaultGroup = GroupsFile.getGroupByName("default");

//USERS
UsersFile = usersFile.getFromFile(new File(main.pl.getDataFolder(), "users.json"));
UsersFile.save();
User adminUser = new User("ADMIN", configuration.CFG.get("WEB_PASSWORD").toString());
adminUser.perms.setAllTo(true);
adminUser.roles.add(adminGroup.id);
UsersFile.add(adminUser);
UsersFile.process();

//DATABASE
pluginConsole.sendMessage("Loading Cache File...");
Expand Down
26 changes: 26 additions & 0 deletions src/main/java/de/tobias/spigotdash/utils/SerialUtils.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package de.tobias.spigotdash.utils;

import com.google.gson.*;

public class SerialUtils {

// FROM: https://stackoverflow.com/questions/869033/how-do-i-copy-an-object-in-java

public static String serializeObject(Object o) {
Gson gson = new Gson();
String serializedObject = gson.toJson(o);
return serializedObject;
}

public static Object unserializeObject(String s, Object o){
Gson gson = new Gson();
Object object = gson.fromJson(s, o.getClass());
return object;
}

public static Object cloneObject(Object o){
String s = serializeObject(o);
Object object = unserializeObject(s,o);
return object;
}
}
43 changes: 43 additions & 0 deletions src/main/java/de/tobias/spigotdash/utils/files/Group.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
package de.tobias.spigotdash.utils.files;

import de.tobias.spigotdash.utils.pluginConsole;
import de.tobias.spigotdash.web.PermissionSet;

import java.util.Map;
import java.util.UUID;

public class Group implements Comparable<Group> {

public String name;
public String id;
public String html_color;

public Integer LEVEL;

public PermissionSet permissions;

public Group(String name, PermissionSet perms) {
this.LEVEL = 0;
this.name = name;
this.id = UUID.randomUUID().toString();
this.permissions = perms;
this.html_color = "#2965bd";
}

public PermissionSet addGrantedPermissionsToSet(PermissionSet input) {
PermissionSet output = input;
for(Map.Entry<String, Boolean> permEntry : PermissionSet.getAsMap(permissions).entrySet()) {
if(permEntry.getValue()) {
PermissionSet.setPermissionByName(permEntry.getKey(), permEntry.getValue(), output);
//pluginConsole.sendMessage("Inherited Permission from Group: " + permEntry.getKey() + " --> " + permEntry.getValue());
}
}

return output;
}

@Override
public int compareTo(Group o) {
return o.LEVEL.compareTo(this.LEVEL);
}
}
24 changes: 24 additions & 0 deletions src/main/java/de/tobias/spigotdash/utils/files/User.java
Original file line number Diff line number Diff line change
@@ -1,9 +1,13 @@
package de.tobias.spigotdash.utils.files;

import de.tobias.spigotdash.main;
import de.tobias.spigotdash.utils.passwordCrypter;
import de.tobias.spigotdash.web.PermissionSet;

import java.util.ArrayList;
import java.util.Base64;
import java.util.Collections;
import java.util.Comparator;

public class User {

Expand All @@ -13,14 +17,34 @@ public class User {
public String password;
public String salt;

public String pictureURL = "global/icons/default_profile.png";
public ArrayList<String> roles = new ArrayList<>();

public User() {}

public User(String name, String password) {
this.name = name;
this.perms = new PermissionSet();
this.pictureURL = "global/icons/default_profile.png";
this.roles.add(main.GroupsFile.getGroupByName("Default").id);
changePassword(password);
}

public void sortSelfGroups() {
ArrayList<Group> groupOrder = main.GroupsFile.getGroupOrder();

Collections.sort(this.roles, new Comparator<String>() {
@Override
public int compare(String g1, String g2) {
Group gr1 = main.GroupsFile.getGroupByID(g1);
Group gr2 = main.GroupsFile.getGroupByID(g2);
Integer gr1i = groupOrder.indexOf(gr1);
Integer gr2i = groupOrder.indexOf(gr2);
return gr1i.compareTo(gr2i);
}
});
}

public void changePassword(String newPass) {
byte[] iSalt = passwordCrypter.generateSalt();
password = passwordCrypter.encryptPassword(newPass, iSalt);
Expand Down
109 changes: 109 additions & 0 deletions src/main/java/de/tobias/spigotdash/utils/files/groupsFile.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,109 @@
package de.tobias.spigotdash.utils.files;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import de.tobias.spigotdash.utils.errorCatcher;
import de.tobias.spigotdash.utils.pluginConsole;
import org.apache.commons.io.FileUtils;

import java.io.File;
import java.io.FileReader;
import java.lang.reflect.Array;
import java.nio.charset.StandardCharsets;
import java.util.*;
import java.util.stream.Collectors;

public class groupsFile {

public String FILE_VER = "0.1";
public ArrayList<Group> groups = new ArrayList<Group>();

public transient File f;

public groupsFile(File pF) {
f = pF;
}

public boolean save() {
try {
FileUtils.write(f, gson.toJson(this), StandardCharsets.UTF_8);
return true;
} catch (Exception ex) {
pluginConsole.sendMessage("&cFailed to save Groups File: ");
errorCatcher.catchException(ex, false);
}
return false;
}

public Group getGroupByName(String name) {
for(Group g : groups) {
if(g.name.equals(name)) return g;
}
return null;
}

public Group getGroupByID(String id) {
for(Group g : groups) {
if(g.id.equals(id)) return g;
}
return null;
}

public boolean groupExists(String value) {
return (getGroupByName(value) != null || getGroupByID(value) != null);
}

public boolean add(Group g) {
if(!groupExists(g.id) && !groupExists(g.name)) {
groups.add(g);
save();
return true;
}
return false;
}

public HashMap<String, HashMap<String, Object>> getGroupsSave() {
HashMap<String, HashMap<String, Object>> safeGroups = new HashMap<>();

for(Group g : groups) {
HashMap<String, Object> data = new HashMap<>();
data.put("name", g.name);
data.put("perms", g.permissions);
data.put("html_color", g.html_color);
data.put("LEVEL", g.LEVEL);
safeGroups.put(g.id, data);
}
return safeGroups;
}

public ArrayList<Group> getGroupOrder() {
Collections.sort(groups);
return groups;
}

// *** STATIC ***
public static Gson gson = (new GsonBuilder()).disableHtmlEscaping().serializeNulls().setPrettyPrinting().create();

public static groupsFile getFromFile(File f) {
try {
groupsFile obj;

if(f.exists()) {
obj = gson.fromJson(new FileReader(f.getAbsolutePath()), groupsFile.class);
} else {
pluginConsole.sendMessage("&6Groups File was not found! Using empty Groups File Object...");
obj = new groupsFile(f);
}

if(obj == null) throw new NullPointerException();
obj.f = f;

return obj;
} catch (Exception ex) {
pluginConsole.sendMessage("&cFailed to load Groups File: ");
errorCatcher.catchException(ex, false);
pluginConsole.sendMessage("&6Using empty Groups File Object...");
}
return new groupsFile(f);
}
}
10 changes: 9 additions & 1 deletion src/main/java/de/tobias/spigotdash/utils/files/usersFile.java
Original file line number Diff line number Diff line change
Expand Up @@ -63,13 +63,15 @@ public ArrayList<HashMap<String, Object>> getUsersSave() {
HashMap<String, Object> data = new HashMap<>();
data.put("name", u.name);
data.put("perms", u.perms);
data.put("roles", u.roles);
data.put("pictureURL", u.pictureURL);
safeUsers.add(data);
}
return safeUsers;
}

// *** STATIC ***
public static Gson gson = (new GsonBuilder()).disableHtmlEscaping().setPrettyPrinting().create();
public static Gson gson = (new GsonBuilder()).disableHtmlEscaping().serializeNulls().setPrettyPrinting().create();

public static usersFile getFromFile(File f) {
try {
Expand All @@ -93,4 +95,10 @@ public static usersFile getFromFile(File f) {
}
return new usersFile(f);
}

public void process() {
for(User u : users) {
u.sortSelfGroups();
}
}
}
31 changes: 31 additions & 0 deletions src/main/java/de/tobias/spigotdash/web/PermissionSet.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import de.tobias.spigotdash.utils.pluginConsole;

import java.lang.reflect.Field;
import java.util.HashMap;

public class PermissionSet {

Expand Down Expand Up @@ -99,6 +100,36 @@ public void setAllTo(boolean t) {
this.USERS_IS_ADMIN = t;
}

public static HashMap<String, Boolean> getAsMap(PermissionSet set) {
HashMap<String, Boolean> permMap = new HashMap<>();

Field[] declaredFields = set.getClass().getDeclaredFields();
for (Field field : declaredFields) {
try {
permMap.put(field.getName(), field.getBoolean(set));
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}

return permMap;
}

public static void setPermissionByName(String name, Boolean newPerm, PermissionSet set) {
Field permField = null;
try {
permField = set.getClass().getDeclaredField(name);
} catch (Exception IGNORE) {}

if(permField != null) {
try {
permField.setBoolean(set, newPerm);
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}

public static void loadIntoFromJsonObject(JsonObject permissions, PermissionSet set) {
Field[] declaredFields = set.getClass().getDeclaredFields();
for (Field field : declaredFields) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ public byte[] getBytesOfFile(String path) {
return Resources.toByteArray(res);
}
} catch(Exception ex) {
pluginConsole.sendMessage("Failed to read requested Webfile: " + path);
//pluginConsole.sendMessage("Failed to read requested Webfile: " + path);
//errorCatcher.catchException(ex, false);
return null;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,15 @@
package de.tobias.spigotdash.web.sockets;

import de.tobias.spigotdash.main;
import de.tobias.spigotdash.utils.SerialUtils;
import de.tobias.spigotdash.utils.files.Group;
import de.tobias.spigotdash.utils.files.User;
import de.tobias.spigotdash.utils.files.configuration;
import de.tobias.spigotdash.web.PermissionSet;
import io.socket.socketio.server.SocketIoSocket;
import org.apache.commons.lang.SerializationUtils;

import java.io.Serializable;
import java.util.HashMap;

public class SocketAuthManager {
Expand All @@ -18,6 +22,16 @@ public static void authSocket(String name, String password, SocketIoSocket socke
if(u.validPassword(password)) {
HashMap<String, Object> data = new HashMap<>();
data.put("user", u);

PermissionSet calculatedPerms = (PermissionSet) SerialUtils.cloneObject(u.perms);
for(String groupID : u.roles) {
Group g = main.GroupsFile.getGroupByID(groupID);
if(g != null) {
g.addGrantedPermissionsToSet(calculatedPerms);
}
}

data.put("perms", calculatedPerms);
socketAuths.put(socket.getId(), data);
socreq.setResponse(200, "TEXT", "LOGGED_IN");
} else {
Expand All @@ -31,8 +45,8 @@ public static void authSocket(String name, String password, SocketIoSocket socke

public static PermissionSet getPermissions(SocketIoSocket soc) {
if(socketAuths.containsKey(soc.getId())) {
if(socketAuths.get(soc.getId()) != null && socketAuths.get(soc.getId()).containsKey("user")) {
return (PermissionSet) ((User) socketAuths.get(soc.getId()).get("user")).perms;
if(socketAuths.get(soc.getId()) != null && socketAuths.get(soc.getId()).containsKey("perms")) {
return (PermissionSet) socketAuths.get(soc.getId()).get("perms");
}
}

Expand Down
Loading

0 comments on commit e46328b

Please sign in to comment.