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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 12c65083b751c2460cbc017507793dd3202f27c701b58a1c6b7d7d0612a683ab
4
- data.tar.gz: 8c7d30ff3442a5d137058e00ccf0f1d3ee619c55214ba98feea29ed2a9caa66e
3
+ metadata.gz: fb2fee60dd29d1cf4e5d3ca9fe052322b5e824769c4fb673068c75ec75bdd700
4
+ data.tar.gz: 77b65b3e70c79ea50d945566f9f7b4af841d49449fab4ba69ecde594a0093a0a
5
5
  SHA512:
6
- metadata.gz: 88eefbbf38673ff319d324bf51d101a2a6d0ba87a3f614bcdf8bbf1804bbcfd969ac70c7420bb82d0f17917d181f792bfca6a9d5ec6a0cc325c9da00d24972f6
7
- data.tar.gz: d2ae10748dc73c4f9d83984ca6e38d279b9a182893f311cb41f675b0c35e6ac290451292a3b15817f254a0ebb373d3f5b7f86cdc9073afb061b7ec899d993b6a
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', 600, 400) {
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
- vertical_box {
88
- form {
89
- entry {
90
- label 'Website Title'
91
- text <=> [@add_password_request, :website_title]
92
- }
93
- entry {
94
- label 'Username'
95
- text <=> [@add_password_request, :username]
96
- }
97
- password_entry {
98
- label 'Password'
99
- text <=> [@add_password_request, :password]
100
- }
101
- password_entry {
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
- horizontal_box {
107
- button('Add Password') {
108
- on_clicked do
109
- @add_password_request.confirm_and_add_password!
110
- if @add_password_request.password_saved
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
@@ -7,7 +7,7 @@ module Adamantite
7
7
  option :password_title
8
8
 
9
9
  body {
10
- window('Copy', 400, 100) {
10
+ window('Adamantite - Copy Password', 400, 100) {
11
11
  margined true
12
12
  label("Copied password for #{password_title} to your clipboard.")
13
13
  }
@@ -8,7 +8,7 @@ module PWManager
8
8
  option :login_request
9
9
 
10
10
  body {
11
- window('Adamantite', 400, 100) {
11
+ window('Adamantite - Login', 400, 100) {
12
12
  margined true
13
13
 
14
14
  vertical_box {
@@ -7,7 +7,7 @@ module Adamantite
7
7
  option :password
8
8
 
9
9
  body {
10
- window('Show', 400, 100) {
10
+ window('Adamantite - Show Password', 400, 100) {
11
11
  margined true
12
12
 
13
13
  label("#{password}")
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.2
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-09 00:00:00.000000000 Z
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