1
0
Fork 0
mirror of https://github.com/nishiki/manage-password.git synced 2024-11-23 05:47:53 +00:00

remove all sync

This commit is contained in:
Adrien Waksberg 2017-03-27 21:47:43 +02:00
parent 2e6d111b69
commit 871b1dcbed
16 changed files with 20 additions and 421 deletions

View file

@ -11,7 +11,6 @@ mpw is a little software which stores your passwords in [GnuPG](http://www.gnupg
* generate OTP code
* copy your login, password or otp in clipboard
* manage many wallets
* synchronize your passwords with SSH or FTP.
* share a wallet with others GPG keys
## Install
@ -105,11 +104,6 @@ Remove a GPG key:
mpw wallet --delete-gpg-key test42@localhost.com
```
Add synchronize:
```
mpw wallet --protocol ssh --host example.com --user test --path /remote/path --password
```
### Export and import data
You can export your data in yaml file with your passwords in clear text:

View file

@ -24,8 +24,7 @@ require 'mpw/cli'
# Options
# --------------------------------------------------------- #
options = {}
options[:sync] = true
options = {}
OptionParser.new do |opts|
opts.banner = "#{I18n.t('option.usage')}: mpw add [options]"
@ -39,10 +38,6 @@ OptionParser.new do |opts|
exit 0
end
opts.on('-n', '--no-sync', I18n.t('option.no_sync')) do
options[:sync] = false
end
opts.on('-r', '--random', I18n.t('option.random_password')) do
options[:password] = true
end
@ -53,7 +48,7 @@ OptionParser.new do |opts|
end.parse!
config = MPW::Config.new(options[:config])
cli = MPW::Cli.new(config, options[:sync])
cli = MPW::Cli.new(config)
cli.load_config
cli.get_wallet(options[:wallet])

View file

@ -25,7 +25,6 @@ require 'mpw/cli'
# --------------------------------------------------------- #
options = {}
options[:sync] = true
options[:clipboard] = true
values = {}
@ -49,10 +48,6 @@ OptionParser.new do |opts|
exit 0
end
opts.on('-n', '--no-sync', I18n.t('option.no_sync')) do
options[:sync] = false
end
opts.on('-p', '--pattern PATTERN', I18n.t('option.pattern')) do |pattern|
values[:pattern] = pattern
end
@ -63,7 +58,7 @@ OptionParser.new do |opts|
end.parse!
config = MPW::Config.new(options[:config])
cli = MPW::Cli.new(config, options[:sync])
cli = MPW::Cli.new(config)
cli.load_config
cli.get_wallet(options[:wallet])

View file

@ -24,9 +24,8 @@ require 'mpw/cli'
# Options
# --------------------------------------------------------- #
options = {}
options[:sync] = true
values = {}
options = {}
values = {}
OptionParser.new do |opts|
opts.banner = "#{I18n.t('option.usage')}: mpw delete [options]"
@ -44,10 +43,6 @@ OptionParser.new do |opts|
exit 0
end
opts.on('-n', '--no-sync', I18n.t('option.no_sync')) do
options[:sync] = false
end
opts.on('-p', '--pattern PATTERN', I18n.t('option.pattern')) do |pattern|
values[:pattern] = pattern
end
@ -58,7 +53,7 @@ OptionParser.new do |opts|
end.parse!
config = MPW::Config.new(options[:config])
cli = MPW::Cli.new(config, options[:sync])
cli = MPW::Cli.new(config)
cli.load_config
cli.get_wallet(options[:wallet])

View file

@ -24,9 +24,8 @@ require 'mpw/cli'
# Options
# --------------------------------------------------------- #
options = {}
options[:sync] = true
values = {}
options = {}
values = {}
OptionParser.new do |opts|
opts.banner = "#{I18n.t('option.usage')}: mpw wallet [options]"
@ -48,10 +47,6 @@ OptionParser.new do |opts|
exit 0
end
opts.on('-n', '--no-sync', I18n.t('option.no_sync')) do
options[:sync] = false
end
opts.on('-p', '--pattern PATTERN', I18n.t('option.pattern')) do |pattern|
values[:pattern] = pattern
end
@ -62,7 +57,7 @@ OptionParser.new do |opts|
end.parse!
config = MPW::Config.new(options[:config])
cli = MPW::Cli.new(config, options[:sync])
cli = MPW::Cli.new(config)
cli.load_config
cli.get_wallet(options[:wallet])

View file

@ -24,8 +24,7 @@ require 'mpw/cli'
# Options
# --------------------------------------------------------- #
options = {}
options[:sync] = true
options = {}
OptionParser.new do |opts|
opts.banner = "#{I18n.t('option.usage')}: mpw import [options]"
@ -43,17 +42,13 @@ OptionParser.new do |opts|
exit 0
end
opts.on('-n', '--no-sync', I18n.t('option.no_sync')) do
options[:sync] = false
end
opts.on('-w', '--wallet NAME', I18n.t('option.wallet')) do |wallet|
options[:wallet] = wallet
end
end.parse!
config = MPW::Config.new(options[:config])
cli = MPW::Cli.new(config, options[:sync])
cli = MPW::Cli.new(config)
cli.load_config
cli.get_wallet(options[:wallet])

View file

@ -24,9 +24,8 @@ require 'mpw/cli'
# Options
# --------------------------------------------------------- #
options = {}
options[:sync] = true
values = {}
options = {}
values = {}
OptionParser.new do |opts|
opts.banner = "#{I18n.t('option.usage')}: mpw list [options]"
@ -48,17 +47,13 @@ OptionParser.new do |opts|
values[:pattern] = pattern
end
opts.on('-n', '--no-sync', I18n.t('option.no_sync')) do
options[:sync] = false
end
opts.on('-w', '--wallet NAME', I18n.t('option.wallet')) do |wallet|
options[:wallet] = wallet
end
end.parse!
config = MPW::Config.new(options[:config])
cli = MPW::Cli.new(config, options[:sync])
cli = MPW::Cli.new(config)
cli.load_config
cli.get_wallet(options[:wallet])

View file

@ -24,9 +24,8 @@ require 'mpw/cli'
# Options
# --------------------------------------------------------- #
options = {}
options[:sync] = true
values = {}
options = {}
values = {}
OptionParser.new do |opts|
opts.banner = "#{I18n.t('option.usage')}: mpw update [options]"
@ -44,10 +43,6 @@ OptionParser.new do |opts|
exit 0
end
opts.on('-n', '--no-sync', I18n.t('option.no_sync')) do
options[:sync] = false
end
opts.on('-p', '--pattern PATTERN', I18n.t('option.pattern')) do |pattern|
values[:pattern] = pattern
end
@ -62,7 +57,7 @@ OptionParser.new do |opts|
end.parse!
config = MPW::Config.new(options[:config])
cli = MPW::Cli.new(config, options[:sync])
cli = MPW::Cli.new(config)
cli.load_config
cli.get_wallet(options[:wallet])

View file

@ -25,9 +25,7 @@ require 'mpw/cli'
# --------------------------------------------------------- #
options = {}
options[:sync] = {}
options[:delete] = false
values = {}
OptionParser.new do |opts|
opts.banner = "#{I18n.t('option.usage')}: mpw wallet [options]"
@ -50,10 +48,6 @@ OptionParser.new do |opts|
exit 0
end
opts.on('--host NAME', I18n.t('option.host')) do |host|
values[:host] = host
end
opts.on('-l', '--list', I18n.t('option.list')) do
options[:list] = true
end
@ -62,37 +56,13 @@ OptionParser.new do |opts|
options[:list_keys] = true
end
opts.on('-n', '--no-sync', I18n.t('option.no_sync')) do
options[:sync] = false
end
opts.on('--password', I18n.t('option.password')) do
values[:password] = true
end
opts.on('--path PATH', I18n.t('option.path')) do |path|
values[:path] = path
end
opts.on('--port NUMBER', I18n.t('option.port')) do |port|
values[:port] = port
end
opts.on('--protocol NAME', I18n.t('option.protocol')) do |protocol|
values[:protocol] = protocol
end
opts.on('--user NAME', I18n.t('option.user')) do |user|
values[:user] = user
end
opts.on('-w', '--wallet NAME', I18n.t('option.wallet')) do |wallet|
options[:wallet] = wallet
end
end.parse!
config = MPW::Config.new(options[:config])
cli = MPW::Cli.new(config, options[:sync])
cli = MPW::Cli.new(config)
cli.load_config
@ -110,7 +80,5 @@ else
else
cli.add_key(options[:gpg_key])
end
elsif not values.empty?
cli.setup_wallet_config(values)
end
end

View file

@ -23,15 +23,6 @@ en:
import: "Can't import, unable to read %{file}!"
update:
host_empty: "You must define a host!"
sync:
general: "An error has appeared during the sync"
connection: "Connection fail!"
communication: "A communication problem with the server is appeared!"
download: "Can't download the file!"
not_authorized: "You haven't the access to remote file!"
upload: "Can't upload the file on the server!"
unknown: "An unknown error is occured!"
unknown_type: "The sync type is unknown"
warning:
select: 'Your choice is not a valid element!'
@ -68,7 +59,6 @@ en:
gpg_key: "Specify a GPG key (ex: user@example.com)"
group: "Search the items with specified group"
help: "Show this help message"
host: "Specify the server for the synchronization"
init: "Initialize mpw"
import: "Import item since a yaml file"
key: "Specify the key name"
@ -76,13 +66,8 @@ en:
length: "Size of the password"
list: "List the wallets"
list_keys: "List the GPG keys in wallet"
no_sync: "Disable synchronization with the server"
numeric: "Use number to generate a password"
password: "Change the password for the synchronization"
path: "Specify the remote path"
pattern: "Given search pattern"
port: "Specify the connection port"
protocol: "Specify the protocol for the connection"
random_password: "Generate a random password"
setup: "Create a new configuration file"
setup_wallet: "Create a new configuration file for a wallet"
@ -90,7 +75,6 @@ en:
show: "Search and show the items"
show_all: "List all items"
usage: "Usage"
user: "Specify the user for the connection"
wallet: "Specify a wallet to use"
wallet_dir: "Set the wallets folder"
@ -141,16 +125,6 @@ en:
gpg_exe: "Enter the executable GPG path (optional): "
wallet_dir: "Enter the wallets's folder path [default=%{home}/wallets]: "
valid: "The config file has been created!"
setup_wallet:
password: "Sync password: "
title: "Wallet setup"
sync_type: "Synchronization type (ssh, ftp): "
sync_host: "Synchronization server: "
sync_port: "Port of the synchronization server: "
sync_user: "Username for the synchronization: "
sync_pwd: "Password for the synchronization: "
sync_path: "File path for the synchronization : "
valid: "The wallet config file has been created!"
setup_gpg_key:
title: "Setup a GPG key"
ask: "Do you want create your GPG key ? (Y/n)"

View file

@ -23,15 +23,6 @@ fr:
import: "Impossible d'importer le fichier %{file}, car il n'est pas lisible!"
update:
host_empty: "Vous devez définir un host!"
sync:
general: "Une erreur est survenue durant la synchronisation"
connection: "La connexion n'a pu être établie!"
communication: "Un problème de communication avec le serveur est apparu!"
download: "Impossible de télécharger le fichier!"
not_authorized: "Vous n'avez pas les autorisations d'accès au fichier distant!"
upload: "Impossible d'envoyer le fichier sur le serveur!"
unknown: "Une erreur inconnue est survenue!"
unknown_type: "Le type de synchronisation est inconnu"
warning:
select: "Votre choix n'est pas un élément valide!"
@ -68,7 +59,6 @@ fr:
gpg_key: "Spécifie une clé GPG (ex: user@example.com)"
group: "Recherche les éléments appartenant au groupe spécifié"
help: "Affiche ce message d'aide"
host: "Spécifie le serveur pour la synchronisation"
import: "Importe des éléments depuis un fichier yaml"
init: "Initialise mpw"
key: "Spécifie le nom d'une clé"
@ -76,13 +66,8 @@ fr:
length: "Taille du mot de passe"
list: "Liste les portefeuilles"
list_keys: "Liste les clés GPG dans le portefeuille"
no_sync: "Désactive la synchronisation avec le serveur"
numeric: "Utilise des chiffre dans la génération d'un mot de passe"
password: "Changer le mot de passe de connexion"
path: "Spécifie le chemin distant"
pattern: "Motif de donnée à chercher"
port: "Spécifie le port de connexion"
protocol: "Spécifie le protocol utilisé pour la connexion"
random_password: "Génére un mot de passe aléatoire"
setup: "Création d'un nouveau fichier de configuration"
setup_wallet: "Création d'un nouveau fichier de configuration pour un portefeuille"
@ -90,7 +75,6 @@ fr:
show: "Recherche et affiche les éléments"
show_all: "Liste tous les éléments"
usage: "Utilisation"
user: "Spécifie l'identifiant de connection"
wallet: "Spécifie le portefeuille à utiliser"
wallet_dir: "Spécifie le répertoire des portefeuilles"
@ -141,16 +125,6 @@ fr:
gpg_exe: "Entrez le chemin de l'exécutable GPG (optionnel): "
wallet_dir: "Entrez le chemin du répertoire qui contiendra les porte-feuilles de mot de passe [défaut=%{home}/wallets]: "
valid: "Le fichier de configuration a bien été créé!"
setup_wallet:
password: "Mot de passe de synchronisation: "
title: "Configuration du porte-feuille"
sync_type: "Type de synchronisation (ssh, ftp): "
sync_host: "Serveur: "
sync_port: "Port: "
sync_user: "Utilisateur: "
sync_pwd: "Mot de passe: "
sync_path: "Chemin du fichier: "
valid: "Le fichier de configuration du porte-feuille a bien été créé!"
setup_gpg_key:
title: "Configuration d'une nouvelle clé GPG"
ask: "Voulez vous créer votre clé GPG ? (O/n)"

View file

@ -31,10 +31,8 @@ class Cli
# Constructor
# @args: config -> the config
# sync -> boolean for sync or not
def initialize(config, sync=true)
@config = config
@sync = sync
def initialize(config)
@config = config
end
# Change a parameter int the config after init
@ -89,26 +87,6 @@ class Cli
exit 2
end
# Setup wallet config for sync
# @args: options -> value to change
def setup_wallet_config(options={})
if not options[:password].nil?
options[:password] = ask(I18n.t('form.setup_wallet.password')) {|q| q.echo = false}
end
#wallet_file = wallet.nil? ? "#{@config.wallet_dir}/default.mpw" : "#{@config.wallet_dir}/#{wallet}.mpw"
@mpw = MPW.new(@config.gpg_key, @wallet_file, @password, @config.gpg_exe)
@mpw.read_data
@mpw.set_config(options)
@mpw.write_data
puts "#{I18n.t('form.setup_wallet.valid')}".green
rescue Exception => e
puts "#{I18n.t('display.error')} #10: #{e}".red
exit 2
end
# List gpg keys in wallet
def list_keys
table_list('keys', @mpw.list_keys)
@ -131,7 +109,6 @@ class Cli
end
@mpw.read_data
@mpw.sync if @sync
rescue Exception => e
puts "#{I18n.t('display.error')} #11: #{e}".red
exit 2
@ -369,7 +346,6 @@ class Cli
def add_key(key)
@mpw.add_key(key)
@mpw.write_data
@mpw.sync(true) if @sync
puts "#{I18n.t('form.add_key.valid')}".green
rescue Exception => e
@ -381,7 +357,6 @@ class Cli
def delete_key(key)
@mpw.delete_key(key)
@mpw.write_data
@mpw.sync(true) if @sync
puts "#{I18n.t('form.delete_key.valid')}".green
rescue Exception => e
@ -431,7 +406,6 @@ class Cli
@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.add_item.valid')}".green
rescue Exception => e
@ -457,7 +431,6 @@ class Cli
@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.valid')}".green
end
@ -484,7 +457,6 @@ class Cli
item.delete
@mpw.write_data
@mpw.sync(true) if @sync
puts "#{I18n.t('form.delete_item.valid')}".green
end

View file

@ -30,7 +30,6 @@ class Item
attr_accessor :otp
attr_accessor :comment
attr_accessor :last_edit
attr_accessor :last_sync
attr_accessor :created
# Constructor
@ -72,11 +71,6 @@ class Item
@last_edit = Time.now.to_i if not options.has_key?(:no_update_last_edit)
end
# Update last_sync
def set_last_sync
@last_sync = Time.now.to_i
end
# Delete all data
def delete
@id = nil
@ -89,7 +83,6 @@ class Item
@comment = nil
@created = nil
@last_edit = nil
@last_sync = nil
end
def empty?

View file

@ -229,7 +229,6 @@ class MPW
@config['user'] = options[:user] if options.has_key?(:user)
@config['password'] = options[:password] if options.has_key?(:password)
@config['path'] = options[:path] if options.has_key?(:path)
@config['last_sync'] = @config['last_sync'].nil? ? 0 : @config['last_sync']
end
# Add a new item
@ -281,111 +280,6 @@ class MPW
return nil
end
# Get last sync
def get_last_sync
return @config['last_sync'].to_i
rescue
return 0
end
# Sync data with remote file
# @args: force -> force the sync
def sync(force=false)
return if @config.empty? or @config['protocol'].to_s.empty?
return if get_last_sync + 300 > Time.now.to_i and not force
tmp_file = "#{@wallet_file}.sync"
case @config['protocol']
when 'sftp', 'scp', 'ssh'
require "mpw/sync/ssh"
sync = SyncSSH.new(@config)
when 'ftp'
require 'mpw/sync/ftp'
sync = SyncFTP.new(@config)
else
raise I18n.t('error.sync.unknown_type')
end
sync.connect
sync.get(tmp_file)
remote = MPW.new(@key, tmp_file, @gpg_pass, @gpg_exe)
remote.read_data
File.unlink(tmp_file) if File.exist?(tmp_file)
return if remote.get_last_sync == @config['last_update']
if not remote.to_s.empty?
@data.each do |item|
next if item.empty?
update = false
remote.list.each do |r|
next if item.id != r.id
# Update item
if item.last_edit < r.last_edit
item.update(group: r.group,
host: r.host,
protocol: r.protocol,
user: r.user,
port: r.port,
comment: r.comment
)
set_password(item.id, remote.get_password(item.id))
end
r.delete
update = true
break
end
# Remove an old item
if not update and item.last_sync.to_i < get_last_sync and item.last_edit < get_last_sync
item.delete
end
end
end
# Add item
remote.list.each do |r|
next if r.last_edit <= get_last_sync
item = Item.new(id: r.id,
group: r.group,
host: r.host,
protocol: r.protocol,
user: r.user,
port: r.port,
comment: r.comment,
created: r.created,
last_edit: r.last_edit
)
set_password(item.id, remote.get_password(item.id))
add(item)
end
remote = nil
@data.each do |item|
item.set_last_sync
end
@config['last_sync'] = Time.now.to_i
write_data
sync.update(@wallet_file)
rescue Exception => e
File.unlink(tmp_file) if File.exist?(tmp_file)
raise "#{I18n.t('error.sync.general')}\n#{e}"
end
# Set an opt key
# args: id -> the item id
# key -> the new key

View file

@ -1,68 +0,0 @@
#!/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 'i18n'
require 'net/ftp'
module MPW
class FTP
# Constructor
# @args: config -> the config
def initialize(config)
@host = config['host']
@user = config['user']
@password = config['password']
@path = config['path']
@port = config['port'].instance_of?(Integer) ? 22 : config['port']
end
# Connect to server
def connect
Net::FTP.open(@host) do |ftp|
ftp.login(@user, @password)
break
end
rescue Exception => e
raise "#{I18n.t('error.sync.connection')}\n#{e}"
end
# Get data on server
# @args: file_tmp -> the path where download the file
def get(file_tmp)
Net::FTP.open(@host) do |ftp|
ftp.login(@user, @password)
ftp.gettextfile(@path, file_tmp)
end
rescue Exception => e
raise "#{I18n.t('error.sync.download')}\n#{e}"
end
# Update the remote data
# @args: file_gpg -> the data to send on server
def update(file_gpg)
Net::FTP.open(@host) do |ftp|
ftp.login(@user, @password)
ftp.puttextfile(file_gpg, @path)
end
rescue Exception => e
raise "#{I18n.t('error.sync.upload')}\n#{e}"
end
end
end

View file

@ -1,67 +0,0 @@
#!/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 'i18n'
require 'net/ssh'
require 'net/sftp'
module MPW
class SyncSSH
# Constructor
# @args: config -> the config
def initialize(config)
@host = config['host']
@user = config['user']
@password = config['password']
@path = config['path']
@port = config['port'].instance_of?(Integer) ? 22 : config['port']
end
# Connect to server
def connect
Net::SSH.start(@host, @user, password: @password, port: @port) do
break
end
rescue Exception => e
raise "#{I18n.t('error.sync.connection')}\n#{e}"
end
# Get data on server
# @args: file_tmp -> the path where download the file
def get(file_tmp)
Net::SFTP.start(@host, @user, password: @password, port: @port) do |sftp|
sftp.lstat(@path) do |response|
sftp.download!(@path, file_tmp) if response.ok?
end
end
rescue Exception => e
raise "#{I18n.t('error.sync.download')}\n#{e}"
end
# Update the remote data
# @args: file_gpg -> the data to send on server
def update(file_gpg)
Net::SFTP.start(@host, @user, password: @password, port: @port) do |sftp|
sftp.upload!(file_gpg, @path)
end
rescue Exception => e
raise "#{I18n.t('error.sync.upload')}\n#{e}"
end
end
end