negcache.c revision d338bb46b8c03c33e6182e725911af6d778bcf00
e6d40133bc9f858308654afb1262b8b483ec5922Till Mossakowski NSS Responder
98890889ffb2e8f6f722b00e265a211f13b5a861Corneliu-Claudiu Prodescu Copyright (C) Simo Sorce <ssorce@redhat.com> 2008
3f69b6948966979163bdfe8331c38833d5d90ecdChristian Maeder This program is free software; you can redistribute it and/or modify
b53688bfed888214b485cf76439d57262d80e0a7Christian Maeder it under the terms of the GNU General Public License as published by
b53688bfed888214b485cf76439d57262d80e0a7Christian Maeder the Free Software Foundation; either version 3 of the License, or
b53688bfed888214b485cf76439d57262d80e0a7Christian Maeder (at your option) any later version.
b53688bfed888214b485cf76439d57262d80e0a7Christian Maeder This program is distributed in the hope that it will be useful,
b53688bfed888214b485cf76439d57262d80e0a7Christian Maeder but WITHOUT ANY WARRANTY; without even the implied warranty of
b53688bfed888214b485cf76439d57262d80e0a7Christian Maeder MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
109a53dbf4c9233f869f63ba7a7f3fece49973c3Christian Maeder GNU General Public License for more details.
0a26144c20fa9cdcd05011ca5019cbac8e4afae0cmaeder You should have received a copy of the GNU General Public License
0a26144c20fa9cdcd05011ca5019cbac8e4afae0cmaeder along with this program. If not, see <http://www.gnu.org/licenses/>.
109a53dbf4c9233f869f63ba7a7f3fece49973c3Christian Maeder#define NC_USER_PREFIX NC_ENTRY_PREFIX"USER"
109a53dbf4c9233f869f63ba7a7f3fece49973c3Christian Maeder#define NC_GROUP_PREFIX NC_ENTRY_PREFIX"GROUP"
85e1d54a475bfc30b3eac5ae6c5e42a2d7e93f10Christian Maeder#define NC_NETGROUP_PREFIX NC_ENTRY_PREFIX"NETGR"
85e1d54a475bfc30b3eac5ae6c5e42a2d7e93f10Christian Maeder#define NC_SERVICE_PREFIX NC_ENTRY_PREFIX"SERVICE"
109a53dbf4c9233f869f63ba7a7f3fece49973c3Christian Maedertypedef int (*ncache_set_byname_fn_t)(struct sss_nc_ctx *, bool,
0130083f314580170af1195037be3325f125fbceChristian Maeder const char *, const char *);
0130083f314580170af1195037be3325f125fbceChristian Maederstatic int sss_ncache_set_ent(struct sss_nc_ctx *ctx, bool permanent,
109a53dbf4c9233f869f63ba7a7f3fece49973c3Christian Maeder struct sss_domain_info *dom, const char *name,
109a53dbf4c9233f869f63ba7a7f3fece49973c3Christian Maederstatic int string_to_tdb_data(char *str, TDB_DATA *ret)
b53688bfed888214b485cf76439d57262d80e0a7Christian Maederint sss_ncache_init(TALLOC_CTX *memctx, struct sss_nc_ctx **_ctx)
16b71dad8d398af412d66a4f4763f1ada5b03d23Christian Maeder ctx = talloc_zero(memctx, struct sss_nc_ctx);
3a9d784341454573b50b32fa1b494e7418df3086Christian Maeder /* open a memory only tdb with default hash size */
dff1de7ad15d1582e25d636c3724dd202874897fChristian Maeder ctx->tdb = tdb_open("memcache", 0, TDB_INTERNAL, O_RDWR|O_CREAT, 0);
be43c3fa0292555bd126784ae27ff5c1d23438cbChristian Maederstatic int sss_ncache_check_str(struct sss_nc_ctx *ctx, char *str, int ttl)
96ae1a1d2197d0e0d5b80da2474b64c456feb1b0Christian Maeder unsigned long long int timestamp;
38c817b94e0a5b1ae94178b1075c187e07bcc5e1Christian Maeder DEBUG(SSSDBG_TRACE_INTERNAL, "Checking negative cache for [%s]\n", str);
96ae1a1d2197d0e0d5b80da2474b64c456feb1b0Christian Maeder /* a negative ttl means: never expires */
b53688bfed888214b485cf76439d57262d80e0a7Christian Maeder timestamp = strtoull((const char *)data.dptr, &ep, 10);
b53688bfed888214b485cf76439d57262d80e0a7Christian Maeder /* Malformed entry, remove it and return no entry */
dff1de7ad15d1582e25d636c3724dd202874897fChristian Maeder /* a 0 timestamp means this is a permanent entry */
fefee7e1dee1ee5f0768a03a4abae88d1ca2c3fdRazvan Pascanu /* still valid */
33fcc19ef2b59493b4e91eebf701df95fd230765Christian Maeder /* expired, remove and return no entry */
a31430de8b0632d29f42634d6395e982bf31b14dChristian Maederstatic int sss_ncache_set_str(struct sss_nc_ctx *ctx,
b53688bfed888214b485cf76439d57262d80e0a7Christian Maeder DEBUG(SSSDBG_TRACE_FUNC, "Adding [%s] to negative cache%s\n",
fdac680252d7347858bd67b4c2a2aaa52e623815Christian Maeder ret = tdb_store(ctx->tdb, key, data, TDB_REPLACE);
f8cc2399c16fcda7e3bf9d901a0de0cc8a455f86Ewaryst Schulz DEBUG(SSSDBG_CRIT_FAILURE, "Negative cache failed to set entry: [%s]\n",
2353f65833a3da763392f771223250cd50b8d873Christian Maederstatic int sss_ncache_check_user_int(struct sss_nc_ctx *ctx, int ttl,
a3a7d8b3cdf05c8040c62dbcf9a15dc5042cd721Christian Maeder str = talloc_asprintf(ctx, "%s/%s/%s", NC_USER_PREFIX, domain, name);
96ae1a1d2197d0e0d5b80da2474b64c456feb1b0Christian Maederstatic int sss_ncache_check_group_int(struct sss_nc_ctx *ctx, int ttl,
a3a7d8b3cdf05c8040c62dbcf9a15dc5042cd721Christian Maeder str = talloc_asprintf(ctx, "%s/%s/%s", NC_GROUP_PREFIX, domain, name);
bbba6dd86153aacb0f662b182b128df0eb09fd54Christian Maederstatic int sss_ncache_check_netgr_int(struct sss_nc_ctx *ctx, int ttl,
9f4902edfa3d477e42343e0ec357a2f93b1119d1Christian Maeder str = talloc_asprintf(ctx, "%s/%s/%s", NC_NETGROUP_PREFIX, domain, name);
b6ff72be73dad3d1394cf2c71e29e67624ff030bChristian Maederstatic int sss_ncache_check_service_int(struct sss_nc_ctx *ctx,
a3a7d8b3cdf05c8040c62dbcf9a15dc5042cd721Christian Maedertypedef int (*ncache_check_byname_fn_t)(struct sss_nc_ctx *, int,
a3a7d8b3cdf05c8040c62dbcf9a15dc5042cd721Christian Maeder const char *, const char *);
a3a7d8b3cdf05c8040c62dbcf9a15dc5042cd721Christian Maederstatic int sss_cache_check_ent(struct sss_nc_ctx *ctx, int ttl,
a3a7d8b3cdf05c8040c62dbcf9a15dc5042cd721Christian Maeder struct sss_domain_info *dom, const char *name,
8c8545dd3bf34fbcbc16904b65d249658f8f9efcChristian Maeder lower = sss_tc_utf8_str_tolower(ctx, name);
34d14197eb3dd643a8e6ef3ed8cba5629528e97fAivaras Jakubauskas ret = checker(ctx, ttl, dom->name, lower);
b53688bfed888214b485cf76439d57262d80e0a7Christian Maederint sss_ncache_check_user(struct sss_nc_ctx *ctx, int ttl,
b53688bfed888214b485cf76439d57262d80e0a7Christian Maeder struct sss_domain_info *dom, const char *name)
9f4902edfa3d477e42343e0ec357a2f93b1119d1Christian Maeder return sss_cache_check_ent(ctx, ttl, dom, name,
ce8a93047aaf0dc36fa221642292d47852a9862aChristian Maederint sss_ncache_check_group(struct sss_nc_ctx *ctx, int ttl,
a3a7d8b3cdf05c8040c62dbcf9a15dc5042cd721Christian Maeder struct sss_domain_info *dom, const char *name)
ce8a93047aaf0dc36fa221642292d47852a9862aChristian Maeder return sss_cache_check_ent(ctx, ttl, dom, name,
dff1de7ad15d1582e25d636c3724dd202874897fChristian Maederint sss_ncache_check_netgr(struct sss_nc_ctx *ctx, int ttl,
0b13f102310e03a20b38c870b5acb88712f316a4Christian Maeder struct sss_domain_info *dom, const char *name)
dff1de7ad15d1582e25d636c3724dd202874897fChristian Maeder return sss_cache_check_ent(ctx, ttl, dom, name,
9ee80c455784287a8b5e1b6bac1f8efa6a2f4bb3cmaederstatic int sss_ncache_set_service_int(struct sss_nc_ctx *ctx, bool permanent,
0b13f102310e03a20b38c870b5acb88712f316a4Christian Maeder str = talloc_asprintf(ctx, "%s/%s/%s", NC_SERVICE_PREFIX, domain, name);
ce8a93047aaf0dc36fa221642292d47852a9862aChristian Maeder ret = sss_ncache_set_str(ctx, str, permanent);
ce8a93047aaf0dc36fa221642292d47852a9862aChristian Maederint sss_ncache_set_service_name(struct sss_nc_ctx *ctx, bool permanent,
0b13f102310e03a20b38c870b5acb88712f316a4Christian Maeder char *service_and_protocol = talloc_asprintf(ctx, "%s:%s",
ce8a93047aaf0dc36fa221642292d47852a9862aChristian Maeder ret = sss_ncache_set_ent(ctx, permanent, dom,
b53688bfed888214b485cf76439d57262d80e0a7Christian Maederint sss_ncache_check_service(struct sss_nc_ctx *ctx, int ttl,
a3a7d8b3cdf05c8040c62dbcf9a15dc5042cd721Christian Maeder char *service_and_protocol = talloc_asprintf(ctx, "%s:%s",
a3a7d8b3cdf05c8040c62dbcf9a15dc5042cd721Christian Maeder ret = sss_cache_check_ent(ctx, ttl, dom, service_and_protocol,
a3a7d8b3cdf05c8040c62dbcf9a15dc5042cd721Christian Maederint sss_ncache_set_service_port(struct sss_nc_ctx *ctx, bool permanent,
8d780c893d6df5dab3dcc7d8444b7517f6547f11Christian Maeder char *service_and_protocol = talloc_asprintf(ctx, "%ul:%s",
a3a7d8b3cdf05c8040c62dbcf9a15dc5042cd721Christian Maeder ret = sss_ncache_set_ent(ctx, permanent, dom,
16b71dad8d398af412d66a4f4763f1ada5b03d23Christian Maederint sss_ncache_check_service_port(struct sss_nc_ctx *ctx, int ttl,
9f4902edfa3d477e42343e0ec357a2f93b1119d1Christian Maeder char *service_and_protocol = talloc_asprintf(ctx, "%ul:%s",
ce8a93047aaf0dc36fa221642292d47852a9862aChristian Maeder ret = sss_cache_check_ent(ctx, ttl, dom, service_and_protocol,
9f4902edfa3d477e42343e0ec357a2f93b1119d1Christian Maederint sss_ncache_check_uid(struct sss_nc_ctx *ctx, int ttl, uid_t uid)
9f4902edfa3d477e42343e0ec357a2f93b1119d1Christian Maeder str = talloc_asprintf(ctx, "%s/%"SPRIuid, NC_UID_PREFIX, uid);
f39b8dd9651dfcc38b06191cda23cacbfc298323Christian Maederint sss_ncache_check_gid(struct sss_nc_ctx *ctx, int ttl, gid_t gid)
2360728d4185c0c04279c999941c64d36626af79Christian Maeder str = talloc_asprintf(ctx, "%s/%"SPRIgid, NC_GID_PREFIX, gid);
2360728d4185c0c04279c999941c64d36626af79Christian Maederint sss_ncache_check_sid(struct sss_nc_ctx *ctx, int ttl, const char *sid)
ce8a93047aaf0dc36fa221642292d47852a9862aChristian Maeder str = talloc_asprintf(ctx, "%s/%s", NC_SID_PREFIX, sid);
b53688bfed888214b485cf76439d57262d80e0a7Christian Maederstatic int sss_ncache_set_user_int(struct sss_nc_ctx *ctx, bool permanent,
a3a7d8b3cdf05c8040c62dbcf9a15dc5042cd721Christian Maeder str = talloc_asprintf(ctx, "%s/%s/%s", NC_USER_PREFIX, domain, name);
91e24fc45834b35f2a3830d72565640251149bf3Christian Maeder ret = sss_ncache_set_str(ctx, str, permanent);
a3a7d8b3cdf05c8040c62dbcf9a15dc5042cd721Christian Maederstatic int sss_ncache_set_group_int(struct sss_nc_ctx *ctx, bool permanent,
b53688bfed888214b485cf76439d57262d80e0a7Christian Maeder str = talloc_asprintf(ctx, "%s/%s/%s", NC_GROUP_PREFIX, domain, name);
a3a7d8b3cdf05c8040c62dbcf9a15dc5042cd721Christian Maeder ret = sss_ncache_set_str(ctx, str, permanent);
9f85afecbd79b3df5a0bb17bd28cd0b288dc3213Kristina Sojakovastatic int sss_ncache_set_netgr_int(struct sss_nc_ctx *ctx, bool permanent,
a3a7d8b3cdf05c8040c62dbcf9a15dc5042cd721Christian Maeder str = talloc_asprintf(ctx, "%s/%s/%s", NC_NETGROUP_PREFIX, domain, name);
b47b1ea8a412f6e4c731779f6a572384e7cf06d8Christian Maeder ret = sss_ncache_set_str(ctx, str, permanent);
897a04683fb30873e84dc3360dea770a4435971cChristian Maederstatic int sss_ncache_set_ent(struct sss_nc_ctx *ctx, bool permanent,
b53688bfed888214b485cf76439d57262d80e0a7Christian Maeder struct sss_domain_info *dom, const char *name,
63da71bfb4226f504944b293fb77177ebcaea7d4Ewaryst Schulz ret = setter(ctx, permanent, dom->name, lower);
a166da43d4e8f9dfa7a2651d033c6bea02627ca6Mihai Codescu ret = setter(ctx, permanent, dom->name, name);
a3a7d8b3cdf05c8040c62dbcf9a15dc5042cd721Christian Maederint sss_ncache_set_user(struct sss_nc_ctx *ctx, bool permanent,
b47b1ea8a412f6e4c731779f6a572384e7cf06d8Christian Maeder return sss_ncache_set_ent(ctx, permanent, dom, name, sss_ncache_set_user_int);
9f226cec9f978edaba67aee4c4e04e3d3b994b87Daniel Calegariint sss_ncache_set_group(struct sss_nc_ctx *ctx, bool permanent,
6f70475dddc12732bdbef3e3dd116373e34cd6b9Christian Maeder struct sss_domain_info *dom, const char *name)
b53688bfed888214b485cf76439d57262d80e0a7Christian Maeder return sss_ncache_set_ent(ctx, permanent, dom, name, sss_ncache_set_group_int);
1ebf8299efa3cdb39c73d40d15e1d1a8a2246e68notanartistint sss_ncache_set_netgr(struct sss_nc_ctx *ctx, bool permanent,
b53688bfed888214b485cf76439d57262d80e0a7Christian Maeder return sss_ncache_set_ent(ctx, permanent, dom, name, sss_ncache_set_netgr_int);
b53688bfed888214b485cf76439d57262d80e0a7Christian Maederint sss_ncache_set_uid(struct sss_nc_ctx *ctx, bool permanent, uid_t uid)
8762d0e3d492aba4d1621fb0de685f0be1372864notanartist str = talloc_asprintf(ctx, "%s/%"SPRIuid, NC_UID_PREFIX, uid);
1ebf8299efa3cdb39c73d40d15e1d1a8a2246e68notanartistint sss_ncache_set_gid(struct sss_nc_ctx *ctx, bool permanent, gid_t gid)
bbba10ee00dcf6bcbc9f22473b1acd0983b10512notanartist str = talloc_asprintf(ctx, "%s/%"SPRIgid, NC_GID_PREFIX, gid);
bbba10ee00dcf6bcbc9f22473b1acd0983b10512notanartistint sss_ncache_set_sid(struct sss_nc_ctx *ctx, bool permanent, const char *sid)
df87ff823273ae2969e9d29e833845b4c0a9ee77notanartist str = talloc_asprintf(ctx, "%s/%s", NC_SID_PREFIX, sid);
8a5c05062ef501bf725a86a370a5145a198e81fdKlaus Luettichstatic int delete_permanent(struct tdb_context *tdb,
2360728d4185c0c04279c999941c64d36626af79Christian Maeder unsigned long long int timestamp;
b53688bfed888214b485cf76439d57262d80e0a7Christian Maeder NC_ENTRY_PREFIX, sizeof(NC_ENTRY_PREFIX) - 1) != 0) {
a3a7d8b3cdf05c8040c62dbcf9a15dc5042cd721Christian Maeder /* not interested in this key */
bbba10ee00dcf6bcbc9f22473b1acd0983b10512notanartist timestamp = strtoull((const char *)data.dptr, &ep, 10);
4c872eeb600fe8479dbda395405cf13c3d573c24Soeren D. Schulze /* Malformed entry, remove it */
53a3042e1da2253fd3f103bfef4deb47fc0bf6a6Ewaryst Schulz /* a 0 timestamp means this is a permanent entry */
a3a7d8b3cdf05c8040c62dbcf9a15dc5042cd721Christian Maederint sss_ncache_reset_permanent(struct sss_nc_ctx *ctx)
a3a7d8b3cdf05c8040c62dbcf9a15dc5042cd721Christian Maeder ret = tdb_traverse(ctx->tdb, delete_permanent, NULL);
f8cc2399c16fcda7e3bf9d901a0de0cc8a455f86Ewaryst Schulzerrno_t sss_ncache_prepopulate(struct sss_nc_ctx *ncache,
a3a7d8b3cdf05c8040c62dbcf9a15dc5042cd721Christian Maeder struct sss_domain_info *domain_list = rctx->domains;
bbba10ee00dcf6bcbc9f22473b1acd0983b10512notanartist /* Populate domain-specific negative cache entries */
987bd66ac5bc367e2bbe50ce2b6355993fb335d9cmaeder for (dom = domain_list; dom; dom = get_next_domain(dom, false)) {
bbba10ee00dcf6bcbc9f22473b1acd0983b10512notanartist conf_path = talloc_asprintf(tmpctx, CONFDB_DOMAIN_PATH_TMPL,
8a5c05062ef501bf725a86a370a5145a198e81fdKlaus Luettich ret = confdb_get_string_as_list(cdb, tmpctx, conf_path,
7968d3a131e5a684ec1ff0c6d88aae638549153dChristian Maeder for (i = 0; (filter_list && filter_list[i]); i++) {
beff4152e9f0fe90885458d1a1733b183a2a8816Christian Maeder ret = sss_parse_name_for_domains(tmpctx, domain_list,
b6ff72be73dad3d1394cf2c71e29e67624ff030bChristian Maeder "Invalid name in filterUsers list: [%s] (%d)\n",
a3a7d8b3cdf05c8040c62dbcf9a15dc5042cd721Christian Maeder if (domainname && strcmp(domainname, dom->name)) {
78c294da55788b25e175180168371c9536a6d440Christian Maeder "Mismatch between domain name (%s) and name "
bc263f610d20a9cd3014ddfca903026127fa0d48Christian Maeder "set in FQN (%s), skipping user %s\n",
78c294da55788b25e175180168371c9536a6d440Christian Maeder ret = sss_ncache_set_user(ncache, true, dom, name);
b53688bfed888214b485cf76439d57262d80e0a7Christian Maeder "Failed to store permanent user filter for [%s]"
b53688bfed888214b485cf76439d57262d80e0a7Christian Maeder ret = confdb_get_string_as_list(cdb, tmpctx, CONFDB_NSS_CONF_ENTRY,
b6ff72be73dad3d1394cf2c71e29e67624ff030bChristian Maeder filter_list = talloc_array(tmpctx, char *, 2);
a3a7d8b3cdf05c8040c62dbcf9a15dc5042cd721Christian Maeder filter_list[0] = talloc_strdup(tmpctx, "root");
be43c3fa0292555bd126784ae27ff5c1d23438cbChristian Maeder for (i = 0; (filter_list && filter_list[i]); i++) {
b53688bfed888214b485cf76439d57262d80e0a7Christian Maeder ret = sss_parse_name_for_domains(tmpctx, domain_list,
91ba5d95b2472cb075646b6120a559dc6581a867Christian Maeder "Invalid name in filterUsers list: [%s] (%d)\n",
91ba5d95b2472cb075646b6120a559dc6581a867Christian Maeder "Failed to store permanent user filter for [%s]"
dff1de7ad15d1582e25d636c3724dd202874897fChristian Maeder for (dom = domain_list; dom; dom = get_next_domain(dom, false)) {
be43c3fa0292555bd126784ae27ff5c1d23438cbChristian Maeder ret = sss_ncache_set_user(ncache, true, dom, name);
be43c3fa0292555bd126784ae27ff5c1d23438cbChristian Maeder "Failed to store permanent user filter for"
d81905a5b924415c524d702df26204683c82c12eChristian Maeder " [%s:%s] (%d [%s])\n",
9f4902edfa3d477e42343e0ec357a2f93b1119d1Christian Maeder for (dom = domain_list; dom; dom = get_next_domain(dom, false)) {
9f4902edfa3d477e42343e0ec357a2f93b1119d1Christian Maeder conf_path = talloc_asprintf(tmpctx, CONFDB_DOMAIN_PATH_TMPL, dom->name);
f03420e44d8204b2945edaab5c70a84e7c381892Christian Maeder ret = confdb_get_string_as_list(cdb, tmpctx, conf_path,
353187efd08a2cb65226f414f192b59d312f27acChristian Maeder for (i = 0; (filter_list && filter_list[i]); i++) {
8c8545dd3bf34fbcbc16904b65d249658f8f9efcChristian Maeder ret = sss_parse_name(tmpctx, dom->names, filter_list[i],
9ee80c455784287a8b5e1b6bac1f8efa6a2f4bb3cmaeder "Invalid name in filterGroups list: [%s] (%d)\n",
4a2f7efdf67dfcda0946f1b6373f41976ddea7a4Christian Maeder if (domainname && strcmp(domainname, dom->name)) {
3490b73f69b58ab742417b0867d0e2d4a7778cc0Christian Maeder "Mismatch betwen domain name (%s) and name "
7968d3a131e5a684ec1ff0c6d88aae638549153dChristian Maeder "set in FQN (%s), skipping group %s\n",
1f2c732265a1292f0d7c51a4a7ca6be5dd370df6cmaeder ret = sss_ncache_set_group(ncache, true, dom, name);
8d780c893d6df5dab3dcc7d8444b7517f6547f11Christian Maeder "Failed to store permanent group filter for [%s]"
dff1de7ad15d1582e25d636c3724dd202874897fChristian Maeder ret = confdb_get_string_as_list(cdb, tmpctx, CONFDB_NSS_CONF_ENTRY,
be43c3fa0292555bd126784ae27ff5c1d23438cbChristian Maeder filter_list = talloc_array(tmpctx, char *, 2);
dff1de7ad15d1582e25d636c3724dd202874897fChristian Maeder filter_list[0] = talloc_strdup(tmpctx, "root");
0a26144c20fa9cdcd05011ca5019cbac8e4afae0cmaeder ret = sss_parse_name_for_domains(tmpctx, domain_list,
d1c667fd9445963d9d31e2cf5d0ead15e77082a4cmaeder "Invalid name in filterGroups list: [%s] (%d)\n",
a3a7d8b3cdf05c8040c62dbcf9a15dc5042cd721Christian Maeder dom = responder_get_domain(rctx, domainname);
96ae1a1d2197d0e0d5b80da2474b64c456feb1b0Christian Maeder ret = sss_ncache_set_group(ncache, true, dom, name);
a3a7d8b3cdf05c8040c62dbcf9a15dc5042cd721Christian Maeder "Failed to store permanent group filter for"
fefee7e1dee1ee5f0768a03a4abae88d1ca2c3fdRazvan Pascanu for (dom = domain_list; dom; dom = get_next_domain(dom, false)) {
fefee7e1dee1ee5f0768a03a4abae88d1ca2c3fdRazvan Pascanu ret = sss_ncache_set_group(ncache, true, dom, name);
16b71dad8d398af412d66a4f4763f1ada5b03d23Christian Maeder "Failed to store permanent group filter for"
fefee7e1dee1ee5f0768a03a4abae88d1ca2c3fdRazvan Pascanu " [%s:%s] (%d [%s])\n",