diff options
-rw-r--r-- | NEWS | 4 | ||||
-rw-r--r-- | src/mm-filter.c | 37 | ||||
-rw-r--r-- | src/mm-filter.h | 2 | ||||
-rw-r--r-- | src/mm-plugin-manager.c | 18 | ||||
-rw-r--r-- | src/mm-plugin.c | 6 | ||||
-rw-r--r-- | src/mm-plugin.h | 1 |
6 files changed, 67 insertions, 1 deletions
@@ -44,6 +44,10 @@ The most important features and changes in this release are the following: port probing mechanism uses its own heuristics to guess whether a given TTY is owned by a modem or not. + * Added a new implicit whitelist rules applicable in 'STRICT' filter mode, so + that all devices with a USB vid matching one of the vids allowed by the + different installed plugins are implicitly allowed. + * Updated daemon logging so that we always prefix the messages with a string identifying which modem the log refers to, making it easy to grep logs for one specific device if the system has more than one. diff --git a/src/mm-filter.c b/src/mm-filter.c index cfa620b4..18ea08f6 100644 --- a/src/mm-filter.c +++ b/src/mm-filter.c @@ -39,6 +39,7 @@ enum { struct _MMFilterPrivate { MMFilterRule enabled_rules; GList *plugin_whitelist_tags; + GArray *plugin_whitelist_vendor_ids; GArray *plugin_whitelist_product_ids; }; @@ -55,6 +56,27 @@ mm_filter_register_plugin_whitelist_tag (MMFilter *self, } void +mm_filter_register_plugin_whitelist_vendor_id (MMFilter *self, + guint16 vid) +{ + guint i; + + if (!self->priv->plugin_whitelist_vendor_ids) + self->priv->plugin_whitelist_vendor_ids = g_array_sized_new (FALSE, FALSE, sizeof (guint16), 64); + + for (i = 0; i < self->priv->plugin_whitelist_vendor_ids->len; i++) { + guint16 item; + + item = g_array_index (self->priv->plugin_whitelist_vendor_ids, guint16, i); + if (item == vid) + return; + } + + g_array_append_val (self->priv->plugin_whitelist_vendor_ids, vid); + mm_obj_dbg (self, "registered plugin whitelist vendor id: %04x", vid); +} + +void mm_filter_register_plugin_whitelist_product_id (MMFilter *self, guint16 vid, guint16 pid) @@ -140,6 +162,20 @@ mm_filter_port (MMFilter *self, } } } + + if (vid && self->priv->plugin_whitelist_vendor_ids) { + guint i; + + for (i = 0; i < self->priv->plugin_whitelist_vendor_ids->len; i++) { + guint16 item; + + item = g_array_index (self->priv->plugin_whitelist_vendor_ids, guint16, i); + if (item == vid) { + mm_obj_dbg (self, "(%s/%s) port allowed: device is whitelisted by plugin (vid)", subsystem, name); + return TRUE; + } + } + } } /* If this is a virtual device, don't allow it */ @@ -483,6 +519,7 @@ finalize (GObject *object) { MMFilter *self = MM_FILTER (object); + g_clear_pointer (&self->priv->plugin_whitelist_vendor_ids, g_array_unref); g_clear_pointer (&self->priv->plugin_whitelist_product_ids, g_array_unref); g_list_free_full (self->priv->plugin_whitelist_tags, g_free); diff --git a/src/mm-filter.h b/src/mm-filter.h index b567edb1..c3579979 100644 --- a/src/mm-filter.h +++ b/src/mm-filter.h @@ -145,6 +145,8 @@ gboolean mm_filter_device_and_port (MMFilter *self, void mm_filter_register_plugin_whitelist_tag (MMFilter *self, const gchar *tag); +void mm_filter_register_plugin_whitelist_vendor_id (MMFilter *self, + guint16 vid); void mm_filter_register_plugin_whitelist_product_id (MMFilter *self, guint16 vid, guint16 pid); diff --git a/src/mm-plugin-manager.c b/src/mm-plugin-manager.c index 9ee4edae..e76c9a82 100644 --- a/src/mm-plugin-manager.c +++ b/src/mm-plugin-manager.c @@ -1617,6 +1617,21 @@ register_plugin_whitelist_tags (MMPluginManager *self, } static void +register_plugin_whitelist_vendor_ids (MMPluginManager *self, + MMPlugin *plugin) +{ + const guint16 *vendor_ids; + guint i; + + if (!mm_filter_check_rule_enabled (self->priv->filter, MM_FILTER_RULE_PLUGIN_WHITELIST)) + return; + + vendor_ids = mm_plugin_get_allowed_vendor_ids (plugin); + for (i = 0; vendor_ids && vendor_ids[i]; i++) + mm_filter_register_plugin_whitelist_vendor_id (self->priv->filter, vendor_ids[i]); +} + +static void register_plugin_whitelist_product_ids (MMPluginManager *self, MMPlugin *plugin) { @@ -1812,7 +1827,8 @@ load_plugins (MMPluginManager *self, self->priv->plugins = g_list_append (self->priv->plugins, plugin); /* Register plugin whitelist rules in filter, if any */ - register_plugin_whitelist_tags (self, plugin); + register_plugin_whitelist_tags (self, plugin); + register_plugin_whitelist_vendor_ids (self, plugin); register_plugin_whitelist_product_ids (self, plugin); } diff --git a/src/mm-plugin.c b/src/mm-plugin.c index 4f3ec18d..adfe4bf2 100644 --- a/src/mm-plugin.c +++ b/src/mm-plugin.c @@ -152,6 +152,12 @@ mm_plugin_get_allowed_udev_tags (MMPlugin *self) return (const gchar **) self->priv->udev_tags; } +const guint16 * +mm_plugin_get_allowed_vendor_ids (MMPlugin *self) +{ + return self->priv->vendor_ids; +} + const mm_uint16_pair * mm_plugin_get_allowed_product_ids (MMPlugin *self) { diff --git a/src/mm-plugin.h b/src/mm-plugin.h index fe0469c1..f5863522 100644 --- a/src/mm-plugin.h +++ b/src/mm-plugin.h @@ -126,6 +126,7 @@ GType mm_plugin_get_type (void); const gchar *mm_plugin_get_name (MMPlugin *self); const gchar **mm_plugin_get_allowed_udev_tags (MMPlugin *self); +const guint16 *mm_plugin_get_allowed_vendor_ids (MMPlugin *self); const mm_uint16_pair *mm_plugin_get_allowed_product_ids (MMPlugin *self); gboolean mm_plugin_is_generic (MMPlugin *self); |