Commit a1fac635 authored by Marcelo Alejo Calle's avatar Marcelo Alejo Calle
Browse files

Optimizaciones y nuevas funcionalidades

parent e5cfbfcf
......@@ -14,46 +14,26 @@ const listaNegraDefault = [
];
// Fuente: https://nic.bo/documentos/Politica_2019_firmado.pdf
const listaRestringidaDefault = ['@gob.bo', '@edu.bo', '@mil.bo', '@int.bo'];
const listaInstitucionalDefault = [
'gob.bo',
'edu.bo',
'mil.bo',
'int.bo',
'academia.bo',
'agro.bo',
'arte.bo',
'blog.bo',
'bolivia.bo',
'ciencia.bo',
'gob.bo', 'edu.bo', 'mil.bo', 'int.bo',
'academia.bo', 'agro.bo', 'arte.bo',
'blog.bo', 'bolivia.bo', 'ciencia.bo',
'cooperativa.bo',
'democracia.bo',
'deporte.bo',
'ecologia.bo',
'economia.bo',
'empresa.bo',
'indigena.bo',
'industria.bo',
'info.bo',
'medicina.bo',
'movimiento.bo',
'musica.bo',
'natural.bo',
'nombre.bo',
'noticias.bo',
'patria.bo',
'politica.bo',
'profesional.bo',
'plurinacional.bo',
'pueblo.bo',
'democracia.bo', 'deporte.bo', 'ecologia.bo',
'economia.bo', 'empresa.bo', 'indigena.bo',
'industria.bo', 'info.bo', 'medicina.bo',
'movimiento.bo', 'musica.bo',
'natural.bo', 'nombre.bo', 'noticias.bo',
'patria.bo', 'politica.bo', 'profesional.bo', 'plurinacional.bo', 'pueblo.bo',
'revista.bo',
'salud.bo',
'tecnologia.bo',
'tksat.bo',
'transporte.bo',
'tecnologia.bo', 'tksat.bo', 'transporte.bo',
'wiki.bo'
];
module.exports = async function (configApp, listaNegra, listaInstitucional) {
module.exports = async function (configApp, listaNegra, listaInstitucional, listaRestringida) {
const config = {
database: 'app_dns',
username: 'usuario',
......@@ -91,49 +71,28 @@ module.exports = async function (configApp, listaNegra, listaInstitucional) {
// Cargando servicios dns
services = Object.assign(services, Dns(services));
if (listaNegraDefault.length > 0) {
for (const dominio of listaNegraDefault) {
if (typeof (dominio) === 'string') {
await services.createOrUpdate({
dominio,
_user_created: 1
});
}
}
}
if (listaInstitucionalDefault.length > 0) {
for (const dominio of listaInstitucionalDefault) {
if (typeof (dominio) === 'string') {
await services.createOrUpdate({
dominio,
tipo: 'INSTITUCIONAL',
_user_created: 1
});
async function insertarLista (listaDominios, tipo, estado) {
if (listaDominios && listaDominios.length > 0) {
for (const dominio of listaDominios) {
if (typeof (dominio) === 'string') {
await services.createOrUpdate({
dominio,
tipo,
estado,
createdUser: 1
});
}
}
}
}
if (listaNegra && listaNegra.length > 0) {
for (const dominio of listaNegra) {
if (typeof (dominio) === 'string') {
await services.createOrUpdate({
dominio,
_user_created: 1
});
}
}
}
if (listaInstitucional && listaInstitucional.length > 0) {
for (const dominio of listaInstitucional) {
if (typeof (dominio) === 'string') {
await services.createOrUpdate({
dominio,
tipo: 'INSTITUCIONAL',
_user_created: 1
});
}
}
}
await insertarLista(listaNegraDefault, 'CONTIENE', 'LISTA_NEGRA');
await insertarLista(listaInstitucionalDefault, 'FINALIZA', 'INSTITUCIONAL');
await insertarLista(listaRestringidaDefault, 'IGUAL', 'RESTRINGIDO');
await insertarLista(listaNegra, 'CONTIENE', 'LISTA_NEGRA');
await insertarLista(listaInstitucional, 'FINALIZA', 'INSTITUCIONAL');
await insertarLista(listaRestringida, 'IGUAL', 'RESTRINGIDO');
return services;
};
......@@ -4,67 +4,52 @@ const debug = require('debug')('app:dns:verificarCorreo');
const dns = require('dns');
module.exports = function dnsService (services) {
let dominioNegro = {
count: 0,
rows: []
};
let dominioInstitucional = {
let listaDominios = {
count: 0,
rows: []
};
const buscarEnListaInstitucion = async function (dominio, recargar = true) {
// Obtener lista de dominios institucinal
if (recargar) {
dominioInstitucional = await services.findAll({
order: '-contador',
tipo: 'INSTITUCIONAL',
estado: 'ACTIVO'
});
}
let dominioGuardado = false;
let pos = -1;
if (dominioInstitucional.rows && dominioInstitucional.rows instanceof Array) {
dominioInstitucional.rows.find(function (value, i) {
if (dominio.indexOf(value.dominio) !== -1) {
pos = i;
return true;
}
const registrarDominio = async function (dominio) {
if (!dominioGuardado) {
dominioGuardado = true;
const resDom = await services.createOrUpdate({
dominio: dominio || '',
createdUser: 1
});
if (pos >= 0) {
services.updateContador(dominioInstitucional.rows[pos].id).catch((e) => {
console.error(e);
});
return true;
}
await services.updateContador(resDom.id);
}
return false;
};
const buscarEnListaNegra = async function (dominio, recargar = true) {
// Obtener lista de dominios no permitidos
const buscarEnLista = async function (dominio, estado, recargar = true) {
// Obtener lista de dominios
if (recargar) {
dominioNegro = await services.findAll({
listaDominios = await services.findAll({
order: '-contador',
tipo: 'NO_PERMITIDO',
estado: 'ACTIVO'
contieneDominio: `@${dominio}`
});
}
let condicion = [];
let nDominio = dominio;
let pos = -1;
if (dominioNegro.rows && dominioNegro.rows instanceof Array) {
dominioNegro.rows.find(function (value, i) {
if (dominio.indexOf(value.dominio) !== -1) {
if (listaDominios.rows && listaDominios.rows instanceof Array) {
listaDominios.rows.find(function (value, i) {
condicion = [];
condicion.push(value.tipo === 'CONTIENE' && dominio.indexOf(value.dominio.replace('@', '')) >= 0);
condicion.push(value.tipo === 'FINALIZA' && dominio.endsWith(value.dominio.replace('@', '')));
condicion.push(value.tipo === 'IGUAL' && dominio === value.dominio.replace('@', ''));
condicion.push(value.tipo === 'INICIA' && dominio.startsWith(value.dominio.replace('@', '')));
if (value.estado === estado && (condicion[0] || condicion[1] || condicion[2] || condicion[3])) {
nDominio = value.dominio;
pos = i;
return true;
}
});
if (pos >= 0) {
services.updateContador(dominioNegro.rows[pos].id).catch((e) => {
console.error(e);
});
await registrarDominio(nDominio);
return true;
}
}
......@@ -86,17 +71,23 @@ module.exports = function dnsService (services) {
debug(`\n@${dominio}`);
const result = {};
dominioGuardado = false;
if (!dominio) {
result.error = `El dominio "@${dominio}" no existe`;
await registrarDominio(dominio);
return result;
}
if (await buscarEnListaNegra(dominio)) {
if (await buscarEnLista(dominio, 'RESTRINGIDO')) {
result.error = `El dominio "@${dominio}" esta restringido`;
return result;
}
if (await buscarEnLista(dominio, 'LISTA_NEGRA', false)) {
result.error = `El dominio "@${dominio}" no esta permitido`;
return result;
}
if (await buscarEnListaInstitucion(dominio)) {
if (await buscarEnLista(dominio, 'INSTITUCIONAL', false)) {
result.advertencia = `El dominio "@${dominio}" es institucional`;
}
......@@ -111,15 +102,19 @@ module.exports = function dnsService (services) {
result.error = `El dominio "@${dominio}" no recibe correos.`;
}
for (const ex of res) {
if (await buscarEnListaNegra(ex.exchange, false)) {
if (await buscarEnLista(ex.exchange, 'LISTA_NEGRA')) {
result.error = `El dominio "@${dominio}" no esta permitido.`;
} else if (await buscarEnListaInstitucion(ex.exchange, false)) {
return result;
} else if (await buscarEnLista(ex.exchange, 'INSTITUCIONAL', false)) {
result.advertencia = `El dominio "@${dominio}" es institucional.`;
return result;
}
}
}
await registrarDominio(dominio);
return result;
} catch (err) {
await registrarDominio(dominio);
if (err.message.indexOf('ENOTFOUND') >= 0) {
result.error = `El dominio "@${dominio}", no existe.`;
return result;
......
......@@ -25,14 +25,14 @@ module.exports = (sequelize, DataTypes) => {
},
tipo: {
type: DataTypes.ENUM,
values: ['NO_PERMITIDO', 'INSTITUCIONAL'],
defaultValue: 'NO_PERMITIDO',
values: ['IGUAL', 'INICIA', 'CONTIENE', 'FINALIZA'],
defaultValue: 'IGUAL',
allowNull: false
},
estado: {
type: DataTypes.ENUM,
values: ['ACTIVO', 'INACTIVO'],
defaultValue: 'ACTIVO',
values: ['INSTITUCIONAL', 'RESTRINGIDO', 'LISTA_NEGRA', 'INACTIVO'],
defaultValue: 'INACTIVO',
allowNull: false
}
};
......@@ -41,7 +41,7 @@ module.exports = (sequelize, DataTypes) => {
fields = setTimestamps(fields);
const serviciosDnsDominio = sequelize.define('app_dominio_correo', fields, {
timestamps: false,
timestamps: true,
tableName: 'app_dominio_correo'
});
......
......@@ -35,6 +35,10 @@ module.exports = function paramsServices (dns, Sequelize) {
query.where.estado = params.estado;
}
if (params.contieneDominio) {
query.where.$and = Sequelize.literal(`POSITION(dominio IN '${params.contieneDominio}')>0`);
}
return dns.findAndCountAll(query);
}
......@@ -70,8 +74,7 @@ module.exports = function paramsServices (dns, Sequelize) {
if (data.descripcion) item.descripcion = data.descripcion;
if (data.tipo) item.tipo = data.tipo;
if (data.estado) item.estado = data.estado;
item._updated_at = new Date();
item._user_update = data._user_update || 1;
item.updatedUser = `${data.updatedUser || 1}`;
const updated = await item.save();
if (updated.id) {
return updated.get({ plain: true });
......@@ -103,8 +106,7 @@ module.exports = function paramsServices (dns, Sequelize) {
if (data.descripcion) item.descripcion = data.descripcion;
if (data.tipo) item.tipo = data.tipo;
if (data.estado) item.estado = data.estado;
item._updated_at = new Date();
item._user_update = data._user_update || 1;
item.updatedUser = `${data.updatedUser || 1}`;
const updated = await item.save();
if (updated.id) {
return updated.toJSON();
......@@ -125,8 +127,7 @@ module.exports = function paramsServices (dns, Sequelize) {
if (item) {
item.contador = item.contador + 1;
item._updated_at = new Date();
item._user_update = 1;
item.updatedUser = '1';
const updated = await item.save();
if (updated.id) {
return updated.toJSON();
......
......@@ -47,20 +47,12 @@ function getQuery (options = {}) {
}
const timestamps = {
_user_created: {
createdUser: {
type: Sequelize.STRING(32),
allowNull: false
},
_user_updated: {
updatedUser: {
type: Sequelize.STRING(32)
},
_created_at: {
type: Sequelize.DATE,
allowNull: false,
defaultValue: Sequelize.NOW
},
_updated_at: {
type: Sequelize.DATE
}
};
......
......@@ -33,15 +33,25 @@ const correosNoValido = [
'3@yopmail.com',
'4@yopmail.com',
'abc@def.jtk',
'contacto@example.com'
'contacto@example.com',
'mrbqjkhoiosthcsakz@tsyefn.com',
'nhxoibcmuhvmflxvzb@miucce.online',
'aserty@cuoly.com',
'qwerty@bcaoo.com',
'abc@localhost',
'sindominio'
];
const correosInstitucion = [
'contacto@agetic.gob.bo',
'contacto@fdi.gob.bo',
'contacto@mil.bo',
'contacto@edu.bo',
'contacto@credito123.gob.bo'
];
const correosRestringido = [
'contacto@gob.bo',
'contacto@edu.bo',
'contacto@mil.bo',
'contacto@int.bo'
];
const correosValido = [
'contacto@macx.tk',
'contacto@macx.com',
......@@ -91,6 +101,13 @@ describe('Iniciando pruebas del servicio', function () {
});
}
for (const correo of correosRestringido) {
it(`Verificar correo restringido ${correo}`, async function () {
const result = await serviciosDns.dominio.verificarDominioCorreo(correo.split('@')[1]);
expect(result).to.have.property('error');
});
}
for (const correo of correosInstitucion) {
it(`Verificar correo institucional ${correo}`, async function () {
const result = await serviciosDns.dominio.verificarDominioCorreo(correo.split('@')[1]);
......@@ -126,7 +143,7 @@ describe('Iniciando pruebas del servicio', function () {
it('#findAll', async function () {
const lista = await serviciosDns.findAll({
estado: 'ACTIVO'
estado: { $not: 'INACTIVO' }
});
expect(lista).to.have.property('count');
expect(lista).to.have.property('rows');
......@@ -142,7 +159,7 @@ describe('Iniciando pruebas del servicio', function () {
it('#findByDominio', async function () {
const lista = await serviciosDns.findByDominio('example.com');
expect(lista).to.equal(null);
expect(lista).to.have.property('id');
});
// it('#deleteItem', async function () {
......@@ -150,25 +167,26 @@ describe('Iniciando pruebas del servicio', function () {
// expect(lista).to.equal(null);
// });
it('#createOrUpdate', async function () {
it('#createOrUpdate1', async function () {
const lista = await serviciosDns.createOrUpdate({
dominio: 'mailinator.com',
tipo: 'INSTITUCIONAL',
_user_created: '1'
tipo: 'CONTIENE',
estado: 'INSTITUCIONAL',
createdUser: '1'
});
expect(lista).to.have.property('id');
expect(lista).to.have.property('dominio');
expect(lista).to.have.property('tipo');
expect(lista).to.have.property('estado');
expect(lista.dominio).to.equal('mailinator.com');
expect(lista.tipo).to.equal('INSTITUCIONAL');
expect(lista.estado).to.equal('ACTIVO');
expect(lista.tipo).to.equal('CONTIENE');
expect(lista.estado).to.equal('INSTITUCIONAL');
});
it('#createOrUpdate', async function () {
it('#createOrUpdate2', async function () {
const lista = await serviciosDns.createOrUpdate({
dominio: 'yopmail.com',
_user_created: '1'
createdUser: '1'
});
expect(lista).to.have.property('id');
expect(lista).to.have.property('dominio');
......@@ -176,10 +194,10 @@ describe('Iniciando pruebas del servicio', function () {
expect(lista).to.have.property('estado');
});
it('#createOrUpdate', async function () {
it('#createOrUpdate3', async function () {
const lista = await serviciosDns.createOrUpdate({
dominio: 'yopmail.com',
_user_created: '1'
createdUser: '1'
});
expect(lista).to.have.property('id');
expect(lista).to.have.property('dominio');
......@@ -187,10 +205,10 @@ describe('Iniciando pruebas del servicio', function () {
expect(lista).to.have.property('estado');
});
it('#createOrUpdate', async function () {
it('#createOrUpdate4', async function () {
const lista = await serviciosDns.createOrUpdate({
dominio: 'yopmail',
_user_created: '1'
createdUser: '1'
});
expect(lista).to.have.property('id');
expect(lista).to.have.property('dominio');
......@@ -198,10 +216,10 @@ describe('Iniciando pruebas del servicio', function () {
expect(lista).to.have.property('estado');
});
it('#createOrUpdate', async function () {
it('#createOrUpdate5', async function () {
const lista = await serviciosDns.createOrUpdate({
dominio: 'mailinator',
_user_created: '1'
createdUser: '1'
});
expect(lista).to.have.property('id');
expect(lista).to.have.property('dominio');
......@@ -212,8 +230,8 @@ describe('Iniciando pruebas del servicio', function () {
it('#updateItem', async function () {
const lista = await serviciosDns.updateItem(1, {
estado: 'ACTIVO',
_user_created: '1'
estado: 'LISTA_NEGRA',
createdUser: '1'
});
expect(lista).to.have.property('id');
expect(lista).to.have.property('dominio');
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment