@n8n/n8n-nodes-langchain
Version:

195 lines • 8.38 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.createCustomRegexCheckFn = exports.createPiiCheckFn = exports.PII_NAME_MAP = exports.PIIEntity = void 0;
const common_1 = require("../../helpers/common");
var PIIEntity;
(function (PIIEntity) {
PIIEntity["CREDIT_CARD"] = "CREDIT_CARD";
PIIEntity["CRYPTO"] = "CRYPTO";
PIIEntity["DATE_TIME"] = "DATE_TIME";
PIIEntity["EMAIL_ADDRESS"] = "EMAIL_ADDRESS";
PIIEntity["IBAN_CODE"] = "IBAN_CODE";
PIIEntity["IP_ADDRESS"] = "IP_ADDRESS";
PIIEntity["LOCATION"] = "LOCATION";
PIIEntity["PHONE_NUMBER"] = "PHONE_NUMBER";
PIIEntity["MEDICAL_LICENSE"] = "MEDICAL_LICENSE";
PIIEntity["US_BANK_NUMBER"] = "US_BANK_NUMBER";
PIIEntity["US_DRIVER_LICENSE"] = "US_DRIVER_LICENSE";
PIIEntity["US_ITIN"] = "US_ITIN";
PIIEntity["US_PASSPORT"] = "US_PASSPORT";
PIIEntity["US_SSN"] = "US_SSN";
PIIEntity["UK_NHS"] = "UK_NHS";
PIIEntity["UK_NINO"] = "UK_NINO";
PIIEntity["ES_NIF"] = "ES_NIF";
PIIEntity["ES_NIE"] = "ES_NIE";
PIIEntity["IT_FISCAL_CODE"] = "IT_FISCAL_CODE";
PIIEntity["IT_DRIVER_LICENSE"] = "IT_DRIVER_LICENSE";
PIIEntity["IT_VAT_CODE"] = "IT_VAT_CODE";
PIIEntity["IT_PASSPORT"] = "IT_PASSPORT";
PIIEntity["IT_IDENTITY_CARD"] = "IT_IDENTITY_CARD";
PIIEntity["PL_PESEL"] = "PL_PESEL";
PIIEntity["SG_NRIC_FIN"] = "SG_NRIC_FIN";
PIIEntity["SG_UEN"] = "SG_UEN";
PIIEntity["AU_ABN"] = "AU_ABN";
PIIEntity["AU_ACN"] = "AU_ACN";
PIIEntity["AU_TFN"] = "AU_TFN";
PIIEntity["AU_MEDICARE"] = "AU_MEDICARE";
PIIEntity["IN_PAN"] = "IN_PAN";
PIIEntity["IN_AADHAAR"] = "IN_AADHAAR";
PIIEntity["IN_VEHICLE_REGISTRATION"] = "IN_VEHICLE_REGISTRATION";
PIIEntity["IN_VOTER"] = "IN_VOTER";
PIIEntity["IN_PASSPORT"] = "IN_PASSPORT";
PIIEntity["FI_PERSONAL_IDENTITY_CODE"] = "FI_PERSONAL_IDENTITY_CODE";
})(PIIEntity || (exports.PIIEntity = PIIEntity = {}));
const allEntities = Object.values(PIIEntity);
exports.PII_NAME_MAP = {
[PIIEntity.CREDIT_CARD]: 'Credit Card',
[PIIEntity.CRYPTO]: 'Crypto',
[PIIEntity.DATE_TIME]: 'Date Time',
[PIIEntity.EMAIL_ADDRESS]: 'Email Address',
[PIIEntity.IBAN_CODE]: 'IBAN Code',
[PIIEntity.IP_ADDRESS]: 'IP Address',
[PIIEntity.LOCATION]: 'Location',
[PIIEntity.PHONE_NUMBER]: 'Phone Number',
[PIIEntity.MEDICAL_LICENSE]: 'Medical License',
[PIIEntity.US_BANK_NUMBER]: 'US Bank Number',
[PIIEntity.US_DRIVER_LICENSE]: 'US Driver License',
[PIIEntity.US_ITIN]: 'US ITIN',
[PIIEntity.US_PASSPORT]: 'US Passport',
[PIIEntity.US_SSN]: 'US SSN',
[PIIEntity.UK_NHS]: 'UK NHS',
[PIIEntity.UK_NINO]: 'UK NINO',
[PIIEntity.ES_NIF]: 'ES NIF',
[PIIEntity.ES_NIE]: 'ES NIE',
[PIIEntity.IT_FISCAL_CODE]: 'IT Fiscal Code',
[PIIEntity.IT_DRIVER_LICENSE]: 'IT Driver License',
[PIIEntity.IT_VAT_CODE]: 'IT VAT Code',
[PIIEntity.IT_PASSPORT]: 'IT Passport',
[PIIEntity.IT_IDENTITY_CARD]: 'IT Identity Card',
[PIIEntity.PL_PESEL]: 'PL PESEL',
[PIIEntity.SG_NRIC_FIN]: 'SG NRIC FIN',
[PIIEntity.SG_UEN]: 'SG UEN',
[PIIEntity.AU_ABN]: 'AU ABN',
[PIIEntity.AU_ACN]: 'AU ACN',
[PIIEntity.AU_TFN]: 'AU TFN',
[PIIEntity.AU_MEDICARE]: 'AU Medicare',
[PIIEntity.IN_PAN]: 'IN PAN',
[PIIEntity.IN_AADHAAR]: 'IN AADHAAR',
[PIIEntity.IN_VEHICLE_REGISTRATION]: 'IN Vehicle Registration',
[PIIEntity.IN_VOTER]: 'IN Voter',
[PIIEntity.IN_PASSPORT]: 'IN Passport',
[PIIEntity.FI_PERSONAL_IDENTITY_CODE]: 'FI Personal Identity Code',
};
const DEFAULT_PII_PATTERNS = {
[PIIEntity.CREDIT_CARD]: /\b\d{4}[-\s]?\d{4}[-\s]?\d{4}[-\s]?\d{4}\b/g,
[PIIEntity.CRYPTO]: /\b[13][a-km-zA-HJ-NP-Z1-9]{25,34}\b/g,
[PIIEntity.DATE_TIME]: /\b(0[1-9]|1[0-2])[\/\-](0[1-9]|[12]\d|3[01])[\/\-](19|20)\d{2}\b/g,
[PIIEntity.EMAIL_ADDRESS]: /\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b/g,
[PIIEntity.IBAN_CODE]: /\b[A-Z]{2}[0-9]{2}[A-Z0-9]{4}[0-9]{7}([A-Z0-9]?){0,16}\b/g,
[PIIEntity.IP_ADDRESS]: /\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\b/g,
[PIIEntity.LOCATION]: /\b[A-Za-z\s]+(?:Street|St|Avenue|Ave|Road|Rd|Boulevard|Blvd|Drive|Dr|Lane|Ln|Place|Pl|Court|Ct|Way|Highway|Hwy)\b/g,
[PIIEntity.PHONE_NUMBER]: /\b[\+]?[(]?[0-9]{3}[)]?[-\s\.]?[0-9]{3}[-\s\.]?[0-9]{4,6}\b/g,
[PIIEntity.MEDICAL_LICENSE]: /\b[A-Z]{2}\d{6}\b/g,
[PIIEntity.US_BANK_NUMBER]: /\b\d{8,17}\b/g,
[PIIEntity.US_DRIVER_LICENSE]: /\b[A-Z]\d{7}\b/g,
[PIIEntity.US_ITIN]: /\b9\d{2}-\d{2}-\d{4}\b/g,
[PIIEntity.US_PASSPORT]: /\b[A-Z]\d{8}\b/g,
[PIIEntity.US_SSN]: /\b\d{3}-\d{2}-\d{4}\b|\b\d{9}\b/g,
[PIIEntity.UK_NHS]: /\b\d{3} \d{3} \d{4}\b/g,
[PIIEntity.UK_NINO]: /\b[A-Z]{2}\d{6}[A-Z]\b/g,
[PIIEntity.ES_NIF]: /\b[A-Z]\d{8}\b/g,
[PIIEntity.ES_NIE]: /\b[A-Z]\d{8}\b/g,
[PIIEntity.IT_FISCAL_CODE]: /\b[A-Z]{6}\d{2}[A-Z]\d{2}[A-Z]\d{3}[A-Z]\b/g,
[PIIEntity.IT_DRIVER_LICENSE]: /\b[A-Z]{2}\d{7}\b/g,
[PIIEntity.IT_VAT_CODE]: /\bIT\d{11}\b/g,
[PIIEntity.IT_PASSPORT]: /\b[A-Z]{2}\d{7}\b/g,
[PIIEntity.IT_IDENTITY_CARD]: /\b[A-Z]{2}\d{7}\b/g,
[PIIEntity.PL_PESEL]: /\b\d{11}\b/g,
[PIIEntity.SG_NRIC_FIN]: /\b[A-Z]\d{7}[A-Z]\b/g,
[PIIEntity.SG_UEN]: /\b\d{8}[A-Z]\b|\b\d{9}[A-Z]\b/g,
[PIIEntity.AU_ABN]: /\b\d{2} \d{3} \d{3} \d{3}\b/g,
[PIIEntity.AU_ACN]: /\b\d{3} \d{3} \d{3}\b/g,
[PIIEntity.AU_TFN]: /\b\d{9}\b/g,
[PIIEntity.AU_MEDICARE]: /\b\d{4} \d{5} \d{1}\b/g,
[PIIEntity.IN_PAN]: /\b[A-Z]{5}\d{4}[A-Z]\b/g,
[PIIEntity.IN_AADHAAR]: /\b\d{4} \d{4} \d{4}\b/g,
[PIIEntity.IN_VEHICLE_REGISTRATION]: /\b[A-Z]{2}\d{2}[A-Z]{2}\d{4}\b/g,
[PIIEntity.IN_VOTER]: /\b[A-Z]{3}\d{7}\b/g,
[PIIEntity.IN_PASSPORT]: /\b[A-Z]\d{7}\b/g,
[PIIEntity.FI_PERSONAL_IDENTITY_CODE]: /\b\d{6}[+-A]\d{3}[A-Z0-9]\b/g,
};
function detectPii(text, config) {
if (!text) {
return {
mapping: {},
analyzerResults: [],
};
}
const grouped = {};
const analyzerResults = [];
const matchAgainstPattern = (name, pattern) => {
const flags = pattern.flags.includes('g') ? pattern.flags : pattern.flags + 'g';
const regex = new RegExp(pattern.source, flags);
let match;
while ((match = regex.exec(text)) !== null) {
const entityType = name;
const start = match.index;
const end = match.index + match[0].length;
if (!grouped[entityType]) {
grouped[entityType] = [];
}
grouped[entityType].push(text.substring(start, end));
analyzerResults.push({
entityType,
text: text.substring(start, end),
});
}
};
const entities = config.entities ?? allEntities;
for (const entity of entities) {
const pattern = DEFAULT_PII_PATTERNS[entity];
if (pattern) {
matchAgainstPattern(entity, pattern);
}
}
if (config.customRegex?.length) {
for (const regex of config.customRegex) {
matchAgainstPattern(regex.name, (0, common_1.parseRegex)(regex.value));
}
}
return {
mapping: grouped,
analyzerResults,
};
}
const createPiiCheckFn = (config) => {
return (input) => {
const detection = detectPii(input, config);
const piiFound = detection.mapping && Object.keys(detection.mapping).length > 0;
return {
guardrailName: 'personalData',
tripwireTriggered: piiFound,
info: {
maskEntities: detection.mapping,
analyzerResults: detection.analyzerResults,
},
};
};
};
exports.createPiiCheckFn = createPiiCheckFn;
const createCustomRegexCheckFn = (config) => {
return (input) => {
const detection = detectPii(input, { customRegex: config.customRegex, entities: [] });
const customRegexFound = detection.mapping && Object.keys(detection.mapping).length > 0;
return {
guardrailName: 'customRegex',
tripwireTriggered: customRegexFound,
info: {
maskEntities: detection.mapping,
analyzerResults: detection.analyzerResults,
},
};
};
};
exports.createCustomRegexCheckFn = createCustomRegexCheckFn;
//# sourceMappingURL=pii.js.map