From 1968496ce16dfa1846123a1e8ab4dfe34188d555 Mon Sep 17 00:00:00 2001 From: CalDescent Date: Tue, 17 Aug 2021 09:30:27 +0100 Subject: [PATCH] Invalidate the cache if hash validation fails, so that it can be rebuilt next time. --- .../arbitrary/ArbitraryDataCombiner.java | 3 +- .../qortal/arbitrary/ArbitraryDataReader.java | 29 ++++++++++++------- 2 files changed, 21 insertions(+), 11 deletions(-) diff --git a/src/main/java/org/qortal/arbitrary/ArbitraryDataCombiner.java b/src/main/java/org/qortal/arbitrary/ArbitraryDataCombiner.java index 681a5949..b4cc9296 100644 --- a/src/main/java/org/qortal/arbitrary/ArbitraryDataCombiner.java +++ b/src/main/java/org/qortal/arbitrary/ArbitraryDataCombiner.java @@ -9,6 +9,7 @@ import org.qortal.utils.FilesystemUtils; import java.io.File; import java.io.IOException; +import java.io.InvalidObjectException; import java.nio.file.DirectoryNotEmptyException; import java.nio.file.Files; import java.nio.file.Path; @@ -116,7 +117,7 @@ public class ArbitraryDataCombiner { boolean valid = digest.isHashValid(previousHash); if (!valid) { String previousHash58 = Base58.encode(previousHash); - throw new IllegalStateException(String.format("Previous state hash mismatch. " + + throw new InvalidObjectException(String.format("Previous state hash mismatch. " + "Patch prevHash: %s, actual: %s", previousHash58, digest.getHash58())); } } diff --git a/src/main/java/org/qortal/arbitrary/ArbitraryDataReader.java b/src/main/java/org/qortal/arbitrary/ArbitraryDataReader.java index deb17cf7..148ace8e 100644 --- a/src/main/java/org/qortal/arbitrary/ArbitraryDataReader.java +++ b/src/main/java/org/qortal/arbitrary/ArbitraryDataReader.java @@ -3,7 +3,7 @@ package org.qortal.arbitrary; import org.apache.commons.io.FileUtils; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; -import org.qortal.arbitrary.metadata.ArbitraryDataMetadataCache; + import org.qortal.crypto.AES; import org.qortal.data.transaction.ArbitraryTransactionData; import org.qortal.data.transaction.ArbitraryTransactionData.*; @@ -24,6 +24,7 @@ import javax.crypto.SecretKey; import javax.crypto.spec.SecretKeySpec; import java.io.File; import java.io.IOException; +import java.io.InvalidObjectException; import java.nio.file.*; import java.nio.file.attribute.BasicFileAttributes; import java.security.InvalidAlgorithmParameterException; @@ -172,17 +173,25 @@ public class ArbitraryDataReader { } private void fetchFromName() throws IllegalStateException, IOException, DataException { + try { - // Build the existing state using past transactions - ArbitraryDataBuilder builder = new ArbitraryDataBuilder(this.resourceId, this.service); - builder.build(); - Path builtPath = builder.getFinalPath(); - if (builtPath == null) { - throw new IllegalStateException("Unable to build path"); + // Build the existing state using past transactions + ArbitraryDataBuilder builder = new ArbitraryDataBuilder(this.resourceId, this.service); + builder.build(); + Path builtPath = builder.getFinalPath(); + if (builtPath == null) { + throw new IllegalStateException("Unable to build path"); + } + + // Set filePath to the builtPath + this.filePath = builtPath; + + } catch (InvalidObjectException e) { + // Hash validation failed. Invalidate the cache for this name, so it can be rebuilt + LOGGER.info("Deleting {}", this.workingPath.toString()); + FilesystemUtils.safeDeleteDirectory(this.workingPath, false); + throw(e); } - - // Set filePath to the builtPath - this.filePath = builtPath; } private void fetchFromSignature() throws IllegalStateException, IOException, DataException {