174 lines
9.8 KiB
JavaScript
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;
|