opensecret 0.0.913 → 0.0.941

Sign up to get free protection for your applications and to get access to all the features.
Files changed (40) hide show
  1. checksums.yaml +4 -4
  2. data/.yardopts +3 -0
  3. data/README.md +129 -19
  4. data/Rakefile +0 -9
  5. data/bin/opensecret +1 -1
  6. data/lib/{opensecret/plugins.io/cipher/crypto.rb → crypto/amalgam.rb} +6 -8
  7. data/lib/crypto/collect.rb +139 -0
  8. data/lib/crypto/engineer.rb +201 -0
  9. data/lib/crypto/verify.rb +33 -0
  10. data/lib/extension/array.rb +133 -0
  11. data/lib/{opensecret/additions → extension}/dir.rb +0 -0
  12. data/lib/extension/file.rb +56 -0
  13. data/lib/extension/hash.rb +33 -0
  14. data/lib/extension/string.rb +349 -0
  15. data/lib/factbase/facts.opensecret.io.ini +28 -0
  16. data/lib/logging/gem.logging.rb +133 -0
  17. data/lib/opensecret.rb +102 -45
  18. data/lib/opensecret/executors/crypt.keys/crypt.keys.ini +0 -53
  19. data/lib/session/{session.rb → attributes.rb} +60 -5
  20. data/lib/session/exceptions.rb +53 -0
  21. data/lib/session/fact.finder.rb +684 -0
  22. data/lib/session/user.home.rb +49 -0
  23. data/lib/usecase/usecase.rb +245 -0
  24. data/lib/usecase/usecases/init.rb +190 -0
  25. data/lib/usecase/usecases/on.rb +33 -0
  26. data/lib/usecase/usecases/safe.rb +95 -0
  27. data/lib/version.rb +1 -1
  28. metadata +22 -17
  29. data/lib/opensecret/additions/array.rb +0 -117
  30. data/lib/opensecret/additions/string.rb +0 -312
  31. data/lib/opensecret/commons/eco.cmdline.rb +0 -446
  32. data/lib/opensecret/eco.do.rb +0 -46
  33. data/lib/opensecret/plugins.io/error/eco.exceptions.rb +0 -24
  34. data/lib/opensecret/plugins.io/facts/fact.chars.rb +0 -66
  35. data/lib/opensecret/plugins.io/facts/fact.factor.rb +0 -156
  36. data/lib/opensecret/plugins.io/facts/fact.locator.rb +0 -105
  37. data/lib/opensecret/plugins.io/facts/fact.reader.rb +0 -137
  38. data/lib/opensecret/plugins.io/facts/fact.tree.rb +0 -661
  39. data/lib/opensecret/plugins.io/logs/log.object.rb +0 -89
  40. data/lib/opensecret/plugins.io/logs/logging.rb +0 -203
@@ -0,0 +1,33 @@
1
+ #!/usr/bin/ruby
2
+
3
+ module OpenSecret
4
+
5
+ # This class verifies domain names, email addresses and othe external
6
+ # reference data.
7
+ class Verify
8
+
9
+ # Register two fundamental opensecret crypt pointers
10
+ #
11
+ # - an opensecret domain like » **lecturers@harvard**
12
+ # - the url to a backend store like Git, S3 or an SSH accessible drive.
13
+ #
14
+ # The domain will be extended to cover verified internet domains.
15
+ # They will also latch onto LDAP domains so when admins add, revoke
16
+ # or remove users, their opensecret access is adjusted accordingly.
17
+ #
18
+ # @param domain [String] the DOMAIN eg lecturers@harvard for your family or work group.
19
+ # @param store_url [String] the STORE_URL for connecting to the backend storage service
20
+ #
21
+ def self.vreify_domain domain, store_url
22
+
23
+ # -> read config file map
24
+ # -> create new domain in map
25
+ # -> add type and store url to map
26
+ # -> backup configuration
27
+ # -> overwrite the ini config file
28
+
29
+ end
30
+
31
+ end
32
+
33
+ end
@@ -0,0 +1,133 @@
1
+ #!/usr/bin/ruby
2
+
3
+ #
4
+ # Reopen the core ruby Array class and add the below methods to it.
5
+ #
6
+ # Case Sensitivity rules for [ALL] the below methods that are
7
+ # added to the core Ruby string class.
8
+ #
9
+ # For case insensitive behaviour make sure you downcase both the
10
+ # string object and the parameter strings (or strings within
11
+ # other parameter objects, like arrays and hashes).
12
+ class Array
13
+
14
+
15
+ # Log the array using our logging mixin by printing every array
16
+ # item into its own log line. In most cases we (the array) are
17
+ # a list of strings, however if not, each item's to_string method
18
+ # is invoked and the result printed using one log line.
19
+ #
20
+ # The INFO log level is used to log the lines - if this is not
21
+ # appropriate create a (level) parameterized log lines method.
22
+ def log_lines
23
+
24
+ self.each do |line|
25
+ clean_line = line.to_s.chomp.gsub("\\n","")
26
+ log.info(x) { line } if clean_line.length > 0
27
+ end
28
+
29
+ end
30
+
31
+
32
+ # Get the text [in between] this and that delimeter [exclusively].
33
+ # Exclusively means the returned text [does not] include either of
34
+ # the matched delimeters (although an unmatched instance of [this]
35
+ # delimeter may appear in the in-between text).
36
+ #
37
+ # --------------------
38
+ # Multiple Delimiters
39
+ # --------------------
40
+ #
41
+ # When multiple delimiters exist, the text returned is in between the
42
+ #
43
+ # [a] - first occurrence of [this] delimeter AND the
44
+ # [b] - 1st occurrence of [that] delimeter [AFTER] the 1st delimiter
45
+ #
46
+ # Instances of [that] delimiter occurring before [this] are ignored.
47
+ # The text could contain [this] delimeter instances but is guaranteed
48
+ # not to contain a [that] delimeter.
49
+ #
50
+ # -----------
51
+ # Parameters
52
+ # -----------
53
+ #
54
+ # this_delimiter : begin delimeter (not included in returned string)
55
+ # that_delimiter : end delimeter (not included in returned string)
56
+ #
57
+ # -----------
58
+ # Exceptions
59
+ # -----------
60
+ #
61
+ # An exception (error) will be thrown if
62
+ #
63
+ # => any nil (or empties) exist in the input parameters
64
+ # => [this] delimeter does not appear in the in_string
65
+ # => [that] delimeter does not appear after [this] one
66
+ #
67
+ def before_and_after begin_delimeter, end_delimeter
68
+
69
+ Throw.if_nil_or_empty_strings [ self, begin_delimeter, end_delimeter ]
70
+
71
+ before_after_lines = []
72
+ in_middle_bit = false
73
+
74
+ self.each do |candidate_line|
75
+
76
+ is_middle_boundary = !in_middle_bit && candidate_line.downcase.include?(begin_delimeter.downcase)
77
+ if is_middle_boundary
78
+ in_middle_bit = true
79
+ next
80
+ end
81
+
82
+ unless in_middle_bit
83
+ before_after_lines.push candidate_line
84
+ next
85
+ end
86
+
87
+ #--
88
+ #-- Now we are definitely in the middle bit.
89
+ #-- Let's check for the middle end delimeter
90
+ #--
91
+ if candidate_line.downcase.include? end_delimeter.downcase
92
+ in_middle_bit = false
93
+ end
94
+
95
+ end
96
+
97
+ return before_after_lines
98
+
99
+ end
100
+
101
+
102
+ def middlle_bit begin_delimeter, end_delimeter
103
+
104
+ Throw.if_nil_or_empty_strings [ self, begin_delimeter, end_delimeter ]
105
+
106
+ middle_lines = []
107
+ in_middle_bit = false
108
+
109
+ self.each do |candidate_line|
110
+
111
+ is_middle_boundary = !in_middle_bit && candidate_line.downcase.include?(begin_delimeter.downcase)
112
+ if is_middle_boundary
113
+ in_middle_bit = true
114
+ next
115
+ end
116
+
117
+ end_of_middle = in_middle_bit && candidate_line.downcase.include?(end_delimeter.downcase)
118
+ return middle_lines if end_of_middle
119
+
120
+ #--
121
+ #-- We are definitely in the middle bit.
122
+ #--
123
+ middle_lines.push(candidate_line) if in_middle_bit
124
+
125
+ end
126
+
127
+ unreachable_str = "This point should be unreachable unless facts are ended."
128
+ raise RuntimeError.new unreachable_str
129
+
130
+ end
131
+
132
+
133
+ end
@@ -0,0 +1,56 @@
1
+ #!/usr/bin/ruby
2
+
3
+ # Reopen the core ruby File class and add the below methods to it.
4
+ class File
5
+
6
+ # This method adds (logging its own contents) behaviour to
7
+ # the standard library {File} class. If this File points to
8
+ # a directory - that folder's single level content files are
9
+ # listed inside the logs.
10
+ #
11
+ # The <tt>DEBUG</tt> log level is used for logging. To change this
12
+ # create a new parameterized method.
13
+ #
14
+ # @param file_context [String] context denotes the whys and wherefores of this file.
15
+ def log_contents file_context
16
+
17
+ ## This will fail - add physical raise statement.
18
+ Throw.if_not_exists self
19
+
20
+ log.debug(x) { "# -- ------------------------------------------------------------------------ #" }
21
+ log.debug(x) { "# -- ------------------------------------------------------------------------ #" }
22
+ log.debug(x) { "# -- The File Path to Log => #{self}" }
23
+
24
+ hr_file_size = PrettyPrint.byte_size( File.size(self) )
25
+ dotless_extension = File.extname( self )[1..-1]
26
+ parent_dir_name = File.basename( File.dirname( self ) )
27
+ file_name = File.basename self
28
+ is_zip = dotless_extension.eql? "zip"
29
+
30
+ log.debug(x) { "# -- ------------------------------------------------------------------------ #" }
31
+ log.debug(x) { "# -- File Name => #{file_name}" }
32
+ log.debug(x) { "# -- File Size => #{hr_file_size}" }
33
+ log.debug(x) { "# -- File Type => #{file_context}" }
34
+ log.debug(x) { "# -- In Folder => #{parent_dir_name}" }
35
+ log.debug(x) { "# -- ------------------------------------------------------------------------ #" }
36
+
37
+ log.debug(x) { "File #{file_name} is a zip (binary) file." } if is_zip
38
+ return if is_zip
39
+
40
+ File.open( self, "r") do | file_obj |
41
+ line_no = 1
42
+ file_obj.each_line do | file_line |
43
+ line_num = sprintf '%03d', line_no
44
+ clean_line = file_line.chomp.strip
45
+ log.debug(x) { "# -- [#{line_num}] - #{clean_line}" }
46
+ line_no += 1
47
+ end
48
+ end
49
+
50
+ log.debug(x) { "# -- ------------------------------------------------------------------------ #" }
51
+ log.debug(x) { "# -- [#{file_context}] End of File [ #{File.basename(self)} ]" }
52
+ log.debug(x) { "# -- ------------------------------------------------------------------------ #" }
53
+
54
+ end
55
+
56
+ end
@@ -0,0 +1,33 @@
1
+ #!/usr/bin/ruby
2
+
3
+ # Reopen the core ruby Hash class and add the below methods to it.
4
+ class Hash
5
+
6
+ # This method adds (logging its own contents) behaviour to
7
+ # the standard library {Hash} class.
8
+ #
9
+ # @note This behaviour does not consider that SECRETS may be inside
10
+ # the key value maps - it logs itself without a care in the world.
11
+ # This functionality must be included if this behaviourr is used by
12
+ # any cryptography classes.
13
+ #
14
+ # The <tt>DEBUG</tt> log level is used for logging. To change this
15
+ # create a new parameterized method.
16
+ def log_contents
17
+
18
+ log.debug(x) { "# --- ----------------------------------------------" }
19
+ log.debug(x) { "# --- Map has [#{self.length}] key/value pairs." }
20
+ log.debug(x) { "# --- ----------------------------------------------" }
21
+
22
+ self.each do |the_key, the_value|
23
+
24
+ padded_key = sprintf '%-33s', the_key
25
+ log.debug(x) { "# --- #{padded_key} => #{the_value}" }
26
+
27
+ end
28
+
29
+ log.debug(x) { "# --- ----------------------------------------------" }
30
+
31
+ end
32
+
33
+ end
@@ -0,0 +1,349 @@
1
+ #!/usr/bin/ruby
2
+
3
+
4
+ # Reopen the core ruby String class and add the below methods to it.
5
+ #
6
+ # Case Sensitivity rules for [ALL] the below methods that are
7
+ # added to the core Ruby string class.
8
+ #
9
+ # For case insensitive behaviour make sure you downcase both the
10
+ # string object and the parameter strings (or strings within
11
+ # other parameter objects, like arrays and hashes).
12
+ class String
13
+
14
+
15
+ # Get the text [in between] this and that delimeter [exclusively].
16
+ # Exclusively means the returned text [does not] include either of
17
+ # the matched delimeters (although an unmatched instance of [this]
18
+ # delimeter may appear in the in-between text).
19
+ #
20
+ # ### Multiple Delimiters
21
+ #
22
+ # When multiple delimiters exist, the text returned is in between the
23
+ #
24
+ # - first occurrence of [this] delimeter AND the
25
+ # - 1st occurrence of [that] delimeter [AFTER] the 1st delimiter
26
+ #
27
+ # Instances of [that] delimiter occurring before [this] are ignored.
28
+ # The text could contain [this] delimeter instances but is guaranteed
29
+ # not to contain a [that] delimeter.
30
+ #
31
+ # @throw an exception (error) will be thrown if
32
+ #
33
+ # - any nil (or empties) exist in the input parameters
34
+ # - **this** delimeter does not appear in the in_string
35
+ # - **that** delimeter does not appear after [this] one
36
+ #
37
+ # @param this_delimeter [String] begin delimeter (not included in returned string)
38
+ # @param that_delimeter [String] end delimeter (not included in returned string)
39
+ #
40
+ # @return [String] the text in between (excluding) the two parameter delimiters
41
+ def in_between this_delimeter, that_delimeter
42
+
43
+ raise ArgumentError, "This string is NIL or empty." if self.nil? || self.empty?
44
+ raise ArgumentError, "Begin delimiter is NIL or empty." if this_delimiter.nil? || this_delimiter.empty?
45
+ raise ArgumentError, "End delimiter is NIL or empty." if that_delimiter.nil? || that_delimiter.empty?
46
+
47
+ scanner_1 = StringScanner.new self
48
+ scanner_1.scan_until /#{this_delimeter}/
49
+ scanner_2 = StringScanner.new scanner_1.post_match
50
+ scanner_2.scan_until /#{that_delimeter}/
51
+
52
+ in_between_text = scanner_2.pre_match.strip
53
+ log.info(ere){ in_between_text }
54
+
55
+ return in_between_text
56
+
57
+ end
58
+
59
+
60
+ # Flatten (lower) a camel cased string and add periods to
61
+ # denote separation where the capital letters used to be.
62
+ #
63
+ # Example behaviour is illustrated
64
+ #
65
+ # - in => ObjectOriented
66
+ # - out => object.oriented
67
+ #
68
+ # Even when a capital letter does not lead lowercase characters
69
+ # the behaviour should resemble this.
70
+ #
71
+ # - in => SuperX
72
+ # - out => super.x
73
+ #
74
+ #
75
+ # And if every letter is uppercase, each one represents its
76
+ # own section like this.
77
+ #
78
+ # - in => BEAST
79
+ # - out => b.e.a.s.t
80
+ #
81
+ # @return [String] a flatten (period separated) version of this camel cased string
82
+ def do_flatten
83
+
84
+ snapped_str = ""
85
+ self.each_char do |this_char|
86
+ is_lower = "#{this_char}".is_all_lowercase?
87
+ snapped_str += "." unless is_lower || snapped_str.empty?
88
+ snapped_str += this_char.downcase
89
+ end
90
+
91
+ return snapped_str
92
+
93
+ end
94
+
95
+
96
+
97
+ # Return true if every character in this string is lowercase.
98
+ # Note that if this string is empty this method returns true.
99
+ #
100
+ # @return true if every alpha character in this string is lowercase
101
+ def is_all_lowercase?
102
+ return self.downcase.eql? self
103
+ end
104
+
105
+
106
+
107
+ # Flatten (lower) a camel cased string and add periods to
108
+ # denote separation where the capital letters used to be.
109
+ # The inverse operation to [ do_flatten ] which resurrects
110
+ # this (expected) period separated string changing it back
111
+ # to a camel (mountain) cased string.
112
+ #
113
+ # Example behaviour is illustrated
114
+ #
115
+ # - in => object.oriented
116
+ # - out => ObjectOriented
117
+ #
118
+ # Even when a single character exists to the right of the period
119
+ # the behaviour should resemble this.
120
+ #
121
+ # - in => super.x
122
+ # - out => SuperX
123
+ #
124
+ #
125
+ # And if every letter is period separated
126
+ #
127
+ # - in => b.e.a.s.t
128
+ # - out => BEAST
129
+ #
130
+ # @return [String] camel cased version of this flattened (period separated) string
131
+ def un_flatten
132
+
133
+ segment_array = self.strip.split "."
134
+ resurrected_arr = Array.new
135
+
136
+ segment_array.each do |seg_word|
137
+ resurrected_arr.push seg_word.capitalize
138
+ end
139
+
140
+ undone_str = resurrected_arr.join
141
+ log.info(x){ "unflattening => [#{self}] and resurrecting to => [#{undone_str}]" }
142
+
143
+ return undone_str
144
+
145
+ end
146
+
147
+
148
+
149
+ # --
150
+ # Return true if the [little string] within this
151
+ # string object is both
152
+ # --
153
+ # a] topped by the parameter prefix AND
154
+ # b] tailed by the parameter postfix
155
+ # --
156
+ # -----------------------------------------
157
+ # In the below example [true] is returned
158
+ # -----------------------------------------
159
+ # --
160
+ # This [String] => "Hey [<-secrets->] are juicy."
161
+ # little string => "secrets"
162
+ # topped string => "[<-"
163
+ # tailed string => "->]"
164
+ # --
165
+ # Why true? Because the little string "secret" is
166
+ # (wrapped) topped by "[<-" and tailed by "->]"
167
+ # --
168
+ # -----------------------------------------
169
+ # Assumptions | Constraints | Boundaries
170
+ # -----------------------------------------
171
+ # --
172
+ # - all matches are [case sensitive]
173
+ # - this string must contain little_str
174
+ # - one strike and its true
175
+ # (if little string appears more than once)
176
+ # so => "all secrets, most [<-secrets->] r juicy"
177
+ # => true as long as (at least) one is wrapped
178
+ # --
179
+ # --
180
+ def has_wrapped? little_str, prefix, postfix
181
+
182
+ return self.include?( prefix + little_str + postfix )
183
+
184
+ end
185
+
186
+
187
+ # Sandwich the first occurrence of a substring in
188
+ # this string with the specified pre and postfix.
189
+ #
190
+ # This string contains the little string and an
191
+ # IN-PLACE change is performed with the first
192
+ # occurrence of the little string being prefixed
193
+ # and postfixed with the 2 parameter strings.
194
+ #
195
+ # Example of sandwiching [wrapping]
196
+ #
197
+ # - [String] => "Hey secrets are juicy."
198
+ # - [To_Wrap] => "secrets"
199
+ # - [Prefix] => "[<-"
200
+ # - [Postfix] => "->]"
201
+ #
202
+ # [String] => "Hey [<-secrets->] are juicy."
203
+ #
204
+ # This string IS changed in place.
205
+ def sandwich_substr to_wrap_str, prefix, postfix
206
+
207
+ occurs_index = self.downcase.index to_wrap_str.downcase
208
+ self.insert occurs_index, prefix
209
+ shifted_index = occurs_index + prefix.length + to_wrap_str.length
210
+ self.insert shifted_index, postfix
211
+
212
+ end
213
+
214
+
215
+ # The parameter is a list of character sequences and TRUE is returned
216
+ # if EVERY ONE of the character sequences is always found nestled somewhere
217
+ # within this string. The matching is case-sensitive.
218
+ #
219
+ # The parameter array can be [empty] but not nil. And the harboured
220
+ # character sequences can neither be nil nor empty.
221
+ #
222
+ # @param word_array [Array] array of string words for the inclusivity test
223
+ #
224
+ # @return [Boolean] true if EVERY ONE of the char sequences appear somewhere in this string
225
+ def includes_all? word_array
226
+
227
+ raise ArgumentError, "This string is NIL" if self.nil?
228
+ raise ArgumentError, "The parameter word array is NIL" if word_array.nil?
229
+
230
+ word_array.each do |word|
231
+
232
+ raise ArgumentError, "The word array #{word_array} contains a nil value." if word.nil?
233
+ return false unless self.include? word
234
+
235
+ end
236
+
237
+ return true
238
+
239
+ end
240
+
241
+
242
+ # The parameter is a list of character sequences and TRUE is returned
243
+ # if any one of the character sequences can be found nestled somewhere
244
+ # within this string. The matching is case-sensitive.
245
+ #
246
+ # The parameter array can be [empty] but not nil. And the harboured
247
+ # character sequences can neither be nil nor empty.
248
+ #
249
+ # @param word_array [Array] array of string words for the inclusivity test
250
+ #
251
+ # @return [Boolean] true if string includes ANY one of the character sequences in array
252
+ def includes_any? word_array
253
+
254
+ raise ArgumentError, "This string is NIL" if self.nil?
255
+ raise ArgumentError, "The parameter word array is NIL" if word_array.nil?
256
+
257
+ word_array.each do |word|
258
+
259
+ raise ArgumentError, "The word array #{word_array} contains a nil value." if word.nil?
260
+ return true if self.include? word
261
+
262
+ end
263
+
264
+ return false
265
+
266
+ end
267
+
268
+
269
+ # --
270
+ # Encrypt this string with the parameter encryption/decryption key
271
+ # and return the encrypted text as a new string.
272
+ # --
273
+ # decrypt_key => the key that will decrypt the output string
274
+ # --
275
+ # --
276
+ def encrypt decrypt_key
277
+
278
+ ## ----> Write a RE-CRYPT method that goes through a folder - decrypting and recrypting
279
+ ## ----> Write a RE-CRYPT method that goes through a folder - decrypting and recrypting
280
+ ## ----> Write a RE-CRYPT method that goes through a folder - decrypting and recrypting
281
+ ## ----> Write a RE-CRYPT method that goes through a folder - decrypting and recrypting
282
+
283
+ ###### ON Linux improve by changing to OpenSSL::Cipher.new('DES-EDE3-CBC').encrypt
284
+ ###### ON Linux improve by changing to Digest::SHA2.hexdigest decrypt_key
285
+ ###### ON Linux improve by changing to OpenSSL::Cipher.new('DES-EDE3-CBC').encrypt
286
+ ###### ON Linux improve by changing to Digest::SHA2.hexdigest decrypt_key
287
+ ###### ON Linux improve by changing to OpenSSL::Cipher.new('DES-EDE3-CBC').encrypt
288
+ ###### ON Linux improve by changing to Digest::SHA2.hexdigest decrypt_key
289
+ ###### ON Linux improve by changing to OpenSSL::Cipher.new('DES-EDE3-CBC').encrypt
290
+ ###### ON Linux improve by changing to Digest::SHA2.hexdigest decrypt_key
291
+
292
+ cipher = OpenSSL::Cipher::Cipher.new('DES-EDE3-CBC').encrypt
293
+ cipher.key = Digest::SHA1.hexdigest decrypt_key
294
+ crypted = cipher.update(self) + cipher.final
295
+ encrypted_text = crypted.unpack('H*')[0].upcase
296
+
297
+ return encrypted_text
298
+
299
+ end
300
+
301
+
302
+ # --
303
+ # Decrypt this string with the parameter encryption/decryption key
304
+ # and return the decrypted text as a new string.
305
+ # --
306
+ # encrypt_key => the key the input string was encrypted with
307
+ # --
308
+ # --
309
+ def decrypt encrypt_key
310
+
311
+ ## ----> Write a RE-CRYPT method that goes through a folder - decrypting and recrypting
312
+ ## ----> Write a RE-CRYPT method that goes through a folder - decrypting and recrypting
313
+ ## ----> Write a RE-CRYPT method that goes through a folder - decrypting and recrypting
314
+ ## ----> Write a RE-CRYPT method that goes through a folder - decrypting and recrypting
315
+
316
+ ###### ON Linux improve by changing to OpenSSL::Cipher.new('DES-EDE3-CBC').encrypt
317
+ ###### ON Linux improve by changing to Digest::SHA2.hexdigest decrypt_key
318
+ ###### ON Linux improve by changing to OpenSSL::Cipher.new('DES-EDE3-CBC').encrypt
319
+ ###### ON Linux improve by changing to Digest::SHA2.hexdigest decrypt_key
320
+ ###### ON Linux improve by changing to OpenSSL::Cipher.new('DES-EDE3-CBC').encrypt
321
+ ###### ON Linux improve by changing to Digest::SHA2.hexdigest decrypt_key
322
+
323
+ cipher = OpenSSL::Cipher::Cipher.new('DES-EDE3-CBC').decrypt
324
+ cipher.key = Digest::SHA1.hexdigest encrypt_key
325
+ uncrypted = [self].pack("H*").unpack("C*").pack("c*")
326
+ decrypted_text = cipher.update(uncrypted) + cipher.final
327
+
328
+ return decrypted_text
329
+
330
+ end
331
+
332
+
333
+ # Log the string which is expected to be delineated.
334
+ # If the string originated from a file it will be logged
335
+ # line by line. If no line delineation the string will be
336
+ # dumped just as a blob.
337
+ #
338
+ # The INFO log level is used to log the lines - if this is not
339
+ # appropriate create a (level) parameterized log lines method.
340
+ def log_lines
341
+
342
+ self.each_line do |line|
343
+ clean_line = line.chomp.gsub("\\n","")
344
+ log.info(x) { line } if clean_line.length > 0
345
+ end
346
+
347
+ end
348
+
349
+ end