Merge branch 'develop'

* develop: (67 commits)
  Remove toUpperCase from emojione popup config; Fixes #1955
  Make oembed parse title in ungreedy form
  Display time based on locale instead of using fixed 24h format
  Fix audio-recorder not stoping. Closes #1941.
  Sort room files by uploadedAt. Closes #1932
  Allow multi-line title on oembed
  Add some logs
  Fallback LDAP login to local account if LDAP fails
  Add connections status bar to login page
  Created and pushed by LingoHub. Project: 'Rocket.Chat' by User: 'gabriel.engel@gmail.com'.
  send correct content-type for livechat. fixes #1951
  Fix redirect exceptions
  Add i18n strings
  Close #1768; Force SSL
  Close #1925; Add options to enable TLS on LDAP
  Improve admin disbleQuery
  Close #1923; Prevent erros update outgoing webhooks with empty channel
  Fix overlapping windows
  Add Raspberry Pi support announcement
  Updated base.less to use 480x270
  ...
pull/1965/head
Gabriel Engel 9 years ago
commit 83c0e42979
  1. 6
      .docker/dockerfiles/develop/Dockerfile
  2. 4
      .docker/dockerfiles/latest/Dockerfile
  3. 8
      .meteor/versions
  4. 20
      README.md
  5. 17
      i18n/ar.i18n.json
  6. 34
      i18n/de.i18n.json
  7. 33
      i18n/en.i18n.json
  8. 29
      i18n/fi.i18n.json
  9. 46
      i18n/he.i18n.json
  10. 1
      i18n/hr.i18n.json
  11. 1
      i18n/ko.i18n.json
  12. 1
      i18n/nl.i18n.json
  13. 25
      i18n/pl.i18n.json
  14. 4
      i18n/pt.i18n.json
  15. 31
      i18n/ro.i18n.json
  16. 75
      packages/rocketchat-api/server/routes.coffee
  17. 8
      packages/rocketchat-assets/.npm/package/npm-shrinkwrap.json
  18. 3
      packages/rocketchat-assets/package.js
  19. 27
      packages/rocketchat-assets/server/assets.coffee
  20. 1
      packages/rocketchat-authorization/i18n/ar.i18n.json
  21. 1
      packages/rocketchat-authorization/i18n/de.i18n.json
  22. 1
      packages/rocketchat-authorization/i18n/en.i18n.json
  23. 1
      packages/rocketchat-authorization/i18n/fi.i18n.json
  24. 1
      packages/rocketchat-authorization/i18n/hr.i18n.json
  25. 1
      packages/rocketchat-authorization/i18n/ko.i18n.json
  26. 1
      packages/rocketchat-authorization/i18n/nl.i18n.json
  27. 3
      packages/rocketchat-authorization/i18n/pl.i18n.json
  28. 1
      packages/rocketchat-authorization/i18n/pt.i18n.json
  29. 1
      packages/rocketchat-authorization/i18n/ro.i18n.json
  30. 19
      packages/rocketchat-authorization/server/startup.coffee
  31. 2
      packages/rocketchat-channel-settings-mail-messages/i18n/de.i18n.json
  32. 5
      packages/rocketchat-channel-settings-mail-messages/i18n/pl.i18n.json
  33. 2
      packages/rocketchat-channel-settings-mail-messages/server/methods/mailMessages.coffee
  34. 7
      packages/rocketchat-channel-settings/i18n/pl.i18n.json
  35. 39
      packages/rocketchat-cors/cors.coffee
  36. 3
      packages/rocketchat-integrations/package.js
  37. 99
      packages/rocketchat-integrations/server/api/api.coffee
  38. 9
      packages/rocketchat-integrations/server/methods/outgoing/updateOutgoingIntegration.coffee
  39. 102
      packages/rocketchat-integrations/server/processWebhookMessage.js
  40. 21
      packages/rocketchat-integrations/server/triggers.coffee
  41. 27
      packages/rocketchat-ldap/config_server.coffee
  42. 77
      packages/rocketchat-ldap/ldap_server.js
  43. 1
      packages/rocketchat-ldap/package.js
  44. 1
      packages/rocketchat-lib/client/lib/openRoom.coffee
  45. 2
      packages/rocketchat-lib/client/lib/settings.coffee
  46. 28
      packages/rocketchat-lib/lib/MessageTypes.coffee
  47. 2
      packages/rocketchat-lib/server/functions/sendMessage.coffee
  48. 3
      packages/rocketchat-lib/server/functions/settings.coffee
  49. 16
      packages/rocketchat-lib/server/models/Messages.coffee
  50. 29
      packages/rocketchat-lib/server/models/Subscriptions.coffee
  51. 1
      packages/rocketchat-lib/server/startup/settings.coffee
  52. 7
      packages/rocketchat-lib/server/startup/settingsOnLoadSMTP.coffee
  53. 2
      packages/rocketchat-livechat/app/client/views/message.coffee
  54. 4
      packages/rocketchat-livechat/app/i18n/pl.i18n.json
  55. 12
      packages/rocketchat-livechat/client/views/app/livechatAppearance.js
  56. 1
      packages/rocketchat-livechat/i18n/ar.i18n.json
  57. 6
      packages/rocketchat-livechat/i18n/pl.i18n.json
  58. 2
      packages/rocketchat-livechat/livechat.js
  59. 2
      packages/rocketchat-mailer/i18n/ar.i18n.json
  60. 1
      packages/rocketchat-mailer/i18n/pl.i18n.json
  61. 5
      packages/rocketchat-mentions-flextab/i18n/pl.i18n.json
  62. 2
      packages/rocketchat-message-attachments/client/messageAttachment.html
  63. 14
      packages/rocketchat-oauth2-server-config/oauth/client/oauth2-client.coffee
  64. 32
      packages/rocketchat-oauth2-server-config/oauth/client/oauth2-client.html
  65. 60
      packages/rocketchat-oauth2-server-config/oauth/client/stylesheets/oauth2.less
  66. 9
      packages/rocketchat-oauth2-server-config/oauth/server/oauth2-server.coffee
  67. 2
      packages/rocketchat-oembed/client/oembedVideoWidget.html
  68. 2
      packages/rocketchat-oembed/server/server.coffee
  69. 4
      packages/rocketchat-slashcommands-invite/i18n/ar.i18n.json
  70. 1
      packages/rocketchat-slashcommands-kick/i18n/ar.i18n.json
  71. 4
      packages/rocketchat-slashcommands-mute/i18n/ar.i18n.json
  72. 14
      packages/rocketchat-theme/assets/stylesheets/base.less
  73. 5
      packages/rocketchat-theme/i18n/fi.i18n.json
  74. 6
      packages/rocketchat-ui-account/account/accountProfile.coffee
  75. 3
      packages/rocketchat-ui-account/account/accountProfile.html
  76. 25
      packages/rocketchat-ui-admin/admin/admin.coffee
  77. 2
      packages/rocketchat-ui-admin/admin/admin.html
  78. 13
      packages/rocketchat-ui-flextab/flex-tab/tabs/messageSearch.coffee
  79. 2
      packages/rocketchat-ui-flextab/flex-tab/tabs/uploadedFilesList.coffee
  80. 118
      packages/rocketchat-ui-flextab/flex-tab/tabs/userInfo.coffee
  81. 24
      packages/rocketchat-ui-flextab/flex-tab/tabs/userInfo.html
  82. 2
      packages/rocketchat-ui-flextab/package.js
  83. 2
      packages/rocketchat-ui-login/login/form.html
  84. 3
      packages/rocketchat-ui-master/master/main.html
  85. 5
      packages/rocketchat-ui-message/message/message.coffee
  86. 1
      packages/rocketchat-ui-message/message/messageBox.coffee
  87. 2
      packages/rocketchat-ui-message/message/popup/messagePopupEmoji.coffee
  88. 27
      packages/rocketchat-ui/lib/RoomManager.coffee
  89. 1
      packages/rocketchat-ui/lib/collections.coffee
  90. 4
      packages/rocketchat-ui/lib/notification.coffee
  91. 4
      packages/rocketchat-ui/lib/recorderjs/audioRecorder.coffee
  92. 33
      packages/rocketchat-ui/lib/updateModeratorsAndOwners.js
  93. 1
      packages/rocketchat-ui/package.js
  94. 1
      packages/rocketchat-ui/views/app/privateHistory.html
  95. 8
      packages/rocketchat-ui/views/app/room.coffee
  96. 8
      packages/rocketchat-ui/views/app/videoCall/videoButtons.html
  97. 4
      server/lib/accounts.coffee
  98. 25
      server/methods/addRoomModerator.coffee
  99. 25
      server/methods/addRoomOwner.coffee
  100. 2
      server/methods/createChannel.coffee
  101. Some files were not shown because too many files have changed in this diff Show More

@ -1,12 +1,10 @@
FROM node:0.10
# crafted and tuned by pierre@ozoux.net and sing.li@rocket.chat
# IMPORTANT - FOR TESTING ONLY - DO NOT USE THIS FOR DEVELOPMENT OR PRODUCTION!
MAINTAINER buildmaster@rocket.chat
RUN groupadd -r rocketchat \
&& useradd -r -g rocketchat rocketchat \
&& mkdir /app \
&& mkdir /app/uploads
&& useradd -r -g rocketchat rocketchat
VOLUME /app/uploads

@ -4,9 +4,7 @@ FROM node:0.10
MAINTAINER buildmaster@rocket.chat
RUN groupadd -r rocketchat \
&& useradd -r -g rocketchat rocketchat \
&& mkdir /app \
&& mkdir /app/uploads
&& useradd -r -g rocketchat rocketchat
VOLUME /app/uploads

@ -38,7 +38,7 @@ ecmascript@0.1.6
ecmascript-runtime@0.2.6
ejson@1.0.7
email@1.0.8
emojione:emojione@2.0.0
emojione:emojione@2.0.1
facebook@1.2.2
fastclick@1.0.7
francocatena:status@1.5.0
@ -74,7 +74,7 @@ livedata@1.0.15
localstorage@1.0.5
logging@1.0.8
matb33:collection-hooks@0.8.1
mdg:validation-error@0.2.0
mdg:validation-error@0.3.0
meteor@1.1.10
meteor-base@1.0.1
meteor-developer@1.1.5
@ -85,7 +85,7 @@ mizzao:autocomplete@0.5.1
mizzao:timesync@0.3.4
mobile-experience@1.0.1
mobile-status-bar@1.0.6
momentjs:moment@2.11.0
momentjs:moment@2.11.1
monbro:mongodb-mapreduce-aggregation@1.0.1
mongo@1.1.3
mongo-id@1.0.1
@ -105,7 +105,7 @@ ostrio:cookies@2.0.1
pauli:accounts-linkedin@1.2.0
pauli:linkedin@1.2.0
perak:codemirror@1.2.8
percolate:migrations@0.9.7
percolate:migrations@0.9.8
percolate:synced-cron@1.3.0
pntbr:js-yaml-client@0.0.1
promise@0.5.1

@ -13,6 +13,7 @@ The Ultimate Open Source WebChat Platform
* [Docker](#docker)
* [FreeBSD](#freebsd)
* [Ansible](#ansible)
* [Raspberry Pi 2](#raspberry-pi-2)
* [Ubuntu VPS](#ubuntu-vps)
* [Ubuntu Software Center](#ubuntu-software-center)
* [About Rocket.Chat](#about-rocketchat)
@ -24,7 +25,7 @@ The Ultimate Open Source WebChat Platform
* [Documentation](#documentation)
* [License](#license)
* [Development](#development)
* [Installation](#installation)
* [Quick Start](#quick-start-for-code-developers)
* [Branching Model](#branching-model)
* [Translations](#translations)
* [Community](#community)
@ -71,7 +72,7 @@ Deploy your own Rocket.Chat server instantly on [Scalingo](https://scalingo.com)
## Sandstorm.io
[![Rocket.Chat on Sandstorm.io](https://raw.githubusercontent.com/Sing-Li/bbug/master/images/sandstorm.jpg)](https://apps.sandstorm.io/app/vfnwptfn02ty21w715snyyczw0nqxkv3jvawcah10c6z7hj1hnu0)
_*Grab*_ the [Sandstorm SPK for the latest Rocket.Chat release](https://github.com/RocketChat/Rocket.Chat/releases/latest) for testing on your own server.
_*Grab*_ the [Sandstorm SPK for the latest Rocket.Chat release](https://rocket.chat/releases/latest/spk) for testing on your own server.
## Sloppy.io
Host your docker container at [sloppy.io](http://sloppy.io). Get an account and use the [quickstarter](https://github.com/sloppyio/quickstarters/tree/master/rocketchat)
@ -110,6 +111,11 @@ Automated production-grade deployment in minutes, for RHEL / CentOS 7 or Ubuntu
[![Ansible deployment](https://raw.githubusercontent.com/Sing-Li/bbug/master/images/ansible.png)](https://github.com/RocketChat/Rocket.Chat/wiki/Easy,-hands-off-deployment-with-Ansible)
## Raspberry Pi 2
Run Rocket.Chat on this world famous $30 quad core server:
[![Raspberry Pi 2](https://raw.githubusercontent.com/Sing-Li/bbug/master/images/pitiny.png)](https://github.com/RocketChat/Rocket.Chat.RaspberryPi)
## Ubuntu VPS
Follow these [deployment instructions](https://github.com/RocketChat/Rocket.Chat/wiki/Deploy-Rocket.Chat-without-docker)
@ -252,7 +258,7 @@ Note that Rocket.Chat is distributed under the [MIT License](http://opensource.o
# Development
## Installation
## Quick start for code developers
Prerequisites:
* [Git](http://git-scm.com/book/en/v2/Getting-Started-Installing-Git)
@ -266,13 +272,7 @@ cd Rocket.Chat
meteor
```
or use docker:
```
git clone https://github.com/RocketChat/Rocket.Chat.git
cd Rocket.Chat
docker run -it -p 3000:3000 -v "$(pwd)":/app danieldent/meteor
```
If you are not a developer and just want to run the server - see [deployment methods](https://github.com/RocketChat/Rocket.Chat/wiki#deployment).
## Branching Model

@ -56,8 +56,10 @@
"close" : "غلق",
"coming_soon" : "قريبا",
"Commands" : "الأوامر",
"Compact_View" : "عرض متراص",
"Confirm_password" : "تأكيد كلمة السر",
"Conversation" : "محادثة",
"Convert_Ascii_Emojis" : "حول محارف الأسكي إلى اموجي",
"COPY_TO_CLIPBOARD" : "نسخ",
"Create_new" : "إنشاء جديد",
"Create_new_direct_message_room" : "إنشاء غرفة رسالة مباشرة جديدة",
@ -81,7 +83,7 @@
"Email_already_exists" : "البريد الالكتروني موجود مسبقا",
"Email_or_username" : "البريد الإلكتروني أو اسم المستخدم",
"Email_verified" : "تم التحقق من البريد الإلكتروني",
"Emoji" : "الرموز التعبيرية",
"Emoji" : "رمز تعبيري (اموجي)",
"Enable_Desktop_Notifications" : "تفعيل تنبيهات سطح المكتب",
"Enter_info" : "ادخل المعلومات الخاصة بك",
"Enter_to" : "ادخل الى",
@ -144,6 +146,7 @@
"Login_with" : "تسجيل الدخول بـ %s",
"login_with" : "أو الدخول مباشرة بـ",
"Logout" : "تسجيل خروج",
"Logout_Others" : "تسجيل الخروج من الأجهزة الأخرى",
"Make_Admin" : "جعل مدير",
"Mark_as_read" : "تعليم كمقروء",
"Members" : "الأعضاء",
@ -200,6 +203,7 @@
"optional" : "اختياري",
"others" : "آخرون",
"Password" : "كلمة السر",
"Password_Change_Disabled" : "مدير الموقع منع تغيير كلمة السر",
"Password_changed_successfully" : "تم تغيير كلمة السر بنجاح",
"People" : "الناس",
"Please_enter_your_new_password_below" : "الرجاء إدخال كلمة المرور الجديدة أدناه:",
@ -224,6 +228,7 @@
"Remove" : "إزالة",
"Remove_Admin" : "إزالة مدير",
"Remove_from_room" : "إزالة من الغرفة",
"Removed" : "تمت اﻹزالة",
"Reset" : "إعادة التعيين",
"Reset_password" : "إعادة تعيين كلمة السر",
"Restart" : "إعادة التشغيل",
@ -239,6 +244,7 @@
"Rooms" : "الغرف",
"S_new_messages_since_s" : "% رسالة جديدة منذ %",
"Save_changes" : "حفظ التغيرات",
"Save_Mobile_Bandwidth" : "توفير استهلاك الانترنت",
"Search" : "بحث",
"Search_Messages" : "بحث الرسائل",
"Search_settings" : "إعدادات البحث",
@ -254,7 +260,7 @@
"Send_Message" : "أرسل رسالة",
"Settings" : "اﻹعدادات",
"Settings_updated" : "تم تحديث الإعدادات",
"Showing_online_users" : "عرض <b>__total_online__</b> of __total__ users",
"Showing_online_users" : "عرض <b>__total_online__</b>من __total__ عضو",
"Showing_results" : "<p>يعرض <b>%s</b> نتائج</p>",
"Silence" : "الصمت",
"since_creation" : "منذ %s",
@ -290,7 +296,7 @@
"Submit" : "تقديم",
"The_channel_name_is_required" : "اسم القناة مطلوب",
"The_field_is_required" : "هذا الحقل %s مطلوب.",
"The_server_will_restart_in_s_seconds" : "سيتم إعادة تشغيل السيرفر في ٪s ثانية",
"The_server_will_restart_in_s_seconds" : "سيتم إعادة تشغيل الخادم في %s ثانية",
"True" : "نعم",
"Type_your_new_password" : "اكتب كلمة المرور الجديدة",
"Unmute_user" : "إلغاء اسكات المستخدم",
@ -298,7 +304,7 @@
"Unread_Rooms_Mode" : "وضع الغرف الغير مقروءة",
"Upload_file_question" : "تحميل الملف؟",
"Uploading_file" : "تحميل الملف ...",
"Use_Emojis" : "استخدام Emojis",
"Use_Emojis" : "استخدم الرموز التعبيرية (ايموجي)",
"Use_initials_avatar" : "استخدم الأحرف الأولى من اسم المستخدم",
"use_menu" : "استخدم القائمة الجانبية للوصول إلى الغرف الخاصة بك والمحادثات",
"Use_service_avatar" : "استخدام %s الرمزية",
@ -330,11 +336,13 @@
"User_updated_successfully" : "تم تحديث العضو بنجاح",
"Username" : "اسم المستخدم",
"Username_cant_be_empty" : "اسم المستخدم لا يمكن أن يكون فارغا",
"Username_Change_Disabled" : "مدير الموقع منع تغيير اسم المستخدم",
"Username_description" : "يتم استخدام اسم المستخدم للسماح للآخرين بذكرك في الرسائل.",
"Username_invalid" : "<strong>%s</strong> لا يصلح كإسم مستخدم،<br/> استخدم فقط حروفا وأرقاما وشرطات",
"Username_title" : "تسجيل اسم المستخدم",
"Username_unavaliable" : "<strong>%s</strong> مستخدم مسبقا :(",
"Users" : "المستخدمين",
"UTF8_Names_Validation_Description" : "لا تسمح باستخدام رموز خاصة و مسافات. يمكنك استخدام العلامات التالية - _  . لكن لا تسمح بهن في نهاية الاسم.",
"View_All" : "مشاهدة الكل",
"We_have_sent_password_email" : "لقد قمنا بإرسال رسالة بريد إلكتروني مع إرشادات إعادة تعيين كلمة السر. إذا لم يصلك البريد الإلكتروني قريبا، يرجى العودة والمحاولة مرة أخرى.",
"We_have_sent_registration_email" : "لقد قمنا بإرسال رسالة بريد إلكتروني لتأكيد تسجيلك. إذا لم يصلك البريد الإلكتروني قريبا، يرجى العودة والمحاولة مرة أخرى.",
@ -344,6 +352,7 @@
"Yes" : "نعم",
"Yes_clear_all" : "نعم، حذف الكل!",
"Yes_delete_it" : "نعم، أحذف!",
"You_can_use_an_emoji_as_avatar" : "تستطيع استخدام ايموجي كصورة رمزية",
"You_have_been_muted" : "لقد تم اسكاتك ولا يمكنك التحدث في هذه الغرفة",
"You_need_confirm_email" : "تحتاج إلى تأكيد بريدك الإلكتروني لتسجيل الدخول!",
"You_will_not_be_able_to_recover" : "لن تستطيع استرداد هذه الرسالة!",

@ -88,6 +88,7 @@
"are_typing" : "schreiben",
"Are_you_sure" : "Sind Sie sicher?",
"Authorization_URL" : "Autorisierungs-URL",
"Authorize" : "Berechtigen",
"Auto_Load_Images" : "Automatisches Laden der Bilder",
"Avatar_changed_successfully" : "Das Profilbild wurde erfolgreich geändert.",
"Avatar_URL" : "URL des Profilbilds",
@ -231,7 +232,9 @@
"is_typing_male" : "schreibt",
"italics" : "kursiv",
"join" : "Beitreten",
"Join_audio_call" : "Anruf beitreiten",
"Join_the_Community" : "Trete der Community bei",
"Join_video_call" : "Videoanruf beitreten",
"Jump_to_first_unread" : "Erste ungelesene Nachricht anzeigen",
"Jump_to_message" : "Diese Nachricht im Chat anzeigen",
"Jump_to_recent_messages" : "Neue Nachricht im Chat anzeigen",
@ -251,6 +254,7 @@
"LDAP" : "LDAP",
"LDAP_Bind_Search" : "Bind-Suche",
"LDAP_Bind_Search_Description" : "Ein Stück von JSON, welches Bind und Verbindungsinformationen regelt, und folgende Form hat: {\"filter\": \"(&(objectCategory=person)(objectclass=user)(memberOf=CN=ROCKET_ACCESS,CN=Users,DC=domain,DC=com)(sAMAccountName=#{username}))\", \"scope\": \"sub\", \"userDN\": \"rocket.service@domain.com\", \"password\": \"urpass\"}",
"LDAP_CA_Cert" : "CA-Cert",
"LDAP_Description" : "LDAP ist ein Frontend zu hierarchischen Datenbanken, die viele Unternehmen nutzen, um eine eine Einmalanmeldung (SSO) zu ermöglichen. Über SSO kann \"ein Benutzer nach einer einmaligen Authentifizierung an einem Arbeitsplatz auf alle Rechner und Dienste, für die er lokal berechtigt ist, am selben Arbeitsplatz zugreifen kann, ohne sich jedes Mal neu anmelden zu müssen\". Genauere Informationen zur Konfiguration von LDAP mit Konfigurationsbeispielen erhalten Sie unter folgendem Link: https://github.com/RocketChat/Rocket.Chat/wiki/LDAP-Authentication",
"LDAP_DN" : "Distinguished Name (DN)",
"LDAP_DN_Description" : "Suche root. Beispiel: dc=domain, dc=com",
@ -258,10 +262,12 @@
"LDAP_Enable_Description" : "LDAP für die Authentifizierung verwenden.",
"LDAP_Port" : "LDAP-Port",
"LDAP_Port_Description" : "Port für den Zugriff auf LDAP. Beispiel: Port 389",
"LDAP_Reject_Unauthorized" : "Unberechtigte ablehnen",
"LDAP_Sync_User_Data" : "Daten synchronisieren",
"LDAP_Sync_User_Data_Description" : "Bei der Anmeldung die Benutzerdaten mit dem Server synchronisieren (Beispiel: Name, E-Mail).",
"LDAP_Sync_User_Data_FieldMap" : "Nutzerdaten-Feldkarte",
"LDAP_Sync_User_Data_FieldMap_Description" : "Konfigurieren Sie, wie Benutzer-Account-Felder (wie die E-Mail-Adresse) aus einem Datensatz (sobald gefunden) in LDAP besiedelt werden. Beispiel: {\"cn\": \"Name\", \"Mail\": \"E-Mail\"} nimmt einen von Menschen lesbaren Namen von dem cn-Attribut und die E-Mail-Adresse vom Mail-Attribut. Verfügbare Felder beinhalten den Namen und die E-Mail-Adresse.",
"LDAP_TLS" : "TLS",
"LDAP_Url" : "LDAP-URL",
"LDAP_Url_Description" : "URL des LDAP-Servers. Beispiel: ldap://company.dns.com",
"Leave_room" : "Raum verlassen",
@ -270,10 +276,12 @@
"Loading..." : "Wird geladen ...",
"Loading_more_from_history" : "Mehr Nachrichten aus dem Verlauf anzeigen",
"Loading_suggestion" : "Vorschläge werden geladen...",
"Logged_out_of_other_clients_successfully" : "Sie wurden erfolgreich von anderen Geräten abgemeldet.",
"Login" : "Anmelden",
"Login_with" : "Anmelden mit %s",
"login_with" : "Oder melden Sie sich direkt mit folgenden Accounts an",
"Logout" : "Abmelden",
"Logout_Others" : "Von anderen Geräten abmelden",
"Make_Admin" : "Benutzer zum Admin ernennen",
"Mark_as_read" : "Als gelesen markieren",
"Markdown_Headers" : "Markdown-Überschriften",
@ -315,6 +323,7 @@
"Msgs" : "Nachrichten",
"multi" : "mehrere",
"Mute_user" : "Benutzern das Chatten verbieten",
"Muted" : "Stumm geschaltet",
"My_Account" : "Mein Konto",
"n_messages" : "%s Nachrichten",
"Name" : "Name",
@ -348,7 +357,7 @@
"Only_you_can_see_this_message" : "Nur Sie können diese Nachricht sehen.",
"Oops!" : "Hoppla",
"Opt_out_statistics" : "Meine anonymen Statistiken nicht an Rocket.Chat senden",
"Opt_out_statistics_warning" : "Indem Sie uns Ihre anonymen Statistiken zur Verfügung stellen, können wir feststellen, wie viele Personen Rocket.Chat installiert haben und wie gut Rocket.Chat funktioniert. Das hilft uns dabei, Rocket.Chat weiterzuentwickeln. Wenn Sie weiterhin anonyme Statistiken an uns senden möchten, deaktivieren Sie bitte das Kontrollkästchen oben. Vielen Dank.",
"Opt_out_statistics_warning" : "Indem Sie uns Ihre anonymen Statistiken zur Verfügung stellen, können wir feststellen, wie viele Personen Rocket.Chat installiert haben und wie gut Rocket.Chat funktioniert. Das hilft uns dabei, Rocket.Chat weiterzuentwickeln. Es werden keine Benutzerinformationen gesendet und die erhaltenen Daten werden vertraulich behandelt. Wenn Sie weiterhin anonyme Statistiken an uns senden möchten, deaktivieren Sie bitte das Kontrollkästchen oben. Vielen Dank.",
"optional" : "optional",
"others" : "andere",
"Password" : "Passwort",
@ -399,8 +408,11 @@
"Remember_me" : "Erinnere mich",
"Remove" : "Entfernen",
"Remove_Admin" : "Admin entfernen",
"Remove_as_moderator" : "Moderatorenrechte entfernen",
"Remove_as_owner" : "als Besitzer entfernen",
"Remove_custom_oauth" : "OAuth-Konto entfernen",
"Remove_from_room" : "Aus dem Raum entfernen",
"Removed" : "Entfernt",
"Reset" : "Zurücksetzen",
"Reset_password" : "Passwort zurücksetzen",
"Restart" : "Neustart",
@ -448,6 +460,8 @@
"Send_invitation_email_warning" : "Um Einladungen per E-Mail zu versenden, müssen Sie zuerst die SMTP-Einstellungen konfigurieren.",
"Send_Message" : "Nachricht senden",
"Send_your_JSON_payloads_to_this_URL" : "Senden Sie Ihre JSON-Nutzlasten an diese URL.",
"Set_as_moderator" : "Zum Moderator ernennen",
"Set_as_owner" : "zum Besitzer machen",
"Settings" : "Einstellungen",
"Settings_updated" : "Die Einstellungen wurden aktualisiert.",
"Should_be_a_URL_of_an_image" : "Dies soll die URL des Bildes sein.",
@ -467,7 +481,9 @@
"SMTP_Test_Button" : "SMTP-Einstellungen testen",
"SMTP_Username" : "SMTP-Benutzername",
"Sound" : "Ton",
"Start_audio_call" : "Anruf starten",
"Start_of_conversation" : "Beginn der Konversation",
"Start_video_call" : "Videoanruf starten",
"Start_with_s_for_user_or_s_for_channel_Eg_s_or_s" : "Starten Sie mit <code class=\"inline\">%s</code> für Nutzer oder <code class=\"inline\">%s</code> für Kanäle. Beispiel: <code class=\"inline\">%s</code> oder <code class=\"inline\">%s</code>",
"Statistics" : "Statistiken",
"Stats_Active_Users" : "Aktive Benutzer",
@ -504,6 +520,8 @@
"The_redirectUri_is_required" : "Es muss eine Weiterleitung-URL angegeben werden.",
"The_server_will_restart_in_s_seconds" : "Der Server wird in %s Sekunden neu gestartet",
"The_setting_s_is_configured_to_s_and_you_are_accessing_from_s" : "Die Einstellung <strong>%s</strong> wurde zu <strong>%s</strong> konfiguriert und Sie greifen von <strong>%s</strong> zu!",
"The_user_will_be_removed_from_s" : "Der Benutzer wird von %s entfernt.",
"The_user_wont_be_able_to_type_in_s" : "Der Benutzer kann nicht mehr in %s schreiben.",
"There_are_no_integrations" : "Es sind keine Integrationen vorhanden.",
"This_is_a_push_test_messsage" : "Dies ist eine Test-Push-Nachricht.",
"True" : "Ja",
@ -522,11 +540,21 @@
"Use_this_username" : "Benutzen Sie folgenden Benutzernamen",
"Use_uploaded_avatar" : "Das hochgeladene Profilbild verwenden",
"Use_url_for_avatar" : "URL für Profilbild verwenden",
"User__username__is_now_a_moderator_of__room_name_" : "Der Benuzer __username__ ist jetzt ein Moderator des Raums __room_name__.",
"User__username__is_now_a_owner_of__room_name_" : "Benutzer __username__ ist jetzt ein Besitzer von __room_name__",
"User__username__removed_from__room_name__moderators" : "Der Benutzer __username__ wurde von einem Moderator aus __room_name__ entfernt.",
"User__username__removed_from__room_name__owners" : "Benutzer __username__ wurde als Besitzer von __room_name__ entfernt.",
"User__username__was_added_as_a_moderator_by__user_by_" : "Der Benuzer <em>__username__</em> wurde von <em>__user_by__</em> als Moderator hinzugefügt.",
"User__username__was_added_as_a_owner_by__user_by_" : "Benutzer <em>__username__</em> wurde von <em>__user_by__</em> als Besitzer hinzugefügt.",
"User__username__was_removed_as_a_moderator_by__user_by_" : "Dem Benutzer <em>__username__</em> wurden die Moderatorenrechte von <em>__user_by__</em> entfernt.",
"User__username__was_removed_as_a_owner_by__user_by_" : "Benutzer <em>__username__</em> wurde von <em>__user_by__</em> als Besitzer entfernt.",
"User_added_by" : "Der Benutzer <em>__user_added__</em> wurde von <em>__user_by__</em> hinzugefügt.",
"User_Channels" : "Benutzerkanäle",
"User_has_been_activated" : "Der Benutzer wurde aktiviert.",
"User_has_been_deactivated" : "Der Benutzer wurde deaktiviert.",
"User_has_been_deleted" : "Der Benutzer wurde gelöscht.",
"User_has_been_muted_in_s" : "Dem Nutzer wurde das Schreiben in %s verboten.",
"User_has_been_removed_from_s" : "Der Benutzer wurde von %s entfernt.",
"User_Info" : "Benutzerinformationen",
"User_is_no_longer_an_admin" : "Der Benutzer ist kein Admin mehr.",
"User_is_not_activated" : "Der Benutzer ist nicht aktiviert.",
@ -565,11 +593,15 @@
"We_have_sent_registration_email" : "Wir haben Ihnen eine Bestätigungsmail gesendet. Wenn Sie keine E-Mail erhalten haben, versuchen Sie es bitte noch einmal.",
"Welcome" : "Willkommen, <em>%s</em>.",
"Welcome_to_the" : "Willkommen bei",
"will_be_able_to" : "wird in der Lage sein,",
"With_whom" : "Mit wem?",
"Yes" : "Ja",
"Yes_clear_all" : "Ja!",
"Yes_delete_it" : "Ja!",
"Yes_mute_user" : "Ja, Benutzer stumm schalten!\n",
"Yes_remove_user" : "Ja, Nutzer entfernen!",
"you_are_in_preview_mode_of" : "Sie befinden sich im Vorschaumodus des Kanals #<strong>__room_name__</strong>.",
"You_are_logged_in_as" : "Sie sind angemeldet als",
"You_can_change_a_different_avatar_too" : "Sie können das aktuell verwendete Profilbild überschreiben, um von dieser Integration zu veröffentlichen.",
"You_can_use_an_emoji_as_avatar" : "Sie können auch einen Emoji als Profilbild verwenden.",
"You_have_been_muted" : "Ihnen wurde das Chatten in diesem Raum verboten. ",

@ -88,6 +88,7 @@
"are_typing" : "are typing",
"Are_you_sure" : "Are you sure?",
"Authorization_URL" : "Authorization URL",
"Authorize" : "Authorize",
"Auto_Load_Images" : "Auto Load Images",
"Avatar_changed_successfully" : "Avatar changed successfully",
"Avatar_URL" : "Avatar URL",
@ -181,6 +182,7 @@
"FileUpload_ProtectFiles" : "Protect uploaded files",
"FileUpload_ProtectFilesDescription" : "Only authenticated users will have access",
"Follow_social_profiles" : "Follow our social profiles, fork us on github and share your thoughts about the rocket.chat app on our trello board.",
"Force_SSL" : "Force SSL",
"Forgot_password" : "Forgot your password",
"Fork_it_on_github" : "Fork it on github",
"From_Email" : "From Email",
@ -231,7 +233,9 @@
"is_typing_male" : "is typing",
"italics" : "italics",
"join" : "Join",
"Join_audio_call" : "Join audio call",
"Join_the_Community" : "Join the Community",
"Join_video_call" : "Join video call",
"Jump_to_first_unread" : "Jump to first unread",
"Jump_to_message" : "Jump to message",
"Jump_to_recent_messages" : "Jump to recent messages",
@ -251,6 +255,7 @@
"LDAP" : "LDAP",
"LDAP_Bind_Search" : "Bind Search",
"LDAP_Bind_Search_Description" : "A piece of JSON that governs bind and connection info and is of the form {\"filter\": \"(&(objectCategory=person)(objectclass=user)(memberOf=CN=ROCKET_ACCESS,CN=Users,DC=domain,DC=com)(sAMAccountName=#{username}))\", \"scope\": \"sub\", \"userDN\": \"rocket.service@domain.com\", \"password\": \"urpass\"}",
"LDAP_CA_Cert" : "CA Cert",
"LDAP_Description" : "LDAP is a hierarchical database that many companies use to provide single sign on - a facility for sharing one password between multiple sites and services. For advanced configuration information and examples, please consult our wiki: https://github.com/RocketChat/Rocket.Chat/wiki/LDAP-Authentication.",
"LDAP_DN" : "Distinguished Name (DN)",
"LDAP_DN_Description" : "Search root; example: dc=domain,dc=com",
@ -258,10 +263,12 @@
"LDAP_Enable_Description" : "Attempt to utilize LDAP for authentication.",
"LDAP_Port" : "LDAP Port",
"LDAP_Port_Description" : "Port to access LDAP on; eg: 389",
"LDAP_Reject_Unauthorized" : "Reject Unauthorized",
"LDAP_Sync_User_Data" : "Sync Data",
"LDAP_Sync_User_Data_Description" : "Keep user data in sync with server on login (eg: name, email).",
"LDAP_Sync_User_Data_FieldMap" : "User Data Field Map",
"LDAP_Sync_User_Data_FieldMap_Description" : "Configure how user account fields (like email) are populated from a record in LDAP (once found). As an example, {\"cn\":\"name\", \"mail\":\"email\"} will choose a person's human readable name from the cn attribute, and their email from the mail attribute. Available fields include name, and email.",
"LDAP_TLS" : "TLS",
"LDAP_Url" : "LDAP URL",
"LDAP_Url_Description" : "URL of the LDAP server; example: ldap://company.dns.com",
"Leave_room" : "Leave room",
@ -270,10 +277,12 @@
"Loading..." : "Loading...",
"Loading_more_from_history" : "Loading more from history",
"Loading_suggestion" : "Loading suggestions...",
"Logged_out_of_other_clients_successfully" : "Logged out of other clients successfully",
"Login" : "Login",
"Login_with" : "Login with %s",
"login_with" : "Or login directly with",
"Logout" : "Logout",
"Logout_Others" : "Logout From Other Logged In Locations",
"Make_Admin" : "Make Admin",
"Mark_as_read" : "Mark as read",
"Markdown_Headers" : "Markdown Headers",
@ -315,6 +324,7 @@
"Msgs" : "Msgs",
"multi" : "multi",
"Mute_user" : "Mute user",
"Muted" : "Muted",
"My_Account" : "My Account",
"n_messages" : "%s messages",
"Name" : "Name",
@ -399,8 +409,11 @@
"Remember_me" : "Remember me",
"Remove" : "Remove",
"Remove_Admin" : "Remove Admin",
"Remove_as_moderator" : "Remove as moderator",
"Remove_as_owner" : "Remove as owner",
"Remove_custom_oauth" : "Remove custom oauth",
"Remove_from_room" : "Remove from room",
"Removed" : "Removed",
"Reset" : "Reset",
"Reset_password" : "Reset password",
"Restart" : "Restart",
@ -448,6 +461,8 @@
"Send_invitation_email_warning" : "In order to send invitation e-mails, you must first configure SMTP settings.",
"Send_Message" : "Send Message",
"Send_your_JSON_payloads_to_this_URL" : "Send your JSON payloads to this URL.",
"Set_as_moderator" : "Set as moderator",
"Set_as_owner" : "Set as owner",
"Settings" : "Settings",
"Settings_updated" : "Settings updated",
"Should_be_a_URL_of_an_image" : "Should be a URL of an image.",
@ -467,7 +482,9 @@
"SMTP_Test_Button" : "Test SMTP Settings",
"SMTP_Username" : "SMTP Username",
"Sound" : "Sound",
"Start_audio_call" : "Start audio call",
"Start_of_conversation" : "Start of conversation",
"Start_video_call" : "Start video call",
"Start_with_s_for_user_or_s_for_channel_Eg_s_or_s" : "Start with <code class=\"inline\">%s</code> for user or <code class=\"inline\">%s</code> for channel. Eg: <code class=\"inline\">%s</code> or <code class=\"inline\">%s</code>",
"Statistics" : "Statistics",
"Stats_Active_Users" : "Active Users",
@ -504,6 +521,8 @@
"The_redirectUri_is_required" : "The redirectUri is required",
"The_server_will_restart_in_s_seconds" : "The server will restart in %s seconds",
"The_setting_s_is_configured_to_s_and_you_are_accessing_from_s" : "The setting <strong>%s</strong> is configured to <strong>%s</strong> and you are accessing from <strong>%s</strong>!",
"The_user_will_be_removed_from_s" : "The user will be removed from %s",
"The_user_wont_be_able_to_type_in_s" : "The user won't be able to type in %s",
"There_are_no_integrations" : "There are no integrations",
"This_is_a_push_test_messsage" : "This is a push test messsage",
"True" : "True",
@ -522,11 +541,21 @@
"Use_this_username" : "Use this username",
"Use_uploaded_avatar" : "Use uploaded avatar",
"Use_url_for_avatar" : "Use url for avatar",
"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__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__was_added_as_a_moderator_by__user_by_" : "User <em>__username__</em> was added as a moderator by <em>__user_by__</em>",
"User__username__was_added_as_a_owner_by__user_by_" : "User <em>__username__</em> was added as a owner by <em>__user_by__</em>",
"User__username__was_removed_as_a_moderator_by__user_by_" : "User <em>__username__</em> was removed as a moderator by <em>__user_by__</em>",
"User__username__was_removed_as_a_owner_by__user_by_" : "User <em>__username__</em> was removed as a owner by <em>__user_by__</em>",
"User_added_by" : "User <em>__user_added__</em> added by <em>__user_by__</em>.",
"User_Channels" : "User Channels",
"User_has_been_activated" : "User has been activated",
"User_has_been_deactivated" : "User has been deactivated",
"User_has_been_deleted" : "User has been deleted",
"User_has_been_muted_in_s" : "User has been muted in %s",
"User_has_been_removed_from_s" : "User has been removed from %s",
"User_Info" : "User Info",
"User_is_no_longer_an_admin" : "User is no longer an admin",
"User_is_not_activated" : "User is not activated",
@ -565,11 +594,15 @@
"We_have_sent_registration_email" : "We have sent you an e-mail to confirm your registration. If you do not receive an e-mail shortly, please come back and try again.",
"Welcome" : "Welcome <em>%s</em>.",
"Welcome_to_the" : "Welcome to the",
"will_be_able_to" : "will be able to",
"With_whom" : "With whom",
"Yes" : "Yes",
"Yes_clear_all" : "Yes, clear all!",
"Yes_delete_it" : "Yes, delete it!",
"Yes_mute_user" : "Yes, mute user!",
"Yes_remove_user" : "Yes, remove user!",
"you_are_in_preview_mode_of" : "You are in preview mode of channel #<strong>__room_name__</strong>",
"You_are_logged_in_as" : "You are logged in as",
"You_can_change_a_different_avatar_too" : "You can override the avatar used to post from this integration.",
"You_can_use_an_emoji_as_avatar" : "You can also use an emoji as an avatar.",
"You_have_been_muted" : "You have been muted and cannot speak in this room",

@ -88,6 +88,7 @@
"are_typing" : "kirjoittavat",
"Are_you_sure" : "Oletko varma?",
"Authorization_URL" : "Valtuutus URL",
"Authorize" : "Valtuuta",
"Auto_Load_Images" : "Lataa kuvat automaattisesti\n",
"Avatar_changed_successfully" : "Avatar vaihdettu onnistuneesti",
"Avatar_URL" : "Avatarin URL",
@ -231,7 +232,9 @@
"is_typing_male" : "kirjoittaa",
"italics" : "kursivoitu",
"join" : "Liity",
"Join_audio_call" : "Liity äänipuheluun",
"Join_the_Community" : "Liity yhteisöön",
"Join_video_call" : "Liity videopuheluun",
"Jump_to_first_unread" : "Siirry ensimmäiseen lukemattomaan",
"Jump_to_message" : "Siirry viestiin",
"Jump_to_recent_messages" : "Siirry viimeisimpiin viestiin",
@ -270,10 +273,12 @@
"Loading..." : "Ladataan...",
"Loading_more_from_history" : "Ladataan lisää historiasta",
"Loading_suggestion" : "Ladataan ehdotuksia...",
"Logged_out_of_other_clients_successfully" : "Muut sessiot kirjattu ulos onnistuneesti",
"Login" : "Kirjaudu",
"Login_with" : "Kirjaudu käyttäen %s",
"login_with" : "tai kirjaudu suoraan",
"Logout" : "Kirjaudu ulos",
"Logout_Others" : "Kirjaa ulos muut sessiot",
"Make_Admin" : "Tee ylläpitäjäksi",
"Mark_as_read" : "Merkitse luetuksi",
"Markdown_Headers" : "Markdown otsikot",
@ -315,6 +320,7 @@
"Msgs" : "Viestit",
"multi" : "monta",
"Mute_user" : "Mykistä käyttäjä",
"Muted" : "Mykistetty",
"My_Account" : "Käyttäjätilini",
"n_messages" : "%s viestiä",
"Name" : "Nimi",
@ -399,8 +405,11 @@
"Remember_me" : "Muista minut",
"Remove" : "Poista",
"Remove_Admin" : "Poista ylläpitäjyys",
"Remove_as_moderator" : "Poista moderaattoristatus",
"Remove_as_owner" : "Poista omistajuus",
"Remove_custom_oauth" : "Poista mukautettu oauth",
"Remove_from_room" : "Poista huoneesta",
"Removed" : "Poistettu",
"Reset" : "Nollaa",
"Reset_password" : "Nollaa salasana",
"Restart" : "Käynnistä uudelleen",
@ -448,6 +457,8 @@
"Send_invitation_email_warning" : "Lähettääksesi sähköpostikutsuja, sinun täytyy ensin tehdä SMTP asetukset.",
"Send_Message" : "Lähetä viesti",
"Send_your_JSON_payloads_to_this_URL" : "Lähetä JSON payload tähän URL-osoitteeseen",
"Set_as_moderator" : "Aseta moderaattoriksi",
"Set_as_owner" : "Aseta omistajaksi",
"Settings" : "Asetukset",
"Settings_updated" : "Asetukset päivitetty",
"Should_be_a_URL_of_an_image" : "Kuvan URL-osoite",
@ -467,7 +478,9 @@
"SMTP_Test_Button" : "Testaa SMTP-asetukset",
"SMTP_Username" : "SMTP Käyttäjätunnus",
"Sound" : "Ääni",
"Start_audio_call" : "Aloita äänipuhelu",
"Start_of_conversation" : "Keskustelun alku",
"Start_video_call" : "Aloita videopuhelu",
"Start_with_s_for_user_or_s_for_channel_Eg_s_or_s" : "Aloita <code class=\"inline\">%s</code> käyttäjänä or <code class=\"inline\">%s</code> kanavana. Esim: <code class=\"inline\">%s</code> tai <code class=\"inline\">%s</code>",
"Statistics" : "Tilastot",
"Stats_Active_Users" : "Aktiivisia käyttäjiä",
@ -504,6 +517,8 @@
"The_redirectUri_is_required" : "Ohjaus URI on pakollinen",
"The_server_will_restart_in_s_seconds" : "Palvelin käynnistyy %s sekunnin kuluttua",
"The_setting_s_is_configured_to_s_and_you_are_accessing_from_s" : "Asetus <strong>%s</strong> on määritelty arvoon <strong>%s</strong> yrität käyttää tätä lähteenä <strong>%s</strong>!",
"The_user_will_be_removed_from_s" : "Käyttäjä poistetaan %s",
"The_user_wont_be_able_to_type_in_s" : "Käyttäjä ei pysty kirjoittamaan %s",
"There_are_no_integrations" : "Ei integraatioita",
"This_is_a_push_test_messsage" : "Tämä on testi-pushviesti",
"True" : "Kyllä",
@ -522,11 +537,21 @@
"Use_this_username" : "Käytä tätä käyttäjänimieä",
"Use_uploaded_avatar" : "Käytä ladattua avataria",
"Use_url_for_avatar" : "Käytä avatar-URLia",
"User__username__is_now_a_moderator_of__room_name_" : "Käyttäjä __username__ on nyt __room_name__ moderaattori",
"User__username__is_now_a_owner_of__room_name_" : "Käyttäjä __username__ on nyt __room_name__ omistaja",
"User__username__removed_from__room_name__moderators" : "Käyttäjän __username__ moderaattoristatus __room_name__  on poistettu",
"User__username__removed_from__room_name__owners" : "Käyttäjä __username__ poistettu __room_name__ omistajista",
"User__username__was_added_as_a_moderator_by__user_by_" : "Käyttäjä <em>__username__</em> on lisätty moderaattoriksi <em>__user_by__</em> toimesta",
"User__username__was_added_as_a_owner_by__user_by_" : "Käyttäjä <em>__username__</em> lisätty <em>__user_by__</em> omistajaksi",
"User__username__was_removed_as_a_moderator_by__user_by_" : "Käyttäjän <em>__username__</em> moderaattoristatus poistettu käyttäjän  <em>__user_by__</em> toimesta",
"User__username__was_removed_as_a_owner_by__user_by_" : "Käyttäjä <em>__username__</em> on poistettu <em>__user_by__</em> omistajista",
"User_added_by" : "Käyttäjä <em>__user_added__</em> lisätty <em>__user_by__</em> toimesta.",
"User_Channels" : "Käyttäjän kanavat",
"User_has_been_activated" : "Käyttäjä on aktivoitu",
"User_has_been_deactivated" : "Käyttäjä on deaktivoitu",
"User_has_been_deleted" : "Käyttäjä on poistettu",
"User_has_been_muted_in_s" : "Käyttäjä on mykistetty %s",
"User_has_been_removed_from_s" : "Käyttäjä on poistettu %s",
"User_Info" : "Käyttäjän tiedot",
"User_is_no_longer_an_admin" : "Käyttäjä ei ole enää ylläpitäjä",
"User_is_not_activated" : "Käyttäjää ei ole aktivoitu",
@ -565,11 +590,15 @@
"We_have_sent_registration_email" : "Lähetimme rekisteröitymisvahvistuksen sähköpostiisi. Mikäli et saanut sähköpostia, yritä uudelleen.",
"Welcome" : "Tervetuloa <em>%s</em>.",
"Welcome_to_the" : "Tervetuloa",
"will_be_able_to" : "mahdollistaa",
"With_whom" : "kanssa",
"Yes" : "Kyllä",
"Yes_clear_all" : "Jep, tyhjennä kaikki!",
"Yes_delete_it" : "Kyllä, poista!",
"Yes_mute_user" : "Kyllä, mykistä käyttäjä!",
"Yes_remove_user" : "Kyllä, poista käyttäjä!",
"you_are_in_preview_mode_of" : "Tämä on kanavan #<strong>__room_name__</strong> esikatselutila",
"You_are_logged_in_as" : "Olet kirjautunut sisään käyttäjänä",
"You_can_change_a_different_avatar_too" : "Voit vaihtaa tähän eri avatarin tätä integraatiota varten",
"You_can_use_an_emoji_as_avatar" : "Voit käyttää myös emojia avatarina.",
"You_have_been_muted" : "Olet mykistetty, et voi puhua tässä huoneessa.",

@ -4,14 +4,33 @@
"Access_Online_Demo" : "צפייה בגרסת ההדגמה",
"Accounts" : "חשבונות",
"Accounts_EmailVerification" : "אימות דוא״ל",
"Accounts_OAuth_Custom_Authorize_Path" : "נתיב אימות",
"Accounts_OAuth_Custom_Button_Color" : "צבע הכפתור",
"Accounts_OAuth_Custom_Button_Label_Color" : "צבע טקסט הכפתור",
"Accounts_OAuth_Custom_Button_Label_Text" : "טקסט הכפתור",
"Accounts_OAuth_Custom_Enable" : "הפעלה",
"Accounts_OAuth_Custom_Identity_Path" : "נתיב הזהות",
"Accounts_OAuth_Custom_Secret" : "סוד",
"Accounts_OAuth_Custom_Token_Path" : "נתיב האסימון",
"Accounts_OAuth_Custom_URL" : "כתובת",
"Accounts_OAuth_Facebook" : "כניסה לפייסבוק",
"Accounts_OAuth_Facebook_id" : "מזהה יישומון פייסבוק",
"Accounts_OAuth_Facebook_secret" : "סוד פייסבוק",
"Accounts_OAuth_Github_id" : "מזהה לקוח",
"Accounts_OAuth_Github_secret" : "סוד לקוח",
"Accounts_OAuth_Google" : "כניסה לגוגל",
"Accounts_OAuth_Google_id" : "מזהה בגוגל",
"Accounts_OAuth_Google_secret" : "סוד גוגל",
"Accounts_OAuth_Linkedin" : "כניסה ל־LinkedIn",
"Accounts_OAuth_Linkedin_id" : "מזהה LinkedIn",
"Accounts_OAuth_Linkedin_secret" : "סוד LinkedIn",
"Accounts_PasswordReset" : "איפוס ססמה",
"Accounts_RegistrationForm" : "טופס הרשמה",
"Accounts_RegistrationForm_Secret_URL" : "כתובת סודית",
"Accounts_RegistrationRequired" : "נדרשת הרשמה",
"Add_Members" : "הוספת חברים",
"Add_users" : "הוספת משתמשים",
"Administration" : "ניהול",
"All_channels" : "כל הערוצים",
"and" : "ו",
"API_Embed" : "הטמעה",
@ -45,6 +64,7 @@
"Confirm_password" : "אימות הססמה",
"Contact" : "יצירת קשר",
"Conversation" : "שיחה",
"Convert_Ascii_Emojis" : "המרת ASCII לאימוג׳י",
"COPY_TO_CLIPBOARD" : "העתקה ללוח הגזירים",
"Create_new" : "יצירת חדש",
"Create_new_direct_message_room" : "יצירת חדר הודעה ישירה חדש",
@ -54,6 +74,8 @@
"days" : "ימים",
"Deleted" : "נמחק!",
"Direct_Messages" : "הודעות ישירות",
"Disable_New_Message_Notification" : "נטרול התרעת הודעה חדשה",
"Disable_New_Room_Notification" : "נטרול התרעת חדר חדש",
"Drop_to_upload_file" : "יש להשליך לכאן כדי להעלות קובץ",
"Duplicate_channel_name" : "כבר קיים ערוץ בשם ‚%s‘",
"Duplicate_private_group_name" : "כבר קיימת קבוצה פרטית בשם ‚%s‘",
@ -75,6 +97,7 @@
"General" : "כללי",
"Get_to_know_the_team" : "היכרות עם הצוות שמאחורי Rocket.Chat",
"github_no_public_email" : "אין לך אף כתובת דוא״ל פומבית בחשבון ה־GitHub שלך",
"Has_more" : "יש עוד",
"Have_your_own_chat" : "קח את העניינים לידיים. האפליקציה Rocket.Chat, ש",
"Hide_room" : "להסתיר את החדר",
"History" : "היסטוריה",
@ -101,8 +124,13 @@
"Jump_to_recent_messages" : "מעבר להודעות האחרונות",
"Language" : "שפה",
"Language_Version" : "גרסה אנגלית",
"Last_login" : "כניסה אחרונה",
"Last_message" : "ההודעה האחרונה",
"Layout" : "פריסה",
"Layout_Home_Body" : "גוף עמוד הבית",
"Layout_Home_Title" : "כותרת עמוד הבית",
"Layout_Login_Header" : "כותרת כניסה",
"Layout_Login_Terms" : "תנאי כניסה",
"Layout_Privacy_Policy" : "מדיניות פרטיות",
"Layout_Terms_of_Service" : "תנאי השירות",
"LDAP" : "LDAP",
@ -112,18 +140,23 @@
"Leave_room" : "לעזוב את החדר",
"line" : "שורה",
"Load_more" : "טעינת נוספים",
"Loading..." : "בטעינה…",
"Loading_more_from_history" : "הודעות נוספות נטענות מההיסטוריה",
"Loading_suggestion" : "ההצעות נטענות…",
"Login" : "התחברות",
"Login_with" : "כניסה עם %s",
"login_with" : "או להיכנס ישירות עם",
"Logout" : "יציאה",
"Mark_as_read" : "סימון כנקרא",
"Members" : "חברים",
"Members_List" : "רשימת חברים",
"Members_placeholder" : "חברים",
"Message" : "הודעה",
"Message_AllowDeleting" : "לאפשר מחיקת הודעות",
"Message_AllowEditing" : "לאפשר עריכת הודעות",
"Message_KeepHistory" : "שמירה על היסטוריית הודעות",
"Message_MaxAllowedSize" : "גודל ההודעה המרבי המותר",
"Message_removed" : "ההודעה הוסרה",
"Message_ShowDeletedStatus" : "הצגת מצב מחיקה",
"Message_ShowEditedStatus" : "הצגת מצב ערוך",
"Meta_language" : "שפה",
@ -152,6 +185,7 @@
"Notify_all_in_this_room" : "להודיע לכל מי שבחדר",
"Online" : "מחובר",
"Oops!" : "אופס",
"Opt_out_statistics" : "לא לשלוח את הסטטיסטיקה שלי ל־Rocket.Chat",
"others" : "אחרים",
"Password" : "ססמה",
"Password_changed_successfully" : "הססמה הוחלפה בהצלחה",
@ -167,6 +201,7 @@
"Profile_saved_successfully" : "הפרופיל נשמר בהצלחה",
"Proudly_developed" : "פותח בגאווה עם Meteor",
"Push" : "דחיפה",
"Push_debug" : "ניפוי שגיאות",
"Push_enable_gateway" : "הפעלת שער גישה",
"Push_gateway" : "שער גישה",
"Push_test_push" : "בדיקה",
@ -183,6 +218,7 @@
"Room" : "חדר",
"Room_name_changed" : "שם החדר שונה ל: <em>__room_name__</em> על ידי המשתמש <em>__user_by__</em>",
"Room_name_changed_successfully" : "שם החדר שונה בהצלחה",
"room_user_count" : "משתמשי %s",
"Rooms" : "חדרים",
"SAML" : "SAML",
"Save_changes" : "שמירת השינויים",
@ -201,21 +237,29 @@
"Send_confirmation_email" : "שליחת דוא״ל אימות",
"Send_Message" : "שליחת הודעה",
"Settings" : "הגדרות",
"Settings_updated" : "ההגדרות עודכנו",
"Showing_online_users" : "מציג <b>__total_online__</b> מתוך __total__ משתמשים",
"Showing_results" : "<p>מוצגות <b>%s</b> תוצאות</p>",
"Silence" : "השתקה",
"since_creation" : "מאז %s",
"Site_Name" : "שם האתר",
"SMTP" : "SMTP",
"SMTP_Host" : "מארח ",
"SMTP_Password" : "ססמה ל־",
"SMTP_Port" : "פתחת SMTP",
"SMTP_Username" : "שם משתמש ב־SMTP",
"Sound" : "שמע",
"Start_of_conversation" : "התחלת השיחה",
"Statistics" : "סטטיסטיקה",
"Stats_Away_Users" : "משתמשים שאינם נמצאים",
"Stats_Total_Messages" : "סך כל ההודעות",
"strike" : "מחוק",
"Submit" : "שליחה",
"Success" : "הצליח",
"The_channel_name_is_required" : "שם הערוץ נדרש",
"The_field_is_required" : "השדה %s הוא חובה.",
"The_server_will_restart_in_s_seconds" : "השרת יפעיל את עצמו מחדש בעוד ",
"Upload_file_question" : "להעלות קובץ?",
"Use_Emojis" : "שימוש באימוג׳י",
"Use_initials_avatar" : "שימוש בראשי התיבות של שם המשתמש שלך",
"use_menu" : "ניתן להשתמש בתפריט הצד כדי לגשת לחדרים ולצ׳אטים שלך.",
@ -223,6 +267,8 @@
"Use_this_username" : "יש להשתמש בשם המשתמש הזה",
"Use_uploaded_avatar" : "שימוש בתמונה שהועלתה",
"User_added_by" : "המשתמש <em>__user_added__</em> נוסף על ידי <em>__user_by__</em>",
"User_has_been_activated" : "המשתמש הופעל",
"User_has_been_deactivated" : "המשתמש נוטרל",
"User_joined_channel" : "הצטרף לערוץ.",
"User_joined_channel_female" : "הצטרפה לערוץ.",
"User_joined_channel_male" : "הצטרף לערוץ.",

@ -230,6 +230,7 @@
"Remove" : "Makni",
"Remove_Admin" : "Makni Administratora",
"Remove_from_room" : "Uklonite iz sobe",
"Removed" : "Uklonjeno",
"Reset_password" : "Resetiraj lozinku",
"Room" : "Soba",
"Room_archived" : "Soba je arhivirana",

@ -326,6 +326,7 @@
"Remove" : "삭제",
"Remove_Admin" : "관리자 권한 제거",
"Remove_custom_oauth" : "사용자 정의 OAuth 제거",
"Removed" : "제거됨",
"Reset_password" : "암호 재설정",
"Restart" : "재시작",
"Room" : "방",

@ -334,6 +334,7 @@
"Remove_Admin" : "Verwijder Admin",
"Remove_custom_oauth" : "Verwijder aangepaste OAuth",
"Remove_from_room" : "Verwijderen uit de kamer",
"Removed" : "Verwijderd",
"Reset" : "Reset",
"Reset_password" : "Reset Wachtwoord",
"Restart" : "Herstart",

@ -59,7 +59,7 @@
"Accounts_RegistrationForm_SecretURL" : "Sekretny adres URL formularza rejestracyjnego",
"Accounts_RegistrationRequired" : "Musisz się zarejestrować",
"Accounts_RequireNameForSignUp" : "Wymagaj podana nazwy podczas rejestracji",
"Accounts_ShowFormLogin" : "Pokaż Formularz logowania",
"Accounts_ShowFormLogin" : "Pokaż formularz logowania",
"Activate" : "Aktywuj",
"Add_custom_oauth" : "Dodaj własne OAuth",
"Add_Members" : "Dodaj członków",
@ -74,6 +74,7 @@
"API_Embed" : "Osadź",
"API_EmbedDisabledFor" : "Wyłącz osadzanie dla użytkowników",
"API_EmbedDisabledFor_Description" : "Lista użytkowników oddzielonych przecinkami",
"Archive" : "Archiwizuj",
"are_also_typing" : "również piszą",
"are_typing" : "piszą",
"Are_you_sure" : "Jesteś pewny?",
@ -86,6 +87,7 @@
"Away_female" : "Zaraz wracam",
"away_male" : "zaraz wracam",
"Away_male" : "Zaraz wracam",
"Back_to_integrations" : "Powrót do integracji",
"Back_to_login" : "Wróć do strony logowania",
"bold" : "pogrubienie",
"busy" : "zajęty",
@ -110,6 +112,7 @@
"Contact" : "Kontakt",
"Conversation" : "Rozmowa",
"Convert_Ascii_Emojis" : "Konwertuj ASCII do Emoji",
"COPY_TO_CLIPBOARD" : "SKOPIUJ DO SCHOWKA",
"Create_new" : "Utwórz",
"Create_new_direct_message_room" : "Nowa prywatna rozmowa",
"Create_new_private_group" : "Utwórz prywatną grupę",
@ -141,6 +144,7 @@
"Enable_Desktop_Notifications" : "Włącz powiadomienia na pulpicie",
"Enter_info" : "Podaj swoje dane",
"Enter_to" : "Naciśnij Enter: ",
"Error" : "Błąd",
"Error_changing_password" : "Błąd zmiany hasła",
"Error_too_many_requests" : "Błąd, zbyt wiele żądań. Proszę zwolnij. Musisz poczekać %s sekund zanim spróbujesz ponownie",
"Esc_to" : "Naciśnij Esc: ",
@ -166,13 +170,18 @@
"hours" : "godzin",
"Incorrect_Password" : "Hasło jest nieprawidłowe",
"inline_code" : "kod",
"Install_Extension" : "Zainstaluj rozszerzenie",
"Install_FxOs" : "Zainstaluj Rocket.Chat w Firefoksie",
"Install_FxOs_done" : "Świetnie! Możesz teraz włączać Rocket.Chat poprzez ikonę na ekranie głównym. Życzymy miłego korzystania z Rocket.Chat!",
"Install_FxOs_error" : "Niestety, coś nie zadziałało! Wystąpił następujący błąd:",
"Install_FxOs_follow_instructions" : "Potwierdź instalowanie aplikacji na twoim urządzeniu (gdy wyskoczy pytanie naciśnij przycisk \"Zainstaluj\").",
"Integration_New" : "Nowy Integracja",
"Integrations" : "Integracje",
"Invalid_confirm_pass" : "Podane hasła nie są jednakowe",
"Invalid_email" : "E-mail jest nieprawidłowy",
"Invalid_file_height" : "Nieprawidłowa wysokość pliku",
"Invalid_file_type" : "Nieprawidłowy typ pliku",
"Invalid_file_width" : "Nieprawidłowa szerokość pliku",
"Invalid_name" : "Nazwa nie może być pusta",
"Invalid_pass" : "Hasło nie może być puste",
"Invalid_room_name" : "<strong>%s</strong> nie jest poprawną nazwą pokoju, <br / >użyj tylko liter, cyfr i myślników",
@ -191,6 +200,8 @@
"italics" : "kursywa",
"join" : "Dołącz",
"Join_the_Community" : "Dołącz do społeczności",
"Jump_to_first_unread" : "Przejdź do pierwszej nieprzeczytanej",
"Jump_to_recent_messages" : "Przejdź do ostatnich wiadomości",
"Language" : "Język",
"Language_Version" : "Wersja angielska",
"Last_login" : "Ostatnie logowanie",
@ -270,6 +281,7 @@
"Name" : "Nazwa",
"Name_cant_be_empty" : "Nazwa nie może być pusta",
"Name_optional" : "Nazwa (opcjonalnie)",
"New_integration" : "Nowa integracja",
"New_messages" : "Nowe wiadomości",
"New_password" : "Nowe hasło",
"No_channel_with_name_%s_was_found" : "Nie odnaleziono kanału o nazwie <strong>\"%s\"</strong>!",
@ -293,6 +305,7 @@
"Oops!" : "Ups",
"Opt_out_statistics" : "Nie wysyłaj statystyk do autorów Rocket.Chat",
"Opt_out_statistics_warning" : "Przesyłając swoje statystyki pomagasz nam określić jak instalacji Rocket.Chat jest w użyciu i jak dobrze sprawuje się nasza aplikacja, co pozwala nam ją wciąż ulepszać. Nie przesyłamy żadnych informacji o użytkownikach, a wszystkie otrzymane informacje są traktowane jako poufne. Jeśli chcesz nadal przesyłać nam statystyki, odznacz powyższe pole. Dziękujemy.",
"optional" : "opcjonalne",
"others" : "inni",
"Password" : "Hasło",
"Password_Change_Disabled" : "Administrator czatu wyłączył możliwość zmiany haseł",
@ -329,14 +342,19 @@
"quote" : "cytat",
"Recents" : "Najnowsze",
"Record" : "Nagrywaj",
"Refresh_your_page_after_install_to_enable_screen_sharing" : "Odśwież stronę po instalacji, aby umożliwić dzielenie ekranu",
"Register" : "Zarejestruj nowe konto",
"Registration_Succeeded" : "Rejestracja zakończona",
"Remember_me" : "Zapamiętaj mnie",
"Remove" : "Usuń",
"Remove_Admin" : "Zabierz Admina",
"Remove_custom_oauth" : "Usuń własne OAuth",
"Removed" : "Usunięto",
"Reset_password" : "Zresetuj hasło",
"Restart" : "Uruchom ponownie",
"Restart_the_server" : "Uruchom serwer ponownie",
"Room" : "Pokój",
"Room_archived" : "Pokój zarchiwizowany",
"Room_name_changed" : "Nazwa pokoju zmieniona na: <em>__room_name__</em>przez <em>__user_by__</em>",
"Room_name_changed_successfully" : "Nazwa pokoju zmieniona",
"Room_not_found" : "Nie odnaleziono pokoju",
@ -353,6 +371,7 @@
"SAML_Custom_Provider" : "Własny dostawca (provider)",
"Save_changes" : "Zapisz zmiany",
"Save_Mobile_Bandwidth" : "Oszczędzaj przepustowość",
"Screen_Share" : "Współdzielenie ekranu",
"Search" : "Szukaj",
"Search_Messages" : "Przeszukaj wiadomości",
"Search_settings" : "Przeszukaj ustawienia",
@ -414,8 +433,11 @@
"Stop_Recording" : "Zatrzymaj nagrywanie",
"strike" : "przekreślenie",
"Submit" : "Prześlij",
"Success" : "Sukces",
"The_field_is_required" : "Pole %s jest wymagane.",
"The_server_will_restart_in_s_seconds" : "Serwer zostanie ponownie uruchomiony za %s sekund",
"True" : "Tak",
"Type_your_new_password" : "Wprowadź nowe hasło",
"Unnamed" : "Anonimowy",
"Unread_Rooms" : "Nieprzeczytane pokoje",
"Unread_Rooms_Mode" : "Tryb nieprzeczytanych pokoi",
@ -468,6 +490,7 @@
"Yes_delete_it" : "Tak, usuń to!",
"you_are_in_preview_mode_of" : "Jesteś w trybie podglądu kanału # <strong>__room_name__</strong>",
"You_need_confirm_email" : "Aby się zalogować musisz potwierdzić swój adres e-mail!",
"You_need_install_an_extension_to_allow_screen_sharing" : "Musisz zainstalować rozszerzenie, aby umożliwić dzielenie ekranu",
"You_will_not_be_able_to_recover" : "Nie będziesz w stanie odzyskać tej wiadomości!",
"Your_entry_has_been_deleted" : "Twój wpis został usunięty.",
"Your_Open_Source_solution" : "Twój własny czat Open Source"

@ -66,6 +66,7 @@
"are_also_typing" : "também estão digitando",
"are_typing" : "estão digitando",
"Are_you_sure" : "Você tem certeza?",
"Authorize" : "Autorizar",
"Auto_Load_Images" : "Auto Carregar Imagens",
"Avatar_changed_successfully" : "Avatar alterado com sucesso",
"Avatar_url_invalid_or_error" : "A URL fornecida é inválida ou não acessível. Por favor tente novamente, mas com uma url diferente.",
@ -317,6 +318,7 @@
"Remove" : "Remover",
"Remove_Admin" : "Remover Administrador",
"Remove_custom_oauth" : "Remover oauth customizado",
"Removed" : "Removido",
"Reset_password" : "Resetar senha",
"Restart" : "Reiniciar",
"Restart_the_server" : "Reiniciar o servidor",
@ -448,11 +450,13 @@
"We_have_sent_registration_email" : "Nós lhe enviamos um e-mail para confirmar o seu registro. Se você não receber um e-mail em breve, por favor retorne e tente novamente.",
"Welcome" : "Seja bem-vindo <em>%s</em>.",
"Welcome_to_the" : "Bem-vindo ao",
"will_be_able_to" : "poderá",
"With_whom" : "Com quem",
"Yes" : "Sim",
"Yes_clear_all" : "Sim, limpar tudo!",
"Yes_delete_it" : "Sim, exclua!",
"you_are_in_preview_mode_of" : "Esta é uma prévia do canal #<strong>__room_name__</strong>",
"You_are_logged_in_as" : "Vocês está logado como",
"You_need_confirm_email" : "Você precisa confirmar seu email para logar!",
"You_will_not_be_able_to_recover" : "Você não será capaz de desfazer!",
"Your_entry_has_been_deleted" : "Sua mensagem foi excluída.",

@ -2,6 +2,7 @@
"Access_not_authorized" : "Acces neautorizat",
"Access_online_demo" : "Accesați demo on-line",
"Access_Online_Demo" : "Accesati Demo Online",
"Access_Token_URL" : "Acces Token URL",
"Accounts" : "Conturi",
"Accounts_AllowedDomainsList" : "Listă domenii permise",
"Accounts_AllowedDomainsList_Description" : "Lista separată cu virgule a domeniilor acceptate",
@ -86,6 +87,8 @@
"are_also_typing" : "tastează",
"are_typing" : "tastează",
"Are_you_sure" : "Sigur doriți asta?",
"Authorization_URL" : "URL de autorizare",
"Authorize" : "Autorizează",
"Auto_Load_Images" : "Auto-încarcă imagini",
"Avatar_changed_successfully" : "Avatar schimbat cu succes",
"Avatar_URL" : "URL Avatar ",
@ -229,7 +232,9 @@
"is_typing_male" : "tastează",
"italics" : "cursive",
"join" : "Alăturați-vă",
"Join_audio_call" : "Intră în apel audio",
"Join_the_Community" : "Intrați în comunitate",
"Join_video_call" : "Intră în apel video",
"Jump_to_first_unread" : "Salt la primul mesaj necitit",
"Jump_to_message" : "Salt la mesaj",
"Jump_to_recent_messages" : "Salt la mesajele recente",
@ -268,10 +273,12 @@
"Loading..." : "Se încarcă...",
"Loading_more_from_history" : "Se încarcă mai multe din istoric",
"Loading_suggestion" : "Se încarcă sugestii...",
"Logged_out_of_other_clients_successfully" : "Delogat cu succes din alți clienți",
"Login" : "Autentificare",
"Login_with" : "Autentifică-te cu %s",
"login_with" : "Sau conectare direct cu",
"Logout" : "Ieșire",
"Logout_Others" : "Delogare din celelalte locații",
"Make_Admin" : "Fă utilizator de tip Admin",
"Mark_as_read" : "Marchează ca citit",
"Markdown_Headers" : "Markdown Headers",
@ -313,6 +320,7 @@
"Msgs" : "Mesaje",
"multi" : "multi",
"Mute_user" : "Blochează mesajele utilizatorului",
"Muted" : "Silențios",
"My_Account" : "Contul meu",
"n_messages" : "%s mesaje",
"Name" : "Nume",
@ -397,8 +405,11 @@
"Remember_me" : "Ține-mă minte",
"Remove" : "Elimină",
"Remove_Admin" : "Eliminați utilizator de tip Admin",
"Remove_as_moderator" : "Eliminați ca moderator",
"Remove_as_owner" : "Eliminați ca proprietar",
"Remove_custom_oauth" : "Eliminați OAuth personalizat",
"Remove_from_room" : "Eliminați din cameră",
"Removed" : "Eliminat",
"Reset" : "Reset",
"Reset_password" : "Resetează parola",
"Restart" : "Repornire",
@ -446,6 +457,8 @@
"Send_invitation_email_warning" : "Pentru a trimite invitații e-mail, trebuie să configurați mai întâi setările SMTP.",
"Send_Message" : "Trimite mesaj",
"Send_your_JSON_payloads_to_this_URL" : "Trimiteți JSON către această adresă URL.",
"Set_as_moderator" : "Setați ca moderator",
"Set_as_owner" : "Setați ca proprietar",
"Settings" : "Setări",
"Settings_updated" : "Setări actualizare",
"Should_be_a_URL_of_an_image" : "Ar trebui să fie o adresă URL a unei imagini.",
@ -465,7 +478,9 @@
"SMTP_Test_Button" : "Setări SMTP de testare",
"SMTP_Username" : "Nume de utilizator SMTP ",
"Sound" : "Sunet",
"Start_audio_call" : "Pornește apel audio",
"Start_of_conversation" : "Începutul conversației",
"Start_video_call" : "Pornește apel video",
"Start_with_s_for_user_or_s_for_channel_Eg_s_or_s" : "Începe cu <code class=\"inline\">%s</code> pentru utilizator sau <code class=\"inline\">%s</code> pentru canal. Ex: <code class=\"inline\">%s</code> sau <code class=\"inline\">%s</code>",
"Statistics" : "Statistici",
"Stats_Active_Users" : "Utilizatori activi",
@ -502,6 +517,8 @@
"The_redirectUri_is_required" : "URI de redirectare este necesar",
"The_server_will_restart_in_s_seconds" : "Serverul va reporni în %s secunde",
"The_setting_s_is_configured_to_s_and_you_are_accessing_from_s" : "Setarea <strong>%s</strong> e configurată să <strong>%s</strong> iar dumneavoastră accesați din <strong>%s</strong>!",
"The_user_will_be_removed_from_s" : "Utilizatorul va fi eliminat din %s",
"The_user_wont_be_able_to_type_in_s" : "Utilizatorul nu va putea să introducă text în %s",
"There_are_no_integrations" : "Nu sunt integrări",
"This_is_a_push_test_messsage" : "Acesta este un test de notificare Push",
"True" : "Adevărat",
@ -520,11 +537,21 @@
"Use_this_username" : "Folosiți acest nume de utilizator",
"Use_uploaded_avatar" : "Utilizați avatar încărcat",
"Use_url_for_avatar" : "Utilizați URL pentru avatar",
"User__username__is_now_a_moderator_of__room_name_" : "Utilizator __username__  este acum un moderator al __room_name__",
"User__username__is_now_a_owner_of__room_name_" : "Utilizatorul __username__ este acum proprietar al  __room_name__",
"User__username__removed_from__room_name__moderators" : "Utilizatorul __username__ a fost eliminat din moderatorii  __room_name__",
"User__username__removed_from__room_name__owners" : "Utilizatorul __username__ scos din proprietarii __room_name__",
"User__username__was_added_as_a_moderator_by__user_by_" : "Utilizatorul <em>__username__</em> a fost adăugat ca moderator de către <em>__user_by__</em>",
"User__username__was_added_as_a_owner_by__user_by_" : "Utilizatorul <em>__username__</em> a fost adăugat ca proprietar de către <em>__user_by__</em>",
"User__username__was_removed_as_a_moderator_by__user_by_" : "Utilizatorul <em>__username__</em> a fost scos ca moderator de către <em>__user_by__</em>",
"User__username__was_removed_as_a_owner_by__user_by_" : "Utilizatorul <em>__username__</em> a fost eliminat ca proprietar de către <em>__user_by__</em>",
"User_added_by" : "Utilizator <em>__user_added__</em> adăugat de către <em>__user_by__</em>.",
"User_Channels" : "Canale utilizator",
"User_has_been_activated" : "Utilizatorul a fost activat",
"User_has_been_deactivated" : "Utilizator a fost dezactivat",
"User_has_been_deleted" : "Utilizatorul a fost șters",
"User_has_been_muted_in_s" : "Utilizator a fost oprit în %s",
"User_has_been_removed_from_s" : "Utilizator a fost eliminat din %s",
"User_Info" : "Info utilizator",
"User_is_no_longer_an_admin" : "Utilizatorul nu mai este Admin",
"User_is_not_activated" : "Utilizatorul nu este activat",
@ -563,11 +590,15 @@
"We_have_sent_registration_email" : "V-am trimis un e-mail pentru a confirma înregistrarea dumneavoastră. Dacă nu primiți un e-mail în scurt timp, vă rugăm să reveniți și să încercați din nou.",
"Welcome" : "Bun venit <em>%s</em>.",
"Welcome_to_the" : "Bun venit în",
"will_be_able_to" : "va putea",
"With_whom" : "Cu cine",
"Yes" : "Da",
"Yes_clear_all" : "Da, șterge toate!",
"Yes_delete_it" : "Da, șterge-l!",
"Yes_mute_user" : "Da, blochează mesajele utilizatorului",
"Yes_remove_user" : "Da, eliminați utilizatorul!",
"you_are_in_preview_mode_of" : "Vă aflați în modul de previzualizare a canalului #",
"You_are_logged_in_as" : "Sunteți autentificat ca ",
"You_can_change_a_different_avatar_too" : "Puteți înlocui avatarul folosit pentru a posta din această integrare.",
"You_can_use_an_emoji_as_avatar" : "Puteți utiliza un emoji ca avatar",
"You_have_been_muted" : "Ați fost blocat și nu puteți vorbi în această cameră",

@ -54,74 +54,21 @@ RocketChat.API.v1.addRoute 'chat.messageExamples', authRequired: true,
# Send Channel Message
RocketChat.API.v1.addRoute 'chat.postMessage', authRequired: true,
post: ->
channel = @bodyParams.channel
channelType = channel[0]
channel = channel.substr(1)
switch channelType
when '#'
room = RocketChat.models.Rooms.findOne
$or: [
{_id: channel}
{name: channel}
]
if not room?
return RocketChat.API.v1.failure 'invalid-channel'
rid = room._id
if room.t is 'c'
Meteor.runAsUser @userId, ->
Meteor.call 'joinRoom', room._id
when '@'
roomUser = RocketChat.models.Users.findOne
$or: [
{_id: channel}
{username: channel}
]
if not roomUser?
return RocketChat.API.v1.failure 'invalid-channel'
rid = [@useId, roomUser._id].sort().join('')
room = RocketChat.models.Rooms.findOne(rid)
if not room
Meteor.runAsUser @userId, ->
Meteor.call 'createDirectMessage', roomUser.username
room = RocketChat.models.Rooms.findOne(rid)
else
return RocketChat.API.v1.failure 'invalid-channel-type'
message =
alias: @bodyParams.username or @bodyParams.alias
msg: _.trim(@bodyParams.text or @bodyParams.msg or '')
attachments: @bodyParams.attachments
parseUrls: false
bot:
try
@bodyParams.bot =
u: @userId
groupable: false
if @bodyParams.icon_url? or @bodyParams.avatar?
message.avatar = @bodyParams.icon_url or @bodyParams.avatar
else if @bodyParams.icon_emoji? or @bodyParams.emoji?
message.emoji = @bodyParams.icon_emoji or @bodyParams.emoji
if _.isArray message.attachments
for attachment in message.attachments
if attachment.msg
attachment.text = _.trim(attachment.msg)
delete attachment.msg
messageReturn = processWebhookMessage @bodyParams, @user
message = RocketChat.sendMessage @user, message, room, {}
return RocketChat.API.v1.success
ts: Date.now()
channel: channel
message: message
if not messageReturn?
return RocketChat.API.v1.failure 'unknown-error'
return RocketChat.API.v1.success
ts: Date.now()
channel: messageReturn.channel
message: messageReturn.message
catch e
return RocketChat.API.v1.failure e.error
# Set Channel Topic
RocketChat.API.v1.addRoute 'channels.setTopic', authRequired: true,

@ -2,6 +2,14 @@
"dependencies": {
"image-size": {
"version": "0.4.0"
},
"mime-types": {
"version": "2.1.9",
"dependencies": {
"mime-db": {
"version": "1.21.0"
}
}
}
}
}

@ -20,7 +20,8 @@ Package.onUse(function(api) {
});
Npm.depends({
"image-size": "0.4.0"
"image-size": "0.4.0",
"mime-types": "2.1.9"
});
Package.onTest(function(api) {

@ -1,5 +1,5 @@
sizeOf = Npm.require 'image-size'
mime = Npm.require 'mime-types'
@RocketChatAssetsInstance = new RocketChatFile.GridFS
name: 'assets'
@ -11,8 +11,7 @@ assets =
defaultUrl: 'favicon.ico?v=3'
constraints:
type: 'image'
contentType: 'image/vnd.microsoft.icon'
extention: 'ico'
extension: 'ico'
width: undefined
height: undefined
'favicon.svg':
@ -20,8 +19,7 @@ assets =
defaultUrl: '/images/logo/icon.svg?v=3'
constraints:
type: 'image'
contentType: 'image/svg+xml'
extention: 'svg'
extension: 'svg'
width: undefined
height: undefined
'favicon_64.png':
@ -29,8 +27,7 @@ assets =
defaultUrl: 'images/logo/favicon-64x64.png?v=3'
constraints:
type: 'image'
contentType: 'image/png'
extention: 'png'
extension: 'png'
width: 64
height: 64
'favicon_96.png':
@ -38,8 +35,7 @@ assets =
defaultUrl: 'images/logo/favicon-96x96.png?v=3'
constraints:
type: 'image'
contentType: 'image/png'
extention: 'png'
extension: 'png'
width: 96
height: 96
'favicon_128.png':
@ -47,8 +43,7 @@ assets =
defaultUrl: 'images/logo/favicon-128x128.png?v=3'
constraints:
type: 'image'
contentType: 'image/png'
extention: 'png'
extension: 'png'
width: 128
height: 128
'favicon_192.png':
@ -56,8 +51,7 @@ assets =
defaultUrl: 'images/logo/android-chrome-192x192.png?v=3'
constraints:
type: 'image'
contentType: 'image/png'
extention: 'png'
extension: 'png'
width: 192
height: 192
'favicon_256.png':
@ -65,8 +59,7 @@ assets =
defaultUrl: 'images/logo/favicon-256x256.png?v=3'
constraints:
type: 'image'
contentType: 'image/png'
extention: 'png'
extension: 'png'
width: 256
height: 256
@ -104,8 +97,8 @@ Meteor.methods
if not assets[asset]?
throw new Meteor.Error "Invalid_asset"
if contentType isnt assets[asset].constraints.contentType
throw new Meteor.Error "Invalid_file_type"
if mime.extension(contentType) isnt assets[asset].constraints.extension
throw new Meteor.Error "Invalid_file_type", contentType
file = new Buffer(binaryContent, 'binary')

@ -2,7 +2,6 @@
"Add_user" : "إضافة مستخدم",
"Back_to_permissions" : "العودة إلى التصريحات",
"Permissions" : "التصريحات",
"Removed" : "تمت اﻹزالة",
"Saving" : "جاري الحفظ",
"User_added" : "وأضاف العضو <em>__user_added__</em>.",
"User_not_found" : "لم يتم العثور على المستخدم",

@ -5,7 +5,6 @@
"Cannot_delete_role_because_its_in_use" : "Die Rolle kann nicht gelöscht werden, da sie gerade verwendet wird.",
"New_role" : "Neue Rolle",
"Permissions" : "Berechtigungen",
"Removed" : "Entfernt",
"Role" : "Rolle",
"Role_Editing" : "Rolle bearbeiten",
"Role_removed" : "Die Rolle wurde entfernt.",

@ -5,7 +5,6 @@
"Cannot_delete_role_because_its_in_use" : "Cannot delete role because it's in use",
"New_role" : "New role",
"Permissions" : "Permissions",
"Removed" : "Removed",
"Role" : "Role",
"Role_Editing" : "Role Editing",
"Role_removed" : "Role removed",

@ -5,7 +5,6 @@
"Cannot_delete_role_because_its_in_use" : "Et voi poistaa roolia, koska se on käytössä",
"New_role" : "Uusi rooli",
"Permissions" : "Oikeudet",
"Removed" : "Poistettu",
"Role" : "Rooli",
"Role_Editing" : "Roolin muokkaaminen",
"Role_removed" : "Rooli poistettu",

@ -2,7 +2,6 @@
"Add_user" : "Dodaj korisnika",
"Back_to_permissions" : "Povratak na dozvole",
"Permissions" : "Dopuštenja",
"Removed" : "Uklonjeno",
"Role" : "Uloga",
"Saving" : "Spremanje",
"There_are_no_users_in_this_role" : "Nema korisnika u toj ulozi.",

@ -2,7 +2,6 @@
"Add_user" : "사용자 추가",
"New_role" : "새로운 역할",
"Permissions" : "권한",
"Removed" : "제거됨",
"Saving" : "저장 중",
"User_added" : "사용자 추가함.",
"User_not_found" : "사용자를 찾을 수 없음",

@ -5,7 +5,6 @@
"Cannot_delete_role_because_its_in_use" : "Kan rol niet verwijderen omdat het in gebruik is",
"New_role" : "Nieuwe rol",
"Permissions" : "Machtigingen",
"Removed" : "Verwijderd",
"Role" : "Rol",
"Role_Editing" : "Rol bewerken",
"Role_removed" : "Rol verwijderd",

@ -3,10 +3,11 @@
"Back_to_permissions" : "Powrót do uprawnień",
"New_role" : "Nowa rola",
"Permissions" : "Uprawnienia",
"Removed" : "Usunięto",
"Role" : "Rola",
"Role_Editing" : "Edycja ról",
"Role_removed" : "Rola usunięta",
"Saving" : "Zapisywanie",
"There_are_no_users_in_this_role" : "Ta rola nie ma przypisanych użytkowników.",
"User_added" : "Użytkownik <em>__user_added__</em> dodany.",
"User_not_found" : "Użytkownik nie znaleziony",
"User_removed" : "Użytkownik usunięty"

@ -5,7 +5,6 @@
"Cannot_delete_role_because_its_in_use" : "Não é possível remover o papel pois ele está em uso",
"New_role" : "Novo papel",
"Permissions" : "Permissões",
"Removed" : "Removido",
"Role" : "Papel",
"Role_Editing" : "Edição de Papel",
"Role_removed" : "Papel Removido",

@ -5,7 +5,6 @@
"Cannot_delete_role_because_its_in_use" : "Nu se poate șterge rol, deoarece este în uz",
"New_role" : "Rol nou",
"Permissions" : "Permisiuni",
"Removed" : "Eliminat",
"Role" : "Rol",
"Role_Editing" : "Editare rol",
"Role_removed" : "Rol eliminat",

@ -55,22 +55,28 @@ Meteor.startup ->
roles : ['admin']}
{ _id: 'edit-room',
roles : ['admin', 'moderator']}
roles : ['admin', 'moderator', 'owner']}
{ _id: 'edit-message',
roles : ['admin', 'moderator']}
roles : ['admin', 'moderator', 'owner']}
{ _id: 'delete-message',
roles : ['admin', 'moderator']}
roles : ['admin', 'moderator', 'owner']}
{ _id: 'remove-user',
roles : ['admin', 'moderator']}
roles : ['admin', 'moderator', 'owner']}
{ _id: 'mute-user',
roles : ['admin', 'moderator']}
roles : ['admin', 'moderator', 'owner']}
{ _id: 'ban-user',
roles : ['admin', 'moderator']}
roles : ['admin', 'moderator', 'owner']}
{ _id: 'set-moderator',
roles : ['admin', 'owner']}
{ _id: 'set-owner',
roles : ['admin']}
{ _id: 'create-p',
roles : ['admin', 'user']}
@ -115,6 +121,7 @@ Meteor.startup ->
defaultRoles = [
{ name: 'admin', scope: 'Users' }
{ name: 'moderator', scope: 'Subscriptions' }
{ name: 'owner', scope: 'Subscriptions' }
{ name: 'user', scope: 'Users' }
{ name: 'bot', scope: 'Users' }
]

@ -6,7 +6,7 @@
"Mail_Message_Invalid_emails" : "Sie haben eine oder mehrere ungültige E-Mail-Adressen angegeben: %s",
"Mail_Message_Missing_to" : "Sie müssen einen/mehrere Benutzer auswählen oder einen/mehrere E-Mail-Adressen durch Kommata getrennt angeben.",
"Mail_Message_No_messages_selected_select_all" : "Sie haben keine Nachrichten ausgewählt. Möchten Sie <a href='#' class='select-all'>alle</a> sichtbaren Nachrichten auswählen?",
"Mail_Messages" : "E-Mail-Nachrichten",
"Mail_Messages" : "Nachrichten per E-Mail senden",
"Mail_Messages_Instructions" : "Wählen Sie aus, welche Nachrichten Sie per E-Mail senden möchten, indem Sie die Nachrichten anklicken. ",
"Mail_Messages_Subject" : "Hier ist ein ausgewählter Teil aus %s Nachrichten",
"Sending" : "Senden...",

@ -1 +1,4 @@
{ }
{
"Choose_messages" : "Wybierz wiadomości",
"Mail_Messages" : "Wysyłanie wiadomości przez email"
}

@ -32,6 +32,8 @@ Meteor.methods
name = user.name
email = user.emails?[0]?.address
data.language = data.language.split('-').shift().toLowerCase()
if data.language isnt 'en'
localeFn = Meteor.call 'loadLocale', data.language
if localeFn

@ -1,7 +1,12 @@
{
"Archive_Unarchive" : "Przeniesienie do archiwum",
"Channel" : "Kanał",
"Private_Group" : "Grupa Prywatna",
"Save" : "Zapisz",
"Topic" : "Temat",
"Type" : "Rodzaj",
"Room_Info" : "Ustawienia pokoju",
"room_changed_privacy" : "<em>__user_by__</em> zmienił(a) rodzaj pokoju na: <em>__room_type__</em>",
"room_changed_topic" : "<em>__user_by__</em> zmienił(a) temat pokoju na: <em>__room_topic__</em>"
"room_changed_topic" : "<em>__user_by__</em> zmienił(a) temat pokoju na: <em>__room_topic__</em>",
"Room_topic_changed_successfully" : "Temat pokoju został zmieniony"
}

@ -47,3 +47,42 @@ WebAppInternals._staticFilesMiddleware = (staticFiles, req, res, next) ->
res.setHeader("X-Rocket-Chat-Version", VERSION)
res.setHeader("Access-Control-Expose-Headers", "X-Rocket-Chat-Version")
_staticFilesMiddleware(staticFiles, req, res, next)
url = Npm.require("url")
httpServer = WebApp.httpServer
oldHttpServerListeners = httpServer.listeners('request').slice(0)
httpServer.removeAllListeners('request')
httpServer.addListener 'request', (req, res) ->
args = arguments
next = ->
for oldListener in oldHttpServerListeners
oldListener.apply(httpServer, args)
if RocketChat.settings.get('Force_SSL') isnt true
next()
return
remoteAddress = req.connection.remoteAddress or req.socket.remoteAddress
localhostRegexp = /^\s*(127\.0\.0\.1|::1)\s*$/
localhostTest = (x) ->
return localhostRegexp.test(x)
isLocal = localhostRegexp.test(remoteAddress) and (not req.headers['x-forwarded-for'] or _.all(req.headers['x-forwarded-for'].split(','), localhostTest))
isSsl = req.connection.pair or (req.headers['x-forwarded-proto'] and req.headers['x-forwarded-proto'].indexOf('https') isnt -1)
if not isLocal and not isSsl
host = req.headers['host'] or url.parse(Meteor.absoluteUrl()).hostname
host = host.replace(/:\d+$/, '')
res.writeHead 302,
'Location': 'https://' + host + req.url
res.end()
return
next()

@ -14,6 +14,7 @@ Package.onUse(function(api) {
api.use('simple:highlight.js');
api.use('rocketchat:lib');
api.use('rocketchat:authorization');
api.use('rocketchat:api');
api.use('kadira:flow-router', 'client');
api.use('templating', 'client');
@ -56,6 +57,8 @@ Package.onUse(function(api) {
api.addFiles('server/triggers.coffee', 'server');
api.addFiles('server/processWebhookMessage.js', 'server');
var _ = Npm.require('underscore');
var fs = Npm.require('fs');
tapi18nFiles = _.compact(_.map(fs.readdirSync('packages/rocketchat-integrations/i18n'), function(filename) {

@ -22,89 +22,24 @@ Api.addRoute ':integrationId/:userId/:token', authRequired: true,
integration = RocketChat.models.Integrations.findOne(@urlParams.integrationId)
user = RocketChat.models.Users.findOne(@userId)
channel = @bodyParams.channel or integration.channel
channelType = channel[0]
channel = channel.substr(1)
switch channelType
when '#'
room = RocketChat.models.Rooms.findOne
$or: [
{_id: channel}
{name: channel}
]
if not room?
return {} =
statusCode: 400
body:
success: false
error: 'invalid-channel'
rid = room._id
if room.t is 'c'
Meteor.runAsUser user._id, ->
Meteor.call 'joinRoom', room._id
when '@'
roomUser = RocketChat.models.Users.findOne
$or: [
{_id: channel}
{username: channel}
]
if not roomUser?
return {} =
statusCode: 400
body:
success: false
error: 'invalid-channel'
rid = [user._id, roomUser._id].sort().join('')
room = RocketChat.models.Rooms.findOne(rid)
if not room
Meteor.runAsUser user._id, ->
Meteor.call 'createDirectMessage', roomUser.username
room = RocketChat.models.Rooms.findOne(rid)
else
return {} =
statusCode: 400
body:
success: false
error: 'invalid-channel-type'
message =
alias: @bodyParams.username or @bodyParams.alias or integration.alias
msg: _.trim(@bodyParams.text or @bodyParams.msg or '')
attachments: @bodyParams.attachments
parseUrls: false
bot:
i: integration._id
groupable: false
if @bodyParams.icon_url? or @bodyParams.avatar?
message.avatar = @bodyParams.icon_url or @bodyParams.avatar
else if @bodyParams.icon_emoji? or @bodyParams.emoji?
message.emoji = @bodyParams.icon_emoji or @bodyParams.emoji
else if integration.avatar?
message.avatar = integration.avatar
else if integration.emoji?
message.emoji = integration.emoji
if _.isArray message.attachments
for attachment in message.attachments
if attachment.msg
attachment.text = _.trim(attachment.msg)
delete attachment.msg
RocketChat.sendMessage user, message, room, {}
@bodyParams.bot =
i: integration._id
return {} =
statusCode: 200
body:
success: true
defaultValues =
channel: integration.channel
alias: integration.alias
avatar: integration.avatar
emoji: integration.emoji
try
message = processWebhookMessage @bodyParams, user, defaultValues
if not message?
return RocketChat.API.v1.failure 'unknown-error'
return RocketChat.API.v1.success()
catch e
return RocketChat.API.v1.failure e.error
createIntegration = (options, user) ->

@ -17,7 +17,12 @@ Meteor.methods
if integration.urls.length is 0
throw new Meteor.Error 'invalid_urls', '[methods] updateOutgoingIntegration -> urls is required'
if integration.channel?.trim() isnt '' and integration.channel[0] not in ['@', '#']
if _.isString(integration.channel)
integration.channel = integration.channel.trim()
else
integration.channel = undefined
if integration.channel? and integration.channel[0] not in ['@', '#']
throw new Meteor.Error 'invalid_channel', '[methods] updateOutgoingIntegration -> channel should start with # or @'
if not integration.token? or integration.token?.trim() is ''
@ -36,7 +41,7 @@ Meteor.methods
throw new Meteor.Error 'invalid_integration', '[methods] updateOutgoingIntegration -> integration not found'
if integration.channel?.trim() isnt ''
if integration.channel?
record = undefined
channelType = integration.channel[0]
channel = integration.channel.substr(1)

@ -0,0 +1,102 @@
this.processWebhookMessage = function(messageObj, user, defaultValues) {
var attachment, channel, channelType, i, len, message, ref, rid, room, roomUser;
if (!defaultValues) {
defaultValues = {
channel: '',
alias: '',
avatar: '',
emoji: ''
};
}
channel = messageObj.channel || defaultValues.channel;
channelType = channel[0];
channel = channel.substr(1);
switch (channelType) {
case '#':
room = RocketChat.models.Rooms.findOne({
$or: [
{
_id: channel
}, {
name: channel
}
]
});
if (room == null) {
throw new Meteor.Error('invalid-channel');
}
rid = room._id;
if (room.t === 'c') {
Meteor.runAsUser(user._id, function() {
return Meteor.call('joinRoom', room._id);
});
}
break;
case '@':
roomUser = RocketChat.models.Users.findOne({
$or: [
{
_id: channel
}, {
username: channel
}
]
});
if (roomUser == null) {
throw new Meteor.Error('invalid-channel');
}
rid = [user._id, roomUser._id].sort().join('');
room = RocketChat.models.Rooms.findOne(rid);
if (!room) {
Meteor.runAsUser(user._id, function() {
Meteor.call('createDirectMessage', roomUser.username);
return room = RocketChat.models.Rooms.findOne(rid);
});
}
break;
default:
throw new Meteor.Error('invalid-channel-type');
}
message = {
alias: messageObj.username || messageObj.alias || defaultValues.alias,
msg: _.trim(messageObj.text || messageObj.msg || ''),
attachments: messageObj.attachments,
parseUrls: false,
bot: messageObj.bot,
groupable: false
};
if ((messageObj.icon_url != null) || (messageObj.avatar != null)) {
message.avatar = messageObj.icon_url || messageObj.avatar;
} else if ((messageObj.icon_emoji != null) || (messageObj.emoji != null)) {
message.emoji = messageObj.icon_emoji || messageObj.emoji;
} else if (defaultValues.avatar != null) {
message.avatar = defaultValues.avatar;
} else if (defaultValues.emoji != null) {
message.emoji = defaultValues.emoji;
}
if (_.isArray(message.attachments)) {
ref = message.attachments;
for (i = 0, len = ref.length; i < len; i++) {
attachment = ref[i];
if (attachment.msg) {
attachment.text = _.trim(attachment.msg);
delete attachment.msg;
}
}
}
var messageReturn = RocketChat.sendMessage(user, message, room, {});
return {
channel: channel,
message: messageReturn
}
};

@ -61,9 +61,28 @@ ExecuteTriggerUrl = (url, trigger, message, room, tries=0) ->
, Math.pow(10, tries+2)
return
# TODO process return and insert message if necessary
# process outgoing webhook response as a new message
else if result?.statusCode is 200 and (result.data?.text? or result.data?.attachments?)
user = RocketChat.models.Users.findOneByUsername(trigger.username)
result.data.bot =
i: trigger._id
defaultValues =
channel: trigger.channel
alias: trigger.alias
avatar: trigger.avatar
emoji: trigger.emoji
try
message = processWebhookMessage result.data, user, defaultValues
if not message?
return RocketChat.API.v1.failure 'unknown-error'
return RocketChat.API.v1.success()
catch e
return RocketChat.API.v1.failure e.error
ExecuteTrigger = (trigger, message, room) ->
for url in trigger.urls

@ -2,13 +2,22 @@ MeteorWrapperLdapjs = Npm.require 'ldapjs'
Meteor.startup ->
RocketChat.settings.addGroup 'LDAP', ->
enableQuery = {_id: 'LDAP_Enable', value: true}
enableTLSQuery = [
{_id: 'LDAP_Enable', value: true}
{_id: 'LDAP_TLS', value: true}
]
@add 'LDAP_Enable', false, { type: 'boolean', public: true }
@add 'LDAP_Url', 'ldap://', { type: 'string' , enableQuery: {_id: 'LDAP_Enable', value: true} }
@add 'LDAP_Port', '389', { type: 'string' , enableQuery: {_id: 'LDAP_Enable', value: true} }
@add 'LDAP_DN', '', { type: 'string' , public: true, enableQuery: {_id: 'LDAP_Enable', value: true} }
@add 'LDAP_Bind_Search', '', { type: 'string' , enableQuery: {_id: 'LDAP_Enable', value: true} }
@add 'LDAP_Sync_User_Data', false, { type: 'boolean' , enableQuery: {_id: 'LDAP_Enable', value: true} }
@add 'LDAP_Sync_User_Data_FieldMap', '{"cn":"name", "mail":"email"}', { type: 'string', enableQuery: {_id: 'LDAP_Enable', value: true} }
@add 'LDAP_TLS', false, { type: 'boolean', enableQuery: enableQuery }
@add 'LDAP_CA_Cert', '', { type: 'string', multiline: true, enableQuery: enableTLSQuery }
@add 'LDAP_Reject_Unauthorized', true, { type: 'boolean', enableQuery: enableTLSQuery }
@add 'LDAP_Url', 'ldap://', { type: 'string' , enableQuery: enableQuery }
@add 'LDAP_Port', '389', { type: 'string' , enableQuery: enableQuery }
@add 'LDAP_DN', '', { type: 'string' , public: true, enableQuery: enableQuery }
@add 'LDAP_Bind_Search', '', { type: 'string' , enableQuery: enableQuery }
@add 'LDAP_Sync_User_Data', false, { type: 'boolean' , enableQuery: enableQuery }
@add 'LDAP_Sync_User_Data_FieldMap', '{"cn":"name", "mail":"email"}', { type: 'string', enableQuery: enableQuery }
timer = undefined
@ -20,11 +29,17 @@ updateServices = ->
if enable?
console.log "Enabling LDAP".blue
LDAP_DEFAULTS.TLS = RocketChat.settings.get 'LDAP_TLS'
LDAP_DEFAULTS.CACert = RocketChat.settings.get 'LDAP_CA_Cert'
LDAP_DEFAULTS.rejectUnauthorized = RocketChat.settings.get 'LDAP_Reject_Unauthorized'
LDAP_DEFAULTS.url = RocketChat.settings.get 'LDAP_Url'
LDAP_DEFAULTS.port = RocketChat.settings.get 'LDAP_Port' if RocketChat.settings.get 'LDAP_Port'
LDAP_DEFAULTS.dn = RocketChat.settings.get 'LDAP_DN' or false
LDAP_DEFAULTS.bindSearch = RocketChat.settings.get 'LDAP_Bind_Search' or ''
else
LDAP_DEFAULTS.TLS = undefined
LDAP_DEFAULTS.CACert = undefined
LDAP_DEFAULTS.rejectUnauthorized = undefined
LDAP_DEFAULTS.url = undefined
LDAP_DEFAULTS.port = undefined
LDAP_DEFAULTS.dn = undefined

@ -11,6 +11,7 @@ var slug = function (text) {
// e.g. "uid=someuser,cn=users,dc=somevalue"
LDAP_DEFAULTS = {
url: false,
TLS: false,
port: '389',
dn: false,
createNewUser: true,
@ -42,6 +43,25 @@ var LDAP = function(options) {
this.ldapjs = MeteorWrapperLdapjs;
};
function startTLS(client) {
var opts = {
rejectUnauthorized: LDAP_DEFAULTS.rejectUnauthorized
};
if ( LDAP_DEFAULTS.CACert && LDAP_DEFAULTS.CACert != '' ){
opts.ca = [LDAP_DEFAULTS.CACert];
}
var starttlsSync = Meteor.wrapAsync(client.starttls);
var res = starttlsSync(opts , null);
if (res) {
console.log("StartTLS Result: " + res);
}
}
/**
* Attempt to bind (authenticate) ldap
* and perform a dn search if specified
@ -56,22 +76,29 @@ LDAP.prototype.ldapCheck = function(options) {
options = options || {};
if (options.hasOwnProperty('username') && options.hasOwnProperty('ldapPass')) {
if (!options.hasOwnProperty('username') || !options.hasOwnProperty('ldapPass')) {
throw new Meteor.Error(403, "Missing LDAP Auth Parameter");
}
var ldapAsyncFut = new Future();
var ldapAsyncFut = new Future();
// Create ldap client
var fullUrl = self.options.url + ':' + self.options.port;
var client = self.ldapjs.createClient({
url: fullUrl,
reconnect: false
});
// Create ldap client
var fullUrl = self.options.url + ':' + self.options.port;
var client = self.ldapjs.createClient({
url: fullUrl,
reconnect: false
});
client.on('error', function() {
console.log('Client Error:', arguments);
});
if (LDAP_DEFAULTS.TLS == true) {
startTLS(client);
}
client.on('error', function(e) {
ldapAsyncFut.return({error: e});
});
client.on('connect', function(e) {
var bindSync = Meteor.wrapAsync(client.bind.bind(client));
// Slide @xyz.whatever from username if it was passed in
@ -195,13 +222,9 @@ LDAP.prototype.ldapCheck = function(options) {
} else {
bind(self.options.dn);
}
});
return ldapAsyncFut.wait();
} else {
throw new Meteor.Error(403, "Missing LDAP Auth Parameter");
}
return ldapAsyncFut.wait();
};
@ -210,6 +233,7 @@ LDAP.prototype.ldapCheck = function(options) {
// Meteor.loginWithLDAP on client side
// @param {Object} loginRequest will consist of username, ldapPass, ldap, and ldapOptions
Accounts.registerLoginHandler("ldap", function(loginRequest) {
var self = this;
// If "ldap" isn't set in loginRequest object,
// then this isn't the proper handler (return undefined)
if (!loginRequest.ldap) {
@ -232,7 +256,24 @@ Accounts.registerLoginHandler("ldap", function(loginRequest) {
var ldapResponse = ldapObj.ldapCheck(loginRequest);
if (ldapResponse.error) {
throw new Meteor.Error("LDAP-login-error", ldapResponse.error);
console.log(ldapResponse.error);
console.log('[LDAP] Falling back to standard account base');
if (typeof loginRequest.username === 'string')
if (loginRequest.username.indexOf('@') === -1)
loginRequest.username = {username: loginRequest.username};
else
loginRequest.username = {email: loginRequest.username};
loginRequest = {
user: loginRequest.username,
password: {
digest: SHA256(loginRequest.ldapPass),
algorithm: "sha-256"
}
}
return Accounts._runLoginHandlers(self, loginRequest);
// throw new Meteor.Error("LDAP-login-error", ldapResponse.error);
} else {
// Set initial userId and token vals
var userId = null;

@ -26,6 +26,7 @@ Package.onUse(function(api) {
api.use('tap:i18n');
api.use('yasaricli:slugify');
api.use('coffeescript');
api.use('sha');
// Client
api.use('templating', 'client');
// Server

@ -27,6 +27,7 @@ currentTracker = undefined
BlazeLayout.render 'main', {center: 'roomNotFound'}
return
$('.rocket-loader').remove();
mainNode = document.querySelector('.main-content')
if mainNode?
for child in mainNode.children

@ -38,7 +38,7 @@ Meteor.startup ->
if not siteUrl or not Meteor.userId()?
return
if RocketChat.authz.hasRole(Meteor.userId(), 'admin') is false
if RocketChat.authz.hasRole(Meteor.userId(), 'admin') is false or Meteor.settings.public.sandstorm
return c.stop()
siteUrl = siteUrl.replace /\/$/, ''

@ -82,3 +82,31 @@ Meteor.startup ->
message: 'User_unmuted_by'
data: (message) ->
return { user_unmuted: message.msg, user_by: message.u.username }
RocketChat.MessageTypes.registerType
id: 'new-moderator'
system: true
message: 'User__username__was_added_as_a_moderator_by__user_by_'
data: (message) ->
return { username: message.msg, user_by: message.u.username }
RocketChat.MessageTypes.registerType
id: 'moderator-removed'
system: true
message: 'User__username__was_removed_as_a_moderator_by__user_by_'
data: (message) ->
return { username: message.msg, user_by: message.u.username }
RocketChat.MessageTypes.registerType
id: 'new-owner'
system: true
message: 'User__username__was_added_as_a_owner_by__user_by_'
data: (message) ->
return { username: message.msg, user_by: message.u.username }
RocketChat.MessageTypes.registerType
id: 'owner-removed'
system: true
message: 'User__username__was_removed_as_a_owner_by__user_by_'
data: (message) ->
return { username: message.msg, user_by: message.u.username }

@ -11,7 +11,7 @@ RocketChat.sendMessage = (user, message, room, options) ->
message.rid = room._id
if message.parseUrls isnt false
if urls = message.msg.match /([A-Za-z]{3,9}):\/\/([-;:&=\+\$,\w]+@{1})?([-A-Za-z0-9\.]+)+:?(\d+)?((\/[-\+=!:~%\/\.@\,\w]+)?\??([-\+=&!:;%@\/\.\,\w]+)?#?([\w]+)?)?/g
if urls = message.msg.match /([A-Za-z]{3,9}):\/\/([-;:&=\+\$,\w]+@{1})?([-A-Za-z0-9\.]+)+:?(\d+)?((\/[-\+=!:~%\/\.@\,\w]+)?\??([-\+=&!:;%@\/\.\,\w]+)?#?([^\s]+)?)?/g
message.urls = urls.map (url) -> url: url
message = RocketChat.callbacks.run 'beforeSaveMessage', message

@ -18,6 +18,9 @@ RocketChat.settings.add = (_id, value, options = {}) ->
options.hidden = false
options.sorter ?= RocketChat.settings._sorter++
if options.enableQuery?
options.enableQuery = JSON.stringify options.enableQuery
if process?.env?[_id]?
value = process.env[_id]
options.processEnvValue = value

@ -294,6 +294,22 @@ RocketChat.models.Messages = new class extends RocketChat.models._Base
message = user.username
return @createWithTypeRoomIdMessageAndUser 'user-unmuted', roomId, message, user, extraData
createNewModeratorWithRoomIdAndUser: (roomId, user, extraData) ->
message = user.username
return @createWithTypeRoomIdMessageAndUser 'new-moderator', roomId, message, user, extraData
createModeratorRemovedWithRoomIdAndUser: (roomId, user, extraData) ->
message = user.username
return @createWithTypeRoomIdMessageAndUser 'moderator-removed', roomId, message, user, extraData
createNewOwnerWithRoomIdAndUser: (roomId, user, extraData) ->
message = user.username
return @createWithTypeRoomIdMessageAndUser 'new-owner', roomId, message, user, extraData
createOwnerRemovedWithRoomIdAndUser: (roomId, user, extraData) ->
message = user.username
return @createWithTypeRoomIdMessageAndUser 'owner-removed', roomId, message, user, extraData
# REMOVE
removeById: (_id) ->
query =

@ -25,6 +25,15 @@ RocketChat.models.Subscriptions = new class extends RocketChat.models._Base
return @find query, options
# FIND
findByRoomIdAndRoles: (roomId, roles, options) ->
roles = [].concat roles
query =
"rid": roomId
"roles": { $in: roles }
return @find query, options
getLastSeen: (options = {}) ->
query = { ls: { $exists: 1 } }
options.sort = { ls: -1 }
@ -210,6 +219,26 @@ RocketChat.models.Subscriptions = new class extends RocketChat.models._Base
return @update query, update, { multi: true }
addRoleById: (_id, role) ->
query =
_id: _id
update =
$addToSet:
roles: role
return @update query, update
removeRoleById: (_id, role) ->
query =
_id: _id
update =
$pull:
roles: role
return @update query, update
# INSERT
createWithRoomAndUser: (room, user, extraData) ->
subscription =

@ -77,6 +77,7 @@ RocketChat.settings.addGroup 'General', ->
@add 'Allow_Invalid_SelfSigned_Certs', false, { type: 'boolean' }
@add 'Disable_Favorite_Rooms', false, { type: 'boolean' }
@add 'CDN_PREFIX', '', { type: 'string' }
@add 'Force_SSL', false, { type: 'boolean', public: true }
@add 'Debug_Level', 'error', { type: 'select', values: [ { key: 'error', i18nLabel: 'Only_errors' }, { key: 'debug', i18nLabel: 'All_logs' } ] }
@add 'Restart', 'restart_server', { type: 'action', actionText: 'Restart_the_server' }

@ -1,7 +1,10 @@
buildMailURL = _.debounce ->
console.log 'Updating process.env.MAIL_URL'
if RocketChat.settings.get('SMTP_Host') and RocketChat.settings.get('SMTP_Username') and RocketChat.settings.get('SMTP_Password')
process.env.MAIL_URL = "smtp://" + encodeURIComponent(RocketChat.settings.get('SMTP_Username')) + ':' + encodeURIComponent(RocketChat.settings.get('SMTP_Password')) + '@' + encodeURIComponent(RocketChat.settings.get('SMTP_Host'))
if RocketChat.settings.get('SMTP_Host')
process.env.MAIL_URL = "smtp://"
if RocketChat.settings.get('SMTP_Username') and RocketChat.settings.get('SMTP_Password')
process.env.MAIL_URL += encodeURIComponent(RocketChat.settings.get('SMTP_Username')) + ':' + encodeURIComponent(RocketChat.settings.get('SMTP_Password')) + '@'
process.env.MAIL_URL += encodeURIComponent(RocketChat.settings.get('SMTP_Host'))
if RocketChat.settings.get('SMTP_Port')
process.env.MAIL_URL += ':' + parseInt(RocketChat.settings.get('SMTP_Port'))
, 500

@ -4,7 +4,7 @@ Template.message.helpers
return 'own' if this.u?._id is Meteor.userId()
time: ->
return moment(this.ts).format('HH:mm')
return moment(this.ts).format('LT')
date: ->
return moment(this.ts).format('LL')

@ -1,3 +1,5 @@
{
"Start_Chat" : "Rozpocznij czat"
"Skip" : "Pomiń",
"Start_Chat" : "Rozpocznij czat",
"Survey" : "Ankieta"
}

@ -18,7 +18,7 @@ Template.livechatAppearance.helpers({
u: {
username: 'guest'
},
time: moment(this.ts).format('HH:mm'),
time: moment(this.ts).format('LT'),
date: moment(this.ts).format('LL'),
body: 'Hello',
sequential: null
@ -28,7 +28,7 @@ Template.livechatAppearance.helpers({
u: {
username: 'rocketchat-agent'
},
time: moment(this.ts).format('HH:mm'),
time: moment(this.ts).format('LT'),
date: moment(this.ts).format('LL'),
body: 'Hey, what can I help you with?',
sequential: null
@ -38,7 +38,7 @@ Template.livechatAppearance.helpers({
u: {
username: 'guest'
},
time: moment(this.ts).format('HH:mm'),
time: moment(this.ts).format('LT'),
date: moment(this.ts).format('LL'),
body: 'I\'m looking for informations about your product.',
sequential: null
@ -48,7 +48,7 @@ Template.livechatAppearance.helpers({
u: {
username: 'rocketchat-agent'
},
time: moment(this.ts).format('HH:mm'),
time: moment(this.ts).format('LT'),
date: moment(this.ts).format('LL'),
body: 'Our product is open source, you can do what you want with it! =D',
sequential: null
@ -58,7 +58,7 @@ Template.livechatAppearance.helpers({
u: {
username: 'guest'
},
time: moment(this.ts).format('HH:mm'),
time: moment(this.ts).format('LT'),
date: moment(this.ts).format('LL'),
body: 'Yay, thanks. That\'s awesome.',
sequential: null
@ -68,7 +68,7 @@ Template.livechatAppearance.helpers({
u: {
username: 'rocketchat-agent'
},
time: moment(this.ts).format('HH:mm'),
time: moment(this.ts).format('LT'),
date: moment(this.ts).format('LL'),
body: 'You\'re welcome.',
sequential: null

@ -12,5 +12,6 @@
"Please_fill_a_username" : "يرجى ملء اسم المستخدم",
"Saved" : "تم الحفظ",
"Send_a_message" : "إرسال رسالة",
"Theme" : "سمات",
"Time_in_seconds" : "الوقت بالثواني"
}

@ -1,9 +1,13 @@
{
"Add" : "Dodaj",
"Description" : "Opis",
"Enable" : "Włącz",
"Enabled" : "Włączone",
"Enter_a_username" : "Nazwa użytkownika",
"Livechat_title" : "Tytuł Livechatu",
"Livechat_title_color" : "Kolor tła nagłówka Livechat",
"Please_fill_a_username" : "Proszę wypełnić nazwę użytkownika",
"Saved" : "Zapisano"
"Saved" : "Zapisano",
"Send_a_message" : "Wyślij wiadomość",
"Theme" : "Motyw"
}

@ -2,7 +2,7 @@ WebApp = Package.webapp.WebApp;
Autoupdate = Package.autoupdate.Autoupdate;
WebApp.connectHandlers.use('/livechat/', (req, res, next) => {
res.setHeader('content-type', 'html');
res.setHeader('content-type', 'text/html; charset=utf-8');
head = Assets.getText('public/head.html');

@ -1,4 +1,6 @@
{
"Dry_run" : "تنفيذ تجريبي",
"Dry_run_description" : "سيتم إرسال رسالة بريدية واحدة إلى نفس العنوان الموجود في خانة \"من\". تأكد من كون ذلك العنوان البريدي فعال",
"Email_from" : "من",
"Email_subject" : "الموضوع",
"Send_email" : "إرسال البريد الإلكتروني",

@ -6,6 +6,7 @@
"Email_body" : "Treść wiadomości",
"Mailer" : "Wyślij email użytkownikom",
"Mailer_body_tags" : "<b>Musisz</b> użyć znacznika [unsubscribe] aby zawrzeć w treści odnośnik do rezygnacji z subskrypcji.<br />Możesz użyć znaczników [name], [fname], [lname] by wstawić odpowiednio pełną nazwę użytkownika, jego imię, nazwisko.<br />\nMożesz użyć znacznika [email] by wstawić adres email użytkownika.",
"Query" : "Zapytanie",
"Send_email" : "Wyślij wiadomość",
"The_emails_are_being_sent" : "Wiadomości e-mail są wysyłane.",
"You_are_not_authorized_to_view_this_page" : "Nie masz uprawnień, aby zobaczyć tę stronę.",

@ -1 +1,4 @@
{ }
{
"Mentions" : "Wzmianki o tobie",
"No_mentions_found" : "Nie znaleziono wzmianek o tobie"
}

@ -73,7 +73,7 @@
{{#if video_url}}
<div class="attachment-video">
<video controls class="inline-video" height="300">
<video controls class="inline-video">
<source src="{{fixCordova video_url}}" type="{{video_type}}">
Your browser does not support the video element.
</video>

@ -1,3 +1,5 @@
# @ChatOAuthApps = new Meteor.Collection 'rocketchat_oauth_apps'
FlowRouter.route '/oauth/authorize',
action: (params, queryParams) ->
BlazeLayout.render 'main',
@ -19,12 +21,24 @@ FlowRouter.route '/oauth/error/:error',
Template.authorize.onCreated ->
@subscribe 'authorizedOAuth'
@subscribe 'oauthClient', @data.client_id()
Template.authorize.helpers
getToken: ->
return localStorage.getItem('Meteor.loginToken')
getClient: ->
return ChatOAuthApps.findOne()
Template.authorize.events
'click #logout-oauth': ->
return Meteor.logout()
'click #cancel-oauth': ->
return window.close()
Template.authorize.onRendered ->
@autorun (c) =>

@ -2,16 +2,42 @@
{{#if currentUser}}
<div class="oauth-panel">
<form method="post" action="" role="form" class="{{#unless Template.subscriptionsReady}}hidden{{/unless}}">
<h2>Authorize?</h2>
{{#if currentUser}}
<div class="user-info">
<div class="thumb">
{{> avatar username=currentUser.username}}
</div>
<div class="username">
{{_ "You_are_logged_in_as"}}
<h1>{{currentUser.username}}</h1>
</div>
</div>
{{/if}}
<div class="integration-info">
<div>
<span><b>{{getClient.name}}</b> {{_ "will_be_able_to"}}</span>
<ul class="integration-permissions">
<li>Post Messages</li>
<li>Create Channels</li>
<li>Change Chennel Topic</li>
</ul>
</div>
</div>
<input type="hidden" name="allow" value="yes">
<input type="hidden" name="token" value="{{getToken}}">
<input type="hidden" name="client_id" value="{{client_id}}">
<input type="hidden" name="redirect_uri" value="{{redirect_uri}}">
<input type="hidden" name="response_type" value="code">
<button type="submit" class="button">Authorize</button>
<div class="buttons">
<a id="logout-oauth" href="" class="button secondary">{{_ "Logout"}}</a>
<div class="horizontal-space"></div>
<button id="cancel-oauth" type="button" class="button secondary">{{_ "Cancel"}}</button>
<button type="submit" class="button">{{_ "Authorize"}}</button>
</div>
</form>
{{#unless Template.subscriptionsReady}}
loading...
{{_ "loading"}}...
{{/unless}}
</div>
{{else}}

@ -9,12 +9,64 @@
top: 0px;
bottom: 0px;
ul, li, ol {
list-style: initial;
}
ul {
padding-left: 10px;
margin-left: 6px;
}
form {
min-width: 400px;
text-align: center;
background-color: #fafafa;
border: 1px solid #eee;
border-radius: 6px;
padding: 40px;
}
.user-info {
display: flex;
flex-direction: row;
align-items: center;
justify-content: center;
padding-bottom: 20px;
margin-bottom: 20px;
border-bottom: 1px solid #eee;
.thumb {
height: 40px;
width: 40px;
margin-right: 10px;
}
.username {
text-align: left;
h1 {
font-size: 18px;
}
}
}
.integration-info {
display: flex;
flex-direction: column;
align-items: center;
.integration-permissions {
margin-left: 16px;
padding-top: 10px;
padding-bottom: 40px;
}
}
.buttons {
display: flex;
align-items: center;
justify-content: center;
.horizontal-space {
border-right: 1px solid #ddd;
height: 14px;
margin: 0 15px;
}
}
}

@ -9,6 +9,15 @@ oauth2server = new OAuth2Server
WebApp.connectHandlers.use oauth2server.app
Meteor.publish 'oauthClient', (clientId) ->
unless @userId
return @ready()
return RocketChat.models.OAuthApps.find {clientId: clientId, active: true},
fields:
name: 1
RocketChat.API.v1.addAuthMethod ->
console.log @request.method, @request.url

@ -3,7 +3,7 @@
<blockquote>
<div><a href="{{url}}">{{parsedUrl.host}}</a></div>
<div>{{title}}</div>
<video controls class="inline-video" height="300">
<video controls class="inline-video">
<source src="{{url}}" type="{{contentType}}">
Your browser does not support the video element.
</video>

@ -103,7 +103,7 @@ OEmbed.getUrlMeta = (url, withFragment) ->
if content?.body?
metas = {}
content.body.replace /<title>(.+)<\/title>/gmi, (meta, title) ->
content.body.replace /<title>((.|\n)+?)<\/title>/gmi, (meta, title) ->
metas.pageTitle = title
content.body.replace /<meta[^>]*(?:name|property)=[']([^']*)['][^>]*content=[']([^']*)['][^>]*>/gmi, (meta, name, value) ->

@ -1 +1,3 @@
{ }
{
"User_doesnt_exist" : "لا يوجد مستخدم بالاسم `@%s`"
}

@ -1,3 +1,4 @@
{
"Username_is_not_in_this_room" : "المستخدم `#%s` غير موجود في الغرفة",
"Remove_someone_from_room" : "إزالة شخص من الغرفة"
}

@ -1,4 +1,4 @@
{
"Mute_someone_in_room" : "اسكات شخص في هذه الغرفة",
"Unmute_someone_in_room" : "إلغاء اسكات شخص في هذه الغرفة"
"Mute_someone_in_room" : "إسكات شخص في الغرفة",
"Unmute_someone_in_room" : "إلغاء إسكات شخص في هذه الغرفة"
}

@ -475,7 +475,8 @@ form.inline {
}
}
input[disabled] {
input[disabled],
textarea[disabled] {
background-color: #f4f4f4 !important;
}
@ -1807,6 +1808,12 @@ a.github-fork {
}
}
&[disabled] {
label {
color: #888;
}
}
input {
color: #444;
}
@ -4285,7 +4292,10 @@ a.github-fork {
}
.inline-video {
max-height: 300px;
height: auto;
width: 100%;
max-width: 480px;
max-height: 270px;
}
.attention-message {

@ -1,9 +1,13 @@
{
"theme-color-action-buttons-color" : "Toimintapainikkeiden väri",
"theme-color-active-channel-background-color" : "Aktiivisen kanavan taustaväri",
"theme-color-active-channel-font-color" : "Aktiivisen kanavan tekstin väri",
"theme-color-blockquote-background" : "Lainauksen taustaväri",
"theme-color-code-background" : "Koodin taustaväri",
"theme-color-code-border" : "Koodin reunusväri",
"theme-color-code-color" : "Koodin väri",
"theme-color-content-background-color" : "Sisällön taustaväri",
"theme-color-custom-scrollbar-color" : "Vierityspalkin väri (custom)",
"theme-color-info-active-font-color" : "Aktiivisen infon fontin väri",
"theme-color-info-font-color" : "Infon fontin väri",
"theme-color-input-font-color" : "Syötteen fontin väri",
@ -11,6 +15,7 @@
"theme-color-message-hover-background-color" : "Message Hover BG Color",
"theme-color-primary-background-color" : "Ensisijainen taustaväri",
"theme-color-primary-font-color" : "Ensisijainen fontin väri",
"theme-color-quaternary-font-color" : "Neljäs tekstin väri",
"theme-color-secondary-background-color" : "Toissijainen taustaväri",
"theme-color-secondary-font-color" : "Toissijainen fontin väri",
"theme-color-smallprint-font-color" : "Pienen tekstin fontin väri",

@ -106,3 +106,9 @@ Template.accountProfile.onRendered ->
Template.accountProfile.events
'click .submit button': (e, t) ->
t.save()
'click .logoutOthers button': (event, templateInstance) ->
Meteor.logoutOtherClients (error) ->
if error
toastr.error error.reason
else
toastr.success t('Logged_out_of_other_clients_successfully')

@ -59,6 +59,9 @@
<div class="submit">
<button class="button"><i class="icon-send"></i><span>{{_ "Save_changes"}}</span></button>
</div>
<div class="logoutOthers">
<button class="button">{{_ "Logout_Others"}}</button>
</div>
</div>
</div>
</section>

@ -54,7 +54,20 @@ Template.admin.helpers
if not @enableQuery?
return {}
return if TempSettings.findOne(@enableQuery)? then {} else {disabled: 'disabled'}
if _.isString(@enableQuery)
enableQuery = JSON.parse(@enableQuery)
else
enableQuery = @enableQuery
if not _.isArray(enableQuery)
enableQuery = [enableQuery]
found = 0
for item in enableQuery
if TempSettings.findOne(item)?
found++
return if found is enableQuery.length then {} else {disabled: 'disabled'}
hasChanges: (section) ->
group = FlowRouter.getParam('group')
@ -186,17 +199,17 @@ Template.admin.events
for blob in files
toastr.info TAPi18n.__ 'Uploading_file'
if @fileConstraints.contentType isnt blob.type
toastr.error TAPi18n.__ 'Invalid_file_type'
return
# if @fileConstraints.contentType isnt blob.type
# toastr.error blob.type, TAPi18n.__ 'Invalid_file_type'
# return
reader = new FileReader()
reader.readAsBinaryString(blob)
reader.onloadend = =>
Meteor.call 'setAsset', reader.result, blob.type, @asset, (err, data) ->
if err?
toastr.error TAPi18n.__ err.error
console.log err.error
toastr.error err.reason, TAPi18n.__ err.error
console.log err
return
toastr.success TAPi18n.__ 'File_uploaded'

@ -42,7 +42,7 @@
{{/if}}
{{/if}}
{{#each settings}}
<div class="input-line double-col {{#if changed}}setting-changed{{/if}}">
<div class="input-line double-col {{#if changed}}setting-changed{{/if}}" {{isDisabled}}>
<label>{{label}}</label>
<div>
{{#if $eq type 'string'}}

@ -53,13 +53,12 @@ Template.messageSearch.events
message_id = $(e.currentTarget).closest('.message').attr('id')
$('.message-dropdown:visible').hide()
$(".search-messages-list \##{message_id} .message-dropdown").remove()
message = Blaze.getData($("\.search-messages-list ##{message_id}")?[0])?._arguments?[1]
if message
actions = RocketChat.MessageAction.getButtons message
el = Blaze.toHTMLWithData Template.messageDropdown, { actions: actions }
$(".search-messages-list \##{message_id} .message-cog-container").append el
dropDown = $(".search-messages-list \##{message_id} .message-dropdown")
dropDown.show()
message = _.findWhere(t.searchResult.get()?.messages, (message) -> return message._id is message_id)
actions = RocketChat.MessageAction.getButtons message
el = Blaze.toHTMLWithData Template.messageDropdown, { actions: actions }
$(".search-messages-list \##{message_id} .message-cog-container").append el
dropDown = $(".search-messages-list \##{message_id} .message-dropdown")
dropDown.show()
'scroll .content': _.throttle (e, t) ->
if e.target.scrollTop >= e.target.scrollHeight - e.target.clientHeight

@ -2,7 +2,7 @@ roomFiles = new Mongo.Collection 'room_files'
Template.uploadedFilesList.helpers
files: ->
return roomFiles.find({ rid: @rid }).fetch()
return roomFiles.find({ rid: @rid }, { sort: {uploadedAt : -1} }).fetch()
hasFiles: ->
return roomFiles.find({ rid: @rid }).count() > 0

@ -31,7 +31,7 @@ Template.userInfo.helpers
userTime: ->
if @utcOffset?
return Template.instance().now.get().utcOffset(@utcOffset).format('HH:mm')
return Template.instance().now.get().utcOffset(@utcOffset).format('LT')
canRemoveUser: ->
return RocketChat.authz.hasAllPermission('remove-user', Session.get('openedRoom'))
@ -45,6 +45,18 @@ Template.userInfo.helpers
return true
return false
canSetModerator: ->
return RocketChat.authz.hasAllPermission('set-moderator', Session.get('openedRoom'))
isModerator: ->
return !!RoomModeratorsAndOwners.findOne({ rid: Session.get('openedRoom'), "u._id": @user?._id, roles: 'moderator' })
canSetOwner: ->
return RocketChat.authz.hasAllPermission('set-owner', Session.get('openedRoom'))
isOwner: ->
return !!RoomModeratorsAndOwners.findOne({ rid: Session.get('openedRoom'), "u._id": @user?._id, roles: 'owner' })
Template.userInfo.events
'click .pvt-msg': (e) ->
Meteor.call 'createDirectMessage', Session.get('showUserInfo'), (error, result) ->
@ -84,30 +96,60 @@ Template.userInfo.events
'click .back': (e) ->
Session.set('showUserInfo', null)
'click .remove-user': (e, t) ->
'click .remove-user': (e) ->
e.preventDefault()
rid = Session.get('openedRoom')
room = ChatRoom.findOne rid
if RocketChat.authz.hasAllPermission('remove-user', rid)
Meteor.call 'removeUserFromRoom', { rid: rid, username: @user.username }, (err, result) ->
if err
return toastr.error(err.reason or err.message)
toastr.success TAPi18n.__ 'User_removed_from_room'
Session.set('showUserInfo', null)
swal {
title: t('Are_you_sure')
text: t('The_user_will_be_removed_from_s', room.name)
type: 'warning'
showCancelButton: true
confirmButtonColor: '#DD6B55'
confirmButtonText: t('Yes_remove_user')
cancelButtonText: t('Cancel')
closeOnConfirm: false
html: false
}, =>
Meteor.call 'removeUserFromRoom', { rid: rid, username: @user.username }, (err, result) ->
if err
return toastr.error(err.reason or err.message)
swal
title: t('Removed')
text: t('User_has_been_removed_from_s', room.name)
type: 'success'
timer: 2000
showConfirmButton: false
Session.set('showUserInfo', null)
else
toastr.error(TAPi18n.__ 'Not_allowed')
'click .mute-user': (e, t) ->
'click .mute-user': (e) ->
e.preventDefault()
rid = Session.get('openedRoom')
room = ChatRoom.findOne rid
if RocketChat.authz.hasAllPermission('mute-user', rid)
Meteor.call 'muteUserInRoom', { rid: rid, username: @user.username }, (err, result) ->
if err
return toastr.error(err.reason or err.message)
toastr.success TAPi18n.__ 'User_muted_in_room'
else
toastr.error(TAPi18n.__ 'Not_allowed')
swal {
title: t('Are_you_sure')
text: t('The_user_wont_be_able_to_type_in_s', room.name)
type: 'warning'
showCancelButton: true
confirmButtonColor: '#DD6B55'
confirmButtonText: t('Yes_mute_user')
cancelButtonText: t('Cancel')
closeOnConfirm: false
html: false
}, =>
Meteor.call 'muteUserInRoom', { rid: rid, username: @user.username }, (err, result) ->
if err
return toastr.error(err.reason or err.message)
swal
title: t('Muted')
text: t('User_has_been_muted_in_s', room.name)
type: 'success'
timer: 2000
showConfirmButton: false
'click .unmute-user': (e, t) ->
e.preventDefault()
@ -121,6 +163,54 @@ Template.userInfo.events
else
toastr.error(TAPi18n.__ 'Not_allowed')
'click .set-moderator': (e, t) ->
e.preventDefault()
userModerator = RoomModeratorsAndOwners.findOne({ rid: Session.get('openedRoom'), "u._id": @user._id, roles: 'moderator' }, { fields: { _id: 1 } })
unless userModerator?
Meteor.call 'addRoomModerator', Session.get('openedRoom'), @user._id, (err, results) =>
if err
return toastr.error(err.reason or err.message)
room = ChatRoom.findOne(Session.get('openedRoom'))
toastr.success TAPi18n.__ 'User__username__is_now_a_moderator_of__room_name_', { username: @user.username, room_name: room.name }
'click .unset-moderator': (e, t) ->
e.preventDefault()
userModerator = RoomModeratorsAndOwners.findOne({ rid: Session.get('openedRoom'), "u._id": @user._id, roles: 'moderator' }, { fields: { _id: 1 } })
if userModerator?
Meteor.call 'removeRoomModerator', Session.get('openedRoom'), @user._id, (err, results) =>
if err
return toastr.error(err.reason or err.message)
room = ChatRoom.findOne(Session.get('openedRoom'))
toastr.success TAPi18n.__ 'User__username__removed_from__room_name__moderators', { username: @user.username, room_name: room.name }
'click .set-owner': (e, t) ->
e.preventDefault()
userOwner = RoomModeratorsAndOwners.findOne({ rid: Session.get('openedRoom'), "u._id": @user._id, roles: 'owner' }, { fields: { _id: 1 } })
unless userOwner?
Meteor.call 'addRoomOwner', Session.get('openedRoom'), @user._id, (err, results) =>
if err
return toastr.error(err.reason or err.message)
room = ChatRoom.findOne(Session.get('openedRoom'))
toastr.success TAPi18n.__ 'User__username__is_now_a_owner_of__room_name_', { username: @user.username, room_name: room.name }
'click .unset-owner': (e, t) ->
e.preventDefault()
userOwner = RoomModeratorsAndOwners.findOne({ rid: Session.get('openedRoom'), "u._id": @user._id, roles: 'owner' }, { fields: { _id: 1 } })
if userOwner?
Meteor.call 'removeRoomOwner', Session.get('openedRoom'), @user._id, (err, results) =>
if err
return toastr.error(err.reason or err.message)
room = ChatRoom.findOne(Session.get('openedRoom'))
toastr.success TAPi18n.__ 'User__username__removed_from__room_name__owners', { username: @user.username, room_name: room.name }
Template.userInfo.onCreated ->
@now = new ReactiveVar moment()
self = @

@ -30,20 +30,34 @@
{{> videoButtons}}
{{#if showAll}}
<button class='button secondary back'><span>{{_ "View_All"}} <i class='icon-angle-right'></i></span></button>
{{#if canDirectMessage user.username}}
<button class='button pvt-msg'><span><i class='icon-chat'></i> {{_ "Conversation"}}</span></button>
<button class='button button-block pvt-msg'><span><i class='icon-chat'></i> {{_ "Conversation"}}</span></button>
{{/if}}
{{#if canSetOwner}}
{{#if isOwner}}
<button class="button button-block unset-owner lightblue"><span>{{_ "Remove_as_owner"}}</span></button>
{{else}}
<button class="button button-block set-owner lightblue"><span>{{_ "Set_as_owner"}}</span></button>
{{/if}}
{{/if}}
{{#if canSetModerator}}
{{#if isModerator}}
<button class="button button-block unset-moderator lightblue"><span>{{_ "Remove_as_moderator"}}</span></button>
{{else}}
<button class="button button-block set-moderator lightblue"><span>{{_ "Set_as_moderator"}}</span></button>
{{/if}}
{{/if}}
{{#if canRemoveUser}}
<button class="button remove-user red"><span>{{_ "Remove_from_room"}}</span></button>
<button class="button button-block remove-user red"><span>{{_ "Remove_from_room"}}</span></button>
{{/if}}
{{#if canMuteUser}}
{{#if userMuted}}
<button class="button unmute-user primary"><span>{{_ "Unmute_user"}}</span></button>
<button class="button button-block unmute-user primary"><span>{{_ "Unmute_user"}}</span></button>
{{else}}
<button class="button mute-user red"><span>{{_ "Mute_user"}}</span></button>
<button class="button button-block mute-user red"><span>{{_ "Mute_user"}}</span></button>
{{/if}}
{{/if}}
<button class='button secondary back'><span>{{_ "View_All"}} <i class='icon-angle-right'></i></span></button>
{{/if}}
</nav>
{{/if}}

@ -22,6 +22,8 @@ Package.onUse(function(api) {
'rocketchat:lib'
]);
api.use('rocketchat:ui');
api.addFiles('flex-tab/flexTabBar.html', 'client');
api.addFiles('flex-tab/tabs/membersList.html', 'client');
api.addFiles('flex-tab/tabs/messageSearch.html', 'client');

@ -4,7 +4,7 @@
You must login to Sandstorm (on the top right) in order to access this chat.
</div>
{{else}}
<form id="login-card" method='/'>
<form id="login-card" method='/' novalidate>
{{#if waitActivation}}
<header>
<h2>{{{_ "Registration_Succeeded"}}}</h2>

@ -43,6 +43,9 @@
<template name="main">
{{#if subsReady}}
{{#unless logged}}
<div class="connection-status">
{{> status}}
</div>
{{> loginLayout center="loginForm"}}
{{else}}
{{#unless hasUsername}}

@ -14,7 +14,7 @@ Template.message.helpers
chatops: ->
return 'chatops-message' if this.u?.username is RocketChat.settings.get('Chatops_Username')
time: ->
return moment(this.ts).format('HH:mm')
return moment(this.ts).format('LT')
date: ->
return moment(this.ts).format('LL')
isTemp: ->
@ -32,7 +32,7 @@ Template.message.helpers
editTime: ->
if Template.instance().wasEdited
return moment(@editedAt).format('LL hh:mma') #TODO profile pref for 12hr/24hr clock?
return moment(@editedAt).format('LL LT') #TODO profile pref for 12hr/24hr clock?
editedBy: ->
return "" unless Template.instance().wasEdited
# try to return the username of the editor,
@ -104,6 +104,7 @@ Template.message.onCreated ->
message = RocketChat.callbacks.run 'renderMessage', msg
if message.tokens?.length > 0
for token in message.tokens
token.text = token.text.replace(/([^\$])(\$[^\$])/gm, '$1$$$2')
message.html = message.html.replace token.token, token.text
# console.log JSON.stringify message

@ -116,7 +116,6 @@ Template.messageBox.events
fileUpload filesToUpload
'click .message-form .mic': (e, t) ->
console.log window.AudioRecorder
AudioRecorder.start ->
t.$('.stop-mic').removeClass('hidden')
t.$('.mic').addClass('hidden')

@ -1,4 +1,4 @@
Template.messagePopupEmoji.helpers
value: ->
length = this.data.length
return this.data[length - 1].toUpperCase()
return this.data[length - 1]

@ -62,7 +62,7 @@ RocketChat.Notifications.onUser 'message', (msg) ->
sub.stop()
if openedRooms[typeName].rid?
msgStream.removeListener openedRooms[typeName].rid
msgStream.removeAllListeners openedRooms[typeName].rid
RocketChat.Notifications.unRoom openedRooms[typeName].rid, 'deleteMessage', onDeleteMessageStream
openedRooms[typeName].ready = false
@ -85,6 +85,9 @@ RocketChat.Notifications.onUser 'message', (msg) ->
Meteor.subscribe 'room', typeName
]
if record.ready is true
return
ready = record.sub[0].ready() and subscription.ready()
if ready is true
@ -108,21 +111,23 @@ RocketChat.Notifications.onUser 'message', (msg) ->
record.ready = RoomHistoryManager.isLoading(room._id) is false
Dep.changed()
msgStream.on openedRooms[typeName].rid, (msg) ->
if openedRooms[typeName].streamActive isnt true
openedRooms[typeName].streamActive = true
msgStream.on openedRooms[typeName].rid, (msg) ->
# Should not send message to room if room has not loaded all the current messages
if RoomHistoryManager.hasMoreNext(openedRooms[typeName].rid) is false
# Should not send message to room if room has not loaded all the current messages
if RoomHistoryManager.hasMoreNext(openedRooms[typeName].rid) is false
# Do not load command messages into channel
if msg.t isnt 'command'
ChatMessage.upsert { _id: msg._id }, msg
# Do not load command messages into channel
if msg.t isnt 'command'
ChatMessage.upsert { _id: msg._id }, msg
Meteor.defer ->
RoomManager.updateMentionsMarksOfRoom typeName
Meteor.defer ->
RoomManager.updateMentionsMarksOfRoom typeName
RocketChat.callbacks.run 'streamMessage', msg
RocketChat.callbacks.run 'streamMessage', msg
RocketChat.Notifications.onRoom openedRooms[typeName].rid, 'deleteMessage', onDeleteMessageStream
RocketChat.Notifications.onRoom openedRooms[typeName].rid, 'deleteMessage', onDeleteMessageStream
Dep.changed()

@ -1,6 +1,7 @@
@ChatMessage = new Meteor.Collection null
@ChatRoom = new Meteor.Collection 'rocketchat_room'
@ChatSubscription = new Meteor.Collection 'rocketchat_subscription'
@RoomModeratorsAndOwners = new Mongo.Collection null
@UserAndRoom = new Meteor.Collection null
@CachedChannelList = new Meteor.Collection null

@ -30,10 +30,6 @@
when 'p'
FlowRouter.go 'group', {name: notification.payload.name}
setTimeout ->
n.close()
, 10000
newMessage: ->
unless Session.equals('user_' + Meteor.userId() + '_status', 'busy') or Meteor.user()?.settings?.preferences?.disableNewMessageNotification
$('#chatAudioNotification')[0].play()

@ -1,4 +1,4 @@
@AudioRecorder = new class
@AudioRecorder = new class
start: (cb) ->
window.AudioContext = window.AudioContext or window.webkitAudioContext
navigator.getUserMedia = navigator.getUserMedia or navigator.webkitGetUserMedia
@ -28,7 +28,7 @@
if cb?
@getBlob cb
@stream.stop()
@stream.getAudioTracks()[0].stop()
@recorder.clear()

@ -0,0 +1,33 @@
Meteor.startup(function() {
RocketChat.callbacks.add('streamMessage', function(msg) {
if (msg.t === 'new-moderator') {
user = Meteor.users.findOne({ username: msg.msg }, { fields: { username: 1 } });
RoomModeratorsAndOwners.upsert({ rid: msg.rid, "u._id": user._id }, { $setOnInsert: { u: user }, $addToSet: { roles: 'moderator' } });
} else if (msg.t === 'moderator-removed') {
user = Meteor.users.findOne({ username: msg.msg });
moderator = RoomModeratorsAndOwners.findOne({ rid: msg.rid, "u._id": user._id, roles: 'moderator' });
if (moderator && moderator.roles && moderator.roles.length === 1 && moderator.roles[0] === 'moderator') {
RoomModeratorsAndOwners.remove({ rid: msg.rid, "u._id": user._id, roles: 'moderator' });
} else if (moderator) {
RoomModeratorsAndOwners.update({ rid: msg.rid, "u._id": user._id }, { $pull: { roles: 'moderator' } });
}
}
return msg;
}, RocketChat.callbacks.priority.LOW, 'addOrRemoveModerator');
RocketChat.callbacks.add('streamMessage', function(msg) {
if (msg.t === 'new-owner') {
user = Meteor.users.findOne({ username: msg.msg }, { fields: { username: 1 } });
RoomModeratorsAndOwners.upsert({ rid: msg.rid, "u._id": user._id }, { $setOnInsert: { u: user }, $addToSet: { roles: 'owner' } });
} else if (msg.t === 'owner-removed') {
user = Meteor.users.findOne({ username: msg.msg });
owner = RoomModeratorsAndOwners.findOne({ rid: msg.rid, "u._id": user._id, roles: 'owner' });
if (owner && owner.roles && owner.roles.length === 1 && owner.roles[0] === 'owner') {
RoomModeratorsAndOwners.remove({ rid: msg.rid, "u._id": user._id, roles: 'owner' });
} else if (owner) {
RoomModeratorsAndOwners.update({ rid: msg.rid, "u._id": user._id }, { $pull: { roles: 'owner' } });
}
}
return msg;
}, RocketChat.callbacks.priority.LOW, 'addOrRemoveOwner');
})

@ -56,6 +56,7 @@ Package.onUse(function(api) {
api.addFiles('lib/sideNav.coffee', 'client');
api.addFiles('lib/tapi18n.coffee', 'client');
api.addFiles('lib/textarea-autogrow.js', 'client');
api.addFiles('lib/updateModeratorsAndOwners.js', 'client');
// LIB CORDOVA
api.addFiles('lib/cordova/facebook-login.coffee', 'client');

@ -1,6 +1,7 @@
<template name="privateHistory">
<section class="page-container page-list">
<header class="fixed-title">
{{> burger}}
<h2>
<span class="room-title">{{_ "History"}}</span>
</h2>

@ -493,6 +493,14 @@ Template.room.onCreated ->
@autorun =>
@subscribe 'fullUserData', Session.get('showUserInfo'), 1
Meteor.call 'getRoomModeratorsAndOwners', @data._id, (error, results) ->
if error
return toastr.error error.reason
for record in results
delete record._id
RoomModeratorsAndOwners.upsert { rid: record.rid, "u._id": record.u._id }, record
Template.room.onDestroyed ->
window.removeEventListener 'resize', this.onWindowResize

@ -3,11 +3,11 @@
{{#if videoAvaliable}}
{{#unless videoActive}}
{{#if callInProgress}}
<button class="join-video-call button secondary"><i class="icon-videocam"></i>{{_ "Join"}}</button>
<button class="join-audio-call button secondary"><i class="icon-phone"></i>{{_ "Join"}}</button>
<button class="join-video-call button secondary" aria-label="{{_ "Join_video_call"}}"><i class="icon-videocam"></i></button>
<button class="join-audio-call button secondary" aria-label="{{_ "Join_audio_call"}}"><i class="icon-phone"></i></button>
{{else}}
<button class="start-video-call button"><i class="icon-videocam"></i>{{_ "Start"}}</button>
<button class="start-audio-call button"><i class="icon-phone"></i></button>
<button class="start-video-call button" aria-label="{{_ "Start_video_call"}}"><i class="icon-videocam"></i></button>
<button class="start-audio-call button" aria-label="{{_ "Start_audio_call"}}"><i class="icon-phone"></i></button>
{{/if}}
{{/unless}}
{{/if}}

@ -1,8 +1,8 @@
# Deny Account.createUser in client and set Meteor.loginTokenExpires
accountsConfig = { forbidClientAccountCreation: true, loginExpirationInDays: RocketChat.settings.get 'Accounts_LoginExpiration' }
if RocketChat.settings.get('Account_AllowedDomainsList')
domainWhiteList = _.map RocketChat.settings.get('Account_AllowedDomainsList').split(','), (domain) -> domain.trim()
if RocketChat.settings.get('Accounts_AllowedDomainsList')
domainWhiteList = _.map RocketChat.settings.get('Accounts_AllowedDomainsList').split(','), (domain) -> domain.trim()
accountsConfig.restrictCreationByEmailDomain = (email) ->
ret = false
for domain in domainWhiteList

@ -0,0 +1,25 @@
Meteor.methods
addRoomModerator: (rid, userId) ->
unless Meteor.userId()
throw new Meteor.Error 'invalid-user', '[methods] addRoomModerator -> Invalid user'
check rid, String
check userId, String
unless RocketChat.authz.hasPermission Meteor.userId(), 'set-moderator', rid
throw new Meteor.Error 403, 'Not allowed'
subscription = RocketChat.models.Subscriptions.findOneByRoomIdAndUserId rid, userId
unless subscription?
throw new Meteor.Error 'invalid-subscription', '[methods] addRoomModerator -> Invalid Subscription'
RocketChat.models.Subscriptions.addRoleById(subscription._id, 'moderator')
user = RocketChat.models.Users.findOneById userId
fromUser = RocketChat.models.Users.findOneById Meteor.userId()
RocketChat.models.Messages.createNewModeratorWithRoomIdAndUser rid, user,
u:
_id: fromUser._id
username: fromUser.username
return true

@ -0,0 +1,25 @@
Meteor.methods
addRoomOwner: (rid, userId) ->
unless Meteor.userId()
throw new Meteor.Error 'invalid-user', '[methods] addRoomOwner -> Invalid user'
check rid, String
check userId, String
unless RocketChat.authz.hasPermission Meteor.userId(), 'set-owner', rid
throw new Meteor.Error 403, 'Not allowed'
subscription = RocketChat.models.Subscriptions.findOneByRoomIdAndUserId rid, userId
unless subscription?
throw new Meteor.Error 'invalid-subscription', '[methods] addRoomOwner -> Invalid Subscription'
RocketChat.models.Subscriptions.addRoleById(subscription._id, 'owner')
user = RocketChat.models.Users.findOneById userId
fromUser = RocketChat.models.Users.findOneById Meteor.userId()
RocketChat.models.Messages.createNewOwnerWithRoomIdAndUser rid, user,
u:
_id: fromUser._id
username: fromUser.username
return true

@ -55,7 +55,7 @@ Meteor.methods
RocketChat.models.Subscriptions.createWithRoomAndUser room, member, extra
# set creator as channel moderator. permission limited to channel by scoping to rid
RocketChat.authz.addUserRoles(Meteor.userId(), 'moderator', room._id)
RocketChat.authz.addUserRoles(Meteor.userId(), ['moderator','owner'], room._id)
Meteor.defer ->
RocketChat.callbacks.run 'afterCreateChannel', user, room

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

Loading…
Cancel
Save