| | |
| | | return success(bridgeService.bindAttachment(sessionId, request.getBlobId())); |
| | | } |
| | | |
| | | @DeleteMapping("/attachments/{attachmentId}") |
| | | public CommonResult<Boolean> deleteAttachment( |
| | | @RequestHeader(value = "X-Agent-Service-Token", required = false) String serviceToken, |
| | | @RequestHeader(value = "X-Agent-Delegation-Token", required = false) String delegationToken, |
| | | @RequestHeader(value = "X-Agent-Task-Id", required = false) String taskId, |
| | | @PathVariable Long attachmentId) { |
| | | bridgeGuard.requireAny(serviceToken, delegationToken, taskId, "attachment.delete", null, attachmentId); |
| | | bridgeService.deleteImportAttachment(attachmentId); |
| | | return success(true); |
| | | } |
| | | |
| | | @PostMapping("/authorize") |
| | | @PreAuthorize(IMPORT_PERMISSIONS_EXPR) |
| | | public CommonResult<Map<String, String>> authorize( |
| | | @RequestHeader(value = "X-Agent-Service-Token", required = false) String serviceToken, |
| | | @RequestHeader(value = "X-Agent-Delegation-Token", required = false) String delegationToken, |
| | | @RequestHeader(value = "X-Agent-Task-Id", required = false) String taskId, |
| | | @Valid @RequestBody AuthorizeRequest request) { |
| | | if (!ACTIONS.contains(request.getAction())) { |
| | | throw new AgentBridgeException(HttpStatus.FORBIDDEN, "ACTION_FORBIDDEN", "不支持的智能体操作"); |
| | |
| | | if (request.getAction().startsWith("conversation.")) { |
| | | String permission = MODULE_PERMISSIONS.get(request.getResource()); |
| | | principal = permission == null |
| | | ? bridgeGuard.requireAny(serviceToken) |
| | | : bridgeGuard.require(serviceToken, permission); |
| | | ? bridgeGuard.requireAny(serviceToken, delegationToken, taskId, request.getAction(), |
| | | request.getResource(), null) |
| | | : bridgeGuard.require(serviceToken, delegationToken, taskId, request.getAction(), permission, |
| | | request.getResource(), null); |
| | | } else { |
| | | principal = bridgeGuard.require(serviceToken, SystemAgentBridgeGuard.PERMISSION_ITEM_IMPORT); |
| | | principal = bridgeGuard.require(serviceToken, delegationToken, taskId, request.getAction(), |
| | | SystemAgentBridgeGuard.PERMISSION_ITEM_IMPORT, "mdm.item", |
| | | requiresAttachmentOwnership(request.getAction()) ? parseId(request.getResource()) : null); |
| | | } |
| | | if (requiresAttachmentOwnership(request.getAction())) { |
| | | bridgeService.requireOwnedAttachmentRef(parseId(request.getResource())); |
| | | } |
| | | // read/review/read_receipt 的任务 UUID 所有权由 Python checkpoint 作用域核验;本端重查当前按钮权限。 |
| | | return success(Map.of("user_id", String.valueOf(principal.userId()), |
| | | "tenant_id", String.valueOf(principal.tenantId()), |
| | | "policy_revision", principal.policyRevision())); |
| | | } |
| | | |
| | | @GetMapping("/attachments/{attachmentId}") |
| | | @PreAuthorize(IMPORT_PERMISSIONS_EXPR) |
| | | public ResponseEntity<FileSystemResource> downloadAttachment( |
| | | @RequestHeader(value = "X-Agent-Service-Token", required = false) String serviceToken, |
| | | @RequestHeader(value = "X-Agent-Delegation-Token", required = false) String delegationToken, |
| | | @RequestHeader(value = "X-Agent-Task-Id", required = false) String taskId, |
| | | @PathVariable Long attachmentId) { |
| | | bridgeGuard.requireAny(serviceToken); |
| | | bridgeGuard.requireAny(serviceToken, delegationToken, taskId, "attachment.read", null, attachmentId); |
| | | SystemAgentAttachmentRef ref = bridgeService.requireOwnedAttachmentRef(attachmentId); |
| | | return ResponseEntity.ok().contentType(MediaType.APPLICATION_OCTET_STREAM) |
| | | .contentLength(ref.byteSize()) |