Skip to content
This repository was archived by the owner on Dec 14, 2023. It is now read-only.

Commit 5d0f4f9

Browse files
WardormeurDanielBrierton
authored andcommitted
Restrict fields for seneca-standard-query (#227)
* Restrict fields for seneca-standard-query * typo
1 parent 4f4c9b5 commit 5d0f4f9

File tree

1 file changed

+37
-0
lines changed

1 file changed

+37
-0
lines changed

service.js

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ if (process.env.NEW_RELIC_ENABLED === 'true') require('newrelic');
66

77
var config = require('./config/config.js')();
88
var seneca = require('seneca')(config);
9+
var _ = require('lodash');
910
var store = require('seneca-postgresql-store');
1011
var log = require('cp-logs-lib')({name: 'cp-users-service', level: 'warn'});
1112
config.log = log.log;
@@ -70,4 +71,40 @@ require('./migrate-psql-db.js')(function (err) {
7071
.client({ type: 'web', port: 10304, pin: { role: 'cd-salesforce', cmd: '*' } })
7172
.client({ type: 'web', port: 10301, pin: 'role:cd-dojos,cmd:*' })
7273
.client({ type: 'web', port: 10305, pin: {role: 'cd-badges', cmd: '*'} });
74+
75+
seneca.ready(function () {
76+
var escape = require('seneca-postgresql-store/lib/relational-util').escapeStr;
77+
['load', 'list'].forEach(function (cmd) {
78+
seneca.wrap('role: entity, cmd: ' + cmd, function filterFields (args, cb) {
79+
try {
80+
['limit$', 'skip$'].forEach(function (field) {
81+
if (args.q[field] && args.q[field] !== 'NULL' && !/^[0-9]+$/g.test(args.q[field] + '')) {
82+
throw new Error('Expect limit$, skip$ to be a number');
83+
}
84+
});
85+
if (args.q.sort$) {
86+
if (args.q.sort$ && typeof args.q.sort$ === 'object') {
87+
var order = args.q.sort$;
88+
_.each(order, function (ascdesc, column) {
89+
if (!/^[a-zA-Z0-9_]+$/g.test(column)) {
90+
throw new Error('Unexpect characters in sort$');
91+
}
92+
});
93+
} else {
94+
throw new Error('Expect sort$ to be an object');
95+
}
96+
}
97+
if (args.q.fields$) {
98+
args.q.fields$.forEach(function (field, index) {
99+
args.q.fields$[index] = '\"' + escape(field) + '\"';
100+
});
101+
}
102+
this.prior(args, cb);
103+
} catch (err) {
104+
// cb to avoid seneca-transport to hang while waiting for timeout error
105+
return cb(err);
106+
}
107+
});
108+
});
109+
});
73110
});

0 commit comments

Comments
 (0)