過去の投稿日別表示

[ リスト | 詳細 ]

全1ページ

[1]

ID_Pass_seed.pmとID_Pass.pm

package ID_Pass_seed;
use strict;
require Exporter;
our @ISA = qw(Exporter);

our @EXPORT_OK = qw (
$crypt_key
%Item_Names
);

our $crypt_key = 'opensesami';#ID Managerで作ったランダムな文字列を使うと良い
our %Item_Names = ();

my @Item_Names = ( #perl script中で使うものだけ列挙する
'Yahoo',
'NiftyMail',
'平塚図書館',
);

for my $name (@Item_Names) {
$Item_Names{$name}++;
}

1;


package ID_Pass;
use strict;
use XML::Simple;
use Data::Dumper;
use Encode qw (from_to);
use Archive::Zip qw( :ERROR_CODES );
use ID_Pass_seed qw (
$crypt_key
%Item_Names
);
use Crypt::CBCeasy;

my $DEBUG;# = 1;
my $tmp = './';
my $idpass = 'idpass.dmp';

sub new {
my $pkg = shift;
my %arg = @_;
my $self = {};
bless $self, $pkg;

my $xml = $self->{xml} = $arg{xml};
my $zip = $self->{zip} = $arg{zip};
$self->{tmp} = $tmp.$idpass;

if ($zip && -e $zip && $xml && -e $xml) {
if ((stat $zip)[9] <= (stat $xml)[9]) {
unlink $zip;
} else {
unlink $xml;
}
}
if ($zip && -e $zip) {
my $info = $self->get_zip_info();
$self->{info} = $info;
}
elsif ($xml && -e $xml) {
my $info = $self->get_xml_info();
$self->{info} = $info;
#print Dumper $self;exit;
if ($zip) {
$self->create_zip();
unlink $xml;
}
}
$self;
}

sub url {
my $this = shift;
my $name = shift;
my $r = $this->{info}->{$name}->{url};
}

sub account {
my $this = shift;
my $name = shift;
my $r = $this->{info}->{$name}->{account};
}

sub password {
my $this = shift;
my $name = shift;
my $r = $this->{info}->{$name}->{password};
}


sub get_xml_info {
my $this = shift;
undef $/;
open my $fh, $this->{xml};
my $xml = <$fh>;
close $fh;

$xml =~ s/shift[-_]jis/UTF-8/;
from_to($xml, 'cp932', 'utf8');
utf8::encode($xml);

my $xml_lib = XMLin(
$xml,
KeyAttr => {},
ForceArray => [ 'item' ],
ContentKey => '-content'
);
$Data::Dumper::Terse = 1;
my $dump = Dumper $xml_lib;
$Data::Dumper::Terse = 0;
utf8::decode($dump);
from_to($dump, 'utf8', 'cp932');
#print $dump,"\n";

$xml_lib = eval $dump;
my $info = {};
my $folders = $xml_lib->{folder};
for my $folder (@$folders) {
my $items = $folder->{item};
for my $item (@$items) {
my $item_name = $item->{name};
next unless $Item_Names{$item_name};
$info->{$item_name} = {
url => $item->{url},
account => $item->{account}->{content},
password => $item->{password}->{content},
};
}
}
#print Dumper $info,"\n";
$info;
}


sub create_zip {
my $this = shift;
$Data::Dumper::Terse = 1;
my $info_dump = Dumper $this->{info};
$Data::Dumper::Terse = 0;
open my $fh, '>'.$this->{tmp};
if ($DEBUG) {
print $fh $info_dump;
} else {
IDEA::encipher( $crypt_key, $info_dump, $fh);
}
close $fh;
my $zip = Archive::Zip->new();
$zip->addFile($this->{tmp});
$zip->writeToFileNamed($this->{zip});
unlink $this->{tmp};
}

sub get_zip_info {
my $this = shift;
my $zip = Archive::Zip->new();
die 'Archive File Read Error' unless $zip->read($this->{zip}) == AZ_OK;
$zip->extractMember($idpass, $this->{tmp});
my $info_dump;
open my $fh, $this->{tmp};
if ($DEBUG) {
undef $/;
$info_dump = <$fh>;
} else {
$info_dump = IDEA::decipher( $crypt_key, $fh);
}
close $fh;
unlink $this->{tmp};
$this->{info} = eval $info_dump;
}

1;

開く コメント(0)

 現在passwordを管理するためにID Managerを使用している。これは素晴らしいソフトではあるが、これで管理しているpasswordをperlスクリプト中で使用したい!という要求が出てきた。例えば、私が良く使っている図書館から借りている本の返却期限や予約している本のリストを調べて自分宛にメールするscriptを書きたいというものだ。

そこで、perlスクリプト中で使用するpasswordを管理するperl moduleを書いた。これはセキュリティ的に決して誉められたことではないが利便とリスクを秤にかけると「perl scriptの中で使う」が勝ってしまうので仕方ない。

以下はサンプルとモジュール。ID_Pass_seed.pmの中は必要に応じて書き換える。ID managerのpasswordのデータをID_Pass_seed.pmの中で指定したディレクトリと名前に指定したxmlファイルに書き出した後scriptを動かせばよい。また、当たり前ではあるが書き出したpasswordは頻繁に替える必要がある。

モジュール中には明示していないが、Crypt-IDEAモジュールをインストールする必要がある。
文字数制限に引っかかるため、ID_Pass_seed.pmとID_Pass.pmは別エントリに書く。

use strict;
use ID_Pass;
use Data::Dumper;

my $DIR = 'C:/'; #適当なディレクトリを指定すること
my $xml = $DIR.'ABC1234.xml'; #ID Managerから書き出すxmlファイル名
my $zip = $DIR.'XYZ7890.zip'; #暗号化圧縮するzipファイル名

if (-e $zip) {
my $mtime = (stat $zip)[9];
my ($sec, $min, $hour, $day, $month, $year) = localtime($mtime);
printf("最終更新日時は'%04d/%02d/%02d %02d:%02d:%02d'です。\n", $year + 1900, $month + 1, $day, $hour, $min, $sec);

}
my $id_key = ID_Pass->new(
xml => $xml,
zip => $zip,
);

print Dumper $id_key;

my $name = '平塚図書館';
my $url = $id_key->url($name);
my $account = $id_key->account($name);
my $password = $id_key->password($name);
print $name,"\n";
print $url,"\n";
print $account,"\n";
print $password,"\n";

my $name = 'NiftyMail';
my $url = $id_key->url($name);
my $account = $id_key->account($name);
my $password = $id_key->password($name);
print $name,"\n";
print $url,"\n";
print $account,"\n";
print $password,"\n";
__END__

開く コメント(0)

開く トラックバック(1)

全1ページ

[1]


.


プライバシー -  利用規約 -  メディアステートメント -  ガイドライン -  順守事項 -  ご意見・ご要望 -  ヘルプ・お問い合わせ

Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved.

みんなの更新記事