diff --git a/.classpath b/.classpath index 9e4872afa..b68e5e764 100644 --- a/.classpath +++ b/.classpath @@ -20,8 +20,8 @@ - - + + diff --git a/app/.classpath b/app/.classpath index 8da1346c0..326de5656 100644 --- a/app/.classpath +++ b/app/.classpath @@ -7,8 +7,8 @@ - - + + diff --git a/app/build.xml b/app/build.xml index 70861d756..5f14148dd 100644 --- a/app/build.xml +++ b/app/build.xml @@ -99,6 +99,8 @@ + + diff --git a/app/lib/bcpg-jdk15on-149.jar b/app/lib/bcpg-jdk15on-149.jar deleted file mode 100644 index b5306e06d..000000000 Binary files a/app/lib/bcpg-jdk15on-149.jar and /dev/null differ diff --git a/app/lib/bcpg-jdk15on-152.jar b/app/lib/bcpg-jdk15on-152.jar new file mode 100644 index 000000000..4f5c63105 Binary files /dev/null and b/app/lib/bcpg-jdk15on-152.jar differ diff --git a/app/lib/bcprov-jdk15on-149.jar b/app/lib/bcprov-jdk15on-149.jar deleted file mode 100644 index e1d4bb31c..000000000 Binary files a/app/lib/bcprov-jdk15on-149.jar and /dev/null differ diff --git a/app/lib/bcprov-jdk15on-152.jar b/app/lib/bcprov-jdk15on-152.jar new file mode 100644 index 000000000..6c54dd901 Binary files /dev/null and b/app/lib/bcprov-jdk15on-152.jar differ diff --git a/app/src/cc/arduino/contributions/packages/ui/ContributionIndexTableModel.java b/app/src/cc/arduino/contributions/packages/ui/ContributionIndexTableModel.java index cc3c6f568..25c1506d4 100644 --- a/app/src/cc/arduino/contributions/packages/ui/ContributionIndexTableModel.java +++ b/app/src/cc/arduino/contributions/packages/ui/ContributionIndexTableModel.java @@ -32,7 +32,7 @@ import cc.arduino.contributions.DownloadableContributionBuiltInAtTheBottomCompar import cc.arduino.contributions.filters.InstalledPredicate; import cc.arduino.contributions.packages.ContributedPackage; import cc.arduino.contributions.packages.ContributedPlatform; -import cc.arduino.contributions.packages.ContributionsIndex; +import cc.arduino.contributions.packages.ContributionsIndexer; import cc.arduino.contributions.ui.FilteredAbstractTableModel; import com.google.common.base.Predicate; import com.google.common.base.Predicates; @@ -113,16 +113,16 @@ public class ContributionIndexTableModel extends FilteredAbstractTableModel[] columnTypes = {ContributedPlatform.class}; - private ContributionsIndex index; + private ContributionsIndexer indexer; - public void setIndex(ContributionsIndex _index) { - index = _index; + public void setIndexer(ContributionsIndexer indexer) { + this.indexer = indexer; } public void updateIndexFilter(String filters[], Predicate... additionalFilters) { contributions.clear(); Predicate filter = Predicates.and(additionalFilters); - for (ContributedPackage pack : index.getPackages()) { + for (ContributedPackage pack : indexer.getPackages()) { for (ContributedPlatform platform : pack.getPlatforms()) { if (!filter.apply(platform)) { continue; diff --git a/app/src/cc/arduino/contributions/packages/ui/ContributionManagerUI.java b/app/src/cc/arduino/contributions/packages/ui/ContributionManagerUI.java index 85b215ee3..5aae222be 100644 --- a/app/src/cc/arduino/contributions/packages/ui/ContributionManagerUI.java +++ b/app/src/cc/arduino/contributions/packages/ui/ContributionManagerUI.java @@ -28,15 +28,11 @@ */ package cc.arduino.contributions.packages.ui; -import cc.arduino.contributions.ui.InstallerJDialogUncaughtExceptionHandler; import cc.arduino.contributions.packages.ContributedPlatform; import cc.arduino.contributions.packages.ContributionInstaller; import cc.arduino.contributions.packages.ContributionsIndexer; import cc.arduino.contributions.packages.DownloadableContribution; -import cc.arduino.contributions.ui.DropdownItem; -import cc.arduino.contributions.ui.FilteredAbstractTableModel; -import cc.arduino.contributions.ui.InstallerJDialog; -import cc.arduino.contributions.ui.InstallerTableCell; +import cc.arduino.contributions.ui.*; import cc.arduino.utils.Progress; import processing.app.I18n; @@ -95,7 +91,7 @@ public class ContributionManagerUI extends InstallerJDialog { categoryChooser.removeActionListener(categoryChooserActionListener); - getContribModel().setIndex(indexer.getIndex()); + getContribModel().setIndexer(indexer); categoryFilter = null; categoryChooser.removeAllItems(); @@ -106,7 +102,7 @@ public class ContributionManagerUI extends InstallerJDialog { // Enable categories combo only if there are two or more choices categoryChooser.addItem(new DropdownAllCoresItem()); - Collection categories = indexer.getIndex().getCategories(); + Collection categories = indexer.getCategories(); for (String s : categories) { categoryChooser.addItem(new DropdownCoreOfCategoryItem(s)); } diff --git a/app/src/processing/app/Base.java b/app/src/processing/app/Base.java index ef424b73b..0961ebde0 100644 --- a/app/src/processing/app/Base.java +++ b/app/src/processing/app/Base.java @@ -22,6 +22,7 @@ package processing.app; +import cc.arduino.DefaultUncaughtExceptionHandler; import cc.arduino.contributions.DownloadableContributionVersionComparator; import cc.arduino.contributions.VersionHelper; import cc.arduino.contributions.libraries.ContributedLibrary; @@ -342,7 +343,7 @@ public class Base { System.exit(1); } - ContributedPlatform installed = indexer.getIndex().getInstalled(boardToInstallParts[0], boardToInstallParts[1]); + ContributedPlatform installed = indexer.getInstalled(boardToInstallParts[0], boardToInstallParts[1]); if (!selected.isReadOnly()) { installer.install(selected); diff --git a/app/test/cc/arduino/packages/contributions/GPGDetachedSignatureVerifierTest.java b/app/test/cc/arduino/packages/contributions/GPGDetachedSignatureVerifierTest.java new file mode 100644 index 000000000..c4b4c8633 --- /dev/null +++ b/app/test/cc/arduino/packages/contributions/GPGDetachedSignatureVerifierTest.java @@ -0,0 +1,66 @@ +/* + * This file is part of Arduino. + * + * Copyright 2015 Arduino LLC (http://www.arduino.cc/) + * + * Arduino is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + * As a special exception, you may use this file as part of a free software + * library without restriction. Specifically, if other files instantiate + * templates or use macros or inline functions from this file, or you compile + * this file and link it with other files to produce an executable, this + * file does not by itself cause the resulting executable to be covered by + * the GNU General Public License. This exception does not however + * invalidate any other reasons why the executable file might be covered by + * the GNU General Public License. + */ + +package cc.arduino.packages.contributions; + +import cc.arduino.contributions.GPGDetachedSignatureVerifier; +import org.junit.Before; +import org.junit.Test; + +import java.io.File; + +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +public class GPGDetachedSignatureVerifierTest { + + private GPGDetachedSignatureVerifier GPGDetachedSignatureVerifier; + + @Before + public void setUp() throws Exception { + GPGDetachedSignatureVerifier = new GPGDetachedSignatureVerifier(); + } + + @Test + public void testSignatureSuccessfulVerification() throws Exception { + File signedFile = new File(GPGDetachedSignatureVerifierTest.class.getResource("./package_index.json").getFile()); + File sign = new File(GPGDetachedSignatureVerifierTest.class.getResource("./package_index.json.sig").getFile()); + File publickKey = new File(GPGDetachedSignatureVerifierTest.class.getResource("./public.gpg.key").getFile()); + assertTrue(GPGDetachedSignatureVerifier.verify(signedFile, sign, publickKey)); + } + + @Test + public void testSignatureFailingVerification() throws Exception { + File fakeSignedFile = File.createTempFile("fakeSigned", "txt"); + fakeSignedFile.deleteOnExit(); + File sign = new File(GPGDetachedSignatureVerifierTest.class.getResource("./package_index.json.sig").getFile()); + File publickKey = new File(GPGDetachedSignatureVerifierTest.class.getResource("./public.gpg.key").getFile()); + assertFalse(GPGDetachedSignatureVerifier.verify(fakeSignedFile, sign, publickKey)); + } +} diff --git a/app/test/cc/arduino/packages/contributions/package_index.json b/app/test/cc/arduino/packages/contributions/package_index.json new file mode 100644 index 000000000..7b0cb6781 --- /dev/null +++ b/app/test/cc/arduino/packages/contributions/package_index.json @@ -0,0 +1,757 @@ +{ + "packages": [ + { + "name": "arduino", + "maintainer": "Arduino", + "websiteURL": "http://www.arduino.cc/", + "email": "packages@arduino.cc", + "help": { + "online": "http://arduino.cc/en/Reference/HomePage" + }, + "platforms": [ + { + "name": "Arduino AVR Boards", + "architecture": "avr", + "version": "1.6.2", + "category": "Arduino", + "url": "http://downloads.arduino.cc/cores/avr-1.6.2.tar.bz2", + "archiveFileName": "avr-1.6.2.tar.bz2", + "checksum": "SHA-256:2909a4c6dd6d7497e7e1b5fcaa2f66a100271417510f3a68593b65af8ff78c1c", + "size": "4877442", + "boards": [ + {"name": "Arduino Yún"}, + {"name": "Arduino Uno"}, + {"name": "Arduino Diecimila"}, + {"name": "Arduino Nano"}, + {"name": "Arduino Mega"}, + {"name": "Arduino MegaADK"}, + {"name": "Arduino Leonardo"}, + {"name": "Arduino Micro"}, + {"name": "Arduino Esplora"}, + {"name": "Arduino Mini"}, + {"name": "Arduino Ethernet"}, + {"name": "Arduino Fio"}, + {"name": "Arduino BT"}, + {"name": "Arduino LilyPadUSB"}, + {"name": "Arduino Lilypad"}, + {"name": "Arduino Pro"}, + {"name": "Arduino ATMegaNG"}, + {"name": "Arduino Robot Control"}, + {"name": "Arduino Robot Motor"} + ], + "toolsDependencies": [ + { + "packager": "arduino", + "name": "avr-gcc", + "version": "4.8.1-arduino2" + }, + { + "packager": "arduino", + "name": "avrdude", + "version": "6.0.1-arduino2" + } + ] + }, + { + "name": "Arduino AVR Boards", + "architecture": "avr", + "version": "1.6.3", + "category": "Arduino", + "help": { + "online": "http://arduino.cc/en/Reference/HomePage" + }, + "url": "http://downloads.arduino.cc/cores/avr-1.6.3.tar.bz2", + "archiveFileName": "avr-1.6.3.tar.bz2", + "checksum": "SHA-256:c30033ba70cbb2d46ee0901a331b0f83be082f9110eda0464b624fdbb51b3c7b", + "size": "4876816", + "boards": [ + {"name": "Arduino Yún"}, + {"name": "Arduino Uno"}, + {"name": "Arduino Diecimila"}, + {"name": "Arduino Nano"}, + {"name": "Arduino Mega"}, + {"name": "Arduino MegaADK"}, + {"name": "Arduino Leonardo"}, + {"name": "Arduino Micro"}, + {"name": "Arduino Esplora"}, + {"name": "Arduino Mini"}, + {"name": "Arduino Ethernet"}, + {"name": "Arduino Fio"}, + {"name": "Arduino BT"}, + {"name": "Arduino LilyPadUSB"}, + {"name": "Arduino Lilypad"}, + {"name": "Arduino Pro"}, + {"name": "Arduino ATMegaNG"}, + {"name": "Arduino Robot Control"}, + {"name": "Arduino Robot Motor"} + ], + "toolsDependencies": [ + { + "packager": "arduino", + "name": "avr-gcc", + "version": "4.8.1-arduino3" + }, + { + "packager": "arduino", + "name": "avrdude", + "version": "6.0.1-arduino3" + } + ] + }, + { + "name": "Arduino AVR Boards", + "architecture": "avr", + "version": "1.6.4", + "category": "Arduino", + "help": { + "online": "http://arduino.cc/en/Reference/HomePage" + }, + "url": "http://downloads.arduino.cc/cores/avr-1.6.4.tar.bz2", + "archiveFileName": "avr-1.6.4.tar.bz2", + "checksum": "SHA-256:8a243410aeded6dbcbc4b134ba10be5c2562d137bfcf3ac97abdc5844933b363", + "size": "4780884", + "boards": [ + {"name": "Arduino Yún"}, + {"name": "Arduino Uno"}, + {"name": "Arduino Diecimila"}, + {"name": "Arduino Nano"}, + {"name": "Arduino Mega"}, + {"name": "Arduino MegaADK"}, + {"name": "Arduino Leonardo"}, + {"name": "Arduino Micro"}, + {"name": "Arduino Esplora"}, + {"name": "Arduino Mini"}, + {"name": "Arduino Ethernet"}, + {"name": "Arduino Fio"}, + {"name": "Arduino BT"}, + {"name": "Arduino LilyPadUSB"}, + {"name": "Arduino Lilypad"}, + {"name": "Arduino Pro"}, + {"name": "Arduino ATMegaNG"}, + {"name": "Arduino Robot Control"}, + {"name": "Arduino Robot Motor"} + ], + "toolsDependencies": [ + { + "packager": "arduino", + "name": "avr-gcc", + "version": "4.8.1-arduino5" + }, + { + "packager": "arduino", + "name": "avrdude", + "version": "6.0.1-arduino5" + } + ] + }, + { + "name": "Arduino AVR Boards", + "architecture": "avr", + "version": "1.6.5", + "category": "Arduino", + "help": { + "online": "http://arduino.cc/en/Reference/HomePage" + }, + "url": "http://downloads.arduino.cc/cores/avr-1.6.5.tar.bz2", + "archiveFileName": "avr-1.6.5.tar.bz2", + "checksum": "SHA-256:c72d890aa605add677634c6b25ebc3b2ed9e44c38805b95c47eab17a1ca72db6", + "size": "4876957", + "boards": [ + {"name": "Arduino Yún"}, + {"name": "Arduino Uno"}, + {"name": "Arduino Diecimila"}, + {"name": "Arduino Nano"}, + {"name": "Arduino Mega"}, + {"name": "Arduino MegaADK"}, + {"name": "Arduino Leonardo"}, + {"name": "Arduino Micro"}, + {"name": "Arduino Esplora"}, + {"name": "Arduino Mini"}, + {"name": "Arduino Ethernet"}, + {"name": "Arduino Fio"}, + {"name": "Arduino BT"}, + {"name": "Arduino LilyPadUSB"}, + {"name": "Arduino Lilypad"}, + {"name": "Arduino Pro"}, + {"name": "Arduino ATMegaNG"}, + {"name": "Arduino Robot Control"}, + {"name": "Arduino Robot Motor"} + ], + "toolsDependencies": [ + { + "packager": "arduino", + "name": "avr-gcc", + "version": "4.8.1-arduino5" + }, + { + "packager": "arduino", + "name": "avrdude", + "version": "6.0.1-arduino5" + } + ] + }, + { + "name": "Arduino AVR Boards", + "architecture": "avr", + "version": "1.6.6", + "category": "Arduino", + "help": { + "online": "http://arduino.cc/en/Reference/HomePage" + }, + "url": "http://downloads.arduino.cc/cores/avr-1.6.6.tar.bz2", + "archiveFileName": "avr-1.6.6.tar.bz2", + "checksum": "SHA-256:08ad5db4978ebea22344edc5d77dce0923d8a644da7a14dc8072e883c76058d8", + "size": "4876916", + "boards": [ + {"name": "Arduino Yún"}, + {"name": "Arduino Uno"}, + {"name": "Arduino Diecimila"}, + {"name": "Arduino Nano"}, + {"name": "Arduino Mega"}, + {"name": "Arduino MegaADK"}, + {"name": "Arduino Leonardo"}, + {"name": "Arduino Micro"}, + {"name": "Arduino Esplora"}, + {"name": "Arduino Mini"}, + {"name": "Arduino Ethernet"}, + {"name": "Arduino Fio"}, + {"name": "Arduino BT"}, + {"name": "Arduino LilyPadUSB"}, + {"name": "Arduino Lilypad"}, + {"name": "Arduino Pro"}, + {"name": "Arduino ATMegaNG"}, + {"name": "Arduino Robot Control"}, + {"name": "Arduino Robot Motor"} + ], + "toolsDependencies": [ + { + "packager": "arduino", + "name": "avr-gcc", + "version": "4.8.1-arduino5" + }, + { + "packager": "arduino", + "name": "avrdude", + "version": "6.0.1-arduino5" + } + ] + }, + { + "name": "Arduino SAM Boards (32-bits ARM Cortex-M3)", + "architecture": "sam", + "version": "1.6.2", + "category": "Arduino", + "url": "http://downloads.arduino.cc/cores/sam-1.6.2.tar.bz2", + "archiveFileName": "sam-1.6.2.tar.bz2", + "checksum": "SHA-256:2d3c8a90bc214947cff1b816d0c2706441398efc78af7984d5250f2e50eddd5f", + "size": "16174730", + "boards": [ + {"name": "Arduino Due"} + ], + "toolsDependencies": [ + { + "packager": "arduino", + "name": "arm-none-eabi-gcc", + "version": "4.8.3-2014q1" + }, + { + "packager": "arduino", + "name": "bossac", + "version": "1.3a-arduino" + } + ] + }, + { + "name": "Arduino SAM Boards (32-bits ARM Cortex-M3)", + "architecture": "sam", + "version": "1.6.3", + "category": "Arduino", + "url": "http://downloads.arduino.cc/cores/sam-1.6.3.tar.bz2", + "archiveFileName": "sam-1.6.3.tar.bz2", + "checksum": "SHA-256:0a6e1d5542790e38ba454c796aabbd0e48b07635a5b4d8adc044a4eba959ca27", + "size": "16174017", + "boards": [ + {"name": "Arduino Due"} + ], + "toolsDependencies": [ + { + "packager": "arduino", + "name": "arm-none-eabi-gcc", + "version": "4.8.3-2014q1" + }, + { + "packager": "arduino", + "name": "bossac", + "version": "1.3a-arduino" + } + ] + }, + { + "name": "Arduino SAM Boards (32-bits ARM Cortex-M3)", + "architecture": "sam", + "version": "1.6.4", + "category": "Arduino", + "url": "http://downloads.arduino.cc/cores/sam-1.6.4.tar.bz2", + "archiveFileName": "sam-1.6.4.tar.bz2", + "checksum": "SHA-256:e0dc94d8ad0756b79838e99ad7409b08b07e40ed667ebe86eae11644ef7bec0d", + "size": "16174992", + "boards": [ + {"name": "Arduino Due"} + ], + "toolsDependencies": [ + { + "packager": "arduino", + "name": "arm-none-eabi-gcc", + "version": "4.8.3-2014q1" + }, + { + "packager": "arduino", + "name": "bossac", + "version": "1.3a-arduino" + } + ] + } + ], + "tools": [ + { + "name": "arm-none-eabi-gcc", + "version": "4.8.3-2014q1", + "systems": [ + { + "host": "i686-mingw32", + "archiveFileName": "gcc-arm-none-eabi-4.8.3-2014q1-windows.tar.gz", + "url": "http://downloads.arduino.cc/gcc-arm-none-eabi-4.8.3-2014q1-windows.tar.gz", + "checksum": "SHA-256:fd8c111c861144f932728e00abd3f7d1107e186eb9cd6083a54c7236ea78b7c2", + "size": "84537449" + }, + { + "host": "x86_64-apple-darwin", + "url": "http://downloads.arduino.cc/gcc-arm-none-eabi-4.8.3-2014q1-mac.tar.gz", + "archiveFileName": "gcc-arm-none-eabi-4.8.3-2014q1-mac.tar.gz", + "checksum": "SHA-256:3598acf21600f17a8e4a4e8e193dc422b894dc09384759b270b2ece5facb59c2", + "size": "52518522" + }, + { + "host": "x86_64-pc-linux-gnu", + "url": "http://downloads.arduino.cc/gcc-arm-none-eabi-4.8.3-2014q1-linux64.tar.gz", + "archiveFileName": "gcc-arm-none-eabi-4.8.3-2014q1-linux64.tar.gz", + "checksum": "SHA-256:d23f6626148396d6ec42a5b4d928955a703e0757829195fa71a939e5b86eecf6", + "size": "51395093" + }, + { + "host": "i686-pc-linux-gnu", + "url": "http://downloads.arduino.cc/gcc-arm-none-eabi-4.8.3-2014q1-linux32.tar.gz", + "archiveFileName": "gcc-arm-none-eabi-4.8.3-2014q1-linux32.tar.gz", + "checksum": "SHA-256:ba1994235f69c526c564f65343f22ddbc9822b2ea8c5ee07dd79d89f6ace2498", + "size": "51029223" + } + ] + }, + { + "name": "bossac", + "version": "1.3a-arduino", + "systems": [ + { + "host": "i686-linux-gnu", + "url": "http://downloads.arduino.cc/tools/bossac-1.3a-arduino-i686-linux-gnu.tar.bz2", + "archiveFileName": "bossac-1.3a-arduino-i686-linux-gnu.tar.bz2", + "checksum": "SHA-256:d6d10362f40729a7877e43474fcf02ad82cf83321cc64ca931f5c82b2d25d24f", + "size": "147359" + }, + { + "host": "x86_64-pc-linux-gnu", + "url": "http://downloads.arduino.cc/tools/bossac-1.3a-arduino-x86_64-pc-linux-gnu.tar.bz2", + "archiveFileName": "bossac-1.3a-arduino-x86_64-pc-linux-gnu.tar.bz2", + "checksum": "SHA-256:c1daed033251296768fa8b63ad283e053da93427c0f3cd476a71a9188e18442c", + "size": "26179" + }, + { + "host": "i686-mingw32", + "url": "http://downloads.arduino.cc/tools/bossac-1.3a-arduino-i686-mingw32.tar.bz2", + "archiveFileName": "bossac-1.3a-arduino-i686-mingw32.tar.bz2", + "checksum": "SHA-256:a37727622e0f86cb4f2856ad0209568a5d804234dba3dc0778829730d61a5ec7", + "size": "265647" + }, + { + "host": "i386-apple-darwin11", + "url": "http://downloads.arduino.cc/tools/bossac-1.3a-arduino-i386-apple-darwin11.tar.bz2", + "archiveFileName": "bossac-1.3a-arduino-i386-apple-darwin11.tar.bz2", + "checksum": "SHA-256:40770b225753e7a52bb165e8f37e6b760364f5c5e96048168d0178945bd96ad6", + "size": "39475" + } + ] + }, + { + "name": "avr-gcc", + "version": "4.8.1-arduino2", + "systems": [ + { + "size": "24443285", + "checksum": "SHA-256:c19a7526235c364d7f62ec1a993d9b495973ba1813869ccf0241c65905896852", + "host": "i386-apple-darwin11", + "archiveFileName": "avr-gcc-4.8.1-arduino2-i386-apple-darwin11.tar.bz2", + "url": "http://downloads.arduino.cc/tools/avr-gcc-4.8.1-arduino2-i386-apple-darwin11.tar.bz2" + }, + { + "size": "27152002", + "checksum": "SHA-256:24a931877bee5f36dc00a88877219a6d2f6a1fb7abb989fd04556b8432d2e14e", + "host": "x86_64-linux-gnu", + "archiveFileName": "avr-gcc-4.8.1-arduino2-x86_64-pc-linux-gnu.tar.bz2", + "url": "http://downloads.arduino.cc/tools/avr-gcc-4.8.1-arduino2-x86_64-pc-linux-gnu.tar.bz2" + }, + { + "size": "25876628", + "checksum": "SHA-256:2d701b4efbc8cec62dc299cde01730c5eebcf23d7e4393db8cf7744a9bf1d3de", + "host": "i686-linux-gnu", + "archiveFileName": "avr-gcc-4.8.1-arduino2-i686-pc-linux-gnu.tar.bz2", + "url": "http://downloads.arduino.cc/tools/avr-gcc-4.8.1-arduino2-i686-pc-linux-gnu.tar.bz2" + }, + { + "size": "46046691", + "checksum": "SHA-256:2eafb49fb803fa4d2c32d35e24c0b372fcd520ca0a790fa537a847179e382000", + "host": "i686-mingw32", + "archiveFileName": "avr-gcc-4.8.1-arduino2-i686-mingw32.zip", + "url": "http://downloads.arduino.cc/tools/avr-gcc-4.8.1-arduino2-i686-mingw32.zip" + } + ] + }, + { + "name": "avrdude", + "version": "6.0.1-arduino2", + "systems": [ + { + "size": "264965", + "checksum": "SHA-256:71117cce0096dad6c091e2c34eb0b9a3386d3aec7d863d2da733d9e5eac3a6b1", + "host": "i386-apple-darwin11", + "archiveFileName": "avrdude-6.0.1-arduino2-i386-apple-darwin11.tar.bz2", + "url": "http://downloads.arduino.cc/tools/avrdude-6.0.1-arduino2-i386-apple-darwin11.tar.bz2" + }, + { + "size": "292541", + "checksum": "SHA-256:2489004d1d98177eaf69796760451f89224007c98b39ebb5577a9a34f51425f1", + "host": "x86_64-linux-gnu", + "archiveFileName": "avrdude-6.0.1-arduino2-x86_64-pc-linux-gnu.tar.bz2", + "url": "http://downloads.arduino.cc/tools/avrdude-6.0.1-arduino2-x86_64-pc-linux-gnu.tar.bz2" + }, + { + "size": "283209", + "checksum": "SHA-256:6f633dd6270ad0d9ef19507bcbf8697b414a15208e4c0f71deec25ef89cdef3f", + "host": "i686-linux-gnu", + "archiveFileName": "avrdude-6.0.1-arduino2-i686-pc-linux-gnu.tar.bz2", + "url": "http://downloads.arduino.cc/tools/avrdude-6.0.1-arduino2-i686-pc-linux-gnu.tar.bz2" + }, + { + "size": "241618", + "checksum": "SHA-256:6c5483800ba753c80893607e30cade8ab77b182808fcc5ea15fa3019c63d76ae", + "host": "i686-mingw32", + "archiveFileName": "avrdude-6.0.1-arduino2-i686-mingw32.zip", + "url": "http://downloads.arduino.cc/tools/avrdude-6.0.1-arduino2-i686-mingw32.zip" + } + ] + }, + { + "name": "avr-gcc", + "version": "4.8.1-arduino3", + "systems": [ + { + "size": "24447175", + "checksum": "SHA-256:28e207c66b3dc405367d0c5e68ce3c278e5ec3abb0e4974e7927fe0f9a532c40", + "host": "i386-apple-darwin11", + "archiveFileName": "avr-gcc-4.8.1-arduino3-i386-apple-darwin11.tar.bz2", + "url": "http://downloads.arduino.cc/tools/avr-gcc-4.8.1-arduino3-i386-apple-darwin11.tar.bz2" + }, + { + "size": "30556996", + "checksum": "SHA-256:028340abec6eb3085b82404dfc7ed143e1bb05b2da961b539ddcdba4a6f65533", + "host": "x86_64-linux-gnu", + "archiveFileName": "avr-gcc-4.8.1-arduino3-x86_64-pc-linux-gnu.tar.bz2", + "url": "http://downloads.arduino.cc/tools/avr-gcc-4.8.1-arduino3-x86_64-pc-linux-gnu.tar.bz2" + }, + { + "size": "28768022", + "checksum": "SHA-256:37796548ba9653267568f959cd8c7ebfe5b4bce4599898cf9f876d64e616cb87", + "host": "i686-linux-gnu", + "archiveFileName": "avr-gcc-4.8.1-arduino3-i686-pc-linux-gnu.tar.bz2", + "url": "http://downloads.arduino.cc/tools/avr-gcc-4.8.1-arduino3-i686-pc-linux-gnu.tar.bz2" + }, + { + "size": "46046917", + "checksum": "SHA-256:d6f0527793f9800f060408392a99eb290ed205730edbae43a1a25cbf6b6b588f", + "host": "i686-mingw32", + "archiveFileName": "avr-gcc-4.8.1-arduino3-i686-mingw32.zip", + "url": "http://downloads.arduino.cc/tools/avr-gcc-4.8.1-arduino3-i686-mingw32.zip" + } + ] + }, + { + "name": "avrdude", + "version": "6.0.1-arduino3", + "systems": [ + { + "size": "264682", + "checksum": "SHA-256:df7cd4a76e45ab3767eb964f845f4d5e9d643df950ec32812923da1e9843d072", + "host": "i386-apple-darwin11", + "archiveFileName": "avrdude-6.0.1-arduino3-i386-apple-darwin11.tar.bz2", + "url": "http://downloads.arduino.cc/tools/avrdude-6.0.1-arduino3-i386-apple-darwin11.tar.bz2" + }, + { + "size": "748634", + "checksum": "SHA-256:bb7bff48f20a68e1fe559c3f3f644574df12ab5c98eb6a1491079f3c760434ad", + "host": "x86_64-linux-gnu", + "archiveFileName": "avrdude-6.0.1-arduino3-x86_64-pc-linux-gnu.tar.bz2", + "url": "http://downloads.arduino.cc/tools/avrdude-6.0.1-arduino3-x86_64-pc-linux-gnu.tar.bz2" + }, + { + "size": "495482", + "checksum": "SHA-256:96a0cfb83fe0452366159e3bf4e19ff10906a8957d1feafd3d98b49ab4b14405", + "host": "i686-linux-gnu", + "archiveFileName": "avrdude-6.0.1-arduino3-i686-pc-linux-gnu.tar.bz2", + "url": "http://downloads.arduino.cc/tools/avrdude-6.0.1-arduino3-i686-pc-linux-gnu.tar.bz2" + }, + { + "size": "241619", + "checksum": "SHA-256:ea59bfc2ee85039c85318b2ba52c47ef0573513444a785b72f59b22586a950f9", + "host": "i686-mingw32", + "archiveFileName": "avrdude-6.0.1-arduino3-i686-mingw32.zip", + "url": "http://downloads.arduino.cc/tools/avrdude-6.0.1-arduino3-i686-mingw32.zip" + } + ] + }, + { + "name": "avr-gcc", + "version": "4.8.1-arduino5", + "systems": [ + { + "size": "24437400", + "checksum": "SHA-256:111b3ef00d737d069eb237a8933406cbb928e4698689e24663cffef07688a901", + "host": "i386-apple-darwin11", + "archiveFileName": "avr-gcc-4.8.1-arduino5-i386-apple-darwin11.tar.bz2", + "url": "http://downloads.arduino.cc/tools/avr-gcc-4.8.1-arduino5-i386-apple-darwin11.tar.bz2" + }, + { + "size": "27093036", + "checksum": "SHA-256:9054fcc174397a419ba56c4ce1bfcbcad275a6a080cc144905acc9b0351ee9cc", + "host": "x86_64-linux-gnu", + "archiveFileName": "avr-gcc-4.8.1-arduino5-x86_64-pc-linux-gnu.tar.bz2", + "url": "http://downloads.arduino.cc/tools/avr-gcc-4.8.1-arduino5-x86_64-pc-linux-gnu.tar.bz2" + }, + { + "size": "25882375", + "checksum": "SHA-256:7648b7f549b37191da0b0be53bae791b652f82ac3cb4e7877f85075aaf32141f", + "host": "i686-linux-gnu", + "archiveFileName": "avr-gcc-4.8.1-arduino5-i686-pc-linux-gnu.tar.bz2", + "url": "http://downloads.arduino.cc/tools/avr-gcc-4.8.1-arduino5-i686-pc-linux-gnu.tar.bz2" + }, + { + "size": "46044779", + "checksum": "SHA-256:d4303226a7b41d3c445d901b5aa5903458def3fc7b7ff4ffef37cabeb37d424d", + "host": "i686-mingw32", + "archiveFileName": "avr-gcc-4.8.1-arduino5-i686-mingw32.zip", + "url": "http://downloads.arduino.cc/tools/avr-gcc-4.8.1-arduino5-i686-mingw32.zip" + } + ] + }, + { + "name": "avrdude", + "version": "6.0.1-arduino5", + "systems": [ + { + "size": "264894", + "checksum": "SHA-256:41af8d3b0a586853c8317b4fb5163ca0db594a1870ddf680fd988c42166fc3e5", + "host": "i386-apple-darwin11", + "archiveFileName": "avrdude-6.0.1-arduino5-i386-apple-darwin11.tar.bz2", + "url": "http://downloads.arduino.cc/tools/avrdude-6.0.1-arduino5-i386-apple-darwin11.tar.bz2" + }, + { + "size": "292629", + "checksum": "SHA-256:d826cca7383461f7e8adde686372cf900e9cb3afd639555cf2d6c645b283a476", + "host": "x86_64-linux-gnu", + "archiveFileName": "avrdude-6.0.1-arduino5-x86_64-pc-linux-gnu.tar.bz2", + "url": "http://downloads.arduino.cc/tools/avrdude-6.0.1-arduino5-x86_64-pc-linux-gnu.tar.bz2" + }, + { + "size": "283121", + "checksum": "SHA-256:5933d66927bce46ababa9b68a8b7f1d53f68c4f3ff7a5ce4b85d7cf4e6c6bfee", + "host": "i686-linux-gnu", + "archiveFileName": "avrdude-6.0.1-arduino5-i686-pc-linux-gnu.tar.bz2", + "url": "http://downloads.arduino.cc/tools/avrdude-6.0.1-arduino5-i686-pc-linux-gnu.tar.bz2" + }, + { + "size": "241634", + "checksum": "SHA-256:41f667f1f6a0ab8df46b4ffacd023176dcdef331d6db3b74bddd37d18cca0a44", + "host": "i686-mingw32", + "archiveFileName": "avrdude-6.0.1-arduino5-i686-mingw32.zip", + "url": "http://downloads.arduino.cc/tools/avrdude-6.0.1-arduino5-i686-mingw32.zip" + } + ] + } + ] + }, + { + "email": "support@intel.com", + "maintainer": "Intel", + "websiteURL": "http://www.intel.com/", + "name": "Intel", + "platforms": [ + { + "name": "Intel i586 Boards", + "version": "1.6.2+1.0", + "category": "Arduino Certified", + "architecture": "i586", + "url": "https://github.com/01org/corelibs-galileo/archive/1.6.2+1.0.tar.gz", + "archiveFileName": "corelibs-galileo-1.6.2.tar.gz", + "checksum": "SHA-256:e20d62b0dccf0d68dbb61d70b866d77134b770b226d6046a61c7e8d55e64e53a", + "size": "272961", + "boards": [ + { + "name": "Galileo" + } + ], + "toolsDependencies": [ + { + "packager": "Intel", + "name": "i586-poky-linux-uclibc", + "version": "1.6.2+1.0" + }, + { + "packager": "Intel", + "name": "sketchUploader", + "version": "1.6.2+1.0" + } + ] + }, + { + "name": "Intel i686 Boards", + "version": "1.6.2+1.0", + "category": "Arduino Certified", + "architecture": "i686", + "url": "https://github.com/01org/corelibs-edison/archive/1.6.2+1.0.tar.gz", + "archiveFileName": "corelibs-edison-1.6.2.tar.gz", + "checksum": "SHA-256:538ab8553f832f56b04df80d44992ecc994b9c296f3fce6902832d97f99811a8", + "size": "271420", + "boards": [ + { + "name": "Edison" + } + ], + "toolsDependencies": [ + { + "packager": "Intel", + "name": "core2-32-poky-linux", + "version": "1.6.2+1.0" + }, + { + "packager": "Intel", + "name": "sketchUploader", + "version": "1.6.2+1.0" + } + ] + } + ], + "tools": [ + { + "name": "i586-poky-linux-uclibc", + "version": "1.6.2+1.0", + "systems": [ + { + "size": "30587705", + "checksum": "SHA-256:5b705d26dc1d8ca8953df6e0c08dcc8584d5be77b584d561f631360fd166677c", + "host": "i386-apple-darwin11", + "archiveFileName": "galileo-toolchain-20150323-osx.tar.bz2", + "url": "http://downloadmirror.intel.com/24806/eng/galileo-toolchain-osx-1.6.2-1.0.tar.bz2" + }, + { + "size": "45948648", + "checksum": "SHA-256:821eb290d7c668c1caa74da30903c13843edc746d41508b35161622ae6279b56", + "host": "i686-mingw32", + "archiveFileName": "galileo-toolchain-20150323-windows.zip", + "url": "http://downloadmirror.intel.com/24806/eng/galileo-toolchain-windows-1.6.2-1.0.zip" + }, + { + "size": "56227185", + "checksum": "SHA-256:935ccad3eaaec34f5de76eceb0f0ecd1372bdab0b7dc8f4241e8260c6f827b72", + "host": "x86_64-linux-gnu", + "archiveFileName": "galileo-toolchain-20150316-linux64.tar.bz2", + "url": "http://downloadmirror.intel.com/24806/eng/galileo-toolchain-linux64-1.6.2-1.0.tar.bz2" + }, + { + "size": "55098166", + "checksum": "SHA-256:1dab7f21e10d0208a6dd2897c36c6f5f55f9372b947225d2b59c3c4ab4777d03", + "host": "i686-linux-gnu", + "archiveFileName": "galileo-toolchain-20150316-linux32.tar.bz2", + "url": "http://downloadmirror.intel.com/24806/eng/galileo-toolchain-linux32-1.6.2-1.0.tar.bz2" + } + ] + }, + { + "name": "core2-32-poky-linux", + "version": "1.6.2+1.0", + "systems": [ + { + "size": "42720934", + "checksum": "SHA-256:fac0b3f00a33ee0531ea0da6d517c170409e25bd5e59f6f3db9506974336375d", + "host": "i386-apple-darwin11", + "archiveFileName": "edison-toolchain-20150323-osx.tar.bz2", + "url": "http://downloadmirror.intel.com/24806/eng/edison-toolchain-osx-1.6.2-1.0.tar.bz2" + }, + { + "size": "56683094", + "checksum": "SHA-256:5a9a1b51f0fa18bf21e1dcf1332d34331dd435c5ca0d1fe008e68e13cb3255e5", + "host": "i686-mingw32", + "archiveFileName": "edison-toolchain-20150323-windows.zip", + "url": "http://downloadmirror.intel.com/24806/eng/edison-toolchain-windows-1.6.2-1.0.zip" + }, + { + "size": "78998436", + "checksum": "SHA-256:e3443e7832732f2189fd424e4868d2ebb563e823addb2321a6e8a86a9fced193", + "host": "x86_64-linux-gnu", + "archiveFileName": "edison-toolchain-20150316-linux64.tar.bz2", + "url": "http://downloadmirror.intel.com/24806/eng/edison-toolchain-linux64-1.6.2-1.0.tar.bz2" + }, + { + "size": "76488215", + "checksum": "SHA-256:014d1bdc40bb080987c736d04ffd42cdc0d2c3cad001891fb01555dac04296f7", + "host": "i686-linux-gnu", + "archiveFileName": "edison-toolchain-20150316-linux32.tar.bz2", + "url": "http://downloadmirror.intel.com/24806/eng/edison-toolchain-linux32-1.6.2-1.0.tar.bz2" + } + ] + }, + { + "name": "sketchUploader", + "version": "1.6.2+1.0", + "systems": [ + { + "size": "61789", + "checksum": "SHA-256:8395ccb57c627f997fe01170df4613de906f48c6ce99623b9ca42806079c28ad", + "host": "i386-apple-darwin11", + "archiveFileName": "intel-arduino-tools-20150316-osx.tar.gz", + "url": "https://github.com/01org/intel-arduino-tools/archive/1.6.2+1.0-osx.tar.gz" + }, + { + "size": "2534586", + "checksum": "SHA-256:47f0b1558653d09f6f1e5d21a9cdef379be96c9147711cf54f013f73e4deed11", + "host": "i686-mingw32", + "archiveFileName": "intel-arduino-tools-20150316-windows.zip", + "url": "https://github.com/01org/intel-arduino-tools/archive/1.6.2+1.0-windows.zip" + }, + { + "size": "178239", + "checksum": "SHA-256:2876db4153db22609d2f6c9c3bfb198efbb9d9574edad579aca7d58cff9d2cca", + "host": "x86_64-linux-gnu", + "archiveFileName": "intel-arduino-tools-20150316-linux64.tar.gz", + "url": "https://github.com/01org/intel-arduino-tools/archive/1.6.2+1.0-linux64.tar.gz" + }, + { + "size": "187995", + "checksum": "SHA-256:20d87602d0194be626f592d3f2bdc9566a5a897786b042393482ef4c26ae158c", + "host": "i686-linux-gnu", + "archiveFileName": "intel-arduino-tools-20150316-linux32.tar.gz", + "url": "https://github.com/01org/intel-arduino-tools/archive/1.6.2+1.0-linux32.tar.gz" + } + ] + } + ] + } + ] +} diff --git a/app/test/cc/arduino/packages/contributions/package_index.json.sig b/app/test/cc/arduino/packages/contributions/package_index.json.sig new file mode 100644 index 000000000..10c7ff659 Binary files /dev/null and b/app/test/cc/arduino/packages/contributions/package_index.json.sig differ diff --git a/app/test/cc/arduino/packages/contributions/public.gpg.key b/app/test/cc/arduino/packages/contributions/public.gpg.key new file mode 100644 index 000000000..5de39fed1 Binary files /dev/null and b/app/test/cc/arduino/packages/contributions/public.gpg.key differ diff --git a/arduino-core/.classpath b/arduino-core/.classpath index 136e7f270..cd3604c15 100644 --- a/arduino-core/.classpath +++ b/arduino-core/.classpath @@ -17,10 +17,10 @@ - - - - + + + + diff --git a/arduino-core/lib/bcpg-jdk15on-149.jar b/arduino-core/lib/bcpg-jdk15on-149.jar deleted file mode 100644 index b5306e06d..000000000 Binary files a/arduino-core/lib/bcpg-jdk15on-149.jar and /dev/null differ diff --git a/arduino-core/lib/bcpg-jdk15on-152.jar b/arduino-core/lib/bcpg-jdk15on-152.jar new file mode 100644 index 000000000..4f5c63105 Binary files /dev/null and b/arduino-core/lib/bcpg-jdk15on-152.jar differ diff --git a/arduino-core/lib/bcprov-jdk15on-149.jar b/arduino-core/lib/bcprov-jdk15on-149.jar deleted file mode 100644 index e1d4bb31c..000000000 Binary files a/arduino-core/lib/bcprov-jdk15on-149.jar and /dev/null differ diff --git a/arduino-core/lib/bcprov-jdk15on-152.jar b/arduino-core/lib/bcprov-jdk15on-152.jar new file mode 100644 index 000000000..6c54dd901 Binary files /dev/null and b/arduino-core/lib/bcprov-jdk15on-152.jar differ diff --git a/arduino-core/src/cc/arduino/contributions/GPGDetachedSignatureVerifier.java b/arduino-core/src/cc/arduino/contributions/GPGDetachedSignatureVerifier.java new file mode 100644 index 000000000..718cd3080 --- /dev/null +++ b/arduino-core/src/cc/arduino/contributions/GPGDetachedSignatureVerifier.java @@ -0,0 +1,94 @@ +/* + * This file is part of Arduino. + * + * Arduino is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + * As a special exception, you may use this file as part of a free software + * library without restriction. Specifically, if other files instantiate + * templates or use macros or inline functions from this file, or you compile + * this file and link it with other files to produce an executable, this + * file does not by itself cause the resulting executable to be covered by + * the GNU General Public License. This exception does not however + * invalidate any other reasons why the executable file might be covered by + * the GNU General Public License. + * + * Copyright 2015 Arduino LLC (http://www.arduino.cc/) + */ + +package cc.arduino.contributions; + +import org.apache.commons.compress.utils.IOUtils; +import org.bouncycastle.openpgp.*; +import org.bouncycastle.openpgp.operator.bc.BcKeyFingerprintCalculator; +import org.bouncycastle.openpgp.operator.bc.BcPGPContentVerifierBuilderProvider; + +import java.io.*; +import java.util.Iterator; + +public class GPGDetachedSignatureVerifier { + + private String keyId; + + public GPGDetachedSignatureVerifier() { + this("7F294291"); + } + + public GPGDetachedSignatureVerifier(String keyId) { + this.keyId = keyId; + } + + public boolean verify(File signedFile, File signature, File publicKey) throws IOException, PGPException { + PGPPublicKey pgpPublicKey = readPublicKey(publicKey, keyId); + + PGPObjectFactory pgpObjectFactory = new PGPObjectFactory(new FileInputStream(signature), new BcKeyFingerprintCalculator()); + + PGPSignatureList pgpSignatureList = (PGPSignatureList) pgpObjectFactory.nextObject(); + assert pgpSignatureList.size() == 1; + PGPSignature pgpSignature = pgpSignatureList.get(0); + + pgpSignature.init(new BcPGPContentVerifierBuilderProvider(), pgpPublicKey); + pgpSignature.update(IOUtils.toByteArray(new FileInputStream(signedFile))); + + return pgpSignature.verify(); + } + + private PGPPublicKey readPublicKey(File file, String keyId) throws IOException, PGPException { + InputStream keyIn = new BufferedInputStream(new FileInputStream(file)); + PGPPublicKey pubKey = readPublicKey(keyIn, keyId); + keyIn.close(); + return pubKey; + } + + private PGPPublicKey readPublicKey(InputStream input, String keyId) throws IOException, PGPException { + PGPPublicKeyRingCollection pgpPub = new PGPPublicKeyRingCollection(PGPUtil.getDecoderStream(input), new BcKeyFingerprintCalculator()); + + Iterator keyRingIter = pgpPub.getKeyRings(); + while (keyRingIter.hasNext()) { + PGPPublicKeyRing keyRing = (PGPPublicKeyRing) keyRingIter.next(); + + Iterator keyIter = keyRing.getPublicKeys(); + while (keyIter.hasNext()) { + PGPPublicKey key = (PGPPublicKey) keyIter.next(); + + if (Long.toHexString(key.getKeyID()).toUpperCase().endsWith(keyId)) { + return key; + } + } + } + + throw new IllegalArgumentException("Can't find encryption key in key ring."); + } + +} diff --git a/arduino-core/src/cc/arduino/contributions/SignatureVerificationFailedException.java b/arduino-core/src/cc/arduino/contributions/SignatureVerificationFailedException.java new file mode 100644 index 000000000..201e7ec45 --- /dev/null +++ b/arduino-core/src/cc/arduino/contributions/SignatureVerificationFailedException.java @@ -0,0 +1,16 @@ +package cc.arduino.contributions; + +import processing.app.I18n; + +import static processing.app.I18n._; + +public class SignatureVerificationFailedException extends Exception { + + public SignatureVerificationFailedException(String filename) { + super(I18n.format(_("{0} file signature verification failed"), filename)); + } + + public SignatureVerificationFailedException(String filename, Throwable cause) { + super(I18n.format(_("{0} file signature verification failed"), filename), cause); + } +} diff --git a/arduino-core/src/cc/arduino/contributions/packages/ContributionInstaller.java b/arduino-core/src/cc/arduino/contributions/packages/ContributionInstaller.java index d21acdd5e..b648b63d8 100644 --- a/arduino-core/src/cc/arduino/contributions/packages/ContributionInstaller.java +++ b/arduino-core/src/cc/arduino/contributions/packages/ContributionInstaller.java @@ -241,16 +241,26 @@ public class ContributionInstaller { public List updateIndex() throws Exception { List errors = new LinkedList(); MultiStepProgress progress = new MultiStepProgress(1); - String statusText = _("Downloading platforms index..."); - URL url = new URL(PACKAGE_INDEX_URL); + downloadIndex(progress, PACKAGE_INDEX_URL); + try { + downloadIndex(progress, PACKAGE_INDEX_URL + ".sig"); + } catch (Exception e) { + //ignore errors + } + + progress.stepDone(); + + return errors; + } + + private void downloadIndex(MultiStepProgress progress, String packageIndexUrl) throws Exception { + String statusText = _("Downloading platforms index..."); + URL url = new URL(packageIndexUrl); String[] urlPathParts = url.getFile().split("/"); File outputFile = indexer.getIndexFile(urlPathParts[urlPathParts.length - 1]); File tmpFile = new File(outputFile.getAbsolutePath() + ".tmp"); downloader.download(url, tmpFile, progress, statusText); - progress.stepDone(); - - // TODO: Check downloaded index // Replace old index with the updated one if (outputFile.exists()) { @@ -259,7 +269,6 @@ public class ContributionInstaller { if (!tmpFile.renameTo(outputFile)) { throw new Exception("An error occurred while updating platforms index!"); } - return errors; } protected void onProgress(Progress progress) { diff --git a/arduino-core/src/cc/arduino/contributions/packages/ContributionsIndexer.java b/arduino-core/src/cc/arduino/contributions/packages/ContributionsIndexer.java index a4aeb8c8f..fde637615 100644 --- a/arduino-core/src/cc/arduino/contributions/packages/ContributionsIndexer.java +++ b/arduino-core/src/cc/arduino/contributions/packages/ContributionsIndexer.java @@ -29,6 +29,8 @@ package cc.arduino.contributions.packages; import cc.arduino.contributions.DownloadableContributionBuiltInAtTheBottomComparator; +import cc.arduino.contributions.GPGDetachedSignatureVerifier; +import cc.arduino.contributions.SignatureVerificationFailedException; import cc.arduino.contributions.filters.BuiltInPredicate; import cc.arduino.contributions.filters.InstalledPredicate; import com.fasterxml.jackson.databind.DeserializationFeature; @@ -39,6 +41,7 @@ import com.google.common.base.Predicates; import com.google.common.collect.Collections2; import com.google.common.collect.ImmutableListMultimap; import com.google.common.collect.Multimaps; +import processing.app.BaseNoGui; import processing.app.debug.TargetPackage; import processing.app.debug.TargetPlatform; import processing.app.debug.TargetPlatformException; @@ -65,22 +68,12 @@ public class ContributionsIndexer { stagingFolder = new File(preferencesFolder, "staging" + File.separator + "packages"); } - // public static void main(String args[]) throws Exception { - // File indexFile = new File(args[0]); - // - // // VerifyResult verify = ClearSignedVerifier.verify(indexFile, - // // new PackagersPublicKeys()); - // // if (!verify.verified) - // // throw new Exception("Invalid index file!"); - // - // ContributionsIndexer indexer = new ContributionsIndexer(null); - // // indexer.parse(new ByteArrayInputStream(verify.clearText)); - // indexer.parseIndex(indexFile); - // indexer.syncWithFilesystem(); - // } - - public void parseIndex() throws IOException { - index = parseIndex(getIndexFile(DEFAULT_INDEX_FILE_NAME)); + public void parseIndex() throws Exception { + File defaultIndexFile = getIndexFile(DEFAULT_INDEX_FILE_NAME); + if (!isSigned(defaultIndexFile)) { + throw new SignatureVerificationFailedException(DEFAULT_INDEX_FILE_NAME); + } + index = parseIndex(defaultIndexFile); File[] indexFiles = preferencesFolder.listFiles(new FilenameFilter() { @Override @@ -147,9 +140,18 @@ public class ContributionsIndexer { return !PROTECTED_PACKAGE_NAMES.contains(contributedPackage.getName()) || isSigned(indexFile); } - //TODO stub implementation private boolean isSigned(File indexFile) { - return true; + File signature = new File(indexFile.getParent(), indexFile.getName() + ".sig"); + if (!signature.exists()) { + return false; + } + + try { + return new GPGDetachedSignatureVerifier().verify(indexFile, signature, new File(BaseNoGui.getContentFile("lib"), "public.gpg.key")); + } catch (Exception e) { + BaseNoGui.showWarning(e.getMessage(), e.getMessage(), e); + return false; + } } private ContributionsIndex parseIndex(File indexFile) throws IOException { @@ -169,6 +171,9 @@ public class ContributionsIndexer { } public void syncBuiltInHardwareFolder(File hardwareFolder) throws IOException { + if (index == null) { + return; + } for (File folder : hardwareFolder.listFiles(ONLY_DIRS)) { ContributedPackage pack = index.findPackage(folder.getName()); if (pack != null) { @@ -203,8 +208,13 @@ public class ContributionsIndexer { } public void syncLocalPackagesFolder() { - if (!packagesFolder.isDirectory()) + if (!packagesFolder.isDirectory()) { return; + } + + if (index == null) { + return; + } // Scan all hardware folders and mark as installed all the // platforms found. @@ -270,6 +280,10 @@ public class ContributionsIndexer { public List createTargetPackages() throws TargetPlatformException { List packages = new ArrayList(); + if (index == null) { + return packages; + } + for (ContributedPackage aPackage : index.getPackages()) { ContributedTargetPackage targetPackage = new ContributedTargetPackage(aPackage.getName()); @@ -315,6 +329,9 @@ public class ContributionsIndexer { public Set getInstalledTools() { Set tools = new HashSet(); + if (index == null) { + return tools; + } for (ContributedPackage pack : index.getPackages()) { Collection platforms = Collections2.filter(pack.getPlatforms(), new InstalledPredicate()); ImmutableListMultimap platformsByName = Multimaps.index(platforms, new Function() { @@ -353,4 +370,24 @@ public class ContributionsIndexer { return new File(preferencesFolder, name); } + public List getPackages() { + if (index == null) { + return new LinkedList(); + } + return index.getPackages(); + } + + public List getCategories() { + if (index == null) { + return new LinkedList(); + } + return index.getCategories(); + } + + public ContributedPlatform getInstalled(String packageName, String platformArch) { + if (index == null) { + return null; + } + return index.getInstalled(packageName, platformArch); + } } diff --git a/arduino-core/src/cc/arduino/packages/security/ClearSignedVerifier.java b/arduino-core/src/cc/arduino/packages/security/ClearSignedVerifier.java deleted file mode 100644 index 0c53126a9..000000000 --- a/arduino-core/src/cc/arduino/packages/security/ClearSignedVerifier.java +++ /dev/null @@ -1,135 +0,0 @@ -/* - * This file is part of Arduino. - * - * Arduino is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - * As a special exception, you may use this file as part of a free software - * library without restriction. Specifically, if other files instantiate - * templates or use macros or inline functions from this file, or you compile - * this file and link it with other files to produce an executable, this - * file does not by itself cause the resulting executable to be covered by - * the GNU General Public License. This exception does not however - * invalidate any other reasons why the executable file might be covered by - * the GNU General Public License. - * - * Copyright 2013 Arduino LLC (http://www.arduino.cc/) - */ - -package cc.arduino.packages.security; - -import cc.arduino.packages.security.keys.PackagersPublicKeys; -import org.bouncycastle.bcpg.ArmoredInputStream; -import org.bouncycastle.jce.provider.BouncyCastleProvider; -import org.bouncycastle.openpgp.*; -import org.bouncycastle.openpgp.operator.jcajce.JcaPGPContentVerifierBuilderProvider; -import processing.app.helpers.StringUtils; - -import java.io.*; -import java.security.Security; - -public class ClearSignedVerifier { - - public static class VerifyResult { - public byte clearText[]; - public boolean verified; - public Exception error; - } - - /** - * Verify a PGP clearText-signature. - * - * @param signedTextFile A File containing the clearText signature - * @param pubKeyRing A public key-ring containing the public key needed for the - * signature verification - * @return A VerifyResult class with the clearText and the signature - * verification status - * @throws FileNotFoundException - */ - public static VerifyResult verify(File signedTextFile, - PGPPublicKeyRingCollection pubKeyRing) { - // Create the result object - VerifyResult result = new VerifyResult(); - result.clearText = null; - result.verified = false; - result.error = null; - - ArmoredInputStream in = null; - try { - // Extract clear text. - // Dash-encoding is removed by ArmoredInputStream. - in = new ArmoredInputStream(new FileInputStream(signedTextFile)); - ByteArrayOutputStream temp = new ByteArrayOutputStream(in.available()); - while (true) { - int c = in.read(); - if (c == -1) - throw new IOException("Unexpected end of file"); - if (!in.isClearText()) - break; - temp.write(c); - } - byte clearText[] = temp.toByteArray(); - result.clearText = clearText; - - // Extract signature from clear-signed text - PGPObjectFactory pgpFact = new PGPObjectFactory(in); - PGPSignatureList p3 = (PGPSignatureList) pgpFact.nextObject(); - PGPSignature sig = p3.get(0); - - // Decode public key - PGPPublicKey publicKey = pubKeyRing.getPublicKey(sig.getKeyID()); - - // Verify signature - Security.addProvider(new BouncyCastleProvider()); - sig.init(new JcaPGPContentVerifierBuilderProvider().setProvider("BC"), - publicKey); - // RFC 4880, section 7: http://tools.ietf.org/html/rfc4880#section-7 - // The signature must be validated using clear text: - // - without trailing white spaces on every line - // - using CR LF line endings, no matter what the original line ending is - // - without the latest line ending - BufferedReader textIn = new BufferedReader(new InputStreamReader( - new ByteArrayInputStream(clearText))); - while (true) { - // remove trailing whitespace and line endings - String line = StringUtils.rtrim(textIn.readLine()); - sig.update(line.getBytes()); - if (!textIn.ready()) // skip latest line ending - break; - // always use CR LF - sig.update((byte) '\r'); - sig.update((byte) '\n'); - } - - // Prepare the result - result.verified = sig.verify(); - } catch (Exception e) { - result.error = e; - } finally { - if (in != null) - try { - in.close(); - } catch (IOException e) { - // ignored - } - } - return result; - } - - public static void main(String[] args) throws Exception { - VerifyResult verify = verify(new File( - "/home/megabug/git/arduino/test.txt.asc"), new PackagersPublicKeys()); - System.out.println(verify.verified); - } -} diff --git a/arduino-core/src/cc/arduino/packages/security/keys/PackagersPublicKeys.java b/arduino-core/src/cc/arduino/packages/security/keys/PackagersPublicKeys.java deleted file mode 100644 index 49c419bc6..000000000 --- a/arduino-core/src/cc/arduino/packages/security/keys/PackagersPublicKeys.java +++ /dev/null @@ -1,99 +0,0 @@ -/* - * This file is part of Arduino. - * - * Arduino is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - * As a special exception, you may use this file as part of a free software - * library without restriction. Specifically, if other files instantiate - * templates or use macros or inline functions from this file, or you compile - * this file and link it with other files to produce an executable, this - * file does not by itself cause the resulting executable to be covered by - * the GNU General Public License. This exception does not however - * invalidate any other reasons why the executable file might be covered by - * the GNU General Public License. - * - * Copyright 2013 Arduino LLC (http://www.arduino.cc/) - */ - -package cc.arduino.packages.security.keys; - -import java.io.ByteArrayInputStream; -import java.io.IOException; - -import org.bouncycastle.openpgp.PGPException; -import org.bouncycastle.openpgp.PGPPublicKeyRingCollection; -import org.bouncycastle.openpgp.PGPUtil; - -public class PackagersPublicKeys extends PGPPublicKeyRingCollection { - - public static final String ARDUINO_PK = "" // - + "-----BEGIN PGP PUBLIC KEY BLOCK-----\n" - + "Version: GnuPG v1.4.11 (GNU/Linux)\n" - + "\n" - + "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\n" - + "KCcKZZVUQLJhOIwgHQMy7ck=\n" // - + "=u0/X\n" // - + "-----END PGP PUBLIC KEY BLOCK-----\n"; - - public PackagersPublicKeys() throws IOException, PGPException { - super(PGPUtil.getDecoderStream(new ByteArrayInputStream(ARDUINO_PK.getBytes()))); - } - -} diff --git a/arduino-core/src/processing/app/BaseNoGui.java b/arduino-core/src/processing/app/BaseNoGui.java index 3c89ed50f..b53a81aa1 100644 --- a/arduino-core/src/processing/app/BaseNoGui.java +++ b/arduino-core/src/processing/app/BaseNoGui.java @@ -1,5 +1,6 @@ package processing.app; +import cc.arduino.contributions.SignatureVerificationFailedException; import cc.arduino.contributions.libraries.LibrariesIndexer; import cc.arduino.contributions.packages.ContributedTool; import cc.arduino.contributions.packages.ContributionsIndexer; @@ -581,6 +582,7 @@ public class BaseNoGui { File defaultPackageJsonFile = new File(getContentFile("dist"), "package_index.json"); if (!indexFile.isFile() || (defaultPackageJsonFile.isFile() && defaultPackageJsonFile.lastModified() > indexFile.lastModified())) { FileUtils.copyFile(defaultPackageJsonFile, indexFile); + FileUtils.copyFile(new File(getContentFile("dist"), "package_index.json.sig"), new File(indexFile.getParent(), "package_index.json.sig")); } else if (!indexFile.isFile()) { // Otherwise create an empty packages index FileOutputStream out = null; @@ -594,7 +596,13 @@ public class BaseNoGui { } } } - indexer.parseIndex(); + + try { + indexer.parseIndex(); + } catch (SignatureVerificationFailedException e) { + indexFile.delete(); + throw e; + } indexer.syncWithFilesystem(getHardwareFolder()); packages = new HashMap(); diff --git a/build/build.xml b/build/build.xml index a99486e57..00438e9b8 100644 --- a/build/build.xml +++ b/build/build.xml @@ -953,6 +953,7 @@ + diff --git a/build/macosx/template.app/Contents/Info.plist b/build/macosx/template.app/Contents/Info.plist index e48146869..9c573c988 100755 --- a/build/macosx/template.app/Contents/Info.plist +++ b/build/macosx/template.app/Contents/Info.plist @@ -97,7 +97,7 @@ - $JAVAROOT/antlr.jar:$JAVAROOT/apple.jar:$JAVAROOT/arduino-core.jar:$JAVAROOT/bcpg-jdk15on-149.jar:$JAVAROOT/bcprov-jdk15on-149.jar:$JAVAROOT/commons-codec-1.7.jar:$JAVAROOT/commons-compress-1.8.jar:$JAVAROOT/commons-exec-1.1.jar:$JAVAROOT/commons-httpclient-3.1.jar:$JAVAROOT/commons-lang3-3.3.2.jar:$JAVAROOT/commons-logging-1.0.4.jar:$JAVAROOT/ecj.jar:$JAVAROOT/guava-18.0.jar:$JAVAROOT/jackson-annotations-2.2.3.jar:$JAVAROOT/jackson-core-2.2.3.jar:$JAVAROOT/jackson-databind-2.2.3.jar:$JAVAROOT/jackson-module-mrbean-2.2.3.jar:$JAVAROOT/java-semver-0.8.0.jar:$JAVAROOT/jmdns-3.4.1.jar:$JAVAROOT/jna.jar:$JAVAROOT/jsch-0.1.50.jar:$JAVAROOT/jssc-2.8.0.jar:$JAVAROOT/pde.jar:$JAVAROOT/quaqua.jar + $JAVAROOT/antlr.jar:$JAVAROOT/apple.jar:$JAVAROOT/arduino-core.jar:$JAVAROOT/bcpg-jdk15on-152.jar:$JAVAROOT/bcprov-jdk15on-152.jar:$JAVAROOT/commons-codec-1.7.jar:$JAVAROOT/commons-compress-1.8.jar:$JAVAROOT/commons-exec-1.1.jar:$JAVAROOT/commons-httpclient-3.1.jar:$JAVAROOT/commons-lang3-3.3.2.jar:$JAVAROOT/commons-logging-1.0.4.jar:$JAVAROOT/ecj.jar:$JAVAROOT/guava-18.0.jar:$JAVAROOT/jackson-annotations-2.2.3.jar:$JAVAROOT/jackson-core-2.2.3.jar:$JAVAROOT/jackson-databind-2.2.3.jar:$JAVAROOT/jackson-module-mrbean-2.2.3.jar:$JAVAROOT/java-semver-0.8.0.jar:$JAVAROOT/jmdns-3.4.1.jar:$JAVAROOT/jna.jar:$JAVAROOT/jsch-0.1.50.jar:$JAVAROOT/jssc-2.8.0.jar:$JAVAROOT/pde.jar:$JAVAROOT/quaqua.jar JVMArchs diff --git a/build/shared/lib/public.gpg.key b/build/shared/lib/public.gpg.key new file mode 100644 index 000000000..5de39fed1 Binary files /dev/null and b/build/shared/lib/public.gpg.key differ diff --git a/build/windows/launcher/config.xml b/build/windows/launcher/config.xml index 30521fe94..afc6e7008 100644 --- a/build/windows/launcher/config.xml +++ b/build/windows/launcher/config.xml @@ -18,8 +18,8 @@ lib/antlr.jar lib/apple.jar lib/arduino-core.jar - lib/bcpg-jdk15on-149.jar - lib/bcprov-jdk15on-149.jar + lib/bcpg-jdk15on-152.jar + lib/bcprov-jdk15on-152.jar lib/commons-codec-1.7.jar lib/commons-compress-1.8.jar lib/commons-exec-1.1.jar diff --git a/build/windows/launcher/config_debug.xml b/build/windows/launcher/config_debug.xml index 9731811f6..88cbbb5b4 100644 --- a/build/windows/launcher/config_debug.xml +++ b/build/windows/launcher/config_debug.xml @@ -18,8 +18,8 @@ lib/antlr.jar lib/apple.jar lib/arduino-core.jar - lib/bcpg-jdk15on-149.jar - lib/bcprov-jdk15on-149.jar + lib/bcpg-jdk15on-152.jar + lib/bcprov-jdk15on-152.jar lib/commons-codec-1.7.jar lib/commons-compress-1.8.jar lib/commons-exec-1.1.jar