Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package gnome-online-accounts for 
openSUSE:Factory checked in at 2025-10-14 18:06:58
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/gnome-online-accounts (Old)
 and      /work/SRC/openSUSE:Factory/.gnome-online-accounts.new.18484 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "gnome-online-accounts"

Tue Oct 14 18:06:58 2025 rev:105 rq:1311121 version:3.56.1

Changes:
--------
--- 
/work/SRC/openSUSE:Factory/gnome-online-accounts/gnome-online-accounts.changes  
    2025-09-24 15:21:27.777226806 +0200
+++ 
/work/SRC/openSUSE:Factory/.gnome-online-accounts.new.18484/gnome-online-accounts.changes
   2025-10-14 18:08:02.138069034 +0200
@@ -1,0 +2,10 @@
+Sat Oct 11 17:36:39 UTC 2025 - Bjørn Lie <[email protected]>
+
+- Update to version 3.56.1:
+  + Bugs fixed:
+    - Support for saving a Kerberos password after the first login
+    - Changing expired kerberos password is not supported
+    - Provided Files URI does not override undiscovered endpoint
+    - DAV client rejects 204 status in OPTIONS request handler
+
+-------------------------------------------------------------------

Old:
----
  gnome-online-accounts-3.56.0.obscpio

New:
----
  gnome-online-accounts-3.56.1.obscpio

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ gnome-online-accounts.spec ++++++
--- /var/tmp/diff_new_pack.jxuBcu/_old  2025-10-14 18:08:03.934145528 +0200
+++ /var/tmp/diff_new_pack.jxuBcu/_new  2025-10-14 18:08:03.938145698 +0200
@@ -17,7 +17,7 @@
 
 
 Name:           gnome-online-accounts
-Version:        3.56.0
+Version:        3.56.1
 Release:        0
 Summary:        GNOME service to access online accounts
 License:        LGPL-2.0-or-later

++++++ _service ++++++
--- /var/tmp/diff_new_pack.jxuBcu/_old  2025-10-14 18:08:03.970147061 +0200
+++ /var/tmp/diff_new_pack.jxuBcu/_new  2025-10-14 18:08:03.974147231 +0200
@@ -3,7 +3,7 @@
   <service name="obs_scm" mode="manual">
     <param name="scm">git</param>
     <param 
name="url">https://gitlab.gnome.org/GNOME/gnome-online-accounts.git</param>
-    <param name="revision">3.56.0</param>
+    <param name="revision">3.56.1</param>
     <param name="versionformat">@PARENT_TAG@+@TAG_OFFSET@</param>
     <param name="versionrewrite-pattern">(.*)\+0</param>
     <param name="versionrewrite-replacement">\1</param>

++++++ gnome-online-accounts-3.56.0.obscpio -> 
gnome-online-accounts-3.56.1.obscpio ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gnome-online-accounts-3.56.0/NEWS 
new/gnome-online-accounts-3.56.1/NEWS
--- old/gnome-online-accounts-3.56.0/NEWS       2025-09-13 20:34:22.000000000 
+0200
+++ new/gnome-online-accounts-3.56.1/NEWS       2025-10-11 19:18:34.000000000 
+0200
@@ -1,3 +1,11 @@
+Overview of changes in 3.56.1
+=============================
+* Bugs fixed:
+  - #417 Support for saving a Kerberos password after the first login
+  - #436 Changing expired kerberos password is not supported
+  - #437 Provided Files URI does not override undiscovered endpoint
+  - #439 DAV client rejects 204 status in OPTIONS request handler
+
 Overview of changes in 3.56.0
 =============================
 * Changes:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gnome-online-accounts-3.56.0/meson.build 
new/gnome-online-accounts-3.56.1/meson.build
--- old/gnome-online-accounts-3.56.0/meson.build        2025-09-13 
20:34:22.000000000 +0200
+++ new/gnome-online-accounts-3.56.1/meson.build        2025-10-11 
19:18:34.000000000 +0200
@@ -1,6 +1,6 @@
 project(
   'gnome-online-accounts', 'c',
-  version: '3.56.0',
+  version: '3.56.1',
   license: 'LGPL2+',
   default_options: [
     'buildtype=debugoptimized',
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/gnome-online-accounts-3.56.0/src/goabackend/goadavclient.c 
new/gnome-online-accounts-3.56.1/src/goabackend/goadavclient.c
--- old/gnome-online-accounts-3.56.0/src/goabackend/goadavclient.c      
2025-09-13 20:34:22.000000000 +0200
+++ new/gnome-online-accounts-3.56.1/src/goabackend/goadavclient.c      
2025-10-11 19:18:34.000000000 +0200
@@ -36,15 +36,16 @@
 /* Fastmail
  * See: 
https://www.fastmail.help/hc/en-us/articles/1500000278342-Server-names-and-ports
  */
+#define FASTMAIL_HOSTNAME    "fastmail.com"
 #define FASTMAIL_WEBDAV      "https://myfiles.fastmail.com";
 #define FASTMAIL_CALDAV      "https://caldav.fastmail.com/.well-known/caldav";
 #define FASTMAIL_CARDDAV     "https://carddav.fastmail.com/.well-known/carddav";
 
 /* mailbox.org
- * See: https://kb.mailbox.org/en/private/drive-article/webdav-for-linux/
+ * See: https://kb.mailbox.org/en/private/drive/webdav-for-linux/
  */
-#define MAILBOX_ORG_HOSTNAME "dav.mailbox.org"
-#define MAILBOX_ORG_WEBDAV   "https://dav.mailbox.org/servlet/webdav.infostore";
+#define MAILBOX_ORG_HOSTNAME "mailbox.org"
+#define MAILBOX_ORG_WEBDAV   
"https://dav.mailbox.org/servlet/webdav.infostore/";
 #define MAILBOX_ORG_CALDAV   "https://dav.mailbox.org/caldav";
 #define MAILBOX_ORG_CARDDAV  "https://dav.mailbox.org/carddav";
 
@@ -295,6 +296,9 @@
   switch (status)
     {
     case SOUP_STATUS_OK:
+    case SOUP_STATUS_NON_AUTHORITATIVE:
+    case SOUP_STATUS_NO_CONTENT:
+    case SOUP_STATUS_MULTI_STATUS:
       break;
 
     case SOUP_STATUS_NOT_FOUND:
@@ -1015,6 +1019,9 @@
   switch (status)
     {
     case SOUP_STATUS_OK:
+    case SOUP_STATUS_NON_AUTHORITATIVE:
+    case SOUP_STATUS_NO_CONTENT:
+    case SOUP_STATUS_MULTI_STATUS:
       break;
 
     /* Some responses are non-fatal for discovery */
@@ -1258,8 +1265,8 @@
   if (host != NULL)
     base_domain = soup_tld_get_base_domain (host, NULL);
 
-  if (g_strcmp0 (host, "fastmail.com") == 0
-      || g_strcmp0 (base_domain, "fastmail.com") == 0)
+  if (g_strcmp0 (host, FASTMAIL_HOSTNAME) == 0
+      || g_strcmp0 (base_domain, FASTMAIL_HOSTNAME) == 0)
     {
       g_queue_push_tail (&discover->candidates,
                          goa_dav_config_new (GOA_SERVICE_TYPE_CALDAV, 
FASTMAIL_CALDAV, NULL));
@@ -1271,8 +1278,8 @@
       return TRUE;
     }
 
-  if (g_strcmp0 (host, "mailbox.org") == 0
-      || g_strcmp0 (base_domain, "mailbox.org") == 0)
+  if (g_strcmp0 (host, MAILBOX_ORG_HOSTNAME) == 0
+      || g_strcmp0 (base_domain, MAILBOX_ORG_HOSTNAME) == 0)
     {
       g_queue_push_tail (&discover->candidates,
                          goa_dav_config_new (GOA_SERVICE_TYPE_CALDAV, 
MAILBOX_ORG_CALDAV, NULL));
@@ -1284,8 +1291,8 @@
       return TRUE;
     }
 
-  if (g_strcmp0 (host, "mail.ru") == 0
-      || g_strcmp0 (base_domain, "mail.ru") == 0)
+  if (g_strcmp0 (host, MAIL_RU_HOSTNAME) == 0
+      || g_strcmp0 (base_domain, MAIL_RU_HOSTNAME) == 0)
     {
       g_queue_push_tail (&discover->candidates,
                          goa_dav_config_new (GOA_SERVICE_TYPE_CALDAV, 
MAIL_RU_CALDAV, NULL));
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/gnome-online-accounts-3.56.0/src/goabackend/goaimapsmtpprovider.c 
new/gnome-online-accounts-3.56.1/src/goabackend/goaimapsmtpprovider.c
--- old/gnome-online-accounts-3.56.0/src/goabackend/goaimapsmtpprovider.c       
2025-09-13 20:34:22.000000000 +0200
+++ new/gnome-online-accounts-3.56.1/src/goabackend/goaimapsmtpprovider.c       
2025-10-11 19:18:34.000000000 +0200
@@ -193,7 +193,7 @@
                         "imap-use-ssl", imap_use_ssl,
                         "imap-use-tls", imap_use_tls,
                         "imap-accept-ssl-errors", imap_accept_ssl_errors,
-                        "smtp-supported", TRUE,
+                        "smtp-supported", (smtp_host != NULL),
                         "smtp-host", smtp_host,
                         "smtp-user-name", smtp_username,
                         "smtp-use-auth", smtp_use_auth,
@@ -501,7 +501,12 @@
   username = gtk_editable_get_text (GTK_EDITABLE (data->smtp_username));
   password = gtk_editable_get_text (GTK_EDITABLE (data->smtp_password));
 
-  if (server != NULL && *server != '\0')
+  if (server == NULL || *server == '\0')
+    {
+      goa_provider_dialog_set_state (data->dialog, GOA_DIALOG_READY);
+      return;
+    }
+  else
     {
       if ((username != NULL && *username != '\0')
           && (password != NULL && *password != '\0'))
@@ -905,20 +910,24 @@
                          "ImapUseTls", (imap_tls_type == 
GOA_TLS_TYPE_STARTTLS) ? "true" : "false");
   g_variant_builder_add (&details, "{ss}",
                          "ImapAcceptSslErrors", (data->imap_accept_ssl_errors) 
? "true" : "false");
-  g_variant_builder_add (&details, "{ss}", "SmtpHost", smtp_server);
-  g_variant_builder_add (&details, "{ss}", "SmtpUseAuth", 
(data->smtp_use_auth) ? "true" : "false");
-  if (data->smtp_use_auth)
+
+  if (smtp_server != NULL && *smtp_server != '\0')
     {
-      g_variant_builder_add (&details, "{ss}", "SmtpUserName", smtp_username);
-      g_variant_builder_add (&details, "{ss}", "SmtpAuthLogin", 
(data->smtp_auth_login) ? "true" : "false");
-      g_variant_builder_add (&details, "{ss}", "SmtpAuthPlain", 
(data->smtp_auth_plain) ? "true" : "false");
+      g_variant_builder_add (&details, "{ss}", "SmtpHost", smtp_server);
+      g_variant_builder_add (&details, "{ss}", "SmtpUseAuth", 
(data->smtp_use_auth) ? "true" : "false");
+      if (data->smtp_use_auth)
+        {
+          g_variant_builder_add (&details, "{ss}", "SmtpUserName", 
smtp_username);
+          g_variant_builder_add (&details, "{ss}", "SmtpAuthLogin", 
(data->smtp_auth_login) ? "true" : "false");
+          g_variant_builder_add (&details, "{ss}", "SmtpAuthPlain", 
(data->smtp_auth_plain) ? "true" : "false");
+        }
+      g_variant_builder_add (&details, "{ss}",
+                             "SmtpUseSsl", (smtp_tls_type == GOA_TLS_TYPE_SSL) 
? "true" : "false");
+      g_variant_builder_add (&details, "{ss}",
+                             "SmtpUseTls", (smtp_tls_type == 
GOA_TLS_TYPE_STARTTLS) ? "true" : "false");
+      g_variant_builder_add (&details, "{ss}",
+                             "SmtpAcceptSslErrors", 
(data->smtp_accept_ssl_errors) ? "true" : "false");
     }
-  g_variant_builder_add (&details, "{ss}",
-                         "SmtpUseSsl", (smtp_tls_type == GOA_TLS_TYPE_SSL) ? 
"true" : "false");
-  g_variant_builder_add (&details, "{ss}",
-                         "SmtpUseTls", (smtp_tls_type == 
GOA_TLS_TYPE_STARTTLS) ? "true" : "false");
-  g_variant_builder_add (&details, "{ss}",
-                         "SmtpAcceptSslErrors", (data->smtp_accept_ssl_errors) 
? "true" : "false");
 
   goa_manager_call_add_account (goa_client_get_manager (data->client),
                                 goa_provider_get_provider_type (provider),
@@ -975,6 +984,14 @@
   g_object_get (data->smtp_encryption, "selected", &smtp_tls_type, NULL);
   smtp_tls_type += 1;
 
+  /* If no server was provided, this is an IMAP-only account
+   */
+  if (smtp_server == NULL || *smtp_server == '\0')
+    {
+      add_account_store_credentials (task);
+      return;
+    }
+
   g_clear_object (&data->smtp_auth);
   goa_utils_parse_email_address (email_address, NULL, &domain);
   data->smtp_auth = goa_smtp_auth_new (domain, smtp_username, smtp_password);
@@ -1459,21 +1476,24 @@
 
   /* SMTP */
   subtitle = goa_util_lookup_keyfile_string (object, "SmtpHost");
-  username = goa_util_lookup_keyfile_string (object, "SmtpUserName");
-  if (g_strcmp0 (g_get_user_name (), subtitle) != 0)
+  if (subtitle != NULL)
     {
-      g_autofree char *domain = g_steal_pointer (&subtitle);
-      subtitle = g_strconcat (username, "@", domain, NULL);
-    }
+      username = goa_util_lookup_keyfile_string (object, "SmtpUserName");
+      if (g_strcmp0 (g_get_user_name (), subtitle) != 0)
+        {
+          g_autofree char *domain = g_steal_pointer (&subtitle);
+          subtitle = g_strconcat (username, "@", domain, NULL);
+        }
 
-  row = g_object_new (ADW_TYPE_ACTION_ROW,
-                      "title",    _("SMTP"),
-                      "subtitle", subtitle,
-                      NULL);
-  gtk_widget_add_css_class (row, "property");
-  adw_preferences_group_add (ADW_PREFERENCES_GROUP (ret), row);
-  g_free (subtitle);
-  g_free (username);
+      row = g_object_new (ADW_TYPE_ACTION_ROW,
+                          "title",    _("SMTP"),
+                          "subtitle", subtitle,
+                          NULL);
+      gtk_widget_add_css_class (row, "property");
+      adw_preferences_group_add (ADW_PREFERENCES_GROUP (ret), row);
+      g_free (username);
+      g_free (subtitle);
+    }
 
   return ret;
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/gnome-online-accounts-3.56.0/src/goabackend/goakerberosprovider-priv.h 
new/gnome-online-accounts-3.56.1/src/goabackend/goakerberosprovider-priv.h
--- old/gnome-online-accounts-3.56.0/src/goabackend/goakerberosprovider-priv.h  
2025-09-13 20:34:22.000000000 +0200
+++ new/gnome-online-accounts-3.56.1/src/goabackend/goakerberosprovider-priv.h  
2025-10-11 19:18:34.000000000 +0200
@@ -27,6 +27,7 @@
 #include <gio/gio.h>
 #include <goabackend/goaprovider-priv.h>
 #include <goabackend/goakerberosprovider.h>
+#include <gcr/gcr.h>
 
 G_BEGIN_DECLS
 
@@ -71,6 +72,18 @@
                                                               const char       
    *preauth_source,
                                                               GCancellable     
    *cancellable,
                                                               GError           
   **error);
+void                 goa_kerberos_provider_prompt_password        
(GoaKerberosProvider  *self,
+                                                                   
GCancellable         *cancellable,
+                                                                   
GAsyncReadyCallback   callback,
+                                                                   gpointer    
          user_data);
+GcrSecretExchange   *goa_kerberos_provider_prompt_password_finish 
(GoaKerberosProvider  *self,
+                                                                   gboolean    
         *remember_password_out,
+                                                                   
GAsyncResult         *result,
+                                                                   GError      
        **error);
+GcrSecretExchange   *goa_kerberos_provider_prompt_password_sync   
(GoaKerberosProvider  *self,
+                                                                   gboolean    
         *remember_password_out,
+                                                                   
GCancellable         *cancellable,
+                                                                   GError      
        **error);
 
 G_END_DECLS
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/gnome-online-accounts-3.56.0/src/goabackend/goakerberosprovider.c 
new/gnome-online-accounts-3.56.1/src/goabackend/goakerberosprovider.c
--- old/gnome-online-accounts-3.56.0/src/goabackend/goakerberosprovider.c       
2025-09-13 20:34:22.000000000 +0200
+++ new/gnome-online-accounts-3.56.1/src/goabackend/goakerberosprovider.c       
2025-10-11 19:18:34.000000000 +0200
@@ -25,6 +25,7 @@
 #include "goakerberosprovider-priv.h"
 #include "goautils.h"
 #include "goaidentity.h"
+#include "goaidentityerror.h"
 #include "goaidentitymanagererror.h"
 
 #include <gcr/gcr.h>
@@ -253,294 +254,252 @@
 /* 
----------------------------------------------------------------------------------------------------
 */
 
 static void
-refresh_account_ticket_cb (GoaKerberosProvider *self,
-                           GAsyncResult        *result,
-                           gpointer             user_data)
+goa_kerberos_provider_set_error (GError **error)
 {
-  g_autoptr(GTask) task = G_TASK (g_steal_pointer (&user_data));
-  GError *error = NULL;
+  GQuark error_domain = GOA_ERROR;
+  int error_code = GOA_ERROR_FAILED;
+  g_autofree char *error_message = NULL;
 
-  if (!goa_kerberos_provider_get_ticket_finish (self, result, &error))
-    g_task_return_error (task, error);
-  else
-    g_task_return_boolean (task, TRUE);
-}
+  if (error != NULL && *error != NULL)
+    {
+      g_debug ("%s(): amending error (%s:%u:%s)",
+               G_STRFUNC,
+               g_quark_to_string ((*error)->domain),
+               (*error)->code,
+               (*error)->message);
 
-static void
-refresh_account (GoaProvider         *provider,
-                 GoaClient           *client,
-                 GoaObject           *object,
-                 GtkWidget           *parent,
-                 GCancellable        *cancellable,
-                 GAsyncReadyCallback  callback,
-                 gpointer             user_data)
-{
-  GoaKerberosProvider *self = GOA_KERBEROS_PROVIDER (provider);
-  g_autoptr(GTask) task = NULL;
+      g_dbus_error_strip_remote_error (*error);
+      error_domain = (*error)->domain;
+      error_code = (*error)->code;
+      error_message = g_strdup ((*error)->message);
+    }
 
-  g_assert (GOA_IS_KERBEROS_PROVIDER (provider));
-  g_assert (GOA_IS_CLIENT (client));
-  g_assert (GOA_IS_OBJECT (object));
-  g_assert (parent == NULL || GTK_IS_WIDGET (parent));
-  g_assert (cancellable == NULL || G_IS_CANCELLABLE (cancellable));
+  if (error_domain == GOA_IDENTITY_MANAGER_ERROR)
+    {
+      switch ((GoaIdentityManagerError)error_code)
+        {
+        case GOA_IDENTITY_MANAGER_ERROR_INITIALIZING:
+        case GOA_IDENTITY_MANAGER_ERROR_IDENTITY_NOT_FOUND:
+        case GOA_IDENTITY_MANAGER_ERROR_ACCESSING_CREDENTIALS:
+        case GOA_IDENTITY_MANAGER_ERROR_UNSUPPORTED_CREDENTIALS:
+          error_code = GOA_ERROR_FAILED;
+          break;
 
-  task = g_task_new (provider, cancellable, callback, user_data);
-  g_task_set_source_tag (task, refresh_account);
+        case GOA_IDENTITY_MANAGER_ERROR_CREATING_IDENTITY:
+          error_code = GOA_ERROR_NOT_AUTHORIZED;
+          g_set_str (&error_message, _("Authentication failed"));
+          break;
+        }
+    }
+  else if (error_domain == GOA_IDENTITY_ERROR)
+    {
+      switch ((GoaIdentityError)error_code)
+        {
+        case GOA_IDENTITY_ERROR_NOT_FOUND:
+        case GOA_IDENTITY_ERROR_VERIFYING:
+        case GOA_IDENTITY_ERROR_RENEWING:
+        case GOA_IDENTITY_ERROR_CREDENTIALS_UNAVAILABLE:
+        case GOA_IDENTITY_ERROR_ENUMERATING_CREDENTIALS:
+        case GOA_IDENTITY_ERROR_ALLOCATING_CREDENTIALS:
+        case GOA_IDENTITY_ERROR_SAVING_CREDENTIALS:
+        case GOA_IDENTITY_ERROR_REMOVING_CREDENTIALS:
+        case GOA_IDENTITY_ERROR_PARSING_IDENTIFIER:
+          error_code = GOA_ERROR_FAILED;
+          break;
 
-  goa_kerberos_provider_get_ticket (self,
-                                    object,
-                                    TRUE, /* Allow interaction */
-                                    cancellable,
-                                    (GAsyncReadyCallback) 
refresh_account_ticket_cb,
-                                    g_steal_pointer (&task));
+        case GOA_IDENTITY_ERROR_AUTHENTICATION_FAILED:
+          error_code = GOA_ERROR_NOT_AUTHORIZED;
+          g_set_str (&error_message, _("Authentication failed"));
+          break;
+        }
+    }
+  else if (error_message == NULL)
+    {
+      error_message = g_strdup (_("Unknown error"));
+    }
+
+  g_clear_error (error);
+  g_set_error_literal (error, GOA_ERROR, error_code, error_message);
 }
 
 /* 
----------------------------------------------------------------------------------------------------
 */
 
 typedef struct
 {
-  GcrSecretExchange *secret_exchange;
+  GoaProviderDialog *dialog;
+  GoaClient *client;
   GoaObject *object;
+  GcrSecretExchange *secret;
   gboolean remember_password;
-  gchar *principal;
-} InitialSignInData;
-
-static InitialSignInData *
-initial_sign_in_data_new (GoaObject *object, const gchar *principal)
-{
-  InitialSignInData *data;
-
-  data = g_slice_new0 (InitialSignInData);
-
-  if (object != NULL)
-    data->object = g_object_ref (object);
 
-  data->principal = g_strdup (principal);
-
-  return data;
-}
+  GtkWidget *principal;
+  GtkWidget *password;
+} AddAccountData;
 
 static void
-initial_sign_in_data_free (InitialSignInData *data)
+add_account_data_free (gpointer user_data)
 {
-  g_clear_object (&data->secret_exchange);
-  g_clear_object (&data->object);
-  g_free (data->principal);
+  AddAccountData *data = (AddAccountData *)user_data;
 
-  g_slice_free (InitialSignInData, data);
+  g_clear_object (&data->client);
+  g_clear_object (&data->object);
+  g_clear_object (&data->secret);
+  g_free (data);
 }
 
+/* 
----------------------------------------------------------------------------------------------------
 */
+
 static void
-on_initial_sign_in_done (GoaKerberosProvider *self,
-                         GAsyncResult        *result,
-                         GTask               *task)
+refresh_account_signin_cb (GoaKerberosProvider *self,
+                           GAsyncResult        *result,
+                           gpointer             user_data)
 {
-  GError     *error;
-  InitialSignInData *data;
-  char       *object_path;
-
-  data = (InitialSignInData *) g_task_get_task_data (task);
+  g_autoptr(GTask) task = G_TASK (g_steal_pointer (&user_data));
+  AddAccountData *data = g_task_get_task_data (task);
+  g_autofree char *object_path = NULL;
+  GError *error = NULL;
 
-  error = NULL;
   object_path = goa_kerberos_provider_sign_in_finish (self, result, &error);
-  if (error != NULL)
+  if (object_path == NULL)
     {
-      g_task_return_error (task, error);
-      goto out;
+      goa_kerberos_provider_set_error (&error);
+      g_task_return_error (task, g_steal_pointer (&error));
+      return;
     }
 
+  /* Save the new password */
   if (data->remember_password)
     {
-      GVariantBuilder  builder;
-
-      if (object_path != NULL && data->object != NULL)
+      GVariantBuilder builder;
+      const char *password;
+      g_autoptr(GError) password_error = NULL;
+
+      /* FIXME: we go to great lengths to keep the password in non-pageable 
memory,
+       * and then just duplicate it into a gvariant here
+       */
+      password = gcr_secret_exchange_get_secret (data->secret, NULL);
+      g_variant_builder_init (&builder, G_VARIANT_TYPE_VARDICT);
+      g_variant_builder_add (&builder,
+                             "{sv}",
+                             "password",
+                             g_variant_new_string (password));
+
+      if (!goa_utils_store_credentials_for_object_sync (GOA_PROVIDER (self),
+                                                        data->object,
+                                                        g_variant_builder_end 
(&builder),
+                                                        NULL,
+                                                        &password_error))
         {
-          const char *password;
-
-          password = gcr_secret_exchange_get_secret (data->secret_exchange, 
NULL);
-
-          /* FIXME: we go to great lengths to keep the password in 
non-pageable memory,
-           * and then just duplicate it into a gvariant here
-           */
-          g_variant_builder_init (&builder, G_VARIANT_TYPE_VARDICT);
-          g_variant_builder_add (&builder,
-                                 "{sv}",
-                                 "password",
-                                 g_variant_new_string (password));
-
-          error = NULL;
-          goa_utils_store_credentials_for_object_sync (GOA_PROVIDER (self),
-                                                       data->object,
-                                                       g_variant_builder_end 
(&builder),
-                                                       NULL,
-                                                       NULL);
+          g_warning ("%s(): %s", G_STRFUNC, password_error->message);
         }
     }
 
   g_task_return_boolean (task, TRUE);
-
- out:
-  g_free (object_path);
-  g_object_unref (task);
 }
 
 static void
-on_system_prompt_answered_for_initial_sign_in (GcrPrompt          *prompt,
-                                               GAsyncResult       *result,
-                                               GTask              *task)
-{
-  GoaKerberosProvider *self;
-  GCancellable        *cancellable;
-  GError              *error;
-  InitialSignInData   *data;
-  const char          *password;
-  const char          *preauth_source;
-  GcrSecretExchange   *secret_exchange;
-
-  self = GOA_KERBEROS_PROVIDER (g_task_get_source_object (task));
-  cancellable = g_task_get_cancellable (task);
-  data = (InitialSignInData *) g_task_get_task_data (task);
-
-  /* We currently don't prompt the user to choose a preauthentication source 
during initial sign in
-   * so we assume there's no preauthentication source
-   */
-  preauth_source = NULL;
-
-  error = NULL;
-  password = gcr_prompt_password_finish (prompt, result, &error);
+refresh_account_password_cb (GoaKerberosProvider *self,
+                             GAsyncResult        *result,
+                             gpointer             user_data)
+{
+  g_autoptr(GTask) task = G_TASK (g_steal_pointer (&user_data));
+  AddAccountData *data = g_task_get_task_data (task);
+  GCancellable *cancellable = g_task_get_cancellable (task);
+  GoaAccount *account = NULL;
+  g_autoptr(GoaTicketing) ticketing = NULL;
+  GVariant *details;
+  const char *principal;
+  const char *preauth_source;
+  GError *error = NULL;
 
-  if (password == NULL)
+  data->secret = goa_kerberos_provider_prompt_password_finish (self,
+                                                               
&data->remember_password,
+                                                               result,
+                                                               &error);
+  if (data->secret == NULL)
     {
-      gcr_system_prompt_close (GCR_SYSTEM_PROMPT (prompt), NULL, NULL);
-
-      if (error != NULL)
-        {
-          g_task_return_error (task, error);
-        }
-      else
-        {
-          g_task_return_new_error (task,
-                                   G_IO_ERROR,
-                                   G_IO_ERROR_CANCELLED,
-                                   _("Operation was cancelled"));
-        }
-
-      g_object_unref (task);
+      g_task_return_error (task, g_steal_pointer (&error));
       return;
     }
 
-  secret_exchange = gcr_system_prompt_get_secret_exchange (GCR_SYSTEM_PROMPT 
(prompt));
-  data->secret_exchange = g_object_ref (secret_exchange);
-
-  data->remember_password = gcr_prompt_get_choice_chosen (prompt);
+  account = goa_object_peek_account (data->object);
+  principal = goa_account_get_identity (account);
 
-  gcr_system_prompt_close (GCR_SYSTEM_PROMPT (prompt), NULL, NULL);
+  ticketing = goa_object_get_ticketing (data->object);
+  details = goa_ticketing_get_details (ticketing);
+  g_variant_lookup (details, "preauthentication-source", "&s", 
&preauth_source);
 
   goa_kerberos_provider_sign_in (self,
-                                 data->principal,
-                                 password,
+                                 principal,
+                                 gcr_secret_exchange_get_secret (data->secret, 
NULL),
                                  preauth_source,
                                  cancellable,
-                                 (GAsyncReadyCallback)
-                                 on_initial_sign_in_done,
-                                 task);
+                                 (GAsyncReadyCallback) 
refresh_account_signin_cb,
+                                 g_steal_pointer (&task));
 }
 
 static void
-on_system_prompt_open_for_initial_sign_in (GcrSystemPrompt     *system_prompt,
-                                           GAsyncResult        *result,
-                                           GTask               *task)
+refresh_account_ticket_cb (GoaKerberosProvider *self,
+                           GAsyncResult        *result,
+                           gpointer             user_data)
 {
-  GCancellable *cancellable;
-  GcrPrompt    *prompt = NULL;
-  GError       *error;
-
-  cancellable = g_task_get_cancellable (task);
-  error = NULL;
-  prompt = gcr_system_prompt_open_finish (result, &error);
+  g_autoptr(GTask) task = G_TASK (g_steal_pointer (&user_data));
+  GCancellable *cancellable = g_task_get_cancellable (task);
+  GError *error = NULL;
 
-  if (prompt == NULL)
+  if (goa_kerberos_provider_get_ticket_finish (self, result, &error))
     {
-      g_task_return_error (task, error);
-      g_object_unref (task);
-      goto out;
+      g_task_return_boolean (task, TRUE);
+      return;
     }
 
-  gcr_prompt_set_title (prompt, _("Log In to Realm"));
-  gcr_prompt_set_description (prompt, _("Please enter your password below."));
-  gcr_prompt_set_choice_label (prompt, _("Remember this password"));
-
-  gcr_prompt_password_async (prompt,
-                             cancellable,
-                             (GAsyncReadyCallback)
-                             on_system_prompt_answered_for_initial_sign_in,
-                             task);
-
- out:
-  g_clear_object (&prompt);
+  goa_kerberos_provider_set_error (&error);
+  if (error->code == GOA_ERROR_NOT_AUTHORIZED)
+    {
+      goa_kerberos_provider_prompt_password (self,
+                                             cancellable,
+                                             (GAsyncReadyCallback) 
refresh_account_password_cb,
+                                             g_steal_pointer (&task));
+    }
+  else
+    {
+      g_task_return_error (task, g_steal_pointer (&error));
+    }
 }
 
 static void
-perform_initial_sign_in (GoaKerberosProvider *self,
-                         GoaObject           *object,
-                         const char          *principal,
-                         GCancellable        *cancellable,
-                         GAsyncReadyCallback  callback,
-                         gpointer             user_data)
-{
-
-  GTask *task;
-  InitialSignInData *data;
-
-  data = initial_sign_in_data_new (object, principal);
-
-  task = g_task_new (self, cancellable, callback, user_data);
-  g_task_set_task_data (task, data, (GDestroyNotify) 
initial_sign_in_data_free);
-
-  gcr_system_prompt_open_async (-1,
-                                cancellable,
-                                (GAsyncReadyCallback)
-                                on_system_prompt_open_for_initial_sign_in,
-                                task);
-}
-
-static gboolean
-perform_initial_sign_in_finish (GoaKerberosProvider  *self,
-                                GAsyncResult         *result,
-                                GError              **error)
+refresh_account (GoaProvider         *provider,
+                 GoaClient           *client,
+                 GoaObject           *object,
+                 GtkWidget           *parent,
+                 GCancellable        *cancellable,
+                 GAsyncReadyCallback  callback,
+                 gpointer             user_data)
 {
-  GTask *task;
-
-  g_return_val_if_fail (GOA_IS_KERBEROS_PROVIDER (self), FALSE);
-
-  g_return_val_if_fail (g_task_is_valid (result, self), FALSE);
-  task = G_TASK (result);
-
-  g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
-
-  return g_task_propagate_boolean (task, error);
-}
-
-/* 
----------------------------------------------------------------------------------------------------
 */
+  GoaKerberosProvider *self = GOA_KERBEROS_PROVIDER (provider);
+  g_autoptr(GTask) task = NULL;
+  AddAccountData *data;
 
-typedef struct
-{
-  GoaProviderDialog *dialog;
-  GoaClient *client;
-  GoaObject *object;
+  g_assert (GOA_IS_KERBEROS_PROVIDER (provider));
+  g_assert (GOA_IS_CLIENT (client));
+  g_assert (GOA_IS_OBJECT (object));
+  g_assert (parent == NULL || GTK_IS_WIDGET (parent));
+  g_assert (cancellable == NULL || G_IS_CANCELLABLE (cancellable));
 
-  GtkWidget *principal;
-  GtkWidget *password;
-} AddAccountData;
+  data = g_new0 (AddAccountData, 1);
+  data->client = g_object_ref (client);
+  data->object = g_object_ref (object);
 
-static void
-add_account_data_free (gpointer user_data)
-{
-  AddAccountData *data = (AddAccountData *)user_data;
+  task = g_task_new (provider, cancellable, callback, user_data);
+  g_task_set_task_data (task, data, add_account_data_free);
+  g_task_set_source_tag (task, refresh_account);
 
-  g_clear_object (&data->client);
-  g_clear_object (&data->object);
-  g_free (data);
+  goa_kerberos_provider_get_ticket (self,
+                                    object,
+                                    TRUE, /* Allow interaction */
+                                    cancellable,
+                                    (GAsyncReadyCallback) 
refresh_account_ticket_cb,
+                                    g_steal_pointer (&task));
 }
 
 /* 
----------------------------------------------------------------------------------------------------
 */
@@ -624,7 +583,7 @@
 }
 
 static void
-add_account_signin_cb (GoaKerberosProvider *self,
+add_account_ticket_cb (GoaKerberosProvider *self,
                        GAsyncResult        *result,
                        gpointer             user_data)
 {
@@ -636,7 +595,7 @@
   account = goa_object_peek_account (data->object);
 
   /* If sign in fails, remove the temporary account before restarting */
-  if (!perform_initial_sign_in_finish (self, result, &error))
+  if (!goa_kerberos_provider_get_ticket_finish (self, result, &error))
     {
       goa_provider_dialog_report_error (data->dialog, error);
       goa_account_call_remove (account,
@@ -661,7 +620,6 @@
   GCancellable *cancellable = g_task_get_cancellable (task);
   g_autofree char *object_path = NULL;
   g_autoptr(GDBusObject) object = NULL;
-  const char *principal = NULL;
   g_autoptr(GError) error = NULL;
 
   if (!goa_manager_call_add_account_finish (manager, &object_path, res, 
&error))
@@ -673,15 +631,14 @@
   object = g_dbus_object_manager_get_object (goa_client_get_object_manager 
(data->client),
                                              object_path);
   g_set_object (&data->object, GOA_OBJECT (object));
-  principal = gtk_editable_get_text (GTK_EDITABLE (data->principal));
 
   /* Sign in the temporary account */
-  perform_initial_sign_in (GOA_KERBEROS_PROVIDER (provider),
-                           GOA_OBJECT (object),
-                           principal,
-                           cancellable,
-                           (GAsyncReadyCallback) add_account_signin_cb,
-                           g_steal_pointer (&task));
+  goa_kerberos_provider_get_ticket (GOA_KERBEROS_PROVIDER (provider),
+                                    data->object,
+                                    TRUE,
+                                    cancellable,
+                                    (GAsyncReadyCallback) 
add_account_ticket_cb,
+                                    g_steal_pointer (&task));
 }
 
 static void
@@ -874,26 +831,7 @@
 
       if (!ticket_synced)
         {
-          g_dbus_error_strip_remote_error (lookup_error);
-          if (lookup_error->domain == GOA_IDENTITY_MANAGER_ERROR)
-            {
-              lookup_error->domain = GOA_ERROR;
-
-              switch ((GoaIdentityManagerError)lookup_error->code)
-                {
-                case GOA_IDENTITY_MANAGER_ERROR_INITIALIZING:
-                  lookup_error->code = GOA_ERROR_FAILED;
-                  break;
-
-                case GOA_IDENTITY_MANAGER_ERROR_IDENTITY_NOT_FOUND:
-                case GOA_IDENTITY_MANAGER_ERROR_CREATING_IDENTITY:
-                case GOA_IDENTITY_MANAGER_ERROR_ACCESSING_CREDENTIALS:
-                case GOA_IDENTITY_MANAGER_ERROR_UNSUPPORTED_CREDENTIALS:
-                  lookup_error->code = GOA_ERROR_NOT_AUTHORIZED;
-                  break;
-                }
-            }
-
+          goa_kerberos_provider_set_error (&lookup_error);
           g_propagate_error (error, g_steal_pointer (&lookup_error));
           goto out;
         }
@@ -1160,11 +1098,12 @@
   provider_class->remove_account_finish      = remove_account_finish;
 
   /* this will force associating errors in the
-   * GOA_IDENTITY_MANAGER_ERROR error domain with
-   * org.gnome.Identity.Manager.Error.* errors via
-   * g_dbus_error_register_error_domain().
+   * GOA_IDENTITY_ERROR and GOA_IDENTITY_MANAGER_ERROR error domains
+   * with org.gnome.Identity.Error.* and org.gnome.Identity.Manager.Error.*
+   * errors via g_dbus_error_register_error_domain().
    */
   goa_identity_manager_error_quark ();
+  goa_identity_error_quark ();
 }
 
 /* 
----------------------------------------------------------------------------------------------------
 */
@@ -1291,6 +1230,8 @@
   const char *preauth_source = NULL;
   gboolean has_password = FALSE;
   g_autofree char *object_path = NULL;
+  g_autoptr(GcrSecretExchange) password_exchange = NULL;
+  gboolean remember_password = FALSE;
   g_autoptr(GError) lookup_error = NULL;
   GError *sign_in_error = NULL;
 
@@ -1337,14 +1278,26 @@
   if (credentials != NULL)
     has_password = g_variant_lookup (credentials, "password", "&s", &password);
 
-  if (!has_password && !is_interactive)
+  if (!has_password)
     {
-      g_set_error (error,
-                   GOA_ERROR,
-                   GOA_ERROR_NOT_AUTHORIZED,
-                   _("Did not find password for principal “%s” in 
credentials"),
-                   identifier);
-      return FALSE;
+      if (!is_interactive)
+        {
+          g_set_error (error,
+                       GOA_ERROR,
+                       GOA_ERROR_NOT_AUTHORIZED,
+                       _("Did not find password for principal “%s” in 
credentials"),
+                       identifier);
+          return FALSE;
+        }
+
+      password_exchange = goa_kerberos_provider_prompt_password_sync (self,
+                                                                      
&remember_password,
+                                                                      
cancellable,
+                                                                      error);
+      if (password_exchange == NULL)
+        return FALSE;
+
+      password = gcr_secret_exchange_get_secret (password_exchange, NULL);
     }
 
   object_path = goa_kerberos_provider_sign_in_sync (self,
@@ -1353,13 +1306,36 @@
                                                     preauth_source,
                                                     cancellable,
                                                     &sign_in_error);
-
   if (sign_in_error != NULL)
     {
       g_propagate_error (error, sign_in_error);
       return FALSE;
     }
 
+  if (object_path != NULL && remember_password)
+    {
+      GVariantBuilder builder;
+      g_autoptr(GError) password_error = NULL;
+
+      /* FIXME: we go to great lengths to keep the password in non-pageable 
memory,
+       * and then just duplicate it into a gvariant here
+       */
+      g_variant_builder_init (&builder, G_VARIANT_TYPE_VARDICT);
+      g_variant_builder_add (&builder,
+                             "{sv}",
+                             "password",
+                             g_variant_new_string (password));
+
+      if (!goa_utils_store_credentials_for_object_sync (GOA_PROVIDER (self),
+                                                        object,
+                                                        g_variant_builder_end 
(&builder),
+                                                        NULL,
+                                                        &password_error))
+        {
+          g_warning ("%s(): %s", G_STRFUNC, password_error->message);
+        }
+    }
+
   return TRUE;
 }
 
@@ -1367,6 +1343,169 @@
 
 typedef struct
 {
+  GcrSecretExchange *secret_exchange;
+  gboolean remember_password;
+} PromptPasswordData;
+
+static void
+prompt_password_data_free (gpointer user_data)
+{
+  PromptPasswordData *data = (PromptPasswordData *)user_data;
+
+  g_clear_object (&data->secret_exchange);
+  g_free (data);
+}
+
+static void
+prompt_password_thread (GTask        *task,
+                        gpointer      source_object,
+                        gpointer      task_data,
+                        GCancellable *cancellable)
+{
+  GoaKerberosProvider *self = GOA_KERBEROS_PROVIDER (source_object);
+  PromptPasswordData *data = (PromptPasswordData *) task_data;
+  GError *error = NULL;
+
+  data->secret_exchange = goa_kerberos_provider_prompt_password_sync (self,
+                                                                      
&data->remember_password,
+                                                                      
cancellable,
+                                                                      &error);
+  if (data->secret_exchange == NULL)
+    g_task_return_error (task, g_steal_pointer (&error));
+  else
+    g_task_return_boolean (task, TRUE);
+}
+
+/*< private >
+ * goa_kerberos_provider_prompt_password:
+ * @self: a `GoaKerberosProvider`
+ * @cancellable: (nullable): a `GCancellable`
+ * @callback: (scope async): a `GAsyncReadyCallback`
+ * @user_data: (closure): user supplied data
+ *
+ * Prompt the user for a password.
+ *
+ * Call [[email protected]_password_finish] to get the result.
+ */
+void
+goa_kerberos_provider_prompt_password (GoaKerberosProvider *self,
+                                       GCancellable        *cancellable,
+                                       GAsyncReadyCallback  callback,
+                                       gpointer             user_data)
+{
+  g_autoptr(GTask) task = NULL;
+
+  g_return_if_fail (GOA_IS_KERBEROS_PROVIDER (self));
+  g_return_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable));
+
+  task = g_task_new (self, cancellable, callback, user_data);
+  g_task_set_source_tag (task, goa_kerberos_provider_prompt_password);
+  g_task_set_task_data (task, g_new0 (PromptPasswordData, 1), 
prompt_password_data_free);
+  g_task_run_in_thread (task, prompt_password_thread);
+}
+
+/*< private >
+ * goa_kerberos_provider_prompt_password_finish:
+ * @self: a `GoaKerberosProvider`
+ * @remember_password_out: (nullable) (out): whether to
+ * @result: a `GAsyncResult`
+ * @error: (nullable): a `GError`
+ *
+ * Finish an operation started with 
[[email protected]_password].
+ *
+ * If @remember_password_out is not %NULL, the user's preference for
+ * remembering the password will be set to %TRUE or %FALSE.
+ *
+ * Returns: (nullable) (transfer full): a secret exchange on success,
+ *   or %NULL with @error set
+ */
+GcrSecretExchange *
+goa_kerberos_provider_prompt_password_finish (GoaKerberosProvider  *self,
+                                              gboolean             
*remember_password_out,
+                                              GAsyncResult         *result,
+                                              GError              **error)
+{
+  PromptPasswordData *data;
+
+  g_return_val_if_fail (GOA_IS_KERBEROS_PROVIDER (self), NULL);
+  g_return_val_if_fail (g_task_is_valid (result, self), NULL);
+  g_return_val_if_fail (error == NULL || *error == NULL, NULL);
+
+  if (!g_task_propagate_boolean (G_TASK (result), error))
+    return NULL;
+
+  data = g_task_get_task_data (G_TASK (result));
+  if (remember_password_out != NULL)
+    *remember_password_out = data->remember_password;
+
+  return g_object_ref (data->secret_exchange);
+}
+
+/*< private >
+ * goa_kerberos_provider_prompt_password_sync:
+ * @self: a `GoaKerberosProvider`
+ * @remember_password_out: (nullable) (out): whether password should be saved
+ * @cancellable: (nullable): a `GCancellable`
+ * @error: (nullable): a `GError`
+ *
+ * Prompt the user for a password.
+ *
+ * If @remember_password_out is not %NULL, the user's preference for
+ * remembering the password will be set to %TRUE or %FALSE.
+ *
+ * Returns: (nullable) (transfer full): the secret exchange on success,
+ *   or %NULL with @error set
+ */
+GcrSecretExchange *
+goa_kerberos_provider_prompt_password_sync (GoaKerberosProvider  *self,
+                                            gboolean             
*remember_password_out,
+                                            GCancellable         *cancellable,
+                                            GError              **error)
+{
+  g_autoptr(GcrPrompt) prompt = NULL;
+  GcrSecretExchange *secret_exchange = NULL;
+
+  g_return_val_if_fail (GOA_IS_KERBEROS_PROVIDER (self), NULL);
+  g_return_val_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable), 
NULL);
+  g_return_val_if_fail (error == NULL || *error == NULL, NULL);
+
+  prompt = gcr_system_prompt_open (-1, cancellable, error);
+  if (prompt == NULL)
+    {
+      return NULL;
+    }
+
+  gcr_prompt_set_title (prompt, _("Log In to Realm"));
+  gcr_prompt_set_description (prompt, _("Please enter your password below."));
+  gcr_prompt_set_choice_label (prompt, _("Remember this password"));
+
+  if (gcr_prompt_password (prompt, cancellable, error) == NULL)
+    {
+      gcr_system_prompt_close (GCR_SYSTEM_PROMPT (prompt), NULL, NULL);
+      if (error != NULL && *error == NULL)
+        {
+          g_set_error_literal (error,
+                               G_IO_ERROR,
+                               G_IO_ERROR_CANCELLED,
+                               _("Operation was cancelled"));
+        }
+
+      return NULL;
+    }
+
+  secret_exchange = gcr_system_prompt_get_secret_exchange (GCR_SYSTEM_PROMPT 
(prompt));
+  if (remember_password_out != NULL)
+    *remember_password_out = gcr_prompt_get_choice_chosen (prompt);
+
+  gcr_system_prompt_close (GCR_SYSTEM_PROMPT (prompt), NULL, NULL);
+
+  return g_object_ref (secret_exchange);
+}
+
+/* 
----------------------------------------------------------------------------------------------------
 */
+
+typedef struct
+{
   char *identifier;
   char *password;
   char *preauth_source;
@@ -1410,7 +1549,7 @@
  * goa_kerberos_provider_sign_in:
  * @self: a `GoaKerberosProvider`
  * @identity: the identity
- * @password: the password
+ * @password: (nullable): the password
  * @preauth_source: (nullable): a pre-auth source
  * @cancellable: (nullable): a `GCancellable`
  * @callback: (scope async): a `GAsyncReadyCallback`
@@ -1418,6 +1557,9 @@
  *
  * Sign in a kerberos identity.
  *
+ * If @password is %NULL, the user will be prompted to provide it,
+ * but it will not be saved in the keyring.
+ *
  * Returns: %TRUE on success, or %FALSE with @error set
  */
 void
@@ -1434,7 +1576,7 @@
 
   g_return_if_fail (GOA_IS_PROVIDER (self));
   g_return_if_fail (identifier != NULL && *identifier != '\0');
-  g_return_if_fail (password != NULL && *password != '\0');
+  g_return_if_fail (password == NULL || *password != '\0');
   g_return_if_fail (preauth_source == NULL || *preauth_source != '\0');
   g_return_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable));
 
@@ -1475,13 +1617,16 @@
  * goa_kerberos_provider_sign_in_sync:
  * @self: a `GoaKerberosProvider`
  * @identity: the identity
- * @password: the password
+ * @password: (nullable): the password
  * @preauth_source: (nullable): a pre-auth source
  * @cancellable: (nullable): a `GCancellable`
  * @error: (nullable): a `GError`
  *
  * Sign in a kerberos identity.
  *
+ * If @password is %NULL, the user will be prompted to provide it,
+ * but it will not be saved in the keyring.
+ *
  * Returns: %TRUE on success, or %FALSE with @error set
  */
 char *
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/gnome-online-accounts-3.56.0/src/goabackend/goasmtpauth.c 
new/gnome-online-accounts-3.56.1/src/goabackend/goasmtpauth.c
--- old/gnome-online-accounts-3.56.0/src/goabackend/goasmtpauth.c       
2025-09-13 20:34:22.000000000 +0200
+++ new/gnome-online-accounts-3.56.1/src/goabackend/goasmtpauth.c       
2025-10-11 19:18:34.000000000 +0200
@@ -369,12 +369,15 @@
 /**
  * goa_smtp_auth_new:
  * @domain: The domain to use.
- * @username: The user name to use.
- * @password: The password to use.
+ * @username: (nullable): The user name to use.
+ * @password: (nullable): The password to use.
  *
  * Creates a new #GoaMailAuth to be used for username/password
  * authentication using LOGIN or PLAIN over SMTP.
  *
+ * If either @username or @password are %NULL, authentication will only
+ * succeed if the service supports it.
+ *
  * Returns: (type GoaSmtpAuth): A #GoaSmtpAuth. Free with
  * g_object_unref().
  */
@@ -384,8 +387,8 @@
                    const gchar       *password)
 {
   g_return_val_if_fail (domain != NULL && domain[0] != '\0', NULL);
-  g_return_val_if_fail (username != NULL, NULL);
-  g_return_val_if_fail (password != NULL && password[0] != '\0', NULL);
+  g_return_val_if_fail (username != NULL || (username == NULL && password == 
NULL), NULL);
+  g_return_val_if_fail (password == NULL || password[0] != '\0', NULL);
 
   return GOA_MAIL_AUTH (g_object_new (GOA_TYPE_SMTP_AUTH,
                                       "domain", domain,
@@ -484,6 +487,14 @@
       ret = TRUE;
       goto out;
     }
+  else if (self->username == NULL && self->password == NULL)
+    {
+      g_set_error (error,
+                   GOA_ERROR,
+                   GOA_ERROR_NOT_AUTHORIZED,
+                   _("Authentication failed"));
+      goto out;
+    }
   else if (!self->login_supported && !self->plain_supported)
     {
       g_set_error (error,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/gnome-online-accounts-3.56.0/src/goabackend/meson.build 
new/gnome-online-accounts-3.56.1/src/goabackend/meson.build
--- old/gnome-online-accounts-3.56.0/src/goabackend/meson.build 2025-09-13 
20:34:22.000000000 +0200
+++ new/gnome-online-accounts-3.56.1/src/goabackend/meson.build 2025-10-11 
19:18:34.000000000 +0200
@@ -94,7 +94,7 @@
 endif
 
 if enable_fedora or enable_kerberos
-  libgoa_backend_sources += identity_dbus_sources + identity_manager_error_src
+  libgoa_backend_sources += identity_dbus_sources + identity_error_sources
   incs += goaidentity_inc
   deps += [gcr_dep]
 endif
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/gnome-online-accounts-3.56.0/src/goaidentity/goaidentity.c 
new/gnome-online-accounts-3.56.1/src/goaidentity/goaidentity.c
--- old/gnome-online-accounts-3.56.0/src/goaidentity/goaidentity.c      
2025-09-13 20:34:22.000000000 +0200
+++ new/gnome-online-accounts-3.56.1/src/goaidentity/goaidentity.c      
2025-10-11 19:18:34.000000000 +0200
@@ -62,19 +62,6 @@
                                                            -1, 
G_PARAM_READABLE));
 }
 
-GQuark
-goa_identity_error_quark (void)
-{
-  static GQuark error_quark = 0;
-
-  if (error_quark == 0)
-    {
-      error_quark = g_quark_from_static_string ("goa-identity-error");
-    }
-
-  return error_quark;
-}
-
 const char *
 goa_identity_get_identifier (GoaIdentity *self)
 {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/gnome-online-accounts-3.56.0/src/goaidentity/goaidentity.h 
new/gnome-online-accounts-3.56.1/src/goaidentity/goaidentity.h
--- old/gnome-online-accounts-3.56.0/src/goaidentity/goaidentity.h      
2025-09-13 20:34:22.000000000 +0200
+++ new/gnome-online-accounts-3.56.1/src/goaidentity/goaidentity.h      
2025-10-11 19:18:34.000000000 +0200
@@ -27,8 +27,6 @@
 #define GOA_TYPE_IDENTITY (goa_identity_get_type ())
 G_DECLARE_INTERFACE (GoaIdentity, goa_identity, GOA, IDENTITY, GObject);
 
-#define GOA_IDENTITY_ERROR (goa_identity_error_quark ())
-
 struct _GoaIdentityInterface
 {
   GTypeInterface base_interface;
@@ -39,28 +37,12 @@
 
 typedef enum
 {
-  GOA_IDENTITY_ERROR_NOT_FOUND,
-  GOA_IDENTITY_ERROR_VERIFYING,
-  GOA_IDENTITY_ERROR_RENEWING,
-  GOA_IDENTITY_ERROR_CREDENTIALS_UNAVAILABLE,
-  GOA_IDENTITY_ERROR_ENUMERATING_CREDENTIALS,
-  GOA_IDENTITY_ERROR_ALLOCATING_CREDENTIALS,
-  GOA_IDENTITY_ERROR_AUTHENTICATION_FAILED,
-  GOA_IDENTITY_ERROR_SAVING_CREDENTIALS,
-  GOA_IDENTITY_ERROR_REMOVING_CREDENTIALS,
-  GOA_IDENTITY_ERROR_PARSING_IDENTIFIER,
-} GoaIdentityError;
-
-typedef enum
-{
   GOA_IDENTITY_SIGN_IN_FLAGS_NONE                        = 0,
   GOA_IDENTITY_SIGN_IN_FLAGS_DISALLOW_RENEWAL            = 1,
   GOA_IDENTITY_SIGN_IN_FLAGS_DISALLOW_FORWARDING         = 1 << 1,
   GOA_IDENTITY_SIGN_IN_FLAGS_DISALLOW_PROXYING           = 1 << 2
 } GoaIdentitySignInFlags;
 
-GQuark goa_identity_error_quark (void);
-
 const char  *goa_identity_get_identifier            (GoaIdentity *identity);
 gboolean     goa_identity_is_signed_in              (GoaIdentity *identity);
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/gnome-online-accounts-3.56.0/src/goaidentity/goaidentityerror.c 
new/gnome-online-accounts-3.56.1/src/goaidentity/goaidentityerror.c
--- old/gnome-online-accounts-3.56.0/src/goaidentity/goaidentityerror.c 
1970-01-01 01:00:00.000000000 +0100
+++ new/gnome-online-accounts-3.56.1/src/goaidentity/goaidentityerror.c 
2025-10-11 19:18:34.000000000 +0200
@@ -0,0 +1,50 @@
+/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
+/*
+ * Copyright © 2025 GNOME Foundation Inc.
+ * Contributor: Andy Holmes <[email protected]>
+ *
+ * This library 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 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 
<http://www.gnu.org/licenses/>.
+ */
+
+#include "config.h"
+
+#include <gio/gio.h>
+
+#include "goaidentityerror.h"
+
+static const GDBusErrorEntry dbus_error_entries[] =
+{
+  {GOA_IDENTITY_ERROR_NOT_FOUND,                  
"org.gnome.Identity.Error.NotFound"},
+  {GOA_IDENTITY_ERROR_VERIFYING,                  
"org.gnome.Identity.Error.Verifying"},
+  {GOA_IDENTITY_ERROR_RENEWING,                   
"org.gnome.Identity.Error.Renewing"},
+  {GOA_IDENTITY_ERROR_CREDENTIALS_UNAVAILABLE,    
"org.gnome.Identity.Error.CredentialsUnavailable"},
+  {GOA_IDENTITY_ERROR_ENUMERATING_CREDENTIALS,    
"org.gnome.Identity.Error.EnumeratingCredentials"},
+  {GOA_IDENTITY_ERROR_ALLOCATING_CREDENTIALS,     
"org.gnome.Identity.Error.AllocatingCredentials"},
+  {GOA_IDENTITY_ERROR_AUTHENTICATION_FAILED,      
"org.gnome.Identity.Error.AuthenticationFailed"},
+  {GOA_IDENTITY_ERROR_SAVING_CREDENTIALS,         
"org.gnome.Identity.Error.SavingCredentials"},
+  {GOA_IDENTITY_ERROR_REMOVING_CREDENTIALS,       
"org.gnome.Identity.Error.RemovingCredentials"},
+  {GOA_IDENTITY_ERROR_PARSING_IDENTIFIER,         
"org.gnome.Identity.Error.ParsingIdentifier"}
+};
+
+GQuark
+goa_identity_error_quark (void)
+{
+  G_STATIC_ASSERT (G_N_ELEMENTS (dbus_error_entries) == 
GOA_IDENTITY_ERROR_NUM_ENTRIES);
+  static gsize quark = 0;
+  g_dbus_error_register_error_domain ("goa-identity-error",
+                                      &quark,
+                                      dbus_error_entries,
+                                      G_N_ELEMENTS (dbus_error_entries));
+  return (GQuark) quark;
+}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/gnome-online-accounts-3.56.0/src/goaidentity/goaidentityerror.h 
new/gnome-online-accounts-3.56.1/src/goaidentity/goaidentityerror.h
--- old/gnome-online-accounts-3.56.0/src/goaidentity/goaidentityerror.h 
1970-01-01 01:00:00.000000000 +0100
+++ new/gnome-online-accounts-3.56.1/src/goaidentity/goaidentityerror.h 
2025-10-11 19:18:34.000000000 +0200
@@ -0,0 +1,49 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
+ *
+ * Copyright © 2025 GNOME Foundation Inc.
+ * Contributor: Andy Holmes <[email protected]>
+ *
+ * This library 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 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 
<http://www.gnu.org/licenses/>.
+ */
+
+#ifndef __GOA_IDENTITY_ERROR_H__
+#define __GOA_IDENTITY_ERROR_H__
+
+#include <glib.h>
+
+G_BEGIN_DECLS
+
+#define GOA_IDENTITY_ERROR (goa_identity_error_quark ())
+
+#define GOA_IDENTITY_ERROR_NUM_ENTRIES (GOA_IDENTITY_ERROR_PARSING_IDENTIFIER 
+ 1)
+
+typedef enum
+{
+  GOA_IDENTITY_ERROR_NOT_FOUND,               /* org.gnome.Identity.NotFound */
+  GOA_IDENTITY_ERROR_VERIFYING,               /* org.gnome.Identity.Verifying 
*/
+  GOA_IDENTITY_ERROR_RENEWING,                /* org.gnome.Identity.Renewing */
+  GOA_IDENTITY_ERROR_CREDENTIALS_UNAVAILABLE, /* 
org.gnome.Identity.CredentialsUnavailable */
+  GOA_IDENTITY_ERROR_ENUMERATING_CREDENTIALS, /* 
org.gnome.Identity.EnumeratingCredentials */
+  GOA_IDENTITY_ERROR_ALLOCATING_CREDENTIALS,  /* 
org.gnome.Identity.AllocatingCredentials */
+  GOA_IDENTITY_ERROR_AUTHENTICATION_FAILED,   /* 
org.gnome.Identity.AuthenticationFailed */
+  GOA_IDENTITY_ERROR_SAVING_CREDENTIALS,      /* 
org.gnome.Identity.SavingCredentials */
+  GOA_IDENTITY_ERROR_REMOVING_CREDENTIALS,    /* 
org.gnome.Identity.RemovingCredentials */
+  GOA_IDENTITY_ERROR_PARSING_IDENTIFIER,      /* 
org.gnome.Identity.ParsingIdentifier */
+} GoaIdentityError;
+
+GQuark goa_identity_error_quark (void);
+
+G_END_DECLS
+
+#endif /* __GOA_IDENTITY_ERROR_H__ */
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/gnome-online-accounts-3.56.0/src/goaidentity/goaidentityservice.c 
new/gnome-online-accounts-3.56.1/src/goaidentity/goaidentityservice.c
--- old/gnome-online-accounts-3.56.0/src/goaidentity/goaidentityservice.c       
2025-09-13 20:34:22.000000000 +0200
+++ new/gnome-online-accounts-3.56.1/src/goaidentity/goaidentityservice.c       
2025-10-11 19:18:34.000000000 +0200
@@ -31,6 +31,7 @@
 #include <goa/goa.h>
 
 #include "goaidentityenumtypes.h"
+#include "goaidentityerror.h"
 #include "goaidentitymanagererror.h"
 #include "goaidentityutils.h"
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/gnome-online-accounts-3.56.0/src/goaidentity/goakerberosidentity.c 
new/gnome-online-accounts-3.56.1/src/goaidentity/goakerberosidentity.c
--- old/gnome-online-accounts-3.56.0/src/goaidentity/goakerberosidentity.c      
2025-09-13 20:34:22.000000000 +0200
+++ new/gnome-online-accounts-3.56.1/src/goaidentity/goakerberosidentity.c      
2025-10-11 19:18:34.000000000 +0200
@@ -19,6 +19,7 @@
 #include "config.h"
 
 #include "goaidentity.h"
+#include "goaidentityerror.h"
 #include "goakerberosidentity.h"
 #include "goakerberosidentityinquiry.h"
 #include "goaalarm.h"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/gnome-online-accounts-3.56.0/src/goaidentity/meson.build 
new/gnome-online-accounts-3.56.1/src/goaidentity/meson.build
--- old/gnome-online-accounts-3.56.0/src/goaidentity/meson.build        
2025-09-13 20:34:22.000000000 +0200
+++ new/gnome-online-accounts-3.56.1/src/goaidentity/meson.build        
2025-10-11 19:18:34.000000000 +0200
@@ -3,6 +3,7 @@
 headers = files(
   'goaalarm.h',
   'goaidentity.h',
+  'goaidentityerror.h',
   'goaidentityinquiry.h',
   'goaidentityinquiryprivate.h',
   'goaidentityservice.h',
@@ -27,9 +28,12 @@
   annotations: [dbus, 'org.gtk.GDBus.C.Name', 'Identity']
 )
 
-identity_manager_error_src = files('goaidentitymanagererror.c')
+identity_error_sources = files(
+  'goaidentityerror.c',
+  'goaidentitymanagererror.c',
+)
 
-sources = identity_manager_error_src + files(
+sources = identity_error_sources + files(
   'goaalarm.c',
   'goaidentity.c',
   'goaidentityinquiry.c',

++++++ gnome-online-accounts.obsinfo ++++++
--- /var/tmp/diff_new_pack.jxuBcu/_old  2025-10-14 18:08:04.442167164 +0200
+++ /var/tmp/diff_new_pack.jxuBcu/_new  2025-10-14 18:08:04.446167334 +0200
@@ -1,5 +1,5 @@
 name: gnome-online-accounts
-version: 3.56.0
-mtime: 1757788462
-commit: 49234c5ca59f8416978ec96c6590ad74239d663e
+version: 3.56.1
+mtime: 1760203114
+commit: 346822746be2b0f14f9783c2fca0aa99a40cca1b
 

Reply via email to