summaryrefslogtreecommitdiffstats
path: root/js/dav/lib/accounts.js
diff options
context:
space:
mode:
Diffstat (limited to 'js/dav/lib/accounts.js')
-rw-r--r--js/dav/lib/accounts.js178
1 files changed, 0 insertions, 178 deletions
diff --git a/js/dav/lib/accounts.js b/js/dav/lib/accounts.js
deleted file mode 100644
index 61aea17f..00000000
--- a/js/dav/lib/accounts.js
+++ /dev/null
@@ -1,178 +0,0 @@
-import co from 'co';
-import url from 'url';
-
-import { listCalendars, listCalendarObjects } from './calendars';
-import { listAddressBooks, listVCards, getFullVcards } from './contacts';
-import fuzzyUrlEquals from './fuzzy_url_equals';
-import { Account } from './model';
-import * as ns from './namespace';
-import * as request from './request';
-
-let debug = require('./debug')('dav:accounts');
-
-let defaults = {
- accountType: 'caldav',
- loadCollections: true,
- loadObjects: false
-};
-
-/**
- * rfc 6764.
- *
- * @param {dav.Account} account to find root url for.
- */
-let serviceDiscovery = co.wrap(function *(account, options) {
- debug('Attempt service discovery.');
-
- let endpoint = url.parse(account.server);
- endpoint.protocol = endpoint.protocol || 'http'; // TODO(gareth) https?
-
- let uri = url.format({
- protocol: endpoint.protocol,
- host: endpoint.host,
- pathname: (!options.useProvidedPath ? '/.well-known/' + options.accountType : endpoint.pathname)
- });
-
- let req = request.basic({ method: 'GET' });
- try {
- let xhr = yield options.xhr.send(req, uri, { sandbox: options.sandbox });
- if (xhr.status >= 300 && xhr.status < 400) {
- // http redirect.
- let location = xhr.getResponseHeader('Location');
- if (typeof location === 'string' && location.length) {
- debug(`Discovery redirected to ${location}`);
- return url.format({
- protocol: endpoint.protocol,
- host: endpoint.host,
- pathname: location
- });
- }
- }
- } catch (error) {
- debug('Discovery failed... failover to the provided url');
- }
-
- return endpoint.href;
-});
-
-/**
- * rfc 5397.
- *
- * @param {dav.Account} account to get principal url for.
- */
-let principalUrl = co.wrap(function *(account, options) {
- debug(`Fetch principal url from context path ${account.rootUrl}.`);
- let req = request.propfind({
- props: [ { name: 'current-user-principal', namespace: ns.DAV } ],
- depth: 0,
- mergeResponses: true
- });
-
- let res = yield options.xhr.send(req, account.rootUrl, {
- sandbox: options.sandbox
- });
-
- let container = res.props;
- debug(`Received principal: ${container.currentUserPrincipal}`);
- return url.resolve(account.rootUrl, container.currentUserPrincipal);
-});
-
-/**
- * @param {dav.Account} account to get home url for.
- */
-let homeUrl = co.wrap(function *(account, options) {
- debug(`Fetch home url from principal url ${account.principalUrl}.`);
- let prop;
- if (options.accountType === 'caldav') {
- prop = { name: 'calendar-home-set', namespace: ns.CALDAV };
- } else if (options.accountType === 'carddav') {
- prop = { name: 'addressbook-home-set', namespace: ns.CARDDAV };
- }
-
- var req = request.propfind({ props: [ prop ] });
-
- let responses = yield options.xhr.send(req, account.principalUrl, {
- sandbox: options.sandbox
- });
-
- let response = responses.find(response => {
- return fuzzyUrlEquals(account.principalUrl, response.href);
- });
-
- let container = response.props;
- let href;
- if (options.accountType === 'caldav') {
- debug(`Received home: ${container.calendarHomeSet}`);
- href = container.calendarHomeSet;
- } else if (options.accountType === 'carddav') {
- debug(`Received home: ${container.addressbookHomeSet}`);
- href = container.addressbookHomeSet;
- }
-
- return url.resolve(account.rootUrl, href);
-});
-
-/**
- * Options:
- *
- * (String) accountType - one of 'caldav' or 'carddav'. Defaults to 'caldav'.
- * (Array.<Object>) filters - list of caldav filters to send with request.
- * (Boolean) loadCollections - whether or not to load dav collections.
- * (Boolean) loadObjects - whether or not to load dav objects.
- * (dav.Sandbox) sandbox - optional request sandbox.
- * (String) server - some url for server (needn't be base url).
- * (String) timezone - VTIMEZONE calendar object.
- * (dav.Transport) xhr - request sender.
- *
- * @return {Promise} a promise that will resolve with a dav.Account object.
- */
-exports.createAccount = co.wrap(function *(options) {
- options = Object.assign({}, defaults, options);
- if (typeof options.loadObjects !== 'boolean') {
- options.loadObjects = options.loadCollections;
- }
-
- let account = new Account({
- server: options.server,
- credentials: options.xhr.credentials
- });
-
- account.rootUrl = yield serviceDiscovery(account, options);
- account.principalUrl = yield principalUrl(account, options);
- account.homeUrl = yield homeUrl(account, options);
-
- if (!options.loadCollections) {
- return account;
- }
-
- let key, loadCollections, loadObjects;
- if (options.accountType === 'caldav') {
- key = 'calendars';
- loadCollections = listCalendars;
- loadObjects = listCalendarObjects;
- } else if (options.accountType === 'carddav') {
- key = 'addressBooks';
- loadCollections = listAddressBooks;
- loadObjects = listVCards;
- }
-
- var collections = yield loadCollections(account, options);
- account[key] = collections;
- if (!options.loadObjects) {
- return account;
- }
-
- yield collections.map(co.wrap(function *(collection) {
- try {
- collection.objects = yield loadObjects(collection, options);
- } catch (error) {
- collection.error = error;
- }
- }));
-
- account[key] = account[key].filter(function(collection) {
- return !collection.error;
- });
-
- return account;
-});