Skip to content

Commit ad8ba67

Browse files
committed
fix regex escape in filters
1 parent a193dc3 commit ad8ba67

File tree

1 file changed

+29
-2
lines changed

1 file changed

+29
-2
lines changed

src/DataSource.ts

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,9 +42,9 @@ export class AlertmanagerDataSource extends DataSourceApi<CustomQuery, GenericOp
4242
params.push(`receiver=${query.receiver}`);
4343
}
4444
if (query.filters !== undefined && query.filters.length > 0) {
45-
query.filters = getTemplateSrv().replace(query.filters, options.scopedVars);
45+
query.filters = getTemplateSrv().replace(query.filters, options.scopedVars, this.interpolateQueryExpr);
4646
query.filters.split(',').forEach(value => {
47-
params.push(`filter=${value}`);
47+
params.push(`filter=${encodeURIComponent(value)}`);
4848
});
4949
}
5050

@@ -150,4 +150,31 @@ export class AlertmanagerDataSource extends DataSourceApi<CustomQuery, GenericOp
150150
});
151151
return Promise.resolve(frame);
152152
}
153+
154+
interpolateQueryExpr(value: string | string[] = [], variable: any) {
155+
// if no multi or include all do not regexEscape
156+
if (!variable.multi && !variable.includeAll) {
157+
return alertmanagerRegularEscape(value);
158+
}
159+
160+
if (typeof value === 'string') {
161+
return alertmanagerSpecialRegexEscape(value);
162+
}
163+
164+
const escapedValues = value.map(val => alertmanagerSpecialRegexEscape(val));
165+
166+
if (escapedValues.length === 1) {
167+
return escapedValues[0];
168+
}
169+
170+
return '(' + escapedValues.join('|') + ')';
171+
}
172+
}
173+
174+
export function alertmanagerRegularEscape(value: any) {
175+
return typeof value === 'string' ? value.replace(/\\/g, '\\\\').replace(/'/g, "\\\\'") : value;
176+
}
177+
178+
export function alertmanagerSpecialRegexEscape(value: any) {
179+
return typeof value === 'string' ? value.replace(/\\/g, '\\\\\\\\').replace(/[$^*{}\[\]\'+?()|]/g, '\\\\$&') : value;
153180
}

0 commit comments

Comments
 (0)