Module-Signature-0.81/000755 000765 000024 00000000000 12763211351 015447 5ustar00audreytstaff000000 000000 Module-Signature-0.81/ANDK2015.pub000644 000765 000024 00000015245 12725464660 017226 0ustar00audreytstaff000000 000000 -----BEGIN PGP PUBLIC KEY BLOCK----- Version: GnuPG v2 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 M+pbqhGxYWdkwFo4e9FH7an45w== =DiYo -----END PGP PUBLIC KEY BLOCK----- Module-Signature-0.81/AUDREYT2015.pub000644 000765 000024 00000151151 12725464660 017623 0ustar00audreytstaff000000 000000 -----BEGIN PGP PUBLIC KEY BLOCK----- Version: GnuPG v2 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 YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+f4CBgoOEhYaHiIiJiouMjY6P kJGSk5SVlpeYmJmam5ydnp+goaKjo6SlpqeoqaqrrK2ur6+wsbKztLW2t7i5ubq7 vL2+v8DBwcLDxMXGx8jIycrLzM3Ozs/Q0dLT09TV1tfY2Nna29zc3d7f4ODh4uPk 5OXm5+fo6err6+zt7u7v8PHx8vPz9PX29vf4+Pn6+vv8/P39/v8AAwQGBwgJCwwN DxARExQVFhgZGxwdHyAhIyQlJigpKiwtLi8xMjM0NTc4OTo7PT4/QEFDREVGR0lK S0xNTk9QUVJTVFVWV1haW1xdXl9gYWJjZGVmaGlqa2xtbm9wcXJzdHV2d3h5ent8 fX5/gIGCg4SFhoeIiYqLjI2Oj5CRkpOUlZaXmJmam5ydnp+foKGio6Slpqeoqaqr rK2ur6+wsbKztLW2t7i5urq7vL2+v8DBwsPExcbHyMnKy8zNzs/Q0dLT1NTV1tfY 2drb3N3e3+Dg4eLj5OTl5ufn6Onp6uvs7O3u7+/w8fLy8/T09fb29/j4+fn6+vv8 /P39/v7/AAIDBAUGBwgJCgsMDQ4ODxAREhMTFBUWFxgZGhobHB0eHyAhIiIjJCUm JygpKissLS4vMDEyMzQ1Njc3ODk6Ozw9Pj9AQUJDREVFRkdISUpLTE1OTk9QUVJT VFRVVldYWVlaW1xdXV5fYGFhYmNkZWVmZ2hpamtsbW5vcHBxcnN0dXZ3eHl6e3x8 fX5/gIGBgoOEhYaHiIiJiouMjY6Pj5CRkpOUlZWWl5iZmpucnZ6fn6ChoqOkpaan qKmqq6ytrq+wsbKztLW2t7i5uru8vr+/wMHCw8TFxsfIycrLzM3Oz9DR0tPU1dbX 2Nna29zd3uDh4uTl5+nr7fDz9vn9/wAAbmRpbgAAAAAAAAY2AACVGAAAVl8AAFFh AACIhgAAKTQAABaoAABQDQAAVDkAAl64AAJPXAABeFEAAwEAAAIAAAADAAYACwAQ ABYAJQAuADcATQBZAGUAgQCQAJ8AwQDSAOUBCwEgATUBSwFhAZABqAHBAfUCDwIr AmQCnwK9AtwDHAM9A18DowPGA+oENAR/BKYEzQUdBXAFmgXEBhsGdAahBs8HLQeM B70H7ghSCLgJIAlUCYoJ9gpkCtULRwuBC7wMMgyrDSYNog3hDiEOoQ8kD6kQLxBz ELgRQxHPEl0S7hOAE8oUFRSrFUMV3RZ5FxcXZhe2GFgY/BmhGkga8RucHEkc+B2o HlsfDx/FIH0hNyHyIrAjbyQwJPMltyZ+J0YoECjcKakqeStKLBws8S3HLqAveTBV MTMyEjLzM9U0uTWgNoc3cThcOUk6ODsoPQ4+Az77P/RA7kHqQuhD6ETpRexG8Uf3 SP9KCUsUTCFOQE9SUGZRe1KSU6tUxVXhVv9YHlk/W4Vcq13SXvtgJWFSYn9jr2Tg ZhJnR2h8au1sKG1kbqJv4XEicmVzqXTvdjZ4yXoVe2N8sn4Df1WAqYH/hK+GCYdl iMKKIYuBjOOPrJESknuT5JVQlryZm5sMnH+d9J9qolqj1aVRps+oTqtRrNSuWq/g svK0frYLt5m6urxNveG/d8KnxEHF3ckZyrrMW83/0UrS8dSb1/HZn9tO3rHgZOPQ 5YjnQeq57Hbv9/G59UL3CPqa/jH//wAAAAAAAQADAAsAEAAWACUANwBNAFkAZQCB AJ8AsADBAOUBCwEgATUBYQGQAcEB2gH1AisCRwJkAp8C3AL8AxwDXwOjA8YD6gQ0 BH8EzQT1BR0FcAXEBe8GGwZ0Bs8HLQdcB4wH7ghSCLgJIAlUCYoJ9gpkCtULRwuB C7wMMgyrDSYNog3hDiEOoQ8kD6kQLxBzELgRQxHPEl0S7hOAFBUUqxVDFd0WeRcX F7YYWBj8GaEZ9BpIGvEbnBxJHPgdqB5bHw8fxSB9ITch8iKwIw8jbyQwJPMltyZ+ J0YoECjcKakqeStKLBws8S3HLqAveTBVMTMyEjLzM9U0uTWgNoc3cThcOUk6ODso PBo9Dj4DPvs/9EDuQepC6EPoROlF7EbxR/dI/0oJSxRMIU0wTkBPUlBmUXtSklOr VMVV4Vb/WT9aYVuFXKtd0l77YCVhUmJ/Y69k4GYSZ0dofGm0au1tZG6ib+FxInJl c6l073Y2d394yXoVfLJ+A39VgKmB/4NWhK+GCYdliMKKIYuBjOOOR4+skRKSe5Pk lVCWvJgrmZubDJx/nfSfaqJao9WlUabPqE6pzqtRrNSuWq/gsWmy8rYLt5m5Kbq6 veG/d8EOxEHF3ckZyrrMW8+j0UrS8dZF1/HZn9z/3rHiGePQ50Ho/Ox27/fzfPVC +ND8Zf//AAAAAQADAAsAFgAlADcATQBlAIEAnwDBAOUBCwE1AZABwQH1AisCZALc AxwDXwOjA+oENAR/BR0FcAXEBhsGdAbPBy0HjAhSCLgJIAmKCfYKZArVC0cLvAwy DKsNJg2iDiEOoQ8kD6kQLxC4EUMRzxLuE4AUFRSrFUMV3RZ5FxcXthhYGPwZoRpI GvEcSRz4HageWx8PH8UgfSE3IfIjbyQwJPMltyZ+J0Yo3CmpKnkrSiwcLccuoC95 MFUyEjLzM9U0uTaHN3E4XDlJOyg8Gj0OPgM++z/0QO5B6kLoQ+hE6UbxR/dI/0oJ SxRMIU0wTkBPUlBmUXtSklTFVeFW/1geWT9bhVyrXdJe+2AlYVJif2TgZhJnR2h8 abRq7WwobqJv4XEicmVzqXTvd394yXoVe2N8sn4Df1WAqYH/g1aGCYdliMKKIYuB jOOOR4+skRKSe5PklVCWvJgrmZubDJx/nfSfaqDholqj1aVRps+oTqnOq1Gs1K5a rx2v4LFptH62C7eZuSm6urxNveG/d8EOwqfEQcXdx3vJGcq6zFvN/8+j0UrS8dSb 1kXX8dmf207c/96x4GTiGePQ5YjmZOdB6PzqueuX7HbuNu8W7/fw1/G58przfPRf 9UL12fZw9wj3oPg4+ND5afoB+pr7M/vM/GX82P1L/b7+Mf8Y//8AAGRlc2MAAAAA AAAACkNvbG9yIExDRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABtbHVj AAAAAAAAAA8AAAAMaXRJVAAAABQAAADEZnJGUgAAAEIAAADYbmJOTwAAABIAAAEa ZXNFUwAAABIAAAEsZmlGSQAAABAAAAE+cHRQVAAAABgAAAFOemhUVwAAAA4AAAFm amFKUAAAAA4AAAF0bmxOTAAAABYAAAGCZGVERQAAABAAAAGYa29LUgAAAAwAAAGo ZW5VUwAAABIAAAG0c3ZTRQAAABAAAAHGZGFESwAAABwAAAHWemhDTgAAAAwAAAHy AEwAQwBEACAAYwBvAGwAbwByAGkAyQBjAHIAYQBuACAA4AAgAGMAcgBpAHMAdABh AHUAeAAgAGwAaQBxAHUAaQBkAGUAcwAgAGMAbwB1AGwAZQB1AHIARgBhAHIAZwBl AC0ATABDAEQATABDAEQAIABjAG8AbABvAHIAVgDkAHIAaQAtAEwAQwBEAEwAQwBE ACAAYwBvAGwAbwByAGkAZABvX2mCcm2yZnaYb3k6VmgwqzDpMPwAIABMAEMARABL AGwAZQB1AHIAZQBuAC0ATABDAEQARgBhAHIAYgAtAEwAQwBEzuy37AAgAEwAQwBE AEMAbwBsAG8AcgAgAEwAQwBEAEYA5AByAGcALQBMAEMARABMAEMARAAtAGYAYQBy AHYAZQBzAGsA5gByAG1faYJyACAATABDAEQAAG1tb2QAAAAAAAAGEAAAnEUAAAAA vnORAAAAAAAAAAAAAAAAAAAAAAB0ZXh0AAAAAENvcHlyaWdodCBBcHBsZSBDb21w dXRlciwgSW5jLiwgMjAwNQAAAAD/2wBDAAoHBwgHBgoICAgLCgoLDhgQDg0NDh0V FhEYIx8lJCIfIiEmKzcvJik0KSEiMEExNDk7Pj4+JS5ESUM8SDc9Pjv/2wBDAQoL Cw4NDhwQEBw7KCIoOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7 Ozs7Ozs7Ozs7Ozs7Ozv/wAARCABkAHgDASIAAhEBAxEB/8QAHAAAAAcBAQAAAAAA AAAAAAAAAAIDBAUGBwEI/8QAMxAAAgEDAwIFAgQFBQAAAAAAAQIDAAQRBSExEkEG EyJRcTJhFEKBkQczodHhFiMkUrH/xAAaAQADAQEBAQAAAAAAAAAAAAACAwQFAQAG /8QAIxEAAgIBBAICAwAAAAAAAAAAAAECEQMEEiExIkEycRNCUf/aAAwDAQACEQMR AD8Axolgd9q71EZORRaMPj964GmzvUSctXD052J39q6ekbUUYzXjrfoMg3/xSsNv LNJ0RgmnNhp0l22Bsnc4q26Xo6QLsvz96ny5lHoqx4LVsidM0HMgZ98GpLVLAi3Y Y7YANWO3s1RCQoFJ3NkJtjWe8rlK2VbFVIy6ePypCD2pHvxmrFrmkmOVpEG3eq8V KkjNaeOanEhywcXfoXtpijMDw4wRXYpXglwrYIbqQ+xpsAQ2cgEU4uQ0ipMo+ocj 3omlf2DGTr6N68CeJl8S6GrSMBd2+EnX3PZv1qxstYJ/DvXX0XxXB1tiC5PkyjO2 52P6Gt/K5FZOox/jnx0UwluQ0ZaFLOtCkBnloD5xQyaPtjHainY7GvoDPaoGB+tP tN0572YbHp7mkbK1a6mCjjuauen2qW8YAUcVPmy7VS7KcGK/JjrTtOSKNUVQAKnY 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 vU23+gxWRzC5mohGBBMRAgAGBQJAqZn9AAoJEIHC9+viE7aSJpEAnjaMac+36n1W cpelapjUFLGoIJXDAJwKq1JmlvjBeVG6BYpRTGE5OINTtYhGBBMRAgAGBQJAqZp3 AAoJEGtw7Nldw/RzV14AoLIwY2SAW/JqSWkAAY40ufjkhrNtAKDeJfuRmYeNnEIl +uC/CJAuZrWSHohGBBMRAgAGBQJCLre6AAoJEGAwWzHAn9Nas6EAoItMN8HpZ+iZ 3JTkoEDGY4NciVTcAKCfOV050IuEoHY9IKSNizcsVA6jiohGBBMRAgAGBQJCvOzW AAoJEG6f0G5oXR6MWpIAn1lE3802xt3QXXQN0lR3FK9JMSjNAKCG+WNg+WL1Oi+R w3czqRwW8R12mohGBBMRAgAGBQJCxIltAAoJEGJWUnKV6ioEJqMAnjTydWgZ1NNH SvQwie29419gBAfxAKCHjBH6h8nrjyKfbmt+Y6Ig/3QgQNHRm9GZARAAAQEAAAAA AAAAAAAAAAD/2P/gABBKRklGAAECAQBIAEgAAP/uAA5BZG9iZQBkgAAAAAH/2wCE AAgGBgYGBggGBggMCAcIDA4KCAgKDhANDQ4NDRARDAwMDAwMEQwMDAwMDAwMDAwM DAwMDAwMDAwMDAwMDAwMDAwBCQgICQoJCwkJCw4LDQsOEQ4ODg4REQwMDAwMEREM DAwMDAwRDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP/AABEIAFUAbgMBIgAC EQEDEQH/3QAEAAf/xAGiAAAABwEBAQEBAAAAAAAAAAAEBQMCBgEABwgJCgsBAAIC AwEBAQEBAAAAAAAAAAEAAgMEBQYHCAkKCxAAAgEDAwIEAgYHAwQCBgJzAQIDEQQA BSESMUFRBhNhInGBFDKRoQcVsUIjwVLR4TMWYvAkcoLxJUM0U5KismNzwjVEJ5Oj szYXVGR0w9LiCCaDCQoYGYSURUaktFbTVSga8uPzxNTk9GV1hZWltcXV5fVmdoaW prbG1ub2N0dXZ3eHl6e3x9fn9zhIWGh4iJiouMjY6PgpOUlZaXmJmam5ydnp+So6 SlpqeoqaqrrK2ur6EQACAgECAwUFBAUGBAgDA20BAAIRAwQhEjFBBVETYSIGcYGR MqGx8BTB0eEjQhVSYnLxMyQ0Q4IWklMlomOywgdz0jXiRIMXVJMICQoYGSY2RRon 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 oKqR8ahDma2qse/LxNPU2MvkDsV5iEYEExECAAYFAkDMhgkACgkQ144QkYb9jGhM 6ACfbm3VMYHBiE8qNapgEUY8OcfJsXwAn28AHop5P2ctIM95Ig4NIt13FPlxiEYE ExECAAYFAkDASv0ACgkQVLe2nHfUM4P6HACfdWic0DDSPEiLGhAP9D3+GQEhKFwA nj1FmGivlt+Q+uf43hSLCF9OXDBniEYEEBECAAYFAj8SGpoACgkQdP6eNQ9CssKh TQCfUv0tLjufC/zvc6qn5kZeWCrtPuEAoImZLUb1zBnMLVRiv9igmHryzq/HiEYE EBECAAYFAkIqB+YACgkQOl4Wbdx2/rkzeACgq+clIq/vG09pSNw6M9FMakBllpIA mwf8ykGaItM50cTBN0xZW2wjTRSuiEYEEBECAAYFAkIr5nAACgkQdu+M6Iexz7VF zgCg7D+zHxPCUyfZugqpfsMQBU0aVmQAoM6f8J/UZIQ2xTeHCBu9dBgBHTnAiEYE EBECAAYFAkIwWLEACgkQWINtqqbRL4A5IgCgwP/X6aHm/qXaLwz9MQRaXjl6ypQA n1v8yzJveCjYAxbuqNrcHiIxzzGIiEYEEBECAAYFAkKIymIACgkQi9gubzC5S1zg DgCfZC55FfSjUKJtFNr3e/ntJqEMX6MAn3FP4X0wH3VUw2+PACk40/Hx/Y23iEYE EBECAAYFAkLGET8ACgkQVCwRwOvSdBifuwCfZqsIX8ED7lD14aW7hUUxUgcVdPwA oJv8flwyEDebB2aBBtNwXK5CoaZriEYEERECAAYFAkLvUm0ACgkQtxkthnt01PWM RwCdFD4su7SJiPNSzlv6LYUYIRLLFC4AnR1cBjFXsBrP88k/3mKfTH2VpFKTiEYE EhECAAYFAkD2hhYACgkQqHuLwqIpU7ClVwCfYBZvLkhtZ4pywekwL3aaZtroI6oA njqQlw/XG+JyPGGTW/HFgdY5vb8CiQEcBBMBAgAGBQI/EM/OAAoJECJCGAJQWMxz Z4wIAJ7gNpTbq1uRzOdfPgsMPqTvrj8noEHoNLi0f6oDhPTFigZ1aqGVPB6arf/X da68+cD8jotvpZoRmMKasv4Q13wRIvfNeHbyRsZgZ/vSwWlxj+1e/LukrT3///// //////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////// //////////////////////////+IRgQTEQIABgUCQKmZXAAKCRAYWdAfZ3uh7EZQ AJ41sX0ZuYtVg+NAdg+EQImcMoFW3ACgjpBh2jIuMGPFyiIgMiIUCtZ6tmuIRgQT EQIABgUCQKmZ/gAKCRCBwvfr4hO2kvbzAJ4xZDJWEqjsYVmqoC8MGD27t1la3wCd Gg65BXcYbdip9GOJLQRup1XuqgCIRgQTEQIABgUCQKmadwAKCRBrcOzZXcP0c/QQ AKCabnPJM7mYnSWwdfn7XDw7PD/W8QCgnH19AQyDqMatFL7BVWTA/qTwDhSIRgQT EQIABgUCQi63ugAKCRBgMFsxwJ/TWhfUAJ4s9eOx5z+fHd/XBNo68naza20t1wCf ZvwbigwBdCCnZsXJLwHNRguK556IRgQTEQIABgUCQrzs1gAKCRBun9BuaF0ejBe4 AKDfYTZjNgT2hpCe/8vaaOo0DWGEXQCeODIRE1A/g2Kc9jd/zRDkNnevXwqIRgQT EQIABgUCQsSJbgAKCRBiVlJyleoqBF4oAJ9R8IMI475gOqZ2zNc4i5iQEAokqQCg kmQzhWcVZUfOEUYgNOOcN7lQCIW5Ag0EPMErWxAIAJKyvaV7V0Uke+/rkT7+8Aht VQ2aKzAewROzJIJCQv7lImRPQqezwM4NUqi9MzxyG6Nich2rQbGzAU6o1s2izyZr OZkVTbmyM3Wc6ow17sxIkGC5UeWmgtNicDUs2qrXHNlY+3/n5ZJAbAqlSIGIWVQ0 LUHPKhPgDFwwh402zzAIbCVlk+UYReWM94S57d/85Mb5Dq/3FrD2MB5bSAikqjRH uyouvBEz6X+dzNcMWnPiLqBKjcNGbm7XIYjhBURj3ojEnjeWvOcUImZK9FHxVtOc f4ZlunpTZfbbe7Y/5f6LYMtyeaDAt+9dXNHi7WChs+h0FbW5kHYD/uMpjrcOGRsA AwUH/jTYQxQQSEYKWZdUs7wR+W+eoYWoSSttAPJkEcX3sZGG8QGwlAUGFrkP7oIW C5EjdPncgD9srQf3Gy4couYqwRjqlfHib7Xn7OmUOpfASad9LokAGrwYuHH0WQHK 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 ulzdzNrPK4M= =inkH -----END PGP PUBLIC KEY BLOCK----- Module-Signature-0.81/AUTHORS000644 000765 000024 00000001516 12725464660 016535 0ustar00audreytstaff000000 000000 Here is a list of people and their CPAN id, extracted from the ChangeLog file and the mailing list archives. These people have either submitted patches or suggestions, or their bug reports or comments have inspired the appropriate patches. Corrections, additions, deletions welcome: Adam J. Foxson (FOX) Adam J. Kennedy (ADAMK) Alan Burlison (ABURLISON) Arthur Bergman (ABERGMAN) Andreas Koenig (ANDK) Benjamin Goldberg (GOLDBB) Blair Zajac (BZAJAC) Christian Loos (CLOOS) Dave Rolsky (DROLSKY) Iain Truskett (SPOON) Jarkko Hietaniemi (JHI) Jos Boumans (KANE) John Lightsey (LIGHTSEY) Mark Shelor Matt Southall Michael G Schwern (MSCHWERN) Paul Howarth Scott R. Godin Soren A Steve Hay (SHAY) Tels (TELS) Walt Mankowski William Wentworth-Sheilds Module-Signature-0.81/Changes000644 000765 000024 00000031310 12725464660 016753 0ustar00audreytstaff000000 000000 [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.81/inc/000755 000765 000024 00000000000 12763211346 016224 5ustar00audreytstaff000000 000000 Module-Signature-0.81/lib/000755 000765 000024 00000000000 12763211346 016221 5ustar00audreytstaff000000 000000 Module-Signature-0.81/Makefile.PL000644 000765 000024 00000007434 12763210464 017435 0ustar00audreytstaff000000 000000 use strict; use inc::Module::Install 0.92; $|++; name 'Module-Signature'; license 'unrestricted'; all_from 'lib/Module/Signature.pm'; repository 'http://github.com/audreyt/module-signature'; install_script 'script/cpansign'; build_requires 'Test::More', 0, 'IPC::Run', 0; requires 'File::Temp'; # clean generated test files clean_files(q{"t/test-dat*"}); # On Win32 (excluding cygwin) we know that IO::Socket::INET, # which is needed for keyserver stuff, doesn't work. In fact # it potentially hangs forever. So bail out with a N/A on # Win32. if ( $^O eq 'MSWin32' and 0 ) { print "Keyserver behaviour is dangerous unreliable on Win32\n"; print "Not installing on this platform.\n"; exit(255); } else { requires 'IO::Socket::INET' => 0; } # We will need something to handle SHA1/256 unless ( can_use('Digest::SHA') or can_use('Digest::SHA::PurePerl') or (can_use('Digest::SHA1') and can_use('Digest::SHA256')) ) { # Nothing installed, we need to install a digest module if ( can_cc() ) { requires 'Digest::SHA'; } else { requires 'Digest::SHA::PurePerl'; } } # Is openpgp currently installed if ( can_use('Crypt::OpenPGP') ) { # Crypt::OpenPGP installed/available, continue on... } elsif ( my $gpg = locate_gpg() ) { # We SHOULD have gpg, double-check formally requires_external_bin $gpg; } elsif ( can_cc() and $ENV{AUTOMATED_TESTING} ) { # Dive headlong into a full Crypt::OpenPGP install. requires('Crypt::OpenPGP'); } else { # Ask the user what to do ask_user(); } unless ( can_run('diff') ) { # We know Text::Diff fails on Cygwin (for now) if ( $^O ne 'Cygwin' ) { requires 'Algorithm::Diff'; requires 'Text::Diff'; } } sign; WriteAll; ##################################################################### # Support Functions sub locate_gpg { print "Looking for GNU Privacy Guard (gpg), a cryptographic signature tool...\n"; my ($gpg, $gpg_path); for my $gpg_bin ('gpg', 'gpg2', 'gnupg', 'gnupg2') { $gpg_path = can_run($gpg_bin); next unless $gpg_path; next unless `$gpg_bin --version` =~ /GnuPG/; next unless defined `$gpg_bin --list-public-keys`; $gpg = $gpg_bin; last; } unless ( $gpg ) { print "gpg not found.\n"; return; } print "GnuPG found ($gpg_path).\n"; return 1 if grep { /^--installdeps/} @ARGV; if ( prompt("Import PAUSE and author keys to GnuPG?", 'y' ) =~ /^y/i) { print 'Importing... '; system $gpg, '--quiet', '--import', qw[ AUDREYT2015.pub ANDK2015.pub PAUSE2017.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.81/MANIFEST000644 000765 000024 00000001046 12725465105 016607 0ustar00audreytstaff000000 000000 ANDK2015.pub AUDREYT2015.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 PAUSE2017.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.81/MANIFEST.SKIP000644 000765 000024 00000002126 12044761522 017350 0ustar00audreytstaff000000 000000 #!start included /home/src/perl/repoperls/installed-perls/perl/v5.14.0-RC2/1df5/lib/5.14.0/ExtUtils/MANIFEST.SKIP # Avoid version control files. \bRCS\b \bCVS\b \bSCCS\b ,v$ \B\.svn\b \B\.git\b \B\.gitignore\b \b_darcs\b \B\.cvsignore$ # Avoid VMS specific MakeMaker generated files \bDescrip.MMS$ \bDESCRIP.MMS$ \bdescrip.mms$ # Avoid Makemaker generated and utility files. \bMANIFEST\.bak \bMakefile$ \bblib/ \bMakeMaker-\d \bpm_to_blib\.ts$ \bpm_to_blib$ \bblibdirs\.ts$ # 6.18 through 6.25 generated this # Avoid Module::Build generated and utility files. \bBuild$ \b_build/ \bBuild.bat$ \bBuild.COM$ \bBUILD.COM$ \bbuild.com$ # Avoid temp and backup files. ~$ \.old$ \#$ \b\.# \.bak$ \.tmp$ \.# \.rej$ # Avoid OS-specific files/dirs # Mac OSX metadata \B\.DS_Store # Mac OSX SMB mount metadata files \B\._ # Avoid Devel::Cover and Devel::CoverX::Covered files. \bcover_db\b \bcovered\b # Avoid MYMETA files ^MYMETA\. #!end included /home/src/perl/repoperls/installed-perls/perl/v5.14.0-RC2/1df5/lib/5.14.0/ExtUtils/MANIFEST.SKIP \.tar\.gz$ t/test-dat.*/(MANIFEST|README|SIGNATURE|42.gz)$ Module-Signature-0.81/META.yml000644 000765 000024 00000001166 12763211345 016727 0ustar00audreytstaff000000 000000 --- abstract: 'Module signature file manipulation' author: - 'Audrey Tang ' build_requires: ExtUtils::MakeMaker: 6.36 IPC::Run: 0 Test::More: 0 configure_requires: ExtUtils::MakeMaker: 6.36 distribution_type: module dynamic_config: 1 generated_by: 'Module::Install version 1.16' license: unrestricted meta-spec: url: http://module-build.sourceforge.net/META-spec-v1.4.html version: 1.4 name: Module-Signature no_index: directory: - inc - t requires: File::Temp: 0 IO::Socket::INET: 0 perl: '5.005' resources: repository: http://github.com/audreyt/module-signature version: '0.81' Module-Signature-0.81/PAUSE2017.pub000644 000765 000024 00000037051 12725464660 017367 0ustar00audreytstaff000000 000000 -----BEGIN PGP PUBLIC KEY BLOCK----- Version: GnuPG v2 mQGiBD4+cJARBACxOByY0SJBBuJoFrH2hoqRFny423gY6V3jq1uTgGY/PPaxP+Sq r3RzxPct4vJcsoo48pwBsMHLrWfORq26zb6eKgmMq/CQo2gzaRbeRxCi3ke4KBmu aREi6RjaZSU94yABtDmspUBrpYV8zfZMv5ZIQlg9W1Tu66BFOUrrNeDpKwCgosCp 9dtNAMhHkzxs8UJH5i3Uzb0D/0VLoAE8sOfUXqjc38rxiHuGBFSNC70Ih4mzGUCJ MGT4z1X3K6uUawnXMoc8XqPaYnEgOzztMymydtr+urjUwcGnuXDSpV6nulE5irxh zlikSTJy/42QzTMcrdRynffmJo9PRgymMI8GgWaYG5g3zzGAhi5BA6G8JKfC93IV xiRPBACXJpLBYQljqJY9UDNJuq8nHhKiWHBXdZzrC3LM0FSF3PKuP/ugc+KBIKXm clNPNFKla/SRbH6dMHsGIy8wnGPI5AtTS0roNQrttv3/ghRT7+OKXrGmBxZ/KHVr v3PVgiRA5MDr1mIsovfuc9WQnFu2TkgnN/F3pDcrVVSi5b+rZLQzUEFVU0UgQmF0 Y2ggU2lnbmluZyBLZXkgMjAwMyA8cGF1c2VAcGF1c2UucGVybC5vcmc+iF8EExEC AB8FAj4+cJAFCQPCZwAECwcDAgMVAgMDFgIBAh4BAheAAAoJEDKNqGdFD4nsd4sA n3gYvr37VkUycx61wm5t4BoSO904AJ9dkl/zU5BbDnXEPKk0FNWFSnwnxYkCIgQQ AQIADAUCQX8qTAWDAIGtRAAKCRCq4+bOZqFEaAwFD/4pO47amUAVU7P5DD3QXXpS ODlqLB6bc4Uc3MfHCjNumtA5hPlk25VX1kAvjBPBNNWaSRC0lwBL49X2D25GQwaK WjW0sEKqJ0Usr6aBtuhQrLlGYHMIJ8FhwxHAqZFFo3vbg0XRzRFREs0xAMDFqSOi lwaW6H0zUHwdj0WMFyPPu0PRear84ulqB/TBCGp5dBVAaHBu4gWcjHECocsFXW8w tqcosy/yfp2Xem8qopdwKpYZvH1Q3ouhyFgeNaXup+1dNYU0xv40ijkfpaWB/D8R IURtmMHteeW8ALK4oF2wHSfUgByRgenYSele1Z3R7veu+I3myw0UksOzX8Jxz/Ch WJGJkygxpa4HgxUuhY/qZsXjgLkLqTCrV1k8+I9hclMjX+rjC2g/IKXfqu5hDzA/ DNo2KIQ5OONUkuJekZC5Zk1zKsXY3pjn8UwXk2uLfqXWSJOT0KPZGCjPo4UbKJYi RrY9YhIiGjb+CMeCaGOM/z+Tb3fDvoY1u/iqC6hBuYJq9dLwaes1I8m3iZu3X0EV DpkQOCYrrnb6by6bWRZWAo+BYnaUXr+YNxKakMh3gJAxCWzlusG4b5V+f7Afeack LzQURqoDs+XNphmAhZUv87mBpJNTPRSeVN1LfwTby6xhE7Rq95+CBtgd/fmwGN2V N9ApbLhwvc7qzB2o2bSMfohMBBMRAgAMBQJAqZg6BYMBVz9WAAoJEBhZ0B9ne6Hs oLcAn17UFKz8EQzwzqQziInEkSRhkMhYAKCNRrWgCX+XVW1TK5gQ/fCrDof6HYhM BBMRAgAMBQJAqZiMBYMBVz8EAAoJEIHC9+viE7aSJ+gAn1+gxG/MWAG27NJhwU6r ou8qJTgeAJ9bRcWE7qgZQRa+lF/wwWvnZryr9IhMBBMRAgAMBQJAqZjLBYMBVz7F AAoJEGtw7Nldw/RzSpoAn2rVXb1okXU35aoYI4pPpQq/aQjYAJ9BWjYyGHJNrPjJ OXNSa+3ToOmPKIhfBBMRAgAfBAsHAwIDFQIDAxYCAQIeAQIXgAUCQeGgXwUJB6eB zwAKCRAyjahnRQ+J7GVUAJ4vWWJnm8F3zvTYAc6Ax5O4Ps5IiwCfYk0YHfbbOtnj ZEnfc4q6kUuUW4uIXwQTEQIAHwQLBwMCAxUCAwMWAgECHgECF4AFAkWZglsFCQwM GEsACgkQMo2oZ0UPieyRJwCgjG/zr1XJhZG1O+z1RdRVbAKa7FkAoJ0z9N3AWDhv 8+JGW00n+/Asy5NUiF8EExECAB8ECwcDAgMVAgMDFgIBAh4BAheABQJJeN+QBQkP znSAAAoJEDKNqGdFD4nshpwAn0DDhprbvctI9hGxBQ7qYZDZzD50AJ0ZvNSi4hFX gEtXii2GfPEhlHyObohGBBARAgAGBQJEYKLqAAoJEIvYLm8wuUtc/44AnjBPBDhT nyx91Y2QADeASP1DffjRAJ9JouZ7gmGHXkammWPUn5mRjZEzS4hJBBARAgAJBQJE JojIAgcAAAoJEAZbinBfPl6L/JUAn2ncdJlORTVO9g1jkfDX0i93edtTAJ9Syx/h qyWuFse0U9734ORqlpBHaIhJBBARAgAJBQJEJojNAgcAAAoJEAZbinBfPl6LMLMA n2DJauL2a5zNv+EvtDFB5h2U5CRxAJ9OM4eGUL7Sf7h+H4FnufLFK3gqT4hbBBAR AgAbBQJDwdP3AwUCeBCGPFtePl0rW0AuXVwqPiQAAAoJEIbmsk2SWE/hyeYAoNa4 roCWwYLcOHy2/19HbGeL6yVpAJ91B6hnFIIQZsT7PuQaR20Yhyb4o4hGBBARAgAG BQJHXA7/AAoJEBX45cPA0J5qRuwAnjtHqV3cK/ZGjEAb7adKQ99/vVDwAJwKwKQH qID1dLnnLAoPe09tB0J7YohGBBARAgAGBQJLjEjWAAoJEDSurrM80bDMBlkAoMoy 5tKqA/vOviTgkBD0t+oxbYxlAJ49LhT8tgO+Wcfokj54P/lrTsyHO4hGBBERAgAG BQJJy4DaAAoJEDbMFaTjWWX8bpMAn3CTpgTsxJOdio8X5CeQrziiz1G1AKCKsEQl O4U3EIquiRwscDxIHf6BpIhGBBMRAgAGBQJKmG3tAAoJEOnWfireQXIW+hwAn08v bjEUUgyK7HG7/H6ioV41YATPAJ97PiJg8fy84aJQsXcV4qRZav0hSohJBBARAgAJ BQJH77wOAgcAAAoJEF/bceEvWKUrcXkAnjPuUo2MPb09qH5hZTLAqPi/XPudAJwP pWhC4PnySVkTKFdu/er3VdEb/ohJBBARAgAJBQJH77wOAgcAAAoJEF/bceEvWKUr d0IAnjoartIQ8d2tmpSF9Hv5XrxKDd6FAJwImNvRtryR3pyvM9r9aIeca9w8p4hf BBMRAgAfBAsHAwIDFQIDAxYCAQIeAQIXgAUCTXPzxAUJE5IpaAAKCRAyjahnRQ+J 7Ll0AKCJvM/zT8TuEcvVKvHAqBsxN4G/qQCeOfj3o1iCZlNowpGtKnPdWHtmjteI ZAQTEQIAJAIbAwYLCQgHAwIDFQIDAxYCAQIeAQIXgAUCRZmCWwUJDAwYSwAKCRAy jahnRQ+J7O/SAJ49tSHmUrdjaDjtf4Prw+bajnG81ACeO/J9Zp8puENjd000967J 53nXHb6IRgQQEQIABgUCSXwU9wAKCRDsgDnwoxfBXfUrAKDMA0aDR8SSaQDlsi5F 3ysR+bFKegCdHHDe50gk7GpLY0PEBQc0zr3oFUWIRgQQEQIABgUCShv8TQAKCRAr jjFGQYntJ//YAJ97TrrUcglo4g8Z1ym62yZL3A3dfgCfR7yiWI2akD5FcN83dlVP 7Q1bpRqIXwQTEQIAHwQLBwMCAxUCAwMWAgECHgECF4AFAlGFNBQFCRdUUAQACgkQ Mo2oZ0UPiewtNgCfa+T6WFO8HBKmqcRqL2eHIsLdWLsAoKKHRxtVrSc80PB/Vbw9 ykG3BUCziF8EExECAB8ECwcDAgMVAgMDFgIBAh4BAheABQJU13atBQkbF/OdAAoJ EDKNqGdFD4nsWBIAoJzf9ERdJaRuHcaLv/TU7uWqtzkvAKCQHBr0m0vBsJEoLtgv IsaUMT79PbQzUEFVU0UgQmF0Y2ggU2lnbmluZyBLZXkgMjAwNSA8cGF1c2VAcGF1 c2UucGVybC5vcmc+iGQEExECACQFAkHhoIQCGwMFCQengc8GCwkIBwMCAxUCAwMW AgECHgECF4AACgkQMo2oZ0UPiezRGwCeJ4J/wVG7Vs1Uf4zlkrHcGsA5O3kAnj+9 Fz0WZJWpqCqY6r75Fe0NlDg3iGQEExECACQCGwMGCwkIBwMCAxUCAwMWAgECHgEC F4AFAkWZglsFCQwMGEsACgkQMo2oZ0UPiezv0gCePbUh5lK3Y2g47X+D68Pm2o5x vNQAnjvyfWafKbhDY3dNNPeuyed51x2+iGQEExECACQCGwMGCwkIBwMCAxUCAwMW AgECHgECF4AFAkl435AFCQ/OdIAACgkQMo2oZ0UPiexFMwCfVlBFOB7K/EyM/mMW eKHfE6qaYtAAnApuQ3l7nZNpTmwUpF2DusvWD0B3iEYEEBECAAYFAkRgougACgkQ i9gubzC5S1zfRACgrZzNR59hqG1hb5Nu0hd2FR1b584AnA2LRsny2sJpk06AJRD0 utx9gjXsiEkEEBECAAkFAkQmiMgCBwAACgkQBluKcF8+Xov8lQCfadx0mU5FNU72 DWOR8NfSL3d521MAn1LLH+GrJa4Wx7RT3vfg5GqWkEdoiFsEEBECABsFAkPB0/ED BQJ4EIY8W14+XStbQC5dXCo+JAAACgkQhuayTZJYT+HS3ACfdRxDdeDYDI6YYEyd Q52Ck0fbwJEAn2tJAFecXkOpK3Wq/0NpvZqyop87iEYEEBECAAYFAkdcDv8ACgkQ Ffjlw8DQnmr1TACffEntJ1cIKRghF52E49tJPsdKpJoAn3YapxInyxcX+P40mjNM IdEz2rWhiEYEEBECAAYFAkuMSNYACgkQNK6uszzRsMx0NACfaV1kcJPUCV5oXyaR eRRxb6zasIgAoICQu4z1oRWGPfTA+azFoiiAjPjSiEYEERECAAYFAknLgNoACgkQ NswVpONZZfy1AwCfcG82Y/QTns2vcyAzz43/cncAJ9MAnjWEmJooI/IK35sREaj7 htrMq9YSiEYEExECAAYFAkqYbe0ACgkQ6dZ+Kt5BchZEEQCffTEokVTUk6R/9VY+ z6MFWavYlLUAoIg8h/Y+ClWUn2c2UTrzbDuGzSVdiEkEEBECAAkFAkfvvA4CBwAA CgkQX9tx4S9YpStrxgCgicbxtWz6sf/xS5QqyjRziAl5/tsAoLjZ7P1wUWUPnyaN /r0WVMdlkpdmiGQEExECACQCGwMGCwkIBwMCAxUCAwMWAgECHgECF4AFAk1z88QF CROSKWgACgkQMo2oZ0UPiewObACfdvGxyM20aXherg1hgqLL3xheTOkAmweOm4ZO YkaXnHX1Zy6BtO7fWP4eiEYEEBECAAYFAkl8FPcACgkQ7IA58KMXwV0wTACfa04h WeQhXLZp03sEta4wpb9FpUAAoNtTCEobDA6aFuTPKR0VPz04Cq4PiEYEEBECAAYF Akob/E0ACgkQK44xRkGJ7Sf7VQCgjG7/PCPSiPUOivLJfLtN4qJXFusAniUEDZXl Ad9qGu2eLNEdB4F/dNq8iGQEExECACQCGwMGCwkIBwMCAxUCAwMWAgECHgECF4AF AlGFNBQFCRdUUAQACgkQMo2oZ0UPiexZcQCeK+CSOoWlXSZVeYtlhzJUMS4SiDAA oJEZMIoJax40ZhK6HGIFBYm6lI/diGQEExECACQCGwMGCwkIBwMCAxUCAwMWAgEC HgECF4AFAlTXdq0FCRsX850ACgkQMo2oZ0UPiezK6wCghdqjSqz+epsIzfKmvJvv /4DlllAAn2bsuoCoVJTt0f3ZtgG0RR6J0f42tDNQQVVTRSBCYXRjaCBTaWduaW5n IEtleSAyMDA3IDxwYXVzZUBwYXVzZS5wZXJsLm9yZz6IZgQTEQIAJgUCRZmClAIb AwUJDAwYSwYLCQgHAwIEFQIIAwQWAgMBAh4BAheAAAoJEDKNqGdFD4nsSroAoIR0 lnjwlXdUBv+xzI8zzwuYZryvAJ4od9kQPAYFcY/t68AEkzGqpGE7BohmBBMRAgAm AhsDBgsJCAcDAgQVAggDBBYCAwECHgECF4AFAkl435AFCQ/OdIAACgkQMo2oZ0UP iewpzwCfYJ04iLud9mvIcXwYkl34n020sWkAn166wIPEJ0a6a//5+2p3+Aon3tg9 iEYEEBECAAYFAkdcDv0ACgkQFfjlw8DQnmpD8ACfb+jzfDHCBsgop3apGAlYXl82 2I8AnR61QtmU9FS5S4XtH0kNPg0k2IQciEYEEBECAAYFAkuMSNYACgkQNK6uszzR sMyUvwCdHc8dIoujSEyvQ8ljxGCs2S3WVjQAn3pzmj3yNyUuvgtbwDbWP1jjLZbF iEYEERECAAYFAknLgNoACgkQNswVpONZZfyruQCeNtCwmAobK9H50HfHHHaO3tqd va8An2NoWd5H3EKaU+vRe6UsBXeMva5FiEYEEhECAAYFAkbfAKQACgkQOV9mt2Vy AVG4zQCgqjZuEOhiMNY5KTV4jb4Tcs8U68EAnRnYXc6ZsqAuLfdH1fGYz9xN7zpG iEYEExECAAYFAkqYbe0ACgkQ6dZ+Kt5BchY3hQCfc9tc06DUM4+uVGSkP8UFIjq4 5PAAoLbZGEEFDJuyyE429ub0NaucYCgaiEkEEBECAAkFAkfvvA4CBwAACgkQX9tx 4S9YpStxeQCeM+5SjYw9vT2ofmFlMsCo+L9c+50AnA+laELg+fJJWRMoV2796vdV 0Rv+iGYEExECACYCGwMGCwkIBwMCBBUCCAMEFgIDAQIeAQIXgAUCTXPzxAUJE5Ip aAAKCRAyjahnRQ+J7C8sAKCITxAfiJ46PWiJT+MrDF16Xb/zGgCdHr6PO4CJrdPP AEPAXNFcoOfXIHaIRgQQEQIABgUCSXwU9wAKCRDsgDnwoxfBXZnXAJ9UeW4miRgO 7DT3cgfg8A2lzEolVgCg9mBuETWMeI/fM847iqZIgS6Gr4aIRgQQEQIABgUCShv8 TQAKCRArjjFGQYntJypVAJ9d+vsNTFyT0un/6rDtgXWc3QkbBgCfcMFYG8J7j9PO grKiLVom+TkIpryIZgQTEQIAJgIbAwYLCQgHAwIEFQIIAwQWAgMBAh4BAheABQJR hTQUBQkXVFAEAAoJEDKNqGdFD4nsnpwAoIixEileGV8AXM4Cr85pTzA7Nru6AJ42 79NLqQLcuJzVH1sYTqFHMgBr0ohmBBMRAgAmAhsDBgsJCAcDAgQVAggDBBYCAwEC HgECF4AFAlTXdq0FCRsX850ACgkQMo2oZ0UPiexeJQCfa0QCL4JobpoviaZ4h7FX TpYXr44AoIB2WRGX/BovvdbvukHbbhIHF3W/tDNQQVVTRSBCYXRjaCBTaWduaW5n IEtleSAyMDA5IDxwYXVzZUBwYXVzZS5wZXJsLm9yZz6IZgQTEQIAJgUCSXjf8QIb AwUJD850gAYLCQgHAwIEFQIIAwQWAgMBAh4BAheAAAoJEDKNqGdFD4nsgMQAnjQX R/KDo1MBnadaLOz8L9FI9g+yAJ9KqdWlqoXqTQf/kBpt901txLZabohGBBARAgAG BQJLjEjWAAoJEDSurrM80bDMeKoAnR20C+GWqH+YfuuTXNXl3owpQoFlAKDmU7Tq UHmA9f5GvEmsn/ZOHJBq4YhGBBERAgAGBQJJy4DUAAoJEDbMFaTjWWX83dYAn1pX dnOowKJdsWtDAosC3KuHrAjfAJ9goC+zrtAQ0N+rhu9MeTQ3rUwDV4hGBBMRAgAG BQJKmG3mAAoJEOnWfireQXIWdDsAoJpMYmNu5OIbA+PFFJgt1ZqGH2reAJ9Nhk1a rX70jgjTW95TXro2HsbUoYhmBBMRAgAmAhsDBgsJCAcDAgQVAggDBBYCAwECHgEC F4AFAk1z88QFCROSKWgACgkQMo2oZ0UPieyf0ACgnheEOTIZ4z7/1ZMG5C0WjbIq Pf4AnRkkzf8VTHeVpEQwuC5ko2/evIx/iEYEEBECAAYFAkl8FPcACgkQ7IA58KMX wV0AbACbBJLucQWbH+xGGJFnkhIl56dpC7UAoNFdoZcyZwwhRan/1rDKi9oJZA4z iGYEExECACYCGwMGCwkIBwMCBBUCCAMEFgIDAQIeAQIXgAUCUYU0FAUJF1RQBAAK CRAyjahnRQ+J7OusAJ483A71/pnEw5+lfcer+DLAGqDFawCeI+6X/01UcFq/xLpw xr8aBJ8gmuKIZgQTEQIAJgIbAwYLCQgHAwIEFQIIAwQWAgMBAh4BAheABQJU13at BQkbF/OdAAoJEDKNqGdFD4ns+q8AnRd9dhHzlWUMh1tglnJ3vZiE5cKkAJ437u6c AMe2WWE6+jQH78tsr96MWbQzUEFVU0UgQmF0Y2ggU2lnbmluZyBLZXkgMjAxMSA8 cGF1c2VAcGF1c2UucGVybC5vcmc+iGYEExECACYFAk1z9AcCGwMFCROSKWgGCwkI BwMCBBUCCAMEFgIDAQIeAQIXgAAKCRAyjahnRQ+J7E8TAJ4vr1ukCfTAaci5TXdD hzPdlo2IzgCdGMuYMDuL34qC2rtefbRZHXQ1hnmIZgQTEQIAJgIbAwYLCQgHAwIE FQIIAwQWAgMBAh4BAheABQJRhTQUBQkXVFAEAAoJEDKNqGdFD4nsH3QAoJv+GVrZ A354xUc03kSdspQ6wqlcAJ9XTFU5gWnFwLbb2GNPvK0n3wYcNYhmBBMRAgAmAhsD BgsJCAcDAgQVAggDBBYCAwECHgECF4AFAlTXdq0FCRsX850ACgkQMo2oZ0UPiezf 5QCggNoy7In5p0Yzcu2Cx0S/laxU+JEAn2swX7I8bN29MVt660pv5qV1otNztDNQ QVVTRSBCYXRjaCBTaWduaW5nIEtleSAyMDE1IDxwYXVzZUBwYXVzZS5wZXJsLm9y Zz6IaAQTEQIAKAIbAwYLCQgHAwIGFQgCCQoLBBYCAwECHgECF4AFAlTXdq0FCRsX 850ACgkQMo2oZ0UPiexVnACgiUll56goPt3HZQC89EKFeShExPAAn2iONohuStqx gANqh0UyzD2uCsMeiGgEExECACgFAlGFNKECGwMFCRdUUAQGCwkIBwMCBhUIAgkK CwQWAgMBAh4BAheAAAoJEDKNqGdFD4nsrkoAnAqdPLE1kg+0FwapThQeB96t1HZz AKCfAxKRjd3kSw8HI5sSO+UwF+7tWbQzUEFVU0UgQmF0Y2ggU2lnbmluZyBLZXkg MjAxNyA8cGF1c2VAcGF1c2UucGVybC5vcmc+iGgEExECACgFAlTXduoCGwMFCRsX 850GCwkIBwMCBhUIAgkKCwQWAgMBAh4BAheAAAoJEDKNqGdFD4nsP6wAnAzVz7gq xtlLCcdiZMgrcrEKA87aAJ0eAtF78eOm3ycHIM2mUcmlX+oHu7kCDQQ+PnCyEAgA jAKDcvpogvJvSrg3rkstDhxP4O+JZvfxzrdL9Qk0FPBlb31ECxPMBf2zKObrwGKw xgD3+lSb/y9SgOYnAsuwztn6BqjQ8AVKiI0MFDTa+tLrtY5860X7TxJD9bzMx/A4 gEsYoFZYR4s/alGAzcqFcdQ2IiFnKE4KPtNXEMQ67lCEw5zdYSoJta9JUKsCX3KI /DOne1NnjNZL2dQadqjsEc8mjvUOTXSG1sCawzTP5tNoPHg13GeyJ0XGHbHY35Bb F33yr9kP76+zQFaiMyLDUnyQAU/0P+rm/I6Ts6q4OZwKK/tC5LD0SPDe08uAzkb4 krRqxheo6seHdT7HjdDbKwADBgf/RGpQhhZc+F9o79S9aLV4XnY5CFev4EJvUqq6 TF9V0rvZg148mbO/b8EtOfcBSdvAfo3H8w6wcC7X8Kt/6Pl69UZKuQOt354092gT rjJyg1uZBK9Ey/LSh0k+BNCfIw04+6W8ijARkpdoBrU3CwDKTyroWYkSFDkkzLvJ RTkMpVpqyI0xIEExPXZTf67Abv1dzceTDciblLJfQcsfDyWYv8D12ELEzLYQnFM1 s6yD6Q51Xk/XQ6MJ59bB3uuFO8VpkCMEvqIxZXsLjgqyQgo73y1qFizsKnFG+TTv ooBdG3yqSt9OsLSoRrJkZbMX3PKpbT0ceWL8dULc1v2ol4fJGohMBBgRAgAMBQI+ PnCyBQkDwmcAAAoJEDKNqGdFD4nsS44An14sFX5E2jJc87HFJeqPmeashdayAKCC mOqjo0CW5uepN19pXdP7BujUO7kCDQRB4aCjEAgA0TpR+0K5pXueL9+JfMKqX4yx TqCKWHcEP+cvHSgXOrBB8Y0j/NKMMPj2TIf4I+ecrlIpkuSGjXrurT0GY1pMzQsW Zr6/gRIkzynpCaQlcuY9m9Qk2QuepiI3a6g8Y9kojk5Vj/CTuxmtKreQIzpYiwuo cvSv9tKND/MG9MsYJdGsy28MWhz4Ig8jhiPRC9KdppOCmZo+KLRXGHxsrxItQ9n0 NtLvTPkvWf/3MS/pYCRSUwHuXUGqvn1QT6O2RlbcYXopAlZEyrMmG6UwLltqyNdp Umig0/ECOrSHUBWKdluPUIzxWr/UHY6yTlG/UAtenLJ4Tos9de9mmfE5pCG/bwAD BQgAnSoRZaLMupdhs11JlnSqnWOhv+cGjCspWjWNX5RytQ/82CRC2IDozzJkY41L GqPHQkEO44P9EoAYVLHNXgzq/17sYlcAydJOWv/dsjcaKd+QAy3JmYkZdCeyznF7 6tLAM/7NMeAvdA2a3qLE+kkBYITpvcA+nZZj6KKWiNk1CX+sYVPTPt+LgXwGuHff IMr1CoSxhxp7GqScM2eNEy8Lex05wHC5Sr/3ucdHQ1wxxH/hpYZz6Q1bIM/bFOYo TtFg2crvjRtMS4euP2D+fBCIp0zbzyNlcw+U8icsGpp0JV7kG11XQntg0UiApA18 Qvwon8G7SlvGMC80A+GzUKdqEIhPBBgRAgAPBQJB4aCjAhsMBQkEBFIAAAoJEDKN qGdFD4ns4T4An1oxYBa0a7a7oQ9voKKA6H6KR+FrAJ9C3GLAh2cX0rJHieb72p33 iV7/TLkCDQRFmYK5EAgA7pV2du4vVF/P6R6UPEWHgFh0LgiNhxoyP+nWSC/6F2et ZBaaaS4DvoaVBGfiQ3SjCP5aUrsdeBckhN4F+sO42ZX1+ioAXQYrZ3i80NS9LbwE zeFhgCA+u5MnF+HzapwSI7dQEJchlgbOeAIA5EfS3lbgG4jxUbfMBgvTWeKi/c6S 9IFo9KPaRm9GyScOcGqdZAFRJN3NUKMOPiVdiUxJdl/K1434Vcs9DSMPY3nOb56P JhjSWK+k1IjcV/zOTxSXNJVKnzS9+eybSpgBIkwJYfKxPZQndmEdR4btgwZdD6FJ 21h2YlPJBc8BpFSoIal2Ulz/3d1KbCoE1GmduMDGDwADBwgAu1P2QBZ7uDREdcow hYX6OR/JeMkdV92ueoCTLUnVZv//tNOL5sVVtGB9l4ZbsFaJ41YlUs4CIQu2nGem AKm6fAztVpZoJZ0gNbqIZ2BJmK1ALvR4clBqax1QudZDEcvz5C+ej9cMIzmnnk1P DSE/iH/jBXxVi+QQncd0mpFqYZvCeAUsH/GZwAEwqFDbM3kN+Z+ED9Fy3xOYpBmf UpMCH+i+P49dNeCvNFyRtPElQ/BsRbVdUJy8xZUMT2NZpfR/cLrlWMN6TNPRgAYH eLIlPLYsYsje95/ZSzEXeDP52HAjCVlXTMdhbvQams3Ozvmj+/+pqcB7q6OmzZpb LMcCBohPBBgRAgAPBQJFmYK5AhsMBQkEsQaAAAoJEDKNqGdFD4ns+ZMAoIthsa+z F8MlnHDtmFpDKTJoH4FDAJ9NeBWYgAgj15TYGkXTsXm08udw4bkCDQRJeOBHEAgA 00U9g46xUZsyTsPjbRZAcLRJuz4NVE/pTbnicB01A1DD09vIUHS/CR9Z12wUQD+D 04tWVBW5KwhWACIM24ojFFPcYClnC0VjPkzgd9z3bcc/34KjnSQ3BgpuCgHjdGRk H7X+kWydwfve9eDsb0Er8Sxne4xX8tWHG7r7FHyufHJ+HgX/XVdW+udnp79vU2fp iRkO0S8ymQXmMDJ8nILL9Q9PyzmRAVIoXn5sHubtOGW9x35nq5xDtckd6oTJZjdd EGxSTbVm7wjOQviEIt2SFedGNsc+kitlDsAuUheMBRfiyLNKIcr0yqIvaWQCd76N CCx7wtq263SMjwyxQ7A1MwADBQf+POFyawQBxikgLBnfPm/LKetNgCRJ9gHKspVc s8WkKFmsBUJ+Aq7Sg+qx3MRaPjt41HZpm/8NfzDb89u+oBmCo/wZJDLjX8rWD0oi I9S5SWrC6ObQ5Vn4MQCEGHQncckuKdH4dK7FCqNvsKRI/PsSbwY/Ux+dA9OeAfEd C5Df1Ju7TpUzwih+bOCy9HrU4xLRz7JzjfFF+VOtZJqK7qGcZ2sizRYofQ5lBp+R 4fDODzC3D6fBiPijcX1MUNZ5UH8ZIPXJQIntNN8CPBHumBOhDjkEuF/tEwRbZTVa fxUUFaN/3Ajfj5o6u8tbGUSEDKiwcE5/XTE1BVbJ5hyMnb32TohPBBgRAgAPBQJJ eOBHAhsMBQkElAWAAAoJEDKNqGdFD4nsXKgAnimNgelmdpoudNOPKAJNk7gI6WOl AJ0eSoRxUd7a7v4Tep93L2I2x0CrDLkCDQRNc/QmEAgA3qSWyBuybYF85PW7vNSM 63QoKQbr6LvVNBggBzdX3L4ioeTi9jmqb6jlIRx+rpq2MG57POMhbtiQqfHl4dNk R4d93Optk4dyIgy1n+Hk6zKUbi2UN00pMOVFdJq0TWa0oX4qZ2idPsdBstUfw1m3 2ozU4ne9JZagyF34MoCs6TpQjiT+jT1rh87eBTACYrxR2MssG8OLGuQEcrQ3LXlH xkQmmGmvZMqwoJZ44VrPWmuTjuyYR/qhBUpT8geJvsBdgLR0qTMpmLG75c7Htfmf YoWEyd9q5N82dYQJvYhBLO4dM4SZ+gfIp0BvGAOIyoX2sTvH75Mxj7XNW4jnlvJd 1wADBQgAq7+p4/akEHDIv79bbRtx2CvB7KoelB9s91pxfh8AkXGt2YAFqLGizool pGOPvJbqCVDsgOx2VtC2IPYJT+0OanhK66ko7sSZ3faMQ8a0dFWB8CiMgrtXAFtK T7j1evVyJ4BSAKS8aFRFqNDVRrucF8fBhFc0tRURHroD3rM8kG8/sOntFaqkAJ/o zJcqcpjSRw5+XltfUjM6YcM7iCgEz0kq2qsD4wp/80h58yRTy0uXGQ8DOt3xiuh8 5DRC8UNCceXo/tawYm4sQfZbkqh7YcnHb/E4IFYnHWLC13DtYJxSF2+qlENH1j2p +ngm2IJYJQiE7JaikIwxruQtfE9lHYhPBBgRAgAPBQJNc/QmAhsMBQkEXKaAAAoJ EDKNqGdFD4nsf74An2Gya/xsz527QJEKxDx5M6OE8oaOAJwIPBled8aFVkKMwA7i kwlxhotFVLkCDQRRhTTBEAgAl//enCPC/1M0DET80M2Q6zQw54wRwTI8PiqK7OL6 6v+B8vg4s0UIWX4Kswolw5vbzlQliWoLfcgsZDnEwlTMgKulZGxmOM0C6eERw9dH L/K+BV6bUVu5TbDq5JOpnjMA2Dh2/spjKHge9RlqcdKKwf6TsTrzCKnBFAyzzinO 1cVBzWsPBfYe+hqUQ+eSQA2Vsu3BNqSsWPjZL2v4xPm8mGjRrIMHuw8Edhnflil5 Nu/JDYHDJiWGLZep6sBYAUZwFg/iDGbe8I1RabhwhSeZVJZFDEcx3tlAxUw7jKqk QaO9TfUJE2/cgScoWIyYP9sM3yvkRjVVRZAInYABrpTtKwADBggAgboche64dmxf fWn29bZSoQA387pO1aMGjgv2brNsRbNrvEEWWYuMuomPjk6OxLVT3aGYbhBlgQyg YGBVw29b6GDMoTnX1h7KmZgQLgLrOhJYsawMkI0sB0C+4lNjakomOMvdDg9ahHy8 Ta+6QvEBW3sbgXwXABGagc1xTsyUpiz18eN6wYOvTqyysZWmRNajbEOEW9zX/4eG WYTO44gb9iYYDWx4UsYyLUwLQ9/3pIQ4+L+3Cwrv1jAXkIoPVdqR0UvggF35bm5K NwXsM2gGlMb02Zag2i4A3H3N5JSKgBAqzSHiCYJ1xOyyuW6twffmtuhP6PMXCWpV HldNKFv5e4hPBBgRAgAPBQJRhTTBAhsMBQkEDYyAAAoJEDKNqGdFD4nsJBQAn25f Pc4h4xnB1fo/SytX/VPizNusAKCSbgXTDRobHH4A0KQxTioLgtQHdYhbBBARAgAb BQJDwdPxAwUCeBCGPFtePl0rW0AuXVwqPiQAAAoJEIbmsk2SWE/h0twAn3UcQ3Xg 2AyOmGBMnUOdgpNH28CRAJ9rSQBXnF5DqSt1qv9Dab2asqKfO4hbBBARAgAbBQJD wdP3AwUCeBCGPFtePl0rW0AuXVwqPiQAAAoJEIbmsk2SWE/hyeYAoNa4roCWwYLc OHy2/19HbGeL6yVpAJ91B6hnFIIQZsT7PuQaR20Yhyb4o7kCDQRU13cDEAgAm+UN H8HJ1EtXNipMvtrxP+SaLEhi+idJrUpcNKY092DBpZfyMMPEAOG+7ck10J+7oksh 3AQ6eQsj8sDs8WDefCANXz+YURNYUkm83VR8f1Bn9gRqkezCsklOCSpIaaE/NFjv CIYtZKObTeCs5houHKWaSBulEnMcEzdIddp9DAGFKw8z9B9gIsImw4zbOM2l4Fdg rXqIxCxgEuylZNxyRebMEw+HNOGDO4S1jOW9T/jvjqyj0RNUAuK/DnVWWYOqE7IL bxZz5/TNKqtxQ4dqA9FIYXteWES51Ad74VfcoZ95s9tdeP6C7r+mZ8/tCZodkUhc lAQHtVvvB64ivgdW0wADBQf9HwO8WpgL8S4i4To5mv3TXevvSZoLRk58i4ecT/jL 3brYFqM+Ieui29fH8MJIineB53pr56Tdy+ECKdb68tD1HUJfCeM9CVsEyPUWVHZO 4A4HkE9olzFnHvf4Lr9c5ywxgPWtl+T8cFW4ldLs45qNoBuJiSDb+ncQyEE5KX/3 oDkGb9IB9ypVBfAe5vdlpZCylB8/dYDmUKICEqnaO1pZIJUODAquhz9zo24t3j2h fI9meb9q/ZKhgyRy4NnKziolx+dNNu8cvM3SzWd4Z6MPXK05dvZQOrqwwoFVKMpR w0JZfn4HwD+hWJ5HAJGzk8CZp7YTGqkNNv3IKj+8blmVn4hPBBgRAgAPBQJU13cD AhsMBQkEfu2AAAoJEDKNqGdFD4ns1JoAn393yHlqGQaIY+zvupmDycSzTkD3AKCK 9qKCYRhg40aMgs++6mCYF/SWBohbBBARAgAbBQJDwdPxAwUCeBCGPFtePl0rW0Au XVwqPiQAAAoJEIbmsk2SWE/h0twAn3UcQ3Xg2AyOmGBMnUOdgpNH28CRAJ9rSQBX nF5DqSt1qv9Dab2asqKfO4hbBBARAgAbBQJDwdP3AwUCeBCGPFtePl0rW0AuXVwq PiQAAAoJEIbmsk2SWE/hyeYAoNa4roCWwYLcOHy2/19HbGeL6yVpAJ91B6hnFIIQ ZsT7PuQaR20Yhyb4ow== =SGkP -----END PGP PUBLIC KEY BLOCK----- Module-Signature-0.81/README000644 000765 000024 00000020766 12725464660 016355 0ustar00audreytstaff000000 000000 NAME Module::Signature - Module signature file manipulation SYNOPSIS As a shell command: % cpansign # verify an existing SIGNATURE, or # make a new one if none exists % cpansign sign # make signature; overwrites existing one % cpansign -s # same thing % cpansign verify # verify a signature % cpansign -v # same thing % cpansign -v --skip # ignore files in MANIFEST.SKIP % cpansign help # display this documentation % cpansign -h # same thing In programs: use Module::Signature qw(sign verify SIGNATURE_OK); sign(); sign(overwrite => 1); # overwrites without asking # see the CONSTANTS section below (verify() == SIGNATURE_OK) or die "failed!"; DESCRIPTION Module::Signature adds cryptographic authentications to CPAN distributions, via the special SIGNATURE file. If you are a module user, all you have to do is to remember to run "cpansign -v" (or just "cpansign") before issuing "perl Makefile.PL" or "perl Build.PL"; that will ensure the distribution has not been tampered with. Module authors can easily add the SIGNATURE file to the distribution tarball; see "NOTES" below for how to do it as part of "make dist". If you *really* want to sign a distribution manually, simply add "SIGNATURE" to MANIFEST, then type "cpansign -s" immediately before "make dist". Be sure to delete the SIGNATURE file afterwards. Please also see "NOTES" about MANIFEST.SKIP issues, especially if you are using Module::Build or writing your own MANIFEST.SKIP. VARIABLES No package variables are exported by default. $Verbose If true, Module::Signature will give information during processing including gpg output. If false, Module::Signature will be as quiet as possible as long as everything is working ok. Defaults to false. $SIGNATURE The filename for a distribution's signature file. Defaults to "SIGNATURE". $KeyServer The OpenPGP key server for fetching the author's public key (currently only implemented on "gpg", not "Crypt::OpenPGP"). May be set to a false value to prevent this module from fetching public keys. $KeyServerPort The OpenPGP key server port, defaults to 11371. $Timeout Maximum time to wait to try to establish a link to the key server. Defaults to 3. $AutoKeyRetrieve Whether to automatically fetch unknown keys from the key server. Defaults to 1. $Cipher The default cipher used by the "Digest" module to make signature files. Defaults to "SHA1", but may be changed to other ciphers via the "MODULE_SIGNATURE_CIPHER" environment variable if the SHA1 cipher is undesirable for the user. The cipher specified in the SIGNATURE file's first entry will be used to validate its integrity. For "SHA1", the user needs to have any one of these four modules installed: Digest::SHA, Digest::SHA1, Digest::SHA::PurePerl, or (currently nonexistent) Digest::SHA1::PurePerl. $Preamble The explanatory text written to newly generated SIGNATURE files before the actual entries. ENVIRONMENT Module::Signature honors these environment variables: MODULE_SIGNATURE_CIPHER Works like $Cipher. MODULE_SIGNATURE_VERBOSE Works like $Verbose. MODULE_SIGNATURE_KEYSERVER Works like $KeyServer. MODULE_SIGNATURE_KEYSERVERPORT Works like $KeyServerPort. MODULE_SIGNATURE_TIMEOUT Works like $Timeout. CONSTANTS These constants are not exported by default. CANNOT_VERIFY (0E0) Cannot verify the OpenPGP signature, maybe due to the lack of a network connection to the key server, or if neither gnupg nor Crypt::OpenPGP exists on the system. SIGNATURE_OK (0) Signature successfully verified. SIGNATURE_MISSING (-1) The SIGNATURE file does not exist. SIGNATURE_MALFORMED (-2) The signature file does not contains a valid OpenPGP message. SIGNATURE_BAD (-3) Invalid signature detected -- it might have been tampered with. SIGNATURE_MISMATCH (-4) The signature is valid, but files in the distribution have changed since its creation. MANIFEST_MISMATCH (-5) There are extra files in the current directory not specified by the MANIFEST file. CIPHER_UNKNOWN (-6) The cipher used by the signature file is not recognized by the "Digest" and "Digest::*" modules. NOTES Signing your module as part of "make dist" The easiest way is to use Module::Install: sign; # put this before "WriteAll" WriteAll; For ExtUtils::MakeMaker (version 6.18 or above), you may do this: WriteMakefile( (MM->can('signature_target') ? (SIGN => 1) : ()), # ... original arguments ... ); Users of Module::Build may do this: Module::Build->new( (sign => 1), # ... original arguments ... )->create_build_script; MANIFEST.SKIP Considerations (The following section is lifted from Iain Truskett's Test::Signature module, under the Perl license. Thanks, Iain!) It is imperative that your MANIFEST and MANIFEST.SKIP files be accurate and complete. If you are using "ExtUtils::MakeMaker" and you do not have a MANIFEST.SKIP file, then don't worry about the rest of this. If you do have a MANIFEST.SKIP file, or you use "Module::Build", you must read this. Since the test is run at "make test" time, the distribution has been made. Thus your MANIFEST.SKIP file should have the entries listed below. If you're using "ExtUtils::MakeMaker", you should have, at least: #defaults ^Makefile$ ^blib/ ^pm_to_blib ^blibdirs These entries are part of the default set provided by "ExtUtils::Manifest", which is ignored if you provide your own MANIFEST.SKIP file. If you are using "Module::Build", you should have two extra entries: ^Build$ ^_build/ If you don't have the correct entries, "Module::Signature" will complain that you have: ==> MISMATCHED content between MANIFEST and distribution files! <== You should note this during normal development testing anyway. Testing signatures You may add this code as t/0-signature.t in your distribution tree: #!/usr/bin/perl use strict; print "1..1\n"; if (!$ENV{TEST_SIGNATURE}) { print "ok 1 # skip Set the environment variable", " TEST_SIGNATURE to enable this test\n"; } elsif (!-s 'SIGNATURE') { print "ok 1 # skip No signature file found\n"; } elsif (!eval { require Module::Signature; 1 }) { print "ok 1 # skip ", "Next time around, consider install Module::Signature, ", "so you can verify the integrity of this distribution.\n"; } elsif (!eval { require Socket; Socket::inet_aton('pool.sks-keyservers.net') }) { print "ok 1 # skip ", "Cannot connect to the keyserver\n"; } else { (Module::Signature::verify() == Module::Signature::SIGNATURE_OK()) or print "not "; print "ok 1 # Valid signature\n"; } __END__ If you are already using Test::More for testing, a more straightforward version of t/0-signature.t can be found in the Module::Signature distribution. Note that "MANIFEST.SKIP" is considered by default only when $ENV{TEST_SIGNATURE} is set to a true value. Also, if you prefer a more full-fledged testing package, and are willing to inflict the dependency of Module::Build on your users, Iain Truskett's Test::Signature might be a better choice. SEE ALSO Digest, Digest::SHA, Digest::SHA1, Digest::SHA::PurePerl ExtUtils::Manifest, Crypt::OpenPGP, Test::Signature Module::Install, ExtUtils::MakeMaker, Module::Build Dist::Zilla::Plugin::Signature AUTHORS Audrey Tang CC0 1.0 Universal To the extent possible under law, 唐鳳 has waived all copyright and related or neighboring rights to Module-Signature. This work is published from Taiwan. Module-Signature-0.81/script/000755 000765 000024 00000000000 12763211346 016757 5ustar00audreytstaff000000 000000 Module-Signature-0.81/SIGNATURE000664 000765 000024 00000004732 12763211351 016743 0ustar00audreytstaff000000 000000 This file contains message digests of all files listed in MANIFEST, signed via the Module::Signature module, version 0.80. 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: SHA1 SHA1 9eeaacdc87c8d436142e5b6a3f50d333afc5d508 ANDK2015.pub SHA1 da1a023f132d3be27f2a8c56d487ae9320d69b85 AUDREYT2015.pub SHA1 b6d1dc79056f7912070c84e3b8d5cec519a568dd AUTHORS SHA1 f1220288267a64ea706a3bda21c10d4806509c9c Changes SHA1 6b0e3686874e9845396973b16bf5aad6aa291496 MANIFEST SHA1 af1667da11736451592aeba46d34e38c47a7201c MANIFEST.SKIP SHA1 7a8cace7253b42802f5b698c3804eafa8ad5ef67 META.yml SHA1 d7974085e99fdbde7d13a265693860105fd923eb Makefile.PL SHA1 dad70cafbd8df2bd8489b0c06daf2096fbb5bdae PAUSE2017.pub SHA1 a8423736492ba8e44db6e87e96ac1f52fed4c995 README SHA1 bce3c51bb369419603298064b78e14077b93af66 inc/Module/Install.pm SHA1 fe220f215f645500ce8f14ff5e19d9a28692af56 inc/Module/Install/Base.pm SHA1 b56ed8e42c600e08007d152cf0b1438a7c3b7f6e inc/Module/Install/Can.pm SHA1 8886edb2f956ac9474c7c1018ed8b8263a28a171 inc/Module/Install/External.pm SHA1 99c531a17a67ce5250df2ae151cc48c80d914cde inc/Module/Install/Fetch.pm SHA1 76efdca3603159e0ae0e18f19fe72a0211a69529 inc/Module/Install/Makefile.pm SHA1 2e33e87882d60db3913da6284dd5295e5315e18a inc/Module/Install/Metadata.pm SHA1 01978a56e76a58399af3bd4d022aa990b9669bee inc/Module/Install/Scripts.pm SHA1 c830b819e61bda5eca077c6291293bba61b3b9f2 inc/Module/Install/Win32.pm SHA1 cb52b9d6f88d512d448a6f35ed0af0d1201a134b inc/Module/Install/WriteAll.pm SHA1 a8184988c7820dde3546fa0cc158e35489a7d379 lib/Module/Signature.pm SHA1 fbd7d7bc258c0ebf8ae5627ec4489131d7ec90ff script/cpansign SHA1 3ec6171779122b0bdc69937c283be11b2a15dd89 t/0-signature.t SHA1 307a744384e704d94031df73233f24174b843bc8 t/1-basic.t SHA1 0177dcafa00571440541d6495fce6d3b61f81039 t/2-cygwin.t SHA1 a3bea1f17370e89ccb1c3becf5c1d072d6857fd4 t/3-verify.t SHA1 69614dfba33a1ef498a2161f9e4718092652857c t/wrap.pl SHA1 61377898e9d7cb06d370f45167a925e16736de70 t/wrapped-tests.bin -----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iEYEARECAAYFAlfNEucACgkQtLPdNzw1AaCvkACgmndVq/G6i8LySs2qUt4NuLDe D/EAnRrEJ5FBoZ6lYq1Xe9IlPjZXitYk =+0xx -----END PGP SIGNATURE----- Module-Signature-0.81/t/000755 000765 000024 00000000000 12763211346 015716 5ustar00audreytstaff000000 000000 Module-Signature-0.81/t/0-signature.t000644 000765 000024 00000001721 12044761526 020244 0ustar00audreytstaff000000 000000 #!/usr/bin/perl use strict; use Test::More; if (!$ENV{TEST_SIGNATURE}) { plan skip_all => "Set the environment variable TEST_SIGNATURE to enable this test."; } elsif (!eval { require Module::Signature; 1 }) { plan skip_all => "Next time around, consider installing Module::Signature, ". "so you can verify the integrity of this distribution."; } elsif ( !-e 'SIGNATURE' ) { plan skip_all => "SIGNATURE not found"; } elsif ( -s 'SIGNATURE' == 0 ) { plan skip_all => "SIGNATURE file empty"; } elsif (!eval { require Socket; Socket::inet_aton('pool.sks-keyservers.net') }) { plan skip_all => "Cannot connect to the keyserver to check module ". "signature"; } else { plan tests => 1; } my $ret = Module::Signature::verify(); SKIP: { skip "Module::Signature cannot verify", 1 if $ret eq Module::Signature::CANNOT_VERIFY(); cmp_ok $ret, '==', Module::Signature::SIGNATURE_OK(), "Valid signature"; } Module-Signature-0.81/t/1-basic.t000644 000765 000024 00000000273 12044761526 017326 0ustar00audreytstaff000000 000000 #!/usr/bin/perl use strict; use Test::More tests => 2; use_ok('Module::Signature'); Module::Signature->import('SIGNATURE_OK'); ok(defined(&SIGNATURE_OK), 'constant exported'); __END__ Module-Signature-0.81/t/2-cygwin.t000644 000765 000024 00000000746 12044761526 017553 0ustar00audreytstaff000000 000000 #!/usr/bin/perl -w use strict; use Module::Signature; use Test::More; if ($^O ne 'cygwin') { plan skip_all => "Cygwin only tests"; } elsif (! $ENV{TEST_CYGWIN_GNUPG} ) { plan skip_all => 'Set the environment variable TEST_CYGWIN_GNUPG to enable this test'; } elsif (! -x '/usr/local/bin/gpg') { plan skip_all => '/usr/local/bin/gpg not found'; } plan tests => 1; my $version = Module::Signature::_has_gpg(); like($version, qr/^\d+\.\d+\.\d+$/, "gpg version detected"); Module-Signature-0.81/t/3-verify.t000644 000765 000024 00000001123 12044761526 017546 0ustar00audreytstaff000000 000000 #!perl use strict; use File::Spec; use Test::More; use IPC::Run qw(run); plan tests => 4; $|=1; sub _f ($) {File::Spec->catfile(split /\//, shift);} 0 == system $^X, _f"t/wrap.pl", "-x" or die; for my $tdir (glob("t/test-dat*")) { chdir $tdir or die; my @system = ($^X, "-I../../lib/", "../../script/cpansign", "-v"); my($in,$out,$err); run \@system, \$in, \$out, \$err; my $ret = $?; close $out; my $diff = join "\n", grep /^.SHA1/, split /\n/, $out; ok(0==$ret, "dir[$tdir]system[@system]ret[$ret]out[$out]err[$err]diff[$diff]"); chdir "../../" or die; } Module-Signature-0.81/t/wrap.pl000644 000765 000024 00000006367 12044761526 017242 0ustar00audreytstaff000000 000000 #!/usr/bin/perl # use 5.010; use strict; use warnings; =head1 NAME =head1 SYNOPSIS t/wrap.pl -c # for create t/wrap.pl -x # for extract =head1 OPTIONS =over 8 =cut my @opt = <<'=back' =~ /B<-(\S+)>/g; =item B<-c> Wrap the test files into wrapper file =item B<-f> Path to the wrapper file. Defaults to t/wrapped-tests.bin. =item B<-help|h!> This help =item B<-x> Unwrap the test files from the wrapper file =back =head1 DESCRIPTION The t/ directory contains tests for different line endings. To distribute these tests we wrap them into a Data::Dumper file to avoid problems on distribution verification. Called with -c we create the wrapping file. Called with -x we unwrap the files and install them into place. The test t/3-verify.t calls us with -x. When anything changes that breaks 3-verify.t, then the procedure to create new test files is something like the following: (1) call wrap.pl -x (2) edit files in t/test*; take care that the files in test-datlf* have Unix line endings and the files in test-datcrlf* have DOS line endings. Apart from that keep the files identical (3) sign in t/test-datlf-sigold/ with an old version of Module::Signature (4) copy the signature over to t/test-datcrlf-sigold/ (5) sign in t/test-datlf-signew/ with the upcoming version of Module::Signature (6) copy the signature over to t/test-datcrlf-signew/ (7) call wrap.pl -c =cut use FindBin; use lib "$FindBin::Bin/../lib"; BEGIN { push @INC, qw( ); } use Data::Dumper; use File::Basename qw(dirname); use File::Path qw(mkpath); use File::Spec; use Getopt::Long; use Pod::Usage; our %Opt; GetOptions(\%Opt, @opt, ) or pod2usage(1); $Opt{f} ||= "t/wrapped-tests.bin"; sub _f ($) {File::Spec->catfile(split /\//, shift);} my @files = qw(t/test-datcrlf-signew/MANIFEST t/test-datcrlf-signew/README t/test-datcrlf-signew/42.gz t/test-datcrlf-signew/SIGNATURE t/test-datcrlf-sigold/MANIFEST t/test-datcrlf-sigold/README t/test-datcrlf-sigold/42.gz t/test-datcrlf-sigold/SIGNATURE t/test-datlf-signew/MANIFEST t/test-datlf-signew/README t/test-datlf-signew/42.gz t/test-datlf-signew/SIGNATURE t/test-datlf-sigold/MANIFEST t/test-datlf-sigold/README t/test-datlf-sigold/42.gz t/test-datlf-sigold/SIGNATURE ); 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.81/t/wrapped-tests.bin000644 000765 000024 00000012414 12044761526 021216 0ustar00audreytstaff000000 000000 $VAR1 = { "t/test-datcrlf-signew/42.gz" => "\37\213\b\b\336\0343:\2\00342\00031\342\2\0001)\206\321\3\0\0\0", "t/test-datcrlf-signew/MANIFEST" => "MANIFEST\r\nREADME\r\nSIGNATURE\r\n42.gz\r\n", "t/test-datcrlf-signew/README" => "If this file in in a *datlf*/ directory it should be in Unix format.\r\nIn a *datcrlf*/ directory it should be in DOS format.\r\n", "t/test-datcrlf-signew/SIGNATURE" => "This file contains message digests of all files listed in MANIFEST,\nsigned via the Module::Signature module, version 0.67.\n\nTo verify the content in this distribution, first make sure you have\nModule::Signature installed, then type:\n\n % cpansign -v\n\nIt will check each file's integrity, as well as the signature's\nvalidity. If \"==> Signature verified OK! <==\" is not displayed,\nthe distribution may already have been compromised, and you should\nnot run its Makefile.PL or Build.PL.\n\n-----BEGIN PGP SIGNED MESSAGE-----\nHash: SHA1\n\nSHA1 51e1c061bc02e9a38948a5d8e3ca7352830f0fac 42.gz\nSHA1 794d166f65491a45e3a2302d9f7afc2c2220517f MANIFEST\nSHA1 e6687057436325f3cf38d3f5c9adb8f45f79b9b4 README\n-----BEGIN PGP SIGNATURE-----\nVersion: GnuPG v1.4.10 (GNU/Linux)\n\niEYEARECAAYFAk3HrSEACgkQ7IA58KMXwV07YACgkZc8HxRHWMhsbMnrxn/gCV7I\nFsoAoIG0JZLzpno/V4PpQBNaw0wqEvsB\n=io4w\n-----END PGP SIGNATURE-----\n", "t/test-datcrlf-sigold/42.gz" => "\37\213\b\b\336\0343:\2\00342\00031\342\2\0001)\206\321\3\0\0\0", "t/test-datcrlf-sigold/MANIFEST" => "MANIFEST\r\nREADME\r\nSIGNATURE\r\n42.gz\r\n", "t/test-datcrlf-sigold/README" => "If this file in in a *datlf*/ directory it should be in Unix format.\r\nIn a *datcrlf*/ directory it should be in DOS format.\r\n", "t/test-datcrlf-sigold/SIGNATURE" => "This file contains message digests of all files listed in MANIFEST,\nsigned via the Module::Signature module, version 0.63.\n\nTo verify the content in this distribution, first make sure you have\nModule::Signature installed, then type:\n\n % cpansign -v\n\nIt will check each file's integrity, as well as the signature's\nvalidity. If \"==> Signature verified OK! <==\" is not displayed,\nthe distribution may already have been compromised, and you should\nnot run its Makefile.PL or Build.PL.\n\n-----BEGIN PGP SIGNED MESSAGE-----\nHash: SHA1\n\nSHA1 51e1c061bc02e9a38948a5d8e3ca7352830f0fac 42.gz\nSHA1 794d166f65491a45e3a2302d9f7afc2c2220517f MANIFEST\nSHA1 e6687057436325f3cf38d3f5c9adb8f45f79b9b4 README\n-----BEGIN PGP SIGNATURE-----\nVersion: GnuPG v1.4.10 (GNU/Linux)\n\niEYEARECAAYFAk3HrD8ACgkQ7IA58KMXwV3vsACfXu9Z1yCErjXA4wdAaN4B/Dc9\nG8AAoJini6NfED9pJmWGcX6efvqHl1qB\n=XXLY\n-----END PGP SIGNATURE-----\n", "t/test-datlf-signew/42.gz" => "\37\213\b\b\336\0343:\2\00342\00031\342\2\0001)\206\321\3\0\0\0", "t/test-datlf-signew/MANIFEST" => "MANIFEST\nREADME\nSIGNATURE\n42.gz\n", "t/test-datlf-signew/README" => "If this file in in a *datlf*/ directory it should be in Unix format.\nIn a *datcrlf*/ directory it should be in DOS format.\n", "t/test-datlf-signew/SIGNATURE" => "This file contains message digests of all files listed in MANIFEST,\nsigned via the Module::Signature module, version 0.67.\n\nTo verify the content in this distribution, first make sure you have\nModule::Signature installed, then type:\n\n % cpansign -v\n\nIt will check each file's integrity, as well as the signature's\nvalidity. If \"==> Signature verified OK! <==\" is not displayed,\nthe distribution may already have been compromised, and you should\nnot run its Makefile.PL or Build.PL.\n\n-----BEGIN PGP SIGNED MESSAGE-----\nHash: SHA1\n\nSHA1 51e1c061bc02e9a38948a5d8e3ca7352830f0fac 42.gz\nSHA1 794d166f65491a45e3a2302d9f7afc2c2220517f MANIFEST\nSHA1 e6687057436325f3cf38d3f5c9adb8f45f79b9b4 README\n-----BEGIN PGP SIGNATURE-----\nVersion: GnuPG v1.4.10 (GNU/Linux)\n\niEYEARECAAYFAk3HrSEACgkQ7IA58KMXwV07YACgkZc8HxRHWMhsbMnrxn/gCV7I\nFsoAoIG0JZLzpno/V4PpQBNaw0wqEvsB\n=io4w\n-----END PGP SIGNATURE-----\n", "t/test-datlf-sigold/42.gz" => "\37\213\b\b\336\0343:\2\00342\00031\342\2\0001)\206\321\3\0\0\0", "t/test-datlf-sigold/MANIFEST" => "MANIFEST\nREADME\nSIGNATURE\n42.gz\n", "t/test-datlf-sigold/README" => "If this file in in a *datlf*/ directory it should be in Unix format.\nIn a *datcrlf*/ directory it should be in DOS format.\n", "t/test-datlf-sigold/SIGNATURE" => "This file contains message digests of all files listed in MANIFEST,\nsigned via the Module::Signature module, version 0.63.\n\nTo verify the content in this distribution, first make sure you have\nModule::Signature installed, then type:\n\n % cpansign -v\n\nIt will check each file's integrity, as well as the signature's\nvalidity. If \"==> Signature verified OK! <==\" is not displayed,\nthe distribution may already have been compromised, and you should\nnot run its Makefile.PL or Build.PL.\n\n-----BEGIN PGP SIGNED MESSAGE-----\nHash: SHA1\n\nSHA1 51e1c061bc02e9a38948a5d8e3ca7352830f0fac 42.gz\nSHA1 794d166f65491a45e3a2302d9f7afc2c2220517f MANIFEST\nSHA1 e6687057436325f3cf38d3f5c9adb8f45f79b9b4 README\n-----BEGIN PGP SIGNATURE-----\nVersion: GnuPG v1.4.10 (GNU/Linux)\n\niEYEARECAAYFAk3HrD8ACgkQ7IA58KMXwV3vsACfXu9Z1yCErjXA4wdAaN4B/Dc9\nG8AAoJini6NfED9pJmWGcX6efvqHl1qB\n=XXLY\n-----END PGP SIGNATURE-----\n" }; Module-Signature-0.81/script/cpansign000644 000765 000024 00000003760 12725464660 020521 0ustar00audreytstaff000000 000000 #!/usr/bin/perl $VERSION = '0.06'; =encoding utf8 =head1 NAME cpansign - CPAN signature management utility =head1 SYNOPSIS % cpansign # verify an existing SIGNATURE, or # make a new one if none exists % cpansign file.par # verify or sign a PAR file % cpansign sign # make signature; overwrites existing one % cpansign -s # same thing % cpansign verify # verify a signature % cpansign -v # same thing % cpansign -v --skip # ignore files in MANIFEST.SKIP % cpansign help # display this documentation % cpansign -h # same thing =head1 DESCRIPTION This utility lets you create and verify SIGNATURE files. =cut use strict; use Module::Signature; $Module::Signature::Verbose = 1; my %cmd = ( s => 'sign', v => 'verify', h => 'help', ); my $op = $ARGV[0]; $op =~ s/^--?// if defined $op; my $dwim; if (!$op or $op eq 'skip' or -e $op) { $op = (-e 'SIGNATURE' ? 'verify' : 'sign'); $dwim = 1; } my $cmd = $cmd{substr($op, 0, 1)}; (system("perldoc $0"), exit) if $cmd eq 'help'; my @args; push @args, (overwrite => '1') if $cmd eq 'sign'; push @args, (skip => '1') if grep /^-?-?skip/, @ARGV; if (my $sub = Module::Signature->can($cmd)) { if (@ARGV and -e $ARGV[-1]) { require PAR::Dist; PAR::Dist::_verify_or_sign( dist => $ARGV[-1], $dwim ? () : (action => $cmd, @args) ); } else { #if ($cmd eq 'sign') { # exit unless Module::Signature::verify(); #} exit($sub->(@args)); } } else { die "Unknown command: '$op'.\n". "Available actions: " . (join(', ', sort values %cmd)) . ".\n"; } exit; =head1 SEE ALSO L =head1 AUTHORS Audrey Tang Eautrijus@autrijus.orgE =head1 LICENSE This work is under the B license. To the extent possible under law, 唐鳳 has waived all copyright and related or neighboring rights to Module-Signature. This work is published from Taiwan. L =cut Module-Signature-0.81/lib/Module/000755 000765 000024 00000000000 12763211346 017446 5ustar00audreytstaff000000 000000 Module-Signature-0.81/lib/Module/Signature.pm000644 000765 000024 00000070352 12763211323 021747 0ustar00audreytstaff000000 000000 package Module::Signature; $Module::Signature::VERSION = '0.81'; 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 constant CANNOT_VERIFY => '0E0'; use constant SIGNATURE_OK => 0; use constant SIGNATURE_MISSING => -1; use constant SIGNATURE_MALFORMED => -2; use constant SIGNATURE_BAD => -3; use constant SIGNATURE_MISMATCH => -4; use constant MANIFEST_MISMATCH => -5; use constant CIPHER_UNKNOWN => -6; use ExtUtils::Manifest (); use Exporter; use File::Spec; @EXPORT_OK = ( qw(sign verify), qw($SIGNATURE $AUTHOR $KeyServer $Cipher $Preamble), (grep { /^[A-Z_]+_[A-Z_]+$/ } keys %Module::Signature::), ); @ISA = 'Exporter'; $AUTHOR = $ENV{MODULE_SIGNATURE_AUTHOR}; $SIGNATURE = 'SIGNATURE'; $Timeout = $ENV{MODULE_SIGNATURE_TIMEOUT} || 3; $Verbose = $ENV{MODULE_SIGNATURE_VERBOSE} || 0; $KeyServer = $ENV{MODULE_SIGNATURE_KEYSERVER} || 'pool.sks-keyservers.net'; $KeyServerPort = $ENV{MODULE_SIGNATURE_KEYSERVERPORT} || '11371'; $Cipher = $ENV{MODULE_SIGNATURE_CIPHER} || 'SHA1'; $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; 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"; while () { next if (1 .. ($_ eq $begin)); $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 $SIGNATURE -" or (warn "Could not call diff: $!", return SIGNATURE_MISMATCH); while () { print D $_ if (1 .. /^-----BEGIN PGP SIGNED MESSAGE-----/); print D if (/^Hash: / .. /^$/); next if (1 .. /^-----BEGIN PGP SIGNATURE/); print D $str2, "-----BEGIN PGP SIGNATURE-----\n", $_ and last; } print D ; close D; } return SIGNATURE_MISMATCH; } sub sign { my %args = ( skip => 1, @_ ); my $overwrite = $args{overwrite}; my $plaintext = _mkdigest(); my ($mani, $file) = _fullcheck($args{skip}); if (@{$mani} or @{$file}) { warn "==> MISMATCHED content between MANIFEST and the distribution! <==\n"; warn "==> Please correct your MANIFEST file and/or delete extra files. <==\n"; } if (!$overwrite and -e $SIGNATURE and -t STDIN) { local $/ = "\n"; print "$SIGNATURE already exists; overwrite [y/N]? "; return unless =~ /[Yy]/; } if (my $version = _has_gpg()) { _sign_gpg($SIGNATURE, $plaintext, $version); } elsif (eval {require Crypt::OpenPGP; 1}) { _sign_crypt_openpgp($SIGNATURE, $plaintext); } else { die 'Cannot use GnuPG or Crypt::OpenPGP, please install either one first!'; } warn "==> SIGNATURE file created successfully. <==\n"; return SIGNATURE_OK; } sub _sign_gpg { my ($sigfile, $plaintext, $version) = @_; die "Could not write to $sigfile" if -e $sigfile and (-d $sigfile or not -w $sigfile); my $gpg = _which_gpg(); local *D; my $set_key = ''; $set_key = qq{--default-key "$AUTHOR"} if($AUTHOR); open D, "| $gpg $set_key --clearsign >> $sigfile.tmp" or die "Could not call $gpg: $!"; print D $plaintext; close D; (-e "$sigfile.tmp" and -s "$sigfile.tmp") or do { unlink "$sigfile.tmp"; die "Cannot find $sigfile.tmp, signing aborted.\n"; }; open D, "< $sigfile.tmp" or die "Cannot open $sigfile.tmp: $!"; open S, "> $sigfile" or do { unlink "$sigfile.tmp"; die "Could not write to $sigfile: $!"; }; print S $Preamble; print S ; close S; close D; unlink("$sigfile.tmp"); my $key_id; my $key_name; # This doesn't work because the output from verify goes to STDERR. # If I try to redirect it using "--logger-fd 1" it just hangs. # WTF? my @verify = `$gpg --batch --verify $SIGNATURE`; while (@verify) { if (/key ID ([0-9A-F]+)$/) { $key_id = $1; } elsif (/signature from "(.+)"$/) { $key_name = $1; } } my $found_name; my $found_key; if (defined $key_id && defined $key_name) { my $keyserver = _keyserver($version); while (`$gpg --batch --keyserver=$keyserver --search-keys '$key_name'`) { if (/^\(\d+\)/) { $found_name = 0; } elsif ($found_name) { if (/key \Q$key_id\E/) { $found_key = 1; last; } } if (/\Q$key_name\E/) { $found_name = 1; next; } } unless ($found_key) { _warn_non_public_signature($key_name); } } return 1; } sub _sign_crypt_openpgp { my ($sigfile, $plaintext) = @_; require Crypt::OpenPGP; my $pgp = Crypt::OpenPGP->new; my $ring = Crypt::OpenPGP::KeyRing->new( Filename => $pgp->{cfg}->get('SecRing') ) or die $pgp->error(Crypt::OpenPGP::KeyRing->errstr); my $kb = $ring->find_keyblock_by_index(-1) or die $pgp->error('Can\'t find last keyblock: ' . $ring->errstr); my $cert = $kb->signing_key; my $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 (-B $file) { binmode(F); $obj->addfile(*F); $this_hexdigest = $obj->hexdigest; } elsif ($^O eq 'MSWin32') { $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; } } } $digest{$file} = [$this_cipher, $this_hexdigest]; $obj->reset; } } return \%digest; } 1; __END__ =encoding utf8 =head1 NAME Module::Signature - Module signature file manipulation =head1 SYNOPSIS As a shell command: % cpansign # verify an existing SIGNATURE, or # make a new one if none exists % cpansign sign # make signature; overwrites existing one % cpansign -s # same thing % cpansign verify # verify a signature % cpansign -v # same thing % cpansign -v --skip # ignore files in MANIFEST.SKIP % cpansign help # display this documentation % cpansign -h # same thing In programs: use Module::Signature qw(sign verify SIGNATURE_OK); sign(); sign(overwrite => 1); # overwrites without asking # see the CONSTANTS section below (verify() == SIGNATURE_OK) or die "failed!"; =head1 DESCRIPTION B adds cryptographic authentications to CPAN distributions, via the special F file. If you are a module user, all you have to do is to remember to run C (or just C) before issuing C or C; that will ensure the distribution has not been tampered with. Module authors can easily add the F file to the distribution tarball; see L below for how to do it as part of C. If you I want to sign a distribution manually, simply add C to F, then type C immediately before C. Be sure to delete the F file afterwards. Please also see L about F issues, especially if you are using B or writing your own F. =head1 VARIABLES No package variables are exported by default. =over 4 =item $Verbose If true, Module::Signature will give information during processing including gpg output. If false, Module::Signature will be as quiet as possible as long as everything is working ok. Defaults to false. =item $SIGNATURE The filename for a distribution's signature file. Defaults to C. =item $AUTHOR The key ID used for C signature. If empty/null/0, C's configured default ID will be used for the signature. NOTE: this is used B if C is available to create the signature. =item $KeyServer The OpenPGP key server for fetching the author's public key (currently only implemented on C, not C). May be set to a false value to prevent this module from fetching public keys. =item $KeyServerPort The OpenPGP key server port, defaults to C<11371>. =item $Timeout Maximum time to wait to try to establish a link to the key server. Defaults to C<3>. =item $AutoKeyRetrieve Whether to automatically fetch unknown keys from the key server. Defaults to C<1>. =item $Cipher The default cipher used by the C module to make signature files. Defaults to C, but may be changed to other ciphers via the C environment variable if the SHA1 cipher is undesirable for the user. The cipher specified in the F file's first entry will be used to validate its integrity. For C, the user needs to have any one of these four modules installed: B, B, B, or (currently nonexistent) B. =item $Preamble The explanatory text written to newly generated F files before the actual entries. =back =head1 ENVIRONMENT B honors these environment variables: =over 4 =item MODULE_SIGNATURE_AUTHOR Works like C<$AUTHOR>. =item MODULE_SIGNATURE_CIPHER Works like C<$Cipher>. =item MODULE_SIGNATURE_VERBOSE Works like C<$Verbose>. =item MODULE_SIGNATURE_KEYSERVER Works like C<$KeyServer>. =item MODULE_SIGNATURE_KEYSERVERPORT Works like C<$KeyServerPort>. =item MODULE_SIGNATURE_TIMEOUT Works like C<$Timeout>. =back =head1 CONSTANTS These constants are not exported by default. =over 4 =item CANNOT_VERIFY (C<0E0>) Cannot verify the OpenPGP signature, maybe due to the lack of a network connection to the key server, or if neither gnupg nor Crypt::OpenPGP exists on the system. =item SIGNATURE_OK (C<0>) Signature successfully verified. =item SIGNATURE_MISSING (C<-1>) The F file does not exist. =item SIGNATURE_MALFORMED (C<-2>) The signature file does not contains a valid OpenPGP message. =item SIGNATURE_BAD (C<-3>) Invalid signature detected -- it might have been tampered with. =item SIGNATURE_MISMATCH (C<-4>) The signature is valid, but files in the distribution have changed since its creation. =item MANIFEST_MISMATCH (C<-5>) There are extra files in the current directory not specified by the MANIFEST file. =item CIPHER_UNKNOWN (C<-6>) The cipher used by the signature file is not recognized by the C and C modules. =back =head1 NOTES =head2 Signing your module as part of C The easiest way is to use B: sign; # put this before "WriteAll" WriteAll; For B (version 6.18 or above), you may do this: WriteMakefile( (MM->can('signature_target') ? (SIGN => 1) : ()), # ... original arguments ... ); Users of B may do this: Module::Build->new( (sign => 1), # ... original arguments ... )->create_build_script; =head2 F Considerations (The following section is lifted from Iain Truskett's B module, under the Perl license. Thanks, Iain!) It is B that your F and F files be accurate and complete. If you are using C and you do not have a F file, then don't worry about the rest of this. If you do have a F file, or you use C, you must read this. Since the test is run at C time, the distribution has been made. Thus your F file should have the entries listed below. If you're using C, you should have, at least: #defaults ^Makefile$ ^blib/ ^pm_to_blib ^blibdirs These entries are part of the default set provided by C, which is ignored if you provide your own F file. If you are using C, you should have two extra entries: ^Build$ ^_build/ If you don't have the correct entries, C will complain that you have: ==> MISMATCHED content between MANIFEST and distribution files! <== You should note this during normal development testing anyway. =head2 Testing signatures You may add this code as F in your distribution tree: #!/usr/bin/perl use strict; print "1..1\n"; if (!$ENV{TEST_SIGNATURE}) { print "ok 1 # skip Set the environment variable", " TEST_SIGNATURE to enable this test\n"; } elsif (!-s 'SIGNATURE') { print "ok 1 # skip No signature file found\n"; } elsif (!eval { require Module::Signature; 1 }) { print "ok 1 # skip ", "Next time around, consider install Module::Signature, ", "so you can verify the integrity of this distribution.\n"; } elsif (!eval { require Socket; Socket::inet_aton('pool.sks-keyservers.net') }) { print "ok 1 # skip ", "Cannot connect to the keyserver\n"; } else { (Module::Signature::verify() == Module::Signature::SIGNATURE_OK()) or print "not "; print "ok 1 # Valid signature\n"; } __END__ If you are already using B for testing, a more straightforward version of F can be found in the B distribution. Note that C is considered by default only when C<$ENV{TEST_SIGNATURE}> is set to a true value. Also, if you prefer a more full-fledged testing package, and are willing to inflict the dependency of B on your users, Iain Truskett's B might be a better choice. =cut =head1 SEE ALSO L, L, L, L L, L, L L, L, L L =head1 AUTHORS Audrey Tang Ecpan@audreyt.orgE =head1 LICENSE This work is under a B License, although a portion of the documentation (as detailed above) is under the Perl license. To the extent possible under law, 唐鳳 has waived all copyright and related or neighboring rights to Module-Signature. This work is published from Taiwan. L =cut Module-Signature-0.81/inc/Module/000755 000765 000024 00000000000 12763211346 017451 5ustar00audreytstaff000000 000000 Module-Signature-0.81/inc/Module/Install/000755 000765 000024 00000000000 12763211346 021057 5ustar00audreytstaff000000 000000 Module-Signature-0.81/inc/Module/Install.pm000644 000765 000024 00000030217 12763211344 021416 0ustar00audreytstaff000000 000000 #line 1 package Module::Install; # For any maintainers: # The load order for Module::Install is a bit magic. # It goes something like this... # # IF ( host has Module::Install installed, creating author mode ) { # 1. Makefile.PL calls "use inc::Module::Install" # 2. $INC{inc/Module/Install.pm} set to installed version of inc::Module::Install # 3. The installed version of inc::Module::Install loads # 4. inc::Module::Install calls "require Module::Install" # 5. The ./inc/ version of Module::Install loads # } ELSE { # 1. Makefile.PL calls "use inc::Module::Install" # 2. $INC{inc/Module/Install.pm} set to ./inc/ version of Module::Install # 3. The ./inc/ version of Module::Install loads # } use 5.006; use strict 'vars'; use Cwd (); use File::Find (); use File::Path (); use vars qw{$VERSION $MAIN}; BEGIN { # All Module::Install core packages now require synchronised versions. # This will be used to ensure we don't accidentally load old or # different versions of modules. # This is not enforced yet, but will be some time in the next few # releases once we can make sure it won't clash with custom # Module::Install extensions. $VERSION = '1.16'; # Storage for the pseudo-singleton $MAIN = undef; *inc::Module::Install::VERSION = *VERSION; @inc::Module::Install::ISA = __PACKAGE__; } sub import { my $class = shift; my $self = $class->new(@_); my $who = $self->_caller; #------------------------------------------------------------- # all of the following checks should be included in import(), # to allow "eval 'require Module::Install; 1' to test # installation of Module::Install. (RT #51267) #------------------------------------------------------------- # Whether or not inc::Module::Install is actually loaded, the # $INC{inc/Module/Install.pm} is what will still get set as long as # the caller loaded module this in the documented manner. # If not set, the caller may NOT have loaded the bundled version, and thus # they may not have a MI version that works with the Makefile.PL. This would # result in false errors or unexpected behaviour. And we don't want that. my $file = join( '/', 'inc', split /::/, __PACKAGE__ ) . '.pm'; unless ( $INC{$file} ) { die <<"END_DIE" } Please invoke ${\__PACKAGE__} with: use inc::${\__PACKAGE__}; not: use ${\__PACKAGE__}; END_DIE # This reportedly fixes a rare Win32 UTC file time issue, but # as this is a non-cross-platform XS module not in the core, # we shouldn't really depend on it. See RT #24194 for detail. # (Also, this module only supports Perl 5.6 and above). eval "use Win32::UTCFileTime" if $^O eq 'MSWin32' && $] >= 5.006; # If the script that is loading Module::Install is from the future, # then make will detect this and cause it to re-run over and over # again. This is bad. Rather than taking action to touch it (which # is unreliable on some platforms and requires write permissions) # for now we should catch this and refuse to run. if ( -f $0 ) { my $s = (stat($0))[9]; # If the modification time is only slightly in the future, # sleep briefly to remove the problem. my $a = $s - time; if ( $a > 0 and $a < 5 ) { sleep 5 } # Too far in the future, throw an error. my $t = time; if ( $s > $t ) { die <<"END_DIE" } Your installer $0 has a modification time in the future ($s > $t). This is known to create infinite loops in make. Please correct this, then run $0 again. END_DIE } # Build.PL was formerly supported, but no longer is due to excessive # difficulty in implementing every single feature twice. if ( $0 =~ /Build.PL$/i ) { die <<"END_DIE" } Module::Install no longer supports Build.PL. It was impossible to maintain duel backends, and has been deprecated. Please remove all Build.PL files and only use the Makefile.PL installer. END_DIE #------------------------------------------------------------- # To save some more typing in Module::Install installers, every... # use inc::Module::Install # ...also acts as an implicit use strict. $^H |= strict::bits(qw(refs subs vars)); #------------------------------------------------------------- unless ( -f $self->{file} ) { foreach my $key (keys %INC) { delete $INC{$key} if $key =~ /Module\/Install/; } local $^W; require "$self->{path}/$self->{dispatch}.pm"; File::Path::mkpath("$self->{prefix}/$self->{author}"); $self->{admin} = "$self->{name}::$self->{dispatch}"->new( _top => $self ); $self->{admin}->init; @_ = ($class, _self => $self); goto &{"$self->{name}::import"}; } local $^W; *{"${who}::AUTOLOAD"} = $self->autoload; $self->preload; # Unregister loader and worker packages so subdirs can use them again delete $INC{'inc/Module/Install.pm'}; delete $INC{'Module/Install.pm'}; # Save to the singleton $MAIN = $self; return 1; } sub autoload { my $self = shift; my $who = $self->_caller; my $cwd = Cwd::getcwd(); my $sym = "${who}::AUTOLOAD"; $sym->{$cwd} = sub { my $pwd = Cwd::getcwd(); if ( my $code = $sym->{$pwd} ) { # Delegate back to parent dirs goto &$code unless $cwd eq $pwd; } unless ($$sym =~ s/([^:]+)$//) { # XXX: it looks like we can't retrieve the missing function # via $$sym (usually $main::AUTOLOAD) in this case. # I'm still wondering if we should slurp Makefile.PL to # get some context or not ... my ($package, $file, $line) = caller; die <<"EOT"; Unknown function is found at $file line $line. Execution of $file aborted due to runtime errors. If you're a contributor to a project, you may need to install some Module::Install extensions from CPAN (or other repository). If you're a user of a module, please contact the author. EOT } my $method = $1; if ( uc($method) eq $method ) { # Do nothing return; } elsif ( $method =~ /^_/ and $self->can($method) ) { # Dispatch to the root M:I class return $self->$method(@_); } # Dispatch to the appropriate plugin unshift @_, ( $self, $1 ); goto &{$self->can('call')}; }; } sub preload { my $self = shift; unless ( $self->{extensions} ) { $self->load_extensions( "$self->{prefix}/$self->{path}", $self ); } my @exts = @{$self->{extensions}}; unless ( @exts ) { @exts = $self->{admin}->load_all_extensions; } my %seen; foreach my $obj ( @exts ) { while (my ($method, $glob) = each %{ref($obj) . '::'}) { next unless $obj->can($method); next if $method =~ /^_/; next if $method eq uc($method); $seen{$method}++; } } my $who = $self->_caller; foreach my $name ( sort keys %seen ) { local $^W; *{"${who}::$name"} = sub { ${"${who}::AUTOLOAD"} = "${who}::$name"; goto &{"${who}::AUTOLOAD"}; }; } } sub new { my ($class, %args) = @_; delete $INC{'FindBin.pm'}; { # to suppress the redefine warning local $SIG{__WARN__} = sub {}; require FindBin; } # ignore the prefix on extension modules built from top level. my $base_path = Cwd::abs_path($FindBin::Bin); unless ( Cwd::abs_path(Cwd::getcwd()) eq $base_path ) { delete $args{prefix}; } return $args{_self} if $args{_self}; $args{dispatch} ||= 'Admin'; $args{prefix} ||= 'inc'; $args{author} ||= ($^O eq 'VMS' ? '_author' : '.author'); $args{bundle} ||= 'inc/BUNDLES'; $args{base} ||= $base_path; $class =~ s/^\Q$args{prefix}\E:://; $args{name} ||= $class; $args{version} ||= $class->VERSION; unless ( $args{path} ) { $args{path} = $args{name}; $args{path} =~ s!::!/!g; } $args{file} ||= "$args{base}/$args{prefix}/$args{path}.pm"; $args{wrote} = 0; bless( \%args, $class ); } sub call { my ($self, $method) = @_; my $obj = $self->load($method) or return; splice(@_, 0, 2, $obj); goto &{$obj->can($method)}; } sub load { my ($self, $method) = @_; $self->load_extensions( "$self->{prefix}/$self->{path}", $self ) unless $self->{extensions}; foreach my $obj (@{$self->{extensions}}) { return $obj if $obj->can($method); } my $admin = $self->{admin} or die <<"END_DIE"; The '$method' method does not exist in the '$self->{prefix}' path! Please remove the '$self->{prefix}' directory and run $0 again to load it. END_DIE my $obj = $admin->load($method, 1); push @{$self->{extensions}}, $obj; $obj; } sub load_extensions { my ($self, $path, $top) = @_; my $should_reload = 0; unless ( grep { ! ref $_ and lc $_ eq lc $self->{prefix} } @INC ) { unshift @INC, $self->{prefix}; $should_reload = 1; } foreach my $rv ( $self->find_extensions($path) ) { my ($file, $pkg) = @{$rv}; next if $self->{pathnames}{$pkg}; local $@; my $new = eval { local $^W; require $file; $pkg->can('new') }; unless ( $new ) { warn $@ if $@; next; } $self->{pathnames}{$pkg} = $should_reload ? delete $INC{$file} : $INC{$file}; push @{$self->{extensions}}, &{$new}($pkg, _top => $top ); } $self->{extensions} ||= []; } sub find_extensions { my ($self, $path) = @_; my @found; File::Find::find( sub { my $file = $File::Find::name; return unless $file =~ m!^\Q$path\E/(.+)\.pm\Z!is; my $subpath = $1; return if lc($subpath) eq lc($self->{dispatch}); $file = "$self->{path}/$subpath.pm"; my $pkg = "$self->{name}::$subpath"; $pkg =~ s!/!::!g; # If we have a mixed-case package name, assume case has been preserved # correctly. Otherwise, root through the file to locate the case-preserved # version of the package name. if ( $subpath eq lc($subpath) || $subpath eq uc($subpath) ) { my $content = Module::Install::_read($subpath . '.pm'); my $in_pod = 0; foreach ( split /\n/, $content ) { $in_pod = 1 if /^=\w/; $in_pod = 0 if /^=cut/; next if ($in_pod || /^=cut/); # skip pod text next if /^\s*#/; # and comments if ( m/^\s*package\s+($pkg)\s*;/i ) { $pkg = $1; last; } } } push @found, [ $file, $pkg ]; }, $path ) if -d $path; @found; } ##################################################################### # Common Utility Functions sub _caller { my $depth = 0; my $call = caller($depth); while ( $call eq __PACKAGE__ ) { $depth++; $call = caller($depth); } return $call; } # Done in evals to avoid confusing Perl::MinimumVersion eval( $] >= 5.006 ? <<'END_NEW' : <<'END_OLD' ); die $@ if $@; sub _read { local *FH; open( FH, '<', $_[0] ) or die "open($_[0]): $!"; binmode FH; my $string = do { local $/; }; close FH or die "close($_[0]): $!"; return $string; } END_NEW sub _read { local *FH; open( FH, "< $_[0]" ) or die "open($_[0]): $!"; binmode FH; my $string = do { local $/; }; close FH or die "close($_[0]): $!"; return $string; } END_OLD sub _readperl { my $string = Module::Install::_read($_[0]); $string =~ s/(?:\015{1,2}\012|\015|\012)/\n/sg; $string =~ s/(\n)\n*__(?:DATA|END)__\b.*\z/$1/s; $string =~ s/\n\n=\w+.+?\n\n=cut\b.+?\n+/\n\n/sg; return $string; } sub _readpod { my $string = Module::Install::_read($_[0]); $string =~ s/(?:\015{1,2}\012|\015|\012)/\n/sg; return $string if $_[0] =~ /\.pod\z/; $string =~ s/(^|\n=cut\b.+?\n+)[^=\s].+?\n(\n=\w+|\z)/$1$2/sg; $string =~ s/\n*=pod\b[^\n]*\n+/\n\n/sg; $string =~ s/\n*=cut\b[^\n]*\n+/\n\n/sg; $string =~ s/^\n+//s; return $string; } # Done in evals to avoid confusing Perl::MinimumVersion eval( $] >= 5.006 ? <<'END_NEW' : <<'END_OLD' ); die $@ if $@; sub _write { local *FH; open( FH, '>', $_[0] ) or die "open($_[0]): $!"; binmode FH; foreach ( 1 .. $#_ ) { print FH $_[$_] or die "print($_[0]): $!"; } close FH or die "close($_[0]): $!"; } END_NEW sub _write { local *FH; open( FH, "> $_[0]" ) or die "open($_[0]): $!"; binmode FH; foreach ( 1 .. $#_ ) { print FH $_[$_] or die "print($_[0]): $!"; } close FH or die "close($_[0]): $!"; } END_OLD # _version is for processing module versions (eg, 1.03_05) not # Perl versions (eg, 5.8.1). sub _version { my $s = shift || 0; my $d =()= $s =~ /(\.)/g; if ( $d >= 2 ) { # Normalise multipart versions $s =~ s/(\.)(\d{1,3})/sprintf("$1%03d",$2)/eg; } $s =~ s/^(\d+)\.?//; my $l = $1 || 0; my @v = map { $_ . '0' x (3 - length $_) } $s =~ /(\d{1,3})\D?/g; $l = $l . '.' . join '', @v if @v; return $l + 0; } sub _cmp { _version($_[1]) <=> _version($_[2]); } # Cloned from Params::Util::_CLASS sub _CLASS { ( defined $_[0] and ! ref $_[0] and $_[0] =~ m/^[^\W\d]\w*(?:::\w+)*\z/s ) ? $_[0] : undef; } 1; # Copyright 2008 - 2012 Adam Kennedy. Module-Signature-0.81/inc/Module/Install/Base.pm000644 000765 000024 00000002147 12763211344 022271 0ustar00audreytstaff000000 000000 #line 1 package Module::Install::Base; use strict 'vars'; use vars qw{$VERSION}; BEGIN { $VERSION = '1.16'; } # Suspend handler for "redefined" warnings BEGIN { my $w = $SIG{__WARN__}; $SIG{__WARN__} = sub { $w }; } #line 42 sub new { my $class = shift; unless ( defined &{"${class}::call"} ) { *{"${class}::call"} = sub { shift->_top->call(@_) }; } unless ( defined &{"${class}::load"} ) { *{"${class}::load"} = sub { shift->_top->load(@_) }; } bless { @_ }, $class; } #line 61 sub AUTOLOAD { local $@; my $func = eval { shift->_top->autoload } or return; goto &$func; } #line 75 sub _top { $_[0]->{_top}; } #line 90 sub admin { $_[0]->_top->{admin} or Module::Install::Base::FakeAdmin->new; } #line 106 sub is_admin { ! $_[0]->admin->isa('Module::Install::Base::FakeAdmin'); } sub DESTROY {} package Module::Install::Base::FakeAdmin; use vars qw{$VERSION}; BEGIN { $VERSION = $Module::Install::Base::VERSION; } my $fake; sub new { $fake ||= bless(\@_, $_[0]); } sub AUTOLOAD {} sub DESTROY {} # Restore warning handler BEGIN { $SIG{__WARN__} = $SIG{__WARN__}->(); } 1; #line 159 Module-Signature-0.81/inc/Module/Install/Can.pm000644 000765 000024 00000006157 12763211344 022125 0ustar00audreytstaff000000 000000 #line 1 package Module::Install::Can; use strict; use Config (); use ExtUtils::MakeMaker (); use Module::Install::Base (); use vars qw{$VERSION @ISA $ISCORE}; BEGIN { $VERSION = '1.16'; @ISA = 'Module::Install::Base'; $ISCORE = 1; } # check if we can load some module ### Upgrade this to not have to load the module if possible sub can_use { my ($self, $mod, $ver) = @_; $mod =~ s{::|\\}{/}g; $mod .= '.pm' unless $mod =~ /\.pm$/i; my $pkg = $mod; $pkg =~ s{/}{::}g; $pkg =~ s{\.pm$}{}i; local $@; eval { require $mod; $pkg->VERSION($ver || 0); 1 }; } # Check if we can run some command sub can_run { my ($self, $cmd) = @_; my $_cmd = $cmd; return $_cmd if (-x $_cmd or $_cmd = MM->maybe_command($_cmd)); for my $dir ((split /$Config::Config{path_sep}/, $ENV{PATH}), '.') { next if $dir eq ''; require File::Spec; my $abs = File::Spec->catfile($dir, $cmd); return $abs if (-x $abs or $abs = MM->maybe_command($abs)); } return; } # Can our C compiler environment build XS files sub can_xs { my $self = shift; # Ensure we have the CBuilder module $self->configure_requires( 'ExtUtils::CBuilder' => 0.27 ); # Do we have the configure_requires checker? local $@; eval "require ExtUtils::CBuilder;"; if ( $@ ) { # They don't obey configure_requires, so it is # someone old and delicate. Try to avoid hurting # them by falling back to an older simpler test. return $self->can_cc(); } # Do we have a working C compiler my $builder = ExtUtils::CBuilder->new( quiet => 1, ); unless ( $builder->have_compiler ) { # No working C compiler return 0; } # Write a C file representative of what XS becomes require File::Temp; my ( $FH, $tmpfile ) = File::Temp::tempfile( "compilexs-XXXXX", SUFFIX => '.c', ); binmode $FH; print $FH <<'END_C'; #include "EXTERN.h" #include "perl.h" #include "XSUB.h" int main(int argc, char **argv) { return 0; } int boot_sanexs() { return 1; } END_C close $FH; # Can the C compiler access the same headers XS does my @libs = (); my $object = undef; eval { local $^W = 0; $object = $builder->compile( source => $tmpfile, ); @libs = $builder->link( objects => $object, module_name => 'sanexs', ); }; my $result = $@ ? 0 : 1; # Clean up all the build files foreach ( $tmpfile, $object, @libs ) { next unless defined $_; 1 while unlink; } return $result; } # Can we locate a (the) C compiler sub can_cc { my $self = shift; my @chunks = split(/ /, $Config::Config{cc}) or return; # $Config{cc} may contain args; try to find out the program part while (@chunks) { return $self->can_run("@chunks") || (pop(@chunks), next); } return; } # Fix Cygwin bug on maybe_command(); if ( $^O eq 'cygwin' ) { require ExtUtils::MM_Cygwin; require ExtUtils::MM_Win32; if ( ! defined(&ExtUtils::MM_Cygwin::maybe_command) ) { *ExtUtils::MM_Cygwin::maybe_command = sub { my ($self, $file) = @_; if ($file =~ m{^/cygdrive/}i and ExtUtils::MM_Win32->can('maybe_command')) { ExtUtils::MM_Win32->maybe_command($file); } else { ExtUtils::MM_Unix->maybe_command($file); } } } } 1; __END__ #line 236 Module-Signature-0.81/inc/Module/Install/External.pm000644 000765 000024 00000003545 12763211344 023204 0ustar00audreytstaff000000 000000 #line 1 package Module::Install::External; # Provides dependency declarations for external non-Perl things use strict; use Module::Install::Base (); use vars qw{$VERSION $ISCORE @ISA}; BEGIN { $VERSION = '1.16'; $ISCORE = 1; @ISA = qw{Module::Install::Base}; } sub requires_xs { my $self = shift; # First check for the basic C compiler $self->requires_external_cc; # We need a C compiler that can build XS files unless ( $self->can_xs ) { print "Unresolvable missing external dependency.\n"; print "This package requires perl's header files.\n"; print STDERR "NA: Unable to build distribution on this platform.\n"; exit(0); } 1; } sub requires_external_cc { my $self = shift; # We need a C compiler, use the can_cc method for this unless ( $self->can_cc ) { print "Unresolvable missing external dependency.\n"; print "This package requires a C compiler.\n"; print STDERR "NA: Unable to build distribution on this platform.\n"; exit(0); } # Unlike some of the other modules, while we need to specify a # C compiler as a dep, it needs to be a build-time dependency. 1; } sub requires_external_bin { my ($self, $bin, $version) = @_; if ( $version ) { die "requires_external_bin does not support versions yet"; } # Load the package containing can_run early, # to avoid breaking the message below. $self->load('can_run'); # Locate the bin print "Locating bin:$bin..."; my $found_bin = $self->can_run( $bin ); if ( $found_bin ) { print " found at $found_bin.\n"; } else { print " missing.\n"; print "Unresolvable missing external dependency.\n"; print "Please install '$bin' seperately and try again.\n"; print STDERR "NA: Unable to build distribution on this platform.\n"; exit(0); } # Once we have some way to specify external deps, do it here. # In the mean time, continue as normal. 1; } 1; __END__ #line 171 Module-Signature-0.81/inc/Module/Install/Fetch.pm000644 000765 000024 00000004627 12763211344 022455 0ustar00audreytstaff000000 000000 #line 1 package Module::Install::Fetch; use strict; use Module::Install::Base (); use vars qw{$VERSION @ISA $ISCORE}; BEGIN { $VERSION = '1.16'; @ISA = 'Module::Install::Base'; $ISCORE = 1; } sub get_file { my ($self, %args) = @_; my ($scheme, $host, $path, $file) = $args{url} =~ m|^(\w+)://([^/]+)(.+)/(.+)| or return; if ( $scheme eq 'http' and ! eval { require LWP::Simple; 1 } ) { $args{url} = $args{ftp_url} or (warn("LWP support unavailable!\n"), return); ($scheme, $host, $path, $file) = $args{url} =~ m|^(\w+)://([^/]+)(.+)/(.+)| or return; } $|++; print "Fetching '$file' from $host... "; unless (eval { require Socket; Socket::inet_aton($host) }) { warn "'$host' resolve failed!\n"; return; } return unless $scheme eq 'ftp' or $scheme eq 'http'; require Cwd; my $dir = Cwd::getcwd(); chdir $args{local_dir} or return if exists $args{local_dir}; if (eval { require LWP::Simple; 1 }) { LWP::Simple::mirror($args{url}, $file); } elsif (eval { require Net::FTP; 1 }) { eval { # use Net::FTP to get past firewall my $ftp = Net::FTP->new($host, Passive => 1, Timeout => 600); $ftp->login("anonymous", 'anonymous@example.com'); $ftp->cwd($path); $ftp->binary; $ftp->get($file) or (warn("$!\n"), return); $ftp->quit; } } elsif (my $ftp = $self->can_run('ftp')) { eval { # no Net::FTP, fallback to ftp.exe require FileHandle; my $fh = FileHandle->new; local $SIG{CHLD} = 'IGNORE'; unless ($fh->open("|$ftp -n")) { warn "Couldn't open ftp: $!\n"; chdir $dir; return; } my @dialog = split(/\n/, <<"END_FTP"); open $host user anonymous anonymous\@example.com cd $path binary get $file $file quit END_FTP foreach (@dialog) { $fh->print("$_\n") } $fh->close; } } else { warn "No working 'ftp' program available!\n"; chdir $dir; return; } unless (-f $file) { warn "Fetching failed: $@\n"; chdir $dir; return; } return if exists $args{size} and -s $file != $args{size}; system($args{run}) if exists $args{run}; unlink($file) if $args{remove}; print(((!exists $args{check_for} or -e $args{check_for}) ? "done!" : "failed! ($!)"), "\n"); chdir $dir; return !$?; } 1; Module-Signature-0.81/inc/Module/Install/Makefile.pm000644 000765 000024 00000027437 12763211344 023145 0ustar00audreytstaff000000 000000 #line 1 package Module::Install::Makefile; use strict 'vars'; use ExtUtils::MakeMaker (); use Module::Install::Base (); use Fcntl qw/:flock :seek/; use vars qw{$VERSION @ISA $ISCORE}; BEGIN { $VERSION = '1.16'; @ISA = 'Module::Install::Base'; $ISCORE = 1; } sub Makefile { $_[0] } my %seen = (); sub prompt { shift; # Infinite loop protection my @c = caller(); if ( ++$seen{"$c[1]|$c[2]|$_[0]"} > 3 ) { die "Caught an potential prompt infinite loop ($c[1]|$c[2]|$_[0])"; } # In automated testing or non-interactive session, always use defaults if ( ($ENV{AUTOMATED_TESTING} or -! -t STDIN) and ! $ENV{PERL_MM_USE_DEFAULT} ) { local $ENV{PERL_MM_USE_DEFAULT} = 1; goto &ExtUtils::MakeMaker::prompt; } else { goto &ExtUtils::MakeMaker::prompt; } } # Store a cleaned up version of the MakeMaker version, # since we need to behave differently in a variety of # ways based on the MM version. my $makemaker = eval $ExtUtils::MakeMaker::VERSION; # If we are passed a param, do a "newer than" comparison. # Otherwise, just return the MakeMaker version. sub makemaker { ( @_ < 2 or $makemaker >= eval($_[1]) ) ? $makemaker : 0 } # Ripped from ExtUtils::MakeMaker 6.56, and slightly modified # as we only need to know here whether the attribute is an array # or a hash or something else (which may or may not be appendable). my %makemaker_argtype = ( C => 'ARRAY', CONFIG => 'ARRAY', # CONFIGURE => 'CODE', # ignore DIR => 'ARRAY', DL_FUNCS => 'HASH', DL_VARS => 'ARRAY', EXCLUDE_EXT => 'ARRAY', EXE_FILES => 'ARRAY', FUNCLIST => 'ARRAY', H => 'ARRAY', IMPORTS => 'HASH', INCLUDE_EXT => 'ARRAY', LIBS => 'ARRAY', # ignore '' MAN1PODS => 'HASH', MAN3PODS => 'HASH', META_ADD => 'HASH', META_MERGE => 'HASH', PL_FILES => 'HASH', PM => 'HASH', PMLIBDIRS => 'ARRAY', PMLIBPARENTDIRS => 'ARRAY', PREREQ_PM => 'HASH', CONFIGURE_REQUIRES => 'HASH', SKIP => 'ARRAY', TYPEMAPS => 'ARRAY', XS => 'HASH', # VERSION => ['version',''], # ignore # _KEEP_AFTER_FLUSH => '', clean => 'HASH', depend => 'HASH', dist => 'HASH', dynamic_lib=> 'HASH', linkext => 'HASH', macro => 'HASH', postamble => 'HASH', realclean => 'HASH', test => 'HASH', tool_autosplit => 'HASH', # special cases where you can use makemaker_append CCFLAGS => 'APPENDABLE', DEFINE => 'APPENDABLE', INC => 'APPENDABLE', LDDLFLAGS => 'APPENDABLE', LDFROM => 'APPENDABLE', ); sub makemaker_args { my ($self, %new_args) = @_; my $args = ( $self->{makemaker_args} ||= {} ); foreach my $key (keys %new_args) { if ($makemaker_argtype{$key}) { if ($makemaker_argtype{$key} eq 'ARRAY') { $args->{$key} = [] unless defined $args->{$key}; unless (ref $args->{$key} eq 'ARRAY') { $args->{$key} = [$args->{$key}] } push @{$args->{$key}}, ref $new_args{$key} eq 'ARRAY' ? @{$new_args{$key}} : $new_args{$key}; } elsif ($makemaker_argtype{$key} eq 'HASH') { $args->{$key} = {} unless defined $args->{$key}; foreach my $skey (keys %{ $new_args{$key} }) { $args->{$key}{$skey} = $new_args{$key}{$skey}; } } elsif ($makemaker_argtype{$key} eq 'APPENDABLE') { $self->makemaker_append($key => $new_args{$key}); } } else { if (defined $args->{$key}) { warn qq{MakeMaker attribute "$key" is overriden; use "makemaker_append" to append values\n}; } $args->{$key} = $new_args{$key}; } } return $args; } # For mm args that take multiple space-separated args, # append an argument to the current list. sub makemaker_append { my $self = shift; my $name = shift; my $args = $self->makemaker_args; $args->{$name} = defined $args->{$name} ? join( ' ', $args->{$name}, @_ ) : join( ' ', @_ ); } sub build_subdirs { my $self = shift; my $subdirs = $self->makemaker_args->{DIR} ||= []; for my $subdir (@_) { push @$subdirs, $subdir; } } sub clean_files { my $self = shift; my $clean = $self->makemaker_args->{clean} ||= {}; %$clean = ( %$clean, FILES => join ' ', grep { length $_ } ($clean->{FILES} || (), @_), ); } sub realclean_files { my $self = shift; my $realclean = $self->makemaker_args->{realclean} ||= {}; %$realclean = ( %$realclean, FILES => join ' ', grep { length $_ } ($realclean->{FILES} || (), @_), ); } sub libs { my $self = shift; my $libs = ref $_[0] ? shift : [ shift ]; $self->makemaker_args( LIBS => $libs ); } sub inc { my $self = shift; $self->makemaker_args( INC => shift ); } sub _wanted_t { } sub tests_recursive { my $self = shift; my $dir = shift || 't'; unless ( -d $dir ) { die "tests_recursive dir '$dir' does not exist"; } my %tests = map { $_ => 1 } split / /, ($self->tests || ''); require File::Find; File::Find::find( sub { /\.t$/ and -f $_ and $tests{"$File::Find::dir/*.t"} = 1 }, $dir ); $self->tests( join ' ', sort keys %tests ); } sub write { my $self = shift; die "&Makefile->write() takes no arguments\n" if @_; # Check the current Perl version my $perl_version = $self->perl_version; if ( $perl_version ) { eval "use $perl_version; 1" or die "ERROR: perl: Version $] is installed, " . "but we need version >= $perl_version"; } # Make sure we have a new enough MakeMaker require ExtUtils::MakeMaker; if ( $perl_version and $self->_cmp($perl_version, '5.006') >= 0 ) { # This previous attempted to inherit the version of # ExtUtils::MakeMaker in use by the module author, but this # was found to be untenable as some authors build releases # using future dev versions of EU:MM that nobody else has. # Instead, #toolchain suggests we use 6.59 which is the most # stable version on CPAN at time of writing and is, to quote # ribasushi, "not terminally fucked, > and tested enough". # TODO: We will now need to maintain this over time to push # the version up as new versions are released. $self->build_requires( 'ExtUtils::MakeMaker' => 6.59 ); $self->configure_requires( 'ExtUtils::MakeMaker' => 6.59 ); } else { # Allow legacy-compatibility with 5.005 by depending on the # most recent EU:MM that supported 5.005. $self->build_requires( 'ExtUtils::MakeMaker' => 6.36 ); $self->configure_requires( 'ExtUtils::MakeMaker' => 6.36 ); } # Generate the MakeMaker params my $args = $self->makemaker_args; $args->{DISTNAME} = $self->name; $args->{NAME} = $self->module_name || $self->name; $args->{NAME} =~ s/-/::/g; $args->{VERSION} = $self->version or die <<'EOT'; ERROR: Can't determine distribution version. Please specify it explicitly via 'version' in Makefile.PL, or set a valid $VERSION in a module, and provide its file path via 'version_from' (or 'all_from' if you prefer) in Makefile.PL. EOT if ( $self->tests ) { my @tests = split ' ', $self->tests; my %seen; $args->{test} = { TESTS => (join ' ', grep {!$seen{$_}++} @tests), }; } elsif ( $Module::Install::ExtraTests::use_extratests ) { # Module::Install::ExtraTests doesn't set $self->tests and does its own tests via harness. # So, just ignore our xt tests here. } elsif ( -d 'xt' and ($Module::Install::AUTHOR or $ENV{RELEASE_TESTING}) ) { $args->{test} = { TESTS => join( ' ', map { "$_/*.t" } grep { -d $_ } qw{ t xt } ), }; } if ( $] >= 5.005 ) { $args->{ABSTRACT} = $self->abstract; $args->{AUTHOR} = join ', ', @{$self->author || []}; } if ( $self->makemaker(6.10) ) { $args->{NO_META} = 1; #$args->{NO_MYMETA} = 1; } if ( $self->makemaker(6.17) and $self->sign ) { $args->{SIGN} = 1; } unless ( $self->is_admin ) { delete $args->{SIGN}; } if ( $self->makemaker(6.31) and $self->license ) { $args->{LICENSE} = $self->license; } my $prereq = ($args->{PREREQ_PM} ||= {}); %$prereq = ( %$prereq, map { @$_ } # flatten [module => version] map { @$_ } grep $_, ($self->requires) ); # Remove any reference to perl, PREREQ_PM doesn't support it delete $args->{PREREQ_PM}->{perl}; # Merge both kinds of requires into BUILD_REQUIRES my $build_prereq = ($args->{BUILD_REQUIRES} ||= {}); %$build_prereq = ( %$build_prereq, map { @$_ } # flatten [module => version] map { @$_ } grep $_, ($self->configure_requires, $self->build_requires) ); # Remove any reference to perl, BUILD_REQUIRES doesn't support it delete $args->{BUILD_REQUIRES}->{perl}; # Delete bundled dists from prereq_pm, add it to Makefile DIR my $subdirs = ($args->{DIR} || []); if ($self->bundles) { my %processed; foreach my $bundle (@{ $self->bundles }) { my ($mod_name, $dist_dir) = @$bundle; delete $prereq->{$mod_name}; $dist_dir = File::Basename::basename($dist_dir); # dir for building this module if (not exists $processed{$dist_dir}) { if (-d $dist_dir) { # List as sub-directory to be processed by make push @$subdirs, $dist_dir; } # Else do nothing: the module is already present on the system $processed{$dist_dir} = undef; } } } unless ( $self->makemaker('6.55_03') ) { %$prereq = (%$prereq,%$build_prereq); delete $args->{BUILD_REQUIRES}; } if ( my $perl_version = $self->perl_version ) { eval "use $perl_version; 1" or die "ERROR: perl: Version $] is installed, " . "but we need version >= $perl_version"; if ( $self->makemaker(6.48) ) { $args->{MIN_PERL_VERSION} = $perl_version; } } if ($self->installdirs) { warn qq{old INSTALLDIRS (probably set by makemaker_args) is overriden by installdirs\n} if $args->{INSTALLDIRS}; $args->{INSTALLDIRS} = $self->installdirs; } my %args = map { ( $_ => $args->{$_} ) } grep {defined($args->{$_} ) } keys %$args; my $user_preop = delete $args{dist}->{PREOP}; if ( my $preop = $self->admin->preop($user_preop) ) { foreach my $key ( keys %$preop ) { $args{dist}->{$key} = $preop->{$key}; } } my $mm = ExtUtils::MakeMaker::WriteMakefile(%args); $self->fix_up_makefile($mm->{FIRST_MAKEFILE} || 'Makefile'); } sub fix_up_makefile { my $self = shift; my $makefile_name = shift; my $top_class = ref($self->_top) || ''; my $top_version = $self->_top->VERSION || ''; my $preamble = $self->preamble ? "# Preamble by $top_class $top_version\n" . $self->preamble : ''; my $postamble = "# Postamble by $top_class $top_version\n" . ($self->postamble || ''); local *MAKEFILE; open MAKEFILE, "+< $makefile_name" or die "fix_up_makefile: Couldn't open $makefile_name: $!"; eval { flock MAKEFILE, LOCK_EX }; my $makefile = do { local $/; }; $makefile =~ s/\b(test_harness\(\$\(TEST_VERBOSE\), )/$1'inc', /; $makefile =~ s/( -I\$\(INST_ARCHLIB\))/ -Iinc$1/g; $makefile =~ s/( "-I\$\(INST_LIB\)")/ "-Iinc"$1/g; $makefile =~ s/^(FULLPERL = .*)/$1 "-Iinc"/m; $makefile =~ s/^(PERL = .*)/$1 "-Iinc"/m; # Module::Install will never be used to build the Core Perl # Sometimes PERL_LIB and PERL_ARCHLIB get written anyway, which breaks # PREFIX/PERL5LIB, and thus, install_share. Blank them if they exist $makefile =~ s/^PERL_LIB = .+/PERL_LIB =/m; #$makefile =~ s/^PERL_ARCHLIB = .+/PERL_ARCHLIB =/m; # Perl 5.005 mentions PERL_LIB explicitly, so we have to remove that as well. $makefile =~ s/(\"?)-I\$\(PERL_LIB\)\1//g; # XXX - This is currently unused; not sure if it breaks other MM-users # $makefile =~ s/^pm_to_blib\s+:\s+/pm_to_blib :: /mg; seek MAKEFILE, 0, SEEK_SET; truncate MAKEFILE, 0; print MAKEFILE "$preamble$makefile$postamble" or die $!; close MAKEFILE or die $!; 1; } sub preamble { my ($self, $text) = @_; $self->{preamble} = $text . $self->{preamble} if defined $text; $self->{preamble}; } sub postamble { my ($self, $text) = @_; $self->{postamble} ||= $self->admin->postamble; $self->{postamble} .= $text if defined $text; $self->{postamble} } 1; __END__ #line 544 Module-Signature-0.81/inc/Module/Install/Metadata.pm000644 000765 000024 00000043302 12763211344 023135 0ustar00audreytstaff000000 000000 #line 1 package Module::Install::Metadata; use strict 'vars'; use Module::Install::Base (); use vars qw{$VERSION @ISA $ISCORE}; BEGIN { $VERSION = '1.16'; @ISA = 'Module::Install::Base'; $ISCORE = 1; } my @boolean_keys = qw{ sign }; my @scalar_keys = qw{ name module_name abstract version distribution_type tests installdirs }; my @tuple_keys = qw{ configure_requires build_requires requires recommends bundles resources }; my @resource_keys = qw{ homepage bugtracker repository }; my @array_keys = qw{ keywords author }; *authors = \&author; sub Meta { shift } sub Meta_BooleanKeys { @boolean_keys } sub Meta_ScalarKeys { @scalar_keys } sub Meta_TupleKeys { @tuple_keys } sub Meta_ResourceKeys { @resource_keys } sub Meta_ArrayKeys { @array_keys } foreach my $key ( @boolean_keys ) { *$key = sub { my $self = shift; if ( defined wantarray and not @_ ) { return $self->{values}->{$key}; } $self->{values}->{$key} = ( @_ ? $_[0] : 1 ); return $self; }; } foreach my $key ( @scalar_keys ) { *$key = sub { my $self = shift; return $self->{values}->{$key} if defined wantarray and !@_; $self->{values}->{$key} = shift; return $self; }; } foreach my $key ( @array_keys ) { *$key = sub { my $self = shift; return $self->{values}->{$key} if defined wantarray and !@_; $self->{values}->{$key} ||= []; push @{$self->{values}->{$key}}, @_; return $self; }; } foreach my $key ( @resource_keys ) { *$key = sub { my $self = shift; unless ( @_ ) { return () unless $self->{values}->{resources}; return map { $_->[1] } grep { $_->[0] eq $key } @{ $self->{values}->{resources} }; } return $self->{values}->{resources}->{$key} unless @_; my $uri = shift or die( "Did not provide a value to $key()" ); $self->resources( $key => $uri ); return 1; }; } foreach my $key ( grep { $_ ne "resources" } @tuple_keys) { *$key = sub { my $self = shift; return $self->{values}->{$key} unless @_; my @added; while ( @_ ) { my $module = shift or last; my $version = shift || 0; push @added, [ $module, $version ]; } push @{ $self->{values}->{$key} }, @added; return map {@$_} @added; }; } # Resource handling my %lc_resource = map { $_ => 1 } qw{ homepage license bugtracker repository }; sub resources { my $self = shift; while ( @_ ) { my $name = shift or last; my $value = shift or next; if ( $name eq lc $name and ! $lc_resource{$name} ) { die("Unsupported reserved lowercase resource '$name'"); } $self->{values}->{resources} ||= []; push @{ $self->{values}->{resources} }, [ $name, $value ]; } $self->{values}->{resources}; } # Aliases for build_requires that will have alternative # meanings in some future version of META.yml. sub test_requires { shift->build_requires(@_) } sub install_requires { shift->build_requires(@_) } # Aliases for installdirs options sub install_as_core { $_[0]->installdirs('perl') } sub install_as_cpan { $_[0]->installdirs('site') } sub install_as_site { $_[0]->installdirs('site') } sub install_as_vendor { $_[0]->installdirs('vendor') } sub dynamic_config { my $self = shift; my $value = @_ ? shift : 1; if ( $self->{values}->{dynamic_config} ) { # Once dynamic we never change to static, for safety return 0; } $self->{values}->{dynamic_config} = $value ? 1 : 0; return 1; } # Convenience command sub static_config { shift->dynamic_config(0); } sub perl_version { my $self = shift; return $self->{values}->{perl_version} unless @_; my $version = shift or die( "Did not provide a value to perl_version()" ); # Normalize the version $version = $self->_perl_version($version); # We don't support the really old versions unless ( $version >= 5.005 ) { die "Module::Install only supports 5.005 or newer (use ExtUtils::MakeMaker)\n"; } $self->{values}->{perl_version} = $version; } sub all_from { my ( $self, $file ) = @_; unless ( defined($file) ) { my $name = $self->name or die( "all_from called with no args without setting name() first" ); $file = join('/', 'lib', split(/-/, $name)) . '.pm'; $file =~ s{.*/}{} unless -e $file; unless ( -e $file ) { die("all_from cannot find $file from $name"); } } unless ( -f $file ) { die("The path '$file' does not exist, or is not a file"); } $self->{values}{all_from} = $file; # Some methods pull from POD instead of code. # If there is a matching .pod, use that instead my $pod = $file; $pod =~ s/\.pm$/.pod/i; $pod = $file unless -e $pod; # Pull the different values $self->name_from($file) unless $self->name; $self->version_from($file) unless $self->version; $self->perl_version_from($file) unless $self->perl_version; $self->author_from($pod) unless @{$self->author || []}; $self->license_from($pod) unless $self->license; $self->abstract_from($pod) unless $self->abstract; return 1; } sub provides { my $self = shift; my $provides = ( $self->{values}->{provides} ||= {} ); %$provides = (%$provides, @_) if @_; return $provides; } sub auto_provides { my $self = shift; return $self unless $self->is_admin; unless (-e 'MANIFEST') { warn "Cannot deduce auto_provides without a MANIFEST, skipping\n"; return $self; } # Avoid spurious warnings as we are not checking manifest here. local $SIG{__WARN__} = sub {1}; require ExtUtils::Manifest; local *ExtUtils::Manifest::manicheck = sub { return }; require Module::Build; my $build = Module::Build->new( dist_name => $self->name, dist_version => $self->version, license => $self->license, ); $self->provides( %{ $build->find_dist_packages || {} } ); } sub feature { my $self = shift; my $name = shift; my $features = ( $self->{values}->{features} ||= [] ); my $mods; if ( @_ == 1 and ref( $_[0] ) ) { # The user used ->feature like ->features by passing in the second # argument as a reference. Accomodate for that. $mods = $_[0]; } else { $mods = \@_; } my $count = 0; push @$features, ( $name => [ map { ref($_) ? ( ref($_) eq 'HASH' ) ? %$_ : @$_ : $_ } @$mods ] ); return @$features; } sub features { my $self = shift; while ( my ( $name, $mods ) = splice( @_, 0, 2 ) ) { $self->feature( $name, @$mods ); } return $self->{values}->{features} ? @{ $self->{values}->{features} } : (); } sub no_index { my $self = shift; my $type = shift; push @{ $self->{values}->{no_index}->{$type} }, @_ if $type; return $self->{values}->{no_index}; } sub read { my $self = shift; $self->include_deps( 'YAML::Tiny', 0 ); require YAML::Tiny; my $data = YAML::Tiny::LoadFile('META.yml'); # Call methods explicitly in case user has already set some values. while ( my ( $key, $value ) = each %$data ) { next unless $self->can($key); if ( ref $value eq 'HASH' ) { while ( my ( $module, $version ) = each %$value ) { $self->can($key)->($self, $module => $version ); } } else { $self->can($key)->($self, $value); } } return $self; } sub write { my $self = shift; return $self unless $self->is_admin; $self->admin->write_meta; return $self; } sub version_from { require ExtUtils::MM_Unix; my ( $self, $file ) = @_; $self->version( ExtUtils::MM_Unix->parse_version($file) ); # for version integrity check $self->makemaker_args( VERSION_FROM => $file ); } sub abstract_from { require ExtUtils::MM_Unix; my ( $self, $file ) = @_; $self->abstract( bless( { DISTNAME => $self->name }, 'ExtUtils::MM_Unix' )->parse_abstract($file) ); } # Add both distribution and module name sub name_from { my ($self, $file) = @_; if ( Module::Install::_read($file) =~ m/ ^ \s* package \s* ([\w:]+) [\s|;]* /ixms ) { my ($name, $module_name) = ($1, $1); $name =~ s{::}{-}g; $self->name($name); unless ( $self->module_name ) { $self->module_name($module_name); } } else { die("Cannot determine name from $file\n"); } } sub _extract_perl_version { if ( $_[0] =~ m/ ^\s* (?:use|require) \s* v? ([\d_\.]+) \s* ; /ixms ) { my $perl_version = $1; $perl_version =~ s{_}{}g; return $perl_version; } else { return; } } sub perl_version_from { my $self = shift; my $perl_version=_extract_perl_version(Module::Install::_read($_[0])); if ($perl_version) { $self->perl_version($perl_version); } else { warn "Cannot determine perl version info from $_[0]\n"; return; } } sub author_from { my $self = shift; my $content = Module::Install::_read($_[0]); if ($content =~ m/ =head \d \s+ (?:authors?)\b \s* ([^\n]*) | =head \d \s+ (?:licen[cs]e|licensing|copyright|legal)\b \s* .*? copyright .*? \d\d\d[\d.]+ \s* (?:\bby\b)? \s* ([^\n]*) /ixms) { my $author = $1 || $2; # XXX: ugly but should work anyway... if (eval "require Pod::Escapes; 1") { # Pod::Escapes has a mapping table. # It's in core of perl >= 5.9.3, and should be installed # as one of the Pod::Simple's prereqs, which is a prereq # of Pod::Text 3.x (see also below). $author =~ s{ E<( (\d+) | ([A-Za-z]+) )> } { defined $2 ? chr($2) : defined $Pod::Escapes::Name2character_number{$1} ? chr($Pod::Escapes::Name2character_number{$1}) : do { warn "Unknown escape: E<$1>"; "E<$1>"; }; }gex; } elsif (eval "require Pod::Text; 1" && $Pod::Text::VERSION < 3) { # Pod::Text < 3.0 has yet another mapping table, # though the table name of 2.x and 1.x are different. # (1.x is in core of Perl < 5.6, 2.x is in core of # Perl < 5.9.3) my $mapping = ($Pod::Text::VERSION < 2) ? \%Pod::Text::HTML_Escapes : \%Pod::Text::ESCAPES; $author =~ s{ E<( (\d+) | ([A-Za-z]+) )> } { defined $2 ? chr($2) : defined $mapping->{$1} ? $mapping->{$1} : do { warn "Unknown escape: E<$1>"; "E<$1>"; }; }gex; } else { $author =~ s{E}{<}g; $author =~ s{E}{>}g; } $self->author($author); } else { warn "Cannot determine author info from $_[0]\n"; } } #Stolen from M::B my %license_urls = ( perl => 'http://dev.perl.org/licenses/', apache => 'http://apache.org/licenses/LICENSE-2.0', apache_1_1 => 'http://apache.org/licenses/LICENSE-1.1', artistic => 'http://opensource.org/licenses/artistic-license.php', artistic_2 => 'http://opensource.org/licenses/artistic-license-2.0.php', lgpl => 'http://opensource.org/licenses/lgpl-license.php', lgpl2 => 'http://opensource.org/licenses/lgpl-2.1.php', lgpl3 => 'http://opensource.org/licenses/lgpl-3.0.html', bsd => 'http://opensource.org/licenses/bsd-license.php', gpl => 'http://opensource.org/licenses/gpl-license.php', gpl2 => 'http://opensource.org/licenses/gpl-2.0.php', gpl3 => 'http://opensource.org/licenses/gpl-3.0.html', mit => 'http://opensource.org/licenses/mit-license.php', mozilla => 'http://opensource.org/licenses/mozilla1.1.php', open_source => undef, unrestricted => undef, restrictive => undef, unknown => undef, ); sub license { my $self = shift; return $self->{values}->{license} unless @_; my $license = shift or die( 'Did not provide a value to license()' ); $license = __extract_license($license) || lc $license; $self->{values}->{license} = $license; # Automatically fill in license URLs if ( $license_urls{$license} ) { $self->resources( license => $license_urls{$license} ); } return 1; } sub _extract_license { my $pod = shift; my $matched; return __extract_license( ($matched) = $pod =~ m/ (=head \d \s+ L(?i:ICEN[CS]E|ICENSING)\b.*?) (=head \d.*|=cut.*|)\z /xms ) || __extract_license( ($matched) = $pod =~ m/ (=head \d \s+ (?:C(?i:OPYRIGHTS?)|L(?i:EGAL))\b.*?) (=head \d.*|=cut.*|)\z /xms ); } sub __extract_license { my $license_text = shift or return; my @phrases = ( '(?:under )?the same (?:terms|license) as (?:perl|the perl (?:\d )?programming language)' => 'perl', 1, '(?:under )?the terms of (?:perl|the perl programming language) itself' => 'perl', 1, 'Artistic and GPL' => 'perl', 1, 'GNU general public license' => 'gpl', 1, 'GNU public license' => 'gpl', 1, 'GNU lesser general public license' => 'lgpl', 1, 'GNU lesser public license' => 'lgpl', 1, 'GNU library general public license' => 'lgpl', 1, 'GNU library public license' => 'lgpl', 1, 'GNU Free Documentation license' => 'unrestricted', 1, 'GNU Affero General Public License' => 'open_source', 1, '(?:Free)?BSD license' => 'bsd', 1, 'Artistic license 2\.0' => 'artistic_2', 1, 'Artistic license' => 'artistic', 1, 'Apache (?:Software )?license' => 'apache', 1, 'GPL' => 'gpl', 1, 'LGPL' => 'lgpl', 1, 'BSD' => 'bsd', 1, 'Artistic' => 'artistic', 1, 'MIT' => 'mit', 1, 'Mozilla Public License' => 'mozilla', 1, 'Q Public License' => 'open_source', 1, 'OpenSSL License' => 'unrestricted', 1, 'SSLeay License' => 'unrestricted', 1, 'zlib License' => 'open_source', 1, 'proprietary' => 'proprietary', 0, ); while ( my ($pattern, $license, $osi) = splice(@phrases, 0, 3) ) { $pattern =~ s#\s+#\\s+#gs; if ( $license_text =~ /\b$pattern\b/i ) { return $license; } } return ''; } sub license_from { my $self = shift; if (my $license=_extract_license(Module::Install::_read($_[0]))) { $self->license($license); } else { warn "Cannot determine license info from $_[0]\n"; return 'unknown'; } } sub _extract_bugtracker { my @links = $_[0] =~ m#L<( https?\Q://rt.cpan.org/\E[^>]+| https?\Q://github.com/\E[\w_]+/[\w_]+/issues| https?\Q://code.google.com/p/\E[\w_\-]+/issues/list )>#gx; my %links; @links{@links}=(); @links=keys %links; return @links; } sub bugtracker_from { my $self = shift; my $content = Module::Install::_read($_[0]); my @links = _extract_bugtracker($content); unless ( @links ) { warn "Cannot determine bugtracker info from $_[0]\n"; return 0; } if ( @links > 1 ) { warn "Found more than one bugtracker link in $_[0]\n"; return 0; } # Set the bugtracker bugtracker( $links[0] ); return 1; } sub requires_from { my $self = shift; my $content = Module::Install::_readperl($_[0]); my @requires = $content =~ m/^use\s+([^\W\d]\w*(?:::\w+)*)\s+(v?[\d\.]+)/mg; while ( @requires ) { my $module = shift @requires; my $version = shift @requires; $self->requires( $module => $version ); } } sub test_requires_from { my $self = shift; my $content = Module::Install::_readperl($_[0]); my @requires = $content =~ m/^use\s+([^\W\d]\w*(?:::\w+)*)\s+([\d\.]+)/mg; while ( @requires ) { my $module = shift @requires; my $version = shift @requires; $self->test_requires( $module => $version ); } } # Convert triple-part versions (eg, 5.6.1 or 5.8.9) to # numbers (eg, 5.006001 or 5.008009). # Also, convert double-part versions (eg, 5.8) sub _perl_version { my $v = $_[-1]; $v =~ s/^([1-9])\.([1-9]\d?\d?)$/sprintf("%d.%03d",$1,$2)/e; $v =~ s/^([1-9])\.([1-9]\d?\d?)\.(0|[1-9]\d?\d?)$/sprintf("%d.%03d%03d",$1,$2,$3 || 0)/e; $v =~ s/(\.\d\d\d)000$/$1/; $v =~ s/_.+$//; if ( ref($v) ) { # Numify $v = $v + 0; } return $v; } sub add_metadata { my $self = shift; my %hash = @_; for my $key (keys %hash) { warn "add_metadata: $key is not prefixed with 'x_'.\n" . "Use appopriate function to add non-private metadata.\n" unless $key =~ /^x_/; $self->{values}->{$key} = $hash{$key}; } } ###################################################################### # MYMETA Support sub WriteMyMeta { die "WriteMyMeta has been deprecated"; } sub write_mymeta_yaml { my $self = shift; # We need YAML::Tiny to write the MYMETA.yml file unless ( eval { require YAML::Tiny; 1; } ) { return 1; } # Generate the data my $meta = $self->_write_mymeta_data or return 1; # Save as the MYMETA.yml file print "Writing MYMETA.yml\n"; YAML::Tiny::DumpFile('MYMETA.yml', $meta); } sub write_mymeta_json { my $self = shift; # We need JSON to write the MYMETA.json file unless ( eval { require JSON; 1; } ) { return 1; } # Generate the data my $meta = $self->_write_mymeta_data or return 1; # Save as the MYMETA.yml file print "Writing MYMETA.json\n"; Module::Install::_write( 'MYMETA.json', JSON->new->pretty(1)->canonical->encode($meta), ); } sub _write_mymeta_data { my $self = shift; # If there's no existing META.yml there is nothing we can do return undef unless -f 'META.yml'; # We need Parse::CPAN::Meta to load the file unless ( eval { require Parse::CPAN::Meta; 1; } ) { return undef; } # Merge the perl version into the dependencies my $val = $self->Meta->{values}; my $perl = delete $val->{perl_version}; if ( $perl ) { $val->{requires} ||= []; my $requires = $val->{requires}; # Canonize to three-dot version after Perl 5.6 if ( $perl >= 5.006 ) { $perl =~ s{^(\d+)\.(\d\d\d)(\d*)}{join('.', $1, int($2||0), int($3||0))}e } unshift @$requires, [ perl => $perl ]; } # Load the advisory META.yml file my @yaml = Parse::CPAN::Meta::LoadFile('META.yml'); my $meta = $yaml[0]; # Overwrite the non-configure dependency hashes delete $meta->{requires}; delete $meta->{build_requires}; delete $meta->{recommends}; if ( exists $val->{requires} ) { $meta->{requires} = { map { @$_ } @{ $val->{requires} } }; } if ( exists $val->{build_requires} ) { $meta->{build_requires} = { map { @$_ } @{ $val->{build_requires} } }; } return $meta; } 1; Module-Signature-0.81/inc/Module/Install/Scripts.pm000644 000765 000024 00000001011 12763211344 023033 0ustar00audreytstaff000000 000000 #line 1 package Module::Install::Scripts; use strict 'vars'; use Module::Install::Base (); use vars qw{$VERSION @ISA $ISCORE}; BEGIN { $VERSION = '1.16'; @ISA = 'Module::Install::Base'; $ISCORE = 1; } sub install_script { my $self = shift; my $args = $self->makemaker_args; my $exe = $args->{EXE_FILES} ||= []; foreach ( @_ ) { if ( -f $_ ) { push @$exe, $_; } elsif ( -d 'script' and -f "script/$_" ) { push @$exe, "script/$_"; } else { die("Cannot find script '$_'"); } } } 1; Module-Signature-0.81/inc/Module/Install/Win32.pm000644 000765 000024 00000003403 12763211344 022315 0ustar00audreytstaff000000 000000 #line 1 package Module::Install::Win32; use strict; use Module::Install::Base (); use vars qw{$VERSION @ISA $ISCORE}; BEGIN { $VERSION = '1.16'; @ISA = 'Module::Install::Base'; $ISCORE = 1; } # determine if the user needs nmake, and download it if needed sub check_nmake { my $self = shift; $self->load('can_run'); $self->load('get_file'); require Config; return unless ( $^O eq 'MSWin32' and $Config::Config{make} and $Config::Config{make} =~ /^nmake\b/i and ! $self->can_run('nmake') ); print "The required 'nmake' executable not found, fetching it...\n"; require File::Basename; my $rv = $self->get_file( url => 'http://download.microsoft.com/download/vc15/Patch/1.52/W95/EN-US/Nmake15.exe', ftp_url => 'ftp://ftp.microsoft.com/Softlib/MSLFILES/Nmake15.exe', local_dir => File::Basename::dirname($^X), size => 51928, run => 'Nmake15.exe /o > nul', check_for => 'Nmake.exe', remove => 1, ); die <<'END_MESSAGE' unless $rv; ------------------------------------------------------------------------------- Since you are using Microsoft Windows, you will need the 'nmake' utility before installation. It's available at: http://download.microsoft.com/download/vc15/Patch/1.52/W95/EN-US/Nmake15.exe or ftp://ftp.microsoft.com/Softlib/MSLFILES/Nmake15.exe Please download the file manually, save it to a directory in %PATH% (e.g. C:\WINDOWS\COMMAND\), then launch the MS-DOS command line shell, "cd" to that directory, and run "Nmake15.exe" from there; that will create the 'nmake.exe' file needed by this module. You may then resume the installation process described in README. ------------------------------------------------------------------------------- END_MESSAGE } 1; Module-Signature-0.81/inc/Module/Install/WriteAll.pm000644 000765 000024 00000002376 12763211344 023146 0ustar00audreytstaff000000 000000 #line 1 package Module::Install::WriteAll; use strict; use Module::Install::Base (); use vars qw{$VERSION @ISA $ISCORE}; BEGIN { $VERSION = '1.16'; @ISA = qw{Module::Install::Base}; $ISCORE = 1; } sub WriteAll { my $self = shift; my %args = ( meta => 1, sign => 0, inline => 0, check_nmake => 1, @_, ); $self->sign(1) if $args{sign}; $self->admin->WriteAll(%args) if $self->is_admin; $self->check_nmake if $args{check_nmake}; unless ( $self->makemaker_args->{PL_FILES} ) { # XXX: This still may be a bit over-defensive... unless ($self->makemaker(6.25)) { $self->makemaker_args( PL_FILES => {} ) if -f 'Build.PL'; } } # Until ExtUtils::MakeMaker support MYMETA.yml, make sure # we clean it up properly ourself. $self->realclean_files('MYMETA.yml'); if ( $args{inline} ) { $self->Inline->write; } else { $self->Makefile->write; } # The Makefile write process adds a couple of dependencies, # so write the META.yml files after the Makefile. if ( $args{meta} ) { $self->Meta->write; } # Experimental support for MYMETA if ( $ENV{X_MYMETA} ) { if ( $ENV{X_MYMETA} eq 'JSON' ) { $self->Meta->write_mymeta_json; } else { $self->Meta->write_mymeta_yaml; } } return 1; } 1;