adamantite 0.0.2 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/adamantite.rb +44 -45
- data/lib/base/editor/password_object_editor.rb +51 -0
- data/lib/base/password_object.rb +15 -0
- data/lib/gui/form/password_object_form_window.rb +72 -0
- data/lib/gui/screen/copy_screen.rb +1 -1
- data/lib/gui/screen/login_screen.rb +1 -1
- data/lib/gui/screen/show_screen.rb +1 -1
- metadata +5 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fb2fee60dd29d1cf4e5d3ca9fe052322b5e824769c4fb673068c75ec75bdd700
|
4
|
+
data.tar.gz: 77b65b3e70c79ea50d945566f9f7b4af841d49449fab4ba69ecde594a0093a0a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8d512ad63718365e1076946093bbf180a2e48d98a74f1ca94ebcf7f3db0f8812a8d2a021b43c653762fecd29741e602ea5c6c92e5021658f550bb1d7bf0c6ede
|
7
|
+
data.tar.gz: 2e68d7b07925cc5910fa6129371696191f0ca721c7676db9d61aad9daac4694682f3cebda5b7d3c237df3178b08064a6645e87225dbf6352d815e3c694f988d0
|
data/lib/adamantite.rb
CHANGED
@@ -8,6 +8,7 @@ require "io/console"
|
|
8
8
|
require "file_utils/file_utils"
|
9
9
|
require "pw_utils/pw_utils"
|
10
10
|
require "base/adamantite"
|
11
|
+
require "base/password_object"
|
11
12
|
require "gui/screen/login_screen"
|
12
13
|
require "gui/screen/copy_screen"
|
13
14
|
require "gui/screen/show_screen"
|
@@ -17,6 +18,7 @@ require "gui/request/login_request"
|
|
17
18
|
require "gui/request/add_password_request"
|
18
19
|
require "gui/request/update_master_password_request"
|
19
20
|
require "gui/request/set_master_password_request"
|
21
|
+
require "gui/form/password_object_form_window"
|
20
22
|
|
21
23
|
include Adamantite::FileUtils
|
22
24
|
include Adamantite::PWUtils
|
@@ -41,7 +43,7 @@ class AdamantiteApp
|
|
41
43
|
|
42
44
|
@stored_passwords = get_stored_pws.map do |title|
|
43
45
|
pw_info = get_pw_file(title)
|
44
|
-
[title, pw_info["username"], 'Copy', 'Show', 'Delete']
|
46
|
+
[title, pw_info["username"], 'Edit', 'Copy', 'Show', 'Delete']
|
45
47
|
end
|
46
48
|
@master_password = login_request.master_password
|
47
49
|
@master_password_salt = login_request.master_password_salt
|
@@ -51,13 +53,33 @@ class AdamantiteApp
|
|
51
53
|
end
|
52
54
|
|
53
55
|
body {
|
54
|
-
window('Adamantite',
|
56
|
+
window('Adamantite', 800, 400) {
|
55
57
|
margined true
|
56
58
|
|
57
59
|
vertical_box {
|
58
60
|
table {
|
59
61
|
text_column('Title')
|
60
62
|
text_column('Username')
|
63
|
+
button_column('Edit') {
|
64
|
+
on_clicked do |row|
|
65
|
+
on_save = lambda { |password_object|
|
66
|
+
stored_password = []
|
67
|
+
stored_password << password_object.website_title
|
68
|
+
stored_password << password_object.username
|
69
|
+
stored_password << 'Edit'
|
70
|
+
stored_password << 'Copy'
|
71
|
+
stored_password << 'Show'
|
72
|
+
stored_password << 'Delete'
|
73
|
+
@stored_passwords[password_object.row_index] = stored_password
|
74
|
+
}
|
75
|
+
password_title = @stored_passwords[row].first
|
76
|
+
username = @stored_passwords[row][1]
|
77
|
+
pw_info = get_pw_file(password_title)
|
78
|
+
stored_pw_selection = decrypt_pw(pw_info["iv"], pw_info["password"], @master_password, @master_password_salt)
|
79
|
+
password_object = Adamantite::Base::PasswordObject.new(password_title, username, stored_pw_selection, stored_pw_selection, row)
|
80
|
+
password_object_form_window(master_pw: @master_password, master_pw_salt: @master_password_salt, on_save: on_save, password_object: password_object).show
|
81
|
+
end
|
82
|
+
}
|
61
83
|
button_column('Copy') {
|
62
84
|
on_clicked do |row|
|
63
85
|
password_title = @stored_passwords[row].first
|
@@ -80,52 +102,29 @@ class AdamantiteApp
|
|
80
102
|
@stored_passwords.delete_at(row)
|
81
103
|
end
|
82
104
|
}
|
83
|
-
|
84
105
|
cell_rows <=> [self, :stored_passwords]
|
85
|
-
|
86
106
|
}
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
label 'Confirm Password'
|
103
|
-
text <=> [@add_password_request, :password_confirmation]
|
104
|
-
}
|
107
|
+
horizontal_box {
|
108
|
+
button('Add Password') {
|
109
|
+
on_clicked do
|
110
|
+
on_save = lambda { |password_object|
|
111
|
+
stored_password = []
|
112
|
+
stored_password << password_object.website_title
|
113
|
+
stored_password << password_object.username
|
114
|
+
stored_password << 'Edit'
|
115
|
+
stored_password << 'Copy'
|
116
|
+
stored_password << 'Show'
|
117
|
+
stored_password << 'Delete'
|
118
|
+
@stored_passwords << stored_password
|
119
|
+
}
|
120
|
+
password_object_form_window(master_pw: @master_password, master_pw_salt: @master_password_salt, on_save: on_save).show
|
121
|
+
end
|
105
122
|
}
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
new_stored_password = [@add_password_request.website_title, @add_password_request.username]
|
112
|
-
new_stored_password << 'Copy'
|
113
|
-
new_stored_password << 'Show'
|
114
|
-
new_stored_password << 'Delete'
|
115
|
-
@stored_passwords << new_stored_password
|
116
|
-
@add_password_request.website_title = ''
|
117
|
-
@add_password_request.username = ''
|
118
|
-
@add_password_request.password = ''
|
119
|
-
@add_password_request.password_confirmation = ''
|
120
|
-
end
|
121
|
-
end
|
122
|
-
}
|
123
|
-
button('Update Master Password') {
|
124
|
-
on_clicked do
|
125
|
-
update_master_password_request = Adamantite::GUI::Request::UpdateMasterPasswordRequest.new(@adamantite_object)
|
126
|
-
update_master_password_screen(update_master_password_request: update_master_password_request).show
|
127
|
-
end
|
128
|
-
}
|
123
|
+
button('Update Master Password') {
|
124
|
+
on_clicked do
|
125
|
+
update_master_password_request = Adamantite::GUI::Request::UpdateMasterPasswordRequest.new(@adamantite_object)
|
126
|
+
update_master_password_screen(update_master_password_request: update_master_password_request).show
|
127
|
+
end
|
129
128
|
}
|
130
129
|
}
|
131
130
|
}
|
@@ -0,0 +1,51 @@
|
|
1
|
+
require "base/password_object"
|
2
|
+
require "file_utils/file_utils"
|
3
|
+
require "pw_utils/pw_utils"
|
4
|
+
|
5
|
+
module Adamantite
|
6
|
+
module Base
|
7
|
+
module Editor
|
8
|
+
class PasswordObjectEditor
|
9
|
+
include FileUtils
|
10
|
+
include PWUtils
|
11
|
+
|
12
|
+
# editable_user provides the temporary user object for editing
|
13
|
+
attr_reader :editable_password_object
|
14
|
+
|
15
|
+
# initializes a user editor with nil when creating a new user
|
16
|
+
# or with an existing user when editing an existing user
|
17
|
+
def initialize(master_pw, master_pw_salt, password_object = nil)
|
18
|
+
@password_object = password_object || PasswordObject.new
|
19
|
+
@master_pw = master_pw
|
20
|
+
@master_pw_salt = master_pw_salt
|
21
|
+
reset_editable_password_object
|
22
|
+
end
|
23
|
+
|
24
|
+
def reset_editable_password_object
|
25
|
+
@editable_password_object = PasswordObject.new
|
26
|
+
@editable_password_object.website_title = @password_object.website_title
|
27
|
+
@editable_password_object.username = @password_object.username
|
28
|
+
@editable_password_object.password = @password_object.password
|
29
|
+
@editable_password_object.password_confirmation = @password_object.password_confirmation
|
30
|
+
end
|
31
|
+
|
32
|
+
# saves editable user data and returns final user to add to DB/File/Array/etc...
|
33
|
+
def save
|
34
|
+
return false unless @password_object.password == @password_object.password_confirmation
|
35
|
+
@password_object.website_title = @editable_password_object.website_title
|
36
|
+
@password_object.username = @editable_password_object.username
|
37
|
+
@password_object.password = @editable_password_object.password
|
38
|
+
@password_object.password_confirmation = @editable_password_object.password_confirmation
|
39
|
+
pw_info_for_file = make_pw_info(@password_object.username, @password_object.password, @master_pw, @master_pw_salt)
|
40
|
+
write_pw_to_file(@password_object.website_title, **pw_info_for_file)
|
41
|
+
@password_object
|
42
|
+
end
|
43
|
+
|
44
|
+
def cancel
|
45
|
+
reset_editable_password_object
|
46
|
+
nil
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module Adamantite
|
2
|
+
module Base
|
3
|
+
class PasswordObject
|
4
|
+
attr_accessor :website_title, :username, :password, :password_confirmation, :row_index
|
5
|
+
|
6
|
+
def initialize(website_title = nil, username = nil, password = nil, password_confirmation = nil, row_index = nil)
|
7
|
+
@website_title = website_title
|
8
|
+
@username = username
|
9
|
+
@password = password
|
10
|
+
@password_confirmation = password_confirmation
|
11
|
+
@row_index = row_index
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,72 @@
|
|
1
|
+
require "base/editor/password_object_editor"
|
2
|
+
|
3
|
+
module Adamantite
|
4
|
+
module GUI
|
5
|
+
module Form
|
6
|
+
class PasswordObjectFormWindow
|
7
|
+
include Glimmer::LibUI::CustomWindow
|
8
|
+
|
9
|
+
# This holds the final user produced by the form
|
10
|
+
# And, a user can be optionally passed (e.g. `user_form(user: someuser)`) when editing an existing user
|
11
|
+
option :password_object, default: nil
|
12
|
+
option :on_save, default: lambda { |password_object| }
|
13
|
+
option :master_pw
|
14
|
+
option :master_pw_salt
|
15
|
+
|
16
|
+
before_body do
|
17
|
+
@password_object_editor = Adamantite::Base::Editor::PasswordObjectEditor.new(master_pw, master_pw_salt, password_object)
|
18
|
+
end
|
19
|
+
|
20
|
+
body {
|
21
|
+
window('Password Form', 50, 50) { |password_object_form_editor|
|
22
|
+
margined true
|
23
|
+
|
24
|
+
vertical_box {
|
25
|
+
form {
|
26
|
+
entry {
|
27
|
+
label 'Website Title'
|
28
|
+
text <=> [@password_object_editor.editable_password_object, :website_title]
|
29
|
+
}
|
30
|
+
entry {
|
31
|
+
label 'Username'
|
32
|
+
text <=> [@password_object_editor.editable_password_object, :username]
|
33
|
+
}
|
34
|
+
|
35
|
+
password_entry {
|
36
|
+
label 'Password'
|
37
|
+
text <=> [@password_object_editor.editable_password_object, :password]
|
38
|
+
}
|
39
|
+
password_entry {
|
40
|
+
label 'Password Confirmation'
|
41
|
+
text <=> [@password_object_editor.editable_password_object, :password_confirmation]
|
42
|
+
}
|
43
|
+
}
|
44
|
+
horizontal_box {
|
45
|
+
stretchy false
|
46
|
+
|
47
|
+
button('Save') {
|
48
|
+
on_clicked do
|
49
|
+
self.password_object = @password_object_editor.save
|
50
|
+
on_save.call(password_object)
|
51
|
+
password_object_form_editor.destroy
|
52
|
+
end
|
53
|
+
}
|
54
|
+
|
55
|
+
button('Cancel') {
|
56
|
+
on_clicked do
|
57
|
+
@password_object_editor.cancel
|
58
|
+
password_object_form_editor.destroy
|
59
|
+
end
|
60
|
+
}
|
61
|
+
}
|
62
|
+
}
|
63
|
+
|
64
|
+
on_closing do
|
65
|
+
@password_object_editor.cancel
|
66
|
+
end
|
67
|
+
}
|
68
|
+
}
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: adamantite
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jake Bruemmer
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-11-
|
11
|
+
date: 2023-11-11 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: A local password manager written in Ruby.
|
14
14
|
email: jakebruemmer@gmail.com
|
@@ -21,7 +21,10 @@ files:
|
|
21
21
|
- lib/adamantite.rb
|
22
22
|
- lib/adamantite_command_line.rb
|
23
23
|
- lib/base/adamantite.rb
|
24
|
+
- lib/base/editor/password_object_editor.rb
|
25
|
+
- lib/base/password_object.rb
|
24
26
|
- lib/file_utils/file_utils.rb
|
27
|
+
- lib/gui/form/password_object_form_window.rb
|
25
28
|
- lib/gui/request/add_password_request.rb
|
26
29
|
- lib/gui/request/login_request.rb
|
27
30
|
- lib/gui/request/set_master_password_request.rb
|