|
2種類の対策をしてみました。
まず、「パスワード」って単語を含む日本語の文字列だけの行があって、その次の
何らかの文字列を含む行にパスワードらしき物があったらそれを拾うようにしてみま
した。
さらに、パスワードを範囲選択して実行したら、その範囲選択文字列をパスワード
として使って解凍するようにしてみました。
マクロの中身を以下のようにしてテストしてみてほしいです。
//暗号化Zipの自動解凍 PasswordZipExtract.mac
// 2019.02.12
// 2019.03.07 Version 1.1 パスワードの形式追加。
// 2019.03.12 Version 1.2 パスワードの形式さらに追加。
// 2021.04.26 Version 1.3
// 7-Zipの代わりにunzip.exeでも解凍できるようにした。
// パスワードの形式にもっといろいろ追加。&、複数候補あった場合は
メニュー表示するようにした。
// 2021.05.10 Version 1.4 さらに形式追加。11〜12
// unzip.exeまたは7zip.exeの終了コードを見て、成功してる場合は結
果表示しないようにした。
// 2021.05.11 Version 1.5 PasswordZipTempフォルダにサブフォルダのゴミが残る
バグ修正。
// 2021.05.13 Version 1.6 メール本文にユニコード文字(Shift-JIS範囲外の文
字)があるとパスワードがおかしくなるバグ修正。
// 2021.05.18 Version 1.7 パスワードの中に「%」があると失敗するバグ修正。
// 2021.06.04 Version 1.8 新しいパスワード形式対応。
// 2022.06.06 Version 1.9 固定の形式になってない所からなんとかパスワードを
抽出する対応。
// パスワードを範囲選択してから実行してもいいように
する。
//
// by 秀まるお
// hidesoft.8:04704| 暗号化zip自動解凍マクロ
//
//
//説明:
// このマクロはパスワード付きzipの添付ファイルを簡単に解凍する用のマクロです。
// パスワード付きzipの添付ファイル入りメールは、そのメールとは別便でパスワード
// を通知してきます。このマクロはその別便メールの中からパスワードを取り出して、
// 自動で解凍します。
//
// マクロを実行する前に、zip添付ファイル付きのメールとパスワード通知メールの
// 2通を選択して実行する必要があります。
//解凍したファイルは「ドキュメント」フォルダ配下のPasswordZipTempフォルダに
// 作成されます。古いファイルが残ってる場合はマクロ実行のタイミングで削除され
// てから解凍されます。
//
// unzip.exeのダウンロード場所: http://gnuwin32.sourceforge.net/packages/unzip.htm
// 7-Zipのダウンロード場所: https://sevenzip.osdn.jp/
loaddll "tkinfo.dll";
// 秀丸メールの検索パック復元予約
#n = dllfunc("AutoRestoreFindPack");
// 秀丸エディタの検索条件復元予約
setcompatiblemode 0x00020000;
#n = dllfunc("SetJapaneseCodePageMode", 1);
#n = dllfunc("SelectedMailCount");
if( #n != 2 ) {
message "このマクロは暗号化zip付きメールと、その解凍用パスワード通知
メールの2通を選択した状態で実行してください。";
endmacro;
}
$selectedtext = "";
if( selecting ) {
$selectedtext = gettext( seltopx, seltopy, selendx, selendy, 1 );
}
//対象のzipとパスワードを取り出す。
$zipfile = "";
$password = "";
#n = dllfunc("LockSelection");
while(1) {
#n = dllfunc("EnumSelection", 1);
if( #n == 0 ) {
break;
}
#foundzip = 0;
if( $zipfile == "" ) {
#count = dllfunc("CountCurrentHeader", "X-Attach");
if( #count != 0 ) {
#i = 0;
while( #i < #count ) {
$attach = dllfuncstr("CurrentHeader2", "X-Attach", #i);
$ext = dllfuncstr("ToLower", rightstr( $attach, 4 ) );
if( $ext == ".zip" ) {
$zipfile = dllfuncstr("HomeDir") + dllfuncstr("Curre
ntAccount") + "\\" + $attach;
#foundzip = 1;
break;
}
#i = #i + 1;
}
}
}
if( $password == "" && #foundzip == 0 ) {
$text = gettext( 0, 0, 999, linecount ); //メール本文全部
loaddll "HmJre.dll";
#n = dllfunc("SetUnicodeIndexAutoConvert", 1); //V1.6 バグ修正
$text = dllfuncstr("ReplaceRegularNoCaseSense", "[\\r\\n]+", $te
xt, 0, " ", 2);
//改行を空白に変換しておく。
$text = dllfuncstr("ReplaceRegularNoCaseSense", " +", $text, 0,
" ", 2);
//全角空白を半角空白に変換しておく。
$text = $text + " "; //末端に空白を付けておく。
$pattern[0] = " 【パスワード】 *[::]? *([^ \x81\x40-\xFC\xFF]
+?) ";
$pattern[1] = " 解凍パスワード *[::]? *([^ \x81\x40-\xFC\xFF]
+?) ";
$pattern[2] = " Password *: *([^ \x81\x40-\xFC\xFF]+?) ";
$pattern[3] = " \\[パスワード/Password\\] *([^ \x81\x40-\xFC\xF
F]+?) ";
$pattern[4] = " 【暗号化パスワード\\(password\\)】 *([^ \x81\x40
-\xFC\xFF]+?) ";
$pattern[5] = " パスワードは「([^ \x81\x40-\xFC\xFF]+?)」";
$pattern[6] = " 解凍パスワード +([^ \x81\x40-\xFC\xFF]+?) ";
$pattern[7] = " パスワード *[::] *([^ \x81\x40-\xFC\xFF]+?) ";
$pattern[8] = " 添付ファイルパスワード *[::]? *([^ \x81\x40-\xF
C\xFF]+?) ";
$pattern[9] = " \\[(?:パスワード|Password)\\] *([^ \x81\x40-\xFC
\xFF]+?) ";
$pattern[10] = " パスワード *\\(Password\\) *[::]? *([^ \x81\x4
0-\xFC\xFF]+?) ";
$pattern[11] = " \\[password information\\] *([^ \x81\x40-\xFC\x
FF]+?) ";
$pattern[12] = " パスワード[ ]*([0-9]+桁) *[::]? *([^ \x81\
x40-\xFC\xFF]+?) ";
$pattern[13] = " パスワード[ ]*\\([0-9]+桁\\) *[::]? *([^ \x8
1\x40-\xFC\xFF]+?) ";
$pattern[14] = " PASSWORD for .{1,255} is below: +([^ \x81\x40-\
xFC\xFF]+?) ";
$pattern[15] = "^[\x81\x40-\xFC\xFF]+パスワード[\x81\x40-\xFC\xF
F]+\n+([^\x81\x40-\xFC\xFF\n]{5,16})"; //V1.9
#iPattern = 0;
#cPassword = 0;
while(1) {
$pattern = $pattern[#iPattern];
if( $pattern == "" ) {
break;
}
//2021.04.28 新しい方式
#x = 0;
while(1) {
#x = dllfunc("FindRegularNoCaseSense", $pattern, $text,
#x );
if( #x >= 0 ) {
Label_EnterHit: ;
$hit = midstr( $text, #x, dllfunc("GetLastMatchLengt
h") );
#tag1 = dllfunc("GetLastMatchTagPosition", 1);
#tag1len = dllfunc("GetLastMatchTagLength", 1);
$pass = midstr( $text, #tag1, #tag1len );
//message $hit + "\n" + $pass;
if( strlen($pass) >= 4 ) { //4文字以上でないと
ダメ。
//同じパスワードがあれば追加しない。
#iFindPass = 0;
while( #iFindPass < #cPassword ) {
if( $password[#iFindPass+1] == $pass ) {
//スキップ
goto Label_SkipAddPass;
}
#iFindPass = #iFindPass + 1;
}
$password[#cPassword+1] = $pass; //注意:
+1した所にセットする。
$whole[#cPassword+1] = $hit + "\t" + $pass;
//注意: +1した所にセットする。
#cPassword = #cPassword + 1;
Label_SkipAddPass:
}
#x = #x + 1;
} else {
break;
}
}
#iPattern = #iPattern + 1;
}
loaddll "tkinfo.dll"; //元に戻す。
}
}
#n = dllfunc("UnlockSelection", 1);
if( $zipfile == "" ) {
message "zip形式ファイルが見つかりませんでした。";
endmacro;
}
if( #cPassword == 0 ) {
//V1.9 別パターン。
// 日本語で「パスワード」を含む文章があって、その次の行にパス
ワードらしき文字列があったらそれを使う。
//
$text = gettext( 0, 0, 999, linecount ); //メール本文全部
loaddll "HmJre.dll";
$text = dllfuncstr("ReplaceRegularNoCaseSense", "[\\r\\n]+", $text,
0, "\n", 2);
$pattern = "\n[\x81\x40-\xFC\xFF]*パスワード[\x81\x40-\xFC\xFF]+\n
([^\x81\x40-\xFC\xFF \n]{5,20})"; //V1.9
#n = dllfunc("SetUnicodeIndexAutoConvert", 1); //V1.6 バグ修正
#x = dllfunc("FindRegularNoCaseSense", $pattern, $text, 0 );
if( #x >= 0 ) {
#ConfirmPassword = 1; //パスワードが合ってるかどうかメッ
セージ表示する。
goto Label_EnterHit;
}
loaddll "tkinfo.dll"; //元に戻す。
if( $selectedtext != "" ) {
$password[1] = $selectedtext;
#cPassword = 1;
#ConfirmPassword = 1;
} else {
message "パスワードが見つかりませんでした。メールを2通選択して、
さらにパスワードの文字列をメール内容枠中で選択してからマクロ実行すれば、その
文字列をパスワードとして解凍します。";
endmacro;
}
}
if( #cPassword > 1 ) {
$whole[0] = "パスワードの候補が複数見つかりました。どれを使うか選択
してください。";
menuarray $whole, #cPassword + 1;
if( result <= 1 ) {
message "メールを2通選択して、さらにパスワードの文字列をメール
内容枠中で選択してからマクロ実行すれば、その文字列をパスワードとして解凍しま
す。";
endmacro;
}
$password = $password[result-1]; //result == 1の時に$password
[1]を選択する。
} else {
$password = $password[1];
if( #ConfirmPassword == 1 ) {
question "パスワードは「" + $password + "」でいいですか?";
if( result != yes ) {
message "メールを2通選択して、さらにパスワードの文字列を
メール内容枠中で選択してからマクロ実行すれば、その文字列をパスワードとして解
凍します。";
endmacro;
}
}
}
Label_PasswordDetermined: ;
if( strstr( $password, "\"" ) >= 0 ) {
message "パスワードの中にダブルクォーテーションの文字が含まれてます。
このマクロではダブルクォーテーション入りのパスワードで解凍することは出来ませ
ん。手作業で解凍お願いします。";
endmacro;
}
//2021.04.26 unzip.exeがあればそっちを使う。
// http://gnuwin32.sourceforge.net/packages/unzip.htm
//
$unzip = "C:\\Program Files\\GnuWin32\\bin\\unzip.exe";
if( ! existfile( $unzip ) ) {
$unzip = "C:\\Program Files (x86)\\GnuWin32\\bin\\unzip.exe";
if( ! existfile( $unzip ) ) {
$unzip = "";
}
}
if( $unzip == "" ) {
$7zip = "C:\\Program files\\7-Zip\\7z.exe";
if( ! existfile( $7zip ) ) {
$7zip = "C:\\Program files (x86)\\7-Zip\\7z.exe";
if( ! existfile( $7zip ) ) {
message "7-Zipのプログラム用ファイルが見つかりません。7-Zip
をインストールしてください。\n\n" +
"7-Zipは、C:\\Program files\\7-Zip またはC:\\Program
files (x86)\\7-Zip にインストールされてる必要があります。";
endmacro;
}
}
}
openreg "CURRENTUSER","Software\\Microsoft\\Windows\\CurrentVersion\\Exp
lorer\\Shell Folders";
$outfolder = getregstr("Personal");
closereg;
$outfolder = $outfolder + "\\PasswordZipTemp";
#fsobj = createobject("Scripting.FileSystemObject");
#folderobj = callmethod_returnobj(#fsobj, "GetFolder", $outfolder + "\\");
if( #folderobj != 0 ) {
#subfolderobj = getpropobj(#folderobj, "SubFolders");
if( #subfolderobj != 0 ) {
#onefolder = getcollection(#subfolderobj, 2);
while(1) {
#onefolder = getcollection(#subfolderobj);
if( #onefolder == 0 ) {
break;
}
$subfolder = member(#onefolder, "Name");
$path = $outfolder + "\\" + $subfolder;
//テストmessage $path;
runsync2 "cmd.exe /c rmdir /s /q \"" + $path + "\"";
}
}
}
#n = dllfunc("Bypass_CreateDirectory", $outfolder);
if( existfile( $outfolder + "\\*.*" ) ) {
runsync2 "cmd.exe /c del /f /s /q \"" + $outfolder + "\\*.*\"";
//古いファイルのゴミを削除
}
#n = dllfunc("Bypass_CreateDirectory", $outfolder);
if( $unzip != "" ) {
$command = "\"" + $unzip + "\"" + " -P\"" + $password + "\"" + " -d\
"" + $outfolder + "\" \"" + $zipfile + "\"";
} else {
$command = "\"" + $7zip + "\" x -p\"" + $password + "\"" + " -o\"" +
$outfolder + "\" \"" + $zipfile + "\"";
}
#homehidemaru = hidemaruhandle(0);
#n = dllfunc("NewMail");
#n = dllfunc("SwitchHeaderView", 0); //ヘッダ表示なし
gofiletop;
beginsel;
gofileend;
insert $command + "\n\n";
gofileend;
runex $command
, 1 //同期
, 0 //標準入力なし
, ""
, 5 //標準出力をカーソル位置へ挿入
, ""
, 5 //標準エラー出力もカーソル位置へ挿入
, ""
, 0 //作業フォルダ指定なし
, ""
, 1 //表示あり
, 0 //描画あり
, 0 //ANSIで受け取り
, 0x0001 //2021.05.18 拡張フラグで「%」をそのまま書けるようにする
;
if( !result ) {
message "unzip.exeまたは7zipの実行に失敗しました。プログラムからの出
力内容を確認してください。";
endmacro;
}
#exitcode = getresultex(9);
gofileend;
clearupdated;
if( #exitcode == 0 || #exitcode == 1 ) {
//終了コード 参照:
// 7zip ... https://sevenzip.osdn.jp/chm/cmdline/exit_codes.htm
// unzip.exe ... https://community.progress.com/s/article/What-does-Error-Code-mean-on-a-un-Zip-Advanced-Script-1307565966255
openbyshell $outfolder;
quit;
}
message "unzip.exeまたは7zipからエラーが返っていると思われます。出力結果
を確認してください。";
|
|