Skip to content

Commit 501f161

Browse files
authored
feat: Logins log for Fail2Ban (danny-avila#986)
* login logs and output * fix(merge) * fix(wiston) unistall * fix(winston) installation in api * fix(logger) new module
1 parent c305d0b commit 501f161

File tree

5 files changed

+198
-27
lines changed

5 files changed

+198
-27
lines changed

api/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@
6161
"sharp": "^0.32.5",
6262
"tiktoken": "^1.0.10",
6363
"ua-parser-js": "^1.0.36",
64+
"winston": "^3.10.0",
6465
"zod": "^3.22.2"
6566
},
6667
"devDependencies": {

api/strategies/localStrategy.js

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
const { Strategy: PassportLocalStrategy } = require('passport-local');
22
const User = require('../models/User');
33
const { loginSchema, errorsToString } = require('./validators');
4-
const DebugControl = require('../utils/debug.js');
4+
const logger = require('../utils/logger');
55

66
async function validateLoginRequest(req) {
77
const { error } = loginSchema.safeParse(req.body);
@@ -28,21 +28,25 @@ async function passportLogin(req, email, password, done) {
2828
const validationError = await validateLoginRequest(req);
2929
if (validationError) {
3030
logError('Passport Local Strategy - Validation Error', { reqBody: req.body });
31+
logger.error(`[Login] [Login failed] [Username: ${email}] [Request-IP: ${req.ip}]`);
3132
return done(null, false, { message: validationError });
3233
}
3334

3435
const user = await findUserByEmail(email);
3536
if (!user) {
3637
logError('Passport Local Strategy - User Not Found', { email });
38+
logger.error(`[Login] [Login failed] [Username: ${email}] [Request-IP: ${req.ip}]`);
3739
return done(null, false, { message: 'Email does not exist.' });
3840
}
3941

4042
const isMatch = await comparePassword(user, password);
4143
if (!isMatch) {
4244
logError('Passport Local Strategy - Password does not match', { isMatch });
45+
logger.error(`[Login] [Login failed] [Username: ${email}] [Request-IP: ${req.ip}]`);
4346
return done(null, false, { message: 'Incorrect password.' });
4447
}
4548

49+
logger.info(`[Login] [Login successful] [Username: ${email}] [Request-IP: ${req.ip}]`);
4650
return done(null, user);
4751
} catch (err) {
4852
return done(err);
@@ -51,10 +55,7 @@ async function passportLogin(req, email, password, done) {
5155

5256
function logError(title, parameters) {
5357
const entries = Object.entries(parameters).map(([name, value]) => ({ name, value }));
54-
DebugControl.log.functionName(title);
55-
if (entries) {
56-
DebugControl.log.parameters(entries);
57-
}
58+
logger.error(title, { parameters: entries });
5859
}
5960

6061
module.exports = () =>

api/utils/LoggingSystem.js

Lines changed: 1 addition & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,4 @@
1-
const pino = require('pino');
2-
3-
const logger = pino({
4-
level: 'info',
5-
redact: {
6-
paths: [
7-
// List of Paths to redact from the logs (https://getpino.io/#/docs/redaction)
8-
'env.OPENAI_API_KEY',
9-
'env.BINGAI_TOKEN',
10-
'env.CHATGPT_TOKEN',
11-
'env.MEILI_MASTER_KEY',
12-
'env.GOOGLE_CLIENT_SECRET',
13-
'env.JWT_SECRET',
14-
'env.JWT_SECRET_DEV',
15-
'env.JWT_SECRET_PROD',
16-
'newUser.password',
17-
], // See example to filter object class instances
18-
censor: '***', // Redaction character
19-
},
20-
});
1+
const logger = require('./logger');
212

223
// Sanitize outside the logger paths. This is useful for sanitizing variables directly with Regex and patterns.
234
const redactPatterns = [

api/utils/logger.js

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
const winston = require('winston');
2+
3+
const logger = winston.createLogger({
4+
level: 'info',
5+
format: winston.format.combine(winston.format.timestamp(), winston.format.json()),
6+
transports: [
7+
new winston.transports.Console(),
8+
new winston.transports.File({ filename: 'login-logs.log' }),
9+
],
10+
});
11+
12+
module.exports = logger;

package-lock.json

Lines changed: 178 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)