diff --git a/configs/client-default.js b/configs/client-default.js index 50593d86..f532d9e7 100644 --- a/configs/client-default.js +++ b/configs/client-default.js @@ -35,8 +35,6 @@ module.exports = function(options) { var devel = options.standalone && !options.local || options.mode === "devel" || options.mode == "onlinedev" || options.dev; var localExtendFiles = options.localExtend || options.standalone; - // allow extend code access only to C9-deveoped plugins - var extendToken = options.extendToken || "token"; var plugins = [ // C9 @@ -412,7 +410,6 @@ module.exports = function(options) { "plugins/c9.ide.language.go/go", { packagePath: "plugins/c9.ide.language.jsonalyzer/jsonalyzer", - extendToken: extendToken, workspaceDir: workspaceDir, homeDir: options.home, bashBin: options.bashBin, @@ -787,7 +784,6 @@ module.exports = function(options) { }, { packagePath: "plugins/c9.ide.pubsub/pubsub-client", - extendToken: extendToken }, { packagePath: "plugins/c9.ide.collab/notifications/bubble", @@ -868,7 +864,6 @@ module.exports = function(options) { plugins.push( { packagePath: "plugins/c9.ide.collab/connect", - extendToken: extendToken, enable: collab, debug: debug, localServerFile: localExtendFiles, diff --git a/package.json b/package.json index e2e7a4b9..4f940ff1 100644 --- a/package.json +++ b/package.json @@ -65,9 +65,9 @@ "c9.ide.language.javascript.eslint": "#4de5457db1", "c9.ide.language.javascript.tern": "#b55d0069bb", "c9.ide.language.javascript.infer": "#18acb93a3a", - "c9.ide.language.jsonalyzer": "#cbad4ae0ba", + "c9.ide.language.jsonalyzer": "#d8183d84b4", "c9.ide.language.codeintel": "#253ae15f5e", - "c9.ide.collab": "#ea6e93717a", + "c9.ide.collab": "#32403f2590", "c9.ide.local": "#10eb45842a", "c9.ide.find": "#e33fbaed2f", "c9.ide.find.infiles": "#c0a13737ef", @@ -90,17 +90,17 @@ "c9.ide.help.support": "#932fbb3743", "c9.ide.imgeditor": "#612e75ef4f", "c9.ide.immediate": "#19758abe08", - "c9.ide.installer": "#73dc437ff1", + "c9.ide.installer": "#b2e4ba0a92", "c9.ide.language.python": "#330b80e3b2", "c9.ide.language.go": "#6ce1c7a7ef", "c9.ide.mount": "#4c39359b87", - "c9.ide.navigate": "#6ab1441c80", + "c9.ide.navigate": "#5d5707058c", "c9.ide.newresource": "#981a408a7b", "c9.ide.openfiles": "#2ae85a9e33", "c9.ide.preview": "#5f5fff0185", "c9.ide.preview.browser": "#897177be7f", "c9.ide.preview.markdown": "#c3174d86e0", - "c9.ide.pubsub": "#0b5e060dc6", + "c9.ide.pubsub": "#0fba9708be", "c9.ide.readonly": "#a4605830c4", "c9.ide.recentfiles": "#7c099abf40", "c9.ide.remote": "#301d2ab519", diff --git a/plugins/c9.ide.plugins/loader.js b/plugins/c9.ide.plugins/loader.js index 7ce2afb4..e025d3b9 100644 --- a/plugins/c9.ide.plugins/loader.js +++ b/plugins/c9.ide.plugins/loader.js @@ -92,9 +92,9 @@ define(function(require, exports, module) { delete extraPackages[config.packagePath]; } }); - Object.keys(extraPackages).forEach(function(extraConfig) { + Object.keys(extraPackages).forEach(function(packagePath) { console.warn("[c9.ide.loader] Package " - + extraConfig.packagePath + " should be installed, according " + + packagePath + " should be installed, according " + "to the database, but was not found on the filesystem. " + "Try reinstalling it."); }); diff --git a/plugins/c9.ide.ui/codebox.js b/plugins/c9.ide.ui/codebox.js index 504a0aab..18eca48b 100644 --- a/plugins/c9.ide.ui/codebox.js +++ b/plugins/c9.ide.ui/codebox.js @@ -91,11 +91,13 @@ apf.codebox = function(struct, tagName) { var checkInitial = function() { var value = ace.getValue(); if (value && ace.renderer.initialMessageNode) { + ace.renderer.off("afterRender", checkInitial); dom.removeCssClass(ace.container, "ace_initialMsg"); ace.renderer.scroller.removeChild(ace.renderer.initialMessageNode); ace.renderer.initialMessageNode = null; } else if (!value && !ace.renderer.initialMessageNode) { + ace.renderer.on("afterRender", checkInitial); dom.addCssClass(ace.container, "ace_initialMsg"); var el = document.createElement("div"); el.className = "tb_textboxInitialMsg"; @@ -103,7 +105,6 @@ apf.codebox = function(struct, tagName) { ace.renderer.initialMessageNode = el; ace.renderer.scroller.appendChild(ace.renderer.initialMessageNode); } - }; ace.on("input", checkInitial); diff --git a/plugins/c9.vfs.client/vfs.log.js b/plugins/c9.vfs.client/vfs.log.js index 3d3c453a..5ab2d214 100644 --- a/plugins/c9.vfs.client/vfs.log.js +++ b/plugins/c9.vfs.client/vfs.log.js @@ -20,6 +20,8 @@ define(function (require, exports, module) { if (loaded) return false; loaded = true; + if (c9.readonly) return false; + ext.loadRemotePlugin("log", { code: require("text!./log-service.js"), redefine: true diff --git a/plugins/c9.vfs.client/vfs.ping.js b/plugins/c9.vfs.client/vfs.ping.js index fcebcf6e..4e02ade7 100644 --- a/plugins/c9.vfs.client/vfs.ping.js +++ b/plugins/c9.vfs.client/vfs.ping.js @@ -1,7 +1,7 @@ define(function(require, exports, module) { "use strict"; - main.consumes = ["Plugin", "ext", "c9", "vfs", "metrics"]; + main.consumes = ["Plugin", "ext", "c9", "vfs"]; main.provides = ["vfs.ping"]; return main; @@ -9,7 +9,6 @@ define(function(require, exports, module) { var Plugin = imports.Plugin; var c9 = imports.c9; var ext = imports.ext; - var metrics = imports.metrics; /***** Initialization *****/ @@ -17,15 +16,18 @@ define(function(require, exports, module) { var api; var loaded = false; - function load(){ - if (loaded) return; + function load(oldVfs) { + if (loaded && !oldVfs) return; loaded = true; - + ext.loadRemotePlugin("ping", { - code: require("text!./ping-service.js"), - redefine: true + file: oldVfs ? undefined : "c9.vfs.client/ping-service.js", + code: oldVfs ? require("text!./ping-service.js") : undefined }, function(err, remote) { - if (err) + if (!remote && !oldVfs) + return load(true); + + if (!remote) return console.error(err); api = remote; diff --git a/plugins/c9.vfs.server/vfs.connect.standalone.js b/plugins/c9.vfs.server/vfs.connect.standalone.js index 82807063..51096d8a 100644 --- a/plugins/c9.vfs.server/vfs.connect.standalone.js +++ b/plugins/c9.vfs.server/vfs.connect.standalone.js @@ -56,7 +56,6 @@ define(function(require, exports, module) { projectDir: vfsOptions.projectDir, extendDirectory: options.extendDirectory, extendOptions: projectOptions.extendOptions, - extendToken: "not_needed", collab: options.collab, vfsOptions: vfsOptions, public: true diff --git a/plugins/c9.vfs.server/vfs.js b/plugins/c9.vfs.server/vfs.js index 8a6107cf..8cf16b1e 100644 --- a/plugins/c9.vfs.server/vfs.js +++ b/plugins/c9.vfs.server/vfs.js @@ -24,7 +24,6 @@ function Vfs(vfs, master, options) { this.public = options.public || false; this.vfsOptions = options.vfsOptions || {}; this.pid = this.vfsOptions.pid; - var extendToken = options.extendToken; this.homeDir = options.homeDir; this.workspaceDir = options.projectDir; @@ -36,14 +35,12 @@ function Vfs(vfs, master, options) { blocked: this.readonly, extendDirectory: options.extendDirectory, extendOptions: options.extendOptions, - extendToken: extendToken }); this.vfsWorkspace = wrapVfs(vfs, { root: this.workspaceDir, readonly: this.readonly, extendDirectory: options.extendDirectory, extendOptions: options.extendOptions, - extendToken: extendToken }); var vfsProxy = proxyVfs(Object.keys(this.vfsHome), this.vfsHome, this.vfsWorkspace); diff --git a/plugins/c9.vfs.server/vfs_wrapper.js b/plugins/c9.vfs.server/vfs_wrapper.js index 8fe1192a..1b4182c3 100644 --- a/plugins/c9.vfs.server/vfs_wrapper.js +++ b/plugins/c9.vfs.server/vfs_wrapper.js @@ -8,7 +8,6 @@ module.exports = function(vfs, options) { var methods = options.methods || Object.keys(vfs); var readonly = "readonly" in options ? options.readonly : false; var blocked = !!options.blocked; - var extendToken = options.extendToken; var roMethods = { resolve: 1, @@ -74,18 +73,26 @@ module.exports = function(vfs, options) { options[key] = extendOptions[key]; } - if (options.code || options.stream) { - if (readonly && (!extendToken || extendToken !== options.extendToken)) - return callback(new error.Forbidden("VFS extend: " + name + " with options 'stream' or 'code' not authorized in read only mode")); - else - return vfs.extend(name, options, callback); + if (readonly) { + var whitelist = { + "c9.ide.collab/server/collab-server.js": true, + "c9.ide.pubsub/pubsub-service.js": true, + "c9.vfs.client/ping-service.js": true, + }; + if (!options.file || !whitelist[options.file]) + return callback(new error.Forbidden("VFS extend: " + name + " is not authorized in read only mode")); } - - if (!options.file) - return callback(new error.Forbidden("Option 'file' is missing")); - - if (typeof options.file != "string") - return callback(new error.Forbidden("Invalid option 'file'")); + + // localfs extend checks for file, then code, then stream + if (!options.file) { + if (options.code || options.stream) + return vfs.extend(name, options, callback); + + return callback(new error.Forbidden("Option 'file' is missing")); + } + + if (typeof options.file != "string") + return callback(new error.Forbidden("Invalid option 'file'")); if (extendDirectory) { var file = options.file = path.normalize(path.join(extendDirectory, options.file)); diff --git a/plugins/c9.vfs.standalone/standalone.js b/plugins/c9.vfs.standalone/standalone.js index 7470c8ab..8da836c9 100644 --- a/plugins/c9.vfs.standalone/standalone.js +++ b/plugins/c9.vfs.standalone/standalone.js @@ -255,7 +255,7 @@ function plugin(options, imports, register) { }; api.updatConfig = api.updatConfig || function(opts, params) { var id = params.token; - opts.accessToken = opts.extendToken = id || "token"; + opts.accessToken = id || "token"; var user = opts.extendOptions.user; user.id = id || -1; user.name = id ? "user" + id : "johndoe";