From fadb5b9a0a8fc223a5cbfd3910016b01e7a01743 Mon Sep 17 00:00:00 2001 From: Jason Dicker <110084728+jasondicker@users.noreply.github.com> Date: Mon, 20 Jan 2025 09:58:07 +0200 Subject: [PATCH] Fix/keycloak (#1199) yoma-628: The system is currently sending SMS login OTPs to unregistered numbers. yoma-631: Cellphone number input asks for +27, although only requires 0 yoma-633: A registered cellphone number can initiate sign up process --- .../jars/keycloak-phone-provider.jar | Bin 3425211 -> 3425332 bytes .../keycloak-phone-provider.resources.jar | Bin 139199 -> 139176 bytes .../jars/keycloak-sms-provider-dummy.jar | Bin 5029 -> 5029 bytes .../jars/keycloak-sms-provider-twilio.jar | Bin 11046751 -> 11046751 bytes .../main/resources/theme/phone/login/info.ftl | 1 + .../phone/login/login-reset-password.ftl | 2 +- .../phone/login/login-update-phone-number.ftl | 2 +- .../resources/theme/phone/login/login.ftl | 2 +- .../phone/login/register-user-profile.ftl | 2 +- .../providers/rest/TokenCodeResource.java | 14 ++++++++------ 10 files changed, 13 insertions(+), 10 deletions(-) diff --git a/src/keycloak/providers/jars/keycloak-phone-provider.jar b/src/keycloak/providers/jars/keycloak-phone-provider.jar index 8b751e4a606cca61fa928378afe511218de8d123..0e94c6442608343eb447183ed01d3ae1877d02c6 100644 GIT binary patch delta 4927 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 delta 4792 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 LLvO$V{*eC%`G0@o diff --git a/src/keycloak/providers/jars/keycloak-sms-provider-dummy.jar b/src/keycloak/providers/jars/keycloak-sms-provider-dummy.jar index 1d15064c0b6e3ed989c590e974afbbb36fab8cc8..2d9b47f07daadbaf5917fbee5623dfe6f428130a 100644 GIT binary patch delta 257 zcmZ3gzEqtzz?+$ci-CcIfnklW$wXciW)Nl42&Q((fvKCCAZjuzqY;?4VzdC$rHoEs zdKaT7^J<_x8gF+pfcTrgGWjxt8Ln(s*}y7fdAEV-YrH04nwQTW zO#Accf$0W5OEA5M4`LG|zXzD_!yg2u7xG7fZT`z|3+CGjSb=Fqe(A|m1t6|DDv$ye T(-CY3(VMpk7BGSZG=*yb)YeZ+ delta 257 zcmZ3gzEqtzz?+$ci-CcIfkDLEa3Ze?Gl(*21XDZYz|>7m5H*>V(FjaiFQbs2* zy^GP4Sr{nK#-t18n=xsD>0~B|x_L|?ApYjBOuo!uhAZ1uHn0j=-fdv|8m|eM=H;^o z)Bb#VV7h_N5=`&mgV@B#?*Zof@CSkEh5V6VoB#6Lg88-rR$!WuUwZOX0f=jk3Z#I= TbOhT$^yY1X1&m+;P2m~e z8*?xhZp_1cEPw|Ku?R(2jAAUoQY?cPB`C#mtUwvc;loO-f*%#AL={$J4c4L>>#!a* zs6`z%U?Vo69-9%s7BpZhg4l-bXv7Ze#4hYc6ZT*)_F+GoaR3K#2#0Y5M{x|tA>#yE za1y6*8m(wUJI>%N&Y=V6aRC=`2_am@6n#uGe+hG%$=7Z}Efo>pV6A!GUUfHxMO)M%P9@oDRf@J$=%USw zB*;vzT&-JwfNL{uVqBSVXUw?u-OYvW%x9k8v+pzS?94t{k+5W8Zwkm}n&SHcUYt?3jva$j5Zdz)TdtfkG5v7G|Rub1)b4 zFdqxx#6m2>Vz{sbOHqPlD8+KDz)HALhH|We2NkG<7pt)bK2)I^HCT&vSdUt4z(#CB z9qO?eTd)-k*aklu5x{orz)tK!6Lw<{_F^BJu^$I;5Qor$!#IMYIELdmfs;6eAWowd zXK)th(1vz&;5;tiB06yimvIGG5yCZG#|_-XEp*{F?jVc^^nc%tyXZkL?x7F&5k)^9 z;2|Di0D~C9V?4nyo+5^4c#aXMc!8IAg;9)Y871Bp(w9#w`V;Svjnwxy{v}UOYO`5< z(wAS&w+OEuv<8cC#*MS~geWt@XhKvQ3$1?li(>V6LX_lMrGVC#6z*L6xrVkUDSWxs zeU6t&}qD^tR)-x&?21YY9}-Xeh{Qh0~=S}^q?^wao)Zv*LmJ!q|i=`NG;>c>zz F{0~PyuIB&% diff --git a/src/keycloak/providers/keycloak-phone-provider.resources/src/main/resources/theme/phone/login/info.ftl b/src/keycloak/providers/keycloak-phone-provider.resources/src/main/resources/theme/phone/login/info.ftl index 789727064..c5a230e90 100644 --- a/src/keycloak/providers/keycloak-phone-provider.resources/src/main/resources/theme/phone/login/info.ftl +++ b/src/keycloak/providers/keycloak-phone-provider.resources/src/main/resources/theme/phone/login/info.ftl @@ -10,6 +10,7 @@

${message.summary}<#if requiredActions??><#list requiredActions>: <#items as reqActionItem>${kcSanitize(msg("requiredAction.${reqActionItem}"))?no_esc}<#sep>, <#else>

<#if skipLink??> +

TODO: skipLink

<#else> <#if pageRedirectUri?has_content>

${kcSanitize(msg("backToApplication"))?no_esc}

diff --git a/src/keycloak/providers/keycloak-phone-provider.resources/src/main/resources/theme/phone/login/login-reset-password.ftl b/src/keycloak/providers/keycloak-phone-provider.resources/src/main/resources/theme/phone/login/login-reset-password.ftl index 6f2866721..930ff5de1 100644 --- a/src/keycloak/providers/keycloak-phone-provider.resources/src/main/resources/theme/phone/login/login-reset-password.ftl +++ b/src/keycloak/providers/keycloak-phone-provider.resources/src/main/resources/theme/phone/login/login-reset-password.ftl @@ -73,7 +73,7 @@ -
diff --git a/src/keycloak/providers/keycloak-phone-provider.resources/src/main/resources/theme/phone/login/login-update-phone-number.ftl b/src/keycloak/providers/keycloak-phone-provider.resources/src/main/resources/theme/phone/login/login-update-phone-number.ftl index 675805e99..abf6a17f4 100644 --- a/src/keycloak/providers/keycloak-phone-provider.resources/src/main/resources/theme/phone/login/login-update-phone-number.ftl +++ b/src/keycloak/providers/keycloak-phone-provider.resources/src/main/resources/theme/phone/login/login-update-phone-number.ftl @@ -19,7 +19,7 @@ - diff --git a/src/keycloak/providers/keycloak-phone-provider.resources/src/main/resources/theme/phone/login/login.ftl b/src/keycloak/providers/keycloak-phone-provider.resources/src/main/resources/theme/phone/login/login.ftl index 384996aff..fd70f32e8 100644 --- a/src/keycloak/providers/keycloak-phone-provider.resources/src/main/resources/theme/phone/login/login.ftl +++ b/src/keycloak/providers/keycloak-phone-provider.resources/src/main/resources/theme/phone/login/login.ftl @@ -80,7 +80,7 @@ - diff --git a/src/keycloak/providers/keycloak-phone-provider.resources/src/main/resources/theme/phone/login/register-user-profile.ftl b/src/keycloak/providers/keycloak-phone-provider.resources/src/main/resources/theme/phone/login/register-user-profile.ftl index f3c18ef8c..bddae3445 100644 --- a/src/keycloak/providers/keycloak-phone-provider.resources/src/main/resources/theme/phone/login/register-user-profile.ftl +++ b/src/keycloak/providers/keycloak-phone-provider.resources/src/main/resources/theme/phone/login/register-user-profile.ftl @@ -43,7 +43,7 @@ - diff --git a/src/keycloak/providers/keycloak-phone-provider/src/main/java/cc/coopersoft/keycloak/phone/providers/rest/TokenCodeResource.java b/src/keycloak/providers/keycloak-phone-provider/src/main/java/cc/coopersoft/keycloak/phone/providers/rest/TokenCodeResource.java index 6e51662af..f54150d52 100644 --- a/src/keycloak/providers/keycloak-phone-provider/src/main/java/cc/coopersoft/keycloak/phone/providers/rest/TokenCodeResource.java +++ b/src/keycloak/providers/keycloak-phone-provider/src/main/java/cc/coopersoft/keycloak/phone/providers/rest/TokenCodeResource.java @@ -55,12 +55,14 @@ public Response getTokenCode(@NotBlank @QueryParam("phoneNumber") String phoneNu throw new BadRequestException("Phone number is invalid"); } - // everybody phones authenticator send AUTH code - if (!TokenCodeType.REGISTRATION.equals(tokenCodeType) - && !TokenCodeType.AUTH.equals(tokenCodeType) - && !TokenCodeType.VERIFY.equals(tokenCodeType) - && Utils.findUserByPhone(session, session.getContext().getRealm(), phoneNumber).isEmpty()) { - throw new ForbiddenException("Phone number not found"); + // check if phone number exists + boolean phoneNumberExists = !Utils.findUserByPhone(session, session.getContext().getRealm(), phoneNumber).isEmpty(); + + // check if the phone number is valid for the requested operation + if ((TokenCodeType.AUTH.equals(tokenCodeType) || TokenCodeType.RESET.equals(tokenCodeType)) && !phoneNumberExists) { + throw new ForbiddenException("We can't find your number, sign up first if you haven't."); + } else if (TokenCodeType.REGISTRATION.equals(tokenCodeType) && phoneNumberExists) { + throw new ForbiddenException("This phone number is already registered. Sign in or use a different number."); } logger.info(String.format("Requested %s code to %s", tokenCodeType.label, phoneNumber));