Record a failed login/2FA attempt by IP and, when known, by username.
(ip: str, username: str = "")
| 10210 | let shapeStr = (faceHeight / faceWidth > 1.35) ? (I18N.long || 'LONG') : ((faceHeight / faceWidth < 1.25) ? (I18N.round || 'ROUND') : (I18N.oval || 'OVAL')); |
| 10211 | let jawStr = (jawWidth > 0.8) ? (I18N.broad || 'BROAD') : (I18N.narrow || 'NARROW'); |
| 10212 | const leftEyeOpen = calcDist(landmarks[159], landmarks[145]) / faceHeight * 100; |
| 10213 | const rightEyeOpen = calcDist(landmarks[386], landmarks[374]) / faceHeight * 100; |
| 10214 | const eyeSpacing = calcDist(landmarks[159], landmarks[386]) / faceWidth; |
| 10215 | let eyeSetStr = (eyeSpacing > 0.44) ? (I18N.wide || 'WIDE') : ((eyeSpacing < 0.4) ? (I18N.close || 'CLOSE') : (I18N.avg || 'AVG')); |
| 10216 | let gaze = I18N.center || 'CENTER'; |
| 10217 | if (landmarks[468]) { |
| 10218 | const irisL_offset = (landmarks[468].x - landmarks[33].x) / (landmarks[133].x - landmarks[33].x); |
| 10219 | if (irisL_offset < 0.4) gaze = I18N.right || 'RIGHT'; |
| 10220 | else if (irisL_offset > 0.6) gaze = I18N.left || 'LEFT'; |
| 10221 | else if (landmarks[468].y < landmarks[159].y + 0.01) gaze = I18N.up || 'UP'; |
| 10222 | } |
| 10223 | const browL = calcDist(landmarks[52], landmarks[159]) / faceHeight; |
| 10224 | const browR = calcDist(landmarks[282], landmarks[386]) / faceHeight; |
| 10225 | const browLStr = browL > 0.12 ? (I18N.raise || 'RAISE') : (browL < 0.08 ? (I18N.furrow || 'FURROW') : (I18N.neut || 'NEUT')); |
| 10226 | const browRStr = browR > 0.12 ? (I18N.raise || 'RAISE') : (browR < 0.08 ? (I18N.furrow || 'FURROW') : (I18N.neut || 'NEUT')); |
| 10227 | const mouthOpen = calcDist(landmarks[13], landmarks[14]) / faceHeight * 100; |
| 10228 | const mouthW = calcDist(landmarks[61], landmarks[291]) / faceWidth * 100; |
no outgoing calls
no test coverage detected