summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--docs/reference/libsecret/libsecret-sections.txt2
-rw-r--r--libsecret/secret-paths.c59
-rw-r--r--libsecret/secret-paths.h6
-rw-r--r--libsecret/test-paths.c29
4 files changed, 96 insertions, 0 deletions
diff --git a/docs/reference/libsecret/libsecret-sections.txt b/docs/reference/libsecret/libsecret-sections.txt
index d62dd5d..1870dbf 100644
--- a/docs/reference/libsecret/libsecret-sections.txt
+++ b/docs/reference/libsecret/libsecret-sections.txt
@@ -289,6 +289,8 @@ secret_service_read_alias_dbus_path_sync
secret_service_set_alias_to_dbus_path
secret_service_set_alias_to_dbus_path_finish
secret_service_set_alias_to_dbus_path_sync
+secret_service_encode_dbus_secret
+secret_service_decode_dbus_secret
</SECTION>
<SECTION>
diff --git a/libsecret/secret-paths.c b/libsecret/secret-paths.c
index 5c034be..3ce3eee 100644
--- a/libsecret/secret-paths.c
+++ b/libsecret/secret-paths.c
@@ -2581,3 +2581,62 @@ secret_service_prompt_at_dbus_path_finish (SecretService *self,
return secret_service_prompt_finish (self, result, error);
}
+
+/**
+ * secret_service_encode_dbus_secret:
+ * @service: the service
+ * @value: the secret value
+ *
+ * Encodes a #SecretValue into GVariant for use with the Secret Service
+ * DBus API.
+ *
+ * The resulting GVariant will have a <literal>(oayays)</literal> signature.
+ *
+ * A session must have already been established by the #SecretService.
+ *
+ * Returns: (transfer floating): the encoded secret
+ */
+GVariant *
+secret_service_encode_dbus_secret (SecretService *service,
+ SecretValue *value)
+{
+ SecretSession *session;
+
+ g_return_val_if_fail (service != NULL, NULL);
+ g_return_val_if_fail (value != NULL, NULL);
+
+ session = _secret_service_get_session (service);
+ g_return_val_if_fail (session != NULL, NULL);
+
+ return _secret_session_encode_secret (session, value);
+}
+
+/**
+ * secret_service_decode_dbus_secret:
+ * @service: the service
+ * @value: the encoded secret
+ *
+ * Decode a #SecretValue into GVariant received with the Secret Service
+ * DBus API.
+ *
+ * The GVariant should have a <literal>(oayays)</literal> signature.
+ *
+ * A session must have already been established by the #SecretService, and
+ * the encoded secret must be valid for that session.
+ *
+ * Returns: (transfer full): the decoded secret value
+ */
+SecretValue *
+secret_service_decode_dbus_secret (SecretService *service,
+ GVariant *value)
+{
+ SecretSession *session;
+
+ g_return_val_if_fail (service != NULL, NULL);
+ g_return_val_if_fail (value != NULL, NULL);
+
+ session = _secret_service_get_session (service);
+ g_return_val_if_fail (session != NULL, NULL);
+
+ return _secret_session_decode_secret (session, value);
+}
diff --git a/libsecret/secret-paths.h b/libsecret/secret-paths.h
index 8bda883..0702297 100644
--- a/libsecret/secret-paths.h
+++ b/libsecret/secret-paths.h
@@ -272,6 +272,12 @@ gboolean secret_service_set_alias_to_dbus_path_sync (SecretSe
GCancellable *cancellable,
GError **error);
+GVariant * secret_service_encode_dbus_secret (SecretService *service,
+ SecretValue *value);
+
+SecretValue * secret_service_decode_dbus_secret (SecretService *service,
+ GVariant *value);
+
G_END_DECLS
#endif /* __SECRET_SERVICE_H___ */
diff --git a/libsecret/test-paths.c b/libsecret/test-paths.c
index 9f93eae..631ce13 100644
--- a/libsecret/test-paths.c
+++ b/libsecret/test-paths.c
@@ -710,6 +710,33 @@ test_set_alias_path (Test *test,
g_assert (path == NULL);
}
+static void
+test_encode_decode_secret (Test *test,
+ gconstpointer unused)
+{
+ GVariant *variant;
+ SecretValue *value;
+ SecretValue *decoded;
+ GError *error = NULL;
+
+ value = secret_value_new ("zerogjuggs", -1, "text/plain");
+
+ secret_service_ensure_session_sync (test->service, NULL, &error);
+ g_assert_no_error (error);
+
+ variant = secret_service_encode_dbus_secret (test->service, value);
+ g_assert (variant != NULL);
+ g_assert_cmpstr (g_variant_get_type_string (variant), ==, "(oayays)");
+ secret_value_unref (value);
+
+ decoded = secret_service_decode_dbus_secret (test->service, variant);
+ g_assert (variant != NULL);
+ g_variant_unref (variant);
+
+ g_assert_cmpstr (secret_value_get_text (decoded), ==, "zerogjuggs");
+ secret_value_unref (decoded);
+}
+
int
main (int argc, char **argv)
{
@@ -746,5 +773,7 @@ main (int argc, char **argv)
g_test_add ("/service/set-alias-path", Test, "mock-service-normal.py", setup, test_set_alias_path, teardown);
+ g_test_add ("/service/encode-decode-secret", Test, "mock-service-normal.py", setup, test_encode_decode_secret, teardown);
+
return egg_tests_run_with_loop ();
}