Skip to content

Commit 6cf63e0

Browse files
Merge pull request #247 from WebJamApps/dev
Lyre release
2 parents 2e89584 + 0006774 commit 6cf63e0

File tree

16 files changed

+1122
-381
lines changed

16 files changed

+1122
-381
lines changed

.circleci/config.yml

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
version: 2
2+
jobs:
3+
build:
4+
working_directory: ~/web-jam-back
5+
# The primary container is an instance of the first list image listed. Your build commands run in this container.
6+
docker:
7+
- image: circleci/node:8.9.4-browsers
8+
# The secondary container is an instance of the second listed image which is run in a common network where ports exposed on the primary container are available on localhost.
9+
#- image: mongo:3.4.4
10+
steps:
11+
- checkout
12+
- run:
13+
name: Install globals
14+
command: 'sudo npm install -g npm@latest && sudo npm install -g bower@latest && sudo npm install -g codeclimate-test-reporter'
15+
- restore_cache:
16+
key: dependency-cache-{{ checksum "package.json" }}
17+
- run:
18+
name: Install npm wee
19+
command: yarn install
20+
- save_cache:
21+
key: dependency-cache-{{ checksum "package.json" }}
22+
paths:
23+
- node_modules
24+
test:
25+
docker:
26+
- image: circleci/node:8.9.4-browsers
27+
#- image: mongo:3.4.4
28+
steps:
29+
- checkout
30+
- run:
31+
name: Test install
32+
command: 'sudo npm install -g npm@latest && sudo npm install -g bower@latest && sudo npm install -g codeclimate-test-reporter && yarn install'
33+
#- run:
34+
# name: ubuntu dependancies
35+
# command: 'sudo apt-get update -y && sudo apt-get install -y apt-utils gconf-service libasound2 libatk1.0-0 libcups2 libdbus-1-3 libgconf-2-4 libgtk-3-0 libnspr4 libxcomposite1 libxss1 fonts-liberation libappindicator1 libnss3 lsb-release xdg-utils'
36+
#- run:
37+
# name: install chrome
38+
# command: 'curl -s https://raw.githubusercontent.com/chronogolf/circleci-google-chrome/master/use_chrome_stable_version.sh | bash'
39+
- run:
40+
name: test mocha
41+
command: npm test
42+
- run:
43+
name: Generate code coverage
44+
command: 'codeclimate-test-reporter < coverage/lcov.info'
45+
#- store_artifacts:
46+
# path: test-results.xml
47+
# prefix: tests
48+
- store_artifacts:
49+
path: coverage
50+
prefix: coverage
51+
52+
workflows:
53+
version: 2
54+
build_and_test:
55+
jobs:
56+
#- build
57+
- test
58+
#requires:
59+
# - build
60+
#filters:
61+
# branches:
62+
# only: master

README.md

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,8 @@
77

88
<p>This repository is used for the following apps:</p>
99
<ui>
10-
<li><a href="http://www.ourhandsandfeet.org">ourhandsandfeet.org</a></li>
1110
<li><a href="https://www.web-jam.com">Web Jam LLC</a></li>
12-
<li><a href="http://www.joshandmariamusic.com">joshandmariamusic.com</a></li>
11+
<li><a href="http://www.ourhandsandfeet.org">ourhandsandfeet.org</a></li>
1312
<li><a href="https://www.web-jam.com/library">Web Jam Library</a></li>
1413
</ul>
1514

auth/auth.controller.js

Lines changed: 137 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,138 @@
1+
const config = require('../config');
2+
const User = require('../model/user/user-schema');
3+
const authUtils = require('./authUtils');
4+
const frontURL = config.frontURL;
15

2-
// var _ = require('lodash');
3-
// var Entity = require('../model/user/user-schema.js');
4-
// var jwt = require('jwt-simple');
5-
// var authUtils = require('./authUtils');
6-
// exports.signup = function (req, res) {
7-
// console.log("req body " + req.body.email);
8-
// Entity.findOne({email: req.body.email}, function (err, existingUser) {
9-
// if (existingUser) {
10-
// return res.status(409).send({message: 'Email is already taken'});
11-
// }
12-
// var user = new Entity({
13-
// displayName: req.body.displayName,
14-
// email: req.body.email,
15-
// password: req.body.password
16-
// });
17-
// user.save(function () {
18-
// return res.status(201).json({token: authUtils.createJWT(user)});
19-
// });
20-
//
21-
// });
22-
// };
23-
//
24-
// exports.login = function (req, res) {
25-
// console.log("req body " + req.body.email);
26-
// Entity.findOne({email: req.body.email}, '+password', function (err, user) {
27-
// if (!user) {
28-
// return res.status(401).json({message: 'Wrong email and/or password'});
29-
// }
30-
// user.comparePassword(req.body.password, function (err, isMatch) {
31-
// if (!isMatch) {
32-
// return res.status(401).send({message: 'Wrong email and/or password'});
33-
// }
34-
// res.send({token: authUtils.createJWT(user)});
35-
// });
36-
// });
37-
// };
6+
exports.signup = function(req, res) {
7+
const randomNumba = authUtils.generateCode(99999, 10000);
8+
const user = new User({
9+
name: req.body.name, id: req.body.id, email: req.body.email, password: req.body.password, isPswdReset: false, resetCode: randomNumba, first_name: req.body.first_name, last_name: req.body.last_name, interests: req.body.interests, affiliation: req.body.affiliation, organisms: req.body.organisms
10+
});
11+
User.findOne({ email: req.body.email }, (err, existingUser) => {
12+
if (existingUser) { return res.status(409).send({ message: 'This email address has already been registered.' }); }
13+
const validData = user.validateSignup();
14+
if (validData !== '') { return res.status(409).send({ message: validData }); }
15+
user.save(() => {
16+
const mailbody = '<h1>Welcome ' + user.name + ' to Web Jam Apps.</h1><p>Click this <a style="color:blue; text-decoration:underline; cursor:pointer; cursor:hand" ' +
17+
'href="' + frontURL + '/userutil/?email=' + user.email + '">link</a>, then enter the following code to verify your email: <br><br><strong>' + randomNumba + '</strong></p>';
18+
authUtils.sendEmail(mailbody, user.email, 'Verify Your Email Address');
19+
return res.status(201).json({ email: user.email });
20+
});
21+
});
22+
};
23+
24+
exports.validemail = function(req, res) {
25+
console.log('email:' + req.body.email + ' resetCode:' + req.body.resetCode);
26+
User.findOne({ email: req.body.email, resetCode: req.body.resetCode }, (err, user) => {
27+
console.log(user);
28+
if (!user) {
29+
return res.status(401).json({ message: 'incorrect email or code' });
30+
}
31+
user.resetCode = '';
32+
user.isPswdReset = false;
33+
user.save((err) => {
34+
res.status(201).json({ success: true });
35+
});
36+
});
37+
};
38+
39+
exports.login = function(req, res) {
40+
console.log('req body email' + req.body.email);
41+
let reqUserEmail = '';
42+
reqUserEmail = authUtils.setIfExists(req.body.email);
43+
User.findOne({ email: reqUserEmail }, '+password', (err, user) => {
44+
if (!user) {
45+
return res.status(401).json({ message: 'Wrong email address' });
46+
} if (user.password === '' || user.password === null || user.password === undefined) {
47+
return res.status(401).json({ message: 'Please reset your password' });
48+
}
49+
authUtils.verifySaveUser(user, req, res);
50+
});
51+
};
52+
53+
exports.resetpass = function(req, res) {
54+
console.log('email:' + req.body.email);
55+
// User.findOne({ $or:[{ email: req.body.email }, { id: req.body.email }] }, (err, user) => {
56+
User.findOne({ email: req.body.email }, (err, user) => {
57+
console.log(user);
58+
if (!user) {
59+
return res.status(401).json({ message: 'incorrect email address' });
60+
}
61+
const randomNumba = authUtils.generateCode(99999, 10000);
62+
user.resetCode = randomNumba;
63+
user.isPswdReset = true;
64+
user.save((err) => {
65+
res.status(201).json({ email: user.email });
66+
const mailBody = '<h2>A password reset was requested for ' + user.name + '.</h2><p>Click this <a style="color:blue; text-decoration:underline; cursor:pointer; cursor:hand" href="' +
67+
frontURL + '/userutil/?email=' + user.email + '&form=reset">' +
68+
'link</a>, then enter the following code to reset your password: <br><br><strong>' + randomNumba + '</strong></p><p><i>If a reset was requested in error, you can ignore this email and login to web-jam.com as usual.</i></p>';
69+
authUtils.sendEmail(mailBody, user.email, 'Password Reset');
70+
});
71+
});
72+
};
73+
74+
exports.passwdreset = function(req, res) {
75+
console.log('email:' + req.body.email + ' resetCode:' + req.body.resetCode);
76+
User.findOne({ email: req.body.email, resetCode: req.body.resetCode }, (err, user) => {
77+
console.log(user);
78+
if (!user) {
79+
return res.status(401).json({ message: 'incorrect email or code' });
80+
}
81+
user.resetCode = '';
82+
user.isPswdReset = false;
83+
user.password = req.body.password;
84+
if (user.password.length < 8) {
85+
return res.status(401).send({ message: 'Password is not min 8 characters' });
86+
}
87+
user.save((err) => {
88+
res.status(201).json({ success: true });
89+
});
90+
});
91+
};
92+
93+
exports.changeemail = function(req, res) {
94+
console.log('request to change the email address');
95+
authUtils.checkEmailSyntax(req, res);
96+
User.findOne({ email: req.body.changeemail }, (err, user) => {
97+
if (user) {
98+
return res.status(409).json({ message: 'Email address already exists' });
99+
}
100+
User.findOne( { email: req.body.email }, (err, existinguser) => {
101+
if (!existinguser) {
102+
return res.status(409).json({ message: 'current user does not exist' });
103+
}
104+
existinguser.resetCode = authUtils.generateCode(99999, 10000);
105+
existinguser.changeemail = req.body.changeemail;
106+
existinguser.save((err) => {
107+
console.log(existinguser);
108+
res.status(201).json({ success: true });
109+
const mailBody = '<h2>An Email Address Change was Requested for ' + existinguser.name + '.</h2><p>Click this <a style="color:blue; text-decoration:underline; cursor:pointer; cursor:hand" href="' +
110+
frontURL + '/userutil/?changeemail=' + existinguser.changeemail + '">' +
111+
'link</a>, then enter the following code to validate this new email: <br><br><strong>' + existinguser.resetCode + '</strong></p><p><i>If this reset was requested in error, you can ignore it and login as usual.</i></p>';
112+
authUtils.sendEmail(mailBody, existinguser.changeemail, 'Email Change Request');
113+
});
114+
});
115+
});
116+
};
117+
118+
exports.updateemail = function(req, res) {
119+
console.log('validate with pin then change the email address');
120+
authUtils.checkEmailSyntax(req, res);
121+
User.findOne({ email: req.body.email }, (err, user) => {
122+
if (!user) {
123+
return res.status(409).json({ message: 'User does not exist' });
124+
}
125+
if (user.resetCode !== req.body.resetCode) {
126+
return res.status(409).json({ message: 'Reset code is wrong' });
127+
}
128+
if (user.changeemail !== req.body.changeemail) {
129+
return res.status(409).json({ message: 'Reset email is not valid' });
130+
}
131+
user.resetCode = '';
132+
user.email = req.body.changeemail;
133+
user.changeemail = '';
134+
user.save((err) => {
135+
res.status(201).json({ success: true });
136+
});
137+
});
138+
};

auth/authUtils.js

Lines changed: 80 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
const moment = require('moment');
22
const jwt = require('jwt-simple');
33
const config = require('../config');
4+
const nodemailer = require('nodemailer');
5+
// const uuid = require('uuid');
6+
// const crypto = require('crypto');
7+
// const fs = require('fs');
48

59
class AuthUtils {
610
static createJWT(user) {
@@ -21,17 +25,90 @@ class AuthUtils {
2125
return res.status(401).send({ message: 'Please make sure your request has an Authorization header' });
2226
}
2327
const token = req.headers.authorization.split(' ')[1];
24-
2528
let payload = null;
2629
try {
2730
payload = jwt.decode(token, config.hashString);
2831
} catch (err) {
2932
return res.status(401).send({ message: err.message });
3033
}
31-
3234
req.user = payload.sub;
3335
next();
3436
}
35-
}
37+
38+
static sendEmail(bodyhtml, toemail, subjectline) {
39+
let emailpassword = config.gmailpassword;
40+
/* istanbul ignore next */
41+
if (process.env.NODE_ENV === 'test') {
42+
emailpassword = '';
43+
}
44+
const transporter = nodemailer.createTransport({
45+
service: 'gmail',
46+
auth: {
47+
user: 'chemmariasherman@gmail.com',
48+
pass: emailpassword
49+
}
50+
});
51+
52+
const mailOptions = {
53+
from: 'chemmariasherman@gmail.com',
54+
to: toemail,
55+
subject: subjectline,
56+
html: bodyhtml
57+
};
58+
transporter.sendMail(mailOptions, (error, info) => {
59+
// console.log('trying to send an email');
60+
// console.log(mailOptions);
61+
// console.log(transporter);
62+
});
63+
}
64+
65+
static generateCode(hi, low) {
66+
const min = Math.ceil(low);
67+
const max = Math.floor(hi);
68+
return Math.floor(Math.random() * (max - min)) + min;
69+
}
70+
71+
static verifySaveUser(user, req, res) {
72+
let hascode = false;
73+
let hasnewemail = false;
74+
if (user.resetCode !== '' && user.resetCode !== null && user.resetCode !== undefined) {
75+
hascode = true;
76+
}
77+
if (user.changeemail !== null && user.changeemail !== '' && user.changeemail !== undefined) {
78+
hasnewemail = true;
79+
}
80+
// this checks if it is a brand new email that has not yet been verified
81+
if (hascode && !user.isPswdReset && !hasnewemail) {
82+
return res.status(401).json({ message: 'Validate your email address or click forgot password link to reset' });
83+
}
84+
user.comparePassword(req.body.password, (err, isMatch) => {
85+
if (!isMatch) { return res.status(401).json({ message: 'Wrong password' }); }
86+
this.saveSendToken(user, req, res);
87+
});
88+
}
89+
90+
static saveSendToken(user, req, res) {
91+
const userToken = { token: this.createJWT(user), email: user.email };
92+
user.isPswdReset = false;
93+
user.resetCode = '';
94+
user.changeemail = '';
95+
user.save(err =>
96+
res.status(200).json(userToken));
97+
}
98+
99+
static checkEmailSyntax(req, res) {
100+
if (/^\w+([.-]?\w+)*@\w+([.-]?\w+)*(\.\w{2,3})+$/.test(req.body.changeemail)) {
101+
return console.log('email is valid');
102+
}
103+
return res.status(409).json({ message: 'Email address is not a valid format' });
104+
}
105+
106+
static setIfExists(item) {
107+
if (item !== '' && item !== null && item !== undefined) {
108+
return item;
109+
}
110+
return '';
111+
}
112+
}
36113

37114
module.exports = AuthUtils;

auth/google.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,11 @@ class Google {
3232
User.findOne(filter, (err, existingUser) => {
3333
// console.log(existingUser);
3434
if (existingUser) {
35-
console.log('user exist');
35+
console.log('user exists');
36+
existingUser.password = '';
37+
// force the name of the user to be the name from google account
38+
existingUser.name = profile.name;
39+
existingUser.save();
3640
return res.send({ token: authUtils.createJWT(existingUser) });
3741
}
3842
const user = new User();

auth/index.js

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
const express = require('express');
44
// const authUtils = require('./authUtils');
5-
// var authController = require('./auth.controller.js');
5+
const authController = require('./auth.controller.js');
66
// var meController = require('./me.controller.js');
77
// var identSrv = require('./identSrv.js');
88
const google = require('./google.js');
@@ -14,10 +14,14 @@ const google = require('./google.js');
1414
// var yahoo = require('./yahoo.js');
1515
// var foursquare = require('./foursquare');
1616
const router = express.Router();
17-
18-
// router.post('/signup', authController.signup);
19-
// router.post('/login', authController.login);
17+
router.post('/signup', authController.signup);
18+
router.put('/validemail', authController.validemail);
2019
router.post('/google', google.authenticate);
20+
router.post('/login', authController.login);
21+
router.put('/resetpass', authController.resetpass);
22+
router.put('/passwdreset', authController.passwdreset);
23+
router.put('/changeemail', authController.changeemail); // request is made and verification pin is sent to new email, new email is stored in user.changeemail field
24+
router.put('/updateemail', authController.updateemail); // pin is processed and old email is replaced with new email
2125
// router.post('/linkedin', linkedin.authenticate);
2226
// router.post('/twitter', twitter.authenticate);
2327
// router.post('/facebook', facebook.authenticate);

0 commit comments

Comments
 (0)