mirror of
https://github.com/penpot/penpot.git
synced 2026-11-01 23:50:38 +00:00
* ⬆️ Update pnpm and its deps * ⬆️ Update JVM dependencies in backend and common Update several JVM dependencies across backend and common: - passay 1.6.6 -> 2.0.0 (package reorg, ctor-based rules) - siphash 2.0.0 -> 3.0.0 (SipHasher* renamed to SipHash*) - lettuce-core, guava, sqlite-jdbc, jsoup, lz4-java, markdown-clj, awssdk s3/sts, selmer, jackson-core/databind, shadow-cljs Adapt passay validation to the new API (moved packages, constructor configuration) and siphash to the renamed classes. Add tests for password validation and UUID advisory-lock hashing. AI-assisted-by: deepseek-v4-flash * ⬆️ Update node on docker images * 📎 Minor fixes related to pnpm12 compatibility
57 lines
2.3 KiB
Clojure
57 lines
2.3 KiB
Clojure
;; This Source Code Form is subject to the terms of the Mozilla Public
|
|
;; License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
;; file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
;;
|
|
;; Copyright (c) KALEIDOS INC Sucursal en España SL
|
|
|
|
(ns app.auth.passwords
|
|
"Password strength validation using Passay library."
|
|
(:require
|
|
[app.common.exceptions :as ex])
|
|
(:import
|
|
[org.passay PasswordData]
|
|
[org.passay.data EnglishCharacterData]
|
|
[org.passay.rule CharacterCharacteristicsRule CharacterRule]))
|
|
|
|
(defonce ^:private passay-code->translation-key
|
|
{"INSUFFICIENT_LOWERCASE" "errors.weak-password.insufficient-lowercase"
|
|
"INSUFFICIENT_UPPERCASE" "errors.weak-password.insufficient-uppercase"
|
|
"INSUFFICIENT_DIGIT" "errors.weak-password.insufficient-digits"
|
|
"INSUFFICIENT_SPECIAL" "errors.weak-password.insufficient-special"})
|
|
|
|
(defonce ^:private character-characteristics-rule
|
|
(CharacterCharacteristicsRule.
|
|
4
|
|
(into-array org.passay.rule.CharacterRule
|
|
[(CharacterRule. EnglishCharacterData/LowerCase 1)
|
|
(CharacterRule. EnglishCharacterData/UpperCase 1)
|
|
(CharacterRule. EnglishCharacterData/Digit 1)
|
|
(CharacterRule. EnglishCharacterData/Special 1)])))
|
|
|
|
(defn validate-password
|
|
"Validates password strength.
|
|
Returns nil if valid, or raises exception if invalid.
|
|
Checks:
|
|
- Minimum length of 8 characters
|
|
- At least 1 lowercase letter
|
|
- At least 1 uppercase letter
|
|
- At least 1 digit
|
|
- At least 1 special character"
|
|
[password]
|
|
(when (< (count password) 8)
|
|
(ex/raise :type :validation
|
|
:code :weak-password
|
|
:hint "password must be at least 8 characters"
|
|
:details ["errors.weak-password.too-short"]))
|
|
|
|
(let [password-data (PasswordData. password)
|
|
char-result (.validate character-characteristics-rule password-data)]
|
|
(when-not (.isValid char-result)
|
|
(ex/raise :type :validation
|
|
:code :weak-password
|
|
:hint "password must contain at least 1 lowercase letter, 1 uppercase letter, 1 digit, and 1 special character"
|
|
:details (->> (.getDetails char-result)
|
|
(mapv #(.getErrorCode %))
|
|
(mapv passay-code->translation-key)
|
|
(filterv some?))))))
|