Refactor code
This commit is contained in:
parent
43e86c70cd
commit
9b638c1c73
11 changed files with 38 additions and 39 deletions
|
@ -87,7 +87,7 @@ export default function registerAuthorize(server: MyFastifyInstance): void {
|
||||||
const promptId = nanoid(12);
|
const promptId = nanoid(12);
|
||||||
|
|
||||||
const sessionData = getSessionData(request.session);
|
const sessionData = getSessionData(request.session);
|
||||||
sessionData.prompts.set(promptId, {
|
sessionData.authPrompts.set(promptId, {
|
||||||
clientId: request.query.client_id,
|
clientId: request.query.client_id,
|
||||||
redirectUri: request.query.redirect_uri,
|
redirectUri: request.query.redirect_uri,
|
||||||
scopes: requestedScopes,
|
scopes: requestedScopes,
|
||||||
|
|
|
@ -32,7 +32,7 @@ export default function registerAllow(server: MyFastifyInstance): void {
|
||||||
if (!encryptedTokenKey) throw server.httpErrors.badRequest('Missing etk cookie');
|
if (!encryptedTokenKey) throw server.httpErrors.badRequest('Missing etk cookie');
|
||||||
|
|
||||||
const sessionData = getSessionData(request.session);
|
const sessionData = getSessionData(request.session);
|
||||||
const prompt = sessionData.prompts.get(request.query.prompt_id);
|
const prompt = sessionData.authPrompts.get(request.query.prompt_id);
|
||||||
if (!prompt) throw server.httpErrors.badRequest('Prompt data not found');
|
if (!prompt) throw server.httpErrors.badRequest('Prompt data not found');
|
||||||
if (!prompt.loginInfo) throw server.httpErrors.badRequest('Login data not provided');
|
if (!prompt.loginInfo) throw server.httpErrors.badRequest('Login data not provided');
|
||||||
if (!prompt.loginInfo.symbolInfo) throw server.httpErrors.badRequest('Symbol not provided');
|
if (!prompt.loginInfo.symbolInfo) throw server.httpErrors.badRequest('Symbol not provided');
|
||||||
|
@ -86,6 +86,6 @@ export default function registerAllow(server: MyFastifyInstance): void {
|
||||||
redirectUri.searchParams.set('code', code);
|
redirectUri.searchParams.set('code', code);
|
||||||
if (prompt.state) redirectUri.searchParams.set('state', prompt.state);
|
if (prompt.state) redirectUri.searchParams.set('state', prompt.state);
|
||||||
await reply.redirect(redirectUri.toString());
|
await reply.redirect(redirectUri.toString());
|
||||||
sessionData.prompts.delete(request.query.prompt_id);
|
sessionData.authPrompts.delete(request.query.prompt_id);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
|
@ -27,9 +27,9 @@ export default function registerDeny(server: MyFastifyInstance): void {
|
||||||
await new Promise((resolve) => setTimeout(resolve, 100));
|
await new Promise((resolve) => setTimeout(resolve, 100));
|
||||||
|
|
||||||
const sessionData = getSessionData(request.session);
|
const sessionData = getSessionData(request.session);
|
||||||
const prompt = sessionData.prompts.get(request.query.prompt_id);
|
const prompt = sessionData.authPrompts.get(request.query.prompt_id);
|
||||||
if (!prompt) throw server.httpErrors.badRequest('Prompt data not found');
|
if (!prompt) throw server.httpErrors.badRequest('Prompt data not found');
|
||||||
await reply.redirect(`${prompt.redirectUri}?error=access_denied&error_description=${encodeURIComponent('User denied')}`);
|
await reply.redirect(`${prompt.redirectUri}?error=access_denied&error_description=${encodeURIComponent('User denied')}`);
|
||||||
sessionData.prompts.delete(request.query.prompt_id);
|
sessionData.authPrompts.delete(request.query.prompt_id);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,10 +4,10 @@ import type { ApolloContext, MyFastifyInstance } from '../../types';
|
||||||
import { getSessionData } from '../../utils';
|
import { getSessionData } from '../../utils';
|
||||||
import registerAllow from './allow';
|
import registerAllow from './allow';
|
||||||
import registerDeny from './deny';
|
import registerDeny from './deny';
|
||||||
import CreateUserResolver from './resolvers/create-user-resolver';
|
import CreateUserResolver from './resolvers/authenticate-prompt/create-user-resolver';
|
||||||
import LoginResolver from './resolvers/login-resolver';
|
import LoginResolver from './resolvers/authenticate-prompt/login-resolver';
|
||||||
import PromptInfoResolver from './resolvers/prompt-info-resolver';
|
import PromptInfoResolver from './resolvers/authenticate-prompt/prompt-info-resolver';
|
||||||
import SetSymbolResolver from './resolvers/set-symbol-resolver';
|
import SetSymbolResolver from './resolvers/authenticate-prompt/set-symbol-resolver';
|
||||||
import type { WebsiteAPIContext } from './types';
|
import type { WebsiteAPIContext } from './types';
|
||||||
|
|
||||||
export default async function registerWebsiteApi(server: MyFastifyInstance): Promise<void> {
|
export default async function registerWebsiteApi(server: MyFastifyInstance): Promise<void> {
|
||||||
|
|
|
@ -3,11 +3,11 @@ import { UserInputError } from 'apollo-server-fastify';
|
||||||
import {
|
import {
|
||||||
Arg, Ctx, Mutation, Resolver,
|
Arg, Ctx, Mutation, Resolver,
|
||||||
} from 'type-graphql';
|
} from 'type-graphql';
|
||||||
import database from '../../../database/database';
|
import database from '../../../../database/database';
|
||||||
import User from '../../../database/entities/user';
|
import User from '../../../../database/entities/user';
|
||||||
import { UnknownPromptError } from '../errors';
|
import { UnknownPromptError } from '../../errors';
|
||||||
import CreateUserResult from '../models/create-user-result';
|
import CreateUserResult from '../../models/create-user-result';
|
||||||
import type { WebsiteAPIContext } from '../types';
|
import type { WebsiteAPIContext } from '../../types';
|
||||||
|
|
||||||
@Resolver()
|
@Resolver()
|
||||||
export default class CreateUserResolver {
|
export default class CreateUserResolver {
|
||||||
|
@ -18,7 +18,7 @@ export default class CreateUserResolver {
|
||||||
@Ctx() { sessionData }: WebsiteAPIContext,
|
@Ctx() { sessionData }: WebsiteAPIContext,
|
||||||
): Promise<CreateUserResult> {
|
): Promise<CreateUserResult> {
|
||||||
if (email !== email.trim()) throw new UserInputError('Email should be trimmed');
|
if (email !== email.trim()) throw new UserInputError('Email should be trimmed');
|
||||||
const prompt = sessionData.prompts.get(promptId);
|
const prompt = sessionData.authPrompts.get(promptId);
|
||||||
if (!prompt) throw new UnknownPromptError();
|
if (!prompt) throw new UnknownPromptError();
|
||||||
if (!prompt.loginInfo) throw new UserInputError('Login data not provided');
|
if (!prompt.loginInfo) throw new UserInputError('Login data not provided');
|
||||||
if (!prompt.loginInfo.symbolInfo) throw new UserInputError('Symbol not provided');
|
if (!prompt.loginInfo.symbolInfo) throw new UserInputError('Symbol not provided');
|
|
@ -7,10 +7,10 @@ import {
|
||||||
import {
|
import {
|
||||||
createKey,
|
createKey,
|
||||||
encryptSymmetrical, encryptWithPublicKey, generatePrivatePublicPair, isObject, verifyCaptchaResponse,
|
encryptSymmetrical, encryptWithPublicKey, generatePrivatePublicPair, isObject, verifyCaptchaResponse,
|
||||||
} from '../../../utils';
|
} from '../../../../utils';
|
||||||
import { CaptchaError, InvalidVulcanCredentialsError, UnknownPromptError } from '../errors';
|
import { CaptchaError, InvalidVulcanCredentialsError, UnknownPromptError } from '../../errors';
|
||||||
import LoginResult from '../models/login-result';
|
import LoginResult from '../../models/login-result';
|
||||||
import type { WebsiteAPIContext } from '../types';
|
import type { WebsiteAPIContext } from '../../types';
|
||||||
|
|
||||||
@Resolver()
|
@Resolver()
|
||||||
export default class LoginResolver {
|
export default class LoginResolver {
|
||||||
|
@ -25,7 +25,7 @@ export default class LoginResolver {
|
||||||
): Promise<LoginResult> {
|
): Promise<LoginResult> {
|
||||||
if (username !== username.trim()) throw new UserInputError('Username should be trimmed');
|
if (username !== username.trim()) throw new UserInputError('Username should be trimmed');
|
||||||
if (host !== host.trim()) throw new UserInputError('Host should be trimmed');
|
if (host !== host.trim()) throw new UserInputError('Host should be trimmed');
|
||||||
const prompt = sessionData.prompts.get(promptId);
|
const prompt = sessionData.authPrompts.get(promptId);
|
||||||
if (!prompt) throw new UnknownPromptError();
|
if (!prompt) throw new UnknownPromptError();
|
||||||
if (!await verifyCaptchaResponse(captchaResponse)) throw new CaptchaError();
|
if (!await verifyCaptchaResponse(captchaResponse)) throw new CaptchaError();
|
||||||
const client = new Client(host, () => ({
|
const client = new Client(host, () => ({
|
|
@ -3,12 +3,12 @@ import type { ResolverInterface } from 'type-graphql';
|
||||||
import {
|
import {
|
||||||
Arg, Ctx, FieldResolver, Query, Resolver, Root,
|
Arg, Ctx, FieldResolver, Query, Resolver, Root,
|
||||||
} from 'type-graphql';
|
} from 'type-graphql';
|
||||||
import database from '../../../database/database';
|
import database from '../../../../database/database';
|
||||||
import { getUser } from '../../../graphql/github/sdk';
|
import { getUser } from '../../../../graphql/github/sdk';
|
||||||
import { UnknownPromptError } from '../errors';
|
import { UnknownPromptError } from '../../errors';
|
||||||
import PromptInfo from '../models/prompt-info';
|
import PromptInfo from '../../models/prompt-info';
|
||||||
import type PromptInfoApplication from '../models/prompt-info-application';
|
import type PromptInfoApplication from '../../models/prompt-info-application';
|
||||||
import type { WebsiteAPIContext } from '../types';
|
import type { WebsiteAPIContext } from '../../types';
|
||||||
|
|
||||||
@Resolver(PromptInfo)
|
@Resolver(PromptInfo)
|
||||||
export default class PromptInfoResolver implements ResolverInterface<PromptInfo> {
|
export default class PromptInfoResolver implements ResolverInterface<PromptInfo> {
|
||||||
|
@ -17,7 +17,7 @@ export default class PromptInfoResolver implements ResolverInterface<PromptInfo>
|
||||||
@Arg('promptId') promptId: string,
|
@Arg('promptId') promptId: string,
|
||||||
@Ctx() { sessionData }: WebsiteAPIContext,
|
@Ctx() { sessionData }: WebsiteAPIContext,
|
||||||
): Partial<PromptInfo> {
|
): Partial<PromptInfo> {
|
||||||
const prompt = sessionData.prompts.get(promptId);
|
const prompt = sessionData.authPrompts.get(promptId);
|
||||||
if (!prompt) throw new UnknownPromptError();
|
if (!prompt) throw new UnknownPromptError();
|
||||||
return {
|
return {
|
||||||
id: promptId,
|
id: promptId,
|
|
@ -7,13 +7,13 @@ import _ from 'lodash';
|
||||||
import {
|
import {
|
||||||
Arg, Ctx, Mutation, Resolver,
|
Arg, Ctx, Mutation, Resolver,
|
||||||
} from 'type-graphql';
|
} from 'type-graphql';
|
||||||
import database from '../../../database/database';
|
import database from '../../../../database/database';
|
||||||
import User from '../../../database/entities/user';
|
import User from '../../../../database/entities/user';
|
||||||
import { decryptSymmetrical, decryptWithPrivateKey, encryptSymmetrical } from '../../../utils';
|
import { decryptSymmetrical, decryptWithPrivateKey, encryptSymmetrical } from '../../../../utils';
|
||||||
import { InvalidSymbolError, UnknownPromptError } from '../errors';
|
import { InvalidSymbolError, UnknownPromptError } from '../../errors';
|
||||||
import type LoginStudent from '../models/login-student';
|
import type LoginStudent from '../../models/login-student';
|
||||||
import SetSymbolResult from '../models/set-symbol-result';
|
import SetSymbolResult from '../../models/set-symbol-result';
|
||||||
import type { WebsiteAPIContext } from '../types';
|
import type { WebsiteAPIContext } from '../../types';
|
||||||
|
|
||||||
@Resolver()
|
@Resolver()
|
||||||
export default class SetSymbolResolver {
|
export default class SetSymbolResolver {
|
||||||
|
@ -25,7 +25,7 @@ export default class SetSymbolResolver {
|
||||||
): Promise<SetSymbolResult> {
|
): Promise<SetSymbolResult> {
|
||||||
if (symbol !== symbol.trim()) throw new UserInputError('Symbol should be trimmed');
|
if (symbol !== symbol.trim()) throw new UserInputError('Symbol should be trimmed');
|
||||||
if (symbol !== symbol.toLowerCase()) throw new UserInputError('Symbol should be lowercase');
|
if (symbol !== symbol.toLowerCase()) throw new UserInputError('Symbol should be lowercase');
|
||||||
const prompt = sessionData.prompts.get(promptId);
|
const prompt = sessionData.authPrompts.get(promptId);
|
||||||
if (!prompt) throw new UnknownPromptError();
|
if (!prompt) throw new UnknownPromptError();
|
||||||
if (!prompt.loginInfo) throw new UserInputError('Login data not provided');
|
if (!prompt.loginInfo) throw new UserInputError('Login data not provided');
|
||||||
const { loginInfo } = prompt;
|
const { loginInfo } = prompt;
|
|
@ -1,5 +1,5 @@
|
||||||
import type { Prompt } from './types';
|
import type { AuthPrompt } from './types';
|
||||||
|
|
||||||
export default class SessionData {
|
export default class SessionData {
|
||||||
public prompts = new Map<string, Prompt>();
|
public authPrompts = new Map<string, AuthPrompt>();
|
||||||
}
|
}
|
||||||
|
|
|
@ -27,7 +27,7 @@ export interface CodeChallenge {
|
||||||
method: 'plain' | 'S256';
|
method: 'plain' | 'S256';
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface Prompt {
|
export interface AuthPrompt {
|
||||||
clientId: string;
|
clientId: string;
|
||||||
redirectUri: string;
|
redirectUri: string;
|
||||||
scopes: string[],
|
scopes: string[],
|
||||||
|
|
|
@ -5,7 +5,6 @@ import _ from 'lodash';
|
||||||
import { ParamError } from '../errors';
|
import { ParamError } from '../errors';
|
||||||
import SessionData from '../session-data';
|
import SessionData from '../session-data';
|
||||||
import type { SerializedSDK, Session } from '../types';
|
import type { SerializedSDK, Session } from '../types';
|
||||||
import { sha256 } from './crypto';
|
|
||||||
|
|
||||||
export * from './crypto';
|
export * from './crypto';
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue