| | |
| | | package com.zy.system.controller; |
| | | |
| | | import com.core.common.Cools; |
| | | import com.core.annotations.ManagerAuth; |
| | | import com.core.common.R; |
| | | import com.zy.system.entity.license.*; |
| | | import com.zy.system.entity.LicenseInfos; |
| | | import com.zy.system.entity.license.LicenseCheckListener; |
| | | import com.zy.system.entity.license.LicenseUploadParam; |
| | | import com.zy.system.entity.license.LicenseUtils; |
| | | import com.zy.system.entity.license.LicenseVerify; |
| | | import com.zy.system.entity.license.LicenseVerifyParam; |
| | | import com.zy.system.service.LicenseInfosService; |
| | | import com.zy.system.timer.LicenseTimer; |
| | | import de.schlichtherle.license.LicenseContent; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.beans.factory.annotation.Value; |
| | | import org.springframework.http.MediaType; |
| | | import org.springframework.web.bind.annotation.RequestBody; |
| | | import org.springframework.web.bind.annotation.RequestMapping; |
| | | import org.springframework.web.bind.annotation.RequestParam; |
| | | import org.springframework.web.bind.annotation.RestController; |
| | | import org.springframework.web.multipart.MultipartFile; |
| | | |
| | | import java.io.File; |
| | | import java.io.IOException; |
| | | import java.text.SimpleDateFormat; |
| | | import java.util.Base64; |
| | | import java.util.Date; |
| | | |
| | | /** |
| | | * |
| | | * 用于生成证书文件,不能放在给客户部署的代码里 |
| | | * 许可证运行时管理 |
| | | */ |
| | | @RestController |
| | | @RequestMapping("/license") |
| | | public class LicenseCreatorController { |
| | | |
| | | @Value("${license.licensePath}") |
| | | private String licensePath; |
| | | |
| | | @Value("${license.subject}") |
| | | private String licenseSubject; |
| | | @Value("${license.publicAlias}") |
| | | private String publicAlias; |
| | | @Value("${license.storePass}") |
| | | private String storePass; |
| | | @Value("${license.publicKeysStorePath}") |
| | | private String publicKeysStorePath; |
| | | @Autowired |
| | | private LicenseCheckListener licenseCheckListener; |
| | | @Autowired |
| | | private LicenseTimer licenseTimer; |
| | | @Autowired |
| | | private LicenseInfosService licenseInfosService; |
| | | |
| | | /** |
| | | * 获取服务器硬件信息 |
| | | * @param osName 操作系统类型,如果为空则自动判断 |
| | | * 获取请求码。 |
| | | */ |
| | | @RequestMapping(value = "/getServerInfos",produces = {MediaType.APPLICATION_JSON_UTF8_VALUE}) |
| | | public LicenseCheck getServerInfos(@RequestParam(value = "osName",required = false) String osName) { |
| | | //操作系统类型 |
| | | if(Cools.isEmpty(osName)){ |
| | | osName = System.getProperty("os.name"); |
| | | } |
| | | osName = osName.toLowerCase(); |
| | | @ManagerAuth(value = ManagerAuth.Auth.NONE) |
| | | @RequestMapping(value = "/getRequestCode", produces = {MediaType.APPLICATION_JSON_UTF8_VALUE}) |
| | | public R getRequestCode() { |
| | | return R.ok(LicenseUtils.buildRequestCode(licenseSubject)); |
| | | } |
| | | |
| | | AbstractServerInfos abstractServerInfos = null; |
| | | |
| | | //根据不同操作系统类型选择不同的数据获取方法 |
| | | if (osName.startsWith("windows")) { |
| | | abstractServerInfos = new WindowsServerInfos(); |
| | | } else if (osName.startsWith("linux")) { |
| | | // abstractServerInfos = new LinuxServerInfos(); |
| | | }else{//其他服务器类型 |
| | | abstractServerInfos = new WindowsServerInfos(); |
| | | } |
| | | |
| | | return abstractServerInfos.getServerInfos(); |
| | | /** |
| | | * 获取系统配置。 |
| | | */ |
| | | @ManagerAuth(value = ManagerAuth.Auth.NONE) |
| | | @RequestMapping(value = "/getServerInfos", produces = {MediaType.APPLICATION_JSON_UTF8_VALUE}) |
| | | public Object getServerInfos(@RequestParam(value = "osName", required = false) String osName) { |
| | | return LicenseUtils.getServerInfos(); |
| | | } |
| | | |
| | | /** |
| | | * 获取许可证有效期天数 |
| | | */ |
| | | @RequestMapping(value = "/getLicenseDays") |
| | | @ManagerAuth(value = ManagerAuth.Auth.NONE) |
| | | @RequestMapping(value = "/getLicenseDays", produces = {MediaType.APPLICATION_JSON_UTF8_VALUE}) |
| | | public R getLicenseDays() { |
| | | LicenseVerify licenseVerify = new LicenseVerify(); |
| | | LicenseContent verifyInfo = licenseVerify.getVerifyInfo(); |
| | | if (verifyInfo == null) { |
| | | return R.error(); |
| | | int licenseDays = licenseTimer.getLicenseDays(); |
| | | if (!licenseTimer.getSystemSupport()) { |
| | | licenseDays = -1; |
| | | } |
| | | |
| | | Date start = new Date(); |
| | | Date end = verifyInfo.getNotAfter(); |
| | | Long starTime = start.getTime(); |
| | | Long endTime = end.getTime(); |
| | | Long num = endTime - starTime;//时间戳相差的毫秒数 |
| | | int day = (int) (num / 24 / 60 / 60 / 1000); |
| | | return R.ok().add(day); |
| | | return R.ok(licenseDays); |
| | | } |
| | | |
| | | @RequestMapping(value = "/updateLicense") |
| | | public R updateLicense(@RequestParam("file") MultipartFile[] files){ |
| | | MultipartFile file = files[0]; |
| | | |
| | | String licensePathFileName = this.getClass().getClassLoader().getResource(licensePath).getPath(); |
| | | File licensePathFile = new File(licensePathFileName); |
| | | //服务器端保存的文件对象 |
| | | File serverFile = new File(licensePathFile.getPath()); |
| | | if (serverFile.exists()) { |
| | | try { |
| | | serverFile.delete();//存在文件,删除 |
| | | } catch (Exception e) { |
| | | e.printStackTrace(); |
| | | } |
| | | @ManagerAuth(value = ManagerAuth.Auth.NONE) |
| | | @RequestMapping(value = "/updateLicense", consumes = MediaType.APPLICATION_JSON_VALUE, produces = {MediaType.APPLICATION_JSON_UTF8_VALUE}) |
| | | public R updateLicense(@RequestBody LicenseUploadParam param){ |
| | | if (param == null || param.getLicense() == null || param.getLicense().trim().isEmpty()) { |
| | | return R.error("许可证内容不能为空"); |
| | | } |
| | | return saveAndActivateLicense(param.getLicense().trim()); |
| | | } |
| | | |
| | | @ManagerAuth(value = ManagerAuth.Auth.NONE) |
| | | @RequestMapping(value = "/updateLicense", consumes = MediaType.MULTIPART_FORM_DATA_VALUE, produces = {MediaType.APPLICATION_JSON_UTF8_VALUE}) |
| | | public R updateLicense(@RequestParam("file") MultipartFile[] files) { |
| | | if (files == null || files.length == 0 || files[0] == null || files[0].isEmpty()) { |
| | | return R.error("许可证文件不能为空"); |
| | | } |
| | | try { |
| | | //创建文件 |
| | | serverFile.createNewFile(); |
| | | //将上传的文件写入到服务器端文件内 |
| | | file.transferTo(serverFile); |
| | | } catch (IOException e) { |
| | | e.printStackTrace(); |
| | | String licenseBase64 = Base64.getEncoder().encodeToString(files[0].getBytes()); |
| | | return saveAndActivateLicense(licenseBase64); |
| | | } catch (Exception e) { |
| | | return R.error("许可证读取失败"); |
| | | } |
| | | |
| | | //重新加载许可证 |
| | | boolean loadedLicense = licenseCheckListener.loadLicense(); |
| | | if (loadedLicense) { |
| | | return R.ok(); |
| | | } |
| | | return R.error("许可证更新失败"); |
| | | } |
| | | |
| | | } |
| | | @ManagerAuth(value = ManagerAuth.Auth.NONE) |
| | | @RequestMapping(value = "/activate", produces = {MediaType.APPLICATION_JSON_UTF8_VALUE}) |
| | | public R activate() { |
| | | licenseTimer.timer(); |
| | | if (!licenseTimer.getSystemSupport()) { |
| | | return R.error("许可证激活失败"); |
| | | } |
| | | return R.ok(); |
| | | } |
| | | |
| | | @ManagerAuth(value = ManagerAuth.Auth.NONE) |
| | | @RequestMapping(value = "/getProjectName", produces = {MediaType.APPLICATION_JSON_UTF8_VALUE}) |
| | | public R getProjectName() { |
| | | return R.ok(licenseSubject); |
| | | } |
| | | |
| | | private R saveAndActivateLicense(String licenseBase64) { |
| | | LicenseVerifyParam verifyParam = buildVerifyParam(); |
| | | LicenseVerify licenseVerify = new LicenseVerify(); |
| | | LicenseContent install = licenseVerify.install(verifyParam, licenseBase64); |
| | | if (install == null) { |
| | | return R.error("许可证内容无效"); |
| | | } |
| | | |
| | | LicenseInfos licenseInfos = new LicenseInfos(); |
| | | licenseInfos.setLicense(licenseBase64); |
| | | licenseInfos.setLicenseTime(formatLicenseTime(install)); |
| | | licenseInfos.setRequestCode(LicenseUtils.buildRequestCode(licenseSubject)); |
| | | licenseInfos.setCreateTime(new Date()); |
| | | if (!licenseInfosService.insert(licenseInfos)) { |
| | | return R.error("许可证保存失败"); |
| | | } |
| | | |
| | | boolean loadedLicense = licenseCheckListener.loadLicense(false); |
| | | if (!loadedLicense) { |
| | | return R.error("许可证激活失败"); |
| | | } |
| | | licenseTimer.verify(); |
| | | if (!licenseTimer.getSystemSupport()) { |
| | | return R.error("许可证校验失败"); |
| | | } |
| | | return R.ok(); |
| | | } |
| | | |
| | | private LicenseVerifyParam buildVerifyParam() { |
| | | LicenseVerifyParam param = new LicenseVerifyParam(); |
| | | param.setSubject(licenseSubject); |
| | | param.setPublicAlias(publicAlias); |
| | | param.setStorePass(storePass); |
| | | param.setPublicKeysStorePath(publicKeysStorePath); |
| | | return param; |
| | | } |
| | | |
| | | private String formatLicenseTime(LicenseContent install) { |
| | | SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); |
| | | return format.format(install.getNotBefore()) + " - " + format.format(install.getNotAfter()); |
| | | } |
| | | |
| | | } |