1818
1919package de .symeda .sormas .backend .user ;
2020
21- import com .nimbusds .jose .util .JSONObjectUtils ;
22- import de .symeda .sormas .api .Language ;
23- import de .symeda .sormas .api .user .UserRole ;
24- import de .symeda .sormas .backend .user .event .*;
25- import net .minidev .json .JSONObject ;
21+ import static java .util .Collections .singletonList ;
22+ import static org .keycloak .representations .IDToken .LOCALE ;
23+
24+ import java .text .ParseException ;
25+ import java .util .Arrays ;
26+ import java .util .Collections ;
27+ import java .util .HashMap ;
28+ import java .util .List ;
29+ import java .util .Map ;
30+ import java .util .Optional ;
31+ import java .util .Set ;
32+ import java .util .stream .Collectors ;
33+
34+ import javax .annotation .PostConstruct ;
35+ import javax .ejb .EJB ;
36+ import javax .ejb .LocalBean ;
37+ import javax .ejb .Stateless ;
38+ import javax .enterprise .event .Observes ;
39+ import javax .ws .rs .WebApplicationException ;
40+ import javax .ws .rs .core .Response ;
41+
2642import org .apache .commons .collections .CollectionUtils ;
2743import org .apache .commons .lang3 .StringUtils ;
2844import org .eclipse .microprofile .config .ConfigProvider ;
3551import org .slf4j .Logger ;
3652import org .slf4j .LoggerFactory ;
3753
38- import javax .annotation .PostConstruct ;
39- import javax .ejb .LocalBean ;
40- import javax .ejb .Stateless ;
41- import javax .enterprise .event .Observes ;
42- import javax .ws .rs .WebApplicationException ;
43- import javax .ws .rs .core .Response ;
44- import java .text .ParseException ;
45- import java .util .Arrays ;
46- import java .util .Collections ;
47- import java .util .HashMap ;
48- import java .util .List ;
49- import java .util .Map ;
50- import java .util .Optional ;
51- import java .util .Set ;
52- import java .util .stream .Collectors ;
54+ import com .nimbusds .jose .util .JSONObjectUtils ;
5355
54- import static java .util .Collections .singletonList ;
55- import static org .keycloak .representations .IDToken .LOCALE ;
56+ import de .symeda .sormas .api .AuthProvider ;
57+ import de .symeda .sormas .api .Language ;
58+ import de .symeda .sormas .api .user .UserRole ;
59+ import de .symeda .sormas .backend .common .ConfigFacadeEjb .ConfigFacadeEjbLocal ;
60+ import de .symeda .sormas .backend .user .event .MockUserCreateEvent ;
61+ import de .symeda .sormas .backend .user .event .PasswordResetEvent ;
62+ import de .symeda .sormas .backend .user .event .UserCreateEvent ;
63+ import de .symeda .sormas .backend .user .event .UserUpdateEvent ;
64+ import net .minidev .json .JSONObject ;
5665
5766/**
5867 * @author Alex Vidrean
@@ -64,6 +73,9 @@ public class KeycloakService {
6473
6574 private final Logger logger = LoggerFactory .getLogger (getClass ());
6675
76+ @ EJB
77+ private ConfigFacadeEjbLocal configFacade ;
78+
6779 private static final String OIDC_REALM = "realm" ;
6880 private static final String OIDC_SERVER_URL = "auth-server-url" ;
6981 private static final String OIDC_CREDENTIALS = "credentials" ;
@@ -80,6 +92,12 @@ public class KeycloakService {
8092
8193 @ PostConstruct
8294 public void init () {
95+
96+ if (!AuthProvider .KEYCLOAK .equalsIgnoreCase (configFacade .getAuthenticationProvider ())) {
97+ logger .info ("Keycloak Auth Provider not active" );
98+ return ;
99+ }
100+
83101 Optional <String > oidcJson = ConfigProvider .getConfig ().getOptionalValue ("sormas.backend.security.oidc.json" , String .class );
84102
85103 if (!oidcJson .isPresent ()) {
@@ -111,17 +129,20 @@ public void handleUserCreateEvent(@Observes UserCreateEvent userCreateEvent) {
111129 return ;
112130 }
113131
132+ User user = userCreateEvent .getUser ();
114133 String password = null ;
115134 if (userCreateEvent instanceof MockUserCreateEvent ) {
116135 password = ((MockUserCreateEvent ) userCreateEvent ).getPassword ();
136+ Optional <UserRepresentation > mockUser = getUserByUsername (keycloak .get (), user .getUserName ());
137+ if (mockUser .isPresent ()) {
138+ logger .info ("Mock user {} already exists. Will not create a new one" , user .getUserName ());
139+ return ;
140+ }
117141 }
118142
119- User user = userCreateEvent .getUser ();
120143 String userId = createUser (keycloak .get (), user , password );
121144 if (StringUtils .isNotBlank (user .getUserEmail ())) {
122145 sendActivationEmail (keycloak .get (), userId );
123- } else {
124- logger .warn ("Cannot send activation email, because the user has no email" );
125146 }
126147 }
127148
@@ -158,18 +179,7 @@ public void handlePasswordResetEvent(@Observes PasswordResetEvent passwordResetE
158179 logger .warn ("Cannot find user to update for username {}" , user .getUserName ());
159180 return ;
160181 }
161-
162- String userId = userRepresentation .get ().getId ();
163-
164- if (passwordResetEvent instanceof MockPasswordUpdateEvent ) {
165- UserRepresentation existingUser = userRepresentation .get ();
166- setCredentials (existingUser , ((MockPasswordUpdateEvent ) passwordResetEvent ).getPassword ());
167- keycloak .get ().realms ().realm (REALM_NAME ).users ().get (userId ).update (existingUser );
168- } else if (StringUtils .isNotBlank (user .getUserEmail ())) {
169- sendPasswordResetEmail (keycloak .get (), userId );
170- } else {
171- logger .warn ("Cannot send password reset email, because the user has no email" );
172- }
182+ userRepresentation .ifPresent (existing -> sendPasswordResetEmail (keycloak .get (), existing .getId ()));
173183 }
174184
175185 private UserRepresentation createUserRepresentation (User user , String password ) {
0 commit comments