diff --git a/webadmin/src/views/apps.html b/webadmin/src/views/apps.html
index 33b1fb1ca..be1b6fc22 100644
--- a/webadmin/src/views/apps.html
+++ b/webadmin/src/views/apps.html
@@ -8,7 +8,7 @@
@@ -265,7 +265,7 @@
{{ appError.app.message | prettyAppMessage }}
@@ -401,7 +401,7 @@
-
+
@@ -424,11 +424,11 @@
diff --git a/webadmin/src/views/apps.js b/webadmin/src/views/apps.js
index 00fca473b..c9b399cad 100644
--- a/webadmin/src/views/apps.js
+++ b/webadmin/src/views/apps.js
@@ -51,6 +51,127 @@ angular.module('Application').controller('AppsController', ['$scope', '$location
isAltDomainNaked: function () {
return ngTld.isNakedDomain($scope.appConfigure.location);
+ },
+
+ show: function (app) {
+ $scope.reset();
+
+ // fill relevant info from the app
+ $scope.appConfigure.app = app;
+ $scope.appConfigure.location = app.altDomain || app.location;
+ $scope.appConfigure.usingAltDomain = !!app.altDomain;
+ $scope.appConfigure.portBindingsInfo = app.manifest.tcpPorts || {}; // Portbinding map only for information
+ $scope. Option = app.accessRestriction ? 'groups' : 'any';
+ $scope.appConfigure.memoryLimit = app.memoryLimit || app.manifest.memoryLimit || (256 * 1024 * 1024);
+ $scope.appConfigure.xFrameOptions = app.xFrameOptions.indexOf('ALLOW-FROM') === 0 ? app.xFrameOptions.split(' ')[1] : '';
+ $scope.appConfigure.customAuth = !(app.manifest.addons['ldap'] || app.manifest.addons['oauth']);
+ $scope.appConfigure.robotsTxt = app.robotsTxt;
+ $scope.appConfigure.enableBackup = app.enableBackup;
+
+ // create ticks starting from manifest memory limit. the memory limit here is currently split into ram+swap (and thus *2 below)
+ // TODO: the *2 will overallocate since 4GB is max swap that cloudron itself allocates
+ $scope.appConfigure.memoryTicks = [ ];
+ var npow2 = Math.pow(2, Math.ceil(Math.log($scope.config.memory)/Math.log(2)));
+ for (var i = 256; i <= (npow2*2/1024/1024); i *= 2) {
+ if (i >= (app.manifest.memoryLimit/1024/1024 || 0)) $scope.appConfigure.memoryTicks.push(i * 1024 * 1024);
+ }
+ if (app.manifest.memoryLimit && $scope.appConfigure.memoryTicks[0] !== app.manifest.memoryLimit) {
+ $scope.appConfigure.memoryTicks.unshift(app.manifest.memoryLimit);
+ }
+
+ $scope.appConfigure.accessRestrictionOption = app.accessRestriction ? 'groups' : 'any';
+ $scope.appConfigure.accessRestriction = { users: [], groups: [] };
+
+ if (app.accessRestriction) {
+ var userSet = { };
+ app.accessRestriction.users.forEach(function (uid) { userSet[uid] = true; });
+ $scope.users.forEach(function (u) { if (userSet[u.id] === true) $scope.appConfigure.accessRestriction.users.push(u); });
+
+ var groupSet = { };
+ app.accessRestriction.groups.forEach(function (gid) { groupSet[gid] = true; });
+ $scope.groups.forEach(function (g) { if (groupSet[g.id] === true) $scope.appConfigure.accessRestriction.groups.push(g); });
+ }
+
+ // fill the portBinding structures. There might be holes in the app.portBindings, which signalizes a disabled port
+ for (var env in $scope.appConfigure.portBindingsInfo) {
+ if (app.portBindings && app.portBindings[env]) {
+ $scope.appConfigure.portBindings[env] = app.portBindings[env];
+ $scope.appConfigure.portBindingsEnabled[env] = true;
+ } else {
+ $scope.appConfigure.portBindings[env] = $scope.appConfigure.portBindingsInfo[env].defaultValue || 0;
+ $scope.appConfigure.portBindingsEnabled[env] = false;
+ }
+ }
+
+ $('#appConfigureModal').modal('show');
+ },
+
+ submit: function () {
+ $scope.appConfigure.busy = true;
+ $scope.appConfigure.error.other = null;
+ $scope.appConfigure.error.location = null;
+ $scope.appConfigure.error.xFrameOptions = null;
+
+ // only use enabled ports from portBindings
+ var finalPortBindings = {};
+ for (var env in $scope.appConfigure.portBindings) {
+ if ($scope.appConfigure.portBindingsEnabled[env]) {
+ finalPortBindings[env] = $scope.appConfigure.portBindings[env];
+ }
+ }
+
+ var finalAccessRestriction = null;
+ if ($scope.appConfigure.accessRestrictionOption === 'groups') {
+ finalAccessRestriction = { users: [], groups: [] };
+ finalAccessRestriction.users = $scope.appConfigure.accessRestriction.users.map(function (u) { return u.id; });
+ finalAccessRestriction.groups = $scope.appConfigure.accessRestriction.groups.map(function (g) { return g.id; });
+ }
+
+ var data = {
+ location: $scope.appConfigure.usingAltDomain ? $scope.appConfigure.app.location : $scope.appConfigure.location,
+ altDomain: $scope.appConfigure.usingAltDomain ? $scope.appConfigure.location : null,
+ portBindings: finalPortBindings,
+ accessRestriction: finalAccessRestriction,
+ cert: $scope.appConfigure.certificateFile,
+ key: $scope.appConfigure.keyFile,
+ xFrameOptions: $scope.appConfigure.xFrameOptions ? ('ALLOW-FROM ' + $scope.appConfigure.xFrameOptions) : 'SAMEORIGIN',
+ memoryLimit: $scope.appConfigure.memoryLimit === $scope.appConfigure.memoryTicks[0] ? 0 : $scope.appConfigure.memoryLimit,
+ robotsTxt: $scope.appConfigure.robotsTxt,
+ enableBackup: $scope.appConfigure.enableBackup
+ };
+
+ Client.configureApp($scope.appConfigure.app.id, data, function (error) {
+ if (error) {
+ if (error.statusCode === 409 && (error.message.indexOf('is reserved') !== -1 || error.message.indexOf('is already in use') !== -1)) {
+ $scope.appConfigure.error.port = error.message;
+ } else if (error.statusCode === 409) {
+ $scope.appConfigure.error.location = 'This name is already taken.';
+ $scope.appConfigureForm.location.$setPristine();
+ $('#appConfigureLocationInput').focus();
+ } else if (error.statusCode === 400 && error.message.indexOf('cert') !== -1 ) {
+ $scope.appConfigure.error.cert = error.message;
+ $scope.appConfigure.certificateFileName = '';
+ $scope.appConfigure.certificateFile = null;
+ $scope.appConfigure.keyFileName = '';
+ $scope.appConfigure.keyFile = null;
+ } else if (error.statusCode === 400 && error.message.indexOf('xFrameOptions') !== -1 ) {
+ $scope.appConfigure.error.xFrameOptions = error.message;
+ $scope.appConfigureForm.xFrameOptions.$setPristine();
+ $('#appConfigureXFrameOptionsInput').focus();
+ } else {
+ $scope.appConfigure.error.other = error.message;
+ }
+
+ $scope.appConfigure.busy = false;
+ return;
+ }
+
+ $scope.appConfigure.busy = false;
+
+ $('#appConfigureModal').modal('hide');
+
+ $scope.reset();
+ });
}
};
@@ -228,127 +349,6 @@ angular.module('Application').controller('AppsController', ['$scope', '$location
}
};
- $scope.showConfigure = function (app) {
- $scope.reset();
-
- // fill relevant info from the app
- $scope.appConfigure.app = app;
- $scope.appConfigure.location = app.altDomain || app.location;
- $scope.appConfigure.usingAltDomain = !!app.altDomain;
- $scope.appConfigure.portBindingsInfo = app.manifest.tcpPorts || {}; // Portbinding map only for information
- $scope. Option = app.accessRestriction ? 'groups' : 'any';
- $scope.appConfigure.memoryLimit = app.memoryLimit || app.manifest.memoryLimit || (256 * 1024 * 1024);
- $scope.appConfigure.xFrameOptions = app.xFrameOptions.indexOf('ALLOW-FROM') === 0 ? app.xFrameOptions.split(' ')[1] : '';
- $scope.appConfigure.customAuth = !(app.manifest.addons['ldap'] || app.manifest.addons['oauth']);
- $scope.appConfigure.robotsTxt = app.robotsTxt;
- $scope.appConfigure.enableBackup = app.enableBackup;
-
- // create ticks starting from manifest memory limit. the memory limit here is currently split into ram+swap (and thus *2 below)
- // TODO: the *2 will overallocate since 4GB is max swap that cloudron itself allocates
- $scope.appConfigure.memoryTicks = [ ];
- var npow2 = Math.pow(2, Math.ceil(Math.log($scope.config.memory)/Math.log(2)));
- for (var i = 256; i <= (npow2*2/1024/1024); i *= 2) {
- if (i >= (app.manifest.memoryLimit/1024/1024 || 0)) $scope.appConfigure.memoryTicks.push(i * 1024 * 1024);
- }
- if (app.manifest.memoryLimit && $scope.appConfigure.memoryTicks[0] !== app.manifest.memoryLimit) {
- $scope.appConfigure.memoryTicks.unshift(app.manifest.memoryLimit);
- }
-
- $scope.appConfigure.accessRestrictionOption = app.accessRestriction ? 'groups' : 'any';
- $scope.appConfigure.accessRestriction = { users: [], groups: [] };
-
- if (app.accessRestriction) {
- var userSet = { };
- app.accessRestriction.users.forEach(function (uid) { userSet[uid] = true; });
- $scope.users.forEach(function (u) { if (userSet[u.id] === true) $scope.appConfigure.accessRestriction.users.push(u); });
-
- var groupSet = { };
- app.accessRestriction.groups.forEach(function (gid) { groupSet[gid] = true; });
- $scope.groups.forEach(function (g) { if (groupSet[g.id] === true) $scope.appConfigure.accessRestriction.groups.push(g); });
- }
-
- // fill the portBinding structures. There might be holes in the app.portBindings, which signalizes a disabled port
- for (var env in $scope.appConfigure.portBindingsInfo) {
- if (app.portBindings && app.portBindings[env]) {
- $scope.appConfigure.portBindings[env] = app.portBindings[env];
- $scope.appConfigure.portBindingsEnabled[env] = true;
- } else {
- $scope.appConfigure.portBindings[env] = $scope.appConfigure.portBindingsInfo[env].defaultValue || 0;
- $scope.appConfigure.portBindingsEnabled[env] = false;
- }
- }
-
- $('#appConfigureModal').modal('show');
- };
-
- $scope.doConfigure = function () {
- $scope.appConfigure.busy = true;
- $scope.appConfigure.error.other = null;
- $scope.appConfigure.error.location = null;
- $scope.appConfigure.error.xFrameOptions = null;
-
- // only use enabled ports from portBindings
- var finalPortBindings = {};
- for (var env in $scope.appConfigure.portBindings) {
- if ($scope.appConfigure.portBindingsEnabled[env]) {
- finalPortBindings[env] = $scope.appConfigure.portBindings[env];
- }
- }
-
- var finalAccessRestriction = null;
- if ($scope.appConfigure.accessRestrictionOption === 'groups') {
- finalAccessRestriction = { users: [], groups: [] };
- finalAccessRestriction.users = $scope.appConfigure.accessRestriction.users.map(function (u) { return u.id; });
- finalAccessRestriction.groups = $scope.appConfigure.accessRestriction.groups.map(function (g) { return g.id; });
- }
-
- var data = {
- location: $scope.appConfigure.usingAltDomain ? $scope.appConfigure.app.location : $scope.appConfigure.location,
- altDomain: $scope.appConfigure.usingAltDomain ? $scope.appConfigure.location : null,
- portBindings: finalPortBindings,
- accessRestriction: finalAccessRestriction,
- cert: $scope.appConfigure.certificateFile,
- key: $scope.appConfigure.keyFile,
- xFrameOptions: $scope.appConfigure.xFrameOptions ? ('ALLOW-FROM ' + $scope.appConfigure.xFrameOptions) : 'SAMEORIGIN',
- memoryLimit: $scope.appConfigure.memoryLimit === $scope.appConfigure.memoryTicks[0] ? 0 : $scope.appConfigure.memoryLimit,
- robotsTxt: $scope.appConfigure.robotsTxt,
- enableBackup: $scope.appConfigure.enableBackup
- };
-
- Client.configureApp($scope.appConfigure.app.id, data, function (error) {
- if (error) {
- if (error.statusCode === 409 && (error.message.indexOf('is reserved') !== -1 || error.message.indexOf('is already in use') !== -1)) {
- $scope.appConfigure.error.port = error.message;
- } else if (error.statusCode === 409) {
- $scope.appConfigure.error.location = 'This name is already taken.';
- $scope.appConfigureForm.location.$setPristine();
- $('#appConfigureLocationInput').focus();
- } else if (error.statusCode === 400 && error.message.indexOf('cert') !== -1 ) {
- $scope.appConfigure.error.cert = error.message;
- $scope.appConfigure.certificateFileName = '';
- $scope.appConfigure.certificateFile = null;
- $scope.appConfigure.keyFileName = '';
- $scope.appConfigure.keyFile = null;
- } else if (error.statusCode === 400 && error.message.indexOf('xFrameOptions') !== -1 ) {
- $scope.appConfigure.error.xFrameOptions = error.message;
- $scope.appConfigureForm.xFrameOptions.$setPristine();
- $('#appConfigureXFrameOptionsInput').focus();
- } else {
- $scope.appConfigure.error.other = error.message;
- }
-
- $scope.appConfigure.busy = false;
- return;
- }
-
- $scope.appConfigure.busy = false;
-
- $('#appConfigureModal').modal('hide');
-
- $scope.reset();
- });
- };
-
$scope.showInformation = function (app) {
$scope.reset();