forked from freeCodeCamp/freeCodeCamp
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge branch 'staging' of github.com:FreeCodeCamp/freecodecamp into s…
…taging Conflicts: seed/field-guides.json
- Loading branch information
Showing
59 changed files
with
17,541 additions
and
304 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,171 @@ | ||
var debug = require('debug')('freecc:user:remote'); | ||
var blacklistedUsernames = | ||
require('../../server/utils/constants').blacklistedUsernames; | ||
|
||
module.exports = function(User) { | ||
// NOTE(berks): user email validation currently not needed but build in. This | ||
// work around should let us sneak by | ||
// see: | ||
// https://github.com/strongloop/loopback/issues/1137#issuecomment-109200135 | ||
delete User.validations.email; | ||
// set salt factor for passwords | ||
User.settings.saltWorkFactor = 5; | ||
debug('setting up user hooks'); | ||
// send verification email to new camper | ||
User.afterRemote('create', function(ctx, user, next) { | ||
debug('user created, sending email'); | ||
if (!user.email) { return next(); } | ||
|
||
var mailOptions = { | ||
type: 'email', | ||
to: user.email, | ||
from: '[email protected]', | ||
subject: 'Welcome to Free Code Camp!', | ||
redirect: '/', | ||
text: [ | ||
'Greetings from San Francisco!\n\n', | ||
'Thank you for joining our community.\n', | ||
'Feel free to email us at this address if you have ', | ||
'any questions about Free Code Camp.\n', | ||
'And if you have a moment, check out our blog: ', | ||
'blog.freecodecamp.com.\n', | ||
'Good luck with the challenges!\n\n', | ||
'- the Free Code Camp Volunteer Team' | ||
].join('') | ||
}; | ||
user.verify(mailOptions, function(err) { | ||
if (err) { return next(err); } | ||
debug('verification email sent'); | ||
ctx.req.flash('success', { | ||
msg: [ | ||
'Please check your email and click on the verification link ' | ||
+ 'before logging in.' | ||
] | ||
}); | ||
ctx.res.redirect('/'); | ||
}); | ||
}); | ||
|
||
User.afterRemote('confirm', function(ctx) { | ||
ctx.req.flash('success', { | ||
msg: [ | ||
'You\'re email has been confirmed!' | ||
] | ||
}); | ||
ctx.res.redirect('/email-signin'); | ||
}); | ||
|
||
User.afterRemote('login', function(ctx, instance, next) { | ||
var res = ctx.res; | ||
var req = ctx.req; | ||
|
||
User.findOne({where: {email: ctx.args.credentials.email}}, | ||
function(err, response) { | ||
if (err) { | ||
return next(err); | ||
} | ||
if (response.emailVerified !== true) { | ||
return res.redirect('/'); | ||
} | ||
User.login({ | ||
email: ctx.args.credentials.email, | ||
password: ctx.args.credentials.password, | ||
ttl: Infinity | ||
}, function(err, accessToken) { | ||
if (err) { | ||
req.flash('errors', { | ||
msg: [ | ||
'Invalid username or password.' | ||
] | ||
}); | ||
return res.redirect('/'); | ||
} | ||
var config = { | ||
signed: !!req.signedCookies, | ||
maxAge: accessToken.ttl | ||
}; | ||
if (accessToken && accessToken.id) { | ||
res.cookie('access_token', accessToken.id, config); | ||
res.cookie('userId', accessToken.userId, config); | ||
} | ||
req.logIn(response, function(err) { | ||
if (err) { | ||
return next(err); | ||
} | ||
req.flash('success', { msg: 'Success! You are logged in.' }); | ||
return res.redirect('/'); | ||
}); | ||
}); | ||
}); | ||
return res.redirect('/'); | ||
}); | ||
|
||
User.afterRemote('logout', function(ctx, result, next) { | ||
var res = ctx.result; | ||
res.clearCookie('access_token'); | ||
res.clearCookie('userId'); | ||
next(); | ||
}); | ||
|
||
User.doesExist = function doesExist(username, email, cb) { | ||
if (!username && !email) { | ||
return process.nextTick(function() { | ||
cb(null, false); | ||
}); | ||
} | ||
debug('checking existence'); | ||
|
||
// check to see if username is on blacklist | ||
if (username && blacklistedUsernames.indexOf(username) !== -1) { | ||
return cb(null, true); | ||
} | ||
|
||
var where = {}; | ||
if (username) { | ||
where.username = username.toLowerCase(); | ||
} else { | ||
where.email = email ? email.toLowerCase() : email; | ||
} | ||
debug('where', where); | ||
User.count( | ||
where, | ||
function (err, count) { | ||
if (err) { | ||
debug('err checking existance: ', err); | ||
return cb(err); | ||
} | ||
if (count > 0) { | ||
return cb(null, true); | ||
} | ||
return cb(null, false); | ||
} | ||
); | ||
}; | ||
|
||
User.remoteMethod( | ||
'doesExist', | ||
{ | ||
description: 'checks whether a user exists using email or username', | ||
accepts: [ | ||
{ | ||
arg: 'username', | ||
type: 'string' | ||
}, | ||
{ | ||
arg: 'email', | ||
type: 'string' | ||
} | ||
], | ||
returns: [ | ||
{ | ||
arg: 'exists', | ||
type: 'boolean' | ||
} | ||
], | ||
http: { | ||
path: '/exists', | ||
verb: 'get' | ||
} | ||
} | ||
); | ||
}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Large diffs are not rendered by default.
Oops, something went wrong.
Oops, something went wrong.