diff --git a/.docker/dockerfiles/develop/Dockerfile b/.docker/dockerfiles/develop/Dockerfile index 2adc1194716..14e23628e99 100644 --- a/.docker/dockerfiles/develop/Dockerfile +++ b/.docker/dockerfiles/develop/Dockerfile @@ -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 diff --git a/.docker/dockerfiles/latest/Dockerfile b/.docker/dockerfiles/latest/Dockerfile index 58332d6c3ff..286962d174d 100644 --- a/.docker/dockerfiles/latest/Dockerfile +++ b/.docker/dockerfiles/latest/Dockerfile @@ -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 diff --git a/.meteor/versions b/.meteor/versions index bcc646ddc33..ff8301b12be 100644 --- a/.meteor/versions +++ b/.meteor/versions @@ -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 diff --git a/README.md b/README.md index 2abb716a596..731063addc3 100644 --- a/README.md +++ b/README.md @@ -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 [](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 [](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: + +[](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 diff --git a/i18n/ar.i18n.json b/i18n/ar.i18n.json index fd1ca738d36..bc196b60c39 100644 --- a/i18n/ar.i18n.json +++ b/i18n/ar.i18n.json @@ -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" : "عرض __total_online__ of __total__ users", + "Showing_online_users" : "عرض __total_online__من __total__ عضو", "Showing_results" : "
يعرض %s نتائج
", "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" : "%s لا يصلح كإسم مستخدم،%s
für Nutzer oder %s
für Kanäle. Beispiel: %s
oder %s
",
"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 %s wurde zu %s konfiguriert und Sie greifen von %s 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 __username__ wurde von __user_by__ als Moderator hinzugefügt.",
+ "User__username__was_added_as_a_owner_by__user_by_" : "Benutzer __username__ wurde von __user_by__ als Besitzer hinzugefügt.",
+ "User__username__was_removed_as_a_moderator_by__user_by_" : "Dem Benutzer __username__ wurden die Moderatorenrechte von __user_by__ entfernt.",
+ "User__username__was_removed_as_a_owner_by__user_by_" : "Benutzer __username__ wurde von __user_by__ als Besitzer entfernt.",
"User_added_by" : "Der Benutzer __user_added__ wurde von __user_by__ 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, %s.",
"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 #__room_name__.",
+ "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. ",
diff --git a/i18n/en.i18n.json b/i18n/en.i18n.json
index e17e14d18a4..75144642647 100644
--- a/i18n/en.i18n.json
+++ b/i18n/en.i18n.json
@@ -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 %s
for user or %s
for channel. Eg: %s
or %s
",
"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 %s is configured to %s and you are accessing from %s!",
+ "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 __username__ was added as a moderator by __user_by__",
+ "User__username__was_added_as_a_owner_by__user_by_" : "User __username__ was added as a owner by __user_by__",
+ "User__username__was_removed_as_a_moderator_by__user_by_" : "User __username__ was removed as a moderator by __user_by__",
+ "User__username__was_removed_as_a_owner_by__user_by_" : "User __username__ was removed as a owner by __user_by__",
"User_added_by" : "User __user_added__ added by __user_by__.",
"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 %s.",
"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 #__room_name__",
+ "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",
diff --git a/i18n/fi.i18n.json b/i18n/fi.i18n.json
index 77a8acfa104..83fdccc6647 100644
--- a/i18n/fi.i18n.json
+++ b/i18n/fi.i18n.json
@@ -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 %s
käyttäjänä or %s
kanavana. Esim: %s
tai %s
",
"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 %s on määritelty arvoon %s yrität käyttää tätä lähteenä %s!",
+ "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ä __username__ on lisätty moderaattoriksi __user_by__ toimesta",
+ "User__username__was_added_as_a_owner_by__user_by_" : "Käyttäjä __username__ lisätty __user_by__ omistajaksi",
+ "User__username__was_removed_as_a_moderator_by__user_by_" : "Käyttäjän __username__ moderaattoristatus poistettu käyttäjän __user_by__ toimesta",
+ "User__username__was_removed_as_a_owner_by__user_by_" : "Käyttäjä __username__ on poistettu __user_by__ omistajista",
"User_added_by" : "Käyttäjä __user_added__ lisätty __user_by__ 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 %s.",
"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 #__room_name__ 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.",
diff --git a/i18n/he.i18n.json b/i18n/he.i18n.json
index 4dceb39fb3d..fdd4e9b7b7f 100644
--- a/i18n/he.i18n.json
+++ b/i18n/he.i18n.json
@@ -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" : "שם החדר שונה ל: __room_name__ על ידי המשתמש __user_by__",
"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" : "מציג __total_online__ מתוך __total__ משתמשים",
"Showing_results" : "מוצגות %s תוצאות
", "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" : "המשתמש __user_added__ נוסף על ידי __user_by__", + "User_has_been_activated" : "המשתמש הופעל", + "User_has_been_deactivated" : "המשתמש נוטרל", "User_joined_channel" : "הצטרף לערוץ.", "User_joined_channel_female" : "הצטרפה לערוץ.", "User_joined_channel_male" : "הצטרף לערוץ.", diff --git a/i18n/hr.i18n.json b/i18n/hr.i18n.json index 6507783c957..c70aaf9488d 100644 --- a/i18n/hr.i18n.json +++ b/i18n/hr.i18n.json @@ -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", diff --git a/i18n/ko.i18n.json b/i18n/ko.i18n.json index f75a22a35ac..3804dedd2f5 100644 --- a/i18n/ko.i18n.json +++ b/i18n/ko.i18n.json @@ -326,6 +326,7 @@ "Remove" : "삭제", "Remove_Admin" : "관리자 권한 제거", "Remove_custom_oauth" : "사용자 정의 OAuth 제거", + "Removed" : "제거됨", "Reset_password" : "암호 재설정", "Restart" : "재시작", "Room" : "방", diff --git a/i18n/nl.i18n.json b/i18n/nl.i18n.json index 15ab951691a..6a04b1d6d65 100644 --- a/i18n/nl.i18n.json +++ b/i18n/nl.i18n.json @@ -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", diff --git a/i18n/pl.i18n.json b/i18n/pl.i18n.json index 42ccf79d1fd..59a316acc47 100644 --- a/i18n/pl.i18n.json +++ b/i18n/pl.i18n.json @@ -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" : "%s nie jest poprawną nazwą pokoju,%s
pentru utilizator sau %s
pentru canal. Ex: %s
sau %s
",
"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 %s e configurată să %s iar dumneavoastră accesați din %s!",
+ "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 __username__ a fost adăugat ca moderator de către __user_by__",
+ "User__username__was_added_as_a_owner_by__user_by_" : "Utilizatorul __username__ a fost adăugat ca proprietar de către __user_by__",
+ "User__username__was_removed_as_a_moderator_by__user_by_" : "Utilizatorul __username__ a fost scos ca moderator de către __user_by__",
+ "User__username__was_removed_as_a_owner_by__user_by_" : "Utilizatorul __username__ a fost eliminat ca proprietar de către __user_by__",
"User_added_by" : "Utilizator __user_added__ adăugat de către __user_by__.",
"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 %s.",
"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ă",
diff --git a/packages/rocketchat-api/server/routes.coffee b/packages/rocketchat-api/server/routes.coffee
index b7cafb17220..16a3efc14ae 100644
--- a/packages/rocketchat-api/server/routes.coffee
+++ b/packages/rocketchat-api/server/routes.coffee
@@ -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,
diff --git a/packages/rocketchat-assets/.npm/package/npm-shrinkwrap.json b/packages/rocketchat-assets/.npm/package/npm-shrinkwrap.json
index f69e18d8fe1..78afe4f3ae8 100644
--- a/packages/rocketchat-assets/.npm/package/npm-shrinkwrap.json
+++ b/packages/rocketchat-assets/.npm/package/npm-shrinkwrap.json
@@ -2,6 +2,14 @@
"dependencies": {
"image-size": {
"version": "0.4.0"
+ },
+ "mime-types": {
+ "version": "2.1.9",
+ "dependencies": {
+ "mime-db": {
+ "version": "1.21.0"
+ }
+ }
}
}
}
diff --git a/packages/rocketchat-assets/package.js b/packages/rocketchat-assets/package.js
index ea0504827fe..7f299bb33aa 100644
--- a/packages/rocketchat-assets/package.js
+++ b/packages/rocketchat-assets/package.js
@@ -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) {
diff --git a/packages/rocketchat-assets/server/assets.coffee b/packages/rocketchat-assets/server/assets.coffee
index acf9d258456..4c99b703d1d 100644
--- a/packages/rocketchat-assets/server/assets.coffee
+++ b/packages/rocketchat-assets/server/assets.coffee
@@ -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')
diff --git a/packages/rocketchat-authorization/i18n/ar.i18n.json b/packages/rocketchat-authorization/i18n/ar.i18n.json
index 243fae72104..2c88e2e3004 100644
--- a/packages/rocketchat-authorization/i18n/ar.i18n.json
+++ b/packages/rocketchat-authorization/i18n/ar.i18n.json
@@ -2,7 +2,6 @@
"Add_user" : "إضافة مستخدم",
"Back_to_permissions" : "العودة إلى التصريحات",
"Permissions" : "التصريحات",
- "Removed" : "تمت اﻹزالة",
"Saving" : "جاري الحفظ",
"User_added" : "وأضاف العضو __user_added__.",
"User_not_found" : "لم يتم العثور على المستخدم",
diff --git a/packages/rocketchat-authorization/i18n/de.i18n.json b/packages/rocketchat-authorization/i18n/de.i18n.json
index 1ac87a82351..18f0ee3d481 100644
--- a/packages/rocketchat-authorization/i18n/de.i18n.json
+++ b/packages/rocketchat-authorization/i18n/de.i18n.json
@@ -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.",
diff --git a/packages/rocketchat-authorization/i18n/en.i18n.json b/packages/rocketchat-authorization/i18n/en.i18n.json
index 89f68bed6c9..1a2b7b7080a 100644
--- a/packages/rocketchat-authorization/i18n/en.i18n.json
+++ b/packages/rocketchat-authorization/i18n/en.i18n.json
@@ -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",
diff --git a/packages/rocketchat-authorization/i18n/fi.i18n.json b/packages/rocketchat-authorization/i18n/fi.i18n.json
index 488fab46a3f..989d23b26ef 100644
--- a/packages/rocketchat-authorization/i18n/fi.i18n.json
+++ b/packages/rocketchat-authorization/i18n/fi.i18n.json
@@ -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",
diff --git a/packages/rocketchat-authorization/i18n/hr.i18n.json b/packages/rocketchat-authorization/i18n/hr.i18n.json
index 22aa475a059..4bf37f94d0c 100644
--- a/packages/rocketchat-authorization/i18n/hr.i18n.json
+++ b/packages/rocketchat-authorization/i18n/hr.i18n.json
@@ -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.",
diff --git a/packages/rocketchat-authorization/i18n/ko.i18n.json b/packages/rocketchat-authorization/i18n/ko.i18n.json
index c0502addf31..d55848ec945 100644
--- a/packages/rocketchat-authorization/i18n/ko.i18n.json
+++ b/packages/rocketchat-authorization/i18n/ko.i18n.json
@@ -2,7 +2,6 @@
"Add_user" : "사용자 추가",
"New_role" : "새로운 역할",
"Permissions" : "권한",
- "Removed" : "제거됨",
"Saving" : "저장 중",
"User_added" : "사용자 추가함.",
"User_not_found" : "사용자를 찾을 수 없음",
diff --git a/packages/rocketchat-authorization/i18n/nl.i18n.json b/packages/rocketchat-authorization/i18n/nl.i18n.json
index 5e8bfb8e955..5b85b6b0984 100644
--- a/packages/rocketchat-authorization/i18n/nl.i18n.json
+++ b/packages/rocketchat-authorization/i18n/nl.i18n.json
@@ -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",
diff --git a/packages/rocketchat-authorization/i18n/pl.i18n.json b/packages/rocketchat-authorization/i18n/pl.i18n.json
index 03956a989db..a022338c789 100644
--- a/packages/rocketchat-authorization/i18n/pl.i18n.json
+++ b/packages/rocketchat-authorization/i18n/pl.i18n.json
@@ -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 __user_added__ dodany.",
"User_not_found" : "Użytkownik nie znaleziony",
"User_removed" : "Użytkownik usunięty"
diff --git a/packages/rocketchat-authorization/i18n/pt.i18n.json b/packages/rocketchat-authorization/i18n/pt.i18n.json
index e1152abd2c3..b0bb242a6c7 100644
--- a/packages/rocketchat-authorization/i18n/pt.i18n.json
+++ b/packages/rocketchat-authorization/i18n/pt.i18n.json
@@ -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",
diff --git a/packages/rocketchat-authorization/i18n/ro.i18n.json b/packages/rocketchat-authorization/i18n/ro.i18n.json
index 10f94926353..30f9bb1036b 100644
--- a/packages/rocketchat-authorization/i18n/ro.i18n.json
+++ b/packages/rocketchat-authorization/i18n/ro.i18n.json
@@ -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",
diff --git a/packages/rocketchat-authorization/server/startup.coffee b/packages/rocketchat-authorization/server/startup.coffee
index d9bd6b1a7b1..7febc408c37 100644
--- a/packages/rocketchat-authorization/server/startup.coffee
+++ b/packages/rocketchat-authorization/server/startup.coffee
@@ -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' }
]
diff --git a/packages/rocketchat-channel-settings-mail-messages/i18n/de.i18n.json b/packages/rocketchat-channel-settings-mail-messages/i18n/de.i18n.json
index f22508aa5a5..5e5f1ba3fb4 100644
--- a/packages/rocketchat-channel-settings-mail-messages/i18n/de.i18n.json
+++ b/packages/rocketchat-channel-settings-mail-messages/i18n/de.i18n.json
@@ -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 alle 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...",
diff --git a/packages/rocketchat-channel-settings-mail-messages/i18n/pl.i18n.json b/packages/rocketchat-channel-settings-mail-messages/i18n/pl.i18n.json
index 6f31cf5a2e6..ba59cee84fe 100644
--- a/packages/rocketchat-channel-settings-mail-messages/i18n/pl.i18n.json
+++ b/packages/rocketchat-channel-settings-mail-messages/i18n/pl.i18n.json
@@ -1 +1,4 @@
-{ }
\ No newline at end of file
+{
+ "Choose_messages" : "Wybierz wiadomości",
+ "Mail_Messages" : "Wysyłanie wiadomości przez email"
+}
\ No newline at end of file
diff --git a/packages/rocketchat-channel-settings-mail-messages/server/methods/mailMessages.coffee b/packages/rocketchat-channel-settings-mail-messages/server/methods/mailMessages.coffee
index 446df06f288..f1c07f4bb78 100644
--- a/packages/rocketchat-channel-settings-mail-messages/server/methods/mailMessages.coffee
+++ b/packages/rocketchat-channel-settings-mail-messages/server/methods/mailMessages.coffee
@@ -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
diff --git a/packages/rocketchat-channel-settings/i18n/pl.i18n.json b/packages/rocketchat-channel-settings/i18n/pl.i18n.json
index 1258e187316..8200c8c1f59 100644
--- a/packages/rocketchat-channel-settings/i18n/pl.i18n.json
+++ b/packages/rocketchat-channel-settings/i18n/pl.i18n.json
@@ -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" : "__user_by__ zmienił(a) rodzaj pokoju na: __room_type__",
- "room_changed_topic" : "__user_by__ zmienił(a) temat pokoju na: __room_topic__"
+ "room_changed_topic" : "__user_by__ zmienił(a) temat pokoju na: __room_topic__",
+ "Room_topic_changed_successfully" : "Temat pokoju został zmieniony"
}
\ No newline at end of file
diff --git a/packages/rocketchat-cors/cors.coffee b/packages/rocketchat-cors/cors.coffee
index 38e411e857b..b7b557fbb82 100644
--- a/packages/rocketchat-cors/cors.coffee
+++ b/packages/rocketchat-cors/cors.coffee
@@ -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()
diff --git a/packages/rocketchat-integrations/package.js b/packages/rocketchat-integrations/package.js
index dc2b48f48e4..f5ce2880e3e 100644
--- a/packages/rocketchat-integrations/package.js
+++ b/packages/rocketchat-integrations/package.js
@@ -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) {
diff --git a/packages/rocketchat-integrations/server/api/api.coffee b/packages/rocketchat-integrations/server/api/api.coffee
index 54e564e7264..98e926b07de 100644
--- a/packages/rocketchat-integrations/server/api/api.coffee
+++ b/packages/rocketchat-integrations/server/api/api.coffee
@@ -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) ->
diff --git a/packages/rocketchat-integrations/server/methods/outgoing/updateOutgoingIntegration.coffee b/packages/rocketchat-integrations/server/methods/outgoing/updateOutgoingIntegration.coffee
index 26610e89785..2e2d7afb2d1 100644
--- a/packages/rocketchat-integrations/server/methods/outgoing/updateOutgoingIntegration.coffee
+++ b/packages/rocketchat-integrations/server/methods/outgoing/updateOutgoingIntegration.coffee
@@ -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)
diff --git a/packages/rocketchat-integrations/server/processWebhookMessage.js b/packages/rocketchat-integrations/server/processWebhookMessage.js
new file mode 100644
index 00000000000..ee684f4d59a
--- /dev/null
+++ b/packages/rocketchat-integrations/server/processWebhookMessage.js
@@ -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
+ }
+};
diff --git a/packages/rocketchat-integrations/server/triggers.coffee b/packages/rocketchat-integrations/server/triggers.coffee
index 6c815d45758..72fae25524a 100644
--- a/packages/rocketchat-integrations/server/triggers.coffee
+++ b/packages/rocketchat-integrations/server/triggers.coffee
@@ -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
diff --git a/packages/rocketchat-ldap/config_server.coffee b/packages/rocketchat-ldap/config_server.coffee
index 1964aaf48e3..66e79c07854 100644
--- a/packages/rocketchat-ldap/config_server.coffee
+++ b/packages/rocketchat-ldap/config_server.coffee
@@ -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
diff --git a/packages/rocketchat-ldap/ldap_server.js b/packages/rocketchat-ldap/ldap_server.js
index 197c21a9f98..7cf5ff8c44f 100644
--- a/packages/rocketchat-ldap/ldap_server.js
+++ b/packages/rocketchat-ldap/ldap_server.js
@@ -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;
diff --git a/packages/rocketchat-ldap/package.js b/packages/rocketchat-ldap/package.js
index 7c6b23a79d0..38720bb37dd 100644
--- a/packages/rocketchat-ldap/package.js
+++ b/packages/rocketchat-ldap/package.js
@@ -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
diff --git a/packages/rocketchat-lib/client/lib/openRoom.coffee b/packages/rocketchat-lib/client/lib/openRoom.coffee
index 0d3a594583c..7e74d9fd949 100644
--- a/packages/rocketchat-lib/client/lib/openRoom.coffee
+++ b/packages/rocketchat-lib/client/lib/openRoom.coffee
@@ -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
diff --git a/packages/rocketchat-lib/client/lib/settings.coffee b/packages/rocketchat-lib/client/lib/settings.coffee
index 2e96a93d50e..7a19eb1d3fb 100644
--- a/packages/rocketchat-lib/client/lib/settings.coffee
+++ b/packages/rocketchat-lib/client/lib/settings.coffee
@@ -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 /\/$/, ''
diff --git a/packages/rocketchat-lib/lib/MessageTypes.coffee b/packages/rocketchat-lib/lib/MessageTypes.coffee
index 3c6f3cea63a..58f651d4586 100644
--- a/packages/rocketchat-lib/lib/MessageTypes.coffee
+++ b/packages/rocketchat-lib/lib/MessageTypes.coffee
@@ -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 }
diff --git a/packages/rocketchat-lib/server/functions/sendMessage.coffee b/packages/rocketchat-lib/server/functions/sendMessage.coffee
index 6b14009c97c..fa30388ff35 100644
--- a/packages/rocketchat-lib/server/functions/sendMessage.coffee
+++ b/packages/rocketchat-lib/server/functions/sendMessage.coffee
@@ -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
diff --git a/packages/rocketchat-lib/server/functions/settings.coffee b/packages/rocketchat-lib/server/functions/settings.coffee
index fc9df927563..81b4099fe66 100644
--- a/packages/rocketchat-lib/server/functions/settings.coffee
+++ b/packages/rocketchat-lib/server/functions/settings.coffee
@@ -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
diff --git a/packages/rocketchat-lib/server/models/Messages.coffee b/packages/rocketchat-lib/server/models/Messages.coffee
index 3c9375f075b..c7e7bf5ba00 100644
--- a/packages/rocketchat-lib/server/models/Messages.coffee
+++ b/packages/rocketchat-lib/server/models/Messages.coffee
@@ -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 =
diff --git a/packages/rocketchat-lib/server/models/Subscriptions.coffee b/packages/rocketchat-lib/server/models/Subscriptions.coffee
index 77c697dd41a..5a324807120 100644
--- a/packages/rocketchat-lib/server/models/Subscriptions.coffee
+++ b/packages/rocketchat-lib/server/models/Subscriptions.coffee
@@ -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 =
diff --git a/packages/rocketchat-lib/server/startup/settings.coffee b/packages/rocketchat-lib/server/startup/settings.coffee
index 36d5778fee5..4f3bf96d8cb 100644
--- a/packages/rocketchat-lib/server/startup/settings.coffee
+++ b/packages/rocketchat-lib/server/startup/settings.coffee
@@ -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' }
diff --git a/packages/rocketchat-lib/server/startup/settingsOnLoadSMTP.coffee b/packages/rocketchat-lib/server/startup/settingsOnLoadSMTP.coffee
index 8047dd24417..67dfa65a82d 100644
--- a/packages/rocketchat-lib/server/startup/settingsOnLoadSMTP.coffee
+++ b/packages/rocketchat-lib/server/startup/settingsOnLoadSMTP.coffee
@@ -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
diff --git a/packages/rocketchat-livechat/app/client/views/message.coffee b/packages/rocketchat-livechat/app/client/views/message.coffee
index 1b49884bd82..87cc3d9164e 100644
--- a/packages/rocketchat-livechat/app/client/views/message.coffee
+++ b/packages/rocketchat-livechat/app/client/views/message.coffee
@@ -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')
diff --git a/packages/rocketchat-livechat/app/i18n/pl.i18n.json b/packages/rocketchat-livechat/app/i18n/pl.i18n.json
index 0c082b62370..f3e5e78e699 100644
--- a/packages/rocketchat-livechat/app/i18n/pl.i18n.json
+++ b/packages/rocketchat-livechat/app/i18n/pl.i18n.json
@@ -1,3 +1,5 @@
{
- "Start_Chat" : "Rozpocznij czat"
+ "Skip" : "Pomiń",
+ "Start_Chat" : "Rozpocznij czat",
+ "Survey" : "Ankieta"
}
\ No newline at end of file
diff --git a/packages/rocketchat-livechat/client/views/app/livechatAppearance.js b/packages/rocketchat-livechat/client/views/app/livechatAppearance.js
index a8415b6be65..94e56f6f9ca 100644
--- a/packages/rocketchat-livechat/client/views/app/livechatAppearance.js
+++ b/packages/rocketchat-livechat/client/views/app/livechatAppearance.js
@@ -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
diff --git a/packages/rocketchat-livechat/i18n/ar.i18n.json b/packages/rocketchat-livechat/i18n/ar.i18n.json
index 3685d82004b..5d22fd60b4c 100644
--- a/packages/rocketchat-livechat/i18n/ar.i18n.json
+++ b/packages/rocketchat-livechat/i18n/ar.i18n.json
@@ -12,5 +12,6 @@
"Please_fill_a_username" : "يرجى ملء اسم المستخدم",
"Saved" : "تم الحفظ",
"Send_a_message" : "إرسال رسالة",
+ "Theme" : "سمات",
"Time_in_seconds" : "الوقت بالثواني"
}
\ No newline at end of file
diff --git a/packages/rocketchat-livechat/i18n/pl.i18n.json b/packages/rocketchat-livechat/i18n/pl.i18n.json
index ce4ab92fc99..9a1059cc5e7 100644
--- a/packages/rocketchat-livechat/i18n/pl.i18n.json
+++ b/packages/rocketchat-livechat/i18n/pl.i18n.json
@@ -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"
}
\ No newline at end of file
diff --git a/packages/rocketchat-livechat/livechat.js b/packages/rocketchat-livechat/livechat.js
index b33e6eb5909..1e854bd8f64 100644
--- a/packages/rocketchat-livechat/livechat.js
+++ b/packages/rocketchat-livechat/livechat.js
@@ -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');
diff --git a/packages/rocketchat-mailer/i18n/ar.i18n.json b/packages/rocketchat-mailer/i18n/ar.i18n.json
index 7301eab2102..d93ff17e2ea 100644
--- a/packages/rocketchat-mailer/i18n/ar.i18n.json
+++ b/packages/rocketchat-mailer/i18n/ar.i18n.json
@@ -1,4 +1,6 @@
{
+ "Dry_run" : "تنفيذ تجريبي",
+ "Dry_run_description" : "سيتم إرسال رسالة بريدية واحدة إلى نفس العنوان الموجود في خانة \"من\". تأكد من كون ذلك العنوان البريدي فعال",
"Email_from" : "من",
"Email_subject" : "الموضوع",
"Send_email" : "إرسال البريد الإلكتروني",
diff --git a/packages/rocketchat-mailer/i18n/pl.i18n.json b/packages/rocketchat-mailer/i18n/pl.i18n.json
index 292bea7592f..e44e595d29f 100644
--- a/packages/rocketchat-mailer/i18n/pl.i18n.json
+++ b/packages/rocketchat-mailer/i18n/pl.i18n.json
@@ -6,6 +6,7 @@
"Email_body" : "Treść wiadomości",
"Mailer" : "Wyślij email użytkownikom",
"Mailer_body_tags" : "Musisz użyć znacznika [unsubscribe] aby zawrzeć w treści odnośnik do rezygnacji z subskrypcji.