static EGwConnection * get_cnc (GtkWindow *parent_window) { CamelNetworkSettings *network_settings; const gchar *failed_auth; gchar *uri, *key, *prompt, *password = NULL; CamelNetworkSecurityMethod security_method; const gchar *scheme; const gchar *host; const gchar *user; gboolean remember; gchar *soap_port; if (!CAMEL_IS_NETWORK_SETTINGS (settings)) return NULL; network_settings = CAMEL_NETWORK_SETTINGS (settings); host = camel_network_settings_get_host (network_settings); user = camel_network_settings_get_user (network_settings); if (host == NULL || *host == '\0') return NULL; if (user == NULL || *user == '\0') return NULL; g_object_get ( settings, "soap-port", &soap_port, "security-method", &security_method, NULL); if (security_method == CAMEL_NETWORK_SECURITY_METHOD_NONE) scheme = "http"; else scheme = "https"; key = g_strdup_printf ("groupwise://%s@%s/", user, host); uri = g_strdup_printf ("%s://%s:%s/soap", scheme, host, soap_port); failed_auth = ""; prompt = g_strdup_printf (_("%sEnter password for %s (user %s)"), failed_auth, host, user); password = e_passwords_get_password (NULL, key); if (!password) password = e_passwords_ask_password (prompt, NULL, key, prompt, E_PASSWORDS_REMEMBER_FOREVER | E_PASSWORDS_SECRET, &remember, parent_window); g_free (prompt); return e_gw_connection_new (uri, user, password); }
/* XXX toshok - this needs to be done using a signal as in the * e_cert_db_login_to_slot stuff, instead of a direct gui dep here.. * for now, though, it stays. */ static gboolean prompt_for_password (gchar *title, gchar *prompt, SECItem *pwd) { gchar *passwd; passwd = e_passwords_ask_password ( title, "", prompt, E_PASSWORDS_REMEMBER_NEVER | E_PASSWORDS_SECRET, NULL, NULL); if (passwd) { gsize len = strlen (passwd); const gchar *inptr = passwd; guchar *outptr; gunichar2 c; SECITEM_AllocItem (NULL, pwd, sizeof (gunichar2) * (len + 1)); outptr = pwd->data; while (inptr && (c = (gunichar2) (g_utf8_get_char (inptr) & 0xffff))) { inptr = g_utf8_next_char (inptr); c = GUINT16_TO_BE (c); *outptr++ = ((gchar *) &c)[0]; *outptr++ = ((gchar *) &c)[1]; } outptr[0] = 0; outptr[1] = 0; memset (passwd, 0, strlen (passwd)); g_free (passwd); } return TRUE; }
gboolean eee_account_auth(EeeAccount *self) { GError *err = NULL; guint32 flags = E_PASSWORDS_REMEMBER_FOREVER | E_PASSWORDS_SECRET; GConfClient *gconf; gboolean remember = TRUE; char *fail_msg = ""; char *password; int retry_limit = 3; gboolean rs; char *key; if (!eee_account_connect(self)) { return FALSE; } if (self->priv->is_authorized) { return TRUE; } key = g_strdup_printf("eee://%s", self->name); password = e_passwords_get_password(EEE_PASSWORD_COMPONENT, key); while (retry_limit--) { if (password == NULL) { gconf = gconf_client_get_default(); char *path = g_strdup_printf(EEE_KEY "accounts/%s/remember_password", self->name); remember = gconf_client_get_bool(gconf, path, NULL); char *prompt = g_strdup_printf("%sEnter password for your 3e calendar account: %s.", fail_msg, self->name); // key must have uri format or unpatched evolution segfaults in // ep_get_password_keyring() password = e_passwords_ask_password(prompt, EEE_PASSWORD_COMPONENT, key, prompt, flags, &remember, NULL); gconf_client_set_bool(gconf, path, remember, NULL); g_free(path); g_object_unref(gconf); g_free(prompt); if (password == NULL) { goto err; } } rs = ESClient_authenticate(self->priv->conn, self->name, password, &err); g_free(password); password = NULL; if (!err && rs == TRUE) { self->priv->is_authorized = TRUE; g_free(key); return TRUE; } if (err) { g_warning("** EEE ** Authentization failed for user '%s'. (%d:%s)", self->name, err->code, err->message); if (err->code == ES_XMLRPC_ERROR_AUTH_FAILED) { g_clear_error(&err); fail_msg = "Invalid password. "; } else { g_clear_error(&err); goto err; } } else { g_warning("** EEE ** Authentization failed for user '%s' without error.", self->name); fail_msg = "Invalid password. "; } e_passwords_forget_password(EEE_PASSWORD_COMPONENT, key); flags |= E_PASSWORDS_REPROMPT; } err: g_free(key); return FALSE; }