2025-10-01 19:55:38 +02:00

200 lines
9.2 KiB
JavaScript

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var WebDAVRequest_1 = require("../WebDAVRequest");
var IResource_1 = require("../../../resource/v1/IResource");
var Errors_1 = require("../../../Errors");
var path = require("path");
function createResource(arg, callback, validCallback) {
arg.server.getResourceFromPath(arg, arg.path.getParent(), function (e, r) {
if (e) {
arg.setCode(e === Errors_1.Errors.ResourceNotFound ? WebDAVRequest_1.HTTPCodes.Conflict : WebDAVRequest_1.HTTPCodes.InternalServerError);
callback();
return;
}
if (!r.fsManager) {
arg.setCode(WebDAVRequest_1.HTTPCodes.InternalServerError);
callback();
return;
}
arg.requirePrivilege(['canAddChild'], r, function () {
var resource = r.fsManager.newResource(arg.uri, path.basename(arg.uri), IResource_1.ResourceType.File, r);
arg.requirePrivilege(['canCreate', 'canWrite'], resource, function () {
resource.create(function (e) { return process.nextTick(function () {
if (e) {
arg.setCode(WebDAVRequest_1.HTTPCodes.InternalServerError);
callback();
return;
}
arg.invokeEvent('create', resource);
r.addChild(resource, function (e) { return process.nextTick(function () {
if (e) {
arg.setCode(WebDAVRequest_1.HTTPCodes.InternalServerError);
callback();
}
else {
arg.invokeEvent('addChild', r, resource);
validCallback(resource);
}
}); });
}); });
});
});
});
}
function unchunkedMethod(arg, callback) {
var targetSource = arg.isSource;
arg.getResource(function (e, r) {
if (e && e !== Errors_1.Errors.ResourceNotFound) {
arg.setCode(WebDAVRequest_1.HTTPCodes.InternalServerError);
callback();
return;
}
arg.checkIfHeader(r, function () {
if (arg.contentLength === 0) { // Create file
if (r) { // Resource exists => empty it
arg.requirePrivilege(targetSource ? ['canSource', 'canWrite'] : ['canWrite'], r, function () {
r.write(targetSource, function (e, stream) { return process.nextTick(function () {
if (stream)
stream.end();
if (e)
arg.setCode(WebDAVRequest_1.HTTPCodes.InternalServerError);
else {
arg.invokeEvent('write', r);
arg.setCode(WebDAVRequest_1.HTTPCodes.OK);
}
callback();
}); }, arg.contentLength);
});
return;
}
createResource(arg, callback, function (r) {
arg.setCode(WebDAVRequest_1.HTTPCodes.Created);
callback();
});
}
else { // Write to a file
if (e) { // Resource not found
createResource(arg, callback, function (r) {
r.write(targetSource, function (e, stream) { return process.nextTick(function () {
if (e) {
arg.setCode(WebDAVRequest_1.HTTPCodes.InternalServerError);
callback();
return;
}
stream.end(arg.data, function (e) {
if (e)
arg.setCode(WebDAVRequest_1.HTTPCodes.InternalServerError);
else {
arg.invokeEvent('write', r);
arg.setCode(WebDAVRequest_1.HTTPCodes.Created);
}
callback();
});
}); });
});
return;
}
arg.requirePrivilege(targetSource ? ['canSource', 'canWrite'] : ['canWrite'], r, function () {
r.type(function (e, type) { return process.nextTick(function () {
if (e) {
arg.setCode(WebDAVRequest_1.HTTPCodes.InternalServerError);
callback();
return;
}
if (!type.isFile) {
arg.setCode(WebDAVRequest_1.HTTPCodes.MethodNotAllowed);
callback();
return;
}
r.write(targetSource, function (e, stream) { return process.nextTick(function () {
if (e) {
arg.setCode(WebDAVRequest_1.HTTPCodes.InternalServerError);
callback();
return;
}
stream.end(arg.data, function (e) {
if (e)
arg.setCode(WebDAVRequest_1.HTTPCodes.InternalServerError);
else {
arg.invokeEvent('write', r);
arg.setCode(WebDAVRequest_1.HTTPCodes.OK);
}
callback();
});
}); }, arg.contentLength);
}); });
});
}
});
});
}
exports.default = unchunkedMethod;
unchunkedMethod.isValidFor = function (type) {
return !type || type.isFile;
};
unchunkedMethod.chunked = function (arg, callback) {
var targetSource = arg.isSource;
arg.getResource(function (e, r) {
if (e && e !== Errors_1.Errors.ResourceNotFound) {
arg.setCode(WebDAVRequest_1.HTTPCodes.InternalServerError);
callback();
return;
}
arg.checkIfHeader(r, function () {
if (e) { // Resource not found
createResource(arg, callback, function (r) {
r.write(targetSource, function (e, stream) { return process.nextTick(function () {
if (e) {
arg.setCode(WebDAVRequest_1.HTTPCodes.InternalServerError);
callback();
return;
}
arg.request.pipe(stream);
stream.on('finish', function () {
arg.setCode(WebDAVRequest_1.HTTPCodes.Created);
arg.invokeEvent('write', r);
callback();
});
stream.on('error', function (e) {
arg.setCode(WebDAVRequest_1.HTTPCodes.InternalServerError);
callback();
});
}); }, arg.contentLength);
});
return;
}
arg.requirePrivilege(targetSource ? ['canSource', 'canWrite'] : ['canWrite'], r, function () {
r.type(function (e, type) { return process.nextTick(function () {
if (e) {
arg.setCode(WebDAVRequest_1.HTTPCodes.InternalServerError);
callback();
return;
}
if (!type.isFile) {
arg.setCode(WebDAVRequest_1.HTTPCodes.MethodNotAllowed);
callback();
return;
}
r.write(targetSource, function (e, stream) { return process.nextTick(function () {
if (e) {
arg.setCode(WebDAVRequest_1.HTTPCodes.InternalServerError);
callback();
return;
}
arg.request.pipe(stream);
stream.on('finish', function (e) {
arg.setCode(WebDAVRequest_1.HTTPCodes.OK);
arg.invokeEvent('write', r);
callback();
});
stream.on('error', function (e) {
arg.setCode(WebDAVRequest_1.HTTPCodes.InternalServerError);
callback();
});
}); }, arg.contentLength);
}); });
});
});
});
};