package org.exoplatform.platform.common.software.register; import org.apache.commons.codec.binary.Base64; import org.bouncycastle.jce.provider.BouncyCastleProvider; import org.exoplatform.services.log.ExoLogger; import org.exoplatform.services.log.Log; import java.io.*; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.security.Provider; import java.security.Security; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Properties; /** * @author <a href="fbradai@exoplatform.com">Fbradai</a> */ public class Utils { public static final String UNLIMITED="UNLIMITED"; private static final Log LOG = ExoLogger.getLogger(Utils.class); public static final int DEFAULT_DELAY_PERIOD = 30; public static final String REMIND_DATE = "remindDate"; //this information would be put in the license.xml file, not problem even if user force it to true (hack tentation) // it will only hide the bar public static final String IS_EXTENDED = "extension"; public static final String PRODUCT_KEY = "license"; public static final String USER_HOME = System.getProperty("user.home"); public static final String EXO_HOME_FOLDER = USER_HOME + "/.eXo"; public static final String PRODUCT_NAME = "Platform"; public static final DateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy"); public static final String PRODUCT_CODE = "ProductCode"; public static String HOME_CONFIG_FILE_LOCATION; public static String HOME_CONFIG_LOCATION; public static final String LICENSE_FILE = "license.xml"; public static final String SW_REG_SKIPPED = "skipped"; public static final String SW_REG_STATUS = "status"; public static final String SW_REG_PLF_VERSION = "version"; public static String getModifiedMD5Code(byte[] dataToHash) { Security.addProvider(new BouncyCastleProvider()); Provider provBC = Security.getProvider("BC"); MessageDigest digest = null; try { digest = MessageDigest.getInstance("MD5", provBC); } catch (NoSuchAlgorithmException exception) { throw new RuntimeException(exception); } digest.update(dataToHash); byte[] hashMD5 = digest.digest(dataToHash); StringBuffer hashMD5String = new StringBuffer(); for (int i = 0; i < hashMD5.length; i++) { hashMD5[i] %= 26; hashMD5[i] = (byte) Math.abs(hashMD5[i]); hashMD5[i] += ((byte) 'A' - 1); hashMD5String.append(((char) hashMD5[i])); } return hashMD5String.toString(); } public static String readFromFile(String key, String fileLocation) { if (fileLocation == null || fileLocation.isEmpty() || !new File(fileLocation).exists()) { throw new IllegalArgumentException("Illegal file Location parameter: " + fileLocation); } try { Properties properties = new Properties(); InputStream inputStream = new FileInputStream(fileLocation); properties.loadFromXML(inputStream); inputStream.close(); return (String) properties.get(key); } catch (Exception exception) { throw new RuntimeException(exception); } } public static String formatDate(Calendar date) { return dateFormat.format(date.getTime()); } public static void writeRemindDate(String remindDateStringBase64, String fileLocation) { writeToFile(REMIND_DATE, remindDateStringBase64, fileLocation); } public static Calendar parseDateBase64(String dateString) { try { dateString = new String(Base64.decodeBase64(dateString.getBytes())); Calendar calendar = Calendar.getInstance(); calendar.setTime(dateFormat.parse(dateString)); return calendar; } catch (Exception exception) { throw new RuntimeException(exception); } } public static String formatDateBase64(Calendar date) { return new String(Base64.encodeBase64(formatDate(date).getBytes())); } public static void writeToFile(String key, String value, String fileLocation) { if (fileLocation == null || fileLocation.isEmpty()) { throw new IllegalArgumentException("Illegal empty file Location parameter."); } InputStream inputStream = null; OutputStream outputStream = null; try { Properties properties = new Properties(); File file = new File(fileLocation); if (file.exists()) { inputStream = new FileInputStream(fileLocation); properties.loadFromXML(inputStream); inputStream.close(); } else { verifyAndCreateParentFolder(fileLocation); } properties.put(key, value); outputStream = new FileOutputStream(fileLocation); properties.storeToXML(outputStream, ""); outputStream.close(); } catch (Exception exception) { if (outputStream != null) { try { outputStream.close(); } catch (IOException ioException) { LOG.error("Error during close outputStream ", ioException); } } if (inputStream != null) { try { inputStream.close(); } catch (IOException ioException) { LOG.error("Error during close inputStream ", ioException); } } } } private static void verifyAndCreateParentFolder(String fileLocation) { String parentFolderPath = fileLocation.replace("\\", "/"); int parentFolderPathEndIndex = fileLocation.lastIndexOf("/"); if (parentFolderPathEndIndex >= 0) { parentFolderPath = fileLocation.substring(0, parentFolderPathEndIndex); } if (!new File(parentFolderPath).exists()) { new File(parentFolderPath).mkdirs(); } } }