@@ -2,6 +2,28 @@ import { IncomingMessage } from 'http'
22
33import { Settings } from '../@types/settings'
44
5+ const normalizeIpAddress = ( input : string ) : string => {
6+ if ( input . startsWith ( '::ffff:' ) ) {
7+ return input . slice ( 7 )
8+ }
9+
10+ return input
11+ }
12+
13+ const isTrustedProxy = ( ipAddress : string , settings : Settings ) : boolean => {
14+ const trustedProxies = settings . network ?. trustedProxies
15+
16+ if ( ! Array . isArray ( trustedProxies ) || trustedProxies . length === 0 ) {
17+ return false
18+ }
19+
20+ const normalizedRemote = normalizeIpAddress ( ipAddress )
21+
22+ return trustedProxies . some ( ( trustedProxy ) => {
23+ return normalizeIpAddress ( trustedProxy ) === normalizedRemote
24+ } )
25+ }
26+
527export const getRemoteAddress = ( request : IncomingMessage , settings : Settings ) : string => {
628 let header : string | undefined
729 // TODO: Remove deprecation warning
@@ -13,7 +35,22 @@ export const getRemoteAddress = (request: IncomingMessage, settings: Settings):
1335 header = settings . network . remoteIpHeader as string
1436 }
1537
16- const result = ( request . headers [ header ] ?? request . socket . remoteAddress ) as string
38+ const trustedProxies = settings . network ?. trustedProxies
39+ if ( header && ( ! Array . isArray ( trustedProxies ) || trustedProxies . length === 0 ) ) {
40+ console . warn ( 'WARNING: network.remoteIpHeader is set but network.trustedProxies is empty. Forwarded headers will be ignored. Add your proxy IP to network.trustedProxies.' )
41+ }
42+
43+ const headerAddress = header
44+ ? request . headers [ header ]
45+ : undefined
46+ const socketAddress = request . socket . remoteAddress
47+
48+ const trustedProxy = typeof socketAddress === 'string'
49+ && isTrustedProxy ( socketAddress , settings )
50+
51+ const result = trustedProxy && typeof headerAddress === 'string'
52+ ? headerAddress
53+ : socketAddress
1754
18- return result . split ( ',' ) [ 0 ]
55+ return ( result as string ) . split ( ',' ) [ 0 ] . trim ( )
1956}
0 commit comments