Skip to content

Commit 63148e0

Browse files
committed
Merge pull request #57 from launchdarkly/pk/coerce-user-key
coerce user key into string
2 parents a95da47 + e6c7026 commit 63148e0

File tree

4 files changed

+62
-1
lines changed

4 files changed

+62
-1
lines changed

lib/ldclient-rb/ldclient.rb

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,7 @@ def toggle?(key, user, default = false)
134134
@config.logger.error("[LDClient] Must specify user")
135135
return default
136136
end
137+
sanitize_user(user)
137138

138139
if @config.stream? && !@stream_processor.started?
139140
@stream_processor.start
@@ -176,6 +177,7 @@ def add_event(event)
176177
# @param [Hash] The user to register
177178
#
178179
def identify(user)
180+
sanitize_user(user)
179181
add_event(kind: "identify", key: user[:key], user: user)
180182
end
181183

@@ -200,6 +202,7 @@ def is_offline?
200202
#
201203
# @return [void]
202204
def track(event_name, user, data)
205+
sanitize_user(user)
203206
add_event(kind: "custom", key: event_name, user: user, data: data)
204207
end
205208

@@ -406,9 +409,15 @@ def log_exception(caller, exn)
406409
@config.logger.error(error)
407410
end
408411

412+
def sanitize_user(user)
413+
if user[:key]
414+
user[:key] = user[:key].to_s
415+
end
416+
end
417+
409418
private :post_flushed_events, :add_event, :get_streamed_flag,
410419
:get_flag_stream, :get_flag_int, :make_request, :param_for_user,
411420
:match_target?, :match_user?, :match_variation?, :evaluate,
412-
:create_worker, :log_timings, :log_exception
421+
:create_worker, :log_timings, :log_exception, :sanitize_user
413422
end
414423
end
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
{
2+
"key": 33,
3+
"custom":{
4+
"groups":[
5+
"microsoft",
6+
"google"
7+
]
8+
}
9+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
{
2+
"key": "33",
3+
"custom":{
4+
"groups":[
5+
"microsoft",
6+
"google"
7+
]
8+
}
9+
}

spec/ldclient_spec.rb

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,14 @@
1414
data = File.read(File.join("spec", "fixtures", "user.json"))
1515
JSON.parse(data, symbolize_names: true)
1616
end
17+
let(:numeric_key_user) do
18+
data = File.read(File.join("spec", "fixtures", "numeric_key_user.json"))
19+
JSON.parse(data, symbolize_names: true)
20+
end
21+
let(:sanitized_numeric_key_user) do
22+
data = File.read(File.join("spec", "fixtures", "sanitized_numeric_key_user.json"))
23+
JSON.parse(data, symbolize_names: true)
24+
end
1725

1826
context 'user flag settings' do
1927
describe '#update_user_flag_setting' do
@@ -85,6 +93,10 @@
8593
result = client.toggle?(feature[:key], nil, "default")
8694
expect(result).to eq "default"
8795
end
96+
it "sanitizes the user in the event" do
97+
expect(client).to receive(:add_event).with(hash_including(user: sanitized_numeric_key_user))
98+
client.toggle?(feature[:key], numeric_key_user, "default")
99+
end
88100
it "returns value from streamed flag if available" do
89101
expect(client.instance_variable_get(:@config)).to receive(:stream?).and_return(true).twice
90102
expect(client.instance_variable_get(:@stream_processor)).to receive(:started?).and_return true
@@ -103,6 +115,28 @@
103115
end
104116
end
105117

118+
describe '#identify' do
119+
it "queues up an identify event" do
120+
expect(client).to receive(:add_event).with(hash_including(kind: "identify", key: user[:key], user: user))
121+
client.identify(user)
122+
end
123+
it "sanitizes the user in the event" do
124+
expect(client).to receive(:add_event).with(hash_including(user: sanitized_numeric_key_user))
125+
client.identify(numeric_key_user)
126+
end
127+
end
128+
129+
describe '#track' do
130+
it "queues up an custom event" do
131+
expect(client).to receive(:add_event).with(hash_including(kind: "custom", key: "custom_event_name", user: user, data: 42))
132+
client.track("custom_event_name", user, 42)
133+
end
134+
it "sanitizes the user in the event" do
135+
expect(client).to receive(:add_event).with(hash_including(user: sanitized_numeric_key_user))
136+
client.track("custom_event_name", numeric_key_user, nil)
137+
end
138+
end
139+
106140
describe '#get_streamed_flag' do
107141
it "will not check the polled flag normally" do
108142
expect(client).to receive(:get_flag_stream).and_return true

0 commit comments

Comments
 (0)