package com.zy.system.entity.license; 
 | 
  
 | 
import de.schlichtherle.license.*; 
 | 
import org.apache.logging.log4j.LogManager; 
 | 
import org.apache.logging.log4j.Logger; 
 | 
import org.apache.tomcat.util.http.fileupload.IOUtils; 
 | 
  
 | 
import java.io.File; 
 | 
import java.io.FileOutputStream; 
 | 
import java.io.InputStream; 
 | 
import java.text.DateFormat; 
 | 
import java.text.MessageFormat; 
 | 
import java.text.SimpleDateFormat; 
 | 
import java.util.prefs.Preferences; 
 | 
  
 | 
/** 
 | 
 * License校验类 
 | 
 */ 
 | 
public class LicenseVerify { 
 | 
    private static Logger logger = LogManager.getLogger(LicenseVerify.class); 
 | 
  
 | 
    /** 
 | 
     * 安装License证书 
 | 
     */ 
 | 
    public synchronized LicenseContent install(LicenseVerifyParam param){ 
 | 
        LicenseContent result = null; 
 | 
        DateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
 | 
  
 | 
        //1. 安装证书 
 | 
        try{ 
 | 
            LicenseManager licenseManager = LicenseManagerHolder.getInstance(initLicenseParam(param)); 
 | 
            licenseManager.uninstall(); 
 | 
  
 | 
            InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream(param.getLicensePath()); 
 | 
            File file = new File(param.getLicensePath()); 
 | 
            try (FileOutputStream out = new FileOutputStream(file)) { 
 | 
                IOUtils.copy(inputStream, out); 
 | 
            } 
 | 
  
 | 
            result = licenseManager.install(new File(param.getLicensePath())); 
 | 
            logger.info(MessageFormat.format("许可证加载成功,许可证有效期:{0} - {1}",format.format(result.getNotBefore()),format.format(result.getNotAfter()))); 
 | 
        }catch (Exception e){ 
 | 
            logger.error("许可证加载失败!",e); 
 | 
        } 
 | 
  
 | 
        return result; 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 校验License证书 
 | 
     */ 
 | 
    public boolean verify(){ 
 | 
        try { 
 | 
            LicenseManager licenseManager = LicenseManagerHolder.getInstance(null); 
 | 
            DateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
 | 
  
 | 
            if (!updateSystemTime()) { 
 | 
                //时间更新失败,系统时间被更改 
 | 
                return false; 
 | 
            } 
 | 
  
 | 
            LicenseContent licenseContent = licenseManager.verify(); 
 | 
            logger.info(MessageFormat.format("许可证校验通过,许可证有效期:{0} - {1}",format.format(licenseContent.getNotBefore()),format.format(licenseContent.getNotAfter()))); 
 | 
            return true; 
 | 
        }catch (Exception e){ 
 | 
            logger.error("许可证校验失败!",e); 
 | 
            return false; 
 | 
        } 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 校验License证书并获取证书信息 
 | 
     */ 
 | 
    public LicenseContent getVerifyInfo(){ 
 | 
        LicenseManager licenseManager = LicenseManagerHolder.getInstance(null); 
 | 
  
 | 
        if (!updateSystemTime()) { 
 | 
            //时间更新失败,系统时间被更改 
 | 
            return null; 
 | 
        } 
 | 
  
 | 
        //校验证书 
 | 
        try { 
 | 
            LicenseContent licenseContent = licenseManager.verify(); 
 | 
            return licenseContent; 
 | 
        }catch (Exception e){ 
 | 
            logger.error("许可证校验失败!",e); 
 | 
            return null; 
 | 
        } 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 初始化证书生成参数 
 | 
     * @param param License校验类需要的参数 
 | 
     * @return de.schlichtherle.license.LicenseParam 
 | 
     */ 
 | 
    private LicenseParam initLicenseParam(LicenseVerifyParam param){ 
 | 
        Preferences preferences = Preferences.userNodeForPackage(LicenseVerify.class); 
 | 
  
 | 
        CipherParam cipherParam = new DefaultCipherParam(param.getStorePass()); 
 | 
  
 | 
        KeyStoreParam publicStoreParam = new CustomKeyStoreParam(LicenseVerify.class 
 | 
                ,param.getPublicKeysStorePath() 
 | 
                ,param.getPublicAlias() 
 | 
                ,param.getStorePass() 
 | 
                ,null); 
 | 
  
 | 
        return new DefaultLicenseParam(param.getSubject() 
 | 
                ,preferences 
 | 
                ,publicStoreParam 
 | 
                ,cipherParam); 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 更新时间到注册表中 
 | 
     */ 
 | 
    private boolean updateSystemTime() { 
 | 
        // 获取用户根节点 
 | 
        Preferences userRoot = Preferences.userRoot(); 
 | 
        // 获取指定路径下的节点 
 | 
        Preferences node = userRoot.node("/zhongyang"); 
 | 
        String key = "time"; 
 | 
        // 读取注册表 
 | 
        String value = node.get(key, null); 
 | 
        if (value != null) { 
 | 
            long originTime = Long.parseLong(value); 
 | 
            long now = System.currentTimeMillis(); 
 | 
            long diff = now - originTime;//现在时间 - 源时间 = 时间差 
 | 
            if (diff > 0) { 
 | 
                //时间差大于0才允许更新注册表时间 
 | 
                node.put(key, String.valueOf(System.currentTimeMillis())); 
 | 
                return true; 
 | 
            } 
 | 
        }else { 
 | 
            // 写入注册表 
 | 
            node.put(key, String.valueOf(System.currentTimeMillis())); 
 | 
            return true; 
 | 
        } 
 | 
        return false; 
 | 
    } 
 | 
  
 | 
} 
 |