From f4c2f4e1824d83f493645c879662546e95567a6f Mon Sep 17 00:00:00 2001 From: Fernando Erd <fce15@inf.ufpr.br> Date: Tue, 3 Oct 2017 10:41:49 -0300 Subject: [PATCH 1/2] Fix password bug --- src/libs/routes/user.js | 346 ++++++++++++++++++++-------------------- 1 file changed, 176 insertions(+), 170 deletions(-) diff --git a/src/libs/routes/user.js b/src/libs/routes/user.js index 0e301310..7d3e6fe8 100644 --- a/src/libs/routes/user.js +++ b/src/libs/routes/user.js @@ -21,209 +21,215 @@ const email = require(`${libs}/middlewares/email`); const passport = require('passport'); function emailSyntax(email) { - const regex = /^(([^<>()\[\]\.,;:\s@\"]+(\.[^<>()\[\]\.,;:\s@\"]+)*)|(\".+\"))@(([^<>()[\]\.,;:\s@\"]+\.)+[^<>()[\]\.,;:\s@\"]{2,})$/i; - return regex.test(email); + const regex = /^(([^<>()\[\]\.,;:\s@\"]+(\.[^<>()\[\]\.,;:\s@\"]+)*)|(\".+\"))@(([^<>()[\]\.,;:\s@\"]+\.)+[^<>()[\]\.,;:\s@\"]{2,})$/i; + return regex.test(email); } userApp.get('/schooling', (req, res, next) => { - req.result = [ - 'Não estudou', - 'Ensino Fundamental Incompleto', - 'Ensino Fundamental Completo', - 'Ensino Médio', - 'Graduação', - 'Mestrado', - 'Doutorado' - ]; - next(); + req.result = [ + 'Não estudou', + 'Ensino Fundamental Incompleto', + 'Ensino Fundamental Completo', + 'Ensino Médio', + 'Graduação', + 'Mestrado', + 'Doutorado' + ]; + next(); }, response('schooling')); userApp.get('/segment', (req, res, next) => { - req.result = [ - 'Gestores e equipe gestora das secretarias e ministério da Educação', - 'Gestores dos órgãos de planejamento e finanças (das três esferas de governo)', - 'Agentes do poder legislativo', - 'Agentes dos conselhos de educação', - 'Profissionais da educação', - 'Sindicato', - 'Sociedade civil interessada no financiamento da Educação Básica de qualidade', - 'Comunidade acadêmica', - 'Imprensa', - 'Outro [citar segmento]' - ]; - next(); + req.result = [ + 'Gestores e equipe gestora das secretarias e ministério da Educação', + 'Gestores dos órgãos de planejamento e finanças (das três esferas de governo)', + 'Agentes do poder legislativo', + 'Agentes dos conselhos de educação', + 'Profissionais da educação', + 'Sindicato', + 'Sociedade civil interessada no financiamento da Educação Básica de qualidade', + 'Comunidade acadêmica', + 'Imprensa', + 'Outro [citar segmento]' + ]; + next(); }, response('segment')); userApp.get('/role', (req, res, next) => { - req.result = [ - {"Gestores e equipe gestora das secretarias e ministério da Educação" : ["Dirigente municipal, estadual e federal", "Secretário do MEC", "Servidor da área de planejamento educacional", "Membro de associação de gestores (Ex. Undime, Consed, etc)", "Outro [citar função]"]}, - {"Gestores dos órgãos de planejamento e finanças (das três esferas de governo)" : ["Equipe gestora dos órgãos de planejamento", "Equipe gestora dos órgãos de finanças", "Outro [citar função]"]}, - {"Agentes do poder legislativo" : ["Parlamentar", "Assessor/a parlamentar", "Auditor/a dos tribunais de conta", "Conselheiro/a de tribunais de conta.", "Outro [citar função]"]}, - {"Agentes dos conselhos de educação" : ["Conselheiro/a municipais, estaduais e federais", "Conselheiro/a do Fundeb", "Outro [citar função]"]}, - {"Profissionais da educação" : ["Professor/a da Educação Básica", "Profissional da educação não-docente", "Outro [citar função]"]}, - {"Sindicato" : ["Agente de sindicatos"]}, - {"Sociedade civil interessada no financiamento da Educação Básica de qualidade" : ["Membro de fóruns educacionais", "Membro de ONGs e demais entidades sem fins lucrativos", "Estudante da educação básica e membro de entidades estudantis", "Pais e membros de entidades de pais", "Outro [citar função]"]}, - {"Comunidade acadêmica" : ["Pesquisador/a", "Estudantes de graduação e pós-graduação", "Representantes de entidades de pesquisa (Ex.: ANPED, ANPAE e FINEDUCA)", "Outro [citar função]"]}, - {"Imprensa" : ["Jornalista", "Outro [citar função]"]}, - {"Outro [citar segmento]" : []} - ] - next(); + req.result = [ + {"Gestores e equipe gestora das secretarias e ministério da Educação" : ["Dirigente municipal, estadual e federal", "Secretário do MEC", "Servidor da área de planejamento educacional", "Membro de associação de gestores (Ex. Undime, Consed, etc)", "Outro [citar função]"]}, + {"Gestores dos órgãos de planejamento e finanças (das três esferas de governo)" : ["Equipe gestora dos órgãos de planejamento", "Equipe gestora dos órgãos de finanças", "Outro [citar função]"]}, + {"Agentes do poder legislativo" : ["Parlamentar", "Assessor/a parlamentar", "Auditor/a dos tribunais de conta", "Conselheiro/a de tribunais de conta.", "Outro [citar função]"]}, + {"Agentes dos conselhos de educação" : ["Conselheiro/a municipais, estaduais e federais", "Conselheiro/a do Fundeb", "Outro [citar função]"]}, + {"Profissionais da educação" : ["Professor/a da Educação Básica", "Profissional da educação não-docente", "Outro [citar função]"]}, + {"Sindicato" : ["Agente de sindicatos"]}, + {"Sociedade civil interessada no financiamento da Educação Básica de qualidade" : ["Membro de fóruns educacionais", "Membro de ONGs e demais entidades sem fins lucrativos", "Estudante da educação básica e membro de entidades estudantis", "Pais e membros de entidades de pais", "Outro [citar função]"]}, + {"Comunidade acadêmica" : ["Pesquisador/a", "Estudantes de graduação e pós-graduação", "Representantes de entidades de pesquisa (Ex.: ANPED, ANPAE e FINEDUCA)", "Outro [citar função]"]}, + {"Imprensa" : ["Jornalista", "Outro [citar função]"]}, + {"Outro [citar segmento]" : []} + ] + next(); }, response('role')); userApp.get('/', passport.authenticate('bearer', {session: false}), (req, res, next) => { - User.find((err, users) => { - if(err) { - log.error(err); - return next(err); - } - - let result = []; - users.forEach((user) => { - let u = user.toObject(); - delete u.hashedPassword; - delete u.salt; - result.push(u); - }); - req.result = result; - next(); + User.find((err, users) => { + if(err) { + log.error(err); + return next(err); + } + + let result = []; + users.forEach((user) => { + let u = user.toObject(); + delete u.hashedPassword; + delete u.salt; + result.push(u); }); + req.result = result; + next(); + }); }, response('users')); userApp.get('/me', passport.authenticate('bearer', { session: false }), (req, res, next) => { - let user = req.user.toObject(); - delete user.hashedPassword; - delete user.salt; - req.result = user; - next(); + let user = req.user.toObject(); + delete user.hashedPassword; + delete user.salt; + req.result = user; + next(); }, response('user')); userApp.get('/:id', (req, res, next) => { - User.findById(req.params.id, (err, user) => { - if(err) { - log.error(err); - return next(err); - } - if(!user) { - req.statusCode = 404; - next({msg: 'User not found'}); - } else { - let u = user.toObject; - delete u.hashedPassword; - delete u.salt; - req.result = u; - next(); - } - }); + User.findById(req.params.id, (err, user) => { + if(err) { + log.error(err); + return next(err); + } + if(!user) { + req.statusCode = 404; + next({msg: 'User not found'}); + } else { + let u = user.toObject; + delete u.hashedPassword; + delete u.salt; + req.result = u; + next(); + } + }); }, response('user')); userApp.post('/', (req, res, next) => { - let user = new User({ - email: req.body.email, - password: req.body.password, - name: req.body.name, - nickname: req.body.nickname, - cpf: req.body.cpf, - cep: req.body.cep, - complement: req.body.complement, - address: req.body.address, - phone: req.body.phone, - schooling: req.body.schooling, - course: req.body.course, - segment: req.body.segment, - role: req.body.role, - institutionName: req.body.institutionName, - state: req.body.state, - city: req.body.city, - receiveEmails: false || req.body.receiveEmails, - origin: req.body.origin - }); - + let user = new User({ + email: req.body.email, + password: req.body.password, + name: req.body.name, + nickname: req.body.nickname, + cpf: req.body.cpf, + cep: req.body.cep, + complement: req.body.complement, + address: req.body.address, + phone: req.body.phone, + schooling: req.body.schooling, + course: req.body.course, + segment: req.body.segment, + role: req.body.role, + institutionName: req.body.institutionName, + state: req.body.state, + city: req.body.city, + receiveEmails: false || req.body.receiveEmails, + origin: req.body.origin + }); + + if (typeof req.body.password === 'undefined' || !req.body.password) { + res.statusCode = 400; + return res.json({errors: ["O campo senha é obrigatório"]}); + } else { user.save((err) => { - if(err) { - log.error(err); - let errors = []; - for(let errName in err.errors) { - errors.push(err.errors[errName].message); - } - log.error(errors); - res.statusCode = 400; - return res.json({err, errors}); + if(err) { + log.error(err); + let errors = []; + for(let errName in err.errors) { + errors.push(err.errors[errName].message); } + log.error(errors); + res.statusCode = 400; + return res.json({err, errors}); + } - // Create verification token - let verificationToken = new VerificationToken({ - userId: user._id - }); + // Create verification token + let verificationToken = new VerificationToken({ + userId: user._id + }); - verificationToken.createVerificationToken((err, token) => { - if(err) { - log.error(err); - return next(err); - } - let url = config.default.lde.url + '/verify'; - let text = `Olá, ${user.name}, seja bem vindo/a ao Laboratório de Dados Educacionais.\n\nClique neste link para confirmar sua conta: ${url}/${token}`; - // Send confirmation email - let mailOptions = { - to: `"${user.name} <${user.email}>"`, - subject: "Confirme seu cadastro - Laboratório de Dados Educacionais", - text - } - email(mailOptions, (err, info) => { - if(err) { - log.error(err); - res.json({msg: 'User created'}); - } - log.info(`Message ${info.messageId} sent: ${info.response}`); - log.info(`Usuário ${user.email} foi criado`); - res.json({msg: 'User created'}); - }); + verificationToken.createVerificationToken((err, token) => { + if(err) { + log.error(err); + return next(err); + } + let url = config.default.lde.url + '/verify'; + let text = `Olá, ${user.name}, seja bem vindo/a ao Laboratório de Dados Educacionais.\n\nClique neste link para confirmar sua conta: ${url}/${token}`; + // Send confirmation email + let mailOptions = { + to: `"${user.name} <${user.email}>"`, + subject: "Confirme seu cadastro - Laboratório de Dados Educacionais", + text + } + email(mailOptions, (err, info) => { + if(err) { + log.error(err); + res.json({msg: 'User created'}); + } + log.info(`Message ${info.messageId} sent: ${info.response}`); + log.info(`Usuário ${user.email} foi criado`); + res.json({msg: 'User created'}); }); + }); }); + } + }); userApp.get('/reset/password', (req, res, next) => { - let emailAddress = req.query.email; - User.findOne({email: emailAddress}, (err, user)=> { - if(err) { - log.error(err); - let errors = []; - for(let errName in err.errors) { - errors.push(err.errors[errName].message); - } - res.statusCode = 400; - return res.json({err, errors}); + let emailAddress = req.query.email; + User.findOne({email: emailAddress}, (err, user)=> { + if(err) { + log.error(err); + let errors = []; + for(let errName in err.errors) { + errors.push(err.errors[errName].message); + } + res.statusCode = 400; + return res.json({err, errors}); + } + if (!user) { + res.statusCode = 404; + res.json({msg: "O usuário não está cadastrado"}); + } + else { + let resetToken = new ResetToken({ + userId: user._id + }); + resetToken.createResetToken((err, token) => { + if (err) { + log.error(err); + return next(err); } - if (!user) { - res.statusCode = 404; - res.json({msg: "O usuário não está cadastrado"}); + let url = config.default.lde.url + '/reset-password'; + let text = `Olá, ${user.name}.\n\nRecebemos uma solicitação para redefinir sua senha do Laboratório de Dados Educacionais. Clique neste link para redefinir a sua senha: ${url}/${token}`; + let mailOptions = { + to: `"${user.name} <${user.email}>"`, + subject: "Redefinição de Senha - Laboratório de Dados Educacionais", + text } - else { - let resetToken = new ResetToken({ - userId: user._id - }); - resetToken.createResetToken((err, token) => { - if (err) { - log.error(err); - return next(err); - } - let url = config.default.lde.url + '/reset-password'; - let text = `Olá, ${user.name}.\n\nRecebemos uma solicitação para redefinir sua senha do Laboratório de Dados Educacionais. Clique neste link para redefinir a sua senha: ${url}/${token}`; - let mailOptions = { - to: `"${user.name} <${user.email}>"`, - subject: "Redefinição de Senha - Laboratório de Dados Educacionais", - text - } - email(mailOptions, (err, info) => { - if(err) { - log.error(err); - res.json({msg: 'Undelivered Reset Password Mail'}); - } - log.debug(`Message ${info.messageId} sent: ${info.response}`); - res.json({msg: 'Reset Password Mail Successfully Delivered'}); - }); - }) - } - }) + email(mailOptions, (err, info) => { + if(err) { + log.error(err); + res.json({msg: 'Undelivered Reset Password Mail'}); + } + log.debug(`Message ${info.messageId} sent: ${info.response}`); + res.json({msg: 'Reset Password Mail Successfully Delivered'}); + }); + }) + } + }) }) module.exports = userApp; -- GitLab From 96dd620f361cce6ae2d98c79e6f47471391c8720 Mon Sep 17 00:00:00 2001 From: Fernando Erd <fce15@inf.ufpr.br> Date: Tue, 3 Oct 2017 10:49:44 -0300 Subject: [PATCH 2/2] CEP required --- src/libs/models/user.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/libs/models/user.js b/src/libs/models/user.js index 71a9d48f..7ee47258 100644 --- a/src/libs/models/user.js +++ b/src/libs/models/user.js @@ -32,6 +32,10 @@ var UserSchema = new Schema({ unique: true, required: [true, 'O campo CPF é obrigatório.'] }, + cep:{ + type: String, + required: [true, 'O campo CEP é obrigatório.'] + }, schooling: { type: String, required: [true, 'O campo Formação é obrigatório.'] -- GitLab