From 30b193ed58cdb19d50672d6a4d1b182fed77f466 Mon Sep 17 00:00:00 2001 From: FalsePattern <30945458+FalsePattern@users.noreply.github.com> Date: Tue, 30 Aug 2022 20:40:12 +0200 Subject: [PATCH] local file checksumming --- .../dependencies/DependencyLoaderImpl.java | 49 ++++++++++++++----- 1 file changed, 38 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/falsepattern/lib/internal/impl/dependencies/DependencyLoaderImpl.java b/src/main/java/com/falsepattern/lib/internal/impl/dependencies/DependencyLoaderImpl.java index 6bd5d0a..51a2bef 100644 --- a/src/main/java/com/falsepattern/lib/internal/impl/dependencies/DependencyLoaderImpl.java +++ b/src/main/java/com/falsepattern/lib/internal/impl/dependencies/DependencyLoaderImpl.java @@ -275,6 +275,19 @@ public class DependencyLoaderImpl { if (!file.exists()) { return false; } + try { + val status = validateChecksum(file); + if (status == ChecksumStatus.FAILED) { + return false; + } else if (status == ChecksumStatus.MISSING) { + log.debug("Library {} is missing checksum data! Either it was manually deleted, " + + "or the source repo didn't have it in the first place", artifactLogName); + } + } catch (IOException e) { + log.error("Failed to execute validation check for " + artifactLogName, e); + checkedDelete(file); + return false; + } try { addToClasspath(file); loadedLibraries.put(artifact, preferredVersion); @@ -360,22 +373,36 @@ public class DependencyLoaderImpl { success.set(true); }); if (success.get()) { - val fileHash = hash(checksumType, file); - val referenceHash = new String(Files.readAllBytes(checksumFile.toPath())); - if (!fileHash.equals(referenceHash)) { - log.error("Failed {} checksum validation for {}. Retrying download...", checksumType, - artifactLogName); - checkedDelete(file); - checkedDelete(checksumFile); - return ChecksumStatus.FAILED; - } - log.debug("Successfully validated {} checksum for {}", checksumType, artifactLogName); - return ChecksumStatus.OK; + return getChecksumStatus(file, checksumType, checksumFile); } } return ChecksumStatus.MISSING; } + private ChecksumStatus validateChecksum(File file) throws IOException { + for (val checksumType : CHECKSUM_TYPES) { + val checksumFile = new File(libDir, jarName + "." + checksumType); + log.debug("Attempting to read {} checksum from file...", checksumType); + if (checksumFile.exists()) { + return getChecksumStatus(file, checksumType, checksumFile); + } + } + return ChecksumStatus.MISSING; + } + + private ChecksumStatus getChecksumStatus(File file, String checksumType, File checksumFile) throws IOException { + val fileHash = hash(checksumType, file); + val referenceHash = new String(Files.readAllBytes(checksumFile.toPath())); + if (!fileHash.equals(referenceHash)) { + log.error("Failed {} checksum validation for {}.", checksumType, artifactLogName); + checkedDelete(file); + checkedDelete(checksumFile); + return ChecksumStatus.FAILED; + } + log.debug("Successfully validated {} checksum for {}.", checksumType, artifactLogName); + return ChecksumStatus.OK; + } + private enum ChecksumStatus { OK, FAILED,