package net.curisit.securis.services.helpers; import java.io.File; import java.io.IOException; import java.nio.file.Files; import java.util.Date; import java.util.HashMap; import java.util.Map; import java.util.Set; import javax.enterprise.context.ApplicationScoped; import javax.inject.Inject; import javax.persistence.EntityManager; import javax.persistence.TypedQuery; import net.curisit.securis.beans.LicenseBean; import net.curisit.securis.db.License; import net.curisit.securis.db.LicenseHistory; import net.curisit.securis.db.LicenseStatus; import net.curisit.securis.db.Pack; import net.curisit.securis.db.PackMetadata; import net.curisit.securis.db.User; import net.curisit.securis.security.BasicSecurityContext; import net.curisit.securis.services.exception.SeCurisServiceException; import net.curisit.securis.services.exception.SeCurisServiceException.ErrorCodes; import org.apache.commons.io.FileUtils; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @ApplicationScoped public class LicenseHelper { @SuppressWarnings("unused") private static final Logger LOG = LogManager.getLogger(LicenseHelper.class); private static final long MS_PER_DAY = 24L * 3600L * 1000L; private static final int DEFAULT_VALID_LIC_PERIOD = 7; @Inject private UserHelper userHelper; /** * Cancel the license * * @param lic * @param em */ public void cancelLicense(License lic, String reason, BasicSecurityContext bsc, EntityManager em) throws SeCurisServiceException { lic.setStatus(LicenseStatus.CANCELLED); lic.setCancelledById(bsc.getUserPrincipal().getName()); lic.setModificationTimestamp(new Date()); em.persist(lic); em.persist(createLicenseHistoryAction(lic, userHelper.getUser(bsc, em), LicenseHistory.Actions.CANCEL, "Cancellation reason: " + reason)); } /** * Validates that the passed license is still valid * * @param lic * @param reason * @param bsc * @param em * @throws SeCurisServiceException */ public void assertLicenseStatusIsActive(LicenseBean licBean, EntityManager em) throws SeCurisServiceException { License lic = License.findLicenseByCode(licBean.getLicenseCode(), em); if (lic == null) { throw new SeCurisServiceException(ErrorCodes.NOT_FOUND, "Current license code doesn't exist"); } if (lic.getStatus() != LicenseStatus.ACTIVE && lic.getStatus() != LicenseStatus.PRE_ACTIVE) { throw new SeCurisServiceException(ErrorCodes.INVALID_DATA, "Current license in not active"); } } public LicenseHistory createLicenseHistoryAction(License lic, User user, String action, String comments) { LicenseHistory lh = new LicenseHistory(); lh.setLicense(lic); lh.setUser(user); lh.setCreationTimestamp(new Date()); lh.setAction(action); lh.setComments(comments); return lh; } public LicenseHistory createLicenseHistoryAction(License lic, User user, String action) { return createLicenseHistoryAction(lic, user, action, null); } /** * Create a license file in a temporary directory * * @param lic * @param licFileName * @return * @throws IOException */ public File createTemporaryLicenseFile(License lic, String licFileName) throws IOException { File f = Files.createTempDirectory("securis-server").toFile(); f = new File(f, licFileName); FileUtils.writeStringToFile(f, lic.getLicenseData()); return f; } public Map extractPackMetadata(Set packMetadata) { Map metadata = new HashMap<>(); for (PackMetadata md : packMetadata) { metadata.put(md.getKey(), md.getValue()); } return metadata; } /** * If the action is a renew the expiration date is got form pack end valid * date, if the action is a pre-activation the expiration date is calculated * using the pack default valid period * * @param pack * @param isPreActivation * @return */ public Date getExpirationDateFromPack(Pack pack, boolean isPreActivation) { Long validPeriod; if (isPreActivation) { validPeriod = pack.getPreactivationValidPeriod() * MS_PER_DAY; } else { if (pack.getRenewValidPeriod() <= 0) { return pack.getEndValidDate(); } validPeriod = pack.getRenewValidPeriod() * MS_PER_DAY; } Date expirationDate = new Date(new Date().getTime() + validPeriod); return expirationDate; } /** * Get the next free code suffis for a given Pack * * @param packId * @param em * @return */ public int getNextCodeSuffix(int packId, EntityManager em) { TypedQuery query = em.createNamedQuery("last-code-suffix-used-in-pack", Integer.class); query.setParameter("packId", packId); Integer lastCodeSuffix = query.getSingleResult(); return lastCodeSuffix == null ? 1 : lastCodeSuffix + 1; } }