diff --git a/.circleci/config.yml b/.circleci/config.yml index 64cc50b9c730..8d6ca5b206c7 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -15,10 +15,10 @@ test-install-dependencies: &test-install-dependencies sudo apt-get install -y mongodb-org-shell google-chrome-stable test-run: &test-run - name: Run Tests - command: | - if [[ $DISABLE_SMARTI ]]; then rm -rf ./tests/end-to-end/ui_smarti; fi; - npm test # npm test holds an option to re-execute each test for ${ RETRY_TEST }-times - so we don't need the standard mechanism here + name: Run Tests + command: | + if [[ $DISABLE_SMARTI ]]; then rm -rf ./tests/end-to-end/ui_smarti; fi; + npm test # npm test holds an option to re-execute each test for ${ RETRY_TEST }-times - so we don't need the standard mechanism here test-npm-install: &test-npm-install name: NPM install @@ -52,7 +52,6 @@ test-with-oplog: &test-with-oplog TEST_MODE: "true" MONGO_URL: mongodb://localhost:27017/rocketchat MONGO_OPLOG_URL: mongodb://localhost:27017/local - RETRY_TESTS: 5 steps: - attach_workspace: *attach_workspace @@ -67,7 +66,7 @@ test-with-oplog: &test-with-oplog version: 2 jobs: - build: + build: &build <<: *defaults docker: - image: circleci/node:8.15-stretch @@ -182,16 +181,6 @@ jobs: paths: - ./.meteor/local - - save_cache: - key: livechat-node-modules-cache-{{ checksum ".circleci/config.yml" }}-{{ checksum "packages/rocketchat-livechat/.app/package.json" }} - paths: - - ./packages/rocketchat-livechat/app/node_modules - - - save_cache: - key: livechat-meteor-cache-{{ checksum ".circleci/config.yml" }}-{{ checksum "packages/rocketchat-livechat/.app/.meteor/versions" }} - paths: - - ./packages/rocketchat-livechat/app/.meteor/local - - save_cache: key: meteor-{{ checksum ".circleci/config.yml" }}-{{ checksum ".meteor/release" }} paths: @@ -207,13 +196,6 @@ jobs: path: /tmp/build - test-with-oplog-mongo-3-2: - <<: *test-with-oplog - docker: - - image: *test-docker-image - - image: mongo:3.2 - command: [mongod, --noprealloc, --smallfiles, --replSet=rs0] - test-with-oplog-mongo-3-4: <<: *test-with-oplog docker: @@ -261,9 +243,9 @@ jobs: - run: name: Publish assets command: | - bash .scripts/deploy-assistify-chat.sh + bash .scripts/publish-build.sh - image-build-prod: + image-build: &image-build <<: *defaults docker: @@ -278,214 +260,55 @@ jobs: - setup_remote_docker - run: - name: Build latest Docker image + name: Build Docker image command: | cd /tmp/build tar xzf Rocket.Chat.tar.gz rm Rocket.Chat.tar.gz - if [[ $CIRCLE_BRANCH == 'master' ]]; then - docker login -u $DOCKER_USER -p $DOCKER_PASS + export CIRCLE_TAG=${CIRCLE_TAG:=} - echo "Build official Docker image" - cp ~/repo/.docker/Dockerfile . - cp ~/repo/.docker/startup.sh . - docker build -t assistify/chat:latest . - docker push assistify/chat:latest + cp ~/repo/.docker/Dockerfile.local ./Dockerfile + docker login -u $DOCKER_USER -p $DOCKER_PASS - # echo "Build preview Docker image" - # cp ~/repo/.docker-mongo/Dockerfile . - # cp ~/repo/.docker-mongo/entrypoint.sh . - # docker build -t assistify/chat.preview:develop . - # docker push assistify/chat.preview:develop + if [[ $CIRCLE_TAG ]]; then + echo "Build tagged Docker image" + docker build -t assistify/chat:$CIRCLE_TAG . + docker push assistify/chat:$CIRCLE_TAG exit 0 fi; - image-build: - <<: *defaults - - docker: - - image: docker:17.05.0-ce-git - - steps: - - attach_workspace: - at: /tmp - - - checkout - - - setup_remote_docker - - - run: - name: Build Docker image - command: | - cd /tmp/build - tar xzf Rocket.Chat.tar.gz - rm Rocket.Chat.tar.gz - - export CIRCLE_TAG=${CIRCLE_TAG:=} - if [[ $CIRCLE_TAG ]]; then - docker login -u $DOCKER_USER -p $DOCKER_PASS - - echo "Build official Docker image" - cp ~/repo/.docker/Dockerfile . - cp ~/repo/.docker/startup.sh . - docker build -t assistify/chat:$CIRCLE_TAG . - docker push assistify/chat:$CIRCLE_TAG - - # # echo "Build preview Docker image" - # # cp ~/repo/.docker-mongo/Dockerfile . - # # cp ~/repo/.docker-mongo/entrypoint.sh . - # # docker build -t assistify/chat.preview:$CIRCLE_TAG . - # # docker push assistify/chat.preview:$CIRCLE_TAG - - # if echo "$CIRCLE_TAG" | grep -Eq '^v[0-9]+\.[0-9]+\.[0-9]-[0-9]+\.[0-9]+\.[0-9]+$' ; then - # docker tag assistify/chat:$CIRCLE_TAG assistify/chat:latest - # docker push assistify/chat:latest - - # docker tag assistify/chat.preview:$CIRCLE_TAG assistify/chat.preview:latest - # docker push assistify/chat.preview:latest - # elif echo "$CIRCLE_TAG" | grep -Eq '^v[0-9]+\.[0-9]+\.[0-9]-[0-9]+\.[0-9]+\.[0-9]+-rc\.[0-9]+$' ; then - # docker tag assistify/chat:$CIRCLE_TAG assistify/chat:release-candidate - # docker push assistify/chat:release-candidate - - # docker tag assistify/chat.preview:$CIRCLE_TAG assistify/chat.preview:release-candidate - # docker push assistify/chat.preview:release-candidate - # fi - - exit 0 - fi; - if [[ $CIRCLE_BRANCH == 'develop' ]]; then - docker login -u $DOCKER_USER -p $DOCKER_PASS - echo "Build official Docker image" - cp ~/repo/.docker/Dockerfile . - cp ~/repo/.docker/startup.sh . + echo "Build nightly Docker image" docker build -t assistify/chat:develop . docker push assistify/chat:develop - # echo "Build preview Docker image" - # cp ~/repo/.docker-mongo/Dockerfile . - # cp ~/repo/.docker-mongo/entrypoint.sh . - # docker build -t assistify/chat.preview:develop . - # docker push assistify/chat.preview:develop - exit 0 fi; - pr-build: - <<: *defaults - docker: - - image: circleci/node:8.15-stretch - - steps: - - checkout - - - restore_cache: - keys: - - node-modules-cache-{{ checksum ".circleci/config.yml" }}-{{ checksum "package.json" }} - - - restore_cache: - keys: - - meteor-{{ checksum ".circleci/config.yml" }}-{{ checksum ".meteor/release" }} - - - run: - name: Install Meteor - command: | - # Restore bin from cache - set +e - METEOR_SYMLINK_TARGET=$(readlink ~/.meteor/meteor) - METEOR_TOOL_DIRECTORY=$(dirname "$METEOR_SYMLINK_TARGET") - set -e - LAUNCHER=$HOME/.meteor/$METEOR_TOOL_DIRECTORY/scripts/admin/launch-meteor - if [ -e $LAUNCHER ] - then - echo "Cached Meteor bin found, restoring it" - sudo cp "$LAUNCHER" "/usr/local/bin/meteor" - else - echo "No cached Meteor bin found." - fi - - # only install meteor if bin isn't found - command -v meteor >/dev/null 2>&1 || curl https://install.meteor.com | sed s/--progress-bar/-sL/g | /bin/sh - - - run: - name: Versions - command: | - npm --versions - node -v - meteor --version - meteor npm --versions - meteor node -v - git version - - - run: - name: Meteor npm install - command: | - # rm -rf node_modules - # rm -f package-lock.json - meteor npm install - - - restore_cache: - keys: - - meteor-cache-{{ checksum ".circleci/config.yml" }}-{{ checksum ".meteor/versions" } - - - run: - name: Build Rocket.Chat - environment: - TOOL_NODE_FLAGS: --max_old_space_size=3072 - command: | - meteor build --server-only /tmp/build-pr - - - - persist_to_workspace: - root: /tmp/ - paths: - - build-pr - - - store_artifacts: - path: /tmp/build-pr - - pr-image-build: - <<: *defaults - - docker: - - image: docker:17.05.0-ce-git - - steps: - - attach_workspace: - at: /tmp - - - checkout + if [[ $CIRCLE_BRANCH == 'master' ]]; then - - setup_remote_docker + echo "Build latest Docker image" + docker build -t assistify/chat:latest . + docker push assistify/chat:latest - - run: - name: Build Docker image for PRs - command: | - export CIRCLE_PR_NUMBER="${CIRCLE_PR_NUMBER:-${CIRCLE_PULL_REQUEST##*/}}" - if [[ -z $CIRCLE_PR_NUMBER ]]; then exit 0 fi; - cd /tmp/build - tar xzf Rocket.Chat.tar.gz - rm Rocket.Chat.tar.gz - - docker login -u $DOCKER_USER -p $DOCKER_PASS + export CIRCLE_PR_NUMBER="${CIRCLE_PR_NUMBER:-${CIRCLE_PULL_REQUEST##*/}}" + if [[ $CIRCLE_PR_NUMBER ]]; then + docker build -t assistify/chat:pr-${CIRCLE_PR_NUMBER} . + docker push assistify/chat:pr-${CIRCLE_PR_NUMBER} - echo "Building custom Docker image" - cp ~/repo/.docker/Dockerfile . - cp ~/repo/.docker/startup.sh . - docker build -t assistify/chat:pr-$CIRCLE_PR_NUMBER . - docker push assistify/chat:pr-$CIRCLE_PR_NUMBER + exit 0 + fi; + pr-build: + <<: *build - # echo "Build preview Docker image" - # cp ~/repo/.docker-mongo/Dockerfile . - # cp ~/repo/.docker-mongo/entrypoint.sh . - # docker build -t assistify/chat.preview:pr-$CIRCLE_PR_NUMBER . - # docker push assistify/chat.preview:pr-$CIRCLE_PR_NUMBER + pr-image-build: + <<: *image-build workflows: version: 2 @@ -495,13 +318,13 @@ workflows: filters: tags: only: /^v[0-9]+\.[0-9]+\.[0-9]-[0-9]+\.[0-9]+\.[0-9]+$/ - - test-with-oplog-mongo-3-2: &test-mongo + - test-with-oplog-mongo-3-4: &test-mongo requires: - build filters: tags: only: /^v[0-9]+\.[0-9]+\.[0-9]-[0-9]+\.[0-9]+\.[0-9]+$/ - - test-with-oplog-mongo-3-4: &test-mongo-no-pr + - test-with-oplog-mongo-3-6: &test-mongo-no-pr requires: - build filters: @@ -509,37 +332,23 @@ workflows: only: develop tags: only: /^v[0-9]+\.[0-9]+\.[0-9]-[0-9]+\.[0-9]+\.[0-9]+$/ - - test-with-oplog-mongo-3-6: *test-mongo-no-pr - test-with-oplog-mongo-4-0: *test-mongo - deploy: requires: - - image-build - - image-build-prod - - test-with-oplog-mongo-3-2 - test-with-oplog-mongo-3-4 - test-with-oplog-mongo-3-6 - test-with-oplog-mongo-4-0 filters: branches: - only: - - develop - - master + only: develop tags: only: /^v[0-9]+\.[0-9]+\.[0-9]-[0-9]+\.[0-9]+\.[0-9]+$/ - - image-build-prod: - requires: - - hold - filters: - branches: - only: - - master - image-build: requires: - - build + - deploy filters: branches: - only: - - develop + only: develop tags: only: /^v[0-9]+\.[0-9]+\.[0-9]-[0-9]+\.[0-9]+\.[0-9]+$/ - hold: @@ -548,18 +357,10 @@ workflows: - build filters: branches: - only: - - master - tags: - only: /^v[0-9]+\.[0-9]+\.[0-9]-[0-9]+\.[0-9]+\.[0-9]+$/ + only: master - pr-image-build: requires: - build filters: branches: - ignore: - - develop - - master - tags: - only: /^[0-9]+\.[0-9]+\.[0-9]+(?:-(?:rc|beta)\.[0-9]+)?$/ - + ignore: develop diff --git a/.circleci/sign.key.gpg b/.circleci/sign.key.gpg deleted file mode 100644 index 6d005764c11b..000000000000 Binary files a/.circleci/sign.key.gpg and /dev/null differ diff --git a/.docker/Dockerfile b/.docker/Dockerfile index 18a3e5a516cf..0f4d275a87d3 100644 --- a/.docker/Dockerfile +++ b/.docker/Dockerfile @@ -1,8 +1,15 @@ FROM rocketchat/base:8 -ADD . /app +ENV RC_VERSION 2.1.2 +MAINTAINER buildmaster@rocket.chat RUN set -x \ + && curl -SLf "https://releases.rocket.chat/${RC_VERSION}/download/" -o rocket.chat.tgz \ + && curl -SLf "https://releases.rocket.chat/${RC_VERSION}/asc" -o rocket.chat.tgz.asc \ + && gpg --verify rocket.chat.tgz.asc \ + && mkdir -p /app \ + && tar -zxf rocket.chat.tgz -C /app \ + && rm rocket.chat.tgz rocket.chat.tgz.asc \ && cd /app/bundle/programs/server \ && npm install \ && npm cache clear --force \ @@ -25,4 +32,4 @@ ENV DEPLOY_METHOD=docker \ EXPOSE 3000 -CMD ["/bin/bash", "/app/startup.sh"] +CMD ["node", "main.js"] diff --git a/.docker/Dockerfile.local b/.docker/Dockerfile.local index 9236ea58b6b6..db596e044346 100644 --- a/.docker/Dockerfile.local +++ b/.docker/Dockerfile.local @@ -15,19 +15,17 @@ COPY . /app WORKDIR /app -RUN meteor npm install \ - && cd packages/rocketchat-livechat/.app \ - && meteor npm install \ - && cd - +# This dockerfile shall build the app unless a previous step (e. g. from CI) already provided a build-bundle +RUN if [ -d /app/bundle ]; \ + then cp -R /app /tmp/build; \ + else meteor build --server-only --allow-superuser --debug --directory /tmp/build; \ + fi; -RUN METEOR_PROFILE=1000 meteor build --server-only --allow-superuser --debug --directory /tmp/build - -FROM assistify/chat-base:stretch +FROM rocketchat/base:8 MAINTAINER buildmaster@rocket.chat COPY --from=builder /tmp/build/bundle /app/bundle -COPY .docker/startup.sh /app/bundle/startup.sh RUN set -x \ && ls -l /app \ @@ -53,4 +51,4 @@ ENV DEPLOY_METHOD=docker \ EXPOSE 3000 -CMD ["/bin/bash", "startup.sh"] +CMD ["node", "main.js"] diff --git a/.docker/Dockerfile.rhel b/.docker/Dockerfile.rhel index 5d173ffbd0de..7347f3f8be08 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 1.3.2 +ENV RC_VERSION 2.3.2 MAINTAINER buildmaster@rocket.chat diff --git a/.eslintignore b/.eslintignore index 0f9a4f4d54d5..81b9e250bd69 100644 --- a/.eslintignore +++ b/.eslintignore @@ -5,11 +5,8 @@ packages/meteor-timesync/ app/emoji-emojione/generateEmojiIndex.js app/favico/favico.js app/katex/client/katex/katex.min.js -packages/rocketchat-livechat/.app/node_modules -packages/rocketchat-livechat/.app/.meteor packages/rocketchat-livechat/assets/rocketchat-livechat.min.js packages/rocketchat-livechat/assets/rocket-livechat.js -app/theme/client/minicolors/jquery.minicolors.js app/theme/client/vendor/ app/ui/client/lib/customEventPolyfill.js app/ui/client/lib/Modernizr.js @@ -20,6 +17,5 @@ packages/tap-i18n/lib/tap_i18next/tap_i18next-1.7.3.js private/moment-locales/ public/livechat/ !.scripts -!packages/rocketchat-livechat/.app public/pdf.worker.min.js imports/client/ diff --git a/.eslintrc b/.eslintrc index 74f9766d2044..a8bdb5166000 100644 --- a/.eslintrc +++ b/.eslintrc @@ -5,7 +5,19 @@ "__meteor_bootstrap__" : false, "__meteor_runtime_config__" : false, "Assets" : false, - "chrome" : false, - "jscolor" : false - } + "chrome" : false + }, + "plugins": ["react"], + "rules": { + "jsx-quotes": ["error", "prefer-single"], + "react/jsx-uses-react": "error", + "react/jsx-uses-vars": "error", + "react/jsx-no-undef": "error", + "react/jsx-fragments": ["error", "syntax"], + }, + "settings": { + "react": { + "version": "detect", + }, + }, } diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index 0822e6f29440..26a65c31e863 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -40,7 +40,12 @@ If you are experiencing a bug please search our issues to be sure it is not alre - Number of Running Instances: - DB Replicaset Oplog: - NodeJS Version: -- MongoDB Version: +- MongoDB Version: + +### Client Setup Information + +- Desktop App or Browser Version: +- Operating System: ### Additional context diff --git a/.github/bot-config.yml b/.github/bot-config.yml index 8df57f4e966d..65ab966398e2 100644 --- a/.github/bot-config.yml +++ b/.github/bot-config.yml @@ -2,6 +2,7 @@ bot: name: "@rocket-cat" whitelist: users: + - wreiske - TwizzyDizzy - theorenck - JSzaszvari diff --git a/.github/history.json b/.github/history.json index c916720042ec..4a215c606e22 100644 --- a/.github/history.json +++ b/.github/history.json @@ -33524,105 +33524,3781 @@ } ] }, - "1.3.1": { + "2.0.0-rc.0": { "node_version": "8.11.4", "npm_version": "6.4.1", "mongo_versions": [ - "3.2", "3.4", "3.6", "4.0" ], "pull_requests": [ { - "pr": "15141", - "title": "Fix custom auth", - "userLogin": "MarcosSpessatto", - "milestone": "1.3.1", + "pr": "15117", + "title": "[NEW] Custom message popups", + "userLogin": "Hudell", + "milestone": "2.0.0", + "contributors": [ + "Hudell", + "renatobecker", + "web-flow", + "tassoevan" + ] + }, + { + "pr": "15206", + "title": "[BREAK] Federation refactor with addition of chained events", + "userLogin": "alansikora", + "contributors": [ + "alansikora" + ] + }, + { + "pr": "14275", + "title": "[NEW] Options for SAML auth for individual organizations needs", + "userLogin": "Deltachaos", + "contributors": [ + "Deltachaos", + "sampaiodiego", + "web-flow", + "Hudell" + ] + }, + { + "pr": "14736", + "title": "[IMPROVE] Livechat User Management Improvements", + "userLogin": "Hudell", + "milestone": "2.0.0", + "contributors": [ + "Hudell", + "renatobecker", + "web-flow" + ] + }, + { + "pr": "15218", + "title": "LingoHub based on develop", + "userLogin": "engelgabriel", + "contributors": [ + "sampaiodiego" + ] + }, + { + "pr": "15214", + "title": "[NEW] Assume that Rocket.Chat runs behind one proxy by default (HTTP_FORWARDED_COUNT=1)", + "userLogin": "rodrigok", + "milestone": "2.0.0", + "contributors": [ + "rodrigok" + ] + }, + { + "pr": "14278", + "title": "[NEW] LDAP User Groups, Roles, and Channel Synchronization", + "userLogin": "wreiske", + "milestone": "2.0.0", + "contributors": [ + "wreiske", + "web-flow", + "engelgabriel", + "Hudell" + ] + }, + { + "pr": "15003", + "title": "[IMPROVE] Refactoring the queuing and routing processes of new livechats", + "userLogin": "renatobecker", + "milestone": "2.0.0", + "contributors": [ + "renatobecker", + "web-flow" + ] + }, + { + "pr": "15102", + "title": "[IMPROVE] Add limit of 50 user's resume tokens", + "userLogin": "MarcosSpessatto", + "milestone": "2.0.0", + "contributors": [ + "MarcosSpessatto", + "sampaiodiego" + ] + }, + { + "pr": "15217", + "title": "Regression: fix typo permisson to permission", + "userLogin": "ggazzo", + "milestone": "2.0.0", + "contributors": [ + "ggazzo" + ] + }, + { + "pr": "15204", + "title": "[NEW] Setup Wizard and Page not found, using React components", + "userLogin": "tassoevan", + "milestone": "2.0.0", + "contributors": [ + "tassoevan" + ] + }, + { + "pr": "15088", + "title": "[IMPROVE] Add asset extension validation", + "userLogin": "MarcosSpessatto", + "milestone": "2.0.0", + "contributors": [ + "MarcosSpessatto" + ] + }, + { + "pr": "14655", + "title": "[NEW] Add Mobex to the list of SMS service providers", + "userLogin": "zolbayars", + "milestone": "2.0.0", + "contributors": [ + "zolbayars", + "web-flow", + "sampaiodiego" + ] + }, + { + "pr": "14902", + "title": "[NEW] Support multiple push gateways", + "userLogin": "cardoso", + "milestone": "2.0.0", + "contributors": [ + "cardoso", + "web-flow" + ] + }, + { + "pr": "14918", + "title": "[FIX] Webdav crash", + "userLogin": "MarcosSpessatto", + "milestone": "2.0.0", + "contributors": [ + "MarcosSpessatto" + ] + }, + { + "pr": "15174", + "title": "[FIX] Mark room as read logic", + "userLogin": "ggazzo", + "contributors": [ + "ggazzo", + "web-flow" + ] + }, + { + "pr": "13864", + "title": "[NEW] Rest API Endpoint to get pinned messages from a room ", + "userLogin": "thayannevls", + "milestone": "2.0.0", + "contributors": [ + "thayannevls", + "web-flow", + "MarcosSpessatto" + ] + }, + { + "pr": "15205", + "title": "[FIX] Forget user session on window close", + "userLogin": "ggazzo", + "milestone": "2.0.0", + "contributors": [ + "ggazzo", + "sampaiodiego" + ] + }, + { + "pr": "15094", + "title": "[FIX] Search message wrongly grouping messages", + "userLogin": "ggazzo", + "milestone": "2.0.0", + "contributors": [ + "ggazzo", + "web-flow", + "geekgonecrazy" + ] + }, + { + "pr": "15038", + "title": "[FIX] Rate limit incoming integrations (webhooks)", + "userLogin": "mrsimpson", + "milestone": "2.0.0", + "contributors": [ + "mrsimpson", + "web-flow", + "sampaiodiego" + ] + }, + { + "pr": "15212", + "title": "[FIX] User's auto complete showing everyone on the server", + "userLogin": "ggazzo", + "milestone": "2.0.0", + "contributors": [ + "ggazzo", + "web-flow" + ] + }, + { + "pr": "8942", + "title": "[NEW] Granular permissions for settings", + "userLogin": "mrsimpson", + "milestone": "2.0.0", + "contributors": [ + "mrsimpson", + "web-flow" + ] + }, + { + "pr": "14682", + "title": "[FIX] \"Discussion\" label in Sidebar not hidden, when Discussions are disabled (#14660)", + "userLogin": "ifantom", + "milestone": "2.0.0", + "contributors": [ + "ifantom", + "web-flow" + ] + }, + { + "pr": "15202", + "title": "NEW: Apps enable after app installed", + "userLogin": "d-gubert", + "milestone": "2.0.0", + "contributors": [ + "d-gubert" + ] + }, + { + "pr": "15167", + "title": "[IMPROVE] Add possibility to use commands inside threads through Rest API", + "userLogin": "MarcosSpessatto", + "milestone": "2.0.0", + "contributors": [ + "MarcosSpessatto" + ] + }, + { + "pr": "14885", + "title": "[NEW] Add autotranslate Rest endpoints", + "userLogin": "MarcosSpessatto", + "milestone": "2.0.0", + "contributors": [ + "MarcosSpessatto", + "geekgonecrazy", + "web-flow" + ] + }, + { + "pr": "15162", + "title": "[FIX] Typo in 'access-permissions_description' ja translation", + "userLogin": "NatsumiKubo", + "milestone": "2.0.0", + "contributors": [ + "NatsumiKubo", + "web-flow" + ] + }, + { + "pr": "15201", + "title": "[FIX] IE11 modal, menu action and edit user page", + "userLogin": "ggazzo", + "milestone": "2.0.0", + "contributors": [ + "ggazzo" + ] + }, + { + "pr": "15053", + "title": "[NEW] Option to hide the button of Custom OAuth on login screen", + "userLogin": "ggazzo", + "milestone": "2.0.0", + "contributors": [ + "ggazzo", + "rodrigok" + ] + }, + { + "pr": "15199", + "title": "[BREAK] Remove support of MongoDB 3.2 and deprecate MongoDB 3.4", + "userLogin": "sampaiodiego", + "milestone": "2.0.0", + "contributors": [ + "sampaiodiego", + "web-flow" + ] + }, + { + "pr": "15184", + "title": "Change notifications file imports to server", + "userLogin": "sampaiodiego", + "milestone": "2.0.0", + "contributors": [ + "sampaiodiego" + ] + }, + { + "pr": "15192", + "title": "[BREAK] Remove GraphQL and grant packages", + "userLogin": "sampaiodiego", + "milestone": "2.0.0", + "contributors": [ + "sampaiodiego" + ] + }, + { + "pr": "15193", + "title": "[BREAK] Remove publication `roomSubscriptionsByRole`", + "userLogin": "sampaiodiego", + "milestone": "2.0.0", + "contributors": [ + "sampaiodiego" + ] + }, + { + "pr": "15194", + "title": "[BREAK] Remove publication `usersInRole`", + "userLogin": "sampaiodiego", + "milestone": "2.0.0", + "contributors": [ + "sampaiodiego" + ] + }, + { + "pr": "15186", + "title": "Update Livechat to 1.1.6", + "userLogin": "sampaiodiego", + "milestone": "2.0.0", + "contributors": [ + "sampaiodiego", + "renatobecker", + "web-flow" + ] + }, + { + "pr": "15183", + "title": "Regression: remove livechat cache from circle ci", + "userLogin": "ggazzo", + "milestone": "2.0.0", + "contributors": [ + "ggazzo" + ] + }, + { + "pr": "15133", + "title": "[BREAK] Remove old livechat client", + "userLogin": "ggazzo", + "milestone": "2.0.0", + "contributors": [ + "ggazzo", + "web-flow" + ] + }, + { + "pr": "15155", + "title": "[NEW] Endpoint to fetch livechat rooms with several filters", + "userLogin": "MarcosSpessatto", + "milestone": "2.0.0", + "contributors": [ + "MarcosSpessatto", + "renatobecker", + "web-flow" + ] + }, + { + "pr": "15177", + "title": "[FIX] TabBar not loading template titles", + "userLogin": "Hudell", + "milestone": "2.0.0", + "contributors": [ + "Hudell" + ] + }, + { + "pr": "15178", + "title": "Update presence package", + "userLogin": "sampaiodiego", + "contributors": [ + "sampaiodiego" + ] + }, + { + "pr": "15172", + "title": "[FIX] Attachment download button behavior", + "userLogin": "tassoevan", + "milestone": "1.3.2", + "contributors": [ + "tassoevan", + "sampaiodiego" + ] + }, + { + "pr": "15175", + "title": "[FIX] Messages search scroll", + "userLogin": "ggazzo", + "milestone": "1.3.2", + "contributors": [ + "ggazzo" + ] + }, + { + "pr": "15173", + "title": "Update latest Livechat widget version to 1.1.4", + "userLogin": "renatobecker", + "milestone": "1.3.2", + "contributors": [ + "renatobecker" + ] + }, + { + "pr": "15157", + "title": "[FIX] IE11 - callback createTreeWalker doesnt accept acceptNode", + "userLogin": "ggazzo", + "milestone": "1.3.2", + "contributors": [ + "ggazzo", + "tassoevan" + ] + }, + { + "pr": "15154", + "title": "Update latest Livechat widget version(1.1.3)", + "userLogin": "renatobecker", + "milestone": "1.3.2", + "contributors": [ + "renatobecker", + "web-flow" + ] + }, + { + "pr": "15166", + "title": "LingoHub based on develop", + "userLogin": "engelgabriel", + "contributors": [ + "sampaiodiego", + "web-flow" + ] + }, + { + "pr": "15156", + "title": "Switch outdated roadmap to point to milestones", + "userLogin": "geekgonecrazy", + "contributors": [ + "geekgonecrazy", + "web-flow" + ] + }, + { + "pr": "15146", + "title": "Remove GPG file", + "userLogin": "sampaiodiego", + "contributors": [ + "sampaiodiego" + ] + }, + { + "pr": "12174", + "title": "[NEW] Integrate DEEPL translation service to RC core", + "userLogin": "vickyokrm", + "milestone": "2.0.0", + "contributors": [ + "vickyokrm", + "mrsimpson", + "web-flow", + "geekgonecrazy" + ] + }, + { + "pr": "15147", + "title": "Add wreiske to authorized users in catbot", + "userLogin": "geekgonecrazy", + "contributors": [ + "geekgonecrazy", + "web-flow" + ] + }, + { + "pr": "12259", + "title": "[NEW] Jitsi meet room access via a token", + "userLogin": "alonelion1987", + "milestone": "2.0.0", + "contributors": [ + "rrzharikov", + "tassoevan", + "geekgonecrazy", + "web-flow" + ] + }, + { + "pr": "15141", + "title": "Fix custom auth", + "userLogin": "MarcosSpessatto", + "milestone": "1.3.1", + "contributors": [ + "MarcosSpessatto" + ] + }, + { + "pr": "15142", + "title": "Update to version 2.0.0-develop", + "userLogin": "sampaiodiego", + "contributors": [ + "sampaiodiego" + ] + }, + { + "pr": "14956", + "title": "[FIX] Threads contextual bar button visible even with threads disabled", + "userLogin": "cesarmal", + "milestone": "2.0.0", + "contributors": [ + "cesarmal" + ] + }, + { + "pr": "14507", + "title": "[FIX] Prevent to create discussion with empty name", + "userLogin": "MarcosSpessatto", + "milestone": "2.0.0", + "contributors": [ + "MarcosSpessatto", + "sampaiodiego", + "web-flow" + ] + }, + { + "pr": "15120", + "title": "[FIX] Remove new hidden file and fix for .env files for Snap", + "userLogin": "LuluGO", + "milestone": "2.0.0", + "contributors": [ + "LuluGO", + "sampaiodiego", + "web-flow" + ] + }, + { + "pr": "15078", + "title": "removed unwanted code", + "userLogin": "httpsOmkar", + "milestone": "2.0.0", + "contributors": [ + "httpsOmkar", + "web-flow" + ] + }, + { + "pr": "15083", + "title": "Update pt-BR.i18n.json", + "userLogin": "lucassmacedo", + "milestone": "2.0.0", + "contributors": [ + "lucassmacedo", + "web-flow" + ] + }, + { + "pr": "15136", + "title": "Regression: cachedCollection wrong callback parameters", + "userLogin": "ggazzo", + "contributors": [ + "ggazzo" + ] + }, + { + "pr": "15135", + "title": "[IMPROVE] Message tooltips as everyone else", + "userLogin": "tassoevan", + "milestone": "2.0.0", + "contributors": [ + "tassoevan", + "web-flow" + ] + }, + { + "pr": "15119", + "title": "[FIX] Custom emoji table scroll", + "userLogin": "ggazzo", + "milestone": "1.3.1", + "contributors": [ + "ggazzo" + ] + }, + { + "pr": "15114", + "title": "[FIX] Direct Message names not visible on Admin panel", + "userLogin": "ggazzo", + "milestone": "1.3.1", + "contributors": [ + "ggazzo", + "sampaiodiego" + ] + }, + { + "pr": "15121", + "title": "Allow file upload paths on attachments URLs", + "userLogin": "MarcosSpessatto", + "milestone": "2.0.0", + "contributors": [ + "MarcosSpessatto", + "web-flow" + ] + }, + { + "pr": "14978", + "title": "Fix automated test for manual user activation", + "userLogin": "mrsimpson", + "contributors": [ + "mrsimpson", + "web-flow" + ] + }, + { + "pr": "15124", + "title": "Add new step to build Docker image from PRs for production again", + "userLogin": "sampaiodiego", + "contributors": [ + "sampaiodiego" + ] + }, + { + "pr": "15115", + "title": "LingoHub based on develop", + "userLogin": "engelgabriel", + "contributors": [ + "sampaiodiego", + "web-flow" + ] + }, + { + "pr": "15074", + "title": "Improve url validation inside message object", + "userLogin": "MarcosSpessatto", + "milestone": "2.0.0", + "contributors": [ + "MarcosSpessatto", + "d-gubert", + "web-flow" + ] + }, + { + "pr": "15104", + "title": "[FIX] cachedcollection calling multiple times SYNC", + "userLogin": "ggazzo", + "milestone": "2.0.0", + "contributors": [ + "ggazzo" + ] + }, + { + "pr": "15109", + "title": "[BREAK] Replace tap:i18n to add support to 3-digit locales", + "userLogin": "sampaiodiego", + "milestone": "2.0.0", + "contributors": [ + "sampaiodiego" + ] + }, + { + "pr": "15097", + "title": "Merge master into develop & Set version to 1.4.0-develop", + "userLogin": "sampaiodiego", + "contributors": [ + "d-gubert", + "sampaiodiego", + "web-flow" + ] + } + ] + }, + "1.3.1": { + "node_version": "8.11.4", + "npm_version": "6.4.1", + "mongo_versions": [ + "3.2", + "3.4", + "3.6", + "4.0" + ], + "pull_requests": [ + { + "pr": "15148", + "title": "Release 1.3.1", + "userLogin": "sampaiodiego", + "contributors": [ + "ggazzo", + "sampaiodiego", + "MarcosSpessatto" + ] + }, + { + "pr": "15141", + "title": "Fix custom auth", + "userLogin": "MarcosSpessatto", + "milestone": "1.3.1", + "contributors": [ + "MarcosSpessatto" + ] + }, + { + "pr": "15119", + "title": "[FIX] Custom emoji table scroll", + "userLogin": "ggazzo", + "milestone": "1.3.1", + "contributors": [ + "ggazzo" + ] + }, + { + "pr": "15114", + "title": "[FIX] Direct Message names not visible on Admin panel", + "userLogin": "ggazzo", + "milestone": "1.3.1", + "contributors": [ + "ggazzo", + "sampaiodiego" + ] + } + ] + }, + "1.3.2": { + "node_version": "8.11.4", + "npm_version": "6.4.1", + "mongo_versions": [ + "3.2", + "3.4", + "3.6", + "4.0" + ], + "pull_requests": [ + { + "pr": "15176", + "title": "Release 1.3.2", + "userLogin": "sampaiodiego", + "contributors": [ + "renatobecker", + "sampaiodiego", + "ggazzo", + "tassoevan" + ] + }, + { + "pr": "15172", + "title": "[FIX] Attachment download button behavior", + "userLogin": "tassoevan", + "milestone": "1.3.2", + "contributors": [ + "tassoevan", + "sampaiodiego" + ] + }, + { + "pr": "15175", + "title": "[FIX] Messages search scroll", + "userLogin": "ggazzo", + "milestone": "1.3.2", + "contributors": [ + "ggazzo" + ] + }, + { + "pr": "15157", + "title": "[FIX] IE11 - callback createTreeWalker doesnt accept acceptNode", + "userLogin": "ggazzo", + "milestone": "1.3.2", + "contributors": [ + "ggazzo", + "tassoevan" + ] + }, + { + "pr": "15173", + "title": "Update latest Livechat widget version to 1.1.4", + "userLogin": "renatobecker", + "milestone": "1.3.2", + "contributors": [ + "renatobecker" + ] + }, + { + "pr": "15154", + "title": "Update latest Livechat widget version(1.1.3)", + "userLogin": "renatobecker", + "milestone": "1.3.2", + "contributors": [ + "renatobecker", + "web-flow" + ] + } + ] + }, + "2.0.0-rc.1": { + "node_version": "8.11.4", + "npm_version": "6.4.1", + "mongo_versions": [ + "3.4", + "3.6", + "4.0" + ], + "pull_requests": [ + { + "pr": "15234", + "title": "Federation improvements", + "userLogin": "alansikora", + "contributors": [ + "alansikora" + ] + }, + { + "pr": "15231", + "title": "Regression: Fix assets extension detection", + "userLogin": "sampaiodiego", + "milestone": "2.0.0", + "contributors": [ + "sampaiodiego" + ] + } + ] + }, + "2.0.0-rc.2": { + "node_version": "8.11.4", + "npm_version": "6.4.1", + "mongo_versions": [ + "3.4", + "3.6", + "4.0" + ], + "pull_requests": [ + { + "pr": "15268", + "title": "Regression: Double error toast on Setup Wizard", + "userLogin": "tassoevan", + "milestone": "2.0.0", + "contributors": [ + "tassoevan" + ] + }, + { + "pr": "15267", + "title": "Regression: addPermissionToRole argument as string", + "userLogin": "ggazzo", + "milestone": "2.0.0", + "contributors": [ + "ggazzo" + ] + }, + { + "pr": "15263", + "title": "Regression: Remove old scripts of Setup Wizard", + "userLogin": "tassoevan", + "milestone": "2.0.0", + "contributors": [ + "tassoevan", + "ggazzo", + "web-flow" + ] + }, + { + "pr": "15262", + "title": "Fix get IP for rate limiter", + "userLogin": "sampaiodiego", + "contributors": [ + "sampaiodiego" + ] + }, + { + "pr": "15249", + "title": "Add oplog events metrics", + "userLogin": "sampaiodiego", + "contributors": [ + "sampaiodiego" + ] + } + ] + }, + "2.0.0-rc.3": { + "node_version": "8.11.4", + "npm_version": "6.4.1", + "mongo_versions": [ + "3.4", + "3.6", + "4.0" + ], + "pull_requests": [ + { + "pr": "15306", + "title": "[FIX] Redirect on app manual install", + "userLogin": "d-gubert", + "milestone": "2.0.0", + "contributors": [ + "d-gubert", + "web-flow" + ] + }, + { + "pr": "15329", + "title": "Regression: last message doesn't update after reconnect", + "userLogin": "ggazzo", + "milestone": "2.0.0", + "contributors": [ + "ggazzo", + "web-flow" + ] + }, + { + "pr": "15242", + "title": "Regression: New Livechat methods and processes", + "userLogin": "renatobecker", + "milestone": "2.0.0", + "contributors": [ + "renatobecker", + "web-flow" + ] + }, + { + "pr": "15319", + "title": "[FIX] IE11 baseURI ", + "userLogin": "ggazzo", + "milestone": "2.0.0", + "contributors": [ + "ggazzo" + ] + }, + { + "pr": "15321", + "title": "Regression: Remove duplicated permission changes emitter", + "userLogin": "MartinSchoeler", + "milestone": "2.0.0", + "contributors": [ + "MartinSchoeler" + ] + }, + { + "pr": "15310", + "title": "Regression: Errors on the console preventing some settings to be saved", + "userLogin": "MartinSchoeler", + "milestone": "2.0.0", + "contributors": [ + "MartinSchoeler" + ] + }, + { + "pr": "15285", + "title": "Fix v148 migration", + "userLogin": "alansikora", + "contributors": [ + "alansikora", + "web-flow", + "geekgonecrazy" + ] + }, + { + "pr": "15258", + "title": "Fix apps list error", + "userLogin": "d-gubert", + "milestone": "2.0.0", + "contributors": [ + "d-gubert", + "web-flow" + ] + } + ] + }, + "2.0.0-rc.4": { + "node_version": "8.11.4", + "npm_version": "6.4.1", + "mongo_versions": [ + "3.4", + "3.6", + "4.0" + ], + "pull_requests": [ + { + "pr": "15336", + "title": "Federation migration and additional improvements", + "userLogin": "sampaiodiego", + "milestone": "2.0.0", + "contributors": [ + "alansikora", + "sampaiodiego", + "web-flow" + ] + } + ] + }, + "2.0.0-rc.5": { + "node_version": "8.11.4", + "npm_version": "6.4.1", + "mongo_versions": [ + "3.4", + "3.6", + "4.0" + ], + "pull_requests": [ + { + "pr": "15352", + "title": "Regression: Fix wrong import and minor code improvements", + "userLogin": "ggazzo", + "contributors": [ + "ggazzo" + ] + } + ] + }, + "2.0.0": { + "node_version": "8.11.4", + "npm_version": "6.4.1", + "mongo_versions": [ + "3.4", + "3.6", + "4.0" + ], + "pull_requests": [ + { + "pr": "15176", + "title": "Release 1.3.2", + "userLogin": "sampaiodiego", + "contributors": [ + "renatobecker", + "sampaiodiego", + "ggazzo", + "tassoevan" + ] + }, + { + "pr": "15141", + "title": "Fix custom auth", + "userLogin": "MarcosSpessatto", + "milestone": "1.3.1", + "contributors": [ + "MarcosSpessatto" + ] + }, + { + "pr": "15119", + "title": "[FIX] Custom emoji table scroll", + "userLogin": "ggazzo", + "milestone": "1.3.1", + "contributors": [ + "ggazzo" + ] + }, + { + "pr": "15114", + "title": "[FIX] Direct Message names not visible on Admin panel", + "userLogin": "ggazzo", + "milestone": "1.3.1", + "contributors": [ + "ggazzo", + "sampaiodiego" + ] + } + ] + }, + "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": [] + }, + "2.1.1": { + "node_version": "8.15.1", + "npm_version": "6.9.0", + "mongo_versions": [ + "3.4", + "3.6", + "4.0" + ], + "pull_requests": [ + { + "pr": "15603", + "title": "[FIX] Read Recepts was not working", + "userLogin": "rodrigok", + "milestone": "2.1.1", + "contributors": [ + "rodrigok" + ] + }, + { + "pr": "15598", + "title": "[FIX] Dynamic import of JS files were not working correctly", + "userLogin": "ggazzo", + "milestone": "2.1.1", + "contributors": [ + "ggazzo" + ] + } + ] + }, + "2.2.0-rc.0": { + "node_version": "8.15.1", + "npm_version": "6.9.0", + "mongo_versions": [ + "3.4", + "3.6", + "4.0" + ], + "pull_requests": [ + { + "pr": "15622", + "title": "Merge master into develop & Set version to 2.2.0-develop", + "userLogin": "rodrigok", + "contributors": [ + "rodrigok", + "geekgonecrazy" + ] + }, + { + "pr": "11385", + "title": "[NEW] Accept GIFs and SVGs for Avatars converting them to PNG and keep transparency of PNGs", + "userLogin": "tassoevan", + "milestone": "2.2.0", + "contributors": [ + "tassoevan", + "web-flow", + "rodrigok" + ] + }, + { + "pr": "15574", + "title": "[NEW] Thread support to apps slashcommands and slashcommand previews", + "userLogin": "d-gubert", + "milestone": "2.2.0", + "contributors": [ + "d-gubert" + ] + }, + { + "pr": "13821", + "title": "[FEATURE] Rest API upload file returns message object", + "userLogin": "knrt10", + "milestone": "2.2.0", + "contributors": [ + "knrt10", + "MarcosSpessatto", + "web-flow" + ] + }, + { + "pr": "15607", + "title": "[IMPROVE] Replace livechat:integration publication by REST", + "userLogin": "MarcosSpessatto", + "milestone": "2.2.0", + "contributors": [ + "MarcosSpessatto", + "renatobecker", + "web-flow" + ] + }, + { + "pr": "15510", + "title": "[IMPROVE] Replace livechat:appearance pub to REST", + "userLogin": "MarcosSpessatto", + "milestone": "2.2.0", + "contributors": [ + "MarcosSpessatto" + ] + }, + { + "pr": "13991", + "title": "[NEW] Remove all closed Livechat chats", + "userLogin": "knrt10", + "milestone": "2.2.0", + "contributors": [ + "knrt10", + "renatobecker", + "web-flow" + ] + }, + { + "pr": "13902", + "title": "[NEW] Separate integration roles", + "userLogin": "MarcosSpessatto", + "milestone": "2.2.0", + "contributors": [ + "MarcosSpessatto", + "web-flow", + "rodrigok" + ] + }, + { + "pr": "15428", + "title": "[FIX] Issues saving audio notifications", + "userLogin": "scrivna", + "milestone": "2.2.0", + "contributors": [ + "scrivna", + "web-flow", + "tassoevan" + ] + }, + { + "pr": "14428", + "title": "[NEW] Add users.requestDataDownload API endpoint", + "userLogin": "ubarsaiyan", + "milestone": "2.2.0", + "contributors": [ + "ubarsaiyan", + "Hudell", + "web-flow", + "MarcosSpessatto" + ] + }, + { + "pr": "15451", + "title": "[NEW] Check if agent can receive new livechat conversations when its status is away/idle", + "userLogin": "renatobecker", + "milestone": "2.2.0", + "contributors": [ + "renatobecker", + "web-flow" + ] + }, + { + "pr": "14203", + "title": "[NEW] Import SAML language and auto join SAML channels", + "userLogin": "unixtam", + "milestone": "2.2.0", + "contributors": [ + "unixtam", + "Hudell", + "web-flow", + "pierre-lehnen-rc", + "rodrigok" + ] + }, + { + "pr": "14698", + "title": "[NEW] Add option to enable X-Frame-options header to avoid loading inside any Iframe", + "userLogin": "MarcosSpessatto", + "milestone": "2.2.0", + "contributors": [ + "MarcosSpessatto", + "sampaiodiego", + "rodrigok" + ] + }, + { + "pr": "9058", + "title": "New: Add dev dependency david badge to README", + "userLogin": "robbyoconnor", + "milestone": "2.2.0", + "contributors": [ + "robbyoconnor", + "ggazzo", + "web-flow", + "rodrigok" + ] + }, + { + "pr": "13334", + "title": "[FIX] Fix a typo on Alpha API `e2e.setUserPublicAndPivateKeys` renaming to `e2e.setUserPublicAndPrivateKeys`", + "userLogin": "Montel", + "milestone": "2.2.0", + "contributors": [ + "ggazzo" + ] + }, + { + "pr": "15317", + "title": "[NEW] Assign new Livechat conversations to bot agents first", + "userLogin": "renatobecker", + "milestone": "2.2.0", + "contributors": [ + "renatobecker", + "d-gubert", + "web-flow", + "sampaiodiego" + ] + }, + { + "pr": "15289", + "title": "[NEW]Added file type filter to RoomFiles", + "userLogin": "juanpetterson", + "milestone": "2.2.0", + "contributors": [ + "juanpetterson", + "tassoevan", + "web-flow", + "ggazzo", + "pierre-lehnen-rc", + "MarcosSpessatto" + ] + }, + { + "pr": "15614", + "title": "Regression: add stdout publication back", + "userLogin": "ggazzo", + "milestone": "2.2.0", + "contributors": [ + "ggazzo" + ] + }, + { + "pr": "15615", + "title": "[FIX] Showing announcement back", + "userLogin": "ggazzo", + "milestone": "2.1.2", + "contributors": [ + "ggazzo", + "tassoevan", + "web-flow" + ] + }, + { + "pr": "14635", + "title": "[FIX] Link in Announcement popup", + "userLogin": "knrt10", + "contributors": [ + "knrt10", + "tassoevan", + "web-flow", + "ggazzo" + ] + }, + { + "pr": "15473", + "title": "Livechat Issues", + "userLogin": "pierre-lehnen-rc", + "milestone": "2.2.0", + "contributors": [ + "pierre-lehnen-rc" + ] + }, + { + "pr": "15577", + "title": "[NEW] Add new Livechat appearance setting to set the conversation finished message", + "userLogin": "renatobecker", + "milestone": "2.2.0", + "contributors": [ + "renatobecker", + "web-flow" + ] + }, + { + "pr": "14084", + "title": "[FIX] adjustments for tooltips to show room name instead of id", + "userLogin": "mohamedar97", + "contributors": [ + "mohamedar97" + ] + }, + { + "pr": "15603", + "title": "[FIX] Read Recepts was not working", + "userLogin": "rodrigok", + "milestone": "2.1.1", + "contributors": [ + "rodrigok" + ] + }, + { + "pr": "15589", + "title": "[IMPROVE] Cache hasPermissions", + "userLogin": "ggazzo", + "milestone": "2.2.0", + "contributors": [ + "ggazzo", + "web-flow" + ] + }, + { + "pr": "13956", + "title": "[NEW] close emoji box using Keyboard Escape key", + "userLogin": "mohamedar97", + "milestone": "2.2.0", + "contributors": [ + "mohamedar97", + "ggazzo", + "MartinSchoeler", + "web-flow" + ] + }, + { + "pr": "15598", + "title": "[FIX] Dynamic import of JS files were not working correctly", + "userLogin": "ggazzo", + "milestone": "2.1.1", + "contributors": [ + "ggazzo" + ] + }, + { + "pr": "15602", + "title": "[FIX] Deny editing visitor's phone number in SMS conversations", + "userLogin": "renatobecker", + "milestone": "2.2.0", + "contributors": [ + "renatobecker" + ] + }, + { + "pr": "15593", + "title": "[IMPROVE] Disable edit visitor's phone number in SMS conversations", + "userLogin": "renatobecker", + "milestone": "2.2.0", + "contributors": [ + "renatobecker", + "web-flow" + ] + }, + { + "pr": "15600", + "title": "[NEW] Update livechat widget version to 1.2.5", + "userLogin": "renatobecker", + "milestone": "2.2.0", + "contributors": [ + "renatobecker" + ] + }, + { + "pr": "15599", + "title": "Regression: Fix broken message formatting box", + "userLogin": "MartinSchoeler", + "milestone": "2.2.0", + "contributors": [ + "MartinSchoeler" + ] + }, + { + "pr": "15594", + "title": "[FIX] Incorrect display of the button \"Invite users\"", + "userLogin": "MartinSchoeler", + "milestone": "2.2.0", + "contributors": [ + "MartinSchoeler" + ] + }, + { + "pr": "15416", + "title": "[FIX] Compact view", + "userLogin": "MartinSchoeler", + "milestone": "2.2.0", + "contributors": [ + "MartinSchoeler" + ] + }, + { + "pr": "15398", + "title": "[IMPROVE] Lazyload Katex Package", + "userLogin": "ggazzo", + "milestone": "2.2.0", + "contributors": [ + "ggazzo", + "web-flow", + "MartinSchoeler" + ] + }, + { + "pr": "15596", + "title": "[CHORE] Update latest Livechat widget version to 1.2.4", + "userLogin": "renatobecker", + "milestone": "2.2.0", + "contributors": [ + "renatobecker" + ] + }, + { + "pr": "15483", + "title": "Remove unneeded nginx file", + "userLogin": "geekgonecrazy", + "contributors": [ + "geekgonecrazy", + "web-flow" + ] + }, + { + "pr": "15591", + "title": "[REGRESSION] Fix remove department from list", + "userLogin": "MarcosSpessatto", + "milestone": "2.2.0", + "contributors": [ + "MarcosSpessatto", + "renatobecker", + "web-flow" + ] + }, + { + "pr": "15592", + "title": "[CHORE] Update latest Livechat widget version to 1.2.2", + "userLogin": "renatobecker", + "milestone": "2.2.0", + "contributors": [ + "renatobecker" + ] + }, + { + "pr": "15586", + "title": "[FIX] leak on stdout listeners", + "userLogin": "ggazzo", + "contributors": [ + "ggazzo" + ] + }, + { + "pr": "15534", + "title": "[NEW] Import DMs from CSV files", + "userLogin": "pierre-lehnen-rc", + "contributors": [ + "pierre-lehnen-rc" + ] + }, + { + "pr": "15564", + "title": "[FIX] Self-XSS in validation functionality", + "userLogin": "ggazzo", + "milestone": "2.2.0", + "contributors": [ + "ggazzo" + ] + }, + { + "pr": "15563", + "title": "Revert fix package-lock.json", + "userLogin": "sampaiodiego", + "contributors": [ + "sampaiodiego" + ] + }, + { + "pr": "15561", + "title": "Regression: Fix package-lock.json", + "userLogin": "sampaiodiego", + "contributors": [ + "sampaiodiego" + ] + }, + { + "pr": "15559", + "title": "[CHORE] Split logger classes to avoid cyclic dependencies", + "userLogin": "MarcosSpessatto", + "milestone": "2.2.0", + "contributors": [ + "MarcosSpessatto" + ] + }, + { + "pr": "15520", + "title": "[FIX] Registration/login page now mobile friendly (#15422)", + "userLogin": "nstseek", + "milestone": "2.2.0", + "contributors": [ + "nstseek", + "web-flow" + ] + }, + { + "pr": "15477", + "title": "docs: remove rocket chat launcher link", + "userLogin": "RafaelGSS", + "contributors": [ + "RafaelGSS", + "web-flow" + ] + }, + { + "pr": "15546", + "title": "[FIX] Update apps engine rooms converter to use transformMappedData", + "userLogin": "d-gubert", + "milestone": "2.2.0", + "contributors": [ + "d-gubert", + "renatobecker", + "web-flow" + ] + }, + { + "pr": "15507", + "title": "[IMPROVE] Replace `livechat:triggers` publication by REST calls", + "userLogin": "MarcosSpessatto", + "milestone": "2.2.0", + "contributors": [ + "MarcosSpessatto", + "sampaiodiego" + ] + }, + { + "pr": "15506", + "title": "[FIX] Missing ending slash on publicFilePath of fileUpload", + "userLogin": "rodrigok", + "milestone": "2.2.0", + "contributors": [ + "rodrigok", + "renatobecker", + "web-flow" + ] + }, + { + "pr": "15515", + "title": "[FIX] Japanese translation for run import", + "userLogin": "yusukeh0710", + "contributors": [ + "yusukeh0710" + ] + }, + { + "pr": "15556", + "title": "[FIX] Add a header for the createAt column in the Directory", + "userLogin": "antkaz", + "milestone": "2.2.0", + "contributors": [ + "antkaz" + ] + }, + { + "pr": "15550", + "title": "[IMPROVE] Replace roomFilesWithSearchText subscription", + "userLogin": "MarcosSpessatto", + "milestone": "2.2.0", + "contributors": [ + "MarcosSpessatto", + "ggazzo" + ] + }, + { + "pr": "15445", + "title": "[FIX] Method saveUser is not using password policy", + "userLogin": "ggazzo", + "milestone": "2.2.0", + "contributors": [ + "ggazzo", + "sampaiodiego" + ] + }, + { + "pr": "15548", + "title": "[IMPROVE] Replace starred messages subscription", + "userLogin": "MarcosSpessatto", + "milestone": "2.2.0", + "contributors": [ + "MarcosSpessatto" + ] + }, + { + "pr": "15532", + "title": "[IMPROVE] Replace some livechat:rooms subscriptions", + "userLogin": "MarcosSpessatto", + "milestone": "2.2.0", + "contributors": [ + "MarcosSpessatto", + "renatobecker", + "web-flow" + ] + }, + { + "pr": "15525", + "title": "[FIX] Add permissions for slashCommands", + "userLogin": "antkaz", + "milestone": "2.2.0", + "contributors": [ + "antkaz" + ] + }, + { + "pr": "15517", + "title": "[CHORE] remove 'bulk-create-c' permission", + "userLogin": "antkaz", + "milestone": "2.2.0", + "contributors": [ + "antkaz" + ] + }, + { + "pr": "15544", + "title": "[IMPROVE] Replace pinned messages subscription", + "userLogin": "MarcosSpessatto", + "milestone": "2.2.0", + "contributors": [ + "MarcosSpessatto", + "web-flow" + ] + }, + { + "pr": "15540", + "title": "[IMPROVE] Replace mentionedMessages publication to REST", + "userLogin": "MarcosSpessatto", + "milestone": "2.2.0", + "contributors": [ + "MarcosSpessatto", + "web-flow", + "ggazzo" + ] + }, + { + "pr": "15344", + "title": "[FIX] Typo in autotranslate method", + "userLogin": "Montel", + "milestone": "2.2.0", + "contributors": [ + "Montel", + "ggazzo", + "web-flow" + ] + }, + { + "pr": "15541", + "title": "[FIX] Adding \"Promise.await\" in \"livechat/message\" endpoint", + "userLogin": "rodrigokamada", + "milestone": "2.2.0", + "contributors": [ + "rodrigokamada", + "renatobecker", + "web-flow" + ] + }, + { + "pr": "15444", + "title": "[FIX] Reset password was allowing empty values leading to an impossibility to login", + "userLogin": "ggazzo", + "milestone": "2.2.0", + "contributors": [ + "ggazzo", + "web-flow" + ] + }, + { + "pr": "15516", + "title": "[FIX] Emoji are rendered in URL", + "userLogin": "oguhpereira", + "milestone": "2.2.0", + "contributors": [ + "oguhpereira" + ] + }, + { + "pr": "15460", + "title": "[FIX] Promise await for sendMessage in livechat/messages endpoint", + "userLogin": "hmagarotto", + "milestone": "2.2.0", + "contributors": [ + "hmagarotto", + "renatobecker", + "web-flow" + ] + }, + { + "pr": "15482", + "title": "[IMPROVE] Detach React components from Meteor API", + "userLogin": "tassoevan", + "milestone": "2.2.0", + "contributors": [ + "tassoevan", + "ggazzo" + ] + }, + { + "pr": "15514", + "title": "[FIX] Exposing some fields on server logs at debug level", + "userLogin": "ggazzo", + "contributors": [ + "ggazzo", + "web-flow", + "sampaiodiego" + ] + }, + { + "pr": "15490", + "title": "[IMPROVE] Replace livechat:agents pub by REST calls", + "userLogin": "MarcosSpessatto", + "milestone": "2.2.0", + "contributors": [ + "MarcosSpessatto", + "sampaiodiego", + "web-flow" + ] + }, + { + "pr": "15478", + "title": "[IMPROVE] Replace `livechat:departments` publication by REST Calls", + "userLogin": "MarcosSpessatto", + "milestone": "2.2.0", + "contributors": [ + "MarcosSpessatto" + ] + }, + { + "pr": "15500", + "title": "[IMPROVE] Secure cookies when using HTTPS connection", + "userLogin": "rodrigok", + "milestone": "2.2.0", + "contributors": [ + "rodrigok" + ] + }, + { + "pr": "15498", + "title": "Reply HTTP requests with `X-XSS-Protection: 1` header", + "userLogin": "rodrigok", + "milestone": "2.2.0", + "contributors": [ + "rodrigok" + ] + }, + { + "pr": "15476", + "title": "Updating license term", + "userLogin": "mar-v", + "contributors": [ + "mar-v", + "web-flow" + ] + }, + { + "pr": "15487", + "title": "LingoHub based on develop", + "userLogin": "engelgabriel", + "contributors": [ + "sampaiodiego" + ] + }, + { + "pr": "15457", + "title": "[IMPROVE] Update Fuselage components on SetupWizard", + "userLogin": "tassoevan", + "milestone": "2.2.0", + "contributors": [ + "tassoevan", + "ggazzo", + "web-flow" + ] + }, + { + "pr": "15469", + "title": "Merge master into develop & Set version to 2.2.0-develop", + "userLogin": "sampaiodiego", + "contributors": [ + "sampaiodiego", + "web-flow" + ] + } + ] + }, + "2.2.0-rc.1": { + "node_version": "8.15.1", + "npm_version": "6.9.0", + "mongo_versions": [ + "3.4", + "3.6", + "4.0" + ], + "pull_requests": [ + { + "pr": "15652", + "title": "Regression: hasPermission ignoring subscription roles", + "userLogin": "ggazzo", + "milestone": "2.2.0", + "contributors": [ + "ggazzo" + ] + }, + { + "pr": "15656", + "title": "[FIX] Read Receipts were not working properly with subscriptions without ls", + "userLogin": "rodrigok", + "milestone": "2.1.2", + "contributors": [ + "rodrigok" + ] + }, + { + "pr": "15657", + "title": "[FIX] Exception when sending email of messages attachments undefined", + "userLogin": "rodrigok", + "milestone": "2.1.2", + "contributors": [ + "rodrigok" + ] + }, + { + "pr": "15646", + "title": "Regression: AppRoomsConverter on Livechat rooms", + "userLogin": "renatobecker", + "milestone": "2.2.0", + "contributors": [ + "renatobecker" + ] + }, + { + "pr": "15641", + "title": "Regression: fix unknown role breaking hasPermission", + "userLogin": "ggazzo", + "milestone": "2.2.0", + "contributors": [ + "ggazzo" + ] + }, + { + "pr": "15628", + "title": "Regression: Move import to avoid circular dependencies", + "userLogin": "MarcosSpessatto", + "milestone": "2.2.0", + "contributors": [ + "MarcosSpessatto" + ] + }, + { + "pr": "15625", + "title": "Chore: Add Client Setup Information to Issue Template", + "userLogin": "MartinSchoeler", + "contributors": [ + "MartinSchoeler", + "web-flow" + ] + } + ] + }, + "2.1.2": { + "node_version": "8.15.1", + "npm_version": "6.9.0", + "mongo_versions": [ + "3.4", + "3.6", + "4.0" + ], + "pull_requests": [ + { + "pr": "15667", + "title": "Release 2.1.2", + "userLogin": "rodrigok", + "contributors": [ + "knrt10", + "rodrigok" + ] + }, + { + "pr": "15656", + "title": "[FIX] Read Receipts were not working properly with subscriptions without ls", + "userLogin": "rodrigok", + "milestone": "2.1.2", + "contributors": [ + "rodrigok" + ] + }, + { + "pr": "15657", + "title": "[FIX] Exception when sending email of messages attachments undefined", + "userLogin": "rodrigok", + "milestone": "2.1.2", + "contributors": [ + "rodrigok" + ] + }, + { + "pr": "14635", + "title": "[FIX] Channel Announcements not working", + "userLogin": "knrt10", + "milestone": "2.1.2", + "contributors": [ + "knrt10", + "tassoevan", + "web-flow", + "ggazzo" + ] + } + ] + }, + "2.2.0-rc.2": { + "node_version": "8.15.1", + "npm_version": "6.9.0", + "mongo_versions": [ + "3.4", + "3.6", + "4.0" + ], + "pull_requests": [ + { + "pr": "15676", + "title": "Move publication deprecation warnings", + "userLogin": "MarcosSpessatto", + "milestone": "2.2.0", + "contributors": [ + "MarcosSpessatto" + ] + }, + { + "pr": "15675", + "title": "Regression: Remove reference to obsolete template helper", + "userLogin": "tassoevan", + "milestone": "2.2.0", + "contributors": [ + "tassoevan" + ] + } + ] + }, + "2.2.0-rc.3": { + "node_version": "8.15.1", + "npm_version": "6.9.0", + "mongo_versions": [ + "3.4", + "3.6", + "4.0" + ], + "pull_requests": [ + { + "pr": "15680", + "title": "Merge master into develop", + "userLogin": "rodrigok", + "contributors": [ + "knrt10", + "rodrigok", + "web-flow" + ] + }, + { + "pr": "15667", + "title": "Release 2.1.2", + "userLogin": "rodrigok", + "contributors": [ + "knrt10", + "rodrigok" + ] + }, + { + "pr": "15656", + "title": "[FIX] Read Receipts were not working properly with subscriptions without ls", + "userLogin": "rodrigok", + "milestone": "2.1.2", + "contributors": [ + "rodrigok" + ] + }, + { + "pr": "15657", + "title": "[FIX] Exception when sending email of messages attachments undefined", + "userLogin": "rodrigok", + "milestone": "2.1.2", + "contributors": [ + "rodrigok" + ] + }, + { + "pr": "14635", + "title": "[FIX] Channel Announcements not working", + "userLogin": "knrt10", + "milestone": "2.1.2", + "contributors": [ + "knrt10", + "tassoevan", + "web-flow", + "ggazzo" + ] + } + ] + }, + "2.2.0": { + "node_version": "8.15.1", + "npm_version": "6.9.0", + "mongo_versions": [ + "3.4", + "3.6", + "4.0" + ], + "pull_requests": [] + }, + "1.3.3": { + "node_version": "8.11.4", + "npm_version": "6.4.1", + "mongo_versions": [ + "3.2", + "3.4", + "3.6", + "4.0" + ], + "pull_requests": [ + { + "pr": "15794", + "title": "[FIX] Markdown link parser", + "userLogin": "ggazzo", + "milestone": "2.3.0", + "contributors": [ + "ggazzo", + "web-flow" + ] + }, + { + "pr": "15814", + "title": "[FIX] Updating an app via \"Update\" button errors out with \"App already exists\"", + "userLogin": "d-gubert", + "contributors": [ + "d-gubert" + ] + } + ] + }, + "2.0.1": { + "node_version": "8.11.4", + "npm_version": "6.4.1", + "mongo_versions": [ + "3.4", + "3.6", + "4.0" + ], + "pull_requests": [ + { + "pr": "15794", + "title": "[FIX] Markdown link parser", + "userLogin": "ggazzo", + "milestone": "2.3.0", + "contributors": [ + "ggazzo", + "web-flow" + ] + }, + { + "pr": "15814", + "title": "[FIX] Updating an app via \"Update\" button errors out with \"App already exists\"", + "userLogin": "d-gubert", + "contributors": [ + "d-gubert" + ] + } + ] + }, + "2.1.3": { + "node_version": "8.15.1", + "npm_version": "6.9.0", + "mongo_versions": [ + "3.4", + "3.6", + "4.0" + ], + "pull_requests": [ + { + "pr": "15794", + "title": "[FIX] Markdown link parser", + "userLogin": "ggazzo", + "milestone": "2.3.0", + "contributors": [ + "ggazzo", + "web-flow" + ] + }, + { + "pr": "15814", + "title": "[FIX] Updating an app via \"Update\" button errors out with \"App already exists\"", + "userLogin": "d-gubert", + "contributors": [ + "d-gubert" + ] + } + ] + }, + "2.2.1": { + "node_version": "8.15.1", + "npm_version": "6.9.0", + "mongo_versions": [ + "3.4", + "3.6", + "4.0" + ], + "pull_requests": [ + { + "pr": "15794", + "title": "[FIX] Markdown link parser", + "userLogin": "ggazzo", + "milestone": "2.3.0", + "contributors": [ + "ggazzo", + "web-flow" + ] + }, + { + "pr": "15814", + "title": "[FIX] Updating an app via \"Update\" button errors out with \"App already exists\"", + "userLogin": "d-gubert", + "contributors": [ + "d-gubert" + ] + } + ] + }, + "2.3.0-rc.0": { + "node_version": "8.15.1", + "npm_version": "6.9.0", + "mongo_versions": [ + "3.4", + "3.6", + "4.0" + ], + "pull_requests": [ + { + "pr": "15703", + "title": "[NEW] Add forms to view and edit Livechat agents info", + "userLogin": "renatobecker", + "milestone": "2.3.0", + "contributors": [ + "renatobecker", + "ggazzo" + ] + }, + { + "pr": "15442", + "title": "[NEW] Workspace Manual Registration", + "userLogin": "ggazzo", + "contributors": [ + "ggazzo", + "d-gubert" + ] + }, + { + "pr": "15832", + "title": "[FIX] Missing Privacy Policy Agree on register", + "userLogin": "geekgonecrazy", + "contributors": [ + "geekgonecrazy" + ] + }, + { + "pr": "15752", + "title": "[NEW] Option on livechat departments to ensure a chat has tags before closing", + "userLogin": "renatobecker", + "milestone": "2.3.0", + "contributors": [ + "renatobecker" + ] + }, + { + "pr": "15804", + "title": "[IMPROVE] Make push notification batchsize and interval configurable", + "userLogin": "Exordian", + "contributors": [ + "Exordian" + ] + }, + { + "pr": "15803", + "title": "[FIX] Push: fix notification priority for google (FCM)", + "userLogin": "Exordian", + "contributors": [ + "Exordian" + ] + }, + { + "pr": "14807", + "title": "[NEW] Setting to dismiss desktop notification only after interaction", + "userLogin": "mpdbl", + "milestone": "2.3.0", + "contributors": [ + "mpdbl", + "web-flow" + ] + }, + { + "pr": "15818", + "title": "[NEW] Option for admins to set a random password to a user", + "userLogin": "pierre-lehnen-rc", + "contributors": [ + "pierre-lehnen-rc", + "sampaiodiego" + ] + }, + { + "pr": "15836", + "title": "[NEW] SAML login without popup windows", + "userLogin": "pierre-lehnen-rc", + "contributors": [ + "pierre-lehnen-rc" + ] + }, + { + "pr": "15786", + "title": "[IMPROVE] Add more fields to iframe integration event `unread-changed-by-subscription`", + "userLogin": "MarcosSpessatto", + "milestone": "2.3.0", + "contributors": [ + "MarcosSpessatto" + ] + }, + { + "pr": "15691", + "title": "[IMPROVE] Allow dragging of images and text from browsers", + "userLogin": "MartinSchoeler", + "milestone": "2.3.0", + "contributors": [ + "MartinSchoeler", + "tassoevan" + ] + }, + { + "pr": "15777", + "title": "[NEW] Add ability to users reset their own E2E key", + "userLogin": "pierre-lehnen-rc", + "contributors": [ + "pierre-lehnen-rc", + "sampaiodiego" + ] + }, + { + "pr": "15651", + "title": "[FIX] Not valid relative URLs on message attachments", + "userLogin": "MarcosSpessatto", + "milestone": "2.3.0", + "contributors": [ + "MarcosSpessatto" + ] + }, + { + "pr": "15828", + "title": "[NEW] Notify users when their email address change", + "userLogin": "pierre-lehnen-rc", + "contributors": [ + "pierre-lehnen-rc", + "sampaiodiego", + "web-flow" + ] + }, + { + "pr": "15770", + "title": "[NEW] Add a new stream to emit and listen room data events", + "userLogin": "renatobecker", + "milestone": "2.3.0", + "contributors": [ + "renatobecker", + "sampaiodiego" + ] + }, + { + "pr": "15740", + "title": "[IMPROVE] Unfollow own threads", + "userLogin": "ggazzo", + "milestone": "2.3.0", + "contributors": [ + "ggazzo" + ] + }, + { + "pr": "15452", + "title": "[IMPROVE] Administration UI - React and Fuselage components", + "userLogin": "tassoevan", + "milestone": "2.3.0", + "contributors": [ + "tassoevan" + ] + }, + { + "pr": "15824", + "title": "[FIX] REST endpoint `chat.syncMessages` returning an error with deleted messages", + "userLogin": "MarcosSpessatto", + "milestone": "2.3.0", + "contributors": [ + "MarcosSpessatto" + ] + }, + { + "pr": "15822", + "title": "LingoHub based on develop", + "userLogin": "engelgabriel", + "contributors": [ + "sampaiodiego" + ] + }, + { + "pr": "15814", + "title": "[FIX] Updating an app via \"Update\" button errors out with \"App already exists\"", + "userLogin": "d-gubert", + "contributors": [ + "d-gubert" + ] + }, + { + "pr": "15771", + "title": "[FIX] Channel notification audio preferences", + "userLogin": "sampaiodiego", + "milestone": "2.3.0", + "contributors": [ + "sampaiodiego" + ] + }, + { + "pr": "15811", + "title": "[FIX] Pasting images on reply as thread", + "userLogin": "MartinSchoeler", + "milestone": "2.3.0", + "contributors": [ + "MartinSchoeler" + ] + }, + { + "pr": "15794", + "title": "[FIX] Markdown link parser", + "userLogin": "ggazzo", + "milestone": "2.3.0", + "contributors": [ + "ggazzo", + "web-flow" + ] + }, + { + "pr": "15809", + "title": "[FIX] Prevent agent last message undefined", + "userLogin": "MarcosSpessatto", + "milestone": "2.3.0", + "contributors": [ + "MarcosSpessatto" + ] + }, + { + "pr": "15795", + "title": "[REGRESSION] Add livechat room type to the room's file list", + "userLogin": "MarcosSpessatto", + "milestone": "2.3.0", + "contributors": [ + "MarcosSpessatto" + ] + }, + { + "pr": "15783", + "title": "Fix notification migration", + "userLogin": "sampaiodiego", + "milestone": "2.3.0", + "contributors": [ + "sampaiodiego" + ] + }, + { + "pr": "15629", + "title": "[IMPROVE] Replace livechat:pagesvisited publication by REST", + "userLogin": "MarcosSpessatto", + "milestone": "2.3.0", + "contributors": [ + "MarcosSpessatto" + ] + }, + { + "pr": "15643", + "title": "[IMPROVE] Replace livechat:externalMessages publication by REST", + "userLogin": "MarcosSpessatto", + "milestone": "2.3.0", + "contributors": [ + "MarcosSpessatto" + ] + }, + { + "pr": "15775", + "title": "[IMPROVE] dynamic import livechat views", + "userLogin": "ggazzo", + "milestone": "2.3.0", + "contributors": [ + "ggazzo", + "MartinSchoeler" + ] + }, + { + "pr": "15780", + "title": "[FIX] Livechat transfer history messages", + "userLogin": "renatobecker", + "milestone": "2.3.0", + "contributors": [ + "renatobecker" + ] + }, + { + "pr": "15230", + "title": "[NEW] Livechat analytics", + "userLogin": "MarcosSpessatto", + "milestone": "2.3.0", + "contributors": [ + "MarcosSpessatto", + "web-flow", + "renatobecker" + ] + }, + { + "pr": "15743", + "title": "[NEW] Allow Regexes on SAML user field mapping", + "userLogin": "pierre-lehnen-rc", + "contributors": [ + "pierre-lehnen-rc" + ] + }, + { + "pr": "15772", + "title": "Regression: fix admin instances info page", + "userLogin": "sampaiodiego", + "milestone": "2.3.0", + "contributors": [ + "sampaiodiego" + ] + }, + { + "pr": "15773", + "title": "[FIX] Add button to reset.css", + "userLogin": "MartinSchoeler", + "milestone": "2.3.0", + "contributors": [ + "MartinSchoeler" + ] + }, + { + "pr": "15774", + "title": "[FIX] Mentions before blockquote", + "userLogin": "MartinSchoeler", + "milestone": "2.3.0", + "contributors": [ + "MartinSchoeler" + ] + }, + { + "pr": "15639", + "title": "[IMPROVE] Replace livechat:visitorInfo publication by REST", + "userLogin": "MarcosSpessatto", + "milestone": "2.3.0", + "contributors": [ + "MarcosSpessatto", + "renatobecker" + ] + }, + { + "pr": "15764", + "title": "[IMPROVE] Lazyload Chart.js", + "userLogin": "MartinSchoeler", + "contributors": [ + "ggazzo", + "MartinSchoeler" + ] + }, + { + "pr": "15666", + "title": "[NEW] Livechat analytics functions", + "userLogin": "MarcosSpessatto", + "milestone": "2.3.0", + "contributors": [ + "MarcosSpessatto" + ] + }, + { + "pr": "15763", + "title": "LingoHub based on develop", + "userLogin": "engelgabriel", + "contributors": [ + "sampaiodiego" + ] + }, + { + "pr": "15745", + "title": "[FIX] Sidebar font color was not respecting theming", + "userLogin": "mariaeduardacunha", + "milestone": "2.3.0", + "contributors": [ + "mariaeduardacunha" + ] + }, + { + "pr": "15732", + "title": "[FIX] Add livechat agents into departments", + "userLogin": "renatobecker", + "milestone": "2.3.0", + "contributors": [ + "renatobecker" + ] + }, + { + "pr": "15741", + "title": "[IMPROVE] Lazyload qrcode lib", + "userLogin": "MartinSchoeler", + "contributors": [ + "ggazzo", + "MartinSchoeler" + ] + }, + { + "pr": "15733", + "title": "Regression: messageAttachments inside messageAttachments not receiving settings", + "userLogin": "ggazzo", + "milestone": "2.3.0", + "contributors": [ + "ggazzo" + ] + }, + { + "pr": "15655", + "title": "Improve LDAP Login Fallback setting description in portuguese", + "userLogin": "pierre-lehnen-rc", + "contributors": [ + "pierre-lehnen-rc" + ] + }, + { + "pr": "15644", + "title": "[IMPROVE] Replace personalAccessTokens publication by REST", + "userLogin": "MarcosSpessatto", + "milestone": "2.3.0", + "contributors": [ + "MarcosSpessatto" + ] + }, + { + "pr": "15632", + "title": "[FIX] Changed cmsPage Style", + "userLogin": "gabriellsh", + "contributors": [ + "gabriellsh", + "web-flow" + ] + }, + { + "pr": "15718", + "title": "[FIX] Forward Livechat UI and the related permissions ", + "userLogin": "renatobecker", + "milestone": "2.3.0", + "contributors": [ + "renatobecker" + ] + }, + { + "pr": "15581", + "title": "[FIX] line-height to show entire letters", + "userLogin": "nstseek", + "milestone": "2.3.0", + "contributors": [ + "nstseek", + "MartinSchoeler", + "web-flow" + ] + }, + { + "pr": "15529", + "title": "[IMPROVE] Replace livechat:departmentAgents subscription to REST", + "userLogin": "MarcosSpessatto", + "milestone": "2.3.0", + "contributors": [ + "MarcosSpessatto" + ] + }, + { + "pr": "15717", + "title": "[FIX] Apply server side filters on Livechat lists", + "userLogin": "renatobecker", + "milestone": "2.3.0", + "contributors": [ + "renatobecker" + ] + }, + { + "pr": "15729", + "title": "Update moment-timezone", + "userLogin": "sampaiodiego", "contributors": [ - "MarcosSpessatto" + "sampaiodiego" ] }, { - "pr": "15119", - "title": "[FIX] Custom emoji table scroll", + "pr": "15728", + "title": "LingoHub based on develop", + "userLogin": "engelgabriel", + "contributors": [ + "sampaiodiego" + ] + }, + { + "pr": "15654", + "title": "[FIX] Error when exporting user data", + "userLogin": "pierre-lehnen-rc", + "contributors": [ + "pierre-lehnen-rc" + ] + }, + { + "pr": "15699", + "title": "[FIX] Livechat webhook broken when sending an image", + "userLogin": "tatosjb", + "milestone": "2.3.0", + "contributors": [ + "tatosjb" + ] + }, + { + "pr": "15716", + "title": "[IMPROVE] remove computations inside messageAttachment", "userLogin": "ggazzo", - "milestone": "1.3.1", + "milestone": "2.3.0", + "contributors": [ + "ggazzo", + "web-flow" + ] + }, + { + "pr": "15707", + "title": "[FIX] Sending messages to livechat rooms without a subscription", + "userLogin": "renatobecker", + "milestone": "2.3.0", + "contributors": [ + "renatobecker" + ] + }, + { + "pr": "15709", + "title": "Regression: Fix hide avatars in side bar preference", + "userLogin": "MartinSchoeler", "contributors": [ + "MartinSchoeler" + ] + }, + { + "pr": "15679", + "title": "[IMPROVE] Replace snippetedMessage publication by REST", + "userLogin": "MarcosSpessatto", + "milestone": "2.3.0", + "contributors": [ + "MarcosSpessatto", + "pierre-lehnen-rc", "ggazzo" ] }, { - "pr": "15114", - "title": "[FIX] Direct Message names not visible on Admin panel", + "pr": "15678", + "title": "[IMPROVE] Replace snipptedMessages publication by REST", + "userLogin": "MarcosSpessatto", + "milestone": "2.3.0", + "contributors": [ + "MarcosSpessatto", + "pierre-lehnen-rc" + ] + }, + { + "pr": "15694", + "title": "[FIX] Duplicate label 'Hide Avatars' in accounts", + "userLogin": "rajvaibhavdubey", + "contributors": [ + "rajvaibhavdubey" + ] + }, + { + "pr": "15623", + "title": "[FIX] Block Show_Setup_Wizard Option", + "userLogin": "gabriellsh", + "milestone": "2.3.0", + "contributors": [ + "gabriellsh", + "web-flow", + "MartinSchoeler", + "sampaiodiego" + ] + }, + { + "pr": "15512", + "title": "[NEW] add delete-own-message permission", "userLogin": "ggazzo", - "milestone": "1.3.1", + "milestone": "2.3.0", "contributors": [ "ggazzo", + "web-flow" + ] + }, + { + "pr": "15636", + "title": "[FIX] Use Media Devices API to guess if a microphone is not available", + "userLogin": "tassoevan", + "milestone": "2.3.0", + "contributors": [ + "tassoevan" + ] + }, + { + "pr": "15689", + "title": "Remove yarn.lock", + "userLogin": "sampaiodiego", + "contributors": [ "sampaiodiego" ] + }, + { + "pr": "15631", + "title": "[FIX] Ignore file uploads from message box if text/plain content is being pasted", + "userLogin": "tassoevan", + "milestone": "2.3.0", + "contributors": [ + "tassoevan" + ] + }, + { + "pr": "15688", + "title": "LingoHub based on develop", + "userLogin": "engelgabriel", + "contributors": [ + "rodrigok" + ] + }, + { + "pr": "15645", + "title": "[FIX] typo on PT-BR translation", + "userLogin": "MartinSchoeler", + "milestone": "2.3.0", + "contributors": [ + "MartinSchoeler" + ] + }, + { + "pr": "15638", + "title": "[FIX] Null value at Notifications Preferences tab", + "userLogin": "tassoevan", + "milestone": "2.3.0", + "contributors": [ + "tassoevan" + ] + }, + { + "pr": "15640", + "title": "[FIX] Edit in thread", + "userLogin": "tassoevan", + "milestone": "2.3.0", + "contributors": [ + "tassoevan" + ] + }, + { + "pr": "15658", + "title": "[IMPROVE] Remove \"EmojiCustom\" unused subscription", + "userLogin": "MarcosSpessatto", + "milestone": "2.3.0", + "contributors": [ + "MarcosSpessatto" + ] + }, + { + "pr": "15683", + "title": "Merge master into develop & Set version to 2.3.0-develop", + "userLogin": "rodrigok", + "contributors": [ + "rodrigok", + "web-flow" + ] + }, + { + "pr": "15794", + "title": "[FIX] Markdown link parser", + "userLogin": "ggazzo", + "milestone": "2.3.0", + "contributors": [ + "ggazzo", + "web-flow" + ] + }, + { + "pr": "15814", + "title": "[FIX] Updating an app via \"Update\" button errors out with \"App already exists\"", + "userLogin": "d-gubert", + "contributors": [ + "d-gubert" + ] + }, + { + "pr": "15681", + "title": "Release 2.2.0", + "userLogin": "rodrigok", + "contributors": [ + "sampaiodiego", + "web-flow", + "tassoevan", + "ggazzo", + "engelgabriel", + "mar-v", + "rodrigok", + "MarcosSpessatto", + "hmagarotto", + "renatobecker", + "oguhpereira", + "rodrigokamada", + "Montel", + "antkaz", + "yusukeh0710", + "nstseek", + "d-gubert" + ] } ] }, - "1.3.2": { - "node_version": "8.11.4", - "npm_version": "6.4.1", + "2.3.0-rc.1": { + "node_version": "8.15.1", + "npm_version": "6.9.0", "mongo_versions": [ - "3.2", "3.4", "3.6", "4.0" ], "pull_requests": [ { - "pr": "15172", - "title": "[FIX] Attachment download button behavior", - "userLogin": "tassoevan", - "milestone": "1.3.2", + "pr": "15869", + "title": "Fix Livechat duplicated templates error", + "userLogin": "renatobecker", + "milestone": "2.3.0", "contributors": [ - "tassoevan", + "renatobecker", "sampaiodiego" ] }, { - "pr": "15175", - "title": "[FIX] Messages search scroll", - "userLogin": "ggazzo", - "milestone": "1.3.2", + "pr": "15870", + "title": "Improvements to random password field on user edit/creation", + "userLogin": "pierre-lehnen-rc", "contributors": [ - "ggazzo" + "pierre-lehnen-rc" ] }, { - "pr": "15157", - "title": "[FIX] IE11 - callback createTreeWalker doesnt accept acceptNode", - "userLogin": "ggazzo", - "milestone": "1.3.2", + "pr": "15860", + "title": "Remove unused permission to reset users' E2E key", + "userLogin": "pierre-lehnen-rc", + "contributors": [ + "pierre-lehnen-rc" + ] + }, + { + "pr": "15849", + "title": "[CHORE] Add lingohub to readme", + "userLogin": "MartinSchoeler", + "contributors": [ + "MartinSchoeler" + ] + } + ] + }, + "2.3.0": { + "node_version": "8.15.1", + "npm_version": "6.9.0", + "mongo_versions": [ + "3.4", + "3.6", + "4.0" + ], + "pull_requests": [ + { + "pr": "15681", + "title": "Release 2.2.0", + "userLogin": "rodrigok", "contributors": [ + "sampaiodiego", + "web-flow", + "tassoevan", "ggazzo", + "engelgabriel", + "mar-v", + "rodrigok", + "MarcosSpessatto", + "hmagarotto", + "renatobecker", + "oguhpereira", + "rodrigokamada", + "Montel", + "antkaz", + "yusukeh0710", + "nstseek", + "d-gubert" + ] + } + ] + }, + "2.3.1": { + "node_version": "8.15.1", + "npm_version": "6.9.0", + "mongo_versions": [ + "3.4", + "3.6", + "4.0" + ], + "pull_requests": [ + { + "pr": "15898", + "title": "[FIX] Default value of the Livechat WebhookUrl setting", + "userLogin": "renatobecker", + "milestone": "2.3.1", + "contributors": [ + "renatobecker" + ] + }, + { + "pr": "15937", + "title": "[FIX] Admin menu not showing after renamed integration permissions", + "userLogin": "n-se", + "milestone": "2.3.1", + "contributors": [ + "n-se" + ] + }, + { + "pr": "15934", + "title": "[FIX] Administration UI issues", + "userLogin": "tassoevan", + "milestone": "2.3.1", + "contributors": [ "tassoevan" ] }, { - "pr": "15173", - "title": "Update latest Livechat widget version to 1.1.4", + "pr": "15915", + "title": "[FIX] Livechat permissions being overwrite on server restart", "userLogin": "renatobecker", - "milestone": "1.3.2", + "milestone": "2.3.1", "contributors": [ "renatobecker" ] }, { - "pr": "15154", - "title": "Update latest Livechat widget version(1.1.3)", + "pr": "15897", + "title": "[FIX] Livechat triggers not firing", "userLogin": "renatobecker", - "milestone": "1.3.2", + "milestone": "2.3.1", "contributors": [ - "renatobecker", + "renatobecker" + ] + }, + { + "pr": "15895", + "title": "[FIX] Auto load image user preference", + "userLogin": "ggazzo", + "milestone": "2.3.1", + "contributors": [ + "ggazzo", "web-flow" ] } ] + }, + "2.3.2": { + "node_version": "8.15.1", + "npm_version": "6.9.0", + "mongo_versions": [ + "3.4", + "3.6", + "4.0" + ], + "pull_requests": [ + { + "pr": "15957", + "title": "[FIX] Invalid Redirect URI on Custom OAuth", + "userLogin": "pierre-lehnen-rc", + "milestone": "2.3.2", + "contributors": [ + "pierre-lehnen-rc" + ] + }, + { + "pr": "15966", + "title": "[FIX] Livechat Widget version 1.3.0", + "userLogin": "renatobecker", + "milestone": "2.3.2", + "contributors": [ + "renatobecker" + ] + } + ] } } } \ No newline at end of file diff --git a/.meteor/packages b/.meteor/packages index eefefd7c8084..263feae546d3 100644 --- a/.meteor/packages +++ b/.meteor/packages @@ -51,7 +51,6 @@ konecty:user-presence deepwell:bootstrap-datepicker2 dispatch:run-as-user -francocatena:status jalik:ufs jalik:ufs-gridfs jparker:gravatar @@ -71,8 +70,7 @@ rocketchat:push raix:ui-dropped-event todda00:friendly-slugs -tap:i18n - +rocketchat:tap-i18n underscore@1.0.10 juliancwirko:postcss littledata:synced-cron diff --git a/.meteor/versions b/.meteor/versions index d56d3c0bca48..4f242ffbf31d 100644 --- a/.meteor/versions +++ b/.meteor/versions @@ -45,7 +45,6 @@ es5-shim@4.8.0 facebook-oauth@1.6.0 fastclick@1.0.13 fetch@0.1.1 -francocatena:status@1.5.3 geojson-utils@1.0.10 github-oauth@1.2.2 google-oauth@1.2.6 @@ -70,7 +69,7 @@ konecty:change-case@2.3.0 konecty:delayed-task@1.0.0 konecty:mongo-counter@0.0.5_3 konecty:multiple-instances-status@1.1.0 -konecty:user-presence@2.5.0 +konecty:user-presence@2.6.0 launch-screen@1.1.1 less@2.8.0 littledata:synced-cron@1.5.1 @@ -130,6 +129,7 @@ rocketchat:mongo-config@0.0.1 rocketchat:oauth2-server@2.1.0 rocketchat:push@3.3.1 rocketchat:streamer@1.0.2 +rocketchat:tap-i18n@1.9.1 rocketchat:version@1.0.0 routepolicy@1.1.0 service-configuration@1.0.11 @@ -142,7 +142,6 @@ spacebars@1.0.15 spacebars-compiler@1.1.3 srp@1.0.12 standard-minifier-js@2.4.1 -tap:i18n@1.8.2 templating@1.3.2 templating-compiler@1.3.3 templating-runtime@1.3.2 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/.scripts/fix-i18n.js b/.scripts/fix-i18n.js index ad8210d7cd33..4fcee9731b9f 100644 --- a/.scripts/fix-i18n.js +++ b/.scripts/fix-i18n.js @@ -26,4 +26,3 @@ const fixFiles = (path, source, newlineAtEnd = false) => { }; fixFiles('./packages/rocketchat-i18n', '/i18n/en.i18n.json'); -fixFiles('./packages/rocketchat-livechat/.app/i18n', '/en.i18n.json'); diff --git a/.scripts/npm-postinstall.js b/.scripts/npm-postinstall.js index 434539109341..b8362a2401de 100644 --- a/.scripts/npm-postinstall.js +++ b/.scripts/npm-postinstall.js @@ -9,5 +9,3 @@ execSync('mkdir -p public/fonts/'); execSync('cp node_modules/katex/dist/fonts/* public/fonts/'); execSync('cp node_modules/pdfjs-dist/build/pdf.worker.min.js public/'); - -execSync('cd packages/rocketchat-livechat/.app && (meteor npm install || npm install) && cd -'); diff --git a/.scripts/deploy-assistify-chat.sh b/.scripts/publish-build.sh similarity index 99% rename from .scripts/deploy-assistify-chat.sh rename to .scripts/publish-build.sh index 4cef116e21f9..c4d74e5c60c3 100755 --- a/.scripts/deploy-assistify-chat.sh +++ b/.scripts/publish-build.sh @@ -45,7 +45,7 @@ if [ ${BRANCH} = master ] TARGET_ENVIRONMENT_TAG="production" DEPLOYMENT_TARGET_ENVIRONMENT="prd" IMAGE_TAG="latest" - + # publish a new "latest"-file in order to make new clients be created with it aws s3 cp ${BUILD_FILE} s3://${AWS_BUCKET}/rocketchat/rocket-chat-latest.tar.tgz --region ${AWS_REGION} --acl bucket-owner-full-control @@ -62,4 +62,4 @@ aws s3api put-object-tagging --region ${AWS_REGION} --bucket ${AWS_BUCKET} --key # Notify the Lambda triggering our cluster deployment -[[ ! -z "$DEPLOYMENT_TARGET_ENVIRONMENT" ]] && curl -X POST ${DEPLOYMENT_URL} -H "accept: application/json" -H "TOKEN: ${DEPLOYMENT_API_KEY}" -H "Content-Type: application/json" -d "{\"gitlab_token\":\"${DEPLOYMENT_GITLAB_TOKEN}\",\"target_environment\":\"${DEPLOYMENT_TARGET_ENVIRONMENT}\",\"image_tag\":\"${IMAGE_TAG}\"}" \ No newline at end of file +[[ ! -z "$DEPLOYMENT_TARGET_ENVIRONMENT" ]] && curl -X POST ${DEPLOYMENT_URL} -H "accept: application/json" -H "TOKEN: ${DEPLOYMENT_API_KEY}" -H "Content-Type: application/json" -d "{\"gitlab_token\":\"${DEPLOYMENT_GITLAB_TOKEN}\",\"target_environment\":\"${DEPLOYMENT_TARGET_ENVIRONMENT}\",\"image_tag\":\"${IMAGE_TAG}\"}" diff --git a/.scripts/separateTesting.sh b/.scripts/separateTesting.sh index 47e477bb5465..43abdff24bf0 100755 --- a/.scripts/separateTesting.sh +++ b/.scripts/separateTesting.sh @@ -3,21 +3,26 @@ tmpPath=tests/end-to-end/temporary_staged_test rm -rf $tmpPath mkdir -p $tmpPath [ -z "$RETRY_TESTS" ] && RETRY_TESTS=1 -for file in tests/end-to-end/*/*.js; do - failed=1 - for i in `seq 1 $RETRY_TESTS`; do - echo '-------------- '$i' try ---------------' - set -x - cp $file $tmpPath - CHIMP_PATH=$tmpPath npm run chimp-path - failed=$? - set +x - if [ $failed -eq 0 ]; then - break + +paths=("tests/end-to-end/ui/*.js" "tests/end-to-end/ui_smarti/*.js") +for path in ${paths}; do + + for file in $path; do + failed=1 + for i in `seq 1 $RETRY_TESTS`; do + echo '-------------- '$i' try ---------------' + set -x + cp $file $tmpPath + CHIMP_PATH=$tmpPath npm run chimp-path + failed=$? + set +x + if [ $failed -eq 0 ]; then + break + fi + done + if [ $failed -ne 0 ]; then + exit 1 fi + rm $tmpPath/${file##*/} done - if [ $failed -ne 0 ]; then - exit 1 - fi - rm $tmpPath/${file##*/} done diff --git a/.snapcraft/resources/prepareRocketChat b/.snapcraft/resources/prepareRocketChat index ac352ebda9f7..0f54d5842f9c 100755 --- a/.snapcraft/resources/prepareRocketChat +++ b/.snapcraft/resources/prepareRocketChat @@ -28,3 +28,5 @@ execstack --clear-execstack npm/node_modules/sharp/vendor/lib/librsvg-2.so* # Having to manually remove because of latest warning rm -rf npm/node_modules/meteor/konecty_user-presence/node_modules/colors/lib/.colors.js.swp +rm -rf node_modules/node-pre-gyp/node_modules/tar/lib/.mkdir.js.swp + diff --git a/.snapcraft/resources/startRocketChat b/.snapcraft/resources/startRocketChat index b39e22742a73..35898d0e3152 100755 --- a/.snapcraft/resources/startRocketChat +++ b/.snapcraft/resources/startRocketChat @@ -25,11 +25,13 @@ function start_rocketchat { export OVERWRITE_SETTING_Site_Url=$siteurl fi - for filename in $SNAP_COMMON/*.env; do - while read env_var; do - export "$env_var" - done < $filename - done + if ls $SNAP_COMMON/*.env >/dev/null 2>&1; then + for filename in $SNAP_COMMON/*.env; do + while read env_var; do + export "$env_var" + done < $filename + done + fi node $SNAP/main.js } diff --git a/.storybook/.babelrc b/.storybook/.babelrc new file mode 100644 index 000000000000..3f856fec45fb --- /dev/null +++ b/.storybook/.babelrc @@ -0,0 +1,18 @@ +{ + "presets": [ + [ + "@babel/preset-env", + { + "shippedProposals": true, + "useBuiltIns": "usage", + "corejs": "3", + "modules": "commonjs", + } + ], + "@babel/preset-react", + "@babel/preset-flow" + ], + "plugins": [ + "@babel/plugin-proposal-class-properties" + ] +} diff --git a/.storybook/addons.js b/.storybook/addons.js new file mode 100644 index 000000000000..9d64a3d0a8f3 --- /dev/null +++ b/.storybook/addons.js @@ -0,0 +1,4 @@ +import '@storybook/addon-actions/register'; +import '@storybook/addon-knobs/register'; +import '@storybook/addon-links/register'; +import '@storybook/addon-viewport/register'; diff --git a/.storybook/config.js b/.storybook/config.js new file mode 100644 index 000000000000..5de80993cf9f --- /dev/null +++ b/.storybook/config.js @@ -0,0 +1,49 @@ +import { action } from '@storybook/addon-actions'; +import { withKnobs }from '@storybook/addon-knobs'; +import { MINIMAL_VIEWPORTS, INITIAL_VIEWPORTS } from '@storybook/addon-viewport/dist/defaults'; +import { addDecorator, addParameters, configure } from '@storybook/react'; +import React from 'react'; + +import { ConnectionStatusProvider } from '../client/components/providers/ConnectionStatusProvider.mock'; +import { TranslationProvider } from '../client/components/providers/TranslationProvider.mock'; + +addParameters({ + viewport: { + viewports: { + ...MINIMAL_VIEWPORTS, + ...INITIAL_VIEWPORTS, + }, + defaultViewport: 'responsive', + }, +}) + +addDecorator(function RocketChatDecorator(fn) { + const linkElement = document.getElementById('theme-styles') || document.createElement('link'); + if (linkElement.id !== 'theme-styles') { + require('../app/theme/client/main.css'); + require('../app/theme/client/vendor/fontello/css/fontello.css'); + require('../client/RocketChat.font.css'); + linkElement.setAttribute('id', 'theme-styles'); + linkElement.setAttribute('rel', 'stylesheet'); + linkElement.setAttribute('href', 'https://open.rocket.chat/theme.css'); + document.head.appendChild(linkElement); + } + + return + + +
+
+ {fn()} +
+ + ; +}); + +addDecorator(withKnobs); + +configure(require.context('../client', true, /\.stories\.js$/), module); diff --git a/.storybook/empty.js b/.storybook/empty.js new file mode 100644 index 000000000000..ff8b4c56321a --- /dev/null +++ b/.storybook/empty.js @@ -0,0 +1 @@ +export default {}; diff --git a/.storybook/helpers.js b/.storybook/helpers.js new file mode 100644 index 000000000000..63e4e038a444 --- /dev/null +++ b/.storybook/helpers.js @@ -0,0 +1 @@ +export const dummyDate = new Date(2015, 4, 19); diff --git a/.storybook/meteor.js b/.storybook/meteor.js new file mode 100644 index 000000000000..13f507c7ef32 --- /dev/null +++ b/.storybook/meteor.js @@ -0,0 +1,74 @@ +export const Meteor = { + isClient: true, + isServer: false, + _localStorage: window.localStorage, + absoluteUrl: () => {}, + userId: () => {}, + Streamer: () => {}, + startup: () => {}, + methods: () => {}, + call: () => {}, +}; + +Meteor.absoluteUrl.defaultOptions = {}; + +export const Tracker = { + autorun: () => ({ + stop: () => {}, + }), + nonreactive: (fn) => fn(), + Dependency: () => {}, +}; + +export const Accounts = {}; + +export const Mongo = { + Collection: () => ({ + find: () => ({ + observe: () => {}, + fetch: () => [], + }) + }), +}; + +export const ReactiveVar = () => ({ + get: () => {}, + set: () => {}, +}); + +export const ReactiveDict = () => ({ + get: () => {}, + set: () => {}, + all: () => {}, +}); + +export const Template = () => ({ + onCreated: () => {}, + onRendered: () => {}, + onDestroyed: () => {}, + helpers: () => {}, + events: () => {}, +}); + +Template.registerHelper = () => {}; +Template.__checkName = () => {}; + +export const Blaze = { + Template, + registerHelper: () => {}, +}; + +window.Blaze = Blaze; + +export const check = () => {}; + +export const FlowRouter = { + route: () => {} +}; + +export const BlazeLayout = {}; + +export const Session = { + get: () => {}, + set: () => {}, +}; diff --git a/.storybook/webpack.config.js b/.storybook/webpack.config.js new file mode 100644 index 000000000000..b9d6efb821d6 --- /dev/null +++ b/.storybook/webpack.config.js @@ -0,0 +1,48 @@ +'use strict'; + +const path = require('path'); + +const webpack = require('webpack'); + +module.exports = async ({ config }) => { + const cssRule = config.module.rules.find(({ test }) => test.test('index.css')); + + cssRule.use[2].options.plugins = [ + require('postcss-custom-properties')({ preserve: true }), + require('postcss-media-minmax')(), + require('postcss-selector-not')(), + require('postcss-nested')(), + require('autoprefixer')(), + require('postcss-url')({ url: ({ absolutePath, relativePath, url }) => { + const absoluteDir = absolutePath.slice(0, -relativePath.length); + const relativeDir = path.relative(absoluteDir, path.resolve(__dirname, '../public')); + const newPath = path.join(relativeDir, url); + return newPath; + } }), + ]; + + config.module.rules.push({ + test: /\.info$/, + type: 'json', + }); + + config.module.rules.push({ + test: /\.html$/, + use: '@settlin/spacebars-loader', + }); + + config.plugins.push(new webpack.NormalModuleReplacementPlugin( + /^meteor/, + require.resolve('./meteor.js'), + )); + + config.plugins.push(new webpack.NormalModuleReplacementPlugin( + /\.\/server\/index.js/, + require.resolve('./empty.js'), + )); + + config.mode = 'development'; + config.optimization.usedExports = true; + + return config; +}; diff --git a/.travis/snap.sh b/.travis/snap.sh index 83a17c0fcf81..f548e5961d26 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=1.3.2 + RC_VERSION=2.3.2 fi echo "Preparing to trigger a snap release for $CHANNEL channel" diff --git a/HISTORY.md b/HISTORY.md index ead7766b7bb5..4216268cd744 100644 --- a/HISTORY.md +++ b/HISTORY.md @@ -1,3 +1,644 @@ + +# 2.3.2 +`2019-12-12 · 2 🐛 · 2 👩‍💻👨‍💻` + +### Engine versions +- Node: `8.15.1` +- NPM: `6.9.0` +- MongoDB: `3.4, 3.6, 4.0` + +### 🐛 Bug fixes + +- Invalid Redirect URI on Custom OAuth ([#15957](https://github.com/RocketChat/Rocket.Chat/pull/15957)) +- Livechat Widget version 1.3.0 ([#15966](https://github.com/RocketChat/Rocket.Chat/pull/15966)) + +### 👩‍💻👨‍💻 Core Team 🤓 + +- [@pierre-lehnen-rc](https://github.com/pierre-lehnen-rc) +- [@renatobecker](https://github.com/renatobecker) + +# 2.3.1 +`2019-12-09 · 6 🐛 · 4 👩‍💻👨‍💻` + +### Engine versions +- Node: `8.15.1` +- NPM: `6.9.0` +- MongoDB: `3.4, 3.6, 4.0` + +### 🐛 Bug fixes + +- Default value of the Livechat WebhookUrl setting ([#15898](https://github.com/RocketChat/Rocket.Chat/pull/15898)) +- Admin menu not showing after renamed integration permissions ([#15937](https://github.com/RocketChat/Rocket.Chat/pull/15937) by [@n-se](https://github.com/n-se)) +- Administration UI issues ([#15934](https://github.com/RocketChat/Rocket.Chat/pull/15934)) +- Livechat permissions being overwrite on server restart ([#15915](https://github.com/RocketChat/Rocket.Chat/pull/15915)) +- Livechat triggers not firing ([#15897](https://github.com/RocketChat/Rocket.Chat/pull/15897)) +- Auto load image user preference ([#15895](https://github.com/RocketChat/Rocket.Chat/pull/15895)) + +### 👩‍💻👨‍💻 Contributors 😍 + +- [@n-se](https://github.com/n-se) + +### 👩‍💻👨‍💻 Core Team 🤓 + +- [@ggazzo](https://github.com/ggazzo) +- [@renatobecker](https://github.com/renatobecker) +- [@tassoevan](https://github.com/tassoevan) + +# 2.3.0 +`2019-11-27 · 13 🎉 · 17 🚀 · 26 🐛 · 19 🔍 · 25 👩‍💻👨‍💻` + +### Engine versions +- Node: `8.15.1` +- NPM: `6.9.0` +- MongoDB: `3.4, 3.6, 4.0` + +### 🎉 New features + +- Add forms to view and edit Livechat agents info ([#15703](https://github.com/RocketChat/Rocket.Chat/pull/15703)) +- Workspace Manual Registration ([#15442](https://github.com/RocketChat/Rocket.Chat/pull/15442)) +- Option on livechat departments to ensure a chat has tags before closing ([#15752](https://github.com/RocketChat/Rocket.Chat/pull/15752)) +- Setting to dismiss desktop notification only after interaction ([#14807](https://github.com/RocketChat/Rocket.Chat/pull/14807) by [@mpdbl](https://github.com/mpdbl)) +- Option for admins to set a random password to a user ([#15818](https://github.com/RocketChat/Rocket.Chat/pull/15818)) +- SAML login without popup windows ([#15836](https://github.com/RocketChat/Rocket.Chat/pull/15836)) +- Add ability to users reset their own E2E key ([#15777](https://github.com/RocketChat/Rocket.Chat/pull/15777)) +- Notify users when their email address change ([#15828](https://github.com/RocketChat/Rocket.Chat/pull/15828)) +- Add a new stream to emit and listen room data events ([#15770](https://github.com/RocketChat/Rocket.Chat/pull/15770)) +- Livechat analytics ([#15230](https://github.com/RocketChat/Rocket.Chat/pull/15230)) +- Allow Regexes on SAML user field mapping ([#15743](https://github.com/RocketChat/Rocket.Chat/pull/15743)) +- Livechat analytics functions ([#15666](https://github.com/RocketChat/Rocket.Chat/pull/15666)) +- add delete-own-message permission ([#15512](https://github.com/RocketChat/Rocket.Chat/pull/15512)) + +### 🚀 Improvements + +- Make push notification batchsize and interval configurable ([#15804](https://github.com/RocketChat/Rocket.Chat/pull/15804) by [@Exordian](https://github.com/Exordian)) +- Add more fields to iframe integration event `unread-changed-by-subscription` ([#15786](https://github.com/RocketChat/Rocket.Chat/pull/15786)) +- Allow dragging of images and text from browsers ([#15691](https://github.com/RocketChat/Rocket.Chat/pull/15691)) +- Unfollow own threads ([#15740](https://github.com/RocketChat/Rocket.Chat/pull/15740)) +- Administration UI - React and Fuselage components ([#15452](https://github.com/RocketChat/Rocket.Chat/pull/15452)) +- Replace livechat:pagesvisited publication by REST ([#15629](https://github.com/RocketChat/Rocket.Chat/pull/15629)) +- Replace livechat:externalMessages publication by REST ([#15643](https://github.com/RocketChat/Rocket.Chat/pull/15643)) +- dynamic import livechat views ([#15775](https://github.com/RocketChat/Rocket.Chat/pull/15775)) +- Replace livechat:visitorInfo publication by REST ([#15639](https://github.com/RocketChat/Rocket.Chat/pull/15639)) +- Lazyload Chart.js ([#15764](https://github.com/RocketChat/Rocket.Chat/pull/15764)) +- Lazyload qrcode lib ([#15741](https://github.com/RocketChat/Rocket.Chat/pull/15741)) +- Replace personalAccessTokens publication by REST ([#15644](https://github.com/RocketChat/Rocket.Chat/pull/15644)) +- Replace livechat:departmentAgents subscription to REST ([#15529](https://github.com/RocketChat/Rocket.Chat/pull/15529)) +- remove computations inside messageAttachment ([#15716](https://github.com/RocketChat/Rocket.Chat/pull/15716)) +- Replace snippetedMessage publication by REST ([#15679](https://github.com/RocketChat/Rocket.Chat/pull/15679)) +- Replace snipptedMessages publication by REST ([#15678](https://github.com/RocketChat/Rocket.Chat/pull/15678)) +- Remove "EmojiCustom" unused subscription ([#15658](https://github.com/RocketChat/Rocket.Chat/pull/15658)) + +### 🐛 Bug fixes + +- Missing Privacy Policy Agree on register ([#15832](https://github.com/RocketChat/Rocket.Chat/pull/15832)) +- Push: fix notification priority for google (FCM) ([#15803](https://github.com/RocketChat/Rocket.Chat/pull/15803) by [@Exordian](https://github.com/Exordian)) +- Not valid relative URLs on message attachments ([#15651](https://github.com/RocketChat/Rocket.Chat/pull/15651)) +- REST endpoint `chat.syncMessages` returning an error with deleted messages ([#15824](https://github.com/RocketChat/Rocket.Chat/pull/15824)) +- Channel notification audio preferences ([#15771](https://github.com/RocketChat/Rocket.Chat/pull/15771)) +- Pasting images on reply as thread ([#15811](https://github.com/RocketChat/Rocket.Chat/pull/15811)) +- Prevent agent last message undefined ([#15809](https://github.com/RocketChat/Rocket.Chat/pull/15809)) +- Livechat transfer history messages ([#15780](https://github.com/RocketChat/Rocket.Chat/pull/15780)) +- Add button to reset.css ([#15773](https://github.com/RocketChat/Rocket.Chat/pull/15773)) +- Mentions before blockquote ([#15774](https://github.com/RocketChat/Rocket.Chat/pull/15774)) +- Sidebar font color was not respecting theming ([#15745](https://github.com/RocketChat/Rocket.Chat/pull/15745) by [@mariaeduardacunha](https://github.com/mariaeduardacunha)) +- Add livechat agents into departments ([#15732](https://github.com/RocketChat/Rocket.Chat/pull/15732)) +- Changed cmsPage Style ([#15632](https://github.com/RocketChat/Rocket.Chat/pull/15632) by [@gabriellsh](https://github.com/gabriellsh)) +- Forward Livechat UI and the related permissions ([#15718](https://github.com/RocketChat/Rocket.Chat/pull/15718)) +- line-height to show entire letters ([#15581](https://github.com/RocketChat/Rocket.Chat/pull/15581) by [@nstseek](https://github.com/nstseek)) +- Apply server side filters on Livechat lists ([#15717](https://github.com/RocketChat/Rocket.Chat/pull/15717)) +- Error when exporting user data ([#15654](https://github.com/RocketChat/Rocket.Chat/pull/15654)) +- Livechat webhook broken when sending an image ([#15699](https://github.com/RocketChat/Rocket.Chat/pull/15699) by [@tatosjb](https://github.com/tatosjb)) +- Sending messages to livechat rooms without a subscription ([#15707](https://github.com/RocketChat/Rocket.Chat/pull/15707)) +- Duplicate label 'Hide Avatars' in accounts ([#15694](https://github.com/RocketChat/Rocket.Chat/pull/15694) by [@rajvaibhavdubey](https://github.com/rajvaibhavdubey)) +- Block Show_Setup_Wizard Option ([#15623](https://github.com/RocketChat/Rocket.Chat/pull/15623) by [@gabriellsh](https://github.com/gabriellsh)) +- Use Media Devices API to guess if a microphone is not available ([#15636](https://github.com/RocketChat/Rocket.Chat/pull/15636)) +- Ignore file uploads from message box if text/plain content is being pasted ([#15631](https://github.com/RocketChat/Rocket.Chat/pull/15631)) +- typo on PT-BR translation ([#15645](https://github.com/RocketChat/Rocket.Chat/pull/15645)) +- Null value at Notifications Preferences tab ([#15638](https://github.com/RocketChat/Rocket.Chat/pull/15638)) +- Edit in thread ([#15640](https://github.com/RocketChat/Rocket.Chat/pull/15640)) + +
+🔍 Minor changes + +- Release 2.2.0 ([#15681](https://github.com/RocketChat/Rocket.Chat/pull/15681) by [@Montel](https://github.com/Montel) & [@antkaz](https://github.com/antkaz) & [@hmagarotto](https://github.com/hmagarotto) & [@nstseek](https://github.com/nstseek) & [@oguhpereira](https://github.com/oguhpereira) & [@rodrigokamada](https://github.com/rodrigokamada) & [@yusukeh0710](https://github.com/yusukeh0710)) +- LingoHub based on develop ([#15822](https://github.com/RocketChat/Rocket.Chat/pull/15822)) +- [REGRESSION] Add livechat room type to the room's file list ([#15795](https://github.com/RocketChat/Rocket.Chat/pull/15795)) +- Fix notification migration ([#15783](https://github.com/RocketChat/Rocket.Chat/pull/15783)) +- Regression: fix admin instances info page ([#15772](https://github.com/RocketChat/Rocket.Chat/pull/15772)) +- LingoHub based on develop ([#15763](https://github.com/RocketChat/Rocket.Chat/pull/15763)) +- Regression: messageAttachments inside messageAttachments not receiving settings ([#15733](https://github.com/RocketChat/Rocket.Chat/pull/15733)) +- Improve LDAP Login Fallback setting description in portuguese ([#15655](https://github.com/RocketChat/Rocket.Chat/pull/15655)) +- Update moment-timezone ([#15729](https://github.com/RocketChat/Rocket.Chat/pull/15729)) +- LingoHub based on develop ([#15728](https://github.com/RocketChat/Rocket.Chat/pull/15728)) +- Regression: Fix hide avatars in side bar preference ([#15709](https://github.com/RocketChat/Rocket.Chat/pull/15709)) +- Remove yarn.lock ([#15689](https://github.com/RocketChat/Rocket.Chat/pull/15689)) +- LingoHub based on develop ([#15688](https://github.com/RocketChat/Rocket.Chat/pull/15688)) +- Merge master into develop & Set version to 2.3.0-develop ([#15683](https://github.com/RocketChat/Rocket.Chat/pull/15683)) +- Release 2.2.0 ([#15681](https://github.com/RocketChat/Rocket.Chat/pull/15681) by [@Montel](https://github.com/Montel) & [@antkaz](https://github.com/antkaz) & [@hmagarotto](https://github.com/hmagarotto) & [@nstseek](https://github.com/nstseek) & [@oguhpereira](https://github.com/oguhpereira) & [@rodrigokamada](https://github.com/rodrigokamada) & [@yusukeh0710](https://github.com/yusukeh0710)) +- Fix Livechat duplicated templates error ([#15869](https://github.com/RocketChat/Rocket.Chat/pull/15869)) +- Improvements to random password field on user edit/creation ([#15870](https://github.com/RocketChat/Rocket.Chat/pull/15870)) +- Remove unused permission to reset users' E2E key ([#15860](https://github.com/RocketChat/Rocket.Chat/pull/15860)) +- [CHORE] Add lingohub to readme ([#15849](https://github.com/RocketChat/Rocket.Chat/pull/15849)) + +
+ +### 👩‍💻👨‍💻 Contributors 😍 + +- [@Exordian](https://github.com/Exordian) +- [@Montel](https://github.com/Montel) +- [@antkaz](https://github.com/antkaz) +- [@gabriellsh](https://github.com/gabriellsh) +- [@hmagarotto](https://github.com/hmagarotto) +- [@mariaeduardacunha](https://github.com/mariaeduardacunha) +- [@mpdbl](https://github.com/mpdbl) +- [@nstseek](https://github.com/nstseek) +- [@oguhpereira](https://github.com/oguhpereira) +- [@rajvaibhavdubey](https://github.com/rajvaibhavdubey) +- [@rodrigokamada](https://github.com/rodrigokamada) +- [@tatosjb](https://github.com/tatosjb) +- [@yusukeh0710](https://github.com/yusukeh0710) + +### 👩‍💻👨‍💻 Core Team 🤓 + +- [@MarcosSpessatto](https://github.com/MarcosSpessatto) +- [@MartinSchoeler](https://github.com/MartinSchoeler) +- [@d-gubert](https://github.com/d-gubert) +- [@engelgabriel](https://github.com/engelgabriel) +- [@geekgonecrazy](https://github.com/geekgonecrazy) +- [@ggazzo](https://github.com/ggazzo) +- [@mar-v](https://github.com/mar-v) +- [@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.2.1 +`2019-11-19` + +### Engine versions +- Node: `8.15.1` +- NPM: `6.9.0` +- MongoDB: `3.4, 3.6, 4.0` + +# 2.2.0 +`2019-10-27 · 14 🎉 · 16 🚀 · 22 🐛 · 27 🔍 · 27 👩‍💻👨‍💻` + +### Engine versions +- Node: `8.15.1` +- NPM: `6.9.0` +- MongoDB: `3.4, 3.6, 4.0` + +### 🎉 New features + +- Accept GIFs and SVGs for Avatars converting them to PNG and keep transparency of PNGs ([#11385](https://github.com/RocketChat/Rocket.Chat/pull/11385)) +- Thread support to apps slashcommands and slashcommand previews ([#15574](https://github.com/RocketChat/Rocket.Chat/pull/15574)) +- Remove all closed Livechat chats ([#13991](https://github.com/RocketChat/Rocket.Chat/pull/13991) by [@knrt10](https://github.com/knrt10)) +- Separate integration roles ([#13902](https://github.com/RocketChat/Rocket.Chat/pull/13902)) +- Add users.requestDataDownload API endpoint ([#14428](https://github.com/RocketChat/Rocket.Chat/pull/14428) by [@Hudell](https://github.com/Hudell) & [@ubarsaiyan](https://github.com/ubarsaiyan)) +- Check if agent can receive new livechat conversations when its status is away/idle ([#15451](https://github.com/RocketChat/Rocket.Chat/pull/15451)) +- Import SAML language and auto join SAML channels ([#14203](https://github.com/RocketChat/Rocket.Chat/pull/14203) by [@Hudell](https://github.com/Hudell) & [@unixtam](https://github.com/unixtam)) +- Add option to enable X-Frame-options header to avoid loading inside any Iframe ([#14698](https://github.com/RocketChat/Rocket.Chat/pull/14698)) +- Assign new Livechat conversations to bot agents first ([#15317](https://github.com/RocketChat/Rocket.Chat/pull/15317)) +- Added file type filter to RoomFiles ([#15289](https://github.com/RocketChat/Rocket.Chat/pull/15289) by [@juanpetterson](https://github.com/juanpetterson)) +- Add new Livechat appearance setting to set the conversation finished message ([#15577](https://github.com/RocketChat/Rocket.Chat/pull/15577)) +- close emoji box using Keyboard Escape key ([#13956](https://github.com/RocketChat/Rocket.Chat/pull/13956) by [@mohamedar97](https://github.com/mohamedar97)) +- Update livechat widget version to 1.2.5 ([#15600](https://github.com/RocketChat/Rocket.Chat/pull/15600)) +- Import DMs from CSV files ([#15534](https://github.com/RocketChat/Rocket.Chat/pull/15534)) + +### 🚀 Improvements + +- Replace livechat:integration publication by REST ([#15607](https://github.com/RocketChat/Rocket.Chat/pull/15607)) +- Replace livechat:appearance pub to REST ([#15510](https://github.com/RocketChat/Rocket.Chat/pull/15510)) +- Cache hasPermissions ([#15589](https://github.com/RocketChat/Rocket.Chat/pull/15589)) +- Disable edit visitor's phone number in SMS conversations ([#15593](https://github.com/RocketChat/Rocket.Chat/pull/15593)) +- Lazyload Katex Package ([#15398](https://github.com/RocketChat/Rocket.Chat/pull/15398)) +- Replace `livechat:triggers` publication by REST calls ([#15507](https://github.com/RocketChat/Rocket.Chat/pull/15507)) +- Replace roomFilesWithSearchText subscription ([#15550](https://github.com/RocketChat/Rocket.Chat/pull/15550)) +- Replace starred messages subscription ([#15548](https://github.com/RocketChat/Rocket.Chat/pull/15548)) +- Replace some livechat:rooms subscriptions ([#15532](https://github.com/RocketChat/Rocket.Chat/pull/15532)) +- Replace pinned messages subscription ([#15544](https://github.com/RocketChat/Rocket.Chat/pull/15544)) +- Replace mentionedMessages publication to REST ([#15540](https://github.com/RocketChat/Rocket.Chat/pull/15540)) +- Detach React components from Meteor API ([#15482](https://github.com/RocketChat/Rocket.Chat/pull/15482)) +- Replace livechat:agents pub by REST calls ([#15490](https://github.com/RocketChat/Rocket.Chat/pull/15490)) +- Replace `livechat:departments` publication by REST Calls ([#15478](https://github.com/RocketChat/Rocket.Chat/pull/15478)) +- Secure cookies when using HTTPS connection ([#15500](https://github.com/RocketChat/Rocket.Chat/pull/15500)) +- Update Fuselage components on SetupWizard ([#15457](https://github.com/RocketChat/Rocket.Chat/pull/15457)) + +### 🐛 Bug fixes + +- Issues saving audio notifications ([#15428](https://github.com/RocketChat/Rocket.Chat/pull/15428) by [@scrivna](https://github.com/scrivna)) +- Fix a typo on Alpha API `e2e.setUserPublicAndPivateKeys` renaming to `e2e.setUserPublicAndPrivateKeys` ([#13334](https://github.com/RocketChat/Rocket.Chat/pull/13334)) +- Showing announcement back ([#15615](https://github.com/RocketChat/Rocket.Chat/pull/15615)) +- adjustments for tooltips to show room name instead of id ([#14084](https://github.com/RocketChat/Rocket.Chat/pull/14084) by [@mohamedar97](https://github.com/mohamedar97)) +- Deny editing visitor's phone number in SMS conversations ([#15602](https://github.com/RocketChat/Rocket.Chat/pull/15602)) +- Incorrect display of the button "Invite users" ([#15594](https://github.com/RocketChat/Rocket.Chat/pull/15594)) +- Compact view ([#15416](https://github.com/RocketChat/Rocket.Chat/pull/15416)) +- leak on stdout listeners ([#15586](https://github.com/RocketChat/Rocket.Chat/pull/15586)) +- Self-XSS in validation functionality ([#15564](https://github.com/RocketChat/Rocket.Chat/pull/15564)) +- Registration/login page now mobile friendly (#15422) ([#15520](https://github.com/RocketChat/Rocket.Chat/pull/15520) by [@nstseek](https://github.com/nstseek)) +- Update apps engine rooms converter to use transformMappedData ([#15546](https://github.com/RocketChat/Rocket.Chat/pull/15546)) +- Missing ending slash on publicFilePath of fileUpload ([#15506](https://github.com/RocketChat/Rocket.Chat/pull/15506)) +- Japanese translation for run import ([#15515](https://github.com/RocketChat/Rocket.Chat/pull/15515) by [@yusukeh0710](https://github.com/yusukeh0710)) +- Add a header for the createAt column in the Directory ([#15556](https://github.com/RocketChat/Rocket.Chat/pull/15556) by [@antkaz](https://github.com/antkaz)) +- Method saveUser is not using password policy ([#15445](https://github.com/RocketChat/Rocket.Chat/pull/15445)) +- Add permissions for slashCommands ([#15525](https://github.com/RocketChat/Rocket.Chat/pull/15525) by [@antkaz](https://github.com/antkaz)) +- Typo in autotranslate method ([#15344](https://github.com/RocketChat/Rocket.Chat/pull/15344) by [@Montel](https://github.com/Montel)) +- Adding "Promise.await" in "livechat/message" endpoint ([#15541](https://github.com/RocketChat/Rocket.Chat/pull/15541) by [@rodrigokamada](https://github.com/rodrigokamada)) +- Reset password was allowing empty values leading to an impossibility to login ([#15444](https://github.com/RocketChat/Rocket.Chat/pull/15444)) +- Emoji are rendered in URL ([#15516](https://github.com/RocketChat/Rocket.Chat/pull/15516) by [@oguhpereira](https://github.com/oguhpereira)) +- Promise await for sendMessage in livechat/messages endpoint ([#15460](https://github.com/RocketChat/Rocket.Chat/pull/15460) by [@hmagarotto](https://github.com/hmagarotto)) +- Exposing some fields on server logs at debug level ([#15514](https://github.com/RocketChat/Rocket.Chat/pull/15514)) + +
+🔍 Minor changes + +- Merge master into develop & Set version to 2.2.0-develop ([#15622](https://github.com/RocketChat/Rocket.Chat/pull/15622)) +- [FEATURE] Rest API upload file returns message object ([#13821](https://github.com/RocketChat/Rocket.Chat/pull/13821) by [@knrt10](https://github.com/knrt10)) +- New: Add dev dependency david badge to README ([#9058](https://github.com/RocketChat/Rocket.Chat/pull/9058) by [@robbyoconnor](https://github.com/robbyoconnor)) +- Regression: add stdout publication back ([#15614](https://github.com/RocketChat/Rocket.Chat/pull/15614)) +- Livechat Issues ([#15473](https://github.com/RocketChat/Rocket.Chat/pull/15473)) +- Regression: Fix broken message formatting box ([#15599](https://github.com/RocketChat/Rocket.Chat/pull/15599)) +- [CHORE] Update latest Livechat widget version to 1.2.4 ([#15596](https://github.com/RocketChat/Rocket.Chat/pull/15596)) +- Remove unneeded nginx file ([#15483](https://github.com/RocketChat/Rocket.Chat/pull/15483)) +- [REGRESSION] Fix remove department from list ([#15591](https://github.com/RocketChat/Rocket.Chat/pull/15591)) +- [CHORE] Update latest Livechat widget version to 1.2.2 ([#15592](https://github.com/RocketChat/Rocket.Chat/pull/15592)) +- Revert fix package-lock.json ([#15563](https://github.com/RocketChat/Rocket.Chat/pull/15563)) +- Regression: Fix package-lock.json ([#15561](https://github.com/RocketChat/Rocket.Chat/pull/15561)) +- [CHORE] Split logger classes to avoid cyclic dependencies ([#15559](https://github.com/RocketChat/Rocket.Chat/pull/15559)) +- docs: remove rocket chat launcher link ([#15477](https://github.com/RocketChat/Rocket.Chat/pull/15477) by [@RafaelGSS](https://github.com/RafaelGSS)) +- [CHORE] remove 'bulk-create-c' permission ([#15517](https://github.com/RocketChat/Rocket.Chat/pull/15517) by [@antkaz](https://github.com/antkaz)) +- Reply HTTP requests with `X-XSS-Protection: 1` header ([#15498](https://github.com/RocketChat/Rocket.Chat/pull/15498)) +- Updating license term ([#15476](https://github.com/RocketChat/Rocket.Chat/pull/15476)) +- LingoHub based on develop ([#15487](https://github.com/RocketChat/Rocket.Chat/pull/15487)) +- Merge master into develop & Set version to 2.2.0-develop ([#15469](https://github.com/RocketChat/Rocket.Chat/pull/15469)) +- Regression: hasPermission ignoring subscription roles ([#15652](https://github.com/RocketChat/Rocket.Chat/pull/15652)) +- Regression: AppRoomsConverter on Livechat rooms ([#15646](https://github.com/RocketChat/Rocket.Chat/pull/15646)) +- Regression: fix unknown role breaking hasPermission ([#15641](https://github.com/RocketChat/Rocket.Chat/pull/15641)) +- Regression: Move import to avoid circular dependencies ([#15628](https://github.com/RocketChat/Rocket.Chat/pull/15628)) +- Chore: Add Client Setup Information to Issue Template ([#15625](https://github.com/RocketChat/Rocket.Chat/pull/15625)) +- Move publication deprecation warnings ([#15676](https://github.com/RocketChat/Rocket.Chat/pull/15676)) +- Regression: Remove reference to obsolete template helper ([#15675](https://github.com/RocketChat/Rocket.Chat/pull/15675)) +- Merge master into develop ([#15680](https://github.com/RocketChat/Rocket.Chat/pull/15680) by [@knrt10](https://github.com/knrt10)) + +
+ +### 👩‍💻👨‍💻 Contributors 😍 + +- [@Hudell](https://github.com/Hudell) +- [@Montel](https://github.com/Montel) +- [@RafaelGSS](https://github.com/RafaelGSS) +- [@antkaz](https://github.com/antkaz) +- [@hmagarotto](https://github.com/hmagarotto) +- [@juanpetterson](https://github.com/juanpetterson) +- [@knrt10](https://github.com/knrt10) +- [@mohamedar97](https://github.com/mohamedar97) +- [@nstseek](https://github.com/nstseek) +- [@oguhpereira](https://github.com/oguhpereira) +- [@robbyoconnor](https://github.com/robbyoconnor) +- [@rodrigokamada](https://github.com/rodrigokamada) +- [@scrivna](https://github.com/scrivna) +- [@ubarsaiyan](https://github.com/ubarsaiyan) +- [@unixtam](https://github.com/unixtam) +- [@yusukeh0710](https://github.com/yusukeh0710) + +### 👩‍💻👨‍💻 Core Team 🤓 + +- [@MarcosSpessatto](https://github.com/MarcosSpessatto) +- [@MartinSchoeler](https://github.com/MartinSchoeler) +- [@d-gubert](https://github.com/d-gubert) +- [@geekgonecrazy](https://github.com/geekgonecrazy) +- [@ggazzo](https://github.com/ggazzo) +- [@mar-v](https://github.com/mar-v) +- [@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.1.3 +`2019-11-19` + +### Engine versions +- Node: `8.15.1` +- NPM: `6.9.0` +- MongoDB: `3.4, 3.6, 4.0` + +# 2.1.2 +`2019-10-25 · 3 🐛 · 1 🔍 · 4 👩‍💻👨‍💻` + +### Engine versions +- Node: `8.15.1` +- NPM: `6.9.0` +- MongoDB: `3.4, 3.6, 4.0` + +### 🐛 Bug fixes + +- Read Receipts were not working properly with subscriptions without ls ([#15656](https://github.com/RocketChat/Rocket.Chat/pull/15656)) +- Exception when sending email of messages attachments undefined ([#15657](https://github.com/RocketChat/Rocket.Chat/pull/15657)) +- Channel Announcements not working ([#14635](https://github.com/RocketChat/Rocket.Chat/pull/14635) by [@knrt10](https://github.com/knrt10)) + +
+🔍 Minor changes + +- Release 2.1.2 ([#15667](https://github.com/RocketChat/Rocket.Chat/pull/15667) by [@knrt10](https://github.com/knrt10)) + +
+ +### 👩‍💻👨‍💻 Contributors 😍 + +- [@knrt10](https://github.com/knrt10) + +### 👩‍💻👨‍💻 Core Team 🤓 + +- [@ggazzo](https://github.com/ggazzo) +- [@rodrigok](https://github.com/rodrigok) +- [@tassoevan](https://github.com/tassoevan) + +# 2.1.1 +`2019-10-17 · 2 🐛 · 2 👩‍💻👨‍💻` + +### Engine versions +- Node: `8.15.1` +- NPM: `6.9.0` +- MongoDB: `3.4, 3.6, 4.0` + +### 🐛 Bug fixes + +- Read Recepts was not working ([#15603](https://github.com/RocketChat/Rocket.Chat/pull/15603)) +- Dynamic import of JS files were not working correctly ([#15598](https://github.com/RocketChat/Rocket.Chat/pull/15598)) + +### 👩‍💻👨‍💻 Core Team 🤓 + +- [@ggazzo](https://github.com/ggazzo) +- [@rodrigok](https://github.com/rodrigok) + +# 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.1 +`2019-11-19` + +### Engine versions +- Node: `8.11.4` +- NPM: `6.4.1` +- MongoDB: `3.4, 3.6, 4.0` + +# 2.0.0 +`2019-09-12 · 7 ️️️⚠️ · 14 🎉 · 6 🚀 · 16 🐛 · 36 🔍 · 26 👩‍💻👨‍💻` + +### Engine versions +- Node: `8.11.4` +- NPM: `6.4.1` +- MongoDB: `3.4, 3.6, 4.0` + +### ⚠️ BREAKING CHANGES + +- Federation refactor with addition of chained events ([#15206](https://github.com/RocketChat/Rocket.Chat/pull/15206)) +- Remove support of MongoDB 3.2 and deprecate MongoDB 3.4 ([#15199](https://github.com/RocketChat/Rocket.Chat/pull/15199)) +- Remove GraphQL and grant packages ([#15192](https://github.com/RocketChat/Rocket.Chat/pull/15192)) +- Remove publication `roomSubscriptionsByRole` ([#15193](https://github.com/RocketChat/Rocket.Chat/pull/15193)) +- Remove publication `usersInRole` ([#15194](https://github.com/RocketChat/Rocket.Chat/pull/15194)) +- Remove old livechat client ([#15133](https://github.com/RocketChat/Rocket.Chat/pull/15133)) +- Replace tap:i18n to add support to 3-digit locales ([#15109](https://github.com/RocketChat/Rocket.Chat/pull/15109)) + +### 🎉 New features + +- 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 [@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) 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) 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 [@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) 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)) +- Add possibility to use commands inside threads through Rest API ([#15167](https://github.com/RocketChat/Rocket.Chat/pull/15167)) +- Message tooltips as everyone else ([#15135](https://github.com/RocketChat/Rocket.Chat/pull/15135)) + +### 🐛 Bug fixes + +- Webdav crash ([#14918](https://github.com/RocketChat/Rocket.Chat/pull/14918)) +- 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) 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) 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)) +- cachedcollection calling multiple times SYNC ([#15104](https://github.com/RocketChat/Rocket.Chat/pull/15104)) +- Redirect on app manual install ([#15306](https://github.com/RocketChat/Rocket.Chat/pull/15306)) +- IE11 baseURI ([#15319](https://github.com/RocketChat/Rocket.Chat/pull/15319)) + +
+🔍 Minor changes + +- LingoHub based on develop ([#15218](https://github.com/RocketChat/Rocket.Chat/pull/15218)) +- Regression: fix typo permisson to permission ([#15217](https://github.com/RocketChat/Rocket.Chat/pull/15217)) +- NEW: Apps enable after app installed ([#15202](https://github.com/RocketChat/Rocket.Chat/pull/15202)) +- Change notifications file imports to server ([#15184](https://github.com/RocketChat/Rocket.Chat/pull/15184)) +- Update Livechat to 1.1.6 ([#15186](https://github.com/RocketChat/Rocket.Chat/pull/15186)) +- Regression: remove livechat cache from circle ci ([#15183](https://github.com/RocketChat/Rocket.Chat/pull/15183)) +- Update presence package ([#15178](https://github.com/RocketChat/Rocket.Chat/pull/15178)) +- LingoHub based on develop ([#15166](https://github.com/RocketChat/Rocket.Chat/pull/15166)) +- Switch outdated roadmap to point to milestones ([#15156](https://github.com/RocketChat/Rocket.Chat/pull/15156)) +- Remove GPG file ([#15146](https://github.com/RocketChat/Rocket.Chat/pull/15146)) +- Add wreiske to authorized users in catbot ([#15147](https://github.com/RocketChat/Rocket.Chat/pull/15147)) +- Update to version 2.0.0-develop ([#15142](https://github.com/RocketChat/Rocket.Chat/pull/15142)) +- removed unwanted code ([#15078](https://github.com/RocketChat/Rocket.Chat/pull/15078) by [@httpsOmkar](https://github.com/httpsOmkar)) +- 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) 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)) +- Merge master into develop & Set version to 1.4.0-develop ([#15097](https://github.com/RocketChat/Rocket.Chat/pull/15097)) +- Federation improvements ([#15234](https://github.com/RocketChat/Rocket.Chat/pull/15234)) +- Regression: Fix assets extension detection ([#15231](https://github.com/RocketChat/Rocket.Chat/pull/15231)) +- Regression: Double error toast on Setup Wizard ([#15268](https://github.com/RocketChat/Rocket.Chat/pull/15268)) +- Regression: addPermissionToRole argument as string ([#15267](https://github.com/RocketChat/Rocket.Chat/pull/15267)) +- Regression: Remove old scripts of Setup Wizard ([#15263](https://github.com/RocketChat/Rocket.Chat/pull/15263)) +- Fix get IP for rate limiter ([#15262](https://github.com/RocketChat/Rocket.Chat/pull/15262)) +- Add oplog events metrics ([#15249](https://github.com/RocketChat/Rocket.Chat/pull/15249)) +- Regression: last message doesn't update after reconnect ([#15329](https://github.com/RocketChat/Rocket.Chat/pull/15329)) +- Regression: New Livechat methods and processes ([#15242](https://github.com/RocketChat/Rocket.Chat/pull/15242)) +- Regression: Remove duplicated permission changes emitter ([#15321](https://github.com/RocketChat/Rocket.Chat/pull/15321)) +- Regression: Errors on the console preventing some settings to be saved ([#15310](https://github.com/RocketChat/Rocket.Chat/pull/15310)) +- Fix v148 migration ([#15285](https://github.com/RocketChat/Rocket.Chat/pull/15285)) +- Fix apps list error ([#15258](https://github.com/RocketChat/Rocket.Chat/pull/15258)) +- Federation migration and additional improvements ([#15336](https://github.com/RocketChat/Rocket.Chat/pull/15336)) +- Regression: Fix wrong import and minor code improvements ([#15352](https://github.com/RocketChat/Rocket.Chat/pull/15352)) + +
+ +### 👩‍💻👨‍💻 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) +- [@wreiske](https://github.com/wreiske) +- [@zolbayars](https://github.com/zolbayars) + +### 👩‍💻👨‍💻 Core Team 🤓 + +- [@LuluGO](https://github.com/LuluGO) +- [@MarcosSpessatto](https://github.com/MarcosSpessatto) +- [@MartinSchoeler](https://github.com/MartinSchoeler) +- [@alansikora](https://github.com/alansikora) +- [@d-gubert](https://github.com/d-gubert) +- [@engelgabriel](https://github.com/engelgabriel) +- [@geekgonecrazy](https://github.com/geekgonecrazy) +- [@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) # Assistify 0.9.14 This release enables Microsoft Text Translator @@ -15,8 +656,26 @@ This release enables Assistify to run with multiple instances on ECS. This Release bumps Rocket.Chat to 1.3.2 +# 1.3.3 +`2019-11-19 · 2 🐛 · 2 👩‍💻👨‍💻` + +### Engine versions +- Node: `8.11.4` +- NPM: `6.4.1` +- MongoDB: `3.2, 3.4, 3.6, 4.0` + +### 🐛 Bug fixes + +- Markdown link parser ([#15794](https://github.com/RocketChat/Rocket.Chat/pull/15794)) +- Updating an app via "Update" button errors out with "App already exists" ([#15814](https://github.com/RocketChat/Rocket.Chat/pull/15814)) + +### 👩‍💻👨‍💻 Core Team 🤓 + +- [@d-gubert](https://github.com/d-gubert) +- [@ggazzo](https://github.com/ggazzo) + # 1.3.2 -`2019-08-13 · 3 🐛 · 2 🔍 · 4 👩‍💻👨‍💻` +`2019-08-14 · 3 🐛 · 3 🔍 · 4 👩‍💻👨‍💻` ### Engine versions - Node: `8.11.4` @@ -32,6 +691,7 @@ This Release bumps Rocket.Chat to 1.3.2
🔍 Minor changes +- Release 1.3.2 ([#15176](https://github.com/RocketChat/Rocket.Chat/pull/15176)) - Update latest Livechat widget version to 1.1.4 ([#15173](https://github.com/RocketChat/Rocket.Chat/pull/15173)) - Update latest Livechat widget version(1.1.3) ([#15154](https://github.com/RocketChat/Rocket.Chat/pull/15154)) @@ -45,7 +705,7 @@ This Release bumps Rocket.Chat to 1.3.2 - [@tassoevan](https://github.com/tassoevan) # 1.3.1 -`2019-08-08 · 2 🐛 · 2 👩‍💻👨‍💻` +`2019-08-08 · 2 🐛 · 1 🔍 · 3 👩‍💻👨‍💻` ### Engine versions - Node: `8.11.4` @@ -57,8 +717,16 @@ This Release bumps Rocket.Chat to 1.3.2 - Custom emoji table scroll ([#15119](https://github.com/RocketChat/Rocket.Chat/pull/15119)) - Direct Message names not visible on Admin panel ([#15114](https://github.com/RocketChat/Rocket.Chat/pull/15114)) +
+🔍 Minor changes + +- Release 1.3.1 ([#15148](https://github.com/RocketChat/Rocket.Chat/pull/15148)) + +
+ ### 👩‍💻👨‍💻 Core Team 🤓 +- [@MarcosSpessatto](https://github.com/MarcosSpessatto) - [@ggazzo](https://github.com/ggazzo) - [@sampaiodiego](https://github.com/sampaiodiego) @@ -76,9 +744,9 @@ This Release bumps Rocket.Chat to 1.3.2 - 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)) @@ -96,19 +764,19 @@ This Release bumps Rocket.Chat to 1.3.2 - 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)) @@ -119,7 +787,7 @@ This Release bumps Rocket.Chat to 1.3.2 - 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)) @@ -148,7 +816,7 @@ This Release bumps Rocket.Chat to 1.3.2 - 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)) @@ -165,9 +833,12 @@ This Release bumps Rocket.Chat to 1.3.2 ### 👩‍💻👨‍💻 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) @@ -182,11 +853,8 @@ This Release bumps Rocket.Chat to 1.3.2 ### 👩‍💻👨‍💻 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) @@ -247,36 +915,36 @@ This Release bumps Rocket.Chat to 1.3.2 ### 🎉 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 @@ -285,7 +953,7 @@ This Release bumps Rocket.Chat to 1.3.2 - Regression: Fix file upload ([#14804](https://github.com/RocketChat/Rocket.Chat/pull/14804)) - Extract permissions functions ([#14777](https://github.com/RocketChat/Rocket.Chat/pull/14777)) - Add custom fileupload whitelist property ([#14754](https://github.com/RocketChat/Rocket.Chat/pull/14754)) -- Merge master into develop & Set version to 1.2.0-develop ([#14656](https://github.com/RocketChat/Rocket.Chat/pull/14656) by [@AnBo83](https://github.com/AnBo83) & [@knrt10](https://github.com/knrt10) & [@lolimay](https://github.com/lolimay) & [@mohamedar97](https://github.com/mohamedar97) & [@thaiphv](https://github.com/thaiphv)) +- Merge master into develop & Set version to 1.2.0-develop ([#14656](https://github.com/RocketChat/Rocket.Chat/pull/14656) by [@AnBo83](https://github.com/AnBo83) & [@knrt10](https://github.com/knrt10) & [@mohamedar97](https://github.com/mohamedar97) & [@thaiphv](https://github.com/thaiphv)) - Regression: Fix desktop notifications not being sent ([#14860](https://github.com/RocketChat/Rocket.Chat/pull/14860)) - Regression: Allow debugging of cached collections by name ([#14862](https://github.com/RocketChat/Rocket.Chat/pull/14862)) - Allow debugging of cached collections by name ([#14859](https://github.com/RocketChat/Rocket.Chat/pull/14859)) @@ -295,8 +963,9 @@ This Release bumps Rocket.Chat to 1.3.2 ### 👩‍💻👨‍💻 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) - [@ruKurz](https://github.com/ruKurz) - [@sonbn0](https://github.com/sonbn0) @@ -306,13 +975,12 @@ This Release bumps Rocket.Chat to 1.3.2 ### 👩‍💻👨‍💻 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) +- [@lolimay](https://github.com/lolimay) - [@marceloschmidt](https://github.com/marceloschmidt) - [@renatobecker](https://github.com/renatobecker) - [@rodrigok](https://github.com/rodrigok) @@ -387,19 +1055,22 @@ This Release bumps Rocket.Chat to 1.1.3 ### 🐛 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) @@ -414,7 +1085,7 @@ This Release bumps Rocket.Chat to 1.1.3 ### 🐛 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))
@@ -424,9 +1095,12 @@ This Release bumps Rocket.Chat to 1.1.3
-### 👩‍💻👨‍💻 Core Team 🤓 +### 👩‍💻👨‍💻 Contributors 😍 - [@Hudell](https://github.com/Hudell) + +### 👩‍💻👨‍💻 Core Team 🤓 + - [@alansikora](https://github.com/alansikora) - [@ggazzo](https://github.com/ggazzo) @@ -467,11 +1141,11 @@ This Release bumps Rocket.Chat to 1.1.3 - 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)) @@ -526,7 +1200,7 @@ This Release bumps Rocket.Chat to 1.1.3 - 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)) @@ -534,11 +1208,11 @@ This Release bumps Rocket.Chat to 1.1.3 - 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)) @@ -558,6 +1232,7 @@ This Release bumps Rocket.Chat to 1.1.3 ### 👩‍💻👨‍💻 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) @@ -569,6 +1244,7 @@ This Release bumps Rocket.Chat to 1.1.3 - [@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) @@ -576,13 +1252,11 @@ This Release bumps Rocket.Chat to 1.1.3 ### 👩‍💻👨‍💻 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) @@ -694,17 +1368,20 @@ Assistify.Chat is now based on Rocket.Chat 0.68.5!
🔍 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) @@ -728,7 +1405,7 @@ Assistify.Chat is now based on Rocket.Chat 0.68.5! - Audio notification for messages on DM ([#14336](https://github.com/RocketChat/Rocket.Chat/pull/14336)) - Duplicate thread message after editing ([#14330](https://github.com/RocketChat/Rocket.Chat/pull/14330)) - New day separator rendered over thread reply ([#14328](https://github.com/RocketChat/Rocket.Chat/pull/14328)) -- Missing i18n for some new Permissions ([#14011](https://github.com/RocketChat/Rocket.Chat/pull/14011) by [@lolimay](https://github.com/lolimay)) +- Missing i18n for some new Permissions ([#14011](https://github.com/RocketChat/Rocket.Chat/pull/14011)) - View Logs admin page was broken and not rendering color logs ([#14316](https://github.com/RocketChat/Rocket.Chat/pull/14316)) - show roles on message ([#14313](https://github.com/RocketChat/Rocket.Chat/pull/14313)) - Remove reference to inexistent field when deleting message in thread ([#14311](https://github.com/RocketChat/Rocket.Chat/pull/14311)) @@ -736,7 +1413,7 @@ Assistify.Chat is now based on Rocket.Chat 0.68.5!
🔍 Minor changes -- Release 1.0.2 ([#14339](https://github.com/RocketChat/Rocket.Chat/pull/14339) by [@AnBo83](https://github.com/AnBo83) & [@knrt10](https://github.com/knrt10) & [@lolimay](https://github.com/lolimay) & [@mohamedar97](https://github.com/mohamedar97) & [@thaiphv](https://github.com/thaiphv)) +- Release 1.0.2 ([#14339](https://github.com/RocketChat/Rocket.Chat/pull/14339) by [@AnBo83](https://github.com/AnBo83) & [@knrt10](https://github.com/knrt10) & [@mohamedar97](https://github.com/mohamedar97) & [@thaiphv](https://github.com/thaiphv)) - Add cross-browser select arrow positioning ([#14318](https://github.com/RocketChat/Rocket.Chat/pull/14318)) - i18n: Update German strings ([#14182](https://github.com/RocketChat/Rocket.Chat/pull/14182) by [@AnBo83](https://github.com/AnBo83)) - [Regression] Anonymous user fix ([#14301](https://github.com/RocketChat/Rocket.Chat/pull/14301) by [@knrt10](https://github.com/knrt10)) @@ -749,7 +1426,6 @@ Assistify.Chat is now based on Rocket.Chat 0.68.5! - [@AnBo83](https://github.com/AnBo83) - [@knrt10](https://github.com/knrt10) -- [@lolimay](https://github.com/lolimay) - [@mohamedar97](https://github.com/mohamedar97) - [@thaiphv](https://github.com/thaiphv) @@ -757,6 +1433,7 @@ Assistify.Chat is now based on Rocket.Chat 0.68.5! - [@d-gubert](https://github.com/d-gubert) - [@ggazzo](https://github.com/ggazzo) +- [@lolimay](https://github.com/lolimay) - [@rodrigok](https://github.com/rodrigok) - [@sampaiodiego](https://github.com/sampaiodiego) - [@tassoevan](https://github.com/tassoevan) @@ -807,11 +1484,11 @@ Assistify.Chat is now based on Rocket.Chat 0.68.5! ### 🎉 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)) @@ -831,7 +1508,7 @@ Assistify.Chat is now based on Rocket.Chat 0.68.5! - 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)) @@ -857,8 +1534,8 @@ Assistify.Chat is now based on Rocket.Chat 0.68.5! - 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)) @@ -920,11 +1597,11 @@ Assistify.Chat is now based on Rocket.Chat 0.68.5! - 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)) @@ -950,7 +1627,7 @@ Assistify.Chat is now based on Rocket.Chat 0.68.5! - 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)) @@ -969,7 +1646,7 @@ Assistify.Chat is now based on Rocket.Chat 0.68.5! - 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))
@@ -1070,11 +1747,11 @@ Assistify.Chat is now based on Rocket.Chat 0.68.5! - 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)) @@ -1154,6 +1831,7 @@ Assistify.Chat is now based on Rocket.Chat 0.68.5! ### 👩‍💻👨‍💻 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) @@ -1175,6 +1853,7 @@ Assistify.Chat is now based on Rocket.Chat 0.68.5! - [@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) @@ -1189,6 +1868,7 @@ Assistify.Chat is now based on Rocket.Chat 0.68.5! - [@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) @@ -1200,7 +1880,6 @@ Assistify.Chat is now based on Rocket.Chat 0.68.5! ### 👩‍💻👨‍💻 Core Team 🤓 -- [@Hudell](https://github.com/Hudell) - [@LuluGO](https://github.com/LuluGO) - [@MarcosSpessatto](https://github.com/MarcosSpessatto) - [@alansikora](https://github.com/alansikora) @@ -1210,12 +1889,10 @@ Assistify.Chat is now based on Rocket.Chat 0.68.5! - [@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 👩‍💻👨‍💻` @@ -1238,9 +1915,9 @@ Assistify.Chat is now based on Rocket.Chat 0.68.5! - 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)) @@ -1248,7 +1925,7 @@ Assistify.Chat is now based on Rocket.Chat 0.68.5!
🔍 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)) @@ -1257,11 +1934,11 @@ Assistify.Chat is now based on Rocket.Chat 0.68.5! ### 👩‍💻👨‍💻 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) @@ -1312,11 +1989,11 @@ Assistify.Chat is now based on Rocket.Chat 0.68.5! ### 🐛 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))
@@ -1326,9 +2003,12 @@ Assistify.Chat is now based on Rocket.Chat 0.68.5!
-### 👩‍💻👨‍💻 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) @@ -1369,7 +2049,7 @@ Assistify.Chat is now based on Rocket.Chat 0.68.5! - 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 @@ -1428,7 +2108,7 @@ Assistify.Chat is now based on Rocket.Chat 0.68.5! - 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)) @@ -1438,6 +2118,7 @@ Assistify.Chat is now based on Rocket.Chat 0.68.5! ### 👩‍💻👨‍💻 Contributors 😍 +- [@Hudell](https://github.com/Hudell) - [@Jeroeny](https://github.com/Jeroeny) - [@Kailash0311](https://github.com/Kailash0311) - [@TkTech](https://github.com/TkTech) @@ -1453,7 +2134,6 @@ Assistify.Chat is now based on Rocket.Chat 0.68.5! ### 👩‍💻👨‍💻 Core Team 🤓 -- [@Hudell](https://github.com/Hudell) - [@LuluGO](https://github.com/LuluGO) - [@MarcosSpessatto](https://github.com/MarcosSpessatto) - [@d-gubert](https://github.com/d-gubert) @@ -1527,7 +2207,7 @@ Assistify.Chat is now based on Rocket.Chat 0.68.5! ### 🎉 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)) @@ -1535,11 +2215,11 @@ Assistify.Chat is now based on Rocket.Chat 0.68.5! - 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)) @@ -1558,7 +2238,7 @@ Assistify.Chat is now based on Rocket.Chat 0.68.5! - 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)) @@ -1575,12 +2255,12 @@ Assistify.Chat is now based on Rocket.Chat 0.68.5! - 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)) @@ -1671,14 +2351,16 @@ Assistify.Chat is now based on Rocket.Chat 0.68.5! - 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) @@ -1694,10 +2376,8 @@ Assistify.Chat is now based on Rocket.Chat 0.68.5! ### 👩‍💻👨‍💻 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) @@ -1714,17 +2394,17 @@ Assistify.Chat is now based on Rocket.Chat 0.68.5!
🔍 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) @@ -1756,13 +2436,13 @@ Assistify.Chat is now based on Rocket.Chat 0.68.5! - 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)) @@ -1770,12 +2450,12 @@ Assistify.Chat is now based on Rocket.Chat 0.68.5! ### 👩‍💻👨‍💻 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) @@ -1792,10 +2472,10 @@ Assistify.Chat is now based on Rocket.Chat 0.68.5! ### 🎉 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 @@ -1811,11 +2491,11 @@ Assistify.Chat is now based on Rocket.Chat 0.68.5! - 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 @@ -1912,8 +2592,8 @@ Assistify.Chat is now based on Rocket.Chat 0.68.5! - 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)) @@ -1930,10 +2610,13 @@ Assistify.Chat is now based on Rocket.Chat 0.68.5! ### 👩‍💻👨‍💻 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) @@ -1946,13 +2629,10 @@ Assistify.Chat is now based on Rocket.Chat 0.68.5! ### 👩‍💻👨‍💻 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) @@ -2020,9 +2700,9 @@ Assistify.Chat is now based on Rocket.Chat 0.68.5! - 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)) @@ -2055,6 +2735,7 @@ Assistify.Chat is now based on Rocket.Chat 0.68.5! ### 👩‍💻👨‍💻 Contributors 😍 +- [@Hudell](https://github.com/Hudell) - [@MarcosEllys](https://github.com/MarcosEllys) - [@crazy-max](https://github.com/crazy-max) - [@isabellarussell](https://github.com/isabellarussell) @@ -2068,7 +2749,6 @@ Assistify.Chat is now based on Rocket.Chat 0.68.5! ### 👩‍💻👨‍💻 Core Team 🤓 -- [@Hudell](https://github.com/Hudell) - [@MarcosSpessatto](https://github.com/MarcosSpessatto) - [@Sing-Li](https://github.com/Sing-Li) - [@geekgonecrazy](https://github.com/geekgonecrazy) @@ -2126,19 +2806,22 @@ Assistify.Chat is now based on Rocket.Chat 0.68.5! ### 🐛 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 @@ -2150,8 +2833,8 @@ Assistify.Chat is now based on Rocket.Chat 0.68.5! ### 🐛 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)) @@ -2162,8 +2845,8 @@ Assistify.Chat is now based on Rocket.Chat 0.68.5!
🔍 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)) @@ -2172,20 +2855,20 @@ Assistify.Chat is now based on Rocket.Chat 0.68.5! ### 👩‍💻👨‍💻 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 👩‍💻👨‍💻` @@ -2204,17 +2887,17 @@ Assistify.Chat is now based on Rocket.Chat 0.68.5! - 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)) @@ -2228,11 +2911,11 @@ Assistify.Chat is now based on Rocket.Chat 0.68.5! ### 🐛 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)) @@ -2242,9 +2925,9 @@ Assistify.Chat is now based on Rocket.Chat 0.68.5! - 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)) @@ -2254,8 +2937,8 @@ Assistify.Chat is now based on Rocket.Chat 0.68.5! - 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)) @@ -2263,68 +2946,68 @@ Assistify.Chat is now based on Rocket.Chat 0.68.5!
🔍 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 👩‍💻👨‍💻` @@ -2335,26 +3018,26 @@ Assistify.Chat is now based on Rocket.Chat 0.68.5! ### 🎉 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 👩‍💻👨‍💻` @@ -2388,12 +3071,12 @@ Assistify.Chat is now based on Rocket.Chat 0.68.5! ### 🎉 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)) @@ -2403,18 +3086,18 @@ Assistify.Chat is now based on Rocket.Chat 0.68.5! - 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)) @@ -2425,14 +3108,14 @@ Assistify.Chat is now based on Rocket.Chat 0.68.5! - 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)) @@ -2469,6 +3152,7 @@ Assistify.Chat is now based on Rocket.Chat 0.68.5! ### 👩‍💻👨‍💻 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) @@ -2478,6 +3162,7 @@ Assistify.Chat is now based on Rocket.Chat 0.68.5! - [@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) @@ -2485,7 +3170,6 @@ Assistify.Chat is now based on Rocket.Chat 0.68.5! ### 👩‍💻👨‍💻 Core Team 🤓 -- [@Hudell](https://github.com/Hudell) - [@MarcosSpessatto](https://github.com/MarcosSpessatto) - [@engelgabriel](https://github.com/engelgabriel) - [@geekgonecrazy](https://github.com/geekgonecrazy) @@ -2495,7 +3179,6 @@ Assistify.Chat is now based on Rocket.Chat 0.68.5! - [@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 👩‍💻👨‍💻` @@ -2543,26 +3226,26 @@ Assistify.Chat is now based on Rocket.Chat 0.68.5! ### 🐛 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) @@ -2632,7 +3315,7 @@ Assistify.Chat is now based on Rocket.Chat 0.68.5! ### 🎉 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)) @@ -2648,7 +3331,7 @@ Assistify.Chat is now based on Rocket.Chat 0.68.5! ### 🚀 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)) @@ -2660,10 +3343,10 @@ Assistify.Chat is now based on Rocket.Chat 0.68.5! - 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)) @@ -2697,10 +3380,12 @@ Assistify.Chat is now based on Rocket.Chat 0.68.5! ### 👩‍💻👨‍💻 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) @@ -2708,11 +3393,9 @@ Assistify.Chat is now based on Rocket.Chat 0.68.5! ### 👩‍💻👨‍💻 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) @@ -2755,20 +3438,20 @@ Assistify.Chat is now based on Rocket.Chat 0.68.5! - 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) @@ -2835,18 +3518,18 @@ Assistify.Chat is now based on Rocket.Chat 0.68.5! ### 🐛 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) @@ -2870,7 +3553,7 @@ Assistify.Chat is now based on Rocket.Chat 0.68.5! - 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)) @@ -2897,13 +3580,13 @@ Assistify.Chat is now based on Rocket.Chat 0.68.5! ### 🐛 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)) @@ -2912,8 +3595,8 @@ Assistify.Chat is now based on Rocket.Chat 0.68.5! - 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)) @@ -2935,31 +3618,31 @@ Assistify.Chat is now based on Rocket.Chat 0.68.5! - 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)) @@ -3008,9 +3691,11 @@ Assistify.Chat is now based on Rocket.Chat 0.68.5! ### 👩‍💻👨‍💻 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) @@ -3039,14 +3724,13 @@ Assistify.Chat is now based on Rocket.Chat 0.68.5! - [@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) @@ -3055,7 +3739,6 @@ Assistify.Chat is now based on Rocket.Chat 0.68.5! - [@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 👩‍💻👨‍💻` @@ -3127,7 +3810,7 @@ Assistify.Chat is now based on Rocket.Chat 0.68.5! - 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 @@ -3135,10 +3818,10 @@ Assistify.Chat is now based on Rocket.Chat 0.68.5! - 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)) @@ -3151,7 +3834,7 @@ Assistify.Chat is now based on Rocket.Chat 0.68.5!
🔍 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)) @@ -3171,10 +3854,12 @@ Assistify.Chat is now based on Rocket.Chat 0.68.5! ### 👩‍💻👨‍💻 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-) @@ -3189,9 +3874,7 @@ Assistify.Chat is now based on Rocket.Chat 0.68.5! ### 👩‍💻👨‍💻 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) @@ -3209,12 +3892,12 @@ Assistify.Chat is now based on Rocket.Chat 0.68.5! ### 🎉 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)) @@ -3223,24 +3906,24 @@ Assistify.Chat is now based on Rocket.Chat 0.68.5! - 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)) @@ -3276,7 +3959,9 @@ Assistify.Chat is now based on Rocket.Chat 0.68.5! ### 👩‍💻👨‍💻 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) @@ -3286,9 +3971,7 @@ Assistify.Chat is now based on Rocket.Chat 0.68.5! ### 👩‍💻👨‍💻 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) @@ -3344,13 +4027,13 @@ Assistify.Chat is now based on Rocket.Chat 0.68.5! ### 🎉 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)) @@ -3369,23 +4052,23 @@ Assistify.Chat is now based on Rocket.Chat 0.68.5! - 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)) @@ -3413,12 +4096,12 @@ Assistify.Chat is now based on Rocket.Chat 0.68.5!
🔍 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)) @@ -3428,7 +4111,7 @@ Assistify.Chat is now based on Rocket.Chat 0.68.5! - [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)) @@ -3436,7 +4119,7 @@ Assistify.Chat is now based on Rocket.Chat 0.68.5! - 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)) @@ -3449,11 +4132,14 @@ Assistify.Chat is now based on Rocket.Chat 0.68.5! ### 👩‍💻👨‍💻 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) @@ -3471,10 +4157,7 @@ Assistify.Chat is now based on Rocket.Chat 0.68.5! ### 👩‍💻👨‍💻 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) @@ -3561,7 +4244,7 @@ Assistify.Chat is now based on Rocket.Chat 0.68.5! ### ⚠️ 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 @@ -3571,7 +4254,7 @@ Assistify.Chat is now based on Rocket.Chat 0.68.5! - 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)) @@ -3580,7 +4263,7 @@ Assistify.Chat is now based on Rocket.Chat 0.68.5! - 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)) @@ -3601,10 +4284,10 @@ Assistify.Chat is now based on Rocket.Chat 0.68.5! - 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)) @@ -3614,19 +4297,19 @@ Assistify.Chat is now based on Rocket.Chat 0.68.5! - 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)) @@ -3645,6 +4328,7 @@ Assistify.Chat is now based on Rocket.Chat 0.68.5! ### 👩‍💻👨‍💻 Contributors 😍 +- [@Hudell](https://github.com/Hudell) - [@Joe-mcgee](https://github.com/Joe-mcgee) - [@SeanPackham](https://github.com/SeanPackham) - [@TopHattedCat](https://github.com/TopHattedCat) @@ -3657,18 +4341,17 @@ Assistify.Chat is now based on Rocket.Chat 0.68.5! - [@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) @@ -3757,7 +4440,7 @@ Assistify.Chat is now based on Rocket.Chat 0.68.5! - 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)) @@ -3773,7 +4456,7 @@ Assistify.Chat is now based on Rocket.Chat 0.68.5! - 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 @@ -3781,9 +4464,9 @@ Assistify.Chat is now based on Rocket.Chat 0.68.5! - 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)) @@ -3798,7 +4481,7 @@ Assistify.Chat is now based on Rocket.Chat 0.68.5! - Desktop notification not showing when avatar came from external storage service ([#9639](https://github.com/RocketChat/Rocket.Chat/pull/9639)) - Missing link Site URLs in enrollment e-mails ([#9454](https://github.com/RocketChat/Rocket.Chat/pull/9454) by [@kemitchell](https://github.com/kemitchell)) - Missing string 'Username_already_exist' on the accountProfile page ([#9610](https://github.com/RocketChat/Rocket.Chat/pull/9610) by [@lunaticmonk](https://github.com/lunaticmonk)) -- SVG avatars are not been displayed correctly when load in non HTML containers ([#9570](https://github.com/RocketChat/Rocket.Chat/pull/9570)) +- SVG avatars are not been displayed correctly when load in non HTML containers ([#9570](https://github.com/RocketChat/Rocket.Chat/pull/9570) by [@filipedelimabrito](https://github.com/filipedelimabrito)) - Livechat is not working when running in a sub path ([#9599](https://github.com/RocketChat/Rocket.Chat/pull/9599)) - Not receiving sound notifications in rooms created by new LiveChats ([#9802](https://github.com/RocketChat/Rocket.Chat/pull/9802)) - Silence the update check error message ([#9858](https://github.com/RocketChat/Rocket.Chat/pull/9858)) @@ -3826,7 +4509,7 @@ Assistify.Chat is now based on Rocket.Chat 0.68.5! - 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)) @@ -3843,12 +4526,15 @@ Assistify.Chat is now based on Rocket.Chat 0.68.5! - [@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) - [@cyberhck](https://github.com/cyberhck) +- [@filipedelimabrito](https://github.com/filipedelimabrito) - [@gdelavald](https://github.com/gdelavald) - [@jgtoriginal](https://github.com/jgtoriginal) - [@jorgeluisrezende](https://github.com/jorgeluisrezende) @@ -3861,6 +4547,7 @@ Assistify.Chat is now based on Rocket.Chat 0.68.5! - [@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) @@ -3870,16 +4557,12 @@ Assistify.Chat is now based on Rocket.Chat 0.68.5! ### 👩‍💻👨‍💻 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) @@ -4134,7 +4817,7 @@ Assistify.Chat is now based on Rocket.Chat 0.68.5! - 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)) @@ -4147,7 +4830,7 @@ Assistify.Chat is now based on Rocket.Chat 0.68.5! - 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 @@ -4164,7 +4847,7 @@ Assistify.Chat is now based on Rocket.Chat 0.68.5! - 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)) @@ -4192,10 +4875,10 @@ Assistify.Chat is now based on Rocket.Chat 0.68.5! - 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)) @@ -4313,6 +4996,7 @@ Assistify.Chat is now based on Rocket.Chat 0.68.5! - [@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) @@ -4335,8 +5019,10 @@ Assistify.Chat is now based on Rocket.Chat 0.68.5! - [@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) @@ -4358,14 +5044,11 @@ Assistify.Chat is now based on Rocket.Chat 0.68.5! ### 👩‍💻👨‍💻 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) @@ -4444,7 +5127,7 @@ Assistify.Chat is now based on Rocket.Chat 0.68.5! ### 🐛 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)) @@ -4466,13 +5149,13 @@ Assistify.Chat is now based on Rocket.Chat 0.68.5! - [@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 👩‍💻👨‍💻` @@ -4611,7 +5294,7 @@ Assistify.Chat is now based on Rocket.Chat 0.68.5! - 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)) @@ -4741,6 +5424,7 @@ Assistify.Chat is now based on Rocket.Chat 0.68.5! - [@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) @@ -4769,7 +5453,6 @@ Assistify.Chat is now based on Rocket.Chat 0.68.5! ### 👩‍💻👨‍💻 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) @@ -4880,7 +5563,7 @@ Assistify.Chat is now based on Rocket.Chat 0.68.5! - Fix Custom Fields Crashing on Register ([#7617](https://github.com/RocketChat/Rocket.Chat/pull/7617)) - Fix admin room list show the correct i18n type ([#7582](https://github.com/RocketChat/Rocket.Chat/pull/7582) by [@ccfang](https://github.com/ccfang)) - URL parse error fix for issue #7169 ([#7538](https://github.com/RocketChat/Rocket.Chat/pull/7538) by [@satyapramodh](https://github.com/satyapramodh)) -- User avatar image background ([#7572](https://github.com/RocketChat/Rocket.Chat/pull/7572)) +- User avatar image background ([#7572](https://github.com/RocketChat/Rocket.Chat/pull/7572) by [@filipedelimabrito](https://github.com/filipedelimabrito)) - Look for livechat visitor IP address on X-Forwarded-For header ([#7554](https://github.com/RocketChat/Rocket.Chat/pull/7554)) - Revert emojione package version upgrade ([#7557](https://github.com/RocketChat/Rocket.Chat/pull/7557)) - Stop logging mentions object to console ([#7562](https://github.com/RocketChat/Rocket.Chat/pull/7562) by [@gdelavald](https://github.com/gdelavald)) @@ -4903,13 +5586,13 @@ Assistify.Chat is now based on Rocket.Chat 0.68.5! - 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)) @@ -4921,8 +5604,8 @@ Assistify.Chat is now based on Rocket.Chat 0.68.5! - [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)) @@ -4934,18 +5617,22 @@ Assistify.Chat is now based on Rocket.Chat 0.68.5! - [@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) - [@ccfang](https://github.com/ccfang) - [@danilomiranda](https://github.com/danilomiranda) - [@danischreiber](https://github.com/danischreiber) +- [@filipedelimabrito](https://github.com/filipedelimabrito) - [@flaviogrossi](https://github.com/flaviogrossi) - [@gdelavald](https://github.com/gdelavald) - [@jangmarker](https://github.com/jangmarker) - [@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) @@ -4956,15 +5643,11 @@ Assistify.Chat is now based on Rocket.Chat 0.68.5! ### 👩‍💻👨‍💻 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) @@ -5076,13 +5759,13 @@ Assistify.Chat is now based on Rocket.Chat 0.68.5! ### 🎉 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)) @@ -5125,7 +5808,7 @@ Assistify.Chat is now based on Rocket.Chat 0.68.5! - 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)) @@ -5172,7 +5855,9 @@ Assistify.Chat is now based on Rocket.Chat 0.68.5! ### 👩‍💻👨‍💻 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) @@ -5183,20 +5868,18 @@ Assistify.Chat is now based on Rocket.Chat 0.68.5! - [@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) @@ -5210,7 +5893,7 @@ Assistify.Chat is now based on Rocket.Chat 0.68.5! ### 🎉 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)) @@ -5232,16 +5915,16 @@ Assistify.Chat is now based on Rocket.Chat 0.68.5! - 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 @@ -5271,11 +5954,13 @@ Assistify.Chat is now based on Rocket.Chat 0.68.5! ### 👩‍💻👨‍💻 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) @@ -5283,13 +5968,11 @@ Assistify.Chat is now based on Rocket.Chat 0.68.5! ### 👩‍💻👨‍💻 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) @@ -5324,7 +6007,7 @@ Assistify.Chat is now based on Rocket.Chat 0.68.5! ### 🎉 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)) @@ -5344,7 +6027,7 @@ Assistify.Chat is now based on Rocket.Chat 0.68.5! - 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)) @@ -5376,7 +6059,7 @@ Assistify.Chat is now based on Rocket.Chat 0.68.5! - 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)) @@ -5451,7 +6134,7 @@ Assistify.Chat is now based on Rocket.Chat 0.68.5! - 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))
@@ -5460,11 +6143,13 @@ Assistify.Chat is now based on Rocket.Chat 0.68.5! - [@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) @@ -5474,12 +6159,10 @@ Assistify.Chat is now based on Rocket.Chat 0.68.5! ### 👩‍💻👨‍💻 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) diff --git a/LICENSE b/LICENSE index de5de8728e99..e68b3cab97c3 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) 2015-2018 Rocket.Chat Technologies Corp. +Copyright (c) 2015-2019 Rocket.Chat Technologies Corp. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/README.md b/README.md index db33dd319d6c..e5c9bc73ed31 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,8 @@ [![Rocket.Chat](https://open.rocket.chat/images/join-chat.svg)](https://open.rocket.chat/) [![Build Status](https://img.shields.io/travis/RocketChat/Rocket.Chat/master.svg)](https://travis-ci.org/RocketChat/Rocket.Chat) [![Project Dependencies](https://david-dm.org/RocketChat/Rocket.Chat.svg)](https://david-dm.org/RocketChat/Rocket.Chat) -[![Codacy Badge](https://api.codacy.com/project/badge/grade/8580571ba024426d9649e9ab389bd5dd)](https://www.codacy.com/app/RocketChat/Rocket-Chat) +[![devDependencies Status](https://david-dm.org/RocketChat/Rocket.Chat/dev-status.svg)](https://david-dm.org/RocketChat/Rocket.Chat?type=dev) +[![Codacy Badge](https://api.codacy.com/project/badge/grade/8580571ba024426d9649e9ab389bd5dd)](https://www.codacy.com/app/RocketChat/Rocket-chat) [![Coverage Status](https://coveralls.io/repos/RocketChat/Rocket.Chat/badge.svg)](https://coveralls.io/r/RocketChat/Rocket.Chat) [![Code Climate](https://codeclimate.com/github/RocketChat/Rocket.Chat/badges/gpa.svg)](https://codeclimate.com/github/RocketChat/Rocket.Chat) [![MIT License](https://img.shields.io/badge/license-MIT-blue.svg?style=flat)](https://github.com/RocketChat/Rocket.Chat/raw/master/LICENSE) @@ -116,11 +117,6 @@ Deploy to a DigitalOcean droplet with our one-click install listing from the Dig [![do-btn-blue](https://user-images.githubusercontent.com/51996/58146107-50512580-7c1a-11e9-8ec9-e032ba387c2a.png)](https://marketplace.digitalocean.com/apps/rocket-chat?action=deploy&refcode=1940fe28bd31) -## RocketChatLauncher - -Focus on your team/community and not on servers or code - the Launcher provides RocketChat-as-a-Service on a monthly subscription model. - -[![RocketChatLauncher](https://rocketchatlauncher.com/wp-content/uploads/2017/03/cropped-rcl-small-type.png)](https://rocketchatlauncher.com) ## Layershift @@ -325,25 +321,8 @@ It is a great solution for communities and companies wanting to privately host t ## Roadmap -#### In Progress -- XMPP Support via [Webhook bridge](https://github.com/saqura/xmppwb) [Issue #404](https://github.com/RocketChat/Rocket.Chat/issues/404) -- Federation via [matrix.org](https://www.matrix.org/), see [hubot-freddie](https://www.npmjs.com/package/hubot-freddie) and [Federation project](https://github.com/RocketChat/Rocket.Chat.Federation) : [Issue #520](https://github.com/RocketChat/Rocket.Chat/issues/520), [Issue #601](https://github.com/RocketChat/Rocket.Chat/issues/601) -- Support for PostgreSQL: [Issue #533](https://github.com/RocketChat/Rocket.Chat/issues/533), [Issue #822](https://github.com/RocketChat/Rocket.Chat/pull/822) -- WordPress Plug-in [Issue # 1920](https://github.com/RocketChat/Rocket.Chat/issues/1920) -- Integration with PSTN (Public Switched Telephone Networks) -- API-enabled methods: [Issue #202](https://github.com/RocketChat/Rocket.Chat/issues/202), [Issue #454](https://github.com/RocketChat/Rocket.Chat/issues/454), [Issue #455](https://github.com/RocketChat/Rocket.Chat/issues/455), [Issue #759](https://github.com/RocketChat/Rocket.Chat/issues/759) -- Scalable WebRTC broadcaster / media-server integration, [Issue #1118](https://github.com/RocketChat/Rocket.Chat/issues/1118) -- White label hosting -- Reseller support for white label hosting -- CRM integrations: Microsoft Dynamics CRM, Salesforce.com, Zoho.com, SugarCRM, SuiteCRM and more -- Support multiple teams on the same instance / same VPS infrastructure: [Issue #658](https://github.com/RocketChat/Rocket.Chat/issues/658), [Issue #630](https://github.com/RocketChat/Rocket.Chat/issues/630) - -#### Planned -- Kerberos Authentication: [Issue #839](https://github.com/RocketChat/Rocket.Chat/issues/839) -- More webhooks: GitLab, Confluence, Jira, Piwik, WordPress: [Issue #233](https://github.com/RocketChat/Rocket.Chat/issues/233), [Issue #525](https://github.com/RocketChat/Rocket.Chat/issues/525), [Issue #637](https://github.com/RocketChat/Rocket.Chat/issues/637), [Issue #638](https://github.com/RocketChat/Rocket.Chat/issues/638), [Issue #747](https://github.com/RocketChat/Rocket.Chat/issues/747) -- Anonymous use of Rocket.Chat: [Issue #604](https://github.com/RocketChat/Rocket.Chat/issues/604) -- File Sharing via P2P: [Issue #369](https://github.com/RocketChat/Rocket.Chat/issues/369), [Issue #370](https://github.com/RocketChat/Rocket.Chat/issues/370) -- Anti-virus checking on file uploads: [Issue #757](https://github.com/RocketChat/Rocket.Chat/issues/757) +To see an up to date view of what we have planned view our [milestones](https://github.com/RocketChat/Rocket.Chat/milestones). + ## How it all started @@ -465,7 +444,9 @@ Emoji provided graciously by [JoyPixels](https://www.joypixels.com/) Testing with [BrowserStack](https://www.browserstack.com) +![LingoHub](https://user-images.githubusercontent.com/20868078/69438584-0dd0e880-0d24-11ea-9127-de61dcfa6cd6.png) +Translations done with [LingoHub](https://www.lingohub.com) # Donate diff --git a/app/2fa/client/accountSecurity.js b/app/2fa/client/accountSecurity.js index 027da271a65b..005f29c13df4 100644 --- a/app/2fa/client/accountSecurity.js +++ b/app/2fa/client/accountSecurity.js @@ -2,14 +2,11 @@ import { Meteor } from 'meteor/meteor'; import { ReactiveVar } from 'meteor/reactive-var'; import { Template } from 'meteor/templating'; import toastr from 'toastr'; -import qrcode from 'yaqrcode'; import { modal } from '../../ui-utils'; import { settings } from '../../settings'; import { t } from '../../utils'; -window.qrcode = qrcode; - Template.accountSecurity.helpers({ showImage() { return Template.instance().showImage.get(); @@ -41,9 +38,10 @@ Template.accountSecurity.events({ 'click .enable-2fa'(event, instance) { event.preventDefault(); - Meteor.call('2fa:enable', (error, result) => { + Meteor.call('2fa:enable', async (error, result) => { + const qrcode = await import('yaqrcode'); instance.imageSecret.set(result.secret); - instance.imageData.set(qrcode(result.url, { size: 200 })); + instance.imageData.set(qrcode.default(result.url, { size: 200 })); instance.state.set('registering'); diff --git a/app/api/server/api.js b/app/api/server/api.js index 9e42911baed4..22e7e8c26d92 100644 --- a/app/api/server/api.js +++ b/app/api/server/api.js @@ -15,16 +15,23 @@ import { getDefaultUserFields } from '../../utils/server/functions/getDefaultUse const logger = new Logger('API', {}); const rateLimiterDictionary = {}; -const defaultRateLimiterOptions = { +export const defaultRateLimiterOptions = { numRequestsAllowed: settings.get('API_Enable_Rate_Limiter_Limit_Calls_Default'), intervalTimeInMS: settings.get('API_Enable_Rate_Limiter_Limit_Time_Default'), }; export let API = {}; -class APIClass extends Restivus { +const getRequestIP = (req) => + req.headers['x-forwarded-for'] + || (req.connection && req.connection.remoteAddress) + || (req.socket && req.socket.remoteAddress) + || (req.connection && req.connection.socket && req.connection.socket.remoteAddress); + +export class APIClass extends Restivus { constructor(properties) { super(properties); + this.apiPath = properties.apiPath; this.authMethods = []; this.fieldSeparator = '.'; this.defaultFieldsToExclude = { @@ -33,7 +40,7 @@ class APIClass extends Restivus { importIds: 0, e2e: 0, }; - this.limitedUserFieldsToExclude = { + this.defaultLimitedUserFieldsToExclude = { avatarOrigin: 0, emails: 0, phone: 0, @@ -46,14 +53,25 @@ 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; } @@ -70,6 +88,12 @@ class APIClass extends Restivus { this.authMethods.push(method); } + shouldAddRateLimitToRoute(options) { + const { version } = this._config; + const { rateLimiterOptions } = options; + return (typeof rateLimiterOptions === 'object' || rateLimiterOptions === undefined) && Boolean(version) && !process.env.TEST_MODE && Boolean(defaultRateLimiterOptions.numRequestsAllowed && defaultRateLimiterOptions.intervalTimeInMS); + } + success(result = {}) { if (_.isObject(result)) { result.success = true; @@ -150,11 +174,41 @@ class APIClass extends Restivus { }; } + getRateLimiter(route) { + return rateLimiterDictionary[route]; + } + + shouldVerifyRateLimit(route) { + return rateLimiterDictionary.hasOwnProperty(route) + && settings.get('API_Enable_Rate_Limiter') === true + && (process.env.NODE_ENV !== 'development' || settings.get('API_Enable_Rate_Limiter_Dev') === true) + && !(this.userId && hasPermission(this.userId, 'api-bypass-rate-limit')); + } + + enforceRateLimit(objectForRateLimitMatch, request, response) { + if (!this.shouldVerifyRateLimit(objectForRateLimitMatch.route)) { + return; + } + + rateLimiterDictionary[objectForRateLimitMatch.route].rateLimiter.increment(objectForRateLimitMatch); + const attemptResult = rateLimiterDictionary[objectForRateLimitMatch.route].rateLimiter.check(objectForRateLimitMatch); + const timeToResetAttempsInSeconds = Math.ceil(attemptResult.timeToReset / 1000); + response.setHeader('X-RateLimit-Limit', rateLimiterDictionary[objectForRateLimitMatch.route].options.numRequestsAllowed); + response.setHeader('X-RateLimit-Remaining', attemptResult.numInvocationsLeft); + response.setHeader('X-RateLimit-Reset', new Date().getTime() + attemptResult.timeToReset); + + if (!attemptResult.allowed) { + throw new Meteor.Error('error-too-many-requests', `Error, too many requests. Please slow down. You must wait ${ timeToResetAttempsInSeconds } seconds before trying this endpoint again.`, { + timeToReset: attemptResult.timeToReset, + seconds: timeToResetAttempsInSeconds, + }); + } + } + reloadRoutesToRefreshRateLimiter() { const { version } = this._config; this._routes.forEach((route) => { - const shouldAddRateLimitToRoute = (typeof route.options.rateLimiterOptions === 'object' || route.options.rateLimiterOptions === undefined) && Boolean(version) && !process.env.TEST_MODE && Boolean(defaultRateLimiterOptions.numRequestsAllowed && defaultRateLimiterOptions.intervalTimeInMS); - if (shouldAddRateLimitToRoute) { + if (this.shouldAddRateLimitToRoute(route.options)) { this.addRateLimiterRuleForRoutes({ routes: [route.path], rateLimiterOptions: route.options.rateLimiterOptions || defaultRateLimiterOptions, @@ -172,10 +226,6 @@ class APIClass extends Restivus { if (!rateLimiterOptions.intervalTimeInMS) { throw new Meteor.Error('You must set "intervalTimeInMS" property in rateLimiter for REST API endpoint'); } - const nameRoute = (route) => { - const routeActions = Array.isArray(endpoints) ? endpoints : Object.keys(endpoints); - return routeActions.map((endpoint) => `/api/${ apiVersion }/${ route }${ endpoint }`); - }; const addRateLimitRuleToEveryRoute = (routes) => { routes.forEach((route) => { rateLimiterDictionary[route] = { @@ -190,10 +240,24 @@ class APIClass extends Restivus { }); }; routes - .map(nameRoute) + .map((route) => this.namedRoutes(route, endpoints, apiVersion)) .map(addRateLimitRuleToEveryRoute); } + getFullRouteName(route, method, apiVersion = null) { + let prefix = `/${ this.apiPath || '' }`; + if (apiVersion) { + prefix += `${ apiVersion }/`; + } + return `${ prefix }${ route }${ method }`; + } + + namedRoutes(route, endpoints, apiVersion) { + const routeActions = Array.isArray(endpoints) ? endpoints : Object.keys(endpoints); + + return routeActions.map((action) => this.getFullRouteName(route, action, apiVersion)); + } + addRoute(routes, options, endpoints) { // Note: required if the developer didn't provide options if (typeof endpoints === 'undefined') { @@ -216,8 +280,7 @@ class APIClass extends Restivus { routes = [routes]; } const { version } = this._config; - const shouldAddRateLimitToRoute = (typeof options.rateLimiterOptions === 'object' || options.rateLimiterOptions === undefined) && Boolean(version) && !process.env.TEST_MODE && Boolean(defaultRateLimiterOptions.numRequestsAllowed && defaultRateLimiterOptions.intervalTimeInMS); - if (shouldAddRateLimitToRoute) { + if (this.shouldAddRateLimitToRoute(options)) { this.addRateLimiterRuleForRoutes({ routes, rateLimiterOptions: options.rateLimiterOptions || defaultRateLimiterOptions, @@ -233,6 +296,7 @@ class APIClass extends Restivus { } // Add a try/catch for each endpoint const originalAction = endpoints[method].action; + const api = this; endpoints[method].action = function _internalRouteActionHandler() { const rocketchatRestApiEnd = metrics.rocketchatRestApi.startTimer({ method, @@ -242,32 +306,14 @@ class APIClass extends Restivus { }); logger.debug(`${ this.request.method.toUpperCase() }: ${ this.request.url }`); - const requestIp = this.request.headers['x-forwarded-for'] || this.request.connection.remoteAddress || this.request.socket.remoteAddress || this.request.connection.socket.remoteAddress; + const requestIp = getRequestIP(this.request); const objectForRateLimitMatch = { IPAddr: requestIp, route: `${ this.request.route }${ this.request.method.toLowerCase() }`, }; let result; try { - const shouldVerifyRateLimit = rateLimiterDictionary.hasOwnProperty(objectForRateLimitMatch.route) - && settings.get('API_Enable_Rate_Limiter') === true - && (process.env.NODE_ENV !== 'development' || settings.get('API_Enable_Rate_Limiter_Dev') === true) - && !(this.userId && hasPermission(this.userId, 'api-bypass-rate-limit')); - - if (shouldVerifyRateLimit) { - rateLimiterDictionary[objectForRateLimitMatch.route].rateLimiter.increment(objectForRateLimitMatch); - const attemptResult = rateLimiterDictionary[objectForRateLimitMatch.route].rateLimiter.check(objectForRateLimitMatch); - const timeToResetAttempsInSeconds = Math.ceil(attemptResult.timeToReset / 1000); - this.response.setHeader('X-RateLimit-Limit', rateLimiterDictionary[objectForRateLimitMatch.route].options.numRequestsAllowed); - this.response.setHeader('X-RateLimit-Remaining', attemptResult.numInvocationsLeft); - this.response.setHeader('X-RateLimit-Reset', new Date().getTime() + attemptResult.timeToReset); - if (!attemptResult.allowed) { - throw new Meteor.Error('error-too-many-requests', `Error, too many requests. Please slow down. You must wait ${ timeToResetAttempsInSeconds } seconds before trying this endpoint again.`, { - timeToReset: attemptResult.timeToReset, - seconds: timeToResetAttempsInSeconds, - }); - } - } + api.enforceRateLimit(objectForRateLimitMatch, this.request, this.response); if (shouldVerifyPermissions && (!this.userId || !hasAllPermission(this.userId, options.permissionsRequired))) { throw new Meteor.Error('error-unauthorized', 'User does not have the permissions required for this action', { @@ -531,35 +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', - 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({ - 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/index.js b/app/api/server/index.js index da65a35e8502..a45220f00a0f 100644 --- a/app/api/server/index.js +++ b/app/api/server/index.js @@ -13,6 +13,7 @@ import './default/info'; import './v1/assets'; import './v1/channels'; import './v1/chat'; +import './v1/cloud'; import './v1/commands'; import './v1/e2e'; import './v1/emoji-custom'; @@ -30,5 +31,6 @@ import './v1/stats'; import './v1/subscriptions'; import './v1/users'; import './v1/video-conference'; +import './v1/autotranslate'; -export { API } from './api'; +export { API, APIClass, defaultRateLimiterOptions } from './api'; diff --git a/app/api/server/lib/messages.js b/app/api/server/lib/messages.js new file mode 100644 index 000000000000..9fdd48b33e5b --- /dev/null +++ b/app/api/server/lib/messages.js @@ -0,0 +1,117 @@ +import { canAccessRoomAsync } from '../../../authorization/server/functions/canAccessRoom'; +import { Rooms, Messages, Users } from '../../../models/server/raw'; +import { getValue } from '../../../settings/server/raw'; + +export async function findMentionedMessages({ uid, roomId, pagination: { offset, count, sort } }) { + const room = await Rooms.findOneById(roomId); + if (!await canAccessRoomAsync(room, { _id: uid })) { + throw new Error('error-not-allowed'); + } + const user = await Users.findOneById(uid, { fields: { username: 1 } }); + if (!user) { + throw new Error('invalid-user'); + } + + const cursor = await Messages.findVisibleByMentionAndRoomId(user.username, roomId, { + sort: sort || { ts: -1 }, + skip: offset, + limit: count, + }); + + const total = await cursor.count(); + + const messages = await cursor.toArray(); + + return { + messages, + count: messages.length, + offset, + total, + }; +} + +export async function findStarredMessages({ uid, roomId, pagination: { offset, count, sort } }) { + const room = await Rooms.findOneById(roomId); + if (!await canAccessRoomAsync(room, { _id: uid })) { + throw new Error('error-not-allowed'); + } + const user = await Users.findOneById(uid, { fields: { username: 1 } }); + if (!user) { + throw new Error('invalid-user'); + } + + const cursor = await Messages.findStarredByUserAtRoom(uid, roomId, { + sort: sort || { ts: -1 }, + skip: offset, + limit: count, + }); + + const total = await cursor.count(); + + const messages = await cursor.toArray(); + + return { + messages, + count: messages.length, + offset, + total, + }; +} + +export async function findSnippetedMessageById({ uid, messageId }) { + if (!await getValue('Message_AllowSnippeting')) { + throw new Error('error-not-allowed'); + } + + if (!uid) { + throw new Error('invalid-user'); + } + + const snippet = await Messages.findOne({ _id: messageId, snippeted: true }); + + if (!snippet) { + throw new Error('invalid-message'); + } + + const room = await Rooms.findOneById(snippet.rid); + + if (!room) { + throw new Error('invalid-message'); + } + + if (!await canAccessRoomAsync(room, { _id: uid })) { + throw new Error('error-not-allowed'); + } + + return { + message: snippet, + }; +} + +export async function findSnippetedMessages({ uid, roomId, pagination: { offset, count, sort } }) { + if (!await getValue('Message_AllowSnippeting')) { + throw new Error('error-not-allowed'); + } + const room = await Rooms.findOneById(roomId); + + if (!await canAccessRoomAsync(room, { _id: uid })) { + throw new Error('error-not-allowed'); + } + + const cursor = await Messages.findSnippetedByRoom(roomId, { + sort: sort || { ts: -1 }, + skip: offset, + limit: count, + }); + + const total = await cursor.count(); + + const messages = await cursor.toArray(); + + return { + messages, + count: messages.length, + offset, + total, + }; +} diff --git a/app/api/server/v1/autotranslate.js b/app/api/server/v1/autotranslate.js new file mode 100644 index 000000000000..da611dd89847 --- /dev/null +++ b/app/api/server/v1/autotranslate.js @@ -0,0 +1,65 @@ +import { Meteor } from 'meteor/meteor'; + +import { API } from '../api'; +import { settings } from '../../../settings'; +import { Messages } from '../../../models/server'; + +API.v1.addRoute('autotranslate.getSupportedLanguages', { authRequired: true }, { + get() { + if (!settings.get('AutoTranslate_Enabled')) { + return API.v1.failure('AutoTranslate is disabled.'); + } + const { targetLanguage } = this.queryParams; + const languages = Meteor.runAsUser(this.userId, () => Meteor.call('autoTranslate.getSupportedLanguages', targetLanguage)); + + return API.v1.success({ languages: languages || [] }); + }, +}); + +API.v1.addRoute('autotranslate.saveSettings', { authRequired: true }, { + post() { + const { roomId, field, value, defaultLanguage } = this.bodyParams; + if (!settings.get('AutoTranslate_Enabled')) { + return API.v1.failure('AutoTranslate is disabled.'); + } + if (!roomId) { + return API.v1.failure('The bodyParam "roomId" is required.'); + } + if (!field) { + return API.v1.failure('The bodyParam "field" is required.'); + } + if (value === undefined) { + return API.v1.failure('The bodyParam "value" is required.'); + } + if (field === 'autoTranslate' && typeof value !== 'boolean') { + return API.v1.failure('The bodyParam "autoTranslate" must be a boolean.'); + } + if (field === 'autoTranslateLanguage' && typeof value !== 'string') { + return API.v1.failure('The bodyParam "autoTranslateLanguage" must be a string.'); + } + + Meteor.runAsUser(this.userId, () => Meteor.call('autoTranslate.saveSettings', roomId, field, value === true ? '1' : String(value).valueOf(), { defaultLanguage })); + + return API.v1.success(); + }, +}); + +API.v1.addRoute('autotranslate.translateMessage', { authRequired: true }, { + post() { + const { messageId, targetLanguage } = this.bodyParams; + if (!settings.get('AutoTranslate_Enabled')) { + return API.v1.failure('AutoTranslate is disabled.'); + } + if (!messageId) { + return API.v1.failure('The bodyParam "messageId" is required.'); + } + const message = Messages.findOneById(messageId); + if (!message) { + return API.v1.failure('Message not found.'); + } + + const translatedMessage = Meteor.runAsUser(this.userId, () => Meteor.call('autoTranslate.translateMessage', message, targetLanguage)); + + return API.v1.success({ message: translatedMessage }); + }, +}); diff --git a/app/api/server/v1/channels.js b/app/api/server/v1/channels.js index 1a4e74afbbcb..682ff697e9ab 100644 --- a/app/api/server/v1/channels.js +++ b/app/api/server/v1/channels.js @@ -2,7 +2,8 @@ import { Meteor } from 'meteor/meteor'; import _ from 'underscore'; import { Rooms, Subscriptions, Messages, Uploads, Integrations, Users } from '../../../models'; -import { hasPermission } from '../../../authorization'; +import { hasPermission, hasAtLeastOnePermission } from '../../../authorization/server'; +import { mountIntegrationQueryBasedOnPermissions } from '../../../integrations/server/lib/mountQueriesBasedOnPermission'; import { normalizeMessagesForUser } from '../../../utils/server/lib/normalizeMessagesForUser'; import { API } from '../api'; import { settings } from '../../../settings'; @@ -286,7 +287,12 @@ API.v1.addRoute('channels.files', { authRequired: true }, { API.v1.addRoute('channels.getIntegrations', { authRequired: true }, { get() { - if (!hasPermission(this.userId, 'manage-integrations')) { + if (!hasAtLeastOnePermission(this.userId, [ + 'manage-outgoing-integrations', + 'manage-own-outgoing-integrations', + 'manage-incoming-integrations', + 'manage-own-incoming-integrations', + ])) { return API.v1.unauthorized(); } @@ -310,8 +316,7 @@ API.v1.addRoute('channels.getIntegrations', { authRequired: true }, { const { offset, count } = this.getPaginationItems(); const { sort, fields, query } = this.parseJsonQuery(); - ourQuery = Object.assign({}, query, ourQuery); - + ourQuery = Object.assign(mountIntegrationQueryBasedOnPermissions(this.userId), query, ourQuery); const integrations = Integrations.find(ourQuery, { sort: sort || { _createdAt: 1 }, skip: offset, diff --git a/app/api/server/v1/chat.js b/app/api/server/v1/chat.js index 733b9614da51..4d1610a79d94 100644 --- a/app/api/server/v1/chat.js +++ b/app/api/server/v1/chat.js @@ -9,6 +9,7 @@ import { API } from '../api'; import Rooms from '../../../models/server/models/Rooms'; import Users from '../../../models/server/models/Users'; import { settings } from '../../../settings'; +import { findMentionedMessages, findStarredMessages, findSnippetedMessageById, findSnippetedMessages } from '../lib/messages'; API.v1.addRoute('chat.delete', { authRequired: true }, { post() { @@ -70,7 +71,7 @@ API.v1.addRoute('chat.syncMessages', { authRequired: true }, { return API.v1.success({ result: { updated: normalizeMessagesForUser(result.updated, this.userId), - deleted: normalizeMessagesForUser(result.deleted, this.userId), + deleted: result.deleted, }, }); }, @@ -392,6 +393,37 @@ API.v1.addRoute('chat.getDeletedMessages', { authRequired: true }, { }, }); +API.v1.addRoute('chat.getPinnedMessages', { authRequired: true }, { + get() { + const { roomId } = this.queryParams; + const { offset, count } = this.getPaginationItems(); + + if (!roomId) { + throw new Meteor.Error('error-roomId-param-not-provided', 'The required "roomId" query param is missing.'); + } + const room = Meteor.call('canAccessRoom', roomId, this.userId); + if (!room) { + throw new Meteor.Error('error-not-allowed', 'Not allowed'); + } + + const cursor = Messages.findPinnedByRoom(room._id, { + skip: offset, + limit: count, + }); + + const total = cursor.count(); + + const messages = cursor.fetch(); + + return API.v1.success({ + messages, + count: messages.length, + offset, + total, + }); + }, +}); + API.v1.addRoute('chat.getThreadsList', { authRequired: true }, { get() { const { rid } = this.queryParams; @@ -568,3 +600,83 @@ API.v1.addRoute('chat.unfollowMessage', { authRequired: true }, { return API.v1.success(); }, }); + +API.v1.addRoute('chat.getMentionedMessages', { authRequired: true }, { + get() { + const { roomId } = this.queryParams; + const { sort } = this.parseJsonQuery(); + const { offset, count } = this.getPaginationItems(); + if (!roomId) { + throw new Meteor.Error('error-invalid-params', 'The required "roomId" query param is missing.'); + } + const messages = Promise.await(findMentionedMessages({ + uid: this.userId, + roomId, + pagination: { + offset, + count, + sort, + }, + })); + return API.v1.success(messages); + }, +}); + +API.v1.addRoute('chat.getStarredMessages', { authRequired: true }, { + get() { + const { roomId } = this.queryParams; + const { sort } = this.parseJsonQuery(); + const { offset, count } = this.getPaginationItems(); + + if (!roomId) { + throw new Meteor.Error('error-invalid-params', 'The required "roomId" query param is missing.'); + } + const messages = Promise.await(findStarredMessages({ + uid: this.userId, + roomId, + pagination: { + offset, + count, + sort, + }, + })); + return API.v1.success(messages); + }, +}); + +API.v1.addRoute('chat.getSnippetedMessageById', { authRequired: true }, { + get() { + const { messageId } = this.queryParams; + + if (!messageId) { + throw new Meteor.Error('error-invalid-params', 'The required "messageId" query param is missing.'); + } + const message = Promise.await(findSnippetedMessageById({ + uid: this.userId, + messageId, + })); + return API.v1.success(message); + }, +}); + +API.v1.addRoute('chat.getSnippetedMessages', { authRequired: true }, { + get() { + const { roomId } = this.queryParams; + const { sort } = this.parseJsonQuery(); + const { offset, count } = this.getPaginationItems(); + + if (!roomId) { + throw new Meteor.Error('error-invalid-params', 'The required "roomId" query param is missing.'); + } + const messages = Promise.await(findSnippetedMessages({ + uid: this.userId, + roomId, + pagination: { + offset, + count, + sort, + }, + })); + return API.v1.success(messages); + }, +}); diff --git a/app/api/server/v1/cloud.js b/app/api/server/v1/cloud.js new file mode 100644 index 000000000000..1aa430151c41 --- /dev/null +++ b/app/api/server/v1/cloud.js @@ -0,0 +1,30 @@ +import { check } from 'meteor/check'; + +import { API } from '../api'; +import { hasRole } from '../../../authorization'; +import { saveRegistrationData } from '../../../cloud/server/functions/saveRegistrationData'; +import { retrieveRegistrationStatus } from '../../../cloud/server/functions/retrieveRegistrationStatus'; + +API.v1.addRoute('cloud.manualRegister', { authRequired: true }, { + post() { + check(this.bodyParams, { + cloudBlob: String, + }); + + if (!hasRole(this.userId, 'admin')) { + return API.v1.unauthorized(); + } + + const registrationInfo = retrieveRegistrationStatus(); + + if (registrationInfo.connectToCloud) { + return API.v1.failure('Workspace is already registered'); + } + + const settingsData = JSON.parse(Buffer.from(this.bodyParams.cloudBlob, 'base64').toString()); + + Promise.await(saveRegistrationData(settingsData)); + + return API.v1.success(); + }, +}); diff --git a/app/api/server/v1/commands.js b/app/api/server/v1/commands.js index 80e75fa2b6f9..5657bbb2d741 100644 --- a/app/api/server/v1/commands.js +++ b/app/api/server/v1/commands.js @@ -2,7 +2,7 @@ import { Meteor } from 'meteor/meteor'; import { Random } from 'meteor/random'; import { slashCommands } from '../../../utils'; -import { Rooms } from '../../../models'; +import { Rooms, Messages } from '../../../models'; import { API } from '../api'; API.v1.addRoute('commands.get', { authRequired: true }, { @@ -69,6 +69,10 @@ API.v1.addRoute('commands.run', { authRequired: true }, { return API.v1.failure('The room\'s id where to execute this command must be provided and be a string.'); } + if (body.tmid && typeof body.tmid !== 'string') { + return API.v1.failure('The tmid parameter when provided must be a string.'); + } + const cmd = body.command.toLowerCase(); if (!slashCommands.commands[body.command.toLowerCase()]) { return API.v1.failure('The command provided does not exist (or is disabled).'); @@ -78,15 +82,21 @@ API.v1.addRoute('commands.run', { authRequired: true }, { Meteor.call('canAccessRoom', body.roomId, user._id); const params = body.params ? body.params : ''; + const message = { + _id: Random.id(), + rid: body.roomId, + msg: `/${ cmd } ${ params }`, + }; - let result; - Meteor.runAsUser(user._id, () => { - result = slashCommands.run(cmd, params, { - _id: Random.id(), - rid: body.roomId, - msg: `/${ cmd } ${ params }`, - }); - }); + if (body.tmid) { + const thread = Messages.findOneById(body.tmid); + if (!thread || thread.rid !== body.roomId) { + return API.v1.failure('Invalid thread.'); + } + message.tmid = body.tmid; + } + + const result = Meteor.runAsUser(user._id, () => slashCommands.run(cmd, params, message)); return API.v1.success({ result }); }, diff --git a/app/api/server/v1/e2e.js b/app/api/server/v1/e2e.js index f7a6f49108a6..9329378a6700 100644 --- a/app/api/server/v1/e2e.js +++ b/app/api/server/v1/e2e.js @@ -34,12 +34,12 @@ API.v1.addRoute('e2e.setRoomKeyID', { authRequired: true }, { }, }); -API.v1.addRoute('e2e.setUserPublicAndPivateKeys', { authRequired: true }, { +API.v1.addRoute('e2e.setUserPublicAndPrivateKeys', { authRequired: true }, { post() { const { public_key, private_key } = this.bodyParams; Meteor.runAsUser(this.userId, () => { - API.v1.success(Meteor.call('e2e.setUserPublicAndPivateKeys', { + API.v1.success(Meteor.call('e2e.setUserPublicAndPrivateKeys', { public_key, private_key, })); diff --git a/app/api/server/v1/emoji-custom.js b/app/api/server/v1/emoji-custom.js index 243386792058..15b4035dd2be 100644 --- a/app/api/server/v1/emoji-custom.js +++ b/app/api/server/v1/emoji-custom.js @@ -5,17 +5,17 @@ import { EmojiCustom } from '../../../models'; import { API } from '../api'; // DEPRECATED -// Will be removed after v1.12.0 +// Will be removed after v3.0.0 API.v1.addRoute('emoji-custom', { authRequired: true }, { get() { - const warningMessage = 'The endpoint "emoji-custom" is deprecated and will be removed after version v1.12.0'; + const warningMessage = 'The endpoint "emoji-custom" is deprecated and will be removed after version v3.0.0'; console.warn(warningMessage); const { query } = this.parseJsonQuery(); const emojis = Meteor.call('listEmojiCustom', query); return API.v1.success(this.deprecationWarning({ endpoint: 'emoji-custom', - versionWillBeRemoved: '1.12.0', + versionWillBeRemoved: '3.0.0', response: { emojis, }, diff --git a/app/api/server/v1/groups.js b/app/api/server/v1/groups.js index b84c1d171a06..6c2b45b388b0 100644 --- a/app/api/server/v1/groups.js +++ b/app/api/server/v1/groups.js @@ -1,8 +1,9 @@ import _ from 'underscore'; import { Meteor } from 'meteor/meteor'; +import { mountIntegrationQueryBasedOnPermissions } from '../../../integrations/server/lib/mountQueriesBasedOnPermission'; import { Subscriptions, Rooms, Messages, Uploads, Integrations, Users } from '../../../models/server'; -import { hasPermission, canAccessRoom } from '../../../authorization/server'; +import { hasPermission, hasAtLeastOnePermission, canAccessRoom } from '../../../authorization/server'; import { normalizeMessagesForUser } from '../../../utils/server/lib/normalizeMessagesForUser'; import { API } from '../api'; @@ -280,7 +281,12 @@ API.v1.addRoute('groups.files', { authRequired: true }, { API.v1.addRoute('groups.getIntegrations', { authRequired: true }, { get() { - if (!hasPermission(this.userId, 'manage-integrations')) { + if (!hasAtLeastOnePermission(this.userId, [ + 'manage-outgoing-integrations', + 'manage-own-outgoing-integrations', + 'manage-incoming-integrations', + 'manage-own-incoming-integrations', + ])) { return API.v1.unauthorized(); } @@ -299,7 +305,7 @@ API.v1.addRoute('groups.getIntegrations', { authRequired: true }, { const { offset, count } = this.getPaginationItems(); const { sort, fields, query } = this.parseJsonQuery(); - const ourQuery = Object.assign({}, query, { channel: { $in: channelsToSearch } }); + const ourQuery = Object.assign(mountIntegrationQueryBasedOnPermissions(this.userId), query, { channel: { $in: channelsToSearch } }); const integrations = Integrations.find(ourQuery, { sort: sort || { _createdAt: 1 }, skip: offset, diff --git a/app/api/server/v1/integrations.js b/app/api/server/v1/integrations.js index b4e69cbf1489..a5d7d9ec2b41 100644 --- a/app/api/server/v1/integrations.js +++ b/app/api/server/v1/integrations.js @@ -1,9 +1,10 @@ import { Meteor } from 'meteor/meteor'; import { Match, check } from 'meteor/check'; -import { hasPermission } from '../../../authorization'; +import { hasAtLeastOnePermission } from '../../../authorization/server'; import { IntegrationHistory, Integrations } from '../../../models'; import { API } from '../api'; +import { mountIntegrationHistoryQueryBasedOnPermissions, mountIntegrationQueryBasedOnPermissions } from '../../../integrations/server/lib/mountQueriesBasedOnPermission'; API.v1.addRoute('integrations.create', { authRequired: true }, { post() { @@ -48,7 +49,10 @@ API.v1.addRoute('integrations.create', { authRequired: true }, { API.v1.addRoute('integrations.history', { authRequired: true }, { get() { - if (!hasPermission(this.userId, 'manage-integrations')) { + if (!hasAtLeastOnePermission(this.userId, [ + 'manage-outgoing-integrations', + 'manage-own-outgoing-integrations', + ])) { return API.v1.unauthorized(); } @@ -59,8 +63,8 @@ API.v1.addRoute('integrations.history', { authRequired: true }, { const { id } = this.queryParams; const { offset, count } = this.getPaginationItems(); const { sort, fields, query } = this.parseJsonQuery(); + const ourQuery = Object.assign(mountIntegrationHistoryQueryBasedOnPermissions(this.userId, id), query); - const ourQuery = Object.assign({}, query, { 'integration._id': id }); const history = IntegrationHistory.find(ourQuery, { sort: sort || { _updatedAt: -1 }, skip: offset, @@ -79,14 +83,19 @@ API.v1.addRoute('integrations.history', { authRequired: true }, { API.v1.addRoute('integrations.list', { authRequired: true }, { get() { - if (!hasPermission(this.userId, 'manage-integrations')) { + if (!hasAtLeastOnePermission(this.userId, [ + 'manage-outgoing-integrations', + 'manage-own-outgoing-integrations', + 'manage-incoming-integrations', + 'manage-own-incoming-integrations', + ])) { return API.v1.unauthorized(); } const { offset, count } = this.getPaginationItems(); const { sort, fields, query } = this.parseJsonQuery(); - const ourQuery = Object.assign({}, query); + const ourQuery = Object.assign(mountIntegrationQueryBasedOnPermissions(this.userId), query); const integrations = Integrations.find(ourQuery, { sort: sort || { ts: -1 }, skip: offset, @@ -105,6 +114,15 @@ API.v1.addRoute('integrations.list', { authRequired: true }, { API.v1.addRoute('integrations.remove', { authRequired: true }, { post() { + if (!hasAtLeastOnePermission(this.userId, [ + 'manage-outgoing-integrations', + 'manage-own-outgoing-integrations', + 'manage-incoming-integrations', + 'manage-own-incoming-integrations', + ])) { + return API.v1.unauthorized(); + } + check(this.bodyParams, Match.ObjectIncluding({ type: String, target_url: Match.Maybe(String), diff --git a/app/api/server/v1/misc.js b/app/api/server/v1/misc.js index d5fee67418fc..51892359ec20 100644 --- a/app/api/server/v1/misc.js +++ b/app/api/server/v1/misc.js @@ -1,6 +1,6 @@ import { Meteor } from 'meteor/meteor'; import { check } from 'meteor/check'; -import { TAPi18n } from 'meteor/tap:i18n'; +import { TAPi18n } from 'meteor/rocketchat:tap-i18n'; import s from 'underscore.string'; import { hasRole } from '../../../authorization'; @@ -13,17 +13,17 @@ import { getURL } from '../../../utils/lib/getURL'; // DEPRECATED -// Will be removed after v1.12.0 +// Will be removed after v3.0.0 API.v1.addRoute('info', { authRequired: false }, { get() { - const warningMessage = 'The endpoint "/v1/info" is deprecated and will be removed after version v1.12.0'; + const warningMessage = 'The endpoint "/v1/info" is deprecated and will be removed after version v3.0.0'; console.warn(warningMessage); const user = this.getLoggedInUser(); if (user && hasRole(user._id, 'admin')) { return API.v1.success(this.deprecationWarning({ endpoint: 'info', - versionWillBeRemoved: '1.12.0', + versionWillBeRemoved: '3.0.0', response: { info: Info, }, @@ -32,7 +32,7 @@ API.v1.addRoute('info', { authRequired: false }, { return API.v1.success(this.deprecationWarning({ endpoint: 'info', - versionWillBeRemoved: '1.12.0', + versionWillBeRemoved: '3.0.0', response: { info: { version: Info.version, diff --git a/app/api/server/v1/rooms.js b/app/api/server/v1/rooms.js index 7cab7a10977b..92225c64fee0 100644 --- a/app/api/server/v1/rooms.js +++ b/app/api/server/v1/rooms.js @@ -2,7 +2,7 @@ import { Meteor } from 'meteor/meteor'; import Busboy from 'busboy'; import { FileUpload } from '../../../file-upload'; -import { Rooms } from '../../../models'; +import { Rooms, Messages } from '../../../models'; import { API } from '../api'; function findRoomByIdOrName({ params, checkedArchived = true }) { @@ -73,7 +73,7 @@ API.v1.addRoute('rooms.upload/:rid', { authRequired: true }, { Meteor.wrapAsync((callback) => { busboy.on('file', (fieldname, file, filename, encoding, mimetype) => { if (fieldname !== 'file') { - return files.push(new Meteor.Error('invalid-field')); + return callback(new Meteor.Error('invalid-field')); } const fileDate = []; @@ -111,6 +111,8 @@ API.v1.addRoute('rooms.upload/:rid', { authRequired: true }, { userId: this.userId, }; + let fileData = {}; + Meteor.runAsUser(this.userId, () => { const uploadedFile = Meteor.wrapAsync(fileStore.insert.bind(fileStore))(details, file.fileBuffer); @@ -119,9 +121,11 @@ API.v1.addRoute('rooms.upload/:rid', { authRequired: true }, { delete fields.description; API.v1.success(Meteor.call('sendFileMessage', this.urlParams.rid, null, uploadedFile, fields)); + + fileData = uploadedFile; }); - return API.v1.success(); + return API.v1.success({ message: Messages.getMessageByFileIdAndUsername(fileData._id, this.userId) }); }, }); diff --git a/app/api/server/v1/users.js b/app/api/server/v1/users.js index 317b6e8a6bf8..ec3a3090a47b 100644 --- a/app/api/server/v1/users.js +++ b/app/api/server/v1/users.js @@ -1,6 +1,6 @@ import { Meteor } from 'meteor/meteor'; import { Match, check } from 'meteor/check'; -import { TAPi18n } from 'meteor/tap:i18n'; +import { TAPi18n } from 'meteor/rocketchat:tap-i18n'; import _ from 'underscore'; import Busboy from 'busboy'; @@ -31,6 +31,7 @@ API.v1.addRoute('users.create', { authRequired: true }, { roles: Match.Maybe(Array), joinDefaultChannels: Match.Maybe(Boolean), requirePasswordChange: Match.Maybe(Boolean), + setRandomPassword: Match.Maybe(Boolean), sendWelcomeEmail: Match.Maybe(Boolean), verified: Match.Maybe(Boolean), customFields: Match.Maybe(Object), @@ -58,7 +59,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 +232,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 +430,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 }) }); }, }); @@ -507,6 +512,7 @@ API.v1.addRoute('users.setPreferences', { authRequired: true }, { enableAutoAway: Match.Maybe(Boolean), highlights: Match.Maybe(Array), desktopNotificationDuration: Match.Maybe(Number), + desktopNotificationRequireInteraction: Match.Maybe(Boolean), messageViewMode: Match.Maybe(Number), hideUsernames: Match.Maybe(Boolean), hideRoles: Match.Maybe(Boolean), @@ -525,28 +531,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, @@ -674,3 +673,15 @@ API.v1.addRoute('users.presence', { authRequired: true }, { }); }, }); + +API.v1.addRoute('users.requestDataDownload', { authRequired: true }, { + get() { + const { fullExport = false } = this.queryParams; + const result = Meteor.runAsUser(this.userId, () => Meteor.call('requestDataDownload', { fullExport: fullExport === 'true' })); + + return API.v1.success({ + requested: result.requested, + exportOperation: result.exportOperation, + }); + }, +}); diff --git a/app/apps/client/admin/appInstall.js b/app/apps/client/admin/appInstall.js index 8ff298c54feb..969486a38220 100644 --- a/app/apps/client/admin/appInstall.js +++ b/app/apps/client/admin/appInstall.js @@ -11,10 +11,38 @@ import { ReactiveVar } from 'meteor/reactive-var'; import { FlowRouter } from 'meteor/kadira:flow-router'; import { Template } from 'meteor/templating'; import { Tracker } from 'meteor/tracker'; +import toastr from 'toastr'; import { APIClient } from '../../../utils'; import { SideNav } from '../../../ui-utils/client'; +function handleInstallError(apiError) { + if (!apiError.xhr || !apiError.xhr.responseJSON) { return; } + + const { status, messages, error } = apiError.xhr.responseJSON; + + let message; + + switch (status) { + case 'storage_error': + message = messages.join(''); + break; + + case 'compiler_error': + message = 'There has been compiler errors. App cannot be installed'; + break; + + default: + if (error) { + message = error; + } else { + message = 'There has been an error installing the app'; + } + } + + toastr.error(message); +} + Template.appInstall.helpers({ appFile() { return Template.instance().file.get(); @@ -81,13 +109,9 @@ Template.appInstall.events({ result = await APIClient.post('apps', { url }); } - if (result.compilerErrors.length !== 0 || result.app.status === 'compiler_error') { - console.warn(`The App contains errors and could not be ${ isUpdating ? 'updated' : 'installed' }.`); - } else { - FlowRouter.go(`/admin/apps/${ result.app.id }`); - } + FlowRouter.go(`/admin/apps/${ result.app.id }`); } catch (err) { - console.warn('err', err); + handleInstallError(err); } t.isInstalling.set(false); @@ -124,15 +148,9 @@ Template.appInstall.events({ result = await APIClient.upload('apps', data); } - console.log('install result', result); - - if (result.compilerErrors.length !== 0 || result.app.status === 'compiler_error') { - console.warn(`The App contains errors and could not be ${ isUpdating ? 'updated' : 'installed' }.`); - } else { - FlowRouter.go(`/admin/apps/${ result.app.id }`); - } + FlowRouter.go(`/admin/apps/${ result.app.id }?version=${ result.app.version }`); } catch (err) { - console.warn('err', err); + handleInstallError(err); } t.isInstalling.set(false); diff --git a/app/apps/client/admin/appLogs.js b/app/apps/client/admin/appLogs.js index fc6500abfdd1..46e82534c05b 100644 --- a/app/apps/client/admin/appLogs.js +++ b/app/apps/client/admin/appLogs.js @@ -1,7 +1,7 @@ import { ReactiveVar } from 'meteor/reactive-var'; import { FlowRouter } from 'meteor/kadira:flow-router'; import { Template } from 'meteor/templating'; -import { TAPi18n } from 'meteor/tap:i18n'; +import { TAPi18n } from 'meteor/rocketchat:tap-i18n'; import { Tracker } from 'meteor/tracker'; import moment from 'moment'; import hljs from 'highlight.js'; 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/client/admin/appManage.js b/app/apps/client/admin/appManage.js index e94565cca3cb..fb3a2c520074 100644 --- a/app/apps/client/admin/appManage.js +++ b/app/apps/client/admin/appManage.js @@ -2,7 +2,7 @@ import { Meteor } from 'meteor/meteor'; import { ReactiveDict } from 'meteor/reactive-dict'; import { FlowRouter } from 'meteor/kadira:flow-router'; import { Template } from 'meteor/templating'; -import { TAPi18n, TAPi18next } from 'meteor/tap:i18n'; +import { TAPi18n, TAPi18next } from 'meteor/rocketchat:tap-i18n'; import { Tracker } from 'meteor/tracker'; import _ from 'underscore'; @@ -26,7 +26,6 @@ import { import './appManage.html'; import './appManage.css'; - const attachAPIs = async (appId, state) => { try { const apis = await Apps.getAppApis(appId); @@ -194,9 +193,11 @@ Template.appManage.onCreated(function() { loadApp(this); }); + this.handleRemoved = withAppIdFilter(() => FlowRouter.go('/admin/apps')); + Apps.getWsListener().registerListener(AppEvents.APP_ADDED, this.handleChange); Apps.getWsListener().registerListener(AppEvents.APP_UPDATED, this.handleChange); - Apps.getWsListener().registerListener(AppEvents.APP_REMOVED, this.handleChange); + Apps.getWsListener().registerListener(AppEvents.APP_REMOVED, this.handleRemoved); Apps.getWsListener().registerListener(AppEvents.APP_STATUS_CHANGE, this.handleChange); Apps.getWsListener().registerListener(AppEvents.APP_SETTING_UPDATED, this.handleSettingUpdated); }); @@ -204,7 +205,7 @@ Template.appManage.onCreated(function() { Template.apps.onDestroyed(function() { Apps.getWsListener().unregisterListener(AppEvents.APP_ADDED, this.handleChange); Apps.getWsListener().unregisterListener(AppEvents.APP_UPDATED, this.handleChange); - Apps.getWsListener().unregisterListener(AppEvents.APP_REMOVED, this.handleChange); + Apps.getWsListener().unregisterListener(AppEvents.APP_REMOVED, this.handleRemoved); Apps.getWsListener().unregisterListener(AppEvents.APP_STATUS_CHANGE, this.handleChange); Apps.getWsListener().unregisterListener(AppEvents.APP_SETTING_UPDATED, this.handleSettingUpdated); }); @@ -398,7 +399,7 @@ Template.appManage.events({ _app.set('working', true); try { - const { status } = await Apps.installApp(appId, _app.get('marketplaceVersion')); + const { status } = await Apps.updateApp(appId, _app.get('marketplaceVersion')); warnStatusChange(_app.get('name'), status); } catch (error) { handleAPIError(error); diff --git a/app/apps/client/admin/apps.js b/app/apps/client/admin/apps.js index b98621d496bf..a62184c7a720 100644 --- a/app/apps/client/admin/apps.js +++ b/app/apps/client/admin/apps.js @@ -36,11 +36,11 @@ Template.apps.onCreated(function() { (async () => { try { - const appsFromMarketplace = await Apps.getAppsFromMarketplace(); + const appsFromMarketplace = await Apps.getAppsFromMarketplace().catch(() => []); const installedApps = await Apps.getApps(); const apps = installedApps.map((app) => { - const appFromMarketplace = appsFromMarketplace.find(({ id }) => id === app.id); + const appFromMarketplace = appsFromMarketplace.find(({ id } = {}) => id === app.id); if (!appFromMarketplace) { return { diff --git a/app/apps/client/admin/helpers.js b/app/apps/client/admin/helpers.js index 839974e465ed..ca04c715fbc5 100644 --- a/app/apps/client/admin/helpers.js +++ b/app/apps/client/admin/helpers.js @@ -277,8 +277,7 @@ export const appButtonProps = ({ }) => { const canUpdate = installed && version && marketplaceVersion - && semver.lt(version, marketplaceVersion) - && isPurchased; + && semver.lt(version, marketplaceVersion); if (canUpdate) { return { action: 'update', @@ -335,7 +334,7 @@ export const appStatusSpanProps = ({ return { type: 'failed', icon: 'warning', - label: 'Failed', + label: status === AppStatus.INVALID_SETTINGS_DISABLED ? 'Config Needed' : 'Failed', }; } diff --git a/app/apps/client/admin/views.js b/app/apps/client/admin/views.js new file mode 100644 index 000000000000..83f4f0a0e69e --- /dev/null +++ b/app/apps/client/admin/views.js @@ -0,0 +1,11 @@ +import './modalTemplates/iframeModal.html'; +import './modalTemplates/iframeModal'; +import './marketplace'; +import './apps'; +import './appInstall.html'; +import './appInstall'; +import './appLogs.html'; +import './appLogs'; +import './appManage'; +import './appWhatIsIt.html'; +import './appWhatIsIt'; diff --git a/app/apps/client/i18n.js b/app/apps/client/i18n.js index 3a33d17f111b..9b9b1a9755e2 100644 --- a/app/apps/client/i18n.js +++ b/app/apps/client/i18n.js @@ -1,4 +1,4 @@ -import { TAPi18next } from 'meteor/tap:i18n'; +import { TAPi18next } from 'meteor/rocketchat:tap-i18n'; import { Apps } from './orchestrator'; import { Utilities } from '../lib/misc/Utilities'; diff --git a/app/apps/client/index.js b/app/apps/client/index.js index 887964154a90..a89134a70f54 100644 --- a/app/apps/client/index.js +++ b/app/apps/client/index.js @@ -1,14 +1,3 @@ -import './admin/modalTemplates/iframeModal.html'; -import './admin/modalTemplates/iframeModal'; -import './admin/marketplace'; -import './admin/apps'; -import './admin/appInstall.html'; -import './admin/appInstall'; -import './admin/appLogs.html'; -import './admin/appLogs'; -import './admin/appManage'; -import './admin/appWhatIsIt.html'; -import './admin/appWhatIsIt'; import './routes'; export { Apps } from './orchestrator'; diff --git a/app/apps/client/orchestrator.js b/app/apps/client/orchestrator.js index 28b06e558de4..f7b44912401a 100644 --- a/app/apps/client/orchestrator.js +++ b/app/apps/client/orchestrator.js @@ -145,6 +145,15 @@ class AppClientOrchestrator { return app; } + updateApp = async (appId, version) => { + const { app } = await APIClient.post(`apps/${ appId }`, { + appId, + marketplace: true, + version, + }); + return app; + } + uninstallApp = (appId) => APIClient.delete(`apps/${ appId }`) syncApp = (appId) => APIClient.post(`apps/${ appId }/sync`) diff --git a/app/apps/client/routes.js b/app/apps/client/routes.js index 1a44f4d74bff..914137e5f72f 100644 --- a/app/apps/client/routes.js +++ b/app/apps/client/routes.js @@ -7,6 +7,7 @@ FlowRouter.route('/admin/apps/what-is-it', { name: 'apps-what-is-it', action: async () => { // TODO: render loading indicator + await import('./admin/views'); if (await Apps.isEnabled()) { FlowRouter.go('apps'); } else { @@ -18,6 +19,7 @@ FlowRouter.route('/admin/apps/what-is-it', { const createAppsRouteAction = (centerTemplate) => async () => { // TODO: render loading indicator if (await Apps.isEnabled()) { + await import('./admin/views'); BlazeLayout.render('main', { center: centerTemplate, old: true }); // TODO remove old } else { FlowRouter.go('apps-what-is-it'); 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..9eefe1906117 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), @@ -147,27 +148,45 @@ export class AppCommandsBridge { _appCommandExecutor(command, parameters, message) { const user = this.orch.getConverters().get('users').convertById(Meteor.userId()); const room = this.orch.getConverters().get('rooms').convertById(message.rid); + const threadId = message.tmid; const params = parameters.length === 0 || parameters === ' ' ? [] : parameters.split(' '); - const context = new SlashCommandContext(Object.freeze(user), Object.freeze(room), Object.freeze(params)); + const context = new SlashCommandContext( + Object.freeze(user), + Object.freeze(room), + Object.freeze(params), + threadId, + ); Promise.await(this.orch.getManager().getCommandManager().executeCommand(command, context)); } _appCommandPreviewer(command, parameters, message) { const user = this.orch.getConverters().get('users').convertById(Meteor.userId()); const room = this.orch.getConverters().get('rooms').convertById(message.rid); + const threadId = message.tmid; const params = parameters.length === 0 || parameters === ' ' ? [] : parameters.split(' '); - const context = new SlashCommandContext(Object.freeze(user), Object.freeze(room), Object.freeze(params)); + const context = new SlashCommandContext( + Object.freeze(user), + Object.freeze(room), + Object.freeze(params), + threadId + ); return Promise.await(this.orch.getManager().getCommandManager().getPreviews(command, context)); } _appCommandPreviewExecutor(command, parameters, message, preview) { const user = this.orch.getConverters().get('users').convertById(Meteor.userId()); const room = this.orch.getConverters().get('rooms').convertById(message.rid); + const threadId = message.tmid; const params = parameters.length === 0 || parameters === ' ' ? [] : parameters.split(' '); - const context = new SlashCommandContext(Object.freeze(user), Object.freeze(room), Object.freeze(params)); + const context = new SlashCommandContext( + Object.freeze(user), + Object.freeze(room), + Object.freeze(params), + threadId + ); Promise.await(this.orch.getManager().getCommandManager().executePreview(command, preview, context)); } } 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..edd3aabf00be --- /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 5b0a4f19d40b..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']); @@ -227,7 +228,7 @@ export class AppsRestApi { return API.v1.failure({ error: 'Failed to get a file to install for the App. ' }); } - const aff = Promise.await(manager.add(buff.toString('base64'), false, marketplaceInfo)); + const aff = Promise.await(manager.add(buff.toString('base64'), true, marketplaceInfo)); const info = aff.getAppInfo(); if (aff.hasStorageError()) { @@ -238,10 +239,6 @@ export class AppsRestApi { return API.v1.failure({ status: 'compiler_error', messages: aff.getCompilerErrors() }); } - if (aff.getLicenseValidationResult().hasErrors) { - return API.v1.failure({ status: 'license_error', messages: aff.getLicenseValidationResult().getErrors() }); - } - info.status = aff.getApp().getStatus(); return API.v1.success({ @@ -345,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..aaac047a2ef2 100644 --- a/app/apps/server/converters/messages.js +++ b/app/apps/server/converters/messages.js @@ -21,6 +21,7 @@ export class AppMessagesConverter { const map = { id: '_id', + threadId: 'tmid', reactions: 'reactions', parseUrls: 'parseUrls', text: 'msg', @@ -30,8 +31,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; @@ -116,6 +119,7 @@ export class AppMessagesConverter { const newMessage = { _id: message.id || Random.id(), + tmid: message.threadId, rid: room._id, u, msg: message.text, diff --git a/app/apps/server/converters/rooms.js b/app/apps/server/converters/rooms.js index 59c16e40ba91..d39050d7d0e3 100644 --- a/app/apps/server/converters/rooms.js +++ b/app/apps/server/converters/rooms.js @@ -1,6 +1,7 @@ import { RoomType } from '@rocket.chat/apps-engine/definition/rooms'; -import { Rooms, Users } from '../../../models'; +import { Rooms, Users, LivechatVisitors, LivechatDepartment } from '../../../models'; +import { transformMappedData } from '../../lib/misc/transformMappedData'; export class AppRoomsConverter { constructor(orch) { @@ -33,21 +34,65 @@ export class AppRoomsConverter { }; } - return { + 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, + }; + } + + const newRoom = { _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, }; + + return Object.assign(newRoom, room._unmappedProperties_); } convertRoom(room) { @@ -55,27 +100,103 @@ export class AppRoomsConverter { return undefined; } - let creator; - if (room.u) { - creator = this.orch.getConverters().get('users').convertById(room.u._id); - } + const map = { + id: '_id', + displayName: 'fname', + slugifiedName: 'name', + members: 'members', + messageCount: 'msgs', + createdAt: 'ts', + updatedAt: '_updatedAt', + closedAt: 'closedAt', + lastModifiedAt: 'lm', + customFields: 'customFields', + isWaitingResponse: 'waitingResponse', + isOpen: 'open', + isDefault: (room) => { + const result = !!room.default; + delete room.default; + return result; + }, + isReadOnly: (room) => { + const result = !!room.ro; + delete room.ro; + return result; + }, + displaySystemMessages: (room) => { + const { sysMes } = room; + + if (typeof sysMes === 'undefined') { + return true; + } + + delete room.sysMes; + return sysMes; + }, + type: (room) => { + const result = this._convertTypeToApp(room.t); + delete room.t; + return result; + }, + creator: (room) => { + const { u } = room; + + if (!u) { + return undefined; + } + + delete room.u; + + return this.orch.getConverters().get('users').convertById(u._id); + }, + visitor: (room) => { + const { v } = room; + + if (!v) { + return undefined; + } + + delete room.v; + + return this.orch.getConverters().get('visitors').convertById(v._id); + }, + department: (room) => { + const { departmentId } = room; + + if (!departmentId) { + return undefined; + } + + delete room.departmentId; + + return this.orch.getConverters().get('departments').convertById(departmentId); + }, + servedBy: (room) => { + const { servedBy } = room; + + if (!servedBy) { + return undefined; + } + + delete room.servedBy; + + return this.orch.getConverters().get('users').convertById(servedBy._id); + }, + responseBy: (room) => { + const { responseBy } = room; + + if (!responseBy) { + return undefined; + } + + delete room.responseBy; + + return this.orch.getConverters().get('users').convertById(responseBy._id); + }, - return { - id: room._id, - displayName: room.fname, - slugifiedName: room.name, - type: this._convertTypeToApp(room.t), - creator, - 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, - messageCount: room.msgs, - createdAt: room.ts, - updatedAt: room._updatedAt, - lastModifiedAt: room.lm, - customFields: {}, }; + + return transformMappedData(room, map); } _convertTypeToApp(typeChar) { 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 bbd40f7c0016..0e51170734d9 100644 --- a/app/apps/server/cron.js +++ b/app/apps/server/cron.js @@ -1,19 +1,24 @@ import { Meteor } from 'meteor/meteor'; import { HTTP } from 'meteor/http'; import { SyncedCron } from 'meteor/littledata:synced-cron'; -import { TAPi18n } from 'meteor/tap:i18n'; +import { TAPi18n } from 'meteor/rocketchat:tap-i18n'; 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) { + if (!apps) { + return; + } + const hasInvalidApps = !!apps.find((app) => app.getLatestLicenseValidationResult().hasErrors); if (!hasInvalidApps) { - return apps; + return; } const id = 'someAppInInvalidState'; @@ -22,34 +27,30 @@ 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; }); const notifyAdminsAboutRenewedApps = Meteor.bindEnvironment(function _notifyAdminsAboutRenewedApps(apps) { + if (!apps) { + return; + } + const renewedApps = apps.filter((app) => app.getStatus() === AppStatus.DISABLED && app.getPreviousStatus() === AppStatus.INVALID_LICENSE_DISABLED); if (renewedApps.length === 0) { @@ -58,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) }` }), }); }); @@ -107,7 +99,7 @@ export const appsUpdateMarketplaceInfo = Meteor.bindEnvironment(function _appsUp SyncedCron.add({ name: 'Apps-Engine:check', - schedule: (parser) => parser.text('at 4:00 pm'), + schedule: (parser) => parser.text('at 4:00 am'), job() { appsUpdateMarketplaceInfo(); }, 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 bc76743ea1c6..6ba4bfb147bc 100644 --- a/app/assets/server/assets.js +++ b/app/assets/server/assets.js @@ -488,8 +488,12 @@ WebApp.connectHandlers.use('/assets/', Meteor.bindEnvironment(function(req, res, const file = assets[params.asset] && assets[params.asset].cache; - const format = req.url.replace(/.*\.([a-z]+)$/, '$1'); + const format = req.url.replace(/.*\.([a-z]+)(?:$|\?.*)/i, '$1'); + if (assets[params.asset] && Array.isArray(assets[params.asset].constraints.extensions) && !assets[params.asset].constraints.extensions.includes(format)) { + res.writeHead(403); + return res.end(); + } if (!file) { const defaultUrl = assets[params.asset] && assets[params.asset].defaultUrl; if (defaultUrl) { diff --git a/app/assistify/ai/client/views/app/tabbar/smarti.js b/app/assistify/ai/client/views/app/tabbar/smarti.js index c48ebec9c5aa..b77945672017 100644 --- a/app/assistify/ai/client/views/app/tabbar/smarti.js +++ b/app/assistify/ai/client/views/app/tabbar/smarti.js @@ -1,5 +1,5 @@ import { Meteor } from 'meteor/meteor'; -import { TAPi18n } from 'meteor/tap:i18n'; +import { TAPi18n } from 'meteor/rocketchat:tap-i18n'; import { Template } from 'meteor/templating'; import { ReactiveVar } from 'meteor/reactive-var'; diff --git a/app/assistify/ai/server/lib/AiApiAdapter.js b/app/assistify/ai/server/lib/AiApiAdapter.js index fc34699082de..efe1b72f04e6 100644 --- a/app/assistify/ai/server/lib/AiApiAdapter.js +++ b/app/assistify/ai/server/lib/AiApiAdapter.js @@ -1,7 +1,7 @@ import _ from 'underscore'; import { HTTP } from 'meteor/http'; -import { LivechatExternalMessage } from '../../../../livechat/lib/LivechatExternalMessage'; +import { LivechatExternalMessage } from '../../../../models/server/raw'; export class ApiAiAdapter { constructor(adapterProps) { diff --git a/app/assistify/configuration/server/roles.js b/app/assistify/configuration/server/roles.js index cb592ea9bff4..f60904f8fb02 100644 --- a/app/assistify/configuration/server/roles.js +++ b/app/assistify/configuration/server/roles.js @@ -173,6 +173,7 @@ const createConfigurationRole = function() { 'manage-own-integrations', 'manage-selected-settings', 'manage-assets', + 'manage-apps', ])); revokePermissions(CONFIGURATION_ROLE_NAME, [ diff --git a/app/authorization/client/index.js b/app/authorization/client/index.js index 709df4e2f38c..7ff5353f1f79 100644 --- a/app/authorization/client/index.js +++ b/app/authorization/client/index.js @@ -4,10 +4,6 @@ import './usersNameChanged'; import './requiresPermission.html'; import './route'; import './startup'; -import './views/permissions.html'; -import './views/permissions'; -import './views/permissionsRole.html'; -import './views/permissionsRole'; export { hasAllPermission, diff --git a/app/authorization/client/route.js b/app/authorization/client/route.js index 5d54d53c8888..2415242d6eb9 100644 --- a/app/authorization/client/route.js +++ b/app/authorization/client/route.js @@ -5,7 +5,8 @@ import { t } from '../../utils/client'; FlowRouter.route('/admin/permissions', { name: 'admin-permissions', - action(/* params*/) { + async action(/* params*/) { + await import('./views'); return BlazeLayout.render('main', { center: 'permissions', pageTitle: t('Permissions'), @@ -15,7 +16,8 @@ FlowRouter.route('/admin/permissions', { FlowRouter.route('/admin/permissions/:name?/edit', { name: 'admin-permissions-edit', - action(/* params*/) { + async action(/* params*/) { + await import('./views'); return BlazeLayout.render('main', { center: 'pageContainer', pageTitle: t('Role_Editing'), @@ -26,7 +28,8 @@ FlowRouter.route('/admin/permissions/:name?/edit', { FlowRouter.route('/admin/permissions/new', { name: 'admin-permissions-new', - action(/* params*/) { + async action(/* params*/) { + await import('./views'); return BlazeLayout.render('main', { center: 'pageContainer', pageTitle: t('Role_Editing'), diff --git a/app/authorization/client/views/index.js b/app/authorization/client/views/index.js new file mode 100644 index 000000000000..ba54dffa5c02 --- /dev/null +++ b/app/authorization/client/views/index.js @@ -0,0 +1,4 @@ +import './permissions.html'; +import './permissions'; +import './permissionsRole.html'; +import './permissionsRole'; diff --git a/app/authorization/client/views/permissions.js b/app/authorization/client/views/permissions.js index f0b12efbdffb..d03ac7d52cbb 100644 --- a/app/authorization/client/views/permissions.js +++ b/app/authorization/client/views/permissions.js @@ -22,8 +22,8 @@ Template.permissions.helpers({ } = Template.instance(); const permissionsTab = { - label: t('Permissons'), - value: 'permissons', + label: t('Permissions'), + value: 'permissions', condition() { return true; }, diff --git a/app/authorization/server/functions/canDeleteMessage.js b/app/authorization/server/functions/canDeleteMessage.js new file mode 100644 index 000000000000..aeb1e06ef126 --- /dev/null +++ b/app/authorization/server/functions/canDeleteMessage.js @@ -0,0 +1,41 @@ +import { hasPermissionAsync } from './hasPermission'; +import { getValue } from '../../../settings/server/raw'; + +const elapsedTime = (ts) => { + const dif = Date.now() - ts; + return Math.round((dif / 1000) / 60); +}; + +export const canDeleteMessageAsync = async (uid, { u, rid, ts }) => { + const forceDelete = await hasPermissionAsync(uid, 'force-delete-message', rid); + + if (forceDelete) { + return true; + } + + if (!ts) { + return false; + } + const deleteAllowed = await getValue('Message_AllowDeleting'); + + if (!deleteAllowed) { + return false; + } + + const allowedToDeleteAny = await hasPermissionAsync(uid, 'delete-message', rid); + + const allowed = allowedToDeleteAny || (uid === u._id && await hasPermissionAsync(uid, 'delete-own-message')); + if (!allowed) { + return false; + } + const blockDeleteInMinutes = await getValue('Message_AllowDeleting_BlockDeleteInMinutes'); + + if (!blockDeleteInMinutes) { + return true; + } + + const timeElapsedForMessage = elapsedTime(ts); + return timeElapsedForMessage <= blockDeleteInMinutes; +}; + +export const canDeleteMessage = (uid, { u, rid, ts }) => Promise.await(canDeleteMessageAsync(uid, { u, rid, ts })); diff --git a/app/authorization/server/functions/canSendMessage.js b/app/authorization/server/functions/canSendMessage.js index fbae305e07ac..26099af663f6 100644 --- a/app/authorization/server/functions/canSendMessage.js +++ b/app/authorization/server/functions/canSendMessage.js @@ -17,7 +17,7 @@ export const canSendMessageAsync = async (rid, { uid, username }, extraData) => } const subscription = await Subscriptions.findOneByRoomIdAndUserId(rid, uid, subscriptionOptions); - if (subscription.blocked || subscription.blocker) { + if (subscription && (subscription.blocked || subscription.blocker)) { throw new Error('room_is_blocked'); } diff --git a/app/authorization/server/functions/hasPermission.js b/app/authorization/server/functions/hasPermission.js index fffcd9fb886e..7077e0220c9e 100644 --- a/app/authorization/server/functions/hasPermission.js +++ b/app/authorization/server/functions/hasPermission.js @@ -1,14 +1,27 @@ -import { Permissions, Roles } from '../../../models/server/raw'; - -async function atLeastOne(userId, permissions = [], scope) { - for (let i = 0, total = permissions.length; i < total; i++) { - const permissionId = permissions[i]; - - // eslint-disable-next-line no-await-in-loop - const permission = await Permissions.findOne({ _id: permissionId }); - // eslint-disable-next-line no-await-in-loop - const found = await Roles.isUserInRoles(userId, permission.roles, scope); - if (found) { +import mem from 'mem'; + +import { Permissions, Users, Subscriptions } from '../../../models/server/raw'; + +const rolesHasPermission = mem(async (permission, roles) => { + const result = await Permissions.findOne({ _id: permission, roles: { $in: roles } }); + return !!result; +}); + +const getRoles = mem(async (uid, scope) => { + const { roles: userRoles = [] } = await Users.findOne({ _id: uid }); + const { roles: subscriptionsRoles = [] } = (scope && await Subscriptions.findOne({ rid: scope, 'u._id': uid }, { fields: { roles: 1 } })) || {}; + return [...userRoles, ...subscriptionsRoles].sort((a, b) => a.localeCompare(b)); +}, { maxAge: 1000 }); + +export const clearCache = () => { + mem.clear(getRoles); + mem.clear(rolesHasPermission); +}; + +async function atLeastOne(uid, permissions = [], scope) { + const sortedRoles = await getRoles(uid, scope); + for (const permission of permissions) { + if (await rolesHasPermission(permission, sortedRoles)) { // eslint-disable-line return true; } } @@ -16,15 +29,10 @@ async function atLeastOne(userId, permissions = [], scope) { return false; } -async function all(userId, permissions = [], scope) { - for (let i = 0, total = permissions.length; i < total; i++) { - const permissionId = permissions[i]; - - // eslint-disable-next-line no-await-in-loop - const permission = await Permissions.findOne({ _id: permissionId }); - // eslint-disable-next-line no-await-in-loop - const found = await Roles.isUserInRoles(userId, permission.roles, scope); - if (!found) { +async function all(uid, permissions = [], scope) { + const sortedRoles = await getRoles(uid, scope); + for (const permission of permissions) { + if (!await rolesHasPermission(permission, sortedRoles)) { // eslint-disable-line return false; } } diff --git a/app/authorization/server/index.js b/app/authorization/server/index.js index 37a853a1f101..01ac6e9e8078 100644 --- a/app/authorization/server/index.js +++ b/app/authorization/server/index.js @@ -22,7 +22,6 @@ import './methods/removeUserFromRole'; import './methods/saveRole'; import './publications/permissions'; import './publications/roles'; -import './publications/usersInRole'; import './startup'; export { diff --git a/app/authorization/server/publications/permissions/emitter.js b/app/authorization/server/publications/permissions/emitter.js index aeec9bfa02ac..ef958ed48502 100644 --- a/app/authorization/server/publications/permissions/emitter.js +++ b/app/authorization/server/publications/permissions/emitter.js @@ -2,6 +2,7 @@ import Settings from '../../../../models/server/models/Settings'; import { Notifications } from '../../../../notifications/server'; import { CONSTANTS } from '../../../lib'; import Permissions from '../../../../models/server/models/Permissions'; +import { clearCache } from '../../functions/hasPermission'; Permissions.on('change', ({ clientAction, id, data, diff }) => { if (diff && Object.keys(diff).length === 1 && diff._updatedAt) { @@ -19,24 +20,7 @@ Permissions.on('change', ({ clientAction, id, data, diff }) => { break; } - Notifications.notifyLoggedInThisInstance( - 'permissions-changed', - clientAction, - data - ); -}); - -Permissions.on('change', ({ clientAction, id, data }) => { - switch (clientAction) { - case 'updated': - case 'inserted': - data = data || Permissions.findOneById(id); - break; - - case 'removed': - data = { _id: id }; - break; - } + clearCache(); Notifications.notifyLoggedInThisInstance( 'permissions-changed', diff --git a/app/authorization/server/publications/roles.js b/app/authorization/server/publications/roles.js index 379bca0fbc95..57e17673eae8 100644 --- a/app/authorization/server/publications/roles.js +++ b/app/authorization/server/publications/roles.js @@ -1,6 +1,7 @@ import { Meteor } from 'meteor/meteor'; import { Roles } from '../../../models'; +import { clearCache } from '../functions/hasPermission'; Meteor.publish('roles', function() { if (!this.userId) { @@ -9,3 +10,11 @@ Meteor.publish('roles', function() { return Roles.find(); }); + +Roles.on('change', ({ diff }) => { + if (diff && Object.keys(diff).length === 1 && diff._updatedAt) { + // avoid useless changes + return; + } + clearCache(); +}); diff --git a/app/authorization/server/publications/usersInRole.js b/app/authorization/server/publications/usersInRole.js deleted file mode 100644 index f7eb22146e45..000000000000 --- a/app/authorization/server/publications/usersInRole.js +++ /dev/null @@ -1,27 +0,0 @@ -import { Meteor } from 'meteor/meteor'; - -import { hasPermission } from '../functions/hasPermission'; -import { getUsersInRole } from '../functions/getUsersInRole'; - -Meteor.publish('usersInRole', function(roleName, scope, limit = 50) { - console.warn('The publication "usersInRole" is deprecated and will be removed after version v2.0.0'); - - if (!this.userId) { - return this.ready(); - } - - if (!hasPermission(this.userId, 'access-permissions')) { - return this.error(new Meteor.Error('error-not-allowed', 'Not allowed', { - publish: 'usersInRole', - })); - } - - const options = { - limit, - sort: { - name: 1, - }, - }; - - return getUsersInRole(roleName, scope, options); -}); diff --git a/app/authorization/server/startup.js b/app/authorization/server/startup.js index 1a27ab21ca03..ee430af1de25 100644 --- a/app/authorization/server/startup.js +++ b/app/authorization/server/startup.js @@ -22,7 +22,6 @@ Meteor.startup(function() { { _id: 'assign-admin-role', roles: ['admin'] }, { _id: 'assign-roles', roles: ['admin'] }, { _id: 'ban-user', roles: ['admin', 'owner', 'moderator'] }, - { _id: 'bulk-create-c', roles: ['admin'] }, { _id: 'bulk-register-user', roles: ['admin'] }, { _id: 'create-c', roles: ['admin', 'user', 'bot'] }, { _id: 'create-d', roles: ['admin', 'user', 'bot'] }, @@ -33,6 +32,7 @@ Meteor.startup(function() { { _id: 'delete-c', roles: ['admin', 'owner'] }, { _id: 'delete-d', roles: ['admin'] }, { _id: 'delete-message', roles: ['admin', 'owner', 'moderator'] }, + { _id: 'delete-own-message', roles: ['admin', 'user'] }, { _id: 'delete-p', roles: ['admin', 'owner'] }, { _id: 'delete-user', roles: ['admin'] }, { _id: 'edit-message', roles: ['admin', 'owner', 'moderator'] }, @@ -50,15 +50,16 @@ Meteor.startup(function() { { _id: 'manage-assets', roles: ['admin'] }, { _id: 'manage-emoji', roles: ['admin'] }, { _id: 'manage-user-status', roles: ['admin'] }, - { _id: 'manage-integrations', roles: ['admin'] }, - { _id: 'manage-own-integrations', roles: ['admin'] }, + { _id: 'manage-outgoing-integrations', roles: ['admin'] }, + { _id: 'manage-incoming-integrations', roles: ['admin'] }, + { _id: 'manage-own-outgoing-integrations', roles: ['admin'] }, + { _id: 'manage-own-incoming-integrations', roles: ['admin'] }, { _id: 'manage-oauth-apps', roles: ['admin'] }, { _id: 'manage-selected-settings', roles: ['admin'] }, { _id: 'mention-all', roles: ['admin', 'owner', 'moderator', 'user'] }, { _id: 'mention-here', roles: ['admin', 'owner', 'moderator', 'user'] }, { _id: 'mute-user', roles: ['admin', 'owner', 'moderator'] }, { _id: 'remove-user', roles: ['admin', 'owner', 'moderator'] }, - { _id: 'reset-other-user-e2e-key', roles: ['admin'] }, { _id: 'run-import', roles: ['admin'] }, { _id: 'run-migration', roles: ['admin'] }, { _id: 'set-moderator', roles: ['admin', 'owner'] }, @@ -84,6 +85,30 @@ Meteor.startup(function() { { _id: 'view-outside-room', roles: ['admin', 'owner', 'moderator', 'user'] }, { _id: 'view-broadcast-member-list', roles: ['admin', 'owner', 'moderator'] }, { _id: 'call-management', roles: ['admin', 'owner', 'moderator'] }, + { _id: 'view-l-room', roles: ['livechat-agent', 'livechat-manager', 'admin'] }, + { _id: 'view-livechat-manager', roles: ['livechat-manager', 'admin'] }, + { _id: 'view-livechat-rooms', roles: ['livechat-manager', 'admin'] }, + { _id: 'close-livechat-room', roles: ['livechat-agent', 'livechat-manager', 'admin'] }, + { _id: 'close-others-livechat-room', roles: ['livechat-manager', 'admin'] }, + { _id: 'save-others-livechat-room-info', roles: ['livechat-manager'] }, + { _id: 'remove-closed-livechat-rooms', roles: ['livechat-manager', 'admin'] }, + { _id: 'view-livechat-analytics', roles: ['livechat-manager', 'admin'] }, + { _id: 'view-livechat-queue', roles: ['livechat-manager', 'admin'] }, + { _id: 'transfer-livechat-guest', roles: ['livechat-manager', 'admin'] }, + { _id: 'manage-livechat-managers', roles: ['livechat-manager', 'admin'] }, + { _id: 'manage-livechat-agents', roles: ['livechat-manager', 'admin'] }, + { _id: 'manage-livechat-departments', roles: ['livechat-manager', 'admin'] }, + { _id: 'view-livechat-departments', roles: ['livechat-manager', 'admin'] }, + { _id: 'add-livechat-department-agents', roles: ['livechat-manager', 'admin'] }, + { _id: 'view-livechat-current-chats', roles: ['livechat-manager', 'admin'] }, + { _id: 'view-livechat-real-time-monitoring', roles: ['livechat-manager', 'admin'] }, + { _id: 'view-livechat-triggers', roles: ['livechat-manager', 'admin'] }, + { _id: 'view-livechat-customfields', roles: ['livechat-manager', 'admin'] }, + { _id: 'view-livechat-installation', roles: ['livechat-manager', 'admin'] }, + { _id: 'view-livechat-appearance', roles: ['livechat-manager', 'admin'] }, + { _id: 'view-livechat-webhooks', roles: ['livechat-manager', 'admin'] }, + { _id: 'view-livechat-facebook', roles: ['livechat-manager', 'admin'] }, + { _id: 'view-livechat-officeHours', roles: ['livechat-manager', 'admin'] }, ]; for (const permission of permissions) { @@ -93,14 +118,16 @@ Meteor.startup(function() { } const defaultRoles = [ - { name: 'admin', scope: 'Users', description: 'Admin' }, - { name: 'moderator', scope: 'Subscriptions', description: 'Moderator' }, - { name: 'leader', scope: 'Subscriptions', description: 'Leader' }, - { name: 'owner', scope: 'Subscriptions', description: 'Owner' }, - { name: 'user', scope: 'Users', description: '' }, - { name: 'bot', scope: 'Users', description: '' }, - { name: 'guest', scope: 'Users', description: '' }, - { name: 'anonymous', scope: 'Users', description: '' }, + { name: 'admin', scope: 'Users', description: 'Admin' }, + { name: 'moderator', scope: 'Subscriptions', description: 'Moderator' }, + { name: 'leader', scope: 'Subscriptions', description: 'Leader' }, + { name: 'owner', scope: 'Subscriptions', description: 'Owner' }, + { name: 'user', scope: 'Users', description: '' }, + { name: 'bot', scope: 'Users', description: '' }, + { name: 'guest', scope: 'Users', description: '' }, + { name: 'anonymous', scope: 'Users', description: '' }, + { name: 'livechat-agent', scope: 'Users', description: 'Livechat Agent' }, + { name: 'livechat-manager', scope: 'Users', description: 'Livechat Manager' }, ]; for (const role of defaultRoles) { diff --git a/app/autolinker/client/client.js b/app/autolinker/client/client.js index b7e7f905bbce..e743725b67e1 100644 --- a/app/autolinker/client/client.js +++ b/app/autolinker/client/client.js @@ -1,32 +1,17 @@ import { Meteor } from 'meteor/meteor'; +import { Random } from 'meteor/random'; +import { Tracker } from 'meteor/tracker'; import s from 'underscore.string'; import Autolinker from 'autolinker'; + import { settings } from '../../settings'; import { callbacks } from '../../callbacks'; -const createAutolinker = () => { - const regUrls = new RegExp(settings.get('AutoLinker_UrlsRegExp')); - - const replaceAutolinkerMatch = (match) => { - if (match.getType() !== 'url') { - return null; - } - - if (!regUrls.test(match.matchedText)) { - return null; - } +let config; - if (match.matchedText.indexOf(Meteor.absoluteUrl()) === 0) { - const tag = match.buildTag(); - tag.setAttr('target', ''); - return tag; - } - - return true; - }; - - return new Autolinker({ +Tracker.autorun(function() { + config = { stripPrefix: settings.get('AutoLinker_StripPrefix'), urls: { schemeMatches: settings.get('AutoLinker_Urls_Scheme'), @@ -37,15 +22,10 @@ const createAutolinker = () => { phone: settings.get('AutoLinker_Phone'), twitter: false, stripTrailingSlash: false, - replaceFn: replaceAutolinkerMatch, - }); -}; + }; +}); const renderMessage = (message) => { - if (settings.get('AutoLinker') !== true) { - return message; - } - if (!s.trim(message.html)) { return message; } @@ -58,18 +38,38 @@ const renderMessage = (message) => { } else { msgParts = [message.html]; } - const autolinker = createAutolinker(); + message.html = msgParts .map((msgPart) => { if (regexTokens && regexTokens.test(msgPart)) { return msgPart; } + return Autolinker.link(msgPart, { + ...config, + replaceFn: (match) => { + const token = `=!=${ Random.id() }=!=`; + const tag = match.buildTag(); - return autolinker.link(msgPart); + if (~match.matchedText.indexOf(Meteor.absoluteUrl())) { + tag.setAttr('target', ''); + } + + message.tokens.push({ + token, + text: tag.toAnchorString(), + }); + return token; + } }); }) .join(''); 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.MEDIUM, 'autolinker'); +}); diff --git a/app/autotranslate/server/autotranslate.js b/app/autotranslate/server/autotranslate.js index 8afad4eddf35..4ad7490b68b2 100644 --- a/app/autotranslate/server/autotranslate.js +++ b/app/autotranslate/server/autotranslate.js @@ -256,7 +256,7 @@ export class AutoTranslate { }); } } - return message; + return Messages.findOneById(message._id); } /** diff --git a/app/autotranslate/server/deeplTranslate.js b/app/autotranslate/server/deeplTranslate.js index 05b30e9ec2b3..ca3d25575f1c 100644 --- a/app/autotranslate/server/deeplTranslate.js +++ b/app/autotranslate/server/deeplTranslate.js @@ -2,7 +2,7 @@ * @author Vigneshwaran Odayappan */ -import { TAPi18n } from 'meteor/tap:i18n'; +import { TAPi18n } from 'meteor/rocketchat:tap-i18n'; import { HTTP } from 'meteor/http'; import _ from 'underscore'; diff --git a/app/autotranslate/server/googleTranslate.js b/app/autotranslate/server/googleTranslate.js index 5cbaaffc7113..b4972368db7b 100644 --- a/app/autotranslate/server/googleTranslate.js +++ b/app/autotranslate/server/googleTranslate.js @@ -2,7 +2,7 @@ * @author Vigneshwaran Odayappan */ -import { TAPi18n } from 'meteor/tap:i18n'; +import { TAPi18n } from 'meteor/rocketchat:tap-i18n'; import { HTTP } from 'meteor/http'; import _ from 'underscore'; diff --git a/app/autotranslate/server/msTranslate.js b/app/autotranslate/server/msTranslate.js index 7195c12bb795..a299a4a927df 100644 --- a/app/autotranslate/server/msTranslate.js +++ b/app/autotranslate/server/msTranslate.js @@ -2,7 +2,7 @@ * @author Vigneshwaran Odayappan */ -import { TAPi18n } from 'meteor/tap:i18n'; +import { TAPi18n } from 'meteor/rocketchat:tap-i18n'; import { HTTP } from 'meteor/http'; import _ from 'underscore'; diff --git a/app/callbacks/lib/callbacks.js b/app/callbacks/lib/callbacks.js index 193b6be06ed6..efc44c0ee59d 100644 --- a/app/callbacks/lib/callbacks.js +++ b/app/callbacks/lib/callbacks.js @@ -56,7 +56,7 @@ const createCallbackTimed = (hook, callbacks) => const create = (hook, cbs) => (timed ? createCallbackTimed(hook, cbs) : createCallback(hook, cbs)); const combinedCallbacks = new Map(); -this.combinedCallbacks = combinedCallbacks; + /* * Callback priorities */ 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-mail-messages/client/views/mailMessagesInstructions.js b/app/channel-settings-mail-messages/client/views/mailMessagesInstructions.js index a141dc7bc5af..71d0345a10f6 100644 --- a/app/channel-settings-mail-messages/client/views/mailMessagesInstructions.js +++ b/app/channel-settings-mail-messages/client/views/mailMessagesInstructions.js @@ -129,7 +129,7 @@ Template.mailMessagesInstructions.events({ to_emails: selectedEmails.get().map((email) => email.text).toString(), subject, messages: selectedMessages.get(), - language: localStorage.getItem('userLanguage'), + language: Meteor._localStorage.getItem('userLanguage'), }; Meteor.call('mailMessages', data, function(err, result) { diff --git a/app/channel-settings/client/views/channelSettings.html b/app/channel-settings/client/views/channelSettings.html index 9177cf618bca..9ff3a5886643 100644 --- a/app/channel-settings/client/views/channelSettings.html +++ b/app/channel-settings/client/views/channelSettings.html @@ -406,7 +406,7 @@