--[[  ●ワンタイムパスワード作成スクリプト   登録されたユーザーに対するワンタイムパスワードを作成し、メールで通知するスク   リプトです。ユーザーは複数登録することができます。  <説明>  ・このファイルを RTFS か外部メモリに保存してください。  ・本項目の config の設定では schedule at コマンドで定期的に Lua スクリプトが実   行されるように設定しています。  ・ワンタイムパスワードには半角英数字と"?"、"#"、"\"、"'"、"""、"^"、"<"、">"、を   除いた記号が使用され、文字数は4文字から64文字まで設定することができます。  ・ワンタイムパスワードは大文字、小文字が区別されますので注意してください。  ・★マークの付いた設定値は変更可能です。  <ノート>  ・メールの送信失敗時、または設定値に誤りがあったときに出力する SYSLOG レベルを指   定可能です。   SYSLOG のレベルを指定するには、log_level を設定してください。   debug レベル、notice レベルの SYSLOG を出力するためには、それぞれ以下の設定   が必要です。    debug レベル ・・・ syslog debug on    notice レベル・・・ syslog notice on  ・本スクリプトファイルを編集する場合、文字コードは必ず Shift-JIS を使用してく   ださい。 ]] --------------------------## 設定値 ##-------------------------------- -- 登録するユーザーの一覧(カンマで区切って列挙する) user_tbl = { -- ★ { name = "(PPPユーザー名1)", mail_tbl = { smtp_address = "(SMTPサーバーアドレス1)", from = "(送信元メールアドレス1)", to = "(宛先メールアドレス1)" } }, { name = "(PPPユーザー名2)", mail_tbl = { smtp_address = "(SMTPサーバーアドレス2)", from = "(送信元メールアドレス2)", to = "(宛先メールアドレス2)" } } } -- ワンタイムパスワードの文字数 (4 - 64 文字) digits = (ワンタイムパスワードの文字数) -- ★ -- メールの送信に失敗した時に出力する SYSLOG のレベル (info, debug, notice) log_level = "(SYSLOG レベル)" -- ★ ----------------------## 設定値ここまで ##---------------------------- ------------------------------------------------------------ -- 乱数を文字に変換するテーブル -- ------------------------------------------------------------ wd_tbl = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "!", "$", "%", "&", "(", ")", "*", "+", ",", "-", ".", "/", ":", ";", "=", "@", "[", "]", "_", "`", "{", "|", "}", "~" } ------------------------------------------------------------ -- ワンタイムパスワードを作成する関数 -- ------------------------------------------------------------ function make_pass(name) local i local pass = "" math.randomseed(os.time()) for i = 1, digits do pass = pass .. wd_tbl[math.random(#wd_tbl)] end cmd = "pp auth username " .. name .. " " .. pass rt.command("pp select anonymous") rt.command(cmd) rt.command("save") return pass end ------------------------------------------------------------ -- メール送信を行う関数 -- ------------------------------------------------------------ function send_mail(name, pass, mail_tbl) local sjct, text sjct = name .. " さんの新しいパスワードの通知" text = name .. " さんの新しいパスワードは\r\n" .. pass .. "\r\nになります。" mail_tbl.preface_of_text = false mail_tbl.subject = sjct mail_tbl.text = text return rt.mail(mail_tbl) end ------------------------------------------------------------ -- パラメーター確認を行う関数 -- ------------------------------------------------------------ function check_param() local i, k, v local err = false if digits < 4 or 64 < digits then err = true end for i = 1, #user_tbl do if user_tbl[i].name == "" then err = true end for k, v in pairs(user_tbl[i].mail_tbl) do if v == "" then err = true end end end return err end ------------------------------------------------------------ -- メインルーチン -- ------------------------------------------------------------ local i, pass, err if check_param() then rt.syslog(log_level, "Parameter Error. (OneTimePass.lua)") os.exit(0) end for i = 1, #user_tbl do pass = make_pass(user_tbl[i].name) err = send_mail(user_tbl[i].name, pass, user_tbl[i].mail_tbl) if not err then rt.syslog(log_level, "failed to send mail to " .. user_tbl[i].mail_tbl.to .. ". (OneTimePass.lua)") end end