common-tg-service 1.2.14 → 1.2.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -2,4 +2,10 @@ import { CanActivate, ExecutionContext } from '@nestjs/common';
2
2
  export declare class AuthGuard implements CanActivate {
3
3
  private readonly logger;
4
4
  canActivate(context: ExecutionContext): boolean;
5
+ private isIgnoredPath;
6
+ private isOriginAllowed;
7
+ private getHeaderValue;
8
+ private extractRealClientIP;
9
+ private extractRealOrigin;
10
+ private extractProtocol;
5
11
  }
@@ -12,23 +12,40 @@ const common_1 = require("@nestjs/common");
12
12
  const utils_1 = require("../utils");
13
13
  const logbots_1 = require("../utils/logbots");
14
14
  const ALLOWED_IPS = ['31.97.59.2', '148.230.84.50', '13.228.225.19', '18.142.128.26', '54.254.162.138'];
15
- const ALLOWED_ORIGINS = ['https://paidgirl.site', 'https://zomcall.netlify.app'];
15
+ const ALLOWED_ORIGINS = [
16
+ 'https://paidgirl.site',
17
+ 'https://zomcall.netlify.app',
18
+ 'https://ums-test.paidgirl.site',
19
+ 'http://localhost:3000',
20
+ 'http://localhost:3001',
21
+ 'http://localhost:5002',
22
+ ].map(origin => origin.toLowerCase());
23
+ const IGNORE_PATHS = [
24
+ '/',
25
+ '/apim',
26
+ '/health',
27
+ /^\/public\//,
28
+ ];
16
29
  let AuthGuard = AuthGuard_1 = class AuthGuard {
17
30
  constructor() {
18
31
  this.logger = new common_1.Logger(AuthGuard_1.name);
19
32
  }
20
33
  canActivate(context) {
21
34
  const request = context.switchToHttp().getRequest();
35
+ const path = request.path;
22
36
  const apiKey = request.headers['x-api-key']?.toString() ||
23
37
  request.query['apiKey']?.toString();
24
- const clientIp = (request.ip || request.connection.remoteAddress)?.replace('::ffff:', '');
25
- const origin = request.headers.origin;
38
+ const clientIp = this.extractRealClientIP(request);
39
+ const origin = this.extractRealOrigin(request);
40
+ if (this.isIgnoredPath(path)) {
41
+ return true;
42
+ }
26
43
  this.logger.debug(`Incoming request:`);
27
44
  this.logger.debug(`→ API Key: ${apiKey || 'NONE'}`);
28
45
  this.logger.debug(`→ Client IP: ${clientIp}`);
29
46
  this.logger.debug(`→ Origin: ${origin || 'NONE'}`);
30
47
  let passedReason = null;
31
- if (apiKey && apiKey === "santoor") {
48
+ if (apiKey && apiKey.toLowerCase() === "santoor") {
32
49
  this.logger.debug(`✅ API Key matched`);
33
50
  passedReason = 'API key valid';
34
51
  }
@@ -42,7 +59,7 @@ let AuthGuard = AuthGuard_1 = class AuthGuard {
42
59
  else if (!passedReason) {
43
60
  this.logger.debug(`❌ IP not allowed`);
44
61
  }
45
- if (!passedReason && origin && ALLOWED_ORIGINS.includes(origin)) {
62
+ if (!passedReason && origin && this.isOriginAllowed(origin)) {
46
63
  this.logger.debug(`✅ Origin allowed`);
47
64
  passedReason = 'Origin allowed';
48
65
  }
@@ -54,9 +71,130 @@ let AuthGuard = AuthGuard_1 = class AuthGuard {
54
71
  return true;
55
72
  }
56
73
  this.logger.warn(`❌ Access denied — no condition satisfied`);
57
- (0, utils_1.fetchWithTimeout)(`${(0, logbots_1.notifbot)()}&text=${encodeURIComponent(`${process.env.clientId ? process.env.clientId : process.env.serviceName} Failed :: Unauthorized access attempt from ${clientIp || 'unknown IP'} with origin ${origin || 'unknown origin'} for ${request.originalUrl}`)}`);
74
+ (0, utils_1.fetchWithTimeout)(`${(0, logbots_1.notifbot)()}&text=${encodeURIComponent(`${process.env.clientId || process.env.serviceName} Failed :: Unauthorized access attempt from ${clientIp || 'unknown IP'} with origin ${origin || 'unknown origin'} for ${request.originalUrl}`)}`);
58
75
  throw new common_1.UnauthorizedException('Access denied: No valid API key, IP, or Origin');
59
76
  }
77
+ isIgnoredPath(path) {
78
+ return IGNORE_PATHS.some(ignore => typeof ignore === 'string' ? ignore === path : ignore.test(path));
79
+ }
80
+ isOriginAllowed(origin) {
81
+ if (!origin)
82
+ return false;
83
+ const normalizedOrigin = origin.toLowerCase().trim();
84
+ return ALLOWED_ORIGINS.includes(normalizedOrigin);
85
+ }
86
+ getHeaderValue(request, headerName) {
87
+ return request.headers[headerName.toLowerCase()];
88
+ }
89
+ extractRealClientIP(request) {
90
+ const cfConnectingIP = this.getHeaderValue(request, 'cf-connecting-ip');
91
+ if (cfConnectingIP) {
92
+ this.logger.debug(`Using CF-Connecting-IP: ${cfConnectingIP}`);
93
+ return cfConnectingIP;
94
+ }
95
+ const xRealIP = this.getHeaderValue(request, 'x-real-ip');
96
+ if (xRealIP) {
97
+ this.logger.debug(`Using X-Real-IP: ${xRealIP}`);
98
+ return xRealIP;
99
+ }
100
+ const xForwardedFor = this.getHeaderValue(request, 'x-forwarded-for');
101
+ if (xForwardedFor) {
102
+ const firstIP = xForwardedFor.split(',')[0].trim();
103
+ this.logger.debug(`Using X-Forwarded-For (first): ${firstIP}`);
104
+ return firstIP;
105
+ }
106
+ const expressIP = request.ip;
107
+ if (expressIP) {
108
+ const cleanIP = expressIP.replace('::ffff:', '');
109
+ this.logger.debug(`Using Express IP: ${cleanIP}`);
110
+ return cleanIP;
111
+ }
112
+ const connectionIP = request.connection?.remoteAddress;
113
+ if (connectionIP) {
114
+ const cleanIP = connectionIP.replace('::ffff:', '');
115
+ this.logger.debug(`Using connection remoteAddress: ${cleanIP}`);
116
+ return cleanIP;
117
+ }
118
+ this.logger.warn(`Unable to extract client IP, using fallback`);
119
+ return 'unknown';
120
+ }
121
+ extractRealOrigin(request) {
122
+ const origin = this.getHeaderValue(request, 'origin');
123
+ if (origin) {
124
+ this.logger.debug(`Using Origin header: ${origin}`);
125
+ return origin;
126
+ }
127
+ const xOriginalHost = this.getHeaderValue(request, 'x-original-host');
128
+ if (xOriginalHost) {
129
+ const protocol = this.extractProtocol(request);
130
+ const constructedOrigin = `${protocol}://${xOriginalHost}`;
131
+ this.logger.debug(`Using X-Original-Host to construct origin: ${constructedOrigin}`);
132
+ return constructedOrigin;
133
+ }
134
+ const xForwardedHost = this.getHeaderValue(request, 'x-forwarded-host');
135
+ if (xForwardedHost) {
136
+ const protocol = this.extractProtocol(request);
137
+ const constructedOrigin = `${protocol}://${xForwardedHost}`;
138
+ this.logger.debug(`Using X-Forwarded-Host to construct origin: ${constructedOrigin}`);
139
+ return constructedOrigin;
140
+ }
141
+ const host = this.getHeaderValue(request, 'host');
142
+ if (host) {
143
+ const protocol = this.extractProtocol(request);
144
+ const constructedOrigin = `${protocol}://${host}`;
145
+ this.logger.debug(`Using Host header to construct origin: ${constructedOrigin}`);
146
+ return constructedOrigin;
147
+ }
148
+ const referer = this.getHeaderValue(request, 'referer');
149
+ if (referer) {
150
+ try {
151
+ const refererUrl = new URL(referer);
152
+ const refererOrigin = `${refererUrl.protocol}//${refererUrl.host}`;
153
+ this.logger.debug(`Using Referer to extract origin: ${refererOrigin}`);
154
+ return refererOrigin;
155
+ }
156
+ catch (error) {
157
+ this.logger.debug(`Failed to parse referer as URL: ${referer}`);
158
+ }
159
+ }
160
+ this.logger.debug(`Unable to extract origin from any header`);
161
+ return undefined;
162
+ }
163
+ extractProtocol(request) {
164
+ const xForwardedProto = this.getHeaderValue(request, 'x-forwarded-proto');
165
+ if (xForwardedProto) {
166
+ this.logger.debug(`Using X-Forwarded-Proto: ${xForwardedProto}`);
167
+ return xForwardedProto.toLowerCase();
168
+ }
169
+ const cfVisitor = this.getHeaderValue(request, 'cf-visitor');
170
+ if (cfVisitor) {
171
+ try {
172
+ const visitor = JSON.parse(cfVisitor);
173
+ if (visitor.scheme) {
174
+ this.logger.debug(`Using CF-Visitor scheme: ${visitor.scheme}`);
175
+ return visitor.scheme.toLowerCase();
176
+ }
177
+ }
178
+ catch (error) {
179
+ this.logger.debug(`Failed to parse CF-Visitor: ${cfVisitor}`);
180
+ }
181
+ }
182
+ if (request.secure) {
183
+ this.logger.debug(`Using request.secure: https`);
184
+ return 'https';
185
+ }
186
+ const xForwardedSsl = this.getHeaderValue(request, 'x-forwarded-ssl');
187
+ if (xForwardedSsl && xForwardedSsl.toLowerCase() === 'on') {
188
+ this.logger.debug(`Using X-Forwarded-SSL: https`);
189
+ return 'https';
190
+ }
191
+ if (process.env.NODE_ENV === 'production') {
192
+ this.logger.debug(`Production environment, defaulting to https`);
193
+ return 'https';
194
+ }
195
+ this.logger.debug(`Development environment, defaulting to http`);
196
+ return 'http';
197
+ }
60
198
  };
61
199
  exports.AuthGuard = AuthGuard;
62
200
  exports.AuthGuard = AuthGuard = AuthGuard_1 = __decorate([
@@ -1 +1 @@
1
- {"version":3,"file":"auth.guard.js","sourceRoot":"","sources":["../../src/guards/auth.guard.ts"],"names":[],"mappings":";;;;;;;;;;AAAA,2CAA0G;AAE1G,oCAA4C;AAC5C,8CAA4C;AAE5C,MAAM,WAAW,GAAG,CAAC,YAAY,EAAE,eAAe,EAAE,eAAe,EAAE,eAAe,EAAE,gBAAgB,CAAC,CAAC;AACxG,MAAM,eAAe,GAAG,CAAC,uBAAuB,EAAE,6BAA6B,CAAC,CAAC;AAG1E,IAAM,SAAS,iBAAf,MAAM,SAAS;IAAf;QACc,WAAM,GAAG,IAAI,eAAM,CAAC,WAAS,CAAC,IAAI,CAAC,CAAC;IAmDzD,CAAC;IAjDG,WAAW,CAAC,OAAyB;QACjC,MAAM,OAAO,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,UAAU,EAAW,CAAC;QAE7D,MAAM,MAAM,GACR,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,QAAQ,EAAE;YACxC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,QAAQ,EAAE,CAAC;QACxC,MAAM,QAAQ,GAAG,CAAC,OAAO,CAAC,EAAE,IAAI,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;QAC1F,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC;QAEtC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC;QACvC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,cAAc,MAAM,IAAI,MAAM,EAAE,CAAC,CAAC;QACpD,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,gBAAgB,QAAQ,EAAE,CAAC,CAAC;QAC9C,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,MAAM,IAAI,MAAM,EAAE,CAAC,CAAC;QAEnD,IAAI,YAAY,GAAkB,IAAI,CAAC;QAGvC,IAAI,MAAM,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACjC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC;YACvC,YAAY,GAAG,eAAe,CAAC;QACnC,CAAC;aAAM,CAAC;YACJ,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;QAC5C,CAAC;QAGD,IAAI,CAAC,YAAY,IAAI,WAAW,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YAClD,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;YAClC,YAAY,GAAG,YAAY,CAAC;QAChC,CAAC;aAAM,IAAI,CAAC,YAAY,EAAE,CAAC;YACvB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;QAC1C,CAAC;QAGD,IAAI,CAAC,YAAY,IAAI,MAAM,IAAI,eAAe,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YAC9D,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;YACtC,YAAY,GAAG,gBAAgB,CAAC;QACpC,CAAC;aAAM,IAAI,CAAC,YAAY,EAAE,CAAC;YACvB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;QAC9C,CAAC;QAED,IAAI,YAAY,EAAE,CAAC;YACf,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,2BAA2B,YAAY,EAAE,CAAC,CAAC;YAC7D,OAAO,IAAI,CAAC;QAChB,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAC;QAC7D,IAAA,wBAAgB,EAAC,GAAG,IAAA,kBAAQ,GAAE,SAAS,kBAAkB,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,+CAA+C,QAAQ,IAAI,YAAY,gBAAgB,MAAM,IAAI,gBAAgB,QAAQ,OAAO,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC,CAAC;QACrR,MAAM,IAAI,8BAAqB,CAAC,gDAAgD,CAAC,CAAC;IACtF,CAAC;CACJ,CAAA;AApDY,8BAAS;oBAAT,SAAS;IADrB,IAAA,mBAAU,GAAE;GACA,SAAS,CAoDrB"}
1
+ {"version":3,"file":"auth.guard.js","sourceRoot":"","sources":["../../src/guards/auth.guard.ts"],"names":[],"mappings":"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"}