package at.gv.util.client.mis.usp_v2; import java.io.UnsupportedEncodingException; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.text.SimpleDateFormat; import java.util.Base64; import java.util.Date; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import at.gv.util.MiscUtil; import at.gv.util.client.szr.IRoleGenerationStrategy; import at.gv.util.ex.EgovUtilException; public class VDDSRoleGenerationStrategy implements IRoleGenerationStrategy { private static final Logger log = LoggerFactory.getLogger(VDDSRoleGenerationStrategy.class); public static final String ROLE_CONSTANT_PARTNERNAME = "partner-name="; public static final String ROLE_CONSTANT_SECRET = "secret="; public static final String ROLE_CONSTANT_CREATIONTS = "creation-ts="; public static final String TS_PATTERN = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"; private static final SimpleDateFormat tsFormat = new SimpleDateFormat(TS_PATTERN); private String participant; private String authData; public VDDSRoleGenerationStrategy(String participant, String authData) throws EgovUtilException { if (MiscUtil.isEmpty(authData)) { log.error("Secret to generate VDDS role is 'null or 'empty''"); throw new EgovUtilException("Secret to generate VDDS role is 'null or 'empty'"); } this.authData = authData; if (MiscUtil.isEmpty(participant)) { log.error("Participant to generate VDDS role is 'null or 'empty''"); throw new EgovUtilException("Secret to generate VDDS role is 'null or 'empty'"); } this.participant = participant; log.trace("VDDSRoleGenerationStrategy uses participant: " + this.participant + " and secret: " + this.authData); } @Override public String generateRoleString(String roleString) throws EgovUtilException { try { String currentTS = tsFormat.format(new Date()); log.trace("Generate VDDS role at: " + currentTS); MessageDigest md = MessageDigest.getInstance("SHA-1"); byte[] digistInput = (currentTS + authData).getBytes("UTF-8"); log.trace("DigistInput: " + new String(digistInput, "UTF-8")); byte[] digistOutput = md.digest(digistInput); String secret = Base64.getEncoder().encodeToString(digistOutput); StringBuilder sBuilder = new StringBuilder(roleString); sBuilder.append("("); sBuilder.append(ROLE_CONSTANT_PARTNERNAME); sBuilder.append(participant); sBuilder.append(","); sBuilder.append(ROLE_CONSTANT_SECRET); sBuilder.append(secret); sBuilder.append(","); sBuilder.append(ROLE_CONSTANT_CREATIONTS); sBuilder.append(currentTS); sBuilder.append(")"); log.trace("Finale VDDS Role: " + sBuilder.toString()); return sBuilder.toString(); } catch(NoSuchAlgorithmException | UnsupportedEncodingException e) { log.error("VDDSRoleGeneration FAILED with error: " + e.getMessage(), e); throw new EgovUtilException("VDDSRoleGeneration FAILED", e); } } }