@netacea/netaceaintegrationbase 1.17.17 → 2.0.1

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.
package/CHANGELOG.md CHANGED
@@ -3,6 +3,22 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ ## 2.0.1 (2024-03-18)
7
+
8
+ **Note:** Version bump only for package @netacea/netaceaintegrationbase
9
+
10
+
11
+
12
+
13
+
14
+ ## 1.17.18 (2024-03-14)
15
+
16
+ **Note:** Version bump only for package @netacea/netaceaintegrationbase
17
+
18
+
19
+
20
+
21
+
6
22
  ## 1.17.17 (2024-03-12)
7
23
 
8
24
  **Note:** Version bump only for package @netacea/netaceaintegrationbase
package/README.md CHANGED
@@ -14,152 +14,3 @@
14
14
  ```sh
15
15
  npm i @netacea/netaceaintegrationbase --save
16
16
  ```
17
-
18
- ### Yarn
19
-
20
- ```sh
21
- yarn add @netacea/netaceaintegrationbase
22
- ```
23
-
24
- ## Usage
25
-
26
- ```typescript
27
- import Netacea, { MakeRequestArgs, MakeRequestResponse, MitigateResponse, InjectResponse, matchMitataCookie, ComposeResultResponse } from '@netacea/netaceaintegrationbase'
28
-
29
- interface ExampleRequest {
30
- headers: {[key: string]: string}
31
- url: string
32
- method: 'GET' | 'POST' | 'OPTIONS'
33
- ip: string
34
- protocol: 'HTTP/1.1'
35
- body?: string
36
- }
37
- interface ExampleResponse {
38
- headers: {[key: string]: string[]}
39
- status: number
40
- body?: string
41
- }
42
-
43
- export default class NewJavascriptIntegration extends Netacea<ExampleRequest, ExampleResponse> {
44
- private async getMitigationResponse (request: ExampleRequest): Promise<ComposeResultResponse> {
45
- const cookies = request.headers['cookie']
46
- const mitataCookie = this.readCookie('_mitata', cookies) ?? ''
47
- const mitataCaptcha = this.readCookie('_mitatacaptcha', cookies)
48
- const clientIp = request.ip
49
- const userAgent = request.headers['user-agent']
50
- return await this.processMitigateRequest({
51
- clientIp,
52
- getBodyFn: async () => await Promise.resolve(request.body),
53
- method: request.method,
54
- mitata: mitataCookie,
55
- mitataCaptcha,
56
- url: request.url,
57
- userAgent
58
- })
59
- }
60
-
61
- protected async mitigate (request: ExampleRequest): Promise<MitigateResponse<ExampleResponse>> {
62
- const result = await this.getMitigationResponse(request)
63
- if (result.mitigated) {
64
- const responseHeaders = new Headers()
65
- const headers: {
66
- [key: string]: string[]
67
- } = {
68
- 'set-cookie': []
69
- }
70
- for (const cookie of result.setCookie) {
71
- headers['set-cookie'].push(cookie)
72
- }
73
- let body = 'Forbidden'
74
- if (result.mitigation === 'captcha') {
75
- headers['content-type'] = ['text/html; charset=UTF-8']
76
- body = result.body as string
77
- }
78
-
79
- return {
80
- response: {
81
- body,
82
- status: 403,
83
- headers: headers
84
- },
85
- setCookie: result.setCookie,
86
- sessionStatus: result.sessionStatus
87
- }
88
- }
89
- return {
90
- setCookie: result.setCookie,
91
- sessionStatus: result.sessionStatus
92
- }
93
- }
94
-
95
- public async inject (request: ExampleRequest): Promise<InjectResponse> {
96
- const result = await this.getMitigationResponse(request)
97
- return {
98
- injectHeaders: result.injectHeaders,
99
- sessionStatus: result.sessionStatus,
100
- setCookie: result.setCookie
101
- }
102
- }
103
-
104
- async ingest (request: ExampleRequest, response: ExampleResponse): Promise<any> {
105
- const setCookie = response.headers['set-cookie'].join(';')
106
- const cookieString = setCookie !== '' ? setCookie : request.headers['cookie']
107
- const mitata = this.readCookie('_mitata', cookieString) ?? ''
108
- const {
109
- match, mitigate, captcha
110
- } = matchMitataCookie(mitata) ?? {
111
- match: 0,
112
- mitigate: 0,
113
- captcha: 0
114
- }
115
- const { sessionStatus } = this.findBestMitigation(
116
- match,
117
- mitigate,
118
- captcha,
119
- this.isUrlCaptchaPost(request.url, request.method)
120
- )
121
- await this.callIngest({
122
- bytesSent: parseInt(response.headers['content-length'][0]),
123
- ip: request.ip,
124
- method: request.method,
125
- path: new URL(request.url).pathname,
126
- protocol: request.protocol,
127
- referer: request.headers['referer'],
128
- requestTime: '0',
129
- sessionStatus,
130
- status: response.status.toString(),
131
- userAgent: request.headers['user-agent'],
132
- mitataCookie: mitata,
133
- integrationType: 'integration-type-name',
134
- integrationVersion: 'integration-version-number'
135
- })
136
- }
137
-
138
- getCookieHeader (args: ExampleRequest): string | null | undefined {
139
- return args.headers['cookie']
140
- }
141
-
142
- protected async makeRequest (args: MakeRequestArgs): Promise<MakeRequestResponse> {
143
- // implement your XHR request here.
144
- const response: ExampleResponse = await YourXhrFunction(args)
145
- return {
146
- headers: response.headers,
147
- status: response.status,
148
- body: response.body
149
- }
150
- }
151
- }
152
-
153
- ```
154
-
155
- Changing the `ExampleRequest` and `ExampleResponse` types for your types.
156
-
157
- After this, you can then use:
158
-
159
- ```javascript
160
- const netacea = new NewJavascriptIntegration({
161
- ...
162
- })
163
- ```
164
-
165
- in your worker script, calling `mitigate` in a syncronous fashion and tailor the response on this and `ingest` in an asynchronous fashion.
@@ -339,3 +339,32 @@ export interface CheckCookieResponse {
339
339
  mitigate: number;
340
340
  captcha: number;
341
341
  }
342
+ export interface FindBestMitigationResponse {
343
+ sessionStatus: string;
344
+ mitigation: string;
345
+ parts: NetaceaParts;
346
+ }
347
+ export interface NetaceaParts {
348
+ match: number;
349
+ mitigate: number;
350
+ captcha: number;
351
+ }
352
+ export interface APICallResponse {
353
+ status: number;
354
+ body?: any;
355
+ }
356
+ export interface MakeMitigateAPICallResponse extends NetaceaParts, APICallResponse {
357
+ setCookie: string[];
358
+ eventId?: string;
359
+ mitataMaxAge: number;
360
+ }
361
+ export type MakeCaptchaApiCallResponse = MakeMitigateAPICallResponse;
362
+ export interface ProcessMitigateRequestArgs {
363
+ url: string;
364
+ method: string;
365
+ mitata: string | undefined;
366
+ mitataCaptcha: string | undefined;
367
+ clientIp: string;
368
+ userAgent: string;
369
+ getBodyFn: () => Promise<any>;
370
+ }
package/dist/index.d.ts CHANGED
@@ -1,9 +1,7 @@
1
- import NetaceaBase from './NetaceaBase';
2
- export * from './NetaceaBase';
1
+ export * from './utils';
3
2
  export * from './NetaceaBase.enums';
4
3
  export * from './NetaceaBase.types';
5
4
  export { MitataCookie, CheckCookieResponse, matchMitataCookie, checkMitataCookie, createMitataCookie, generateId, hexSha256, ingestIgnoredIpValue, warmupCookie } from './mitataCookie';
6
5
  export { matchNetaceaCookieV3, cookieIsNetaceaV3Format, createNetaceaCookieV3, checkNetaceaCookieV3, defaultInvalidResponse, objectIsNetaceaCookieV3 } from './netaceaCookieV3';
7
6
  export * as dictionary from './dictionary';
8
7
  export { lib } from './lib/index';
9
- export default NetaceaBase;
package/dist/index.js CHANGED
@@ -1,5 +1,4 @@
1
- import NetaceaBase from './NetaceaBase';
2
- export * from './NetaceaBase';
1
+ export * from './utils';
3
2
  export * from './NetaceaBase.enums';
4
3
  export * from './NetaceaBase.types';
5
4
  export { matchMitataCookie, checkMitataCookie, createMitataCookie, generateId, hexSha256, ingestIgnoredIpValue, warmupCookie } from './mitataCookie';
@@ -7,5 +6,4 @@ export { matchNetaceaCookieV3, cookieIsNetaceaV3Format, createNetaceaCookieV3, c
7
6
  import * as dictionary_1 from './dictionary';
8
7
  export { dictionary_1 as dictionary };
9
8
  export { lib } from './lib/index';
10
- export default NetaceaBase;
11
9
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,WAAW,MAAM,eAAe,CAAA;AACvC,cAAc,eAAe,CAAA;AAC7B,cAAc,qBAAqB,CAAA;AACnC,cAAc,qBAAqB,CAAA;AACnC,OAAO,EAGL,iBAAiB,EACjB,iBAAiB,EACjB,kBAAkB,EAClB,UAAU,EACV,SAAS,EACT,oBAAoB,EACpB,YAAY,EACb,MAAM,gBAAgB,CAAA;AAEvB,OAAO,EACL,oBAAoB,EACpB,uBAAuB,EACvB,qBAAqB,EACrB,oBAAoB,EACpB,sBAAsB,EACtB,uBAAuB,EACxB,MAAM,mBAAmB,CAAA;8BAEE,cAAc;yBAA9B,UAAU;AAEtB,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAA;AAEjC,eAAe,WAAW,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAA;AACvB,cAAc,qBAAqB,CAAA;AACnC,cAAc,qBAAqB,CAAA;AACnC,OAAO,EAGL,iBAAiB,EACjB,iBAAiB,EACjB,kBAAkB,EAClB,UAAU,EACV,SAAS,EACT,oBAAoB,EACpB,YAAY,EACb,MAAM,gBAAgB,CAAA;AAEvB,OAAO,EACL,oBAAoB,EACpB,uBAAuB,EACvB,qBAAqB,EACrB,oBAAoB,EACpB,sBAAsB,EACtB,uBAAuB,EACxB,MAAM,mBAAmB,CAAA;8BAEE,cAAc;yBAA9B,UAAU;AAEtB,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAA"}
@@ -0,0 +1,4 @@
1
+ import { NetaceaMitigationType } from './NetaceaBase.enums';
2
+ export declare function correctTimeout(timeout: number): number;
3
+ export declare function safeParseInt(value: string | number, defaultValue?: number): number;
4
+ export declare function configureMitataExpiry(mitigationType: NetaceaMitigationType, expirySeconds: number | undefined): number;
package/dist/utils.js ADDED
@@ -0,0 +1,19 @@
1
+ import { NetaceaMitigationType } from './NetaceaBase.enums';
2
+ const ONE_HOUR_IN_SECONDS = 60 * 60;
3
+ export function correctTimeout(timeout) {
4
+ return timeout <= 0 ? defaultTimeout : timeout;
5
+ }
6
+ export function safeParseInt(value, defaultValue = 0) {
7
+ if (isNaN(value)) {
8
+ return defaultValue;
9
+ }
10
+ return parseInt(value);
11
+ }
12
+ const defaultTimeout = 3000;
13
+ export function configureMitataExpiry(mitigationType, expirySeconds) {
14
+ if (expirySeconds === undefined) {
15
+ return mitigationType === NetaceaMitigationType.INGEST ? ONE_HOUR_IN_SECONDS : 60;
16
+ }
17
+ return expirySeconds;
18
+ }
19
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,EACtB,MAAM,qBAAqB,CAAA;AAE5B,MAAM,mBAAmB,GAAG,EAAE,GAAG,EAAE,CAAA;AAEnC,MAAM,UAAU,cAAc,CAAE,OAAe;IAC7C,OAAO,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,OAAO,CAAA;AAChD,CAAC;AAED,MAAM,UAAU,YAAY,CAAE,KAAsB,EAAE,eAAuB,CAAC;IAC5E,IAAI,KAAK,CAAC,KAAe,CAAC,EAAE,CAAC;QAC3B,OAAO,YAAY,CAAA;IACrB,CAAC;IACD,OAAO,QAAQ,CAAC,KAAe,CAAC,CAAA;AAClC,CAAC;AAED,MAAM,cAAc,GAAG,IAAI,CAAA;AAE3B,MAAM,UAAU,qBAAqB,CACnC,cAAqC,EACrC,aAAiC;IAEjC,IAAI,aAAa,KAAK,SAAS,EAAE,CAAC;QAChC,OAAO,cAAc,KAAK,qBAAqB,CAAC,MAAM,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,EAAE,CAAA;IACnF,CAAC;IACD,OAAO,aAAa,CAAA;AACtB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@netacea/netaceaintegrationbase",
3
- "version": "1.17.17",
3
+ "version": "2.0.1",
4
4
  "description": "Base package for Netacea CDN integrations.",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -28,7 +28,7 @@
28
28
  "typescript": "^5.4.2"
29
29
  },
30
30
  "dependencies": {
31
- "@netacea/kinesisingest": "^1.5.17"
31
+ "@netacea/kinesisingest": "^1.5.19"
32
32
  },
33
- "gitHead": "6a9a2522c4680077ebeeb44310f7ccfef274d0d3"
33
+ "gitHead": "d95af0b66a6f0d94c34036400fbbbc11d856bb86"
34
34
  }
@@ -1,93 +0,0 @@
1
- import type { ComposeResultResponse, IngestArgs, InjectResponse, MakeRequestArgs, MakeRequestResponse, MitigateResponse, NetaceaBaseArgs, NetaceaMitigationResponse, WebLog, V2WebLog, NetaceaResponseBase, NetaceaWorker } from './NetaceaBase.types';
2
- import { NetaceaIngestType, NetaceaLogVersion, NetaceaMitigationType } from './NetaceaBase.enums';
3
- import NetaceaKinesis from '@netacea/kinesisingest';
4
- export interface FindBestMitigationResponse {
5
- sessionStatus: string;
6
- mitigation: string;
7
- parts: NetaceaParts;
8
- }
9
- interface NetaceaParts {
10
- match: number;
11
- mitigate: number;
12
- captcha: number;
13
- }
14
- export interface APICallResponse {
15
- status: number;
16
- body?: any;
17
- }
18
- export interface MakeMitigateAPICallResponse extends NetaceaParts, APICallResponse {
19
- setCookie: string[];
20
- eventId?: string;
21
- mitataMaxAge: number;
22
- }
23
- export type MakeCaptchaApiCallResponse = MakeMitigateAPICallResponse;
24
- export interface ProcessMitigateRequestArgs {
25
- url: string;
26
- method: string;
27
- mitata: string | undefined;
28
- mitataCaptcha: string | undefined;
29
- clientIp: string;
30
- userAgent: string;
31
- getBodyFn: () => Promise<any>;
32
- }
33
- export declare function correctTimeout(timeout: number): number;
34
- export declare function safeParseInt(value: string | number, defaultValue?: number): number;
35
- export declare function configureMitataExpiry(mitigationType: NetaceaMitigationType, expirySeconds: number | undefined): number;
36
- export default abstract class NetaceaBase<RequestArgs = unknown, Response = unknown> implements NetaceaWorker<RequestArgs, Response> {
37
- protected mitataCookieExpirySeconds: number;
38
- protected apiKey: string;
39
- protected secretKey?: string;
40
- protected mitigationServiceUrl: string;
41
- protected ingestServiceUrl: string;
42
- protected readonly timeout: number;
43
- protected readonly captchaSiteKey?: string;
44
- protected readonly captchaSecretKey?: string;
45
- protected readonly ingestType: NetaceaIngestType;
46
- protected readonly logVersion: NetaceaLogVersion;
47
- protected readonly kinesis?: NetaceaKinesis;
48
- protected readonly mitigationType: NetaceaMitigationType;
49
- protected readonly encryptedCookies: string[];
50
- protected readonly netaceaCookieName: string;
51
- protected readonly netaceaCaptchaCookieName: string;
52
- protected abstract makeRequest(args: MakeRequestArgs): Promise<MakeRequestResponse>;
53
- protected abstract mitigate(args: RequestArgs): Promise<MitigateResponse<Response>>;
54
- protected abstract inject(args: RequestArgs): Promise<InjectResponse>;
55
- abstract ingest(...args: any[]): Promise<any>;
56
- abstract getCookieHeader(args: RequestArgs): string | null | undefined;
57
- constructor({ apiKey, secretKey, timeout, mitigationServiceUrl, ingestServiceUrl, mitigationType, captchaSiteKey, captchaSecretKey, ingestType, kinesis, logVersion, mitataCookieExpirySeconds, netaceaCookieExpirySeconds, netaceaCookieName, netaceaCaptchaCookieName }: NetaceaBaseArgs);
58
- runMitigation(args: RequestArgs): Promise<NetaceaMitigationResponse<Response>>;
59
- /**
60
- * Returns the value of the cookie with the given name from a string or list of cookies.
61
- * If the cookie name is included in the encryptedCookies class property,
62
- * then the cookie value will be decrypted automatically.
63
- * The method may operate of either the HTTP Cookie or Set-Cookie headers.
64
- * @param cookieName the name of the cookie to find.
65
- * @param cookies the full list of cookies, either as a string or an array of strings.
66
- * @returns the value of the cookie, if found.
67
- */
68
- protected readCookie(cookieName: string, cookies: string | string[] | null | undefined): Promise<string | undefined>;
69
- protected callIngest(args: IngestArgs): Promise<void>;
70
- private makeIngestApiCall;
71
- private constructV2WebLog;
72
- private constructV1WebLog;
73
- protected constructWebLog(args: IngestArgs): WebLog | V2WebLog;
74
- protected check(netaceaCookie: string | undefined, clientIP: string, userAgent: string, captchaCookie?: string): Promise<ComposeResultResponse>;
75
- protected createMitata(clientIP: string, userId: string | undefined, match: number, mitigate: number, captcha: number, maxAge?: number, expiry?: number | undefined): Promise<string>;
76
- private processCaptcha;
77
- private getMitataCaptchaFromHeaders;
78
- private makeCaptchaAPICall;
79
- private getApiCallResponseFromResponse;
80
- private buildCookieFromValues;
81
- private buildCookieHeader;
82
- private makeMitigateAPICall;
83
- private composeResult;
84
- protected findBestMitigation(match: number, mitigate: number, captcha: number, isCaptchaPost: boolean): FindBestMitigationResponse;
85
- protected APIError(response: APICallResponse): Error;
86
- protected isUrlCaptchaPost(url: string, method: string): boolean;
87
- protected processMitigateRequest(args: ProcessMitigateRequestArgs): Promise<ComposeResultResponse>;
88
- protected setIngestOnlyMitataCookie(userId: string | undefined): Promise<NetaceaResponseBase>;
89
- protected processIngest(args: RequestArgs): Promise<NetaceaResponseBase>;
90
- protected encryptCookieValue(cookieValue: string): Promise<string>;
91
- protected decryptCookieValue(encryptedCookieValue: string): Promise<string>;
92
- }
93
- export {};
@@ -1,500 +0,0 @@
1
- import { NetaceaIngestType, NetaceaLogVersion, NetaceaMitigationType } from './NetaceaBase.enums';
2
- import { netaceaHeaders, matchMap, mitigateMap, captchaMap, bestMitigationCaptchaMap, bestMitigationMap, mitigationTypes } from './dictionary';
3
- import { matchMitataCookie, createMitataCookie, checkMitataCookie, ingestIgnoredIpValue } from './mitataCookie';
4
- import NetaceaKinesis from '@netacea/kinesisingest';
5
- const ONE_HOUR_IN_SECONDS = 60 * 60;
6
- const ONE_DAY_IN_SECONDS = ONE_HOUR_IN_SECONDS * 24;
7
- export function correctTimeout(timeout) {
8
- return timeout <= 0 ? defaultTimeout : timeout;
9
- }
10
- export function safeParseInt(value, defaultValue = 0) {
11
- if (isNaN(value)) {
12
- return defaultValue;
13
- }
14
- return parseInt(value);
15
- }
16
- const defaultTimeout = 3000;
17
- export function configureMitataExpiry(mitigationType, expirySeconds) {
18
- if (expirySeconds === undefined) {
19
- return mitigationType === NetaceaMitigationType.INGEST ? ONE_HOUR_IN_SECONDS : 60;
20
- }
21
- return expirySeconds;
22
- }
23
- export default class NetaceaBase {
24
- // eslint-disable-next-line max-lines-per-function, complexity
25
- constructor({ apiKey, secretKey, timeout = defaultTimeout, mitigationServiceUrl = 'https://mitigations.netacea.net', ingestServiceUrl = 'https://ingest.netacea.net', mitigationType = NetaceaMitigationType.INGEST, captchaSiteKey, captchaSecretKey, ingestType = NetaceaIngestType.HTTP, kinesis, logVersion, mitataCookieExpirySeconds, netaceaCookieExpirySeconds, netaceaCookieName, netaceaCaptchaCookieName }) {
26
- this.encryptedCookies = [];
27
- if (apiKey === null || apiKey === undefined) {
28
- throw new Error('apiKey is a required parameter');
29
- }
30
- this.apiKey = apiKey;
31
- this.secretKey = secretKey;
32
- this.mitigationServiceUrl = mitigationServiceUrl;
33
- this.ingestServiceUrl = ingestServiceUrl;
34
- this.mitigationType = mitigationType;
35
- this.ingestType = ingestType ?? NetaceaIngestType.HTTP;
36
- this.logVersion = logVersion ?? NetaceaLogVersion.V1;
37
- if (this.ingestType === NetaceaIngestType.KINESIS) {
38
- if (kinesis === undefined) {
39
- // eslint-disable-next-line no-console
40
- console.warn(`NETACEA WARN: no kinesis args provided, when ingestType is ${this.ingestType}`);
41
- }
42
- else {
43
- this.kinesis = new NetaceaKinesis({
44
- ...kinesis,
45
- apiKey: this.apiKey
46
- });
47
- }
48
- }
49
- if (captchaSiteKey !== undefined || captchaSecretKey !== undefined) {
50
- this.captchaSiteKey = captchaSiteKey;
51
- this.captchaSecretKey = captchaSecretKey;
52
- }
53
- this.timeout = correctTimeout(timeout);
54
- this.netaceaCookieName = netaceaCookieName ?? '_mitata';
55
- this.netaceaCaptchaCookieName = netaceaCaptchaCookieName ?? '_mitatacaptcha';
56
- this.encryptedCookies = [
57
- this.netaceaCookieName,
58
- this.netaceaCaptchaCookieName
59
- ];
60
- this.mitataCookieExpirySeconds = configureMitataExpiry(mitigationType, netaceaCookieExpirySeconds ?? mitataCookieExpirySeconds);
61
- }
62
- async runMitigation(args) {
63
- try {
64
- switch (this.mitigationType) {
65
- case NetaceaMitigationType.MITIGATE:
66
- return await this.mitigate(args);
67
- case NetaceaMitigationType.INJECT:
68
- return await this.inject(args);
69
- case NetaceaMitigationType.INGEST:
70
- return await this.processIngest(args);
71
- default:
72
- // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
73
- throw new Error(`Netacea Error: Mitigation type ${this.mitigationType} not recognised`);
74
- }
75
- }
76
- catch (e) {
77
- // eslint-disable-next-line no-console
78
- console.error('Netacea FAILOPEN Error:', e);
79
- return {
80
- injectHeaders: {
81
- 'x-netacea-captcha': '0',
82
- 'x-netacea-match': '0',
83
- 'x-netacea-mitigate': '0'
84
- },
85
- sessionStatus: ''
86
- };
87
- }
88
- }
89
- /**
90
- * Returns the value of the cookie with the given name from a string or list of cookies.
91
- * If the cookie name is included in the encryptedCookies class property,
92
- * then the cookie value will be decrypted automatically.
93
- * The method may operate of either the HTTP Cookie or Set-Cookie headers.
94
- * @param cookieName the name of the cookie to find.
95
- * @param cookies the full list of cookies, either as a string or an array of strings.
96
- * @returns the value of the cookie, if found.
97
- */
98
- async readCookie(cookieName, cookies) {
99
- if (cookies === null || cookies === undefined) {
100
- return undefined;
101
- }
102
- if (typeof cookies === 'string') {
103
- return await this.readCookie(cookieName, cookies.split(';'));
104
- }
105
- const valuePrefix = `${cookieName}=`;
106
- for (const cookie of cookies) {
107
- // split again on ; to handle Set-Cookie header format.
108
- const trimmedCookie = cookie.split(';')[0].trimStart();
109
- if (trimmedCookie.startsWith(valuePrefix)) {
110
- const cookieValue = trimmedCookie.slice(valuePrefix.length);
111
- if (this.encryptedCookies.includes(cookieName)) {
112
- try {
113
- return await this.decryptCookieValue(cookieValue);
114
- }
115
- catch (_e) {
116
- return undefined;
117
- }
118
- }
119
- return cookieValue;
120
- }
121
- }
122
- return undefined;
123
- }
124
- async callIngest(args) {
125
- const body = this.constructWebLog(args);
126
- if (this.ingestType === NetaceaIngestType.KINESIS) {
127
- if (this.kinesis === undefined) {
128
- // eslint-disable-next-line no-console
129
- console.error('Netacea Error: Unable to log as Kinesis has not been defined.');
130
- return;
131
- }
132
- try {
133
- await this.kinesis.ingest({
134
- ...body,
135
- apiKey: this.apiKey
136
- }, this.makeRequest.bind(this));
137
- }
138
- catch (e) {
139
- // eslint-disable-next-line no-console
140
- console.error('NETACEA Error: ', e.message);
141
- }
142
- }
143
- else {
144
- const headers = {
145
- 'X-Netacea-API-Key': this.apiKey,
146
- 'content-type': 'application/json'
147
- };
148
- const res = await this.makeIngestApiCall(headers, body);
149
- if (res.status !== 200) {
150
- throw this.APIError(res);
151
- }
152
- }
153
- }
154
- async makeIngestApiCall(headers, body) {
155
- return await this.makeRequest({
156
- host: this.ingestServiceUrl,
157
- method: 'POST',
158
- path: '/',
159
- headers,
160
- body: JSON.stringify(body),
161
- timeout: this.timeout
162
- });
163
- }
164
- constructV2WebLog({ ip, userAgent, status, method, path, protocol, referer, bytesSent, requestTime, mitataCookie, sessionStatus, integrationType, integrationVersion }) {
165
- const now = new Date();
166
- // Paths must be prefixed with '/'
167
- if (path[0] !== '/') {
168
- path = `/${path}`;
169
- }
170
- let actualQuery;
171
- const splitPath = path.split('?');
172
- if (splitPath.length > 1) {
173
- actualQuery = `?${splitPath[1]}`;
174
- }
175
- const actualPath = splitPath[0];
176
- const userId = matchMitataCookie(mitataCookie)?.userId;
177
- const log = {
178
- status,
179
- method,
180
- 'bytes_sent': safeParseInt(bytesSent),
181
- 'referrer': referer === '' ? undefined : referer,
182
- 'request': `${method} ${actualPath}${actualQuery ?? ''} ${protocol}`,
183
- 'request_time': safeParseInt(requestTime),
184
- 'integration_type': integrationType,
185
- 'integration_version': integrationVersion,
186
- 'client': ip,
187
- 'user_agent': userAgent,
188
- 'bc_type': sessionStatus === '' ? undefined : sessionStatus,
189
- 'hour': now.getUTCHours(),
190
- 'minute': now.getUTCMinutes(),
191
- // '2021-08-04T14:22:41.155Z' = toISOString()
192
- '@timestamp': now.toISOString().replace('Z', '+00:00'),
193
- 'path': actualPath,
194
- protocol,
195
- 'query': actualQuery,
196
- 'user_id': userId
197
- };
198
- return log;
199
- }
200
- constructV1WebLog({ ip, userAgent, status, method, path, protocol, referer, bytesSent, requestTime, mitataCookie, sessionStatus, integrationType, integrationVersion }) {
201
- const timestamp = new Date().toUTCString();
202
- return {
203
- Request: `${method} ${path} ${protocol}`,
204
- TimeLocal: timestamp,
205
- RealIp: ip,
206
- UserAgent: userAgent,
207
- Status: status,
208
- RequestTime: requestTime?.toString(),
209
- BytesSent: bytesSent?.toString(),
210
- Referer: referer === '' ? '-' : referer,
211
- NetaceaUserIdCookie: mitataCookie ?? '',
212
- NetaceaMitigationApplied: sessionStatus ?? '',
213
- IntegrationType: integrationType ?? '',
214
- IntegrationVersion: integrationVersion ?? ''
215
- };
216
- }
217
- constructWebLog(args) {
218
- args.bytesSent = args.bytesSent === '' ? '0' : args.bytesSent;
219
- if (this.logVersion === NetaceaLogVersion.V2) {
220
- return this.constructV2WebLog(args);
221
- }
222
- return this.constructV1WebLog(args);
223
- }
224
- async check(netaceaCookie, clientIP, userAgent, captchaCookie) {
225
- let status, match, mitigate, captcha, body, setCookie, eventId;
226
- if (this.secretKey === undefined) {
227
- throw new Error('Secret key is required to mitigate');
228
- }
229
- const cookieInfo = checkMitataCookie(netaceaCookie, clientIP, this.secretKey);
230
- if (!cookieInfo.isPrimaryHashValid || cookieInfo.requiresReissue) {
231
- // Get latest mitigation information
232
- const result = await this.makeMitigateAPICall(cookieInfo.mitata?.userId, clientIP, userAgent, captchaCookie);
233
- status = result.status;
234
- match = result.match;
235
- mitigate = result.mitigate;
236
- captcha = result.captcha;
237
- body = result.body;
238
- setCookie = [
239
- await this.createMitata(clientIP, cookieInfo.mitata?.userId, match, mitigate, captcha, result.mitataMaxAge)
240
- ];
241
- eventId = result.eventId;
242
- }
243
- else {
244
- status = -1;
245
- match = cookieInfo.match;
246
- mitigate = cookieInfo.mitigate;
247
- captcha = cookieInfo.captcha;
248
- body = undefined;
249
- setCookie = [];
250
- }
251
- return this.composeResult(body, setCookie, status, match, mitigate, captcha, false, eventId);
252
- }
253
- async createMitata(clientIP, userId, match, mitigate, captcha, maxAge = 86400, expiry = undefined) {
254
- // serve, fail, cookiefail
255
- const isCaptchaServe = [1, 3, 5].includes(captcha);
256
- const expiryDelta = isCaptchaServe ? -this.mitataCookieExpirySeconds : this.mitataCookieExpirySeconds;
257
- const mitataExpiry = expiry ?? Math.floor(Date.now() / 1000) + expiryDelta;
258
- if (this.secretKey === undefined) {
259
- throw new Error('Cannot build cookie without secret key.');
260
- }
261
- const mitataCode = [match, mitigate, captcha].join('');
262
- const mitataValue = createMitataCookie(clientIP, userId, mitataExpiry, this.secretKey, mitataCode);
263
- return await this.buildCookieFromValues(this.netaceaCookieName, mitataValue, maxAge, '/');
264
- }
265
- async processCaptcha(netaceaCookie, clientIP, userAgent, captchaData) {
266
- const { status, match, mitigate, captcha, body, setCookie } = await this.makeCaptchaAPICall(netaceaCookie, clientIP, userAgent, captchaData);
267
- return this.composeResult(body, setCookie, status, match, mitigate, captcha, true);
268
- }
269
- async getMitataCaptchaFromHeaders(headers) {
270
- if (Object.prototype.hasOwnProperty.call(headers, netaceaHeaders.mitataCaptcha)) {
271
- const mitataCaptcha = headers[netaceaHeaders.mitataCaptcha];
272
- const mitataCaptchaExpiry = parseInt(headers[netaceaHeaders.mitataCaptchaExpiry]);
273
- const mitataCaptchaCookie = await this.buildCookieFromValues(this.netaceaCaptchaCookieName, mitataCaptcha, mitataCaptchaExpiry);
274
- if (mitataCaptchaCookie !== undefined) {
275
- return mitataCaptchaCookie;
276
- }
277
- }
278
- return undefined;
279
- }
280
- async makeCaptchaAPICall(netaceaCookie, clientIP, userAgent, captchaData) {
281
- const headers = {
282
- 'X-Netacea-API-Key': this.apiKey,
283
- 'X-Netacea-Client-IP': clientIP,
284
- 'user-agent': userAgent,
285
- 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'
286
- };
287
- const mitata = matchMitataCookie(netaceaCookie);
288
- if (mitata !== undefined) {
289
- headers['X-Netacea-UserId'] = mitata.userId;
290
- }
291
- if (this.captchaSiteKey !== undefined && this.captchaSecretKey !== undefined) {
292
- headers['X-Netacea-Captcha-Site-Key'] = this.captchaSiteKey;
293
- headers['X-Netacea-Captcha-Secret-Key'] = this.captchaSecretKey;
294
- }
295
- const res = await this.makeRequest({
296
- host: this.mitigationServiceUrl,
297
- path: '/AtaVerifyCaptcha',
298
- headers,
299
- method: 'POST',
300
- body: captchaData,
301
- timeout: this.timeout
302
- });
303
- return await this.getApiCallResponseFromResponse(res, mitata?.userId, clientIP);
304
- }
305
- async getApiCallResponseFromResponse(response, userId, clientIP) {
306
- if (response.status !== 200) {
307
- throw this.APIError(response);
308
- }
309
- const match = parseInt(response.headers[netaceaHeaders.match]);
310
- const mitigate = parseInt(response.headers[netaceaHeaders.mitigate]);
311
- const captcha = parseInt(response.headers[netaceaHeaders.captcha]);
312
- let mitataMaxAge = parseInt(response.headers[netaceaHeaders.mitataExpiry]);
313
- if (isNaN(mitataMaxAge)) {
314
- mitataMaxAge = 86400;
315
- }
316
- const mitata = await this.createMitata(clientIP, userId, match, mitigate, captcha);
317
- const mitataCaptcha = await this.getMitataCaptchaFromHeaders(response.headers);
318
- const setCookie = [
319
- mitata,
320
- mitataCaptcha
321
- ].filter(c => c !== undefined);
322
- const eventId = response.headers[netaceaHeaders.eventId];
323
- return {
324
- status: response.status,
325
- match,
326
- mitigate,
327
- captcha,
328
- setCookie,
329
- body: response.body,
330
- eventId,
331
- mitataMaxAge
332
- };
333
- }
334
- async buildCookieFromValues(cookieName, value, maxAge, path = '/') {
335
- if (this.encryptedCookies.includes(cookieName)) {
336
- const encyptedValue = await this.encryptCookieValue(value);
337
- return `${cookieName}=${encyptedValue}; Max-Age=${maxAge}; Path=${path}`;
338
- }
339
- return `${cookieName}=${value}; Max-Age=${maxAge}; Path=${path}`;
340
- }
341
- buildCookieHeader(cookies) {
342
- let cookiestr = '';
343
- let separator = '';
344
- for (const cookie in cookies) {
345
- const cookieValue = cookies[cookie];
346
- if (cookieValue !== undefined) {
347
- cookiestr = `${cookiestr}${separator}${cookie}=${cookieValue}`;
348
- separator = '; ';
349
- }
350
- }
351
- return cookiestr;
352
- }
353
- async makeMitigateAPICall(userId, clientIP, userAgent, captchaCookie) {
354
- const headers = {
355
- 'X-Netacea-API-Key': this.apiKey,
356
- 'X-Netacea-Client-IP': clientIP,
357
- 'user-agent': userAgent,
358
- 'cookie': this.buildCookieHeader({
359
- _mitatacaptcha: captchaCookie
360
- })
361
- };
362
- if (userId !== undefined) {
363
- headers['X-Netacea-UserId'] = userId;
364
- }
365
- if (this.captchaSiteKey !== undefined && this.captchaSecretKey !== undefined) {
366
- headers['X-Netacea-Captcha-Site-Key'] = this.captchaSiteKey;
367
- headers['X-Netacea-Captcha-Secret-Key'] = this.captchaSecretKey;
368
- }
369
- const res = await this.makeRequest({
370
- host: this.mitigationServiceUrl,
371
- path: '/',
372
- headers,
373
- method: 'GET',
374
- timeout: this.timeout
375
- });
376
- return await this.getApiCallResponseFromResponse(res, userId, clientIP);
377
- }
378
- composeResult(body, setCookie, status, match, mitigate, captcha, isCaptchaPost, eventId) {
379
- const bestMitigation = this.findBestMitigation(match, mitigate, captcha, isCaptchaPost);
380
- const result = {
381
- body,
382
- apiCallStatus: status,
383
- setCookie,
384
- sessionStatus: bestMitigation.sessionStatus,
385
- mitigation: bestMitigation.mitigation,
386
- mitigated: [
387
- mitigationTypes.block,
388
- mitigationTypes.captcha,
389
- mitigationTypes.captchaPass
390
- ].includes(bestMitigation.mitigation)
391
- };
392
- if (this.mitigationType === NetaceaMitigationType.INJECT) {
393
- const injectHeaders = {
394
- 'x-netacea-match': bestMitigation.parts.match.toString(),
395
- 'x-netacea-mitigate': bestMitigation.parts.mitigate.toString(),
396
- 'x-netacea-captcha': bestMitigation.parts.captcha.toString()
397
- };
398
- if (eventId !== undefined) {
399
- injectHeaders['x-netacea-event-id'] = eventId;
400
- }
401
- result.injectHeaders = injectHeaders;
402
- }
403
- return result;
404
- }
405
- findBestMitigation(match, mitigate, captcha, isCaptchaPost) {
406
- const UNKNOWN = 'unknown';
407
- if (!isCaptchaPost) {
408
- if (captcha === 2) {
409
- captcha = 4;
410
- }
411
- else if (captcha === 3) {
412
- captcha = 5;
413
- }
414
- }
415
- let sessionStatus = matchMap[match] ?? (UNKNOWN + '_');
416
- sessionStatus += mitigateMap[mitigate] ?? UNKNOWN;
417
- let mitigation = bestMitigationMap[mitigate];
418
- if (captcha !== 0) {
419
- sessionStatus += ',' + (captchaMap[captcha] ?? UNKNOWN);
420
- const bestCaptchaMitigation = bestMitigationCaptchaMap[captcha];
421
- if (bestCaptchaMitigation !== undefined) {
422
- mitigation = bestCaptchaMitigation;
423
- }
424
- }
425
- if (this.mitigationType === NetaceaMitigationType.INJECT) {
426
- mitigation = mitigationTypes.none;
427
- }
428
- return {
429
- sessionStatus,
430
- mitigation,
431
- parts: {
432
- match,
433
- mitigate,
434
- captcha
435
- }
436
- };
437
- }
438
- APIError(response) {
439
- let message = 'Unknown error';
440
- switch (response.status) {
441
- case 403:
442
- message = 'Invalid credentials';
443
- break;
444
- case 500:
445
- message = 'Server error';
446
- break;
447
- case 502:
448
- message = 'Bad Gateway';
449
- break;
450
- case 503:
451
- message = 'Service Unavailable';
452
- break;
453
- case 400:
454
- message = 'Invalid request';
455
- break;
456
- }
457
- return new Error(`Error reaching Netacea API (${message}), status: ${response.status}`);
458
- }
459
- isUrlCaptchaPost(url, method) {
460
- return url.includes('/AtaVerifyCaptcha') && method.toLowerCase() === 'post';
461
- }
462
- async processMitigateRequest(args) {
463
- const isCaptchaPost = this.isUrlCaptchaPost(args.url, args.method);
464
- return await (isCaptchaPost
465
- ? this.processCaptcha(args.mitata, args.clientIp, args.userAgent, await args.getBodyFn())
466
- : this.check(args.mitata, args.clientIp, args.userAgent, args.mitataCaptcha));
467
- }
468
- async setIngestOnlyMitataCookie(userId) {
469
- const mitataCookie = await this.createMitata(ingestIgnoredIpValue, userId, 0, 0, 0, ONE_DAY_IN_SECONDS);
470
- return {
471
- sessionStatus: '',
472
- setCookie: [mitataCookie]
473
- };
474
- }
475
- async processIngest(args) {
476
- if (this.secretKey === undefined) {
477
- throw new Error('Secret key is required for ingest');
478
- }
479
- const cookies = this.getCookieHeader(args);
480
- const netaceaCookie = await this.readCookie(this.netaceaCookieName, cookies);
481
- const cookieInfo = checkMitataCookie(netaceaCookie, ingestIgnoredIpValue, this.secretKey);
482
- if (!cookieInfo.isPrimaryHashValid) {
483
- return await this.setIngestOnlyMitataCookie(undefined);
484
- }
485
- if (cookieInfo.requiresReissue) {
486
- return await this.setIngestOnlyMitataCookie(cookieInfo.mitata?.userId);
487
- }
488
- return {
489
- sessionStatus: '',
490
- setCookie: []
491
- };
492
- }
493
- async encryptCookieValue(cookieValue) {
494
- return cookieValue;
495
- }
496
- async decryptCookieValue(encryptedCookieValue) {
497
- return encryptedCookieValue;
498
- }
499
- }
500
- //# sourceMappingURL=NetaceaBase.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"NetaceaBase.js","sourceRoot":"","sources":["../src/NetaceaBase.ts"],"names":[],"mappings":"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"}