@tiledesk/tiledesk-server 2.4.6 → 2.4.8
Sign up to get free protection for your applications and to get access to all the features.
- package/.circleci/config.yml +1 -1
- package/app.js +11 -0
- package/config/email.js +1 -1
- package/middleware/passport.js +1 -0
- package/models/auth.js +9 -1
- package/models/user.js +3 -0
- package/package.json +2 -2
- package/pubmodules/apps/listener.js +1 -0
- package/routes/auth.js +44 -3
- package/routes/images.js +3 -1
- package/routes/project.js +12 -0
- package/routes/users.js +2 -0
- package/services/emailService.js +2 -2
- package/template/email/assignedEmailMessage.html +1 -1
- package/template/email/assignedRequest.html +1 -1
- package/template/email/beenInvitedExistingUser.html +4 -4
- package/template/email/beenInvitedNewUser.html +1 -1
- package/template/email/emailDirect.html +1 -1
- package/template/email/newMessage.html +1 -1
- package/template/email/newMessageFollower.html +1 -1
- package/template/email/passwordChanged.html +3 -3
- package/template/email/pooledEmailMessage.html +1 -1
- package/template/email/pooledRequest.html +1 -1
- package/template/email/resetPassword.html +3 -3
- package/template/email/ticket.html +1 -1
- package/template/email/verify.html +4 -4
package/.circleci/config.yml
CHANGED
@@ -16,7 +16,7 @@ jobs:
|
|
16
16
|
# You can specify an image from Dockerhub or use one of our Convenience Images from CircleCI's Developer Hub.
|
17
17
|
# A list of available CircleCI Docker Convenience Images are available here: https://circleci.com/developer/images/image/cimg/node
|
18
18
|
docker:
|
19
|
-
- image: cimg/node:
|
19
|
+
- image: cimg/node:16.17.1
|
20
20
|
# Then run your tests!
|
21
21
|
# CircleCI will report the results back to your VCS provider.
|
22
22
|
steps:
|
package/app.js
CHANGED
@@ -132,6 +132,7 @@ var settingDataLoader = require('./services/settingDataLoader');
|
|
132
132
|
var schemaMigrationService = require('./services/schemaMigrationService');
|
133
133
|
var RouterLogger = require('./models/routerLogger');
|
134
134
|
var cacheEnabler = require("./services/cacheEnabler");
|
135
|
+
const session = require('express-session');
|
135
136
|
|
136
137
|
require('./services/mongoose-cache-fn')(mongoose);
|
137
138
|
|
@@ -270,6 +271,16 @@ if (process.env.ENABLE_ACCESSLOG) {
|
|
270
271
|
|
271
272
|
app.use(passport.initialize());
|
272
273
|
|
274
|
+
// After you declare "app"
|
275
|
+
if (process.env.DISABLE_SESSION_STRATEGY==true || process.env.DISABLE_SESSION_STRATEGY=="true" ) {
|
276
|
+
winston.info("Express Session disabled");
|
277
|
+
} else {
|
278
|
+
// https://www.npmjs.com/package/express-session
|
279
|
+
let sessionSecret = process.env.SESSION_SECRET || "tiledesk-session-secret";
|
280
|
+
winston.info("Express Session Secret: " + sessionSecret);
|
281
|
+
app.use(session({ secret: sessionSecret}));
|
282
|
+
app.use(passport.session());
|
283
|
+
}
|
273
284
|
|
274
285
|
//ATTENTION. If you use AWS Api Gateway you need also to configure the cors policy https://docs.aws.amazon.com/apigateway/latest/developerguide/how-to-cors-console.html
|
275
286
|
app.use(cors());
|
package/config/email.js
CHANGED
@@ -3,7 +3,7 @@ module.exports = {
|
|
3
3
|
'username': 'postmaster@mg.tiledesk.com',
|
4
4
|
'from': 'Tiledesk Notification <postmaster@mg.tiledesk.com>',
|
5
5
|
'bcc': '',
|
6
|
-
'baseUrl':'
|
6
|
+
'baseUrl':'http://localhost:8081/dashboard',
|
7
7
|
'replyEnabled' : false,
|
8
8
|
'inboundDomain': 'tickets.tiledesk.com'
|
9
9
|
};
|
package/middleware/passport.js
CHANGED
package/models/auth.js
CHANGED
@@ -12,9 +12,17 @@ var AuthSchema = new Schema({
|
|
12
12
|
default: 'password',
|
13
13
|
required: true
|
14
14
|
},
|
15
|
+
subject: {
|
16
|
+
type: String,
|
17
|
+
required: true
|
18
|
+
},
|
19
|
+
email: {
|
20
|
+
type: String,
|
21
|
+
},
|
15
22
|
password: {
|
16
23
|
type: String,
|
17
|
-
required:
|
24
|
+
required: false,
|
25
|
+
// required: true,
|
18
26
|
// https://stackoverflow.com/questions/12096262/how-to-protect-the-password-field-in-mongoose-mongodb-so-it-wont-return-in-a-qu
|
19
27
|
// select: false
|
20
28
|
},
|
package/models/user.js
CHANGED
package/package.json
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
{
|
2
2
|
"name": "@tiledesk/tiledesk-server",
|
3
3
|
"description": "The Tiledesk server module",
|
4
|
-
"version": "2.4.
|
4
|
+
"version": "2.4.8",
|
5
5
|
"scripts": {
|
6
6
|
"start": "node ./bin/www",
|
7
7
|
"pretest": "mongodb-runner start",
|
@@ -44,7 +44,7 @@
|
|
44
44
|
"@tiledesk/tiledesk-kaleyra-proxy": "^0.1.7",
|
45
45
|
"@tiledesk/tiledesk-messenger-connector": "0.1.9",
|
46
46
|
"@tiledesk/tiledesk-rasa-connector": "^1.0.10",
|
47
|
-
"@tiledesk/tiledesk-tybot-connector": "^0.1.
|
47
|
+
"@tiledesk/tiledesk-tybot-connector": "^0.1.78",
|
48
48
|
"@tiledesk/tiledesk-whatsapp-connector": "^0.1.45",
|
49
49
|
"amqplib": "^0.5.5",
|
50
50
|
"app-root-path": "^3.0.0",
|
@@ -23,6 +23,7 @@ class Listener {
|
|
23
23
|
if (config.databaseUri) {
|
24
24
|
winston.debug("apps config databaseUri: " + config.databaseUri);
|
25
25
|
}
|
26
|
+
// console.log("ACCESS_TOKEN_SECRET",process.env.APPS_ACCESS_TOKEN_SECRET || configSecretOrPubicKay);
|
26
27
|
|
27
28
|
apps.startApp({
|
28
29
|
ACCESS_TOKEN_SECRET: process.env.APPS_ACCESS_TOKEN_SECRET || configSecretOrPubicKay,
|
package/routes/auth.js
CHANGED
@@ -452,9 +452,31 @@ function (req, res) {
|
|
452
452
|
});
|
453
453
|
|
454
454
|
|
455
|
+
// http://localhost:3000/auth/google?redirect_url=http%3A%2F%2Flocalhost%3A3000%2Fauth%2Fgoogle%2Fcallback%3Ffrom%3Dsignup
|
456
|
+
|
457
|
+
// http://localhost:3000/auth/google?redirect_url=http%3A%2F%2Flocalhost%3A3000%2Fauth%2Fgoogle%2Fcallbacks
|
458
|
+
|
459
|
+
// http://localhost:3000/auth/google?redirect_url=%2F%23%2Fproject%2F6452281f6d68c5f419c1c577%2Fhome
|
460
|
+
|
461
|
+
|
455
462
|
|
456
463
|
// Redirect the user to the Google signin page</em>
|
457
|
-
router.get("/google", passport.authenticate("google", { scope: ["email", "profile"] }));
|
464
|
+
// router.get("/google", passport.authenticate("google", { scope: ["email", "profile"] }));
|
465
|
+
router.get("/google", function(req,res,next){
|
466
|
+
winston.info("redirect_url: "+ req.query.redirect_url );
|
467
|
+
req.session.redirect_url = req.query.redirect_url;
|
468
|
+
// req._toParam = 'Hello';
|
469
|
+
passport.authenticate(
|
470
|
+
// 'google', { scope : ["email", "profile"], state: base64url(JSON.stringify({blah: 'text'})) } //custom redirect_url req.query.state
|
471
|
+
'google', { scope : ["email", "profile"] } //custom redirect_url
|
472
|
+
// 'google', { scope : ["email", "profile"], callbackURL: req.query.redirect_url } //custom redirect_url
|
473
|
+
)(req,res,next);
|
474
|
+
});
|
475
|
+
|
476
|
+
// router.get("/google/callbacks", passport.authenticate("google", { session: false }), (req, res) => {
|
477
|
+
// console.log("callback_signup");
|
478
|
+
// res.redirect("/google/callback");
|
479
|
+
// });
|
458
480
|
|
459
481
|
// Retrieve user data using the access token received</em>
|
460
482
|
router.get("/google/callback", passport.authenticate("google", { session: false }), (req, res) => {
|
@@ -462,9 +484,17 @@ router.get("/google/callback", passport.authenticate("google", { session: false
|
|
462
484
|
|
463
485
|
var user = req.user;
|
464
486
|
winston.debug("user", user);
|
487
|
+
// winston.info("req._toParam: "+ req._toParam);
|
488
|
+
// winston.info("req.query.redirect_url: "+ req.query.redirect_url);
|
489
|
+
// winston.info("req.query.state: "+ req.query.state);
|
490
|
+
winston.info("req.session.redirect_url: "+ req.session.redirect_url);
|
491
|
+
|
465
492
|
|
466
493
|
var userJson = user.toObject();
|
467
494
|
|
495
|
+
delete userJson.password;
|
496
|
+
|
497
|
+
|
468
498
|
var signOptions = {
|
469
499
|
issuer: 'https://tiledesk.com',
|
470
500
|
subject: 'user',
|
@@ -485,8 +515,19 @@ router.get("/google/callback", passport.authenticate("google", { session: false
|
|
485
515
|
// return the information including token as JSON
|
486
516
|
// res.json(returnObject);
|
487
517
|
|
488
|
-
|
489
|
-
winston.debug("
|
518
|
+
let dashboard_base_url = process.env.EMAIL_BASEURL || config.baseUrl;
|
519
|
+
winston.debug("Google Redirect dashboard_base_url: ", dashboard_base_url);
|
520
|
+
|
521
|
+
let homeurl = "/#/";
|
522
|
+
|
523
|
+
if (req.session.redirect_url) {
|
524
|
+
homeurl = req.session.redirect_url;
|
525
|
+
}
|
526
|
+
|
527
|
+
var url = dashboard_base_url+homeurl+"?token=JWT "+token;
|
528
|
+
|
529
|
+
|
530
|
+
winston.info("Google Redirect: "+ url);
|
490
531
|
|
491
532
|
res.redirect(url);
|
492
533
|
|
package/routes/images.js
CHANGED
@@ -23,7 +23,9 @@ const fileService = new FileGridFsService("images");
|
|
23
23
|
|
24
24
|
|
25
25
|
const fileFilter = (req, file, cb) => {
|
26
|
-
if (file.mimetype == 'image/jpeg' || file.mimetype == 'image/png'
|
26
|
+
if (file.mimetype == 'image/jpeg' || file.mimetype == 'image/png'
|
27
|
+
|| file.mimetype == 'image/gif'|| file.mimetype == 'image/vnd.microsoft.icon'
|
28
|
+
|| file.mimetype == 'image/webp') {
|
27
29
|
cb(null, true);
|
28
30
|
} else {
|
29
31
|
cb(null, false);
|
package/routes/project.js
CHANGED
@@ -46,6 +46,8 @@ router.put('/:projectid/downgradeplan', [passport.authenticate(['basic', 'jwt'],
|
|
46
46
|
router.delete('/:projectid/physical', [passport.authenticate(['basic', 'jwt'], { session: false }), validtoken, roleChecker.hasRole('owner')], function (req, res) {
|
47
47
|
winston.debug(req.body);
|
48
48
|
// TODO delete also department, faq_kb, faq, group, label, lead, message, project_users, requests, subscription
|
49
|
+
|
50
|
+
// TODO use findByIdAndRemove otherwise project don't contains label object
|
49
51
|
Project.remove({ _id: req.params.projectid }, function (err, project) {
|
50
52
|
if (err) {
|
51
53
|
winston.error('Error deleting project ', err);
|
@@ -121,12 +123,18 @@ router.put('/:projectid', [passport.authenticate(['basic', 'jwt'], { session: fa
|
|
121
123
|
if (req.body["settings.email.templates.newMessage"]!=undefined) {
|
122
124
|
update["settings.email.templates.newMessage"] = req.body["settings.email.templates.newMessage"];
|
123
125
|
}
|
126
|
+
if (req.body["settings.email.templates.newMessageFollower"]!=undefined) {
|
127
|
+
update["settings.email.templates.newMessageFollower"] = req.body["settings.email.templates.newMessageFollower"];
|
128
|
+
}
|
124
129
|
if (req.body["settings.email.templates.ticket"]!=undefined) {
|
125
130
|
update["settings.email.templates.ticket"] = req.body["settings.email.templates.ticket"];
|
126
131
|
}
|
127
132
|
if (req.body["settings.email.templates.sendTranscript"]!=undefined) {
|
128
133
|
update["settings.email.templates.sendTranscript"] = req.body["settings.email.templates.sendTranscript"];
|
129
134
|
}
|
135
|
+
if (req.body["settings.email.templates.emailDirect"]!=undefined) {
|
136
|
+
update["settings.email.templates.emailDirect"] = req.body["settings.email.templates.emailDirect"];
|
137
|
+
}
|
130
138
|
|
131
139
|
|
132
140
|
if (req.body["settings.email.from"]!=undefined) {
|
@@ -512,6 +520,8 @@ router.get('/:projectid', [passport.authenticate(['basic', 'jwt'], { session: fa
|
|
512
520
|
winston.warn('Project not found ');
|
513
521
|
return res.status(404).send({ success: false, msg: 'Object not found.' });
|
514
522
|
}
|
523
|
+
|
524
|
+
//TODO REMOVE settings from project
|
515
525
|
res.json(project);
|
516
526
|
});
|
517
527
|
});
|
@@ -608,6 +618,8 @@ router.get('/', [passport.authenticate(['basic', 'jwt'], { session: false }), va
|
|
608
618
|
|
609
619
|
project_users.sort((a, b) => (a.id_project && b.id_project && a.id_project.updatedAt > b.id_project.updatedAt) ? 1 : -1)
|
610
620
|
project_users.reverse();
|
621
|
+
|
622
|
+
//TODO REMOVE settings from project
|
611
623
|
res.json(project_users);
|
612
624
|
});
|
613
625
|
});
|
package/routes/users.js
CHANGED
@@ -20,6 +20,7 @@ router.put('/', function (req, res) {
|
|
20
20
|
update.firstname = req.body.firstname;
|
21
21
|
update.lastname = req.body.lastname;
|
22
22
|
update.attributes = req.body.attributes;
|
23
|
+
update.description = req.body.description;
|
23
24
|
|
24
25
|
|
25
26
|
|
@@ -75,6 +76,7 @@ router.delete('/physical', function (req, res) {
|
|
75
76
|
// cancello virtualmente progetti owner
|
76
77
|
winston.debug('delete USER - REQ BODY ', req.body);
|
77
78
|
|
79
|
+
// TODO use findByIdAndRemove otherwise user don't contains label object
|
78
80
|
User.remove({ _id: req.user.id }, function (err, user) {
|
79
81
|
if (err) {
|
80
82
|
winston.error(err);
|
package/services/emailService.js
CHANGED
@@ -1857,7 +1857,7 @@ parseText(text, payload) {
|
|
1857
1857
|
var baseScope = JSON.parse(JSON.stringify(this));
|
1858
1858
|
delete baseScope.pass;
|
1859
1859
|
|
1860
|
-
winston.
|
1860
|
+
winston.debug("parseText text: "+ text);
|
1861
1861
|
|
1862
1862
|
var templateHand = handlebars.compile(text);
|
1863
1863
|
|
@@ -1868,7 +1868,7 @@ parseText(text, payload) {
|
|
1868
1868
|
};
|
1869
1869
|
|
1870
1870
|
var textTemplate = templateHand(replacements);
|
1871
|
-
winston.
|
1871
|
+
winston.debug("parseText textTemplate: "+ textTemplate);
|
1872
1872
|
|
1873
1873
|
return textTemplate;
|
1874
1874
|
|
@@ -5,7 +5,7 @@
|
|
5
5
|
<head>
|
6
6
|
<meta name="viewport" content="width=device-width" />
|
7
7
|
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
|
8
|
-
<title>New message ticket from
|
8
|
+
<title>New message ticket from Tiledesk</title>
|
9
9
|
|
10
10
|
<style type="text/css">
|
11
11
|
img {
|
@@ -4,7 +4,7 @@
|
|
4
4
|
<head>
|
5
5
|
<meta name="viewport" content="width=device-width" />
|
6
6
|
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
|
7
|
-
<title>New email from
|
7
|
+
<title>New email from Tiledesk</title>
|
8
8
|
|
9
9
|
<style type="text/css">
|
10
10
|
img {
|
@@ -100,13 +100,13 @@
|
|
100
100
|
|
101
101
|
<td class="content-block" style="font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; vertical-align: top; margin: 0;" valign="top">
|
102
102
|
<h2 style="text-align: center; letter-spacing: 1px; font-weight: 400; line-height:24px ">
|
103
|
-
{{currentUserFirstname}} {{currentUserLastname}} has invited you to the
|
103
|
+
{{currentUserFirstname}} {{currentUserLastname}} has invited you to the Tiledesk project <strong> {{projectName}}</strong>
|
104
104
|
</h2>
|
105
105
|
|
106
106
|
<br> <br><strong style="font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;">Hi {{invitedUserFirstname}} {{invitedUserLastname}},</strong>
|
107
107
|
|
108
108
|
<br> <br>
|
109
|
-
I invited you to take on the role of {{invitedUserRole}} of the
|
109
|
+
I invited you to take on the role of {{invitedUserRole}} of the Tiledesk <strong> {{projectName}}</strong> project
|
110
110
|
|
111
111
|
|
112
112
|
<div style="text-align: center;">
|
@@ -116,7 +116,7 @@
|
|
116
116
|
</a>
|
117
117
|
</div>
|
118
118
|
|
119
|
-
<br><br> Team
|
119
|
+
<br><br> The Tiledesk Team
|
120
120
|
</td>
|
121
121
|
</tr>
|
122
122
|
|
@@ -4,7 +4,7 @@
|
|
4
4
|
<head>
|
5
5
|
<meta name="viewport" content="width=device-width" />
|
6
6
|
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
|
7
|
-
<title>New email from
|
7
|
+
<title>New email from Tiledesk</title>
|
8
8
|
|
9
9
|
<style type="text/css">
|
10
10
|
img {
|
@@ -106,11 +106,11 @@
|
|
106
106
|
<br> <br<strong style="font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;">Hi {{userFirstname}} {{userLastname}},</strong>
|
107
107
|
|
108
108
|
<br> <br>
|
109
|
-
The password of your
|
109
|
+
The password of your Tiledesk account {{to}} was just changed.
|
110
110
|
<br><br>If this was you, then you can safely ignore this email.
|
111
111
|
<br><br>If this wasn't you please contact <a href="mailto:info@tiledesk.com">our support team</a>
|
112
112
|
|
113
|
-
<br><br> Team
|
113
|
+
<br><br> The Tiledesk Team
|
114
114
|
</td>
|
115
115
|
</tr>
|
116
116
|
|
@@ -5,7 +5,7 @@
|
|
5
5
|
<head>
|
6
6
|
<meta name="viewport" content="width=device-width" />
|
7
7
|
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
|
8
|
-
<title>New message ticket from
|
8
|
+
<title>New message ticket from Tiledesk</title>
|
9
9
|
|
10
10
|
<style type="text/css">
|
11
11
|
img {
|
@@ -4,7 +4,7 @@
|
|
4
4
|
<head>
|
5
5
|
<meta name="viewport" content="width=device-width" />
|
6
6
|
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
|
7
|
-
<title>New pooled chat from
|
7
|
+
<title>New pooled chat from Tiledesk</title>
|
8
8
|
|
9
9
|
<style type="text/css">
|
10
10
|
img {
|
@@ -3,7 +3,7 @@
|
|
3
3
|
<head>
|
4
4
|
<meta name="viewport" content="width=device-width" />
|
5
5
|
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
|
6
|
-
<title>New email from
|
6
|
+
<title>New email from Tiledesk</title>
|
7
7
|
|
8
8
|
<style type="text/css">
|
9
9
|
img {
|
@@ -102,7 +102,7 @@
|
|
102
102
|
<br> <br<strong style="font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;">Hi {{userFirstname}} {{userLastname}},</strong>
|
103
103
|
|
104
104
|
<br> <br>
|
105
|
-
Seems like you forgot your password for
|
105
|
+
Seems like you forgot your password for Tiledesk. If this is true, click below to reset your password
|
106
106
|
<div style="text-align: center;">
|
107
107
|
<br><br>
|
108
108
|
<a href="{{baseScope.baseUrl}}/#/resetpassword/{{resetPswRequestId}}" style=" background-color: #ff8574 !important; border: none; color: white; padding: 12px 30px; text-align: center; text-decoration: none; display: inline-block; font-size: 16px; font-weight: 600; letter-spacing: 1px; margin: 4px 2px; cursor: pointer;">
|
@@ -113,7 +113,7 @@
|
|
113
113
|
<br><br><span style="font-size:12px; ">If you're having trouble clicking the "Reset My Password" button, copy and paste the URL below into your web browser: </span>
|
114
114
|
<br>
|
115
115
|
<span style="color:#03a5e8; font-size:12px; ">{{baseScope.baseUrl}}/#/resetpassword/{{resetPswRequestId}}</span>
|
116
|
-
<br><br> Team
|
116
|
+
<br><br> The Tiledesk Team
|
117
117
|
</td>
|
118
118
|
</tr>
|
119
119
|
|
@@ -4,7 +4,7 @@
|
|
4
4
|
<head>
|
5
5
|
<meta name="viewport" content="width=device-width" />
|
6
6
|
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
|
7
|
-
<title>New email from
|
7
|
+
<title>New email from Tiledesk</title>
|
8
8
|
|
9
9
|
<style type="text/css">
|
10
10
|
img {
|
@@ -109,11 +109,11 @@
|
|
109
109
|
<tr style="font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;">
|
110
110
|
<td class="content-block" style="font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; vertical-align: top; margin: 0;" valign="top">
|
111
111
|
<strong style="font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;">Hi {{savedUser.firstname}} {{savedUser.lastname}},</strong>
|
112
|
-
<!-- <br> welcome on
|
113
|
-
<br><br> Thank you for signin up with
|
112
|
+
<!-- <br> welcome on Tiledesk.com. -->
|
113
|
+
<br><br> Thank you for signin up with Tiledesk.
|
114
114
|
<br><br> To complete the setup, <span><a href="{{baseScope.baseUrl}}/#/verify/email/{{savedUser._id}}"> click here to verify your email address. </a> </span>
|
115
115
|
<br><br>Give us your feedback! We need your advice. Send an email to <a href="mailto:info@tiledesk.com">info@tiledesk.com</a>
|
116
|
-
<br><br> Team
|
116
|
+
<br><br> The Tiledesk Team
|
117
117
|
</td>
|
118
118
|
</tr>
|
119
119
|
|