service/AuthService.java
[Non-Atomic Read-And-Save Verification]
// VULNERABLE: Read-and-save pattern allows concurrent email scanners
// or double-clicks to pass the 'isConsumed' check before 'save()' executes.
User user = userRepository.findByEmail(email).orElseThrow();
if (user.isMagicTokenConsumed()) {
throw new AuthException("Token already used.");
}
// Strict fingerprint check causes hard lockout if opened cross-device
if (!user.getFingerprint().equals(clientFingerprint)) {
throw new FingerprintMismatchException("Cross-device login forbidden.");
}
user.setMagicTokenConsumed(true);
userRepository.save(user); // <--- Race window open until DB commit finishes!