/*
* Copyright (C) 2014 GG-Net GmbH - Oliver Günther
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package eu.ggnet.dwoss.rights.assist.gen;
import java.io.UnsupportedEncodingException;
import java.security.*;
import java.util.*;
import javax.ejb.Stateless;
import javax.inject.Inject;
import javax.persistence.EntityManager;
import org.apache.commons.lang3.RandomStringUtils;
import eu.ggnet.dwoss.rights.api.AtomicRight;
import eu.ggnet.dwoss.rights.assist.Rights;
import eu.ggnet.dwoss.rights.entity.Operator;
import eu.ggnet.dwoss.rights.entity.Persona;
/**
*
* @author Bastian Venz
*/
@Stateless
public class RightsGeneratorOperation {
@Inject
@Rights
private EntityManager em;
/**
* Create the given amount of operators and personas and create a Addentional Operator with the Username "Adminuser" und clear text Password Test and All
* Rights.
* <p>
* .* @param countOfOperator
* <p>
* @param countOfOperator
* @param countOfPersona
*/
public void make(int countOfOperator, int countOfPersona) {
List<Persona> personas = new ArrayList<>();
for (int i = 0; i < countOfPersona; i++) {
Persona persona = new Persona();
persona.setName("Persona " + i);
persona.addAll(getRandomRights());
em.persist(persona);
personas.add(persona);
}
for (int j = 0; j < countOfOperator; j++) {
Operator operator = new Operator();
for (AtomicRight atomicRight : getRandomRights()) {
operator.add(atomicRight);
}
operator.setUsername("User " + j);
int till = (int)(Math.random() * countOfPersona - 1);
for (Persona persona : personas.subList(0, till)) {
operator.add(persona);
}
operator.setSalt(RandomStringUtils.randomAlphanumeric(6).getBytes());
operator.setPassword(hashRandomString(RandomStringUtils.randomAlphanumeric(15), operator.getSalt()));
operator.setQuickLoginKey((int)(Math.random() * 999));
em.persist(operator);
}
}
public Operator make(String username, Collection<AtomicRight> activeRights) {
Operator o = new Operator();
o.setUsername(username);
for (AtomicRight right : activeRights) {
o.add(right);
}
em.persist(o);
return o;
}
private static byte[] hashRandomString(String password, byte[] salt) {
StringBuilder sb = new StringBuilder();
try {
MessageDigest md = MessageDigest.getInstance("SHA-512");
md.update(salt);
byte[] bytes = md.digest(password.getBytes("UTF-8"));
for (int i = 0; i < bytes.length; i++) {
sb.append(Integer.toString((bytes[i] & 0xff) + 0x100, 16).substring(1));
}
return sb.toString().getBytes("UTF-8");
} catch (NoSuchAlgorithmException | UnsupportedEncodingException ex) {
throw new RuntimeException();
}
}
private static List<AtomicRight> getRandomRights() {
List<AtomicRight> rights = Arrays.asList(AtomicRight.values());
Collections.shuffle(rights);
int till = (int)(Math.random() * rights.size() - 1) + 1;
rights = rights.subList(0, till);
return rights;
}
}