mirror of
https://github.com/arduino/Arduino.git
synced 2024-12-03 14:24:15 +01:00
Not delete the file if the signature fail
This commit is contained in:
parent
183e1c9ff6
commit
fa77c15e8e
@ -41,8 +41,7 @@ import processing.app.PreferencesData;
|
|||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.net.URL;
|
import java.net.URL;
|
||||||
import java.nio.file.*;
|
import java.nio.file.*;
|
||||||
import java.util.List;
|
import java.util.Collection;
|
||||||
import java.util.stream.Collectors;
|
|
||||||
|
|
||||||
import static processing.app.I18n.format;
|
import static processing.app.I18n.format;
|
||||||
import static processing.app.I18n.tr;
|
import static processing.app.I18n.tr;
|
||||||
@ -145,15 +144,13 @@ public class DownloadableContributionsDownloader {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void downloadIndexAndSignature(MultiStepProgress progress, List<String> downloadedFilesAccumulator, String packageIndexUrlString, ProgressListener progressListener, SignatureVerifier signatureVerifier) throws Exception {
|
public void downloadIndexAndSignature(MultiStepProgress progress, URL packageIndexUrl, ProgressListener progressListener, SignatureVerifier signatureVerifier) throws Exception {
|
||||||
|
|
||||||
// Extract the file name from the url
|
// Extract the file name from the url
|
||||||
URL packageIndexUrl = new URL(packageIndexUrlString);
|
|
||||||
String[] urlPathParts = packageIndexUrl.getFile().split("/");
|
String[] urlPathParts = packageIndexUrl.getFile().split("/");
|
||||||
File packageIndex = BaseNoGui.indexer.getIndexFile(urlPathParts[urlPathParts.length - 1]);
|
File packageIndex = BaseNoGui.indexer.getIndexFile(urlPathParts[urlPathParts.length - 1]);
|
||||||
|
|
||||||
final String statusText = tr("Downloading platforms index...");
|
final String statusText = tr("Downloading platforms index...");
|
||||||
downloadedFilesAccumulator.add(packageIndex.getName());
|
|
||||||
|
|
||||||
// Create temp files
|
// Create temp files
|
||||||
File packageIndexTemp = File.createTempFile(packageIndexUrl.getPath(), ".tmp");
|
File packageIndexTemp = File.createTempFile(packageIndexUrl.getPath(), ".tmp");
|
||||||
@ -164,18 +161,15 @@ public class DownloadableContributionsDownloader {
|
|||||||
if (verifyDomain(packageIndexUrl)) {
|
if (verifyDomain(packageIndexUrl)) {
|
||||||
URL signatureUrl = new URL(packageIndexUrl.toString() + ".sig");
|
URL signatureUrl = new URL(packageIndexUrl.toString() + ".sig");
|
||||||
|
|
||||||
if (checkSignature(progress, downloadedFilesAccumulator, signatureUrl, progressListener, signatureVerifier, statusText, packageIndexTemp)) {
|
if (checkSignature(progress, signatureUrl, progressListener, signatureVerifier, statusText, packageIndexTemp)) {
|
||||||
Files.move(packageIndexTemp.toPath(), packageIndex.toPath(), StandardCopyOption.REPLACE_EXISTING);
|
Files.move(packageIndexTemp.toPath(), packageIndex.toPath(), StandardCopyOption.REPLACE_EXISTING);
|
||||||
} else {
|
|
||||||
downloadedFilesAccumulator.remove(packageIndex.getName());
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// Move the package index to the destination when the signature is not necessary
|
// Move the package index to the destination when the signature is not necessary
|
||||||
Files.move(packageIndexTemp.toPath(), packageIndex.toPath(), StandardCopyOption.REPLACE_EXISTING);
|
Files.move(packageIndexTemp.toPath(), packageIndex.toPath(), StandardCopyOption.REPLACE_EXISTING);
|
||||||
log.info("The domain is not selected to verify the signature. packageIndex: {}", packageIndexUrl);
|
log.info("The domain is not selected to verify the signature. will be copied into this path {}, packageIndex url: {}", packageIndex, packageIndexUrl);
|
||||||
}
|
}
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
downloadedFilesAccumulator.remove(packageIndex.getName());
|
|
||||||
throw e;
|
throw e;
|
||||||
} finally {
|
} finally {
|
||||||
// Delete useless temp file
|
// Delete useless temp file
|
||||||
@ -184,12 +178,8 @@ public class DownloadableContributionsDownloader {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public boolean verifyDomain(URL url) {
|
public boolean verifyDomain(URL url) {
|
||||||
final List<String> domain = PreferencesData.
|
final Collection<String> domain = PreferencesData.
|
||||||
getCollection("http.signature_verify_domains")
|
getCollection("http.signature_verify_domains");
|
||||||
.stream()
|
|
||||||
// Remove empty strings from the collection
|
|
||||||
.filter((v) -> !v.trim().isEmpty())
|
|
||||||
.collect(Collectors.toList());
|
|
||||||
if (domain.size() == 0) {
|
if (domain.size() == 0) {
|
||||||
// Default domain
|
// Default domain
|
||||||
domain.add("downloads.arduino.cc");
|
domain.add("downloads.arduino.cc");
|
||||||
@ -202,7 +192,7 @@ public class DownloadableContributionsDownloader {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean checkSignature(MultiStepProgress progress, List<String> downloadedFilesAccumulator, URL signatureUrl, ProgressListener progressListener, SignatureVerifier signatureVerifier, String statusText, File fileToVerify) throws Exception {
|
public boolean checkSignature(MultiStepProgress progress, URL signatureUrl, ProgressListener progressListener, SignatureVerifier signatureVerifier, String statusText, File fileToVerify) throws Exception {
|
||||||
|
|
||||||
File packageIndexSignatureTemp = File.createTempFile(signatureUrl.getPath(), ".tmp");
|
File packageIndexSignatureTemp = File.createTempFile(signatureUrl.getPath(), ".tmp");
|
||||||
// Signature file name
|
// Signature file name
|
||||||
@ -219,7 +209,6 @@ public class DownloadableContributionsDownloader {
|
|||||||
log.info("Signature verified. url={}, signature url={}, file to verify={}, signature file={}", signatureUrl, signatureUrl, fileToVerify, packageIndexSignatureTemp);
|
log.info("Signature verified. url={}, signature url={}, file to verify={}, signature file={}", signatureUrl, signatureUrl, fileToVerify, packageIndexSignatureTemp);
|
||||||
// Move if the signature is ok
|
// Move if the signature is ok
|
||||||
Files.move(packageIndexSignatureTemp.toPath(), packageIndexSignature.toPath(), StandardCopyOption.REPLACE_EXISTING);
|
Files.move(packageIndexSignatureTemp.toPath(), packageIndexSignature.toPath(), StandardCopyOption.REPLACE_EXISTING);
|
||||||
downloadedFilesAccumulator.add(packageIndexSignature.getName());
|
|
||||||
} else {
|
} else {
|
||||||
log.error("{} file signature verification failed. File ignored.", signatureUrl);
|
log.error("{} file signature verification failed. File ignored.", signatureUrl);
|
||||||
System.err.println(format(tr("{0} file signature verification failed. File ignored."), signatureUrl.toString()));
|
System.err.println(format(tr("{0} file signature verification failed. File ignored."), signatureUrl.toString()));
|
||||||
|
@ -68,8 +68,6 @@ public class LibraryInstaller {
|
|||||||
public synchronized void updateIndex(ProgressListener progressListener) throws Exception {
|
public synchronized void updateIndex(ProgressListener progressListener) throws Exception {
|
||||||
final MultiStepProgress progress = new MultiStepProgress(3);
|
final MultiStepProgress progress = new MultiStepProgress(3);
|
||||||
|
|
||||||
List<String> downloadedFilesAccumulator = new LinkedList<>();
|
|
||||||
|
|
||||||
DownloadableContributionsDownloader downloader = new DownloadableContributionsDownloader(BaseNoGui.librariesIndexer.getStagingFolder());
|
DownloadableContributionsDownloader downloader = new DownloadableContributionsDownloader(BaseNoGui.librariesIndexer.getStagingFolder());
|
||||||
// Step 1: Download index
|
// Step 1: Download index
|
||||||
File outputFile = BaseNoGui.librariesIndexer.getIndexFile();
|
File outputFile = BaseNoGui.librariesIndexer.getIndexFile();
|
||||||
@ -88,7 +86,7 @@ public class LibraryInstaller {
|
|||||||
|
|
||||||
URL signatureUrl = new URL(libraryURL.toString() + ".sig");
|
URL signatureUrl = new URL(libraryURL.toString() + ".sig");
|
||||||
if (downloader.verifyDomain(signatureUrl)) {
|
if (downloader.verifyDomain(signatureUrl)) {
|
||||||
if (downloader.checkSignature(progress, downloadedFilesAccumulator, signatureUrl, progressListener, signatureVerifier, statusText, libraryIndexTemp)) {
|
if (downloader.checkSignature(progress, signatureUrl, progressListener, signatureVerifier, statusText, libraryIndexTemp)) {
|
||||||
// Replace old index with the updated one
|
// Replace old index with the updated one
|
||||||
if (libraryIndexTemp.length() > 0) {
|
if (libraryIndexTemp.length() > 0) {
|
||||||
Files.move(libraryIndexTemp.toPath(), outputFile.toPath(), StandardCopyOption.REPLACE_EXISTING);
|
Files.move(libraryIndexTemp.toPath(), outputFile.toPath(), StandardCopyOption.REPLACE_EXISTING);
|
||||||
|
@ -53,6 +53,7 @@ import processing.app.helpers.filefilters.OnlyDirs;
|
|||||||
import java.io.ByteArrayOutputStream;
|
import java.io.ByteArrayOutputStream;
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
import java.net.URL;
|
||||||
import java.nio.file.Files;
|
import java.nio.file.Files;
|
||||||
import java.nio.file.Path;
|
import java.nio.file.Path;
|
||||||
import java.nio.file.Paths;
|
import java.nio.file.Paths;
|
||||||
@ -282,22 +283,26 @@ public class ContributionInstaller {
|
|||||||
return errors;
|
return errors;
|
||||||
}
|
}
|
||||||
|
|
||||||
public synchronized List<String> updateIndex(ProgressListener progressListener) throws Exception {
|
public synchronized List<String> updateIndex(ProgressListener progressListener) {
|
||||||
MultiStepProgress progress = new MultiStepProgress(1);
|
MultiStepProgress progress = new MultiStepProgress(1);
|
||||||
|
|
||||||
List<String> downloadedPackageIndexFilesAccumulator = new LinkedList<>();
|
|
||||||
final DownloadableContributionsDownloader downloader = new DownloadableContributionsDownloader(BaseNoGui.indexer.getStagingFolder());
|
final DownloadableContributionsDownloader downloader = new DownloadableContributionsDownloader(BaseNoGui.indexer.getStagingFolder());
|
||||||
downloader.downloadIndexAndSignature(progress, downloadedPackageIndexFilesAccumulator, Constants.PACKAGE_INDEX_URL, progressListener, signatureVerifier);
|
|
||||||
|
|
||||||
Set<String> packageIndexURLs = new HashSet<>();
|
final Set<String> packageIndexURLs = new HashSet<>(
|
||||||
String additionalURLs = PreferencesData.get(Constants.PREF_BOARDS_MANAGER_ADDITIONAL_URLS, "");
|
PreferencesData.getCollection(Constants.PREF_BOARDS_MANAGER_ADDITIONAL_URLS)
|
||||||
if (!"".equals(additionalURLs)) {
|
);
|
||||||
packageIndexURLs.addAll(Arrays.asList(additionalURLs.split(",")));
|
packageIndexURLs.add(Constants.PACKAGE_INDEX_URL);
|
||||||
}
|
List<String> downloadedPackageIndexFilesAccumulator = new LinkedList<>();
|
||||||
|
|
||||||
for (String packageIndexURL : packageIndexURLs) {
|
for (String packageIndexURLString : packageIndexURLs) {
|
||||||
try {
|
try {
|
||||||
downloader.downloadIndexAndSignature(progress, downloadedPackageIndexFilesAccumulator, packageIndexURL, progressListener, signatureVerifier);
|
// Extract the file name from the URL
|
||||||
|
final URL packageIndexURL = new URL(packageIndexURLString);
|
||||||
|
String[] urlPathParts = packageIndexURL.getPath().split("/");
|
||||||
|
downloadedPackageIndexFilesAccumulator.add(BaseNoGui.indexer.getIndexFile(urlPathParts[urlPathParts.length - 1]).getName());
|
||||||
|
|
||||||
|
log.info("Start download and signature check of={}", packageIndexURLs);
|
||||||
|
downloader.downloadIndexAndSignature(progress, packageIndexURL, progressListener, signatureVerifier);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
log.error(e.getMessage(), e);
|
log.error(e.getMessage(), e);
|
||||||
System.err.println(e.getMessage());
|
System.err.println(e.getMessage());
|
||||||
@ -305,7 +310,7 @@ public class ContributionInstaller {
|
|||||||
}
|
}
|
||||||
|
|
||||||
progress.stepDone();
|
progress.stepDone();
|
||||||
|
log.info("Downloaded package index URL={}", packageIndexURLs);
|
||||||
return downloadedPackageIndexFilesAccumulator;
|
return downloadedPackageIndexFilesAccumulator;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -315,8 +320,11 @@ public class ContributionInstaller {
|
|||||||
if (additionalPackageIndexFiles == null) {
|
if (additionalPackageIndexFiles == null) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
log.info("Check unknown files. Additional package index folder files={}, Additional package index url downloaded={}", downloadedPackageIndexFiles, additionalPackageIndexFiles);
|
||||||
|
|
||||||
for (File additionalPackageIndexFile : additionalPackageIndexFiles) {
|
for (File additionalPackageIndexFile : additionalPackageIndexFiles) {
|
||||||
if (!downloadedPackageIndexFiles.contains(additionalPackageIndexFile.getName())) {
|
if (!downloadedPackageIndexFiles.contains(additionalPackageIndexFile.getName())) {
|
||||||
|
log.info("Delete this unknown file={} because not included in this list={}", additionalPackageIndexFile, additionalPackageIndexFiles);
|
||||||
Files.delete(additionalPackageIndexFile.toPath());
|
Files.delete(additionalPackageIndexFile.toPath());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -265,7 +265,10 @@ public class PreferencesData {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static Collection<String> getCollection(String key) {
|
public static Collection<String> getCollection(String key) {
|
||||||
return Arrays.asList(get(key, "").split(","));
|
return Arrays.stream(get(key, "").split(","))
|
||||||
|
// Remove empty strings from the collection
|
||||||
|
.filter((v) -> !v.trim().isEmpty())
|
||||||
|
.collect(Collectors.toList());
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void setCollection(String key, Collection<String> values) {
|
public static void setCollection(String key, Collection<String> values) {
|
||||||
|
Loading…
Reference in New Issue
Block a user