mpw 2.0.3 → 3.0.0

Sign up to get free protection for your applications and to get access to all the features.
data/lib/mpw/ui/cli.rb CHANGED
@@ -1,92 +1,65 @@
1
1
  #!/usr/bin/ruby
2
- # author: nishiki
3
- # mail: nishiki@yaegashi.fr
4
- # info: a simple script who m your passwords
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 'mpw/sync'
13
- require 'mpw/mpw'
14
- require 'mpw/item'
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: lang -> the operating system language
20
- # config_file -> a specify config file
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
- end
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.setup.title')
42
+ puts I18n.t('form.setup_config.title')
50
43
  puts '--------------------'
51
- language = ask(I18n.t('form.setup.lang', lang: lang)).to_s
52
- key = ask(I18n.t('form.setup.gpg_key')).to_s
53
- share_keys = ask(I18n.t('form.setup.share_gpg_keys')).to_s
54
- file_gpg = ask(I18n.t('form.setup.gpg_file', home: @conf.dir_config)).to_s
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
- sync_type = sync_type.nil? or sync_type.empty? ? nil : sync_type
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
- if @config.setup(key, share_keys, language, file_gpg, sync_type, sync_host, sync_port, sync_user, sync_pwd, sync_path)
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
- if not @config.checkconfig
85
- puts "#{I18n.t('display.error')} #9: #{@config.error_msg}".red
86
- exit 2
87
- end
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
- puts I18n.t('form.setup_gpg_key.no_create')
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
- puts I18n.t('form.setup_gpg_key.error_password')
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
- if @config.setup_gpg_key(password, name, length, expire)
120
- puts "#{I18n.t('form.setup_gpg_key.valid')}".green
121
- else
122
- puts "#{I18n.t('display.error')} #10: #{@config.error_msg}".red
123
- exit 2
124
- end
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
- @mpw = MPW::MPW.new(@config.file_gpg, @config.key, @config.share_keys)
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
- @password = ask(I18n.t('display.gpg_password')) {|q| q.echo = false}
134
- if not @mpw.decrypt(@password)
135
- puts "#{I18n.t('display.error')} #11: #{@mpw.error_msg}".red
136
- exit 2
137
- end
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.password
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
- # Form to add a new item
196
- def add
197
- options = {}
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
- puts I18n.t('form.add.title')
200
- puts '--------------------'
201
- options[:name] = ask(I18n.t('form.add.name')).to_s
202
- options[:group] = ask(I18n.t('form.add.group')).to_s
203
- options[:host] = ask(I18n.t('form.add.server')).to_s
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
- puts "#{I18n.t('display.error')} #12: #{@mpw.error_msg}".red
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
- puts "#{I18n.t('display.error')} #13: #{item.error_msg}".red
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.update.title')
281
+ puts I18n.t('form.update_item.title')
232
282
  puts '--------------------'
233
- options[:name] = ask(I18n.t('form.update.name' , name: item.name)).to_s
234
- options[:group] = ask(I18n.t('form.update.group' , group: item.group)).to_s
235
- options[:host] = ask(I18n.t('form.update.server' , server: item.host)).to_s
236
- options[:protocol] = ask(I18n.t('form.update.protocol', protocol: item.protocol)).to_s
237
- options[:user] = ask(I18n.t('form.update.login' , login: item.user)).to_s
238
- options[:password] = ask(I18n.t('form.update.password')).to_s
239
- options[:port] = ask(I18n.t('form.update.port' , port: item.port)).to_s
240
- options[:comment] = ask(I18n.t('form.update.comment' , comment: item.comment)).to_s
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
- if item.update(options)
245
- if @mpw.encrypt
246
- sync
247
- puts "#{I18n.t('form.update.valid')}".green
248
- else
249
- puts "#{I18n.t('display.error')} #14: #{@mpw.error_msg}".red
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
- if not force
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
- confirm = ask("#{I18n.t('form.delete.ask', id: id)} (y/N) ").to_s
270
- if confirm =~ /^(y|yes|YES|Yes|Y)$/
271
- force = true
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.delete
318
+ if not force
319
+ display_item(item)
280
320
 
281
- if @mpw.encrypt
282
- sync
283
- puts "#{I18n.t('form.delete.valid', id: id)}".green
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, type=:yaml)
293
- if @mpw.export(file, type)
294
- puts "#{I18n.t('export.valid', file)}".green
295
- else
296
- puts "#{I18n.t('display.error')} #17: #{@mpw.error_msg}".red
297
- end
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 CSV file
346
+ # Import items from a YAML file
301
347
  # @args: file -> the import file
302
- # force -> no resquest a validation
303
- def import(file, type=:yaml, force=false)
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
- confirm = ask("#{I18n.t('form.import.ask', file: file)} (y/N) ").to_s
313
- if confirm =~ /^(y|yes|YES|Yes|Y)$/
314
- force = true
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 = ['nishiki']
9
- spec.email = ['gems@yae.im']
10
- spec.summary = 'Manage your password'
11
- spec.description = 'Save and read your password with gpg'
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', 'mpw-server', 'mpw-ssh']
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", "~> 0.6", ">= 0.6.9"
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-sftp"
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: 2.0.3
4
+ version: 3.0.0
5
5
  platform: ruby
6
6
  authors:
7
- - nishiki
7
+ - Adrien Waksberg
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-09-27 00:00:00.000000000 Z
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.6.9
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.6.9
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-sftp
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: Save and read your password with gpg
111
+ description: Manage your passwords in all security with MPW, we use GPG to crypt your
112
+ passwords
104
113
  email:
105
- - gems@yae.im
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
- - bin/mpw-server
121
- - bin/mpw-ssh
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.2.2
162
+ rubygems_version: 2.5.1
164
163
  signing_key:
165
164
  specification_version: 4
166
- summary: Manage your password
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