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

174 lines
9.8 KiB
JavaScript

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var WebDAVRequest_1 = require("../WebDAVRequest");
var xml_js_builder_1 = require("xml-js-builder");
var http_1 = require("http");
var JSCompatibility_1 = require("../../../helper/JSCompatibility");
var Workflow_1 = require("../../../helper/Workflow");
var Errors_1 = require("../../../Errors");
var default_1 = /** @class */ (function () {
function default_1() {
}
default_1.prototype.unchunked = function (ctx, data, callback) {
ctx.getResource(function (e, r) {
ctx.checkIfHeader(r, function () {
//ctx.requirePrivilege([ 'canSetProperty', 'canRemoveProperty' ], r, () => {
var multistatus = new xml_js_builder_1.XMLElementBuilder('D:multistatus', {
'xmlns:D': 'DAV:'
});
var response = multistatus.ele('D:response');
response.ele('D:href', undefined, true).add(WebDAVRequest_1.HTTPRequestContext.encodeURL(ctx.fullUri()));
try {
var xml = xml_js_builder_1.XML.parse(data);
var root_1 = xml.find('DAV:propertyupdate');
var notifications_1 = {};
var reverse_1 = [];
var finalize_1 = function () {
finalize_1 = function () {
var next = function () {
var codes = Object.keys(notifications_1);
codes.forEach(function (code) {
var propstat = response.ele('D:propstat');
var prop = propstat.ele('D:prop');
notifications_1[code].forEach(function (name) { return prop.add(new xml_js_builder_1.XMLElementBuilder(name)); });
propstat.ele('D:status').add('HTTP/1.1 ' + code + ' ' + http_1.STATUS_CODES[code]);
});
ctx.setCode(WebDAVRequest_1.HTTPCodes.MultiStatus);
ctx.writeBody(multistatus);
callback();
};
if (Object.keys(notifications_1).length > 1) {
new Workflow_1.Workflow()
.each(reverse_1, function (action, cb) { return action(cb); })
.error(function (e) {
if (!ctx.setCodeFromError(e))
ctx.setCode(WebDAVRequest_1.HTTPCodes.InternalServerError);
callback();
})
.done(function () {
if (notifications_1[WebDAVRequest_1.HTTPCodes.OK]) {
notifications_1[WebDAVRequest_1.HTTPCodes.FailedDependency] = notifications_1[WebDAVRequest_1.HTTPCodes.OK];
delete notifications_1[WebDAVRequest_1.HTTPCodes.OK];
}
next();
});
}
else
next();
};
};
var notify_1 = function (el, error) {
var code = error ? WebDAVRequest_1.HTTPCodes.Forbidden : WebDAVRequest_1.HTTPCodes.OK;
if (!notifications_1[code])
notifications_1[code] = [];
notifications_1[code].push(el.name);
};
var execute_1 = function (name, eventName, fnProp) {
var list = root_1.findMany(name);
if (list.length === 0) {
finalize_1();
return;
}
list.forEach(function (el) {
var els = el.find('DAV:prop').elements;
new Workflow_1.Workflow(false)
.each(els, function (x, cb) {
if (x.type !== 'element')
return cb();
fnProp(x, cb);
})
.intermediate(function (el, e) {
/*if(!e)
ctx.invokeEvent(eventName, r, el)*/
if (el.type === 'element')
notify_1(el, e);
})
.done(function (_) { return finalize_1(); });
});
};
r.fs.checkPrivilege(ctx, r.path, 'canWriteProperties', function (e, can) {
if (e || !can) {
if (e) {
if (!ctx.setCodeFromError(e))
ctx.setCode(WebDAVRequest_1.HTTPCodes.InternalServerError);
}
else if (!can)
ctx.setCodeFromError(Errors_1.Errors.NotEnoughPrivilege);
return callback();
}
r.fs.isLocked(ctx, r.path, function (e, locked) {
if (e || locked) {
if (e) {
if (!ctx.setCodeFromError(e))
ctx.setCode(WebDAVRequest_1.HTTPCodes.InternalServerError);
}
else if (locked)
ctx.setCode(WebDAVRequest_1.HTTPCodes.Locked);
return callback();
}
r.propertyManager(function (e, pm) {
if (e) {
if (!ctx.setCodeFromError(e))
ctx.setCode(WebDAVRequest_1.HTTPCodes.InternalServerError);
return callback();
}
pm.getProperties(function (e, props) {
if (e) {
if (!ctx.setCodeFromError(e))
ctx.setCode(WebDAVRequest_1.HTTPCodes.InternalServerError);
return callback();
}
var properties = JSON.parse(JSON.stringify(props));
var pushSetReverseAction = function (el) {
var prop = properties[el.name];
if (prop)
reverse_1.push(function (cb) { return pm.setProperty(el.name, prop.value, prop.attributes, cb); });
else
reverse_1.push(function (cb) { return pm.removeProperty(el.name, cb); });
};
var pushRemoveReverseAction = function (el) {
var prop = properties[el.name];
reverse_1.push(function (cb) { return pm.setProperty(el.name, prop.value, prop.attributes, cb); });
};
execute_1('DAV:set', 'setProperty', function (el, callback) {
if (JSCompatibility_1.startsWith(el.name, 'DAV:')) {
pushSetReverseAction(el);
return callback(Errors_1.Errors.Forbidden);
}
pm.setProperty(el.name, el.elements, el.attributes, function (e) {
if (!e)
pushSetReverseAction(el);
callback(e);
});
});
execute_1('DAV:remove', 'removeProperty', function (el, callback) {
if (JSCompatibility_1.startsWith(el.name, 'DAV:')) {
pushRemoveReverseAction(el);
return callback(Errors_1.Errors.Forbidden);
}
pm.removeProperty(el.name, function (e) {
if (!e)
pushRemoveReverseAction(el);
callback(e);
});
});
}, false);
});
});
});
}
catch (ex) {
ctx.setCode(WebDAVRequest_1.HTTPCodes.BadRequest);
callback();
}
//})
});
});
};
default_1.prototype.isValidFor = function (ctx, type) {
return !!type;
};
return default_1;
}());
exports.default = default_1;