require "option_parser" require "yaml" require "colorize" require "./pmng/*" require "./pmng/functions/*" module Pmng # check password file exists if File.exists?(PASSWORD_FILE_PATH) yaml = File.open(PASSWORD_FILE_PATH) do |file| YAML.parse(file) end else print "~/.pwd.yml".colorize(:red).mode(:bold) puts ": No such file" exit(1) end # check file ppermissions password_file_permissions = File.info(PASSWORD_FILE_PATH).permissions.to_s if /\d{3}/.match(password_file_permissions).try &.[0] != "600" puts "Password file permissions is not RW for you.".colorize(:red) print "Execute: ".colorize(:yellow) print "(chmod 600 ~/.pwd.yml) ".colorize(:green).mode(:bold) puts "for fix.".colorize(:yellow) exit(1) end # fill passwords array passwords_array = [] of Password count = 0 while count < yaml.size passwords_array << Password.from_yaml(yaml[count].to_yaml) count += 1 end # pmng title system "clear" puts ASCII_LOGO.colorize(:yellow) puts "The very simple password manager for humans".colorize(:yellow).mode(:bold) puts "-------------------------------------------".colorize(:yellow).mode(:bold) statistics = Functions::Statistics.new(passwords_array) # main loop loop = true while loop # shell prompt print "Enter URL (".colorize(:white).mode(:bold) print ":h".colorize(:red).mode(:bold) print " for help or ".colorize(:white).mode(:bold) print ":q".colorize(:red).mode(:bold) print " for exit)\n".colorize(:white).mode(:bold) print "> ".colorize(:green).mode(:bold) begin STDIN.read_timeout = USER_INPUT_TIMEOUT password_string = STDIN.gets rescue IO::TimeoutError loop = false end if password_string.to_s == ":q" # if ':q' to close program loop = false elsif password_string.to_s.size == 0 # if puts empty, retry prompt puts elsif password_string.to_s == ":h" # if ':h' to view help system "clear" puts "Help\n----".colorize(:yellow).mode(:bold) print ":s".colorize(:red).mode(:bold) puts " - Return stats" elsif password_string.to_s == ":s" # if ':s' to view Statistics system "clear" puts "Statistics\n----------".colorize(:yellow).mode(:bold) print "All elements: ".colorize(:yellow).mode(:bold) puts statistics.size print "Passwords outdated: ".colorize(:red).mode(:bold) puts statistics.outdated else # list search password system "clear" passwords_finded_array = 0 passwords_array.each do |item| if item.url.includes?(password_string.to_s.downcase) Functions.show_item(item) puts "-----".colorize(:dark_gray).mode(:bold) passwords_finded_array += 1 end end puts print "Finded ".colorize(:yellow).mode(:bold) print passwords_finded_array.colorize(:red).mode(:bold) puts " records".colorize(:yellow).mode(:bold) puts "-----".colorize(:dark_gray).mode(:bold) end puts end system "clear" puts "Bye! 👋" end