rubeepass 1.1.2 → 2.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 +4 -4
- data/bin/rpass +5 -7
- data/lib/rubeepass/attachment_decoder.rb +34 -0
- data/lib/rubeepass/entry.rb +72 -26
- data/lib/rubeepass/error.rb +1 -2
- data/lib/rubeepass/group.rb +17 -19
- data/lib/rubeepass.rb +6 -0
- metadata +2 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a497c0ba1c2d89f4be0f1c386c3cba1b692d1452
|
4
|
+
data.tar.gz: ff4a9f75e497c6d7c1c06d21fffe40680798d929
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d2141b8e46f3f30be2b0bd08f5159ee71692f1aee5ca923dbf48ffe27a534f7598d47b3e2b28466346bb7a09fa90a39472edee09f207eba583a6981397d0aa48
|
7
|
+
data.tar.gz: 1a702fca0863fc0787d6b3034ff71c1b32a00d8f01d0539dc217466b76072915c7c333c37d57e3705c60432c45930dd78646e34e0f64a5dce403a017db64923f
|
data/bin/rpass
CHANGED
@@ -32,13 +32,11 @@ class RubeePassConfig < JSONConfig
|
|
32
32
|
return kdbx
|
33
33
|
end
|
34
34
|
|
35
|
-
def last_keyfile(
|
36
|
-
if (
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
return nil if (keyfile.nil? || keyfile.empty?)
|
41
|
-
return keyfile
|
35
|
+
def last_keyfile(kf = nil)
|
36
|
+
set("last_keyfile", Pathname.new(kf).expand_path) if (kf)
|
37
|
+
kf = get("last_keyfile").to_s
|
38
|
+
return nil if (kf.nil? || kf.empty?)
|
39
|
+
return kf
|
42
40
|
end
|
43
41
|
|
44
42
|
def timeout(t = nil)
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require "base64"
|
2
|
+
require "rexml/document"
|
3
|
+
require "zlib"
|
4
|
+
|
5
|
+
class RubeePass::AttachmentDecoder
|
6
|
+
def get_attachment(ref)
|
7
|
+
@binaries.elements.each("Binary") do |elem|
|
8
|
+
if (elem.attributes["ID"] == ref)
|
9
|
+
if (elem.attributes["Compressed"].nil?)
|
10
|
+
begin
|
11
|
+
return Base64.decode64(elem.text)
|
12
|
+
rescue
|
13
|
+
return elem.text
|
14
|
+
end
|
15
|
+
end
|
16
|
+
return parse_gzip(elem.text)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def initialize(binaries)
|
22
|
+
@binaries = binaries
|
23
|
+
end
|
24
|
+
|
25
|
+
def parse_gzip(attachment)
|
26
|
+
begin
|
27
|
+
attachment = Base64.decode64(attachment)
|
28
|
+
rescue
|
29
|
+
# Do nothing
|
30
|
+
end
|
31
|
+
return Zlib::GzipReader.new(StringIO.new(attachment)).read
|
32
|
+
end
|
33
|
+
private :parse_gzip
|
34
|
+
end
|
data/lib/rubeepass/entry.rb
CHANGED
@@ -24,10 +24,28 @@ class RubeePass::Entry
|
|
24
24
|
|
25
25
|
def additional_attributes
|
26
26
|
return attributes.select do |key, value|
|
27
|
-
key.match(/^(
|
27
|
+
key.match(/^(notes|password|title|url|username)$/i).nil?
|
28
28
|
end
|
29
29
|
end
|
30
30
|
|
31
|
+
def attachment(name)
|
32
|
+
return nil if (@keepass.nil?)
|
33
|
+
return nil if (!has_attachment?(name))
|
34
|
+
return @keepass.attachment_decoder.get_attachment(
|
35
|
+
@attachments[name]
|
36
|
+
)
|
37
|
+
end
|
38
|
+
|
39
|
+
def attachments
|
40
|
+
attachments = Hash.new
|
41
|
+
|
42
|
+
@attachments.each do |key, value|
|
43
|
+
attachments[key] = attachment(key)
|
44
|
+
end
|
45
|
+
|
46
|
+
return attachments
|
47
|
+
end
|
48
|
+
|
31
49
|
def attribute(attr)
|
32
50
|
return nil if (@keepass.nil?)
|
33
51
|
return "" if (!has_attribute?(attr))
|
@@ -53,34 +71,41 @@ class RubeePass::Entry
|
|
53
71
|
end
|
54
72
|
|
55
73
|
def details(level = 0, show_passwd = false)
|
56
|
-
lvl =
|
74
|
+
lvl = " " * level
|
57
75
|
|
58
|
-
|
59
|
-
|
60
|
-
#
|
61
|
-
|
76
|
+
r = Array.new
|
77
|
+
r.push("#{lvl}#{hilight_attr("Title:")} #{@title}")
|
78
|
+
# r.push("#{lvl}#{hilight_attr("UUID:")} #{@uuid}")
|
79
|
+
r.push("#{lvl}#{hilight_attr("Username:")} #{@username}")
|
62
80
|
if (show_passwd)
|
63
|
-
|
64
|
-
|
81
|
+
r.push(
|
82
|
+
"#{lvl}#{hilight_password("Password:")} #{@password}"
|
65
83
|
)
|
66
84
|
end
|
67
|
-
|
85
|
+
r.push("#{lvl}#{hilight_attr("URL:")} #{@url}")
|
68
86
|
|
69
|
-
|
87
|
+
r.push("#{lvl}#{hilight_attr("Notes:")}") if (!@notes.empty?)
|
70
88
|
@notes.each_line do |line|
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
89
|
+
r.push("#{lvl} #{line.strip}")
|
90
|
+
end
|
91
|
+
|
92
|
+
additional_attributes.each do |k, v|
|
93
|
+
r.push("#{lvl}#{hilight_attr("#{k}:")} #{v}")
|
94
|
+
end
|
95
|
+
|
96
|
+
if (!@attachments.empty?)
|
97
|
+
r.push("#{lvl}#{hilight_attr("Attachments:")}")
|
98
|
+
end
|
99
|
+
@attachments.keys.each do |name|
|
100
|
+
r.push("#{lvl} #{name}")
|
77
101
|
end
|
78
102
|
|
79
|
-
return
|
103
|
+
return r.join("\n")
|
80
104
|
end
|
81
105
|
|
82
106
|
def self.from_xml(keepass, parent, xml)
|
83
107
|
attrs = Hash.new
|
108
|
+
attachs = Hash.new
|
84
109
|
|
85
110
|
uuid = xml.elements["UUID"].text || ""
|
86
111
|
|
@@ -101,7 +126,19 @@ class RubeePass::Entry
|
|
101
126
|
end
|
102
127
|
end
|
103
128
|
|
104
|
-
|
129
|
+
xml.elements.each("Binary") do |elem|
|
130
|
+
key = elem.elements["Key"].text
|
131
|
+
value = elem.elements["Value"].attributes["Ref"]
|
132
|
+
attachs[key] = value
|
133
|
+
end
|
134
|
+
|
135
|
+
return RubeePass::Entry.new(
|
136
|
+
parent,
|
137
|
+
keepass,
|
138
|
+
attrs,
|
139
|
+
attachs,
|
140
|
+
uuid
|
141
|
+
)
|
105
142
|
end
|
106
143
|
|
107
144
|
def self.handle_protected(keepass, base64)
|
@@ -121,26 +158,35 @@ class RubeePass::Entry
|
|
121
158
|
return keepass.protected_decryptor.add_to_stream(data)
|
122
159
|
end
|
123
160
|
|
161
|
+
def has_attachment?(name)
|
162
|
+
return @attachments.any? do |k, v|
|
163
|
+
k.downcase == name.downcase
|
164
|
+
end
|
165
|
+
end
|
166
|
+
|
124
167
|
def has_attribute?(attr)
|
125
|
-
return
|
168
|
+
return @attributes.any? do |k, v|
|
169
|
+
k.downcase == attr.downcase
|
170
|
+
end
|
126
171
|
end
|
127
172
|
|
173
|
+
def hilight_attr(title)
|
174
|
+
return title if (!RubeePass.hilight?)
|
175
|
+
return title.light_green
|
176
|
+
end
|
177
|
+
private :hilight_attr
|
178
|
+
|
128
179
|
def hilight_password(passwd)
|
129
180
|
return passwd if (!RubeePass.hilight?)
|
130
181
|
return passwd.light_red
|
131
182
|
end
|
132
183
|
private :hilight_password
|
133
184
|
|
134
|
-
def
|
135
|
-
return title if (!RubeePass.hilight?)
|
136
|
-
return title.light_green
|
137
|
-
end
|
138
|
-
private :hilight_title
|
139
|
-
|
140
|
-
def initialize(group, keepass, attributes, uuid)
|
185
|
+
def initialize(group, keepass, attributes, attachments, uuid)
|
141
186
|
@group = group
|
142
187
|
@keepass = keepass
|
143
188
|
@attributes = attributes
|
189
|
+
@attachments = attachments
|
144
190
|
|
145
191
|
@notes = attribute("Notes")
|
146
192
|
@password = attribute("Password")
|
data/lib/rubeepass/error.rb
CHANGED
data/lib/rubeepass/group.rb
CHANGED
@@ -22,10 +22,10 @@ class RubeePass::Group
|
|
22
22
|
|
23
23
|
def details(level = 0, show_passwd = false)
|
24
24
|
out = Array.new
|
25
|
-
lvl =
|
25
|
+
lvl = " " * level
|
26
26
|
|
27
|
-
group_details = [
|
28
|
-
group_details = [
|
27
|
+
group_details = [hilight_header(@path)] if (level == 0)
|
28
|
+
group_details = [hilight_header(@name)] if (level != 0)
|
29
29
|
|
30
30
|
group_details.each do |line|
|
31
31
|
out.push("#{lvl}#{line}")
|
@@ -35,8 +35,11 @@ class RubeePass::Group
|
|
35
35
|
out.push(group.details(level + 1, show_passwd))
|
36
36
|
end
|
37
37
|
|
38
|
+
div = "-" * (70 - lvl.length - 2)
|
39
|
+
out.push("#{lvl} #{div}") if (!@entries.empty?)
|
38
40
|
@entries.values.each do |entry|
|
39
41
|
out.push(entry.details(level + 1, show_passwd))
|
42
|
+
out.push("#{lvl} #{div}")
|
40
43
|
end
|
41
44
|
|
42
45
|
return out.join("\n")
|
@@ -67,17 +70,14 @@ class RubeePass::Group
|
|
67
70
|
end
|
68
71
|
|
69
72
|
def self.from_xml(keepass, parent, xml)
|
70
|
-
name =
|
71
|
-
name = "" if (
|
72
|
-
name = "/" if (parent.nil?)
|
73
|
+
name = "/"
|
74
|
+
name = xml.elements["Name"].text || "" if (parent)
|
73
75
|
|
74
|
-
notes =
|
75
|
-
notes = "" if (
|
76
|
-
notes = "" if (parent.nil?)
|
76
|
+
notes = ""
|
77
|
+
notes = xml.elements["Notes"].text || "" if (parent)
|
77
78
|
|
78
|
-
uuid =
|
79
|
-
uuid = "" if (
|
80
|
-
uuid = "" if (parent.nil?)
|
79
|
+
uuid = ""
|
80
|
+
uuid = xml.elements["UUID"].text || "" if (parent)
|
81
81
|
|
82
82
|
group = RubeePass::Group.new(
|
83
83
|
parent,
|
@@ -151,22 +151,20 @@ class RubeePass::Group
|
|
151
151
|
end
|
152
152
|
|
153
153
|
def has_entry?(title)
|
154
|
-
entry_titles.
|
155
|
-
|
154
|
+
return entry_titles.any? do |entry|
|
155
|
+
entry.downcase == title.downcase
|
156
156
|
end
|
157
|
-
return false
|
158
157
|
end
|
159
158
|
|
160
159
|
def has_group?(name)
|
161
|
-
group_names.
|
162
|
-
|
160
|
+
return group_names.any? do |group|
|
161
|
+
group.downcase == name.downcase
|
163
162
|
end
|
164
|
-
return false
|
165
163
|
end
|
166
164
|
|
167
165
|
def hilight_header(header)
|
168
166
|
return header if (!RubeePass.hilight?)
|
169
|
-
return header.
|
167
|
+
return header.cyan
|
170
168
|
end
|
171
169
|
private :hilight_header
|
172
170
|
|
data/lib/rubeepass.rb
CHANGED
@@ -26,6 +26,7 @@ class RubeePass
|
|
26
26
|
@@MAGIC_SIG2 = 0xb54bfb67
|
27
27
|
@@VERSION = 0x00030000
|
28
28
|
|
29
|
+
attr_reader :attachment_decoder
|
29
30
|
attr_reader :db
|
30
31
|
attr_reader :gzip
|
31
32
|
attr_reader :protected_decryptor
|
@@ -337,6 +338,10 @@ class RubeePass
|
|
337
338
|
raise Error::InvalidXML.new
|
338
339
|
end
|
339
340
|
|
341
|
+
@attachment_decoder = AttachmentDecoder.new(
|
342
|
+
doc.elements["KeePassFile/Meta/Binaries"]
|
343
|
+
)
|
344
|
+
|
340
345
|
root = doc.elements["KeePassFile/Root"]
|
341
346
|
@db = Group.from_xml(self, nil, root)
|
342
347
|
end
|
@@ -463,6 +468,7 @@ class RubeePass
|
|
463
468
|
end
|
464
469
|
end
|
465
470
|
|
471
|
+
require "rubeepass/attachment_decoder"
|
466
472
|
require "rubeepass/entry"
|
467
473
|
require "rubeepass/error"
|
468
474
|
require "rubeepass/group"
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rubeepass
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 2.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Miles Whittaker
|
@@ -179,6 +179,7 @@ extra_rdoc_files: []
|
|
179
179
|
files:
|
180
180
|
- bin/rpass
|
181
181
|
- lib/rubeepass.rb
|
182
|
+
- lib/rubeepass/attachment_decoder.rb
|
182
183
|
- lib/rubeepass/entry.rb
|
183
184
|
- lib/rubeepass/error.rb
|
184
185
|
- lib/rubeepass/error/file_not_found.rb
|