Skip to content

Commit

Permalink
Fix OAuth failure for UTF8 parameters (#21)
Browse files Browse the repository at this point in the history
Closes issue #21.
  • Loading branch information
semifor committed Nov 19, 2013
1 parent d0c84c6 commit 6655cbf
Show file tree
Hide file tree
Showing 4 changed files with 52 additions and 4 deletions.
2 changes: 2 additions & 0 deletions Changes
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
- Fix OAuth failure for UTF8 params (issue #21)

4.00007 2013-08-12
- Support for HTTP method PUT (sartak)
- example improvements (clmh)
Expand Down
4 changes: 1 addition & 3 deletions lib/Net/Twitter/Core.pm
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,6 @@ use Encode qw/encode_utf8/;
use DateTime;
use Data::Visitor::Callback;
use Try::Tiny;
use Net::OAuth::Message;


use namespace::autoclean;

Expand Down Expand Up @@ -188,7 +186,7 @@ sub _query_string_for {

my @pairs;
while ( my ($k, $v) = each %$args ) {
push @pairs, join '=', map Net::OAuth::Message::encode($_), $k, $v;
push @pairs, join '=', map URI::Escape::uri_escape_utf8($_,'^\w.~-'), $k, $v;
}

return join '&', @pairs;
Expand Down
5 changes: 4 additions & 1 deletion lib/Net/Twitter/Role/OAuth.pm
Original file line number Diff line number Diff line change
Expand Up @@ -175,9 +175,12 @@ override _add_authorization_header => sub {

local $Net::OAuth::SKIP_UTF8_DOUBLE_ENCODE_CHECK = 1;

my $uri = $msg->uri->clone;
$uri->query(undef);

my $request = $self->_make_oauth_request(
'protected resource',
request_url => $msg->uri,
request_url => $uri,
request_method => $msg->method,
token => $self->access_token,
token_secret => $self->access_token_secret,
Expand Down
45 changes: 45 additions & 0 deletions t/10_net-twitter-regression.t
Original file line number Diff line number Diff line change
Expand Up @@ -98,4 +98,49 @@ is exception { Net::Twitter->new(netrc => 1, traits => [qw/API::Lists/]) }, und
$r = $nt->update_profile_image([ undef, 'my_mug.jpg', Content_Type => 'image/jpeg', Content => '' ]);
is $t->request->content_type, 'multipart/form-data', 'multipart/form-data';

### v4.00007 ### unicode args in search result in 401 "Could not authenticate you"
{
use utf8;
require URI::Escape;

my $nt = Net::Twitter->new(
traits => [qw/API::RESTv1_1 OAuth/],
consumer_key => 'my-consumer-key',
consumer_secret => 'my-consumer-secret',
access_token => 'my-access-token',
access_token_secret => 'my-access-token-secret',
);

my $search_term = '作家'; # writer

$nt->ua->add_handler(request_send => sub {
my $req = shift;

my $uri = $req->uri->clone;
$uri->query(undef);

my $oauth = Net::OAuth->request('protected_resource')->from_authorization_header(
$req->header('Authorization'),
request_url => $uri,
consumer_key => 'my-consumer-key',
consumer_secret => 'my-consumer-secret',
token => 'my-access-token',
token_secret => 'my-access-token-secret',
version => '1.0',
request_method => 'GET',
signature_method => 'HMAC-SHA1',
extra_params => { map Encode::decode_utf8($_), $req->uri->query_form },
);

ok $oauth->verify, 'valid oauth signature';

my $res = HTTP::Response->new(200);
$res->header('Content-Type' => 'application/json');
$res->content('{}');
return $res;
});

$nt->search($search_term);
}

done_testing

0 comments on commit 6655cbf

Please sign in to comment.