11import crypto from 'crypto' ;
22import async from 'async' ;
3- import escapeStringRegexp from 'escape-string-regexp' ;
43
54import User from '../models/user' ;
65import mail from '../utils/mail' ;
@@ -31,12 +30,9 @@ const random = (done) => {
3130} ;
3231
3332export function findUserByUsername ( username , cb ) {
34- User . findOne (
35- { username } ,
36- ( err , user ) => {
37- cb ( user ) ;
38- }
39- ) ;
33+ User . findOne ( { username } ) . collation ( { locale : 'en' , strength : 2 } ) . exec ( ( err , user ) => {
34+ cb ( user ) ;
35+ } ) ;
4036}
4137
4238export function createUser ( req , res , next ) {
@@ -54,60 +50,57 @@ export function createUser(req, res, next) {
5450 verifiedTokenExpires : EMAIL_VERIFY_TOKEN_EXPIRY_TIME ,
5551 } ) ;
5652
57- User . findOne (
58- {
59- $or : [
60- { email : new RegExp ( `^${ escapeStringRegexp ( email ) } $` , 'i' ) } ,
61- { username : new RegExp ( `^${ escapeStringRegexp ( username ) } $` , 'i' ) }
62- ]
63- } ,
64- ( err , existingUser ) => {
65- if ( err ) {
66- res . status ( 404 ) . send ( { error : err } ) ;
67- return ;
68- }
53+ User . findOne ( {
54+ $or : [
55+ { email } ,
56+ { username }
57+ ]
58+ } ) . collation ( { locale : 'en' , strength : 2 } ) . exec ( ( err , existingUser ) => {
59+ if ( err ) {
60+ res . status ( 404 ) . send ( { error : err } ) ;
61+ return ;
62+ }
6963
70- if ( existingUser ) {
71- const fieldInUse = existingUser . email . toLowerCase ( ) === emailLowerCase ? 'Email' : 'Username' ;
72- res . status ( 422 ) . send ( { error : `${ fieldInUse } is in use` } ) ;
64+ if ( existingUser ) {
65+ const fieldInUse = existingUser . email . toLowerCase ( ) === emailLowerCase ? 'Email' : 'Username' ;
66+ res . status ( 422 ) . send ( { error : `${ fieldInUse } is in use` } ) ;
67+ return ;
68+ }
69+ user . save ( ( saveErr ) => {
70+ if ( saveErr ) {
71+ next ( saveErr ) ;
7372 return ;
7473 }
75- user . save ( ( saveErr ) => {
76- if ( saveErr ) {
77- next ( saveErr ) ;
74+ req . logIn ( user , ( loginErr ) => {
75+ if ( loginErr ) {
76+ next ( loginErr ) ;
7877 return ;
7978 }
80- req . logIn ( user , ( loginErr ) => {
81- if ( loginErr ) {
82- next ( loginErr ) ;
83- return ;
84- }
85-
86- const protocol = process . env . NODE_ENV === 'production' ? 'https' : 'http' ;
87- const mailOptions = renderEmailConfirmation ( {
88- body : {
89- domain : `${ protocol } ://${ req . headers . host } ` ,
90- link : `${ protocol } ://${ req . headers . host } /verify?t=${ token } `
91- } ,
92- to : req . user . email ,
93- } ) ;
94-
95- mail . send ( mailOptions , ( mailErr , result ) => { // eslint-disable-line no-unused-vars
96- res . json ( userResponse ( req . user ) ) ;
97- } ) ;
79+
80+ const protocol = process . env . NODE_ENV === 'production' ? 'https' : 'http' ;
81+ const mailOptions = renderEmailConfirmation ( {
82+ body : {
83+ domain : `${ protocol } ://${ req . headers . host } ` ,
84+ link : `${ protocol } ://${ req . headers . host } /verify?t=${ token } `
85+ } ,
86+ to : req . user . email ,
87+ } ) ;
88+
89+ mail . send ( mailOptions , ( mailErr , result ) => { // eslint-disable-line no-unused-vars
90+ res . json ( userResponse ( req . user ) ) ;
9891 } ) ;
9992 } ) ;
100- }
101- ) ;
93+ } ) ;
94+ } ) ;
10295 } ) ;
10396}
10497
10598export function duplicateUserCheck ( req , res ) {
10699 const checkType = req . query . check_type ;
107100 const value = req . query [ checkType ] ;
108101 const query = { } ;
109- query [ checkType ] = new RegExp ( `^ ${ escapeStringRegexp ( value ) } $` , 'i' ) ;
110- User . findOne ( query , ( err , user ) => {
102+ query [ checkType ] = value ;
103+ User . findOne ( query ) . collation ( { locale : 'en' , strength : 2 } ) . exec ( ( err , user ) => {
111104 if ( user ) {
112105 return res . json ( {
113106 exists : true ,
@@ -151,18 +144,19 @@ export function resetPasswordInitiate(req, res) {
151144 async . waterfall ( [
152145 random ,
153146 ( token , done ) => {
154- User . findOne ( { email : req . body . email . toLowerCase ( ) } , ( err , user ) => {
155- if ( ! user ) {
156- res . json ( { success : true , message : 'If the email is registered with the editor, an email has been sent.' } ) ;
157- return ;
158- }
159- user . resetPasswordToken = token ;
160- user . resetPasswordExpires = Date . now ( ) + 3600000 ; // 1 hour
147+ User . findOne ( { email : req . body . email . toLowerCase ( ) } )
148+ . collation ( { locale : 'en' , strength : 2 } ) . exec ( ( err , user ) => {
149+ if ( ! user ) {
150+ res . json ( { success : true , message : 'If the email is registered with the editor, an email has been sent.' } ) ;
151+ return ;
152+ }
153+ user . resetPasswordToken = token ;
154+ user . resetPasswordExpires = Date . now ( ) + 3600000 ; // 1 hour
161155
162- user . save ( ( saveErr ) => {
163- done ( saveErr , token , user ) ;
156+ user . save ( ( saveErr ) => {
157+ done ( saveErr , token , user ) ;
158+ } ) ;
164159 } ) ;
165- } ) ;
166160 } ,
167161 ( token , user , done ) => {
168162 const protocol = process . env . NODE_ENV === 'production' ? 'https' : 'http' ;
@@ -281,7 +275,7 @@ export function updatePassword(req, res) {
281275}
282276
283277export function userExists ( username , callback ) {
284- User . findOne ( { username : new RegExp ( `^ ${ escapeStringRegexp ( username ) } $` , 'i' ) } , ( err , user ) => (
278+ User . findOne ( username ) . collation ( { locale : 'en' , strength : 2 } ) . exec ( ( err , user ) => (
285279 user ? callback ( true ) : callback ( false )
286280 ) ) ;
287281}
0 commit comments