[Bug 52231] Storage plugins should be able to create new accounts
bugzilla-daemon at freedesktop.org
bugzilla-daemon at freedesktop.org
Thu Jul 19 00:40:39 CEST 2012
https://bugs.freedesktop.org/show_bug.cgi?id=52231
--- Comment #4 from Xavier Claessens <xclaesse at gmail.com> 2012-07-18 15:40:39 PDT ---
(In reply to comment #3)
> (In reply to comment #2)
> > How MC currently store new account is by creating a unique_name, then telling
> > the storage all the key/value to save for that unique_name. Of course as none
> > of the plugins will know that unique_name they all will return FALSE except for
> > the default storage.
>
> Because the storage API is rather weird, this isn't actually enforced or
> anything.
>
> I think I'd prefer to say that create_account is expected to store the
> connection manager name and protocol (but nothing else), and replace the calls
> to mcp_account_manager_get_unique_name,
> mcd_storage_set_string(MC_ACCOUNTS_KEY_MANAGER) and
> mcd_storage_set_string(MC_ACCOUNTS_KEY_PROTOCOL) in
> _mcd_account_manager_create_account with this pseudocode:
>
> if (provider != NULL)
> {
> McpAccountStorage *storage = find_storage_for_provider (provider);
>
> unique_name = mcp_account_storage_create_account (storage, manager,
> protocol, ..., error);
> if (unique_name == NULL)
> {
> raise error;
> return;
> }
> }
> else
> {
> foreach McpAccountStorage storage, highest priority first
> {
> unique_name = mcp_account_storage_create_account (storage, manager,
> protocol, ..., error);
> if (unique_name != NULL)
> {
> if (mcd_storage_get_plugin (priv->plugin_manager) != storage)
> {
> mcp_account_storage_delete_all (storage, unique_name);
> raise NotAvailable, "plugin tried to use a name that already
> exists";
> }
>
> /* success */
> break;
> }
> free error;
>
> if (unique_name == NULL)
> raise NotAvailable, "No backend was willing to create that
> account";
> }
> }
>
> where the default implementation of mcp_account_storage_create_account
> (inherited by all out-of-tree plugins and by the default plugin) is this
> (pseudocode):
>
> gboolean create_account (..., error)
> {
> unique_name = mcp_account_manager_get_unique_name (...);
>
> if (unique_name == NULL)
> raise NotAvailable, "Could not construct account name";
>
> if (!mcp_account_storage_set (self, am, unique_name,
> MC_ACCOUNTS_KEY_MANAGER, manager) ||
> !mcp_account_storage_set (self, am, unique_name,
> MC_ACCOUNTS_KEY_PROTOCOL, protocol)
> raise NotAvailable, "Storage backend could not store new account";
>
> return TRUE;
> }
>
> Then we preserve current functionality for all current plugins, including
> out-of-tree.
Good idea!
> > It also let the plugin decide of the unique_name to use for that account, so
> > for example storage "Badger" could want to prefix all account names with
> > "badger_"
>
> According to the Tp spec, the account's unique name must be of the form
> manager/protocol/x for some x. Why would a backend ever want to change the
> value of x, given that it's opaque?
>
> (One possible reason would be "to set x to badger_123 where 123 is its internal
> identifier for that account", I suppose.)
That's exactly what GOA plugin does. Also having manager/protocol/goa_foo makes
debugging easier as you can tell from the object path which are the accounts
your plugin is managing :)
> Letting the plugin decide the unique name raises the possibility of plugins
> that generate a unique name that collides with one used by a lower- or
> higher-priority plugin, if they don't use mcp_account_manager_get_unique_name
> (which checks for collisions automatically). In the pseudocode above, that's
> partly handled, but unfortunately it needs a new mcp_account_storage_delete_all
> method, and it still doesn't handle the case of a plugin stealing a name from a
> lower-priority one.
_delete_all() already exists as _delete() the NULL key, no?
> Another way to do this would be to provide a
> mcp_account_manager_account_exists(McpAccountManager, unique_name) method,
> document that create_account implementations that do not use
> mcp_account_manager_get_unique_name are expected to call
> mcp_account_manager_account_exists and not use names for which that returns
> TRUE, and make failure to do so into a programming error (i.e. g_critical). A
> badly-written plugin can crash us anyway, so that's not a regression.
I think it is plugin's responsability to ensure uniqueness, either by using
mcp_account_manager_get_unique_name() or by having its own prefix (e.g. "goa_")
+ an internal identifier. If the unique_name given by a plugin already exists,
MC will already warn and discard that account, IIRC that's somewhere in
McdAccount.
--
Configure bugmail: https://bugs.freedesktop.org/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are the QA Contact for the bug.
You are the assignee for the bug.
More information about the telepathy-bugs
mailing list