Index: client/1.0/neutral/pkgd.eagle ================================================================== --- client/1.0/neutral/pkgd.eagle +++ client/1.0/neutral/pkgd.eagle @@ -700,10 +700,39 @@ } return "" } + # + # NOTE: This procedure attempts to guess a package name based on a list of + # its files. It relies upon the fact that all packages must include + # a package index file. The language argument must be one of the + # literal strings "eagle", "tcl", or "client". The fileNames argument + # must be the list of file names to be downloaded. The package name, + # if one can be detected, is returned; otherwise, an empty string will + # be returned. + # + proc guessPackageNameFromFileNames { language fileNames } { + set packageIndexFileName [getPackageIndexFileName $language] + + if {[string length $packageIndexFileName] > 0} then { + foreach fileName $fileNames { + set fileNameOnly [file tail $fileName] + + if {$fileNameOnly eq $packageIndexFileName} then { + set directory [file dirname $fileName] + + if {[string length $directory] > 0} then { + return [file tail $directory] + } + } + } + } + + return "" + } + # # NOTE: This procedure verifies the platform specified by the caller. The # platform argument must be an empty string -OR- one of the literal # strings "neutral", "win32-arm", "win32-x86", "win64-arm64", # "win64-ia64", or "win64-x64". An empty string means that the @@ -742,10 +771,18 @@ if {[info exists packageName]} then { set localPackageName $packageName } else { set localPackageName "" } + + upvar 1 fileNames fileNames + + if {[info exists fileNames]} then { + set localFileNames $fileNames + } else { + set localFileNames [list] + } upvar 1 usePgp usePgp if {[info exists usePgp]} then { set localUsePgp $usePgp @@ -757,11 +794,11 @@ # NOTE: Download the list of platforms associated with this package # from the package repository server. This may fail and raise # a script error. # set platforms [downloadAllPlatforms \ - $language $version $localPackageName $localUsePgp] + $language $version $localPackageName $localFileNames $localUsePgp] if {[string length $varName] > 0} then { upvar 1 $varName newPlatform } @@ -1066,16 +1103,15 @@ # argument must be one of the literal strings "8.4", "8.5", or "8.6" # when the language is "tcl" -OR- the literal string "1.0" when the # language is either "eagle" or "client". The packageName argument # is a directory name relative to the language and version-specific # directory on the package file server and may be an empty string. - # The localFileName argument is the file name where the downloaded - # file should be written. The usePgp argument should be non-zero - # when an OpenPGP signature needs to be verified for the downloaded - # file. + # The fileNames argument is the list of file names to be downloaded. + # The usePgp argument should be non-zero when an OpenPGP signature + # needs to be verified for the downloaded file. # - proc downloadAllPlatforms { language version packageName usePgp } { + proc downloadAllPlatforms { language version packageName fileNames usePgp } { variable baseUri variable platformsUri variable platformsUrn variable temporaryRootDirectory @@ -1105,10 +1141,12 @@ if {$usePgp && [isOpenPgpSignatureFileName $localFileName true]} then { # # NOTE: Attempt to verify the OpenPGP signature. If this fails, # an error is raised. # + ::PackageRepository::openPgpMustBeInstalled + if {![::PackageRepository::verifyOpenPgpSignature $localFileName]} then { error [appendArgs \ "bad OpenPGP signature \"" $localFileName \"] } } @@ -1130,10 +1168,14 @@ # NOTE: Figure out the pattern to use when matching against the file # names in the manifest data. If available, this will include # the package name; otherwise, platform names for all packages # will be considered. # + if {[string length $packageName] == 0} then { + set packageName [guessPackageNameFromFileNames $language $fileNames] + } + if {[string length $packageName] > 0} then { set pattern [file join $language $version * $packageName *] } else { set pattern [file join $language $version *] } @@ -1208,10 +1250,12 @@ if {$usePgp && [isOpenPgpSignatureFileName $localFileName true]} then { # # NOTE: Attempt to verify the OpenPGP signature. If this fails, # an error is raised. # + ::PackageRepository::openPgpMustBeInstalled + if {![::PackageRepository::verifyOpenPgpSignature $localFileName]} then { error [appendArgs \ "bad OpenPGP signature \"" $localFileName \"] } } Index: client/1.0/neutral/pkgd.eagle.asc ================================================================== --- client/1.0/neutral/pkgd.eagle.asc +++ client/1.0/neutral/pkgd.eagle.asc @@ -1,18 +1,18 @@ -----BEGIN PGP SIGNATURE----- Version: GnuPG v2 Comment: Eagle Package Repository -iQIcBAABCAAGBQJYE7vFAAoJEFAslq9JXcLZBwMQAKDm7HlMo5oFirUaOKAV6y+J -/N7DWzhOmq/iHCOp584xlBCoAl3gTv9DYXxwMWpVdz10Fh4lzkLsgOg9PwIcUECt -vuuREsBbWb+6gm5S9Owm8TE7zXn3cPo517KOp/vl+9gKBiwzv7UyzJmpGwAzi3r4 -LaifHy9nOp1fInxI8uEOnJuBBnL+h2M3q/gOtikm4tc5LlAjEC1mDS0vWQCNUarq -zBMWqvor3DzkxGEtIvrtobrWATUdylnobD/s1kfdchZf/H4ssVUR6aTHVv9sKQ9P -nCBQzuEB/jEFAKL+TjgUlqJ9diRQ8REnfW2HoCaPfzt1DuM4Iznpe6aRgUSpcOwv -P1WnRwKOFPY4Zx7q7i/uvu5yhtupzR+LDQUFBV9et6M+pYJc8Pg8tGztCHoZ9AFD -oF3+fjtLdegjC99cLugFdc1InnTR+GhQK/w1AYf85ikIl3mMUpcRvdsQ7MYmyps5 -36Qcx3kqb41HZlV1VD7j/YNWiV63wEnU5zhbbI20/WqBslkNqc2m8u4ULSWCq/kx -pfNQMNRz4QzgEpmFKq/QCvZNsmrbN6vVW74RWEJyfM0JBjYf8K7wGQuEv5zN2S03 -oTx0VUg79X5xz1BmYiOgmTlz8qwbm1K5N9sEwGCeDqNo2xhhvB5/mIE7khGxZfbC -7/lWkt9iPyMg19UfVUxD -=WJyn +iQIcBAABCAAGBQJYFpKcAAoJEFAslq9JXcLZnn0P/iFQYWnBCA+H7GF5of1EOOAH +176D9KBLc0V881vihj0WnJ1YfWCGhkXnqARqy5yv72nBZlTWB6i33ewzJH7gyevZ +F1BqIh1EyV+v2AlAyhTydOlb3JQb07IMM+5eVRVd75TMp4LRr+InOkKfDMCeLuSp +jvcp2iPQPlEpOpEW1echzJgIdEpgfML9cG7pUbyTAY+874yRcffbWlQXfFaPn7OW +6EdENAivX8+V0AAGVlHiWG3tdc0bJBM0Lh58w1mjODLYPGldHRc78vdtcEZXkDzY +CTj8KIItKq7PCuPbTeZMH3X9ChKa5uBVC1a1ivcp8f0Lq8z8vH2MvddnobmWLzYu +YN//pvsOBe+N6EEy61ToKL44pSN0GV5uemRfYu6q4pEIPZtN1oEzrfJfj+DOXM4H +ONenr2hyrPM+8/oeRCars+m1hKWjXYzeRoQ48e0ueiJDKkqxLQBuwxmhDxhJmYbP +/cdpV3EdwNwBhQYJ4GhNK41iecfxpya5SKGR2zqYkkko5JHNacCy+kez768QEBdq +xnRBSfemkb4d5/ZRpsZJl4L07V8cipDgtYOxRL1l/1zD6ay6jsXwosX8kUjbrQyA +5/MfBBvTtfKLg3/w2XTtKFHUNYxzHG19KhxkJ9sUt2PKHHUwD95PKjE3+Ht8mvE/ +anQwCmgtFDw6onWlDshg +=x/i7 -----END PGP SIGNATURE----- Index: client/1.0/neutral/pkgd.eagle.harpy ================================================================== --- client/1.0/neutral/pkgd.eagle.harpy +++ client/1.0/neutral/pkgd.eagle.harpy @@ -19,50 +19,50 @@ None Mistachkin Systems - 6ed16d98-c12c-4a58-9ff6-2344a6cc9ec1 + dfe02158-0787-40dc-ab76-b5b3b27db03e SHA512 Script - 2016-10-28T20:57:10.7421406Z + 2016-10-31T00:36:41.6996407Z -1.00:00:00 0x9559f6017247e3e2 - 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 Index: client/1.0/neutral/pkgd.eagle.harpy.asc ================================================================== --- client/1.0/neutral/pkgd.eagle.harpy.asc +++ client/1.0/neutral/pkgd.eagle.harpy.asc @@ -1,18 +1,18 @@ -----BEGIN PGP SIGNATURE----- Version: GnuPG v2 Comment: Eagle Package Repository -iQIcBAABCAAGBQJYE7vGAAoJEFAslq9JXcLZqX4P/3+dFIPeld578TNXdq8qzEUU -dStnBjsuCQECqE++Ve/RdHrY2/uzAmcyYiNy8oELPQYSWwX2Y8YWtYfzPIuc8tzA -lKrsGxFlgabLpDYBrScovUS6Nv7HohwvWT7p6lSaiQ03w7cR1clfKyBHXrr0KhPe -ve/KrJElXSzpfYOhAgKn3PA0YCT0us5HWFAn0yZXCnxPlA3CPuLpyujMVJrYVOzo -iuBiU2XkbXELpC+v+J0Jch4CRFXYAP7mMuwyz7W7Rau2lzTcoK6eXsEn0d2q3PxP -lO1D0hGVWuEuMDAImKyYVRe3B5nZHM53ClzSlj5QUKdcz10610SdFewU5DLgLSji -fu8vBuFCrWWbBk0zmnuY310rNGEEWwnhZ+sqxCwWkZfkZFONV1BT+NlwsHr89lH/ -3i6TdR4ddStK3rAiUetOraBRR+L7OJcv0oQB5JsGDP/CXdtgzv2BnxHRCU8vfMnx -BFKVC0qrtSt0+HWMQTW0CYd3dzr1o1oZ846I9EYzgwFAadetjtSqjsMRPgppBriD -/e8AkY+GDJGFmu48hM8CFGFtUpNqQ2xKemX+GcBhy0mRkWQR7noSks4+Thd6WQyl -LZl1xr8npI/MCo17Mpk4lTg2nDbP6a9nRWhFRVbpo6QOtwiLteEQUTb3LdHMBK0W -iSEK4bd2WGaZS2vRoQW1 -=fotc +iQIcBAABCAAGBQJYFpKeAAoJEFAslq9JXcLZ14sP/3wW75sAFZEidnnJ5fCALUZJ +43zLj+wDzcPAuY0xaZU5JAVMAcIsr9E8Uxsk+qRMDIeRYpPz27RfxyijN458mfw+ +yZJ13QLYYCDEGEqETDYo+x5HljmQYBIP87Bwah3DCpehWFfPuWm1s1qcprXDL6fW +btnRttNQVyPyWHPaIfD5HEvxuCAGXVCZBxtOOlRSTpkfxPKrCcG+hHJWw9XGsqUO +ePoweC1sInehc0jV8O48GHU98T7Lqr9WgZbCk3Bk44Mjs2sCu3U0k4g9D0uOlCp7 +WZ/48Y9GIMnIJ/83hQ+ol/qGrokbmPbz893HpHNyK/t5YJ3EQEphoOO7PV5j0Ok9 +jXS+fRv8AfkGRvqurqcjf7bMs3iy1dPauiI2af7yORswhwHKScpOlsaXFgkLpvab +mp17nK0mPuPtDJQR+eZcxPwylwxiRmZinqaE79UEN+OmyMv5WJ9VMthkRpgoYP8s +PAp0RpN7tVciTGDpgutpNPIJua2y6+A+O3D6G9WfHPXgvn0hpavd5myaGTw1B7RK +6CgBnOWuRk3JfY7lbgIoQl3Q5GIoVNp09cBKAaEQFKm5iSlb9V4qYd8m7RwfFNCd +feyCH00/Rj8UUzkhwEHOPTBSPw87GQbl5PGWhbKkVAq5tCSk9hfSjNhXrdEJpe2z +l/DlaGTOrgd3cabXuNR5 +=gcjH -----END PGP SIGNATURE----- Index: client/1.0/neutral/pkgr.eagle ================================================================== --- client/1.0/neutral/pkgr.eagle +++ client/1.0/neutral/pkgr.eagle @@ -274,10 +274,43 @@ incr counter } } } + # + # NOTE: This procedure attempts to verify that a configured implementation + # of OpenPGP is installed locally. There are no arguments. Script + # errors are raised if any problems are found. The return value is + # undefined. + # + # + proc openPgpMustBeInstalled {} { + variable openPgpInstalledCommand + variable openPgpInstalledPattern + + if {[isEagle]} then { + if {[catch { + eval exec -success Success $openPgpInstalledCommand + } result]} then { + error "cannot use OpenPGP: may not be installed and/or configured" + } + } else { + if {[catch { + eval exec [subst $openPgpInstalledCommand] + } result]} then { + error "cannot use OpenPGP: may not be installed and/or configured" + } + } + + if {![info exists result] || \ + ![regexp -- $openPgpInstalledPattern $result]} then { + error "cannot use OpenPGP: unknown or unsupported version" + } + + return "" + } + # # NOTE: This procedure attempts to verify the OpenPGP signature contained # in the specified (named) file. Non-zero is only returned if the # OpenPGP signature is verified successfully. A script error should # not be raised by this procedure. The fileName argument must be @@ -284,23 +317,23 @@ # the fully qualified path and file name of the OpenPGP signature # file to verify. # # proc verifyOpenPgpSignature { fileName } { - variable openPgpCommand + variable openPgpVerifyCommand if {[isEagle]} then { set fileName [appendArgs \" $fileName \"] if {[catch { - eval exec -success Success [subst $openPgpCommand] + eval exec -success Success [subst $openPgpVerifyCommand] }] == 0} then { return true } } else { if {[catch { - eval exec [subst $openPgpCommand] 2>@1 + eval exec [subst $openPgpVerifyCommand] 2>@1 }] == 0} then { return true } } @@ -1187,10 +1220,12 @@ # # NOTE: Attempt to verify the OpenPGP signature for the package # script. # + openPgpMustBeInstalled + if {[verifyOpenPgpSignature $fileName(2)]} then { # # NOTE: Delete the temporary files that we created for the # OpenPGP signature verification. # @@ -1731,18 +1766,41 @@ } else { set autoRequireGaruda false } } + # + # NOTE: The command to use when attempting to verify that OpenPGP is + # installed locally. This must be configured according to the + # implementation of OpenPGP in use. + # + variable openPgpInstalledCommand; # DEFAULT: gpg2 --version + + if {![info exists openPgpInstalledCommand]} then { + set openPgpInstalledCommand {gpg2 --version} + } + + # + # NOTE: The regular expression pattern used when attempting to verify + # that OpenPGP is installed locally. This must be configured + # according to the implementation of OpenPGP in use. + # + variable openPgpInstalledPattern; # DEFAULT: ^gpg \(GnuPG\) 2\.0\. + + if {![info exists openPgpInstalledPattern]} then { + set openPgpInstalledPattern {^gpg \(GnuPG\) 2\.0\.} + } + # # NOTE: The command to use when verifying OpenPGP signatures for the - # downloaded package scripts. + # downloaded package scripts. This must be configured according + # to the implementation of OpenPGP in use. # - variable openPgpCommand; # DEFAULT: gpg2 --verify {${fileName}} + variable openPgpVerifyCommand; # DEFAULT: gpg2 --verify {${fileName}} - if {![info exists openPgpCommand]} then { - set openPgpCommand {gpg2 --verify {${fileName}}} + if {![info exists openPgpVerifyCommand]} then { + set openPgpVerifyCommand {gpg2 --verify {${fileName}}} } # # NOTE: Verify that the package script matches the current language # when called from the [package unknown] handler? Index: client/1.0/neutral/pkgr.eagle.asc ================================================================== --- client/1.0/neutral/pkgr.eagle.asc +++ client/1.0/neutral/pkgr.eagle.asc @@ -1,18 +1,18 @@ -----BEGIN PGP SIGNATURE----- Version: GnuPG v2 Comment: Eagle Package Repository -iQIcBAABCAAGBQJYE7u/AAoJEFAslq9JXcLZvi4QAKCRluQ5d1jceMbglWqJekUv -MZm/U0ZYAHIINUB0FaQUBVa+lBRbKn06c585Khuf74Wv3PVaJ/qwIeMTQEYewSy/ -/R1SGc/zH9l3WfgAeAuntoU/kqIrjJFrimWJ0RMaM+RJwjXrGBYncZ2BhnPldIJS -kOz/3q2GXZOGwuL4FVkAg+h7bNf7pYQUNj6Nt/82AkJhcYeuQMeMgvRSWm8HHZir -GKP2CgiQRJ4JNZ1GWZ9KbKb1z0sDVidTDi5kKJX9mZE2PubNJPKcEEheb9uhy6/t -8LgJRNWmoMljsvn2OHju88o7xTTUeHGcQcO8vlk2SR20RgHKm2xS53OuhBvvyrrF -y8YK7XoJ5wqHj7vlOeEWLA0cShnWjaTlNfbfz4Vfb/rOy9wjpKyp+pvkny2AC3Vg -gYtO51AXp2BdTK4Nvh8XiltiephKuT8r0kmFuOVyY1HKC/RGVsqpAb2slYzWIIIT -lXgKsNijKCV69JcFCktHZE95wbSeQZEGx1H+t7vbES0hWvyuLjUQCUHxn0X9yV9o -m2phJTwQyNDK5uhisSkscM1lw2M73sfetKShjvvtrGXoEOmGdhNbQw7jP0aUCwpl -v0/FEVgRZh8yAwcU28cA1mUTfZ6wotwYBGHzmpeDJGv3ZgPOGoeTYxU+uy8vfxYF -BezEogjNRuUi4W/svIVk -=oqiu +iQIcBAABCAAGBQJYFpKWAAoJEFAslq9JXcLZFg0QAJCv48Iy2dh3PTKf49XphgzQ +g3HtzsFxGDu6SI8F+VzeFe6GDM+JAjyXg9jd4hRRqBu4tXLfqxEK+QJ1ZFywEJk3 +KOfnhKsk7cjNhkQ9SY1gq53RoT+cHwWTPBFX4nkQYFw1kZM/H4HkO49y4AXDFkId +k7rtZh8sc5fXBfSHBxvbal9jIdq4LVbGZ2/yWGmjEcYOnhH/RW1u9FZT+V02R492 +BvhGhTE6Rr6uLo+YarMxMh2kiQt4P1xHurN0baalzrL7mfH7M+CYIXnjS+p7sABv +QVw/ZHpGyTFoBehcddIkT5ODZdibdkyCXMOO/pZ+eOlswwc7e3o3p2heVYyo+IyV +eOfwa4BcE4JUl6GkcEBHmj+UKNCKjHv1hXl0M0KglqQuvGn3A5JgUukETmkQhbPP +WWjD2DfzyqOdvpjh3r+GKyGsF06OGIc/hBuFzDnIUIJ5sUpzNrAnuXyQLYW7PMYc +VX9R1V01VomZXV00lS7BthgXucr7huAuadG+R8w2JKeJKYQY26evC3ygEfM/oA5w +FmZsNlL9Ju3Rnw7yZrjqbHIWN/pzotT0IT2/q3dIdhUwEyOQvtP/v1yce+eIrBH+ +RTgM/WGUhsfVp/1xPm8+xIGoeKBMbTk0kOdncmJEWTx6P3zcp7h5gSqjxY0JNFfv +ydP83V9D2lP75K1btsSJ +=AwPq -----END PGP SIGNATURE----- Index: client/1.0/neutral/pkgr.eagle.harpy ================================================================== --- client/1.0/neutral/pkgr.eagle.harpy +++ client/1.0/neutral/pkgr.eagle.harpy @@ -19,50 +19,50 @@ None Mistachkin Systems - 9f676ee9-c8d6-4443-82a2-27addf071618 + bfe7ea6e-05e7-4c46-b24f-b6e17e8fd4d8 SHA512 Script - 2016-10-28T20:56:43.6044453Z + 2016-10-31T00:37:04.3334297Z -1.00:00:00 0x9559f6017247e3e2 - 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 Index: client/1.0/neutral/pkgr.eagle.harpy.asc ================================================================== --- client/1.0/neutral/pkgr.eagle.harpy.asc +++ client/1.0/neutral/pkgr.eagle.harpy.asc @@ -1,18 +1,18 @@ -----BEGIN PGP SIGNATURE----- Version: GnuPG v2 Comment: Eagle Package Repository -iQIcBAABCAAGBQJYE7vBAAoJEFAslq9JXcLZaHsP+we67OXvqTG7g+lsaWe/24+H -MBzd+lF+5wsoRzAn+nvrF0lMIjHPgRdR4aNEb8UUgEwr5BA0j7VvB6yXKwZzmnTf -9kFWo9C/gDgU/TgtS9ZMACr9DBOvmGlzmciFSQQAdJ6wE6ojN6G7YoI354LW0gNN -077AEYeMcsKzxDKFOyMXWeh6lhSXbJLpMD3piG84pyYA1BlscbrH4pnj4+uFXeRG -PL0u8RyUiWZcCjG3pNa8Zr+JUFrNekukkK2hL4yYHNVUEQ4c0ByFlCPlh6wb2dMD -rvzevvt/Lrlw2BR4TLNKTdxYqA1zb5V4x35T1i13KqhuWREZI8XVqChiUiV+gRFR -vGVOYXxseWHImuFy8E7X5tzqtJshMctrIta/x7ir6txSNnSUoZRjgyMInJXt+k7G -43ra8nCa54OV2clbc76LXpSUmJG/zAvuqTG9ZepcNgmpblw5LS1Sy56hkR1LbHoE -VxmwXFyxGrhOGsB0035ax0d3KyGEidSE4lTY3e6NCicRhRehZVRHS8wagIPgqeGe -UEK5kkLmRqBqMPtmMW0/1Xj3DPwJCrBrycqHv4u8KZ9Me+OLnOlcOlQrb6IZ7GIU -oIVlKZJR/sBzZ4oNQdCMoxBSzN+evp39FShgIJCIvK5t7aIvUdwRJCJ9VTwSYKD2 -qKHSXFxBg2GNU28ykMhX -=NZFm +iQIcBAABCAAGBQJYFpKYAAoJEFAslq9JXcLZHdgP/jEf5Pbq2X+mjFH8QiRpJhnP +ZZ1jErRpXuZ5YgKdIQDq/SHJFKyqGWlO8Km14NCpEt/W3weU8OCjVDB89+f0sX1V +22ahQZpE/ubzzeFgFt+DPC6QW6D6qaxUcOj62RTepp/oyq/b/zVWTmF0xurqeCpb +QJHinZH9ONje379tg2VkI/0nwDayfwzshSSpWDc2uyosKvpASY8mwybhmefdbnj3 +cglScjJQoNBhO5j6Lu/xJxT1eFyli8FYh+w5Oc/UuhGls70aoiIxoxeD3tQKj715 +tLhQxfz8TP8V+DBdx7JPaPnNnCDwjcFgRXZg80BX6nLZacAFZZXYjKQJTYDmRa2v +RZHyhNJp9XTvH6fqbDF1JYAgdQM8ARp1BehEIudGhZ5zRKTf/EkVx48T0Ajwr06w +Qb2py9gvgX4pbHKVBy5uc1JHgu9nL4dT0qhWGfHDpg3lE6PS77EbNKVXlTut9PHY +1pvnbGc6EZnTdlv9jCxAvS1SwPQgYqx6l/8QHnx+nMAgzXSB65GswYXRTyyqpZEH +1VrkTMvBSy299+KMebUCMTtyXSTcAH/kPTBaDImhXk5HlpPckkHD65TdVbEWQmy/ ++G7d/mWcVkf1OVReeE73AOne2p6CNH/bAkzAQiD6NRc2m64yuRX9zEEMI7EQYLqJ +8+t6pGIk/BilbkwoRNua +=DNwu -----END PGP SIGNATURE-----