dovecot-1.2: fts-solr: Use '!' as escape character in usernames....
dovecot at dovecot.org
dovecot at dovecot.org
Sun Nov 30 01:27:25 EET 2008
details: http://hg.dovecot.org/dovecot-1.2/rev/149c6ccc3df4
changeset: 8493:149c6ccc3df4
user: Timo Sirainen <tss at iki.fi>
date: Sat Nov 29 19:24:59 2008 +0200
description:
fts-solr: Use '!' as escape character in usernames. Escape '/' and '!'.
diffstat:
1 file changed, 60 insertions(+), 15 deletions(-)
src/plugins/fts-solr/fts-backend-solr.c | 75 ++++++++++++++++++++++++-------
diffs (130 lines):
diff -r ee1ecdda8a6b -r 149c6ccc3df4 src/plugins/fts-solr/fts-backend-solr.c
--- a/src/plugins/fts-solr/fts-backend-solr.c Sat Nov 29 19:03:04 2008 +0200
+++ b/src/plugins/fts-solr/fts-backend-solr.c Sat Nov 29 19:24:59 2008 +0200
@@ -13,6 +13,11 @@
#define SOLR_CMDBUF_SIZE (1024*64)
#define SOLR_MAX_ROWS 100000
+struct solr_fts_backend {
+ struct fts_backend backend;
+ char *id_username;
+};
+
struct solr_fts_backend_build_context {
struct fts_backend_build_context ctx;
@@ -57,26 +62,67 @@ static void xml_encode(string_t *dest, c
xml_encode_data(dest, (const unsigned char *)str, strlen(str));
}
+static const char *solr_escape_id_str(const char *str)
+{
+ string_t *tmp;
+ const char *p;
+
+ for (p = str; *p != '\0'; p++) {
+ if (*p == '/' || *p == '!')
+ break;
+ }
+ if (*p == '\0')
+ return str;
+
+ tmp = t_str_new(64);
+ for (p = str; *p != '\0'; p++) {
+ switch (*p) {
+ case '/':
+ str_append(tmp, "!\\");
+ break;
+ case '!':
+ str_append(tmp, "!!");
+ break;
+ default:
+ str_append_c(tmp, *p);
+ break;
+ }
+ }
+ return str_c(tmp);
+}
+
static struct fts_backend *
-fts_backend_solr_init(struct mailbox *box ATTR_UNUSED)
+fts_backend_solr_init(struct mailbox *box)
{
const struct fts_solr_settings *set = &fts_solr_settings;
- struct fts_backend *backend;
+ struct solr_fts_backend *backend;
+ const char *username = box->storage->ns->user->username;
if (solr_conn == NULL)
solr_conn = solr_connection_init(set->url, set->debug);
- backend = i_new(struct fts_backend, 1);
- *backend = fts_backend_solr;
+ backend = i_new(struct solr_fts_backend, 1);
+ backend->id_username = i_strdup(solr_escape_id_str(username));
+ backend->backend = fts_backend_solr;
if (set->substring_search)
- backend->flags |= FTS_BACKEND_FLAG_SUBSTRING_LOOKUPS;
- return backend;
-}
-
-static void fts_backend_solr_deinit(struct fts_backend *backend)
-{
+ backend->backend.flags |= FTS_BACKEND_FLAG_SUBSTRING_LOOKUPS;
+ return &backend->backend;
+}
+
+static void fts_backend_solr_deinit(struct fts_backend *_backend)
+{
+ struct solr_fts_backend *backend = (struct solr_fts_backend *)_backend;
+
+ i_free(backend->id_username);
i_free(backend);
+}
+
+static const char *fts_backend_solr_username(struct fts_backend *_backend)
+{
+ struct solr_fts_backend *backend = (struct solr_fts_backend *)_backend;
+
+ return backend->id_username;
}
static int fts_backend_solr_get_last_uid_fallback(struct fts_backend *backend,
@@ -214,7 +260,7 @@ fts_backend_solr_build_more(struct fts_b
fts_backend_solr_add_doc_prefix(ctx, uid);
str_printfa(cmd, "<field name=\"id\">%u/%u/",
uid, ctx->uid_validity);
- xml_encode(cmd, box->storage->ns->user->username);
+ xml_encode(cmd, fts_backend_solr_username(ctx->ctx.backend));
str_append_c(cmd, '/');
xml_encode(cmd, box->name);
str_append(cmd, "</field>");
@@ -259,7 +305,7 @@ fts_backed_solr_build_commit(struct solr
fts_backend_solr_add_doc_prefix(ctx, ctx->prev_uid);
str_printfa(ctx->cmd, "<field name=\"last_uid\">TRUE</field>"
"<field name=\"id\">L/%u/", ctx->uid_validity);
- xml_encode(ctx->cmd, box->storage->ns->user->username);
+ xml_encode(ctx->cmd, fts_backend_solr_username(ctx->ctx.backend));
str_append_c(ctx->cmd, '/');
xml_encode(ctx->cmd, box->name);
str_append(ctx->cmd, "</field></doc></add>");
@@ -289,8 +335,7 @@ fts_backend_solr_build_deinit(struct fts
}
static void
-fts_backend_solr_expunge(struct fts_backend *backend ATTR_UNUSED,
- struct mail *mail)
+fts_backend_solr_expunge(struct fts_backend *backend, struct mail *mail)
{
struct mailbox_status status;
@@ -302,7 +347,7 @@ fts_backend_solr_expunge(struct fts_back
cmd = t_str_new(256);
str_printfa(cmd, "<delete><id>%u/%u/",
mail->uid, status.uidvalidity);
- xml_encode(cmd, mail->box->storage->ns->user->username);
+ xml_encode(cmd, fts_backend_solr_username(backend));
str_append_c(cmd, '/');
xml_encode(cmd, mail->box->name);
str_append(cmd, "</id></delete>");
More information about the dovecot-cvs
mailing list