Skip to content

Commit

Permalink
fix default Locale choice,
Browse files Browse the repository at this point in the history
  • Loading branch information
cooperlyt committed Aug 10, 2024
1 parent 8da690c commit 41bf0fc
Show file tree
Hide file tree
Showing 13 changed files with 57 additions and 46 deletions.
22 changes: 15 additions & 7 deletions docker/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -26,30 +26,38 @@ COPY providers/keycloak-phone-provider.resources.jar /opt/keycloak/providers/
#dummy provider
COPY providers/keycloak-sms-provider-dummy.jar /opt/keycloak/providers/

#yuntongxin provider
#yuntongxin sms provider
COPY providers/keycloak-sms-provider-cloopen.jar /opt/keycloak/providers/

#totalvoice provider
#totalvoice sms provider
COPY providers/keycloak-sms-provider-totalvoice.jar /opt/keycloak/providers/

#twilio provider
#twilio sms provider
COPY providers/keycloak-sms-provider-twilio.jar /opt/keycloak/providers/

#yunxin provider
#yunxin sms provider
COPY providers/keycloak-sms-provider-yunxin.jar /opt/keycloak/providers/

#tencent provider
#tencent sms provider
COPY providers/keycloak-sms-provider-tencent.jar /opt/keycloak/providers/

#aliyun provider
#aliyun sms provider
COPY providers/keycloak-sms-provider-aliyun.jar /opt/keycloak/providers/

#aws provider
#aws sms provider
COPY providers/keycloak-sms-provider-aws-sns.jar /opt/keycloak/providers/

#bulksms sms provider
COPY providers/keycloak-sms-provider-bulksms.jar /opt/keycloak/providers/

#Two-factor sms provider
COPY providers/keycloak-sms-provider-twofactor.jar /opt/keycloak/providers/

#wx app provider
COPY providers/keycloak-wx-provider-app.jar /opt/keycloak/providers/



RUN mkdir /opt/keycloak/certs

RUN /opt/keycloak/bin/kc.sh build
Expand Down
1 change: 1 addition & 0 deletions examples/docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ services:
- 8080:8080
command:
- start-dev
- --spi-phone-default-service=dummy
environment:
KEYCLOAK_ADMIN: admin
KEYCLOAK_ADMIN_PASSWORD: admin
Expand Down
3 changes: 3 additions & 0 deletions examples/start.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
#!/bin/sh

docker run -p 8080:8080 -e KEYCLOAK_ADMIN=admin -e KEYCLOAK_ADMIN_PASSWORD=admin coopersoft/keycloak:25.0.2_phone-2.4.1-snapshot start-dev --spi-phone-default-service=dummy
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@
import com.google.i18n.phonenumbers.PhoneNumberUtil.PhoneNumberFormat;

import jakarta.validation.constraints.NotNull;
import org.keycloak.utils.StringUtil;

import java.util.*;
import java.util.function.Predicate;
import java.util.regex.Pattern;
Expand Down Expand Up @@ -77,7 +79,10 @@ private static Optional<String> localeToCountry(String locale) {
private static String defaultRegion(KeycloakSession session) {
var defaultRegion = session.getProvider(PhoneProvider.class).defaultPhoneRegion();
return defaultRegion
.orElseGet(() -> localeToCountry(session.getContext().getRealm().getDefaultLocale()).orElse(null));
.orElseGet(() -> OptionalUtils.ofBlank(session.getContext().getRealm().getDefaultLocale())
.flatMap(Utils::localeToCountry)
.orElseGet(() -> Locale.getDefault().getCountry())
);
}

/**
Expand All @@ -92,7 +97,10 @@ public static String canonicalizePhoneNumber(KeycloakSession session, @NotNull S
var phoneNumberUtil = PhoneNumberUtil.getInstance();
var resultPhoneNumber = phoneNumber.trim();
var defaultRegion = defaultRegion(session);

logger.info(String.format("default region '%s' will be used", defaultRegion));


try {
var parsedNumber = phoneNumberUtil.parse(resultPhoneNumber, defaultRegion);
if (provider.validPhoneNumber() && !phoneNumberUtil.isValidNumber(parsedNumber)) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package cc.coopersoft.keycloak.phone.providers.spi;

import cc.coopersoft.common.OptionalUtils;
import cc.coopersoft.keycloak.phone.Utils;
import cc.coopersoft.keycloak.phone.providers.constants.TokenCodeType;
import cc.coopersoft.keycloak.phone.providers.exception.MessageSendException;
Expand Down Expand Up @@ -65,9 +66,13 @@ private Optional<String> localizeMessage(TokenCodeType type, String phoneNumber,
final Optional<String> userLocale = user.map(u -> u.getFirstAttribute(UserModel.LOCALE));

// Use locale from user or default to realm locale
final String localeName = userLocale.isPresent() ? userLocale.get()
: session.getContext().getRealm().getDefaultLocale();
final Locale locale = Locale.forLanguageTag(localeName);
final String localeName = userLocale.orElseGet(() -> session.getContext().getRealm().getDefaultLocale());


final Locale locale = OptionalUtils.ofBlank(localeName).map(Locale::forLanguageTag).orElseGet(() -> {
logger.warn("user's locale and realm's default locale is not config,sms message language Locale.getDefault will be used!");
return Locale.getDefault();
}) ;

// Get message template from login theme bundle
final Properties messages = loginTheme.getMessages(locale);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,8 @@ public class DefaultPhoneProvider implements PhoneProvider {
this.service
+ "' will be used. You can use keycloak start param '--spi-phone-default-service' to specify a different one. ");

logger.info("SMS sender provider '" + this.service + "' will be used!");

this.tokenExpiresIn = config.getInt("tokenExpiresIn", 60);
this.targetHourMaximum = config.getInt("targetHourMaximum", 3);
this.sourceHourMaximum = config.getInt("sourceHourMaximum", 10);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,17 +1,15 @@
# Twilio SMS Sender Provider

**Not verify in Quarkus 19.0.1**
**Not verify **

```sh
cp target/providers/keycloak-phone-provider.jar ${KEYCLOAK_HOME}/providers/
cp target/providers/keycloak-phone-provider.resources.jar ${KEYCLOAK_HOME}/providers/
cp target/providers/keycloak-sms-provider-twilio.jar ${KEYCLOAK_HOME}/providers/
cp target/providers/keycloak-sms-provider-twofactor.jar ${KEYCLOAK_HOME}/providers/


${KEYCLOAK_HOME}/bin/kc.sh build

${KEYCLOAK_HOME}/bin/kc.sh start --spi-phone-default-service=twilio \
--spi-message-sender-service-twilio-account=${account} \
--spi-message-sender-service-twilio-token=${token} \
--spi-message-sender-service-twilio-number=${servicePhoneNumber}
${KEYCLOAK_HOME}/bin/kc.sh start --spi-phone-default-service=twofactor \
--spi-message-sender-service-twofactor-key=${key}
```
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
<version>2.4.1-snapshot</version>
</parent>

<artifactId>keycloak-sms-provider-twofactorapi</artifactId>
<artifactId>keycloak-sms-provider-twofactor</artifactId>

<dependencies>
<dependency>
Expand All @@ -19,22 +19,14 @@
<version>2.4.1-snapshot</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.twilio.sdk</groupId>
<artifactId>twilio</artifactId>
<version>9.2.4</version>
</dependency>

<!-- https://mvnrepository.com/artifact/com.squareup.okhttp3/okhttp -->
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>4.10.0</version>
</dependency>
<dependency>
<groupId>jakarta.annotation</groupId>
<artifactId>jakarta.annotation-api</artifactId>
<version>3.0.0</version>
</dependency>


</dependencies>

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,6 @@ public void close() {

@Override
public String getId() {
return "two-factor";
return "twofactor";
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,40 +9,34 @@
import org.keycloak.Config.Scope;
import org.keycloak.models.KeycloakSession;

import jakarta.annotation.PostConstruct;

public class TwoFactorSmsSenderServiceProvider extends FullSmsSenderAbstractService {

private static final Logger logger = Logger.getLogger(TwoFactorSmsSenderServiceProvider.class);
private String twoFactorApiKey;
private final String apiKey;
private static final String twoFactorUrl = "https://2factor.in/API/V1/";
private OkHttpClient client;

@PostConstruct
public void doSetUp() {
client = new OkHttpClient().newBuilder()
.build();
}
private final OkHttpClient client;

TwoFactorSmsSenderServiceProvider(KeycloakSession session, Scope config) {
super(session);
this.twoFactorApiKey = config.get("twoFactorApiKey");
apiKey = config.get("key");
client = new OkHttpClient().newBuilder()
.build();

}

@Override
public void sendMessage(String phoneNumber, String message) throws MessageSendException {

Request request = new Request.Builder()
.url(twoFactorUrl + twoFactorApiKey + "/SMS/" + phoneNumber + "/AUTOGEN/OTP1")
.url(twoFactorUrl + apiKey + "/SMS/" + phoneNumber + "/AUTOGEN/OTP1")
.get()
.build();
try (Response response = client.newCall(request).execute()) {
String responseString = response.body().string();
if (response.isSuccessful()) {

if (response.isSuccessful() && response.body() != null) {
String responseString = response.body().string();
logger.info(responseString + ": sms sent successfully");
} else {
logger.error(responseString + ": sms sending failed");
throw new MessageSendException(response.code(),
String.valueOf(response.code()),
response.message());
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
cc.coopersoft.keycloak.phone.providers.sender.TwoFactorMessageSenderServiceProviderFactory

This file was deleted.

2 changes: 1 addition & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,7 @@
<module>keycloak-sms-provider-yunxin</module>
<module>keycloak-sms-provider-aliyun</module>
<module>keycloak-sms-provider-tencent</module>
<module>keycloak-sms-provider-twofactorapi</module>
<module>keycloak-sms-provider-twofactor</module>
<module>keycloak-wx-provider-app</module>
</modules>

Expand Down

0 comments on commit 41bf0fc

Please sign in to comment.