@tiledesk/tiledesk-server 2.2.26 → 2.2.28

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -4,6 +4,12 @@
4
4
  - Added tag field to the project_user
5
5
  - Removed default BCC from email
6
6
  - BugFix: Avoid cluster concurrent jobs in multiple nodes
7
+ - Faq template now support blank and example
8
+ - Organizzation support added
9
+ - ipFilter related to the project is now supported
10
+
11
+ # 2.2.26
12
+ - Tag fix for 2.2.25
7
13
 
8
14
  # 2.2.25
9
15
  - New label prechat form
package/README.md CHANGED
@@ -90,3 +90,4 @@ To see how to upgrade tiledesk-server see [here](./docs/upgrading.md)
90
90
  # Testing
91
91
  Run unit test with `npm test` and integration test with `npm run test:int`
92
92
 
93
+
package/app.js CHANGED
@@ -96,6 +96,7 @@ var faqpub = require('./routes/faqpub');
96
96
  var labels = require('./routes/labels');
97
97
  var fetchLabels = require('./middleware/fetchLabels');
98
98
  var cacheUtil = require("./utils/cacheUtil");
99
+ var orgUtil = require("./utils/orgUtil");
99
100
  var images = require('./routes/images');
100
101
  var files = require('./routes/files');
101
102
  var campaigns = require('./routes/campaigns');
@@ -128,6 +129,10 @@ var pubModulesManager = require('./pubmodules/pubModulesManager');
128
129
  var channelManager = require('./channels/channelManager');
129
130
  channelManager.listen();
130
131
 
132
+ const ipfilter = require('express-ipfilter').IpFilter
133
+ // const IpDeniedError = require('express-ipfilter').IpDeniedError;
134
+
135
+
131
136
  var modulesManager = undefined;
132
137
  try {
133
138
  modulesManager = require('./services/modulesManager');
@@ -233,7 +238,10 @@ if (process.env.ROUTELOGGER_ENABLED==="true") {
233
238
 
234
239
  var fullUrl = req.protocol + '://' + req.get('host') + req.originalUrl;
235
240
  winston.debug("fullUrl:"+ fullUrl);
241
+ winston.debug(" req.get('host'):"+ req.get('host'));
242
+
236
243
  winston.debug("req.get('origin'):" + req.get('origin'));
244
+ winston.debug("req.get('referer'):" + req.get('referer'));
237
245
 
238
246
  var routerLogger = new RouterLogger({
239
247
  origin: req.get('origin'),
@@ -291,7 +299,7 @@ var projectSetter = function (req, res, next) {
291
299
  if (err) {
292
300
  winston.warn("Problem getting project with id: " + projectid + " req.originalUrl: " + req.originalUrl);
293
301
  }
294
-
302
+
295
303
  winston.debug("projectSetter project:" + project);
296
304
  if (!project) {
297
305
  winston.warn("ProjectSetter project not found with id: " + projectid);
@@ -311,6 +319,53 @@ var projectSetter = function (req, res, next) {
311
319
  }
312
320
 
313
321
 
322
+ function customDetection (req) {
323
+ const ip = req.headers['x-forwarded-for'] || req.connection.remoteAddress;
324
+ winston.info("standard ip: "+ip); // ip address of the user
325
+ return ip;
326
+ }
327
+
328
+
329
+ var projectIpFilter = function (req, res, next) {
330
+ // var projectIpFilter = function (err, req, res, next) {
331
+
332
+ // var ip = require('ip');
333
+ // winston.info("projectIpFilter ip2: " + ip.address() );
334
+
335
+
336
+ const nextIp = function(err) {
337
+ winston.info("projectIpFilter next",err);
338
+
339
+ if (err && err.name === "IpDeniedError") {
340
+ winston.info("IpDeniedError");
341
+ return res.status(401).json({ err: "error project ip filter" });
342
+ // next(err)
343
+ }
344
+
345
+ next();
346
+
347
+ }
348
+
349
+
350
+ if (!req.project) {
351
+ return next();
352
+ }
353
+
354
+ var projectIpFilterEnabled = req.project.ipFilterEnabled;
355
+ winston.info("project projectIpFilterEnabled: " +projectIpFilterEnabled)
356
+
357
+ var projectIpFilter = req.project.ipFilter
358
+ winston.info("project ipFilter: " + projectIpFilter)
359
+
360
+ if (projectIpFilterEnabled === true && projectIpFilter && projectIpFilter.length > 0) {
361
+ var ip = ipfilter(projectIpFilter, { detectIp: customDetection, mode: 'allow' })
362
+ // var ip = ipfilter(projectIpFilter, { mode: 'allow' })
363
+ ip(req, res, nextIp);
364
+ } else {
365
+ next();
366
+ }
367
+
368
+ }
314
369
 
315
370
 
316
371
 
@@ -322,6 +377,7 @@ var projectSetter = function (req, res, next) {
322
377
  // app.post('/oauth/token', oauth2.token);
323
378
 
324
379
 
380
+ // const ips = ['::1'];
325
381
 
326
382
  app.use('/auth', auth);
327
383
  app.use('/testauth', [passport.authenticate(['basic', 'jwt'], { session: false }), validtoken], authtest);
@@ -355,7 +411,7 @@ if (modulesManager) {
355
411
  }
356
412
 
357
413
 
358
- app.use('/:projectid/', [projectIdSetter, projectSetter]);
414
+ app.use('/:projectid/', [projectIdSetter, projectSetter, projectIpFilter]);
359
415
 
360
416
 
361
417
  app.use('/:projectid/authtestWithRoleCheck', [passport.authenticate(['basic', 'jwt'], { session: false }), validtoken], authtestWithRoleCheck);
@@ -447,8 +503,22 @@ app.use(function (err, req, res, next) {
447
503
  });*/
448
504
 
449
505
 
506
+
507
+
508
+
509
+
510
+
511
+
512
+
450
513
  // error handler
451
514
  app.use((err, req, res, next) => {
515
+
516
+ winston.info("err.name", err.name)
517
+ if (err.name === "IpDeniedError") {
518
+ winston.info("IpDeniedError");
519
+ return res.status(401).json({ err: "error ip filter" });
520
+ }
521
+
452
522
  winston.error("General error", err);
453
523
  return res.status(500).json({ err: "error" });
454
524
  });
package/bin/www CHANGED
@@ -32,7 +32,10 @@ webSocketServer.init(httpServer);
32
32
  * Listen on provided port, on all network interfaces.
33
33
  */
34
34
 
35
- var listener = httpServer.listen(port,function(){
35
+ // use ipv4 or ipv6 https://stackoverflow.com/questions/50855419/get-only-ipv4-ips-via-nodejs-express
36
+ // var listener = httpServer.listen(port,'0.0.0.0', function(){
37
+
38
+ var listener = httpServer.listen(port, function(){
36
39
  console.log('Listening tiledesk-server ver:'+version+' on port ' + listener.address().port); //Listening on port 8888
37
40
  });
38
41
 
package/config/global.js CHANGED
@@ -1,3 +1,5 @@
1
1
  module.exports = {
2
2
  'apiUrl':'http://localhost:3000',
3
+ 'organizationBaseUrl' : 'org.local',
4
+ 'organizationEnabled' : false
3
5
  };
package/models/project.js CHANGED
@@ -101,6 +101,16 @@ var ProjectSchema = new Schema({
101
101
  return [new Channel({ name: 'chat21' })];
102
102
  }
103
103
  },
104
+ organization: {
105
+ type: String,
106
+ },
107
+ ipFilterEnabled:{
108
+ type: Boolean,
109
+ default: false
110
+ },
111
+ ipFilter: [{
112
+ type: String
113
+ }],
104
114
  // defaultLanguage: {
105
115
  // type: String,
106
116
  // required: true,
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.2.26",
4
+ "version": "2.2.28",
5
5
  "scripts": {
6
6
  "start": "node ./bin/www",
7
7
  "pretest": "mongodb-runner start",
@@ -38,7 +38,7 @@
38
38
  "@tiledesk-ent/tiledesk-server-groups": "^1.1.2",
39
39
  "@tiledesk-ent/tiledesk-server-jwthistory": "^1.1.9",
40
40
  "@tiledesk-ent/tiledesk-server-mt": "^1.1.7",
41
- "@tiledesk-ent/tiledesk-server-payments": "^1.1.5",
41
+ "@tiledesk-ent/tiledesk-server-payments": "^1.1.6",
42
42
  "@tiledesk-ent/tiledesk-server-queue": "^1.1.11",
43
43
  "@tiledesk-ent/tiledesk-server-request-history": "^1.1.5",
44
44
  "@tiledesk-ent/tiledesk-server-resthook": "^1.1.53",
@@ -61,6 +61,7 @@
61
61
  "email-templates": "^8.0.8",
62
62
  "eventemitter2": "^6.4.4",
63
63
  "express": "~4.17.1",
64
+ "express-ipfilter": "^1.2.0",
64
65
  "express-session": "^1.17.2",
65
66
  "express-validator": "^6.12.1",
66
67
  "fast-csv": "^4.3.6",
@@ -70,8 +70,11 @@ devi mandare un messaggio welcome tu altrimenti il bot inserito successivamente
70
70
  //TESTA QUESTO
71
71
 
72
72
  winston.debug("message.request.status: "+message.request.status);
73
- winston.debug("message.request.department.id_bot: "+message.request.department.id_bot);
74
- if (message.request.status === 50 && message.request.department.id_bot == undefined) {
73
+
74
+ winston.debug("message.request.hasBot: "+message.request.hasBot);
75
+ // winston.info("message.request.department.id_bot: "+message.request.department.id_bot);
76
+ if (message.request.status === 50 && message.request.hasBot === false) {
77
+ // if (message.request.status === 50 && message.request.department.id_bot == undefined) {
75
78
  //apply only if the status is temp and no bot is available. with agent you must reroute to assign temp request to an agent
76
79
  winston.debug("rerouting");
77
80
  // reroute(request_id, id_project, nobot)
package/routes/labels.js CHANGED
@@ -27,6 +27,8 @@ router.get('/default', function (req, res) {
27
27
  });
28
28
  // curl -v -X POST -H 'Content-Type:application/json' -d '{"lang":"IT"}' http://localhost:3000/123/labels/default/clone
29
29
 
30
+ // curl -v -X POST -H 'Content-Type:application/json' -u andrea.leo@f21.it:123456 -d '{"lang":"IT"}' http://localhost:3001/624c78e27b91d2a2ab49543a/labels/default/clone
31
+
30
32
  router.post('/default/clone',
31
33
  [
32
34
  passport.authenticate(['basic', 'jwt'], { session: false }),
package/routes/project.js CHANGED
@@ -15,6 +15,7 @@ require('../middleware/passport')(passport);
15
15
  var validtoken = require('../middleware/valid-token')
16
16
  var RoleConstants = require("../models/roleConstants");
17
17
  var cacheUtil = require('../utils/cacheUtil');
18
+ var orgUtil = require("../utils/orgUtil");
18
19
 
19
20
  router.put('/:projectid', [passport.authenticate(['basic', 'jwt'], { session: false }), validtoken, roleChecker.hasRole('admin')], function (req, res) {
20
21
  winston.debug('UPDATE PROJECT REQ BODY ', req.body);
@@ -151,6 +152,15 @@ router.put('/:projectid', [passport.authenticate(['basic', 'jwt'], { session: fa
151
152
  if (req.body.channels!=undefined) {
152
153
  update.channels = req.body.channels;
153
154
  }
155
+
156
+ if (req.body.ipFilterEnabled!=undefined) {
157
+ update.ipFilterEnabled = req.body.ipFilterEnabled;
158
+ }
159
+
160
+ if (req.body.ipFilter!=undefined) {
161
+ update.ipFilter = req.body.ipFilter;
162
+ }
163
+
154
164
 
155
165
  // if (req.body.defaultLanguage!=undefined) {
156
166
  // update.defaultLanguage = req.body.defaultLanguage;
@@ -291,6 +301,13 @@ router.patch('/:projectid', [passport.authenticate(['basic', 'jwt'], { session:
291
301
  update.channels = req.body.channels;
292
302
  }
293
303
 
304
+ if (req.body.ipFilterEnabled!=undefined) {
305
+ update.ipFilterEnabled = req.body.ipFilterEnabled;
306
+ }
307
+
308
+ if (req.body.ipFilter!=undefined) {
309
+ update.ipFilter = req.body.ipFilter;
310
+ }
294
311
 
295
312
  // if (req.body.defaultLanguage!=undefined) {
296
313
  // update.defaultLanguage = req.body.defaultLanguage;
@@ -362,6 +379,61 @@ router.get('/', [passport.authenticate(['basic', 'jwt'], { session: false }), va
362
379
  return res.status(500).send({ success: false, msg: 'Error getting object.' });
363
380
  }
364
381
 
382
+
383
+
384
+ //organization: if third sub domain iterate and put only project with organization==subdomain otherwise remove projects with org
385
+ winston.info("orgUtil.ORGANIZATION_ENABLED: " + orgUtil.ORGANIZATION_ENABLED);
386
+ if (orgUtil.ORGANIZATION_ENABLED == true ) {
387
+
388
+ // winston.info("project_users", project_users);
389
+ winston.info("project_users.length:"+ project_users.length);
390
+
391
+ let org = orgUtil.getOrg(req);
392
+ winston.info("org:"+ org);
393
+
394
+ if (org!=undefined) {
395
+ winston.info("org!=undefined");
396
+
397
+ var project_users = project_users.filter(function (projectUser) {
398
+ if (projectUser.id_project.organization && projectUser.id_project.organization === org ) {
399
+ winston.info("keep");
400
+ return true;
401
+ }
402
+ });
403
+
404
+ /* for (var i = 0; i < project_users.length; i++) {
405
+ winston.info("project_users[i].id_project.organization: " + project_users[i].id_project.organization);
406
+ if (project_users[i].id_project.organization && project_users[i].id_project.organization === org ) {
407
+ //keep
408
+ winston.info("keep");
409
+ } else {
410
+ // project_users.splice(i, 1); // 2nd parameter means remove one item only
411
+ winston.info("splice");
412
+ }
413
+ }*/
414
+ } else {
415
+
416
+ var project_users = project_users.filter(function (projectUser) {
417
+ if (projectUser.id_project.organization == undefined ) {
418
+ // winston.info("keep");
419
+ return true;
420
+ }
421
+ });
422
+
423
+
424
+ /*
425
+ for (var i = 0; i < project_users.length; i++) {
426
+ winston.info("project_users[i].id_project.organization: " + project_users[i].id_project.organization);
427
+ if (project_users[i].id_project.organization) {
428
+ project_users.splice(i, 1); // 2nd parameter means remove one item only
429
+ }
430
+ }*/
431
+ }
432
+ } else {
433
+ winston.info("no")
434
+ }
435
+
436
+
365
437
  project_users.sort((a, b) => (a.id_project && b.id_project && a.id_project.updatedAt > b.id_project.updatedAt) ? 1 : -1)
366
438
  project_users.reverse();
367
439
  res.json(project_users);
package/routes/request.js CHANGED
@@ -693,6 +693,10 @@ router.get('/', function (req, res, next) {
693
693
  query.location = req.query.location;
694
694
  }
695
695
 
696
+ if (req.query.ticket_id) {
697
+ query.ticket_id = req.query.ticket_id;
698
+ }
699
+
696
700
  // if (req.query.request_id) {
697
701
  // console.log('req.query.request_id', req.query.request_id);
698
702
  // query.request_id = req.query.request_id;
@@ -798,6 +802,17 @@ router.get('/', function (req, res, next) {
798
802
  winston.debug('REQUEST ROUTE - QUERY snap_department_id_bot_exists', query.snap_department_id_bot_exists);
799
803
  }
800
804
 
805
+ if (req.query.snap_lead_lead_id) {
806
+ query["snapshot.lead.lead_id"] = req.query.snap_lead_lead_id;
807
+ winston.debug('REQUEST ROUTE - QUERY snap_lead_lead_id', query.snap_lead_lead_id);
808
+ }
809
+
810
+ if (req.query.channel) {
811
+ query["channel.name"] = req.query.channel
812
+ winston.debug('REQUEST ROUTE - QUERY channel', query.channel);
813
+ }
814
+
815
+
801
816
  var direction = -1; //-1 descending , 1 ascending
802
817
  if (req.query.direction) {
803
818
  direction = req.query.direction;
@@ -4,6 +4,7 @@ var Request = require("../models/request");
4
4
  var winston = require('../config/winston');
5
5
  const requestEvent = require('../event/requestEvent');
6
6
  const { check, validationResult } = require('express-validator');
7
+ var requestService = require('../services/requestService');
7
8
 
8
9
 
9
10
  router.patch('/:requestid/rating', function (req, res) {
@@ -54,5 +55,19 @@ router.patch('/:requestid/rating', function (req, res) {
54
55
  });
55
56
 
56
57
 
58
+ router.put('/:requestid/closeg', function (req, res) {
59
+ winston.debug(req.body);
60
+
61
+ // closeRequestByRequestId(request_id, id_project)
62
+ return requestService.closeRequestByRequestId(req.params.requestid, req.projectid).then(function(closedRequest) {
63
+
64
+ winston.verbose("request closed", closedRequest);
65
+
66
+ return res.json(closedRequest);
67
+
68
+ });
69
+
70
+
71
+ });
57
72
 
58
73
  module.exports = router;
@@ -0,0 +1,74 @@
1
+
2
+
3
+ 'use strict';
4
+ var global = require('../config/global');
5
+ var email = require('../config/email');
6
+ var winston = require('../config/winston');
7
+
8
+
9
+
10
+
11
+ class OrgUtil {
12
+
13
+ constructor() {
14
+ this.ORGANIZATION_ENABLED = process.env.ORGANIZATION_ENABLED || global.organizationEnabled;
15
+ if (this.ORGANIZATION_ENABLED===true || this.ORGANIZATION_ENABLED === "true") {
16
+ this.ORGANIZATION_ENABLED = true;
17
+ }else {
18
+ this.ORGANIZATION_ENABLED = false;
19
+ }
20
+
21
+ winston.info("Organization enabled: "+ this.ORGANIZATION_ENABLED );
22
+
23
+ this.ORGANIZATION_BASE_URL = process.env.ORGANIZATION_BASE_URL || global.organizationBaseUrl;
24
+ winston.info("Organization base url: "+ this.ORGANIZATION_BASE_URL );
25
+
26
+ }
27
+
28
+ getOrg(req) {
29
+
30
+ // if (this.ORGANIZATION_ENABLED===false) {
31
+ // return undefined;
32
+ // }
33
+
34
+
35
+ // let host = req.get('host');
36
+ // winston.info("host: "+ host );
37
+
38
+ let origin = req.get('origin');
39
+ winston.info("origin: "+ origin );
40
+
41
+ // winston.info("email: " + email.baseUrl);
42
+ winston.info("this.ORGANIZATION_BASE_URL: " + this.ORGANIZATION_BASE_URL);
43
+ // global.organizationBaseUrl
44
+ // if (host !=email.baseUrl ) {
45
+ if (origin && origin.indexOf(this.ORGANIZATION_BASE_URL)>-1) {
46
+ // if (origin!=this.ORGANIZATION_BASE_URL) {
47
+ // winston.info("host found: "+ host );
48
+ // return host;
49
+ winston.info("origin found: "+ origin );
50
+ return origin;
51
+ }
52
+ winston.info("origin not found: "+ origin );
53
+
54
+ // winston.info("host not found: "+ host );
55
+ // if (host.indexOf("localhost1")>-1) {
56
+ // console.log("host found: "+ host );
57
+ // return "localhost";
58
+ // }
59
+ return undefined;
60
+
61
+ }
62
+
63
+
64
+
65
+
66
+
67
+
68
+ }
69
+
70
+
71
+ var orgUtil = new OrgUtil();
72
+
73
+
74
+ module.exports = orgUtil;