diff --git a/src/server/auth/FakeAuth.ts b/src/server/auth/FakeAuth.ts index bbb5b09..6189a5a 100644 --- a/src/server/auth/FakeAuth.ts +++ b/src/server/auth/FakeAuth.ts @@ -1,4 +1,5 @@ -import { Auth, LoginResult } from '../schemas/Auth' +import { Auth } from '../schemas/Auth' +import { LoginResult } from '../schemas/LoginResult' export class FakeAuth implements Auth { constructor() {} diff --git a/src/server/auth/LdapAuth.ts b/src/server/auth/LdapAuth.ts index 77a4735..dcdcdf2 100644 --- a/src/server/auth/LdapAuth.ts +++ b/src/server/auth/LdapAuth.ts @@ -1,5 +1,6 @@ import { Client } from 'ldapts' -import { Auth, LoginResult } from '../schemas/Auth' +import { Auth } from '../schemas/Auth' +import { LoginResult } from '../schemas/LoginResult' export class LdapAuth implements Auth { constructor( diff --git a/src/server/lib/getIpFromContext.ts b/src/server/lib/getIpFromContext.ts index 8b6f18b..9ce4fad 100644 --- a/src/server/lib/getIpFromContext.ts +++ b/src/server/lib/getIpFromContext.ts @@ -1,6 +1,6 @@ -import { Context } from '../trpc' +import { Request } from 'express' -export function getIpFromContext({ req }: Context) { +export function getIpFromRequest(req: Request) { if (process.env.NODE_ENV === 'development') return '10.7.16.254' if (req.headers['x-forwarded-for']) diff --git a/src/server/schemas/Auth.ts b/src/server/schemas/Auth.ts index 0e23201..a4fb096 100644 --- a/src/server/schemas/Auth.ts +++ b/src/server/schemas/Auth.ts @@ -1,9 +1,4 @@ -export type LoginResult = { - username: string - displayName: string - domain: string - jwt?: string -} +import { LoginResult } from './LoginResult' export interface Auth { login(username: string, password: string): Promise | LoginResult diff --git a/src/server/schemas/JwtPayload.ts b/src/server/schemas/JwtPayload.ts new file mode 100644 index 0000000..13ccad3 --- /dev/null +++ b/src/server/schemas/JwtPayload.ts @@ -0,0 +1,7 @@ +export type JwtPayload = { + username: string + displayName: string + domain: string + iat: number // issued at + exp: number // expires at +} diff --git a/src/server/schemas/LoginResult.ts b/src/server/schemas/LoginResult.ts new file mode 100644 index 0000000..ff67c58 --- /dev/null +++ b/src/server/schemas/LoginResult.ts @@ -0,0 +1,6 @@ +export type LoginResult = { + username: string + displayName: string + domain: string + jwt?: string +} diff --git a/src/server/schemas/Network.ts b/src/server/schemas/Network.ts new file mode 100644 index 0000000..6aac232 --- /dev/null +++ b/src/server/schemas/Network.ts @@ -0,0 +1,6 @@ +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/services/PaFirewall.ts b/src/server/services/PaFirewall.ts index ce903b1..3e22f1c 100644 --- a/src/server/services/PaFirewall.ts +++ b/src/server/services/PaFirewall.ts @@ -113,4 +113,27 @@ export class PaFirewall { } }) } + + async getIpStatus(ip: string) { + const params = new URLSearchParams({ + key: this.key, + type: 'log', + 'log-type': 'userid', + query: `( ip in '${ip}' )`, + nlogs: '1' + }) + + const url = `https://${this.ip}/api/?${params}` + + const response = await fetch(url) + + const data = await response.text() + + const parsedData = xmlParser.parse(data) + + if (parsedData.response.attr_status !== 'success') { + console.log(data) + throw new Error('Failed to get IP status') + } + } } diff --git a/src/server/trpc.ts b/src/server/trpc.ts index eb65574..bc1525a 100644 --- a/src/server/trpc.ts +++ b/src/server/trpc.ts @@ -3,13 +3,14 @@ import * as trpcExpress from '@trpc/server/adapters/express' import { z } from 'zod' import { login } from './lib/login' -import { getIpFromContext } from './lib/getIpFromContext' +import { getIpFromRequest } from './lib/getIpFromContext' import { logout } from './lib/logout' import { PaFirewall } from './services/PaFirewall' // Created for each request function createContext({ req, res }: trpcExpress.CreateExpressContextOptions) { - return { req } + const ip = getIpFromRequest(req) + return { ip } } export type Context = inferAsyncReturnType @@ -18,18 +19,18 @@ export const t = initTRPC.context().create() export const appRouter = t.router({ myIp: t.procedure.query(({ ctx }) => { - return getIpFromContext(ctx) + 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, getIpFromContext(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, getIpFromContext(ctx)) + return await logout(input.username, input.domain, ctx.ip) }), addFirewall: t.procedure