/* * Copyright © 2017 Red Hat, Inc * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . * * Authors: * Christian J. Kellner */ #include "config.h" #include "bolt-device.h" #include "bolt-enums.h" #include "bolt-error.h" #include "bolt-names.h" #include struct _BoltDevice { BoltProxy parent; }; enum { PROP_0, /* D-Bus Props */ PROP_UID, PROP_NAME, PROP_VENDOR, PROP_TYPE, PROP_STATUS, PROP_AUTHFLAGS, PROP_PARENT, PROP_SYSPATH, PROP_CONNTIME, PROP_AUTHTIME, PROP_STORED, PROP_POLICY, PROP_KEY, PROP_STORETIME, PROP_LABEL, PROP_LAST }; static GParamSpec *props[PROP_LAST] = {NULL, }; G_DEFINE_TYPE (BoltDevice, bolt_device, BOLT_TYPE_PROXY); static void bolt_device_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) { if (bolt_proxy_get_dbus_property (object, pspec, value)) return; } static void bolt_device_class_init (BoltDeviceClass *klass) { GObjectClass *gobject_class = G_OBJECT_CLASS (klass); gobject_class->get_property = bolt_device_get_property; props[PROP_UID] = g_param_spec_string ("uid", "Uid", NULL, "unknown", G_PARAM_READABLE | G_PARAM_STATIC_NICK); props[PROP_NAME] = g_param_spec_string ("name", "Name", NULL, "unknown", G_PARAM_READABLE | G_PARAM_STATIC_NICK); props[PROP_VENDOR] = g_param_spec_string ("vendor", "Vendor", NULL, "unknown", G_PARAM_READABLE | G_PARAM_STATIC_NICK); props[PROP_TYPE] = g_param_spec_enum ("type", "Type", NULL, BOLT_TYPE_DEVICE_TYPE, BOLT_DEVICE_PERIPHERAL, G_PARAM_READABLE | G_PARAM_STATIC_NICK); props[PROP_STATUS] = g_param_spec_enum ("status", "Status", NULL, BOLT_TYPE_STATUS, BOLT_STATUS_DISCONNECTED, G_PARAM_READABLE | G_PARAM_STATIC_NICK); props[PROP_AUTHFLAGS] = g_param_spec_flags ("authflags", "AuthFlags", NULL, BOLT_TYPE_AUTH_FLAGS, BOLT_AUTH_NONE, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS); props[PROP_PARENT] = g_param_spec_string ("parent", "Parent", NULL, "unknown", G_PARAM_READABLE | G_PARAM_STATIC_NICK); props[PROP_SYSPATH] = g_param_spec_string ("syspath", "SysfsPath", NULL, "unknown", G_PARAM_READABLE | G_PARAM_STATIC_NICK); props[PROP_CONNTIME] = g_param_spec_uint64 ("conntime", "ConnectTime", NULL, 0, G_MAXUINT64, 0, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS); props[PROP_AUTHTIME] = g_param_spec_uint64 ("authtime", "AuthorizeTime", NULL, 0, G_MAXUINT64, 0, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS); props[PROP_STORED] = g_param_spec_boolean ("stored", "Stored", NULL, FALSE, G_PARAM_READABLE | G_PARAM_STATIC_NICK); props[PROP_POLICY] = g_param_spec_enum ("policy", "Policy", NULL, BOLT_TYPE_POLICY, BOLT_POLICY_DEFAULT, G_PARAM_READABLE | G_PARAM_STATIC_NICK); props[PROP_KEY] = g_param_spec_enum ("key", "Key", NULL, BOLT_TYPE_KEY_STATE, BOLT_KEY_MISSING, G_PARAM_READABLE | G_PARAM_STATIC_NICK); props[PROP_STORETIME] = g_param_spec_uint64 ("storetime", "StoreTime", NULL, 0, G_MAXUINT64, 0, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS); props[PROP_LABEL] = g_param_spec_string ("label", "Label", NULL, NULL, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS); g_object_class_install_properties (gobject_class, PROP_LAST, props); } static void bolt_device_init (BoltDevice *mgr) { } /* public methods */ BoltDevice * bolt_device_new_for_object_path (GDBusConnection *bus, const char *path, GCancellable *cancel, GError **error) { BoltDevice *dev; dev = g_initable_new (BOLT_TYPE_DEVICE, cancel, error, "g-flags", G_DBUS_PROXY_FLAGS_NONE, "g-connection", bus, "g-name", BOLT_DBUS_NAME, "g-object-path", path, "g-interface-name", BOLT_DBUS_DEVICE_INTERFACE, NULL); return dev; } gboolean bolt_device_authorize (BoltDevice *dev, BoltAuthCtrl flags, GCancellable *cancel, GError **error) { g_autoptr(GError) err = NULL; g_autofree char *fstr = NULL; g_return_val_if_fail (BOLT_IS_DEVICE (dev), FALSE); fstr = bolt_flags_to_string (BOLT_TYPE_AUTH_CTRL, flags, error); if (fstr == NULL) return FALSE; g_dbus_proxy_call_sync (G_DBUS_PROXY (dev), "Authorize", g_variant_new ("(s)", fstr), G_DBUS_CALL_FLAGS_NONE, -1, cancel, &err); if (err != NULL) return bolt_error_propagate_stripped (error, &err); return TRUE; } void bolt_device_authorize_async (BoltDevice *dev, BoltAuthCtrl flags, GCancellable *cancellable, GAsyncReadyCallback callback, gpointer user_data) { GError *err = NULL; g_autofree char *fstr = NULL; g_return_if_fail (BOLT_IS_DEVICE (dev)); fstr = bolt_flags_to_string (BOLT_TYPE_AUTH_CTRL, flags, &err); if (fstr == NULL) { g_task_report_error (dev, callback, user_data, NULL, err); return; } g_dbus_proxy_call (G_DBUS_PROXY (dev), "Authorize", g_variant_new ("(s)", fstr), G_DBUS_CALL_FLAGS_NONE, -1, cancellable, callback, user_data); } gboolean bolt_device_authorize_finish (BoltDevice *dev, GAsyncResult *res, GError **error) { g_autoptr(GError) err = NULL; g_autoptr(GVariant) val = NULL; g_return_val_if_fail (BOLT_IS_DEVICE (dev), FALSE); val = g_dbus_proxy_call_finish (G_DBUS_PROXY (dev), res, &err); if (val == NULL) { bolt_error_propagate_stripped (error, &err); return FALSE; } return TRUE; } const char * bolt_device_get_uid (BoltDevice *dev) { const char *key; const char *str; g_return_val_if_fail (BOLT_IS_DEVICE (dev), NULL); key = g_param_spec_get_name (props[PROP_UID]); str = bolt_proxy_get_property_string (BOLT_PROXY (dev), key); return str; } const char * bolt_device_get_name (BoltDevice *dev) { const char *key; const char *str; g_return_val_if_fail (BOLT_IS_DEVICE (dev), NULL); key = g_param_spec_get_name (props[PROP_NAME]); str = bolt_proxy_get_property_string (BOLT_PROXY (dev), key); return str; } const char * bolt_device_get_vendor (BoltDevice *dev) { const char *key; const char *str; g_return_val_if_fail (BOLT_IS_DEVICE (dev), NULL); key = g_param_spec_get_name (props[PROP_VENDOR]); str = bolt_proxy_get_property_string (BOLT_PROXY (dev), key); return str; } BoltDeviceType bolt_device_get_device_type (BoltDevice *dev) { const char *key; gboolean ok; gint val = BOLT_DEVICE_PERIPHERAL; g_return_val_if_fail (BOLT_IS_DEVICE (dev), val); key = g_param_spec_get_name (props[PROP_TYPE]); ok = bolt_proxy_get_property_enum (BOLT_PROXY (dev), key, &val); if (!ok) g_warning ("failed to get enum property '%s'", key); return val; } BoltStatus bolt_device_get_status (BoltDevice *dev) { const char *key; gboolean ok; gint val = BOLT_STATUS_UNKNOWN; g_return_val_if_fail (BOLT_IS_DEVICE (dev), val); key = g_param_spec_get_name (props[PROP_STATUS]); ok = bolt_proxy_get_property_enum (BOLT_PROXY (dev), key, &val); if (!ok) g_warning ("failed to get enum property '%s'", key); return val; } BoltAuthFlags bolt_device_get_authflags (BoltDevice *dev) { const char *key; gboolean ok; guint val = BOLT_AUTH_NONE; g_return_val_if_fail (BOLT_IS_DEVICE (dev), val); key = g_param_spec_get_name (props[PROP_AUTHFLAGS]); ok = bolt_proxy_get_property_flags (BOLT_PROXY (dev), key, &val); if (!ok) g_warning ("failed to get enum property '%s'", key); return val; } const char * bolt_device_get_parent (BoltDevice *dev) { const char *key; const char *str; g_return_val_if_fail (BOLT_IS_DEVICE (dev), NULL); key = g_param_spec_get_name (props[PROP_PARENT]); str = bolt_proxy_get_property_string (BOLT_PROXY (dev), key); return str; } const char * bolt_device_get_syspath (BoltDevice *dev) { const char *key; const char *str; g_return_val_if_fail (BOLT_IS_DEVICE (dev), NULL); key = g_param_spec_get_name (props[PROP_SYSPATH]); str = bolt_proxy_get_property_string (BOLT_PROXY (dev), key); return str; } guint64 bolt_device_get_conntime (BoltDevice *dev) { const char *key; guint64 val = 0; gboolean ok; g_return_val_if_fail (BOLT_IS_DEVICE (dev), val); key = g_param_spec_get_name (props[PROP_CONNTIME]); ok = bolt_proxy_get_property_uint64 (BOLT_PROXY (dev), key, &val); if (!ok) g_warning ("failed to get enum property '%s'", key); return val; } guint64 bolt_device_get_authtime (BoltDevice *dev) { const char *key; guint64 val = 0; gboolean ok; g_return_val_if_fail (BOLT_IS_DEVICE (dev), val); key = g_param_spec_get_name (props[PROP_AUTHTIME]); ok = bolt_proxy_get_property_uint64 (BOLT_PROXY (dev), key, &val); if (!ok) g_warning ("failed to get enum property '%s'", key); return val; } gboolean bolt_device_is_stored (BoltDevice *dev) { const char *key; gboolean val = FALSE; gboolean ok; g_return_val_if_fail (BOLT_IS_DEVICE (dev), val); key = g_param_spec_get_name (props[PROP_STORED]); ok = bolt_proxy_get_property_bool (BOLT_PROXY (dev), key, &val); if (!ok) g_warning ("failed to get enum property '%s'", key); return val; } BoltPolicy bolt_device_get_policy (BoltDevice *dev) { const char *key; gboolean ok; gint val = BOLT_POLICY_DEFAULT; g_return_val_if_fail (BOLT_IS_DEVICE (dev), val); key = g_param_spec_get_name (props[PROP_POLICY]); ok = bolt_proxy_get_property_enum (BOLT_PROXY (dev), key, &val); if (!ok) g_warning ("failed to get enum property '%s'", key); return val; } BoltKeyState bolt_device_get_keystate (BoltDevice *dev) { const char *key; gboolean ok; gint val = BOLT_KEY_MISSING; g_return_val_if_fail (BOLT_IS_DEVICE (dev), val); key = g_param_spec_get_name (props[PROP_KEY]); ok = bolt_proxy_get_property_enum (BOLT_PROXY (dev), key, &val); if (!ok) g_warning ("failed to get enum property '%s'", key); return val; } guint64 bolt_device_get_storetime (BoltDevice *dev) { const char *key; guint64 val = 0; gboolean ok; g_return_val_if_fail (BOLT_IS_DEVICE (dev), val); key = g_param_spec_get_name (props[PROP_STORETIME]); ok = bolt_proxy_get_property_uint64 (BOLT_PROXY (dev), key, &val); if (!ok) g_warning ("failed to get enum property '%s'", key); return val; } const char * bolt_device_get_label (BoltDevice *dev) { const char *key; const char *str; g_return_val_if_fail (BOLT_IS_DEVICE (dev), NULL); key = g_param_spec_get_name (props[PROP_LABEL]); str = bolt_proxy_get_property_string (BOLT_PROXY (dev), key); return str; } char * bolt_device_get_display_name (BoltDevice *dev) { const char *label; const char *name; const char *vendor; label = bolt_device_get_label (dev); if (label != NULL) return g_strdup (label); name = bolt_device_get_name (dev); vendor = bolt_device_get_vendor (dev); return g_strdup_printf ("%s %s", vendor, name); } guint64 bolt_device_get_timestamp (BoltDevice *dev) { BoltStatus status; guint64 timestamp = 0; status = bolt_device_get_status (dev); switch (status) { case BOLT_STATUS_AUTHORIZING: case BOLT_STATUS_AUTH_ERROR: case BOLT_STATUS_CONNECTING: case BOLT_STATUS_CONNECTED: timestamp = bolt_device_get_conntime (dev); break; case BOLT_STATUS_DISCONNECTED: /* implicit: device is stored */ timestamp = bolt_device_get_storetime (dev); break; case BOLT_STATUS_AUTHORIZED: case BOLT_STATUS_AUTHORIZED_DPONLY: case BOLT_STATUS_AUTHORIZED_NEWKEY: case BOLT_STATUS_AUTHORIZED_SECURE: timestamp = bolt_device_get_authtime (dev); break; case BOLT_STATUS_UNKNOWN: timestamp = 0; break; } return timestamp; }