parse-server 8.6.0 → 9.0.0-alpha.10
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 +92 -83
- package/lib/Adapters/Push/PushAdapter.js +2 -2
- package/lib/Config.js +10 -5
- package/lib/Deprecator/Deprecations.js +1 -7
- package/lib/GraphQL/ParseGraphQLServer.js +48 -15
- package/lib/Options/Definitions.js +3 -9
- package/lib/Options/docs.js +2 -3
- package/lib/Options/index.js +1 -1
- package/lib/ParseServer.js +2 -3
- package/lib/Routers/FunctionsRouter.js +2 -2
- package/lib/cloud-code/Parse.Cloud.js +3 -3
- package/lib/middlewares.js +3 -7
- package/lib/rest.js +2 -2
- package/package.json +8 -8
- package/types/Options/index.d.ts +0 -1
- package/lib/Routers/PublicAPIRouter.js +0 -264
- package/public_html/invalid_link.html +0 -45
- package/public_html/invalid_verification_link.html +0 -68
- package/public_html/link_send_fail.html +0 -45
- package/public_html/link_send_success.html +0 -45
- package/public_html/password_reset_success.html +0 -27
- package/public_html/verify_email_success.html +0 -27
|
@@ -1,264 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.default = exports.PublicAPIRouter = void 0;
|
|
7
|
-
var _PromiseRouter = _interopRequireDefault(require("../PromiseRouter"));
|
|
8
|
-
var _Config = _interopRequireDefault(require("../Config"));
|
|
9
|
-
var _express = _interopRequireDefault(require("express"));
|
|
10
|
-
var _path = _interopRequireDefault(require("path"));
|
|
11
|
-
var _fs = _interopRequireDefault(require("fs"));
|
|
12
|
-
var _querystring = _interopRequireDefault(require("querystring"));
|
|
13
|
-
var _node = require("parse/node");
|
|
14
|
-
var _Deprecator = _interopRequireDefault(require("../Deprecator/Deprecator"));
|
|
15
|
-
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
16
|
-
const public_html = _path.default.resolve(__dirname, '../../public_html');
|
|
17
|
-
const views = _path.default.resolve(__dirname, '../../views');
|
|
18
|
-
class PublicAPIRouter extends _PromiseRouter.default {
|
|
19
|
-
constructor() {
|
|
20
|
-
super();
|
|
21
|
-
_Deprecator.default.logRuntimeDeprecation({
|
|
22
|
-
usage: 'PublicAPIRouter',
|
|
23
|
-
solution: 'pages.enableRouter'
|
|
24
|
-
});
|
|
25
|
-
}
|
|
26
|
-
verifyEmail(req) {
|
|
27
|
-
const {
|
|
28
|
-
token: rawToken
|
|
29
|
-
} = req.query;
|
|
30
|
-
const token = rawToken && typeof rawToken !== 'string' ? rawToken.toString() : rawToken;
|
|
31
|
-
const appId = req.params.appId;
|
|
32
|
-
const config = _Config.default.get(appId);
|
|
33
|
-
if (!config) {
|
|
34
|
-
this.invalidRequest();
|
|
35
|
-
}
|
|
36
|
-
if (!config.publicServerURL) {
|
|
37
|
-
return this.missingPublicServerURL();
|
|
38
|
-
}
|
|
39
|
-
if (!token) {
|
|
40
|
-
return this.invalidLink(req);
|
|
41
|
-
}
|
|
42
|
-
const userController = config.userController;
|
|
43
|
-
return userController.verifyEmail(token).then(() => {
|
|
44
|
-
return Promise.resolve({
|
|
45
|
-
status: 302,
|
|
46
|
-
location: `${config.verifyEmailSuccessURL}`
|
|
47
|
-
});
|
|
48
|
-
}, () => {
|
|
49
|
-
return this.invalidVerificationLink(req, token);
|
|
50
|
-
});
|
|
51
|
-
}
|
|
52
|
-
resendVerificationEmail(req) {
|
|
53
|
-
const username = req.body?.username;
|
|
54
|
-
const appId = req.params.appId;
|
|
55
|
-
const config = _Config.default.get(appId);
|
|
56
|
-
if (!config) {
|
|
57
|
-
this.invalidRequest();
|
|
58
|
-
}
|
|
59
|
-
if (!config.publicServerURL) {
|
|
60
|
-
return this.missingPublicServerURL();
|
|
61
|
-
}
|
|
62
|
-
const token = req.body.token;
|
|
63
|
-
if (!username && !token) {
|
|
64
|
-
return this.invalidLink(req);
|
|
65
|
-
}
|
|
66
|
-
const userController = config.userController;
|
|
67
|
-
return userController.resendVerificationEmail(username, req, token).then(() => {
|
|
68
|
-
return Promise.resolve({
|
|
69
|
-
status: 302,
|
|
70
|
-
location: `${config.linkSendSuccessURL}`
|
|
71
|
-
});
|
|
72
|
-
}, () => {
|
|
73
|
-
return Promise.resolve({
|
|
74
|
-
status: 302,
|
|
75
|
-
location: `${config.linkSendFailURL}`
|
|
76
|
-
});
|
|
77
|
-
});
|
|
78
|
-
}
|
|
79
|
-
changePassword(req) {
|
|
80
|
-
return new Promise((resolve, reject) => {
|
|
81
|
-
const config = _Config.default.get(req.query.id);
|
|
82
|
-
if (!config) {
|
|
83
|
-
this.invalidRequest();
|
|
84
|
-
}
|
|
85
|
-
if (!config.publicServerURL) {
|
|
86
|
-
return resolve({
|
|
87
|
-
status: 404,
|
|
88
|
-
text: 'Not found.'
|
|
89
|
-
});
|
|
90
|
-
}
|
|
91
|
-
// Should we keep the file in memory or leave like that?
|
|
92
|
-
_fs.default.readFile(_path.default.resolve(views, 'choose_password'), 'utf-8', (err, data) => {
|
|
93
|
-
if (err) {
|
|
94
|
-
return reject(err);
|
|
95
|
-
}
|
|
96
|
-
data = data.replace('PARSE_SERVER_URL', `'${config.publicServerURL}'`);
|
|
97
|
-
resolve({
|
|
98
|
-
text: data
|
|
99
|
-
});
|
|
100
|
-
});
|
|
101
|
-
});
|
|
102
|
-
}
|
|
103
|
-
requestResetPassword(req) {
|
|
104
|
-
const config = req.config;
|
|
105
|
-
if (!config) {
|
|
106
|
-
this.invalidRequest();
|
|
107
|
-
}
|
|
108
|
-
if (!config.publicServerURL) {
|
|
109
|
-
return this.missingPublicServerURL();
|
|
110
|
-
}
|
|
111
|
-
const {
|
|
112
|
-
token: rawToken
|
|
113
|
-
} = req.query;
|
|
114
|
-
const token = rawToken && typeof rawToken !== 'string' ? rawToken.toString() : rawToken;
|
|
115
|
-
if (!token) {
|
|
116
|
-
return this.invalidLink(req);
|
|
117
|
-
}
|
|
118
|
-
return config.userController.checkResetTokenValidity(token).then(() => {
|
|
119
|
-
const params = _querystring.default.stringify({
|
|
120
|
-
token,
|
|
121
|
-
id: config.applicationId,
|
|
122
|
-
app: config.appName
|
|
123
|
-
});
|
|
124
|
-
return Promise.resolve({
|
|
125
|
-
status: 302,
|
|
126
|
-
location: `${config.choosePasswordURL}?${params}`
|
|
127
|
-
});
|
|
128
|
-
}, () => {
|
|
129
|
-
return this.invalidLink(req);
|
|
130
|
-
});
|
|
131
|
-
}
|
|
132
|
-
resetPassword(req) {
|
|
133
|
-
const config = req.config;
|
|
134
|
-
if (!config) {
|
|
135
|
-
this.invalidRequest();
|
|
136
|
-
}
|
|
137
|
-
if (!config.publicServerURL) {
|
|
138
|
-
return this.missingPublicServerURL();
|
|
139
|
-
}
|
|
140
|
-
const {
|
|
141
|
-
new_password,
|
|
142
|
-
token: rawToken
|
|
143
|
-
} = req.body || {};
|
|
144
|
-
const token = rawToken && typeof rawToken !== 'string' ? rawToken.toString() : rawToken;
|
|
145
|
-
if ((!token || !new_password) && req.xhr === false) {
|
|
146
|
-
return this.invalidLink(req);
|
|
147
|
-
}
|
|
148
|
-
if (!token) {
|
|
149
|
-
throw new _node.Parse.Error(_node.Parse.Error.OTHER_CAUSE, 'Missing token');
|
|
150
|
-
}
|
|
151
|
-
if (!new_password) {
|
|
152
|
-
throw new _node.Parse.Error(_node.Parse.Error.PASSWORD_MISSING, 'Missing password');
|
|
153
|
-
}
|
|
154
|
-
return config.userController.updatePassword(token, new_password).then(() => {
|
|
155
|
-
return Promise.resolve({
|
|
156
|
-
success: true
|
|
157
|
-
});
|
|
158
|
-
}, err => {
|
|
159
|
-
return Promise.resolve({
|
|
160
|
-
success: false,
|
|
161
|
-
err
|
|
162
|
-
});
|
|
163
|
-
}).then(result => {
|
|
164
|
-
const queryString = {
|
|
165
|
-
token: token,
|
|
166
|
-
id: config.applicationId,
|
|
167
|
-
error: result.err,
|
|
168
|
-
app: config.appName
|
|
169
|
-
};
|
|
170
|
-
if (result?.err === 'The password reset link has expired') {
|
|
171
|
-
delete queryString.token;
|
|
172
|
-
queryString.token = token;
|
|
173
|
-
}
|
|
174
|
-
const params = _querystring.default.stringify(queryString);
|
|
175
|
-
if (req.xhr) {
|
|
176
|
-
if (result.success) {
|
|
177
|
-
return Promise.resolve({
|
|
178
|
-
status: 200,
|
|
179
|
-
response: 'Password successfully reset'
|
|
180
|
-
});
|
|
181
|
-
}
|
|
182
|
-
if (result.err) {
|
|
183
|
-
throw new _node.Parse.Error(_node.Parse.Error.OTHER_CAUSE, `${result.err}`);
|
|
184
|
-
}
|
|
185
|
-
}
|
|
186
|
-
const location = result.success ? `${config.passwordResetSuccessURL}` : `${config.choosePasswordURL}?${params}`;
|
|
187
|
-
return Promise.resolve({
|
|
188
|
-
status: 302,
|
|
189
|
-
location
|
|
190
|
-
});
|
|
191
|
-
});
|
|
192
|
-
}
|
|
193
|
-
invalidLink(req) {
|
|
194
|
-
return Promise.resolve({
|
|
195
|
-
status: 302,
|
|
196
|
-
location: req.config.invalidLinkURL
|
|
197
|
-
});
|
|
198
|
-
}
|
|
199
|
-
invalidVerificationLink(req, token) {
|
|
200
|
-
const config = req.config;
|
|
201
|
-
if (req.params.appId) {
|
|
202
|
-
const params = _querystring.default.stringify({
|
|
203
|
-
appId: req.params.appId,
|
|
204
|
-
token
|
|
205
|
-
});
|
|
206
|
-
return Promise.resolve({
|
|
207
|
-
status: 302,
|
|
208
|
-
location: `${config.invalidVerificationLinkURL}?${params}`
|
|
209
|
-
});
|
|
210
|
-
} else {
|
|
211
|
-
return this.invalidLink(req);
|
|
212
|
-
}
|
|
213
|
-
}
|
|
214
|
-
missingPublicServerURL() {
|
|
215
|
-
return Promise.resolve({
|
|
216
|
-
text: 'Not found.',
|
|
217
|
-
status: 404
|
|
218
|
-
});
|
|
219
|
-
}
|
|
220
|
-
invalidRequest() {
|
|
221
|
-
const error = new Error();
|
|
222
|
-
error.status = 403;
|
|
223
|
-
error.message = 'unauthorized';
|
|
224
|
-
throw error;
|
|
225
|
-
}
|
|
226
|
-
setConfig(req) {
|
|
227
|
-
req.config = _Config.default.get(req.params.appId);
|
|
228
|
-
return Promise.resolve();
|
|
229
|
-
}
|
|
230
|
-
mountRoutes() {
|
|
231
|
-
this.route('GET', '/apps/:appId/verify_email', req => {
|
|
232
|
-
this.setConfig(req);
|
|
233
|
-
}, req => {
|
|
234
|
-
return this.verifyEmail(req);
|
|
235
|
-
});
|
|
236
|
-
this.route('POST', '/apps/:appId/resend_verification_email', req => {
|
|
237
|
-
this.setConfig(req);
|
|
238
|
-
}, req => {
|
|
239
|
-
return this.resendVerificationEmail(req);
|
|
240
|
-
});
|
|
241
|
-
this.route('GET', '/apps/choose_password', req => {
|
|
242
|
-
return this.changePassword(req);
|
|
243
|
-
});
|
|
244
|
-
this.route('POST', '/apps/:appId/request_password_reset', req => {
|
|
245
|
-
this.setConfig(req);
|
|
246
|
-
}, req => {
|
|
247
|
-
return this.resetPassword(req);
|
|
248
|
-
});
|
|
249
|
-
this.route('GET', '/apps/:appId/request_password_reset', req => {
|
|
250
|
-
this.setConfig(req);
|
|
251
|
-
}, req => {
|
|
252
|
-
return this.requestResetPassword(req);
|
|
253
|
-
});
|
|
254
|
-
}
|
|
255
|
-
expressRouter() {
|
|
256
|
-
const router = _express.default.Router();
|
|
257
|
-
router.use('/apps', _express.default.static(public_html));
|
|
258
|
-
router.use('/', super.expressRouter());
|
|
259
|
-
return router;
|
|
260
|
-
}
|
|
261
|
-
}
|
|
262
|
-
exports.PublicAPIRouter = PublicAPIRouter;
|
|
263
|
-
var _default = exports.default = PublicAPIRouter;
|
|
264
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfUHJvbWlzZVJvdXRlciIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJyZXF1aXJlIiwiX0NvbmZpZyIsIl9leHByZXNzIiwiX3BhdGgiLCJfZnMiLCJfcXVlcnlzdHJpbmciLCJfbm9kZSIsIl9EZXByZWNhdG9yIiwiZSIsIl9fZXNNb2R1bGUiLCJkZWZhdWx0IiwicHVibGljX2h0bWwiLCJwYXRoIiwicmVzb2x2ZSIsIl9fZGlybmFtZSIsInZpZXdzIiwiUHVibGljQVBJUm91dGVyIiwiUHJvbWlzZVJvdXRlciIsImNvbnN0cnVjdG9yIiwiRGVwcmVjYXRvciIsImxvZ1J1bnRpbWVEZXByZWNhdGlvbiIsInVzYWdlIiwic29sdXRpb24iLCJ2ZXJpZnlFbWFpbCIsInJlcSIsInRva2VuIiwicmF3VG9rZW4iLCJxdWVyeSIsInRvU3RyaW5nIiwiYXBwSWQiLCJwYXJhbXMiLCJjb25maWciLCJDb25maWciLCJnZXQiLCJpbnZhbGlkUmVxdWVzdCIsInB1YmxpY1NlcnZlclVSTCIsIm1pc3NpbmdQdWJsaWNTZXJ2ZXJVUkwiLCJpbnZhbGlkTGluayIsInVzZXJDb250cm9sbGVyIiwidGhlbiIsIlByb21pc2UiLCJzdGF0dXMiLCJsb2NhdGlvbiIsInZlcmlmeUVtYWlsU3VjY2Vzc1VSTCIsImludmFsaWRWZXJpZmljYXRpb25MaW5rIiwicmVzZW5kVmVyaWZpY2F0aW9uRW1haWwiLCJ1c2VybmFtZSIsImJvZHkiLCJsaW5rU2VuZFN1Y2Nlc3NVUkwiLCJsaW5rU2VuZEZhaWxVUkwiLCJjaGFuZ2VQYXNzd29yZCIsInJlamVjdCIsImlkIiwidGV4dCIsImZzIiwicmVhZEZpbGUiLCJlcnIiLCJkYXRhIiwicmVwbGFjZSIsInJlcXVlc3RSZXNldFBhc3N3b3JkIiwiY2hlY2tSZXNldFRva2VuVmFsaWRpdHkiLCJxcyIsInN0cmluZ2lmeSIsImFwcGxpY2F0aW9uSWQiLCJhcHAiLCJhcHBOYW1lIiwiY2hvb3NlUGFzc3dvcmRVUkwiLCJyZXNldFBhc3N3b3JkIiwibmV3X3Bhc3N3b3JkIiwieGhyIiwiUGFyc2UiLCJFcnJvciIsIk9USEVSX0NBVVNFIiwiUEFTU1dPUkRfTUlTU0lORyIsInVwZGF0ZVBhc3N3b3JkIiwic3VjY2VzcyIsInJlc3VsdCIsInF1ZXJ5U3RyaW5nIiwiZXJyb3IiLCJyZXNwb25zZSIsInBhc3N3b3JkUmVzZXRTdWNjZXNzVVJMIiwiaW52YWxpZExpbmtVUkwiLCJpbnZhbGlkVmVyaWZpY2F0aW9uTGlua1VSTCIsIm1lc3NhZ2UiLCJzZXRDb25maWciLCJtb3VudFJvdXRlcyIsInJvdXRlIiwiZXhwcmVzc1JvdXRlciIsInJvdXRlciIsImV4cHJlc3MiLCJSb3V0ZXIiLCJ1c2UiLCJzdGF0aWMiLCJleHBvcnRzIiwiX2RlZmF1bHQiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvUm91dGVycy9QdWJsaWNBUElSb3V0ZXIuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFByb21pc2VSb3V0ZXIgZnJvbSAnLi4vUHJvbWlzZVJvdXRlcic7XG5pbXBvcnQgQ29uZmlnIGZyb20gJy4uL0NvbmZpZyc7XG5pbXBvcnQgZXhwcmVzcyBmcm9tICdleHByZXNzJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IGZzIGZyb20gJ2ZzJztcbmltcG9ydCBxcyBmcm9tICdxdWVyeXN0cmluZyc7XG5pbXBvcnQgeyBQYXJzZSB9IGZyb20gJ3BhcnNlL25vZGUnO1xuaW1wb3J0IERlcHJlY2F0b3IgZnJvbSAnLi4vRGVwcmVjYXRvci9EZXByZWNhdG9yJztcblxuY29uc3QgcHVibGljX2h0bWwgPSBwYXRoLnJlc29sdmUoX19kaXJuYW1lLCAnLi4vLi4vcHVibGljX2h0bWwnKTtcbmNvbnN0IHZpZXdzID0gcGF0aC5yZXNvbHZlKF9fZGlybmFtZSwgJy4uLy4uL3ZpZXdzJyk7XG5cbmV4cG9ydCBjbGFzcyBQdWJsaWNBUElSb3V0ZXIgZXh0ZW5kcyBQcm9taXNlUm91dGVyIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgICBEZXByZWNhdG9yLmxvZ1J1bnRpbWVEZXByZWNhdGlvbih7XG4gICAgICB1c2FnZTogJ1B1YmxpY0FQSVJvdXRlcicsXG4gICAgICBzb2x1dGlvbjogJ3BhZ2VzLmVuYWJsZVJvdXRlcidcbiAgICB9KTtcbiAgfVxuICB2ZXJpZnlFbWFpbChyZXEpIHtcbiAgICBjb25zdCB7IHRva2VuOiByYXdUb2tlbiB9ID0gcmVxLnF1ZXJ5O1xuICAgIGNvbnN0IHRva2VuID0gcmF3VG9rZW4gJiYgdHlwZW9mIHJhd1Rva2VuICE9PSAnc3RyaW5nJyA/IHJhd1Rva2VuLnRvU3RyaW5nKCkgOiByYXdUb2tlbjtcblxuICAgIGNvbnN0IGFwcElkID0gcmVxLnBhcmFtcy5hcHBJZDtcbiAgICBjb25zdCBjb25maWcgPSBDb25maWcuZ2V0KGFwcElkKTtcblxuICAgIGlmICghY29uZmlnKSB7XG4gICAgICB0aGlzLmludmFsaWRSZXF1ZXN0KCk7XG4gICAgfVxuXG4gICAgaWYgKCFjb25maWcucHVibGljU2VydmVyVVJMKSB7XG4gICAgICByZXR1cm4gdGhpcy5taXNzaW5nUHVibGljU2VydmVyVVJMKCk7XG4gICAgfVxuXG4gICAgaWYgKCF0b2tlbikge1xuICAgICAgcmV0dXJuIHRoaXMuaW52YWxpZExpbmsocmVxKTtcbiAgICB9XG5cbiAgICBjb25zdCB1c2VyQ29udHJvbGxlciA9IGNvbmZpZy51c2VyQ29udHJvbGxlcjtcbiAgICByZXR1cm4gdXNlckNvbnRyb2xsZXIudmVyaWZ5RW1haWwodG9rZW4pLnRoZW4oXG4gICAgICAoKSA9PiB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoe1xuICAgICAgICAgIHN0YXR1czogMzAyLFxuICAgICAgICAgIGxvY2F0aW9uOiBgJHtjb25maWcudmVyaWZ5RW1haWxTdWNjZXNzVVJMfWAsXG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICAgICgpID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW52YWxpZFZlcmlmaWNhdGlvbkxpbmsocmVxLCB0b2tlbik7XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIHJlc2VuZFZlcmlmaWNhdGlvbkVtYWlsKHJlcSkge1xuICAgIGNvbnN0IHVzZXJuYW1lID0gcmVxLmJvZHk/LnVzZXJuYW1lO1xuICAgIGNvbnN0IGFwcElkID0gcmVxLnBhcmFtcy5hcHBJZDtcbiAgICBjb25zdCBjb25maWcgPSBDb25maWcuZ2V0KGFwcElkKTtcblxuICAgIGlmICghY29uZmlnKSB7XG4gICAgICB0aGlzLmludmFsaWRSZXF1ZXN0KCk7XG4gICAgfVxuXG4gICAgaWYgKCFjb25maWcucHVibGljU2VydmVyVVJMKSB7XG4gICAgICByZXR1cm4gdGhpcy5taXNzaW5nUHVibGljU2VydmVyVVJMKCk7XG4gICAgfVxuXG4gICAgY29uc3QgdG9rZW4gPSByZXEuYm9keS50b2tlbjtcblxuICAgIGlmICghdXNlcm5hbWUgJiYgIXRva2VuKSB7XG4gICAgICByZXR1cm4gdGhpcy5pbnZhbGlkTGluayhyZXEpO1xuICAgIH1cblxuICAgIGNvbnN0IHVzZXJDb250cm9sbGVyID0gY29uZmlnLnVzZXJDb250cm9sbGVyO1xuXG4gICAgcmV0dXJuIHVzZXJDb250cm9sbGVyLnJlc2VuZFZlcmlmaWNhdGlvbkVtYWlsKHVzZXJuYW1lLCByZXEsIHRva2VuKS50aGVuKFxuICAgICAgKCkgPT4ge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHtcbiAgICAgICAgICBzdGF0dXM6IDMwMixcbiAgICAgICAgICBsb2NhdGlvbjogYCR7Y29uZmlnLmxpbmtTZW5kU3VjY2Vzc1VSTH1gLFxuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgICAoKSA9PiB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoe1xuICAgICAgICAgIHN0YXR1czogMzAyLFxuICAgICAgICAgIGxvY2F0aW9uOiBgJHtjb25maWcubGlua1NlbmRGYWlsVVJMfWAsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICBjaGFuZ2VQYXNzd29yZChyZXEpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgY29uc3QgY29uZmlnID0gQ29uZmlnLmdldChyZXEucXVlcnkuaWQpO1xuXG4gICAgICBpZiAoIWNvbmZpZykge1xuICAgICAgICB0aGlzLmludmFsaWRSZXF1ZXN0KCk7XG4gICAgICB9XG5cbiAgICAgIGlmICghY29uZmlnLnB1YmxpY1NlcnZlclVSTCkge1xuICAgICAgICByZXR1cm4gcmVzb2x2ZSh7XG4gICAgICAgICAgc3RhdHVzOiA0MDQsXG4gICAgICAgICAgdGV4dDogJ05vdCBmb3VuZC4nLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIC8vIFNob3VsZCB3ZSBrZWVwIHRoZSBmaWxlIGluIG1lbW9yeSBvciBsZWF2ZSBsaWtlIHRoYXQ/XG4gICAgICBmcy5yZWFkRmlsZShwYXRoLnJlc29sdmUodmlld3MsICdjaG9vc2VfcGFzc3dvcmQnKSwgJ3V0Zi04JywgKGVyciwgZGF0YSkgPT4ge1xuICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgcmV0dXJuIHJlamVjdChlcnIpO1xuICAgICAgICB9XG4gICAgICAgIGRhdGEgPSBkYXRhLnJlcGxhY2UoJ1BBUlNFX1NFUlZFUl9VUkwnLCBgJyR7Y29uZmlnLnB1YmxpY1NlcnZlclVSTH0nYCk7XG4gICAgICAgIHJlc29sdmUoe1xuICAgICAgICAgIHRleHQ6IGRhdGEsXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICByZXF1ZXN0UmVzZXRQYXNzd29yZChyZXEpIHtcbiAgICBjb25zdCBjb25maWcgPSByZXEuY29uZmlnO1xuXG4gICAgaWYgKCFjb25maWcpIHtcbiAgICAgIHRoaXMuaW52YWxpZFJlcXVlc3QoKTtcbiAgICB9XG5cbiAgICBpZiAoIWNvbmZpZy5wdWJsaWNTZXJ2ZXJVUkwpIHtcbiAgICAgIHJldHVybiB0aGlzLm1pc3NpbmdQdWJsaWNTZXJ2ZXJVUkwoKTtcbiAgICB9XG5cbiAgICBjb25zdCB7IHRva2VuOiByYXdUb2tlbiB9ID0gcmVxLnF1ZXJ5O1xuICAgIGNvbnN0IHRva2VuID0gcmF3VG9rZW4gJiYgdHlwZW9mIHJhd1Rva2VuICE9PSAnc3RyaW5nJyA/IHJhd1Rva2VuLnRvU3RyaW5nKCkgOiByYXdUb2tlbjtcblxuICAgIGlmICghdG9rZW4pIHtcbiAgICAgIHJldHVybiB0aGlzLmludmFsaWRMaW5rKHJlcSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbmZpZy51c2VyQ29udHJvbGxlci5jaGVja1Jlc2V0VG9rZW5WYWxpZGl0eSh0b2tlbikudGhlbihcbiAgICAgICgpID0+IHtcbiAgICAgICAgY29uc3QgcGFyYW1zID0gcXMuc3RyaW5naWZ5KHtcbiAgICAgICAgICB0b2tlbixcbiAgICAgICAgICBpZDogY29uZmlnLmFwcGxpY2F0aW9uSWQsXG4gICAgICAgICAgYXBwOiBjb25maWcuYXBwTmFtZSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoe1xuICAgICAgICAgIHN0YXR1czogMzAyLFxuICAgICAgICAgIGxvY2F0aW9uOiBgJHtjb25maWcuY2hvb3NlUGFzc3dvcmRVUkx9PyR7cGFyYW1zfWAsXG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICAgICgpID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW52YWxpZExpbmsocmVxKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgcmVzZXRQYXNzd29yZChyZXEpIHtcbiAgICBjb25zdCBjb25maWcgPSByZXEuY29uZmlnO1xuXG4gICAgaWYgKCFjb25maWcpIHtcbiAgICAgIHRoaXMuaW52YWxpZFJlcXVlc3QoKTtcbiAgICB9XG5cbiAgICBpZiAoIWNvbmZpZy5wdWJsaWNTZXJ2ZXJVUkwpIHtcbiAgICAgIHJldHVybiB0aGlzLm1pc3NpbmdQdWJsaWNTZXJ2ZXJVUkwoKTtcbiAgICB9XG5cbiAgICBjb25zdCB7IG5ld19wYXNzd29yZCwgdG9rZW46IHJhd1Rva2VuIH0gPSByZXEuYm9keSB8fCB7fTtcbiAgICBjb25zdCB0b2tlbiA9IHJhd1Rva2VuICYmIHR5cGVvZiByYXdUb2tlbiAhPT0gJ3N0cmluZycgPyByYXdUb2tlbi50b1N0cmluZygpIDogcmF3VG9rZW47XG5cbiAgICBpZiAoKCF0b2tlbiB8fCAhbmV3X3Bhc3N3b3JkKSAmJiByZXEueGhyID09PSBmYWxzZSkge1xuICAgICAgcmV0dXJuIHRoaXMuaW52YWxpZExpbmsocmVxKTtcbiAgICB9XG5cbiAgICBpZiAoIXRva2VuKSB7XG4gICAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoUGFyc2UuRXJyb3IuT1RIRVJfQ0FVU0UsICdNaXNzaW5nIHRva2VuJyk7XG4gICAgfVxuXG4gICAgaWYgKCFuZXdfcGFzc3dvcmQpIHtcbiAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5QQVNTV09SRF9NSVNTSU5HLCAnTWlzc2luZyBwYXNzd29yZCcpO1xuICAgIH1cblxuICAgIHJldHVybiBjb25maWcudXNlckNvbnRyb2xsZXJcbiAgICAgIC51cGRhdGVQYXNzd29yZCh0b2tlbiwgbmV3X3Bhc3N3b3JkKVxuICAgICAgLnRoZW4oXG4gICAgICAgICgpID0+IHtcbiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHtcbiAgICAgICAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIGVyciA9PiB7XG4gICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh7XG4gICAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICAgIGVycixcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgKVxuICAgICAgLnRoZW4ocmVzdWx0ID0+IHtcbiAgICAgICAgY29uc3QgcXVlcnlTdHJpbmcgPSB7XG4gICAgICAgICAgdG9rZW46IHRva2VuLFxuICAgICAgICAgIGlkOiBjb25maWcuYXBwbGljYXRpb25JZCxcbiAgICAgICAgICBlcnJvcjogcmVzdWx0LmVycixcbiAgICAgICAgICBhcHA6IGNvbmZpZy5hcHBOYW1lLFxuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChyZXN1bHQ/LmVyciA9PT0gJ1RoZSBwYXNzd29yZCByZXNldCBsaW5rIGhhcyBleHBpcmVkJykge1xuICAgICAgICAgIGRlbGV0ZSBxdWVyeVN0cmluZy50b2tlbjtcbiAgICAgICAgICBxdWVyeVN0cmluZy50b2tlbiA9IHRva2VuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHBhcmFtcyA9IHFzLnN0cmluZ2lmeShxdWVyeVN0cmluZyk7XG5cbiAgICAgICAgaWYgKHJlcS54aHIpIHtcbiAgICAgICAgICBpZiAocmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoe1xuICAgICAgICAgICAgICBzdGF0dXM6IDIwMCxcbiAgICAgICAgICAgICAgcmVzcG9uc2U6ICdQYXNzd29yZCBzdWNjZXNzZnVsbHkgcmVzZXQnLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChyZXN1bHQuZXJyKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoUGFyc2UuRXJyb3IuT1RIRVJfQ0FVU0UsIGAke3Jlc3VsdC5lcnJ9YCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbG9jYXRpb24gPSByZXN1bHQuc3VjY2Vzc1xuICAgICAgICAgID8gYCR7Y29uZmlnLnBhc3N3b3JkUmVzZXRTdWNjZXNzVVJMfWBcbiAgICAgICAgICA6IGAke2NvbmZpZy5jaG9vc2VQYXNzd29yZFVSTH0/JHtwYXJhbXN9YDtcblxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHtcbiAgICAgICAgICBzdGF0dXM6IDMwMixcbiAgICAgICAgICBsb2NhdGlvbixcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgfVxuXG4gIGludmFsaWRMaW5rKHJlcSkge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoe1xuICAgICAgc3RhdHVzOiAzMDIsXG4gICAgICBsb2NhdGlvbjogcmVxLmNvbmZpZy5pbnZhbGlkTGlua1VSTCxcbiAgICB9KTtcbiAgfVxuXG4gIGludmFsaWRWZXJpZmljYXRpb25MaW5rKHJlcSwgdG9rZW4pIHtcbiAgICBjb25zdCBjb25maWcgPSByZXEuY29uZmlnO1xuICAgIGlmIChyZXEucGFyYW1zLmFwcElkKSB7XG4gICAgICBjb25zdCBwYXJhbXMgPSBxcy5zdHJpbmdpZnkoe1xuICAgICAgICBhcHBJZDogcmVxLnBhcmFtcy5hcHBJZCxcbiAgICAgICAgdG9rZW4sXG4gICAgICB9KTtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoe1xuICAgICAgICBzdGF0dXM6IDMwMixcbiAgICAgICAgbG9jYXRpb246IGAke2NvbmZpZy5pbnZhbGlkVmVyaWZpY2F0aW9uTGlua1VSTH0/JHtwYXJhbXN9YCxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5pbnZhbGlkTGluayhyZXEpO1xuICAgIH1cbiAgfVxuXG4gIG1pc3NpbmdQdWJsaWNTZXJ2ZXJVUkwoKSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh7XG4gICAgICB0ZXh0OiAnTm90IGZvdW5kLicsXG4gICAgICBzdGF0dXM6IDQwNCxcbiAgICB9KTtcbiAgfVxuXG4gIGludmFsaWRSZXF1ZXN0KCkge1xuICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKCk7XG4gICAgZXJyb3Iuc3RhdHVzID0gNDAzO1xuICAgIGVycm9yLm1lc3NhZ2UgPSAndW5hdXRob3JpemVkJztcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxuXG4gIHNldENvbmZpZyhyZXEpIHtcbiAgICByZXEuY29uZmlnID0gQ29uZmlnLmdldChyZXEucGFyYW1zLmFwcElkKTtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gIH1cblxuICBtb3VudFJvdXRlcygpIHtcbiAgICB0aGlzLnJvdXRlKFxuICAgICAgJ0dFVCcsXG4gICAgICAnL2FwcHMvOmFwcElkL3ZlcmlmeV9lbWFpbCcsXG4gICAgICByZXEgPT4ge1xuICAgICAgICB0aGlzLnNldENvbmZpZyhyZXEpO1xuICAgICAgfSxcbiAgICAgIHJlcSA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLnZlcmlmeUVtYWlsKHJlcSk7XG4gICAgICB9XG4gICAgKTtcblxuICAgIHRoaXMucm91dGUoXG4gICAgICAnUE9TVCcsXG4gICAgICAnL2FwcHMvOmFwcElkL3Jlc2VuZF92ZXJpZmljYXRpb25fZW1haWwnLFxuICAgICAgcmVxID0+IHtcbiAgICAgICAgdGhpcy5zZXRDb25maWcocmVxKTtcbiAgICAgIH0sXG4gICAgICByZXEgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5yZXNlbmRWZXJpZmljYXRpb25FbWFpbChyZXEpO1xuICAgICAgfVxuICAgICk7XG5cbiAgICB0aGlzLnJvdXRlKCdHRVQnLCAnL2FwcHMvY2hvb3NlX3Bhc3N3b3JkJywgcmVxID0+IHtcbiAgICAgIHJldHVybiB0aGlzLmNoYW5nZVBhc3N3b3JkKHJlcSk7XG4gICAgfSk7XG5cbiAgICB0aGlzLnJvdXRlKFxuICAgICAgJ1BPU1QnLFxuICAgICAgJy9hcHBzLzphcHBJZC9yZXF1ZXN0X3Bhc3N3b3JkX3Jlc2V0JyxcbiAgICAgIHJlcSA9PiB7XG4gICAgICAgIHRoaXMuc2V0Q29uZmlnKHJlcSk7XG4gICAgICB9LFxuICAgICAgcmVxID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVzZXRQYXNzd29yZChyZXEpO1xuICAgICAgfVxuICAgICk7XG5cbiAgICB0aGlzLnJvdXRlKFxuICAgICAgJ0dFVCcsXG4gICAgICAnL2FwcHMvOmFwcElkL3JlcXVlc3RfcGFzc3dvcmRfcmVzZXQnLFxuICAgICAgcmVxID0+IHtcbiAgICAgICAgdGhpcy5zZXRDb25maWcocmVxKTtcbiAgICAgIH0sXG4gICAgICByZXEgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5yZXF1ZXN0UmVzZXRQYXNzd29yZChyZXEpO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICBleHByZXNzUm91dGVyKCkge1xuICAgIGNvbnN0IHJvdXRlciA9IGV4cHJlc3MuUm91dGVyKCk7XG4gICAgcm91dGVyLnVzZSgnL2FwcHMnLCBleHByZXNzLnN0YXRpYyhwdWJsaWNfaHRtbCkpO1xuICAgIHJvdXRlci51c2UoJy8nLCBzdXBlci5leHByZXNzUm91dGVyKCkpO1xuICAgIHJldHVybiByb3V0ZXI7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgUHVibGljQVBJUm91dGVyO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxJQUFBQSxjQUFBLEdBQUFDLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBQyxPQUFBLEdBQUFGLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBRSxRQUFBLEdBQUFILHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBRyxLQUFBLEdBQUFKLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBSSxHQUFBLEdBQUFMLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBSyxZQUFBLEdBQUFOLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBTSxLQUFBLEdBQUFOLE9BQUE7QUFDQSxJQUFBTyxXQUFBLEdBQUFSLHNCQUFBLENBQUFDLE9BQUE7QUFBa0QsU0FBQUQsdUJBQUFTLENBQUEsV0FBQUEsQ0FBQSxJQUFBQSxDQUFBLENBQUFDLFVBQUEsR0FBQUQsQ0FBQSxLQUFBRSxPQUFBLEVBQUFGLENBQUE7QUFFbEQsTUFBTUcsV0FBVyxHQUFHQyxhQUFJLENBQUNDLE9BQU8sQ0FBQ0MsU0FBUyxFQUFFLG1CQUFtQixDQUFDO0FBQ2hFLE1BQU1DLEtBQUssR0FBR0gsYUFBSSxDQUFDQyxPQUFPLENBQUNDLFNBQVMsRUFBRSxhQUFhLENBQUM7QUFFN0MsTUFBTUUsZUFBZSxTQUFTQyxzQkFBYSxDQUFDO0VBQ2pEQyxXQUFXQSxDQUFBLEVBQUc7SUFDWixLQUFLLENBQUMsQ0FBQztJ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
|
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
<!DOCTYPE html>
|
|
2
|
-
<!-- This page is displayed when someone navigates to a verify email or reset password link
|
|
3
|
-
but their security token is wrong. This can either mean the user has clicked on a
|
|
4
|
-
stale link (i.e. re-click on a password reset link after resetting their password) or
|
|
5
|
-
(rarely) this could be a sign of a malicious user trying to tamper with your app.
|
|
6
|
-
-->
|
|
7
|
-
<html>
|
|
8
|
-
<head>
|
|
9
|
-
<title>Invalid Link</title>
|
|
10
|
-
<style type='text/css'>
|
|
11
|
-
.container {
|
|
12
|
-
border-width: 0px;
|
|
13
|
-
display: block;
|
|
14
|
-
font: inherit;
|
|
15
|
-
font-family: 'Helvetica Neue', Helvetica;
|
|
16
|
-
font-size: 16px;
|
|
17
|
-
height: 30px;
|
|
18
|
-
line-height: 16px;
|
|
19
|
-
margin: 45px 0px 0px 45px;
|
|
20
|
-
padding: 0px 8px 0px 8px;
|
|
21
|
-
position: relative;
|
|
22
|
-
vertical-align: baseline;
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
h1, h2, h3, h4, h5 {
|
|
26
|
-
color: #0067AB;
|
|
27
|
-
display: block;
|
|
28
|
-
font: inherit;
|
|
29
|
-
font-family: 'Open Sans', 'Helvetica Neue', Helvetica;
|
|
30
|
-
font-size: 30px;
|
|
31
|
-
font-weight: 600;
|
|
32
|
-
height: 30px;
|
|
33
|
-
line-height: 30px;
|
|
34
|
-
margin: 0 0 15px 0;
|
|
35
|
-
padding: 0 0 0 0;
|
|
36
|
-
}
|
|
37
|
-
</style>
|
|
38
|
-
</head>
|
|
39
|
-
|
|
40
|
-
<body>
|
|
41
|
-
<div class="container">
|
|
42
|
-
<h1>Invalid Link</h1>
|
|
43
|
-
</div>
|
|
44
|
-
</body>
|
|
45
|
-
</html>
|
|
@@ -1,68 +0,0 @@
|
|
|
1
|
-
<!DOCTYPE html>
|
|
2
|
-
<!-- This page is displayed when someone navigates to a verify email or reset password link
|
|
3
|
-
but their security token is wrong. This can either mean the user has clicked on a
|
|
4
|
-
stale link (i.e. re-click on a password reset link after resetting their password) or
|
|
5
|
-
(rarely) this could be a sign of a malicious user trying to tamper with your app.
|
|
6
|
-
-->
|
|
7
|
-
<html>
|
|
8
|
-
<head>
|
|
9
|
-
<title>Invalid Link</title>
|
|
10
|
-
<style type='text/css'>
|
|
11
|
-
.container {
|
|
12
|
-
border-width: 0px;
|
|
13
|
-
display: block;
|
|
14
|
-
font: inherit;
|
|
15
|
-
font-family: 'Helvetica Neue', Helvetica;
|
|
16
|
-
font-size: 16px;
|
|
17
|
-
height: 30px;
|
|
18
|
-
line-height: 16px;
|
|
19
|
-
margin: 45px 0px 0px 45px;
|
|
20
|
-
padding: 0px 8px 0px 8px;
|
|
21
|
-
position: relative;
|
|
22
|
-
vertical-align: baseline;
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
h1, h2, h3, h4, h5 {
|
|
26
|
-
color: #0067AB;
|
|
27
|
-
display: block;
|
|
28
|
-
font: inherit;
|
|
29
|
-
font-family: 'Open Sans', 'Helvetica Neue', Helvetica;
|
|
30
|
-
font-size: 30px;
|
|
31
|
-
font-weight: 600;
|
|
32
|
-
height: 30px;
|
|
33
|
-
line-height: 30px;
|
|
34
|
-
margin: 0 0 15px 0;
|
|
35
|
-
padding: 0 0 0 0;
|
|
36
|
-
}
|
|
37
|
-
</style>
|
|
38
|
-
</head>
|
|
39
|
-
<script type="text/javascript">
|
|
40
|
-
function getUrlParameter(name) {
|
|
41
|
-
name = name.replace(/[\[]/, '\\[').replace(/[\]]/, '\\]');
|
|
42
|
-
var regex = new RegExp('[\\?&]' + name + '=([^&#]*)');
|
|
43
|
-
var results = regex.exec(location.search);
|
|
44
|
-
return results === null ? '' : decodeURIComponent(results[1].replace(/\+/g, ' '));
|
|
45
|
-
};
|
|
46
|
-
|
|
47
|
-
window.onload = addDataToForm;
|
|
48
|
-
|
|
49
|
-
function addDataToForm() {
|
|
50
|
-
const token = getUrlParameter("token");
|
|
51
|
-
document.getElementById("token").value = token;
|
|
52
|
-
|
|
53
|
-
var appId = getUrlParameter("appId");
|
|
54
|
-
document.getElementById("resendForm").action = '/apps/' + appId + '/resend_verification_email'
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
</script>
|
|
58
|
-
|
|
59
|
-
<body>
|
|
60
|
-
<div class="container">
|
|
61
|
-
<h1>Invalid Verification Link</h1>
|
|
62
|
-
<form id="resendForm" method="POST" action="/resend_verification_email">
|
|
63
|
-
<input id="token" class="form-control" name="token" type="hidden" value="">
|
|
64
|
-
<button type="submit" class="btn btn-default">Resend Link</button>
|
|
65
|
-
</form>
|
|
66
|
-
</div>
|
|
67
|
-
</body>
|
|
68
|
-
</html>
|
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
<!DOCTYPE html>
|
|
2
|
-
<!-- This page is displayed when someone navigates to a verify email link with an invalid
|
|
3
|
-
security token and requests a link resend. This page is displayed when the username from
|
|
4
|
-
the original link is invalid or if the email of that user has already been verfieid when
|
|
5
|
-
the resend request is made
|
|
6
|
-
-->
|
|
7
|
-
<html>
|
|
8
|
-
<head>
|
|
9
|
-
<title>Invalid Link</title>
|
|
10
|
-
<style type='text/css'>
|
|
11
|
-
.container {
|
|
12
|
-
border-width: 0px;
|
|
13
|
-
display: block;
|
|
14
|
-
font: inherit;
|
|
15
|
-
font-family: 'Helvetica Neue', Helvetica;
|
|
16
|
-
font-size: 16px;
|
|
17
|
-
height: 30px;
|
|
18
|
-
line-height: 16px;
|
|
19
|
-
margin: 45px 0px 0px 45px;
|
|
20
|
-
padding: 0px 8px 0px 8px;
|
|
21
|
-
position: relative;
|
|
22
|
-
vertical-align: baseline;
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
h1, h2, h3, h4, h5 {
|
|
26
|
-
color: #0067AB;
|
|
27
|
-
display: block;
|
|
28
|
-
font: inherit;
|
|
29
|
-
font-family: 'Open Sans', 'Helvetica Neue', Helvetica;
|
|
30
|
-
font-size: 30px;
|
|
31
|
-
font-weight: 600;
|
|
32
|
-
height: 30px;
|
|
33
|
-
line-height: 30px;
|
|
34
|
-
margin: 0 0 15px 0;
|
|
35
|
-
padding: 0 0 0 0;
|
|
36
|
-
}
|
|
37
|
-
</style>
|
|
38
|
-
</head>
|
|
39
|
-
|
|
40
|
-
<body>
|
|
41
|
-
<div class="container">
|
|
42
|
-
<h1>No link sent. User not found or email already verified</h1>
|
|
43
|
-
</div>
|
|
44
|
-
</body>
|
|
45
|
-
</html>
|
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
<!DOCTYPE html>
|
|
2
|
-
<!-- This page is displayed when someone navigates to a verify email link with an invalid
|
|
3
|
-
security token and requests a link resend. This page is displayed when the username
|
|
4
|
-
from the original verification link has been found and a new verification link has
|
|
5
|
-
been successfully sent to the corresponding stored email
|
|
6
|
-
-->
|
|
7
|
-
<html>
|
|
8
|
-
<head>
|
|
9
|
-
<title>Invalid Link</title>
|
|
10
|
-
<style type='text/css'>
|
|
11
|
-
.container {
|
|
12
|
-
border-width: 0px;
|
|
13
|
-
display: block;
|
|
14
|
-
font: inherit;
|
|
15
|
-
font-family: 'Helvetica Neue', Helvetica;
|
|
16
|
-
font-size: 16px;
|
|
17
|
-
height: 30px;
|
|
18
|
-
line-height: 16px;
|
|
19
|
-
margin: 45px 0px 0px 45px;
|
|
20
|
-
padding: 0px 8px 0px 8px;
|
|
21
|
-
position: relative;
|
|
22
|
-
vertical-align: baseline;
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
h1, h2, h3, h4, h5 {
|
|
26
|
-
color: #0067AB;
|
|
27
|
-
display: block;
|
|
28
|
-
font: inherit;
|
|
29
|
-
font-family: 'Open Sans', 'Helvetica Neue', Helvetica;
|
|
30
|
-
font-size: 30px;
|
|
31
|
-
font-weight: 600;
|
|
32
|
-
height: 30px;
|
|
33
|
-
line-height: 30px;
|
|
34
|
-
margin: 0 0 15px 0;
|
|
35
|
-
padding: 0 0 0 0;
|
|
36
|
-
}
|
|
37
|
-
</style>
|
|
38
|
-
</head>
|
|
39
|
-
|
|
40
|
-
<body>
|
|
41
|
-
<div class="container">
|
|
42
|
-
<h1>Link Sent! Check your email.</h1>
|
|
43
|
-
</div>
|
|
44
|
-
</body>
|
|
45
|
-
</html>
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
<!DOCTYPE html>
|
|
2
|
-
<html>
|
|
3
|
-
<!-- This page is displayed whenever someone has successfully reset their password.
|
|
4
|
-
Pro and Enterprise accounts may edit this page and tell Parse to use that custom
|
|
5
|
-
version in their Parse app. See the App Settigns page for more information.
|
|
6
|
-
This page will be called with the query param 'username'
|
|
7
|
-
-->
|
|
8
|
-
<head>
|
|
9
|
-
<title>Password Reset</title>
|
|
10
|
-
<style type='text/css'>
|
|
11
|
-
h1 {
|
|
12
|
-
color: #0067AB;
|
|
13
|
-
display: block;
|
|
14
|
-
font: inherit;
|
|
15
|
-
font-family: 'Open Sans', 'Helvetica Neue', Helvetica;
|
|
16
|
-
font-size: 30px;
|
|
17
|
-
font-weight: 600;
|
|
18
|
-
height: 30px;
|
|
19
|
-
line-height: 30px;
|
|
20
|
-
margin: 45px 0px 0px 45px;
|
|
21
|
-
padding: 0px 8px 0px 8px;
|
|
22
|
-
}
|
|
23
|
-
</style>
|
|
24
|
-
<body>
|
|
25
|
-
<h1>Successfully updated your password!</h1>
|
|
26
|
-
</body>
|
|
27
|
-
</html>
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
<!DOCTYPE html>
|
|
2
|
-
<html>
|
|
3
|
-
<!-- This page is displayed whenever someone has successfully reset their password.
|
|
4
|
-
Pro and Enterprise accounts may edit this page and tell Parse to use that custom
|
|
5
|
-
version in their Parse app. See the App Settigns page for more information.
|
|
6
|
-
This page will be called with the query param 'username'
|
|
7
|
-
-->
|
|
8
|
-
<head>
|
|
9
|
-
<title>Email Verification</title>
|
|
10
|
-
<style type='text/css'>
|
|
11
|
-
h1 {
|
|
12
|
-
color: #0067AB;
|
|
13
|
-
display: block;
|
|
14
|
-
font: inherit;
|
|
15
|
-
font-family: 'Open Sans', 'Helvetica Neue', Helvetica;
|
|
16
|
-
font-size: 30px;
|
|
17
|
-
font-weight: 600;
|
|
18
|
-
height: 30px;
|
|
19
|
-
line-height: 30px;
|
|
20
|
-
margin: 45px 0px 0px 45px;
|
|
21
|
-
padding: 0px 8px 0px 8px;
|
|
22
|
-
}
|
|
23
|
-
</style>
|
|
24
|
-
<body>
|
|
25
|
-
<h1>Successfully verified your email!</h1>
|
|
26
|
-
</body>
|
|
27
|
-
</html>
|