From 2f627f271c9ae398018069caa35f70fcb2ccdf64 Mon Sep 17 00:00:00 2001 From: nishiki Date: Tue, 9 Aug 2016 22:06:47 +0200 Subject: [PATCH] add and update with vim editor --- bin/mpw | 22 +------- i18n/en.yml | 6 -- i18n/fr.yml | 6 -- lib/mpw/cli.rb | 114 ++++++++++++++++---------------------- templates/add_form.erb | 10 ++++ templates/update_form.erb | 10 ++++ 6 files changed, 70 insertions(+), 98 deletions(-) create mode 100644 templates/add_form.erb create mode 100644 templates/update_form.erb diff --git a/bin/mpw b/bin/mpw index f5e717b..5f0d64d 100755 --- a/bin/mpw +++ b/bin/mpw @@ -75,10 +75,6 @@ OptionParser.new do |opts| options[:clipboard] = false end - opts.on('-d', '--delete', I18n.t('option.remove')) do - options[:delete] = true - end - opts.on('-e', '--export', I18n.t('option.export')) do options[:export] = true end @@ -104,10 +100,6 @@ OptionParser.new do |opts| exit 0 end - opts.on('-i', '--id ID', I18n.t('option.id')) do |id| - options[:id] = id - end - opts.on('-I', '--import', I18n.t('option.import')) do options[:import] = true end @@ -136,10 +128,6 @@ OptionParser.new do |opts| options[:setup] = true end - opts.on('-u', '--update', I18n.t('option.update')) do - options[:update] = true - end - opts.on('-w', '--wallet WALLET', I18n.t('option.wallet')) do |wallet| options[:wallet] = wallet end @@ -191,14 +179,6 @@ begin cli.display(opts) - # Remove an item - elsif not options[:delete].nil? and not options[:id].nil? - cli.delete(options[:id], options[:force]) - - # Update an item - elsif not options[:update].nil? and not options[:id].nil? - cli.update(options[:id]) - # Add a new item elsif not options[:add].nil? and options[:key].nil? cli.add @@ -215,7 +195,7 @@ begin elsif not options[:export].nil? and not options[:file].nil? cli.export(options[:file]) - # Add a new item + # Import elsif not options[:import].nil? and not options[:file].nil? cli.import(options[:file]) diff --git a/i18n/en.yml b/i18n/en.yml index c704849..52fbf67 100644 --- a/i18n/en.yml +++ b/i18n/en.yml @@ -10,8 +10,6 @@ en: exception: "Can't create the GPG key!" name: "You must define a name for your GPG key!" password: "You must define a password for your GPG key!" - delete: - id_no_exist: "Can't delete the item %{id}, it doesn't exist!" export: "Can't export, unable to write in %{file}!" gpg_file: decrypt: "Can't decrypt file!" @@ -46,7 +44,6 @@ en: generate_password: "Generate a random password (default 8 characters)" group: "Search the items with specified group" help: "Show this help message" - id: "Specify an id, to use with the options [--delete | --update]" import: "Import item since a yaml file" key: "Specify the key name, to use with the options [--add | --delete | --update]" no_sync: "Disable synchronization with the server" @@ -56,8 +53,6 @@ en: special_chars: "Use special char to generate a password" show: "Search and show the items" show_all: "List all items" - remove: "Delete an item" - update: "Update an item" usage: "Usage" wallet: "Specify a wallet to use" @@ -93,7 +88,6 @@ en: delete_item: ask: "Are you sure you want to remove the item %{id} ?" valid: "The item %{id} has been removed!" - not_valid: "The item %{id} hasn't been removed, because it doesn't exist!" import: ask: "Are you sure you want to import this file %{file} ?" valid: "The import is succesfull!" diff --git a/i18n/fr.yml b/i18n/fr.yml index 41cac4d..b07a9e2 100644 --- a/i18n/fr.yml +++ b/i18n/fr.yml @@ -10,8 +10,6 @@ fr: exception: "La création de la clé GPG n'a pas pu aboutir!" name: "Vous devez définir un nom pour votre clé GPG!" password: "Vous devez définir un mot de passe pour votre clé GPG!" - delete: - id_no_exist: "Impossible de supprimer l'élément %{id}, car il n'existe pas!" export: "Impossible d'exporter les données dans le fichier %{file}!" gpg_file: decrypt: "Impossible de déchiffrer le fichier GPG!" @@ -46,7 +44,6 @@ fr: generate_password: "Génére un mot de passe aléatoire (défaut 8 caractères)" group: "Recherche les éléments appartenant au groupe spécifié" help: "Affiche ce message d'aide" - id: "Spécifie un identifiant, à utiliser avec les options [--delete | --update]" import: "Importe des éléments depuis un fichier yaml" key: "Spécifie le nom d'une clé, à utiliser avec les options [--add | --delete | --update]" no_sync: "Désactive la synchronisation avec le serveur" @@ -56,8 +53,6 @@ fr: special_chars: "Utilise des charactères speciaux dans la génération d'un mot de passe" show: "Recherche et affiche les éléments" show_all: "Liste tous les éléments" - remove: "Supprime un élément" - update: "Met à jour un élément" usage: "Utilisation" wallet: "Spécifie le portefeuille à utiliser" @@ -93,7 +88,6 @@ fr: delete_item: ask: "Êtes vous sûre de vouloir supprimer l'élément %{id} ?" valid: "L'élément %{id} a bien été supprimé!" - not_valid: "L'élément %{id} n'a pu être supprimé, car il n'existe pas!" import: ask: "Êtes vous sûre de vouloir importer le fichier %{file} ?" valid: "L'import est un succès!" diff --git a/lib/mpw/cli.rb b/lib/mpw/cli.rb index 392e7bd..50fad4d 100644 --- a/lib/mpw/cli.rb +++ b/lib/mpw/cli.rb @@ -21,6 +21,7 @@ require 'i18n' require 'colorize' require 'highline/import' require 'clipboard' +require 'tmpdir' require 'mpw/item' require 'mpw/mpw' @@ -156,7 +157,7 @@ class Cli group = nil i = 1 - result.sort! { |a,b| a.group.downcase <=> b.group.downcase } + result.sort! { |a,b| a.group.to_s.downcase <=> b.group.to_s.downcase } result.each do |item| if group != item.group @@ -263,6 +264,12 @@ class Cli Clipboard.copy(@mpw.get_otp_code(item.id)) puts I18n.t('form.clipboard.otp', time: @mpw.get_otp_remaining_time).yellow + when 'd', 'delete' + delete(item) + + when 'u', 'update', 'e', 'edit' + update(item) + else puts "----- #{I18n.t('form.clipboard.help.name')} -----".cyan puts I18n.t('form.clipboard.help.login') @@ -336,30 +343,41 @@ class Cli puts "#{I18n.t('display.error')} #15: #{e}".red end - # Form to add a new item - def add - options = {} + def text_editor(template_name, item=nil) + options = {} + opts = {} + template_file = "#{File.expand_path('../../../templates', __FILE__)}/#{template_name}.erb" + template = ERB.new(IO.read(template_file)) - puts I18n.t('form.add_item.title') - puts '--------------------' - options[:name] = ask(I18n.t('form.add_item.name')).to_s - options[:group] = ask(I18n.t('form.add_item.group')).to_s - options[:host] = ask(I18n.t('form.add_item.server')).to_s - options[:protocol] = ask(I18n.t('form.add_item.protocol')).to_s - options[:user] = ask(I18n.t('form.add_item.login')).to_s - password = ask(I18n.t('form.add_item.password')).to_s - options[:port] = ask(I18n.t('form.add_item.port')).to_s - options[:comment] = ask(I18n.t('form.add_item.comment')).to_s + Dir.mktmpdir do |dir| + tmp_file = "#{dir}/#{template_name}.yml" - if @otp - otp_key = ask(I18n.t('form.add_item.otp_key')).to_s + File.open(tmp_file, 'w') do |f| + f << template.result(binding) + end + + system("vim #{tmp_file}") + + opts = YAML::load_file(tmp_file) end - item = Item.new(options) + opts.delete_if { |k,v| v.to_s.empty? } + + opts.each do |k,v| + options[k.to_sym] = v + end + + return options + end + + # Form to add a new item + def add + options = text_editor('add_form') + item = Item.new(options) @mpw.add(item) - @mpw.set_password(item.id, password) - @mpw.set_otp_key(item.id, otp_key) + @mpw.set_password(item.id, options[:password]) if options.has_key?(:password) + @mpw.set_otp_key(item.id, options[:otp_key]) if options.has_key?(:otp_key) @mpw.write_data @mpw.sync(true) if @sync @@ -368,39 +386,16 @@ class Cli # Update an item # @args: id -> the item's id - def update(id) - item = @mpw.search_by_id(id) + def update(item) + options = text_editor('update_form', item) - if not item.nil? - options = {} + item.update(options) + @mpw.set_password(item.id, options[:password]) if options.has_key?(:password) + @mpw.set_otp_key(item.id, options[:otp_key]) if options.has_key?(:otp_key) + @mpw.write_data + @mpw.sync(true) if @sync - puts I18n.t('form.update_item.title') - puts '--------------------' - options[:name] = ask(I18n.t('form.update_item.name' , name: item.name)).to_s - options[:group] = ask(I18n.t('form.update_item.group' , group: item.group)).to_s - options[:host] = ask(I18n.t('form.update_item.server' , server: item.host)).to_s - options[:protocol] = ask(I18n.t('form.update_item.protocol', protocol: item.protocol)).to_s - options[:user] = ask(I18n.t('form.update_item.login' , login: item.user)).to_s - password = ask(I18n.t('form.update_item.password')).to_s - options[:port] = ask(I18n.t('form.update_item.port' , port: item.port)).to_s - options[:comment] = ask(I18n.t('form.update_item.comment' , comment: item.comment)).to_s - - if @otp - otp_key = ask(I18n.t('form.update_item.otp_key')).to_s - end - - options.delete_if { |k,v| v.empty? } - - item.update(options) - @mpw.set_password(item.id, password) if not password.empty? - @mpw.set_otp_key(item.id, otp_key) if not otp_key.to_s.empty? - @mpw.write_data - @mpw.sync(true) if @sync - - puts "#{I18n.t('form.update_item.valid')}".green - else - puts I18n.t('display.nothing') - end + puts "#{I18n.t('form.update_item.valid')}".green rescue Exception => e puts "#{I18n.t('display.error')} #14: #{e}".red end @@ -408,29 +403,18 @@ class Cli # Remove an item # @args: id -> the item's id # force -> no resquest a validation - def delete(id, force=false) - @clipboard = false - item = @mpw.search_by_id(id) + def delete(item) + confirm = ask("#{I18n.t('form.delete_item.ask')} (y/N) ").to_s - if item.nil? - puts I18n.t('form.delete_item.not_valid', id: id) + if not confirm =~ /^(y|yes|YES|Yes|Y)$/ return end - if not force - display_item(item) - - confirm = ask("#{I18n.t('form.delete_item.ask', id: id)} (y/N) ").to_s - if not confirm =~ /^(y|yes|YES|Yes|Y)$/ - return - end - end - item.delete @mpw.write_data @mpw.sync(true) if @sync - puts "#{I18n.t('form.delete_item.valid', id: id)}".green + puts "#{I18n.t('form.delete_item.valid')}".green rescue Exception => e puts "#{I18n.t('display.error')} #16: #{e}".red end diff --git a/templates/add_form.erb b/templates/add_form.erb new file mode 100644 index 0000000..9cb9d1a --- /dev/null +++ b/templates/add_form.erb @@ -0,0 +1,10 @@ +--- +name: +group: +host: +protocol: +user: +password: +port: +comment: +otp_secret: diff --git a/templates/update_form.erb b/templates/update_form.erb new file mode 100644 index 0000000..13ce1d6 --- /dev/null +++ b/templates/update_form.erb @@ -0,0 +1,10 @@ +--- +name: <%= item.name %> +group: <%= item.group %> +host: <%= item.host %> +protocol: <%= item.protocol %> +user: <%= item.user %> +password: +port: <%= item.port %> +comment: <%= item.comment %> +otp_secret: