|
@@ -1,11 +1,18 @@
|
|
|
package xyz.prismix.OPCAI_server.DataBase;
|
|
|
|
|
|
import at.favre.lib.crypto.bcrypt.BCrypt;
|
|
|
+import com.fasterxml.jackson.core.JsonProcessingException;
|
|
|
+import com.fasterxml.jackson.databind.ObjectMapper;
|
|
|
import org.apache.commons.lang3.RandomStringUtils;
|
|
|
+import org.apache.commons.lang3.RegExUtils;
|
|
|
+import org.jetbrains.annotations.Nullable;
|
|
|
+import xyz.prismix.OPCAI_server.Json.UserJson;
|
|
|
|
|
|
import java.sql.*;
|
|
|
+import java.util.List;
|
|
|
+import java.util.regex.Matcher;
|
|
|
|
|
|
-public class SQLDatabase {
|
|
|
+public class SQLUserDatabase {
|
|
|
static Connection connection;
|
|
|
static {
|
|
|
try {
|
|
@@ -18,9 +25,12 @@ public class SQLDatabase {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- public static String createAccount(String username, String password) throws SQLException {
|
|
|
- Statement statement = SQLDatabase.connection.createStatement();
|
|
|
- ResultSet set = statement.executeQuery("SELECT * FROM Users WHERE Username='" + username + "';"); //TODO: Fix sql injection
|
|
|
+ public static String createAccount(String username, String password) throws SQLException, JsonProcessingException {
|
|
|
+ Statement statement = SQLUserDatabase.connection.createStatement();
|
|
|
+ ResultSet set = statement.executeQuery(STR."""
|
|
|
+ SELECT * FROM Users
|
|
|
+ WHERE Username='\{username}';
|
|
|
+ """); //TODO: Fix sql injection
|
|
|
if (set.next()) {
|
|
|
return "This username is already taken !";
|
|
|
}
|
|
@@ -28,14 +38,36 @@ public class SQLDatabase {
|
|
|
String salt = RandomStringUtils.randomAlphanumeric(10);
|
|
|
password = BCrypt.with(BCrypt.Version.VERSION_2X).hashToString(12, (password + salt).toCharArray());
|
|
|
|
|
|
- statement.executeUpdate("INSERT INTO Users (Username, Password, Salt) VALUES ('" + username + "', '" + password + "', '" + salt + "');");
|
|
|
+ UserJson json = new UserJson(username, List.of());
|
|
|
+ String data = new ObjectMapper().writeValueAsString(json);
|
|
|
+
|
|
|
+ statement.executeUpdate(STR."""
|
|
|
+ INSERT INTO Users (Username, Password, Salt, Data)
|
|
|
+ VALUES ('\{username}', '\{password}', '\{salt}', '\{data}');
|
|
|
+ """);
|
|
|
return "Success";
|
|
|
}
|
|
|
|
|
|
+ @Nullable
|
|
|
+ public UserJson getUserData(String user) throws SQLException, JsonProcessingException {
|
|
|
+ String sql = STR."""
|
|
|
+ SELECT * FROM OPCAI.Users
|
|
|
+ WHERE Username = '\{user}'
|
|
|
+ """;
|
|
|
+ Statement statement = connection.createStatement();
|
|
|
+ ResultSet set = statement.executeQuery(sql);
|
|
|
+ if (!set.next()) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ String data = set.getString(4);
|
|
|
+ return new ObjectMapper().readValue(data, UserJson.class);
|
|
|
+ }
|
|
|
+
|
|
|
|
|
|
public static boolean verifyAccount(String username, String password) throws SQLException {
|
|
|
String sql = "SELECT Password, Salt FROM Users WHERE Username = ?";
|
|
|
- PreparedStatement preparedStatement = SQLDatabase.connection.prepareStatement(sql);
|
|
|
+ PreparedStatement preparedStatement = SQLUserDatabase.connection.prepareStatement(sql);
|
|
|
preparedStatement.setString(1, username);
|
|
|
ResultSet resultSet = preparedStatement.executeQuery();
|
|
|
|
|
@@ -51,6 +83,17 @@ public class SQLDatabase {
|
|
|
return result.verified;
|
|
|
}
|
|
|
|
|
|
+ public void updateData(String username, String data) throws SQLException {
|
|
|
+ String sql = String.format(
|
|
|
+ STR."""
|
|
|
+ UPDATE OPCAI.Users
|
|
|
+ SET Data = '\{data}'
|
|
|
+ WHERE Username = '\{username}';
|
|
|
+ """
|
|
|
+ );
|
|
|
+ Statement statement = connection.createStatement();
|
|
|
+ statement.execute(sql);
|
|
|
+ }
|
|
|
|
|
|
public static String getTokenForUser(String username, String password) throws SQLException {
|
|
|
if (!verifyAccount(username, password)) {
|
|
@@ -58,7 +101,7 @@ public class SQLDatabase {
|
|
|
}
|
|
|
|
|
|
String sql = "SELECT Token FROM Tokens WHERE Username = ?";
|
|
|
- PreparedStatement preparedStatement = SQLDatabase.connection.prepareStatement(sql);
|
|
|
+ PreparedStatement preparedStatement = SQLUserDatabase.connection.prepareStatement(sql);
|
|
|
preparedStatement.setString(1, username);
|
|
|
ResultSet resultSet = preparedStatement.executeQuery();
|
|
|
|
|
@@ -68,7 +111,7 @@ public class SQLDatabase {
|
|
|
|
|
|
String newToken = RandomStringUtils.randomAlphanumeric(50);
|
|
|
|
|
|
- PreparedStatement insertion = SQLDatabase.connection.prepareStatement("INSERT INTO Tokens (Token, Username) VALUES (?, ?)");
|
|
|
+ PreparedStatement insertion = SQLUserDatabase.connection.prepareStatement("INSERT INTO Tokens (Token, Username) VALUES (?, ?)");
|
|
|
insertion.setString(1, newToken);
|
|
|
insertion.setString(2, username);
|
|
|
insertion.executeUpdate();
|