]> git.pld-linux.org Git - packages/evolution-data-server.git/commitdiff
- Ported from upstream branch, fixes BGO #531439 and BGO #354923
authordeejay1 <deejay1@pld-linux.org>
Tue, 20 May 2008 17:18:03 +0000 (17:18 +0000)
committercvs2git <feedback@pld-linux.org>
Sun, 24 Jun 2012 12:13:13 +0000 (12:13 +0000)
- Fixes some mail and gpg password issues

Changed files:
    evolution-data-server-passwords.patch -> 1.1

evolution-data-server-passwords.patch [new file with mode: 0644]

diff --git a/evolution-data-server-passwords.patch b/evolution-data-server-passwords.patch
new file mode 100644 (file)
index 0000000..be20492
--- /dev/null
@@ -0,0 +1,324 @@
+Index: libedataserverui/e-passwords.c
+===================================================================
+--- libedataserverui/e-passwords.c     (wersja 8811)
++++ libedataserverui/e-passwords.c     (wersja 8815)
+@@ -208,38 +208,50 @@
+ }
+ static EUri *
+-ep_keyring_uri_new (const gchar *string)
++ep_keyring_uri_new (const gchar *string,
++                    GError **error)
+ {
+       EUri *uri;
+       uri = e_uri_new (string);
+-      if (uri == NULL)
+-              return NULL;
++      g_return_val_if_fail (uri != NULL, NULL);
+       /* LDAP URIs do not have usernames, so use the URI as the username. */
+       if (uri->user == NULL && uri->protocol != NULL &&
+                       (strcmp (uri->protocol, "ldap") == 0|| strcmp (uri->protocol, "google") == 0))
+               uri->user = g_strdelimit (g_strdup (string), "/=", '_');
++      /* Make sure the URI has the required components. */
++      if (uri->user == NULL && uri->host == NULL) {
++              g_set_error (
++                      error, EP_KEYRING_ERROR,
++                      GNOME_KEYRING_RESULT_BAD_ARGUMENTS,
++                      _("Keyring key is unusable: no user or host name"));
++              e_uri_free (uri);
++              uri = NULL;
++      }
++
+       return uri;
+ }
+ static gboolean
+ ep_keyring_validate (const gchar *user,
+                      const gchar *server,
++                     const gchar *protocol,
+                      GnomeKeyringAttributeList *attributes)
+ {
+       const gchar *user_value = NULL;
+       const gchar *server_value = NULL;
++      const gchar *protocol_value = NULL;
+       gint ii;
+       g_return_val_if_fail (attributes != NULL, FALSE);
+       /* Is there anything to validate? */
+-      if (user == NULL && server == NULL)
++      if (user == NULL && server == NULL && protocol == NULL)
+               return TRUE;
+-      /* Look for "user" and "server" attributes. */
++      /* Look for "user", "server", and "protocol" attributes. */
+       for (ii = 0; ii < attributes->len; ii++) {
+               GnomeKeyringAttribute *attr;
+@@ -250,6 +262,8 @@
+                       user_value = attr->value.string;
+               else if (strcmp (attr->name, "server") == 0)
+                       server_value = attr->value.string;
++              else if (strcmp (attr->name, "protocol") == 0)
++                      protocol_value = attr->value.string;
+       }
+       /* Is there a "user" attribute? */
+@@ -268,12 +282,21 @@
+       if (server != NULL && strcmp (server, server_value) != 0)
+               return FALSE;
++      /* Is there a "protocol" attribute? */
++      if (protocol != NULL && protocol_value == NULL)
++              return FALSE;
++
++      /* Does it match what we're looking for? */
++      if (protocol != NULL && strcmp (protocol, protocol_value) != 0)
++              return FALSE;
++
+       return TRUE;
+ }
+ static gboolean
+ ep_keyring_delete_passwords (const gchar *user,
+                              const gchar *server,
++                             const gchar *protocol,
+                              GList *passwords,
+                              GError **error)
+ {
+@@ -282,9 +305,14 @@
+               GnomeKeyringResult result;
+               /* Validate the item before deleting it. */
+-              if (!ep_keyring_validate (user, server, found->attributes)) {
+-                      passwords = g_list_next (passwords);
+-                      continue;
++              if (!ep_keyring_validate (user, server, protocol, found->attributes)) {
++                      /* XXX We didn't always store protocols in the
++                       *     keyring, so for backward-compatibility
++                       *     try validating by user and server only. */
++                      if (!ep_keyring_validate (user, server, NULL, found->attributes)) {
++                              passwords = g_list_next (passwords);
++                              continue;
++                      }
+               }
+               result = gnome_keyring_item_delete_sync (NULL, found->item_id);
+@@ -306,6 +334,7 @@
+ static gboolean
+ ep_keyring_insert_password (const gchar *user,
+                             const gchar *server,
++                            const gchar *protocol,
+                             const gchar *display_name,
+                             const gchar *password,
+                             GError **error)
+@@ -316,6 +345,7 @@
+       g_return_val_if_fail (user != NULL, FALSE);
+       g_return_val_if_fail (server != NULL, FALSE);
++      g_return_val_if_fail (protocol != NULL, FALSE);
+       g_return_val_if_fail (display_name != NULL, FALSE);
+       g_return_val_if_fail (password != NULL, FALSE);
+@@ -326,6 +356,8 @@
+               attributes, "user", user);
+       gnome_keyring_attribute_list_append_string (
+               attributes, "server", server);
++      gnome_keyring_attribute_list_append_string (
++              attributes, "protocol", protocol);
+       /* XXX We don't use item_id but gnome-keyring doesn't allow
+        *     for a NULL pointer.  In fact it doesn't even check! */
+@@ -348,6 +380,7 @@
+ static GList *
+ ep_keyring_lookup_passwords (const gchar *user,
+                              const gchar *server,
++                             const gchar *protocol,
+                              GError **error)
+ {
+       GnomeKeyringAttributeList *attributes;
+@@ -363,6 +396,9 @@
+       if (server != NULL)
+               gnome_keyring_attribute_list_append_string (
+                       attributes, "server", server);
++      if (protocol != NULL)
++              gnome_keyring_attribute_list_append_string (
++                      attributes, "protocol", protocol);
+       result = gnome_keyring_find_items_sync (
+               GNOME_KEYRING_ITEM_NETWORK_PASSWORD, attributes, &passwords);
+@@ -502,9 +538,9 @@
+       GError *error = NULL;
+       /* Find all Evolution passwords and delete them. */
+-      passwords = ep_keyring_lookup_passwords (NULL, NULL, &error);
++      passwords = ep_keyring_lookup_passwords (NULL, NULL, NULL, &error);
+       if (passwords != NULL) {
+-              ep_keyring_delete_passwords (NULL, NULL, passwords, &error);
++              ep_keyring_delete_passwords (NULL, NULL, NULL, passwords, &error);
+               gnome_keyring_found_list_free (passwords);
+       }
+@@ -532,9 +568,9 @@
+       /* Not finding the requested group is acceptable, but we still
+        * want to leave an informational message on the terminal. */
+-        else if (g_error_matches (error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_GROUP_NOT_FOUND)) {
+-                g_message ("%s", error->message);
+-                g_error_free (error);
++      else if (g_error_matches (error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_GROUP_NOT_FOUND)) {
++              g_message ("%s", error->message);
++              g_error_free (error);
+       } else if (error != NULL)
+               g_propagate_error (&msg->error, error);
+@@ -566,9 +602,9 @@
+       GError *error = NULL;
+       /* Find all Evolution passwords and delete them. */
+-      passwords = ep_keyring_lookup_passwords (NULL, NULL, &error);
++      passwords = ep_keyring_lookup_passwords (NULL, NULL, NULL, &error);
+       if (passwords != NULL) {
+-              ep_keyring_delete_passwords (NULL, NULL, passwords, &error);
++              ep_keyring_delete_passwords (NULL, NULL, NULL, passwords, &error);
+               gnome_keyring_found_list_free (passwords);
+       }
+@@ -641,12 +677,13 @@
+               return;
+       }
+-      uri = ep_keyring_uri_new (msg->key);
+-      g_return_if_fail (uri != NULL);
++      uri = ep_keyring_uri_new (msg->key, &msg->error);
++      if (uri == NULL)
++              return;
+       /* Only remove the password from the session hash
+        * if the keyring insertion was successful. */
+-      if (ep_keyring_insert_password (uri->user, uri->host, msg->key, password, &error))
++      if (ep_keyring_insert_password (uri->user, uri->host, uri->protocol, msg->key, password, &error))
+               g_hash_table_remove (password_cache, msg->key);
+       if (error != NULL)
+@@ -704,13 +741,21 @@
+       EUri *uri;
+       GError *error = NULL;
+-      uri = ep_keyring_uri_new (msg->key);
+-      g_return_if_fail (uri != NULL);
++      uri = ep_keyring_uri_new (msg->key, &msg->error);
++      if (uri == NULL)
++              return;
+-      /* Find all Evolution passwords matching the URI and delete them. */
+-      passwords = ep_keyring_lookup_passwords (uri->user, uri->host, &error);
++      /* Find all Evolution passwords matching the URI and delete them.
++       *
++       * XXX We didn't always store protocols in the keyring, so for
++       *     backward-compatibility we need to lookup passwords by user
++       *     and host only (no protocol).  But we do send the protocol
++       *     to ep_keyring_delete_passwords(), which also knows about
++       *     the backward-compatibility issue and will filter the list
++       *     appropriately. */
++      passwords = ep_keyring_lookup_passwords (uri->user, uri->host, NULL, &error);
+       if (passwords != NULL) {
+-              ep_keyring_delete_passwords (uri->user, uri->host, passwords, &error);
++              ep_keyring_delete_passwords (uri->user, uri->host, uri->protocol, passwords, &error);
+               gnome_keyring_found_list_free (passwords);
+       }
+@@ -739,10 +784,10 @@
+               g_message ("%s", error->message);
+               g_error_free (error);
+-        /* Not finding the requested group is also acceptable. */
+-        } else if (g_error_matches (error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_GROUP_NOT_FOUND)) {
+-                g_message ("%s", error->message);
+-                g_error_free (error);
++      /* Not finding the requested group is also acceptable. */
++      } else if (g_error_matches (error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_GROUP_NOT_FOUND)) {
++              g_message ("%s", error->message);
++              g_error_free (error);
+       } else if (error != NULL)
+               g_propagate_error (&msg->error, error);
+@@ -777,18 +822,19 @@
+       EUri *uri;
+       GError *error = NULL;
+-      uri = ep_keyring_uri_new (msg->key);
+-      g_return_if_fail (uri != NULL);
++      uri = ep_keyring_uri_new (msg->key, &msg->error);
++      if (uri == NULL)
++              return;
+       /* Find the first Evolution password that matches the URI. */
+-      passwords = ep_keyring_lookup_passwords (uri->user, uri->host, &error);
++      passwords = ep_keyring_lookup_passwords (uri->user, uri->host, uri->protocol, &error);
+       if (passwords != NULL) {
+               GList *iter = passwords;
+               while (iter != NULL) {
+                       GnomeKeyringFound *found = iter->data;
+-                      if (ep_keyring_validate (uri->user, uri->host, found->attributes)) {
++                      if (ep_keyring_validate (uri->user, uri->host, uri->protocol, found->attributes)) {
+                               msg->password = g_strdup (found->secret);
+                               break;
+                       }
+@@ -799,6 +845,36 @@
+               gnome_keyring_found_list_free (passwords);
+       }
++      if (msg->password != NULL)
++              goto done;
++
++      /* Clear the previous error, if there was one.  If the error was
++       * something other than NO_MATCH then it's likely to occur again. */
++      if (error != NULL)
++              g_clear_error (&error);
++
++      /* XXX We didn't always store protocols in the keyring, so for
++       *     backward-compatibility we also need to lookup passwords
++       *     by user and host only (no protocol). */
++      passwords = ep_keyring_lookup_passwords (uri->user, uri->host, NULL, &error);
++      if (passwords != NULL) {
++              GList *iter = passwords;
++
++              while (iter != NULL) {
++                      GnomeKeyringFound *found = iter->data;
++
++                      if (ep_keyring_validate (uri->user, uri->host, NULL, found->attributes)) {
++                              msg->password = g_strdup (found->secret);
++                              break;
++                      }
++
++                      iter = g_list_next (iter);
++              }
++
++              gnome_keyring_found_list_free (passwords);
++      }
++
++done:
+       /* Not finding the requested key is acceptable, but we still
+        * want to leave an informational message on the terminal. */
+       if (g_error_matches (error, EP_KEYRING_ERROR, GNOME_KEYRING_RESULT_NO_MATCH)) {
+@@ -832,10 +908,10 @@
+               g_message ("%s", error->message);
+               g_error_free (error);
+-        /* Not finding the requested group is also acceptable. */
+-        } else if (g_error_matches (error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_GROUP_NOT_FOUND)) {
+-                g_message ("%s", error->message);
+-                g_error_free (error);
++      /* Not finding the requested group is also acceptable. */
++      } else if (g_error_matches (error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_GROUP_NOT_FOUND)) {
++              g_message ("%s", error->message);
++              g_error_free (error);
+       } else if (error != NULL)
+               g_propagate_error (&msg->error, error);
This page took 0.180311 seconds and 4 git commands to generate.