package com.genersoft.iot.vmp.conf; import com.alibaba.fastjson2.JSON; import com.genersoft.iot.vmp.utils.DateUtil; import net.roseboy.classfinal.util.IoUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.util.Base64Utils; import java.io.File; public class AuthorizeApprove { // 机器码 private String machineCode; // 加密后的授权数据 private String encryptAuthorData; // 请求生成时间 private String requestTime; // 批准生成时间 private String approveTime; // 批准人 private String approver; // 授权天数 private int authorizeDay; public final static String baseAuthorizeApproveFilePath = "authorize/authorizeApprove.hfy"; private final static Logger logger = LoggerFactory.getLogger(AuthorizeApprove.class); // 读取授权文件 private static byte[] readAuthorizeApproveFile(String path) { if(path == null) { path = baseAuthorizeApproveFilePath; } // logger.info("path: {}", path); File file = new File(path); if(!file.exists()) { logger.error("无法解析授权请求文件"); return null; } byte[] data = IoUtils.readFileToByte(file); // 解析授权文件 return data; } public static String getApprovePasswd(AuthorData authorData, String machineCode) { return authorData.getPassword() + machineCode + authorData.getAuthorizeTime(); } // 加密并保存授权批准文件 public static boolean saveAuthorizeApproveFile(AuthorizeApprove authorizeApprove,AuthorData authorData, String targetPath) { if (authorizeApprove == null) { logger.error("授权批准文件为空, 无法保存"); return false; } if (targetPath == null) { logger.error("请输入授权文件保存路径"); return false; } // 生成授权批准文件 String approveStr = JSON.toJSONString(authorizeApprove); String password = getApprovePasswd(authorData, authorData.getMachineCode()); try{ // 加密授权文件 String encryptStr = AesUtils.encrypt(approveStr, password); // 使用 base64 转换文本 byte[] approveData = encryptStr.getBytes(); byte[] approveByte = Base64Utils.encode(approveData); // 保存授权文件 File file = new File(targetPath); if (file.exists()) { file.delete(); logger.info("授权批准文件已存在, 正在覆盖"); } file.createNewFile(); IoUtils.writeTxtFile(file, approveByte.toString()); return true; }catch(Exception e) { logger.error("授权批准文件生成失败. 请检查练习管理员进行排查. "); logger.error("错误信息: {}", e.getMessage()); return false; } } // 生成授权文件 public static AuthorizeApprove generateAuthorizeApprove(String machineCode, String authorizeFilePath, String approver, int p_authorizeDay ) { // 获取密文 String encryptAuthorData = Authorize.getEncryptAuthorData(authorizeFilePath); // 读取授权文件 AuthorData authorData = Authorize.parseBaseAuthorizeFile(machineCode, authorizeFilePath); if (authorData == null) { logger.error("授权文件解析失败,请检查对应文件是否正确"); return null; } // 判断机器码是否一致 if (!authorData.getMachineCode().equals(machineCode)) { logger.error("授权文件机器码不一致,请检查对应文件是否正确"); return null; } // 生成授权批准文件 AuthorizeApprove authorizeApprove = new AuthorizeApprove(); // 机器码 authorizeApprove.setMachineCode(machineCode); // 授权请求时间 authorizeApprove.setRequestTime(authorData.getAuthorizeTime()); // 授权发布时间 authorizeApprove.setRequestTime(DateUtil.getNowForISO8601()); // 请求密文 authorizeApprove.setEncryptAuthorData(encryptAuthorData); // 授权天数 authorizeApprove.setAuthorizeDay(p_authorizeDay); // 批准人 authorizeApprove.setApprover(approver); return authorizeApprove; } /** * 解析授权批准文件 * @param machineCode 机器码 * @param authorData 授权数据 * @return */ public static AuthorizeApprove parseAuthorizeApprove (String authorizeApproveFilePath, String machineCode, AuthorData authorData) { if (authorData == null) { logger.info("授权数据解析失败"); return null; } authorizeApproveFilePath = authorizeApproveFilePath == null ? baseAuthorizeApproveFilePath : authorizeApproveFilePath; // 读取授权批准文件 byte[] approveByte = readAuthorizeApproveFile(authorizeApproveFilePath); if (approveByte == null) { logger.info("授权批准文件读取失败,请检查对应文件是否正确"); return null; } // 解析授权批准文件 AuthorizeApprove authorizeApprove = null; // 使用 base64 转换文本 byte[] approveData = Base64Utils.decode(approveByte); String code = new String(approveData); // 解密授权文件 String password = getApprovePasswd(authorData, machineCode); try { String decryptStr = AesUtils.decrypt(code, password); authorizeApprove = JSON.parseObject(decryptStr, AuthorizeApprove.class); return authorizeApprove; }catch(Exception e) { logger.error("授权授权请求文件解析失败. 请检查练习管理员进行排查. "); logger.error("错误信息: {}", e.getMessage()); return null; } } public String getMachineCode() { return machineCode; } public void setMachineCode(String machineCode) { this.machineCode = machineCode; } public String getEncryptAuthorData() { return encryptAuthorData; } public void setEncryptAuthorData(String encryptAuthorData) { this.encryptAuthorData = encryptAuthorData; } public String getRequestTime() { return requestTime; } public void setRequestTime(String requestTime) { this.requestTime = requestTime; } public String getApproveTime() { return approveTime; } public void setApproveTime(String approveTime) { this.approveTime = approveTime; } public String getApprover() { return approver; } public void setApprover(String approver) { this.approver = approver; } public int getAuthorizeDay() { return authorizeDay; } public void setAuthorizeDay(int authorizeDay) { this.authorizeDay = authorizeDay; } }