Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
79 commits
Select commit Hold shift + click to select a range
99f42ac
chore: Migrate to publish plugin
CrAfTsArMy Jan 11, 2026
39a866e
refactor: Rebuild auth system from scratch
CrAfTsArMy Jan 14, 2026
738167b
feat: Add getType to AuthResult
CrAfTsArMy Jan 18, 2026
b386fb5
feat: First preview of the new token
CrAfTsArMy Jan 18, 2026
a7ccb77
feat: Add scope filters
CrAfTsArMy Jan 18, 2026
f23b379
feat: Add a file token store driver
CrAfTsArMy Jan 23, 2026
72e59ea
chore: Allow RequireScope on methods
CrAfTsArMy Jan 23, 2026
f69ab5e
chore: Bump version of craftscore to 3.8.13-pre7
CrAfTsArMy Jan 23, 2026
d4e6a6e
docs: Bump minimum version of craftsnet to 3.7.0
CrAfTsArMy Jan 23, 2026
9351393
chore: Default to file token store driver
CrAfTsArMy Jan 23, 2026
213115a
fix: Use static reference for getAuthChain
CrAfTsArMy Jan 23, 2026
87f030f
fix: Scopes are now applicable for websockets
CrAfTsArMy Jan 23, 2026
eefb956
chore: Create token file if not exists
CrAfTsArMy Jan 23, 2026
0e481ef
chore: Use byte[] for token validation
CrAfTsArMy Jan 23, 2026
b0fd2b0
fix: Serialize token data as empty if empty
CrAfTsArMy Jan 23, 2026
f8e2b99
feat: Add first preview of websocket token auth
CrAfTsArMy Jan 23, 2026
737b9b8
chore: Bump version of craftscore to 3.8.13-pre8
CrAfTsArMy Jan 23, 2026
796feb5
chore: Bump version of craftsnet to 3.7.0-pre8
CrAfTsArMy Jan 23, 2026
ef5b069
feat: Add first preview of http token auth
CrAfTsArMy Jan 24, 2026
8fb96c3
fix: Fail and warn if not http token auth is set
CrAfTsArMy Jan 24, 2026
0b8c11f
fix: Better console output on scope mismatch
CrAfTsArMy Jan 24, 2026
cb70f2a
feat: Add token events
CrAfTsArMy Jan 24, 2026
2c88a88
chore: Rename getToken to getValidatedToken
CrAfTsArMy Jan 27, 2026
2544141
feat: Add token caching
CrAfTsArMy Jan 27, 2026
d15aa97
chore: Make the driver reload method public
CrAfTsArMy Jan 27, 2026
f9038d7
chore: Delegate to super on file token deletion
CrAfTsArMy Jan 27, 2026
94229d3
chore: Make the cache size configurable
CrAfTsArMy Feb 26, 2026
049ffb7
fix: Do not double load the token driver
CrAfTsArMy Feb 26, 2026
2f16e96
feat: Add setter for the token manager
CrAfTsArMy Feb 26, 2026
a81c476
feat: A more generic way to register fallback driver
CrAfTsArMy Feb 26, 2026
b5a39b5
chore: No more auto register for tokens
CrAfTsArMy Feb 26, 2026
7b455d4
refactor: Split token driver into multiple untis
CrAfTsArMy Feb 26, 2026
1e0d3e2
feat: Add preview for token groups
CrAfTsArMy Feb 26, 2026
0b99ad9
feat: Add group requirement preview
CrAfTsArMy Feb 26, 2026
3ae52ea
feat: Both drivers are now one unit
CrAfTsArMy Mar 1, 2026
83e9051
refactor: Split into modules
CrAfTsArMy Mar 8, 2026
072a9ea
fix: Fix weird logic in exclusions
CrAfTsArMy Mar 14, 2026
6faf1c9
chore: Optimize imports
CrAfTsArMy Mar 14, 2026
fcf16e2
chore: Bump craftsnet to 3.7.0-pre9
CrAfTsArMy Mar 14, 2026
17e3532
chore: Store token and group scopes separately
CrAfTsArMy Mar 14, 2026
d505b69
feat: Preview of craftsnet security sql driver
CrAfTsArMy Mar 14, 2026
6523f5c
fix: Correct default behaviour for the StoreDriver
CrAfTsArMy Mar 18, 2026
f5e433b
chore: Bump version of craftsnet to 3.7.0
CrAfTsArMy Mar 18, 2026
e1d5a2c
fix: Correct file name
CrAfTsArMy Mar 18, 2026
92f8bc2
feat: Add sql reload provider
CrAfTsArMy Mar 18, 2026
e8dd2fc
feat: Add a bill of materials
CrAfTsArMy Mar 18, 2026
6d6dbaf
refactor: Fix naming of the sql driver addon class
CrAfTsArMy Mar 18, 2026
8065e9b
refactor: Create only one sql reload provider
CrAfTsArMy Mar 18, 2026
ae9d795
chore: Fix console log for file hot reload manager
CrAfTsArMy Mar 18, 2026
317294f
feat: Add a preview for the sql polling reload provider
CrAfTsArMy Mar 18, 2026
00c4f4e
chore: Add a way to enforce a default location
CrAfTsArMy Mar 20, 2026
f1398ca
chore: Add cache remove method for direct entities
CrAfTsArMy Mar 20, 2026
1a64a94
style: Move fromJson method to a better place
CrAfTsArMy Mar 20, 2026
872c71b
feat: Add OptionalGroup#of
CrAfTsArMy Mar 20, 2026
8873dcc
feat: Add static version variables
CrAfTsArMy Mar 20, 2026
0fdaac8
feat: Add token system setup helper
CrAfTsArMy Mar 21, 2026
630fe3f
feat: Add no op sql reload provider
CrAfTsArMy Mar 21, 2026
d9a7821
feat: Remember which client is authenticated
CrAfTsArMy Mar 21, 2026
7fb1bbc
chore: Allow direct throw of sql exceptions
CrAfTsArMy Mar 21, 2026
b11f45f
feat: Add statement batching
CrAfTsArMy Mar 21, 2026
2715511
feat: Add better sql indices
CrAfTsArMy Mar 21, 2026
7369acd
chore: Optimize sql statements for token ops
CrAfTsArMy Mar 21, 2026
1250040
fix: Make indices unique
CrAfTsArMy Mar 22, 2026
b637d74
feat: Add direct static instance getters and setters
CrAfTsArMy Mar 22, 2026
bda091a
chore: Add NotNull and Nullable annotations
CrAfTsArMy Mar 22, 2026
f43711f
refactor: Optimize sql statements for group ops
CrAfTsArMy Mar 22, 2026
df04664
refactor: Correct package name
CrAfTsArMy Mar 22, 2026
8ba2e68
fix: Store sql driver instance on construction
CrAfTsArMy Mar 22, 2026
8f7671b
chore: Remove unnecessary blocking
CrAfTsArMy Mar 22, 2026
6dbc9f8
chore: Add better sql close mechanism
CrAfTsArMy Mar 22, 2026
3f09013
chore: Better naming
CrAfTsArMy Mar 27, 2026
48de823
feat: Perform full reload when both entities changes
CrAfTsArMy Mar 27, 2026
4fb9a37
feat: Store used scopes and groups
CrAfTsArMy Mar 27, 2026
ba2bff7
chore: Use new HttpStatus of craftsnet
CrAfTsArMy Mar 27, 2026
0fc4fc9
fix: Register the GroupResolveMiddleware
CrAfTsArMy Mar 27, 2026
adb6abe
feat: Add cache revalidation events
CrAfTsArMy Mar 27, 2026
b1292d8
feat: Add ws cache revalidation
CrAfTsArMy Mar 27, 2026
051153d
feat: Token locations are now modifiable
CrAfTsArMy Mar 27, 2026
9c3e30c
refactor: Split in common, token and token-sql
CrAfTsArMy Apr 16, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -72,5 +72,5 @@ addons
logs
libraries

.env
.env.repo

4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,5 +10,5 @@

| CraftsNet Version | Compatible |
|-------------------|------------|
| >= 3.4.1-SNAPSHOT | ✅ |
| <= 3.4.0-SNAPSHOT | ❌ |
| >= 3.7.0 | ✅ |
| <= 3.7.0 | ❌ |
51 changes: 51 additions & 0 deletions bom/build.gradle
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
plugins {
id "java-platform"
}

gradle.projectsEvaluated {
def validSubprojects = rootProject.subprojects.findAll { sub ->
sub.name != project.name &&
(!sub.ext.has("shouldPublish") || sub.ext["shouldPublish"]) &&
sub.tasks.findByName("classes") != null
}

dependencies {
constraints {
validSubprojects.sort { "$it.name" }.each {
api it
}
}
}
}

craftsPublish {
artifactId = project.name
name = "CraftsNet Security ${project.name}"

component = project.components.javaPlatform

pom {
name = project.name
description = project.description

scm {
url = 'https://github.com/CraftsBlock/CraftsNet-Security'
connection = 'scm:git:git://github.com/CraftsBlock/CraftsNet-Security.git'
developerConnection = 'scm:git:[email protected]:CraftsBlock/CraftsNet-Security.git'
}

issueManagement {
system = 'github'
url = 'https://github.com/CraftsBlock/CraftsNet-Security/issues'
}

licenses {
license {
name = 'GNU General Public License v3.0'
url = 'https://github.com/CraftsBlock/CraftsNet-Security/blob/master/LICENSE'
}
}
}
}

description = "Bill-of-Materials for craftsnet security"
149 changes: 78 additions & 71 deletions build.gradle
Original file line number Diff line number Diff line change
@@ -1,86 +1,96 @@
plugins {
id 'java'
id 'maven-publish'
id "de.craftsblock.gradle.publish" version "0.0.20" apply false
}

def env = new Properties()
file(".env").withInputStream {
env.load(it)
}
version = "1.0.0-pre1"

java {
sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17
subprojects {
apply plugin: "maven-publish"
apply plugin: "de.craftsblock.gradle.publish"

withJavadocJar()
withSourcesJar()
}
group = 'de.craftsblock.craftsnet.modules.security'
version = rootProject.version

group = 'de.craftsblock.craftsnet.modules'
version = '1.0.0-pre10'
repositories {
mavenCentral()
maven { url "https://repo.craftsblock.de/releases" }
maven { url "https://repo.craftsblock.de/experimental" }
}

repositories {
mavenCentral()
maven { url "https://repo.craftsblock.de/releases" }
maven { url "https://repo.craftsblock.de/experimental" }
}
afterEvaluate {
if (project.components.findByName("javaPlatform") != null) {
return
}

dependencies {
// CraftsBlock dependencies ----------------------------------------------------------------------------------------
java {
sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17

// https://repo.craftsblock.de/#/releases/de/craftsblock/craftscore/bom
implementation platform("de.craftsblock.craftscore:bom:3.8.12")
withJavadocJar()
withSourcesJar()
}

// https://repo.craftsblock.de/#/releases/de/craftsblock/craftscore/event
implementation "de.craftsblock.craftscore:event"
dependencies {
// CraftsBlock dependencies ----------------------------------------------------------------------------------------

// https://repo.craftsblock.de/#/releases/de/craftsblock/craftscore/json
implementation "de.craftsblock.craftscore:json"
// https://repo.craftsblock.de/#/releases/de/craftsblock/craftscore/bom
implementation platform("de.craftsblock.craftscore:bom:3.8.13-pre9")

// https://repo.craftsblock.de/#/releases/de/craftsblock/craftscore/sql
implementation "de.craftsblock.craftscore:sql"
// https://repo.craftsblock.de/#/releases/de/craftsblock/craftsnet
implementation "de.craftsblock:craftsnet:3.7.1"

// https://repo.craftsblock.de/#/releases/de/craftsblock/craftscore/utils
implementation "de.craftsblock.craftscore:utils"
// Third party dependencies ----------------------------------------------------------------------------------------

// https://repo.craftsblock.de/#/releases/de/craftsblock/craftsnet
implementation "de.craftsblock:craftsnet:3.5.6-pre6"
// https://mvnrepository.com/artifact/org.springframework.security/spring-security-crypto
implementation 'org.springframework.security:spring-security-crypto:7.1.0-M3'

// Third party dependencies ----------------------------------------------------------------------------------------
// https://mvnrepository.com/artifact/org.jetbrains/annotations
implementation 'org.jetbrains:annotations:26.1.0'

// https://mvnrepository.com/artifact/org.springframework.security/spring-security-crypto
implementation 'org.springframework.security:spring-security-crypto:6.5.0'
}

// https://mvnrepository.com/artifact/org.jetbrains/annotations
implementation 'org.jetbrains:annotations:26.0.2'
tasks.withType(JavaCompile).configureEach {
options.encoding = 'UTF-8'
}

}
jar {
from sourceSets.main.output

tasks.withType(JavaCompile).configureEach {
options.encoding = 'UTF-8'
}
duplicatesStrategy = DuplicatesStrategy.EXCLUDE

jar {
from sourceSets.main.output
manifest {
attributes(
'Implementation-Title': project.name,
'Implementation-Version': project.version
)
}
}

duplicatesStrategy = DuplicatesStrategy.EXCLUDE
tasks.register("runnableJar", Jar) {
archiveClassifier.set("runnable")

manifest {
attributes(
'Implementation-Title': project.name,
'Implementation-Version': project.version
)
}
}
manifest {
attributes "Main-Class": application.mainClass.get()
}

from sourceSets.main.output

from {
configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) }
}

duplicatesStrategy = DuplicatesStrategy.EXCLUDE
}

craftsPublish {
artifactId = project.name
name = "CraftsNet Security ${project.name}"

component = project.components.java

publishing {
publications {
normal(MavenPublication) {
artifactId "security"
from components.java
pom {
name = 'Security'
description = 'Protect your CraftsNet Restful API with an token-based access control system'
name = project.name
description = project.description

scm {
url = 'https://github.com/CraftsBlock/CraftsNet-Security'
Expand All @@ -100,18 +110,15 @@ publishing {
}
}
}
}
}
repositories {
maven {
url('https://repo.craftsblock.de/experimental')
authentication {
basic(BasicAuthentication)
}
credentials {
username = env["username"]
password = env["password"]

extraArtifacts {

runnable {
task = "runnableJar"
classifier = "runnable"
}

}
}
}
}
}
10 changes: 10 additions & 0 deletions common/build.gradle
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
plugins {
id "java"
id "application"
}

application {
mainClass = "de.craftsblock.cnet.modules.security.CraftsNetSecurity"
}

description = "Protect your CraftsNet API with easy drop in security features."
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
package de.craftsblock.cnet.modules.security;

import de.craftsblock.cnet.modules.security.auth.AuthChain;
import de.craftsblock.cnet.modules.security.auth.autoregister.AuthChainAutoRegisterHandler;
import de.craftsblock.craftsnet.CraftsNet;
import de.craftsblock.craftsnet.addon.Addon;
import de.craftsblock.craftsnet.addon.meta.annotations.Meta;
import de.craftsblock.craftsnet.api.http.HttpMethod;
import de.craftsblock.craftsnet.autoregister.AutoRegisterRegistry;
import org.jetbrains.annotations.NotNull;

import java.io.IOException;

@Meta(name = "CraftsNetSecurity")
public final class CraftsNetSecurity extends Addon {

public static final String VERSION = "1.0.0-pre1";

private AuthChain authChain;

public static void main(String[] args) throws IOException {
CraftsNet.create(CraftsNetSecurity.class)
.withArgs(args)
.build();
}

@Override
public void onLoad() {
super.onLoad();
this.authChain = new AuthChain();

AutoRegisterRegistry autoRegisterRegistry = this.getAutoRegisterRegistry();
autoRegisterRegistry.register(new AuthChainAutoRegisterHandler());
}

@Override
public void onEnable() {
super.onEnable();
}

@Override
public void onDisable() {
super.onDisable();
}

public static @NotNull AuthChain getAuthChain() {
return getInstance().authChain;
}

public static CraftsNetSecurity getInstance() {
return getAddon(CraftsNetSecurity.class);
}

}
Loading
Loading