]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
mdssvc: implement elasticsearch:default_fields
authorRalph Boehme <slow@samba.org>
Mon, 1 Sep 2025 12:55:04 +0000 (14:55 +0200)
committerVolker Lendecke <vl@samba.org>
Fri, 10 Oct 2025 10:40:30 +0000 (10:40 +0000)
BUG: https://bugzilla.samba.org/show_bug.cgi?id=15927

Signed-off-by: Ralph Boehme <slow@samba.org>
Reviewed-by: Volker Lendecke <vl@samba.org>
docs-xml/smbdotconf/misc/elasticsearchdefaultfields.xml [new file with mode: 0644]
python/samba/tests/blackbox/mdsearch.py
python/samba/tests/dcerpc/mdssvc.py
source3/rpc_server/mdssvc/mdssvc_es.c
source3/rpc_server/mdssvc/mdssvc_es.h

diff --git a/docs-xml/smbdotconf/misc/elasticsearchdefaultfields.xml b/docs-xml/smbdotconf/misc/elasticsearchdefaultfields.xml
new file mode 100644 (file)
index 0000000..9230e92
--- /dev/null
@@ -0,0 +1,19 @@
+<samba:parameter name="elasticsearch:default_fields"
+                 context="G"
+                 type="string"
+                 xmlns:samba="http://www.samba.org/samba/DTD/samba-doc">
+  <description>
+    <para>
+      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.
+    </para>
+    <para>
+      This option expects a list of Elasticsearch attributes separated by
+      comma where each attributes must be enclosed in double quotes.
+    </para>
+  </description>
+
+  <value type="default">"file.filename", "content"</value>
+  <value type="example">"foo", "bar"</value>
+</samba:parameter>
index 7709ae6b032f9e6ecfb0644785da773ed6140bfc..a2e6eb09029d3670aa54adc9713743a8a3e9cb63 100644 (file)
@@ -113,7 +113,8 @@ class MdfindBlackboxTests(BlackboxTestCase):
               "must": [
                 {
                   "query_string": {
-                    "query": "samba*"
+                    "query": "samba*",
+                    "fields": ["file.filename", "content"]
                   }
                 }
               ]
index a6e69f15474c10b9b2e4eea0deb2a149817df34e..40005ff182449160a53df3b02a2b0ffdb9c805d7 100644 (file)
@@ -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"]
                   }
                 }
               ]
index 83550bcdc23507867d2bbff13ac8567edad37b43..eb19d5fdc4a10108f855dfaecb5c1ae2137526c3 100644 (file)
@@ -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);
        }
index 19797fa24f34f58627487fba084d797d1773dbc2..154b0b4667a634b6edd18228113601114354e524 100644 (file)
@@ -30,6 +30,7 @@ struct mdssvc_es_ctx {
        struct mdssvc_ctx *mdssvc_ctx;
        struct cli_credentials *creds;
        json_t *mappings;
+       const char *default_fields;
 };
 
 /*