diff --git a/.circleci/config.yml b/.circleci/config.yml index 23c1a84..f890c28 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -1,12 +1,12 @@ version: 2.1 setup: true orbs: - qqq-orb: kingsrook/qqq-orb@0.7.15 + qqq-orb: kingsrook/qqq-orb@0.8 workflows: setup: jobs: - qqq-orb/generate_pipeline: - orb_version: 0.7.15 + orb_version: '0.8' filters: branches: ignore: automation/qbit-rc-pending diff --git a/.gitea/workflows/build.yaml b/.gitea/workflows/build.yaml new file mode 100644 index 0000000..ce00351 --- /dev/null +++ b/.gitea/workflows/build.yaml @@ -0,0 +1,7 @@ +name: build +on: + push: +jobs: + maven: + uses: self:KofTwentyTwo/ci-workflows/.gitea/workflows/maven.yaml@v1 + secrets: inherit diff --git a/.qqq-ci.yml b/.qqq-ci.yml index e32feac..fa97e65 100644 --- a/.qqq-ci.yml +++ b/.qqq-ci.yml @@ -1,5 +1,5 @@ profile: qbit -orb_version: 0.7.15 +orb_version: '0.8' default_branch: develop java_version: '21' browsers: true @@ -13,3 +13,4 @@ publish: release_candidate: true release: true asciidoc: false +release_completion: true diff --git a/CHANGELOG.md b/CHANGELOG.md index 293f957..f8ebb5e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,13 @@ 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. + ### Added - Complete host-neutral in-app help bundle with live labels and core `HelpBundleAssertions` coverage; registered through QQQ 4.1.0-RC.7 `HelpBundles`, replacing the temporary loader. - "Check channels" action on Registered Channels; readiness now writes the channel's Slack name, private, bot is member, archived, purpose and checked time back to the row. diff --git a/pom.xml b/pom.xml index 23ef129..cc05a6b 100644 --- a/pom.xml +++ b/pom.xml @@ -22,6 +22,7 @@ + 4.1.0-RC.26 0.1.0-RC.6 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 @@ -127,6 +128,7 @@ true help/*.yaml + qbit-slack.properties @@ -134,10 +136,20 @@ false help/*.yaml + qbit-slack.properties + + org.apache.maven.plugins + maven-surefire-plugin + + + ${project.version} + + + org.apache.maven.plugins maven-checkstyle-plugin @@ -230,7 +242,7 @@ true - 4.1.0-RC.7 + 4.1.0-RC.26 diff --git a/src/main/java/com/kingsrook/qbits/slack/SlackQBitProducer.java b/src/main/java/com/kingsrook/qbits/slack/SlackQBitProducer.java index d249279..bd56357 100644 --- a/src/main/java/com/kingsrook/qbits/slack/SlackQBitProducer.java +++ b/src/main/java/com/kingsrook/qbits/slack/SlackQBitProducer.java @@ -21,8 +21,11 @@ package com.kingsrook.qbits.slack; +import java.io.IOException; +import java.io.InputStream; import java.util.ArrayList; import java.util.List; +import java.util.Properties; import com.kingsrook.qbits.slack.bridge.SlackOutboxMessagingProviderMetaData; import com.kingsrook.qbits.slack.delivery.SlackAlerts; import com.kingsrook.qbits.slack.metadata.SlackTables; @@ -43,13 +46,41 @@ public class SlackQBitProducer implements QBitMetaDataProducer { public static final String GROUP_ID = "com.kingsrook.qbits"; public static final String ARTIFACT_ID = "qbit-slack"; - public static final String VERSION = "0.1.0"; + public static final String VERSION = loadVersion(); private SlackQBitConfig qBitConfig; private String namespace; + /******************************************************************************* + ** Read the artifact version from the Maven-filtered properties resource. + *******************************************************************************/ + private static String loadVersion() + { + try(InputStream inputStream = SlackQBitProducer.class.getClassLoader().getResourceAsStream("qbit-slack.properties")) + { + if(inputStream == null) + { + throw (new IllegalStateException("Missing qbit-slack.properties; build with Maven to supply the artifact version")); + } + Properties properties = new Properties(); + properties.load(inputStream); + String version = properties.getProperty("version"); + if(version == null || version.isBlank() || version.contains("${")) + { + throw (new IllegalStateException("Missing or unfiltered version in qbit-slack.properties; build with Maven")); + } + return (version); + } + catch(IOException e) + { + throw (new IllegalStateException("Could not read artifact version from qbit-slack.properties", e)); + } + } + + + /******************************************************************************* ** Fluent setter for the config. *******************************************************************************/ @@ -148,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/main/resources/qbit-slack.properties b/src/main/resources/qbit-slack.properties new file mode 100644 index 0000000..defbd48 --- /dev/null +++ b/src/main/resources/qbit-slack.properties @@ -0,0 +1 @@ +version=${project.version} 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. *******************************************************************************/ diff --git a/src/test/java/com/kingsrook/qbits/slack/SlackQBitProducerTest.java b/src/test/java/com/kingsrook/qbits/slack/SlackQBitProducerTest.java index 6632b41..14a2298 100644 --- a/src/test/java/com/kingsrook/qbits/slack/SlackQBitProducerTest.java +++ b/src/test/java/com/kingsrook/qbits/slack/SlackQBitProducerTest.java @@ -45,6 +45,8 @@ class SlackQBitProducerTest SlackQBitProducer producer = new SlackQBitProducer().withQBitConfig(config).withNamespace("ns"); QBitMetaData metaData = producer.getQBitMetaData(); + assertThat(System.getProperty("qbit.artifactVersion")).isNotBlank(); + assertThat(metaData.getVersion()).isEqualTo(System.getProperty("qbit.artifactVersion")).isEqualTo(SlackQBitProducer.VERSION); assertThat(metaData.getArtifactId()).isEqualTo("qbit-slack"); assertThat(metaData.getGroupId()).isEqualTo("com.kingsrook.qbits"); assertThat(producer.getNamespace()).isEqualTo("ns"); diff --git a/src/test/java/com/kingsrook/qbits/slack/SlackTablesGuardrailTest.java b/src/test/java/com/kingsrook/qbits/slack/SlackTablesGuardrailTest.java index d458e69..7f0c775 100644 --- a/src/test/java/com/kingsrook/qbits/slack/SlackTablesGuardrailTest.java +++ b/src/test/java/com/kingsrook/qbits/slack/SlackTablesGuardrailTest.java @@ -160,6 +160,8 @@ class SlackTablesGuardrailTest var bundles = HelpBundles.of(instance).getBundles(); assertThat(bundles).hasSize(1); assertThat(bundles.get(0).getId()).isEqualTo("qbit-slack"); + assertThat(System.getProperty("qbit.artifactVersion")).isNotBlank(); + assertThat(bundles.get(0).getVersion()).isEqualTo(System.getProperty("qbit.artifactVersion")).isEqualTo(SlackQBitProducer.VERSION); for(String table : SlackTables.ALL) { assertThat(bundles.get(0).getEntries()).filteredOn(entry -> entry.getKey().equals("table:" + table + ";slot:help"))