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

240 lines
10 KiB
JavaScript

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var IPrivilegeManager_1 = require("../../user/v1/privilege/IPrivilegeManager");
var xml_js_builder_1 = require("xml-js-builder");
var IfParser_1 = require("../../helper/v1/IfParser");
var HTTPCodes_1 = require("../HTTPCodes");
var FSManager_1 = require("../../manager/v1/FSManager");
var Errors_1 = require("../../Errors");
var http = require("http");
var url = require("url");
var MethodCallArgs = /** @class */ (function () {
function MethodCallArgs(server, request, response, exit, callback) {
this.server = server;
this.request = request;
this.response = response;
this.exit = exit;
this.callback = callback;
this.contentLength = parseInt(this.findHeader('Content-length', '0'), 10);
this.isSource = this.findHeader('source', 'F').toUpperCase() === 'T' || this.findHeader('translate', 'T').toUpperCase() === 'F';
this.depth = parseInt(this.findHeader('Depth', '0'), 10);
this.host = this.findHeader('Host');
this.uri = url.parse(request.url).pathname;
this.path = new FSManager_1.FSPath(this.uri);
}
MethodCallArgs.create = function (server, request, response, callback) {
var mca = new MethodCallArgs(server, request, response, null, null);
response.setHeader('DAV', '1,2');
response.setHeader('Server', server.options.serverName + '/' + server.options.version);
mca.askForAuthentication(false, function (e) {
if (e) {
callback(e, mca);
return;
}
server.httpAuthentication.getUser(mca, server.userManager, function (e, user) {
mca.user = user;
if (e && e !== Errors_1.Errors.UserNotFound) {
if (server.options.requireAuthentification || e !== Errors_1.Errors.MissingAuthorisationHeader) {
callback(e, mca);
return;
}
}
if (server.options.requireAuthentification && (!user || user.isDefaultUser || e === Errors_1.Errors.UserNotFound)) {
callback(Errors_1.Errors.MissingAuthorisationHeader, mca);
return;
}
server.getResourceFromPath(mca, mca.uri, function (e, r) {
if (e || !r) {
setAllowHeader();
return;
}
mca.resource = r;
r.type(function (e, type) {
if (e || !type) {
setAllowHeader();
return;
}
mca.resourceType = type;
setAllowHeader(type);
});
});
});
});
function setAllowHeader(type) {
var allowedMethods = [];
for (var name_1 in server.methods) {
var method = server.methods[name_1];
if (!method.isValidFor || method.isValidFor(type))
allowedMethods.push(name_1.toUpperCase());
}
response.setHeader('Allow', allowedMethods.join(','));
callback(null, mca);
}
};
MethodCallArgs.prototype.noBodyExpected = function (callback) {
if (this.server.options.strictMode && this.contentLength !== 0) {
this.setCode(HTTPCodes_1.HTTPCodes.UnsupportedMediaType);
this.exit();
}
else
callback();
};
MethodCallArgs.prototype.checkIfHeader = function (defaultResource, callback) {
var _this = this;
var ifHeader = this.findHeader('If');
if (!ifHeader) {
callback();
return;
}
IfParser_1.parseIfHeader(ifHeader)(this, defaultResource, function (e, passed) {
if (e) {
_this.setCode(HTTPCodes_1.HTTPCodes.InternalServerError);
_this.exit();
}
else if (!passed) {
_this.setCode(HTTPCodes_1.HTTPCodes.PreconditionFailed);
_this.exit();
}
else
callback();
});
};
MethodCallArgs.prototype.requireCustomPrivilege = function (privileges, resource, callback) {
var _this = this;
IPrivilegeManager_1.requirePrivilege(privileges, this, resource, function (e, can) {
if (e) {
_this.setCode(HTTPCodes_1.HTTPCodes.InternalServerError);
_this.exit();
return;
}
if (!can) {
_this.setCode(HTTPCodes_1.HTTPCodes.Unauthorized);
_this.exit();
return;
}
callback();
});
};
MethodCallArgs.prototype.requirePrivilege = function (privileges, resource, callback) {
this.requireCustomPrivilege(privileges, resource, callback);
};
MethodCallArgs.prototype.requireErCustomPrivilege = function (privileges, resource, callback) {
IPrivilegeManager_1.requirePrivilege(privileges, this, resource, callback);
};
MethodCallArgs.prototype.requireErPrivilege = function (privileges, resource, callback) {
this.requireErCustomPrivilege(privileges, resource, callback);
};
MethodCallArgs.prototype.askForAuthentication = function (checkForUser, callback) {
if (checkForUser && this.user !== null && !this.user.isDefaultUser) {
callback(Errors_1.Errors.AlreadyAuthenticated);
return;
}
var auth = this.server.httpAuthentication.askForAuthentication();
for (var name_2 in auth)
this.response.setHeader(name_2, auth[name_2]);
callback(null);
};
MethodCallArgs.prototype.accept = function (regex) {
var accepts = this.findHeader('Accept', 'text/xml').split(',');
for (var _i = 0, accepts_1 = accepts; _i < accepts_1.length; _i++) {
var value = accepts_1[_i];
for (var i = 0; i < regex.length; ++i)
if (regex[i].test(value))
return i;
}
return -1;
};
MethodCallArgs.prototype.findHeader = function (name, defaultValue) {
if (defaultValue === void 0) { defaultValue = null; }
name = name.replace(/(-| )/g, '').toLowerCase();
for (var k in this.request.headers)
if (k.replace(/(-| )/g, '').toLowerCase() === name)
return this.request.headers[k].toString();
return defaultValue;
};
MethodCallArgs.prototype.getResource = function (callback) {
callback(!this.resource ? Errors_1.Errors.ResourceNotFound : null, this.resource);
};
MethodCallArgs.prototype.dateISO8601 = function (ticks) {
// Adding date
var date = new Date(ticks);
var result = date.toISOString().substring(0, '0000-00-00T00:00:00'.length);
// Adding timezone offset
var offset = date.getTimezoneOffset();
result += offset < 0 ? '-' : '+';
offset = Math.abs(offset);
var h = Math.floor(offset / 60).toString(10);
while (h.length < 2)
h = '0' + h;
var m = (offset % 60).toString(10);
while (m.length < 2)
m = '0' + m;
result += h + ':' + m;
return result;
};
MethodCallArgs.prototype.invokeEvent = function (event, subjectResource, details) {
this.server.invoke(event, this, subjectResource, details);
};
MethodCallArgs.prototype.wrapEvent = function (event, subjectResource, details) {
var _this = this;
var oldExit = this.exit;
this.exit = function () {
if (Math.floor(_this.response.statusCode / 100) === 2)
_this.invokeEvent(event, subjectResource, details);
oldExit();
};
return this.exit;
};
MethodCallArgs.prototype.fullUri = function (uri) {
if (uri === void 0) { uri = null; }
if (!uri)
uri = this.uri;
return (this.prefixUri() + uri).replace(/([^:])\/\//g, '$1/');
};
MethodCallArgs.prototype.prefixUri = function () {
return 'http://' + this.host.replace('/', '');
};
MethodCallArgs.prototype.getResourcePath = function (resource, callback) {
var _this = this;
if (!resource.parent)
callback(null, '/');
else
resource.webName(function (e, name) { return process.nextTick(function () {
_this.getResourcePath(resource.parent, function (e, parentName) {
callback(e, parentName.replace(/\/$/, '') + '/' + name);
});
}); });
};
MethodCallArgs.prototype.writeXML = function (xmlObject) {
var content = xml_js_builder_1.XML.toXML(xmlObject);
switch (this.accept([/[^a-z0-9A-Z]xml$/, /[^a-z0-9A-Z]json$/])) {
default:
case 0: // xml
this.response.setHeader('Content-Type', 'application/xml; charset="utf-8"');
this.response.setHeader('Content-Length', content.length.toString());
this.response.write(content);
break;
case 1: // json
content = xml_js_builder_1.XML.toJSON(content);
this.response.setHeader('Content-Type', 'application/json; charset="utf-8"');
this.response.setHeader('Content-Length', content.length.toString());
this.response.write(content);
break;
}
};
MethodCallArgs.prototype.setCode = function (code, message) {
if (!message)
message = http.STATUS_CODES[code];
if (!message) {
this.response.statusCode = code;
}
else {
this.response.statusCode = code;
this.response.statusMessage = message;
}
};
return MethodCallArgs;
}());
exports.MethodCallArgs = MethodCallArgs;
exports.default = MethodCallArgs;