diff --git a/dossierfacile-api-owner/src/main/java/fr/dossierfacile/api/dossierfacileapiowner/register/RegisterServiceImpl.java b/dossierfacile-api-owner/src/main/java/fr/dossierfacile/api/dossierfacileapiowner/register/RegisterServiceImpl.java index bf8cdbb4e..a292540a8 100644 --- a/dossierfacile-api-owner/src/main/java/fr/dossierfacile/api/dossierfacileapiowner/register/RegisterServiceImpl.java +++ b/dossierfacile-api-owner/src/main/java/fr/dossierfacile/api/dossierfacileapiowner/register/RegisterServiceImpl.java @@ -67,8 +67,6 @@ public OwnerModel register(AccountForm accountForm) { String email = accountForm.getEmail(); Owner owner = ownerRepository.findByEmailAndEnabledFalse(email) .orElse(Owner.builder().email(email).build()); - // TODO : useless ? - owner.setPassword(bCryptPasswordEncoder.encode(accountForm.getPassword())); owner.setKeycloakId(keycloakService.createKeycloakUserAccountCreation(accountForm, owner)); owner.setFranceConnect(false); ownerRepository.save(owner); @@ -99,7 +97,6 @@ public OwnerModel createPassword(String token, String password) { .orElseThrow(() -> new PasswordRecoveryTokenNotFoundException(token)); User user = passwordRecoveryToken.getUser(); user.setEnabled(true); - user.setPassword(bCryptPasswordEncoder.encode(password)); if (user.getKeycloakId() == null || user.getKeycloakId().isBlank()) { var keycloakId = keycloakService.getKeycloakId(user.getEmail()); if (keycloakId == null) { diff --git a/dossierfacile-api-tenant/src/main/java/fr/dossierfacile/api/front/controller/RegisterController.java b/dossierfacile-api-tenant/src/main/java/fr/dossierfacile/api/front/controller/RegisterController.java index e968db19b..bf1da283f 100644 --- a/dossierfacile-api-tenant/src/main/java/fr/dossierfacile/api/front/controller/RegisterController.java +++ b/dossierfacile-api-tenant/src/main/java/fr/dossierfacile/api/front/controller/RegisterController.java @@ -32,13 +32,6 @@ public class RegisterController { private final AuthenticationFacade authenticationFacade; private final LogService logService; - @PostMapping(value = "/account", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) - public ResponseEntity account(@Validated(Dossier.class) @RequestBody AccountForm accountForm) { - TenantModel tenantModel = tenantService.saveStepRegister(null, accountForm, StepRegister.ACCOUNT); - logService.saveLog(LogType.ACCOUNT_CREATED, tenantModel.getId()); - return ok(tenantModel); - } - @PreAuthorize("hasPermissionOnTenant(#namesForm.tenantId)") @PostMapping(value = "/names", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) public ResponseEntity names(@Validated(Dossier.class) @RequestBody NamesForm namesForm) { diff --git a/dossierfacile-api-tenant/src/main/java/fr/dossierfacile/api/front/mapper/TenantMapper.java b/dossierfacile-api-tenant/src/main/java/fr/dossierfacile/api/front/mapper/TenantMapper.java index 457b8f30f..902fd4e99 100644 --- a/dossierfacile-api-tenant/src/main/java/fr/dossierfacile/api/front/mapper/TenantMapper.java +++ b/dossierfacile-api-tenant/src/main/java/fr/dossierfacile/api/front/mapper/TenantMapper.java @@ -42,7 +42,6 @@ public void setCategoriesMapper(CategoriesMapper categoriesMapper) { this.categoriesMapper = categoriesMapper; } - @Mapping(target = "passwordEnabled", expression = "java(tenant.getPassword() != null)") public abstract TenantModel toTenantModel(Tenant tenant, @Context UserApi userApi); @Mapping(target = "name", expression = "java((document.getWatermarkFile() != null )? applicationBaseUrl + \"/" + PATH + "/\" + document.getName() : null)") diff --git a/dossierfacile-api-tenant/src/main/java/fr/dossierfacile/api/front/model/tenant/TenantModel.java b/dossierfacile-api-tenant/src/main/java/fr/dossierfacile/api/front/model/tenant/TenantModel.java index af3328a21..07555c50e 100644 --- a/dossierfacile-api-tenant/src/main/java/fr/dossierfacile/api/front/model/tenant/TenantModel.java +++ b/dossierfacile-api-tenant/src/main/java/fr/dossierfacile/api/front/model/tenant/TenantModel.java @@ -33,6 +33,5 @@ public class TenantModel { private List documents; private List guarantors; private boolean franceConnect; - private boolean passwordEnabled; private String warningMessage; } diff --git a/dossierfacile-api-tenant/src/main/java/fr/dossierfacile/api/front/register/enums/StepRegister.java b/dossierfacile-api-tenant/src/main/java/fr/dossierfacile/api/front/register/enums/StepRegister.java index 089d62ef3..a813486da 100644 --- a/dossierfacile-api-tenant/src/main/java/fr/dossierfacile/api/front/register/enums/StepRegister.java +++ b/dossierfacile-api-tenant/src/main/java/fr/dossierfacile/api/front/register/enums/StepRegister.java @@ -13,7 +13,6 @@ import fr.dossierfacile.api.front.register.guarantor.natural_person.NameGuarantorNaturalPerson; import fr.dossierfacile.api.front.register.guarantor.organism.DocumentGuaranteeProviderCertificate; import fr.dossierfacile.api.front.register.guarantor.organism.DocumentIdentificationGuarantorOrganism; -import fr.dossierfacile.api.front.register.tenant.Account; import fr.dossierfacile.api.front.register.tenant.AccountApiPartner; import fr.dossierfacile.api.front.register.tenant.Application; import fr.dossierfacile.api.front.register.tenant.DocumentFinancial; @@ -29,7 +28,6 @@ @Getter public enum StepRegister { ACCOUNT_PARTNER_API(AccountApiPartner.class), - ACCOUNT(Account.class), NAMES(Names.class), APPLICATION(Application.class), HONOR_DECLARATION(HonorDeclaration.class), diff --git a/dossierfacile-api-tenant/src/main/java/fr/dossierfacile/api/front/register/form/tenant/AccountForm.java b/dossierfacile-api-tenant/src/main/java/fr/dossierfacile/api/front/register/form/tenant/AccountForm.java index 423235b17..ac999896d 100644 --- a/dossierfacile-api-tenant/src/main/java/fr/dossierfacile/api/front/register/form/tenant/AccountForm.java +++ b/dossierfacile-api-tenant/src/main/java/fr/dossierfacile/api/front/register/form/tenant/AccountForm.java @@ -4,7 +4,6 @@ import fr.dossierfacile.api.front.validator.annotation.tenant.account.UniqueEmailActiveAccount; import fr.dossierfacile.common.deserializer.EmailDeserializer; import jakarta.validation.constraints.Email; -import jakarta.validation.constraints.NotBlank; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @@ -19,9 +18,6 @@ public class AccountForm { @UniqueEmailActiveAccount private String email; - @NotBlank - private String password; - private String source; private String firstName; diff --git a/dossierfacile-api-tenant/src/main/java/fr/dossierfacile/api/front/register/tenant/Account.java b/dossierfacile-api-tenant/src/main/java/fr/dossierfacile/api/front/register/tenant/Account.java deleted file mode 100644 index 32fe30d90..000000000 --- a/dossierfacile-api-tenant/src/main/java/fr/dossierfacile/api/front/register/tenant/Account.java +++ /dev/null @@ -1,90 +0,0 @@ -package fr.dossierfacile.api.front.register.tenant; - -import com.google.common.base.Strings; -import fr.dossierfacile.api.front.mapper.TenantMapper; -import fr.dossierfacile.api.front.model.tenant.TenantModel; -import fr.dossierfacile.api.front.register.SaveStep; -import fr.dossierfacile.api.front.register.form.tenant.AccountForm; -import fr.dossierfacile.api.front.security.interfaces.ClientAuthenticationFacade; -import fr.dossierfacile.api.front.service.interfaces.*; -import fr.dossierfacile.api.front.util.Obfuscator; -import fr.dossierfacile.common.entity.ConfirmationToken; -import fr.dossierfacile.common.entity.Tenant; -import fr.dossierfacile.common.entity.UserApi; -import fr.dossierfacile.common.enums.TenantType; -import fr.dossierfacile.common.mapper.mail.TenantMapperForMail; -import fr.dossierfacile.common.repository.TenantCommonRepository; -import fr.dossierfacile.common.service.interfaces.ConfirmationTokenService; -import fr.dossierfacile.common.service.interfaces.PartnerCallBackService; -import fr.dossierfacile.common.utils.TransactionalUtil; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.time.LocalDateTime; -import java.util.Optional; - -@Service -@AllArgsConstructor -@Slf4j -public class Account implements SaveStep { - - private final TenantCommonRepository tenantRepository; - private final BCryptPasswordEncoder bCryptPasswordEncoder; - private final UserRoleService userRoleService; - private final TenantMapper tenantMapper; - private final ApartmentSharingService apartmentSharingService; - private final TenantService tenantService; - private final UserApiService userApiService; - private final PartnerCallBackService partnerCallBackService; - private final MailService mailService; - private final ConfirmationTokenService confirmationTokenService; - private final KeycloakService keycloakService; - private final TenantMapperForMail tenantMapperForMail; - private final ClientAuthenticationFacade clientAuthenticationFacade; - - @Override - @Transactional - public TenantModel saveStep(Tenant t, AccountForm accountForm) { - String email = accountForm.getEmail().toLowerCase(); - Optional existingEmailTenant = tenantRepository.findByEmailAndEnabledFalse(email); - if (existingEmailTenant.isPresent()) { - throw new IllegalStateException("Tenant " + Obfuscator.email(email) + " already exists (same email)"); - } - - Tenant tenant = tenantService.create(Tenant.builder().tenantType(TenantType.CREATE).email(email).build()); - tenant.setPassword(bCryptPasswordEncoder.encode(accountForm.getPassword())); - String newKeycloakId = keycloakService.createKeycloakUserAccountCreation(accountForm, tenant); - - Tenant existingTenant = tenantRepository.findByKeycloakId(newKeycloakId); - if (existingTenant != null) { - // A tenant already exists, should never happen here because we have already checked existing email - // and there is no FranceConnect - throw new IllegalStateException("Tenant " + Obfuscator.email(tenant.getEmail()) + " already exists (same keycloak id)"); - } - - tenant.setKeycloakId(newKeycloakId); - if (!Strings.isNullOrEmpty(accountForm.getSource())) { - if (!tenant.getFranceConnect()) { - tenant.setFirstName(accountForm.getFirstName()); - tenant.setLastName(accountForm.getLastName()); - } - tenant.setPreferredName(accountForm.getPreferredName()); - tenantRepository.save(tenant); - Optional userApi = userApiService.findByName(accountForm.getSource()); - userApi.ifPresent(api -> partnerCallBackService.registerTenant(accountForm.getInternalPartnerId(), tenant, api)); - } - - tenantRepository.save(tenant); - userRoleService.createRole(tenant); - apartmentSharingService.resetDossierPdfGenerated(tenant.getApartmentSharing()); - tenant.lastUpdateDateProfile(LocalDateTime.now(), null); - ConfirmationToken confirmationToken = confirmationTokenService.createToken(tenant); - - TransactionalUtil.afterCommit(() -> mailService.sendEmailConfirmAccount(tenantMapperForMail.toDto(tenant), confirmationToken)); - return tenantMapper.toTenantModel(tenantRepository.save(tenant), (!clientAuthenticationFacade.isClient()) ? null : clientAuthenticationFacade.getClient()); - } - -} diff --git a/dossierfacile-api-tenant/src/main/java/fr/dossierfacile/api/front/service/KeycloakServiceImpl.java b/dossierfacile-api-tenant/src/main/java/fr/dossierfacile/api/front/service/KeycloakServiceImpl.java index b522b3aca..b29bc668e 100644 --- a/dossierfacile-api-tenant/src/main/java/fr/dossierfacile/api/front/service/KeycloakServiceImpl.java +++ b/dossierfacile-api-tenant/src/main/java/fr/dossierfacile/api/front/service/KeycloakServiceImpl.java @@ -1,9 +1,7 @@ package fr.dossierfacile.api.front.service; -import fr.dossierfacile.api.front.register.form.tenant.AccountForm; import fr.dossierfacile.api.front.service.interfaces.KeycloakService; import fr.dossierfacile.common.entity.Tenant; -import fr.dossierfacile.common.entity.User; import fr.dossierfacile.common.entity.UserApi; import fr.dossierfacile.common.service.interfaces.KeycloakCommonService; import jakarta.ws.rs.NotFoundException; @@ -17,7 +15,6 @@ import org.springframework.stereotype.Service; import java.util.Collections; -import java.util.List; import java.util.Optional; @Service @@ -39,37 +36,12 @@ public UserRepresentation getKeyCloakUser(String keycloakId) { } } - @Override - public String createKeycloakUserAccountCreation(AccountForm accountForm, Tenant tenant) { - if (tenant.getKeycloakId() != null) { - realmResource.users().delete(tenant.getKeycloakId()); - } - var email = accountForm.getEmail().toLowerCase(); - var userRepresentation = createUser(email); - createCredential(userRepresentation, accountForm.getPassword()); - return createUserAndReturnId(userRepresentation); - } - @Override public String createKeycloakUser(String email) { var userRepresentation = createUser(email); return createUserAndReturnId(userRepresentation); } - @Override - public void deleteKeycloakUsers(List users) { - keycloakCommonService.deleteKeycloakUsers(users); - } - - @Override - public void confirmKeycloakUser(String keycloakId) { - UserResource userResource = realmResource.users().get(keycloakId); - var userRepresentation = userResource.toRepresentation(); - userRepresentation.setEmailVerified(true); - userRepresentation.setEnabled(true); - userResource.update(userRepresentation); - } - @Override public void createKeyCloakPassword(String keycloakId, String password) { var userRepresentation = realmResource.users().get(keycloakId).toRepresentation(); @@ -79,11 +51,6 @@ public void createKeyCloakPassword(String keycloakId, String password) { realmResource.users().get(keycloakId).update(userRepresentation); } - @Override - public void deleteKeycloakUser(Tenant tenant) { - keycloakCommonService.deleteKeycloakUser(tenant); - } - @Override public void deleteKeycloakUserById(String keycloakId) { keycloakCommonService.deleteKeycloakUserById(keycloakId); diff --git a/dossierfacile-api-tenant/src/main/java/fr/dossierfacile/api/front/service/interfaces/KeycloakService.java b/dossierfacile-api-tenant/src/main/java/fr/dossierfacile/api/front/service/interfaces/KeycloakService.java index 5e766137f..cac9212da 100644 --- a/dossierfacile-api-tenant/src/main/java/fr/dossierfacile/api/front/service/interfaces/KeycloakService.java +++ b/dossierfacile-api-tenant/src/main/java/fr/dossierfacile/api/front/service/interfaces/KeycloakService.java @@ -1,32 +1,20 @@ package fr.dossierfacile.api.front.service.interfaces; -import fr.dossierfacile.api.front.register.form.tenant.AccountForm; import fr.dossierfacile.common.entity.Tenant; -import fr.dossierfacile.common.entity.User; import fr.dossierfacile.common.entity.UserApi; import org.keycloak.representations.idm.UserRepresentation; -import java.util.List; - public interface KeycloakService { UserRepresentation getKeyCloakUser(String keycloakId); - String createKeycloakUserAccountCreation(AccountForm accountForm, Tenant tenant); - /** * @return created user's keycloakId */ String createKeycloakUser(String email); - void deleteKeycloakUsers(List users); - - void confirmKeycloakUser(String keycloakId); - void createKeyCloakPassword(String keycloakId, String password); - void deleteKeycloakUser(Tenant tenant); - void deleteKeycloakUserById(String keycloakId); String getKeycloakId(String email); diff --git a/dossierfacile-bo/src/main/java/fr/gouv/bo/security/UserPrincipal.java b/dossierfacile-bo/src/main/java/fr/gouv/bo/security/UserPrincipal.java index 62d781c44..9c8ff3133 100644 --- a/dossierfacile-bo/src/main/java/fr/gouv/bo/security/UserPrincipal.java +++ b/dossierfacile-bo/src/main/java/fr/gouv/bo/security/UserPrincipal.java @@ -12,14 +12,12 @@ public class UserPrincipal implements OAuth2User, UserDetails { private final Long id; private final String email; - private final String password; private final Collection authorities; private transient Map attributes; - public UserPrincipal(Long id, String email, String password, Collection authorities) { + public UserPrincipal(Long id, String email, Collection authorities) { this.id = id; this.email = email; - this.password = password; this.authorities = authorities; } @@ -28,7 +26,6 @@ public static UserPrincipal create(User user, Set authorities) return new UserPrincipal( user.getId(), user.getEmail(), - user.getPassword(), authorities ); } @@ -49,7 +46,7 @@ public String getEmail() { @Override public String getPassword() { - return password; + return ""; } @Override diff --git a/dossierfacile-common-library/src/main/java/fr/dossierfacile/common/entity/User.java b/dossierfacile-common-library/src/main/java/fr/dossierfacile/common/entity/User.java index af9feb838..875458e70 100644 --- a/dossierfacile-common-library/src/main/java/fr/dossierfacile/common/entity/User.java +++ b/dossierfacile-common-library/src/main/java/fr/dossierfacile/common/entity/User.java @@ -62,9 +62,6 @@ public abstract class User implements Serializable { @Column private String email; - @Column - private String password; - @Builder.Default @OneToMany(mappedBy = "user", fetch = FetchType.LAZY, cascade = CascadeType.REMOVE) private Set userRoles = new HashSet<>(); diff --git a/dossierfacile-common-library/src/main/resources/db/changelog/databaseChangeLog.xml b/dossierfacile-common-library/src/main/resources/db/changelog/databaseChangeLog.xml index ccd5514a1..a30169c6f 100644 --- a/dossierfacile-common-library/src/main/resources/db/changelog/databaseChangeLog.xml +++ b/dossierfacile-common-library/src/main/resources/db/changelog/databaseChangeLog.xml @@ -159,5 +159,6 @@ + diff --git a/dossierfacile-common-library/src/main/resources/db/migration/202412030000-drop-column-password.xml b/dossierfacile-common-library/src/main/resources/db/migration/202412030000-drop-column-password.xml new file mode 100644 index 000000000..e85854fdf --- /dev/null +++ b/dossierfacile-common-library/src/main/resources/db/migration/202412030000-drop-column-password.xml @@ -0,0 +1,12 @@ + + + + + + + +