Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit ecf432f

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

File tree

Expand file treeCollapse file tree

6 files changed

+104
-37
lines changed
Filter options
Expand file treeCollapse file tree

6 files changed

+104
-37
lines changed

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

Copy file name to clipboardExpand all lines: app/src/cc/arduino/contributions/packages/ui/ContributionManagerUI.java
+2Lines changed: 2 additions & 0 deletions
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

Copy file name to clipboardExpand all lines: app/src/processing/app/Base.java
+2-1Lines changed: 2 additions & 1 deletion
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

+23Lines changed: 23 additions & 0 deletions
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

Copy file name to clipboardExpand all lines: arduino-core/src/cc/arduino/contributions/packages/ContributionInstaller.java
+51-23Lines changed: 51 additions & 23 deletions
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

Copy file name to clipboardExpand all lines: arduino-core/src/cc/arduino/contributions/packages/ContributionsIndexer.java
+8-13Lines changed: 8 additions & 13 deletions
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) {
+18Lines changed: 18 additions & 0 deletions
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 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.