From 70a2e47727d2ded3ec1ba1c54ea2bae0722f3a45 Mon Sep 17 00:00:00 2001 From: Alexander Popov Date: Sun, 31 Jul 2022 02:23:58 +0300 Subject: [PATCH] add functions module --- src/pmng.cr | 230 +++++++++++++------------------ src/pmng/functions/item.cr | 33 +++++ src/pmng/functions/statistics.cr | 31 +++++ 3 files changed, 163 insertions(+), 131 deletions(-) create mode 100644 src/pmng/functions/item.cr create mode 100644 src/pmng/functions/statistics.cr diff --git a/src/pmng.cr b/src/pmng.cr index 904c962..5bbe828 100644 --- a/src/pmng.cr +++ b/src/pmng.cr @@ -3,148 +3,116 @@ require "yaml" require "colorize" require "./pmng/*" +require "./pmng/functions/*" -# 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) - -# 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 passwords_array.size - - print "Passwords outdated: ".colorize(:red).mode(:bold) - outdated_count = 0 - current_time = Time.local.to_unix - a = [] of String - passwords_array.each do |item| - if item.update + (2629743 * 3) < current_time # 2629743 * 3 -- 3 month - outdated_count += 1 - a << item.url - end +module Pmng + # check password file exists + if File.exists?(PASSWORD_FILE_PATH) + yaml = File.open(PASSWORD_FILE_PATH) do |file| + YAML.parse(file) end - - puts outdated_count else - # list search password - system "clear" + print "~/.pwd.yml".colorize(:red).mode(:bold) + puts ": No such file" - passwords_finded_array = 0 + exit(1) + end - passwords_array.each do |item| - if item.url.includes?(password_string.to_s) - print "🌐 " - puts item.url.colorize(:magenta).mode(:bold).mode(:underline) + # check file ppermissions + password_file_permissions = File.info(PASSWORD_FILE_PATH).permissions.to_s - if !item.email.blank? - print "📧 " - puts item.email.colorize(:red) + 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) + Functions.show_item(item) + + puts "-----".colorize(:dark_gray).mode(:bold) + + passwords_finded_array += 1 end - - if !item.login.blank? - print "🗿 " - puts item.login.colorize(:yellow) - end - - if !item.password.blank? - print "🔐 " - puts item.password.colorize(:red).back(:red) - end - - if !item.desc.blank? - print "📄 " - puts item.desc.colorize(:cyan) - end - - if !item.profile_url.blank? - print "👦 " - puts item.profile_url.colorize(:green) - end - - puts "-----".colorize(:dark_gray).mode(:bold) - - passwords_finded_array += 1 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 - 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 + system "clear" + puts "Bye! 👋" end - -system "clear" -puts "Bye! 👋" diff --git a/src/pmng/functions/item.cr b/src/pmng/functions/item.cr new file mode 100644 index 0000000..e68d416 --- /dev/null +++ b/src/pmng/functions/item.cr @@ -0,0 +1,33 @@ +module Pmng::Functions + extend self + + def show_item(password) + print "🌐 " + puts password.url.colorize(:magenta).mode(:bold).mode(:underline) + + if !password.email.blank? + print "📧 " + puts password.email.colorize(:red) + end + + if !password.login.blank? + print "🗿 " + puts password.login.colorize(:yellow) + end + + if !password.password.blank? + print "🔐 " + puts password.password.colorize(:red).back(:red) + end + + if !password.desc.blank? + print "📄 " + puts password.desc.colorize(:cyan) + end + + if !password.profile_url.blank? + print "👦 " + puts password.profile_url.colorize(:green) + end + end +end diff --git a/src/pmng/functions/statistics.cr b/src/pmng/functions/statistics.cr new file mode 100644 index 0000000..a2dd592 --- /dev/null +++ b/src/pmng/functions/statistics.cr @@ -0,0 +1,31 @@ +module Pmng::Functions + class Statistics + getter passwords : Array(Password) + getter outdated : Int32 + getter size : Int32 + + def initialize(@passwords) + @size = passwords.size + + outdated_count = 0 + current_time = Time.local.to_unix + a = [] of String + @passwords.each do |item| + if item.update + (2629743 * 3) < current_time # 2629743 * 3 -- 3 month + outdated_count += 1 + a << item.url + end + end + + @outdated = outdated_count + end + + def size + return @size + end + + def outdated + return @outdated + end + end +end