ダメでしょ!

プログラミングとか怒られた話とか…

Perl でパスワードZipを求められた際の対応方法

前提

Perl は初めて触りました。
対応を求められたサーバの環境は古いです。

$ perl -v
This is perl, v5.10.1 (*) built for x86_64-linux-thread-multi

QBK (急にボールが来たので)

他にヘルプできそうな人間がいなかったということで、触ったことのない Perlソースコード修正を求められました。

内容は、Webフォームに添付されたデータをメールで送信するシステムの添付ファイルをパスワードZipで圧縮すること。

Perl 触ったこともないので、極力他に影響を与えたくない一心で対応しました。
調べてみると、Perl の標準モジュールに「Archive::Zip」というものがあるのですが、これはパスワードZipに対応していませんでした。。。
どうしようかなー、と悩んだのですが、Perl からコマンドが呼び出せるらしいので、コマンドでパスワードZipを作成し、それを添付することにしました。
ということで対応したコードが以下。

#-----------------------------------------------------------
#  パスワードzip生成
#  引数: ファイル名
#  備考: $cf{upldir} には、ファイルの保管場所ディレクトリパスが入っている
#-----------------------------------------------------------
sub zip {
    my $ZIP_CMD = "/usr/bin/zip";
    my $ZIP_PASSWD = "************";
    
    my ($origin_name) = @_;
    my $zip_name = "$origin_name.zip";

    my $cmd = "$ZIP_CMD -jP $ZIP_PASSWD $cf{upldir}/$zip_name $cf{upldir}/$origin_name"; # パスワードzipの生成コマンド
    system($cmd); # コマンドの実行
}

で、これをメール送信処理中の添付ファイルをセットする前に

&zip($fname); # $fname には対象となるファイル名が格納されている

と呼び出して、生成したファイルを添付することで対応しました。

今回はパスワード自体をランダム化する必要が無いという要件だったので、ソースコード内にパスワードを埋め込んでいますが、あまりよろしくないという認識はあります。
また、system関数は便利な半面、セキュリティリスクになりそうなので、使い所を見極めて使う必要がありますね。

初めて Perl に触りましたが、デバッグ方法もよくわからないし、辛かった。。。