diff options
author | Vivek Dasmohapatra <vivek@collabora.co.uk> | 2010-10-11 14:27:51 +0100 |
---|---|---|
committer | Vivek Dasmohapatra <vivek@collabora.co.uk> | 2010-10-11 14:27:51 +0100 |
commit | 16d4d59d32b4acd6d35d28fafc1cf4899d2fa27c (patch) | |
tree | 4592d3362e0b2db18236731594fed59ac9387ab9 | |
parent | fb5ea0159ec8a5d96a266530b401f788c0e293ca (diff) | |
download | telepathy-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.c | 42 |
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); |