Using Perl PayPal API on Debian wheezy

Post Syndicated from Bradley M. Kuhn original http://ebb.org/bkuhn/blog/2013/10/07/paypal-perl.html

I recently upgraded
to Debian wheezy.
On, Debian squeeze, I
had no problem using the stock Perl module Business::PayPal::API
to import PayPal transactions for Software Freedom Conservancy, via the
Debian package libbusiness-paypal-api-perl.

After the wheezy upgrade, something goes wrong and it doesn’t work.
I reviewed
some similar complaints
, that seem to relate
to this
resolved bug
, but that wasn’t my problem, I don’t think.

I ran strace to dig around and see what was going on. The working
squeeeze install did this:

        select(8, [3], [3], NULL, {0, 0})       = 1 (out [3], left {0, 0})
        write(3, "SOMEDATA"..., 1365) = 1365
        rt_sigprocmask(SIG_BLOCK, [ALRM], [], 8) = 0
        rt_sigaction(SIGALRM, {SIG_DFL, [], 0}, {SIG_DFL, [], 0}, 8) = 0
        rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
        rt_sigprocmask(SIG_BLOCK, [ALRM], [], 8) = 0
        rt_sigaction(SIGALRM, {0xxxxxx, [], 0}, {SIG_DFL, [], 0}, 8) = 0
        rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
        alarm(60)                               = 0
        read(3, "SOMEDATA", 5)               = 5
        

But the same script on wheezy did this at the same point:

        select(8, [3], [3], NULL, {0, 0})       = 1 (out [3], left {0, 0})
        write(3, "SOMEDATA"..., 1373) = 1373
        read(3, 0xxxxxxxx, 5)                   = -1 EAGAIN (Resource temporarily unavailable)
        select(0, NULL, NULL, NULL, {0, 100000}) = 0 (Timeout)
        read(3, 0xxxxxxxx, 5)                   = -1 EAGAIN (Resource temporarily unavailable)
        select(0, NULL, NULL, NULL, {0, 100000}) = 0 (Timeout)
        read(3, 0xxxxxxxx, 5)                   = -1 EAGAIN (Resource temporarily unavailable)
        select(0, NULL, NULL, NULL, {0, 100000}) = 0 (Timeout)
        read(3, 0xxxxxxxx, 5)                   = -1 EAGAIN (Resource temporarily unavailable)
        

I was pretty confused, and basically I still am, but then I
noticed this
in the documentation for Business::PayPal::API
,
regarding SOAP::Lite:

if you have already loaded Net::SSLeay (or IO::Socket::SSL), then Net::HTTPS
will prefer to use IO::Socket::SSL. I don’t know how to get SOAP::Lite to
work with IO::Socket::SSL (e.g., Crypt::SSLeay uses HTTPS_* environment
variables), so until then, you can use this hack:
local $IO::Socket::SSL::VERSION = undef;

That hack didn’t work, but I did confirm via strace that on
wheezy, IO::Socket::SSL was getting loaded instead
of Net::SSL. So, I did this, which was a complete and much worse
hack:

        use Net::SSL;
        use Net::SSLeay;
        $ENV{'PERL_LWP_SSL_VERIFY_HOSTNAME'} = 0;
        # Then:
        use Business::PayPal::API qw(GetTransactionDetails TransactionSearch);
        

… And this incantation worked. This isn’t the right fix, but I
figured I should publish this, as this ate up three hours, and it’s worth
the 15 minutes to write this post, just in case someone else tries to use
Business::PayPal::API on wheezy.

I used to be a Perl expert once upon a time. This situation convinced me
that I’m not. In the old days, I would’ve actually figured out what was
wrong.