keepassx 0.1.0 → 1.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 +7 -0
- data/.codeclimate.yml +30 -0
- data/.gitignore +9 -0
- data/.rubocop.yml +64 -0
- data/.travis.yml +12 -3
- data/Gemfile +4 -2
- data/Guardfile +16 -0
- data/LICENSE +19 -0
- data/README.md +33 -0
- data/Rakefile +3 -2
- data/keepassx.gemspec +20 -10
- data/lib/keepassx.rb +42 -3
- data/lib/keepassx/aes_crypt.rb +16 -6
- data/lib/keepassx/database.rb +218 -27
- data/lib/keepassx/database/dumper.rb +87 -0
- data/lib/keepassx/database/finder.rb +102 -0
- data/lib/keepassx/database/loader.rb +217 -0
- data/lib/keepassx/entry.rb +70 -38
- data/lib/keepassx/field/base.rb +191 -0
- data/lib/keepassx/field/entry.rb +32 -0
- data/lib/keepassx/field/group.rb +27 -0
- data/lib/keepassx/fieldable.rb +161 -0
- data/lib/keepassx/group.rb +93 -20
- data/lib/keepassx/hashable_payload.rb +6 -0
- data/lib/keepassx/header.rb +102 -27
- data/lib/keepassx/version.rb +5 -0
- data/spec/factories.rb +23 -0
- data/spec/fixtures/database_empty.kdb +0 -0
- data/spec/fixtures/database_test.kdb +0 -0
- data/spec/fixtures/database_test_dumped.yml +76 -0
- data/spec/fixtures/database_with_key.kdb +0 -0
- data/spec/fixtures/database_with_key.key +1 -0
- data/spec/fixtures/database_with_key2.key +1 -0
- data/spec/fixtures/test_data_array.yml +113 -0
- data/spec/fixtures/test_data_array_dumped.yml +124 -0
- data/spec/keepassx/database_spec.rb +491 -29
- data/spec/keepassx/entry_spec.rb +95 -0
- data/spec/keepassx/group_spec.rb +92 -0
- data/spec/keepassx_spec.rb +17 -0
- data/spec/spec_helper.rb +59 -3
- metadata +143 -69
- data/.rvmrc +0 -1
- data/Gemfile.lock +0 -28
- data/lib/keepassx/entry_field.rb +0 -49
- data/lib/keepassx/group_field.rb +0 -44
- data/spec/test_database.kdb +0 -0
@@ -0,0 +1,95 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Keepassx::Entry do
|
4
|
+
|
5
|
+
let :entry_schema do
|
6
|
+
Respect::HashSchema.define do |s|
|
7
|
+
s.uuid :id
|
8
|
+
s.integer :group_id
|
9
|
+
s.integer :icon
|
10
|
+
s.string :name
|
11
|
+
s.string :url, format: :uri
|
12
|
+
s.string :username
|
13
|
+
s.string :password
|
14
|
+
s.string :notes
|
15
|
+
s.datetime :creation_time
|
16
|
+
s.datetime :last_mod_time
|
17
|
+
s.datetime :last_acc_time
|
18
|
+
s.datetime :expiration_time
|
19
|
+
# s.string :binary_desc # 'binary_desc' comes empty in test data
|
20
|
+
# s.string :binary_data # 'binary_data' comes empty in test data
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
let(:test_entry) { build(:entry) }
|
25
|
+
|
26
|
+
|
27
|
+
describe '.fields' do
|
28
|
+
it 'returns the list of fields' do
|
29
|
+
expect(described_class.fields).to eq %w(ignored id group_id icon name url username password notes creation_time last_mod_time last_acc_time expiration_time binary_desc binary_data terminator)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
|
34
|
+
describe '.new' do
|
35
|
+
it 'raise error when first argument is not a hash or a binary payload' do
|
36
|
+
expect { Keepassx::Entry.new('foo') }.to raise_error(ArgumentError)
|
37
|
+
end
|
38
|
+
|
39
|
+
it 'raise error when name is not a string or is missing' do
|
40
|
+
[0, :foo, [], {}, nil, ''].each do |name|
|
41
|
+
expect { Keepassx::Entry.new(name: name, group_id: 0, icon: 20) }.to raise_error(ArgumentError)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
it 'raise error when group_id is not an integer or is missing' do
|
46
|
+
['foo', :foo, [], {}, nil, ''].each do |group_id|
|
47
|
+
expect { Keepassx::Entry.new(name: 'test_entry', group_id: group_id, icon: 20) }.to raise_error(ArgumentError)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
it 'does not raise errors with valid data' do
|
52
|
+
expect { test_entry }.to_not raise_error
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
|
57
|
+
describe '#fields' do
|
58
|
+
it 'returns the list of fields' do
|
59
|
+
expect(test_entry.fields.length).to eq 15
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
|
64
|
+
describe '#length' do
|
65
|
+
it 'returns the length of fields' do
|
66
|
+
expect(test_entry.length).to eq 189
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
|
71
|
+
describe '#encode' do
|
72
|
+
it 'returns the encoded version of fields' do
|
73
|
+
expect { test_entry.encode }.to_not raise_error
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
|
78
|
+
describe '#to_hash' do
|
79
|
+
it 'returns Hash entry representation' do
|
80
|
+
expect(entry_schema.validate?(test_entry.to_hash)).to be true
|
81
|
+
end
|
82
|
+
|
83
|
+
it 'returns Hash entry representation' do
|
84
|
+
expect(entry_schema.validate?(build(:entry, id: '1').to_hash)).to be false
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
|
89
|
+
describe 'fields are editable' do
|
90
|
+
it 'should allow update of attributes' do
|
91
|
+
test_entry.name = 'foo'
|
92
|
+
expect(test_entry.name).to eq 'foo'
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
@@ -0,0 +1,92 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Keepassx::Group do
|
4
|
+
|
5
|
+
let :group_schema do
|
6
|
+
Respect::HashSchema.define do |s|
|
7
|
+
s.integer :id
|
8
|
+
s.string :name
|
9
|
+
s.integer :icon
|
10
|
+
s.datetime :creation_time
|
11
|
+
s.datetime :last_mod_time
|
12
|
+
s.datetime :last_acc_time
|
13
|
+
s.datetime :expiration_time
|
14
|
+
s.integer :level
|
15
|
+
s.integer :flags
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
let(:test_group) { build(:group) }
|
20
|
+
|
21
|
+
|
22
|
+
describe '.fields' do
|
23
|
+
it 'returns the list of fields' do
|
24
|
+
expect(described_class.fields).to eq %w(ignored id name creation_time last_mod_time last_acc_time expiration_time icon level flags terminator)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
|
29
|
+
describe '.new' do
|
30
|
+
it 'raise error when first argument is not a hash or a binary payload' do
|
31
|
+
expect { Keepassx::Group.new('foo') }.to raise_error(ArgumentError)
|
32
|
+
end
|
33
|
+
|
34
|
+
it 'raise error when id is not an integer or is missing' do
|
35
|
+
['foo', :foo, [], {}, nil, ''].each do |id|
|
36
|
+
expect { Keepassx::Group.new(id: id, name: 'test_group', icon: 20) }.to raise_error(ArgumentError)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
it 'raise error when name is not a string or is missing' do
|
41
|
+
[0, :foo, [], {}, nil, ''].each do |name|
|
42
|
+
expect { Keepassx::Group.new(id: 0, name: name, icon: 20) }.to raise_error(ArgumentError)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
it 'does not raise errors with valid data' do
|
47
|
+
expect { test_group }.to_not raise_error
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
|
52
|
+
describe '#fields' do
|
53
|
+
it 'returns the list of fields' do
|
54
|
+
expect(test_group.fields.length).to eq 10
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
|
59
|
+
describe '#length' do
|
60
|
+
it 'returns the length of fields' do
|
61
|
+
expect(test_group.length).to eq 105
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
|
66
|
+
describe '#encode' do
|
67
|
+
it 'returns the encoded version of fields' do
|
68
|
+
expect { test_group.encode }.to_not raise_error
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
|
73
|
+
describe '#to_hash' do
|
74
|
+
it 'returns Hash group representation' do
|
75
|
+
expect(group_schema.validate?(test_group.to_hash)).to be true
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
|
80
|
+
describe '#entries' do
|
81
|
+
it 'returns the list of entries' do
|
82
|
+
expect(test_group.entries.length).to eq 0
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
describe 'fields are editable' do
|
87
|
+
it 'should allow update of attributes' do
|
88
|
+
test_group.name = 'foo'
|
89
|
+
expect(test_group.name).to eq 'foo'
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Keepassx do
|
4
|
+
|
5
|
+
describe '.new' do
|
6
|
+
it 'should allow creation of database from scratch' do
|
7
|
+
expect { |b| described_class.new('/tmp/test_db.kdb', &b) }.to yield_control
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
describe '.open' do
|
12
|
+
it 'should allow creation of database from scratch' do
|
13
|
+
expect { |b| described_class.open('/tmp/test_db.kdb', &b) }.to yield_control
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
data/spec/spec_helper.rb
CHANGED
@@ -1,5 +1,61 @@
|
|
1
|
-
|
2
|
-
require 'keepassx'
|
1
|
+
require 'simplecov'
|
3
2
|
require 'rspec'
|
3
|
+
require 'respect'
|
4
|
+
require 'factory_bot'
|
5
|
+
|
6
|
+
# Start Simplecov
|
7
|
+
SimpleCov.start do
|
8
|
+
add_filter '/spec/'
|
9
|
+
end
|
10
|
+
|
11
|
+
# Configure RSpec
|
12
|
+
RSpec.configure do |config|
|
13
|
+
config.include FactoryBot::Syntax::Methods
|
14
|
+
|
15
|
+
config.color = true
|
16
|
+
config.fail_fast = false
|
17
|
+
|
18
|
+
config.order = :random
|
19
|
+
Kernel.srand config.seed
|
20
|
+
|
21
|
+
config.expect_with :rspec do |c|
|
22
|
+
c.syntax = :expect
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
# Load lib
|
27
|
+
require 'keepassx'
|
28
|
+
require_relative 'factories'
|
29
|
+
|
30
|
+
FIXTURE_PATH = File.expand_path File.join(File.dirname(__FILE__), 'fixtures')
|
31
|
+
TEST_DATABASE_PATH = File.join(FIXTURE_PATH, 'database_test.kdb')
|
32
|
+
EMPTY_DATABASE_PATH = File.join(FIXTURE_PATH, 'database_empty.kdb')
|
33
|
+
KEYFILE_DATABASE_PATH = File.join(FIXTURE_PATH, 'database_with_key.kdb')
|
34
|
+
|
35
|
+
|
36
|
+
module RespectPatch
|
37
|
+
def self.included(base)
|
38
|
+
base.send(:prepend, InstanceMethods)
|
39
|
+
end
|
40
|
+
|
41
|
+
module InstanceMethods
|
42
|
+
|
43
|
+
def validate_uuid(uuid)
|
44
|
+
return true if uuid =~ /\A[0-9a-f]{32}\z/i
|
45
|
+
raise Respect::ValidationError, "invalid UUID"
|
46
|
+
end
|
47
|
+
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
module UUIDValidator
|
52
|
+
def uuid(name, options = {})
|
53
|
+
string(name, { format: :uuid }.merge(options))
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
unless Respect::FormatValidator.included_modules.include?(RespectPatch)
|
58
|
+
Respect::FormatValidator.send(:include, RespectPatch)
|
59
|
+
end
|
4
60
|
|
5
|
-
|
61
|
+
Respect.extend_dsl_with(UUIDValidator)
|
metadata
CHANGED
@@ -1,108 +1,182 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: keepassx
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
segments:
|
6
|
-
- 0
|
7
|
-
- 1
|
8
|
-
- 0
|
9
|
-
version: 0.1.0
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.0
|
10
5
|
platform: ruby
|
11
|
-
authors:
|
6
|
+
authors:
|
12
7
|
- Tony Pitluga
|
13
8
|
- Paul Hinze
|
14
9
|
autorequire:
|
15
10
|
bindir: bin
|
16
11
|
cert_chain: []
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
12
|
+
date: 2019-10-25 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: factory_bot
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
requirements:
|
18
|
+
- - ">="
|
19
|
+
- !ruby/object:Gem::Version
|
20
|
+
version: '0'
|
21
|
+
type: :development
|
22
|
+
prerelease: false
|
23
|
+
version_requirements: !ruby/object:Gem::Requirement
|
24
|
+
requirements:
|
25
|
+
- - ">="
|
26
|
+
- !ruby/object:Gem::Version
|
27
|
+
version: '0'
|
28
|
+
- !ruby/object:Gem::Dependency
|
29
|
+
name: guard
|
30
|
+
requirement: !ruby/object:Gem::Requirement
|
31
|
+
requirements:
|
32
|
+
- - ">="
|
33
|
+
- !ruby/object:Gem::Version
|
34
|
+
version: '0'
|
35
|
+
type: :development
|
36
|
+
prerelease: false
|
37
|
+
version_requirements: !ruby/object:Gem::Requirement
|
38
|
+
requirements:
|
39
|
+
- - ">="
|
40
|
+
- !ruby/object:Gem::Version
|
41
|
+
version: '0'
|
42
|
+
- !ruby/object:Gem::Dependency
|
43
|
+
name: guard-rspec
|
44
|
+
requirement: !ruby/object:Gem::Requirement
|
45
|
+
requirements:
|
46
|
+
- - ">="
|
47
|
+
- !ruby/object:Gem::Version
|
48
|
+
version: '0'
|
49
|
+
type: :development
|
23
50
|
prerelease: false
|
24
|
-
|
25
|
-
requirements:
|
26
|
-
- -
|
27
|
-
- !ruby/object:Gem::Version
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
- !ruby/object:Gem::
|
51
|
+
version_requirements: !ruby/object:Gem::Requirement
|
52
|
+
requirements:
|
53
|
+
- - ">="
|
54
|
+
- !ruby/object:Gem::Version
|
55
|
+
version: '0'
|
56
|
+
- !ruby/object:Gem::Dependency
|
57
|
+
name: rake
|
58
|
+
requirement: !ruby/object:Gem::Requirement
|
59
|
+
requirements:
|
60
|
+
- - "~>"
|
61
|
+
- !ruby/object:Gem::Version
|
62
|
+
version: '10.4'
|
63
|
+
type: :development
|
64
|
+
prerelease: false
|
65
|
+
version_requirements: !ruby/object:Gem::Requirement
|
66
|
+
requirements:
|
67
|
+
- - "~>"
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '10.4'
|
70
|
+
- !ruby/object:Gem::Dependency
|
71
|
+
name: respect
|
72
|
+
requirement: !ruby/object:Gem::Requirement
|
73
|
+
requirements:
|
74
|
+
- - ">="
|
75
|
+
- !ruby/object:Gem::Version
|
76
|
+
version: '0'
|
77
|
+
type: :development
|
78
|
+
prerelease: false
|
79
|
+
version_requirements: !ruby/object:Gem::Requirement
|
80
|
+
requirements:
|
81
|
+
- - ">="
|
82
|
+
- !ruby/object:Gem::Version
|
83
|
+
version: '0'
|
84
|
+
- !ruby/object:Gem::Dependency
|
35
85
|
name: rspec
|
86
|
+
requirement: !ruby/object:Gem::Requirement
|
87
|
+
requirements:
|
88
|
+
- - ">="
|
89
|
+
- !ruby/object:Gem::Version
|
90
|
+
version: '0'
|
91
|
+
type: :development
|
36
92
|
prerelease: false
|
37
|
-
|
38
|
-
requirements:
|
39
|
-
- - "
|
40
|
-
- !ruby/object:Gem::Version
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
93
|
+
version_requirements: !ruby/object:Gem::Requirement
|
94
|
+
requirements:
|
95
|
+
- - ">="
|
96
|
+
- !ruby/object:Gem::Version
|
97
|
+
version: '0'
|
98
|
+
- !ruby/object:Gem::Dependency
|
99
|
+
name: simplecov
|
100
|
+
requirement: !ruby/object:Gem::Requirement
|
101
|
+
requirements:
|
102
|
+
- - ">="
|
103
|
+
- !ruby/object:Gem::Version
|
104
|
+
version: '0'
|
46
105
|
type: :development
|
47
|
-
|
106
|
+
prerelease: false
|
107
|
+
version_requirements: !ruby/object:Gem::Requirement
|
108
|
+
requirements:
|
109
|
+
- - ">="
|
110
|
+
- !ruby/object:Gem::Version
|
111
|
+
version: '0'
|
48
112
|
description: See http://github.com/pitluga/keepassx
|
49
|
-
email:
|
113
|
+
email:
|
50
114
|
- tony.pitluga@gmail.com
|
51
115
|
- paul.t.hinze@gmail.com
|
52
116
|
executables: []
|
53
|
-
|
54
117
|
extensions: []
|
55
|
-
|
56
118
|
extra_rdoc_files: []
|
57
|
-
|
58
|
-
|
59
|
-
- .
|
60
|
-
- .
|
119
|
+
files:
|
120
|
+
- ".codeclimate.yml"
|
121
|
+
- ".gitignore"
|
122
|
+
- ".rubocop.yml"
|
123
|
+
- ".travis.yml"
|
61
124
|
- Gemfile
|
62
|
-
-
|
125
|
+
- Guardfile
|
126
|
+
- LICENSE
|
63
127
|
- README.md
|
64
128
|
- Rakefile
|
65
129
|
- keepassx.gemspec
|
66
130
|
- lib/keepassx.rb
|
67
131
|
- lib/keepassx/aes_crypt.rb
|
68
132
|
- lib/keepassx/database.rb
|
133
|
+
- lib/keepassx/database/dumper.rb
|
134
|
+
- lib/keepassx/database/finder.rb
|
135
|
+
- lib/keepassx/database/loader.rb
|
69
136
|
- lib/keepassx/entry.rb
|
70
|
-
- lib/keepassx/
|
137
|
+
- lib/keepassx/field/base.rb
|
138
|
+
- lib/keepassx/field/entry.rb
|
139
|
+
- lib/keepassx/field/group.rb
|
140
|
+
- lib/keepassx/fieldable.rb
|
71
141
|
- lib/keepassx/group.rb
|
72
|
-
- lib/keepassx/
|
142
|
+
- lib/keepassx/hashable_payload.rb
|
73
143
|
- lib/keepassx/header.rb
|
144
|
+
- lib/keepassx/version.rb
|
145
|
+
- spec/factories.rb
|
146
|
+
- spec/fixtures/database_empty.kdb
|
147
|
+
- spec/fixtures/database_test.kdb
|
148
|
+
- spec/fixtures/database_test_dumped.yml
|
149
|
+
- spec/fixtures/database_with_key.kdb
|
150
|
+
- spec/fixtures/database_with_key.key
|
151
|
+
- spec/fixtures/database_with_key2.key
|
152
|
+
- spec/fixtures/test_data_array.yml
|
153
|
+
- spec/fixtures/test_data_array_dumped.yml
|
74
154
|
- spec/keepassx/database_spec.rb
|
155
|
+
- spec/keepassx/entry_spec.rb
|
156
|
+
- spec/keepassx/group_spec.rb
|
157
|
+
- spec/keepassx_spec.rb
|
75
158
|
- spec/spec_helper.rb
|
76
|
-
- spec/test_database.kdb
|
77
|
-
has_rdoc: true
|
78
159
|
homepage: http://github.com/pitluga/keepassx
|
79
|
-
licenses:
|
80
|
-
|
160
|
+
licenses:
|
161
|
+
- MIT
|
162
|
+
metadata: {}
|
81
163
|
post_install_message:
|
82
164
|
rdoc_options: []
|
83
|
-
|
84
|
-
require_paths:
|
165
|
+
require_paths:
|
85
166
|
- lib
|
86
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
87
|
-
requirements:
|
167
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
168
|
+
requirements:
|
88
169
|
- - ">="
|
89
|
-
- !ruby/object:Gem::Version
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
94
|
-
requirements:
|
170
|
+
- !ruby/object:Gem::Version
|
171
|
+
version: '0'
|
172
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
173
|
+
requirements:
|
95
174
|
- - ">="
|
96
|
-
- !ruby/object:Gem::Version
|
97
|
-
|
98
|
-
- 0
|
99
|
-
version: "0"
|
175
|
+
- !ruby/object:Gem::Version
|
176
|
+
version: '0'
|
100
177
|
requirements: []
|
101
|
-
|
102
|
-
rubyforge_project:
|
103
|
-
rubygems_version: 1.3.6
|
178
|
+
rubygems_version: 3.0.3
|
104
179
|
signing_key:
|
105
|
-
specification_version:
|
180
|
+
specification_version: 4
|
106
181
|
summary: Ruby API access for KeePassX databases
|
107
182
|
test_files: []
|
108
|
-
|