perimeterx-js-core 0.6.2 → 0.7.0

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.
Files changed (83) hide show
  1. package/lib/action/ActionData.d.ts +1 -1
  2. package/lib/action/Decision.d.ts +1 -1
  3. package/lib/action/ProductAction.d.ts +1 -1
  4. package/lib/activities/model/Activity.d.ts +1 -1
  5. package/lib/activities/model/ActivityDetails.d.ts +5 -5
  6. package/lib/activities/utils.js +1 -1
  7. package/lib/additional_activity_handler/AdditionalActivityHandler.d.ts +1 -1
  8. package/lib/config/ConfigurationParams.d.ts +1 -1
  9. package/lib/context/DefaultContext.d.ts +4 -1
  10. package/lib/context/DefaultContext.js +6 -3
  11. package/lib/context/interfaces/MobileData.d.ts +1 -1
  12. package/lib/context/interfaces/ReadonlyContext.d.ts +1 -1
  13. package/lib/context/interfaces/RequestData.d.ts +6 -1
  14. package/lib/context/interfaces/RiskApiData.d.ts +1 -1
  15. package/lib/context/interfaces/ServerData.d.ts +1 -1
  16. package/lib/context/interfaces/TlsData.d.ts +1 -1
  17. package/lib/context/interfaces/TokenData.d.ts +1 -1
  18. package/lib/cors/CustomBlockResponseHeadersHandler.d.ts +1 -1
  19. package/lib/cors/CustomPreflightHandler.d.ts +1 -1
  20. package/lib/custom_parameters/CustomParameters.d.ts +1 -1
  21. package/lib/custom_parameters/CustomParametersFunction.d.ts +1 -1
  22. package/lib/enforcer/options/EnforcerBaseOptions.d.ts +1 -1
  23. package/lib/enforcer/options/EnforcerOptionsType.d.ts +1 -1
  24. package/lib/enforcer/options/EnforcerV2Options.d.ts +1 -1
  25. package/lib/enforcer/options/EnforcerV3Options.d.ts +1 -1
  26. package/lib/first_party/FirstPartyData.d.ts +1 -1
  27. package/lib/graphql/model/GraphQLData.d.ts +1 -1
  28. package/lib/graphql/model/GraphQLOperation.d.ts +1 -1
  29. package/lib/http/impl/FormDataImpl.js +2 -2
  30. package/lib/http/impl/MinimalResponseImpl.d.ts +1 -1
  31. package/lib/http/impl/OutgoingRequestImpl.d.ts +1 -1
  32. package/lib/http/interfaces/IHttpClient.d.ts +1 -1
  33. package/lib/http/interfaces/ReadonlyHeaders.d.ts +1 -1
  34. package/lib/phase/PhaseResult.d.ts +1 -1
  35. package/lib/products/account_defender/AccountDefender.d.ts +1 -1
  36. package/lib/products/account_defender/AccountDefenderData.d.ts +1 -1
  37. package/lib/products/account_defender/JwtData.d.ts +1 -1
  38. package/lib/products/bot_defender/BotDefender.d.ts +1 -1
  39. package/lib/products/bot_defender/BotDefenderData.d.ts +1 -1
  40. package/lib/products/bot_defender/block/model/BlockData.d.ts +1 -1
  41. package/lib/products/bot_defender/block/model/JsonBlockPayload.d.ts +1 -1
  42. package/lib/products/bot_defender/block/model/MobileBlockPayload.d.ts +1 -1
  43. package/lib/products/bot_defender/block/utils.js +5 -4
  44. package/lib/products/bot_defender/reasons/BotDefenderReasonType.d.ts +1 -1
  45. package/lib/products/credential_intelligence/endpoint/CredentialEndpointConfiguration.d.ts +1 -1
  46. package/lib/products/credential_intelligence/endpoint/login_successful/CustomLoginSuccessfulCallback.d.ts +1 -1
  47. package/lib/products/credential_intelligence/model/CredentialData.d.ts +1 -1
  48. package/lib/products/credential_intelligence/model/CredentialIntelligenceData.d.ts +1 -1
  49. package/lib/products/credential_intelligence/model/Credentials.d.ts +1 -1
  50. package/lib/products/credential_intelligence/model/CustomExtractionCallback.d.ts +1 -1
  51. package/lib/products/interfaces/ProductData.d.ts +1 -1
  52. package/lib/products/interfaces/ProductDataType.d.ts +1 -1
  53. package/lib/products/interfaces/ProductType.d.ts +1 -1
  54. package/lib/products/interfaces/Products.d.ts +1 -1
  55. package/lib/pxde/model/PXDE.d.ts +1 -1
  56. package/lib/pxde/model/PxdeData.d.ts +1 -1
  57. package/lib/pxhd/model/PXHD.d.ts +1 -1
  58. package/lib/risk_api/client/PostRiskApiClientBase.js +1 -1
  59. package/lib/risk_api/model/RiskActivity.d.ts +4 -4
  60. package/lib/risk_api/risk_response/RiskResponsePayloadType.d.ts +1 -1
  61. package/lib/risk_api/risk_response/v2/RiskResponseV2Payload.d.ts +1 -1
  62. package/lib/risk_api/risk_response/v3/RiskResponseV3Payload.d.ts +1 -1
  63. package/lib/risk_token/parser/DefaultTokenV2Parser.d.ts +1 -1
  64. package/lib/risk_token/parser/DefaultTokenV3Parser.d.ts +1 -1
  65. package/lib/risk_token/parser/TokenParserOptions.d.ts +1 -1
  66. package/lib/risk_token/token/TokenPayloadType.d.ts +1 -1
  67. package/lib/risk_token/token/v2/TokenV2Payload.d.ts +1 -1
  68. package/lib/risk_token/token/v3/TokenV3Payload.d.ts +1 -1
  69. package/lib/telemetry/model/TelemetryActivity.d.ts +2 -2
  70. package/lib/utils/cipher/ICipherUtils.d.ts +1 -1
  71. package/lib/utils/constants.d.ts +1 -1
  72. package/lib/utils/constants.js +1 -1
  73. package/lib/utils/index.d.ts +1 -0
  74. package/lib/utils/index.js +1 -0
  75. package/lib/utils/url_parser/DefaultUrlParser.d.ts +13 -0
  76. package/lib/utils/url_parser/DefaultUrlParser.js +21 -0
  77. package/lib/utils/url_parser/IURLParser.d.ts +4 -0
  78. package/lib/utils/url_parser/IURLParser.js +1 -0
  79. package/lib/utils/url_parser/index.d.ts +2 -0
  80. package/lib/utils/url_parser/index.js +2 -0
  81. package/lib/utils/utils.d.ts +5 -0
  82. package/lib/utils/utils.js +5 -1
  83. package/package.json +4 -4
@@ -1,5 +1,5 @@
1
1
  import { Action } from './Action';
2
- export declare type ActionData = {
2
+ export type ActionData = {
3
3
  /**
4
4
  * The recommended action that should be taken by the enforcer.
5
5
  */
@@ -1,6 +1,6 @@
1
1
  import { Action } from './index';
2
2
  import { ProductName } from '../products';
3
- export declare type Decision = {
3
+ export type Decision = {
4
4
  action?: Action;
5
5
  reasons?: Partial<Record<ProductName, string>>;
6
6
  };
@@ -1,5 +1,5 @@
1
1
  import { ActionData } from './ActionData';
2
2
  import { ProductName } from '../products';
3
- export declare type ProductAction = ActionData & {
3
+ export type ProductAction = ActionData & {
4
4
  productName: ProductName;
5
5
  };
@@ -1,6 +1,6 @@
1
1
  import { ActivityType } from '../ActivityType';
2
2
  import { ActivityDetails } from './ActivityDetails';
3
- export declare type Activity = {
3
+ export type Activity = {
4
4
  type: ActivityType;
5
5
  timestamp: number;
6
6
  socket_ip: string;
@@ -1,7 +1,7 @@
1
1
  import { GraphQLData } from '../../graphql';
2
2
  import { BlockAction } from '../../blocker';
3
- export declare type ActivityTypeDetails = PageRequestedActivityDetails | BlockActivityDetails | AdditionalS2SActivityDetails;
4
- export declare type ActivityDetails = ActivityTypeDetails & {
3
+ export type ActivityTypeDetails = PageRequestedActivityDetails | BlockActivityDetails | AdditionalS2SActivityDetails;
4
+ export type ActivityDetails = ActivityTypeDetails & {
5
5
  client_uuid: string;
6
6
  request_id: string;
7
7
  module_version: string;
@@ -26,20 +26,20 @@ export declare type ActivityDetails = ActivityTypeDetails & {
26
26
  app_user_id?: string;
27
27
  jwt_additional_fields?: Record<string, any>;
28
28
  };
29
- export declare type PageRequestedActivityDetails = {
29
+ export type PageRequestedActivityDetails = {
30
30
  pass_reason: string;
31
31
  px_cookie?: string;
32
32
  error_message?: string;
33
33
  s2s_error_reason?: string;
34
34
  s2s_error_http_status?: number;
35
35
  };
36
- export declare type BlockActivityDetails = {
36
+ export type BlockActivityDetails = {
37
37
  block_reason: string;
38
38
  block_action: BlockAction;
39
39
  block_score: number;
40
40
  simulated_block: boolean;
41
41
  };
42
- export declare type AdditionalS2SActivityDetails = {
42
+ export type AdditionalS2SActivityDetails = {
43
43
  http_status_code: number;
44
44
  login_successful: boolean;
45
45
  raw_username?: string;
@@ -8,7 +8,7 @@ export const createActivity = (activityType, config, context) => {
8
8
  return {
9
9
  type: activityType,
10
10
  px_app_id: config.appId,
11
- url: context.requestData.url.href,
11
+ url: context.requestData.rawUrl,
12
12
  headers: activityType !== ActivityType.ADDITIONAL_S2S
13
13
  ? joinHeaderValues(removeSensitiveHeaders(context.requestData.headers, config.sensitiveHeaders))
14
14
  : undefined,
@@ -1,3 +1,3 @@
1
1
  import { ConfigurationParams } from '../config';
2
2
  import { ReadonlyContext } from '../context';
3
- export declare type AdditionalActivityHandler = <Req, Res>(config: ConfigurationParams<Req, Res>, context: ReadonlyContext<Req, Res>, request: Req) => void | Promise<void>;
3
+ export type AdditionalActivityHandler = <Req, Res>(config: ConfigurationParams<Req, Res>, context: ReadonlyContext<Req, Res>, request: Req) => void | Promise<void>;
@@ -5,7 +5,7 @@ import { CredentialEndpointConfiguration, CredentialIntelligenceVersion, CustomL
5
5
  import { LoggerSeverity } from '../logger';
6
6
  import { ModuleMode } from '../utils';
7
7
  import { GraphQLOperationType } from '../graphql';
8
- export declare type ConfigurationParams<Req, Res> = {
8
+ export type ConfigurationParams<Req, Res> = {
9
9
  px_app_id: string;
10
10
  px_auth_token: string;
11
11
  px_cookie_secret: string;
@@ -9,9 +9,11 @@ import { ICookieParser, IRequestIdGenerator, VidSource } from '../utils';
9
9
  import { IContext, RequestData, RiskApiData, ServerData, TlsData, TokenData } from './interfaces';
10
10
  import { ProductData, ProductName } from '../products';
11
11
  import { Action } from '../action';
12
- export declare type DefaultContextOptions = {
12
+ import { IURLParser } from '../utils/url_parser';
13
+ export type DefaultContextOptions = {
13
14
  cookieParser?: ICookieParser;
14
15
  requestIdGenerator: IRequestIdGenerator;
16
+ urlParser?: IURLParser;
15
17
  };
16
18
  export declare class DefaultContext<Req, Res> implements IContext<Req, Res> {
17
19
  readonly requestId: string;
@@ -35,6 +37,7 @@ export declare class DefaultContext<Req, Res> implements IContext<Req, Res> {
35
37
  customParameters?: CustomParameters;
36
38
  response?: IOutgoingResponse<Res>;
37
39
  protected readonly config: IConfiguration<Req, Res>;
40
+ protected readonly urlParser: IURLParser;
38
41
  constructor(config: IConfiguration<Req, Res>, request: IIncomingRequest<Req>, options: DefaultContextOptions);
39
42
  get isMobile(): boolean;
40
43
  protected createRequestData(config: IConfiguration<Req, Res>, request: IIncomingRequest<Req>, cookieParser?: ICookieParser): RequestData<Req>;
@@ -3,10 +3,12 @@ import { PXHDSource } from '../pxhd';
3
3
  import { TokenOrigin, TokenParseResult } from '../risk_token';
4
4
  import { RiskApiCallResult } from '../risk_api';
5
5
  import { COOKIE_HEADER_NAME, toReadonlyHeaders, USER_AGENT_HEADER_NAME, } from '../http';
6
- import { StringSplitCookieParser, getDecodedUrl, PXHD_COOKIE_NAME, PXVID_COOKIE_NAME, X_PX_AUTHORIZATION_HEADER_NAME, } from '../utils';
6
+ import { StringSplitCookieParser, PXHD_COOKIE_NAME, PXVID_COOKIE_NAME, X_PX_AUTHORIZATION_HEADER_NAME, } from '../utils';
7
+ import { DefaultUrlParser } from '../utils/url_parser';
7
8
  export class DefaultContext {
8
9
  constructor(config, request, options) {
9
10
  this.config = config;
11
+ this.urlParser = options.urlParser || new DefaultUrlParser();
10
12
  this.tokenData = {
11
13
  tokenParseResult: TokenParseResult.NONE,
12
14
  };
@@ -29,7 +31,8 @@ export class DefaultContext {
29
31
  return this.tokenOrigin === TokenOrigin.HEADER;
30
32
  }
31
33
  createRequestData(config, request, cookieParser = new StringSplitCookieParser()) {
32
- const url = getDecodedUrl(request.url);
34
+ const rawUrl = request.url;
35
+ const url = this.urlParser.parse(rawUrl);
33
36
  const method = request.method;
34
37
  const headers = request.headers;
35
38
  const cookies = DefaultContext.getCookies(cookieParser, request.headers.get(COOKIE_HEADER_NAME), request.headers.get(config.customCookieHeader));
@@ -37,7 +40,7 @@ export class DefaultContext {
37
40
  const readOnlyHeaders = toReadonlyHeaders(headers);
38
41
  const userAgent = this.extractUserAgentFromHeader(config, readOnlyHeaders);
39
42
  const ip = this.extractIpFromHeader(config, readOnlyHeaders) || request.clientIP;
40
- return { url, method, headers: readOnlyHeaders, cookies, ip, userAgent, requestCookieNames, request };
43
+ return { url, rawUrl, method, headers: readOnlyHeaders, cookies, ip, userAgent, requestCookieNames, request };
41
44
  }
42
45
  static getCookies(cookieParser, ...cookieHeaderValues) {
43
46
  const cookies = {};
@@ -1,5 +1,5 @@
1
1
  import { IToken, MobileError, TokenParseResult } from '../../risk_token';
2
- export declare type MobileData<Req, Res> = {
2
+ export type MobileData<Req, Res> = {
3
3
  /**
4
4
  * The mobile error sent on the X-PX-Authorization header for mobile requests.
5
5
  */
@@ -1,3 +1,3 @@
1
1
  import { DeepReadonly } from 'ts-essentials';
2
2
  import { IContext } from './IContext';
3
- export declare type ReadonlyContext<Req, Res> = DeepReadonly<IContext<Req, Res>>;
3
+ export type ReadonlyContext<Req, Res> = DeepReadonly<IContext<Req, Res>>;
@@ -1,9 +1,14 @@
1
1
  import { HttpMethod, IIncomingRequest, IURL, ReadonlyHeaders } from '../../http';
2
- export declare type RequestData<Req> = {
2
+ export type RequestData<Req> = {
3
3
  /**
4
4
  * The request URL.
5
5
  */
6
6
  url: IURL;
7
+ /**
8
+ * The native url fetched from the environment.
9
+ * It should contain "..", duplicate slashes and un-decoded ascii characters (%XX) if possible.
10
+ */
11
+ rawUrl: string;
7
12
  /**
8
13
  * The request method, capitalized.
9
14
  */
@@ -1,5 +1,5 @@
1
1
  import { IRiskResponse, S2SErrorReason, RiskApiCallResult } from '../../risk_api';
2
- export declare type RiskApiData = {
2
+ export type RiskApiData = {
3
3
  /**
4
4
  * The result of the risk API call.
5
5
  */
@@ -1,4 +1,4 @@
1
- export declare type ServerData = {
1
+ export type ServerData = {
2
2
  /**
3
3
  * The operating system platform.
4
4
  */
@@ -1,4 +1,4 @@
1
- export declare type TlsData = {
1
+ export type TlsData = {
2
2
  /**
3
3
  * The TLS version used for the HTTPS request (e.g., 1.2, 1.3).
4
4
  */
@@ -1,6 +1,6 @@
1
1
  import { IToken, TokenParseResult } from '../../risk_token';
2
2
  import { MobileData } from './MobileData';
3
- export declare type TokenData<Req, Res> = {
3
+ export type TokenData<Req, Res> = {
4
4
  /**
5
5
  * The result of token parsing.
6
6
  */
@@ -1,2 +1,2 @@
1
1
  import { ReadonlyHeaders } from '../http';
2
- export declare type CustomBlockResponseHeadersHandler<Req> = (request: Req) => ReadonlyHeaders | Promise<ReadonlyHeaders>;
2
+ export type CustomBlockResponseHeadersHandler<Req> = (request: Req) => ReadonlyHeaders | Promise<ReadonlyHeaders>;
@@ -1,2 +1,2 @@
1
1
  import { IMinimalResponse } from '../http';
2
- export declare type CustomPreflightHandler<Req> = (request: Req) => IMinimalResponse | Promise<IMinimalResponse>;
2
+ export type CustomPreflightHandler<Req> = (request: Req) => IMinimalResponse | Promise<IMinimalResponse>;
@@ -1,4 +1,4 @@
1
- export declare type CustomParameters = {
1
+ export type CustomParameters = {
2
2
  custom_param1?: any;
3
3
  custom_param2?: any;
4
4
  custom_param3?: any;
@@ -1,3 +1,3 @@
1
1
  import { ConfigurationParams } from '../config';
2
2
  import { CustomParameters } from './CustomParameters';
3
- export declare type CustomParametersFunction<Req, Res> = (config: ConfigurationParams<Req, Res>, request: Req) => CustomParameters | Promise<CustomParameters>;
3
+ export type CustomParametersFunction<Req, Res> = (config: ConfigurationParams<Req, Res>, request: Req) => CustomParameters | Promise<CustomParameters>;
@@ -8,7 +8,7 @@ import { IRiskApiClient } from '../../risk_api';
8
8
  import { IActivityClient } from '../../activities';
9
9
  import { Products } from '../../products';
10
10
  import { IGraphQLParser } from '../../graphql';
11
- export declare type EnforcerBaseOptions<Req, Res> = {
11
+ export type EnforcerBaseOptions<Req, Res> = {
12
12
  httpClient: IHttpClient;
13
13
  base64Utils: IBase64Utils;
14
14
  hmacUtils: IHmacUtils;
@@ -1,4 +1,4 @@
1
1
  import { TokenVersion } from '../../risk_token';
2
2
  import { EnforcerV2Options } from './EnforcerV2Options';
3
3
  import { EnforcerV3Options } from './EnforcerV3Options';
4
- export declare type EnforcerOptionsType<TokenV extends TokenVersion, Req, Res> = TokenV extends TokenVersion.V2 ? EnforcerV2Options<Req, Res> : TokenV extends TokenVersion.V3 ? EnforcerV3Options<Req, Res> : never;
4
+ export type EnforcerOptionsType<TokenV extends TokenVersion, Req, Res> = TokenV extends TokenVersion.V2 ? EnforcerV2Options<Req, Res> : TokenV extends TokenVersion.V3 ? EnforcerV3Options<Req, Res> : never;
@@ -1,5 +1,5 @@
1
1
  import { TokenVersion } from '../../risk_token';
2
2
  import { EnforcerBaseOptions } from './EnforcerBaseOptions';
3
- export declare type EnforcerV2Options<Req, Res> = {
3
+ export type EnforcerV2Options<Req, Res> = {
4
4
  tokenVersion: TokenVersion.V2;
5
5
  } & EnforcerBaseOptions<Req, Res>;
@@ -1,7 +1,7 @@
1
1
  import { TokenVersion } from '../../risk_token';
2
2
  import { ICipherUtils } from '../../utils';
3
3
  import { EnforcerBaseOptions } from './EnforcerBaseOptions';
4
- export declare type EnforcerV3Options<Req, Res> = {
4
+ export type EnforcerV3Options<Req, Res> = {
5
5
  tokenVersion: TokenVersion.V3;
6
6
  cipherUtils: ICipherUtils;
7
7
  } & EnforcerBaseOptions<Req, Res>;
@@ -1,5 +1,5 @@
1
1
  import { IMinimalResponse, IOutgoingRequest } from '../http';
2
- export declare type FirstPartyData = {
2
+ export type FirstPartyData = {
3
3
  request?: IOutgoingRequest;
4
4
  defaultResponse: IMinimalResponse;
5
5
  };
@@ -1,5 +1,5 @@
1
1
  import { GraphQLOperationType } from './GraphQLOperationType';
2
- export declare type GraphQLData = {
2
+ export type GraphQLData = {
3
3
  type: GraphQLOperationType;
4
4
  name?: string;
5
5
  sensitive?: boolean;
@@ -1,4 +1,4 @@
1
- export declare type GraphQLOperation = {
1
+ export type GraphQLOperation = {
2
2
  query: string;
3
3
  operationName?: string;
4
4
  variables?: Record<string, unknown>;
@@ -29,8 +29,8 @@ export class FormDataImpl {
29
29
  if (typeof value === 'string') {
30
30
  this.data[name] = [value];
31
31
  }
32
- else {
33
- this.data[name] = [Object.assign(Object.assign({}, value), { name: filename !== null && filename !== void 0 ? filename : '', lastModified: Date.now(), webkitRelativePath: '' })];
32
+ else if (File) {
33
+ this.data[name] = [new File([value], filename)];
34
34
  }
35
35
  }
36
36
  }
@@ -1,6 +1,6 @@
1
1
  import { IMinimalResponse } from '../interfaces';
2
2
  import { ReadonlyHeaders } from '../interfaces';
3
- export declare type MinimalResponseOptions = {
3
+ export type MinimalResponseOptions = {
4
4
  status?: number;
5
5
  headers?: ReadonlyHeaders;
6
6
  body: any;
@@ -1,5 +1,5 @@
1
1
  import { ReadonlyHeaders, HttpMethod, IOutgoingRequest } from '..';
2
- export declare type OutGoingRequestImplOptions = {
2
+ export type OutGoingRequestImplOptions = {
3
3
  url: string;
4
4
  method?: HttpMethod | string;
5
5
  headers?: ReadonlyHeaders;
@@ -1,7 +1,7 @@
1
1
  import { AsyncOrSync } from 'ts-essentials';
2
2
  import { IOutgoingRequest } from './IOutgoingRequest';
3
3
  import { IIncomingResponse } from './IIncomingResponse';
4
- export declare type HttpSendOptions = {
4
+ export type HttpSendOptions = {
5
5
  timeoutMs?: number;
6
6
  };
7
7
  export interface IHttpClient {
@@ -1,6 +1,6 @@
1
1
  import { DeepReadonly } from 'ts-essentials';
2
2
  import { IHeaders } from './IHeaders';
3
- export declare type ReadonlyHeaders = DeepReadonly<Record<string, string[]>>;
3
+ export type ReadonlyHeaders = DeepReadonly<Record<string, string[]>>;
4
4
  export declare const toReadonlyHeaders: (headers: IHeaders) => ReadonlyHeaders;
5
5
  export declare const toMutableHeaders: (headers: ReadonlyHeaders) => Record<string, string[]>;
6
6
  export declare const joinHeaderValues: (headers: ReadonlyHeaders) => Record<string, string>;
@@ -1,5 +1,5 @@
1
1
  import { IMinimalResponse } from '../http';
2
- export declare type PhaseResult = {
2
+ export type PhaseResult = {
3
3
  done: boolean;
4
4
  response?: IMinimalResponse;
5
5
  };
@@ -5,7 +5,7 @@ import { IBase64Utils } from '../../utils';
5
5
  import { IAccountDefender } from './IAccountDefender';
6
6
  import { AccountDefenderData } from './AccountDefenderData';
7
7
  import { JwtData } from './JwtData';
8
- export declare type AccountDefenderOptions = {
8
+ export type AccountDefenderOptions = {
9
9
  base64Utils: IBase64Utils;
10
10
  };
11
11
  export declare class AccountDefender<Req, Res> implements IAccountDefender<Req, Res> {
@@ -1,5 +1,5 @@
1
1
  import { ActionData } from '../../action';
2
- export declare type AccountDefenderData = Partial<ActionData> & {
2
+ export type AccountDefenderData = Partial<ActionData> & {
3
3
  appUserId?: string;
4
4
  additionalFields?: Record<string, any>;
5
5
  crossTabSession?: string;
@@ -1,4 +1,4 @@
1
- export declare type JwtData = {
1
+ export type JwtData = {
2
2
  appUserId?: string;
3
3
  additionalFields?: Record<string, any>;
4
4
  };
@@ -11,7 +11,7 @@ import { IBase64Utils, IIpRangeChecker } from '../../utils';
11
11
  import { IBotDefender } from '../';
12
12
  import { BotDefenderData } from './BotDefenderData';
13
13
  import { BotDefenderS2SCallReason } from './reasons';
14
- export declare type BotDefenderOptions<Req, Res> = {
14
+ export type BotDefenderOptions<Req, Res> = {
15
15
  base64Utils: IBase64Utils;
16
16
  firstParty?: IFirstParty<Req, Res>;
17
17
  blocker?: IConditionalBlocker<Req, Res>;
@@ -1,5 +1,5 @@
1
1
  import { ActionData } from '../../action';
2
- export declare type BotDefenderData = ActionData & {
2
+ export type BotDefenderData = ActionData & {
3
3
  /**
4
4
  * Whether the request should go through the enforcement flow in monitor mode.
5
5
  * This depends on various configurations including the module mode, monitored routes, enforced
@@ -1,5 +1,5 @@
1
1
  import { BlockAction } from '../../../../blocker/BlockAction';
2
- export declare type BlockData = {
2
+ export type BlockData = {
3
3
  appId: string;
4
4
  hostUrl: string;
5
5
  jsClientSrc: string;
@@ -1,4 +1,4 @@
1
- export declare type JsonBlockPayload = {
1
+ export type JsonBlockPayload = {
2
2
  appId: string;
3
3
  jsClientSrc: string;
4
4
  firstPartyEnabled: boolean;
@@ -1,4 +1,4 @@
1
- export declare type MobileBlockPayload = {
1
+ export type MobileBlockPayload = {
2
2
  action: string;
3
3
  uuid: string;
4
4
  vid: string;
@@ -13,18 +13,19 @@ export const renderHtml = (htmlTemplate, blockData) => {
13
13
  };
14
14
  export const createBlockData = (config, context) => {
15
15
  var _a, _b;
16
- const captchaParams = `/captcha.js?a=${context.blockAction}&u=${context.uuid}&v=${context.vid || ''}&m=${context.isMobile ? '1' : '0'}`;
16
+ const captchaScriptSuffix = '/captcha.js';
17
+ const captchaParams = `?a=${context.blockAction}&u=${context.uuid}&v=${context.vid || ''}&m=${context.isMobile ? '1' : '0'}`;
17
18
  let jsClientSrc = `${config.backendClientUrl}/${config.appId}/main.min.js`;
18
- let blockScript = `${config.backendCaptchaUrl}/${config.appId}${captchaParams}`;
19
+ let blockScript = `${config.backendCaptchaUrl}/${config.appId}${captchaScriptSuffix}${captchaParams}`;
19
20
  let hostUrl = config.backendCollectorUrl;
20
21
  if (config.firstPartyEnabled && !context.isMobile) {
21
22
  jsClientSrc = getMostCustomizedFirstPartyPath(config, FirstPartySuffix.SENSOR);
22
- blockScript = `${getMostCustomizedFirstPartyPath(config, FirstPartySuffix.CAPTCHA)}${captchaParams}`;
23
+ blockScript = `${getMostCustomizedFirstPartyPath(config, FirstPartySuffix.CAPTCHA)}${config.customFirstPartyCaptchaEndpoint ? captchaParams : `${captchaScriptSuffix}${captchaParams}`}`;
23
24
  hostUrl = getMostCustomizedFirstPartyPath(config, FirstPartySuffix.XHR);
24
25
  }
25
26
  const cssRef = config.cssRef ? `<link rel="stylesheet" type="text/css" href="${config.cssRef}" />` : '';
26
27
  const jsRef = config.jsRef ? `<script src="${config.jsRef}"></script>` : '';
27
- const altBlockScript = `${config.altBackendCaptchaUrl}/${config.appId}${captchaParams}`;
28
+ const altBlockScript = `${config.altBackendCaptchaUrl}/${config.appId}${captchaScriptSuffix}${captchaParams}`;
28
29
  return {
29
30
  appId: config.appId,
30
31
  vid: context.vid || ((_b = (_a = context.requestData) === null || _a === void 0 ? void 0 : _a.cookies) === null || _b === void 0 ? void 0 : _b[PXVID_COOKIE_NAME]) || '',
@@ -2,4 +2,4 @@ import { Action } from '../../../action';
2
2
  import { BotDefenderBlockReason } from './BotDefenderBlockReason';
3
3
  import { BotDefenderPassReason } from './BotDefenderPassReason';
4
4
  import { BotDefenderS2SCallReason } from './BotDefenderS2SCallReason';
5
- export declare type BotDefenderReasonType<A extends Action> = A extends Action.BLOCK ? BotDefenderBlockReason : A extends Action.SIMULATED_BLOCK ? BotDefenderBlockReason : A extends Action.PASS_REQUEST ? BotDefenderPassReason : A extends Action.TRIGGER_RISK_API ? BotDefenderS2SCallReason : never;
5
+ export type BotDefenderReasonType<A extends Action> = A extends Action.BLOCK ? BotDefenderBlockReason : A extends Action.SIMULATED_BLOCK ? BotDefenderBlockReason : A extends Action.PASS_REQUEST ? BotDefenderPassReason : A extends Action.TRIGGER_RISK_API ? BotDefenderS2SCallReason : never;
@@ -2,7 +2,7 @@ import { HttpMethod } from '../../../http';
2
2
  import { CustomExtractionCallback } from '../model';
3
3
  import { PathType, SentThrough, CredentialIntelligenceVersion } from './index';
4
4
  import { CustomLoginSuccessfulCallback, LoginSuccessfulReportingMethod } from './login_successful';
5
- export declare type CredentialEndpointConfiguration<Req, Res> = {
5
+ export type CredentialEndpointConfiguration<Req, Res> = {
6
6
  /**
7
7
  * The URI of the request that contains the credentials.
8
8
  */
@@ -1 +1 @@
1
- export declare type CustomLoginSuccessfulCallback<Res> = (response: Res) => boolean | Promise<boolean>;
1
+ export type CustomLoginSuccessfulCallback<Res> = (response: Res) => boolean | Promise<boolean>;
@@ -1,5 +1,5 @@
1
1
  import { CredentialIntelligenceVersion, SsoStep } from '../endpoint';
2
- export declare type CredentialData = {
2
+ export type CredentialData = {
3
3
  ciVersion?: CredentialIntelligenceVersion;
4
4
  hashedUsername?: string;
5
5
  hashedPassword?: string;
@@ -1,6 +1,6 @@
1
1
  import { ActionData } from '../../../action';
2
2
  import { CredentialData } from './CredentialData';
3
- export declare type CredentialIntelligenceData = ActionData & CredentialData & {
3
+ export type CredentialIntelligenceData = ActionData & CredentialData & {
4
4
  endpointIndex?: number;
5
5
  isLoginSuccessful?: boolean;
6
6
  isCompromised?: boolean;
@@ -1,4 +1,4 @@
1
- export declare type Credentials = {
1
+ export type Credentials = {
2
2
  user?: string;
3
3
  pass?: string;
4
4
  };
@@ -1,2 +1,2 @@
1
1
  import { Credentials } from './Credentials';
2
- export declare type CustomExtractionCallback<Req> = (request: Req) => Credentials | Promise<Credentials>;
2
+ export type CustomExtractionCallback<Req> = (request: Req) => Credentials | Promise<Credentials>;
@@ -1,5 +1,5 @@
1
1
  import { ProductName } from '../utils';
2
2
  import { ProductDataType } from './ProductDataType';
3
- export declare type ProductData = {
3
+ export type ProductData = {
4
4
  [Name in ProductName]?: ProductDataType<Name>;
5
5
  };
@@ -2,4 +2,4 @@ import { ProductName } from '../utils';
2
2
  import { BotDefenderData } from '../bot_defender';
3
3
  import { CredentialIntelligenceData } from '../credential_intelligence';
4
4
  import { AccountDefenderData } from '../account_defender';
5
- export declare type ProductDataType<Name extends ProductName> = Name extends ProductName.BOT_DEFENDER ? BotDefenderData : Name extends ProductName.CREDENTIAL_INTELLIGENCE ? CredentialIntelligenceData : Name extends ProductName.CODE_DEFENDER ? never : Name extends ProductName.ACCOUNT_DEFENDER ? AccountDefenderData : Name extends ProductName.HYPE_SALE_CHALLENGE ? never : never;
5
+ export type ProductDataType<Name extends ProductName> = Name extends ProductName.BOT_DEFENDER ? BotDefenderData : Name extends ProductName.CREDENTIAL_INTELLIGENCE ? CredentialIntelligenceData : Name extends ProductName.CODE_DEFENDER ? never : Name extends ProductName.ACCOUNT_DEFENDER ? AccountDefenderData : Name extends ProductName.HYPE_SALE_CHALLENGE ? never : never;
@@ -2,4 +2,4 @@ import { ProductName } from '../utils';
2
2
  import { IBotDefender } from '../bot_defender';
3
3
  import { ICredentialIntelligence } from '../credential_intelligence';
4
4
  import { IAccountDefender } from '../account_defender';
5
- export declare type ProductType<Name extends ProductName, Req, Res> = Name extends ProductName.BOT_DEFENDER ? IBotDefender<Req, Res> : Name extends ProductName.CREDENTIAL_INTELLIGENCE ? ICredentialIntelligence<Req, Res> : Name extends ProductName.ACCOUNT_DEFENDER ? IAccountDefender<Req, Res> : never;
5
+ export type ProductType<Name extends ProductName, Req, Res> = Name extends ProductName.BOT_DEFENDER ? IBotDefender<Req, Res> : Name extends ProductName.CREDENTIAL_INTELLIGENCE ? ICredentialIntelligence<Req, Res> : Name extends ProductName.ACCOUNT_DEFENDER ? IAccountDefender<Req, Res> : never;
@@ -1,5 +1,5 @@
1
1
  import { ProductName } from '../utils';
2
2
  import { ProductType } from './ProductType';
3
- export declare type Products<Req, Res> = {
3
+ export type Products<Req, Res> = {
4
4
  [Name in ProductName]?: ProductType<Name, Req, Res>;
5
5
  };
@@ -1,4 +1,4 @@
1
- export declare type PXDE = {
1
+ export type PXDE = {
2
2
  timestamp: number;
3
3
  f_kb: number;
4
4
  f_type?: string;
@@ -1,5 +1,5 @@
1
1
  import { PXDE } from './PXDE';
2
- export declare type PxdeData = {
2
+ export type PxdeData = {
3
3
  pxde: PXDE;
4
4
  pxdeVerified: boolean;
5
5
  };
@@ -1,5 +1,5 @@
1
1
  import { PXHDSource } from './PXHDSource';
2
- export declare type PXHD = {
2
+ export type PXHD = {
3
3
  value: string;
4
4
  domain?: string;
5
5
  source: PXHDSource;
@@ -62,7 +62,7 @@ export class PostRiskApiClientBase {
62
62
  request: {
63
63
  ip: context.requestData.ip,
64
64
  headers: this.formatRiskHeadersField(context.requestData.headers),
65
- url: context.requestData.url.href,
65
+ url: context.requestData.rawUrl,
66
66
  },
67
67
  additional: {
68
68
  s2s_call_reason: ((_a = context.reasons) === null || _a === void 0 ? void 0 : _a[ProductName.BOT_DEFENDER]) ||
@@ -3,16 +3,16 @@ import { TokenOrigin } from '../../risk_token';
3
3
  import { CustomParameters } from '../../custom_parameters';
4
4
  import { GraphQLData } from '../../graphql/';
5
5
  import { CredentialIntelligenceVersion, SsoStep } from '../../products';
6
- export declare type HeaderEntry = {
6
+ export type HeaderEntry = {
7
7
  name: string;
8
8
  value: string;
9
9
  };
10
- export declare type RiskRequestData = {
10
+ export type RiskRequestData = {
11
11
  ip: string;
12
12
  url: string;
13
13
  headers: HeaderEntry[];
14
14
  };
15
- export declare type RiskAdditionalData = {
15
+ export type RiskAdditionalData = {
16
16
  request_id: string;
17
17
  module_version: string;
18
18
  s2s_call_reason: string;
@@ -47,7 +47,7 @@ export declare type RiskAdditionalData = {
47
47
  ci_version?: CredentialIntelligenceVersion;
48
48
  sso_step?: SsoStep;
49
49
  } & CustomParameters;
50
- export declare type RiskActivity = {
50
+ export type RiskActivity = {
51
51
  vid?: string;
52
52
  uuid?: string;
53
53
  pxhd?: string;
@@ -1,4 +1,4 @@
1
1
  import { TokenVersion } from '../../risk_token';
2
2
  import { RiskResponseV3Payload } from './v3';
3
3
  import { RiskResponseV2Payload } from './v2';
4
- export declare type RiskResponsePayloadType<TokenV extends TokenVersion> = TokenV extends TokenVersion.V3 ? RiskResponseV3Payload : TokenV extends TokenVersion.V2 ? RiskResponseV2Payload : never;
4
+ export type RiskResponsePayloadType<TokenV extends TokenVersion> = TokenV extends TokenVersion.V3 ? RiskResponseV3Payload : TokenV extends TokenVersion.V2 ? RiskResponseV2Payload : never;
@@ -1,7 +1,7 @@
1
1
  import { PXDE } from '../../../pxde';
2
2
  import { BlockAction } from '../../../blocker';
3
3
  import { RiskStatus } from '../../model';
4
- export declare type RiskResponseV2Payload = {
4
+ export type RiskResponseV2Payload = {
5
5
  status: RiskStatus;
6
6
  cookie_cfg_block_result?: '0' | '1';
7
7
  action?: BlockAction;
@@ -1,7 +1,7 @@
1
1
  import { BlockAction } from '../../../blocker';
2
2
  import { PXDE } from '../../../pxde';
3
3
  import { RiskStatus } from '../../model';
4
- export declare type RiskResponseV3Payload = {
4
+ export type RiskResponseV3Payload = {
5
5
  status: RiskStatus;
6
6
  score?: number;
7
7
  action?: BlockAction;
@@ -3,7 +3,7 @@ import { TokenParserBase } from './TokenParserBase';
3
3
  import { TokenVersion } from '../TokenVersion';
4
4
  import { IConfiguration } from '../../config';
5
5
  import { IToken } from '../token';
6
- export declare type DefaultTokenV2ParserOptions = {
6
+ export type DefaultTokenV2ParserOptions = {
7
7
  base64Utils: IBase64Utils;
8
8
  hmacUtils: IHmacUtils;
9
9
  };
@@ -3,7 +3,7 @@ import { ICipherUtils, IHmacUtils } from '../../utils';
3
3
  import { TokenVersion } from '../TokenVersion';
4
4
  import { IToken } from '../token';
5
5
  import { TokenParserBase } from './TokenParserBase';
6
- export declare type DefaultTokenV3ParserOptions = {
6
+ export type DefaultTokenV3ParserOptions = {
7
7
  cipherUtils: ICipherUtils;
8
8
  hmacUtils: IHmacUtils;
9
9
  };
@@ -1,4 +1,4 @@
1
1
  import { TokenVersion } from '../TokenVersion';
2
2
  import { DefaultTokenV3ParserOptions } from './DefaultTokenV3Parser';
3
3
  import { DefaultTokenV2ParserOptions } from './DefaultTokenV2Parser';
4
- export declare type TokenOptionsType<TokenV> = TokenV extends TokenVersion.V2 ? DefaultTokenV2ParserOptions : DefaultTokenV3ParserOptions;
4
+ export type TokenOptionsType<TokenV> = TokenV extends TokenVersion.V2 ? DefaultTokenV2ParserOptions : DefaultTokenV3ParserOptions;
@@ -1,4 +1,4 @@
1
1
  import { TokenVersion } from '../TokenVersion';
2
2
  import { TokenV3Payload } from './v3/TokenV3Payload';
3
3
  import { TokenV2Payload } from './v2/TokenV2Payload';
4
- export declare type TokenPayloadType<TokenV extends TokenVersion> = TokenV extends TokenVersion.V3 ? TokenV3Payload : TokenV extends TokenVersion.V2 ? TokenV2Payload : never;
4
+ export type TokenPayloadType<TokenV extends TokenVersion> = TokenV extends TokenVersion.V3 ? TokenV3Payload : TokenV extends TokenVersion.V2 ? TokenV2Payload : never;
@@ -1,4 +1,4 @@
1
- export declare type TokenV2Payload = {
1
+ export type TokenV2Payload = {
2
2
  h: string;
3
3
  u: string;
4
4
  t: number;
@@ -1,5 +1,5 @@
1
1
  import { BlockAction } from '../../../blocker';
2
- export declare type TokenV3Payload = {
2
+ export type TokenV3Payload = {
3
3
  a: BlockAction;
4
4
  s: number;
5
5
  t: number;
@@ -1,13 +1,13 @@
1
1
  import { ActivityType } from '../../activities';
2
2
  import { ConfigurationParams } from '../../config';
3
- export declare type TelemetryActivityDetails = {
3
+ export type TelemetryActivityDetails = {
4
4
  enforcer_configs: ConfigurationParams<unknown, unknown>;
5
5
  module_version: string;
6
6
  update_reason: 'command';
7
7
  node_name?: string;
8
8
  os_name?: string;
9
9
  };
10
- export declare type TelemetryActivity = {
10
+ export type TelemetryActivity = {
11
11
  type: ActivityType.ENFORCER_TELEMETRY;
12
12
  timestamp: number;
13
13
  px_app_id: string;
@@ -1,5 +1,5 @@
1
1
  import { AsyncOrSync } from 'ts-essentials';
2
- export declare type Pbkdf2DecryptOptions = {
2
+ export type Pbkdf2DecryptOptions = {
3
3
  keylen?: number;
4
4
  ivlen?: number;
5
5
  };
@@ -8,4 +8,4 @@ export declare const X_PX_AUTHORIZATION_HEADER_NAME = "x-px-authorization";
8
8
  export declare const X_PX_ORIGINAL_TOKEN_HEADER_NAME = "x-px-original-token";
9
9
  export declare const X_PX_BYPASS_REASON_HEADER_NAME = "x-px-bypass-reason";
10
10
  export declare const EMAIL_ADDRESS_REGEX: RegExp;
11
- export declare const CORE_MODULE_VERSION = "JS Core 0.6.2";
11
+ export declare const CORE_MODULE_VERSION = "JS Core 0.7.0";
@@ -8,4 +8,4 @@ export const X_PX_AUTHORIZATION_HEADER_NAME = 'x-px-authorization';
8
8
  export const X_PX_ORIGINAL_TOKEN_HEADER_NAME = 'x-px-original-token';
9
9
  export const X_PX_BYPASS_REASON_HEADER_NAME = 'x-px-bypass-reason';
10
10
  export const EMAIL_ADDRESS_REGEX = /^[a-zA-Z0-9_+&*-]+(?:\.[a-zA-Z0-9_+&*-]+)*@(?:[a-zA-Z0-9-]+\.)+[a-zA-Z]{2,7}$/;
11
- export const CORE_MODULE_VERSION = 'JS Core 0.6.2';
11
+ export const CORE_MODULE_VERSION = 'JS Core 0.7.0';
@@ -11,3 +11,4 @@ export * from './constants';
11
11
  export * from './ModuleMode';
12
12
  export * from './VidSource';
13
13
  export * from './Algorithm';
14
+ export * from './url_parser';
@@ -11,3 +11,4 @@ export * from './constants';
11
11
  export * from './ModuleMode';
12
12
  export * from './VidSource';
13
13
  export * from './Algorithm';
14
+ export * from './url_parser';
@@ -0,0 +1,13 @@
1
+ import { IURLParser } from './IURLParser';
2
+ import { IURL } from '../../http';
3
+ export type UrlParserOptions = {
4
+ normalize?: boolean;
5
+ reverseCharactersEncoding?: boolean;
6
+ };
7
+ export declare class DefaultUrlParser implements IURLParser {
8
+ private options;
9
+ constructor(options?: UrlParserOptions);
10
+ parse(rawUrl: string): IURL;
11
+ private reverseCharactersEncoding;
12
+ private normalize;
13
+ }
@@ -0,0 +1,21 @@
1
+ export class DefaultUrlParser {
2
+ constructor(options) {
3
+ this.options = Object.assign({ normalize: true, reverseCharactersEncoding: false }, options);
4
+ }
5
+ parse(rawUrl) {
6
+ const url = new URL(rawUrl);
7
+ if (this.options.reverseCharactersEncoding) {
8
+ url.pathname = this.reverseCharactersEncoding(url.pathname);
9
+ }
10
+ if (this.options.normalize) {
11
+ url.pathname = this.normalize(url.pathname);
12
+ }
13
+ return url;
14
+ }
15
+ reverseCharactersEncoding(path) {
16
+ return decodeURI(path);
17
+ }
18
+ normalize(path) {
19
+ return path.replace(/\/+$/, '').replace(/\/+/g, '/');
20
+ }
21
+ }
@@ -0,0 +1,4 @@
1
+ import { IURL } from '../../http';
2
+ export interface IURLParser {
3
+ parse(rawUrl: string): IURL;
4
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,2 @@
1
+ export * from './IURLParser';
2
+ export * from './DefaultUrlParser';
@@ -0,0 +1,2 @@
1
+ export * from './IURLParser';
2
+ export * from './DefaultUrlParser';
@@ -6,6 +6,11 @@ export declare const getScoreApiDomain: (appId: string) => string;
6
6
  export declare const getCollectorDomain: (appId: string) => string;
7
7
  export declare const getAuthorizationHeader: (authToken: string) => string;
8
8
  export declare const getExtension: (route: string) => string;
9
+ /**
10
+ *
11
+ * @param rawUrl
12
+ * @deprecated use {@link IURLParser} instead.
13
+ */
9
14
  export declare const getDecodedUrl: (rawUrl: string) => IURL;
10
15
  export declare const removeSensitiveFields: <T extends Record<string, any>>(object: T, sensitiveFields: (keyof T)[]) => T;
11
16
  export declare const removeSensitiveHeaders: (headers: ReadonlyHeaders, sensitiveHeaderNames: string[]) => Record<string, string[]>;
@@ -39,8 +39,12 @@ export const getExtension = (route) => {
39
39
  }
40
40
  return endOfPath.substring(extensionIndex);
41
41
  };
42
+ /**
43
+ *
44
+ * @param rawUrl
45
+ * @deprecated use {@link IURLParser} instead.
46
+ */
42
47
  export const getDecodedUrl = (rawUrl) => {
43
- rawUrl = rawUrl.replace(/%/g, '%25');
44
48
  try {
45
49
  return new URL(decodeURIComponent(rawUrl));
46
50
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "perimeterx-js-core",
3
- "version": "0.6.2",
3
+ "version": "0.7.0",
4
4
  "description": "",
5
5
  "main": "lib/index.js",
6
6
  "type": "module",
@@ -35,7 +35,7 @@
35
35
  "@types/crypto-js": "^4.1.1",
36
36
  "@types/mocha": "^10.0.0",
37
37
  "@types/sinon": "^10.0.13",
38
- "@types/uuid": "^8.3.4",
38
+ "@types/uuid": "^9.0.2",
39
39
  "@typescript-eslint/eslint-plugin": "^5.40.0",
40
40
  "@typescript-eslint/parser": "^5.40.0",
41
41
  "chai": "^4.3.6",
@@ -49,10 +49,10 @@
49
49
  "mocha": "^10.0.0",
50
50
  "nyc": "^15.1.0",
51
51
  "prettier": "^2.7.1",
52
- "sinon": "^14.0.1",
52
+ "sinon": "^15.2.0",
53
53
  "ts-loader": "^9.4.1",
54
54
  "ts-node": "^10.9.1",
55
- "typescript": "^4.4.4"
55
+ "typescript": "^5.1.6"
56
56
  },
57
57
  "lint-staged": {
58
58
  "*.ts": "npm run lint:fix"