Module-Signature-0.89/0000755000175000017500000000000014671312541013006 5ustar timtimModule-Signature-0.89/PAUSE2022.pub0000644000175000017500000011332614663477170014722 0ustar timtimgpg --export --armor 450F89EC -----BEGIN PGP PUBLIC KEY BLOCK----- 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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 55YO2ILV37fmSQ57ezqz1yw= =NaWa -----END PGP PUBLIC KEY BLOCK----- Module-Signature-0.89/AUDREYT2018.pub0000644000175000017500000005467014663477170015175 0ustar timtim-----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.89/t/0000755000175000017500000000000014671312541013251 5ustar timtimModule-Signature-0.89/t/1-basic.t0000644000175000017500000000027314663477170014672 0ustar timtim#!/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.89/t/0-signature.t0000644000175000017500000000171614671312264015603 0ustar timtim#!/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('keyserver.ubuntu.com') }) { 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.89/t/wrap.pl0000644000175000017500000000673714663477170014607 0ustar timtim#!/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.89/t/3-verify.t0000644000175000017500000000135014663477170015114 0ustar timtim#!perl use strict; use File::Spec; use Test::More; use IPC::Run qw(run); if (eval { require Crypt::OpenPGP; 1 }) { plan skip_all => "GnuPG only tests"; exit 0; } 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 /^.SHA\d/, split /\n/, $out; $err =~ s/Old SIGNATURE detected.*newer\.//; ok(0==$ret, "dir[$tdir]system[@system]ret[$ret]out[$out]err[$err]diff[$diff]"); chdir "../../" or die; } Module-Signature-0.89/t/2-cygwin.t0000644000175000017500000000074614663477170015117 0ustar timtim#!/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.89/t/wrapped-tests.bin0000644000175000017500000002234314663477170016564 0ustar timtim$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.84.\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: RIPEMD160\n\nSHA256 787e758a975d04560f6a9d4671646a48c4e9da4f40d4e102bc4562cd15c71ab5 42.gz\nSHA256 d8663a9b3fa46b2c4eab89c0a57e6b03089153bc9d5bfc5166642ea272d4da18 MANIFEST\nSHA256 7c2d6914637135b77ffd90242627efa905c2843e5fdcabe15612a2dd8d616521 README\n-----BEGIN PGP SIGNATURE-----\n\niQIzBAEBAwAdFiEEMmeFaE5q31rFI7Zzx3wChANpBiQFAluG0OYACgkQx3wChANp\nBiSjBhAAodCH9AE81Xii9wy/Wid2vu9LwKAT2KVMR/6dZbVx5MIBQz5KrgjmOvtm\niaPm1nGYYQr0Cf/8D/vwfOlyW6CRDQ9J9NVY2wkKSm98H1vsw6QUFrBOUoEGqwhc\n6eurldfeA8KZIrGV3WTsrPa7uKiYeDUJfVjuLaMMyW4rqSqYB+Zv8PzA7Q/7V8pJ\njWXhVRiuc7Qlx1DXDQyxJdK5jtCtsZ7c37UyuFnTRWRpNylFY0eUbw+z4BEFGI/s\n3jJRDCWpBv17/rYMAXnXt5/F1VKP1tAVR43pHa59wEqCw4q2Q3pY4PG29I1FWHah\nvXaVVg5YTqd2TlAGgQYnYYeQ3B6d8W92ENnECNjUlQU0Gy6nlzxNkUSLhpKskNra\na6MbnyXk48bcYsnP9p2uSniWQFt0sVqFSgzfkr4c+gpR+jx6OqQoJqQCbucnwh1p\nVZsccMNs+pA3d2qwy0SrHO8VweWshZYp7HJgGSjKImCW4uWFXW6vYmVE58vYFHMb\nNytIJP/beklV53QmFcuVNJUrhh4L2G/KVVql1dgVEFPVtIDuMfiZgej8IQNLyv3T\ns4m8oaE4Rx5gsl+9tQFiInh45jT96gFUEmgN+u3Am8CgmZVUf1tq3gg7EyTiBUAO\nqjIe2fQ4p+bbjIQu1rNkReemL1AZEszBghUgjRmb9FASeQUSiC0=\n=p35e\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: SHA1\n\nSHA1 51e1c061bc02e9a38948a5d8e3ca7352830f0fac 42.gz\nSHA1 42df4f7b8e7b2969aa2acadb656566c6cafe2d0c MANIFEST\nSHA1 01df1a2d305b103ac9b81beac8332520877af6c8 README\n-----BEGIN PGP SIGNATURE-----\n\niQIzBAEBAgAdFiEEMmeFaE5q31rFI7Zzx3wChANpBiQFAluG0KUACgkQx3wChANp\nBiSq1g//UmDkPeJYgq/V+VXLX7GBKGsOPbRhQkPPeb5utI10AHYzq4q0V/UGeKQN\nf4eXzjp9P7wfu9mrAfMKfvF8rmDSA45SKVWegeGIqREgKtrJTm5QsO6b87DjHwoI\nrBDLrtsZ6J42FSP2V4juUqZfMmtQ+dzCCeUxKm/t4M0tTdzj0DBee3z1kox3eEHZ\nX6m14gQCiB4GWgXuvkI0zKbTRnuxSy7i0iZBCEVeetTGCpT49woyHLggUuOvRyzy\nO+O0KyvfYCmm0CtPlo3KIE1wt0SokDUNGR6qvAwPN+2BnC/59g3xp3s9qn2OatDa\n1gQeFuulAa5UBvBBy6TKMIMUc8KCWI52K9xv0oKF7oRl3Pk39b1IXbfdXUPIY2M5\nhwBLNBubHGaPNF6Pdxr6iHsrtJy3WwasQUUOSw9T3aHJHgNphHrwkldzwvVPMeoR\nPOc1V9TLhqDd/K5MrThmc9rmR2tFSZZM0sQT1lFe0cq1fDL0z1ZdjFGLaqKUgeM9\nmeDqrKGdFlFbNqdfnR+uTgPK/8sqmsbLRX+mAO8TKAH8dgJ8gaOwR1mqexvx+HFW\npUREMfiCyFvYu+TnBwSa3aWd/LNIAKqIjVs8Ho6Ol0pP23+bct6lYuGiy3JFe+TQ\nuiOUpJZ2+w1NaTjNVDT8LMm3E4Fae3KynfyP4C1vvjg251JCCeI=\n=9Lmf\n-----END PGP SIGNATURE-----\n" }; Module-Signature-0.89/SIGNATURE0000644000175000017500000000776714671312274014316 0ustar timtimThis file contains message digests of all files listed in MANIFEST, signed via the Module::Signature module, version 0.88. 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: RIPEMD160 SHA256 0f80cd4bfc5ad95a0cfcdc43629c819991431e82f0a4a2dd4edf7d54f3b63d2a ANDK2020.pub SHA256 1847f802a331b202eae02729e828d6b59ef4c6129020660ecd6865b67ec4dfb5 AUDREYT2018.pub SHA256 3b6ee84c36f61397e9aa6389836e3535eb8aa56bdc80029a90cbac347937c17d AUTHORS SHA256 6ed0d92fb171ce37b402f6753caa8e4f50f58f66b106c33f88103fc12976c0ed Changes SHA256 39124780bcba2341f2094d39f1555ab684a7bebefb8185fe1138defce961bec5 MANIFEST SHA256 093c47e35166ca8f4d6cb4a1d51b436809a4fca4bdb43221bd8fb67adac2e425 MANIFEST.SKIP SHA256 b855fde125d0fe54c8e5c2bdc9da2f192a0f53ec5a62662abf0bcde627a1ba6a META.yml SHA256 333ec192d791db2ee22c59c7beb41442a3edb9ad4d46b5736553ad7d407ec3e9 Makefile.PL SHA256 c9b4cc9f924857b93a081066bdc7f120e537469c1b605e19c1f07296ac07cfdd NIKLASHOLM2018.pub SHA256 57fe88a2c9a3498776dc12a9ae6bc4151028c84d3a48de6b0addf6c32e9dbb90 PAUSE2022.pub SHA256 05e28ec644f3a319ca09ede9e5ff43c34673b44dac4f1e956430640d4b97f054 README SHA256 eab9484f721cdc42c6022c8008cb04b76a3b7f1c38e5299a29af0c851860ca21 TIMLEGGE2024.pub 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 b0da6bd1227019c273e2f81f155e62fd18e0dac1d14181d6cbf00028a8466d38 lib/Module/Signature.pm SHA256 51aa9c445c6f54c26fc37d5ec2e42535461eb3a78911ca2516dd1c97e7aa7185 script/cpansign SHA256 c3780d88e3137ebbdd849d22f4a45c25e0fe24a74d4d2e041fae8788deb4dc89 t/0-signature.t SHA256 9be1e82eed0cb08514d2e3654b1396a23e5dd89ca8a5e67788ac6492697a5ce3 t/1-basic.t SHA256 ae0a2706d9dbe8cb3d0c3b948af76c42a9e6138bc21a45a5c82e655a412daf8a t/2-cygwin.t SHA256 243dabeec125f45c94af8c7ab33bd88bd9e4bd2fc7a523fea659c967f21d70f9 t/3-verify.t SHA256 2b17f99fccb7172b580ecde8839860f5db05292ea25391d9ea60839b45d5ac9a t/wrap.pl SHA256 1e55d31ce050bd8250d7f5e74afdbb050fdf34834e0925f6992400e6a35ee87a t/wrapped-tests.bin -----BEGIN PGP SIGNATURE----- iQIzBAEBAwAdFiEEMguXHBCUSzAt6mNu1fh7LgYGpfkFAmbk39kACgkQ1fh7LgYG pflfqw//VBqgim2LE1FftFmU2jtgFXFGkqxAZadd+QN+3Y4PwiU8N9F7HxT7KSd6 otd3d85/4AkwPp8qOnMSSMEW2wRbiqyqyRDobf1TTPZueSjFbwKpGxOXakEWZ6EN 6VUyh27SM4ZIhvAGn0rN2R/pRhH4vIOg3EF4GUGeuK/m9qXBZzW2dOnsR40EoRqL Vl576ja4vGwrteeDGDCGPiM+lyxkY3Ja8I1ASviS7HHOyN+xIQnQ1qpxoX2jlo5O oWBTt+26FNe7L+gp5v2jzuZoihPu3I+UVW/BzDMBwq8hn9/0S6d0HXJ1gZ2Sd11L YI6mohvPXENtP70urtouQ30ajHHEka8PgDMz+HpnCrS08TXnDsybd9fUf6gXChpo IE851cTTD0gNSu3ANzMdvgwl8xJu+r/CuVOVKqpeDyA1jWajd43XODZHe/z92z5y ZgOKXEw+ohiBay6MYOcmjQIsMS+xfbmv411EgeSqO0U5VfTRphMfwUG+zutdo1eS o5stxGxENTkYEW0BT6zXwDd5Xcz8G6HLmOszEqLE8eRlTmoWWR1rgNDeoTIX2my3 2faStDFiB8lpOOAvFrbpqg+Qpo2yr/WZT2XAR1EBna1PabzpkYV3nWC4GyalM2ID 9fqQNax3eerWw+Oj4gZf1J6VTjnea1ymUao9BQ+n1NbFb+mng40= =eVeg -----END PGP SIGNATURE----- Module-Signature-0.89/MANIFEST0000644000175000017500000000111214671312274014135 0ustar timtimANDK2020.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 PAUSE2022.pub TIMLEGGE2024.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.89/Makefile.PL0000644000175000017500000000754214671312274014773 0ustar timtimuse strict; use FindBin '$Bin'; use lib $Bin; 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 ANDK2020.pub PAUSE2022.pub NIKLASHOLM2018.pub TIMLEGGE2024.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.89/TIMLEGGE2024.pub0000644000175000017500000000756714671312274015245 0ustar timtim-----BEGIN PGP PUBLIC KEY BLOCK----- mQINBGBX4gABEADQPl5IEXrKb/jNnrSQw1tFclEP28486TN6zqHs3BLh8dxO08qo GCue5cHtI6hBRK7/5xJos0ttnvB9dZT1E5KHmaHuPVolB8xgy39VfnnPKNXy6Gk4 xBMpcuP77VFy2ocq4mV8k8/GdXBLQy01z0VcoLzxlpAU0f9/Lc5l7Y6P5ra4cjBS 5i71XKvTj/4xOVben3CfP0hbRNBXZX+hI8giXrrO0K2QurZ0cOGm8Tx4zXppe3kj 1xXcOqvBe2E4In+O3RKmRWn7jyPFxQQrjnLcB0s5/Lw1cVg7QT0Z71Y4me2gm3pI Ywx/GY95e9wML6aFuf3tcZ/tPNN5gEmH9X8rzEZ091lANxPa3rba+6RQjAhftIUa Wxzn5gJCuGYXePJL2u8M7eIzww17Z86fCSNqQR1aMnIaR8NQmrnuuNql7lqwPsrF IapXv4U/a6uElrU2rXs+/H83gtIjdnQU3cnTgAV6PeT1KVjW3FYvuzCkEFN2alGd 9+81dOit9QzniFjrhRzD5+HWmVfmuvocMP1ef3gnweJWRsZF0ZIBvtnHHMDxsZBc AVJi62BLQjXBsHgtn4Y7oDRYTnSIKCApU0/8haX4O7qG0kejnH95w+Vd5rz4oiXm SnuYkO2wjrrw5uWbIKcOWHoqlH67dckPFOfW32WFUVbqs3QwwJieKn0bxQARAQAB tCFUaW1vdGh5IExlZ2dlIDx0aW1sZWdnZUBjcGFuLm9yZz6JAlQEEwEKAD4CGwMF CwkIBwIGFQoJCAsCBBYCAwECHgECF4AWIQQyC5ccEJRLMC3qY27V+HsuBgal+QUC ZtJUxgUJC1Uy8AAKCRDV+HsuBgal+VftD/wKOB1Fg2fpTXi191chsQCFUDRTKZ/C GBE+E6teXKPUsTbRq/2cLSj/8fnTLDeyl1wcOyW+jSDDTaR3kNyk88mFojkpsPKx +dXvni3gneCQEjpv5yL9hrEiUR9KmreE78vkiTYfU53Z9Fx+wOx32ohiEXelxqgn QTgGKdaAoPC/CsYvgJTviwYSuJVfOR3iaegEKNtwmmKMA5ntts+LDQjmfP1L2nra rUPGJP90Y04Gj6PCU4/XexLJOVWvKegA5+Qvu23b+lHuRXlkbbegxhTy8QsRfsId S0Rw5md/z4zzNByoZV2ouN6ajv5+VrBc+U2bUMcSSr7PVSE37YWj18Si9lNxeGga EQgM69fGrM8cSnW2qhC8O2e+dCzkTAAK1+HWX3F4NjSOgxsUzm1ijKuU8IlXaTVg 09T6lvE2PTQWmWNDEh7MMB42NTomm35OUX3HH9xMdBPvG+LbORhINDl7+udvCS5n vNLEN+64psiqpcXFsHUbzWBx7KVsFeYHp6VG9Q9XHaWXAjTsyrXeo5+7ecRMak+o Uk7V4SknKNYR3dNBuMT+Pwo3IUMu2O/9AxCAV9vgTvM4riH6HB1zoNn2sw78KDHK OganzHkH63A3ey12QLzGqPwJ440dGtBXDrwHoJ9z8l1MQZNU8OltY736MNCRqTc6 zWdRZXXHm9fxRIkCVAQTAQoAPhYhBDILlxwQlEswLepjbtX4ey4GBqX5BQJgV+IA AhsDBQkHhM4ABQsJCAcCBhUKCQgLAgQWAgMBAh4BAheAAAoJENX4ey4GBqX596QQ AJUOYqUosykjZmZniPuM8xg4PsGJGNC0oWzPlBI60RJBNi2NHsiZUQkJgUIuHJKk PrXnFCXawwaSS9tQznkDDVCPLy8XC1HPHoTwg5wxxm7YaRpNuVD9KAAJBDsHMueZ y+sxF3kaUCH9X38kTEgoxT6TVCCqXGHOJTj5AfP0LER4HL/vzy9tQUencvEqGzKB Y1VUOQsy4wxwOnzw/wBLnoKZw4PAt5PBHeMKztvxQQYtK1y0szLYjwVfelAzTBcy /dCpTkp2+Ob8DPq3K61Le8IKZsxv5a5i6ndbVZqNgIMCL75FAB51Fq86sC8sR/fy aU6qooVhWGHNEoS7xmokxrtT/eJIqmgeZCsBMXjG5qwDcGd4sVV7McSHfmuiWTx1 gOXHsqciHjyITmcmzpmMiCFomO5Pyygwbar0uoiFRs6idUErYBiB2PB4FkUcSVdi 0iarNNy3yUdFjWBbRSLwwj/u0WcSZfUEU8y8GBYo5XgnNzc0shrk3ENsAIkMHGU1 YPz25m9EUqNnLlEu1Lo4BLmiZSCityNcxpxU8fwcsHPcAv+RXCp0rVXkK9vtK7vT h4UonslKw+7Msa23FkNlu2yxR8lSw776KalzbQ7EpzUnXSnb1D/Muwvt7gd1KFEs QB0Qptd4DGUXHhOkMCIOMWRdzBhOehd/3CJtF5QMZdJUuQINBGBX4gABEADPX9G8 VWE1CpdQWep/cxxfNxa9sUXZWOww1OFlQ0k6L9GiNvWl9ckVp6n7rNGbiH3RMors ZH6+oZsvFI9dDys3aByKHDiIYdnMKpPaBMk148nJkuJpJsyuVP3ARqRG+08YFsQh ILXXl5cqj6nofLCB1lQ/DxpYiIRUXEr2KHYPebdSWYA0tJ8aCKijec8y3f8SKq+v LYlc6NGUfb+fe8/VfjLXUqpqjVqMDMSVVGZwL187yUeVQ2aTU+s/3GA67HfhF1RN lF7Zvjy8VDqw0pT8Gb1KnUdv0P3OH99IXwGKQbxP6y75AEPO6M4LYPulzhmmnLNR M8PPs8gxcKantpJaxL2+WZ3Zec7Kqlt0M3Zhvh1F2AymbX/9Tj9c+Xa9F3P9+nKh 0FrVFXGAqEoYWcCcnErP3B7ZXKJ5cIDxB8GQRKZyoN7HMvPR1E9bF9MYStf1mt55 iZOZB/z8Yh/k6w6WMl1aeWdco6GiAQV927tNhHlfl23ffQKj8EqhOuo9Uw6J5M7i vkmaPlrNWfIBrsTppjljwwWKqH+2viyL0q3k63/3+MCyvAJs7GTtrXkovei+wVkL LNLp3K0WuiY1+JDKloTQWcWBD2JY9vxbWvtpVQFJ4tWV+0uTcKEtnW0BpqelTPaL QGqOrWQqwKLsQxeiRrzMnuROtshBjkCh4DIKWwARAQABiQI8BBgBCgAmAhsMFiEE MguXHBCUSzAt6mNu1fh7LgYGpfkFAmbSVbcFCQtVMvAACgkQ1fh7LgYGpfmNNxAA qXNzpZtTHNRX0HOMCP/gAvr9ar+0TcyeSTaVO0RGRqmnIAI8h9zCnbbNE+Mb2IP1 vJL0Yzbpze2+Jw5haNUg72rqZ+hjOb42N94987giRE7fQnbjjnK++dnIRU/1oTee m1bDFtXEegi6/25UvHbrTSF09CWGQmAbxZmcJO3C0FxBYk+Sp9zw9nFCpDEQ9tsM 6HhnCG6DT1m4QsiH8H+xPrzeJ23tybvwPFogayb/KfxzLDKpUm5/yllwveanRpi6 Y/PiGIkIfM/jSd6tt9afrGgjfYX9DlVXoQoMXPiSuEVWcFxUMD/lkgJ5IQ5Zk65r +PicwsFutSXdw38iWwOJWeXPBJSEw/RIX0qfb9zWPKHJoJzopS6Ybs8U2uoklU5i 1TNsr5uD0Jh0/DGSBkfBUBCC+4Z3Eow/ZQhh0oe0beV7JCMISLoyMI2oljm4Usoa tiRPA45tnM2ts4FeJEScEGJSogdIxapWCJe2MzMBZs8Tu9hjNFk39KU8oFc9fDH4 j7W0IIjS4DwqqlgctGtom75+q6psq2wWnNU6pQKbP83Trln/bC61KAwVOmsfKTpk vgGvhl4ooLxNUZaf//4SyuNmWUYdzoSijyVdANpJtlMsA0fkmNrQIA17ZOGA01mc g8jCVo0T5njuryXTcskQap1hSy+iN9zT5n0PaDfve04= =xsd3 -----END PGP PUBLIC KEY BLOCK----- Module-Signature-0.89/ANDK2020.pub0000644000175000017500000003135714663477170014563 0ustar timtim-----BEGIN PGP PUBLIC KEY BLOCK----- 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 XCprYHgMERlmrnnljYDHlF70 =n7h9 -----END PGP PUBLIC KEY BLOCK----- Module-Signature-0.89/MANIFEST.SKIP0000644000175000017500000000212614663477170014720 0ustar timtim #!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.89/README0000644000175000017500000002217614671312264013700 0ustar timtimNAME 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. Signatures made with Module::Signature prior to version 0.82 used the SHA1 algorithm by default. SHA1 is now considered broken, and therefore module authors are strongly encouraged to regenerate their SIGNATURE files. Users verifying old SHA1 signature files will receive a warning. 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". $AUTHOR The key ID used for signature. If empty/null/0, "gpg"'s configured default ID, or the most recently added key within the secret keyring for "Crypt::OpenPGP", will be used for the 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 "SHA256", but may be changed to other ciphers via the "MODULE_SIGNATURE_CIPHER" environment variable if the SHA256 cipher is undesirable for the user. The cipher specified in the SIGNATURE file's first entry will be used to validate its integrity. For "SHA256", the user needs to have any one of these modules installed: Digest::SHA, Digest::SHA256, or Digest::SHA::PurePerl. $Preamble The explanatory text written to newly generated SIGNATURE files before the actual entries. ENVIRONMENT Module::Signature honors these environment variables: MODULE_SIGNATURE_AUTHOR Works like $AUTHOR. 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('keyserver.ubuntu.com') }) { 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::SHA::PurePerl ExtUtils::Manifest, Crypt::OpenPGP, Test::Signature Module::Install, ExtUtils::MakeMaker, Module::Build Dist::Zilla::Plugin::Signature AUTHORS Audrey Tang LICENSE This work is under a CC0 1.0 Universal 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. Module-Signature-0.89/NIKLASHOLM2018.pub0000644000175000017500000000322414663477170015506 0ustar timtim-----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.89/META.yml0000644000175000017500000000116614671312274014266 0ustar timtim--- 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.89' Module-Signature-0.89/lib/0000755000175000017500000000000014671312541013554 5ustar timtimModule-Signature-0.89/lib/Module/0000755000175000017500000000000014671312541015001 5ustar timtimModule-Signature-0.89/lib/Module/Signature.pm0000644000175000017500000007303114671312274017307 0ustar timtimpackage Module::Signature; $Module::Signature::VERSION = '0.89'; 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} || 'keyserver.ubuntu.com'; $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 --openpgp --personal-digest-preferences RIPEMD160 >> $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. Signatures made with Module::Signature prior to version 0.82 used the SHA1 algorithm by default. SHA1 is now considered broken, and therefore module authors are strongly encouraged to regenerate their F files. Users verifying old SHA1 signature files will receive a warning. =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 SHA256 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 modules installed: B, B, or 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('keyserver.ubuntu.com') }) { 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 =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.89/script/0000755000175000017500000000000014671312541014312 5ustar timtimModule-Signature-0.89/script/cpansign0000644000175000017500000000376014663477170016060 0ustar timtim#!/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.89/Changes0000644000175000017500000003270514671312274014313 0ustar timtim[Changes for 0.89 - Fri Sep 13 21:56:06 ADT 2024] * Replace keyserver with keyserver.ubuntu.com (haarg) [Changes for 0.88 - Sat Dec 18 11:34:44 CST 2021] * Update PAUSE keys to 2022. (@skaji) [Changes for 0.87 - Sat Jul 4 15:04:41 CST 2020] * Skip 3-verify.t on Crypt::OpenPGP installations. (@pyramation) [Changes for 0.86 - Thu Jun 25 21:06:24 CST 2020] * Update PAUSE and ANDK keys to 2020. (@dweekly) * Update documentation pertaining to SHA1. (@dweekly) * Fix compatibility with Crypt::OpenPGP. (@niklasholm) [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.89/AUTHORS0000644000175000017500000000162514671312274014065 0ustar timtimHere 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) Graham Knop (HAARG) 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) Timothy Legge (TIMLEGGE) Walt Mankowski William Wentworth-Sheilds Module-Signature-0.89/inc/0000755000175000017500000000000014671312541013557 5ustar timtimModule-Signature-0.89/inc/Module/0000755000175000017500000000000014671312541015004 5ustar timtimModule-Signature-0.89/inc/Module/Install.pm0000644000175000017500000003021714663477170016766 0ustar timtim#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.89/inc/Module/Install/0000755000175000017500000000000014671312541016412 5ustar timtimModule-Signature-0.89/inc/Module/Install/Makefile.pm0000644000175000017500000002743714663477170020515 0ustar timtim#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.89/inc/Module/Install/External.pm0000644000175000017500000000354514663477170020554 0ustar timtim#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.89/inc/Module/Install/WriteAll.pm0000644000175000017500000000237614663477170020516 0ustar timtim#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.89/inc/Module/Install/Fetch.pm0000644000175000017500000000462714663477170020025 0ustar timtim#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.89/inc/Module/Install/Win32.pm0000644000175000017500000000340314663477170017665 0ustar timtim#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.89/inc/Module/Install/Base.pm0000644000175000017500000000214714663477170017641 0ustar timtim#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 Module-Signature-0.89/inc/Module/Install/Metadata.pm0000644000175000017500000004330214663477170020505 0ustar timtim#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.89/inc/Module/Install/Scripts.pm0000644000175000017500000000101114663477170020403 0ustar timtim#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.89/inc/Module/Install/Can.pm0000644000175000017500000000615714663477170017475 0ustar timtim#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