mirror of
https://gitlab.gnome.org/GNOME/libsecret.git
synced 2024-12-22 12:48:51 +00:00
Validate that we have attributes when looking up
* When matching items, make sure we have attributes if no schema name was included in the match * This is particularly important because we don't want to remove all the items.
This commit is contained in:
parent
b85c8758b0
commit
c85cadce76
@ -190,10 +190,13 @@ secret_attributes_buildv (const SecretSchema *schema,
|
|||||||
|
|
||||||
gboolean
|
gboolean
|
||||||
_secret_attributes_validate (const SecretSchema *schema,
|
_secret_attributes_validate (const SecretSchema *schema,
|
||||||
GHashTable *attributes)
|
GHashTable *attributes,
|
||||||
|
const char *pretty_function,
|
||||||
|
gboolean matching)
|
||||||
{
|
{
|
||||||
const SecretSchemaAttribute *attribute;
|
const SecretSchemaAttribute *attribute;
|
||||||
GHashTableIter iter;
|
GHashTableIter iter;
|
||||||
|
gboolean any;
|
||||||
gchar *key;
|
gchar *key;
|
||||||
gchar *value;
|
gchar *value;
|
||||||
gchar *end;
|
gchar *end;
|
||||||
@ -203,6 +206,7 @@ _secret_attributes_validate (const SecretSchema *schema,
|
|||||||
|
|
||||||
g_hash_table_iter_init (&iter, attributes);
|
g_hash_table_iter_init (&iter, attributes);
|
||||||
while (g_hash_table_iter_next (&iter, (gpointer *)&key, (gpointer *)&value)) {
|
while (g_hash_table_iter_next (&iter, (gpointer *)&key, (gpointer *)&value)) {
|
||||||
|
any = TRUE;
|
||||||
|
|
||||||
/* Find the attribute */
|
/* Find the attribute */
|
||||||
attribute = NULL;
|
attribute = NULL;
|
||||||
@ -216,16 +220,16 @@ _secret_attributes_validate (const SecretSchema *schema,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (attribute == NULL) {
|
if (attribute == NULL) {
|
||||||
g_warning ("invalid %s attribute in for %s schema",
|
g_critical ("%s: invalid %s attribute in for %s schema",
|
||||||
key, schema->name);
|
pretty_function, key, schema->name);
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (attribute->type) {
|
switch (attribute->type) {
|
||||||
case SECRET_SCHEMA_ATTRIBUTE_BOOLEAN:
|
case SECRET_SCHEMA_ATTRIBUTE_BOOLEAN:
|
||||||
if (!g_str_equal (value, "true") && !g_str_equal (value, "false")) {
|
if (!g_str_equal (value, "true") && !g_str_equal (value, "false")) {
|
||||||
g_warning ("invalid %s boolean value for %s schema: %s",
|
g_critical ("%s: invalid %s boolean value for %s schema: %s",
|
||||||
key, schema->name, value);
|
pretty_function, key, schema->name, value);
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -233,25 +237,32 @@ _secret_attributes_validate (const SecretSchema *schema,
|
|||||||
end = NULL;
|
end = NULL;
|
||||||
g_ascii_strtoll (value, &end, 10);
|
g_ascii_strtoll (value, &end, 10);
|
||||||
if (!end || end[0] != '\0') {
|
if (!end || end[0] != '\0') {
|
||||||
g_warning ("invalid %s integer value for %s schema: %s",
|
g_warning ("%s: invalid %s integer value for %s schema: %s",
|
||||||
key, schema->name, value);
|
pretty_function, key, schema->name, value);
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case SECRET_SCHEMA_ATTRIBUTE_STRING:
|
case SECRET_SCHEMA_ATTRIBUTE_STRING:
|
||||||
if (!g_utf8_validate (value, -1, NULL)) {
|
if (!g_utf8_validate (value, -1, NULL)) {
|
||||||
g_warning ("invalid %s string value for %s schema: %s",
|
g_warning ("%s: invalid %s string value for %s schema: %s",
|
||||||
key, schema->name, value);
|
pretty_function, key, schema->name, value);
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
g_warning ("invalid %s value type in %s schema",
|
g_warning ("%s: invalid %s value type in %s schema",
|
||||||
key, schema->name);
|
pretty_function, key, schema->name);
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Nothing to match on, resulting search would match everything :S */
|
||||||
|
if (matching && !any && schema->flags & SECRET_SCHEMA_DONT_MATCH_NAME) {
|
||||||
|
g_warning ("%s: must specify at least one attribute to match",
|
||||||
|
pretty_function);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1414,7 +1414,7 @@ secret_collection_search (SecretCollection *self,
|
|||||||
g_return_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable));
|
g_return_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable));
|
||||||
|
|
||||||
/* Warnings raised already */
|
/* Warnings raised already */
|
||||||
if (schema != NULL && !_secret_attributes_validate (schema, attributes))
|
if (schema != NULL && !_secret_attributes_validate (schema, attributes, G_STRFUNC, TRUE))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
async = g_simple_async_result_new (G_OBJECT (self), callback, user_data,
|
async = g_simple_async_result_new (G_OBJECT (self), callback, user_data,
|
||||||
@ -1552,7 +1552,7 @@ secret_collection_search_sync (SecretCollection *self,
|
|||||||
g_return_val_if_fail (error == NULL || *error == NULL, NULL);
|
g_return_val_if_fail (error == NULL || *error == NULL, NULL);
|
||||||
|
|
||||||
/* Warnings raised already */
|
/* Warnings raised already */
|
||||||
if (schema != NULL && !_secret_attributes_validate (schema, attributes))
|
if (schema != NULL && !_secret_attributes_validate (schema, attributes, G_STRFUNC, TRUE))
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
paths = secret_collection_search_for_dbus_paths_sync (self, schema, attributes,
|
paths = secret_collection_search_for_dbus_paths_sync (self, schema, attributes,
|
||||||
|
@ -302,7 +302,7 @@ secret_service_search (SecretService *service,
|
|||||||
g_return_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable));
|
g_return_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable));
|
||||||
|
|
||||||
/* Warnings raised already */
|
/* Warnings raised already */
|
||||||
if (schema != NULL && !_secret_attributes_validate (schema, attributes))
|
if (schema != NULL && !_secret_attributes_validate (schema, attributes, G_STRFUNC, TRUE))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (schema != NULL && !(schema->flags & SECRET_SCHEMA_DONT_MATCH_NAME))
|
if (schema != NULL && !(schema->flags & SECRET_SCHEMA_DONT_MATCH_NAME))
|
||||||
@ -455,7 +455,7 @@ secret_service_search_sync (SecretService *service,
|
|||||||
g_return_val_if_fail (error == NULL || *error == NULL, NULL);
|
g_return_val_if_fail (error == NULL || *error == NULL, NULL);
|
||||||
|
|
||||||
/* Warnings raised already */
|
/* Warnings raised already */
|
||||||
if (schema != NULL && !_secret_attributes_validate (schema, attributes))
|
if (schema != NULL && !_secret_attributes_validate (schema, attributes, G_STRFUNC, TRUE))
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
if (service == NULL) {
|
if (service == NULL) {
|
||||||
@ -1064,7 +1064,7 @@ secret_service_store (SecretService *service,
|
|||||||
g_return_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable));
|
g_return_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable));
|
||||||
|
|
||||||
/* Warnings raised already */
|
/* Warnings raised already */
|
||||||
if (schema != NULL && !_secret_attributes_validate (schema, attributes))
|
if (schema != NULL && !_secret_attributes_validate (schema, attributes, G_STRFUNC, FALSE))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
async = g_simple_async_result_new (G_OBJECT (service), callback, user_data,
|
async = g_simple_async_result_new (G_OBJECT (service), callback, user_data,
|
||||||
@ -1181,7 +1181,7 @@ secret_service_store_sync (SecretService *service,
|
|||||||
g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
|
g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
|
||||||
|
|
||||||
/* Warnings raised already */
|
/* Warnings raised already */
|
||||||
if (schema != NULL && !_secret_attributes_validate (schema, attributes))
|
if (schema != NULL && !_secret_attributes_validate (schema, attributes, G_STRFUNC, FALSE))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
sync = _secret_sync_new ();
|
sync = _secret_sync_new ();
|
||||||
@ -1365,7 +1365,7 @@ secret_service_lookup (SecretService *service,
|
|||||||
g_return_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable));
|
g_return_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable));
|
||||||
|
|
||||||
/* Warnings raised already */
|
/* Warnings raised already */
|
||||||
if (schema != NULL && !_secret_attributes_validate (schema, attributes))
|
if (schema != NULL && !_secret_attributes_validate (schema, attributes, G_STRFUNC, TRUE))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (schema != NULL && !(schema->flags & SECRET_SCHEMA_DONT_MATCH_NAME))
|
if (schema != NULL && !(schema->flags & SECRET_SCHEMA_DONT_MATCH_NAME))
|
||||||
@ -1464,7 +1464,7 @@ secret_service_lookup_sync (SecretService *service,
|
|||||||
g_return_val_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable), NULL);
|
g_return_val_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable), NULL);
|
||||||
|
|
||||||
/* Warnings raised already */
|
/* Warnings raised already */
|
||||||
if (schema != NULL && !_secret_attributes_validate (schema, attributes))
|
if (schema != NULL && !_secret_attributes_validate (schema, attributes, G_STRFUNC, TRUE))
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
sync = _secret_sync_new ();
|
sync = _secret_sync_new ();
|
||||||
@ -1625,7 +1625,7 @@ secret_service_remove (SecretService *service,
|
|||||||
g_return_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable));
|
g_return_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable));
|
||||||
|
|
||||||
/* Warnings raised already */
|
/* Warnings raised already */
|
||||||
if (schema != NULL && !_secret_attributes_validate (schema, attributes))
|
if (schema != NULL && !_secret_attributes_validate (schema, attributes, G_STRFUNC, TRUE))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (schema != NULL && !(schema->flags & SECRET_SCHEMA_DONT_MATCH_NAME))
|
if (schema != NULL && !(schema->flags & SECRET_SCHEMA_DONT_MATCH_NAME))
|
||||||
@ -1721,7 +1721,7 @@ secret_service_remove_sync (SecretService *service,
|
|||||||
g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
|
g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
|
||||||
|
|
||||||
/* Warnings raised already */
|
/* Warnings raised already */
|
||||||
if (schema != NULL && !_secret_attributes_validate (schema, attributes))
|
if (schema != NULL && !_secret_attributes_validate (schema, attributes, G_STRFUNC, TRUE))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
sync = _secret_sync_new ();
|
sync = _secret_sync_new ();
|
||||||
|
@ -142,7 +142,7 @@ secret_password_storev (const SecretSchema *schema,
|
|||||||
g_return_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable));
|
g_return_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable));
|
||||||
|
|
||||||
/* Warnings raised already */
|
/* Warnings raised already */
|
||||||
if (!_secret_attributes_validate (schema, attributes))
|
if (!_secret_attributes_validate (schema, attributes, G_STRFUNC, FALSE))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
value = secret_value_new (password, -1, "text/plain");
|
value = secret_value_new (password, -1, "text/plain");
|
||||||
@ -277,7 +277,7 @@ secret_password_storev_sync (const SecretSchema *schema,
|
|||||||
g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
|
g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
|
||||||
|
|
||||||
/* Warnings raised already */
|
/* Warnings raised already */
|
||||||
if (!_secret_attributes_validate (schema, attributes))
|
if (!_secret_attributes_validate (schema, attributes, G_STRFUNC, FALSE))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
sync = _secret_sync_new ();
|
sync = _secret_sync_new ();
|
||||||
@ -368,7 +368,7 @@ secret_password_lookupv (const SecretSchema *schema,
|
|||||||
g_return_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable));
|
g_return_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable));
|
||||||
|
|
||||||
/* Warnings raised already */
|
/* Warnings raised already */
|
||||||
if (!_secret_attributes_validate (schema, attributes))
|
if (!_secret_attributes_validate (schema, attributes, G_STRFUNC, TRUE))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
secret_service_lookup (NULL, schema, attributes,
|
secret_service_lookup (NULL, schema, attributes,
|
||||||
@ -555,7 +555,7 @@ secret_password_lookupv_nonpageable_sync (const SecretSchema *schema,
|
|||||||
g_return_val_if_fail (error == NULL || *error == NULL, NULL);
|
g_return_val_if_fail (error == NULL || *error == NULL, NULL);
|
||||||
|
|
||||||
/* Warnings raised already */
|
/* Warnings raised already */
|
||||||
if (!_secret_attributes_validate (schema, attributes))
|
if (!_secret_attributes_validate (schema, attributes, G_STRFUNC, TRUE))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
sync = _secret_sync_new ();
|
sync = _secret_sync_new ();
|
||||||
@ -610,7 +610,7 @@ secret_password_lookupv_sync (const SecretSchema *schema,
|
|||||||
g_return_val_if_fail (error == NULL || *error == NULL, NULL);
|
g_return_val_if_fail (error == NULL || *error == NULL, NULL);
|
||||||
|
|
||||||
/* Warnings raised already */
|
/* Warnings raised already */
|
||||||
if (!_secret_attributes_validate (schema, attributes))
|
if (!_secret_attributes_validate (schema, attributes, G_STRFUNC, TRUE))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
sync = _secret_sync_new ();
|
sync = _secret_sync_new ();
|
||||||
@ -680,7 +680,7 @@ secret_password_remove (const SecretSchema *schema,
|
|||||||
* @callback: called when the operation completes
|
* @callback: called when the operation completes
|
||||||
* @user_data: data to be passed to the callback
|
* @user_data: data to be passed to the callback
|
||||||
*
|
*
|
||||||
* Remove a password from the secret service.
|
* Remove passwords from the secret service.
|
||||||
*
|
*
|
||||||
* The @attributes should be a set of key and value string pairs.
|
* The @attributes should be a set of key and value string pairs.
|
||||||
*
|
*
|
||||||
@ -702,7 +702,7 @@ secret_password_removev (const SecretSchema *schema,
|
|||||||
g_return_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable));
|
g_return_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable));
|
||||||
|
|
||||||
/* Warnings raised already */
|
/* Warnings raised already */
|
||||||
if (!_secret_attributes_validate (schema, attributes))
|
if (!_secret_attributes_validate (schema, attributes, G_STRFUNC, TRUE))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
secret_service_remove (NULL, schema, attributes,
|
secret_service_remove (NULL, schema, attributes,
|
||||||
@ -809,7 +809,7 @@ secret_password_removev_sync (const SecretSchema *schema,
|
|||||||
g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
|
g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
|
||||||
|
|
||||||
/* Warnings raised already */
|
/* Warnings raised already */
|
||||||
if (!_secret_attributes_validate (schema, attributes))
|
if (!_secret_attributes_validate (schema, attributes, G_STRFUNC, TRUE))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
sync = _secret_sync_new ();
|
sync = _secret_sync_new ();
|
||||||
|
@ -344,7 +344,7 @@ secret_collection_search_for_dbus_paths (SecretCollection *collection,
|
|||||||
g_return_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable));
|
g_return_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable));
|
||||||
|
|
||||||
/* Warnings raised already */
|
/* Warnings raised already */
|
||||||
if (schema != NULL && !_secret_attributes_validate (schema, attributes))
|
if (schema != NULL && !_secret_attributes_validate (schema, attributes, G_STRFUNC, TRUE))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (schema != NULL && !(schema->flags & SECRET_SCHEMA_DONT_MATCH_NAME))
|
if (schema != NULL && !(schema->flags & SECRET_SCHEMA_DONT_MATCH_NAME))
|
||||||
@ -486,7 +486,7 @@ secret_service_search_for_dbus_paths (SecretService *self,
|
|||||||
g_return_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable));
|
g_return_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable));
|
||||||
|
|
||||||
/* Warnings raised already */
|
/* Warnings raised already */
|
||||||
if (schema != NULL && !_secret_attributes_validate (schema, attributes))
|
if (schema != NULL && !_secret_attributes_validate (schema, attributes, G_STRFUNC, TRUE))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (schema != NULL && !(schema->flags & SECRET_SCHEMA_DONT_MATCH_NAME))
|
if (schema != NULL && !(schema->flags & SECRET_SCHEMA_DONT_MATCH_NAME))
|
||||||
@ -626,7 +626,7 @@ secret_service_search_for_dbus_paths_sync (SecretService *self,
|
|||||||
g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
|
g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
|
||||||
|
|
||||||
/* Warnings raised already */
|
/* Warnings raised already */
|
||||||
if (schema != NULL && !_secret_attributes_validate (schema, attributes))
|
if (schema != NULL && !_secret_attributes_validate (schema, attributes, G_STRFUNC, TRUE))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
if (schema != NULL && !(schema->flags & SECRET_SCHEMA_DONT_MATCH_NAME))
|
if (schema != NULL && !(schema->flags & SECRET_SCHEMA_DONT_MATCH_NAME))
|
||||||
|
@ -81,7 +81,9 @@ GHashTable * _secret_attributes_for_variant (GVariant *variant
|
|||||||
GHashTable * _secret_attributes_copy (GHashTable *attributes);
|
GHashTable * _secret_attributes_copy (GHashTable *attributes);
|
||||||
|
|
||||||
gboolean _secret_attributes_validate (const SecretSchema *schema,
|
gboolean _secret_attributes_validate (const SecretSchema *schema,
|
||||||
GHashTable *attributes);
|
GHashTable *attributes,
|
||||||
|
const gchar *pretty_function,
|
||||||
|
gboolean matching);
|
||||||
|
|
||||||
GVariant * _secret_util_variant_for_properties (GHashTable *properties);
|
GVariant * _secret_util_variant_for_properties (GHashTable *properties);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user