adamantite 0.0.2 → 0.0.3

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 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