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);
}
Beispiel #2
0
/* 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;
}
Beispiel #3
0
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;
}