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.DmsPrintRenderItem; import jnpf.bizcommon.onlyoffice.entity.DmsPrintRenderRequest; 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 DmsOnlyOfficePrintTicketValidator { private final DmsOnlyOfficePreviewTicketValidator.TicketReader ticketReader; @Autowired public DmsOnlyOfficePrintTicketValidator(DmsTicketLifecycleApi lifecycleApi) { this(ticket -> DmsTicketLifecycleChecks.preview(TicketUtil.parseTicket(ticket), lifecycleApi, "jnpf-biz-common")); } DmsOnlyOfficePrintTicketValidator(DmsOnlyOfficePreviewTicketValidator.TicketReader ticketReader) { this.ticketReader = ticketReader; } public DmsFilePreviewTicket validate(DmsPrintRenderRequest request, UserInfo user) { return validate(request == null ? null : request.legacyItem(), user); } public DmsFilePreviewTicket validate(DmsPrintRenderItem request, UserInfo user) { if (request == null || ObjectUtils.isEmpty(request.getAccessTicket())) { throw new DataException("缺少 DMS 打印票据"); } if (user == null || ObjectUtils.isEmpty(user.getUserId())) { throw new DataException("无法识别当前用户,拒绝 DMS 文件打印"); } DmsFilePreviewTicket payload; try { payload = DmsFilePreviewTicket.fromRaw(ticketReader.read(request.getAccessTicket())); } catch (RuntimeException exception) { throw new DataException("DMS 打印票据无效或已过期"); } if (!DmsFilePreviewTicket.PRINT_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().equals(request.getFileVersionId()) || !payload.getFileName().equals(request.getFileName())) { throw new DataException("DMS 打印票据与当前用户、租户或文件不匹配"); } return payload; } }