たろマーク (はてなブックマーク)
-
[ django ] view を class based で書けるようになってた。
- Colorful Bokeh Effect in Pixelmator | Abduzeedo | Graphic Design Inspiration and Photoshop Tutorials
[ pixelmator ] -
[ pixelmator ]
■ DBIC の Component を書いてみる。
WEB+DB PRESS の id:naoya さんの連載(Vol35, Vol36)を読んだり YAPC::ASIA 2007 での id:nekokak さん(資料)、id:tokuhirom さん(資料)の講演を拝聴したりして、最近はちょこちょこと DBIx::Class を使い始めてます。
んで、理解を進めるために自分で Component を書いてみました。Crypt::OpenPGP を使って、DB に突っ込むときに暗号化、取り出すときに復号化する Component です。
package DBIx::Class::OpenPGPColumns;
use strict;
use warnings;
use base 'DBIx::Class';
use Crypt::OpenPGP;
__PACKAGE__->mk_classdata( '_openpgp_columns' );
__PACKAGE__->mk_classdata( 'recipients' );
__PACKAGE__->mk_classdata( armour => 1 );
__PACKAGE__->mk_classdata( 'passphrase' );
=head2 openpgp
=cut
sub openpgp {
my $self = shift;
$self->{_openpgp} ||= Crypt::OpenPGP->new;
$self->{_openpgp};
}
sub openpgp_columns {
my $self = shift;
if (@_) {
foreach my $col (@_) {
$self->throw_exception("column $col doesn't exist")
unless $self->has_column($col);
}
return $self->_openpgp_columns({ map { $_ => 1 } @_ });
}
else {
return $self->_openpgp_columns;
}
}
sub get_column {
my ( $self, $column ) = @_;
my $value = $self->next::method($column);
my $cols = $self->_openpgp_columns;
if ( $cols and defined $value and $cols->{$column}) {
$value = $self->openpgp->decrypt(
Data => $value,
Passphrase => $self->passphrase,
);
}
$value;
}
sub store_column {
my ( $self, $column, $value ) = @_;
my $cols = $self->_openpgp_columns;
if ( $cols and defined $value and $cols->{$column}) {
$value = $self->openpgp->encrypt(
Data => $value,
Recipients => $self->recipients,
Armour => $self->armour,
);
}
$self->next::method( $column, $value );
}
1;
使うときは他の Component と同じように呼び出します。
package MyApp::Schema;
use strict;
use warnings;
use base qw/DBIx::Class::Schema::Loader/;
__PACKAGE__->loader_options(
debug => 0,
components => [qw(
OpenPGPColumns
)],
);
1;
んで、各テーブルクラスで recipient, passphrase, openpgp_columns をセットします。
package MyApp::Schema::User;
use strict;
use warnings;
__PACKAGE__->recipients('key id');
__PACKAGE__->passphrase('pass phrase');
__PACKAGE__->openpgp_columns(qw/secret/);
1;
これで create / update するときは暗号化されて、取り出すときは復号化されるようになりました。





