complexPassword.js 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. import _ from 'lodash'
  2. /* global PassField */
  3. /* eslint-disable
  4. max-len
  5. */
  6. import App from '../base'
  7. import '../vendor/libs/passfield'
  8. App.directive('complexPassword', function () {
  9. return {
  10. require: ['^asyncForm', 'ngModel'],
  11. link(scope, element, attrs, ctrl) {
  12. PassField.Config.blackList = []
  13. const defaultPasswordOpts = {
  14. pattern: '',
  15. length: {
  16. min: 6,
  17. max: 72,
  18. },
  19. allowEmpty: false,
  20. allowAnyChars: false,
  21. isMasked: true,
  22. showToggle: false,
  23. showGenerate: false,
  24. showTip: false,
  25. showWarn: false,
  26. checkMode: PassField.CheckModes.STRICT,
  27. chars: {
  28. digits: '1234567890',
  29. letters: 'abcdefghijklmnopqrstuvwxyz',
  30. letters_up: 'ABCDEFGHIJKLMNOPQRSTUVWXYZ',
  31. symbols: '@#$%^&*()-_=+[]{};:<>/?!£€.,',
  32. },
  33. }
  34. const opts = _.defaults(
  35. window.passwordStrengthOptions || {},
  36. defaultPasswordOpts
  37. )
  38. if (opts.length.min === 1) {
  39. // this allows basically anything to be a valid password
  40. opts.acceptRate = 0
  41. }
  42. if (opts.length.max > 72) {
  43. // there is a hard limit of 71 characters in the password at the backend
  44. opts.length.max = 72
  45. }
  46. if (opts.length.max > 0) {
  47. // PassField's notion of 'max' is non-inclusive
  48. opts.length.max += 1
  49. }
  50. const passField = new PassField.Field('passwordField', opts)
  51. const [asyncFormCtrl, ngModelCtrl] = Array.from(ctrl)
  52. ngModelCtrl.$parsers.unshift(function (modelValue) {
  53. let isValid = passField.validatePass()
  54. const email = asyncFormCtrl.getEmail() || window.usersEmail
  55. if (!isValid) {
  56. scope.complexPasswordErrorMessage =
  57. passField.getPassValidationMessage()
  58. } else if (typeof email === 'string' && email !== '') {
  59. const startOfEmail = email.split('@')[0]
  60. if (
  61. modelValue.indexOf(email) !== -1 ||
  62. modelValue.indexOf(startOfEmail) !== -1
  63. ) {
  64. isValid = false
  65. scope.complexPasswordErrorMessage =
  66. 'Password can not contain email address'
  67. }
  68. }
  69. if (opts.length.max != null && modelValue.length >= opts.length.max) {
  70. isValid = false
  71. scope.complexPasswordErrorMessage = `Maximum password length ${
  72. opts.length.max - 1
  73. } exceeded`
  74. }
  75. if (opts.length.min != null && modelValue.length < opts.length.min) {
  76. isValid = false
  77. scope.complexPasswordErrorMessage = `Password too short, minimum ${opts.length.min}`
  78. }
  79. ngModelCtrl.$setValidity('complexPassword', isValid)
  80. return modelValue
  81. })
  82. },
  83. }
  84. })