Skip to content

Commit 5f3ecef

Browse files
authored
fix(config/scripts): Enhance User Creation and Ban Handling, Standardize Imports (danny-avila#1144)
* chore: use relative imports for scripts * fix(create-user): newUser.save() now properly awaited, double-check user creation, use relative imports, catch exception * fix(ban-user): catch exception, handle case where IP is undefined, proper check of user ban on login
1 parent a2ee575 commit 5f3ecef

File tree

7 files changed

+102
-27
lines changed

7 files changed

+102
-27
lines changed

api/cache/banViolation.js

+8-2
Original file line numberDiff line numberDiff line change
@@ -54,11 +54,17 @@ const banViolation = async (req, res, errorMessage) => {
5454
}
5555

5656
req.ip = removePorts(req);
57-
console.log(`[BAN] Banning user ${user_id} @ ${req.ip} for ${duration / 1000 / 60} minutes`);
57+
console.log(
58+
`[BAN] Banning user ${user_id} ${req.ip ? `@ ${req.ip} ` : ''}for ${
59+
duration / 1000 / 60
60+
} minutes`,
61+
);
5862

5963
const expiresAt = Date.now() + duration;
6064
await banLogs.set(user_id, { type, violation_count, duration, expiresAt });
61-
await banLogs.set(req.ip, { type, user_id, violation_count, duration, expiresAt });
65+
if (req.ip) {
66+
await banLogs.set(req.ip, { type, user_id, violation_count, duration, expiresAt });
67+
}
6268

6369
errorMessage.ban = true;
6470
errorMessage.ban_duration = duration;

api/server/middleware/checkBan.js

+52-12
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
const Keyv = require('keyv');
22
const uap = require('ua-parser-js');
3-
const { getLogStores } = require('../../cache');
43
const denyRequest = require('./denyRequest');
4+
const { getLogStores } = require('../../cache');
55
const { isEnabled, removePorts } = require('../utils');
66
const keyvRedis = require('../../cache/keyvRedis');
7+
const User = require('../../models/User');
78

89
const banCache = isEnabled(process.env.USE_REDIS)
910
? new Keyv({ store: keyvRedis })
@@ -52,12 +53,33 @@ const checkBan = async (req, res, next = () => {}) => {
5253
}
5354

5455
req.ip = removePorts(req);
55-
const userId = req.user?.id ?? req.user?._id ?? null;
56-
const ipKey = isEnabled(process.env.USE_REDIS) ? `ban_cache:ip:${req.ip}` : req.ip;
57-
const userKey = isEnabled(process.env.USE_REDIS) ? `ban_cache:user:${userId}` : userId;
56+
let userId = req.user?.id ?? req.user?._id ?? null;
57+
58+
if (!userId && req?.body?.email) {
59+
const user = await User.findOne({ email: req.body.email }, '_id').lean();
60+
userId = user?._id ? user._id.toString() : userId;
61+
}
62+
63+
if (!userId && !req.ip) {
64+
return next();
65+
}
66+
67+
let cachedIPBan;
68+
let cachedUserBan;
69+
70+
let ipKey = '';
71+
let userKey = '';
72+
73+
if (req.ip) {
74+
ipKey = isEnabled(process.env.USE_REDIS) ? `ban_cache:ip:${req.ip}` : req.ip;
75+
cachedIPBan = await banCache.get(ipKey);
76+
}
77+
78+
if (userId) {
79+
userKey = isEnabled(process.env.USE_REDIS) ? `ban_cache:user:${userId}` : userId;
80+
cachedUserBan = await banCache.get(userKey);
81+
}
5882

59-
const cachedIPBan = await banCache.get(ipKey);
60-
const cachedUserBan = await banCache.get(userKey);
6183
const cachedBan = cachedIPBan || cachedUserBan;
6284

6385
if (cachedBan) {
@@ -72,24 +94,42 @@ const checkBan = async (req, res, next = () => {}) => {
7294
return next();
7395
}
7496

75-
const ipBan = await banLogs.get(req.ip);
76-
const userBan = await banLogs.get(userId);
77-
const isBanned = ipBan || userBan;
97+
let ipBan;
98+
let userBan;
99+
100+
if (req.ip) {
101+
ipBan = await banLogs.get(req.ip);
102+
}
103+
104+
if (userId) {
105+
userBan = await banLogs.get(userId);
106+
}
107+
108+
const isBanned = !!(ipBan || userBan);
78109

79110
if (!isBanned) {
80111
return next();
81112
}
82113

83114
const timeLeft = Number(isBanned.expiresAt) - Date.now();
84115

85-
if (timeLeft <= 0) {
116+
if (timeLeft <= 0 && ipKey) {
86117
await banLogs.delete(ipKey);
118+
}
119+
120+
if (timeLeft <= 0 && userKey) {
87121
await banLogs.delete(userKey);
88122
return next();
89123
}
90124

91-
banCache.set(ipKey, isBanned, timeLeft);
92-
banCache.set(userKey, isBanned, timeLeft);
125+
if (ipKey) {
126+
banCache.set(ipKey, isBanned, timeLeft);
127+
}
128+
129+
if (userKey) {
130+
banCache.set(userKey, isBanned, timeLeft);
131+
}
132+
93133
req.banned = true;
94134
return await banResponse(req, res);
95135
};

api/server/services/AuthService.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ const registerUser = async (user) => {
9191
const salt = bcrypt.genSaltSync(10);
9292
const hash = bcrypt.hashSync(newUser.password, salt);
9393
newUser.password = hash;
94-
newUser.save();
94+
await newUser.save();
9595

9696
return { status: 200, user: newUser };
9797
} catch (err) {
@@ -117,7 +117,7 @@ const requestPasswordReset = async (email) => {
117117
}
118118

119119
let resetToken = crypto.randomBytes(32).toString('hex');
120-
const hash = await bcrypt.hashSync(resetToken, 10);
120+
const hash = bcrypt.hashSync(resetToken, 10);
121121

122122
await new Token({
123123
userId: user._id,

api/server/services/PluginService.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ const updateUserPluginAuth = async (userId, authField, pluginKey, value) => {
5858
value: encryptedValue,
5959
pluginKey,
6060
});
61-
newPluginAuth.save();
61+
await newPluginAuth.save();
6262
return newPluginAuth;
6363
}
6464
} catch (err) {

config/add-balance.js

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
const connectDb = require('@librechat/backend/lib/db/connectDb');
1+
const connectDb = require('../api/lib/db/connectDb');
22
const { askQuestion, silentExit } = require('./helpers');
3-
const User = require('@librechat/backend/models/User');
4-
const Transaction = require('@librechat/backend/models/Transaction');
3+
const User = require('../api/models/User');
4+
const Transaction = require('../api/models/Transaction');
55

66
(async () => {
77
/**

config/ban-user.js

+15-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
const connectDb = require('@librechat/backend/lib/db/connectDb');
1+
const connectDb = require('../api/lib/db/connectDb');
22
const { askQuestion, silentExit } = require('./helpers');
33
const banViolation = require('../api/cache/banViolation');
4-
const User = require('@librechat/backend/models/User');
4+
const User = require('../api/models/User');
55

66
(async () => {
77
/**
@@ -97,3 +97,16 @@ const User = require('@librechat/backend/models/User');
9797

9898
silentExit(0);
9999
})();
100+
101+
process.on('uncaughtException', (err) => {
102+
if (!err.message.includes('fetch failed')) {
103+
console.error('There was an uncaught error:');
104+
console.error(err);
105+
}
106+
107+
if (err.message.includes('fetch failed')) {
108+
return;
109+
} else {
110+
process.exit(1);
111+
}
112+
});

config/create-user.js

+21-5
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
const connectDb = require('@librechat/backend/lib/db/connectDb');
2-
const { registerUser } = require('@librechat/backend/server/services/AuthService');
1+
const connectDb = require('../api/lib/db/connectDb');
2+
const { registerUser } = require('../api/server/services/AuthService');
33
const { askQuestion, silentExit } = require('./helpers');
4-
const User = require('@librechat/backend/models/User');
4+
const User = require('../api/models/User');
55

66
(async () => {
77
/**
@@ -127,6 +127,22 @@ const User = require('@librechat/backend/models/User');
127127
}
128128

129129
// Done!
130-
console.green('User created successfully!');
131-
silentExit(0);
130+
const userCreated = await User.findOne({ $or: [{ email }, { username }] });
131+
if (userCreated) {
132+
console.green('User created successfully!');
133+
silentExit(0);
134+
}
132135
})();
136+
137+
process.on('uncaughtException', (err) => {
138+
if (!err.message.includes('fetch failed')) {
139+
console.error('There was an uncaught error:');
140+
console.error(err);
141+
}
142+
143+
if (err.message.includes('fetch failed')) {
144+
return;
145+
} else {
146+
process.exit(1);
147+
}
148+
});

0 commit comments

Comments
 (0)