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

158 lines
7.2 KiB
JavaScript

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var WebDAVRequest_1 = require("../WebDAVRequest");
var IResource_1 = require("../../../resource/v1/IResource");
var IfParser_1 = require("../../../helper/v1/IfParser");
var LockScope_1 = require("../../../resource/v1/lock/LockScope");
var LockKind_1 = require("../../../resource/v1/lock/LockKind");
var LockType_1 = require("../../../resource/v1/lock/LockType");
var Errors_1 = require("../../../Errors");
var Lock_1 = require("../../../resource/v1/lock/Lock");
var xml_js_builder_1 = require("xml-js-builder");
var path = require("path");
function createResponse(arg, lock) {
var prop = new xml_js_builder_1.XMLElementBuilder('D:prop', {
'xmlns:D': 'DAV:'
});
var activelock = prop.ele('D:lockdiscovery').ele('D:activelock');
activelock.ele('D:locktype').ele(lock.lockKind.type.value);
activelock.ele('D:lockscope').ele(lock.lockKind.scope.value);
activelock.ele('D:locktoken').ele('D:href', undefined, true).add(lock.uuid);
activelock.ele('D:lockroot').add(arg.fullUri());
activelock.ele('D:depth').add('infinity');
if (lock.owner)
activelock.ele('D:owner').add(lock.owner);
activelock.ele('D:timeout').add('Second-' + lock.lockKind.timeout);
return prop;
}
function createLock(arg, callback) {
try {
var xml = xml_js_builder_1.XML.parse(arg.data);
var root = xml.find('DAV:lockinfo');
var scope = new LockScope_1.LockScope(root.find('DAV:lockscope').elements[0].name.substr(4).toLowerCase());
var type = new LockType_1.LockType(root.find('DAV:locktype').elements[0].name.substr(4).toLowerCase());
var ownerElement = root.find('DAV:owner');
var owner = ownerElement ? ownerElement.elements : null;
var lock_1 = new Lock_1.Lock(new LockKind_1.LockKind(scope, type, arg.server.options.lockTimeout), arg.user, owner);
arg.getResource(function (e, r) {
if (e === Errors_1.Errors.ResourceNotFound) { // create the resource
arg.checkIfHeader(undefined, function () {
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) {
if (e) {
arg.setCode(WebDAVRequest_1.HTTPCodes.InternalServerError);
callback();
}
else {
arg.invokeEvent('addChild', r, resource);
writeLock(resource, function () {
arg.setCode(WebDAVRequest_1.HTTPCodes.Created);
arg.writeXML(createResponse(arg, lock_1));
callback();
});
}
});
}); });
});
});
});
});
return;
}
if (e) {
arg.setCode(WebDAVRequest_1.HTTPCodes.InternalServerError);
callback();
return;
}
function writeLock(r, cb) {
arg.requirePrivilege(['canSetLock'], r, function () {
r.setLock(lock_1, function (e) { return process.nextTick(function () {
if (e) {
arg.setCode(WebDAVRequest_1.HTTPCodes.Locked);
callback();
return;
}
arg.invokeEvent('lock', r, lock_1);
arg.response.setHeader('Lock-Token', lock_1.uuid);
cb();
}); });
});
}
arg.checkIfHeader(r, function () {
writeLock(r, function () {
arg.setCode(WebDAVRequest_1.HTTPCodes.OK);
arg.writeXML(createResponse(arg, lock_1));
callback();
});
});
});
}
catch (ex) {
arg.setCode(WebDAVRequest_1.HTTPCodes.BadRequest);
callback();
return;
}
}
function refreshLock(arg, lockUUID, callback) {
arg.getResource(function (e, r) {
if (e) {
arg.setCode(e === Errors_1.Errors.ResourceNotFound ? WebDAVRequest_1.HTTPCodes.NotFound : WebDAVRequest_1.HTTPCodes.InternalServerError);
callback();
return;
}
arg.requirePrivilege(['canSetLock', 'canGetLock'], r, function () {
r.getLock(lockUUID, function (e, lock) {
if (e || !lock) {
arg.setCode(WebDAVRequest_1.HTTPCodes.PreconditionFailed);
callback();
return;
}
lock.refresh();
arg.invokeEvent('refreshLock', r, lock);
arg.setCode(WebDAVRequest_1.HTTPCodes.OK);
arg.writeXML(createResponse(arg, lock));
callback();
});
});
});
}
function default_1(arg, callback) {
if (!arg.user) {
arg.setCode(WebDAVRequest_1.HTTPCodes.Forbidden);
callback();
return;
}
if (arg.contentLength > 0) {
createLock(arg, callback);
return;
}
var ifHeader = arg.findHeader('If');
if (!ifHeader) {
arg.setCode(WebDAVRequest_1.HTTPCodes.PreconditionRequired);
callback();
return;
}
refreshLock(arg, IfParser_1.extractOneToken(ifHeader), callback);
}
exports.default = default_1;