mirror of
https://github.com/overleaf/overleaf.git
synced 2025-04-22 19:27:32 +00:00
added complex password validation to password resets
This commit is contained in:
parent
312c56a24e
commit
9764ab258b
8 changed files with 22 additions and 12 deletions
services/web
app
coffee
Features
infrastructure
views/user
public/coffee/directives
test/UnitTests/coffee
|
@ -5,6 +5,7 @@ logger = require "logger-sharelatex"
|
|||
module.exports =
|
||||
|
||||
renderRequestResetForm: (req, res)->
|
||||
logger.log "rendering request reset form"
|
||||
res.render "user/passwordReset",
|
||||
title:"reset_password"
|
||||
|
||||
|
|
|
@ -18,7 +18,7 @@ module.exports =
|
|||
if err then return callback(err)
|
||||
emailOptions =
|
||||
to : email
|
||||
setNewPasswordUrl : "#{settings.siteUrl}/user/password/set?passwordResetToken=#{token}"
|
||||
setNewPasswordUrl : "#{settings.siteUrl}/user/password/set?passwordResetToken=#{token}&email=#{encodeURIComponent(email)}"
|
||||
EmailHandler.sendEmail "passwordResetRequested", emailOptions, (error) ->
|
||||
return callback(error) if error?
|
||||
callback null, true
|
||||
|
|
|
@ -101,7 +101,7 @@ module.exports =
|
|||
PasswordResetTokenHandler.getNewToken user._id, { expiresIn: ONE_WEEK }, (err, token)->
|
||||
return next(err) if err?
|
||||
|
||||
setNewPasswordUrl = "#{settings.siteUrl}/user/password/set?passwordResetToken=#{token}"
|
||||
setNewPasswordUrl = "#{settings.siteUrl}/user/password/set?passwordResetToken=#{token}&email=#{encodeURIComponent(email)}"
|
||||
|
||||
EmailHandler.sendEmail "registered", {
|
||||
to: user.email
|
||||
|
|
|
@ -98,6 +98,11 @@ module.exports = (app)->
|
|||
res.locals.csrfToken = req.session._csrf
|
||||
next()
|
||||
|
||||
app.use (req, res, next) ->
|
||||
res.locals.getReqQueryParam = (field)->
|
||||
return req.query?[field]
|
||||
next()
|
||||
|
||||
app.use (req, res, next)->
|
||||
res.locals.fingerprint = (path) ->
|
||||
if fingerprints[path]?
|
||||
|
|
|
@ -22,17 +22,16 @@ block content
|
|||
a(href='/login') #{translate("login_here")}
|
||||
|
||||
.form-group
|
||||
input.form-control(
|
||||
input.form-control#passwordField(
|
||||
type='password',
|
||||
name='password',
|
||||
placeholder='new password',
|
||||
required,
|
||||
ng-model="password",
|
||||
autofocus
|
||||
autofocus,
|
||||
complex-password
|
||||
)
|
||||
span.small.text-primary(
|
||||
ng-show="passwordResetForm.password.$invalid && passwordResetForm.password.$dirty"
|
||||
) #{translate("required")}
|
||||
span.small.text-primary(ng-show="passwordResetForm.password.$error.complexPassword", ng-bind-html="complexPasswordErrorMessage")
|
||||
input(
|
||||
type="hidden",
|
||||
name="passwordResetToken",
|
||||
|
@ -43,3 +42,8 @@ block content
|
|||
type='submit',
|
||||
ng-disabled="passwordResetForm.$invalid"
|
||||
) #{translate("set_new_password")}
|
||||
|
||||
|
||||
script(type='text/javascript').
|
||||
window.usersEmail = "#{getReqQueryParam('email')}"
|
||||
window.passwordStrengthOptions = !{JSON.stringify(settings.passwordStrengthOptions || {})}
|
|
@ -113,10 +113,10 @@ define [
|
|||
|
||||
ngModelCtrl.$parsers.unshift (modelValue) ->
|
||||
isValid = passField.validatePass()
|
||||
email = asyncFormCtrl.getEmail() || window.usersEmail
|
||||
if !isValid
|
||||
scope.complexPasswordErrorMessage = passField.getPassValidationMessage()
|
||||
else if asyncFormCtrl.getEmail()?
|
||||
email = asyncFormCtrl.getEmail()
|
||||
else if (email? and email != "")
|
||||
startOfEmail = email?.split("@")?[0]
|
||||
if modelValue.indexOf(email) != -1 or modelValue.indexOf(startOfEmail) != -1
|
||||
isValid = false
|
||||
|
|
|
@ -57,7 +57,7 @@ describe "PasswordResetHandler", ->
|
|||
exists.should.equal true
|
||||
args = @EmailHandler.sendEmail.args[0]
|
||||
args[0].should.equal "passwordResetRequested"
|
||||
args[1].setNewPasswordUrl.should.equal "#{@settings.siteUrl}/user/password/set?passwordResetToken=#{@token}"
|
||||
args[1].setNewPasswordUrl.should.equal "#{@settings.siteUrl}/user/password/set?passwordResetToken=#{@token}&email=#{encodeURIComponent(@user.email)}"
|
||||
done()
|
||||
|
||||
it "should return exists = false for a holdingAccount", (done) ->
|
||||
|
|
|
@ -200,7 +200,7 @@ describe "UserController", ->
|
|||
@EmailHandler.sendEmail
|
||||
.calledWith("registered", {
|
||||
to: @user.email
|
||||
setNewPasswordUrl: "#{@settings.siteUrl}/user/password/set?passwordResetToken=#{@token}"
|
||||
setNewPasswordUrl: "#{@settings.siteUrl}/user/password/set?passwordResetToken=#{@token}&email=#{encodeURIComponent(@user.email)}"
|
||||
})
|
||||
.should.equal true
|
||||
|
||||
|
@ -208,7 +208,7 @@ describe "UserController", ->
|
|||
@res.json
|
||||
.calledWith({
|
||||
email: @user.email
|
||||
setNewPasswordUrl: "#{@settings.siteUrl}/user/password/set?passwordResetToken=#{@token}"
|
||||
setNewPasswordUrl: "#{@settings.siteUrl}/user/password/set?passwordResetToken=#{@token}&email=#{encodeURIComponent(@user.email)}"
|
||||
})
|
||||
.should.equal true
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue