From: Ralph Boehme Date: Mon, 1 Sep 2025 12:55:04 +0000 (+0200) Subject: mdssvc: implement elasticsearch:default_fields X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=2b5cbb955ab2cf278272aa8457a672aa27ff1020;p=thirdparty%2Fsamba.git mdssvc: implement elasticsearch:default_fields BUG: https://bugzilla.samba.org/show_bug.cgi?id=15927 Signed-off-by: Ralph Boehme Reviewed-by: Volker Lendecke --- diff --git a/docs-xml/smbdotconf/misc/elasticsearchdefaultfields.xml b/docs-xml/smbdotconf/misc/elasticsearchdefaultfields.xml new file mode 100644 index 00000000000..9230e9280b7 --- /dev/null +++ b/docs-xml/smbdotconf/misc/elasticsearchdefaultfields.xml @@ -0,0 +1,19 @@ + + + + Default attributes in Elasticsearch to query when receiving a Spotlight + query that searches in the special attribute "*". This is the default used + by macOS clients when searching from the Finder. + + + This option expects a list of Elasticsearch attributes separated by + comma where each attributes must be enclosed in double quotes. + + + + "file.filename", "content" + "foo", "bar" + diff --git a/python/samba/tests/blackbox/mdsearch.py b/python/samba/tests/blackbox/mdsearch.py index 7709ae6b032..a2e6eb09029 100644 --- a/python/samba/tests/blackbox/mdsearch.py +++ b/python/samba/tests/blackbox/mdsearch.py @@ -113,7 +113,8 @@ class MdfindBlackboxTests(BlackboxTestCase): "must": [ { "query_string": { - "query": "samba*" + "query": "samba*", + "fields": ["file.filename", "content"] } } ] diff --git a/python/samba/tests/dcerpc/mdssvc.py b/python/samba/tests/dcerpc/mdssvc.py index a6e69f15474..40005ff1824 100644 --- a/python/samba/tests/dcerpc/mdssvc.py +++ b/python/samba/tests/dcerpc/mdssvc.py @@ -144,7 +144,8 @@ class MdssvcTests(RpcInterfaceTestCase): "must": [ { "query_string": { - "query": "samba*" + "query": "samba*", + "fields": ["file.filename", "content"] } } ] @@ -189,7 +190,8 @@ class MdssvcTests(RpcInterfaceTestCase): "must": [ { "query_string": { - "query": "file.filename:x\\+x OR file.filename:x\\*x OR file.filename:x=x OR file.filename:x'x OR file.filename:x\\?x OR file.filename:x\\ x OR file.filename:x\\(x OR file.filename:x\\\"x OR file.filename:x\\\\x" + "query": "file.filename:x\\+x OR file.filename:x\\*x OR file.filename:x=x OR file.filename:x'x OR file.filename:x\\?x OR file.filename:x\\ x OR file.filename:x\\(x OR file.filename:x\\\"x OR file.filename:x\\\\x", + "fields": ["file.filename", "content"] } } ] @@ -244,7 +246,8 @@ class MdssvcTests(RpcInterfaceTestCase): "must": [ { "query_string": { - "query": "*samba*" + "query": "*samba*", + "fields": ["file.filename", "content"] } } ] diff --git a/source3/rpc_server/mdssvc/mdssvc_es.c b/source3/rpc_server/mdssvc/mdssvc_es.c index 83550bcdc23..eb19d5fdc4a 100644 --- a/source3/rpc_server/mdssvc/mdssvc_es.c +++ b/source3/rpc_server/mdssvc/mdssvc_es.c @@ -50,7 +50,8 @@ " } ],\n" \ " \"must\": [ {\n" \ " \"query_string\": {\n" \ - " \"query\": \"%s\"\n" \ + " \"query\": \"%s\",\n" \ + " \"fields\": [%s]\n" \ " }\n" \ " } ]\n" \ " }\n" \ @@ -66,6 +67,7 @@ static bool mdssvc_es_init(struct mdssvc_ctx *mdssvc_ctx) json_error_t json_error; char *default_path = NULL; const char *path = NULL; + const char *default_fields = "\"file.filename\", \"content\""; mdssvc_es_ctx = talloc_zero(mdssvc_ctx, struct mdssvc_es_ctx); if (mdssvc_es_ctx == NULL) { @@ -106,6 +108,15 @@ static bool mdssvc_es_init(struct mdssvc_ctx *mdssvc_ctx) } TALLOC_FREE(default_path); + mdssvc_es_ctx->default_fields = lp_parm_const_string(GLOBAL_SECTION_SNUM, + "elasticsearch", + "default_fields", + default_fields); + if (mdssvc_es_ctx->default_fields == NULL) { + TALLOC_FREE(mdssvc_es_ctx); + return false; + } + mdssvc_ctx->backend_private = mdssvc_es_ctx; return true; } @@ -624,13 +635,15 @@ static struct tevent_req *mds_es_search_send(TALLOC_CTX *mem_ctx, return tevent_req_post(req, ev); } - elastic_query = talloc_asprintf(state, - MDSSVC_ELASTIC_QUERY_TEMPLATE, - s->from, - s->size, - MDSSVC_ELASTIC_SOURCES, - s->slq->path_scope, - s->es_query); + elastic_query = talloc_asprintf( + state, + MDSSVC_ELASTIC_QUERY_TEMPLATE, + s->from, + s->size, + MDSSVC_ELASTIC_SOURCES, + s->slq->path_scope, + s->es_query, + s->mds_es_ctx->mdssvc_es_ctx->default_fields); if (tevent_req_nomem(elastic_query, req)) { return tevent_req_post(req, ev); } diff --git a/source3/rpc_server/mdssvc/mdssvc_es.h b/source3/rpc_server/mdssvc/mdssvc_es.h index 19797fa24f3..154b0b4667a 100644 --- a/source3/rpc_server/mdssvc/mdssvc_es.h +++ b/source3/rpc_server/mdssvc/mdssvc_es.h @@ -30,6 +30,7 @@ struct mdssvc_es_ctx { struct mdssvc_ctx *mdssvc_ctx; struct cli_credentials *creds; json_t *mappings; + const char *default_fields; }; /*