Changeset 219 for trunk/lib/Vote/DB/Poll.pm
- Timestamp:
- 04/19/09 20:06:03 (15 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/lib/Vote/DB/Poll.pm
r217 r219 9 9 use Crypt::RSA::Key::Public::SSH; 10 10 use Crypt::RSA::Key::Private::SSH; 11 use Crypt::CBC;12 use XML::Simple;13 11 use MIME::Base64; 14 12 use Vote::DB::Ballot; 15 13 use Vote::DB::Voting; 16 14 use Vote::DB::Choice; 15 use Vote::DB::Poll::Bdata; 17 16 18 17 =head1 NAME … … 371 370 } 372 371 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 { 372 sub 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 384 sub 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 394 sub 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 { 397 402 $self->rollback; 398 403 return; 399 404 }; 400 405 401 $self->_register_ballot_items($uid, $choice, $fchoice) or do {402 $self->rollback;403 return;404 };405 406 $uid407 }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 => $fchoice458 })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 try516 # First we register voting has voted517 $self->_register_signing($vmail, $referal) or return; # TODO error ?518 519 # registring choices520 $uid = $self->_register_ballot($choice, $fchoice);521 defined($uid) and last;522 523 }524 406 # everything went fine, saving! 525 407 $self->commit; 526 408 527 $ uid409 $bdata->uid 528 410 } 529 411 … … 589 471 590 472 return 1; 473 } 474 475 sub bdata { 476 my ($self) = @_; 477 Vote::DB::Poll::Bdata->new($self->{dbstring}, $self); 591 478 } 592 479
Note: See TracChangeset
for help on using the changeset viewer.