Module-Signature-0.83/000755 000765 000024 00000000000 13341455163 015455 5ustar00audreytstaff000000 000000 Module-Signature-0.83/inc/000755 000765 000024 00000000000 13341455163 016226 5ustar00audreytstaff000000 000000 Module-Signature-0.83/SIGNATURE000644 000765 000024 00000007355 13341455157 016756 0ustar00audreytstaff000000 000000 This file contains message digests of all files listed in MANIFEST, signed via the Module::Signature module, version 0.83. To verify the content in this distribution, first make sure you have Module::Signature installed, then type: % cpansign -v It will check each file's integrity, as well as the signature's validity. If "==> Signature verified OK! <==" is not displayed, the distribution may already have been compromised, and you should not run its Makefile.PL or Build.PL. -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA256 SHA256 9cec751fbdaa4ec3257dd2cabf19dfd23f989ffd682de3eafa9f6020b0099a79 ANDK2018.pub SHA256 1847f802a331b202eae02729e828d6b59ef4c6129020660ecd6865b67ec4dfb5 AUDREYT2018.pub SHA256 7de2bf0898f4a1e79d92f9e8ae68e7578eeaaff74211cddc0dfdc7996887cdc1 AUTHORS SHA256 df74c562710f1d449c320a68869eadf74387156c23bbdf95bb19330f27e053fd Changes SHA256 c0767212c05209c84a1cbd804dc3fb9a05b8ee4ed9770d11bd029348dab032c9 MANIFEST SHA256 093c47e35166ca8f4d6cb4a1d51b436809a4fca4bdb43221bd8fb67adac2e425 MANIFEST.SKIP SHA256 876a6dba8591f06f2ee63b40900d8ce694d09066ecab03d16f3178b5a41f2d3b META.yml SHA256 506100751f91446bce973090403c88aa81762a4880cc57797a10ecbcfb0e22ff Makefile.PL SHA256 c9b4cc9f924857b93a081066bdc7f120e537469c1b605e19c1f07296ac07cfdd NIKLASHOLM2018.pub SHA256 7c368bf650e83fc80cf9a851565d77a5cd71f243ef8c277a60adfa12253aaef3 PAUSE2019.pub SHA256 7cb2f8aba39724e74d4f4018cee110123dfcce3085b619ca5b163fb7ca3d7219 README SHA256 8cd77b6a6f370ecdec102298273d50094c515a5f23c5b02b3a31beaa6e799468 inc/Module/Install.pm SHA256 cfb98bad08ee4472484697b171e43e750ac29e4759389b4d09f4c3a3ac661a91 inc/Module/Install/Base.pm SHA256 6d3cd1903eb6210b0cd001e5baaad2113fc536eede5de5f9c1419237036a27ec inc/Module/Install/Can.pm SHA256 d5bbe82c94efc00222d74923f4a1d62889c6673a7d44b0e12e8266c9ca336d2a inc/Module/Install/External.pm SHA256 bba66b641eb4d25a67df16bc8b1fd34a4ee9fbdab956081a27d242af69a0847c inc/Module/Install/Fetch.pm SHA256 317c01e9ee71e5c3fa61563d82a0c9e22958b68cafd2ce0a70b516f22d4829df inc/Module/Install/Makefile.pm SHA256 6eaa52282b49bbb2fc54b137be6ce4f9eda80619a0c14571f4718a37a8aba065 inc/Module/Install/Metadata.pm SHA256 a10f0f4ebb579bae28ec5a372c5b7bcdc07df89aa24c04b502e0d0442230f200 inc/Module/Install/Scripts.pm SHA256 9cf3940ab15fd196c7b147aea3ab3c18d9ec3fdb3eadb238dc50120185cf81e7 inc/Module/Install/Win32.pm SHA256 c6cee30b2053ca28654b3216340169ca97ff2b2bcbb5a1ef7e3b7e3cf593419b inc/Module/Install/WriteAll.pm SHA256 042842848ffe66dcf8e332caaa0e54db32b6e352dde7df67d18027973491d0a2 lib/Module/Signature.pm SHA256 51aa9c445c6f54c26fc37d5ec2e42535461eb3a78911ca2516dd1c97e7aa7185 script/cpansign SHA256 286fda83531d99b34e214b0058ba806a38bdb6317fc3c6ca2f7c5a9840f1c092 t/0-signature.t SHA256 9be1e82eed0cb08514d2e3654b1396a23e5dd89ca8a5e67788ac6492697a5ce3 t/1-basic.t SHA256 ae0a2706d9dbe8cb3d0c3b948af76c42a9e6138bc21a45a5c82e655a412daf8a t/2-cygwin.t SHA256 abdaa7cf0869bf6a08c0c80da3176145243d6989b9522ecff8881a939cba5530 t/3-verify.t SHA256 2b17f99fccb7172b580ecde8839860f5db05292ea25391d9ea60839b45d5ac9a t/wrap.pl SHA256 c40279bceca4cbcf2df60cc3b99c7107dac31f7b779277e563320bc5bb579d4d t/wrapped-tests.bin -----BEGIN PGP SIGNATURE----- iQGzBAEBCAAdFiEE8/4umVyeYRTFU5r09ePPSwnTf6gFAluGWm8ACgkQ9ePPSwnT f6i4AAv8C48COhnY4SxI5LYAUDbdTrbPZ2HrJvl8sqfUCWnUgcO2+MwJro5vQ+7p vmJLM8uSOs0dE/g3oe25+SxeDgNCzomaqDC8wt/OI7t/IDehWUsWSjFelwzwce+u 2w1HYsW8/maTl8c49R+VFw5qRzbrTvQxTB48bXNd6jLfoLdnMM/+7us83nDUHU1h PUO8pwcfYykIR0zTfAx33yoWIh7q8h5wuRdE3OFjKIG4SMAxb7Y+yzjcHlYOZuU5 vpjptg95kYYhrTNN6z3taifPn15ZBbhxfkaYCoI6fVAekU8avTeLt88jbZP8npyt 2YZTfePeIQw4y+w8LcBijQKIpvxOEGdBJy6mhulMhjGBOP4eay3/qruQ+GaV3/3j bu5tig944U/VbfBiGOL5W6KkNgdwZXD64P2AUVugwh+1fufd831eL6nmgoBP7b0h 6IiFmu45WF36f+t2GZdeUUK1gTy6JuhBRjxSgUxO8vctC+ddFAJWGxcVen27ssNU zD/zafrl =0leJ -----END PGP SIGNATURE----- Module-Signature-0.83/AUTHORS000644 000765 000024 00000001532 13341455030 016517 0ustar00audreytstaff000000 000000 Here is a list of people and their CPAN id, extracted from the ChangeLog file and the mailing list archives. These people have either submitted patches or suggestions, or their bug reports or comments have inspired the appropriate patches. Corrections, additions, deletions welcome: Adam J. Foxson (FOX) Adam J. Kennedy (ADAMK) Alan Burlison (ABURLISON) Arthur Bergman (ABERGMAN) Andreas Koenig (ANDK) Benjamin Goldberg (GOLDBB) Blair Zajac (BZAJAC) Christian Loos (CLOOS) Dave Rolsky (DROLSKY) Iain Truskett (SPOON) Jarkko Hietaniemi (JHI) Jos Boumans (KANE) John Lightsey (LIGHTSEY) Mark Shelor Matt Southall Michael G Schwern (MSCHWERN) Niklas Holm Paul Howarth Scott R. Godin Soren A Steve Hay (SHAY) Tels (TELS) Walt Mankowski William Wentworth-Sheilds Module-Signature-0.83/Changes000644 000765 000024 00000031667 13341455117 016764 0ustar00audreytstaff000000 000000 [Changes for 0.83 - Wed Aug 29 17:33:12 JST 2018] * Update META.yml. [Changes for 0.82 - Sun Aug 26 23:00:04 CST 2018] * Fix CRLF handling on Win32. (@niklasholm) * Default to SHA256 on new hashes as SHA1 is deprecated. (@niklasholm) [Changes for 0.79 - Mon May 18 23:02:11 CST 2015] * Restore "cpansign --skip" functionality. Contributed by: CLOOS [Changes for 0.78 - Thu Apr 9 16:58:27 CST 2015] * Fix verify() use from cpanm and CPAN.pm. Contributed by: ANDK [Changes for 0.77 - Wed Apr 8 19:36:50 CST 2015] * Include the latest public keys of PAUSE, ANDK and AUDREYT. * Clarify scripts/cpansign copyright to CC0. Reported by: @pghmcfc [Changes for 0.76 - Wed Apr 8 18:05:48 CST 2015] * Fix signature tests by defaulting to verify(skip=>1) when $ENV{TEST_SIGNATURE} is true. Reported by: @pghmcfc [Changes for 0.75 - Tue Apr 7 04:56:09 CST 2015] Two more issues reported by John Lightsey: * Update ChangeLog. * More protection of @INC from relative paths. Fix various issues reported by John Lightsey: [Changes for 0.74 - Tue Apr 7 02:39:14 CST 2015] Fix various issues reported by John Lightsey: * Fix GPG signature parsing logic. * MANIFEST.SKIP is no longer consulted unless --skip is given. * Properly use open() modes to avoid injection attacks. [Changes for 0.73 - Wed Jun 5 23:44:57 CST 2013] * Properly redo the previous fix using File::Spec->file_name_is_absolute. [Changes for 0.72 - Wed Jun 5 23:19:02 CST 2013] * Only allow loading Digest::* from absolute paths in @INC, by ensuring they begin with \ or / characters. Contributed by: Florian Weimer (CVE-2013-2145) [Changes for 0.71 - Tue Jun 4 18:24:10 CST 2013] * Constrain the user-specified digest name to /^\w+\d+$/. * Avoid loading Digest::* from relative paths in @INC. Contributed by: Florian Weimer (CVE-2013-2145) [Changes for 0.70 - Thu Nov 29 01:45:54 CST 2012] * Don't check gpg version if gpg does not exist. This avoids unnecessary warnings during installation when gpg executable is not installed. Contributed by: Kenichi Ishigaki [Changes for 0.69 - Fri Nov 2 23:04:19 CST 2012] * Support for gpg under these alternate names: gpg gpg2 gnupg gnupg2 Contributed by: Michael Schwern [Changes for 0.68 - Fri, 13 May 2011 11:51:50 +0200] * Fix breakage introduced by 0.67 (Andreas König). [Changes for 0.67 - Sun, 17 Apr 2011 16:29:23 +0200] * Better handling of \r (Andreas König, Zefram) (Closes RT#46339). [Changes for 0.66 - Fri, 6 Sep 2010 22:51:37 +0200] * Fix incompatibility with EU::Manifest 1.54 to 1.57 (Paul Howarth) (Closes RT#61124). [Changes for 0.65 - Fri, 3 Sep 2010 21:38:02 +0200] * Skip MYMETA (Alexandr Ciornii) [Changes for 0.64 - Sun, 9 May 2010 00:50:11 +0200] * Avoid creating gnupg configuration files for the user invoking Makefile.PL (Closes RT#41978). * Correctly detect the version of gnupg on cygwin and add tests for it (Paul Fenwick) (Closes RT#39258). [Changes for 0.63 - Sun, 28 Mar 2010 04:46:27 +0100] * Fix diagnostic message from Makefile.PL when the user dosn't have gnupg or Crypt::OpenPGP (miyagawa). [Changes for 0.62 - Tue, 23 Mar 2010 22:17:39 +0100] * Change the default keyserver from the outdated pgp.mit.edu to pool.sks-keyservers.net. [Changes for 0.61 - 2009年11月19日 周四 00時56分41秒 CST] * Added "=encoding utf8" to POD to fix author name display. No functional changes. [Changes for 0.60 - 2009年11月16日 周一 22時48分54秒 CST] * LICENSING CHANGE: This compilation and all individual files in it are now under the nullary CC0 1.0 Universal terms: To the extent possible under law, 唐鳳 has waived all copyright and related or neighboring rights to Module-Signature. * Updated Module::Install to 0.91, prompted by Florian Ragwitz. [Changes for 0.55 - 2006-07-29] * ANDK submitted a patch to fix versioning problem when the user elects to install Crypt::OpenPGP. * Major refactoring of the Makefile.PL to ease the installation process. [Changes for 0.54 - 2006-05-12] * Fixed a long-standing bug where differing end-of-line conventions could cause bogus comparisons in signature checks. * Fixed another long-standing bug where CRLF text files were hashed into different digests under Unix and Dosish platforms. Now it's consistently hashed as if it's been normalized to LF. * Optional dependencies are no longer installed-by-default. [Changes for 0.53 - 2006-01-31] * The explicit call to "readline(D)" didn't compile on earlier perls which demanded either "readline(*D)" or "" -- I elected the latter form. Reported by: Matthew Persic * Update my author key to reflect revoked past uids. [Changes for 0.52 - 2006-01-19] * POD and source code cleanup; no functional changes. * Updated my author key to reflect my new name and identity. * Upgrade to the latest Module::Install to fix Cygwin installation problems. Reported by: Lyle Ziegelmiller [Changes for 0.51 - 2006-01-02] * Even more flexible CRLF handling for SIGNATURE files, Contributed by: Andreas Koenig. [Changes for 0.50 - 2005-08-21] * Add support for to SHA-256, requested by Mark Shelor in light of the recent SHA1 attacks. SHA1 is still the default, but you can now override this by settings MODULE_SIGNATURE_CIPHER environment variable to SHA256. [Changes for 0.45 - 2005-08-09] * Andreas Koenig ported out that "Import GPG keys?" was asked far too many times during autoinstall. [Changes for 0.44 - 2004-12-16] * Add "pmfiles.dat" to legacy manifest_skip routine to accomodate early Win32 hacks. Reported by Steve Hay via Michael Schwern. [Changes for 0.43 - 2004-12-16] * Updated t/0-signature.t to be more friendly with Test::More; contributed by Michael Schwern. * Add $Timeout (default 3 seconds) to control the timeout for probing connections to the key server. * Take account of the .ts files produced by newer MakeMakers in the suggested MANIFEST.SKIP list. [Changes for 0.42 - 2004-11-20] * Move under SVK version control management; ditch keyword tags. * Michael Schwern pointed out that during development, the "signature.t" file would keep failing. * Documented how to generate SIGNATURE files as part of "make dist", for Module::Install, ExtUtils::MakeMaker and Module::Build users . [Changes for 0.41 - 2004-07-04] * Mark Shelor points out that support for Digest::SHA was broken. [Changes for 0.40 - 2004-07-01] * Dave Rolsky points out that GPG version detection always returns '1'. (bug #6810) [Changes for 0.39 - 2004-06-17] * Supports Digest::SHA (now preferred) and Digest::SHA1::PurePerl, in addition to the original Digest::SHA1 backend. * We now asks before importing the default keys, also suggested by Tels. * Unknown cipher is made fatal, thanks to suggestion by Tels. * Apply Dave Rolsky's patch to verify that author's pubkey is available on a keyserver. may need more work. [Changes for 0.38 - 2004-01-01] * Update to the newest Module::Install. * Not using inc/SCRIPT/ anymore. * Add "#defaults" and "^blibdirs$" to recommended MANIFEST.SKIP to pacify newer ExtUtil::MakeMaker. * Starting to think about how to make "disttest" + "dist" not signing twice. [Changes for 0.37 - 2003-11-06] * Move bin/cpansign to script/cpansign. * Make cpansign exit upon failure. [Changes for 0.36 - 2003-10-28] * Use sign(1) to autosign ourselves. * Soren A pointed out that hkp:// didn't work with GnuPG. [Changes for 0.25 - 2003-08-28] * Now ships with my pubkey and PAUSE's. * Interactive Makefile.PL, suggested by Jarkko. [Changes for 0.34 - 2003-08-18] * Don't ask user to install Crypt::OpenPGP if she does not have a C compiler anyway. * ExtUtils::Manifest 1.38 does not support good enough skips even for Makefile.PL, sigh. [Changes for 0.33 - 2003-08-12] * William Wentworth-Sheilds points out that META.yml is dynamic, which makes SIGNATURE incorrect for people without either "diff" or "gpg". Fixed. [Changes for 0.32 - 2003-08-11] * Take Schwern's patch to only set _maniskip for legacy EU::Manifest. * Remove ::TieOut since we are not using it anymore. * Reduce noise for untrusted signatures to two lines. [Changes for 0.31 - 2003-08-10] * Scott R. Godin pointed out 0.30 had bad signature. whoops. [Changes for 0.30 - 2003-08-10] * Add JHI to authors. * Patch from Michael Schwern: only let GnuPG display anything if we're handling suspicious keys, not when you have added the signer into the trustdb. * New global config variable, $Verbose. * MODULE_SIGNATURE_VERBOSE, MODULE_SIGNATURE_KEYSERVER and MODULE_SIGNATURE_KEYSERVERPORT env variables are now respected. * Only supply _default_skip if our ExtUtils::MakeMaker is too old. [Changes for 0.29 - 2003-08-08] * Now fails gracefully all the time, including when incapable of connecting to the keyserver. * Also, SHA1 sum is still checked even if the user does not have GnuPg/Crypt::OpenPGP. * Hence, Crypt::OpenPGP is no longer a mandatory prerequisite even for users without gnupg. * "0E0" is now made into a constant, CANNOT_VERIFY. * Do not die() when we absolutely can't verify. * BZAJAC pointed out that we should add .svn to _default_skip. [Changes for 0.28 - 2003-07-29] * Remove Digest.pm dependency. * Don't test for "diff -version" anymore -- not all diffs have -version, thanks again to Alan Burlison. [Changes for 0.27 - 2003-07-28] * More punctuation cleanups in POD. * Michael Schwern pointed out that successful tests shouldn't be noisy. [Changes for 0.26 - 2003-07-17] * New internal function, _verify(), that takes $sigfile as its first argument, eliminating the "local $Module::Signautre::SIGNATURE" approach. * sign() now also takes a skip=> parameter (defaults to true) about whether to respect MANIFEST.SKIP. This needs to be set to 0 to sign blib/ archives. * Officially supporting signing and verification of PAR files, using PAR::Dist. * Let's ignore warnings when performing on exe files [Changes for 0.24 - 2003-07-08] * Preliminary PAR support. [Changes for 0.23 - 2003-07-07] * Ken Williams noted that M::B now works on 5.005. [Changes for 0.22 - 2003-05-15] * Move Signature.pm to lib/Module/Signature.pm. * Switch to the Module::Install framework. * Updates TODO to reflect correspondence with andk. * Matt Southall mentioned that, if somebody has never run gpg before, we need to initialize it once before running test. * Warn about potential 'Makefile' exploit as pointed out by Tels. Document pending. * Bugfix for incorrect 'MALFORMED' response to signatures made from older versions of GnuPG, as reported by Tels. [Changes for 0.18 - 2002-11-04] * Binary files handling on win32 was broken. (Jos Boumans) [Changes for 0.17 - 2002-10-30] * Resolve bug report by Iain Truskett: cpansign -s should not complain manifest mismatch if SIGNATURE is lacking. * Also, bail out gracefully when signing fails, instead of crippling the old SIGNATURE. * MANIFEST.SKIP doc lifted from Test::Signature. * Minor POD fixups. [Changes for 0.16 - 2002-10-28] * Adds AUTHORS file. * Added connectivity probing for testing. * Print a helpful success message after signing. * Don't cripple old SIGNATURE file. * Suggestion from Tels: skip the ambiguous 'optional' probing for Crypt::OpenPGP if gnupg is there. [Changes for 0.15 - 2002-10-17] * Fixed compatibility with old MakeMaker versions, thanks to chromatic. * Fixed "no /dev/tty" bug during smoke testing, as reported by the excellent CPAN Smokers. [Changes for 0.12 - 2002-10-12] * Supports automatic key retrieval, implemented in Crypt::OpenPGP. [Changes for 1.02 - 2002-10-12] * Fixed the default cipher from MD5 back to SHA1. [Changes for 0.10 - 2002-10-12] * Fixed a problem that prevents earlier versions of GnuPG from fetching public keys via --keyserver-option=auto-key-retrieve. [Changes for 0.09 - 2002-10-12] * Documented the package variables so they become part of APIs. * Alternative (non-SHA1) ciphers in SIGNATUREs are now recognized. * Added a new return value, CIPHER_UNKNOWN. * Mention Test::Signature. * Ditch Test::More from the sample script. * Label tests. [Changes for 0.09 - 2002-10-11] * We're no longer alpha status; reflect in README. * Incoporated a suggestion from Tels: undefining the $KeyServer package variable should disable automatic key-fetching. * Include the tests from Iain. * Tels: disable KeyServer fetching if it's undef'ed. [Changes for 0.07 - 2002-10-11] * Fixed our own signatures. [Changes for 0.06 - 2002-10-10] * Use many-arg system() instead of the one-arg form to prevent security breach. * Iain Truskett: fixed export bug so SIGNATURE_OK is properly exported. * Introduced global $KeyServer variable, default at 'pgp.mit.edu'. * Suggestion from Aurthur Bergman: cpansign without arg should DWIM. * Set a default keyserver for cpansign -v. * Use by-name params for functions. sign(override => $bool). [Changes for 0.05 - 2002-08-14] * Typo correction and safety checking. [Changes for 0.04 - 2002-08-14] * Added boilerplate text before SIGNATURE to explain what's it about. * Crypt::OpenPGP signature didn't work. * Add keyword expansion tags. Module-Signature-0.83/MANIFEST000644 000765 000024 00000001071 13340541631 016600 0ustar00audreytstaff000000 000000 ANDK2018.pub AUDREYT2018.pub AUTHORS Changes inc/Module/Install.pm inc/Module/Install/Base.pm inc/Module/Install/Can.pm inc/Module/Install/External.pm inc/Module/Install/Fetch.pm inc/Module/Install/Makefile.pm inc/Module/Install/Metadata.pm inc/Module/Install/Scripts.pm inc/Module/Install/Win32.pm inc/Module/Install/WriteAll.pm lib/Module/Signature.pm Makefile.PL MANIFEST This list of files MANIFEST.SKIP META.yml NIKLASHOLM2018.pub PAUSE2019.pub README script/cpansign SIGNATURE t/0-signature.t t/1-basic.t t/2-cygwin.t t/3-verify.t t/wrap.pl t/wrapped-tests.bin Module-Signature-0.83/t/000755 000765 000024 00000000000 13341455163 015720 5ustar00audreytstaff000000 000000 Module-Signature-0.83/README000644 000765 000024 00000020766 13340540137 016343 0ustar00audreytstaff000000 000000 NAME Module::Signature - Module signature file manipulation SYNOPSIS As a shell command: % cpansign # verify an existing SIGNATURE, or # make a new one if none exists % cpansign sign # make signature; overwrites existing one % cpansign -s # same thing % cpansign verify # verify a signature % cpansign -v # same thing % cpansign -v --skip # ignore files in MANIFEST.SKIP % cpansign help # display this documentation % cpansign -h # same thing In programs: use Module::Signature qw(sign verify SIGNATURE_OK); sign(); sign(overwrite => 1); # overwrites without asking # see the CONSTANTS section below (verify() == SIGNATURE_OK) or die "failed!"; DESCRIPTION Module::Signature adds cryptographic authentications to CPAN distributions, via the special SIGNATURE file. If you are a module user, all you have to do is to remember to run "cpansign -v" (or just "cpansign") before issuing "perl Makefile.PL" or "perl Build.PL"; that will ensure the distribution has not been tampered with. Module authors can easily add the SIGNATURE file to the distribution tarball; see "NOTES" below for how to do it as part of "make dist". If you *really* want to sign a distribution manually, simply add "SIGNATURE" to MANIFEST, then type "cpansign -s" immediately before "make dist". Be sure to delete the SIGNATURE file afterwards. Please also see "NOTES" about MANIFEST.SKIP issues, especially if you are using Module::Build or writing your own MANIFEST.SKIP. VARIABLES No package variables are exported by default. $Verbose If true, Module::Signature will give information during processing including gpg output. If false, Module::Signature will be as quiet as possible as long as everything is working ok. Defaults to false. $SIGNATURE The filename for a distribution's signature file. Defaults to "SIGNATURE". $KeyServer The OpenPGP key server for fetching the author's public key (currently only implemented on "gpg", not "Crypt::OpenPGP"). May be set to a false value to prevent this module from fetching public keys. $KeyServerPort The OpenPGP key server port, defaults to 11371. $Timeout Maximum time to wait to try to establish a link to the key server. Defaults to 3. $AutoKeyRetrieve Whether to automatically fetch unknown keys from the key server. Defaults to 1. $Cipher The default cipher used by the "Digest" module to make signature files. Defaults to "SHA1", but may be changed to other ciphers via the "MODULE_SIGNATURE_CIPHER" environment variable if the SHA1 cipher is undesirable for the user. The cipher specified in the SIGNATURE file's first entry will be used to validate its integrity. For "SHA1", the user needs to have any one of these four modules installed: Digest::SHA, Digest::SHA1, Digest::SHA::PurePerl, or (currently nonexistent) Digest::SHA1::PurePerl. $Preamble The explanatory text written to newly generated SIGNATURE files before the actual entries. ENVIRONMENT Module::Signature honors these environment variables: MODULE_SIGNATURE_CIPHER Works like $Cipher. MODULE_SIGNATURE_VERBOSE Works like $Verbose. MODULE_SIGNATURE_KEYSERVER Works like $KeyServer. MODULE_SIGNATURE_KEYSERVERPORT Works like $KeyServerPort. MODULE_SIGNATURE_TIMEOUT Works like $Timeout. CONSTANTS These constants are not exported by default. CANNOT_VERIFY (0E0) Cannot verify the OpenPGP signature, maybe due to the lack of a network connection to the key server, or if neither gnupg nor Crypt::OpenPGP exists on the system. SIGNATURE_OK (0) Signature successfully verified. SIGNATURE_MISSING (-1) The SIGNATURE file does not exist. SIGNATURE_MALFORMED (-2) The signature file does not contains a valid OpenPGP message. SIGNATURE_BAD (-3) Invalid signature detected -- it might have been tampered with. SIGNATURE_MISMATCH (-4) The signature is valid, but files in the distribution have changed since its creation. MANIFEST_MISMATCH (-5) There are extra files in the current directory not specified by the MANIFEST file. CIPHER_UNKNOWN (-6) The cipher used by the signature file is not recognized by the "Digest" and "Digest::*" modules. NOTES Signing your module as part of "make dist" The easiest way is to use Module::Install: sign; # put this before "WriteAll" WriteAll; For ExtUtils::MakeMaker (version 6.18 or above), you may do this: WriteMakefile( (MM->can('signature_target') ? (SIGN => 1) : ()), # ... original arguments ... ); Users of Module::Build may do this: Module::Build->new( (sign => 1), # ... original arguments ... )->create_build_script; MANIFEST.SKIP Considerations (The following section is lifted from Iain Truskett's Test::Signature module, under the Perl license. Thanks, Iain!) It is imperative that your MANIFEST and MANIFEST.SKIP files be accurate and complete. If you are using "ExtUtils::MakeMaker" and you do not have a MANIFEST.SKIP file, then don't worry about the rest of this. If you do have a MANIFEST.SKIP file, or you use "Module::Build", you must read this. Since the test is run at "make test" time, the distribution has been made. Thus your MANIFEST.SKIP file should have the entries listed below. If you're using "ExtUtils::MakeMaker", you should have, at least: #defaults ^Makefile$ ^blib/ ^pm_to_blib ^blibdirs These entries are part of the default set provided by "ExtUtils::Manifest", which is ignored if you provide your own MANIFEST.SKIP file. If you are using "Module::Build", you should have two extra entries: ^Build$ ^_build/ If you don't have the correct entries, "Module::Signature" will complain that you have: ==> MISMATCHED content between MANIFEST and distribution files! <== You should note this during normal development testing anyway. Testing signatures You may add this code as t/0-signature.t in your distribution tree: #!/usr/bin/perl use strict; print "1..1\n"; if (!$ENV{TEST_SIGNATURE}) { print "ok 1 # skip Set the environment variable", " TEST_SIGNATURE to enable this test\n"; } elsif (!-s 'SIGNATURE') { print "ok 1 # skip No signature file found\n"; } elsif (!eval { require Module::Signature; 1 }) { print "ok 1 # skip ", "Next time around, consider install Module::Signature, ", "so you can verify the integrity of this distribution.\n"; } elsif (!eval { require Socket; Socket::inet_aton('pool.sks-keyservers.net') }) { print "ok 1 # skip ", "Cannot connect to the keyserver\n"; } else { (Module::Signature::verify() == Module::Signature::SIGNATURE_OK()) or print "not "; print "ok 1 # Valid signature\n"; } __END__ If you are already using Test::More for testing, a more straightforward version of t/0-signature.t can be found in the Module::Signature distribution. Note that "MANIFEST.SKIP" is considered by default only when $ENV{TEST_SIGNATURE} is set to a true value. Also, if you prefer a more full-fledged testing package, and are willing to inflict the dependency of Module::Build on your users, Iain Truskett's Test::Signature might be a better choice. SEE ALSO Digest, Digest::SHA, Digest::SHA1, Digest::SHA::PurePerl ExtUtils::Manifest, Crypt::OpenPGP, Test::Signature Module::Install, ExtUtils::MakeMaker, Module::Build Dist::Zilla::Plugin::Signature AUTHORS Audrey Tang CC0 1.0 Universal To the extent possible under law, 唐鳳 has waived all copyright and related or neighboring rights to Module-Signature. This work is published from Taiwan. Module-Signature-0.83/script/000755 000765 000024 00000000000 13341455163 016761 5ustar00audreytstaff000000 000000 Module-Signature-0.83/PAUSE2019.pub000644 000765 000024 00000046560 13340541003 017355 0ustar00audreytstaff000000 000000 -----BEGIN PGP PUBLIC KEY BLOCK----- Version: GnuPG v1 mQGiBD4+cJARBACxOByY0SJBBuJoFrH2hoqRFny423gY6V3jq1uTgGY/PPaxP+Sq r3RzxPct4vJcsoo48pwBsMHLrWfORq26zb6eKgmMq/CQo2gzaRbeRxCi3ke4KBmu aREi6RjaZSU94yABtDmspUBrpYV8zfZMv5ZIQlg9W1Tu66BFOUrrNeDpKwCgosCp 9dtNAMhHkzxs8UJH5i3Uzb0D/0VLoAE8sOfUXqjc38rxiHuGBFSNC70Ih4mzGUCJ MGT4z1X3K6uUawnXMoc8XqPaYnEgOzztMymydtr+urjUwcGnuXDSpV6nulE5irxh zlikSTJy/42QzTMcrdRynffmJo9PRgymMI8GgWaYG5g3zzGAhi5BA6G8JKfC93IV xiRPBACXJpLBYQljqJY9UDNJuq8nHhKiWHBXdZzrC3LM0FSF3PKuP/ugc+KBIKXm clNPNFKla/SRbH6dMHsGIy8wnGPI5AtTS0roNQrttv3/ghRT7+OKXrGmBxZ/KHVr v3PVgiRA5MDr1mIsovfuc9WQnFu2TkgnN/F3pDcrVVSi5b+rZLQzUEFVU0UgQmF0 Y2ggU2lnbmluZyBLZXkgMjAwOSA8cGF1c2VAcGF1c2UucGVybC5vcmc+iGYEExEC ACYFAkl43/ECGwMFCQ/OdIAGCwkIBwMCBBUCCAMEFgIDAQIeAQIXgAAKCRAyjahn RQ+J7IDEAJ40F0fyg6NTAZ2nWizs/C/RSPYPsgCfSqnVpaqF6k0H/5AabfdNbcS2 Wm6IRgQQEQIABgUCSXwU9wAKCRDsgDnwoxfBXQBsAJsEku5xBZsf7EYYkWeSEiXn p2kLtQCg0V2hlzJnDCFFqf/WsMqL2glkDjOIRgQQEQIABgUCS4xI1gAKCRA0rq6z PNGwzHiqAJ0dtAvhlqh/mH7rk1zV5d6MKUKBZQCg5lO06lB5gPX+RrxJrJ/2ThyQ auGIRgQREQIABgUCScuA1AAKCRA2zBWk41ll/N3WAJ9aV3ZzqMCiXbFrQwKLAtyr h6wI3wCfYKAvs67QENDfq4bvTHk0N61MA1eIRgQTEQIABgUCSpht5gAKCRDp1n4q 3kFyFnQ7AKCaTGJjbuTiGwPjxRSYLdWahh9q3gCfTYZNWq1+9I4I01veU166Nh7G 1KGIZgQTEQIAJgIbAwYLCQgHAwIEFQIIAwQWAgMBAh4BAheABQJNc/PEBQkTkilo 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 mU0An2syqsT0hEnGUP8ppoIxu4VxqlTo =NbtN -----END PGP PUBLIC KEY BLOCK-----Module-Signature-0.83/NIKLASHOLM2018.pub000644 000765 000024 00000003224 13340541572 020141 0ustar00audreytstaff000000 000000 -----BEGIN PGP PUBLIC KEY BLOCK----- mQINBFuAAosBEADZjOeKBGwxLEoPGLyDBThkYbrCFISXoWEyej2VPek6LD8zEu3V qLFW5qEKfPpH25/jhufrVFT+fXoUzAlvPbJF18aE2l5YasCk0YGo8CZGr9eeDU7T Ov8eMQx2aLzK1DVKCq71GzhuZ8JfR1CkmTLTcqYnEoeqDHJxdLp+ZgLzWu6wOACQ mNk2LaMdAg8NVnLVWVMmUp2EH0Be3REwfZa3xgQPRyjPRgUQknlokpB4jSlrx5F4 yMQLNHKS1N2IchNpp5EN9XMnH+dN8VkParBfiSX4ohtMfzLQXeT9wZquuu3Sx+AJ 802/aQmE3TrEBxhESLtqBzQ6kIiKEcwapgt7d13QuQSQlcP02JVcQmnmM66OFC5J LvfnNZkjb6TIM4pbbRC2/chX4OOJGef6sRfIJ2WU5WB4BO4O4rdGnOFSfyngzqzc uMdmVTEuQU+Th0RfZa5Fp8s0nrArHbmTbP/d0jAsK52lQnsSu3nTjpGtf8ZHj3xb TGbnUZe4dDbhm6LfFuLfSLUXdB83yU8DfCzGzof+QUJMbsO3mBLG/4h+u35XhkZS XJA9gv+eEeOw0qcOdEJRtXvocSFXG378I89LXrLNrXa5MYVHTwAk1KR8Evgwhzfz dNQ7N+Mkvrf3+DTk4Woauhqk6kWcJKXlF/24Eg3JkTSm4cPMq0jSiQP7gQARAQAB tDhOaWtsYXMgSG9sbSA8NTcyNTExK25pa2xhc2hvbG1AdXNlcnMubm9yZXBseS5n aXRodWIuY29tPokCVAQTAQgAPhYhBDJnhWhOat9axSO2c8d8AoQDaQYkBQJbgAKL AhsDBQkFo5qABQsJCAcCBhUKCQgLAgQWAgMBAh4BAheAAAoJEMd8AoQDaQYkKHAP /0vTBT5BGTblOGgrMGCTGS/rh6q5Y2Yt5vU0iCU4sgw0iI13ENJ3htJ+P/PWk2Js Yha4TMUYNJDy3Wsc8RC5+L8bwfb8kp4CjiuXdbEnFEWAFO+CrEar7ew3Eba6LBXT Cti/AaFkNB9+7Mrvreq8/mY8QEPoIDJx0V71C2I0tv/P3sJjGI6NnYk14M7/w4eg JokTmg2KRcO25KU3jDxMjikDmTeE3XpMBnJhgqE4oTF+LHGdHLFlPZdiS1Xq5BAz pBNdJAW9QLdh17HyfcblWR/KEcN5izS1xFGDrgfOeKJy36XVfXGGTcK8dpkZnlnY lCyhN1S7YUxNpcT6xm5y9zHSPGmTTM+4Tuhc2fOEw4SJr51uML/7aoWSAkpryOWV nNQDbrLqa+gKe27/vdwJrlRj7QzCKHGlUh/Xw+43c8g1ZpS65MCcnXEAhhBcTkc8 xZ20dEjJKsfw4cEpZ4AEQi6+AZl6pbMQU+sLK49Rn4SoJYcpN9em3S5FO2JEP3kn hE4oN0M5lllu/Hr3WDPM2iNrDs0x93vyz9vf0TRjLhv7yvnUgZRzgd3TExRigCOD Y4SngahcU/LdJEMwHgva6rrTwiGXyK9dpLIgzzFKInpNXGf03Y+bHUSdH+bf/TGm rgw7OPAPbCnotvKRQ5rouQWQmKIbzRhraQksZzHtFVj2 =CM0j -----END PGP PUBLIC KEY BLOCK----- Module-Signature-0.83/MANIFEST.SKIP000644 000765 000024 00000002126 13340540137 017347 0ustar00audreytstaff000000 000000 #!start included /home/src/perl/repoperls/installed-perls/perl/v5.14.0-RC2/1df5/lib/5.14.0/ExtUtils/MANIFEST.SKIP # Avoid version control files. \bRCS\b \bCVS\b \bSCCS\b ,v$ \B\.svn\b \B\.git\b \B\.gitignore\b \b_darcs\b \B\.cvsignore$ # Avoid VMS specific MakeMaker generated files \bDescrip.MMS$ \bDESCRIP.MMS$ \bdescrip.mms$ # Avoid Makemaker generated and utility files. \bMANIFEST\.bak \bMakefile$ \bblib/ \bMakeMaker-\d \bpm_to_blib\.ts$ \bpm_to_blib$ \bblibdirs\.ts$ # 6.18 through 6.25 generated this # Avoid Module::Build generated and utility files. \bBuild$ \b_build/ \bBuild.bat$ \bBuild.COM$ \bBUILD.COM$ \bbuild.com$ # Avoid temp and backup files. ~$ \.old$ \#$ \b\.# \.bak$ \.tmp$ \.# \.rej$ # Avoid OS-specific files/dirs # Mac OSX metadata \B\.DS_Store # Mac OSX SMB mount metadata files \B\._ # Avoid Devel::Cover and Devel::CoverX::Covered files. \bcover_db\b \bcovered\b # Avoid MYMETA files ^MYMETA\. #!end included /home/src/perl/repoperls/installed-perls/perl/v5.14.0-RC2/1df5/lib/5.14.0/ExtUtils/MANIFEST.SKIP \.tar\.gz$ t/test-dat.*/(MANIFEST|README|SIGNATURE|42.gz)$ Module-Signature-0.83/META.yml000644 000765 000024 00000001166 13341455064 016732 0ustar00audreytstaff000000 000000 --- abstract: 'Module signature file manipulation' author: - 'Audrey Tang ' build_requires: ExtUtils::MakeMaker: 6.36 IPC::Run: 0 Test::More: 0 configure_requires: ExtUtils::MakeMaker: 6.36 distribution_type: module dynamic_config: 1 generated_by: 'Module::Install version 1.16' license: unrestricted meta-spec: url: http://module-build.sourceforge.net/META-spec-v1.4.html version: 1.4 name: Module-Signature no_index: directory: - inc - t requires: File::Temp: 0 IO::Socket::INET: 0 perl: '5.005' resources: repository: http://github.com/audreyt/module-signature version: '0.83' Module-Signature-0.83/AUDREYT2018.pub000644 000765 000024 00000054670 13340540516 017625 0ustar00audreytstaff000000 000000 -----BEGIN PGP PUBLIC KEY BLOCK----- mQGiBDrSde4RBACrX/gOzX8CCum6b5nfvbjeEgjEKAE+piiB/k8U9Y89juUwMUNf rHvYWI/j3Clk8gnNUnrjO5/mUAkDBB39X5VRhX1nHUoH0aVF8CuU3HbPyV26NgU1 5E8llFMqptmRbL0YgoDYke00RHpHWw0eBMDNLjvx7MTo9EVx8TD6SssnGwCgv0CK UN5wTse3hoWzk2Pcu9c1rD8D/iX1/WbOmEp+f9g89OUKdF2seRWF+FxRY/zkdPHv 4EIPnnwmcj1JvVsLkLNkWJAbYw8/8I/VYAZuzRb2dJvR8FUKtUojwBI7vxk1H8VE F+WQYvKFSk5E3FwVAvCCYHiJrvtciHt1oexL4wYzPzjNlPudqj/QOhJu1tsOYwO6 bf3KA/0cluS8SWHMSsVxhj3FXG+m7iiCqQ3pZABQ8utsq3eRtVYmwQOfIeT4Caaj 9sS7mVj2TSQZiQOBeRw77BQ40rUVf9dblGpWGwPp9PIroksBIDZ/TeMMKkkdiryF OGGJILRgVIMSpiNs+SJ8y1ns8eyzPWjlckqgjnUMECL/B05FrbQlQXVkcmV5IFRh bmcgKENQQU4pIDxjcGFuQGF1ZHJleXQub3JnPohgBBMRAgAgBQJEUETMAhsDBgsJ CAcDAgQVAggDBBYCAwECHgECF4AACgkQtLPdNzw1AaDMegCfbFn0Q5yHOO/BK5sf ui+qPo3cIikAoL349ljwdZIAbMBtn/r4pXn8wSV4iEYEEBECAAYFAkfOGhUACgkQ i9gubzC5S1wAOACcCYu4G6gIVTXQ2YPOXS5qYRfRWv8An0jru7m38/1G+pHbi67G hSWv6tNviEYEEhECAAYFAkbfA5AACgkQOV9mt2VyAVE9uQCcDn3zhUXvhjW2uBRP 3CitB4VjfFsAnRaFV8XPkuwiM387tB1x3eb8cxUItC5BdWRyZXkgVGFuZyAoYXV0 cmlqdXMpIDxhdXRyaWp1c0BhdXRyaWp1cy5vcmc+iGAEExECACAFAkOX62cCGwMG CwkIBwMCBBUCCAMEFgIDAQIeAQIXgAAKCRC0s903PDUBoJMuAKCri2KiRc6QzxTP 7He9BM/fXEv62gCgpl5Zqm6YRGb5VRp4bplfAKAz3120K0F1ZHJleSBUYW5nIChh dXRyaWp1cykgPGF1dHJpanVzQGdtYWlsLmNvbT6IYAQTEQIAIAUCQ5frjQIbAwYL CQgHAwIEFQIIAwQWAgMBAh4BAheAAAoJELSz3Tc8NQGgn6oAoLFnS0iu0vXww7qd UFwVjjzEAGsWAJkBebabedFOwnEMldtleqBDe3nDtNHWbdZrARAAAQEAAAAAAAAA AAAAAAD/2P/gABBKRklGAAEBAQBIAEgAAP/hADRFeGlmAABNTQAqAAAACAACARIA AwAAAAEAAQAAh2kABAAAAAEAAAAmAAAAAAAAAAAAAP/tABxQaG90b3Nob3AgMy4w ADhCSU0EBAAAAAAAAP/iDfhJQ0NfUFJPRklMRQABAQAADehhcHBsAgAAAG1udHJS R0IgWFlaIAfVAAsACgAAADkAKGFjc3BBUFBMAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAD21gABAAAAANMtYXBwbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAADnJYWVoAAAEsAAAAFGdYWVoAAAFAAAAAFGJYWVoA AAFUAAAAFHd0cHQAAAFoAAAAFGNoYWQAAAF8AAAALHJUUkMAAAGoAAAADmdUUkMA AAG4AAAADmJUUkMAAAHIAAAADnZjZ3QAAAHYAAADEm5kaW4AAATsAAAGPmRlc2MA AAssAAAAZGRzY20AAAuQAAAB/m1tb2QAAA2QAAAAKGNwcnQAAA24AAAALVhZWiAA AAAAAABfzAAANsIAAAlZWFlaIAAAAAAAAHCmAACymwAAJvJYWVogAAAAAAAAJmQA ABa9AACi2lhZWiAAAAAAAADzUgABAAAAARbPc2YzMgAAAAAAAQxCAAAF3v//8yYA AAeSAAD9kf//+6L///2jAAAD3AAAwGxjdXJ2AAAAAAAAAAEBzQAAY3VydgAAAAAA AAABAc0AAGN1cnYAAAAAAAAAAQHNAAB2Y2d0AAAAAAAAAAAAAwEAAAEAAQMFBggJ CwwODxESFBYXGRocHR4gISMkJicoKissLi8wMjM0Njc4OTs8PT4/QUJDREVHSElK S01OT1BRUlRVVldYWVtcXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9 fn+AgYKDhIWGh4iIiYqLjI2Oj5CRkpOUlZaXmJiZmpucnZ6foKGio6OkpaanqKmq q6ytrq+vsLGys7S1tre4ubm6u7y9vr/AwcHCw8TFxsfIyMnKy8zNzs7P0NHS09PU 1dbX2NjZ2tvc3N3e3+Dg4eLj5OTl5ufn6Onq6+vs7e7u7/Dx8fLz8/T19vb3+Pj5 +vr7/Pz9/f7/AAMEBgcICQsMDQ8QERMUFRYYGRscHR8gISMkJSYoKSosLS4vMTIz NDU3ODk6Oz0+P0BBQ0RFRkdJSktMTU5PUFFSU1RVVldYWltcXV5fYGFiY2RlZmhp amtsbW5vcHFyc3R1dnd4eXp7fH1+f4CBgoOEhYaHiImKi4yNjo+QkZKTlJWWl5iZ mpucnZ6fn6ChoqOkpaanqKmqq6ytrq+vsLGys7S1tre4ubq6u7y9vr/AwcLDxMXG x8jJysvMzc7P0NHS09TU1dbX2Nna29zd3t/g4OHi4+Tk5ebn5+jp6err7Ozt7u/v 8PHy8vP09PX29vf4+Pn5+vr7/Pz9/f7+/wACAwQFBgcICQoLDA0ODg8QERITExQV FhcYGRoaGxwdHh8gISIiIyQlJicoKSorLC0uLzAxMjM0NTY3Nzg5Ojs8PT4/QEFC Q0RFRUZHSElKS0xNTk5PUFFSU1RUVVZXWFlZWltcXV1eX2BhYWJjZGVlZmdoaWpr bG1ub3BwcXJzdHV2d3h5ent8fH1+f4CBgYKDhIWGh4iIiYqLjI2Oj4+QkZKTlJWV lpeYmZqbnJ2en5+goaKjpKWmp6ipqqusra6vsLGys7S1tre4ubq7vL6/v8DBwsPE xcbHyMnKy8zNzs/Q0dLT1NXW19jZ2tvc3d7g4eLk5efp6+3w8/b5/f8AAG5kaW4A AAAAAAAGNgAAlRgAAFZfAABRYQAAiIYAACk0AAAWqAAAUA0AAFQ5AAJeuAACT1wA AXhRAAMBAAACAAAAAwAGAAsAEAAWACUALgA3AE0AWQBlAIEAkACfAMEA0gDlAQsB IAE1AUsBYQGQAagBwQH1Ag8CKwJkAp8CvQLcAxwDPQNfA6MDxgPqBDQEfwSmBM0F HQVwBZoFxAYbBnQGoQbPBy0HjAe9B+4IUgi4CSAJVAmKCfYKZArVC0cLgQu8DDIM qw0mDaIN4Q4hDqEPJA+pEC8QcxC4EUMRzxJdEu4TgBPKFBUUqxVDFd0WeRcXF2YX thhYGPwZoRpIGvEbnBxJHPgdqB5bHw8fxSB9ITch8iKwI28kMCTzJbcmfidGKBAo 3CmpKnkrSiwcLPEtxy6gL3kwVTEzMhIy8zPVNLk1oDaHN3E4XDlJOjg7KD0OPgM+ +z/0QO5B6kLoQ+hE6UXsRvFH90j/SglLFEwhTkBPUlBmUXtSklOrVMVV4Vb/WB5Z P1uFXKtd0l77YCVhUmJ/Y69k4GYSZ0dofGrtbChtZG6ib+FxInJlc6l073Y2eMl6 FXtjfLJ+A39VgKmB/4SvhgmHZYjCiiGLgYzjj6yREpJ7k+SVUJa8mZubDJx/nfSf aqJao9WlUabPqE6rUazUrlqv4LLytH62C7eZurq8Tb3hv3fCp8RBxd3JGcq6zFvN /9FK0vHUm9fx2Z/bTt6x4GTj0OWI50Hquex27/fxufVC9wj6mv4x//8AAAAAAAEA AwALABAAFgAlADcATQBZAGUAgQCfALAAwQDlAQsBIAE1AWEBkAHBAdoB9QIrAkcC ZAKfAtwC/AMcA18DowPGA+oENAR/BM0E9QUdBXAFxAXvBhsGdAbPBy0HXAeMB+4I Ugi4CSAJVAmKCfYKZArVC0cLgQu8DDIMqw0mDaIN4Q4hDqEPJA+pEC8QcxC4EUMR zxJdEu4TgBQVFKsVQxXdFnkXFxe2GFgY/BmhGfQaSBrxG5wcSRz4HageWx8PH8Ug fSE3IfIisCMPI28kMCTzJbcmfidGKBAo3CmpKnkrSiwcLPEtxy6gL3kwVTEzMhIy 8zPVNLk1oDaHN3E4XDlJOjg7KDwaPQ4+Az77P/RA7kHqQuhD6ETpRexG8Uf3SP9K CUsUTCFNME5AT1JQZlF7UpJTq1TFVeFW/1k/WmFbhVyrXdJe+2AlYVJif2OvZOBm EmdHaHxptGrtbWRuom/hcSJyZXOpdO92Nnd/eMl6FXyyfgN/VYCpgf+DVoSvhgmH ZYjCiiGLgYzjjkePrJESknuT5JVQlryYK5mbmwycf530n2qiWqPVpVGmz6hOqc6r UazUrlqv4LFpsvK2C7eZuSm6ur3hv3fBDsRBxd3JGcq6zFvPo9FK0vHWRdfx2Z/c /96x4hnj0OdB6Pzsdu/383z1QvjQ/GX//wAAAAEAAwALABYAJQA3AE0AZQCBAJ8A wQDlAQsBNQGQAcEB9QIrAmQC3AMcA18DowPqBDQEfwUdBXAFxAYbBnQGzwctB4wI Ugi4CSAJign2CmQK1QtHC7wMMgyrDSYNog4hDqEPJA+pEC8QuBFDEc8S7hOAFBUU qxVDFd0WeRcXF7YYWBj8GaEaSBrxHEkc+B2oHlsfDx/FIH0hNyHyI28kMCTzJbcm fidGKNwpqSp5K0osHC3HLqAveTBVMhIy8zPVNLk2hzdxOFw5STsoPBo9Dj4DPvs/ 9EDuQepC6EPoROlG8Uf3SP9KCUsUTCFNME5AT1JQZlF7UpJUxVXhVv9YHlk/W4Vc q13SXvtgJWFSYn9k4GYSZ0dofGm0au1sKG6ib+FxInJlc6l073d/eMl6FXtjfLJ+ A39VgKmB/4NWhgmHZYjCiiGLgYzjjkePrJESknuT5JVQlryYK5mbmwycf530n2qg 4aJao9WlUabPqE6pzqtRrNSuWq8dr+CxabR+tgu3mbkpurq8Tb3hv3fBDsKnxEHF 3cd7yRnKusxbzf/Po9FK0vHUm9ZF1/HZn9tO3P/eseBk4hnj0OWI5mTnQej86rnr l+x27jbvFu/38NfxufKa83z0X/VC9dn2cPcI96D4OPjQ+Wn6Afqa+zP7zPxl/Nj9 S/2+/jH/GP//AABkZXNjAAAAAAAAAApDb2xvciBMQ0QAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAbWx1YwAAAAAAAAAPAAAADGl0SVQAAAAUAAAAxGZyRlIA AABCAAAA2G5iTk8AAAASAAABGmVzRVMAAAASAAABLGZpRkkAAAAQAAABPnB0UFQA AAAYAAABTnpoVFcAAAAOAAABZmphSlAAAAAOAAABdG5sTkwAAAAWAAABgmRlREUA AAAQAAABmGtvS1IAAAAMAAABqGVuVVMAAAASAAABtHN2U0UAAAAQAAABxmRhREsA AAAcAAAB1npoQ04AAAAMAAAB8gBMAEMARAAgAGMAbwBsAG8AcgBpAMkAYwByAGEA bgAgAOAAIABjAHIAaQBzAHQAYQB1AHgAIABsAGkAcQB1AGkAZABlAHMAIABjAG8A dQBsAGUAdQByAEYAYQByAGcAZQAtAEwAQwBEAEwAQwBEACAAYwBvAGwAbwByAFYA 5AByAGkALQBMAEMARABMAEMARAAgAGMAbwBsAG8AcgBpAGQAb19pgnJtsmZ2mG95 OlZoMKsw6TD8ACAATABDAEQASwBsAGUAdQByAGUAbgAtAEwAQwBEAEYAYQByAGIA LQBMAEMARM7st+wAIABMAEMARABDAG8AbABvAHIAIABMAEMARABGAOQAcgBnAC0A TABDAEQATABDAEQALQBmAGEAcgB2AGUAcwBrAOYAcgBtX2mCcgAgAEwAQwBEAABt bW9kAAAAAAAABhAAAJxFAAAAAL5zkQAAAAAAAAAAAAAAAAAAAAAAdGV4dAAAAABD b3B5cmlnaHQgQXBwbGUgQ29tcHV0ZXIsIEluYy4sIDIwMDUAAAAA/9sAQwAKBwcI BwYKCAgICwoKCw4YEA4NDQ4dFRYRGCMfJSQiHyIhJis3LyYpNCkhIjBBMTQ5Oz4+ PiUuRElDPEg3PT47/9sAQwEKCwsODQ4cEBAcOygiKDs7Ozs7Ozs7Ozs7Ozs7Ozs7 Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7/8AAEQgAZAB4AwEiAAIR AQMRAf/EABwAAAAHAQEAAAAAAAAAAAAAAAACAwQFBgcBCP/EADMQAAIBAwMCBQIE BQUAAAAAAAECAwAEEQUhMRJBBhMiUXEyYRRCgZEHM6HR4RYjJFKx/8QAGgEAAwEB AQEAAAAAAAAAAAAAAgMEBQEABv/EACMRAAICAQQCAgMAAAAAAAAAAAABAhEDBBIh MSJBMnETQlH/2gAMAwEAAhEDEQA/AMaJYHfau9RGTkUWjD4/euBps71EnLVw9Odi d/aunpG1FGM14636DIN/8UrDbyzSdEYJpzYadJdtgbJ3OKtul6OkC7L8/ep8uZR6 KseC1bInTNBzIGffBqS1SwIt2GO2ADVjt7NUQkKBSdzZCbY1nvK5StlWxVSMunj8 qQg9qR78Zqxa5pJjlaRBt3qvFSpIzWnjmpxIcsHF36F7aYozA8OMEV2KV4JcK2CG 6kPsabAENnIBFOLkNIqTKPqHI96JpX9gxk6+jevAniZfEuhq0jAXdvhJ19z2b9as bLWCfw7119F8VwdbYguT5Moztudj+hrfyuRWTqMf458dFMJbkNGWhSzrQpAZ5aA+ cUMmj7Yx2op2Oxr6Az2qBgfrT7TdOe9mGx6e5pGytWupgo47mrnp9qlvGAFHFT5s u1UuynBivyY607TkijVFUACp2CCKMDqIFQ7XqwLuemmU+uSuemMZ7VmtORbaRbvx FqPSGrgEcjehs1W7O5fAaXv2qXt7tAORmgcaOpjLWbEMCcc1QtVsDbyEqPSeK0i6 kWVSOvJqC1TTVuYW23xsafhyODAnFSVMoLDFObcl7d0Izg80W6t2t5mjO2KU009N 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 CCNIHvBw =7t9K -----END PGP PUBLIC KEY BLOCK----- Module-Signature-0.83/lib/000755 000765 000024 00000000000 13341455163 016223 5ustar00audreytstaff000000 000000 Module-Signature-0.83/Makefile.PL000644 000765 000024 00000007457 13340541613 017437 0ustar00audreytstaff000000 000000 use strict; use inc::Module::Install 0.92; $|++; name 'Module-Signature'; license 'unrestricted'; all_from 'lib/Module/Signature.pm'; repository 'http://github.com/audreyt/module-signature'; install_script 'script/cpansign'; build_requires 'Test::More', 0, 'IPC::Run', 0; requires 'File::Temp'; # clean generated test files clean_files(q{"t/test-dat*"}); # On Win32 (excluding cygwin) we know that IO::Socket::INET, # which is needed for keyserver stuff, doesn't work. In fact # it potentially hangs forever. So bail out with a N/A on # Win32. if ( $^O eq 'MSWin32' and 0 ) { print "Keyserver behaviour is dangerous unreliable on Win32\n"; print "Not installing on this platform.\n"; exit(255); } else { requires 'IO::Socket::INET' => 0; } # We will need something to handle SHA1/256 unless ( can_use('Digest::SHA') or can_use('Digest::SHA::PurePerl') or (can_use('Digest::SHA1') and can_use('Digest::SHA256')) ) { # Nothing installed, we need to install a digest module if ( can_cc() ) { requires 'Digest::SHA'; } else { requires 'Digest::SHA::PurePerl'; } } # Is openpgp currently installed if ( can_use('Crypt::OpenPGP') ) { # Crypt::OpenPGP installed/available, continue on... } elsif ( my $gpg = locate_gpg() ) { # We SHOULD have gpg, double-check formally requires_external_bin $gpg; } elsif ( can_cc() and $ENV{AUTOMATED_TESTING} ) { # Dive headlong into a full Crypt::OpenPGP install. requires('Crypt::OpenPGP'); } else { # Ask the user what to do ask_user(); } unless ( can_run('diff') ) { # We know Text::Diff fails on Cygwin (for now) if ( $^O ne 'Cygwin' ) { requires 'Algorithm::Diff'; requires 'Text::Diff'; } } sign; WriteAll; ##################################################################### # Support Functions sub locate_gpg { print "Looking for GNU Privacy Guard (gpg), a cryptographic signature tool...\n"; my ($gpg, $gpg_path); for my $gpg_bin ('gpg', 'gpg2', 'gnupg', 'gnupg2') { $gpg_path = can_run($gpg_bin); next unless $gpg_path; next unless `$gpg_bin --version` =~ /GnuPG/; next unless defined `$gpg_bin --list-public-keys`; $gpg = $gpg_bin; last; } unless ( $gpg ) { print "gpg not found.\n"; return; } print "GnuPG found ($gpg_path).\n"; return 1 if grep { /^--installdeps/} @ARGV; if ( prompt("Import PAUSE and author keys to GnuPG?", 'y' ) =~ /^y/i) { print 'Importing... '; system $gpg, '--quiet', '--import', qw[ AUDREYT2018.pub ANDK2018.pub PAUSE2019.pub NIKLASHOLM2018.pub ]; print "done.\n"; } return $gpg; } sub ask_user { # Defined the prompt messages my $message1 = <<'END_MESSAGE'; Could not auto-detect a signature utility on your system. What do you want me to do? 1) Let you install GnuPG manually while I'm waiting for your answer; it is available at http://www.gnupg.org/download/ or may be available from your platforms packaging system (for Open Source platforms). END_MESSAGE my $message2 = <<'END_MESSAGE'; 2) Automatically install Crypt::OpenPGP and the 20 modules it requires from CPAN, which will give the same functionality as GnuPG. END_MESSAGE # Present the options print $message1; my $option3 = 2; if ( can_cc() ) { $option3 = 3; print $message2; } print <<"END_MESSAGE"; $option3) Forget this cryptographic signature stuff for now. END_MESSAGE my $choice; foreach ( 1 .. 3 ) { $choice = prompt("Your choice:", 3) || 3; last if $choice =~ /^[123]$/; print "Sorry, I cannot understand '$choice'.\n" } if ( $choice == 1 ) { # They claim to have installed gpg requires_external_bin 'gpg'; } elsif ( $choice == 2 and $option3 == 3 ) { # They want to install Crypt::OpenPGP requires('Crypt::OpenPGP'); } else { # Forget about it... print "Module::Signature is not wanted on this host.\n"; exit(0); } } __END__ Module-Signature-0.83/ANDK2018.pub000644 000765 000024 00000017070 13340540747 017224 0ustar00audreytstaff000000 000000 -----BEGIN PGP PUBLIC KEY BLOCK----- mQGiBDx+A1YRBADEsflgt39/oYoLumUOxOI2KKEte7SKfNc0SaI8Awpx8uxw4UR7 dxJN56mwvMk3GeJw0vn7gEbVzcm5W0AsBdUrHrYFEfngxrkEN0fBzaByQ9U4nOj7 EsoII9q8LllWphLfFYmewzrat/e0YDQA2WneiICUeIjBohX3+4yJjho5xwCg/zRU c/J+hJwuYyrNheC9+4gYGrkEALVWaB1CYqpaK5eUb911k+DjeOZQvqd+Mh7IiHDP RYPd23ct8NFQeav8HdEA+zJRVqWISh4tl64aNbHHR3RpnFJwwjgnfa5HRXZRVjQL UlQ/N5XV96TGywb58ZqYGouln7NZh+couss+5oWfI/vZDtx8Fo0vP1BqVn3amGoS 26J4A/wPXkV8DoiowGXv2bJztrzRjNDKNJ5E/9aOw0x9jad7s/VelwDUs11m5tRN o4ExojPqn7OVBdvys6X23+tn2W23C2wDDkWwHivX0mtiFe4vUiwNpCc+v7/Y4tVi Gi+DSuFMuVo0kcQCR5pd9MeeVi+fE5IED+U9geYLHWEHAq21QrQ8QW5kcmVhcyBK LiBLb2VuaWcgPGFuZHJlYXMua29lbmlnLmdtd29qcHJ3QGZyYW56LmFrLm1pbmQu ZGU+iGQEExECACQCGwMGCwkIBwMCAxUCAwMWAgECHgECF4AFAkWZG+IFCQ3MHwwA CgkQ7IA58KMXwV3TewCggnu5SLrOcp5goarr44bfLi7EH+cAoMWy1kKltU+dEsfl ACYkWRLnKmD9iGQEExECACQFAkHhSoMCGwMFCQlnmQgGCwkIBwMCAxUCAwMWAgEC HgECF4AACgkQ7IA58KMXwV3mFwCg6TM39gmLwBoaypkAHzMDrXYPwj4AoOE1jx6p 0xICUSYmfvoIwxV2x7j+iEYEEBECAAYFAkZLtdQACgkQi9gubzC5S1yMlQCeMh6T nqDx6MFrhI6SzNVIwZVB6dcAoJJIe54AGHWH3ntSCfAr+3Z3n85oiJwEEAECAAYF AkbwHHEACgkQLujFtvljWgVoLwQAztFvaN9eu0GmNTQy2hjZne2aH4GdzrkwUM7s RIPiobJ4pv9xCXxthbK9eVGBj7xqkM08VcYXDV0hih9dkpeOS23Dlhs4/WjEiYGV XCee62PWtYRYz3prtwG7CZVm7VzZ1Q9UQWEF/CbCb03dCGnZUCMWYwh73HOXSqNk D9A3tsOIRgQQEQIABgUCRvLejQAKCRBCo09Ey+wGeCAnAKDujla6s2dXex1YivUa H+W7HvRaqQCgq5GEqGrU8VwNB1jMTz4zGhlcX/SIZAQTEQIAJAIbAwYLCQgHAwID FQIDAxYCAQIeAQIXgAUCVep+WgUJIi2wfgAKCRDsgDnwoxfBXTBUAJ9dOVi0DDBj oF5yfHj4ko9PgIfQewCgqBvh08UkIcIemJzY0i2kO1XQZDqIRgQQEQIABgUCSs9e lQAKCRAOYmutEpjCtBhtAJ0UKAH+SzNyQGqBgvkuJiEbQsVdFwCfdYHRD+7v1G6C 7Kevakh0FQt8+W2IZAQTEQIAJAIbAwYLCQgHAwIDFQIDAxYCAQIeAQIXgAUCSkwx sQUJE3HIsQAKCRDsgDnwoxfBXQHxAJ9dVt6awt05uRM3HEZeEyY/ifJgfQCfR+t3 jmp2tN/ZbgvcnB5N5LwkIq60PEFuZHJlYXMgSi4gS29lbmlnIDxhbmRyZWFzLmtv ZW5pZy43b3M2VlZxUkBmcmFuei5hay5taW5kLmRlPohmBBMRAgAmBQJFmRxjAhsD BQkNzB8MBgsJCAcDAgQVAggDBBYCAwECHgECF4AACgkQ7IA58KMXwV1H1ACgoQmD eatNZg17qhaooU85o5sCv+UAoPaHAmivj0ybZNjzNGO+0h919A4FiEYEEBECAAYF AkZLtdQACgkQi9gubzC5S1zQqQCgrzX8RpMWPBp1DKpPfi6ciog6YQwAn2XC7KRo UHEkcB9KtDBSsZMpJrJ1iEYEEBECAAYFAkby3ooACgkQQqNPRMvsBngeBACeJv6d 9zDrCsBNJ1sZL4EilxQLmasAnR1PFWXxexCTQ/RYUC2chMdnxbRKiGYEExECACYC GwMGCwkIBwMCBBUCCAMEFgIDAQIeAQIXgAUCVep+MQUJIi2wfgAKCRDsgDnwoxfB XcUQAKDFLq2r3TYA1yemcbdpzHM2ijpw2wCeMTPjaFGZU5JLuvdXgPg6yVXhl+qI RgQQEQIABgUCSs9elQAKCRAOYmutEpjCtJYAAJ9Ibys2AhIvlWdRszEkp3yugXKw SgCdFA8UtbOmlFvhcW27JrDPT3jh9E2IZgQTEQIAJgIbAwYLCQgHAwIEFQIIAwQW AgMBAh4BAheABQJKTDGrBQkTccixAAoJEOyAOfCjF8FdeAoAoJztVlEIWdxxEcd3 bLyVrJFg3OOqAJ9PbNzO8X+ydw2Cndu7tifqeQ8XF7QrQW5kcmVhcyBKLiBLb2Vu aWcgPGFuZHJlYXMua29lbmlnQGFuaW1hLmRlPohiBBMRAgAiAhsDBAsHAwIDFQID AxYCAQIeAQIXgAUCRZkb8QUJDcwfDAAKCRDsgDnwoxfBXXxuAJ97ETTkVTuBLj7m OI7hZPABKqSP0ACdG6XVz+rJwaHHXjrDFFvcaqZCfDiITAQSEQIADAUCPySDIwWD AwpGUgAKCRC0s903PDUBoAv4AJ4+5sTSi+heHZtA4Rdz97mNK38ELgCfddzmCUi6 vqXebB2QkhfbOWV0YxGIXQQTEQIAHQUCPH4DVgUJAeEzgAULBwoDBAMVAwIDFgIB AheAAAoJEOyAOfCjF8Fd3bAAoNc/scw/LhU5hAUwHJ9lfEt1NgBwAKCzE4InDS0c 3KtYpQwY10gq+5yeuYhiBBMRAgAiBQI+bGJ1AhsDBQkFsMYfBAsHAwIDFQIDAxYC AQIeAQIXgAAKCRDsgDnwoxfBXY+ZAJ9K6w/cr13vgyy0vMg1swsx3iENFQCeO6QG LsATl8EjVtcvol5gJqGAB1eIYgQTEQIAIgIbAwQLBwMCAxUCAwMWAgECHgECF4AF AkHhSl4FCQlnmQgACgkQ7IA58KMXwV1oUQCg8j3oQk4aOgQfuGMXQ1lHb5M8hWYA n3x+3vOQCAw+yHJCuJ+HvnwxT7QwiEYEEBECAAYFAkZLtdQACgkQi9gubzC5S1zj TgCfW5i+GKVm+dxXOu9qduDGR90wXnwAniZ/lVz1nX9SXyHSNsP7QPtIUP2qiEYE EBECAAYFAkby3o0ACgkQQqNPRMvsBnhpDACeOuVracTlhftBP7ChQh2L8SQOsbUA oIb1PVmClVXbW5uPPiey/W0U8rzaiGIEExECACICGwMECwcDAgMVAgMDFgIBAh4B AheABQJV6n5aBQkiLbB+AAoJEOyAOfCjF8Fd0hcAn3lP+KwVQs9RSCywsNRoToNR zF4jAKC4RN0WKGiTWdDisd2g0IQevAbTwohGBBARAgAGBQJKz16VAAoJEA5ia60S mMK0zTUAn0W+ycs/ebalk8wtxWZHOyexBapjAJ9s6nglYuy+0NolNKm1aekXWzW2 z4hiBBMRAgAiAhsDBAsHAwIDFQIDAxYCAQIeAQIXgAUCSkwxsQUJE3HIsQAKCRDs gDnwoxfBXTREAJ92C7TJJZN6814/pzw1IGH67kc2ugCg0q+ye7CzAzDNwhHBwBoS UCE0mOW5AQ0EPH4DWBAEANcfQKLZEwZhgPrA+FGM+O++Ayv6WU6dJ09kGxK3Np2Z eAPvFNG4Y+psmJ1V0F8e9+8THxUK5WKgW04V2O4pHP9MaDGgj2Vw/8Vdlw/6c6B1 kNyn4j0mwKg72h8MDyYkv8uzRLpgkRgpWjUqZGiwnBE0kYgPbufBclRz0kSUqCiz AAMGA/9iDraUrvTIGzQ+HuDTIuqa0QkRBhqGBEePcID8ZV3w+nlKz02mULjTzem+ fI9HoihsMXjaya0HAG38cYhtS435+oPOwzepfr+NGeCg1cGzaKsKCcX9x0RTtL6p /rAwuGBeWcTvyyji4kGPug/Ax7W0OZURZheBHsIgmkj9WYWepohMBBgRAgAMBQI8 fgNYBQkB4TOAAAoJEOyAOfCjF8Fde/YAoOqKYAHhtvR9YEgW/F4STL9Vjoj+AKCc FC7oo31SRRPDPHhoI3cnmjduRLkCDQQ+bF5JEAgAt940GuRZwa47meqpr5h4Tiwg I2l9BqxMaCPf8BmJdS8mr6VN9Vv3C5LeJ7rWWTMfVWac2j1JVfm3q7iG9+GIBj40 M9bWpl6inAuh+SivUI/bMyP7vvlFDSZU3sDe4xAnbKok1tgspEug6oQopFnS/aSD 72dEahfqiKc/2SLwxoeZwfRUCBgyOybSo6pTnJ3IVXj1fdxToTETmS/sFE91aQJq kzqsxA5Esm+lGfbMliZ/iXKNgmW0WWQOPqNJHZcgJDrgl+aGCUZYYmyLSi+KxDqL 2IL2vpQzlhHV9LgmwnF3FA5CtcPxFZoZtsxT5PiHBlZaXaFsX3P7pMEvTgJTDwAD Bwf+IhU5XuraaxRBVxxYHG3+053EGcMML4XMNvCaTEMB5BsxvHTTJr7gAH6FJexO EuGEcys0pcOJiSgeWeUDMtlHevbx2E6u0IPHBg+Gvqg4qMmKz8BZ5g/SrHQsOwxN fYYN7xzWqLt8IULLUCjblVJfuJ/PW85JXXdCmf5LwhWMKQR7bTxtaH5iFkzhgv+2 GkG+3mF/KWjKUOEbmBFDUsbP2PZtkN/ziYuF/Db8nsht2xU9N3lvg1Q1tXJgQYak WwNAYWJsz1Y65MDMJSWE55mop3XxyXXNLDz9HnX2OwElrkTdVH2Fxo5qCfMRac3Y OXX4hCbeSL4JD4AB0VA/ci6FjIhMBBgRAgAMBQI+bF5JBQkDwmcAAAoJEOyAOfCj F8Fdg0kAoJqi9qIQNVyj6XRPISUmYMa3L6vlAKDqKZO31WJQnZmlDFxy3YBw/awK PbkCDQRB4Ur/EAgAmVOOGgiP33A4jL/lt9dHDbLQ5mkyI1XM3yP15nNqeQUbrMDi o6dtd1AgEoohW2f2PkdqlYQaSCbsCOv4u2KPlJLsWz7HdaTUY8afzREuejDJW93Q A9Suzx2ByCjHS6LmeKW4w7ofe2o15+cc5DFvEkhBgEPLpNuKG0CBysK8NxntPl2t Qqe21N2TjrkFyWHzGpjogV1FCXAdaFHntCTF0D3lwfB++IkXjWfQcUZw5mV58iNi XP6E7IBtNqTKMOdary1ASyLgdIu9OPpyAcHG+IbUcxxlUDrJY8OlHSt4ibJxU4Cd xCyrO3sb4ocVrvR8AMkkLe0RHi5v9/+Nf73OFwADBQf9EUEvHbL7UdTOwVs08ImT T1kqjR1H3f2ZFrmEpdj+FdB9o58yqd8r21qN6i5r9AE7AxVo45jrhGVfkKoyYGxq 5xNBKnRjtOqGa1weKWvQtJ8EwHEiILw+YZx3QBa4yGwvkDA/yNwgBePKlBzGMPvw ep+d36LDNKB8pIwm/uruT30uE62+89coB8WXNvwNyibFlxnDPOv71k/7FSkFPimB 9TsoBa9UejFG2BdgUxlhAwSysuY364zhxuWfEE1ilPuIah37ob+QEKPA7MAgh0D+ 8OFuSa/hx0xZPG1x3V57ViC6W5m8vIkC0+Pr1fIb0QLFGpp1YdBrDPGr0jHovZck a4hPBBgRAgAPBQJB4Ur/AhsMBQkEBFIAAAoJEOyAOfCjF8FdlJ0AnRVocpQnz1Is Y0sAOj8QJPBoTO7wAKCMvR3p7wpZpjWf+blgAnCLMahei7kCDQRFmR0hEAgA75SD L4C2WxPXIVgPU64Xc0ZClSqSf2HQY9YRDuUpWbghaYbGlnxzGkxP8bySJXkqwMgt 4eF1zhEau/OXV2NfKXai3k6kZpANcSeycjmPa3+ci4wSuS/9qz/oSy1mm9IiP9iq uxuQ2kv11OCnVbc8zsl8Y7DV0nf7qfLu1T8okQUjQVxeIIobxTfpoNoh5DBMLUbg ikJ3Z5PKmfcx3XMoM5e3c9Tv4brXx9DLn6tcdAXA5aN1ahM/2HvxYnuHjCOSpJ9C zMCTmRkwDvYxlp8WlyLpubwfrk+EaT40iCSsjcDHlaGIMrOC1jmVopIE581sLMqH tgClVW93dwLNsJMvRwADBQf6A3/pY/4OoHKjZm8cSpfdNRTDWK+YD5tb2qD36G3d qdTkMvHjIsvJdacIgg37qBJuKMnw3xhwjwf0cpnAuUPG1wKoIk7/OuLnVmghksHE fzIpsg49P7Gb5MsXxmUlMr8vePnDnqt/xyxuQ/OwcH87dl1OuZqaf/KWM6NtUobF 4oC/Y7oivEecij9M+GGJK2Iznvxs6ASeFPcDg3LVblWnO2xfT3rcux+Nqul4pLbL IjONYp0/IK4v2V7nAzU0sUP5NuH1QkZ/uhro3W7CznLDWEIb7BGTsjM8OEe3uMwD 93O1V7bEQdSHfhHPZvaTOLkZKQ/MaWW9PiVcSfwSMX3DKYhPBBgRAgAPBQJFmR0h AhsMBQkEsQaAAAoJEOyAOfCjF8Fd6Z4An3Z+AKQy1XYWhFqXok8Qe3w6O47oAJwO wsedVEZcWQPA6E3FQf8PicV3pohPBBgRAgAPAhsMBQJQNTpvBQkQP7fDAAoJEOyA OfCjF8FdxkoAn2lCeonCU6EHSy0KqhRysJFuvLm5AKCKM+pbqhGxYWdkwFo4e9FH 7an457kCDQRV6oJQEAgAl2dNqIfG44Jve8dJ4lYib0UeY3Dm5m83DiecUtJuuLbS IiPbgxEiLiUXcrC4boujD9t06xpEN2ocbMxylw19o81nF+NOS0Hikbwz3N38VIQ5 2FXQxcdbiHNgrAy+dsGxpIcyR5J561rDQY4psYJZHRecTfGri5Ow+RQXcVF42HYg UDT+U3hVN/WYljPMWhpTtxMHro51eNDdHEY4l2Wq7ukJBlsbqqO5nlY7wNheKWMr OlsZjMwc+s4z/VutNaL+ORrs/E3+l65qPNEfX7JtVCTdJjGxtDmbINwPkNVBQIsT oxr7jSBVvYntakp/U6EVVUem5ScXWcjg0cmCZsBm9wADBQf9EDN76CZ9dwRGcMMz dz4uvDRaBhc0YDBYTlAj9zkcHw+54T6uDakBg0QjH7R/BW+OiR4lr+whiMRMgtjs 8jBKrofWfncS79DjSa7fkqayQRPBejmjq1nFQsT5F36AzBJ2PNfqmhJGMISKX9qN +vqLqhTkwaSNcCPpgY2ZVrmv+sCl1MHQXKIkA3/UU3eH5LJyIEXcc2gCCp2uiHiL nIBTt+E1uIK+srGzgVTFsrQWUhZm/KMoS+saUI1Oe48NWVxTSuix8y8L3iFnR0P2 uCUWVcZ5hLBT0FXlK2r11RbY/ZJQOLpLITf3XfmRoccmBmG1IBfOBG/8qHKYx9i4 ajpzY4hPBBgRAgAPBQJV6oJQAhsMBQkIwTYAAAoJEOyAOfCjF8FdJ14An1SjLvW4 q0omwMGAw52hP+KJFWGOAJ0fyXioqsTP+KtO+XXqx+CZMMJx9A== =bI5D -----END PGP PUBLIC KEY BLOCK-----Module-Signature-0.83/lib/Module/000755 000765 000024 00000000000 13341455163 017450 5ustar00audreytstaff000000 000000 Module-Signature-0.83/lib/Module/Signature.pm000644 000765 000024 00000072407 13341455100 021750 0ustar00audreytstaff000000 000000 package Module::Signature; $Module::Signature::VERSION = '0.83'; use 5.005; use strict; use vars qw($VERSION $SIGNATURE @ISA @EXPORT_OK); use vars qw($Preamble $Cipher $Debug $Verbose $Timeout $AUTHOR); use vars qw($KeyServer $KeyServerPort $AutoKeyRetrieve $CanKeyRetrieve); use vars qw($LegacySigFile); use constant CANNOT_VERIFY => '0E0'; use constant SIGNATURE_OK => 0; use constant SIGNATURE_MISSING => -1; use constant SIGNATURE_MALFORMED => -2; use constant SIGNATURE_BAD => -3; use constant SIGNATURE_MISMATCH => -4; use constant MANIFEST_MISMATCH => -5; use constant CIPHER_UNKNOWN => -6; use ExtUtils::Manifest (); use Exporter; use File::Spec; @EXPORT_OK = ( qw(sign verify), qw($SIGNATURE $AUTHOR $KeyServer $Cipher $Preamble), (grep { /^[A-Z_]+_[A-Z_]+$/ } keys %Module::Signature::), ); @ISA = 'Exporter'; $AUTHOR = $ENV{MODULE_SIGNATURE_AUTHOR}; $SIGNATURE = 'SIGNATURE'; $Timeout = $ENV{MODULE_SIGNATURE_TIMEOUT} || 3; $Verbose = $ENV{MODULE_SIGNATURE_VERBOSE} || 0; $KeyServer = $ENV{MODULE_SIGNATURE_KEYSERVER} || 'pool.sks-keyservers.net'; $KeyServerPort = $ENV{MODULE_SIGNATURE_KEYSERVERPORT} || '11371'; $Cipher = $ENV{MODULE_SIGNATURE_CIPHER} || 'SHA256'; $Preamble = << "."; This file contains message digests of all files listed in MANIFEST, signed via the Module::Signature module, version $VERSION. To verify the content in this distribution, first make sure you have Module::Signature installed, then type: % cpansign -v It will check each file's integrity, as well as the signature's validity. If "==> Signature verified OK! <==" is not displayed, the distribution may already have been compromised, and you should not run its Makefile.PL or Build.PL. . $AutoKeyRetrieve = 1; $CanKeyRetrieve = undef; $LegacySigFile = 0; sub _cipher_map { my($sigtext) = @_; my @lines = split /\015?\012/, $sigtext; my %map; for my $line (@lines) { last if $line eq '-----BEGIN PGP SIGNATURE-----'; next if $line =~ /^---/ .. $line eq ''; my($cipher,$digest,$file) = split " ", $line, 3; return unless defined $file; $map{$file} = [$cipher, $digest]; } return \%map; } sub verify { my %args = ( skip => $ENV{TEST_SIGNATURE}, @_ ); my $rv; (-r $SIGNATURE) or do { warn "==> MISSING Signature file! <==\n"; return SIGNATURE_MISSING; }; (my $sigtext = _read_sigfile($SIGNATURE)) or do { warn "==> MALFORMED Signature file! <==\n"; return SIGNATURE_MALFORMED; }; (my ($cipher_map) = _cipher_map($sigtext)) or do { warn "==> MALFORMED Signature file! <==\n"; return SIGNATURE_MALFORMED; }; (defined(my $plaintext = _mkdigest($cipher_map))) or do { warn "==> UNKNOWN Cipher format! <==\n"; return CIPHER_UNKNOWN; }; $rv = _verify($SIGNATURE, $sigtext, $plaintext); if ($rv == SIGNATURE_OK) { my ($mani, $file) = _fullcheck($args{skip}); if (@{$mani} or @{$file}) { warn "==> MISMATCHED content between MANIFEST and distribution files! <==\n"; return MANIFEST_MISMATCH; } else { warn "==> Signature verified OK! <==\n" if $Verbose; } } elsif ($rv == SIGNATURE_BAD) { warn "==> BAD/TAMPERED signature detected! <==\n"; } elsif ($rv == SIGNATURE_MISMATCH) { warn "==> MISMATCHED content between SIGNATURE and distribution files! <==\n"; } return $rv; } sub _verify { my $signature = shift || $SIGNATURE; my $sigtext = shift || ''; my $plaintext = shift || ''; # Avoid loading modules from relative paths in @INC. local @INC = grep { File::Spec->file_name_is_absolute($_) } @INC; local $SIGNATURE = $signature if $signature ne $SIGNATURE; if ($AutoKeyRetrieve and !$CanKeyRetrieve) { if (!defined $CanKeyRetrieve) { require IO::Socket::INET; my $sock = IO::Socket::INET->new( Timeout => $Timeout, PeerAddr => "$KeyServer:$KeyServerPort", ); $CanKeyRetrieve = ($sock ? 1 : 0); $sock->shutdown(2) if $sock; } $AutoKeyRetrieve = $CanKeyRetrieve; } if (my $version = _has_gpg()) { return _verify_gpg($sigtext, $plaintext, $version); } elsif (eval {require Crypt::OpenPGP; 1}) { return _verify_crypt_openpgp($sigtext, $plaintext); } else { warn "Cannot use GnuPG or Crypt::OpenPGP, please install either one first!\n"; return _compare($sigtext, $plaintext, CANNOT_VERIFY); } } sub _has_gpg { my $gpg = _which_gpg() or return; `$gpg --version` =~ /GnuPG.*?(\S+)\s*$/m or return; return $1; } sub _fullcheck { my $skip = shift; my @extra; local $^W; local $ExtUtils::Manifest::Quiet = 1; my($mani, $file); if( _legacy_extutils() ) { my $_maniskip; if ( _public_maniskip() ) { $_maniskip = &ExtUtils::Manifest::maniskip; } else { $_maniskip = &ExtUtils::Manifest::_maniskip; } local *ExtUtils::Manifest::_maniskip = sub { sub { return unless $skip; my $ok = $_maniskip->(@_); if ($ok ||= (!-e 'MANIFEST.SKIP' and _default_skip(@_))) { print "Skipping $_\n" for @_; push @extra, @_; } return $ok; } }; ($mani, $file) = ExtUtils::Manifest::fullcheck(); } else { my $_maniskip = &ExtUtils::Manifest::maniskip; local *ExtUtils::Manifest::maniskip = sub { sub { return unless $skip; return $_maniskip->(@_); } }; ($mani, $file) = ExtUtils::Manifest::fullcheck(); } foreach my $makefile ('Makefile', 'Build') { warn "==> SKIPPED CHECKING '$_'!" . (-e "$_.PL" && " (run $_.PL to ensure its integrity)") . " <===\n" for grep $_ eq $makefile, @extra; } @{$mani} = grep {$_ ne 'SIGNATURE'} @{$mani}; warn "Not in MANIFEST: $_\n" for @{$file}; warn "No such file: $_\n" for @{$mani}; return ($mani, $file); } sub _legacy_extutils { # ExtUtils::Manifest older than 1.58 does not handle MYMETA. return (ExtUtils::Manifest->VERSION < 1.58); } sub _public_maniskip { # ExtUtils::Manifest 1.54 onwards have public maniskip return (ExtUtils::Manifest->VERSION > 1.53); } sub _default_skip { local $_ = shift; return 1 if /\bRCS\b/ or /\bCVS\b/ or /\B\.svn\b/ or /,v$/ or /^MANIFEST\.bak/ or /^Makefile$/ or /^blib\// or /^MakeMaker-\d/ or /^pm_to_blib/ or /^blibdirs/ or /^_build\// or /^Build$/ or /^pmfiles\.dat/ or /^MYMETA\./ or /~$/ or /\.old$/ or /\#$/ or /^\.#/; } my $which_gpg; sub _which_gpg { # Cache it so we don't need to keep checking. return $which_gpg if $which_gpg; for my $gpg_bin ('gpg', 'gpg2', 'gnupg', 'gnupg2') { my $version = `$gpg_bin --version 2>&1`; if( $version && $version =~ /GnuPG/ ) { $which_gpg = $gpg_bin; return $which_gpg; } } } sub _verify_gpg { my ($sigtext, $plaintext, $version) = @_; local $SIGNATURE = Win32::GetShortPathName($SIGNATURE) if defined &Win32::GetShortPathName and $SIGNATURE =~ /[^-\w.:~\\\/]/; my $keyserver = _keyserver($version); require File::Temp; my $fh = File::Temp->new(); print $fh $sigtext || _read_sigfile($SIGNATURE); close $fh; my $gpg = _which_gpg(); my @quiet = $Verbose ? () : qw(-q --logger-fd=1); my @cmd = ( $gpg, qw(--verify --batch --no-tty), @quiet, ($KeyServer ? ( "--keyserver=$keyserver", ($AutoKeyRetrieve and $version ge '1.0.7') ? '--keyserver-options=auto-key-retrieve' : () ) : ()), $fh->filename ); my $output = ''; if( $Verbose ) { warn "Executing @cmd\n"; system @cmd; } else { my $cmd = join ' ', @cmd; $output = `$cmd`; } unlink $fh->filename; if( $? ) { print STDERR $output; } elsif ($output =~ /((?: +[\dA-F]{4}){10,})/) { warn "WARNING: This key is not certified with a trusted signature!\n"; warn "Primary key fingerprint:$1\n"; } return SIGNATURE_BAD if ($? and $AutoKeyRetrieve); return _compare($sigtext, $plaintext, (!$?) ? SIGNATURE_OK : CANNOT_VERIFY); } sub _keyserver { my $version = shift; my $scheme = 'x-hkp'; $scheme = 'hkp' if $version ge '1.2.0'; return "$scheme://$KeyServer:$KeyServerPort"; } sub _verify_crypt_openpgp { my ($sigtext, $plaintext) = @_; require Crypt::OpenPGP; my $pgp = Crypt::OpenPGP->new( ($KeyServer) ? ( KeyServer => $KeyServer, AutoKeyRetrieve => $AutoKeyRetrieve ) : (), ); my $rv = $pgp->handle( Data => $sigtext ) or die $pgp->errstr; return SIGNATURE_BAD if (!$rv->{Validity} and $AutoKeyRetrieve); if ($rv->{Validity}) { warn 'Signature made ', scalar localtime($rv->{Signature}->timestamp), ' using key ID ', substr(uc(unpack('H*', $rv->{Signature}->key_id)), -8), "\n", "Good signature from \"$rv->{Validity}\"\n" if $Verbose; } else { warn "Cannot verify signature; public key not found\n"; } return _compare($sigtext, $plaintext, $rv->{Validity} ? SIGNATURE_OK : CANNOT_VERIFY); } sub _read_sigfile { my $sigfile = shift; my $signature = ''; my $well_formed; local *D; open D, "< $sigfile" or die "Could not open $sigfile: $!"; if ($] >= 5.006 and =~ /\r/) { close D; open D, '<', $sigfile or die "Could not open $sigfile: $!"; binmode D, ':crlf'; } else { close D; open D, "< $sigfile" or die "Could not open $sigfile: $!"; } my $begin = "-----BEGIN PGP SIGNED MESSAGE-----\n"; my $end = "-----END PGP SIGNATURE-----\n"; my $found = 0; while () { if (1 .. ($_ eq $begin)) { if (!$found and /signed via the Module::Signature module, version ([0-9\.]+)\./) { $found = 1; if (eval { require version; version->parse($1) < version->parse("0.82") }) { $LegacySigFile = 1; warn "Old $SIGNATURE detected. Please inform the module author to regenerate " . "$SIGNATURE using Module::Signature version 0.82 or newer.\n"; } } next; } $signature .= $_; return "$begin$signature" if $_ eq $end; } return; } sub _compare { my ($str1, $str2, $ok) = @_; # normalize all linebreaks $str1 =~ s/^-----BEGIN PGP SIGNED MESSAGE-----\n(?:.+\n)*\n//; $str1 =~ s/[^\S ]+/\n/g; $str2 =~ s/[^\S ]+/\n/g; $str1 =~ s/-----BEGIN PGP SIGNATURE-----\n(?:.+\n)*$//; return $ok if $str1 eq $str2; if (eval { require Text::Diff; 1 }) { warn "--- $SIGNATURE ".localtime((stat($SIGNATURE))[9])."\n"; warn '+++ (current) '.localtime()."\n"; warn Text::Diff::diff( \$str1, \$str2, { STYLE => 'Unified' } ); } else { local (*D, *S); open S, "< $SIGNATURE" or die "Could not open $SIGNATURE: $!"; open D, "| diff -u --strip-trailing-cr $SIGNATURE -" or (warn "Could not call diff: $!", return SIGNATURE_MISMATCH); while () { print D $_ if (1 .. /^-----BEGIN PGP SIGNED MESSAGE-----/); print D if (/^Hash: / .. /^$/); next if (1 .. /^-----BEGIN PGP SIGNATURE/); print D $str2, "-----BEGIN PGP SIGNATURE-----\n", $_ and last; } print D ; close D; } return SIGNATURE_MISMATCH; } sub sign { my %args = ( skip => 1, @_ ); my $overwrite = $args{overwrite}; my $plaintext = _mkdigest(); my ($mani, $file) = _fullcheck($args{skip}); if (@{$mani} or @{$file}) { warn "==> MISMATCHED content between MANIFEST and the distribution! <==\n"; warn "==> Please correct your MANIFEST file and/or delete extra files. <==\n"; } if (!$overwrite and -e $SIGNATURE and -t STDIN) { local $/ = "\n"; print "$SIGNATURE already exists; overwrite [y/N]? "; return unless =~ /[Yy]/; } if (my $version = _has_gpg()) { _sign_gpg($SIGNATURE, $plaintext, $version); } elsif (eval {require Crypt::OpenPGP; 1}) { _sign_crypt_openpgp($SIGNATURE, $plaintext); } else { die 'Cannot use GnuPG or Crypt::OpenPGP, please install either one first!'; } warn "==> SIGNATURE file created successfully. <==\n"; return SIGNATURE_OK; } sub _sign_gpg { my ($sigfile, $plaintext, $version) = @_; die "Could not write to $sigfile" if -e $sigfile and (-d $sigfile or not -w $sigfile); my $gpg = _which_gpg(); local *D; my $set_key = ''; $set_key = qq{--default-key "$AUTHOR"} if($AUTHOR); open D, "| $gpg $set_key --clearsign >> $sigfile.tmp" or die "Could not call $gpg: $!"; print D $plaintext; close D; (-e "$sigfile.tmp" and -s "$sigfile.tmp") or do { unlink "$sigfile.tmp"; die "Cannot find $sigfile.tmp, signing aborted.\n"; }; open D, "< $sigfile.tmp" or die "Cannot open $sigfile.tmp: $!"; open S, "> $sigfile" or do { unlink "$sigfile.tmp"; die "Could not write to $sigfile: $!"; }; print S $Preamble; print S ; close S; close D; unlink("$sigfile.tmp"); my $key_id; my $key_name; # This doesn't work because the output from verify goes to STDERR. # If I try to redirect it using "--logger-fd 1" it just hangs. # WTF? my @verify = `$gpg --batch --verify $SIGNATURE`; while (@verify) { if (/key ID ([0-9A-F]+)$/) { $key_id = $1; } elsif (/signature from "(.+)"$/) { $key_name = $1; } } my $found_name; my $found_key; if (defined $key_id && defined $key_name) { my $keyserver = _keyserver($version); while (`$gpg --batch --keyserver=$keyserver --search-keys '$key_name'`) { if (/^\(\d+\)/) { $found_name = 0; } elsif ($found_name) { if (/key \Q$key_id\E/) { $found_key = 1; last; } } if (/\Q$key_name\E/) { $found_name = 1; next; } } unless ($found_key) { _warn_non_public_signature($key_name); } } return 1; } sub _sign_crypt_openpgp { my ($sigfile, $plaintext) = @_; require Crypt::OpenPGP; my $pgp = Crypt::OpenPGP->new; my $ring = Crypt::OpenPGP::KeyRing->new( Filename => $pgp->{cfg}->get('SecRing') ) or die $pgp->error(Crypt::OpenPGP::KeyRing->errstr); my $uid = ''; $uid = $AUTHOR if($AUTHOR); my $kb; if ($uid) { $kb = $ring->find_keyblock_by_uid($uid) or die $pgp->error(qq{Can't find '$uid': } . $ring->errstr); } else { $kb = $ring->find_keyblock_by_index(-1) or die $pgp->error(q{Can't find last keyblock: } . $ring->errstr); } my $cert = $kb->signing_key; $uid = $cert->uid($kb->primary_uid); warn "Debug: acquiring signature from $uid\n" if $Debug; my $signature = $pgp->sign( Data => $plaintext, Detach => 0, Clearsign => 1, Armour => 1, Key => $cert, PassphraseCallback => \&Crypt::OpenPGP::_default_passphrase_cb, ) or die $pgp->errstr; local *D; open D, "> $sigfile" or die "Could not write to $sigfile: $!"; print D $Preamble; print D $signature; close D; require Crypt::OpenPGP::KeyServer; my $server = Crypt::OpenPGP::KeyServer->new(Server => $KeyServer); unless ($server->find_keyblock_by_keyid($cert->key_id)) { _warn_non_public_signature($uid); } return 1; } sub _warn_non_public_signature { my $uid = shift; warn <<"EOF" You have signed this distribution with a key ($uid) that cannot be found on the public key server at $KeyServer. This will probably cause signature verification to fail if your module is distributed on CPAN. EOF } sub _mkdigest { my $digest = _mkdigest_files(@_) or return; my $plaintext = ''; foreach my $file (sort keys %$digest) { next if $file eq $SIGNATURE; $plaintext .= "@{$digest->{$file}} $file\n"; } return $plaintext; } sub _digest_object { my($algorithm) = @_; # Avoid loading Digest::* from relative paths in @INC. local @INC = grep { File::Spec->file_name_is_absolute($_) } @INC; # Constrain algorithm name to be of form ABC123. my ($base, $variant) = ($algorithm =~ /^([_a-zA-Z]+)([0-9]+)$/g) or die "Malformed algorithm name: $algorithm (should match /\\w+\\d+/)"; my $obj = eval { Digest->new($algorithm) } || eval { require "Digest/$base.pm"; "Digest::$base"->new($variant) } || eval { require "Digest/$algorithm.pm"; "Digest::$algorithm"->new } || eval { require "Digest/$base/PurePerl.pm"; "Digest::$base\::PurePerl"->new($variant) } || eval { require "Digest/$algorithm/PurePerl.pm"; "Digest::$algorithm\::PurePerl"->new } or do { eval { warn "Unknown cipher: $algorithm, please install Digest::$base, Digest::$base$variant, or Digest::$base\::PurePerl\n"; } and return } or do { warn "Unknown cipher: $algorithm, please install Digest::$algorithm\n"; return; }; $obj; } sub _mkdigest_files { my $verify_map = shift; my $dosnames = (defined(&Dos::UseLFN) && Dos::UseLFN()==0); my $read = ExtUtils::Manifest::maniread() || {}; my $found = ExtUtils::Manifest::manifind(); my(%digest) = (); my($default_obj) = _digest_object($Cipher); FILE: foreach my $file (sort keys %$read){ next FILE if $file eq $SIGNATURE; my($obj,$this_cipher,$this_hexdigest,$verify_digest); if ($verify_map) { if (my $vmf = $verify_map->{$file}) { ($this_cipher,$verify_digest) = @$vmf; if ($this_cipher eq $Cipher) { $obj = $default_obj; } else { $obj = _digest_object($this_cipher); } } else { $this_cipher = $Cipher; $obj = $default_obj; } } else { $this_cipher = $Cipher; $obj = $default_obj; } warn "Debug: collecting digest from $file\n" if $Debug; if ($dosnames){ $file = lc $file; $file =~ s!(\.(\w|-)+)!substr ($1,0,4)!ge; $file =~ s!((\w|-)+)!substr ($1,0,8)!ge; } unless ( exists $found->{$file} ) { warn "No such file: $file\n" if $Verbose; } else { local *F; open F, "< $file" or die "Cannot open $file for reading: $!"; if ($LegacySigFile) { if (-B $file) { binmode(F); $obj->addfile(*F); $this_hexdigest = $obj->hexdigest; } else { # Normalize by hand... local $/; binmode(F); my $input = ; VERIFYLOOP: for my $eol ("","\015\012","\012") { my $lax_input = $input; if (! length $eol) { # first try is binary } else { my @lines = split /$eol/, $input, -1; if (grep /[\015\012]/, @lines) { # oops, apparently not a text file, treat as binary, forget @lines } else { my $other_eol = $eol eq "\012" ? "\015\012" : "\012"; $lax_input = join $other_eol, @lines; } } $obj->add($lax_input); $this_hexdigest = $obj->hexdigest; if ($verify_digest) { if ($this_hexdigest eq $verify_digest) { last VERIFYLOOP; } $obj->reset; } else { last VERIFYLOOP; } } } } else { binmode(F, ((-B $file) ? ':raw' : ':crlf')); $obj->addfile(*F); $this_hexdigest = $obj->hexdigest; } $digest{$file} = [$this_cipher, $this_hexdigest]; $obj->reset; } } return \%digest; } 1; __END__ =encoding utf8 =head1 NAME Module::Signature - Module signature file manipulation =head1 SYNOPSIS As a shell command: % cpansign # verify an existing SIGNATURE, or # make a new one if none exists % cpansign sign # make signature; overwrites existing one % cpansign -s # same thing % cpansign verify # verify a signature % cpansign -v # same thing % cpansign -v --skip # ignore files in MANIFEST.SKIP % cpansign help # display this documentation % cpansign -h # same thing In programs: use Module::Signature qw(sign verify SIGNATURE_OK); sign(); sign(overwrite => 1); # overwrites without asking # see the CONSTANTS section below (verify() == SIGNATURE_OK) or die "failed!"; =head1 DESCRIPTION B adds cryptographic authentications to CPAN distributions, via the special F file. If you are a module user, all you have to do is to remember to run C (or just C) before issuing C or C; that will ensure the distribution has not been tampered with. Module authors can easily add the F file to the distribution tarball; see L below for how to do it as part of C. If you I want to sign a distribution manually, simply add C to F, then type C immediately before C. Be sure to delete the F file afterwards. Please also see L about F issues, especially if you are using B or writing your own F. =head1 VARIABLES No package variables are exported by default. =over 4 =item $Verbose If true, Module::Signature will give information during processing including gpg output. If false, Module::Signature will be as quiet as possible as long as everything is working ok. Defaults to false. =item $SIGNATURE The filename for a distribution's signature file. Defaults to C. =item $AUTHOR The key ID used for signature. If empty/null/0, C's configured default ID, or the most recently added key within the secret keyring for C, will be used for the signature. =item $KeyServer The OpenPGP key server for fetching the author's public key (currently only implemented on C, not C). May be set to a false value to prevent this module from fetching public keys. =item $KeyServerPort The OpenPGP key server port, defaults to C<11371>. =item $Timeout Maximum time to wait to try to establish a link to the key server. Defaults to C<3>. =item $AutoKeyRetrieve Whether to automatically fetch unknown keys from the key server. Defaults to C<1>. =item $Cipher The default cipher used by the C module to make signature files. Defaults to C, but may be changed to other ciphers via the C environment variable if the SHA1 cipher is undesirable for the user. The cipher specified in the F file's first entry will be used to validate its integrity. For C, the user needs to have any one of these four modules installed: B, B, B, or (currently nonexistent) B. =item $Preamble The explanatory text written to newly generated F files before the actual entries. =back =head1 ENVIRONMENT B honors these environment variables: =over 4 =item MODULE_SIGNATURE_AUTHOR Works like C<$AUTHOR>. =item MODULE_SIGNATURE_CIPHER Works like C<$Cipher>. =item MODULE_SIGNATURE_VERBOSE Works like C<$Verbose>. =item MODULE_SIGNATURE_KEYSERVER Works like C<$KeyServer>. =item MODULE_SIGNATURE_KEYSERVERPORT Works like C<$KeyServerPort>. =item MODULE_SIGNATURE_TIMEOUT Works like C<$Timeout>. =back =head1 CONSTANTS These constants are not exported by default. =over 4 =item CANNOT_VERIFY (C<0E0>) Cannot verify the OpenPGP signature, maybe due to the lack of a network connection to the key server, or if neither gnupg nor Crypt::OpenPGP exists on the system. =item SIGNATURE_OK (C<0>) Signature successfully verified. =item SIGNATURE_MISSING (C<-1>) The F file does not exist. =item SIGNATURE_MALFORMED (C<-2>) The signature file does not contains a valid OpenPGP message. =item SIGNATURE_BAD (C<-3>) Invalid signature detected -- it might have been tampered with. =item SIGNATURE_MISMATCH (C<-4>) The signature is valid, but files in the distribution have changed since its creation. =item MANIFEST_MISMATCH (C<-5>) There are extra files in the current directory not specified by the MANIFEST file. =item CIPHER_UNKNOWN (C<-6>) The cipher used by the signature file is not recognized by the C and C modules. =back =head1 NOTES =head2 Signing your module as part of C The easiest way is to use B: sign; # put this before "WriteAll" WriteAll; For B (version 6.18 or above), you may do this: WriteMakefile( (MM->can('signature_target') ? (SIGN => 1) : ()), # ... original arguments ... ); Users of B may do this: Module::Build->new( (sign => 1), # ... original arguments ... )->create_build_script; =head2 F Considerations (The following section is lifted from Iain Truskett's B module, under the Perl license. Thanks, Iain!) It is B that your F and F files be accurate and complete. If you are using C and you do not have a F file, then don't worry about the rest of this. If you do have a F file, or you use C, you must read this. Since the test is run at C time, the distribution has been made. Thus your F file should have the entries listed below. If you're using C, you should have, at least: #defaults ^Makefile$ ^blib/ ^pm_to_blib ^blibdirs These entries are part of the default set provided by C, which is ignored if you provide your own F file. If you are using C, you should have two extra entries: ^Build$ ^_build/ If you don't have the correct entries, C will complain that you have: ==> MISMATCHED content between MANIFEST and distribution files! <== You should note this during normal development testing anyway. =head2 Testing signatures You may add this code as F in your distribution tree: #!/usr/bin/perl use strict; print "1..1\n"; if (!$ENV{TEST_SIGNATURE}) { print "ok 1 # skip Set the environment variable", " TEST_SIGNATURE to enable this test\n"; } elsif (!-s 'SIGNATURE') { print "ok 1 # skip No signature file found\n"; } elsif (!eval { require Module::Signature; 1 }) { print "ok 1 # skip ", "Next time around, consider install Module::Signature, ", "so you can verify the integrity of this distribution.\n"; } elsif (!eval { require Socket; Socket::inet_aton('pool.sks-keyservers.net') }) { print "ok 1 # skip ", "Cannot connect to the keyserver\n"; } else { (Module::Signature::verify() == Module::Signature::SIGNATURE_OK()) or print "not "; print "ok 1 # Valid signature\n"; } __END__ If you are already using B for testing, a more straightforward version of F can be found in the B distribution. Note that C is considered by default only when C<$ENV{TEST_SIGNATURE}> is set to a true value. Also, if you prefer a more full-fledged testing package, and are willing to inflict the dependency of B on your users, Iain Truskett's B might be a better choice. =cut =head1 SEE ALSO L, L, L, L L, L, L L, L, L L =head1 AUTHORS Audrey Tang Ecpan@audreyt.orgE =head1 LICENSE This work is under a B License, although a portion of the documentation (as detailed above) is under the Perl license. To the extent possible under law, 唐鳳 has waived all copyright and related or neighboring rights to Module-Signature. This work is published from Taiwan. L =cut Module-Signature-0.83/script/cpansign000644 000765 000024 00000003760 13340540137 020507 0ustar00audreytstaff000000 000000 #!/usr/bin/perl $VERSION = '0.06'; =encoding utf8 =head1 NAME cpansign - CPAN signature management utility =head1 SYNOPSIS % cpansign # verify an existing SIGNATURE, or # make a new one if none exists % cpansign file.par # verify or sign a PAR file % cpansign sign # make signature; overwrites existing one % cpansign -s # same thing % cpansign verify # verify a signature % cpansign -v # same thing % cpansign -v --skip # ignore files in MANIFEST.SKIP % cpansign help # display this documentation % cpansign -h # same thing =head1 DESCRIPTION This utility lets you create and verify SIGNATURE files. =cut use strict; use Module::Signature; $Module::Signature::Verbose = 1; my %cmd = ( s => 'sign', v => 'verify', h => 'help', ); my $op = $ARGV[0]; $op =~ s/^--?// if defined $op; my $dwim; if (!$op or $op eq 'skip' or -e $op) { $op = (-e 'SIGNATURE' ? 'verify' : 'sign'); $dwim = 1; } my $cmd = $cmd{substr($op, 0, 1)}; (system("perldoc $0"), exit) if $cmd eq 'help'; my @args; push @args, (overwrite => '1') if $cmd eq 'sign'; push @args, (skip => '1') if grep /^-?-?skip/, @ARGV; if (my $sub = Module::Signature->can($cmd)) { if (@ARGV and -e $ARGV[-1]) { require PAR::Dist; PAR::Dist::_verify_or_sign( dist => $ARGV[-1], $dwim ? () : (action => $cmd, @args) ); } else { #if ($cmd eq 'sign') { # exit unless Module::Signature::verify(); #} exit($sub->(@args)); } } else { die "Unknown command: '$op'.\n". "Available actions: " . (join(', ', sort values %cmd)) . ".\n"; } exit; =head1 SEE ALSO L =head1 AUTHORS Audrey Tang Eautrijus@autrijus.orgE =head1 LICENSE This work is under the B license. To the extent possible under law, 唐鳳 has waived all copyright and related or neighboring rights to Module-Signature. This work is published from Taiwan. L =cut Module-Signature-0.83/t/2-cygwin.t000644 000765 000024 00000000746 13340540137 017546 0ustar00audreytstaff000000 000000 #!/usr/bin/perl -w use strict; use Module::Signature; use Test::More; if ($^O ne 'cygwin') { plan skip_all => "Cygwin only tests"; } elsif (! $ENV{TEST_CYGWIN_GNUPG} ) { plan skip_all => 'Set the environment variable TEST_CYGWIN_GNUPG to enable this test'; } elsif (! -x '/usr/local/bin/gpg') { plan skip_all => '/usr/local/bin/gpg not found'; } plan tests => 1; my $version = Module::Signature::_has_gpg(); like($version, qr/^\d+\.\d+\.\d+$/, "gpg version detected"); Module-Signature-0.83/t/0-signature.t000644 000765 000024 00000001721 13340540137 020237 0ustar00audreytstaff000000 000000 #!/usr/bin/perl use strict; use Test::More; if (!$ENV{TEST_SIGNATURE}) { plan skip_all => "Set the environment variable TEST_SIGNATURE to enable this test."; } elsif (!eval { require Module::Signature; 1 }) { plan skip_all => "Next time around, consider installing Module::Signature, ". "so you can verify the integrity of this distribution."; } elsif ( !-e 'SIGNATURE' ) { plan skip_all => "SIGNATURE not found"; } elsif ( -s 'SIGNATURE' == 0 ) { plan skip_all => "SIGNATURE file empty"; } elsif (!eval { require Socket; Socket::inet_aton('pool.sks-keyservers.net') }) { plan skip_all => "Cannot connect to the keyserver to check module ". "signature"; } else { plan tests => 1; } my $ret = Module::Signature::verify(); SKIP: { skip "Module::Signature cannot verify", 1 if $ret eq Module::Signature::CANNOT_VERIFY(); cmp_ok $ret, '==', Module::Signature::SIGNATURE_OK(), "Valid signature"; } Module-Signature-0.83/t/wrapped-tests.bin000644 000765 000024 00000022224 13340540137 021211 0ustar00audreytstaff000000 000000 $VAR1 = { "t/test-datcrlf-signew/42.gz" => "\37\213\b\b\336\0343:\2\00342\00031\342\2\0001)\206\321\3\0\0\0", "t/test-datcrlf-signew/MANIFEST" => "MANIFEST\r\nREADME\r\nSIGNATURE\r\n42.gz\r\n", "t/test-datcrlf-signew/README" => "If this file in in a *datlf*/ directory it should be in Unix format.\r\nIn a *datcrlf*/ directory it should be in DOS format.\r\n", "t/test-datcrlf-signew/SIGNATURE" => "This file contains message digests of all files listed in MANIFEST,\nsigned via the Module::Signature module, version 0.67.\n\nTo verify the content in this distribution, first make sure you have\nModule::Signature installed, then type:\n\n % cpansign -v\n\nIt will check each file's integrity, as well as the signature's\nvalidity. If \"==> Signature verified OK! <==\" is not displayed,\nthe distribution may already have been compromised, and you should\nnot run its Makefile.PL or Build.PL.\n\n-----BEGIN PGP SIGNED MESSAGE-----\nHash: SHA1\n\nSHA1 51e1c061bc02e9a38948a5d8e3ca7352830f0fac 42.gz\nSHA1 794d166f65491a45e3a2302d9f7afc2c2220517f MANIFEST\nSHA1 e6687057436325f3cf38d3f5c9adb8f45f79b9b4 README\n-----BEGIN PGP SIGNATURE-----\nVersion: GnuPG v1.4.10 (GNU/Linux)\n\niEYEARECAAYFAk3HrSEACgkQ7IA58KMXwV07YACgkZc8HxRHWMhsbMnrxn/gCV7I\nFsoAoIG0JZLzpno/V4PpQBNaw0wqEvsB\n=io4w\n-----END PGP SIGNATURE-----\n", "t/test-datcrlf-sigold/42.gz" => "\37\213\b\b\336\0343:\2\00342\00031\342\2\0001)\206\321\3\0\0\0", "t/test-datcrlf-sigold/MANIFEST" => "MANIFEST\r\nREADME\r\nSIGNATURE\r\n42.gz\r\n", "t/test-datcrlf-sigold/README" => "If this file in in a *datlf*/ directory it should be in Unix format.\r\nIn a *datcrlf*/ directory it should be in DOS format.\r\n", "t/test-datcrlf-sigold/SIGNATURE" => "This file contains message digests of all files listed in MANIFEST,\nsigned via the Module::Signature module, version 0.63.\n\nTo verify the content in this distribution, first make sure you have\nModule::Signature installed, then type:\n\n % cpansign -v\n\nIt will check each file's integrity, as well as the signature's\nvalidity. If \"==> Signature verified OK! <==\" is not displayed,\nthe distribution may already have been compromised, and you should\nnot run its Makefile.PL or Build.PL.\n\n-----BEGIN PGP SIGNED MESSAGE-----\nHash: SHA1\n\nSHA1 51e1c061bc02e9a38948a5d8e3ca7352830f0fac 42.gz\nSHA1 794d166f65491a45e3a2302d9f7afc2c2220517f MANIFEST\nSHA1 e6687057436325f3cf38d3f5c9adb8f45f79b9b4 README\n-----BEGIN PGP SIGNATURE-----\nVersion: GnuPG v1.4.10 (GNU/Linux)\n\niEYEARECAAYFAk3HrD8ACgkQ7IA58KMXwV3vsACfXu9Z1yCErjXA4wdAaN4B/Dc9\nG8AAoJini6NfED9pJmWGcX6efvqHl1qB\n=XXLY\n-----END PGP SIGNATURE-----\n", "t/test-datlf-signew/42.gz" => "\37\213\b\b\336\0343:\2\00342\00031\342\2\0001)\206\321\3\0\0\0", "t/test-datlf-signew/MANIFEST" => "MANIFEST\nREADME\nSIGNATURE\n42.gz\n", "t/test-datlf-signew/README" => "If this file in in a *datlf*/ directory it should be in Unix format.\nIn a *datcrlf*/ directory it should be in DOS format.\n", "t/test-datlf-signew/SIGNATURE" => "This file contains message digests of all files listed in MANIFEST,\nsigned via the Module::Signature module, version 0.67.\n\nTo verify the content in this distribution, first make sure you have\nModule::Signature installed, then type:\n\n % cpansign -v\n\nIt will check each file's integrity, as well as the signature's\nvalidity. If \"==> Signature verified OK! <==\" is not displayed,\nthe distribution may already have been compromised, and you should\nnot run its Makefile.PL or Build.PL.\n\n-----BEGIN PGP SIGNED MESSAGE-----\nHash: SHA1\n\nSHA1 51e1c061bc02e9a38948a5d8e3ca7352830f0fac 42.gz\nSHA1 794d166f65491a45e3a2302d9f7afc2c2220517f MANIFEST\nSHA1 e6687057436325f3cf38d3f5c9adb8f45f79b9b4 README\n-----BEGIN PGP SIGNATURE-----\nVersion: GnuPG v1.4.10 (GNU/Linux)\n\niEYEARECAAYFAk3HrSEACgkQ7IA58KMXwV07YACgkZc8HxRHWMhsbMnrxn/gCV7I\nFsoAoIG0JZLzpno/V4PpQBNaw0wqEvsB\n=io4w\n-----END PGP SIGNATURE-----\n", "t/test-datlf-sigold/42.gz" => "\37\213\b\b\336\0343:\2\00342\00031\342\2\0001)\206\321\3\0\0\0", "t/test-datlf-sigold/MANIFEST" => "MANIFEST\nREADME\nSIGNATURE\n42.gz\n", "t/test-datlf-sigold/README" => "If this file in in a *datlf*/ directory it should be in Unix format.\nIn a *datcrlf*/ directory it should be in DOS format.\n", "t/test-datlf-sigold/SIGNATURE" => "This file contains message digests of all files listed in MANIFEST,\nsigned via the Module::Signature module, version 0.63.\n\nTo verify the content in this distribution, first make sure you have\nModule::Signature installed, then type:\n\n % cpansign -v\n\nIt will check each file's integrity, as well as the signature's\nvalidity. If \"==> Signature verified OK! <==\" is not displayed,\nthe distribution may already have been compromised, and you should\nnot run its Makefile.PL or Build.PL.\n\n-----BEGIN PGP SIGNED MESSAGE-----\nHash: SHA1\n\nSHA1 51e1c061bc02e9a38948a5d8e3ca7352830f0fac 42.gz\nSHA1 794d166f65491a45e3a2302d9f7afc2c2220517f MANIFEST\nSHA1 e6687057436325f3cf38d3f5c9adb8f45f79b9b4 README\n-----BEGIN PGP SIGNATURE-----\nVersion: GnuPG v1.4.10 (GNU/Linux)\n\niEYEARECAAYFAk3HrD8ACgkQ7IA58KMXwV3vsACfXu9Z1yCErjXA4wdAaN4B/Dc9\nG8AAoJini6NfED9pJmWGcX6efvqHl1qB\n=XXLY\n-----END PGP SIGNATURE-----\n", "t/test-datmix-signew/42.gz" => "\37\213\b\b\336\0343:\2\00342\00031\342\2\0001)\206\321\3\0\0\0", "t/test-datmix-signew/MANIFEST" => "MANIFEST\r\nREADME\nSIGNATURE\n42.gz\r\n", "t/test-datmix-signew/README" => "If this file in in a *datlf*/ directory it should be in Unix format.\nIn a *datcrlf*/ directory it should be in DOS format.\r\n", "t/test-datmix-signew/SIGNATURE" => "This file contains message digests of all files listed in MANIFEST,\nsigned via the Module::Signature module, version 0.82.\n\nTo verify the content in this distribution, first make sure you have\nModule::Signature installed, then type:\n\n % cpansign -v\n\nIt will check each file's integrity, as well as the signature's\nvalidity. If \"==> Signature verified OK! <==\" is not displayed,\nthe distribution may already have been compromised, and you should\nnot run its Makefile.PL or Build.PL.\n\n-----BEGIN PGP SIGNED MESSAGE-----\nHash: SHA256\n\nSHA1 51e1c061bc02e9a38948a5d8e3ca7352830f0fac 42.gz\nSHA1 794d166f65491a45e3a2302d9f7afc2c2220517f MANIFEST\nSHA1 e6687057436325f3cf38d3f5c9adb8f45f79b9b4 README\n-----BEGIN PGP SIGNATURE-----\n\niQIzBAEBCAAdFiEEMmeFaE5q31rFI7Zzx3wChANpBiQFAluCqCgACgkQx3wChANp\nBiQpmA/9GtHXIaSGTO62AYu/xc91CjRXSjKNVwiNmGMyEP8cjFC3sQUHYD2qx5Sh\nZxw4Met5xmKi1r2gV7gE2/+l6alMOkf6LHRPg7jRtLnx7SjdBJZwAayRnTgsBQKT\nv34s35Ew4ZdSL95LZZmffEff6CvQmTBygZZY1CQS9AHk08SgEudiuAOQ3Nt8rNzB\nxsdtCuOnY3NiG7LfQn0PY8c5ghlHb0aSghBbdmTetAZSJoU5uxj0RYHNq1lABkqJ\nXRHucvuvddmQ39hZoA5uM0qa4nMqowWctZV3yn/jIoxYew9ulkw24wnfNAJcHdkx\nG+ejCGKvY7+OJUH/vsdqnSad/028oW+4UvgiTU3P6Mvc1q+4xFeh3TmbuCkPr9Ig\nPCoq3ZVG7Y/OmB/qxJ7HbpKaF7La8O+1eLdH25UcOGTjaLNJvJQMiJ2cll/SaHqV\nLwzt5kbxzbyITpjyXF6idM3+zG/XLNX60F/OISsdQNpCd0YZUvXNJ3GBk62qv8CD\nE0PMK99PwWEzjVrxfCd9xCDySMqyoB/SW3Vaf1tKDITcqyGb/kgXw6MZbhijPZOd\ni/e+Zdm2YJb34FmU5pwsvKI+impqe+6GHQVLfCnkc22/vhMiiV+F9YT3Fk/1jaxb\nBsI1/bWUrDgggAnBxvvbs4+utOTjQCvz66YPNcykAoYDnNZtceA=\n=cvzd\n-----END PGP SIGNATURE-----\n", "t/test-datmix-sigold/42.gz" => "\37\213\b\b\336\0343:\2\00342\00031\342\2\0001)\206\321\3\0\0\0", "t/test-datmix-sigold/MANIFEST" => "MANIFEST\r\nREADME\nSIGNATURE\n42.gz\r\n", "t/test-datmix-sigold/README" => "If this file in in a *datlf*/ directory it should be in Unix format.\nIn a *datcrlf*/ directory it should be in DOS format.\r\n", "t/test-datmix-sigold/SIGNATURE" => "This file contains message digests of all files listed in MANIFEST,\nsigned via the Module::Signature module, version 0.81.\n\nTo verify the content in this distribution, first make sure you have\nModule::Signature installed, then type:\n\n % cpansign -v\n\nIt will check each file's integrity, as well as the signature's\nvalidity. If \"==> Signature verified OK! <==\" is not displayed,\nthe distribution may already have been compromised, and you should\nnot run its Makefile.PL or Build.PL.\n\n-----BEGIN PGP SIGNED MESSAGE-----\nHash: SHA256\n\nSHA1 51e1c061bc02e9a38948a5d8e3ca7352830f0fac 42.gz\nSHA1 42df4f7b8e7b2969aa2acadb656566c6cafe2d0c MANIFEST\nSHA1 01df1a2d305b103ac9b81beac8332520877af6c8 README\n-----BEGIN PGP SIGNATURE-----\n\niQIzBAEBCAAdFiEEMmeFaE5q31rFI7Zzx3wChANpBiQFAluCpB8ACgkQx3wChANp\nBiR8gxAAiTi9jjQvWHyt986YzPnVGmeKBsUlrH+mc4juSQyXpfqi+mhSlN+MX1rt\nGuI2YQxD5mXxEICc/Zh1dnquuYDYadAtPX9xtuln8Kf7RcJC3rP55f6feIZL+5sY\nfQ2+LF0T2ulIY/GSBWfXrHCv4bI5GCVg5HFZooykfpMXLcRzMp3JdA4ZcChXqw7v\nR/mPolR0PDdYG3Y1Sc5tH+vrdLZSTXvy6i8Cb+boTXtdtWCnR4LnMPaAN2p8vdt6\nUzHXr1iUZCDGcWYlWOT9WUrdDx9OMrwAIM7YQqhrLYKRJFnmSGOtAPKnLa37VpuE\ntR3qlzD6ydyO/6fFleyTVWIA5GM4BpXExYJN1iFJyqAUip2fGc4+Da4HKDauQhhm\neJj5pE2ItQUkTjIIVndLXgoOVWG2oJ9yS9Wx8rYbqvNDa1l8p5v5MYlHwcgM2+j3\n837G/r0cJeOalCoG1PWHZjQj61mXB/7eeqKm61ce3t2NzhkKqsYMWj28D5mEoTa9\n0Mn6sJil/oPoW3fQldYLCb5J56E70eQKSgSw1NqzmRJhmoufUE1WhAQ3eJT0Tqk7\nbtQYwHU6MrAAonJ/1aA94Dy9yPvp8c17kjE/ikSZHM6fKnmQInVNFIe+CExNuylT\n5kC2/BIYcyQQNbfgbnzOfQi9h2rfz+TbJUJpOYVFK7NpX2XJIjU=\n=SAkB\n-----END PGP SIGNATURE-----\n" }; Module-Signature-0.83/t/wrap.pl000644 000765 000024 00000006737 13340540137 017236 0ustar00audreytstaff000000 000000 #!/usr/bin/perl # use 5.010; use strict; use warnings; =head1 NAME =head1 SYNOPSIS t/wrap.pl -c # for create t/wrap.pl -x # for extract =head1 OPTIONS =over 8 =cut my @opt = <<'=back' =~ /B<-(\S+)>/g; =item B<-c> Wrap the test files into wrapper file =item B<-f> Path to the wrapper file. Defaults to t/wrapped-tests.bin. =item B<-help|h!> This help =item B<-x> Unwrap the test files from the wrapper file =back =head1 DESCRIPTION The t/ directory contains tests for different line endings. To distribute these tests we wrap them into a Data::Dumper file to avoid problems on distribution verification. Called with -c we create the wrapping file. Called with -x we unwrap the files and install them into place. The test t/3-verify.t calls us with -x. When anything changes that breaks 3-verify.t, then the procedure to create new test files is something like the following: (1) call wrap.pl -x (2) edit files in t/test*; take care that the files in test-datlf* have Unix line endings and the files in test-datcrlf* have DOS line endings. Apart from that keep the files identical (3) sign in t/test-datlf-sigold/ with an old version of Module::Signature (4) copy the signature over to t/test-datcrlf-sigold/ (5) sign in t/test-datlf-signew/ with the upcoming version of Module::Signature (6) copy the signature over to t/test-datcrlf-signew/ (7) call wrap.pl -c =cut use FindBin; use lib "$FindBin::Bin/../lib"; BEGIN { push @INC, qw( ); } use Data::Dumper; use File::Basename qw(dirname); use File::Path qw(mkpath); use File::Spec; use Getopt::Long; use Pod::Usage; our %Opt; GetOptions(\%Opt, @opt, ) or pod2usage(1); $Opt{f} ||= "t/wrapped-tests.bin"; sub _f ($) {File::Spec->catfile(split /\//, shift);} my @files = qw(t/test-datcrlf-signew/MANIFEST t/test-datcrlf-signew/README t/test-datcrlf-signew/42.gz t/test-datcrlf-signew/SIGNATURE t/test-datcrlf-sigold/MANIFEST t/test-datcrlf-sigold/README t/test-datcrlf-sigold/42.gz t/test-datcrlf-sigold/SIGNATURE t/test-datlf-signew/MANIFEST t/test-datlf-signew/README t/test-datlf-signew/42.gz t/test-datlf-signew/SIGNATURE t/test-datlf-sigold/MANIFEST t/test-datlf-sigold/README t/test-datlf-sigold/42.gz t/test-datlf-sigold/SIGNATURE t/test-datmix-signew/MANIFEST t/test-datmix-signew/README t/test-datmix-signew/42.gz t/test-datmix-signew/SIGNATURE t/test-datmix-sigold/MANIFEST t/test-datmix-sigold/README t/test-datmix-sigold/42.gz t/test-datmix-sigold/SIGNATURE ); my @paths = map { _f($_) } @files; if ($Opt{c}) { my $VAR; for my $i (0..$#files) { open my $fh, "<", $paths[$i] or die "Could not open '$paths[$i]': $!"; binmode $fh; local $/; $VAR->{$files[$i]} = <$fh>; } my $d = Data::Dumper->new([$VAR]); $d->Useqq(1)->Sortkeys(1); open my $fh, ">", _f($Opt{f}) or die "Could not open $Opt{f}: $!"; binmode $fh; print $fh $d->Dump; } elsif ($Opt{x}) { open my $fh, "<", _f($Opt{f}) or die "Could not open $Opt{f}: $!"; binmode $fh; local $/; my $VAR1; eval <$fh>; close $fh; for my $i (0..$#files) { mkpath dirname $paths[$i]; open my $fh, ">", $paths[$i] or die "Could not open '$paths[$i]': $!"; binmode $fh; local $\; print $fh $VAR1->{$files[$i]}; close $fh or die "Could not write $paths[$i]: $!"; } } else { warn "Either of the options -x or -c must be specified"; pod2usage(1); } # Local Variables: # mode: cperl # cperl-indent-level: 4 # End: Module-Signature-0.83/t/1-basic.t000644 000765 000024 00000000273 13340540137 017321 0ustar00audreytstaff000000 000000 #!/usr/bin/perl use strict; use Test::More tests => 2; use_ok('Module::Signature'); Module::Signature->import('SIGNATURE_OK'); ok(defined(&SIGNATURE_OK), 'constant exported'); __END__ Module-Signature-0.83/t/3-verify.t000644 000765 000024 00000001123 13340540137 017541 0ustar00audreytstaff000000 000000 #!perl use strict; use File::Spec; use Test::More; use IPC::Run qw(run); plan tests => 6; $|=1; sub _f ($) {File::Spec->catfile(split /\//, shift);} 0 == system $^X, _f"t/wrap.pl", "-x" or die; for my $tdir (glob("t/test-dat*")) { chdir $tdir or die; my @system = ($^X, "-I../../lib/", "../../script/cpansign", "-v"); my($in,$out,$err); run \@system, \$in, \$out, \$err; my $ret = $?; close $out; my $diff = join "\n", grep /^.SHA1/, split /\n/, $out; ok(0==$ret, "dir[$tdir]system[@system]ret[$ret]out[$out]err[$err]diff[$diff]"); chdir "../../" or die; } Module-Signature-0.83/inc/Module/000755 000765 000024 00000000000 13341455163 017453 5ustar00audreytstaff000000 000000 Module-Signature-0.83/inc/Module/Install/000755 000765 000024 00000000000 13341455163 021061 5ustar00audreytstaff000000 000000 Module-Signature-0.83/inc/Module/Install.pm000644 000765 000024 00000030217 13340540137 021415 0ustar00audreytstaff000000 000000 #line 1 package Module::Install; # For any maintainers: # The load order for Module::Install is a bit magic. # It goes something like this... # # IF ( host has Module::Install installed, creating author mode ) { # 1. Makefile.PL calls "use inc::Module::Install" # 2. $INC{inc/Module/Install.pm} set to installed version of inc::Module::Install # 3. The installed version of inc::Module::Install loads # 4. inc::Module::Install calls "require Module::Install" # 5. The ./inc/ version of Module::Install loads # } ELSE { # 1. Makefile.PL calls "use inc::Module::Install" # 2. $INC{inc/Module/Install.pm} set to ./inc/ version of Module::Install # 3. The ./inc/ version of Module::Install loads # } use 5.006; use strict 'vars'; use Cwd (); use File::Find (); use File::Path (); use vars qw{$VERSION $MAIN}; BEGIN { # All Module::Install core packages now require synchronised versions. # This will be used to ensure we don't accidentally load old or # different versions of modules. # This is not enforced yet, but will be some time in the next few # releases once we can make sure it won't clash with custom # Module::Install extensions. $VERSION = '1.16'; # Storage for the pseudo-singleton $MAIN = undef; *inc::Module::Install::VERSION = *VERSION; @inc::Module::Install::ISA = __PACKAGE__; } sub import { my $class = shift; my $self = $class->new(@_); my $who = $self->_caller; #------------------------------------------------------------- # all of the following checks should be included in import(), # to allow "eval 'require Module::Install; 1' to test # installation of Module::Install. (RT #51267) #------------------------------------------------------------- # Whether or not inc::Module::Install is actually loaded, the # $INC{inc/Module/Install.pm} is what will still get set as long as # the caller loaded module this in the documented manner. # If not set, the caller may NOT have loaded the bundled version, and thus # they may not have a MI version that works with the Makefile.PL. This would # result in false errors or unexpected behaviour. And we don't want that. my $file = join( '/', 'inc', split /::/, __PACKAGE__ ) . '.pm'; unless ( $INC{$file} ) { die <<"END_DIE" } Please invoke ${\__PACKAGE__} with: use inc::${\__PACKAGE__}; not: use ${\__PACKAGE__}; END_DIE # This reportedly fixes a rare Win32 UTC file time issue, but # as this is a non-cross-platform XS module not in the core, # we shouldn't really depend on it. See RT #24194 for detail. # (Also, this module only supports Perl 5.6 and above). eval "use Win32::UTCFileTime" if $^O eq 'MSWin32' && $] >= 5.006; # If the script that is loading Module::Install is from the future, # then make will detect this and cause it to re-run over and over # again. This is bad. Rather than taking action to touch it (which # is unreliable on some platforms and requires write permissions) # for now we should catch this and refuse to run. if ( -f $0 ) { my $s = (stat($0))[9]; # If the modification time is only slightly in the future, # sleep briefly to remove the problem. my $a = $s - time; if ( $a > 0 and $a < 5 ) { sleep 5 } # Too far in the future, throw an error. my $t = time; if ( $s > $t ) { die <<"END_DIE" } Your installer $0 has a modification time in the future ($s > $t). This is known to create infinite loops in make. Please correct this, then run $0 again. END_DIE } # Build.PL was formerly supported, but no longer is due to excessive # difficulty in implementing every single feature twice. if ( $0 =~ /Build.PL$/i ) { die <<"END_DIE" } Module::Install no longer supports Build.PL. It was impossible to maintain duel backends, and has been deprecated. Please remove all Build.PL files and only use the Makefile.PL installer. END_DIE #------------------------------------------------------------- # To save some more typing in Module::Install installers, every... # use inc::Module::Install # ...also acts as an implicit use strict. $^H |= strict::bits(qw(refs subs vars)); #------------------------------------------------------------- unless ( -f $self->{file} ) { foreach my $key (keys %INC) { delete $INC{$key} if $key =~ /Module\/Install/; } local $^W; require "$self->{path}/$self->{dispatch}.pm"; File::Path::mkpath("$self->{prefix}/$self->{author}"); $self->{admin} = "$self->{name}::$self->{dispatch}"->new( _top => $self ); $self->{admin}->init; @_ = ($class, _self => $self); goto &{"$self->{name}::import"}; } local $^W; *{"${who}::AUTOLOAD"} = $self->autoload; $self->preload; # Unregister loader and worker packages so subdirs can use them again delete $INC{'inc/Module/Install.pm'}; delete $INC{'Module/Install.pm'}; # Save to the singleton $MAIN = $self; return 1; } sub autoload { my $self = shift; my $who = $self->_caller; my $cwd = Cwd::getcwd(); my $sym = "${who}::AUTOLOAD"; $sym->{$cwd} = sub { my $pwd = Cwd::getcwd(); if ( my $code = $sym->{$pwd} ) { # Delegate back to parent dirs goto &$code unless $cwd eq $pwd; } unless ($$sym =~ s/([^:]+)$//) { # XXX: it looks like we can't retrieve the missing function # via $$sym (usually $main::AUTOLOAD) in this case. # I'm still wondering if we should slurp Makefile.PL to # get some context or not ... my ($package, $file, $line) = caller; die <<"EOT"; Unknown function is found at $file line $line. Execution of $file aborted due to runtime errors. If you're a contributor to a project, you may need to install some Module::Install extensions from CPAN (or other repository). If you're a user of a module, please contact the author. EOT } my $method = $1; if ( uc($method) eq $method ) { # Do nothing return; } elsif ( $method =~ /^_/ and $self->can($method) ) { # Dispatch to the root M:I class return $self->$method(@_); } # Dispatch to the appropriate plugin unshift @_, ( $self, $1 ); goto &{$self->can('call')}; }; } sub preload { my $self = shift; unless ( $self->{extensions} ) { $self->load_extensions( "$self->{prefix}/$self->{path}", $self ); } my @exts = @{$self->{extensions}}; unless ( @exts ) { @exts = $self->{admin}->load_all_extensions; } my %seen; foreach my $obj ( @exts ) { while (my ($method, $glob) = each %{ref($obj) . '::'}) { next unless $obj->can($method); next if $method =~ /^_/; next if $method eq uc($method); $seen{$method}++; } } my $who = $self->_caller; foreach my $name ( sort keys %seen ) { local $^W; *{"${who}::$name"} = sub { ${"${who}::AUTOLOAD"} = "${who}::$name"; goto &{"${who}::AUTOLOAD"}; }; } } sub new { my ($class, %args) = @_; delete $INC{'FindBin.pm'}; { # to suppress the redefine warning local $SIG{__WARN__} = sub {}; require FindBin; } # ignore the prefix on extension modules built from top level. my $base_path = Cwd::abs_path($FindBin::Bin); unless ( Cwd::abs_path(Cwd::getcwd()) eq $base_path ) { delete $args{prefix}; } return $args{_self} if $args{_self}; $args{dispatch} ||= 'Admin'; $args{prefix} ||= 'inc'; $args{author} ||= ($^O eq 'VMS' ? '_author' : '.author'); $args{bundle} ||= 'inc/BUNDLES'; $args{base} ||= $base_path; $class =~ s/^\Q$args{prefix}\E:://; $args{name} ||= $class; $args{version} ||= $class->VERSION; unless ( $args{path} ) { $args{path} = $args{name}; $args{path} =~ s!::!/!g; } $args{file} ||= "$args{base}/$args{prefix}/$args{path}.pm"; $args{wrote} = 0; bless( \%args, $class ); } sub call { my ($self, $method) = @_; my $obj = $self->load($method) or return; splice(@_, 0, 2, $obj); goto &{$obj->can($method)}; } sub load { my ($self, $method) = @_; $self->load_extensions( "$self->{prefix}/$self->{path}", $self ) unless $self->{extensions}; foreach my $obj (@{$self->{extensions}}) { return $obj if $obj->can($method); } my $admin = $self->{admin} or die <<"END_DIE"; The '$method' method does not exist in the '$self->{prefix}' path! Please remove the '$self->{prefix}' directory and run $0 again to load it. END_DIE my $obj = $admin->load($method, 1); push @{$self->{extensions}}, $obj; $obj; } sub load_extensions { my ($self, $path, $top) = @_; my $should_reload = 0; unless ( grep { ! ref $_ and lc $_ eq lc $self->{prefix} } @INC ) { unshift @INC, $self->{prefix}; $should_reload = 1; } foreach my $rv ( $self->find_extensions($path) ) { my ($file, $pkg) = @{$rv}; next if $self->{pathnames}{$pkg}; local $@; my $new = eval { local $^W; require $file; $pkg->can('new') }; unless ( $new ) { warn $@ if $@; next; } $self->{pathnames}{$pkg} = $should_reload ? delete $INC{$file} : $INC{$file}; push @{$self->{extensions}}, &{$new}($pkg, _top => $top ); } $self->{extensions} ||= []; } sub find_extensions { my ($self, $path) = @_; my @found; File::Find::find( sub { my $file = $File::Find::name; return unless $file =~ m!^\Q$path\E/(.+)\.pm\Z!is; my $subpath = $1; return if lc($subpath) eq lc($self->{dispatch}); $file = "$self->{path}/$subpath.pm"; my $pkg = "$self->{name}::$subpath"; $pkg =~ s!/!::!g; # If we have a mixed-case package name, assume case has been preserved # correctly. Otherwise, root through the file to locate the case-preserved # version of the package name. if ( $subpath eq lc($subpath) || $subpath eq uc($subpath) ) { my $content = Module::Install::_read($subpath . '.pm'); my $in_pod = 0; foreach ( split /\n/, $content ) { $in_pod = 1 if /^=\w/; $in_pod = 0 if /^=cut/; next if ($in_pod || /^=cut/); # skip pod text next if /^\s*#/; # and comments if ( m/^\s*package\s+($pkg)\s*;/i ) { $pkg = $1; last; } } } push @found, [ $file, $pkg ]; }, $path ) if -d $path; @found; } ##################################################################### # Common Utility Functions sub _caller { my $depth = 0; my $call = caller($depth); while ( $call eq __PACKAGE__ ) { $depth++; $call = caller($depth); } return $call; } # Done in evals to avoid confusing Perl::MinimumVersion eval( $] >= 5.006 ? <<'END_NEW' : <<'END_OLD' ); die $@ if $@; sub _read { local *FH; open( FH, '<', $_[0] ) or die "open($_[0]): $!"; binmode FH; my $string = do { local $/; }; close FH or die "close($_[0]): $!"; return $string; } END_NEW sub _read { local *FH; open( FH, "< $_[0]" ) or die "open($_[0]): $!"; binmode FH; my $string = do { local $/; }; close FH or die "close($_[0]): $!"; return $string; } END_OLD sub _readperl { my $string = Module::Install::_read($_[0]); $string =~ s/(?:\015{1,2}\012|\015|\012)/\n/sg; $string =~ s/(\n)\n*__(?:DATA|END)__\b.*\z/$1/s; $string =~ s/\n\n=\w+.+?\n\n=cut\b.+?\n+/\n\n/sg; return $string; } sub _readpod { my $string = Module::Install::_read($_[0]); $string =~ s/(?:\015{1,2}\012|\015|\012)/\n/sg; return $string if $_[0] =~ /\.pod\z/; $string =~ s/(^|\n=cut\b.+?\n+)[^=\s].+?\n(\n=\w+|\z)/$1$2/sg; $string =~ s/\n*=pod\b[^\n]*\n+/\n\n/sg; $string =~ s/\n*=cut\b[^\n]*\n+/\n\n/sg; $string =~ s/^\n+//s; return $string; } # Done in evals to avoid confusing Perl::MinimumVersion eval( $] >= 5.006 ? <<'END_NEW' : <<'END_OLD' ); die $@ if $@; sub _write { local *FH; open( FH, '>', $_[0] ) or die "open($_[0]): $!"; binmode FH; foreach ( 1 .. $#_ ) { print FH $_[$_] or die "print($_[0]): $!"; } close FH or die "close($_[0]): $!"; } END_NEW sub _write { local *FH; open( FH, "> $_[0]" ) or die "open($_[0]): $!"; binmode FH; foreach ( 1 .. $#_ ) { print FH $_[$_] or die "print($_[0]): $!"; } close FH or die "close($_[0]): $!"; } END_OLD # _version is for processing module versions (eg, 1.03_05) not # Perl versions (eg, 5.8.1). sub _version { my $s = shift || 0; my $d =()= $s =~ /(\.)/g; if ( $d >= 2 ) { # Normalise multipart versions $s =~ s/(\.)(\d{1,3})/sprintf("$1%03d",$2)/eg; } $s =~ s/^(\d+)\.?//; my $l = $1 || 0; my @v = map { $_ . '0' x (3 - length $_) } $s =~ /(\d{1,3})\D?/g; $l = $l . '.' . join '', @v if @v; return $l + 0; } sub _cmp { _version($_[1]) <=> _version($_[2]); } # Cloned from Params::Util::_CLASS sub _CLASS { ( defined $_[0] and ! ref $_[0] and $_[0] =~ m/^[^\W\d]\w*(?:::\w+)*\z/s ) ? $_[0] : undef; } 1; # Copyright 2008 - 2012 Adam Kennedy. Module-Signature-0.83/inc/Module/Install/Fetch.pm000644 000765 000024 00000004627 13340540137 022454 0ustar00audreytstaff000000 000000 #line 1 package Module::Install::Fetch; use strict; use Module::Install::Base (); use vars qw{$VERSION @ISA $ISCORE}; BEGIN { $VERSION = '1.16'; @ISA = 'Module::Install::Base'; $ISCORE = 1; } sub get_file { my ($self, %args) = @_; my ($scheme, $host, $path, $file) = $args{url} =~ m|^(\w+)://([^/]+)(.+)/(.+)| or return; if ( $scheme eq 'http' and ! eval { require LWP::Simple; 1 } ) { $args{url} = $args{ftp_url} or (warn("LWP support unavailable!\n"), return); ($scheme, $host, $path, $file) = $args{url} =~ m|^(\w+)://([^/]+)(.+)/(.+)| or return; } $|++; print "Fetching '$file' from $host... "; unless (eval { require Socket; Socket::inet_aton($host) }) { warn "'$host' resolve failed!\n"; return; } return unless $scheme eq 'ftp' or $scheme eq 'http'; require Cwd; my $dir = Cwd::getcwd(); chdir $args{local_dir} or return if exists $args{local_dir}; if (eval { require LWP::Simple; 1 }) { LWP::Simple::mirror($args{url}, $file); } elsif (eval { require Net::FTP; 1 }) { eval { # use Net::FTP to get past firewall my $ftp = Net::FTP->new($host, Passive => 1, Timeout => 600); $ftp->login("anonymous", 'anonymous@example.com'); $ftp->cwd($path); $ftp->binary; $ftp->get($file) or (warn("$!\n"), return); $ftp->quit; } } elsif (my $ftp = $self->can_run('ftp')) { eval { # no Net::FTP, fallback to ftp.exe require FileHandle; my $fh = FileHandle->new; local $SIG{CHLD} = 'IGNORE'; unless ($fh->open("|$ftp -n")) { warn "Couldn't open ftp: $!\n"; chdir $dir; return; } my @dialog = split(/\n/, <<"END_FTP"); open $host user anonymous anonymous\@example.com cd $path binary get $file $file quit END_FTP foreach (@dialog) { $fh->print("$_\n") } $fh->close; } } else { warn "No working 'ftp' program available!\n"; chdir $dir; return; } unless (-f $file) { warn "Fetching failed: $@\n"; chdir $dir; return; } return if exists $args{size} and -s $file != $args{size}; system($args{run}) if exists $args{run}; unlink($file) if $args{remove}; print(((!exists $args{check_for} or -e $args{check_for}) ? "done!" : "failed! ($!)"), "\n"); chdir $dir; return !$?; } 1; Module-Signature-0.83/inc/Module/Install/Metadata.pm000644 000765 000024 00000043302 13340540137 023134 0ustar00audreytstaff000000 000000 #line 1 package Module::Install::Metadata; use strict 'vars'; use Module::Install::Base (); use vars qw{$VERSION @ISA $ISCORE}; BEGIN { $VERSION = '1.16'; @ISA = 'Module::Install::Base'; $ISCORE = 1; } my @boolean_keys = qw{ sign }; my @scalar_keys = qw{ name module_name abstract version distribution_type tests installdirs }; my @tuple_keys = qw{ configure_requires build_requires requires recommends bundles resources }; my @resource_keys = qw{ homepage bugtracker repository }; my @array_keys = qw{ keywords author }; *authors = \&author; sub Meta { shift } sub Meta_BooleanKeys { @boolean_keys } sub Meta_ScalarKeys { @scalar_keys } sub Meta_TupleKeys { @tuple_keys } sub Meta_ResourceKeys { @resource_keys } sub Meta_ArrayKeys { @array_keys } foreach my $key ( @boolean_keys ) { *$key = sub { my $self = shift; if ( defined wantarray and not @_ ) { return $self->{values}->{$key}; } $self->{values}->{$key} = ( @_ ? $_[0] : 1 ); return $self; }; } foreach my $key ( @scalar_keys ) { *$key = sub { my $self = shift; return $self->{values}->{$key} if defined wantarray and !@_; $self->{values}->{$key} = shift; return $self; }; } foreach my $key ( @array_keys ) { *$key = sub { my $self = shift; return $self->{values}->{$key} if defined wantarray and !@_; $self->{values}->{$key} ||= []; push @{$self->{values}->{$key}}, @_; return $self; }; } foreach my $key ( @resource_keys ) { *$key = sub { my $self = shift; unless ( @_ ) { return () unless $self->{values}->{resources}; return map { $_->[1] } grep { $_->[0] eq $key } @{ $self->{values}->{resources} }; } return $self->{values}->{resources}->{$key} unless @_; my $uri = shift or die( "Did not provide a value to $key()" ); $self->resources( $key => $uri ); return 1; }; } foreach my $key ( grep { $_ ne "resources" } @tuple_keys) { *$key = sub { my $self = shift; return $self->{values}->{$key} unless @_; my @added; while ( @_ ) { my $module = shift or last; my $version = shift || 0; push @added, [ $module, $version ]; } push @{ $self->{values}->{$key} }, @added; return map {@$_} @added; }; } # Resource handling my %lc_resource = map { $_ => 1 } qw{ homepage license bugtracker repository }; sub resources { my $self = shift; while ( @_ ) { my $name = shift or last; my $value = shift or next; if ( $name eq lc $name and ! $lc_resource{$name} ) { die("Unsupported reserved lowercase resource '$name'"); } $self->{values}->{resources} ||= []; push @{ $self->{values}->{resources} }, [ $name, $value ]; } $self->{values}->{resources}; } # Aliases for build_requires that will have alternative # meanings in some future version of META.yml. sub test_requires { shift->build_requires(@_) } sub install_requires { shift->build_requires(@_) } # Aliases for installdirs options sub install_as_core { $_[0]->installdirs('perl') } sub install_as_cpan { $_[0]->installdirs('site') } sub install_as_site { $_[0]->installdirs('site') } sub install_as_vendor { $_[0]->installdirs('vendor') } sub dynamic_config { my $self = shift; my $value = @_ ? shift : 1; if ( $self->{values}->{dynamic_config} ) { # Once dynamic we never change to static, for safety return 0; } $self->{values}->{dynamic_config} = $value ? 1 : 0; return 1; } # Convenience command sub static_config { shift->dynamic_config(0); } sub perl_version { my $self = shift; return $self->{values}->{perl_version} unless @_; my $version = shift or die( "Did not provide a value to perl_version()" ); # Normalize the version $version = $self->_perl_version($version); # We don't support the really old versions unless ( $version >= 5.005 ) { die "Module::Install only supports 5.005 or newer (use ExtUtils::MakeMaker)\n"; } $self->{values}->{perl_version} = $version; } sub all_from { my ( $self, $file ) = @_; unless ( defined($file) ) { my $name = $self->name or die( "all_from called with no args without setting name() first" ); $file = join('/', 'lib', split(/-/, $name)) . '.pm'; $file =~ s{.*/}{} unless -e $file; unless ( -e $file ) { die("all_from cannot find $file from $name"); } } unless ( -f $file ) { die("The path '$file' does not exist, or is not a file"); } $self->{values}{all_from} = $file; # Some methods pull from POD instead of code. # If there is a matching .pod, use that instead my $pod = $file; $pod =~ s/\.pm$/.pod/i; $pod = $file unless -e $pod; # Pull the different values $self->name_from($file) unless $self->name; $self->version_from($file) unless $self->version; $self->perl_version_from($file) unless $self->perl_version; $self->author_from($pod) unless @{$self->author || []}; $self->license_from($pod) unless $self->license; $self->abstract_from($pod) unless $self->abstract; return 1; } sub provides { my $self = shift; my $provides = ( $self->{values}->{provides} ||= {} ); %$provides = (%$provides, @_) if @_; return $provides; } sub auto_provides { my $self = shift; return $self unless $self->is_admin; unless (-e 'MANIFEST') { warn "Cannot deduce auto_provides without a MANIFEST, skipping\n"; return $self; } # Avoid spurious warnings as we are not checking manifest here. local $SIG{__WARN__} = sub {1}; require ExtUtils::Manifest; local *ExtUtils::Manifest::manicheck = sub { return }; require Module::Build; my $build = Module::Build->new( dist_name => $self->name, dist_version => $self->version, license => $self->license, ); $self->provides( %{ $build->find_dist_packages || {} } ); } sub feature { my $self = shift; my $name = shift; my $features = ( $self->{values}->{features} ||= [] ); my $mods; if ( @_ == 1 and ref( $_[0] ) ) { # The user used ->feature like ->features by passing in the second # argument as a reference. Accomodate for that. $mods = $_[0]; } else { $mods = \@_; } my $count = 0; push @$features, ( $name => [ map { ref($_) ? ( ref($_) eq 'HASH' ) ? %$_ : @$_ : $_ } @$mods ] ); return @$features; } sub features { my $self = shift; while ( my ( $name, $mods ) = splice( @_, 0, 2 ) ) { $self->feature( $name, @$mods ); } return $self->{values}->{features} ? @{ $self->{values}->{features} } : (); } sub no_index { my $self = shift; my $type = shift; push @{ $self->{values}->{no_index}->{$type} }, @_ if $type; return $self->{values}->{no_index}; } sub read { my $self = shift; $self->include_deps( 'YAML::Tiny', 0 ); require YAML::Tiny; my $data = YAML::Tiny::LoadFile('META.yml'); # Call methods explicitly in case user has already set some values. while ( my ( $key, $value ) = each %$data ) { next unless $self->can($key); if ( ref $value eq 'HASH' ) { while ( my ( $module, $version ) = each %$value ) { $self->can($key)->($self, $module => $version ); } } else { $self->can($key)->($self, $value); } } return $self; } sub write { my $self = shift; return $self unless $self->is_admin; $self->admin->write_meta; return $self; } sub version_from { require ExtUtils::MM_Unix; my ( $self, $file ) = @_; $self->version( ExtUtils::MM_Unix->parse_version($file) ); # for version integrity check $self->makemaker_args( VERSION_FROM => $file ); } sub abstract_from { require ExtUtils::MM_Unix; my ( $self, $file ) = @_; $self->abstract( bless( { DISTNAME => $self->name }, 'ExtUtils::MM_Unix' )->parse_abstract($file) ); } # Add both distribution and module name sub name_from { my ($self, $file) = @_; if ( Module::Install::_read($file) =~ m/ ^ \s* package \s* ([\w:]+) [\s|;]* /ixms ) { my ($name, $module_name) = ($1, $1); $name =~ s{::}{-}g; $self->name($name); unless ( $self->module_name ) { $self->module_name($module_name); } } else { die("Cannot determine name from $file\n"); } } sub _extract_perl_version { if ( $_[0] =~ m/ ^\s* (?:use|require) \s* v? ([\d_\.]+) \s* ; /ixms ) { my $perl_version = $1; $perl_version =~ s{_}{}g; return $perl_version; } else { return; } } sub perl_version_from { my $self = shift; my $perl_version=_extract_perl_version(Module::Install::_read($_[0])); if ($perl_version) { $self->perl_version($perl_version); } else { warn "Cannot determine perl version info from $_[0]\n"; return; } } sub author_from { my $self = shift; my $content = Module::Install::_read($_[0]); if ($content =~ m/ =head \d \s+ (?:authors?)\b \s* ([^\n]*) | =head \d \s+ (?:licen[cs]e|licensing|copyright|legal)\b \s* .*? copyright .*? \d\d\d[\d.]+ \s* (?:\bby\b)? \s* ([^\n]*) /ixms) { my $author = $1 || $2; # XXX: ugly but should work anyway... if (eval "require Pod::Escapes; 1") { # Pod::Escapes has a mapping table. # It's in core of perl >= 5.9.3, and should be installed # as one of the Pod::Simple's prereqs, which is a prereq # of Pod::Text 3.x (see also below). $author =~ s{ E<( (\d+) | ([A-Za-z]+) )> } { defined $2 ? chr($2) : defined $Pod::Escapes::Name2character_number{$1} ? chr($Pod::Escapes::Name2character_number{$1}) : do { warn "Unknown escape: E<$1>"; "E<$1>"; }; }gex; } elsif (eval "require Pod::Text; 1" && $Pod::Text::VERSION < 3) { # Pod::Text < 3.0 has yet another mapping table, # though the table name of 2.x and 1.x are different. # (1.x is in core of Perl < 5.6, 2.x is in core of # Perl < 5.9.3) my $mapping = ($Pod::Text::VERSION < 2) ? \%Pod::Text::HTML_Escapes : \%Pod::Text::ESCAPES; $author =~ s{ E<( (\d+) | ([A-Za-z]+) )> } { defined $2 ? chr($2) : defined $mapping->{$1} ? $mapping->{$1} : do { warn "Unknown escape: E<$1>"; "E<$1>"; }; }gex; } else { $author =~ s{E}{<}g; $author =~ s{E}{>}g; } $self->author($author); } else { warn "Cannot determine author info from $_[0]\n"; } } #Stolen from M::B my %license_urls = ( perl => 'http://dev.perl.org/licenses/', apache => 'http://apache.org/licenses/LICENSE-2.0', apache_1_1 => 'http://apache.org/licenses/LICENSE-1.1', artistic => 'http://opensource.org/licenses/artistic-license.php', artistic_2 => 'http://opensource.org/licenses/artistic-license-2.0.php', lgpl => 'http://opensource.org/licenses/lgpl-license.php', lgpl2 => 'http://opensource.org/licenses/lgpl-2.1.php', lgpl3 => 'http://opensource.org/licenses/lgpl-3.0.html', bsd => 'http://opensource.org/licenses/bsd-license.php', gpl => 'http://opensource.org/licenses/gpl-license.php', gpl2 => 'http://opensource.org/licenses/gpl-2.0.php', gpl3 => 'http://opensource.org/licenses/gpl-3.0.html', mit => 'http://opensource.org/licenses/mit-license.php', mozilla => 'http://opensource.org/licenses/mozilla1.1.php', open_source => undef, unrestricted => undef, restrictive => undef, unknown => undef, ); sub license { my $self = shift; return $self->{values}->{license} unless @_; my $license = shift or die( 'Did not provide a value to license()' ); $license = __extract_license($license) || lc $license; $self->{values}->{license} = $license; # Automatically fill in license URLs if ( $license_urls{$license} ) { $self->resources( license => $license_urls{$license} ); } return 1; } sub _extract_license { my $pod = shift; my $matched; return __extract_license( ($matched) = $pod =~ m/ (=head \d \s+ L(?i:ICEN[CS]E|ICENSING)\b.*?) (=head \d.*|=cut.*|)\z /xms ) || __extract_license( ($matched) = $pod =~ m/ (=head \d \s+ (?:C(?i:OPYRIGHTS?)|L(?i:EGAL))\b.*?) (=head \d.*|=cut.*|)\z /xms ); } sub __extract_license { my $license_text = shift or return; my @phrases = ( '(?:under )?the same (?:terms|license) as (?:perl|the perl (?:\d )?programming language)' => 'perl', 1, '(?:under )?the terms of (?:perl|the perl programming language) itself' => 'perl', 1, 'Artistic and GPL' => 'perl', 1, 'GNU general public license' => 'gpl', 1, 'GNU public license' => 'gpl', 1, 'GNU lesser general public license' => 'lgpl', 1, 'GNU lesser public license' => 'lgpl', 1, 'GNU library general public license' => 'lgpl', 1, 'GNU library public license' => 'lgpl', 1, 'GNU Free Documentation license' => 'unrestricted', 1, 'GNU Affero General Public License' => 'open_source', 1, '(?:Free)?BSD license' => 'bsd', 1, 'Artistic license 2\.0' => 'artistic_2', 1, 'Artistic license' => 'artistic', 1, 'Apache (?:Software )?license' => 'apache', 1, 'GPL' => 'gpl', 1, 'LGPL' => 'lgpl', 1, 'BSD' => 'bsd', 1, 'Artistic' => 'artistic', 1, 'MIT' => 'mit', 1, 'Mozilla Public License' => 'mozilla', 1, 'Q Public License' => 'open_source', 1, 'OpenSSL License' => 'unrestricted', 1, 'SSLeay License' => 'unrestricted', 1, 'zlib License' => 'open_source', 1, 'proprietary' => 'proprietary', 0, ); while ( my ($pattern, $license, $osi) = splice(@phrases, 0, 3) ) { $pattern =~ s#\s+#\\s+#gs; if ( $license_text =~ /\b$pattern\b/i ) { return $license; } } return ''; } sub license_from { my $self = shift; if (my $license=_extract_license(Module::Install::_read($_[0]))) { $self->license($license); } else { warn "Cannot determine license info from $_[0]\n"; return 'unknown'; } } sub _extract_bugtracker { my @links = $_[0] =~ m#L<( https?\Q://rt.cpan.org/\E[^>]+| https?\Q://github.com/\E[\w_]+/[\w_]+/issues| https?\Q://code.google.com/p/\E[\w_\-]+/issues/list )>#gx; my %links; @links{@links}=(); @links=keys %links; return @links; } sub bugtracker_from { my $self = shift; my $content = Module::Install::_read($_[0]); my @links = _extract_bugtracker($content); unless ( @links ) { warn "Cannot determine bugtracker info from $_[0]\n"; return 0; } if ( @links > 1 ) { warn "Found more than one bugtracker link in $_[0]\n"; return 0; } # Set the bugtracker bugtracker( $links[0] ); return 1; } sub requires_from { my $self = shift; my $content = Module::Install::_readperl($_[0]); my @requires = $content =~ m/^use\s+([^\W\d]\w*(?:::\w+)*)\s+(v?[\d\.]+)/mg; while ( @requires ) { my $module = shift @requires; my $version = shift @requires; $self->requires( $module => $version ); } } sub test_requires_from { my $self = shift; my $content = Module::Install::_readperl($_[0]); my @requires = $content =~ m/^use\s+([^\W\d]\w*(?:::\w+)*)\s+([\d\.]+)/mg; while ( @requires ) { my $module = shift @requires; my $version = shift @requires; $self->test_requires( $module => $version ); } } # Convert triple-part versions (eg, 5.6.1 or 5.8.9) to # numbers (eg, 5.006001 or 5.008009). # Also, convert double-part versions (eg, 5.8) sub _perl_version { my $v = $_[-1]; $v =~ s/^([1-9])\.([1-9]\d?\d?)$/sprintf("%d.%03d",$1,$2)/e; $v =~ s/^([1-9])\.([1-9]\d?\d?)\.(0|[1-9]\d?\d?)$/sprintf("%d.%03d%03d",$1,$2,$3 || 0)/e; $v =~ s/(\.\d\d\d)000$/$1/; $v =~ s/_.+$//; if ( ref($v) ) { # Numify $v = $v + 0; } return $v; } sub add_metadata { my $self = shift; my %hash = @_; for my $key (keys %hash) { warn "add_metadata: $key is not prefixed with 'x_'.\n" . "Use appopriate function to add non-private metadata.\n" unless $key =~ /^x_/; $self->{values}->{$key} = $hash{$key}; } } ###################################################################### # MYMETA Support sub WriteMyMeta { die "WriteMyMeta has been deprecated"; } sub write_mymeta_yaml { my $self = shift; # We need YAML::Tiny to write the MYMETA.yml file unless ( eval { require YAML::Tiny; 1; } ) { return 1; } # Generate the data my $meta = $self->_write_mymeta_data or return 1; # Save as the MYMETA.yml file print "Writing MYMETA.yml\n"; YAML::Tiny::DumpFile('MYMETA.yml', $meta); } sub write_mymeta_json { my $self = shift; # We need JSON to write the MYMETA.json file unless ( eval { require JSON; 1; } ) { return 1; } # Generate the data my $meta = $self->_write_mymeta_data or return 1; # Save as the MYMETA.yml file print "Writing MYMETA.json\n"; Module::Install::_write( 'MYMETA.json', JSON->new->pretty(1)->canonical->encode($meta), ); } sub _write_mymeta_data { my $self = shift; # If there's no existing META.yml there is nothing we can do return undef unless -f 'META.yml'; # We need Parse::CPAN::Meta to load the file unless ( eval { require Parse::CPAN::Meta; 1; } ) { return undef; } # Merge the perl version into the dependencies my $val = $self->Meta->{values}; my $perl = delete $val->{perl_version}; if ( $perl ) { $val->{requires} ||= []; my $requires = $val->{requires}; # Canonize to three-dot version after Perl 5.6 if ( $perl >= 5.006 ) { $perl =~ s{^(\d+)\.(\d\d\d)(\d*)}{join('.', $1, int($2||0), int($3||0))}e } unshift @$requires, [ perl => $perl ]; } # Load the advisory META.yml file my @yaml = Parse::CPAN::Meta::LoadFile('META.yml'); my $meta = $yaml[0]; # Overwrite the non-configure dependency hashes delete $meta->{requires}; delete $meta->{build_requires}; delete $meta->{recommends}; if ( exists $val->{requires} ) { $meta->{requires} = { map { @$_ } @{ $val->{requires} } }; } if ( exists $val->{build_requires} ) { $meta->{build_requires} = { map { @$_ } @{ $val->{build_requires} } }; } return $meta; } 1; Module-Signature-0.83/inc/Module/Install/Win32.pm000644 000765 000024 00000003403 13340540137 022314 0ustar00audreytstaff000000 000000 #line 1 package Module::Install::Win32; use strict; use Module::Install::Base (); use vars qw{$VERSION @ISA $ISCORE}; BEGIN { $VERSION = '1.16'; @ISA = 'Module::Install::Base'; $ISCORE = 1; } # determine if the user needs nmake, and download it if needed sub check_nmake { my $self = shift; $self->load('can_run'); $self->load('get_file'); require Config; return unless ( $^O eq 'MSWin32' and $Config::Config{make} and $Config::Config{make} =~ /^nmake\b/i and ! $self->can_run('nmake') ); print "The required 'nmake' executable not found, fetching it...\n"; require File::Basename; my $rv = $self->get_file( url => 'http://download.microsoft.com/download/vc15/Patch/1.52/W95/EN-US/Nmake15.exe', ftp_url => 'ftp://ftp.microsoft.com/Softlib/MSLFILES/Nmake15.exe', local_dir => File::Basename::dirname($^X), size => 51928, run => 'Nmake15.exe /o > nul', check_for => 'Nmake.exe', remove => 1, ); die <<'END_MESSAGE' unless $rv; ------------------------------------------------------------------------------- Since you are using Microsoft Windows, you will need the 'nmake' utility before installation. It's available at: http://download.microsoft.com/download/vc15/Patch/1.52/W95/EN-US/Nmake15.exe or ftp://ftp.microsoft.com/Softlib/MSLFILES/Nmake15.exe Please download the file manually, save it to a directory in %PATH% (e.g. C:\WINDOWS\COMMAND\), then launch the MS-DOS command line shell, "cd" to that directory, and run "Nmake15.exe" from there; that will create the 'nmake.exe' file needed by this module. You may then resume the installation process described in README. ------------------------------------------------------------------------------- END_MESSAGE } 1; Module-Signature-0.83/inc/Module/Install/WriteAll.pm000644 000765 000024 00000002376 13340540137 023145 0ustar00audreytstaff000000 000000 #line 1 package Module::Install::WriteAll; use strict; use Module::Install::Base (); use vars qw{$VERSION @ISA $ISCORE}; BEGIN { $VERSION = '1.16'; @ISA = qw{Module::Install::Base}; $ISCORE = 1; } sub WriteAll { my $self = shift; my %args = ( meta => 1, sign => 0, inline => 0, check_nmake => 1, @_, ); $self->sign(1) if $args{sign}; $self->admin->WriteAll(%args) if $self->is_admin; $self->check_nmake if $args{check_nmake}; unless ( $self->makemaker_args->{PL_FILES} ) { # XXX: This still may be a bit over-defensive... unless ($self->makemaker(6.25)) { $self->makemaker_args( PL_FILES => {} ) if -f 'Build.PL'; } } # Until ExtUtils::MakeMaker support MYMETA.yml, make sure # we clean it up properly ourself. $self->realclean_files('MYMETA.yml'); if ( $args{inline} ) { $self->Inline->write; } else { $self->Makefile->write; } # The Makefile write process adds a couple of dependencies, # so write the META.yml files after the Makefile. if ( $args{meta} ) { $self->Meta->write; } # Experimental support for MYMETA if ( $ENV{X_MYMETA} ) { if ( $ENV{X_MYMETA} eq 'JSON' ) { $self->Meta->write_mymeta_json; } else { $self->Meta->write_mymeta_yaml; } } return 1; } 1; Module-Signature-0.83/inc/Module/Install/Can.pm000644 000765 000024 00000006157 13340540137 022124 0ustar00audreytstaff000000 000000 #line 1 package Module::Install::Can; use strict; use Config (); use ExtUtils::MakeMaker (); use Module::Install::Base (); use vars qw{$VERSION @ISA $ISCORE}; BEGIN { $VERSION = '1.16'; @ISA = 'Module::Install::Base'; $ISCORE = 1; } # check if we can load some module ### Upgrade this to not have to load the module if possible sub can_use { my ($self, $mod, $ver) = @_; $mod =~ s{::|\\}{/}g; $mod .= '.pm' unless $mod =~ /\.pm$/i; my $pkg = $mod; $pkg =~ s{/}{::}g; $pkg =~ s{\.pm$}{}i; local $@; eval { require $mod; $pkg->VERSION($ver || 0); 1 }; } # Check if we can run some command sub can_run { my ($self, $cmd) = @_; my $_cmd = $cmd; return $_cmd if (-x $_cmd or $_cmd = MM->maybe_command($_cmd)); for my $dir ((split /$Config::Config{path_sep}/, $ENV{PATH}), '.') { next if $dir eq ''; require File::Spec; my $abs = File::Spec->catfile($dir, $cmd); return $abs if (-x $abs or $abs = MM->maybe_command($abs)); } return; } # Can our C compiler environment build XS files sub can_xs { my $self = shift; # Ensure we have the CBuilder module $self->configure_requires( 'ExtUtils::CBuilder' => 0.27 ); # Do we have the configure_requires checker? local $@; eval "require ExtUtils::CBuilder;"; if ( $@ ) { # They don't obey configure_requires, so it is # someone old and delicate. Try to avoid hurting # them by falling back to an older simpler test. return $self->can_cc(); } # Do we have a working C compiler my $builder = ExtUtils::CBuilder->new( quiet => 1, ); unless ( $builder->have_compiler ) { # No working C compiler return 0; } # Write a C file representative of what XS becomes require File::Temp; my ( $FH, $tmpfile ) = File::Temp::tempfile( "compilexs-XXXXX", SUFFIX => '.c', ); binmode $FH; print $FH <<'END_C'; #include "EXTERN.h" #include "perl.h" #include "XSUB.h" int main(int argc, char **argv) { return 0; } int boot_sanexs() { return 1; } END_C close $FH; # Can the C compiler access the same headers XS does my @libs = (); my $object = undef; eval { local $^W = 0; $object = $builder->compile( source => $tmpfile, ); @libs = $builder->link( objects => $object, module_name => 'sanexs', ); }; my $result = $@ ? 0 : 1; # Clean up all the build files foreach ( $tmpfile, $object, @libs ) { next unless defined $_; 1 while unlink; } return $result; } # Can we locate a (the) C compiler sub can_cc { my $self = shift; my @chunks = split(/ /, $Config::Config{cc}) or return; # $Config{cc} may contain args; try to find out the program part while (@chunks) { return $self->can_run("@chunks") || (pop(@chunks), next); } return; } # Fix Cygwin bug on maybe_command(); if ( $^O eq 'cygwin' ) { require ExtUtils::MM_Cygwin; require ExtUtils::MM_Win32; if ( ! defined(&ExtUtils::MM_Cygwin::maybe_command) ) { *ExtUtils::MM_Cygwin::maybe_command = sub { my ($self, $file) = @_; if ($file =~ m{^/cygdrive/}i and ExtUtils::MM_Win32->can('maybe_command')) { ExtUtils::MM_Win32->maybe_command($file); } else { ExtUtils::MM_Unix->maybe_command($file); } } } } 1; __END__ #line 236 Module-Signature-0.83/inc/Module/Install/Makefile.pm000644 000765 000024 00000027437 13340540137 023144 0ustar00audreytstaff000000 000000 #line 1 package Module::Install::Makefile; use strict 'vars'; use ExtUtils::MakeMaker (); use Module::Install::Base (); use Fcntl qw/:flock :seek/; use vars qw{$VERSION @ISA $ISCORE}; BEGIN { $VERSION = '1.16'; @ISA = 'Module::Install::Base'; $ISCORE = 1; } sub Makefile { $_[0] } my %seen = (); sub prompt { shift; # Infinite loop protection my @c = caller(); if ( ++$seen{"$c[1]|$c[2]|$_[0]"} > 3 ) { die "Caught an potential prompt infinite loop ($c[1]|$c[2]|$_[0])"; } # In automated testing or non-interactive session, always use defaults if ( ($ENV{AUTOMATED_TESTING} or -! -t STDIN) and ! $ENV{PERL_MM_USE_DEFAULT} ) { local $ENV{PERL_MM_USE_DEFAULT} = 1; goto &ExtUtils::MakeMaker::prompt; } else { goto &ExtUtils::MakeMaker::prompt; } } # Store a cleaned up version of the MakeMaker version, # since we need to behave differently in a variety of # ways based on the MM version. my $makemaker = eval $ExtUtils::MakeMaker::VERSION; # If we are passed a param, do a "newer than" comparison. # Otherwise, just return the MakeMaker version. sub makemaker { ( @_ < 2 or $makemaker >= eval($_[1]) ) ? $makemaker : 0 } # Ripped from ExtUtils::MakeMaker 6.56, and slightly modified # as we only need to know here whether the attribute is an array # or a hash or something else (which may or may not be appendable). my %makemaker_argtype = ( C => 'ARRAY', CONFIG => 'ARRAY', # CONFIGURE => 'CODE', # ignore DIR => 'ARRAY', DL_FUNCS => 'HASH', DL_VARS => 'ARRAY', EXCLUDE_EXT => 'ARRAY', EXE_FILES => 'ARRAY', FUNCLIST => 'ARRAY', H => 'ARRAY', IMPORTS => 'HASH', INCLUDE_EXT => 'ARRAY', LIBS => 'ARRAY', # ignore '' MAN1PODS => 'HASH', MAN3PODS => 'HASH', META_ADD => 'HASH', META_MERGE => 'HASH', PL_FILES => 'HASH', PM => 'HASH', PMLIBDIRS => 'ARRAY', PMLIBPARENTDIRS => 'ARRAY', PREREQ_PM => 'HASH', CONFIGURE_REQUIRES => 'HASH', SKIP => 'ARRAY', TYPEMAPS => 'ARRAY', XS => 'HASH', # VERSION => ['version',''], # ignore # _KEEP_AFTER_FLUSH => '', clean => 'HASH', depend => 'HASH', dist => 'HASH', dynamic_lib=> 'HASH', linkext => 'HASH', macro => 'HASH', postamble => 'HASH', realclean => 'HASH', test => 'HASH', tool_autosplit => 'HASH', # special cases where you can use makemaker_append CCFLAGS => 'APPENDABLE', DEFINE => 'APPENDABLE', INC => 'APPENDABLE', LDDLFLAGS => 'APPENDABLE', LDFROM => 'APPENDABLE', ); sub makemaker_args { my ($self, %new_args) = @_; my $args = ( $self->{makemaker_args} ||= {} ); foreach my $key (keys %new_args) { if ($makemaker_argtype{$key}) { if ($makemaker_argtype{$key} eq 'ARRAY') { $args->{$key} = [] unless defined $args->{$key}; unless (ref $args->{$key} eq 'ARRAY') { $args->{$key} = [$args->{$key}] } push @{$args->{$key}}, ref $new_args{$key} eq 'ARRAY' ? @{$new_args{$key}} : $new_args{$key}; } elsif ($makemaker_argtype{$key} eq 'HASH') { $args->{$key} = {} unless defined $args->{$key}; foreach my $skey (keys %{ $new_args{$key} }) { $args->{$key}{$skey} = $new_args{$key}{$skey}; } } elsif ($makemaker_argtype{$key} eq 'APPENDABLE') { $self->makemaker_append($key => $new_args{$key}); } } else { if (defined $args->{$key}) { warn qq{MakeMaker attribute "$key" is overriden; use "makemaker_append" to append values\n}; } $args->{$key} = $new_args{$key}; } } return $args; } # For mm args that take multiple space-separated args, # append an argument to the current list. sub makemaker_append { my $self = shift; my $name = shift; my $args = $self->makemaker_args; $args->{$name} = defined $args->{$name} ? join( ' ', $args->{$name}, @_ ) : join( ' ', @_ ); } sub build_subdirs { my $self = shift; my $subdirs = $self->makemaker_args->{DIR} ||= []; for my $subdir (@_) { push @$subdirs, $subdir; } } sub clean_files { my $self = shift; my $clean = $self->makemaker_args->{clean} ||= {}; %$clean = ( %$clean, FILES => join ' ', grep { length $_ } ($clean->{FILES} || (), @_), ); } sub realclean_files { my $self = shift; my $realclean = $self->makemaker_args->{realclean} ||= {}; %$realclean = ( %$realclean, FILES => join ' ', grep { length $_ } ($realclean->{FILES} || (), @_), ); } sub libs { my $self = shift; my $libs = ref $_[0] ? shift : [ shift ]; $self->makemaker_args( LIBS => $libs ); } sub inc { my $self = shift; $self->makemaker_args( INC => shift ); } sub _wanted_t { } sub tests_recursive { my $self = shift; my $dir = shift || 't'; unless ( -d $dir ) { die "tests_recursive dir '$dir' does not exist"; } my %tests = map { $_ => 1 } split / /, ($self->tests || ''); require File::Find; File::Find::find( sub { /\.t$/ and -f $_ and $tests{"$File::Find::dir/*.t"} = 1 }, $dir ); $self->tests( join ' ', sort keys %tests ); } sub write { my $self = shift; die "&Makefile->write() takes no arguments\n" if @_; # Check the current Perl version my $perl_version = $self->perl_version; if ( $perl_version ) { eval "use $perl_version; 1" or die "ERROR: perl: Version $] is installed, " . "but we need version >= $perl_version"; } # Make sure we have a new enough MakeMaker require ExtUtils::MakeMaker; if ( $perl_version and $self->_cmp($perl_version, '5.006') >= 0 ) { # This previous attempted to inherit the version of # ExtUtils::MakeMaker in use by the module author, but this # was found to be untenable as some authors build releases # using future dev versions of EU:MM that nobody else has. # Instead, #toolchain suggests we use 6.59 which is the most # stable version on CPAN at time of writing and is, to quote # ribasushi, "not terminally fucked, > and tested enough". # TODO: We will now need to maintain this over time to push # the version up as new versions are released. $self->build_requires( 'ExtUtils::MakeMaker' => 6.59 ); $self->configure_requires( 'ExtUtils::MakeMaker' => 6.59 ); } else { # Allow legacy-compatibility with 5.005 by depending on the # most recent EU:MM that supported 5.005. $self->build_requires( 'ExtUtils::MakeMaker' => 6.36 ); $self->configure_requires( 'ExtUtils::MakeMaker' => 6.36 ); } # Generate the MakeMaker params my $args = $self->makemaker_args; $args->{DISTNAME} = $self->name; $args->{NAME} = $self->module_name || $self->name; $args->{NAME} =~ s/-/::/g; $args->{VERSION} = $self->version or die <<'EOT'; ERROR: Can't determine distribution version. Please specify it explicitly via 'version' in Makefile.PL, or set a valid $VERSION in a module, and provide its file path via 'version_from' (or 'all_from' if you prefer) in Makefile.PL. EOT if ( $self->tests ) { my @tests = split ' ', $self->tests; my %seen; $args->{test} = { TESTS => (join ' ', grep {!$seen{$_}++} @tests), }; } elsif ( $Module::Install::ExtraTests::use_extratests ) { # Module::Install::ExtraTests doesn't set $self->tests and does its own tests via harness. # So, just ignore our xt tests here. } elsif ( -d 'xt' and ($Module::Install::AUTHOR or $ENV{RELEASE_TESTING}) ) { $args->{test} = { TESTS => join( ' ', map { "$_/*.t" } grep { -d $_ } qw{ t xt } ), }; } if ( $] >= 5.005 ) { $args->{ABSTRACT} = $self->abstract; $args->{AUTHOR} = join ', ', @{$self->author || []}; } if ( $self->makemaker(6.10) ) { $args->{NO_META} = 1; #$args->{NO_MYMETA} = 1; } if ( $self->makemaker(6.17) and $self->sign ) { $args->{SIGN} = 1; } unless ( $self->is_admin ) { delete $args->{SIGN}; } if ( $self->makemaker(6.31) and $self->license ) { $args->{LICENSE} = $self->license; } my $prereq = ($args->{PREREQ_PM} ||= {}); %$prereq = ( %$prereq, map { @$_ } # flatten [module => version] map { @$_ } grep $_, ($self->requires) ); # Remove any reference to perl, PREREQ_PM doesn't support it delete $args->{PREREQ_PM}->{perl}; # Merge both kinds of requires into BUILD_REQUIRES my $build_prereq = ($args->{BUILD_REQUIRES} ||= {}); %$build_prereq = ( %$build_prereq, map { @$_ } # flatten [module => version] map { @$_ } grep $_, ($self->configure_requires, $self->build_requires) ); # Remove any reference to perl, BUILD_REQUIRES doesn't support it delete $args->{BUILD_REQUIRES}->{perl}; # Delete bundled dists from prereq_pm, add it to Makefile DIR my $subdirs = ($args->{DIR} || []); if ($self->bundles) { my %processed; foreach my $bundle (@{ $self->bundles }) { my ($mod_name, $dist_dir) = @$bundle; delete $prereq->{$mod_name}; $dist_dir = File::Basename::basename($dist_dir); # dir for building this module if (not exists $processed{$dist_dir}) { if (-d $dist_dir) { # List as sub-directory to be processed by make push @$subdirs, $dist_dir; } # Else do nothing: the module is already present on the system $processed{$dist_dir} = undef; } } } unless ( $self->makemaker('6.55_03') ) { %$prereq = (%$prereq,%$build_prereq); delete $args->{BUILD_REQUIRES}; } if ( my $perl_version = $self->perl_version ) { eval "use $perl_version; 1" or die "ERROR: perl: Version $] is installed, " . "but we need version >= $perl_version"; if ( $self->makemaker(6.48) ) { $args->{MIN_PERL_VERSION} = $perl_version; } } if ($self->installdirs) { warn qq{old INSTALLDIRS (probably set by makemaker_args) is overriden by installdirs\n} if $args->{INSTALLDIRS}; $args->{INSTALLDIRS} = $self->installdirs; } my %args = map { ( $_ => $args->{$_} ) } grep {defined($args->{$_} ) } keys %$args; my $user_preop = delete $args{dist}->{PREOP}; if ( my $preop = $self->admin->preop($user_preop) ) { foreach my $key ( keys %$preop ) { $args{dist}->{$key} = $preop->{$key}; } } my $mm = ExtUtils::MakeMaker::WriteMakefile(%args); $self->fix_up_makefile($mm->{FIRST_MAKEFILE} || 'Makefile'); } sub fix_up_makefile { my $self = shift; my $makefile_name = shift; my $top_class = ref($self->_top) || ''; my $top_version = $self->_top->VERSION || ''; my $preamble = $self->preamble ? "# Preamble by $top_class $top_version\n" . $self->preamble : ''; my $postamble = "# Postamble by $top_class $top_version\n" . ($self->postamble || ''); local *MAKEFILE; open MAKEFILE, "+< $makefile_name" or die "fix_up_makefile: Couldn't open $makefile_name: $!"; eval { flock MAKEFILE, LOCK_EX }; my $makefile = do { local $/; }; $makefile =~ s/\b(test_harness\(\$\(TEST_VERBOSE\), )/$1'inc', /; $makefile =~ s/( -I\$\(INST_ARCHLIB\))/ -Iinc$1/g; $makefile =~ s/( "-I\$\(INST_LIB\)")/ "-Iinc"$1/g; $makefile =~ s/^(FULLPERL = .*)/$1 "-Iinc"/m; $makefile =~ s/^(PERL = .*)/$1 "-Iinc"/m; # Module::Install will never be used to build the Core Perl # Sometimes PERL_LIB and PERL_ARCHLIB get written anyway, which breaks # PREFIX/PERL5LIB, and thus, install_share. Blank them if they exist $makefile =~ s/^PERL_LIB = .+/PERL_LIB =/m; #$makefile =~ s/^PERL_ARCHLIB = .+/PERL_ARCHLIB =/m; # Perl 5.005 mentions PERL_LIB explicitly, so we have to remove that as well. $makefile =~ s/(\"?)-I\$\(PERL_LIB\)\1//g; # XXX - This is currently unused; not sure if it breaks other MM-users # $makefile =~ s/^pm_to_blib\s+:\s+/pm_to_blib :: /mg; seek MAKEFILE, 0, SEEK_SET; truncate MAKEFILE, 0; print MAKEFILE "$preamble$makefile$postamble" or die $!; close MAKEFILE or die $!; 1; } sub preamble { my ($self, $text) = @_; $self->{preamble} = $text . $self->{preamble} if defined $text; $self->{preamble}; } sub postamble { my ($self, $text) = @_; $self->{postamble} ||= $self->admin->postamble; $self->{postamble} .= $text if defined $text; $self->{postamble} } 1; __END__ #line 544 Module-Signature-0.83/inc/Module/Install/External.pm000644 000765 000024 00000003545 13340540137 023203 0ustar00audreytstaff000000 000000 #line 1 package Module::Install::External; # Provides dependency declarations for external non-Perl things use strict; use Module::Install::Base (); use vars qw{$VERSION $ISCORE @ISA}; BEGIN { $VERSION = '1.16'; $ISCORE = 1; @ISA = qw{Module::Install::Base}; } sub requires_xs { my $self = shift; # First check for the basic C compiler $self->requires_external_cc; # We need a C compiler that can build XS files unless ( $self->can_xs ) { print "Unresolvable missing external dependency.\n"; print "This package requires perl's header files.\n"; print STDERR "NA: Unable to build distribution on this platform.\n"; exit(0); } 1; } sub requires_external_cc { my $self = shift; # We need a C compiler, use the can_cc method for this unless ( $self->can_cc ) { print "Unresolvable missing external dependency.\n"; print "This package requires a C compiler.\n"; print STDERR "NA: Unable to build distribution on this platform.\n"; exit(0); } # Unlike some of the other modules, while we need to specify a # C compiler as a dep, it needs to be a build-time dependency. 1; } sub requires_external_bin { my ($self, $bin, $version) = @_; if ( $version ) { die "requires_external_bin does not support versions yet"; } # Load the package containing can_run early, # to avoid breaking the message below. $self->load('can_run'); # Locate the bin print "Locating bin:$bin..."; my $found_bin = $self->can_run( $bin ); if ( $found_bin ) { print " found at $found_bin.\n"; } else { print " missing.\n"; print "Unresolvable missing external dependency.\n"; print "Please install '$bin' seperately and try again.\n"; print STDERR "NA: Unable to build distribution on this platform.\n"; exit(0); } # Once we have some way to specify external deps, do it here. # In the mean time, continue as normal. 1; } 1; __END__ #line 171 Module-Signature-0.83/inc/Module/Install/Scripts.pm000644 000765 000024 00000001011 13340540137 023032 0ustar00audreytstaff000000 000000 #line 1 package Module::Install::Scripts; use strict 'vars'; use Module::Install::Base (); use vars qw{$VERSION @ISA $ISCORE}; BEGIN { $VERSION = '1.16'; @ISA = 'Module::Install::Base'; $ISCORE = 1; } sub install_script { my $self = shift; my $args = $self->makemaker_args; my $exe = $args->{EXE_FILES} ||= []; foreach ( @_ ) { if ( -f $_ ) { push @$exe, $_; } elsif ( -d 'script' and -f "script/$_" ) { push @$exe, "script/$_"; } else { die("Cannot find script '$_'"); } } } 1; Module-Signature-0.83/inc/Module/Install/Base.pm000644 000765 000024 00000002147 13340540137 022270 0ustar00audreytstaff000000 000000 #line 1 package Module::Install::Base; use strict 'vars'; use vars qw{$VERSION}; BEGIN { $VERSION = '1.16'; } # Suspend handler for "redefined" warnings BEGIN { my $w = $SIG{__WARN__}; $SIG{__WARN__} = sub { $w }; } #line 42 sub new { my $class = shift; unless ( defined &{"${class}::call"} ) { *{"${class}::call"} = sub { shift->_top->call(@_) }; } unless ( defined &{"${class}::load"} ) { *{"${class}::load"} = sub { shift->_top->load(@_) }; } bless { @_ }, $class; } #line 61 sub AUTOLOAD { local $@; my $func = eval { shift->_top->autoload } or return; goto &$func; } #line 75 sub _top { $_[0]->{_top}; } #line 90 sub admin { $_[0]->_top->{admin} or Module::Install::Base::FakeAdmin->new; } #line 106 sub is_admin { ! $_[0]->admin->isa('Module::Install::Base::FakeAdmin'); } sub DESTROY {} package Module::Install::Base::FakeAdmin; use vars qw{$VERSION}; BEGIN { $VERSION = $Module::Install::Base::VERSION; } my $fake; sub new { $fake ||= bless(\@_, $_[0]); } sub AUTOLOAD {} sub DESTROY {} # Restore warning handler BEGIN { $SIG{__WARN__} = $SIG{__WARN__}->(); } 1; #line 159