@segment/action-destinations 3.490.1-staging-90ec231bc.0 → 3.490.1-staging-046ffc7a3.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.
- package/dist/destinations/hubspot/customEvent/functions/cache-functions.d.ts +1 -0
- package/dist/destinations/hubspot/customEvent/functions/cache-functions.js +19 -2
- package/dist/destinations/hubspot/customEvent/functions/cache-functions.js.map +1 -1
- package/dist/destinations/hubspot/customEvent/functions/hubspot-event-schema-functions.js +7 -1
- package/dist/destinations/hubspot/customEvent/functions/hubspot-event-schema-functions.js.map +1 -1
- package/dist/destinations/hubspot/customEvent/functions/validation-functions.d.ts +1 -3
- package/dist/destinations/hubspot/customEvent/functions/validation-functions.js +7 -10
- package/dist/destinations/hubspot/customEvent/functions/validation-functions.js.map +1 -1
- package/dist/destinations/hubspot/customEvent/index.js +6 -4
- package/dist/destinations/hubspot/customEvent/index.js.map +1 -1
- package/dist/destinations/hubspot/customEvent/types.d.ts +1 -0
- package/dist/destinations/webhook/send/index.js +7 -0
- package/dist/destinations/webhook/send/index.js.map +1 -1
- package/dist/destinations/webhook/ssrf-utils.d.ts +1 -0
- package/dist/destinations/webhook/ssrf-utils.js +75 -0
- package/dist/destinations/webhook/ssrf-utils.js.map +1 -0
- package/dist/destinations/webhook-extensible/send/index.js +8 -1
- package/dist/destinations/webhook-extensible/send/index.js.map +1 -1
- package/dist/destinations/webhook-extensible/ssrf-utils.d.ts +1 -0
- package/dist/destinations/webhook-extensible/ssrf-utils.js +75 -0
- package/dist/destinations/webhook-extensible/ssrf-utils.js.map +1 -0
- package/package.json +4 -4
|
@@ -8,3 +8,4 @@ export declare function getSchemaFromCache(name: string, subscriptionMetadata?:
|
|
|
8
8
|
export declare function saveSchemaToCache(schema: CachableSchema, subscriptionMetadata?: SubscriptionMetadata, statsContext?: StatsContext): Promise<void>;
|
|
9
9
|
export declare function compareSchemas(schema1: Schema, schema2: CachableSchema | undefined): SchemaDiff;
|
|
10
10
|
export declare function convertNumericStrings(validPayload: Payload, numericStrings: string[]): void;
|
|
11
|
+
export declare function convertStringToNumbers(validPayload: Payload, stringToNumbers: string[]): void;
|
|
@@ -5,6 +5,7 @@ exports.getSchemaFromCache = getSchemaFromCache;
|
|
|
5
5
|
exports.saveSchemaToCache = saveSchemaToCache;
|
|
6
6
|
exports.compareSchemas = compareSchemas;
|
|
7
7
|
exports.convertNumericStrings = convertNumericStrings;
|
|
8
|
+
exports.convertStringToNumbers = convertStringToNumbers;
|
|
8
9
|
const actions_core_1 = require("@segment/actions-core");
|
|
9
10
|
const lru_cache_1 = require("lru-cache");
|
|
10
11
|
exports.cache = new lru_cache_1.LRUCache({
|
|
@@ -32,13 +33,14 @@ async function saveSchemaToCache(schema, subscriptionMetadata, statsContext) {
|
|
|
32
33
|
}
|
|
33
34
|
function compareSchemas(schema1, schema2) {
|
|
34
35
|
if (schema2 === undefined) {
|
|
35
|
-
return { match: 'no_match', missingProperties: {}, numericStrings: [] };
|
|
36
|
+
return { match: 'no_match', missingProperties: {}, numericStrings: [], stringToNumbers: [] };
|
|
36
37
|
}
|
|
37
38
|
if (schema1.name !== schema2.name && schema1.name !== schema2.fullyQualifiedName) {
|
|
38
39
|
throw new actions_core_1.PayloadValidationError("Hubspot.CustomEvent.compareSchemas: Schema names don't match");
|
|
39
40
|
}
|
|
40
41
|
const missingProperties = {};
|
|
41
42
|
const numericStrings = [];
|
|
43
|
+
const stringToNumbers = [];
|
|
42
44
|
for (const [key, prop1] of Object.entries(schema1.properties)) {
|
|
43
45
|
const prop2 = schema2.properties[key];
|
|
44
46
|
if (prop2 === undefined) {
|
|
@@ -49,6 +51,10 @@ function compareSchemas(schema1, schema2) {
|
|
|
49
51
|
numericStrings.push(key);
|
|
50
52
|
continue;
|
|
51
53
|
}
|
|
54
|
+
if (prop1.type === 'string' && prop2.type === 'number') {
|
|
55
|
+
stringToNumbers.push(key);
|
|
56
|
+
continue;
|
|
57
|
+
}
|
|
52
58
|
if (prop1.stringFormat === prop2.stringFormat && prop1.type === prop2.type) {
|
|
53
59
|
continue;
|
|
54
60
|
}
|
|
@@ -59,7 +65,8 @@ function compareSchemas(schema1, schema2) {
|
|
|
59
65
|
return {
|
|
60
66
|
match: Object.keys(missingProperties).length > 0 ? 'properties_missing' : 'full_match',
|
|
61
67
|
missingProperties,
|
|
62
|
-
numericStrings
|
|
68
|
+
numericStrings,
|
|
69
|
+
stringToNumbers
|
|
63
70
|
};
|
|
64
71
|
}
|
|
65
72
|
function convertNumericStrings(validPayload, numericStrings) {
|
|
@@ -72,4 +79,14 @@ function convertNumericStrings(validPayload, numericStrings) {
|
|
|
72
79
|
}
|
|
73
80
|
}
|
|
74
81
|
}
|
|
82
|
+
function convertStringToNumbers(validPayload, stringToNumbers) {
|
|
83
|
+
if (!validPayload.properties || stringToNumbers.length === 0) {
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
for (const propName of stringToNumbers) {
|
|
87
|
+
if (validPayload.properties[propName] !== undefined) {
|
|
88
|
+
validPayload.properties[propName] = Number(validPayload.properties[propName]);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
75
92
|
//# sourceMappingURL=cache-functions.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cache-functions.js","sourceRoot":"","sources":["../../../../../src/destinations/hubspot/customEvent/functions/cache-functions.ts"],"names":[],"mappings":";;;AAeA,gDAYC;AAED,8CAYC;AAED,
|
|
1
|
+
{"version":3,"file":"cache-functions.js","sourceRoot":"","sources":["../../../../../src/destinations/hubspot/customEvent/functions/cache-functions.ts"],"names":[],"mappings":";;;AAeA,gDAYC;AAED,8CAYC;AAED,wCA2CC;AAOD,sDASC;AAOD,wDASC;AAtHD,wDAA4E;AAG5E,yCAAoC;AAGvB,QAAA,KAAK,GAAG,IAAI,oBAAQ,CAAyB;IACxD,GAAG,EAAE,IAAI;IACT,GAAG,EAAE,IAAI,GAAG,EAAE,GAAG,EAAE;CACpB,CAAC,CAAA;AAEF,SAAS,MAAM,CAAC,IAAY,EAAE,oBAA0C;IACtE,OAAO,GAAG,oBAAoB,CAAC,cAAc,IAAI,IAAI,EAAE,CAAA;AACzD,CAAC;AAED,SAAgB,kBAAkB,CAChC,IAAY,EACZ,oBAA2C,EAC3C,YAA2B;IAE3B,IAAI,CAAC,oBAAoB,IAAI,CAAC,oBAAoB,EAAE,cAAc,EAAE,CAAC;QACnE,YAAY,EAAE,WAAW,EAAE,IAAI,CAAC,iBAAiB,EAAE,CAAC,EAAE,YAAY,EAAE,IAAI,CAAC,CAAA;QACzE,OAAO,SAAS,CAAA;IAClB,CAAC;IAED,MAAM,MAAM,GAA+B,aAAK,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,oBAAoB,CAAC,CAAC,IAAI,SAAS,CAAA;IACrG,OAAO,MAAM,CAAA;AACf,CAAC;AAEM,KAAK,UAAU,iBAAiB,CACrC,MAAsB,EACtB,oBAA2C,EAC3C,YAA2B;IAE3B,IAAI,CAAC,oBAAoB,IAAI,CAAC,oBAAoB,EAAE,cAAc,EAAE,CAAC;QACnE,YAAY,EAAE,WAAW,EAAE,IAAI,CAAC,kBAAkB,EAAE,CAAC,EAAE,YAAY,EAAE,IAAI,CAAC,CAAA;QAC1E,OAAM;IACR,CAAC;IAED,aAAK,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,oBAAoB,CAAC,EAAE,MAAM,CAAC,CAAA;IAC5D,YAAY,EAAE,WAAW,EAAE,IAAI,CAAC,oBAAoB,EAAE,CAAC,EAAE,YAAY,EAAE,IAAI,CAAC,CAAA;AAC9E,CAAC;AAED,SAAgB,cAAc,CAAC,OAAe,EAAE,OAAmC;IACjF,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC1B,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,iBAAiB,EAAE,EAAE,EAAE,cAAc,EAAE,EAAE,EAAE,eAAe,EAAE,EAAE,EAAE,CAAA;IAC9F,CAAC;IAED,IAAI,OAAO,CAAC,IAAI,KAAK,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI,KAAK,OAAO,CAAC,kBAAkB,EAAE,CAAC;QACjF,MAAM,IAAI,qCAAsB,CAAC,8DAA8D,CAAC,CAAA;IAClG,CAAC;IAED,MAAM,iBAAiB,GAAuC,EAAE,CAAA;IAChE,MAAM,cAAc,GAAa,EAAE,CAAA;IACnC,MAAM,eAAe,GAAa,EAAE,CAAA;IAEpC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;QAC9D,MAAM,KAAK,GAAG,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAA;QACrC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,iBAAiB,CAAC,GAAG,CAAC,GAAG,KAAK,CAAA;YAC9B,SAAQ;QACV,CAAC;QAED,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACvD,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;YACxB,SAAQ;QACV,CAAC;QAGD,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACvD,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;YACzB,SAAQ;QACV,CAAC;QACD,IAAI,KAAK,CAAC,YAAY,KAAK,KAAK,CAAC,YAAY,IAAI,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,EAAE,CAAC;YAC3E,SAAQ;QACV,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,qCAAsB,CAAC,uEAAuE,CAAC,CAAA;QAC3G,CAAC;IACH,CAAC;IAED,OAAO;QACL,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,YAAY;QACtF,iBAAiB;QACjB,cAAc;QACd,eAAe;KAChB,CAAA;AACH,CAAC;AAOD,SAAgB,qBAAqB,CAAC,YAAqB,EAAE,cAAwB;IACnF,IAAI,CAAC,YAAY,CAAC,UAAU,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5D,OAAM;IACR,CAAC;IACD,KAAK,MAAM,QAAQ,IAAI,cAAc,EAAE,CAAC;QACtC,IAAI,YAAY,CAAC,UAAU,CAAC,QAAQ,CAAC,KAAK,SAAS,EAAE,CAAC;YACpD,YAAY,CAAC,UAAU,CAAC,QAAQ,CAAC,GAAG,MAAM,CAAC,YAAY,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAA;QAC/E,CAAC;IACH,CAAC;AACH,CAAC;AAOD,SAAgB,sBAAsB,CAAC,YAAqB,EAAE,eAAyB;IACrF,IAAI,CAAC,YAAY,CAAC,UAAU,IAAI,eAAe,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7D,OAAM;IACR,CAAC;IACD,KAAK,MAAM,QAAQ,IAAI,eAAe,EAAE,CAAC;QACvC,IAAI,YAAY,CAAC,UAAU,CAAC,QAAQ,CAAC,KAAK,SAAS,EAAE,CAAC;YACpD,YAAY,CAAC,UAAU,CAAC,QAAQ,CAAC,GAAG,MAAM,CAAC,YAAY,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAA;QAC/E,CAAC;IACH,CAAC;AACH,CAAC"}
|
|
@@ -27,9 +27,15 @@ async function getSchemaFromHubspot(client, schema) {
|
|
|
27
27
|
if (maybeMatch?.archived === true) {
|
|
28
28
|
throw new actions_core_1.PayloadValidationError(`Hubspot.CustomEvent.getSchemaFromHubspot: Property ${propName} is archived`);
|
|
29
29
|
}
|
|
30
|
-
if (['object', '
|
|
30
|
+
if (['object', 'boolean'].includes(prop.type) && maybeMatch.type === 'number') {
|
|
31
31
|
throw new actions_core_1.PayloadValidationError(`Hubspot.CustomEvent.getSchemaFromHubspot: Expected type ${prop.type} for property ${propName} - Hubspot returned type ${maybeMatch.type}`);
|
|
32
32
|
}
|
|
33
|
+
if (prop.type === 'string' && maybeMatch.type === 'number') {
|
|
34
|
+
props[propName] = {
|
|
35
|
+
type: 'number'
|
|
36
|
+
};
|
|
37
|
+
continue;
|
|
38
|
+
}
|
|
33
39
|
if (prop.type === 'number' && maybeMatch.type === 'string') {
|
|
34
40
|
props[propName] = {
|
|
35
41
|
type: 'string',
|
package/dist/destinations/hubspot/customEvent/functions/hubspot-event-schema-functions.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hubspot-event-schema-functions.js","sourceRoot":"","sources":["../../../../../src/destinations/hubspot/customEvent/functions/hubspot-event-schema-functions.ts"],"names":[],"mappings":";;AAcA,
|
|
1
|
+
{"version":3,"file":"hubspot-event-schema-functions.js","sourceRoot":"","sources":["../../../../../src/destinations/hubspot/customEvent/functions/hubspot-event-schema-functions.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,3 @@
|
|
|
1
1
|
import { Payload } from '../generated-types';
|
|
2
|
-
|
|
3
|
-
import { SubscriptionMetadata } from '@segment/actions-core/destination-kit';
|
|
4
|
-
export declare function validate(payload: Payload, statsContext?: StatsContext, logger?: Logger, subscriptionMetadata?: SubscriptionMetadata): Payload;
|
|
2
|
+
export declare function validate(payload: Payload): Payload;
|
|
5
3
|
export declare function cleanEventName(str: string): string;
|
|
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.validate = validate;
|
|
4
4
|
exports.cleanEventName = cleanEventName;
|
|
5
5
|
const actions_core_1 = require("@segment/actions-core");
|
|
6
|
-
function validate(payload
|
|
6
|
+
function validate(payload) {
|
|
7
7
|
if (payload.record_details.object_type !== 'contact' && typeof payload.record_details.object_id !== 'number') {
|
|
8
8
|
throw new actions_core_1.PayloadValidationError('object_id is required and must be numeric');
|
|
9
9
|
}
|
|
@@ -15,7 +15,7 @@ function validate(payload, statsContext, logger, subscriptionMetadata) {
|
|
|
15
15
|
}
|
|
16
16
|
cleanIdentifiers(payload);
|
|
17
17
|
payload.event_name = cleanEventName(payload.event_name);
|
|
18
|
-
payload.properties = cleanPropObj(payload.properties ?? {}
|
|
18
|
+
payload.properties = cleanPropObj(payload.properties ?? {});
|
|
19
19
|
return payload;
|
|
20
20
|
}
|
|
21
21
|
function cleanIdentifiers(payload) {
|
|
@@ -32,12 +32,11 @@ function cleanEventName(str) {
|
|
|
32
32
|
.replace(/[^a-z0-9_-]/g, '_')
|
|
33
33
|
.trim();
|
|
34
34
|
}
|
|
35
|
-
function cleanPropObj(obj
|
|
35
|
+
function cleanPropObj(obj) {
|
|
36
36
|
const cleanObj = {};
|
|
37
37
|
if (obj === undefined) {
|
|
38
38
|
return undefined;
|
|
39
39
|
}
|
|
40
|
-
let hasEmptyStringToNumber = false;
|
|
41
40
|
Object.keys(obj).forEach((key) => {
|
|
42
41
|
const value = obj[key];
|
|
43
42
|
const cleanKey = cleanProp(key);
|
|
@@ -50,9 +49,11 @@ function cleanPropObj(obj, statsContext, logger, subscriptionMetadata) {
|
|
|
50
49
|
}
|
|
51
50
|
else if (!isNaN(Number(value))) {
|
|
52
51
|
if (typeof value === 'string' && value.trim() === '') {
|
|
53
|
-
|
|
52
|
+
cleanObj[cleanKey] = '';
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
cleanObj[cleanKey] = Number(value);
|
|
54
56
|
}
|
|
55
|
-
cleanObj[cleanKey] = Number(value);
|
|
56
57
|
}
|
|
57
58
|
else if (typeof value === 'object' && value !== null) {
|
|
58
59
|
cleanObj[cleanKey] = JSON.stringify(value).trim();
|
|
@@ -61,10 +62,6 @@ function cleanPropObj(obj, statsContext, logger, subscriptionMetadata) {
|
|
|
61
62
|
cleanObj[cleanKey] = String(value).trim();
|
|
62
63
|
}
|
|
63
64
|
});
|
|
64
|
-
if (hasEmptyStringToNumber) {
|
|
65
|
-
statsContext?.statsClient?.incr('hubspot.custom_event.empty_string_to_number', 1, statsContext?.tags);
|
|
66
|
-
logger?.warn?.(`hubspot.custom_event.empty_string_to_number destinationConfigId: ${subscriptionMetadata?.destinationConfigId} sourceId: ${subscriptionMetadata?.sourceId}`);
|
|
67
|
-
}
|
|
68
65
|
return cleanObj;
|
|
69
66
|
}
|
|
70
67
|
function cleanProp(str) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validation-functions.js","sourceRoot":"","sources":["../../../../../src/destinations/hubspot/customEvent/functions/validation-functions.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"validation-functions.js","sourceRoot":"","sources":["../../../../../src/destinations/hubspot/customEvent/functions/validation-functions.ts"],"names":[],"mappings":"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"}
|
|
@@ -27,14 +27,14 @@ const action = {
|
|
|
27
27
|
...common_fields_1.commonFields
|
|
28
28
|
},
|
|
29
29
|
dynamicFields: dynamic_field_functions_1.dynamicFields,
|
|
30
|
-
perform: async (request, { payload, syncMode, subscriptionMetadata, statsContext
|
|
31
|
-
return await send(request, payload, syncMode, subscriptionMetadata, statsContext
|
|
30
|
+
perform: async (request, { payload, syncMode, subscriptionMetadata, statsContext }) => {
|
|
31
|
+
return await send(request, payload, syncMode, subscriptionMetadata, statsContext);
|
|
32
32
|
}
|
|
33
33
|
};
|
|
34
|
-
const send = async (request, payload, syncMode, subscriptionMetadata, statsContext
|
|
34
|
+
const send = async (request, payload, syncMode, subscriptionMetadata, statsContext) => {
|
|
35
35
|
statsContext?.tags?.push('action:custom_event');
|
|
36
36
|
const client = new client_1.Client(request);
|
|
37
|
-
const validPayload = (0, validation_functions_1.validate)(payload
|
|
37
|
+
const validPayload = (0, validation_functions_1.validate)(payload);
|
|
38
38
|
const schema = (0, schema_functions_1.eventSchema)(validPayload);
|
|
39
39
|
const cachedSchema = (0, cache_functions_1.getSchemaFromCache)(schema.name, subscriptionMetadata, statsContext);
|
|
40
40
|
statsContext?.statsClient?.incr(`cache.get.${cachedSchema === undefined ? 'miss' : 'hit'}`, 1, statsContext?.tags);
|
|
@@ -42,6 +42,7 @@ const send = async (request, payload, syncMode, subscriptionMetadata, statsConte
|
|
|
42
42
|
statsContext?.statsClient?.incr(`cache.diff.${cacheSchemaDiff.match}`, 1, statsContext?.tags);
|
|
43
43
|
if (cacheSchemaDiff.match === types_1.SchemaMatch.FullMatch) {
|
|
44
44
|
(0, cache_functions_1.convertNumericStrings)(validPayload, cacheSchemaDiff.numericStrings);
|
|
45
|
+
(0, cache_functions_1.convertStringToNumbers)(validPayload, cacheSchemaDiff.stringToNumbers);
|
|
45
46
|
return await (0, event_completion_functions_1.sendEvent)(client, cachedSchema.fullyQualifiedName, validPayload);
|
|
46
47
|
}
|
|
47
48
|
const hubspotSchema = await (0, hubspot_event_schema_functions_1.getSchemaFromHubspot)(client, schema);
|
|
@@ -49,6 +50,7 @@ const send = async (request, payload, syncMode, subscriptionMetadata, statsConte
|
|
|
49
50
|
const hubspotSchemaDiff = (0, cache_functions_1.compareSchemas)(schema, hubspotSchema);
|
|
50
51
|
statsContext?.statsClient?.incr(`hubspotSchemaDiff.diff.${hubspotSchemaDiff.match}`, 1, statsContext?.tags);
|
|
51
52
|
(0, cache_functions_1.convertNumericStrings)(validPayload, hubspotSchemaDiff.numericStrings);
|
|
53
|
+
(0, cache_functions_1.convertStringToNumbers)(validPayload, hubspotSchemaDiff.stringToNumbers);
|
|
52
54
|
switch (hubspotSchemaDiff.match) {
|
|
53
55
|
case types_1.SchemaMatch.FullMatch: {
|
|
54
56
|
await (0, cache_functions_1.saveSchemaToCache)(hubspotSchema, subscriptionMetadata, statsContext);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/destinations/hubspot/customEvent/index.ts"],"names":[],"mappings":";;AAEA,mDAA8C;AAC9C,qCAAiC;AACjC,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/destinations/hubspot/customEvent/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
const actions_core_1 = require("@segment/actions-core");
|
|
4
|
+
const ssrf_utils_1 = require("../ssrf-utils");
|
|
4
5
|
const action = {
|
|
5
6
|
title: 'Send',
|
|
6
7
|
description: 'Send an HTTP request.',
|
|
@@ -54,6 +55,9 @@ const action = {
|
|
|
54
55
|
}
|
|
55
56
|
},
|
|
56
57
|
perform: (request, { payload }) => {
|
|
58
|
+
if ((0, ssrf_utils_1.isRestrictedUrl)(payload.url)) {
|
|
59
|
+
throw new actions_core_1.PayloadValidationError(`URL is not allowed: ${payload.url}`);
|
|
60
|
+
}
|
|
57
61
|
try {
|
|
58
62
|
return request(payload.url, {
|
|
59
63
|
method: payload.method,
|
|
@@ -69,6 +73,9 @@ const action = {
|
|
|
69
73
|
},
|
|
70
74
|
performBatch: (request, { payload, statsContext }) => {
|
|
71
75
|
const { url, method, headers } = payload[0];
|
|
76
|
+
if ((0, ssrf_utils_1.isRestrictedUrl)(url)) {
|
|
77
|
+
throw new actions_core_1.PayloadValidationError(`URL is not allowed: ${url}`);
|
|
78
|
+
}
|
|
72
79
|
if (statsContext) {
|
|
73
80
|
const { statsClient, tags } = statsContext;
|
|
74
81
|
const set = new Set();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/destinations/webhook/send/index.ts"],"names":[],"mappings":";;AAAA,wDAAgF;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/destinations/webhook/send/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function isRestrictedUrl(rawUrl: string): boolean;
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.isRestrictedUrl = isRestrictedUrl;
|
|
4
|
+
const net_1 = require("net");
|
|
5
|
+
const url_1 = require("url");
|
|
6
|
+
const RESTRICTED_CIDRS_V4 = [
|
|
7
|
+
[0x00000000, 0xff000000, '0.0.0.0/8'],
|
|
8
|
+
[0x0a000000, 0xff000000, '10.0.0.0/8'],
|
|
9
|
+
[0x64400000, 0xffc00000, '100.64.0.0/10'],
|
|
10
|
+
[0x7f000000, 0xff000000, '127.0.0.0/8'],
|
|
11
|
+
[0xa9fe0000, 0xffff0000, '169.254.0.0/16'],
|
|
12
|
+
[0xac100000, 0xfff00000, '172.16.0.0/12'],
|
|
13
|
+
[0xc0000000, 0xffffff00, '192.0.0.0/24'],
|
|
14
|
+
[0xc0000200, 0xffffff00, '192.0.2.0/24'],
|
|
15
|
+
[0xc0a80000, 0xffff0000, '192.168.0.0/16'],
|
|
16
|
+
[0xc6336400, 0xffffff00, '198.51.100.0/24'],
|
|
17
|
+
[0xcb007100, 0xffffff00, '203.0.113.0/24'],
|
|
18
|
+
[0xe0000000, 0xf0000000, '224.0.0.0/4'],
|
|
19
|
+
[0xf0000000, 0xf0000000, '240.0.0.0/4']
|
|
20
|
+
];
|
|
21
|
+
function ipv4ToInt(ip) {
|
|
22
|
+
return ip.split('.').reduce((acc, octet) => (acc << 8) | parseInt(octet, 10), 0) >>> 0;
|
|
23
|
+
}
|
|
24
|
+
function intToIpv4(n) {
|
|
25
|
+
return [(n >>> 24) & 0xff, (n >>> 16) & 0xff, (n >>> 8) & 0xff, n & 0xff].join('.');
|
|
26
|
+
}
|
|
27
|
+
function isRestrictedIPv4(ip) {
|
|
28
|
+
const int = ipv4ToInt(ip);
|
|
29
|
+
return RESTRICTED_CIDRS_V4.some(([network, mask]) => (int & mask) === network);
|
|
30
|
+
}
|
|
31
|
+
function isRestrictedIPv6(ip) {
|
|
32
|
+
const lower = ip.toLowerCase();
|
|
33
|
+
if (lower === '::1' || lower === '::')
|
|
34
|
+
return true;
|
|
35
|
+
if (lower.startsWith('fe8') || lower.startsWith('fe9') || lower.startsWith('fea') || lower.startsWith('feb')) {
|
|
36
|
+
return true;
|
|
37
|
+
}
|
|
38
|
+
if (lower.startsWith('fc') || lower.startsWith('fd'))
|
|
39
|
+
return true;
|
|
40
|
+
return false;
|
|
41
|
+
}
|
|
42
|
+
function normalizeHostname(hostname) {
|
|
43
|
+
const asInt = parseInt(hostname, 10);
|
|
44
|
+
if (asInt.toString() === hostname) {
|
|
45
|
+
const ip = intToIpv4(asInt);
|
|
46
|
+
return { ip, blocked: false };
|
|
47
|
+
}
|
|
48
|
+
if (/^[\d.x]+$/i.test(hostname) && !(0, net_1.isIPv4)(hostname)) {
|
|
49
|
+
return { ip: null, blocked: true };
|
|
50
|
+
}
|
|
51
|
+
return { ip: hostname, blocked: false };
|
|
52
|
+
}
|
|
53
|
+
function isRestrictedUrl(rawUrl) {
|
|
54
|
+
let parsed;
|
|
55
|
+
try {
|
|
56
|
+
parsed = new url_1.URL(rawUrl);
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
return true;
|
|
60
|
+
}
|
|
61
|
+
if (parsed.protocol !== 'http:' && parsed.protocol !== 'https:')
|
|
62
|
+
return true;
|
|
63
|
+
const hostname = parsed.hostname.replace(/^\[/, '').replace(/\]$/, '');
|
|
64
|
+
const { ip, blocked } = normalizeHostname(hostname);
|
|
65
|
+
if (blocked)
|
|
66
|
+
return true;
|
|
67
|
+
if (ip === null)
|
|
68
|
+
return true;
|
|
69
|
+
if ((0, net_1.isIPv4)(ip))
|
|
70
|
+
return isRestrictedIPv4(ip);
|
|
71
|
+
if ((0, net_1.isIPv6)(ip))
|
|
72
|
+
return isRestrictedIPv6(ip);
|
|
73
|
+
return false;
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=ssrf-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ssrf-utils.js","sourceRoot":"","sources":["../../../src/destinations/webhook/ssrf-utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
const actions_core_1 = require("@segment/actions-core");
|
|
4
|
+
const ssrf_utils_1 = require("../ssrf-utils");
|
|
4
5
|
const action = {
|
|
5
6
|
title: 'Send',
|
|
6
7
|
description: 'Send an HTTP request.',
|
|
@@ -45,6 +46,9 @@ const action = {
|
|
|
45
46
|
}
|
|
46
47
|
},
|
|
47
48
|
perform: (request, { payload }) => {
|
|
49
|
+
if ((0, ssrf_utils_1.isRestrictedUrl)(payload.url)) {
|
|
50
|
+
throw new actions_core_1.PayloadValidationError(`URL is not allowed: ${payload.url}`);
|
|
51
|
+
}
|
|
48
52
|
try {
|
|
49
53
|
let body;
|
|
50
54
|
let contentType = 'application/json';
|
|
@@ -67,8 +71,11 @@ const action = {
|
|
|
67
71
|
}
|
|
68
72
|
},
|
|
69
73
|
performBatch: (request, { payload }) => {
|
|
74
|
+
const { url, method, headers } = payload[0];
|
|
75
|
+
if ((0, ssrf_utils_1.isRestrictedUrl)(url)) {
|
|
76
|
+
throw new actions_core_1.PayloadValidationError(`URL is not allowed: ${url}`);
|
|
77
|
+
}
|
|
70
78
|
try {
|
|
71
|
-
const { url, method, headers } = payload[0];
|
|
72
79
|
return request(url, {
|
|
73
80
|
method: method,
|
|
74
81
|
headers: headers,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/destinations/webhook-extensible/send/index.ts"],"names":[],"mappings":";;AAAA,wDAAgF;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/destinations/webhook-extensible/send/index.ts"],"names":[],"mappings":";;AAAA,wDAAgF;AAGhF,8CAA+C;AAI/C,MAAM,MAAM,GAAwC;IAClD,KAAK,EAAE,MAAM;IACb,WAAW,EAAE,uBAAuB;IACpC,MAAM,EAAE;QACN,GAAG,EAAE;YACH,KAAK,EAAE,KAAK;YACZ,WAAW,EAAE,yBAAyB;YACtC,IAAI,EAAE,QAAQ;YACd,QAAQ,EAAE,IAAI;YACd,MAAM,EAAE,KAAK;SACd;QACD,MAAM,EAAE;YACN,KAAK,EAAE,QAAQ;YACf,WAAW,EAAE,qBAAqB;YAClC,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE;gBACP,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE;gBAChC,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE;gBAC9B,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE;aACnC;YACD,OAAO,EAAE,MAAM;YACf,QAAQ,EAAE,IAAI;SACf;QACD,UAAU,EAAE;YACV,KAAK,EAAE,YAAY;YACnB,WAAW,EAAE,qFAAqF;YAClG,IAAI,EAAE,QAAQ;YACd,QAAQ,EAAE,KAAK;YACf,OAAO,EAAE,CAAC;SACX;QACD,OAAO,EAAE;YACP,KAAK,EAAE,SAAS;YAChB,WAAW,EAAE,8EAA8E;YAC3F,IAAI,EAAE,QAAQ;YACd,eAAe,EAAE,eAAe;SACjC;QACD,IAAI,EAAE;YACJ,KAAK,EAAE,MAAM;YACb,WAAW,EAAE,mDAAmD;YAChE,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE;SAC3B;KACF;IACD,OAAO,EAAE,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;QAChC,IAAI,IAAA,4BAAe,EAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;YACjC,MAAM,IAAI,qCAAsB,CAAC,uBAAuB,OAAO,CAAC,GAAG,EAAE,CAAC,CAAA;QACxE,CAAC;QACD,IAAI,CAAC;YACH,IAAI,IAAI,CAAA;YACR,IAAI,WAAW,GAAG,kBAAkB,CAAA;YAEpC,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;gBACpB,WAAW,GAAI,OAAO,CAAC,OAAO,CAAC,cAAc,CAAY,IAAK,OAAO,CAAC,OAAO,CAAC,cAAc,CAAY,CAAA;YAC1G,CAAC;YAED,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;gBACjB,IAAI,GAAG,UAAU,CAAC,OAAO,CAAC,IAAI,EAAE,WAAW,CAAC,CAAA;YAC9C,CAAC;YAED,OAAO,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE;gBAC1B,MAAM,EAAE,OAAO,CAAC,MAAuB;gBACvC,OAAO,EAAE,OAAO,CAAC,OAAiC;gBAClD,GAAG,IAAI;aACR,CAAC,CAAA;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,SAAS;gBAAE,MAAM,IAAI,qCAAsB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;YAC/E,MAAM,KAAK,CAAA;QACb,CAAC;IACH,CAAC;IACD,YAAY,EAAE,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;QAErC,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC,CAAA;QAC3C,IAAI,IAAA,4BAAe,EAAC,GAAG,CAAC,EAAE,CAAC;YACzB,MAAM,IAAI,qCAAsB,CAAC,uBAAuB,GAAG,EAAE,CAAC,CAAA;QAChE,CAAC;QACD,IAAI,CAAC;YACH,OAAO,OAAO,CAAC,GAAG,EAAE;gBAClB,MAAM,EAAE,MAAuB;gBAC/B,OAAO,EAAE,OAAiC;gBAC1C,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE;oBAC7B,IAAI,WAAW,GAAG,kBAAkB,CAAA;oBAEpC,IAAI,OAAO,EAAE,CAAC;wBACZ,WAAW,GAAI,OAAO,CAAC,cAAc,CAAY,IAAK,OAAO,CAAC,cAAc,CAAY,CAAA;oBAC1F,CAAC;oBACD,IAAI,IAAI;wBAAE,OAAO,UAAU,CAAC,IAAI,EAAE,WAAW,CAAC,CAAA;oBAE9C,OAAO,IAAI,CAAA;gBACb,CAAC,CAAC;aACH,CAAC,CAAA;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,SAAS;gBAAE,MAAM,IAAI,qCAAsB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;YAC/E,MAAM,KAAK,CAAA;QACb,CAAC;IACH,CAAC;CACF,CAAA;AAED,MAAM,UAAU,GAAG,CAAC,OAA4B,EAAE,WAAmB,EAAE,EAAE;IACvE,IAAI,WAAW,KAAK,kBAAkB,EAAE,CAAC;QACvC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAA;IAC1B,CAAC;SAAM,IAAI,WAAW,KAAK,mCAAmC,EAAE,CAAC;QAC/D,MAAM,cAAc,GAAG,IAAI,eAAe,CAAC,OAAiC,CAAC,CAAC,QAAQ,EAAE,CAAA;QACxF,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,CAAA;IACjC,CAAC;SAAM,CAAC;QAEN,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAA;IAC1B,CAAC;AACH,CAAC,CAAA;AAED,kBAAe,MAAM,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function isRestrictedUrl(rawUrl: string): boolean;
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.isRestrictedUrl = isRestrictedUrl;
|
|
4
|
+
const net_1 = require("net");
|
|
5
|
+
const url_1 = require("url");
|
|
6
|
+
const RESTRICTED_CIDRS_V4 = [
|
|
7
|
+
[0x00000000, 0xff000000, '0.0.0.0/8'],
|
|
8
|
+
[0x0a000000, 0xff000000, '10.0.0.0/8'],
|
|
9
|
+
[0x64400000, 0xffc00000, '100.64.0.0/10'],
|
|
10
|
+
[0x7f000000, 0xff000000, '127.0.0.0/8'],
|
|
11
|
+
[0xa9fe0000, 0xffff0000, '169.254.0.0/16'],
|
|
12
|
+
[0xac100000, 0xfff00000, '172.16.0.0/12'],
|
|
13
|
+
[0xc0000000, 0xffffff00, '192.0.0.0/24'],
|
|
14
|
+
[0xc0000200, 0xffffff00, '192.0.2.0/24'],
|
|
15
|
+
[0xc0a80000, 0xffff0000, '192.168.0.0/16'],
|
|
16
|
+
[0xc6336400, 0xffffff00, '198.51.100.0/24'],
|
|
17
|
+
[0xcb007100, 0xffffff00, '203.0.113.0/24'],
|
|
18
|
+
[0xe0000000, 0xf0000000, '224.0.0.0/4'],
|
|
19
|
+
[0xf0000000, 0xf0000000, '240.0.0.0/4']
|
|
20
|
+
];
|
|
21
|
+
function ipv4ToInt(ip) {
|
|
22
|
+
return ip.split('.').reduce((acc, octet) => (acc << 8) | parseInt(octet, 10), 0) >>> 0;
|
|
23
|
+
}
|
|
24
|
+
function intToIpv4(n) {
|
|
25
|
+
return [(n >>> 24) & 0xff, (n >>> 16) & 0xff, (n >>> 8) & 0xff, n & 0xff].join('.');
|
|
26
|
+
}
|
|
27
|
+
function isRestrictedIPv4(ip) {
|
|
28
|
+
const int = ipv4ToInt(ip);
|
|
29
|
+
return RESTRICTED_CIDRS_V4.some(([network, mask]) => (int & mask) === network);
|
|
30
|
+
}
|
|
31
|
+
function isRestrictedIPv6(ip) {
|
|
32
|
+
const lower = ip.toLowerCase();
|
|
33
|
+
if (lower === '::1' || lower === '::')
|
|
34
|
+
return true;
|
|
35
|
+
if (lower.startsWith('fe8') || lower.startsWith('fe9') || lower.startsWith('fea') || lower.startsWith('feb')) {
|
|
36
|
+
return true;
|
|
37
|
+
}
|
|
38
|
+
if (lower.startsWith('fc') || lower.startsWith('fd'))
|
|
39
|
+
return true;
|
|
40
|
+
return false;
|
|
41
|
+
}
|
|
42
|
+
function normalizeHostname(hostname) {
|
|
43
|
+
const asInt = parseInt(hostname, 10);
|
|
44
|
+
if (asInt.toString() === hostname) {
|
|
45
|
+
const ip = intToIpv4(asInt);
|
|
46
|
+
return { ip, blocked: false };
|
|
47
|
+
}
|
|
48
|
+
if (/^[\d.x]+$/i.test(hostname) && !(0, net_1.isIPv4)(hostname)) {
|
|
49
|
+
return { ip: null, blocked: true };
|
|
50
|
+
}
|
|
51
|
+
return { ip: hostname, blocked: false };
|
|
52
|
+
}
|
|
53
|
+
function isRestrictedUrl(rawUrl) {
|
|
54
|
+
let parsed;
|
|
55
|
+
try {
|
|
56
|
+
parsed = new url_1.URL(rawUrl);
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
return true;
|
|
60
|
+
}
|
|
61
|
+
if (parsed.protocol !== 'http:' && parsed.protocol !== 'https:')
|
|
62
|
+
return true;
|
|
63
|
+
const hostname = parsed.hostname.replace(/^\[/, '').replace(/\]$/, '');
|
|
64
|
+
const { ip, blocked } = normalizeHostname(hostname);
|
|
65
|
+
if (blocked)
|
|
66
|
+
return true;
|
|
67
|
+
if (ip === null)
|
|
68
|
+
return true;
|
|
69
|
+
if ((0, net_1.isIPv4)(ip))
|
|
70
|
+
return isRestrictedIPv4(ip);
|
|
71
|
+
if ((0, net_1.isIPv6)(ip))
|
|
72
|
+
return isRestrictedIPv6(ip);
|
|
73
|
+
return false;
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=ssrf-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ssrf-utils.js","sourceRoot":"","sources":["../../../src/destinations/webhook-extensible/ssrf-utils.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@segment/action-destinations",
|
|
3
3
|
"description": "Destination Actions engine and definitions.",
|
|
4
|
-
"version": "3.490.1-staging-
|
|
4
|
+
"version": "3.490.1-staging-046ffc7a3.0",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
7
7
|
"url": "https://github.com/segmentio/action-destinations",
|
|
@@ -47,8 +47,8 @@
|
|
|
47
47
|
"@aws-sdk/client-sts": "^3.894.0",
|
|
48
48
|
"@bufbuild/protobuf": "^2.2.3",
|
|
49
49
|
"@segment/a1-notation": "^2.1.4",
|
|
50
|
-
"@segment/actions-core": "3.167.1-staging-
|
|
51
|
-
"@segment/actions-shared": "1.152.1-staging-
|
|
50
|
+
"@segment/actions-core": "3.167.1-staging-046ffc7a3.0",
|
|
51
|
+
"@segment/actions-shared": "1.152.1-staging-046ffc7a3.0",
|
|
52
52
|
"@types/node": "^22.13.1",
|
|
53
53
|
"ajv-formats": "^2.1.1",
|
|
54
54
|
"aws4": "^1.12.0",
|
|
@@ -92,5 +92,5 @@
|
|
|
92
92
|
"__tests__/__helpers__/"
|
|
93
93
|
]
|
|
94
94
|
},
|
|
95
|
-
"gitHead": "
|
|
95
|
+
"gitHead": "d8cd3b559f858c9473430fcd1f711affacdcbc99"
|
|
96
96
|
}
|