Skip to content

Commit

Permalink
Ajoute les paramètres pour le mode déconnecté de l'application mobile
Browse files Browse the repository at this point in the history
Issue: #205558
Change-Id: Ifea913345e3e5b7007b164d94e619740af213fb0
  • Loading branch information
Emilie Genton committed Feb 6, 2024
1 parent 6bd055d commit 830b53c
Show file tree
Hide file tree
Showing 8 changed files with 102 additions and 12 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -23,18 +23,16 @@ public interface Settings {
String issuer();

int expirationSec();

int mobileExpirationMin();
}

public static AuthnModule create(Config config) {
Key key = Keys.hmacShaKeyFor(config.getString("secret").getBytes(StandardCharsets.UTF_8));

return new AuthnModule(
ImmutableAuthnModule.Settings.builder()
.key(key)
.issuer(config.getString("issuer"))
.expirationSec(config.getInt("expirationSec"))
.mobileExpirationMin(config.getInt("mobileExpirationMin"))
.build());
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,14 +43,19 @@ public static String encodePassword(String rawPass, String salt) {
return null;
}

public String generateToken(String username) {
public String generateToken(String username, Integer nbHeureValideMobile) {
String jws =
Jwts.builder()
//
.setIssuer(settings.issuer())
.setSubject(username)
.setExpiration(
Date.from(Instant.now().plus(Duration.ofMinutes(settings.mobileExpirationMin()))))
Date.from(
Instant.now()
.plus(
nbHeureValideMobile != null
? Duration.ofHours(nbHeureValideMobile)
: Duration.ofSeconds(settings.expirationSec()))))
.setIssuedAt(new Date())
.setId(UUID.randomUUID().toString())
//
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ public Response authenticate(String email, String password) {
if (user.getPassword().equals(encodedPassword)) {
return ImmutableJWTAuthUser.Response.builder()
.status(Status.OK)
.token(authCommun.generateToken(user.getEmail()))
.token(authCommun.generateToken(user.getEmail(), null))
.build();
}

Expand All @@ -42,6 +42,8 @@ public interface Response {
Status status();

Optional<String> token();

Optional<String> dateProchaineDeconnexion();
}

public enum Status {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,15 @@
package fr.sdis83.remocra.usecase.authn;

import static fr.sdis83.remocra.util.GlobalConstants.PARAMETRE_DUREE_VALIDITE_TOKEN;
import static fr.sdis83.remocra.util.GlobalConstants.PARAMETRE_MODE_DECONNECTE;

import com.google.inject.Inject;
import fr.sdis83.remocra.authn.CompatibleVersions;
import fr.sdis83.remocra.repository.ParametreRepository;
import fr.sdis83.remocra.repository.UtilisateurModel;
import fr.sdis83.remocra.repository.UtilisateursRepository;
import fr.sdis83.remocra.usecase.utils.DateUtils;
import java.time.Duration;
import java.time.Instant;
import org.immutables.value.Value;
import org.slf4j.Logger;
Expand All @@ -15,6 +20,7 @@ public class MobileAuthUser {

private final LdapUsecase ldapUsecase;
private final UtilisateursRepository utilisateursRepository;
private final ParametreRepository parametreRepository;
private final AuthCommun authCommun;

private final CompatibleVersions compatibleVersions;
Expand All @@ -26,12 +32,14 @@ public MobileAuthUser(
LdapUsecase ldapUsecase,
UtilisateursRepository utilisateursRepository,
AuthCommun authCommun,
CompatibleVersions compatibleVersions) {
CompatibleVersions compatibleVersions,
ParametreRepository parametreRepository) {

this.ldapUsecase = ldapUsecase;
this.utilisateursRepository = utilisateursRepository;
this.authCommun = authCommun;
this.compatibleVersions = compatibleVersions;
this.parametreRepository = parametreRepository;
}

public ImmutableJWTAuthUser.Response authenticateMobile(
Expand Down Expand Up @@ -60,7 +68,13 @@ public ImmutableJWTAuthUser.Response authenticateMobile(
// On s'est connecté à LDAP => on a trouvé l'utilisateur et il avait le bon mot de passe !
return ImmutableJWTAuthUser.Response.builder()
.status(JWTAuthUser.Status.OK)
.token(authCommun.generateToken(username))
.token(
authCommun.generateToken(
username,
Integer.parseInt(
parametreRepository
.getParametre(PARAMETRE_DUREE_VALIDITE_TOKEN)
.getValeurParametre())))
.build();
}

Expand All @@ -76,9 +90,26 @@ public ImmutableJWTAuthUser.Response authenticateMobile(

logger.trace(
"L'utilisateur " + username + " est connecté (" + DateUtils.format(Instant.now()) + ")");

// On vérifie si le mode "déconnexion" est à true, on envoie la date de la prochaine déconnexion
boolean accepteModeDeconnecte =
Boolean.parseBoolean(
parametreRepository.getParametre(PARAMETRE_MODE_DECONNECTE).getValeurParametre());
int dureeSession =
Integer.parseInt(
parametreRepository.getParametre(PARAMETRE_DUREE_VALIDITE_TOKEN).getValeurParametre());
if (accepteModeDeconnecte) {
String date = DateUtils.format(Instant.now().plus(Duration.ofHours(dureeSession)));
logger.trace("Mode déconnecté autorisé, la session est valable jusqu'au : " + date);
return ImmutableJWTAuthUser.Response.builder()
.status(JWTAuthUser.Status.OK)
.token(authCommun.generateToken(username, dureeSession))
.dateProchaineDeconnexion(date)
.build();
}
return ImmutableJWTAuthUser.Response.builder()
.status(JWTAuthUser.Status.OK)
.token(authCommun.generateToken(username))
.token(authCommun.generateToken(username, dureeSession))
.build();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,8 @@ public String getTypeDocument() {
public static final String PARAMETRE_CARACTERISTIQUE_PIBI = "CARACTERISTIQUE_PIBI";

public static final String PARAMETRE_CARACTERISTIQUE_PENA = "CARACTERISTIQUE_PENA";
public static final String PARAMETRE_DUREE_VALIDITE_TOKEN = "DUREE_VALIDITE_TOKEN";
public static final String PARAMETRE_MODE_DECONNECTE = "MODE_DECONNECTE";

// Clé du paramètre SRID stocké dans la table remocra.parametre
public static final String CLE_SRID = "SRID";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -62,18 +62,27 @@ public Response authenticateMobile(
throws Exception {
JWTAuthUser.Response res = mobileAuthUser.authenticateMobile(username, password, versionName);
if (res.status() == JWTAuthUser.Status.OK) {
return Response.ok(new LoginResponse(username, res.token().get())).build();
return Response.ok(
new LoginResponse(
username,
res.token().get(),
res.dateProchaineDeconnexion().isPresent()
? res.dateProchaineDeconnexion().get()
: null))
.build();
}
throw new NotAuthorizedException("Unauthorized");
}

static class LoginResponse {
public final String username;
public final String token;
public final String dateProchaineDeconnexion;

public LoginResponse(String username, String token) {
public LoginResponse(String username, String token, String dateProchaineDeconnexion) {
this.username = username;
this.token = token;
this.dateProchaineDeconnexion = dateProchaineDeconnexion;
}
}
}
1 change: 0 additions & 1 deletion api-remocra/api/src/main/resources/reference.conf
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,6 @@ api-remocra = {
authn = {
issuer = "dev server"
expirationSec = 1200
mobileExpirationMin = 1440
secret = "-- Put your JSONWebToken key here --"
}
}
44 changes: 44 additions & 0 deletions server/sdis-remocra/home/postgres/remocra_db/patches/197/197.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
-- On est obligé de faire l'ALTER TYPE hors de la transaction
ALTER TYPE remocra.type_parametre ADD VALUE IF NOT EXISTS 'BOOLEAN';
ALTER TYPE remocra.type_parametre ADD VALUE IF NOT EXISTS 'INTEGER';
begin;
set statement_timeout = 0;
set client_encoding = 'UTF8';
set standard_conforming_strings = off;
set check_function_bodies = false;
set client_min_messages = warning;
set escape_string_warning = off;
set search_path = remocra, pdi, public, pg_catalog;
--------------------------------------------------
-- Versionnement du patch et vérification
--
create or replace function versionnement_dffd4df4df() returns void language plpgsql AS $body$
declare
numero_patch int;
description_patch varchar;
begin
-- Métadonnées du patch
numero_patch := 197;
description_patch := 'Ajoute des paramètres pour l''application mobile pour prendre en compte le mode déconnecté';

-- Vérification
if (select numero_patch-1 != (select max(numero) from remocra.suivi_patches)) then
raise exception 'Le numéro de patch requis n''est pas le bon. Dernier appliqué : %, en cours : %', (select max(numero) from remocra.suivi_patches), numero_patch; end if;
-- Suivi
insert into remocra.suivi_patches(numero, description) values(numero_patch, description_patch);
end $body$;
select versionnement_dffd4df4df();
drop function versionnement_dffd4df4df();
--------------------------------------------------
-- Contenu réel du patch début
INSERT INTO remocra.parametre
(cle_parametre, valeur_parametre, type_parametre, description_parametre, categorie_parametre)
VALUES('MODE_DECONNECTE', 'false', 'BOOLEAN', 'Permettre le mode déconnecté ?', 'MOBILE');

INSERT INTO remocra.parametre
(cle_parametre, valeur_parametre, type_parametre, description_parametre, categorie_parametre)
VALUES('DUREE_VALIDITE_TOKEN', '24', 'INTEGER', 'Durée de la validité du token pour l''application mobile (en heures)', 'MOBILE');

-- Contenu réel du patch fin
--------------------------------------------------
COMMIT;

0 comments on commit 830b53c

Please sign in to comment.