The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package WebService::Dropbox::TokenFromOAuth1;
use strict;
use warnings;
use JSON;
use Net::OAuth;
use LWP::UserAgent;

sub token_from_oauth1 {
    my ($class, $args) = @_;
    my $request = Net::OAuth->request('protected resource')->new(
        consumer_key => $args->{consumer_key},
        consumer_secret => $args->{consumer_secret},
        request_url => 'https://api.dropboxapi.com/1/oauth2/token_from_oauth1',
        request_method => 'POST',
        signature_method => 'PLAINTEXT', # HMAC-SHA1 can't delete %20.txt bug...
        timestamp => time,
        nonce => &nonce,
        token => $args->{access_token},
        token_secret => $args->{access_secret},
    );
    $request->sign;
    my $ua = LWP::UserAgent->new;
    my $res = $ua->post($request->to_url);
    if ($res->is_success) {
        my $data = decode_json($res->decoded_content);
        return $data->{access_token};
    }
    warn $res->decoded_content;
    return;
}

sub nonce {
    my $length = 16;
    my @chars = ( 'A'..'Z', 'a'..'z', '0'..'9' );
    my $ret;
    for (1..$length) {
        $ret .= $chars[int rand @chars];
    }
    return $ret;
}

1;