aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/mm-filter.c37
-rw-r--r--src/mm-filter.h2
-rw-r--r--src/mm-plugin-manager.c18
-rw-r--r--src/mm-plugin.c6
-rw-r--r--src/mm-plugin.h1
5 files changed, 63 insertions, 1 deletions
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);