Merge branch 'develop' into edit-user-permissions

pull/7309/head
Rodrigo Nascimento 8 years ago
commit ab192d3c8a
  1. 2
      .docker/Dockerfile
  2. 44
      .github/ISSUE_TEMPLATE.md
  3. 19
      .meteor/packages
  4. 2
      .meteor/release
  5. 48
      .meteor/versions
  6. 2
      .sandstorm/sandstorm-pkgdef.capnp
  7. 2
      .snapcraft/candidate/snapcraft.yaml
  8. 2
      .snapcraft/edge/snapcraft.yaml
  9. 2
      .snapcraft/stable/snapcraft.yaml
  10. 2
      .travis/snap.sh
  11. 273
      HISTORY.md
  12. 4
      README.md
  13. 1
      app.json
  14. 4
      client/lib/handleError.js
  15. 18
      client/methods/deleteMessage.js
  16. 32
      example-build-run.sh
  17. 16
      example-build.sh
  18. 24
      package.json
  19. 2
      packages/rocketchat-2fa/client/accountSecurity.html
  20. 11
      packages/rocketchat-api/server/v1/channels.js
  21. 26
      packages/rocketchat-api/server/v1/groups.js
  22. 11
      packages/rocketchat-api/server/v1/users.js
  23. 4
      packages/rocketchat-authorization/client/stylesheets/permissions.less
  24. 2
      packages/rocketchat-authorization/client/views/permissions.html
  25. 8
      packages/rocketchat-authorization/client/views/permissions.js
  26. 3
      packages/rocketchat-authorization/server/startup.js
  27. 4
      packages/rocketchat-cas/cas_client.js
  28. 4
      packages/rocketchat-cas/cas_server.js
  29. 7
      packages/rocketchat-channel-settings/client/lib/ChannelSettings.js
  30. 174
      packages/rocketchat-channel-settings/client/views/channelSettings.html
  31. 6
      packages/rocketchat-cors/cors.js
  32. 2
      packages/rocketchat-custom-sounds/admin/soundEdit.html
  33. 2
      packages/rocketchat-emoji-custom/client/lib/emojiCustom.js
  34. 6
      packages/rocketchat-emoji-emojione/callbacks.js
  35. 16
      packages/rocketchat-emoji-emojione/emojiPicker.js
  36. 7
      packages/rocketchat-emoji-emojione/package.js
  37. 3
      packages/rocketchat-emoji/emojiPicker.js
  38. 2
      packages/rocketchat-emoji/package.js
  39. 2
      packages/rocketchat-emoji/rocketchat.js
  40. 1
      packages/rocketchat-file-upload/package.js
  41. 11
      packages/rocketchat-file-upload/server/config/AmazonS3.js
  42. 91
      packages/rocketchat-file-upload/server/lib/proxy.js
  43. 3
      packages/rocketchat-file-upload/server/lib/requests.js
  44. 3
      packages/rocketchat-file-upload/server/methods/sendFileMessage.js
  45. 14
      packages/rocketchat-file-upload/server/startup/settings.js
  46. 1
      packages/rocketchat-file/file.server.js
  47. 3
      packages/rocketchat-i18n/i18n/af.i18n.json
  48. 7
      packages/rocketchat-i18n/i18n/ca.i18n.json
  49. 7
      packages/rocketchat-i18n/i18n/cs.i18n.json
  50. 2
      packages/rocketchat-i18n/i18n/de.i18n.json
  51. 2
      packages/rocketchat-i18n/i18n/el.i18n.json
  52. 178
      packages/rocketchat-i18n/i18n/en.i18n.json
  53. 2
      packages/rocketchat-i18n/i18n/fi.i18n.json
  54. 173
      packages/rocketchat-i18n/i18n/ko.i18n.json
  55. 4
      packages/rocketchat-i18n/i18n/pt-BR.i18n.json
  56. 10
      packages/rocketchat-i18n/i18n/pt.i18n.json
  57. 8
      packages/rocketchat-i18n/i18n/ru.i18n.json
  58. 3
      packages/rocketchat-i18n/i18n/vi-VN.i18n.json
  59. 12
      packages/rocketchat-importer-slack/server.js
  60. 123
      packages/rocketchat-importer/server/classes/ImporterBase.js
  61. 4
      packages/rocketchat-integrations/client/views/integrationsOutgoing.js
  62. 4
      packages/rocketchat-integrations/server/lib/triggerHandler.js
  63. 2
      packages/rocketchat-integrations/server/lib/validation.js
  64. 2
      packages/rocketchat-irc/server/server.js
  65. 15
      packages/rocketchat-katex/package-lock.json
  66. 25
      packages/rocketchat-ldap/server/sync.js
  67. 13
      packages/rocketchat-lib/client/MessageAction.js
  68. 4
      packages/rocketchat-lib/client/Notifications.js
  69. 2
      packages/rocketchat-lib/client/lib/cachedCollection.js
  70. 5
      packages/rocketchat-lib/client/lib/roomExit.js
  71. 4
      packages/rocketchat-lib/client/lib/settings.js
  72. 4
      packages/rocketchat-lib/lib/startup/settingsOnLoadSiteUrl.js
  73. 2
      packages/rocketchat-lib/package.js
  74. 2
      packages/rocketchat-lib/rocketchat.info
  75. 4
      packages/rocketchat-lib/server/functions/addUserToDefaultChannels.js
  76. 4
      packages/rocketchat-lib/server/functions/addUserToRoom.js
  77. 54
      packages/rocketchat-lib/server/functions/saveCustomFields.js
  78. 33
      packages/rocketchat-lib/server/functions/saveCustomFieldsWithoutValidation.js
  79. 5
      packages/rocketchat-lib/server/functions/sendMessage.js
  80. 2
      packages/rocketchat-lib/server/functions/updateMessage.js
  81. 39
      packages/rocketchat-lib/server/functions/validateCustomFields.js
  82. 21
      packages/rocketchat-lib/server/lib/notifyUsersOnMessage.js
  83. 24
      packages/rocketchat-lib/server/lib/sendNotificationsOnMessage.js
  84. 5
      packages/rocketchat-lib/server/methods/deleteMessage.js
  85. 12
      packages/rocketchat-lib/server/methods/sendMessage.js
  86. 6
      packages/rocketchat-lib/server/models/Avatars.js
  87. 10
      packages/rocketchat-lib/server/models/Messages.js
  88. 6
      packages/rocketchat-lib/server/models/Rooms.js
  89. 22
      packages/rocketchat-lib/server/models/Subscriptions.js
  90. 6
      packages/rocketchat-lib/server/models/Uploads.js
  91. 11
      packages/rocketchat-lib/server/models/Users.js
  92. 41
      packages/rocketchat-lib/server/startup/settings.js
  93. 1
      packages/rocketchat-lib/startup/defaultRoomTypes.js
  94. 18
      packages/rocketchat-livechat/app/.meteor/packages
  95. 2
      packages/rocketchat-livechat/app/.meteor/release
  96. 38
      packages/rocketchat-livechat/app/.meteor/versions
  97. 4
      packages/rocketchat-livechat/app/client/lib/fromApp/Notifications.js
  98. 4
      packages/rocketchat-livechat/app/i18n/af.i18n.json
  99. 11
      packages/rocketchat-livechat/app/i18n/el.i18n.json
  100. 6
      packages/rocketchat-livechat/app/i18n/fi.i18n.json
  101. Some files were not shown because too many files have changed in this diff Show More

@ -1,6 +1,6 @@
FROM rocketchat/base:4
ENV RC_VERSION 0.57.0-develop
ENV RC_VERSION 0.58.0-develop
MAINTAINER buildmaster@rocket.chat

@ -1,6 +1,40 @@
<!-- INSTRUCTION: Complete the information below from your Administration page -->
<!--
Rocket.Chat Version:
Running Instances:
DB Replicaset OpLog:
Node Version:
Please see our guide for opening issues: https://rocket.chat/docs/contributing/reporting-issues
If you have questions or are looking for help/support please see: https://rocket.chat/docs/getting-support
If you are experiencing a bug please search our issues to be sure it is not already present: https://github.com/RocketChat/Rocket.Chat/issues
-->
### Description:
<!-- Description of the issue -->
### Server Setup Information:
* Version of Rocket.Chat Server:
* Operating System:
* Deployment Method(snap/docker/tar/etc):
* Number of Running Instances:
* DB Replicaset Oplog:
* Node Version:
### Steps to Reproduce:
1. <!-- First Step -->
2. <!-- Second Step -->
3. <!-- and so on... -->
### Expected behavior:
<!-- What you expect to happen -->
### Actual behavior:
<!-- What actually happens -->
### Relevant logs:
<!-- Logs from both server and browser -->
<!-- For more information about collecting logs please see: https://rocket.chat/docs/contributing/reporting-issues#gathering-logs -->

@ -4,18 +4,18 @@
# but you can also edit it by hand.
rocketchat:cors
accounts-facebook@1.2.0
accounts-facebook@1.2.1
accounts-github@1.3.0
accounts-google@1.2.0
accounts-meteor-developer@1.3.0
accounts-password@1.3.6
accounts-password@1.4.0
accounts-twitter@1.3.0
blaze-html-templates
check@1.2.5
ddp-rate-limiter@1.0.7
ecmascript@0.8.0
ecmascript@0.8.1
ejson@1.0.13
email@1.2.1
email@1.2.3
fastclick@1.0.13
http@1.2.12
jquery@1.11.10
@ -23,7 +23,7 @@ less@2.7.9
logging@1.1.17
meteor-base@1.1.0
mobile-experience@1.0.4
mongo@1.1.18
mongo@1.1.19
random@1.0.10
rate-limit@1.0.8
reactive-dict@1.1.9
@ -31,9 +31,9 @@ reactive-var@1.0.11
reload@1.1.11
service-configuration@1.0.11
session@1.1.7
shell-server@0.2.3
shell-server@0.2.4
spacebars
standard-minifier-js@2.1.0
standard-minifier-js@2.1.1
tracker@1.1.3
rocketchat:2fa
@ -98,6 +98,7 @@ rocketchat:slackbridge
rocketchat:slashcommands-archive
rocketchat:slashcommands-asciiarts
rocketchat:slashcommands-create
rocketchat:slashcommands-help
rocketchat:slashcommands-invite
rocketchat:slashcommands-invite-all
rocketchat:slashcommands-join
@ -149,7 +150,7 @@ jalik:ufs-gridfs
jparker:gravatar
kadira:blaze-layout
kadira:flow-router
kenton:accounts-sandstorm
#kenton:accounts-sandstorm
mizzao:autocomplete
mizzao:timesync
mrt:reactive-store
@ -171,4 +172,4 @@ yasaricli:slugify
yasinuslu:blaze-meta
deepwell:bootstrap-datepicker2
rocketchat:postcss
dynamic-import
dynamic-import@0.1.1

@ -1 +1 @@
METEOR@1.5
METEOR@1.5.1

@ -1,22 +1,22 @@
accounts-base@1.3.0
accounts-facebook@1.2.0
accounts-base@1.3.1
accounts-facebook@1.2.1
accounts-github@1.3.0
accounts-google@1.2.0
accounts-meteor-developer@1.3.0
accounts-oauth@1.1.15
accounts-password@1.3.7
accounts-password@1.4.0
accounts-twitter@1.3.0
aldeed:simple-schema@1.5.3
allow-deny@1.0.5
allow-deny@1.0.6
autoupdate@1.3.12
babel-compiler@6.19.2
babel-compiler@6.19.4
babel-runtime@1.0.1
base64@1.0.10
binary-heap@1.0.10
blaze@2.3.2
blaze-html-templates@1.1.2
blaze-tools@1.0.10
boilerplate-generator@1.1.0
boilerplate-generator@1.1.1
caching-compiler@1.1.9
caching-html-compiler@1.1.2
callback-hook@1.0.10
@ -24,25 +24,25 @@ cfs:http-methods@0.0.32
check@1.2.5
coffeescript@1.12.6_1
dandv:caret-position@2.1.1
ddp@1.2.5
ddp-client@1.3.4
ddp-common@1.2.8
ddp@1.3.0
ddp-client@2.0.0
ddp-common@1.2.9
ddp-rate-limiter@1.0.7
ddp-server@1.3.14
ddp-server@2.0.0
deepwell:bootstrap-datepicker2@1.3.0
deps@1.0.12
diff-sequence@1.0.7
dispatch:run-as-user@1.1.1
dynamic-import@0.1.1
ecmascript@0.8.0
ecmascript@0.8.2
ecmascript-runtime@0.4.1
ecmascript-runtime-client@0.4.2
ecmascript-runtime-client@0.4.3
ecmascript-runtime-server@0.4.1
edgee:slingshot@0.7.1
ejson@1.0.13
email@1.2.3
emojione:emojione@3.0.3
facebook-oauth@1.3.1
emojione:emojione@2.2.6
facebook-oauth@1.3.2
fastclick@1.0.13
francocatena:status@1.5.3
geojson-utils@1.0.10
@ -62,7 +62,6 @@ jparker:gravatar@0.5.1
jquery@1.11.10
kadira:blaze-layout@2.3.0
kadira:flow-router@2.12.1
kenton:accounts-sandstorm@0.6.0
konecty:change-case@2.3.0
konecty:delayed-task@1.0.0
konecty:mongo-counter@0.0.5_3
@ -72,26 +71,26 @@ konecty:user-presence@1.2.9
launch-screen@1.1.1
less@2.7.9
livedata@1.0.18
localstorage@1.1.0
localstorage@1.1.1
logging@1.1.17
matb33:collection-hooks@0.8.4
mdg:validation-error@0.5.1
meteor@1.6.1
meteor@1.7.0
meteor-base@1.1.0
meteor-developer-oauth@1.2.0
meteorhacks:inject-initial@1.0.4
meteorhacks:meteorx@1.4.1
meteorspark:util@0.2.0
minifier-css@1.2.16
minifier-js@2.1.0
minifier-js@2.1.1
minimongo@1.2.1
mizzao:autocomplete@0.5.1
mizzao:timesync@0.3.4
mobile-experience@1.0.4
mobile-status-bar@1.0.14
modules@0.9.1
modules@0.9.2
modules-runtime@0.8.0
mongo@1.1.18
mongo@1.1.19
mongo-id@1.0.6
mongo-livedata@1.0.12
mrt:reactive-store@0.0.1
@ -106,7 +105,7 @@ oauth2@1.1.11
observe-sequence@1.0.16
ordered-dict@1.0.9
ostrio:cookies@2.2.1
pauli:accounts-linkedin@2.1.2
pauli:accounts-linkedin@2.1.3
pauli:linkedin-oauth@1.1.0
percolate:synced-cron@1.3.2
promise@0.8.9
@ -191,6 +190,7 @@ rocketchat:slackbridge@0.0.1
rocketchat:slashcommands-archive@0.0.1
rocketchat:slashcommands-asciiarts@0.0.1
rocketchat:slashcommands-create@0.0.1
rocketchat:slashcommands-help@0.0.1
rocketchat:slashcommands-invite@0.0.1
rocketchat:slashcommands-invite-all@0.0.1
rocketchat:slashcommands-join@0.0.1
@ -227,13 +227,13 @@ routepolicy@1.0.12
service-configuration@1.0.11
session@1.1.7
sha@1.0.9
shell-server@0.2.3
shell-server@0.2.4
simple:json-routes@2.1.0
smoral:sweetalert@1.1.1
spacebars@1.0.15
spacebars-compiler@1.1.2
srp@1.0.10
standard-minifier-js@2.1.0
standard-minifier-js@2.1.1
steffo:meteor-accounts-saml@0.0.1
tap:i18n@1.8.2
templating@1.3.2
@ -249,7 +249,7 @@ ui@1.0.13
underscore@1.0.10
underscorestring:underscore.string@3.3.4
url@1.1.0
webapp@1.3.16
webapp@1.3.17
webapp-hashing@1.0.9
yasaricli:slugify@0.0.7
yasinuslu:blaze-meta@0.3.3

@ -21,7 +21,7 @@ const pkgdef :Spk.PackageDefinition = (
appVersion = 62, # Increment this for every release.
appMarketingVersion = (defaultText = "0.57.0-develop"),
appMarketingVersion = (defaultText = "0.58.0-develop"),
# Human-readable representation of appVersion. Should match the way you
# identify versions of your app in documentation and marketing.

@ -39,7 +39,7 @@ apps:
parts:
node:
plugin: nodejs
node-engine: 4.8.1
node-engine: 4.8.3
node-packages:
- promise
- fibers

@ -39,7 +39,7 @@ apps:
parts:
node:
plugin: nodejs
node-engine: 4.8.1
node-engine: 4.8.3
node-packages:
- promise
- fibers

@ -39,7 +39,7 @@ apps:
parts:
node:
plugin: nodejs
node-engine: 4.8.1
node-engine: 4.8.3
node-packages:
- promise
- fibers

@ -17,7 +17,7 @@ elif [[ $TRAVIS_TAG ]]; then
RC_VERSION=$TRAVIS_TAG
else
CHANNEL=edge
RC_VERSION=0.57.0-develop
RC_VERSION=0.58.0-develop
fi
echo "Preparing to trigger a snap release for $CHANNEL channel"

@ -1,10 +1,277 @@
<a name="0.56.0"></a>
# NEXT
<a name="0.57.2"></a>
## 0.57.2 (2017-07-14)
### Bug Fixes
- [#7472](https://github.com/RocketChat/Rocket.Chat/pull/7472) Always set LDAP properties on login
- [#7431](https://github.com/RocketChat/Rocket.Chat/pull/7431) Fix Emails in User Admin View
- [#7469](https://github.com/RocketChat/Rocket.Chat/pull/7469) Fix file upload on Slack import
- [#7432](https://github.com/RocketChat/Rocket.Chat/pull/7432) Fix Private Channel List Submit
- [#7403](https://github.com/RocketChat/Rocket.Chat/pull/7403) Fix Unread Bar Disappearing
- [#7443](https://github.com/RocketChat/Rocket.Chat/pull/7443) S3 uploads not working for custom URLs
<a name="0.57.1"></a>
## 0.57.1 (2017-07-06)
- :hand: [#7428](https://github.com/RocketChat/Rocket.Chat/pull/7428) Fix migration of avatars from version 0.57.0
<details>
<summary>Others</summary>
- [#7428](https://github.com/RocketChat/Rocket.Chat/pull/7428) Run avatar migration on startup
</details>
<a name="0.57.0"></a>
# 0.57.0 (2017-07-03)
### Breaking Changes
- [#7095](https://github.com/RocketChat/Rocket.Chat/pull/7095) Internal hubot does not load [hubot-scripts](https://github.com/github/hubot-scripts) anymore.
- :hand: [#7095](https://github.com/RocketChat/Rocket.Chat/pull/7095) Internal hubot does not load [hubot-scripts](https://github.com/github/hubot-scripts) anymore.
### New Features
- [#7085](https://github.com/RocketChat/Rocket.Chat/pull/7085) API method and REST Endpoint for getting a single message by id
- [#6919](https://github.com/RocketChat/Rocket.Chat/pull/6919) Feature/delete any message permission
- [#6938](https://github.com/RocketChat/Rocket.Chat/pull/6938) Improve CI/Docker build/release
- [#7059](https://github.com/RocketChat/Rocket.Chat/pull/7059) Increase unread message count on [@here](https://github.com/here) mention
- [#6921](https://github.com/RocketChat/Rocket.Chat/pull/6921) LDAP: Use variables in User_Data_FieldMap for name mapping
- [#6857](https://github.com/RocketChat/Rocket.Chat/pull/6857) Make channel/group delete call answer to roomName
- [#7080](https://github.com/RocketChat/Rocket.Chat/pull/7080) Migration to add <html> tags to email header and footer
- [#6788](https://github.com/RocketChat/Rocket.Chat/pull/6788) New avatar storage types
- [#6690](https://github.com/RocketChat/Rocket.Chat/pull/6690) Show full name in mentions if use full name setting enabled
- [#6953](https://github.com/RocketChat/Rocket.Chat/pull/6953) Show info about multiple instances at admin page
- [#6605](https://github.com/RocketChat/Rocket.Chat/pull/6605) Start running unit tests
- [#7311](https://github.com/RocketChat/Rocket.Chat/pull/7311) Force use of MongoDB for spotlight queries
### Bug Fixes
- [#7025](https://github.com/RocketChat/Rocket.Chat/pull/7025) Add <html> and </html> to header and footer
- [#7084](https://github.com/RocketChat/Rocket.Chat/pull/7084) Add option to ignore TLS in SMTP server settings
- [#7072](https://github.com/RocketChat/Rocket.Chat/pull/7072) Add support for carriage return in markdown code blocks
- [#6910](https://github.com/RocketChat/Rocket.Chat/pull/6910) Allow image insert from slack through slackbridge
- [#6904](https://github.com/RocketChat/Rocket.Chat/pull/6904) Bugs in `isUserFromParams` helper
- [#6840](https://github.com/RocketChat/Rocket.Chat/pull/6840) Check that username is not in the room when being muted / unmuted
- [#7103](https://github.com/RocketChat/Rocket.Chat/pull/7103) clipboard (permalink, copy, pin, star buttons)
- [#7030](https://github.com/RocketChat/Rocket.Chat/pull/7030) do only store password if LDAP_Login_Fallback is on
- [#7105](https://github.com/RocketChat/Rocket.Chat/pull/7105) edit button on firefox
- [#6935](https://github.com/RocketChat/Rocket.Chat/pull/6935) Error when trying to show preview of undefined filetype
- [#7045](https://github.com/RocketChat/Rocket.Chat/pull/7045) Fix avatar upload via users.setAvatar REST endpoint
- [#6950](https://github.com/RocketChat/Rocket.Chat/pull/6950) Fix badge counter on iOS push notifications
- [#7121](https://github.com/RocketChat/Rocket.Chat/pull/7121) fix bug in preview image
- [#6972](https://github.com/RocketChat/Rocket.Chat/pull/6972) Fix error handling for non-valid avatar URL
- [#6974](https://github.com/RocketChat/Rocket.Chat/pull/6974) Fix login with Meteor saving an object as email address
- [#7104](https://github.com/RocketChat/Rocket.Chat/pull/7104) Fix missing CSS files on production builds
- [#6986](https://github.com/RocketChat/Rocket.Chat/pull/6986) Fix the other tests failing due chimp update
- [#7049](https://github.com/RocketChat/Rocket.Chat/pull/7049) Improve Tests
- [#6968](https://github.com/RocketChat/Rocket.Chat/pull/6968) make channels.create API check for create-c
- [#7044](https://github.com/RocketChat/Rocket.Chat/pull/7044) New screen sharing Chrome extension checking method
- [#6999](https://github.com/RocketChat/Rocket.Chat/pull/6999) overlapping text for users-typing-message
- [#7014](https://github.com/RocketChat/Rocket.Chat/pull/7014) Parse HTML on admin setting's descriptions
- [#6997](https://github.com/RocketChat/Rocket.Chat/pull/6997) Parse markdown links last
- [#7033](https://github.com/RocketChat/Rocket.Chat/pull/7033) Prevent Ctrl key on message field from reloading messages list
- [#6912](https://github.com/RocketChat/Rocket.Chat/pull/6912) Remove room from roomPick setting
- [#6961](https://github.com/RocketChat/Rocket.Chat/pull/6961) SAML: Only set KeyDescriptor when non empty
- [#7023](https://github.com/RocketChat/Rocket.Chat/pull/7023) Sidenav roomlist
- [#6913](https://github.com/RocketChat/Rocket.Chat/pull/6913) Slackbridge text replacements
- [#6903](https://github.com/RocketChat/Rocket.Chat/pull/6903) Updating Incoming Integration Post As Field Not Allowed
- [#6947](https://github.com/RocketChat/Rocket.Chat/pull/6947) Use AWS Signature Version 4 signed URLs for uploads
- [#7012](https://github.com/RocketChat/Rocket.Chat/pull/7012) video message recording dialog is shown in an incorrect position
- [#7157](https://github.com/RocketChat/Rocket.Chat/pull/7157) Fix all reactions having the same username
- [#7215](https://github.com/RocketChat/Rocket.Chat/pull/7215/) Fix the Zapier oAuth return url to the new one
- [#7209](https://github.com/RocketChat/Rocket.Chat/pull/7209) "requirePasswordChange" property not being saved when set to false
- [#7208](https://github.com/RocketChat/Rocket.Chat/pull/7208) Fix oembed previews not being shown
- [#7200](https://github.com/RocketChat/Rocket.Chat/pull/7200) Fix editing others messages
- [#7160](https://github.com/RocketChat/Rocket.Chat/pull/7160) Removing the kadira package install from example build script.
- [#7345](https://github.com/RocketChat/Rocket.Chat/pull/7345) click on image in a message
- [#7207](https://github.com/RocketChat/Rocket.Chat/pull/7207) Fix Block Delete Message After (n) Minutes
- [#7320](https://github.com/RocketChat/Rocket.Chat/pull/7320) Fix jump to unread button
- [#7321](https://github.com/RocketChat/Rocket.Chat/pull/7321) Fix Secret Url
- [#7358](https://github.com/RocketChat/Rocket.Chat/pull/7358) Fix user's customFields not being saved correctly
- [#7352](https://github.com/RocketChat/Rocket.Chat/pull/7352) Improve avatar migration
- [#7304](https://github.com/RocketChat/Rocket.Chat/pull/7304) Proxy upload to correct instance
- [#7379](https://github.com/RocketChat/Rocket.Chat/pull/7379) Message being displayed unescaped
<details>
<summary>Others</summary>
- [#7094](https://github.com/RocketChat/Rocket.Chat/pull/7094) [FIX]Fix the failing tests
- [#7092](https://github.com/RocketChat/Rocket.Chat/pull/7092) [FIX]Fixed typo hmtl -> html
- [#7145](https://github.com/RocketChat/Rocket.Chat/pull/7145) Convert file unsubscribe.coffee to js
- [#7146](https://github.com/RocketChat/Rocket.Chat/pull/7146) Convert hipchat importer to js
- [#7022](https://github.com/RocketChat/Rocket.Chat/pull/7022) Convert irc package to js
- [#7096](https://github.com/RocketChat/Rocket.Chat/pull/7096) Convert Livechat from Coffeescript to JavaScript
- [#6936](https://github.com/RocketChat/Rocket.Chat/pull/6936) Convert meteor-autocomplete package to js
- [#7017](https://github.com/RocketChat/Rocket.Chat/pull/7017) Convert oauth2-server-config package to js
- [#6795](https://github.com/RocketChat/Rocket.Chat/pull/6795) Convert Ui Account Package to Js
- [#6911](https://github.com/RocketChat/Rocket.Chat/pull/6911) Convert ui-admin package to js
- [#6775](https://github.com/RocketChat/Rocket.Chat/pull/6775) Convert WebRTC Package to Js
- [#7018](https://github.com/RocketChat/Rocket.Chat/pull/7018) converted rocketchat-importer
- [#6836](https://github.com/RocketChat/Rocket.Chat/pull/6836) converted rocketchat-ui coffee to js part 2
- [#6976](https://github.com/RocketChat/Rocket.Chat/pull/6976) fix the crashing tests
- [#7055](https://github.com/RocketChat/Rocket.Chat/pull/7055) Ldap: User_Data_FieldMap description
- [#7114](https://github.com/RocketChat/Rocket.Chat/pull/7114) LingoHub based on develop
- [#7005](https://github.com/RocketChat/Rocket.Chat/pull/7005) LingoHub based on develop
- [#6978](https://github.com/RocketChat/Rocket.Chat/pull/6978) LingoHub based on develop
- [#7062](https://github.com/RocketChat/Rocket.Chat/pull/7062) Remove Useless Jasmine Tests
- [#6914](https://github.com/RocketChat/Rocket.Chat/pull/6914) Rocketchat ui message
- [#7006](https://github.com/RocketChat/Rocket.Chat/pull/7006) Rocketchat ui3
- [#6987](https://github.com/RocketChat/Rocket.Chat/pull/6987) rocketchat-importer-slack coffee to js
- [#6735](https://github.com/RocketChat/Rocket.Chat/pull/6735) rocketchat-lib[4] coffee to js
- [#7154](https://github.com/RocketChat/Rocket.Chat/pull/7154) Remove missing CoffeeScript dependencies
- [#7308](https://github.com/RocketChat/Rocket.Chat/pull/7308) Escape error messages
- [#7102](https://github.com/RocketChat/Rocket.Chat/pull/7102) add server methods getRoomNameById
</details>
<details>
<summary>Details</summary>
## 0.57.0-rc.3 (2017-06-28)
### New Features
- [#7311](https://github.com/RocketChat/Rocket.Chat/pull/7311) Force use of MongoDB for spotlight queries
### Bug Fixes
- [#7345](https://github.com/RocketChat/Rocket.Chat/pull/7345) click on image in a message
- [#7207](https://github.com/RocketChat/Rocket.Chat/pull/7207) Fix Block Delete Message After (n) Minutes
- [#7320](https://github.com/RocketChat/Rocket.Chat/pull/7320) Fix jump to unread button
- [#7321](https://github.com/RocketChat/Rocket.Chat/pull/7321) Fix Secret Url
- [#7358](https://github.com/RocketChat/Rocket.Chat/pull/7358) Fix user's customFields not being saved correctly
- [#7352](https://github.com/RocketChat/Rocket.Chat/pull/7352) Improve avatar migration
- [#7304](https://github.com/RocketChat/Rocket.Chat/pull/7304) Proxy upload to correct instance
<details>
<summary>Others</summary>
- [#7308](https://github.com/RocketChat/Rocket.Chat/pull/7308) Escape error messages
</details>
## 0.57.0-rc.2 (2017-06-12)
### Bug Fixes
- [#7215](https://github.com/RocketChat/Rocket.Chat/pull/7215/) Fix the Zapier oAuth return url to the new one
- [#7209](https://github.com/RocketChat/Rocket.Chat/pull/7209) "requirePasswordChange" property not being saved when set to false
- [#7208](https://github.com/RocketChat/Rocket.Chat/pull/7208) Fix oembed previews not being shown
- [#7200](https://github.com/RocketChat/Rocket.Chat/pull/7200) Fix editing others messages
- [#7160](https://github.com/RocketChat/Rocket.Chat/pull/7160) Removing the kadira package install from example build script.
## 0.57.0-rc.1 (2017-06-02)
### Bug Fixes
- [#7157](https://github.com/RocketChat/Rocket.Chat/pull/7157) Fix all reactions having the same username
<details>
<summary>Others</summary>
- [#7154](https://github.com/RocketChat/Rocket.Chat/pull/7154) Remove missing CoffeeScript dependencies
</details>
## 0.57.0-rc.0 (2017-06-01)
### New Features
- [#7085](https://github.com/RocketChat/Rocket.Chat/pull/7085) API method and REST Endpoint for getting a single message by id
- [#6919](https://github.com/RocketChat/Rocket.Chat/pull/6919) Feature/delete any message permission
- [#6938](https://github.com/RocketChat/Rocket.Chat/pull/6938) Improve CI/Docker build/release
- [#7059](https://github.com/RocketChat/Rocket.Chat/pull/7059) Increase unread message count on [@here](https://github.com/here) mention
- [#6921](https://github.com/RocketChat/Rocket.Chat/pull/6921) LDAP: Use variables in User_Data_FieldMap for name mapping
- [#6857](https://github.com/RocketChat/Rocket.Chat/pull/6857) Make channel/group delete call answer to roomName
- [#7080](https://github.com/RocketChat/Rocket.Chat/pull/7080) Migration to add <html> tags to email header and footer
- [#6788](https://github.com/RocketChat/Rocket.Chat/pull/6788) New avatar storage types
- [#6690](https://github.com/RocketChat/Rocket.Chat/pull/6690) Show full name in mentions if use full name setting enabled
- [#6953](https://github.com/RocketChat/Rocket.Chat/pull/6953) Show info about multiple instances at admin page
- [#6605](https://github.com/RocketChat/Rocket.Chat/pull/6605) Start running unit tests
### Bug Fixes
- [#7025](https://github.com/RocketChat/Rocket.Chat/pull/7025) Add <html> and </html> to header and footer
- [#7084](https://github.com/RocketChat/Rocket.Chat/pull/7084) Add option to ignore TLS in SMTP server settings
- [#7072](https://github.com/RocketChat/Rocket.Chat/pull/7072) Add support for carriage return in markdown code blocks
- [#6910](https://github.com/RocketChat/Rocket.Chat/pull/6910) Allow image insert from slack through slackbridge
- [#6904](https://github.com/RocketChat/Rocket.Chat/pull/6904) Bugs in `isUserFromParams` helper
- [#6840](https://github.com/RocketChat/Rocket.Chat/pull/6840) Check that username is not in the room when being muted / unmuted
- [#7103](https://github.com/RocketChat/Rocket.Chat/pull/7103) clipboard (permalink, copy, pin, star buttons)
- [#7030](https://github.com/RocketChat/Rocket.Chat/pull/7030) do only store password if LDAP_Login_Fallback is on
- [#7105](https://github.com/RocketChat/Rocket.Chat/pull/7105) edit button on firefox
- [#6935](https://github.com/RocketChat/Rocket.Chat/pull/6935) Error when trying to show preview of undefined filetype
- [#7045](https://github.com/RocketChat/Rocket.Chat/pull/7045) Fix avatar upload via users.setAvatar REST endpoint
- [#6950](https://github.com/RocketChat/Rocket.Chat/pull/6950) Fix badge counter on iOS push notifications
- [#7121](https://github.com/RocketChat/Rocket.Chat/pull/7121) fix bug in preview image
- [#6972](https://github.com/RocketChat/Rocket.Chat/pull/6972) Fix error handling for non-valid avatar URL
- [#6974](https://github.com/RocketChat/Rocket.Chat/pull/6974) Fix login with Meteor saving an object as email address
- [#7104](https://github.com/RocketChat/Rocket.Chat/pull/7104) Fix missing CSS files on production builds
- [#6986](https://github.com/RocketChat/Rocket.Chat/pull/6986) Fix the other tests failing due chimp update
- [#7049](https://github.com/RocketChat/Rocket.Chat/pull/7049) Improve Tests
- [#6968](https://github.com/RocketChat/Rocket.Chat/pull/6968) make channels.create API check for create-c
- [#7044](https://github.com/RocketChat/Rocket.Chat/pull/7044) New screen sharing Chrome extension checking method
- [#6999](https://github.com/RocketChat/Rocket.Chat/pull/6999) overlapping text for users-typing-message
- [#7014](https://github.com/RocketChat/Rocket.Chat/pull/7014) Parse HTML on admin setting's descriptions
- [#6997](https://github.com/RocketChat/Rocket.Chat/pull/6997) Parse markdown links last
- [#7033](https://github.com/RocketChat/Rocket.Chat/pull/7033) Prevent Ctrl key on message field from reloading messages list
- [#6912](https://github.com/RocketChat/Rocket.Chat/pull/6912) Remove room from roomPick setting
- [#6961](https://github.com/RocketChat/Rocket.Chat/pull/6961) SAML: Only set KeyDescriptor when non empty
- [#7023](https://github.com/RocketChat/Rocket.Chat/pull/7023) Sidenav roomlist
- [#6913](https://github.com/RocketChat/Rocket.Chat/pull/6913) Slackbridge text replacements
- [#6903](https://github.com/RocketChat/Rocket.Chat/pull/6903) Updating Incoming Integration Post As Field Not Allowed
- [#6947](https://github.com/RocketChat/Rocket.Chat/pull/6947) Use AWS Signature Version 4 signed URLs for uploads
- [#7012](https://github.com/RocketChat/Rocket.Chat/pull/7012) video message recording dialog is shown in an incorrect position
<details>
<summary>Others</summary>
- [#7094](https://github.com/RocketChat/Rocket.Chat/pull/7094) [FIX]Fix the failing tests
- [#7092](https://github.com/RocketChat/Rocket.Chat/pull/7092) [FIX]Fixed typo hmtl -> html
- [#7145](https://github.com/RocketChat/Rocket.Chat/pull/7145) Convert file unsubscribe.coffee to js
- [#7146](https://github.com/RocketChat/Rocket.Chat/pull/7146) Convert hipchat importer to js
- [#7022](https://github.com/RocketChat/Rocket.Chat/pull/7022) Convert irc package to js
- [#7096](https://github.com/RocketChat/Rocket.Chat/pull/7096) Convert Livechat from Coffeescript to JavaScript
- [#6936](https://github.com/RocketChat/Rocket.Chat/pull/6936) Convert meteor-autocomplete package to js
- [#7017](https://github.com/RocketChat/Rocket.Chat/pull/7017) Convert oauth2-server-config package to js
- [#6795](https://github.com/RocketChat/Rocket.Chat/pull/6795) Convert Ui Account Package to Js
- [#6911](https://github.com/RocketChat/Rocket.Chat/pull/6911) Convert ui-admin package to js
- [#6775](https://github.com/RocketChat/Rocket.Chat/pull/6775) Convert WebRTC Package to Js
- [#7018](https://github.com/RocketChat/Rocket.Chat/pull/7018) converted rocketchat-importer
- [#6836](https://github.com/RocketChat/Rocket.Chat/pull/6836) converted rocketchat-ui coffee to js part 2
- [#6976](https://github.com/RocketChat/Rocket.Chat/pull/6976) fix the crashing tests
- [#7055](https://github.com/RocketChat/Rocket.Chat/pull/7055) Ldap: User_Data_FieldMap description
- [#7114](https://github.com/RocketChat/Rocket.Chat/pull/7114) LingoHub based on develop
- [#7005](https://github.com/RocketChat/Rocket.Chat/pull/7005) LingoHub based on develop
- [#6978](https://github.com/RocketChat/Rocket.Chat/pull/6978) LingoHub based on develop
- [#7062](https://github.com/RocketChat/Rocket.Chat/pull/7062) Remove Useless Jasmine Tests
- [#6914](https://github.com/RocketChat/Rocket.Chat/pull/6914) Rocketchat ui message
- [#7006](https://github.com/RocketChat/Rocket.Chat/pull/7006) Rocketchat ui3
- [#6987](https://github.com/RocketChat/Rocket.Chat/pull/6987) rocketchat-importer-slack coffee to js
- [#6735](https://github.com/RocketChat/Rocket.Chat/pull/6735) rocketchat-lib[4] coffee to js
</details>
</details>
<a name="0.56.0"></a>
# 0.56.0 (2017-05-15)
### New Features

@ -23,6 +23,7 @@
* [Ubuntu 16.04](#ubuntu-1604)
* [Cloudron.io](#cloudronio)
* [Heroku](#heroku)
* [Helm Kubernetes](#helm-kubernetes)
* [Scalingo](#scalingo)
* [Sloppy.io](#sloppyio)
* [Docker](#docker)
@ -137,6 +138,9 @@ Host your own Rocket.Chat server for **FREE** with [One-Click Deploy](https://he
[![Deploy](https://www.herokucdn.com/deploy/button.png)](https://heroku.com/deploy?template=https://github.com/RocketChat/Rocket.Chat/tree/master)
## Helm Kubernetes
Deploy on Kubernetes using the official [helm chart](https://github.com/kubernetes/charts/pull/752).
## Scalingo
Deploy your own Rocket.Chat server instantly on [Scalingo](https://scalingo.com)

@ -6,7 +6,6 @@
"keywords": ["meteor", "social", "community", "chat"],
"website": "https://rocket.chat",
"env": {
"NODE_ENV": "production",
"BUILDPACK_URL": "https://github.com/RocketChat/meteor-buildpack-horse.git",
"HEROKU_APP_NAME": {
"description": "Please re-enter your App Name from the top.",

@ -9,8 +9,8 @@ this.handleError = function(error, useToastr = true) {
}
if (useToastr) {
return toastr.error(TAPi18n.__(error.error, error.details), error.details && error.details.errorTitle ? TAPi18n.__(error.details.errorTitle) : null);
return toastr.error(_.escapeHTML(TAPi18n.__(error.error, error.details)), error.details && error.details.errorTitle ? _.escapeHTML(TAPi18n.__(error.details.errorTitle)) : null);
}
return TAPi18n.__(error.error, error.details);
return _.escapeHTML(TAPi18n.__(error.error, error.details));
};

@ -1,5 +1,4 @@
import moment from 'moment';
import toastr from 'toastr';
Meteor.methods({
deleteMessage(message) {
@ -22,17 +21,14 @@ Meteor.methods({
return false;
}
const blockDeleteInMinutes = RocketChat.settings.get('Message_AllowDeleting_BlockDeleteInMinutes');
if (!(forceDelete) || (_.isNumber(blockDeleteInMinutes) && blockDeleteInMinutes !== 0)) {
if (message.ts) {
const msgTs = moment(message.ts);
if (msgTs) {
const currentTsDiff = moment().diff(msgTs, 'minutes');
if (currentTsDiff > blockDeleteInMinutes) {
toastr.error(t('error-message-deleting-blocked'));
return false;
}
}
if (!forceDelete && _.isNumber(blockDeleteInMinutes) && blockDeleteInMinutes !== 0) {
const msgTs = moment(message.ts);
const currentTsDiff = moment().diff(msgTs, 'minutes');
if (currentTsDiff > blockDeleteInMinutes) {
return false;
}
}
Tracker.nonreactive(function() {

@ -0,0 +1,32 @@
#!/bin/bash
set -x
set -euvo pipefail
IFS=$'\n\t'
# Requies Node.js version 4.x
# Do not run as root
DEPLOY_DIR=/var/www/rocket.chat
### BUILD
meteor npm install
# on the very first build, meteor build command should fail due to a bug on emojione package (related to phantomjs installation)
# the command below forces the error to happen before build command (not needed on subsequent builds)
set +e
meteor add rocketchat:lib
set -e
meteor build --server-only --directory $DEPLOY_DIR
### RUN
cd $DEPLOY_DIR/bundle/programs/server
npm install
cd $DEPLOY_DIR/bundle
NODE_ENV=production \
PORT=3000 \
ROOT_URL=http://localhost:3000 \
MONGO_URL=mongodb://localhost:27017/rocketchat \
MONGO_OPLOG_URL=mongodb://localhost:27017/local \
node main.js

@ -1,16 +0,0 @@
#!/bin/bash
set -x
set -euvo pipefail
IFS=$'\n\t'
# Build
export NODE_ENV=production
meteor add rocketchat:internal-hubot
meteor build --server https://demo.rocket.chat --directory /var/www/rocket.chat
# Run
export METEOR_SETTINGS=$(cat settings.json)
cd /var/www/rocket.chat/bundle/programs/server
npm install
cd /var/www/rocket.chat/current
pm2 startOrRestart /var/www/rocket.chat/current/pm2.json

@ -1,7 +1,7 @@
{
"name": "Rocket.Chat",
"description": "The Ultimate Open Source WebChat Platform",
"version": "0.57.0-develop",
"version": "0.58.0-develop",
"author": {
"name": "Rocket.Chat",
"url": "https://rocket.chat/"
@ -54,7 +54,7 @@
"start": "meteor npm i && meteor",
"lint": "eslint .",
"lint-fix": "eslint . --fix",
"stylelint": "stylelint packages/**/*.{less,css}",
"stylelint": "stylelint 'packages/**/*.{less,css}'",
"test": "node .scripts/start.js",
"deploy": "npm run build && pm2 startOrRestart pm2.json",
"chimp-watch": "chimp --ddp=http://localhost:3000 --watch --mocha --path=tests/end-to-end",
@ -79,30 +79,30 @@
"devDependencies": {
"babel-mocha-es6-compiler": "^0.1.0",
"babel-plugin-array-includes": "^2.0.3",
"chimp": "^0.49.0",
"conventional-changelog-cli": "^1.3.1",
"eslint": "^4.0.0",
"chimp": "^0.49.1",
"conventional-changelog-cli": "^1.3.2",
"eslint": "^4.2.0",
"postcss-cssnext": "^2.11.0",
"postcss-smart-import": "^0.7.4",
"postcss-smart-import": "^0.7.5",
"simple-git": "^1.73.0",
"stylelint": "^7.11.1",
"stylelint": "^7.13.0",
"supertest": "^3.0.0"
},
"dependencies": {
"@google-cloud/storage": "^1.1.1",
"aws-sdk": "^2.73.0",
"@google-cloud/storage": "^1.2.0",
"aws-sdk": "^2.86.0",
"babel-runtime": "^6.23.0",
"bcrypt": "^1.0.2",
"codemirror": "^5.26.0",
"codemirror": "^5.27.4",
"file-type": "^5.2.0",
"highlight.js": "^9.12.0",
"jquery": "^3.2.1",
"mime-db": "^1.28.0",
"mime-db": "^1.29.0",
"mime-type": "^3.0.5",
"moment": "^2.18.1",
"moment-timezone": "^0.5.13",
"photoswipe": "^4.1.2",
"prom-client": "^9.1.1",
"prom-client": "^10.0.2",
"semver": "^5.3.0",
"toastr": "^2.1.2"
}

@ -14,7 +14,7 @@
<div class="section-content border-component-color">
<div class="alert pending-background pending-color pending-border">
<strong>
WARNING: Once you enable this, you will not be able to login on the native mobile apps (Rocket.Chat+) using your password until they implement the 2FA.
{{_ "Two-factor_authentication_native_mobile_app_warning"}}
</strong>
</div>
{{#if isEnabled}}

@ -332,13 +332,22 @@ RocketChat.API.v1.addRoute('channels.leave', { authRequired: true }, {
RocketChat.API.v1.addRoute('channels.list', { authRequired: true }, {
get: {
//This is like this only to provide an example of how we routes can be defined :X
//This is defined as such only to provide an example of how the routes can be defined :X
action() {
const { offset, count } = this.getPaginationItems();
const { sort, fields, query } = this.parseJsonQuery();
const ourQuery = Object.assign({}, query, { t: 'c' });
//Special check for the permissions
if (RocketChat.authz.hasPermission(this.userId, 'view-joined-room')) {
ourQuery.usernames = {
$in: [ this.user.username ]
};
} else if (!RocketChat.authz.hasPermission(this.userId, 'view-c-room')) {
return RocketChat.API.v1.unauthorized();
}
const rooms = RocketChat.models.Rooms.find(ourQuery, {
sort: sort ? sort : { name: 1 },
skip: offset,

@ -64,6 +64,18 @@ RocketChat.API.v1.addRoute('groups.addOwner', { authRequired: true }, {
}
});
RocketChat.API.v1.addRoute('groups.addLeader', { authRequired: true }, {
post() {
const findResult = findPrivateGroupByIdOrName({ params: this.requestParams(), userId: this.userId });
const user = this.getUserFromParams();
Meteor.runAsUser(this.userId, () => {
Meteor.call('addRoomLeader', findResult.rid, user._id);
});
return RocketChat.API.v1.success();
}
});
//Archives a private group only if it wasn't
RocketChat.API.v1.addRoute('groups.archive', { authRequired: true }, {
post() {
@ -373,6 +385,20 @@ RocketChat.API.v1.addRoute('groups.removeOwner', { authRequired: true }, {
}
});
RocketChat.API.v1.addRoute('groups.removeLeader', { authRequired: true }, {
post() {
const findResult = findPrivateGroupByIdOrName({ params: this.requestParams(), userId: this.userId });
const user = this.getUserFromParams();
Meteor.runAsUser(this.userId, () => {
Meteor.call('removeRoomLeader', findResult.rid, user._id);
});
return RocketChat.API.v1.success();
}
});
RocketChat.API.v1.addRoute('groups.rename', { authRequired: true }, {
post() {
if (!this.bodyParams.name || !this.bodyParams.name.trim()) {

@ -19,12 +19,17 @@ RocketChat.API.v1.addRoute('users.create', { authRequired: true }, {
this.bodyParams.joinDefaultChannels = true;
}
if (this.bodyParams.customFields) {
RocketChat.validateCustomFields(this.bodyParams.customFields);
}
const newUserId = RocketChat.saveUser(this.userId, this.bodyParams);
if (this.bodyParams.customFields) {
RocketChat.saveCustomFields(newUserId, this.bodyParams.customFields);
RocketChat.saveCustomFieldsWithoutValidation(newUserId, this.bodyParams.customFields);
}
if (typeof this.bodyParams.active !== 'undefined') {
Meteor.runAsUser(this.userId, () => {
Meteor.call('setUserActiveStatus', newUserId, this.bodyParams.active);
@ -105,6 +110,10 @@ RocketChat.API.v1.addRoute('users.info', { authRequired: true }, {
RocketChat.API.v1.addRoute('users.list', { authRequired: true }, {
get() {
if (!RocketChat.authz.hasPermission(this.userId, 'view-d-room')) {
return RocketChat.API.v1.unauthorized();
}
const { offset, count } = this.getPaginationItems();
const { sort, fields, query } = this.parseJsonQuery();

@ -28,6 +28,10 @@
left: 50%;
transform: translateX(-50%);
}
.permission-name {
cursor: default;
}
}
.empty-role {

@ -19,7 +19,7 @@
<tbody>
{{#each permission}}
<tr class="admin-table-row">
<td class="border-component-color">{{_id}}</td>
<td class="permission-name border-component-color" title="{{_ permissionDescription}}">{{_ permissionName}}<br>[{{_id}}]</td>
{{#each role}}
<td class="border-component-color">
<input type="checkbox" name="perm[{{_id}}][{{../_id}}]" class="role-permission" value="1" checked="{{granted ../roles}}" data-role="{{_id}}" data-permission="{{../_id}}">

@ -21,6 +21,14 @@ Template.permissions.helpers({
}
},
permissionName() {
return `${ this._id }`;
},
permissionDescription() {
return `${ this._id }_description`;
},
hasPermission() {
return RocketChat.authz.hasAllPermission('access-permissions');
}

@ -46,6 +46,8 @@ Meteor.startup(function() {
{ _id: 'run-migration', roles : ['admin'] },
{ _id: 'set-moderator', roles : ['admin', 'owner'] },
{ _id: 'set-owner', roles : ['admin', 'owner'] },
{ _id: 'send-many-messages', roles : ['admin', 'bot'] },
{ _id: 'set-leader', roles : ['admin', 'owner'] },
{ _id: 'unarchive-room', roles : ['admin'] },
{ _id: 'view-c-room', roles : ['admin', 'user', 'bot', 'anonymous'] },
{ _id: 'user-generate-access-token', roles : ['admin'] },
@ -73,6 +75,7 @@ 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: '' },

@ -33,7 +33,9 @@ Meteor.loginWithCas = function(options, callback) {
}
const appUrl = Meteor.absoluteUrl().replace(/\/$/, '') + __meteor_runtime_config__.ROOT_URL_PATH_PREFIX;
const loginUrl = `${ login_url }?service=${ appUrl }/_cas/${ credentialToken }`;
// check if the provided CAS URL already has some parameters
const delim = (login_url.split('?').length > 1) ? '&' : '?';
const loginUrl = `${ login_url }${ delim }service=${ appUrl }/_cas/${ credentialToken }`;
const popup = openCenteredPopup(
loginUrl,

@ -249,7 +249,9 @@ Accounts.registerLoginHandler(function(options) {
ts: new Date(),
open: true,
alert: true,
unread: 1
unread: 1,
userMentions: 1,
groupMentions: 0
});
}
});

@ -21,12 +21,13 @@ RocketChat.ChannelSettings = new class {
});
}
getOptions(currentData, group) {
getOptions(currentData = {}, group) {
const allOptions = _.toArray(this.options.get());
const allowedOptions = _.compact(_.map(allOptions, function(option) {
const ret = {...option};
if (option.validation == null || option.validation()) {
option.data = Object.assign({}, typeof option.data === 'function' ? option.data() : option.data, currentData);
return option;
ret.data = Object.assign({}, typeof option.data === 'function' ? option.data() : option.data, currentData);
return ret;
}
})).filter(function(option) {
return !group || !option.group || option.group.includes(group);

@ -1,106 +1,104 @@
<template name="channelSettings">
<div class="content">
<div class="list-view channel-settings">
<div class="title">
<h2>{{_ "Room_Info"}}</h2>
</div>
<form>
<ul class="list clearfix">
{{#let room=getRoom}}
{{#each toArray settings}}
<div class="list-view channel-settings">
<div class="title">
<h2>{{_ "Room_Info"}}</h2>
</div>
<form>
<ul class="list clearfix">
{{#let room=getRoom}}
{{#each toArray settings}}
{{#if $value.canView room}}
{{#let value=(valueOf room $key)}}
<li class="{{$value.type}}">
<label>{{_ $value.label}}</label>
<div class="setting-block">
{{#if $eq $value.type 'text'}}
{{#if editing $key}}
{{#if $value.canEdit room}}
<input type="text" name="{{$key}}" value="{{value}}" class="content-background-color editing" />
{{/if}}
{{else}}
<span class='current-setting' data-edit="{{#if $value.canEdit room}}{{$key}}{{else}}false{{/if}}">{{value}}</span>
{{#if $value.canView room}}
{{#let value=(valueOf room $key)}}
<li class="{{$value.type}}">
<label>{{_ $value.label}}</label>
<div class="setting-block">
{{#if $eq $value.type 'text'}}
{{#if editing $key}}
{{#if $value.canEdit room}}
<input type="text" name="{{$key}}" value="{{value}}" class="content-background-color editing" />
{{/if}}
{{else}}
<span class='current-setting' data-edit="{{#if $value.canEdit room}}{{$key}}{{else}}false{{/if}}">{{value}}</span>
{{/if}}
{{/if}}
{{#if $eq $value.type 'markdown'}}
{{#if editing $key}}
{{#if $value.canEdit room}}
<input type="text" name="{{$key}}" value="{{unscape value}}" class="content-background-color editing" />
{{/if}}
{{else}}
<span class='current-setting' data-edit="{{#if $value.canEdit room}}{{$key}}{{else}}false{{/if}}">{{{RocketChatMarkdown value}}}</span>
{{#if $eq $value.type 'markdown'}}
{{#if editing $key}}
{{#if $value.canEdit room}}
<input type="text" name="{{$key}}" value="{{unscape value}}" class="content-background-color editing" />
{{/if}}
{{else}}
<span class='current-setting' data-edit="{{#if $value.canEdit room}}{{$key}}{{else}}false{{/if}}">{{{RocketChatMarkdown value}}}</span>
{{/if}}
{{/if}}
{{#if $eq $value.type 'select'}}
{{#each toArray $value.options}}
<div class="input radio">
<input type="radio" id="{{$key}}" name="{{../$key}}" value="{{$key}}" checked="{{$eq value $key}}" disabled="{{isDisabled $key room}}" />
<label for="{{$key}}">{{_ $value}}</label>
</div>
{{/each}}
{{/if}}
{{#if $eq $value.type 'boolean'}}
<div class="input checkbox toggle">
<input type="checkbox" id="{{$key}}" name="{{$key}}" value="{{value}}" checked="{{$eq value true}}" disabled="{{isDisabled $key room}}" />
<label for="{{$key}}"></label>
{{#if $eq $value.type 'select'}}
{{#each toArray $value.options}}
<div class="input radio">
<input type="radio" id="{{$key}}" name="{{../$key}}" value="{{$key}}" checked="{{$eq value $key}}" disabled="{{isDisabled $key room}}" />
<label for="{{$key}}">{{_ $value}}</label>
</div>
{{#if $value.canEdit room}}
{{#if $value.processing.get}}
{{> loading}}
{{/if}}
{{/each}}
{{/if}}
{{#if $eq $value.type 'boolean'}}
<div class="input checkbox toggle">
<input type="checkbox" id="{{$key}}" name="{{$key}}" value="{{value}}" checked="{{$eq value true}}" disabled="{{isDisabled $key room}}" />
<label for="{{$key}}"></label>
</div>
{{#if $value.canEdit room}}
{{#if $value.processing.get}}
{{> loading}}
{{/if}}
{{/if}}
{{/if}}
{{#unless $value.isToggle}}
{{#if $value.canEdit room}}
{{#if editing $key}}
<div class="buttons secondary-background-color">
<button type="button" class="button cancel">
<i class="icon-cancel"></i>
</button>
<button type="button" class="button primary save">
<i class="icon-ok success-color"></i>
</button>
</div>
{{else}}
<button type="button" class="button edit">
<i class="icon-pencil" data-edit="{{$key}}"></i>
{{#unless $value.isToggle}}
{{#if $value.canEdit room}}
{{#if editing $key}}
<div class="buttons secondary-background-color">
<button type="button" class="button cancel">
<i class="icon-cancel"></i>
</button>
<button type="button" class="button primary save">
<i class="icon-ok success-color"></i>
</button>
{{/if}}
{{/if}}
{{/unless}}
</div>
</li>
{{# if has $value 'message' }}
{{#let message=($value.message room)}}
{{#if message}}
<li>
<div class="alert alert-warning pending-background pending-border">
{{_ message}}
</div>
</li>
{{else}}
<button type="button" class="button edit">
<i class="icon-pencil" data-edit="{{$key}}"></i>
</button>
{{/if}}
{{/if}}
{{/let}}
{{/if}}
{{/let}}
{{/if}}
{{/each}}
{{/let}}
{{#each channelSettings}}
{{> Template.dynamic template=template data=data}}
{{/unless}}
</div>
</li>
{{# if has $value 'message' }}
{{#let message=($value.message room)}}
{{#if message}}
<li>
<div class="alert alert-warning pending-background pending-border">
{{_ message}}
</div>
</li>
{{/if}}
{{/let}}
{{/if}}
{{/let}}
{{/if}}
{{/each}}
</ul>
</form>
{{#if canDeleteRoom}}
<nav>
<button class="button danger delete" title="{{_ 'Delete'}}"><i class="icon-trash"></i></button>
</nav>
{{/if}}
</div>
{{/let}}
{{#each channelSettings}}
{{> Template.dynamic template=template data=data}}
{{/each}}
</ul>
</form>
{{#if canDeleteRoom}}
<nav>
<button class="button danger delete" title="{{_ 'Delete'}}"><i class="icon-trash"></i></button>
</nav>
{{/if}}
</div>
</template>

@ -2,7 +2,7 @@
import url from 'url';
WebApp.rawConnectHandlers.use(function(req, res, next) {
WebApp.rawConnectHandlers.use(Meteor.bindEnvironment(function(req, res, next) {
if (req._body) {
return next();
}
@ -12,7 +12,7 @@ WebApp.rawConnectHandlers.use(function(req, res, next) {
if (req.headers['content-type'] !== '' && req.headers['content-type'] !== undefined) {
return next();
}
if (req.url.indexOf('/ufs/') === 0) {
if (req.url.indexOf(`${ __meteor_runtime_config__.ROOT_URL_PATH_PREFIX }/ufs/`) === 0) {
return next();
}
@ -36,7 +36,7 @@ WebApp.rawConnectHandlers.use(function(req, res, next) {
return next();
});
});
}));
WebApp.rawConnectHandlers.use(function(req, res, next) {
if (/^\/(api|_timesync|sockjs|tap-i18n|__cordova)(\/|$)/.test(req.url)) {

@ -13,7 +13,7 @@
</div>
<div class="input-line">
<label for="image">{{_ "Sound_File_mp3"}}</label>
<input id="image" type="file" accept="audio/mp3"/>
<input id="image" type="file" accept="audio/mp3,audio/mpeg"/>
</div>
<nav>
<button class='button button-block cancel' type="button"><span>{{_ "Cancel"}}</span></button>

@ -1,6 +1,6 @@
/* globals getEmojiUrlFromName:true, updateEmojiCustom:true, deleteEmojiCustom:true, isSetNotNull */
RocketChat.emoji.packages.emojiCustom = {
emojiCategories: { rocket: TAPi18n.__('Custom') },
emojiCategories: { rocket: 'Custom' },
toneList: {},
list: [],

@ -0,0 +1,6 @@
/* globals emojione */
Meteor.startup(function() {
RocketChat.callbacks.add('beforeNotifyUser', (message) => {
return emojione.shortnameToUnicode(message);
});
});

@ -4,14 +4,14 @@
* Mapping category hashes into human readable and translated names
*/
emojiCategories = {
people: TAPi18n.__('Smileys_and_People'),
nature: TAPi18n.__('Animals_and_Nature'),
food: TAPi18n.__('Food_and_Drink'),
activity: TAPi18n.__('Activity'),
travel: TAPi18n.__('Travel_and_Places'),
objects: TAPi18n.__('Objects'),
symbols: TAPi18n.__('Symbols'),
flags: TAPi18n.__('Flags')
people: 'Smileys_and_People',
nature: 'Animals_and_Nature',
food: 'Food_and_Drink',
activity: 'Activity',
travel: 'Travel_and_Places',
objects: 'Objects',
symbols: 'Symbols',
flags: 'Flags'
};
toneList = {

@ -8,14 +8,15 @@ Package.describe({
Package.onUse(function(api) {
api.use([
'ecmascript',
'emojione:emojione',
'emojione:emojione@2.2.6',
'rocketchat:emoji',
'rocketchat:lib'
]);
api.addFiles('emojiPicker.js', 'client');
api.addFiles('emojiPicker.js');
api.addFiles('rocketchat.js', 'client');
api.addFiles('rocketchat.js');
api.addFiles('sprites.css', 'client');
api.addFiles('callbacks.js', 'server');
});

@ -9,7 +9,8 @@ function categoryName(category) {
for (const emojiPackage in RocketChat.emoji.packages) {
if (RocketChat.emoji.packages.hasOwnProperty(emojiPackage)) {
if (RocketChat.emoji.packages[emojiPackage].emojiCategories.hasOwnProperty(category)) {
return RocketChat.emoji.packages[emojiPackage].emojiCategories[category];
const categoryTag = RocketChat.emoji.packages[emojiPackage].emojiCategories[category];
return TAPi18n.__(categoryTag);
}
}
}

@ -16,7 +16,7 @@ Package.onUse(function(api) {
]);
api.addFiles('function-isSet.js', 'client');
api.addFiles('rocketchat.js', 'client');
api.addFiles('rocketchat.js');
api.addFiles('emojiParser.js', 'client');

@ -1,7 +1,7 @@
RocketChat.emoji = {
packages: {
base: {
emojiCategories: { recent: TAPi18n.__('Frequently_Used') },
emojiCategories: { recent: 'Frequently_Used' },
emojisByCategory: {
recent: []
},

@ -31,6 +31,7 @@ Package.onUse(function(api) {
api.addFiles('client/lib/fileUploadHandler.js', 'client');
api.addFiles('server/lib/FileUpload.js', 'server');
api.addFiles('server/lib/proxy.js', 'server');
api.addFiles('server/lib/requests.js', 'server');
api.addFiles('server/config/_configUploadStorage.js', 'server');

@ -32,8 +32,10 @@ const configure = _.debounce(function() {
const AWSSecretAccessKey = RocketChat.settings.get('FileUpload_S3_AWSSecretAccessKey');
const URLExpiryTimeSpan = RocketChat.settings.get('FileUpload_S3_URLExpiryTimeSpan');
const Region = RocketChat.settings.get('FileUpload_S3_Region');
const SignatureVersion = RocketChat.settings.get('FileUpload_S3_SignatureVersion');
const ForcePathStyle = RocketChat.settings.get('FileUpload_S3_ForcePathStyle');
// const CDN = RocketChat.settings.get('FileUpload_S3_CDN');
// const BucketURL = RocketChat.settings.get('FileUpload_S3_BucketURL');
const BucketURL = RocketChat.settings.get('FileUpload_S3_BucketURL');
if (!Bucket || !AWSAccessKeyId || !AWSSecretAccessKey) {
return;
@ -43,7 +45,8 @@ const configure = _.debounce(function() {
connection: {
accessKeyId: AWSAccessKeyId,
secretAccessKey: AWSSecretAccessKey,
signatureVersion: 'v4',
signatureVersion: SignatureVersion,
s3ForcePathStyle: ForcePathStyle,
params: {
Bucket,
ACL: Acl
@ -53,6 +56,10 @@ const configure = _.debounce(function() {
URLExpiryTimeSpan
};
if (BucketURL) {
config.connection.endpoint = BucketURL;
}
AmazonS3Uploads.store = FileUpload.configureUploadsStore('AmazonS3', AmazonS3Uploads.name, config);
AmazonS3Avatars.store = FileUpload.configureUploadsStore('AmazonS3', AmazonS3Avatars.name, config);
}, 500);

@ -0,0 +1,91 @@
/* globals UploadFS, InstanceStatus */
import http from 'http';
import URL from 'url';
const logger = new Logger('UploadProxy');
WebApp.connectHandlers.stack.unshift({
route: '',
handle: Meteor.bindEnvironment(function(req, res, next) {
// Quick check to see if request should be catch
if (req.url.indexOf(UploadFS.config.storesPath) === -1) {
return next();
}
logger.debug('Upload URL:', req.url);
if (req.method !== 'POST') {
return next();
}
// Remove store path
const parsedUrl = URL.parse(req.url);
const path = parsedUrl.pathname.substr(UploadFS.config.storesPath.length + 1);
// Get store
const regExp = new RegExp('^\/([^\/\?]+)\/([^\/\?]+)$');
const match = regExp.exec(path);
// Request is not valid
if (match === null) {
res.writeHead(400);
res.end();
return;
}
// Get store
const store = UploadFS.getStore(match[1]);
if (!store) {
res.writeHead(404);
res.end();
return;
}
// Get file
const fileId = match[2];
const file = store.getCollection().findOne({_id: fileId});
if (file === undefined) {
res.writeHead(404);
res.end();
return;
}
if (file.instanceId === InstanceStatus.id()) {
logger.debug('Correct instance');
return next();
}
// Proxy to other instance
const instance = InstanceStatus.getCollection().findOne({_id: file.instanceId});
if (instance == null) {
res.writeHead(404);
res.end();
return;
}
if (instance.extraInformation.host === process.env.INSTANCE_IP && RocketChat.isDocker() === false) {
instance.extraInformation.host = 'localhost';
}
logger.debug('Wrong instance, proxing to:', `${ instance.extraInformation.host }:${ instance.extraInformation.port }`);
const options = {
hostname: instance.extraInformation.host,
port: instance.extraInformation.port,
path: req.url,
method: 'POST'
};
const proxy = http.request(options, function(proxy_res) {
proxy_res.pipe(res, {
end: true
});
});
req.pipe(proxy, {
end: true
});
})
});

@ -7,7 +7,8 @@ RocketChat.settings.get('FileUpload_ProtectFiles', function(key, value) {
protectedFiles = value;
});
WebApp.connectHandlers.use('/file-upload/', function(req, res, next) {
WebApp.connectHandlers.use(`${ __meteor_runtime_config__.ROOT_URL_PATH_PREFIX }/file-upload/`, function(req, res, next) {
const match = /^\/([^\/]+)\/(.*)/.exec(req.url);
if (match[1]) {

@ -54,7 +54,8 @@ Meteor.methods({
msg: '',
file: {
_id: file._id,
name: file.name
name: file.name,
type: file.type
},
groupable: false,
attachments: [attachment]

@ -90,6 +90,20 @@ RocketChat.settings.addGroup('FileUpload', function() {
},
i18nDescription: 'Override_URL_to_which_files_are_uploaded_This_url_also_used_for_downloads_unless_a_CDN_is_given.'
});
this.add('FileUpload_S3_SignatureVersion', 'v4', {
type: 'string',
enableQuery: {
_id: 'FileUpload_Storage_Type',
value: 'AmazonS3'
}
});
this.add('FileUpload_S3_ForcePathStyle', false, {
type: 'boolean',
enableQuery: {
_id: 'FileUpload_Storage_Type',
value: 'AmazonS3'
}
});
this.add('FileUpload_S3_URLExpiryTimeSpan', 120, {
type: 'int',
enableQuery: {

@ -105,6 +105,7 @@ RocketChatFile.GridFS = class {
this.store = new Grid(db, mongo);
this.findOneSync = Meteor.wrapAsync(this.store.collection(this.name).findOne.bind(this.store.collection(this.name)));
this.removeSync = Meteor.wrapAsync(this.store.remove.bind(this.store));
this.countSync = Meteor.wrapAsync(this.store._col.count.bind(this.store._col));
this.getFileSync = Meteor.wrapAsync(this.getFile.bind(this));
}

@ -0,0 +1,3 @@
{
"#channel": "#channel"
}

@ -751,7 +751,9 @@
"Integrations_for_all_channels": "Introdueix <strong>all_public_channels</strong> per escoltar a totes les sales públiques, <strong>all_private_groups</strong> per escoltar a tots els grups privats i <strong>all_direct_messages</strong> per escoltar tots els missatges directes.",
"InternalHubot": "Hubot intern",
"InternalHubot_ScriptsToLoad": "Seqüències d'ordres (scripts) per carregar",
"InternalHubot_ScriptsToLoad_Description": "Si us plau, introduiu una llista separada per comes de scripts de https://github.com/github/hubot-scripts/tree/master/src/scripts",
"InternalHubot_ScriptsToLoad_Description": "Si us plau, introduiu una llista separada per comes de scripts per carregar des de la carpeta personalitzada",
"InternalHubot_PathToLoadCustomScripts": "Carpeta des d'on carregar els scripts",
"InternalHubot_reload": "Recarrega els scripts",
"InternalHubot_Username_Description": "Ha de ser un nom d'usuari vàlid d'un bot registrat al servidor.",
"Invalid_confirm_pass": "La confirmació de la contrasenya no coincideix amb la contrasenya",
"Invalid_email": "L'adreça de correu-e és invàlida",
@ -873,7 +875,7 @@
"LDAP_Sync_User_Data": "Sincronitzar dades d'usuari",
"LDAP_Sync_User_Data_Description": "Mantenir les dades de l'usuari sincronitzades amb el servidor quan s'identifiqui (ex: nom, adreça de correu, etcètera).",
"LDAP_Sync_User_Data_FieldMap": "Mapatge de camps de dades d'usuari",
"LDAP_Sync_User_Data_FieldMap_Description": "Configura com els camps del compte d'usuari (com el de correu-e) s'omplen des del registre LDAP (un cop trobat).<br/>A tall d'exemple, `{\"cn\":\"name\", \"mail\":\"email\"}` triarà el nom des de l'atribut `cn`, i l'adreça-e des de l'atribut `mail`.<br/>Els camps disponibles `name` i `email`.",
"LDAP_Sync_User_Data_FieldMap_Description": "Configura com els camps del compte d'usuari (com el de correu-e) s'omplen des del registre LDAP (un cop trobat).<br/>A tall d'exemple, `{\"cn\":\"name\", \"mail\":\"email\"}` triarà el nom des de l'atribut `cn`, i l'adreça-e des de l'atribut `mail`. Addicionalment, és possible utilitzar variables, per exemple: `{ \"#{givenName} #{sn}\": \"name\", \"mail\": \"email\" }` utilitza una combinació del nom de pila i del cognom per al camp `name` de l'usuari de rocket chat. <br/>Camps disponibles a Rocket.Chat: `name` i `email`.",
"LDAP_Sync_Users": "Sincronització d'usuaris",
"LDAP_Test_Connection": "Prova la connexió",
"LDAP_Unique_Identifier_Field": "Camp d'identificador únic",
@ -1235,6 +1237,7 @@
"Registration_via_Admin": "Registre via Admin",
"Regular_Expressions": "Expressions regulars",
"Release": "Llançament",
"Reload": "Recarrega",
"Remove": "Esborrar",
"Remove_Admin": "Treu admin",
"Remove_as_moderator": "Treu de moderador",

@ -751,7 +751,9 @@
"Integrations_for_all_channels": "Zadejte <strong>all_public_channels</strong> pro poslouchání nad všemi otevřenými místnostmi, <strong>all_private_groups</strong> pro všechny soukromé místnosti a <strong>all_direct_messages</strong> pro poslouchání přímých konverzací",
"InternalHubot": "Interní Hubot",
"InternalHubot_ScriptsToLoad": "Načíst skripty",
"InternalHubot_ScriptsToLoad_Description": "Prosím, zadejte čárkami oddělený seznam skriptů k načtení z https://github.com/github/hubot-scripts/tree/master/src/scripts",
"InternalHubot_ScriptsToLoad_Description": "Prosím, zadejte čárkami oddělený seznam skriptů k načtení z https://github.com/github/hubot-scripts/tree/master/src/scripts umístěných ve vaší složce",
"InternalHubot_PathToLoadCustomScripts": "Složka odkud načíst skripty",
"InternalHubot_reload": "Znovu načíst skripty",
"InternalHubot_Username_Description": "Musí být platné uživatelské jméno jednoho z botů registrovaných na tomto serveru.",
"Invalid_confirm_pass": "Hesla nesouhlasí",
"Invalid_email": "Zadaný e-mail je neplatný",
@ -873,7 +875,7 @@
"LDAP_Sync_User_Data": "Synchronizace dat",
"LDAP_Sync_User_Data_Description": "Udržujte uživatelská data synchronizovaná se serverem po přihlášení (např: jméno, e-mail).",
"LDAP_Sync_User_Data_FieldMap": "Mapa polí uživatelských dat",
"LDAP_Sync_User_Data_FieldMap_Description": "Konfiguruje pole uživatelských dat (například e-mailu) v záznamu v LDAP. <br/> Například `{\" CN \":\" name \",\" mail \":\" email \"}` vybere jméno osoby z atributu CN, a jeho e-mail z atributu pošty. <br/> Volné pole obsahují `name` a `email`.",
"LDAP_Sync_User_Data_FieldMap_Description": "Konfiguruje pole uživatelských dat (například e-mailu) v záznamu v LDAP. <br/> Například `{\"cn\":\"name\", \"mail\":\"email\"}` vybere jméno osoby z atributu `cn`, a jeho e-mail z atributu `mail`. Lze používat proměnné například: `{ \"#{givenName} #{sn}\": \"name\", \"mail\": \"email\" }` použije kombinaci křestínho jména a příjmení pro pole `name` v Rocket.Chat.<br/>Dostupná pole Rocket.Chatu jsou `name`, a `email`.",
"LDAP_Sync_Users": "Synchronizovat Uživatele",
"LDAP_Test_Connection": "Test připojení",
"LDAP_Unique_Identifier_Field": "Jedinečný identifikátor",
@ -1235,6 +1237,7 @@
"Registration_via_Admin": "Registrace přes Admin",
"Regular_Expressions": "Regulární výrazy",
"Release": "Verze",
"Reload": "Znovu načíst",
"Remove": "Odstranit",
"Remove_Admin": "Odebrat Správce",
"Remove_as_moderator": "Odebrat moderátora",

@ -1479,4 +1479,4 @@
"your_message_optional": "ihre optionale Nachricht",
"Your_password_is_wrong": "Falsches Passwort",
"Your_push_was_sent_to_s_devices": "Die Push-Nachricht wurde an %s Geräte gesendet."
}
}

@ -6,6 +6,7 @@
"500": "Εσωτερικό Σφάλμα Διακομιστή",
"__username__is_no_longer__role__defined_by__user_by_": "__username__ is no longer __role__ by __user_by__",
"__username__was_set__role__by__user_by_": "__username__ was set __role__ by __user_by__",
"Accept": "Αποδοχή",
"Access_not_authorized": "Πρόσβαση δεν επιτρέπονται",
"Access_Token_URL": "Πρόσβαση Token URL",
"Accessing_permissions": "Πρόσβαση δικαιώματα",
@ -135,6 +136,7 @@
"and": "και",
"And_more": "Και πιο __length __",
"Animals_and_Nature": "Ζώα και Φύση",
"Announcement": "Ανακοίνωση",
"API": "API",
"API_Analytics": "Analytics",
"API_Embed": "Ενσωμάτωση",

@ -280,6 +280,7 @@
"Cancel": "Cancel",
"Cancel_message_input": "Cancel",
"Cannot_invite_users_to_direct_rooms": "Cannot invite users to direct rooms",
"Cannot_open_conversation_with_yourself": "Cannot open a conversation with yourself",
"CAS_autoclose": "Autoclose login popup",
"CAS_base_url": "SSO Base URL",
"CAS_base_url_Description": "The base URL of your external SSO service e.g: https://sso.example.undef/sso/",
@ -330,6 +331,8 @@
"Clear_all_unreads_question": "Clear all unreads?",
"Click_here": "Click here",
"Click_here_for_more_info": "Click here for more info",
"UI_Click_Direct_Message": "Click to Create Direct Message",
"UI_Click_Direct_Message_Description": "Skip opening profile tab, instead go straight to conversation",
"Client_ID": "Client ID",
"Client_Secret": "Client Secret",
"Clients_will_refresh_in_a_few_seconds": "Clients will refresh in a few seconds",
@ -418,6 +421,7 @@
"Desktop_Notifications_Duration": "Desktop Notifications Duration",
"Desktop_Notifications_Duration_Description": "Seconds to display desktop notification. This may affect OS X Notification Center. Enter 0 to use default browser settings and not affect OS X Notification Center.",
"Desktop_Notifications_Enabled": "Desktop Notifications are Enabled",
"Different_Style_For_User_Mentions": "Different style for user mentions",
"Direct_message_someone": "Direct message someone",
"Direct_Messages": "Direct Messages",
"Disable_Notifications": "Disable Notifications",
@ -593,10 +597,12 @@
"FileUpload_MediaTypeWhiteListDescription": "Comma-separated list of media types. Leave it blank for accepting all media types.",
"FileUpload_ProtectFiles": "Protect uploaded files",
"FileUpload_ProtectFilesDescription": "Only authenticated users will have access",
"FileUpload_S3_Acl": "Amazon S3 acl",
"FileUpload_S3_AWSAccessKeyId": "Amazon S3 AWSAccessKeyId",
"FileUpload_S3_AWSSecretAccessKey": "Amazon S3 AWSSecretAccessKey",
"FileUpload_S3_Bucket": "Amazon S3 bucket name",
"FileUpload_S3_Acl": "Acl",
"FileUpload_S3_AWSAccessKeyId": "Access Key",
"FileUpload_S3_AWSSecretAccessKey": "Secret Key",
"FileUpload_S3_Bucket": "Bucket name",
"FileUpload_S3_SignatureVersion": "Signature Version",
"FileUpload_S3_ForcePathStyle": "Force Path Style",
"FileUpload_S3_BucketURL": "Bucket URL",
"FileUpload_S3_CDN": "CDN domain for downloads",
"FileUpload_S3_Region": "Region",
@ -635,6 +641,7 @@
"GoogleCloudStorage": "Google Cloud Storage",
"GoogleNaturalLanguage_ServiceAccount_Description": "Service account key JSON file. More information can be found [here](https://cloud.google.com/natural-language/docs/common/auth#set_up_a_service_account)",
"GoogleTagManager_id": "Google Tag Manager Id",
"Group_mentions_only": "Group mentions only",
"Guest_Pool": "Guest Pool",
"Hash": "Hash",
"Header": "Header",
@ -808,6 +815,12 @@
"Join_default_channels": "Join default channels",
"Join_the_Community": "Join the Community",
"Join_the_given_channel": "Join the given channel",
"Show_the_keyboard_shortcut_list": "Show the keyboard shortcut list",
"Open_channel_user_search": "`%s` - Open Channel / User search",
"Edit_previous_message": "`%s` - Edit previous message",
"Move_beginning_message": "`%s` - Move to the beginning of the message",
"Move_end_message": "`%s` - Move to the end of the message",
"New_line_message_compose_input": "`%s` - New line in message compose input",
"Join_video_call": "Join video call",
"Joined": "Joined",
"Jump": "Jump",
@ -1007,6 +1020,7 @@
"Message_MaxAll": "Maximum channel size for ALL message",
"Message_MaxAllowedSize": "Maximum Allowed Message Size",
"Message_pinning": "Message pinning",
"Message_QuoteChainLimit": "Maximum Number of Chained Quotes",
"Message_removed": "Message removed",
"Message_SetNameToAliasEnabled": "Set a user name to alias in message",
"Message_SetNameToAliasEnabled_Description": "Only if not already set alias. The old messages alias not changed if user has changed the name.",
@ -1156,6 +1170,150 @@
"People": "People",
"Permalink": "Permalink",
"Permissions": "Permissions",
"access-mailer":"Access Mailer Screen",
"access-mailer_description":"Permission to send mass email to all users.",
"access-permissions":"Access Permissions Screen",
"access-permissions_description":"Modify permissions for various roles.",
"add-oauth-service":"Add Oauth Service",
"add-oauth-service_description":"Permission to add a new Oauth service",
"add-user":"Add User",
"add-user_description":"Permission to add new users to the server via users screen",
"add-user-to-any-c-room":"Add User to Any Public Channel",
"add-user-to-any-c-room_description":"Permission to add a user to any public channel",
"add-user-to-any-p-room":"Add User to Any Private Channel",
"add-user-to-any-p-room_description":"Permission to add a user to any private channel",
"add-user-to-joined-room":"Add User to Any Joined Channel",
"add-user-to-joined-room_description":"Permission to add a user to a currently joined channel",
"archive-room":"Archive Room",
"archive-room_description":"Permission to archive a channel",
"assign-admin-role":"Assign Admin Role",
"assign-admin-role_description":"Permission to assign the admin role to other users",
"auto-translate":"Auto Translate",
"auto-translate_description":"Permission to use the auto translate tool",
"ban-user":"Ban User",
"ban-user_description":"Permission to ban a user from a channel",
"bulk-create-c":"Bulk Create Channels",
"bulk-create-c_description":"Permission to create channels in bulk",
"bulk-register-user":"Bulk Create Channels",
"bulk-register-user_description":"Permission to create channels in bulk",
"clean-channel-history":"Clean Channel History",
"clean-channel-history_description":"Permission to Clear the history from channels",
"close-livechat-room":"Close Livechat Room",
"close-livechat-room_description":"Permission to close the current LiveChat channel",
"close-others-livechat-room":"Close Livechat Room",
"close-others-livechat-room_description":"Permission to close other LiveChat channels",
"create-c":"Create Public Channels",
"create-c_description":"Permission to create public channels",
"create-d":"Create Direct Messages",
"create-d_description":"Permission to start direct messages",
"create-p":"Create Private Channels",
"create-p_description":"Permission to create private channels",
"create-user":"Create User",
"create-user_description":"Permission to create users",
"delete-c":"Delete Public Channels",
"delete-c_description":"Permission to delete public channels",
"delete-d":"Delete Direct Messages",
"delete-d_description":"Permission to delete direct messages",
"delete-p":"Delete Private Channels",
"delete-p_description":"Permission to delete private channels",
"delete-message":"Delete Message",
"delete-message_description":"Permission to delete a message within a room",
"delete-user":"Delete User",
"delete-user_description":"Permission to delete users",
"edit-message":"Edit Message",
"edit-message_description":"Permission to edit a message within a room",
"edit-other-user-active-status":"Edit Other User Active Status",
"edit-other-user-active-status_description":"Permission to enable or disable other accounts",
"edit-other-user-info":"Edit Other User Information",
"edit-other-user-info_description":"Permission to change other user’s name, username or email address.",
"edit-other-user-password":"Edit Other User Password",
"edit-other-user-password_description":"Permission to modify other user’s passwords. Requires edit-other-user-info permission.",
"edit-privileged-setting":"Edit privileged Setting",
"edit-privileged-setting_description":"Permission to edit settings",
"edit-room":"Edit Room",
"edit-room_description":"Permission to edit a room’s name, topic, type (private or public status) and status (active or archived)",
"force-delete-message":"Force Delete Message",
"force-delete-message_description":"Permission to delete a message bypassing all restrictions",
"join-without-join-code":"Join Without Join Code",
"join-without-join-code_description":"Permission to bypass the join code in channels with join code enabled",
"mail-messages":"Mail Messages",
"mail-messages_description":"Permission to use the mail messages option",
"manage-assets":"Manage Assets",
"manage-assets_description":"Permission to manage the server assets",
"manage-emoji":"Manage Emoji",
"manage-emoji_description":"Permission to manage the server emojis",
"manage-integrations":"Manage Integrations",
"manage-integrations_description":"Permission to manage the server integrations",
"manage-oauth-apps":"Manage Oauth Apps",
"manage-oauth-apps_description":"Permission to manage the server Oauth apps",
"manage-own-integrations":"Manage Own Integrations",
"manage-own-integrations_description":"Permition to allow users to create and edit their own integration or webhooks",
"manage-sounds":"Manage Sounds",
"manage-sounds_description":"Permission to manage the server sounds",
"mention-all":"Mention All",
"mention-all_description":"Permission to use the @all mention",
"mute-user":"Mute User",
"mute-user_description":"Permission to mute other users in the same channel",
"pin-message":"Pin Message",
"pin-message_description":"Permission to pin a message in a channel",
"post-readonly":"Post ReadOnly",
"post-readonly_description":"Permission to post a message in a read-only channel",
"preview-c-room":"Preview Public Channel",
"preview-c-room_description":"Permission to view the contents of a public channel before joining",
"remove-user":"Remove User",
"remove-user_description":"Permission to remove a user from a room",
"run-import":"Run Import",
"run-import_description":"Permission to run the importers",
"run-migration":"Run Migration",
"run-migration_description":"Permission to run the migrations",
"save-others-livechat-room-info":"Save Others Livechat Room Info",
"save-others-livechat-room-info_description":"Permission to save information from other livechat channels",
"set-moderator":"Set Moderator",
"set-moderator_description":"Permission to set other users as moderator of a channel",
"set-owner":"Set Owner",
"set-owner_description":"Permission to set other users as owner of a channel",
"set-react-when-readonly":"Set React When ReadOnly",
"set-react-when-readonly_description":"Permission to set the ability to react to messages in a read only channel",
"set-readonly":"Set ReadOnly",
"set-readonly_description":"Permission to set a channel to read only channel",
"snippet-message":"Snippet Message",
"snippet-message_description":"Permission to create snippet message",
"unarchive-room":"Unarchive Room",
"unarchive-room_description":"Permission to unarchive channels",
"user-generate-access-token":"User Generate Access Token",
"user-generate-access-token_description":"Permission for users to generate access tokens",
"view-c-room":"View Public Channel",
"view-c-room_description":"Permission to view public channels",
"view-d-room":"View Direct Messages",
"view-d-room_description":"Permission to view direct messages",
"view-full-other-user-info":"View Full Other User Info",
"view-full-other-user-info_description":"Permission to view full profile of other users including account creation date, last login, etc.",
"view-history":"View History",
"view-history_description":"Permission to view the channel history",
"view-join-code":"View Join Code",
"view-join-code_description":"Permission to view the channel join code",
"view-joined-room":"View Joined Room",
"view-joined-room_description":"Permission to view the currently joined channels",
"view-l-room":"View Livechat Rooms",
"view-l-room_description":"Permission to view livechat channels",
"view-livechat-manager":"View Livechat Manager",
"view-livechat-manager_description":"Permission to view other livechat managers",
"view-livechat-rooms":"View Livechat Rooms",
"view-livechat-rooms_description":"Permission to view other livechat channels",
"view-logs":"View Logs",
"view-logs_description":"Permission to view the server logs ",
"view-p-room":"View Private Room",
"view-p-room_description":"Permission to view private channels",
"view-privileged-setting":"View Privileged Setting",
"view-privileged-setting_description":"Permission to view settings",
"view-other-user-channels":"View Other User Channels",
"view-other-user-channels_description":"Permission to view channels owned by other users",
"view-room-administration":"View Room Administration",
"view-room-administration_description":"Permission to view public, private and direct message statistics. Does not include the ability to view conversations or archives",
"view-statistics":"View Statistics",
"view-statistics_description":"Permission o view system statistics such as number of users logged in, number of rooms, operating system information",
"view-user-administration":"View User Administration",
"view-user-administration_description":"Permission to partial, read-only list view of other user accounts currently logged into the system. No user account information is accessible with this permission",
"Pin_Message": "Pin Message",
"Pinned_a_message": "Pinned a message:",
"Pinned_Messages": "Pinned Messages",
@ -1243,6 +1401,7 @@
"Remove_Admin": "Remove Admin",
"Remove_as_moderator": "Remove as moderator",
"Remove_as_owner": "Remove as owner",
"Remove_as_leader": "Remove as leader",
"Remove_custom_oauth": "Remove custom oauth",
"Remove_from_room": "Remove from room",
"Remove_last_admin": "Removing last admin",
@ -1297,6 +1456,7 @@
"Rooms": "Rooms",
"Running_Instances": "Running Instances",
"S_new_messages_since_s": "%s new messages since %s",
"Same_Style_For_Mentions": "Same style for mentions",
"SAML": "SAML",
"SAML_Custom_Cert": "Custom Certificate",
"SAML_Custom_Entry_point": "Custom Entry Point",
@ -1356,6 +1516,7 @@
"Service_account_key": "Service account key",
"Set_as_moderator": "Set as moderator",
"Set_as_owner": "Set as owner",
"Set_as_leader": "Set as leader",
"Settings": "Settings",
"Settings_updated": "Settings updated",
"Share_Location_Title": "Share Location?",
@ -1525,6 +1686,7 @@
"Two-factor_authentication_disabled": "Two-factor authentication disabled",
"Two-factor_authentication_enabled": "Two-factor authentication enabled",
"Two-factor_authentication_is_currently_disabled": "Two-factor authentication is currently disabled",
"Two-factor_authentication_native_mobile_app_warning" : "WARNING: Once you enable this, you will not be able to login on the native mobile apps (Rocket.Chat+) using your password until they implement the 2FA.",
"Thursday": "Thursday",
"Time_in_seconds": "Time in seconds",
"Title": "Title",
@ -1554,6 +1716,7 @@
"Type_your_new_password": "Type your new password",
"UI_DisplayRoles": "Display Roles",
"UI_Merge_Channels_Groups": "Merge private groups with channels",
"UI_Unread_Counter_Style": "Unread counter style",
"UI_Use_Name_Avatar": "Use full name initials to generate default avatar",
"UI_Use_Real_Name": "Use Real Name",
"Unarchive": "Unarchive",
@ -1562,6 +1725,7 @@
"Unmute_user": "Unmute user",
"Unnamed": "Unnamed",
"Unpin_Message": "Unpin Message",
"Unread_Count": "Unread Count",
"Unread_Tray_Icon_Alert": "Unread Tray Icon Alert",
"Unread_Messages": "Unread Messages",
"Unread_Rooms": "Unread Rooms",
@ -1586,11 +1750,14 @@
"Use_User_Preferences_or_Global_Settings": "Use User Preferences or Global Settings",
"User__username__is_now_a_moderator_of__room_name_": "User __username__ is now a moderator of __room_name__",
"User__username__is_now_a_owner_of__room_name_": "User __username__ is now a owner of __room_name__",
"User__username__is_now_a_leader_of__room_name_": "User __username__ is now a leader of __room_name__",
"User__username__removed_from__room_name__moderators": "User __username__ removed from __room_name__ moderators",
"User__username__removed_from__room_name__owners": "User __username__ removed from __room_name__ owners",
"User__username__removed_from__room_name__leaders": "User __username__ removed from __room_name__ leaders",
"User_added": "User added",
"User_added_by": "User <em>__user_added__</em> added by <em>__user_by__</em>.",
"User_added_successfully": "User added successfully",
"User_and_group_mentions_only": "User and group mentions only",
"User_doesnt_exist": "No user exists by the name of `@%s`.",
"User_has_been_activated": "User has been activated",
"User_has_been_deactivated": "User has been deactivated",
@ -1611,6 +1778,7 @@
"User_left_male": "Has left the channel.",
"User_logged_out": "User is logged out",
"User_management": "User Management",
"User_mentions_only": "User mentions only",
"User_muted": "User Muted",
"User_muted_by": "User <em>__user_muted__</em> muted by <em>__user_by__</em>.",
"User_not_found": "User not found",
@ -1622,6 +1790,8 @@
"User_unmuted_by": "User <em>__user_unmuted__</em> unmuted by <em>__user_by__</em>.",
"User_unmuted_in_room": "User unmuted in room",
"User_updated_successfully": "User updated successfully",
"User_uploaded_file": "Uploaded a file",
"User_uploaded_image": "Uploaded an image",
"Username": "Username",
"Username_and_message_must_not_be_empty": "Username and message must not be empty.",
"Username_cant_be_empty": "The username cannot be empty",

@ -6,6 +6,7 @@
"403": "Kielletty",
"500": "Sisäinen palvelinvirhe",
"@username": "@käyttäjä",
"@username_message": "@käyttäjä <message>",
"__username__is_no_longer__role__defined_by__user_by_": "__username__ ei ole enää __role__ (__user_by__)",
"__username__was_set__role__by__user_by_": "__user_by__ muutti käyttäjän __username__ rooliksi __role__ ",
"Accept": "Hyväksy",
@ -211,6 +212,7 @@
"Cancel": "Peruuta",
"Cancel_message_input": "Peruuta",
"Cannot_invite_users_to_direct_rooms": "Et voi kutsua käyttäjiä yksityisviesteihin",
"CAS_Sync_User_Data_FieldMap_Description": "Käytä tätä JSON syötettä rakentaessa sisäiset määritteet (avain) ulkoisista määritteistä (arvo). Ulkoisien määritteiden nimet suljettuna '%' merkkien väliin lisätään arvo teksteihin.<br/>Esimerkiksi, `{\"email\":\"%email%\", \"name\":\"%firstname%, %lastname%\"}`<br/><br/>Määrite kartta on aina lisätty. CAS 1.0:ssa vain `username` määrite on saatavilla. Saatavilla olevat sisäiset määritteet ovat: username, name, email, rooms; rooms on pilkuilla erotettu lista huoneista joihin liittyä käyttäjää lisättäessä, esimerkiksi: {\"rooms\": \"%team%,%department%\"} liittyisi CAS käyttäjät niitä luotaessa heidän tiimi ja osasto kanavalle.",
"CDN_PREFIX": "CDN etuliite",
"Certificates_and_Keys": "Sertifikaatit ja avaimet",
"Changing_email": "Vaihdetaan sähköposti",

@ -11,11 +11,14 @@
"__username__was_set__role__by__user_by_": "__ 사용자에게 __사용자가 __역할을__ 설정하였습니다",
"Accept": "수락",
"Accept_incoming_livechat_requests_even_if_there_are_no_online_agents": "상담원이 온라인 상태가 아닌 경우에도 라이브챗을 수락합니다.",
"Accept_with_no_online_agents": "온라인 에이전트가 없는 것을 허용",
"Access_not_authorized": "엑세스 권한이 없습니다",
"Access_Token_URL": "액세스 토큰 URL",
"Accessing_permissions": "접속권한",
"Account_SID": "계정 SID",
"Accounts": "계정",
"Accounts_AllowAnonymousRead": "익명사용자 읽기 허용",
"Accounts_AllowAnonymousWrite": "익명사용자 쓰기 허용",
"Accounts_AllowDeleteOwnAccount": "사용자가 자신의 계정을 삭제할 수 있습니다",
"Accounts_AllowedDomainsList": "허용된 도메인 목록",
"Accounts_AllowedDomainsList_Description": "허용된 도메인을 쉼표(,)로 구분하기",
@ -31,12 +34,13 @@
"Accounts_BlockedUsernameList": "차단된 사용자 리스트",
"Accounts_BlockedUsernameList_Description": "쉼표로 구문된 차단 사용자 리스트 (대소 문자 구분)",
"Accounts_CustomFields_Description": "필드 설정에 포함된 필드명을 사용한 올바른 JSON 이여야 합니다.\n\n예:<br/><code>{\n\"role\": {\n\"type\": \"select\",\n\"defaultValue\": \"student\",\n\"options\": [\"teacher\", \"student\"],\n\"required\": true,\n\"modifyRecordField\": {\n\"array\": true,\n\"field\": \"roles\"\n}\n},\n\"twitter\": {\n\"type\": \"text\",\n\"required\": true,\n\"minLength\": 2,\n\"maxLength\": 10\n}\n}</code> ",
"Accounts_DefaultUsernamePrefixSuggestion": "사용자 기본 접두어 제안",
"Accounts_denyUnverifiedEmail": "확인되지 않은 이메일 거부",
"Accounts_EmailVerification": "이메일 확인",
"Accounts_EmailVerification_Description": "이 기능을 사용하려면 SMTP설정이 올바르게 되어있는지 확인해주십시오.",
"Accounts_Enrollment_Email": "등록된 이메일",
"Accounts_Enrollment_Email_Default": "<h2> 에 오신 것을 환영합니다 <h1> [Site_Name] </h1></h2><p> [Site_URL]로 이동하여 오늘날 최고의 오픈 소스 채팅 솔루션을보십시오! </p>",
"Accounts_Enrollment_Email_Description": "당신은 각각 사용자의 전체 이름, 이름 또는 성을 위해 [lname], [name], [fname]을 사용할 수 있습니다. <br /> 당신은 사용자의 이메일을 [email]을 사용할 수 있습니다.",
"Accounts_Enrollment_Email_Description": "다음의 기호를 사용할 수 있습니다:<br/> <ul><li>[lname] - 성, [name] - 이름, [fname] - 전체이름(성+이름)</li><li>[email] - 이메일</li><li>[Site_Name] - 응용프로그램의 이름, [Site_URL] - URL</li></ul>",
"Accounts_Enrollment_Email_Subject_Default": "[Site_Name] 에 오신 것을 환영합니다 ",
"Accounts_ForgetUserSessionOnWindowClose": "창을 닫을때 사용자 세션을 삭제합니다",
"Accounts_Iframe_api_method": "API 메소드",
@ -57,7 +61,7 @@
"Accounts_OAuth_Custom_Scope": "범위",
"Accounts_OAuth_Custom_Secret": "비밀",
"Accounts_OAuth_Custom_Token_Path": "Token 경로",
"Accounts_OAuth_Custom_Token_Sent_Via": "토큰 보낸 비아",
"Accounts_OAuth_Custom_Token_Sent_Via": "보내진 토큰",
"Accounts_OAuth_Custom_Username_Field": "사용자 이름 필드",
"Accounts_OAuth_Drupal": "듀팔 로그인 이 활성화 되었습니다.",
"Accounts_OAuth_Drupal_callback_url": "듀팔 oAuth2 리다이렉트 URI",
@ -67,42 +71,43 @@
"Accounts_OAuth_Facebook_callback_url": "페이스 북 콜백 URL",
"Accounts_OAuth_Facebook_id": "Facebook 앱 ID",
"Accounts_OAuth_Facebook_secret": "Facebook 암호",
"Accounts_OAuth_Github": "Github 로그인",
"Accounts_OAuth_Github": "OAuth 활성화",
"Accounts_OAuth_Github_callback_url": "GitHub의 콜백 URL",
"Accounts_OAuth_GitHub_Enterprise": "OAuth 활성화",
"Accounts_OAuth_GitHub_Enterprise_callback_url": "GitHub의 기업 콜백 URL",
"Accounts_OAuth_GitHub_Enterprise_id": "Client ID",
"Accounts_OAuth_GitHub_Enterprise_callback_url": "GitHub Enterprise 의 콜백 URL",
"Accounts_OAuth_GitHub_Enterprise_id": "Client 아이디",
"Accounts_OAuth_GitHub_Enterprise_secret": "Client 암호",
"Accounts_OAuth_Github_id": "Github ID",
"Accounts_OAuth_Github_id": "Github 아이디",
"Accounts_OAuth_Github_secret": "Github 암호",
"Accounts_OAuth_Gitlab": "OAuth 활성화",
"Accounts_OAuth_Gitlab_callback_url": "GitLab 콜백 URL",
"Accounts_OAuth_Gitlab_id": "GitLab ID",
"Accounts_OAuth_Gitlab_id": "GitLab 아이디",
"Accounts_OAuth_Gitlab_secret": "Client 암호",
"Accounts_OAuth_Google": "구글 로그인",
"Accounts_OAuth_Google_callback_url": "구글 콜백 URL",
"Accounts_OAuth_Google_id": "구글 ID",
"Accounts_OAuth_Google_id": "구글 아이디",
"Accounts_OAuth_Google_secret": "구글 암호",
"Accounts_OAuth_Linkedin": "LinkedIn 로그인",
"Accounts_OAuth_Linkedin": "링크드 인 로그인",
"Accounts_OAuth_Linkedin_callback_url": "링크드 인 콜백 URL",
"Accounts_OAuth_Linkedin_id": "LinkedIn ID",
"Accounts_OAuth_Linkedin_secret": "LinkedIn 암호",
"Accounts_OAuth_Linkedin_id": "링크드 인 아이디",
"Accounts_OAuth_Linkedin_secret": "링크드 인 암호",
"Accounts_OAuth_Meteor": "Meteor 로그인",
"Accounts_OAuth_Meteor_callback_url": "유성 콜백 URL",
"Accounts_OAuth_Meteor_callback_url": "Meteor 콜백 URL",
"Accounts_OAuth_Meteor_id": "Meteor ID",
"Accounts_OAuth_Meteor_secret": "Meteor 암호",
"Accounts_OAuth_Twitter": "트위터 로그인",
"Accounts_OAuth_Twitter_callback_url": "트위터 콜백 URL",
"Accounts_OAuth_Twitter_id": "트위터 ID",
"Accounts_OAuth_Twitter_id": "트위터 아이디",
"Accounts_OAuth_Twitter_secret": "트위터 암호",
"Accounts_OAuth_Wordpress": "WordPress 로그인",
"Accounts_OAuth_Wordpress": "워드 프레스 로그인",
"Accounts_OAuth_Wordpress_callback_url": "워드 프레스 콜백 URL",
"Accounts_OAuth_Wordpress_id": "WordPress ID",
"Accounts_OAuth_Wordpress_secret": "WordPress 암호",
"Accounts_OAuth_Wordpress_id": "워드 프레스 아이디",
"Accounts_OAuth_Wordpress_secret": "워드 프레스 암호",
"Accounts_PasswordReset": "암호 재설정",
"Accounts_OAuth_Proxy_host": "프록시 서버",
"Accounts_OAuth_Proxy_host": "프록시 호스트",
"Accounts_OAuth_Proxy_services": "프록시 서비스",
"Accounts_Registration_AuthenticationServices_Default_Roles": "인증서비스용 기본 역할",
"Accounts_Registration_AuthenticationServices_Default_Roles_Description": "인증 서비스를 통해서 등록된 사용자는 기본 역할이 주어지게 됩니다.",
"Accounts_Registration_AuthenticationServices_Enabled": "인증 서비스에 등록",
"Accounts_RegistrationForm": "등록 양식",
"Accounts_RegistrationForm_Disabled": "비활성화",
@ -110,14 +115,16 @@
"Accounts_RegistrationForm_Public": "공개",
"Accounts_RegistrationForm_Secret_URL": "비밀 URL",
"Accounts_RegistrationForm_SecretURL": "등록 양식 비밀 URL",
"Accounts_RegistrationForm_SecretURL_Description": "당신은 당신의 등록 URL에 추가됩니다 임의의 문자열을 제공해야합니다. 예 : https://demo.rocket.chat/register/[secret_hash]",
"Accounts_RequireNameForSignUp": "회원 가입은 이름 필요",
"Accounts_RegistrationForm_SecretURL_Description": "등록 URL에 추가될 임의의 문자열을 제공해야 합니다. 예 : https://demo.rocket.chat/register/[secret_hash]",
"Accounts_RequireNameForSignUp": "회원 가입을 위한 이름이 필요합니다.",
"Accounts_RequirePasswordConfirmation": "비밀번호 확인이 필요합니다.",
"Accounts_SetDefaultAvatar": "기본 아바타 설정",
"Accounts_SetDefaultAvatar_Description": "OAuth 계정이나 Gravatar 를 바탕으로 기본 아바타 설정을 시도합니다.",
"Accounts_ShowFormLogin": "폼방식 로그인 보기",
"Accounts_UseDefaultBlockedDomainsList": "기본 차단 도메인리스트 사용",
"Accounts_UseDNSDomainCheck": "DNS 도메인 확인 사용",
"Accounts_UserAddedEmail_Default": "<h2> 에 오신 것을 환영합니다 <h1> [Site_Name] </h1></h2><p> [Site_URL]로 이동하여 오늘날 최고의 오픈 소스 채팅 솔루션을보십시오! </p><p> [email]과 비밀번호 : [password] 당신은 당신의 이메일을 사용하여 로그인 할 수 있습니다. 당신은 처음 로그인 후 변경해야 할 수 있습니다.",
"Accounts_UserAddedEmail_Description": "다음과 같은 자리를 사용할 수 있습니다 : <br /><ul><li> 각각 사용자의 전체 이름, 이름 또는 성을위한 [name], [fname], [lname]. </li><li> 사용자의 이메일 [email]. </li><li> 사용자의 비밀번호 [password]. </li><li> [Site_Name]와 [Site_URL] 각각 응용 프로그램 이름 및 URL합니다. </li></ul>",
"Accounts_UserAddedEmail_Default": "<h2><h1> [Site_Name] </h1>에 오신 것을 환영합니다</h2>\n<p> [Site_URL]로 이동하여 오늘날 최고의 오픈 소스 채팅 솔루션을 경험 해 보십시오! </p>\n<p> 이메일:[email] 과 비밀번호 : [password] 로 로그인 할 수 있습니다. 로그인 후에는 변경하셔야 합니다.",
"Accounts_UserAddedEmail_Description": "다음의 기호를 사용할 수 있습니다:<br/><ul><li>[lname] - 성, [name] - 이름, [fname] - 전체이름(성+이름) </li><li>[email] - 사용자 이메일</li><li>[password] - 사용자 암호</li><li>[Site_Name] - 응용프로그램의 이름, [Site_URL] - URL</li></ul>",
"Accounts_UserAddedEmailSubject_Default": "당신이은 [Site_Name] 에 추가되었습니다",
"Activate": "활성화",
"Activity": "활동",
@ -141,6 +148,7 @@
"Agent_removed": "상담사가 삭제되었습니다",
"Alias": "별명",
"Alias_Format": "별명 형식",
"Alias_Format_Description": "앨리어스를 가지고 Slack 으로부터 메시지를 임포트 합니다.; %s 는 사용자의 username으로 대치됩니다, 비어있으면 앨리어스를 사용하지 않습니다.",
"Alias_Set": "별칭 설정",
"All": "모든",
"All_channels": "모든 채널",
@ -149,34 +157,49 @@
"Allow_Invalid_SelfSigned_Certs": "잘못된 자체서명 Certs 를 허용합니다",
"Allow_Invalid_SelfSigned_Certs_Description": "링크확인 과 프리뷰에 잘못된 자체서명 Certs 를 허용합니다.",
"Allow_switching_departments": "방문자가 부서를 변경할 수 있도록 허용합니다",
"Always_open_in_new_window": "항상 새창에서 열기",
"Analytics_features_enabled": "기능이 활성화 되었습니다",
"Analytics_features_messages_Description": "사용자 메시지에 대해 수행 행동과 관련된 사용자 정의 이벤트를 추적합니다.",
"Analytics_features_rooms_Description": "채널 또는 그룹 (삭제두고 작성)에 대한 작업에 관련된 사용자 정의 이벤트를 추적합니다.",
"Analytics_features_messages_Description": "사용자 메시지에 대해 수행 행동과 관련된 사용자 정의 이벤트를 추적합니다.",
"Analytics_features_rooms_Description": "채널 또는 그룹에 대한 작업에 관련된 사용자 정의 이벤트를 추적합니다. (생성, 채널나감, 삭제)",
"Analytics_features_users_Description": "사용자 (암호 재설정 시간, 프로필 사진 변경 등)에 관련 작업에 관련된 사용자 정의 이벤트를 추적합니다.",
"Analytics_Google": "구글 애널리틱스",
"Analytics_Google_id": "Tracking ID",
"and": "그리고",
"And_more": "그리고 __length __",
"And_more": "그리고 __length __만큼 더",
"Animals_and_Nature": "동물과 자연",
"Announcement": "공지",
"API": "API",
"API_Allow_Infinite_Count": "모든것 허용",
"API_Allow_Infinite_Count_Description": "REST API 호출이 모든 내용을 하나의 호출에 리턴 할 수 있도록 할까요?",
"API_Analytics": "분석",
"API_Analytics": "분석(에널리틱스)",
"API_CORS_Origin": "CORS Origin",
"API_Default_Count": "기본 카운트",
"API_Default_Count_Description": "아무것도 지정하지 않았을 때의 REST API 결과에 대한 기본 개수",
"API_Drupal_URL": "Drupal 서버 URL",
"API_Drupal_URL_Description": "예: https://domain.com (마지막의 슬레시 제외)",
"API_Embed": "포함",
"API_EmbedDisabledFor": "사용자에대한 Embed 비활성화",
"API_Embed": "링크 프리뷰 포함",
"API_Embed_Description": "사용자가 웹사이트에 대한 링크를 post 했을때에 그 링크 미리보기 기능의 포함 여부",
"API_EmbedCacheExpirationDays": "캐시 만료 날짜 Embed",
"API_EmbedDisabledFor": "사용자에 대한 Embed 비활성화",
"API_EmbedDisabledFor_Description": "쉼표로 구분된 사용자 이름 목록",
"API_EmbedIgnoredHosts": "포함 무시 호스트",
"API_EmbedIgnoredHosts_Description": "예를 들어, 호스트 또는 CIDR 주소의 목록을 쉼표로 구분. 로컬 호스트, 127.0.0.1, 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16",
"API_EmbedIgnoredHosts": "무시되어진 호스트 Embed",
"API_EmbedIgnoredHosts_Description": "쉼표로 구분된 호스트 또는 CIDR 주소의 목록. 예. localhost, 127.0.0.1, 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16",
"API_EmbedSafePorts": "안전 포트",
"API_EmbedSafePorts_Description": "미리보기 허용 포트 목록을 쉼표로 구분.",
"API_EmbedSafePorts_Description": "쉼표로 구분된 미리보기를 위한 허용 포트 목록.",
"API_Enable_CORS": "CORS 활성화",
"API_Enable_Direct_Message_History_EndPoint": "Direct Message History Endpoint 활성화",
"API_Enable_Direct_Message_History_EndPoint_Description": "소속되지 않은 다른 유저로 부터 보내진 다이렉트메시지를 보기를 허용하는 'api/v1/im.history.others' 를 활성화 합니다.",
"API_Enable_Shields": "쉴드 활성화",
"API_Enable_Shields_Description": "'/api/v1/shields.svg' 에 있는 쉴드를 활성화",
"API_GitHub_Enterprise_URL": "Server URL",
"API_GitHub_Enterprise_URL_Description": "예: http://domain.com (마지막 슬래시 제외)",
"API_Gitlab_URL": "GitLab URL",
"API_Shield_Types": "쉴드 타입",
"API_Shield_Types_Description": "쉴드의 종류",
"API_Token": "API 토큰",
"API_Upper_Count_Limit": "최대 레코드 수",
"API_User_Limit": "채널에 모든 사용자를 추가하는 사용자 제한",
"API_Wordpress_URL": "WordPress URL",
"API_Wordpress_URL": "워드프레스 URL",
"Apiai_Key": "Api.ai 키",
"Apiai_Language": "Api.ai 언어",
"Appearance": "외관",
@ -187,7 +210,7 @@
"Archive": "아카이브",
"are_also_typing": "또한 입력중",
"are_typing": "입력 중",
"Are_you_sure": "괜찮아요?",
"Are_you_sure": "확실 합니까?",
"Are_you_sure_you_want_to_delete_your_account": "당신은 당신의 계정을 삭제 하시겠습니까?",
"at": "...에서",
"Auth_Token": "인증 토큰",
@ -221,15 +244,21 @@
"away_male": "자리비움",
"Away_male": "자리비움",
"Back": "뒤로",
"Back_to_applications": "다시 응용 프로그램",
"Back_to_integrations": "위로 통합에",
"Back_to_applications": "응용 프로그램으로 돌아가기",
"Back_to_integrations": "Integrations 로 돌아가기",
"Back_to_integration_detail": "Integration detail 로 돌아가기",
"Back_to_login": "로그인으로 돌아가기",
"Back_to_permissions": "돌아 가기 권한",
"Back_to_permissions": "권한 으로 돌아가기",
"Backup_codes": "백업 코드",
"Beta_feature_Depends_on_Video_Conference_to_be_enabled": "베타 기능. 활성화 될 비디오컨퍼런스 에 의존 함.",
"Block_User": "사용자 차단",
"Body": "신체",
"Body": "본문",
"bold": "굵게",
"bot_request": "봇(bot) 요청",
"BotHelpers_userFields": "사용자 필드",
"BotHelpers_userFields_Description": "bots helper methods 가 접근할 수 있는 사용자 필드에 대한 CSV.",
"Branch": "분기",
"Broadcast_Connected_Instances": "연결된 인스턴스 제공(broadcast)",
"Bugsnag_api_key": "Bugsnag API 키",
"busy": "바쁨",
"Busy": "바쁨",
@ -238,14 +267,25 @@
"busy_male": "바쁨",
"Busy_male": "바쁨",
"by": "으로",
"Content": "내용",
"cache_cleared": "캐시가 삭제됨",
"Cancel": "취소",
"Cancel_message_input": "취소",
"Cannot_invite_users_to_direct_rooms": "객실을 지시하는 사용자를 초대 할 수 없습니다",
"Cannot_invite_users_to_direct_rooms": "direct room 으로 사용자를 초대할 수 없습니다.",
"CAS_autoclose": "로그인 팝업을 자동으로 닫음",
"CAS_base_url": "SSO Base URL",
"CAS_base_url_Description": "외부 SSO 서비스에 대한 base URL. 예: https://sso.example.undef/sso/",
"CAS_button_color": "로그인 버튼 배경 색상",
"CAS_button_label_color": "로그인 버튼 텍스트 색상",
"CAS_button_label_text": "로그인 버튼 레이블",
"CAS_enabled": "활성화 됨",
"CAS_Login_Layout": "CAS 로그인 Layout",
"CAS_login_url": "SSO 로그인 URL",
"CAS_login_url_Description": "외부 SSO 서비스에 대한 로그인 URL. 예: https://sso.example.undef/sso/login",
"CAS_popup_height": "로그인 팝업 높이",
"CAS_popup_width": "로그인 팝업 넓이",
"CAS_Sync_User_Data_Enabled": "항상 사용자 데이터 동기화",
"CAS_Sync_User_Data_Enabled_Description": "로그인 시 마다 외부 CAS 사용자 데이터 중 가능한 속성에 대해 항상 동기화. 주: 속성은 계정생성이 될때 마다 항상 동기화 됩니다.",
"CDN_PREFIX": "CDN Prefix",
"Certificates_and_Keys": "인증서와 키",
"Changing_email": "변경 이메일",
@ -282,28 +322,55 @@
"Compact": "콤팩트",
"Confirm_password": "암호를 확인하세요",
"Conversation": "대화",
"Conversation_closed": "대화 폐쇄 : __comment__합니다.",
"Conversation_closed": "대화 종료 : __comment__.",
"Convert_Ascii_Emojis": "이모지를 ASCII로 변환",
"Copied": "복사",
"Copy": "",
"Copied": "복사",
"Copy": "복사",
"Copy_to_clipboard": "클립 보드에 복사",
"COPY_TO_CLIPBOARD": "클립 보드에 복사",
"Count": "카운트",
"Cozy": "편안한",
"Create": "몹시 떠들어 대다",
"Create": "생성",
"Create_A_New_Channel": "새 채널 만들기",
"Create_new": "새로 만들기",
"Created_at": "제작",
"Created_at": "만든",
"Created_at_s_by_s": "<strong> %s에</strong> 의해 <strong> %s로</strong> 만든",
"Created_at_s_by_s_triggered_by_s": "<strong>%s</strong> 에 트리거 된 <strong>%s</strong> 에 의해 <strong> %s </strong> 에 생성됨",
"CROWD_Reject_Unauthorized": "인증되지않은 것 거부",
"CRM_Integration": "CRM Integration",
"Current_Chats": "현재 채팅",
"Custom": "관습",
"Current_Status": "현재 상태",
"Custom": "맞춤",
"Custom_Emoji": "사용자 정의 이모지",
"Custom_Emoji_Add": "새 이모지 추가",
"Custom_Emoji_Added_Successfully": "사용자 정의 이모자가 추가 되었습니다.",
"Custom_Emoji_Delete_Warning": "이모지 삭제는 복구 할 수 없습니다",
"Custom_Emoji_Error_Invalid_Emoji": "유효하지 않은 이모지",
"Custom_Emoji_Error_Name_Or_Alias_Already_In_Use": "사용자 정의 이모지나 그 앨리어스가 이미 사용 중입니다.",
"Custom_Emoji_Has_Been_Deleted": "사용자 정의 이모지가 삭제 되었습니다.",
"Custom_Emoji_Info": "사용자 정의 이모지 정보",
"Custom_Emoji_Updated_Successfully": "사용자 정의 이모지가 성공적으로 업데이트 되었습니다",
"Custom_Fields": "사용자 정의 필드",
"Custom_oauth_helper": "OAuth Provider를 설정할때, 콜백 URL을 알려줘야합니다. <pre>%s</pre>를 사용.",
"Custom_oauth_unique_name": "사용자 정의 OAuth 고유한 이름",
"Custom_Script_Logged_In": "사용자 정의 스크립트 로그인 한 사용자를 위해",
"Custom_Script_Logged_Out": "사용자 정의 스크립트 로그 아웃 사용자를위한",
"Dashboard": "계기반",
"Custom_oauth_unique_name": "사용자 정의 OAuth 고유 이름",
"Custom_Scripts": "사용자 정의 스크립트",
"Custom_Script_Logged_In": "로그인 한 사용자를 위한 사용자 정의 스크립트 ",
"Custom_Script_Logged_Out": "로그 아웃 사용자를 위한 사용자 정의 스크립트 ",
"Custom_Sounds": "사용자 정의 사운드",
"Custom_Sound_Add": "사용자 정의 사운드 추가",
"Custom_Sound_Delete_Warning": "사운드 삭제는 복구 할 수 없습니다.",
"Custom_Sound_Error_Invalid_Sound": "잘못된 사운드",
"Custom_Sound_Error_Name_Already_In_Use": "사용자 정의 사운드 이름이 이미 사용중입니다.",
"Custom_Sound_Has_Been_Deleted": "사용자 정의 사운드가 삭제되었습니다.",
"Custom_Sound_Info": "사용자 정의 사운드 정보",
"Custom_Sound_Saved_Successfully": "사용자 정의 사운드가 성공적으로 저장 되었습니다",
"Custom_Translations": "사용자 정의 번역(해석)",
"Custom_Translations_Description": " Key는 Key와 번역의 딕셔너리가 포함된 언어 인 유효한 JSON 이어야 합니다. 예:<br/><code>{\n\"en\": {\n\"Channels\": \"Rooms\"\n},\n\"pt\": {\n\"Channels\": \"Salas\"\n}\n}</code>",
"CustomSoundsFilesystem": "사용자 정의 사운드 파일시스템",
"Dashboard": "대시보드",
"Date": "날짜",
"Date_From": "발신",
"Date_to": "수신",
"days": "일",
"DB_Migration": "데이터베이스 마이그레이션",
"DB_Migration_Date": "데이터베이스 마이그레이션 날짜",
@ -375,14 +442,14 @@
"Error": "오류",
"error-action-not-allowed": "__action__ 허용되지 않습니다",
"error-application-not-found": "응용 프로그램을 찾을 수 없습니다",
"error-archived-duplicate-name": "이름이 '__room_name__'에 보관 된 채널이있다",
"error-archived-duplicate-name": "보관된 '__room_name__' 채널이 있습니다.",
"error-avatar-invalid-url": "잘못된 아바타 URL : __url__",
"error-avatar-url-handling": "오류 __ 사용자 이름 __에 대한 URL (__url__)에서 아바타 설정을 처리하는 동안",
"error-cant-invite-for-direct-room": "직접 객실에 대한 사용자를 초대 할 수 없습니다",
"error-avatar-url-handling": " __ username__에 대한 URL (__url__)에서 아바타 설정을 처리하는 동안 오류발생",
"error-cant-invite-for-direct-room": "direct room 으로 사용자를 초대할 수 없습니다.",
"error-could-not-change-email": "이메일을 변경할 수 없습니다",
"error-could-not-change-name": "이름을 변경할 수 없습니다",
"error-could-not-change-username": "사용자 이름을 변경할 수 없습니다",
"error-delete-protected-role": "보호 역할을 삭제할 수 없습니다",
"error-delete-protected-role": "보호 역할을 삭제할 수 없습니다",
"error-department-not-found": "부서를 찾을 수 없습니다",
"error-duplicate-channel-name": "'%s' 채널 이름은 이미 존재합니다.",
"error-email-domain-blacklisted": "이메일 도메인이 블랙리스트",
@ -430,7 +497,7 @@
"error-not-allowed": "허용되지 않음",
"error-not-authorized": "권한이 없습니다",
"error-push-disabled": "푸시을 사용할 수 없습니다",
"error-remove-last-owner": "마지막 소유자입니다. 이 중 하나를 제거하기 전에 새 소유자를 설정하십시오.",
"error-remove-last-owner": "마지막 소유자입니다. 제거하기 전에 새 소유자를 설정하십시오.",
"error-role-in-use": "그것이 사용 때문에 역할을 삭제할 수 없습니다",
"error-role-name-required": "역할 이름이 필요합니다",
"error-the-field-is-required": "필드 __field__이 필요합니다.",
@ -578,7 +645,7 @@
"Join_video_call": "화상 통화에 참여",
"Joined": "가입",
"Jump": "도약",
"Jump_to_first_unread": "첫 번째 읽지로 이동",
"Jump_to_first_unread": "읽지않은 첫 메시지로 이동",
"Jump_to_message": "메시지로 이동",
"Jump_to_recent_messages": "최근 메시지에 점프",
"Katex_Dollar_Syntax": "허용 달러 구문",

@ -202,7 +202,7 @@
"away_female": "ausente",
"Away_female": "Ausente",
"away_male": "ausente",
"Away_male": "ausente",
"Away_male": "Ausente",
"Back": "Voltar",
"Back_to_applications": "Voltar para aplicações",
"Back_to_integrations": "Voltar para integrações",
@ -1309,4 +1309,4 @@
"your_message_optional": "sua mensagem (opcional)",
"Your_password_is_wrong": "Sua senha está errada!",
"Your_push_was_sent_to_s_devices": "Sua natificação foi enviada para %s dispositivos"
}
}

@ -221,7 +221,7 @@
"away_female": "ausente",
"Away_female": "Ausente",
"away_male": "ausente",
"Away_male": "ausente",
"Away_male": "Ausente",
"Back": "Voltar",
"Back_to_applications": "Voltar para aplicações",
"Back_to_integrations": "Voltar para integrações",
@ -631,6 +631,12 @@
"Join_default_channels": "Entrar em canais predefinidos",
"Join_the_Community": "Junte-se à Comunidade",
"Join_the_given_channel": "Entrar no canal informado",
"Show_the_keyboard_shortcut_list": "Exibe a lisgta de atalhos do teclado",
"Open_channel_user_search": "`%s` - Abrir Canal / Busca de Usuário",
"Edit_previous_message": "`%s` - Editar mensagem anterior",
"Move_beginning_message": "`%s` - Ir para o início da mensagem",
"Move_end_message": "`%s` - Ir para o fim da mensagem",
"New_line_message_compose_input": "`%s` - Adicionar nova linha a mensagem",
"Join_video_call": "Entrar na chamada de vídeo",
"Joined": "Entrou",
"Jump": "Saltar",
@ -1347,4 +1353,4 @@
"your_message_optional": "sua mensagem (opcional)",
"Your_password_is_wrong": "Sua senha está errada!",
"Your_push_was_sent_to_s_devices": "Sua natificação foi enviada para %s dispositivos"
}
}

@ -1072,8 +1072,8 @@
"This_email_has_already_been_used_and_has_not_been_verified__Please_change_your_password": "Такой email уже использовался и не был подтверждён. Измените ваш пароль.",
"This_is_a_desktop_notification": "Это уведомление рабочего стола",
"This_is_a_push_test_messsage": "Это тестовое push-уведомление",
"This_room_has_been_archived_by__username_": "Этот номер был архивируются __username__",
"This_room_has_been_unarchived_by__username_": "Этот номер был разархивирована по __username__",
"This_room_has_been_archived_by__username_": "__username__ отправил этот чат в архив",
"This_room_has_been_unarchived_by__username_": "__username__ вернул этот чат из архива",
"Time_in_seconds": "Время в секундах",
"Title": "Заголовок",
"Title_bar_color": "Цвет строки заголовка",
@ -1192,7 +1192,7 @@
"WebRTC_Enable_Direct": "Включить для личных сообщений",
"WebRTC_Enable_Private": "Включить для приватных чатов",
"WebRTC_Servers": "Серверы STUN/TURN",
"WebRTC_Servers_Description": "Список STUN/TURN серверов разделен запятой.<br/>Имя пользователя, пароль и порт разрешены в формате `username:password@stun:host:port` или `username:password@turn:host:port`.",
"WebRTC_Servers_Description": "Список STUN/TURN серверов разделен запятой.<br/>Имя пользователя, пароль и порт разрешены в формате `username:password@stun:host:port` или `username:password@turn:host:port`.",
"Welcome": "Добро пожаловать, <em>%s</em>.",
"Welcome_to_the": "Добро пожаловать в",
"Why_do_you_want_to_report_question_mark": "Почему вы хотите сообщить?",
@ -1231,7 +1231,7 @@
"Your_email_has_been_queued_for_sending": "Ваш email был поставлен в очередь на отправку",
"Your_entry_has_been_deleted": "Ваша запись была удалена.",
"Your_file_has_been_deleted": "Ваш файл был удалён.",
"Your_mail_was_sent_to_s": "Ваше сообщение было отправлено на %s",
"Your_mail_was_sent_to_s": "Ваше сообщение было отправлено на %s",
"Your_password_is_wrong": "Неверный пароль!",
"Your_push_was_sent_to_s_devices": "Ваше push-уведомление было отправлено на % устройств."
}

@ -0,0 +1,3 @@
{
"#channel": "kênh "
}

@ -250,7 +250,9 @@ Importer.Slack = class extends Importer.Base {
RocketChat.models.Messages.createUserJoinWithRoomIdAndUser(room._id, this.getRocketUser(message.user), msgDataDefaults);
}
} else if (message.subtype === 'channel_leave') {
if (this.getRocketUser(message.user)) { RocketChat.models.Messages.createUserLeaveWithRoomIdAndUser(room._id, this.getRocketUser(message.user), msgDataDefaults); }
if (this.getRocketUser(message.user)) {
RocketChat.models.Messages.createUserLeaveWithRoomIdAndUser(room._id, this.getRocketUser(message.user), msgDataDefaults);
}
} else if (message.subtype === 'me_message') {
const msgObj = {
...msgDataDefaults,
@ -288,15 +290,15 @@ Importer.Slack = class extends Importer.Base {
if (this.getRocketUser(message.user)) {
RocketChat.models.Messages.createRoomSettingsChangedWithTypeRoomIdMessageAndUser('room_changed_description', room._id, message.purpose, this.getRocketUser(message.user), msgDataDefaults);
}
} else if (message.subtype === 'channel_topic') {
} else if (message.subtype === 'channel_topic') {
if (this.getRocketUser(message.user)) {
RocketChat.models.Messages.createRoomSettingsChangedWithTypeRoomIdMessageAndUser('room_changed_topic', room._id, message.topic, this.getRocketUser(message.user), msgDataDefaults);
}
} else if (message.subtype === 'channel_name') {
} else if (message.subtype === 'channel_name') {
if (this.getRocketUser(message.user)) {
RocketChat.models.Messages.createRoomRenamedWithRoomIdRoomNameAndUser(room._id, message.name, this.getRocketUser(message.user), msgDataDefaults);
}
} else if (message.subtype === 'pinned_item') {
} else if (message.subtype === 'pinned_item') {
if (message.attachments) {
const msgObj = {
...msgDataDefaults,
@ -323,7 +325,7 @@ Importer.Slack = class extends Importer.Base {
};
this.uploadFile(details, message.file.url_private_download, this.getRocketUser(message.user), room, new Date(parseInt(message.ts.split('.')[0]) * 1000));
}
} else if (!missedTypes[message.subtype] && !ignoreTypes[message.subtype]) {
} else if (!missedTypes[message.subtype] && !ignoreTypes[message.subtype]) {
missedTypes[message.subtype] = message;
}
} else {

@ -12,6 +12,11 @@
// getProgress: =>
// #return the progress report, tbd what is expected
// @version 1.0.0
import http from 'http';
import https from 'https';
import AdmZip from 'adm-zip';
import getFileType from 'file-type';
Importer.Base = class Base {
static getBSONSize(object) {
// The max BSON object size we can store in MongoDB is 16777216 bytes
@ -41,11 +46,12 @@ Importer.Base = class Base {
// @param [String] mimeType the of the expected file type
//
constructor(name, description, mimeType) {
this.MaxBSONSize = 8000000;
this.http = Npm.require('http');
this.https = Npm.require('https');
this.http = http;
this.https = https;
this.AdmZip = AdmZip;
this.getFileType = getFileType;
this.MaxBSONSize = 8000000;
this.prepare = this.prepare.bind(this);
this.startImport = this.startImport.bind(this);
this.getSelection = this.getSelection.bind(this);
@ -61,8 +67,6 @@ Importer.Base = class Base {
this.logger = new Logger(`${ this.name } Importer`, {});
this.progress = new Importer.Progress(this.name);
this.collection = Importer.RawImports;
this.AdmZip = Npm.require('adm-zip');
this.getFileType = Npm.require('file-type');
const importId = Importer.Imports.insert({ 'type': this.name, 'ts': Date.now(), 'status': this.progress.step, 'valid': true, 'user': Meteor.user()._id });
this.importRecord = Importer.Imports.findOne(importId);
this.users = {};
@ -187,58 +191,63 @@ Importer.Base = class Base {
//
uploadFile(details, fileUrl, user, room, timeStamp) {
this.logger.debug(`Uploading the file ${ details.name } from ${ fileUrl }.`);
const requestModule = /https/i.test(fileUrl) ? Importer.Base.https : Importer.Base.http;
return requestModule.get(fileUrl, Meteor.bindEnvironment(function(stream) {
const fileStore = FileUpload.getStore('Uploads');
fileStore.insert(details, stream, function(err, file) {
if (err) {
throw new Error(err);
} else {
const url = file.url.replace(Meteor.absoluteUrl(), '/');
const attachment = {
title: file.name,
title_link: url
};
if (/^image\/.+/.test(file.type)) {
attachment.image_url = url;
attachment.image_type = file.type;
attachment.image_size = file.size;
attachment.image_dimensions = file.identify != null ? file.identify.size : undefined;
}
if (/^audio\/.+/.test(file.type)) {
attachment.audio_url = url;
attachment.audio_type = file.type;
attachment.audio_size = file.size;
const requestModule = /https/i.test(fileUrl) ? this.https : this.http;
const fileStore = FileUpload.getStore('Uploads');
return requestModule.get(fileUrl, Meteor.bindEnvironment(function(res) {
const rawData = [];
res.on('data', chunk => rawData.push(chunk));
res.on('end', Meteor.bindEnvironment(() => {
fileStore.insert(details, Buffer.concat(rawData), function(err, file) {
if (err) {
throw new Error(err);
} else {
const url = file.url.replace(Meteor.absoluteUrl(), '/');
const attachment = {
title: file.name,
title_link: url
};
if (/^image\/.+/.test(file.type)) {
attachment.image_url = url;
attachment.image_type = file.type;
attachment.image_size = file.size;
attachment.image_dimensions = file.identify != null ? file.identify.size : undefined;
}
if (/^audio\/.+/.test(file.type)) {
attachment.audio_url = url;
attachment.audio_type = file.type;
attachment.audio_size = file.size;
}
if (/^video\/.+/.test(file.type)) {
attachment.video_url = url;
attachment.video_type = file.type;
attachment.video_size = file.size;
}
const msg = {
rid: details.rid,
ts: timeStamp,
msg: '',
file: {
_id: file._id
},
groupable: false,
attachments: [attachment]
};
if ((details.message_id != null) && (typeof details.message_id === 'string')) {
msg['_id'] = details.message_id;
}
return RocketChat.sendMessage(user, msg, room, true);
}
if (/^video\/.+/.test(file.type)) {
attachment.video_url = url;
attachment.video_type = file.type;
attachment.video_size = file.size;
}
const msg = {
rid: details.rid,
ts: timeStamp,
msg: '',
file: {
_id: file._id
},
groupable: false,
attachments: [attachment]
};
if ((details.message_id != null) && (typeof details.message_id === 'string')) {
msg['_id'] = details.message_id;
}
return RocketChat.sendMessage(user, msg, room, true);
}
});
});
}));
}));
}
};

@ -29,7 +29,7 @@ Template.integrationsOutgoing.onCreated(function _integrationsOutgoingOnCreated(
scriptEnabled: $('[name=scriptEnabled]:checked').val().trim() === '1',
script: $('[name=script]').val().trim(),
targetRoom: $('[name=targetRoom]').val() ? $('[name=targetRoom]').val().trim() : undefined,
triggerWordAnywhere: $('[name=triggerWordAnywhere]').val() ? $('[name=triggerWordAnywhere]').val().trim() : undefined,
triggerWordAnywhere: $('[name=triggerWordAnywhere]:checked').val().trim() === '1',
retryFailedCalls: $('[name=retryFailedCalls]:checked').val().trim() === '1',
retryCount: $('[name=retryCount]').val() ? $('[name=retryCount]').val().trim() : 6,
retryDelay: $('[name=retryDelay]').val() ? $('[name=retryDelay]').val().trim() : 'powers-of-ten',
@ -294,7 +294,7 @@ Template.integrationsOutgoing.events({
triggerWords = $('[name=triggerWords]').val().trim();
triggerWords = triggerWords.split(',').filter((word) => word.trim() !== '');
triggerWordAnywhere = $('[name=triggerWordAnywhere]').val().trim();
triggerWordAnywhere = $('[name=triggerWordAnywhere]:checked').val().trim();
runOnEdits = $('[name=runOnEdits]:checked').val().trim();
}

@ -165,8 +165,8 @@ RocketChat.integrations.triggerHandler = new class RocketChatIntegrationHandler
}
let tmpRoom;
if (nameOrId || trigger.targetRoom) {
tmpRoom = RocketChat.getRoomByNameOrIdWithOptionToJoin({ currentUserId: user._id, nameOrId: nameOrId || trigger.targetRoom, errorOnEmpty: false }) || room;
if (nameOrId || trigger.targetRoom || message.channel) {
tmpRoom = RocketChat.getRoomByNameOrIdWithOptionToJoin({ currentUserId: user._id, nameOrId: nameOrId || message.channel || trigger.targetRoom, errorOnEmpty: false }) || room;
} else {
tmpRoom = room;
}

@ -149,7 +149,7 @@ RocketChat.integrations.validateOutgoing = function _validateOutgoing(integratio
const user = RocketChat.models.Users.findOne({ username: integration.username });
if (!user) {
throw new Meteor.Error('error-invalid-user', 'Invalid user', { function: 'validateOutgoing' });
throw new Meteor.Error('error-invalid-user', 'Invalid user (did you delete the `rocket.cat` user?)', { function: 'validateOutgoing' });
}
integration.type = 'webhook-outgoing';

@ -359,6 +359,8 @@ class IrcClient {
open: false,
alert: false,
unread: 0,
userMentions: 0,
groupMentions: 0,
u: { _id: target._id, username: target.username }}
});
return { t: 'd', _id: rid };

@ -0,0 +1,15 @@
{
"name": "rocketchat-katex",
"version": "1.0.0",
"lockfileVersion": 1,
"dependencies": {
"katex": {
"version": "https://registry.npmjs.org/katex/-/katex-0.7.1.tgz",
"integrity": "sha1-BrtSmO+tBeHnIoA1uo4VkfMGG48="
},
"match-at": {
"version": "https://registry.npmjs.org/match-at/-/match-at-0.1.0.tgz",
"integrity": "sha1-9WHncJ/5oQW4XMYsa47nwVvyTzE="
}
}
}

@ -62,9 +62,10 @@ getDataToSyncUserData = function getDataToSyncUserData(ldapUser, user) {
const syncUserData = RocketChat.settings.get('LDAP_Sync_User_Data');
const syncUserDataFieldMap = RocketChat.settings.get('LDAP_Sync_User_Data_FieldMap').trim();
const userData = {};
if (syncUserData && syncUserDataFieldMap) {
const fieldMap = JSON.parse(syncUserDataFieldMap);
const userData = {};
const emailList = [];
_.map(fieldMap, function(userField, ldapField) {
switch (userField) {
@ -125,21 +126,21 @@ getDataToSyncUserData = function getDataToSyncUserData(ldapUser, user) {
userData.emails = emailList;
}
}
}
const uniqueId = getLdapUserUniqueID(ldapUser);
const uniqueId = getLdapUserUniqueID(ldapUser);
if (uniqueId && (!user.services || !user.services.ldap || user.services.ldap.id !== uniqueId.value || user.services.ldap.idAttribute !== uniqueId.attribute)) {
userData['services.ldap.id'] = uniqueId.value;
userData['services.ldap.idAttribute'] = uniqueId.attribute;
}
if (uniqueId && (!user.services || !user.services.ldap || user.services.ldap.id !== uniqueId.value || user.services.ldap.idAttribute !== uniqueId.attribute)) {
userData['services.ldap.id'] = uniqueId.value;
userData['services.ldap.idAttribute'] = uniqueId.attribute;
}
if (user.ldap !== true) {
userData.ldap = true;
}
if (user.ldap !== true) {
userData.ldap = true;
}
if (_.size(userData)) {
return userData;
}
if (_.size(userData)) {
return userData;
}
};

@ -103,7 +103,13 @@ Meteor.startup(function() {
const message = this._arguments[1];
const input = instance.find('.input-message');
const url = RocketChat.MessageAction.getPermaLink(message._id);
const text = `[ ](${ url }) @${ message.u.username } `;
const roomInfo = RocketChat.models.Rooms.findOne(message.rid, { fields: { t: 1 } });
let text = `[ ](${ url }) `;
if (roomInfo.t !== 'd' && message.u.username !== Meteor.user().username) {
text += `@${ message.u.username } `;
}
if (input.value) {
input.value += input.value.endsWith(' ') ? '' : ' ';
}
@ -188,7 +194,10 @@ Meteor.startup(function() {
return;
}
const blockDeleteInMinutes = RocketChat.settings.get('Message_AllowDeleting_BlockDeleteInMinutes');
if ((blockDeleteInMinutes != null) && blockDeleteInMinutes !== 0 && !(forceDelete)) {
if (forceDelete) {
return true;
}
if (blockDeleteInMinutes != null && blockDeleteInMinutes !== 0) {
let msgTs;
if (message.ts != null) {
msgTs = moment(message.ts);

@ -79,8 +79,8 @@ RocketChat.Notifications = new class {
unRoom(room, eventName, callback) {
return this.streamRoom.removeListener(`${ room }/${ eventName }`, callback);
}
unUser(callback) {
return this.streamUser.removeListener(Meteor.userId(), callback);
unUser(eventName, callback) {
return this.streamUser.removeListener(`${ Meteor.userId() }/${ eventName }`, callback);
}
};

@ -97,7 +97,7 @@ class CachedCollection {
userRelated = true,
useSync = true,
useCache = true,
debug = true,
debug = false,
version = 6,
maxCacheTime = 60*60*24*30
}) {

@ -1,5 +1,10 @@
/*globals currentTracker */
this.roomExit = function() {
// 7370 - Close flex-tab when opening a room on mobile UI
if (window.matchMedia('(max-width: 500px)').matches) {
const templateData = Blaze.getData(document.querySelector('.flex-tab'));
templateData && templateData.tabBar && templateData.tabBar.close();
}
RocketChat.callbacks.run('roomExit');
BlazeLayout.render('main', {
center: 'none'

@ -59,8 +59,8 @@ Meteor.startup(function() {
return c.stop();
}
Meteor.setTimeout(function() {
if (__meteor_runtime_config__.ROOT_URL !== location.origin) {
const currentUrl = location.origin + __meteor_runtime_config__.ROOT_URL_PATH_PREFIX;
const currentUrl = location.origin + __meteor_runtime_config__.ROOT_URL_PATH_PREFIX;
if (__meteor_runtime_config__.ROOT_URL !== currentUrl) {
swal({
type: 'warning',
title: t('Warning'),

@ -10,10 +10,10 @@ RocketChat.settings.get('Site_Url', function(key, value) {
host = match[1];
// prefix = match[2].replace(/\/$/, '');
}
__meteor_runtime_config__.ROOT_URL = host;
__meteor_runtime_config__.ROOT_URL = value;
if (Meteor.absoluteUrl.defaultOptions && Meteor.absoluteUrl.defaultOptions.rootUrl) {
Meteor.absoluteUrl.defaultOptions.rootUrl = host;
Meteor.absoluteUrl.defaultOptions.rootUrl = value;
}
if (Meteor.isServer) {
RocketChat.hostname = host.replace(/^https?:\/\//, '');

@ -82,6 +82,7 @@ Package.onUse(function(api) {
api.addFiles('server/functions/removeUserFromRoom.js', 'server');
api.addFiles('server/functions/saveUser.js', 'server');
api.addFiles('server/functions/saveCustomFields.js', 'server');
api.addFiles('server/functions/saveCustomFieldsWithoutValidation.js', 'server');
api.addFiles('server/functions/sendMessage.js', 'server');
api.addFiles('server/functions/settings.js', 'server');
api.addFiles('server/functions/setUserAvatar.js', 'server');
@ -90,6 +91,7 @@ Package.onUse(function(api) {
api.addFiles('server/functions/setEmail.js', 'server');
api.addFiles('server/functions/unarchiveRoom.js', 'server');
api.addFiles('server/functions/updateMessage.js', 'server');
api.addFiles('server/functions/validateCustomFields.js', 'server');
api.addFiles('server/functions/Notifications.js', 'server');
// SERVER LIB

@ -1,3 +1,3 @@
{
"version": "0.57.0-develop"
"version": "0.58.0-develop"
}

@ -14,7 +14,9 @@ RocketChat.addUserToDefaultChannels = function(user, silenced) {
ts: new Date(),
open: true,
alert: true,
unread: 1
unread: 1,
userMentions: 1,
groupMentions: 0
});
// Insert user joined message

@ -18,7 +18,9 @@ RocketChat.addUserToRoom = function(rid, user, inviter, silenced) {
ts: now,
open: true,
alert: true,
unread: 1
unread: 1,
userMentions: 1,
groupMentions: 0
});
if (!silenced) {

@ -1,56 +1,6 @@
RocketChat.saveCustomFields = function(userId, formData) {
if (s.trim(RocketChat.settings.get('Accounts_CustomFields')) !== '') {
let customFieldsMeta;
try {
customFieldsMeta = JSON.parse(RocketChat.settings.get('Accounts_CustomFields'));
} catch (e) {
throw new Meteor.Error('error-invalid-customfield-json', 'Invalid JSON for Custom Fields');
}
const customFields = {};
Object.keys(customFieldsMeta).forEach((fieldName) => {
const field = customFieldsMeta[fieldName];
customFields[fieldName] = formData[fieldName];
if (field.required && !formData[fieldName]) {
throw new Meteor.Error('error-user-registration-custom-field', `Field ${ fieldName } is required`, { method: 'registerUser' });
}
if (field.type === 'select' && field.options.indexOf(formData[fieldName]) === -1) {
throw new Meteor.Error('error-user-registration-custom-field', `Value for field ${ fieldName } is invalid`, { method: 'registerUser' });
}
if (field.maxLength && formData[fieldName].length > field.maxLength) {
throw new Meteor.Error('error-user-registration-custom-field', `Max length of field ${ fieldName } ${ field.maxLength }`, { method: 'registerUser' });
}
if (field.minLength && formData[fieldName].length < field.minLength) {
throw new Meteor.Error('error-user-registration-custom-field', `Min length of field ${ fieldName } ${ field.minLength }`, { method: 'registerUser' });
}
});
// for fieldName, field of customFieldsMeta
RocketChat.models.Users.setCustomFields(userId, customFields);
Object.keys(customFields).forEach((fieldName) => {
if (!customFieldsMeta[fieldName].modifyRecordField) {
return;
}
const modifyRecordField = customFieldsMeta[fieldName].modifyRecordField;
const update = {};
if (modifyRecordField.array) {
update.$addToSet = {};
update.$addToSet[modifyRecordField.field] = customFields[fieldName];
} else {
update.$set = {};
update.$set[modifyRecordField.field] = customFields[fieldName];
}
RocketChat.models.Users.update(userId, update);
});
return true;
RocketChat.validateCustomFields(formData);
return RocketChat.saveCustomFieldsWithoutValidation(userId, formData);
}
};

@ -0,0 +1,33 @@
RocketChat.saveCustomFieldsWithoutValidation = function(userId, formData) {
if (s.trim(RocketChat.settings.get('Accounts_CustomFields')) !== '') {
let customFieldsMeta;
try {
customFieldsMeta = JSON.parse(RocketChat.settings.get('Accounts_CustomFields'));
} catch (e) {
throw new Meteor.Error('error-invalid-customfield-json', 'Invalid JSON for Custom Fields');
}
const customFields = formData;
// for fieldName, field of customFieldsMeta
RocketChat.models.Users.setCustomFields(userId, customFields);
Object.keys(customFields).forEach((fieldName) => {
if (!customFieldsMeta[fieldName].modifyRecordField) {
return;
}
const modifyRecordField = customFieldsMeta[fieldName].modifyRecordField;
const update = {};
if (modifyRecordField.array) {
update.$addToSet = {};
update.$addToSet[modifyRecordField.field] = customFields[fieldName];
} else {
update.$set = {};
update.$set[modifyRecordField.field] = customFields[fieldName];
}
RocketChat.models.Users.update(userId, update);
});
}
};

@ -19,7 +19,8 @@ RocketChat.sendMessage = function(user, message, room, upsert = false) {
}
}
if (message.parseUrls !== false) {
const urls = message.msg.match(/([A-Za-z]{3,9}):\/\/([-;:&=\+\$,\w]+@{1})?([-A-Za-z0-9\.]+)+:?(\d+)?((\/[-\+=!:~%\/\.@\,\w]*)?\??([-\+=&!:;%@\/\.\,\w]+)?(?:#([^\s\)]+))?)?/g);
const urls = message.msg.match(/([A-Za-z]{3,9}):\/\/([-;:&=\+\$,\w]+@{1})?([-A-Za-z0-9\.]+)+:?(\d+)?((\/[-\+=!:~%\/\.@\,\(\)\w]*)?\??([-\+=&!:;%@\/\.\,\w]+)?(?:#([^\s\)]+))?)?/g);
if (urls) {
message.urls = urls.map(function(url) {
return {
@ -53,7 +54,7 @@ RocketChat.sendMessage = function(user, message, room, upsert = false) {
Meteor.defer(() => {
// Execute all callbacks
message.sandstormSessionId = sandstormSessionId;
return RocketChat.callbacks.run('afterSaveMessage', message, room);
return RocketChat.callbacks.run('afterSaveMessage', message, room, user._id);
});
return message;
};

@ -25,6 +25,6 @@ RocketChat.updateMessage = function(message, user) {
const room = RocketChat.models.Rooms.findOneById(message.rid);
Meteor.defer(function() {
RocketChat.callbacks.run('afterSaveMessage', RocketChat.models.Messages.findOneById(tempid), room);
RocketChat.callbacks.run('afterSaveMessage', RocketChat.models.Messages.findOneById(tempid), room, user._id);
});
};

@ -0,0 +1,39 @@
RocketChat.validateCustomFields = function(fields) {
// Special Case:
// If an admin didn't set any custom fields there's nothing to validate against so consider any customFields valid
if (s.trim(RocketChat.settings.get('Accounts_CustomFields')) === '') {
return;
}
let customFieldsMeta;
try {
customFieldsMeta = JSON.parse(RocketChat.settings.get('Accounts_CustomFields'));
} catch (e) {
throw new Meteor.Error('error-invalid-customfield-json', 'Invalid JSON for Custom Fields');
}
const customFields = {};
Object.keys(customFieldsMeta).forEach((fieldName) => {
const field = customFieldsMeta[fieldName];
customFields[fieldName] = fields[fieldName];
const fieldValue = s.trim(fields[fieldName]);
if (field.required && fieldValue === '') {
throw new Meteor.Error('error-user-registration-custom-field', `Field ${ fieldName } is required`, {method: 'registerUser'});
}
if (field.type === 'select' && field.options.indexOf(fields[fieldName]) === -1) {
throw new Meteor.Error('error-user-registration-custom-field', `Value for field ${ fieldName } is invalid`, {method: 'registerUser'});
}
if (field.maxLength && fieldValue.length > field.maxLength) {
throw new Meteor.Error('error-user-registration-custom-field', `Max length of field ${ fieldName } ${ field.maxLength }`, {method: 'registerUser'});
}
if (field.minLength && fieldValue.length < field.minLength) {
throw new Meteor.Error('error-user-registration-custom-field', `Min length of field ${ fieldName } ${ field.minLength }`, {method: 'registerUser'});
}
});
};

@ -39,10 +39,7 @@ RocketChat.callbacks.add('afterSaveMessage', function(message, room) {
return has;
}
if (room.t != null && room.t === 'd') {
// Update the other subscriptions
RocketChat.models.Subscriptions.incUnreadOfDirectForRoomIdExcludingUserId(message.rid, message.u._id, 1);
} else {
if (room != null) {
let toAll = false;
let toHere = false;
const mentionIds = [];
@ -71,10 +68,22 @@ RocketChat.callbacks.add('afterSaveMessage', function(message, room) {
}
});
const unreadCount = RocketChat.settings.get('Unread_Count');
if (toAll || toHere) {
RocketChat.models.Subscriptions.incUnreadForRoomIdExcludingUserId(room._id, message.u._id);
let incUnread = 0;
if (['all_messages', 'group_mentions_only', 'user_and_group_mentions_only'].includes(unreadCount)) {
incUnread = 1;
}
RocketChat.models.Subscriptions.incGroupMentionsAndUnreadForRoomIdExcludingUserId(room._id, message.u._id, 1, incUnread);
} else if ((mentionIds && mentionIds.length > 0) || (highlightsIds && highlightsIds.length > 0)) {
RocketChat.models.Subscriptions.incUnreadForRoomIdAndUserIds(room._id, _.compact(_.unique(mentionIds.concat(highlightsIds))));
let incUnread = 0;
if (['all_messages', 'user_mentions_only', 'user_and_group_mentions_only'].includes(unreadCount)) {
incUnread = 1;
}
RocketChat.models.Subscriptions.incUserMentionsAndUnreadForRoomIdAndUserIds(room._id, _.compact(_.unique(mentionIds.concat(highlightsIds))), 1, incUnread);
} else if (unreadCount === 'all_messages') {
RocketChat.models.Subscriptions.incUnreadForRoomIdExcludingUserId(room._id, message.u._id);
}
}

@ -22,6 +22,22 @@ function replaceMentionedUsernamesWithFullNames(message, mentions) {
return message;
}
/**
* This function returns a string ready to be shown in the notification
*
* @param {object} message the message to be parsed
*/
function parseMessageText(message, userId) {
const user = RocketChat.models.Users.findOneById(userId);
const lng = user && user.language || RocketChat.settings.get('language') || 'en';
if (!message.msg && message.attachments[0]) {
message.msg = message.attachments[0].image_type ? TAPi18n.__('User_uploaded_image', {lng}) : TAPi18n.__('User_uploaded_file', {lng});
}
message.msg = RocketChat.callbacks.run('beforeNotifyUser', message.msg);
return message.msg;
}
/**
* Send notification to user
*
@ -31,7 +47,10 @@ function replaceMentionedUsernamesWithFullNames(message, mentions) {
* @param {number} duration Duration of notification
*/
function notifyUser(userId, user, message, room, duration) {
const UI_Use_Real_Name = RocketChat.settings.get('UI_Use_Real_Name') === true;
message.msg = parseMessageText(message, userId);
if (UI_Use_Real_Name) {
message.msg = replaceMentionedUsernamesWithFullNames(message.msg, message.mentions);
}
@ -84,7 +103,8 @@ function getBadgeCount(userId) {
}, 0);
}
RocketChat.callbacks.add('afterSaveMessage', function(message, room) {
RocketChat.callbacks.add('afterSaveMessage', function(message, room, userId) {
// skips this callback if the message was edited
if (message.editedAt) {
return message;
@ -159,7 +179,7 @@ RocketChat.callbacks.add('afterSaveMessage', function(message, room) {
let push_message;
//Set variables depending on Push Notification settings
if (RocketChat.settings.get('Push_show_message')) {
push_message = message.msg;
push_message = parseMessageText(message, userId);
} else {
push_message = ' ';
}

@ -14,7 +14,8 @@ Meteor.methods({
fields: {
u: 1,
rid: 1,
file: 1
file: 1,
ts: 1
}
});
if (originalMessage == null) {
@ -34,7 +35,7 @@ Meteor.methods({
});
}
const blockDeleteInMinutes = RocketChat.settings.get('Message_AllowDeleting_BlockDeleteInMinutes');
if ((blockDeleteInMinutes != null && blockDeleteInMinutes !== 0) || !(forceDelete)) {
if (blockDeleteInMinutes != null && blockDeleteInMinutes !== 0 && !forceDelete) {
if (originalMessage.ts == null) {
return;
}

@ -68,14 +68,8 @@ Meteor.methods({
}
});
// Limit a user, who does not have the "bot" role, to sending 5 msgs/second
DDPRateLimiter.addRule({
type: 'method',
name: 'sendMessage',
RocketChat.RateLimiter.limitMethod('sendMessage', 5, 1000, {
userId(userId) {
const user = RocketChat.models.Users.findOneById(userId);
if (user == null || !user.roles) {
return true;
}
return user.roles.includes('bot');
return !RocketChat.authz.hasPermission(userId, 'send-many-messages');
}
}, 5, 1000);
});

@ -1,7 +1,13 @@
/* globals InstanceStatus */
RocketChat.models.Avatars = new class extends RocketChat.models._Base {
constructor() {
super('avatars');
this.model.before.insert((userId, doc) => {
doc.instanceId = InstanceStatus.id();
});
this.tryEnsureIndex({ name: 1 });
}

@ -545,6 +545,16 @@ RocketChat.models.Messages = new class extends RocketChat.models._Base {
return this.createWithTypeRoomIdMessageAndUser('owner-removed', roomId, message, user, extraData);
}
createNewLeaderWithRoomIdAndUser(roomId, user, extraData) {
const message = user.username;
return this.createWithTypeRoomIdMessageAndUser('new-leader', roomId, message, user, extraData);
}
createLeaderRemovedWithRoomIdAndUser(roomId, user, extraData) {
const message = user.username;
return this.createWithTypeRoomIdMessageAndUser('leader-removed', roomId, message, user, extraData);
}
createSubscriptionRoleAddedWithRoomIdAndUser(roomId, user, extraData) {
const message = user.username;
return this.createWithTypeRoomIdMessageAndUser('subscription-role-added', roomId, message, user, extraData);

@ -238,7 +238,8 @@ class ModelRooms extends RocketChat.models._Base {
}
};
return this.find(query, options);
// do not use cache
return this._db.find(query, options);
}
findByNameAndTypeNotContainingUsername(name, type, username, options) {
@ -250,7 +251,8 @@ class ModelRooms extends RocketChat.models._Base {
}
};
return this.find(query, options);
// do not use cache
return this._db.find(query, options);
}
findByNameStartingAndTypes(name, types, options) {

@ -241,6 +241,8 @@ class ModelSubscriptions extends RocketChat.models._Base {
open: true,
alert: false,
unread: 0,
userMentions: 0,
groupMentions: 0,
ls: new Date
}
};
@ -336,11 +338,10 @@ class ModelSubscriptions extends RocketChat.models._Base {
return this.update(query, update, { multi: true });
}
incUnreadOfDirectForRoomIdExcludingUserId(roomId, userId, inc) {
incUnreadForRoomIdExcludingUserId(roomId, userId, inc) {
if (inc == null) { inc = 1; }
const query = {
rid: roomId,
t: 'd',
'u._id': {
$ne: userId
}
@ -359,8 +360,7 @@ class ModelSubscriptions extends RocketChat.models._Base {
return this.update(query, update, { multi: true });
}
incUnreadForRoomIdExcludingUserId(roomId, userId, inc) {
if (inc == null) { inc = 1; }
incGroupMentionsAndUnreadForRoomIdExcludingUserId(roomId, userId, incGroup = 1, incUnread = 1) {
const query = {
rid: roomId,
'u._id': {
@ -374,15 +374,15 @@ class ModelSubscriptions extends RocketChat.models._Base {
open: true
},
$inc: {
unread: inc
unread: incUnread,
groupMentions: incGroup
}
};
return this.update(query, update, { multi: true });
}
incUnreadForRoomIdAndUserIds(roomId, userIds, inc) {
if (inc == null) { inc = 1; }
incUserMentionsAndUnreadForRoomIdAndUserIds(roomId, userIds, incUser = 1, incUnread = 1) {
const query = {
rid: roomId,
'u._id': {
@ -396,7 +396,8 @@ class ModelSubscriptions extends RocketChat.models._Base {
open: true
},
$inc: {
unread: inc
unread: incUnread,
userMentions: incUser
}
};
@ -537,13 +538,16 @@ class ModelSubscriptions extends RocketChat.models._Base {
open: false,
alert: false,
unread: 0,
userMentions: 0,
groupMentions: 0,
ts: room.ts,
rid: room._id,
name: room.name,
t: room.t,
u: {
_id: user._id,
username: user.username
username: user.username,
name: user.name
}
};

@ -1,7 +1,13 @@
/* globals InstanceStatus */
RocketChat.models.Uploads = new class extends RocketChat.models._Base {
constructor() {
super('uploads');
this.model.before.insert((userId, doc) => {
doc.instanceId = InstanceStatus.id();
});
this.tryEnsureIndex({ 'rid': 1 });
this.tryEnsureIndex({ 'uploadedAt': 1 });
}

@ -148,6 +148,9 @@ class ModelUsers extends RocketChat.models._Base {
},
{
name: termRegex
},
{
'emails.address': termRegex
}
]
},
@ -157,7 +160,8 @@ class ModelUsers extends RocketChat.models._Base {
]
};
return this.find(query, options);
// do not use cache
return this._db.find(query, options);
}
findUsersByNameOrUsername(nameOrUsername, options) {
@ -315,9 +319,8 @@ class ModelUsers extends RocketChat.models._Base {
setCustomFields(_id, fields) {
const values = {};
Object.keys(fields).reduce(key => {
const value = fields[key];
values[`customFields.${ key }`] = value;
Object.keys(fields).forEach(key => {
values[`customFields.${ key }`] = fields[key];
});
const update = {$set: values};

@ -354,6 +354,25 @@ RocketChat.settings.addGroup('General', function() {
type: 'boolean',
'public': true
});
this.add('Unread_Count', 'user_and_group_mentions_only', {
type: 'select',
values: [
{
key: 'all_messages',
i18nLabel: 'All_messages'
}, {
key: 'user_mentions_only',
i18nLabel: 'User_mentions_only'
}, {
key: 'group_mentions_only',
i18nLabel: 'Group_mentions_only'
}, {
key: 'user_and_group_mentions_only',
i18nLabel: 'User_and_group_mentions_only'
}
],
'public': true
});
this.add('CDN_PREFIX', '', {
type: 'string',
'public': true
@ -806,6 +825,10 @@ RocketChat.settings.addGroup('Message', function() {
'public': true,
i18nDescription: 'Message_TimeAndDateFormat_Description'
});
this.add('Message_QuoteChainLimit', 2, {
type: 'int',
'public': true
});
this.add('Message_HideType_uj', false, {
type: 'boolean',
'public': true
@ -822,6 +845,7 @@ RocketChat.settings.addGroup('Message', function() {
type: 'boolean',
'public': true
});
return this.add('Message_HideType_mute_unmute', false, {
type: 'boolean',
'public': true
@ -1012,6 +1036,23 @@ RocketChat.settings.addGroup('Layout', function() {
type: 'boolean',
'public': true
});
this.add('UI_Click_Direct_Message', false, {
type: 'boolean',
'public': true
});
this.add('UI_Unread_Counter_Style', 'Different_Style_For_User_Mentions', {
type: 'select',
values: [
{
key: 'Same_Style_For_Mentions',
i18nLabel: 'Same_Style_For_Mentions'
}, {
key: 'Different_Style_For_User_Mentions',
i18nLabel: 'Different_Style_For_User_Mentions'
}
],
'public': true
});
});
});

@ -1,5 +1,6 @@
/* globals openRoom */
RocketChat.roomTypes.add(null, 0, {
header: 'favorite',
icon: 'icon-star',
label: 'Favorites'
});

@ -4,15 +4,15 @@
# 'meteor add' and 'meteor remove' will edit this file for you,
# but you can also edit it by hand.
meteor@1.6.1
webapp@1.3.16
meteor@1.7.0
webapp@1.3.17
logging@1.1.17
tracker@1.1.3
deps@1.0.12
session@1.1.7
ddp@1.2.5
ddp@1.3.0
livedata@1.0.18
mongo@1.1.18
mongo@1.1.19
blaze
ui
spacebars
@ -31,12 +31,12 @@ underscorestring:underscore.string
momentjs:moment
mizzao:timesync
reactive-var@1.0.11
accounts-password@1.3.6
accounts-password@1.4.0
tap:i18n
smoral:sweetalert
ecmascript@0.8.0
ecmascript@0.8.1
es5-shim@4.6.15
standard-minifier-css@1.3.4
standard-minifier-js@2.1.0
shell-server@0.2.3
dynamic-import
standard-minifier-js@2.1.1
shell-server@0.2.4
dynamic-import@0.1.1

@ -1,31 +1,31 @@
accounts-base@1.3.0
accounts-password@1.3.7
accounts-base@1.3.1
accounts-password@1.4.0
aldeed:simple-schema@1.5.3
allow-deny@1.0.5
babel-compiler@6.19.2
allow-deny@1.0.6
babel-compiler@6.19.4
babel-runtime@1.0.1
base64@1.0.10
binary-heap@1.0.10
blaze@2.3.2
blaze-tools@1.0.10
boilerplate-generator@1.1.0
boilerplate-generator@1.1.1
caching-compiler@1.1.9
caching-html-compiler@1.1.2
callback-hook@1.0.10
cfs:http-methods@0.0.32
check@1.2.5
coffeescript@1.12.6_1
ddp@1.2.5
ddp-client@1.3.4
ddp-common@1.2.8
ddp@1.3.0
ddp-client@2.0.0
ddp-common@1.2.9
ddp-rate-limiter@1.0.7
ddp-server@1.3.14
ddp-server@2.0.0
deps@1.0.12
diff-sequence@1.0.7
dynamic-import@0.1.1
ecmascript@0.8.0
ecmascript@0.8.2
ecmascript-runtime@0.4.1
ecmascript-runtime-client@0.4.2
ecmascript-runtime-client@0.4.3
ecmascript-runtime-server@0.4.1
ejson@1.0.13
email@1.2.3
@ -41,19 +41,19 @@ kadira:flow-router@2.12.1
konecty:nrr@2.0.2
less@2.7.9
livedata@1.0.18
localstorage@1.1.0
localstorage@1.1.1
logging@1.1.17
mdg:validation-error@0.5.1
meteor@1.6.1
meteor@1.7.0
meteorspark:util@0.2.0
minifier-css@1.2.16
minifier-js@2.1.0
minifier-js@2.1.1
minimongo@1.2.1
mizzao:timesync@0.5.0
modules@0.9.1
modules@0.9.2
modules-runtime@0.8.0
momentjs:moment@2.18.1
mongo@1.1.18
mongo@1.1.19
mongo-id@1.0.6
npm-bcrypt@0.9.3
npm-mongo@2.2.24
@ -71,13 +71,13 @@ routepolicy@1.0.12
service-configuration@1.0.11
session@1.1.7
sha@1.0.9
shell-server@0.2.3
shell-server@0.2.4
smoral:sweetalert@1.1.1
spacebars@1.0.15
spacebars-compiler@1.1.2
srp@1.0.10
standard-minifier-css@1.3.4
standard-minifier-js@2.1.0
standard-minifier-js@2.1.1
tap:i18n@1.8.2
templating@1.3.2
templating-compiler@1.3.2
@ -88,5 +88,5 @@ ui@1.0.13
underscore@1.0.10
underscorestring:underscore.string@3.3.4
url@1.1.0
webapp@1.3.16
webapp@1.3.17
webapp-hashing@1.0.9

@ -72,8 +72,8 @@ this.Notifications = new class {
unRoom(room, eventName, callback) {
return this.streamRoom.removeListener(`${ room }/${ eventName }`, callback);
}
unUser(callback) {
return this.streamUser.removeListener(Meteor.userId(), callback);
unUser(eventName, callback) {
return this.streamUser.removeListener(`${ Meteor.userId() }/${ eventName }`, callback);
}
};

@ -0,0 +1,4 @@
{
"Additional_Feedback": "Bykomende terugvoer",
"No": "Nee"
}

@ -1,13 +1,21 @@
{
"Additional_Feedback": "Πρόσθετα Σχόλια",
"Appearance": "Εμφάνιση",
"Are_you_sure_do_you_want_end_this_chat": "Είσαι σίγουρος ότι θες να τερματίσεις τη συνομιλία;",
"Cancel": "Ακύρωση",
"Change": "Αλλαγή",
"Chat_ended": "Η συνομιλία τελείωσε!",
"Close_menu": "Κλείσιμο μενού",
"Conversation_finished": "Η συνομιλία τελείωσε",
"End_chat": "Τερματισμός συνομιλίας",
"How_friendly_was_the_chat_agent": "Πόσο φιλικός ήταν ο εκπρόσωπος μας;",
"How_knowledgeable_was_the_chat_agent": "Πώς γνώστης ήταν ο εκπρόσωπος μας;",
"How_responsive_was_the_chat_agent": "Πώς ανταποκρίσιμος ήταν ο εκπρόσωπος μας;",
"How_satisfied_were_you_with_this_chat": "Πόσο ικανοποιημένοι είστε με αυτήν την συνομιλία;",
"Installation": "Εγκατάσταση",
"New_messages": "Νέα μηνύματα",
"No": "Όχι",
"Options": "Επιλογές",
"Please_answer_survey": "Αφιερώστε λίγο χρόνο για να απαντήσετε σε μια σύντομη έρευνα σχετικά με αυτή τη συνομιλία",
"Please_fill_name_and_email": "Παρακαλούμε συμπληρώστε το όνομα και το e-mail",
"Powered_by": "Powered by",
@ -19,11 +27,14 @@
"Survey_instructions": "Βαθμολογήστε κάθε ερώτηση, σύμφωνα με την ικανοποίησή σας, 1 που σημαίνει ότι θα είναι εντελώς ανικανοποίητοι και 5 σημαίνει ότι είστε απόλυτα ικανοποιημένοι.",
"Thank_you_for_your_feedback": "Ευχαριστούμε για την ανταπόκρισή σας",
"Thanks_We_ll_get_back_to_you_soon": "Ευχαριστώ! Θα επικοινωνήσουμε μαζί σας σύντομα.",
"transcript_sent": "Το αντίγραφο της συνομιλίας στάλθηκε",
"Type_your_email": "Πληκτρολογήστε το email σας",
"Type_your_message": "Πληκτρολογήστε το μήνυμά σας",
"Type_your_name": "Πληκτρολογήστε το όνομά σας",
"User_joined": "εντάχθηκε χρήστη",
"User_left": "αριστερή χρήστη",
"We_are_offline_Sorry_for_the_inconvenience": "Είμαστε εκτός σύνδεσης. Συγγνώμη για την ταλαιπωρία.",
"Yes": "Ναι",
"You": "Εσύ",
"You_must_complete_all_fields": "Πρέπει να συμπληρώσετε όλα τα πεδία"
}

@ -2,8 +2,11 @@
"Additional_Feedback": "Lisäpalaute",
"Appearance": "Ulkoasu",
"Are_you_sure_do_you_want_end_this_chat": "Haluatko lopettaa tämän keskustelun?",
"Are_you_sure_do_you_want_end_this_chat_and_switch_department": "Oletko varma että haluat lopettaa tämän keskustelun ja vaihtaa osastoa?",
"Cancel": "Peruuta",
"Change": "Muuta",
"Chat_ended": "Keskustelu lopetettu!",
"Choose_a_new_department": "Valitse uusi osasto",
"Close_menu": "Sulje valikko",
"Conversation_finished": "Keskustelu päättynyt",
"End_chat": "Lopeta keskustelu",
@ -16,9 +19,12 @@
"No": "Ei",
"Options": "Valinnat",
"Please_answer_survey": "Käytä hetki vastataksesi pikakyselyyn tästä chatista",
"Please_choose_a_department": "Ole hyvä ja valitse uusi osasto",
"Please_fill_name_and_email": "Täytä nimi ja sähköpostiosoite",
"Powered_by": "Palvelun tarjoaa",
"Select_a_department": "Valitse osasto",
"Switch_department": "Vaihda osastoa",
"Department_switched": "Osasto vaihdettu",
"Send": "Lähetä",
"Skip": "Ohita",
"Start_Chat": "Aloita Chat",

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save