From dd59bb4ff5088064c28cca2313255396f97920bf Mon Sep 17 00:00:00 2001 From: Sam Thursfield Date: Sat, 11 Aug 2018 20:42:18 +0200 Subject: Allow use of domain rules that aren't installed into /usr Currently Tracker domain rules must be installed inside Tracker's data directory (usually /usr/share/tracker). This is limiting as it means only system packages can add them. A program installed into /opt is unable to use a custom domain, for example. Since Tracker is implemented as a system of daemons, it's not particularly straight forward to work around this by setting XDG_DATA_DIRS= to point somewhere non-standard either. This patch removes this restriction in a simple way: it allows users to pass a full path to the domain rule, rather than just the base name. --- docs/reference/libtracker-sparql/private-store.xml | 4 ++++ src/libtracker-common/tracker-domain-ontology.c | 12 +++++++++++- src/tracker-store/tracker-main.vala | 2 +- 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/docs/reference/libtracker-sparql/private-store.xml b/docs/reference/libtracker-sparql/private-store.xml index 6fe587200..c598173ac 100644 --- a/docs/reference/libtracker-sparql/private-store.xml +++ b/docs/reference/libtracker-sparql/private-store.xml @@ -75,6 +75,10 @@ Miners=Miner.Files;Miner.Extract; tracker_sparql_connection_set_domain ("org.example.App"); + + It is also possible to pass a full path to the domain rule. If the first + character of the domain name is / it will be treated as a full path. + Additional precautions and recommendations diff --git a/src/libtracker-common/tracker-domain-ontology.c b/src/libtracker-common/tracker-domain-ontology.c index 65a3fda0b..f8de59ab5 100644 --- a/src/libtracker-common/tracker-domain-ontology.c +++ b/src/libtracker-common/tracker-domain-ontology.c @@ -302,7 +302,17 @@ tracker_domain_ontology_initable_init (GInitable *initable, domain_ontology = TRACKER_DOMAIN_ONTOLOGY (initable); priv = tracker_domain_ontology_get_instance_private (domain_ontology); - if (priv->name) { + if (priv->name && priv->name[0] == '/') { + if (!g_file_test (priv->name, G_FILE_TEST_IS_REGULAR)) { + inner_error = g_error_new (G_KEY_FILE_ERROR, + G_KEY_FILE_ERROR_NOT_FOUND, + "Could not find rule at '%s'", + priv->name); + goto end; + } + + path = g_strdup (priv->name); + } else if (priv->name) { path = find_rule_in_data_dirs (priv->name); if (!path) { diff --git a/src/tracker-store/tracker-main.vala b/src/tracker-store/tracker-main.vala index 935ebc8d1..5ad40892b 100644 --- a/src/tracker-store/tracker-main.vala +++ b/src/tracker-store/tracker-main.vala @@ -320,7 +320,7 @@ License which can be viewed at: main_loop = new MainLoop (); if (domain_ontology != null) - Tracker.DBus.watch_domain (domain_ontology, main_loop); + Tracker.DBus.watch_domain (domain_ontology_config.get_domain(), main_loop); initialize_signal_handler (); -- cgit v1.2.1