diff --git a/src/index.html b/src/index.html
index 9e389eeec..8eca9d409 100644
--- a/src/index.html
+++ b/src/index.html
@@ -90,6 +90,8 @@
+
diff --git a/src/js/client.js b/src/js/client.js
index 54dfde278..65a4507bf 100644
--- a/src/js/client.js
+++ b/src/js/client.js
@@ -30,9 +30,17 @@ angular.module('Application').service('Client', ['$http', '$interval', 'md5', 'N
function defaultErrorHandler(callback) {
return function (data, status) {
+ // handle request killed by browser (eg. cors issue)
+ if (data === null && status === -1) {
+ client.offline = true;
+ return;
+ }
+
if (status === 401) return client.login();
if (status >= 500) {
- client.error(data);
+ if (!client.offline) client.error(data);
+ client.offline = true;
+
return callback(new ClientError(status, data));
}
@@ -40,54 +48,73 @@ angular.module('Application').service('Client', ['$http', '$interval', 'md5', 'N
try {
obj = JSON.parse(data);
} catch (e) {}
+
callback(new ClientError(status, obj));
};
}
+ function defaultSuccessHandler(callback) {
+ return function (data, status) {
+ client.offline = false;
+ return callback(null, data, status);
+ }
+ }
+
// XHR wrapper to set the auth header
- function get(url, config) {
+ function get(url, config, callback) {
config = config || {};
config.headers = config.headers || {};
config.headers.Authorization = 'Bearer ' + token;
- return $http.get(client.apiOrigin + url, config);
+ return $http.get(client.apiOrigin + url, config)
+ .success(defaultSuccessHandler(callback))
+ .error(defaultErrorHandler(callback));
}
- function head(url, config) {
+ function head(url, config, callback) {
config = config || {};
config.headers = config.headers || {};
config.headers.Authorization = 'Bearer ' + token;
- return $http.head(client.apiOrigin + url, config);
+ return $http.head(client.apiOrigin + url, config)
+ .success(defaultSuccessHandler(callback))
+ .error(defaultErrorHandler(callback));
}
- function post(url, data, config) {
+ function post(url, data, config, callback) {
data = data || {};
config = config || {};
config.headers = config.headers || {};
config.headers.Authorization = 'Bearer ' + token;
- return $http.post(client.apiOrigin + url, data, config);
+ return $http.post(client.apiOrigin + url, data, config)
+ .success(defaultSuccessHandler(callback))
+ .error(defaultErrorHandler(callback));
}
- function put(url, data, config) {
+ function put(url, data, config, callback) {
data = data || {};
config = config || {};
config.headers = config.headers || {};
config.headers.Authorization = 'Bearer ' + token;
- return $http.put(client.apiOrigin + url, data, config);
+ return $http.put(client.apiOrigin + url, data, config)
+ .success(defaultSuccessHandler(callback))
+ .error(defaultErrorHandler(callback));
}
- function del(url, config) {
+ function del(url, config, callback) {
config = config || {};
config.headers = config.headers || {};
config.headers.Authorization = 'Bearer ' + token;
- return $http.delete(client.apiOrigin + url, config);
+ return $http.delete(client.apiOrigin + url, config)
+ .success(defaultSuccessHandler(callback))
+ .error(defaultErrorHandler(callback));
}
function Client() {
+ this.offline = false;
this._ready = false;
this._configListener = [];
this._readyListener = [];
@@ -249,34 +276,47 @@ angular.module('Application').service('Client', ['$http', '$interval', 'md5', 'N
return token;
};
+ Client.prototype.makeURL = function (url) {
+ if (url.indexOf('?') === -1) {
+ return this.apiOrigin + url + '?access_token=' + token;
+ } else {
+ return this.apiOrigin + url + '&access_token=' + token;
+ }
+ };
+
/*
* Rest API wrappers
*/
Client.prototype.config = function (callback) {
- get('/api/v1/config').success(function(data, status) {
+ get('/api/v1/config', null, function (error, data, status) {
+ if (error) return callback(error);
if (status !== 200 || typeof data !== 'object') return callback(new ClientError(status, data));
callback(null, data);
- }).error(defaultErrorHandler(callback));
+ });
};
Client.prototype.userInfo = function (callback) {
- get('/api/v1/profile').success(function(data, status) {
+ get('/api/v1/profile', null, function (error, data, status) {
+ if (error) return callback(error);
if (status !== 200 || typeof data !== 'object') return callback(new ClientError(status, data));
callback(null, data);
- }).error(defaultErrorHandler(callback));
+ });
};
Client.prototype.changeCloudronAvatar = function (avatarFile, callback) {
var fd = new FormData();
fd.append('avatar', avatarFile);
- post('/api/v1/settings/cloudron_avatar', fd, {
+ var config = {
headers: { 'Content-Type': undefined },
transformRequest: angular.identity
- }).success(function(data, status) {
+ };
+
+ post('/api/v1/settings/cloudron_avatar', fd, config, function (error, data, status) {
+ if (error) return callback(error);
if (status !== 202) return callback(new ClientError(status, data));
callback(null);
- }).error(defaultErrorHandler(callback));
+ });
};
Client.prototype.changeCloudronName = function (name, callback) {
@@ -284,10 +324,11 @@ angular.module('Application').service('Client', ['$http', '$interval', 'md5', 'N
name: name
};
- post('/api/v1/settings/cloudron_name', data).success(function(data, status) {
+ post('/api/v1/settings/cloudron_name', data, null, function (error, data, status) {
+ if (error) return callback(error);
if (status !== 202) return callback(new ClientError(status, data));
callback(null);
- }).error(defaultErrorHandler(callback));
+ });
};
Client.prototype.installApp = function (id, manifest, title, config, callback) {
@@ -303,8 +344,9 @@ angular.module('Application').service('Client', ['$http', '$interval', 'md5', 'N
sso: config.sso
};
- post('/api/v1/apps/install', data).success(function (data, status) {
- if (status !== 202 || typeof data !== 'object') return defaultErrorHandler(callback);
+ post('/api/v1/apps/install', data, null, function (error, data, status) {
+ if (error) return callback(error);
+ if (status !== 202) return callback(new ClientError(status, data));
// put new app with amended title in cache
data.manifest = { title: title };
@@ -314,7 +356,7 @@ angular.module('Application').service('Client', ['$http', '$interval', 'md5', 'N
data.progress = 0;
callback(null, data.id);
- }).error(defaultErrorHandler(callback));
+ });
};
Client.prototype.cloneApp = function (appId, config, callback) {
@@ -325,35 +367,45 @@ angular.module('Application').service('Client', ['$http', '$interval', 'md5', 'N
backupId: config.backupId
};
- post('/api/v1/apps/' + appId + '/clone', data).success(function (data, status) {
- if (status !== 201 || typeof data !== 'object') return defaultErrorHandler(callback);
+ post('/api/v1/apps/' + appId + '/clone', data, null, function (error, data, status) {
+ if (error) return callback(error);
+ if (status !== 201) return callback(new ClientError(status, data));
callback(null, data);
- }).error(defaultErrorHandler(callback));
+ });
};
Client.prototype.restoreApp = function (appId, backupId, password, callback) {
var data = { password: password, backupId: backupId };
- post('/api/v1/apps/' + appId + '/restore', data).success(function (data, status) {
+
+ post('/api/v1/apps/' + appId + '/restore', data, null, function (error, data, status) {
+ if (error) return callback(error);
if (status !== 202) return callback(new ClientError(status, data));
+
callback(null);
- }).error(defaultErrorHandler(callback));
+ });
};
Client.prototype.backupApp = function (appId, callback) {
- var data = { };
- post('/api/v1/apps/' + appId + '/backup', data).success(function (data, status) {
+ var data = {};
+
+ post('/api/v1/apps/' + appId + '/backup', data, null, function (error, data, status) {
+ if (error) return callback(error);
if (status !== 202) return callback(new ClientError(status, data));
+
callback(null);
- }).error(defaultErrorHandler(callback));
+ });
};
Client.prototype.uninstallApp = function (appId, password, callback) {
var data = { password: password };
- post('/api/v1/apps/' + appId + '/uninstall', data).success(function (data, status) {
+
+ post('/api/v1/apps/' + appId + '/uninstall', data, null, function (error, data, status) {
+ if (error) return callback(error);
if (status !== 202) return callback(new ClientError(status, data));
+
callback(null);
- }).error(defaultErrorHandler(callback));
+ });
};
Client.prototype.configureApp = function (id, config, callback) {
@@ -374,10 +426,12 @@ angular.module('Application').service('Client', ['$http', '$interval', 'md5', 'N
if ('mailboxName' in config) data.mailboxName = config.mailboxName;
if ('alternateDomains' in config) data.alternateDomains = config.alternateDomains;
- post('/api/v1/apps/' + id + '/configure', data).success(function (data, status) {
+ post('/api/v1/apps/' + id + '/configure', data, null, function (error, data, status) {
+ if (error) return callback(error);
if (status !== 202) return callback(new ClientError(status, data));
+
callback(null);
- }).error(defaultErrorHandler(callback));
+ });
};
Client.prototype.updateApp = function (id, manifest, callback) {
@@ -385,24 +439,30 @@ angular.module('Application').service('Client', ['$http', '$interval', 'md5', 'N
appStoreId: manifest.id + '@' + manifest.version
};
- post('/api/v1/apps/' + id + '/update', data).success(function (data, status) {
+ post('/api/v1/apps/' + id + '/update', data, null, function (error, data, status) {
+ if (error) return callback(error);
if (status !== 202) return callback(new ClientError(status, data));
+
callback(null);
- }).error(defaultErrorHandler(callback));
+ });
};
Client.prototype.startApp = function (id, callback) {
- post('/api/v1/apps/' + id + '/start').success(function (data, status) {
+ post('/api/v1/apps/' + id + '/start', null, function (error, data, status) {
+ if (error) return callback(error);
if (status !== 202) return callback(new ClientError(status, data));
+
callback(null);
- }).error(defaultErrorHandler(callback));
+ });
};
Client.prototype.stopApp = function (id, callback) {
- post('/api/v1/apps/' + id + '/stop').success(function (data, status) {
+ post('/api/v1/apps/' + id + '/stop', null, function (error, data, status) {
+ if (error) return callback(error);
if (status !== 202) return callback(new ClientError(status, data));
+
callback(null);
- }).error(defaultErrorHandler(callback));
+ });
};
Client.prototype.debugApp = function (id, state, callback) {
@@ -414,169 +474,198 @@ angular.module('Application').service('Client', ['$http', '$interval', 'md5', 'N
} : null
};
- post('/api/v1/apps/' + id + '/configure', data).success(function (data, status) {
+ post('/api/v1/apps/' + id + '/configure', data, null, function (error, data, status) {
+ if (error) return callback(error);
if (status !== 202) return callback(new ClientError(status, data));
+
callback(null);
- }).error(defaultErrorHandler(callback));
+ });
};
Client.prototype.version = function (callback) {
- get('/api/v1/cloudron/status').success(function(data, status) {
- if (status !== 200 || typeof data !== 'object') return callback(new ClientError(status, data));
+ get('/api/v1/cloudron/status', null, function (error, data, status) {
+ if (error) return callback(error);
+ if (status !== 200) return callback(new ClientError(status, data));
callback(null, data);
}).error(defaultErrorHandler(callback));
};
Client.prototype.getStatus = function (callback) {
- get('/api/v1/cloudron/status').success(function(data, status) {
+ get('/api/v1/cloudron/status', null, function (error, data, status) {
+ if (error) return callback(error);
if (status !== 200 || typeof data !== 'object') return callback(new ClientError(status, data));
callback(null, data);
}).error(defaultErrorHandler(callback));
};
- Client.prototype.makeURL = function (url) {
- if (url.indexOf('?') === -1) {
- return this.apiOrigin + url + '?access_token=' + token;
- } else {
- return this.apiOrigin + url + '&access_token=' + token;
- }
- };
-
Client.prototype.setBackupConfig = function (backupConfig, callback) {
- post('/api/v1/settings/backup_config', backupConfig).success(function(data, status) {
+ post('/api/v1/settings/backup_config', backupConfig, null, function (error, data, status) {
+ if (error) return callback(error);
if (status !== 200) return callback(new ClientError(status, data));
+
callback(null);
- }).error(defaultErrorHandler(callback));
+ });
};
Client.prototype.getBackupConfig = function (callback) {
- get('/api/v1/settings/backup_config').success(function(data, status) {
+ get('/api/v1/settings/backup_config', null, function (error, data, status) {
+ if (error) return callback(error);
if (status !== 200) return callback(new ClientError(status, data));
+
callback(null, data);
- }).error(defaultErrorHandler(callback));
+ });
};
Client.prototype.setDynamicDnsConfig = function (enabled, callback) {
- post('/api/v1/settings/dynamic_dns', { enabled: enabled }).success(function(data, status) {
+ post('/api/v1/settings/dynamic_dns', { enabled: enabled }, null, function (error, data, status) {
+ if (error) return callback(error);
if (status !== 200) return callback(new ClientError(status, data));
callback(null);
- }).error(defaultErrorHandler(callback));
+ });
};
Client.prototype.getDynamicDnsConfig = function (callback) {
- get('/api/v1/settings/dynamic_dns').success(function(data, status) {
+ get('/api/v1/settings/dynamic_dns', null, function (error, data, status) {
+ if (error) return callback(error);
if (status !== 200) return callback(new ClientError(status, data));
+
callback(null, data.enabled);
- }).error(defaultErrorHandler(callback));
+ });
};
Client.prototype.getUpdateInfo = function (callback) {
- get('/api/v1/cloudron/update').success(function(data, status) {
+ get('/api/v1/cloudron/update', null, function (error, data, status) {
+ if (error) return callback(error);
if (status !== 200) return callback(new ClientError(status, data));
+
callback(null, data);
- }).error(defaultErrorHandler(callback));
+ });
};
Client.prototype.checkForUpdates = function (callback) {
- var that = this;
-
- post('/api/v1/cloudron/check_for_updates', {}).success(function(data, status) {
+ post('/api/v1/cloudron/check_for_updates', {}, null, function (error, data, status) {
+ if (error) return callback(error);
if (status !== 200) return callback(new ClientError(status, data));
- that.refreshConfig(callback);
- }).error(defaultErrorHandler(callback));
+
+ client.refreshConfig(callback);
+ });
};
Client.prototype.setAppAutoupdatePattern = function (pattern, callback) {
- post('/api/v1/settings/app_autoupdate_pattern', { pattern: pattern }).success(function(data, status) {
+ post('/api/v1/settings/app_autoupdate_pattern', { pattern: pattern }, null, function (error, data, status) {
+ if (error) return callback(error);
if (status !== 200) return callback(new ClientError(status, data));
+
callback(null);
- }).error(defaultErrorHandler(callback));
+ });
};
Client.prototype.getAppAutoupdatePattern = function (callback) {
- get('/api/v1/settings/app_autoupdate_pattern').success(function(data, status) {
+ get('/api/v1/settings/app_autoupdate_pattern', null, function (error, data, status) {
+ if (error) return callback(error);
if (status !== 200) return callback(new ClientError(status, data));
+
callback(null, data);
- }).error(defaultErrorHandler(callback));
+ });
};
Client.prototype.setBoxAutoupdatePattern = function (pattern, callback) {
- post('/api/v1/settings/box_autoupdate_pattern', { pattern: pattern }).success(function(data, status) {
+ post('/api/v1/settings/box_autoupdate_pattern', { pattern: pattern }, null, function (error, data, status) {
+ if (error) return callback(error);
if (status !== 200) return callback(new ClientError(status, data));
+
callback(null);
- }).error(defaultErrorHandler(callback));
+ });
};
Client.prototype.getBoxAutoupdatePattern = function (callback) {
- get('/api/v1/settings/box_autoupdate_pattern').success(function(data, status) {
+ get('/api/v1/settings/box_autoupdate_pattern', null, function (error, data, status) {
+ if (error) return callback(error);
if (status !== 200) return callback(new ClientError(status, data));
+
callback(null, data);
- }).error(defaultErrorHandler(callback));
+ });
};
- Client.prototype.setAppstoreConfig = function (config, callback) {
- var data = config;
-
- post('/api/v1/settings/appstore_config', data).success(function(data, status) {
+ Client.prototype.setAppstoreConfig = function (appstoreConfig, callback) {
+ post('/api/v1/settings/appstore_config', appstoreConfig, null, function (error, data, status) {
+ if (error) return callback(error);
if (status !== 202) return callback(new ClientError(status, data));
+
callback(null);
- }).error(defaultErrorHandler(callback));
+ });
};
Client.prototype.getAppstoreConfig = function (callback) {
- get('/api/v1/settings/appstore_config').success(function(data, status) {
+ get('/api/v1/settings/appstore_config', null, function (error, data, status) {
+ if (error) return callback(error);
if (status !== 200) return callback(new ClientError(status, data));
+
callback(null, data);
- }).error(defaultErrorHandler(callback));
+ });
};
Client.prototype.getCaasConfig = function (callback) {
- get('/api/v1/caas/config').success(function(data, status) {
+ get('/api/v1/caas/config', null, function (error, data, status) {
+ if (error) return callback(error);
if (status !== 200) return callback(new ClientError(status, data));
+
callback(null, data);
- }).error(defaultErrorHandler(callback));
+ });
};
Client.prototype.addAuthorizedKey = function (key, callback) {
- put('/api/v1/cloudron/ssh/authorized_keys', { key: key }).success(function (data, status) {
+ put('/api/v1/cloudron/ssh/authorized_keys', { key: key }, null, function (error, data, status) {
+ if (error) return callback(error);
if (status !== 201) return callback(new ClientError(status, data));
+
callback(null);
- }).error(defaultErrorHandler(callback));
+ });
};
Client.prototype.delAuthorizedKey = function (identifier, callback) {
- del('/api/v1/cloudron/ssh/authorized_keys/' + identifier).success(function (data, status) {
+ del('/api/v1/cloudron/ssh/authorized_keys/' + identifier, null, function (error, data, status) {
+ if (error) return callback(error);
if (status !== 202) return callback(new ClientError(status, data));
+
callback(null);
- }).error(defaultErrorHandler(callback));
+ });
};
Client.prototype.getAuthorizedKeys = function (callback) {
- get('/api/v1/cloudron/ssh/authorized_keys').success(function (data, status) {
- if (status !== 200 || typeof data !== 'object') return callback(new ClientError(status, data));
+ get('/api/v1/cloudron/ssh/authorized_keys', null, function (error, data, status) {
+ if (error) return callback(error);
+ if (status !== 200) return callback(new ClientError(status, data));
+
callback(null, data.keys);
- }).error(defaultErrorHandler(callback));
+ });
};
Client.prototype.getBackups = function (callback) {
- get('/api/v1/backups').success(function (data, status) {
- if (status !== 200 || typeof data !== 'object') return callback(new ClientError(status, data));
+ get('/api/v1/backups', null, function (error, data, status) {
+ if (error) return callback(error);
+ if (status !== 200) return callback(new ClientError(status, data));
+
callback(null, data.backups);
- }).error(defaultErrorHandler(callback));
+ });
};
Client.prototype.getLatestTaskByType = function (type, callback) {
- get('/api/v1/tasks?page=1&per_page=1&type=' + type).success(function (data, status) {
- if (status !== 200 || typeof data !== 'object') return callback(new ClientError(status, data));
+ get('/api/v1/tasks?page=1&per_page=1&type=' + type, null, function (error, data, status) {
+ if (error) return callback(error);
+ if (status !== 200) return callback(new ClientError(status, data));
+
callback(null, data.tasks[0] || null);
- }).error(defaultErrorHandler(callback));
+ });
};
Client.prototype.getTask = function (taskId, callback) {
- get('/api/v1/tasks/' + taskId).success(function (data, status) {
- if (status !== 200 || typeof data !== 'object') return callback(new ClientError(status, data));
+ get('/api/v1/tasks/' + taskId, null, function (error, data, status) {
+ if (error) return callback(error);
+ if (status !== 200) return callback(new ClientError(status, data));
+
callback(null, data);
- }).error(defaultErrorHandler(callback));
+ });
};
Client.prototype.getTaskLogs = function (taskId, follow, lines, callback) {
@@ -584,25 +673,31 @@ angular.module('Application').service('Client', ['$http', '$interval', 'md5', 'N
var eventSource = new EventSource(client.apiOrigin + '/api/v1/tasks/' + taskId + '/logstream?lines=' + lines + '&access_token=' + token);
callback(null, eventSource);
} else {
- get('/api/v1/services/' + taskId + '/logs?lines=100').success(function (data, status) {
- if (status !== 200 || typeof data !== 'object') return callback(new ClientError(status, data));
+ get('/api/v1/services/' + taskId + '/logs?lines=100', null, function (error, data, status) {
+ if (error) return callback(error);
+ if (status !== 200) return callback(new ClientError(status, data));
+
callback(null, data);
- }).error(defaultErrorHandler(callback));
+ });
}
};
Client.prototype.startBackup = function (callback) {
- post('/api/v1/backups').success(function(data, status) {
- if (status !== 202 || typeof data !== 'object') return callback(new ClientError(status, data));
+ post('/api/v1/backups', null, function (error, data, status) {
+ if (error) return callback(error);
+ if (status !== 202) return callback(new ClientError(status, data));
+
callback(null, data.taskId);
- }).error(defaultErrorHandler(callback));
+ });
};
Client.prototype.stopTask = function (taskId, callback) {
- post('/api/v1/tasks/' + taskId + '/stop').success(function(data, status) {
- if (status !== 202 || typeof data !== 'object') return callback(new ClientError(status, data));
+ post('/api/v1/tasks/' + taskId + '/stop', null, function (error, data, status) {
+ if (error) return callback(error);
+ if (status !== 202) return callback(new ClientError(status, data));
+
callback(null, data);
- }).error(defaultErrorHandler(callback));
+ });
};
Client.prototype.restore = function (backupConfig, backupId, version, callback) {
@@ -612,10 +707,12 @@ angular.module('Application').service('Client', ['$http', '$interval', 'md5', 'N
version: version
};
- post('/api/v1/cloudron/restore', data).success(function(data, status) {
+ post('/api/v1/cloudron/restore', data, null, function (error, data, status) {
+ if (error) return callback(error);
if (status !== 200) return callback(new ClientError(status));
+
callback(null);
- }).error(defaultErrorHandler(callback));
+ });
};
Client.prototype.getEventLogs = function (actions, search, page, perPage, callback) {
@@ -628,11 +725,12 @@ angular.module('Application').service('Client', ['$http', '$interval', 'md5', 'N
}
};
- get('/api/v1/cloudron/eventlog', config).success(function (data, status) {
- if (status !== 200 || typeof data !== 'object') return callback(new ClientError(status, data));
+ get('/api/v1/cloudron/eventlog', config, null, function (error, data, status) {
+ if (error) return callback(error);
+ if (status !== 200) return callback(new ClientError(status, data));
callback(null, data.eventlogs);
- }).error(defaultErrorHandler(callback));
+ });
};
Client.prototype.getPlatformLogs = function (unit, follow, lines, callback) {
@@ -640,10 +738,12 @@ angular.module('Application').service('Client', ['$http', '$interval', 'md5', 'N
var eventSource = new EventSource(client.apiOrigin + '/api/v1/cloudron/logstream/' + unit + '?lines=' + lines + '&access_token=' + token);
callback(null, eventSource);
} else {
- get('/api/v1/cloudron/logs/' + unit + '?lines=100').success(function (data, status) {
- if (status !== 200 || typeof data !== 'object') return callback(new ClientError(status, data));
+ get('/api/v1/cloudron/logs/' + unit + '?lines=100', null, function (error, data, status) {
+ if (error) return callback(error);
+ if (status !== 200) return callback(new ClientError(status, data));
+
callback(null, data);
- }).error(defaultErrorHandler(callback));
+ });
}
};
@@ -652,18 +752,22 @@ angular.module('Application').service('Client', ['$http', '$interval', 'md5', 'N
var eventSource = new EventSource(client.apiOrigin + '/api/v1/services/' + serviceName + '/logstream?lines=' + lines + '&access_token=' + token);
callback(null, eventSource);
} else {
- get('/api/v1/services/' + serviceName + '/logs?lines=100').success(function (data, status) {
- if (status !== 200 || typeof data !== 'object') return callback(new ClientError(status, data));
+ get('/api/v1/services/' + serviceName + '/logs?lines=100', null, function (error, data, status) {
+ if (error) return callback(error);
+ if (status !== 200) return callback(new ClientError(status, data));
+
callback(null, data);
- }).error(defaultErrorHandler(callback));
+ });
}
};
Client.prototype.getApps = function (callback) {
- get('/api/v1/apps').success(function (data, status) {
- if (status !== 200 || typeof data !== 'object') return callback(new ClientError(status, data));
+ get('/api/v1/apps', null, function (error, data, status) {
+ if (error) return callback(error);
+ if (status !== 200) return callback(new ClientError(status, data));
+
callback(null, data.apps);
- }).error(defaultErrorHandler(callback));
+ });
};
Client.prototype.getAppLogs = function (appId, follow, lines, callback) {
@@ -671,81 +775,103 @@ angular.module('Application').service('Client', ['$http', '$interval', 'md5', 'N
var eventSource = new EventSource(client.apiOrigin + '/api/v1/apps/' + appId + '/logstream?lines=' + lines + '&access_token=' + token);
callback(null, eventSource);
} else {
- get('/api/v1/apps/' + appId + '/logs').success(function (data, status) {
- if (status !== 200 || typeof data !== 'object') return callback(new ClientError(status, data));
+ get('/api/v1/apps/' + appId + '/logs', null, function (error, data, status) {
+ if (error) return callback(error);
+ if (status !== 200) return callback(new ClientError(status, data));
+
callback(null, data);
- }).error(defaultErrorHandler(callback));
+ });
}
};
Client.prototype.getAppBackups = function (appId, callback) {
- get('/api/v1/apps/' + appId + '/backups').success(function (data, status) {
- if (status !== 200 || typeof data !== 'object') return callback(new ClientError(status, data));
+ get('/api/v1/apps/' + appId + '/backups', null, function (error, data, status) {
+ if (error) return callback(error);
+ if (status !== 200) return callback(new ClientError(status, data));
+
callback(null, data.backups);
- }).error(defaultErrorHandler(callback));
+ });
};
Client.prototype.getServices = function (callback) {
- get('/api/v1/services').success(function (data, status) {
- if (status !== 200 || typeof data !== 'object') return callback(new ClientError(status, data));
+ get('/api/v1/services', null, function (error, data, status) {
+ if (error) return callback(error);
+ if (status !== 200) return callback(new ClientError(status, data));
+
callback(null, data.services);
- }).error(defaultErrorHandler(callback));
+ });
};
Client.prototype.getService = function (serviceName, callback) {
- get('/api/v1/services/' + serviceName).success(function (data, status) {
- if (status !== 200 || typeof data !== 'object') return callback(new ClientError(status, data));
+ get('/api/v1/services/' + serviceName, null, function (error, data, status) {
+ if (error) return callback(error);
+ if (status !== 200) return callback(new ClientError(status, data));
+
callback(null, data.service);
- }).error(defaultErrorHandler(callback));
+ });
};
Client.prototype.configureService = function (serviceName, memoryLimit, callback) {
- post('/api/v1/services/' + serviceName, { memory: memoryLimit }).success(function (data, status) {
+ post('/api/v1/services/' + serviceName, { memory: memoryLimit }, null, function (error, data, status) {
+ if (error) return callback(error);
if (status !== 202) return callback(new ClientError(status, data));
+
callback(null);
- }).error(defaultErrorHandler(callback));
+ });
};
Client.prototype.restartService = function (serviceName, callback) {
- post('/api/v1/services/' + serviceName + '/restart').success(function (data, status) {
+ post('/api/v1/services/' + serviceName + '/restart', null, function (error, data, status) {
+ if (error) return callback(error);
if (status !== 202) return callback(new ClientError(status, data));
+
callback(null);
- }).error(defaultErrorHandler(callback));
+ });
};
Client.prototype.getUsers = function (callback) {
- get('/api/v1/users').success(function (data, status) {
- if (status !== 200 || typeof data !== 'object') return callback(new ClientError(status, data));
+ get('/api/v1/users', null, function (error, data, status) {
+ if (error) return callback(error);
+ if (status !== 200) return callback(new ClientError(status, data));
+
callback(null, data.users);
- }).error(defaultErrorHandler(callback));
+ });
};
Client.prototype.getUser = function (userId, callback) {
- get('/api/v1/users/' + userId).success(function (data, status) {
- if (status !== 200 || typeof data !== 'object') return callback(new ClientError(status, data));
+ get('/api/v1/users/' + userId, null, function (error, data, status) {
+ if (error) return callback(error);
+ if (status !== 200) return callback(new ClientError(status, data));
+
callback(null, data);
- }).error(defaultErrorHandler(callback));
+ });
};
Client.prototype.getGroups = function (callback) {
- get('/api/v1/groups').success(function (data, status) {
- if (status !== 200 || typeof data !== 'object') return callback(new ClientError(status, data));
+ get('/api/v1/groups', null, function (error, data, status) {
+ if (error) return callback(error);
+ if (status !== 200) return callback(new ClientError(status, data));
+
callback(null, data.groups);
- }).error(defaultErrorHandler(callback));
+ });
};
Client.prototype.setGroups = function (userId, groupIds, callback) {
- put('/api/v1/users/' + userId + '/groups', { groupIds: groupIds }).success(function (data, status) {
+ put('/api/v1/users/' + userId + '/groups', { groupIds: groupIds }, null, function (error, data, status) {
+ if (error) return callback(error);
if (status !== 204) return callback(new ClientError(status, data));
+
callback(null);
- }).error(defaultErrorHandler(callback));
+ });
};
Client.prototype.getGroup = function (groupId, callback) {
- get('/api/v1/groups/' + groupId).success(function (data, status) {
- if (status !== 200 || typeof data !== 'object') return callback(new ClientError(status, data));
+ get('/api/v1/groups/' + groupId, null, function (error, data, status) {
+ if (error) return callback(error);
+ if (status !== 200) return callback(new ClientError(status, data));
+
callback(null, data);
- }).error(defaultErrorHandler(callback));
+ });
};
Client.prototype.createGroup = function (name, callback) {
@@ -753,10 +879,12 @@ angular.module('Application').service('Client', ['$http', '$interval', 'md5', 'N
name: name
};
- post('/api/v1/groups', data).success(function(data, status) {
- if (status !== 201 || typeof data !== 'object') return callback(new ClientError(status, data));
+ post('/api/v1/groups', data, null, function (error, data, status) {
+ if (error) return callback(error);
+ if (status !== 201) return callback(new ClientError(status, data));
+
callback(null, data);
- }).error(defaultErrorHandler(callback));
+ });
};
Client.prototype.updateGroup = function (id, name, callback) {
@@ -764,10 +892,12 @@ angular.module('Application').service('Client', ['$http', '$interval', 'md5', 'N
name: name
};
- post('/api/v1/groups/' + id, data).success(function(data, status) {
- if (status !== 200 || typeof data !== 'object') return callback(new ClientError(status, data));
+ post('/api/v1/groups/' + id, data, null, function (error, data, status) {
+ if (error) return callback(error);
+ if (status !== 200) return callback(new ClientError(status, data));
+
callback(null, data);
- }).error(defaultErrorHandler(callback));
+ });
};
Client.prototype.setGroupMembers = function (id, userIds, callback) {
@@ -776,10 +906,12 @@ angular.module('Application').service('Client', ['$http', '$interval', 'md5', 'N
};
- put('/api/v1/groups/' + id + '/members', data).success(function(data, status) {
- if (status !== 200 || typeof data !== 'object') return callback(new ClientError(status, data));
+ put('/api/v1/groups/' + id + '/members', data, null, function (error, data, status) {
+ if (error) return callback(error);
+ if (status !== 200) return callback(new ClientError(status, data));
+
callback(null, data);
- }).error(defaultErrorHandler(callback));
+ });
};
Client.prototype.removeGroup = function (groupId, password, callback) {
@@ -792,17 +924,21 @@ angular.module('Application').service('Client', ['$http', '$interval', 'md5', 'N
}
};
- del('/api/v1/groups/' + groupId, config).success(function(data, status) {
+ del('/api/v1/groups/' + groupId, config, function (error, data, status) {
+ if (error) return callback(error);
if (status !== 204) return callback(new ClientError(status, data));
+
callback(null, data);
- }).error(defaultErrorHandler(callback));
+ });
};
Client.prototype.getApp = function (appId, callback) {
- get('/api/v1/apps/' + appId).success(function (data, status) {
- if (status !== 200 || typeof data !== 'object') return callback(new ClientError(status, data));
+ get('/api/v1/apps/' + appId, null, function (error, data, status) {
+ if (error) return callback(error);
+ if (status !== 200) return callback(new ClientError(status, data));
+
callback(null, data);
- }).error(defaultErrorHandler(callback));
+ });
};
Client.prototype.getCachedApp = function (appId, callback) {
@@ -828,17 +964,21 @@ angular.module('Application').service('Client', ['$http', '$interval', 'md5', 'N
};
Client.prototype.createInvite = function (userId, callback) {
- post('/api/v1/users/' + userId + '/create_invite').success(function (data, status) {
+ post('/api/v1/users/' + userId + '/create_invite', null, function (error, data, status) {
+ if (error) return callback(error);
if (status !== 200) return callback(new ClientError(status, data));
+
callback(null, data.resetToken);
- }).error(defaultErrorHandler(callback));
+ });
};
Client.prototype.sendInvite = function (userId, callback) {
- post('/api/v1/users/' + userId + '/send_invite').success(function (data, status) {
+ post('/api/v1/users/' + userId + '/send_invite', null, function (error, data, status) {
+ if (error) return callback(error);
if (status !== 200) return callback(new ClientError(status, data));
+
callback(null);
- }).error(defaultErrorHandler(callback));
+ });
};
Client.prototype.setup = function (domain, zoneName, provider, config, tlsConfig, callback) {
@@ -852,10 +992,12 @@ angular.module('Application').service('Client', ['$http', '$interval', 'md5', 'N
}
};
- post('/api/v1/cloudron/setup', data).success(function(data, status) {
+ post('/api/v1/cloudron/setup', data, null, function (error, data, status) {
+ if (error) return callback(error);
if (status !== 200) return callback(new ClientError(status, data));
+
callback(null);
- }).error(defaultErrorHandler(callback));
+ });
};
Client.prototype.createAdmin = function (username, password, email, displayName, setupToken, callback) {
@@ -871,21 +1013,24 @@ angular.module('Application').service('Client', ['$http', '$interval', 'md5', 'N
var query = '';
if (setupToken) query = '?setupToken=' + setupToken;
- post('/api/v1/cloudron/activate' + query, data).success(function(data, status) {
- if (status !== 201 || typeof data !== 'object') return callback(new ClientError(status, data));
+ post('/api/v1/cloudron/activate' + query, data, null, function (error, data, status) {
+ if (error) return callback(error);
+ if (status !== 201) return callback(new ClientError(status, data));
that.setToken(data.token);
that.setUserInfo({ username: username, email: email, admin: true, twoFactorAuthenticationEnabled: false });
callback(null, data.activated);
- }).error(defaultErrorHandler(callback));
+ });
};
Client.prototype.getOAuthClients = function (callback) {
- get('/api/v1/clients').success(function(data, status) {
- if (status !== 200 || typeof data !== 'object') return callback(new ClientError(status, data));
+ get('/api/v1/clients', null, function (error, data, status) {
+ if (error) return callback(error);
+ if (status !== 200) return callback(new ClientError(status, data));
+
callback(null, data.clients);
- }).error(defaultErrorHandler(callback));
+ });
};
Client.prototype.createOAuthClient = function (appId, scope, redirectURI, callback) {
@@ -895,17 +1040,21 @@ angular.module('Application').service('Client', ['$http', '$interval', 'md5', 'N
redirectURI: redirectURI
};
- post('/api/v1/clients', data).success(function(data, status) {
- if (status !== 201 || typeof data !== 'object') return callback(new ClientError(status, data));
+ post('/api/v1/clients', data, null, function (error, data, status) {
+ if (error) return callback(error);
+ if (status !== 201) return callback(new ClientError(status, data));
+
callback(null, data.clients);
- }).error(defaultErrorHandler(callback));
+ });
};
Client.prototype.delOAuthClient = function (id, callback) {
- del('/api/v1/clients/' + id).success(function(data, status) {
+ del('/api/v1/clients/' + id, null, function (error, data, status) {
+ if (error) return callback(error);
if (status !== 204) return callback(new ClientError(status, data));
+
callback(null);
- }).error(defaultErrorHandler(callback));
+ });
};
Client.prototype.createTokenByClientId = function (id, scope, expiresAt, name, callback) {
@@ -914,71 +1063,90 @@ angular.module('Application').service('Client', ['$http', '$interval', 'md5', 'N
expiresAt: expiresAt,
name: name || ''
};
- post('/api/v1/clients/' + id + '/tokens', data).success(function(data, status) {
+
+ post('/api/v1/clients/' + id + '/tokens', data, null, function (error, data, status) {
+ if (error) return callback(error);
if (status !== 201) return callback(new ClientError(status, data));
+
callback(null, data.token);
- }).error(defaultErrorHandler(callback));
+ });
};
Client.prototype.getTokensByClientId = function (id, callback) {
- get('/api/v1/clients/' + id + '/tokens').success(function(data, status) {
+ get('/api/v1/clients/' + id + '/tokens', null, function (error, data, status) {
+ if (error) return callback(error);
if (status !== 200) return callback(new ClientError(status, data));
+
callback(null, data.tokens);
- }).error(defaultErrorHandler(callback));
+ });
};
Client.prototype.delTokensByClientId = function (id, callback) {
- del('/api/v1/clients/' + id + '/tokens').success(function(data, status) {
+ del('/api/v1/clients/' + id + '/tokens', null, function (error, data, status) {
+ if (error) return callback(error);
if (status !== 204) return callback(new ClientError(status, data));
+
callback(null);
- }).error(defaultErrorHandler(callback));
+ });
};
Client.prototype.delToken = function (clientId, tokenId, callback) {
- del('/api/v1/clients/' + clientId + '/tokens/' + tokenId).success(function(data, status) {
+ del('/api/v1/clients/' + clientId + '/tokens/' + tokenId, null, function (error, data, status) {
+ if (error) return callback(error);
if (status !== 204) return callback(new ClientError(status, data));
+
callback(null);
- }).error(defaultErrorHandler(callback));
+ });
};
Client.prototype.update = function (callback) {
var data = { };
- post('/api/v1/cloudron/update', data).success(function(data, status) {
- if (status !== 202 || typeof data !== 'object') return callback(new ClientError(status, data));
+ post('/api/v1/cloudron/update', data, null, function (error, data, status) {
+ if (error) return callback(error);
+ if (status !== 202) return callback(new ClientError(status, data));
+
callback(null, data.taskId);
- }).error(defaultErrorHandler(callback));
+ });
};
Client.prototype.isRebootRequired = function (callback) {
- get('/api/v1/cloudron/reboot').success(function(data, status) {
- if (status !== 200 || typeof data !== 'object') return callback(new ClientError(status, data));
+ get('/api/v1/cloudron/reboot', null, function (error, data, status) {
+ if (error) return callback(error);
+ if (status !== 200) return callback(new ClientError(status, data));
+
callback(null, data.rebootRequired);
- }).error(defaultErrorHandler(callback));
+ });
};
Client.prototype.reboot = function (callback) {
- post('/api/v1/cloudron/reboot').success(function(data, status) {
- if (status !== 202 || typeof data !== 'object') return callback(new ClientError(status, data));
+ post('/api/v1/cloudron/reboot', {}, null, function (error, data, status) {
+ if (error) return callback(error);
+ if (status !== 202) return callback(new ClientError(status, data));
+
callback(null, data);
- }).error(defaultErrorHandler(callback));
+ });
};
Client.prototype.changePlan = function (options, password, callback) {
var data = options;
data.password = password;
- post('/api/v1/caas/change_plan', data).success(function(data, status) {
- if (status !== 202 || typeof data !== 'object') return callback(new ClientError(status, data));
+ post('/api/v1/caas/change_plan', data, null, function (error, data, status) {
+ if (error) return callback(error);
+ if (status !== 202) return callback(new ClientError(status, data));
+
callback(null, data);
- }).error(defaultErrorHandler(callback));
+ });
};
Client.prototype.setAdmin = function (domain, password, callback) {
- post('/api/v1/domains/' + domain + '/set_admin', { password: password }).success(function(data, status) {
- if (status !== 202 || typeof data !== 'object') return callback(new ClientError(status, data));
+ post('/api/v1/domains/' + domain + '/set_admin', { password: password }, null, function (error, data, status) {
+ if (error) return callback(error);
+ if (status !== 202) return callback(new ClientError(status, data));
+
callback(null, data);
- }).error(defaultErrorHandler(callback));
+ });
};
Client.prototype.setCertificate = function (certificateFile, keyFile, callback) {
@@ -987,17 +1155,21 @@ angular.module('Application').service('Client', ['$http', '$interval', 'md5', 'N
key: keyFile
};
- post('/api/v1/settings/certificate', data).success(function(data, status) {
+ post('/api/v1/settings/certificate', data, null, function (error, data, status) {
+ if (error) return callback(error);
if (status !== 202) return callback(new ClientError(status, data));
+
callback(null);
- }).error(defaultErrorHandler(callback));
+ });
};
Client.prototype.disks = function (callback) {
- get('/api/v1/cloudron/disks').success(function (data, status) {
- if (status !== 200 || typeof data !== 'object') return callback(new ClientError(status, data));
+ get('/api/v1/cloudron/disks', null, function (error, data, status) {
+ if (error) return callback(error);
+ if (status !== 200) return callback(new ClientError(status, data));
+
callback(null, data);
- }).error(defaultErrorHandler(callback));
+ });
};
Client.prototype.graphs = function (targets, from, callback) {
@@ -1009,10 +1181,12 @@ angular.module('Application').service('Client', ['$http', '$interval', 'md5', 'N
}
};
- get('/api/v1/cloudron/graphs', config).success(function (data, status) {
- if (status !== 200 || typeof data !== 'object') return callback(new ClientError(status, data));
+ get('/api/v1/cloudron/graphs', config, function (error, data, status) {
+ if (error) return callback(error);
+ if (status !== 200) return callback(new ClientError(status, data));
+
callback(null, data);
- }).error(defaultErrorHandler(callback));
+ });
};
Client.prototype.feedback = function (type, subject, description, appId /* optional */, callback) {
@@ -1023,10 +1197,12 @@ angular.module('Application').service('Client', ['$http', '$interval', 'md5', 'N
appId: appId || undefined
};
- post('/api/v1/feedback', data).success(function (data, status) {
+ post('/api/v1/feedback', data, null, function (error, data, status) {
+ if (error) return callback(error);
if (status !== 201) return callback(new ClientError(status, data));
+
callback(null);
- }).error(defaultErrorHandler(callback));
+ });
};
Client.prototype.createUser = function (user, callback) {
@@ -1038,10 +1214,12 @@ angular.module('Application').service('Client', ['$http', '$interval', 'md5', 'N
if (user.username !== null) data.username = user.username;
- post('/api/v1/users', data).success(function(data, status) {
- if (status !== 201 || typeof data !== 'object') return callback(new ClientError(status, data));
+ post('/api/v1/users', data, null, function (error, data, status) {
+ if (error) return callback(error);
+ if (status !== 201) return callback(new ClientError(status, data));
+
callback(null, data);
- }).error(defaultErrorHandler(callback));
+ });
};
Client.prototype.updateUser = function (user, callback) {
@@ -1052,10 +1230,12 @@ angular.module('Application').service('Client', ['$http', '$interval', 'md5', 'N
admin: user.admin
};
- post('/api/v1/users/' + user.id, data).success(function(data, status) {
+ post('/api/v1/users/' + user.id, data, null, function (error, data, status) {
+ if (error) return callback(error);
if (status !== 204) return callback(new ClientError(status, data));
+
callback(null);
- }).error(defaultErrorHandler(callback));
+ });
};
Client.prototype.transferOwnership = function (oldOwnerId, newOwnerId, callback) {
@@ -1063,10 +1243,12 @@ angular.module('Application').service('Client', ['$http', '$interval', 'md5', 'N
ownerId: newOwnerId
};
- post('/api/v1/users/' + oldOwnerId + '/transfer', data).success(function (data, status) {
+ post('/api/v1/users/' + oldOwnerId + '/transfer', data, null, function (error, data, status) {
+ if (error) return callback(error);
if (status !== 200) return callback(new ClientError(status, data));
+
callback(null);
- }).error(defaultErrorHandler(callback));
+ });
};
Client.prototype.removeUser = function (userId, password, callback) {
@@ -1079,17 +1261,21 @@ angular.module('Application').service('Client', ['$http', '$interval', 'md5', 'N
}
};
- del('/api/v1/users/' + userId, config).success(function(data, status) {
+ del('/api/v1/users/' + userId, config, function (error, data, status) {
+ if (error) return callback(error);
if (status !== 204) return callback(new ClientError(status, data));
+
callback(null);
- }).error(defaultErrorHandler(callback));
+ });
};
Client.prototype.updateProfile = function (data, callback) {
- post('/api/v1/profile', data).success(function(data, status) {
+ post('/api/v1/profile', data, null, function (error, data, status) {
+ if (error) return callback(error);
if (status !== 204) return callback(new ClientError(status, data));
+
callback(null, data);
- }).error(defaultErrorHandler(callback));
+ });
};
Client.prototype.changePassword = function (currentPassword, newPassword, callback) {
@@ -1098,19 +1284,23 @@ angular.module('Application').service('Client', ['$http', '$interval', 'md5', 'N
newPassword: newPassword
};
- post('/api/v1/profile/password', data).success(function(data, status) {
+ post('/api/v1/profile/password', data, null, function (error, data, status) {
+ if (error) return callback(error);
if (status !== 204) return callback(new ClientError(status, data));
+
callback(null, data);
- }).error(defaultErrorHandler(callback));
+ });
};
Client.prototype.setTwoFactorAuthenticationSecret = function (callback) {
var data = {};
- post('/api/v1/profile/twofactorauthentication', data).success(function(data, status) {
+ post('/api/v1/profile/twofactorauthentication', data, null, function (error, data, status) {
+ if (error) return callback(error);
if (status !== 201) return callback(new ClientError(status, data));
+
callback(null, data);
- }).error(defaultErrorHandler(callback));
+ });
};
Client.prototype.enableTwoFactorAuthentication = function (totpToken, callback) {
@@ -1118,10 +1308,12 @@ angular.module('Application').service('Client', ['$http', '$interval', 'md5', 'N
totpToken: totpToken
};
- post('/api/v1/profile/twofactorauthentication/enable', data).success(function(data, status) {
+ post('/api/v1/profile/twofactorauthentication/enable', data, null, function (error, data, status) {
+ if (error) return callback(error);
if (status !== 202) return callback(new ClientError(status, data));
+
callback(null);
- }).error(defaultErrorHandler(callback));
+ });
};
Client.prototype.disableTwoFactorAuthentication = function (password, callback) {
@@ -1129,10 +1321,12 @@ angular.module('Application').service('Client', ['$http', '$interval', 'md5', 'N
password: password
};
- post('/api/v1/profile/twofactorauthentication/disable', data).success(function(data, status) {
+ post('/api/v1/profile/twofactorauthentication/disable', data, null, function (error, data, status) {
+ if (error) return callback(error);
if (status !== 202) return callback(new ClientError(status, data));
+
callback(null);
- }).error(defaultErrorHandler(callback));
+ });
};
Client.prototype.refreshUserInfo = function (callback) {
@@ -1318,11 +1512,12 @@ angular.module('Application').service('Client', ['$http', '$interval', 'md5', 'N
client_secret: this._clientSecret
};
- post('/api/v1/oauth/token?response_type=token&client_id=' + this._clientId, data).success(function(data, status) {
- if (status !== 200 || typeof data !== 'object') return callback(new ClientError(status, data));
+ post('/api/v1/oauth/token?response_type=token&client_id=' + this._clientId, data, null, function (error, data, status) {
+ if (error) return callback(error);
+ if (status !== 200) return callback(new ClientError(status, data));
callback(null, data.access_token);
- }).error(defaultErrorHandler(callback));
+ });
};
Client.prototype.enoughResourcesAvailable = function (app) {
@@ -1339,25 +1534,33 @@ angular.module('Application').service('Client', ['$http', '$interval', 'md5', 'N
var fd = new FormData();
fd.append('file', file);
- post('/api/v1/apps/' + appId + '/upload?file=/tmp/' + file.name, fd, {
+ var config = {
headers: { 'Content-Type': undefined },
transformRequest: angular.identity,
uploadEventHandlers: {
progress: progressCallback
}
- }).success(function(data, status) {
+ };
+
+ post('/api/v1/apps/' + appId + '/upload?file=/tmp/' + file.name, fd, config, function (error, data, status) {
+ if (error) return callback(error);
if (status !== 202) return callback(new ClientError(status, data));
+
callback(null);
- }).error(defaultErrorHandler(callback));
+ });
};
Client.prototype.checkDownloadableFile = function (appId, filePath, callback) {
- head('/api/v1/apps/' + appId + '/download?file=' + filePath, {
+ var config = {
headers: { 'Content-Type': undefined }
- }).success(function(data, status) {
+ };
+
+ head('/api/v1/apps/' + appId + '/download?file=' + filePath, config, function (error, data, status) {
+ if (error) return callback(error);
if (status !== 200) return callback(new ClientError(status, data));
+
callback(null);
- }).error(defaultErrorHandler(callback));
+ });
};
Client.prototype.sendTestMail = function (domain, to, callback) {
@@ -1365,32 +1568,40 @@ angular.module('Application').service('Client', ['$http', '$interval', 'md5', 'N
to: to
};
- post('/api/v1/mail/' + domain + '/send_test_mail', data).success(function(data, status) {
+ post('/api/v1/mail/' + domain + '/send_test_mail', data, null, function (error, data, status) {
+ if (error) return callback(error);
if (status !== 202) return callback(new ClientError(status, data));
+
callback(null);
- }).error(defaultErrorHandler(callback));
+ });
};
// Domains
Client.prototype.getDomains = function (callback) {
- get('/api/v1/domains').success(function (data, status) {
- if (status !== 200 || typeof data !== 'object') return callback(new ClientError(status, data));
+ get('/api/v1/domains', null, function (error, data, status) {
+ if (error) return callback(error);
+ if (status !== 200) return callback(new ClientError(status, data));
+
callback(null, data.domains);
- }).error(defaultErrorHandler(callback));
+ });
};
Client.prototype.getDomain = function (domain, callback) {
- get('/api/v1/domains/' + domain).success(function (data, status) {
- if (status !== 200 || typeof data !== 'object') return callback(new ClientError(status, data));
+ get('/api/v1/domains/' + domain, null, function (error, data, status) {
+ if (error) return callback(error);
+ if (status !== 200) return callback(new ClientError(status, data));
+
callback(null, data);
- }).error(defaultErrorHandler(callback));
+ });
};
Client.prototype.addMailDomain = function (domain, callback) {
- post('/api/v1/mail', { domain: domain }).success(function (data, status) {
+ post('/api/v1/mail', { domain: domain }, null, function (error, data, status) {
+ if (error) return callback(error);
if (status !== 201) return callback(new ClientError(status, data));
+
callback(null);
- }).error(defaultErrorHandler(callback)); // this doesn't call defaultErrorHandler till we fix domains code to use this directly
+ });
};
Client.prototype.addDomain = function (domain, zoneName, provider, config, fallbackCertificate, tlsConfig, callback) {
@@ -1406,11 +1617,12 @@ angular.module('Application').service('Client', ['$http', '$interval', 'md5', 'N
if (fallbackCertificate) data.fallbackCertificate = fallbackCertificate;
// hack until we fix the domains.js
- post('/api/v1/domains', data).success(function (data, status) {
- if (status !== 201 || typeof data !== 'object') return callback(new ClientError(status, data));
+ post('/api/v1/domains', data, null, function (error, data, status) {
+ if (error) return callback(error);
+ if (status !== 201) return callback(new ClientError(status, data));
that.addMailDomain(domain, callback);
- }).error(defaultErrorHandler(callback));
+ });
};
Client.prototype.updateDomain = function (domain, zoneName, provider, config, fallbackCertificate, tlsConfig, callback) {
@@ -1424,11 +1636,12 @@ angular.module('Application').service('Client', ['$http', '$interval', 'md5', 'N
if (fallbackCertificate) data.fallbackCertificate = fallbackCertificate;
- put('/api/v1/domains/' + domain, data).success(function (data, status) {
+ put('/api/v1/domains/' + domain, data, null, function (error, data, status) {
+ if (error) return callback(error);
if (status !== 204) return callback(new ClientError(status, data));
that.setDnsRecords(domain, callback); // this is done so that an out-of-sync dkim key can be synced
- }).error(defaultErrorHandler(callback));
+ });
};
Client.prototype.removeMailDomain = function (domain, password, callback) {
@@ -1441,17 +1654,22 @@ angular.module('Application').service('Client', ['$http', '$interval', 'md5', 'N
}
};
- del('/api/v1/mail/' + domain, config).success(function (data, status) {
+ // FIXME
+ del('/api/v1/mail/' + domain, config, function (error, data, status) {
+ if (error) return callback(error);
if (status !== 204) return callback(new ClientError(status, data));
+
callback(null);
- }).error(callback); // this doesn't call defaultErrorHandler since we want to handle 404
+ });
};
Client.prototype.renewCerts = function (domain, callback) {
- post('/api/v1/cloudron/renew_certs', { domain: domain || null }).success(function (data, status) {
+ post('/api/v1/cloudron/renew_certs', { domain: domain || null }, null, function (error, data, status) {
+ if (error) return callback(error);
if (status !== 202) return callback(new ClientError(status, data));
+
callback(null);
- }).error(defaultErrorHandler(callback));
+ });
};
Client.prototype.removeDomain = function (domain, password, callback) {
@@ -1466,77 +1684,96 @@ angular.module('Application').service('Client', ['$http', '$interval', 'md5', 'N
this.removeMailDomain(domain, password, function () {
// hack: ignore errors until we fix the domains.js
- del('/api/v1/domains/' + domain, config).success(function (data, status) {
+ del('/api/v1/domains/' + domain, config, function (error, data, status) {
+ if (error) return callback(error);
if (status !== 204) return callback(new ClientError(status, data));
+
callback(null);
- }).error(defaultErrorHandler(callback));
+ });
});
};
// Email
Client.prototype.getMailConfigForDomain = function (domain, callback) {
- get('/api/v1/mail/' + domain).success(function (data, status) {
- if (status !== 200 || typeof data !== 'object') return callback(new ClientError(status, data));
+ get('/api/v1/mail/' + domain, null, function (error, data, status) {
+ if (error) return callback(error);
+ if (status !== 200) return callback(new ClientError(status, data));
+
callback(null, data);
- }).error(defaultErrorHandler(callback));
+ });
};
Client.prototype.enableMailForDomain = function (domain, enabled, callback) {
- post('/api/v1/mail/' + domain + '/enable', { enabled: enabled }).success(function (data, status) {
+ post('/api/v1/mail/' + domain + '/enable', { enabled: enabled }, null, function (error, data, status) {
+ if (error) return callback(error);
if (status !== 202) return callback(new ClientError(status, data));
+
callback(null);
- }).error(defaultErrorHandler(callback));
+ });
};
Client.prototype.setDnsRecords = function (domain, callback) {
- post('/api/v1/mail/' + domain + '/dns', { }).success(function (data, status) {
+ post('/api/v1/mail/' + domain + '/dns', {}, null, function (error, data, status) {
+ if (error) return callback(error);
if (status !== 201) return callback(new ClientError(status, data));
+
callback(null);
- }).error(defaultErrorHandler(callback));
+ });
};
Client.prototype.getMailStatusForDomain = function (domain, callback) {
- get('/api/v1/mail/' + domain + '/status').success(function (data, status) {
- if (status !== 200 || typeof data !== 'object') return callback(new ClientError(status, data));
+ get('/api/v1/mail/' + domain + '/status', null, function (error, data, status) {
+ if (error) return callback(error);
+ if (status !== 200) return callback(new ClientError(status, data));
+
callback(null, data);
- }).error(defaultErrorHandler(callback));
+ });
};
- Client.prototype.setMailRelay = function (domain, config, callback) {
- post('/api/v1/mail/' + domain + '/relay', config).success(function (data, status) {
+ Client.prototype.setMailRelay = function (domain, data, callback) {
+ post('/api/v1/mail/' + domain + '/relay', data, null, function (error, data, status) {
+ if (error) return callback(error);
if (status !== 202) return callback(new ClientError(status, data));
+
callback(null);
- }).error(defaultErrorHandler(callback));
+ });
};
Client.prototype.setCatchallAddresses = function (domain, addresses, callback) {
- post('/api/v1/mail/' + domain + '/catch_all', { addresses: addresses }).success(function(data, status) {
+ post('/api/v1/mail/' + domain + '/catch_all', { addresses: addresses }, null, function (error, data, status) {
+ if (error) return callback(error);
if (status !== 202) return callback(new ClientError(status, data));
+
callback(null);
- }).error(defaultErrorHandler(callback));
+ });
};
Client.prototype.setMailFromValidation = function (domain, enabled, callback) {
- post('/api/v1/mail/' + domain + '/mail_from_validation', { enabled: enabled }).success(function(data, status) {
+ post('/api/v1/mail/' + domain + '/mail_from_validation', { enabled: enabled }, null, function (error, data, status) {
+ if (error) return callback(error);
if (status !== 202) return callback(new ClientError(status, data));
+
callback(null);
- }).error(defaultErrorHandler(callback));
+ });
};
// Mailboxes
Client.prototype.getMailboxes = function (domain, callback) {
- get('/api/v1/mail/' + domain + '/mailboxes').success(function(data, status) {
+ get('/api/v1/mail/' + domain + '/mailboxes', null, function (error, data, status) {
+ if (error) return callback(error);
if (status !== 200) return callback(new ClientError(status, data));
callback(null, data.mailboxes);
- }).error(defaultErrorHandler(callback));
+ });
};
Client.prototype.getMailbox = function (domain, name, callback) {
- get('/api/v1/mail/' + domain + '/mailboxes/' + name).success(function(data, status) {
+ get('/api/v1/mail/' + domain + '/mailboxes/' + name, null, function (error, data, status) {
+ if (error) return callback(error);
if (status !== 200) return callback(new ClientError(status, data));
+
callback(null, data.mailbox);
- }).error(defaultErrorHandler(callback));
+ });
};
Client.prototype.addMailbox = function (domain, name, userId, callback) {
@@ -1545,10 +1782,12 @@ angular.module('Application').service('Client', ['$http', '$interval', 'md5', 'N
userId: userId
};
- post('/api/v1/mail/' + domain + '/mailboxes', data).success(function(data, status) {
+ post('/api/v1/mail/' + domain + '/mailboxes', data, null, function (error, data, status) {
+ if (error) return callback(error);
if (status !== 201) return callback(new ClientError(status, data));
+
callback(null);
- }).error(defaultErrorHandler(callback));
+ });
};
Client.prototype.updateMailbox = function (domain, name, userId, callback) {
@@ -1556,31 +1795,39 @@ angular.module('Application').service('Client', ['$http', '$interval', 'md5', 'N
userId: userId
};
- post('/api/v1/mail/' + domain + '/mailboxes/' + name, data).success(function(data, status) {
+ post('/api/v1/mail/' + domain + '/mailboxes/' + name, data, null, function (error, data, status) {
+ if (error) return callback(error);
if (status !== 204) return callback(new ClientError(status, data));
+
callback(null);
- }).error(defaultErrorHandler(callback));
+ });
};
Client.prototype.removeMailbox = function (domain, name, callback) {
- del('/api/v1/mail/' + domain + '/mailboxes/' + name).success(function(data, status) {
+ del('/api/v1/mail/' + domain + '/mailboxes/' + name, null, function (error, data, status) {
+ if (error) return callback(error);
if (status !== 201) return callback(new ClientError(status, data));
+
callback(null);
- }).error(defaultErrorHandler(callback));
+ });
};
Client.prototype.listAliases = function (domain, callback) {
- get('/api/v1/mail/' + domain + '/aliases').success(function(data, status) {
+ get('/api/v1/mail/' + domain + '/aliases', null, function (error, data, status) {
+ if (error) return callback(error);
if (status !== 200) return callback(new ClientError(status, data));
+
callback(null, data.aliases);
- }).error(defaultErrorHandler(callback));
+ });
};
Client.prototype.getAliases = function (domain, name, callback) {
- get('/api/v1/mail/' + domain + '/aliases/' + name).success(function(data, status) {
+ get('/api/v1/mail/' + domain + '/aliases/' + name, null, function (error, data, status) {
+ if (error) return callback(error);
if (status !== 200) return callback(new ClientError(status, data));
+
callback(null, data.aliases);
- }).error(defaultErrorHandler(callback));
+ });
};
Client.prototype.setAliases = function (domain, name, aliases, callback) {
@@ -1588,24 +1835,30 @@ angular.module('Application').service('Client', ['$http', '$interval', 'md5', 'N
aliases: aliases
};
- put('/api/v1/mail/' + domain + '/aliases/' + name, data).success(function(data, status) {
+ put('/api/v1/mail/' + domain + '/aliases/' + name, data, null, function (error, data, status) {
+ if (error) return callback(error);
if (status !== 202) return callback(new ClientError(status, data));
+
callback(null);
- }).error(defaultErrorHandler(callback));
+ });
};
Client.prototype.listMailingLists = function (domain, callback) {
- get('/api/v1/mail/' + domain + '/lists').success(function(data, status) {
+ get('/api/v1/mail/' + domain + '/lists', null, function (error, data, status) {
+ if (error) return callback(error);
if (status !== 200) return callback(new ClientError(status, data));
+
callback(null, data.lists);
- }).error(defaultErrorHandler(callback));
+ });
};
Client.prototype.getMailingList = function (domain, name, callback) {
- get('/api/v1/mail/' + domain + '/lists/' + name).success(function(data, status) {
+ get('/api/v1/mail/' + domain + '/lists/' + name, null, function (error, data, status) {
+ if (error) return callback(error);
if (status !== 200) return callback(new ClientError(status, data));
+
callback(null, data.list);
- }).error(defaultErrorHandler(callback));
+ });
};
Client.prototype.addMailingList = function (domain, name, members, callback) {
@@ -1614,10 +1867,12 @@ angular.module('Application').service('Client', ['$http', '$interval', 'md5', 'N
members: members
};
- post('/api/v1/mail/' + domain + '/lists', data).success(function(data, status) {
+ post('/api/v1/mail/' + domain + '/lists', data, null, function (error, data, status) {
+ if (error) return callback(error);
if (status !== 201) return callback(new ClientError(status, data));
+
callback(null);
- }).error(defaultErrorHandler(callback));
+ });
};
Client.prototype.updateMailingList = function (domain, name, members, callback) {
@@ -1625,17 +1880,21 @@ angular.module('Application').service('Client', ['$http', '$interval', 'md5', 'N
members: members
};
- post('/api/v1/mail/' + domain + '/lists/' + name, data).success(function(data, status) {
+ post('/api/v1/mail/' + domain + '/lists/' + name, data, null, function (error, data, status) {
+ if (error) return callback(error);
if (status !== 204) return callback(new ClientError(status, data));
+
callback(null);
- }).error(defaultErrorHandler(callback));
+ });
};
Client.prototype.removeMailingList = function (domain, name, callback) {
- del('/api/v1/mail/' + domain + '/lists/' + name).success(function(data, status) {
+ del('/api/v1/mail/' + domain + '/lists/' + name, null, function (error, data, status) {
+ if (error) return callback(error);
if (status !== 204) return callback(new ClientError(status, data));
+
callback(null);
- }).error(defaultErrorHandler(callback));
+ });
};
client = new Client();
diff --git a/src/theme.scss b/src/theme.scss
index 3fdfb1ce6..3a6e81d40 100644
--- a/src/theme.scss
+++ b/src/theme.scss
@@ -129,6 +129,16 @@ html, body {
padding: 0;
}
+.offline-banner {
+ position: fixed;
+ z-index: 30000;
+ background-color: $brand-danger;
+ width: 100%;
+ padding: 2px;
+ text-align: center;
+ color: white;
+}
+
.layout-root {
display: flex;
flex-direction: column;