119 lines
3.1 KiB
Crystal
119 lines
3.1 KiB
Crystal
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
|