Various fixes.

This commit is contained in:
Tomas Bures 2019-07-23 21:16:55 +05:30
parent 4e4b77ca84
commit 02360be75b
20 changed files with 3137 additions and 3124 deletions

1705
client/package-lock.json generated

File diff suppressed because it is too large Load diff

View file

@ -20,16 +20,16 @@
"license": "GPL-3.0", "license": "GPL-3.0",
"homepage": "https://mailtrain.org/", "homepage": "https://mailtrain.org/",
"dependencies": { "dependencies": {
"@coreui/coreui": "^2.1.4", "@coreui/coreui": "^2.1.12",
"@fortawesome/fontawesome-free": "^5.6.3", "@fortawesome/fontawesome-free": "^5.9.0",
"axios": "^0.18.0", "axios": "^0.18.1",
"bootstrap": "^4.2.1", "bootstrap": "^4.2.1",
"clone": "^2.1.2", "clone": "^2.1.2",
"datatables.net": "^1.10.19", "datatables.net": "^1.10.19",
"datatables.net-bs4": "^1.10.19", "datatables.net-bs4": "^1.10.19",
"ellipsize": "^0.1.0", "ellipsize": "^0.1.0",
"fast-deep-equal": "^2.0.1", "fast-deep-equal": "^2.0.1",
"grapesjs": "^0.14.49", "grapesjs": "^0.14.62",
"grapesjs-mjml": "0.0.31", "grapesjs-mjml": "0.0.31",
"grapesjs-preset-newsletter": "^0.2.20", "grapesjs-preset-newsletter": "^0.2.20",
"htmlparser2": "^3.10.1", "htmlparser2": "^3.10.1",
@ -37,51 +37,51 @@
"i18next-browser-languagedetector": "^2.2.4", "i18next-browser-languagedetector": "^2.2.4",
"immutable": "^4.0.0-rc.12", "immutable": "^4.0.0-rc.12",
"juice": "^5.2.0", "juice": "^5.2.0",
"lodash": "^4.17.11", "lodash": "^4.17.15",
"mjml4-in-browser": "^1.1.1", "mjml4-in-browser": "^1.1.2",
"moment": "^2.23.0", "moment": "^2.23.0",
"moment-timezone": "^0.5.25", "moment-timezone": "^0.5.26",
"popper.js": "^1.14.6", "popper.js": "^1.14.6",
"prop-types": "^15.6.2", "prop-types": "^15.6.2",
"querystringify": "^2.1.0", "querystringify": "^2.1.0",
"react": "^16.7.0", "react": "^16.7.0",
"react-ace": "^6.3.2", "react-ace": "^6.6.0",
"react-ckeditor-component": "^1.1.0", "react-ckeditor-component": "^1.1.0",
"react-color": "^2.17.0", "react-color": "^2.17.3",
"react-day-picker": "^7.2.4", "react-day-picker": "^7.2.4",
"react-dnd": "^7.0.2", "react-dnd": "^7.7.0",
"react-dnd-html5-backend": "^7.0.2", "react-dnd-html5-backend": "^7.7.0",
"react-dnd-touch-backend": "^0.7.1", "react-dnd-touch-backend": "^0.7.1",
"react-dom": "^16.7.0", "react-dom": "^16.7.0",
"react-dropzone": "^8.0.3", "react-dropzone": "^8.0.3",
"react-google-charts": "^3.0.10", "react-google-charts": "^3.0.14",
"react-i18next": "^9.0.1", "react-i18next": "^9.0.1",
"react-router-dom": "^4.3.1", "react-router-dom": "^4.3.1",
"react-sortable-tree": "^2.6.0", "react-sortable-tree": "^2.6.0",
"shallowequal": "^1.1.0", "shallowequal": "^1.1.0",
"shortid": "^2.2.14", "shortid": "^2.2.14",
"slugify": "^1.3.4", "slugify": "^1.3.4",
"url-parse": "^1.4.4" "url-parse": "^1.4.7"
}, },
"devDependencies": { "devDependencies": {
"@babel/cli": "^7.2.3", "@babel/cli": "^7.5.5",
"@babel/core": "^7.2.2", "@babel/core": "^7.5.5",
"@babel/plugin-proposal-class-properties": "^7.2.3", "@babel/plugin-proposal-class-properties": "^7.5.5",
"@babel/plugin-proposal-decorators": "^7.2.3", "@babel/plugin-proposal-decorators": "^7.4.4",
"@babel/plugin-proposal-function-bind": "^7.2.0", "@babel/plugin-proposal-function-bind": "^7.2.0",
"@babel/preset-env": "^7.2.3", "@babel/preset-env": "^7.5.5",
"@babel/preset-react": "^7.0.0", "@babel/preset-react": "^7.0.0",
"babel-loader": "^8.0.4", "babel-loader": "^8.0.6",
"clean-css-cli": "^4.2.1", "clean-css-cli": "^4.2.1",
"css-loader": "^2.1.0", "css-loader": "^2.1.0",
"file-loader": "^3.0.1", "file-loader": "^3.0.1",
"node-sass": "^4.11.0", "node-sass": "^4.12.0",
"nodemon": "^1.18.9", "nodemon": "^1.19.1",
"npm-run-all": "^4.1.5", "npm-run-all": "^4.1.5",
"sass-loader": "^7.1.0", "sass-loader": "^7.1.0",
"style-loader": "^0.23.1", "style-loader": "^0.23.1",
"url-loader": "^1.1.2", "url-loader": "^1.1.2",
"webpack": "^4.28.3", "webpack": "^4.36.1",
"webpack-cli": "^3.2.0" "webpack-cli": "^3.3.6"
} }
} }

View file

@ -121,21 +121,20 @@ export default class CUD extends Component {
onFormChangeBeforeValidation(mutStateData, key, oldValue, newValue) { onFormChangeBeforeValidation(mutStateData, key, oldValue, newValue) {
let match; let match;
if (key === undefined || key === 'data_sourceCustom_type') { if (key === 'data_sourceCustom_type') {
if (newValue) { if (newValue) {
this.templateTypes[newValue].afterTypeChange(mutStateData); this.templateTypes[newValue].afterTypeChange(mutStateData);
} }
} }
if (key === undefined || key === 'data_sourceCustom_tag_language') { if (key === 'data_sourceCustom_tag_language') {
if (newValue) { if (newValue) {
const isEdit = !!this.props.entity; const isEdit = !!this.props.entity;
const type = mutStateData.getIn(['data_sourceCustom_tag_language', 'value']); this.templateTypes[newValue].afterTagLanguageChange(mutStateData, isEdit);
this.templateTypes[type].afterTagLanguageChange(mutStateData, isEdit);
} }
} }
if (key === undefined || (match = key.match(/^(lists_[0-9]+_)list$/))) { if (key && (match = key.match(/^(lists_[0-9]+_)list$/))) {
const prefix = match[1]; const prefix = match[1];
mutStateData.setIn([prefix + 'segment', 'value'], null); mutStateData.setIn([prefix + 'segment', 'value'], null);
} }

View file

@ -1052,34 +1052,38 @@ const withForm = createComponentMixin([], [], (TargetClass, InnerClass) => {
axios.post(getUrl(settings.serverValidation.url), payload) axios.post(getUrl(settings.serverValidation.url), payload)
.then(response => { .then(response => {
self.setState(previousState => ({ if (self.isComponentMounted()) {
formState: previousState.formState.withMutations(mutState => { self.setState(previousState => ({
mutState.set('isServerValidationRunning', false); formState: previousState.formState.withMutations(mutState => {
mutState.set('isServerValidationRunning', false);
mutState.update('data', stateData => stateData.withMutations(mutStateData => { mutState.update('data', stateData => stateData.withMutations(mutStateData => {
for (const attr in payload) { for (const attr in payload) {
mutStateData.setIn([attr, 'serverValue'], payload[attr]); mutStateData.setIn([attr, 'serverValue'], payload[attr]);
if (payload[attr] === mutState.getIn(['data', attr, 'value'])) { if (payload[attr] === mutState.getIn(['data', attr, 'value'])) {
mutStateData.setIn([attr, 'serverValidated'], true); mutStateData.setIn([attr, 'serverValidated'], true);
mutStateData.setIn([attr, 'serverValidation'], response.data[attr] || true); mutStateData.setIn([attr, 'serverValidation'], response.data[attr] || true);
}
} }
} }));
})); })
}) }));
}));
scheduleValidateForm(self); scheduleValidateForm(self);
}
}) })
.catch(error => { .catch(error => {
console.log('Error in "validateFormState": ' + error); if (self.isComponentMounted()) {
console.log('Error in "validateFormState": ' + error);
self.setState(previousState => ({ self.setState(previousState => ({
formState: previousState.formState.set('isServerValidationRunning', false) formState: previousState.formState.set('isServerValidationRunning', false)
})); }));
// TODO: It might be good not to give up immediatelly, but retry a couple of times // TODO: It might be good not to give up immediatelly, but retry a couple of times
// scheduleValidateForm(self); // scheduleValidateForm(self);
}
}); });
} else { } else {
if (formValidateResolve) { if (formValidateResolve) {
@ -1097,6 +1101,26 @@ const withForm = createComponentMixin([], [], (TargetClass, InnerClass) => {
} }
} }
const previousComponentDidMount = proto.componentDidMount;
proto.componentDidMount = function() {
this._isComponentMounted = true;
if (previousComponentDidMount) {
previousComponentDidMount.apply(this);
}
};
const previousComponentWillUnmount = proto.componentWillUnmount;
proto.componentWillUnmount = function() {
this._isComponentMounted = false;
if (previousComponentWillUnmount) {
previousComponentDidMount.apply(this);
}
};
proto.isComponentMounted = function() {
return !!this._isComponentMounted;
}
proto.initForm = function(settings) { proto.initForm = function(settings) {
const state = this.state || {}; const state = this.state || {};
state.formState = cleanFormState; state.formState = cleanFormState;

View file

@ -108,7 +108,8 @@ const entityTypeLabels = {
'sendConfiguration': t => t('sendConfiguration'), 'sendConfiguration': t => t('sendConfiguration'),
'report': t => t('report'), 'report': t => t('report'),
'reportTemplate': t => t('reportTemplate'), 'reportTemplate': t => t('reportTemplate'),
'mosaicoTemplate': t => t('mosaicoTemplate') 'mosaicoTemplate': t => t('mosaicoTemplate'),
'user': t => t('User')
}; };
function _getDependencyErrorMessage(err, t, name) { function _getDependencyErrorMessage(err, t, name) {

View file

@ -37,6 +37,7 @@ const TableSelectMode = {
class Table extends Component { class Table extends Component {
constructor(props) { constructor(props) {
super(props); super(props);
this.mounted = false;
this.selectionMap = this.getSelectionMap(props); this.selectionMap = this.getSelectionMap(props);
} }
@ -184,6 +185,8 @@ class Table extends Component {
} }
componentDidMount() { componentDidMount() {
this.mounted = true;
const columns = this.props.columns.slice(); const columns = this.props.columns.slice();
// XSS protection and actions rendering // XSS protection and actions rendering
@ -364,12 +367,13 @@ class Table extends Component {
} }
componentWillUnmount() { componentWillUnmount() {
this.mounted = false;
clearInterval(this.refreshIntervalId); clearInterval(this.refreshIntervalId);
clearTimeout(this.refreshTimeoutId); clearTimeout(this.refreshTimeoutId);
} }
async notifySelection(eventCallback, newSelectionMap) { async notifySelection(eventCallback, newSelectionMap) {
if (eventCallback) { if (this.mounted && eventCallback) {
const selPairs = Array.from(newSelectionMap).sort((l, r) => l[0] - r[0]); const selPairs = Array.from(newSelectionMap).sort((l, r) => l[0] - r[0]);
let data = selPairs.map(entry => entry[1]); let data = selPairs.map(entry => entry[1]);

View file

@ -33,7 +33,7 @@ class TreeTable extends Component {
constructor(props) { constructor(props) {
super(props); super(props);
this.isComponentMounted = false; this.mounted = false;
this.state = { this.state = {
treeData: [] treeData: []
@ -52,9 +52,9 @@ class TreeTable extends Component {
} }
refresh() { refresh() {
if (this.tree) { if (this.tree && !this.props.data && this.props.dataUrl) {
this.tree.reload(this.sanitizeTreeData(this.state.treeData)); // noinspection JSIgnoredPromiseFromCall
this.updateSelection(); this.loadData();
} }
} }
@ -70,7 +70,7 @@ class TreeTable extends Component {
} }
} }
if (this.isComponentMounted) { if (this.mounted) {
this.setState({ this.setState({
treeData treeData
}); });
@ -113,7 +113,7 @@ class TreeTable extends Component {
} }
componentDidMount() { componentDidMount() {
this.isComponentMounted = true; this.mounted = true;
if (!this.props.data && this.props.dataUrl) { if (!this.props.data && this.props.dataUrl) {
// noinspection JSIgnoredPromiseFromCall // noinspection JSIgnoredPromiseFromCall
@ -228,7 +228,7 @@ class TreeTable extends Component {
} }
componentWillUnmount() { componentWillUnmount() {
this.isComponentMounted = false; this.mounted = false;
} }
updateSelection() { updateSelection() {

View file

@ -71,7 +71,8 @@ export default class CUD extends Component {
email: '', email: '',
password: '', password: '',
password2: '', password2: '',
namespace: mailtrainConfig.user.namespace namespace: mailtrainConfig.user.namespace,
role: null
}); });
} }
} }

View file

@ -31,7 +31,13 @@ async function ensureNoDependencies(tx, context, id, depSpecs) {
break; break;
} }
if (await shares.checkEntityPermissionTx(tx, context, depSpec.entityTypeId, row.id, 'view')) { if (depSpec.viewPermission && await shares.checkEntityPermissionTx(tx, context, depSpec.viewPermission.entityTypeId, depSpec.viewPermission.entityId, depSpec.viewPermission.requiredOperations)) {
deps.push({
entityTypeId: depSpec.entityTypeId,
name: row.name,
link: entityType.clientLink(row.id)
});
} else if (await shares.checkEntityPermissionTx(tx, context, depSpec.entityTypeId, row.id, 'view')) {
deps.push({ deps.push({
entityTypeId: depSpec.entityTypeId, entityTypeId: depSpec.entityTypeId,
name: row.name, name: row.name,

View file

@ -219,7 +219,7 @@ async function getDefaultCustomFormValues() {
// TODO - this could run in the browser too - move to shared // TODO - this could run in the browser too - move to shared
function checkForMjmlErrors(form) { function checkForMjmlErrors(form) {
let testLayout = '<mjml><mj-body><mj-container>{{{body}}}</mj-container></mj-body></mjml>'; let testLayout = '<mjml><mj-body>{{{body}}}</mj-body></mjml>';
let hasMjmlError = (template, layout = testLayout) => { let hasMjmlError = (template, layout = testLayout) => {
let source = layout.replace(/\{\{\{body\}\}\}/g, template); let source = layout.replace(/\{\{\{body\}\}\}/g, template);

View file

@ -226,7 +226,16 @@ async function remove(context, id) {
await shares.enforceEntityPermissionTx(tx, context, 'namespace', id, 'delete'); await shares.enforceEntityPermissionTx(tx, context, 'namespace', id, 'delete');
const entityTypesWithNamespace = Object.keys(entitySettings.getEntityTypes()); const entityTypesWithNamespace = Object.keys(entitySettings.getEntityTypes());
await dependencyHelpers.ensureNoDependencies(tx, context, id, entityTypesWithNamespace.map(entityTypeId => ({ entityTypeId: entityTypeId, column: 'namespace' })));
const depSpecs = entityTypesWithNamespace.map(entityTypeId => {
if (entityTypeId === 'user') {
return { entityTypeId: entityTypeId, column: 'namespace', viewPermission: {entityTypeId: 'namespace', entityId: id, requiredOperations: 'manageUsers'} };
} else {
return { entityTypeId: entityTypeId, column: 'namespace' };
}
});
await dependencyHelpers.ensureNoDependencies(tx, context, id, depSpecs);
await tx('namespaces').where('id', id).del(); await tx('namespaces').where('id', id).del();
}); });

2493
server/package-lock.json generated

File diff suppressed because it is too large Load diff

View file

@ -26,13 +26,13 @@
"node": ">=10.0.0" "node": ">=10.0.0"
}, },
"devDependencies": { "devDependencies": {
"babel-eslint": "^10.0.1", "babel-eslint": "^10.0.2",
"chai": "^4.2.0", "chai": "^4.2.0",
"eslint-config-nodemailer": "^1.2.0", "eslint-config-nodemailer": "^1.2.0",
"grunt": "^1.0.3", "grunt": "^1.0.3",
"grunt-cli": "^1.3.2", "grunt-cli": "^1.3.2",
"grunt-eslint": "^21.0.0", "grunt-eslint": "^21.1.0",
"lodash": "^4.17.11", "lodash": "^4.17.15",
"mocha": "^5.2.0", "mocha": "^5.2.0",
"phantomjs-prebuilt": "^2.1.16", "phantomjs-prebuilt": "^2.1.16",
"selenium-webdriver": "^3.6.0", "selenium-webdriver": "^3.6.0",
@ -42,31 +42,31 @@
"posix": "^4.1.2" "posix": "^4.1.2"
}, },
"dependencies": { "dependencies": {
"aws-sdk": "^2.440.0", "aws-sdk": "^2.497.0",
"bcrypt-nodejs": "0.0.3", "bcrypt-nodejs": "0.0.3",
"bluebird": "^3.5.3", "bluebird": "^3.5.5",
"body-parser": "^1.18.3", "body-parser": "^1.19.0",
"bounce-handler": "7.3.2-fork.3", "bounce-handler": "7.3.2-fork.3",
"capitalize": "^2.0.0", "capitalize": "^2.0.0",
"compression": "^1.7.3", "compression": "^1.7.3",
"config": "^3.0.1", "config": "^3.2.2",
"connect-flash": "^0.1.1", "connect-flash": "^0.1.1",
"connect-redis": "^3.4.0", "connect-redis": "^3.4.2",
"cookie-parser": "^1.4.3", "cookie-parser": "^1.4.3",
"cors": "^2.8.5", "cors": "^2.8.5",
"crypto": "^1.0.1", "crypto": "^1.0.1",
"csurf": "^1.9.0", "csurf": "^1.10.0",
"csv-parse": "^4.4.1", "csv-parse": "^4.4.3",
"csv-stringify": "^5.1.2", "csv-stringify": "^5.1.2",
"device": "^0.3.9", "device": "^0.3.9",
"dompurify": "^1.0.8", "dompurify": "^1.0.11",
"escape-html": "^1.0.3", "escape-html": "^1.0.3",
"escape-string-regexp": "^1.0.5", "escape-string-regexp": "^1.0.5",
"express": "^4.16.4", "express": "^4.17.1",
"express-locale": "^1.0.5", "express-locale": "^1.0.5",
"express-session": "^1.15.6", "express-session": "^1.16.2",
"faker": "^4.1.0", "faker": "^4.1.0",
"feedparser-promised": "^2.0.0", "feedparser-promised": "^2.0.1",
"fs-extra": "^7.0.1", "fs-extra": "^7.0.1",
"fs-extra-promise": "^1.0.1", "fs-extra-promise": "^1.0.1",
"geoip-ultralight": "^0.1.5", "geoip-ultralight": "^0.1.5",
@ -82,23 +82,23 @@
"juice": "^5.2.0", "juice": "^5.2.0",
"klaw-sync": "^6.0.0", "klaw-sync": "^6.0.0",
"knex": "^0.16.5", "knex": "^0.16.5",
"libmime": "^4.0.1", "libmime": "^4.1.3",
"mailparser": "^2.4.3", "mailparser": "^2.7.1",
"memory-cache": "^0.2.0", "memory-cache": "^0.2.0",
"mjml": "^4.3.0", "mjml": "^4.4.0",
"moment": "^2.23.0", "moment": "^2.23.0",
"moment-timezone": "^0.5.25", "moment-timezone": "^0.5.26",
"morgan": "^1.9.1", "morgan": "^1.9.1",
"multer": "^1.4.1", "multer": "^1.4.2",
"mysql": "^2.17.1", "mysql": "^2.17.1",
"node-ipc": "^9.1.1", "node-ipc": "^9.1.1",
"node-mocks-http": "^1.7.3", "node-mocks-http": "^1.7.6",
"node-object-hash": "^1.4.1", "node-object-hash": "^1.4.1",
"nodeify": "^1.0.1", "nodeify": "^1.0.1",
"nodemailer": "^5.0.0", "nodemailer": "^5.0.0",
"nodemailer-openpgp": "^1.2.0", "nodemailer-openpgp": "^1.2.0",
"npmlog": "^4.1.2", "npmlog": "^4.1.2",
"openpgp": "^4.4.3", "openpgp": "^4.5.5",
"passport": "^0.4.0", "passport": "^0.4.0",
"passport-local": "^1.0.0", "passport-local": "^1.0.0",
"premailer-api": "^1.0.4", "premailer-api": "^1.0.4",
@ -108,7 +108,7 @@
"shortid": "^2.2.14", "shortid": "^2.2.14",
"slugify": "^1.3.4", "slugify": "^1.3.4",
"smtp-server": "^3.4.7", "smtp-server": "^3.4.7",
"tmp-promise": "^1.0.5", "tmp-promise": "^1.1.0",
"toml": "^2.3.3", "toml": "^2.3.3",
"try-require": "^1.2.1", "try-require": "^1.2.1",
"xmldom": "^0.1.27" "xmldom": "^0.1.27"

View file

@ -78,7 +78,7 @@ async function migrateBase(knex) {
// The original Mailtrain migration is executed before this one. So here we check whether the original migration // The original Mailtrain migration is executed before this one. So here we check whether the original migration
// ended where it should have and we take it from there. // ended where it should have and we take it from there.
const row = await knex('settings').where({key: 'db_schema_version'}).first('value'); const row = await knex('settings').where({key: 'db_schema_version'}).first('value');
if (!row || Number(row.value) !== 33) { if (!row || Number(row.value) !== 34) {
throw new Error('Unsupported DB schema version: ' + row.value); throw new Error('Unsupported DB schema version: ' + row.value);
} }

View file

@ -1,6 +1,14 @@
exports.up = (knex, Promise) => (async() => { exports.up = (knex, Promise) => (async() => {
// This is to provide upgrade path to stable to those that already have beta installed. // This is to provide upgrade path to stable to those that already have beta installed.
await knex.schema.raw('ALTER TABLE `custom_fields` ADD COLUMN `help` text AFTER `name`'); try {
await knex.schema.raw('ALTER TABLE `custom_fields` ADD COLUMN `help` text AFTER `name`');
} catch (err) {
if (err.code === 'ER_DUP_FIELDNAME') {
// The field is already there, so we can ignore this error
} else {
throw err;
}
}
})(); })();
exports.down = (knex, Promise) => (async() => { exports.down = (knex, Promise) => (async() => {

View file

@ -13,50 +13,47 @@
<mj-class name="footer-text" font-size="12px" line-height="18px" color="#999999" /> <mj-class name="footer-text" font-size="12px" line-height="18px" color="#999999" />
</mj-attributes> </mj-attributes>
</mj-head> </mj-head>
<mj-body> <mj-body width="560px" background-color="#ffffff">
<mj-container width="560" background-color="#ffffff"> <mj-raw>
{{#if isWeb}}
<style>
{{{formInputStyle}}}
.alert { max-width: 520px; font-family: Lato, Helvetica, Arial, sans-serif; }
</style>
{{/if}}
</mj-raw>
<mj-raw> <mj-section padding-bottom="0">
{{#if isWeb}} <mj-column>
<style> <mj-text mj-class="h1">
{{{formInputStyle}}} {{title}}
.alert { max-width: 520px; font-family: Lato, Helvetica, Arial, sans-serif; } </mj-text>
</style> <mj-divider mj-class="hr"/>
{{/if}} </mj-column>
</mj-raw> </mj-section>
<mj-section padding-bottom="0"> <mj-raw>
<mj-column> {{#if isWeb}}
<mj-text mj-class="h1"> {{> subscription_flash_messages}}
{{title}} {{/if}}
</mj-text> </mj-raw>
<mj-divider mj-class="hr"/>
</mj-column>
</mj-section>
<mj-raw> {{{body}}}
{{#if isWeb}}
{{> subscription_flash_messages}}
{{/if}}
</mj-raw>
{{{body}}} <mj-section padding-top="0">
<mj-column>
<mj-text mj-class="small" font-style="italic">
<!-- POST ADDRESS -->
</mj-text>
</mj-column>
</mj-section>
<mj-section padding-top="0"> <mj-raw>
<mj-column> {{#if isWeb}}
<mj-text mj-class="small" font-style="italic"> <!-- fixes https://github.com/mjmlio/mjml/issues/359 -->
<!-- POST ADDRESS --> {{> subscription_footer_scripts btnBgColor='#2D3E4F' btnBgColorHover='#1A242F'}}
</mj-text> {{/if}}
</mj-column> </mj-raw>
</mj-section>
<mj-raw>
{{#if isWeb}}
<!-- fixes https://github.com/mjmlio/mjml/issues/359 -->
{{> subscription_footer_scripts btnBgColor='#2D3E4F' btnBgColorHover='#1A242F'}}
{{/if}}
</mj-raw>
</mj-container>
</mj-body> </mj-body>
</mjml> </mjml>

1493
shared/package-lock.json generated

File diff suppressed because it is too large Load diff

View file

@ -13,26 +13,26 @@
}, },
"dependencies": { "dependencies": {
"moment": "^2.23.0", "moment": "^2.23.0",
"moment-timezone": "^0.5.25", "moment-timezone": "^0.5.26",
"owasp-password-strength-test": "github:bures/owasp-password-strength-test" "owasp-password-strength-test": "github:bures/owasp-password-strength-test"
}, },
"devDependencies": { "devDependencies": {
"@babel/cli": "^7.2.3", "@babel/cli": "^7.5.5",
"@babel/core": "^7.2.2", "@babel/core": "^7.5.5",
"@babel/plugin-proposal-class-properties": "^7.2.3", "@babel/plugin-proposal-class-properties": "^7.5.5",
"@babel/plugin-proposal-decorators": "^7.2.3", "@babel/plugin-proposal-decorators": "^7.4.4",
"@babel/plugin-proposal-function-bind": "^7.2.0", "@babel/plugin-proposal-function-bind": "^7.2.0",
"@babel/preset-env": "^7.2.3", "@babel/preset-env": "^7.5.5",
"@babel/preset-react": "^7.0.0", "@babel/preset-react": "^7.0.0",
"babel-loader": "^8.0.4", "babel-loader": "^8.0.6",
"css-loader": "^2.1.0", "css-loader": "^2.1.0",
"file-loader": "^3.0.1", "file-loader": "^3.0.1",
"node-sass": "^4.11.0", "node-sass": "^4.12.0",
"postcss-loader": "^3.0.0", "postcss-loader": "^3.0.0",
"sass-loader": "^7.1.0", "sass-loader": "^7.1.0",
"style-loader": "^0.23.1", "style-loader": "^0.23.1",
"url-loader": "^1.1.2", "url-loader": "^1.1.2",
"webpack": "^4.28.3", "webpack": "^4.36.1",
"webpack-cli": "^3.2.0" "webpack-cli": "^3.3.6"
} }
} }

View file

@ -5,9 +5,9 @@
"requires": true, "requires": true,
"dependencies": { "dependencies": {
"ajv": { "ajv": {
"version": "6.10.0", "version": "6.10.2",
"resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz",
"integrity": "sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==", "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==",
"requires": { "requires": {
"fast-deep-equal": "^2.0.1", "fast-deep-equal": "^2.0.1",
"fast-json-stable-stringify": "^2.0.0", "fast-json-stable-stringify": "^2.0.0",
@ -61,11 +61,11 @@
"integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU="
}, },
"async": { "async": {
"version": "2.6.2", "version": "2.6.3",
"resolved": "https://registry.npmjs.org/async/-/async-2.6.2.tgz", "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz",
"integrity": "sha512-H1qVYh1MYhEEFLsP97cVKqCGo7KfCyTt6uEWqsTBr9SO84oK9Uwbyd/yCW+6rKJLHksBNUVWZDAjfS+Ccx0Bbg==", "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==",
"requires": { "requires": {
"lodash": "^4.17.11" "lodash": "^4.17.14"
} }
}, },
"asynckit": { "asynckit": {
@ -151,9 +151,9 @@
"integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw="
}, },
"cluster-key-slot": { "cluster-key-slot": {
"version": "1.0.12", "version": "1.1.0",
"resolved": "https://registry.npmjs.org/cluster-key-slot/-/cluster-key-slot-1.0.12.tgz", "resolved": "https://registry.npmjs.org/cluster-key-slot/-/cluster-key-slot-1.1.0.tgz",
"integrity": "sha512-21O0kGmvED5OJ7ZTdqQ5lQQ+sjuez33R+d35jZKLwqUb5mqcPHUsxOSzj61+LHVtxGZd1kShbQM3MjB/gBJkVg==" "integrity": "sha512-2Nii8p3RwAPiFwsnZvukotvow2rIHM+yQ6ZcBXGHdniadkYGZYiGmkHJIbZPIV9nfv7m/U1IPMVVcAhoWFeklw=="
}, },
"code-point-at": { "code-point-at": {
"version": "1.1.0", "version": "1.1.0",
@ -161,9 +161,9 @@
"integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c="
}, },
"combined-stream": { "combined-stream": {
"version": "1.0.7", "version": "1.0.8",
"resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
"integrity": "sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
"requires": { "requires": {
"delayed-stream": "~1.0.0" "delayed-stream": "~1.0.0"
} }
@ -263,12 +263,12 @@
"integrity": "sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==" "integrity": "sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw=="
}, },
"dnscache": { "dnscache": {
"version": "1.0.1", "version": "1.0.2",
"resolved": "https://registry.npmjs.org/dnscache/-/dnscache-1.0.1.tgz", "resolved": "https://registry.npmjs.org/dnscache/-/dnscache-1.0.2.tgz",
"integrity": "sha1-Qssrm/tej736OVqsdOEn/AUHTTE=", "integrity": "sha512-2FFKzmLGOnD+Y378bRKH+gTjRMuSpH7OKgPy31KjjfCoKZx7tU8Dmqfd/3fhG2d/4bppuN8/KtWMUZBAcUCRnQ==",
"requires": { "requires": {
"asap": "~2.0.3", "asap": "^2.0.6",
"lodash.clone": "~4.3.2" "lodash.clone": "^4.5.0"
} }
}, },
"double-ended-queue": { "double-ended-queue": {
@ -360,11 +360,6 @@
"semver-store": "^0.3.0" "semver-store": "^0.3.0"
} }
}, },
"flexbuffer": {
"version": "0.0.6",
"resolved": "https://registry.npmjs.org/flexbuffer/-/flexbuffer-0.0.6.tgz",
"integrity": "sha1-A5/fI/iCPkQMOPMnfm/vEXQhWzA="
},
"forever-agent": { "forever-agent": {
"version": "0.6.1", "version": "0.6.1",
"resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
@ -507,25 +502,31 @@
} }
}, },
"inherits": { "inherits": {
"version": "2.0.3", "version": "2.0.4",
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
"integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
}, },
"ioredis": { "ioredis": {
"version": "4.9.0", "version": "4.10.0",
"resolved": "https://registry.npmjs.org/ioredis/-/ioredis-4.9.0.tgz", "resolved": "https://registry.npmjs.org/ioredis/-/ioredis-4.10.0.tgz",
"integrity": "sha512-YzfCLsN++Ct43QqGK9CWxaEK6OUvJ7rnENieAPNw3DVp/oF2uBrP2NJChbhO74Ng3LWA+i5zdIEUsZYr6dKDIQ==", "integrity": "sha512-bAdt/sKdOvUyKhjLJ8HKFmO6ZQ+OHHmfFgWn9X/ecsp1lJNnOtmh/Xl2+AdKwUdSkl/Rrw1CKOkR8+Kv8tRinQ==",
"requires": { "requires": {
"cluster-key-slot": "^1.0.6", "cluster-key-slot": "^1.0.6",
"debug": "^3.1.0", "debug": "^3.1.0",
"denque": "^1.1.0", "denque": "^1.1.0",
"flexbuffer": "0.0.6",
"lodash.defaults": "^4.2.0", "lodash.defaults": "^4.2.0",
"lodash.flatten": "^4.4.0", "lodash.flatten": "^4.4.0",
"redis-commands": "1.4.0", "redis-commands": "1.5.0",
"redis-errors": "^1.2.0", "redis-errors": "^1.2.0",
"redis-parser": "^3.0.0", "redis-parser": "^3.0.0",
"standard-as-callback": "^2.0.1" "standard-as-callback": "^2.0.1"
},
"dependencies": {
"redis-commands": {
"version": "1.5.0",
"resolved": "https://registry.npmjs.org/redis-commands/-/redis-commands-1.5.0.tgz",
"integrity": "sha512-6KxamqpZ468MeQC3bkWmCB1fp56XL64D4Kf0zJSwDZbVLLm7KFkoIcHrgRvQ+sk8dnhySs7+yBg94yIkAK7aJg=="
}
} }
}, },
"ipaddr.js": { "ipaddr.js": {
@ -570,9 +571,9 @@
"integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo="
}, },
"js-yaml": { "js-yaml": {
"version": "3.13.0", "version": "3.13.1",
"resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.0.tgz", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz",
"integrity": "sha512-pZZoSxcCYco+DIKBTimr67J6Hy+EYGZDY/HCWC+iAEA9h1ByhMXAIVUXMcMFpOCxQ/xjXmPI2MkDL5HRm5eFrQ==", "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==",
"requires": { "requires": {
"argparse": "^1.0.7", "argparse": "^1.0.7",
"esprima": "^4.0.0" "esprima": "^4.0.0"
@ -615,23 +616,13 @@
"integrity": "sha512-ULQZAATVGTAgVNwP61R+MbbSGNBy1tVzWupB9kbE6p+VccWd+J+ICXgOwQic5Yqagzpu+oPZ8sI7yXdWJnPPkA==" "integrity": "sha512-ULQZAATVGTAgVNwP61R+MbbSGNBy1tVzWupB9kbE6p+VccWd+J+ICXgOwQic5Yqagzpu+oPZ8sI7yXdWJnPPkA=="
}, },
"libmime": { "libmime": {
"version": "4.0.1", "version": "4.1.3",
"resolved": "https://registry.npmjs.org/libmime/-/libmime-4.0.1.tgz", "resolved": "https://registry.npmjs.org/libmime/-/libmime-4.1.3.tgz",
"integrity": "sha512-mGgJLRkpkMxZZYE7ncVXokgKfi5ePrIB1H3W/Bv3GbkVnFydIHTsPrfAVW0edxalQHmFfqDMU9W45PidCLG6DA==", "integrity": "sha512-vCEJD6jfrqf5yLhI9ZmB3NqrefZIr9e/uKQ2eL/U21wMqGDqOyka/NVpW5q93QFoD+gKgDrnoxLd8Ch1/9Mu2g==",
"requires": { "requires": {
"iconv-lite": "0.4.23", "iconv-lite": "0.4.24",
"libbase64": "1.0.3", "libbase64": "1.0.3",
"libqp": "1.1.0" "libqp": "1.1.0"
},
"dependencies": {
"iconv-lite": {
"version": "0.4.23",
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz",
"integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==",
"requires": {
"safer-buffer": ">= 2.1.2 < 3"
}
}
} }
}, },
"libqp": { "libqp": {
@ -640,22 +631,14 @@
"integrity": "sha1-9ebgatdLeU+1tbZpiL9yjvHe2+g=" "integrity": "sha1-9ebgatdLeU+1tbZpiL9yjvHe2+g="
}, },
"lodash": { "lodash": {
"version": "4.17.11", "version": "4.17.15",
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz",
"integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==" "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A=="
},
"lodash._baseclone": {
"version": "4.5.7",
"resolved": "https://registry.npmjs.org/lodash._baseclone/-/lodash._baseclone-4.5.7.tgz",
"integrity": "sha1-zkKt4IOE711i+nfDD2GkbmhvhDQ="
}, },
"lodash.clone": { "lodash.clone": {
"version": "4.3.2", "version": "4.5.0",
"resolved": "https://registry.npmjs.org/lodash.clone/-/lodash.clone-4.3.2.tgz", "resolved": "https://registry.npmjs.org/lodash.clone/-/lodash.clone-4.5.0.tgz",
"integrity": "sha1-5WsXa2gjp93jj38r9Y3n1ZcSAOk=", "integrity": "sha1-GVhwRQ9aExkkeN9Lw9I9LeoZB7Y="
"requires": {
"lodash._baseclone": "~4.5.0"
}
}, },
"lodash.defaults": { "lodash.defaults": {
"version": "4.2.0", "version": "4.2.0",
@ -682,13 +665,25 @@
} }
}, },
"mailsplit": { "mailsplit": {
"version": "4.3.1", "version": "4.4.1",
"resolved": "https://registry.npmjs.org/mailsplit/-/mailsplit-4.3.1.tgz", "resolved": "https://registry.npmjs.org/mailsplit/-/mailsplit-4.4.1.tgz",
"integrity": "sha512-+zzQekjkbUop6Yh/GrQCjWNNHuI4u2bBZ/Azbvm6NE407ZK9m99tDLP0o88T/HjngKKXFCvAcNXk+k73bc31OA==", "integrity": "sha512-AmWLEHQAg/zbNb1MdrPQS9VOzysHaU9IuoQV9kGU5fgjM5RCbgqVkZzp0+DhPep8sj8iHfbWkl16Nb1PbNlTYg==",
"requires": { "requires": {
"libbase64": "1.0.3", "libbase64": "1.0.3",
"libmime": "4.0.1", "libmime": "4.1.1",
"libqp": "1.1.0" "libqp": "1.1.0"
},
"dependencies": {
"libmime": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/libmime/-/libmime-4.1.1.tgz",
"integrity": "sha512-HkOfBSj+l7pBOOucEgiI6PdbgHa8ljv+1rARzW743HQ51UP8gabMlcA2wAF3Dg1aeuMjHZ+LzAPYxM52IZsyGA==",
"requires": {
"iconv-lite": "0.4.24",
"libbase64": "1.0.3",
"libqp": "1.1.0"
}
}
} }
}, },
"memory-pager": { "memory-pager": {
@ -703,16 +698,16 @@
"integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="
}, },
"mime-db": { "mime-db": {
"version": "1.38.0", "version": "1.40.0",
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.38.0.tgz", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz",
"integrity": "sha512-bqVioMFFzc2awcdJZIzR3HjZFX20QhilVS7hytkKrv7xFAn8bM1gzc/FOX2awLISvWe0PV8ptFKcon+wZ5qYkg==" "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA=="
}, },
"mime-types": { "mime-types": {
"version": "2.1.22", "version": "2.1.24",
"resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.22.tgz", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz",
"integrity": "sha512-aGl6TZGnhm/li6F7yx82bJiBZwgiEa4Hf6CNr8YO+r5UHr53tSTYZb102zyU50DOWWKeOv0uQLRL0/9EiKWCog==", "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==",
"requires": { "requires": {
"mime-db": "~1.38.0" "mime-db": "1.40.0"
} }
}, },
"minimalistic-assert": { "minimalistic-assert": {
@ -757,18 +752,18 @@
"optional": true "optional": true
}, },
"mongodb": { "mongodb": {
"version": "3.2.2", "version": "3.2.7",
"resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.2.2.tgz", "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.2.7.tgz",
"integrity": "sha512-xQ6apOOV+w7VFApdaJpWhYhzartpjIDFQjG0AwgJkLh7dBs7PTsq4A3Bia2QWpDohmAzTBIdQVLMqqLy0mwt3Q==", "integrity": "sha512-2YdWrdf1PJgxcCrT1tWoL6nHuk6hCxhddAAaEh8QJL231ci4+P9FLyqopbTm2Z2sAU6mhCri+wd9r1hOcHdoMw==",
"requires": { "requires": {
"mongodb-core": "3.2.2", "mongodb-core": "3.2.7",
"safe-buffer": "^5.1.2" "safe-buffer": "^5.1.2"
} }
}, },
"mongodb-core": { "mongodb-core": {
"version": "3.2.2", "version": "3.2.7",
"resolved": "https://registry.npmjs.org/mongodb-core/-/mongodb-core-3.2.2.tgz", "resolved": "https://registry.npmjs.org/mongodb-core/-/mongodb-core-3.2.7.tgz",
"integrity": "sha512-YRgC39MuzKL0uoGoRdTmV1e9m47NbMnYmuEx4IOkgWAGXPSEzRY7cwb3N0XMmrDMnD9vp7MysNyAriIIeGgIQg==", "integrity": "sha512-WypKdLxFNPOH/Jy6i9z47IjG2wIldA54iDZBmHMINcgKOUcWJh8og+Wix76oGd7EyYkHJKssQ2FAOw5Su/n4XQ==",
"requires": { "requires": {
"bson": "^1.1.1", "bson": "^1.1.1",
"require_optional": "^1.0.1", "require_optional": "^1.0.1",
@ -777,9 +772,9 @@
} }
}, },
"ms": { "ms": {
"version": "2.1.1", "version": "2.1.2",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
"integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
}, },
"msgpack-js": { "msgpack-js": {
"version": "0.3.0", "version": "0.3.0",
@ -809,9 +804,9 @@
} }
}, },
"nan": { "nan": {
"version": "2.13.2", "version": "2.14.0",
"resolved": "https://registry.npmjs.org/nan/-/nan-2.13.2.tgz", "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz",
"integrity": "sha512-TghvYc72wlMGMVMluVo9WRJc0mB8KxxF/gZ4YYFy7V2ZQX9l7rgbPg7vjS9mt6U5HXODVFVI2bOduCzwOMv/lw==", "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==",
"optional": true "optional": true
}, },
"ncp": { "ncp": {
@ -821,14 +816,14 @@
"optional": true "optional": true
}, },
"negotiator": { "negotiator": {
"version": "0.6.1", "version": "0.6.2",
"resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz",
"integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=" "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw=="
}, },
"nodemailer": { "nodemailer": {
"version": "6.0.0", "version": "6.2.1",
"resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.0.0.tgz", "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.2.1.tgz",
"integrity": "sha512-PMQJyLhoNAMoBU1hEh5aaUkpa/tcDNwzS7s7zow/myKfoEoZewMxUuWZqQ5yjYsAnvE484KSkYH5s6iPvcjhCg==" "integrity": "sha512-TagB7iuIi9uyNgHExo8lUDq3VK5/B0BpbkcjIgNvxbtVrjNqq0DwAOTuzALPVkK76kMhTSzIgHqg8X1uklVs6g=="
}, },
"npmlog": { "npmlog": {
"version": "4.1.2", "version": "4.1.2",
@ -890,14 +885,14 @@
"integrity": "sha512-zA2SmoLaxZyArQTOPj5LXecR+RagfPSU5Kw1qP+jkWeNlrq+eJZyY2oS68SU1Z/7/myXM4lo9716laOFAVStCQ==" "integrity": "sha512-zA2SmoLaxZyArQTOPj5LXecR+RagfPSU5Kw1qP+jkWeNlrq+eJZyY2oS68SU1Z/7/myXM4lo9716laOFAVStCQ=="
}, },
"process-nextick-args": { "process-nextick-args": {
"version": "2.0.0", "version": "2.0.1",
"resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
"integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
}, },
"prom-client": { "prom-client": {
"version": "11.3.0", "version": "11.5.1",
"resolved": "https://registry.npmjs.org/prom-client/-/prom-client-11.3.0.tgz", "resolved": "https://registry.npmjs.org/prom-client/-/prom-client-11.5.1.tgz",
"integrity": "sha512-OqSf5WOvpGZXkfqPXUHNHpjrbEE/q8jxjktO0i7zg1cnULAtf0ET67/J5R4e4iA4MZx2260tzTzSFSWgMdTZmQ==", "integrity": "sha512-AcFuxVgzoA/4nlpeg9SkM2HkDjNU3V7g2LCLwpudXSbcSLiFpRMVfsCoCY5RYeR/d9jkQng1mCmVKj1mPHvP0Q==",
"requires": { "requires": {
"tdigest": "^0.1.1" "tdigest": "^0.1.1"
} }
@ -908,9 +903,9 @@
"integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM="
}, },
"psl": { "psl": {
"version": "1.1.31", "version": "1.2.0",
"resolved": "https://registry.npmjs.org/psl/-/psl-1.1.31.tgz", "resolved": "https://registry.npmjs.org/psl/-/psl-1.2.0.tgz",
"integrity": "sha512-/6pt4+C+T+wZUieKR620OpzN/LlnNKuWjy1iFLQ/UG35JqHlR/89MP1d96dUfkf6Dne3TuLQzOYEYshJ+Hx8mw==" "integrity": "sha512-GEn74ZffufCmkDDLNcl3uuyF/aSD6exEyh1v/ZSdAomB82t6G9hzJVRx0jBmLDW+VfZqks3aScmMw9DszwUalA=="
}, },
"punycode": { "punycode": {
"version": "2.1.1", "version": "2.1.1",
@ -934,6 +929,13 @@
"safe-buffer": "~5.1.1", "safe-buffer": "~5.1.1",
"string_decoder": "~1.1.1", "string_decoder": "~1.1.1",
"util-deprecate": "~1.0.1" "util-deprecate": "~1.0.1"
},
"dependencies": {
"safe-buffer": {
"version": "5.1.2",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
"integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
}
} }
}, },
"redis": { "redis": {
@ -1067,9 +1069,9 @@
} }
}, },
"safe-buffer": { "safe-buffer": {
"version": "5.1.2", "version": "5.2.0",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz",
"integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg=="
}, },
"safe-json-stringify": { "safe-json-stringify": {
"version": "1.2.0", "version": "1.2.0",
@ -1091,9 +1093,9 @@
"integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
}, },
"saslprep": { "saslprep": {
"version": "1.0.2", "version": "1.0.3",
"resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.2.tgz", "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz",
"integrity": "sha512-4cDsYuAjXssUSjxHKRe4DTZC0agDwsCqcMqtJAQPzC74nJ7LfAJflAtC1Zed5hMzEQKj82d3tuzqdGNRsLJ4Gw==", "integrity": "sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==",
"optional": true, "optional": true,
"requires": { "requires": {
"sparse-bitfield": "^3.0.3" "sparse-bitfield": "^3.0.3"
@ -1264,6 +1266,13 @@
"integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
"requires": { "requires": {
"safe-buffer": "~5.1.0" "safe-buffer": "~5.1.0"
},
"dependencies": {
"safe-buffer": {
"version": "5.1.2",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
"integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
}
} }
}, },
"strip-ansi": { "strip-ansi": {
@ -1401,9 +1410,9 @@
}, },
"dependencies": { "dependencies": {
"glob": { "glob": {
"version": "7.1.3", "version": "7.1.4",
"resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz",
"integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==",
"requires": { "requires": {
"fs.realpath": "^1.0.0", "fs.realpath": "^1.0.0",
"inflight": "^1.0.4", "inflight": "^1.0.4",
@ -1426,26 +1435,26 @@
"integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI="
}, },
"zone-mta": { "zone-mta": {
"version": "1.16.0", "version": "1.16.3",
"resolved": "https://registry.npmjs.org/zone-mta/-/zone-mta-1.16.0.tgz", "resolved": "https://registry.npmjs.org/zone-mta/-/zone-mta-1.16.3.tgz",
"integrity": "sha512-0K6Z0ewUFn5/L3yvB9FyNyntT4j2iB0JCnKlQNQcR/PDuFq0LtbvwC4fKzRSII3qNG1LvH6DWNStT/azamexWg==", "integrity": "sha512-AEEP9npTIafOGpGIxlB3Burhi0gqmg7wTTet6X4Uh2RtbpktCucVVmx21OX9ql7p0lEFvb2mZwDxHKXqsVn66w==",
"requires": { "requires": {
"crc-32": "1.2.0", "crc-32": "1.2.0",
"dnscache": "1.0.1", "dnscache": "1.0.2",
"gelf": "2.0.1", "gelf": "2.0.1",
"iconv-lite": "0.4.24", "iconv-lite": "0.4.24",
"ioredis": "4.9.0", "ioredis": "4.10.0",
"isemail": "3.2.0", "isemail": "3.2.0",
"js-yaml": "3.13.0", "js-yaml": "3.13.1",
"libmime": "4.0.1", "libmime": "4.1.3",
"mailsplit": "4.3.1", "mailsplit": "4.4.1",
"minimist": "1.2.0", "minimist": "1.2.0",
"mongodb": "3.2.2", "mongodb": "3.2.7",
"msgpack-js": "0.3.0", "msgpack-js": "0.3.0",
"mx-connect": "1.1.1", "mx-connect": "1.1.1",
"nodemailer": "6.0.0", "nodemailer": "6.2.1",
"npmlog": "4.1.2", "npmlog": "4.1.2",
"prom-client": "11.3.0", "prom-client": "11.5.1",
"request": "2.88.0", "request": "2.88.0",
"restify": "7.7.0", "restify": "7.7.0",
"seq-index": "1.1.0", "seq-index": "1.1.0",

View file

@ -14,7 +14,7 @@
"node": ">=10.0.0" "node": ">=10.0.0"
}, },
"dependencies": { "dependencies": {
"zone-mta": "^1.16.0", "zone-mta": "^1.16.3",
"zonemta-delivery-counters": "^1.0.1", "zonemta-delivery-counters": "^1.0.1",
"zonemta-limiter": "^1.0.0", "zonemta-limiter": "^1.0.0",
"zonemta-loop-breaker": "^1.0.2" "zonemta-loop-breaker": "^1.0.2"