From fd8d720946a5f7e538699ce0a446631c5daf2638 Mon Sep 17 00:00:00 2001
From: CalDescent <caldescent@protonmail.com>
Date: Fri, 23 Jun 2023 13:30:10 +0100
Subject: [PATCH] Added support for group encryption in service validation.

---
 .../org/qortal/arbitrary/misc/Service.java    |  5 +++--
 .../test/arbitrary/ArbitraryServiceTests.java | 19 +++++++++++++++++++
 2 files changed, 22 insertions(+), 2 deletions(-)

diff --git a/src/main/java/org/qortal/arbitrary/misc/Service.java b/src/main/java/org/qortal/arbitrary/misc/Service.java
index 94ca9252..2b8f8d02 100644
--- a/src/main/java/org/qortal/arbitrary/misc/Service.java
+++ b/src/main/java/org/qortal/arbitrary/misc/Service.java
@@ -186,6 +186,7 @@ public enum Service {
     private static final ObjectMapper objectMapper = new ObjectMapper();
 
     private static final String encryptedDataPrefix = "qortalEncryptedData";
+    private static final String encryptedGroupDataPrefix = "qortalGroupEncryptedData";
 
     Service(int value, boolean requiresValidation, Long maxSize, boolean single, boolean isPrivate, List<String> requiredKeys) {
         this.value = value;
@@ -221,10 +222,10 @@ public enum Service {
         // Validate private data for single file resources
         if (this.single) {
             String dataString = new String(data, StandardCharsets.UTF_8);
-            if (this.isPrivate && !dataString.startsWith(encryptedDataPrefix)) {
+            if (this.isPrivate && !dataString.startsWith(encryptedDataPrefix) && !dataString.startsWith(encryptedGroupDataPrefix)) {
                 return ValidationResult.DATA_NOT_ENCRYPTED;
             }
-            if (!this.isPrivate && dataString.startsWith(encryptedDataPrefix)) {
+            if (!this.isPrivate && (dataString.startsWith(encryptedDataPrefix) || dataString.startsWith(encryptedGroupDataPrefix))) {
                 return ValidationResult.DATA_ENCRYPTED;
             }
         }
diff --git a/src/test/java/org/qortal/test/arbitrary/ArbitraryServiceTests.java b/src/test/java/org/qortal/test/arbitrary/ArbitraryServiceTests.java
index 33632b4a..b4c10fac 100644
--- a/src/test/java/org/qortal/test/arbitrary/ArbitraryServiceTests.java
+++ b/src/test/java/org/qortal/test/arbitrary/ArbitraryServiceTests.java
@@ -456,6 +456,25 @@ public class ArbitraryServiceTests extends Common {
         assertEquals(ValidationResult.OK, service.validate(filePath));
     }
 
+    @Test
+    public void testValidPrivateGroupData() throws IOException {
+        String dataString = "qortalGroupEncryptedDatabMx4fELNTV+ifJxmv4+GcuOIJOTo+3qAvbWKNY2L1rfla5UBoEcoxbtjgZ9G7FLPb8V/Qfr0bfKWfvMmN06U/pgUdLuv2mGL2V0D3qYd1011MUzGdNG1qERjaCDz8GAi63+KnHHjfMtPgYt6bcqjs4CNV+ZZ4dIt3xxHYyVEBNc=";
+
+        // Write the data a single file in a temp path
+        Path path = Files.createTempDirectory("testValidPrivateData");
+        Path filePath = Paths.get(path.toString(), "test");
+        filePath.toFile().deleteOnExit();
+
+        BufferedWriter writer = new BufferedWriter(new FileWriter(filePath.toFile()));
+        writer.write(dataString);
+        writer.close();
+
+        Service service = Service.FILE_PRIVATE;
+        assertTrue(service.isValidationRequired());
+
+        assertEquals(ValidationResult.OK, service.validate(filePath));
+    }
+
     @Test
     public void testEncryptedData() throws IOException {
         String dataString = "qortalEncryptedDatabMx4fELNTV+ifJxmv4+GcuOIJOTo+3qAvbWKNY2L1rfla5UBoEcoxbtjgZ9G7FLPb8V/Qfr0bfKWfvMmN06U/pgUdLuv2mGL2V0D3qYd1011MUzGdNG1qERjaCDz8GAi63+KnHHjfMtPgYt6bcqjs4CNV+ZZ4dIt3xxHYyVEBNc=";