From 25baa260e33756fc0efeb17c525e2563470c75fa Mon Sep 17 00:00:00 2001 From: Adrien Waksberg Date: Sat, 8 Apr 2017 17:15:05 +0200 Subject: [PATCH] feat: add option to set a specific path for a wallet --- bin/mpw-wallet | 11 +++++++++++ i18n/en.yml | 4 ++++ i18n/fr.yml | 4 ++++ lib/mpw/cli.rb | 29 +++++++++++++++++++++++------ lib/mpw/config.rb | 38 ++++++++++++++++++++++++++++++++++---- 5 files changed, 76 insertions(+), 10 deletions(-) diff --git a/bin/mpw-wallet b/bin/mpw-wallet index 8bbffcf..5b3b7f9 100644 --- a/bin/mpw-wallet +++ b/bin/mpw-wallet @@ -56,6 +56,14 @@ OptionParser.new do |opts| options[:list_keys] = true end + opts.on('-p', '--path PATH', I18n.t('option.path')) do |path| + options[:path] = path + end + + opts.on('-P', '--default-path', I18n.t('option.default_path')) do + options[:path] = 'default' + end + opts.on('-w', '--wallet NAME', I18n.t('option.wallet')) do |wallet| options[:wallet] = wallet end @@ -68,6 +76,9 @@ cli.load_config if options.key?(:list) cli.list_wallet +elsif options.key?(:path) + cli.get_wallet(options[:wallet]) + cli.set_wallet_path(options[:path]) else cli.get_wallet(options[:wallet]) cli.decrypt diff --git a/i18n/en.yml b/i18n/en.yml index 97f1928..1fa2618 100644 --- a/i18n/en.yml +++ b/i18n/en.yml @@ -45,6 +45,7 @@ en: alpha: "Use letter to generate a password" config: "Specify the configuration file to use" clipboard: "Disable the clipboard feature" + default_path: "Move the wallet in default directory" default_wallet: "Specify the default wallet to use" delete_gpg_key: "Delete the wallet's share with an other GPG key" disable_alpha: "Don't use letter to generate a password" @@ -68,6 +69,7 @@ en: list: "List the wallets" list_keys: "List the GPG keys in wallet" numeric: "Use number to generate a password" + path: "Move the wallet in new specify directory" pattern: "Given search pattern" pinmode: "Enable pinentry mode (available with gpg >= 2.1)" random_password: "Generate a random password" @@ -120,6 +122,8 @@ en: not_valid: "No data to import!" set_config: valid: "The config file has been edited!" + set_wallet_path: + valid: "The wallet has well moved!" setup_config: title: "Setup a new config file" lang: "Choose your language (en, fr, ...) [default=%{lang}]: " diff --git a/i18n/fr.yml b/i18n/fr.yml index 0c7319c..76b07ef 100644 --- a/i18n/fr.yml +++ b/i18n/fr.yml @@ -45,6 +45,7 @@ fr: alpha: "Utilise des lettres dans la génération d'un mot de passe" config: "Spécifie le fichier de configuration à utiliser" clipboard: "Désactive la fonction presse papier" + default_path: "Déplace le portefeuille dans le dossier par défaut" default_wallet: "Spécifie le porte-feuille à utiliser par défaut" delete_gpg_key: "Supprime le partage le portefeuille avec une autre clé GPG" disable_alpha: "Désactive l'utilisation des lettres dans la génération d'un mot de passe" @@ -68,6 +69,7 @@ fr: list: "Liste les portefeuilles" list_keys: "Liste les clés GPG dans le portefeuille" numeric: "Utilise des chiffre dans la génération d'un mot de passe" + path: "Déplace le portefeuille dans un nouveau dossier" pattern: "Motif de donnée à chercher" pinmode: "Active le mode pinentry (valable avec gpg >= 2.1)" random_password: "Génére un mot de passe aléatoire" @@ -120,6 +122,8 @@ fr: not_valid: "Aucune donnée à importer!" set_config: valid: "Le fichier de configuration a bien été modifié!" + set_wallet_path: + valid: "Le portefeuille a bien été déplacé!" setup_config: title: "Création d'un nouveau fichier de configuration" lang: "Choisissez votre langue (en, fr, ...) [défaut=%{lang}]: " diff --git a/lib/mpw/cli.rb b/lib/mpw/cli.rb index 56e77a1..23114d1 100644 --- a/lib/mpw/cli.rb +++ b/lib/mpw/cli.rb @@ -45,6 +45,17 @@ module MPW exit 2 end + # Change the wallet path + # @args: path -> the new path + def set_wallet_path(path) + @config.set_wallet_path(path, @wallet) + + puts I18n.t('form.set_wallet_path.valid').to_s.green + rescue => e + puts "#{I18n.t('display.error')} #19: #{e}".red + exit 2 + end + # Create a new config file # @args: options -> set param def setup(options) @@ -315,19 +326,25 @@ module MPW # Display the wallet # @args: wallet -> the wallet name def get_wallet(wallet = nil) - @wallet_file = + @wallet = if wallet.to_s.empty? wallets = Dir.glob("#{@config.wallet_dir}/*.mpw") - if wallets.length == 1 - wallets[0] + File.basename(wallets[0], '.mpw') elsif !@config.default_wallet.to_s.empty? - "#{@config.wallet_dir}/#{@config.default_wallet}.mpw" + @config.default_wallet else - "#{@config.wallet_dir}/default.mpw" + 'default' end else - "#{@config.wallet_dir}/#{wallet}.mpw" + wallet + end + + @wallet_file = + if @config.wallet_paths.key?(@wallet) + "#{@config.wallet_paths[@wallet]}/#{@wallet}.mpw" + else + "#{@config.wallet_dir}/#{@wallet}.mpw" end end diff --git a/lib/mpw/config.rb b/lib/mpw/config.rb index 591b991..fd78cf8 100644 --- a/lib/mpw/config.rb +++ b/lib/mpw/config.rb @@ -30,6 +30,7 @@ module MPW attr_accessor :config_dir attr_accessor :default_wallet attr_accessor :wallet_dir + attr_accessor :wallet_paths attr_accessor :gpg_exe attr_accessor :password attr_accessor :pinmode @@ -38,8 +39,7 @@ module MPW # @args: config_file -> the specify config file def initialize(config_file = nil) @config_file = config_file - - @config_dir = + @config_dir = if /darwin/ =~ RUBY_PLATFORM "#{Dir.home}/Library/Preferences/mpw" elsif /cygwin|mswin|mingw|bccwin|wince|emx/ =~ RUBY_PLATFORM @@ -48,7 +48,7 @@ module MPW "#{Dir.home}/.config/mpw" end - @config_file = "#{@config_dir}/mpw.cfg" if @config_file.nil? || @config_file.empty? + @config_file = "#{@config_dir}/mpw.cfg" if @config_file.to_s.empty? end # Create a new config file @@ -85,7 +85,8 @@ module MPW 'default_wallet' => default_wallet, 'gpg_exe' => gpg_exe, 'password' => password, - 'pinmode' => pinmode } + 'pinmode' => pinmode, + 'wallet_paths' => @wallet_paths } FileUtils.mkdir_p(@config_dir, mode: 0700) FileUtils.mkdir_p(wallet_dir, mode: 0700) @@ -132,6 +133,7 @@ module MPW @gpg_key = config['gpg_key'] @lang = config['lang'] @wallet_dir = config['wallet_dir'] + @wallet_paths = config['wallet_paths'] || {} @default_wallet = config['default_wallet'] @gpg_exe = config['gpg_exe'] @password = config['password'] || {} @@ -154,5 +156,33 @@ module MPW false end + + # Change the path of one wallet + # @args: path -> the new directory path + # wallet -> the wallet name + def set_wallet_path(path, wallet) + path = @wallet_dir if path == 'default' + + return if path == @wallet_dir && File.exist?("#{@wallet_dir}/#{wallet}.mpw") + return if path == @wallet_paths[wallet] + + old_wallet_file = + if @wallet_paths.key?(wallet) + "#{@wallet_paths[wallet]}/#{wallet}.mpw" + else + "#{@wallet_dir}/#{wallet}.mpw" + end + + FileUtils.mkdir_p(path) unless Dir.exist?(path) + FileUtils.mv(old_wallet_file, "#{path}/#{wallet}.mpw") if File.exist?(old_wallet_file) + + if path == @wallet_dir + @wallet_paths.delete(wallet) + else + @wallet_paths[wallet] = path + end + + setup + end end end