summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVivek Dasmohapatra <vivek@collabora.co.uk>2010-10-11 14:27:51 +0100
committerVivek Dasmohapatra <vivek@collabora.co.uk>2010-10-11 14:27:51 +0100
commit16d4d59d32b4acd6d35d28fafc1cf4899d2fa27c (patch)
tree4592d3362e0b2db18236731594fed59ac9387ab9
parentfb5ea0159ec8a5d96a266530b401f788c0e293ca (diff)
downloadtelepathy-mission-control-16d4d59d32b4acd6d35d28fafc1cf4899d2fa27c.tar.gz
Let ag parameters/account shadow the ag 'username'/mc 'param-account' mapping
New convention introduced to meet the requirements of a libaccounts platform: Normally the account parameter is mapped from the global 'username' setting.
-rw-r--r--src/mcd-account-manager-sso.c42
1 files changed, 40 insertions, 2 deletions
diff --git a/src/mcd-account-manager-sso.c b/src/mcd-account-manager-sso.c
index 8e1796f3..32f9b9e6 100644
--- a/src/mcd-account-manager-sso.c
+++ b/src/mcd-account-manager-sso.c
@@ -61,6 +61,7 @@
#define AG_ACCOUNT_KEY "username"
#define MC_ACCOUNT_KEY "account"
#define PASSWORD_KEY "password"
+#define AG_ACCOUNT_ALT_KEY AGPP "account"
#define MC_CMANAGER_KEY "manager"
#define MC_PROTOCOL_KEY "protocol"
@@ -301,6 +302,36 @@ _ag_account_local_value (AgAccount *account,
return src;
}
+/* AG_ACCOUNT_ALT_KEY from service overrides global AG_ACCOUNT_KEY if set */
+static void
+_maybe_set_account_param_from_service (const McpAccountManager *am,
+ AgAccount *ag_account,
+ const gchar *mc_account)
+{
+ Setting *setting = setting_data (AG_ACCOUNT_KEY, SETTING_AG);
+ AgSettingSource source = AG_SETTING_SOURCE_NONE;
+ GValue ag_value = { 0 };
+
+ g_return_if_fail (setting != NULL);
+
+ g_value_init (&ag_value, G_TYPE_STRING);
+
+ source = _ag_account_local_value (ag_account, AG_ACCOUNT_ALT_KEY, &ag_value);
+
+ if (source != AG_SETTING_SOURCE_NONE)
+ {
+ gchar *value = _gvalue_to_string (&ag_value);
+
+ DEBUG ("overriding global %s param with %s: %s",
+ AG_ACCOUNT_KEY, AG_ACCOUNT_ALT_KEY, value);
+ mcp_account_manager_set_value (am, mc_account, setting->mc_name, value);
+ g_free (value);
+ }
+
+ g_value_unset (&ag_value);
+ clear_setting_data (setting);
+}
+
static WatchData *
make_watch_data (McdAccountManagerSso *sso,
const gchar *mc_key)
@@ -778,8 +809,6 @@ _ag_accountid_to_mc_key (const McdAccountManagerSso *sso,
if (proto == NULL)
goto cleanup;
- g_hash_table_insert (params, g_strdup (MC_ACCOUNT_KEY), &value);
-
/* prepare the hash of MC param keys -> GValue */
/* NOTE: some AG bare settings map to MC parameters, *
* so we must iterate over all AG settings, parameters *
@@ -824,6 +853,9 @@ _ag_accountid_to_mc_key (const McdAccountManagerSso *sso,
clear_setting_data (setting);
}
+ /* we want this to override any other settings for uid generation */
+ g_hash_table_insert (params, g_strdup (MC_ACCOUNT_KEY), &value);
+
name = mcp_account_manager_get_unique_name (am, cman, proto, params);
cleanup:
@@ -1063,6 +1095,9 @@ _get (const McpAccountStorage *self,
g_free (val);
}
+ if (g_str_equal (key, MCPP MC_ACCOUNT_KEY))
+ _maybe_set_account_param_from_service (am, account, acct);
+
g_value_unset (&v);
clear_setting_data (setting);
}
@@ -1124,6 +1159,8 @@ _get (const McpAccountStorage *self,
/* special case, actually two separate but related flags in SSO */
on = _sso_account_enabled (account, NULL) ? "true" : "false";
mcp_account_manager_set_value (am, acct, MC_ENABLED_KEY, on);
+
+ _maybe_set_account_param_from_service (am, account, acct);
}
/* leave the selected service as we found it */
@@ -1295,6 +1332,7 @@ _load_from_libaccounts (McdAccountManagerSso *sso,
mcp_account_manager_set_value (am, name, MC_CMANAGER_KEY, mc_id[0]);
mcp_account_manager_set_value (am, name, MC_PROTOCOL_KEY, mc_id[1]);
mcp_account_manager_set_value (am, name, MC_IDENTITY_KEY, name);
+ _maybe_set_account_param_from_service (am, account, name);
/* force the services value to be synthesised + cached */
_get (MCP_ACCOUNT_STORAGE (sso), am, name, SERVICES_KEY);