Support escaping * in filter values
This commit is contained in:
parent
512541bfbd
commit
11b3a6655d
|
@ -138,18 +138,43 @@ function _buildFilterTree(expr) {
|
||||||
tree.name = expr;
|
tree.name = expr;
|
||||||
} else {
|
} else {
|
||||||
// pull out lhs and rhs of equality operator
|
// pull out lhs and rhs of equality operator
|
||||||
|
var clean = false;
|
||||||
var splitAry = expr.split(operatorStr);
|
var splitAry = expr.split(operatorStr);
|
||||||
tree.name = splitAry.shift();
|
tree.name = splitAry.shift();
|
||||||
tree.value = splitAry.join(operatorStr);
|
tree.value = splitAry.join(operatorStr);
|
||||||
|
|
||||||
// substrings and extensible matching fall into the equality bin in the
|
// substrings fall into the equality bin in the
|
||||||
// switch above so we need more processing here
|
// switch above so we need more processing here
|
||||||
if (tree.tag === 'equalityMatch') {
|
if (tree.tag === 'equalityMatch') {
|
||||||
if (tree.value.indexOf('*') !== -1) {
|
if (tree.value.length === 0) {
|
||||||
tree.tag = 'substrings';
|
tree.tag = 'present';
|
||||||
|
} else {
|
||||||
|
var substrNdx = 0;
|
||||||
|
var substr = false;
|
||||||
|
var esc = false;
|
||||||
|
|
||||||
split = tree.value.split('*');
|
// Effectively a hand-rolled .shift() to support \* sequences
|
||||||
|
clean = true;
|
||||||
|
split = [];
|
||||||
|
substrNdx = 0;
|
||||||
|
split[substrNdx] = '';
|
||||||
|
for (var i = 0; i < tree.value.length; i++) {
|
||||||
|
var c = tree.value[i];
|
||||||
|
if (esc) {
|
||||||
|
split[substrNdx] += c;
|
||||||
|
esc = false;
|
||||||
|
} else if (c === '*') {
|
||||||
|
split[++substrNdx] = '';
|
||||||
|
} else if (c === '\\') {
|
||||||
|
esc = true;
|
||||||
|
} else {
|
||||||
|
split[substrNdx] += c;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (split.length > 1) {
|
||||||
|
tree.tag = 'substrings';
|
||||||
|
clean = true;
|
||||||
|
|
||||||
// if the value string doesn't start with a * then theres no initial
|
// if the value string doesn't start with a * then theres no initial
|
||||||
// value else split will have an empty string in its first array
|
// value else split will have an empty string in its first array
|
||||||
|
@ -161,17 +186,19 @@ function _buildFilterTree(expr) {
|
||||||
split.shift();
|
split.shift();
|
||||||
}
|
}
|
||||||
|
|
||||||
//if the value string doesn't end with a * then theres no final value
|
// if the value string doesn't end with a * then theres no final
|
||||||
//also same split stuff as the initial stuff above
|
// value also same split stuff as the initial stuff above
|
||||||
if (tree.value.lastIndexOf('*') !== tree.value.length - 1) {
|
if (tree.value.lastIndexOf('*') !== tree.value.length - 1) {
|
||||||
tree['final'] = split.pop();
|
tree['final'] = split.pop();
|
||||||
} else {
|
} else {
|
||||||
split.pop();
|
split.pop();
|
||||||
}
|
}
|
||||||
tree.any = split;
|
tree.any = split;
|
||||||
} else if (tree.value.length === 0) {
|
} else {
|
||||||
tree.tag = 'present';
|
tree.value = split[0]; // pick up the cleaned version
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
} else if (tree.tag == 'extensibleMatch') {
|
} else if (tree.tag == 'extensibleMatch') {
|
||||||
split = tree.name.split(':');
|
split = tree.name.split(':');
|
||||||
tree.extensible = {
|
tree.extensible = {
|
||||||
|
@ -197,6 +224,24 @@ function _buildFilterTree(expr) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Cleanup any escape sequences
|
||||||
|
if (!clean) {
|
||||||
|
var val = '';
|
||||||
|
var esc = false;
|
||||||
|
for (var i = 0; i < tree.value.length; i++) {
|
||||||
|
var c = tree.value[i];
|
||||||
|
if (esc) {
|
||||||
|
val += c;
|
||||||
|
esc = false;
|
||||||
|
} else if (c === '\\') {
|
||||||
|
esc = true;
|
||||||
|
} else {
|
||||||
|
val += c;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
tree.value = val;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return tree;
|
return tree;
|
||||||
|
|
|
@ -29,3 +29,53 @@ test('GH-50 = in filter', function(t) {
|
||||||
'uuid=930896af-bf8c-48d4-885c-6573a94b1853, ou=users, o=smartdc');
|
'uuid=930896af-bf8c-48d4-885c-6573a94b1853, ou=users, o=smartdc');
|
||||||
t.end();
|
t.end();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
|
test('( in filter', function(t) {
|
||||||
|
var str = '(foo=bar\\()';
|
||||||
|
var f = parse(str);
|
||||||
|
t.ok(f);
|
||||||
|
t.equal(f.attribute, 'foo');
|
||||||
|
t.equal(f.value, 'bar(');
|
||||||
|
t.end();
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
test(') in filter', function(t) {
|
||||||
|
var str = '(foo=bar\\))';
|
||||||
|
var f = parse(str);
|
||||||
|
t.ok(f);
|
||||||
|
t.equal(f.attribute, 'foo');
|
||||||
|
t.equal(f.value, 'bar)');
|
||||||
|
t.end();
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
test('\\ in filter', function(t) {
|
||||||
|
var str = '(foo=bar\\\\)';
|
||||||
|
var f = parse(str);
|
||||||
|
t.ok(f);
|
||||||
|
t.equal(f.attribute, 'foo');
|
||||||
|
t.equal(f.value, 'bar\\');
|
||||||
|
t.end();
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
test('* in equality filter', function(t) {
|
||||||
|
var str = '(foo=bar\\*)';
|
||||||
|
var f = parse(str);
|
||||||
|
t.ok(f);
|
||||||
|
t.equal(f.attribute, 'foo');
|
||||||
|
t.equal(f.value, 'bar*');
|
||||||
|
t.end();
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
test('* substr filter (prefix)', function(t) {
|
||||||
|
var str = '(foo=bar*)';
|
||||||
|
var f = parse(str);
|
||||||
|
t.ok(f);
|
||||||
|
t.equal(f.attribute, 'foo');
|
||||||
|
t.equal(f.initial, 'bar');
|
||||||
|
t.end();
|
||||||
|
});
|
||||||
|
|
|
@ -44,7 +44,7 @@ test('Evolution search filter (GH-3)', function(t) {
|
||||||
};
|
};
|
||||||
|
|
||||||
server.search(suffix, function(req, res, next) {
|
server.search(suffix, function(req, res, next) {
|
||||||
console.log(req.filter.toString());
|
console.log(req.filter.filters[0].type);
|
||||||
if (req.filter.matches(entry.attributes))
|
if (req.filter.matches(entry.attributes))
|
||||||
res.send(entry);
|
res.send(entry);
|
||||||
res.end();
|
res.end();
|
||||||
|
|
Loading…
Reference in New Issue