Browse Source

feat: update to keycloak 22.0.1 (support new admin console) (#37)

pull/38/head
Hiroyuki Wada 9 months ago
committed by GitHub
parent
commit
2c8da2da4b
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 17
      .github/workflows/pull_request.yml
  2. 40
      .github/workflows/release.yml
  3. 8
      pom.xml
  4. 2
      src/main/java/org/keycloak/social/discord/DiscordIdentityProvider.java
  5. 6
      src/main/java/org/keycloak/social/discord/DiscordIdentityProviderConfig.java
  6. 17
      src/main/java/org/keycloak/social/discord/DiscordIdentityProviderFactory.java
  7. 20
      src/main/java/org/keycloak/social/discord/DiscordUserAttributeMapper.java
  8. 7
      src/main/resources/theme-resources/messages/admin-messages_en.properties
  9. 7
      src/main/resources/theme-resources/resources/partials/realm-identity-provider-discord-ext.html
  10. 144
      src/main/resources/theme-resources/resources/partials/realm-identity-provider-discord.html

17
.github/workflows/pull_request.yml

@ -7,18 +7,13 @@ jobs:
name: Build
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v1
- name: Set up JDK 1.8
uses: actions/setup-java@v1
- uses: actions/checkout@v3
- name: Set up JDK 17
uses: actions/setup-java@v3
with:
java-version: 1.8
- name: Cache for maven
uses: actions/cache@v1
with:
path: ~/.m2/repository
key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
restore-keys: |
${{ runner.os }}-maven-
distribution: 'temurin'
java-version: '17'
cache: 'maven'
- name: Build with Maven
run: mvn -B package

40
.github/workflows/release.yml

@ -11,33 +11,27 @@ jobs:
runs-on: ubuntu-latest
if: "!contains(github.event.head_commit.message, '[ci skip]')"
steps:
- uses: actions/checkout@v1
- name: Set up JDK 1.8
uses: actions/setup-java@v1
- uses: actions/checkout@v3
- name: Set up JDK 17
uses: actions/setup-java@v3
with:
java-version: 1.8
- name: Setup node 10
uses: actions/setup-node@v1
distribution: 'temurin'
java-version: '17'
cache: 'maven'
- name: Setup node
uses: actions/setup-node@v3
with:
node-version: '10.x'
- name: Cache for maven
uses: actions/cache@v1
with:
path: ~/.m2/repository
key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
restore-keys: |
${{ runner.os }}-maven-
- name: Cache for npm
uses: actions/cache@v1
with:
path: ~/.npm
key: ${{ runner.os }}-node-${{ hashFiles('.github/workflows/release.yml') }}
restore-keys: |
${{ runner.os }}-node-
node-version: '16'
cache: 'yarn'
- name: Setup semantic-release
run: npm install -g @conveyal/maven-semantic-release@v4.5.0 semantic-release@15 @semantic-release/exec@v3.3.8
run: |
yarn global add @conveyal/maven-semantic-release@v4.5.0 semantic-release@15
echo "$(yarn global bin)" >> $GITHUB_PATH
- name: Release
run: semantic-release --branch master --use-conveyal-workflow --skip-maven-deploy
# maven-semantic-release requires "maven-settings.xml" in the workspace directory
run: |
mv ~/.m2/settings.xml maven-settings.xml
semantic-release --branch master --use-conveyal-workflow --skip-maven-deploy
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

8
pom.xml

@ -11,7 +11,7 @@
<packaging>jar</packaging>
<properties>
<version.keycloak>17.0.0</version.keycloak>
<version.keycloak>22.0.1</version.keycloak>
</properties>
<dependencies>
@ -46,10 +46,10 @@
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
<version>3.11.0</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<source>17</source>
<target>17</target>
</configuration>
</plugin>
</plugins>

2
src/main/java/org/keycloak/social/discord/DiscordIdentityProvider.java

@ -18,6 +18,7 @@
package org.keycloak.social.discord;
import com.fasterxml.jackson.databind.JsonNode;
import jakarta.ws.rs.core.Response;
import org.jboss.logging.Logger;
import org.keycloak.broker.oidc.AbstractOAuth2IdentityProvider;
import org.keycloak.broker.oidc.mappers.AbstractJsonUserAttributeMapper;
@ -30,7 +31,6 @@ import org.keycloak.models.KeycloakSession;
import org.keycloak.services.ErrorPageException;
import org.keycloak.services.messages.Messages;
import javax.ws.rs.core.Response;
import java.util.Set;
/**

6
src/main/java/org/keycloak/social/discord/DiscordIdentityProviderConfig.java

@ -17,14 +17,14 @@
package org.keycloak.social.discord;
import org.keycloak.broker.oidc.OAuth2IdentityProviderConfig;
import org.keycloak.models.IdentityProviderModel;
import java.util.Arrays;
import java.util.Collections;
import java.util.Set;
import java.util.stream.Collectors;
import org.keycloak.broker.oidc.OAuth2IdentityProviderConfig;
import org.keycloak.models.IdentityProviderModel;
/**
* @author <a href="mailto:wadahiro@gmail.com">Hiroyuki Wada</a>
*/

17
src/main/java/org/keycloak/social/discord/DiscordIdentityProviderFactory.java

@ -17,11 +17,14 @@
package org.keycloak.social.discord;
import org.keycloak.broker.oidc.OAuth2IdentityProviderConfig;
import org.keycloak.broker.provider.AbstractIdentityProviderFactory;
import org.keycloak.broker.social.SocialIdentityProviderFactory;
import org.keycloak.models.IdentityProviderModel;
import org.keycloak.models.KeycloakSession;
import org.keycloak.provider.ProviderConfigProperty;
import org.keycloak.provider.ProviderConfigurationBuilder;
import java.util.List;
/**
* @author <a href="mailto:wadahiro@gmail.com">Hiroyuki Wada</a>
@ -46,6 +49,18 @@ public class DiscordIdentityProviderFactory extends AbstractIdentityProviderFact
return new DiscordIdentityProviderConfig();
}
@Override
public List<ProviderConfigProperty> getConfigProperties() {
return ProviderConfigurationBuilder.create()
.property()
.name("allowedGuilds")
.type(ProviderConfigProperty.STRING_TYPE)
.label("Guild Id(s) to allow federation")
.helpText("If you want to allow federation for specific guild, enter the guild id. Please use a comma as a separator for multiple guilds.")
.add()
.build();
}
@Override
public String getId() {
return PROVIDER_ID;

20
src/main/java/org/keycloak/social/discord/DiscordUserAttributeMapper.java

@ -21,21 +21,21 @@ import org.keycloak.broker.oidc.mappers.AbstractJsonUserAttributeMapper;
/**
* User attribute mapper.
*
*
* @author dannyAAM
*/
public class DiscordUserAttributeMapper extends AbstractJsonUserAttributeMapper {
private static final String[] cp = new String[] { DiscordIdentityProviderFactory.PROVIDER_ID };
private static final String[] cp = new String[]{DiscordIdentityProviderFactory.PROVIDER_ID};
@Override
public String[] getCompatibleProviders() {
return cp;
}
@Override
public String[] getCompatibleProviders() {
return cp;
}
@Override
public String getId() {
return "discord-user-attribute-mapper";
}
@Override
public String getId() {
return "discord-user-attribute-mapper";
}
}

7
src/main/resources/theme-resources/messages/admin-messages_en.properties

@ -1,7 +0,0 @@
discord-client-id=Client Id
discord-client-secret=Client Secret
discord-allowed-guilds=Guild Id(s) to allow federation
discord.client-id.tooltip=Client Id for the application you created in your discord developer portal.
discord.client-secret.tooltip=Client Secret for the application that you created in your discord developer portal.
discord.allowed-guilds.tooltip=If you want to allow federation for specific guild, enter the guild id. Please use a comma as a separator for multiple guilds.
discord.default-scopes.tooltip=The scopes to be sent when asking for authorization. See discord OAuth2 documentation for possible values. If you do not specify anything, scope defaults to 'identify email' In addition, plus 'guilds' if you enter guild id(s) to allow federation.

7
src/main/resources/theme-resources/resources/partials/realm-identity-provider-discord-ext.html

@ -1,7 +0,0 @@
<div class="form-group clearfix">
<label class="col-md-2 control-label" for="allowdGuilds">{{:: 'discord-allowed-guilds' | translate}}</label>
<div class="col-md-6">
<input class="form-control" id="baseUrl" type="text" ng-model="identityProvider.config.allowedGuilds">
</div>
<kc-tooltip>{{:: 'discord.allowed-guilds.tooltip' | translate}}</kc-tooltip>
</div>

144
src/main/resources/theme-resources/resources/partials/realm-identity-provider-discord.html

@ -1,144 +0,0 @@
<div class="col-sm-9 col-md-10 col-sm-push-3 col-md-push-2">
<ol class="breadcrumb">
<li><a href="#/realms/{{realm.realm}}/identity-provider-settings">{{:: 'identity-providers' | translate}}</a></li>
<li data-ng-hide="newIdentityProvider">{{provider.name}}</li>
<li data-ng-show="newIdentityProvider">{{:: 'add-identity-provider' | translate}}</li>
</ol>
<kc-tabs-identity-provider></kc-tabs-identity-provider>
<form class="form-horizontal" name="realmForm" novalidate kc-read-only="!access.manageIdentityProviders">
<fieldset>
<div class="form-group clearfix">
<label class="col-md-2 control-label" for="redirectUri">{{:: 'redirect-uri' | translate}}</label>
<div class="col-sm-6">
<input class="form-control" id="redirectUri" type="text" value="{{callbackUrl}}{{identityProvider.alias}}/endpoint" readonly kc-select-action="click">
</div>
<kc-tooltip>{{:: 'redirect-uri.tooltip' | translate}}</kc-tooltip>
</div>
</fieldset>
<fieldset>
<div class="form-group clearfix">
<label class="col-md-2 control-label" for="clientId"><span class="required">*</span> {{:: 'discord-client-id' | translate}}</label>
<div class="col-md-6">
<input class="form-control" id="clientId" type="text" ng-model="identityProvider.config.clientId" required>
</div>
<kc-tooltip>{{:: 'discord.client-id.tooltip' | translate}}</kc-tooltip>
</div>
<div class="form-group clearfix">
<label class="col-md-2 control-label" for="clientSecret"><span class="required">*</span> {{:: 'discord-client-secret' | translate}}</label>
<div class="col-md-6">
<input class="form-control" id="clientSecret" kc-password ng-model="identityProvider.config.clientSecret" required>
</div>
<kc-tooltip>{{:: 'discord.client-secret.tooltip' | translate}}</kc-tooltip>
</div>
<div data-ng-include data-src="resourceUrl + '/partials/realm-identity-provider-' + identityProvider.providerId + '-ext.html'"></div>
<div class="form-group clearfix">
<label class="col-md-2 control-label" for="defaultScope">{{:: 'default-scopes' | translate}} </label>
<div class="col-md-6">
<input class="form-control" id="defaultScope" type="text" ng-model="identityProvider.config.defaultScope">
</div>
<kc-tooltip>{{:: 'discord.default-scopes.tooltip' | translate}}</kc-tooltip>
</div>
<div class="form-group">
<label class="col-md-2 control-label" for="enabled">{{:: 'store-tokens' | translate}}</label>
<div class="col-md-6">
<input ng-model="identityProvider.storeToken" id="storeToken" onoffswitch on-text="{{:: 'onText' | translate}}" off-text="{{:: 'offText' | translate}}" />
</div>
<kc-tooltip>{{:: 'identity-provider.store-tokens.tooltip' | translate}}</kc-tooltip>
</div>
<div class="form-group">
<label class="col-md-2 control-label" for="storedTokensReadable">{{:: 'stored-tokens-readable' | translate}}</label>
<div class="col-md-6">
<input ng-model="identityProvider.addReadTokenRoleOnCreate" id="storedTokensReadable" onoffswitch on-text="{{:: 'onText' | translate}}" off-text="{{:: 'offText' | translate}}" />
</div>
<kc-tooltip>{{:: 'identity-provider.stored-tokens-readable.tooltip' | translate}}</kc-tooltip>
</div>
<div class="form-group">
<label class="col-md-2 control-label" for="enabled">{{:: 'enabled' | translate}}</label>
<div class="col-md-6">
<input ng-model="identityProvider.enabled" id="enabled" onoffswitch on-text="{{:: 'onText' | translate}}" off-text="{{:: 'offText' | translate}}" />
</div>
<kc-tooltip>{{:: 'identity-provider.enabled.tooltip' | translate}}</kc-tooltip>
</div>
<div class="form-group">
<label class="col-md-2 control-label" for="trustEmail">{{:: 'trust-email' | translate}}</label>
<div class="col-md-6">
<input ng-model="identityProvider.trustEmail" name="identityProvider.trustEmail" id="trustEmail" onoffswitch on-text="{{:: 'onText' | translate}}" off-text="{{:: 'offText' | translate}}" />
</div>
<kc-tooltip>{{:: 'trust-email.tooltip' | translate}}</kc-tooltip>
</div>
<div class="form-group">
<label class="col-md-2 control-label" for="linkOnly">{{:: 'link-only' | translate}}</label>
<div class="col-md-6">
<input ng-model="identityProvider.linkOnly" name="identityProvider.trustEmail" id="linkOnly" onoffswitch on-text="{{:: 'onText' | translate}}" off-text="{{:: 'offText' | translate}}" />
</div>
<kc-tooltip>{{:: 'link-only.tooltip' | translate}}</kc-tooltip>
</div>
<div class="form-group">
<label class="col-md-2 control-label" for="hideOnLoginPage">{{:: 'hide-on-login-page' | translate}}</label>
<div class="col-md-6">
<input ng-model="identityProvider.config.hideOnLoginPage" name="identityProvider.config.hideOnLoginPage" id="hideOnLoginPage" onoffswitchvalue on-text="{{:: 'onText' | translate}}" off-text="{{:: 'offText' | translate}}" />
</div>
<kc-tooltip>{{:: 'hide-on-login-page.tooltip' | translate}}</kc-tooltip>
</div>
<div class="form-group">
<label class="col-md-2 control-label" for="guiOrder">{{:: 'gui-order' | translate}}</label>
<div class="col-md-6">
<input class="form-control" id="guiOrder" type="text" ng-model="identityProvider.config.guiOrder">
</div>
<kc-tooltip>{{:: 'gui-order.tooltip' | translate}}</kc-tooltip>
</div>
<div class="form-group">
<label class="col-md-2 control-label" for="firstBrokerLoginFlowAlias">{{:: 'first-broker-login-flow' | translate}}</label>
<div class="col-md-6">
<div>
<select class="form-control" id="firstBrokerLoginFlowAlias"
ng-model="identityProvider.firstBrokerLoginFlowAlias"
ng-options="flow.alias as flow.alias for flow in authFlows"
required>
</select>
</div>
</div>
<kc-tooltip>{{:: 'first-broker-login-flow.tooltip' | translate}}</kc-tooltip>
</div>
<div class="form-group">
<label class="col-md-2 control-label" for="postBrokerLoginFlowAlias">{{:: 'post-broker-login-flow' | translate}}</label>
<div class="col-md-6">
<div>
<select class="form-control" id="postBrokerLoginFlowAlias"
ng-model="identityProvider.postBrokerLoginFlowAlias"
ng-options="flow.alias as flow.alias for flow in postBrokerAuthFlows">
</select>
</div>
</div>
<kc-tooltip>{{:: 'post-broker-login-flow.tooltip' | translate}}</kc-tooltip>
</div>
<div class="form-group">
<label class="col-md-2 control-label" for="prompt">{{:: 'prompt' | translate}}</label>
<div class="col-md-6">
<div>
<select class="form-control" id="prompt" ng-model="identityProvider.config.prompt">
<option value="">{{:: 'unspecified.option' | translate}}</option>
<option value="none">{{:: 'none.option' | translate}}</option>
<option value="consent">{{:: 'consent.option' | translate}}</option>
<option value="login">{{:: 'login.option' | translate}}</option>
<option value="select_account">{{:: 'select-account.option' | translate}}</option>
</select>
</div>
</div>
<kc-tooltip>{{:: 'prompt.tooltip' | translate}}</kc-tooltip>
</div>
</fieldset>
<div class="form-group">
<div class="col-md-10 col-md-offset-2">
<button kc-save data-ng-disabled="!changed">{{:: 'save' | translate}}</button>
<button kc-cancel data-ng-click="cancel()" data-ng-disabled="!changed">{{:: 'cancel' | translate}}</button>
</div>
</div>
</form>
</div>
<kc-menu></kc-menu>
Loading…
Cancel
Save