@beiguancyc/parse-server 9.10.0-ruixiang.1 → 9.10.0-ruixiang.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -3
- package/lib/Adapters/Files/setupFilesLink.js +85 -0
- package/lib/Config.js +31 -4
- package/lib/Controllers/index.js +4 -1
- package/lib/Deprecator/Deprecations.js +3 -6
- package/lib/FileUrlValidator.js +63 -3
- package/lib/Options/Definitions.js +3 -4
- package/lib/Options/docs.js +2 -2
- package/lib/Options/index.js +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -608,12 +608,13 @@ const parseServer = new ParseServer({
|
|
|
608
608
|
|
|
609
609
|
| Parameter | Optional | Type | Default | Environment Variable |
|
|
610
610
|
|---|---|---|---|---|
|
|
611
|
-
| `fileUpload.allowedFileUrlDomains` | yes | `String[]` | `
|
|
611
|
+
| `fileUpload.allowedFileUrlDomains` | yes | `String[]` | hostnames of `publicServerURL` and `serverURL` | `PARSE_SERVER_FILE_UPLOAD_ALLOWED_FILE_URL_DOMAINS` |
|
|
612
612
|
|
|
613
|
-
-
|
|
613
|
+
- Unset (default) allows file URLs whose hostname matches `publicServerURL` and/or `serverURL`.
|
|
614
614
|
- `['cdn.example.com']` allows only exact hostname matches.
|
|
615
615
|
- `['*.example.com']` allows any subdomain of `example.com`.
|
|
616
|
-
- `[]`
|
|
616
|
+
- `['*']` allows file URLs with any domain.
|
|
617
|
+
- `[]` blocks all file URLs; only files referenced by name are allowed. An empty array is not the same as leaving the option unset.
|
|
617
618
|
|
|
618
619
|
## Idempotency Enforcement
|
|
619
620
|
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
exports.setupFilesLink = setupFilesLink;
|
|
8
|
+
const fs = require('fs');
|
|
9
|
+
const path = require('path');
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* When filesAdapter.options.filesLinkTarget is set, create a symlink at
|
|
13
|
+
* files/{filesSubDirectory} -> filesLinkTarget before the FS adapter starts.
|
|
14
|
+
* This lets multiple Parse instances use distinct link names under files/
|
|
15
|
+
* without changing @parse/fs-files-adapter.
|
|
16
|
+
*
|
|
17
|
+
* @param {Object} filesAdapter parse-server filesAdapter config (module/class form with options)
|
|
18
|
+
*/
|
|
19
|
+
function setupFilesLink(filesAdapter) {
|
|
20
|
+
if (!filesAdapter || typeof filesAdapter !== 'object' || !filesAdapter.options) {
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
const {
|
|
24
|
+
filesLinkTarget,
|
|
25
|
+
filesSubDirectory
|
|
26
|
+
} = filesAdapter.options;
|
|
27
|
+
if (filesLinkTarget === undefined || filesLinkTarget === null || filesLinkTarget === '') {
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
if (!filesSubDirectory) {
|
|
31
|
+
throw new Error('filesAdapter.options.filesSubDirectory is required when filesLinkTarget is set.');
|
|
32
|
+
}
|
|
33
|
+
const targetPath = path.resolve(String(filesLinkTarget));
|
|
34
|
+
const linkPath = path.join('files', filesSubDirectory);
|
|
35
|
+
const linkParent = path.dirname(linkPath);
|
|
36
|
+
fs.mkdirSync(targetPath, {
|
|
37
|
+
recursive: true
|
|
38
|
+
});
|
|
39
|
+
fs.mkdirSync(linkParent, {
|
|
40
|
+
recursive: true
|
|
41
|
+
});
|
|
42
|
+
let linkStat;
|
|
43
|
+
try {
|
|
44
|
+
linkStat = fs.lstatSync(linkPath);
|
|
45
|
+
} catch (err) {
|
|
46
|
+
if (err.code === 'ENOENT') {
|
|
47
|
+
createSymlink(targetPath, linkPath);
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
throw err;
|
|
51
|
+
}
|
|
52
|
+
if (linkStat.isSymbolicLink() || isWindowsJunction(linkPath, linkStat)) {
|
|
53
|
+
const currentTarget = path.resolve(path.dirname(linkPath), fs.readlinkSync(linkPath));
|
|
54
|
+
if (pathsEqual(currentTarget, targetPath)) {
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
throw new Error(`files link "${linkPath}" already points to "${currentTarget}", expected "${targetPath}".`);
|
|
58
|
+
}
|
|
59
|
+
throw new Error(`Cannot create files link at "${linkPath}": path already exists and is not a symlink.`);
|
|
60
|
+
}
|
|
61
|
+
function createSymlink(targetPath, linkPath) {
|
|
62
|
+
// junction on Windows avoids elevated privileges required for directory symlinks
|
|
63
|
+
const type = process.platform === 'win32' ? 'junction' : 'dir';
|
|
64
|
+
fs.symlinkSync(targetPath, linkPath, type);
|
|
65
|
+
}
|
|
66
|
+
function isWindowsJunction(linkPath, linkStat) {
|
|
67
|
+
// Directory junctions may not always report as symbolic links; readlink is definitive.
|
|
68
|
+
if (process.platform !== 'win32' || !linkStat.isDirectory()) {
|
|
69
|
+
return false;
|
|
70
|
+
}
|
|
71
|
+
try {
|
|
72
|
+
fs.readlinkSync(linkPath);
|
|
73
|
+
return true;
|
|
74
|
+
} catch {
|
|
75
|
+
return false;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
function pathsEqual(a, b) {
|
|
79
|
+
if (process.platform === 'win32') {
|
|
80
|
+
return a.toLowerCase() === b.toLowerCase();
|
|
81
|
+
}
|
|
82
|
+
return a === b;
|
|
83
|
+
}
|
|
84
|
+
var _default = exports.default = setupFilesLink;
|
|
85
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImV4cG9ydHMiLCJ2YWx1ZSIsImRlZmF1bHQiLCJzZXR1cEZpbGVzTGluayIsImZzIiwicmVxdWlyZSIsInBhdGgiLCJmaWxlc0FkYXB0ZXIiLCJvcHRpb25zIiwiZmlsZXNMaW5rVGFyZ2V0IiwiZmlsZXNTdWJEaXJlY3RvcnkiLCJ1bmRlZmluZWQiLCJFcnJvciIsInRhcmdldFBhdGgiLCJyZXNvbHZlIiwiU3RyaW5nIiwibGlua1BhdGgiLCJqb2luIiwibGlua1BhcmVudCIsImRpcm5hbWUiLCJta2RpclN5bmMiLCJyZWN1cnNpdmUiLCJsaW5rU3RhdCIsImxzdGF0U3luYyIsImVyciIsImNvZGUiLCJjcmVhdGVTeW1saW5rIiwiaXNTeW1ib2xpY0xpbmsiLCJpc1dpbmRvd3NKdW5jdGlvbiIsImN1cnJlbnRUYXJnZXQiLCJyZWFkbGlua1N5bmMiLCJwYXRoc0VxdWFsIiwidHlwZSIsInByb2Nlc3MiLCJwbGF0Zm9ybSIsInN5bWxpbmtTeW5jIiwiaXNEaXJlY3RvcnkiLCJhIiwiYiIsInRvTG93ZXJDYXNlIiwiX2RlZmF1bHQiXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvQWRhcHRlcnMvRmlsZXMvc2V0dXBGaWxlc0xpbmsuanMiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBmcyA9IHJlcXVpcmUoJ2ZzJyk7XG5jb25zdCBwYXRoID0gcmVxdWlyZSgncGF0aCcpO1xuXG4vKipcbiAqIFdoZW4gZmlsZXNBZGFwdGVyLm9wdGlvbnMuZmlsZXNMaW5rVGFyZ2V0IGlzIHNldCwgY3JlYXRlIGEgc3ltbGluayBhdFxuICogZmlsZXMve2ZpbGVzU3ViRGlyZWN0b3J5fSAtPiBmaWxlc0xpbmtUYXJnZXQgYmVmb3JlIHRoZSBGUyBhZGFwdGVyIHN0YXJ0cy5cbiAqIFRoaXMgbGV0cyBtdWx0aXBsZSBQYXJzZSBpbnN0YW5jZXMgdXNlIGRpc3RpbmN0IGxpbmsgbmFtZXMgdW5kZXIgZmlsZXMvXG4gKiB3aXRob3V0IGNoYW5naW5nIEBwYXJzZS9mcy1maWxlcy1hZGFwdGVyLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBmaWxlc0FkYXB0ZXIgcGFyc2Utc2VydmVyIGZpbGVzQWRhcHRlciBjb25maWcgKG1vZHVsZS9jbGFzcyBmb3JtIHdpdGggb3B0aW9ucylcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldHVwRmlsZXNMaW5rKGZpbGVzQWRhcHRlcikge1xuICBpZiAoIWZpbGVzQWRhcHRlciB8fCB0eXBlb2YgZmlsZXNBZGFwdGVyICE9PSAnb2JqZWN0JyB8fCAhZmlsZXNBZGFwdGVyLm9wdGlvbnMpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCB7IGZpbGVzTGlua1RhcmdldCwgZmlsZXNTdWJEaXJlY3RvcnkgfSA9IGZpbGVzQWRhcHRlci5vcHRpb25zO1xuICBpZiAoZmlsZXNMaW5rVGFyZ2V0ID09PSB1bmRlZmluZWQgfHwgZmlsZXNMaW5rVGFyZ2V0ID09PSBudWxsIHx8IGZpbGVzTGlua1RhcmdldCA9PT0gJycpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoIWZpbGVzU3ViRGlyZWN0b3J5KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgJ2ZpbGVzQWRhcHRlci5vcHRpb25zLmZpbGVzU3ViRGlyZWN0b3J5IGlzIHJlcXVpcmVkIHdoZW4gZmlsZXNMaW5rVGFyZ2V0IGlzIHNldC4nXG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IHRhcmdldFBhdGggPSBwYXRoLnJlc29sdmUoU3RyaW5nKGZpbGVzTGlua1RhcmdldCkpO1xuICBjb25zdCBsaW5rUGF0aCA9IHBhdGguam9pbignZmlsZXMnLCBmaWxlc1N1YkRpcmVjdG9yeSk7XG4gIGNvbnN0IGxpbmtQYXJlbnQgPSBwYXRoLmRpcm5hbWUobGlua1BhdGgpO1xuXG4gIGZzLm1rZGlyU3luYyh0YXJnZXRQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgZnMubWtkaXJTeW5jKGxpbmtQYXJlbnQsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gIGxldCBsaW5rU3RhdDtcbiAgdHJ5IHtcbiAgICBsaW5rU3RhdCA9IGZzLmxzdGF0U3luYyhsaW5rUGF0aCk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGlmIChlcnIuY29kZSA9PT0gJ0VOT0VOVCcpIHtcbiAgICAgIGNyZWF0ZVN5bWxpbmsodGFyZ2V0UGF0aCwgbGlua1BhdGgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aHJvdyBlcnI7XG4gIH1cblxuICBpZiAobGlua1N0YXQuaXNTeW1ib2xpY0xpbmsoKSB8fCBpc1dpbmRvd3NKdW5jdGlvbihsaW5rUGF0aCwgbGlua1N0YXQpKSB7XG4gICAgY29uc3QgY3VycmVudFRhcmdldCA9IHBhdGgucmVzb2x2ZShwYXRoLmRpcm5hbWUobGlua1BhdGgpLCBmcy5yZWFkbGlua1N5bmMobGlua1BhdGgpKTtcbiAgICBpZiAocGF0aHNFcXVhbChjdXJyZW50VGFyZ2V0LCB0YXJnZXRQYXRoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgZmlsZXMgbGluayBcIiR7bGlua1BhdGh9XCIgYWxyZWFkeSBwb2ludHMgdG8gXCIke2N1cnJlbnRUYXJnZXR9XCIsIGV4cGVjdGVkIFwiJHt0YXJnZXRQYXRofVwiLmBcbiAgICApO1xuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKFxuICAgIGBDYW5ub3QgY3JlYXRlIGZpbGVzIGxpbmsgYXQgXCIke2xpbmtQYXRofVwiOiBwYXRoIGFscmVhZHkgZXhpc3RzIGFuZCBpcyBub3QgYSBzeW1saW5rLmBcbiAgKTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlU3ltbGluayh0YXJnZXRQYXRoLCBsaW5rUGF0aCkge1xuICAvLyBqdW5jdGlvbiBvbiBXaW5kb3dzIGF2b2lkcyBlbGV2YXRlZCBwcml2aWxlZ2VzIHJlcXVpcmVkIGZvciBkaXJlY3Rvcnkgc3ltbGlua3NcbiAgY29uc3QgdHlwZSA9IHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMicgPyAnanVuY3Rpb24nIDogJ2Rpcic7XG4gIGZzLnN5bWxpbmtTeW5jKHRhcmdldFBhdGgsIGxpbmtQYXRoLCB0eXBlKTtcbn1cblxuZnVuY3Rpb24gaXNXaW5kb3dzSnVuY3Rpb24obGlua1BhdGgsIGxpbmtTdGF0KSB7XG4gIC8vIERpcmVjdG9yeSBqdW5jdGlvbnMgbWF5IG5vdCBhbHdheXMgcmVwb3J0IGFzIHN5bWJvbGljIGxpbmtzOyByZWFkbGluayBpcyBkZWZpbml0aXZlLlxuICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSAhPT0gJ3dpbjMyJyB8fCAhbGlua1N0YXQuaXNEaXJlY3RvcnkoKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB0cnkge1xuICAgIGZzLnJlYWRsaW5rU3luYyhsaW5rUGF0aCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwYXRoc0VxdWFsKGEsIGIpIHtcbiAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMicpIHtcbiAgICByZXR1cm4gYS50b0xvd2VyQ2FzZSgpID09PSBiLnRvTG93ZXJDYXNlKCk7XG4gIH1cbiAgcmV0dXJuIGEgPT09IGI7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHNldHVwRmlsZXNMaW5rO1xuIl0sIm1hcHBpbmdzIjoiQUFBQSxZQUFZOztBQUFDQSxNQUFBLENBQUFDLGNBQUEsQ0FBQUMsT0FBQTtFQUFBQyxLQUFBO0FBQUE7QUFBQUQsT0FBQSxDQUFBRSxPQUFBO0FBQUFGLE9BQUEsQ0FBQUcsY0FBQSxHQUFBQSxjQUFBO0FBRWIsTUFBTUMsRUFBRSxHQUFHQyxPQUFPLENBQUMsSUFBSSxDQUFDO0FBQ3hCLE1BQU1DLElBQUksR0FBR0QsT0FBTyxDQUFDLE1BQU0sQ0FBQzs7QUFFNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNGLGNBQWNBLENBQUNJLFlBQVksRUFBRTtFQUMzQyxJQUFJLENBQUNBLFlBQVksSUFBSSxPQUFPQSxZQUFZLEtBQUssUUFBUSxJQUFJLENBQUNBLFlBQVksQ0FBQ0MsT0FBTyxFQUFFO0lBQzlFO0VBQ0Y7RUFFQSxNQUFNO0lBQUVDLGVBQWU7SUFBRUM7RUFBa0IsQ0FBQyxHQUFHSCxZQUFZLENBQUNDLE9BQU87RUFDbkUsSUFBSUMsZUFBZSxLQUFLRSxTQUFTLElBQUlGLGVBQWUsS0FBSyxJQUFJLElBQUlBLGVBQWUsS0FBSyxFQUFFLEVBQUU7SUFDdkY7RUFDRjtFQUVBLElBQUksQ0FBQ0MsaUJBQWlCLEVBQUU7SUFDdEIsTUFBTSxJQUFJRSxLQUFLLENBQ2IsaUZBQ0YsQ0FBQztFQUNIO0VBRUEsTUFBTUMsVUFBVSxHQUFHUCxJQUFJLENBQUNRLE9BQU8sQ0FBQ0MsTUFBTSxDQUFDTixlQUFlLENBQUMsQ0FBQztFQUN4RCxNQUFNTyxRQUFRLEdBQUdWLElBQUksQ0FBQ1csSUFBSSxDQUFDLE9BQU8sRUFBRVAsaUJBQWlCLENBQUM7RUFDdEQsTUFBTVEsVUFBVSxHQUFHWixJQUFJLENBQUNhLE9BQU8sQ0FBQ0gsUUFBUSxDQUFDO0VBRXpDWixFQUFFLENBQUNnQixTQUFTLENBQUNQLFVBQVUsRUFBRTtJQUFFUSxTQUFTLEVBQUU7RUFBSyxDQUFDLENBQUM7RUFDN0NqQixFQUFFLENBQUNnQixTQUFTLENBQUNGLFVBQVUsRUFBRTtJQUFFRyxTQUFTLEVBQUU7RUFBSyxDQUFDLENBQUM7RUFFN0MsSUFBSUMsUUFBUTtFQUNaLElBQUk7SUFDRkEsUUFBUSxHQUFHbEIsRUFBRSxDQUFDbUIsU0FBUyxDQUFDUCxRQUFRLENBQUM7RUFDbkMsQ0FBQyxDQUFDLE9BQU9RLEdBQUcsRUFBRTtJQUNaLElBQUlBLEdBQUcsQ0FBQ0MsSUFBSSxLQUFLLFFBQVEsRUFBRTtNQUN6QkMsYUFBYSxDQUFDYixVQUFVLEVBQUVHLFFBQVEsQ0FBQztNQUNuQztJQUNGO0lBQ0EsTUFBTVEsR0FBRztFQUNYO0VBRUEsSUFBSUYsUUFBUSxDQUFDSyxjQUFjLENBQUMsQ0FBQyxJQUFJQyxpQkFBaUIsQ0FBQ1osUUFBUSxFQUFFTSxRQUFRLENBQUMsRUFBRTtJQUN0RSxNQUFNTyxhQUFhLEdBQUd2QixJQUFJLENBQUNRLE9BQU8sQ0FBQ1IsSUFBSSxDQUFDYSxPQUFPLENBQUNILFFBQVEsQ0FBQyxFQUFFWixFQUFFLENBQUMwQixZQUFZLENBQUNkLFFBQVEsQ0FBQyxDQUFDO0lBQ3JGLElBQUllLFVBQVUsQ0FBQ0YsYUFBYSxFQUFFaEIsVUFBVSxDQUFDLEVBQUU7TUFDekM7SUFDRjtJQUNBLE1BQU0sSUFBSUQsS0FBSyxDQUNiLGVBQWVJLFFBQVEsd0JBQXdCYSxhQUFhLGdCQUFnQmhCLFVBQVUsSUFDeEYsQ0FBQztFQUNIO0VBRUEsTUFBTSxJQUFJRCxLQUFLLENBQ2IsZ0NBQWdDSSxRQUFRLDhDQUMxQyxDQUFDO0FBQ0g7QUFFQSxTQUFTVSxhQUFhQSxDQUFDYixVQUFVLEVBQUVHLFFBQVEsRUFBRTtFQUMzQztFQUNBLE1BQU1nQixJQUFJLEdBQUdDLE9BQU8sQ0FBQ0MsUUFBUSxLQUFLLE9BQU8sR0FBRyxVQUFVLEdBQUcsS0FBSztFQUM5RDlCLEVBQUUsQ0FBQytCLFdBQVcsQ0FBQ3RCLFVBQVUsRUFBRUcsUUFBUSxFQUFFZ0IsSUFBSSxDQUFDO0FBQzVDO0FBRUEsU0FBU0osaUJBQWlCQSxDQUFDWixRQUFRLEVBQUVNLFFBQVEsRUFBRTtFQUM3QztFQUNBLElBQUlXLE9BQU8sQ0FBQ0MsUUFBUSxLQUFLLE9BQU8sSUFBSSxDQUFDWixRQUFRLENBQUNjLFdBQVcsQ0FBQyxDQUFDLEVBQUU7SUFDM0QsT0FBTyxLQUFLO0VBQ2Q7RUFDQSxJQUFJO0lBQ0ZoQyxFQUFFLENBQUMwQixZQUFZLENBQUNkLFFBQVEsQ0FBQztJQUN6QixPQUFPLElBQUk7RUFDYixDQUFDLENBQUMsTUFBTTtJQUNOLE9BQU8sS0FBSztFQUNkO0FBQ0Y7QUFFQSxTQUFTZSxVQUFVQSxDQUFDTSxDQUFDLEVBQUVDLENBQUMsRUFBRTtFQUN4QixJQUFJTCxPQUFPLENBQUNDLFFBQVEsS0FBSyxPQUFPLEVBQUU7SUFDaEMsT0FBT0csQ0FBQyxDQUFDRSxXQUFXLENBQUMsQ0FBQyxLQUFLRCxDQUFDLENBQUNDLFdBQVcsQ0FBQyxDQUFDO0VBQzVDO0VBQ0EsT0FBT0YsQ0FBQyxLQUFLQyxDQUFDO0FBQ2hCO0FBQUMsSUFBQUUsUUFBQSxHQUFBeEMsT0FBQSxDQUFBRSxPQUFBLEdBRWNDLGNBQWMiLCJpZ25vcmVMaXN0IjpbXX0=
|