Skip to content

Commit 426d597

Browse files
Merge pull request #5419 from Countly/SER-1555-deepscan-hooks-fix-insufficient-null-checks
[SER-1555] Hooks insufficient null checks
2 parents 4c55a94 + 1b12d46 commit 426d597

File tree

1 file changed

+59
-42
lines changed

1 file changed

+59
-42
lines changed

plugins/hooks/api/api.js

Lines changed: 59 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -272,7 +272,6 @@ plugins.register("/permissions/features", function(ob) {
272272
plugins.register("/i/hook/save", function(ob) {
273273
let paramsInstance = ob.params;
274274

275-
276275
validateCreate(ob.params, FEATURE_NAME, function(params) {
277276
let hookConfig = params.qstring.hook_config;
278277
if (!hookConfig) {
@@ -283,50 +282,57 @@ plugins.register("/i/hook/save", function(ob) {
283282
try {
284283
hookConfig = JSON.parse(hookConfig);
285284
hookConfig = sanitizeConfig(hookConfig);
286-
if (!(common.validateArgs(hookConfig, CheckHookProperties(hookConfig)))) {
287-
common.returnMessage(params, 400, 'Not enough args');
288-
return true;
289-
}
285+
if (hookConfig) {
286+
// Null check for hookConfig
287+
if (!(common.validateArgs(hookConfig, CheckHookProperties(hookConfig)))) {
288+
common.returnMessage(params, 400, 'Not enough args');
289+
return true;
290+
}
290291

291-
if (hookConfig.effects && !validateEffects(hookConfig.effects)) {
292-
common.returnMessage(params, 400, 'Invalid configuration for effects');
293-
return true;
294-
}
292+
if (hookConfig.effects && !validateEffects(hookConfig.effects)) {
293+
common.returnMessage(params, 400, 'Invalid configuration for effects');
294+
return true;
295+
}
295296

296-
if (hookConfig._id) {
297-
const id = hookConfig._id;
298-
delete hookConfig._id;
299-
return common.db.collection("hooks").findAndModify(
300-
{ _id: common.db.ObjectID(id) },
301-
{},
302-
{$set: hookConfig},
303-
{new: true},
304-
function(err, result) {
305-
if (!err) {
306-
// Audit log: Hook updated
307-
if (result && result.value) {
308-
plugins.dispatch("/systemlogs", {
309-
params: params,
310-
action: "hook_updated",
311-
data: {
312-
updatedHookID: result.value._id,
313-
updatedBy: params.member._id,
314-
updatedHookName: result.value.name
315-
}
316-
});
297+
if (hookConfig._id) {
298+
const id = hookConfig._id;
299+
delete hookConfig._id;
300+
return common.db.collection("hooks").findAndModify(
301+
{ _id: common.db.ObjectID(id) },
302+
{},
303+
{$set: hookConfig},
304+
{new: true},
305+
function(err, result) {
306+
if (!err) {
307+
// Audit log: Hook updated
308+
if (result && result.value) {
309+
plugins.dispatch("/systemlogs", {
310+
params: params,
311+
action: "hook_updated",
312+
data: {
313+
updatedHookID: result.value._id,
314+
updatedBy: params.member._id,
315+
updatedHookName: result.value.name
316+
}
317+
});
318+
}
319+
else {
320+
common.returnMessage(params, 500, "No result found");
321+
}
322+
common.returnOutput(params, result && result.value);
317323
}
318324
else {
319-
common.returnMessage(params, 500, "No result found");
325+
common.returnMessage(params, 500, "Failed to save an hook");
320326
}
321-
common.returnOutput(params, result && result.value);
322327
}
323-
else {
324-
common.returnMessage(params, 500, "Failed to save an hook");
325-
}
326-
});
328+
);
329+
}
330+
331+
}
332+
if (hookConfig) {
333+
hookConfig.createdBy = params.member._id; // Accessing property now with proper check
334+
hookConfig.created_at = new Date().getTime();
327335
}
328-
hookConfig.createdBy = params.member._id;
329-
hookConfig.created_at = new Date().getTime();
330336
return common.db.collection("hooks").insert(
331337
hookConfig,
332338
function(err, result) {
@@ -608,43 +614,54 @@ plugins.register("/i/hook/test", function(ob) {
608614
let hookConfig = params.qstring.hook_config;
609615
if (!hookConfig) {
610616
common.returnMessage(params, 400, 'Invalid hookConfig');
611-
return true;
617+
return;
612618
}
613619

614620
try {
615621
hookConfig = JSON.parse(hookConfig);
622+
if (!hookConfig) {
623+
common.returnMessage(params, 400, 'Parsed hookConfig is invalid');
624+
return;
625+
}
616626
hookConfig = sanitizeConfig(hookConfig);
617627
const mockData = JSON.parse(params.qstring.mock_data);
618628

619629
if (!(common.validateArgs(hookConfig, CheckHookProperties(hookConfig)))) {
620630
common.returnMessage(params, 403, "hook config invalid");
631+
return; // Add return to exit early
621632
}
622633

634+
// Null check for effects
623635
if (hookConfig.effects && !validateEffects(hookConfig.effects)) {
624636
common.returnMessage(params, 400, 'Config invalid');
625-
return true;
637+
return; // Add return to exit early
626638
}
627639

640+
628641
// trigger process
629642
log.d(JSON.stringify(hookConfig), "[hook test config]");
630643
const results = [];
631644

632645
// build mock data
633646
const trigger = hookConfig.trigger;
647+
if (!trigger) {
648+
common.returnMessage(params, 400, 'Trigger is missing');
649+
return;
650+
}
634651
hookConfig._id = null;
652+
635653
log.d("[hook test mock data]", mockData);
636654
const obj = {
637655
is_mock: true,
638656
params: mockData,
639657
rule: hookConfig
640658
};
641-
642659
log.d("[hook test config data]", obj);
643660
const t = new Triggers[trigger.type]({
644661
rules: [hookConfig],
645662
});
646663

647-
// out put trigger result
664+
// output trigger result
648665
const triggerResult = await t.process(obj);
649666
log.d("[hook trigger test result]", triggerResult);
650667
results.push(JSON.parse(JSON.stringify(triggerResult)));

0 commit comments

Comments
 (0)