140 lines
6.0 KiB
JavaScript
140 lines
6.0 KiB
JavaScript
"use strict";
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
var WebDAVRequest_1 = require("../WebDAVRequest");
|
|
var CommonTypes_1 = require("../../../manager/v2/fileSystem/CommonTypes");
|
|
var IfParser_1 = require("../../../helper/v2/IfParser");
|
|
var LockScope_1 = require("../../../resource/v2/lock/LockScope");
|
|
var LockKind_1 = require("../../../resource/v2/lock/LockKind");
|
|
var LockType_1 = require("../../../resource/v2/lock/LockType");
|
|
var Errors_1 = require("../../../Errors");
|
|
var Lock_1 = require("../../../resource/v2/lock/Lock");
|
|
var xml_js_builder_1 = require("xml-js-builder");
|
|
function createResponse(ctx, 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').ele('D:href', undefined, true).add(WebDAVRequest_1.HTTPRequestContext.encodeURL(ctx.fullUri()));
|
|
activelock.ele('D:depth').add(lock.depth === -1 ? 'infinity' : lock.depth.toString());
|
|
if (lock.owner)
|
|
activelock.ele('D:owner').add(lock.owner);
|
|
activelock.ele('D:timeout').add("Second-" + lock.lockKind.timeout);
|
|
return prop;
|
|
}
|
|
function createLock(ctx, data, callback) {
|
|
try {
|
|
var xml = xml_js_builder_1.XML.parse(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_1 = new LockType_1.LockType(root.find('DAV:locktype').elements[0].name.substr(4).toLowerCase());
|
|
var ownerElementIndex = root.findIndex('DAV:owner');
|
|
var owner = ownerElementIndex !== -1 ? root.elements[ownerElementIndex].elements : null;
|
|
var lock_1 = new Lock_1.Lock(new LockKind_1.LockKind(scope, type_1, ctx.server.options.lockTimeout), ctx.user ? ctx.user.uid : undefined, owner, ctx.headers.depth === undefined ? -1 : ctx.headers.depth);
|
|
var go_1 = function (r, callback) {
|
|
ctx.overridePrivileges = true;
|
|
r.listDeepLocks(function (e, locks) {
|
|
ctx.overridePrivileges = false;
|
|
if (e)
|
|
return callback(e);
|
|
if (Object.keys(locks).length > 0) {
|
|
if (LockScope_1.LockScope.Exclusive.isSame(type_1))
|
|
return callback(Errors_1.Errors.Locked);
|
|
for (var path in locks)
|
|
if (locks[path].some(function (l) { return LockScope_1.LockScope.Exclusive.isSame(l.lockKind.scope); }))
|
|
return callback(Errors_1.Errors.Locked);
|
|
}
|
|
r.lockManager(function (e, lm) {
|
|
if (e)
|
|
return callback(e);
|
|
lm.setLock(lock_1, function (e) {
|
|
if (e)
|
|
return callback(e);
|
|
//ctx.invokeEvent('lock', r, lock);
|
|
ctx.response.setHeader('Lock-Token', lock_1.uuid);
|
|
callback();
|
|
});
|
|
});
|
|
});
|
|
};
|
|
var _callback_1 = callback;
|
|
callback = function (e) {
|
|
if (e) {
|
|
if (!ctx.setCodeFromError(e))
|
|
ctx.setCode(WebDAVRequest_1.HTTPCodes.InternalServerError);
|
|
}
|
|
else
|
|
ctx.writeBody(createResponse(ctx, lock_1));
|
|
_callback_1();
|
|
};
|
|
ctx.getResource(function (e, r) {
|
|
go_1(r, function (e) {
|
|
if (e === Errors_1.Errors.ResourceNotFound)
|
|
r.create(CommonTypes_1.ResourceType.File, function (e) {
|
|
if (e)
|
|
return callback(e);
|
|
ctx.setCode(WebDAVRequest_1.HTTPCodes.Created);
|
|
go_1(r, callback);
|
|
});
|
|
else if (e)
|
|
callback(e);
|
|
else
|
|
callback();
|
|
});
|
|
});
|
|
}
|
|
catch (ex) {
|
|
ctx.setCode(WebDAVRequest_1.HTTPCodes.BadRequest);
|
|
callback();
|
|
return;
|
|
}
|
|
}
|
|
function refreshLock(ctx, lockUUID, callback) {
|
|
ctx.getResource(function (e, r) {
|
|
//ctx.requirePrivilege([ 'canSetLock', 'canGetLock' ], r, () => {
|
|
r.lockManager(function (e, lm) {
|
|
if (e) {
|
|
if (!ctx.setCodeFromError(e))
|
|
ctx.setCode(WebDAVRequest_1.HTTPCodes.InternalServerError);
|
|
return callback();
|
|
}
|
|
lm.refresh(lockUUID, ctx.server.options.lockTimeout, function (e, lock) {
|
|
if (e || !lock) {
|
|
ctx.setCode(WebDAVRequest_1.HTTPCodes.PreconditionFailed);
|
|
callback();
|
|
return;
|
|
}
|
|
//ctx.invokeEvent('refreshLock', r, lock);
|
|
ctx.setCode(WebDAVRequest_1.HTTPCodes.OK);
|
|
ctx.writeBody(createResponse(ctx, lock));
|
|
callback();
|
|
});
|
|
});
|
|
//})
|
|
});
|
|
}
|
|
var default_1 = /** @class */ (function () {
|
|
function default_1() {
|
|
}
|
|
default_1.prototype.unchunked = function (ctx, data, callback) {
|
|
if (!ctx.user) {
|
|
ctx.setCode(WebDAVRequest_1.HTTPCodes.Forbidden);
|
|
return callback();
|
|
}
|
|
if (ctx.headers.contentLength > 0) {
|
|
createLock(ctx, data, callback);
|
|
return;
|
|
}
|
|
var ifHeader = ctx.headers.find('If');
|
|
if (!ifHeader) {
|
|
ctx.setCode(WebDAVRequest_1.HTTPCodes.PreconditionRequired);
|
|
return callback();
|
|
}
|
|
refreshLock(ctx, IfParser_1.extractOneToken(ifHeader), callback);
|
|
};
|
|
return default_1;
|
|
}());
|
|
exports.default = default_1;
|