Skip to content

Commit ecf432f

Browse files
author
Federico Fissore
committed
Boards Manager: downloading additional files as specified in preference 'boardsmanager.additional.urls'
1 parent 0292d8b commit ecf432f

File tree

6 files changed

+104
-37
lines changed

6 files changed

+104
-37
lines changed

app/src/cc/arduino/contributions/packages/ui/ContributionManagerUI.java

+2
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,8 @@ public void run() {
149149
try {
150150
setProgressVisible(true, "");
151151
installer.updateIndex();
152+
List<String> downloadedPackageIndexFiles = installer.updateIndex();
153+
installer.deleteUnknownFiles(downloadedPackageIndexFiles);
152154
onIndexesUpdated();
153155
} catch (Exception e) {
154156
throw new RuntimeException(e);

app/src/processing/app/Base.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -322,7 +322,8 @@ protected void onProgress(Progress progress) {
322322
lastStatus = progress.getStatus();
323323
}
324324
};
325-
installer.updateIndex();
325+
List<String> downloadedPackageIndexFiles = installer.updateIndex();
326+
installer.deleteUnknownFiles(downloadedPackageIndexFiles);
326327
indexer.parseIndex();
327328
indexer.syncWithFilesystem(getHardwareFolder());
328329

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package cc.arduino.contributions.packages;
2+
3+
import java.util.Arrays;
4+
import java.util.List;
5+
6+
public class Constants {
7+
8+
public static final String DEFAULT_INDEX_FILE_NAME = "package_index.json";
9+
public static final List<String> PROTECTED_PACKAGE_NAMES = Arrays.asList("arduino", "Intel");
10+
public static final String PACKAGE_INDEX_URL;
11+
12+
public static final String PREFERENCES_BOARDS_MANAGER_ADDITIONAL_URLS = "boardsmanager.additional.urls";
13+
14+
static {
15+
String extenalPackageIndexUrl = System.getProperty("PACKAGE_INDEX_URL");
16+
if (extenalPackageIndexUrl != null && !"".equals(extenalPackageIndexUrl)) {
17+
PACKAGE_INDEX_URL = extenalPackageIndexUrl;
18+
} else {
19+
PACKAGE_INDEX_URL = "http://downloads.arduino.cc/packages/package_index.json";
20+
}
21+
}
22+
23+
}

arduino-core/src/cc/arduino/contributions/packages/ContributionInstaller.java

+51-23
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
*/
2929
package cc.arduino.contributions.packages;
3030

31+
import cc.arduino.contributions.GPGDetachedSignatureVerifier;
3132
import cc.arduino.utils.ArchiveExtractor;
3233
import cc.arduino.utils.MultiStepProgress;
3334
import cc.arduino.utils.Progress;
@@ -36,6 +37,8 @@
3637
import org.apache.commons.exec.CommandLine;
3738
import org.apache.commons.exec.Executor;
3839
import processing.app.BaseNoGui;
40+
import processing.app.I18n;
41+
import processing.app.PreferencesData;
3942
import processing.app.helpers.FileUtils;
4043
import processing.app.helpers.filefilters.OnlyDirs;
4144
import processing.app.tools.CollectStdOutStdErrExecutor;
@@ -44,27 +47,13 @@
4447
import java.io.File;
4548
import java.io.IOException;
4649
import java.net.URL;
47-
import java.util.Collection;
48-
import java.util.Iterator;
49-
import java.util.LinkedList;
50-
import java.util.List;
50+
import java.util.*;
5151

5252
import static processing.app.I18n._;
5353
import static processing.app.I18n.format;
5454

5555
public class ContributionInstaller {
5656

57-
private static final String PACKAGE_INDEX_URL;
58-
59-
static {
60-
String extenalPackageIndexUrl = System.getProperty("PACKAGE_INDEX_URL");
61-
if (extenalPackageIndexUrl != null && !"".equals(extenalPackageIndexUrl)) {
62-
PACKAGE_INDEX_URL = extenalPackageIndexUrl;
63-
} else {
64-
PACKAGE_INDEX_URL = "http://downloads.arduino.cc/packages/package_index.json";
65-
}
66-
}
67-
6857
private final ContributionsIndexer indexer;
6958
private final DownloadableContributionsDownloader downloader;
7059

@@ -239,22 +228,46 @@ public List<String> remove(ContributedPlatform platform) {
239228
}
240229

241230
public List<String> updateIndex() throws Exception {
242-
List<String> errors = new LinkedList<String>();
243231
MultiStepProgress progress = new MultiStepProgress(1);
244232

245-
downloadIndex(progress, PACKAGE_INDEX_URL);
246-
try {
247-
downloadIndex(progress, PACKAGE_INDEX_URL + ".sig");
248-
} catch (Exception e) {
249-
//ignore errors
233+
List<String> downloadedPackageIndexFilesAccumulator = new LinkedList<String>();
234+
downloadIndexAndSignature(progress, downloadedPackageIndexFilesAccumulator, Constants.PACKAGE_INDEX_URL);
235+
236+
Set<String> packageIndexURLs = new HashSet<String>();
237+
String additionalURLs = PreferencesData.get(Constants.PREFERENCES_BOARDS_MANAGER_ADDITIONAL_URLS, "");
238+
if (!"".equals(additionalURLs)) {
239+
packageIndexURLs.addAll(Arrays.asList(additionalURLs.split(",")));
240+
}
241+
242+
for (String packageIndexURL : packageIndexURLs) {
243+
downloadIndexAndSignature(progress, downloadedPackageIndexFilesAccumulator, packageIndexURL);
250244
}
251245

252246
progress.stepDone();
253247

254-
return errors;
248+
return downloadedPackageIndexFilesAccumulator;
249+
}
250+
251+
private void downloadIndexAndSignature(MultiStepProgress progress, List<String> downloadedPackagedIndexFilesAccumulator, String packageIndexUrl) throws Exception {
252+
File packageIndex = downloadIndex(progress, packageIndexUrl);
253+
downloadedPackagedIndexFilesAccumulator.add(packageIndex.getName());
254+
try {
255+
File packageIndexSignature = downloadIndex(progress, packageIndexUrl + ".sig");
256+
boolean signatureVerified = new GPGDetachedSignatureVerifier().verify(packageIndex, packageIndexSignature, new File(BaseNoGui.getContentFile("lib"), "public.gpg.key"));
257+
if (signatureVerified) {
258+
downloadedPackagedIndexFilesAccumulator.add(packageIndexSignature.getName());
259+
} else {
260+
downloadedPackagedIndexFilesAccumulator.remove(packageIndex.getName());
261+
packageIndex.delete();
262+
packageIndexSignature.delete();
263+
System.err.println(I18n.format(_("{0} file signature verification failed. File ignored."), packageIndexUrl));
264+
}
265+
} catch (Exception e) {
266+
//ignore errors
267+
}
255268
}
256269

257-
private void downloadIndex(MultiStepProgress progress, String packageIndexUrl) throws Exception {
270+
private File downloadIndex(MultiStepProgress progress, String packageIndexUrl) throws Exception {
258271
String statusText = _("Downloading platforms index...");
259272
URL url = new URL(packageIndexUrl);
260273
String[] urlPathParts = url.getFile().split("/");
@@ -269,9 +282,24 @@ private void downloadIndex(MultiStepProgress progress, String packageIndexUrl) t
269282
if (!tmpFile.renameTo(outputFile)) {
270283
throw new Exception("An error occurred while updating platforms index!");
271284
}
285+
286+
return outputFile;
272287
}
273288

274289
protected void onProgress(Progress progress) {
275290
// Empty
276291
}
292+
293+
public void deleteUnknownFiles(List<String> downloadedPackageIndexFiles) {
294+
File preferencesFolder = indexer.getIndexFile(".").getParentFile();
295+
File[] additionalPackageIndexFiles = preferencesFolder.listFiles(new PackageIndexFilenameFilter(Constants.DEFAULT_INDEX_FILE_NAME));
296+
if (additionalPackageIndexFiles == null) {
297+
return;
298+
}
299+
for (File additionalPackageIndexFile : additionalPackageIndexFiles) {
300+
if (!downloadedPackageIndexFiles.contains(additionalPackageIndexFile.getName())) {
301+
additionalPackageIndexFile.delete();
302+
}
303+
}
304+
}
277305
}

arduino-core/src/cc/arduino/contributions/packages/ContributionsIndexer.java

+8-13
Original file line numberDiff line numberDiff line change
@@ -47,16 +47,16 @@
4747
import processing.app.debug.TargetPlatformException;
4848
import processing.app.helpers.PreferencesMap;
4949

50-
import java.io.*;
50+
import java.io.File;
51+
import java.io.FileInputStream;
52+
import java.io.IOException;
53+
import java.io.InputStream;
5154
import java.util.*;
5255

5356
import static processing.app.helpers.filefilters.OnlyDirs.ONLY_DIRS;
5457

5558
public class ContributionsIndexer {
5659

57-
private static final String DEFAULT_INDEX_FILE_NAME = "package_index.json";
58-
private static final List<String> PROTECTED_PACKAGE_NAMES = Arrays.asList("arduino", "Intel");
59-
6060
private final File packagesFolder;
6161
private final File stagingFolder;
6262
private final File preferencesFolder;
@@ -69,18 +69,13 @@ public ContributionsIndexer(File preferencesFolder) {
6969
}
7070

7171
public void parseIndex() throws Exception {
72-
File defaultIndexFile = getIndexFile(DEFAULT_INDEX_FILE_NAME);
72+
File defaultIndexFile = getIndexFile(Constants.DEFAULT_INDEX_FILE_NAME);
7373
if (!isSigned(defaultIndexFile)) {
74-
throw new SignatureVerificationFailedException(DEFAULT_INDEX_FILE_NAME);
74+
throw new SignatureVerificationFailedException(Constants.DEFAULT_INDEX_FILE_NAME);
7575
}
7676
index = parseIndex(defaultIndexFile);
7777

78-
File[] indexFiles = preferencesFolder.listFiles(new FilenameFilter() {
79-
@Override
80-
public boolean accept(File file, String name) {
81-
return !DEFAULT_INDEX_FILE_NAME.equals(name) && name.startsWith("package_") && name.endsWith("_index.json");
82-
}
83-
});
78+
File[] indexFiles = preferencesFolder.listFiles(new PackageIndexFilenameFilter(Constants.DEFAULT_INDEX_FILE_NAME));
8479

8580
for (File indexFile : indexFiles) {
8681
ContributionsIndex contributionsIndex = parseIndex(indexFile);
@@ -137,7 +132,7 @@ private void mergeContributions(ContributionsIndex contributionsIndex, File inde
137132
}
138133

139134
private boolean mergeAllowed(ContributedPackage contributedPackage, File indexFile) {
140-
return !PROTECTED_PACKAGE_NAMES.contains(contributedPackage.getName()) || isSigned(indexFile);
135+
return !Constants.PROTECTED_PACKAGE_NAMES.contains(contributedPackage.getName()) || isSigned(indexFile);
141136
}
142137

143138
private boolean isSigned(File indexFile) {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package cc.arduino.contributions.packages;
2+
3+
import java.io.File;
4+
import java.io.FilenameFilter;
5+
6+
public class PackageIndexFilenameFilter implements FilenameFilter {
7+
8+
private final String defaultPackageIndexFileName;
9+
10+
public PackageIndexFilenameFilter(String defaultPackageIndexFileName) {
11+
this.defaultPackageIndexFileName = defaultPackageIndexFileName;
12+
}
13+
14+
@Override
15+
public boolean accept(File file, String name) {
16+
return !defaultPackageIndexFileName.equals(name) && name.startsWith("package_") && name.endsWith("_index.json");
17+
}
18+
}

0 commit comments

Comments
 (0)