Module-Signature-0.73/000755 000765 000024 00000000000 12153722713 015452 5ustar00audreytstaff000000 000000 Module-Signature-0.73/AUDREY2006.pub000644 000765 000024 00000143305 12044760327 017473 0ustar00audreytstaff000000 000000 -----BEGIN PGP PUBLIC KEY BLOCK----- Version: GnuPG v1.4.2 (FreeBSD) mQGiBDrSde4RBACrX/gOzX8CCum6b5nfvbjeEgjEKAE+piiB/k8U9Y89juUwMUNf rHvYWI/j3Clk8gnNUnrjO5/mUAkDBB39X5VRhX1nHUoH0aVF8CuU3HbPyV26NgU1 5E8llFMqptmRbL0YgoDYke00RHpHWw0eBMDNLjvx7MTo9EVx8TD6SssnGwCgv0CK UN5wTse3hoWzk2Pcu9c1rD8D/iX1/WbOmEp+f9g89OUKdF2seRWF+FxRY/zkdPHv 4EIPnnwmcj1JvVsLkLNkWJAbYw8/8I/VYAZuzRb2dJvR8FUKtUojwBI7vxk1H8VE F+WQYvKFSk5E3FwVAvCCYHiJrvtciHt1oexL4wYzPzjNlPudqj/QOhJu1tsOYwO6 bf3KA/0cluS8SWHMSsVxhj3FXG+m7iiCqQ3pZABQ8utsq3eRtVYmwQOfIeT4Caaj 9sS7mVj2TSQZiQOBeRw77BQ40rUVf9dblGpWGwPp9PIroksBIDZ/TeMMKkkdiryF OGGJILRgVIMSpiNs+SJ8y1ns8eyzPWjlckqgjnUMECL/B05FrbQhQXVkcmV5IFRh bmcgPGF1ZHJleXRAYXVkcmV5dC5vcmc+iGAEExECACAFAkQt2iwCGwMGCwkIBwMC BBUCCAMEFgIDAQIeAQIXgAAKCRC0s903PDUBoC20AJoD6iXTv25SdFCoyhe4WCZp HQD27ACfTZ9uxyolV46oNQ/vhvzXbcZiQGC0HkF1ZHJleSBUYW5nIDxhdWRyZXku dEBhY20ub3JnPohgBBMRAgAgBQJEJYYhAhsDBgsJCAcDAgQVAggDBBYCAwECHgEC F4AACgkQtLPdNzw1AaAvXACgu+90i/F7tIhGrol8vpyq/OPZn3IAniDbisGaysh9 1jFcll/J1yqjl61ItCtBdWRyZXkgVGFuZyAoYXV0cmlqdXMpIDxhdXRyaWp1c0Bn bWFpbC5jb20+iGAEExECACAFAkOX640CGwMGCwkIBwMCBBUCCAMEFgIDAQIeAQIX gAAKCRC0s903PDUBoJ+qAKCxZ0tIrtL18MO6nVBcFY48xABrFgCZAXm2m3nRTsJx DJXbZXqgQ3t5w7SIRgQQEQIABgUCRAXt9QAKCRA3a4K4Y/abDvz2AJ4x1yG16iEh VM51sxlv8bHFVCXgDQCePESZkHEyKgGHJEq/pyvwwDya6yOIRgQQEQIABgUCRBSm /wAKCRBVXk8dsZJvdsw8AJ9K1mIOJL1m9sfFUCGh0Rv7PQY7zwCcCnQZScg1Jzbr 161JXydi+9KrrTW0NUF1dHJpanVzIFRhbmcgKFRhbmcgWm9uZy1IYW4pIDxhdXRy aWp1c0BhdXRyaWp1cy5vcmc+iHAEMBECADAFAkPOJlUpHSBJJ3ZlIGxlZ2FsbHkg Y2hhbmdlZCBteSBuYW1lIHRvIEF1ZHJleS4ACgkQtLPdNzw1AaDMDwCeInDuXlak HWkfYCs2UtbV943IzQ4An0zeTKAEu+vifYJKAZgShmsJS1p6iQIcBBABAgAGBQJB frC7AAoJEKrj5s5moURoJ+wQANUT50fVPkqs7kxOnqCe3baN7hbfN71fUo68dUsX mh/M8yscqqfTKLJ9zKcSR58vvd9zlUa9RMSr4V0z3GOXo1yFFZkrQ0Vjlra1H18F f0FD57gQx16jL/FFwKJdsoqaKPPXFVK/GDqwkqhRT6YeQYRoFpanlM+CYtasXLoA NzS9RRCUmSRoTBuEkCMqA3r2YMynu+g2Z/FalC1h5mWDCP11lx64xLVXW5zrY8h7 Bky6GCf9pQjEUiTXxNM7548GF72/I6gRHrP++R2ea3r260YqS4zxCBBwCYVilkMr 8t+0MouXppORW1ovIyng7chnclPgezWuUhwcgbNFbM5PdNnckdnaVFUw24Utluqm 8OSisqJVBrQZI8dqfEo7GXwxgUbaVhceolahKXRfZdkNfZndxhYAbBXTHibEr+8c t8ky2bzQOs7fF2MoL1oR8Kre0HCPQrTGInHQniA1pgLc3Aj96+6LKAKuP4Rx1fWQ Q+GOGk9mzLzwl7INv3fcAVy+tdIi1PVtWtn5qqq/YutpBmU3Ae99PlUPl1pdpCex hr1dbS8f2l5xsFryaXp9Fvn1z38buOCT186Sq2lkj8p7JIic4SqKhQMegjEdFL5m 4uN2yv/muDM6fL6IXFhzQblTKP5ORZV10GbXGAD2Yy1yGdPrFkappKU6WQXibMHO tZeMiEYEMBECAAYFAjzNiP8ACgkQDiA3Y2gH8kWSSQCcD4D7T7SPfsdCXZYpRQMo 46mgh3QAoMZH4xABPfUx1+mOGM58ETOQR+QtiGAEExECACACGwMFCwcKAwQDFQMC AxYCAQIeAQIXgAIZAQUCPLmexAAKCRC0s903PDUBoAp6AJ9w51c1YET18RhXl856 wv9hBHYHAQCgkPSD7PUrMytvd6YiHq/JUajKLfqIYgQTEQIAGgULBwoDBAMVAwID FgIBAheAAhkBBQI6025rABIJELSz3Tc8NQGgB2VHUEcAAQFpGQCgukI3j43xcqN3 VgtzZIcFdoyfFRkAnj19s5vlOfWn0WAenYCjgcysTUyoiEYEExECAAYFAkDQpSAA CgkQQ2Vz7gNb91wAPQCeNDfYi8WIghGIa/v83N4t8jJ7fxMAoOC+FA6Hr5I2KJH/ pBu6y+t5fA/tiEYEExECAAYFAkDPCH0ACgkQCQM7t5B2mhCvbQCggk+Z0h281o++ Wtiq/QGwaA3OoHoAniQrDVIJmBT4Z2LOsWU26Jc2M9YtiEYEExECAAYFAkDNCZkA CgkQz8H8hiDrxkG9lwCgwfLnW55DSMesCGyX3e1zc0BFD2MAoPB15DhlXPyty7fp wBa9j+Jj0e9MiEYEExECAAYFAkDMhgUACgkQ144QkYb9jGgfrQCeP7Kz6ffr40iX a0QjdveJedclU4wAnRUu5P1j/x2w6aoElLu8tTmTbPvEiEYEExECAAYFAkDASvsA CgkQVLe2nHfUM4NVJQCeIJfQbiFb0JQ1CDae19gZNQ+KP5oAn1veZdULjiBTwDDi 5dB70SW3oU49iEYEExECAAYFAj8/l4QACgkQlZ/JOHsLIwjtQgCg7A8sOG49zeNd b3cKasEoCGVc4oYAoOXd85PuowEwC9XbMfiDTxRYRfCwiEYEExECAAYFAj8/UREA CgkQ1dlLUeP4bkxRtQCffgLOcm23bZVPajlVJeBesO3g10QAoKi4OblXQK9+uWnk zExt8Zi4YHLpiEYEExECAAYFAj8NmGEACgkQXfGeK2entYQU6wCgm92NFxyZ2W/j NAiQ7lI/rtuIfQwAnj25Fbd++UbEyeb9nangCaCu//CViEYEExECAAYFAj8NH9AA CgkQHkr3KdXO/9CStgCfSeYElW+BPMZ6DLf8i0Fau9PoN7cAniY41XOSnL6wlWyh p32LhncUfn6KiEYEExECAAYFAj8NCHAACgkQhDckzp+oeV2aNwCgugsIuK467/4D 8pMmfXKlvhYiAjUAnAsQOcEeOlxNFAdoNyPuWiKIljtMiQEcBBMBAgAGBQI/EM/K AAoJECJCGAJQWMxzqUwIALEz0peHIYnfsebcN1ymZqBkqIR3VtEeTu/FyPEwBLak hivRrY7g3ZS8ktW/bnMRsEHFxE15fbhJwVow19Fxtw+HBoOW8HxPU7EziPbBaRmH kADLlCag47CPLYj3vtTtg77eHYrHR1m9sdWeL9gTTa0+MhSbZChLQXrdZuwvwPAw 9yP1V3vw/DfbSghleljTrUCEVeOgUHzriPB152vunNM5gXOmFp/9MX40Rl0eGpXs CJSH6PKt0vFyRf/XQq44OLumdOR7l2VZtdMKu7XcGG5NSr/Nt0OGEkIt1/gL+7Ho ZCT2R5ZxuZLD7pPUxxF3l3tj4f27XbkSnol7T0HQ7leJARwEEwECAAYFAj8NknAA CgkQ229lmotMvJxoRwgA28aMbytULhwNkzJG3aTIpodr5I1urVfaAE9tczqJqGCU lUGQp42Me9egQsOiCaNlJAM2zn5nelc/ordJ7/EJPQsn7rwmQZME1OQsSKuqibc5 xajXUbMTOPtLm4erQqEQ7V6baZvrkA04a1gdJPvXKEIXXGkdprPz0GUe2gWQq+Oq hV6mYK5SqHU58wc7dvt4mJOiTLGl0H3rMasQK6oPoh+TcSVy3mWAhFeBb3IY4miK /TU/aNPfCslNhJTBaeZVso0B9AGziFrP18JsjA4jGAK++Fy9MMThi79KzJ4Gp6hb ai/4DvQimnabxvywaT37e4erbdUEh/uQ9PvsPzAUiohGBBIRAgAGBQI/J9A6AAoJ EOTlTRGaDNqZL1cAmwZWvoEyP58lx2q0BcDspnPzEkjiAKCo9Qo8NNHAoQKsgeLA uFLAam+Mn4hGBBIRAgAGBQI+p5vMAAoJEHVOL1PCxbz9ULUAnifq0cBfoQtObJ9G vCDxGzfqkFyaAJwP4XCa3sVBWU39dTRkT+WrMwxhMohGBBIRAgAGBQI9ml8AAAoJ EMy/IJuikFjIsfQAoLUznKWxLkR0WUgP16qqH8D5dXQwAKCwHbrEL2Hw6UGpSV5M ZvW6CJxMRYhGBBARAgAGBQI+TMjiAAoJEOMgTB9dK7Ea8m8AnjKn7KjdlL0qqI1z Px5jwtRm42QhAJ0caoCGtFjY7W9xJbGX2d4IkGtJPohGBBARAgAGBQI8zYk7AAoJ ELuMsXTUlpDy+LQAoKVy/XWXQ632BX9wM0sNlEdLQYvsAKDa9DdzdcWqCr42QVbn 8F5gDn83GYhGBBARAgAGBQI8faMJAAoJELCg5n+j+Ps5VBMAn0E0HY+MidVIOpHG jTSpwIm8oeF/AJ0YyEjXqm/LDwAdvSxi7MonSxOCrYhGBBARAgAGBQI8c3UvAAoJ EFnRuEher531cYMAoLFALwXVAoLWvUGeEk2G+L3kNf0NAKDpIO4N4zHL25lkZLRx DCwqZNsEYohGBBARAgAGBQI8QX82AAoJEJR8e1qVA6czLu4AnjqKZZwaR5rO1R5w oHg74xnwf9C1AJ9H65DCzpFQ25ukq1ozsamkksvVFIhGBBARAgAGBQI8KgjJAAoJ EHHH6q1YVTrcQXEAmwe21Qrhhhi72qA8/GCG/htS9PxWAJ9uqUmKYUiD1ltQcHkt eclh+uHoz4hGBBARAgAGBQI7U8MoAAoJECCJaS1q/feQDm8AoPidU96AszkQb6nV VXbtUWfuYorZAJ9aUkLwzssFzrKN0tJtxH5iphFZ6ohGBBARAgAGBQI7TclYAAoJ EAuZN+X3dQwjTC0AmwSC/QnARdxIU6hSIZ5mVVFTdh9fAJ4pLj5O6SAHhxbHpu0F 1BN7o/RHsYhGBBARAgAGBQI66JjPAAoJEJNV5XZRJAOWXYgAn0pp8JqORgb8x0Mf cN2PFcKAODo/AJ9sQpXANrCXy7rGEKP3EjmrkPMvWIhGBBARAgAGBQI8oHP6AAoJ EA4gN2NoB/JFN9wAoO9E1TsoceUjihlIYgxE1M9mQRJqAKDOMTQRekKX+dCB5auf IJZvEVLO14hGBBARAgAGBQI/EhqRAAoJEHT+njUPQrLCoesAnidkDpPGecBzfdlu S68V0nrDCfKiAJ9qLxlI8ZCgvfKC11mOG23SQEPKZohGBBARAgAGBQJCKgfkAAoJ EDpeFm3cdv65zmwAn11ma1HZOjA8q0aARXEpjTxX8pkDAJwIyMz6+RbowsrjRa1L cNc7lbzczohGBBARAgAGBQJCK+ZjAAoJEHbvjOiHsc+1UjkAoIhJfLLUKQVaMMLN 37SsbFWJOYL8AJ914jSmmB5Eo/gP6uq4Y/bnVwgfm4hGBBARAgAGBQJCMFivAAoJ EFiDbaqm0S+AxU8An3bd9LWdq2xZ+aUNMWQypTeRND3zAJ9mhdBerZ7DpggpHDbm /AcNZxJAdIhGBBARAgAGBQJCiMpeAAoJEIvYLm8wuUtchQgAn0M4YTCICJOecT+5 gLJj9vBYgNiMAKCNTzNCTslB8Jk/vNksMfr95y6ksIhGBBARAgAGBQJCxhE4AAoJ EFQsEcDr0nQYiB4AoID8tmiCbW4S6ovcRmf3fW4llEv3AKC9OnTqVeH8aA4yNUtP OOorUe28sIhGBBERAgAGBQJC71JnAAoJELcZLYZ7dNT10dUAn2aeIqdf4Vk83t1l GxMXMPNabwQLAJ9HuvCMyo1KRt+p7b42mSuwHtFg9YhGBBIRAgAGBQJA9oYRAAoJ EKh7i8KiKVOw6i0An0fjpUGu0NpifwyEMf3PXYgegVNTAJ9sCRALcLmQOEAVp68J ZJ+CM8KvD4hGBBMRAgAGBQJAqZlUAAoJEBhZ0B9ne6Hsw/UAn0ChtF95J+Hp89r2 4RDVBel56yHpAJ9+LQabpENeegL5RoIbArIVQVC09YhGBBMRAgAGBQJAqZn2AAoJ EIHC9+viE7aSfjQAn1VFSY3pebrF6zd54F3XdnCEkg9wAJ9MUfSyYk9U45xBgppg /H1B635viYhGBBMRAgAGBQJAqZpvAAoJEGtw7Nldw/RzSrwAoLOU5bLX63jsW/Zy Hu7W+N3EXDrpAKChuR/fmicA6p/TBUi3UiYnH20B3YhGBBMRAgAGBQJCLrekAAoJ EGAwWzHAn9Na7ioAoJ94Zuu+rWfbgzQWvYoObLmNPhaTAKCTxMyYqsvekfMe/fox IuOeyzrG/4hGBBMRAgAGBQJCvOzQAAoJEG6f0G5oXR6MgmoAn1cV0W/fogN5w8Ab 2jeaMP54AuzTAJ9ucZwOlvqRRHtQFBQrtFzcRJietohGBBMRAgAGBQJCxIljAAoJ EGJWUnKV6ioEvUwAnRelpZNJZYu25XbrHhb+A7w2zWTfAJ4gzA3nGq9IBdIro2yR YsYddlyoXIhXBBMRAgAXBQI6025qBQsHCgMEAxUDAgMWAgECF4AACgkQtLPdNzw1 AaDJgACfUmS41OMYzokB6EEHb5cqhzsm9dAAnAp+vBgIyLEJk8bPJ433OwlraFEH tC5BdWRyZXkgVGFuZyAoYXV0cmlqdXMpIDxhdXRyaWp1c0BhdXRyaWp1cy5vcmc+ iGAEExECACAFAkOX62cCGwMGCwkIBwMCBBUCCAMEFgIDAQIeAQIXgAAKCRC0s903 PDUBoJMuAKCri2KiRc6QzxTP7He9BM/fXEv62gCgpl5Zqm6YRGb5VRp4bplfAKAz 312IRgQQEQIABgUCRAXt+gAKCRA3a4K4Y/abDjh0AJ93dv2ER6gcPHqwbmgChpxu EaiCuQCgqVbLygy5B/8DWiondEMVpVkBynGIRgQQEQIABgUCRBSUbgAKCRB4GWw+ qovKfPgkAJ9ICmDAu+J6a3Oz2byOsZVAQfFwzACgjkuaPu6pgJqUdRf6GxND+Y9E 3+bR1m3WawEQAAEBAAAAAAAAAAAAAAAA/9j/4AAQSkZJRgABAQEASABIAAD/4QA0 RXhpZgAATU0AKgAAAAgAAgESAAMAAAABAAEAAIdpAAQAAAABAAAAJgAAAAAAAAAA AAD/7QAcUGhvdG9zaG9wIDMuMAA4QklNBAQAAAAAAAD/4g34SUNDX1BST0ZJTEUA AQEAAA3oYXBwbAIAAABtbnRyUkdCIFhZWiAH1QALAAoAAAA5AChhY3NwQVBQTAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9tYAAQAAAADTLWFwcGwAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA5yWFlaAAABLAAA ABRnWFlaAAABQAAAABRiWFlaAAABVAAAABR3dHB0AAABaAAAABRjaGFkAAABfAAA ACxyVFJDAAABqAAAAA5nVFJDAAABuAAAAA5iVFJDAAAByAAAAA52Y2d0AAAB2AAA AxJuZGluAAAE7AAABj5kZXNjAAALLAAAAGRkc2NtAAALkAAAAf5tbW9kAAANkAAA AChjcHJ0AAANuAAAAC1YWVogAAAAAAAAX8wAADbCAAAJWVhZWiAAAAAAAABwpgAA spsAACbyWFlaIAAAAAAAACZkAAAWvQAAotpYWVogAAAAAAAA81IAAQAAAAEWz3Nm MzIAAAAAAAEMQgAABd7///MmAAAHkgAA/ZH///ui///9owAAA9wAAMBsY3VydgAA AAAAAAABAc0AAGN1cnYAAAAAAAAAAQHNAABjdXJ2AAAAAAAAAAEBzQAAdmNndAAA AAAAAAAAAAMBAAABAAEDBQYICQsMDg8REhQWFxkaHB0eICEjJCYnKCorLC4vMDIz NDY3ODk7PD0+P0FCQ0RFR0hJSktNTk9QUVJUVVZXWFlbXF1eX2BhYmNkZWZnaGlq a2xtbm9wcXJzdHV2d3h5ent8fX5/gIGCg4SFhoeIiImKi4yNjo+QkZKTlJWWl5iY mZqbnJ2en6ChoqOjpKWmp6ipqqusra6vr7CxsrO0tba3uLm5uru8vb6/wMHBwsPE xcbHyMjJysvMzc7Oz9DR0tPT1NXW19jY2drb3Nzd3t/g4OHi4+Tk5ebn5+jp6uvr 7O3u7u/w8fHy8/P09fb29/j4+fr6+/z8/f3+/wADBAYHCAkLDA0PEBETFBUWGBkb HB0fICEjJCUmKCkqLC0uLzEyMzQ1Nzg5Ojs9Pj9AQUNERUZHSUpLTE1OT1BRUlNU VVZXWFpbXF1eX2BhYmNkZWZoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fn+AgYKDhIWG h4iJiouMjY6PkJGSk5SVlpeYmZqbnJ2en5+goaKjpKWmp6ipqqusra6vr7CxsrO0 tba3uLm6uru8vb6/wMHCw8TFxsfIycrLzM3Oz9DR0tPU1NXW19jZ2tvc3d7f4ODh 4uPk5OXm5+fo6enq6+zs7e7v7/Dx8vLz9PT19vb3+Pj5+fr6+/z8/f3+/v8AAgME BQYHCAkKCwwNDg4PEBESExMUFRYXGBkaGhscHR4fICEiIiMkJSYnKCkqKywtLi8w MTIzNDU2Nzc4OTo7PD0+P0BBQkNERUVGR0hJSktMTU5OT1BRUlNUVFVWV1hZWVpb XF1dXl9gYWFiY2RlZWZnaGlqa2xtbm9wcHFyc3R1dnd4eXp7fHx9fn+AgYGCg4SF hoeIiImKi4yNjo+PkJGSk5SVlZaXmJmam5ydnp+foKGio6SlpqeoqaqrrK2ur7Cx srO0tba3uLm6u7y+v7/AwcLDxMXGx8jJysvMzc7P0NHS09TV1tfY2drb3N3e4OHi 5OXn6evt8PP2+f3/AABuZGluAAAAAAAABjYAAJUYAABWXwAAUWEAAIiGAAApNAAA FqgAAFANAABUOQACXrgAAk9cAAF4UQADAQAAAgAAAAMABgALABAAFgAlAC4ANwBN AFkAZQCBAJAAnwDBANIA5QELASABNQFLAWEBkAGoAcEB9QIPAisCZAKfAr0C3AMc Az0DXwOjA8YD6gQ0BH8EpgTNBR0FcAWaBcQGGwZ0BqEGzwctB4wHvQfuCFIIuAkg CVQJign2CmQK1QtHC4ELvAwyDKsNJg2iDeEOIQ6hDyQPqRAvEHMQuBFDEc8SXRLu E4ATyhQVFKsVQxXdFnkXFxdmF7YYWBj8GaEaSBrxG5wcSRz4HageWx8PH8UgfSE3 IfIisCNvJDAk8yW3Jn4nRigQKNwpqSp5K0osHCzxLccuoC95MFUxMzISMvMz1TS5 NaA2hzdxOFw5STo4Oyg9Dj4DPvs/9EDuQepC6EPoROlF7EbxR/dI/0oJSxRMIU5A T1JQZlF7UpJTq1TFVeFW/1geWT9bhVyrXdJe+2AlYVJif2OvZOBmEmdHaHxq7Wwo bWRuom/hcSJyZXOpdO92NnjJehV7Y3yyfgN/VYCpgf+Er4YJh2WIwoohi4GM44+s kRKSe5PklVCWvJmbmwycf530n2qiWqPVpVGmz6hOq1Gs1K5ar+Cy8rR+tgu3mbq6 vE294b93wqfEQcXdyRnKusxbzf/RStLx1JvX8dmf207eseBk49DliOdB6rnsdu/3 8bn1QvcI+pr+Mf//AAAAAAABAAMACwAQABYAJQA3AE0AWQBlAIEAnwCwAMEA5QEL ASABNQFhAZABwQHaAfUCKwJHAmQCnwLcAvwDHANfA6MDxgPqBDQEfwTNBPUFHQVw BcQF7wYbBnQGzwctB1wHjAfuCFIIuAkgCVQJign2CmQK1QtHC4ELvAwyDKsNJg2i DeEOIQ6hDyQPqRAvEHMQuBFDEc8SXRLuE4AUFRSrFUMV3RZ5FxcXthhYGPwZoRn0 Gkga8RucHEkc+B2oHlsfDx/FIH0hNyHyIrAjDyNvJDAk8yW3Jn4nRigQKNwpqSp5 K0osHCzxLccuoC95MFUxMzISMvMz1TS5NaA2hzdxOFw5STo4Oyg8Gj0OPgM++z/0 QO5B6kLoQ+hE6UXsRvFH90j/SglLFEwhTTBOQE9SUGZRe1KSU6tUxVXhVv9ZP1ph W4Vcq13SXvtgJWFSYn9jr2TgZhJnR2h8abRq7W1kbqJv4XEicmVzqXTvdjZ3f3jJ ehV8sn4Df1WAqYH/g1aEr4YJh2WIwoohi4GM445Hj6yREpJ7k+SVUJa8mCuZm5sM nH+d9J9qolqj1aVRps+oTqnOq1Gs1K5ar+CxabLytgu3mbkpurq94b93wQ7EQcXd yRnKusxbz6PRStLx1kXX8dmf3P/eseIZ49DnQej87Hbv9/N89UL40Pxl//8AAAAB AAMACwAWACUANwBNAGUAgQCfAMEA5QELATUBkAHBAfUCKwJkAtwDHANfA6MD6gQ0 BH8FHQVwBcQGGwZ0Bs8HLQeMCFIIuAkgCYoJ9gpkCtULRwu8DDIMqw0mDaIOIQ6h DyQPqRAvELgRQxHPEu4TgBQVFKsVQxXdFnkXFxe2GFgY/BmhGkga8RxJHPgdqB5b Hw8fxSB9ITch8iNvJDAk8yW3Jn4nRijcKakqeStKLBwtxy6gL3kwVTISMvMz1TS5 Noc3cThcOUk7KDwaPQ4+Az77P/RA7kHqQuhD6ETpRvFH90j/SglLFEwhTTBOQE9S UGZRe1KSVMVV4Vb/WB5ZP1uFXKtd0l77YCVhUmJ/ZOBmEmdHaHxptGrtbChuom/h cSJyZXOpdO93f3jJehV7Y3yyfgN/VYCpgf+DVoYJh2WIwoohi4GM445Hj6yREpJ7 k+SVUJa8mCuZm5sMnH+d9J9qoOGiWqPVpVGmz6hOqc6rUazUrlqvHa/gsWm0frYL t5m5Kbq6vE294b93wQ7Cp8RBxd3He8kZyrrMW83/z6PRStLx1JvWRdfx2Z/bTtz/ 3rHgZOIZ49DliOZk50Ho/Oq565fsdu427xbv9/DX8bnymvN89F/1QvXZ9nD3CPeg +Dj40Plp+gH6mvsz+8z8ZfzY/Uv9vv4x/xj//wAAZGVzYwAAAAAAAAAKQ29sb3Ig TENEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAG1sdWMAAAAAAAAADwAA AAxpdElUAAAAFAAAAMRmckZSAAAAQgAAANhuYk5PAAAAEgAAARplc0VTAAAAEgAA ASxmaUZJAAAAEAAAAT5wdFBUAAAAGAAAAU56aFRXAAAADgAAAWZqYUpQAAAADgAA AXRubE5MAAAAFgAAAYJkZURFAAAAEAAAAZhrb0tSAAAADAAAAahlblVTAAAAEgAA AbRzdlNFAAAAEAAAAcZkYURLAAAAHAAAAdZ6aENOAAAADAAAAfIATABDAEQAIABj AG8AbABvAHIAaQDJAGMAcgBhAG4AIADgACAAYwByAGkAcwB0AGEAdQB4ACAAbABp AHEAdQBpAGQAZQBzACAAYwBvAHUAbABlAHUAcgBGAGEAcgBnAGUALQBMAEMARABM AEMARAAgAGMAbwBsAG8AcgBWAOQAcgBpAC0ATABDAEQATABDAEQAIABjAG8AbABv AHIAaQBkAG9faYJybbJmdphveTpWaDCrMOkw/AAgAEwAQwBEAEsAbABlAHUAcgBl AG4ALQBMAEMARABGAGEAcgBiAC0ATABDAETO7LfsACAATABDAEQAQwBvAGwAbwBy ACAATABDAEQARgDkAHIAZwAtAEwAQwBEAEwAQwBEAC0AZgBhAHIAdgBlAHMAawDm AHIAbV9pgnIAIABMAEMARAAAbW1vZAAAAAAAAAYQAACcRQAAAAC+c5EAAAAAAAAA AAAAAAAAAAAAAHRleHQAAAAAQ29weXJpZ2h0IEFwcGxlIENvbXB1dGVyLCBJbmMu LCAyMDA1AAAAAP/bAEMACgcHCAcGCggICAsKCgsOGBAODQ0OHRUWERgjHyUkIh8i ISYrNy8mKTQpISIwQTE0OTs+Pj4lLkRJQzxINz0+O//bAEMBCgsLDg0OHBAQHDso Iig7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7 Ozs7O//AABEIAGQAeAMBIgACEQEDEQH/xAAcAAAABwEBAAAAAAAAAAAAAAAAAgME BQYHAQj/xAAzEAACAQMDAgUCBAUFAAAAAAABAgMABBEFITESQQYTIlFxMmEUQoGR BzOh0eEWIyRSsf/EABoBAAMBAQEBAAAAAAAAAAAAAAIDBAUBAAb/xAAjEQACAgEE AgIDAAAAAAAAAAAAAQIRAwQSITEiQTJxE0JR/9oADAMBAAIRAxEAPwDGiWB32rvU Rk5FFow+P3rgabO9RJy1cPTnYnf2rp6RtRRjNeOt+gyDf/FKw28s0nRGCac2GnSX bYGydzirbpejpAuy/P3qfLmUeirHgtWyJ0zQcyBn3waktUsCLdhjtgA1Y7ezVEJC gUnc2Qm2NZ7yuUrZVsVUjLp4/KkIPake/GasWuaSY5WkQbd6rxUqSM1p45qcSHLB xd+he2mKMwPDjBFdileCXCtghupD7GmwBDZyARTi5DSKkyj6hyPeiaV/YMZOvo3r wJ4mXxLoatIwF3b4Sdfc9m/WrGy1gn8O9dfRfFcHW2ILk+TKM7bnY/oa38rkVk6j H+OfHRTCW5DRloUs60KQGeWgPnFDJo+2MdqKdjsa+gM9qgYH60+03TnvZhsenuaR srVrqYKOO5q56fapbxgBRxU+bLtVLspwYr8mOtO05Io1RVAAqdggijA6iBUO16sC 7npplPrkrnpjGe1ZrTkW2kW78Raj0hq4BHI3obNVuzuXwGl79ql7e7QDkZoHGjqY y1mxDAnHNULVbA28hKj0nitIupFlUjryagtU01bmFtt8bGn4cjgwJxUlTKCwxTm3 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 KgQmowCeNPJ1aBnU00dK9DCJ7b3jX2AEB/EAoIeMEfqHyeuPIp9ua35joiD/dCBA 0dGb0ZkBEAABAQAAAAAAAAAAAAAAAP/Y/+AAEEpGSUYAAQIBAEgASAAA/+4ADkFk b2JlAGSAAAAAAf/bAIQACAYGBgYGCAYGCAwIBwgMDgoICAoOEA0NDg0NEBEMDAwM DAwRDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAEJCAgJCgkLCQkLDgsNCw4R Dg4ODhERDAwMDAwREQwMDAwMDBEMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM /8AAEQgAVQBuAwEiAAIRAQMRAf/dAAQAB//EAaIAAAAHAQEBAQEAAAAAAAAAAAQF AwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAAAQACAwQFBgcICQoLEAACAQMDAgQC BgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPBUtHhMxZi8CRygvEl QzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE1OT0 ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5 SVlpeYmZqbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhED BCESMUEFURNhIgZxgZEyobHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJE gxdUkwgJChgZJjZFGidkdFU38qOzwygp0+PzhJSktMTU5PRldYWVpbXF1eX1RlZm doaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+DlJWWl5iZmpucnZ6fkq OkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8AiOj2UD6dYu1ir1t4SXNiHr8C78/8 N3fOv831i5/4zzf3mGUGm23GjaehNen6OFf/ABE3/XgTRtIMulWM36MMga2ib1P0 f6gasanlz/wzd86/z/Wbjl/y0Tf3uGKaLSJWOk9a7nTP4/4SP/EswqPH82zbh5d3 VEfo2xVOR0uM7d9NWv4+VEwouYrK2jZ5NOiUKCSWsYloP9l5cjx2r21paRsTp0Uf FaljYRpSnereXbfISzy6ld/VrO3SpqIwkUSsx+yTzt4bb90P5nTJCBkbJ2HM8mcC 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 CefAJ7Q4QXV0cmlqdXMgVGFuZyAoVGFuZyBab25nLUhhbikgPGF1dHJpanVzQHNv dXJjZWZvcmdlLm5ldD6IfgQwEQIAPgUCQ84mtTcdIEkndmUgbGVnYWxseSBjaGFu Z2VkIG15IG5hbWUgZnJvbSBBdXRyaWp1cyB0byBBdWRyZXkuAAoJELSz3Tc8NQGg mL4An1hA6Sw80+0E4yPVVhwR7ZUZRr6QAJ9CGEYD7j1Ky/uSMCW3L4uwU08f3ohG BBARAgAGBQI8QX8+AAoJEJR8e1qVA6czfgEAoNKdGYBw2+LyC7N33BfWmV7g85pQ AJ9e8PC+XXQgiyK8rTj77P8ZmOyfSohGBBARAgAGBQI8faMMAAoJELCg5n+j+Ps5 I2gAniLjUoF9uuVNK/lS07V0Nnh7flxiAJ9LCEB43qTMg1ktED5PRNyj78VC3Ihd BBMRAgAdBQI8uZ7FAhsDBQsHCgMEAxUDAgMWAgECHgECF4AACgkQtLPdNzw1AaAZ VwCfdVhvVR7ldlVBQJM0Oosb/SlOL0oAoJ5m5QDI7tSnazzQRFCRLeql3SoiiEYE EBECAAYFAj0Pe7QACgkQu4yxdNSWkPKnjgCgpJPwDsWjoymYQXSXUs79eWk6UzQA n0oAMPSiwaJLChns08CNW1Jqbsy2iEYEEhECAAYFAj2aXwIACgkQzL8gm6KQWMgh RACgmQJWUC5z/c7mT6pX1zGJThHVdNgAoLj+61cDdYVc0ZdQ7/N95J48PzUriEYE EBECAAYFAj5MyOUACgkQ4yBMH10rsRrglQCfQnqUwowl3Vo2qPJ1qSsjvmaiqxUA n32MZCs81GaL0TWgN24Q/SM36EqkiEYEExECAAYFAj8NCHYACgkQhDckzp+oeV2Q hQCgkhuJW+Ng8Kk1gS2lEVDqXLdskhEAoLQh3mShDGwAhMv30mdl6DF2ZHapiEYE ExECAAYFAj8NH9AACgkQHkr3KdXO/9AqygCfewp0shCuqGqutf3tFVsRqPVLY34A n0RqE5iW3QBwJk5IsiAsaHaL/WR1iQEcBBMBAgAGBQI/DZJ4AAoJENtvZZqLTLyc VNEIAMYo9UZhaT7EV2ETi3Q/8y12oEMzGI34OCfi5E7KClNmndJbw59Wo2+IURwz P1c+tnLJ+3mKTMIk11rmmE6scWCqkfqgR4vB43/c14Vt2aChL98nmY28kEeTmQ2J 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 cAAKCRB274zoh7HPtUXOAKDsP7MfE8JTJ9m6Cql+wxAFTRpWZACgzp/wn9RkhDbF N4cIG710GAEdOcCIRgQQEQIABgUCQjBYsQAKCRBYg22qptEvgDkiAKDA/9fpoeb+ pdovDP0xBFpeOXrKlACfW/zLMm94KNgDFu6o2tweIjHPMYiIRgQQEQIABgUCQojK YgAKCRCL2C5vMLlLXOAOAJ9kLnkV9KNQom0U2vd7+e0moQxfowCfcU/hfTAfdVTD b48AKTjT8fH9jbeIRgQQEQIABgUCQsYRPwAKCRBULBHA69J0GJ+7AJ9mqwhfwQPu UPXhpbuFRTFSBxV0/ACgm/x+XDIQN5sHZoEG03BcrkKhpmuIRgQREQIABgUCQu9S bQAKCRC3GS2Ge3TU9YxHAJ0UPiy7tImI81LOW/othRghEssULgCdHVwGMVewGs/z yT/eYp9MfZWkUpOIRgQSEQIABgUCQPaGFgAKCRCoe4vCoilTsKVXAJ9gFm8uSG1n inLB6TAvdppm2ugjqgCeOpCXD9cb4nI8YZNb8cWB1jm9vwKJARwEEwECAAYFAj8Q z84ACgkQIkIYAlBYzHNnjAgAnuA2lNurW5HM518+Cww+pO+uPyegQeg0uLR/qgOE 9MWKBnVqoZU8Hpqt/9d1rrz5wPyOi2+lmhGYwpqy/hDXfBEi9814dvJGxmBn+9LB aXGP7V78u6StPf////////////////////////////////////////////////// //////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////// /////////////////////////////////////////////4hGBBMRAgAGBQJAqZlc AAoJEBhZ0B9ne6HsRlAAnjWxfRm5i1WD40B2D4RAiZwygVbcAKCOkGHaMi4wY8XK IiAyIhQK1nq2a4hGBBMRAgAGBQJAqZn+AAoJEIHC9+viE7aS9vMAnjFkMlYSqOxh WaqgLwwYPbu3WVrfAJ0aDrkFdxht2Kn0Y4ktBG6nVe6qAIhGBBMRAgAGBQJAqZp3 AAoJEGtw7Nldw/Rz9BAAoJpuc8kzuZidJbB1+ftcPDs8P9bxAKCcfX0BDIOoxq0U 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 vt4KMg== =TkGy -----END PGP PUBLIC KEY BLOCK----- Module-Signature-0.73/AUTHORS000644 000765 000024 00000001406 12044760327 016525 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) Dave Rolsky (DROLSKY) Iain Truskett (SPOON) Jarkko Hietaniemi (JHI) Jos Boumans (KANE) Mark Shelor Matt Southall Michael G Schwern (MSCHWERN) Scott R. Godin Soren A Steve Hay (SHAY) Tels (TELS) Walt Mankowski William Wentworth-Sheilds Module-Signature-0.73/Changes000644 000765 000024 00000027246 12153722644 016763 0ustar00audreytstaff000000 000000 [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.73/inc/000755 000765 000024 00000000000 12153722711 016221 5ustar00audreytstaff000000 000000 Module-Signature-0.73/lib/000755 000765 000024 00000000000 12153722711 016216 5ustar00audreytstaff000000 000000 Module-Signature-0.73/Makefile.PL000644 000765 000024 00000010727 12044761130 017426 0ustar00audreytstaff000000 000000 use strict; use inc::Module::Install 0.92; $|++; name 'Module-Signature'; license 'CC0'; all_from 'lib/Module/Signature.pm'; readme_from 'lib/Module/Signature.pm'; repository 'http://github.com/audreyt/module-signature'; install_script 'script/cpansign'; build_requires 'Test::More', 0, 'IPC::Run', 0; # 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'; } } # The list of OpenPGP dependencies (which we use in several places) my @OPEN_PGP = qw{ MIME::Base64 0 Compress::Zlib 0 Crypt::CBC 0 Crypt::DES 0 Crypt::Blowfish 0 Crypt::RIPEMD160 0 Tie::EncryptedHash 0 Class::Loader 0 Convert::ASCII::Armour 0 Data::Buffer 0.04 Digest::MD2 0 Math::Pari 0 Crypt::Random 0 Crypt::Primes 0 Crypt::DES_EDE3 0 Crypt::DSA 0 Crypt::RSA 0 Convert::ASN1 0 Convert::PEM 0 Crypt::OpenPGP 1.00 }; # Is openpgp currently installed if ( can_use('Crypt::OpenPGP') ) { # If OpenPGP is already installed, so relist all the # dependencies so they will upgrade as needed. requires( @OPEN_PGP ); } 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( @OPEN_PGP ); } 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', glob('*.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( @OPEN_PGP ); } else { # Forget about it... print "Module::Signature is not wanted on this host.\n"; exit(0); } } Module-Signature-0.73/MANIFEST000644 000765 000024 00000001074 12044761653 016612 0ustar00audreytstaff000000 000000 AUDREY2006.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/ReadmeFromPod.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 PAUSE2003.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.73/MANIFEST.SKIP000644 000765 000024 00000002126 12044761522 017351 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.73/META.yml000644 000765 000024 00000001124 12153722707 016724 0ustar00audreytstaff000000 000000 --- abstract: 'Module signature file manipulation' author: - '唐鳳 ' 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.06' license: cc0 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: IO::Socket::INET: 0 perl: 5.005 resources: repository: http://github.com/audreyt/module-signature version: 0.73 Module-Signature-0.73/PAUSE2003.pub000644 000765 000024 00000003326 12044760327 017352 0ustar00audreytstaff000000 000000 -----BEGIN PGP PUBLIC KEY BLOCK----- Version: OpenKeyServer v1.2 Comment: Extracted from belgium.keyserver.net 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/zU5BbDnXEPKk0FNWFSnwnxbkCDQQ+ PnCyEAgAjAKDcvpogvJvSrg3rkstDhxP4O+JZvfxzrdL9Qk0FPBlb31ECxPMBf2z KObrwGKwxgD3+lSb/y9SgOYnAsuwztn6BqjQ8AVKiI0MFDTa+tLrtY5860X7TxJD 9bzMx/A4gEsYoFZYR4s/alGAzcqFcdQ2IiFnKE4KPtNXEMQ67lCEw5zdYSoJta9J UKsCX3KI/DOne1NnjNZL2dQadqjsEc8mjvUOTXSG1sCawzTP5tNoPHg13GeyJ0XG HbHY35BbF33yr9kP76+zQFaiMyLDUnyQAU/0P+rm/I6Ts6q4OZwKK/tC5LD0SPDe 08uAzkb4krRqxheo6seHdT7HjdDbKwADBgf/RGpQhhZc+F9o79S9aLV4XnY5CFev 4EJvUqq6TF9V0rvZg148mbO/b8EtOfcBSdvAfo3H8w6wcC7X8Kt/6Pl69UZKuQOt 354092gTrjJyg1uZBK9Ey/LSh0k+BNCfIw04+6W8ijARkpdoBrU3CwDKTyroWYkS FDkkzLvJRTkMpVpqyI0xIEExPXZTf67Abv1dzceTDciblLJfQcsfDyWYv8D12ELE zLYQnFM1s6yD6Q51Xk/XQ6MJ59bB3uuFO8VpkCMEvqIxZXsLjgqyQgo73y1qFizs KnFG+TTvooBdG3yqSt9OsLSoRrJkZbMX3PKpbT0ceWL8dULc1v2ol4fJGohMBBgR AgAMBQI+PnCyBQkDwmcAAAoJEDKNqGdFD4nsS44An14sFX5E2jJc87HFJeqPmeas hdayAKCCmOqjo0CW5uepN19pXdP7BujUOw== =ocE3 -----END PGP PUBLIC KEY BLOCK----- Module-Signature-0.73/README000644 000765 000024 00000020576 12153722706 016346 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. 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 唐鳳 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.73/script/000755 000765 000024 00000000000 12153722711 016754 5ustar00audreytstaff000000 000000 Module-Signature-0.73/SIGNATURE000644 000765 000024 00000004776 12153722713 016754 0ustar00audreytstaff000000 000000 This file contains message digests of all files listed in MANIFEST, signed via the Module::Signature module, version 0.73. 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 0b722678d07c66ef6992f2cc2c9e9acf3bef0ecb AUDREY2006.pub SHA1 1e2b550757ebdf3ef2c0e8d1d06bcbb9c6b62a6f AUTHORS SHA1 fb3ceeacbd691a2dfa63f0b22be04eb67817971c Changes SHA1 366ad23151d9113e37f4a9edd4d3304ecc30b9d6 MANIFEST SHA1 af1667da11736451592aeba46d34e38c47a7201c MANIFEST.SKIP SHA1 1728bd49673df420cf1be5a93e8e95bfa6ad18ad META.yml SHA1 3670c5391c41935eb113a75dcf190646a83eb553 Makefile.PL SHA1 37e858c51409a297ef5d3fb35dc57cd3b57f9a4d PAUSE2003.pub SHA1 6135b90837836cd8a72c78cbec211b2d84996c99 README SHA1 8a924add836b60fb23b25c8506d45945e02f42f4 inc/Module/Install.pm SHA1 2d0fad3bf255f8c1e7e1e34eafccc4f595603ddc inc/Module/Install/Base.pm SHA1 f0e01fff7d73cd145fbf22331579918d4628ddb0 inc/Module/Install/Can.pm SHA1 272e65bd98dd43c7acd8c272dde84fbe5794fc07 inc/Module/Install/External.pm SHA1 7328966e4fda0c8451a6d3850704da0b84ac1540 inc/Module/Install/Fetch.pm SHA1 b62ca5e2d58fa66766ccf4d64574f9e1a2250b34 inc/Module/Install/Makefile.pm SHA1 1aa925be410bb3bfcd84a16985921f66073cc1d2 inc/Module/Install/Metadata.pm SHA1 dc94326a076aca41452c1d65bf52a255feeb9ef7 inc/Module/Install/ReadmeFromPod.pm SHA1 4d793c044726e06fe35d8d129b76da2803377f92 inc/Module/Install/Scripts.pm SHA1 e4196994fa75e98bdfa2be0bdeeffef66de88171 inc/Module/Install/Win32.pm SHA1 c3a6d0d5b84feb3280622e9599e86247d58b0d18 inc/Module/Install/WriteAll.pm SHA1 6c5cda03253ec382b7f558f891d2f4868a235610 lib/Module/Signature.pm SHA1 0882c50213a28b7a30fc91fd58c19015f33348d0 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.4.12 (Darwin) iEYEARECAAYFAlGvpckACgkQtLPdNzw1AaCR9wCfZp9kU2M8/1xG/5Nac1G7g4dH rFwAnA5VfZ1qA17gOZF/sn/sRUhI6LwL =aUN8 -----END PGP SIGNATURE----- Module-Signature-0.73/t/000755 000765 000024 00000000000 12153722711 015713 5ustar00audreytstaff000000 000000 Module-Signature-0.73/t/0-signature.t000644 000765 000024 00000001721 12044761526 020245 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.73/t/1-basic.t000644 000765 000024 00000000273 12044761526 017327 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.73/t/2-cygwin.t000644 000765 000024 00000000746 12044761526 017554 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.73/t/3-verify.t000644 000765 000024 00000001123 12044761526 017547 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.73/t/wrap.pl000644 000765 000024 00000006367 12044761526 017243 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.73/t/wrapped-tests.bin000644 000765 000024 00000012414 12044761526 021217 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.73/script/cpansign000644 000765 000024 00000003653 12044760327 020514 0ustar00audreytstaff000000 000000 #!/usr/bin/perl $VERSION = '0.06'; =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 => '0') unless 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 COPYRIGHT Copyright 2002, 2003, 2006 by Audrey Tang. This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. See L =cut Module-Signature-0.73/lib/Module/000755 000765 000024 00000000000 12153722711 017443 5ustar00audreytstaff000000 000000 Module-Signature-0.73/lib/Module/Signature.pm000644 000765 000024 00000065472 12153722602 021757 0ustar00audreytstaff000000 000000 package Module::Signature; $Module::Signature::VERSION = '0.73'; use 5.005; use strict; use vars qw($VERSION $SIGNATURE @ISA @EXPORT_OK); use vars qw($Preamble $Cipher $Debug $Verbose $Timeout); 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 $KeyServer $Cipher $Preamble), (grep { /^[A-Z_]+_[A-Z_]+$/ } keys %Module::Signature::), ); @ISA = 'Exporter'; $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) { my($cipher,$digest,$file) = split " ", $line, 3; return unless defined $file; $map{$file} = [$cipher, $digest]; } return \%map; } sub verify { my %args = ( skip => 1, @_ ); 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 || ''; 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 { ($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); 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' : () ) : ()), $SIGNATURE ); my $output = ''; if( $Verbose ) { warn "Executing @cmd\n"; system @cmd; } else { my $cmd = join ' ', @cmd; $output = `$cmd`; } 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( Filename => $SIGNATURE ) 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: $!"; } while () { next if (1 .. /^-----BEGIN PGP SIGNED MESSAGE-----/); last if /^-----BEGIN PGP SIGNATURE/; $signature .= $_; } return ((split(/\n+/, $signature, 2))[1]); } sub _compare { my ($str1, $str2, $ok) = @_; # normalize all linebreaks $str1 =~ s/[^\S ]+/\n/g; $str2 =~ s/[^\S ]+/\n/g; 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; open D, "| $gpg --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 $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_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. 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 唐鳳 Ecpan@audreyt.orgE =head1 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. L =cut Module-Signature-0.73/inc/Module/000755 000765 000024 00000000000 12153722711 017446 5ustar00audreytstaff000000 000000 Module-Signature-0.73/inc/Module/Install/000755 000765 000024 00000000000 12153722711 021054 5ustar00audreytstaff000000 000000 Module-Signature-0.73/inc/Module/Install.pm000644 000765 000024 00000030135 12153722705 021417 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.005; 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.06'; # 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::cwd(); my $sym = "${who}::AUTOLOAD"; $sym->{$cwd} = sub { my $pwd = Cwd::cwd(); 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::cwd()) 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 //, $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]): $!"; 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]): $!"; 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]): $!"; 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]): $!"; 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.73/inc/Module/Install/Base.pm000644 000765 000024 00000002147 12153722705 022273 0ustar00audreytstaff000000 000000 #line 1 package Module::Install::Base; use strict 'vars'; use vars qw{$VERSION}; BEGIN { $VERSION = '1.06'; } # 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.73/inc/Module/Install/Can.pm000644 000765 000024 00000006157 12153722706 022130 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.06'; @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.73/inc/Module/Install/External.pm000644 000765 000024 00000003545 12153722706 023207 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.06'; $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.73/inc/Module/Install/Fetch.pm000644 000765 000024 00000004627 12153722706 022460 0ustar00audreytstaff000000 000000 #line 1 package Module::Install::Fetch; use strict; use Module::Install::Base (); use vars qw{$VERSION @ISA $ISCORE}; BEGIN { $VERSION = '1.06'; @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.73/inc/Module/Install/Makefile.pm000644 000765 000024 00000027437 12153722705 023147 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.06'; @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-seperated 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.73/inc/Module/Install/Metadata.pm000644 000765 000024 00000043277 12153722705 023152 0ustar00audreytstaff000000 000000 #line 1 package Module::Install::Metadata; use strict 'vars'; use Module::Install::Base (); use vars qw{$VERSION @ISA $ISCORE}; BEGIN { $VERSION = '1.06'; @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 hashs 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.73/inc/Module/Install/ReadmeFromPod.pm000644 000765 000024 00000006311 12153722706 024103 0ustar00audreytstaff000000 000000 #line 1 package Module::Install::ReadmeFromPod; use 5.006; use strict; use warnings; use base qw(Module::Install::Base); use vars qw($VERSION); $VERSION = '0.20'; sub readme_from { my $self = shift; return unless $self->is_admin; # Input file my $in_file = shift || $self->_all_from or die "Can't determine file to make readme_from"; # Get optional arguments my ($clean, $format, $out_file, $options); my $args = shift; if ( ref $args ) { # Arguments are in a hashref if ( ref($args) ne 'HASH' ) { die "Expected a hashref but got a ".ref($args)."\n"; } else { $clean = $args->{'clean'}; $format = $args->{'format'}; $out_file = $args->{'output_file'}; $options = $args->{'options'}; } } else { # Arguments are in a list $clean = $args; $format = shift; $out_file = shift; $options = \@_; } # Default values; $clean ||= 0; $format ||= 'txt'; # Generate README print "readme_from $in_file to $format\n"; if ($format =~ m/te?xt/) { $out_file = $self->_readme_txt($in_file, $out_file, $options); } elsif ($format =~ m/html?/) { $out_file = $self->_readme_htm($in_file, $out_file, $options); } elsif ($format eq 'man') { $out_file = $self->_readme_man($in_file, $out_file, $options); } elsif ($format eq 'pdf') { $out_file = $self->_readme_pdf($in_file, $out_file, $options); } if ($clean) { $self->clean_files($out_file); } return 1; } sub _readme_txt { my ($self, $in_file, $out_file, $options) = @_; $out_file ||= 'README'; require Pod::Text; my $parser = Pod::Text->new( @$options ); open my $out_fh, '>', $out_file or die "Could not write file $out_file:\n$!\n"; $parser->output_fh( *$out_fh ); $parser->parse_file( $in_file ); close $out_fh; return $out_file; } sub _readme_htm { my ($self, $in_file, $out_file, $options) = @_; $out_file ||= 'README.htm'; require Pod::Html; Pod::Html::pod2html( "--infile=$in_file", "--outfile=$out_file", @$options, ); # Remove temporary files if needed for my $file ('pod2htmd.tmp', 'pod2htmi.tmp') { if (-e $file) { unlink $file or warn "Warning: Could not remove file '$file'.\n$!\n"; } } return $out_file; } sub _readme_man { my ($self, $in_file, $out_file, $options) = @_; $out_file ||= 'README.1'; require Pod::Man; my $parser = Pod::Man->new( @$options ); $parser->parse_from_file($in_file, $out_file); return $out_file; } sub _readme_pdf { my ($self, $in_file, $out_file, $options) = @_; $out_file ||= 'README.pdf'; eval { require App::pod2pdf; } or die "Could not generate $out_file because pod2pdf could not be found\n"; my $parser = App::pod2pdf->new( @$options ); $parser->parse_from_file($in_file); open my $out_fh, '>', $out_file or die "Could not write file $out_file:\n$!\n"; select $out_fh; $parser->output; select STDOUT; close $out_fh; return $out_file; } sub _all_from { my $self = shift; return unless $self->admin->{extensions}; my ($metadata) = grep { ref($_) eq 'Module::Install::Metadata'; } @{$self->admin->{extensions}}; return unless $metadata; return $metadata->{values}{all_from} || ''; } 'Readme!'; __END__ #line 254 Module-Signature-0.73/inc/Module/Install/Scripts.pm000644 000765 000024 00000001011 12153722706 023036 0ustar00audreytstaff000000 000000 #line 1 package Module::Install::Scripts; use strict 'vars'; use Module::Install::Base (); use vars qw{$VERSION @ISA $ISCORE}; BEGIN { $VERSION = '1.06'; @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.73/inc/Module/Install/Win32.pm000644 000765 000024 00000003403 12153722706 022320 0ustar00audreytstaff000000 000000 #line 1 package Module::Install::Win32; use strict; use Module::Install::Base (); use vars qw{$VERSION @ISA $ISCORE}; BEGIN { $VERSION = '1.06'; @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.73/inc/Module/Install/WriteAll.pm000644 000765 000024 00000002376 12153722706 023151 0ustar00audreytstaff000000 000000 #line 1 package Module::Install::WriteAll; use strict; use Module::Install::Base (); use vars qw{$VERSION @ISA $ISCORE}; BEGIN { $VERSION = '1.06'; @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;