@openinc/parse-server-opendash
Version:
Parse Server Cloud Code for open.INC Stack.
67 lines (66 loc) • 2.36 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.createToken = createToken;
exports.createUrl = createUrl;
exports.consumeToken = consumeToken;
exports.isExpired = isExpired;
exports.createSessionToken = createSessionToken;
const crypto_1 = require("crypto");
const config_1 = require("../features/config");
const types_1 = require("../types");
async function createToken(type, userId, url) {
const key = (0, crypto_1.randomUUID)();
const token = new types_1.Core_Token({
key: key,
url: createUrl(url, key),
payload: {
type,
userId,
},
});
await token.save(null, { useMasterKey: true });
return { token: token.key, url: token.url };
}
function createUrl(url, token) {
if (!config_1.ConfigInstance.getInstance().getBoolean("ENFORCE_APP_URL")) {
return url.replace("{{token}}", token);
}
const appUrl = new URL(config_1.ConfigInstance.getInstance().get("APP_URL"));
const providedUrl = new URL(url.replace("{{token}}", token));
providedUrl.protocol = appUrl.protocol;
providedUrl.host = appUrl.host;
return providedUrl.toString();
}
async function consumeToken(type, key, doNotConsume = false) {
const token = await new Parse.Query(types_1.Core_Token)
.equalTo("key", key)
.equalTo("used", false)
.first({ useMasterKey: true });
if (!token) {
throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, "Token not found.");
}
if (!doNotConsume) {
token.used = true;
await token.save({ used: true }, { useMasterKey: true });
}
if (isExpired(token)) {
throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, "Token expired.");
}
return token.payload;
}
function isExpired(token) {
return token.createdAt.valueOf() + 1000 * 60 * 60 * 24 < Date.now();
}
async function createSessionToken(user, installationId, createdWith) {
const sessionToken = "r:" + (0, crypto_1.randomBytes)(64).toString("hex").slice(0, 32);
const session = new Parse.Object("_Session", {
sessionToken,
user,
createdWith,
installationId,
restricted: false,
expiresAt: new Date(Date.now() + 1000 * 60 * 60 * 24 * 365),
});
await session.save(null, { useMasterKey: true });
return sessionToken;
}
;