Skip to content

Commit e38f80e

Browse files
authored
Merge pull request #1091 from Mailtrain-org/fix-1046
Fix for #1046
2 parents 91cb4ba + ac389ea commit e38f80e

File tree

3 files changed

+113
-71
lines changed

3 files changed

+113
-71
lines changed

client/src/account/API.js

Lines changed: 71 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -86,13 +86,13 @@ export default class API extends Component {
8686
</div>
8787
</div>
8888

89-
<div class="accordion" id="apicalls">
90-
<div class="card">
91-
<div class="card-header">
92-
<button type="button" class="btn btn-link" data-toggle="collapse" data-target="#moresubscribers"><h4>GET /api/subscriptions/:listCid – {t('getSubscribers')}</h4></button>
89+
<div className="accordion" id="apicalls">
90+
<div className="card">
91+
<div className="card-header">
92+
<button type="button" className="btn btn-link" data-toggle="collapse" data-target="#moresubscribers"><h4>GET /api/subscriptions/:listCid – {t('getSubscribers')}</h4></button>
9393
</div>
94-
<div id="moresubscribers" class="collapse" data-parent="#apicalls">
95-
<div class="card-body">
94+
<div id="moresubscribers" className="collapse" data-parent="#apicalls">
95+
<div className="card-body">
9696
<p>
9797
{t('getSubscribers')}
9898
</p>
@@ -118,12 +118,12 @@ export default class API extends Component {
118118
</div>
119119
</div>
120120
</div>
121-
<div class="card">
122-
<div class="card-header">
123-
<h4><button type="button" class="btn btn-link" data-toggle="collapse" data-target="#moresubscribe"><h4>POST /api/subscribe/:listCid – {t('addSubscription')}</h4></button></h4>
121+
<div className="card">
122+
<div className="card-header">
123+
<h4><button type="button" className="btn btn-link" data-toggle="collapse" data-target="#moresubscribe"><h4>POST /api/subscribe/:listCid – {t('addSubscription')}</h4></button></h4>
124124
</div>
125-
<div id="moresubscribe" class="collapse" data-parent="#apicalls">
126-
<div class="card-body">
125+
<div id="moresubscribe" className="collapse" data-parent="#apicalls">
126+
<div className="card-body">
127127
<p>
128128
{t('thisApiCallEitherInsertsANewSubscription')}
129129
</p>
@@ -175,12 +175,12 @@ export default class API extends Component {
175175
</div>
176176
</div>
177177
</div>
178-
<div class="card">
179-
<div class="card-header">
180-
<button type="button" class="btn btn-link" data-toggle="collapse" data-target="#moreunsubscribe"><h4>POST /api/unsubscribe/:listCId – {t('removeSubscription')}</h4></button>
178+
<div className="card">
179+
<div className="card-header">
180+
<button type="button" className="btn btn-link" data-toggle="collapse" data-target="#moreunsubscribe"><h4>POST /api/unsubscribe/:listCId – {t('removeSubscription')}</h4></button>
181181
</div>
182-
<div id="moreunsubscribe" class="collapse" data-parent="#apicalls">
183-
<div class="card-body">
182+
<div id="moreunsubscribe" className="collapse" data-parent="#apicalls">
183+
<div className="card-body">
184184
<p>
185185
{t('thisApiCallMarksASubscriptionAs')}
186186
</p>
@@ -214,12 +214,12 @@ export default class API extends Component {
214214
</div>
215215
</div>
216216
</div>
217-
<div class="card">
218-
<div class="card-header">
219-
<button type="button" class="btn btn-link" data-toggle="collapse" data-target="#moredelete"><h4>POST /api/delete/:listCId – {t('deleteSubscription')}</h4></button>
217+
<div className="card">
218+
<div className="card-header">
219+
<button type="button" className="btn btn-link" data-toggle="collapse" data-target="#moredelete"><h4>POST /api/delete/:listCId – {t('deleteSubscription')}</h4></button>
220220
</div>
221-
<div id="moredelete" class="collapse" data-parent="#apicalls">
222-
<div class="card-body">
221+
<div id="moredelete" className="collapse" data-parent="#apicalls">
222+
<div className="card-body">
223223
<p>
224224
{t('thisApiCallDeletesASubscription')}
225225
</p>
@@ -252,12 +252,12 @@ export default class API extends Component {
252252
</div>
253253
</div>
254254
</div>
255-
<div class="card">
256-
<div class="card-header">
257-
<button type="button" class="btn btn-link" data-toggle="collapse" data-target="#morefield"><h4>POST /api/field/:listId – {t('addNewCustomField')}</h4></button>
255+
<div className="card">
256+
<div className="card-header">
257+
<button type="button" className="btn btn-link" data-toggle="collapse" data-target="#morefield"><h4>POST /api/field/:listId – {t('addNewCustomField')}</h4></button>
258258
</div>
259-
<div id="morefield" class="collapse" data-parent="#apicalls">
260-
<div class="card-body">
259+
<div id="morefield" className="collapse" data-parent="#apicalls">
260+
<div className="card-body">
261261
<p>
262262
{t('thisApiCallCreatesANewCustomFieldForA')}
263263
</p>
@@ -310,12 +310,12 @@ export default class API extends Component {
310310
</div>
311311
</div>
312312
</div>
313-
<div class="card">
314-
<div class="card-header">
315-
<button type="button" class="btn btn-link" data-toggle="collapse" data-target="#moreblacklistget"><h4>GET /api/blacklist/get – {t('getListOfBlacklistedEmails')}</h4></button>
313+
<div className="card">
314+
<div className="card-header">
315+
<button type="button" className="btn btn-link" data-toggle="collapse" data-target="#moreblacklistget"><h4>GET /api/blacklist/get – {t('getListOfBlacklistedEmails')}</h4></button>
316316
</div>
317-
<div id="moreblacklistget" class="collapse" data-parent="#apicalls">
318-
<div class="card-body">
317+
<div id="moreblacklistget" className="collapse" data-parent="#apicalls">
318+
<div className="card-body">
319319
<p>
320320
{t('thisApiCallGetListOfBlacklistedEmails')}
321321
</p>
@@ -342,12 +342,12 @@ export default class API extends Component {
342342
</div>
343343
</div>
344344
</div>
345-
<div class="card">
346-
<div class="card-header">
347-
<button type="button" class="btn btn-link" data-toggle="collapse" data-target="#moreblacklistadd"><h4>POST /api/blacklist/add – {t('addEmailToBlacklist')}</h4></button>
345+
<div className="card">
346+
<div className="card-header">
347+
<button type="button" className="btn btn-link" data-toggle="collapse" data-target="#moreblacklistadd"><h4>POST /api/blacklist/add – {t('addEmailToBlacklist')}</h4></button>
348348
</div>
349-
<div id="moreblacklistadd" class="collapse" data-parent="#apicalls">
350-
<div class="card-body">
349+
<div id="moreblacklistadd" className="collapse" data-parent="#apicalls">
350+
<div className="card-body">
351351
<p>
352352
{t('thisApiCallEitherAddEmailsToBlacklist')}
353353
</p>
@@ -375,12 +375,12 @@ export default class API extends Component {
375375
</div>
376376
</div>
377377
</div>
378-
<div class="card">
379-
<div class="card-header">
380-
<button type="button" class="btn btn-link" data-toggle="collapse" data-target="#moreblacklistdelete"><h4>POST /api/blacklist/delete – {t('deleteEmailFromBlacklist')}</h4></button>
378+
<div className="card">
379+
<div className="card-header">
380+
<button type="button" className="btn btn-link" data-toggle="collapse" data-target="#moreblacklistdelete"><h4>POST /api/blacklist/delete – {t('deleteEmailFromBlacklist')}</h4></button>
381381
</div>
382-
<div id="moreblacklistdelete" class="collapse" data-parent="#apicalls">
383-
<div class="card-body">
382+
<div id="moreblacklistdelete" className="collapse" data-parent="#apicalls">
383+
<div className="card-body">
384384
<p>
385385
{t('thisApiCallEitherDeleteEmailsFrom')}
386386
</p>
@@ -408,12 +408,12 @@ export default class API extends Component {
408408
</div>
409409
</div>
410410
</div>
411-
<div class="card">
412-
<div class="card-header">
413-
<button type="button" class="btn btn-link" data-toggle="collapse" data-target="#morelistsemail"><h4>GET /api/lists/:email – {t('getTheListsAUserHasSubscribedTo')}</h4></button>
411+
<div className="card">
412+
<div className="card-header">
413+
<button type="button" className="btn btn-link" data-toggle="collapse" data-target="#morelistsemail"><h4>GET /api/lists/:email – {t('getTheListsAUserHasSubscribedTo')}</h4></button>
414414
</div>
415-
<div id="morelistsemail" class="collapse" data-parent="#apicalls">
416-
<div class="card-body">
415+
<div id="morelistsemail" className="collapse" data-parent="#apicalls">
416+
<div className="card-body">
417417
<p>
418418
{t('retrieveTheListsThatTheUserWithEmailHas')}
419419
</p>
@@ -433,12 +433,12 @@ export default class API extends Component {
433433
</div>
434434
</div>
435435
</div>
436-
<div class="card">
437-
<div class="card-header">
438-
<button type="button" class="btn btn-link" data-toggle="collapse" data-target="#morelistsnamespace"><h4>GET /api/lists-by-namespace/:namespaceId – {t('getTheListsInANamespace')}</h4></button>
436+
<div className="card">
437+
<div className="card-header">
438+
<button type="button" className="btn btn-link" data-toggle="collapse" data-target="#morelistsnamespace"><h4>GET /api/lists-by-namespace/:namespaceId – {t('getTheListsInANamespace')}</h4></button>
439439
</div>
440-
<div id="morelistsnamespace" class="collapse" data-parent="#apicalls">
441-
<div class="card-body">
440+
<div id="morelistsnamespace" className="collapse" data-parent="#apicalls">
441+
<div className="card-body">
442442
<p>
443443
{t('retrieveTheListsThatTheNamespaceWith')}
444444
</p>
@@ -458,12 +458,12 @@ export default class API extends Component {
458458
</div>
459459
</div>
460460
</div>
461-
<div class="card">
462-
<div class="card-header">
463-
<button type="button" class="btn btn-link" data-toggle="collapse" data-target="#morecreatelist"><h4>POST /api/list – {t('createList')}</h4></button>
461+
<div className="card">
462+
<div className="card-header">
463+
<button type="button" className="btn btn-link" data-toggle="collapse" data-target="#morecreatelist"><h4>POST /api/list – {t('createList')}</h4></button>
464464
</div>
465-
<div id="morecreatelist" class="collapse" data-parent="#apicalls">
466-
<div class="card-body">
465+
<div id="morecreatelist" className="collapse" data-parent="#apicalls">
466+
<div className="card-body">
467467
<p>
468468
{t('createsANewListOfSubscribers')}
469469
</p>
@@ -530,12 +530,12 @@ export default class API extends Component {
530530
</div>
531531
</div>
532532
</div>
533-
<div class="card">
534-
<div class="card-header">
535-
<button type="button" class="btn btn-link" data-toggle="collapse" data-target="#moredeletelist"><h4>DELETE /api/list/:listCId – {t('deleteList')}</h4></button>
533+
<div className="card">
534+
<div className="card-header">
535+
<button type="button" className="btn btn-link" data-toggle="collapse" data-target="#moredeletelist"><h4>DELETE /api/list/:listCId – {t('deleteList')}</h4></button>
536536
</div>
537-
<div id="moredeletelist" class="collapse" data-parent="#apicalls">
538-
<div class="card-body">
537+
<div id="moredeletelist" className="collapse" data-parent="#apicalls">
538+
<div className="card-body">
539539
<p>
540540
{t('deletesAListOfSubscribers')}
541541
</p>
@@ -559,12 +559,12 @@ export default class API extends Component {
559559
</div>
560560
</div>
561561
</div>
562-
<div class="card">
563-
<div class="card-header">
564-
<button type="button" class="btn btn-link" data-toggle="collapse" data-target="#morerss"><h4>GET /api/rss/fetch/:campaignCid – {t('triggerFetchOfACampaign')}</h4></button>
562+
<div className="card">
563+
<div className="card-header">
564+
<button type="button" className="btn btn-link" data-toggle="collapse" data-target="#morerss"><h4>GET /api/rss/fetch/:campaignCid – {t('triggerFetchOfACampaign')}</h4></button>
565565
</div>
566-
<div id="morerss" class="collapse" data-parent="#apicalls">
567-
<div class="card-body">
566+
<div id="morerss" className="collapse" data-parent="#apicalls">
567+
<div className="card-body">
568568
<p>
569569
{t('forcesTheRssFeedCheckToImmediatelyCheck')}
570570
</p>
@@ -584,12 +584,12 @@ export default class API extends Component {
584584
</div>
585585
</div>
586586
</div>
587-
<div class="card">
588-
<div class="card-header">
589-
<button type="button" class="btn btn-link" data-toggle="collapse" data-target="#moretemplate"><h4>POST /api/templates/:templateId/send – {t('sendTransactionalEmail')}</h4></button>
587+
<div className="card">
588+
<div className="card-header">
589+
<button type="button" className="btn btn-link" data-toggle="collapse" data-target="#moretemplate"><h4>POST /api/templates/:templateId/send – {t('sendTransactionalEmail')}</h4></button>
590590
</div>
591-
<div id="moretemplate" class="collapse" data-parent="#apicalls">
592-
<div class="card-body">
591+
<div id="moretemplate" className="collapse" data-parent="#apicalls">
592+
<div className="card-body">
593593
<p>
594594
{t('sendSingleEmailByTemplateWithGiven')}
595595
</p>

docker-entrypoint.sh

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,8 @@ MYSQL_PASSWORD=${MYSQL_PASSWORD:-'mailtrain'}
4444
WITH_ZONE_MTA=${WITH_ZONE_MTA:-'true'}
4545
POOL_NAME=${POOL_NAME:-$(hostname)}
4646
LOG_LEVEL=${LOG_LEVEL:-'info'}
47+
ADMIN_PASSWORD=${ADMIN_PASSWORD:-'test'}
48+
ADMIN_ACCESS_TOKEN=${ADMIN_ACCESS_TOKEN:-''}
4749

4850
# Warning for users that already rely on the MAILTRAIN_SETTING variable
4951
# Can probably be removed in the future.
@@ -191,4 +193,6 @@ if [ "$WITH_LDAP" = "true" ]; then
191193
fi
192194
fi
193195

196+
NODE_ENV=production node setup/docker-entrypoint-db-setup.js "$ADMIN_PASSWORD" "$ADMIN_ACCESS_TOKEN"
197+
194198
NODE_ENV=production node index.js
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
'use strict';
2+
3+
const log = require('../lib/log');
4+
const dbcheck = require('../lib/dbcheck');
5+
const knex = require('../lib/knex');
6+
const {getAdminId} = require("../../shared/users");
7+
const bluebird = require('bluebird');
8+
const bcrypt = require('bcrypt-nodejs');
9+
const bcryptHash = bluebird.promisify(bcrypt.hash.bind(bcrypt));
10+
11+
async function init() {
12+
const args = process.argv.slice(2);
13+
14+
if (args.length !== 2) {
15+
log.error('Usage: NODE_ENV=production node setup/docker-entrypoint-db-setup.js <admin password> <admin access token>')
16+
return;
17+
}
18+
19+
const passwd = args[0];
20+
const accessToken = args[1];
21+
22+
await dbcheck();
23+
await knex.migrate.latest();
24+
25+
26+
const hashedPasswd = await bcryptHash(passwd, null, null);
27+
await knex('users').where({id: getAdminId()}).update({password: hashedPasswd});
28+
29+
if (accessToken !== '') {
30+
await knex('users').where({id: getAdminId()}).update({access_token: accessToken});
31+
}
32+
33+
process.exit(0);
34+
}
35+
36+
init().catch(err => {log.error('', err); process.exit(1); });
37+
38+

0 commit comments

Comments
 (0)