[BACK]Return to Keyring.pm CVS log [TXT][DIR] Up to [local] / palm / Palm-Keyring / lib / Palm

Diff for /palm/Palm-Keyring/lib/Palm/Keyring.pm between version 1.17 and 1.21

version 1.17, 2007/01/30 05:16:16 version 1.21, 2007/01/31 05:32:20
Line 1 
Line 1 
 package Palm::Keyring;  package Palm::Keyring;
   
 # $RedRiver: Keyring.pm,v 1.16 2007/01/30 04:59:55 andrew Exp $  # $RedRiver: Keyring.pm,v 1.20 2007/01/31 04:29:08 andrew Exp $
 #  #
 # Perl class for dealing with Keyring for Palm OS databases.  # Perl class for dealing with Keyring for Palm OS databases.
 #  #
Line 25 
Line 25 
 Readonly my $NULL       => chr 0;  Readonly my $NULL       => chr 0;
   
 # One liner, to allow MakeMaker to work.  # One liner, to allow MakeMaker to work.
 our $VERSION = 0.91;  our $VERSION = 0.92;
   
 sub new {  sub new {
     my $classname = shift;      my $classname = shift;
Line 71 
Line 71 
   
     # skip the 0 record that holds the password      # skip the 0 record that holds the password
     return $rec if ! exists $self->{'records'};      return $rec if ! exists $self->{'records'};
   
     # skip records with no data (There shouldn't be any)  
     return $rec if ! exists $rec->{'data'};      return $rec if ! exists $rec->{'data'};
   
     my ( $name, $encrypted ) = split /$NULL/xm, $rec->{'data'}, 2;      my ( $name, $encrypted ) = split /$NULL/xm, $rec->{'data'}, 2;
   
     return $rec if ! $encrypted;      return $rec if ! $encrypted;
     $rec->{'data'} = $name;      delete $rec->{'data'};
       $rec->{'name'} = $name;
     $rec->{'encrypted'} = $encrypted;      $rec->{'encrypted'} = $encrypted;
   
     return $rec;      return $rec;
Line 91 
Line 90 
     my $rec0_id = $self->{'records'}->[0]->{'id'};      my $rec0_id = $self->{'records'}->[0]->{'id'};
   
     if ($rec->{'encrypted'} && ! $rec->{'id'} == $rec0_id) {      if ($rec->{'encrypted'} && ! $rec->{'id'} == $rec0_id) {
         $rec->{'data'} = join $NULL, $rec->{'data'}, $rec->{'encrypted'};          $rec->{'data'} = join $NULL, $rec->{'name'}, $rec->{'encrypted'};
           delete $rec->{'name'};
         delete $rec->{'encrypted'};          delete $rec->{'encrypted'};
     }      }
   
Line 126 
Line 126 
     $data->{'password'} ||= $EMPTY;      $data->{'password'} ||= $EMPTY;
     $data->{'notes'}    ||= $EMPTY;      $data->{'notes'}    ||= $EMPTY;
   
       my ($day, $month, $year);
   
       # XXX the 0 here is a placeholder for $record_has_changed.
       if ( 0 || ! $data->{'lastchange'}) {
           ($day, $month, $year) = (localtime)[3,4,5];
           $year -= 4;
           $month++;
       }
   
       my $p = $day | ($month << 5) | ($year << 9);
       my $packeddate = pack 'n', $p;
   
     my $plaintext = join $NULL,      my $plaintext = join $NULL,
         $data->{'account'}, $data->{'password'}, $data->{'notes'};          $data->{'account'}, $data->{'password'}, $data->{'notes'}, $packeddate;
   
     my $encrypted = _crypt3des( $plaintext, $self->{'digest'}, $ENCRYPT );      my $encrypted = _crypt3des( $plaintext, $self->{'digest'}, $ENCRYPT );
   
     return if ! $encrypted;      return if ! $encrypted;
   
     $rec->{'data'} ||= $data->{'name'};      $rec->{'attributes'}{'Dirty'} = 1;
       $rec->{'attributes'}{'dirty'} = 1;
       $rec->{'name'}    ||= $data->{'name'};
     $rec->{'encrypted'} = $encrypted;      $rec->{'encrypted'} = $encrypted;
   
     return 1;      return 1;
 }  }
   
Line 148 
Line 163 
     }      }
   
     if ( ! $rec) {      if ( ! $rec) {
         carp("Needed parameter 'record' not passed!\n");          croak("Needed parameter 'record' not passed!\n");
         return;  
     }      }
   
     if ( ! $self->Password($pass)) {      if ( ! $self->Password($pass)) {
Line 164 
Line 178 
   
     my $decrypted =      my $decrypted =
         _crypt3des( $rec->{'encrypted'}, $self->{'digest'}, $DECRYPT );          _crypt3des( $rec->{'encrypted'}, $self->{'digest'}, $DECRYPT );
     my ( $account, $password, $notes, $extra ) = split /$NULL/xm,      my ( $account, $password, $notes, $packeddate ) = split /$NULL/xm,
           $decrypted, 4;            $decrypted, 4;
   
       my %Modified;
       if ($packeddate) {
           my $u = unpack 'n', $packeddate;
           my $year  = (($u & 0xFE00) >> 9) + 4; # since 1900
           my $month = (($u & 0x01E0) >> 5) - 1; # 0-11
           my $day   = (($u & 0x001F) >> 0);     # 1-31
   
           %Modified = (
               year   => $year,
               month  => $month || 0,
               day    => $day   || 1,
           );
       }
   
     return {      return {
         account  => $account,          name       => $rec->{'name'},
         password => $password,          account    => $account,
         notes    => $notes,          password   => $password,
           notes      => $notes,
           lastchange => \%Modified,
     };      };
 }  }
   
Line 195 
Line 225 
             }              }
             my $acct = $self->Decrypt($self->{'records'}->[$i], $pass);              my $acct = $self->Decrypt($self->{'records'}->[$i], $pass);
             if ( ! $acct ) {              if ( ! $acct ) {
                 croak("Couldn't decrypt $self->{'records'}->[$i]->{'data'}");                  croak("Couldn't decrypt $self->{'records'}->[$i]->{'name'}");
             }              }
             push @accts, $acct;              push @accts, $acct;
         }          }
Line 393 
Line 423 
     use Palm::Keyring;      use Palm::Keyring;
   
     my $pass = 'password';      my $pass = 'password';
     my $pdb = new Palm::PDB;      my $file = 'Keys-Gtkr.pdb';
       my $pdb  = new Palm::PDB;
     $pdb->Load($file);      $pdb->Load($file);
   
     foreach (0..$#{ $pdb->{'records'} }) {      foreach (0..$#{ $pdb->{'records'} }) {
         next if $_ = 0; # skip the password record          next if $_ = 0; # skip the password record
         my $rec  = $pdb->{'records'}->[$_];          my $rec  = $pdb->{'records'}->[$_];
         my $acct = $pdb->Decrypt($rec, $pass);          my $acct = $pdb->Decrypt($rec, $pass);
         print $rec->{'data'}, ' - ', $acct->{'account'}, "\n";          print $rec->{'name'}, ' - ', $acct->{'account'}, "\n";
     }      }
   
 =head1 SUBROUTINES/METHODS  =head1 SUBROUTINES/METHODS
Line 426 
Line 457 
 $acct is a hashref in the format below.  $acct is a hashref in the format below.
   
     my $acct = {      my $acct = {
         account  => $account,          name       => $rec->{'name'},
         password => $password,          account    => $account,
         notes    => $notes,          password   => $password,
           notes      => $notes,
           lastchange => {
               year  => 107, # years since 1900
               month =>   0, # 0-11, 0 = January, 11 = December
               day   =>  30, # 1-31, same as localtime
           },
     };      };
   
 =head2 Decrypt  =head2 Decrypt
Line 436 
Line 473 
     my $acct = $pdb->Decrypt($rec[, $password]);      my $acct = $pdb->Decrypt($rec[, $password]);
   
 Decrypts the record and returns a hashref for the account as described  Decrypts the record and returns a hashref for the account as described
 under Encrypt();  under Encrypt().
   However, it ignores the "lastchange" field and generates its own.
   It also only uses the "name" field if there is not already a $rec->{'name'}.
   
     foreach (0..$#{ $pdb->{'records'}) {      foreach (0..$#{ $pdb->{'records'}) {
         next if $_ == 0;          next if $_ == 0;

Legend:
Removed from v.1.17  
changed lines
  Added in v.1.21

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>