Ignore:
Timestamp:
04/19/09 20:06:03 (15 years ago)
Author:
nanardon
Message:
  • add specific object to manage ballot data
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/lib/Vote/DB/Poll.pm

    r217 r219  
    99use Crypt::RSA::Key::Public::SSH; 
    1010use Crypt::RSA::Key::Private::SSH; 
    11 use Crypt::CBC; 
    12 use XML::Simple; 
    1311use MIME::Base64; 
    1412use Vote::DB::Ballot; 
    1513use Vote::DB::Voting; 
    1614use Vote::DB::Choice; 
     15use Vote::DB::Poll::Bdata; 
    1716 
    1817=head1 NAME 
     
    371370} 
    372371 
    373 sub _register_ballot { 
    374     my ($self, $choice, $fchoice) = @_; 
    375  
    376     my $uid = ($self->is_crypted 
    377         ? $self->_register_ballot_crypted($choice, $fchoice) 
    378         : $self->_register_ballot_clear($choice, $fchoice)) 
    379         or do { 
    380             $self->rollback; 
    381             return; 
    382         }; 
    383  
    384     $uid 
    385 } 
    386  
    387 sub _register_ballot_clear { 
    388     my ($self, $choice, $fchoice, $uid) = @_; 
    389  
    390     my $addb = $self->db->prepare_cached( 
    391         q{ 
    392         insert into ballot (id, poll, invalid) values (?,?,?) 
    393         } 
    394     ); 
    395     $uid ||= Vote::DB::common::gen_uid(); 
    396     $addb->execute($uid, $self->voteid, scalar(@{$fchoice || []}) ? undef : 'f') or do { 
     372sub find_choice_key { 
     373    my ($self, $value) = @_; 
     374 
     375    my $sth = $self->db->prepare_cached( 
     376        q{select key from choice where lower(label) = ? and poll = ?} 
     377    ); 
     378    $sth->execute(lc($value), $self->voteid); 
     379    my $res = $sth->fetchrow_hashref; 
     380    $sth->finish; 
     381    $res->{key} 
     382} 
     383 
     384sub decrypted_ballots { 
     385    my ($self, $password) = @_; 
     386    my $privkey = $self->private_key($password) or return; 
     387    foreach ($self->list_ballot_need_dec) { 
     388        my $bdata = $self->bdata; 
     389        $bdata->decrypt($_, $privkey); 
     390    } 
     391    1 
     392} 
     393 
     394sub register_ballot { 
     395    my ($self, $vmail, $choice, $referal) = @_; 
     396 
     397    my $bdata = $self->bdata; 
     398    foreach (@{ $choice || []}) { 
     399        $bdata->add_item($_); 
     400    } 
     401    $bdata->submit($vmail, $referal) or do { 
    397402        $self->rollback; 
    398403        return; 
    399404    }; 
    400405 
    401     $self->_register_ballot_items($uid, $choice, $fchoice) or do { 
    402         $self->rollback; 
    403         return; 
    404     }; 
    405  
    406     $uid 
    407 } 
    408  
    409 sub find_choice_key { 
    410     my ($self, $value) = @_; 
    411  
    412     my $sth = $self->db->prepare_cached( 
    413         q{select key from choice where lower(label) = ? and poll = ?} 
    414     ); 
    415     $sth->execute(lc($value), $self->voteid); 
    416     my $res = $sth->fetchrow_hashref; 
    417     $sth->finish; 
    418     $res->{key} 
    419 } 
    420  
    421 sub _register_ballot_items { 
    422     my ($self, $uid, $choice, $fchoice) = @_; 
    423  
    424     my $addbc = $self->db->prepare_cached( 
    425         q{ 
    426         insert into ballot_item (id, value, fromlist) values (?,?,?) 
    427         } 
    428     ); 
    429     foreach (@{ $choice || []}) { 
    430         $addbc->execute($uid, $_, 't') or do { 
    431             $self->rollback; 
    432             return; 
    433         }; 
    434     } 
    435     foreach (@{ $fchoice || []}) { 
    436         $_ or next; 
    437         my $chkey = $self->find_choice_key($_); 
    438         $addbc->execute($uid, $_, $chkey ? 't' : 'f') or do { 
    439             $self->rollback; 
    440             return; 
    441         }; 
    442     } 
    443  
    444     $uid; 
    445 } 
    446  
    447 sub _register_ballot_crypted { 
    448     my ($self, $choice, $fchoice) = @_; 
    449     my $xml = XML::Simple->new(ForceArray => 1, RootName => 'ballot'); 
    450     my $symkey = map{ chr(rand(256)) } (1 .. (256 / 8)); 
    451     my $cipher = new Crypt::CBC($symkey, 'DES'); 
    452     my $ballotuid = Vote::DB::common::gen_uid(); 
    453     my $encryptedballot = $cipher->encrypt_hex( 
    454         $xml->XMLout({ 
    455             id => $ballotuid, 
    456             sbal => $choice, 
    457             fsbal => $fchoice 
    458         }) 
    459     ); 
    460     my $encsymkey = $self->rsa->encrypt ( 
    461         Message    => $symkey, 
    462         Key        => $self->public_key, 
    463         Armour     => 1, 
    464     ) || die $self->rsa->errstr(); 
    465  
    466     my $addenc = $self->db->prepare_cached( 
    467         q{insert into ballot_enc (id, data, enckey, poll) values (?,?,?,?)} 
    468     ); 
    469  
    470     my $uid = Vote::DB::common::gen_uid(); 
    471     $addenc->execute($uid, $encryptedballot, $encsymkey, $self->voteid); 
    472     $ballotuid; 
    473 } 
    474  
    475 sub _decrypted_ballot { 
    476     my ($self, $ballotid, $privkey) = @_; 
    477     my $sth = $self->db->prepare_cached( 
    478         q{select * from ballot_enc where id = ? for update} 
    479     ); 
    480     $sth->execute($ballotid); 
    481     my $ballot = $sth->fetchrow_hashref; 
    482     $sth->finish; 
    483     my $encsymkey = $ballot->{enckey}; 
    484     my $data = $ballot->{data}; 
    485     my $symkey = $self->rsa->decrypt ( 
    486         Cyphertext => $encsymkey, 
    487         Key        => $privkey, 
    488         Armour     => 1, 
    489     ) || die $self->rsa->errstr(); 
    490     my $cipher = new Crypt::CBC($symkey, 'DES'); 
    491     my $xmldata = XMLin($cipher->decrypt_hex($data), ForceArray => 1); 
    492     $self->_register_ballot_clear($xmldata->{sbal}, $xmldata->{fsbal}, $xmldata->{id}); 
    493     my $upd = $self->db->prepare_cached(q{update ballot_enc set decrypted = true where id = ?}); 
    494     if ($upd->execute($ballotid)) { 
    495         $self->commit; 
    496         return; 
    497     } else { 
    498         $self->rollback; 
    499         return 1; 
    500     } 
    501 }     
    502  
    503 sub decrypted_ballots { 
    504     my ($self, $password) = @_; 
    505     my $privkey = $self->private_key($password); 
    506     foreach ($self->list_ballot_need_dec) { 
    507         $self->_decrypted_ballot($_, $privkey); 
    508     } 
    509 } 
    510  
    511 sub register_ballot { 
    512     my ($self, $vmail, $choice, $fchoice, $referal) = @_; 
    513  
    514     my $uid; 
    515     for (0..2) { # 3 try 
    516     # First we register voting has voted 
    517     $self->_register_signing($vmail, $referal) or return; # TODO error ? 
    518  
    519     # registring choices 
    520     $uid = $self->_register_ballot($choice, $fchoice); 
    521     defined($uid) and last; 
    522  
    523     } 
    524406    # everything went fine, saving! 
    525407    $self->commit; 
    526408 
    527     $uid 
     409    $bdata->uid 
    528410} 
    529411 
     
    589471 
    590472    return 1; 
     473} 
     474 
     475sub bdata { 
     476    my ($self) = @_; 
     477    Vote::DB::Poll::Bdata->new($self->{dbstring}, $self); 
    591478} 
    592479 
Note: See TracChangeset for help on using the changeset viewer.