diff --git a/server/package-lock.json b/server/package-lock.json index bad15d6..6ab234e 100755 --- a/server/package-lock.json +++ b/server/package-lock.json @@ -1,12 +1,12 @@ { "name": "ifms-pti-svr", - "version": "2.12.2", + "version": "2.12.3", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "ifms-pti-svr", - "version": "2.12.2", + "version": "2.12.3", "license": "ISC", "dependencies": { "@prisma/client": "^3.11.0", diff --git a/server/package.json b/server/package.json index 352d9c2..7be849d 100755 --- a/server/package.json +++ b/server/package.json @@ -1,6 +1,6 @@ { "name": "ifms-pti-svr", - "version": "2.12.2", + "version": "2.12.3", "description": "Servidor do Portal de TI do IFMS", "main": "src/index.js", "scripts": { diff --git a/server/src/resolvers/Mutation/addPAHost.js b/server/src/resolvers/Mutation/addPAHost.js new file mode 100644 index 0000000..0846925 --- /dev/null +++ b/server/src/resolvers/Mutation/addPAHost.js @@ -0,0 +1,25 @@ +import { addHost } from '../../lib/paloalto' +import { logSuccess } from '../../lib/logger' + +export async function addPAHost( + parent, + { data: { cidr, user, password, description, note } }, + { auth } +) { + const host = await addHost({ + cidr, + user, + password, + description, + note, + owner: auth + }) + + if (host) + logSuccess({ + message: `Usuário ${auth.sAMAccountName} (${auth.displayName}) adicionou um novo host Palo Alto (${host.cidr}).`, + tags: ['paloalto'] + }) + + return host +} \ No newline at end of file diff --git a/server/src/resolvers/Mutation/createResetToken.js b/server/src/resolvers/Mutation/createResetToken.js new file mode 100644 index 0000000..d277779 --- /dev/null +++ b/server/src/resolvers/Mutation/createResetToken.js @@ -0,0 +1,5 @@ +import { ResetToken } from '../../classes/ResetToken' + +export async function createResetToken(parent, { data }, { auth }) { + return ResetToken.createToken(data.username, auth.sAMAccountName) +} \ No newline at end of file diff --git a/server/src/resolvers/Mutation/delPAHost.js b/server/src/resolvers/Mutation/delPAHost.js new file mode 100644 index 0000000..b567ecd --- /dev/null +++ b/server/src/resolvers/Mutation/delPAHost.js @@ -0,0 +1,10 @@ +import prisma from '../../prisma' + +export async function delPAHost(parent, { id }, { auth }) { + const host = await prisma.pAHost.findUnique({ where: { id } }) + + if (host.ownerId != auth.id) + throw new Error('Você não pode apagar o host de outro usuário') + + return prisma.pAHost.delete({ where: { id } }) +} \ No newline at end of file diff --git a/server/src/resolvers/Mutation/deleteExpiredTokens.js b/server/src/resolvers/Mutation/deleteExpiredTokens.js new file mode 100644 index 0000000..f3f3abf --- /dev/null +++ b/server/src/resolvers/Mutation/deleteExpiredTokens.js @@ -0,0 +1,5 @@ +import { ResetToken } from '../../classes/ResetToken' + +export async function deleteExpiredTokens() { + return `Tokens deletados ${await ResetToken.deleteExpiredTokens()}` +} \ No newline at end of file diff --git a/server/src/resolvers/Mutation/importUsers.js b/server/src/resolvers/Mutation/importUsers.js new file mode 100644 index 0000000..4b9c34b --- /dev/null +++ b/server/src/resolvers/Mutation/importUsers.js @@ -0,0 +1,6 @@ +import { User } from '../../classes/User' + +export async function importUsers() { + User.importAllUsers() + return 'A importação está sendo feita. Isso pode demorar alguns minutos.' +} \ No newline at end of file diff --git a/server/src/resolvers/Mutation/index.js b/server/src/resolvers/Mutation/index.js index d29035f..75fb585 100644 --- a/server/src/resolvers/Mutation/index.js +++ b/server/src/resolvers/Mutation/index.js @@ -1,150 +1,28 @@ -import { replacePassword } from '../../lib/activeDirectory/passwordUtils' -import { User } from '../../classes/User' -import { ResetToken } from '../../classes/ResetToken' - -import { updateDevicesInfo } from '../../lib/wifiDevices' -import { updateUserIdMappings, addHost } from '../../lib/paloalto' -import { logInfo, logSuccess, logError } from '../../lib/logger' - -import { updateAccessPoints } from '../../lib/accessPoints' - -import prisma from '../../prisma' - -import { ACCESS_POINTS_UPDATED, pubsub } from '../../pubsub' +import { login } from './login' +import { updatePassword } from './updatePassword' +import { replacePassword } from './replacePassword' +import { replaceStudentPassword } from './replaceStudentPassword' +import { createResetToken } from './createResetToken' +import { useResetToken } from './useResetToken' +import { deleteExpiredTokens } from './deleteExpiredTokens' +import { importUsers } from './importUsers' +import { addPAHost } from './addPAHost' +import { delPAHost } from './delPAHost' +import { updateAccessPoint } from './updateAccessPoint' const Mutation = { - async login(parent, { data }) { - return User.login(data.username, data.password) - }, - async updatePassword(parent, { data }, { auth }) { - return auth.updatePassword(data.oldPassword, data.newPassword) - }, - - async replacePassword(parent, { data }, { auth }) { - logInfo({ - tags: ['replacePassword', 'user'], - message: `Usuário ${auth.sAMAccountName} (${auth.displayName}) está trocando a senha do usuário ${data.username}` - }) - - return replacePassword(data.username, data.newPassword) - }, - async replaceStudentPassword(parent, { data }, { auth }) { - const user = await new User(data.username).init() - - const isStudent = !!user.groups.find( - group => group.name == (process.env.STUDENT_GROUP || 'Estudantes') - ) - - const isServant = !!user.groups.find( - group => group.name == (process.env.SERVANT_GROUP || 'G_SERVIDORES') - ) - - if (isServant) throw new Error(`Usuário ${data.username} é um servidor`) - - if (!isStudent) - throw new Error(`Usuário ${data.username} não é um estudante`) - - logInfo({ - tags: ['replaceStudentPassword', 'user'], - message: `Usuário ${auth.sAMAccountName} (${auth.displayName}) está trocando a senha do aluno ${data.username}` - }) - - return replacePassword(data.username, data.newPassword) - }, - async createResetToken(parent, { data }, { auth }) { - return ResetToken.createToken(data.username, auth.sAMAccountName) - }, - - async useResetToken(parent, { data }) { - return ResetToken.useToken(data.token, data.newPassword) - }, - - async deleteExpiredTokens() { - return `Tokens deletados ${await ResetToken.deleteExpiredTokens()}` - }, - - async importUsers() { - User.importAllUsers() - - return 'A importação está sendo feita. Isso pode demorar alguns minutos.' - }, - - async updateWifiDevices() { - return updateDevicesInfo() - }, - - async updateUserIdMappings() { - updateUserIdMappings() - return 'A atualização está em andamento. Acompanhe os logs do servidor para mais informações.' - }, - - async addPAHost( - parent, - { data: { cidr, user, password, description, note } }, - { auth } - ) { - const host = await addHost({ - cidr, - user, - password, - description, - note, - owner: auth - }) - - if (host) - logSuccess({ - message: `Usuário ${auth.sAMAccountName} (${auth.displayName}) adicionou um novo host Palo Alto (${host.cidr}).`, - tags: ['paloalto'] - }) - - return host - }, - - async delPAHost(parent, { id }, { auth }) { - const host = await prisma.pAHost.findUnique({ where: { id } }) - - if (host.ownerId != auth.id) - throw new Error('Você não pode apagar o host de outro usuário') - - return prisma.pAHost.delete({ where: { id } }) - }, - - async updateAccessPoints() { - try { - await updateAccessPoints() - return 'Atualização concluída' - } catch (e) { - logError({ - tags: ['accessPoints'], - message: `Erro tentando atualizar os pontos de acesso: ${e.message}`, - data: { error: e } - }) - throw e - } - }, - async updateAccessPoint( - parent, - { data: { id, name, local, notes } }, - context, - info - ) { - const accessPoint = await prisma.accessPoint.update({ - where: { id: parseInt(id) }, - data: { name, local, notes } - }) - - const accessPoints = await prisma.accessPoint.findMany({ - include: { wifiDevices: true } - }) - - pubsub.publish(ACCESS_POINTS_UPDATED, { - accessPointsUpdated: accessPoints - }) - - return accessPoint - } + login, + updatePassword, + replacePassword, + replaceStudentPassword, + createResetToken, + useResetToken, + deleteExpiredTokens, + importUsers, + addPAHost, + delPAHost, + updateAccessPoint } export { Mutation } diff --git a/server/src/resolvers/Mutation/login.js b/server/src/resolvers/Mutation/login.js new file mode 100644 index 0000000..3072784 --- /dev/null +++ b/server/src/resolvers/Mutation/login.js @@ -0,0 +1,5 @@ +import { User } from '../../classes/User' + +export async function login(parent, { data }) { + return User.login(data.username, data.password) +} \ No newline at end of file diff --git a/server/src/resolvers/Mutation/replacePassword.js b/server/src/resolvers/Mutation/replacePassword.js new file mode 100644 index 0000000..f616183 --- /dev/null +++ b/server/src/resolvers/Mutation/replacePassword.js @@ -0,0 +1,11 @@ +import { logInfo } from '../../lib/logger' +import { replacePassword as replaceADPassword } from '../../lib/activeDirectory/passwordUtils' + +export async function replacePassword(parent, { data }, { auth }) { + logInfo({ + tags: ['replacePassword', 'user'], + message: `Usuário ${auth.sAMAccountName} (${auth.displayName}) está trocando a senha do usuário ${data.username}` + }) + + return replaceADPassword(data.username, data.newPassword) +} \ No newline at end of file diff --git a/server/src/resolvers/Mutation/replaceStudentPassword.js b/server/src/resolvers/Mutation/replaceStudentPassword.js new file mode 100644 index 0000000..93ff306 --- /dev/null +++ b/server/src/resolvers/Mutation/replaceStudentPassword.js @@ -0,0 +1,27 @@ +import { User } from '../../classes/User' +import { replacePassword } from '../../lib/activeDirectory/passwordUtils' +import { logInfo } from '../../lib/logger' + +export async function replaceStudentPassword(parent, { data }, { auth }) { + const user = await new User(data.username).init() + + const isStudent = !!user.groups.find( + group => group.name == (process.env.STUDENT_GROUP || 'Estudantes') + ) + + const isServant = !!user.groups.find( + group => group.name == (process.env.SERVANT_GROUP || 'G_SERVIDORES') + ) + + if (isServant) throw new Error(`Usuário ${data.username} é um servidor`) + + if (!isStudent) + throw new Error(`Usuário ${data.username} não é um estudante`) + + logInfo({ + tags: ['replaceStudentPassword', 'user'], + message: `Usuário ${auth.sAMAccountName} (${auth.displayName}) está trocando a senha do aluno ${data.username}` + }) + + return replacePassword(data.username, data.newPassword) +} \ No newline at end of file diff --git a/server/src/resolvers/Mutation/updateAccessPoint.js b/server/src/resolvers/Mutation/updateAccessPoint.js new file mode 100644 index 0000000..938d709 --- /dev/null +++ b/server/src/resolvers/Mutation/updateAccessPoint.js @@ -0,0 +1,25 @@ + +import prisma from '../../prisma' +import { ACCESS_POINTS_UPDATED, pubsub } from '../../pubsub' + +export async function updateAccessPoint( + parent, + { data: { id, name, local, notes } }, + context, + info +) { + const accessPoint = await prisma.accessPoint.update({ + where: { id: parseInt(id) }, + data: { name, local, notes } + }) + + const accessPoints = await prisma.accessPoint.findMany({ + include: { wifiDevices: true } + }) + + pubsub.publish(ACCESS_POINTS_UPDATED, { + accessPointsUpdated: accessPoints + }) + + return accessPoint +} \ No newline at end of file diff --git a/server/src/resolvers/Mutation/updatePassword.js b/server/src/resolvers/Mutation/updatePassword.js new file mode 100644 index 0000000..69546cb --- /dev/null +++ b/server/src/resolvers/Mutation/updatePassword.js @@ -0,0 +1,3 @@ +export async function updatePassword(parent, { data }, { auth }) { + return auth.updatePassword(data.oldPassword, data.newPassword) +} \ No newline at end of file diff --git a/server/src/resolvers/Mutation/useResetToken.js b/server/src/resolvers/Mutation/useResetToken.js new file mode 100644 index 0000000..bf36190 --- /dev/null +++ b/server/src/resolvers/Mutation/useResetToken.js @@ -0,0 +1,5 @@ +import { ResetToken } from '../../classes/ResetToken' + +export async function useResetToken(parent, { data }) { + return ResetToken.useToken(data.token, data.newPassword) +} \ No newline at end of file diff --git a/server/src/typeDefs.js b/server/src/typeDefs.js index 8312c3e..f6523cc 100644 --- a/server/src/typeDefs.js +++ b/server/src/typeDefs.js @@ -88,22 +88,13 @@ const typeDefs = gql` "Import all users from Active Directory" importUsers: String! @auth(roles: ["superAdmin"]) - - "Force update devices connected to Wi-Fi" - updateWifiDevices: String! @auth(roles: ["superAdmin"]) - - "Force update user-id mapping on firewall" - updateUserIdMappings: String! @auth(roles: ["superAdmin"]) - + "Add a PA host" addPAHost(data: AddPAHostInput!): PAHost! @auth(roles: ["superAdmin"]) "Remove a PA host" delPAHost(id: Int!): PAHost! @auth(roles: ["superAdmin"]) - "Force Update Access Points" - updateAccessPoints: String! @auth(roles: ["superAdmin"]) - "Update an Access Point" updateAccessPoint(data: UpdateAccessPointInput): AccessPoint! @auth(roles: ["superAdmin"]) diff --git a/web/package-lock.json b/web/package-lock.json index c71f6b3..af4a0ad 100755 --- a/web/package-lock.json +++ b/web/package-lock.json @@ -1,12 +1,12 @@ { "name": "ifms-pti", - "version": "2.12.2", + "version": "2.12.3", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "ifms-pti", - "version": "2.12.2", + "version": "2.12.3", "dependencies": { "@mdi/font": "^6.6.96", "apollo-link-ws": "^1.0.20", diff --git a/web/package.json b/web/package.json index 57d5e15..8b05e28 100755 --- a/web/package.json +++ b/web/package.json @@ -1,6 +1,6 @@ { "name": "ifms-pti", - "version": "2.12.2", + "version": "2.12.3", "private": true, "scripts": { "serve": "vue-cli-service serve",