package io.dataease.service.panel; import io.dataease.auth.config.RsaProperties; import io.dataease.auth.util.JWTUtils; import io.dataease.auth.util.RsaUtil; import io.dataease.base.domain.*; import io.dataease.base.mapper.PanelGroupMapper; import io.dataease.base.mapper.PanelLinkMapper; import io.dataease.base.mapper.PanelLinkMappingMapper; import io.dataease.base.mapper.ext.ExtPanelLinkMapper; import io.dataease.commons.utils.AuthUtils; import io.dataease.commons.utils.ServletUtils; import io.dataease.controller.request.panel.link.EnablePwdRequest; import io.dataease.controller.request.panel.link.LinkRequest; import io.dataease.controller.request.panel.link.OverTimeRequest; import io.dataease.controller.request.panel.link.PasswordRequest; import io.dataease.dto.panel.link.GenerateDto; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.util.List; import java.util.Optional; @Service public class PanelLinkService { private static final String BASEURL = "/link.html?link="; private static final String USERPARAM = "&user="; private static final String SHORT_URL_PREFIX = "/link/"; @Resource private PanelLinkMapper mapper; @Resource private PanelGroupMapper panelGroupMapper; @Resource private ExtPanelLinkMapper extPanelLinkMapper; @Resource private PanelLinkMappingMapper panelLinkMappingMapper; public void changeValid(LinkRequest request) { PanelLink po = new PanelLink(); po.setResourceId(request.getResourceId()); po.setValid(request.isValid()); mapper.updateByExampleSelective(po, example(request.getResourceId(), AuthUtils.getUser().getUserId())); } private PanelLinkExample example(String panelLinkId, Long userId){ PanelLinkExample example = new PanelLinkExample(); example.createCriteria().andResourceIdEqualTo(panelLinkId).andUserIdEqualTo(userId); return example; } public void changeEnablePwd(EnablePwdRequest request) { PanelLink po = new PanelLink(); po.setResourceId(request.getResourceId()); po.setEnablePwd(request.isEnablePwd()); mapper.updateByExampleSelective(po, example(request.getResourceId(), AuthUtils.getUser().getUserId())); } public void password(PasswordRequest request) { PanelLink po = new PanelLink(); po.setResourceId(request.getResourceId()); po.setPwd(request.getPassword()); mapper.updateByExampleSelective(po, example(request.getResourceId(), AuthUtils.getUser().getUserId())); } public void overTime(OverTimeRequest request) { request.setUserId(AuthUtils.getUser().getUserId()); extPanelLinkMapper.updateOverTime(request); } private PanelLink findOne(String resourceId) { PanelLinkExample example = new PanelLinkExample(); example.createCriteria().andResourceIdEqualTo(resourceId).andUserIdIsNull(); List list = mapper.selectByExample(example); return CollectionUtils.isNotEmpty(list) ? list.get(0) : null; } public PanelLink findOne(String resourceId, Long userId) { if(userId == null){ return findOne(resourceId); } List panelLinks = mapper.selectByExample(example(resourceId, userId)); if(CollectionUtils.isNotEmpty(panelLinks)){ return panelLinks.get(0); }else { return null; } } @Transactional public GenerateDto currentGenerate(String resourceId) { PanelLink one = findOne(resourceId, AuthUtils.getUser().getUserId()); if (ObjectUtils.isEmpty(one)) { one = new PanelLink(); one.setPwd(null); one.setResourceId(resourceId); one.setValid(false); one.setUserId(AuthUtils.getUser().getUserId()); one.setEnablePwd(false); mapper.insert(one); } PanelLinkMappingExample example = new PanelLinkMappingExample(); example.createCriteria().andResourceIdEqualTo(resourceId).andUserIdEqualTo(AuthUtils.getUser().getUserId()); List mappings = panelLinkMappingMapper.selectByExample(example); if (CollectionUtils.isEmpty(mappings)) { PanelLinkMapping mapping = new PanelLinkMapping(); mapping.setResourceId(resourceId); mapping.setUserId(AuthUtils.getUser().getUserId()); panelLinkMappingMapper.insert(mapping); } return convertDto(one); } public void deleteByResourceId(String resourceId) { PanelLinkExample example = new PanelLinkExample(); example.createCriteria().andResourceIdEqualTo(resourceId); mapper.deleteByExample(example); } public String decryptParam(String text) throws Exception { return RsaUtil.decryptByPrivateKey(RsaProperties.privateKey, text); } // 使用公钥加密 private String encrypt(String sourceValue) { try { return RsaUtil.encryptByPublicKey(RsaProperties.publicKey, sourceValue); } catch (Exception e) { e.printStackTrace(); } return null; } private String buildLinkParam(PanelLink link) { String linkParam = encrypt(link.getResourceId()); if(link.getUserId() != null){ linkParam = linkParam+ USERPARAM + link.getUserId().toString(); } return linkParam; } private GenerateDto convertDto(PanelLink link) { GenerateDto result = new GenerateDto(); result.setValid(link.getValid()); result.setEnablePwd(link.getEnablePwd()); result.setPwd(link.getPwd()); result.setUri(BASEURL + buildLinkParam(link)); result.setOverTime(link.getOverTime()); return result; } // 验证请求头部携带的信息 如果正确说明通过密码验证 否则没有通过 public Boolean validateHeads(PanelLink panelLink) throws Exception { HttpServletRequest request = ServletUtils.request(); String token = request.getHeader("LINK-PWD-TOKEN"); if (!panelLink.getEnablePwd() || StringUtils.isEmpty(token) || StringUtils.equals("undefined", token) || StringUtils.equals("null", token)) { String resourceId = panelLink.getResourceId(); String pwd = "dataease"; String tk = JWTUtils.signLink(resourceId, panelLink.getUserId(), pwd); HttpServletResponse httpServletResponse = ServletUtils.response(); httpServletResponse.addHeader("Access-Control-Expose-Headers", "LINK-PWD-TOKEN"); httpServletResponse.setHeader("LINK-PWD-TOKEN", tk); return false; } if (StringUtils.isEmpty(panelLink.getPwd())) return false; return JWTUtils.verifyLink(token, panelLink.getResourceId(), panelLink.getUserId(), panelLink.getPwd()); } // 验证链接是否过期 public Boolean isExpire(PanelLink panelLink) { if (ObjectUtils.isEmpty(panelLink.getOverTime())) { return false; } return System.currentTimeMillis() > panelLink.getOverTime(); } public boolean validatePwd(PasswordRequest request) throws Exception { String password = request.getPassword(); String resourceId = request.getResourceId(); PanelLink one = findOne(resourceId, request.getUser()); String pwd = one.getPwd(); boolean pass = StringUtils.equals(pwd, password); if (pass) { String token = JWTUtils.signLink(resourceId, request.getUser(), password); HttpServletResponse httpServletResponse = ServletUtils.response(); httpServletResponse.addHeader("Access-Control-Expose-Headers", "LINK-PWD-TOKEN"); httpServletResponse.setHeader("LINK-PWD-TOKEN", token); } return pass; } public PanelGroupWithBLOBs resourceInfo(String resourceId) { return panelGroupMapper.selectByPrimaryKey(resourceId); } public String getShortUrl(String resourceId) { PanelLinkMappingExample example = new PanelLinkMappingExample(); example.createCriteria().andResourceIdEqualTo(resourceId).andUserIdEqualTo(AuthUtils.getUser().getUserId()); List mappings = panelLinkMappingMapper.selectByExample(example); PanelLinkMapping mapping = mappings.get(0); return SHORT_URL_PREFIX + mapping.getId(); } public String getUrlByIndex(Long index) { PanelLinkMapping mapping = panelLinkMappingMapper.selectByPrimaryKey(index); String resourceId = mapping.getResourceId(); Long userId = mapping.getUserId(); PanelLink one = findOne(resourceId, userId); return convertDto(one).getUri(); } }