diff --git a/.forgejo/workflows/build.yml b/.forgejo/workflows/build.yml index 1778a89..88222f3 100644 --- a/.forgejo/workflows/build.yml +++ b/.forgejo/workflows/build.yml @@ -29,5 +29,5 @@ jobs: - name: ⬆️ Upload artifacts uses: https://code.forgejo.org/forgejo/upload-artifact@v4 with: - name: '${{ github.event.repository.name }}-${{ github.ref_name }}.zip' + name: '${{ github.event.repository.name }}-${{ github.event.repository.default_branch }}-${{ github.ref_name }}.zip' path: build/libs/ \ No newline at end of file diff --git a/README.md b/README.md index 275b186..363df20 100644 --- a/README.md +++ b/README.md @@ -7,32 +7,9 @@
-> [!NOTE] -> Support for other mod loaders is not planned. PRs implementing such support will not be accepted, please fork this project instead. - -> [!WARNING] -> This mod does not provide support for standard permission systems, and by default only verifies permissions by operator status (i.e. commands can only be run by operators). - -## Supported versions - -| Version | Support level | -| ------- | ------------- | -| 1.20.1 | ✅ Fully supported | -| * | ❌ Not supported | - ## Installing -Download the latest release from the releases tab or go to the [latest release directly](https://code.lilyvex.dev/lily/oauth-fabric/releases/latest), you may optionally choose to build from source, then put it in your Fabric server's `mods` directory. - -## Usage - -On initial load, this mod will create a commented configuration file. Edit the created file to contain the correct credentials for your OAuth provider, then restart the server. - -Players who are not registered will be kicked on join and given a link to the OAuth provider, where they can login to register for the server. - -Each new login with create a new session which will expire after a set period of time (usually defined by your OAuth provider). - -Use the `/oauth` command to see a list of all available commands. +Download the latest release from the releases tab or go to the [latest release directly](https://code.lilyvex.dev/lily/oauth-fabric/releases/latest), then put it in your Fabric server's `mods` directory. ## Building from source @@ -53,4 +30,4 @@ gradlew.bat build ## Contributing -Fork this repository and create a branch for your changes, then create a pull request for the `dev` branch with a "why", "what", and "how" to explain your changes. +Fork this repository and create a branch for your changes, then create a pull request for the `main` branch with a "why", "what", and "how" to explain your changes. \ No newline at end of file diff --git a/build.gradle b/build.gradle index b626148..11870b0 100644 --- a/build.gradle +++ b/build.gradle @@ -30,13 +30,6 @@ loom { } -configurations { - include { - canBeResolved = true - canBeConsumed = true - } -} - dependencies { // To change the versions see the gradle.properties file minecraft "com.mojang:minecraft:${project.minecraft_version}" @@ -46,12 +39,6 @@ dependencies { // Fabric API. This is technically optional, but you probably want it anyway. modImplementation "net.fabricmc.fabric-api:fabric-api:${project.fabric_version}" - // OAuth2 library - implementation 'com.google.oauth-client:google-oauth-client:1.39.0' - - // Configuration library - include 'com.electronwill.night-config:toml:3.6.0' - implementation 'com.electronwill.night-config:toml:3.6.0' } processResources { @@ -82,10 +69,6 @@ jar { from("LICENSE") { rename { "${it}_${inputs.properties.archivesName}"} } - - from { - configurations.include.collect { it.isDirectory() ? it : zipTree(it) } - } } // configure the maven publication diff --git a/src/main/java/dev/lilyvex/oauthfabric/OAuthFabric.java b/src/main/java/dev/lilyvex/oauthfabric/OAuthFabric.java index 4eb8675..06c0680 100644 --- a/src/main/java/dev/lilyvex/oauthfabric/OAuthFabric.java +++ b/src/main/java/dev/lilyvex/oauthfabric/OAuthFabric.java @@ -5,8 +5,6 @@ import net.fabricmc.api.ModInitializer; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import dev.lilyvex.oauthfabric.database.Database; - public class OAuthFabric implements ModInitializer { public static final String MOD_ID = "oauth-fabric"; @@ -21,12 +19,6 @@ public class OAuthFabric implements ModInitializer { // However, some things (like resources) may still be uninitialized. // Proceed with mild caution. - OAuthFabricConfig oAuthFabricConfig = new OAuthFabricConfig(); - oAuthFabricConfig.load(); - - Database database = new Database(); - database.setDatabase(oAuthFabricConfig.getDatabase()); - - LOGGER.info("oauth-fabric: Initialized"); + LOGGER.info("Hello Fabric world!"); } } \ No newline at end of file diff --git a/src/main/java/dev/lilyvex/oauthfabric/OAuthFabricConfig.java b/src/main/java/dev/lilyvex/oauthfabric/OAuthFabricConfig.java deleted file mode 100644 index 809096a..0000000 --- a/src/main/java/dev/lilyvex/oauthfabric/OAuthFabricConfig.java +++ /dev/null @@ -1,131 +0,0 @@ -package dev.lilyvex.oauthfabric; - -import com.electronwill.nightconfig.core.CommentedConfig; -import com.electronwill.nightconfig.core.io.ParsingException; -import com.electronwill.nightconfig.core.io.ParsingMode; -import com.electronwill.nightconfig.toml.TomlParser; -import com.electronwill.nightconfig.toml.TomlWriter; - -import net.fabricmc.loader.api.FabricLoader; - -import java.io.FileNotFoundException; -import java.io.IOException; -import java.nio.charset.StandardCharsets; -import java.nio.file.Files; -import java.nio.file.NoSuchFileException; -import java.nio.file.Path; -import java.nio.file.StandardCopyOption; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class OAuthFabricConfig { - private static final Logger LOGGER = LoggerFactory.getLogger("oauth-fabric"); - private static final String DEFAULT_PROVIDER = "auth.lilyvex.dev"; - private static final String DEFAULT_CLIENT_ID = "minecraft"; - private static final String DEFAULT_CLIENT_SECRET = ""; - private static final String DEFAULT_REDIRECT_URI = "mc.lilyvex.dev/oauth2"; - private static final String DEFAULT_DATABASE = "sqlite"; - - private static final Path CONFIG_FILE_PATH = FabricLoader.getInstance().getConfigDir() - .resolve("oauth-fabric.toml") - .normalize(); - - private final CommentedConfig config = CommentedConfig.inMemory(); - - // URL to the OAuth provider (e.g. accounts.google.com, discord.com/oauth2) - private String provider; - - // ID of the OAuth client. This is usually defined when creating the OAuth application. - private String client_id; - - // Client secret - private String client_secret; - - // URI to redirect to. Ensure that this URI is listed in the allowed redirect URIs section - // of your OAuth provider. - private String redirect_uri; - - // Which database to use (SQLite is currently the only supported database). - private String database; - - public String getProvider() { - return provider; - } - - public String getClientId() { - return client_id; - } - - public String getClientSecret() { - return client_secret; - } - - public String getRedirectUri() { - return redirect_uri; - } - - public String getDatabase() { - return database; - } - - public void load() { - this.config.setComment("provider", "URL to the OAuth provider (e.g. accounts.google.com, discord.com/oauth2)"); - this.config.set("provider", DEFAULT_PROVIDER); - - this.config.setComment("client_id", "ID of the OAuth client. This is usually defined when creating the OAuth application."); - this.config.set("client_id", DEFAULT_CLIENT_ID); - - this.config.setComment("client_secret", ""); - this.config.set("client_secret", DEFAULT_CLIENT_SECRET); - - this.config.setComment("redirect_uri", "URI to redirect to. Ensure that this URI is listed in the allowed redirect URIs section of your OAuth provider."); - this.config.set("redirect_uri", DEFAULT_REDIRECT_URI); - - this.config.setComment("database", "Which database to use (SQLite is currently the only supported database)."); - this.config.set("database", DEFAULT_DATABASE); - - try { - this.loadFromFile(true); - } catch (IOException e) { - throw new RuntimeException(e); - } - - LOGGER.info("oauth-fabric: Configuration loaded."); - } - - private void loadFromFile(boolean firstAttempt) throws IOException { - try (var reader = Files.newBufferedReader(CONFIG_FILE_PATH)) { - new TomlParser().parse(reader, this.config, ParsingMode.REPLACE); - } catch (NoSuchFileException | FileNotFoundException e) { - if (!firstAttempt) { - throw e; - } - - this.copyDefaultFile(); - this.loadFromFile(true); - } catch (ParsingException e) { - if (!firstAttempt) { - throw e; - } - - var backupPath = CONFIG_FILE_PATH.resolveSibling("oauth-fabric.toml.old").toAbsolutePath().normalize(); - - LOGGER.error("oauth-fabric: Failed to parse configuration file, THIS IS BAD.", e); - LOGGER.error("oauth-fabric: Copying the corrupt file to \"{}\".", backupPath); - Files.copy(CONFIG_FILE_PATH, backupPath, StandardCopyOption.ATOMIC_MOVE, StandardCopyOption.REPLACE_EXISTING); - this.copyDefaultFile(); - this.loadFromFile(false); - } - } - - private void copyDefaultFile() throws IOException { - Files.createDirectories(CONFIG_FILE_PATH.getParent()); - - try (var writer = Files.newBufferedWriter(CONFIG_FILE_PATH, StandardCharsets.UTF_8)) { - new TomlWriter().write(this.config.unmodifiable(), writer); - } catch (NoSuchFileException | FileNotFoundException e) { - LOGGER.error("oauth-fabric: Failed to write default configuration file."); - } - } -} diff --git a/src/main/java/dev/lilyvex/oauthfabric/database/Database.java b/src/main/java/dev/lilyvex/oauthfabric/database/Database.java deleted file mode 100644 index 6b348f8..0000000 --- a/src/main/java/dev/lilyvex/oauthfabric/database/Database.java +++ /dev/null @@ -1,36 +0,0 @@ -package dev.lilyvex.oauthfabric.database; - -public class Database implements IDatabase { - private IDatabase databaseClass; - - public void setDatabase(String database) { - switch (database) { - case "sqlite": - databaseClass = new SQLite(); - } - } - - public void addUser(String uuid, String oauthId, String sessionToken) { - databaseClass.addUser(uuid, oauthId, sessionToken); - } - - public void updateUser(String uuid, String oauthId, String sessionToken) { - databaseClass.updateUser(uuid, oauthId, sessionToken); - } - - public void removeUser(String uuid) { - databaseClass.removeUser(uuid); - } - - public boolean isRegisteredUser(String uuid) { - return databaseClass.isRegisteredUser(uuid); - } - - public String getOauthId(String uuid) { - return databaseClass.getOauthId(uuid); - } - - public String getSessionToken(String uuid) { - return databaseClass.getSessionToken(uuid); - } -} diff --git a/src/main/java/dev/lilyvex/oauthfabric/database/IDatabase.java b/src/main/java/dev/lilyvex/oauthfabric/database/IDatabase.java deleted file mode 100644 index f036f51..0000000 --- a/src/main/java/dev/lilyvex/oauthfabric/database/IDatabase.java +++ /dev/null @@ -1,11 +0,0 @@ -package dev.lilyvex.oauthfabric.database; - -public interface IDatabase { - public void addUser(String uuid, String oauthId, String sessionToken); - public void updateUser(String uuid, String oauthId, String sessionToken); - public void removeUser(String uuid); - public boolean isRegisteredUser(String uuid); - - public String getOauthId(String uuid); - public String getSessionToken(String uuid); -} \ No newline at end of file diff --git a/src/main/java/dev/lilyvex/oauthfabric/database/SQLite.java b/src/main/java/dev/lilyvex/oauthfabric/database/SQLite.java deleted file mode 100644 index 340f1c0..0000000 --- a/src/main/java/dev/lilyvex/oauthfabric/database/SQLite.java +++ /dev/null @@ -1,200 +0,0 @@ -package dev.lilyvex.oauthfabric.database; - -import java.nio.file.Path; -import java.sql.Connection; -import java.sql.DriverManager; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.sql.Statement; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import net.fabricmc.loader.api.FabricLoader; - -public class SQLite implements IDatabase { - private static final Logger LOGGER = LoggerFactory.getLogger("oauth-fabric"); - private static final Path DATABASE_PATH = FabricLoader.getInstance().getConfigDir() - .resolve("oauth-fabric.db") - .normalize(); - - private static final String databaseUrl = "jdbc:sqlite:" + DATABASE_PATH; - private Connection connection = null; - - private void createDatabase() throws SQLException { - try { - connection = DriverManager.getConnection(databaseUrl); - - Statement statement = connection.createStatement(); - statement.executeUpdate(""" - CREATE TABLE IF NOT EXISTS users ( - id INTEGER PRIMARY KEY, - uuid TEXT UNIQUE, - oauth_id TEXT UNIQUE, - session_token TEXT UNIQUE - ) - """); - } catch (SQLException e) { - LOGGER.error("oauth-fabric: Unable to create SQLite database"); - } finally { - try { - if (connection != null) { - connection.close(); - } - } catch (SQLException e) { - LOGGER.error("oauth-fabric: Could not close SQLite connection"); - } - } - } - - public void addUser(String uuid, String oauthId, String sessionToken) { - try { - createDatabase(); - } catch (SQLException e) { - throw new RuntimeException(e); - } - - try { - connection = DriverManager.getConnection(databaseUrl); - - PreparedStatement statement = connection.prepareStatement(""" - INSERT INTO users ( - uuid, - oauth_id, - session_token - ) VALUES ( - ?, - ?, - ? - ) - """); - - statement.setString(1, uuid); - statement.setString(2, oauthId); - statement.setString(3, sessionToken); - statement.executeQuery(); - } catch (SQLException e) { - throw new RuntimeException(e); - } - } - - public void updateUser(String uuid, String oauthId, String sessionToken) { - try { - createDatabase(); - } catch (SQLException e) { - throw new RuntimeException(e); - } - - try { - connection = DriverManager.getConnection(databaseUrl); - - PreparedStatement statement = connection.prepareStatement("UPDATE users SET oauth_id = ?, session_token = ? WHERE uuid = ?"); - statement.setString(1, oauthId); - statement.setString(2, sessionToken); - statement.setString(3, uuid); - statement.executeUpdate(); - } catch (SQLException e) { - throw new RuntimeException(e); - } - } - - public void removeUser(String uuid) { - try { - createDatabase(); - } catch (SQLException e) { - throw new RuntimeException(e); - } - - try { - connection = DriverManager.getConnection(databaseUrl); - - PreparedStatement statement = connection.prepareStatement("DELETE FROM users WHERE uuid = ?"); - statement.setString(1, uuid); - statement.executeUpdate(); - } catch (SQLException e) { - throw new RuntimeException(e); - } - } - - public boolean isRegisteredUser(String uuid) { - try { - createDatabase(); - } catch (SQLException e) { - throw new RuntimeException(e); - } - - try { - connection = DriverManager.getConnection(databaseUrl); - - PreparedStatement statement = connection.prepareStatement("SELECT * FROM users WHERE uuid = ?"); - statement.setString(1, uuid); - ResultSet resultSet = statement.executeQuery(); - - int results = 0; - while (resultSet.next()) { - results++; - } - - if (results > 0) { - return true; - } - - return false; - } catch (SQLException e) { - throw new RuntimeException(e); - } - } - - public String getOauthId(String uuid) { - try { - createDatabase(); - } catch (SQLException e) { - throw new RuntimeException(e); - } - - try { - connection = DriverManager.getConnection(databaseUrl); - - PreparedStatement statement = connection.prepareStatement("SELECT * FROM users WHERE uuid = ?"); - statement.setString(1, uuid); - ResultSet resultSet = statement.executeQuery(); - - String userOauthId = ""; - - while (resultSet.next()) { - userOauthId = resultSet.getString("oauth_id"); - } - - return userOauthId; - } catch (SQLException e) { - throw new RuntimeException(e); - } - } - - public String getSessionToken(String uuid) { - try { - createDatabase(); - } catch (SQLException e) { - throw new RuntimeException(e); - } - - try { - connection = DriverManager.getConnection(databaseUrl); - - PreparedStatement statement = connection.prepareStatement("SELECT * FROM users WHERE uuid = ?"); - statement.setString(1, uuid); - ResultSet resultSet = statement.executeQuery(); - - String userSessionToken = ""; - - while (resultSet.next()) { - userSessionToken = resultSet.getString("session_token"); - } - - return userSessionToken; - } catch (SQLException e) { - throw new RuntimeException(e); - } - } -} diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index 894fb1b..4e243e3 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -3,15 +3,15 @@ "id": "oauth-fabric", "version": "${version}", "name": "OAuth Fabric", - "description": "OAuth2 authentication for Fabric Minecraft servers", + "description": "This is an example description! Tell everyone what your mod is about!", "authors": [ - "Lily Vex" + "Me!" ], "contact": { - "homepage": "https://code.lilyvex.dev/lily/oauth-fabric", - "sources": "https://code.lilyvex.dev/lily/oauth-fabric" + "homepage": "https://fabricmc.net/", + "sources": "https://github.com/FabricMC/fabric-example-mod" }, - "license": "MIT", + "license": "CC0-1.0", "icon": "assets/oauth-fabric/icon.png", "environment": "*", "entrypoints": {