Skip to content
This repository was archived by the owner on Apr 2, 2024. It is now read-only.

Commit 9219ed0

Browse files
committed
Merge pull request #846 from mozilla-services/sandbox-decoder-passthrough
Fix message pass-through support in SandboxDecoders and add a
2 parents 78391f7 + 0904d0f commit 9219ed0

File tree

4 files changed

+202
-52
lines changed

4 files changed

+202
-52
lines changed

CHANGES.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@
44
Bug Handling
55
------------
66

7+
* Fix SandboxDecoder pass-through case so decoders that only use write_message
8+
and not inject_message will emit messages correctly (issue #844).
9+
710
* Fixed TcpInput so it will only override the default delimiter for a
811
RegexpParser if a delimiter is specified in the config.
912

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
-- This Source Code Form is subject to the terms of the Mozilla Public
2+
-- License, v. 2.0. If a copy of the MPL was not distributed with this
3+
-- file, You can obtain one at http://mozilla.org/MPL/2.0/.
4+
5+
6+
function process_message ()
7+
msg = read_message("Payload")
8+
if msg == "string field scribble" then
9+
write_message("Fields[scribble]", "foo")
10+
end
11+
if msg == "num field scribble" then
12+
write_message("Fields[scribble]", 1)
13+
end
14+
if msg == "bool field scribble" then
15+
write_message("Fields[scribble]", true)
16+
end
17+
if msg == "set type and payload" then
18+
write_message("Type", "my_type")
19+
write_message("Payload", "my_payload")
20+
end
21+
if msg == "set field value with representation" then
22+
write_message("Fields[rep]", "foo", "representation")
23+
end
24+
if msg == "set multiple field string values" then
25+
write_message("Fields[multi]", "first", "", 0)
26+
write_message("Fields[multi]", "second", "", 1)
27+
end
28+
if msg == "set field string array value" then
29+
write_message("Fields[array]", "first", "", 0, 0)
30+
write_message("Fields[array]", "second", "", 0, 1)
31+
end
32+
return 0
33+
end

sandbox/plugins/sandbox_decoder.go

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,12 @@
44
# You can obtain one at http://mozilla.org/MPL/2.0/.
55
#
66
# The Initial Developer of the Original Code is the Mozilla Foundation.
7-
# Portions created by the Initial Developer are Copyright (C) 2013
7+
# Portions created by the Initial Developer are Copyright (C) 2013-2014
88
# the Initial Developer. All Rights Reserved.
99
#
1010
# Contributor(s):
1111
# Mike Trinkala ([email protected])
12+
# Rob Miller ([email protected])
1213
#
1314
# ***** END LICENSE BLOCK *****/
1415

@@ -269,7 +270,14 @@ func (s *SandboxDecoder) Decode(pack *pipeline.PipelinePack) (packs []*pipeline.
269270
}
270271
s.packs = nil
271272
}
272-
packs = s.packs
273+
if retval == 0 && s.pack != nil {
274+
// InjectMessage was never called, we're passing the original message
275+
// through.
276+
packs = append(packs, pack)
277+
s.pack = nil
278+
} else {
279+
packs = s.packs
280+
}
273281
s.packs = nil
274282
err = s.err
275283
return

sandbox/plugins/sandbox_plugins_test.go

Lines changed: 156 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -234,66 +234,172 @@ func DecoderSpec(c gs.Context) {
234234

235235
decoder := new(SandboxDecoder)
236236
conf := decoder.ConfigStruct().(*sandbox.SandboxConfig)
237-
conf.ScriptFilename = "../lua/testsupport/decoder.lua"
238-
conf.ScriptType = "lua"
239237
supply := make(chan *pipeline.PipelinePack, 1)
240238
pack := pipeline.NewPipelinePack(supply)
241239
dRunner := pm.NewMockDecoderRunner(ctrl)
242-
dRunner.EXPECT().Name().Return("serialize")
243-
err := decoder.Init(conf)
244-
c.Assume(err, gs.IsNil)
240+
conf.ScriptType = "lua"
245241

246-
c.Specify("decodes simple messages", func() {
247-
data := "1376389920 debug id=2321 url=example.com item=1"
248-
decoder.SetDecoderRunner(dRunner)
249-
pack.Message.SetPayload(data)
250-
_, err = decoder.Decode(pack)
242+
c.Specify("that uses lpeg and inject_message", func() {
243+
dRunner.EXPECT().Name().Return("serialize")
244+
conf.ScriptFilename = "../lua/testsupport/decoder.lua"
245+
err := decoder.Init(conf)
251246
c.Assume(err, gs.IsNil)
252247

253-
c.Expect(pack.Message.GetTimestamp(),
254-
gs.Equals,
255-
int64(1376389920000000000))
256-
257-
c.Expect(pack.Message.GetSeverity(), gs.Equals, int32(7))
258-
259-
var ok bool
260-
var value interface{}
261-
value, ok = pack.Message.GetFieldValue("id")
262-
c.Expect(ok, gs.Equals, true)
263-
c.Expect(value, gs.Equals, "2321")
264-
265-
value, ok = pack.Message.GetFieldValue("url")
266-
c.Expect(ok, gs.Equals, true)
267-
c.Expect(value, gs.Equals, "example.com")
268-
269-
value, ok = pack.Message.GetFieldValue("item")
270-
c.Expect(ok, gs.Equals, true)
271-
c.Expect(value, gs.Equals, "1")
272-
decoder.Shutdown()
273-
})
274-
275-
c.Specify("decodes an invalid messages", func() {
276-
data := "1376389920 bogus id=2321 url=example.com item=1"
277-
decoder.SetDecoderRunner(dRunner)
278-
pack.Message.SetPayload(data)
279-
packs, err := decoder.Decode(pack)
280-
c.Expect(len(packs), gs.Equals, 0)
281-
c.Expect(err.Error(), gs.Equals, "Failed parsing: "+data)
282-
c.Expect(decoder.processMessageFailures, gs.Equals, int64(1))
283-
decoder.Shutdown()
248+
c.Specify("decodes simple messages", func() {
249+
data := "1376389920 debug id=2321 url=example.com item=1"
250+
decoder.SetDecoderRunner(dRunner)
251+
pack.Message.SetPayload(data)
252+
_, err = decoder.Decode(pack)
253+
c.Assume(err, gs.IsNil)
254+
255+
c.Expect(pack.Message.GetTimestamp(),
256+
gs.Equals,
257+
int64(1376389920000000000))
258+
259+
c.Expect(pack.Message.GetSeverity(), gs.Equals, int32(7))
260+
261+
var ok bool
262+
var value interface{}
263+
value, ok = pack.Message.GetFieldValue("id")
264+
c.Expect(ok, gs.Equals, true)
265+
c.Expect(value, gs.Equals, "2321")
266+
267+
value, ok = pack.Message.GetFieldValue("url")
268+
c.Expect(ok, gs.Equals, true)
269+
c.Expect(value, gs.Equals, "example.com")
270+
271+
value, ok = pack.Message.GetFieldValue("item")
272+
c.Expect(ok, gs.Equals, true)
273+
c.Expect(value, gs.Equals, "1")
274+
decoder.Shutdown()
275+
})
276+
277+
c.Specify("decodes an invalid messages", func() {
278+
data := "1376389920 bogus id=2321 url=example.com item=1"
279+
decoder.SetDecoderRunner(dRunner)
280+
pack.Message.SetPayload(data)
281+
packs, err := decoder.Decode(pack)
282+
c.Expect(len(packs), gs.Equals, 0)
283+
c.Expect(err.Error(), gs.Equals, "Failed parsing: "+data)
284+
c.Expect(decoder.processMessageFailures, gs.Equals, int64(1))
285+
decoder.Shutdown()
286+
})
287+
288+
c.Specify("Preserves data", func() {
289+
conf.ScriptFilename = "../lua/testsupport/serialize.lua"
290+
conf.PreserveData = true
291+
err := decoder.Init(conf)
292+
c.Assume(err, gs.IsNil)
293+
decoder.SetDecoderRunner(dRunner)
294+
decoder.Shutdown()
295+
_, err = os.Stat("sandbox_preservation/serialize.data")
296+
c.Expect(err, gs.IsNil)
297+
err = os.Remove("sandbox_preservation/serialize.data")
298+
c.Expect(err, gs.IsNil)
299+
})
284300
})
285301

286-
c.Specify("Preserves data", func() {
287-
conf.ScriptFilename = "../lua/testsupport/serialize.lua"
288-
conf.PreserveData = true
302+
c.Specify("that only uses write_message", func() {
303+
conf.ScriptFilename = "../lua/testsupport/write_message_decoder.lua"
304+
dRunner.EXPECT().Name().Return("write_message")
289305
err := decoder.Init(conf)
290-
c.Assume(err, gs.IsNil)
291306
decoder.SetDecoderRunner(dRunner)
292-
decoder.Shutdown()
293-
_, err = os.Stat("sandbox_preservation/serialize.data")
294-
c.Expect(err, gs.IsNil)
295-
err = os.Remove("sandbox_preservation/serialize.data")
296-
c.Expect(err, gs.IsNil)
307+
c.Assume(err, gs.IsNil)
308+
309+
c.Specify("adds a string field to the message", func() {
310+
data := "string field scribble"
311+
pack.Message.SetPayload(data)
312+
packs, err := decoder.Decode(pack)
313+
c.Expect(err, gs.IsNil)
314+
c.Expect(len(packs), gs.Equals, 1)
315+
c.Expect(packs[0], gs.Equals, pack)
316+
value, ok := pack.Message.GetFieldValue("scribble")
317+
c.Expect(ok, gs.IsTrue)
318+
c.Expect(value.(string), gs.Equals, "foo")
319+
})
320+
321+
c.Specify("adds a numeric field to the message", func() {
322+
data := "num field scribble"
323+
pack.Message.SetPayload(data)
324+
packs, err := decoder.Decode(pack)
325+
c.Expect(err, gs.IsNil)
326+
c.Expect(len(packs), gs.Equals, 1)
327+
c.Expect(packs[0], gs.Equals, pack)
328+
value, ok := pack.Message.GetFieldValue("scribble")
329+
c.Expect(ok, gs.IsTrue)
330+
c.Expect(value.(float64), gs.Equals, float64(1))
331+
})
332+
333+
c.Specify("adds a boolean field to the message", func() {
334+
data := "bool field scribble"
335+
pack.Message.SetPayload(data)
336+
packs, err := decoder.Decode(pack)
337+
c.Expect(err, gs.IsNil)
338+
c.Expect(len(packs), gs.Equals, 1)
339+
c.Expect(packs[0], gs.Equals, pack)
340+
value, ok := pack.Message.GetFieldValue("scribble")
341+
c.Expect(ok, gs.IsTrue)
342+
c.Expect(value.(bool), gs.Equals, true)
343+
})
344+
345+
c.Specify("sets type and payload", func() {
346+
data := "set type and payload"
347+
pack.Message.SetPayload(data)
348+
packs, err := decoder.Decode(pack)
349+
c.Expect(err, gs.IsNil)
350+
c.Expect(len(packs), gs.Equals, 1)
351+
c.Expect(packs[0], gs.Equals, pack)
352+
c.Expect(pack.Message.GetType(), gs.Equals, "my_type")
353+
c.Expect(pack.Message.GetPayload(), gs.Equals, "my_payload")
354+
})
355+
356+
c.Specify("sets field value with representation", func() {
357+
data := "set field value with representation"
358+
pack.Message.SetPayload(data)
359+
packs, err := decoder.Decode(pack)
360+
c.Expect(err, gs.IsNil)
361+
c.Expect(len(packs), gs.Equals, 1)
362+
c.Expect(packs[0], gs.Equals, pack)
363+
fields := pack.Message.FindAllFields("rep")
364+
c.Expect(len(fields), gs.Equals, 1)
365+
field := fields[0]
366+
values := field.GetValueString()
367+
c.Expect(len(values), gs.Equals, 1)
368+
c.Expect(values[0], gs.Equals, "foo")
369+
c.Expect(field.GetRepresentation(), gs.Equals, "representation")
370+
})
371+
372+
c.Specify("sets multiple field string values", func() {
373+
data := "set multiple field string values"
374+
pack.Message.SetPayload(data)
375+
packs, err := decoder.Decode(pack)
376+
c.Expect(err, gs.IsNil)
377+
c.Expect(len(packs), gs.Equals, 1)
378+
c.Expect(packs[0], gs.Equals, pack)
379+
fields := pack.Message.FindAllFields("multi")
380+
c.Expect(len(fields), gs.Equals, 2)
381+
values := fields[0].GetValueString()
382+
c.Expect(len(values), gs.Equals, 1)
383+
c.Expect(values[0], gs.Equals, "first")
384+
values = fields[1].GetValueString()
385+
c.Expect(len(values), gs.Equals, 1)
386+
c.Expect(values[0], gs.Equals, "second")
387+
})
388+
389+
c.Specify("sets field string array value", func() {
390+
data := "set field string array value"
391+
pack.Message.SetPayload(data)
392+
packs, err := decoder.Decode(pack)
393+
c.Expect(err, gs.IsNil)
394+
c.Expect(len(packs), gs.Equals, 1)
395+
c.Expect(packs[0], gs.Equals, pack)
396+
fields := pack.Message.FindAllFields("array")
397+
c.Expect(len(fields), gs.Equals, 1)
398+
values := fields[0].GetValueString()
399+
c.Expect(len(values), gs.Equals, 2)
400+
c.Expect(values[0], gs.Equals, "first")
401+
c.Expect(values[1], gs.Equals, "second")
402+
})
297403
})
298404
})
299405

0 commit comments

Comments
 (0)