diff --git a/src/server/lib/autoLogin.ts b/src/server/lib/autoLogin.ts new file mode 100644 index 0000000..b95148f --- /dev/null +++ b/src/server/lib/autoLogin.ts @@ -0,0 +1,12 @@ +import { PaFirewallService } from '../services/PaFirewallService' +import { db } from '../prisma' + +export async function autoLogin(username: string, domain: string, ip: string) { + console.log('AutoLogin?', username, domain, ip) + + const paHosts = await db.paHost.findMany() + + const pa = new PaFirewallService(paHosts[0].ip, paHosts[0].key) + + return await pa.login(username, ip, domain) +} diff --git a/src/server/lib/getIpFromContext.ts b/src/server/lib/getIpFromRequest.ts similarity index 100% rename from src/server/lib/getIpFromContext.ts rename to src/server/lib/getIpFromRequest.ts diff --git a/src/server/schemas/Network.ts b/src/server/schemas/Network.ts deleted file mode 100644 index dab7c16..0000000 --- a/src/server/schemas/Network.ts +++ /dev/null @@ -1,6 +0,0 @@ -export type NetworkInfo = { - ip: string - source: 'IP' | 'X-Forwarded-For' - status: 'Mapped' | 'Expired' | 'ERROR' | 'Prohibited' | 'Unknown' - // campus: 'PP' | 'DR' | 'RT' | 'JD' -} diff --git a/src/server/trpc.ts b/src/server/trpc.ts index 04dd383..b287c0f 100644 --- a/src/server/trpc.ts +++ b/src/server/trpc.ts @@ -1,37 +1,58 @@ -import { initTRPC, inferAsyncReturnType } from '@trpc/server' +import { initTRPC, inferAsyncReturnType, TRPCError } from '@trpc/server' import * as trpcExpress from '@trpc/server/adapters/express' import { z } from 'zod' import { login } from './lib/login' -import { getIpFromRequest } from './lib/getIpFromContext' +import { getIpFromRequest } from './lib/getIpFromRequest' import { logout } from './lib/logout' import { PaFirewallService } from './services/PaFirewallService' +import { jwtService } from './lib/jwt' +import { autoLogin } from './lib/autoLogin' // Created for each request function createContext({ req, res }: trpcExpress.CreateExpressContextOptions) { const ip = getIpFromRequest(req) - return { ip } + const token = req.headers.authorization?.split(' ')[1] + + const jwtPayload = token ? jwtService.verifyToken(token) : null + + return { ip, user: jwtPayload } } export type Context = inferAsyncReturnType export const t = initTRPC.context().create() +const { query, mutation, input } = t.procedure + export const appRouter = t.router({ - myIp: t.procedure.query(({ ctx }) => { + myIp: query(({ ctx }) => { + if (!ctx.ip) throw new Error('Erro ao obter endereço IP') return ctx.ip }), - login: t.procedure - .input(z.object({ username: z.string(), password: z.string() })) - .mutation(async ({ input, ctx }) => { - return await login(input.username, input.password, ctx.ip) - }), - logout: t.procedure - .input(z.object({ username: z.string(), domain: z.string() })) - .mutation(async ({ input, ctx }) => { - return await logout(input.username, input.domain, ctx.ip) - }), + login: input( + z.object({ username: z.string(), password: z.string() }) + ).mutation(async ({ input, ctx }) => { + return await login(input.username, input.password, ctx.ip) + }), + logout: input( + z.object({ username: z.string(), domain: z.string() }) + ).mutation(async ({ input, ctx }) => { + return await logout(input.username, input.domain, ctx.ip) + }), + + autoLogin: mutation(async ({ ctx }) => { + if (!ctx.user) + throw new TRPCError({ + message: 'Erro ao obter usuário', + code: 'UNAUTHORIZED' + }) + + const { username, domain } = ctx.user + + return await autoLogin(username, ctx.ip, domain) + }), addFirewall: t.procedure .input( diff --git a/src/web/composables/useToken.ts b/src/web/composables/useToken.ts new file mode 100644 index 0000000..e69de29