2017-12-24 09:02:57 +00:00
|
|
|
import UserScalarToken from "./models/UserScalarToken";
|
|
|
|
import { LogService } from "matrix-js-snippets";
|
|
|
|
import Upstream from "./models/Upstream";
|
|
|
|
import User from "./models/User";
|
|
|
|
|
|
|
|
export class ScalarStore {
|
|
|
|
|
2018-03-24 03:01:56 +00:00
|
|
|
public static async doesUserHaveTokensForAllUpstreams(userId: string): Promise<boolean> {
|
2018-03-24 03:26:14 +00:00
|
|
|
const scalarTokens = await UserScalarToken.findAll({where: {userId: userId}});
|
|
|
|
const upstreamTokenIds = scalarTokens.filter(t => !t.isDimensionToken).map(t => t.upstreamId);
|
|
|
|
const hasDimensionToken = scalarTokens.filter(t => t.isDimensionToken).length >= 1;
|
|
|
|
|
|
|
|
if (!hasDimensionToken) {
|
|
|
|
LogService.warn("ScalarStore", "User " + userId + " is missing a Dimension scalar token");
|
|
|
|
return false;
|
|
|
|
}
|
2017-12-24 09:02:57 +00:00
|
|
|
|
2018-03-24 03:26:14 +00:00
|
|
|
const upstreams = await Upstream.findAll();
|
|
|
|
for (const upstream of upstreams) {
|
|
|
|
if (upstreamTokenIds.indexOf(upstream.id) === -1) {
|
|
|
|
LogService.warn("ScalarStore", "user " + userId + " is missing a scalar token for upstream " + upstream.id + " (" + upstream.name + ")");
|
|
|
|
return false;
|
2017-12-24 09:02:57 +00:00
|
|
|
}
|
2018-03-24 03:26:14 +00:00
|
|
|
}
|
2017-12-24 09:02:57 +00:00
|
|
|
|
2018-03-24 03:26:14 +00:00
|
|
|
return true;
|
2017-12-24 09:02:57 +00:00
|
|
|
}
|
|
|
|
|
2018-03-24 03:01:56 +00:00
|
|
|
public static async getTokenOwner(scalarToken: string, ignoreUpstreams?: boolean): Promise<User> {
|
2018-03-24 03:26:14 +00:00
|
|
|
const tokens = await UserScalarToken.findAll({
|
2017-12-24 09:02:57 +00:00
|
|
|
where: {isDimensionToken: true, scalarToken: scalarToken},
|
|
|
|
include: [User]
|
|
|
|
});
|
2018-03-24 03:26:14 +00:00
|
|
|
if (!tokens || tokens.length === 0) throw new Error("Invalid token");
|
|
|
|
|
|
|
|
const user = tokens[0].user;
|
|
|
|
if (ignoreUpstreams) return user; // skip upstreams check
|
|
|
|
|
|
|
|
const hasAllTokens = await ScalarStore.doesUserHaveTokensForAllUpstreams(user.userId);
|
|
|
|
if (!hasAllTokens) {
|
|
|
|
throw new Error("Invalid token"); // They are missing an upstream, so we'll lie and say they are not authorized
|
|
|
|
}
|
|
|
|
return user;
|
2017-12-24 09:02:57 +00:00
|
|
|
}
|
|
|
|
|
2017-12-24 09:09:40 +00:00
|
|
|
private constructor() {
|
|
|
|
}
|
2017-12-24 09:02:57 +00:00
|
|
|
}
|