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

135 lines
4.0 KiB
JavaScript

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var Path_1 = require("../../manager/v2/Path");
var url = require("url");
function NoLock() {
return function (resource, callback) {
resource.lockManager(function (e, lm) {
if (e)
return callback(e, false);
lm.getLocks(function (e, locks) {
callback(e, locks ? locks.length === 0 : false);
});
});
};
}
function Token(token) {
return function (resource, callback) {
resource.lockManager(function (e, lm) {
if (e)
return callback(e, false);
lm.getLock(token, function (e, lock) { return callback(e, !!lock && !e); });
});
};
}
function Tag(tag) {
return function (resource, callback) {
resource.etag(function (e, etag) { return callback(e, !e && etag === tag); });
};
}
function Not(filter) {
return function (resource, callback) {
filter(resource, function (e, v) {
callback(e, !v);
});
};
}
function parseInternal(group) {
var rex = /((not)|\[([^\]]+)\]|<(DAV:no-lock)>|<([^>]+)>|([^\s]+))/ig;
var match = rex.exec(group);
var isNot = false;
var andArray = [];
function add(filter) {
andArray.push(isNot ? Not(filter) : filter);
isNot = false;
}
while (match) {
if (match[2]) { // not
isNot = true;
}
else if (match[5] || match[6]) { // lock-token
add(Token(match[5] || match[6]));
}
else if (match[3]) { // tag
add(Tag(match[3]));
}
else if (match[4]) { // DAV:no-lock
add(NoLock());
}
match = rex.exec(group);
}
if (andArray.length)
return function (r, callback) { return callback(null, true); };
return function (resource, callback) {
var nb = andArray.length;
function done(error, result) {
if (nb <= 0)
return;
if (error) {
nb = -1;
callback(error, false);
return;
}
--nb;
if (nb === 0 || !result) {
nb = -1;
callback(null, result);
}
}
andArray.forEach(function (a) { return a(resource, done); });
};
}
function extractOneToken(ifHeader) {
var match = /^\s*\(\s*<?([^\)\s>]+)>?\s*\)\s*$/.exec(ifHeader);
if (!match)
return null;
else
return match[1];
}
exports.extractOneToken = extractOneToken;
function parseIfHeader(ifHeader) {
var rex = /(?:<([^>]+)>)?\s*\(([^\)]+)\)/g;
var match = rex.exec(ifHeader);
var orArray = [];
var oldPath = undefined;
while (match) {
if (match[1])
oldPath = url.parse(match[1]).path;
orArray.push({
path: oldPath,
actions: parseInternal(match[2])
});
match = rex.exec(ifHeader);
}
if (orArray.length === 0)
return function (ctx, resource, callback) { return callback(null, true); };
return function (ctx, resource, callback) {
var nb = orArray.length;
function done(error, result) {
if (nb <= 0)
return;
if (error) {
nb = -1;
callback(error, false);
return;
}
--nb;
if (nb === 0 || result) {
nb = -1;
callback(null, result);
}
}
orArray.forEach(function (a) {
if (!a.path)
a.actions(resource, done);
else {
var sPath_1 = new Path_1.Path(a.path);
ctx.server.getFileSystem(sPath_1, function (fs, _, sub) {
a.actions(fs.resource(ctx, sPath_1), done);
});
}
});
};
}
exports.parseIfHeader = parseIfHeader;