From 9840ab01f1b609fe2f9674b4a491cf4c452b6273 Mon Sep 17 00:00:00 2001 From: Sam Thursfield Date: Sat, 11 Aug 2018 20:35:04 +0200 Subject: tracker_domain_ontology_get_domain() should return only the domain name We should be consistent about what the name of a Tracker domain actually is. In the domain rule we specify Domain=org.freedesktop (for the default rule) or Domain=org.example.App (for a custom domain). But internally tracker_domain_ontology_get_domain() would return org.freedesktop.Tracker1 or org.example.App.Tracker1, i.e. the domain name now has '.Tracker1' appended. This does make sense in most cases, but it means there's no way to get the actual name of the domain from a TrackerDomainOntology object. This commit changes the existing function to not append '.Tracker1' in the value it returns, which means that function can now be used to get the base name of the domain. The assumption is that callers are normally appending stuff to this base name anyway so it's not much extra effect to also append the '.Tracker1' component if needed. libtracker-common is internal to Tracker so this doesn't constitute a public API break. --- src/libtracker-common/tracker-domain-ontology.c | 4 ++-- src/libtracker-control/tracker-miner-manager.c | 10 +++++++--- src/libtracker-sparql-backend/tracker-backend.vala | 4 ++-- src/libtracker-sparql/tracker-notifier.c | 2 +- src/tracker-store/tracker-main.vala | 4 ++-- 5 files changed, 14 insertions(+), 10 deletions(-) diff --git a/src/libtracker-common/tracker-domain-ontology.c b/src/libtracker-common/tracker-domain-ontology.c index 7fc55f8c9..65a3fda0b 100644 --- a/src/libtracker-common/tracker-domain-ontology.c +++ b/src/libtracker-common/tracker-domain-ontology.c @@ -459,9 +459,9 @@ tracker_domain_ontology_get_domain (TrackerDomainOntology *domain_ontology, priv = tracker_domain_ontology_get_instance_private (domain_ontology); if (suffix) - return g_strconcat (priv->domain, ".Tracker1.", suffix, NULL); + return g_strconcat (priv->domain, ".", suffix, NULL); else - return g_strconcat (priv->domain, ".Tracker1", NULL); + return g_strconcat (priv->domain, NULL); } gboolean diff --git a/src/libtracker-control/tracker-miner-manager.c b/src/libtracker-control/tracker-miner-manager.c index 59e222fdf..84bb15442 100644 --- a/src/libtracker-control/tracker-miner-manager.c +++ b/src/libtracker-control/tracker-miner-manager.c @@ -696,7 +696,7 @@ tracker_miner_manager_get_running (TrackerMinerManager *manager) return NULL; } - prefix = tracker_domain_ontology_get_domain (priv->domain_ontology, "Miner"); + prefix = tracker_domain_ontology_get_domain (priv->domain_ontology, "Tracker1.Miner"); g_variant_get (v, "(as)", &iter); while (g_variant_iter_loop (iter, "&s", &str)) { @@ -723,7 +723,7 @@ check_file (GFile *file, TrackerMinerManager *manager; TrackerMinerManagerPrivate *priv; GKeyFile *key_file; - gchar *path, *dbus_path, *display_name, *name_suffix, *description; + gchar *path, *dbus_path, *display_name, *name_suffix, *full_name_suffix, *description; GError *error = NULL; MinerData *data; @@ -768,8 +768,12 @@ check_file (GFile *file, data = g_slice_new0 (MinerData); data->dbus_path = dbus_path; data->name_suffix = name_suffix; + + full_name_suffix = g_strconcat ("Tracker1.", name_suffix, NULL); data->dbus_name = tracker_domain_ontology_get_domain (priv->domain_ontology, - name_suffix); + full_name_suffix); + g_free (full_name_suffix); + data->display_name = display_name; data->description = description; /* In .desktop file as _comment */ diff --git a/src/libtracker-sparql-backend/tracker-backend.vala b/src/libtracker-sparql-backend/tracker-backend.vala index cc6d23c43..e46725ff5 100644 --- a/src/libtracker-sparql-backend/tracker-backend.vala +++ b/src/libtracker-sparql-backend/tracker-backend.vala @@ -192,7 +192,7 @@ class Tracker.Sparql.Backend : Connection { switch (backend) { case Backend.AUTO: - bus = new Tracker.Bus.Connection (domain_ontology.get_domain ()); + bus = new Tracker.Bus.Connection (domain_ontology.get_domain ("Tracker1")); try { direct = create_readonly_direct (); @@ -207,7 +207,7 @@ class Tracker.Sparql.Backend : Connection { break; case Backend.BUS: - bus = new Tracker.Bus.Connection (domain_ontology.get_domain ()); + bus = new Tracker.Bus.Connection (domain_ontology.get_domain ("Tracker1")); break; default: diff --git a/src/libtracker-sparql/tracker-notifier.c b/src/libtracker-sparql/tracker-notifier.c index 72b29da65..d0cf748b3 100644 --- a/src/libtracker-sparql/tracker-notifier.c +++ b/src/libtracker-sparql/tracker-notifier.c @@ -713,7 +713,7 @@ tracker_notifier_initable_init (GInitable *initable, if (!domain_ontology) return FALSE; - dbus_name = tracker_domain_ontology_get_domain (domain_ontology, NULL); + dbus_name = tracker_domain_ontology_get_domain (domain_ontology, "Tracker1"); priv->has_arg0_filter = priv->expanded_classes && g_strv_length (priv->expanded_classes) == 1; diff --git a/src/tracker-store/tracker-main.vala b/src/tracker-store/tracker-main.vala index 861aed2eb..935ebc8d1 100644 --- a/src/tracker-store/tracker-main.vala +++ b/src/tracker-store/tracker-main.vala @@ -240,7 +240,7 @@ License which can be viewed at: cache_location = domain_ontology_config.get_cache (); data_location = domain_ontology_config.get_journal (); ontology_location = domain_ontology_config.get_ontology (); - domain = domain_ontology_config.get_domain (); + domain = domain_ontology_config.get_domain ("Tracker1"); sanity_check_option_values (config); @@ -319,7 +319,7 @@ License which can be viewed at: if (!shutdown) { main_loop = new MainLoop (); - if (domain != null) + if (domain_ontology != null) Tracker.DBus.watch_domain (domain_ontology, main_loop); initialize_signal_handler (); -- cgit v1.2.1 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 From bb726349e3ec9ab041cfd70d8b6190b0906f7df5 Mon Sep 17 00:00:00 2001 From: Sam Thursfield Date: Sun, 12 Aug 2018 00:07:11 +0200 Subject: libtracker-sparql: Don't use 'namespace' as a parameter name This header was unusable from C++ code as 'namespace' is a reserved keyword there. Based on a patch by Santtu Lakkala from https://bugzilla.gnome.org/show_bug.cgi?id=791510 --- src/libtracker-sparql/tracker-namespace-manager.c | 14 +++++++------- src/libtracker-sparql/tracker-namespace-manager.h | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/libtracker-sparql/tracker-namespace-manager.c b/src/libtracker-sparql/tracker-namespace-manager.c index 5ce4cfa4d..e24f68749 100644 --- a/src/libtracker-sparql/tracker-namespace-manager.c +++ b/src/libtracker-sparql/tracker-namespace-manager.c @@ -211,7 +211,7 @@ tracker_namespace_manager_lookup_prefix (TrackerNamespaceManager *self, * tracker_namespace_manager_add_prefix: * @self: a #TrackerNamespaceManager * @prefix: a short, unique prefix to identify @namespace - * @namespace: the URL of the given namespace + * @ns: the URL of the given namespace * * Adds @prefix as the recognised abbreviaton of @namespace. * @@ -223,14 +223,14 @@ tracker_namespace_manager_lookup_prefix (TrackerNamespaceManager *self, void tracker_namespace_manager_add_prefix (TrackerNamespaceManager *self, const char *prefix, - const char *namespace) + const char *ns) { TrackerNamespaceManagerPrivate *priv; const char *str; g_return_if_fail (TRACKER_IS_NAMESPACE_MANAGER (self)); g_return_if_fail (prefix != NULL); - g_return_if_fail (namespace != NULL); + g_return_if_fail (ns != NULL); priv = GET_PRIVATE (TRACKER_NAMESPACE_MANAGER (self)); @@ -245,14 +245,14 @@ tracker_namespace_manager_add_prefix (TrackerNamespaceManager *self, return; } - str = g_hash_table_lookup (priv->namespace_to_prefix, namespace); + str = g_hash_table_lookup (priv->namespace_to_prefix, ns); if (str) { - g_error ("Namespace %s already has prefix %s", namespace, str); + g_error ("Namespace %s already has prefix %s", ns, str); return; } - g_hash_table_insert (priv->prefix_to_namespace, g_strdup (prefix), g_strdup (namespace)); - g_hash_table_insert (priv->namespace_to_prefix, g_strdup (namespace), g_strdup (prefix)); + g_hash_table_insert (priv->prefix_to_namespace, g_strdup (prefix), g_strdup (ns)); + g_hash_table_insert (priv->namespace_to_prefix, g_strdup (ns), g_strdup (prefix)); } /** diff --git a/src/libtracker-sparql/tracker-namespace-manager.h b/src/libtracker-sparql/tracker-namespace-manager.h index 0f539d41a..9de4643f1 100644 --- a/src/libtracker-sparql/tracker-namespace-manager.h +++ b/src/libtracker-sparql/tracker-namespace-manager.h @@ -39,7 +39,7 @@ char *tracker_namespace_manager_expand_uri (TrackerNamespaceManager *self, const gboolean tracker_namespace_manager_has_prefix (TrackerNamespaceManager *self, const char *prefix); const char *tracker_namespace_manager_lookup_prefix (TrackerNamespaceManager *self, const char *prefix); -void tracker_namespace_manager_add_prefix (TrackerNamespaceManager *self, const char *prefix, const char *namespace); +void tracker_namespace_manager_add_prefix (TrackerNamespaceManager *self, const char *prefix, const char *ns); char *tracker_namespace_manager_print_turtle (TrackerNamespaceManager *self); -- cgit v1.2.1