Changeset 173
- Timestamp:
- 04/08/09 03:02:39 (15 years ago)
- Location:
- trunk
- Files:
-
- 1 added
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/lib/Vote/Controller/Admin.pm
r172 r173 177 177 } 178 178 179 sub dec: LocalRegex('^(\d+)/dec$') {180 my ($self, $c, $id, @sub) = @_;181 ($c->stash->{voteid}) = @{ $c->req->snippets || [] };182 my $vote = $c->model('Vote');183 184 $vote->vote_info($id) or do {185 $c->res->redirect($c->uri_for('/'));186 return;187 };188 189 $c->forward('auth') or return;190 $c->stash->{page}{title} = $c->model('Vote')->vote_info(191 $c->stash->{voteid}192 )->{label} . ': Administration, bulletin';193 $c->model('Vote')->poll($c->stash->{voteid})->decrypted_ballots;194 }195 196 179 =head1 AUTHOR 197 180 -
trunk/lib/Vote/Controller/Newpoll.pm
r172 r173 57 57 if ($c->req->param('passwd')) { 58 58 my $pid = $c->model('Vote')->poll_from_request($id, $c->req->param('passwd')); 59 $c->session->{vpassword} = $c->req->param('passwd'); # avoid auth on admin page60 59 $c->res->redirect($c->uri_for('/admin', $pid)); 61 60 } -
trunk/lib/Vote/DB.pm
r172 r173 334 334 $newpoll->execute($newpollid, $rinfo->{label}, $rinfo->{mail}, $encpasswd); 335 335 # set some default 336 $self-> poll($newpollid)->setup() or do {337 $self->db->rollback;338 return;339 };336 $self->vote_param($newpollid, 337 free_choice => 0, 338 choice_count => 1, 339 ); 340 340 341 341 my $delreq = $self->db->prepare_cached( -
trunk/lib/Vote/DB/Poll.pm
r172 r173 8 8 use Mail::Mailer; 9 9 use Crypt::RSA; 10 use Crypt::RSA::Key::Public::SSH;11 use Crypt::RSA::Key::Private::SSH;12 10 use Crypt::CBC; 13 11 use XML::Simple; … … 39 37 40 38 sub voteid { $_[0]->{voteid} } 41 42 sub setup {43 my ($self) = @_;44 $self->param(45 free_choice => 0,46 choice_count => 1,47 );48 }49 39 50 40 sub param { … … 304 294 my ($self, $choice, $fchoice) = @_; 305 295 306 my $uid = ($self->is_crypted307 ? $self->_register_ballot_crypted($choice, $fchoice)308 : $self->_register_ballot_clear($choice, $fchoice))309 or do {310 self->db->rollback;311 return;312 };313 314 $uid315 }316 317 sub _register_ballot_clear {318 my ($self, $choice, $fchoice, $uid) = @_;319 320 296 my $addb = $self->db->prepare_cached( 321 297 q{ … … 323 299 } 324 300 ); 325 $uid ||= Vote::DB::common::gen_uid();301 my $uid = Vote::DB::common::gen_uid(); 326 302 $addb->execute($uid, $self->voteid, scalar(@{$fchoice || []}) ? undef : 'f') or do { 327 303 self->db->rollback; … … 360 336 361 337 $uid; 362 }363 364 sub _register_ballot_crypted {365 my ($self, $choice, $fchoice) = @_;366 my $xml = XML::Simple->new(ForceArray => 1, RootName => 'ballot');367 my $symkey = map{ chr(rand(256)) } (1 .. (256 / 8));368 my $cipher = new Crypt::CBC($symkey, 'DES');369 my $ballotuid = Vote::DB::common::gen_uid();370 my $encryptedballot = $cipher->encrypt_hex(371 $xml->XMLout({372 id => $ballotuid,373 sbal => $choice,374 fsbal => $fchoice375 })376 );377 my $encsymkey = $self->rsa->encrypt (378 Message => $symkey,379 Key => $self->public_key,380 Armour => 1,381 ) || die $self->rsa->errstr();382 383 my $addenc = $self->db->prepare_cached(384 q{insert into ballot_enc (id, data, enckey, poll) values (?,?,?,?)}385 );386 387 my $uid = Vote::DB::common::gen_uid();388 $addenc->execute($uid, $encryptedballot, $encsymkey, $self->voteid);389 $ballotuid;390 }391 392 sub _decrypted_ballot {393 my ($self, $ballotid, $privkey) = @_;394 my $sth = $self->db->prepare_cached(395 q{select * from ballot_enc where id = ? for update}396 );397 $sth->execute($ballotid);398 my $ballot = $sth->fetchrow_hashref;399 $sth->finish;400 my $encsymkey = $ballot->{enckey};401 my $data = $ballot->{data};402 my $symkey = $self->rsa->decrypt (403 Cyphertext => $encsymkey,404 Key => $privkey,405 Armour => 1,406 ) || die $self->rsa->errstr();407 my $cipher = new Crypt::CBC($symkey, 'DES');408 my $xmldata = XMLin($cipher->decrypt_hex($data), ForceArray => 1);409 $self->_register_ballot_clear($xmldata->{sbal}, $xmldata->{fsbal}, $xmldata->{id});410 my $upd = $self->db->prepare_cached(q{update ballot_enc set decrypted = true where id = ?});411 if ($upd->execute($ballotid)) {412 $self->db->commit;413 return;414 } else {415 $self->db->rollback;416 return 1;417 }418 }419 420 sub decrypted_ballots {421 my ($self, $password) = @_;422 my $privkey = $self->private_key($password);423 foreach ($self->list_ballot_need_dec) {424 $self->_decrypted_ballot($_, $privkey);425 }426 338 } 427 339 … … 510 422 } 511 423 512 sub is_crypted {513 my ($self) = @_;514 return $self->info->{public_key} ? 1 : 0;515 }516 517 424 sub ballot_count { 518 425 my ($self) = @_; 519 return $self->is_crypted 520 ? $self->ballot_count_crypt 521 : $self->ballot_count_clear; 522 } 523 524 sub ballot_count_clear { 525 my ($self) = @_; 526 527 my $sth = $self->db->prepare_cached( 528 q{select count(*) from ballot where poll = ?} 529 ); 530 531 $sth->execute($self->voteid); 532 my $res = $sth->fetchrow_hashref; 533 $sth->finish; 534 $res->{count} 535 } 536 537 sub ballot_count_crypt { 538 my ($self) = @_; 539 540 my $sth = $self->db->prepare_cached( 541 q{select count(*) from ballot_enc where poll = ?} 426 427 my $sth = $self->db->prepare_cached( 428 q{ 429 select count(*) from ballot where poll = ? 430 } 542 431 ); 543 432 … … 676 565 q{ 677 566 select id from ballot where poll = ? 678 order by id679 }680 );681 $sth->execute($self->voteid);682 my @ids;683 while (my $res = $sth->fetchrow_hashref) {684 push(@ids, $res->{id});685 }686 @ids687 }688 689 sub list_ballot_enc {690 my ($self) = @_;691 692 my $sth = $self->db->prepare_cached(693 q{694 select id from ballot_enc where poll = ?695 order by id696 }697 );698 $sth->execute($self->voteid);699 my @ids;700 while (my $res = $sth->fetchrow_hashref) {701 push(@ids, $res->{id});702 }703 @ids704 }705 706 sub list_ballot_need_dec {707 my ($self) = @_;708 709 my $sth = $self->db->prepare_cached(710 q{711 select id from ballot_enc where poll = ? and decrypted = 'false'712 567 order by id 713 568 } … … 860 715 861 716 sub gen_poll_keys { 862 my ($self , $password) = @_;717 my ($self) = @_; 863 718 my ($public, $private) = $self->rsa->keygen ( 864 719 Identity => 'Epoll Vote ' . $self->voteid, 865 720 Size => 768, 866 Password => $password,721 Password => undef, 867 722 Verbosity => 0, 868 723 KF=>'SSH', … … 877 732 my ($self) = @_; 878 733 my $serialize = $self->info->{public_key} or return; 879 my $pubkey = Crypt::RSA::Key::Public::SSH->new; 880 $pubkey->deserialize(String => [ $serialize ]); 734 my $pubkey = Crypt::RSA::Key::Public->new; 735 $pubkey->deserialize($serialize); 736 881 737 $pubkey 882 738 } 883 739 884 sub private_key {885 my ($self, $password) = @_;886 my $serialize = $self->info->{private_key} or return;887 my $privkey = Crypt::RSA::Key::Private::SSH->new;888 $privkey->deserialize(String => [ decode_base64($serialize) ], Passphrase => $password);889 $privkey890 }891 740 =head1 AUTHOR 892 741 -
trunk/root/templates/admin/default.tt
r172 r173 8 8 [% IF vote.vote_status(voteid) == 'BEFORE' %] 9 9 <table border="1"> 10 <tr><th>Vote</th><th> </th></tr>10 <tr><th>Vote</th><th>Possibilité de vote</th></tr> 11 11 <tr> 12 12 <td valign="TOP"> … … 49 49 </td> 50 50 <td valign="TOP"> 51 [% IF ! vote.vote_choices(voteid).size %] 52 <p class="alert">Aucun choix configuré</p> 53 [% ELSE %] 54 [% FOREACH choice = vote.vote_choices(voteid) %] 55 <form action="[% c.uri_for(voteid) %]" method="POST"> 56 [% loop.count %] - [% vote.choice_info(choice).label | html %] 57 <input type="hidden" name="delch" value="[% vote.choice_info(choice).key %]"> 58 <input type="submit" name="del" value="Effacer"> 59 </form> 60 <br> 61 [% END %] 62 [% END %] 63 <form action="[% c.uri_for(voteid) %]" method="POST"> 64 Ajouter un choix:<br> 65 <input type="text" name="addch"> 66 <input type="submit" value="Ajouter"> 67 </form> 51 68 </td> 52 69 </tr>
Note: See TracChangeset
for help on using the changeset viewer.