package com.ruoyi.authorize.service; 
 | 
  
 | 
import com.alibaba.fastjson2.JSON; 
 | 
import com.alibaba.fastjson2.JSONObject; 
 | 
import com.ruoyi.authorize.common.AuthorizeUtil; 
 | 
import com.ruoyi.authorize.common.DateTimeUtil; 
 | 
import com.ruoyi.authorize.domain.AuthorizeInfo; 
 | 
import com.ruoyi.authorize.domain.ParsLicenseInfo; 
 | 
import com.ruoyi.common.constant.CacheConstants; 
 | 
import com.ruoyi.common.core.redis.RedisCache; 
 | 
import lombok.extern.slf4j.Slf4j; 
 | 
import org.apache.commons.compress.utils.IOUtils; 
 | 
import org.springframework.stereotype.Service; 
 | 
import org.springframework.web.multipart.MultipartFile; 
 | 
  
 | 
import javax.annotation.PostConstruct; 
 | 
import javax.annotation.Resource; 
 | 
import java.io.BufferedReader; 
 | 
import java.io.File; 
 | 
import java.io.FileReader; 
 | 
import java.io.IOException; 
 | 
import java.text.ParseException; 
 | 
import java.util.concurrent.TimeUnit; 
 | 
  
 | 
  
 | 
@Service 
 | 
@Slf4j(topic = "Authorize") 
 | 
public class AuthorizeServiceImpl implements AuthorizeService { 
 | 
    @Resource 
 | 
    private RedisCache redisCache; 
 | 
  
 | 
    @PostConstruct 
 | 
    public void init() { 
 | 
        log.debug("尝试获取获取机器码"); 
 | 
        AuthorizeUtil.MachineCode = AuthorizeUtil.getMachineCode(); 
 | 
        log.debug("机器码获取成功:" + AuthorizeUtil.MachineCode); 
 | 
        redisCache.setCacheObject(getCacheKey("MachineCode"), AuthorizeUtil.MachineCode); 
 | 
    } 
 | 
  
 | 
  
 | 
    /** 
 | 
     * 系统授权时间判断 
 | 
     * 
 | 
     * @return boolean 
 | 
     */ 
 | 
    public boolean isExpired(AuthorizeInfo Info) { 
 | 
        try { 
 | 
            if (Info != null) { 
 | 
                String dateStr = Info.getSystemAuthorizeDate(); 
 | 
                dateStr = DateTimeUtil.strToDateFormat(dateStr); 
 | 
                //授权到期时间 
 | 
                long dates = DateTimeUtil.getLongDate(dateStr); 
 | 
                long currentTime = DateTimeUtil.getCurrentLongDate(); 
 | 
                //授权是否到期 
 | 
                if (dates >= currentTime) { 
 | 
                    return true; 
 | 
                } 
 | 
            } 
 | 
        } catch (ParseException e) { 
 | 
            log.error("系统授权时间判断异常:" + e.getMessage()); 
 | 
        } 
 | 
        return false; 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 解析授权文件 
 | 
     * 
 | 
     * @return AuthorizeInfo 
 | 
     */ 
 | 
    public AuthorizeInfo parseFiles(File file) { 
 | 
        BufferedReader reader = null; 
 | 
        try { 
 | 
            //用流读取文件 
 | 
            reader = new BufferedReader(new FileReader(file)); 
 | 
            String line; 
 | 
            StringBuffer content = new StringBuffer(); 
 | 
            // 读取想定文件 
 | 
            while ((line = reader.readLine()) != null) { 
 | 
                content.append(line); 
 | 
            } 
 | 
            String MachineCode = AuthorizeUtil.MachineCode; 
 | 
            String str = AuthorizeUtil.parsLicense(MachineCode, content.toString()); 
 | 
            if (str != null) { 
 | 
                AuthorizeInfo info = JSONObject.parseObject(str, AuthorizeInfo.class); 
 | 
                return info; 
 | 
            } 
 | 
        } catch (IOException e) { 
 | 
            log.error("解析授权文件异常:" + e.getMessage()); 
 | 
            return null; 
 | 
        } finally { 
 | 
            if (reader != null) { 
 | 
                IOUtils.closeQuietly(reader); 
 | 
            } 
 | 
        } 
 | 
        return null; 
 | 
    } 
 | 
  
 | 
    @Override 
 | 
    public JSONObject verifyAuthorization() { 
 | 
        try { 
 | 
            JSONObject data = new JSONObject(); 
 | 
            String savedDir = System.getProperty("user.dir") + "\\ardLicense"; 
 | 
            File dir = new File(savedDir); 
 | 
            if (!dir.exists()) { //如果不存在 
 | 
                boolean dr = dir.mkdirs(); //创建目录 
 | 
            } 
 | 
            //从缓存中获取最后一次验证授权的时间 
 | 
            Object auth_time = redisCache.getCacheObject(getCacheKey("AuthTime")); 
 | 
            if (auth_time != null) { 
 | 
                long lasttime = Long.parseLong(auth_time.toString()); 
 | 
                long currentTime = DateTimeUtil.getCurrentLongDate(); 
 | 
                if (currentTime <= lasttime) { 
 | 
                    data.put("Type", "error"); 
 | 
                    data.put("Message", "系统时间异常"); 
 | 
                    return data; 
 | 
                } 
 | 
            } 
 | 
            File LicenseFile = new File(savedDir + "/license.cpy");//获取授权文件 
 | 
            if (LicenseFile.exists()) { 
 | 
                AuthorizeInfo info = parseFiles(LicenseFile);//解析授权文件 
 | 
                if (info != null) { 
 | 
                    if (isExpired(info)) { 
 | 
                        data.put("Type", "normal"); 
 | 
                        data.put("Message", info.getSystemAuthorizeDate()); 
 | 
  
 | 
                    } else { 
 | 
                        data.put("Type", "expired"); 
 | 
                        data.put("Message", info.getSystemAuthorizeDate()); 
 | 
                    } 
 | 
  
 | 
                } else { 
 | 
                    data.put("Type", "mismatch"); 
 | 
                    data.put("Message", "License mismatch"); 
 | 
                } 
 | 
            } else { 
 | 
                data.put("Type", "mismatch"); 
 | 
                data.put("Message", "License mismatch"); 
 | 
            } 
 | 
            //验证结束,写入最后一次验证的时间到缓存 
 | 
            redisCache.setCacheObject(getCacheKey("AuthTime"), DateTimeUtil.getCurrentLongDate().toString()); 
 | 
            return data; 
 | 
        } catch (Exception ex) { 
 | 
            log.error("验证授权异常:" + ex.getMessage()); 
 | 
            return null; 
 | 
        } 
 | 
    } 
 | 
  
 | 
    @Override 
 | 
    public JSONObject makeTempLicense() { 
 | 
        String savedDir = System.getProperty("user.dir") + "\\ardLicense"; 
 | 
        String tempLicenseDate = AuthorizeUtil.makeTempLicense(savedDir + "\\license.cpy"); 
 | 
        JSONObject data = new JSONObject(); 
 | 
        data.put("Type", "makeTempLicense"); 
 | 
        data.put("Message", tempLicenseDate); 
 | 
        return data; 
 | 
    } 
 | 
  
 | 
    @Override 
 | 
    public JSONObject getMachineCode() { 
 | 
        try { 
 | 
            String machineCode = AuthorizeUtil.getMachineCode(); 
 | 
            AuthorizeUtil.MachineCode = machineCode; 
 | 
            log.debug("获取到机器码:" + machineCode); 
 | 
            JSONObject data = new JSONObject(); 
 | 
            data.put("Type", "machineCode"); 
 | 
            data.put("Message", machineCode); 
 | 
            return data; 
 | 
        } catch (Exception ex) { 
 | 
            log.error("获取机器码异常:" + ex.getMessage()); 
 | 
            return null; 
 | 
        } 
 | 
    } 
 | 
  
 | 
    @Override 
 | 
    public JSONObject uploadLicense(MultipartFile file) { 
 | 
        try { 
 | 
            String fileRealName = file.getOriginalFilename(); //获得原始文件名; 
 | 
            String savedDir = System.getProperty("user.dir") + "\\ardLicense"; 
 | 
            File dir = new File(savedDir); 
 | 
            if (!dir.exists()) { //如果不存在 
 | 
                boolean dr = dir.mkdirs(); //创建目录 
 | 
            } 
 | 
            File LicenseFile = new File(savedDir, fileRealName); 
 | 
            try { 
 | 
                file.transferTo(LicenseFile);  //转存文件 
 | 
            } catch (IOException e) { 
 | 
                e.printStackTrace(); 
 | 
            } 
 | 
            JSONObject data = new JSONObject(); 
 | 
            data.put("Type", "uploadLicenseFile"); 
 | 
            data.put("Message", "Dir:" + savedDir); 
 | 
            return data; 
 | 
        } catch (Exception ex) { 
 | 
            log.error("获取机器码异常:" + ex.getMessage()); 
 | 
            return null; 
 | 
        } 
 | 
    } 
 | 
  
 | 
    @Override 
 | 
    public String getLicense(String data) { 
 | 
        String codeString = ""; 
 | 
        try { 
 | 
            if (data != "") { 
 | 
                //解析json 
 | 
                AuthorizeInfo rt = JSON.parseObject(data, AuthorizeInfo.class); 
 | 
                String machineCode = rt.getMachineCode(); 
 | 
                String key = data; 
 | 
                if (machineCode != "" && key != "") { 
 | 
                    codeString = AuthorizeUtil.getLicense(machineCode, key); 
 | 
                } 
 | 
            } 
 | 
            return codeString; 
 | 
        } catch (Exception ex) { 
 | 
            log.error("加密异常:" + ex.getMessage()); 
 | 
            return codeString; 
 | 
        } 
 | 
    } 
 | 
  
 | 
    @Override 
 | 
    public String parsLicense(String data) { 
 | 
        String codeString = ""; 
 | 
        try { 
 | 
            if (data != "") { 
 | 
                //解析json 
 | 
                ParsLicenseInfo rt = JSON.parseObject(data, ParsLicenseInfo.class); 
 | 
                String machineCode = rt.getMachineCode(); 
 | 
                String key = rt.getEncryptedStr(); 
 | 
                codeString = AuthorizeUtil.parsLicense(machineCode, key); 
 | 
            } 
 | 
        } catch (Exception ex) { 
 | 
            log.error("解密异常:" + ex.getMessage()); 
 | 
            return codeString; 
 | 
        } 
 | 
        return codeString; 
 | 
  
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 设置cache key 
 | 
     * 
 | 
     * @param configKey 参数键 
 | 
     * @return 缓存键key 
 | 
     */ 
 | 
    private String getCacheKey(String configKey) { 
 | 
        return CacheConstants.AUTH_CONFIG_KEY + configKey; 
 | 
    } 
 | 
} 
 |