On Jul 10, 2013, at 10:01 AM, chrysn chrysn@fsfe.org wrote:
On Wed, Jul 10, 2013 at 01:21:48AM +0200, Ján Máté wrote:
Sorry but I don't fully understand the design of your "integration" - maybe a demo URL can help to understand it.
on your test system,
http://www.inf-it.com/carddavmate/#http://www.inf-it.com:80/proxy/caldav.php...
should open the contact "Picard Jean-Luc" in the colleagues address book.
Okej, now I understand but this idea is VERY crazy, because the client can open a contact ONLY after performs full sync with the server. So in reality it can take lot of seconds - for example if you have 1000 contacts, then it loads all of them and only then opens the "selected" contact from the URL. Another problem is, that if you click to second "contact URL" then the browser will RELOAD the whole software, re-syncs all contacts and only then opens the second contact.
UID change in CardDavMATE (e.g. http://username@server:port/principal_url/object.vcf) is very bad idea, because I support multiple logins to the SAME principal URL with different username - so the login name MUST be a part of UID.
the reason why i stripped the 'test@inf-it.com@' from aftert the '#http://' in the above url is the basic assumption that an http resource (and, in particular, a webdav or carddav one) is basically independent of by which credentials it is accessed, and in general one can't predict which credentials the one who finally resolves the link will have available.
the implementation could even accept links with user name, but should be prepared to search the available address books for one that matches if stripped off the user name and open that one. in pseudocode:
requested_resource = window.location.hash requested_host = get_host_part(requested_resource) for current_principal in available_principals: if requested_resource starts with remove_username(current_principal): open requested_resource, replacing remove_username(current_principal) with current_principal
i don't know where we should talk of host names and where of principals here, but do you see what i mean?
In CardDavMATE you can configure an array of accounts, for example:
[1]: Principal URL: https://server.com:8443/caldav.php/cars/bmw/ Username/Password: test/test [2]: Principal URL: https://server.com:8443/caldav.php/cars/bmw/ <-- identical principal URL Username/Password: test2/test2 <-- different user
then it loads all contacts from both accounts (each contact is loaded twice because the principal URL is the same). In the interface you will see only contacts from the selected addressbook (contacts from different addressbooks are "hidden") but in future I will add support for displaying all loaded contacts from all accounts/addressbooks. Then if you edit a contact and click to "Save", the PUT request requires the login name (because user A and user B privileges can be different). And this login name is extracted from the object UID - the client finds the proper account and use the proper password (in the Auth header) for the PUT request.
As you see the login name is REALLY required in the UID because it must be globally unique. Heuristic search on the UID value is VERY bad idea, because it requires sequential search and for performance reason I use hash - the key is the UID and the value is the destination object.
JM
best regards chrysn
-- To use raw power is to make yourself infinitely vulnerable to greater powers. -- Bene Gesserit axiom