From cd3205e249f217a34b0a6aff1855623f2928b250 Mon Sep 17 00:00:00 2001 From: James Maes Date: Sat, 7 Nov 2026 18:09:23 +0000 Subject: [PATCH 1/2] build(deps): align with Gitea registry (parent 2.2.1, QQQ 4.1.0-RC.26) pom.xml: parent -> 2.2.1 pom.xml: qqq.snapshot.version: 4.1.0-RC.7 -> 4.1.0-RC.26 pom.xml: qqq-frontend-next: 1.0.0-RC.19 -> 1.0.0-RC.38 pom.xml: added qqq.version=4.1.0-RC.26 (parent BOM import) Co-Authored-By: Claude Opus 5.5 --- pom.xml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/pom.xml b/pom.xml index 8d01b73..541496a 100644 --- a/pom.xml +++ b/pom.xml @@ -22,6 +22,7 @@ + 4.1.0-RC.26 0.1.0-SNAPSHOT 21 21 @@ -34,7 +35,7 @@ com.kingsrook qbit-build-parent - 2.1.1 + 2.2.1 com.kingsrook.qbits @@ -77,7 +78,7 @@ com.kingsrook.qqq qqq-frontend-next - 1.0.0-RC.19 + 1.0.0-RC.38 test @@ -241,7 +242,7 @@ true - 4.1.0-RC.7 + 4.1.0-RC.26 -- 2.54.0 From 65f256351cdb920d566a1643350a069d208ed9d0 Mon Sep 17 00:00:00 2001 From: James Maes Date: Sat, 7 Nov 2026 13:49:04 -0600 Subject: [PATCH 2/2] refactor(delivery): adopt the core delivery SPI and classified values Replace the qqq#1205 STAND-IN copy of the delivery SPI with the QQQ 4.1 core types (com.kingsrook.qqq.backend.core.delivery). The producer now registers SlackDeliveryDestination as "slack" in the core DeliveryDestinationsMetaData registry instead of deferring host registration; a new test proves registration is idempotent and that core loads the implementation from the registry. Replace the qqq#1142 STAND-IN in SlackPayloadGuard: field classification comes from core ClassifiedValues (honoring a host audit-value protector) and tokenized restricted values use core ClassifiedValueTokens.changed(). Co-Authored-By: Claude Opus 5.5 --- CHANGELOG.md | 4 + .../qbits/slack/SlackQBitProducer.java | 2 +- .../delivery/SlackDeliveryDestination.java | 65 ++- .../delivery/standin/DeliveryAttachment.java | 193 -------- .../standin/DeliveryDestinationContext.java | 65 --- .../standin/DeliveryDestinationInterface.java | 69 --- .../delivery/standin/DeliveryRequest.java | 453 ------------------ .../delivery/standin/DeliveryResult.java | 139 ------ .../standin/DeliveryTargetOption.java | 129 ----- .../delivery/standin/DeliveryTargetStep.java | 226 --------- .../standin/QDeliveryDestinationMetaData.java | 396 --------------- .../qbits/slack/phi/SlackPayloadGuard.java | 22 +- .../slack/SlackDeliveryDestinationTest.java | 29 +- 13 files changed, 86 insertions(+), 1706 deletions(-) delete mode 100644 src/main/java/com/kingsrook/qbits/slack/delivery/standin/DeliveryAttachment.java delete mode 100644 src/main/java/com/kingsrook/qbits/slack/delivery/standin/DeliveryDestinationContext.java delete mode 100644 src/main/java/com/kingsrook/qbits/slack/delivery/standin/DeliveryDestinationInterface.java delete mode 100644 src/main/java/com/kingsrook/qbits/slack/delivery/standin/DeliveryRequest.java delete mode 100644 src/main/java/com/kingsrook/qbits/slack/delivery/standin/DeliveryResult.java delete mode 100644 src/main/java/com/kingsrook/qbits/slack/delivery/standin/DeliveryTargetOption.java delete mode 100644 src/main/java/com/kingsrook/qbits/slack/delivery/standin/DeliveryTargetStep.java delete mode 100644 src/main/java/com/kingsrook/qbits/slack/delivery/standin/QDeliveryDestinationMetaData.java diff --git a/CHANGELOG.md b/CHANGELOG.md index 5d7dc82..f8ebb5e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,10 @@ adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ## [Unreleased] +### Changed +- `SlackDeliveryDestination` now implements the QQQ 4.1 core delivery SPI (`com.kingsrook.qqq.backend.core.delivery`, qqq#1205) and the producer registers it as `slack` in the core `DeliveryDestinationsMetaData` registry; the stand-in SPI copy is removed. +- `SlackPayloadGuard` uses core `ClassifiedValues` for field classification and `ClassifiedValueTokens.changed()` for tokenized restricted values (qqq#1142), replacing its stand-in logic. + ### Fixed - QBit metadata now reports the Maven artifact version, including release versions, from a filtered properties resource. diff --git a/src/main/java/com/kingsrook/qbits/slack/SlackQBitProducer.java b/src/main/java/com/kingsrook/qbits/slack/SlackQBitProducer.java index 2334439..bd56357 100644 --- a/src/main/java/com/kingsrook/qbits/slack/SlackQBitProducer.java +++ b/src/main/java/com/kingsrook/qbits/slack/SlackQBitProducer.java @@ -179,7 +179,7 @@ public class SlackQBitProducer implements QBitMetaDataProducer output.add(new SlackOutboxMessagingProviderMetaData().withName(qBitConfig.getBridgeProviderName())); output.addSelfToInstance(qInstance); - com.kingsrook.qbits.slack.delivery.SlackDeliveryDestination.register(); + com.kingsrook.qbits.slack.delivery.SlackDeliveryDestination.register(qInstance, getQBitConfig()); qInstance.addApp(com.kingsrook.qbits.slack.app.SlackApp.app(qInstance.getTables())); com.kingsrook.qbits.slack.app.SlackApp.widgets().forEach(qInstance::addWidget); if(isPreferencesAvailable()) diff --git a/src/main/java/com/kingsrook/qbits/slack/delivery/SlackDeliveryDestination.java b/src/main/java/com/kingsrook/qbits/slack/delivery/SlackDeliveryDestination.java index d9372df..40ccad8 100644 --- a/src/main/java/com/kingsrook/qbits/slack/delivery/SlackDeliveryDestination.java +++ b/src/main/java/com/kingsrook/qbits/slack/delivery/SlackDeliveryDestination.java @@ -26,15 +26,9 @@ import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Optional; +import com.kingsrook.qbits.slack.SlackQBitConfig; import com.kingsrook.qbits.slack.api.SlackApi; import com.kingsrook.qbits.slack.api.SlackApiMessage; -import com.kingsrook.qbits.slack.delivery.standin.DeliveryDestinationContext; // STAND-IN(core=QRun-IO/qqq#1205, removeBy=4.1.0-RC.8) -import com.kingsrook.qbits.slack.delivery.standin.DeliveryDestinationInterface; // STAND-IN(core=QRun-IO/qqq#1205, removeBy=4.1.0-RC.8) -import com.kingsrook.qbits.slack.delivery.standin.DeliveryRequest; // STAND-IN(core=QRun-IO/qqq#1205, removeBy=4.1.0-RC.8) -import com.kingsrook.qbits.slack.delivery.standin.DeliveryResult; // STAND-IN(core=QRun-IO/qqq#1205, removeBy=4.1.0-RC.8) -import com.kingsrook.qbits.slack.delivery.standin.DeliveryTargetOption; // STAND-IN(core=QRun-IO/qqq#1205, removeBy=4.1.0-RC.8) -import com.kingsrook.qbits.slack.delivery.standin.DeliveryTargetStep; // STAND-IN(core=QRun-IO/qqq#1205, removeBy=4.1.0-RC.8) -import com.kingsrook.qbits.slack.delivery.standin.QDeliveryDestinationMetaData; // STAND-IN(core=QRun-IO/qqq#1205, removeBy=4.1.0-RC.8) import com.kingsrook.qbits.slack.metadata.SlackTables; import com.kingsrook.qbits.slack.outbox.SlackSendRequest; import com.kingsrook.qbits.slack.outbox.SlackSendResult; @@ -45,45 +39,72 @@ import com.kingsrook.qbits.slack.support.SlackRuntime; import com.kingsrook.qbits.slack.support.SlackStore; import com.kingsrook.qqq.backend.core.actions.ai.DataClassification; import com.kingsrook.qqq.backend.core.context.QContext; +import com.kingsrook.qqq.backend.core.delivery.DeliveryDestinationContext; +import com.kingsrook.qqq.backend.core.delivery.DeliveryDestinationInterface; +import com.kingsrook.qqq.backend.core.delivery.DeliveryDestinationsMetaData; +import com.kingsrook.qqq.backend.core.delivery.DeliveryRequest; +import com.kingsrook.qqq.backend.core.delivery.DeliveryResult; +import com.kingsrook.qqq.backend.core.delivery.DeliveryTargetOption; +import com.kingsrook.qqq.backend.core.delivery.DeliveryTargetStep; +import com.kingsrook.qqq.backend.core.delivery.QDeliveryDestinationMetaData; import com.kingsrook.qqq.backend.core.exceptions.QException; +import com.kingsrook.qqq.backend.core.model.metadata.QInstance; import com.kingsrook.qqq.backend.core.model.metadata.code.QCodeReference; import com.kingsrook.qqq.backend.core.model.session.QSystemUserSession; /******************************************************************************* - ** Host-callable Slack output destination until core's delivery SPI is released. - ** Targets are workspaceId and where (me or a channel address from SlackApi). + ** Slack output destination for the QQQ core delivery SPI + ** (DeliveryDestinationInterface). The producer registers it in the core + ** DeliveryDestinationsMetaData registry, so hosts that install core delivery + ** offer it in their pickers. Targets are workspaceId and where (me or a + ** channel address from SlackApi). *******************************************************************************/ public class SlackDeliveryDestination implements DeliveryDestinationInterface { + public static final String NAME = "slack"; + + + /******************************************************************************* - ** Describe the policy hosts must apply before invoking this destination. + ** Describe the policy core applies before invoking this destination, using + ** the Slack config of the current instance. *******************************************************************************/ public QDeliveryDestinationMetaData metadata() { - return (new QDeliveryDestinationMetaData().withName("slack").withLabel("Slack") + return (metadata(SlackRuntime.config())); + } + + + + /******************************************************************************* + ** Describe the policy core applies before invoking this destination. + *******************************************************************************/ + public static QDeliveryDestinationMetaData metadata(SlackQBitConfig config) + { + return (new QDeliveryDestinationMetaData().withName(NAME).withLabel("Slack") .withPermissionName("slack.send").withCodeReference(new QCodeReference(SlackDeliveryDestination.class)) .withMaxClassification(DataClassification.CONFIDENTIAL) .withAboveMaxClassification(QDeliveryDestinationMetaData.AboveMaxClassification.REFUSE) - .withMaxAttachmentBytes(SlackRuntime.config().getMaxAttachmentBytes()).withAllowBearerLinks(false)); + .withMaxAttachmentBytes(config.getMaxAttachmentBytes()).withAllowBearerLinks(false)); } + + /******************************************************************************* - ** Detect the real SPI without registering an incompatible temporary instance. + ** Register with the core delivery registry; production may run repeatedly, + ** and a destination already registered under this name is kept. *******************************************************************************/ - public static void register() + public static void register(QInstance instance, SlackQBitConfig config) { - try + DeliveryDestinationsMetaData registry = DeliveryDestinationsMetaData.ofOrWithNew(instance); + if(registry.getDestinations().stream().noneMatch(destination -> NAME.equals(destination.getName()))) { - Class.forName("com.kingsrook.qqq.backend.core.delivery.DeliveryDestinationsMetaData"); - com.kingsrook.qqq.backend.core.logging.QLogger.getLogger(SlackDeliveryDestination.class) - .info("Slack delivery stand-in will be replaced after RC.8; host registration is deferred"); // STAND-IN(core=QRun-IO/qqq#1205, removeBy=4.1.0-RC.8) - } - catch(ClassNotFoundException e) - { - // RC.6 hosts use this destination directly. + registry.withDestination(metadata(config)); } } + + /******************************************************************************* ** Offer only active connections and membership-checked targets of this user. *******************************************************************************/ diff --git a/src/main/java/com/kingsrook/qbits/slack/delivery/standin/DeliveryAttachment.java b/src/main/java/com/kingsrook/qbits/slack/delivery/standin/DeliveryAttachment.java deleted file mode 100644 index 43339ce..0000000 --- a/src/main/java/com/kingsrook/qbits/slack/delivery/standin/DeliveryAttachment.java +++ /dev/null @@ -1,193 +0,0 @@ -/* - * QQQ - Low-code Application Framework for Engineers. - * Copyright (C) 2021-2026. Kingsrook, LLC - * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States - * contact@kingsrook.com - * https://github.com/Kingsrook/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.kingsrook.qbits.slack.delivery.standin; // STAND-IN(core=QRun-IO/qqq#1205, removeBy=4.1.0-RC.8) - -// STAND-IN(core=QRun-IO/qqq#1205, removeBy=4.1.0-RC.8) - - - - -/******************************************************************************* - ** DeliveryAttachment. - *******************************************************************************/ -public class DeliveryAttachment implements java.io.Serializable -{ - private String fileName; - private String mimeType; - private Long size; - private String storageTableName; - private String storageReference; - - - - /******************************************************************************* - ** Get fileName. - *******************************************************************************/ - public String getFileName() - { - return (fileName); - } - - - - /******************************************************************************* - ** Set fileName. - *******************************************************************************/ - public void setFileName(String fileName) - { - this.fileName = fileName; - } - - - - /******************************************************************************* - ** With fileName. - *******************************************************************************/ - public DeliveryAttachment withFileName(String fileName) - { - this.fileName = fileName; - return (this); - } - - - - /******************************************************************************* - ** Get mimeType. - *******************************************************************************/ - public String getMimeType() - { - return (mimeType); - } - - - - /******************************************************************************* - ** Set mimeType. - *******************************************************************************/ - public void setMimeType(String mimeType) - { - this.mimeType = mimeType; - } - - - - /******************************************************************************* - ** With mimeType. - *******************************************************************************/ - public DeliveryAttachment withMimeType(String mimeType) - { - this.mimeType = mimeType; - return (this); - } - - - - /******************************************************************************* - ** Get size. - *******************************************************************************/ - public Long getSize() - { - return (size); - } - - - - /******************************************************************************* - ** Set size. - *******************************************************************************/ - public void setSize(Long size) - { - this.size = size; - } - - - - /******************************************************************************* - ** With size. - *******************************************************************************/ - public DeliveryAttachment withSize(Long size) - { - this.size = size; - return (this); - } - - - - /******************************************************************************* - ** Get storageTableName. - *******************************************************************************/ - public String getStorageTableName() - { - return (storageTableName); - } - - - - /******************************************************************************* - ** Set storageTableName. - *******************************************************************************/ - public void setStorageTableName(String storageTableName) - { - this.storageTableName = storageTableName; - } - - - - /******************************************************************************* - ** With storageTableName. - *******************************************************************************/ - public DeliveryAttachment withStorageTableName(String storageTableName) - { - this.storageTableName = storageTableName; - return (this); - } - - - - /******************************************************************************* - ** Get storageReference. - *******************************************************************************/ - public String getStorageReference() - { - return (storageReference); - } - - - - /******************************************************************************* - ** Set storageReference. - *******************************************************************************/ - public void setStorageReference(String storageReference) - { - this.storageReference = storageReference; - } - - - - /******************************************************************************* - ** With storageReference. - *******************************************************************************/ - public DeliveryAttachment withStorageReference(String storageReference) - { - this.storageReference = storageReference; - return (this); - } -} diff --git a/src/main/java/com/kingsrook/qbits/slack/delivery/standin/DeliveryDestinationContext.java b/src/main/java/com/kingsrook/qbits/slack/delivery/standin/DeliveryDestinationContext.java deleted file mode 100644 index 7dbb561..0000000 --- a/src/main/java/com/kingsrook/qbits/slack/delivery/standin/DeliveryDestinationContext.java +++ /dev/null @@ -1,65 +0,0 @@ -/* - * QQQ - Low-code Application Framework for Engineers. - * Copyright (C) 2021-2026. Kingsrook, LLC - * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States - * contact@kingsrook.com - * https://github.com/Kingsrook/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.kingsrook.qbits.slack.delivery.standin; // STAND-IN(core=QRun-IO/qqq#1205, removeBy=4.1.0-RC.8) - -// STAND-IN(core=QRun-IO/qqq#1205, removeBy=4.1.0-RC.8) - - - - -/******************************************************************************* - ** DeliveryDestinationContext. - *******************************************************************************/ -public class DeliveryDestinationContext implements java.io.Serializable -{ - private QDeliveryDestinationMetaData destination; - - - - /******************************************************************************* - ** Get destination. - *******************************************************************************/ - public QDeliveryDestinationMetaData getDestination() - { - return (destination); - } - - - - /******************************************************************************* - ** Set destination. - *******************************************************************************/ - public void setDestination(QDeliveryDestinationMetaData destination) - { - this.destination = destination; - } - - - - /******************************************************************************* - ** With destination. - *******************************************************************************/ - public DeliveryDestinationContext withDestination(QDeliveryDestinationMetaData destination) - { - this.destination = destination; - return (this); - } -} diff --git a/src/main/java/com/kingsrook/qbits/slack/delivery/standin/DeliveryDestinationInterface.java b/src/main/java/com/kingsrook/qbits/slack/delivery/standin/DeliveryDestinationInterface.java deleted file mode 100644 index a5d5563..0000000 --- a/src/main/java/com/kingsrook/qbits/slack/delivery/standin/DeliveryDestinationInterface.java +++ /dev/null @@ -1,69 +0,0 @@ -/* - * QQQ - Low-code Application Framework for Engineers. - * Copyright (C) 2021-2026. Kingsrook, LLC - * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States - * contact@kingsrook.com - * https://github.com/Kingsrook/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.kingsrook.qbits.slack.delivery.standin; // STAND-IN(core=QRun-IO/qqq#1205, removeBy=4.1.0-RC.8) - -// STAND-IN(core=QRun-IO/qqq#1205, removeBy=4.1.0-RC.8) - - -import java.io.Serializable; -import java.util.List; -import java.util.Map; -import java.util.Optional; -import com.kingsrook.qqq.backend.core.exceptions.QException; - - -/******************************************************************************* - ** Owner-scoped output delivery provider. - *******************************************************************************/ -public interface DeliveryDestinationInterface -{ - /******************************************************************************* - ** Describe the next target in the current owner session. - *******************************************************************************/ - DeliveryTargetStep describeTargets(DeliveryDestinationContext context, Map chosen) throws QException; - - - - /******************************************************************************* - ** Validate a complete target before sending. - *******************************************************************************/ - default List validate(DeliveryRequest request) throws QException - { - return (List.of()); - } - - - - /******************************************************************************* - ** Deliver idempotently using the request key. - *******************************************************************************/ - DeliveryResult deliver(DeliveryRequest request) throws QException; - - - - /******************************************************************************* - ** Reconcile a previous delivery when supported. - *******************************************************************************/ - default Optional lookup(String idempotencyKey) throws QException - { - return (Optional.empty()); - } -} diff --git a/src/main/java/com/kingsrook/qbits/slack/delivery/standin/DeliveryRequest.java b/src/main/java/com/kingsrook/qbits/slack/delivery/standin/DeliveryRequest.java deleted file mode 100644 index 2e171c8..0000000 --- a/src/main/java/com/kingsrook/qbits/slack/delivery/standin/DeliveryRequest.java +++ /dev/null @@ -1,453 +0,0 @@ -/* - * QQQ - Low-code Application Framework for Engineers. - * Copyright (C) 2021-2026. Kingsrook, LLC - * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States - * contact@kingsrook.com - * https://github.com/Kingsrook/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.kingsrook.qbits.slack.delivery.standin; // STAND-IN(core=QRun-IO/qqq#1205, removeBy=4.1.0-RC.8) - -// STAND-IN(core=QRun-IO/qqq#1205, removeBy=4.1.0-RC.8) - - -import java.io.Serializable; -import java.util.List; -import java.util.Map; -import com.kingsrook.qqq.backend.core.actions.ai.DataClassification; - - -/******************************************************************************* - ** DeliveryRequest. - *******************************************************************************/ -public class DeliveryRequest implements java.io.Serializable -{ - private String destinationName; - private String ownerUserId; - private String sourceType; - private String sourceKey; - private String title; - private String summary; - private String link; - private String idempotencyKey; - private Map targetValues = Map.of(); - private List attachments = List.of(); - private DataClassification contentClassification; - private List restrictedFieldLabels = List.of(); - private boolean leaveOutRestricted; - - - - /******************************************************************************* - ** Get destinationName. - *******************************************************************************/ - public String getDestinationName() - { - return (destinationName); - } - - - - /******************************************************************************* - ** Set destinationName. - *******************************************************************************/ - public void setDestinationName(String destinationName) - { - this.destinationName = destinationName; - } - - - - /******************************************************************************* - ** With destinationName. - *******************************************************************************/ - public DeliveryRequest withDestinationName(String destinationName) - { - this.destinationName = destinationName; - return (this); - } - - - - /******************************************************************************* - ** Get ownerUserId. - *******************************************************************************/ - public String getOwnerUserId() - { - return (ownerUserId); - } - - - - /******************************************************************************* - ** Set ownerUserId. - *******************************************************************************/ - public void setOwnerUserId(String ownerUserId) - { - this.ownerUserId = ownerUserId; - } - - - - /******************************************************************************* - ** With ownerUserId. - *******************************************************************************/ - public DeliveryRequest withOwnerUserId(String ownerUserId) - { - this.ownerUserId = ownerUserId; - return (this); - } - - - - /******************************************************************************* - ** Get sourceType. - *******************************************************************************/ - public String getSourceType() - { - return (sourceType); - } - - - - /******************************************************************************* - ** Set sourceType. - *******************************************************************************/ - public void setSourceType(String sourceType) - { - this.sourceType = sourceType; - } - - - - /******************************************************************************* - ** With sourceType. - *******************************************************************************/ - public DeliveryRequest withSourceType(String sourceType) - { - this.sourceType = sourceType; - return (this); - } - - - - /******************************************************************************* - ** Get sourceKey. - *******************************************************************************/ - public String getSourceKey() - { - return (sourceKey); - } - - - - /******************************************************************************* - ** Set sourceKey. - *******************************************************************************/ - public void setSourceKey(String sourceKey) - { - this.sourceKey = sourceKey; - } - - - - /******************************************************************************* - ** With sourceKey. - *******************************************************************************/ - public DeliveryRequest withSourceKey(String sourceKey) - { - this.sourceKey = sourceKey; - return (this); - } - - - - /******************************************************************************* - ** Get title. - *******************************************************************************/ - public String getTitle() - { - return (title); - } - - - - /******************************************************************************* - ** Set title. - *******************************************************************************/ - public void setTitle(String title) - { - this.title = title; - } - - - - /******************************************************************************* - ** With title. - *******************************************************************************/ - public DeliveryRequest withTitle(String title) - { - this.title = title; - return (this); - } - - - - /******************************************************************************* - ** Get summary. - *******************************************************************************/ - public String getSummary() - { - return (summary); - } - - - - /******************************************************************************* - ** Set summary. - *******************************************************************************/ - public void setSummary(String summary) - { - this.summary = summary; - } - - - - /******************************************************************************* - ** With summary. - *******************************************************************************/ - public DeliveryRequest withSummary(String summary) - { - this.summary = summary; - return (this); - } - - - - /******************************************************************************* - ** Get link. - *******************************************************************************/ - public String getLink() - { - return (link); - } - - - - /******************************************************************************* - ** Set link. - *******************************************************************************/ - public void setLink(String link) - { - this.link = link; - } - - - - /******************************************************************************* - ** With link. - *******************************************************************************/ - public DeliveryRequest withLink(String link) - { - this.link = link; - return (this); - } - - - - /******************************************************************************* - ** Get idempotencyKey. - *******************************************************************************/ - public String getIdempotencyKey() - { - return (idempotencyKey); - } - - - - /******************************************************************************* - ** Set idempotencyKey. - *******************************************************************************/ - public void setIdempotencyKey(String idempotencyKey) - { - this.idempotencyKey = idempotencyKey; - } - - - - /******************************************************************************* - ** With idempotencyKey. - *******************************************************************************/ - public DeliveryRequest withIdempotencyKey(String idempotencyKey) - { - this.idempotencyKey = idempotencyKey; - return (this); - } - - - - /******************************************************************************* - ** Get targetValues. - *******************************************************************************/ - public Map getTargetValues() - { - return (targetValues); - } - - - - /******************************************************************************* - ** Set targetValues. - *******************************************************************************/ - public void setTargetValues(Map targetValues) - { - this.targetValues = targetValues; - } - - - - /******************************************************************************* - ** With targetValues. - *******************************************************************************/ - public DeliveryRequest withTargetValues(Map targetValues) - { - this.targetValues = targetValues; - return (this); - } - - - - /******************************************************************************* - ** Get attachments. - *******************************************************************************/ - public List getAttachments() - { - return (attachments); - } - - - - /******************************************************************************* - ** Set attachments. - *******************************************************************************/ - public void setAttachments(List attachments) - { - this.attachments = attachments; - } - - - - /******************************************************************************* - ** With attachments. - *******************************************************************************/ - public DeliveryRequest withAttachments(List attachments) - { - this.attachments = attachments; - return (this); - } - - - - /******************************************************************************* - ** Get contentClassification. - *******************************************************************************/ - public DataClassification getContentClassification() - { - return (contentClassification); - } - - - - /******************************************************************************* - ** Set contentClassification. - *******************************************************************************/ - public void setContentClassification(DataClassification contentClassification) - { - this.contentClassification = contentClassification; - } - - - - /******************************************************************************* - ** With contentClassification. - *******************************************************************************/ - public DeliveryRequest withContentClassification(DataClassification contentClassification) - { - this.contentClassification = contentClassification; - return (this); - } - - - - /******************************************************************************* - ** Get restrictedFieldLabels. - *******************************************************************************/ - public List getRestrictedFieldLabels() - { - return (restrictedFieldLabels); - } - - - - /******************************************************************************* - ** Set restrictedFieldLabels. - *******************************************************************************/ - public void setRestrictedFieldLabels(List restrictedFieldLabels) - { - this.restrictedFieldLabels = restrictedFieldLabels; - } - - - - /******************************************************************************* - ** With restrictedFieldLabels. - *******************************************************************************/ - public DeliveryRequest withRestrictedFieldLabels(List restrictedFieldLabels) - { - this.restrictedFieldLabels = restrictedFieldLabels; - return (this); - } - - - - /******************************************************************************* - ** Get leaveOutRestricted. - *******************************************************************************/ - public boolean getLeaveOutRestricted() - { - return (leaveOutRestricted); - } - - - - /******************************************************************************* - ** Set leaveOutRestricted. - *******************************************************************************/ - public void setLeaveOutRestricted(boolean leaveOutRestricted) - { - this.leaveOutRestricted = leaveOutRestricted; - } - - - - /******************************************************************************* - ** With leaveOutRestricted. - *******************************************************************************/ - public DeliveryRequest withLeaveOutRestricted(boolean leaveOutRestricted) - { - this.leaveOutRestricted = leaveOutRestricted; - return (this); - } -} diff --git a/src/main/java/com/kingsrook/qbits/slack/delivery/standin/DeliveryResult.java b/src/main/java/com/kingsrook/qbits/slack/delivery/standin/DeliveryResult.java deleted file mode 100644 index b378d73..0000000 --- a/src/main/java/com/kingsrook/qbits/slack/delivery/standin/DeliveryResult.java +++ /dev/null @@ -1,139 +0,0 @@ -/* - * QQQ - Low-code Application Framework for Engineers. - * Copyright (C) 2021-2026. Kingsrook, LLC - * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States - * contact@kingsrook.com - * https://github.com/Kingsrook/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.kingsrook.qbits.slack.delivery.standin; // STAND-IN(core=QRun-IO/qqq#1205, removeBy=4.1.0-RC.8) - -// STAND-IN(core=QRun-IO/qqq#1205, removeBy=4.1.0-RC.8) - - -import java.util.List; - - -/******************************************************************************* - ** DeliveryResult. - *******************************************************************************/ -public class DeliveryResult implements java.io.Serializable -{ - /******************************************************************************* - ** Recorded delivery outcome. - *******************************************************************************/ - // STAND-IN(core=QRun-IO/qqq#1205, removeBy=4.1.0-RC.8) - public enum Status - { - DELIVERED, QUEUED, REFUSED, FAILED_RETRYABLE, FAILED, UNAUTHORIZED - } - - private Status status; - private String externalReference; - private List reasons = List.of(); - - - - /******************************************************************************* - ** Get status. - *******************************************************************************/ - public Status getStatus() - { - return (status); - } - - - - /******************************************************************************* - ** Set status. - *******************************************************************************/ - public void setStatus(Status status) - { - this.status = status; - } - - - - /******************************************************************************* - ** With status. - *******************************************************************************/ - public DeliveryResult withStatus(Status status) - { - this.status = status; - return (this); - } - - - - /******************************************************************************* - ** Get externalReference. - *******************************************************************************/ - public String getExternalReference() - { - return (externalReference); - } - - - - /******************************************************************************* - ** Set externalReference. - *******************************************************************************/ - public void setExternalReference(String externalReference) - { - this.externalReference = externalReference; - } - - - - /******************************************************************************* - ** With externalReference. - *******************************************************************************/ - public DeliveryResult withExternalReference(String externalReference) - { - this.externalReference = externalReference; - return (this); - } - - - - /******************************************************************************* - ** Get reasons. - *******************************************************************************/ - public List getReasons() - { - return (reasons); - } - - - - /******************************************************************************* - ** Set reasons. - *******************************************************************************/ - public void setReasons(List reasons) - { - this.reasons = reasons; - } - - - - /******************************************************************************* - ** With reasons. - *******************************************************************************/ - public DeliveryResult withReasons(List reasons) - { - this.reasons = reasons; - return (this); - } -} diff --git a/src/main/java/com/kingsrook/qbits/slack/delivery/standin/DeliveryTargetOption.java b/src/main/java/com/kingsrook/qbits/slack/delivery/standin/DeliveryTargetOption.java deleted file mode 100644 index 80aa21f..0000000 --- a/src/main/java/com/kingsrook/qbits/slack/delivery/standin/DeliveryTargetOption.java +++ /dev/null @@ -1,129 +0,0 @@ -/* - * QQQ - Low-code Application Framework for Engineers. - * Copyright (C) 2021-2026. Kingsrook, LLC - * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States - * contact@kingsrook.com - * https://github.com/Kingsrook/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.kingsrook.qbits.slack.delivery.standin; // STAND-IN(core=QRun-IO/qqq#1205, removeBy=4.1.0-RC.8) - -// STAND-IN(core=QRun-IO/qqq#1205, removeBy=4.1.0-RC.8) - - - - -/******************************************************************************* - ** DeliveryTargetOption. - *******************************************************************************/ -public class DeliveryTargetOption implements java.io.Serializable -{ - private String value; - private String label; - private String description; - - - - /******************************************************************************* - ** Get value. - *******************************************************************************/ - public String getValue() - { - return (value); - } - - - - /******************************************************************************* - ** Set value. - *******************************************************************************/ - public void setValue(String value) - { - this.value = value; - } - - - - /******************************************************************************* - ** With value. - *******************************************************************************/ - public DeliveryTargetOption withValue(String value) - { - this.value = value; - return (this); - } - - - - /******************************************************************************* - ** Get label. - *******************************************************************************/ - public String getLabel() - { - return (label); - } - - - - /******************************************************************************* - ** Set label. - *******************************************************************************/ - public void setLabel(String label) - { - this.label = label; - } - - - - /******************************************************************************* - ** With label. - *******************************************************************************/ - public DeliveryTargetOption withLabel(String label) - { - this.label = label; - return (this); - } - - - - /******************************************************************************* - ** Get description. - *******************************************************************************/ - public String getDescription() - { - return (description); - } - - - - /******************************************************************************* - ** Set description. - *******************************************************************************/ - public void setDescription(String description) - { - this.description = description; - } - - - - /******************************************************************************* - ** With description. - *******************************************************************************/ - public DeliveryTargetOption withDescription(String description) - { - this.description = description; - return (this); - } -} diff --git a/src/main/java/com/kingsrook/qbits/slack/delivery/standin/DeliveryTargetStep.java b/src/main/java/com/kingsrook/qbits/slack/delivery/standin/DeliveryTargetStep.java deleted file mode 100644 index e0ca14b..0000000 --- a/src/main/java/com/kingsrook/qbits/slack/delivery/standin/DeliveryTargetStep.java +++ /dev/null @@ -1,226 +0,0 @@ -/* - * QQQ - Low-code Application Framework for Engineers. - * Copyright (C) 2021-2026. Kingsrook, LLC - * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States - * contact@kingsrook.com - * https://github.com/Kingsrook/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.kingsrook.qbits.slack.delivery.standin; // STAND-IN(core=QRun-IO/qqq#1205, removeBy=4.1.0-RC.8) - -// STAND-IN(core=QRun-IO/qqq#1205, removeBy=4.1.0-RC.8) - - -import java.util.List; - - -/******************************************************************************* - ** DeliveryTargetStep. - *******************************************************************************/ -public class DeliveryTargetStep implements java.io.Serializable -{ - private String name; - private String label; - private List options = List.of(); - private boolean freeText; - private boolean complete; - private String summary; - - - - /******************************************************************************* - ** Get name. - *******************************************************************************/ - public String getName() - { - return (name); - } - - - - /******************************************************************************* - ** Set name. - *******************************************************************************/ - public void setName(String name) - { - this.name = name; - } - - - - /******************************************************************************* - ** With name. - *******************************************************************************/ - public DeliveryTargetStep withName(String name) - { - this.name = name; - return (this); - } - - - - /******************************************************************************* - ** Get label. - *******************************************************************************/ - public String getLabel() - { - return (label); - } - - - - /******************************************************************************* - ** Set label. - *******************************************************************************/ - public void setLabel(String label) - { - this.label = label; - } - - - - /******************************************************************************* - ** With label. - *******************************************************************************/ - public DeliveryTargetStep withLabel(String label) - { - this.label = label; - return (this); - } - - - - /******************************************************************************* - ** Get options. - *******************************************************************************/ - public List getOptions() - { - return (options); - } - - - - /******************************************************************************* - ** Set options. - *******************************************************************************/ - public void setOptions(List options) - { - this.options = options; - } - - - - /******************************************************************************* - ** With options. - *******************************************************************************/ - public DeliveryTargetStep withOptions(List options) - { - this.options = options; - return (this); - } - - - - /******************************************************************************* - ** Get freeText. - *******************************************************************************/ - public boolean getFreeText() - { - return (freeText); - } - - - - /******************************************************************************* - ** Set freeText. - *******************************************************************************/ - public void setFreeText(boolean freeText) - { - this.freeText = freeText; - } - - - - /******************************************************************************* - ** With freeText. - *******************************************************************************/ - public DeliveryTargetStep withFreeText(boolean freeText) - { - this.freeText = freeText; - return (this); - } - - - - /******************************************************************************* - ** Get complete. - *******************************************************************************/ - public boolean getComplete() - { - return (complete); - } - - - - /******************************************************************************* - ** Set complete. - *******************************************************************************/ - public void setComplete(boolean complete) - { - this.complete = complete; - } - - - - /******************************************************************************* - ** With complete. - *******************************************************************************/ - public DeliveryTargetStep withComplete(boolean complete) - { - this.complete = complete; - return (this); - } - - - - /******************************************************************************* - ** Get summary. - *******************************************************************************/ - public String getSummary() - { - return (summary); - } - - - - /******************************************************************************* - ** Set summary. - *******************************************************************************/ - public void setSummary(String summary) - { - this.summary = summary; - } - - - - /******************************************************************************* - ** With summary. - *******************************************************************************/ - public DeliveryTargetStep withSummary(String summary) - { - this.summary = summary; - return (this); - } -} diff --git a/src/main/java/com/kingsrook/qbits/slack/delivery/standin/QDeliveryDestinationMetaData.java b/src/main/java/com/kingsrook/qbits/slack/delivery/standin/QDeliveryDestinationMetaData.java deleted file mode 100644 index 1efc14e..0000000 --- a/src/main/java/com/kingsrook/qbits/slack/delivery/standin/QDeliveryDestinationMetaData.java +++ /dev/null @@ -1,396 +0,0 @@ -/* - * QQQ - Low-code Application Framework for Engineers. - * Copyright (C) 2021-2026. Kingsrook, LLC - * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States - * contact@kingsrook.com - * https://github.com/Kingsrook/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.kingsrook.qbits.slack.delivery.standin; // STAND-IN(core=QRun-IO/qqq#1205, removeBy=4.1.0-RC.8) - -// STAND-IN(core=QRun-IO/qqq#1205, removeBy=4.1.0-RC.8) - - -import com.kingsrook.qqq.backend.core.actions.ai.DataClassification; -import com.kingsrook.qqq.backend.core.model.metadata.code.QCodeReference; - - -/******************************************************************************* - ** QDeliveryDestinationMetaData. - *******************************************************************************/ -public class QDeliveryDestinationMetaData implements java.io.Serializable -{ - /******************************************************************************* - ** Policy for content above the destination ceiling. - *******************************************************************************/ - // STAND-IN(core=QRun-IO/qqq#1205, removeBy=4.1.0-RC.8) - public enum AboveMaxClassification - { - REFUSE, LINK_ONLY - } - - private String name; - private String label; - private String icon; - private String permissionName; - private String emailProviderName; - private Integer order = 0; - private QCodeReference codeReference; - private DataClassification maxClassification = DataClassification.PUBLIC; - private Long maxAttachmentBytes; - private boolean allowBearerLinks; - private AboveMaxClassification aboveMaxClassification = AboveMaxClassification.REFUSE; - - - - /******************************************************************************* - ** Get name. - *******************************************************************************/ - public String getName() - { - return (name); - } - - - - /******************************************************************************* - ** Set name. - *******************************************************************************/ - public void setName(String name) - { - this.name = name; - } - - - - /******************************************************************************* - ** With name. - *******************************************************************************/ - public QDeliveryDestinationMetaData withName(String name) - { - this.name = name; - return (this); - } - - - - /******************************************************************************* - ** Get label. - *******************************************************************************/ - public String getLabel() - { - return (label); - } - - - - /******************************************************************************* - ** Set label. - *******************************************************************************/ - public void setLabel(String label) - { - this.label = label; - } - - - - /******************************************************************************* - ** With label. - *******************************************************************************/ - public QDeliveryDestinationMetaData withLabel(String label) - { - this.label = label; - return (this); - } - - - - /******************************************************************************* - ** Get icon. - *******************************************************************************/ - public String getIcon() - { - return (icon); - } - - - - /******************************************************************************* - ** Set icon. - *******************************************************************************/ - public void setIcon(String icon) - { - this.icon = icon; - } - - - - /******************************************************************************* - ** With icon. - *******************************************************************************/ - public QDeliveryDestinationMetaData withIcon(String icon) - { - this.icon = icon; - return (this); - } - - - - /******************************************************************************* - ** Get permissionName. - *******************************************************************************/ - public String getPermissionName() - { - return (permissionName); - } - - - - /******************************************************************************* - ** Set permissionName. - *******************************************************************************/ - public void setPermissionName(String permissionName) - { - this.permissionName = permissionName; - } - - - - /******************************************************************************* - ** With permissionName. - *******************************************************************************/ - public QDeliveryDestinationMetaData withPermissionName(String permissionName) - { - this.permissionName = permissionName; - return (this); - } - - - - /******************************************************************************* - ** Get emailProviderName. - *******************************************************************************/ - public String getEmailProviderName() - { - return (emailProviderName); - } - - - - /******************************************************************************* - ** Set emailProviderName. - *******************************************************************************/ - public void setEmailProviderName(String emailProviderName) - { - this.emailProviderName = emailProviderName; - } - - - - /******************************************************************************* - ** With emailProviderName. - *******************************************************************************/ - public QDeliveryDestinationMetaData withEmailProviderName(String emailProviderName) - { - this.emailProviderName = emailProviderName; - return (this); - } - - - - /******************************************************************************* - ** Get order. - *******************************************************************************/ - public Integer getOrder() - { - return (order); - } - - - - /******************************************************************************* - ** Set order. - *******************************************************************************/ - public void setOrder(Integer order) - { - this.order = order; - } - - - - /******************************************************************************* - ** With order. - *******************************************************************************/ - public QDeliveryDestinationMetaData withOrder(Integer order) - { - this.order = order; - return (this); - } - - - - /******************************************************************************* - ** Get codeReference. - *******************************************************************************/ - public QCodeReference getCodeReference() - { - return (codeReference); - } - - - - /******************************************************************************* - ** Set codeReference. - *******************************************************************************/ - public void setCodeReference(QCodeReference codeReference) - { - this.codeReference = codeReference; - } - - - - /******************************************************************************* - ** With codeReference. - *******************************************************************************/ - public QDeliveryDestinationMetaData withCodeReference(QCodeReference codeReference) - { - this.codeReference = codeReference; - return (this); - } - - - - /******************************************************************************* - ** Get maxClassification. - *******************************************************************************/ - public DataClassification getMaxClassification() - { - return (maxClassification); - } - - - - /******************************************************************************* - ** Set maxClassification. - *******************************************************************************/ - public void setMaxClassification(DataClassification maxClassification) - { - this.maxClassification = maxClassification; - } - - - - /******************************************************************************* - ** With maxClassification. - *******************************************************************************/ - public QDeliveryDestinationMetaData withMaxClassification(DataClassification maxClassification) - { - this.maxClassification = maxClassification; - return (this); - } - - - - /******************************************************************************* - ** Get maxAttachmentBytes. - *******************************************************************************/ - public Long getMaxAttachmentBytes() - { - return (maxAttachmentBytes); - } - - - - /******************************************************************************* - ** Set maxAttachmentBytes. - *******************************************************************************/ - public void setMaxAttachmentBytes(Long maxAttachmentBytes) - { - this.maxAttachmentBytes = maxAttachmentBytes; - } - - - - /******************************************************************************* - ** With maxAttachmentBytes. - *******************************************************************************/ - public QDeliveryDestinationMetaData withMaxAttachmentBytes(Long maxAttachmentBytes) - { - this.maxAttachmentBytes = maxAttachmentBytes; - return (this); - } - - - - /******************************************************************************* - ** Get allowBearerLinks. - *******************************************************************************/ - public boolean getAllowBearerLinks() - { - return (allowBearerLinks); - } - - - - /******************************************************************************* - ** Set allowBearerLinks. - *******************************************************************************/ - public void setAllowBearerLinks(boolean allowBearerLinks) - { - this.allowBearerLinks = allowBearerLinks; - } - - - - /******************************************************************************* - ** With allowBearerLinks. - *******************************************************************************/ - public QDeliveryDestinationMetaData withAllowBearerLinks(boolean allowBearerLinks) - { - this.allowBearerLinks = allowBearerLinks; - return (this); - } - - - - /******************************************************************************* - ** Get aboveMaxClassification. - *******************************************************************************/ - public AboveMaxClassification getAboveMaxClassification() - { - return (aboveMaxClassification); - } - - - - /******************************************************************************* - ** Set aboveMaxClassification. - *******************************************************************************/ - public void setAboveMaxClassification(AboveMaxClassification aboveMaxClassification) - { - this.aboveMaxClassification = aboveMaxClassification; - } - - - - /******************************************************************************* - ** With aboveMaxClassification. - *******************************************************************************/ - public QDeliveryDestinationMetaData withAboveMaxClassification(AboveMaxClassification aboveMaxClassification) - { - this.aboveMaxClassification = aboveMaxClassification; - return (this); - } -} diff --git a/src/main/java/com/kingsrook/qbits/slack/phi/SlackPayloadGuard.java b/src/main/java/com/kingsrook/qbits/slack/phi/SlackPayloadGuard.java index 11b720e..96d530c 100644 --- a/src/main/java/com/kingsrook/qbits/slack/phi/SlackPayloadGuard.java +++ b/src/main/java/com/kingsrook/qbits/slack/phi/SlackPayloadGuard.java @@ -27,15 +27,16 @@ import java.util.Map; import java.util.regex.Pattern; import com.kingsrook.qbits.slack.support.SlackRuntime; import com.kingsrook.qbits.slack.template.VariableSchema; -import com.kingsrook.qqq.backend.core.actions.ai.AiDataClassifications; import com.kingsrook.qqq.backend.core.actions.ai.DataClassification; +import com.kingsrook.qqq.backend.core.actions.permissions.fieldaccess.ClassifiedValueTokens; +import com.kingsrook.qqq.backend.core.actions.permissions.fieldaccess.ClassifiedValues; import com.kingsrook.qqq.backend.core.context.QContext; /******************************************************************************* - ** Refuse restricted content before persistence. Uses RC.6 field classifications. - ** STAND-IN(core=QRun-IO/qqq#1142, removeBy=4.1.0-RC.8): ClassifiedValues and - ** ClassifiedValueTokens are absent in RC.6. Restricted tokens use changed:v1, - ** a deliberately non-reversible marker, never a hash of a low-entropy value. + ** Refuse restricted content before persistence. Field classification comes + ** from core ClassifiedValues (which honors a host's audit-value protector); + ** tokenized restricted values become core ClassifiedValueTokens.changed(), a + ** deliberately non-reversible marker, never a hash of a low-entropy value. *******************************************************************************/ public final class SlackPayloadGuard { @@ -88,7 +89,10 @@ public final class SlackPayloadGuard { throw (new IllegalArgumentException("Unknown classified field")); } - classification = DataClassification.max(classification, AiDataClassifications.ofField(table, field)); + if(ClassifiedValues.isClassified(table, field)) + { + return (true); + } } return (classification != null && classification.isAtLeast(DataClassification.PII)); } @@ -123,7 +127,7 @@ public final class SlackPayloadGuard { throw (new RestrictedVariableException(declaration.name())); } - safe.put(entry.getKey(), "changed:v1"); + safe.put(entry.getKey(), ClassifiedValueTokens.changed()); } else { @@ -145,7 +149,7 @@ public final class SlackPayloadGuard { throw (new RestrictedVariableException(declaration.name())); } - safe.put(declaration.name(), "changed:v1"); + safe.put(declaration.name(), ClassifiedValueTokens.changed()); } } return (safe); @@ -168,7 +172,7 @@ public final class SlackPayloadGuard { throw (new IllegalArgumentException("Restricted template variable")); } - return ("changed:v1"); + return (ClassifiedValueTokens.changed()); } return (sanitize(classified.value(), tokenize)); } diff --git a/src/test/java/com/kingsrook/qbits/slack/SlackDeliveryDestinationTest.java b/src/test/java/com/kingsrook/qbits/slack/SlackDeliveryDestinationTest.java index 75df0fc..75f1cba 100644 --- a/src/test/java/com/kingsrook/qbits/slack/SlackDeliveryDestinationTest.java +++ b/src/test/java/com/kingsrook/qbits/slack/SlackDeliveryDestinationTest.java @@ -25,16 +25,18 @@ import java.util.Map; import com.kingsrook.qbits.slack.api.SlackApi; import com.kingsrook.qbits.slack.delivery.SlackDeliveryDestination; import com.kingsrook.qbits.slack.delivery.SlackDispatcher; -import com.kingsrook.qbits.slack.delivery.standin.DeliveryAttachment; // STAND-IN(core=QRun-IO/qqq#1205, removeBy=4.1.0-RC.8) -import com.kingsrook.qbits.slack.delivery.standin.DeliveryDestinationContext; // STAND-IN(core=QRun-IO/qqq#1205, removeBy=4.1.0-RC.8) -import com.kingsrook.qbits.slack.delivery.standin.DeliveryRequest; // STAND-IN(core=QRun-IO/qqq#1205, removeBy=4.1.0-RC.8) -import com.kingsrook.qbits.slack.delivery.standin.DeliveryResult; // STAND-IN(core=QRun-IO/qqq#1205, removeBy=4.1.0-RC.8) import com.kingsrook.qbits.slack.metadata.SlackTables; import com.kingsrook.qbits.slack.security.SlackSecurity; import com.kingsrook.qbits.slack.support.SlackStore; import com.kingsrook.qbits.slack.template.SlackTemplates; import com.kingsrook.qqq.backend.core.actions.ai.DataClassification; import com.kingsrook.qqq.backend.core.actions.tables.StorageAction; +import com.kingsrook.qqq.backend.core.delivery.DeliveryAttachment; +import com.kingsrook.qqq.backend.core.delivery.DeliveryDestinationContext; +import com.kingsrook.qqq.backend.core.delivery.DeliveryDestinations; +import com.kingsrook.qqq.backend.core.delivery.DeliveryDestinationsMetaData; +import com.kingsrook.qqq.backend.core.delivery.DeliveryRequest; +import com.kingsrook.qqq.backend.core.delivery.DeliveryResult; import com.kingsrook.qqq.backend.core.model.actions.tables.storage.StorageInput; import com.kingsrook.qqq.backend.core.model.data.QRecord; import com.kingsrook.qqq.backend.core.model.metadata.QBackendMetaData; @@ -126,6 +128,25 @@ class SlackDeliveryDestinationTest assertThat(context.getDestination().getMaxAttachmentBytes()).isEqualTo(env.config().getMaxAttachmentBytes()); } + /******************************************************************************* + ** The producer registers Slack once in the core delivery registry, and core + ** loads this implementation from it. + *******************************************************************************/ + @Test + void registeredWithCoreDelivery() throws Exception + { + var registry = DeliveryDestinationsMetaData.of(env.instance()); + assertThat(registry).isNotNull(); + SlackDeliveryDestination.register(env.instance(), env.config()); + var registered = registry.getDestinations().stream().filter(d -> SlackDeliveryDestination.NAME.equals(d.getName())).toList(); + assertThat(registered).singleElement().satisfies(d -> + { + assertThat(d.getPermissionName()).isEqualTo("slack.send"); + assertThat(d.getMaxAttachmentBytes()).isEqualTo(env.config().getMaxAttachmentBytes()); + }); + assertThat(DeliveryDestinations.implementation(registered.getFirst())).isInstanceOf(SlackDeliveryDestination.class); + } + /******************************************************************************* ** DM and channel use the delivery template and preserve the idempotency key. *******************************************************************************/ -- 2.54.0