Compare commits

..

No commits in common. "743f08189cc166c8e1b774df478d998aff6a5b18" and "384956677228c2ed899d974ea7ece681d953c14b" have entirely different histories.

7 changed files with 49 additions and 79 deletions

View file

@ -8,7 +8,7 @@ import Button from '../../../common/Button';
function SignupForm(props) { function SignupForm(props) {
const { const {
fields: { fields: {
username, /* email, */ password, confirmPassword username, email, password, confirmPassword
}, },
handleSubmit, handleSubmit,
submitting, submitting,
@ -33,7 +33,7 @@ function SignupForm(props) {
<span className="form-error">{username.error}</span> <span className="form-error">{username.error}</span>
)} )}
</p> </p>
{/* <p className="form__field"> <p className="form__field">
<label htmlFor="email" className="form__label">{props.t('SignupForm.Email')}</label> <label htmlFor="email" className="form__label">{props.t('SignupForm.Email')}</label>
<input <input
className="form__input" className="form__input"
@ -45,7 +45,7 @@ function SignupForm(props) {
{email.touched && email.error && ( {email.touched && email.error && (
<span className="form-error">{email.error}</span> <span className="form-error">{email.error}</span>
)} )}
</p> */} </p>
<p className="form__field"> <p className="form__field">
<label htmlFor="password" className="form__label">{props.t('SignupForm.Password')}</label> <label htmlFor="password" className="form__label">{props.t('SignupForm.Password')}</label>
<input <input
@ -84,7 +84,7 @@ function SignupForm(props) {
SignupForm.propTypes = { SignupForm.propTypes = {
fields: PropTypes.shape({ fields: PropTypes.shape({
username: PropTypes.object.isRequired, // eslint-disable-line username: PropTypes.object.isRequired, // eslint-disable-line
// email: PropTypes.object.isRequired, // eslint-disable-line email: PropTypes.object.isRequired, // eslint-disable-line
password: PropTypes.object.isRequired, // eslint-disable-line password: PropTypes.object.isRequired, // eslint-disable-line
confirmPassword: PropTypes.object.isRequired, // eslint-disable-line confirmPassword: PropTypes.object.isRequired, // eslint-disable-line
}).isRequired, }).isRequired,

View file

@ -9,9 +9,9 @@ import * as UserActions from '../actions';
import SignupForm from '../components/SignupForm'; import SignupForm from '../components/SignupForm';
import apiClient from '../../../utils/apiClient'; import apiClient from '../../../utils/apiClient';
import { validateSignup } from '../../../utils/reduxFormUtils'; import { validateSignup } from '../../../utils/reduxFormUtils';
// import SocialAuthButton from '../components/SocialAuthButton'; import SocialAuthButton from '../components/SocialAuthButton';
import Nav from '../../../components/Nav'; import Nav from '../../../components/Nav';
// import ResponsiveForm from '../components/ResponsiveForm'; import ResponsiveForm from '../components/ResponsiveForm';
class SignupView extends React.Component { class SignupView extends React.Component {
@ -123,9 +123,9 @@ SignupView.defaultProps = {
export default withTranslation()(reduxForm({ export default withTranslation()(reduxForm({
form: 'signup', form: 'signup',
fields: ['username', /* 'email', */ 'password', 'confirmPassword'], fields: ['username', 'email', 'password', 'confirmPassword'],
onSubmitFail, onSubmitFail,
validate: validateSignup, validate: validateSignup,
asyncValidate, asyncValidate,
asyncBlurFields: ['username'/* , 'email' */] asyncBlurFields: ['username', 'email']
}, mapStateToProps, mapDispatchToProps)(SignupView)); }, mapStateToProps, mapDispatchToProps)(SignupView));

View file

@ -28,11 +28,9 @@ function validateNameEmail(formProps, errors) {
errors.username = i18n.t('ReduxFormUtils.errorValidUsername'); errors.username = i18n.t('ReduxFormUtils.errorValidUsername');
} }
// if (!formProps.email) { if (!formProps.email) {
// errors.email = i18n.t('ReduxFormUtils.errorEmptyEmail'); errors.email = i18n.t('ReduxFormUtils.errorEmptyEmail');
// } else } else if (
if (
formProps.email &&
// eslint-disable-next-line max-len // eslint-disable-next-line max-len
!formProps.email.match(EMAIL_REGEX)) { !formProps.email.match(EMAIL_REGEX)) {
errors.email = i18n.t('ReduxFormUtils.errorInvalidEmail'); errors.email = i18n.t('ReduxFormUtils.errorInvalidEmail');

View file

@ -1,26 +0,0 @@
#!/bin/sh
set -e
echo "HALLO!"
echo "Starting the mongodb daemon"
/usr/bin/mongod --fork --syslog
# echo "navigating to volume /var/www"
# cd /var/www
# echo "Creating soft link"
# ln -s /opt/mysite mysite
# a2enmod headers
# service apache2 restart
# a2ensite mysite.conf
# a2dissite 000-default.conf
# service apache2 reload
if [ -z "$1" ]
then
exec npm run start:prod
else
exec "$1"
fi

View file

@ -24,7 +24,7 @@ passport.deserializeUser((id, done) => {
* Sign in using Email/Username and Password. * Sign in using Email/Username and Password.
*/ */
passport.use(new LocalStrategy({ usernameField: 'email' }, (email, password, done) => { passport.use(new LocalStrategy({ usernameField: 'email' }, (email, password, done) => {
User.findByUsername(email) User.findByEmailOrUsername(email)
.then((user) => { // eslint-disable-line consistent-return .then((user) => { // eslint-disable-line consistent-return
if (!user) { if (!user) {
return done(null, false, { msg: `Email ${email} not found.` }); return done(null, false, { msg: `Email ${email} not found.` });

View file

@ -12,7 +12,7 @@ export * from './user.controller/apiKey';
export function userResponse(user) { export function userResponse(user) {
return { return {
// email: user.email, email: user.email,
username: user.username, username: user.username,
preferences: user.preferences, preferences: user.preferences,
apiKeys: user.apiKeys, apiKeys: user.apiKeys,
@ -36,32 +36,31 @@ export function findUserByUsername(username, cb) {
} }
export function createUser(req, res, next) { export function createUser(req, res, next) {
const { username, _ } = req.body; const { username, email } = req.body;
const { password } = req.body; const { password } = req.body;
// const emailLowerCase = email ? email.toLowerCase() : null; const emailLowerCase = email.toLowerCase();
const EMAIL_VERIFY_TOKEN_EXPIRY_TIME = Date.now() + (3600000 * 24); // 24 hours const EMAIL_VERIFY_TOKEN_EXPIRY_TIME = Date.now() + (3600000 * 24); // 24 hours
random((tokenError, token) => { random((tokenError, token) => {
const user = new User({ const user = new User({
username, username,
// email: emailLowerCase, email: emailLowerCase,
password, password,
verified: User.EmailConfirmation.Sent, verified: User.EmailConfirmation.Sent,
verifiedToken: token, verifiedToken: token,
verifiedTokenExpires: EMAIL_VERIFY_TOKEN_EXPIRY_TIME, verifiedTokenExpires: EMAIL_VERIFY_TOKEN_EXPIRY_TIME,
}); });
User.findByUsername(username, (err, existingUser) => { User.findByEmailAndUsername(email, username, (err, existingUser) => {
if (err) { if (err) {
res.status(404).send({ error: err }); res.status(404).send({ error: err });
return; return;
} }
if (existingUser) { if (existingUser) {
const fieldInUse = 'Username'; const fieldInUse = existingUser.email.toLowerCase() === emailLowerCase ? 'Email' : 'Username';
res.status(422).send({ error: `${fieldInUse} is in use` }); res.status(422).send({ error: `${fieldInUse} is in use` });
return; return;
} }
user.save((saveErr) => { user.save((saveErr) => {
if (saveErr) { if (saveErr) {
next(saveErr); next(saveErr);
@ -74,17 +73,17 @@ export function createUser(req, res, next) {
} }
const protocol = process.env.NODE_ENV === 'production' ? 'https' : 'http'; const protocol = process.env.NODE_ENV === 'production' ? 'https' : 'http';
// const mailOptions = renderEmailConfirmation({ const mailOptions = renderEmailConfirmation({
// body: { body: {
// domain: `${protocol}://${req.headers.host}`, domain: `${protocol}://${req.headers.host}`,
// link: `${protocol}://${req.headers.host}/verify?t=${token}` link: `${protocol}://${req.headers.host}/verify?t=${token}`
// }, },
// to: req.user.email, to: req.user.email,
// }); });
// mail.send(mailOptions, (mailErr, result) => { // eslint-disable-line no-unused-vars mail.send(mailOptions, (mailErr, result) => { // eslint-disable-line no-unused-vars
res.json(userResponse(req.user)); res.json(userResponse(req.user));
// }); });
}); });
}); });
}); });
@ -143,19 +142,18 @@ export function resetPasswordInitiate(req, res) {
async.waterfall([ async.waterfall([
random, random,
(token, done) => { (token, done) => {
// disable since we don't use email User.findByEmail(req.body.email, (err, user) => {
// User.findByEmail(req.body.email, (err, user) => { if (!user) {
// if (!user) { res.json({ success: true, message: 'If the email is registered with the editor, an email has been sent.' });
// res.json({ success: true, message: 'If the email is registered with the editor, an email has been sent.' }); return;
// return; }
// } user.resetPasswordToken = token;
// user.resetPasswordToken = token; user.resetPasswordExpires = Date.now() + 3600000; // 1 hour
// user.resetPasswordExpires = Date.now() + 3600000; // 1 hour
// user.save((saveErr) => { user.save((saveErr) => {
// done(saveErr, token, user); done(saveErr, token, user);
// }); });
// }); });
}, },
(token, user, done) => { (token, user, done) => {
const protocol = process.env.NODE_ENV === 'production' ? 'https' : 'http'; const protocol = process.env.NODE_ENV === 'production' ? 'https' : 'http';

View file

@ -50,7 +50,7 @@ const userSchema = new Schema({
verifiedToken: String, verifiedToken: String,
verifiedTokenExpires: Date, verifiedTokenExpires: Date,
github: { type: String }, github: { type: String },
email: { type: String }, email: { type: String, unique: true },
tokens: Array, tokens: Array,
apiKeys: { type: [apiKeySchema] }, apiKeys: { type: [apiKeySchema] },
preferences: { preferences: {
@ -192,10 +192,10 @@ userSchema.statics.findByUsername = function findByUsername(username, cb) {
* @return {Promise<Object>} - Returns Promise fulfilled by User document * @return {Promise<Object>} - Returns Promise fulfilled by User document
*/ */
userSchema.statics.findByEmailOrUsername = function findByEmailOrUsername(value, cb) { userSchema.statics.findByEmailOrUsername = function findByEmailOrUsername(value, cb) {
// const isEmail = value.indexOf('@') > -1; const isEmail = value.indexOf('@') > -1;
// if (isEmail) { if (isEmail) {
// return this.findByEmail(value, cb); return this.findByEmail(value, cb);
// } }
return this.findByUsername(value, cb); return this.findByUsername(value, cb);
}; };
@ -210,11 +210,11 @@ userSchema.statics.findByEmailOrUsername = function findByEmailOrUsername(value,
* @return {Promise<Object>} - Returns Promise fulfilled by User document * @return {Promise<Object>} - Returns Promise fulfilled by User document
*/ */
userSchema.statics.findByEmailAndUsername = function findByEmailAndUsername(email, username, cb) { userSchema.statics.findByEmailAndUsername = function findByEmailAndUsername(email, username, cb) {
const query = { username // override username only as we don't want to register email addresses const query = {
// $or: [ $or: [
// { email }, { email },
// { username } { username }
// ] ]
}; };
return this.findOne(query).collation({ locale: 'en', strength: 2 }).exec(cb); return this.findOne(query).collation({ locale: 'en', strength: 2 }).exec(cb);
}; };