Skip to content
Draft
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Handles multi mfa for a user
  • Loading branch information
bvasseur-urw committed Sep 6, 2024
commit d1aea4d0eca9cc0258ef9303f479f0a39102121c
27 changes: 23 additions & 4 deletions plume-admin-ws/sql/setup-mysql.sql
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
DROP TABLE IF EXISTS `PLM_USER_MFA`;
DROP TABLE IF EXISTS `PLM_ROLE_PERMISSION`;
DROP TABLE IF EXISTS `PLM_USER`;
DROP TABLE IF EXISTS `PLM_ROLE`;
CREATE TABLE `PLM_ROLE` (
`id` bigint(20) NOT NULL,
Expand All @@ -6,7 +9,7 @@ CREATE TABLE `PLM_ROLE` (
UNIQUE KEY `uniq_plm_role_label` (`label`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

DROP TABLE IF EXISTS `PLM_USER`;

CREATE TABLE `PLM_USER` (
`id` bigint(20) NOT NULL,
`id_role` bigint(20) NOT NULL,
Expand All @@ -16,14 +19,13 @@ CREATE TABLE `PLM_USER` (
`email` varchar(255) NOT NULL,
`user_name` varchar(255) NOT NULL,
`password` varchar(255) NOT NULL,
`secret_key` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `uniq_plm_user_email` (`email`),
UNIQUE KEY `uniq_plm_user_username` (`user_name`),
CONSTRAINT `plm_user_role` FOREIGN KEY (`id_role`) REFERENCES `PLM_ROLE` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

DROP TABLE IF EXISTS `PLM_ROLE_PERMISSION`;

CREATE TABLE `PLM_ROLE_PERMISSION` (
`id_role` bigint(20) NOT NULL,
`permission` varchar(255) NOT NULL,
Expand All @@ -32,8 +34,25 @@ CREATE TABLE `PLM_ROLE_PERMISSION` (
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


DROP TABLE IF EXISTS `PLM_MFA`;
CREATE TABLE `PLM_MFA` (
`id` bigint(20) NOT NULL,
`type` ENUM('authenticator', 'browser') NOT NULL,
`secret_key` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


CREATE TABLE `PLM_USER_MFA` (
`id_user` bigint(20) NOT NULL,
`id_mfa` bigint(20) NOT NULL,
PRIMARY KEY (`id_user`, `id_mfa`),
CONSTRAINT `plm_user_mfa_user` FOREIGN KEY (`id_user`) REFERENCES `PLM_USER` (`id`),
CONSTRAINT `plm_user_mfa_mfa` FOREIGN KEY (`id_mfa`) REFERENCES `PLM_MFA` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO PLM_ROLE VALUES(1, 'Administrator');
INSERT INTO PLM_USER VALUES(1, 1, NOW(), 'Admin', 'Admin', 'admin@admin', 'admin', '$2a$11$FfgtfoHeNo/m9jGj9D5rTO0zDDI4LkMXnXHai744Ee32P3CHoBVqm', NULL);
INSERT INTO PLM_USER VALUES(1, 1, NOW(), 'Admin', 'Admin', 'admin@admin', 'admin', '$2a$11$FfgtfoHeNo/m9jGj9D5rTO0zDDI4LkMXnXHai744Ee32P3CHoBVqm');
INSERT INTO PLM_ROLE_PERMISSION VALUES(1, 'MANAGE_USERS');
INSERT INTO PLM_ROLE_PERMISSION VALUES(1, 'MANAGE_ROLES');
INSERT INTO PLM_ROLE_PERMISSION VALUES(1, 'MANAGE_SYSTEM');
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
package com.coreoz.plume.admin.db.daos;

import java.util.List;

import javax.inject.Inject;

import com.coreoz.plume.admin.db.generated.AdminMfa;
import com.coreoz.plume.admin.db.generated.QAdminMfa;
import com.coreoz.plume.admin.db.generated.QAdminUserMfa;
import com.coreoz.plume.admin.services.mfa.MfaTypeEnum;
import com.coreoz.plume.db.querydsl.crud.CrudDaoQuerydsl;
import com.coreoz.plume.db.querydsl.transaction.TransactionManagerQuerydsl;

public class AdminMfaDao extends CrudDaoQuerydsl<AdminMfa> {
@Inject
public AdminMfaDao(TransactionManagerQuerydsl transactionManager) {
super(transactionManager, QAdminMfa.adminMfa);
}

public List<AdminMfa> findByUserId(long userId) {
return selectFrom()
.join(QAdminUserMfa.adminUserMfa)
.on(QAdminUserMfa.adminUserMfa.idMfa.eq(QAdminMfa.adminMfa.id))
.where(QAdminUserMfa.adminUserMfa.idUser.eq(userId))
.fetch();
}

public List<AdminMfa> findMfaByUserIdAndType(long userId, MfaTypeEnum type) {
return selectFrom()
.join(QAdminUserMfa.adminUserMfa)
.on(QAdminUserMfa.adminUserMfa.idMfa.eq(QAdminMfa.adminMfa.id))
.where(QAdminUserMfa.adminUserMfa.idUser.eq(userId)
.and(QAdminMfa.adminMfa.type.eq(type.getType())))
.fetch();
}

public void addMfaToUser(long userId, AdminMfa mfa) {
long mfaId = save(mfa).getId();
transactionManager.insert(QAdminUserMfa.adminUserMfa)
.set(QAdminUserMfa.adminUserMfa.idMfa, mfaId)
.set(QAdminUserMfa.adminUserMfa.idUser, userId)
.execute();
}

public void removeMfaFromUser(long userId, long mfaId) {
AdminMfa mfa = findById(mfaId);
if (mfa == null) {
return;
}
transactionManager.delete(QAdminUserMfa.adminUserMfa)
.where(QAdminUserMfa.adminUserMfa.idMfa.eq(mfaId)
.and(QAdminUserMfa.adminUserMfa.idUser.eq(userId)))
.execute();
delete(mfaId);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
package com.coreoz.plume.admin.db.generated;

import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import javax.annotation.processing.Generated;
import com.querydsl.sql.Column;

/**
* AdminMfa is a Querydsl bean type
*/
@Generated("com.coreoz.plume.db.querydsl.generation.IdBeanSerializer")
public class AdminMfa extends com.coreoz.plume.db.querydsl.crud.CrudEntityQuerydsl {

@Column("ID")
@JsonSerialize(using=com.fasterxml.jackson.databind.ser.std.ToStringSerializer.class)
private Long id;

@Column("SECRET_KEY")
private String secretKey;

@Column("TYPE")
private String type;

public Long getId() {
return id;
}

public void setId(Long id) {
this.id = id;
}

public String getSecretKey() {
return secretKey;
}

public void setSecretKey(String secretKey) {
this.secretKey = secretKey;
}

public String getType() {
return type;
}

public void setType(String type) {
this.type = type;
}

@Override
public String toString() {
return "AdminMfa#" + id;
}

@Override
public boolean equals(Object o) {
if (id == null) {
return super.equals(o);
}
if (!(o instanceof AdminMfa)) {
return false;
}
AdminMfa obj = (AdminMfa) o;
return id.equals(obj.id);
}

@Override
public int hashCode() {
if (id == null) {
return super.hashCode();
}
final int prime = 31;
int result = 1;
result = prime * result + id.hashCode();
return result;
}

}

Original file line number Diff line number Diff line change
Expand Up @@ -33,9 +33,6 @@ public class AdminUser extends com.coreoz.plume.db.querydsl.crud.CrudEntityQuery
@Column("PASSWORD")
private String password;

@Column("SECRET_KEY")
private String secretKey;

@Column("USER_NAME")
private String userName;

Expand Down Expand Up @@ -95,14 +92,6 @@ public void setPassword(String password) {
this.password = password;
}

public String getSecretKey() {
return secretKey;
}

public void setSecretKey(String secretKey) {
this.secretKey = secretKey;
}

public String getUserName() {
return userName;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
package com.coreoz.plume.admin.db.generated;

import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import javax.annotation.processing.Generated;
import com.querydsl.sql.Column;

/**
* AdminUserMfa is a Querydsl bean type
*/
@Generated("com.coreoz.plume.db.querydsl.generation.IdBeanSerializer")
public class AdminUserMfa {

@Column("ID_MFA")
@JsonSerialize(using=com.fasterxml.jackson.databind.ser.std.ToStringSerializer.class)
private Long idMfa;

@Column("ID_USER")
@JsonSerialize(using=com.fasterxml.jackson.databind.ser.std.ToStringSerializer.class)
private Long idUser;

public Long getIdMfa() {
return idMfa;
}

public void setIdMfa(Long idMfa) {
this.idMfa = idMfa;
}

public Long getIdUser() {
return idUser;
}

public void setIdUser(Long idUser) {
this.idUser = idUser;
}

@Override
public String toString() {
return "AdminUserMfa#" + idMfa+ ";" + idUser;
}

@Override
public boolean equals(Object o) {
if (idMfa == null || idUser == null) {
return super.equals(o);
}
if (!(o instanceof AdminUserMfa)) {
return false;
}
AdminUserMfa obj = (AdminUserMfa) o;
return idMfa.equals(obj.idMfa) && idUser.equals(obj.idUser);
}

@Override
public int hashCode() {
if (idMfa == null || idUser == null) {
return super.hashCode();
}
final int prime = 31;
int result = 1;
result = prime * result + idMfa.hashCode();
result = prime * result + idUser.hashCode();
return result;
}

}

Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
package com.coreoz.plume.admin.db.generated;

import static com.querydsl.core.types.PathMetadataFactory.*;

import com.querydsl.core.types.dsl.*;

import com.querydsl.core.types.PathMetadata;
import javax.annotation.processing.Generated;
import com.querydsl.core.types.Path;

import com.querydsl.sql.ColumnMetadata;
import java.sql.Types;




/**
* QAdminMfa is a Querydsl query type for AdminMfa
*/
@Generated("com.querydsl.sql.codegen.MetaDataSerializer")
public class QAdminMfa extends com.querydsl.sql.RelationalPathBase<AdminMfa> {

private static final long serialVersionUID = 320633169;

public static final QAdminMfa adminMfa = new QAdminMfa("PLM_MFA");

public final NumberPath<Long> id = createNumber("id", Long.class);

public final StringPath secretKey = createString("secretKey");

public final StringPath type = createString("type");

public final com.querydsl.sql.PrimaryKey<AdminMfa> primary = createPrimaryKey(id);

public final com.querydsl.sql.ForeignKey<AdminUserMfa> _plmUserMfaMfa = createInvForeignKey(id, "ID_MFA");

public QAdminMfa(String variable) {
super(AdminMfa.class, forVariable(variable), "null", "PLM_MFA");
addMetadata();
}

public QAdminMfa(String variable, String schema, String table) {
super(AdminMfa.class, forVariable(variable), schema, table);
addMetadata();
}

public QAdminMfa(String variable, String schema) {
super(AdminMfa.class, forVariable(variable), schema, "PLM_MFA");
addMetadata();
}

public QAdminMfa(Path<? extends AdminMfa> path) {
super(path.getType(), path.getMetadata(), "null", "PLM_MFA");
addMetadata();
}

public QAdminMfa(PathMetadata metadata) {
super(AdminMfa.class, metadata, "null", "PLM_MFA");
addMetadata();
}

public void addMetadata() {
addMetadata(id, ColumnMetadata.named("ID").withIndex(1).ofType(Types.BIGINT).withSize(19).notNull());
addMetadata(secretKey, ColumnMetadata.named("SECRET_KEY").withIndex(3).ofType(Types.VARCHAR).withSize(255));
addMetadata(type, ColumnMetadata.named("TYPE").withIndex(2).ofType(Types.VARCHAR).withSize(13).notNull());
}

}

Original file line number Diff line number Diff line change
Expand Up @@ -38,8 +38,6 @@ public class QAdminUser extends com.querydsl.sql.RelationalPathBase<AdminUser> {

public final StringPath password = createString("password");

public final StringPath secretKey = createString("secretKey");

public final StringPath userName = createString("userName");

public final com.querydsl.sql.PrimaryKey<AdminUser> constraintB3 = createPrimaryKey(id);
Expand Down Expand Up @@ -79,7 +77,6 @@ public void addMetadata() {
addMetadata(idRole, ColumnMetadata.named("ID_ROLE").withIndex(2).ofType(Types.BIGINT).withSize(19).notNull());
addMetadata(lastName, ColumnMetadata.named("LAST_NAME").withIndex(5).ofType(Types.VARCHAR).withSize(255).notNull());
addMetadata(password, ColumnMetadata.named("PASSWORD").withIndex(8).ofType(Types.VARCHAR).withSize(255).notNull());
addMetadata(secretKey, ColumnMetadata.named("SECRET_KEY").withIndex(9).ofType(Types.VARCHAR).withSize(255).notNull());
addMetadata(userName, ColumnMetadata.named("USER_NAME").withIndex(7).ofType(Types.VARCHAR).withSize(255).notNull());
}

Expand Down
Loading