familia 2.0.0.pre3 → 2.0.0.pre5

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.
Files changed (135) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +3 -0
  3. data/.rubocop_todo.yml +17 -17
  4. data/CLAUDE.md +3 -3
  5. data/Gemfile +5 -1
  6. data/Gemfile.lock +18 -3
  7. data/README.md +36 -157
  8. data/TEST_COVERAGE.md +40 -0
  9. data/docs/overview.md +359 -0
  10. data/docs/wiki/API-Reference.md +270 -0
  11. data/docs/wiki/Encrypted-Fields-Overview.md +64 -0
  12. data/docs/wiki/Home.md +49 -0
  13. data/docs/wiki/Implementation-Guide.md +183 -0
  14. data/docs/wiki/Security-Model.md +143 -0
  15. data/lib/familia/base.rb +18 -27
  16. data/lib/familia/connection.rb +6 -5
  17. data/lib/familia/{datatype → data_type}/commands.rb +2 -5
  18. data/lib/familia/{datatype → data_type}/serialization.rb +8 -10
  19. data/lib/familia/{datatype → data_type}/types/hashkey.rb +2 -2
  20. data/lib/familia/{datatype → data_type}/types/list.rb +17 -18
  21. data/lib/familia/{datatype → data_type}/types/sorted_set.rb +17 -17
  22. data/lib/familia/{datatype → data_type}/types/string.rb +2 -1
  23. data/lib/familia/{datatype → data_type}/types/unsorted_set.rb +17 -18
  24. data/lib/familia/{datatype.rb → data_type.rb} +10 -12
  25. data/lib/familia/encryption/manager.rb +102 -0
  26. data/lib/familia/encryption/provider.rb +49 -0
  27. data/lib/familia/encryption/providers/aes_gcm_provider.rb +103 -0
  28. data/lib/familia/encryption/providers/secure_xchacha20_poly1305_provider.rb +184 -0
  29. data/lib/familia/encryption/providers/xchacha20_poly1305_provider.rb +118 -0
  30. data/lib/familia/encryption/registry.rb +50 -0
  31. data/lib/familia/encryption.rb +178 -0
  32. data/lib/familia/encryption_request_cache.rb +68 -0
  33. data/lib/familia/features/encrypted_fields/encrypted_field_type.rb +153 -0
  34. data/lib/familia/features/encrypted_fields.rb +28 -0
  35. data/lib/familia/features/expiration.rb +107 -77
  36. data/lib/familia/features/quantization.rb +5 -9
  37. data/lib/familia/features/relatable_objects.rb +2 -4
  38. data/lib/familia/features/safe_dump.rb +14 -17
  39. data/lib/familia/features/transient_fields/redacted_string.rb +159 -0
  40. data/lib/familia/features/transient_fields/single_use_redacted_string.rb +62 -0
  41. data/lib/familia/features/transient_fields/transient_field_type.rb +139 -0
  42. data/lib/familia/features/transient_fields.rb +47 -0
  43. data/lib/familia/features.rb +40 -24
  44. data/lib/familia/field_type.rb +270 -0
  45. data/lib/familia/horreum/connection.rb +8 -11
  46. data/lib/familia/horreum/{commands.rb → database_commands.rb} +7 -19
  47. data/lib/familia/horreum/definition_methods.rb +453 -0
  48. data/lib/familia/horreum/{class_methods.rb → management_methods.rb} +19 -229
  49. data/lib/familia/horreum/serialization.rb +46 -18
  50. data/lib/familia/horreum/settings.rb +10 -2
  51. data/lib/familia/horreum/utils.rb +9 -10
  52. data/lib/familia/horreum.rb +18 -10
  53. data/lib/familia/logging.rb +14 -14
  54. data/lib/familia/settings.rb +39 -3
  55. data/lib/familia/utils.rb +45 -0
  56. data/lib/familia/version.rb +1 -1
  57. data/lib/familia.rb +2 -1
  58. data/try/core/base_enhancements_try.rb +115 -0
  59. data/try/core/connection_try.rb +0 -1
  60. data/try/core/errors_try.rb +0 -1
  61. data/try/core/familia_extended_try.rb +3 -4
  62. data/try/core/familia_try.rb +0 -1
  63. data/try/core/pools_try.rb +2 -2
  64. data/try/core/secure_identifier_try.rb +0 -1
  65. data/try/core/settings_try.rb +0 -1
  66. data/try/core/utils_try.rb +0 -1
  67. data/try/{datatypes → data_types}/boolean_try.rb +1 -2
  68. data/try/{datatypes → data_types}/datatype_base_try.rb +2 -3
  69. data/try/{datatypes → data_types}/hash_try.rb +1 -2
  70. data/try/{datatypes → data_types}/list_try.rb +1 -2
  71. data/try/{datatypes → data_types}/set_try.rb +1 -2
  72. data/try/{datatypes → data_types}/sorted_set_try.rb +1 -2
  73. data/try/{datatypes → data_types}/string_try.rb +1 -2
  74. data/try/debugging/README.md +32 -0
  75. data/try/debugging/cache_behavior_tracer.rb +91 -0
  76. data/try/debugging/encryption_method_tracer.rb +138 -0
  77. data/try/debugging/provider_diagnostics.rb +110 -0
  78. data/try/edge_cases/hash_symbolization_try.rb +0 -1
  79. data/try/edge_cases/json_serialization_try.rb +0 -1
  80. data/try/edge_cases/reserved_keywords_try.rb +42 -11
  81. data/try/encryption/config_persistence_try.rb +192 -0
  82. data/try/encryption/encryption_core_try.rb +328 -0
  83. data/try/encryption/instance_variable_scope_try.rb +31 -0
  84. data/try/encryption/module_loading_try.rb +28 -0
  85. data/try/encryption/providers/aes_gcm_provider_try.rb +178 -0
  86. data/try/encryption/providers/xchacha20_poly1305_provider_try.rb +169 -0
  87. data/try/encryption/roundtrip_validation_try.rb +28 -0
  88. data/try/encryption/secure_memory_handling_try.rb +125 -0
  89. data/try/features/encrypted_fields_core_try.rb +117 -0
  90. data/try/features/encrypted_fields_integration_try.rb +220 -0
  91. data/try/features/encrypted_fields_no_cache_security_try.rb +205 -0
  92. data/try/features/encrypted_fields_security_try.rb +370 -0
  93. data/try/features/encryption_fields/aad_protection_try.rb +53 -0
  94. data/try/features/encryption_fields/context_isolation_try.rb +120 -0
  95. data/try/features/encryption_fields/error_conditions_try.rb +116 -0
  96. data/try/features/encryption_fields/fresh_key_derivation_try.rb +122 -0
  97. data/try/features/encryption_fields/fresh_key_try.rb +163 -0
  98. data/try/features/encryption_fields/key_rotation_try.rb +117 -0
  99. data/try/features/encryption_fields/memory_security_try.rb +37 -0
  100. data/try/features/encryption_fields/missing_current_key_version_try.rb +23 -0
  101. data/try/features/encryption_fields/nonce_uniqueness_try.rb +54 -0
  102. data/try/features/encryption_fields/thread_safety_try.rb +199 -0
  103. data/try/features/expiration_try.rb +0 -1
  104. data/try/features/feature_dependencies_try.rb +159 -0
  105. data/try/features/quantization_try.rb +0 -1
  106. data/try/features/real_feature_integration_try.rb +148 -0
  107. data/try/features/relatable_objects_try.rb +0 -1
  108. data/try/features/safe_dump_advanced_try.rb +0 -1
  109. data/try/features/safe_dump_try.rb +0 -1
  110. data/try/features/transient_fields/redacted_string_try.rb +248 -0
  111. data/try/features/transient_fields/refresh_reset_try.rb +164 -0
  112. data/try/features/transient_fields/simple_refresh_test.rb +50 -0
  113. data/try/features/transient_fields/single_use_redacted_string_try.rb +310 -0
  114. data/try/features/transient_fields_core_try.rb +181 -0
  115. data/try/features/transient_fields_integration_try.rb +260 -0
  116. data/try/helpers/test_helpers.rb +42 -0
  117. data/try/horreum/base_try.rb +157 -3
  118. data/try/horreum/class_methods_try.rb +27 -36
  119. data/try/horreum/enhanced_conflict_handling_try.rb +176 -0
  120. data/try/horreum/field_categories_try.rb +118 -0
  121. data/try/horreum/field_definition_try.rb +96 -0
  122. data/try/horreum/initialization_try.rb +0 -1
  123. data/try/horreum/relations_try.rb +0 -1
  124. data/try/horreum/serialization_persistent_fields_try.rb +165 -0
  125. data/try/horreum/serialization_try.rb +2 -3
  126. data/try/memory/memory_basic_test.rb +73 -0
  127. data/try/memory/memory_detailed_test.rb +121 -0
  128. data/try/memory/memory_docker_ruby_dump.sh +80 -0
  129. data/try/memory/memory_search_for_string.rb +83 -0
  130. data/try/memory/test_actual_redactedstring_protection.rb +38 -0
  131. data/try/models/customer_safe_dump_try.rb +0 -1
  132. data/try/models/customer_try.rb +0 -1
  133. data/try/models/datatype_base_try.rb +1 -2
  134. data/try/models/familia_object_try.rb +0 -1
  135. metadata +85 -18
@@ -0,0 +1,121 @@
1
+ # try/edge_cases/memory_detailed_test_try.rb
2
+
3
+ require 'objspace'
4
+ require 'json'
5
+
6
+ require_relative '../helpers/test_helpers'
7
+
8
+ class DetailedMemoryTester
9
+ def self.test_with_details
10
+ ObjectSpace.trace_object_allocations_start
11
+
12
+ secret = "SENSITIVE_#{rand(999999)}_DATA"
13
+ puts "Testing with secret: #{secret}"
14
+ puts "Secret object_id: #{secret.object_id}"
15
+ puts "Secret frozen?: #{secret.frozen?}\n\n"
16
+
17
+ # Track all string copies
18
+ tracker = {}
19
+
20
+ # Before creating RedactedString
21
+ find_secret_copies(secret, "BEFORE RedactedString creation", tracker)
22
+
23
+ # Create RedactedString
24
+ redacted = RedactedString.new(secret)
25
+ find_secret_copies(secret, "AFTER RedactedString creation", tracker)
26
+
27
+ # Use expose block
28
+ exposed_value = nil
29
+ redacted.expose do |plain|
30
+ exposed_value = plain.object_id
31
+ find_secret_copies(secret, "DURING expose block", tracker)
32
+ end
33
+ find_secret_copies(secret, "AFTER expose block", tracker)
34
+
35
+ # Clear and GC
36
+ redacted.clear!
37
+ original_secret = secret
38
+ secret = nil # Remove our reference
39
+ GC.start(full_mark: true, immediate_sweep: true)
40
+
41
+ find_secret_copies(original_secret, "AFTER clear! and GC", tracker)
42
+
43
+ # Final report
44
+ puts "\n" + "="*60
45
+ puts "FINAL ANALYSIS"
46
+ puts "="*60
47
+
48
+ remaining_copies = []
49
+ ObjectSpace.each_object(String) do |str|
50
+ begin
51
+ if str.include?(original_secret)
52
+ remaining_copies << {
53
+ object_id: str.object_id,
54
+ size: str.bytesize,
55
+ encoding: str.encoding.name,
56
+ frozen: str.frozen?,
57
+ tainted: (str.tainted? rescue "N/A"),
58
+ value_preview: str[0..50]
59
+ }
60
+ end
61
+ rescue => e
62
+ # Skip strings that can't be accessed
63
+ end
64
+ end
65
+
66
+ if remaining_copies.empty?
67
+ puts "✅ SUCCESS: No copies found in memory!"
68
+ else
69
+ puts "❌ FAILURE: #{remaining_copies.size} copies still in memory:"
70
+ remaining_copies.each do |copy|
71
+ puts "\n Object ID: #{copy[:object_id]}"
72
+ puts " Size: #{copy[:size]} bytes"
73
+ puts " Frozen: #{copy[:frozen]}"
74
+ puts " Encoding: #{copy[:encoding]}"
75
+ end
76
+ end
77
+
78
+ # Show memory stats
79
+ puts "\n" + "="*60
80
+ puts "MEMORY STATISTICS"
81
+ puts "="*60
82
+ puts "Total strings in ObjectSpace: #{ObjectSpace.each_object(String).count}"
83
+ puts "GC count: #{GC.count}"
84
+ puts "GC stat: #{GC.stat[:heap_live_slots]} live slots"
85
+
86
+ tracker
87
+ end
88
+
89
+ private
90
+
91
+ def self.find_secret_copies(secret, phase, tracker)
92
+ copies = []
93
+
94
+ ObjectSpace.each_object(String) do |str|
95
+ begin
96
+ if str.include?(secret)
97
+ copies << {
98
+ object_id: str.object_id,
99
+ frozen: str.frozen?,
100
+ source: ObjectSpace.allocation_sourcefile(str),
101
+ line: ObjectSpace.allocation_sourceline(str)
102
+ }
103
+ end
104
+ rescue => e
105
+ # Some strings might not be accessible
106
+ end
107
+ end
108
+
109
+ tracker[phase] = copies
110
+
111
+ puts "#{phase}: Found #{copies.size} copies"
112
+ copies.each do |copy|
113
+ source_info = copy[:source] ? "#{copy[:source]}:#{copy[:line]}" : "unknown source"
114
+ puts " - Object #{copy[:object_id]} (frozen: #{copy[:frozen]}) from #{source_info}"
115
+ end
116
+ puts ""
117
+ end
118
+ end
119
+
120
+ # Run the detailed test
121
+ DetailedMemoryTester.test_with_details
@@ -0,0 +1,80 @@
1
+ #!/bin/bash
2
+ # try/edge_cases/docker_dump.sh
3
+
4
+ # Usage: bash $0 <container_id>
5
+ #
6
+ # See example output at end.
7
+
8
+ # Set CONTAINER_ID to $CONTAINER_ID or the first argument
9
+ CONTAINER_ID=${CONTAINER_ID:-$1}
10
+
11
+ if [ -z "$CONTAINER_ID" ]; then
12
+ echo "Usage: $0 <container_id>"
13
+ echo "Or set CONTAINER_ID environment variable"
14
+ exit 1
15
+ fi
16
+
17
+ # Create a script to dump all string-like patterns
18
+ docker exec $CONTAINER_ID bash -c '
19
+ # Install required packages
20
+ apt-get update -qq && apt-get install -y -qq procps binutils
21
+
22
+ PID=$(pgrep -f ruby)
23
+
24
+ if [ -z "$PID" ]; then
25
+ echo "No Ruby process found"
26
+ exit 1
27
+ fi
28
+
29
+ echo "Dumping memory for Ruby process $PID"
30
+
31
+ # Check if maps file exists
32
+ if [ ! -f "/proc/$PID/maps" ]; then
33
+ echo "Cannot access memory maps for process $PID"
34
+ exit 1
35
+ fi
36
+
37
+ # Get memory regions
38
+ grep -E "rw-p|r--p" /proc/$PID/maps | while read line; do
39
+ start=$(echo $line | cut -d"-" -f1)
40
+ end=$(echo $line | cut -d" " -f1 | cut -d"-" -f2)
41
+
42
+ # Convert hex to decimal and dump
43
+ start_dec=$((16#$start))
44
+ end_dec=$((16#$end))
45
+ size=$((end_dec - start_dec))
46
+
47
+ # Skip if size is too large (> 10MB) to avoid hanging
48
+ if [ $size -gt 10485760 ]; then
49
+ continue
50
+ fi
51
+
52
+ dd if=/proc/$PID/mem bs=1 skip=$start_dec count=$size 2>/dev/null
53
+ done | strings | grep -i "secret\|api\|key\|token" | head -20
54
+ '
55
+
56
+ # Example Output:
57
+ #
58
+ # $ SECRET=august7th2025
59
+ # $
60
+ # $ docker run --rm -d -p 3000:3000 \
61
+ # -e SECRET=$SECRET \
62
+ # -e REDIS_URL=redis://host.docker.internal:6379/0 \
63
+ # ghcr.io/onetimesecret/devtimesecret-lite:latest
64
+ #
65
+ # abcd1234
66
+ #
67
+ # $ bash try/edge_cases/docker_ruby_dump.sh abcd1234
68
+ # ...
69
+ # Dumping memory for Ruby process 60
70
+ # SECRET
71
+ # SECRET
72
+ # SECRET=august6th2025
73
+ # done | strings | grep -i "secret...
74
+ # SECRET=august6th2025
75
+ # done | strings | grep -i "secret...
76
+ # grep -i "secret\|api\|key|token"
77
+ # done | strings | grep -i "secret...
78
+ # SECRET=august6th2025
79
+ #
80
+ # $ docker kill abcd1234
@@ -0,0 +1,83 @@
1
+ # try/edge_cases/search_memory_for_string_try.rb
2
+
3
+ require 'objspace'
4
+
5
+ require_relative '../helpers/test_helpers'
6
+
7
+ # Enable object space tracking
8
+ ObjectSpace.trace_object_allocations_start
9
+
10
+ def search_memory_for_string(target)
11
+ found_locations = []
12
+
13
+ ObjectSpace.each_object(String) do |str|
14
+ begin
15
+ if str.include?(target)
16
+ found_locations << {
17
+ value: str[0..100], # First 100 chars
18
+ object_id: str.object_id,
19
+ source: ObjectSpace.allocation_sourcefile(str),
20
+ line: ObjectSpace.allocation_sourceline(str),
21
+ frozen: str.frozen?
22
+ }
23
+ end
24
+ rescue => e
25
+ # Some strings might not be accessible
26
+ end
27
+ end
28
+
29
+ found_locations
30
+ end
31
+
32
+ # Test scenario
33
+ secret = "SUPER_SECRET_API_KEY_12345"
34
+ puts "Testing with secret: #{secret}"
35
+
36
+ # Create RedactedString
37
+ redacted = RedactedString.new(secret)
38
+ puts "Created RedactedString"
39
+
40
+ # Force GC to see if copies persist
41
+ GC.start(full_mark: true, immediate_sweep: true)
42
+
43
+ # Search memory
44
+ puts "\n=== Memory search BEFORE expose ==="
45
+ found = search_memory_for_string("SUPER_SECRET_API_KEY")
46
+ found.each do |location|
47
+ puts "Found at object_id: #{location[:object_id]}"
48
+ puts " Value: #{location[:value]}"
49
+ puts " Source: #{location[:source]}:#{location[:line]}"
50
+ puts " Frozen: #{location[:frozen]}"
51
+ end
52
+
53
+ # Use expose
54
+ redacted.expose do |plain|
55
+ puts "\nInside expose block, plain = [REDACTED for display]"
56
+
57
+ # Search during expose
58
+ puts "\n=== Memory search DURING expose ==="
59
+ found = search_memory_for_string("SUPER_SECRET_API_KEY")
60
+ puts "Found #{found.size} instances"
61
+ end
62
+
63
+ # After expose
64
+ GC.start(full_mark: true, immediate_sweep: true)
65
+ puts "\n=== Memory search AFTER expose ==="
66
+ found = search_memory_for_string("SUPER_SECRET_API_KEY")
67
+ found.each do |location|
68
+ puts "Found at object_id: #{location[:object_id]}"
69
+ puts " Value: #{location[:value]}"
70
+ end
71
+
72
+ # Also check with marshal dump
73
+ puts "\n=== Checking Marshal dump ==="
74
+ begin
75
+ marshaled = Marshal.dump(ObjectSpace.each_object.to_a)
76
+ if marshaled.include?("SUPER_SECRET_API_KEY")
77
+ puts "❌ Secret found in Marshal dump!"
78
+ else
79
+ puts "✅ Secret not found in Marshal dump"
80
+ end
81
+ rescue => e
82
+ puts "Marshal failed: #{e}"
83
+ end
@@ -0,0 +1,38 @@
1
+ # try/memory/test_actual_redactedstring_protection.rb
2
+
3
+ require_relative '../helpers/test_helpers'
4
+
5
+ # Test 1: Does it prevent logging leaks?
6
+ secret = "API_KEY_12345"
7
+ redacted = RedactedString.new(secret)
8
+
9
+ puts "Logging test:"
10
+ puts "Normal string logs as: #{secret}" # Shows: API_KEY_12345
11
+ puts "Redacted string logs as: #{redacted}" # Shows: [REDACTED]
12
+ puts "✅ Logging protection works!\n\n"
13
+
14
+ # Test 2: Does it prevent exception leaks?
15
+ begin
16
+ raise StandardError, "Error with secret: #{redacted}"
17
+ rescue => e
18
+ puts "Exception message: #{e.message}"
19
+ puts "✅ Exception protection works!\n\n" if e.message.include?("[REDACTED]")
20
+ end
21
+
22
+ # Test 3: Does it prevent debug leaks?
23
+ require 'pp'
24
+ data = {
25
+ user: "john",
26
+ token: redacted
27
+ }
28
+ puts "Debug output:"
29
+ pp data # Will show token: [REDACTED]
30
+ puts "✅ Debug protection works!\n\n"
31
+
32
+ # Test 4: Real-world usage pattern
33
+ redacted.expose do |token|
34
+ # Simulate API call
35
+ puts "Making API call with token (simulated)"
36
+ # HTTParty.get("https://api.example.com", headers: { "Authorization" => token })
37
+ end
38
+ puts "After API call, trying to access: #{redacted}" # Still shows [REDACTED]
@@ -1,6 +1,5 @@
1
1
  # try/models/customer_safedump_try.rb
2
2
 
3
- require_relative '../../lib/familia'
4
3
  require_relative '../helpers/test_helpers'
5
4
 
6
5
  # Setup
@@ -1,7 +1,6 @@
1
1
  # try/models/customer_try.rb
2
2
 
3
3
  # Customer Tryouts
4
- require_relative '../../lib/familia'
5
4
  require_relative '../helpers/test_helpers'
6
5
 
7
6
  # Setup
@@ -1,8 +1,7 @@
1
- # try/datatypes/datatype_base_try.rb
1
+ # try/data_types/data_type_base_try.rb
2
2
 
3
3
  # Test DataType base functionality
4
4
 
5
- require_relative '../../lib/familia'
6
5
  require_relative '../helpers/test_helpers'
7
6
 
8
7
  Familia.debug = false
@@ -1,6 +1,5 @@
1
1
  # try/models/familia_object_try.rb
2
2
 
3
- require_relative '../../lib/familia'
4
3
  require_relative '../helpers/test_helpers'
5
4
 
6
5
  Familia.debug = false
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: familia
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.0.pre3
4
+ version: 2.0.0.pre5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Delano Mandelbaum
@@ -132,31 +132,54 @@ files:
132
132
  - Gemfile.lock
133
133
  - LICENSE.txt
134
134
  - README.md
135
+ - TEST_COVERAGE.md
135
136
  - bin/irb
136
137
  - docs/connection_pooling.md
138
+ - docs/overview.md
139
+ - docs/wiki/API-Reference.md
140
+ - docs/wiki/Encrypted-Fields-Overview.md
141
+ - docs/wiki/Home.md
142
+ - docs/wiki/Implementation-Guide.md
143
+ - docs/wiki/Security-Model.md
137
144
  - familia.gemspec
138
145
  - lib/familia.rb
139
146
  - lib/familia/base.rb
140
147
  - lib/familia/connection.rb
141
148
  - lib/familia/core_ext.rb
142
- - lib/familia/datatype.rb
143
- - lib/familia/datatype/commands.rb
144
- - lib/familia/datatype/serialization.rb
145
- - lib/familia/datatype/types/hashkey.rb
146
- - lib/familia/datatype/types/list.rb
147
- - lib/familia/datatype/types/sorted_set.rb
148
- - lib/familia/datatype/types/string.rb
149
- - lib/familia/datatype/types/unsorted_set.rb
149
+ - lib/familia/data_type.rb
150
+ - lib/familia/data_type/commands.rb
151
+ - lib/familia/data_type/serialization.rb
152
+ - lib/familia/data_type/types/hashkey.rb
153
+ - lib/familia/data_type/types/list.rb
154
+ - lib/familia/data_type/types/sorted_set.rb
155
+ - lib/familia/data_type/types/string.rb
156
+ - lib/familia/data_type/types/unsorted_set.rb
157
+ - lib/familia/encryption.rb
158
+ - lib/familia/encryption/manager.rb
159
+ - lib/familia/encryption/provider.rb
160
+ - lib/familia/encryption/providers/aes_gcm_provider.rb
161
+ - lib/familia/encryption/providers/secure_xchacha20_poly1305_provider.rb
162
+ - lib/familia/encryption/providers/xchacha20_poly1305_provider.rb
163
+ - lib/familia/encryption/registry.rb
164
+ - lib/familia/encryption_request_cache.rb
150
165
  - lib/familia/errors.rb
151
166
  - lib/familia/features.rb
167
+ - lib/familia/features/encrypted_fields.rb
168
+ - lib/familia/features/encrypted_fields/encrypted_field_type.rb
152
169
  - lib/familia/features/expiration.rb
153
170
  - lib/familia/features/quantization.rb
154
171
  - lib/familia/features/relatable_objects.rb
155
172
  - lib/familia/features/safe_dump.rb
173
+ - lib/familia/features/transient_fields.rb
174
+ - lib/familia/features/transient_fields/redacted_string.rb
175
+ - lib/familia/features/transient_fields/single_use_redacted_string.rb
176
+ - lib/familia/features/transient_fields/transient_field_type.rb
177
+ - lib/familia/field_type.rb
156
178
  - lib/familia/horreum.rb
157
- - lib/familia/horreum/class_methods.rb
158
- - lib/familia/horreum/commands.rb
159
179
  - lib/familia/horreum/connection.rb
180
+ - lib/familia/horreum/database_commands.rb
181
+ - lib/familia/horreum/definition_methods.rb
182
+ - lib/familia/horreum/management_methods.rb
160
183
  - lib/familia/horreum/related_fields_management.rb
161
184
  - lib/familia/horreum/serialization.rb
162
185
  - lib/familia/horreum/settings.rb
@@ -170,6 +193,7 @@ files:
170
193
  - lib/familia/version.rb
171
194
  - lib/middleware/database_middleware.rb
172
195
  - try/configuration/scenarios_try.rb
196
+ - try/core/base_enhancements_try.rb
173
197
  - try/core/connection_try.rb
174
198
  - try/core/errors_try.rb
175
199
  - try/core/extensions_try.rb
@@ -181,13 +205,17 @@ files:
181
205
  - try/core/settings_try.rb
182
206
  - try/core/tools_try.rb
183
207
  - try/core/utils_try.rb
184
- - try/datatypes/boolean_try.rb
185
- - try/datatypes/datatype_base_try.rb
186
- - try/datatypes/hash_try.rb
187
- - try/datatypes/list_try.rb
188
- - try/datatypes/set_try.rb
189
- - try/datatypes/sorted_set_try.rb
190
- - try/datatypes/string_try.rb
208
+ - try/data_types/boolean_try.rb
209
+ - try/data_types/datatype_base_try.rb
210
+ - try/data_types/hash_try.rb
211
+ - try/data_types/list_try.rb
212
+ - try/data_types/set_try.rb
213
+ - try/data_types/sorted_set_try.rb
214
+ - try/data_types/string_try.rb
215
+ - try/debugging/README.md
216
+ - try/debugging/cache_behavior_tracer.rb
217
+ - try/debugging/encryption_method_tracer.rb
218
+ - try/debugging/provider_diagnostics.rb
191
219
  - try/edge_cases/empty_identifiers_try.rb
192
220
  - try/edge_cases/hash_symbolization_try.rb
193
221
  - try/edge_cases/json_serialization_try.rb
@@ -195,20 +223,59 @@ files:
195
223
  - try/edge_cases/reserved_keywords_try.rb
196
224
  - try/edge_cases/string_coercion_try.rb
197
225
  - try/edge_cases/ttl_side_effects_try.rb
226
+ - try/encryption/config_persistence_try.rb
227
+ - try/encryption/encryption_core_try.rb
228
+ - try/encryption/instance_variable_scope_try.rb
229
+ - try/encryption/module_loading_try.rb
230
+ - try/encryption/providers/aes_gcm_provider_try.rb
231
+ - try/encryption/providers/xchacha20_poly1305_provider_try.rb
232
+ - try/encryption/roundtrip_validation_try.rb
233
+ - try/encryption/secure_memory_handling_try.rb
234
+ - try/features/encrypted_fields_core_try.rb
235
+ - try/features/encrypted_fields_integration_try.rb
236
+ - try/features/encrypted_fields_no_cache_security_try.rb
237
+ - try/features/encrypted_fields_security_try.rb
238
+ - try/features/encryption_fields/aad_protection_try.rb
239
+ - try/features/encryption_fields/context_isolation_try.rb
240
+ - try/features/encryption_fields/error_conditions_try.rb
241
+ - try/features/encryption_fields/fresh_key_derivation_try.rb
242
+ - try/features/encryption_fields/fresh_key_try.rb
243
+ - try/features/encryption_fields/key_rotation_try.rb
244
+ - try/features/encryption_fields/memory_security_try.rb
245
+ - try/features/encryption_fields/missing_current_key_version_try.rb
246
+ - try/features/encryption_fields/nonce_uniqueness_try.rb
247
+ - try/features/encryption_fields/thread_safety_try.rb
198
248
  - try/features/expiration_try.rb
249
+ - try/features/feature_dependencies_try.rb
199
250
  - try/features/quantization_try.rb
251
+ - try/features/real_feature_integration_try.rb
200
252
  - try/features/relatable_objects_try.rb
201
253
  - try/features/safe_dump_advanced_try.rb
202
254
  - try/features/safe_dump_try.rb
255
+ - try/features/transient_fields/redacted_string_try.rb
256
+ - try/features/transient_fields/refresh_reset_try.rb
257
+ - try/features/transient_fields/simple_refresh_test.rb
258
+ - try/features/transient_fields/single_use_redacted_string_try.rb
259
+ - try/features/transient_fields_core_try.rb
260
+ - try/features/transient_fields_integration_try.rb
203
261
  - try/helpers/test_helpers.rb
204
262
  - try/horreum/base_try.rb
205
263
  - try/horreum/class_methods_try.rb
206
264
  - try/horreum/commands_try.rb
265
+ - try/horreum/enhanced_conflict_handling_try.rb
266
+ - try/horreum/field_categories_try.rb
267
+ - try/horreum/field_definition_try.rb
207
268
  - try/horreum/initialization_try.rb
208
269
  - try/horreum/relations_try.rb
270
+ - try/horreum/serialization_persistent_fields_try.rb
209
271
  - try/horreum/serialization_try.rb
210
272
  - try/horreum/settings_try.rb
211
273
  - try/integration/cross_component_try.rb
274
+ - try/memory/memory_basic_test.rb
275
+ - try/memory/memory_detailed_test.rb
276
+ - try/memory/memory_docker_ruby_dump.sh
277
+ - try/memory/memory_search_for_string.rb
278
+ - try/memory/test_actual_redactedstring_protection.rb
212
279
  - try/models/customer_safe_dump_try.rb
213
280
  - try/models/customer_try.rb
214
281
  - try/models/datatype_base_try.rb