Compare commits

...

31 Commits
v1.0.1 ... main

Author SHA1 Message Date
144b988ee8 Update version.keycloak to v25.0.6
All checks were successful
Keycloak mailcow Build / Build und Bereitstellung (pull_request) Successful in 12s
Keycloak mailcow Build / Build und Bereitstellung (push) Successful in 13s
2024-09-20 00:01:58 +00:00
eae69c497c Update version.keycloak to v25.0.5
All checks were successful
Keycloak mailcow Build / Build und Bereitstellung (pull_request) Successful in 13s
Keycloak mailcow Build / Build und Bereitstellung (push) Successful in 12s
2024-09-11 00:02:27 +00:00
8a6e8cd71d Update dependency org.springframework.security:spring-security-crypto to v6.3.3
All checks were successful
Keycloak mailcow Build / Build und Bereitstellung (pull_request) Successful in 12s
Keycloak mailcow Build / Build und Bereitstellung (push) Successful in 13s
2024-08-22 00:03:01 +00:00
fd90a248c9 Update version.keycloak to v25.0.4
All checks were successful
Keycloak mailcow Build / Build und Bereitstellung (pull_request) Successful in 9s
Keycloak mailcow Build / Build und Bereitstellung (push) Successful in 12s
2024-08-21 00:02:23 +00:00
d3d075c13d Update dependency org.springframework.security:spring-security-crypto to v6.3.2
All checks were successful
Keycloak mailcow Build / Build und Bereitstellung (pull_request) Successful in 11s
Keycloak mailcow Build / Build und Bereitstellung (push) Successful in 12s
2024-08-20 00:02:28 +00:00
4d93162c0c Update dependency org.slf4j:slf4j-api to v2.0.16
All checks were successful
Keycloak mailcow Build / Build und Bereitstellung (pull_request) Successful in 16s
Keycloak mailcow Build / Build und Bereitstellung (push) Successful in 12s
2024-08-10 22:02:20 +00:00
b9ef52c12b Update dependency org.slf4j:slf4j-api to v2.0.15
All checks were successful
Keycloak mailcow Build / Build und Bereitstellung (pull_request) Successful in 13s
Keycloak mailcow Build / Build und Bereitstellung (push) Successful in 14s
2024-08-08 22:02:32 +00:00
9de990a36c Update dependency org.slf4j:slf4j-api to v2.0.14
All checks were successful
Keycloak mailcow Build / Build und Bereitstellung (pull_request) Successful in 13s
Keycloak mailcow Build / Build und Bereitstellung (push) Successful in 14s
2024-08-06 22:02:25 +00:00
4a6b8f5ba2 Update version.keycloak to v25.0.2
All checks were successful
Keycloak mailcow Build / Build und Bereitstellung (pull_request) Successful in 12s
Keycloak mailcow Build / Build und Bereitstellung (push) Successful in 12s
2024-07-18 22:02:37 +00:00
4be53c6e7c Reformat workflow file
All checks were successful
Keycloak mailcow Build / Build und Bereitstellung (push) Successful in 12s
2024-07-07 11:36:03 +02:00
3facb173c0 Merge pull request 'Update version.keycloak to v25.0.1' (#10) from renovate/version.keycloak into main
All checks were successful
deploy / deploy (push) Successful in 29s
Reviewed-on: #10
2024-06-20 15:25:52 +02:00
5241113727 Update version.keycloak to v25.0.1 2024-06-20 13:19:02 +00:00
1222bb7fc1 Merge pull request 'Update dependency org.springframework.security:spring-security-crypto to v6.3.1' (#9) from renovate/version.springsec into main
All checks were successful
deploy / deploy (push) Successful in 30s
Reviewed-on: #9
2024-06-20 00:07:40 +02:00
9cf52bf9b2 Update dependency org.springframework.security:spring-security-crypto to v6.3.1 2024-06-19 22:03:30 +00:00
4bd0b347de
update version to v1.1.0
All checks were successful
deploy / deploy (push) Successful in 20s
2024-06-15 16:45:51 +02:00
60a2934297
remove keycloak model legacy
All checks were successful
deploy / deploy (push) Successful in 20s
2024-06-15 15:58:31 +02:00
f1adc3ce97 Merge pull request 'Update version.keycloak to v25 (major)' (#8) from renovate/major-version.keycloak into main
Some checks failed
deploy / deploy (push) Failing after 13s
Reviewed-on: #8
2024-06-15 15:54:19 +02:00
529d8b2f64 Update version.keycloak to v25 2024-06-15 13:53:51 +00:00
54ad89fbdd Merge pull request 'Update dependency org.springframework.security:spring-security-crypto to v6.3.0' (#7) from renovate/version.springsec into main
All checks were successful
deploy / deploy (push) Successful in 24s
Reviewed-on: #7
2024-06-15 15:51:58 +02:00
5354a21a6b Merge pull request 'Update dependency org.slf4j:slf4j-api to v2.0.13' (#4) from renovate/org.slf4j-slf4j-api-2.x into main
Some checks are pending
deploy / deploy (push) Waiting to run
Reviewed-on: #4
2024-06-15 15:51:33 +02:00
97bee7d209 Update dependency org.springframework.security:spring-security-crypto to v6.3.0 2024-06-15 13:51:20 +00:00
2b5a1de2f4 Merge pull request 'Update version.keycloak to v24.0.5' (#5) from renovate/version.keycloak into main
Some checks are pending
deploy / deploy (push) Waiting to run
Reviewed-on: #5
2024-06-15 15:51:12 +02:00
955049dccc Merge pull request 'Update dependency org.apache.maven.plugins:maven-compiler-plugin to v3.13.0' (#6) from renovate/org.apache.maven.plugins-maven-compiler-plugin-3.x into main
All checks were successful
deploy / deploy (push) Successful in 24s
Reviewed-on: #6
2024-06-15 15:44:52 +02:00
25c7372f38 Update dependency org.apache.maven.plugins:maven-compiler-plugin to v3.13.0 2024-06-15 13:35:46 +00:00
db5482ff78 Update version.keycloak to v24.0.5 2024-06-15 13:34:34 +00:00
51fac9b45f Update dependency org.slf4j:slf4j-api to v2.0.13 2024-06-15 13:34:31 +00:00
bc974d12cb Merge pull request 'Configure Renovate' (#3) from renovate/configure into main
All checks were successful
deploy / deploy (push) Successful in 32s
Reviewed-on: #3
2024-06-15 15:34:06 +02:00
d00b10277e Add renovate.json 2024-06-15 13:30:46 +00:00
804d1441f9 disable mailcow keycloak logs
All checks were successful
deploy / deploy (push) Successful in 29s
2024-06-15 14:28:46 +02:00
8050a9007a
update to keycloak 24.0.2
All checks were successful
deploy / deploy (push) Successful in 22s
2024-03-27 22:42:34 +01:00
f0775bb60f
support Keycloak 24.0.1
All checks were successful
deploy / deploy (push) Successful in 27s
2024-03-23 22:20:56 +01:00
6 changed files with 42 additions and 35 deletions

@ -1,11 +1,13 @@
name: deploy name: Keycloak mailcow Build
on: on:
push: push:
branches: [main] branches: [main]
pull_request:
jobs: jobs:
deploy: release:
name: Build und Bereitstellung
runs-on: act-runner-user runs-on: act-runner-user
steps: steps:
- name: Checkout - name: Checkout
@ -16,11 +18,13 @@ jobs:
mvn package mvn package
- name: Remove old version - name: Remove old version
if: gitea.event_name == 'push'
run: | run: |
rm -rf /opt/data/keycloak/providers/spring-security-crypto-*.jar rm -rf /opt/data/keycloak/providers/spring-security-crypto-*.jar
rm -rf /opt/data/keycloak/providers/keycloak-mailcow-*.jar rm -rf /opt/data/keycloak/providers/keycloak-mailcow-*.jar
- name: Deploy - name: Deploy
if: gitea.event_name == 'push'
run: | run: |
export SPRINGSEC_VERSION=$(xmlstarlet sel -N x="http://maven.apache.org/POM/4.0.0" -t -m 'x:project/x:properties/x:version.springsec' -v . pom.xml) export SPRINGSEC_VERSION=$(xmlstarlet sel -N x="http://maven.apache.org/POM/4.0.0" -t -m 'x:project/x:properties/x:version.springsec' -v . pom.xml)
curl -sL \ curl -sL \
@ -29,14 +33,15 @@ jobs:
export SPI_VERSION=$(xmlstarlet sel -N x="http://maven.apache.org/POM/4.0.0" -t -m 'x:project/x:version' -v . pom.xml) export SPI_VERSION=$(xmlstarlet sel -N x="http://maven.apache.org/POM/4.0.0" -t -m 'x:project/x:version' -v . pom.xml)
cp -r target/keycloak-mailcow-$SPI_VERSION.jar /opt/data/keycloak/providers/keycloak-mailcow-$SPI_VERSION.jar cp -r target/keycloak-mailcow-$SPI_VERSION.jar /opt/data/keycloak/providers/keycloak-mailcow-$SPI_VERSION.jar
- name: Restart Keycloak
if: gitea.event_name == 'push'
run: |
curl -X POST -H "X-API-KEY: ${{ secrets.PORTAINER_API_KEY }}" https://docker.cantorgymnasium.de/api/stacks/48/stop\?endpointId\=1
curl -X POST -H "X-API-KEY: ${{ secrets.PORTAINER_API_KEY }}" https://docker.cantorgymnasium.de/api/stacks/48/start\?endpointId\=1
- name: Notification - name: Notification
uses: actions/telegram-action@main uses: actions/telegram-action@main
if: always() if: always()
with: with:
chat_id: ${{ secrets.TG_CHAT_ID }} chat_id: ${{ secrets.TG_CHAT_ID }}
token: ${{ secrets.TG_TOKEN }} token: ${{ secrets.TG_TOKEN }}
- name: Restart Keycloak
run: |
curl -X POST -H "X-API-KEY: ${{ secrets.PORTAINER_API_KEY }}" https://docker.cantorgymnasium.de/api/stacks/48/stop\?endpointId\=1
curl -X POST -H "X-API-KEY: ${{ secrets.PORTAINER_API_KEY }}" https://docker.cantorgymnasium.de/api/stacks/48/start\?endpointId\=1

12
pom.xml

@ -8,12 +8,12 @@
<groupId>de.cantorgymnasium</groupId> <groupId>de.cantorgymnasium</groupId>
<artifactId>keycloak-mailcow</artifactId> <artifactId>keycloak-mailcow</artifactId>
<version>1.0.1</version> <version>1.1.0</version>
<packaging>jar</packaging> <packaging>jar</packaging>
<properties> <properties>
<version.keycloak>23.0.1</version.keycloak> <version.keycloak>25.0.6</version.keycloak>
<version.springsec>6.2.1</version.springsec> <version.springsec>6.3.3</version.springsec>
</properties> </properties>
<dependencies> <dependencies>
@ -31,7 +31,7 @@
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.keycloak</groupId> <groupId>org.keycloak</groupId>
<artifactId>keycloak-model-legacy</artifactId> <artifactId>keycloak-model-storage</artifactId>
<scope>provided</scope> <scope>provided</scope>
<version>${version.keycloak}</version> <version>${version.keycloak}</version>
</dependency> </dependency>
@ -50,7 +50,7 @@
<dependency> <dependency>
<groupId>org.slf4j</groupId> <groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId> <artifactId>slf4j-api</artifactId>
<version>2.0.9</version> <version>2.0.16</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.springframework.security</groupId> <groupId>org.springframework.security</groupId>
@ -64,7 +64,7 @@
<plugin> <plugin>
<groupId>org.apache.maven.plugins</groupId> <groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId> <artifactId>maven-compiler-plugin</artifactId>
<version>3.11.0</version> <version>3.13.0</version>
<configuration> <configuration>
<source>17</source> <source>17</source>
<target>17</target> <target>17</target>

3
renovate.json Normal file

@ -0,0 +1,3 @@
{
"$schema": "https://docs.renovatebot.com/renovate-schema.json"
}

@ -5,7 +5,7 @@ import java.util.Map;
import org.keycloak.common.util.MultivaluedHashMap; import org.keycloak.common.util.MultivaluedHashMap;
import org.keycloak.component.ComponentModel; import org.keycloak.component.ComponentModel;
import org.keycloak.credential.LegacyUserCredentialManager; import org.keycloak.credential.UserCredentialManager;
import org.keycloak.models.KeycloakSession; import org.keycloak.models.KeycloakSession;
import org.keycloak.models.RealmModel; import org.keycloak.models.RealmModel;
import org.keycloak.models.SubjectCredentialManager; import org.keycloak.models.SubjectCredentialManager;
@ -130,6 +130,6 @@ class mailcowUser extends AbstractUserAdapter {
@Override @Override
public SubjectCredentialManager credentialManager() { public SubjectCredentialManager credentialManager() {
return new LegacyUserCredentialManager(session, realm, this); return new UserCredentialManager(session, realm, this);
} }
} }

@ -49,19 +49,19 @@ public class mailcowUserStorageProvider implements UserStorageProvider,
@Override @Override
public void close() { public void close() {
logger.info("[mailcow] close()"); logger.debug("[mailcow] close()");
} }
@Override @Override
public UserModel getUserById(RealmModel realm, String id) { public UserModel getUserById(RealmModel realm, String id) {
logger.info("[mailcow] getUserById({})", id); logger.debug("[mailcow] getUserById({})", id);
StorageId sid = new StorageId(id); StorageId sid = new StorageId(id);
return getUserByUsername(realm, sid.getExternalId()); return getUserByUsername(realm, sid.getExternalId());
} }
@Override @Override
public UserModel getUserByUsername(RealmModel realm, String username) { public UserModel getUserByUsername(RealmModel realm, String username) {
logger.info("[mailcow] getUserByUsername({})", username); logger.debug("[mailcow] getUserByUsername({})", username);
try (Connection c = DbUtil.getConnection(this.model)) { try (Connection c = DbUtil.getConnection(this.model)) {
PreparedStatement st = c.prepareStatement( PreparedStatement st = c.prepareStatement(
"select username, name, `mailbox`.`domain`, local_part FROM `mailbox` INNER JOIN domain on mailbox.domain = domain.domain WHERE `mailbox`.`active` = '1' AND `domain`.`active`='1' AND username = ?"); "select username, name, `mailbox`.`domain`, local_part FROM `mailbox` INNER JOIN domain on mailbox.domain = domain.domain WHERE `mailbox`.`active` = '1' AND `domain`.`active`='1' AND username = ?");
@ -80,7 +80,7 @@ public class mailcowUserStorageProvider implements UserStorageProvider,
@Override @Override
public UserModel getUserByEmail(RealmModel realm, String email) { public UserModel getUserByEmail(RealmModel realm, String email) {
logger.info("[mailcow] getUserByEmail({})", email); logger.debug("[mailcow] getUserByEmail({})", email);
try (Connection c = DbUtil.getConnection(this.model)) { try (Connection c = DbUtil.getConnection(this.model)) {
PreparedStatement st = c.prepareStatement( PreparedStatement st = c.prepareStatement(
"select username, name, `mailbox`.`domain`, local_part FROM `mailbox` INNER JOIN domain on mailbox.domain = domain.domain WHERE `mailbox`.`active` = '1' AND `domain`.`active`='1' AND username = ?"); "select username, name, `mailbox`.`domain`, local_part FROM `mailbox` INNER JOIN domain on mailbox.domain = domain.domain WHERE `mailbox`.`active` = '1' AND `domain`.`active`='1' AND username = ?");
@ -99,13 +99,13 @@ public class mailcowUserStorageProvider implements UserStorageProvider,
@Override @Override
public boolean supportsCredentialType(String credentialType) { public boolean supportsCredentialType(String credentialType) {
logger.info("[mailcow] supportsCredentialType({})", credentialType); logger.debug("[mailcow] supportsCredentialType({})", credentialType);
return PasswordCredentialModel.TYPE.endsWith(credentialType); return PasswordCredentialModel.TYPE.endsWith(credentialType);
} }
@Override @Override
public boolean isConfiguredFor(RealmModel realm, UserModel user, String credentialType) { public boolean isConfiguredFor(RealmModel realm, UserModel user, String credentialType) {
logger.info("[mailcow] isConfiguredFor(realm={},user={},credentialType={})", realm.getName(), logger.debug("[mailcow] isConfiguredFor(realm={},user={},credentialType={})", realm.getName(),
user.getUsername(), credentialType); user.getUsername(), credentialType);
// In our case, password is the only type of credential, so we allways return // In our case, password is the only type of credential, so we allways return
// 'true' if // 'true' if
@ -114,7 +114,7 @@ public class mailcowUserStorageProvider implements UserStorageProvider,
} }
private boolean verifyHash(String hash, String password) { private boolean verifyHash(String hash, String password) {
logger.info("[mailcow] verifyHash"); logger.debug("[mailcow] verifyHash");
Pattern pattern = Pattern.compile("\\{(.+)\\}(.+)"); Pattern pattern = Pattern.compile("\\{(.+)\\}(.+)");
Matcher matcher = pattern.matcher(hash); Matcher matcher = pattern.matcher(hash);
while (matcher.find()) { while (matcher.find()) {
@ -128,7 +128,7 @@ public class mailcowUserStorageProvider implements UserStorageProvider,
@Override @Override
public boolean isValid(RealmModel realm, UserModel user, CredentialInput credentialInput) { public boolean isValid(RealmModel realm, UserModel user, CredentialInput credentialInput) {
logger.info("[mailcow] isValid(realm={},user={},credentialInput.type={})", realm.getName(), user.getUsername(), logger.debug("[mailcow] isValid(realm={},user={},credentialInput.type={})", realm.getName(), user.getUsername(),
credentialInput.getType()); credentialInput.getType());
if (!this.supportsCredentialType(credentialInput.getType())) { if (!this.supportsCredentialType(credentialInput.getType())) {
return false; return false;
@ -157,7 +157,7 @@ public class mailcowUserStorageProvider implements UserStorageProvider,
@Override @Override
public int getUsersCount(RealmModel realm) { public int getUsersCount(RealmModel realm) {
logger.info("[mailcow] getUsersCount: realm={}", realm.getName()); logger.debug("[mailcow] getUsersCount: realm={}", realm.getName());
try (Connection c = DbUtil.getConnection(this.model)) { try (Connection c = DbUtil.getConnection(this.model)) {
Statement st = c.createStatement(); Statement st = c.createStatement();
st.execute( st.execute(
@ -173,7 +173,7 @@ public class mailcowUserStorageProvider implements UserStorageProvider,
@Override @Override
public Stream<UserModel> getGroupMembersStream(RealmModel realm, GroupModel group, Integer firstResult, public Stream<UserModel> getGroupMembersStream(RealmModel realm, GroupModel group, Integer firstResult,
Integer maxResults) { Integer maxResults) {
logger.info("[mailcow] getUsers: realm={}", realm.getName()); logger.debug("[mailcow] getUsers: realm={}", realm.getName());
try (Connection c = DbUtil.getConnection(this.model)) { try (Connection c = DbUtil.getConnection(this.model)) {
PreparedStatement st = c.prepareStatement( PreparedStatement st = c.prepareStatement(
@ -182,7 +182,6 @@ public class mailcowUserStorageProvider implements UserStorageProvider,
st.setInt(2, firstResult); st.setInt(2, firstResult);
st.execute(); st.execute();
ResultSet rs = st.getResultSet(); ResultSet rs = st.getResultSet();
logger.info(rs.toString());
List<UserModel> users = new ArrayList<>(); List<UserModel> users = new ArrayList<>();
while (rs.next()) { while (rs.next()) {
users.add(mapUser(realm, rs)); users.add(mapUser(realm, rs));
@ -198,7 +197,7 @@ public class mailcowUserStorageProvider implements UserStorageProvider,
Integer maxResults) { Integer maxResults) {
String search = params.get(UserModel.SEARCH); String search = params.get(UserModel.SEARCH);
logger.info("[mailcow] searchForUser: realm={}, search={}", realm.getName(), search); logger.debug("[mailcow] searchForUser: realm={}, search={}", realm.getName(), search);
try (Connection c = DbUtil.getConnection(this.model)) { try (Connection c = DbUtil.getConnection(this.model)) {
PreparedStatement st; PreparedStatement st;

@ -20,7 +20,7 @@ public class mailcowUserStorageProviderFactory implements UserStorageProviderFac
protected final List<ProviderConfigProperty> configMetadata; protected final List<ProviderConfigProperty> configMetadata;
public mailcowUserStorageProviderFactory() { public mailcowUserStorageProviderFactory() {
logger.info("[mailcow] mailcowUserStorageProviderFactory created"); logger.debug("[mailcow] mailcowUserStorageProviderFactory created");
// Create config metadata // Create config metadata
configMetadata = ProviderConfigurationBuilder.create() configMetadata = ProviderConfigurationBuilder.create()
@ -64,13 +64,13 @@ public class mailcowUserStorageProviderFactory implements UserStorageProviderFac
@Override @Override
public mailcowUserStorageProvider create(KeycloakSession ksession, ComponentModel model) { public mailcowUserStorageProvider create(KeycloakSession ksession, ComponentModel model) {
logger.info("[mailcow] creating new mailcowUserStorageProvider"); logger.debug("[mailcow] creating new mailcowUserStorageProvider");
return new mailcowUserStorageProvider(ksession, model); return new mailcowUserStorageProvider(ksession, model);
} }
@Override @Override
public String getId() { public String getId() {
logger.info("[mailcow] getId()"); logger.debug("[mailcow] getId()");
return "mailcow-user-provider"; return "mailcow-user-provider";
} }
@ -85,9 +85,9 @@ public class mailcowUserStorageProviderFactory implements UserStorageProviderFac
throws ComponentValidationException { throws ComponentValidationException {
try (Connection c = DbUtil.getConnection(config)) { try (Connection c = DbUtil.getConnection(config)) {
logger.info("[mailcow] Testing connection..."); logger.debug("[mailcow] Testing connection...");
c.createStatement().execute(config.get(CONFIG_KEY_VALIDATION_QUERY)); c.createStatement().execute(config.get(CONFIG_KEY_VALIDATION_QUERY));
logger.info("[mailcow] Connection OK !"); logger.debug("[mailcow] Connection OK !");
} catch (Exception ex) { } catch (Exception ex) {
logger.warn("[mailcow] Unable to validate connection: ex={}", ex.getMessage()); logger.warn("[mailcow] Unable to validate connection: ex={}", ex.getMessage());
throw new ComponentValidationException("Unable to validate database connection", ex); throw new ComponentValidationException("Unable to validate database connection", ex);
@ -96,11 +96,11 @@ public class mailcowUserStorageProviderFactory implements UserStorageProviderFac
@Override @Override
public void onUpdate(KeycloakSession session, RealmModel realm, ComponentModel oldModel, ComponentModel newModel) { public void onUpdate(KeycloakSession session, RealmModel realm, ComponentModel oldModel, ComponentModel newModel) {
logger.info("[mailcow] onUpdate()"); logger.debug("[mailcow] onUpdate()");
} }
@Override @Override
public void onCreate(KeycloakSession session, RealmModel realm, ComponentModel model) { public void onCreate(KeycloakSession session, RealmModel realm, ComponentModel model) {
logger.info("[mailcow] onCreate()"); logger.debug("[mailcow] onCreate()");
} }
} }