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);
|
}
|
}
|