diff --git a/bramble-android/build.gradle b/bramble-android/build.gradle index 5435134a7db6885b682f681280cee27f5cae39fa..917db0b39f35acefbd830cbaaa95519f4554726b 100644 --- a/bramble-android/build.gradle +++ b/bramble-android/build.gradle @@ -1,6 +1,8 @@ import de.undercouch.gradle.tasks.download.Download import de.undercouch.gradle.tasks.download.Verify +import java.security.NoSuchAlgorithmException + apply plugin: 'com.android.library' apply plugin: 'witness' apply plugin: 'de.undercouch.download' @@ -67,30 +69,68 @@ def torBinaries = [ "geoip" : '8239b98374493529a29096e45fc5877d4d6fdad0146ad8380b291f90d61484ea' ] -def downloadBinary(name) { - return tasks.create("downloadBinary${name}", Download) { +def verifyOrDeleteBinary(name, chksum, alreadyVerified) { + return tasks.create("verifyOrDeleteBinary${name}", VerifyOrDelete) { + src "${torBinaryDir}/${name}.zip" + algorithm 'SHA-256' + checksum chksum + result alreadyVerified + onlyIf { + src.exists() + } + } +} + +def downloadBinary(name, chksum, alreadyVerified) { + return tasks.create([ + name: "downloadBinary${name}", + type: Download, + dependsOn: verifyOrDeleteBinary(name, chksum, alreadyVerified)]) { src "${torDownloadUrl}${name}.zip" .replace('tor_', "tor-${torVersion}-") .replace('geoip', "geoip-${geoipVersion}") .replaceAll('_', '-') dest "${torBinaryDir}/${name}.zip" - onlyIfNewer true + onlyIf { + !dest.exists() + } } } def verifyBinary(name, chksum) { + boolean[] alreadyVerified = [false] return tasks.create([ name : "verifyBinary${name}", type : Verify, - dependsOn: downloadBinary(name)]) { + dependsOn: downloadBinary(name, chksum, alreadyVerified)]) { src "${torBinaryDir}/${name}.zip" algorithm 'SHA-256' checksum chksum + onlyIf { + !alreadyVerified[0] + } } } project.afterEvaluate { - torBinaries.every { key, value -> - preBuild.dependsOn.add(verifyBinary(key, value)) + torBinaries.every { name, checksum -> + preBuild.dependsOn.add(verifyBinary(name, checksum)) + } +} + +class VerifyOrDelete extends Verify { + + boolean[] result + + @TaskAction + @Override + void verify() throws IOException, NoSuchAlgorithmException { + try { + super.verify() + result[0] = true + } catch (Exception e) { + println "${src} failed verification - deleting" + src.delete() + } } }