diff --git a/server/config/default.yaml b/server/config/default.yaml index 621c5fb8..14b07bf9 100644 --- a/server/config/default.yaml +++ b/server/config/default.yaml @@ -55,6 +55,10 @@ enabledLanguages: # Inject custom scripts in subscription/layout.mjml.hbs # customSubscriptionScripts: [/custom/hello-world.js] +# Customize the random string generation for cid +cid: + alphabet: 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ' + length: 10 # Enable to use Redis session cache or disable if Redis is not installed redis: diff --git a/server/lib/message-sender.js b/server/lib/message-sender.js index 33ffa398..ec4e6091 100644 --- a/server/lib/message-sender.js +++ b/server/lib/message-sender.js @@ -24,7 +24,7 @@ const blacklist = require('../models/blacklist'); const libmime = require('libmime'); const { enforce, hashEmail } = require('./helpers'); const senders = require('./senders'); -const shortid = require('shortid'); +const shortid = require('./shortid'); const MessageType = { REGULAR: 0, diff --git a/server/lib/shortid.js b/server/lib/shortid.js new file mode 100644 index 00000000..e206e40e --- /dev/null +++ b/server/lib/shortid.js @@ -0,0 +1,27 @@ +"use strict"; + +// Modules +const nanoid = require('nanoid'); +const config = require('./config'); + +// Default hardcoded values +let alphabet = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; +let customlength = 10; + +// Gets from config if defined +if (config.cid && config.cid.alphabet) alphabet=config.cid.alphabet; +if (config.cid && config.cid.length) customlength=config.cid.length; + +// Create custom nanoid +const customnanoid = nanoid.customAlphabet(alphabet, customlength); + +const re = new RegExp('['+alphabet+']{'+customlength+'}'); + +// Implements the public methods of shortid module with nanoid and export them +module.exports.generate = function() { + return customnanoid(); +} + +module.exports.isValid = function(id) { + return re.test(id); +} diff --git a/server/models/campaigns.js b/server/models/campaigns.js index 31eef5c1..d5e11ed0 100644 --- a/server/models/campaigns.js +++ b/server/models/campaigns.js @@ -4,7 +4,7 @@ const knex = require('../lib/knex'); const hasher = require('node-object-hash')(); const dtHelpers = require('../lib/dt-helpers'); const interoperableErrors = require('../../shared/interoperable-errors'); -const shortid = require('shortid'); +const shortid = require('../lib/shortid'); const { enforce, filterObject } = require('../lib/helpers'); const shares = require('./shares'); const namespaceHelpers = require('../lib/namespace-helpers'); @@ -1163,4 +1163,4 @@ module.exports.getStatisticsOpened = getStatisticsOpened; module.exports.fetchRssCampaign = fetchRssCampaign; module.exports.testSend = testSend; -module.exports.getRssPreview = getRssPreview; \ No newline at end of file +module.exports.getRssPreview = getRssPreview; diff --git a/server/models/channels.js b/server/models/channels.js index cae992ca..75151090 100644 --- a/server/models/channels.js +++ b/server/models/channels.js @@ -4,7 +4,7 @@ const knex = require('../lib/knex'); const hasher = require('node-object-hash')(); const dtHelpers = require('../lib/dt-helpers'); const interoperableErrors = require('../../shared/interoperable-errors'); -const shortid = require('shortid'); +const shortid = require('../lib/shortid'); const { enforce, filterObject } = require('../lib/helpers'); const shares = require('./shares'); const namespaceHelpers = require('../lib/namespace-helpers'); diff --git a/server/models/confirmations.js b/server/models/confirmations.js index f14dfd38..efba2a26 100644 --- a/server/models/confirmations.js +++ b/server/models/confirmations.js @@ -1,7 +1,7 @@ 'use strict'; const knex = require('../lib/knex'); -const shortid = require('shortid'); +const shortid = require('../lib/shortid'); async function addConfirmation(listId, action, ip, data) { const cid = shortid.generate(); diff --git a/server/models/fields.js b/server/models/fields.js index 2f7148eb..7cd1be8b 100644 --- a/server/models/fields.js +++ b/server/models/fields.js @@ -7,7 +7,7 @@ const dtHelpers = require('../lib/dt-helpers'); const interoperableErrors = require('../../shared/interoperable-errors'); const shares = require('./shares'); const validators = require('../../shared/validators'); -const shortid = require('shortid'); +const shortid = require('../lib/shortid'); const slugify = require('slugify'); const segments = require('./segments'); const { formatDate, formatBirthday, parseDate, parseBirthday } = require('../../shared/date'); diff --git a/server/models/links.js b/server/models/links.js index b0e217a8..7914b34b 100644 --- a/server/models/links.js +++ b/server/models/links.js @@ -10,7 +10,7 @@ const uaParser = require('device'); const he = require('he'); const { getPublicUrl } = require('../lib/urls'); const tools = require('../lib/tools'); -const shortid = require('shortid'); +const shortid = require('../lib/shortid'); const {enforce} = require('../lib/helpers'); const LinkId = { diff --git a/server/models/lists.js b/server/models/lists.js index 078ca49f..ada16cf8 100644 --- a/server/models/lists.js +++ b/server/models/lists.js @@ -3,7 +3,7 @@ const knex = require('../lib/knex'); const hasher = require('node-object-hash')(); const dtHelpers = require('../lib/dt-helpers'); -const shortid = require('shortid'); +const shortid = require('../lib/shortid'); const { enforce, filterObject } = require('../lib/helpers'); const interoperableErrors = require('../../shared/interoperable-errors'); const shares = require('./shares'); diff --git a/server/models/send-configurations.js b/server/models/send-configurations.js index 0b7b77fb..890c0d38 100644 --- a/server/models/send-configurations.js +++ b/server/models/send-configurations.js @@ -3,7 +3,7 @@ const knex = require('../lib/knex'); const hasher = require('node-object-hash')(); const dtHelpers = require('../lib/dt-helpers'); -const shortid = require('shortid'); +const shortid = require('../lib/shortid'); const { enforce, filterObject } = require('../lib/helpers'); const interoperableErrors = require('../../shared/interoperable-errors'); const shares = require('./shares'); diff --git a/server/models/subscriptions.js b/server/models/subscriptions.js index 57f36f97..82efd052 100644 --- a/server/models/subscriptions.js +++ b/server/models/subscriptions.js @@ -3,7 +3,7 @@ const config = require('../lib/config'); const knex = require('../lib/knex'); const hasher = require('node-object-hash')(); -const shortid = require('shortid'); +const shortid = require('../lib/shortid'); const dtHelpers = require('../lib/dt-helpers'); const interoperableErrors = require('../../shared/interoperable-errors'); const shares = require('./shares'); diff --git a/server/package-lock.json b/server/package-lock.json index 5989d0f3..de12ae85 100644 --- a/server/package-lock.json +++ b/server/package-lock.json @@ -5038,9 +5038,9 @@ "optional": true }, "nanoid": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-2.1.7.tgz", - "integrity": "sha512-fmS3qwDldm4bE01HCIRqNk+f255CNjnAoeV3Zzzv0KemObHKqYgirVaZA9DtKcjogicWjYcHkJs4D5A8CjnuVQ==" + "version": "3.1.12", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.12.tgz", + "integrity": "sha512-1qstj9z5+x491jfiC4Nelk+f8XBad7LN20PmyWINJEMRSf3wcAjAWysw1qaA8z6NSKe2sjq1hRSDpBH5paCb6A==" }, "nanomatch": { "version": "1.2.13", @@ -12744,14 +12744,6 @@ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" }, - "shortid": { - "version": "2.2.15", - "resolved": "https://registry.npmjs.org/shortid/-/shortid-2.2.15.tgz", - "integrity": "sha512-5EaCy2mx2Jgc/Fdn9uuDuNIIfWBpzY4XIlhoqtXF6qsf+/+SGZ+FxDdX/ZsMZiWupIWNqAEmiNY4RC+LSmCeOw==", - "requires": { - "nanoid": "^2.1.0" - } - }, "sigmund": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", diff --git a/server/package.json b/server/package.json index cb07dcce..3a028206 100644 --- a/server/package.json +++ b/server/package.json @@ -91,6 +91,7 @@ "morgan": "^1.9.1", "multer": "^1.4.2", "mysql": "^2.17.1", + "nanoid": "^3.1.12", "node-ipc": "^9.1.1", "node-mocks-http": "^1.8.1", "node-object-hash": "^1.4.1", @@ -105,7 +106,6 @@ "request": "^2.88.0", "request-promise": "^4.2.5", "serve-favicon": "^2.5.0", - "shortid": "^2.2.15", "slugify": "^1.3.6", "smtp-server": "^3.4.7", "tmp-promise": "^1.1.0", diff --git a/server/setup/knex/fixes/fix-20190726150000_shorten_field_column_names.js b/server/setup/knex/fixes/fix-20190726150000_shorten_field_column_names.js index d83a1937..725138e2 100644 --- a/server/setup/knex/fixes/fix-20190726150000_shorten_field_column_names.js +++ b/server/setup/knex/fixes/fix-20190726150000_shorten_field_column_names.js @@ -2,7 +2,7 @@ const config = require('../config'); const knex = require('../../../lib/knex'); -const shortid = require('shortid'); +const shortid = require('../../../lib/shortid'); const slugify = require('slugify'); async function run() { @@ -66,4 +66,4 @@ async function run() { process.exit(); } -run().catch(err => console.error(err)); \ No newline at end of file +run().catch(err => console.error(err)); diff --git a/server/setup/knex/migrations/20170506102634_v1_to_v2.js b/server/setup/knex/migrations/20170506102634_v1_to_v2.js index f698e4d3..a4199677 100644 --- a/server/setup/knex/migrations/20170506102634_v1_to_v2.js +++ b/server/setup/knex/migrations/20170506102634_v1_to_v2.js @@ -11,7 +11,7 @@ const { EntityVals: TriggerEntityVals, EventVals: TriggerEventVals } = require(' const { SubscriptionSource } = require('../../../../shared/lists'); const {DOMParser, XMLSerializer} = require('xmldom'); const log = require('../../../lib/log'); -const shortid = require('shortid'); +const shortid = require('../../../lib/shortid'); const slugify = require('slugify'); const entityTypesAddNamespace = ['list', 'custom_form', 'template', 'campaign', 'report', 'report_template', 'user']; diff --git a/server/test/e2e/tests/subscription.js b/server/test/e2e/tests/subscription.js index 62509d07..66e51a3a 100644 --- a/server/test/e2e/tests/subscription.js +++ b/server/test/e2e/tests/subscription.js @@ -4,7 +4,7 @@ const config = require('../lib/config'); const { useCase, step, precondition, driver } = require('../lib/mocha-e2e'); -const shortid = require('shortid'); +const shortid = require('../lib/shortid'); const expect = require('chai').expect; const createPage = require('../page-objects/subscription'); const faker = require('faker');