/usr/local/CPAN/Palm-Zetetic-Strip/Palm/Zetetic/Strip/PDB/AccountsV10.pm


package Palm::Zetetic::Strip::PDB::AccountsV10;

use strict;
use Palm::PDB;
use Palm::Raw;
use Palm::Zetetic::Strip::CryptV10;
use Palm::Zetetic::Strip::Account;
use Palm::Zetetic::Strip::Util qw(hexdump null_split);

use vars qw(@ISA $VERSION);

require Exporter;

@ISA = qw(Exporter);
$VERSION = "1.02";

sub new
{
    my $class = shift;
    my $self = {};

    bless $self, $class;
    $self->{pdb} = undef;
    return $self;
}

sub load
{
    my ($self, $file) = @_;
    my $pdb;

    $pdb = new Palm::PDB;
    $pdb->Load($file);
    $self->{pdb} = $pdb;
}

sub get_accounts
{
    my ($self, $password) = @_;
    my $records;
    my $record;
    my $crypt;
    my @accounts;

    $crypt = new Palm::Zetetic::Strip::CryptV10($password);

    $records = $self->{pdb}->{records};
    @accounts = ();
    foreach $record (@$records)
    {
        my $encrypted_data;
        my $decrypted_data;
        my $account;

        my $system_id;
        my $account_id;
        my $hash;
        my $series;
        my $hash_type;
        my $system_type;
        my $service_type;
        my $username_type;
        my $password_type;
        my $account_mod_date;
        my $password_mod_date;
        my $binary_data_length;
        my $strings;
        my $system;
        my $username;
        my $comment;
        my $key;
        my $service;
        my @binary_data;

        ($system_id, $account_id, $hash, $encrypted_data)
            = unpack("nna32a*", $record->{data});
        $decrypted_data = $crypt->decrypt($encrypted_data);
        ($series, $hash_type, $system_type, $service_type, $username_type,
         $password_type, $account_mod_date, $password_mod_date,
         $binary_data_length, $strings)
            = unpack("nnnnnnNNna*", $decrypted_data);

        ($system, $service, $username, $password, $comment, $key, @binary_data)
            = split("\0", $strings);

        $account =
            new Palm::Zetetic::Strip::Account("system" => $system,
                                              "username" => $username,
                                              "password" => $password,
                                              "system_id" => $system_id,
                                              "comment" => $comment);
        push(@accounts, $account);
    }

    return \@accounts;
}

1;