@beiguancyc/parse-server 9.9.0-ruixiang.1
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/LICENSE +176 -0
- package/NOTICE +10 -0
- package/README.md +1311 -0
- package/bin/parse-live-query-server +3 -0
- package/bin/parse-server +3 -0
- package/lib/AccountLockout.js +149 -0
- package/lib/Adapters/AdapterLoader.js +60 -0
- package/lib/Adapters/Analytics/AnalyticsAdapter.js +32 -0
- package/lib/Adapters/Auth/AuthAdapter.js +132 -0
- package/lib/Adapters/Auth/BaseCodeAuthAdapter.js +119 -0
- package/lib/Adapters/Auth/OAuth1Client.js +204 -0
- package/lib/Adapters/Auth/apple.js +125 -0
- package/lib/Adapters/Auth/facebook.js +187 -0
- package/lib/Adapters/Auth/gcenter.js +217 -0
- package/lib/Adapters/Auth/github.js +125 -0
- package/lib/Adapters/Auth/google.js +122 -0
- package/lib/Adapters/Auth/gpgames.js +125 -0
- package/lib/Adapters/Auth/httpsRequest.js +41 -0
- package/lib/Adapters/Auth/index.js +248 -0
- package/lib/Adapters/Auth/instagram.js +118 -0
- package/lib/Adapters/Auth/janraincapture.js +85 -0
- package/lib/Adapters/Auth/janrainengage.js +57 -0
- package/lib/Adapters/Auth/keycloak.js +168 -0
- package/lib/Adapters/Auth/ldap.js +193 -0
- package/lib/Adapters/Auth/line.js +125 -0
- package/lib/Adapters/Auth/linkedin.js +117 -0
- package/lib/Adapters/Auth/meetup.js +44 -0
- package/lib/Adapters/Auth/mfa.js +334 -0
- package/lib/Adapters/Auth/microsoft.js +111 -0
- package/lib/Adapters/Auth/oauth2.js +115 -0
- package/lib/Adapters/Auth/phantauth.js +53 -0
- package/lib/Adapters/Auth/qq.js +113 -0
- package/lib/Adapters/Auth/spotify.js +115 -0
- package/lib/Adapters/Auth/twitter.js +197 -0
- package/lib/Adapters/Auth/utils.js +28 -0
- package/lib/Adapters/Auth/vkontakte.js +55 -0
- package/lib/Adapters/Auth/wechat.js +110 -0
- package/lib/Adapters/Auth/weibo.js +141 -0
- package/lib/Adapters/Cache/CacheAdapter.js +40 -0
- package/lib/Adapters/Cache/InMemoryCache.js +61 -0
- package/lib/Adapters/Cache/InMemoryCacheAdapter.js +34 -0
- package/lib/Adapters/Cache/LRUCache.js +35 -0
- package/lib/Adapters/Cache/NullCacheAdapter.js +26 -0
- package/lib/Adapters/Cache/RedisCacheAdapter.js +109 -0
- package/lib/Adapters/Cache/SchemaCache.js +25 -0
- package/lib/Adapters/Email/MailAdapter.js +32 -0
- package/lib/Adapters/Files/FilesAdapter.js +129 -0
- package/lib/Adapters/Files/GridFSBucketAdapter.js +280 -0
- package/lib/Adapters/Files/GridStoreAdapter.js +5 -0
- package/lib/Adapters/Logger/LoggerAdapter.js +27 -0
- package/lib/Adapters/Logger/WinstonLogger.js +107 -0
- package/lib/Adapters/Logger/WinstonLoggerAdapter.js +63 -0
- package/lib/Adapters/MessageQueue/EventEmitterMQ.js +55 -0
- package/lib/Adapters/PubSub/EventEmitterPubSub.js +53 -0
- package/lib/Adapters/PubSub/PubSubAdapter.js +34 -0
- package/lib/Adapters/PubSub/RedisPubSub.js +49 -0
- package/lib/Adapters/Push/PushAdapter.js +40 -0
- package/lib/Adapters/Storage/Mongo/MongoCollection.js +212 -0
- package/lib/Adapters/Storage/Mongo/MongoSchemaCollection.js +334 -0
- package/lib/Adapters/Storage/Mongo/MongoStorageAdapter.js +1047 -0
- package/lib/Adapters/Storage/Mongo/MongoTransform.js +1397 -0
- package/lib/Adapters/Storage/Postgres/PostgresClient.js +38 -0
- package/lib/Adapters/Storage/Postgres/PostgresConfigParser.js +73 -0
- package/lib/Adapters/Storage/Postgres/PostgresStorageAdapter.js +2409 -0
- package/lib/Adapters/Storage/Postgres/sql/array/add-unique.sql +11 -0
- package/lib/Adapters/Storage/Postgres/sql/array/add.sql +11 -0
- package/lib/Adapters/Storage/Postgres/sql/array/contains-all-regex.sql +14 -0
- package/lib/Adapters/Storage/Postgres/sql/array/contains-all.sql +14 -0
- package/lib/Adapters/Storage/Postgres/sql/array/contains.sql +11 -0
- package/lib/Adapters/Storage/Postgres/sql/array/remove.sql +11 -0
- package/lib/Adapters/Storage/Postgres/sql/index.js +32 -0
- package/lib/Adapters/Storage/Postgres/sql/misc/json-object-set-keys.sql +19 -0
- package/lib/Adapters/Storage/StorageAdapter.js +2 -0
- package/lib/Adapters/WebSocketServer/WSAdapter.js +35 -0
- package/lib/Adapters/WebSocketServer/WSSAdapter.js +66 -0
- package/lib/Auth.js +687 -0
- package/lib/AuthDataLock.js +53 -0
- package/lib/ClientSDK.js +39 -0
- package/lib/Config.js +879 -0
- package/lib/Controllers/AdaptableController.js +72 -0
- package/lib/Controllers/AnalyticsController.js +43 -0
- package/lib/Controllers/CacheController.js +71 -0
- package/lib/Controllers/DatabaseController.js +1685 -0
- package/lib/Controllers/FilesController.js +122 -0
- package/lib/Controllers/HooksController.js +254 -0
- package/lib/Controllers/LiveQueryController.js +72 -0
- package/lib/Controllers/LoggerController.js +222 -0
- package/lib/Controllers/ParseGraphQLController.js +294 -0
- package/lib/Controllers/PushController.js +224 -0
- package/lib/Controllers/SchemaController.js +1563 -0
- package/lib/Controllers/UserController.js +364 -0
- package/lib/Controllers/index.js +251 -0
- package/lib/Controllers/types.js +2 -0
- package/lib/Deprecator/Deprecations.js +100 -0
- package/lib/Deprecator/Deprecator.js +140 -0
- package/lib/Error.js +50 -0
- package/lib/FileUrlValidator.js +69 -0
- package/lib/GraphQL/ParseGraphQLSchema.js +375 -0
- package/lib/GraphQL/ParseGraphQLServer.js +241 -0
- package/lib/GraphQL/helpers/objectsMutations.js +30 -0
- package/lib/GraphQL/helpers/objectsQueries.js +246 -0
- package/lib/GraphQL/helpers/queryComplexity.js +138 -0
- package/lib/GraphQL/loaders/configMutations.js +87 -0
- package/lib/GraphQL/loaders/configQueries.js +79 -0
- package/lib/GraphQL/loaders/defaultGraphQLMutations.js +21 -0
- package/lib/GraphQL/loaders/defaultGraphQLQueries.js +23 -0
- package/lib/GraphQL/loaders/defaultGraphQLTypes.js +1099 -0
- package/lib/GraphQL/loaders/defaultRelaySchema.js +53 -0
- package/lib/GraphQL/loaders/filesMutations.js +107 -0
- package/lib/GraphQL/loaders/functionsMutations.js +77 -0
- package/lib/GraphQL/loaders/parseClassMutations.js +267 -0
- package/lib/GraphQL/loaders/parseClassQueries.js +126 -0
- package/lib/GraphQL/loaders/parseClassTypes.js +493 -0
- package/lib/GraphQL/loaders/schemaDirectives.js +62 -0
- package/lib/GraphQL/loaders/schemaMutations.js +161 -0
- package/lib/GraphQL/loaders/schemaQueries.js +80 -0
- package/lib/GraphQL/loaders/schemaTypes.js +341 -0
- package/lib/GraphQL/loaders/usersMutations.js +433 -0
- package/lib/GraphQL/loaders/usersQueries.js +90 -0
- package/lib/GraphQL/parseGraphQLUtils.js +71 -0
- package/lib/GraphQL/transformers/className.js +14 -0
- package/lib/GraphQL/transformers/constraintType.js +53 -0
- package/lib/GraphQL/transformers/inputType.js +51 -0
- package/lib/GraphQL/transformers/mutation.js +280 -0
- package/lib/GraphQL/transformers/outputType.js +51 -0
- package/lib/GraphQL/transformers/query.js +237 -0
- package/lib/GraphQL/transformers/schemaFields.js +99 -0
- package/lib/InstallationDedup.js +178 -0
- package/lib/KeyPromiseQueue.js +48 -0
- package/lib/LiveQuery/Client.js +90 -0
- package/lib/LiveQuery/Id.js +20 -0
- package/lib/LiveQuery/ParseCloudCodePublisher.js +54 -0
- package/lib/LiveQuery/ParseLiveQueryServer.js +1071 -0
- package/lib/LiveQuery/ParsePubSub.js +37 -0
- package/lib/LiveQuery/ParseWebSocketServer.js +66 -0
- package/lib/LiveQuery/QueryTools.js +443 -0
- package/lib/LiveQuery/RequestSchema.js +161 -0
- package/lib/LiveQuery/SessionTokenCache.js +51 -0
- package/lib/LiveQuery/Subscription.js +47 -0
- package/lib/LiveQuery/equalObjects.js +50 -0
- package/lib/Options/Definitions.js +1599 -0
- package/lib/Options/docs.js +389 -0
- package/lib/Options/index.js +12 -0
- package/lib/Options/parsers.js +89 -0
- package/lib/Page.js +44 -0
- package/lib/ParseMessageQueue.js +24 -0
- package/lib/ParseServer.js +632 -0
- package/lib/ParseServerRESTController.js +173 -0
- package/lib/PromiseRouter.js +208 -0
- package/lib/Push/PushQueue.js +67 -0
- package/lib/Push/PushWorker.js +101 -0
- package/lib/Push/utils.js +129 -0
- package/lib/RestQuery.js +1208 -0
- package/lib/RestWrite.js +1671 -0
- package/lib/Routers/AggregateRouter.js +150 -0
- package/lib/Routers/AnalyticsRouter.js +26 -0
- package/lib/Routers/AudiencesRouter.js +54 -0
- package/lib/Routers/ClassesRouter.js +191 -0
- package/lib/Routers/CloudCodeRouter.js +87 -0
- package/lib/Routers/FeaturesRouter.js +72 -0
- package/lib/Routers/FilesRouter.js +772 -0
- package/lib/Routers/FunctionsRouter.js +341 -0
- package/lib/Routers/GlobalConfigRouter.js +123 -0
- package/lib/Routers/GraphQLRouter.js +41 -0
- package/lib/Routers/HooksRouter.js +121 -0
- package/lib/Routers/IAPValidationRouter.js +113 -0
- package/lib/Routers/InstallationsRouter.js +46 -0
- package/lib/Routers/LogsRouter.js +57 -0
- package/lib/Routers/PagesRouter.js +676 -0
- package/lib/Routers/PurgeRouter.js +45 -0
- package/lib/Routers/PushRouter.js +75 -0
- package/lib/Routers/RolesRouter.js +33 -0
- package/lib/Routers/SchemasRouter.js +118 -0
- package/lib/Routers/SecurityRouter.js +34 -0
- package/lib/Routers/SessionsRouter.js +126 -0
- package/lib/Routers/UsersRouter.js +733 -0
- package/lib/SchemaMigrations/DefinedSchemas.js +379 -0
- package/lib/SchemaMigrations/Migrations.js +30 -0
- package/lib/Security/Check.js +109 -0
- package/lib/Security/CheckGroup.js +44 -0
- package/lib/Security/CheckGroups/CheckGroupDatabase.js +44 -0
- package/lib/Security/CheckGroups/CheckGroupServerConfig.js +160 -0
- package/lib/Security/CheckGroups/CheckGroups.js +21 -0
- package/lib/Security/CheckRunner.js +213 -0
- package/lib/SharedRest.js +34 -0
- package/lib/StatusHandler.js +329 -0
- package/lib/TestUtils.js +87 -0
- package/lib/Utils.js +577 -0
- package/lib/batch.js +185 -0
- package/lib/cache.js +12 -0
- package/lib/cli/definitions/parse-live-query-server.js +9 -0
- package/lib/cli/definitions/parse-server.js +9 -0
- package/lib/cli/parse-live-query-server.js +14 -0
- package/lib/cli/parse-server.js +101 -0
- package/lib/cli/utils/commander.js +132 -0
- package/lib/cli/utils/runner.js +53 -0
- package/lib/cloud-code/Parse.Cloud.js +797 -0
- package/lib/cloud-code/Parse.Server.js +21 -0
- package/lib/cryptoUtils.js +54 -0
- package/lib/defaults.js +58 -0
- package/lib/deprecated.js +12 -0
- package/lib/index.js +89 -0
- package/lib/logger.js +40 -0
- package/lib/middlewares.js +810 -0
- package/lib/password.js +40 -0
- package/lib/request.js +175 -0
- package/lib/requiredParameter.js +11 -0
- package/lib/rest.js +264 -0
- package/lib/triggers.js +949 -0
- package/lib/vendor/README.md +8 -0
- package/lib/vendor/mongodbUrl.js +1012 -0
- package/package.json +172 -0
- package/postinstall.js +38 -0
- package/public/custom_json.html +17 -0
- package/public/custom_json.json +23 -0
- package/public/custom_page.html +15 -0
- package/public/de/email_verification_link_expired.html +24 -0
- package/public/de/email_verification_link_invalid.html +21 -0
- package/public/de/email_verification_send_fail.html +21 -0
- package/public/de/email_verification_send_success.html +19 -0
- package/public/de/email_verification_success.html +18 -0
- package/public/de/password_reset.html +65 -0
- package/public/de/password_reset_link_invalid.html +19 -0
- package/public/de/password_reset_success.html +18 -0
- package/public/de-AT/email_verification_link_expired.html +24 -0
- package/public/de-AT/email_verification_link_invalid.html +21 -0
- package/public/de-AT/email_verification_send_fail.html +21 -0
- package/public/de-AT/email_verification_send_success.html +19 -0
- package/public/de-AT/email_verification_success.html +18 -0
- package/public/de-AT/password_reset.html +65 -0
- package/public/de-AT/password_reset_link_invalid.html +19 -0
- package/public/de-AT/password_reset_success.html +18 -0
- package/public/email_verification_link_expired.html +24 -0
- package/public/email_verification_link_invalid.html +21 -0
- package/public/email_verification_send_fail.html +21 -0
- package/public/email_verification_send_success.html +19 -0
- package/public/email_verification_success.html +18 -0
- package/public/password_reset.html +65 -0
- package/public/password_reset_link_invalid.html +19 -0
- package/public/password_reset_success.html +18 -0
- package/types/@types/@parse/fs-files-adapter/index.d.ts +5 -0
- package/types/@types/deepcopy/index.d.ts +5 -0
- package/types/LiveQuery/ParseLiveQueryServer.d.ts +40 -0
- package/types/Options/index.d.ts +320 -0
- package/types/ParseServer.d.ts +65 -0
- package/types/eslint.config.mjs +30 -0
- package/types/index.d.ts +21 -0
- package/types/logger.d.ts +2 -0
- package/types/tests.ts +44 -0
- package/types/tsconfig.json +24 -0
- package/views/choose_password +215 -0
|
@@ -0,0 +1,341 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.FunctionsRouter = void 0;
|
|
7
|
+
var _PromiseRouter = _interopRequireDefault(require("../PromiseRouter"));
|
|
8
|
+
var _middlewares = require("../middlewares");
|
|
9
|
+
var _StatusHandler = require("../StatusHandler");
|
|
10
|
+
var _lodash = _interopRequireDefault(require("lodash"));
|
|
11
|
+
var _logger = require("../logger");
|
|
12
|
+
var _Error = require("../Error");
|
|
13
|
+
var _busboy = _interopRequireDefault(require("@fastify/busboy"));
|
|
14
|
+
var _Utils = _interopRequireDefault(require("../Utils"));
|
|
15
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
16
|
+
// FunctionsRouter.js
|
|
17
|
+
|
|
18
|
+
var Parse = require('parse/node').Parse,
|
|
19
|
+
triggers = require('../triggers');
|
|
20
|
+
function redactBuffers(obj) {
|
|
21
|
+
if (Buffer.isBuffer(obj)) {
|
|
22
|
+
return `[Buffer: ${obj.length} bytes]`;
|
|
23
|
+
}
|
|
24
|
+
if (Array.isArray(obj)) {
|
|
25
|
+
return obj.map(redactBuffers);
|
|
26
|
+
}
|
|
27
|
+
if (obj && typeof obj === 'object') {
|
|
28
|
+
const result = {};
|
|
29
|
+
for (const key of Object.keys(obj)) {
|
|
30
|
+
result[key] = redactBuffers(obj[key]);
|
|
31
|
+
}
|
|
32
|
+
return result;
|
|
33
|
+
}
|
|
34
|
+
return obj;
|
|
35
|
+
}
|
|
36
|
+
function parseObject(obj, config) {
|
|
37
|
+
if (Array.isArray(obj)) {
|
|
38
|
+
return obj.map(item => {
|
|
39
|
+
return parseObject(item, config);
|
|
40
|
+
});
|
|
41
|
+
} else if (obj && obj.__type == 'Date') {
|
|
42
|
+
return Object.assign(new Date(obj.iso), obj);
|
|
43
|
+
} else if (obj && obj.__type == 'File') {
|
|
44
|
+
if (obj.url) {
|
|
45
|
+
const {
|
|
46
|
+
validateFileUrl
|
|
47
|
+
} = require('../FileUrlValidator');
|
|
48
|
+
validateFileUrl(obj.url, config);
|
|
49
|
+
}
|
|
50
|
+
return Parse.File.fromJSON(obj);
|
|
51
|
+
} else if (obj && obj.__type == 'Pointer') {
|
|
52
|
+
return Parse.Object.fromJSON({
|
|
53
|
+
__type: 'Pointer',
|
|
54
|
+
className: obj.className,
|
|
55
|
+
objectId: obj.objectId
|
|
56
|
+
});
|
|
57
|
+
} else if (Buffer.isBuffer(obj)) {
|
|
58
|
+
return obj;
|
|
59
|
+
} else if (obj && typeof obj === 'object') {
|
|
60
|
+
return parseParams(obj, config);
|
|
61
|
+
} else {
|
|
62
|
+
return obj;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
function parseParams(params, config) {
|
|
66
|
+
return _lodash.default.mapValues(params, item => parseObject(item, config));
|
|
67
|
+
}
|
|
68
|
+
class FunctionsRouter extends _PromiseRouter.default {
|
|
69
|
+
mountRoutes() {
|
|
70
|
+
this.route('POST', '/functions/:functionName', _middlewares.promiseEnsureIdempotency, FunctionsRouter.multipartMiddleware, FunctionsRouter.handleCloudFunction);
|
|
71
|
+
this.route('POST', '/jobs/:jobName', _middlewares.promiseEnsureIdempotency, _middlewares.promiseEnforceMasterKeyAccess, function (req) {
|
|
72
|
+
return FunctionsRouter.handleCloudJob(req);
|
|
73
|
+
});
|
|
74
|
+
this.route('POST', '/jobs', _middlewares.promiseEnforceMasterKeyAccess, function (req) {
|
|
75
|
+
return FunctionsRouter.handleCloudJob(req);
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
static handleCloudJob(req) {
|
|
79
|
+
if (req.auth.isReadOnly) {
|
|
80
|
+
throw (0, _Error.createSanitizedError)(Parse.Error.OPERATION_FORBIDDEN, "read-only masterKey isn't allowed to run a job.", req.config);
|
|
81
|
+
}
|
|
82
|
+
const jobName = req.params.jobName || req.body?.jobName;
|
|
83
|
+
const applicationId = req.config.applicationId;
|
|
84
|
+
const jobHandler = (0, _StatusHandler.jobStatusHandler)(req.config);
|
|
85
|
+
const jobFunction = triggers.getJob(jobName, applicationId);
|
|
86
|
+
if (!jobFunction) {
|
|
87
|
+
throw new Parse.Error(Parse.Error.SCRIPT_FAILED, 'Invalid job.');
|
|
88
|
+
}
|
|
89
|
+
let params = Object.assign({}, req.body, req.query);
|
|
90
|
+
params = parseParams(params, req.config);
|
|
91
|
+
const request = {
|
|
92
|
+
params: params,
|
|
93
|
+
log: req.config.loggerController,
|
|
94
|
+
headers: req.config.headers,
|
|
95
|
+
ip: req.config.ip,
|
|
96
|
+
jobName,
|
|
97
|
+
config: req.config,
|
|
98
|
+
message: jobHandler.setMessage.bind(jobHandler)
|
|
99
|
+
};
|
|
100
|
+
return jobHandler.setRunning(jobName).then(jobStatus => {
|
|
101
|
+
request.jobId = jobStatus.objectId;
|
|
102
|
+
// run the function async
|
|
103
|
+
process.nextTick(() => {
|
|
104
|
+
Promise.resolve().then(() => {
|
|
105
|
+
return jobFunction(request);
|
|
106
|
+
}).then(result => {
|
|
107
|
+
jobHandler.setSucceeded(result);
|
|
108
|
+
}, error => {
|
|
109
|
+
jobHandler.setFailed(error);
|
|
110
|
+
});
|
|
111
|
+
});
|
|
112
|
+
return {
|
|
113
|
+
headers: {
|
|
114
|
+
'X-Parse-Job-Status-Id': jobStatus.objectId
|
|
115
|
+
},
|
|
116
|
+
response: {}
|
|
117
|
+
};
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
static createResponseObject(resolve, reject, statusCode = null) {
|
|
121
|
+
let httpStatusCode = statusCode;
|
|
122
|
+
const customHeaders = {};
|
|
123
|
+
let responseSent = false;
|
|
124
|
+
const responseObject = {
|
|
125
|
+
success: function (result) {
|
|
126
|
+
if (responseSent) {
|
|
127
|
+
throw new Error('Cannot call success() after response has already been sent. Make sure to call success() or error() only once per cloud function execution.');
|
|
128
|
+
}
|
|
129
|
+
responseSent = true;
|
|
130
|
+
const response = {
|
|
131
|
+
response: {
|
|
132
|
+
result: Parse._encode(result)
|
|
133
|
+
}
|
|
134
|
+
};
|
|
135
|
+
if (httpStatusCode !== null) {
|
|
136
|
+
response.status = httpStatusCode;
|
|
137
|
+
}
|
|
138
|
+
if (Object.keys(customHeaders).length > 0) {
|
|
139
|
+
response.headers = customHeaders;
|
|
140
|
+
}
|
|
141
|
+
resolve(response);
|
|
142
|
+
},
|
|
143
|
+
error: function (message) {
|
|
144
|
+
if (responseSent) {
|
|
145
|
+
throw new Error('Cannot call error() after response has already been sent. Make sure to call success() or error() only once per cloud function execution.');
|
|
146
|
+
}
|
|
147
|
+
responseSent = true;
|
|
148
|
+
const error = triggers.resolveError(message);
|
|
149
|
+
// If a custom status code was set, attach it to the error
|
|
150
|
+
if (httpStatusCode !== null) {
|
|
151
|
+
error.status = httpStatusCode;
|
|
152
|
+
}
|
|
153
|
+
reject(error);
|
|
154
|
+
},
|
|
155
|
+
status: function (code) {
|
|
156
|
+
httpStatusCode = code;
|
|
157
|
+
return responseObject;
|
|
158
|
+
},
|
|
159
|
+
header: function (key, value) {
|
|
160
|
+
customHeaders[key] = value;
|
|
161
|
+
return responseObject;
|
|
162
|
+
},
|
|
163
|
+
_isResponseSent: () => responseSent
|
|
164
|
+
};
|
|
165
|
+
return responseObject;
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
/**
|
|
169
|
+
* Parses multipart/form-data requests for Cloud Function invocation.
|
|
170
|
+
* For non-multipart requests, this is a no-op.
|
|
171
|
+
*
|
|
172
|
+
* Text fields are set as strings in `req.body`. File fields are set as
|
|
173
|
+
* objects with the shape `{ filename: string, contentType: string, data: Buffer }`.
|
|
174
|
+
* All fields are merged flat into `req.body`; the caller is responsible for
|
|
175
|
+
* avoiding name collisions between text and file fields.
|
|
176
|
+
*
|
|
177
|
+
* The total request size is limited by the server's `maxUploadSize` option.
|
|
178
|
+
*/
|
|
179
|
+
static multipartMiddleware(req) {
|
|
180
|
+
if (!req.is || !req.is('multipart/form-data')) {
|
|
181
|
+
return Promise.resolve();
|
|
182
|
+
}
|
|
183
|
+
const maxBytes = _Utils.default.parseSizeToBytes(req.config.maxUploadSize);
|
|
184
|
+
return new Promise((resolve, reject) => {
|
|
185
|
+
const fields = Object.create(null);
|
|
186
|
+
let totalBytes = 0;
|
|
187
|
+
let settled = false;
|
|
188
|
+
let busboy;
|
|
189
|
+
try {
|
|
190
|
+
busboy = (0, _busboy.default)({
|
|
191
|
+
headers: req.headers,
|
|
192
|
+
limits: {
|
|
193
|
+
fieldSize: maxBytes
|
|
194
|
+
}
|
|
195
|
+
});
|
|
196
|
+
} catch (err) {
|
|
197
|
+
return reject(new Parse.Error(Parse.Error.INVALID_JSON, `Invalid multipart request: ${err.message}`));
|
|
198
|
+
}
|
|
199
|
+
const safeReject = err => {
|
|
200
|
+
if (settled) {
|
|
201
|
+
return;
|
|
202
|
+
}
|
|
203
|
+
settled = true;
|
|
204
|
+
busboy.destroy();
|
|
205
|
+
reject(err);
|
|
206
|
+
};
|
|
207
|
+
busboy.on('field', (name, value, fieldnameTruncated, valueTruncated) => {
|
|
208
|
+
if (valueTruncated) {
|
|
209
|
+
return safeReject(new Parse.Error(Parse.Error.OBJECT_TOO_LARGE, 'Multipart request exceeds maximum upload size.'));
|
|
210
|
+
}
|
|
211
|
+
totalBytes += Buffer.byteLength(value);
|
|
212
|
+
if (totalBytes > maxBytes) {
|
|
213
|
+
return safeReject(new Parse.Error(Parse.Error.OBJECT_TOO_LARGE, 'Multipart request exceeds maximum upload size.'));
|
|
214
|
+
}
|
|
215
|
+
fields[name] = value;
|
|
216
|
+
});
|
|
217
|
+
busboy.on('file', (name, stream, filename, transferEncoding, mimeType) => {
|
|
218
|
+
const chunks = [];
|
|
219
|
+
stream.on('data', chunk => {
|
|
220
|
+
totalBytes += chunk.length;
|
|
221
|
+
if (totalBytes > maxBytes) {
|
|
222
|
+
stream.destroy();
|
|
223
|
+
return safeReject(new Parse.Error(Parse.Error.OBJECT_TOO_LARGE, 'Multipart request exceeds maximum upload size.'));
|
|
224
|
+
}
|
|
225
|
+
chunks.push(chunk);
|
|
226
|
+
});
|
|
227
|
+
stream.on('end', () => {
|
|
228
|
+
if (settled) {
|
|
229
|
+
return;
|
|
230
|
+
}
|
|
231
|
+
fields[name] = {
|
|
232
|
+
filename,
|
|
233
|
+
contentType: mimeType || 'application/octet-stream',
|
|
234
|
+
data: Buffer.concat(chunks)
|
|
235
|
+
};
|
|
236
|
+
});
|
|
237
|
+
});
|
|
238
|
+
busboy.on('finish', () => {
|
|
239
|
+
if (settled) {
|
|
240
|
+
return;
|
|
241
|
+
}
|
|
242
|
+
settled = true;
|
|
243
|
+
req.body = fields;
|
|
244
|
+
resolve();
|
|
245
|
+
});
|
|
246
|
+
busboy.on('error', err => {
|
|
247
|
+
safeReject(new Parse.Error(Parse.Error.INVALID_JSON, `Invalid multipart request: ${err.message}`));
|
|
248
|
+
});
|
|
249
|
+
req.pipe(busboy);
|
|
250
|
+
});
|
|
251
|
+
}
|
|
252
|
+
static handleCloudFunction(req) {
|
|
253
|
+
const functionName = req.params.functionName;
|
|
254
|
+
const applicationId = req.config.applicationId;
|
|
255
|
+
const theFunction = triggers.getFunction(functionName, applicationId);
|
|
256
|
+
if (!theFunction) {
|
|
257
|
+
throw new Parse.Error(Parse.Error.SCRIPT_FAILED, `Invalid function: "${functionName}"`);
|
|
258
|
+
}
|
|
259
|
+
let params = Object.assign({}, req.body, req.query);
|
|
260
|
+
params = parseParams(params, req.config);
|
|
261
|
+
const request = {
|
|
262
|
+
params: params,
|
|
263
|
+
config: req.config,
|
|
264
|
+
master: req.auth && req.auth.isMaster,
|
|
265
|
+
isReadOnly: !!(req.auth && req.auth.isReadOnly),
|
|
266
|
+
user: req.auth && req.auth.user,
|
|
267
|
+
installationId: req.info.installationId,
|
|
268
|
+
log: req.config.loggerController,
|
|
269
|
+
headers: req.config.headers,
|
|
270
|
+
ip: req.config.ip,
|
|
271
|
+
functionName,
|
|
272
|
+
context: req.info.context
|
|
273
|
+
};
|
|
274
|
+
return new Promise(function (resolve, reject) {
|
|
275
|
+
const userString = req.auth && req.auth.user ? req.auth.user.id : undefined;
|
|
276
|
+
const responseObject = FunctionsRouter.createResponseObject(result => {
|
|
277
|
+
try {
|
|
278
|
+
if (req.config.logLevels.cloudFunctionSuccess !== 'silent') {
|
|
279
|
+
const cleanInput = _logger.logger.truncateLogMessage(JSON.stringify(redactBuffers(params)));
|
|
280
|
+
const cleanResult = _logger.logger.truncateLogMessage(JSON.stringify(result.response.result));
|
|
281
|
+
_logger.logger[req.config.logLevels.cloudFunctionSuccess](`Ran cloud function ${functionName} for user ${userString} with:\n Input: ${cleanInput}\n Result: ${cleanResult}`, {
|
|
282
|
+
functionName,
|
|
283
|
+
params,
|
|
284
|
+
user: userString
|
|
285
|
+
});
|
|
286
|
+
}
|
|
287
|
+
resolve(result);
|
|
288
|
+
} catch (e) {
|
|
289
|
+
reject(e);
|
|
290
|
+
}
|
|
291
|
+
}, error => {
|
|
292
|
+
try {
|
|
293
|
+
if (req.config.logLevels.cloudFunctionError !== 'silent') {
|
|
294
|
+
const cleanInput = _logger.logger.truncateLogMessage(JSON.stringify(redactBuffers(params)));
|
|
295
|
+
_logger.logger[req.config.logLevels.cloudFunctionError](`Failed running cloud function ${functionName} for user ${userString} with:\n Input: ${cleanInput}\n Error: ` + JSON.stringify(error), {
|
|
296
|
+
functionName,
|
|
297
|
+
error,
|
|
298
|
+
params,
|
|
299
|
+
user: userString
|
|
300
|
+
});
|
|
301
|
+
}
|
|
302
|
+
reject(error);
|
|
303
|
+
} catch (e) {
|
|
304
|
+
reject(e);
|
|
305
|
+
}
|
|
306
|
+
});
|
|
307
|
+
const {
|
|
308
|
+
success,
|
|
309
|
+
error
|
|
310
|
+
} = responseObject;
|
|
311
|
+
return Promise.resolve().then(() => {
|
|
312
|
+
return triggers.maybeRunValidator(request, functionName, req.auth);
|
|
313
|
+
}).then(() => {
|
|
314
|
+
// Check if function expects 2 parameters (req, res) - Express style
|
|
315
|
+
if (theFunction.length >= 2) {
|
|
316
|
+
return theFunction(request, responseObject);
|
|
317
|
+
} else {
|
|
318
|
+
// Traditional style - single parameter
|
|
319
|
+
return theFunction(request);
|
|
320
|
+
}
|
|
321
|
+
}).then(result => {
|
|
322
|
+
// For Express-style functions, only send response if not already sent
|
|
323
|
+
if (theFunction.length >= 2) {
|
|
324
|
+
if (!responseObject._isResponseSent()) {
|
|
325
|
+
// If Express-style function returns a value without calling res.success/error
|
|
326
|
+
if (result !== undefined) {
|
|
327
|
+
success(result);
|
|
328
|
+
}
|
|
329
|
+
// If no response sent and no value returned, this is an error in user code
|
|
330
|
+
// but we don't handle it here to maintain backward compatibility
|
|
331
|
+
}
|
|
332
|
+
} else {
|
|
333
|
+
// For traditional functions, always call success with the result (even if undefined)
|
|
334
|
+
success(result);
|
|
335
|
+
}
|
|
336
|
+
}, error);
|
|
337
|
+
});
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
exports.FunctionsRouter = FunctionsRouter;
|
|
341
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfUHJvbWlzZVJvdXRlciIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJyZXF1aXJlIiwiX21pZGRsZXdhcmVzIiwiX1N0YXR1c0hhbmRsZXIiLCJfbG9kYXNoIiwiX2xvZ2dlciIsIl9FcnJvciIsIl9idXNib3kiLCJfVXRpbHMiLCJlIiwiX19lc01vZHVsZSIsImRlZmF1bHQiLCJQYXJzZSIsInRyaWdnZXJzIiwicmVkYWN0QnVmZmVycyIsIm9iaiIsIkJ1ZmZlciIsImlzQnVmZmVyIiwibGVuZ3RoIiwiQXJyYXkiLCJpc0FycmF5IiwibWFwIiwicmVzdWx0Iiwia2V5IiwiT2JqZWN0Iiwia2V5cyIsInBhcnNlT2JqZWN0IiwiY29uZmlnIiwiaXRlbSIsIl9fdHlwZSIsImFzc2lnbiIsIkRhdGUiLCJpc28iLCJ1cmwiLCJ2YWxpZGF0ZUZpbGVVcmwiLCJGaWxlIiwiZnJvbUpTT04iLCJjbGFzc05hbWUiLCJvYmplY3RJZCIsInBhcnNlUGFyYW1zIiwicGFyYW1zIiwiXyIsIm1hcFZhbHVlcyIsIkZ1bmN0aW9uc1JvdXRlciIsIlByb21pc2VSb3V0ZXIiLCJtb3VudFJvdXRlcyIsInJvdXRlIiwicHJvbWlzZUVuc3VyZUlkZW1wb3RlbmN5IiwibXVsdGlwYXJ0TWlkZGxld2FyZSIsImhhbmRsZUNsb3VkRnVuY3Rpb24iLCJwcm9taXNlRW5mb3JjZU1hc3RlcktleUFjY2VzcyIsInJlcSIsImhhbmRsZUNsb3VkSm9iIiwiYXV0aCIsImlzUmVhZE9ubHkiLCJjcmVhdGVTYW5pdGl6ZWRFcnJvciIsIkVycm9yIiwiT1BFUkFUSU9OX0ZPUkJJRERFTiIsImpvYk5hbWUiLCJib2R5IiwiYXBwbGljYXRpb25JZCIsImpvYkhhbmRsZXIiLCJqb2JTdGF0dXNIYW5kbGVyIiwiam9iRnVuY3Rpb24iLCJnZXRKb2IiLCJTQ1JJUFRfRkFJTEVEIiwicXVlcnkiLCJyZXF1ZXN0IiwibG9nIiwibG9nZ2VyQ29udHJvbGxlciIsImhlYWRlcnMiLCJpcCIsIm1lc3NhZ2UiLCJzZXRNZXNzYWdlIiwiYmluZCIsInNldFJ1bm5pbmciLCJ0aGVuIiwiam9iU3RhdHVzIiwiam9iSWQiLCJwcm9jZXNzIiwibmV4dFRpY2siLCJQcm9taXNlIiwicmVzb2x2ZSIsInNldFN1Y2NlZWRlZCIsImVycm9yIiwic2V0RmFpbGVkIiwicmVzcG9uc2UiLCJjcmVhdGVSZXNwb25zZU9iamVjdCIsInJlamVjdCIsInN0YXR1c0NvZGUiLCJodHRwU3RhdHVzQ29kZSIsImN1c3RvbUhlYWRlcnMiLCJyZXNwb25zZVNlbnQiLCJyZXNwb25zZU9iamVjdCIsInN1Y2Nlc3MiLCJfZW5jb2RlIiwic3RhdHVzIiwicmVzb2x2ZUVycm9yIiwiY29kZSIsImhlYWRlciIsInZhbHVlIiwiX2lzUmVzcG9uc2VTZW50IiwiaXMiLCJtYXhCeXRlcyIsIlV0aWxzIiwicGFyc2VTaXplVG9CeXRlcyIsIm1heFVwbG9hZFNpemUiLCJmaWVsZHMiLCJjcmVhdGUiLCJ0b3RhbEJ5dGVzIiwic2V0dGxlZCIsImJ1c2JveSIsIkJ1c2JveSIsImxpbWl0cyIsImZpZWxkU2l6ZSIsImVyciIsIklOVkFMSURfSlNPTiIsInNhZmVSZWplY3QiLCJkZXN0cm95Iiwib24iLCJuYW1lIiwiZmllbGRuYW1lVHJ1bmNhdGVkIiwidmFsdWVUcnVuY2F0ZWQiLCJPQkpFQ1RfVE9PX0xBUkdFIiwiYnl0ZUxlbmd0aCIsInN0cmVhbSIsImZpbGVuYW1lIiwidHJhbnNmZXJFbmNvZGluZyIsIm1pbWVUeXBlIiwiY2h1bmtzIiwiY2h1bmsiLCJwdXNoIiwiY29udGVudFR5cGUiLCJkYXRhIiwiY29uY2F0IiwicGlwZSIsImZ1bmN0aW9uTmFtZSIsInRoZUZ1bmN0aW9uIiwiZ2V0RnVuY3Rpb24iLCJtYXN0ZXIiLCJpc01hc3RlciIsInVzZXIiLCJpbnN0YWxsYXRpb25JZCIsImluZm8iLCJjb250ZXh0IiwidXNlclN0cmluZyIsImlkIiwidW5kZWZpbmVkIiwibG9nTGV2ZWxzIiwiY2xvdWRGdW5jdGlvblN1Y2Nlc3MiLCJjbGVhbklucHV0IiwibG9nZ2VyIiwidHJ1bmNhdGVMb2dNZXNzYWdlIiwiSlNPTiIsInN0cmluZ2lmeSIsImNsZWFuUmVzdWx0IiwiY2xvdWRGdW5jdGlvbkVycm9yIiwibWF5YmVSdW5WYWxpZGF0b3IiLCJleHBvcnRzIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL1JvdXRlcnMvRnVuY3Rpb25zUm91dGVyLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIEZ1bmN0aW9uc1JvdXRlci5qc1xuXG52YXIgUGFyc2UgPSByZXF1aXJlKCdwYXJzZS9ub2RlJykuUGFyc2UsXG4gIHRyaWdnZXJzID0gcmVxdWlyZSgnLi4vdHJpZ2dlcnMnKTtcblxuaW1wb3J0IFByb21pc2VSb3V0ZXIgZnJvbSAnLi4vUHJvbWlzZVJvdXRlcic7XG5pbXBvcnQgeyBwcm9taXNlRW5mb3JjZU1hc3RlcktleUFjY2VzcywgcHJvbWlzZUVuc3VyZUlkZW1wb3RlbmN5IH0gZnJvbSAnLi4vbWlkZGxld2FyZXMnO1xuaW1wb3J0IHsgam9iU3RhdHVzSGFuZGxlciB9IGZyb20gJy4uL1N0YXR1c0hhbmRsZXInO1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlcic7XG5pbXBvcnQgeyBjcmVhdGVTYW5pdGl6ZWRFcnJvciB9IGZyb20gJy4uL0Vycm9yJztcbmltcG9ydCBCdXNib3kgZnJvbSAnQGZhc3RpZnkvYnVzYm95JztcbmltcG9ydCBVdGlscyBmcm9tICcuLi9VdGlscyc7XG5cbmZ1bmN0aW9uIHJlZGFjdEJ1ZmZlcnMob2JqKSB7XG4gIGlmIChCdWZmZXIuaXNCdWZmZXIob2JqKSkge1xuICAgIHJldHVybiBgW0J1ZmZlcjogJHtvYmoubGVuZ3RofSBieXRlc11gO1xuICB9XG4gIGlmIChBcnJheS5pc0FycmF5KG9iaikpIHtcbiAgICByZXR1cm4gb2JqLm1hcChyZWRhY3RCdWZmZXJzKTtcbiAgfVxuICBpZiAob2JqICYmIHR5cGVvZiBvYmogPT09ICdvYmplY3QnKSB7XG4gICAgY29uc3QgcmVzdWx0ID0ge307XG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMob2JqKSkge1xuICAgICAgcmVzdWx0W2tleV0gPSByZWRhY3RCdWZmZXJzKG9ialtrZXldKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICByZXR1cm4gb2JqO1xufVxuXG5mdW5jdGlvbiBwYXJzZU9iamVjdChvYmosIGNvbmZpZykge1xuICBpZiAoQXJyYXkuaXNBcnJheShvYmopKSB7XG4gICAgcmV0dXJuIG9iai5tYXAoaXRlbSA9PiB7XG4gICAgICByZXR1cm4gcGFyc2VPYmplY3QoaXRlbSwgY29uZmlnKTtcbiAgICB9KTtcbiAgfSBlbHNlIGlmIChvYmogJiYgb2JqLl9fdHlwZSA9PSAnRGF0ZScpIHtcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihuZXcgRGF0ZShvYmouaXNvKSwgb2JqKTtcbiAgfSBlbHNlIGlmIChvYmogJiYgb2JqLl9fdHlwZSA9PSAnRmlsZScpIHtcbiAgICBpZiAob2JqLnVybCkge1xuICAgICAgY29uc3QgeyB2YWxpZGF0ZUZpbGVVcmwgfSA9IHJlcXVpcmUoJy4uL0ZpbGVVcmxWYWxpZGF0b3InKTtcbiAgICAgIHZhbGlkYXRlRmlsZVVybChvYmoudXJsLCBjb25maWcpO1xuICAgIH1cbiAgICByZXR1cm4gUGFyc2UuRmlsZS5mcm9tSlNPTihvYmopO1xuICB9IGVsc2UgaWYgKG9iaiAmJiBvYmouX190eXBlID09ICdQb2ludGVyJykge1xuICAgIHJldHVybiBQYXJzZS5PYmplY3QuZnJvbUpTT04oe1xuICAgICAgX190eXBlOiAnUG9pbnRlcicsXG4gICAgICBjbGFzc05hbWU6IG9iai5jbGFzc05hbWUsXG4gICAgICBvYmplY3RJZDogb2JqLm9iamVjdElkLFxuICAgIH0pO1xuICB9IGVsc2UgaWYgKEJ1ZmZlci5pc0J1ZmZlcihvYmopKSB7XG4gICAgcmV0dXJuIG9iajtcbiAgfSBlbHNlIGlmIChvYmogJiYgdHlwZW9mIG9iaiA9PT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gcGFyc2VQYXJhbXMob2JqLCBjb25maWcpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBvYmo7XG4gIH1cbn1cblxuZnVuY3Rpb24gcGFyc2VQYXJhbXMocGFyYW1zLCBjb25maWcpIHtcbiAgcmV0dXJuIF8ubWFwVmFsdWVzKHBhcmFtcywgaXRlbSA9PiBwYXJzZU9iamVjdChpdGVtLCBjb25maWcpKTtcbn1cblxuZXhwb3J0IGNsYXNzIEZ1bmN0aW9uc1JvdXRlciBleHRlbmRzIFByb21pc2VSb3V0ZXIge1xuICBtb3VudFJvdXRlcygpIHtcbiAgICB0aGlzLnJvdXRlKFxuICAgICAgJ1BPU1QnLFxuICAgICAgJy9mdW5jdGlvbnMvOmZ1bmN0aW9uTmFtZScsXG4gICAgICBwcm9taXNlRW5zdXJlSWRlbXBvdGVuY3ksXG4gICAgICBGdW5jdGlvbnNSb3V0ZXIubXVsdGlwYXJ0TWlkZGxld2FyZSxcbiAgICAgIEZ1bmN0aW9uc1JvdXRlci5oYW5kbGVDbG91ZEZ1bmN0aW9uXG4gICAgKTtcbiAgICB0aGlzLnJvdXRlKFxuICAgICAgJ1BPU1QnLFxuICAgICAgJy9qb2JzLzpqb2JOYW1lJyxcbiAgICAgIHByb21pc2VFbnN1cmVJZGVtcG90ZW5jeSxcbiAgICAgIHByb21pc2VFbmZvcmNlTWFzdGVyS2V5QWNjZXNzLFxuICAgICAgZnVuY3Rpb24gKHJlcSkge1xuICAgICAgICByZXR1cm4gRnVuY3Rpb25zUm91dGVyLmhhbmRsZUNsb3VkSm9iKHJlcSk7XG4gICAgICB9XG4gICAgKTtcbiAgICB0aGlzLnJvdXRlKCdQT1NUJywgJy9qb2JzJywgcHJvbWlzZUVuZm9yY2VNYXN0ZXJLZXlBY2Nlc3MsIGZ1bmN0aW9uIChyZXEpIHtcbiAgICAgIHJldHVybiBGdW5jdGlvbnNSb3V0ZXIuaGFuZGxlQ2xvdWRKb2IocmVxKTtcbiAgICB9KTtcbiAgfVxuXG4gIHN0YXRpYyBoYW5kbGVDbG91ZEpvYihyZXEpIHtcbiAgICBpZiAocmVxLmF1dGguaXNSZWFkT25seSkge1xuICAgICAgdGhyb3cgY3JlYXRlU2FuaXRpemVkRXJyb3IoXG4gICAgICAgIFBhcnNlLkVycm9yLk9QRVJBVElPTl9GT1JCSURERU4sXG4gICAgICAgIFwicmVhZC1vbmx5IG1hc3RlcktleSBpc24ndCBhbGxvd2VkIHRvIHJ1biBhIGpvYi5cIixcbiAgICAgICAgcmVxLmNvbmZpZ1xuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3Qgam9iTmFtZSA9IHJlcS5wYXJhbXMuam9iTmFtZSB8fCByZXEuYm9keT8uam9iTmFtZTtcbiAgICBjb25zdCBhcHBsaWNhdGlvbklkID0gcmVxLmNvbmZpZy5hcHBsaWNhdGlvbklkO1xuICAgIGNvbnN0IGpvYkhhbmRsZXIgPSBqb2JTdGF0dXNIYW5kbGVyKHJlcS5jb25maWcpO1xuICAgIGNvbnN0IGpvYkZ1bmN0aW9uID0gdHJpZ2dlcnMuZ2V0Sm9iKGpvYk5hbWUsIGFwcGxpY2F0aW9uSWQpO1xuICAgIGlmICgham9iRnVuY3Rpb24pIHtcbiAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5TQ1JJUFRfRkFJTEVELCAnSW52YWxpZCBqb2IuJyk7XG4gICAgfVxuICAgIGxldCBwYXJhbXMgPSBPYmplY3QuYXNzaWduKHt9LCByZXEuYm9keSwgcmVxLnF1ZXJ5KTtcbiAgICBwYXJhbXMgPSBwYXJzZVBhcmFtcyhwYXJhbXMsIHJlcS5jb25maWcpO1xuICAgIGNvbnN0IHJlcXVlc3QgPSB7XG4gICAgICBwYXJhbXM6IHBhcmFtcyxcbiAgICAgIGxvZzogcmVxLmNvbmZpZy5sb2dnZXJDb250cm9sbGVyLFxuICAgICAgaGVhZGVyczogcmVxLmNvbmZpZy5oZWFkZXJzLFxuICAgICAgaXA6IHJlcS5jb25maWcuaXAsXG4gICAgICBqb2JOYW1lLFxuICAgICAgY29uZmlnOiByZXEuY29uZmlnLFxuICAgICAgbWVzc2FnZTogam9iSGFuZGxlci5zZXRNZXNzYWdlLmJpbmQoam9iSGFuZGxlciksXG4gICAgfTtcblxuICAgIHJldHVybiBqb2JIYW5kbGVyLnNldFJ1bm5pbmcoam9iTmFtZSkudGhlbihqb2JTdGF0dXMgPT4ge1xuICAgICAgcmVxdWVzdC5qb2JJZCA9IGpvYlN0YXR1cy5vYmplY3RJZDtcbiAgICAgIC8vIHJ1biB0aGUgZnVuY3Rpb24gYXN5bmNcbiAgICAgIHByb2Nlc3MubmV4dFRpY2soKCkgPT4ge1xuICAgICAgICBQcm9taXNlLnJlc29sdmUoKVxuICAgICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBqb2JGdW5jdGlvbihyZXF1ZXN0KTtcbiAgICAgICAgICB9KVxuICAgICAgICAgIC50aGVuKFxuICAgICAgICAgICAgcmVzdWx0ID0+IHtcbiAgICAgICAgICAgICAgam9iSGFuZGxlci5zZXRTdWNjZWVkZWQocmVzdWx0KTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlcnJvciA9PiB7XG4gICAgICAgICAgICAgIGpvYkhhbmRsZXIuc2V0RmFpbGVkKGVycm9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICApO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgJ1gtUGFyc2UtSm9iLVN0YXR1cy1JZCc6IGpvYlN0YXR1cy5vYmplY3RJZCxcbiAgICAgICAgfSxcbiAgICAgICAgcmVzcG9uc2U6IHt9LFxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIHN0YXRpYyBjcmVhdGVSZXNwb25zZU9iamVjdChyZXNvbHZlLCByZWplY3QsIHN0YXR1c0NvZGUgPSBudWxsKSB7XG4gICAgbGV0IGh0dHBTdGF0dXNDb2RlID0gc3RhdHVzQ29kZTtcbiAgICBjb25zdCBjdXN0b21IZWFkZXJzID0ge307XG4gICAgbGV0IHJlc3BvbnNlU2VudCA9IGZhbHNlO1xuICAgIGNvbnN0IHJlc3BvbnNlT2JqZWN0ID0ge1xuICAgICAgc3VjY2VzczogZnVuY3Rpb24gKHJlc3VsdCkge1xuICAgICAgICBpZiAocmVzcG9uc2VTZW50KSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgY2FsbCBzdWNjZXNzKCkgYWZ0ZXIgcmVzcG9uc2UgaGFzIGFscmVhZHkgYmVlbiBzZW50LiBNYWtlIHN1cmUgdG8gY2FsbCBzdWNjZXNzKCkgb3IgZXJyb3IoKSBvbmx5IG9uY2UgcGVyIGNsb3VkIGZ1bmN0aW9uIGV4ZWN1dGlvbi4nKTtcbiAgICAgICAgfVxuICAgICAgICByZXNwb25zZVNlbnQgPSB0cnVlO1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IHtcbiAgICAgICAgICByZXNwb25zZToge1xuICAgICAgICAgICAgcmVzdWx0OiBQYXJzZS5fZW5jb2RlKHJlc3VsdCksXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKGh0dHBTdGF0dXNDb2RlICE9PSBudWxsKSB7XG4gICAgICAgICAgcmVzcG9uc2Uuc3RhdHVzID0gaHR0cFN0YXR1c0NvZGU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKGN1c3RvbUhlYWRlcnMpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICByZXNwb25zZS5oZWFkZXJzID0gY3VzdG9tSGVhZGVycztcbiAgICAgICAgfVxuICAgICAgICByZXNvbHZlKHJlc3BvbnNlKTtcbiAgICAgIH0sXG4gICAgICBlcnJvcjogZnVuY3Rpb24gKG1lc3NhZ2UpIHtcbiAgICAgICAgaWYgKHJlc3BvbnNlU2VudCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGNhbGwgZXJyb3IoKSBhZnRlciByZXNwb25zZSBoYXMgYWxyZWFkeSBiZWVuIHNlbnQuIE1ha2Ugc3VyZSB0byBjYWxsIHN1Y2Nlc3MoKSBvciBlcnJvcigpIG9ubHkgb25jZSBwZXIgY2xvdWQgZnVuY3Rpb24gZXhlY3V0aW9uLicpO1xuICAgICAgICB9XG4gICAgICAgIHJlc3BvbnNlU2VudCA9IHRydWU7XG4gICAgICAgIGNvbnN0IGVycm9yID0gdHJpZ2dlcnMucmVzb2x2ZUVycm9yKG1lc3NhZ2UpO1xuICAgICAgICAvLyBJZiBhIGN1c3RvbSBzdGF0dXMgY29kZSB3YXMgc2V0LCBhdHRhY2ggaXQgdG8gdGhlIGVycm9yXG4gICAgICAgIGlmIChodHRwU3RhdHVzQ29kZSAhPT0gbnVsbCkge1xuICAgICAgICAgIGVycm9yLnN0YXR1cyA9IGh0dHBTdGF0dXNDb2RlO1xuICAgICAgICB9XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICB9LFxuICAgICAgc3RhdHVzOiBmdW5jdGlvbiAoY29kZSkge1xuICAgICAgICBodHRwU3RhdHVzQ29kZSA9IGNvZGU7XG4gICAgICAgIHJldHVybiByZXNwb25zZU9iamVjdDtcbiAgICAgIH0sXG4gICAgICBoZWFkZXI6IGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XG4gICAgICAgIGN1c3RvbUhlYWRlcnNba2V5XSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gcmVzcG9uc2VPYmplY3Q7XG4gICAgICB9LFxuICAgICAgX2lzUmVzcG9uc2VTZW50OiAoKSA9PiByZXNwb25zZVNlbnQsXG4gICAgfTtcbiAgICByZXR1cm4gcmVzcG9uc2VPYmplY3Q7XG4gIH1cblxuICAvKipcbiAgICogUGFyc2VzIG11bHRpcGFydC9mb3JtLWRhdGEgcmVxdWVzdHMgZm9yIENsb3VkIEZ1bmN0aW9uIGludm9jYXRpb24uXG4gICAqIEZvciBub24tbXVsdGlwYXJ0IHJlcXVlc3RzLCB0aGlzIGlzIGEgbm8tb3AuXG4gICAqXG4gICAqIFRleHQgZmllbGRzIGFyZSBzZXQgYXMgc3RyaW5ncyBpbiBgcmVxLmJvZHlgLiBGaWxlIGZpZWxkcyBhcmUgc2V0IGFzXG4gICAqIG9iamVjdHMgd2l0aCB0aGUgc2hhcGUgYHsgZmlsZW5hbWU6IHN0cmluZywgY29udGVudFR5cGU6IHN0cmluZywgZGF0YTogQnVmZmVyIH1gLlxuICAgKiBBbGwgZmllbGRzIGFyZSBtZXJnZWQgZmxhdCBpbnRvIGByZXEuYm9keWA7IHRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yXG4gICAqIGF2b2lkaW5nIG5hbWUgY29sbGlzaW9ucyBiZXR3ZWVuIHRleHQgYW5kIGZpbGUgZmllbGRzLlxuICAgKlxuICAgKiBUaGUgdG90YWwgcmVxdWVzdCBzaXplIGlzIGxpbWl0ZWQgYnkgdGhlIHNlcnZlcidzIGBtYXhVcGxvYWRTaXplYCBvcHRpb24uXG4gICAqL1xuICBzdGF0aWMgbXVsdGlwYXJ0TWlkZGxld2FyZShyZXEpIHtcbiAgICBpZiAoIXJlcS5pcyB8fCAhcmVxLmlzKCdtdWx0aXBhcnQvZm9ybS1kYXRhJykpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICB9XG4gICAgY29uc3QgbWF4Qnl0ZXMgPSBVdGlscy5wYXJzZVNpemVUb0J5dGVzKHJlcS5jb25maWcubWF4VXBsb2FkU2l6ZSk7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IGZpZWxkcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICBsZXQgdG90YWxCeXRlcyA9IDA7XG4gICAgICBsZXQgc2V0dGxlZCA9IGZhbHNlO1xuICAgICAgbGV0IGJ1c2JveTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGJ1c2JveSA9IEJ1c2JveSh7IGhlYWRlcnM6IHJlcS5oZWFkZXJzLCBsaW1pdHM6IHsgZmllbGRTaXplOiBtYXhCeXRlcyB9IH0pO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHJldHVybiByZWplY3QoXG4gICAgICAgICAgbmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLklOVkFMSURfSlNPTiwgYEludmFsaWQgbXVsdGlwYXJ0IHJlcXVlc3Q6ICR7ZXJyLm1lc3NhZ2V9YClcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHNhZmVSZWplY3QgPSAoZXJyKSA9PiB7XG4gICAgICAgIGlmIChzZXR0bGVkKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHNldHRsZWQgPSB0cnVlO1xuICAgICAgICBidXNib3kuZGVzdHJveSgpO1xuICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgIH07XG4gICAgICBidXNib3kub24oJ2ZpZWxkJywgKG5hbWUsIHZhbHVlLCBmaWVsZG5hbWVUcnVuY2F0ZWQsIHZhbHVlVHJ1bmNhdGVkKSA9PiB7XG4gICAgICAgIGlmICh2YWx1ZVRydW5jYXRlZCkge1xuICAgICAgICAgIHJldHVybiBzYWZlUmVqZWN0KFxuICAgICAgICAgICAgbmV3IFBhcnNlLkVycm9yKFxuICAgICAgICAgICAgICBQYXJzZS5FcnJvci5PQkpFQ1RfVE9PX0xBUkdFLFxuICAgICAgICAgICAgICAnTXVsdGlwYXJ0IHJlcXVlc3QgZXhjZWVkcyBtYXhpbXVtIHVwbG9hZCBzaXplLidcbiAgICAgICAgICAgIClcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHRvdGFsQnl0ZXMgKz0gQnVmZmVyLmJ5dGVMZW5ndGgodmFsdWUpO1xuICAgICAgICBpZiAodG90YWxCeXRlcyA+IG1heEJ5dGVzKSB7XG4gICAgICAgICAgcmV0dXJuIHNhZmVSZWplY3QoXG4gICAgICAgICAgICBuZXcgUGFyc2UuRXJyb3IoXG4gICAgICAgICAgICAgIFBhcnNlLkVycm9yLk9CSkVDVF9UT09fTEFSR0UsXG4gICAgICAgICAgICAgICdNdWx0aXBhcnQgcmVxdWVzdCBleGNlZWRzIG1heGltdW0gdXBsb2FkIHNpemUuJ1xuICAgICAgICAgICAgKVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgZmllbGRzW25hbWVdID0gdmFsdWU7XG4gICAgICB9KTtcbiAgICAgIGJ1c2JveS5vbignZmlsZScsIChuYW1lLCBzdHJlYW0sIGZpbGVuYW1lLCB0cmFuc2ZlckVuY29kaW5nLCBtaW1lVHlwZSkgPT4ge1xuICAgICAgICBjb25zdCBjaHVua3MgPSBbXTtcbiAgICAgICAgc3RyZWFtLm9uKCdkYXRhJywgY2h1bmsgPT4ge1xuICAgICAgICAgIHRvdGFsQnl0ZXMgKz0gY2h1bmsubGVuZ3RoO1xuICAgICAgICAgIGlmICh0b3RhbEJ5dGVzID4gbWF4Qnl0ZXMpIHtcbiAgICAgICAgICAgIHN0cmVhbS5kZXN0cm95KCk7XG4gICAgICAgICAgICByZXR1cm4gc2FmZVJlamVjdChcbiAgICAgICAgICAgICAgbmV3IFBhcnNlLkVycm9yKFxuICAgICAgICAgICAgICAgIFBhcnNlLkVycm9yLk9CSkVDVF9UT09fTEFSR0UsXG4gICAgICAgICAgICAgICAgJ011bHRpcGFydCByZXF1ZXN0IGV4Y2VlZHMgbWF4aW11bSB1cGxvYWQgc2l6ZS4nXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNodW5rcy5wdXNoKGNodW5rKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHN0cmVhbS5vbignZW5kJywgKCkgPT4ge1xuICAgICAgICAgIGlmIChzZXR0bGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGZpZWxkc1tuYW1lXSA9IHtcbiAgICAgICAgICAgIGZpbGVuYW1lLFxuICAgICAgICAgICAgY29udGVudFR5cGU6IG1pbWVUeXBlIHx8ICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nLFxuICAgICAgICAgICAgZGF0YTogQnVmZmVyLmNvbmNhdChjaHVua3MpLFxuICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgICBidXNib3kub24oJ2ZpbmlzaCcsICgpID0+IHtcbiAgICAgICAgaWYgKHNldHRsZWQpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgc2V0dGxlZCA9IHRydWU7XG4gICAgICAgIHJlcS5ib2R5ID0gZmllbGRzO1xuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9KTtcbiAgICAgIGJ1c2JveS5vbignZXJyb3InLCBlcnIgPT4ge1xuICAgICAgICBzYWZlUmVqZWN0KFxuICAgICAgICAgIG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5JTlZBTElEX0pTT04sIGBJbnZhbGlkIG11bHRpcGFydCByZXF1ZXN0OiAke2Vyci5tZXNzYWdlfWApXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICAgIHJlcS5waXBlKGJ1c2JveSk7XG4gICAgfSk7XG4gIH1cblxuICBzdGF0aWMgaGFuZGxlQ2xvdWRGdW5jdGlvbihyZXEpIHtcbiAgICBjb25zdCBmdW5jdGlvbk5hbWUgPSByZXEucGFyYW1zLmZ1bmN0aW9uTmFtZTtcbiAgICBjb25zdCBhcHBsaWNhdGlvbklkID0gcmVxLmNvbmZpZy5hcHBsaWNhdGlvbklkO1xuICAgIGNvbnN0IHRoZUZ1bmN0aW9uID0gdHJpZ2dlcnMuZ2V0RnVuY3Rpb24oZnVuY3Rpb25OYW1lLCBhcHBsaWNhdGlvbklkKTtcblxuICAgIGlmICghdGhlRnVuY3Rpb24pIHtcbiAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5TQ1JJUFRfRkFJTEVELCBgSW52YWxpZCBmdW5jdGlvbjogXCIke2Z1bmN0aW9uTmFtZX1cImApO1xuICAgIH1cbiAgICBsZXQgcGFyYW1zID0gT2JqZWN0LmFzc2lnbih7fSwgcmVxLmJvZHksIHJlcS5xdWVyeSk7XG4gICAgcGFyYW1zID0gcGFyc2VQYXJhbXMocGFyYW1zLCByZXEuY29uZmlnKTtcbiAgICBjb25zdCByZXF1ZXN0ID0ge1xuICAgICAgcGFyYW1zOiBwYXJhbXMsXG4gICAgICBjb25maWc6IHJlcS5jb25maWcsXG4gICAgICBtYXN0ZXI6IHJlcS5hdXRoICYmIHJlcS5hdXRoLmlzTWFzdGVyLFxuICAgICAgaXNSZWFkT25seTogISEocmVxLmF1dGggJiYgcmVxLmF1dGguaXNSZWFkT25seSksXG4gICAgICB1c2VyOiByZXEuYXV0aCAmJiByZXEuYXV0aC51c2VyLFxuICAgICAgaW5zdGFsbGF0aW9uSWQ6IHJlcS5pbmZvLmluc3RhbGxhdGlvbklkLFxuICAgICAgbG9nOiByZXEuY29uZmlnLmxvZ2dlckNvbnRyb2xsZXIsXG4gICAgICBoZWFkZXJzOiByZXEuY29uZmlnLmhlYWRlcnMsXG4gICAgICBpcDogcmVxLmNvbmZpZy5pcCxcbiAgICAgIGZ1bmN0aW9uTmFtZSxcbiAgICAgIGNvbnRleHQ6IHJlcS5pbmZvLmNvbnRleHQsXG4gICAgfTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICBjb25zdCB1c2VyU3RyaW5nID0gcmVxLmF1dGggJiYgcmVxLmF1dGgudXNlciA/IHJlcS5hdXRoLnVzZXIuaWQgOiB1bmRlZmluZWQ7XG4gICAgICBjb25zdCByZXNwb25zZU9iamVjdCA9IEZ1bmN0aW9uc1JvdXRlci5jcmVhdGVSZXNwb25zZU9iamVjdChcbiAgICAgICAgcmVzdWx0ID0+IHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKHJlcS5jb25maWcubG9nTGV2ZWxzLmNsb3VkRnVuY3Rpb25TdWNjZXNzICE9PSAnc2lsZW50Jykge1xuICAgICAgICAgICAgICBjb25zdCBjbGVhbklucHV0ID0gbG9nZ2VyLnRydW5jYXRlTG9nTWVzc2FnZShKU09OLnN0cmluZ2lmeShyZWRhY3RCdWZmZXJzKHBhcmFtcykpKTtcbiAgICAgICAgICAgICAgY29uc3QgY2xlYW5SZXN1bHQgPSBsb2dnZXIudHJ1bmNhdGVMb2dNZXNzYWdlKEpTT04uc3RyaW5naWZ5KHJlc3VsdC5yZXNwb25zZS5yZXN1bHQpKTtcbiAgICAgICAgICAgICAgbG9nZ2VyW3JlcS5jb25maWcubG9nTGV2ZWxzLmNsb3VkRnVuY3Rpb25TdWNjZXNzXShcbiAgICAgICAgICAgICAgICBgUmFuIGNsb3VkIGZ1bmN0aW9uICR7ZnVuY3Rpb25OYW1lfSBmb3IgdXNlciAke3VzZXJTdHJpbmd9IHdpdGg6XFxuICBJbnB1dDogJHtjbGVhbklucHV0fVxcbiAgUmVzdWx0OiAke2NsZWFuUmVzdWx0fWAsXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgZnVuY3Rpb25OYW1lLFxuICAgICAgICAgICAgICAgICAgcGFyYW1zLFxuICAgICAgICAgICAgICAgICAgdXNlcjogdXNlclN0cmluZyxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXNvbHZlKHJlc3VsdCk7XG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgZXJyb3IgPT4ge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAocmVxLmNvbmZpZy5sb2dMZXZlbHMuY2xvdWRGdW5jdGlvbkVycm9yICE9PSAnc2lsZW50Jykge1xuICAgICAgICAgICAgICBjb25zdCBjbGVhbklucHV0ID0gbG9nZ2VyLnRydW5jYXRlTG9nTWVzc2FnZShKU09OLnN0cmluZ2lmeShyZWRhY3RCdWZmZXJzKHBhcmFtcykpKTtcbiAgICAgICAgICAgICAgbG9nZ2VyW3JlcS5jb25maWcubG9nTGV2ZWxzLmNsb3VkRnVuY3Rpb25FcnJvcl0oXG4gICAgICAgICAgICAgICAgYEZhaWxlZCBydW5uaW5nIGNsb3VkIGZ1bmN0aW9uICR7ZnVuY3Rpb25OYW1lfSBmb3IgdXNlciAke3VzZXJTdHJpbmd9IHdpdGg6XFxuICBJbnB1dDogJHtjbGVhbklucHV0fVxcbiAgRXJyb3I6IGAgK1xuICAgICAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkoZXJyb3IpLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uTmFtZSxcbiAgICAgICAgICAgICAgICAgIGVycm9yLFxuICAgICAgICAgICAgICAgICAgcGFyYW1zLFxuICAgICAgICAgICAgICAgICAgdXNlcjogdXNlclN0cmluZyxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgICBjb25zdCB7IHN1Y2Nlc3MsIGVycm9yIH0gPSByZXNwb25zZU9iamVjdDtcblxuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpXG4gICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICByZXR1cm4gdHJpZ2dlcnMubWF5YmVSdW5WYWxpZGF0b3IocmVxdWVzdCwgZnVuY3Rpb25OYW1lLCByZXEuYXV0aCk7XG4gICAgICAgIH0pXG4gICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICAvLyBDaGVjayBpZiBmdW5jdGlvbiBleHBlY3RzIDIgcGFyYW1ldGVycyAocmVxLCByZXMpIC0gRXhwcmVzcyBzdHlsZVxuICAgICAgICAgIGlmICh0aGVGdW5jdGlvbi5sZW5ndGggPj0gMikge1xuICAgICAgICAgICAgcmV0dXJuIHRoZUZ1bmN0aW9uKHJlcXVlc3QsIHJlc3BvbnNlT2JqZWN0KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gVHJhZGl0aW9uYWwgc3R5bGUgLSBzaW5nbGUgcGFyYW1ldGVyXG4gICAgICAgICAgICByZXR1cm4gdGhlRnVuY3Rpb24ocmVxdWVzdCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICAudGhlbihyZXN1bHQgPT4ge1xuICAgICAgICAgIC8vIEZvciBFeHByZXNzLXN0eWxlIGZ1bmN0aW9ucywgb25seSBzZW5kIHJlc3BvbnNlIGlmIG5vdCBhbHJlYWR5IHNlbnRcbiAgICAgICAgICBpZiAodGhlRnVuY3Rpb24ubGVuZ3RoID49IDIpIHtcbiAgICAgICAgICAgIGlmICghcmVzcG9uc2VPYmplY3QuX2lzUmVzcG9uc2VTZW50KCkpIHtcbiAgICAgICAgICAgICAgLy8gSWYgRXhwcmVzcy1zdHlsZSBmdW5jdGlvbiByZXR1cm5zIGEgdmFsdWUgd2l0aG91dCBjYWxsaW5nIHJlcy5zdWNjZXNzL2Vycm9yXG4gICAgICAgICAgICAgIGlmIChyZXN1bHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHN1Y2Nlc3MocmVzdWx0KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAvLyBJZiBubyByZXNwb25zZSBzZW50IGFuZCBubyB2YWx1ZSByZXR1cm5lZCwgdGhpcyBpcyBhbiBlcnJvciBpbiB1c2VyIGNvZGVcbiAgICAgICAgICAgICAgLy8gYnV0IHdlIGRvbid0IGhhbmRsZSBpdCBoZXJlIHRvIG1haW50YWluIGJhY2t3YXJkIGNvbXBhdGliaWxpdHlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gRm9yIHRyYWRpdGlvbmFsIGZ1bmN0aW9ucywgYWx3YXlzIGNhbGwgc3VjY2VzcyB3aXRoIHRoZSByZXN1bHQgKGV2ZW4gaWYgdW5kZWZpbmVkKVxuICAgICAgICAgICAgc3VjY2VzcyhyZXN1bHQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSwgZXJyb3IpO1xuICAgIH0pO1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7OztBQUtBLElBQUFBLGNBQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLFlBQUEsR0FBQUQsT0FBQTtBQUNBLElBQUFFLGNBQUEsR0FBQUYsT0FBQTtBQUNBLElBQUFHLE9BQUEsR0FBQUosc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFJLE9BQUEsR0FBQUosT0FBQTtBQUNBLElBQUFLLE1BQUEsR0FBQUwsT0FBQTtBQUNBLElBQUFNLE9BQUEsR0FBQVAsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFPLE1BQUEsR0FBQVIsc0JBQUEsQ0FBQUMsT0FBQTtBQUE2QixTQUFBRCx1QkFBQVMsQ0FBQSxXQUFBQSxDQUFBLElBQUFBLENBQUEsQ0FBQUMsVUFBQSxHQUFBRCxDQUFBLEtBQUFFLE9BQUEsRUFBQUYsQ0FBQTtBQVo3Qjs7QUFFQSxJQUFJRyxLQUFLLEdBQUdYLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQ1csS0FBSztFQUNyQ0MsUUFBUSxH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
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = exports.GlobalConfigRouter = void 0;
|
|
7
|
+
var _node = _interopRequireDefault(require("parse/node"));
|
|
8
|
+
var _PromiseRouter = _interopRequireDefault(require("../PromiseRouter"));
|
|
9
|
+
var middleware = _interopRequireWildcard(require("../middlewares"));
|
|
10
|
+
var triggers = _interopRequireWildcard(require("../triggers"));
|
|
11
|
+
var _Error = require("../Error");
|
|
12
|
+
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
|
|
13
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
14
|
+
// global_config.js
|
|
15
|
+
|
|
16
|
+
const getConfigFromParams = params => {
|
|
17
|
+
const config = new _node.default.Config();
|
|
18
|
+
for (const attr in params) {
|
|
19
|
+
config.attributes[attr] = _node.default._decode(undefined, params[attr]);
|
|
20
|
+
}
|
|
21
|
+
return config;
|
|
22
|
+
};
|
|
23
|
+
class GlobalConfigRouter extends _PromiseRouter.default {
|
|
24
|
+
getGlobalConfig(req) {
|
|
25
|
+
return req.config.database.find('_GlobalConfig', {
|
|
26
|
+
objectId: '1'
|
|
27
|
+
}, {
|
|
28
|
+
limit: 1
|
|
29
|
+
}).then(results => {
|
|
30
|
+
if (results.length != 1) {
|
|
31
|
+
// If there is no config in the database - return empty config.
|
|
32
|
+
return {
|
|
33
|
+
response: {
|
|
34
|
+
params: {}
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
const globalConfig = results[0];
|
|
39
|
+
if (!req.auth.isMaster && globalConfig.masterKeyOnly !== undefined) {
|
|
40
|
+
for (const param in globalConfig.params) {
|
|
41
|
+
if (globalConfig.masterKeyOnly[param]) {
|
|
42
|
+
delete globalConfig.params[param];
|
|
43
|
+
delete globalConfig.masterKeyOnly[param];
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
return {
|
|
48
|
+
response: {
|
|
49
|
+
params: globalConfig.params,
|
|
50
|
+
masterKeyOnly: globalConfig.masterKeyOnly
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
async updateGlobalConfig(req) {
|
|
56
|
+
if (req.auth.isReadOnly) {
|
|
57
|
+
throw (0, _Error.createSanitizedError)(_node.default.Error.OPERATION_FORBIDDEN, "read-only masterKey isn't allowed to update the config.", req.config);
|
|
58
|
+
}
|
|
59
|
+
const params = req.body.params || {};
|
|
60
|
+
const masterKeyOnly = req.body?.masterKeyOnly || {};
|
|
61
|
+
// Transform in dot notation to make sure it works
|
|
62
|
+
const update = Object.keys(params).reduce((acc, key) => {
|
|
63
|
+
acc[`params.${key}`] = params[key];
|
|
64
|
+
acc[`masterKeyOnly.${key}`] = masterKeyOnly[key] || false;
|
|
65
|
+
return acc;
|
|
66
|
+
}, {});
|
|
67
|
+
const className = triggers.getClassName(_node.default.Config);
|
|
68
|
+
const hasBeforeSaveHook = triggers.triggerExists(className, triggers.Types.beforeSave, req.config.applicationId);
|
|
69
|
+
const hasAfterSaveHook = triggers.triggerExists(className, triggers.Types.afterSave, req.config.applicationId);
|
|
70
|
+
let originalConfigObject;
|
|
71
|
+
let updatedConfigObject;
|
|
72
|
+
const configObject = new _node.default.Config();
|
|
73
|
+
configObject.attributes = params;
|
|
74
|
+
const results = await req.config.database.find('_GlobalConfig', {
|
|
75
|
+
objectId: '1'
|
|
76
|
+
}, {
|
|
77
|
+
limit: 1
|
|
78
|
+
});
|
|
79
|
+
const isNew = results.length !== 1;
|
|
80
|
+
if (!isNew && (hasBeforeSaveHook || hasAfterSaveHook)) {
|
|
81
|
+
originalConfigObject = getConfigFromParams(results[0].params);
|
|
82
|
+
}
|
|
83
|
+
try {
|
|
84
|
+
await triggers.maybeRunGlobalConfigTrigger(triggers.Types.beforeSave, req.auth, configObject, originalConfigObject, req.config, req.context);
|
|
85
|
+
if (isNew) {
|
|
86
|
+
await req.config.database.update('_GlobalConfig', {
|
|
87
|
+
objectId: '1'
|
|
88
|
+
}, update, {
|
|
89
|
+
upsert: true
|
|
90
|
+
}, true);
|
|
91
|
+
updatedConfigObject = configObject;
|
|
92
|
+
} else {
|
|
93
|
+
const result = await req.config.database.update('_GlobalConfig', {
|
|
94
|
+
objectId: '1'
|
|
95
|
+
}, update, {}, true);
|
|
96
|
+
updatedConfigObject = getConfigFromParams(result.params);
|
|
97
|
+
}
|
|
98
|
+
await triggers.maybeRunGlobalConfigTrigger(triggers.Types.afterSave, req.auth, updatedConfigObject, originalConfigObject, req.config, req.context);
|
|
99
|
+
return {
|
|
100
|
+
response: {
|
|
101
|
+
result: true
|
|
102
|
+
}
|
|
103
|
+
};
|
|
104
|
+
} catch (err) {
|
|
105
|
+
const error = triggers.resolveError(err, {
|
|
106
|
+
code: _node.default.Error.SCRIPT_FAILED,
|
|
107
|
+
message: 'Script failed. Unknown error.'
|
|
108
|
+
});
|
|
109
|
+
throw error;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
mountRoutes() {
|
|
113
|
+
this.route('GET', '/config', req => {
|
|
114
|
+
return this.getGlobalConfig(req);
|
|
115
|
+
});
|
|
116
|
+
this.route('PUT', '/config', middleware.promiseEnforceMasterKeyAccess, req => {
|
|
117
|
+
return this.updateGlobalConfig(req);
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
exports.GlobalConfigRouter = GlobalConfigRouter;
|
|
122
|
+
var _default = exports.default = GlobalConfigRouter;
|
|
123
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbm9kZSIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJyZXF1aXJlIiwiX1Byb21pc2VSb3V0ZXIiLCJtaWRkbGV3YXJlIiwiX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQiLCJ0cmlnZ2VycyIsIl9FcnJvciIsImUiLCJ0IiwiV2Vha01hcCIsInIiLCJuIiwiX19lc01vZHVsZSIsIm8iLCJpIiwiZiIsIl9fcHJvdG9fXyIsImRlZmF1bHQiLCJoYXMiLCJnZXQiLCJzZXQiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsImdldENvbmZpZ0Zyb21QYXJhbXMiLCJwYXJhbXMiLCJjb25maWciLCJQYXJzZSIsIkNvbmZpZyIsImF0dHIiLCJhdHRyaWJ1dGVzIiwiX2RlY29kZSIsInVuZGVmaW5lZCIsIkdsb2JhbENvbmZpZ1JvdXRlciIsIlByb21pc2VSb3V0ZXIiLCJnZXRHbG9iYWxDb25maWciLCJyZXEiLCJkYXRhYmFzZSIsImZpbmQiLCJvYmplY3RJZCIsImxpbWl0IiwidGhlbiIsInJlc3VsdHMiLCJsZW5ndGgiLCJyZXNwb25zZSIsImdsb2JhbENvbmZpZyIsImF1dGgiLCJpc01hc3RlciIsIm1hc3RlcktleU9ubHkiLCJwYXJhbSIsInVwZGF0ZUdsb2JhbENvbmZpZyIsImlzUmVhZE9ubHkiLCJjcmVhdGVTYW5pdGl6ZWRFcnJvciIsIkVycm9yIiwiT1BFUkFUSU9OX0ZPUkJJRERFTiIsImJvZHkiLCJ1cGRhdGUiLCJrZXlzIiwicmVkdWNlIiwiYWNjIiwia2V5IiwiY2xhc3NOYW1lIiwiZ2V0Q2xhc3NOYW1lIiwiaGFzQmVmb3JlU2F2ZUhvb2siLCJ0cmlnZ2VyRXhpc3RzIiwiVHlwZXMiLCJiZWZvcmVTYXZlIiwiYXBwbGljYXRpb25JZCIsImhhc0FmdGVyU2F2ZUhvb2siLCJhZnRlclNhdmUiLCJvcmlnaW5hbENvbmZpZ09iamVjdCIsInVwZGF0ZWRDb25maWdPYmplY3QiLCJjb25maWdPYmplY3QiLCJpc05ldyIsIm1heWJlUnVuR2xvYmFsQ29uZmlnVHJpZ2dlciIsImNvbnRleHQiLCJ1cHNlcnQiLCJyZXN1bHQiLCJlcnIiLCJlcnJvciIsInJlc29sdmVFcnJvciIsImNvZGUiLCJTQ1JJUFRfRkFJTEVEIiwibWVzc2FnZSIsIm1vdW50Um91dGVzIiwicm91dGUiLCJwcm9taXNlRW5mb3JjZU1hc3RlcktleUFjY2VzcyIsImV4cG9ydHMiLCJfZGVmYXVsdCJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9Sb3V0ZXJzL0dsb2JhbENvbmZpZ1JvdXRlci5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBnbG9iYWxfY29uZmlnLmpzXG5pbXBvcnQgUGFyc2UgZnJvbSAncGFyc2Uvbm9kZSc7XG5pbXBvcnQgUHJvbWlzZVJvdXRlciBmcm9tICcuLi9Qcm9taXNlUm91dGVyJztcbmltcG9ydCAqIGFzIG1pZGRsZXdhcmUgZnJvbSAnLi4vbWlkZGxld2FyZXMnO1xuaW1wb3J0ICogYXMgdHJpZ2dlcnMgZnJvbSAnLi4vdHJpZ2dlcnMnO1xuaW1wb3J0IHsgY3JlYXRlU2FuaXRpemVkRXJyb3IgfSBmcm9tICcuLi9FcnJvcic7XG5cbmNvbnN0IGdldENvbmZpZ0Zyb21QYXJhbXMgPSBwYXJhbXMgPT4ge1xuICBjb25zdCBjb25maWcgPSBuZXcgUGFyc2UuQ29uZmlnKCk7XG4gIGZvciAoY29uc3QgYXR0ciBpbiBwYXJhbXMpIHtcbiAgICBjb25maWcuYXR0cmlidXRlc1thdHRyXSA9IFBhcnNlLl9kZWNvZGUodW5kZWZpbmVkLCBwYXJhbXNbYXR0cl0pO1xuICB9XG4gIHJldHVybiBjb25maWc7XG59O1xuXG5leHBvcnQgY2xhc3MgR2xvYmFsQ29uZmlnUm91dGVyIGV4dGVuZHMgUHJvbWlzZVJvdXRlciB7XG4gIGdldEdsb2JhbENvbmZpZyhyZXEpIHtcbiAgICByZXR1cm4gcmVxLmNvbmZpZy5kYXRhYmFzZVxuICAgICAgLmZpbmQoJ19HbG9iYWxDb25maWcnLCB7IG9iamVjdElkOiAnMScgfSwgeyBsaW1pdDogMSB9KVxuICAgICAgLnRoZW4ocmVzdWx0cyA9PiB7XG4gICAgICAgIGlmIChyZXN1bHRzLmxlbmd0aCAhPSAxKSB7XG4gICAgICAgICAgLy8gSWYgdGhlcmUgaXMgbm8gY29uZmlnIGluIHRoZSBkYXRhYmFzZSAtIHJldHVybiBlbXB0eSBjb25maWcuXG4gICAgICAgICAgcmV0dXJuIHsgcmVzcG9uc2U6IHsgcGFyYW1zOiB7fSB9IH07XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZ2xvYmFsQ29uZmlnID0gcmVzdWx0c1swXTtcbiAgICAgICAgaWYgKCFyZXEuYXV0aC5pc01hc3RlciAmJiBnbG9iYWxDb25maWcubWFzdGVyS2V5T25seSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgZm9yIChjb25zdCBwYXJhbSBpbiBnbG9iYWxDb25maWcucGFyYW1zKSB7XG4gICAgICAgICAgICBpZiAoZ2xvYmFsQ29uZmlnLm1hc3RlcktleU9ubHlbcGFyYW1dKSB7XG4gICAgICAgICAgICAgIGRlbGV0ZSBnbG9iYWxDb25maWcucGFyYW1zW3BhcmFtXTtcbiAgICAgICAgICAgICAgZGVsZXRlIGdsb2JhbENvbmZpZy5tYXN0ZXJLZXlPbmx5W3BhcmFtXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICByZXNwb25zZToge1xuICAgICAgICAgICAgcGFyYW1zOiBnbG9iYWxDb25maWcucGFyYW1zLFxuICAgICAgICAgICAgbWFzdGVyS2V5T25seTogZ2xvYmFsQ29uZmlnLm1hc3RlcktleU9ubHksXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgdXBkYXRlR2xvYmFsQ29uZmlnKHJlcSkge1xuICAgIGlmIChyZXEuYXV0aC5pc1JlYWRPbmx5KSB7XG4gICAgICB0aHJvdyBjcmVhdGVTYW5pdGl6ZWRFcnJvcihcbiAgICAgICAgUGFyc2UuRXJyb3IuT1BFUkFUSU9OX0ZPUkJJRERFTixcbiAgICAgICAgXCJyZWFkLW9ubHkgbWFzdGVyS2V5IGlzbid0IGFsbG93ZWQgdG8gdXBkYXRlIHRoZSBjb25maWcuXCIsXG4gICAgICAgIHJlcS5jb25maWdcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IHBhcmFtcyA9IHJlcS5ib2R5LnBhcmFtcyB8fCB7fTtcbiAgICBjb25zdCBtYXN0ZXJLZXlPbmx5ID0gcmVxLmJvZHk/Lm1hc3RlcktleU9ubHkgfHwge307XG4gICAgLy8gVHJhbnNmb3JtIGluIGRvdCBub3RhdGlvbiB0byBtYWtlIHN1cmUgaXQgd29ya3NcbiAgICBjb25zdCB1cGRhdGUgPSBPYmplY3Qua2V5cyhwYXJhbXMpLnJlZHVjZSgoYWNjLCBrZXkpID0+IHtcbiAgICAgIGFjY1tgcGFyYW1zLiR7a2V5fWBdID0gcGFyYW1zW2tleV07XG4gICAgICBhY2NbYG1hc3RlcktleU9ubHkuJHtrZXl9YF0gPSBtYXN0ZXJLZXlPbmx5W2tleV0gfHwgZmFsc2U7XG4gICAgICByZXR1cm4gYWNjO1xuICAgIH0sIHt9KTtcbiAgICBjb25zdCBjbGFzc05hbWUgPSB0cmlnZ2Vycy5nZXRDbGFzc05hbWUoUGFyc2UuQ29uZmlnKTtcbiAgICBjb25zdCBoYXNCZWZvcmVTYXZlSG9vayA9IHRyaWdnZXJzLnRyaWdnZXJFeGlzdHMoY2xhc3NOYW1lLCB0cmlnZ2Vycy5UeXBlcy5iZWZvcmVTYXZlLCByZXEuY29uZmlnLmFwcGxpY2F0aW9uSWQpO1xuICAgIGNvbnN0IGhhc0FmdGVyU2F2ZUhvb2sgPSB0cmlnZ2Vycy50cmlnZ2VyRXhpc3RzKGNsYXNzTmFtZSwgdHJpZ2dlcnMuVHlwZXMuYWZ0ZXJTYXZlLCByZXEuY29uZmlnLmFwcGxpY2F0aW9uSWQpO1xuICAgIGxldCBvcmlnaW5hbENvbmZpZ09iamVjdDtcbiAgICBsZXQgdXBkYXRlZENvbmZpZ09iamVjdDtcbiAgICBjb25zdCBjb25maWdPYmplY3QgPSBuZXcgUGFyc2UuQ29uZmlnKCk7XG4gICAgY29uZmlnT2JqZWN0LmF0dHJpYnV0ZXMgPSBwYXJhbXM7XG5cbiAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgcmVxLmNvbmZpZy5kYXRhYmFzZS5maW5kKCdfR2xvYmFsQ29uZmlnJywgeyBvYmplY3RJZDogJzEnIH0sIHsgbGltaXQ6IDEgfSk7XG4gICAgY29uc3QgaXNOZXcgPSByZXN1bHRzLmxlbmd0aCAhPT0gMTtcbiAgICBpZiAoIWlzTmV3ICYmIChoYXNCZWZvcmVTYXZlSG9vayB8fCBoYXNBZnRlclNhdmVIb29rKSkge1xuICAgICAgb3JpZ2luYWxDb25maWdPYmplY3QgPSBnZXRDb25maWdGcm9tUGFyYW1zKHJlc3VsdHNbMF0ucGFyYW1zKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRyaWdnZXJzLm1heWJlUnVuR2xvYmFsQ29uZmlnVHJpZ2dlcih0cmlnZ2Vycy5UeXBlcy5iZWZvcmVTYXZlLCByZXEuYXV0aCwgY29uZmlnT2JqZWN0LCBvcmlnaW5hbENvbmZpZ09iamVjdCwgcmVxLmNvbmZpZywgcmVxLmNvbnRleHQpO1xuICAgICAgaWYgKGlzTmV3KSB7XG4gICAgICAgIGF3YWl0IHJlcS5jb25maWcuZGF0YWJhc2UudXBkYXRlKCdfR2xvYmFsQ29uZmlnJywgeyBvYmplY3RJZDogJzEnIH0sIHVwZGF0ZSwgeyB1cHNlcnQ6IHRydWUgfSwgdHJ1ZSlcbiAgICAgICAgdXBkYXRlZENvbmZpZ09iamVjdCA9IGNvbmZpZ09iamVjdDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlcS5jb25maWcuZGF0YWJhc2UudXBkYXRlKCdfR2xvYmFsQ29uZmlnJywgeyBvYmplY3RJZDogJzEnIH0sIHVwZGF0ZSwge30sIHRydWUpO1xuICAgICAgICB1cGRhdGVkQ29uZmlnT2JqZWN0ID0gZ2V0Q29uZmlnRnJvbVBhcmFtcyhyZXN1bHQucGFyYW1zKTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IHRyaWdnZXJzLm1heWJlUnVuR2xvYmFsQ29uZmlnVHJpZ2dlcih0cmlnZ2Vycy5UeXBlcy5hZnRlclNhdmUsIHJlcS5hdXRoLCB1cGRhdGVkQ29uZmlnT2JqZWN0LCBvcmlnaW5hbENvbmZpZ09iamVjdCwgcmVxLmNvbmZpZywgcmVxLmNvbnRleHQpO1xuICAgICAgcmV0dXJuIHsgcmVzcG9uc2U6IHsgcmVzdWx0OiB0cnVlIH0gfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc3QgZXJyb3IgPSB0cmlnZ2Vycy5yZXNvbHZlRXJyb3IoZXJyLCB7XG4gICAgICAgIGNvZGU6IFBhcnNlLkVycm9yLlNDUklQVF9GQUlMRUQsXG4gICAgICAgIG1lc3NhZ2U6ICdTY3JpcHQgZmFpbGVkLiBVbmtub3duIGVycm9yLicsXG4gICAgICB9KTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIG1vdW50Um91dGVzKCkge1xuICAgIHRoaXMucm91dGUoJ0dFVCcsICcvY29uZmlnJywgcmVxID0+IHtcbiAgICAgIHJldHVybiB0aGlzLmdldEdsb2JhbENvbmZpZyhyZXEpO1xuICAgIH0pO1xuICAgIHRoaXMucm91dGUoJ1BVVCcsICcvY29uZmlnJywgbWlkZGxld2FyZS5wcm9taXNlRW5mb3JjZU1hc3RlcktleUFjY2VzcywgcmVxID0+IHtcbiAgICAgIHJldHVybiB0aGlzLnVwZGF0ZUdsb2JhbENvbmZpZyhyZXEpO1xuICAgIH0pO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEdsb2JhbENvbmZpZ1JvdXRlcjtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQ0EsSUFBQUEsS0FBQSxHQUFBQyxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUMsY0FBQSxHQUFBRixzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUUsVUFBQSxHQUFBQyx1QkFBQSxDQUFBSCxPQUFBO0FBQ0EsSUFBQUksUUFBQSxHQUFBRCx1QkFBQSxDQUFBSCxPQUFBO0FBQ0EsSUFBQUssTUFBQSxHQUFBTCxPQUFBO0FBQWdELFNBQUFHLHdCQUFBRyxDQUFBLEVBQUFD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RTtRQUFJLENBQUMsRUFBRWlCLE1BQU0sRUFBRTtVQUFFb0IsTUFBTSxFQUFFO1FBQUssQ0FBQyxFQUFFLElBQUksQ0FBQztRQUNwR0wsbUJBQW1CLEdBQUdDLFlBQVk7TUFDcEMsQ0FBQyxNQUFNO1FBQ0wsTUFBTUssTUFBTSxHQUFHLE1BQU16QyxHQUFHLENBQUNWLE1BQU0sQ0FBQ1csUUFBUSxDQUFDbUIsTUFBTSxDQUFDLGVBQWUsRUFBRTtVQUFFakIsUUFBUSxFQUFFO1FBQUksQ0FBQyxFQUFFaUIsTUFBTSxFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQztRQUNyR2UsbUJBQW1CLEdBQUcvQyxtQkFBbUIsQ0FBQ3FELE1BQU0sQ0FBQ3BELE1BQU0sQ0FBQztNQUMxRDtNQUNBLE1BQU10QixRQUFRLENBQUN1RSwyQkFBMkIsQ0FBQ3ZFLFFBQVEsQ0FBQzhELEtBQUssQ0FBQ0ksU0FBUyxFQUFFakMsR0FBRyxDQUFDVSxJQUFJLEVBQUV5QixtQkFBbUIsRUFBRUQsb0JBQW9CLEVBQUVsQyxHQUFHLENBQUNWLE1BQU0sRUFBRVUsR0FBRyxDQUFDdUMsT0FBTyxDQUFDO01BQ2xKLE9BQU87UUFBRS9CLFFBQVEsRUFBRTtVQUFFaUMsTUFBTSxFQUFFO1FBQUs7TUFBRSxDQUFDO0lBQ3ZDLENBQUMsQ0FBQyxPQUFPQyxHQUFHLEVBQUU7TUFDWixNQUFNQyxLQUFLLEdBQUc1RSxRQUFRLENBQUM2RSxZQUFZLENBQUNGLEdBQUcsRUFBRTtRQUN2Q0csSUFBSSxFQUFFdEQsYUFBSyxDQUFDMEIsS0FBSyxDQUFDNkIsYUFBYTtRQUMvQkMsT0FBTyxFQUFFO01BQ1gsQ0FBQyxDQUFDO01BQ0YsTUFBTUosS0FBSztJQUNiO0VBQ0Y7RUFFQUssV0FBV0EsQ0FBQSxFQUFHO0lBQ1osSUFBSSxDQUFDQyxLQUFLLENBQUMsS0FBSyxFQUFFLFNBQVMsRUFBRWpELEdBQUcsSUFBSTtNQUNsQyxPQUFPLElBQUksQ0FBQ0QsZUFBZSxDQUFDQyxHQUFHLENBQUM7SUFDbEMsQ0FBQyxDQUFDO0lBQ0YsSUFBSSxDQUFDaUQsS0FBSyxDQUFDLEtBQUssRUFBRSxTQUFTLEVBQUVwRixVQUFVLENBQUNxRiw2QkFBNkIsRUFBRWxELEdBQUcsSUFBSTtNQUM1RSxPQUFPLElBQUksQ0FBQ2Msa0JBQWtCLENBQUNkLEdBQUcsQ0FBQztJQUNyQyxDQUFDLENBQUM7RUFDSjtBQUNGO0FBQUNtRCxPQUFBLENBQUF0RCxrQkFBQSxHQUFBQSxrQkFBQTtBQUFBLElBQUF1RCxRQUFBLEdBQUFELE9BQUEsQ0FBQXhFLE9BQUEsR0FFY2tCLGtCQUFrQiIsImlnbm9yZUxpc3QiOltdfQ==
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = exports.GraphQLRouter = void 0;
|
|
7
|
+
var _node = _interopRequireDefault(require("parse/node"));
|
|
8
|
+
var _PromiseRouter = _interopRequireDefault(require("../PromiseRouter"));
|
|
9
|
+
var middleware = _interopRequireWildcard(require("../middlewares"));
|
|
10
|
+
var _Error = require("../Error");
|
|
11
|
+
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
|
|
12
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
13
|
+
const GraphQLConfigPath = '/graphql-config';
|
|
14
|
+
class GraphQLRouter extends _PromiseRouter.default {
|
|
15
|
+
async getGraphQLConfig(req) {
|
|
16
|
+
const result = await req.config.parseGraphQLController.getGraphQLConfig();
|
|
17
|
+
return {
|
|
18
|
+
response: result
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
async updateGraphQLConfig(req) {
|
|
22
|
+
if (req.auth.isReadOnly) {
|
|
23
|
+
throw (0, _Error.createSanitizedError)(_node.default.Error.OPERATION_FORBIDDEN, "read-only masterKey isn't allowed to update the GraphQL config.", req.config);
|
|
24
|
+
}
|
|
25
|
+
const data = await req.config.parseGraphQLController.updateGraphQLConfig(req.body?.params || {});
|
|
26
|
+
return {
|
|
27
|
+
response: data
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
mountRoutes() {
|
|
31
|
+
this.route('GET', GraphQLConfigPath, middleware.promiseEnforceMasterKeyAccess, req => {
|
|
32
|
+
return this.getGraphQLConfig(req);
|
|
33
|
+
});
|
|
34
|
+
this.route('PUT', GraphQLConfigPath, middleware.promiseEnforceMasterKeyAccess, req => {
|
|
35
|
+
return this.updateGraphQLConfig(req);
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
exports.GraphQLRouter = GraphQLRouter;
|
|
40
|
+
var _default = exports.default = GraphQLRouter;
|
|
41
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbm9kZSIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJyZXF1aXJlIiwiX1Byb21pc2VSb3V0ZXIiLCJtaWRkbGV3YXJlIiwiX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQiLCJfRXJyb3IiLCJlIiwidCIsIldlYWtNYXAiLCJyIiwibiIsIl9fZXNNb2R1bGUiLCJvIiwiaSIsImYiLCJfX3Byb3RvX18iLCJkZWZhdWx0IiwiaGFzIiwiZ2V0Iiwic2V0IiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJHcmFwaFFMQ29uZmlnUGF0aCIsIkdyYXBoUUxSb3V0ZXIiLCJQcm9taXNlUm91dGVyIiwiZ2V0R3JhcGhRTENvbmZpZyIsInJlcSIsInJlc3VsdCIsImNvbmZpZyIsInBhcnNlR3JhcGhRTENvbnRyb2xsZXIiLCJyZXNwb25zZSIsInVwZGF0ZUdyYXBoUUxDb25maWciLCJhdXRoIiwiaXNSZWFkT25seSIsImNyZWF0ZVNhbml0aXplZEVycm9yIiwiUGFyc2UiLCJFcnJvciIsIk9QRVJBVElPTl9GT1JCSURERU4iLCJkYXRhIiwiYm9keSIsInBhcmFtcyIsIm1vdW50Um91dGVzIiwicm91dGUiLCJwcm9taXNlRW5mb3JjZU1hc3RlcktleUFjY2VzcyIsImV4cG9ydHMiLCJfZGVmYXVsdCJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9Sb3V0ZXJzL0dyYXBoUUxSb3V0ZXIuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFBhcnNlIGZyb20gJ3BhcnNlL25vZGUnO1xuaW1wb3J0IFByb21pc2VSb3V0ZXIgZnJvbSAnLi4vUHJvbWlzZVJvdXRlcic7XG5pbXBvcnQgKiBhcyBtaWRkbGV3YXJlIGZyb20gJy4uL21pZGRsZXdhcmVzJztcbmltcG9ydCB7IGNyZWF0ZVNhbml0aXplZEVycm9yIH0gZnJvbSAnLi4vRXJyb3InO1xuXG5jb25zdCBHcmFwaFFMQ29uZmlnUGF0aCA9ICcvZ3JhcGhxbC1jb25maWcnO1xuXG5leHBvcnQgY2xhc3MgR3JhcGhRTFJvdXRlciBleHRlbmRzIFByb21pc2VSb3V0ZXIge1xuICBhc3luYyBnZXRHcmFwaFFMQ29uZmlnKHJlcSkge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlcS5jb25maWcucGFyc2VHcmFwaFFMQ29udHJvbGxlci5nZXRHcmFwaFFMQ29uZmlnKCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHJlc3BvbnNlOiByZXN1bHQsXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIHVwZGF0ZUdyYXBoUUxDb25maWcocmVxKSB7XG4gICAgaWYgKHJlcS5hdXRoLmlzUmVhZE9ubHkpIHtcbiAgICAgIHRocm93IGNyZWF0ZVNhbml0aXplZEVycm9yKFxuICAgICAgICBQYXJzZS5FcnJvci5PUEVSQVRJT05fRk9SQklEREVOLFxuICAgICAgICBcInJlYWQtb25seSBtYXN0ZXJLZXkgaXNuJ3QgYWxsb3dlZCB0byB1cGRhdGUgdGhlIEdyYXBoUUwgY29uZmlnLlwiLFxuICAgICAgICByZXEuY29uZmlnXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVxLmNvbmZpZy5wYXJzZUdyYXBoUUxDb250cm9sbGVyLnVwZGF0ZUdyYXBoUUxDb25maWcocmVxLmJvZHk/LnBhcmFtcyB8fCB7fSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHJlc3BvbnNlOiBkYXRhLFxuICAgIH07XG4gIH1cblxuICBtb3VudFJvdXRlcygpIHtcbiAgICB0aGlzLnJvdXRlKCdHRVQnLCBHcmFwaFFMQ29uZmlnUGF0aCwgbWlkZGxld2FyZS5wcm9taXNlRW5mb3JjZU1hc3RlcktleUFjY2VzcywgcmVxID0+IHtcbiAgICAgIHJldHVybiB0aGlzLmdldEdyYXBoUUxDb25maWcocmVxKTtcbiAgICB9KTtcbiAgICB0aGlzLnJvdXRlKCdQVVQnLCBHcmFwaFFMQ29uZmlnUGF0aCwgbWlkZGxld2FyZS5wcm9taXNlRW5mb3JjZU1hc3RlcktleUFjY2VzcywgcmVxID0+IHtcbiAgICAgIHJldHVybiB0aGlzLnVwZGF0ZUdyYXBoUUxDb25maWcocmVxKTtcbiAgICB9KTtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBHcmFwaFFMUm91dGVyO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxJQUFBQSxLQUFBLEdBQUFDLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBQyxjQUFBLEdBQUFGLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBRSxVQUFBLEdBQUFDLHVCQUFBLENBQUFILE9BQUE7QUFDQSxJQUFBSSxNQUFBLEdBQUFKLE9BQUE7QUFBZ0QsU0FBQUcsd0JBQUFFLENBQUEsRUFBQUMsQ0FBQSw2QkFBQUMsT0FBQSxNQUFBQyxDQUFBLE9BQUFELE9BQUEsSUFBQUUsQ0FBQSxPQUFBRixPQUFBLFlBQUFKLHVCQUFBLFlBQUFBLENBQUFFLENBQUEsRUFBQUMsQ0FBQSxTQUFBQSxDQUFBLElBQUFELENBQUEsSUFBQUEsQ0FBQSxDQUFBSyxVQUFBLFNBQUFMLENBQUEsTUFBQU0sQ0FBQSxFQUFBQyxDQUFBLEVBQUFDLENBQUEsS0FBQUMsU0FBQSxRQUFBQyxPQUFBLEVBQUFWLENBQUEsaUJBQUFBLENBQUEsdUJBQUFBLENBQUEseUJBQUFBLENBQUEsU0FBQVEsQ0FBQSxNQUFBRixDQUFBLEdBQUFMLENBQUEsR0FBQUcsQ0FBQSxHQUFBRCxDQUFBLFFBQUFHLENBQUEsQ0FBQUssR0FBQSxDQUFBWCxDQUFBLFVBQUFNLENBQUEsQ0FBQU0sR0FBQSxDQUFBWixDQUFBLEdBQUFNLENBQUEsQ0FBQU8sR0FBQSxDQUFBYixDQUFBLEVBQUFRLENBQUEsZ0JBQUFQLENBQUEsSUFBQUQsQ0FBQSxnQkFBQUMsQ0FBQSxPQUFBYSxjQUFBLENBQUFDLElBQUEsQ0FBQWYsQ0FBQSxFQUFBQyxDQUFBLE9BQUFNLENBQUEsSUFBQUQsQ0FBQSxHQUFBVSxNQUFBLENBQUFDLGNBQUEsS0FBQUQsTUFBQSxDQUFBRSx3QkFBQSxDQUFBbEIsQ0FBQSxFQUFBQyxDQUFBLE9BQUFNLENBQUEsQ0FBQUssR0FBQSxJQUFBTCxDQUFBLENBQUFNLEdBQUEsSUFBQVAsQ0FBQSxDQUFBRSxDQUFBLEVBQUFQLENBQUEsRUFBQU0sQ0FBQSxJQUFBQyxDQUFBLENBQUFQLENBQUEsSUFBQUQsQ0FBQSxDQUFBQyxDQUFBLFdBQUFPLENBQUEsS0FBQVIsQ0FBQSxFQUFBQyxDQUFBO0FBQUEsU0FBQVAsdUJBQUFNLENBQUEsV0FBQUEsQ0FBQSxJQUFBQSxDQUFBLENBQUFLLFVBQUEsR0FBQUwsQ0FBQSxLQUFBVSxPQUFBLEVBQUFWLENBQUE7QUFFaEQsTUFBTW1CLGlCQUFpQixHQUFHLGlCQUFpQjtBQUVwQyxNQUFNQyxhQUFhLFNBQVNDLHNCQUFhLENBQUM7RUFDL0MsTUFBTUMsZ0JBQWdCQSxDQUFDQyxHQUFHLEVBQUU7SUFDMUIsTUFBTUMsTUFBTSxHQUFHLE1BQU1ELEdBQUcsQ0FBQ0UsTUFBTSxDQUFDQyxzQkFBc0IsQ0FBQ0osZ0JBQWdCLENBQUMsQ0FBQztJQUN6RSxPQUFPO01BQ0xLLFFBQVEsRUFBRUg7SUFDWixDQUFDO0VBQ0g7RUFFQSxNQUFNSSxtQkFBbUJBLENBQUNMLEdBQUcsRUFBRTtJQUM3QixJQUFJQSxHQUFHLENBQUNNLElBQUksQ0FBQ0MsVUFBVSxFQUFFO01BQ3ZCLE1BQU0sSUFBQUMsMkJBQW9CLEVBQ3hCQyxhQUFLLENBQUNDLEtBQUssQ0FBQ0MsbUJBQW1CLEVBQy9CLGlFQUFpRSxFQUNqRVgsR0FBRyxDQUFDRSxNQUNOLENBQUM7SUFDSDtJQUNBLE1BQU1VLElBQUksR0FBRyxNQUFNWixHQUFHLENBQUNFLE1BQU0sQ0FBQ0Msc0JBQXNCLENBQUNFLG1CQUFtQixDQUFDTCxHQUFHLENBQUNhLElBQUksRUFBRUMsTUFBTSxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ2hHLE9BQU87TUFDTFYsUUFBUSxFQUFFUTtJQUNaLENBQUM7RUFDSDtFQUVBRyxXQUFXQSxDQUFBLEVBQUc7SUFDWixJQUFJLENBQUNDLEtBQUssQ0FBQyxLQUFLLEVBQUVwQixpQkFBaUIsRUFBRXRCLFVBQVUsQ0FBQzJDLDZCQUE2QixFQUFFakIsR0FBRyxJQUFJO01BQ3BGLE9BQU8sSUFBSSxDQUFDRCxnQkFBZ0IsQ0FBQ0MsR0FBRyxDQUFDO0lBQ25DLENBQUMsQ0FBQztJQUNGLElBQUksQ0FBQ2dCLEtBQUssQ0FBQyxLQUFLLEVBQUVwQixpQkFBaUIsRUFBRXRCLFVBQVUsQ0FBQzJDLDZCQUE2QixFQUFFakIsR0FBRyxJQUFJO01BQ3BGLE9BQU8sSUFBSSxDQUFDSyxtQkFBbUIsQ0FBQ0wsR0FBRyxDQUFDO0lBQ3RDLENBQUMsQ0FBQztFQUNKO0FBQ0Y7QUFBQ2tCLE9BQUEsQ0FBQXJCLGFBQUEsR0FBQUEsYUFBQTtBQUFBLElBQUFzQixRQUFBLEdBQUFELE9BQUEsQ0FBQS9CLE9BQUEsR0FFY1UsYUFBYSIsImlnbm9yZUxpc3QiOltdfQ==
|