Skip to content

Commit ec05f17

Browse files
authored
build: Release (#10068)
2 parents 84959c6 + 66762cd commit ec05f17

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

49 files changed

+3590
-1025
lines changed

README.md

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ A big _thank you_ 🙏 to our [sponsors](#sponsors) and [backers](#backers) who
6868
- [Using Environment Variables](#using-environment-variables)
6969
- [Available Adapters](#available-adapters)
7070
- [Configuring File Adapters](#configuring-file-adapters)
71+
- [Restricting File URL Domains](#restricting-file-url-domains)
7172
- [Idempotency Enforcement](#idempotency-enforcement)
7273
- [Localization](#localization)
7374
- [Pages](#pages)
@@ -491,6 +492,33 @@ Parse Server allows developers to choose from several options when hosting files
491492

492493
`GridFSBucketAdapter` is used by default and requires no setup, but if you're interested in using Amazon S3, Google Cloud Storage, or local file storage, additional configuration information is available in the [Parse Server guide](http://docs.parseplatform.org/parse-server/guide/#configuring-file-adapters).
493494
495+
### Restricting File URL Domains
496+
497+
Parse objects can reference files by URL. To prevent [SSRF attacks](https://owasp.org/www-community/attacks/Server_Side_Request_Forgery) via crafted file URLs, you can restrict the allowed URL domains using the `fileUpload.allowedFileUrlDomains` option.
498+
499+
This protects against scenarios where an attacker provides a `Parse.File` with an arbitrary URL, for example as a Cloud Function parameter or in a field of type `Object` or `Array`. If Cloud Code or a client calls `getData()` on such a file, the Parse SDK makes an HTTP request to that URL, potentially leaking the server or client IP address and accessing internal services.
500+
501+
> [!NOTE]
502+
> Fields of type `Parse.File` in the Parse schema are not affected by this attack, because Parse Server discards the URL on write and dynamically generates it on read based on the file adapter configuration.
503+
504+
```javascript
505+
const parseServer = new ParseServer({
506+
...otherOptions,
507+
fileUpload: {
508+
allowedFileUrlDomains: ['cdn.example.com', '*.example.com'],
509+
},
510+
});
511+
```
512+
513+
| Parameter | Optional | Type | Default | Environment Variable |
514+
|---|---|---|---|---|
515+
| `fileUpload.allowedFileUrlDomains` | yes | `String[]` | `['*']` | `PARSE_SERVER_FILE_UPLOAD_ALLOWED_FILE_URL_DOMAINS` |
516+
517+
- `['*']` (default) allows file URLs with any domain.
518+
- `['cdn.example.com']` allows only exact hostname matches.
519+
- `['*.example.com']` allows any subdomain of `example.com`.
520+
- `[]` blocks all file URLs; only files referenced by name are allowed.
521+
494522
## Idempotency Enforcement
495523
496524
**Caution, this is an experimental feature that may not be appropriate for production.**

benchmark/performance.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
* Run with: npm run benchmark
99
*/
1010

11-
const core = require('@actions/core');
1211
const Parse = require('parse/node');
1312
const { performance } = require('node:perf_hooks');
1413
const { MongoClient } = require('mongodb');
@@ -25,6 +24,7 @@ const LOG_ITERATIONS = false;
2524
// Parse Server instance
2625
let parseServer;
2726
let mongoClient;
27+
let core;
2828

2929
// Logging helpers
3030
const logInfo = message => core.info(message);
@@ -529,6 +529,7 @@ async function benchmarkQueryWithIncludeNested(name) {
529529
* Run all benchmarks
530530
*/
531531
async function runBenchmarks() {
532+
core = await import('@actions/core');
532533
logInfo('Starting Parse Server Performance Benchmarks...');
533534

534535
let server;

changelogs/CHANGELOG_alpha.md

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,80 @@
1+
# [9.3.0-alpha.9](https://github.com/parse-community/parse-server/compare/9.3.0-alpha.8...9.3.0-alpha.9) (2026-02-21)
2+
3+
4+
### Features
5+
6+
* Add support for streaming file upload via `Buffer`, `Readable`, `ReadableStream` ([#10065](https://github.com/parse-community/parse-server/issues/10065)) ([f0feb48](https://github.com/parse-community/parse-server/commit/f0feb48d0fb697a161693721eadd09d740336283))
7+
8+
# [9.3.0-alpha.8](https://github.com/parse-community/parse-server/compare/9.3.0-alpha.7...9.3.0-alpha.8) (2026-02-21)
9+
10+
11+
### Bug Fixes
12+
13+
* Incorrect dependency chain of `Parse` uses browser build instead of Node build ([#10067](https://github.com/parse-community/parse-server/issues/10067)) ([1a2521d](https://github.com/parse-community/parse-server/commit/1a2521d930b855845aa13fde700b2e8170ff65a1))
14+
15+
# [9.3.0-alpha.7](https://github.com/parse-community/parse-server/compare/9.3.0-alpha.6...9.3.0-alpha.7) (2026-02-20)
16+
17+
18+
### Features
19+
20+
* Upgrade to parse 8.2.0, @parse/push-adapter 8.3.0 ([#10066](https://github.com/parse-community/parse-server/issues/10066)) ([8b5a14e](https://github.com/parse-community/parse-server/commit/8b5a14ecaf0b58b899651fb97d43e0e5d9be506d))
21+
22+
# [9.3.0-alpha.6](https://github.com/parse-community/parse-server/compare/9.3.0-alpha.5...9.3.0-alpha.6) (2026-02-14)
23+
24+
25+
### Bug Fixes
26+
27+
* Default ACL overwrites custom ACL on `Parse.Object` update ([#10061](https://github.com/parse-community/parse-server/issues/10061)) ([4ef89d9](https://github.com/parse-community/parse-server/commit/4ef89d912c08bb24500a4d4142a3220f024a2d34))
28+
29+
# [9.3.0-alpha.5](https://github.com/parse-community/parse-server/compare/9.3.0-alpha.4...9.3.0-alpha.5) (2026-02-12)
30+
31+
32+
### Bug Fixes
33+
34+
* `Parse.Query.select('authData')` for `_User` class doesn't return auth data ([#10055](https://github.com/parse-community/parse-server/issues/10055)) ([44a5bb1](https://github.com/parse-community/parse-server/commit/44a5bb105e11e6918e899e0f1427b0adb38d6d67))
35+
36+
# [9.3.0-alpha.4](https://github.com/parse-community/parse-server/compare/9.3.0-alpha.3...9.3.0-alpha.4) (2026-02-12)
37+
38+
39+
### Bug Fixes
40+
41+
* Unlinking auth provider triggers auth data validation ([#10045](https://github.com/parse-community/parse-server/issues/10045)) ([b6b6327](https://github.com/parse-community/parse-server/commit/b6b632755263417c2a3c3a31381eedc516723740))
42+
43+
# [9.3.0-alpha.3](https://github.com/parse-community/parse-server/compare/9.3.0-alpha.2...9.3.0-alpha.3) (2026-02-07)
44+
45+
46+
### Features
47+
48+
* Add `Parse.File.url` validation with config `fileUpload.allowedFileUrlDomains` against SSRF attacks ([#10044](https://github.com/parse-community/parse-server/issues/10044)) ([4c9c948](https://github.com/parse-community/parse-server/commit/4c9c9489f062bec6d751b23f4a68aea2a63936bd))
49+
50+
# [9.3.0-alpha.2](https://github.com/parse-community/parse-server/compare/9.3.0-alpha.1...9.3.0-alpha.2) (2026-02-06)
51+
52+
53+
### Bug Fixes
54+
55+
* Default HTML pages for password reset, email verification not found ([#10041](https://github.com/parse-community/parse-server/issues/10041)) ([a4265bb](https://github.com/parse-community/parse-server/commit/a4265bb1241551b7147e8aee08c36e1f8ab09ba4))
56+
57+
# [9.3.0-alpha.1](https://github.com/parse-community/parse-server/compare/9.2.1-alpha.2...9.3.0-alpha.1) (2026-02-06)
58+
59+
60+
### Features
61+
62+
* Add event information to `verifyUserEmails`, `preventLoginWithUnverifiedEmail` to identify invoking signup / login action and auth provider ([#9963](https://github.com/parse-community/parse-server/issues/9963)) ([ed98c15](https://github.com/parse-community/parse-server/commit/ed98c15f90f2fa6a66780941fd3705b805d6eb14))
63+
64+
## [9.2.1-alpha.2](https://github.com/parse-community/parse-server/compare/9.2.1-alpha.1...9.2.1-alpha.2) (2026-02-06)
65+
66+
67+
### Bug Fixes
68+
69+
* AuthData validation incorrectly triggered on unchanged providers ([#10025](https://github.com/parse-community/parse-server/issues/10025)) ([d3d6e9e](https://github.com/parse-community/parse-server/commit/d3d6e9e22a212885690853cbbb84bb8c53da5646))
70+
71+
## [9.2.1-alpha.1](https://github.com/parse-community/parse-server/compare/9.2.0...9.2.1-alpha.1) (2026-02-06)
72+
73+
74+
### Bug Fixes
75+
76+
* Default HTML pages for password reset, email verification not found ([#10034](https://github.com/parse-community/parse-server/issues/10034)) ([e299107](https://github.com/parse-community/parse-server/commit/e29910764daef3c03ed1b09eee19cedc3b12a86a))
77+
178
# [9.2.0-alpha.5](https://github.com/parse-community/parse-server/compare/9.2.0-alpha.4...9.2.0-alpha.5) (2026-02-05)
279

380

ci/CiVersionCheck.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
const core = require('@actions/core');
21
const semver = require('semver');
32
const yaml = require('yaml');
43
const fs = require('fs').promises;
@@ -220,6 +219,7 @@ class CiVersionCheck {
220219
* Runs the check.
221220
*/
222221
async check() {
222+
const core = await import('@actions/core');
223223
/* eslint-disable no-console */
224224
try {
225225
console.log(`\nChecking ${this.packageName} versions in CI environments...`);

ci/definitionsCheck.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
const fs = require('fs').promises;
22
const { exec } = require('child_process');
3-
const core = require('@actions/core');
43
const util = require('util');
54
(async () => {
5+
const core = await import('@actions/core');
66
const [currentDefinitions, currentDocs] = await Promise.all([
77
fs.readFile('./src/Options/Definitions.js', 'utf8'),
88
fs.readFile('./src/Options/docs.js', 'utf8'),

ci/nodeEngineCheck.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
const core = require('@actions/core');
21
const semver = require('semver');
32
const fs = require('fs').promises;
43
const path = require('path');
4+
let core;
55

66
/**
77
* This checks whether any package dependency requires a minimum node engine
@@ -137,6 +137,7 @@ class NodeEngineCheck {
137137
}
138138

139139
async function check() {
140+
core = await import('@actions/core');
140141
// Define paths
141142
const nodeModulesPath = path.join(__dirname, '../node_modules');
142143
const packageJsonPath = path.join(__dirname, '../package.json');

0 commit comments

Comments
 (0)