diff --git a/.circleci/config.yml b/.circleci/config.yml index 7aa205b1103c..4dd71940190c 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -43,7 +43,7 @@ test-save-npm-cache: &test-save-npm-cache - ./node_modules test-docker-image: &test-docker-image - circleci/node:8.11-stretch-browsers + circleci/node:8.15-stretch-browsers test-with-oplog: &test-with-oplog <<: *defaults @@ -68,7 +68,7 @@ jobs: build: <<: *defaults docker: - - image: circleci/node:8.11-stretch + - image: circleci/node:8.15-stretch - image: mongo:3.4 steps: @@ -133,6 +133,16 @@ jobs: keys: - meteor-cache-{{ checksum ".circleci/config.yml" }}-{{ checksum ".meteor/versions" }} + # To reduce memory need during actual build, build the packages solely first + - run: + name: Build a Meteor cache + command: | + # to do this we can clear the main files and it build the rest + echo "" > server/main.js + echo "" > client/main.js + meteor build --server-only --debug --directory /tmp/build-temp + git checkout -- server/main.js client/main.js + - run: name: Build Rocket.Chat environment: @@ -208,7 +218,7 @@ jobs: deploy: <<: *defaults docker: - - image: circleci/node:8.11-stretch + - image: circleci/node:8.15-stretch steps: - attach_workspace: @@ -322,7 +332,7 @@ jobs: pr-build: <<: *defaults docker: - - image: circleci/node:8.11-stretch + - image: circleci/node:8.15-stretch steps: - checkout diff --git a/.docker/Dockerfile.rhel b/.docker/Dockerfile.rhel index 1e5b6a10ee4a..c6ed30dc859e 100644 --- a/.docker/Dockerfile.rhel +++ b/.docker/Dockerfile.rhel @@ -1,6 +1,6 @@ FROM registry.access.redhat.com/rhscl/nodejs-8-rhel7 -ENV RC_VERSION 2.0.0 +ENV RC_VERSION 2.1.0 MAINTAINER buildmaster@rocket.chat diff --git a/.github/history.json b/.github/history.json index 5e8e739fd0e2..3f9317681c70 100644 --- a/.github/history.json +++ b/.github/history.json @@ -34597,6 +34597,725 @@ ] } ] + }, + "2.1.0-rc.0": { + "node_version": "8.15.1", + "npm_version": "6.9.0", + "mongo_versions": [ + "3.4", + "3.6", + "4.0" + ], + "pull_requests": [ + { + "pr": "15420", + "title": "[IMPROVE] Change default user's preference for notifications to 'All messages'", + "userLogin": "sampaiodiego", + "milestone": "2.1.0", + "contributors": [ + "sampaiodiego" + ] + }, + { + "pr": "15389", + "title": "[FIX] Delivering real-time messages to users that left a room", + "userLogin": "MarcosSpessatto", + "milestone": "2.1.0", + "contributors": [ + "MarcosSpessatto" + ] + }, + { + "pr": "14626", + "title": "[NEW] Apps engine Livechat", + "userLogin": "d-gubert", + "milestone": "2.1.0", + "contributors": [ + "d-gubert", + "web-flow", + "rodrigok" + ] + }, + { + "pr": "15216", + "title": "[NEW] Livechat setting to show/hide Agent Information on the widget", + "userLogin": "renatobecker", + "milestone": "2.1.0", + "contributors": [ + "renatobecker", + "web-flow" + ] + }, + { + "pr": "15418", + "title": "[FIX] Federation messages notifications", + "userLogin": "alansikora", + "contributors": [ + "alansikora", + "sampaiodiego", + "web-flow" + ] + }, + { + "pr": "15404", + "title": "[NEW] SAML User Data Mapping", + "userLogin": "pierre-lehnen-rc", + "milestone": "2.1.0", + "contributors": [ + "pierre-lehnen-rc", + "sampaiodiego", + "web-flow" + ] + }, + { + "pr": "14741", + "title": "[FIX] Property \"permission\" in slash commands of custom apps (#14739)", + "userLogin": "ifantom", + "milestone": "2.1.0", + "contributors": [ + "ifantom", + "web-flow", + "d-gubert" + ] + }, + { + "pr": "9667", + "title": "[NEW] Add ability to disable email notifications globally", + "userLogin": "ferdifly", + "milestone": "2.1.0", + "contributors": [ + "ferdifly", + "web-flow", + "MarcosSpessatto", + "sampaiodiego" + ] + }, + { + "pr": "15413", + "title": "Regression: Prevent parsing empty custom field setting", + "userLogin": "MarcosSpessatto", + "milestone": "2.1.0", + "contributors": [ + "MarcosSpessatto" + ] + }, + { + "pr": "15387", + "title": "[FIX] Notify admin was generating errors when Rocket.Cat user was edited or deleted", + "userLogin": "rodrigok", + "milestone": "2.1.0", + "contributors": [ + "rodrigok" + ] + }, + { + "pr": "15226", + "title": "[NEW] Validate NotBefore and NotOnOrAfter SAML assertions", + "userLogin": "Hudell", + "contributors": [ + "pierre-lehnen-rc", + "web-flow", + "sampaiodiego" + ] + }, + { + "pr": "15229", + "title": "[NEW] Setting to configure SAML context comparison", + "userLogin": "Hudell", + "contributors": [ + "pierre-lehnen-rc", + "web-flow", + "sampaiodiego" + ] + }, + { + "pr": "15414", + "title": "[IMPROVE] Remove global Blaze helpers", + "userLogin": "tassoevan", + "milestone": "2.1.0", + "contributors": [ + "tassoevan" + ] + }, + { + "pr": "15294", + "title": "[IMPROVE] User data export", + "userLogin": "Hudell", + "milestone": "2.1.0", + "contributors": [ + "Hudell", + "pierre-lehnen-rc" + ] + }, + { + "pr": "15412", + "title": "[FIX] Fix file uploads JWT", + "userLogin": "MarcosSpessatto", + "milestone": "2.1.0", + "contributors": [ + "MarcosSpessatto", + "renatobecker", + "web-flow" + ] + }, + { + "pr": "15405", + "title": "[IMPROVE] A11y: Buttons, Images, Popups", + "userLogin": "tassoevan", + "milestone": "2.1.0", + "contributors": [ + "tassoevan", + "web-flow" + ] + }, + { + "pr": "15401", + "title": "[IMPROVE] Administration UI", + "userLogin": "tassoevan", + "contributors": [ + "tassoevan" + ] + }, + { + "pr": "15409", + "title": "[FIX] Double send bug on message box", + "userLogin": "tassoevan", + "milestone": "2.1.0", + "contributors": [ + "tassoevan" + ] + }, + { + "pr": "15252", + "title": "[FIX] Prune messages by cron if room not updated", + "userLogin": "ggazzo", + "milestone": "2.1.0", + "contributors": [ + "ggazzo", + "sampaiodiego", + "web-flow" + ] + }, + { + "pr": "15277", + "title": "[NEW] Expand SAML Users Role Settings", + "userLogin": "Hudell", + "contributors": [ + "Hudell", + "sampaiodiego", + "web-flow" + ] + }, + { + "pr": "15240", + "title": "[NEW] Guess a user's name from SAML credentials", + "userLogin": "mrsimpson", + "milestone": "2.1.0", + "contributors": [ + "mrsimpson", + "sampaiodiego", + "web-flow" + ] + }, + { + "pr": "14544", + "title": "[FIX] Subscription record not having the `ls` field", + "userLogin": "MarcosSpessatto", + "milestone": "2.1.0", + "contributors": [ + "MarcosSpessatto" + ] + }, + { + "pr": "15322", + "title": "[BREAK] Deprecate old CORS API access for Cordova mobile app", + "userLogin": "rodrigok", + "milestone": "2.1.0", + "contributors": [ + "rodrigok", + "web-flow" + ] + }, + { + "pr": "15346", + "title": "[FIX] CAS users can take control of Rocket.Chat accounts", + "userLogin": "pierre-lehnen-rc", + "milestone": "2.1.0", + "contributors": [ + "pierre-lehnen-rc" + ] + }, + { + "pr": "15406", + "title": "[NEW] Setting to remove message contents from email notifications", + "userLogin": "pierre-lehnen-rc", + "contributors": [ + "pierre-lehnen-rc" + ] + }, + { + "pr": "15334", + "title": "[FIX] Add ENV VAR to enable users create token feature", + "userLogin": "MarcosSpessatto", + "milestone": "2.1.0", + "contributors": [ + "MarcosSpessatto" + ] + }, + { + "pr": "15292", + "title": "[FIX] REST API to return only public custom fields", + "userLogin": "MarcosSpessatto", + "milestone": "2.1.0", + "contributors": [ + "MarcosSpessatto" + ] + }, + { + "pr": "15400", + "title": "[IMPROVE] Make the agents field optional when updating Livechat departments", + "userLogin": "renatobecker", + "milestone": "2.1.0", + "contributors": [ + "renatobecker", + "web-flow" + ] + }, + { + "pr": "15288", + "title": "[FIX] REST endpoint `users.setPreferences` to not override all user's preferences", + "userLogin": "MarcosSpessatto", + "milestone": "2.1.0", + "contributors": [ + "MarcosSpessatto" + ] + }, + { + "pr": "14644", + "title": "[FIX] LDAP usernames get additional '.' if they contain numbers", + "userLogin": "Hudell", + "milestone": "2.1.0", + "contributors": [ + "pierre-lehnen-rc", + "Hudell" + ] + }, + { + "pr": "15339", + "title": "[FIX] Don't allow email violating whitelist addresses", + "userLogin": "MarcosSpessatto", + "milestone": "2.1.0", + "contributors": [ + "MarcosSpessatto" + ] + }, + { + "pr": "15327", + "title": "[FIX] Limit exposed fields on some users. endpoints", + "userLogin": "MarcosSpessatto", + "milestone": "2.1.0", + "contributors": [ + "MarcosSpessatto" + ] + }, + { + "pr": "15364", + "title": "Use version 2 of the DeepL API", + "userLogin": "vickyokrm", + "contributors": [ + "vickyokrm" + ] + }, + { + "pr": "15356", + "title": "Remove GraphQL dependencies left", + "userLogin": "MarcosSpessatto", + "contributors": [ + "MarcosSpessatto", + "sampaiodiego" + ] + }, + { + "pr": "15392", + "title": "[FIX] Empty custom emojis on emoji picker", + "userLogin": "sampaiodiego", + "milestone": "2.1.0", + "contributors": [ + "sampaiodiego" + ] + }, + { + "pr": "15297", + "title": "[NEW] Add JWT to uploaded files urls", + "userLogin": "MarcosSpessatto", + "milestone": "2.1.0", + "contributors": [ + "MarcosSpessatto", + "renatobecker", + "web-flow" + ] + }, + { + "pr": "15384", + "title": "[Fix] Missing space between last username & 'and' word in react notification", + "userLogin": "zdumitru", + "milestone": "2.1.0", + "contributors": [ + "zdumitru", + "web-flow" + ] + }, + { + "pr": "15385", + "title": "[FIX] User Profile Time Format", + "userLogin": "MartinSchoeler", + "milestone": "2.1.0", + "contributors": [ + "MartinSchoeler" + ] + }, + { + "pr": "14029", + "title": "Add a missing 'Discussion' translation key", + "userLogin": "ura14h", + "contributors": [ + "ura14h", + "web-flow", + "sampaiodiego" + ] + }, + { + "pr": "14060", + "title": "Improve Polish translation", + "userLogin": "stepek", + "contributors": [ + "stepek", + "web-flow", + "sampaiodiego" + ] + }, + { + "pr": "15382", + "title": "[FIX] Grammatical error in Not Found page", + "userLogin": "tassoevan", + "milestone": "2.1.0", + "contributors": [ + "tassoevan" + ] + }, + { + "pr": "15380", + "title": "Regression: Messagebox height changing when typing", + "userLogin": "MartinSchoeler", + "milestone": "2.1.0", + "contributors": [ + "MartinSchoeler" + ] + }, + { + "pr": "15377", + "title": "LingoHub based on develop", + "userLogin": "engelgabriel", + "contributors": [ + "sampaiodiego" + ] + }, + { + "pr": "15260", + "title": "[IMPROVE] Replace LESS autoprefixer plugin", + "userLogin": "tassoevan", + "milestone": "2.1.0", + "contributors": [ + "tassoevan" + ] + }, + { + "pr": "15368", + "title": "Regression: Fix DDP metrics", + "userLogin": "sampaiodiego", + "milestone": "2.1.0", + "contributors": [ + "sampaiodiego" + ] + }, + { + "pr": "15365", + "title": "[FIX] Set the DEFAULT_ECDH_CURVE to auto (#15245)", + "userLogin": "dlundgren", + "contributors": [ + "dlundgren" + ] + }, + { + "pr": "15367", + "title": "[FIX] Message box not centered", + "userLogin": "MartinSchoeler", + "contributors": [ + "MartinSchoeler" + ] + }, + { + "pr": "15316", + "title": "[IMPROVE] Add missing indices used by read receipts", + "userLogin": "sampaiodiego", + "milestone": "2.1.0", + "contributors": [ + "sampaiodiego" + ] + }, + { + "pr": "15255", + "title": "[CHORE] Move pathFor helper to templateHelpers directory", + "userLogin": "tassoevan", + "milestone": "2.1.0", + "contributors": [ + "tassoevan", + "web-flow" + ] + }, + { + "pr": "15122", + "title": "[IMPROVE] Add possibility of renaming a discussion", + "userLogin": "MarcosSpessatto", + "milestone": "2.1.0", + "contributors": [ + "MarcosSpessatto" + ] + }, + { + "pr": "15228", + "title": "Fix typo in LDAP User Search setting description", + "userLogin": "Hudell", + "contributors": [ + "pierre-lehnen-rc" + ] + }, + { + "pr": "15238", + "title": "[NEW] Provide site-url to outgoing integrations", + "userLogin": "mrsimpson", + "milestone": "2.1.0", + "contributors": [ + "mrsimpson", + "web-flow" + ] + }, + { + "pr": "15307", + "title": "Remove log ADMIN_PASS environment variable", + "userLogin": "geekgonecrazy", + "milestone": "2.1.0", + "contributors": [ + "geekgonecrazy", + "web-flow" + ] + }, + { + "pr": "15353", + "title": "Improve text of the search bar description", + "userLogin": "rodrigok", + "milestone": "2.1.0", + "contributors": [ + "rodrigok" + ] + }, + { + "pr": "15355", + "title": "[IMPROVE] AvatarBlockUnauthenticatedAccess do not call user.find if you dont have to", + "userLogin": "ggazzo", + "milestone": "2.1.0", + "contributors": [ + "ggazzo" + ] + }, + { + "pr": "15340", + "title": "[IMPROVE] improve autolinker flow", + "userLogin": "ggazzo", + "milestone": "2.1.0", + "contributors": [ + "ggazzo" + ] + }, + { + "pr": "15351", + "title": "[NEW] Only Load CodeMirror code when it is needed", + "userLogin": "MartinSchoeler", + "milestone": "2.1.0", + "contributors": [ + "MartinSchoeler" + ] + }, + { + "pr": "15056", + "title": "[FIX] Duplicate Channels in Search-bar", + "userLogin": "ggazzo", + "milestone": "2.1.0", + "contributors": [ + "ggazzo" + ] + }, + { + "pr": "15256", + "title": "[IMPROVE] Add CustomSounds.play() helper", + "userLogin": "tassoevan", + "milestone": "2.1.0", + "contributors": [ + "tassoevan", + "ggazzo", + "web-flow" + ] + }, + { + "pr": "15295", + "title": "[FIX] Reduce Message cache time to 500ms", + "userLogin": "vickyokrm", + "milestone": "2.1.0", + "contributors": [ + "vickyokrm", + "web-flow" + ] + }, + { + "pr": "15257", + "title": "[CHORE] Remove obsolete modal template", + "userLogin": "tassoevan", + "milestone": "2.1.0", + "contributors": [ + "tassoevan" + ] + }, + { + "pr": "15358", + "title": "Update Meteor to 1.8.1", + "userLogin": "sampaiodiego", + "contributors": [ + "sampaiodiego" + ] + }, + { + "pr": "15357", + "title": "Merge master into develop & Set version to 2.1.0-develop", + "userLogin": "sampaiodiego", + "contributors": [ + "ggazzo", + "sampaiodiego", + "MarcosSpessatto", + "web-flow", + "renatobecker", + "tassoevan" + ] + } + ] + }, + "2.1.0-rc.1": { + "node_version": "8.15.1", + "npm_version": "6.9.0", + "mongo_versions": [ + "3.4", + "3.6", + "4.0" + ], + "pull_requests": [ + { + "pr": "15415", + "title": "[NEW] Allow file sharing through Twilio(WhatsApp) integration", + "userLogin": "renatobecker", + "milestone": "2.1.0", + "contributors": [ + "renatobecker", + "web-flow" + ] + }, + { + "pr": "15437", + "title": "Regression: Fix invalid version string error on marketplace screen", + "userLogin": "d-gubert", + "milestone": "2.1.0", + "contributors": [ + "d-gubert" + ] + }, + { + "pr": "15436", + "title": "Regression: Fix Commit Section when there is no commit info", + "userLogin": "sampaiodiego", + "milestone": "2.1.0", + "contributors": [ + "sampaiodiego" + ] + }, + { + "pr": "15432", + "title": "Regression: setup wizard dynamic import using relative url", + "userLogin": "ggazzo", + "milestone": "2.1.0", + "contributors": [ + "ggazzo", + "web-flow" + ] + }, + { + "pr": "15426", + "title": "Regression: Favorite room button", + "userLogin": "tassoevan", + "milestone": "2.1.0", + "contributors": [ + "tassoevan" + ] + } + ] + }, + "2.1.0-rc.2": { + "node_version": "8.15.1", + "npm_version": "6.9.0", + "mongo_versions": [ + "3.4", + "3.6", + "4.0" + ], + "pull_requests": [ + { + "pr": "15443", + "title": "Regression: API CORS not working after Cordova being disabled by default", + "userLogin": "rodrigok", + "milestone": "2.1.0", + "contributors": [ + "rodrigok", + "web-flow" + ] + } + ] + }, + "2.1.0-rc.3": { + "node_version": "8.15.1", + "npm_version": "6.9.0", + "mongo_versions": [ + "3.4", + "3.6", + "4.0" + ], + "pull_requests": [ + { + "pr": "15458", + "title": "Update Apps-Engine version to final version", + "userLogin": "d-gubert", + "milestone": "2.1.0", + "contributors": [ + "d-gubert" + ] + } + ] + }, + "2.1.0": { + "node_version": "8.15.1", + "npm_version": "6.9.0", + "mongo_versions": [ + "3.4", + "3.6", + "4.0" + ], + "pull_requests": [] } } } \ No newline at end of file diff --git a/.meteor/packages b/.meteor/packages index edd6c63744fe..263feae546d3 100644 --- a/.meteor/packages +++ b/.meteor/packages @@ -15,32 +15,31 @@ blaze-html-templates check@1.3.1 ddp-rate-limiter@1.0.7 ddp-common@1.4.0 -dynamic-import@0.5.0 +dynamic-import@0.5.1 ecmascript@0.12.4 ejson@1.1.0 email@1.2.3 fastclick@1.0.13 -http@1.4.1 +http@1.4.2 jquery@1.11.10 logging@1.1.20 meteor-base@1.4.0 mobile-experience@1.0.5 -mongo@1.6.0 +mongo@1.6.2 random@1.1.0 rate-limit@1.0.9 -reactive-dict@1.2.1 +reactive-dict@1.3.0 reactive-var@1.0.11 -reload@1.2.0 +reload@1.3.0 service-configuration@1.0.11 session@1.2.0 shell-server@0.4.0 spacebars -standard-minifier-js@2.4.0 +standard-minifier-js@2.4.1 tracker@1.2.0 #rocketchat:google-natural-language rocketchat:livechat -rocketchat:monitoring rocketchat:streamer rocketchat:version @@ -78,22 +77,22 @@ littledata:synced-cron edgee:slingshot jalik:ufs-local@0.2.5 -accounts-base -accounts-oauth -autoupdate -babel-compiler -google-oauth +accounts-base@1.4.3 +accounts-oauth@1.1.16 +autoupdate@1.6.0 +babel-compiler@7.3.4 +google-oauth@1.2.6 htmljs less matb33:collection-hooks meteorhacks:inject-initial -oauth -oauth2 +oauth@1.2.8 +oauth2@1.2.1 raix:eventemitter -routepolicy -sha +routepolicy@1.1.0 +sha@1.0.9 templating -webapp -webapp-hashing +webapp@1.7.3 +webapp-hashing@1.0.9 rocketchat:oauth2-server rocketchat:i18n diff --git a/.meteor/release b/.meteor/release index 91e05fc15b2f..97064e19937b 100644 --- a/.meteor/release +++ b/.meteor/release @@ -1 +1 @@ -METEOR@1.8.0.2 +METEOR@1.8.1 diff --git a/.meteor/versions b/.meteor/versions index 5aa729937ae5..4f242ffbf31d 100644 --- a/.meteor/versions +++ b/.meteor/versions @@ -1,17 +1,17 @@ -accounts-base@1.4.3 +accounts-base@1.4.4 accounts-facebook@1.3.2 accounts-github@1.4.2 -accounts-google@1.3.2 +accounts-google@1.3.3 accounts-meteor-developer@1.4.2 accounts-oauth@1.1.16 accounts-password@1.5.1 accounts-twitter@1.4.2 aldeed:simple-schema@1.5.4 allow-deny@1.1.0 -autoupdate@1.5.0 -babel-compiler@7.2.4 +autoupdate@1.6.0 +babel-compiler@7.3.4 babel-runtime@1.3.0 -base64@1.0.11 +base64@1.0.12 binary-heap@1.0.11 blaze@2.3.3 blaze-html-templates@1.1.2 @@ -28,13 +28,13 @@ ddp@1.4.0 ddp-client@2.3.3 ddp-common@1.4.0 ddp-rate-limiter@1.0.7 -ddp-server@2.2.0 +ddp-server@2.3.0 deepwell:bootstrap-datepicker2@1.3.0 deps@1.0.12 diff-sequence@1.1.1 dispatch:run-as-user@1.1.1 dynamic-import@0.5.1 -ecmascript@0.12.4 +ecmascript@0.12.7 ecmascript-runtime@0.7.0 ecmascript-runtime-client@0.8.0 ecmascript-runtime-server@0.7.1 @@ -42,9 +42,9 @@ edgee:slingshot@0.7.1 ejson@1.1.0 email@1.2.3 es5-shim@4.8.0 -facebook-oauth@1.5.0 +facebook-oauth@1.6.0 fastclick@1.0.13 -fetch@0.1.0 +fetch@0.1.1 geojson-utils@1.0.10 github-oauth@1.2.2 google-oauth@1.2.6 @@ -78,24 +78,23 @@ localstorage@1.2.0 logging@1.1.20 matb33:collection-hooks@0.8.4 mdg:validation-error@0.5.1 -meteor@1.9.2 +meteor@1.9.3 meteor-base@1.4.0 meteor-developer-oauth@1.2.1 meteorhacks:inject-initial@1.0.4 -meteorhacks:meteorx@1.4.1 meteorspark:util@0.2.0 -minifier-css@1.4.1 -minifier-js@2.4.0 +minifier-css@1.4.2 +minifier-js@2.4.1 minimongo@1.4.5 mizzao:autocomplete@0.5.1 mizzao:timesync@0.3.4 mobile-experience@1.0.5 mobile-status-bar@1.0.14 -modern-browsers@0.1.3 +modern-browsers@0.1.4 modules@0.13.0 modules-runtime@0.10.3 -mongo@1.6.0 -mongo-decimal@0.1.0 +mongo@1.6.3 +mongo-decimal@0.1.1 mongo-dev-server@1.1.0 mongo-id@1.0.7 mongo-livedata@1.0.12 @@ -104,13 +103,13 @@ mystor:device-detection@0.2.0 nimble:restivus@0.8.12 nooitaf:colors@1.1.2_1 npm-bcrypt@0.9.3 -npm-mongo@3.1.1 -oauth@1.2.7 +npm-mongo@3.1.2 +oauth@1.2.8 oauth1@1.2.2 oauth2@1.2.1 observe-sequence@1.0.16 ordered-dict@1.1.0 -ostrio:cookies@2.3.0 +ostrio:cookies@2.4.0 pauli:accounts-linkedin@5.0.0 pauli:linkedin-oauth@5.0.0 promise@0.11.2 @@ -120,14 +119,13 @@ raix:handlebar-helpers@0.2.5 raix:ui-dropped-event@0.0.7 random@1.1.0 rate-limit@1.0.9 -reactive-dict@1.2.1 +reactive-dict@1.3.0 reactive-var@1.0.11 -reload@1.2.0 +reload@1.3.0 retry@1.1.0 rocketchat:i18n@0.0.1 rocketchat:livechat@0.0.1 rocketchat:mongo-config@0.0.1 -rocketchat:monitoring@2.30.2_3 rocketchat:oauth2-server@2.1.0 rocketchat:push@3.3.1 rocketchat:streamer@1.0.2 @@ -143,7 +141,7 @@ socket-stream-client@0.2.2 spacebars@1.0.15 spacebars-compiler@1.1.3 srp@1.0.12 -standard-minifier-js@2.4.0 +standard-minifier-js@2.4.1 templating@1.3.2 templating-compiler@1.3.3 templating-runtime@1.3.2 @@ -155,5 +153,5 @@ twitter-oauth@1.2.0 ui@1.0.13 underscore@1.0.10 url@1.2.0 -webapp@1.7.2 +webapp@1.7.4 webapp-hashing@1.0.9 diff --git a/.postcssrc b/.postcssrc index 3816f7d2c9fa..48f60768f666 100644 --- a/.postcssrc +++ b/.postcssrc @@ -7,11 +7,7 @@ "postcss-media-minmax": {}, "postcss-selector-not": {}, "postcss-nested": {}, - "autoprefixer": { - "browsers": [ - "last 2 versions" - ] - } + "autoprefixer": {} }, "excludedPackages": [ "deepwell:bootstrap-datepicker2", diff --git a/.snapcraft/resources/preparenode b/.snapcraft/resources/preparenode index f6e0c58d3cc5..a9f4807fed1f 100755 --- a/.snapcraft/resources/preparenode +++ b/.snapcraft/resources/preparenode @@ -1,6 +1,6 @@ #!/bin/bash -node_version="v8.11.3" +node_version="v8.15.1" unamem="$(uname -m)" if [[ $unamem == *aarch64* ]]; then diff --git a/.travis/snap.sh b/.travis/snap.sh index e699832a280a..4df8febc4d9b 100755 --- a/.travis/snap.sh +++ b/.travis/snap.sh @@ -17,7 +17,7 @@ elif [[ $TRAVIS_TAG ]]; then RC_VERSION=$TRAVIS_TAG else CHANNEL=edge - RC_VERSION=2.0.0 + RC_VERSION=2.1.0 fi echo "Preparing to trigger a snap release for $CHANNEL channel" diff --git a/HISTORY.md b/HISTORY.md index 0dfea032b23c..f870b04dbcdf 100644 --- a/HISTORY.md +++ b/HISTORY.md @@ -1,4 +1,126 @@ +# 2.1.0 +`2019-09-27 · 1 ️️️⚠️ · 13 🎉 · 12 🚀 · 22 🐛 · 22 🔍 · 20 👩‍💻👨‍💻` + +### Engine versions +- Node: `8.15.1` +- NPM: `6.9.0` +- MongoDB: `3.4, 3.6, 4.0` + +### ⚠️ BREAKING CHANGES + +- Deprecate old CORS API access for Cordova mobile app ([#15322](https://github.com/RocketChat/Rocket.Chat/pull/15322)) + +### 🎉 New features + +- Apps engine Livechat ([#14626](https://github.com/RocketChat/Rocket.Chat/pull/14626)) +- Livechat setting to show/hide Agent Information on the widget ([#15216](https://github.com/RocketChat/Rocket.Chat/pull/15216)) +- SAML User Data Mapping ([#15404](https://github.com/RocketChat/Rocket.Chat/pull/15404)) +- Add ability to disable email notifications globally ([#9667](https://github.com/RocketChat/Rocket.Chat/pull/9667) by [@ferdifly](https://github.com/ferdifly)) +- Validate NotBefore and NotOnOrAfter SAML assertions ([#15226](https://github.com/RocketChat/Rocket.Chat/pull/15226)) +- Setting to configure SAML context comparison ([#15229](https://github.com/RocketChat/Rocket.Chat/pull/15229)) +- Expand SAML Users Role Settings ([#15277](https://github.com/RocketChat/Rocket.Chat/pull/15277) by [@Hudell](https://github.com/Hudell)) +- Guess a user's name from SAML credentials ([#15240](https://github.com/RocketChat/Rocket.Chat/pull/15240) by [@mrsimpson](https://github.com/mrsimpson)) +- Setting to remove message contents from email notifications ([#15406](https://github.com/RocketChat/Rocket.Chat/pull/15406)) +- Add JWT to uploaded files urls ([#15297](https://github.com/RocketChat/Rocket.Chat/pull/15297)) +- Provide site-url to outgoing integrations ([#15238](https://github.com/RocketChat/Rocket.Chat/pull/15238) by [@mrsimpson](https://github.com/mrsimpson)) +- Only Load CodeMirror code when it is needed ([#15351](https://github.com/RocketChat/Rocket.Chat/pull/15351)) +- Allow file sharing through Twilio(WhatsApp) integration ([#15415](https://github.com/RocketChat/Rocket.Chat/pull/15415)) + +### 🚀 Improvements + +- Change default user's preference for notifications to 'All messages' ([#15420](https://github.com/RocketChat/Rocket.Chat/pull/15420)) +- Remove global Blaze helpers ([#15414](https://github.com/RocketChat/Rocket.Chat/pull/15414)) +- User data export ([#15294](https://github.com/RocketChat/Rocket.Chat/pull/15294) by [@Hudell](https://github.com/Hudell)) +- A11y: Buttons, Images, Popups ([#15405](https://github.com/RocketChat/Rocket.Chat/pull/15405)) +- Administration UI ([#15401](https://github.com/RocketChat/Rocket.Chat/pull/15401)) +- Make the agents field optional when updating Livechat departments ([#15400](https://github.com/RocketChat/Rocket.Chat/pull/15400)) +- Replace LESS autoprefixer plugin ([#15260](https://github.com/RocketChat/Rocket.Chat/pull/15260)) +- Add missing indices used by read receipts ([#15316](https://github.com/RocketChat/Rocket.Chat/pull/15316)) +- Add possibility of renaming a discussion ([#15122](https://github.com/RocketChat/Rocket.Chat/pull/15122)) +- AvatarBlockUnauthenticatedAccess do not call user.find if you dont have to ([#15355](https://github.com/RocketChat/Rocket.Chat/pull/15355)) +- improve autolinker flow ([#15340](https://github.com/RocketChat/Rocket.Chat/pull/15340)) +- Add CustomSounds.play() helper ([#15256](https://github.com/RocketChat/Rocket.Chat/pull/15256)) + +### 🐛 Bug fixes + +- Delivering real-time messages to users that left a room ([#15389](https://github.com/RocketChat/Rocket.Chat/pull/15389)) +- Federation messages notifications ([#15418](https://github.com/RocketChat/Rocket.Chat/pull/15418)) +- Property "permission" in slash commands of custom apps (#14739) ([#14741](https://github.com/RocketChat/Rocket.Chat/pull/14741) by [@ifantom](https://github.com/ifantom)) +- Notify admin was generating errors when Rocket.Cat user was edited or deleted ([#15387](https://github.com/RocketChat/Rocket.Chat/pull/15387)) +- Fix file uploads JWT ([#15412](https://github.com/RocketChat/Rocket.Chat/pull/15412)) +- Double send bug on message box ([#15409](https://github.com/RocketChat/Rocket.Chat/pull/15409)) +- Prune messages by cron if room not updated ([#15252](https://github.com/RocketChat/Rocket.Chat/pull/15252)) +- Subscription record not having the `ls` field ([#14544](https://github.com/RocketChat/Rocket.Chat/pull/14544)) +- CAS users can take control of Rocket.Chat accounts ([#15346](https://github.com/RocketChat/Rocket.Chat/pull/15346)) +- Add ENV VAR to enable users create token feature ([#15334](https://github.com/RocketChat/Rocket.Chat/pull/15334)) +- REST API to return only public custom fields ([#15292](https://github.com/RocketChat/Rocket.Chat/pull/15292)) +- REST endpoint `users.setPreferences` to not override all user's preferences ([#15288](https://github.com/RocketChat/Rocket.Chat/pull/15288)) +- LDAP usernames get additional '.' if they contain numbers ([#14644](https://github.com/RocketChat/Rocket.Chat/pull/14644) by [@Hudell](https://github.com/Hudell)) +- Don't allow email violating whitelist addresses ([#15339](https://github.com/RocketChat/Rocket.Chat/pull/15339)) +- Limit exposed fields on some users. endpoints ([#15327](https://github.com/RocketChat/Rocket.Chat/pull/15327)) +- Empty custom emojis on emoji picker ([#15392](https://github.com/RocketChat/Rocket.Chat/pull/15392)) +- User Profile Time Format ([#15385](https://github.com/RocketChat/Rocket.Chat/pull/15385)) +- Grammatical error in Not Found page ([#15382](https://github.com/RocketChat/Rocket.Chat/pull/15382)) +- Set the DEFAULT_ECDH_CURVE to auto (#15245) ([#15365](https://github.com/RocketChat/Rocket.Chat/pull/15365) by [@dlundgren](https://github.com/dlundgren)) +- Message box not centered ([#15367](https://github.com/RocketChat/Rocket.Chat/pull/15367)) +- Duplicate Channels in Search-bar ([#15056](https://github.com/RocketChat/Rocket.Chat/pull/15056)) +- Reduce Message cache time to 500ms ([#15295](https://github.com/RocketChat/Rocket.Chat/pull/15295) by [@vickyokrm](https://github.com/vickyokrm)) + +
+🔍 Minor changes + +- Regression: Prevent parsing empty custom field setting ([#15413](https://github.com/RocketChat/Rocket.Chat/pull/15413)) +- Use version 2 of the DeepL API ([#15364](https://github.com/RocketChat/Rocket.Chat/pull/15364) by [@vickyokrm](https://github.com/vickyokrm)) +- Remove GraphQL dependencies left ([#15356](https://github.com/RocketChat/Rocket.Chat/pull/15356)) +- [Fix] Missing space between last username & 'and' word in react notification ([#15384](https://github.com/RocketChat/Rocket.Chat/pull/15384) by [@zdumitru](https://github.com/zdumitru)) +- Add a missing 'Discussion' translation key ([#14029](https://github.com/RocketChat/Rocket.Chat/pull/14029) by [@ura14h](https://github.com/ura14h)) +- Improve Polish translation ([#14060](https://github.com/RocketChat/Rocket.Chat/pull/14060) by [@stepek](https://github.com/stepek)) +- Regression: Messagebox height changing when typing ([#15380](https://github.com/RocketChat/Rocket.Chat/pull/15380)) +- LingoHub based on develop ([#15377](https://github.com/RocketChat/Rocket.Chat/pull/15377)) +- Regression: Fix DDP metrics ([#15368](https://github.com/RocketChat/Rocket.Chat/pull/15368)) +- [CHORE] Move pathFor helper to templateHelpers directory ([#15255](https://github.com/RocketChat/Rocket.Chat/pull/15255)) +- Fix typo in LDAP User Search setting description ([#15228](https://github.com/RocketChat/Rocket.Chat/pull/15228)) +- Remove log ADMIN_PASS environment variable ([#15307](https://github.com/RocketChat/Rocket.Chat/pull/15307)) +- Improve text of the search bar description ([#15353](https://github.com/RocketChat/Rocket.Chat/pull/15353)) +- [CHORE] Remove obsolete modal template ([#15257](https://github.com/RocketChat/Rocket.Chat/pull/15257)) +- Update Meteor to 1.8.1 ([#15358](https://github.com/RocketChat/Rocket.Chat/pull/15358)) +- Merge master into develop & Set version to 2.1.0-develop ([#15357](https://github.com/RocketChat/Rocket.Chat/pull/15357)) +- Regression: Fix invalid version string error on marketplace screen ([#15437](https://github.com/RocketChat/Rocket.Chat/pull/15437)) +- Regression: Fix Commit Section when there is no commit info ([#15436](https://github.com/RocketChat/Rocket.Chat/pull/15436)) +- Regression: setup wizard dynamic import using relative url ([#15432](https://github.com/RocketChat/Rocket.Chat/pull/15432)) +- Regression: Favorite room button ([#15426](https://github.com/RocketChat/Rocket.Chat/pull/15426)) +- Regression: API CORS not working after Cordova being disabled by default ([#15443](https://github.com/RocketChat/Rocket.Chat/pull/15443)) +- Update Apps-Engine version to final version ([#15458](https://github.com/RocketChat/Rocket.Chat/pull/15458)) + +
+ +### 👩‍💻👨‍💻 Contributors 😍 + +- [@Hudell](https://github.com/Hudell) +- [@dlundgren](https://github.com/dlundgren) +- [@ferdifly](https://github.com/ferdifly) +- [@ifantom](https://github.com/ifantom) +- [@mrsimpson](https://github.com/mrsimpson) +- [@stepek](https://github.com/stepek) +- [@ura14h](https://github.com/ura14h) +- [@vickyokrm](https://github.com/vickyokrm) +- [@zdumitru](https://github.com/zdumitru) + +### 👩‍💻👨‍💻 Core Team 🤓 + +- [@MarcosSpessatto](https://github.com/MarcosSpessatto) +- [@MartinSchoeler](https://github.com/MartinSchoeler) +- [@alansikora](https://github.com/alansikora) +- [@d-gubert](https://github.com/d-gubert) +- [@geekgonecrazy](https://github.com/geekgonecrazy) +- [@ggazzo](https://github.com/ggazzo) +- [@pierre-lehnen-rc](https://github.com/pierre-lehnen-rc) +- [@renatobecker](https://github.com/renatobecker) +- [@rodrigok](https://github.com/rodrigok) +- [@sampaiodiego](https://github.com/sampaiodiego) +- [@tassoevan](https://github.com/tassoevan) + # 2.0.0 `2019-09-12 · 7 ️️️⚠️ · 14 🎉 · 6 🚀 · 16 🐛 · 36 🔍 · 26 👩‍💻👨‍💻` @@ -19,24 +141,24 @@ ### 🎉 New features -- Custom message popups ([#15117](https://github.com/RocketChat/Rocket.Chat/pull/15117)) -- Options for SAML auth for individual organizations needs ([#14275](https://github.com/RocketChat/Rocket.Chat/pull/14275) by [@Deltachaos](https://github.com/Deltachaos)) +- Custom message popups ([#15117](https://github.com/RocketChat/Rocket.Chat/pull/15117) by [@Hudell](https://github.com/Hudell)) +- Options for SAML auth for individual organizations needs ([#14275](https://github.com/RocketChat/Rocket.Chat/pull/14275) by [@Deltachaos](https://github.com/Deltachaos) & [@Hudell](https://github.com/Hudell)) - Assume that Rocket.Chat runs behind one proxy by default (HTTP_FORWARDED_COUNT=1) ([#15214](https://github.com/RocketChat/Rocket.Chat/pull/15214)) -- LDAP User Groups, Roles, and Channel Synchronization ([#14278](https://github.com/RocketChat/Rocket.Chat/pull/14278) by [@wreiske](https://github.com/wreiske)) +- LDAP User Groups, Roles, and Channel Synchronization ([#14278](https://github.com/RocketChat/Rocket.Chat/pull/14278) by [@Hudell](https://github.com/Hudell) & [@wreiske](https://github.com/wreiske)) - Setup Wizard and Page not found, using React components ([#15204](https://github.com/RocketChat/Rocket.Chat/pull/15204)) - Add Mobex to the list of SMS service providers ([#14655](https://github.com/RocketChat/Rocket.Chat/pull/14655) by [@zolbayars](https://github.com/zolbayars)) -- Support multiple push gateways ([#14902](https://github.com/RocketChat/Rocket.Chat/pull/14902)) +- Support multiple push gateways ([#14902](https://github.com/RocketChat/Rocket.Chat/pull/14902) by [@cardoso](https://github.com/cardoso)) - Rest API Endpoint to get pinned messages from a room ([#13864](https://github.com/RocketChat/Rocket.Chat/pull/13864) by [@thayannevls](https://github.com/thayannevls)) -- Granular permissions for settings ([#8942](https://github.com/RocketChat/Rocket.Chat/pull/8942)) +- Granular permissions for settings ([#8942](https://github.com/RocketChat/Rocket.Chat/pull/8942) by [@mrsimpson](https://github.com/mrsimpson)) - Add autotranslate Rest endpoints ([#14885](https://github.com/RocketChat/Rocket.Chat/pull/14885)) - Option to hide the button of Custom OAuth on login screen ([#15053](https://github.com/RocketChat/Rocket.Chat/pull/15053)) - Endpoint to fetch livechat rooms with several filters ([#15155](https://github.com/RocketChat/Rocket.Chat/pull/15155)) -- Integrate DEEPL translation service to RC core ([#12174](https://github.com/RocketChat/Rocket.Chat/pull/12174) by [@vickyokrm](https://github.com/vickyokrm)) +- Integrate DEEPL translation service to RC core ([#12174](https://github.com/RocketChat/Rocket.Chat/pull/12174) by [@mrsimpson](https://github.com/mrsimpson) & [@vickyokrm](https://github.com/vickyokrm)) - Jitsi meet room access via a token ([#12259](https://github.com/RocketChat/Rocket.Chat/pull/12259) by [@rrzharikov](https://github.com/rrzharikov)) ### 🚀 Improvements -- Livechat User Management Improvements ([#14736](https://github.com/RocketChat/Rocket.Chat/pull/14736)) +- Livechat User Management Improvements ([#14736](https://github.com/RocketChat/Rocket.Chat/pull/14736) by [@Hudell](https://github.com/Hudell)) - Refactoring the queuing and routing processes of new livechats ([#15003](https://github.com/RocketChat/Rocket.Chat/pull/15003)) - Add limit of 50 user's resume tokens ([#15102](https://github.com/RocketChat/Rocket.Chat/pull/15102)) - Add asset extension validation ([#15088](https://github.com/RocketChat/Rocket.Chat/pull/15088)) @@ -49,12 +171,12 @@ - Mark room as read logic ([#15174](https://github.com/RocketChat/Rocket.Chat/pull/15174)) - Forget user session on window close ([#15205](https://github.com/RocketChat/Rocket.Chat/pull/15205)) - Search message wrongly grouping messages ([#15094](https://github.com/RocketChat/Rocket.Chat/pull/15094)) -- Rate limit incoming integrations (webhooks) ([#15038](https://github.com/RocketChat/Rocket.Chat/pull/15038)) +- Rate limit incoming integrations (webhooks) ([#15038](https://github.com/RocketChat/Rocket.Chat/pull/15038) by [@mrsimpson](https://github.com/mrsimpson)) - User's auto complete showing everyone on the server ([#15212](https://github.com/RocketChat/Rocket.Chat/pull/15212)) - "Discussion" label in Sidebar not hidden, when Discussions are disabled (#14660) ([#14682](https://github.com/RocketChat/Rocket.Chat/pull/14682) by [@ifantom](https://github.com/ifantom)) - Typo in 'access-permissions_description' ja translation ([#15162](https://github.com/RocketChat/Rocket.Chat/pull/15162) by [@NatsumiKubo](https://github.com/NatsumiKubo)) - IE11 modal, menu action and edit user page ([#15201](https://github.com/RocketChat/Rocket.Chat/pull/15201)) -- TabBar not loading template titles ([#15177](https://github.com/RocketChat/Rocket.Chat/pull/15177)) +- TabBar not loading template titles ([#15177](https://github.com/RocketChat/Rocket.Chat/pull/15177) by [@Hudell](https://github.com/Hudell)) - Threads contextual bar button visible even with threads disabled ([#14956](https://github.com/RocketChat/Rocket.Chat/pull/14956) by [@cesarmal](https://github.com/cesarmal)) - Prevent to create discussion with empty name ([#14507](https://github.com/RocketChat/Rocket.Chat/pull/14507)) - Remove new hidden file and fix for .env files for Snap ([#15120](https://github.com/RocketChat/Rocket.Chat/pull/15120)) @@ -81,7 +203,7 @@ - Update pt-BR.i18n.json ([#15083](https://github.com/RocketChat/Rocket.Chat/pull/15083) by [@lucassmacedo](https://github.com/lucassmacedo)) - Regression: cachedCollection wrong callback parameters ([#15136](https://github.com/RocketChat/Rocket.Chat/pull/15136)) - Allow file upload paths on attachments URLs ([#15121](https://github.com/RocketChat/Rocket.Chat/pull/15121)) -- Fix automated test for manual user activation ([#14978](https://github.com/RocketChat/Rocket.Chat/pull/14978)) +- Fix automated test for manual user activation ([#14978](https://github.com/RocketChat/Rocket.Chat/pull/14978) by [@mrsimpson](https://github.com/mrsimpson)) - Add new step to build Docker image from PRs for production again ([#15124](https://github.com/RocketChat/Rocket.Chat/pull/15124)) - LingoHub based on develop ([#15115](https://github.com/RocketChat/Rocket.Chat/pull/15115)) - Improve url validation inside message object ([#15074](https://github.com/RocketChat/Rocket.Chat/pull/15074)) @@ -107,11 +229,14 @@ ### 👩‍💻👨‍💻 Contributors 😍 - [@Deltachaos](https://github.com/Deltachaos) +- [@Hudell](https://github.com/Hudell) - [@NatsumiKubo](https://github.com/NatsumiKubo) +- [@cardoso](https://github.com/cardoso) - [@cesarmal](https://github.com/cesarmal) - [@httpsOmkar](https://github.com/httpsOmkar) - [@ifantom](https://github.com/ifantom) - [@lucassmacedo](https://github.com/lucassmacedo) +- [@mrsimpson](https://github.com/mrsimpson) - [@rrzharikov](https://github.com/rrzharikov) - [@thayannevls](https://github.com/thayannevls) - [@vickyokrm](https://github.com/vickyokrm) @@ -120,17 +245,14 @@ ### 👩‍💻👨‍💻 Core Team 🤓 -- [@Hudell](https://github.com/Hudell) - [@LuluGO](https://github.com/LuluGO) - [@MarcosSpessatto](https://github.com/MarcosSpessatto) - [@MartinSchoeler](https://github.com/MartinSchoeler) - [@alansikora](https://github.com/alansikora) -- [@cardoso](https://github.com/cardoso) - [@d-gubert](https://github.com/d-gubert) - [@engelgabriel](https://github.com/engelgabriel) - [@geekgonecrazy](https://github.com/geekgonecrazy) - [@ggazzo](https://github.com/ggazzo) -- [@mrsimpson](https://github.com/mrsimpson) - [@renatobecker](https://github.com/renatobecker) - [@rodrigok](https://github.com/rodrigok) - [@sampaiodiego](https://github.com/sampaiodiego) @@ -206,9 +328,9 @@ - Subscription enabled marketplace ([#14948](https://github.com/RocketChat/Rocket.Chat/pull/14948)) - Deprecate MongoDB version 3.2 ([#15025](https://github.com/RocketChat/Rocket.Chat/pull/15025)) - Options to filter discussion and livechat on Admin > Rooms ([#15019](https://github.com/RocketChat/Rocket.Chat/pull/15019)) -- Settings to further customize GitLab OAuth ([#15014](https://github.com/RocketChat/Rocket.Chat/pull/15014)) -- Accept multiple redirect URIs on OAuth Apps ([#14935](https://github.com/RocketChat/Rocket.Chat/pull/14935)) -- Setting to configure custom authn context on SAML requests ([#14675](https://github.com/RocketChat/Rocket.Chat/pull/14675)) +- Settings to further customize GitLab OAuth ([#15014](https://github.com/RocketChat/Rocket.Chat/pull/15014) by [@Hudell](https://github.com/Hudell)) +- Accept multiple redirect URIs on OAuth Apps ([#14935](https://github.com/RocketChat/Rocket.Chat/pull/14935) by [@Hudell](https://github.com/Hudell)) +- Setting to configure custom authn context on SAML requests ([#14675](https://github.com/RocketChat/Rocket.Chat/pull/14675) by [@Hudell](https://github.com/Hudell)) - Webdav File Picker ([#14879](https://github.com/RocketChat/Rocket.Chat/pull/14879) by [@ubarsaiyan](https://github.com/ubarsaiyan)) - Setting to prevent Livechat agents online when Office Hours are closed ([#14921](https://github.com/RocketChat/Rocket.Chat/pull/14921)) @@ -226,19 +348,19 @@ - Russian grammatical errors ([#14622](https://github.com/RocketChat/Rocket.Chat/pull/14622) by [@BehindLoader](https://github.com/BehindLoader)) - Message attachments not allowing float numbers ([#14412](https://github.com/RocketChat/Rocket.Chat/pull/14412)) - Typo in german translation ([#14833](https://github.com/RocketChat/Rocket.Chat/pull/14833) by [@Le-onardo](https://github.com/Le-onardo)) -- users.setStatus REST endpoint not allowing reset status message ([#14916](https://github.com/RocketChat/Rocket.Chat/pull/14916)) +- users.setStatus REST endpoint not allowing reset status message ([#14916](https://github.com/RocketChat/Rocket.Chat/pull/14916) by [@cardoso](https://github.com/cardoso)) - SVG uploads crashing process ([#15006](https://github.com/RocketChat/Rocket.Chat/pull/15006) by [@snoopotic](https://github.com/snoopotic)) - Edit message with arrow up key if not last message ([#15021](https://github.com/RocketChat/Rocket.Chat/pull/15021)) - Livechat dashboard average and reaction time labels ([#14845](https://github.com/RocketChat/Rocket.Chat/pull/14845) by [@anandpathak](https://github.com/anandpathak)) - Edit permissions screen ([#14950](https://github.com/RocketChat/Rocket.Chat/pull/14950)) - Invite users auto complete cropping results ([#15020](https://github.com/RocketChat/Rocket.Chat/pull/15020)) -- Always displaying jumbomojis when using "marked" markdown ([#14861](https://github.com/RocketChat/Rocket.Chat/pull/14861)) -- CustomOauth Identity Step errors displayed in HTML format ([#15000](https://github.com/RocketChat/Rocket.Chat/pull/15000)) -- Custom User Status throttled by rate limiter ([#15001](https://github.com/RocketChat/Rocket.Chat/pull/15001)) +- Always displaying jumbomojis when using "marked" markdown ([#14861](https://github.com/RocketChat/Rocket.Chat/pull/14861) by [@brakhane](https://github.com/brakhane)) +- CustomOauth Identity Step errors displayed in HTML format ([#15000](https://github.com/RocketChat/Rocket.Chat/pull/15000) by [@Hudell](https://github.com/Hudell)) +- Custom User Status throttled by rate limiter ([#15001](https://github.com/RocketChat/Rocket.Chat/pull/15001) by [@Hudell](https://github.com/Hudell)) - Not being able to mention users with "all" and "here" usernames - do not allow users register that usernames ([#14468](https://github.com/RocketChat/Rocket.Chat/pull/14468) by [@hamidrezabstn](https://github.com/hamidrezabstn)) - Users staying online after logout ([#14966](https://github.com/RocketChat/Rocket.Chat/pull/14966)) - Chrome doesn't load additional search results when bottom is reached ([#14965](https://github.com/RocketChat/Rocket.Chat/pull/14965)) -- Wrong label order on room settings ([#14960](https://github.com/RocketChat/Rocket.Chat/pull/14960)) +- Wrong label order on room settings ([#14960](https://github.com/RocketChat/Rocket.Chat/pull/14960) by [@Hudell](https://github.com/Hudell)) - Allow storing the navigation history of unregistered Livechat visitors ([#14970](https://github.com/RocketChat/Rocket.Chat/pull/14970)) - 50 custom emoji limit ([#14951](https://github.com/RocketChat/Rocket.Chat/pull/14951)) - eternal loading file list ([#14952](https://github.com/RocketChat/Rocket.Chat/pull/14952)) @@ -249,7 +371,7 @@ - OTR key icon missing on messages ([#14953](https://github.com/RocketChat/Rocket.Chat/pull/14953)) - Prevent error on trying insert message with duplicated id ([#14945](https://github.com/RocketChat/Rocket.Chat/pull/14945)) - LDAP login with customField sync ([#14808](https://github.com/RocketChat/Rocket.Chat/pull/14808) by [@magicbelette](https://github.com/magicbelette)) -- Wrong custom status displayed on room leader panel ([#14958](https://github.com/RocketChat/Rocket.Chat/pull/14958)) +- Wrong custom status displayed on room leader panel ([#14958](https://github.com/RocketChat/Rocket.Chat/pull/14958) by [@Hudell](https://github.com/Hudell)) - Video recorder message echo ([#14671](https://github.com/RocketChat/Rocket.Chat/pull/14671) by [@vova-zush](https://github.com/vova-zush)) - Opening Livechat messages on mobile apps ([#14785](https://github.com/RocketChat/Rocket.Chat/pull/14785) by [@zolbayars](https://github.com/zolbayars)) - SAML login by giving displayName priority over userName for fullName ([#14880](https://github.com/RocketChat/Rocket.Chat/pull/14880) by [@pkolmann](https://github.com/pkolmann)) @@ -278,7 +400,7 @@ - Split oplog emitters in files ([#14917](https://github.com/RocketChat/Rocket.Chat/pull/14917)) - Extract canSendMessage function ([#14909](https://github.com/RocketChat/Rocket.Chat/pull/14909)) - Improve: Get public key for marketplace ([#14851](https://github.com/RocketChat/Rocket.Chat/pull/14851)) -- Merge master into develop & Set version to 1.3.0-develop ([#14889](https://github.com/RocketChat/Rocket.Chat/pull/14889)) +- Merge master into develop & Set version to 1.3.0-develop ([#14889](https://github.com/RocketChat/Rocket.Chat/pull/14889) by [@Hudell](https://github.com/Hudell)) - Regression: fix code style, setup wizard error and profile page header ([#15041](https://github.com/RocketChat/Rocket.Chat/pull/15041)) - Regression: Framework version being attached to a request that doesn't require it ([#15039](https://github.com/RocketChat/Rocket.Chat/pull/15039)) - Update Livechat widget ([#15046](https://github.com/RocketChat/Rocket.Chat/pull/15046)) @@ -295,9 +417,12 @@ ### 👩‍💻👨‍💻 Contributors 😍 - [@BehindLoader](https://github.com/BehindLoader) +- [@Hudell](https://github.com/Hudell) - [@Le-onardo](https://github.com/Le-onardo) - [@NateScarlet](https://github.com/NateScarlet) - [@anandpathak](https://github.com/anandpathak) +- [@brakhane](https://github.com/brakhane) +- [@cardoso](https://github.com/cardoso) - [@commiaI](https://github.com/commiaI) - [@dependabot[bot]](https://github.com/dependabot[bot]) - [@hamidrezabstn](https://github.com/hamidrezabstn) @@ -312,11 +437,8 @@ ### 👩‍💻👨‍💻 Core Team 🤓 -- [@Hudell](https://github.com/Hudell) - [@MarcosSpessatto](https://github.com/MarcosSpessatto) - [@alansikora](https://github.com/alansikora) -- [@brakhane](https://github.com/brakhane) -- [@cardoso](https://github.com/cardoso) - [@d-gubert](https://github.com/d-gubert) - [@engelgabriel](https://github.com/engelgabriel) - [@geekgonecrazy](https://github.com/geekgonecrazy) @@ -377,36 +499,36 @@ ### 🎉 New features -- Custom User Status ([#13933](https://github.com/RocketChat/Rocket.Chat/pull/13933) by [@wreiske](https://github.com/wreiske)) +- Custom User Status ([#13933](https://github.com/RocketChat/Rocket.Chat/pull/13933) by [@Hudell](https://github.com/Hudell) & [@wreiske](https://github.com/wreiske)) - changed mongo version for snap from 3.2.7 to 3.4.20 ([#14838](https://github.com/RocketChat/Rocket.Chat/pull/14838)) - Add loading animation to webdav file picker ([#14759](https://github.com/RocketChat/Rocket.Chat/pull/14759) by [@ubarsaiyan](https://github.com/ubarsaiyan)) - Add tmid property to outgoing integration ([#14699](https://github.com/RocketChat/Rocket.Chat/pull/14699)) -- Endpoint to anonymously read channel's messages ([#14714](https://github.com/RocketChat/Rocket.Chat/pull/14714)) +- Endpoint to anonymously read channel's messages ([#14714](https://github.com/RocketChat/Rocket.Chat/pull/14714) by [@PrajvalRaval](https://github.com/PrajvalRaval)) - Add Livechat inquiries endpoints ([#14779](https://github.com/RocketChat/Rocket.Chat/pull/14779)) - Configuration to limit amount of livechat inquiries displayed ([#14690](https://github.com/RocketChat/Rocket.Chat/pull/14690)) - Show App bundles and its apps ([#14886](https://github.com/RocketChat/Rocket.Chat/pull/14886)) ### 🚀 Improvements -- Adds link to download generated user data file ([#14175](https://github.com/RocketChat/Rocket.Chat/pull/14175)) +- Adds link to download generated user data file ([#14175](https://github.com/RocketChat/Rocket.Chat/pull/14175) by [@Hudell](https://github.com/Hudell)) - Layout of livechat manager pages to new style ([#13900](https://github.com/RocketChat/Rocket.Chat/pull/13900)) - Add an optional rocketchat-protocol DNS entry for Federation ([#14589](https://github.com/RocketChat/Rocket.Chat/pull/14589)) - Use configurable colors on sidebar items ([#14624](https://github.com/RocketChat/Rocket.Chat/pull/14624)) ### 🐛 Bug fixes -- Error when using Download My Data or Export My Data ([#14645](https://github.com/RocketChat/Rocket.Chat/pull/14645)) +- Error when using Download My Data or Export My Data ([#14645](https://github.com/RocketChat/Rocket.Chat/pull/14645) by [@Hudell](https://github.com/Hudell)) - Removes E2E action button, icon and banner when E2E is disabled. ([#14810](https://github.com/RocketChat/Rocket.Chat/pull/14810)) - Assume microphone is available ([#14710](https://github.com/RocketChat/Rocket.Chat/pull/14710)) - Move the set Avatar call on user creation to make sure the user has username ([#14665](https://github.com/RocketChat/Rocket.Chat/pull/14665)) - users typing forever ([#14724](https://github.com/RocketChat/Rocket.Chat/pull/14724)) - Increasing time to rate limit in shield.svg endpoint and add a setting to disable API rate limiter ([#14709](https://github.com/RocketChat/Rocket.Chat/pull/14709)) - Wrong filter field when filtering current Livechats ([#14569](https://github.com/RocketChat/Rocket.Chat/pull/14569)) -- Import Chart.js error ([#14471](https://github.com/RocketChat/Rocket.Chat/pull/14471) by [@sonbn0](https://github.com/sonbn0)) +- Import Chart.js error ([#14471](https://github.com/RocketChat/Rocket.Chat/pull/14471) by [@Hudell](https://github.com/Hudell) & [@sonbn0](https://github.com/sonbn0)) - Name is undefined in some emails ([#14533](https://github.com/RocketChat/Rocket.Chat/pull/14533)) - Direct reply delete config and description ([#14493](https://github.com/RocketChat/Rocket.Chat/pull/14493) by [@ruKurz](https://github.com/ruKurz)) -- Custom status fixes ([#14853](https://github.com/RocketChat/Rocket.Chat/pull/14853) by [@wreiske](https://github.com/wreiske)) -- LinkedIn OAuth login ([#14887](https://github.com/RocketChat/Rocket.Chat/pull/14887)) +- Custom status fixes ([#14853](https://github.com/RocketChat/Rocket.Chat/pull/14853) by [@Hudell](https://github.com/Hudell) & [@wreiske](https://github.com/wreiske)) +- LinkedIn OAuth login ([#14887](https://github.com/RocketChat/Rocket.Chat/pull/14887) by [@Hudell](https://github.com/Hudell))
🔍 Minor changes @@ -425,6 +547,8 @@ ### 👩‍💻👨‍💻 Contributors 😍 - [@AnBo83](https://github.com/AnBo83) +- [@Hudell](https://github.com/Hudell) +- [@PrajvalRaval](https://github.com/PrajvalRaval) - [@knrt10](https://github.com/knrt10) - [@lolimay](https://github.com/lolimay) - [@mohamedar97](https://github.com/mohamedar97) @@ -436,10 +560,8 @@ ### 👩‍💻👨‍💻 Core Team 🤓 -- [@Hudell](https://github.com/Hudell) - [@LuluGO](https://github.com/LuluGO) - [@MarcosSpessatto](https://github.com/MarcosSpessatto) -- [@PrajvalRaval](https://github.com/PrajvalRaval) - [@alansikora](https://github.com/alansikora) - [@engelgabriel](https://github.com/engelgabriel) - [@ggazzo](https://github.com/ggazzo) @@ -501,19 +623,22 @@ ### 🐛 Bug fixes - User status information on User Info panel ([#14763](https://github.com/RocketChat/Rocket.Chat/pull/14763)) -- User Real Name being erased when not modified ([#14711](https://github.com/RocketChat/Rocket.Chat/pull/14711)) +- User Real Name being erased when not modified ([#14711](https://github.com/RocketChat/Rocket.Chat/pull/14711) by [@Hudell](https://github.com/Hudell)) - Anonymous chat read ([#14717](https://github.com/RocketChat/Rocket.Chat/pull/14717))
🔍 Minor changes -- Release 1.1.2 ([#14823](https://github.com/RocketChat/Rocket.Chat/pull/14823)) +- Release 1.1.2 ([#14823](https://github.com/RocketChat/Rocket.Chat/pull/14823) by [@Hudell](https://github.com/Hudell))
-### 👩‍💻👨‍💻 Core Team 🤓 +### 👩‍💻👨‍💻 Contributors 😍 - [@Hudell](https://github.com/Hudell) + +### 👩‍💻👨‍💻 Core Team 🤓 + - [@MarcosSpessatto](https://github.com/MarcosSpessatto) - [@ggazzo](https://github.com/ggazzo) - [@sampaiodiego](https://github.com/sampaiodiego) @@ -528,7 +653,7 @@ ### 🐛 Bug fixes -- SAML login error. ([#14686](https://github.com/RocketChat/Rocket.Chat/pull/14686)) +- SAML login error. ([#14686](https://github.com/RocketChat/Rocket.Chat/pull/14686) by [@Hudell](https://github.com/Hudell)) - Load messages after disconnect and message box scroll missing ([#14668](https://github.com/RocketChat/Rocket.Chat/pull/14668))
@@ -538,9 +663,12 @@
-### 👩‍💻👨‍💻 Core Team 🤓 +### 👩‍💻👨‍💻 Contributors 😍 - [@Hudell](https://github.com/Hudell) + +### 👩‍💻👨‍💻 Core Team 🤓 + - [@alansikora](https://github.com/alansikora) - [@ggazzo](https://github.com/ggazzo) @@ -581,11 +709,11 @@ - Duplicated link to jump to message ([#14505](https://github.com/RocketChat/Rocket.Chat/pull/14505)) - Edit Message when down arrow is pressed. ([#14369](https://github.com/RocketChat/Rocket.Chat/pull/14369) by [@Kailash0311](https://github.com/Kailash0311)) - Unread property of the room's lastMessage object was being wrong some times ([#13919](https://github.com/RocketChat/Rocket.Chat/pull/13919)) -- Multiple Slack Importer Bugs ([#12084](https://github.com/RocketChat/Rocket.Chat/pull/12084)) +- Multiple Slack Importer Bugs ([#12084](https://github.com/RocketChat/Rocket.Chat/pull/12084) by [@Hudell](https://github.com/Hudell)) - No feedback when adding users that already exists in a room ([#14534](https://github.com/RocketChat/Rocket.Chat/pull/14534) by [@gsunit](https://github.com/gsunit)) - Custom scripts descriptions were not clear enough ([#14516](https://github.com/RocketChat/Rocket.Chat/pull/14516)) - Role `user` has being added after email verification even for non anonymous users ([#14263](https://github.com/RocketChat/Rocket.Chat/pull/14263)) -- Several problems with read-only rooms and muted users ([#11311](https://github.com/RocketChat/Rocket.Chat/pull/11311)) +- Several problems with read-only rooms and muted users ([#11311](https://github.com/RocketChat/Rocket.Chat/pull/11311) by [@Hudell](https://github.com/Hudell)) - Channel settings form to textarea for Topic and Description ([#13328](https://github.com/RocketChat/Rocket.Chat/pull/13328) by [@supra08](https://github.com/supra08)) - Elements in User Info require some padding ([#13640](https://github.com/RocketChat/Rocket.Chat/pull/13640) by [@mushroomgenie](https://github.com/mushroomgenie)) - Showing the id instead of the name of custom notification sound ([#13660](https://github.com/RocketChat/Rocket.Chat/pull/13660) by [@knrt10](https://github.com/knrt10)) @@ -640,7 +768,7 @@ - MsgTyping refactor ([#14495](https://github.com/RocketChat/Rocket.Chat/pull/14495)) - Google Plus account is no longer accessible ([#14503](https://github.com/RocketChat/Rocket.Chat/pull/14503) by [@zdumitru](https://github.com/zdumitru)) - [IMPROVEMENT] Add tooltip to to notify user the purpose of back button in discussion ([#13872](https://github.com/RocketChat/Rocket.Chat/pull/13872) by [@ashwaniYDV](https://github.com/ashwaniYDV)) -- eslint errors currently on develop ([#14518](https://github.com/RocketChat/Rocket.Chat/pull/14518)) +- eslint errors currently on develop ([#14518](https://github.com/RocketChat/Rocket.Chat/pull/14518) by [@Hudell](https://github.com/Hudell)) - Allow removing description, topic and annoucement of rooms(set as empty string) ([#13682](https://github.com/RocketChat/Rocket.Chat/pull/13682)) - [IMPROVEMENT] Don't group messages with different alias ([#14257](https://github.com/RocketChat/Rocket.Chat/pull/14257) by [@jungeonkim](https://github.com/jungeonkim)) - LingoHub based on develop ([#14478](https://github.com/RocketChat/Rocket.Chat/pull/14478)) @@ -648,11 +776,11 @@ - New eslint rules ([#14332](https://github.com/RocketChat/Rocket.Chat/pull/14332)) - Fix i18n files keys sort ([#14433](https://github.com/RocketChat/Rocket.Chat/pull/14433)) - Fixes on DAU and MAU aggregations ([#14418](https://github.com/RocketChat/Rocket.Chat/pull/14418)) -- Add missing german translations ([#14386](https://github.com/RocketChat/Rocket.Chat/pull/14386)) +- Add missing german translations ([#14386](https://github.com/RocketChat/Rocket.Chat/pull/14386) by [@mrsimpson](https://github.com/mrsimpson)) - LingoHub based on develop ([#14426](https://github.com/RocketChat/Rocket.Chat/pull/14426)) -- fix discussions: remove restriction for editing room info, server side ([#14039](https://github.com/RocketChat/Rocket.Chat/pull/14039)) +- fix discussions: remove restriction for editing room info, server side ([#14039](https://github.com/RocketChat/Rocket.Chat/pull/14039) by [@mrsimpson](https://github.com/mrsimpson)) - Fix: Message body was not being updated when user disabled nrr message ([#14390](https://github.com/RocketChat/Rocket.Chat/pull/14390)) -- Improve German translations ([#14351](https://github.com/RocketChat/Rocket.Chat/pull/14351)) +- Improve German translations ([#14351](https://github.com/RocketChat/Rocket.Chat/pull/14351) by [@mrsimpson](https://github.com/mrsimpson)) - Merge master into develop & Set version to 1.1.0-develop ([#14317](https://github.com/RocketChat/Rocket.Chat/pull/14317) by [@wreiske](https://github.com/wreiske)) - Merge master into develop & Set version to 1.1.0-develop ([#14294](https://github.com/RocketChat/Rocket.Chat/pull/14294)) - Fix: Add emoji shortnames to emoji's list ([#14576](https://github.com/RocketChat/Rocket.Chat/pull/14576)) @@ -672,6 +800,7 @@ ### 👩‍💻👨‍💻 Contributors 😍 - [@AnBo83](https://github.com/AnBo83) +- [@Hudell](https://github.com/Hudell) - [@Kailash0311](https://github.com/Kailash0311) - [@arminfelder](https://github.com/arminfelder) - [@ashwaniYDV](https://github.com/ashwaniYDV) @@ -683,6 +812,7 @@ - [@kukkjanos](https://github.com/kukkjanos) - [@miolane](https://github.com/miolane) - [@mjovanovic0](https://github.com/mjovanovic0) +- [@mrsimpson](https://github.com/mrsimpson) - [@mushroomgenie](https://github.com/mushroomgenie) - [@supra08](https://github.com/supra08) - [@wreiske](https://github.com/wreiske) @@ -690,13 +820,11 @@ ### 👩‍💻👨‍💻 Core Team 🤓 -- [@Hudell](https://github.com/Hudell) - [@MarcosSpessatto](https://github.com/MarcosSpessatto) - [@alansikora](https://github.com/alansikora) - [@engelgabriel](https://github.com/engelgabriel) - [@geekgonecrazy](https://github.com/geekgonecrazy) - [@ggazzo](https://github.com/ggazzo) -- [@mrsimpson](https://github.com/mrsimpson) - [@renatobecker](https://github.com/renatobecker) - [@rodrigok](https://github.com/rodrigok) - [@sampaiodiego](https://github.com/sampaiodiego) @@ -748,17 +876,20 @@
🔍 Minor changes -- Release 1.0.3 ([#14446](https://github.com/RocketChat/Rocket.Chat/pull/14446)) +- Release 1.0.3 ([#14446](https://github.com/RocketChat/Rocket.Chat/pull/14446) by [@mrsimpson](https://github.com/mrsimpson))
+### 👩‍💻👨‍💻 Contributors 😍 + +- [@mrsimpson](https://github.com/mrsimpson) + ### 👩‍💻👨‍💻 Core Team 🤓 - [@MarcosSpessatto](https://github.com/MarcosSpessatto) - [@engelgabriel](https://github.com/engelgabriel) - [@geekgonecrazy](https://github.com/geekgonecrazy) - [@ggazzo](https://github.com/ggazzo) -- [@mrsimpson](https://github.com/mrsimpson) - [@rodrigok](https://github.com/rodrigok) - [@sampaiodiego](https://github.com/sampaiodiego) - [@tassoevan](https://github.com/tassoevan) @@ -861,11 +992,11 @@ ### 🎉 New features - Marketplace integration with Rocket.Chat Cloud ([#13809](https://github.com/RocketChat/Rocket.Chat/pull/13809)) -- Add message action to copy message to input as reply ([#12626](https://github.com/RocketChat/Rocket.Chat/pull/12626)) +- Add message action to copy message to input as reply ([#12626](https://github.com/RocketChat/Rocket.Chat/pull/12626) by [@mrsimpson](https://github.com/mrsimpson)) - Allow sending long messages as attachments ([#13819](https://github.com/RocketChat/Rocket.Chat/pull/13819)) - Add e-mail field on Livechat Departments ([#13775](https://github.com/RocketChat/Rocket.Chat/pull/13775)) - Provide new Livechat client as community feature ([#13723](https://github.com/RocketChat/Rocket.Chat/pull/13723)) -- Discussions ([#13541](https://github.com/RocketChat/Rocket.Chat/pull/13541) by [@vickyokrm](https://github.com/vickyokrm)) +- Discussions ([#13541](https://github.com/RocketChat/Rocket.Chat/pull/13541) by [@mrsimpson](https://github.com/mrsimpson) & [@vickyokrm](https://github.com/vickyokrm)) - Bosnian lang (BS) ([#13635](https://github.com/RocketChat/Rocket.Chat/pull/13635) by [@fliptrail](https://github.com/fliptrail)) - Federation ([#12370](https://github.com/RocketChat/Rocket.Chat/pull/12370)) - Show department field on Livechat visitor panel ([#13530](https://github.com/RocketChat/Rocket.Chat/pull/13530)) @@ -885,7 +1016,7 @@ - Add GET method to fetch Livechat message through REST API ([#14147](https://github.com/RocketChat/Rocket.Chat/pull/14147)) - Add Voxtelesys to list of SMS providers ([#13697](https://github.com/RocketChat/Rocket.Chat/pull/13697) by [@jhnburke8](https://github.com/jhnburke8) & [@john08burke](https://github.com/john08burke)) - Rest endpoints of discussions ([#13987](https://github.com/RocketChat/Rocket.Chat/pull/13987)) -- Multiple slackbridges ([#11346](https://github.com/RocketChat/Rocket.Chat/pull/11346) by [@kable-wilmoth](https://github.com/kable-wilmoth)) +- Multiple slackbridges ([#11346](https://github.com/RocketChat/Rocket.Chat/pull/11346) by [@Hudell](https://github.com/Hudell) & [@kable-wilmoth](https://github.com/kable-wilmoth)) - option to not use nrr (experimental) ([#14224](https://github.com/RocketChat/Rocket.Chat/pull/14224)) - Set up livechat connections created from new client ([#14236](https://github.com/RocketChat/Rocket.Chat/pull/14236)) - allow drop files on thread ([#14214](https://github.com/RocketChat/Rocket.Chat/pull/14214)) @@ -911,8 +1042,8 @@ - Update to MongoDB 4.0 in docker-compose file ([#13396](https://github.com/RocketChat/Rocket.Chat/pull/13396) by [@ngulden](https://github.com/ngulden)) - Admin ui ([#13393](https://github.com/RocketChat/Rocket.Chat/pull/13393)) - End to end tests ([#13401](https://github.com/RocketChat/Rocket.Chat/pull/13401)) -- Update deleteUser errors to be more semantic ([#12380](https://github.com/RocketChat/Rocket.Chat/pull/12380)) -- Line height on static content pages ([#11673](https://github.com/RocketChat/Rocket.Chat/pull/11673)) +- Update deleteUser errors to be more semantic ([#12380](https://github.com/RocketChat/Rocket.Chat/pull/12380) by [@timkinnane](https://github.com/timkinnane)) +- Line height on static content pages ([#11673](https://github.com/RocketChat/Rocket.Chat/pull/11673) by [@timkinnane](https://github.com/timkinnane)) - new icons ([#13289](https://github.com/RocketChat/Rocket.Chat/pull/13289)) - Add permission to change other user profile avatar ([#13884](https://github.com/RocketChat/Rocket.Chat/pull/13884) by [@knrt10](https://github.com/knrt10)) - UI of Permissions page ([#13732](https://github.com/RocketChat/Rocket.Chat/pull/13732) by [@fliptrail](https://github.com/fliptrail)) @@ -974,11 +1105,11 @@ - Attachments without dates were showing December 31, 1970 ([#13428](https://github.com/RocketChat/Rocket.Chat/pull/13428) by [@wreiske](https://github.com/wreiske)) - Restart required to apply changes in API Rate Limiter settings ([#13451](https://github.com/RocketChat/Rocket.Chat/pull/13451)) - Ability to activate an app installed by zip even offline ([#13563](https://github.com/RocketChat/Rocket.Chat/pull/13563)) -- .bin extension added to attached file names ([#13468](https://github.com/RocketChat/Rocket.Chat/pull/13468)) +- .bin extension added to attached file names ([#13468](https://github.com/RocketChat/Rocket.Chat/pull/13468) by [@Hudell](https://github.com/Hudell)) - Right arrows in default HTML content ([#13502](https://github.com/RocketChat/Rocket.Chat/pull/13502)) - Typo in a referrer header in inject.js file ([#13469](https://github.com/RocketChat/Rocket.Chat/pull/13469) by [@algomaster99](https://github.com/algomaster99)) - Fix issue cannot filter channels by name ([#12952](https://github.com/RocketChat/Rocket.Chat/pull/12952) by [@huydang284](https://github.com/huydang284)) -- mention-links not being always resolved ([#11745](https://github.com/RocketChat/Rocket.Chat/pull/11745)) +- mention-links not being always resolved ([#11745](https://github.com/RocketChat/Rocket.Chat/pull/11745) by [@mrsimpson](https://github.com/mrsimpson)) - allow user to logout before set username ([#13439](https://github.com/RocketChat/Rocket.Chat/pull/13439)) - Error when recording data into the connection object ([#13553](https://github.com/RocketChat/Rocket.Chat/pull/13553)) - Handle showing/hiding input in messageBox ([#13564](https://github.com/RocketChat/Rocket.Chat/pull/13564)) @@ -1004,7 +1135,7 @@ - Improve cloud section ([#13820](https://github.com/RocketChat/Rocket.Chat/pull/13820)) - Wrong permalink when running in subdir ([#13746](https://github.com/RocketChat/Rocket.Chat/pull/13746) by [@ura14h](https://github.com/ura14h)) - Change localStorage keys to work when server is running in a subdir ([#13968](https://github.com/RocketChat/Rocket.Chat/pull/13968)) -- SAML certificate settings don't follow a pattern ([#14179](https://github.com/RocketChat/Rocket.Chat/pull/14179)) +- SAML certificate settings don't follow a pattern ([#14179](https://github.com/RocketChat/Rocket.Chat/pull/14179) by [@Hudell](https://github.com/Hudell)) - Custom Oauth store refresh and id tokens with expiresIn ([#14121](https://github.com/RocketChat/Rocket.Chat/pull/14121) by [@ralfbecker](https://github.com/ralfbecker)) - Apps converters delete fields on message attachments ([#14028](https://github.com/RocketChat/Rocket.Chat/pull/14028)) - Custom Oauth login not working with accessToken ([#14113](https://github.com/RocketChat/Rocket.Chat/pull/14113) by [@knrt10](https://github.com/knrt10)) @@ -1023,7 +1154,7 @@ - Sidenav does not open on some admin pages ([#14010](https://github.com/RocketChat/Rocket.Chat/pull/14010)) - Empty result when getting badge count notification ([#14244](https://github.com/RocketChat/Rocket.Chat/pull/14244)) - Obey audio notification preferences ([#14188](https://github.com/RocketChat/Rocket.Chat/pull/14188)) -- Slackbridge private channels ([#14273](https://github.com/RocketChat/Rocket.Chat/pull/14273) by [@nylen](https://github.com/nylen)) +- Slackbridge private channels ([#14273](https://github.com/RocketChat/Rocket.Chat/pull/14273) by [@Hudell](https://github.com/Hudell) & [@nylen](https://github.com/nylen)) - View All members button now not in direct room ([#14081](https://github.com/RocketChat/Rocket.Chat/pull/14081) by [@knrt10](https://github.com/knrt10))
@@ -1124,11 +1255,11 @@ - Remove dependency of RC namespace in rc-oauth2-server and message-star ([#13344](https://github.com/RocketChat/Rocket.Chat/pull/13344)) - Remove dependency of RC namespace in rc-message-pin and message-snippet ([#13343](https://github.com/RocketChat/Rocket.Chat/pull/13343)) - Depackaging ([#13483](https://github.com/RocketChat/Rocket.Chat/pull/13483)) -- Merge master into develop & Set version to 1.0.0-develop ([#13435](https://github.com/RocketChat/Rocket.Chat/pull/13435) by [@TkTech](https://github.com/TkTech) & [@theundefined](https://github.com/theundefined)) +- Merge master into develop & Set version to 1.0.0-develop ([#13435](https://github.com/RocketChat/Rocket.Chat/pull/13435) by [@Hudell](https://github.com/Hudell) & [@TkTech](https://github.com/TkTech) & [@theundefined](https://github.com/theundefined)) - Regression: Table admin pages ([#13411](https://github.com/RocketChat/Rocket.Chat/pull/13411)) - Regression: Template error ([#13410](https://github.com/RocketChat/Rocket.Chat/pull/13410)) - Removed old templates ([#13406](https://github.com/RocketChat/Rocket.Chat/pull/13406)) -- Add pagination to getUsersOfRoom ([#12834](https://github.com/RocketChat/Rocket.Chat/pull/12834)) +- Add pagination to getUsersOfRoom ([#12834](https://github.com/RocketChat/Rocket.Chat/pull/12834) by [@Hudell](https://github.com/Hudell)) - OpenShift custom OAuth support ([#13925](https://github.com/RocketChat/Rocket.Chat/pull/13925) by [@bsharrow](https://github.com/bsharrow)) - Settings: disable reset button ([#14026](https://github.com/RocketChat/Rocket.Chat/pull/14026)) - Settings: hiding reset button for readonly fields ([#14025](https://github.com/RocketChat/Rocket.Chat/pull/14025)) @@ -1208,6 +1339,7 @@ ### 👩‍💻👨‍💻 Contributors 😍 - [@DeviaVir](https://github.com/DeviaVir) +- [@Hudell](https://github.com/Hudell) - [@Kailash0311](https://github.com/Kailash0311) - [@MohammedEssehemy](https://github.com/MohammedEssehemy) - [@Montel](https://github.com/Montel) @@ -1229,6 +1361,7 @@ - [@knrt10](https://github.com/knrt10) - [@localguru](https://github.com/localguru) - [@mjovanovic0](https://github.com/mjovanovic0) +- [@mrsimpson](https://github.com/mrsimpson) - [@ngulden](https://github.com/ngulden) - [@nylen](https://github.com/nylen) - [@pkolmann](https://github.com/pkolmann) @@ -1243,6 +1376,7 @@ - [@the4ndy](https://github.com/the4ndy) - [@theundefined](https://github.com/theundefined) - [@tiangolo](https://github.com/tiangolo) +- [@timkinnane](https://github.com/timkinnane) - [@trivoallan](https://github.com/trivoallan) - [@ulf-f](https://github.com/ulf-f) - [@ura14h](https://github.com/ura14h) @@ -1254,7 +1388,6 @@ ### 👩‍💻👨‍💻 Core Team 🤓 -- [@Hudell](https://github.com/Hudell) - [@LuluGO](https://github.com/LuluGO) - [@MarcosSpessatto](https://github.com/MarcosSpessatto) - [@alansikora](https://github.com/alansikora) @@ -1264,12 +1397,10 @@ - [@ggazzo](https://github.com/ggazzo) - [@graywolf336](https://github.com/graywolf336) - [@marceloschmidt](https://github.com/marceloschmidt) -- [@mrsimpson](https://github.com/mrsimpson) - [@renatobecker](https://github.com/renatobecker) - [@rodrigok](https://github.com/rodrigok) - [@sampaiodiego](https://github.com/sampaiodiego) - [@tassoevan](https://github.com/tassoevan) -- [@timkinnane](https://github.com/timkinnane) # 0.74.3 `2019-02-13 · 3 🚀 · 11 🐛 · 3 🔍 · 9 👩‍💻👨‍💻` @@ -1292,9 +1423,9 @@ - Translated and incorrect i18n variables ([#13463](https://github.com/RocketChat/Rocket.Chat/pull/13463) by [@leonboot](https://github.com/leonboot)) - Properly escape custom emoji names for pattern matching ([#13408](https://github.com/RocketChat/Rocket.Chat/pull/13408)) - Not translated emails ([#13452](https://github.com/RocketChat/Rocket.Chat/pull/13452)) -- XML-decryption module not found ([#13437](https://github.com/RocketChat/Rocket.Chat/pull/13437)) +- XML-decryption module not found ([#13437](https://github.com/RocketChat/Rocket.Chat/pull/13437) by [@Hudell](https://github.com/Hudell)) - Update Russian localization ([#13244](https://github.com/RocketChat/Rocket.Chat/pull/13244) by [@BehindLoader](https://github.com/BehindLoader)) -- Several Problems on HipChat Importer ([#13336](https://github.com/RocketChat/Rocket.Chat/pull/13336)) +- Several Problems on HipChat Importer ([#13336](https://github.com/RocketChat/Rocket.Chat/pull/13336) by [@Hudell](https://github.com/Hudell)) - Invalid push gateway configuration, requires the uniqueId ([#13423](https://github.com/RocketChat/Rocket.Chat/pull/13423)) - Notify private settings changes even on public settings changed ([#13369](https://github.com/RocketChat/Rocket.Chat/pull/13369)) - Misaligned upload progress bar "cancel" button ([#13407](https://github.com/RocketChat/Rocket.Chat/pull/13407)) @@ -1302,7 +1433,7 @@
🔍 Minor changes -- Release 0.74.3 ([#13474](https://github.com/RocketChat/Rocket.Chat/pull/13474) by [@BehindLoader](https://github.com/BehindLoader) & [@leonboot](https://github.com/leonboot)) +- Release 0.74.3 ([#13474](https://github.com/RocketChat/Rocket.Chat/pull/13474) by [@BehindLoader](https://github.com/BehindLoader) & [@Hudell](https://github.com/Hudell) & [@leonboot](https://github.com/leonboot)) - Room loading improvements ([#13471](https://github.com/RocketChat/Rocket.Chat/pull/13471)) - Regression: Remove console.log on email translations ([#13456](https://github.com/RocketChat/Rocket.Chat/pull/13456)) @@ -1311,11 +1442,11 @@ ### 👩‍💻👨‍💻 Contributors 😍 - [@BehindLoader](https://github.com/BehindLoader) +- [@Hudell](https://github.com/Hudell) - [@leonboot](https://github.com/leonboot) ### 👩‍💻👨‍💻 Core Team 🤓 -- [@Hudell](https://github.com/Hudell) - [@d-gubert](https://github.com/d-gubert) - [@graywolf336](https://github.com/graywolf336) - [@renatobecker](https://github.com/renatobecker) @@ -1366,11 +1497,11 @@ ### 🐛 Bug fixes - Mobile view and re-enable E2E tests ([#13322](https://github.com/RocketChat/Rocket.Chat/pull/13322)) -- Hipchat Enterprise Importer not generating subscriptions ([#13293](https://github.com/RocketChat/Rocket.Chat/pull/13293)) +- Hipchat Enterprise Importer not generating subscriptions ([#13293](https://github.com/RocketChat/Rocket.Chat/pull/13293) by [@Hudell](https://github.com/Hudell)) - Message updating by Apps ([#13294](https://github.com/RocketChat/Rocket.Chat/pull/13294)) - REST endpoint for creating custom emojis ([#13306](https://github.com/RocketChat/Rocket.Chat/pull/13306)) - Preview of image uploads were not working when apps framework is enable ([#13303](https://github.com/RocketChat/Rocket.Chat/pull/13303)) -- HipChat Enterprise importer fails when importing a large amount of messages (millions) ([#13221](https://github.com/RocketChat/Rocket.Chat/pull/13221)) +- HipChat Enterprise importer fails when importing a large amount of messages (millions) ([#13221](https://github.com/RocketChat/Rocket.Chat/pull/13221) by [@Hudell](https://github.com/Hudell)) - Fix bug when user try recreate channel or group with same name and remove room from cache when user leaves room ([#12341](https://github.com/RocketChat/Rocket.Chat/pull/12341))
@@ -1380,9 +1511,12 @@
-### 👩‍💻👨‍💻 Core Team 🤓 +### 👩‍💻👨‍💻 Contributors 😍 - [@Hudell](https://github.com/Hudell) + +### 👩‍💻👨‍💻 Core Team 🤓 + - [@MarcosSpessatto](https://github.com/MarcosSpessatto) - [@d-gubert](https://github.com/d-gubert) - [@geekgonecrazy](https://github.com/geekgonecrazy) @@ -1423,7 +1557,7 @@ - Return room type field on Livechat findRoom method ([#13078](https://github.com/RocketChat/Rocket.Chat/pull/13078)) - Return visitorEmails field on Livechat findGuest method ([#13097](https://github.com/RocketChat/Rocket.Chat/pull/13097)) - Adds the "showConnecting" property to Livechat Config payload ([#13158](https://github.com/RocketChat/Rocket.Chat/pull/13158)) -- Adds history log for all Importers and improves HipChat import performance ([#13083](https://github.com/RocketChat/Rocket.Chat/pull/13083)) +- Adds history log for all Importers and improves HipChat import performance ([#13083](https://github.com/RocketChat/Rocket.Chat/pull/13083) by [@Hudell](https://github.com/Hudell)) - Inject metrics on callbacks ([#13266](https://github.com/RocketChat/Rocket.Chat/pull/13266)) ### 🐛 Bug fixes @@ -1482,7 +1616,7 @@ - Move rocketchat models ([#13027](https://github.com/RocketChat/Rocket.Chat/pull/13027)) - Move rocketchat settings to specific package ([#13026](https://github.com/RocketChat/Rocket.Chat/pull/13026)) - Remove incorrect pt-BR translation ([#13074](https://github.com/RocketChat/Rocket.Chat/pull/13074)) -- Merge master into develop & Set version to 0.74.0-develop ([#13050](https://github.com/RocketChat/Rocket.Chat/pull/13050) by [@ohmonster](https://github.com/ohmonster) & [@piotrkochan](https://github.com/piotrkochan)) +- Merge master into develop & Set version to 0.74.0-develop ([#13050](https://github.com/RocketChat/Rocket.Chat/pull/13050) by [@Hudell](https://github.com/Hudell) & [@ohmonster](https://github.com/ohmonster) & [@piotrkochan](https://github.com/piotrkochan)) - Regression: Fix audio message upload ([#13224](https://github.com/RocketChat/Rocket.Chat/pull/13224)) - Regression: Fix message pinning ([#13213](https://github.com/RocketChat/Rocket.Chat/pull/13213) by [@TkTech](https://github.com/TkTech)) - Regression: Fix emoji search ([#13207](https://github.com/RocketChat/Rocket.Chat/pull/13207)) @@ -1492,6 +1626,7 @@ ### 👩‍💻👨‍💻 Contributors 😍 +- [@Hudell](https://github.com/Hudell) - [@Jeroeny](https://github.com/Jeroeny) - [@Kailash0311](https://github.com/Kailash0311) - [@TkTech](https://github.com/TkTech) @@ -1507,7 +1642,6 @@ ### 👩‍💻👨‍💻 Core Team 🤓 -- [@Hudell](https://github.com/Hudell) - [@LuluGO](https://github.com/LuluGO) - [@MarcosSpessatto](https://github.com/MarcosSpessatto) - [@d-gubert](https://github.com/d-gubert) @@ -1581,7 +1715,7 @@ ### 🎉 New features - Create new permission.listAll endpoint to be able to use updatedSince parameter ([#12748](https://github.com/RocketChat/Rocket.Chat/pull/12748)) -- Mandatory 2fa for role ([#9748](https://github.com/RocketChat/Rocket.Chat/pull/9748) by [@karlprieb](https://github.com/karlprieb)) +- Mandatory 2fa for role ([#9748](https://github.com/RocketChat/Rocket.Chat/pull/9748) by [@Hudell](https://github.com/Hudell) & [@karlprieb](https://github.com/karlprieb)) - Add query parameter support to emoji-custom endpoint ([#12754](https://github.com/RocketChat/Rocket.Chat/pull/12754)) - Added a link to contributing.md ([#12856](https://github.com/RocketChat/Rocket.Chat/pull/12856) by [@sanketsingh24](https://github.com/sanketsingh24)) - Added chat.getDeletedMessages since specific date ([#13010](https://github.com/RocketChat/Rocket.Chat/pull/13010)) @@ -1589,11 +1723,11 @@ - Syncloud deploy option ([#12867](https://github.com/RocketChat/Rocket.Chat/pull/12867) by [@cyberb](https://github.com/cyberb)) - Config hooks for snap ([#12351](https://github.com/RocketChat/Rocket.Chat/pull/12351)) - Livechat registration form message ([#12597](https://github.com/RocketChat/Rocket.Chat/pull/12597)) -- Include message type & id in push notification payload ([#12771](https://github.com/RocketChat/Rocket.Chat/pull/12771)) +- Include message type & id in push notification payload ([#12771](https://github.com/RocketChat/Rocket.Chat/pull/12771) by [@cardoso](https://github.com/cardoso)) ### 🚀 Improvements -- Hipchat Enterprise Importer ([#12985](https://github.com/RocketChat/Rocket.Chat/pull/12985)) +- Hipchat Enterprise Importer ([#12985](https://github.com/RocketChat/Rocket.Chat/pull/12985) by [@Hudell](https://github.com/Hudell)) - Add missing translation keys. ([#12722](https://github.com/RocketChat/Rocket.Chat/pull/12722) by [@ura14h](https://github.com/ura14h)) - Accept Slash Commands via Action Buttons when `msg_in_chat_window: true` ([#13009](https://github.com/RocketChat/Rocket.Chat/pull/13009)) - Allow transfer Livechats to online agents only ([#13008](https://github.com/RocketChat/Rocket.Chat/pull/13008)) @@ -1612,7 +1746,7 @@ - Webdav integration account settings were being shown even when Webdav was disabled ([#12569](https://github.com/RocketChat/Rocket.Chat/pull/12569) by [@karakayasemi](https://github.com/karakayasemi)) - Provide better Dutch translations 🇳🇱 ([#12792](https://github.com/RocketChat/Rocket.Chat/pull/12792) by [@mathysie](https://github.com/mathysie)) - E2E`s password reaveal text is always `>%S` when language is zh ([#12795](https://github.com/RocketChat/Rocket.Chat/pull/12795) by [@lvyue](https://github.com/lvyue)) -- Nested Markdown blocks not parsed properly ([#12998](https://github.com/RocketChat/Rocket.Chat/pull/12998)) +- Nested Markdown blocks not parsed properly ([#12998](https://github.com/RocketChat/Rocket.Chat/pull/12998) by [@Hudell](https://github.com/Hudell)) - Change JSON to EJSON.parse query to support type Date ([#12706](https://github.com/RocketChat/Rocket.Chat/pull/12706)) - Inherit font family in message user card ([#13004](https://github.com/RocketChat/Rocket.Chat/pull/13004)) - Some deprecation issues for media recording ([#12948](https://github.com/RocketChat/Rocket.Chat/pull/12948)) @@ -1629,12 +1763,12 @@ - Padding for message box in embedded layout ([#12556](https://github.com/RocketChat/Rocket.Chat/pull/12556)) - Crowd sync was being stopped when a user was not found ([#12930](https://github.com/RocketChat/Rocket.Chat/pull/12930) by [@piotrkochan](https://github.com/piotrkochan)) - Some icons were missing ([#12913](https://github.com/RocketChat/Rocket.Chat/pull/12913)) -- User data download fails when a room has been deleted. ([#12829](https://github.com/RocketChat/Rocket.Chat/pull/12829)) -- CAS Login not working with renamed users ([#12860](https://github.com/RocketChat/Rocket.Chat/pull/12860)) +- User data download fails when a room has been deleted. ([#12829](https://github.com/RocketChat/Rocket.Chat/pull/12829) by [@Hudell](https://github.com/Hudell)) +- CAS Login not working with renamed users ([#12860](https://github.com/RocketChat/Rocket.Chat/pull/12860) by [@Hudell](https://github.com/Hudell)) - Stream of my_message wasn't sending the room information ([#12914](https://github.com/RocketChat/Rocket.Chat/pull/12914)) -- cannot reset password ([#12903](https://github.com/RocketChat/Rocket.Chat/pull/12903)) +- cannot reset password ([#12903](https://github.com/RocketChat/Rocket.Chat/pull/12903) by [@Hudell](https://github.com/Hudell)) - Version check update notification ([#12905](https://github.com/RocketChat/Rocket.Chat/pull/12905)) -- Data Import not working ([#12866](https://github.com/RocketChat/Rocket.Chat/pull/12866)) +- Data Import not working ([#12866](https://github.com/RocketChat/Rocket.Chat/pull/12866) by [@Hudell](https://github.com/Hudell)) - Incorrect parameter name in Livechat stream ([#12851](https://github.com/RocketChat/Rocket.Chat/pull/12851)) - Autotranslate icon on message action menu ([#12585](https://github.com/RocketChat/Rocket.Chat/pull/12585)) - Google Cloud Storage storage provider ([#12843](https://github.com/RocketChat/Rocket.Chat/pull/12843)) @@ -1725,14 +1859,16 @@ - Add check to make sure releases was updated ([#12791](https://github.com/RocketChat/Rocket.Chat/pull/12791)) - Merge master into develop & Set version to 0.73.0-develop ([#12776](https://github.com/RocketChat/Rocket.Chat/pull/12776)) - Change `chat.getDeletedMessages` to get messages after informed date and return only message's _id ([#13021](https://github.com/RocketChat/Rocket.Chat/pull/13021)) -- Improve Importer code quality ([#13020](https://github.com/RocketChat/Rocket.Chat/pull/13020)) +- Improve Importer code quality ([#13020](https://github.com/RocketChat/Rocket.Chat/pull/13020) by [@Hudell](https://github.com/Hudell)) - Regression: List of custom emojis wasn't working ([#13031](https://github.com/RocketChat/Rocket.Chat/pull/13031))
### 👩‍💻👨‍💻 Contributors 😍 +- [@Hudell](https://github.com/Hudell) - [@alexbartsch](https://github.com/alexbartsch) +- [@cardoso](https://github.com/cardoso) - [@cyberb](https://github.com/cyberb) - [@hypery2k](https://github.com/hypery2k) - [@karakayasemi](https://github.com/karakayasemi) @@ -1748,10 +1884,8 @@ ### 👩‍💻👨‍💻 Core Team 🤓 -- [@Hudell](https://github.com/Hudell) - [@LuluGO](https://github.com/LuluGO) - [@MarcosSpessatto](https://github.com/MarcosSpessatto) -- [@cardoso](https://github.com/cardoso) - [@d-gubert](https://github.com/d-gubert) - [@engelgabriel](https://github.com/engelgabriel) - [@geekgonecrazy](https://github.com/geekgonecrazy) @@ -1768,17 +1902,17 @@
🔍 Minor changes -- Release 0.72.3 ([#12932](https://github.com/RocketChat/Rocket.Chat/pull/12932) by [@piotrkochan](https://github.com/piotrkochan)) +- Release 0.72.3 ([#12932](https://github.com/RocketChat/Rocket.Chat/pull/12932) by [@Hudell](https://github.com/Hudell) & [@piotrkochan](https://github.com/piotrkochan))
### 👩‍💻👨‍💻 Contributors 😍 +- [@Hudell](https://github.com/Hudell) - [@piotrkochan](https://github.com/piotrkochan) ### 👩‍💻👨‍💻 Core Team 🤓 -- [@Hudell](https://github.com/Hudell) - [@ggazzo](https://github.com/ggazzo) - [@rodrigok](https://github.com/rodrigok) - [@tassoevan](https://github.com/tassoevan) @@ -1810,13 +1944,13 @@ - Change spread operator to Array.from for Edge browser ([#12818](https://github.com/RocketChat/Rocket.Chat/pull/12818) by [@ohmonster](https://github.com/ohmonster)) - API users.info returns caller rooms and not requested user ones ([#12727](https://github.com/RocketChat/Rocket.Chat/pull/12727) by [@piotrkochan](https://github.com/piotrkochan)) -- Missing HipChat Enterprise Importer ([#12847](https://github.com/RocketChat/Rocket.Chat/pull/12847)) +- Missing HipChat Enterprise Importer ([#12847](https://github.com/RocketChat/Rocket.Chat/pull/12847) by [@Hudell](https://github.com/Hudell)) - Emoji as avatar ([#12805](https://github.com/RocketChat/Rocket.Chat/pull/12805))
🔍 Minor changes -- Release 0.72.1 ([#12850](https://github.com/RocketChat/Rocket.Chat/pull/12850) by [@ohmonster](https://github.com/ohmonster) & [@piotrkochan](https://github.com/piotrkochan)) +- Release 0.72.1 ([#12850](https://github.com/RocketChat/Rocket.Chat/pull/12850) by [@Hudell](https://github.com/Hudell) & [@ohmonster](https://github.com/ohmonster) & [@piotrkochan](https://github.com/piotrkochan)) - Bump Apps-Engine version ([#12848](https://github.com/RocketChat/Rocket.Chat/pull/12848)) - Change file order in rocketchat-cors ([#12804](https://github.com/RocketChat/Rocket.Chat/pull/12804)) @@ -1824,12 +1958,12 @@ ### 👩‍💻👨‍💻 Contributors 😍 +- [@Hudell](https://github.com/Hudell) - [@ohmonster](https://github.com/ohmonster) - [@piotrkochan](https://github.com/piotrkochan) ### 👩‍💻👨‍💻 Core Team 🤓 -- [@Hudell](https://github.com/Hudell) - [@MarcosSpessatto](https://github.com/MarcosSpessatto) - [@d-gubert](https://github.com/d-gubert) - [@rodrigok](https://github.com/rodrigok) @@ -1846,10 +1980,10 @@ ### 🎉 New features - Add permission to enable personal access token to specific roles ([#12309](https://github.com/RocketChat/Rocket.Chat/pull/12309)) -- Option to reset e2e key ([#12483](https://github.com/RocketChat/Rocket.Chat/pull/12483)) -- /api/v1/spotlight: return joinCodeRequired field for rooms ([#12651](https://github.com/RocketChat/Rocket.Chat/pull/12651)) +- Option to reset e2e key ([#12483](https://github.com/RocketChat/Rocket.Chat/pull/12483) by [@Hudell](https://github.com/Hudell)) +- /api/v1/spotlight: return joinCodeRequired field for rooms ([#12651](https://github.com/RocketChat/Rocket.Chat/pull/12651) by [@cardoso](https://github.com/cardoso)) - New API Endpoints for the new version of JS SDK ([#12623](https://github.com/RocketChat/Rocket.Chat/pull/12623)) -- Setting to configure robots.txt content ([#12547](https://github.com/RocketChat/Rocket.Chat/pull/12547)) +- Setting to configure robots.txt content ([#12547](https://github.com/RocketChat/Rocket.Chat/pull/12547) by [@Hudell](https://github.com/Hudell)) - Make Livechat's widget draggable ([#12378](https://github.com/RocketChat/Rocket.Chat/pull/12378)) ### 🚀 Improvements @@ -1865,11 +1999,11 @@ - Add CTRL modifier for keyboard shortcut ([#12525](https://github.com/RocketChat/Rocket.Chat/pull/12525) by [@nicolasbock](https://github.com/nicolasbock)) - Ignore non-existent Livechat custom fields on Livechat API ([#12522](https://github.com/RocketChat/Rocket.Chat/pull/12522)) - Emoji search on messageBox behaving like emojiPicker's search (#9607) ([#12452](https://github.com/RocketChat/Rocket.Chat/pull/12452) by [@vinade](https://github.com/vinade)) -- German translations ([#12471](https://github.com/RocketChat/Rocket.Chat/pull/12471)) +- German translations ([#12471](https://github.com/RocketChat/Rocket.Chat/pull/12471) by [@mrsimpson](https://github.com/mrsimpson)) - Limit the number of typing users shown (#8722) ([#12400](https://github.com/RocketChat/Rocket.Chat/pull/12400) by [@vinade](https://github.com/vinade)) - Allow apps to update persistence by association ([#12714](https://github.com/RocketChat/Rocket.Chat/pull/12714)) - Add more methods to deal with rooms via Rocket.Chat.Apps ([#12680](https://github.com/RocketChat/Rocket.Chat/pull/12680)) -- Better query for finding subscriptions that need a new E2E Key ([#12692](https://github.com/RocketChat/Rocket.Chat/pull/12692)) +- Better query for finding subscriptions that need a new E2E Key ([#12692](https://github.com/RocketChat/Rocket.Chat/pull/12692) by [@Hudell](https://github.com/Hudell)) ### 🐛 Bug fixes @@ -1966,8 +2100,8 @@ - Fix ES translation ([#12509](https://github.com/RocketChat/Rocket.Chat/pull/12509)) - LingoHub based on develop ([#12470](https://github.com/RocketChat/Rocket.Chat/pull/12470)) - Update npm dependencies ([#12465](https://github.com/RocketChat/Rocket.Chat/pull/12465)) -- Fix: Developers not being able to debug root files in VSCode ([#12440](https://github.com/RocketChat/Rocket.Chat/pull/12440)) -- Merge master into develop & Set version to 0.72.0-develop ([#12460](https://github.com/RocketChat/Rocket.Chat/pull/12460)) +- Fix: Developers not being able to debug root files in VSCode ([#12440](https://github.com/RocketChat/Rocket.Chat/pull/12440) by [@mrsimpson](https://github.com/mrsimpson)) +- Merge master into develop & Set version to 0.72.0-develop ([#12460](https://github.com/RocketChat/Rocket.Chat/pull/12460) by [@Hudell](https://github.com/Hudell)) - Fix some Ukrainian translations ([#12712](https://github.com/RocketChat/Rocket.Chat/pull/12712) by [@zdumitru](https://github.com/zdumitru)) - Improve: Add missing translation keys. ([#12708](https://github.com/RocketChat/Rocket.Chat/pull/12708) by [@ura14h](https://github.com/ura14h)) - Bump Apps Engine to 1.3.0 ([#12705](https://github.com/RocketChat/Rocket.Chat/pull/12705)) @@ -1984,10 +2118,13 @@ ### 👩‍💻👨‍💻 Contributors 😍 - [@AndreamApp](https://github.com/AndreamApp) +- [@Hudell](https://github.com/Hudell) - [@Ismaw34](https://github.com/Ismaw34) +- [@cardoso](https://github.com/cardoso) - [@imronras](https://github.com/imronras) - [@karlprieb](https://github.com/karlprieb) - [@mbrodala](https://github.com/mbrodala) +- [@mrsimpson](https://github.com/mrsimpson) - [@nicolasbock](https://github.com/nicolasbock) - [@pfuender](https://github.com/pfuender) - [@ph1p](https://github.com/ph1p) @@ -2000,13 +2137,10 @@ ### 👩‍💻👨‍💻 Core Team 🤓 -- [@Hudell](https://github.com/Hudell) - [@MarcosSpessatto](https://github.com/MarcosSpessatto) -- [@cardoso](https://github.com/cardoso) - [@engelgabriel](https://github.com/engelgabriel) - [@ggazzo](https://github.com/ggazzo) - [@marceloschmidt](https://github.com/marceloschmidt) -- [@mrsimpson](https://github.com/mrsimpson) - [@renatobecker](https://github.com/renatobecker) - [@rodrigok](https://github.com/rodrigok) - [@sampaiodiego](https://github.com/sampaiodiego) @@ -2074,9 +2208,9 @@ - Add image dimensions to attachment even when no reorientation is required ([#11521](https://github.com/RocketChat/Rocket.Chat/pull/11521)) - iframe login token not checked ([#12158](https://github.com/RocketChat/Rocket.Chat/pull/12158) by [@nimetu](https://github.com/nimetu)) - REST `users.setAvatar` endpoint wasn't allowing update the avatar of other users even with correct permissions ([#11431](https://github.com/RocketChat/Rocket.Chat/pull/11431)) -- Slack importer: image previews not showing ([#11875](https://github.com/RocketChat/Rocket.Chat/pull/11875) by [@madguy02](https://github.com/madguy02)) +- Slack importer: image previews not showing ([#11875](https://github.com/RocketChat/Rocket.Chat/pull/11875) by [@Hudell](https://github.com/Hudell) & [@madguy02](https://github.com/madguy02)) - Edit room name with uppercase letters ([#12235](https://github.com/RocketChat/Rocket.Chat/pull/12235) by [@nikeee](https://github.com/nikeee)) -- Custom OAuth Configuration can't be removed ([#12256](https://github.com/RocketChat/Rocket.Chat/pull/12256)) +- Custom OAuth Configuration can't be removed ([#12256](https://github.com/RocketChat/Rocket.Chat/pull/12256) by [@Hudell](https://github.com/Hudell)) - Remove e2e from users endpoint responses ([#12344](https://github.com/RocketChat/Rocket.Chat/pull/12344)) - email api TAPi18n is undefined ([#12373](https://github.com/RocketChat/Rocket.Chat/pull/12373)) - Blockstack errors in IE 11 ([#12338](https://github.com/RocketChat/Rocket.Chat/pull/12338)) @@ -2109,6 +2243,7 @@ ### 👩‍💻👨‍💻 Contributors 😍 +- [@Hudell](https://github.com/Hudell) - [@MarcosEllys](https://github.com/MarcosEllys) - [@crazy-max](https://github.com/crazy-max) - [@isabellarussell](https://github.com/isabellarussell) @@ -2122,7 +2257,6 @@ ### 👩‍💻👨‍💻 Core Team 🤓 -- [@Hudell](https://github.com/Hudell) - [@MarcosSpessatto](https://github.com/MarcosSpessatto) - [@Sing-Li](https://github.com/Sing-Li) - [@geekgonecrazy](https://github.com/geekgonecrazy) @@ -2180,19 +2314,22 @@ ### 🐛 Bug fixes -- E2E alert shows up when encryption is disabled ([#12272](https://github.com/RocketChat/Rocket.Chat/pull/12272)) +- E2E alert shows up when encryption is disabled ([#12272](https://github.com/RocketChat/Rocket.Chat/pull/12272) by [@Hudell](https://github.com/Hudell))
🔍 Minor changes - Release 0.70.3 ([#12281](https://github.com/RocketChat/Rocket.Chat/pull/12281)) -- Release 0.70.2 ([#12276](https://github.com/RocketChat/Rocket.Chat/pull/12276)) +- Release 0.70.2 ([#12276](https://github.com/RocketChat/Rocket.Chat/pull/12276) by [@Hudell](https://github.com/Hudell))
-### 👩‍💻👨‍💻 Core Team 🤓 +### 👩‍💻👨‍💻 Contributors 😍 - [@Hudell](https://github.com/Hudell) + +### 👩‍💻👨‍💻 Core Team 🤓 + - [@sampaiodiego](https://github.com/sampaiodiego) # 0.70.1 @@ -2204,8 +2341,8 @@ ### 🐛 Bug fixes -- E2E data not cleared on logout ([#12254](https://github.com/RocketChat/Rocket.Chat/pull/12254)) -- E2E password request not closing after entering password ([#12232](https://github.com/RocketChat/Rocket.Chat/pull/12232)) +- E2E data not cleared on logout ([#12254](https://github.com/RocketChat/Rocket.Chat/pull/12254) by [@Hudell](https://github.com/Hudell)) +- E2E password request not closing after entering password ([#12232](https://github.com/RocketChat/Rocket.Chat/pull/12232) by [@Hudell](https://github.com/Hudell)) - Message editing was duplicating reply quotes ([#12263](https://github.com/RocketChat/Rocket.Chat/pull/12263)) - Livechat integration with RDStation ([#12257](https://github.com/RocketChat/Rocket.Chat/pull/12257)) - Livechat triggers being registered twice after setting department via API ([#12255](https://github.com/RocketChat/Rocket.Chat/pull/12255) by [@edzluhan](https://github.com/edzluhan)) @@ -2216,8 +2353,8 @@
🔍 Minor changes -- Release 0.70.1 ([#12270](https://github.com/RocketChat/Rocket.Chat/pull/12270) by [@edzluhan](https://github.com/edzluhan)) -- Merge master into develop & Set version to 0.71.0-develop ([#12264](https://github.com/RocketChat/Rocket.Chat/pull/12264) by [@kaiiiiiiiii](https://github.com/kaiiiiiiiii)) +- Release 0.70.1 ([#12270](https://github.com/RocketChat/Rocket.Chat/pull/12270) by [@Hudell](https://github.com/Hudell) & [@edzluhan](https://github.com/edzluhan)) +- Merge master into develop & Set version to 0.71.0-develop ([#12264](https://github.com/RocketChat/Rocket.Chat/pull/12264) by [@cardoso](https://github.com/cardoso) & [@kaiiiiiiiii](https://github.com/kaiiiiiiiii) & [@timkinnane](https://github.com/timkinnane)) - Regression: fix modal submit ([#12233](https://github.com/RocketChat/Rocket.Chat/pull/12233)) - Add reetp to the issues' bot whitelist ([#12227](https://github.com/RocketChat/Rocket.Chat/pull/12227)) - Fix: Remove semver satisfies from Apps details that is already done my marketplace ([#12268](https://github.com/RocketChat/Rocket.Chat/pull/12268)) @@ -2226,20 +2363,20 @@ ### 👩‍💻👨‍💻 Contributors 😍 +- [@Hudell](https://github.com/Hudell) +- [@cardoso](https://github.com/cardoso) - [@edzluhan](https://github.com/edzluhan) - [@kaiiiiiiiii](https://github.com/kaiiiiiiiii) +- [@timkinnane](https://github.com/timkinnane) ### 👩‍💻👨‍💻 Core Team 🤓 -- [@Hudell](https://github.com/Hudell) -- [@cardoso](https://github.com/cardoso) - [@ggazzo](https://github.com/ggazzo) - [@renatobecker](https://github.com/renatobecker) - [@rodrigok](https://github.com/rodrigok) - [@sampaiodiego](https://github.com/sampaiodiego) - [@tassoevan](https://github.com/tassoevan) - [@theorenck](https://github.com/theorenck) -- [@timkinnane](https://github.com/timkinnane) # 0.70.0 `2018-09-28 · 2 ️️️⚠️ · 18 🎉 · 3 🚀 · 31 🐛 · 21 🔍 · 33 👩‍💻👨‍💻` @@ -2258,17 +2395,17 @@ - Allow multiple subcommands in MIGRATION_VERSION env variable ([#11184](https://github.com/RocketChat/Rocket.Chat/pull/11184) by [@arch119](https://github.com/arch119)) - Support for end to end encryption ([#10094](https://github.com/RocketChat/Rocket.Chat/pull/10094) by [@mrinaldhar](https://github.com/mrinaldhar)) - Livechat Analytics and Reports ([#11238](https://github.com/RocketChat/Rocket.Chat/pull/11238) by [@pkgodara](https://github.com/pkgodara)) -- Apps: Add handlers for message updates ([#11993](https://github.com/RocketChat/Rocket.Chat/pull/11993)) -- Livechat notifications on new incoming inquiries for guest-pool ([#10588](https://github.com/RocketChat/Rocket.Chat/pull/10588)) +- Apps: Add handlers for message updates ([#11993](https://github.com/RocketChat/Rocket.Chat/pull/11993) by [@cardoso](https://github.com/cardoso)) +- Livechat notifications on new incoming inquiries for guest-pool ([#10588](https://github.com/RocketChat/Rocket.Chat/pull/10588) by [@mrsimpson](https://github.com/mrsimpson)) - Customizable default directory view ([#11965](https://github.com/RocketChat/Rocket.Chat/pull/11965) by [@ohmonster](https://github.com/ohmonster)) -- Blockstack as decentralized auth provider ([#12047](https://github.com/RocketChat/Rocket.Chat/pull/12047)) +- Blockstack as decentralized auth provider ([#12047](https://github.com/RocketChat/Rocket.Chat/pull/12047) by [@timkinnane](https://github.com/timkinnane)) - Livechat REST endpoints ([#11900](https://github.com/RocketChat/Rocket.Chat/pull/11900)) - REST endpoints to get moderators from groups and channels ([#11909](https://github.com/RocketChat/Rocket.Chat/pull/11909)) - User preference for 24- or 12-hour clock ([#11169](https://github.com/RocketChat/Rocket.Chat/pull/11169) by [@vynmera](https://github.com/vynmera)) - REST endpoint to set groups' announcement ([#11905](https://github.com/RocketChat/Rocket.Chat/pull/11905)) - Livechat trigger option to run only once ([#12068](https://github.com/RocketChat/Rocket.Chat/pull/12068) by [@edzluhan](https://github.com/edzluhan)) - REST endpoints to create roles and assign roles to users ([#11855](https://github.com/RocketChat/Rocket.Chat/pull/11855) by [@aferreira44](https://github.com/aferreira44)) -- Informal German translations ([#9984](https://github.com/RocketChat/Rocket.Chat/pull/9984)) +- Informal German translations ([#9984](https://github.com/RocketChat/Rocket.Chat/pull/9984) by [@mrsimpson](https://github.com/mrsimpson)) - Apps: API provider ([#11938](https://github.com/RocketChat/Rocket.Chat/pull/11938)) - Apps are enabled by default now ([#12189](https://github.com/RocketChat/Rocket.Chat/pull/12189)) - Add Livechat Analytics permission ([#12184](https://github.com/RocketChat/Rocket.Chat/pull/12184)) @@ -2282,11 +2419,11 @@ ### 🐛 Bug fixes -- Livechat agent joining on pick from guest pool ([#12097](https://github.com/RocketChat/Rocket.Chat/pull/12097)) +- Livechat agent joining on pick from guest pool ([#12097](https://github.com/RocketChat/Rocket.Chat/pull/12097) by [@mrsimpson](https://github.com/mrsimpson)) - Apps: Add missing reactions and actions properties to app message object ([#11780](https://github.com/RocketChat/Rocket.Chat/pull/11780)) - Broken slack compatible webhook ([#11742](https://github.com/RocketChat/Rocket.Chat/pull/11742)) - Changing Mentions.userMentionRegex pattern to include
tag ([#12043](https://github.com/RocketChat/Rocket.Chat/pull/12043) by [@rssilva](https://github.com/rssilva)) -- Double output of message actions ([#11902](https://github.com/RocketChat/Rocket.Chat/pull/11902)) +- Double output of message actions ([#11902](https://github.com/RocketChat/Rocket.Chat/pull/11902) by [@timkinnane](https://github.com/timkinnane)) - Login error message not obvious if user not activated ([#11785](https://github.com/RocketChat/Rocket.Chat/pull/11785) by [@crazy-max](https://github.com/crazy-max)) - Adding scroll bar to read receipts modal ([#11919](https://github.com/RocketChat/Rocket.Chat/pull/11919) by [@rssilva](https://github.com/rssilva)) - Fixing translation on 'yesterday' word when calling timeAgo function ([#11946](https://github.com/RocketChat/Rocket.Chat/pull/11946) by [@rssilva](https://github.com/rssilva)) @@ -2296,9 +2433,9 @@ - Re-add the eye-off icon ([#12079](https://github.com/RocketChat/Rocket.Chat/pull/12079) by [@MIKI785](https://github.com/MIKI785)) - Internal error when cross-origin with CORS is disabled ([#11953](https://github.com/RocketChat/Rocket.Chat/pull/11953)) - Message reaction in GraphQL API ([#11967](https://github.com/RocketChat/Rocket.Chat/pull/11967)) -- Direct messages leaking into logs ([#11863](https://github.com/RocketChat/Rocket.Chat/pull/11863)) +- Direct messages leaking into logs ([#11863](https://github.com/RocketChat/Rocket.Chat/pull/11863) by [@Hudell](https://github.com/Hudell)) - Wrong build path in install.sh ([#11879](https://github.com/RocketChat/Rocket.Chat/pull/11879)) -- Permission check on joinRoom for private room ([#11857](https://github.com/RocketChat/Rocket.Chat/pull/11857)) +- Permission check on joinRoom for private room ([#11857](https://github.com/RocketChat/Rocket.Chat/pull/11857) by [@timkinnane](https://github.com/timkinnane)) - Close popover on shortcuts and writing ([#11562](https://github.com/RocketChat/Rocket.Chat/pull/11562)) - Typo in a configuration key for SlackBridge excluded bot names ([#11872](https://github.com/RocketChat/Rocket.Chat/pull/11872) by [@TobiasKappe](https://github.com/TobiasKappe)) - Real Name on Direct Messages ([#12154](https://github.com/RocketChat/Rocket.Chat/pull/12154)) @@ -2308,8 +2445,8 @@ - Markdown ampersand escape on links ([#12140](https://github.com/RocketChat/Rocket.Chat/pull/12140) by [@rssilva](https://github.com/rssilva)) - Saving user preferences ([#12170](https://github.com/RocketChat/Rocket.Chat/pull/12170)) - Apps being able to see hidden settings ([#12159](https://github.com/RocketChat/Rocket.Chat/pull/12159)) -- Allow user with "bulk-register-user" permission to send invitations ([#12112](https://github.com/RocketChat/Rocket.Chat/pull/12112)) -- IRC Federation no longer working ([#11906](https://github.com/RocketChat/Rocket.Chat/pull/11906)) +- Allow user with "bulk-register-user" permission to send invitations ([#12112](https://github.com/RocketChat/Rocket.Chat/pull/12112) by [@mrsimpson](https://github.com/mrsimpson)) +- IRC Federation no longer working ([#11906](https://github.com/RocketChat/Rocket.Chat/pull/11906) by [@Hudell](https://github.com/Hudell)) - Files list missing from popover menu when owner of room ([#11565](https://github.com/RocketChat/Rocket.Chat/pull/11565)) - Not able to set per-channel retention policies if no global policy is set for this channel type ([#11927](https://github.com/RocketChat/Rocket.Chat/pull/11927) by [@vynmera](https://github.com/vynmera)) - app engine verbose log typo ([#12126](https://github.com/RocketChat/Rocket.Chat/pull/12126) by [@williamriancho](https://github.com/williamriancho)) @@ -2317,68 +2454,68 @@
🔍 Minor changes -- Release 0.69.2 ([#12026](https://github.com/RocketChat/Rocket.Chat/pull/12026) by [@kaiiiiiiiii](https://github.com/kaiiiiiiiii)) +- Release 0.69.2 ([#12026](https://github.com/RocketChat/Rocket.Chat/pull/12026) by [@cardoso](https://github.com/cardoso) & [@kaiiiiiiiii](https://github.com/kaiiiiiiiii) & [@timkinnane](https://github.com/timkinnane)) - LingoHub based on develop ([#11936](https://github.com/RocketChat/Rocket.Chat/pull/11936)) - Better organize package.json ([#12115](https://github.com/RocketChat/Rocket.Chat/pull/12115)) - Fix using wrong variable ([#12114](https://github.com/RocketChat/Rocket.Chat/pull/12114)) - Fix the style lint ([#11991](https://github.com/RocketChat/Rocket.Chat/pull/11991)) -- Merge master into develop & Set version to 0.70.0-develop ([#11921](https://github.com/RocketChat/Rocket.Chat/pull/11921) by [@c0dzilla](https://github.com/c0dzilla) & [@rndmh3ro](https://github.com/rndmh3ro) & [@ubarsaiyan](https://github.com/ubarsaiyan) & [@vynmera](https://github.com/vynmera)) -- Release 0.69.2 ([#12026](https://github.com/RocketChat/Rocket.Chat/pull/12026) by [@kaiiiiiiiii](https://github.com/kaiiiiiiiii)) +- Merge master into develop & Set version to 0.70.0-develop ([#11921](https://github.com/RocketChat/Rocket.Chat/pull/11921) by [@Hudell](https://github.com/Hudell) & [@c0dzilla](https://github.com/c0dzilla) & [@rndmh3ro](https://github.com/rndmh3ro) & [@ubarsaiyan](https://github.com/ubarsaiyan) & [@vynmera](https://github.com/vynmera)) +- Release 0.69.2 ([#12026](https://github.com/RocketChat/Rocket.Chat/pull/12026) by [@cardoso](https://github.com/cardoso) & [@kaiiiiiiiii](https://github.com/kaiiiiiiiii) & [@timkinnane](https://github.com/timkinnane)) - Regression: fix message box autogrow ([#12138](https://github.com/RocketChat/Rocket.Chat/pull/12138)) - Regression: Modal height ([#12122](https://github.com/RocketChat/Rocket.Chat/pull/12122)) - Fix: Change wording on e2e to make a little more clear ([#12124](https://github.com/RocketChat/Rocket.Chat/pull/12124)) -- Improve: Moved the e2e password request to an alert instead of a popup ([#12172](https://github.com/RocketChat/Rocket.Chat/pull/12172)) -- New: Option to change E2E key ([#12169](https://github.com/RocketChat/Rocket.Chat/pull/12169)) +- Improve: Moved the e2e password request to an alert instead of a popup ([#12172](https://github.com/RocketChat/Rocket.Chat/pull/12172) by [@Hudell](https://github.com/Hudell)) +- New: Option to change E2E key ([#12169](https://github.com/RocketChat/Rocket.Chat/pull/12169) by [@Hudell](https://github.com/Hudell)) - Improve: Decrypt last message ([#12173](https://github.com/RocketChat/Rocket.Chat/pull/12173)) -- Fix: e2e password visible on always-on alert message. ([#12139](https://github.com/RocketChat/Rocket.Chat/pull/12139)) +- Fix: e2e password visible on always-on alert message. ([#12139](https://github.com/RocketChat/Rocket.Chat/pull/12139) by [@Hudell](https://github.com/Hudell)) - Improve: Expose apps enable setting at `General > Apps` ([#12196](https://github.com/RocketChat/Rocket.Chat/pull/12196)) - Fix: Message changing order when been edited with apps enabled ([#12188](https://github.com/RocketChat/Rocket.Chat/pull/12188)) - Improve: E2E setting description and alert ([#12191](https://github.com/RocketChat/Rocket.Chat/pull/12191)) - Improve: Do not start E2E Encryption when accessing admin as embedded ([#12192](https://github.com/RocketChat/Rocket.Chat/pull/12192)) - Fix: Add e2e doc to the alert ([#12187](https://github.com/RocketChat/Rocket.Chat/pull/12187)) - Improve: Switch e2e doc to target _blank ([#12195](https://github.com/RocketChat/Rocket.Chat/pull/12195)) -- Improve: Rename E2E methods ([#12175](https://github.com/RocketChat/Rocket.Chat/pull/12175)) +- Improve: Rename E2E methods ([#12175](https://github.com/RocketChat/Rocket.Chat/pull/12175) by [@Hudell](https://github.com/Hudell))
### 👩‍💻👨‍💻 Contributors 😍 +- [@Hudell](https://github.com/Hudell) - [@MIKI785](https://github.com/MIKI785) - [@TobiasKappe](https://github.com/TobiasKappe) - [@aferreira44](https://github.com/aferreira44) - [@arch119](https://github.com/arch119) - [@c0dzilla](https://github.com/c0dzilla) +- [@cardoso](https://github.com/cardoso) - [@crazy-max](https://github.com/crazy-max) - [@edzluhan](https://github.com/edzluhan) - [@flaviogrossi](https://github.com/flaviogrossi) - [@kaiiiiiiiii](https://github.com/kaiiiiiiiii) - [@karakayasemi](https://github.com/karakayasemi) - [@mrinaldhar](https://github.com/mrinaldhar) +- [@mrsimpson](https://github.com/mrsimpson) - [@ohmonster](https://github.com/ohmonster) - [@pkgodara](https://github.com/pkgodara) - [@rndmh3ro](https://github.com/rndmh3ro) - [@rssilva](https://github.com/rssilva) - [@thaiphv](https://github.com/thaiphv) +- [@timkinnane](https://github.com/timkinnane) - [@ubarsaiyan](https://github.com/ubarsaiyan) - [@vynmera](https://github.com/vynmera) - [@williamriancho](https://github.com/williamriancho) ### 👩‍💻👨‍💻 Core Team 🤓 -- [@Hudell](https://github.com/Hudell) - [@MarcosSpessatto](https://github.com/MarcosSpessatto) - [@MartinSchoeler](https://github.com/MartinSchoeler) -- [@cardoso](https://github.com/cardoso) - [@engelgabriel](https://github.com/engelgabriel) - [@geekgonecrazy](https://github.com/geekgonecrazy) - [@ggazzo](https://github.com/ggazzo) - [@graywolf336](https://github.com/graywolf336) -- [@mrsimpson](https://github.com/mrsimpson) - [@renatobecker](https://github.com/renatobecker) - [@rodrigok](https://github.com/rodrigok) - [@sampaiodiego](https://github.com/sampaiodiego) - [@tassoevan](https://github.com/tassoevan) -- [@timkinnane](https://github.com/timkinnane) # 0.69.2 `2018-09-11 · 1 🎉 · 4 🐛 · 6 👩‍💻👨‍💻` @@ -2389,26 +2526,26 @@ ### 🎉 New features -- Include room name in stream for bots ([#11812](https://github.com/RocketChat/Rocket.Chat/pull/11812)) +- Include room name in stream for bots ([#11812](https://github.com/RocketChat/Rocket.Chat/pull/11812) by [@timkinnane](https://github.com/timkinnane)) ### 🐛 Bug fixes - Reset password link error if already logged in ([#12022](https://github.com/RocketChat/Rocket.Chat/pull/12022)) -- Apps: setting with 'code' type only saving last line ([#11992](https://github.com/RocketChat/Rocket.Chat/pull/11992)) +- Apps: setting with 'code' type only saving last line ([#11992](https://github.com/RocketChat/Rocket.Chat/pull/11992) by [@cardoso](https://github.com/cardoso)) - Update user information not possible by admin if disabled to users ([#11955](https://github.com/RocketChat/Rocket.Chat/pull/11955) by [@kaiiiiiiiii](https://github.com/kaiiiiiiiii)) - Hidden admin sidenav on embedded layout ([#12025](https://github.com/RocketChat/Rocket.Chat/pull/12025)) ### 👩‍💻👨‍💻 Contributors 😍 +- [@cardoso](https://github.com/cardoso) - [@kaiiiiiiiii](https://github.com/kaiiiiiiiii) +- [@timkinnane](https://github.com/timkinnane) ### 👩‍💻👨‍💻 Core Team 🤓 -- [@cardoso](https://github.com/cardoso) - [@ggazzo](https://github.com/ggazzo) - [@rodrigok](https://github.com/rodrigok) - [@sampaiodiego](https://github.com/sampaiodiego) -- [@timkinnane](https://github.com/timkinnane) # 0.69.1 `2018-08-31 · 4 🐛 · 2 👩‍💻👨‍💻` @@ -2442,12 +2579,12 @@ ### 🎉 New features - Beta support for Big Blue Button video conferencing system ([#11837](https://github.com/RocketChat/Rocket.Chat/pull/11837)) -- Slackbridge: send attachment notifications ([#10269](https://github.com/RocketChat/Rocket.Chat/pull/10269) by [@kable-wilmoth](https://github.com/kable-wilmoth)) +- Slackbridge: send attachment notifications ([#10269](https://github.com/RocketChat/Rocket.Chat/pull/10269) by [@Hudell](https://github.com/Hudell) & [@kable-wilmoth](https://github.com/kable-wilmoth)) - Personal access tokens for users to create API tokens ([#11638](https://github.com/RocketChat/Rocket.Chat/pull/11638)) - REST endpoint to manage server assets ([#11697](https://github.com/RocketChat/Rocket.Chat/pull/11697)) -- Setting to enable/disable slack bridge reactions ([#10217](https://github.com/RocketChat/Rocket.Chat/pull/10217) by [@kable-wilmoth](https://github.com/kable-wilmoth)) +- Setting to enable/disable slack bridge reactions ([#10217](https://github.com/RocketChat/Rocket.Chat/pull/10217) by [@Hudell](https://github.com/Hudell) & [@kable-wilmoth](https://github.com/kable-wilmoth)) - Rich message text and image buttons ([#11473](https://github.com/RocketChat/Rocket.Chat/pull/11473) by [@ubarsaiyan](https://github.com/ubarsaiyan)) -- Setting to block unauthenticated access to avatars ([#9749](https://github.com/RocketChat/Rocket.Chat/pull/9749)) +- Setting to block unauthenticated access to avatars ([#9749](https://github.com/RocketChat/Rocket.Chat/pull/9749) by [@Hudell](https://github.com/Hudell)) - Setting to set a JS/CSS CDN ([#11779](https://github.com/RocketChat/Rocket.Chat/pull/11779)) - Make font of unread items bolder for better contrast ([#8602](https://github.com/RocketChat/Rocket.Chat/pull/8602) by [@ausminternet](https://github.com/ausminternet)) - Internal marketplace for apps ([#11864](https://github.com/RocketChat/Rocket.Chat/pull/11864) by [@gdelavald](https://github.com/gdelavald) & [@rssilva](https://github.com/rssilva)) @@ -2457,18 +2594,18 @@ - Start storing Livechat department within rooms ([#11733](https://github.com/RocketChat/Rocket.Chat/pull/11733)) - Escape parameters before send them to email template ([#11644](https://github.com/RocketChat/Rocket.Chat/pull/11644)) - Warn about push settings that need server restart ([#11784](https://github.com/RocketChat/Rocket.Chat/pull/11784)) -- Role tag UI ([#11674](https://github.com/RocketChat/Rocket.Chat/pull/11674)) +- Role tag UI ([#11674](https://github.com/RocketChat/Rocket.Chat/pull/11674) by [@timkinnane](https://github.com/timkinnane)) - Messagebox fix performance ([#11686](https://github.com/RocketChat/Rocket.Chat/pull/11686)) - Add template tag #{userdn} to filter LDAP group member format ([#11662](https://github.com/RocketChat/Rocket.Chat/pull/11662) by [@crazy-max](https://github.com/crazy-max)) - Add nyan rocket on Rocket.Chat preview Docker image ([#11684](https://github.com/RocketChat/Rocket.Chat/pull/11684)) -- Reducing `saveUser` code complexity ([#11645](https://github.com/RocketChat/Rocket.Chat/pull/11645)) +- Reducing `saveUser` code complexity ([#11645](https://github.com/RocketChat/Rocket.Chat/pull/11645) by [@Hudell](https://github.com/Hudell)) ### 🐛 Bug fixes -- Delete removed user's subscriptions ([#10700](https://github.com/RocketChat/Rocket.Chat/pull/10700)) +- Delete removed user's subscriptions ([#10700](https://github.com/RocketChat/Rocket.Chat/pull/10700) by [@Hudell](https://github.com/Hudell)) - LiveChat switch department not working ([#11011](https://github.com/RocketChat/Rocket.Chat/pull/11011)) - Some assets were pointing to nonexistent path ([#11796](https://github.com/RocketChat/Rocket.Chat/pull/11796)) -- Revoked `view-d-room` permission logics ([#11522](https://github.com/RocketChat/Rocket.Chat/pull/11522)) +- Revoked `view-d-room` permission logics ([#11522](https://github.com/RocketChat/Rocket.Chat/pull/11522) by [@Hudell](https://github.com/Hudell)) - REST `im.members` endpoint not working without sort parameter ([#11821](https://github.com/RocketChat/Rocket.Chat/pull/11821)) - Livechat rooms starting with two unread message counter ([#11834](https://github.com/RocketChat/Rocket.Chat/pull/11834)) - Results pagination on /directory REST endpoint ([#11551](https://github.com/RocketChat/Rocket.Chat/pull/11551)) @@ -2479,14 +2616,14 @@ - Fix permalink of message when running system with subdir ([#11781](https://github.com/RocketChat/Rocket.Chat/pull/11781) by [@ura14h](https://github.com/ura14h)) - Fix links in `onTableItemClick` of the directroy page ([#11543](https://github.com/RocketChat/Rocket.Chat/pull/11543) by [@ura14h](https://github.com/ura14h)) - App's i18nAlert is only being displayed as "i18nAlert" ([#11802](https://github.com/RocketChat/Rocket.Chat/pull/11802)) -- Removed hardcoded values. ([#11627](https://github.com/RocketChat/Rocket.Chat/pull/11627)) -- SAML is flooding logfile ([#11643](https://github.com/RocketChat/Rocket.Chat/pull/11643)) +- Removed hardcoded values. ([#11627](https://github.com/RocketChat/Rocket.Chat/pull/11627) by [@Hudell](https://github.com/Hudell)) +- SAML is flooding logfile ([#11643](https://github.com/RocketChat/Rocket.Chat/pull/11643) by [@Hudell](https://github.com/Hudell)) - directory search table not clickable lines ([#11809](https://github.com/RocketChat/Rocket.Chat/pull/11809)) - REST endpoints to update user not respecting some settings ([#11474](https://github.com/RocketChat/Rocket.Chat/pull/11474)) - Apply Cordova fix in lazy-loaded images sources ([#11807](https://github.com/RocketChat/Rocket.Chat/pull/11807)) - Cannot set property 'input' of undefined ([#11775](https://github.com/RocketChat/Rocket.Chat/pull/11775)) - Missing twitter:image and og:image tags ([#11687](https://github.com/RocketChat/Rocket.Chat/pull/11687)) -- Return room ID for groups where user joined ([#11703](https://github.com/RocketChat/Rocket.Chat/pull/11703)) +- Return room ID for groups where user joined ([#11703](https://github.com/RocketChat/Rocket.Chat/pull/11703) by [@timkinnane](https://github.com/timkinnane)) - "User is typing" not working in new Livechat session ([#11670](https://github.com/RocketChat/Rocket.Chat/pull/11670)) - wrong create date of channels and users on directory view ([#11682](https://github.com/RocketChat/Rocket.Chat/pull/11682) by [@gsperezb](https://github.com/gsperezb)) - Escape meta data before inject in head tag ([#11730](https://github.com/RocketChat/Rocket.Chat/pull/11730)) @@ -2523,6 +2660,7 @@ ### 👩‍💻👨‍💻 Contributors 😍 - [@Atisom](https://github.com/Atisom) +- [@Hudell](https://github.com/Hudell) - [@TheReal1604](https://github.com/TheReal1604) - [@ausminternet](https://github.com/ausminternet) - [@crazy-max](https://github.com/crazy-max) @@ -2532,6 +2670,7 @@ - [@jukper](https://github.com/jukper) - [@kable-wilmoth](https://github.com/kable-wilmoth) - [@rssilva](https://github.com/rssilva) +- [@timkinnane](https://github.com/timkinnane) - [@ubarsaiyan](https://github.com/ubarsaiyan) - [@ura14h](https://github.com/ura14h) - [@vynmera](https://github.com/vynmera) @@ -2539,7 +2678,6 @@ ### 👩‍💻👨‍💻 Core Team 🤓 -- [@Hudell](https://github.com/Hudell) - [@MarcosSpessatto](https://github.com/MarcosSpessatto) - [@engelgabriel](https://github.com/engelgabriel) - [@geekgonecrazy](https://github.com/geekgonecrazy) @@ -2549,7 +2687,6 @@ - [@rodrigok](https://github.com/rodrigok) - [@sampaiodiego](https://github.com/sampaiodiego) - [@tassoevan](https://github.com/tassoevan) -- [@timkinnane](https://github.com/timkinnane) # 0.68.5 `2018-08-23 · 1 🐛 · 1 👩‍💻👨‍💻` @@ -2597,26 +2734,26 @@ ### 🐛 Bug fixes -- Missing chat history for users without permission `preview-c-room` ([#11639](https://github.com/RocketChat/Rocket.Chat/pull/11639)) +- Missing chat history for users without permission `preview-c-room` ([#11639](https://github.com/RocketChat/Rocket.Chat/pull/11639) by [@Hudell](https://github.com/Hudell)) - User info APIs not returning customFields correctly ([#11625](https://github.com/RocketChat/Rocket.Chat/pull/11625)) - Prune translations in German ([#11631](https://github.com/RocketChat/Rocket.Chat/pull/11631) by [@rndmh3ro](https://github.com/rndmh3ro)) - Prune translation on room info panel ([#11635](https://github.com/RocketChat/Rocket.Chat/pull/11635)) -- SAML login not working when user has multiple emails ([#11642](https://github.com/RocketChat/Rocket.Chat/pull/11642)) +- SAML login not working when user has multiple emails ([#11642](https://github.com/RocketChat/Rocket.Chat/pull/11642) by [@Hudell](https://github.com/Hudell))
🔍 Minor changes -- Release 0.68.3 ([#11650](https://github.com/RocketChat/Rocket.Chat/pull/11650) by [@rndmh3ro](https://github.com/rndmh3ro)) +- Release 0.68.3 ([#11650](https://github.com/RocketChat/Rocket.Chat/pull/11650) by [@Hudell](https://github.com/Hudell) & [@rndmh3ro](https://github.com/rndmh3ro))
### 👩‍💻👨‍💻 Contributors 😍 +- [@Hudell](https://github.com/Hudell) - [@rndmh3ro](https://github.com/rndmh3ro) ### 👩‍💻👨‍💻 Core Team 🤓 -- [@Hudell](https://github.com/Hudell) - [@MarcosSpessatto](https://github.com/MarcosSpessatto) - [@sampaiodiego](https://github.com/sampaiodiego) @@ -2686,7 +2823,7 @@ ### 🎉 New features -- Setting to disable 2FA globally ([#11328](https://github.com/RocketChat/Rocket.Chat/pull/11328)) +- Setting to disable 2FA globally ([#11328](https://github.com/RocketChat/Rocket.Chat/pull/11328) by [@Hudell](https://github.com/Hudell)) - Add /users.deleteOwnAccount REST endpoint to an user delete his own account ([#11488](https://github.com/RocketChat/Rocket.Chat/pull/11488)) - Add /roles.list REST endpoint to retrieve all server roles ([#11500](https://github.com/RocketChat/Rocket.Chat/pull/11500)) - Message retention policy and pruning ([#11236](https://github.com/RocketChat/Rocket.Chat/pull/11236) by [@vynmera](https://github.com/vynmera)) @@ -2702,7 +2839,7 @@ ### 🚀 Improvements -- Set default max upload size to 100mb ([#11327](https://github.com/RocketChat/Rocket.Chat/pull/11327)) +- Set default max upload size to 100mb ([#11327](https://github.com/RocketChat/Rocket.Chat/pull/11327) by [@cardoso](https://github.com/cardoso)) - Typing indicators now use Real Names ([#11164](https://github.com/RocketChat/Rocket.Chat/pull/11164) by [@vynmera](https://github.com/vynmera)) - Allow markdown in room topic, announcement, and description including single quotes ([#11408](https://github.com/RocketChat/Rocket.Chat/pull/11408)) @@ -2714,10 +2851,10 @@ - Marked parser breaking announcements and mentions at the start of messages ([#11357](https://github.com/RocketChat/Rocket.Chat/pull/11357) by [@vynmera](https://github.com/vynmera)) - Send Livechat back to Guest Pool ([#10731](https://github.com/RocketChat/Rocket.Chat/pull/10731)) - Add customFields property to /me REST endpoint response ([#11496](https://github.com/RocketChat/Rocket.Chat/pull/11496)) -- Invalid permalink URLs for Direct Messages ([#11507](https://github.com/RocketChat/Rocket.Chat/pull/11507)) -- Unlimited upload file size not working ([#11471](https://github.com/RocketChat/Rocket.Chat/pull/11471)) +- Invalid permalink URLs for Direct Messages ([#11507](https://github.com/RocketChat/Rocket.Chat/pull/11507) by [@Hudell](https://github.com/Hudell)) +- Unlimited upload file size not working ([#11471](https://github.com/RocketChat/Rocket.Chat/pull/11471) by [@Hudell](https://github.com/Hudell)) - Mixed case channel slugs ([#9449](https://github.com/RocketChat/Rocket.Chat/pull/9449) by [@soundstorm](https://github.com/soundstorm)) -- SAML issues ([#11135](https://github.com/RocketChat/Rocket.Chat/pull/11135) by [@arminfelder](https://github.com/arminfelder)) +- SAML issues ([#11135](https://github.com/RocketChat/Rocket.Chat/pull/11135) by [@Hudell](https://github.com/Hudell) & [@arminfelder](https://github.com/arminfelder)) - Loading and setting fixes for i18n and RTL ([#11363](https://github.com/RocketChat/Rocket.Chat/pull/11363)) - Check for channels property on message object before parsing mentions ([#11527](https://github.com/RocketChat/Rocket.Chat/pull/11527)) - empty blockquote ([#11526](https://github.com/RocketChat/Rocket.Chat/pull/11526)) @@ -2751,10 +2888,12 @@ ### 👩‍💻👨‍💻 Contributors 😍 - [@HappyTobi](https://github.com/HappyTobi) +- [@Hudell](https://github.com/Hudell) - [@Joe-mcgee](https://github.com/Joe-mcgee) - [@PhpXp](https://github.com/PhpXp) - [@arminfelder](https://github.com/arminfelder) - [@arungalva](https://github.com/arungalva) +- [@cardoso](https://github.com/cardoso) - [@karlprieb](https://github.com/karlprieb) - [@soundstorm](https://github.com/soundstorm) - [@tpDBL](https://github.com/tpDBL) @@ -2762,11 +2901,9 @@ ### 👩‍💻👨‍💻 Core Team 🤓 -- [@Hudell](https://github.com/Hudell) - [@MarcosSpessatto](https://github.com/MarcosSpessatto) - [@MartinSchoeler](https://github.com/MartinSchoeler) - [@brunosquadros](https://github.com/brunosquadros) -- [@cardoso](https://github.com/cardoso) - [@engelgabriel](https://github.com/engelgabriel) - [@geekgonecrazy](https://github.com/geekgonecrazy) - [@ggazzo](https://github.com/ggazzo) @@ -2809,20 +2946,20 @@ - Fix dependency issue in redhat image ([#11497](https://github.com/RocketChat/Rocket.Chat/pull/11497)) - Merge master into develop & Set version to 0.67.0-develop ([#11417](https://github.com/RocketChat/Rocket.Chat/pull/11417)) - Merge master into develop & Set version to 0.67.0-develop ([#11399](https://github.com/RocketChat/Rocket.Chat/pull/11399)) -- Merge master into develop & Set version to 0.67.0-develop ([#11348](https://github.com/RocketChat/Rocket.Chat/pull/11348) by [@gdelavald](https://github.com/gdelavald)) +- Merge master into develop & Set version to 0.67.0-develop ([#11348](https://github.com/RocketChat/Rocket.Chat/pull/11348) by [@Hudell](https://github.com/Hudell) & [@gdelavald](https://github.com/gdelavald)) - Merge master into develop & Set version to 0.67.0-develop ([#11290](https://github.com/RocketChat/Rocket.Chat/pull/11290))
### 👩‍💻👨‍💻 Contributors 😍 +- [@Hudell](https://github.com/Hudell) - [@c0dzilla](https://github.com/c0dzilla) - [@gdelavald](https://github.com/gdelavald) - [@justinribeiro](https://github.com/justinribeiro) ### 👩‍💻👨‍💻 Core Team 🤓 -- [@Hudell](https://github.com/Hudell) - [@engelgabriel](https://github.com/engelgabriel) - [@geekgonecrazy](https://github.com/geekgonecrazy) - [@ggazzo](https://github.com/ggazzo) @@ -2889,18 +3026,18 @@ ### 🐛 Bug fixes - Some updates were returning errors when based on queries with position operators ([#11335](https://github.com/RocketChat/Rocket.Chat/pull/11335)) -- SAML attributes with periods are not properly read. ([#11315](https://github.com/RocketChat/Rocket.Chat/pull/11315)) +- SAML attributes with periods are not properly read. ([#11315](https://github.com/RocketChat/Rocket.Chat/pull/11315) by [@Hudell](https://github.com/Hudell)) - Outgoing integrations were stopping the oplog tailing sometimes ([#11333](https://github.com/RocketChat/Rocket.Chat/pull/11333)) - Livestream muted when audio only option was enabled ([#11267](https://github.com/RocketChat/Rocket.Chat/pull/11267) by [@gdelavald](https://github.com/gdelavald)) - Notification preferences being lost when switching view mode ([#11295](https://github.com/RocketChat/Rocket.Chat/pull/11295)) ### 👩‍💻👨‍💻 Contributors 😍 +- [@Hudell](https://github.com/Hudell) - [@gdelavald](https://github.com/gdelavald) ### 👩‍💻👨‍💻 Core Team 🤓 -- [@Hudell](https://github.com/Hudell) - [@ggazzo](https://github.com/ggazzo) - [@rodrigok](https://github.com/rodrigok) - [@sampaiodiego](https://github.com/sampaiodiego) @@ -2924,7 +3061,7 @@ - REST API endpoint `channels.setDefault` ([#10941](https://github.com/RocketChat/Rocket.Chat/pull/10941) by [@vynmera](https://github.com/vynmera)) - Set Document Domain property in IFrame ([#9751](https://github.com/RocketChat/Rocket.Chat/pull/9751) by [@kb0304](https://github.com/kb0304)) - Custom login wallpapers ([#11025](https://github.com/RocketChat/Rocket.Chat/pull/11025) by [@vynmera](https://github.com/vynmera)) -- Support for dynamic slack and rocket.chat channels ([#10205](https://github.com/RocketChat/Rocket.Chat/pull/10205) by [@kable-wilmoth](https://github.com/kable-wilmoth)) +- Support for dynamic slack and rocket.chat channels ([#10205](https://github.com/RocketChat/Rocket.Chat/pull/10205) by [@Hudell](https://github.com/Hudell) & [@kable-wilmoth](https://github.com/kable-wilmoth)) - Add prometheus port config ([#11115](https://github.com/RocketChat/Rocket.Chat/pull/11115) by [@brylie](https://github.com/brylie) & [@stuartpb](https://github.com/stuartpb) & [@thaiphv](https://github.com/thaiphv)) - Button to remove closed LiveChat rooms ([#10301](https://github.com/RocketChat/Rocket.Chat/pull/10301)) - Update katex to v0.9.0 ([#8402](https://github.com/RocketChat/Rocket.Chat/pull/8402) by [@pitamar](https://github.com/pitamar)) @@ -2951,13 +3088,13 @@ ### 🐛 Bug fixes -- Wordpress oauth configuration not loading properly ([#11187](https://github.com/RocketChat/Rocket.Chat/pull/11187)) +- Wordpress oauth configuration not loading properly ([#11187](https://github.com/RocketChat/Rocket.Chat/pull/11187) by [@Hudell](https://github.com/Hudell)) - REST API: Add more test cases for `/login` ([#10999](https://github.com/RocketChat/Rocket.Chat/pull/10999)) -- Wrong font-family order ([#11191](https://github.com/RocketChat/Rocket.Chat/pull/11191) by [@myfonj](https://github.com/myfonj)) +- Wrong font-family order ([#11191](https://github.com/RocketChat/Rocket.Chat/pull/11191) by [@Hudell](https://github.com/Hudell) & [@myfonj](https://github.com/myfonj)) - REST endpoint `users.updateOwnBasicInfo` was not returning errors for invalid names and trying to save custom fields when empty ([#11204](https://github.com/RocketChat/Rocket.Chat/pull/11204)) - Livechat visitor not being prompted for transcript when himself is closing the chat ([#10767](https://github.com/RocketChat/Rocket.Chat/pull/10767)) -- HipChat Cloud import fails to import rooms ([#11188](https://github.com/RocketChat/Rocket.Chat/pull/11188)) -- Failure to download user data ([#11190](https://github.com/RocketChat/Rocket.Chat/pull/11190)) +- HipChat Cloud import fails to import rooms ([#11188](https://github.com/RocketChat/Rocket.Chat/pull/11188) by [@Hudell](https://github.com/Hudell)) +- Failure to download user data ([#11190](https://github.com/RocketChat/Rocket.Chat/pull/11190) by [@Hudell](https://github.com/Hudell)) - Add parameter to REST chat.react endpoint, to make it work like a setter ([#10447](https://github.com/RocketChat/Rocket.Chat/pull/10447)) - Default selected language ([#11150](https://github.com/RocketChat/Rocket.Chat/pull/11150)) - Rendering of emails and mentions in messages ([#11165](https://github.com/RocketChat/Rocket.Chat/pull/11165)) @@ -2966,8 +3103,8 @@ - Missing language constants ([#11173](https://github.com/RocketChat/Rocket.Chat/pull/11173) by [@rw4lll](https://github.com/rw4lll)) - Room creation error due absence of subscriptions ([#11178](https://github.com/RocketChat/Rocket.Chat/pull/11178)) - Remove failed upload messages when switching rooms ([#11132](https://github.com/RocketChat/Rocket.Chat/pull/11132)) -- Wordpress OAuth not providing enough info to log in ([#11152](https://github.com/RocketChat/Rocket.Chat/pull/11152)) -- /groups.invite not allow a user to invite even with permission ([#11010](https://github.com/RocketChat/Rocket.Chat/pull/11010)) +- Wordpress OAuth not providing enough info to log in ([#11152](https://github.com/RocketChat/Rocket.Chat/pull/11152) by [@Hudell](https://github.com/Hudell)) +- /groups.invite not allow a user to invite even with permission ([#11010](https://github.com/RocketChat/Rocket.Chat/pull/11010) by [@Hudell](https://github.com/Hudell)) - Various lang fixes [RU] ([#10095](https://github.com/RocketChat/Rocket.Chat/pull/10095) by [@rw4lll](https://github.com/rw4lll)) - set-toolbar-items postMessage ([#11109](https://github.com/RocketChat/Rocket.Chat/pull/11109)) - title and value attachments are optionals on sendMessage method ([#11021](https://github.com/RocketChat/Rocket.Chat/pull/11021)) @@ -2989,31 +3126,31 @@ - Exception in metrics generation ([#11072](https://github.com/RocketChat/Rocket.Chat/pull/11072)) - Build for Sandstorm missing dependence for capnp ([#11056](https://github.com/RocketChat/Rocket.Chat/pull/11056) by [@peterlee0127](https://github.com/peterlee0127)) - flex-tab icons missing ([#11049](https://github.com/RocketChat/Rocket.Chat/pull/11049)) -- Update ja.i18n.json ([#11020](https://github.com/RocketChat/Rocket.Chat/pull/11020) by [@noobbbbb](https://github.com/noobbbbb)) +- Update ja.i18n.json ([#11020](https://github.com/RocketChat/Rocket.Chat/pull/11020) by [@Hudell](https://github.com/Hudell) & [@noobbbbb](https://github.com/noobbbbb)) - Strange msg when setting room announcement, topic or description to be empty ([#11012](https://github.com/RocketChat/Rocket.Chat/pull/11012) by [@vynmera](https://github.com/vynmera)) -- Exception thrown on avatar validation ([#11009](https://github.com/RocketChat/Rocket.Chat/pull/11009)) +- Exception thrown on avatar validation ([#11009](https://github.com/RocketChat/Rocket.Chat/pull/11009) by [@Hudell](https://github.com/Hudell)) - Preview of large images not resizing to fit the area and having scrollbars ([#10998](https://github.com/RocketChat/Rocket.Chat/pull/10998) by [@vynmera](https://github.com/vynmera)) - Allow inviting livechat managers to the same LiveChat room ([#10956](https://github.com/RocketChat/Rocket.Chat/pull/10956)) - Cannot read property 'debug' of undefined when trying to use REST API ([#10805](https://github.com/RocketChat/Rocket.Chat/pull/10805) by [@haffla](https://github.com/haffla)) -- Icons svg xml structure ([#10771](https://github.com/RocketChat/Rocket.Chat/pull/10771)) -- Remove outdated 2FA warning for mobile clients ([#10916](https://github.com/RocketChat/Rocket.Chat/pull/10916)) +- Icons svg xml structure ([#10771](https://github.com/RocketChat/Rocket.Chat/pull/10771) by [@timkinnane](https://github.com/timkinnane)) +- Remove outdated 2FA warning for mobile clients ([#10916](https://github.com/RocketChat/Rocket.Chat/pull/10916) by [@cardoso](https://github.com/cardoso)) - Update Sandstorm build config ([#10867](https://github.com/RocketChat/Rocket.Chat/pull/10867) by [@ocdtrekkie](https://github.com/ocdtrekkie)) - "blank messages" on iOS < 11 ([#11221](https://github.com/RocketChat/Rocket.Chat/pull/11221)) - "blank" screen on iOS < 11 ([#11199](https://github.com/RocketChat/Rocket.Chat/pull/11199)) - The process was freezing in some cases when HTTP calls exceeds timeout on integrations ([#11253](https://github.com/RocketChat/Rocket.Chat/pull/11253)) - LDAP was accepting login with empty passwords for certain AD configurations ([#11264](https://github.com/RocketChat/Rocket.Chat/pull/11264)) - Update capnproto dependence for Sandstorm Build ([#11263](https://github.com/RocketChat/Rocket.Chat/pull/11263) by [@peterlee0127](https://github.com/peterlee0127)) -- Internal Server Error on first login with CAS integration ([#11257](https://github.com/RocketChat/Rocket.Chat/pull/11257)) +- Internal Server Error on first login with CAS integration ([#11257](https://github.com/RocketChat/Rocket.Chat/pull/11257) by [@Hudell](https://github.com/Hudell)) - Armhf snap build ([#11268](https://github.com/RocketChat/Rocket.Chat/pull/11268)) -- Reaction Toggle was not working when omitting the last parameter from the API (DDP and REST) ([#11276](https://github.com/RocketChat/Rocket.Chat/pull/11276)) +- Reaction Toggle was not working when omitting the last parameter from the API (DDP and REST) ([#11276](https://github.com/RocketChat/Rocket.Chat/pull/11276) by [@Hudell](https://github.com/Hudell))
🔍 Minor changes -- Merge master into develop & Set version to 0.66.0-develop ([#11277](https://github.com/RocketChat/Rocket.Chat/pull/11277) by [@brylie](https://github.com/brylie) & [@stuartpb](https://github.com/stuartpb)) +- Merge master into develop & Set version to 0.66.0-develop ([#11277](https://github.com/RocketChat/Rocket.Chat/pull/11277) by [@Hudell](https://github.com/Hudell) & [@brylie](https://github.com/brylie) & [@stuartpb](https://github.com/stuartpb)) - Regression: Directory css ([#11206](https://github.com/RocketChat/Rocket.Chat/pull/11206) by [@karlprieb](https://github.com/karlprieb)) - LingoHub based on develop ([#11208](https://github.com/RocketChat/Rocket.Chat/pull/11208)) -- IRC Federation: RFC2813 implementation (ngIRCd) ([#10113](https://github.com/RocketChat/Rocket.Chat/pull/10113) by [@cpitman](https://github.com/cpitman) & [@lindoelio](https://github.com/lindoelio)) +- IRC Federation: RFC2813 implementation (ngIRCd) ([#10113](https://github.com/RocketChat/Rocket.Chat/pull/10113) by [@Hudell](https://github.com/Hudell) & [@cpitman](https://github.com/cpitman) & [@lindoelio](https://github.com/lindoelio)) - Add verification to make sure the user exists in REST insert object helper ([#11008](https://github.com/RocketChat/Rocket.Chat/pull/11008)) - Regression: Directory user table infinite scroll doesn't working ([#11200](https://github.com/RocketChat/Rocket.Chat/pull/11200) by [@karlprieb](https://github.com/karlprieb)) - [FIX Readme] Nodejs + Python version spicifications ([#11181](https://github.com/RocketChat/Rocket.Chat/pull/11181) by [@mahdiyari](https://github.com/mahdiyari)) @@ -3062,9 +3199,11 @@ ### 👩‍💻👨‍💻 Contributors 😍 +- [@Hudell](https://github.com/Hudell) - [@JoseRenan](https://github.com/JoseRenan) - [@brylie](https://github.com/brylie) - [@c0dzilla](https://github.com/c0dzilla) +- [@cardoso](https://github.com/cardoso) - [@cliffparnitzky](https://github.com/cliffparnitzky) - [@cpitman](https://github.com/cpitman) - [@filipealva](https://github.com/filipealva) @@ -3093,14 +3232,13 @@ - [@stuartpb](https://github.com/stuartpb) - [@taeven](https://github.com/taeven) - [@thaiphv](https://github.com/thaiphv) +- [@timkinnane](https://github.com/timkinnane) - [@vynmera](https://github.com/vynmera) ### 👩‍💻👨‍💻 Core Team 🤓 -- [@Hudell](https://github.com/Hudell) - [@MarcosSpessatto](https://github.com/MarcosSpessatto) - [@alansikora](https://github.com/alansikora) -- [@cardoso](https://github.com/cardoso) - [@engelgabriel](https://github.com/engelgabriel) - [@geekgonecrazy](https://github.com/geekgonecrazy) - [@ggazzo](https://github.com/ggazzo) @@ -3109,7 +3247,6 @@ - [@rodrigok](https://github.com/rodrigok) - [@sampaiodiego](https://github.com/sampaiodiego) - [@tassoevan](https://github.com/tassoevan) -- [@timkinnane](https://github.com/timkinnane) # 0.65.2 `2018-06-16 · 1 🐛 · 1 🔍 · 4 👩‍💻👨‍💻` @@ -3181,7 +3318,7 @@ - Now is possible to access files using header authorization (`x-user-id` and `x-auth-token`) ([#10741](https://github.com/RocketChat/Rocket.Chat/pull/10741)) - Add REST API endpoints `channels.counters`, `groups.counters and `im.counters` ([#9679](https://github.com/RocketChat/Rocket.Chat/pull/9679) by [@xbolshe](https://github.com/xbolshe)) - Add REST API endpoints `channels.setCustomFields` and `groups.setCustomFields` ([#9733](https://github.com/RocketChat/Rocket.Chat/pull/9733) by [@xbolshe](https://github.com/xbolshe)) -- Add permission `view-broadcast-member-list` ([#10753](https://github.com/RocketChat/Rocket.Chat/pull/10753)) +- Add permission `view-broadcast-member-list` ([#10753](https://github.com/RocketChat/Rocket.Chat/pull/10753) by [@cardoso](https://github.com/cardoso)) ### 🐛 Bug fixes @@ -3189,10 +3326,10 @@ - Livechat settings not appearing correctly ([#10612](https://github.com/RocketChat/Rocket.Chat/pull/10612)) - Enabling `Collapse Embedded Media by Default` was hiding replies and quotes ([#10427](https://github.com/RocketChat/Rocket.Chat/pull/10427) by [@c0dzilla](https://github.com/c0dzilla)) - Missing option to disable/enable System Messages ([#10704](https://github.com/RocketChat/Rocket.Chat/pull/10704)) -- Remove outdated translations of Internal Hubot's description of Scripts to Load that were pointing to a non existent address ([#10448](https://github.com/RocketChat/Rocket.Chat/pull/10448)) +- Remove outdated translations of Internal Hubot's description of Scripts to Load that were pointing to a non existent address ([#10448](https://github.com/RocketChat/Rocket.Chat/pull/10448) by [@Hudell](https://github.com/Hudell)) - UI was not disabling the actions when users has had no permissions to create channels or add users to rooms ([#10564](https://github.com/RocketChat/Rocket.Chat/pull/10564) by [@cfunkles](https://github.com/cfunkles) & [@chuckAtCataworx](https://github.com/chuckAtCataworx)) -- Private settings were not being cleared from client cache in some cases ([#10625](https://github.com/RocketChat/Rocket.Chat/pull/10625)) -- Internal Error when requesting user data download ([#10837](https://github.com/RocketChat/Rocket.Chat/pull/10837)) +- Private settings were not being cleared from client cache in some cases ([#10625](https://github.com/RocketChat/Rocket.Chat/pull/10625) by [@Hudell](https://github.com/Hudell)) +- Internal Error when requesting user data download ([#10837](https://github.com/RocketChat/Rocket.Chat/pull/10837) by [@Hudell](https://github.com/Hudell)) - Broadcast channels were showing reply button for deleted messages and generating wrong reply links some times ([#10835](https://github.com/RocketChat/Rocket.Chat/pull/10835)) - User's preference `Unread on Top` wasn't working for LiveChat rooms ([#10734](https://github.com/RocketChat/Rocket.Chat/pull/10734)) - Cancel button wasn't working while uploading file ([#10715](https://github.com/RocketChat/Rocket.Chat/pull/10715) by [@Mr-Gryphon](https://github.com/Mr-Gryphon) & [@karlprieb](https://github.com/karlprieb)) @@ -3205,7 +3342,7 @@
🔍 Minor changes -- Release 0.65.0 ([#10893](https://github.com/RocketChat/Rocket.Chat/pull/10893) by [@Sameesunkaria](https://github.com/Sameesunkaria) & [@erhan-](https://github.com/erhan-) & [@gdelavald](https://github.com/gdelavald) & [@karlprieb](https://github.com/karlprieb) & [@peccu](https://github.com/peccu) & [@winterstefan](https://github.com/winterstefan)) +- Release 0.65.0 ([#10893](https://github.com/RocketChat/Rocket.Chat/pull/10893) by [@Hudell](https://github.com/Hudell) & [@Sameesunkaria](https://github.com/Sameesunkaria) & [@cardoso](https://github.com/cardoso) & [@erhan-](https://github.com/erhan-) & [@gdelavald](https://github.com/gdelavald) & [@karlprieb](https://github.com/karlprieb) & [@peccu](https://github.com/peccu) & [@winterstefan](https://github.com/winterstefan)) - Apps: Command Previews, Message and Room Removal Events ([#10822](https://github.com/RocketChat/Rocket.Chat/pull/10822)) - Develop sync ([#10815](https://github.com/RocketChat/Rocket.Chat/pull/10815) by [@nsuchy](https://github.com/nsuchy) & [@rafaelks](https://github.com/rafaelks)) - Major dependencies update ([#10661](https://github.com/RocketChat/Rocket.Chat/pull/10661)) @@ -3225,10 +3362,12 @@ ### 👩‍💻👨‍💻 Contributors 😍 +- [@Hudell](https://github.com/Hudell) - [@Mr-Gryphon](https://github.com/Mr-Gryphon) - [@Sameesunkaria](https://github.com/Sameesunkaria) - [@ThomasRoehl](https://github.com/ThomasRoehl) - [@c0dzilla](https://github.com/c0dzilla) +- [@cardoso](https://github.com/cardoso) - [@cfunkles](https://github.com/cfunkles) - [@chuckAtCataworx](https://github.com/chuckAtCataworx) - [@erhan-](https://github.com/erhan-) @@ -3243,9 +3382,7 @@ ### 👩‍💻👨‍💻 Core Team 🤓 -- [@Hudell](https://github.com/Hudell) - [@MarcosSpessatto](https://github.com/MarcosSpessatto) -- [@cardoso](https://github.com/cardoso) - [@engelgabriel](https://github.com/engelgabriel) - [@geekgonecrazy](https://github.com/geekgonecrazy) - [@ggazzo](https://github.com/ggazzo) @@ -3263,12 +3400,12 @@ ### 🎉 New features -- Add REST endpoints `channels.roles` & `groups.roles` ([#10607](https://github.com/RocketChat/Rocket.Chat/pull/10607) by [@rafaelks](https://github.com/rafaelks)) -- Add more options for Wordpress OAuth configuration ([#10724](https://github.com/RocketChat/Rocket.Chat/pull/10724)) +- Add REST endpoints `channels.roles` & `groups.roles` ([#10607](https://github.com/RocketChat/Rocket.Chat/pull/10607) by [@cardoso](https://github.com/cardoso) & [@rafaelks](https://github.com/rafaelks)) +- Add more options for Wordpress OAuth configuration ([#10724](https://github.com/RocketChat/Rocket.Chat/pull/10724) by [@Hudell](https://github.com/Hudell)) - Setup Wizard ([#10523](https://github.com/RocketChat/Rocket.Chat/pull/10523) by [@karlprieb](https://github.com/karlprieb)) - Improvements to notifications logic ([#10686](https://github.com/RocketChat/Rocket.Chat/pull/10686)) -- Add REST endpoints `channels.roles` & `groups.roles` ([#10607](https://github.com/RocketChat/Rocket.Chat/pull/10607) by [@rafaelks](https://github.com/rafaelks)) -- Add more options for Wordpress OAuth configuration ([#10724](https://github.com/RocketChat/Rocket.Chat/pull/10724)) +- Add REST endpoints `channels.roles` & `groups.roles` ([#10607](https://github.com/RocketChat/Rocket.Chat/pull/10607) by [@cardoso](https://github.com/cardoso) & [@rafaelks](https://github.com/rafaelks)) +- Add more options for Wordpress OAuth configuration ([#10724](https://github.com/RocketChat/Rocket.Chat/pull/10724) by [@Hudell](https://github.com/Hudell)) - Setup Wizard ([#10523](https://github.com/RocketChat/Rocket.Chat/pull/10523) by [@karlprieb](https://github.com/karlprieb)) - Improvements to notifications logic ([#10686](https://github.com/RocketChat/Rocket.Chat/pull/10686)) @@ -3277,24 +3414,24 @@ - Not escaping special chars on mentions ([#10793](https://github.com/RocketChat/Rocket.Chat/pull/10793) by [@erhan-](https://github.com/erhan-)) - Send a message when muted returns inconsistent result in chat.sendMessage ([#10720](https://github.com/RocketChat/Rocket.Chat/pull/10720)) - Regression: Empty content on announcement modal ([#10733](https://github.com/RocketChat/Rocket.Chat/pull/10733) by [@gdelavald](https://github.com/gdelavald)) -- Missing attachment description when Rocket.Chat Apps were enabled ([#10705](https://github.com/RocketChat/Rocket.Chat/pull/10705)) +- Missing attachment description when Rocket.Chat Apps were enabled ([#10705](https://github.com/RocketChat/Rocket.Chat/pull/10705) by [@Hudell](https://github.com/Hudell)) - Improve desktop notification formatting ([#10445](https://github.com/RocketChat/Rocket.Chat/pull/10445) by [@Sameesunkaria](https://github.com/Sameesunkaria)) - Message box emoji icon was flickering when typing a text ([#10678](https://github.com/RocketChat/Rocket.Chat/pull/10678) by [@gdelavald](https://github.com/gdelavald)) - Channel owner was being set as muted when creating a read-only channel ([#10665](https://github.com/RocketChat/Rocket.Chat/pull/10665)) -- SAML wasn't working correctly when running multiple instances ([#10681](https://github.com/RocketChat/Rocket.Chat/pull/10681)) +- SAML wasn't working correctly when running multiple instances ([#10681](https://github.com/RocketChat/Rocket.Chat/pull/10681) by [@Hudell](https://github.com/Hudell)) - Send a message when muted returns inconsistent result in chat.sendMessage ([#10720](https://github.com/RocketChat/Rocket.Chat/pull/10720)) - Regression: Empty content on announcement modal ([#10733](https://github.com/RocketChat/Rocket.Chat/pull/10733) by [@gdelavald](https://github.com/gdelavald)) -- Missing attachment description when Rocket.Chat Apps were enabled ([#10705](https://github.com/RocketChat/Rocket.Chat/pull/10705)) +- Missing attachment description when Rocket.Chat Apps were enabled ([#10705](https://github.com/RocketChat/Rocket.Chat/pull/10705) by [@Hudell](https://github.com/Hudell)) - Improve desktop notification formatting ([#10445](https://github.com/RocketChat/Rocket.Chat/pull/10445) by [@Sameesunkaria](https://github.com/Sameesunkaria)) - Message box emoji icon was flickering when typing a text ([#10678](https://github.com/RocketChat/Rocket.Chat/pull/10678) by [@gdelavald](https://github.com/gdelavald)) - Channel owner was being set as muted when creating a read-only channel ([#10665](https://github.com/RocketChat/Rocket.Chat/pull/10665)) -- SAML wasn't working correctly when running multiple instances ([#10681](https://github.com/RocketChat/Rocket.Chat/pull/10681)) +- SAML wasn't working correctly when running multiple instances ([#10681](https://github.com/RocketChat/Rocket.Chat/pull/10681) by [@Hudell](https://github.com/Hudell)) - Not escaping special chars on mentions ([#10793](https://github.com/RocketChat/Rocket.Chat/pull/10793) by [@erhan-](https://github.com/erhan-))
🔍 Minor changes -- Release 0.64.2 ([#10812](https://github.com/RocketChat/Rocket.Chat/pull/10812) by [@Sameesunkaria](https://github.com/Sameesunkaria) & [@erhan-](https://github.com/erhan-) & [@gdelavald](https://github.com/gdelavald) & [@karlprieb](https://github.com/karlprieb) & [@peccu](https://github.com/peccu) & [@winterstefan](https://github.com/winterstefan)) +- Release 0.64.2 ([#10812](https://github.com/RocketChat/Rocket.Chat/pull/10812) by [@Hudell](https://github.com/Hudell) & [@Sameesunkaria](https://github.com/Sameesunkaria) & [@cardoso](https://github.com/cardoso) & [@erhan-](https://github.com/erhan-) & [@gdelavald](https://github.com/gdelavald) & [@karlprieb](https://github.com/karlprieb) & [@peccu](https://github.com/peccu) & [@winterstefan](https://github.com/winterstefan)) - Prometheus: Add metric to track hooks time ([#10798](https://github.com/RocketChat/Rocket.Chat/pull/10798)) - Regression: Autorun of wizard was not destroyed after completion ([#10802](https://github.com/RocketChat/Rocket.Chat/pull/10802)) - Prometheus: Fix notification metric ([#10803](https://github.com/RocketChat/Rocket.Chat/pull/10803)) @@ -3330,7 +3467,9 @@ ### 👩‍💻👨‍💻 Contributors 😍 +- [@Hudell](https://github.com/Hudell) - [@Sameesunkaria](https://github.com/Sameesunkaria) +- [@cardoso](https://github.com/cardoso) - [@erhan-](https://github.com/erhan-) - [@gdelavald](https://github.com/gdelavald) - [@karlprieb](https://github.com/karlprieb) @@ -3340,9 +3479,7 @@ ### 👩‍💻👨‍💻 Core Team 🤓 -- [@Hudell](https://github.com/Hudell) - [@MarcosSpessatto](https://github.com/MarcosSpessatto) -- [@cardoso](https://github.com/cardoso) - [@engelgabriel](https://github.com/engelgabriel) - [@rodrigok](https://github.com/rodrigok) - [@sampaiodiego](https://github.com/sampaiodiego) @@ -3398,13 +3535,13 @@ ### 🎉 New features -- Option to mute group mentions (@all and @here) ([#10502](https://github.com/RocketChat/Rocket.Chat/pull/10502)) -- GDPR - Right to access and Data Portability ([#9906](https://github.com/RocketChat/Rocket.Chat/pull/9906)) +- Option to mute group mentions (@all and @here) ([#10502](https://github.com/RocketChat/Rocket.Chat/pull/10502) by [@Hudell](https://github.com/Hudell)) +- GDPR - Right to access and Data Portability ([#9906](https://github.com/RocketChat/Rocket.Chat/pull/9906) by [@Hudell](https://github.com/Hudell)) - Broadcast Channels ([#9950](https://github.com/RocketChat/Rocket.Chat/pull/9950)) - Option to ignore users on channels ([#10517](https://github.com/RocketChat/Rocket.Chat/pull/10517) by [@gdelavald](https://github.com/gdelavald) & [@karlprieb](https://github.com/karlprieb)) - Search Provider Framework ([#10110](https://github.com/RocketChat/Rocket.Chat/pull/10110) by [@tkurz](https://github.com/tkurz)) - REST API endpoint `/directory` ([#10442](https://github.com/RocketChat/Rocket.Chat/pull/10442)) -- Body of the payload on an incoming webhook is included on the request object ([#10259](https://github.com/RocketChat/Rocket.Chat/pull/10259)) +- Body of the payload on an incoming webhook is included on the request object ([#10259](https://github.com/RocketChat/Rocket.Chat/pull/10259) by [@Hudell](https://github.com/Hudell)) - REST endpoint to recover forgotten password ([#10371](https://github.com/RocketChat/Rocket.Chat/pull/10371)) - REST endpoint to report messages ([#10354](https://github.com/RocketChat/Rocket.Chat/pull/10354)) - Livechat setting to customize ended conversation message ([#10108](https://github.com/RocketChat/Rocket.Chat/pull/10108)) @@ -3423,23 +3560,23 @@ - Member list search with no results ([#10599](https://github.com/RocketChat/Rocket.Chat/pull/10599)) - Integrations with room data not having the usernames filled in ([#10576](https://github.com/RocketChat/Rocket.Chat/pull/10576)) - Add user object to responses in /*.files Rest endpoints ([#10480](https://github.com/RocketChat/Rocket.Chat/pull/10480)) -- Missing user data on files uploaded through the API ([#10473](https://github.com/RocketChat/Rocket.Chat/pull/10473)) +- Missing user data on files uploaded through the API ([#10473](https://github.com/RocketChat/Rocket.Chat/pull/10473) by [@Hudell](https://github.com/Hudell)) - Rename method to clean history of messages ([#10498](https://github.com/RocketChat/Rocket.Chat/pull/10498)) - REST spotlight API wasn't allowing searches with # and @ ([#10410](https://github.com/RocketChat/Rocket.Chat/pull/10410)) - Dropdown elements were using old styles ([#10482](https://github.com/RocketChat/Rocket.Chat/pull/10482) by [@kaiiiiiiiii](https://github.com/kaiiiiiiiii)) - Directory sort and column sizes were wrong ([#10403](https://github.com/RocketChat/Rocket.Chat/pull/10403) by [@karlprieb](https://github.com/karlprieb)) - REST API OAuth services endpoint were missing fields and flag to indicate custom services ([#10299](https://github.com/RocketChat/Rocket.Chat/pull/10299)) -- Error messages weren't been displayed when email verification fails ([#10446](https://github.com/RocketChat/Rocket.Chat/pull/10446) by [@karlprieb](https://github.com/karlprieb)) +- Error messages weren't been displayed when email verification fails ([#10446](https://github.com/RocketChat/Rocket.Chat/pull/10446) by [@Hudell](https://github.com/Hudell) & [@karlprieb](https://github.com/karlprieb)) - Wrong column positions in the directory search for users ([#10454](https://github.com/RocketChat/Rocket.Chat/pull/10454) by [@karlprieb](https://github.com/karlprieb) & [@lunaticmonk](https://github.com/lunaticmonk)) - Custom fields was misaligned in registration form ([#10463](https://github.com/RocketChat/Rocket.Chat/pull/10463) by [@dschuan](https://github.com/dschuan)) - Unique identifier file not really being unique ([#10341](https://github.com/RocketChat/Rocket.Chat/pull/10341) by [@abernix](https://github.com/abernix)) -- Empty panel after changing a user's username ([#10404](https://github.com/RocketChat/Rocket.Chat/pull/10404)) +- Empty panel after changing a user's username ([#10404](https://github.com/RocketChat/Rocket.Chat/pull/10404) by [@Hudell](https://github.com/Hudell)) - Russian translation of "False" ([#10418](https://github.com/RocketChat/Rocket.Chat/pull/10418) by [@strangerintheq](https://github.com/strangerintheq)) - Links being embedded inside of blockquotes ([#10496](https://github.com/RocketChat/Rocket.Chat/pull/10496) by [@gdelavald](https://github.com/gdelavald)) - The 'channel.messages' REST API Endpoint error ([#10485](https://github.com/RocketChat/Rocket.Chat/pull/10485) by [@rafaelks](https://github.com/rafaelks)) - Button on user info contextual bar scrolling with the content ([#10358](https://github.com/RocketChat/Rocket.Chat/pull/10358) by [@karlprieb](https://github.com/karlprieb) & [@okaybroda](https://github.com/okaybroda)) - "Idle Time Limit" using milliseconds instead of seconds ([#9824](https://github.com/RocketChat/Rocket.Chat/pull/9824) by [@kaiiiiiiiii](https://github.com/kaiiiiiiiii)) -- Missing i18n translation key for "Unread" ([#10387](https://github.com/RocketChat/Rocket.Chat/pull/10387)) +- Missing i18n translation key for "Unread" ([#10387](https://github.com/RocketChat/Rocket.Chat/pull/10387) by [@Hudell](https://github.com/Hudell)) - Owner unable to delete channel or group from APIs ([#9729](https://github.com/RocketChat/Rocket.Chat/pull/9729) by [@c0dzilla](https://github.com/c0dzilla)) - Livechat translation files being ignored ([#10369](https://github.com/RocketChat/Rocket.Chat/pull/10369)) - Missing page "not found" ([#6673](https://github.com/RocketChat/Rocket.Chat/pull/6673) by [@Prakharsvnit](https://github.com/Prakharsvnit) & [@karlprieb](https://github.com/karlprieb)) @@ -3467,12 +3604,12 @@
🔍 Minor changes -- Release 0.64.0 ([#10613](https://github.com/RocketChat/Rocket.Chat/pull/10613) by [@christianh814](https://github.com/christianh814) & [@gdelavald](https://github.com/gdelavald) & [@tttt-conan](https://github.com/tttt-conan)) +- Release 0.64.0 ([#10613](https://github.com/RocketChat/Rocket.Chat/pull/10613) by [@TwizzyDizzy](https://github.com/TwizzyDizzy) & [@christianh814](https://github.com/christianh814) & [@gdelavald](https://github.com/gdelavald) & [@tttt-conan](https://github.com/tttt-conan)) - Regression: Various search provider fixes ([#10591](https://github.com/RocketChat/Rocket.Chat/pull/10591) by [@tkurz](https://github.com/tkurz)) -- Regression: /api/v1/settings.oauth not sending needed info for SAML & CAS ([#10596](https://github.com/RocketChat/Rocket.Chat/pull/10596)) +- Regression: /api/v1/settings.oauth not sending needed info for SAML & CAS ([#10596](https://github.com/RocketChat/Rocket.Chat/pull/10596) by [@cardoso](https://github.com/cardoso)) - Regression: Apps and Livechats not getting along well with each other ([#10598](https://github.com/RocketChat/Rocket.Chat/pull/10598)) - Development: Add Visual Studio Code debugging configuration ([#10586](https://github.com/RocketChat/Rocket.Chat/pull/10586)) -- Included missing lib for migrations ([#10532](https://github.com/RocketChat/Rocket.Chat/pull/10532)) +- Included missing lib for migrations ([#10532](https://github.com/RocketChat/Rocket.Chat/pull/10532) by [@Hudell](https://github.com/Hudell)) - Develop sync ([#10505](https://github.com/RocketChat/Rocket.Chat/pull/10505) by [@nsuchy](https://github.com/nsuchy) & [@rafaelks](https://github.com/rafaelks)) - Fix: Remove "secret" from REST endpoint /settings.oauth response ([#10513](https://github.com/RocketChat/Rocket.Chat/pull/10513)) - [OTHER] More Listeners for Apps & Utilize Promises inside Apps ([#10335](https://github.com/RocketChat/Rocket.Chat/pull/10335)) @@ -3482,7 +3619,7 @@ - [OTHER] Removed the developer warning on the rest api ([#10441](https://github.com/RocketChat/Rocket.Chat/pull/10441)) - Fix and improve vietnamese translation ([#10397](https://github.com/RocketChat/Rocket.Chat/pull/10397) by [@TDiNguyen](https://github.com/TDiNguyen) & [@tttt-conan](https://github.com/tttt-conan)) - Use Node 8.9 for CI build ([#10405](https://github.com/RocketChat/Rocket.Chat/pull/10405)) -- Update allowed labels for bot ([#10360](https://github.com/RocketChat/Rocket.Chat/pull/10360)) +- Update allowed labels for bot ([#10360](https://github.com/RocketChat/Rocket.Chat/pull/10360) by [@TwizzyDizzy](https://github.com/TwizzyDizzy)) - Remove @core team mention from Pull Request template ([#10384](https://github.com/RocketChat/Rocket.Chat/pull/10384)) - New issue template for *Release Process* ([#10234](https://github.com/RocketChat/Rocket.Chat/pull/10234)) - Master into Develop Branch Sync ([#10376](https://github.com/RocketChat/Rocket.Chat/pull/10376)) @@ -3490,7 +3627,7 @@ - Regression: Revert announcement structure ([#10544](https://github.com/RocketChat/Rocket.Chat/pull/10544) by [@gdelavald](https://github.com/gdelavald)) - Regression: Upload was not working ([#10543](https://github.com/RocketChat/Rocket.Chat/pull/10543)) - Deps update ([#10549](https://github.com/RocketChat/Rocket.Chat/pull/10549)) -- Regression: /api/v1/settings.oauth not returning clientId for Twitter ([#10560](https://github.com/RocketChat/Rocket.Chat/pull/10560)) +- Regression: /api/v1/settings.oauth not returning clientId for Twitter ([#10560](https://github.com/RocketChat/Rocket.Chat/pull/10560) by [@cardoso](https://github.com/cardoso)) - Regression: Webhooks breaking due to restricted test ([#10555](https://github.com/RocketChat/Rocket.Chat/pull/10555)) - Regression: Rooms and Apps weren't playing nice with each other ([#10559](https://github.com/RocketChat/Rocket.Chat/pull/10559)) - Regression: Fix announcement bar being displayed without content ([#10554](https://github.com/RocketChat/Rocket.Chat/pull/10554) by [@gdelavald](https://github.com/gdelavald)) @@ -3503,11 +3640,14 @@ ### 👩‍💻👨‍💻 Contributors 😍 +- [@Hudell](https://github.com/Hudell) - [@Prakharsvnit](https://github.com/Prakharsvnit) - [@TDiNguyen](https://github.com/TDiNguyen) +- [@TwizzyDizzy](https://github.com/TwizzyDizzy) - [@abernix](https://github.com/abernix) - [@brendangadd](https://github.com/brendangadd) - [@c0dzilla](https://github.com/c0dzilla) +- [@cardoso](https://github.com/cardoso) - [@christianh814](https://github.com/christianh814) - [@dschuan](https://github.com/dschuan) - [@gdelavald](https://github.com/gdelavald) @@ -3525,10 +3665,7 @@ ### 👩‍💻👨‍💻 Core Team 🤓 -- [@Hudell](https://github.com/Hudell) - [@MarcosSpessatto](https://github.com/MarcosSpessatto) -- [@TwizzyDizzy](https://github.com/TwizzyDizzy) -- [@cardoso](https://github.com/cardoso) - [@engelgabriel](https://github.com/engelgabriel) - [@geekgonecrazy](https://github.com/geekgonecrazy) - [@ggazzo](https://github.com/ggazzo) @@ -3615,7 +3752,7 @@ ### ⚠️ BREAKING CHANGES -- Removed Private History Route ([#10103](https://github.com/RocketChat/Rocket.Chat/pull/10103)) +- Removed Private History Route ([#10103](https://github.com/RocketChat/Rocket.Chat/pull/10103) by [@Hudell](https://github.com/Hudell)) ### 🎉 New features @@ -3625,7 +3762,7 @@ - Endpoint to retrieve message read receipts ([#9907](https://github.com/RocketChat/Rocket.Chat/pull/9907)) - Add option to login via REST using Facebook and Twitter tokens ([#9816](https://github.com/RocketChat/Rocket.Chat/pull/9816)) - Add REST endpoint to get the list of custom emojis ([#9629](https://github.com/RocketChat/Rocket.Chat/pull/9629)) -- GDPR Right to be forgotten/erased ([#9947](https://github.com/RocketChat/Rocket.Chat/pull/9947)) +- GDPR Right to be forgotten/erased ([#9947](https://github.com/RocketChat/Rocket.Chat/pull/9947) by [@Hudell](https://github.com/Hudell)) - Added endpoint to retrieve mentions of a channel ([#10105](https://github.com/RocketChat/Rocket.Chat/pull/10105)) - Add leave public channel & leave private channel permissions ([#9584](https://github.com/RocketChat/Rocket.Chat/pull/9584) by [@kb0304](https://github.com/kb0304)) - Added GET/POST channels.notifications ([#10128](https://github.com/RocketChat/Rocket.Chat/pull/10128)) @@ -3634,7 +3771,7 @@ - Added endpoint to get the list of available oauth services ([#10144](https://github.com/RocketChat/Rocket.Chat/pull/10144)) - REST API method to set room's announcement (channels.setAnnouncement) ([#9742](https://github.com/RocketChat/Rocket.Chat/pull/9742) by [@TopHattedCat](https://github.com/TopHattedCat)) - Audio recording as mp3 and better ui for recording ([#9726](https://github.com/RocketChat/Rocket.Chat/pull/9726) by [@kb0304](https://github.com/kb0304)) -- Setting to configure max delta for 2fa ([#9732](https://github.com/RocketChat/Rocket.Chat/pull/9732)) +- Setting to configure max delta for 2fa ([#9732](https://github.com/RocketChat/Rocket.Chat/pull/9732) by [@Hudell](https://github.com/Hudell)) - Livechat webhook request on message ([#9870](https://github.com/RocketChat/Rocket.Chat/pull/9870) by [@hmagarotto](https://github.com/hmagarotto)) - Announcement bar color wasn't using color from theming variables ([#9367](https://github.com/RocketChat/Rocket.Chat/pull/9367) by [@cyclops24](https://github.com/cyclops24) & [@karlprieb](https://github.com/karlprieb)) @@ -3655,10 +3792,10 @@ - Reactions not working on mobile ([#10104](https://github.com/RocketChat/Rocket.Chat/pull/10104)) - Broken video call accept dialog ([#9872](https://github.com/RocketChat/Rocket.Chat/pull/9872) by [@ramrami](https://github.com/ramrami)) - Wrong switch button border color ([#10081](https://github.com/RocketChat/Rocket.Chat/pull/10081) by [@kb0304](https://github.com/kb0304)) -- Nextcloud as custom oauth provider wasn't mapping data correctly ([#10090](https://github.com/RocketChat/Rocket.Chat/pull/10090)) +- Nextcloud as custom oauth provider wasn't mapping data correctly ([#10090](https://github.com/RocketChat/Rocket.Chat/pull/10090) by [@pierreozoux](https://github.com/pierreozoux)) - Missing sidebar default options on admin ([#10016](https://github.com/RocketChat/Rocket.Chat/pull/10016) by [@karlprieb](https://github.com/karlprieb)) - Able to react with invalid emoji ([#8667](https://github.com/RocketChat/Rocket.Chat/pull/8667) by [@mutdmour](https://github.com/mutdmour)) -- User preferences can't be saved when roles are hidden in admin settings ([#10051](https://github.com/RocketChat/Rocket.Chat/pull/10051)) +- User preferences can't be saved when roles are hidden in admin settings ([#10051](https://github.com/RocketChat/Rocket.Chat/pull/10051) by [@Hudell](https://github.com/Hudell)) - Browser was auto-filling values when editing another user profile ([#9932](https://github.com/RocketChat/Rocket.Chat/pull/9932) by [@kaiiiiiiiii](https://github.com/kaiiiiiiiii)) - Avatar input was accepting not supported image types ([#10011](https://github.com/RocketChat/Rocket.Chat/pull/10011) by [@karlprieb](https://github.com/karlprieb)) - Initial loading feedback was missing ([#10028](https://github.com/RocketChat/Rocket.Chat/pull/10028) by [@karlprieb](https://github.com/karlprieb)) @@ -3668,19 +3805,19 @@ - Unable to mention after newline in message ([#10078](https://github.com/RocketChat/Rocket.Chat/pull/10078) by [@c0dzilla](https://github.com/c0dzilla)) - Wrong pagination information on /api/v1/channels.members ([#10224](https://github.com/RocketChat/Rocket.Chat/pull/10224)) - Inline code following a url leads to autolinking of code with url ([#10163](https://github.com/RocketChat/Rocket.Chat/pull/10163) by [@c0dzilla](https://github.com/c0dzilla)) -- Incoming Webhooks were missing the raw content ([#10258](https://github.com/RocketChat/Rocket.Chat/pull/10258)) +- Incoming Webhooks were missing the raw content ([#10258](https://github.com/RocketChat/Rocket.Chat/pull/10258) by [@Hudell](https://github.com/Hudell)) - Missing Translation Key on Reactions ([#10270](https://github.com/RocketChat/Rocket.Chat/pull/10270) by [@bernardoetrevisan](https://github.com/bernardoetrevisan))
🔍 Minor changes -- Release 0.63.0 ([#10324](https://github.com/RocketChat/Rocket.Chat/pull/10324) by [@Joe-mcgee](https://github.com/Joe-mcgee) & [@TopHattedCat](https://github.com/TopHattedCat) & [@hmagarotto](https://github.com/hmagarotto) & [@kaiiiiiiiii](https://github.com/kaiiiiiiiii) & [@karlprieb](https://github.com/karlprieb) & [@kb0304](https://github.com/kb0304) & [@lunaticmonk](https://github.com/lunaticmonk) & [@ramrami](https://github.com/ramrami)) +- Release 0.63.0 ([#10324](https://github.com/RocketChat/Rocket.Chat/pull/10324) by [@Hudell](https://github.com/Hudell) & [@Joe-mcgee](https://github.com/Joe-mcgee) & [@TopHattedCat](https://github.com/TopHattedCat) & [@hmagarotto](https://github.com/hmagarotto) & [@kaiiiiiiiii](https://github.com/kaiiiiiiiii) & [@karlprieb](https://github.com/karlprieb) & [@kb0304](https://github.com/kb0304) & [@lunaticmonk](https://github.com/lunaticmonk) & [@ramrami](https://github.com/ramrami)) - Fix: Reaction endpoint/api only working with regular emojis ([#10323](https://github.com/RocketChat/Rocket.Chat/pull/10323)) - Bump snap version to include security fix ([#10313](https://github.com/RocketChat/Rocket.Chat/pull/10313)) - Update Meteor to 1.6.1.1 ([#10314](https://github.com/RocketChat/Rocket.Chat/pull/10314)) - LingoHub based on develop ([#10243](https://github.com/RocketChat/Rocket.Chat/pull/10243)) - Rename migration name on 108 to match file name ([#10237](https://github.com/RocketChat/Rocket.Chat/pull/10237)) -- Fix typo for Nextcloud login ([#10159](https://github.com/RocketChat/Rocket.Chat/pull/10159)) +- Fix typo for Nextcloud login ([#10159](https://github.com/RocketChat/Rocket.Chat/pull/10159) by [@pierreozoux](https://github.com/pierreozoux)) - Add a few listener supports for the Rocket.Chat Apps ([#10154](https://github.com/RocketChat/Rocket.Chat/pull/10154)) - Add forums as a place to suggest, discuss and upvote features ([#10148](https://github.com/RocketChat/Rocket.Chat/pull/10148) by [@SeanPackham](https://github.com/SeanPackham)) - Fix tests breaking randomly ([#10065](https://github.com/RocketChat/Rocket.Chat/pull/10065)) @@ -3699,6 +3836,7 @@ ### 👩‍💻👨‍💻 Contributors 😍 +- [@Hudell](https://github.com/Hudell) - [@Joe-mcgee](https://github.com/Joe-mcgee) - [@SeanPackham](https://github.com/SeanPackham) - [@TopHattedCat](https://github.com/TopHattedCat) @@ -3711,18 +3849,17 @@ - [@kb0304](https://github.com/kb0304) - [@lunaticmonk](https://github.com/lunaticmonk) - [@mutdmour](https://github.com/mutdmour) +- [@pierreozoux](https://github.com/pierreozoux) - [@ramrami](https://github.com/ramrami) - [@ubarsaiyan](https://github.com/ubarsaiyan) ### 👩‍💻👨‍💻 Core Team 🤓 -- [@Hudell](https://github.com/Hudell) - [@MarcosSpessatto](https://github.com/MarcosSpessatto) - [@engelgabriel](https://github.com/engelgabriel) - [@geekgonecrazy](https://github.com/geekgonecrazy) - [@ggazzo](https://github.com/ggazzo) - [@graywolf336](https://github.com/graywolf336) -- [@pierreozoux](https://github.com/pierreozoux) - [@renatobecker](https://github.com/renatobecker) - [@rodrigok](https://github.com/rodrigok) - [@sampaiodiego](https://github.com/sampaiodiego) @@ -3811,7 +3948,7 @@ - New sidebar layout ([#9608](https://github.com/RocketChat/Rocket.Chat/pull/9608) by [@karlprieb](https://github.com/karlprieb)) - Message read receipts ([#9717](https://github.com/RocketChat/Rocket.Chat/pull/9717)) - Alert admins when user requires approval & alert users when the account is approved/activated/deactivated ([#7098](https://github.com/RocketChat/Rocket.Chat/pull/7098) by [@luisfn](https://github.com/luisfn)) -- Allow configuration of SAML logout behavior ([#9527](https://github.com/RocketChat/Rocket.Chat/pull/9527)) +- Allow configuration of SAML logout behavior ([#9527](https://github.com/RocketChat/Rocket.Chat/pull/9527) by [@mrsimpson](https://github.com/mrsimpson)) - Internal hubot support for Direct Messages and Private Groups ([#8933](https://github.com/RocketChat/Rocket.Chat/pull/8933) by [@ramrami](https://github.com/ramrami)) - Improved default welcome message ([#9298](https://github.com/RocketChat/Rocket.Chat/pull/9298) by [@HammyHavoc](https://github.com/HammyHavoc)) - Makes shield icon configurable ([#9746](https://github.com/RocketChat/Rocket.Chat/pull/9746) by [@c0dzilla](https://github.com/c0dzilla)) @@ -3827,7 +3964,7 @@ - GraphQL API ([#8158](https://github.com/RocketChat/Rocket.Chat/pull/8158) by [@kamilkisiela](https://github.com/kamilkisiela)) - Livestream tab ([#9255](https://github.com/RocketChat/Rocket.Chat/pull/9255) by [@gdelavald](https://github.com/gdelavald)) - Add documentation requirement to PRs ([#9658](https://github.com/RocketChat/Rocket.Chat/pull/9658) by [@SeanPackham](https://github.com/SeanPackham)) -- Request mongoDB version in github issue template ([#9807](https://github.com/RocketChat/Rocket.Chat/pull/9807)) +- Request mongoDB version in github issue template ([#9807](https://github.com/RocketChat/Rocket.Chat/pull/9807) by [@TwizzyDizzy](https://github.com/TwizzyDizzy)) ### 🐛 Bug fixes @@ -3835,9 +3972,9 @@ - Wrong behavior of rooms info's *Read Only* and *Collaborative* buttons ([#9665](https://github.com/RocketChat/Rocket.Chat/pull/9665) by [@karlprieb](https://github.com/karlprieb)) - Close button on file upload bar was not working ([#9662](https://github.com/RocketChat/Rocket.Chat/pull/9662) by [@karlprieb](https://github.com/karlprieb)) - Chrome 64 breaks jitsi-meet iframe ([#9560](https://github.com/RocketChat/Rocket.Chat/pull/9560) by [@speedy01](https://github.com/speedy01)) -- Harmonize channel-related actions ([#9697](https://github.com/RocketChat/Rocket.Chat/pull/9697)) +- Harmonize channel-related actions ([#9697](https://github.com/RocketChat/Rocket.Chat/pull/9697) by [@mrsimpson](https://github.com/mrsimpson)) - Custom emoji was cropping sometimes ([#9676](https://github.com/RocketChat/Rocket.Chat/pull/9676) by [@anu-007](https://github.com/anu-007)) -- Show custom room types icon in channel header ([#9696](https://github.com/RocketChat/Rocket.Chat/pull/9696)) +- Show custom room types icon in channel header ([#9696](https://github.com/RocketChat/Rocket.Chat/pull/9696) by [@mrsimpson](https://github.com/mrsimpson)) - 'Query' support for channels.list.joined, groups.list, groups.listAll, im.list ([#9424](https://github.com/RocketChat/Rocket.Chat/pull/9424) by [@xbolshe](https://github.com/xbolshe)) - DeprecationWarning: prom-client ... when starting Rocket Chat server ([#9747](https://github.com/RocketChat/Rocket.Chat/pull/9747) by [@jgtoriginal](https://github.com/jgtoriginal)) - API to retrive rooms was returning empty objects ([#9737](https://github.com/RocketChat/Rocket.Chat/pull/9737)) @@ -3880,7 +4017,7 @@ - Dependencies update ([#9811](https://github.com/RocketChat/Rocket.Chat/pull/9811)) - Fix: Custom fields not showing on user info panel ([#9821](https://github.com/RocketChat/Rocket.Chat/pull/9821)) - Regression: Page was not respecting the window height on Firefox ([#9804](https://github.com/RocketChat/Rocket.Chat/pull/9804)) -- Update bot-config.yml ([#9784](https://github.com/RocketChat/Rocket.Chat/pull/9784)) +- Update bot-config.yml ([#9784](https://github.com/RocketChat/Rocket.Chat/pull/9784) by [@JSzaszvari](https://github.com/JSzaszvari)) - Develop fix sync from master ([#9797](https://github.com/RocketChat/Rocket.Chat/pull/9797)) - Regression: Change create channel icon ([#9851](https://github.com/RocketChat/Rocket.Chat/pull/9851) by [@karlprieb](https://github.com/karlprieb)) - Regression: Fix channel icons on safari ([#9852](https://github.com/RocketChat/Rocket.Chat/pull/9852) by [@karlprieb](https://github.com/karlprieb)) @@ -3897,8 +4034,10 @@ - [@AmShaegar13](https://github.com/AmShaegar13) - [@HammyHavoc](https://github.com/HammyHavoc) +- [@JSzaszvari](https://github.com/JSzaszvari) - [@RationalCoding](https://github.com/RationalCoding) - [@SeanPackham](https://github.com/SeanPackham) +- [@TwizzyDizzy](https://github.com/TwizzyDizzy) - [@anu-007](https://github.com/anu-007) - [@bernardoetrevisan](https://github.com/bernardoetrevisan) - [@c0dzilla](https://github.com/c0dzilla) @@ -3915,6 +4054,7 @@ - [@lindoelio](https://github.com/lindoelio) - [@luisfn](https://github.com/luisfn) - [@lunaticmonk](https://github.com/lunaticmonk) +- [@mrsimpson](https://github.com/mrsimpson) - [@rafaelks](https://github.com/rafaelks) - [@ramrami](https://github.com/ramrami) - [@savikko](https://github.com/savikko) @@ -3924,16 +4064,13 @@ ### 👩‍💻👨‍💻 Core Team 🤓 -- [@JSzaszvari](https://github.com/JSzaszvari) - [@MarcosSpessatto](https://github.com/MarcosSpessatto) - [@MartinSchoeler](https://github.com/MartinSchoeler) -- [@TwizzyDizzy](https://github.com/TwizzyDizzy) - [@engelgabriel](https://github.com/engelgabriel) - [@filipedelimabrito](https://github.com/filipedelimabrito) - [@geekgonecrazy](https://github.com/geekgonecrazy) - [@ggazzo](https://github.com/ggazzo) - [@graywolf336](https://github.com/graywolf336) -- [@mrsimpson](https://github.com/mrsimpson) - [@renatobecker](https://github.com/renatobecker) - [@rodrigok](https://github.com/rodrigok) - [@sampaiodiego](https://github.com/sampaiodiego) @@ -4188,7 +4325,7 @@ - Add new API endpoints ([#8947](https://github.com/RocketChat/Rocket.Chat/pull/8947)) - Option to enable/disable auto away and configure timer ([#8029](https://github.com/RocketChat/Rocket.Chat/pull/8029) by [@armand1m](https://github.com/armand1m)) - New Modal component ([#8882](https://github.com/RocketChat/Rocket.Chat/pull/8882) by [@karlprieb](https://github.com/karlprieb)) -- Improve room types API and usages ([#9009](https://github.com/RocketChat/Rocket.Chat/pull/9009)) +- Improve room types API and usages ([#9009](https://github.com/RocketChat/Rocket.Chat/pull/9009) by [@mrsimpson](https://github.com/mrsimpson)) - Room counter sidebar preference ([#8866](https://github.com/RocketChat/Rocket.Chat/pull/8866) by [@karlprieb](https://github.com/karlprieb)) - Save room's last message ([#8979](https://github.com/RocketChat/Rocket.Chat/pull/8979) by [@karlprieb](https://github.com/karlprieb)) - Token Controlled Access channels ([#8060](https://github.com/RocketChat/Rocket.Chat/pull/8060) by [@karlprieb](https://github.com/karlprieb) & [@lindoelio](https://github.com/lindoelio)) @@ -4201,7 +4338,7 @@ - Displays QR code for manually entering when enabling 2fa ([#8143](https://github.com/RocketChat/Rocket.Chat/pull/8143)) - Add yunohost.org installation method to Readme.md ([#8037](https://github.com/RocketChat/Rocket.Chat/pull/8037) by [@selamanse](https://github.com/selamanse)) - Modal ([#9092](https://github.com/RocketChat/Rocket.Chat/pull/9092) by [@karlprieb](https://github.com/karlprieb)) -- Make Custom oauth accept nested usernameField ([#9066](https://github.com/RocketChat/Rocket.Chat/pull/9066)) +- Make Custom oauth accept nested usernameField ([#9066](https://github.com/RocketChat/Rocket.Chat/pull/9066) by [@pierreozoux](https://github.com/pierreozoux)) ### 🐛 Bug fixes @@ -4218,7 +4355,7 @@ - Notification sound is not disabling when busy ([#9042](https://github.com/RocketChat/Rocket.Chat/pull/9042)) - Use encodeURI in AmazonS3 contentDisposition file.name to prevent fail ([#9024](https://github.com/RocketChat/Rocket.Chat/pull/9024) by [@paulovitin](https://github.com/paulovitin)) - snap install by setting grpc package used by google/vision to 1.6.6 ([#9029](https://github.com/RocketChat/Rocket.Chat/pull/9029)) -- Enable CORS for Restivus ([#8671](https://github.com/RocketChat/Rocket.Chat/pull/8671)) +- Enable CORS for Restivus ([#8671](https://github.com/RocketChat/Rocket.Chat/pull/8671) by [@mrsimpson](https://github.com/mrsimpson)) - Importers failing when usernames exists but cases don't match and improve the importer framework's performance ([#8966](https://github.com/RocketChat/Rocket.Chat/pull/8966)) - Error when saving integration with symbol as only trigger ([#9023](https://github.com/RocketChat/Rocket.Chat/pull/9023)) - Sync of non existent field throws exception ([#8006](https://github.com/RocketChat/Rocket.Chat/pull/8006) by [@goiaba](https://github.com/goiaba)) @@ -4246,10 +4383,10 @@ - i18n'd Resend_verification_mail, username_initials, upload avatar ([#8721](https://github.com/RocketChat/Rocket.Chat/pull/8721) by [@arungalva](https://github.com/arungalva)) - Username clipping on firefox ([#8716](https://github.com/RocketChat/Rocket.Chat/pull/8716) by [@karlprieb](https://github.com/karlprieb)) - Improved grammar and made it clearer to the user ([#8795](https://github.com/RocketChat/Rocket.Chat/pull/8795) by [@HammyHavoc](https://github.com/HammyHavoc)) -- Show real name of current user at top of side nav if setting enabled ([#8718](https://github.com/RocketChat/Rocket.Chat/pull/8718)) +- Show real name of current user at top of side nav if setting enabled ([#8718](https://github.com/RocketChat/Rocket.Chat/pull/8718) by [@alexbrazier](https://github.com/alexbrazier)) - Range Slider Value label has bug in RTL ([#8441](https://github.com/RocketChat/Rocket.Chat/pull/8441) by [@cyclops24](https://github.com/cyclops24)) -- Add historic chats icon in Livechat ([#8708](https://github.com/RocketChat/Rocket.Chat/pull/8708)) -- Sort direct messages by full name if show real names setting enabled ([#8717](https://github.com/RocketChat/Rocket.Chat/pull/8717)) +- Add historic chats icon in Livechat ([#8708](https://github.com/RocketChat/Rocket.Chat/pull/8708) by [@mrsimpson](https://github.com/mrsimpson)) +- Sort direct messages by full name if show real names setting enabled ([#8717](https://github.com/RocketChat/Rocket.Chat/pull/8717) by [@alexbrazier](https://github.com/alexbrazier)) - Improving consistency of UX ([#8796](https://github.com/RocketChat/Rocket.Chat/pull/8796) by [@HammyHavoc](https://github.com/HammyHavoc)) - fixed some typos ([#8787](https://github.com/RocketChat/Rocket.Chat/pull/8787) by [@TheReal1604](https://github.com/TheReal1604)) - Changed all rocket.chat/docs/ to docs.rocket.chat/ ([#8588](https://github.com/RocketChat/Rocket.Chat/pull/8588) by [@RekkyRek](https://github.com/RekkyRek)) @@ -4367,6 +4504,7 @@ - [@RekkyRek](https://github.com/RekkyRek) - [@TheReal1604](https://github.com/TheReal1604) - [@aditya19496](https://github.com/aditya19496) +- [@alexbrazier](https://github.com/alexbrazier) - [@armand1m](https://github.com/armand1m) - [@arungalva](https://github.com/arungalva) - [@ashward](https://github.com/ashward) @@ -4389,8 +4527,10 @@ - [@lindoelio](https://github.com/lindoelio) - [@mastappl](https://github.com/mastappl) - [@mritunjaygoutam12](https://github.com/mritunjaygoutam12) +- [@mrsimpson](https://github.com/mrsimpson) - [@paulovitin](https://github.com/paulovitin) - [@peterlee0127](https://github.com/peterlee0127) +- [@pierreozoux](https://github.com/pierreozoux) - [@pkgodara](https://github.com/pkgodara) - [@ramrami](https://github.com/ramrami) - [@rmetzler](https://github.com/rmetzler) @@ -4412,14 +4552,11 @@ ### 👩‍💻👨‍💻 Core Team 🤓 - [@MartinSchoeler](https://github.com/MartinSchoeler) -- [@alexbrazier](https://github.com/alexbrazier) - [@engelgabriel](https://github.com/engelgabriel) - [@geekgonecrazy](https://github.com/geekgonecrazy) - [@ggazzo](https://github.com/ggazzo) - [@graywolf336](https://github.com/graywolf336) - [@marceloschmidt](https://github.com/marceloschmidt) -- [@mrsimpson](https://github.com/mrsimpson) -- [@pierreozoux](https://github.com/pierreozoux) - [@rodrigok](https://github.com/rodrigok) - [@sampaiodiego](https://github.com/sampaiodiego) @@ -4498,7 +4635,7 @@ ### 🐛 Bug fixes -- AmazonS3: Quote file.name for ContentDisposition for files with commas ([#8593](https://github.com/RocketChat/Rocket.Chat/pull/8593)) +- AmazonS3: Quote file.name for ContentDisposition for files with commas ([#8593](https://github.com/RocketChat/Rocket.Chat/pull/8593) by [@xenithorb](https://github.com/xenithorb)) - Fix e-mail message forward ([#8645](https://github.com/RocketChat/Rocket.Chat/pull/8645)) - Audio message icon ([#8648](https://github.com/RocketChat/Rocket.Chat/pull/8648) by [@karlprieb](https://github.com/karlprieb)) - Highlighted color height issue ([#8431](https://github.com/RocketChat/Rocket.Chat/pull/8431) by [@cyclops24](https://github.com/cyclops24)) @@ -4520,13 +4657,13 @@ - [@karlprieb](https://github.com/karlprieb) - [@rodorgas](https://github.com/rodorgas) - [@vikaskedia](https://github.com/vikaskedia) +- [@xenithorb](https://github.com/xenithorb) ### 👩‍💻👨‍💻 Core Team 🤓 - [@geekgonecrazy](https://github.com/geekgonecrazy) - [@rodrigok](https://github.com/rodrigok) - [@sampaiodiego](https://github.com/sampaiodiego) -- [@xenithorb](https://github.com/xenithorb) # 0.59.2 `2017-10-25 · 6 🐛 · 4 👩‍💻👨‍💻` @@ -4665,7 +4802,7 @@ - message-box autogrow ([#8019](https://github.com/RocketChat/Rocket.Chat/pull/8019) by [@karlprieb](https://github.com/karlprieb)) - search results height ([#8018](https://github.com/RocketChat/Rocket.Chat/pull/8018) by [@gdelavald](https://github.com/gdelavald) & [@karlprieb](https://github.com/karlprieb)) - room icon on header ([#8017](https://github.com/RocketChat/Rocket.Chat/pull/8017) by [@karlprieb](https://github.com/karlprieb)) -- Hide scrollbar on login page if not necessary ([#8014](https://github.com/RocketChat/Rocket.Chat/pull/8014)) +- Hide scrollbar on login page if not necessary ([#8014](https://github.com/RocketChat/Rocket.Chat/pull/8014) by [@alexbrazier](https://github.com/alexbrazier)) - Error when translating message ([#8001](https://github.com/RocketChat/Rocket.Chat/pull/8001)) - Recent emojis not updated when adding via text ([#7998](https://github.com/RocketChat/Rocket.Chat/pull/7998)) - [PL] Polish translation ([#7989](https://github.com/RocketChat/Rocket.Chat/pull/7989) by [@Rzeszow](https://github.com/Rzeszow)) @@ -4795,6 +4932,7 @@ - [@TobiasKappe](https://github.com/TobiasKappe) - [@TriPhoenix](https://github.com/TriPhoenix) - [@aditya19496](https://github.com/aditya19496) +- [@alexbrazier](https://github.com/alexbrazier) - [@antaryami-sahoo](https://github.com/antaryami-sahoo) - [@arminfelder](https://github.com/arminfelder) - [@astax-t](https://github.com/astax-t) @@ -4823,7 +4961,6 @@ ### 👩‍💻👨‍💻 Core Team 🤓 - [@MartinSchoeler](https://github.com/MartinSchoeler) -- [@alexbrazier](https://github.com/alexbrazier) - [@engelgabriel](https://github.com/engelgabriel) - [@geekgonecrazy](https://github.com/geekgonecrazy) - [@ggazzo](https://github.com/ggazzo) @@ -4957,13 +5094,13 @@ - Fix room load on first hit ([#7687](https://github.com/RocketChat/Rocket.Chat/pull/7687)) - Markdown noopener/noreferrer: use correct HTML attribute ([#7644](https://github.com/RocketChat/Rocket.Chat/pull/7644) by [@jangmarker](https://github.com/jangmarker)) - Wrong email subject when "All Messages" setting enabled ([#7639](https://github.com/RocketChat/Rocket.Chat/pull/7639)) -- Csv importer: work with more problematic data ([#7456](https://github.com/RocketChat/Rocket.Chat/pull/7456)) +- Csv importer: work with more problematic data ([#7456](https://github.com/RocketChat/Rocket.Chat/pull/7456) by [@reist](https://github.com/reist)) - make flex-tab visible again when reduced width ([#7738](https://github.com/RocketChat/Rocket.Chat/pull/7738))
🔍 Minor changes -- Release 0.58.0 ([#7752](https://github.com/RocketChat/Rocket.Chat/pull/7752) by [@flaviogrossi](https://github.com/flaviogrossi) & [@jangmarker](https://github.com/jangmarker) & [@karlprieb](https://github.com/karlprieb) & [@ryoshimizu](https://github.com/ryoshimizu)) +- Release 0.58.0 ([#7752](https://github.com/RocketChat/Rocket.Chat/pull/7752) by [@flaviogrossi](https://github.com/flaviogrossi) & [@jangmarker](https://github.com/jangmarker) & [@karlprieb](https://github.com/karlprieb) & [@pierreozoux](https://github.com/pierreozoux) & [@ryoshimizu](https://github.com/ryoshimizu)) - Sync Master with 0.57.3 ([#7690](https://github.com/RocketChat/Rocket.Chat/pull/7690)) - Add missing parts of `one click to direct message` ([#7608](https://github.com/RocketChat/Rocket.Chat/pull/7608)) - LingoHub based on develop ([#7613](https://github.com/RocketChat/Rocket.Chat/pull/7613)) @@ -4975,8 +5112,8 @@ - [Fix] Don't save user to DB when a custom field is invalid ([#7513](https://github.com/RocketChat/Rocket.Chat/pull/7513) by [@Darkneon](https://github.com/Darkneon)) - Develop sync ([#7500](https://github.com/RocketChat/Rocket.Chat/pull/7500) by [@thinkeridea](https://github.com/thinkeridea)) - Better Issue Template ([#7492](https://github.com/RocketChat/Rocket.Chat/pull/7492)) -- Add helm chart kubernetes deployment ([#6340](https://github.com/RocketChat/Rocket.Chat/pull/6340)) -- Develop sync ([#7363](https://github.com/RocketChat/Rocket.Chat/pull/7363)) +- Add helm chart kubernetes deployment ([#6340](https://github.com/RocketChat/Rocket.Chat/pull/6340) by [@pierreozoux](https://github.com/pierreozoux)) +- Develop sync ([#7363](https://github.com/RocketChat/Rocket.Chat/pull/7363) by [@JSzaszvari](https://github.com/JSzaszvari)) - Escape error messages ([#7308](https://github.com/RocketChat/Rocket.Chat/pull/7308)) - update meteor to 1.5.0 ([#7287](https://github.com/RocketChat/Rocket.Chat/pull/7287)) - [New] Add instance id to response headers ([#7211](https://github.com/RocketChat/Rocket.Chat/pull/7211)) @@ -4988,6 +5125,7 @@ - [@AhmetS](https://github.com/AhmetS) - [@Darkneon](https://github.com/Darkneon) +- [@JSzaszvari](https://github.com/JSzaszvari) - [@Oliver84](https://github.com/Oliver84) - [@al3x](https://github.com/al3x) - [@borsden](https://github.com/borsden) @@ -5000,6 +5138,8 @@ - [@jfchevrette](https://github.com/jfchevrette) - [@karlprieb](https://github.com/karlprieb) - [@lindoelio](https://github.com/lindoelio) +- [@pierreozoux](https://github.com/pierreozoux) +- [@reist](https://github.com/reist) - [@ruKurz](https://github.com/ruKurz) - [@ryoshimizu](https://github.com/ryoshimizu) - [@satyapramodh](https://github.com/satyapramodh) @@ -5010,15 +5150,12 @@ ### 👩‍💻👨‍💻 Core Team 🤓 -- [@JSzaszvari](https://github.com/JSzaszvari) - [@MartinSchoeler](https://github.com/MartinSchoeler) - [@engelgabriel](https://github.com/engelgabriel) - [@filipedelimabrito](https://github.com/filipedelimabrito) - [@geekgonecrazy](https://github.com/geekgonecrazy) - [@ggazzo](https://github.com/ggazzo) - [@graywolf336](https://github.com/graywolf336) -- [@pierreozoux](https://github.com/pierreozoux) -- [@reist](https://github.com/reist) - [@rodrigok](https://github.com/rodrigok) - [@sampaiodiego](https://github.com/sampaiodiego) @@ -5130,13 +5267,13 @@ ### 🎉 New features - New avatar storage types ([#6788](https://github.com/RocketChat/Rocket.Chat/pull/6788)) -- Show full name in mentions if use full name setting enabled ([#6690](https://github.com/RocketChat/Rocket.Chat/pull/6690)) +- Show full name in mentions if use full name setting enabled ([#6690](https://github.com/RocketChat/Rocket.Chat/pull/6690) by [@alexbrazier](https://github.com/alexbrazier)) - Increase unread message count on @here mention ([#7059](https://github.com/RocketChat/Rocket.Chat/pull/7059)) - API method and REST Endpoint for getting a single message by id ([#7085](https://github.com/RocketChat/Rocket.Chat/pull/7085)) - Migration to add tags to email header and footer ([#7080](https://github.com/RocketChat/Rocket.Chat/pull/7080)) - postcss parser and cssnext implementation ([#6982](https://github.com/RocketChat/Rocket.Chat/pull/6982)) - Start running unit tests ([#6605](https://github.com/RocketChat/Rocket.Chat/pull/6605)) -- Make channel/group delete call answer to roomName ([#6857](https://github.com/RocketChat/Rocket.Chat/pull/6857)) +- Make channel/group delete call answer to roomName ([#6857](https://github.com/RocketChat/Rocket.Chat/pull/6857) by [@reist](https://github.com/reist)) - Feature/delete any message permission ([#6919](https://github.com/RocketChat/Rocket.Chat/pull/6919) by [@phutchins](https://github.com/phutchins)) - Force use of MongoDB for spotlight queries ([#7311](https://github.com/RocketChat/Rocket.Chat/pull/7311)) @@ -5179,7 +5316,7 @@ - Fix editing others messages ([#7200](https://github.com/RocketChat/Rocket.Chat/pull/7200)) - Fix oembed previews not being shown ([#7208](https://github.com/RocketChat/Rocket.Chat/pull/7208)) - "requirePasswordChange" property not being saved when set to false ([#7209](https://github.com/RocketChat/Rocket.Chat/pull/7209)) -- Removing the kadira package install from example build script. ([#7160](https://github.com/RocketChat/Rocket.Chat/pull/7160)) +- Removing the kadira package install from example build script. ([#7160](https://github.com/RocketChat/Rocket.Chat/pull/7160) by [@JSzaszvari](https://github.com/JSzaszvari)) - Fix user's customFields not being saved correctly ([#7358](https://github.com/RocketChat/Rocket.Chat/pull/7358)) - Improve avatar migration ([#7352](https://github.com/RocketChat/Rocket.Chat/pull/7352)) - Fix jump to unread button ([#7320](https://github.com/RocketChat/Rocket.Chat/pull/7320)) @@ -5226,7 +5363,9 @@ ### 👩‍💻👨‍💻 Contributors 😍 - [@ExTechOp](https://github.com/ExTechOp) +- [@JSzaszvari](https://github.com/JSzaszvari) - [@abrom](https://github.com/abrom) +- [@alexbrazier](https://github.com/alexbrazier) - [@bbrauns](https://github.com/bbrauns) - [@colin-campbell](https://github.com/colin-campbell) - [@darkv](https://github.com/darkv) @@ -5237,20 +5376,18 @@ - [@matthewshirley](https://github.com/matthewshirley) - [@phutchins](https://github.com/phutchins) - [@pmb0](https://github.com/pmb0) +- [@reist](https://github.com/reist) - [@sathieu](https://github.com/sathieu) - [@thinkeridea](https://github.com/thinkeridea) ### 👩‍💻👨‍💻 Core Team 🤓 -- [@JSzaszvari](https://github.com/JSzaszvari) - [@MartinSchoeler](https://github.com/MartinSchoeler) -- [@alexbrazier](https://github.com/alexbrazier) - [@engelgabriel](https://github.com/engelgabriel) - [@geekgonecrazy](https://github.com/geekgonecrazy) - [@ggazzo](https://github.com/ggazzo) - [@graywolf336](https://github.com/graywolf336) - [@marceloschmidt](https://github.com/marceloschmidt) -- [@reist](https://github.com/reist) - [@rodrigok](https://github.com/rodrigok) - [@sampaiodiego](https://github.com/sampaiodiego) @@ -5264,7 +5401,7 @@ ### 🎉 New features - Add a pointer cursor to message images ([#6881](https://github.com/RocketChat/Rocket.Chat/pull/6881)) -- Make channels.info accept roomName, just like groups.info ([#6827](https://github.com/RocketChat/Rocket.Chat/pull/6827)) +- Make channels.info accept roomName, just like groups.info ([#6827](https://github.com/RocketChat/Rocket.Chat/pull/6827) by [@reist](https://github.com/reist)) - Option to allow to signup as anonymous ([#6797](https://github.com/RocketChat/Rocket.Chat/pull/6797)) - create a method 'create token' ([#6807](https://github.com/RocketChat/Rocket.Chat/pull/6807)) - Add option on Channel Settings: Hide Notifications and Hide Unread Room Status (#2707, #2143) ([#5373](https://github.com/RocketChat/Rocket.Chat/pull/5373)) @@ -5286,16 +5423,16 @@ - Fix iframe wise issues ([#6798](https://github.com/RocketChat/Rocket.Chat/pull/6798)) - Incorrect error message when creating channel ([#6747](https://github.com/RocketChat/Rocket.Chat/pull/6747) by [@gdelavald](https://github.com/gdelavald)) - Hides nav buttons when selecting own profile ([#6760](https://github.com/RocketChat/Rocket.Chat/pull/6760) by [@gdelavald](https://github.com/gdelavald)) -- Search full name on client side ([#6767](https://github.com/RocketChat/Rocket.Chat/pull/6767)) -- Sort by real name if use real name setting is enabled ([#6758](https://github.com/RocketChat/Rocket.Chat/pull/6758)) -- CSV importer: require that there is some data in the zip, not ALL data ([#6768](https://github.com/RocketChat/Rocket.Chat/pull/6768)) +- Search full name on client side ([#6767](https://github.com/RocketChat/Rocket.Chat/pull/6767) by [@alexbrazier](https://github.com/alexbrazier)) +- Sort by real name if use real name setting is enabled ([#6758](https://github.com/RocketChat/Rocket.Chat/pull/6758) by [@alexbrazier](https://github.com/alexbrazier)) +- CSV importer: require that there is some data in the zip, not ALL data ([#6768](https://github.com/RocketChat/Rocket.Chat/pull/6768) by [@reist](https://github.com/reist)) - Archiving Direct Messages ([#6737](https://github.com/RocketChat/Rocket.Chat/pull/6737)) - Fix Caddy by forcing go 1.7 as needed by one of caddy's dependencies ([#6721](https://github.com/RocketChat/Rocket.Chat/pull/6721)) - Users status on main menu always offline ([#6896](https://github.com/RocketChat/Rocket.Chat/pull/6896)) - Not showing unread count on electron app’s icon ([#6923](https://github.com/RocketChat/Rocket.Chat/pull/6923)) - Compile CSS color variables ([#6939](https://github.com/RocketChat/Rocket.Chat/pull/6939)) - Remove spaces from env PORT and INSTANCE_IP ([#6955](https://github.com/RocketChat/Rocket.Chat/pull/6955)) -- make channels.create API check for create-c ([#6968](https://github.com/RocketChat/Rocket.Chat/pull/6968)) +- make channels.create API check for create-c ([#6968](https://github.com/RocketChat/Rocket.Chat/pull/6968) by [@reist](https://github.com/reist))
🔍 Minor changes @@ -5325,11 +5462,13 @@ ### 👩‍💻👨‍💻 Contributors 😍 - [@abrom](https://github.com/abrom) +- [@alexbrazier](https://github.com/alexbrazier) - [@ehkasper](https://github.com/ehkasper) - [@gdelavald](https://github.com/gdelavald) - [@glehmann](https://github.com/glehmann) - [@intelradoux](https://github.com/intelradoux) - [@karlprieb](https://github.com/karlprieb) +- [@reist](https://github.com/reist) - [@robertdown](https://github.com/robertdown) - [@sscholl](https://github.com/sscholl) - [@vlogic](https://github.com/vlogic) @@ -5337,13 +5476,11 @@ ### 👩‍💻👨‍💻 Core Team 🤓 - [@MartinSchoeler](https://github.com/MartinSchoeler) -- [@alexbrazier](https://github.com/alexbrazier) - [@engelgabriel](https://github.com/engelgabriel) - [@geekgonecrazy](https://github.com/geekgonecrazy) - [@ggazzo](https://github.com/ggazzo) - [@graywolf336](https://github.com/graywolf336) - [@marceloschmidt](https://github.com/marceloschmidt) -- [@reist](https://github.com/reist) - [@rodrigok](https://github.com/rodrigok) - [@sampaiodiego](https://github.com/sampaiodiego) @@ -5378,7 +5515,7 @@ ### 🎉 New features -- Add shield.svg api route to generate custom shields/badges ([#6565](https://github.com/RocketChat/Rocket.Chat/pull/6565)) +- Add shield.svg api route to generate custom shields/badges ([#6565](https://github.com/RocketChat/Rocket.Chat/pull/6565) by [@alexbrazier](https://github.com/alexbrazier)) - resolve merge share function ([#6577](https://github.com/RocketChat/Rocket.Chat/pull/6577) by [@karlprieb](https://github.com/karlprieb) & [@tgxn](https://github.com/tgxn)) - Two Factor Auth ([#6476](https://github.com/RocketChat/Rocket.Chat/pull/6476)) - Permission `join-without-join-code` assigned to admins and bots by default ([#6430](https://github.com/RocketChat/Rocket.Chat/pull/6430)) @@ -5398,7 +5535,7 @@ - Do not add default roles for users without services field ([#6594](https://github.com/RocketChat/Rocket.Chat/pull/6594)) - Accounts from LinkedIn OAuth without name ([#6590](https://github.com/RocketChat/Rocket.Chat/pull/6590)) - Usage of subtagged languages ([#6575](https://github.com/RocketChat/Rocket.Chat/pull/6575)) -- UTC offset missing UTC text when positive ([#6562](https://github.com/RocketChat/Rocket.Chat/pull/6562)) +- UTC offset missing UTC text when positive ([#6562](https://github.com/RocketChat/Rocket.Chat/pull/6562) by [@alexbrazier](https://github.com/alexbrazier)) - can not get access_token when using custom oauth ([#6531](https://github.com/RocketChat/Rocket.Chat/pull/6531) by [@fengt](https://github.com/fengt)) - Outgoing webhooks which have an error and they're retrying would still retry even if the integration was disabled` ([#6478](https://github.com/RocketChat/Rocket.Chat/pull/6478)) - Incorrect curl command being generated on incoming integrations ([#6620](https://github.com/RocketChat/Rocket.Chat/pull/6620)) @@ -5430,7 +5567,7 @@ - rocketchat-lib part1 ([#6553](https://github.com/RocketChat/Rocket.Chat/pull/6553)) - dependencies upgrade ([#6584](https://github.com/RocketChat/Rocket.Chat/pull/6584)) - fixed typo in readme.md ([#6580](https://github.com/RocketChat/Rocket.Chat/pull/6580) by [@sezinkarli](https://github.com/sezinkarli)) -- Use real name instead of username for messages and direct messages list ([#3851](https://github.com/RocketChat/Rocket.Chat/pull/3851)) +- Use real name instead of username for messages and direct messages list ([#3851](https://github.com/RocketChat/Rocket.Chat/pull/3851) by [@alexbrazier](https://github.com/alexbrazier)) - Convert Ui-Login Package to Js ([#6561](https://github.com/RocketChat/Rocket.Chat/pull/6561)) - rocketchat-channel-settings coffee to js ([#6551](https://github.com/RocketChat/Rocket.Chat/pull/6551)) - Move wordpress packages client files to client folder ([#6571](https://github.com/RocketChat/Rocket.Chat/pull/6571)) @@ -5505,7 +5642,7 @@ - Added Deploy method and platform to stats ([#6649](https://github.com/RocketChat/Rocket.Chat/pull/6649)) - LingoHub based on develop ([#6647](https://github.com/RocketChat/Rocket.Chat/pull/6647)) - meteor update ([#6631](https://github.com/RocketChat/Rocket.Chat/pull/6631)) -- Env override initial setting ([#6163](https://github.com/RocketChat/Rocket.Chat/pull/6163)) +- Env override initial setting ([#6163](https://github.com/RocketChat/Rocket.Chat/pull/6163) by [@mrsimpson](https://github.com/mrsimpson))
@@ -5514,11 +5651,13 @@ - [@Kiran-Rao](https://github.com/Kiran-Rao) - [@Lawri-van-Buel](https://github.com/Lawri-van-Buel) - [@a5his](https://github.com/a5his) +- [@alexbrazier](https://github.com/alexbrazier) - [@billtt](https://github.com/billtt) - [@drallgood](https://github.com/drallgood) - [@fengt](https://github.com/fengt) - [@gdelavald](https://github.com/gdelavald) - [@karlprieb](https://github.com/karlprieb) +- [@mrsimpson](https://github.com/mrsimpson) - [@nathanmarcos](https://github.com/nathanmarcos) - [@qge](https://github.com/qge) - [@sezinkarli](https://github.com/sezinkarli) @@ -5528,12 +5667,10 @@ ### 👩‍💻👨‍💻 Core Team 🤓 - [@MartinSchoeler](https://github.com/MartinSchoeler) -- [@alexbrazier](https://github.com/alexbrazier) - [@engelgabriel](https://github.com/engelgabriel) - [@geekgonecrazy](https://github.com/geekgonecrazy) - [@ggazzo](https://github.com/ggazzo) - [@graywolf336](https://github.com/graywolf336) - [@marceloschmidt](https://github.com/marceloschmidt) -- [@mrsimpson](https://github.com/mrsimpson) - [@rodrigok](https://github.com/rodrigok) - [@sampaiodiego](https://github.com/sampaiodiego) \ No newline at end of file diff --git a/app/api/server/api.js b/app/api/server/api.js index 7f4f34fa5d30..22e7e8c26d92 100644 --- a/app/api/server/api.js +++ b/app/api/server/api.js @@ -40,7 +40,7 @@ export class APIClass extends Restivus { importIds: 0, e2e: 0, }; - this.limitedUserFieldsToExclude = { + this.defaultLimitedUserFieldsToExclude = { avatarOrigin: 0, emails: 0, phone: 0, @@ -53,14 +53,25 @@ export class APIClass extends Restivus { roles: 0, statusDefault: 0, _updatedAt: 0, - customFields: 0, settings: 0, }; + this.limitedUserFieldsToExclude = this.defaultLimitedUserFieldsToExclude; this.limitedUserFieldsToExcludeIfIsPrivilegedUser = { services: 0, }; } + setLimitedCustomFields(customFields) { + const nonPublicFieds = customFields.reduce((acc, customField) => { + acc[`customFields.${ customField }`] = 0; + return acc; + }, {}); + this.limitedUserFieldsToExclude = { + ...this.defaultLimitedUserFieldsToExclude, + ...nonPublicFieds, + }; + } + hasHelperMethods() { return API.helperMethods.size !== 0; } @@ -566,37 +577,63 @@ const defaultOptionsEndpoint = function _defaultOptionsEndpoint() { this.done(); }; -const createApi = function _createApi(enableCors) { - if (!API.v1 || API.v1._config.enableCors !== enableCors) { - API.v1 = new APIClass({ - version: 'v1', - apiPath: 'api/', - useDefaultAuth: true, - prettyJson: process.env.NODE_ENV === 'development', - enableCors, - defaultOptionsEndpoint, - auth: getUserAuth(), - }); - } +const createApi = function _createApi(_api, options = {}) { + _api = _api || new APIClass(Object.assign({ + apiPath: 'api/', + useDefaultAuth: true, + prettyJson: process.env.NODE_ENV === 'development', + defaultOptionsEndpoint, + auth: getUserAuth(), + }, options)); - if (!API.default || API.default._config.enableCors !== enableCors) { - API.default = new APIClass({ - apiPath: 'api/', - useDefaultAuth: true, - prettyJson: process.env.NODE_ENV === 'development', - enableCors, - defaultOptionsEndpoint, - auth: getUserAuth(), - }); + delete _api._config.defaultHeaders['Access-Control-Allow-Origin']; + delete _api._config.defaultHeaders['Access-Control-Allow-Headers']; + delete _api._config.defaultHeaders.Vary; + + if (settings.get('API_Enable_CORS')) { + const origin = settings.get('API_CORS_Origin'); + + if (origin) { + _api._config.defaultHeaders['Access-Control-Allow-Origin'] = origin; + + if (origin !== '*') { + _api._config.defaultHeaders.Vary = 'Origin'; + } + } + + _api._config.defaultHeaders['Access-Control-Allow-Headers'] = 'Origin, X-Requested-With, Content-Type, Accept, X-User-Id, X-Auth-Token'; } + + return _api; +}; + +const createApis = function _createApis() { + API.v1 = createApi(API.v1, { + version: 'v1', + }); + + API.default = createApi(API.default); }; // also create the API immediately -createApi(!!settings.get('API_Enable_CORS')); +createApis(); // register the API to be re-created once the CORS-setting changes. -settings.get('API_Enable_CORS', (key, value) => { - createApi(value); +settings.get(/^(API_Enable_CORS|API_CORS_Origin)$/, () => { + createApis(); +}); + +settings.get('Accounts_CustomFields', (key, value) => { + if (!value) { + return API.v1.setLimitedCustomFields([]); + } + try { + const customFields = JSON.parse(value); + const nonPublicCustomFields = Object.keys(customFields).filter((customFieldKey) => customFields[customFieldKey].public !== true); + API.v1.setLimitedCustomFields(nonPublicCustomFields); + } catch (error) { + console.warn('Invalid Custom Fields', error); + } }); settings.get('API_Enable_Rate_Limiter_Limit_Time_Default', (key, value) => { diff --git a/app/api/server/v1/users.js b/app/api/server/v1/users.js index 602605d9c4d6..f93dec90c0fd 100644 --- a/app/api/server/v1/users.js +++ b/app/api/server/v1/users.js @@ -58,7 +58,9 @@ API.v1.addRoute('users.create', { authRequired: true }, { }); } - return API.v1.success({ user: Users.findOneById(newUserId, { fields: API.v1.defaultFieldsToExclude }) }); + const { fields } = this.parseJsonQuery(); + + return API.v1.success({ user: Users.findOneById(newUserId, { fields }) }); }, }); @@ -229,8 +231,9 @@ API.v1.addRoute('users.register', { authRequired: false }, { // Now set their username Meteor.runAsUser(userId, () => Meteor.call('setUsername', this.bodyParams.username)); + const { fields } = this.parseJsonQuery(); - return API.v1.success({ user: Users.findOneById(userId, { fields: API.v1.defaultFieldsToExclude }) }); + return API.v1.success({ user: Users.findOneById(userId, { fields }) }); }, }); @@ -426,8 +429,9 @@ API.v1.addRoute('users.update', { authRequired: true }, { Meteor.call('setUserActiveStatus', this.bodyParams.userId, this.bodyParams.data.active); }); } + const { fields } = this.parseJsonQuery(); - return API.v1.success({ user: Users.findOneById(this.bodyParams.userId, { fields: API.v1.defaultFieldsToExclude }) }); + return API.v1.success({ user: Users.findOneById(this.bodyParams.userId, { fields }) }); }, }); @@ -525,28 +529,21 @@ API.v1.addRoute('users.setPreferences', { authRequired: true }, { muteFocusedConversations: Match.Optional(Boolean), }), }); + if (this.bodyParams.userId && this.bodyParams.userId !== this.userId && !hasPermission(this.userId, 'edit-other-user-info')) { + throw new Meteor.Error('error-action-not-allowed', 'Editing user is not allowed'); + } const userId = this.bodyParams.userId ? this.bodyParams.userId : this.userId; - const userData = { - _id: userId, - settings: { - preferences: this.bodyParams.data, - }, - }; - - if (this.bodyParams.data.language) { - const { language } = this.bodyParams.data; - delete this.bodyParams.data.language; - userData.language = language; + if (!Users.findOneById(userId)) { + throw new Meteor.Error('error-invalid-user', 'The optional "userId" param provided does not match any users'); } - Meteor.runAsUser(this.userId, () => saveUser(this.userId, userData)); + Meteor.runAsUser(userId, () => Meteor.call('saveUserPreferences', this.bodyParams.data)); const user = Users.findOneById(userId, { fields: { 'settings.preferences': 1, language: 1, }, }); - return API.v1.success({ user: { _id: user._id, diff --git a/app/apps/client/admin/appManage.html b/app/apps/client/admin/appManage.html index 037f19cfca0e..783647e27ae0 100644 --- a/app/apps/client/admin/appManage.html +++ b/app/apps/client/admin/appManage.html @@ -12,7 +12,7 @@ {{/if}}
-
diff --git a/app/apps/server/bridges/bridges.js b/app/apps/server/bridges/bridges.js index 5781842fb766..6298e9498000 100644 --- a/app/apps/server/bridges/bridges.js +++ b/app/apps/server/bridges/bridges.js @@ -13,6 +13,8 @@ import { AppRoomBridge } from './rooms'; import { AppInternalBridge } from './internal'; import { AppSettingBridge } from './settings'; import { AppUserBridge } from './users'; +import { AppLivechatBridge } from './livechat'; +import { AppUploadBridge } from './uploads'; export class RealAppBridges extends AppBridges { constructor(orch) { @@ -31,6 +33,8 @@ export class RealAppBridges extends AppBridges { this._internalBridge = new AppInternalBridge(orch); this._setsBridge = new AppSettingBridge(orch); this._userBridge = new AppUserBridge(orch); + this._livechatBridge = new AppLivechatBridge(orch); + this._uploadBridge = new AppUploadBridge(orch); } getCommandBridge() { @@ -84,4 +88,12 @@ export class RealAppBridges extends AppBridges { getUserBridge() { return this._userBridge; } + + getLivechatBridge() { + return this._livechatBridge; + } + + getUploadBridge() { + return this._uploadBridge; + } } diff --git a/app/apps/server/bridges/commands.js b/app/apps/server/bridges/commands.js index 827c2606d2c0..4cf8ba28e029 100644 --- a/app/apps/server/bridges/commands.js +++ b/app/apps/server/bridges/commands.js @@ -94,6 +94,7 @@ export class AppCommandsBridge { command: command.command.toLowerCase(), params: Utilities.getI18nKeyForApp(command.i18nParamsExample, appId), description: Utilities.getI18nKeyForApp(command.i18nDescription, appId), + permission: command.permission, callback: this._appCommandExecutor.bind(this), providesPreview: command.providesPreview, previewer: !command.previewer ? undefined : this._appCommandPreviewer.bind(this), diff --git a/app/apps/server/bridges/http.js b/app/apps/server/bridges/http.js index 743343fa12c9..1cfc983b9a99 100644 --- a/app/apps/server/bridges/http.js +++ b/app/apps/server/bridges/http.js @@ -1,5 +1,31 @@ import { HTTP } from 'meteor/http'; +/** + * Normalize the options object to a shape + * the HTTP.call method recognizes + * + * @param Object options Http options received from the engine + * + */ +function normalizeHttpOptions(options) { + const npmRequestOptions = {}; + + if (options.hasOwnProperty('strictSSL')) { + npmRequestOptions.strictSSL = options.strictSSL; + delete options.strictSSL; + } + + if (options.hasOwnProperty('rejectUnauthorized')) { + npmRequestOptions.agentOptions = { + rejectUnauthorized: options.rejectUnauthorized, + }; + + delete options.rejectUnauthorized; + } + + options.npmRequestOptions = npmRequestOptions; +} + export class AppHttpBridge { constructor(orch) { this.orch = orch; @@ -10,6 +36,8 @@ export class AppHttpBridge { info.request.content = JSON.stringify(info.request.data); } + normalizeHttpOptions(info.request); + this.orch.debugLog(`The App ${ info.appId } is requesting from the outter webs:`, info); try { diff --git a/app/apps/server/bridges/livechat.js b/app/apps/server/bridges/livechat.js new file mode 100644 index 000000000000..001d87fab741 --- /dev/null +++ b/app/apps/server/bridges/livechat.js @@ -0,0 +1,135 @@ +import { Random } from 'meteor/random'; + +import { getRoom } from '../../../livechat/server/api/lib/livechat'; +import { Livechat } from '../../../livechat/server/lib/Livechat'; +import Rooms from '../../../models/server/models/Rooms'; +import LivechatVisitors from '../../../models/server/models/LivechatVisitors'; +import Users from '../../../models/server/models/Users'; + +export class AppLivechatBridge { + constructor(orch) { + this.orch = orch; + } + + async createMessage(message, appId) { + this.orch.debugLog(`The App ${ appId } is creating a new message.`); + + if (!message.token) { + throw new Error('Invalid token for livechat message'); + } + + const data = { + guest: this.orch.getConverters().get('visitors').convertAppVisitor(message.visitor), + message: this.orch.getConverters().get('messages').convertAppMessage(message), + }; + + const msg = Livechat.sendMessage(data); + + return msg._id; + } + + async getMessageById(messageId, appId) { + this.orch.debugLog(`The App ${ appId } is getting the message: "${ messageId }"`); + + return this.orch.getConverters().get('messages').convertById(messageId); + } + + async updateMessage(message, appId) { + this.orch.debugLog(`The App ${ appId } is updating a message.`); + + const data = { + guest: message.visitor, + message: this.orch.getConverters().get('messages').convertAppMessage(message), + }; + + Livechat.updateMessage(data); + } + + async createRoom(visitor, agent, appId) { + this.orch.debugLog(`The App ${ appId } is creating a livechat room.`); + + const agentUser = Users.findOneById(agent.id); + agentUser.agentId = agentUser._id; + + return this.orch.getConverters().get('rooms').convertRoom(getRoom({ + guest: this.orch.getConverters().get('visitors').convertAppVisitor(visitor), + agent: agentUser, + rid: Random.id(), + }).room); + } + + async closeRoom(room, comment, appId) { + this.orch.debugLog(`The App ${ appId } is closing a livechat room.`); + + return Livechat.closeRoom({ + visitor: this.orch.getConverters().get('visitors').convertAppVisitor(room.visitor), + room: this.orch.getConverters().get('rooms').convertAppRoom(room), + comment, + }); + } + + async findRooms(visitor, departmentId, appId) { + this.orch.debugLog(`The App ${ appId } is looking for livechat visitors.`); + + if (!visitor) { + return []; + } + + let result; + + if (departmentId) { + result = Rooms.findOpenByVisitorTokenAndDepartmentId(visitor.token, departmentId).fetch(); + } else { + result = Rooms.findOpenByVisitorToken(visitor.token).fetch(); + } + + return result.map((room) => this.orch.getConverters().get('rooms').convertRoom(room)); + } + + async createVisitor(visitor, appId) { + this.orch.debugLog(`The App ${ appId } is creating a livechat visitor.`); + + const registerData = { + department: visitor.department, + username: visitor.username, + name: visitor.name, + token: visitor.token, + }; + + if (visitor.visitorEmails && visitor.visitorEmails.length) { + registerData.email = visitor.visitorEmails[0].address; + } + + if (visitor.phone && visitor.phone.length) { + registerData.phone = { number: visitor.phone[0].phoneNumber }; + } + + return Livechat.registerGuest(registerData); + } + + async transferVisitor(visitor, transferData, appId) { + this.orch.debugLog(`The App ${ appId } is transfering a livechat.`); + + if (!visitor) { + throw new Error('Invalid visitor, cannot transfer'); + } + + const { + targetAgent, + targetDepartment: departmentId, + currentRoom, + } = transferData; + + return Livechat.transfer( + this.orch.getConverters().get('rooms').convertAppRoom(currentRoom), + this.orch.getConverters().get('visitors').convertAppVisitor(visitor), + { userId: targetAgent.id, departmentId } + ); + } + + async findVisitors(query, appId) { + this.orch.debugLog(`The App ${ appId } is looking for livechat visitors.`); + + return LivechatVisitors.find(query).fetch().map((visitor) => this.orch.getConverters().get('visitors').convertVisitor(visitor)); + } +} diff --git a/app/apps/server/bridges/uploads.js b/app/apps/server/bridges/uploads.js new file mode 100644 index 000000000000..a6a3efc6c1d7 --- /dev/null +++ b/app/apps/server/bridges/uploads.js @@ -0,0 +1,27 @@ +import { FileUpload } from '../../../file-upload/server'; + +export class AppUploadBridge { + constructor(orch) { + this.orch = orch; + } + + async getById(id, appId) { + this.orch.debugLog(`The App ${ appId } is getting the upload: "${ id }"`); + + return this.orch.getConverters().get('uploads').convertById(id); + } + + getBuffer(upload, appId) { + this.orch.debugLog(`The App ${ appId } is getting the upload: "${ upload.id }"`); + + return new Promise((resolve, reject) => { + FileUpload.getBuffer(upload, (error, result) => { + if (error) { + return reject(error); + } + + resolve(result); + }); + }); + } +} diff --git a/app/apps/server/communication/rest.js b/app/apps/server/communication/rest.js index 98e9925d4d81..2787a965135a 100644 --- a/app/apps/server/communication/rest.js +++ b/app/apps/server/communication/rest.js @@ -9,8 +9,9 @@ import { Info } from '../../../utils'; import { Settings, Users } from '../../../models/server'; import { Apps } from '../orchestrator'; +const appsEngineVersionForMarketplace = Info.marketplaceApiVersion.replace(/-.*/g, ''); const getDefaultHeaders = () => ({ - 'X-Apps-Engine-Version': Info.marketplaceApiVersion, + 'X-Apps-Engine-Version': appsEngineVersionForMarketplace, }); const purchaseTypes = new Set(['buy', 'subscription']); @@ -341,7 +342,7 @@ export class AppsRestApi { let result; try { - result = HTTP.get(`${ baseUrl }/v1/apps/${ this.urlParams.id }/latest?frameworkVersion=${ Info.marketplaceApiVersion }`, { + result = HTTP.get(`${ baseUrl }/v1/apps/${ this.urlParams.id }/latest?frameworkVersion=${ appsEngineVersionForMarketplace }`, { headers, }); } catch (e) { diff --git a/app/apps/server/converters/departments.js b/app/apps/server/converters/departments.js new file mode 100644 index 000000000000..34fc08415ffc --- /dev/null +++ b/app/apps/server/converters/departments.js @@ -0,0 +1,52 @@ +import LivechatDepartment from '../../../models/server/models/LivechatDepartment'; +import { transformMappedData } from '../../lib/misc/transformMappedData'; + +export class AppDepartmentsConverter { + constructor(orch) { + this.orch = orch; + } + + convertById(id) { + const department = LivechatDepartment.findOneById(id); + + return this.convertDepartment(department); + } + + convertDepartment(department) { + if (!department) { + return undefined; + } + + const map = { + id: '_id', + name: 'name', + email: 'email', + updatedAt: '_updatedAt', + enabled: 'enabled', + numberOfAgents: 'numAgents', + showOnOfflineForm: 'showOnOfflineForm', + showOnRegistration: 'showOnRegistration', + }; + + return transformMappedData(department, map); + } + + convertAppDepartment(department) { + if (!department) { + return undefined; + } + + const newDepartment = { + _id: department.id, + name: department.name, + email: department.email, + _updatedAt: department.updatedAt, + enabled: department.enabled, + numAgents: department.numberOfAgents, + showOnOfflineForm: department.showOnOfflineForm, + showOnRegistration: department.showOnRegistration, + }; + + return Object.assign(newDepartment, department._unmappedProperties_); + } +} diff --git a/app/apps/server/converters/messages.js b/app/apps/server/converters/messages.js index 2abaedd58b92..cb3acd690fd4 100644 --- a/app/apps/server/converters/messages.js +++ b/app/apps/server/converters/messages.js @@ -30,8 +30,10 @@ export class AppMessagesConverter { emoji: 'emoji', avatarUrl: 'avatar', alias: 'alias', + file: 'file', customFields: 'customFields', groupable: 'groupable', + token: 'token', room: (message) => { const result = this.orch.getConverters().get('rooms').convertById(message.rid); delete message.rid; diff --git a/app/apps/server/converters/rooms.js b/app/apps/server/converters/rooms.js index 59c16e40ba91..11cdcab555c5 100644 --- a/app/apps/server/converters/rooms.js +++ b/app/apps/server/converters/rooms.js @@ -1,6 +1,6 @@ import { RoomType } from '@rocket.chat/apps-engine/definition/rooms'; -import { Rooms, Users } from '../../../models'; +import { Rooms, Users, LivechatVisitors, LivechatDepartment } from '../../../models'; export class AppRoomsConverter { constructor(orch) { @@ -33,20 +33,62 @@ export class AppRoomsConverter { }; } + let v; + if (room.visitor) { + const visitor = LivechatVisitors.findOneById(room.visitor.id); + v = { + _id: visitor._id, + username: visitor.username, + token: visitor.token, + }; + } + + let departmentId; + if (room.department) { + const department = LivechatDepartment.findOneById(room.department.id); + departmentId = department._id; + } + + let servedBy; + if (room.servedBy) { + const user = Users.findOneById(room.servedBy.id); + servedBy = { + _id: user._id, + username: user.username, + }; + } + + let closedBy; + if (room.closedBy) { + const user = Users.findOneById(room.closedBy.id); + closedBy = { + _id: user._id, + username: user.username, + }; + } + return { _id: room.id, fname: room.displayName, name: room.slugifiedName, t: room.type, u, + v, + departmentId, + servedBy, + closedBy, members: room.members, default: typeof room.isDefault === 'undefined' ? false : room.isDefault, ro: typeof room.isReadOnly === 'undefined' ? false : room.isReadOnly, sysMes: typeof room.displaySystemMessages === 'undefined' ? true : room.displaySystemMessages, + waitingResponse: typeof room.isWaitingResponse === 'undefined' ? undefined : !!room.isWaitingResponse, + open: typeof room.isOpen === 'undefined' ? undefined : !!room.isOpen, msgs: room.messageCount || 0, ts: room.createdAt, _updatedAt: room.updatedAt, + closedAt: room.closedAt, lm: room.lastModifiedAt, + customFields: room.customFields, }; } @@ -60,21 +102,48 @@ export class AppRoomsConverter { creator = this.orch.getConverters().get('users').convertById(room.u._id); } + let visitor; + if (room.v) { + visitor = this.orch.getConverters().get('visitors').convertById(room.v._id); + } + + let department; + if (room.departmentId) { + department = this.orch.getConverters().get('departments').convertById(room.departmentId); + } + + let servedBy; + if (room.servedBy) { + servedBy = this.orch.getConverters().get('users').convertById(room.servedBy._id); + } + + let responseBy; + if (room.responseBy) { + responseBy = this.orch.getConverters().get('users').convertById(room.responseBy._id); + } + return { id: room._id, displayName: room.fname, slugifiedName: room.name, type: this._convertTypeToApp(room.t), creator, + visitor, + department, + servedBy, + responseBy, members: room.members, isDefault: typeof room.default === 'undefined' ? false : room.default, isReadOnly: typeof room.ro === 'undefined' ? false : room.ro, displaySystemMessages: typeof room.sysMes === 'undefined' ? true : room.sysMes, + isWaitingResponse: typeof room.waitingResponse === 'undefined' ? undefined : !!room.waitingResponse, + isOpen: typeof room.open === 'undefined' ? undefined : !!room.open, messageCount: room.msgs, createdAt: room.ts, updatedAt: room._updatedAt, + closedAt: room.closedAt, lastModifiedAt: room.lm, - customFields: {}, + customFields: room.customFields, }; } diff --git a/app/apps/server/converters/uploads.js b/app/apps/server/converters/uploads.js new file mode 100644 index 000000000000..e138e162e0f0 --- /dev/null +++ b/app/apps/server/converters/uploads.js @@ -0,0 +1,97 @@ +import { transformMappedData } from '../../lib/misc/transformMappedData'; +import Uploads from '../../../models/server/models/Uploads'; + +export class AppUploadsConverter { + constructor(orch) { + this.orch = orch; + } + + convertById(id) { + const upload = Uploads.findOneById(id); + + return this.convertToApp(upload); + } + + convertToApp(upload) { + if (!upload) { + return undefined; + } + + const map = { + id: '_id', + name: 'name', + size: 'size', + type: 'type', + store: 'store', + description: 'description', + complete: 'complete', + uploading: 'uploading', + extension: 'extension', + progress: 'progress', + etag: 'etag', + path: 'path', + token: 'token', + url: 'url', + updatedAt: '_updatedAt', + uploadedAt: 'uploadedAt', + room: (upload) => { + const result = this.orch.getConverters().get('rooms').convertById(upload.rid); + delete upload.rid; + return result; + }, + user: (upload) => { + if (!upload.userId) { + return undefined; + } + + const result = this.orch.getConverters().get('users').convertById(upload.userId); + delete upload.userId; + return result; + }, + visitor: (upload) => { + if (!upload.visitorToken) { + return undefined; + } + + const result = this.orch.getConverters().get('users').convertByToken(upload.visitorToken); + delete upload.visitorToken; + return result; + }, + }; + + return transformMappedData(upload, map); + } + + convertToRocketChat(upload) { + if (!upload) { + return undefined; + } + + const { id: userId } = upload.user || {}; + const { token: visitorToken } = upload.visitor || {}; + const { id: rid } = upload.room; + + const newUpload = { + _id: upload.id, + name: upload.name, + size: upload.size, + type: upload.type, + extension: upload.extension, + description: upload.description, + store: upload.store, + etag: upload.etag, + complete: upload.complete, + uploading: upload.uploading, + progress: upload.progress, + token: upload.token, + url: upload.url, + _updatedAt: upload.updatedAt, + uploadedAt: upload.uploadedAt, + rid, + userId, + visitorToken, + }; + + return Object.assign(newUpload, upload._unmappedProperties_); + } +} diff --git a/app/apps/server/converters/visitors.js b/app/apps/server/converters/visitors.js new file mode 100644 index 000000000000..66ab62158249 --- /dev/null +++ b/app/apps/server/converters/visitors.js @@ -0,0 +1,56 @@ +import LivechatVisitors from '../../../models/server/models/LivechatVisitors'; +import { transformMappedData } from '../../lib/misc/transformMappedData'; + +export class AppVisitorsConverter { + constructor(orch) { + this.orch = orch; + } + + convertById(id) { + const visitor = LivechatVisitors.findOneById(id); + + return this.convertVisitor(visitor); + } + + convertByToken(token) { + const visitor = LivechatVisitors.getVisitorByToken(token); + + return this.convertVisitor(visitor); + } + + convertVisitor(visitor) { + if (!visitor) { + return undefined; + } + + const map = { + id: '_id', + username: 'username', + name: 'name', + department: 'department', + updatedAt: '_updatedAt', + token: 'token', + phone: 'phone', + visitorEmails: 'visitorEmails', + }; + + return transformMappedData(visitor, map); + } + + convertAppVisitor(visitor) { + if (!visitor) { + return undefined; + } + + const newVisitor = { + _id: visitor.id, + username: visitor.username, + name: visitor.name, + token: visitor.token, + phone: visitor.phone, + visitorEmails: visitor.visitorEmails, + }; + + return Object.assign(newVisitor, visitor._unmappedProperties_); + } +} diff --git a/app/apps/server/cron.js b/app/apps/server/cron.js index 91f0d3676275..0e51170734d9 100644 --- a/app/apps/server/cron.js +++ b/app/apps/server/cron.js @@ -6,7 +6,8 @@ import { AppStatus } from '@rocket.chat/apps-engine/definition/AppStatus'; import { Apps } from './orchestrator'; import { getWorkspaceAccessToken } from '../../cloud/server'; -import { Settings, Users, Roles } from '../../models/server'; +import { Settings, Users } from '../../models/server'; +import { sendMessagesToAdmins } from '../../../server/lib/sendMessagesToAdmins'; const notifyAdminsAboutInvalidApps = Meteor.bindEnvironment(function _notifyAdminsAboutInvalidApps(apps) { @@ -26,28 +27,20 @@ const notifyAdminsAboutInvalidApps = Meteor.bindEnvironment(function _notifyAdmi const rocketCatMessage = 'There is one or more apps in an invalid state. Go to Administration > Apps to review.'; const link = '/admin/apps'; - Roles.findUsersInRole('admin').forEach((adminUser) => { - Users.removeBannerById(adminUser._id, { id }); - - try { - Meteor.runAsUser(adminUser._id, () => Meteor.call('createDirectMessage', 'rocket.cat')); - - Meteor.runAsUser('rocket.cat', () => Meteor.call('sendMessage', { - msg: `*${ TAPi18n.__(title, adminUser.language) }*\n${ TAPi18n.__(rocketCatMessage, adminUser.language) }`, - rid: [adminUser._id, 'rocket.cat'].sort().join(''), - })); - } catch (e) { - console.error(e); - } - - Users.addBannerById(adminUser._id, { - id, - priority: 10, - title, - text, - modifiers: ['danger'], - link, - }); + sendMessagesToAdmins({ + msgs: ({ adminUser }) => ({ msg: `*${ TAPi18n.__(title, adminUser.language) }*\n${ TAPi18n.__(rocketCatMessage, adminUser.language) }` }), + banners: ({ adminUser }) => { + Users.removeBannerById(adminUser._id, { id }); + + return [{ + id, + priority: 10, + title, + text, + modifiers: ['danger'], + link, + }]; + }, }); return apps; @@ -66,17 +59,8 @@ const notifyAdminsAboutRenewedApps = Meteor.bindEnvironment(function _notifyAdmi const rocketCatMessage = 'There is one or more disabled apps with valid licenses. Go to Administration > Apps to review.'; - Roles.findUsersInRole('admin').forEach((adminUser) => { - try { - Meteor.runAsUser(adminUser._id, () => Meteor.call('createDirectMessage', 'rocket.cat')); - - Meteor.runAsUser('rocket.cat', () => Meteor.call('sendMessage', { - msg: `${ TAPi18n.__(rocketCatMessage, adminUser.language) }`, - rid: [adminUser._id, 'rocket.cat'].sort().join(''), - })); - } catch (e) { - console.error(e); - } + sendMessagesToAdmins({ + msgs: ({ adminUser }) => ({ msg: `${ TAPi18n.__(rocketCatMessage, adminUser.language) }` }), }); }); diff --git a/app/apps/server/orchestrator.js b/app/apps/server/orchestrator.js index 427fae9f5006..84c71af4fa0f 100644 --- a/app/apps/server/orchestrator.js +++ b/app/apps/server/orchestrator.js @@ -8,11 +8,16 @@ import { AppRealStorage, AppRealLogsStorage } from './storage'; import { settings } from '../../settings'; import { Permissions, AppsLogsModel, AppsModel, AppsPersistenceModel } from '../../models'; import { Logger } from '../../logger'; - -export let Apps; +import { AppVisitorsConverter } from './converters/visitors'; +import { AppUploadsConverter } from './converters/uploads'; +import { AppDepartmentsConverter } from './converters/departments'; class AppServerOrchestrator { constructor() { + this._isInitialized = false; + } + + initialize() { this._rocketchatLogger = new Logger('Rocket.Chat Apps'); Permissions.createOrUpdate('manage-apps', ['admin']); @@ -29,6 +34,9 @@ class AppServerOrchestrator { this._converters.set('rooms', new AppRoomsConverter(this)); this._converters.set('settings', new AppSettingsConverter(this)); this._converters.set('users', new AppUsersConverter(this)); + this._converters.set('visitors', new AppVisitorsConverter(this)); + this._converters.set('departments', new AppDepartmentsConverter(this)); + this._converters.set('uploads', new AppUploadsConverter(this)); this._bridges = new RealAppBridges(this); @@ -38,6 +46,8 @@ class AppServerOrchestrator { this._communicators.set('methods', new AppMethods(this)); this._communicators.set('notifier', new AppServerNotifier(this)); this._communicators.set('restapi', new AppsRestApi(this, this._manager)); + + this._isInitialized = true; } getModel() { @@ -72,6 +82,10 @@ class AppServerOrchestrator { return this._manager; } + isInitialized() { + return this._isInitialized; + } + isEnabled() { return settings.get('Apps_Framework_enabled'); } @@ -133,6 +147,8 @@ class AppServerOrchestrator { } } +export const Apps = new AppServerOrchestrator(); + settings.addGroup('General', function() { this.section('Apps', function() { this.add('Apps_Framework_enabled', true, { @@ -154,7 +170,7 @@ settings.addGroup('General', function() { settings.get('Apps_Framework_enabled', (key, isEnabled) => { // In case this gets called before `Meteor.startup` - if (!Apps) { + if (!Apps.isInitialized()) { return; } @@ -166,7 +182,7 @@ settings.get('Apps_Framework_enabled', (key, isEnabled) => { }); Meteor.startup(function _appServerOrchestrator() { - Apps = new AppServerOrchestrator(); + Apps.initialize(); if (Apps.isEnabled()) { Apps.load(); diff --git a/app/assets/server/assets.js b/app/assets/server/assets.js index 4801c4efa041..3df4a62c2e7c 100644 --- a/app/assets/server/assets.js +++ b/app/assets/server/assets.js @@ -499,7 +499,7 @@ WebApp.connectHandlers.use('/assets/', Meteor.bindEnvironment(function(req, res, if (defaultUrl) { const assetUrl = format && ['png', 'svg'].includes(format) ? defaultUrl.replace(/(svg|png)$/, format) : defaultUrl; req.url = `/${ assetUrl }`; - WebAppInternals.staticFilesMiddleware(WebAppInternals.staticFiles, req, res, next); + WebAppInternals.staticFilesMiddleware(WebAppInternals.staticFilesByArch, req, res, next); } else { res.writeHead(404); res.end(); diff --git a/app/autolinker/client/client.js b/app/autolinker/client/client.js index b7e7f905bbce..486cb90dbb19 100644 --- a/app/autolinker/client/client.js +++ b/app/autolinker/client/client.js @@ -1,4 +1,5 @@ import { Meteor } from 'meteor/meteor'; +import { Tracker } from 'meteor/tracker'; import s from 'underscore.string'; import Autolinker from 'autolinker'; @@ -41,11 +42,13 @@ const createAutolinker = () => { }); }; -const renderMessage = (message) => { - if (settings.get('AutoLinker') !== true) { - return message; - } +let autolinker; + +Tracker.autorun(() => { + autolinker = createAutolinker(); +}); +const renderMessage = (message) => { if (!s.trim(message.html)) { return message; } @@ -58,7 +61,7 @@ const renderMessage = (message) => { } else { msgParts = [message.html]; } - const autolinker = createAutolinker(); + message.html = msgParts .map((msgPart) => { if (regexTokens && regexTokens.test(msgPart)) { @@ -72,4 +75,9 @@ const renderMessage = (message) => { return message; }; -callbacks.add('renderMessage', renderMessage, callbacks.priority.LOW, 'autolinker'); +Tracker.autorun(function() { + if (settings.get('AutoLinker') !== true) { + return callbacks.remove('renderMessage', 'autolinker'); + } + callbacks.add('renderMessage', renderMessage, callbacks.priority.LOW, 'autolinker'); +}); diff --git a/app/autotranslate/server/deeplTranslate.js b/app/autotranslate/server/deeplTranslate.js index 81227e576a41..22c8293d3dd3 100644 --- a/app/autotranslate/server/deeplTranslate.js +++ b/app/autotranslate/server/deeplTranslate.js @@ -26,7 +26,7 @@ class DeeplAutoTranslate extends AutoTranslate { constructor() { super(); this.name = 'deepl-translate'; - this.apiEndPointUrl = 'https://api.deepl.com/v1/translate'; + this.apiEndPointUrl = 'https://api.deepl.com/v2/translate'; // Get the service provide API key. settings.get('AutoTranslate_DeepLAPIKey', (key, value) => { this.apiKey = value; diff --git a/app/cas/server/cas_rocketchat.js b/app/cas/server/cas_rocketchat.js index 0a6ec78e520e..34d931cbf210 100644 --- a/app/cas/server/cas_rocketchat.js +++ b/app/cas/server/cas_rocketchat.js @@ -12,6 +12,7 @@ Meteor.startup(function() { this.add('CAS_base_url', '', { type: 'string', group: 'CAS', public: true }); this.add('CAS_login_url', '', { type: 'string', group: 'CAS', public: true }); this.add('CAS_version', '1.0', { type: 'select', values: [{ key: '1.0', i18nLabel: '1.0' }, { key: '2.0', i18nLabel: '2.0' }], group: 'CAS' }); + this.add('CAS_trust_username', false, { type: 'boolean', group: 'CAS', public: true, i18nDescription: 'CAS_trust_username_description' }); this.section('Attribute_handling', function() { // Enable/disable sync diff --git a/app/cas/server/cas_server.js b/app/cas/server/cas_server.js index 410fd4f16e06..3d8cfcd9801a 100644 --- a/app/cas/server/cas_server.js +++ b/app/cas/server/cas_server.js @@ -124,6 +124,7 @@ Accounts.registerLoginHandler(function(options) { const syncUserDataFieldMap = settings.get('CAS_Sync_User_Data_FieldMap').trim(); const cas_version = parseFloat(settings.get('CAS_version')); const sync_enabled = settings.get('CAS_Sync_User_Data_Enabled'); + const trustUsername = settings.get('CAS_trust_username'); // We have these const ext_attrs = { @@ -179,11 +180,13 @@ Accounts.registerLoginHandler(function(options) { if (!user) { // If that user was not found, check if there's any CAS user that is currently using that username on Rocket.Chat // With this, CAS login will continue to work if the user is renamed on both sides and also if the user is renamed only on Rocket.Chat. - const username = new RegExp(`^${ result.username }$`, 'i'); - user = Meteor.users.findOne({ 'services.cas.external_id': { $exists: true }, username }); - if (user) { - // Update the user's external_id to reflect this new username. - Meteor.users.update(user, { $set: { 'services.cas.external_id': result.username } }); + if (trustUsername) { + const username = new RegExp(`^${ result.username }$`, 'i'); + user = Meteor.users.findOne({ 'services.cas.external_id': { $exists: true }, username }); + if (user) { + // Update the user's external_id to reflect this new username. + Meteor.users.update(user, { $set: { 'services.cas.external_id': result.username } }); + } } } diff --git a/app/channel-settings/client/views/channelSettings.js b/app/channel-settings/client/views/channelSettings.js index cb3e4379ad76..41332e2aa06b 100644 --- a/app/channel-settings/client/views/channelSettings.js +++ b/app/channel-settings/client/views/channelSettings.js @@ -221,6 +221,9 @@ Template.channelSettingsEditing.onCreated(function() { return hasAllPermission('edit-room', room._id); }, getValue() { + if (room.prid) { + return room.fname; + } if (settings.get('UI_Allow_room_names_with_special_chars')) { return room.fname || room.name; } diff --git a/app/channel-settings/server/functions/saveRoomName.js b/app/channel-settings/server/functions/saveRoomName.js index 1584febd2e3b..be509b42e74e 100644 --- a/app/channel-settings/server/functions/saveRoomName.js +++ b/app/channel-settings/server/functions/saveRoomName.js @@ -4,6 +4,14 @@ import { Rooms, Messages, Subscriptions, Integrations } from '../../../models'; import { roomTypes, getValidRoomName } from '../../../utils'; import { callbacks } from '../../../callbacks'; +const updateRoomName = (rid, displayName, isDiscussion) => { + if (isDiscussion) { + return Rooms.setFnameById(rid, displayName) && Subscriptions.updateFnameByRoomId(rid, displayName); + } + const slugifiedRoomName = getValidRoomName(displayName, rid); + return Rooms.setNameById(rid, slugifiedRoomName, displayName) && Subscriptions.updateNameAndAlertByRoomId(rid, slugifiedRoomName, displayName); +}; + export const saveRoomName = function(rid, displayName, user, sendMessage = true) { const room = Rooms.findOneById(rid); if (roomTypes.roomTypes[room.t].preventRenaming()) { @@ -14,17 +22,12 @@ export const saveRoomName = function(rid, displayName, user, sendMessage = true) if (displayName === room.name) { return; } - - const slugifiedRoomName = getValidRoomName(displayName, rid); - - const update = Rooms.setNameById(rid, slugifiedRoomName, displayName) && Subscriptions.updateNameAndAlertByRoomId(rid, slugifiedRoomName, displayName); - + const isDiscussion = Boolean(room && room.prid); + const update = updateRoomName(rid, displayName, isDiscussion); if (!update) { return; } - Integrations.updateRoomName(room.name, displayName); - if (sendMessage) { Messages.createRoomRenamedWithRoomIdRoomNameAndUser(rid, displayName, user); } diff --git a/app/cors/server/cors.js b/app/cors/server/cors.js index 8d59968807a5..7c4284535363 100644 --- a/app/cors/server/cors.js +++ b/app/cors/server/cors.js @@ -44,7 +44,16 @@ WebApp.rawConnectHandlers.use(Meteor.bindEnvironment(function(req, res, next) { }); })); +let Support_Cordova_App = false; +settings.get('Support_Cordova_App', (key, value) => { + Support_Cordova_App = value; +}); + WebApp.rawConnectHandlers.use(function(req, res, next) { + if (Support_Cordova_App !== true) { + return next(); + } + if (/^\/(api|_timesync|sockjs|tap-i18n)(\/|$)/.test(req.url)) { res.setHeader('Access-Control-Allow-Origin', '*'); } diff --git a/app/custom-sounds/client/admin/adminSounds.js b/app/custom-sounds/client/admin/adminSounds.js index cb256482bed2..552bcd2ea42b 100644 --- a/app/custom-sounds/client/admin/adminSounds.js +++ b/app/custom-sounds/client/admin/adminSounds.js @@ -4,8 +4,9 @@ import { FlowRouter } from 'meteor/kadira:flow-router'; import { Template } from 'meteor/templating'; import s from 'underscore.string'; -import { CustomSounds } from '../../../models'; +import { CustomSounds as CustomSoundsModel } from '../../../models'; import { RocketChatTabBar, SideNav, TabBar } from '../../../ui-utils'; +import { CustomSounds } from '../lib/CustomSounds'; Template.adminSounds.helpers({ searchText() { @@ -57,7 +58,7 @@ Template.adminSounds.helpers({ onTableItemClick() { const instance = Template.instance(); return function(item) { - instance.tabBarData.set(CustomSounds.findOne({ _id: item._id })); + instance.tabBarData.set(CustomSoundsModel.findOne({ _id: item._id })); instance.tabBar.showGroup('custom-sounds-selected'); instance.tabBar.open('admin-sound-info'); }; @@ -114,7 +115,7 @@ Template.adminSounds.onCreated(function() { const limit = instance.limit != null ? instance.limit.get() : 0; - return CustomSounds.find(query, { limit, sort: { name: 1 } }).fetch(); + return CustomSoundsModel.find(query, { limit, sort: { name: 1 } }).fetch(); }; }); @@ -141,10 +142,7 @@ Template.adminSounds.events({ 'click .icon-play-circled'(e) { e.preventDefault(); e.stopPropagation(); - const $audio = $(`audio#${ this._id }`); - if ($audio && $audio[0] && $audio[0].play) { - $audio[0].play(); - } + CustomSounds.play(this._id); }, 'click .icon-pause-circled'(e) { e.preventDefault(); diff --git a/app/custom-sounds/client/lib/CustomSounds.js b/app/custom-sounds/client/lib/CustomSounds.js index 3d32b19e74f3..52e1666c4d82 100644 --- a/app/custom-sounds/client/lib/CustomSounds.js +++ b/app/custom-sounds/client/lib/CustomSounds.js @@ -57,7 +57,21 @@ class CustomSoundsClass { const list = Object.values(this.list.get()); return _.sortBy(list, 'name'); } + + play = (sound, { volume = 1, loop = false } = {}) => { + const audio = document.querySelector(`audio#${ sound }`); + if (!audio || !audio.play) { + return; + } + + audio.volume = volume; + audio.loop = loop; + audio.play(); + + return audio; + } } + export const CustomSounds = new CustomSoundsClass(); Meteor.startup(() => diff --git a/app/discussion/client/tabBar.js b/app/discussion/client/tabBar.js index 8ab8d47bda70..e10e1143eeb5 100644 --- a/app/discussion/client/tabBar.js +++ b/app/discussion/client/tabBar.js @@ -1,6 +1,7 @@ import { Meteor } from 'meteor/meteor'; import { TabBar } from '../../ui-utils/client'; +import { settings } from '../../settings'; Meteor.startup(function() { return TabBar.addButton({ @@ -10,5 +11,6 @@ Meteor.startup(function() { icon: 'discussion', template: 'discussionsTabbar', order: 10, + condition: () => settings.get('Discussion_enabled'), }); }); diff --git a/app/emoji-custom/client/lib/emojiCustom.js b/app/emoji-custom/client/lib/emojiCustom.js index 8395f74c3d8e..00ec847f0fca 100644 --- a/app/emoji-custom/client/lib/emojiCustom.js +++ b/app/emoji-custom/client/lib/emojiCustom.js @@ -3,9 +3,10 @@ import { Blaze } from 'meteor/blaze'; import { Session } from 'meteor/session'; import { isSetNotNull } from './function-isSet'; -import { RoomManager, call } from '../../../ui-utils'; -import { emoji, EmojiPicker } from '../../../emoji'; -import { CachedCollectionManager } from '../../../ui-cached-collection'; +import { RoomManager } from '../../../ui-utils/client'; +import { emoji, EmojiPicker } from '../../../emoji/client'; +import { CachedCollectionManager } from '../../../ui-cached-collection/client'; +import { APIClient } from '../../../utils/client'; export const getEmojiUrlFromName = function(name, extension) { Session.get; @@ -164,21 +165,27 @@ emoji.packages.emojiCustom = { Meteor.startup(() => CachedCollectionManager.onLogin(async () => { - const emojis = await call('listEmojiCustom'); - - emoji.packages.emojiCustom.emojisByCategory = { rocket: [] }; - for (const currentEmoji of emojis) { - emoji.packages.emojiCustom.emojisByCategory.rocket.push(currentEmoji.name); - emoji.packages.emojiCustom.list.push(`:${ currentEmoji.name }:`); - emoji.list[`:${ currentEmoji.name }:`] = currentEmoji; - emoji.list[`:${ currentEmoji.name }:`].emojiPackage = 'emojiCustom'; - for (const alias of currentEmoji.aliases) { - emoji.packages.emojiCustom.list.push(`:${ alias }:`); - emoji.list[`:${ alias }:`] = { - emojiPackage: 'emojiCustom', - aliasOf: currentEmoji.name, - }; + try { + const { emojis: { update: emojis } } = await APIClient.v1.get('emoji-custom.list'); + + emoji.packages.emojiCustom.emojisByCategory = { rocket: [] }; + for (const currentEmoji of emojis) { + emoji.packages.emojiCustom.emojisByCategory.rocket.push(currentEmoji.name); + emoji.packages.emojiCustom.list.push(`:${ currentEmoji.name }:`); + emoji.list[`:${ currentEmoji.name }:`] = currentEmoji; + emoji.list[`:${ currentEmoji.name }:`].emojiPackage = 'emojiCustom'; + for (const alias of currentEmoji.aliases) { + emoji.packages.emojiCustom.list.push(`:${ alias }:`); + emoji.list[`:${ alias }:`] = { + emojiPackage: 'emojiCustom', + aliasOf: currentEmoji.name, + }; + } } + + EmojiPicker.updateRecent('rocket'); + } catch (e) { + console.error('Error getting custom emoji', e); } }) ); diff --git a/app/federation/server/constants.js b/app/federation/server/constants.js new file mode 100644 index 000000000000..1dadf121b9e5 --- /dev/null +++ b/app/federation/server/constants.js @@ -0,0 +1,4 @@ +export const STATUS_ENABLED = 'Enabled'; +export const STATUS_REGISTERING = 'Registering with Hub...'; +export const STATUS_ERROR_REGISTERING = 'Could not register with Hub'; +export const STATUS_DISABLED = 'Disabled'; diff --git a/app/federation/server/endpoints/dispatch.js b/app/federation/server/endpoints/dispatch.js index b0693b2ab438..0dae5285f9d2 100644 --- a/app/federation/server/endpoints/dispatch.js +++ b/app/federation/server/endpoints/dispatch.js @@ -19,6 +19,8 @@ import { getFederationDomain } from '../lib/getFederationDomain'; import { decryptIfNeeded } from '../lib/crypt'; import { isFederationEnabled } from '../lib/isFederationEnabled'; import { getUpload, requestEventsFromLatest } from '../handler'; +import { notifyUsersOnMessage } from '../../../lib/server/lib/notifyUsersOnMessage'; +import { sendAllNotifications } from '../../../lib/server/lib/sendNotificationsOnMessage'; API.v1.addRoute('federation.events.dispatch', { authRequired: false }, { async post() { @@ -195,10 +197,10 @@ API.v1.addRoute('federation.events.dispatch', { authRequired: false }, { // Update the federation Messages.update({ _id: persistedMessage._id }, { $set: { federation: message.federation } }); } else { - // Update the subscription open status - Subscriptions.update({ rid: message.rid, name: message.u.username }, { $set: { open: true, alert: true } }); + // Load the room + const room = Rooms.findOneById(message.rid); - // Denormalize user + // Denormalize message const denormalizedMessage = normalizers.denormalizeMessage(message); // Is there a file? @@ -234,6 +236,10 @@ API.v1.addRoute('federation.events.dispatch', { authRequired: false }, { // Create the message Messages.insert(denormalizedMessage); + + // Notify users + notifyUsersOnMessage(denormalizedMessage, room); + sendAllNotifications(denormalizedMessage, room); } } break; diff --git a/app/federation/server/functions/helpers.js b/app/federation/server/functions/helpers.js index ceb01edd9b29..a38582c6aa40 100644 --- a/app/federation/server/functions/helpers.js +++ b/app/federation/server/functions/helpers.js @@ -1,8 +1,14 @@ import { Settings, Subscriptions, Users } from '../../../models/server'; +import { STATUS_ENABLED, STATUS_REGISTERING } from '../constants'; export const getNameAndDomain = (fullyQualifiedName) => fullyQualifiedName.split('@'); export const isFullyQualified = (name) => name.indexOf('@') !== -1; +export function isRegisteringOrEnabled() { + const status = Settings.findOneById('FEDERATION_Status'); + return [STATUS_ENABLED, STATUS_REGISTERING].includes(status && status.value); +} + export function updateStatus(status) { Settings.updateValueById('FEDERATION_Status', status); } diff --git a/app/federation/server/startup/settings.js b/app/federation/server/startup/settings.js index 3bcb454523af..48213be78807 100644 --- a/app/federation/server/startup/settings.js +++ b/app/federation/server/startup/settings.js @@ -2,13 +2,14 @@ import { debounce } from 'underscore'; import { Meteor } from 'meteor/meteor'; import { settings } from '../../../settings/server'; -import { updateStatus, updateEnabled } from '../functions/helpers'; +import { updateStatus, updateEnabled, isRegisteringOrEnabled } from '../functions/helpers'; import { getFederationDomain } from '../lib/getFederationDomain'; import { getFederationDiscoveryMethod } from '../lib/getFederationDiscoveryMethod'; import { registerWithHub } from '../lib/dns'; import { enableCallbacks, disableCallbacks } from '../lib/callbacks'; import { logger } from '../lib/logger'; import { FederationKeys } from '../../../models/server'; +import { STATUS_ENABLED, STATUS_REGISTERING, STATUS_ERROR_REGISTERING, STATUS_DISABLED } from '../constants'; Meteor.startup(function() { const federationPublicKey = FederationKeys.getPublicKeyString(); @@ -68,18 +69,22 @@ Meteor.startup(function() { const updateSettings = debounce(Meteor.bindEnvironment(function() { // Get the key pair - if (getFederationDiscoveryMethod() === 'hub') { + if (getFederationDiscoveryMethod() === 'hub' && !isRegisteringOrEnabled()) { // Register with hub try { + updateStatus(STATUS_REGISTERING); + registerWithHub(getFederationDomain(), settings.get('Site_Url'), FederationKeys.getPublicKeyString()); + + updateStatus(STATUS_ENABLED); } catch (err) { // Disable federation updateEnabled(false); - updateStatus('Could not register with Hub'); + updateStatus(STATUS_ERROR_REGISTERING); } } else { - updateStatus('Enabled'); + updateStatus(STATUS_ENABLED); } }), 150); @@ -91,7 +96,7 @@ function enableOrDisable(key, value) { enableCallbacks(); } else { - updateStatus('Disabled'); + updateStatus(STATUS_DISABLED); disableCallbacks(); } diff --git a/app/file-upload/server/config/GridFS.js b/app/file-upload/server/config/GridFS.js index 95bfafb5d966..700d207f35b0 100644 --- a/app/file-upload/server/config/GridFS.js +++ b/app/file-upload/server/config/GridFS.js @@ -198,4 +198,8 @@ new FileUploadClass({ return readFromGridFS(file.store, file._id, file, req, res); }, + + copy(file, out) { + copyFromGridFS(file.store, file._id, file, out); + }, }); diff --git a/app/file-upload/server/lib/FileUpload.js b/app/file-upload/server/lib/FileUpload.js index ee59c0b65a79..4654c9f197e8 100644 --- a/app/file-upload/server/lib/FileUpload.js +++ b/app/file-upload/server/lib/FileUpload.js @@ -23,6 +23,7 @@ import { roomTypes } from '../../../utils/server/lib/roomTypes'; import { hasPermission } from '../../../authorization/server/functions/hasPermission'; import { canAccessRoom } from '../../../authorization/server/functions/canAccessRoom'; import { fileUploadIsValidContentType } from '../../../utils/lib/fileUploadRestrictions'; +import { isValidJWT, generateJWT } from '../../../utils/server/lib/JWTHelper'; const cookie = new Cookies(); let maxFileSize = 0; @@ -294,6 +295,7 @@ export const FileUpload = { } let { rc_uid, rc_token, rc_rid, rc_room_type } = query; + const { token } = query; if (!rc_uid && headers.cookie) { rc_uid = cookie.get('rc_uid', headers.cookie); @@ -305,7 +307,8 @@ export const FileUpload = { const isAuthorizedByCookies = rc_uid && rc_token && Users.findOneByIdAndLoginToken(rc_uid, rc_token); const isAuthorizedByHeaders = headers['x-user-id'] && headers['x-auth-token'] && Users.findOneByIdAndLoginToken(headers['x-user-id'], headers['x-auth-token']); const isAuthorizedByRoom = rc_room_type && roomTypes.getConfig(rc_room_type).canAccessUploadedFile({ rc_uid, rc_rid, rc_token }); - return isAuthorizedByCookies || isAuthorizedByHeaders || isAuthorizedByRoom; + const isAuthorizedByJWT = !settings.get('FileUpload_Enable_json_web_token_for_files') || (token && isValidJWT(token, settings.get('FileUpload_json_web_token_secret_for_files'))); + return isAuthorizedByCookies || isAuthorizedByHeaders || isAuthorizedByRoom || isAuthorizedByJWT; }, addExtensionTo(file) { if (mime.lookup(file.name) === file.type) { @@ -389,6 +392,17 @@ export const FileUpload = { request.get(fileUrl, (fileRes) => fileRes.pipe(res)); }, + + generateJWTToFileUrls({ rid, userId, fileId }) { + if (!settings.get('FileUpload_ProtectFiles') || !settings.get('FileUpload_Enable_json_web_token_for_files')) { + return; + } + return generateJWT({ + rid, + userId, + fileId, + }, settings.get('FileUpload_json_web_token_secret_for_files')); + }, }; export class FileUploadClass { diff --git a/app/file-upload/server/startup/settings.js b/app/file-upload/server/startup/settings.js index 0421843ff690..02bea02fce4f 100644 --- a/app/file-upload/server/startup/settings.js +++ b/app/file-upload/server/startup/settings.js @@ -24,6 +24,26 @@ settings.addGroup('FileUpload', function() { i18nDescription: 'FileUpload_ProtectFilesDescription', }); + this.add('FileUpload_Enable_json_web_token_for_files', true, { + type: 'boolean', + i18nLabel: 'FileUpload_Enable_json_web_token_for_files', + i18nDescription: 'FileUpload_Enable_json_web_token_for_files_description', + enableQuery: { + _id: 'FileUpload_ProtectFiles', + value: true, + }, + }); + + this.add('FileUpload_json_web_token_secret_for_files', '', { + type: 'string', + i18nLabel: 'FileUpload_json_web_token_secret_for_files', + i18nDescription: 'FileUpload_json_web_token_secret_for_files_description', + enableQuery: { + _id: 'FileUpload_Enable_json_web_token_for_files', + value: true, + }, + }); + this.add('FileUpload_Storage_Type', 'GridFS', { type: 'select', values: [{ diff --git a/app/integrations/client/views/integrationsOutgoing.html b/app/integrations/client/views/integrationsOutgoing.html index fd35b7a436a7..2d15d8d81b30 100644 --- a/app/integrations/client/views/integrationsOutgoing.html +++ b/app/integrations/client/views/integrationsOutgoing.html @@ -2,9 +2,9 @@
{{#header sectionName=pageTitle buttons=true}}
- - - + + +
{{/header}} diff --git a/app/integrations/server/lib/triggerHandler.js b/app/integrations/server/lib/triggerHandler.js index 2cd815fc626b..866a5a10166b 100644 --- a/app/integrations/server/lib/triggerHandler.js +++ b/app/integrations/server/lib/triggerHandler.js @@ -414,6 +414,7 @@ integrations.triggerHandler = new class RocketChatIntegrationHandler { data.user_id = message.u._id; data.user_name = message.u.username; data.text = message.msg; + data.siteUrl = settings.get('Site_Url'); if (message.alias) { data.alias = message.alias; diff --git a/app/lazy-load/client/lazyloadImage.html b/app/lazy-load/client/lazyloadImage.html index b043723f1334..d39d91f28ca7 100644 --- a/app/lazy-load/client/lazyloadImage.html +++ b/app/lazy-load/client/lazyloadImage.html @@ -1,4 +1,4 @@ diff --git a/app/ldap/server/sync.js b/app/ldap/server/sync.js index 2eb6ebd334aa..e6685297eb70 100644 --- a/app/ldap/server/sync.js +++ b/app/ldap/server/sync.js @@ -46,7 +46,7 @@ export function slug(text) { if (settings.get('UTF8_Names_Slugify') !== true) { return text; } - text = limax(text, { replacement: '.' }); + text = limax(text, { replacement: '.', separateNumbers: false }); return text.replace(/[^0-9a-z-_.]/g, ''); } diff --git a/app/lib/server/functions/getUsernameSuggestion.js b/app/lib/server/functions/getUsernameSuggestion.js index e7be6544a07f..0f9b6a5e4302 100644 --- a/app/lib/server/functions/getUsernameSuggestion.js +++ b/app/lib/server/functions/getUsernameSuggestion.js @@ -4,7 +4,7 @@ import { Users } from '../../../models'; import { settings } from '../../../settings'; function slug(text) { - return limax(text, { replacement: '.' }).replace(/[^0-9a-z-_.]/g, ''); + return limax(text, { replacement: '.', separateNumbers: false }).replace(/[^0-9a-z-_.]/g, ''); } function usernameIsAvaliable(username) { diff --git a/app/lib/server/functions/notifications/email.js b/app/lib/server/functions/notifications/email.js index 80584abc4a61..20459dcd77d3 100644 --- a/app/lib/server/functions/notifications/email.js +++ b/app/lib/server/functions/notifications/email.js @@ -32,6 +32,10 @@ function getEmailContent({ message, user, room }) { }); if (message.msg !== '') { + if (!settings.get('Email_notification_show_message')) { + return header; + } + let messageContent = s.escapeHTML(message.msg); if (message.t === 'e2e') { @@ -45,7 +49,7 @@ function getEmailContent({ message, user, room }) { messageContent = messageContent.replace(token.token, token.text); }); } - return `${ header }

${ messageContent.replace(/\n/gm, '
') }`; + return `${ header }:

${ messageContent.replace(/\n/gm, '
') }`; } if (message.file) { @@ -55,13 +59,21 @@ function getEmailContent({ message, user, room }) { lng, }); + if (!settings.get('Email_notification_show_message')) { + return fileHeader; + } + let content = `${ s.escapeHTML(message.file.name) }`; if (message.attachments && message.attachments.length === 1 && message.attachments[0].description !== '') { content += `

${ s.escapeHTML(message.attachments[0].description) }`; } - return `${ fileHeader }

${ content }`; + return `${ fileHeader }:

${ content }`; + } + + if (!settings.get('Email_notification_show_message')) { + return header; } if (message.attachments.length > 0) { @@ -76,7 +88,7 @@ function getEmailContent({ message, user, room }) { content += `${ s.escapeHTML(attachment.text) }
`; } - return `${ header }

${ content }`; + return `${ header }:

${ content }`; } return header; @@ -138,6 +150,11 @@ export function shouldNotifyEmail({ hasReplyToThread, roomType, }) { + // email notifications are disabled globally + if (!settings.get('Accounts_AllowEmailNotifications')) { + return false; + } + // use connected (don't need to send him an email) if (statusConnection === 'online') { return false; diff --git a/app/lib/server/lib/msgStream.js b/app/lib/server/lib/msgStream.js index 872f94994eb6..94f657a2691f 100644 --- a/app/lib/server/lib/msgStream.js +++ b/app/lib/server/lib/msgStream.js @@ -18,6 +18,25 @@ const send = function(self, msg) { }; class MessageStream extends Meteor.Streamer { + getSubscriptionByUserIdAndRoomId(userId, rid) { + return this.subscriptions.find((sub) => sub.eventName === rid && sub.subscription.userId === userId); + } + + _publish(publication, eventName, options) { + super._publish(publication, eventName, options); + const uid = Meteor.userId(); + + const userEvent = (clientAction, { rid }) => { + switch (clientAction) { + case 'removed': + this.removeListener(uid, userEvent); + this.removeSubscription(this.getSubscriptionByUserIdAndRoomId(uid, rid), eventName); + break; + } + }; + this.on(uid, userEvent); + } + mymessage = (eventName, args) => { const subscriptions = this.subscriptionsByEventName[eventName]; if (!Array.isArray(subscriptions)) { diff --git a/app/lib/server/lib/notifyUsersOnMessage.js b/app/lib/server/lib/notifyUsersOnMessage.js index e5c4dd7dfa5c..f1d041f3e31a 100644 --- a/app/lib/server/lib/notifyUsersOnMessage.js +++ b/app/lib/server/lib/notifyUsersOnMessage.js @@ -84,7 +84,7 @@ export function updateUsersSubscriptions(message, room, users) { Subscriptions.setOpenForRoomIdExcludingUserId(message.rid, message.u._id); } -function notifyUsersOnMessage(message, room) { +export function notifyUsersOnMessage(message, room) { // skips this callback if the message was edited and increments it if the edit was way in the past (aka imported) if (message.editedAt && Math.abs(moment(message.editedAt).diff()) > 60000) { // TODO: Review as I am not sure how else to get around this as the incrementing of the msgs count shouldn't be in this callback diff --git a/app/lib/server/lib/sendNotificationsOnMessage.js b/app/lib/server/lib/sendNotificationsOnMessage.js index db544f058509..c64a3b092185 100644 --- a/app/lib/server/lib/sendNotificationsOnMessage.js +++ b/app/lib/server/lib/sendNotificationsOnMessage.js @@ -286,7 +286,7 @@ export async function sendMessageNotifications(message, room, usersInThread = [] }; } -async function sendAllNotifications(message, room) { +export async function sendAllNotifications(message, room) { // threads if (message.tmid) { return message; diff --git a/app/lib/server/lib/validateEmailDomain.js b/app/lib/server/lib/validateEmailDomain.js index 953847537180..992345adf639 100644 --- a/app/lib/server/lib/validateEmailDomain.js +++ b/app/lib/server/lib/validateEmailDomain.js @@ -1,7 +1,6 @@ import dns from 'dns'; import { Meteor } from 'meteor/meteor'; -import _ from 'underscore'; import { emailDomainDefaultBlackList } from './defaultBlockedDomainsList'; import { settings } from '../../../settings'; @@ -12,10 +11,10 @@ let useDefaultBlackList = false; let useDNSDomainCheck = false; settings.get('Accounts_BlockedDomainsList', function(key, value) { - emailDomainBlackList = _.map(value.split(','), (domain) => domain.trim()); + emailDomainBlackList = value.split(',').filter(Boolean).map((domain) => domain.trim()); }); settings.get('Accounts_AllowedDomainsList', function(key, value) { - emailDomainWhiteList = _.map(value.split(','), (domain) => domain.trim()); + emailDomainWhiteList = value.split(',').filter(Boolean).map((domain) => domain.trim()); }); settings.get('Accounts_UseDefaultBlockedDomainsList', function(key, value) { useDefaultBlackList = value; @@ -32,11 +31,11 @@ export const validateEmailDomain = function(email) { const emailDomain = email.substr(email.lastIndexOf('@') + 1); - // if not in whitelist - if (emailDomainWhiteList.indexOf(emailDomain) === -1) { - if (emailDomainBlackList.indexOf(emailDomain) !== -1 || (useDefaultBlackList && emailDomainDefaultBlackList.indexOf(emailDomain) !== -1)) { - throw new Meteor.Error('error-email-domain-blacklisted', 'The email domain is blacklisted', { function: 'RocketChat.validateEmailDomain' }); - } + if (emailDomainWhiteList.length && !emailDomainWhiteList.includes(emailDomain)) { + throw new Meteor.Error('error-invalid-domain', 'The email domain is not in whitelist', { function: 'RocketChat.validateEmailDomain' }); + } + if (emailDomainBlackList.length && (emailDomainBlackList.indexOf(emailDomain) !== -1 || (useDefaultBlackList && emailDomainDefaultBlackList.indexOf(emailDomain) !== -1))) { + throw new Meteor.Error('error-email-domain-blacklisted', 'The email domain is blacklisted', { function: 'RocketChat.validateEmailDomain' }); } if (useDNSDomainCheck) { diff --git a/app/lib/server/methods/createToken.js b/app/lib/server/methods/createToken.js index de562cb4d227..81b1a303abc7 100644 --- a/app/lib/server/methods/createToken.js +++ b/app/lib/server/methods/createToken.js @@ -5,7 +5,7 @@ import { hasPermission } from '../../../authorization'; Meteor.methods({ createToken(userId) { - if (Meteor.userId() !== userId && !hasPermission(Meteor.userId(), 'user-generate-access-token')) { + if (!['yes', 'true'].includes(process.env.CREATE_TOKENS_FOR_USERS) || (Meteor.userId() !== userId && !hasPermission(Meteor.userId(), 'user-generate-access-token'))) { throw new Meteor.Error('error-not-authorized', 'Not authorized', { method: 'createToken' }); } const token = Accounts._generateStampedLoginToken(); diff --git a/app/lib/server/startup/email.js b/app/lib/server/startup/email.js index 5ea06064f380..3f3985a5d8e7 100644 --- a/app/lib/server/startup/email.js +++ b/app/lib/server/startup/email.js @@ -427,4 +427,11 @@ settings.addGroup('Email', function() { i18nDescription: 'Forgot_Password_Description', }); }); + + this.section('Privacy', function() { + this.add('Email_notification_show_message', true, { + type: 'boolean', + public: true, + }); + }); }); diff --git a/app/lib/server/startup/settings.js b/app/lib/server/startup/settings.js index 803553d84d89..9973f0dc6ec3 100644 --- a/app/lib/server/startup/settings.js +++ b/app/lib/server/startup/settings.js @@ -60,6 +60,10 @@ settings.addGroup('Accounts', function() { type: 'boolean', public: true, }); + this.add('Accounts_AllowEmailNotifications', true, { + type: 'boolean', + public: true, + }); this.add('Accounts_CustomFieldsToShowInUserInfo', '', { type: 'string', public: true, @@ -239,7 +243,7 @@ settings.addGroup('Accounts', function() { ], public: true, }); - this.add('Accounts_Default_User_Preferences_desktopNotifications', 'mentions', { + this.add('Accounts_Default_User_Preferences_desktopNotifications', 'all', { type: 'select', values: [ { @@ -257,7 +261,7 @@ settings.addGroup('Accounts', function() { ], public: true, }); - this.add('Accounts_Default_User_Preferences_mobileNotifications', 'mentions', { + this.add('Accounts_Default_User_Preferences_mobileNotifications', 'all', { type: 'select', values: [ { @@ -816,6 +820,11 @@ settings.addGroup('General', function() { type: 'boolean', public: true, }); + this.add('Support_Cordova_App', false, { + type: 'boolean', + i18nDescription: 'Support_Cordova_App_Description', + alert: 'Support_Cordova_App_Alert', + }); this.add('GoogleTagManager_id', '', { type: 'string', public: true, @@ -1269,7 +1278,7 @@ settings.addGroup('Layout', function() { multiline: true, public: true, }); - return this.add('Layout_Sidenav_Footer', '', { + return this.add('Layout_Sidenav_Footer', 'Home', { type: 'code', code: 'text/html', public: true, diff --git a/app/livechat/client/startup/notifyUnreadRooms.js b/app/livechat/client/startup/notifyUnreadRooms.js index ce0c05d52456..0449754bbd18 100644 --- a/app/livechat/client/startup/notifyUnreadRooms.js +++ b/app/livechat/client/startup/notifyUnreadRooms.js @@ -4,34 +4,20 @@ import { Tracker } from 'meteor/tracker'; import { settings } from '../../../settings'; import { getUserPreference } from '../../../utils'; import { Subscriptions, Users } from '../../../models'; +import { CustomSounds } from '../../../custom-sounds/client'; let audio = null; -const stop = (audio) => { - if (!audio) { - return; - } - audio.loop = false; - return audio.pause && audio.pause(); -}; -const play = (audio) => { - if (!audio) { - return; - } - audio.loop = true; - return audio.play && audio.play(); -}; - -Meteor.startup(function() { - Tracker.autorun(function() { +Meteor.startup(() => { + Tracker.autorun(() => { if (!settings.get('Livechat_continuous_sound_notification_new_livechat_room')) { - stop(audio); + audio && audio.pause(); return; } const subs = Subscriptions.find({ t: 'l', ls: { $exists: 0 }, open: true }).count(); if (subs === 0) { - stop(audio); + audio && audio.pause(); return; } @@ -43,7 +29,6 @@ Meteor.startup(function() { const newRoomNotification = getUserPreference(user, 'newRoomNotification'); - [audio] = $(`#${ newRoomNotification }`); - play(audio); + audio = CustomSounds.play(newRoomNotification, { loop: true }); }); }); diff --git a/app/livechat/client/views/app/livechatAppearance.html b/app/livechat/client/views/app/livechatAppearance.html index fd755f75ee71..10386eab516b 100644 --- a/app/livechat/client/views/app/livechatAppearance.html +++ b/app/livechat/client/views/app/livechatAppearance.html @@ -20,6 +20,15 @@

{{_ "Settings"}}

+ +
+ + + + +
+
+
diff --git a/app/livechat/client/views/app/livechatAppearance.js b/app/livechat/client/views/app/livechatAppearance.js index 8cfdfefd6ca4..1b5477ec1fed 100644 --- a/app/livechat/client/views/app/livechatAppearance.js +++ b/app/livechat/client/views/app/livechatAppearance.js @@ -15,6 +15,9 @@ Template.livechatAppearance.helpers({ color() { return Template.instance().color.get(); }, + showAgentInfo() { + return Template.instance().showAgentInfo.get(); + }, showAgentEmail() { return Template.instance().showAgentEmail.get(); }, @@ -39,6 +42,16 @@ Template.livechatAppearance.helpers({ sampleOfflineSuccessMessage() { return Template.instance().offlineSuccessMessage.get().replace(/([^>\r\n]?)(\r\n|\n\r|\r|\n)/g, '$1
$2'); }, + showAgentInfoFormTrueChecked() { + if (Template.instance().showAgentInfo.get()) { + return 'checked'; + } + }, + showAgentInfoFormFalseChecked() { + if (!Template.instance().showAgentInfo.get()) { + return 'checked'; + } + }, showAgentEmailFormTrueChecked() { if (Template.instance().showAgentEmail.get()) { return 'checked'; @@ -97,6 +110,7 @@ Template.livechatAppearance.onCreated(function() { this.title = new ReactiveVar(null); this.color = new ReactiveVar(null); + this.showAgentInfo = new ReactiveVar(null); this.showAgentEmail = new ReactiveVar(null); this.displayOfflineForm = new ReactiveVar(null); this.offlineUnavailableMessage = new ReactiveVar(null); @@ -119,6 +133,10 @@ Template.livechatAppearance.onCreated(function() { const setting = LivechatAppearance.findOne('Livechat_title_color'); this.color.set(setting && setting.value); }); + this.autorun(() => { + const setting = LivechatAppearance.findOne('Livechat_show_agent_info'); + this.showAgentInfo.set(setting && setting.value); + }); this.autorun(() => { const setting = LivechatAppearance.findOne('Livechat_show_agent_email'); this.showAgentEmail.set(setting && setting.value); @@ -193,6 +211,9 @@ Template.livechatAppearance.events({ const settingTitleColor = LivechatAppearance.findOne('Livechat_title_color'); instance.color.set(settingTitleColor && settingTitleColor.value); + const settingShowAgentInfo = LivechatAppearance.findOne('Livechat_show_agent_info'); + instance.showAgentInfo.set(settingShowAgentInfo && settingShowAgentInfo.value); + const settingShowAgentEmail = LivechatAppearance.findOne('Livechat_show_agent_email'); instance.showAgentEmail.set(settingShowAgentEmail && settingShowAgentEmail.value); @@ -240,6 +261,10 @@ Template.livechatAppearance.events({ _id: 'Livechat_title_color', value: instance.color.get(), }, + { + _id: 'Livechat_show_agent_info', + value: instance.showAgentInfo.get(), + }, { _id: 'Livechat_show_agent_email', value: instance.showAgentEmail.get(), diff --git a/app/livechat/imports/server/rest/departments.js b/app/livechat/imports/server/rest/departments.js index 11b6c4b15e4b..a460f3d58b63 100644 --- a/app/livechat/imports/server/rest/departments.js +++ b/app/livechat/imports/server/rest/departments.js @@ -1,4 +1,4 @@ -import { check } from 'meteor/check'; +import { Match, check } from 'meteor/check'; import { API } from '../../../../api'; import { hasPermission } from '../../../../authorization'; @@ -23,7 +23,7 @@ API.v1.addRoute('livechat/department', { authRequired: true }, { try { check(this.bodyParams, { department: Object, - agents: Array, + agents: Match.Maybe(Array), }); const department = Livechat.saveDepartment(null, this.bodyParams.department, this.bodyParams.agents); @@ -76,26 +76,32 @@ API.v1.addRoute('livechat/department/:_id', { authRequired: true }, { check(this.bodyParams, { department: Object, - agents: Array, + agents: Match.Maybe(Array), + }); + const { _id } = this.urlParams; + const { department, agents } = this.bodyParams; + let success; if (permissionToSave) { - success = Livechat.saveDepartment(this.urlParams._id, this.bodyParams.department, this.bodyParams.agents); - } else if (permissionToAddAgents) { - success = Livechat.saveDepartmentAgents(this.urlParams._id, this.bodyParams.agents); + success = Livechat.saveDepartment(_id, department, agents); + } + + if (success && agents && permissionToAddAgents) { + success = Livechat.saveDepartmentAgents(_id, agents); } if (success) { return API.v1.success({ - department: LivechatDepartment.findOneById(this.urlParams._id), - agents: LivechatDepartmentAgents.find({ departmentId: this.urlParams._id }).fetch(), + department: LivechatDepartment.findOneById(_id), + agents: LivechatDepartmentAgents.find({ departmentId: _id }).fetch(), }); } return API.v1.failure(); } catch (e) { - return API.v1.failure(e.error); + return API.v1.failure(e); } }, delete() { @@ -114,7 +120,7 @@ API.v1.addRoute('livechat/department/:_id', { authRequired: true }, { return API.v1.failure(); } catch (e) { - return API.v1.failure(e.error); + return API.v1.failure(e); } }, }); diff --git a/app/livechat/server/api/lib/livechat.js b/app/livechat/server/api/lib/livechat.js index 22a42b065169..302cd5ceae13 100644 --- a/app/livechat/server/api/lib/livechat.js +++ b/app/livechat/server/api/lib/livechat.js @@ -2,9 +2,10 @@ import { Meteor } from 'meteor/meteor'; import { Random } from 'meteor/random'; import _ from 'underscore'; -import { Users, LivechatRooms, LivechatVisitors, LivechatDepartment, LivechatTrigger } from '../../../../models'; +import { LivechatRooms, LivechatVisitors, LivechatDepartment, LivechatTrigger } from '../../../../models'; import { Livechat } from '../../lib/Livechat'; import { callbacks } from '../../../../callbacks/server'; +import { normalizeAgent } from '../../lib/Helper'; export function online() { return Livechat.online(); @@ -80,7 +81,7 @@ export function getRoom({ guest, rid, roomInfo, agent }) { } export function findAgent(agentId) { - return Users.getAgentInfo(agentId); + return normalizeAgent(agentId); } export function normalizeHttpHeaderData(headers = {}) { @@ -109,6 +110,7 @@ export function settings() { historyMonitorType: initSettings.Livechat_history_monitor_type, forceAcceptDataProcessingConsent: initSettings.Livechat_force_accept_data_processing_consent, showConnecting: initSettings.Livechat_Show_Connecting, + agentHiddenInfo: initSettings.Livechat_show_agent_info === false, }, theme: { title: initSettings.Livechat_title, diff --git a/app/livechat/server/api/v1/config.js b/app/livechat/server/api/v1/config.js index 50381262b21c..4ebdbc345e61 100644 --- a/app/livechat/server/api/v1/config.js +++ b/app/livechat/server/api/v1/config.js @@ -1,8 +1,7 @@ import { Match, check } from 'meteor/check'; -import { Users } from '../../../../models'; import { API } from '../../../../api'; -import { findGuest, settings, online, findOpenRoom, getExtraConfigInfo } from '../lib/livechat'; +import { findGuest, settings, online, findOpenRoom, getExtraConfigInfo, findAgent } from '../lib/livechat'; API.v1.addRoute('livechat/config', { get() { @@ -26,9 +25,8 @@ API.v1.addRoute('livechat/config', { if (guest) { room = findOpenRoom(token); - agent = room && room.servedBy && Users.getAgentInfo(room.servedBy._id); + agent = room && room.servedBy && findAgent(room.servedBy._id); } - const extraConfig = room && Promise.await(getExtraConfigInfo(room)); Object.assign(config, { online: status, guest, room, agent }, extraConfig); diff --git a/app/livechat/server/api/v1/message.js b/app/livechat/server/api/v1/message.js index d4e2ba3b8a03..9fb8ba33e02b 100644 --- a/app/livechat/server/api/v1/message.js +++ b/app/livechat/server/api/v1/message.js @@ -8,6 +8,7 @@ import { API } from '../../../../api'; import { loadMessageHistory } from '../../../../lib'; import { findGuest, findRoom, normalizeHttpHeaderData } from '../lib/livechat'; import { Livechat } from '../../lib/Livechat'; +import { normalizeMessageFileUpload } from '../../../../utils/server/functions/normalizeMessageFileUpload'; API.v1.addRoute('livechat/message', { post() { @@ -90,14 +91,18 @@ API.v1.addRoute('livechat/message/:_id', { throw new Meteor.Error('invalid-room'); } - const message = Messages.findOneById(_id); + let message = Messages.findOneById(_id); if (!message) { throw new Meteor.Error('invalid-message'); } + if (message.file) { + message = normalizeMessageFileUpload(message); + } + return API.v1.success({ message }); } catch (e) { - return API.v1.failure(e.error); + return API.v1.failure(e); } }, @@ -133,13 +138,17 @@ API.v1.addRoute('livechat/message/:_id', { const result = Livechat.updateMessage({ guest, message: { _id: msg._id, msg: this.bodyParams.msg } }); if (result) { - const message = Messages.findOneById(_id); + let message = Messages.findOneById(_id); + if (message.file) { + message = normalizeMessageFileUpload(message); + } + return API.v1.success({ message }); } return API.v1.failure(); } catch (e) { - return API.v1.failure(e.error); + return API.v1.failure(e); } }, delete() { @@ -183,7 +192,7 @@ API.v1.addRoute('livechat/message/:_id', { return API.v1.failure(); } catch (e) { - return API.v1.failure(e.error); + return API.v1.failure(e); } }, }); @@ -227,10 +236,12 @@ API.v1.addRoute('livechat/messages.history/:rid', { limit = parseInt(this.queryParams.limit); } - const messages = loadMessageHistory({ userId: guest._id, rid, end, limit, ls }); - return API.v1.success(messages); + const messages = loadMessageHistory({ userId: guest._id, rid, end, limit, ls }) + .messages + .map(normalizeMessageFileUpload); + return API.v1.success({ messages }); } catch (e) { - return API.v1.failure(e.error); + return API.v1.failure(e); } }, }); diff --git a/app/livechat/server/config.js b/app/livechat/server/config.js index 0dfb843f32f8..46c7f704ff28 100644 --- a/app/livechat/server/config.js +++ b/app/livechat/server/config.js @@ -79,7 +79,15 @@ Meteor.startup(function() { }); settings.add('Livechat_allow_switching_departments', true, { type: 'boolean', group: 'Livechat', public: true, i18nLabel: 'Allow_switching_departments' }); - settings.add('Livechat_show_agent_email', true, { type: 'boolean', group: 'Livechat', public: true, i18nLabel: 'Show_agent_email' }); + settings.add('Livechat_show_agent_info', true, { + type: 'boolean', group: 'Livechat', public: true, i18nLabel: 'Show_agent_info' }); + settings.add('Livechat_show_agent_email', true, { + type: 'boolean', + group: 'Livechat', + public: true, + enableQuery: { _id: 'Livechat_show_agent_info', value: true }, + i18nLabel: 'Show_agent_email', + }); settings.add('Livechat_request_comment_when_closing_conversation', true, { type: 'boolean', diff --git a/app/livechat/server/hooks/externalMessage.js b/app/livechat/server/hooks/externalMessage.js index 2ef76fbb88f1..1e1f4ee242c6 100644 --- a/app/livechat/server/hooks/externalMessage.js +++ b/app/livechat/server/hooks/externalMessage.js @@ -5,6 +5,7 @@ import { settings } from '../../../settings'; import { callbacks } from '../../../callbacks'; import { SystemLogger } from '../../../logger'; import { LivechatExternalMessage } from '../../lib/LivechatExternalMessage'; +import { normalizeMessageFileUpload } from '../../../utils/server/functions/normalizeMessageFileUpload'; let knowledgeEnabled = false; let apiaiKey = ''; @@ -33,6 +34,10 @@ callbacks.add('afterSaveMessage', function(message, room) { return message; } + if (message.file) { + message = normalizeMessageFileUpload(message); + } + // if the message hasn't a token, it was not sent by the visitor, so ignore it if (!message.token) { return message; diff --git a/app/livechat/server/hooks/saveAnalyticsData.js b/app/livechat/server/hooks/saveAnalyticsData.js index cfd5215e8162..4ca8832c153d 100644 --- a/app/livechat/server/hooks/saveAnalyticsData.js +++ b/app/livechat/server/hooks/saveAnalyticsData.js @@ -1,5 +1,6 @@ import { callbacks } from '../../../callbacks'; import { LivechatRooms } from '../../../models'; +import { normalizeMessageFileUpload } from '../../../utils/server/functions/normalizeMessageFileUpload'; callbacks.add('afterSaveMessage', function(message, room) { // skips this callback if the message was edited @@ -12,6 +13,9 @@ callbacks.add('afterSaveMessage', function(message, room) { return message; } + if (message.file) { + message = normalizeMessageFileUpload(message); + } const now = new Date(); let analyticsData; diff --git a/app/livechat/server/hooks/sendToCRM.js b/app/livechat/server/hooks/sendToCRM.js index acbf777826a8..adaa1d039ea2 100644 --- a/app/livechat/server/hooks/sendToCRM.js +++ b/app/livechat/server/hooks/sendToCRM.js @@ -2,6 +2,7 @@ import { settings } from '../../../settings'; import { callbacks } from '../../../callbacks'; import { Messages, LivechatRooms } from '../../../models'; import { Livechat } from '../lib/Livechat'; +import { normalizeMessageFileUpload } from '../../../utils/server/functions/normalizeMessageFileUpload'; const msgNavType = 'livechat_navigation_history'; @@ -55,7 +56,12 @@ function sendToCRM(type, room, includeMessages = true) { msg.navigation = message.navigation; } - postData.messages.push(msg); + if (message.file) { + msg.file = message.file; + msg.attachments = message.attachments; + } + + postData.messages.push(normalizeMessageFileUpload(msg)); }); } diff --git a/app/livechat/server/hooks/sendToFacebook.js b/app/livechat/server/hooks/sendToFacebook.js index 30cafd9859a1..1af4767e3656 100644 --- a/app/livechat/server/hooks/sendToFacebook.js +++ b/app/livechat/server/hooks/sendToFacebook.js @@ -1,6 +1,7 @@ import { callbacks } from '../../../callbacks'; import { settings } from '../../../settings'; import OmniChannel from '../lib/OmniChannel'; +import { normalizeMessageFileUpload } from '../../../utils/server/functions/normalizeMessageFileUpload'; callbacks.add('afterSaveMessage', function(message, room) { // skips this callback if the message was edited @@ -27,6 +28,10 @@ callbacks.add('afterSaveMessage', function(message, room) { return message; } + if (message.file) { + message = normalizeMessageFileUpload(message); + } + OmniChannel.reply({ page: room.facebook.page.id, token: room.v.token, diff --git a/app/livechat/server/lib/Helper.js b/app/livechat/server/lib/Helper.js index 7e47cb621f57..75eef3e4b40e 100644 --- a/app/livechat/server/lib/Helper.js +++ b/app/livechat/server/lib/Helper.js @@ -7,6 +7,7 @@ import { LivechatInquiry } from '../../lib/LivechatInquiry'; import { Livechat } from './Livechat'; import { RoutingManager } from './RoutingManager'; import { callbacks } from '../../../callbacks/server'; +import { settings } from '../../../settings'; export const createLivechatRoom = (rid, name, guest, extraData) => { check(rid, String); @@ -154,8 +155,17 @@ export const removeAgentFromSubscription = (rid, { _id, username }) => { Messages.createUserLeaveWithRoomIdAndUser(rid, { _id, username }); }; +export const normalizeAgent = (agentId) => { + if (!agentId) { + return; + } + + return settings.get('Livechat_show_agent_info') ? Users.getAgentInfo(agentId) : { hiddenInfo: true }; +}; + export const dispatchAgentDelegated = (rid, agentId) => { - const agent = agentId && Users.getAgentInfo(agentId); + const agent = normalizeAgent(agentId); + Livechat.stream.emit(rid, { type: 'agentData', data: agent, diff --git a/app/livechat/server/lib/Livechat.js b/app/livechat/server/lib/Livechat.js index 908b5b25ad26..6a9bca7bd8a3 100644 --- a/app/livechat/server/lib/Livechat.js +++ b/app/livechat/server/lib/Livechat.js @@ -29,10 +29,12 @@ import { LivechatOfficeHour, } from '../../../models'; import { Logger } from '../../../logger'; -import { sendMessage, deleteMessage, updateMessage } from '../../../lib'; import { addUserRoles, removeUserFromRoles } from '../../../authorization'; import * as Mailer from '../../../mailer'; import { LivechatInquiry } from '../../lib/LivechatInquiry'; +import { sendMessage } from '../../../lib/server/functions/sendMessage'; +import { updateMessage } from '../../../lib/server/functions/updateMessage'; +import { deleteMessage } from '../../../lib/server/functions/deleteMessage'; export const Livechat = { Analytics, @@ -367,6 +369,7 @@ export const Livechat = { 'Livechat_registration_form_message', 'Livechat_force_accept_data_processing_consent', 'Livechat_data_processing_consent_text', + 'Livechat_show_agent_info', ]).forEach((setting) => { rcSettings[setting._id] = setting.value; }); @@ -678,12 +681,12 @@ export const Livechat = { check(departmentData, defaultValidations); - check(departmentAgents, [ + check(departmentAgents, Match.Maybe([ Match.ObjectIncluding({ agentId: String, username: String, }), - ]); + ])); if (_id) { const department = LivechatDepartment.findOneById(_id); @@ -836,6 +839,10 @@ export const Livechat = { }, notifyAgentStatusChanged(userId, status) { + if (!settings.get('Livechat_show_agent_info')) { + return; + } + LivechatRooms.findOpenByAgent(userId).forEach((room) => { Livechat.stream.emit(room._id, { type: 'agentStatus', diff --git a/app/livechat/server/methods/saveAppearance.js b/app/livechat/server/methods/saveAppearance.js index 34eecd65e462..07445c9672dc 100644 --- a/app/livechat/server/methods/saveAppearance.js +++ b/app/livechat/server/methods/saveAppearance.js @@ -12,6 +12,7 @@ Meteor.methods({ const validSettings = [ 'Livechat_title', 'Livechat_title_color', + 'Livechat_show_agent_info', 'Livechat_show_agent_email', 'Livechat_display_offline_form', 'Livechat_offline_form_unavailable', diff --git a/app/livechat/server/methods/sendMessageLivechat.js b/app/livechat/server/methods/sendMessageLivechat.js index 47c2dad856cd..b294d00f22c0 100644 --- a/app/livechat/server/methods/sendMessageLivechat.js +++ b/app/livechat/server/methods/sendMessageLivechat.js @@ -5,7 +5,7 @@ import { LivechatVisitors } from '../../../models'; import { Livechat } from '../lib/Livechat'; Meteor.methods({ - sendMessageLivechat({ token, _id, rid, msg, attachments }, agent) { + sendMessageLivechat({ token, _id, rid, msg, file, attachments }, agent) { check(token, String); check(_id, String); check(rid, String); @@ -36,6 +36,7 @@ Meteor.methods({ rid, msg, token, + file, attachments, }, agent, diff --git a/app/livechat/server/publications/livechatAppearance.js b/app/livechat/server/publications/livechatAppearance.js index 285d3cfefd0b..e9bc5ff1ef5a 100644 --- a/app/livechat/server/publications/livechatAppearance.js +++ b/app/livechat/server/publications/livechatAppearance.js @@ -17,6 +17,7 @@ Meteor.publish('livechat:appearance', function() { $in: [ 'Livechat_title', 'Livechat_title_color', + 'Livechat_show_agent_info', 'Livechat_show_agent_email', 'Livechat_display_offline_form', 'Livechat_offline_form_unavailable', diff --git a/app/livechat/server/sendMessageBySMS.js b/app/livechat/server/sendMessageBySMS.js index 1715cd6e1330..cbceda93baff 100644 --- a/app/livechat/server/sendMessageBySMS.js +++ b/app/livechat/server/sendMessageBySMS.js @@ -2,6 +2,7 @@ import { callbacks } from '../../callbacks'; import { settings } from '../../settings'; import { SMS } from '../../sms'; import { LivechatVisitors } from '../../models'; +import { normalizeMessageFileUpload } from '../../utils/server/functions/normalizeMessageFileUpload'; callbacks.add('afterSaveMessage', function(message, room) { // skips this callback if the message was edited @@ -28,6 +29,13 @@ callbacks.add('afterSaveMessage', function(message, room) { return message; } + let extraData; + if (message.file) { + message = normalizeMessageFileUpload(message); + const { fileUpload, rid, u: { _id: userId } = {} } = message; + extraData = Object.assign({}, { rid, userId, fileUpload }); + } + const SMSService = SMS.getService(settings.get('SMS_Service')); if (!SMSService) { @@ -40,7 +48,7 @@ callbacks.add('afterSaveMessage', function(message, room) { return message; } - SMSService.send(room.sms.from, visitor.phone[0].phoneNumber, message.msg); + SMSService.send(room.sms.from, visitor.phone[0].phoneNumber, message.msg, extraData); return message; }, callbacks.priority.LOW, 'sendMessageBySms'); diff --git a/app/meteor-accounts-saml/server/saml_rocketchat.js b/app/meteor-accounts-saml/server/saml_rocketchat.js index 0d401b2c6d30..ba28f02a1139 100644 --- a/app/meteor-accounts-saml/server/saml_rocketchat.js +++ b/app/meteor-accounts-saml/server/saml_rocketchat.js @@ -88,18 +88,6 @@ Meteor.methods({ section: name, i18nLabel: 'Accounts_OAuth_Custom_Button_Color', }); - settings.add(`SAML_Custom_${ name }_email_field`, 'email', { - type: 'string', - group: 'SAML', - section: name, - i18nLabel: 'SAML_Custom_EMail_Field', - }); - settings.add(`SAML_Custom_${ name }_username_field`, 'username', { - type: 'string', - group: 'SAML', - section: name, - i18nLabel: 'SAML_Custom_Username_Field', - }); settings.add(`SAML_Custom_${ name }_generate_username`, false, { type: 'boolean', group: 'SAML', @@ -160,6 +148,40 @@ Meteor.methods({ section: name, i18nLabel: 'SAML_Custom_Authn_Context', }); + settings.add(`SAML_Custom_${ name }_user_data_fieldmap`, '{"username":"username", "email":"email", "cn": "name"}', { + type: 'string', + group: 'SAML', + section: name, + i18nLabel: 'SAML_Custom_user_data_fieldmap', + i18nDescription: 'SAML_Custom_user_data_fieldmap_description', + }); + settings.add(`SAML_Custom_${ name }_authn_context_comparison`, 'exact', { + type: 'select', + values: [ + { key: 'better', i18nLabel: 'Better' }, + { key: 'exact', i18nLabel: 'Exact' }, + { key: 'maximum', i18nLabel: 'Maximum' }, + { key: 'minimum', i18nLabel: 'Minimum' }, + ], + group: 'SAML', + section: name, + i18nLabel: 'SAML_Custom_Authn_Context_Comparison', + }); + + settings.add(`SAML_Custom_${ name }_default_user_role`, 'user', { + type: 'string', + group: 'SAML', + section: name, + i18nLabel: 'SAML_Default_User_Role', + i18nDescription: 'SAML_Default_User_Role_Description', + }); + settings.add(`SAML_Custom_${ name }_role_attribute_name`, '', { + type: 'string', + group: 'SAML', + section: name, + i18nLabel: 'SAML_Role_Attribute_Name', + i18nDescription: 'SAML_Role_Attribute_Name_Description', + }); }, }); @@ -181,9 +203,7 @@ const getSamlConfigs = function(service) { }, entryPoint: settings.get(`${ service.key }_entry_point`), idpSLORedirectURL: settings.get(`${ service.key }_idp_slo_redirect_url`), - usernameField: settings.get(`${ service.key }_username_field`), usernameNormalize: settings.get(`${ service.key }_username_normalize`), - emailField: settings.get(`${ service.key }_email_field`), immutableProperty: settings.get(`${ service.key }_immutable_property`), generateUsername: settings.get(`${ service.key }_generate_username`), debug: settings.get(`${ service.key }_debug`), @@ -192,12 +212,16 @@ const getSamlConfigs = function(service) { issuer: settings.get(`${ service.key }_issuer`), logoutBehaviour: settings.get(`${ service.key }_logout_behaviour`), customAuthnContext: settings.get(`${ service.key }_custom_authn_context`), + authnContextComparison: settings.get(`${ service.key }_authn_context_comparison`), + defaultUserRole: settings.get(`${ service.key }_default_user_role`), + roleAttributeName: settings.get(`${ service.key }_role_attribute_name`), secret: { privateKey: settings.get(`${ service.key }_private_key`), publicCert: settings.get(`${ service.key }_public_cert`), // People often overlook the instruction to remove the header and footer of the certificate on this specific setting, so let's do it for them. cert: normalizeCert(settings.get(`${ service.key }_cert`)), }, + userDataFieldMap: settings.get(`${ service.key }_user_data_fieldmap`), }; }; @@ -227,10 +251,11 @@ const configureSamlService = function(samlConfigs) { Accounts.saml.settings.nameOverwrite = samlConfigs.nameOverwrite; Accounts.saml.settings.mailOverwrite = samlConfigs.mailOverwrite; Accounts.saml.settings.immutableProperty = samlConfigs.immutableProperty; - Accounts.saml.settings.emailField = samlConfigs.emailField; - Accounts.saml.settings.usernameField = samlConfigs.usernameField; + Accounts.saml.settings.userDataFieldMap = samlConfigs.userDataFieldMap; Accounts.saml.settings.usernameNormalize = samlConfigs.usernameNormalize; Accounts.saml.settings.debug = samlConfigs.debug; + Accounts.saml.settings.defaultUserRole = samlConfigs.defaultUserRole; + Accounts.saml.settings.roleAttributeName = samlConfigs.roleAttributeName; return { provider: samlConfigs.clientConfig.provider, @@ -241,6 +266,9 @@ const configureSamlService = function(samlConfigs) { privateCert, privateKey, customAuthnContext: samlConfigs.customAuthnContext, + authnContextComparison: samlConfigs.authnContextComparison, + defaultUserRole: samlConfigs.defaultUserRole, + roleAttributeName: samlConfigs.roleAttributeName, }; }; diff --git a/app/meteor-accounts-saml/server/saml_server.js b/app/meteor-accounts-saml/server/saml_server.js index 1c13ebe75476..b1264df1b61f 100644 --- a/app/meteor-accounts-saml/server/saml_server.js +++ b/app/meteor-accounts-saml/server/saml_server.js @@ -105,15 +105,68 @@ Accounts.normalizeUsername = function(name) { return name; }; +function debugLog(content) { + if (Accounts.saml.settings.debug) { + console.log(content); + } +} + +function getUserDataMapping() { + const { userDataFieldMap } = Accounts.saml.settings; + + let map; + + try { + map = JSON.parse(userDataFieldMap); + } catch (e) { + map = {}; + } + + let emailField = 'email'; + let usernameField = 'username'; + let nameField = 'cn'; + const newMapping = {}; + + for (const field in map) { + if (!map.hasOwnProperty(field)) { + continue; + } + + if (map[field] === 'email') { + emailField = field; + continue; + } + + if (map[field] === 'username') { + usernameField = field; + continue; + } + + if (map[field] === 'name') { + nameField = field; + continue; + } + + newMapping[field] = map[field]; + } + + return { emailField, usernameField, nameField, userDataFieldMap: newMapping }; +} + +const guessNameFromUsername = (username) => + username + .replace(/\W/g, ' ') + .replace(/\s(.)/g, (u) => u.toUpperCase()) + .replace(/^(.)/, (u) => u.toLowerCase()) + .replace(/^\w/, (u) => u.toUpperCase()); + Accounts.registerLoginHandler(function(loginRequest) { if (!loginRequest.saml || !loginRequest.credentialToken) { return undefined; } const loginResult = Accounts.saml.retrieveCredential(loginRequest.credentialToken); - if (Accounts.saml.settings.debug) { - console.log(`RESULT :${ JSON.stringify(loginResult) }`); - } + debugLog(`RESULT :${ JSON.stringify(loginResult) }`); if (loginResult === undefined) { return { @@ -122,14 +175,15 @@ Accounts.registerLoginHandler(function(loginRequest) { }; } - const { emailField, usernameField } = Accounts.saml.settings; + const { emailField, usernameField, nameField, userDataFieldMap } = getUserDataMapping(); + const { defaultUserRole = 'user', roleAttributeName } = Accounts.saml.settings; - if (loginResult && loginResult.profile && loginResult.profile.email) { + if (loginResult && loginResult.profile && loginResult.profile[emailField]) { const emailList = Array.isArray(loginResult.profile[emailField]) ? loginResult.profile[emailField] : [loginResult.profile[emailField]]; const emailRegex = new RegExp(emailList.map((email) => `^${ RegExp.escape(email) }$`).join('|'), 'i'); const eduPersonPrincipalName = loginResult.profile.eppn; - const fullName = loginResult.profile.cn || loginResult.profile.displayName || loginResult.profile.username; + const fullName = loginResult.profile[nameField] || loginResult.profile.displayName || loginResult.profile.username; let eppnMatch = false; let user = null; @@ -170,12 +224,19 @@ Accounts.registerLoginHandler(function(loginRequest) { verified: true, })); + let globalRoles; + if (roleAttributeName && loginResult.profile[roleAttributeName]) { + globalRoles = [].concat(loginResult.profile[roleAttributeName]); + } else { + globalRoles = [].concat(defaultUserRole.split(',')); + } + if (!user) { const newUser = { name: fullName, active: true, eppn: eduPersonPrincipalName, - globalRoles: ['user'], + globalRoles, emails, }; @@ -185,6 +246,7 @@ Accounts.registerLoginHandler(function(loginRequest) { if (username) { newUser.username = username; + newUser.name = newUser.name || guessNameFromUsername(username); } const userId = Accounts.insertUserDoc({}, newUser); @@ -222,6 +284,17 @@ Accounts.registerLoginHandler(function(loginRequest) { 'services.saml': samlLogin, }; + for (const field in userDataFieldMap) { + if (!userDataFieldMap.hasOwnProperty(field)) { + continue; + } + + if (loginResult.profile[field]) { + const rcField = userDataFieldMap[field]; + updateData[`customFields.${ rcField }`] = loginResult.profile[field]; + } + } + if (Accounts.saml.settings.immutableProperty !== 'EMail') { updateData.emails = emails; } diff --git a/app/meteor-accounts-saml/server/saml_utils.js b/app/meteor-accounts-saml/server/saml_utils.js index 37313596a222..7cd4ef696851 100644 --- a/app/meteor-accounts-saml/server/saml_utils.js +++ b/app/meteor-accounts-saml/server/saml_utils.js @@ -96,9 +96,10 @@ SAML.prototype.generateAuthorizeRequest = function(req) { request += `\n`; } + const authnContextComparison = this.options.authnContextComparison || 'exact'; const authnContext = this.options.customAuthnContext || 'urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport'; request - += '' + += `` + `${ authnContext }\n` + ''; @@ -461,6 +462,30 @@ SAML.prototype.mapAttributes = function(attributeStatement, profile) { } }; +SAML.prototype.validateNotBeforeNotOnOrAfterAssertions = function(element) { + const now = new Date(); + + if (element.hasAttribute('NotBefore')) { + const notBefore = element.getAttribute('NotBefore'); + + const date = new Date(notBefore); + if (now < date) { + return false; + } + } + + if (element.hasAttribute('NotOnOrAfter')) { + const notOnOrAfter = element.getAttribute('NotOnOrAfter'); + const date = new Date(notOnOrAfter); + + if (now >= date) { + return false; + } + } + + return true; +}; + SAML.prototype.validateResponse = function(samlResponse, relayState, callback) { const self = this; const xml = new Buffer(samlResponse, 'base64').toString('utf8'); @@ -543,6 +568,19 @@ SAML.prototype.validateResponse = function(samlResponse, relayState, callback) { profile.nameIDFormat = nameID.getAttribute('Format'); } } + + const subjectConfirmation = subject.getElementsByTagNameNS('urn:oasis:names:tc:SAML:2.0:assertion', 'SubjectConfirmation')[0]; + if (subjectConfirmation) { + const subjectConfirmationData = subjectConfirmation.getElementsByTagNameNS('urn:oasis:names:tc:SAML:2.0:assertion', 'SubjectConfirmationData')[0]; + if (subjectConfirmationData && !this.validateNotBeforeNotOnOrAfterAssertions(subjectConfirmationData)) { + return callback(new Error('NotBefore / NotOnOrAfter assertion failed'), null, false); + } + } + } + + const conditions = assertion.getElementsByTagNameNS('urn:oasis:names:tc:SAML:2.0:assertion', 'Conditions')[0]; + if (conditions && !this.validateNotBeforeNotOnOrAfterAssertions(conditions)) { + return callback(new Error('NotBefore / NotOnOrAfter assertion failed'), null, false); } const authnStatement = assertion.getElementsByTagNameNS('urn:oasis:names:tc:SAML:2.0:assertion', 'AuthnStatement')[0]; diff --git a/app/metrics/server/lib/metrics.js b/app/metrics/server/lib/metrics.js index 33bb2f8f12c6..32030be0b1b9 100644 --- a/app/metrics/server/lib/metrics.js +++ b/app/metrics/server/lib/metrics.js @@ -97,9 +97,9 @@ const setPrometheusData = async () => { version: Info.version, }); - const sessions = Object.values(Meteor.server.sessions); + const sessions = Array.from(Meteor.server.sessions.values()); const authenticatedSessions = sessions.filter((s) => s.userId); - metrics.ddpSessions.set(sessions.length, date); + metrics.ddpSessions.set(Meteor.server.sessions.size, date); metrics.ddpAthenticatedSessions.set(authenticatedSessions.length, date); metrics.ddpConnectedUsers.set(_.unique(authenticatedSessions.map((s) => s.userId)).length, date); diff --git a/app/models/server/models/ExportOperations.js b/app/models/server/models/ExportOperations.js index 72c4be71ca1b..bb0f968b17c1 100644 --- a/app/models/server/models/ExportOperations.js +++ b/app/models/server/models/ExportOperations.js @@ -46,6 +46,14 @@ export class ExportOperations extends Base { return this.find(query, options); } + findOnePending(options) { + const query = { + status: { $nin: ['completed'] }, + }; + + return this.findOne(query, options); + } + findAllPendingBeforeMyRequest(requestDay, options) { const query = { status: { $nin: ['completed'] }, @@ -63,6 +71,13 @@ export class ExportOperations extends Base { status: data.status, fileList: data.fileList, generatedFile: data.generatedFile, + fileId: data.fileId, + userNameTable: data.userNameTable, + userData: data.userData, + generatedUserFile: data.generatedUserFile, + generatedAvatar: data.generatedAvatar, + exportPath: data.exportPath, + assetsPath: data.assetsPath, }, }; @@ -78,7 +93,9 @@ export class ExportOperations extends Base { _.extend(exportOperation, data); - return this.insert(exportOperation); + this.insert(exportOperation); + + return exportOperation._id; } diff --git a/app/models/server/models/LivechatDepartment.js b/app/models/server/models/LivechatDepartment.js index db4c57679604..4b36c464cdcd 100644 --- a/app/models/server/models/LivechatDepartment.js +++ b/app/models/server/models/LivechatDepartment.js @@ -29,9 +29,15 @@ export class LivechatDepartment extends Base { } createOrUpdateDepartment(_id, data = {}, agents) { - agents = [].concat(agents); - - const record = Object.assign(data, { numAgents: agents.length }); + // We need to allow updating Departments without having to inform agents, so now we'll only + // update the agent/numAgents fields when the agent parameter is an Array, otherwise we skipp those fields + const hasAgents = agents && Array.isArray(agents); + const numAgents = hasAgents && agents.length; + + const record = { + ...data, + ...hasAgents && { numAgents }, + }; if (_id) { this.update({ _id }, { $set: record }); @@ -39,23 +45,25 @@ export class LivechatDepartment extends Base { _id = this.insert(record); } - const savedAgents = _.pluck(LivechatDepartmentAgents.findByDepartmentId(_id).fetch(), 'agentId'); - const agentsToSave = _.pluck(agents, 'agentId'); + if (hasAgents) { + const savedAgents = _.pluck(LivechatDepartmentAgents.findByDepartmentId(_id).fetch(), 'agentId'); + const agentsToSave = _.pluck(agents, 'agentId'); - // remove other agents - _.difference(savedAgents, agentsToSave).forEach((agentId) => { - LivechatDepartmentAgents.removeByDepartmentIdAndAgentId(_id, agentId); - }); + // remove other agents + _.difference(savedAgents, agentsToSave).forEach((agentId) => { + LivechatDepartmentAgents.removeByDepartmentIdAndAgentId(_id, agentId); + }); - agents.forEach((agent) => { - LivechatDepartmentAgents.saveAgent({ - agentId: agent.agentId, - departmentId: _id, - username: agent.username, - count: agent.count ? parseInt(agent.count) : 0, - order: agent.order ? parseInt(agent.order) : 0, + agents.forEach((agent) => { + LivechatDepartmentAgents.saveAgent({ + agentId: agent.agentId, + departmentId: _id, + username: agent.username, + count: agent.count ? parseInt(agent.count) : 0, + order: agent.order ? parseInt(agent.order) : 0, + }); }); - }); + } return _.extend(record, { _id }); } diff --git a/app/models/server/models/ReadReceipts.js b/app/models/server/models/ReadReceipts.js index 717f4d91afc4..d830f400669f 100644 --- a/app/models/server/models/ReadReceipts.js +++ b/app/models/server/models/ReadReceipts.js @@ -11,6 +11,10 @@ export class ReadReceipts extends Base { }, { unique: 1, }); + + this.tryEnsureIndex({ + messageId: 1, + }); } findByMessageId(messageId) { diff --git a/app/models/server/models/Subscriptions.js b/app/models/server/models/Subscriptions.js index 93813847b88a..e886597f1fdb 100644 --- a/app/models/server/models/Subscriptions.js +++ b/app/models/server/models/Subscriptions.js @@ -11,16 +11,16 @@ export class Subscriptions extends Base { constructor(...args) { super(...args); + this.tryEnsureIndex({ rid: 1 }); + this.tryEnsureIndex({ rid: 1, ls: 1 }); this.tryEnsureIndex({ rid: 1, 'u._id': 1 }, { unique: 1 }); + this.tryEnsureIndex({ rid: 1, 'u._id': 1, open: 1 }); this.tryEnsureIndex({ rid: 1, 'u.username': 1 }); this.tryEnsureIndex({ rid: 1, alert: 1, 'u._id': 1 }); this.tryEnsureIndex({ rid: 1, roles: 1 }); this.tryEnsureIndex({ 'u._id': 1, name: 1, t: 1 }); this.tryEnsureIndex({ open: 1 }); this.tryEnsureIndex({ alert: 1 }); - - this.tryEnsureIndex({ rid: 1, 'u._id': 1, open: 1 }); - this.tryEnsureIndex({ ts: 1 }); this.tryEnsureIndex({ ls: 1 }); this.tryEnsureIndex({ audioNotifications: 1 }, { sparse: 1 }); @@ -807,6 +807,18 @@ export class Subscriptions extends Base { return this.update(query, update, { multi: true }); } + updateFnameByRoomId(rid, fname) { + const query = { rid }; + + const update = { + $set: { + fname, + }, + }; + + return this.update(query, update, { multi: true }); + } + setUserUsernameByUserId(userId, username) { const query = { 'u._id': userId }; diff --git a/app/push-notifications/client/views/pushNotificationsFlexTab.js b/app/push-notifications/client/views/pushNotificationsFlexTab.js index 66c23dac6145..ab03487556b7 100644 --- a/app/push-notifications/client/views/pushNotificationsFlexTab.js +++ b/app/push-notifications/client/views/pushNotificationsFlexTab.js @@ -207,12 +207,9 @@ Template.pushNotificationsFlexTab.events({ if (value && value[0] !== 'none') { const audioVolume = getUserPreference(user, 'notificationsSoundVolume'); - const $audio = $(`audio#${ value[0] }`); - - if ($audio && $audio[0] && $audio[0].play) { - $audio[0].volume = Number((audioVolume / 100).toPrecision(2)); - $audio[0].play(); - } + CustomSounds.play(value[0], { + volume: Number((audioVolume / 100).toPrecision(2)), + }); } }, diff --git a/app/retention-policy/server/cronPruneMessages.js b/app/retention-policy/server/cronPruneMessages.js index cccb3c1f5297..ae96f940b97e 100644 --- a/app/retention-policy/server/cronPruneMessages.js +++ b/app/retention-policy/server/cronPruneMessages.js @@ -9,15 +9,15 @@ let types = []; const oldest = new Date('0001-01-01T00:00:00Z'); -let lastPrune = oldest; const maxTimes = { c: 0, p: 0, d: 0, }; -const toDays = 1000 * 60 * 60 * 24; -const gracePeriod = 5000; + +const toDays = (d) => d * 1000 * 60 * 60 * 24; + function job() { const now = new Date(); const filesOnly = settings.get('RetentionPolicy_FilesOnly'); @@ -27,11 +27,10 @@ function job() { // get all rooms with default values types.forEach((type) => { const maxAge = maxTimes[type] || 0; - const latest = new Date(now.getTime() - maxAge * toDays); + const latest = new Date(now.getTime() - toDays(maxAge)); Rooms.find({ t: type, - _updatedAt: { $gte: latest }, $or: [ { 'retention.enabled': { $eq: true } }, { 'retention.enabled': { $exists: false } }, @@ -46,25 +45,23 @@ function job() { 'retention.enabled': { $eq: true }, 'retention.overrideGlobal': { $eq: true }, 'retention.maxAge': { $gte: 0 }, - _updatedAt: { $gte: lastPrune }, }).forEach((room) => { const { maxAge = 30, filesOnly, excludePinned } = room.retention; - const latest = new Date(now.getTime() - maxAge * toDays); + const latest = new Date(now.getTime() - toDays(maxAge)); cleanRoomHistory({ rid: room._id, latest, oldest, filesOnly, excludePinned, ignoreDiscussion }); }); - lastPrune = new Date(now.getTime() - gracePeriod); } function getSchedule(precision) { switch (precision) { case '0': - return '0 */30 * * * *'; + return '0 */30 * * * *'; // 30 minutes case '1': - return '0 0 * * * *'; + return '0 0 * * * *'; // hour case '2': - return '0 0 */6 * * *'; + return '0 0 */6 * * *'; // 6 hours case '3': - return '0 0 0 * * *'; + return '0 0 0 * * *'; // day } } @@ -84,26 +81,26 @@ function deployCron(precision) { function reloadPolicy() { types = []; - if (settings.get('RetentionPolicy_Enabled')) { - if (settings.get('RetentionPolicy_AppliesToChannels')) { - types.push('c'); - } + if (!settings.get('RetentionPolicy_Enabled')) { + return SyncedCron.remove(pruneCronName); + } + if (settings.get('RetentionPolicy_AppliesToChannels')) { + types.push('c'); + } - if (settings.get('RetentionPolicy_AppliesToGroups')) { - types.push('p'); - } + if (settings.get('RetentionPolicy_AppliesToGroups')) { + types.push('p'); + } - if (settings.get('RetentionPolicy_AppliesToDMs')) { - types.push('d'); - } + if (settings.get('RetentionPolicy_AppliesToDMs')) { + types.push('d'); + } - maxTimes.c = settings.get('RetentionPolicy_MaxAge_Channels'); - maxTimes.p = settings.get('RetentionPolicy_MaxAge_Groups'); - maxTimes.d = settings.get('RetentionPolicy_MaxAge_DMs'); + maxTimes.c = settings.get('RetentionPolicy_MaxAge_Channels'); + maxTimes.p = settings.get('RetentionPolicy_MaxAge_Groups'); + maxTimes.d = settings.get('RetentionPolicy_MaxAge_DMs'); - return deployCron(settings.get('RetentionPolicy_Precision')); - } - return SyncedCron.remove(pruneCronName); + return deployCron(settings.get('RetentionPolicy_Precision')); } Meteor.startup(function() { diff --git a/app/search/client/search/search.html b/app/search/client/search/search.html index 5f2bb57aeb38..dbb6c5a7f179 100644 --- a/app/search/client/search/search.html +++ b/app/search/client/search/search.html @@ -20,7 +20,7 @@
{{> icon block="rc-input__icon-svg" icon=provider.icon}}
- +
diff --git a/app/sms/server/services/twilio.js b/app/sms/server/services/twilio.js index b4221c2b2f45..67920e131450 100644 --- a/app/sms/server/services/twilio.js +++ b/app/sms/server/services/twilio.js @@ -1,12 +1,29 @@ +import { Meteor } from 'meteor/meteor'; import twilio from 'twilio'; +import { Random } from 'meteor/random'; +import { TAPi18n } from 'meteor/rocketchat:tap-i18n'; +import filesize from 'filesize'; import { settings } from '../../../settings'; import { SMS } from '../SMS'; +import { Notifications } from '../../../notifications'; +import { fileUploadIsValidContentType } from '../../../utils/lib/fileUploadRestrictions'; + +const MAX_FILE_SIZE = 5242880; + +const notifyAgent = (userId, rid, msg) => Notifications.notifyUser(userId, 'message', { + _id: Random.id(), + rid, + ts: new Date(), + msg, +}); class Twilio { constructor() { this.accountSid = settings.get('SMS_Twilio_Account_SID'); this.authToken = settings.get('SMS_Twilio_authToken'); + this.fileUploadEnabled = settings.get('SMS_Twilio_FileUpload_Enabled'); + this.mediaTypeWhiteList = settings.get('SMS_Twilio_FileUpload_MediaTypeWhiteList'); } parse(data) { @@ -58,13 +75,40 @@ class Twilio { return returnData; } - send(fromNumber, toNumber, message) { + send(fromNumber, toNumber, message, extraData) { const client = twilio(this.accountSid, this.authToken); + let mediaUrl; + if (extraData && extraData.fileUpload) { + const { rid, userId, fileUpload: { size, type, publicFilePath } } = extraData; + const user = userId ? Meteor.users.findOne(userId) : null; + const lng = (user && user.language) || settings.get('Language') || 'en'; + + let reason; + if (!this.fileUploadEnabled) { + reason = TAPi18n.__('FileUpload_Disabled', { lng }); + } else if (size > MAX_FILE_SIZE) { + reason = TAPi18n.__('File_exceeds_allowed_size_of_bytes', { + size: filesize(MAX_FILE_SIZE), + lng, + }); + } else if (!fileUploadIsValidContentType(type, this.fileUploadMediaTypeWhiteList)) { + reason = TAPi18n.__('File_type_is_not_accepted', { lng }); + } + + if (reason) { + rid && userId && notifyAgent(userId, rid, reason); + return console.error(`(Twilio) -> ${ reason }`); + } + + mediaUrl = [publicFilePath]; + } + // return client.messages.create({ to: toNumber, from: fromNumber, body: message, + ...mediaUrl && { mediaUrl }, }); } diff --git a/app/sms/server/settings.js b/app/sms/server/settings.js index 80b06946ef92..466df5d8c65a 100644 --- a/app/sms/server/settings.js +++ b/app/sms/server/settings.js @@ -47,6 +47,25 @@ Meteor.startup(function() { i18nLabel: 'Auth_Token', secret: true, }); + this.add('SMS_Twilio_FileUpload_Enabled', true, { + type: 'boolean', + enableQuery: { + _id: 'SMS_Service', + value: 'twilio', + }, + i18nLabel: 'FileUpload_Enabled', + secret: true, + }); + this.add('SMS_Twilio_FileUpload_MediaTypeWhiteList', 'image/*,audio/*,video/*,text/*,application/pdf', { + type: 'string', + enableQuery: { + _id: 'SMS_Service', + value: 'twilio', + }, + i18nLabel: 'FileUpload_MediaTypeWhiteList', + i18nDescription: 'FileUpload_MediaTypeWhiteListDescription', + secret: true, + }); }); this.section('Voxtelesys', function() { diff --git a/app/statistics/server/functions/get.js b/app/statistics/server/functions/get.js index 2501754e6804..847995bf2380 100644 --- a/app/statistics/server/functions/get.js +++ b/app/statistics/server/functions/get.js @@ -145,9 +145,9 @@ statistics.get = function _getStatistics() { statistics.apps = { engineVersion: Info.marketplaceApiVersion, - enabled: Apps && Apps.isEnabled(), - totalInstalled: Apps && Apps.getManager().get().length, - totalActive: Apps && Apps.getManager().get({ enabled: true }).length, + enabled: Apps.isEnabled(), + totalInstalled: Apps.isInitialized() && Apps.getManager().get().length, + totalActive: Apps.isInitialized() && Apps.getManager().get({ enabled: true }).length, }; const integrations = Integrations.find().fetch(); diff --git a/app/theme/client/imports/components/header.css b/app/theme/client/imports/components/header.css index 063647aca0bb..3ef3fdc1dc8b 100644 --- a/app/theme/client/imports/components/header.css +++ b/app/theme/client/imports/components/header.css @@ -248,15 +248,7 @@ padding: 0 0.25rem; - color: var(--header-toggle-favorite-star-color); - - &.empty { - color: var(--header-toggle-favorite-color); - - & > .rc-header__icon { - fill: none; - } - } + color: var(--header-toggle-favorite-color); & > .rc-header__icon { font-size: 2rem; @@ -265,6 +257,10 @@ &:hover { color: var(--header-toggle-favorite-star-color); } + + &--checked { + color: var(--header-toggle-favorite-star-color); + } } &__toggle-encryption { diff --git a/app/theme/client/imports/components/message-box.css b/app/theme/client/imports/components/message-box.css index f8840d6e17cf..91ebb8c17cb2 100644 --- a/app/theme/client/imports/components/message-box.css +++ b/app/theme/client/imports/components/message-box.css @@ -94,7 +94,6 @@ border-color: var(--message-box-container-border-color); border-radius: var(--message-box-container-border-radius); - line-height: 20px; align-items: center; &.editing { @@ -106,9 +105,9 @@ overflow-y: auto; width: 100%; - height: 15px; + height: 23px; - min-height: 21px; + min-height: 23px; max-height: 155px; padding: 0; @@ -120,6 +119,8 @@ font-family: inherit; font-size: var(--message-box-text-size); + line-height: 21px; + &::placeholder { color: var(--message-box-placeholder-color); } diff --git a/app/theme/client/imports/components/tooltip.css b/app/theme/client/imports/components/tooltip.css index 4d60d4ca826a..5c08d8be2516 100644 --- a/app/theme/client/imports/components/tooltip.css +++ b/app/theme/client/imports/components/tooltip.css @@ -21,7 +21,6 @@ bottom: 100%; - min-height: 100%; margin: 11px 0; padding: 0.5em 1em; diff --git a/app/theme/client/imports/general/base_old.css b/app/theme/client/imports/general/base_old.css index 69bfd73e2c38..f576907d6e07 100644 --- a/app/theme/client/imports/general/base_old.css +++ b/app/theme/client/imports/general/base_old.css @@ -151,13 +151,6 @@ justify-content: center; } -.rc-old .text-left { - display: flex; - - text-align: left; - justify-content: start; -} - .connection-status > .alert { position: absolute; z-index: 1000000; @@ -3948,197 +3941,6 @@ rc-old select, margin-top: 1em; } -.rc-old .rocket-modal { - position: fixed; - z-index: 1000; - top: 0; - left: 0; - - visibility: hidden; - - width: 100%; - height: 100%; - - &.fluid .modal { - height: 100%; - - & main { - position: absolute; - - overflow-y: scroll; - - height: calc(100% - 112px); - } - } - - &.opened { - animation: fadeIn 0.1s ease-out forwards; - - & .modal { - animation: modalEnter 0.35s cubic-bezier(0.5, 0, 0.1, 1) forwards 0.1s; - } - } - - &.closed { - animation: fadeOut 0.2s ease-out forwards; - - & .modal { - animation: modalExit 0.25s cubic-bezier(0.5, 0, 0.1, 1) forwards; - } - } - - &.overflow .modal { - overflow: visible; - - & main { - position: relative; - - overflow: visible; - } - } - - & .wrapper { - position: relative; - - display: table; - - width: 100%; - height: 100%; - } - - & .window { - position: relative; - - display: table-cell; - - width: 100%; - height: 100%; - - text-align: center; - vertical-align: middle; - } - - & fieldset { - margin-bottom: 8px; - } - - & legend { - position: relative; - z-index: 2; - - display: block; - - margin-bottom: 18px; - - text-transform: uppercase; - - font-size: 13px; - - & i { - margin-right: 4px; - } - - &::before { - position: absolute; - z-index: 1; - top: 19px; - left: 0; - - width: 100%; - height: 1px; - - content: " "; - } - } - - & .modal { - position: relative; - - display: block; - overflow: hidden; - - width: 90%; - max-width: 800px; - margin: 0 auto; - padding: 56px 0; - - text-align: left; - - opacity: 0; - border-radius: var(--border-radius); - box-shadow: 4px 4px 0 rgba(0, 0, 0, 0.15); - - & header { - position: absolute; - z-index: 1; - top: 0; - - width: 100%; - height: 55px; - padding: 0 25px; - - text-align-last: right; - - box-shadow: 0 1px 0 rgba(0, 0, 0, 0.2); - - font-size: 14px; - - & h3 { - display: inline-block; - overflow: hidden; - - margin: 0; - - text-align: left; - text-overflow: ellipsis; - - font-size: 18px; - font-weight: 600; - line-height: 55px; - } - - & .close { - position: absolute; - top: 16px; - right: 20px; - - width: 20px; - height: 26px; - - opacity: 1; - - & i { - font-size: 24px; - } - } - } - - & main { - display: block; - overflow-x: hidden; - overflow-y: auto; - - width: 100%; - height: 100%; - padding: 20px 25px; - } - - & footer { - position: absolute; - z-index: 1; - bottom: 0; - - width: 100%; - height: 55px; - padding: 11px 25px 0; - - text-align: right; - - box-shadow: 0 -1px 0 rgba(0, 0, 0, 0.15); - } - } -} - .rc-old .avatarPrompt { & header p { font-size: 14px; diff --git a/app/theme/server/server.js b/app/theme/server/server.js index 45daeac67964..3430baed66fa 100644 --- a/app/theme/server/server.js +++ b/app/theme/server/server.js @@ -2,7 +2,7 @@ import crypto from 'crypto'; import _ from 'underscore'; import less from 'less'; -import Autoprefixer from 'less-plugin-autoprefix'; +import Autoprefixer from 'less-plugin-autoprefixer'; import { WebApp } from 'meteor/webapp'; import { Meteor } from 'meteor/meteor'; diff --git a/app/threads/client/flextab/thread.html b/app/threads/client/flextab/thread.html index ef7c89b5c701..7bac3b0ba407 100644 --- a/app/threads/client/flextab/thread.html +++ b/app/threads/client/flextab/thread.html @@ -7,7 +7,7 @@

{{!-- {{room.fname}} --}}

- diff --git a/app/ui-account/client/accountPreferences.html b/app/ui-account/client/accountPreferences.html index 76e95a26c038..f59541b8cda0 100644 --- a/app/ui-account/client/accountPreferences.html +++ b/app/ui-account/client/accountPreferences.html @@ -129,15 +129,21 @@

{{_ "Notifications"}}

-
- - {{> icon block="rc-select__arrow" icon="arrow-down" }} -
-
{{_ "You_need_to_verifiy_your_email_address_to_get_notications"}}
+ {{#with canChange=emailNotificationsAllowed}} +
+ + {{> icon block="rc-select__arrow" icon="arrow-down" }} +
+ {{#if canChange}} +
{{_ "You_need_to_verifiy_your_email_address_to_get_notications"}}
+ {{else}} +
{{_ "Email_Notifications_Change_Disabled"}}
+ {{/if}} + {{/with}}
diff --git a/app/ui-account/client/accountPreferences.js b/app/ui-account/client/accountPreferences.js index 0a877b25f6c5..4ee73fa8bc8e 100644 --- a/app/ui-account/client/accountPreferences.js +++ b/app/ui-account/client/accountPreferences.js @@ -64,6 +64,9 @@ Template.accountPreferences.helpers({ const languageKey = Meteor.user().language; return typeof languageKey === 'string' && languageKey.toLowerCase() === key; }, + ifThenElse(condition, val, not = '') { + return condition ? val : not; + }, checked(property, value, defaultValue = undefined) { return checkedSelected(property, value, defaultValue); }, @@ -111,6 +114,9 @@ Template.accountPreferences.helpers({ notificationsSoundVolume() { return getUserPreference(Meteor.userId(), 'notificationsSoundVolume'); }, + emailNotificationsAllowed() { + return settings.get('Accounts_AllowEmailNotifications'); + }, dontAskAgainList() { return getUserPreference(Meteor.userId(), 'dontAskAgainList'); }, @@ -328,8 +334,7 @@ Template.accountPreferences.events({ return; } if (audio) { - const $audio = $(`audio#${ audio }`); - return $audio && $audio[0] && $audio[0].play(); + CustomSounds.play(audio); } }, 'click .js-dont-ask-remove'(e) { diff --git a/app/ui-account/client/avatar/avatar.html b/app/ui-account/client/avatar/avatar.html index 65d3b4ff4a59..ee0d3e0bee15 100644 --- a/app/ui-account/client/avatar/avatar.html +++ b/app/ui-account/client/avatar/avatar.html @@ -1,9 +1,9 @@ diff --git a/app/ui-account/client/avatar/avatar.js b/app/ui-account/client/avatar/avatar.js index c4b0a902829a..b60aab88fe33 100644 --- a/app/ui-account/client/avatar/avatar.js +++ b/app/ui-account/client/avatar/avatar.js @@ -4,6 +4,17 @@ import { Template } from 'meteor/templating'; import { getUserAvatarURL } from '../../../utils/lib/getUserAvatarURL'; +const getUsername = ({ userId, username }) => { + if (username) { + return username; + } + + if (userId) { + const user = Meteor.users.findOne(this.userId, { fields: { username: 1 } }); + return user && user.username; + } +}; + Template.avatar.helpers({ src() { const { url } = Template.instance().data; @@ -11,11 +22,7 @@ Template.avatar.helpers({ return url; } - let { username } = this; - if (username == null && this.userId != null) { - const user = Meteor.users.findOne(this.userId); - username = user && user.username; - } + let username = getUsername(this); if (!username) { return; } @@ -28,4 +35,8 @@ Template.avatar.helpers({ return getUserAvatarURL(username); }, + + alt() { + return getUsername(this); + }, }); diff --git a/app/ui-admin/client/admin.html b/app/ui-admin/client/admin.html index 79c2cdba3067..34a383bd52a4 100644 --- a/app/ui-admin/client/admin.html +++ b/app/ui-admin/client/admin.html @@ -6,7 +6,7 @@ {{#if hasChanges}} {{/if}} - + {{#if $eq _id 'OAuth'}} @@ -135,8 +135,8 @@
{{label}}
- {{> CodeMirror name=_id options=getEditorOptions code=value }} - {{setEditorOnBlur _id}} + {{> CodeMirror name=_id options=getEditorOptions code=value editorOnBlur=setEditorOnBlur}} +
diff --git a/app/ui-admin/client/admin.js b/app/ui-admin/client/admin.js index 4a8b06f6a01c..f1d7a0157e98 100644 --- a/app/ui-admin/client/admin.js +++ b/app/ui-admin/client/admin.js @@ -292,8 +292,8 @@ Template.admin.helpers({ readOnly, }; }, - setEditorOnBlur(_id) { - Meteor.defer(function() { + setEditorOnBlur() { + return function(_id) { if (!$(`.code-mirror-box[data-editor-id="${ _id }"] .CodeMirror`)[0]) { return; } @@ -308,7 +308,7 @@ Template.admin.helpers({ const onChangeDelayed = _.debounce(onChange, 500); codeMirror.on('change', onChangeDelayed); codeMirror.changeAdded = true; - }); + }; }, assetAccept(fileConstraints) { if (fileConstraints.extensions && fileConstraints.extensions.length) { diff --git a/app/ui-admin/client/adminFlex.html b/app/ui-admin/client/adminFlex.html index 0c8fb7f94a08..1aeff9c4a9fc 100644 --- a/app/ui-admin/client/adminFlex.html +++ b/app/ui-admin/client/adminFlex.html @@ -8,7 +8,7 @@

{{_ "Administration"}}

    - {{> sidebarItem menuItem "Info" "info-circled" "admin-info" "" }} + {{> sidebarItem menuItem "Info" "info-circled" "admin" "info" }} {{#if hasPermission 'run-import'}} {{> sidebarItem menuItem "Import" "import" "admin-import" "" }} diff --git a/app/ui-admin/client/adminInfo.html b/app/ui-admin/client/adminInfo.html deleted file mode 100644 index faf17567adec..000000000000 --- a/app/ui-admin/client/adminInfo.html +++ /dev/null @@ -1,344 +0,0 @@ - diff --git a/app/ui-admin/client/adminInfo.js b/app/ui-admin/client/adminInfo.js deleted file mode 100644 index d534cf44be65..000000000000 --- a/app/ui-admin/client/adminInfo.js +++ /dev/null @@ -1,109 +0,0 @@ -import { Meteor } from 'meteor/meteor'; -import { ReactiveVar } from 'meteor/reactive-var'; -import { Tracker } from 'meteor/tracker'; -import { Template } from 'meteor/templating'; -import { TAPi18n } from 'meteor/rocketchat:tap-i18n'; -import s from 'underscore.string'; -import moment from 'moment'; - -import { handleError, Info } from '../../utils'; -import { hasAllPermission } from '../../authorization'; -import { SideNav } from '../../ui-utils'; - -Template.adminInfo.helpers({ - isReady() { - return Template.instance().ready.get(); - }, - statistics() { - return Template.instance().statistics.get(); - }, - instances() { - return Template.instance().instances.get(); - }, - inGB(size) { - if (size > 1073741824) { - return `${ s.numberFormat(size / 1024 / 1024 / 1024, 2) } GB`; - } - return `${ s.numberFormat(size / 1024 / 1024, 2) } MB`; - }, - humanReadableTime(time) { - const days = Math.floor(time / 86400); - const hours = Math.floor((time % 86400) / 3600); - const minutes = Math.floor(((time % 86400) % 3600) / 60); - const seconds = Math.floor(((time % 86400) % 3600) % 60); - let out = ''; - if (days > 0) { - out += `${ days } ${ TAPi18n.__('days') }, `; - } - if (hours > 0) { - out += `${ hours } ${ TAPi18n.__('hours') }, `; - } - if (minutes > 0) { - out += `${ minutes } ${ TAPi18n.__('minutes') }, `; - } - if (seconds > 0) { - out += `${ seconds } ${ TAPi18n.__('seconds') }`; - } - return out; - }, - formatDate(date) { - if (date) { - return moment(date).format('LLL'); - } - }, - numFormat(number) { - return s.numberFormat(number, 2); - }, - info() { - return Info; - }, - build() { - return Info && (Info.compile || Info.build); - }, -}); - -Template.adminInfo.events({ - 'click .refresh'(e, instance) { - instance.ready.set(false); - return Meteor.call('getStatistics', true, function(error, statistics) { - instance.ready.set(true); - if (error) { - return handleError(error); - } - return instance.statistics.set(statistics); - }); - }, -}); - -Template.adminInfo.onRendered(function() { - return Tracker.afterFlush(function() { - SideNav.setFlex('adminFlex'); - return SideNav.openFlex(); - }); -}); - -Template.adminInfo.onCreated(function() { - const instance = this; - this.statistics = new ReactiveVar({}); - this.instances = new ReactiveVar({}); - this.ready = new ReactiveVar(false); - if (hasAllPermission('view-statistics')) { - Meteor.call('getStatistics', function(error, statistics) { - instance.ready.set(true); - if (error) { - handleError(error); - } else { - instance.statistics.set(statistics); - } - }); - - Meteor.call('instances/get', function(error, instances) { - instance.ready.set(true); - if (error) { - handleError(error); - } else { - instance.instances.set(instances); - } - }); - } -}); diff --git a/app/ui-admin/client/index.js b/app/ui-admin/client/index.js index 44bd880d90e3..2a0a65da65cb 100644 --- a/app/ui-admin/client/index.js +++ b/app/ui-admin/client/index.js @@ -1,6 +1,5 @@ import './admin.html'; import './adminFlex.html'; -import './adminInfo.html'; import './rooms/adminRooms.html'; import './rooms/adminRoomInfo.html'; import './rooms/adminRoomInfo'; @@ -13,7 +12,6 @@ import './users/adminUserInfo.html'; import './users/adminUsers.html'; import './admin'; import './adminFlex'; -import './adminInfo'; import './rooms/adminRooms'; import './users/adminInviteUser'; import './users/adminUserChannels'; diff --git a/app/ui-admin/client/users/adminUsers.html b/app/ui-admin/client/users/adminUsers.html index 4af3cb4fbcde..becdb5d67e31 100644 --- a/app/ui-admin/client/users/adminUsers.html +++ b/app/ui-admin/client/users/adminUsers.html @@ -77,7 +77,7 @@
-
{{#if not active}}{{_"deactivated"}}{{else}}{{status}}{{/if}}
+
{{#if $not active}}{{_"deactivated"}}{{else}}{{status}}{{/if}}
{{else}} {{# with searchText}} diff --git a/app/ui-flextab/client/flexTabBar.html b/app/ui-flextab/client/flexTabBar.html index 67cbf8f179c5..14a35ae8ecfd 100644 --- a/app/ui-flextab/client/flexTabBar.html +++ b/app/ui-flextab/client/flexTabBar.html @@ -10,7 +10,7 @@

{{_ label}}

{{/with}} - diff --git a/app/ui-flextab/client/tabs/membersList.html b/app/ui-flextab/client/tabs/membersList.html index 02aca3489033..dc89535cc62a 100644 --- a/app/ui-flextab/client/tabs/membersList.html +++ b/app/ui-flextab/client/tabs/membersList.html @@ -9,11 +9,11 @@
{{> icon block="rc-input__icon-svg" icon="magnifier"}}
- +