opensecret 0.0.959 → 0.0.960

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
  SHA1:
3
- metadata.gz: ced0dc3656c2318960d7c747cd24e8eacb189224
4
- data.tar.gz: dcca8f54f93da21ef00d6fbbdba0e8975ac7ddca
3
+ metadata.gz: b95962b0946200185b87257ef12fbfab9e689ecd
4
+ data.tar.gz: 40eb3bb6b0a401192e33a92b23053d35755f7c51
5
5
  SHA512:
6
- metadata.gz: 219cd0fe00537778fb1364d6a214856bea94be3196e399177bbcbd912ffab087dda9bb01fb906ad1fd7f078f15f27b9d1c24d82894fb1790f592e838487aa10e
7
- data.tar.gz: 2ba3881642795bf29de00431cbd7926b664b3d0a0031f18eb17b2dc5d79d282f8df7ccb32559720e614be52229e2ec8eb59b924282b88596960ab10fa52bc8cf
6
+ metadata.gz: 8e6c1c61a35e114c6e20e5d8192c3d1a2b996fb6bb65ebd58858f268d2839d5d629824883b2efc8ef8e50faf064f13efcf77e850986313baa168fb0ea06caf10
7
+ data.tar.gz: 8f511f4f83d18d85a3891ef504bef7b60a8f8bcb59e427d86f24acf928315d765132be999a0aa63a2aec4cd818e7b96ab61df59346fc6753c94c30fa4bc14b66
@@ -12,6 +12,36 @@
12
12
  class String
13
13
 
14
14
 
15
+ # Overtly long file paths (eg in logs) can hamper readability so this
16
+ # <b>human readable filepath converter</b> counters the problem by
17
+ # returning (only) the 2 immediate ancestors of the filepath.
18
+ #
19
+ # So this method returns the name of the grandparent folder then parent folder
20
+ # and then the most significant file (or folder) name.
21
+ #
22
+ # When this is not possible due to the filepath being colisively near the
23
+ # filesystem's root, it returns the parameter name.
24
+ #
25
+ # @example
26
+ # A really long input like
27
+ # => /home/joe/project/degrees/math/2020
28
+ # is reduced to
29
+ # => degrees/math/2020
30
+ #
31
+ # @return [String] the segmented 3 most significant path name elements.
32
+ def hr_path
33
+
34
+ object_name = File.basename self
35
+ parent_folder = File.dirname self
36
+ parent_name = File.basename parent_folder
37
+ granny_folder = File.dirname parent_folder
38
+ granny_name = File.basename granny_folder
39
+
40
+ return [granny_name,parent_name,object_name].join("/")
41
+
42
+ end
43
+
44
+
15
45
  # Return a new string matching this one with every non alpha-numeric
16
46
  # character removed. This string is left unchanged.
17
47
  #
@@ -24,6 +24,10 @@ stamp.key = stamp
24
24
  stamp.14 = rb>> OpenSession::Stamp.yyjjj_hhmm_sst
25
25
  stamp.23 = rb>> OpenSession::Stamp.yyjjj_hhmm_ss_nanosec
26
26
 
27
+ base.path = rb>> File.join FilePath.context_path(@s[:name]), @s[:email_address]
28
+ store.keyspath = rb>> File.join @s[:base_path], "coldstore.keys"
29
+ store.mainpath = rb>> File.join @s[:base_path], "coldstore.main"
30
+
27
31
  machine.key.x = os.x
28
32
  separator.a = %$os$%
29
33
  publickey.id = public.key
@@ -0,0 +1,145 @@
1
+ #!/usr/bin/ruby
2
+ # coding: utf-8
3
+
4
+ module OpenSecret
5
+
6
+ # Cold storage can sync repositories with a <b>bias during conflicts</b>
7
+ # either to the <em>remote repository</em> <b>when pulling</b>, and then
8
+ # conversely to the <em>local reposiory</em> <b>when pushing</b>.
9
+ #
10
+ # In between the sync operations a ColdStore can create, read, update and
11
+ # delete to and from the local mirror.
12
+ #
13
+ # == ColdStore | Use Cases
14
+ #
15
+ # Any <b>self-respecting coldstore</b> must, after initialization, provide
16
+ # some basic (and mandatory) behaviour.
17
+ #
18
+ # These include
19
+ #
20
+ # - <b>read</b> - reading text from a (possibly unavailable) frozen path
21
+ # - <b>write</b> - writing text (effectively freezing it) to a path
22
+ # - <b>pull</b> - sync with a <b>collision bias</b> that favours the remote mirror
23
+ # - <b>push</b> - sync with a <b>collision bias</b> that favours the local mirror
24
+ #
25
+ # <b>Cold Storage</b> is borrowed from BitCoin and represents offline storage
26
+ # for keys and crypts. opensecret separates keys and crypts so that you can
27
+ # transfer and share secrets by moving keys (not the crypts).
28
+ #
29
+ # == Houses and Gold Bullion
30
+ #
31
+ # You don't carry houses or gold bullion around to rent, share or transfer
32
+ # their ownership.
33
+ #
34
+ # You copy keys to rent secrets and when the tenure is up (or you change your
35
+ # mind) you revoke access with a metaphorical lock change.
36
+ #
37
+ # opensecret embodies concepts like an owner who rents as opposed to a change
38
+ # in ownership.
39
+ #
40
+ # == trade secrets | commoditizing secrets
41
+ #
42
+ # opensecret is a conduit through which secrets can be bought and sold.
43
+ #
44
+ # It commoditizes secrets so that they can be owned, traded, leased and
45
+ # auctioned. Options to acquire or relinquish them at set prices can easily
46
+ # be taken out.
47
+ class ColdStore
48
+
49
+ # @param base_path [String]
50
+ # path to the store's (mirror) base directory.
51
+ # If the denoted directory does not exist an attempt will be made to
52
+ # create it. If a file exists at this path an error will be thrown.
53
+ #
54
+ # @param domain [String]
55
+ # the domain is an identifier (and namespace) denoting which opensecret
56
+ # "account" is being accessed. opensecret allows the creation and use of
57
+ # multiple domains.
58
+ def initialize local_path
59
+
60
+ @store_path = local_path
61
+ FileUtils.mkdir_p @store_path
62
+
63
+ end
64
+
65
+
66
+ # Read the file frozen (in this store mirror) at this path and
67
+ # return its contents.
68
+ #
69
+ # Coldstores are usually frozen offline (offmachine) so for this
70
+ # to work the {ColdStore.pull} behaviour must have executed to
71
+ # create a local store mirror. This method reads from that mirror.
72
+ #
73
+ # @param from_path [String]
74
+ # read the file frozen at this path and return its contents
75
+ # so that the defreeze process can begin.
76
+ #
77
+ # This path is relative to the base of the store defined in
78
+ # the constructor.
79
+ #
80
+ # @return [String]
81
+ # return the text frozen in a file at the denoted local path
82
+ #
83
+ # nil is reurned if no file can be found in the local mirror
84
+ # at the configured path
85
+ def read from_path
86
+
87
+ frozen_filepath = File.join @store_path, from_path
88
+ return nil unless File.exists? frozen_filepath
89
+ return File.read frozen_filepath
90
+
91
+ end
92
+
93
+
94
+ # Write (freeze) the text into a file at the denoted path. The
95
+ # folder path will be created if need be.
96
+ #
97
+ # Coldstores are usually frozen offline (offmachine) so after
98
+ # this method completes the {ColdStore.push} behaviour must be
99
+ # executed to synchronize the local coldstore freezer with the
100
+ # remote mirror.
101
+ #
102
+ # @param this_text [String]
103
+ # this is the text that needs to be frozen into the local and
104
+ # subsequently the remote coldstore freezer.
105
+ #
106
+ # @param to_path [String]
107
+ # write the text (effectively freezing it) into the file at
108
+ # this path. An attempt will be made to put down the necessary
109
+ # directory structure.
110
+ #
111
+ # This path is relative to the base of the store defined in
112
+ # the constructor.
113
+ def write this_text, to_path
114
+
115
+ freeze_filepath = File.join @store_path, to_path
116
+
117
+ log.info(x) { "ColdStore freezing #{this_text.length} characters of worthless text."}
118
+ log.info(x) { "ColdStore freeze file path => #{freeze_filepath.hr_path}"}
119
+
120
+ FileUtils.mkdir_p(File.dirname(freeze_filepath))
121
+ File.write freeze_filepath, this_text
122
+
123
+ end
124
+
125
+
126
+ private
127
+
128
+ # @todo - write sync (with a local bias during conflicts)
129
+ # The open up to the public (published) api.
130
+ def push
131
+
132
+
133
+ end
134
+
135
+ # @todo - write sync (with a rmote bias during conflicts)
136
+ # The open up to the public (published) api.
137
+ def pull
138
+
139
+ end
140
+
141
+
142
+ end
143
+
144
+
145
+ end
@@ -40,31 +40,6 @@ module OpenSecret
40
40
  class Envelope < Hash
41
41
 
42
42
 
43
- # Write the data in this envelope hash map into a file-system
44
- # backed mirror whose path was specified in the {self.read} method.
45
- #
46
- # Technology for encryption at rest is supported by this dictionary
47
- # and to this aim, please endeavour to post a robust symmetric
48
- # encryption key.
49
- #
50
- # Calling this {self.write} method when the file at the prescribed path
51
- # does not exist results in the directory structure being created
52
- # (if necessary) and then the encrypted file being written.
53
- #
54
- # @param encryption_key [String]
55
- # encryption at rest is a given so this mandatory parameter must
56
- # contain a robust symmetric encryption key. The symmetric key will
57
- # be used for the decryption after the read. Note that the decryption
58
- # key does not linger meaning it isn't cached in an instance variable.
59
- def write encryption_key
60
-
61
- FileUtils.mkdir_p(File.dirname(@filepath))
62
- cipher_text = Base64.encode64 Blowfish.new.encryptor( self.to_json, encryption_key )
63
- File.write @filepath, cipher_text
64
-
65
- end
66
-
67
-
68
43
  # Read and inject into this envelope, the data structure found in a
69
44
  # file at the path specified in the first parameter.
70
45
  #
@@ -110,6 +85,31 @@ module OpenSecret
110
85
  end
111
86
 
112
87
 
88
+ # Write the data in this envelope hash map into a file-system
89
+ # backed mirror whose path was specified in the {self.read} method.
90
+ #
91
+ # Technology for encryption at rest is supported by this dictionary
92
+ # and to this aim, please endeavour to post a robust symmetric
93
+ # encryption key.
94
+ #
95
+ # Calling this {self.write} method when the file at the prescribed path
96
+ # does not exist results in the directory structure being created
97
+ # (if necessary) and then the encrypted file being written.
98
+ #
99
+ # @param encryption_key [String]
100
+ # encryption at rest is a given so this mandatory parameter must
101
+ # contain a robust symmetric encryption key. The symmetric key will
102
+ # be used for the decryption after the read. Note that the decryption
103
+ # key does not linger meaning it isn't cached in an instance variable.
104
+ def write encryption_key
105
+
106
+ FileUtils.mkdir_p(File.dirname(@filepath))
107
+ cipher_text = Base64.encode64 Blowfish.new.encryptor( self.to_json, encryption_key )
108
+ File.write @filepath, cipher_text
109
+
110
+ end
111
+
112
+
113
113
  end
114
114
 
115
115
 
@@ -67,55 +67,35 @@ module OpenSecret
67
67
  # - deletion of {Open}ed session data to locate and decrypt envelope
68
68
  def execute
69
69
 
70
+ rel_filepath = OpenSession::Attributes.instance.get_value @@context_name, @c[:open][:open_name], @c[:open][:open_pathname]
71
+ master_public_key = Base64.urlsafe_decode64( OpenSession::Attributes.instance.get_value @c[:global][:name], @c[:global][:name], "public.key" )
72
+
73
+ main_store = ColdStore.new @c[:global][:store_mainpath]
74
+ keys_store = ColdStore.new @c[:global][:store_keyspath]
75
+
70
76
  envelope = get_envelope
71
77
  asym_key = OpenSSL::PKey::RSA.new @c[:global][:bit_key_size]
72
78
  lockdown = Aes256.new.encrypt_it( asym_key.public_key.to_pem, envelope.to_json )
79
+ lockedup = Aes256.new.encrypt_it( master_public_key, asym_key.export )
73
80
 
74
- #### ###########################################
75
- #### ###########################################
76
- #### Now Give lockdown to the Backend Store
77
- #### ###########################################
78
- #### ###########################################
81
+ ##### ###################################### #####
82
+ ##### ###################################### #####
83
+ ### Now put the CRYPTS into [Cold] Storage ###
84
+ ##### ###################################### #####
85
+ ##### ###################################### #####
79
86
 
80
- master_public_key = Base64.urlsafe_decode64( OpenSession::Attributes.instance.get_value @c[:global][:name], @c[:global][:name], "public.key" )
87
+ keys_store.write lockedup, rel_filepath
88
+ main_store.write lockdown, rel_filepath
81
89
 
82
- lockedup = Aes256.new.encrypt_it( master_public_key, asym_key.export )
83
-
84
- puts "#### #############################"
85
- puts "#### The Crypt Store Suitcase"
86
- puts "#### #############################"
87
- puts ""
88
- puts lockdown
89
- puts ""
90
- puts "#### #############################"
91
- puts "#### The Key Store Suitcase"
92
- puts "#### #############################"
93
90
  puts ""
94
- puts lockedup
91
+ puts "================================================================="
92
+ puts "[Lock] => Now DELETE the session files and configured variables."
93
+ puts "================================================================="
95
94
  puts ""
96
- puts "================================================================================================="
97
- puts "Now Continue with Unencoding the public key and then locking down the above asym_key.export"
98
- puts "================================================================================================="
99
- puts ""
100
-
101
- exit
102
-
103
-
104
- locked_block = Aes256.new.encrypt_it( asym_key.public_key.to_pem, asym_key.export )
105
-
106
- secured_keytext = asym_key.export
107
- ## public_key_text = asymmetric_keys.public_key.to_pem
108
-
109
-
110
- Aes256.new.encrypt_it( "rubbish", secrets_dictionary.to_s )
111
-
112
- the_encrypted_stuff = Aes256.new.encrypt_it( "rubbish", )
113
-
114
95
 
115
96
  #############################################################################################
116
97
  #############################################################################################
117
98
 
118
-
119
99
  =begin
120
100
  Crypto.print_secret_env_var @p[:env_var_name], machine_key
121
101
  GitFlow.do_clone_repo @p[:public_gitrepo], @p[:local_gitrepo]
@@ -125,7 +105,6 @@ module OpenSecret
125
105
  =end
126
106
 
127
107
 
128
- # exit
129
108
  # key4_pem = File.read 'private.secure.pem'
130
109
  # pass_phrase = 'superduperpasswordistoBeENTEREDRIGHT1234HereandRightNOW'
131
110
  # key4 = OpenSSL::PKey::RSA.new key4_pem, pass_phrase
@@ -134,8 +113,6 @@ module OpenSecret
134
113
  # print "\nHey we have done the decryption.\n", "\n"
135
114
  # print decrypted_text, "\n"
136
115
 
137
-
138
-
139
116
  #############################################################################################
140
117
  #############################################################################################
141
118
 
@@ -0,0 +1,53 @@
1
+ #!/usr/bin/ruby
2
+ # coding: utf-8
3
+
4
+ module OpenSession
5
+
6
+ require 'inifile'
7
+ require 'singleton'
8
+
9
+ class FilePath
10
+
11
+ # Get the directory that the session context file either does
12
+ # or will sit inside.
13
+ #
14
+ # The directory hangs off the home directory and is named simply
15
+ # as the dot prefixed context_name.
16
+ #
17
+ # @example ~/.openbox is the directory for context "openbox"
18
+ #
19
+ # @param context_name [String] name of program (or use case) context
20
+ # @return [String] path to directory holding context configuration file
21
+ def self.context_path context_name
22
+
23
+ return File.join home_directory, ".#{context_name}"
24
+
25
+ end
26
+
27
+
28
+ # On non-windows systems the home directory is defined
29
+ # perfectly by Ruby's Dir object.
30
+ #
31
+ # On Windows we sometimes get /AppData/Roaming appended
32
+ # onto the actual home directory. In these cases this
33
+ # method removes it.
34
+ #
35
+ # @return [String] the path to the machine user's home directory
36
+ def self.home_directory
37
+
38
+ return Dir.home unless Gem.win_platform?
39
+
40
+ extraneous_path = "/AppData/Roaming"
41
+ if Dir.home.end_with? extraneous_path then
42
+ return Dir.home.gsub( extraneous_path, "" )
43
+ end
44
+
45
+ return Dir.home
46
+
47
+ end
48
+
49
+
50
+ end
51
+
52
+
53
+ end
@@ -1,3 +1,3 @@
1
1
  module OpenSecret
2
- VERSION = "0.0.959"
2
+ VERSION = "0.0.960"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: opensecret
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.959
4
+ version: 0.0.960
5
5
  platform: ruby
6
6
  authors:
7
7
  - Apollo Akora
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-03-08 00:00:00.000000000 Z
11
+ date: 2018-03-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: inifile
@@ -99,9 +99,9 @@ files:
99
99
  - lib/plugins/cipher.rb
100
100
  - lib/plugins/ciphers/aes-256.rb
101
101
  - lib/plugins/ciphers/blowfish.rb
102
+ - lib/plugins/coldstore.rb
102
103
  - lib/plugins/envelope.rb
103
104
  - lib/plugins/secrets.uc.rb
104
- - lib/plugins/stores/store.rb
105
105
  - lib/plugins/usecase.rb
106
106
  - lib/plugins/usecases/init.rb
107
107
  - lib/plugins/usecases/lock.rb
@@ -111,6 +111,7 @@ files:
111
111
  - lib/session/attributes.rb
112
112
  - lib/session/dictionary.rb
113
113
  - lib/session/fact.finder.rb
114
+ - lib/session/file.path.rb
114
115
  - lib/session/require.gem.rb
115
116
  - lib/session/session.rb
116
117
  - lib/session/time.stamp.rb
@@ -1,4 +0,0 @@
1
- #!/usr/bin/ruby
2
- # coding: utf-8
3
-
4
- ## Nothing here yet.