Index: components/os_crypt/keyring_util_linux.h |
diff --git a/components/os_crypt/keyring_util_linux.h b/components/os_crypt/keyring_util_linux.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..4302c838795c8d845012e7128b73562be1e40e41 |
--- /dev/null |
+++ b/components/os_crypt/keyring_util_linux.h |
@@ -0,0 +1,66 @@ |
+// Copyright 2016 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#ifndef COMPONENTS_OS_CRYPT_KEYRING_UTIL_LINUX_H_ |
+#define COMPONENTS_OS_CRYPT_KEYRING_UTIL_LINUX_H_ |
+ |
+// libgnome-keyring has been deprecated in favor of libsecret. |
+// See: https://mail.gnome.org/archives/commits-list/2013-October/msg08876.html |
+// |
+// The define below turns off the deprecations, in order to avoid build |
+// failures with Gnome 3.12. When we move to libsecret, the define can be |
+// removed, together with the include below it. |
+// |
+// The porting is tracked in http://crbug.com/355223 |
+#define GNOME_KEYRING_DEPRECATED |
+#define GNOME_KEYRING_DEPRECATED_FOR(x) |
+#include <gnome-keyring.h> |
+ |
+#include "base/macros.h" |
+ |
+// Many of the gnome_keyring_* functions use variable arguments, which makes |
+// them difficult if not impossible to truly wrap in C. Therefore, we use |
+// appropriately-typed function pointers and scoping to make the fact that we |
+// might be dynamically loading the library almost invisible. As a bonus, we |
+// also get a simple way to mock the library for testing. Classes that inherit |
+// from GnomeKeyringLoader will use its versions of the gnome_keyring_* |
+// functions. Note that it has only static fields. |
+class GnomeKeyringLoader { |
+ protected: |
+ static bool LoadGnomeKeyring(); |
+ |
+ // Declare the actual function pointers that we'll use in client code. |
+ static decltype(&::gnome_keyring_is_available) gnome_keyring_is_available_ptr; |
+ static decltype( |
+ &::gnome_keyring_store_password) gnome_keyring_store_password_ptr; |
+ static decltype( |
+ &::gnome_keyring_delete_password) gnome_keyring_delete_password_ptr; |
+ static decltype(&::gnome_keyring_find_items) gnome_keyring_find_items_ptr; |
+ static decltype( |
+ &::gnome_keyring_result_to_message) gnome_keyring_result_to_message_ptr; |
+ static decltype(&::gnome_keyring_attribute_list_free) |
+ gnome_keyring_attribute_list_free_ptr; |
+ static decltype( |
+ &::gnome_keyring_attribute_list_new) gnome_keyring_attribute_list_new_ptr; |
+ static decltype(&::gnome_keyring_attribute_list_append_string) |
+ gnome_keyring_attribute_list_append_string_ptr; |
+ static decltype(&::gnome_keyring_attribute_list_append_uint32) |
+ gnome_keyring_attribute_list_append_uint32_ptr; |
+ // We also use gnome_keyring_attribute_list_index(), which is a macro and |
+ // can't be referenced. |
+ |
+ // Set to true if LoadGnomeKeyring() has already succeeded. |
+ static bool keyring_loaded; |
+ |
+ private: |
+ struct FunctionInfo { |
+ const char* name; |
+ void** pointer; |
+ }; |
+ |
+ // Make it easy to initialize the function pointers in LoadGnomeKeyring(). |
+ static const FunctionInfo functions[]; |
+}; |
+ |
+#endif // COMPONENTS_OS_CRYPT_KEYRING_UTIL_LINUX_H_ |