package jnpf.bizcommon.onlyoffice.service.impl; import jnpf.base.UserInfo; import jnpf.dms.DmsTicketLifecycleApi; import jnpf.dms.DmsTicketLifecycleChecks; import org.springframework.beans.factory.annotation.Autowired; import jnpf.bizcommon.onlyoffice.entity.OnlyOfficeConfigParam; import jnpf.constant.GlobalConst; import jnpf.dmsEntity.preview.model.DmsFilePreviewTicket; import jnpf.exception.DataException; import jnpf.util.TicketUtil; import org.springframework.stereotype.Component; import org.springframework.util.ObjectUtils; @Component public class DmsOnlyOfficePreviewTicketValidator { private final TicketReader ticketReader; @Autowired public DmsOnlyOfficePreviewTicketValidator(DmsTicketLifecycleApi lifecycleApi) { this(ticket -> DmsTicketLifecycleChecks.preview(TicketUtil.parseTicket(ticket), lifecycleApi, "jnpf-biz-common")); } DmsOnlyOfficePreviewTicketValidator(TicketReader ticketReader) { this.ticketReader = ticketReader; } public DmsFilePreviewTicket validate(OnlyOfficeConfigParam param, UserInfo user) { if (ObjectUtils.isEmpty(param.getDmsAccessTicket())) { throw new DataException("缺少 DMS 预览票据"); } if (user == null || ObjectUtils.isEmpty(user.getUserId())) { throw new DataException("无法识别当前用户,拒绝 DMS 文件预览"); } DmsFilePreviewTicket payload; try { payload = DmsFilePreviewTicket.fromRaw(ticketReader.read(param.getDmsAccessTicket())); } catch (RuntimeException exception) { throw new DataException("DMS 预览票据无效或已过期"); } if (!DmsFilePreviewTicket.SCOPE.equals(payload.getScope())) { throw new DataException("DMS 预览票据 scope 无效"); } String tenantId = ObjectUtils.isEmpty(user.getTenantId()) ? GlobalConst.DEFAULT_TENANT_VALUE : user.getTenantId().trim(); if (!payload.getTenantId().equals(tenantId) || !payload.getUserId().equals(user.getUserId()) || !payload.getFileVersionId().toString().equals(param.getFileId()) || !payload.getFileName().equals(param.getFileName())) { throw new DataException("DMS 预览票据与当前用户、租户或文件不匹配"); } return payload; } @FunctionalInterface interface TicketReader { Object read(String ticket); } }