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.
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