Firefox-Sync-Client
view release on metacpan or search on metacpan
lib/Firefox/Sync/Client.pm view on Meta::CPAN
my $data = $c->decrypt(decode_base64($payload->{'ciphertext'}));
$data = repair_json($self, $data);
return $data;
}
sub decrypt_collection {
my ($self, $payload, $collection) = @_;
my $key;
if ($collection eq 'crypto') {
$key = sync_key_to_enc_key($self);
}
else {
if ($self->{'bulk_keys'}{$collection}) {
$key = $self->{'bulk_keys'}{$collection};
}
else {
$key = $self->{'bulk_keys'}{'default'};
}
}
return decrypt_payload($self, $payload, $key);
}
sub fetch_json {
my ($self, $url) = @_;
my $res;
if (defined $self->{'cachefile'}) {
$self->{'cache'} = retrieve($self->{'cachefile'}) unless (-z $self->{'cachefile'});
if (defined $self->{'cache'}->{$url} and (time - $self->{'cache'}->{$url . '_ts'} <= $self->{'cachelifetime'})) {
# We have a cache hit, so simply return it
return decode_json($self->{'cache'}->{$url}->content);
}
else {
# Really do the request
$res = really_fetch_json($self, $url);
# Cache the request
$self->{'cache'}->{$url} = $res;
$self->{'cache'}->{$url . '_ts'} = time;
store($self->{'cache'}, $self->{'cachefile'});
}
}
else {
# We don't have a cache file, so simply request the data and return it
$res = really_fetch_json($self, $url);
}
return decode_json($res->content);
}
sub really_fetch_json {
my ($self, $url) = @_;
# Initialize LWP
my $ua = LWP::UserAgent->new;
$ua->agent ("FFsyncClient/0.1 ");
$ua->credentials ( $self->{'hostname'} . ':' . $self->{'port'}, 'Sync', $self->{'username'} => $self->{'password'} );
# Do the request
my $res = $ua->get($url);
die $res->{'_msg'} if ($res->{'_rc'} != '200');
return $res;
}
sub repair_json {
my ($self, $json) = @_;
$json =~ s/[\x00-\x1f]*//g;
$json .= '}' unless $json =~ /\}$/;
my $left = ($json =~ tr/\{//);
my $right = ($json =~ tr/\}//);
if ($left > $right) {
my $diff = $left - $right;
($json .= '}', $diff--) while ($diff > 0);
}
elsif ($left < $right) {
my $diff = $right - $left;
($json = '{' . $json, $diff--) while ($diff > 0);
}
return $json;
}
1;
__END__
=back
=head1 AUTHOR
Robin Schroeder, E<lt>schrorg@cpan.orgE<gt>
=head1 COPYRIGHT AND LICENSE
Copyright (C) 2012 by Robin Schroeder
This library is free software; you can redistribute it and/or modify
it under the same terms as Perl itself, either Perl version 5.10 or,
at your option, any later version of Perl 5 you may have available.
=cut
( run in 0.547 second using v1.01-cache-2.11-cpan-cdf2f3d4e48 )