mpw 3.0.0 → 3.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 4d0eff317597b9307b65264bd5c42547b32588d6
4
- data.tar.gz: a374e4ec216d629846f5848e7648d606634eaf2f
3
+ metadata.gz: ef1f27beb1e85561895eeaec053e65339d404a18
4
+ data.tar.gz: b69ea026f373f5b3039a71776e4acc9ec4d44e3c
5
5
  SHA512:
6
- metadata.gz: d4b873e23e0065cbe83eb0273e16186a721acfb162974f73036d8eee8f49588172e64cc4ef2ad859971989bf141a2253f7af3cf184a6e730b53d8f967454a7ed
7
- data.tar.gz: 1d6c99d6e62f544139ffd11aa5185b99346f2e8b6c9777a32b42cd472be4db9f067a21a9a2fe9e11658c14649b8b997f08fa998c35fc78e88abdaf3137b6180e
6
+ metadata.gz: 46c34128083ac6a70fcbb1ef3b9e0fb29b9bb58419a51d0b3623d0dbc34dd8b6371c8bed9c13b4dc61ffd7c9d0a2de06f37a61477e296b78934878edcf62959c
7
+ data.tar.gz: 0ff807e8c938d31abec7bce1f4a18b4f795eacf87065c8166430ffc9f86e3a9533f9098032db6ca94455345761099ea89c006072017868cac29aff6e1a381443
data/Gemfile CHANGED
@@ -6,3 +6,4 @@ gem 'gpgme'
6
6
  gem 'colorize'
7
7
  gem 'net-ssh'
8
8
  gem 'net-scp'
9
+ gem 'clipboard'
data/README.md CHANGED
@@ -1,13 +1,14 @@
1
1
  # Manage your passwords!
2
2
 
3
3
  MPW is a little software which stores your passwords in an GPG encrypted file.
4
- MPW can synchronize your password with via SSH or FTP.
4
+ MPW can synchronize your password with SSH or FTP.
5
5
 
6
6
  # Installation
7
7
 
8
8
  This program work with ruby >= 2.0
9
9
 
10
10
  * install ruby and rubygems on your computer
11
+ * install xclip
11
12
  * gem install mpw
12
13
 
13
14
  # How to use
data/VERSION CHANGED
@@ -1 +1 @@
1
- 3.0.0
1
+ 3.1.0
data/bin/mpw CHANGED
@@ -48,12 +48,13 @@ I18n.locale = lang.to_sym
48
48
  # Options
49
49
  # --------------------------------------------------------- #
50
50
 
51
- options = {}
52
- options[:force] = false
53
- options[:sync] = true
54
- options[:group] = nil
55
- options[:config] = nil
56
- options[:wallet] = nil
51
+ options = {}
52
+ options[:force] = false
53
+ options[:sync] = true
54
+ options[:clipboard] = true
55
+ options[:group] = nil
56
+ options[:config] = nil
57
+ options[:wallet] = nil
57
58
 
58
59
  OptionParser.new do |opts|
59
60
  opts.banner = "#{I18n.t('option.usage')}: mpw [options]"
@@ -71,6 +72,10 @@ OptionParser.new do |opts|
71
72
  options[:config] = config
72
73
  end
73
74
 
75
+ opts.on('-C', '--no-clipboard', I18n.t('option.clipboard')) do
76
+ options[:clipboard] = false
77
+ end
78
+
74
79
  opts.on('-d', '--delete', I18n.t('option.remove')) do
75
80
  options[:delete] = true
76
81
  end
@@ -142,61 +147,68 @@ end.parse!
142
147
  # Main
143
148
  # --------------------------------------------------------- #
144
149
 
145
- config = MPW::Config.new(options[:config])
146
- cli = MPW::Cli.new(config, options[:sync])
147
-
148
- # Setup a new config
149
- if not config.is_valid? or not options[:setup].nil?
150
- cli.setup(lang)
151
- elsif not config.check_gpg_key?
152
- cli.setup_gpg_key
153
- end
154
-
155
- cli.get_wallet(options[:wallet])
156
- cli.decrypt
157
-
158
- # Display the item's informations
159
- if not options[:show].nil?
160
- opts = {search: options[:show],
161
- group: options[:group],
162
- }
163
-
164
- cli.display(opts)
165
-
166
- # Remove an item
167
- elsif not options[:delete].nil? and not options[:id].nil?
168
- cli.delete(options[:id], options[:force])
169
-
170
- # Update an item
171
- elsif not options[:update].nil? and not options[:id].nil?
172
- cli.update(options[:id])
173
-
174
- # Add a new item
175
- elsif not options[:add].nil? and options[:key].nil?
176
- cli.add
177
-
178
- # Add a new public key in wallet
179
- elsif not options[:add].nil? and not options[:key].nil?
180
- cli.add_key(options[:key], options[:file])
181
-
182
- # Delete a public key in wallet
183
- elsif not options[:delete].nil? and not options[:key].nil?
184
- cli.delete_key(options[:key])
185
-
186
- # Export
187
- elsif not options[:export].nil? and not options[:file].nil?
188
- cli.export(options[:file])
189
-
190
- # Add a new item
191
- elsif not options[:import].nil? and not options[:file].nil?
192
- cli.import(options[:file])
150
+ begin
151
+ config = MPW::Config.new(options[:config])
152
+ cli = MPW::Cli.new(config, options[:clipboard], options[:sync])
153
+
154
+ # Setup a new config
155
+ if not options[:setup].nil?
156
+ cli.setup(lang)
157
+ exit 0
158
+ end
193
159
 
194
- # Setup wallet config
195
- elsif not options[:setup_wallet].nil?
196
- cli.setup_wallet_config
160
+ cli.setup(lang) if not config.is_valid?
161
+ cli.setup_gpg_key if not config.check_gpg_key?
162
+
163
+ cli.get_wallet(options[:wallet])
164
+ cli.decrypt
165
+
166
+ # Display the item's informations
167
+ if not options[:show].nil?
168
+ opts = {search: options[:show],
169
+ group: options[:group],
170
+ }
171
+
172
+ cli.display(opts)
173
+
174
+ # Remove an item
175
+ elsif not options[:delete].nil? and not options[:id].nil?
176
+ cli.delete(options[:id], options[:force])
177
+
178
+ # Update an item
179
+ elsif not options[:update].nil? and not options[:id].nil?
180
+ cli.update(options[:id])
181
+
182
+ # Add a new item
183
+ elsif not options[:add].nil? and options[:key].nil?
184
+ cli.add
185
+
186
+ # Add a new public key in wallet
187
+ elsif not options[:add].nil? and not options[:key].nil?
188
+ cli.add_key(options[:key], options[:file])
189
+
190
+ # Delete a public key in wallet
191
+ elsif not options[:delete].nil? and not options[:key].nil?
192
+ cli.delete_key(options[:key])
193
+
194
+ # Export
195
+ elsif not options[:export].nil? and not options[:file].nil?
196
+ cli.export(options[:file])
197
+
198
+ # Add a new item
199
+ elsif not options[:import].nil? and not options[:file].nil?
200
+ cli.import(options[:file])
201
+
202
+ # Setup wallet config
203
+ elsif not options[:setup_wallet].nil?
204
+ cli.setup_wallet_config
205
+
206
+ end
207
+
208
+ cli = nil
209
+
210
+ exit 0
197
211
 
212
+ rescue SystemExit, Interrupt
213
+ exit 3
198
214
  end
199
-
200
- cli = nil
201
-
202
- exit 0
data/i18n/en.yml CHANGED
@@ -23,7 +23,7 @@ en:
23
23
  update:
24
24
  name_empty: "You must define a name!"
25
25
  sync:
26
- general: "An error is appeared durint the sync"
26
+ general: "An error has appeared during the sync"
27
27
  connection: "Connection fail!"
28
28
  communication: "A communication problem with the server is appeared!"
29
29
  download: "Can't download the file!"
@@ -38,6 +38,7 @@ en:
38
38
  option:
39
39
  add: "Add an item or key"
40
40
  config: "Specify the configuration file to use"
41
+ clipboard: "Disable the clipboard feature"
41
42
  export: "Export a wallet in an yaml file"
42
43
  file: "Specify a file, to use with the options [--import | --export | --add]"
43
44
  force: "No ask to confirm when you delete an item"
@@ -51,7 +52,7 @@ en:
51
52
  setup: "Create a new configuration file"
52
53
  setup_wallet: "Create a new configuration file for a wallet"
53
54
  show: "Search and show the items"
54
- show_all: "Show all items"
55
+ show_all: "List all items"
55
56
  remove: "Delete an item"
56
57
  update: "Update an item"
57
58
  usage: "Usage"
@@ -72,6 +73,10 @@ en:
72
73
  port: "Enter the connection port (optional): "
73
74
  comment: "Enter a comment (optional): "
74
75
  valid: "Item has been added!"
76
+ clipboard:
77
+ clean: "The clipboard has been cleaned."
78
+ login: "The login has been copied in clipboard, press any key to continue."
79
+ password: "The password has been copied in clipboard for 30s!"
75
80
  delete_key:
76
81
  valid: "Key has been deleted!"
77
82
  delete_item:
@@ -86,11 +91,12 @@ en:
86
91
  title: "Setup a new config file"
87
92
  lang: "Choose your language (en, fr, ...) [default=%{lang}]: "
88
93
  gpg_key: "Enter the GPG key [ex: test@host.local]: "
94
+ gpg_exe: "Enter the executable GPG path (optional): "
89
95
  wallet_dir: "Enter the wallets's folder path [default=%{home}/wallets]: "
90
96
  valid: "The config file has been created!"
91
97
  setup_wallet:
92
98
  title: "Wallet setup"
93
- sync_type: "Synchronization type (ssh, ftp, or nil): "
99
+ sync_type: "Synchronization type (ssh, ftp): "
94
100
  sync_host: "Synchronization server: "
95
101
  sync_port: "Port of the synchronization server: "
96
102
  sync_user: "Username for the synchronization: "
data/i18n/fr.yml CHANGED
@@ -38,6 +38,7 @@ fr:
38
38
  option:
39
39
  add: "Ajoute un élément ou une clé"
40
40
  config: "Spécifie le fichier de configuration à utiliser"
41
+ clipboard: "Désactive la fonction presse papier"
41
42
  export: "Exporte un portefeuille dans un fichier yaml"
42
43
  file: "Spécifie un fichier, à utiliser avec les options [--import | --export | --add]"
43
44
  force: "Ne demande pas de confirmation pour la suppression d'un élément"
@@ -51,7 +52,7 @@ fr:
51
52
  setup: "Création d'un nouveau fichier de configuration"
52
53
  setup_wallet: "Création d'un nouveau fichier de configuration pour un portefeuille"
53
54
  show: "Recherche et affiche les éléments"
54
- show_all: "Affiche tous les éléments"
55
+ show_all: "Liste tous les éléments"
55
56
  remove: "Supprime un élément"
56
57
  update: "Met à jour un élément"
57
58
  usage: "Utilisation"
@@ -72,6 +73,10 @@ fr:
72
73
  port: "Entrez le port de connexion (optionnel): "
73
74
  comment: "Entrez un commentaire (optionnel): "
74
75
  valid: "L'élément a bien été ajouté!"
76
+ clipboard:
77
+ clean: "Le presse papier a été nettoyé."
78
+ login: "L'identifiant a été copié dans le presse papier, pressez n'importe quelle touche pour continuer."
79
+ password: "Le mot de passe a été copié dans le presse papier pour 30s!"
75
80
  delete_key:
76
81
  valid: "La clé a bien été supprimée!"
77
82
  delete_item:
@@ -86,6 +91,7 @@ fr:
86
91
  title: "Création d'un nouveau fichier de configuration"
87
92
  lang: "Choisissez votre langue (en, fr, ...) [défaut=%{lang}]: "
88
93
  gpg_key: "Entrez la clé GPG [ex: test@host.local]: "
94
+ gpg_exe: "Entrez le chemin de l'exécutable GPG (optionnel): "
89
95
  wallet_dir: "Entrez le chemin du répertoire qui contiendra les porte-feuilles de mot de passe [défaut=%{home}/wallets]: "
90
96
  valid: "Le fichier de configuration a bien été créé!"
91
97
  setup_wallet:
data/lib/mpw/config.rb CHANGED
@@ -30,6 +30,7 @@ class Config
30
30
  attr_accessor :lang
31
31
  attr_accessor :config_dir
32
32
  attr_accessor :wallet_dir
33
+ attr_accessor :gpg_exe
33
34
 
34
35
  # Constructor
35
36
  # @args: config_file -> the specify config file
@@ -53,8 +54,9 @@ class Config
53
54
  # @args: key -> the gpg key to encrypt
54
55
  # lang -> the software language
55
56
  # wallet_dir -> the directory where are the wallets password
57
+ # gpg_exe -> the path of gpg executable
56
58
  # @rtrn: true if le config file is create
57
- def setup(key, lang, wallet_dir)
59
+ def setup(key, lang, wallet_dir, gpg_exe)
58
60
 
59
61
  if not key =~ /[a-zA-Z0-9.-_]+\@[a-zA-Z0-9]+\.[a-zA-Z]+/
60
62
  raise I18n.t('error.config.key_bad_format')
@@ -67,6 +69,7 @@ class Config
67
69
  config = {'config' => {'key' => key,
68
70
  'lang' => lang,
69
71
  'wallet_dir' => wallet_dir,
72
+ 'gpg_exe' => gpg_exe,
70
73
  }
71
74
  }
72
75
 
@@ -118,6 +121,7 @@ class Config
118
121
  @key = config['config']['key']
119
122
  @lang = config['config']['lang']
120
123
  @wallet_dir = config['config']['wallet_dir']
124
+ @gpg_exe = config['config']['gpg_exe']
121
125
 
122
126
  raise if @key.empty? or @wallet_dir.empty?
123
127
 
data/lib/mpw/mpw.rb CHANGED
@@ -28,10 +28,15 @@ module MPW
28
28
  class MPW
29
29
 
30
30
  # Constructor
31
- def initialize(key, wallet_file, gpg_pass=nil)
31
+ def initialize(key, wallet_file, gpg_pass=nil, gpg_exe=nil)
32
32
  @key = key
33
33
  @gpg_pass = gpg_pass
34
+ @gpg_exe = gpg_exe
34
35
  @wallet_file = wallet_file
36
+
37
+ if @gpg_exe
38
+ GPGME::Engine.set_info(GPGME::PROTOCOL_OpenPGP, @gpg_exe, "#{Dir.home}/.gnupg")
39
+ end
35
40
  end
36
41
 
37
42
  # Read mpw file
@@ -311,12 +316,13 @@ class MPW
311
316
  end
312
317
 
313
318
  # Sync data with remote file
314
- def sync
315
- return if @config.empty? or @config['sync'].nil?
319
+ # @args: force -> force the sync
320
+ def sync(force=false)
321
+ return if @config.empty? or @config['sync']['type'].to_s.empty?
322
+ return if get_last_sync < Time.now.to_i + 300 and not force
316
323
 
317
324
  tmp_file = "#{@wallet_file}.sync"
318
- last_sync = @config['last_sync'].to_i
319
-
325
+
320
326
  case @config['sync']['type']
321
327
  when 'sftp', 'scp', 'ssh'
322
328
  require "#{APP_ROOT}/../lib/mpw/sync/ssh.rb"
@@ -331,7 +337,7 @@ class MPW
331
337
  sync.connect
332
338
  sync.get(tmp_file)
333
339
 
334
- remote = MPW.new(@key, tmp_file, @gpg_pass)
340
+ remote = MPW.new(@key, tmp_file, @gpg_pass, @gpg_exe)
335
341
  remote.read_data
336
342
 
337
343
  File.unlink(tmp_file) if File.exist?(tmp_file)
@@ -365,7 +371,7 @@ class MPW
365
371
  end
366
372
 
367
373
  # Remove an old item
368
- if not update and item.last_sync.to_i < last_sync and item.last_edit < last_sync
374
+ if not update and item.last_sync.to_i < get_last_sync and item.last_edit < get_last_sync
369
375
  item.delete
370
376
  end
371
377
  end
data/lib/mpw/ui/cli.rb CHANGED
@@ -20,6 +20,7 @@ require 'readline'
20
20
  require 'i18n'
21
21
  require 'colorize'
22
22
  require 'highline/import'
23
+ require 'clipboard'
23
24
 
24
25
  #TODO
25
26
  require "#{APP_ROOT}/../lib/mpw/item.rb"
@@ -31,9 +32,10 @@ class Cli
31
32
  # Constructor
32
33
  # @args: config -> the config
33
34
  # sync -> boolean for sync or not
34
- def initialize(config, sync=true)
35
- @config = config
36
- @sync = sync
35
+ def initialize(config, clipboard=true, sync=true)
36
+ @config = config
37
+ @clipboard = clipboard
38
+ @sync = sync
37
39
  end
38
40
 
39
41
  # Create a new config file
@@ -44,13 +46,14 @@ class Cli
44
46
  language = ask(I18n.t('form.setup_config.lang', lang: lang)).to_s
45
47
  key = ask(I18n.t('form.setup_config.gpg_key')).to_s
46
48
  wallet_dir = ask(I18n.t('form.setup_config.wallet_dir', home: "#{@config.config_dir}")).to_s
49
+ gpg_exe = ask(I18n.t('form.setup_config.gpg_exe')).to_s
47
50
 
48
51
  if language.nil? or language.empty?
49
52
  language = lang
50
53
  end
51
54
  I18n.locale = language.to_sym
52
55
 
53
- @config.setup(key, lang, wallet_dir)
56
+ @config.setup(key, lang, wallet_dir, gpg_exe)
54
57
 
55
58
  raise I18n.t('error.config.check') if not @config.is_valid?
56
59
 
@@ -103,11 +106,14 @@ class Cli
103
106
  puts I18n.t('form.setup_wallet.title')
104
107
  puts '--------------------'
105
108
  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
109
+
110
+ if ['ftp', 'ssh'].include?(config['sync']['type'].downcase)
111
+ config['sync']['host'] = ask(I18n.t('form.setup_wallet.sync_host')).to_s
112
+ config['sync']['port'] = ask(I18n.t('form.setup_wallet.sync_port')).to_s
113
+ config['sync']['user'] = ask(I18n.t('form.setup_wallet.sync_user')).to_s
114
+ config['sync']['password'] = ask(I18n.t('form.setup_wallet.sync_pwd')).to_s
115
+ config['sync']['path'] = ask(I18n.t('form.setup_wallet.sync_path')).to_s
116
+ end
111
117
 
112
118
  @mpw.set_config(config)
113
119
  @mpw.write_data
@@ -122,7 +128,7 @@ class Cli
122
128
  def decrypt
123
129
  if not defined?(@mpw)
124
130
  @password = ask(I18n.t('display.gpg_password')) {|q| q.echo = false}
125
- @mpw = MPW.new(@config.key, @wallet_file, @password)
131
+ @mpw = MPW.new(@config.key, @wallet_file, @password, @config.gpg_exe)
126
132
  end
127
133
 
128
134
  @mpw.read_data
@@ -141,11 +147,23 @@ class Cli
141
147
  case result.length
142
148
  when 0
143
149
  puts I18n.t('display.nothing')
150
+
144
151
  when 1
145
152
  display_item(result.first)
153
+
146
154
  else
147
- i = 1
155
+ group = nil
156
+ i = 1
157
+
158
+ result.sort! { |a,b| a.group.downcase <=> b.group.downcase }
159
+
148
160
  result.each do |item|
161
+ if group != item.group
162
+ group = item.group
163
+ puts "#{I18n.t('display.group')}: #{group}".yellow
164
+ end
165
+
166
+ print " |_ ".yellow
149
167
  print "#{i}: ".cyan
150
168
  print item.name
151
169
  print " -> #{item.comment}".magenta if not item.comment.to_s.empty?
@@ -180,11 +198,34 @@ class Cli
180
198
  print "#{I18n.t('display.login')}: ".cyan
181
199
  puts item.user
182
200
  print "#{I18n.t('display.password')}: ".cyan
183
- puts @mpw.get_password(item.id)
201
+ if @clipboard
202
+ puts '***********'
203
+ else
204
+ puts @mpw.get_password(item.id)
205
+ end
184
206
  print "#{I18n.t('display.port')}: ".cyan
185
207
  puts item.port
186
208
  print "#{I18n.t('display.comment')}: ".cyan
187
209
  puts item.comment
210
+
211
+ clipboard(item) if @clipboard
212
+ end
213
+
214
+ # Copy in clipboard the login and password
215
+ def clipboard(item)
216
+ Clipboard.copy(item.user)
217
+ print "\n#{I18n.t('form.clipboard.login')}".green
218
+ gets
219
+
220
+ Clipboard.copy(@mpw.get_password(item.id))
221
+ puts I18n.t('form.clipboard.password').yellow
222
+
223
+ sleep(30)
224
+
225
+ Clipboard.clear
226
+ puts I18n.t('form.clipboard.clean').green
227
+ rescue SystemExit, Interrupt
228
+ Clipboard.clear
188
229
  end
189
230
 
190
231
  # Display the wallet
@@ -226,7 +267,7 @@ class Cli
226
267
  def add_key(key, file=nil)
227
268
  @mpw.add_key(key, file)
228
269
  @mpw.write_data
229
- @mpw.sync if @sync
270
+ @mpw.sync(true) if @sync
230
271
 
231
272
  puts "#{I18n.t('form.add_key.valid')}".green
232
273
  rescue Exception => e
@@ -238,7 +279,7 @@ class Cli
238
279
  def delete_key(key)
239
280
  @mpw.delete_key(key)
240
281
  @mpw.write_data
241
- @mpw.sync if @sync
282
+ @mpw.sync(true) if @sync
242
283
 
243
284
  puts "#{I18n.t('form.delete_key.valid')}".green
244
285
  rescue Exception => e
@@ -265,7 +306,7 @@ class Cli
265
306
  @mpw.add(item)
266
307
  @mpw.set_password(item.id, password)
267
308
  @mpw.write_data
268
- @mpw.sync if @sync
309
+ @mpw.sync(true) if @sync
269
310
 
270
311
  puts "#{I18n.t('form.add_item.valid')}".green
271
312
  end
@@ -294,7 +335,7 @@ class Cli
294
335
  item.update(options)
295
336
  @mpw.set_password(item.id, password) if not password.empty?
296
337
  @mpw.write_data
297
- @mpw.sync if @sync
338
+ @mpw.sync(true) if @sync
298
339
 
299
340
  puts "#{I18n.t('form.update_item.valid')}".green
300
341
  else
@@ -326,7 +367,7 @@ class Cli
326
367
 
327
368
  item.delete
328
369
  @mpw.write_data
329
- @mpw.sync if @sync
370
+ @mpw.sync(true) if @sync
330
371
 
331
372
  puts "#{I18n.t('form.delete_item.valid', id: id)}".green
332
373
  rescue Exception => e
data/mpw.gemspec CHANGED
@@ -8,7 +8,7 @@ Gem::Specification.new do |spec|
8
8
  spec.authors = ['Adrien Waksberg']
9
9
  spec.email = ['mpw@yae.im']
10
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'
11
+ spec.description = 'Manage your passwords in all security with MPW, we use GPG to encrypt your passwords'
12
12
  spec.homepage = 'https://github.com/nishiki/manage-password'
13
13
  spec.license = 'GPL-2.0'
14
14
 
@@ -24,4 +24,5 @@ Gem::Specification.new do |spec|
24
24
  spec.add_dependency "colorize"
25
25
  spec.add_dependency "net-ssh"
26
26
  spec.add_dependency "net-scp"
27
+ spec.add_dependency "clipboard"
27
28
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mpw
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.0.0
4
+ version: 3.1.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: 2016-07-05 00:00:00.000000000 Z
11
+ date: 2016-07-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: i18n
@@ -108,8 +108,22 @@ dependencies:
108
108
  - - ">="
109
109
  - !ruby/object:Gem::Version
110
110
  version: '0'
111
- description: Manage your passwords in all security with MPW, we use GPG to crypt your
112
- passwords
111
+ - !ruby/object:Gem::Dependency
112
+ name: clipboard
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :runtime
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ description: Manage your passwords in all security with MPW, we use GPG to encrypt
126
+ your passwords
113
127
  email:
114
128
  - mpw@yae.im
115
129
  executables: