logasm 0.3.0 → 0.4.0
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 +4 -4
- data/README.md +4 -3
- data/lib/logasm/preprocessors/whitelist.rb +47 -5
- data/logasm.gemspec +1 -1
- data/spec/preprocessors/whitelist_spec.rb +35 -0
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 84be42eae2bfa1a843ae47eddbc3108c4737af01
|
4
|
+
data.tar.gz: 98b03a785863f5d3b5de1f12034c92b021f405c6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9070dfcd0b7cc887010692cd9bcee48d45410299681e5a6ca5ab8a967a55f5f5c41700b7e0b8880f7d434c0768ff12892faaa4db7f10df494e1c0cc4e5538faa
|
7
|
+
data.tar.gz: b62a0781c1be451843cb9ae2f6f668540555135f0159f808468d9237ad136490c085307a662c08c9e0b7d6af6c2d5eb9058ea9a477d20dde28cc9d9dd5fed11a
|
data/README.md
CHANGED
@@ -108,13 +108,14 @@ Received request {"info":{"phone":"************"}}
|
|
108
108
|
|
109
109
|
Masks all the fields except those whitelisted in the configuration using [JSON Pointer](https://tools.ietf.org/html/rfc6901).
|
110
110
|
Only simple values(`string`, `number`, `boolean`) can be whitelisted.
|
111
|
+
Whitelisting array elements can be done using wildcard symbol `~`.
|
111
112
|
|
112
113
|
#### Configuration
|
113
114
|
|
114
115
|
```yaml
|
115
116
|
preprocessors:
|
116
117
|
whitelist:
|
117
|
-
pointers: ['/info/phone']
|
118
|
+
pointers: ['/info/phone', '/addresses/~/host']
|
118
119
|
```
|
119
120
|
|
120
121
|
#### Usage
|
@@ -122,7 +123,7 @@ preprocessors:
|
|
122
123
|
```ruby
|
123
124
|
logger = Logasm.build(application_name, logger_config, preprocessors)
|
124
125
|
|
125
|
-
input = {password: 'password', info: {phone: '+12055555555'}}
|
126
|
+
input = {password: 'password', info: {phone: '+12055555555'}, addresses: [{host: 'example.com', path: 'info'}]}
|
126
127
|
|
127
128
|
logger.debug("Received request", input)
|
128
129
|
```
|
@@ -130,5 +131,5 @@ logger.debug("Received request", input)
|
|
130
131
|
Logger output:
|
131
132
|
|
132
133
|
```
|
133
|
-
Received request {password: "********", "info":{"phone":"+12055555555"}}
|
134
|
+
Received request {password: "********", "info": {"phone": "+12055555555"}, "addresses": [{"host": "example.com","path": "****"}]}
|
134
135
|
```
|
@@ -4,16 +4,24 @@ class Logasm
|
|
4
4
|
|
5
5
|
DEFAULT_WHITELIST = %w(/id /message /correlation_id /queue)
|
6
6
|
MASK_SYMBOL = '*'
|
7
|
+
WILDCARD = '~'
|
7
8
|
|
8
9
|
class InvalidPointerFormatException < Exception
|
9
10
|
end
|
10
11
|
|
11
12
|
def initialize(config = {})
|
12
13
|
pointers = (config[:pointers] || []) + DEFAULT_WHITELIST
|
13
|
-
|
14
|
-
validate_pointer
|
15
|
-
|
14
|
+
decoded_pointers = pointers
|
15
|
+
.each(&method(:validate_pointer))
|
16
|
+
.map(&method(:decode))
|
17
|
+
@fields_to_include = decoded_pointers.inject({}) do |mem, pointer|
|
18
|
+
mem.merge(pointer => true)
|
16
19
|
end
|
20
|
+
@wildcards = decoded_pointers
|
21
|
+
.select(&method(:has_wildcard?))
|
22
|
+
.inject({}) do |mem, pointer|
|
23
|
+
mem.merge(get_wildcard_roots_of(pointer))
|
24
|
+
end
|
17
25
|
end
|
18
26
|
|
19
27
|
def process(data)
|
@@ -22,6 +30,34 @@ class Logasm
|
|
22
30
|
|
23
31
|
private
|
24
32
|
|
33
|
+
|
34
|
+
def has_wildcard?(pointer)
|
35
|
+
pointer.include?("/#{WILDCARD}/") || pointer.end_with?("/#{WILDCARD}")
|
36
|
+
end
|
37
|
+
|
38
|
+
# From a pointer with wildcards builds a hash with roots that contains a wildcard. Hash is used to easily match
|
39
|
+
# find if hash element matches the pointer while processing the log.
|
40
|
+
#
|
41
|
+
# Example:
|
42
|
+
#
|
43
|
+
# Input:
|
44
|
+
# "/array/~/nested_array/~/fields"
|
45
|
+
#
|
46
|
+
# Output:
|
47
|
+
# {
|
48
|
+
# "/array/~/nested_array/~" => true,
|
49
|
+
# "/array/~" => true
|
50
|
+
# }
|
51
|
+
#
|
52
|
+
def get_wildcard_roots_of(pointer)
|
53
|
+
if (index = pointer.rindex("/#{WILDCARD}/"))
|
54
|
+
wildcard_root = pointer.slice(0, index + 2)
|
55
|
+
get_wildcard_roots_of(wildcard_root).merge(wildcard_root => true)
|
56
|
+
else
|
57
|
+
{pointer => true}
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
25
61
|
def validate_pointer(pointer)
|
26
62
|
if pointer.slice(-1) == '/'
|
27
63
|
raise InvalidPointerFormatException.new('Pointer should not contain trailing slash')
|
@@ -30,8 +66,8 @@ class Logasm
|
|
30
66
|
|
31
67
|
def decode(pointer)
|
32
68
|
pointer
|
33
|
-
.gsub('~0', '~')
|
34
69
|
.gsub('~1', '/')
|
70
|
+
.gsub('~0', '~')
|
35
71
|
end
|
36
72
|
|
37
73
|
def process_data(parent_pointer, data)
|
@@ -57,8 +93,14 @@ class Logasm
|
|
57
93
|
end
|
58
94
|
|
59
95
|
def process_array(parent_pointer, array)
|
96
|
+
create_child_pointer =
|
97
|
+
if @wildcards["#{parent_pointer}/~"]
|
98
|
+
lambda { |_| "#{parent_pointer}/~" }
|
99
|
+
else
|
100
|
+
lambda { |index| "#{parent_pointer}/#{index}" }
|
101
|
+
end
|
60
102
|
array.each_with_index.inject([]) do |mem, (value, index)|
|
61
|
-
pointer =
|
103
|
+
pointer = create_child_pointer.call(index)
|
62
104
|
processed_value = process_data(pointer, value)
|
63
105
|
mem + [processed_value]
|
64
106
|
end
|
data/logasm.gemspec
CHANGED
@@ -4,7 +4,7 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
4
4
|
|
5
5
|
Gem::Specification.new do |gem|
|
6
6
|
gem.name = "logasm"
|
7
|
-
gem.version = '0.
|
7
|
+
gem.version = '0.4.0'
|
8
8
|
gem.authors = ["Salemove"]
|
9
9
|
gem.email = ["support@salemove.com"]
|
10
10
|
gem.description = %q{It's logasmic}
|
@@ -74,6 +74,30 @@ describe Logasm::Preprocessors::Whitelist do
|
|
74
74
|
end
|
75
75
|
end
|
76
76
|
|
77
|
+
context 'with whitelisted array elements field with wildcard' do
|
78
|
+
let(:data) {{
|
79
|
+
array: [{field: 'data1', secret: 'secret1'}, {field: 'data2', secret: 'secret2'}]
|
80
|
+
}}
|
81
|
+
let(:pointers) { ['/array/~/field'] }
|
82
|
+
|
83
|
+
it 'includes array elements field' do
|
84
|
+
expect(processed_data).to include(
|
85
|
+
array: [{field: 'data1', secret: '*******'}, {field: 'data2', secret: '*******'}]
|
86
|
+
)
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
context 'with whitelisted string array elements with wildcard' do
|
91
|
+
let(:data) {{
|
92
|
+
array: ['secret', 'secret']
|
93
|
+
}}
|
94
|
+
let(:pointers) { ['/array/~'] }
|
95
|
+
|
96
|
+
it 'includes array elements' do
|
97
|
+
expect(processed_data).to include(array: ['secret', 'secret'])
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
77
101
|
context 'with whitelisted array element' do
|
78
102
|
let(:pointers) { ['/array/0'] }
|
79
103
|
|
@@ -149,4 +173,15 @@ describe Logasm::Preprocessors::Whitelist do
|
|
149
173
|
expect(processed_data).to include('field_with_~'=> 'secret')
|
150
174
|
end
|
151
175
|
end
|
176
|
+
|
177
|
+
context 'when field has tilde and 1' do
|
178
|
+
let(:data) {{
|
179
|
+
'field_with_~1' => 'secret'
|
180
|
+
}}
|
181
|
+
let(:pointers) { ['/field_with_~01'] }
|
182
|
+
|
183
|
+
it 'includes field' do
|
184
|
+
expect(processed_data).to include('field_with_~1'=> 'secret')
|
185
|
+
end
|
186
|
+
end
|
152
187
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: logasm
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Salemove
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-08-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: inflecto
|
@@ -124,7 +124,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
124
124
|
version: '0'
|
125
125
|
requirements: []
|
126
126
|
rubyforge_project:
|
127
|
-
rubygems_version: 2.
|
127
|
+
rubygems_version: 2.2.2
|
128
128
|
signing_key:
|
129
129
|
specification_version: 4
|
130
130
|
summary: What description said
|