rubeepass 1.1.2 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|