Skip to content

Commit cf9b6f6

Browse files
committed
ref: Allow to extract user IP address without req.user present
1 parent 424d50e commit cf9b6f6

File tree

2 files changed

+70
-43
lines changed

2 files changed

+70
-43
lines changed

packages/node/src/handlers.ts

Lines changed: 32 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -174,36 +174,21 @@ const DEFAULT_USER_KEYS = ['id', 'username', 'email'];
174174

175175
/** JSDoc */
176176
function extractUserData(
177-
req: {
178-
ip?: string;
179-
connection?: {
180-
remoteAddress?: string;
181-
};
182-
user?: {
183-
[key: string]: any;
184-
};
177+
user: {
178+
[key: string]: any;
185179
},
186180
keys: boolean | string[],
187181
): { [key: string]: any } {
188-
const user: { [key: string]: any } = {};
182+
const extractedUser: { [key: string]: any } = {};
189183
const attributes = Array.isArray(keys) ? keys : DEFAULT_USER_KEYS;
190184

191185
attributes.forEach(key => {
192-
if (req.user && key in req.user) {
193-
user[key] = req.user[key];
186+
if (user && key in user) {
187+
extractedUser[key] = user[key];
194188
}
195189
});
196190

197-
// client ip:
198-
// node: req.connection.remoteAddress
199-
// express, koa: req.ip
200-
const ip = req.ip || (req.connection && req.connection.remoteAddress);
201-
202-
if (ip) {
203-
user.ip_address = ip;
204-
}
205-
206-
return user;
191+
return extractedUser;
207192
}
208193

209194
/**
@@ -229,6 +214,13 @@ export function parseRequest(
229214
event: Event,
230215
req: {
231216
[key: string]: any;
217+
user?: {
218+
[key: string]: any;
219+
};
220+
ip?: string;
221+
connection?: {
222+
remoteAddress?: string;
223+
};
232224
},
233225
options?: ParseRequestOptions,
234226
): Event {
@@ -260,11 +252,25 @@ export function parseRequest(
260252
event.server_name = global.process.env.SENTRY_NAME || os.hostname();
261253
}
262254

263-
if (options.user && req.user) {
264-
event.user = {
265-
...event.user,
266-
...extractUserData(req, options.user),
267-
};
255+
if (options.user) {
256+
const extractedUser = req.user ? extractUserData(req.user, options.user) : {};
257+
258+
// client ip:
259+
// node: req.connection.remoteAddress
260+
// express, koa: req.ip
261+
if (Array.isArray(options.user) && options.user.includes('ip')) {
262+
const ip = req.ip || (req.connection && req.connection.remoteAddress);
263+
if (ip) {
264+
extractedUser.ip_address = ip;
265+
}
266+
}
267+
268+
if (Object.keys(extractedUser)) {
269+
event.user = {
270+
...event.user,
271+
...extractedUser,
272+
};
273+
}
268274
}
269275

270276
if (options.transaction && !event.transaction) {

packages/node/test/handlers.test.ts

Lines changed: 38 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -22,27 +22,48 @@ describe('parseRequest', () => {
2222
const DEFAULT_USER_KEYS = ['id', 'username', 'email'];
2323
const CUSTOM_USER_KEYS = ['custom_property'];
2424

25-
test('parseRequest.user only contains the default properties from the user', done => {
26-
const fakeEvent: Event = {};
27-
const parsedRequest: Event = parseRequest(fakeEvent, mockReq);
28-
const userKeys = Object.keys(parsedRequest.user);
29-
30-
expect(userKeys).toEqual(DEFAULT_USER_KEYS);
31-
expect(userKeys).not.toEqual(expect.arrayContaining(CUSTOM_USER_KEYS));
32-
done();
25+
test('parseRequest.user only contains the default properties from the user', () => {
26+
const parsedRequest: Event = parseRequest({}, mockReq, {
27+
user: DEFAULT_USER_KEYS,
28+
});
29+
expect(Object.keys(parsedRequest.user as any[])).toEqual(DEFAULT_USER_KEYS);
3330
});
3431

35-
test('parseRequest.user only contains the custom properties specified in the options.user array', done => {
36-
const options = {
32+
test('parseRequest.user only contains the custom properties specified in the options.user array', () => {
33+
const parsedRequest: Event = parseRequest({}, mockReq, {
3734
user: CUSTOM_USER_KEYS,
38-
};
39-
const fakeEvent: Event = {};
40-
const parsedRequest: Event = parseRequest(fakeEvent, mockReq, options);
41-
const userKeys = Object.keys(parsedRequest.user);
35+
});
36+
expect(Object.keys(parsedRequest.user as any[])).toEqual(CUSTOM_USER_KEYS);
37+
});
4238

43-
expect(userKeys).toEqual(CUSTOM_USER_KEYS);
44-
expect(userKeys).not.toEqual(expect.arrayContaining(DEFAULT_USER_KEYS));
45-
done();
39+
test('parseRequest.user can extract ip from req.ip', () => {
40+
const parsedRequest: Event = parseRequest(
41+
{},
42+
{
43+
...mockReq,
44+
ip: '123',
45+
},
46+
{
47+
user: ['ip'],
48+
},
49+
);
50+
expect(parsedRequest.user!.ip_address).toEqual('123');
51+
});
52+
53+
test('parseRequest.user can extract ip from req.connection.remoteAddress', () => {
54+
const parsedRequest: Event = parseRequest(
55+
{},
56+
{
57+
...mockReq,
58+
connection: {
59+
remoteAddress: '321',
60+
},
61+
},
62+
{
63+
user: ['ip'],
64+
},
65+
);
66+
expect(parsedRequest.user!.ip_address).toEqual('321');
4667
});
4768
});
4869

0 commit comments

Comments
 (0)