From d8ac5ed35a0723c35ab40019030f9081c8ca5db4 Mon Sep 17 00:00:00 2001
From: Adrien Waksberg <git@yae.im>
Date: Wed, 12 Oct 2016 23:23:03 +0200
Subject: [PATCH] first cut binary

---
 bin/mpw        | 173 +--------------------------------------
 bin/mpw-old    | 214 +++++++++++++++++++++++++++++++++++++++++++++++++
 bin/mpw-passwd |  50 ++++++++++++
 3 files changed, 268 insertions(+), 169 deletions(-)
 create mode 100755 bin/mpw-old
 create mode 100644 bin/mpw-passwd

diff --git a/bin/mpw b/bin/mpw
index 5f0d64d..2d32700 100755
--- a/bin/mpw
+++ b/bin/mpw
@@ -18,13 +18,9 @@
 
 $: << File.expand_path('../../lib', __FILE__)
 
-require 'optparse'
 require 'locale'
 require 'set'
 require 'i18n'
-require 'mpw/mpw'
-require 'mpw/config'
-require 'mpw/cli'
 
 # --------------------------------------------------------- #
 # Set local
@@ -45,170 +41,9 @@ I18n.locale         = lang.to_sym
 # Options
 # --------------------------------------------------------- #
 
-options_password    = {}
-options             = {}
-options[:force]     = false
-options[:otp]       = false
-options[:sync]      = true
-options[:clipboard] = true
-options[:group]     = nil
-options[:config]    = nil
-options[:wallet]    = nil
+bin_dir = File.dirname(__FILE__)
+command = "#{bin_dir}/mpw-#{ARGV[0]}"
 
-OptionParser.new do |opts|
-	opts.banner = "#{I18n.t('option.usage')}: mpw [options]"
-
-	opts.on('-a', '--add', I18n.t('option.add')) do
-		options[:add] = true
-	end
-
-	opts.on('-A', '--show-all', I18n.t('option.show_all')) do
-		options[:type] = nil
-		options[:show] = ''
-	end
-
-	opts.on('-c', '--config CONFIG', I18n.t('option.config')) do |config|
-		options[:config] = config
-	end
-
-	opts.on('-C', '--no-clipboard', I18n.t('option.clipboard')) do
-		options[:clipboard] = false
-	end
-
-	opts.on('-e', '--export', I18n.t('option.export')) do
-		options[:export] = true
-	end
-
-	opts.on('-f', '--file FILE', I18n.t('option.file')) do |file|
-		options[:file] = file
-	end
-
-	opts.on('-F', '--force', I18n.t('option.force')) do
-		options[:force] = true
-	end
-
-	opts.on('-g', '--group GROUP', I18n.t('option.group')) do |group|
-		options[:group] = group
-	end
-
-	opts.on('-G', '--generate-password [LENGTH]', I18n.t('option.generate_password')) do |length|
-		options_password[:length] = length
-	end
-
-	opts.on('-h', '--help', I18n.t('option.help')) do
-		puts opts
-		exit 0
-	end
-
-	opts.on('-I', '--import', I18n.t('option.import')) do
-		options[:import] = true
-	end
-
-	opts.on('-k', '--key KEY', I18n.t('option.key')) do |key|
-		options[:key] = key
-	end
-
-	opts.on('-n', '--numeric', I18n.t('option.numeric')) do
-		options_password[:numeric] = true
-	end
-
-	opts.on('-N', '--no-sync', I18n.t('option.no_sync')) do
-		options[:sync] = false
-	end
-
-	opts.on('-O', '--otp', I18n.t('option.otp')) do
-		options[:otp] = true
-	end
-
-	opts.on('-s', '--show [SEARCH]', I18n.t('option.show')) do |search|
-		search.nil? ? (options[:show]  = '')  : (options[:show] = search)
-	end
-
-	opts.on('-S', '--setup', I18n.t('option.setup')) do
-		options[:setup] = true
-	end
-
-	opts.on('-w', '--wallet WALLET', I18n.t('option.wallet')) do |wallet|
-		options[:wallet] = wallet
-	end
-
-	opts.on('-W', '--setup-wallet', I18n.t('option.setup_wallet')) do
-		options[:setup_wallet] = true
-	end
-
-	opts.on('-x', '--special-chars', I18n.t('option.special_chars')) do
-		options_password[:special] = true
-	end
-
-	opts.on('-y', '--alpha', I18n.t('option.alpha')) do
-		options_password[:alpha] = true
-	end
-end.parse!
-
-# --------------------------------------------------------- #
-# Main
-# --------------------------------------------------------- #
-
-# Generate password
-if not options_password.empty?
-	puts MPW::MPW::password(options_password)
-	exit 0
-end
-
-begin
-	config = MPW::Config.new(options[:config])
-	cli    = MPW::Cli.new(config, options[:clipboard], options[:sync], options[:otp])
-		
-	# Setup a new config 
-	if not options[:setup].nil?
-		cli.setup(lang)
-		exit 0
-	end
-
-	cli.setup(lang)   if not config.is_valid?
-	cli.setup_gpg_key if not config.check_gpg_key?
-	
-	cli.get_wallet(options[:wallet])
-	cli.decrypt
-	
-	# Display the item's informations
-	if not options[:show].nil?
-		opts = {search:    options[:show],
-		        group:     options[:group],
-		       }
-	
-		cli.display(opts)
-	
-	# Add a new item
-	elsif not options[:add].nil? and options[:key].nil?
-		cli.add
-	
-	# Add a new public key in wallet
-	elsif not options[:add].nil? and not options[:key].nil?
-		cli.add_key(options[:key], options[:file])
-	
-	# Delete a public key in wallet
-	elsif not options[:delete].nil? and not options[:key].nil?
-		cli.delete_key(options[:key])
-	
-	# Export
-	elsif not options[:export].nil? and not options[:file].nil?
-		cli.export(options[:file])
-	
-	# Import
-	elsif not options[:import].nil? and not options[:file].nil?
-		cli.import(options[:file])
-	
-	# Setup wallet config
-	elsif not options[:setup_wallet].nil?
-		cli.setup_wallet_config
-	
-	end
-	
-	cli = nil
-	
-	exit 0
-
-rescue SystemExit, Interrupt
-	exit 3
+if Dir.glob("#{bin_dir}/mpw-*").include?("#{command}")
+	Kernel.load(command)
 end
diff --git a/bin/mpw-old b/bin/mpw-old
new file mode 100755
index 0000000..5f0d64d
--- /dev/null
+++ b/bin/mpw-old
@@ -0,0 +1,214 @@
+#!/usr/bin/ruby
+# MPW is a software to crypt and manage your passwords
+# Copyright (C) 2016  Adrien Waksberg <mpw@yae.im>
+# 
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+# 
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+
+$: << File.expand_path('../../lib', __FILE__)
+
+require 'optparse'
+require 'locale'
+require 'set'
+require 'i18n'
+require 'mpw/mpw'
+require 'mpw/config'
+require 'mpw/cli'
+
+# --------------------------------------------------------- #
+# Set local
+# --------------------------------------------------------- #
+
+lang = Locale::Tag.parse(ENV['LANG']).to_simple.to_s[0..1]
+
+if defined?(I18n.enforce_available_locales)
+	I18n.enforce_available_locales = true
+end
+
+I18n::Backend::Simple.send(:include, I18n::Backend::Fallbacks)
+I18n.load_path      = Dir["#{File.expand_path('../../i18n', __FILE__)}/*.yml"]
+I18n.default_locale = :en
+I18n.locale         = lang.to_sym
+
+# --------------------------------------------------------- #
+# Options
+# --------------------------------------------------------- #
+
+options_password    = {}
+options             = {}
+options[:force]     = false
+options[:otp]       = false
+options[:sync]      = true
+options[:clipboard] = true
+options[:group]     = nil
+options[:config]    = nil
+options[:wallet]    = nil
+
+OptionParser.new do |opts|
+	opts.banner = "#{I18n.t('option.usage')}: mpw [options]"
+
+	opts.on('-a', '--add', I18n.t('option.add')) do
+		options[:add] = true
+	end
+
+	opts.on('-A', '--show-all', I18n.t('option.show_all')) do
+		options[:type] = nil
+		options[:show] = ''
+	end
+
+	opts.on('-c', '--config CONFIG', I18n.t('option.config')) do |config|
+		options[:config] = config
+	end
+
+	opts.on('-C', '--no-clipboard', I18n.t('option.clipboard')) do
+		options[:clipboard] = false
+	end
+
+	opts.on('-e', '--export', I18n.t('option.export')) do
+		options[:export] = true
+	end
+
+	opts.on('-f', '--file FILE', I18n.t('option.file')) do |file|
+		options[:file] = file
+	end
+
+	opts.on('-F', '--force', I18n.t('option.force')) do
+		options[:force] = true
+	end
+
+	opts.on('-g', '--group GROUP', I18n.t('option.group')) do |group|
+		options[:group] = group
+	end
+
+	opts.on('-G', '--generate-password [LENGTH]', I18n.t('option.generate_password')) do |length|
+		options_password[:length] = length
+	end
+
+	opts.on('-h', '--help', I18n.t('option.help')) do
+		puts opts
+		exit 0
+	end
+
+	opts.on('-I', '--import', I18n.t('option.import')) do
+		options[:import] = true
+	end
+
+	opts.on('-k', '--key KEY', I18n.t('option.key')) do |key|
+		options[:key] = key
+	end
+
+	opts.on('-n', '--numeric', I18n.t('option.numeric')) do
+		options_password[:numeric] = true
+	end
+
+	opts.on('-N', '--no-sync', I18n.t('option.no_sync')) do
+		options[:sync] = false
+	end
+
+	opts.on('-O', '--otp', I18n.t('option.otp')) do
+		options[:otp] = true
+	end
+
+	opts.on('-s', '--show [SEARCH]', I18n.t('option.show')) do |search|
+		search.nil? ? (options[:show]  = '')  : (options[:show] = search)
+	end
+
+	opts.on('-S', '--setup', I18n.t('option.setup')) do
+		options[:setup] = true
+	end
+
+	opts.on('-w', '--wallet WALLET', I18n.t('option.wallet')) do |wallet|
+		options[:wallet] = wallet
+	end
+
+	opts.on('-W', '--setup-wallet', I18n.t('option.setup_wallet')) do
+		options[:setup_wallet] = true
+	end
+
+	opts.on('-x', '--special-chars', I18n.t('option.special_chars')) do
+		options_password[:special] = true
+	end
+
+	opts.on('-y', '--alpha', I18n.t('option.alpha')) do
+		options_password[:alpha] = true
+	end
+end.parse!
+
+# --------------------------------------------------------- #
+# Main
+# --------------------------------------------------------- #
+
+# Generate password
+if not options_password.empty?
+	puts MPW::MPW::password(options_password)
+	exit 0
+end
+
+begin
+	config = MPW::Config.new(options[:config])
+	cli    = MPW::Cli.new(config, options[:clipboard], options[:sync], options[:otp])
+		
+	# Setup a new config 
+	if not options[:setup].nil?
+		cli.setup(lang)
+		exit 0
+	end
+
+	cli.setup(lang)   if not config.is_valid?
+	cli.setup_gpg_key if not config.check_gpg_key?
+	
+	cli.get_wallet(options[:wallet])
+	cli.decrypt
+	
+	# Display the item's informations
+	if not options[:show].nil?
+		opts = {search:    options[:show],
+		        group:     options[:group],
+		       }
+	
+		cli.display(opts)
+	
+	# Add a new item
+	elsif not options[:add].nil? and options[:key].nil?
+		cli.add
+	
+	# Add a new public key in wallet
+	elsif not options[:add].nil? and not options[:key].nil?
+		cli.add_key(options[:key], options[:file])
+	
+	# Delete a public key in wallet
+	elsif not options[:delete].nil? and not options[:key].nil?
+		cli.delete_key(options[:key])
+	
+	# Export
+	elsif not options[:export].nil? and not options[:file].nil?
+		cli.export(options[:file])
+	
+	# Import
+	elsif not options[:import].nil? and not options[:file].nil?
+		cli.import(options[:file])
+	
+	# Setup wallet config
+	elsif not options[:setup_wallet].nil?
+		cli.setup_wallet_config
+	
+	end
+	
+	cli = nil
+	
+	exit 0
+
+rescue SystemExit, Interrupt
+	exit 3
+end
diff --git a/bin/mpw-passwd b/bin/mpw-passwd
new file mode 100644
index 0000000..c99d002
--- /dev/null
+++ b/bin/mpw-passwd
@@ -0,0 +1,50 @@
+#!/usr/bin/ruby
+# MPW is a software to crypt and manage your passwords
+# Copyright (C) 2016  Adrien Waksberg <mpw@yae.im>
+# 
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+# 
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+
+require 'optparse'
+require 'mpw/mpw'
+
+options = {}
+
+OptionParser.new do |opts|
+	opts.banner = "#{I18n.t('option.usage')}: mpw-passwd [options]"
+
+	opts.on('-h', '--help', I18n.t('option.help')) do
+		puts opts
+		exit 0
+	end
+
+	opts.on('-l', '--length NUMBER', I18n.t('option.length')) do |length|
+		options[:length] = length.to_i
+	end
+
+	opts.on('-n', '--numeric', I18n.t('option.numeric')) do
+		options[:numeric] = true
+	end
+
+	opts.on('-s', '--special-chars', I18n.t('option.special_chars')) do
+		options[:special] = true
+	end
+
+	opts.on('-a', '--alpha', I18n.t('option.alpha')) do
+		options[:alpha] = true
+	end
+end.parse!
+
+puts MPW::MPW::password(options)
+exit 0