gnucash maint: Multiple changes pushed
John Ralls
jralls at code.gnucash.org
Sun Jan 19 17:06:21 EST 2020
Updated via https://github.com/Gnucash/gnucash/commit/e51bc45e (commit)
via https://github.com/Gnucash/gnucash/commit/08fd3e97 (commit)
from https://github.com/Gnucash/gnucash/commit/2c45e0ec (commit)
commit e51bc45e588b328728449e03b5ef8f3f9219c661
Author: John Ralls <jralls at ceridwen.us>
Date: Sun Jan 19 14:05:21 2020 -0800
Bug 797588 - Gnucash segfaults when using mysql backend with empty password
Log an error and return if any of the required string elements is NULL.
diff --git a/gnucash/gnome-utils/gnc-keyring.c b/gnucash/gnome-utils/gnc-keyring.c
index b88e5eb17..ce0e3b55d 100644
--- a/gnucash/gnome-utils/gnc-keyring.c
+++ b/gnucash/gnome-utils/gnc-keyring.c
@@ -74,6 +74,9 @@ void gnc_keyring_set_password (const gchar *access_method,
GError* error = NULL;
gchar* label = NULL;
+ g_return_if_fail(access_method != NULL && server != NULL &&
+ service != NULL && user != NULL && password != NULL);
+
label = g_strdup_printf("GnuCash password for %s://%s@%s", access_method, user, server);
if (port == 0)
@@ -104,6 +107,9 @@ void gnc_keyring_set_password (const gchar *access_method,
GnomeKeyringResult gkr_result;
guint32 item_id = 0;
+ g_return_if_fail(access_method != NULL && server != NULL &&
+ service != NULL && user != NULL && password != NULL);
+
gkr_result = gnome_keyring_set_network_password_sync
(NULL, user, NULL, server, service,
access_method, NULL, port, password, &item_id);
@@ -119,6 +125,8 @@ void gnc_keyring_set_password (const gchar *access_method,
OSStatus status;
SecKeychainItemRef *itemRef = NULL;
+ g_return_if_fail(access_method != NULL && server != NULL &&
+ service != NULL && user != NULL && password != NULL);
/* mysql and postgres aren't valid protocols on Mac OS X.
* So we use the security domain parameter to allow us to
* distinguish between these two.
commit 08fd3e97979f18d703458b53a2f3fcdbc3e99758
Author: John Ralls <jralls at ceridwen.us>
Date: Sun Jan 19 14:02:36 2020 -0800
Fix up indentation in gnc-keyring.c.
It was partly gnu-style.
diff --git a/gnucash/gnome-utils/gnc-keyring.c b/gnucash/gnome-utils/gnc-keyring.c
index a3a0ea08c..b88e5eb17 100644
--- a/gnucash/gnome-utils/gnc-keyring.c
+++ b/gnucash/gnome-utils/gnc-keyring.c
@@ -46,18 +46,18 @@ G_GNUC_UNUSED static QofLogModule log_module = GNC_MOD_GUI;
const SecretSchema* gnucash_get_secret_schema(void) G_GNUC_CONST;
const SecretSchema* gnucash_get_secret_schema(void)
{
- static const SecretSchema secret_schema = {
- "org.gnucash.password", SECRET_SCHEMA_NONE,
- {
- { "protocol", SECRET_SCHEMA_ATTRIBUTE_STRING },
- { "server", SECRET_SCHEMA_ATTRIBUTE_STRING },
- { "port", SECRET_SCHEMA_ATTRIBUTE_INTEGER },
- { "user", SECRET_SCHEMA_ATTRIBUTE_STRING },
- { "NULL", 0 },
- }
- };
+ static const SecretSchema secret_schema = {
+ "org.gnucash.password", SECRET_SCHEMA_NONE,
+ {
+ { "protocol", SECRET_SCHEMA_ATTRIBUTE_STRING },
+ { "server", SECRET_SCHEMA_ATTRIBUTE_STRING },
+ { "port", SECRET_SCHEMA_ATTRIBUTE_INTEGER },
+ { "user", SECRET_SCHEMA_ATTRIBUTE_STRING },
+ { "NULL", 0 },
+ }
+ };
- return &secret_schema;
+ return &secret_schema;
}
#define SECRET_SCHEMA_GNUCASH gnucash_get_secret_schema()
@@ -71,42 +71,42 @@ void gnc_keyring_set_password (const gchar *access_method,
const gchar* password)
{
#ifdef HAVE_LIBSECRET
- GError* error = NULL;
- gchar* label = NULL;
+ GError* error = NULL;
+ gchar* label = NULL;
- label = g_strdup_printf("GnuCash password for %s://%s@%s", access_method, user, server);
+ label = g_strdup_printf("GnuCash password for %s://%s@%s", access_method, user, server);
- if (port == 0)
- secret_password_store_sync (SECRET_SCHEMA_GNUCASH, SECRET_COLLECTION_DEFAULT,
- label, password, NULL, &error,
- "protocol", access_method,
- "server", server,
- "user", user,
- NULL);
- else
- secret_password_store_sync (SECRET_SCHEMA_GNUCASH, SECRET_COLLECTION_DEFAULT,
- label, password, NULL, &error,
- "protocol", access_method,
- "server", server,
- "port", port,
- "user", user,
- NULL);
+ if (port == 0)
+ secret_password_store_sync (SECRET_SCHEMA_GNUCASH, SECRET_COLLECTION_DEFAULT,
+ label, password, NULL, &error,
+ "protocol", access_method,
+ "server", server,
+ "user", user,
+ NULL);
+ else
+ secret_password_store_sync (SECRET_SCHEMA_GNUCASH, SECRET_COLLECTION_DEFAULT,
+ label, password, NULL, &error,
+ "protocol", access_method,
+ "server", server,
+ "port", port,
+ "user", user,
+ NULL);
- g_free(label);
+ g_free(label);
- if (error != NULL)
- {
- PWARN ("libsecret error: %s", error->message);
- PWARN ("The user will be prompted for a password again next time.");
- g_error_free(error);
- }
+ if (error != NULL)
+ {
+ PWARN ("libsecret error: %s", error->message);
+ PWARN ("The user will be prompted for a password again next time.");
+ g_error_free(error);
+ }
#elif HAVE_GNOME_KEYRING
GnomeKeyringResult gkr_result;
guint32 item_id = 0;
gkr_result = gnome_keyring_set_network_password_sync
- (NULL, user, NULL, server, service,
- access_method, NULL, port, password, &item_id);
+ (NULL, user, NULL, server, service,
+ access_method, NULL, port, password, &item_id);
if (gkr_result != GNOME_KEYRING_RESULT_OK)
{
@@ -126,22 +126,26 @@ void gnc_keyring_set_password (const gchar *access_method,
// FIXME I'm not sure this works if a password was already in the keychain
// I may have to do a lookup first and if it exists, run some
// update function instead
- status = SecKeychainAddInternetPassword ( NULL, /* keychain */
- strlen(server), server, /* servername */
- strlen(access_method), access_method, /* securitydomain */
- strlen(user), user, /* acountname */
- strlen(service), service, /* path */
- port, /* port */
- kSecProtocolTypeAny, /* protocol */
- kSecAuthenticationTypeDefault, /* auth type */
- strlen(password), password, /* passworddata */
- itemRef );
+ status =
+ SecKeychainAddInternetPassword (NULL, /* keychain */
+ strlen(server), server, /* servername */
+ strlen(access_method),
+ access_method, /* securitydomain */
+ strlen(user), user, /* acountname */
+ strlen(service), service, /* path */
+ port, /* port */
+ kSecProtocolTypeAny, /* protocol */
+ kSecAuthenticationTypeDefault, /* auth type */
+ strlen(password),
+ password, /* passworddata */
+ itemRef );
if ( status != noErr )
{
CFStringRef osx_resultstring = SecCopyErrorMessageString( status, NULL );
- const gchar *resultstring = CFStringGetCStringPtr(osx_resultstring,
- GetApplicationTextEncoding());
+ const gchar *resultstring =
+ CFStringGetCStringPtr(osx_resultstring,
+ GetApplicationTextEncoding());
PWARN ( "OS X keychain error: %s", resultstring );
PWARN ( "The user will be prompted for a password again next time." );
CFRelease ( osx_resultstring );
@@ -201,17 +205,17 @@ gboolean gnc_keyring_get_password ( GtkWidget *parent,
/* Note: only use the port attribute if it was set by the user. */
if (port == 0)
libsecret_password = secret_password_lookup_sync (SECRET_SCHEMA_GNUCASH, NULL, &error,
- "protocol", access_method,
- "server", server,
- "user", *user,
- NULL);
+ "protocol", access_method,
+ "server", server,
+ "user", *user,
+ NULL);
else
libsecret_password = secret_password_lookup_sync (SECRET_SCHEMA_GNUCASH, NULL, &error,
- "protocol", access_method,
- "server", server,
- "port", port,
- "user", *user,
- NULL);
+ "protocol", access_method,
+ "server", server,
+ "port", port,
+ "user", *user,
+ NULL);
if (libsecret_password != NULL) {
*password = g_strdup (libsecret_password);
@@ -222,11 +226,11 @@ gboolean gnc_keyring_get_password ( GtkWidget *parent,
/* No password found yet. Perhaps it was written with a port equal to 0.
* Gnucash versions prior to 2.6.7 did this unfortunately... */
libsecret_password = secret_password_lookup_sync (SECRET_SCHEMA_GNUCASH, NULL, &error,
- "protocol", access_method,
- "server", server,
- "port", 0,
- "user", *user,
- NULL);
+ "protocol", access_method,
+ "server", server,
+ "port", 0,
+ "user", *user,
+ NULL);
if (libsecret_password != NULL) {
*password = g_strdup (libsecret_password);
@@ -242,19 +246,19 @@ gboolean gnc_keyring_get_password ( GtkWidget *parent,
Look for a password stored via gnome-keyring instead */
if (port == 0)
libsecret_password = secret_password_lookup_sync (SECRET_SCHEMA_COMPAT_NETWORK, NULL, &error,
- "protocol", access_method,
- "server", server,
- "object", service,
- "user", *user,
- NULL);
+ "protocol", access_method,
+ "server", server,
+ "object", service,
+ "user", *user,
+ NULL);
else
libsecret_password = secret_password_lookup_sync (SECRET_SCHEMA_COMPAT_NETWORK, NULL, &error,
- "protocol", access_method,
- "server", server,
- "port", port,
- "object", service,
- "user", *user,
- NULL);
+ "protocol", access_method,
+ "server", server,
+ "port", port,
+ "object", service,
+ "user", *user,
+ NULL);
if (libsecret_password != NULL) {
*password = g_strdup (libsecret_password);
@@ -275,8 +279,8 @@ gboolean gnc_keyring_get_password ( GtkWidget *parent,
#elif HAVE_GNOME_KEYRING
gkr_result = gnome_keyring_find_network_password_sync
- ( *user, NULL, server, service,
- access_method, NULL, port, &found_list );
+ ( *user, NULL, server, service,
+ access_method, NULL, port, &found_list );
if (gkr_result == GNOME_KEYRING_RESULT_OK)
{
@@ -290,7 +294,7 @@ gboolean gnc_keyring_get_password ( GtkWidget *parent,
/* Something went wrong while attempting to access libsecret
* Log the error message and carry on... */
PWARN ("Gnome-keyring access failed: %s.",
- gnome_keyring_result_to_message(gkr_result));
+ gnome_keyring_result_to_message(gkr_result));
gnome_keyring_network_password_list_free(found_list);
#endif /* HAVE_LIBSECRET or HAVE_GNOME_KEYRING */
@@ -302,15 +306,15 @@ gboolean gnc_keyring_get_password ( GtkWidget *parent,
if (*user != NULL)
{
status = SecKeychainFindInternetPassword( NULL,
- strlen(server), server,
- strlen(access_method), access_method,
- strlen(*user), *user,
- strlen(service), service,
- port,
- kSecProtocolTypeAny,
- kSecAuthenticationTypeDefault,
- &password_length, &password_data,
- NULL);
+ strlen(server), server,
+ strlen(access_method), access_method,
+ strlen(*user), *user,
+ strlen(service), service,
+ port,
+ kSecProtocolTypeAny,
+ kSecAuthenticationTypeDefault,
+ &password_length, &password_data,
+ NULL);
if ( status == noErr )
{
@@ -322,7 +326,7 @@ gboolean gnc_keyring_get_password ( GtkWidget *parent,
{
CFStringRef osx_resultstring = SecCopyErrorMessageString( status, NULL );
const gchar *resultstring = CFStringGetCStringPtr(osx_resultstring,
- GetApplicationTextEncoding());
+ GetApplicationTextEncoding());
PWARN ( "OS X keychain error: %s", resultstring );
CFRelease ( osx_resultstring );
}
@@ -330,39 +334,39 @@ gboolean gnc_keyring_get_password ( GtkWidget *parent,
#endif /* HAVE_OSX_KEYCHAIN */
/* If we got here, either no proper password store is
- * available on this system, or we couldn't retrieve
- * a password from it. In both cases, just ask the user
- * to enter one
- */
+ * available on this system, or we couldn't retrieve
+ * a password from it. In both cases, just ask the user
+ * to enter one
+ */
if ( port == 0 )
db_path = g_strdup_printf ( "%s://%s/%s", access_method, server, service );
else
db_path = g_strdup_printf ( "%s://%s:%d/%s", access_method, server, port, service );
heading = g_strdup_printf ( /* Translators: %s is a path to a database or any other url,
- like mysql://user@server.somewhere/somedb, https://www.somequotes.com/thequotes */
- _("Enter a user name and password to connect to: %s"),
- db_path );
+ like mysql://user@server.somewhere/somedb, https://www.somequotes.com/thequotes */
+ _("Enter a user name and password to connect to: %s"),
+ db_path );
password_found = gnc_get_username_password ( parent, heading,
- *user, NULL,
- user, password );
+ *user, NULL,
+ user, password );
g_free ( db_path );
g_free ( heading );
if ( password_found )
{
/* User entered new user/password information
- * Let's try to add it to a password store.
- */
+ * Let's try to add it to a password store.
+ */
gchar *newuser = g_strdup( *user );
gchar *newpassword = g_strdup( *password );
gnc_keyring_set_password ( access_method,
- server,
- port,
- service,
- newuser,
- newpassword );
+ server,
+ port,
+ service,
+ newuser,
+ newpassword );
g_free ( newuser );
g_free ( newpassword );
}
Summary of changes:
gnucash/gnome-utils/gnc-keyring.c | 220 ++++++++++++++++++++------------------
1 file changed, 116 insertions(+), 104 deletions(-)
More information about the gnucash-changes
mailing list