kopia lustrzana https://github.com/c9/core
123 wiersze
4.4 KiB
JavaScript
123 wiersze
4.4 KiB
JavaScript
![]() |
define(function(require, exports, module) {
|
||
|
"use strict";
|
||
|
|
||
|
main.consumes = ["Plugin", "vfs.cache", "connect"];
|
||
|
main.provides = ["vfs.filelist"];
|
||
|
return main;
|
||
|
|
||
|
function main(options, imports, register) {
|
||
|
var Plugin = imports.Plugin;
|
||
|
var cache = imports["vfs.cache"];
|
||
|
|
||
|
var error = require("http-error");
|
||
|
var Path = require("path");
|
||
|
|
||
|
/***** Initialization *****/
|
||
|
|
||
|
var plugin = new Plugin("Ajax.org", main.consumes);
|
||
|
|
||
|
var compress = imports.connect.getModule().compress();
|
||
|
|
||
|
cache.registerExtension(function(vfs, callback) {
|
||
|
var restful = vfs.restful.home;
|
||
|
|
||
|
vfs.restful.home = function(req, res, next) {
|
||
|
var path = unescape(req.uri.pathname);
|
||
|
|
||
|
if (req.method == "GET" && path == "/.c9/file.listing") {
|
||
|
compress(req, res, function(err) {
|
||
|
if (err) return next(err);
|
||
|
|
||
|
filelist(vfs.vfs, vfs.workspaceDir, vfs.vfsOptions, req, res, next);
|
||
|
});
|
||
|
}
|
||
|
else
|
||
|
restful(req, res, next);
|
||
|
};
|
||
|
|
||
|
callback();
|
||
|
});
|
||
|
|
||
|
function filelist(vfs, root, vfsOptions, req, res, next) {
|
||
|
var query = req.uri.query;
|
||
|
var path = query && query.path + "";
|
||
|
var nakBin = vfsOptions.nakBin;
|
||
|
var nodeBin = vfsOptions.nodeBin && vfsOptions.nodeBin[0];
|
||
|
|
||
|
if (!path)
|
||
|
return next(new error.BadRequest("path query must be set"));
|
||
|
|
||
|
if (!nakBin)
|
||
|
return next(new error.InternalServerError("nak binary not configured"));
|
||
|
|
||
|
// sandbox path to workspaceDir
|
||
|
path = Path.normalize(path);
|
||
|
// if (path.indexOf(root) !== 0)
|
||
|
// return next(new error.Forbidden("Can't list files outside of the workspace"));
|
||
|
|
||
|
query.list = true;
|
||
|
query.follow = true;
|
||
|
query.path = path;
|
||
|
|
||
|
vfs.spawn(nodeBin, {
|
||
|
stdoutEncoding: "utf8",
|
||
|
stderrEncoding: "utf8",
|
||
|
args: [nakBin, "--json", JSON.stringify(query)]
|
||
|
}, function(err, meta) {
|
||
|
if (err) return next(err);
|
||
|
|
||
|
var process = meta.process;
|
||
|
// once we receive data on stdout pipe it to the response
|
||
|
process.stdout.once("data", function (data) {
|
||
|
if (res.headerSent)
|
||
|
return;
|
||
|
|
||
|
res.writeHead(200, { "Content-Type": "text/plain" });
|
||
|
res.write(data);
|
||
|
process.stdout.pipe(res);
|
||
|
});
|
||
|
|
||
|
req.on("close", function () {
|
||
|
process && process.kill();
|
||
|
});
|
||
|
|
||
|
var stderr = "";
|
||
|
process.stderr.on("data", function (data) {
|
||
|
stderr += data;
|
||
|
});
|
||
|
|
||
|
process.on("exit", function(code, signal) {
|
||
|
if (res.headerSent)
|
||
|
return;
|
||
|
|
||
|
var err;
|
||
|
if (code == 127) {
|
||
|
err = new error.PreconditionFailed(
|
||
|
"Your instance seems to be missing the 'nak' utility\n" +
|
||
|
"If you are using an SSH workspace, please do:\n" +
|
||
|
" 'curl https://raw.github.com/c9/install/master/install.sh | bash'");
|
||
|
} else if (code) {
|
||
|
err = new error.InternalServerError(
|
||
|
"'nak' utility failed with exit code " + code +
|
||
|
" and stderr: '" + stderr + "'");
|
||
|
} else if (signal) {
|
||
|
err = new error.InternalServerError(
|
||
|
"'nak' utility was terminated by signal " + signal
|
||
|
);
|
||
|
}
|
||
|
|
||
|
if (err) {
|
||
|
next(err);
|
||
|
}
|
||
|
});
|
||
|
});
|
||
|
}
|
||
|
|
||
|
plugin.freezePublicAPI({
|
||
|
// for testing only
|
||
|
filelist: filelist
|
||
|
});
|
||
|
|
||
|
register(null, { "vfs.filelist" : plugin });
|
||
|
}
|
||
|
});
|