#!ruby -Ku
#Windowsのプロンプトの場合は、rbファイルをSJISに変換した上で、上のオプションを「-Ks」にしてください。
require 'openssl'
 
@item_names = [] # アカウント情報を一意に決めるための内部名
@print_names = [] # 表示名
@get_functions = [] # 読み出した口座情報関数取得用の配列
@make_account = [] # アカウント情報登録のための関数の配列
@login_functions = [] # ログインのみの機能も実装するかもしれないので、分けて取得。
@format_functions = [] # 書式を整える関数(オプション)取得用の配列

require 'lib_a_require' # 自作ライブラリ(口座情報、暗号復号 with openssl)読み出し。

puts "マスターパスワードを入力してください。"
case RUBY_PLATFORM.downcase
when /mswin(?!ce)|mingw|cygwin|bccwin/
  @osname = "windows"
when /linux/
  @osname ="linux"
end
 
key = `stty -echo;read line;stty echo; echo $line`.chomp if @osname == "linux"
key = gets.chomp if @osname == "windows" # Windowsの場合はキー入力を隠さない。

 
# 登録されているかどうかのフラグを設定
flags = Array.new(@item_names.length, false)
 
account_info = Array.new(@item_names.length, false) # ログインアカウント保存用配列

if File.exist?("account_passwd")
  enc_passes = []
  dec_passes = []
  enc_passes = open("account_passwd", "rb"){ |f| f.read }
  begin
    dec_passes = enc_passes.decrypt(key).split("\n")
  rescue
    STDERR.puts "パスワードが違います! パスワードファイルを解読できません。" if $!.to_s == 'bad decrypt'
    exit
  end
  dec_passes.map! {|l| l.split(",")}
 
  # 登録されている関数のアカウント情報があるかどうか順番に見ていく。
  # あったら、それを見つけた順に格納。

  @item_names.each_with_index do |x, i|
    dec_passes.each do |y|
      if y[0] == x
        flags[i] = true
        account_info[i] = y
      end
    end
  end
 
end
 
 
# 登録(関数とアカウント情報の両方)されているアカウントを順番に表示
@print_names.each_with_index do |x,i|
  print i.to_s + "." + x + " "
  print "\n"
end
puts "x.マスターパスワード変更"
 
select_no = gets.chomp
 
case select_no
when /\d+/
  if flags[select_no.to_i] == true
    puts @print_names[select_no.to_i] + "のアカウント情報はすでに登録されています。"
    puts "書き換えますか? y or n"
    select_rw = gets.chomp
    exit if select_rw != "y"
  end
  if @make_account[select_no.to_i] == false
    account_info[select_no.to_i] = make_account_default(select_no.to_i)
  else
    make_an_account = @make_account[select_no.to_i] + "(" + select_no + ")"
    account_info[select_no.to_i] = instance_eval make_an_account
  end
  flags[select_no.to_i] = true
 
when "x"
  puts "マスターパスワードを変更します。"
  puts "新しいマスターパスワードを入力してください。"
  if @osname == "linux"
    key = `stty -echo;read line;stty echo; echo $line`.chomp
    puts "確認のため、もう一度新しいマスターパスワードを入力してください。"
    if key != `stty -echo;read line;stty echo; echo $line`.chomp
      puts "入力されたものが一致しません。"
      puts "確認のため、もう一度新しいマスターパスワードを入力してください。"
      if key != `stty -echo;read line;stty echo; echo $line`.chomp
        puts "入力されたものが一致しません。"
        puts "マスターパスワードは変更されませんでした。スクリプトを終了します。"
        exit
      end
    end
 
  elsif @osname == "windows"
    key = gets.chomp # Windowsの場合はキー入力を隠さない。
    puts "確認のため、もう一度新しいマスターパスワードを入力してください。"
    if key != gets.chomp # Windowsの場合はキー入力を隠さない。
      puts "入力されたものが一致しません。"
      puts "確認のため、もう一度新しいマスターパスワードを入力してください。"
      if key != gets.chomp # Windowsの場合はキー入力を隠さない。
        puts "入力されたものが一致しません。"
        puts "マスターパスワードは変更されませんでした。スクリプトを終了します。"
        exit
      end
    end
  end
  puts "マスターパスワードが変更されました。"
 
else
  puts "有効な値ではありません。スクリプトを終了します。"
  exit
end
 
 
# カンマや行区切りごとに暗号化すると、復号化できなくなるので、まとめて一気に暗号化
raw = "" # これに全部詰め込む

account_info.each_with_index do |x,i|
  next if flags[i] == false
  x.each_with_index do |y,j|
    raw = raw + y
    next if j == x.length - 1
    raw = raw + ","
  end
  raw = raw + "\n"
end
 
# ファイル書き込み
open("account_passwd", "w") do |f|
  f.write raw.encrypt(key)
  puts "登録されました。"
end
 
最終更新:2009年11月28日 20:02