mpw 4.0.0 → 4.1.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/.rubocop.yml +122 -0
- data/.travis.yml +2 -0
- data/CHANGELOG.md +9 -0
- data/Gemfile +7 -9
- data/README.md +1 -7
- data/VERSION +1 -1
- data/bin/mpw +25 -25
- data/bin/mpw-add +54 -25
- data/bin/mpw-config +74 -62
- data/bin/mpw-copy +25 -30
- data/bin/mpw-delete +24 -29
- data/bin/mpw-export +27 -32
- data/bin/mpw-genpwd +22 -22
- data/bin/mpw-import +20 -25
- data/bin/mpw-list +24 -29
- data/bin/mpw-update +61 -32
- data/bin/mpw-wallet +48 -73
- data/i18n/en.yml +15 -26
- data/i18n/fr.yml +15 -26
- data/lib/mpw/cli.rb +554 -546
- data/lib/mpw/config.rb +168 -139
- data/lib/mpw/item.rb +75 -82
- data/lib/mpw/mpw.rb +328 -465
- data/mpw.gemspec +11 -10
- data/templates/add_form.erb +8 -8
- data/templates/update_form.erb +7 -7
- data/test/test_config.rb +70 -55
- data/test/test_item.rb +167 -167
- data/test/test_mpw.rb +132 -132
- data/test/test_translate.rb +23 -23
- data/test/tests.rb +1 -1
- metadata +4 -45
- data/lib/mpw/sync/ftp.rb +0 -68
- data/lib/mpw/sync/ssh.rb +0 -67
data/test/test_mpw.rb
CHANGED
@@ -1,140 +1,140 @@
|
|
1
1
|
#!/usr/bin/ruby
|
2
|
-
|
2
|
+
|
3
3
|
require 'mpw/mpw'
|
4
4
|
require 'mpw/item'
|
5
5
|
require 'test/unit'
|
6
6
|
require 'yaml'
|
7
7
|
require 'csv'
|
8
|
-
|
8
|
+
|
9
9
|
class TestMPW < Test::Unit::TestCase
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
10
|
+
def setup
|
11
|
+
fixture_file = './test/files/fixtures.yml'
|
12
|
+
|
13
|
+
wallet_file = 'default.gpg'
|
14
|
+
key = 'test@example.com'
|
15
|
+
password = 'password'
|
16
|
+
|
17
|
+
if defined?(I18n.enforce_available_locales)
|
18
|
+
I18n.enforce_available_locales = false
|
19
|
+
end
|
20
|
+
|
21
|
+
@mpw = MPW::MPW.new(key, wallet_file, password)
|
22
|
+
@fixtures = YAML.load_file(fixture_file)
|
23
|
+
end
|
24
|
+
|
25
|
+
def test_00_decrypt_empty_file
|
26
|
+
@mpw.read_data
|
27
|
+
assert_equal(0, @mpw.list.length)
|
28
|
+
end
|
29
|
+
|
30
|
+
def test_01_encrypt_empty_file
|
31
|
+
@mpw.read_data
|
32
|
+
@mpw.write_data
|
33
|
+
end
|
34
|
+
|
35
|
+
def test_02_add_item
|
36
|
+
data = { group: @fixtures['add_new']['group'],
|
37
|
+
host: @fixtures['add_new']['host'],
|
38
|
+
protocol: @fixtures['add_new']['protocol'],
|
39
|
+
user: @fixtures['add_new']['user'],
|
40
|
+
port: @fixtures['add_new']['port'],
|
41
|
+
comment: @fixtures['add_new']['comment'],
|
42
|
+
}
|
43
|
+
|
44
|
+
item = MPW::Item.new(data)
|
45
|
+
|
46
|
+
assert(!item.nil?)
|
47
|
+
assert(!item.empty?)
|
48
|
+
|
49
|
+
@mpw.read_data
|
50
|
+
@mpw.add(item)
|
51
|
+
@mpw.set_password(item.id, @fixtures['add_new']['password'])
|
52
|
+
|
53
|
+
assert_equal(1, @mpw.list.length)
|
54
|
+
|
55
|
+
item = @mpw.list[0]
|
56
|
+
@fixtures['add_new'].each do |k,v|
|
57
|
+
if k == 'password'
|
58
|
+
assert_equal(v, @mpw.get_password(item.id))
|
59
|
+
else
|
60
|
+
assert_equal(v, item.send(k).to_s)
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
@mpw.write_data
|
65
|
+
end
|
66
|
+
|
67
|
+
def test_03_decrypt_file
|
68
|
+
@mpw.read_data
|
69
|
+
assert_equal(1, @mpw.list.length)
|
70
|
+
|
71
|
+
item = @mpw.list[0]
|
72
|
+
@fixtures['add_new'].each do |k,v|
|
73
|
+
if k == 'password'
|
74
|
+
assert_equal(v, @mpw.get_password(item.id))
|
75
|
+
else
|
76
|
+
assert_equal(v, item.send(k).to_s)
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
def test_04_delete_item
|
82
|
+
@mpw.read_data
|
83
|
+
|
84
|
+
assert_equal(1, @mpw.list.length)
|
85
|
+
|
86
|
+
@mpw.list.each do |item|
|
87
|
+
item.delete
|
88
|
+
end
|
89
|
+
|
90
|
+
assert_equal(0, @mpw.list.length)
|
91
|
+
|
92
|
+
@mpw.write_data
|
93
|
+
end
|
94
|
+
|
95
|
+
def test_05_search
|
96
|
+
@mpw.read_data
|
97
|
+
|
98
|
+
@fixtures.each_value do |v|
|
99
|
+
data = { group: v['group'],
|
100
|
+
host: v['host'],
|
101
|
+
protocol: v['protocol'],
|
102
|
+
user: v['user'],
|
103
|
+
port: v['port'],
|
104
|
+
comment: v['comment'],
|
105
|
+
}
|
106
|
+
|
107
|
+
item = MPW::Item.new(data)
|
108
|
+
|
109
|
+
assert(!item.nil?)
|
110
|
+
assert(!item.empty?)
|
111
|
+
|
112
|
+
@mpw.add(item)
|
113
|
+
@mpw.set_password(item.id, v['password'])
|
114
|
+
end
|
115
|
+
|
116
|
+
assert_equal(3, @mpw.list.length)
|
117
|
+
assert_equal(1, @mpw.list(group: @fixtures['add_new']['group']).length)
|
118
|
+
assert_equal(1, @mpw.list(pattern: 'existing').length)
|
119
|
+
assert_equal(2, @mpw.list(pattern: 'host_[eu]').length)
|
120
|
+
end
|
121
|
+
|
122
|
+
def test_06_add_gpg_key
|
123
|
+
@mpw.read_data
|
124
|
+
|
125
|
+
@mpw.add_key('test2@example.com')
|
126
|
+
assert_equal(2, @mpw.list_keys.length)
|
127
|
+
|
128
|
+
@mpw.write_data
|
129
|
+
end
|
130
|
+
|
131
|
+
def test_07_delete_gpg_key
|
132
|
+
@mpw.read_data
|
133
|
+
assert_equal(2, @mpw.list_keys.length)
|
134
|
+
|
135
|
+
@mpw.delete_key('test2@example.com')
|
136
|
+
assert_equal(1, @mpw.list_keys.length)
|
137
|
+
|
138
|
+
@mpw.write_data
|
139
|
+
end
|
140
140
|
end
|
data/test/test_translate.rb
CHANGED
@@ -4,28 +4,28 @@ require 'yaml'
|
|
4
4
|
require 'test/unit'
|
5
5
|
|
6
6
|
class TestTranslate < Test::Unit::TestCase
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
Dir.glob('i18n/*.yml').each do |yaml|
|
11
|
-
lang = File.basename(yaml, '.yml')
|
12
|
-
translate = YAML.load_file(yaml)
|
13
|
-
|
14
|
-
`grep -r -o "I18n.t('.*)" bin/ lib/ | cut -d"'" -f2`.each_line do |line|
|
15
|
-
begin
|
16
|
-
t = translate[lang]
|
17
|
-
line.strip.split('.').each do |v|
|
18
|
-
t = t[v]
|
19
|
-
end
|
7
|
+
def test_00_check_translate
|
8
|
+
missing = 0
|
20
9
|
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
10
|
+
Dir.glob('i18n/*.yml').each do |yaml|
|
11
|
+
lang = File.basename(yaml, '.yml')
|
12
|
+
translate = YAML.load_file(yaml)
|
13
|
+
|
14
|
+
`grep -r -o "I18n.t('.*)" bin/ lib/ | cut -d"'" -f2`.each_line do |line|
|
15
|
+
begin
|
16
|
+
t = translate[lang]
|
17
|
+
line.strip.split('.').each do |v|
|
18
|
+
t = t[v]
|
19
|
+
end
|
20
|
+
|
21
|
+
assert(!t.to_s.empty?)
|
22
|
+
rescue
|
23
|
+
puts "#{lang}.#{line}"
|
24
|
+
missing = 1
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
assert_equal(0, missing)
|
30
|
+
end
|
31
31
|
end
|
data/test/tests.rb
CHANGED
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: 4.
|
4
|
+
version: 4.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: 2017-
|
11
|
+
date: 2017-04-22 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: i18n
|
@@ -110,46 +110,6 @@ dependencies:
|
|
110
110
|
- - ">="
|
111
111
|
- !ruby/object:Gem::Version
|
112
112
|
version: 0.8.1
|
113
|
-
- !ruby/object:Gem::Dependency
|
114
|
-
name: net-ssh
|
115
|
-
requirement: !ruby/object:Gem::Requirement
|
116
|
-
requirements:
|
117
|
-
- - "~>"
|
118
|
-
- !ruby/object:Gem::Version
|
119
|
-
version: '3.2'
|
120
|
-
- - ">="
|
121
|
-
- !ruby/object:Gem::Version
|
122
|
-
version: 3.2.0
|
123
|
-
type: :runtime
|
124
|
-
prerelease: false
|
125
|
-
version_requirements: !ruby/object:Gem::Requirement
|
126
|
-
requirements:
|
127
|
-
- - "~>"
|
128
|
-
- !ruby/object:Gem::Version
|
129
|
-
version: '3.2'
|
130
|
-
- - ">="
|
131
|
-
- !ruby/object:Gem::Version
|
132
|
-
version: 3.2.0
|
133
|
-
- !ruby/object:Gem::Dependency
|
134
|
-
name: net-sftp
|
135
|
-
requirement: !ruby/object:Gem::Requirement
|
136
|
-
requirements:
|
137
|
-
- - "~>"
|
138
|
-
- !ruby/object:Gem::Version
|
139
|
-
version: '2.1'
|
140
|
-
- - ">="
|
141
|
-
- !ruby/object:Gem::Version
|
142
|
-
version: 2.1.2
|
143
|
-
type: :runtime
|
144
|
-
prerelease: false
|
145
|
-
version_requirements: !ruby/object:Gem::Requirement
|
146
|
-
requirements:
|
147
|
-
- - "~>"
|
148
|
-
- !ruby/object:Gem::Version
|
149
|
-
version: '2.1'
|
150
|
-
- - ">="
|
151
|
-
- !ruby/object:Gem::Version
|
152
|
-
version: 2.1.2
|
153
113
|
- !ruby/object:Gem::Dependency
|
154
114
|
name: clipboard
|
155
115
|
requirement: !ruby/object:Gem::Requirement
|
@@ -200,6 +160,7 @@ extensions: []
|
|
200
160
|
extra_rdoc_files: []
|
201
161
|
files:
|
202
162
|
- ".gitignore"
|
163
|
+
- ".rubocop.yml"
|
203
164
|
- ".travis.yml"
|
204
165
|
- CHANGELOG.md
|
205
166
|
- Gemfile
|
@@ -223,8 +184,6 @@ files:
|
|
223
184
|
- lib/mpw/config.rb
|
224
185
|
- lib/mpw/item.rb
|
225
186
|
- lib/mpw/mpw.rb
|
226
|
-
- lib/mpw/sync/ftp.rb
|
227
|
-
- lib/mpw/sync/ssh.rb
|
228
187
|
- mpw.gemspec
|
229
188
|
- templates/add_form.erb
|
230
189
|
- templates/update_form.erb
|
@@ -247,7 +206,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
247
206
|
requirements:
|
248
207
|
- - ">="
|
249
208
|
- !ruby/object:Gem::Version
|
250
|
-
version: '
|
209
|
+
version: '2.1'
|
251
210
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
252
211
|
requirements:
|
253
212
|
- - ">="
|
data/lib/mpw/sync/ftp.rb
DELETED
@@ -1,68 +0,0 @@
|
|
1
|
-
#!/usr/bin/ruby
|
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.
|
18
|
-
|
19
|
-
require 'i18n'
|
20
|
-
require 'net/ftp'
|
21
|
-
|
22
|
-
module MPW
|
23
|
-
class FTP
|
24
|
-
|
25
|
-
# Constructor
|
26
|
-
# @args: config -> the config
|
27
|
-
def initialize(config)
|
28
|
-
@host = config['host']
|
29
|
-
@user = config['user']
|
30
|
-
@password = config['password']
|
31
|
-
@path = config['path']
|
32
|
-
@port = config['port'].instance_of?(Integer) ? 22 : config['port']
|
33
|
-
end
|
34
|
-
|
35
|
-
|
36
|
-
# Connect to server
|
37
|
-
def connect
|
38
|
-
Net::FTP.open(@host) do |ftp|
|
39
|
-
ftp.login(@user, @password)
|
40
|
-
break
|
41
|
-
end
|
42
|
-
rescue Exception => e
|
43
|
-
raise "#{I18n.t('error.sync.connection')}\n#{e}"
|
44
|
-
end
|
45
|
-
|
46
|
-
# Get data on server
|
47
|
-
# @args: file_tmp -> the path where download the file
|
48
|
-
def get(file_tmp)
|
49
|
-
Net::FTP.open(@host) do |ftp|
|
50
|
-
ftp.login(@user, @password)
|
51
|
-
ftp.gettextfile(@path, file_tmp)
|
52
|
-
end
|
53
|
-
rescue Exception => e
|
54
|
-
raise "#{I18n.t('error.sync.download')}\n#{e}"
|
55
|
-
end
|
56
|
-
|
57
|
-
# Update the remote data
|
58
|
-
# @args: file_gpg -> the data to send on server
|
59
|
-
def update(file_gpg)
|
60
|
-
Net::FTP.open(@host) do |ftp|
|
61
|
-
ftp.login(@user, @password)
|
62
|
-
ftp.puttextfile(file_gpg, @path)
|
63
|
-
end
|
64
|
-
rescue Exception => e
|
65
|
-
raise "#{I18n.t('error.sync.upload')}\n#{e}"
|
66
|
-
end
|
67
|
-
end
|
68
|
-
end
|