diff --git a/src/server/index.ts b/src/server/index.ts index 419bfd2..2a6e713 100644 --- a/src/server/index.ts +++ b/src/server/index.ts @@ -1,5 +1,7 @@ import { server } from './server' +process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0' + export const SERVER_PORT = process.env.PORT || 8080 server.listen(SERVER_PORT, () => { diff --git a/src/server/lib/login.ts b/src/server/lib/login.ts index 0927588..c99ed96 100644 --- a/src/server/lib/login.ts +++ b/src/server/lib/login.ts @@ -5,8 +5,6 @@ import { PaFirewall } from '../paloalto/PaFirewall' import { paHosts } from '../db/pa' -process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0' - export async function login(username: string, password: string, ip: string) { const ldapClient = new Client({ url: 'ldap://10.7.0.18' @@ -19,7 +17,7 @@ export async function login(username: string, password: string, ip: string) { const pa = new PaFirewall(paHosts[0].ip, paHosts[0].key) - await pa.mapUserIDToIP(username, ip, user.domain) + await pa.login(username, ip, user.domain) return user } catch (error) { diff --git a/src/server/lib/logout.ts b/src/server/lib/logout.ts new file mode 100644 index 0000000..c67ce1f --- /dev/null +++ b/src/server/lib/logout.ts @@ -0,0 +1,16 @@ +import { PaFirewall } from '../paloalto/PaFirewall' + +import { paHosts } from '../db/pa' + +export async function logout(username: string, domain: string, ip: string) { + try { + const pa = new PaFirewall(paHosts[0].ip, paHosts[0].key) + + await pa.logout(username, ip, domain) + + return true + } catch (error) { + console.log(error) + throw new Error('Logout failed') + } +} diff --git a/src/server/paloalto/PaFirewall.ts b/src/server/paloalto/PaFirewall.ts index 0a810cc..a7a4e2e 100644 --- a/src/server/paloalto/PaFirewall.ts +++ b/src/server/paloalto/PaFirewall.ts @@ -3,8 +3,8 @@ const MAP_TIMEOUT_IN_MINUTES = process.env.MAPPING_TIMEOUT || '720' // 12 horas export class PaFirewall { constructor(private ip: string, private key: string) {} - async mapUserIDToIP(username: string, ip: string, domain: string) { - const command = this.createCommand(username, ip, domain) + async login(username: string, ip: string, domain: string) { + const command = this.createLoginCommand(username, ip, domain) const url = `https://${this.ip}/api/?type=user-id&key=${this.key}&cmd=${command}` const response = await fetch(url, { method: 'POST' }) @@ -23,16 +23,49 @@ export class PaFirewall { return true } - private createCommand(username: string, ip: string, domain: string) { + async logout(username: string, ip: string, domain: string) { + const command = this.createLogoutCommand(username, ip, domain) + const url = `https://${this.ip}/api/?type=user-id&key=${this.key}&cmd=${command}` + + const response = await fetch(url, { method: 'POST' }) + + const data = await response.text() + + const success = data.includes('status="success"') + + if (!success) { + console.log(data) + throw new Error('Failed to logout user') + } + + console.log(`Logged out user ${username} from IP ${ip}`) + + return true + } + + private createLoginCommand(username: string, ip: string, domain: string) { return ` 1.0 update - + ` } + + private createLogoutCommand(username: string, ip: string, domain: string) { + return ` + + 1.0 + update + + + + + + ` + } } diff --git a/src/server/trpc.ts b/src/server/trpc.ts index 3aae7be..8ac445b 100644 --- a/src/server/trpc.ts +++ b/src/server/trpc.ts @@ -4,6 +4,7 @@ import * as trpcExpress from '@trpc/server/adapters/express' import { z } from 'zod' import { login } from './lib/login' import { getIpFromContext } from './lib/getIpFromContext' +import { logout } from './lib/logout' // Created for each request function createContext({ req, res }: trpcExpress.CreateExpressContextOptions) { @@ -23,6 +24,11 @@ export const appRouter = t.router({ .input(z.object({ username: z.string(), password: z.string() })) .mutation(async ({ input, ctx }) => { return await login(input.username, input.password, getIpFromContext(ctx)) + }), + 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)) }) }) diff --git a/src/web/components/LoggedCard.vue b/src/web/components/LoggedCard.vue new file mode 100644 index 0000000..2b6b20d --- /dev/null +++ b/src/web/components/LoggedCard.vue @@ -0,0 +1,48 @@ + + + diff --git a/src/web/views/Login.vue b/src/web/views/Login.vue index 43c098b..ec9df92 100644 --- a/src/web/views/Login.vue +++ b/src/web/views/Login.vue @@ -1,9 +1,11 @@