UNPKG

rxdb-server

Version:
114 lines (112 loc) 3.35 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.docContainsServerOnlyFields = docContainsServerOnlyFields; exports.doesContainRegexQuerySelector = doesContainRegexQuerySelector; exports.getAuthDataByRequest = getAuthDataByRequest; exports.getDocAllowedMatcher = getDocAllowedMatcher; exports.mergeServerDocumentFieldsMonad = mergeServerDocumentFieldsMonad; exports.removeServerOnlyFieldsMonad = removeServerOnlyFieldsMonad; exports.setCors = setCors; var _core = require("rxdb/plugins/core"); function setCors(server, path, cors) { var useCors = cors; if (!useCors) { useCors = server.cors; } if (useCors) { server.adapter.setCors(server.serverApp, path, useCors); } } var AUTH_PER_REQUEST = new WeakMap(); async function getAuthDataByRequest(server, request, response) { return (0, _core.getFromMapOrCreate)(AUTH_PER_REQUEST, request, async () => { try { var headers = server.adapter.getRequestHeaders(request); var authData = await server.authHandler(headers); return authData; } catch (err) { server.adapter.closeConnection(response, 401, 'Unauthorized'); return false; } }); } ; var defaultMatchingQuery = { selector: {}, skip: 0, sort: [] }; function getDocAllowedMatcher(endpoint, authData) { var useQuery = endpoint.queryModifier ? endpoint.queryModifier(authData, (0, _core.normalizeMangoQuery)(endpoint.collection.schema.jsonSchema, {})) : defaultMatchingQuery; var docDataMatcher = (0, _core.getQueryMatcher)(endpoint.collection.schema.jsonSchema, useQuery); return docDataMatcher; } function docContainsServerOnlyFields(serverOnlyFields, doc) { var has = serverOnlyFields.find(field => { return typeof doc[field] !== 'undefined'; }); return has; } function removeServerOnlyFieldsMonad(serverOnlyFields) { var serverOnlyFieldsStencil = { _meta: undefined, _rev: undefined, _attachments: undefined }; serverOnlyFields.forEach(field => serverOnlyFieldsStencil[field] = undefined); return docData => { if (!docData) { return docData; } return Object.assign({}, docData, serverOnlyFieldsStencil); }; } function mergeServerDocumentFieldsMonad(serverOnlyFields) { var useFields = serverOnlyFields.slice(0); // useFields.push('_rev'); // useFields.push('_meta'); // useFields.push('_attachments'); useFields = (0, _core.uniqueArray)(useFields); return (clientDoc, serverDoc) => { if (!serverDoc) { return clientDoc; } var ret = (0, _core.flatClone)(clientDoc); useFields.forEach(field => { ret[field] = serverDoc[field]; }); return ret; }; } /** * $regex queries are dangerous because they can dos-attack the server. * * @param selector */ function doesContainRegexQuerySelector(selector) { if (!selector) { return false; } if (Array.isArray(selector)) { var found = !!selector.find(item => doesContainRegexQuerySelector(item)); return found; } if (typeof selector !== 'object') { return false; } var entries = Object.entries(selector); for (var [key, value] of entries) { if (key === '$regex') { return true; } else { var has = doesContainRegexQuerySelector(value); if (has) { return true; } } } return false; } //# sourceMappingURL=helper.js.map