mpw 2.0.3 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/Gemfile +3 -5
- data/README.md +115 -6
- data/VERSION +1 -1
- data/bin/mpw +90 -58
- data/i18n/{cli/en.yml → en.yml} +43 -49
- data/i18n/{cli/fr.yml → fr.yml} +45 -51
- data/lib/mpw/config.rb +117 -206
- data/lib/mpw/item.rb +98 -88
- data/lib/mpw/mpw.rb +416 -288
- data/lib/mpw/sync/ftp.rb +55 -68
- data/lib/mpw/sync/ssh.rb +52 -65
- data/lib/mpw/ui/cli.rb +201 -175
- data/mpw.gemspec +9 -8
- metadata +28 -29
- data/bin/mpw-server +0 -78
- data/bin/mpw-ssh +0 -89
- data/i18n/server/en.yml +0 -26
- data/i18n/server/fr.yml +0 -26
- data/lib/mpw/server.rb +0 -343
- data/lib/mpw/sync/mpw.rb +0 -124
- data/lib/mpw/sync.rb +0 -138
- data/lib/mpw/ui/clissh.rb +0 -42
data/lib/mpw/ui/cli.rb
CHANGED
@@ -1,92 +1,65 @@
|
|
1
1
|
#!/usr/bin/ruby
|
2
|
-
#
|
3
|
-
#
|
4
|
-
#
|
2
|
+
# MPW is a software to crypt and manage your passwords
|
3
|
+
# Copyright (C) 2016 Adrien Waksberg <mpw@yae.im>
|
4
|
+
#
|
5
|
+
# This program is free software; you can redistribute it and/or
|
6
|
+
# modify it under the terms of the GNU General Public License
|
7
|
+
# as published by the Free Software Foundation; either version 2
|
8
|
+
# of the License, or (at your option) any later version.
|
9
|
+
#
|
10
|
+
# This program is distributed in the hope that it will be useful,
|
11
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
13
|
+
# GNU General Public License for more details.
|
14
|
+
#
|
15
|
+
# You should have received a copy of the GNU General Public License
|
16
|
+
# along with this program; if not, write to the Free Software
|
17
|
+
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
5
18
|
|
6
|
-
require 'rubygems'
|
7
|
-
require 'highline/import'
|
8
|
-
require 'pathname'
|
9
19
|
require 'readline'
|
10
20
|
require 'i18n'
|
11
21
|
require 'colorize'
|
12
|
-
require '
|
13
|
-
|
14
|
-
|
22
|
+
require 'highline/import'
|
23
|
+
|
24
|
+
#TODO
|
25
|
+
require "#{APP_ROOT}/../lib/mpw/item.rb"
|
26
|
+
require "#{APP_ROOT}/../lib/mpw/mpw.rb"
|
15
27
|
|
28
|
+
module MPW
|
16
29
|
class Cli
|
17
30
|
|
18
31
|
# Constructor
|
19
|
-
# @args:
|
20
|
-
#
|
21
|
-
def initialize(config)
|
32
|
+
# @args: config -> the config
|
33
|
+
# sync -> boolean for sync or not
|
34
|
+
def initialize(config, sync=true)
|
22
35
|
@config = config
|
23
|
-
|
24
|
-
|
25
|
-
# Sync the data with the server
|
26
|
-
# @args: allow_sync -> allow or disable sync (boolean)
|
27
|
-
# @rtnr: true if the synchro is finish
|
28
|
-
def sync(allow_sync=nil)
|
29
|
-
if not allow_sync.nil?
|
30
|
-
@allow_sync = allow_sync
|
31
|
-
end
|
32
|
-
|
33
|
-
return true if not @allow_sync
|
34
|
-
|
35
|
-
@sync = MPW::Sync.new(@config, @mpw, @password)
|
36
|
-
|
37
|
-
raise(@sync.error_msg) if not @sync.get_remote
|
38
|
-
raise(@sync.error_msg) if not @sync.sync
|
39
|
-
|
40
|
-
return true
|
41
|
-
rescue Exception => e
|
42
|
-
puts "#{I18n.t('display.error')} #7: #{e}".red
|
43
|
-
return false
|
36
|
+
@sync = sync
|
44
37
|
end
|
45
38
|
|
46
39
|
# Create a new config file
|
47
40
|
# @args: lang -> the software language
|
48
41
|
def setup(lang)
|
49
|
-
puts I18n.t('form.
|
42
|
+
puts I18n.t('form.setup_config.title')
|
50
43
|
puts '--------------------'
|
51
|
-
language
|
52
|
-
key
|
53
|
-
|
54
|
-
|
55
|
-
sync_type = ask(I18n.t('form.setup.sync_type')).to_s
|
56
|
-
|
57
|
-
if ['ssh', 'ftp', 'mpw'].include?(sync_type)
|
58
|
-
sync_host = ask(I18n.t('form.setup.sync_host')).to_s
|
59
|
-
sync_port = ask(I18n.t('form.setup.sync_port')).to_s
|
60
|
-
sync_user = ask(I18n.t('form.setup.sync_user')).to_s
|
61
|
-
sync_pwd = ask(I18n.t('form.setup.sync_pwd')).to_s
|
62
|
-
sync_path = ask(I18n.t('form.setup.sync_path')).to_s
|
63
|
-
end
|
64
|
-
|
44
|
+
language = ask(I18n.t('form.setup_config.lang', lang: lang)).to_s
|
45
|
+
key = ask(I18n.t('form.setup_config.gpg_key')).to_s
|
46
|
+
wallet_dir = ask(I18n.t('form.setup_config.wallet_dir', home: "#{@config.config_dir}")).to_s
|
47
|
+
|
65
48
|
if language.nil? or language.empty?
|
66
49
|
language = lang
|
67
50
|
end
|
68
51
|
I18n.locale = language.to_sym
|
69
52
|
|
70
|
-
|
71
|
-
sync_host = sync_host.nil? or sync_host.empty? ? nil : sync_host
|
72
|
-
sync_port = sync_port.nil? or sync_port.empty? ? nil : sync_port.to_i
|
73
|
-
sync_user = sync_user.nil? or sync_user.empty? ? nil : sync_user
|
74
|
-
sync_pwd = sync_pwd.nil? or sync_pwd.empty? ? nil : sync_pwd
|
75
|
-
sync_path = sync_path.nil? or sync_path.empty? ? nil : sync_path
|
53
|
+
@config.setup(key, lang, wallet_dir)
|
76
54
|
|
77
|
-
|
78
|
-
puts "#{I18n.t('form.setup.valid')}".green
|
79
|
-
else
|
80
|
-
puts "#{I18n.t('display.error')} #8: #{@config.error_msg}".red
|
81
|
-
exit 2
|
82
|
-
end
|
55
|
+
raise I18n.t('error.config.check') if not @config.is_valid?
|
83
56
|
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
57
|
+
puts "#{I18n.t('form.setup_config.valid')}".green
|
58
|
+
rescue Exception => e
|
59
|
+
puts "#{I18n.t('display.error')} #8: #{e}".red
|
60
|
+
exit 2
|
88
61
|
end
|
89
|
-
|
62
|
+
|
90
63
|
# Setup a new GPG key
|
91
64
|
def setup_gpg_key
|
92
65
|
puts I18n.t('form.setup_gpg_key.title')
|
@@ -94,8 +67,7 @@ class Cli
|
|
94
67
|
ask = ask(I18n.t('form.setup_gpg_key.ask')).to_s
|
95
68
|
|
96
69
|
if not ['Y', 'y', 'O', 'o'].include?(ask)
|
97
|
-
|
98
|
-
exit 2
|
70
|
+
raise I18n.t('form.setup_gpg_key.no_create')
|
99
71
|
end
|
100
72
|
|
101
73
|
name = ask(I18n.t('form.setup_gpg_key.name')).to_s
|
@@ -103,8 +75,7 @@ class Cli
|
|
103
75
|
confirm = ask(I18n.t('form.setup_gpg_key.confirm_password')) {|q| q.echo = false}
|
104
76
|
|
105
77
|
if password != confirm
|
106
|
-
|
107
|
-
exit 2
|
78
|
+
raise I18n.t('form.setup_gpg_key.error_password')
|
108
79
|
end
|
109
80
|
|
110
81
|
length = ask(I18n.t('form.setup_gpg_key.length')).to_s
|
@@ -116,25 +87,49 @@ class Cli
|
|
116
87
|
|
117
88
|
puts I18n.t('form.setup_gpg_key.wait')
|
118
89
|
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
90
|
+
@config.setup_gpg_key(password, name, length, expire)
|
91
|
+
|
92
|
+
puts "#{I18n.t('form.setup_gpg_key.valid')}".green
|
93
|
+
rescue Exception => e
|
94
|
+
puts "#{I18n.t('display.error')} #8: #{e}".red
|
95
|
+
exit 2
|
125
96
|
end
|
126
97
|
|
98
|
+
# Setup wallet config for sync
|
99
|
+
def setup_wallet_config
|
100
|
+
config = {}
|
101
|
+
config['sync'] = {}
|
102
|
+
|
103
|
+
puts I18n.t('form.setup_wallet.title')
|
104
|
+
puts '--------------------'
|
105
|
+
config['sync']['type'] = ask(I18n.t('form.setup_wallet.sync_type')).to_s
|
106
|
+
config['sync']['host'] = ask(I18n.t('form.setup_wallet.sync_host')).to_s
|
107
|
+
config['sync']['port'] = ask(I18n.t('form.setup_wallet.sync_port')).to_s
|
108
|
+
config['sync']['user'] = ask(I18n.t('form.setup_wallet.sync_user')).to_s
|
109
|
+
config['sync']['password'] = ask(I18n.t('form.setup_wallet.sync_pwd')).to_s
|
110
|
+
config['sync']['path'] = ask(I18n.t('form.setup_wallet.sync_path')).to_s
|
111
|
+
|
112
|
+
@mpw.set_config(config)
|
113
|
+
@mpw.write_data
|
114
|
+
|
115
|
+
puts "#{I18n.t('form.setup_wallet.valid')}".green
|
116
|
+
rescue Exception => e
|
117
|
+
puts "#{I18n.t('display.error')} #10: #{e}".red
|
118
|
+
exit 2
|
119
|
+
end
|
120
|
+
|
127
121
|
# Request the GPG password and decrypt the file
|
128
122
|
def decrypt
|
129
123
|
if not defined?(@mpw)
|
130
|
-
@
|
124
|
+
@password = ask(I18n.t('display.gpg_password')) {|q| q.echo = false}
|
125
|
+
@mpw = MPW.new(@config.key, @wallet_file, @password)
|
131
126
|
end
|
132
127
|
|
133
|
-
@
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
128
|
+
@mpw.read_data
|
129
|
+
@mpw.sync if @sync
|
130
|
+
rescue Exception => e
|
131
|
+
puts "#{I18n.t('display.error')} #11: #{e}".red
|
132
|
+
exit 2
|
138
133
|
end
|
139
134
|
|
140
135
|
# Display the query's result
|
@@ -185,41 +180,96 @@ class Cli
|
|
185
180
|
print "#{I18n.t('display.login')}: ".cyan
|
186
181
|
puts item.user
|
187
182
|
print "#{I18n.t('display.password')}: ".cyan
|
188
|
-
puts item.
|
183
|
+
puts @mpw.get_password(item.id)
|
189
184
|
print "#{I18n.t('display.port')}: ".cyan
|
190
185
|
puts item.port
|
191
186
|
print "#{I18n.t('display.comment')}: ".cyan
|
192
187
|
puts item.comment
|
193
188
|
end
|
194
189
|
|
195
|
-
#
|
196
|
-
|
197
|
-
|
190
|
+
# Display the wallet
|
191
|
+
# @args: wallet -> the wallet name
|
192
|
+
def get_wallet(wallet=nil)
|
193
|
+
if wallet.to_s.empty?
|
194
|
+
wallets = Dir.glob("#{@config.wallet_dir}/*.mpw")
|
198
195
|
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
options[:protocol] = ask(I18n.t('form.add.protocol')).to_s
|
205
|
-
options[:user] = ask(I18n.t('form.add.login')).to_s
|
206
|
-
options[:password] = ask(I18n.t('form.add.password')).to_s
|
207
|
-
options[:port] = ask(I18n.t('form.add.port')).to_s
|
208
|
-
options[:comment] = ask(I18n.t('form.add.comment')).to_s
|
209
|
-
|
210
|
-
item = MPW::Item.new(options)
|
211
|
-
if @mpw.add(item)
|
212
|
-
if @mpw.encrypt
|
213
|
-
sync
|
214
|
-
puts "#{I18n.t('form.add.valid')}".green
|
196
|
+
case wallets.length
|
197
|
+
when 0
|
198
|
+
puts I18n.t('display.nothing')
|
199
|
+
when 1
|
200
|
+
@wallet_file = wallets[0]
|
215
201
|
else
|
216
|
-
|
202
|
+
i = 1
|
203
|
+
wallets.each do |wallet|
|
204
|
+
print "#{i}: ".cyan
|
205
|
+
puts File.basename(wallet, '.mpw')
|
206
|
+
|
207
|
+
i += 1
|
208
|
+
end
|
209
|
+
|
210
|
+
choice = ask(I18n.t('form.select')).to_i
|
211
|
+
|
212
|
+
if choice >= 1 and choice < i
|
213
|
+
@wallet_file = wallets[choice-1]
|
214
|
+
else
|
215
|
+
puts "#{I18n.t('display.warning')}: #{I18n.t('warning.select')}".yellow
|
216
|
+
end
|
217
217
|
end
|
218
218
|
else
|
219
|
-
|
219
|
+
@wallet_file = "#{@config.wallet_dir}/#{wallet}.mpw"
|
220
220
|
end
|
221
221
|
end
|
222
222
|
|
223
|
+
# Add a new public key
|
224
|
+
# args: key -> the key name to add
|
225
|
+
# file -> gpg public file to import
|
226
|
+
def add_key(key, file=nil)
|
227
|
+
@mpw.add_key(key, file)
|
228
|
+
@mpw.write_data
|
229
|
+
@mpw.sync if @sync
|
230
|
+
|
231
|
+
puts "#{I18n.t('form.add_key.valid')}".green
|
232
|
+
rescue Exception => e
|
233
|
+
puts "#{I18n.t('display.error')} #13: #{e}".red
|
234
|
+
end
|
235
|
+
|
236
|
+
# Add new public key
|
237
|
+
# args: key -> the key name to delete
|
238
|
+
def delete_key(key)
|
239
|
+
@mpw.delete_key(key)
|
240
|
+
@mpw.write_data
|
241
|
+
@mpw.sync if @sync
|
242
|
+
|
243
|
+
puts "#{I18n.t('form.delete_key.valid')}".green
|
244
|
+
rescue Exception => e
|
245
|
+
puts "#{I18n.t('display.error')} #15: #{e}".red
|
246
|
+
end
|
247
|
+
|
248
|
+
# Form to add a new item
|
249
|
+
def add
|
250
|
+
options = {}
|
251
|
+
|
252
|
+
puts I18n.t('form.add_item.title')
|
253
|
+
puts '--------------------'
|
254
|
+
options[:name] = ask(I18n.t('form.add_item.name')).to_s
|
255
|
+
options[:group] = ask(I18n.t('form.add_item.group')).to_s
|
256
|
+
options[:host] = ask(I18n.t('form.add_item.server')).to_s
|
257
|
+
options[:protocol] = ask(I18n.t('form.add_item.protocol')).to_s
|
258
|
+
options[:user] = ask(I18n.t('form.add_item.login')).to_s
|
259
|
+
password = ask(I18n.t('form.add_item.password')).to_s
|
260
|
+
options[:port] = ask(I18n.t('form.add_item.port')).to_s
|
261
|
+
options[:comment] = ask(I18n.t('form.add_item.comment')).to_s
|
262
|
+
|
263
|
+
item = Item.new(options)
|
264
|
+
|
265
|
+
@mpw.add(item)
|
266
|
+
@mpw.set_password(item.id, password)
|
267
|
+
@mpw.write_data
|
268
|
+
@mpw.sync if @sync
|
269
|
+
|
270
|
+
puts "#{I18n.t('form.add_item.valid')}".green
|
271
|
+
end
|
272
|
+
|
223
273
|
# Update an item
|
224
274
|
# @args: id -> the item's id
|
225
275
|
def update(id)
|
@@ -228,104 +278,80 @@ class Cli
|
|
228
278
|
if not item.nil?
|
229
279
|
options = {}
|
230
280
|
|
231
|
-
puts I18n.t('form.
|
281
|
+
puts I18n.t('form.update_item.title')
|
232
282
|
puts '--------------------'
|
233
|
-
options[:name] = ask(I18n.t('form.
|
234
|
-
options[:group] = ask(I18n.t('form.
|
235
|
-
options[:host] = ask(I18n.t('form.
|
236
|
-
options[:protocol] = ask(I18n.t('form.
|
237
|
-
options[:user] = ask(I18n.t('form.
|
238
|
-
|
239
|
-
options[:port] = ask(I18n.t('form.
|
240
|
-
options[:comment] = ask(I18n.t('form.
|
283
|
+
options[:name] = ask(I18n.t('form.update_item.name' , name: item.name)).to_s
|
284
|
+
options[:group] = ask(I18n.t('form.update_item.group' , group: item.group)).to_s
|
285
|
+
options[:host] = ask(I18n.t('form.update_item.server' , server: item.host)).to_s
|
286
|
+
options[:protocol] = ask(I18n.t('form.update_item.protocol', protocol: item.protocol)).to_s
|
287
|
+
options[:user] = ask(I18n.t('form.update_item.login' , login: item.user)).to_s
|
288
|
+
password = ask(I18n.t('form.update_item.password')).to_s
|
289
|
+
options[:port] = ask(I18n.t('form.update_item.port' , port: item.port)).to_s
|
290
|
+
options[:comment] = ask(I18n.t('form.update_item.comment' , comment: item.comment)).to_s
|
241
291
|
|
242
292
|
options.delete_if { |k,v| v.empty? }
|
243
293
|
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
end
|
251
|
-
else
|
252
|
-
puts "#{I18n.t('display.error')} #15: #{item.error_msg}".red
|
253
|
-
end
|
294
|
+
item.update(options)
|
295
|
+
@mpw.set_password(item.id, password) if not password.empty?
|
296
|
+
@mpw.write_data
|
297
|
+
@mpw.sync if @sync
|
298
|
+
|
299
|
+
puts "#{I18n.t('form.update_item.valid')}".green
|
254
300
|
else
|
255
301
|
puts I18n.t('display.nothing')
|
256
302
|
end
|
303
|
+
rescue Exception => e
|
304
|
+
puts "#{I18n.t('display.error')} #14: #{e}".red
|
257
305
|
end
|
258
306
|
|
259
307
|
# Remove an item
|
260
308
|
# @args: id -> the item's id
|
261
309
|
# force -> no resquest a validation
|
262
310
|
def delete(id, force=false)
|
263
|
-
|
264
|
-
item = @mpw.search_by_id(id)
|
265
|
-
|
266
|
-
if not item.nil?
|
267
|
-
display_item(item)
|
311
|
+
item = @mpw.search_by_id(id)
|
268
312
|
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
end
|
273
|
-
else
|
274
|
-
puts I18n.t('display.nothing')
|
275
|
-
end
|
313
|
+
if item.nil?
|
314
|
+
puts I18n.t('form.delete_item.not_valid', id: id)
|
315
|
+
return
|
276
316
|
end
|
277
317
|
|
278
|
-
if force
|
279
|
-
item
|
318
|
+
if not force
|
319
|
+
display_item(item)
|
280
320
|
|
281
|
-
|
282
|
-
|
283
|
-
|
284
|
-
else
|
285
|
-
puts "#{I18n.t('display.error')} #16: #{@mpw.error_msg}".red
|
321
|
+
confirm = ask("#{I18n.t('form.delete_item.ask', id: id)} (y/N) ").to_s
|
322
|
+
if not confirm =~ /^(y|yes|YES|Yes|Y)$/
|
323
|
+
return
|
286
324
|
end
|
287
325
|
end
|
326
|
+
|
327
|
+
item.delete
|
328
|
+
@mpw.write_data
|
329
|
+
@mpw.sync if @sync
|
330
|
+
|
331
|
+
puts "#{I18n.t('form.delete_item.valid', id: id)}".green
|
332
|
+
rescue Exception => e
|
333
|
+
puts "#{I18n.t('display.error')} #16: #{e}".red
|
288
334
|
end
|
289
335
|
|
290
336
|
# Export the items in a CSV file
|
291
337
|
# @args: file -> the destination file
|
292
|
-
def export(file
|
293
|
-
|
294
|
-
|
295
|
-
|
296
|
-
|
297
|
-
|
338
|
+
def export(file)
|
339
|
+
@mpw.export(file)
|
340
|
+
|
341
|
+
puts "#{I18n.t('export.export.valid', file)}".green
|
342
|
+
rescue Exception => e
|
343
|
+
puts "#{I18n.t('display.error')} #17: #{e}".red
|
298
344
|
end
|
299
345
|
|
300
|
-
# Import items from a
|
346
|
+
# Import items from a YAML file
|
301
347
|
# @args: file -> the import file
|
302
|
-
|
303
|
-
|
304
|
-
|
305
|
-
if not force
|
306
|
-
result = @mpw.import_preview(file, type)
|
307
|
-
if result.is_a?(Array) and not result.empty?
|
308
|
-
result.each do |r|
|
309
|
-
display_item(r)
|
310
|
-
end
|
348
|
+
def import(file)
|
349
|
+
@mpw.import(file)
|
350
|
+
@mpw.write_data
|
311
351
|
|
312
|
-
|
313
|
-
|
314
|
-
|
315
|
-
end
|
316
|
-
else
|
317
|
-
puts I18n.t('form.import.not_valid')
|
318
|
-
end
|
319
|
-
end
|
320
|
-
|
321
|
-
if force
|
322
|
-
if @mpw.import(file, type) and @mpw.encrypt
|
323
|
-
sync
|
324
|
-
puts "#{I18n.t('form.import.valid')}".green
|
325
|
-
else
|
326
|
-
puts "#{I18n.t('display.error')} #18: #{@mpw.error_msg}".red
|
327
|
-
end
|
328
|
-
end
|
352
|
+
puts "#{I18n.t('form.import.valid')}".green
|
353
|
+
rescue Exception => e
|
354
|
+
puts "#{I18n.t('display.error')} #18: #{e}".red
|
329
355
|
end
|
330
|
-
|
356
|
+
end
|
331
357
|
end
|
data/mpw.gemspec
CHANGED
@@ -5,22 +5,23 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
5
5
|
Gem::Specification.new do |spec|
|
6
6
|
spec.name = 'mpw'
|
7
7
|
spec.version = File.open('VERSION').read
|
8
|
-
spec.authors = ['
|
9
|
-
spec.email = ['
|
10
|
-
spec.summary = '
|
11
|
-
spec.description = '
|
8
|
+
spec.authors = ['Adrien Waksberg']
|
9
|
+
spec.email = ['mpw@yae.im']
|
10
|
+
spec.summary = 'MPW is a software to crypt and manage your passwords'
|
11
|
+
spec.description = 'Manage your passwords in all security with MPW, we use GPG to crypt your passwords'
|
12
12
|
spec.homepage = 'https://github.com/nishiki/manage-password'
|
13
|
-
spec.license = 'GPL'
|
13
|
+
spec.license = 'GPL-2.0'
|
14
14
|
|
15
15
|
spec.files = `git ls-files -z`.split("\x0")
|
16
|
-
spec.executables = ['mpw'
|
16
|
+
spec.executables = ['mpw']
|
17
17
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
18
18
|
spec.require_paths = ['lib']
|
19
19
|
|
20
|
-
spec.add_dependency "i18n"
|
20
|
+
spec.add_dependency "i18n"
|
21
21
|
spec.add_dependency "gpgme"
|
22
22
|
spec.add_dependency "highline"
|
23
23
|
spec.add_dependency "locale"
|
24
24
|
spec.add_dependency "colorize"
|
25
|
-
spec.add_dependency "net-
|
25
|
+
spec.add_dependency "net-ssh"
|
26
|
+
spec.add_dependency "net-scp"
|
26
27
|
end
|
metadata
CHANGED
@@ -1,35 +1,29 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mpw
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 3.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
|
-
-
|
7
|
+
- Adrien Waksberg
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2016-07-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: i18n
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - "~>"
|
18
|
-
- !ruby/object:Gem::Version
|
19
|
-
version: '0.6'
|
20
17
|
- - ">="
|
21
18
|
- !ruby/object:Gem::Version
|
22
|
-
version: 0
|
19
|
+
version: '0'
|
23
20
|
type: :runtime
|
24
21
|
prerelease: false
|
25
22
|
version_requirements: !ruby/object:Gem::Requirement
|
26
23
|
requirements:
|
27
|
-
- - "~>"
|
28
|
-
- !ruby/object:Gem::Version
|
29
|
-
version: '0.6'
|
30
24
|
- - ">="
|
31
25
|
- !ruby/object:Gem::Version
|
32
|
-
version: 0
|
26
|
+
version: '0'
|
33
27
|
- !ruby/object:Gem::Dependency
|
34
28
|
name: gpgme
|
35
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -87,7 +81,21 @@ dependencies:
|
|
87
81
|
- !ruby/object:Gem::Version
|
88
82
|
version: '0'
|
89
83
|
- !ruby/object:Gem::Dependency
|
90
|
-
name: net-
|
84
|
+
name: net-ssh
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
type: :runtime
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ">="
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: net-scp
|
91
99
|
requirement: !ruby/object:Gem::Requirement
|
92
100
|
requirements:
|
93
101
|
- - ">="
|
@@ -100,13 +108,12 @@ dependencies:
|
|
100
108
|
- - ">="
|
101
109
|
- !ruby/object:Gem::Version
|
102
110
|
version: '0'
|
103
|
-
description:
|
111
|
+
description: Manage your passwords in all security with MPW, we use GPG to crypt your
|
112
|
+
passwords
|
104
113
|
email:
|
105
|
-
-
|
114
|
+
- mpw@yae.im
|
106
115
|
executables:
|
107
116
|
- mpw
|
108
|
-
- mpw-server
|
109
|
-
- mpw-ssh
|
110
117
|
extensions: []
|
111
118
|
extra_rdoc_files: []
|
112
119
|
files:
|
@@ -117,22 +124,14 @@ files:
|
|
117
124
|
- README.md
|
118
125
|
- VERSION
|
119
126
|
- bin/mpw
|
120
|
-
-
|
121
|
-
-
|
122
|
-
- i18n/cli/en.yml
|
123
|
-
- i18n/cli/fr.yml
|
124
|
-
- i18n/server/en.yml
|
125
|
-
- i18n/server/fr.yml
|
127
|
+
- i18n/en.yml
|
128
|
+
- i18n/fr.yml
|
126
129
|
- lib/mpw/config.rb
|
127
130
|
- lib/mpw/item.rb
|
128
131
|
- lib/mpw/mpw.rb
|
129
|
-
- lib/mpw/server.rb
|
130
|
-
- lib/mpw/sync.rb
|
131
132
|
- lib/mpw/sync/ftp.rb
|
132
|
-
- lib/mpw/sync/mpw.rb
|
133
133
|
- lib/mpw/sync/ssh.rb
|
134
134
|
- lib/mpw/ui/cli.rb
|
135
|
-
- lib/mpw/ui/clissh.rb
|
136
135
|
- mpw.gemspec
|
137
136
|
- test/files/fixtures.yml
|
138
137
|
- test/files/test_import.csv
|
@@ -142,7 +141,7 @@ files:
|
|
142
141
|
- test/tests.rb
|
143
142
|
homepage: https://github.com/nishiki/manage-password
|
144
143
|
licenses:
|
145
|
-
- GPL
|
144
|
+
- GPL-2.0
|
146
145
|
metadata: {}
|
147
146
|
post_install_message:
|
148
147
|
rdoc_options: []
|
@@ -160,10 +159,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
160
159
|
version: '0'
|
161
160
|
requirements: []
|
162
161
|
rubyforge_project:
|
163
|
-
rubygems_version: 2.
|
162
|
+
rubygems_version: 2.5.1
|
164
163
|
signing_key:
|
165
164
|
specification_version: 4
|
166
|
-
summary:
|
165
|
+
summary: MPW is a software to crypt and manage your passwords
|
167
166
|
test_files:
|
168
167
|
- test/files/fixtures.yml
|
169
168
|
- test/files/test_import.csv
|