cloudcms-server 0.9.244 → 0.9.249

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/.last_command ADDED
@@ -0,0 +1,7 @@
1
+ {
2
+ "command": {
3
+ "group": "server",
4
+ "name": "start"
5
+ },
6
+ "arguments": {}
7
+ }
package/index.js CHANGED
@@ -34,7 +34,7 @@ process.logInfo = process.log = function(text, level)
34
34
  var Gitana = require("gitana");
35
35
 
36
36
  // default http timeout
37
- process.defaultHttpTimeoutMs = 120000; // 2 minutes
37
+ process.defaultHttpTimeoutMs = 60000;
38
38
 
39
39
  if (process.env.DEFAULT_HTTP_TIMEOUT_MS)
40
40
  {
@@ -54,20 +54,18 @@ var HttpsKeepAliveAgent = require('agentkeepalive').HttpsAgent;
54
54
  http.globalAgent = new HttpKeepAliveAgent({
55
55
  keepAlive: true,
56
56
  keepAliveMsecs: 1000,
57
- keepAliveTimeout: 30000,
57
+ maxSockets: 16000,
58
+ maxFreeSockets: 256,
58
59
  timeout: process.defaultHttpTimeoutMs,
59
- maxSockets: 200,
60
- maxFreeSockets: 40,
61
- rejectUnauthorized: false
60
+ freeSocketTimeout: 30000
62
61
  });
63
62
  https.globalAgent = new HttpsKeepAliveAgent({
64
63
  keepAlive: true,
65
64
  keepAliveMsecs: 1000,
66
- keepAliveTimeout: 30000,
65
+ maxSockets: 16000,
66
+ maxFreeSockets: 256,
67
67
  timeout: process.defaultHttpTimeoutMs,
68
- maxSockets: 200,
69
- maxFreeSockets: 40,
70
- rejectUnauthorized: false
68
+ freeSocketTimeout: 30000
71
69
  });
72
70
 
73
71
  // disable for now
@@ -138,6 +136,7 @@ exports = module.exports = function()
138
136
  // not already specified
139
137
  var defaultGitanaProxyScheme = "https";
140
138
  var defaultGitanaProxyHost = "api.cloudcms.com";
139
+ var defaultGitanaProxyPath = "";
141
140
  var defaultGitanaProxyPort = 443;
142
141
 
143
142
  var gitanaJsonPath = path.join(process.env.CLOUDCMS_APPSERVER_BASE_PATH, "gitana.json");
@@ -149,6 +148,7 @@ exports = module.exports = function()
149
148
  var parsedUrl = url.parse(gitanaJson.baseURL);
150
149
 
151
150
  defaultGitanaProxyHost = parsedUrl.hostname;
151
+ defaultGitanaProxyPath = parsedUrl.path;
152
152
  defaultGitanaProxyScheme = parsedUrl.protocol.substring(0, parsedUrl.protocol.length - 1); // remove the :
153
153
 
154
154
  if (parsedUrl.port)
@@ -173,13 +173,16 @@ exports = module.exports = function()
173
173
  if (!process.env.GITANA_PROXY_HOST) {
174
174
  process.env.GITANA_PROXY_HOST = defaultGitanaProxyHost;
175
175
  }
176
+ if (!process.env.GITANA_PROXY_PATH) {
177
+ process.env.GITANA_PROXY_PATH = defaultGitanaProxyPath;
178
+ }
176
179
  if (!process.env.GITANA_PROXY_PORT) {
177
180
  process.env.GITANA_PROXY_PORT = defaultGitanaProxyPort;
178
181
  }
179
182
 
180
183
  if (cluster.isMaster)
181
184
  {
182
- process.log("Gitana Proxy pointed to: " + util.asURL(process.env.GITANA_PROXY_SCHEME, process.env.GITANA_PROXY_HOST, process.env.GITANA_PROXY_PORT));
185
+ process.log("Gitana Proxy pointed to: " + util.asURL(process.env.GITANA_PROXY_SCHEME, process.env.GITANA_PROXY_HOST, process.env.GITANA_PROXY_PORT, process.env.GITANA_PROXY_PATH));
183
186
  }
184
187
 
185
188
  // all web modules are included by default
@@ -131,7 +131,7 @@ var doSend = function(callback)
131
131
  }
132
132
 
133
133
  // url over to cloud cms
134
- var URL = util.asURL(process.env.GITANA_PROXY_SCHEME, process.env.GITANA_PROXY_HOST, process.env.GITANA_PROXY_PORT) + "/warehouses/" + warehouseId + "/interactions/_create";
134
+ var URL = util.asURL(process.env.GITANA_PROXY_SCHEME, process.env.GITANA_PROXY_HOST, process.env.GITANA_PROXY_PORT, process.env.GITANA_PROXY_PATH) + "/warehouses/" + warehouseId + "/interactions/_create";
135
135
  var requestConfig = {
136
136
  "url": URL,
137
137
  "qs": {},
@@ -43,7 +43,7 @@ exports.bindSocket = function(socket, provider)
43
43
  var acquireEditorialSession = function(socket, provider, sessionKey, repositoryId, branchId, force, callback)
44
44
  {
45
45
  // send an HTTP command to acquire an editorial session for this repository and branch
46
- var URL = util.asURL(process.env.GITANA_PROXY_SCHEME, process.env.GITANA_PROXY_HOST, process.env.GITANA_PROXY_PORT) + "/oneteam/editorial/session/acquire";
46
+ var URL = util.asURL(process.env.GITANA_PROXY_SCHEME, process.env.GITANA_PROXY_HOST, process.env.GITANA_PROXY_PORT, process.env.GITANA_PROXY_PATH) + "/oneteam/editorial/session/acquire";
47
47
 
48
48
  var headers = {};
49
49
  //headers["Authorization"] = socket.gitana.platform().getDriver().getHttpHeaders()["Authorization"];
@@ -101,7 +101,7 @@ exports.bindSocket = function(socket, provider)
101
101
  var releaseEditorialSession = function(socket, provider, sessionKey, repositoryId, branchId, callback)
102
102
  {
103
103
  // send an HTTP command to release the session
104
- var URL = util.asURL(process.env.GITANA_PROXY_SCHEME, process.env.GITANA_PROXY_HOST, process.env.GITANA_PROXY_PORT) + "/oneteam/editorial/session/release";
104
+ var URL = util.asURL(process.env.GITANA_PROXY_SCHEME, process.env.GITANA_PROXY_HOST, process.env.GITANA_PROXY_PORT, process.env.GITANA_PROXY_PATH) + "/oneteam/editorial/session/release";
105
105
 
106
106
  var json = {};
107
107
  json.repositoryId = repositoryId;
@@ -152,7 +152,7 @@ exports.bindSocket = function(socket, provider)
152
152
  */
153
153
  var commitEditorialSession = function(socket, provider, sessionKey, repositoryId, branchId, callback)
154
154
  {
155
- var URL = util.asURL(process.env.GITANA_PROXY_SCHEME, process.env.GITANA_PROXY_HOST, process.env.GITANA_PROXY_PORT) + "/oneteam/editorial/session/commit";
155
+ var URL = util.asURL(process.env.GITANA_PROXY_SCHEME, process.env.GITANA_PROXY_HOST, process.env.GITANA_PROXY_PORT, process.env.GITANA_PROXY_PATH) + "/oneteam/editorial/session/commit";
156
156
 
157
157
  var json = {};
158
158
  json.repositoryId = repositoryId;
@@ -202,7 +202,7 @@ exports.bindSocket = function(socket, provider)
202
202
  */
203
203
  var editorialSessionInfo = function(socket, provider, sessionKey, repositoryId, branchId, callback)
204
204
  {
205
- var URL = util.asURL(process.env.GITANA_PROXY_SCHEME, process.env.GITANA_PROXY_HOST, process.env.GITANA_PROXY_PORT) + "/oneteam/editorial/session/info";
205
+ var URL = util.asURL(process.env.GITANA_PROXY_SCHEME, process.env.GITANA_PROXY_HOST, process.env.GITANA_PROXY_PORT, process.env.GITANA_PROXY_PATH) + "/oneteam/editorial/session/info";
206
206
 
207
207
  var json = {};
208
208
  json.repositoryId = repositoryId;
@@ -121,7 +121,7 @@ exports = module.exports = function()
121
121
  }
122
122
 
123
123
  // post form to Cloud CMS using public method
124
- var URL = util.asURL(process.env.GITANA_PROXY_SCHEME, process.env.GITANA_PROXY_HOST, process.env.GITANA_PROXY_PORT) + url;
124
+ var URL = util.asURL(process.env.GITANA_PROXY_SCHEME, process.env.GITANA_PROXY_HOST, process.env.GITANA_PROXY_PORT, process.env.GITANA_PROXY_PATH) + url;
125
125
 
126
126
  var headers = {};
127
127
  headers["Authorization"] = req.gitana.platform().getDriver().getHttpHeaders()["Authorization"];
@@ -194,7 +194,7 @@ exports = module.exports = function()
194
194
 
195
195
  var url = branch.getUri() + "/alpaca/datasource";
196
196
 
197
- var URL = util.asURL(process.env.GITANA_PROXY_SCHEME, process.env.GITANA_PROXY_HOST, process.env.GITANA_PROXY_PORT) + url;
197
+ var URL = util.asURL(process.env.GITANA_PROXY_SCHEME, process.env.GITANA_PROXY_HOST, process.env.GITANA_PROXY_PORT, process.env.GITANA_PROXY_PATH) + url;
198
198
 
199
199
  var headers = {};
200
200
  headers["Authorization"] = req.gitana.platform().getDriver().getHttpHeaders()["Authorization"];
@@ -215,8 +215,7 @@ exports = module.exports = function()
215
215
  contentStore.writeFile(filePath + ".cache", JSON.stringify(cacheInfo), function() {
216
216
  _end.call(res, data, encoding);
217
217
  });
218
-
219
- };
218
+ `` };
220
219
 
221
220
  callback();
222
221
  });
@@ -83,7 +83,7 @@ exports = module.exports = function()
83
83
 
84
84
  var URL = configuration.virtualDriver.baseURL;
85
85
  if (!URL) {
86
- URL = util.asURL(process.env.GITANA_PROXY_SCHEME, process.env.GITANA_PROXY_HOST, process.env.GITANA_PROXY_PORT);
86
+ URL = util.asURL(process.env.GITANA_PROXY_SCHEME, process.env.GITANA_PROXY_HOST, process.env.GITANA_PROXY_PORT, process.env.GITANA_PROXY_PATH);
87
87
  }
88
88
  URL += "/virtual/driver/config";
89
89
  var requestConfig = {
@@ -217,7 +217,7 @@ exports = module.exports = function()
217
217
  }
218
218
  if (!gitanaJson.baseURL)
219
219
  {
220
- gitanaJson.baseURL = util.cleanupURL(util.asURL(process.env.GITANA_PROXY_SCHEME, process.env.GITANA_PROXY_HOST, process.env.GITANA_PROXY_PORT));
220
+ gitanaJson.baseURL = util.cleanupURL(util.asURL(process.env.GITANA_PROXY_SCHEME, process.env.GITANA_PROXY_HOST, process.env.GITANA_PROXY_PORT, process.env.GITANA_PROXY_PATH));
221
221
  }
222
222
 
223
223
  // mark as retrieved from virtual driver
@@ -340,7 +340,7 @@ exports = module.exports = function()
340
340
  // defaults
341
341
  if (!configuration.baseURL)
342
342
  {
343
- configuration.baseURL = util.asURL(process.env.GITANA_PROXY_SCHEME, process.env.GITANA_PROXY_HOST, process.env.GITANA_PROXY_PORT);
343
+ configuration.baseURL = util.asURL(process.env.GITANA_PROXY_SCHEME, process.env.GITANA_PROXY_HOST, process.env.GITANA_PROXY_PORT, process.env.GITANA_PROXY_PATH);
344
344
  }
345
345
  if (!configuration.key) {
346
346
  configuration.key = "virtual";
package/package.json CHANGED
@@ -6,14 +6,14 @@
6
6
  },
7
7
  "name": "cloudcms-server",
8
8
  "description": "Cloud CMS Application Server Module",
9
- "version": "0.9.244",
9
+ "version": "0.9.249",
10
10
  "repository": {
11
11
  "type": "git",
12
12
  "url": "git://github.com/gitana/cloudcms-server.git"
13
13
  },
14
14
  "dependencies": {
15
15
  "accepts": "^1.3.7",
16
- "agentkeepalive": "^2.2.0",
16
+ "agentkeepalive": "^4.1.3",
17
17
  "alpaca": "^1.5.27",
18
18
  "archiver": "^1.3.0",
19
19
  "async": "^1.5.2",
@@ -39,12 +39,13 @@
39
39
  "gitana": "^1.0.315",
40
40
  "handlebars": "^4.4.2",
41
41
  "hbs": "^4.0.5",
42
- "http-proxy": "^1.18.0",
42
+ "helmet": "^4.6.0",
43
+ "http-proxy": "^1.18.1",
43
44
  "json5": "^1.0.1",
44
45
  "jsonwebtoken": "^8.5.1",
45
46
  "klaw": "^1.3.1",
46
47
  "lru-cache": "^4.1.5",
47
- "marked": "^0.3.19",
48
+ "marked": "^1.2.8",
48
49
  "memorystore": "^1.6.1",
49
50
  "mime": "^1.6.0",
50
51
  "mkdirp": "^0.5.1",
@@ -55,14 +56,14 @@
55
56
  "object-merge": "^2.5.1",
56
57
  "on-headers": "^1.0.2",
57
58
  "passport": "^0.4.0",
58
- "passport-cas": "^0.1.1",
59
+ "passport-cas": "^0.0.3",
59
60
  "passport-facebook": "^2.1.1",
60
61
  "passport-github": "^1.1.0",
61
62
  "passport-google-oauth": "^1.0.0",
62
63
  "passport-linkedin": "^1.0.0",
63
64
  "passport-local": "^1.0.0",
64
65
  "passport-oauth": "^1.0.0",
65
- "passport-saml": "^0.33.0",
66
+ "passport-saml": "^2.0.4",
66
67
  "passport-twitter": "^1.0.4",
67
68
  "pkginfo": "^0.4.1",
68
69
  "q": "^1.5.1",
@@ -85,13 +86,11 @@
85
86
  "targz": "^1.0.1",
86
87
  "temp": "^0.8.3",
87
88
  "toobusy-js": "^0.5.1",
88
- "uuid": "^3.3.3",
89
+ "uuid": "^3.3.2",
89
90
  "vm2": "^3.8.4",
90
91
  "watch": "^1.0.2",
91
92
  "winston": "^3.3.3"
92
93
  },
93
- "devDependencies": {},
94
- "optionalDependencies": {},
95
94
  "contributors": [
96
95
  {
97
96
  "name": "Michael Uzquiano",
package/server/index.js CHANGED
@@ -37,6 +37,8 @@ var duster = require("../duster/index");
37
37
 
38
38
  var coreHelpers = require("../duster/helpers/core/index");
39
39
 
40
+ var helmet = require("helmet");
41
+
40
42
  var toobusy = require("toobusy-js");
41
43
  toobusy.maxLag(500); // 500 ms lag in event queue, quite high but usable for now
42
44
  toobusy.interval(250);
@@ -585,6 +587,39 @@ var startSlave = function(config, afterStartFn)
585
587
  if (!process.env.CLOUDCMS_STANDALONE_HOST) {
586
588
  process.env.CLOUDCMS_STANDALONE_HOST = "local";
587
589
  }
590
+
591
+
592
+ // auto-configuration for HTTPS
593
+ if (!process.configuration.https) {
594
+ process.configuration.https = {};
595
+ }
596
+ if (process.env.CLOUDCMS_HTTPS) {
597
+ process.configuration.https = JSON.parse(process.env.CLOUDCMS_HTTPS);
598
+ }
599
+ if (process.env.CLOUDCMS_HTTPS_KEY_FILEPATH) {
600
+ process.configuration.https.key = fs.readFileSync(process.env.CLOUDCMS_HTTPS_KEY_FILEPATH);
601
+ }
602
+ if (process.env.CLOUDCMS_HTTPS_CERT_FILEPATH) {
603
+ process.configuration.https.cert = fs.readFileSync(process.env.CLOUDCMS_HTTPS_CERT_FILEPATH);
604
+ }
605
+ if (process.env.CLOUDCMS_HTTPS_PFX_FILEPATH) {
606
+ process.configuration.https.pfx = fs.readFileSync(process.env.CLOUDCMS_HTTPS_PFX_FILEPATH);
607
+ }
608
+ if (process.env.CLOUDCMS_HTTPS_PASSPHRASE) {
609
+ process.configuration.https.passphrase = process.env.CLOUDCMS_HTTPS_PASSPHRASE;
610
+ }
611
+ if (process.env.CLOUDCMS_HTTPS_REQUEST_CERT === "true") {
612
+ process.configuration.https.requestCert = true;
613
+ }
614
+ if (process.env.CLOUDCMS_HTTPS_CA_FILEPATH) {
615
+ process.configuration.https.ca = [ fs.readFileSync(process.env.CLOUDCMS_HTTPS_CA_FILEPATH) ];
616
+ }
617
+
618
+ // if https config is empty, remove it
619
+ if (Object.keys(process.configuration.https).length === 0) {
620
+ delete process.configuration.https;
621
+ }
622
+
588
623
 
589
624
  // session store
590
625
  var initializedSession = null;
@@ -1045,8 +1080,17 @@ var startSlave = function(config, afterStartFn)
1045
1080
  ////////////////////////////////////////////////////////////////////////////
1046
1081
 
1047
1082
 
1048
- // CORE OBJECTS
1049
- var server = http.Server(app);
1083
+ // create the server (either HTTP or HTTPS)
1084
+ var server = null;
1085
+ if (process.configuration.https) {
1086
+ // configure helmet to support auto-upgrade of http->https
1087
+ app.use(helmet());
1088
+ // create https server
1089
+ server = https.createServer(process.configuration.https, app);
1090
+ } else {
1091
+ // legacy
1092
+ server = http.Server(app);
1093
+ }
1050
1094
 
1051
1095
  // request timeout
1052
1096
  var requestTimeout = 30000; // 30 seconds
@@ -45,6 +45,7 @@ server.report(function(callback) {
45
45
  console.log("Server Base Path: " + process.env.CLOUDCMS_APPSERVER_BASE_PATH);
46
46
  console.log("Gitana Scheme: " + process.env.GITANA_PROXY_SCHEME);
47
47
  console.log("Gitana Host: " + process.env.GITANA_PROXY_HOST);
48
+ console.log("Gitana Path: " + process.env.GITANA_PROXY_PATH);
48
49
  console.log("Gitana Port: " + process.env.GITANA_PROXY_PORT);
49
50
  console.log("CPU Count: " + cpuCount);
50
51
 
@@ -68,6 +69,10 @@ server.report(function(callback) {
68
69
  console.log("Hosts Directory: " + process.env.CLOUDCMS_HOSTS_PATH);
69
70
  console.log("LaunchPad Mode: " + process.env.CLOUDCMS_LAUNCHPAD_SETUP);
70
71
  console.log("Max Files Detected: " + process.env.CLOUDCMS_MAX_FILES);
72
+
73
+ if (process.configuration.https) {
74
+ console.log("Server is configured to use HTTPS");
75
+ }
71
76
 
72
77
  console.log("");
73
78
 
package/util/cloudcms.js CHANGED
@@ -382,7 +382,7 @@ exports = module.exports = function()
382
382
  agent = https.globalAgent;
383
383
  }
384
384
 
385
- var URL = util.asURL(process.env.GITANA_PROXY_SCHEME, process.env.GITANA_PROXY_HOST, process.env.GITANA_PROXY_PORT) + uri;
385
+ var URL = util.asURL(process.env.GITANA_PROXY_SCHEME, process.env.GITANA_PROXY_HOST, process.env.GITANA_PROXY_PORT, process.env.GITANA_PROXY_PATH) + uri;
386
386
  request({
387
387
  "method": "GET",
388
388
  "url": URL,
@@ -536,8 +536,8 @@ exports = module.exports = function()
536
536
  // ensure stream is closed
537
537
  closeWriteStream(tempStream);
538
538
 
539
- process.log("_writeToDisk request timed out");
540
- process.log(e)
539
+ //process.log("_writeToDisk request timed out");
540
+ //process.log(e)
541
541
  }).on('end', function (e) {
542
542
 
543
543
  // ensure stream is closed
@@ -100,12 +100,22 @@ var createProxyHandler = function(proxyTarget, pathPrefix)
100
100
 
101
101
  // error handling
102
102
  proxyServer.on("error", function(err, req, res) {
103
- process.log(err);
104
- res.writeHead(500, {
105
- 'Content-Type': 'text/plain'
106
- });
103
+ console.log("A proxy error was caught: " + err + ", json: " + JSON.stringify(err) + ", path: " + req.path);
107
104
 
108
- res.end('Something went wrong while proxying the request.');
105
+ // do our best to send something back
106
+ try
107
+ {
108
+ res.writeHead(500, {
109
+ 'Content-Type': 'text/plain'
110
+ });
111
+ }
112
+ catch (e) { }
113
+
114
+ try
115
+ {
116
+ res.end('Something went wrong while proxying the request.');
117
+ }
118
+ catch (e) { }
109
119
  });
110
120
 
111
121
  // if we're using auth credentials that are picked up in SSO chain, then we listen for a 401
@@ -61,7 +61,7 @@ exports = module.exports = function()
61
61
 
62
62
  var syncRows = function(rows, callback)
63
63
  {
64
- var URL = util.asURL(process.env.GITANA_PROXY_SCHEME, process.env.GITANA_PROXY_HOST, process.env.GITANA_PROXY_PORT) + "/bulk/pagerenditions";
64
+ var URL = util.asURL(process.env.GITANA_PROXY_SCHEME, process.env.GITANA_PROXY_HOST, process.env.GITANA_PROXY_PORT, process.env.GITANA_PROXY_PATH) + "/bulk/pagerenditions";
65
65
 
66
66
  var agent = http.globalAgent;
67
67
  if (process.env.GITANA_PROXY_SCHEME === "https")
package/util/util.js CHANGED
@@ -1787,7 +1787,7 @@ var zip = exports.zip = function(directoryPath, writableStream)
1787
1787
  *
1788
1788
  * @type {Function}
1789
1789
  */
1790
- var asURL = exports.asURL = function(protocol, host, port)
1790
+ var asURL = exports.asURL = function(protocol, host, port, path)
1791
1791
  {
1792
1792
  // protocol lower case
1793
1793
  protocol = protocol.toLowerCase();
@@ -1813,6 +1813,19 @@ var asURL = exports.asURL = function(protocol, host, port)
1813
1813
  }
1814
1814
  }
1815
1815
 
1816
+ // include url "path" if defined
1817
+ if (path) {
1818
+ path = '/' + path;
1819
+ path = path.replace(/\/+/g, '/'); // ensure no extra '/' characters
1820
+ if (path.endsWith('/')) {
1821
+ // remove trailing '/' character
1822
+ path = path.substring(0, path.length - 1);
1823
+ }
1824
+ if (path) {
1825
+ url += path;
1826
+ }
1827
+ }
1828
+
1816
1829
  return url;
1817
1830
  };
1818
1831