From 114aa95048f31c8b0e39e746556a1f59583b8504 Mon Sep 17 00:00:00 2001 From: Diego Sampaio Date: Mon, 4 Jan 2016 11:20:06 -0200 Subject: [PATCH 1/6] get and check roomTypes at template level --- .../rocketchat-lib/client/lib/roomTypes.coffee | 13 +++++++++++-- .../side-nav/sideNav.coffee | 17 ++++++++++------- .../rocketchat-ui-sidenav/side-nav/sideNav.html | 6 ++++++ 3 files changed, 27 insertions(+), 9 deletions(-) diff --git a/packages/rocketchat-lib/client/lib/roomTypes.coffee b/packages/rocketchat-lib/client/lib/roomTypes.coffee index 2e3773a8122..0b7d6c541f4 100644 --- a/packages/rocketchat-lib/client/lib/roomTypes.coffee +++ b/packages/rocketchat-lib/client/lib/roomTypes.coffee @@ -58,12 +58,17 @@ RocketChat.roomTypes = new class return FlowRouter.path roomTypes[roomType].route.name, roomTypes[roomType].route.link(subData) + checkPermission = (roomType) -> + return not roomType.permissions? or RocketChat.authz.hasAtLeastOnePermission roomType.permissions + + checkCondition = (roomType) -> + return not roomType.condition? or roomType.condition() + getAllTypes = -> typesPermitted = [] _.sortBy(roomTypesOrder, 'order').forEach (type) -> - if not roomTypes[type.identifier].permissions? or RocketChat.authz.hasAtLeastOnePermission roomTypes[type.identifier].permissions - typesPermitted.push roomTypes[type.identifier] + typesPermitted.push roomTypes[type.identifier] return typesPermitted @@ -85,4 +90,8 @@ RocketChat.roomTypes = new class # setRoute: setRoute getRouteLink: getRouteLink + checkCondition: checkCondition + + checkPermission: checkPermission + add: add diff --git a/packages/rocketchat-ui-sidenav/side-nav/sideNav.coffee b/packages/rocketchat-ui-sidenav/side-nav/sideNav.coffee index 1f6f5958a07..07a1ecb3cde 100644 --- a/packages/rocketchat-ui-sidenav/side-nav/sideNav.coffee +++ b/packages/rocketchat-ui-sidenav/side-nav/sideNav.coffee @@ -14,6 +14,16 @@ Template.sideNav.helpers return true if favoritesEnabled and hasFavoriteRoomOpened + roomType: -> + console.log 'roomType ->',RocketChat.roomTypes.getTypes() + return RocketChat.roomTypes.getTypes() + + canShowRoomType: -> + return RocketChat.roomTypes.checkPermission(@) and RocketChat.roomTypes.checkCondition(@) + + templateName: -> + return @template + Template.sideNav.events 'click .close-flex': -> SideNav.closeFlex() @@ -36,10 +46,3 @@ Template.sideNav.onRendered -> Meteor.defer -> menu.updateUnreadBars() - - wrapper = $('.rooms-list .wrapper').get(0) - lastLink = $('.rooms-list h3.history-div').get(0) - - RocketChat.roomTypes.getTypes().forEach (roomType) -> - if Template[roomType.template]? - Blaze.render Template[roomType.template], wrapper, lastLink diff --git a/packages/rocketchat-ui-sidenav/side-nav/sideNav.html b/packages/rocketchat-ui-sidenav/side-nav/sideNav.html index 80b0454af9c..20446d87f20 100644 --- a/packages/rocketchat-ui-sidenav/side-nav/sideNav.html +++ b/packages/rocketchat-ui-sidenav/side-nav/sideNav.html @@ -11,6 +11,12 @@
{{ > unreadRooms }} + {{#each roomType}} + {{#if canShowRoomType}} + {{> Template.dynamic template=templateName }} + {{/if}} + {{/each}} +

{{_ "History"}}

From 30bf990cb34e61816e3a071d28285177c9341f96 Mon Sep 17 00:00:00 2001 From: Diego Sampaio Date: Mon, 4 Jan 2016 13:11:36 -0200 Subject: [PATCH 2/6] removed permission paremeter from roomTypes and accountBox now it only on `condition` parameter which implements their own logic, including checking for permission =) --- client/startup/defaultRoomTypes.coffee | 9 ++++--- packages/rocketchat-lib/README.md | 20 +++++---------- .../client/lib/roomTypes.coffee | 25 +++---------------- packages/rocketchat-livechat/client/ui.js | 8 ++++-- .../side-nav/sideNav.coffee | 2 +- packages/rocketchat-ui/lib/accountBox.coffee | 5 +++- 6 files changed, 27 insertions(+), 42 deletions(-) diff --git a/client/startup/defaultRoomTypes.coffee b/client/startup/defaultRoomTypes.coffee index 832cbd2f21c..b4fc8f3b6c6 100644 --- a/client/startup/defaultRoomTypes.coffee +++ b/client/startup/defaultRoomTypes.coffee @@ -13,7 +13,8 @@ RocketChat.roomTypes.add 'c', 10, openRoom 'c', params.name link: (sub) -> return { name: sub.name } - permissions: [ 'view-c-room' ] + condition: -> + return RocketChat.authz.hasAllPermission 'view-c-room' RocketChat.roomTypes.add 'd', 20, template: 'directMessages' @@ -26,7 +27,8 @@ RocketChat.roomTypes.add 'd', 20, openRoom 'd', params.username link: (sub) -> return { username: sub.name } - permissions: [ 'view-d-room' ] + condition: -> + return RocketChat.authz.hasAllPermission 'view-d-room' RocketChat.roomTypes.add 'p', 30, template: 'privateGroups' @@ -39,4 +41,5 @@ RocketChat.roomTypes.add 'p', 30, openRoom 'p', params.name link: (sub) -> return { name: sub.name } - permissions: [ 'view-p-room' ] + condition: -> + return RocketChat.authz.hasAllPermission 'view-p-room' diff --git a/packages/rocketchat-lib/README.md b/packages/rocketchat-lib/README.md index 6bd81b7d793..68ab59d17c7 100644 --- a/packages/rocketchat-lib/README.md +++ b/packages/rocketchat-lib/README.md @@ -66,7 +66,9 @@ RocketChat.roomTypes.add('l', 5, { return { name: sub.name } } }, - permissions: [ 'view-l-room' ] + condition: () => { + return RocketChat.authz.hasAllPermission('view-l-room'); + } }); ``` @@ -95,19 +97,9 @@ AccountBox.addItem({ name: 'Livechat', icon: 'icon-chat-empty', class: 'livechat-manager', - route: { - name: 'livechat-manager', - path: '/livechat-manager', - action(params, queryParams) { - Session.set('openedRoom'); - BlazeLayout.render('main', { - center: 'page-container', - pageTitle: 'Live Chat Manager', - pageTemplate: 'livechat-manager' - }); - } - }, - permissions: ['view-livechat-manager'] + condition: () => { + return RocketChat.authz.hasAllPermission('view-livechat-manager'); + } }); ``` diff --git a/packages/rocketchat-lib/client/lib/roomTypes.coffee b/packages/rocketchat-lib/client/lib/roomTypes.coffee index 0b7d6c541f4..02843ea4702 100644 --- a/packages/rocketchat-lib/client/lib/roomTypes.coffee +++ b/packages/rocketchat-lib/client/lib/roomTypes.coffee @@ -3,23 +3,11 @@ RocketChat.roomTypes = new class roomTypes = {} mainOrder = 1 - protectedAction = (item) -> - # if not item.permissions? or RocketChat.authz.hasAtLeastOnePermission item.permissions - return item.route.action - - # return -> - # BlazeLayout.render 'main', - # center: 'pageContainer' - # # @TODO text Not_authorized don't get the correct language - # pageTitle: t('Not_authorized') - # pageTemplate: 'notAuthorized' - ### Adds a room type to app @param identifier An identifier to the room type. If a real room, MUST BE the same of `db.rocketchat_room.t` field, if not, can be null @param order Order number of the type @param config template: template name to render on sideNav - permissions: list of permissions to see the sideNav template icon: icon class route: name: route name @@ -45,7 +33,7 @@ RocketChat.roomTypes = new class if config.route?.path? and config.route?.name? and config.route?.action? FlowRouter.route config.route.path, name: config.route.name - action: protectedAction config + action: config.route.action triggersExit: [roomExit] ### @@ -58,19 +46,16 @@ RocketChat.roomTypes = new class return FlowRouter.path roomTypes[roomType].route.name, roomTypes[roomType].route.link(subData) - checkPermission = (roomType) -> - return not roomType.permissions? or RocketChat.authz.hasAtLeastOnePermission roomType.permissions - checkCondition = (roomType) -> return not roomType.condition? or roomType.condition() getAllTypes = -> - typesPermitted = [] + orderedTypes = [] _.sortBy(roomTypesOrder, 'order').forEach (type) -> - typesPermitted.push roomTypes[type.identifier] + orderedTypes.push roomTypes[type.identifier] - return typesPermitted + return orderedTypes getIcon = (roomType) -> return roomTypes[roomType]?.icon @@ -92,6 +77,4 @@ RocketChat.roomTypes = new class checkCondition: checkCondition - checkPermission: checkPermission - add: add diff --git a/packages/rocketchat-livechat/client/ui.js b/packages/rocketchat-livechat/client/ui.js index f23b438a912..a2fc414d9f1 100644 --- a/packages/rocketchat-livechat/client/ui.js +++ b/packages/rocketchat-livechat/client/ui.js @@ -14,7 +14,9 @@ RocketChat.roomTypes.add('l', 5, { } } }, - permissions: ['view-l-room'] + condition: () => { + return RocketChat.settings.get('Livechat_enabled') && RocketChat.authz.hasAllPermission('view-l-room'); + } }); AccountBox.addItem({ @@ -22,5 +24,7 @@ AccountBox.addItem({ icon: 'icon-chat-empty', href: 'livechat-users', sideNav: 'livechatFlex', - permissions: ['view-livechat-manager'], + condition: () => { + return RocketChat.settings.get('Livechat_enabled') && RocketChat.authz.hasAllPermission('view-livechat-manager'); + }, }); diff --git a/packages/rocketchat-ui-sidenav/side-nav/sideNav.coffee b/packages/rocketchat-ui-sidenav/side-nav/sideNav.coffee index 07a1ecb3cde..7f7b55970dc 100644 --- a/packages/rocketchat-ui-sidenav/side-nav/sideNav.coffee +++ b/packages/rocketchat-ui-sidenav/side-nav/sideNav.coffee @@ -19,7 +19,7 @@ Template.sideNav.helpers return RocketChat.roomTypes.getTypes() canShowRoomType: -> - return RocketChat.roomTypes.checkPermission(@) and RocketChat.roomTypes.checkCondition(@) + return RocketChat.roomTypes.checkCondition(@) templateName: -> return @template diff --git a/packages/rocketchat-ui/lib/accountBox.coffee b/packages/rocketchat-ui/lib/accountBox.coffee index 79e61faff4a..2f33fe14207 100644 --- a/packages/rocketchat-ui/lib/accountBox.coffee +++ b/packages/rocketchat-ui/lib/accountBox.coffee @@ -41,9 +41,12 @@ actual.push newItem items.set actual + checkCondition = (item) -> + return not item.condition? or item.condition() + getItems = -> return _.filter items.get(), (item) -> - if not item.permissions? or RocketChat.authz.hasAllPermission item.permissions + if checkCondition(item) return true addRoute = (newRoute, router = FlowRouter) -> From 1e93b16396ba89645aea8a37e19f332ae1c75df2 Mon Sep 17 00:00:00 2001 From: Diego Sampaio Date: Mon, 4 Jan 2016 13:12:48 -0200 Subject: [PATCH 3/6] disabling livechat by default --- packages/rocketchat-livechat/config.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/rocketchat-livechat/config.js b/packages/rocketchat-livechat/config.js index fe222ec585f..424768e39a9 100644 --- a/packages/rocketchat-livechat/config.js +++ b/packages/rocketchat-livechat/config.js @@ -2,6 +2,6 @@ Meteor.startup(function() { RocketChat.settings.addGroup('Livechat'); RocketChat.settings.add('Livechat_title' , 'Rocket.Chat', { type: 'string', group: 'Livechat', public: true }); RocketChat.settings.add('Livechat_title_color' , '#C1272D', { type: 'string', group: 'Livechat', public: true }); - RocketChat.settings.add('Livechat_enabled' , true, { type: 'boolean', group: 'Livechat', public: true }); + RocketChat.settings.add('Livechat_enabled' , false, { type: 'boolean', group: 'Livechat', public: true }); RocketChat.settings.add('Livechat_registration_form' , true, { type: 'boolean', group: 'Livechat', public: true, i18nLabel: 'Show_preregistration_form' }); }); From 52b72a5ef8fd6f1ae42a51ddbf9ee1b2a20f15af Mon Sep 17 00:00:00 2001 From: Diego Sampaio Date: Mon, 4 Jan 2016 13:13:01 -0200 Subject: [PATCH 4/6] adding livechat package as default --- .meteor/packages | 2 +- .meteor/versions | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/.meteor/packages b/.meteor/packages index 2e0df8c465d..d045992b1c4 100644 --- a/.meteor/packages +++ b/.meteor/packages @@ -83,7 +83,7 @@ rocketchat:wordpress #rocketchat:chatops #rocketchat:hubot #rocketchat:irc -#rocketchat:livechat +rocketchat:livechat konecty:change-case konecty:delayed-task diff --git a/.meteor/versions b/.meteor/versions index 3aa07540ddb..5124ef1fc47 100644 --- a/.meteor/versions +++ b/.meteor/versions @@ -138,6 +138,7 @@ rocketchat:highlight@0.0.1 rocketchat:integrations@0.0.1 rocketchat:ldap@0.0.1 rocketchat:lib@0.0.1 +rocketchat:livechat@0.0.1 rocketchat:logger@0.0.1 rocketchat:mailer@0.0.1 rocketchat:markdown@0.0.1 From 4c03559baf16d89bb0e94ab101a0f7be5f540e2a Mon Sep 17 00:00:00 2001 From: Diego Sampaio Date: Mon, 4 Jan 2016 13:13:47 -0200 Subject: [PATCH 5/6] code cleanup --- packages/rocketchat-ui-sidenav/side-nav/sideNav.coffee | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/rocketchat-ui-sidenav/side-nav/sideNav.coffee b/packages/rocketchat-ui-sidenav/side-nav/sideNav.coffee index 7f7b55970dc..8b1bfb25b6c 100644 --- a/packages/rocketchat-ui-sidenav/side-nav/sideNav.coffee +++ b/packages/rocketchat-ui-sidenav/side-nav/sideNav.coffee @@ -15,7 +15,6 @@ Template.sideNav.helpers return true if favoritesEnabled and hasFavoriteRoomOpened roomType: -> - console.log 'roomType ->',RocketChat.roomTypes.getTypes() return RocketChat.roomTypes.getTypes() canShowRoomType: -> From ab69fdd575521ec1611c83848a77fbd63161bc8f Mon Sep 17 00:00:00 2001 From: Diego Sampaio Date: Mon, 4 Jan 2016 14:09:19 -0200 Subject: [PATCH 6/6] fix getting livechat agent with no department --- .../server/models/LivechatDepartmentAgents.js | 10 +++++++++- packages/rocketchat-livechat/server/models/Users.js | 10 +++++++++- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/packages/rocketchat-livechat/server/models/LivechatDepartmentAgents.js b/packages/rocketchat-livechat/server/models/LivechatDepartmentAgents.js index a4d56fa7ba8..551a00e1aeb 100644 --- a/packages/rocketchat-livechat/server/models/LivechatDepartmentAgents.js +++ b/packages/rocketchat-livechat/server/models/LivechatDepartmentAgents.js @@ -64,7 +64,15 @@ class LivechatDepartmentAgents extends RocketChat.models._Base { var collectionObj = this.model.rawCollection(); var findAndModify = Meteor.wrapAsync(collectionObj.findAndModify, collectionObj); - return findAndModify(query, sort, update); + var agent = findAndModify(query, sort, update); + if (agent) { + return { + agentId: agent.agentId, + username: agent.username + } + } else { + return null; + } } } diff --git a/packages/rocketchat-livechat/server/models/Users.js b/packages/rocketchat-livechat/server/models/Users.js index a485e921c2f..0c3d85af0a0 100644 --- a/packages/rocketchat-livechat/server/models/Users.js +++ b/packages/rocketchat-livechat/server/models/Users.js @@ -69,7 +69,15 @@ RocketChat.models.Users.getNextAgent = function() { } }; - return findAndModify(query, sort, update); + var user = findAndModify(query, sort, update); + if (user) { + return { + agentId: user._id, + username: user.username + } + } else { + return null; + } }; /**