From 1c50d1e9f9ea15e5ffe60110413c6f7199b2207d Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Sat, 9 Jan 2021 13:18:23 -0500 Subject: [PATCH 001/203] Translate /config/locales/en.yml in de_DE (#2419) translation completed for the source file '/config/locales/en.yml' on the 'de_DE' language. Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com> --- config/locales/de_DE.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/config/locales/de_DE.yml b/config/locales/de_DE.yml index f7afa395..ef7baa0b 100644 --- a/config/locales/de_DE.yml +++ b/config/locales/de_DE.yml @@ -72,7 +72,7 @@ de_DE: email_mapping: info: "Ordnen Sie den Nutzer anhand seiner E-Mail einer Rolle zu. Muss im Format email1=Rolle1,email2=Rolle2 erfolgen" title: Rollenzuordnung per E-Mail - update: + update: log_level: title: Log-Level information: Log-Level für die gesamte Anwendung ändern @@ -94,7 +94,7 @@ de_DE: title: Banner für Wartungsarbeiten display: Setzen clear: Löschen - time: "Beispiel: Aktualisierung geplant am 13. Dezember um 23:00 Uhr MEZ. Nutzer könnten Probleme bei der Anmeldung haben." + time: "Beispiel: Aktualisierung geplant am 13. Dezember um 23:00 Uhr MEZ. Nutzer könnten Probleme bei der Anmeldung haben." preupload: info: "Nutzer können eine Präsentation vorab hochladen, die als Standardpräsentation für diesen speziellen Raum verwendet werden soll" title: "Nutzern erlauben, Präsentationen vorab hochzuladen" @@ -549,7 +549,7 @@ de_DE: fail: "Raum konnte nicht gelöscht werden (%{error})" enter_the_access_code: Raumzugangscode bitte eingeben invalid_provider: "Sie haben eine ungültige URL eingegeben, bitte überprüfen Sie die URL und versuchen Sie es erneut." - invitation_description: "Sie wurden zu %{name} über BigBlueButton zur Teilnahme eingeladen. Um beizutreten, klicken Sie auf den obigen Link und geben Sie Ihren Namen ein." + invitation_description: "Sie wurden zu %{name} über BigBlueButton zur Teilnahme eingeladen. Um beizutreten, klicken Sie auf den obigen Link und geben Sie Ihren Namen ein." invited: Sie wurden zur Teilnahme eingeladen recording_present: "Ich bestätige, dass diese Sitzung aufgezeichnet wird. Dies kann meine Sprach- und Videoaufnahmen beinhalten, wenn diese geteilt werden." invite_participants: Teilnehmer einladen From caf490237bfea8217850a5a1675bd9cc7ed3b2a8 Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Sun, 10 Jan 2021 15:01:39 -0500 Subject: [PATCH 002/203] Translate /config/locales/en.yml in gl (#2418) translation completed for the source file '/config/locales/en.yml' on the 'gl' language. Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com> Co-authored-by: Ahmad Farhat --- config/locales/gl.yml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/config/locales/gl.yml b/config/locales/gl.yml index da509910..fb1ba3ad 100644 --- a/config/locales/gl.yml +++ b/config/locales/gl.yml @@ -72,7 +72,7 @@ gl: email_mapping: info: "Asignar o usuario a un rol usando o seu correo-e. Debe ter o formato email1=rol1,email2=rol2" title: Asignación de roles por correo-e - update: + update: log_level: title: Nivel de rexistro information: Cambiar o nivel de rexistro para o despregamento completo @@ -94,7 +94,7 @@ gl: title: Cartel de mantemento display: Estabelecer clear: Limpar - time: "Exemplo: Actualización programada para o 13 de decembro ás 23:00 ET. Os usuarios poden ter problemas para iniciar sesión." + time: "Exemplo: Actualización programada para o 13 de decembro ás 23:00 ET. Os usuarios poden ter problemas para iniciar sesión." preupload: info: Os usuarios poden cargar previamente unha presentación para que a utilicen como presentación predeterminada para esa sala específica title: Permitirlle aos usuarios precargar as presentacións @@ -477,6 +477,7 @@ gl: office365: Office 365 twitter: Twitter ldap: LDAP + openid_connect: Conectar con OpenID recaptcha: errors: recaptcha_unreachable: Ouh! non podemos validar a resposta de reCAPTCHA. Tenteo de novo. @@ -548,7 +549,7 @@ gl: fail: "Non foi posíbel eliminar a sala (%{error})" enter_the_access_code: Introduza o código de acceso á sala invalid_provider: Introduciu un URL non válido. Comprobe o URL e ténteo de novo. - invitation_description: "Foi convidado a unirse a %{name} empregando BigBlueButton. Para unirse, prema na ligazón superior e escriba o seu nome." + invitation_description: "Foi convidado a unirse a %{name} empregando BigBlueButton. Para unirse, prema na ligazón superior e escriba o seu nome." invited: Foi convidado a unirse a recording_present: Declaro ser coñecedor de que se vai gravar esta sesión. Isto pode incluír a miña voz e imaxe de vídeo se están activados. invite_participants: Convidar a participantes From a5a203297879d2dcf1fd323e8c39f01b4f3eefa7 Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Sun, 10 Jan 2021 15:16:29 -0500 Subject: [PATCH 003/203] Translate /config/locales/en.yml in nl (#2415) translation completed for the source file '/config/locales/en.yml' on the 'nl' language. Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com> Co-authored-by: Ahmad Farhat --- config/locales/nl.yml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/config/locales/nl.yml b/config/locales/nl.yml index 248de239..47f6a84c 100644 --- a/config/locales/nl.yml +++ b/config/locales/nl.yml @@ -72,7 +72,7 @@ nl: email_mapping: info: "Wijs de gebruiker een rol toe met behulp van zijn e-mailadres. Moet de indeling email1=rol1,email2=rol2 hebben" title: Roltoewijzing via e-mail - update: + update: log_level: title: Log Niveau information: Wijzig het Log Niveau voor de hele installatie @@ -94,7 +94,7 @@ nl: title: Onderhoudsbanner display: Aan clear: Uit - time: "Voorbeeld: update gepland op 13 december om 23:00 ET. Gebruikers kunnen problemen ondervinden bij het inloggen." + time: "Voorbeeld: update gepland op 13 december om 23:00 ET. Gebruikers kunnen problemen ondervinden bij het inloggen." preupload: info: Gebruikers kunnen een presentatie vooraf uploaden om als standaardpresentatie voor die specifieke ruimte te gebruiken title: Sta gebruikers toe presentaties vooraf te uploaden @@ -477,6 +477,7 @@ nl: office365: Office 365 twitter: Twitter ldap: LDAP + openid_connect: OpenID Connect recaptcha: errors: recaptcha_unreachable: "Oeps, we hebben uw reCAPTCHA-antwoord niet kunnen valideren. Probeer het opnieuw." @@ -548,7 +549,7 @@ nl: fail: "Kan kamer niet verwijderen (%{error})" enter_the_access_code: Voer de toegangscode van de kamer in invalid_provider: U heeft een ongeldige URL ingevoerd. Controleer de URL en probeer het opnieuw. - invitation_description: "Je bent uitgenodigd om deel te nemen aan %{name} via BigBlueButton. Klik op bovenstaande link en voert u uw naam in om te beginnen." + invitation_description: "Je bent uitgenodigd om deel te nemen aan %{name} via BigBlueButton. Klik op bovenstaande link en voert u uw naam in om te beginnen." invited: Je bent uitgenodigd om lid te worden recording_present: Ik erken dat deze sessie zal worden opgenomen. Deze opname kan mijn stem en video bevatten indien dit is ingeschakeld. invite_participants: Deelnemers uitnodigen From 9cd08dab54dfdc5a812cee6b5d6c785b65e1d950 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 11 Jan 2021 18:10:00 -0500 Subject: [PATCH 004/203] Bump redcarpet from 3.5.0 to 3.5.1 (#2425) Bumps [redcarpet](https://github.com/vmg/redcarpet) from 3.5.0 to 3.5.1. - [Release notes](https://github.com/vmg/redcarpet/releases) - [Changelog](https://github.com/vmg/redcarpet/blob/master/CHANGELOG.md) - [Commits](https://github.com/vmg/redcarpet/compare/v3.5.0...v3.5.1) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index 237cb49a..7c95ffa7 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -330,7 +330,7 @@ GEM ffi (~> 1.0) recaptcha (5.5.0) json - redcarpet (3.5.0) + redcarpet (3.5.1) redis (4.1.4) remote_syslog_logger (1.0.4) syslog_protocol From 2b0a80c7ebff991f815da4a10c5b16b3edb01850 Mon Sep 17 00:00:00 2001 From: Ahmad Farhat Date: Tue, 12 Jan 2021 17:36:51 -0500 Subject: [PATCH 005/203] GRN2-277: Optimize server recordings to make it useable for large deployments (#2411) * First changes to server recordings * Update server recordings * Rubocop * Make sure to return nothing for empty searches * Made sure exactly the right amount of recordings are returned * Added test cases --- app/assets/stylesheets/admins.scss | 2 +- app/controllers/admins_controller.rb | 15 ++++-- app/controllers/concerns/populator.rb | 52 +++++++++++++++++-- app/controllers/concerns/recorder.rb | 2 +- app/models/room.rb | 2 +- .../components/_manage_users_table.html.erb | 5 ++ .../admins/components/_recordings.html.erb | 2 +- .../components/_server_room_row.html.erb | 3 ++ .../admins/components/_setting_view.html.erb | 2 +- app/views/admins/server_recordings.html.erb | 2 +- .../shared/components/_subtitle.html.erb | 8 +++ config/locales/en.yml | 2 + spec/controllers/admins_controller_spec.rb | 20 +++++++ 13 files changed, 102 insertions(+), 15 deletions(-) diff --git a/app/assets/stylesheets/admins.scss b/app/assets/stylesheets/admins.scss index 65036144..38c40afc 100644 --- a/app/assets/stylesheets/admins.scss +++ b/app/assets/stylesheets/admins.scss @@ -98,4 +98,4 @@ .admin-tabs { justify-content: space-around; -} +} \ No newline at end of file diff --git a/app/controllers/admins_controller.rb b/app/controllers/admins_controller.rb index d51aeca0..ee963ac3 100644 --- a/app/controllers/admins_controller.rb +++ b/app/controllers/admins_controller.rb @@ -56,12 +56,19 @@ class AdminsController < ApplicationController # GET /admins/server_recordings def server_recordings - server_rooms = rooms_list_for_recordings + @search = params[:search] || "" - @search, @order_column, @order_direction, recs = - all_recordings(server_rooms, params.permit(:search, :column, :direction), true, true) + if @search.present? + if @search.include? "@" + user_email = @search + else + room_uid = @search + end + else + @latest = true + end - @pagy, @recordings = pagy_array(recs) + @pagy, @recordings = pagy_array(recordings_to_show(user_email, room_uid)) end # GET /admins/rooms diff --git a/app/controllers/concerns/populator.rb b/app/controllers/concerns/populator.rb index b7865462..a8df30d6 100644 --- a/app/controllers/concerns/populator.rb +++ b/app/controllers/concerns/populator.rb @@ -56,12 +56,22 @@ module Populator end end - # Returns list of rooms needed to get the recordings on the server - def rooms_list_for_recordings - if Rails.configuration.loadbalanced_configuration - Room.includes(:owner).where(users: { provider: @user_domain }).pluck(:bbb_id) + # Returns the correct recordings based on the users inputs + def recordings_to_show(user = nil, room = nil) + if user.present? + # Find user and get his recordings + rooms = User.find_by(email: user)&.rooms&.pluck(:bbb_id) + return all_recordings(rooms) if user.present? + + [] # return no recs if room not found + elsif room.present? + # Find room and get its recordings + room = Room.find_by(uid: room)&.bbb_id + return all_recordings([room]) if room.present? + + [] else - Room.pluck(:bbb_id) + latest_recordings end end @@ -75,4 +85,36 @@ module Populator list.admins_search(@search).order(updated_at: :desc) end + + private + + # Returns exactly 1 page of the latest recordings + def latest_recordings + return_length = Rails.configuration.pagination_number + recordings = [] + counter = 0 + + # Manually paginate through the rooms + while recordings.length < return_length + rooms = if Rails.configuration.loadbalanced_configuration + Room.includes(:owner) + .where(users: { provider: @user_domain }) + .order(last_session: :desc) + .limit(return_length) + .offset(counter * return_length) + .pluck(:bbb_id) + else + Room.order(last_session: :desc) + .limit(return_length) + .offset(counter * return_length) + .pluck(:bbb_id) + end + + break if rooms.blank? + counter += 1 + recordings.push(*all_recordings(rooms)) + end + + recordings[0..return_length] + end end diff --git a/app/controllers/concerns/recorder.rb b/app/controllers/concerns/recorder.rb index 68607977..0365fb2d 100644 --- a/app/controllers/concerns/recorder.rb +++ b/app/controllers/concerns/recorder.rb @@ -37,7 +37,7 @@ module Recorder def all_recordings(room_bbb_ids, search_params = {}, ret_search_params = false, search_name = false) res = { recordings: [] } - until room_bbb_ids.empty? + until room_bbb_ids.empty? || res[:recordings].length > Rails.configuration.pagination_number # bbb.get_recordings returns an object # take only the array portion of the object that is returned full_res = get_multiple_recordings(room_bbb_ids.pop(Rails.configuration.pagination_number)) diff --git a/app/models/room.rb b/app/models/room.rb index 1d9abf5b..ec8f9d2e 100644 --- a/app/models/room.rb +++ b/app/models/room.rb @@ -51,7 +51,7 @@ class Room < ApplicationRecord # Rely on manual ordering if trying to sort by status return order_by_status(table, running_ids) if column == "status" - return table.order("COALESCE(rooms.last_session,rooms.created_at) DESC") if column == "created_at" + return table.order(Arel.sql("COALESCE(rooms.last_session,rooms.created_at) DESC")) if column == "created_at" return table.order(Arel.sql("rooms.#{column} #{direction}")) if table.column_names.include?(column) diff --git a/app/views/admins/components/_manage_users_table.html.erb b/app/views/admins/components/_manage_users_table.html.erb index f4d00db3..1fbfc3ca 100644 --- a/app/views/admins/components/_manage_users_table.html.erb +++ b/app/views/admins/components/_manage_users_table.html.erb @@ -90,6 +90,11 @@ + <% unless user.rooms.length.zero? %> + <%= link_to admin_recordings_path(search: user.email), class: "dropdown-item" do %> + <%= t("administrator.rooms.table.recordings") %> + <% end %> + <% end %> <%= button_to admin_ban_path(user_uid: user.uid), class: "dropdown-item", "data-disable": "" do %> <%= t("administrator.users.settings.ban") %> <% end %> diff --git a/app/views/admins/components/_recordings.html.erb b/app/views/admins/components/_recordings.html.erb index 8d890fef..6030b692 100644 --- a/app/views/admins/components/_recordings.html.erb +++ b/app/views/admins/components/_recordings.html.erb @@ -93,7 +93,7 @@ <% end %> - <% if !@recordings.empty?%> + <% if !@recordings.empty? && !@latest%>
<%== pagy_bootstrap_nav(@pagy) %>
diff --git a/app/views/admins/components/_server_room_row.html.erb b/app/views/admins/components/_server_room_row.html.erb index 34d9a06f..6aece4c8 100644 --- a/app/views/admins/components/_server_room_row.html.erb +++ b/app/views/admins/components/_server_room_row.html.erb @@ -65,6 +65,9 @@ <%= t("room.settings") %> + <%= link_to admin_recordings_path(search: room.uid), class: "dropdown-item" do %> + <%= t("administrator.rooms.table.recordings") %> + <% end %> <% if preupload_allowed? %> <%= t("room.add_presentation") %> diff --git a/app/views/admins/components/_setting_view.html.erb b/app/views/admins/components/_setting_view.html.erb index 1b2eb6ec..df7dffe1 100644 --- a/app/views/admins/components/_setting_view.html.erb +++ b/app/views/admins/components/_setting_view.html.erb @@ -17,7 +17,7 @@
- <%= render "shared/components/subtitle", subtitle: setting_title, search: search %> + <%= render "shared/components/subtitle", subtitle: setting_title, search: search, search_info: defined?(search_info) ? search_info : "" %>
diff --git a/app/views/admins/server_recordings.html.erb b/app/views/admins/server_recordings.html.erb index b2732e08..a3292771 100644 --- a/app/views/admins/server_recordings.html.erb +++ b/app/views/admins/server_recordings.html.erb @@ -21,7 +21,7 @@ <%= render "admins/components/menu_buttons" %>
- <%= render "admins/components/setting_view", setting_id: "recordings", setting_title: t("administrator.recordings.title"), search: true %> + <%= render "admins/components/setting_view", setting_id: "recordings", setting_title: t("administrator.recordings.latest"), search: true, search_info: t("administrator.recordings.search_info") %>
diff --git a/app/views/shared/components/_subtitle.html.erb b/app/views/shared/components/_subtitle.html.erb index 43acd90a..56fd8fc7 100644 --- a/app/views/shared/components/_subtitle.html.erb +++ b/app/views/shared/components/_subtitle.html.erb @@ -35,6 +35,14 @@ + <% if defined?(search_info) && search_info.present? %> +
+ + + <%= search_info %> + +
+ <% end %> <% else %>
diff --git a/config/locales/en.yml b/config/locales/en.yml index 9987acec..bfc1ae18 100755 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -138,8 +138,10 @@ en: settings: Site Settings successfully changed unauthorized: You are not authorized to perform actions on this user recordings: + latest: Latest Recordings title: Server Recordings no_recordings: This server has no recordings. + search_info: Enter a user's full email or a room's uid roles: appear_in_share_list: Include users with this role in the dropdown for sharing rooms can_create_rooms: Can create rooms diff --git a/spec/controllers/admins_controller_spec.rb b/spec/controllers/admins_controller_spec.rb index a172ea89..3d009f21 100644 --- a/spec/controllers/admins_controller_spec.rb +++ b/spec/controllers/admins_controller_spec.rb @@ -28,6 +28,26 @@ describe AdminsController, type: :controller do @admin.set_role :admin end + describe "Server Recordings" do + it "renders the server_recordings page" do + @request.session[:user_id] = @admin.id + + get :server_recordings + + expect(response).to render_template(:server_recordings) + end + end + + describe "Server Rooms" do + it "renders the server_rooms page" do + @request.session[:user_id] = @admin.id + + get :server_rooms + + expect(response).to render_template(:server_rooms) + end + end + describe "User Roles" do before do allow(Rails.configuration).to receive(:enable_email_verification).and_return(true) From 9b0b1fa028c56c0b9fcb903c695919315b41e5a2 Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Wed, 13 Jan 2021 17:01:38 -0500 Subject: [PATCH 006/203] Translate /config/locales/en.yml in gl (#2429) translation completed for the source file '/config/locales/en.yml' on the 'gl' language. Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com> --- config/locales/gl.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/config/locales/gl.yml b/config/locales/gl.yml index fb1ba3ad..33c0ff35 100644 --- a/config/locales/gl.yml +++ b/config/locales/gl.yml @@ -138,8 +138,10 @@ gl: settings: Os axustes do sitio foron cambiados correctamente unauthorized: Non está autorizado para executar accións sobre este usuario recordings: + latest: Últimas gravacións title: Gravacións do servidor no_recordings: Este servidor non ten gravacións. + search_info: Introduza o correo-e completo dun usuario ou o UID dunha sala roles: appear_in_share_list: Incluír usuarios con este rol no menú despregábel para compartir salas can_create_rooms: Pode crear salas From f8bebf99553d3f622d607657388d21a7b0b868fb Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Wed, 13 Jan 2021 17:24:31 -0500 Subject: [PATCH 007/203] Translate /config/locales/en.yml in de_DE (#2427) translation completed for the source file '/config/locales/en.yml' on the 'de_DE' language. Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com> Co-authored-by: Ahmad Farhat --- config/locales/de_DE.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/config/locales/de_DE.yml b/config/locales/de_DE.yml index ef7baa0b..547fcf47 100644 --- a/config/locales/de_DE.yml +++ b/config/locales/de_DE.yml @@ -138,8 +138,10 @@ de_DE: settings: Grundeinstellungen erfolgreich geändert unauthorized: "Sie haben nicht die notwendigen Rechte, um diese Änderung bei diesem Teilnehmer vorzunehmen." recordings: + latest: Aktuelle Aufzeichnungen title: Serveraufzeichnungen no_recordings: Keine Aufzeichnungen vorhanden. + search_info: Geben Sie die vollständige E-Mail eines Nutzers oder die Raum-ID ein roles: appear_in_share_list: Nutzer mit dieser Rolle im Dropdown-Menü zum Teilen von Räumen einschließen can_create_rooms: Kann Räume erstellen From d45611e11d57643c41baa7124d986999058faaa4 Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Wed, 13 Jan 2021 17:47:15 -0500 Subject: [PATCH 008/203] Translate /config/locales/en.yml in es (#2423) translation completed for the source file '/config/locales/en.yml' on the 'es' language. Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com> Co-authored-by: Ahmad Farhat --- config/locales/es.yml | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/config/locales/es.yml b/config/locales/es.yml index 74666145..49b23d21 100644 --- a/config/locales/es.yml +++ b/config/locales/es.yml @@ -69,6 +69,10 @@ es: regular: Regular lighten: Aclarar darken: Oscurecer + email_mapping: + info: "Asigna al usuario a un rol usando su correo electrónico. Debe estar en el formato email1=rol1,email2=rol2" + title: "Asignación de rol por correo electrónico " + update: log_level: title: Nivel de registro information: Cambiar el nivel de registro para toda la implementación @@ -90,7 +94,7 @@ es: title: Banner de mantenimiento display: Establece clear: Limpia - time: "Ejemplo: actualización programada para el 13 de diciembre a las 23:00h. Los usuarios pueden experimentar problemas para iniciar sesión." + time: "Ejemplo: actualización programada para el 13 de diciembre a las 23:00h. Los usuarios pueden experimentar problemas para iniciar sesión." preupload: info: Los usuarios pueden cargar previamente una presentación para usarla como presentación predeterminada para esa sala específica title: Permitir a los usuarios cargar previamente presentaciones @@ -111,6 +115,7 @@ es: tabs: appearance: Apariencia administration: Administración + registration: Registro settings: Configuración title: Configuración del sitio web flash: @@ -393,7 +398,7 @@ es: delete_account: confirm: "¿Estas seguro de querer eliminar esta cuenta de usuario?" delete: Estoy seguro de eliminar ésta cuenta - keep: "De hecho, la conserbaré" + keep: "De hecho, la conservaré" delete_warning: Esta acción desactiva la cuenta de usuario. Todos los usuarios desactivados son listados en la pestaña de eliminados. warning: "Esta decisión es final, No podrás recuperar la información asociada" delete_rec: @@ -472,6 +477,7 @@ es: office365: Office 365 twitter: Twitter ldap: LDAP + openid_connect: OpenID Connect recaptcha: errors: recaptcha_unreachable: Oh no! La respuesta de tu reCAPTCHA falló. Intentalo de nuevo. @@ -543,7 +549,7 @@ es: fail: "Se ha producido un error al eliminar la sala (%{error})" enter_the_access_code: Introduce el código de acceso de la sala invalid_provider: El enlace introducido no es válido. Revísalo e inténtalo de nuevo. - invitation_description: "Ha sido invitado a unirse a %{name} usando BigBlueButton. Para unirse, haga clic en el enlace superior e introduzca su nombre." + invitation_description: "Ha sido invitado a unirse a %{name} usando BigBlueButton. Para unirse, haga clic en el enlace superior e introduzca su nombre." invited: Ha sido invitado a unirse recording_present: Reconozco que esta sesión se va a grabar. Esto puede incluir mi voz y vídeo si está habilitado. invite_participants: Invitar participantes @@ -578,7 +584,7 @@ es: shared_access_success: Sala compartida correctamente shared_access_error: Ha habido un error compartiendo la sala start: Iniciar - search: Buscar por grupo... + search: Buscar por sala... unavailable: Esta sala no se encuentra disponible debido a que la cuenta de correo de su propietario no ha sido verificado. update_settings_error: Ocurrió un error al actualizar la configuración de la sala update_settings_success: La configuración de la sala fue actualizada exitósamente From c92917b61da58d3c47f123681b08b5c6bfbbb534 Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Wed, 13 Jan 2021 17:56:11 -0500 Subject: [PATCH 009/203] Translate /config/locales/en.yml in ar (#2404) translation completed for the source file '/config/locales/en.yml' on the 'ar' language. Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com> Co-authored-by: Ahmad Farhat --- config/locales/ar.yml | 100 ++++++++++++++++++++++++++++++++++++++---- 1 file changed, 91 insertions(+), 9 deletions(-) diff --git a/config/locales/ar.yml b/config/locales/ar.yml index 729d09c8..cff5518d 100644 --- a/config/locales/ar.yml +++ b/config/locales/ar.yml @@ -36,12 +36,25 @@ ar: enabled: مفعل info: السماح للمستخدمين المصادق عليهم فقط بالانضمام إلى غرفة title: طلب مصادقة للغرف - user-info: يجب تسجيل الدخول للانضمام إلى هذه الغرفة + user-info: يجب عليك تسجيل الدخول أعلاه للانضمام إلى هذه الغرفة. branding: change: تغيير الصورة info: تغيير صورة العلامة التجارية التي تظهر في الزاوية العلوية اليمنى placeholder: رابط الصورة... title: صورة العلامة التجارية + invalid: URL غير صالح + legal: + change: تغيير URL + info: قم بتغيير رابط الشروط الذي يظهر في أسفل الصفحة + placeholder: عنوان URL الشروط ... + title: الشروط + invalid: URL غير صالح + privpolicy: + change: تغيير URL + info: غيّر رابط سياسة الخصوصية الذي يظهر أسفل الصفحة + placeholder: URL سياسة الخصوصية... + title: سياسة الخصوصية + invalid: URL غير صالح cache: info: مسح ذاكرة التخزين المؤقت الخاصة بالمزود الذي يؤدي إلى طلب جديد للمعلومات المحدثة title: مسح ذاكرة التخزين المؤقت لمزود الخدمة @@ -56,6 +69,10 @@ ar: regular: الأساسي lighten: الفاتح darken: معتم + email_mapping: + info: تعيين دور المستخدم باستعمال بريده الإلكتروني. يجب أن يكون بالتنسيق email1 = role1 ، email2 = role2 + title: تعيين الدور بالبريد الإلكتروني + update: log_level: title: مستوى السجل information: تغيير مستوى السجل للنشر بأكمله @@ -69,6 +86,18 @@ ar: info: ضبط الظهور الافتراضي للتسجيلات الجديدة title: تسجيل الظهور الافتراضي warning: سيتم تطبيق هذه الإعدادات فقط على الغرف التي لا تعمل حاليا + require_consent: + info: يتيح هذا الإعداد إعداد الغرفة الذي يسمح لمالكي الغرفة بتحديد الغرف التي يمكن تسجيلها. يجب على المستخدمين الذين ينضمون إلى غرفة مسجلة الموافقة قبل الانضمام. + title: تتطلب موافقة مالك الغرفة والمنضم على التسجيل + maintenance_banner: + info: يعرض لافتة لإعلام المستخدم بالصيانة المجدولة + title: لافتة الصيانة + display: ضبط + clear: مسح + time: "مثال: التحديث مجدول في 13 ديسمبر @ 23:00 بالتوقيت الشرقي. قد يواجه المستخدمون مشاكل في تسجيل الدخول." + preupload: + info: يمكن للمستخدمين تحميل عرض تقديمي مسبق لاستخدامه كعرض تقديمي افتراضي لتلك الغرفة المحددة + title: السماح للمستخدمين بتحميل العروض التقديمية مسبقًا registration: info: تغيير طريقة تسجيل المستخدمين على الموقع title: طريقة التسجيل @@ -83,6 +112,11 @@ ar: info: سيؤدي التعطيل إلى إزالة الأيقونة من القائمة المنسدلة لخيارات الغرفة، وبذلك لن يتمكن المستخدمون من مشاركة الغرف title: السماح للمستخدمين بمشاركة الغرف subtitle: تخصيص Greenlight + tabs: + appearance: المظهر + administration: الادارة + registration: التسجيل + settings: إعدادات title: إعدادات الموقع flash: approved: تمت الموافقة على المستخدم بنجاح. @@ -93,13 +127,14 @@ ar: demoted: تم خفض رتبة المستخدم بنجاح invite: "تم إرسال الدعوة بنجاح إلى %{email}" invite_email_verification: يجب تمكين رسائل البريد الإلكتروني من أجل استخدام هذه الطريقة. الرجاء الاتصال بمسؤول النظام. - merge_fail: هناك مشكلة في دمج حسابات المستخدمين. يرجى التحقق من المستخدمين الذين تم اختيارهم والمحاولة مرة أخرى + merge_fail: هناك مشكلة في دمج حسابات المستخدمين. يرجى التحقق من المستخدمين الذين تم اختيارهم والمحاولة مرة أخرى merge_success: دمج حسابات المستخدمين بنجاح perm_deleted: تم حذف المستخدم نهائيًا promoted: تم ترقية المستخدم بنجاح registration_method_updated: تم تحديث طريقة التسجيل بنجاح reset_password: تم إرسال بريد الكتروني للمستخدم لإعادة ضبط كلمة المرور الخاصة به (نأمل مراجعة مجلد البريد المزعج في حال عدم وصوله إلى صندوق الوارد) restored: تمت استعادة المستخدم بنجاح + room_configuration: تم تغيير إعدادات الغرفة بنجاح settings: تم تغيير إعدادات الموقع بنجاح unauthorized: غير مصرح لك بتنفيذ إجراءات على هذا المستخدم recordings: @@ -122,16 +157,36 @@ ar: edit_site_settings: السماح للمستخدمين المنتمين لهذا الدور بتحرير اعدادت الموقع edit_roles: السماح للمستخدمين المنتمين لهذا الدور بتحرير بقية الأدوار manage_users: السماح للمستخدمين المنتمين لهذا الدور بإدارة المستخدمين الآخرين - invalid_assignment: حدثت مشكلة عند تعيين الأدوار للمستخدم. الرجاء التحقق من القيم والمحاولة مرة أخرى + invalid_assignment: حدثت مشكلة عند تعيين الأدوار للمستخدم. الرجاء التحقق من القيم والمحاولة مرة أخرى colour: title: لون الدور info: تعيين اللون الذي سيرتبط بالدور + room_configuration: + title: إعدادات الغرفة + mute: + info: كتم صوت المستخدم تلقائيًا عند انضمامه إلى اجتماع BigBlueButton + require_moderator: + info: ينبه مشرف اجتماع BigBlueButton عندما يحاول المستخدم الانضمام. إذا تمت الموافقة على المستخدم ، فسيتمكن من الانضمام إلى الاجتماع. + allow_any: + info: يسمح لأي مستخدم ببدء الاجتماع في أي وقت. بشكل افتراضي ، يمكن لمالك الغرفة فقط بدء الاجتماع. + all_moderator: + info: يمنح جميع المستخدمين امتيازات المشرف في BigBlueButton عند انضمامهم إلى الاجتماع. + recordings: + info: يسمح لمالكي الغرفة بتحديد ما إذا كانوا يريدون خيار تسجيل غرفة أم لا. في حالة التمكين ، لا يزال يتعين على المشرف النقر على الزر "تسجيل" بمجرد بدء الاجتماع. + options: + disabled: معطل + enabled: ممكّن دائمًا + optional: اختياري rooms: + timeout: "نظرًا لانتهاء مهلة طلب الخادم %{server} ، فقد لا تكون معلومات الحالة والمشاركين دقيقة" title: غرف الخادم table: + ended: "انتهت: %{session}" id: المعرف not_running: لا يعمل + participants: المشاركون running: يعمل + started: "بدأت: %{session}" status: حالة view: عرض title: إعدادات المؤسسة @@ -146,18 +201,21 @@ ar: delete: حذف edit: تحرير edit_roles: تعديل أدوار المستخدم + merge: دمج perm_delete: حذف بشكل دائم unban: إلغاء حظر المستخدم undelete: تراجع عن الحذف table: authenticator: المصادق created: انشاء + time: وقت الإرسال name: الاسم not_found: لا يوجد مستخدم يطابق بحثك no_users: لم يتم العثور على أي مستخدمين role: الدور uid: معرف المستخدم username: اسم المستخدم + valid: صالح title: إدارة المستخدمين add_to_google_calendar: "إضافة إلى تقويم Google" bigbluebutton: BigBlueButton @@ -228,6 +286,8 @@ ar: designs: تصاميم مخصصة authentication: مصادقة المستخدم footer: + legal: الشروط + privpolicy: سياسة الخصوصية powered_by: "مشغل بواسطة%{href}." forgot_password: subtitle: هل نسيت كلمة المرور @@ -317,8 +377,6 @@ ar: verify_text: 'للتحقق من حسابك ، اتبع هذا الرابط بالنقر عليه: %{url}' verify_link: التحقق من الحساب thanks: شكرا لانضمامك ونتمنى لك يوماً موفقاً. - maintenance: - window_alert: "نافذة الصيانة المجدولة لـ %{date}" max_concurrent: وصلت إلى الحد الأقصى لعدد الجلسات المتزامنة المسموح بها! merged: المدمجة modal: @@ -343,6 +401,10 @@ ar: keep: في الواقع ، سأحافظ عليه. delete_warning: سيؤدي ذلك إلى إلغاء تنشيط حساب المستخدم. يمكن العثور على جميع المستخدمين غير النشطين تحت علامة تبويب المحذوفات. warning: هذا القرار نهائي.لن تكون قادرًا على استعادة البيانات المرتبطة. + delete_rec: + delete: أنا متأكد ، احذف هذا التسجيل. + header: هل أنت متأكد أنك تريد حذف هذا التسجيل؟ + warning: لن تتمكن من استعادة هذا التسجيل delete_room: confirm: "هل أنت متأكد أنك تريد حذف %{room}؟" delete: أنا متأكد قم بحذف هذه الغرفة. @@ -350,7 +412,7 @@ ar: warning: لن تكون قادراً على استعادة هذه الغرفة recording_warning: "أو أي من التسجيلات المرتبطة بـ %{recordings_num} الخاصة به." invite_user: - email_placeholder: أدخل عناوين البريد لالكتروني للمستخدمين (استخدم الفاصلة للفصل بينها) + email_placeholder: أدخل عناوين البريد الإلكتروني للمستخدمين (مفصولة بالفارزة) footer: سوف يتلقى المستخدم رسالة بريد إلكتروني مع تعليمات حول كيفية الاشتراك send: إرسال دعوة title: دعوة المستخدم @@ -358,6 +420,14 @@ ar: or: أو with: "الدخول بـ %{provider}" forgot_password: هل نسيت كلمة المرور؟ + preupload: + change: استبدال العرض التقديمي + choose: اختر ملف... + current: "العرض التقديمي الحالي:" + footer: اعتمادًا على حجم العرض التقديمي ، قد يتطلب تحميله وقتًا إضافيًا قبل استخدامه. + invalid: حجم / نوع الملف غير صالح. يرجى الاطلاع على القيود أدناه. + title: أضف العرض التقديمي + use: استخدم العرض التقديمي rename_recording: remove_shared: title: هل أنت متأكد من رغبتك في إزالة هذه الغرفة من قائمة الغرف الخاصة بك؟ @@ -372,6 +442,7 @@ ar: require_approval: يلزم موافقة المشرف قبل الانضمام start: السماح لأي مستخدم ببدء اللقاء footer_text: يمكن إجراء التعديل على غرفتك في أي وقت. + recording: السماح بتسجيل الغرفة rename_room: name_placeholder: أدخل اسم غرفة جديدة ... share_access: @@ -439,7 +510,7 @@ ar: fail: لم تتم الموافقة على حسابك بعد. إذا كنت قد قمت بالاشتراك منذ عدة أيام ، الرجاء الاتصال بالمسؤول. signup: تم إنشاء حسابك بنجاح. تم إرساله إلى المسؤول للموافقة عليه. banned: - fail: ليس لديك حق الوصول إلى هذا التطبيق. إذا كنت تعتقد أن هذا خطأ، يرجى الاتصال بالمسؤول. + fail: ليس لديك حق الوصول إلى هذا التطبيق. إذا كنت تعتقد أن هذا خطأ، يرجى الاتصال بالمسؤول. deprecated: new_signin: حدد طريقة تسجيل دخول جديدة لحسابك. سيتم ترحيل جميع الغرف الخاصة بك من حسابك القديم إلى الحساب الجديد twitter_signin: "تم إلغاء الدخول عبر تويتر وسيتم إزالته في الإصدار التالي. انقر هنا لنقل حسابك إلى طريقة مصادقة جديدة" @@ -451,6 +522,7 @@ ar: remove: إزالة rename: إعادة تسمية reset_password: + invalid_token: رمز إعادة تعيين كلمة المرور غير صالح. يرجى محاولة إعادة تعيين كلمة المرور الخاصة بك مرة أخرى. subtitle: إعادة تعيين كلمة المرور password: كلمة المرور الجديدة confirm: تأكيد كلمة المرور الجديدة @@ -465,6 +537,8 @@ ar: user: مستخدم room: access_code_required: الرجاء إدخال رمز وصول ساري المفعول للانضمام إلى الغرفة + add_presentation: أضف العرض التقديمي + copy_access: نسخ رمز الوصول create_room: إنشاء غرفة create_room_error: حدث خطأ أثناء إنشاء الغرفة create_room_success: تم إنشاء الغرفة بنجاح @@ -474,7 +548,9 @@ ar: fail: "فشل في حذف الغرفة (%{error})" enter_the_access_code: أدخل رمز الوصول لهذه الغرفة invalid_provider: لقد أدخلت رابطًا غير صالح. يرجى التحقق من عنوان URL والمحاولة مرة أخرى. + invitation_description: "لقد تمت دعوتك للانضمام إلى %{name} باستخدام BigBlueButton. للانضمام ، انقر فوق الارتباط أعلاه وأدخل اسمك." invited: لقد تمت دعوتك للانضمام + recording_present: أقر بأنه سيتم تسجيل هذه الجلسة. قد يشمل ذلك صوتي وفيديو إذا تم تمكينه. invite_participants: دعوة المشاركين join: انضم last_session: "الجلسة الأخيرة في %{session}" @@ -491,6 +567,10 @@ ar: recent_rooms: الانتقال إلى الغرفة التي تم الانضمام إليها مؤخرًا title: الانضمام إلى الغرفة no_sessions: ما زالت هذه الغرفة لا تحتوي على جلسات. + preupload_success: تمت إضافة العرض بنجاح + preupload_error: حدث خطأ أثناء تحديث عرض الغرفة + preupload_remove_success: تمت إزالة العرض التقديمي بنجاح + preupload_remove_error: حدث خطأ أثناء إزالة عرض الغرفة recordings: التسجيلات الخاصة بالغرفة room_limit: وصلت إلى الحد الأقصى لعدد الغرف المسموح بها room_limit_exceeded: "لقد تجاوزت عدد الغرف المسموح بها. يرجى حذف %{difference} غرفة للدخول إلى هذه الغرفة." @@ -503,6 +583,7 @@ ar: shared_access_success: تمت مشاركة الغرفة بنجاح shared_access_error: هناك خطأ في مشاركة الغرفة start: بداية + search: البحث عن غرفة ... unavailable: هذه الغرفة غير متاح حاليًا نظرًا لعدم التحقق من البريد الإلكتروني للمالك. update_settings_error: حدث خطأ أثناء تحديث إعدادات الغرفة update_settings_success: تم تحديث إعدادات الغرفة بنجاح @@ -511,14 +592,15 @@ ar: auto: ستنضم تلقائيًا عندما يبدأ الاجتماع. settings: account: - fullname: الاسم كاملاً + fullname: الاسم الكامل language: لغة provider: مزود image: صورة image_url: عنوان URL لصورة الملف الشخصي - roles: أدوار المستخدم + roles: دور المستخدم subtitle: قم بتحديث معلومات حسابك title: معلومات الحساب + reset_password: إعادة تعيين كلمة مرور المستخدم delete: button: نعم ، أرغب في حذف حسابي. disclaimer: إذا اخترت حذف حسابك . لا يمكن استرداده. ستتم إزالة جميع المعلومات المتعلقة بحسابك ، بما في ذلك الإعدادات والغرف والتسجيل. From fed6ca4d03d1ec47c647bfae187368669b2026f1 Mon Sep 17 00:00:00 2001 From: Marcel Hellkamp Date: Fri, 15 Jan 2021 00:12:33 +0100 Subject: [PATCH 010/203] Removed duplicate code for openid_connect provider (#2431) --- config/initializers/omniauth.rb | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/config/initializers/omniauth.rb b/config/initializers/omniauth.rb index 576de5cc..7e88d380 100644 --- a/config/initializers/omniauth.rb +++ b/config/initializers/omniauth.rb @@ -67,24 +67,6 @@ Rails.application.config.middleware.use OmniAuth::Builder do redirect = ENV['OAUTH2_REDIRECT'].present? ? File.join(ENV['OAUTH2_REDIRECT'], "auth", "openid_connect", "callback") : nil - provider :openid_connect, - issuer: ENV["OPENID_CONNECT_ISSUER"], - discovery: true, - scope: [:email, :profile], - response_type: :code, - uid_field: ENV["OPENID_CONNECT_UID_FIELD"] || "preferred_username", - client_options: { - identifier: ENV['OPENID_CONNECT_CLIENT_ID'], - secret: ENV['OPENID_CONNECT_CLIENT_SECRET'], - redirect_uri: redirect - }, - setup: SETUP_PROC - end - if Rails.configuration.omniauth_openid_connect - Rails.application.config.providers << :openid_connect - - redirect = ENV['OAUTH2_REDIRECT'].present? ? File.join(ENV['OAUTH2_REDIRECT'], "auth", "openid_connect", "callback") : nil - provider :openid_connect, issuer: ENV["OPENID_CONNECT_ISSUER"], discovery: true, From 4bf08111363f42fb1ba90be5f80a99083044a888 Mon Sep 17 00:00:00 2001 From: Ahmad Farhat Date: Sun, 17 Jan 2021 14:48:51 -0500 Subject: [PATCH 011/203] Times are now rendered using the browsers time zone (#2438) --- Gemfile | 2 ++ Gemfile.lock | 2 ++ app/assets/javascripts/application.js | 1 + app/helpers/admins_helper.rb | 7 ------- app/helpers/application_helper.rb | 6 ++++++ app/helpers/recordings_helper.rb | 5 ----- app/views/admins/components/_invited_users_table.html.erb | 2 +- app/views/admins/components/_manage_users_table.html.erb | 2 +- app/views/admins/components/_server_recording_row.html.erb | 2 +- app/views/admins/components/_server_room_row.html.erb | 6 +++--- app/views/rooms/components/_room_block.html.erb | 2 +- app/views/shared/components/_public_recording_row.html.erb | 2 +- app/views/shared/components/_recording_row.html.erb | 2 +- spec/helpers/recordings_helper_spec.rb | 7 ------- 14 files changed, 20 insertions(+), 28 deletions(-) diff --git a/Gemfile b/Gemfile index eb85a08a..1fe7ac8c 100644 --- a/Gemfile +++ b/Gemfile @@ -83,6 +83,8 @@ gem 'google-cloud-storage', '~> 1.26' gem 'pluck_to_hash', '~> 1.0.2' +gem 'local_time', '~> 2.1.0' + group :production do # Use a postgres database in production. gem 'pg', '~> 0.18' diff --git a/Gemfile.lock b/Gemfile.lock index 7c95ffa7..d0c5d412 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -202,6 +202,7 @@ GEM listen (3.0.8) rb-fsevent (~> 0.9, >= 0.9.4) rb-inotify (~> 0.9, >= 0.9.7) + local_time (2.1.0) lograge (0.11.2) actionpack (>= 4) activesupport (>= 4) @@ -479,6 +480,7 @@ DEPENDENCIES jquery-rails (~> 4.4) jquery-ui-rails listen (~> 3.0.5) + local_time (~> 2.1.0) lograge net-ldap omniauth diff --git a/app/assets/javascripts/application.js b/app/assets/javascripts/application.js index 72c83bb7..dd678843 100644 --- a/app/assets/javascripts/application.js +++ b/app/assets/javascripts/application.js @@ -35,4 +35,5 @@ //= require jquery-ui/widgets/sortable //= require pickr.min.js //= require bootstrap-select.min.js +//= require local-time //= require_tree . diff --git a/app/helpers/admins_helper.rb b/app/helpers/admins_helper.rb index b3058ce0..91f3a2e7 100644 --- a/app/helpers/admins_helper.rb +++ b/app/helpers/admins_helper.rb @@ -31,13 +31,6 @@ module AdminsHelper @running_room_bbb_ids.include?(id) end - # Returns a more friendly/readable date time object - def friendly_time(date) - return "" if date.nil? # Handle invalid dates - - I18n.l date, format: "%B %d, %Y %H:%M UTC" - end - # Site Settings def admin_invite_registration diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index 61abfded..cbbc8637 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -135,4 +135,10 @@ module ApplicationHelper def show_signin !@hide_signin.present? end + + # Returns a more friendly/readable date time object + def view_date(date) + return "" if date.nil? # Handle invalid dates + local_time(date) + end end diff --git a/app/helpers/recordings_helper.rb b/app/helpers/recordings_helper.rb index 2cc2dc82..30784485 100644 --- a/app/helpers/recordings_helper.rb +++ b/app/helpers/recordings_helper.rb @@ -17,11 +17,6 @@ # with BigBlueButton; if not, see . module RecordingsHelper - # Helper for converting BigBlueButton dates into the desired format. - def recording_date(date) - I18n.l date, format: "%B %d, %Y" - end - # Helper for converting BigBlueButton dates into a nice length string. def recording_length(playbacks) # Looping through playbacks array and returning first non-zero length value diff --git a/app/views/admins/components/_invited_users_table.html.erb b/app/views/admins/components/_invited_users_table.html.erb index dc0b2671..bb2ecd32 100644 --- a/app/views/admins/components/_invited_users_table.html.erb +++ b/app/views/admins/components/_invited_users_table.html.erb @@ -24,7 +24,7 @@
<%= user.email %>
-
<%= friendly_time(user.updated_at) %>
+
<%= view_date(user.updated_at) %>
diff --git a/app/views/admins/components/_manage_users_table.html.erb b/app/views/admins/components/_manage_users_table.html.erb index 1fbfc3ca..77947c78 100644 --- a/app/views/admins/components/_manage_users_table.html.erb +++ b/app/views/admins/components/_manage_users_table.html.erb @@ -48,7 +48,7 @@
<%= user.name %>
-
<%= [t("administrator.users.table.created"), ": ", user.created_at].join %>
+
<%= [t("administrator.users.table.created"), ": ", view_date(user.created_at)].join.html_safe %>
<%= user.email && user.email != "" ? user.email : user.username%> <%= user.provider %> diff --git a/app/views/admins/components/_server_recording_row.html.erb b/app/views/admins/components/_server_recording_row.html.erb index 47632ce1..5f82cfbf 100644 --- a/app/views/admins/components/_server_recording_row.html.erb +++ b/app/views/admins/components/_server_recording_row.html.erb @@ -26,7 +26,7 @@
- <%= t("recording.recorded_on", date: recording_date(recording[:startTime])) %> + <%= t("recording.recorded_on", date: view_date(recording[:startTime])).html_safe %>
<%= recording_owner_email(recording[:meetingID]) %> diff --git a/app/views/admins/components/_server_room_row.html.erb b/app/views/admins/components/_server_room_row.html.erb index 6aece4c8..683313c1 100644 --- a/app/views/admins/components/_server_room_row.html.erb +++ b/app/views/admins/components/_server_room_row.html.erb @@ -26,11 +26,11 @@
<% running = room_is_running(room.bbb_id) %> <% if running %> - <%= t("administrator.rooms.table.started", session: friendly_time(room.last_session)) %> + <%= t("administrator.rooms.table.started", session: view_date(room.last_session)).html_safe %> <% elsif room.last_session.present? %> - <%= t("administrator.rooms.table.ended", session: friendly_time(room.last_session)) %> + <%= t("administrator.rooms.table.ended", session: view_date(room.last_session)).html_safe %> <% else %> - <%= [t("administrator.users.table.created"), ": ", friendly_time(room.created_at)].join %> + <%= [t("administrator.users.table.created"), ": ", view_date(room.created_at)].join.html_safe %> <% end %>
diff --git a/app/views/rooms/components/_room_block.html.erb b/app/views/rooms/components/_room_block.html.erb index 7e140585..3de5fcad 100644 --- a/app/views/rooms/components/_room_block.html.erb +++ b/app/views/rooms/components/_room_block.html.erb @@ -35,7 +35,7 @@
<% if room.sessions > 0 %> - <%= t("room.last_session", session: recording_date(room.last_session)) %> + <%= t("room.last_session", session: view_date(room.last_session)).html_safe %> <% else %> <%= t("room.no_sessions") %> <% end %> diff --git a/app/views/shared/components/_public_recording_row.html.erb b/app/views/shared/components/_public_recording_row.html.erb index 1966cb92..1daa2f28 100644 --- a/app/views/shared/components/_public_recording_row.html.erb +++ b/app/views/shared/components/_public_recording_row.html.erb @@ -26,7 +26,7 @@
- <%= t("recording.recorded_on", date: recording_date(recording[:startTime])) %> + <%= t("recording.recorded_on", date: view_date(recording[:startTime])).html_safe %>
<% if recording_thumbnails? %> diff --git a/app/views/shared/components/_recording_row.html.erb b/app/views/shared/components/_recording_row.html.erb index 986b87a4..9efe062a 100644 --- a/app/views/shared/components/_recording_row.html.erb +++ b/app/views/shared/components/_recording_row.html.erb @@ -27,7 +27,7 @@
- <%= t("recording.recorded_on", date: recording_date(recording[:startTime])) %> + <%= t("recording.recorded_on", date: view_date(recording[:startTime])).html_safe %>
<% if recording_thumbnails? %> diff --git a/spec/helpers/recordings_helper_spec.rb b/spec/helpers/recordings_helper_spec.rb index ac8690c8..5a8f343f 100644 --- a/spec/helpers/recordings_helper_spec.rb +++ b/spec/helpers/recordings_helper_spec.rb @@ -19,13 +19,6 @@ require "rails_helper" describe RecordingsHelper do - describe "#recording_date" do - it "formats the date" do - date = DateTime.parse("2019-03-28 19:35:15 UTC") - expect(helper.recording_date(date)).to eql("March 28, 2019") - end - end - describe "#recording_length" do it "returns the time if length > 60" do playbacks = [{ type: "test", length: 85 }] From 4bc25834a95a7e48df3aeb9d5e54875f524b291a Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Sun, 17 Jan 2021 14:49:14 -0500 Subject: [PATCH 012/203] Translate /config/locales/en.yml in nl (#2437) translation completed for the source file '/config/locales/en.yml' on the 'nl' language. Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com> --- config/locales/nl.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/config/locales/nl.yml b/config/locales/nl.yml index 47f6a84c..95b03d2f 100644 --- a/config/locales/nl.yml +++ b/config/locales/nl.yml @@ -138,8 +138,10 @@ nl: settings: Site-instellingen succesvol gewijzigd unauthorized: U bent niet gemachtigd om acties uit te voeren op deze gebruiker recordings: + latest: Nieuwste opnames title: Serveropnames no_recordings: Deze server heeft geen opnames. + search_info: Voer het volledige e-mailadres van een gebruiker of het uid van een kamer in roles: appear_in_share_list: Neem gebruikers met deze rol op in de keuzelijst voor het delen van kamers can_create_rooms: Kan kamers maken From cc78035f9c4a8c920052ae8dc264c60d0a298ede Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Sun, 17 Jan 2021 14:49:34 -0500 Subject: [PATCH 013/203] Translate /config/locales/en.yml in ar (#2435) translation completed for the source file '/config/locales/en.yml' on the 'ar' language. Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com> --- config/locales/ar.yml | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/config/locales/ar.yml b/config/locales/ar.yml index cff5518d..ea2bf179 100644 --- a/config/locales/ar.yml +++ b/config/locales/ar.yml @@ -72,7 +72,7 @@ ar: email_mapping: info: تعيين دور المستخدم باستعمال بريده الإلكتروني. يجب أن يكون بالتنسيق email1 = role1 ، email2 = role2 title: تعيين الدور بالبريد الإلكتروني - update: + update: log_level: title: مستوى السجل information: تغيير مستوى السجل للنشر بأكمله @@ -94,7 +94,7 @@ ar: title: لافتة الصيانة display: ضبط clear: مسح - time: "مثال: التحديث مجدول في 13 ديسمبر @ 23:00 بالتوقيت الشرقي. قد يواجه المستخدمون مشاكل في تسجيل الدخول." + time: "مثال: التحديث مجدول في 13 ديسمبر @ 23:00 بالتوقيت الشرقي. قد يواجه المستخدمون مشاكل في تسجيل الدخول." preupload: info: يمكن للمستخدمين تحميل عرض تقديمي مسبق لاستخدامه كعرض تقديمي افتراضي لتلك الغرفة المحددة title: السماح للمستخدمين بتحميل العروض التقديمية مسبقًا @@ -138,8 +138,10 @@ ar: settings: تم تغيير إعدادات الموقع بنجاح unauthorized: غير مصرح لك بتنفيذ إجراءات على هذا المستخدم recordings: + latest: أحدث التسجيلات title: تسجيلات الخادم no_recordings: الخادم لا يحتوي على أي تسجيلات + search_info: أدخل البريد الإلكتروني الكامل للمستخدم أو معرّف الغرفة roles: appear_in_share_list: تضمين المستخدمين الذين يتمتعون بهذا الدور في القائمة المنسدلة لمشاركة الغرف can_create_rooms: يمكن إنشاء غرف @@ -228,16 +230,16 @@ ar: copy: نسخ date: month_names: [~, يناير, فبراير, مارس, أبريل, مايو, يونيو, يوليو, أغسطس, سبتمبر, أكتوبر, نوفمبر, ديسمبر] - default_admin: لازلت تستخدم كلمة المرور الافتراضية لهذا المستخدم، فضلا أنقر هنا لتغييرها + default_admin: "لازلت تستخدم كلمة المرور الافتراضية لهذا المستخدم، فضلا أنقر هنا لتغييرها" delete: حذف delivery_error: حدث خطأ أثناء تسليم البريد الإلكتروني. يرجى الاتصال بمسؤول! docs: الوثائق email: البريد الإلكتروني - email_sent: "تم إرسال البريد الإلكتروني الخاص بك% {email_type} ! (يرجى التحقق من مجلد البريد المزعج إذا لم تكن قد تلقيت ذلك)" + email_sent: "تم إرسال البريد الإلكتروني الخاص بك %{email_type} (يرجى التحقق من مجلد البريد المزعج إذا لم تكن قد تلقيت ذلك)" enter_your_name: أدخل أسمك! errors: bigbluebutton: - help: يرجى التأكد من اتخاذ الخطوات المناسبة + help: "يرجى التأكد من اتخاذ الخطوات المناسبة. للمزيد" message: نقطة النهاية والسرية BigBlueButton غير صالحة title: خطأ في الخادم internal: @@ -477,6 +479,7 @@ ar: office365: أوفيس 365 twitter: تويتر ldap: LDAP + openid_connect: الاتصال OpenID recaptcha: errors: recaptcha_unreachable: عفوا، فشلنا في التحقق من صحة ردك reCAPTCHA. الرجاء المحاولة مرة أخرى. @@ -484,7 +487,7 @@ ar: recording: all_recordings: كافة التسجيلات email: " البريد الإلكتروني للتسجيل" - error: "حدث خطأ في استرداد %{count} تسجيل/تسجيلات" + error: "هناك خطأ في استرداد %{count} التسجيل (التسجيلات)" no_recordings: "لا تحتوي هذه الغرفة على أي %{inject} تسجيلات.." no_user_recordings: ليس لديك حاليًا أي تسجيلات. no_matched_recordings: "لا يوجد تسجيلات %{inject} تطابق بحثك." @@ -548,7 +551,7 @@ ar: fail: "فشل في حذف الغرفة (%{error})" enter_the_access_code: أدخل رمز الوصول لهذه الغرفة invalid_provider: لقد أدخلت رابطًا غير صالح. يرجى التحقق من عنوان URL والمحاولة مرة أخرى. - invitation_description: "لقد تمت دعوتك للانضمام إلى %{name} باستخدام BigBlueButton. للانضمام ، انقر فوق الارتباط أعلاه وأدخل اسمك." + invitation_description: "لقد تمت دعوتك للانضمام إلى %{name} باستخدام BigBlueButton. للانضمام ، انقر فوق الارتباط أعلاه وأدخل اسمك." invited: لقد تمت دعوتك للانضمام recording_present: أقر بأنه سيتم تسجيل هذه الجلسة. قد يشمل ذلك صوتي وفيديو إذا تم تمكينه. invite_participants: دعوة المشاركين @@ -573,7 +576,7 @@ ar: preupload_remove_error: حدث خطأ أثناء إزالة عرض الغرفة recordings: التسجيلات الخاصة بالغرفة room_limit: وصلت إلى الحد الأقصى لعدد الغرف المسموح بها - room_limit_exceeded: "لقد تجاوزت عدد الغرف المسموح بها. يرجى حذف %{difference} غرفة للدخول إلى هذه الغرفة." + room_limit_exceeded: "لقد تجاوزت عدد الغرف المسموح بها. يرجى حذف %{difference} غرفة (غرف) للدخول إلى هذه الغرفة." sessions: جلسات settings: إعدادات الغرفة share: إدارة الوصول From 0e8e188e244066b78cdd418298c40eee6743a947 Mon Sep 17 00:00:00 2001 From: Ahmad Farhat Date: Mon, 18 Jan 2021 17:45:54 -0500 Subject: [PATCH 014/203] Fixed room name wrapping issues (#2439) --- app/views/rooms/components/_room_block.html.erb | 2 +- app/views/rooms/show.html.erb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/views/rooms/components/_room_block.html.erb b/app/views/rooms/components/_room_block.html.erb index 3de5fcad..f188a455 100644 --- a/app/views/rooms/components/_room_block.html.erb +++ b/app/views/rooms/components/_room_block.html.erb @@ -28,7 +28,7 @@
-

<%= room.name %>

+

<%= room.name %>

diff --git a/app/views/rooms/show.html.erb b/app/views/rooms/show.html.erb index 759fafdc..0a8bb30e 100644 --- a/app/views/rooms/show.html.erb +++ b/app/views/rooms/show.html.erb @@ -24,7 +24,7 @@
-

<%= title(@room.name) %>

+

<%= title(@room.name) %>

<% if current_user.main_room == @room %> <% else %> From 957bf88a85b2ed453668e0e7aa6eac562971b423 Mon Sep 17 00:00:00 2001 From: Ahmad Farhat Date: Mon, 18 Jan 2021 18:34:42 -0500 Subject: [PATCH 015/203] Allowed admins to share room with themselves (#2442) --- app/assets/javascripts/room.js | 3 ++- app/controllers/users_controller.rb | 2 +- app/views/admins/components/_server_room_row.html.erb | 2 +- app/views/rooms/components/_room_block.html.erb | 2 +- app/views/shared/modals/_share_room_modal.html.erb | 1 + 5 files changed, 6 insertions(+), 4 deletions(-) diff --git a/app/assets/javascripts/room.js b/app/assets/javascripts/room.js index 8ed1cddb..d5861d8f 100644 --- a/app/assets/javascripts/room.js +++ b/app/assets/javascripts/room.js @@ -59,6 +59,7 @@ $(document).on('turbolinks:load', function(){ $(".share-room").click(function() { // Update the path of save button $("#save-access").attr("data-path", $(this).data("path")) + $("#room-owner-uid").val($(this).data("owner")) // Get list of users shared with and display them displaySharedUsers($(this).data("users-path")) @@ -82,7 +83,7 @@ $(document).on('turbolinks:load', function(){ $(".bs-searchbox").siblings().hide() } else { // Manually populate the dropdown - $.get($("#share-room-select").data("path"), { search: $(".bs-searchbox input").val() }, function(users) { + $.get($("#share-room-select").data("path"), { search: $(".bs-searchbox input").val(), owner_uid: $("#room-owner-uid").val() }, function(users) { $(".select-options").remove() if (users.length > 0) { users.forEach(function(user) { diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index 98db31e0..23afc65a 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -209,7 +209,7 @@ class UsersController < ApplicationController roles_can_appear << role.name if role.get_permission("can_appear_in_share_list") && role.priority >= 0 end - initial_list = User.where.not(uid: current_user.uid) + initial_list = User.where.not(uid: params[:owner_uid]) .with_role(roles_can_appear) .shared_list_search(params[:search]) .pluck_to_hash(:uid, :name) diff --git a/app/views/admins/components/_server_room_row.html.erb b/app/views/admins/components/_server_room_row.html.erb index 683313c1..3c30d6cc 100644 --- a/app/views/admins/components/_server_room_row.html.erb +++ b/app/views/admins/components/_server_room_row.html.erb @@ -74,7 +74,7 @@ <% end %> <% if shared_access_allowed %> - <% end %> diff --git a/app/views/rooms/components/_room_block.html.erb b/app/views/rooms/components/_room_block.html.erb index f188a455..4b57db74 100644 --- a/app/views/rooms/components/_room_block.html.erb +++ b/app/views/rooms/components/_room_block.html.erb @@ -56,7 +56,7 @@ <% end %> <% if shared_access_allowed %> - <% end %> diff --git a/app/views/shared/modals/_share_room_modal.html.erb b/app/views/shared/modals/_share_room_modal.html.erb index 5426b557..57a50c6d 100644 --- a/app/views/shared/modals/_share_room_modal.html.erb +++ b/app/views/shared/modals/_share_room_modal.html.erb @@ -28,6 +28,7 @@
+
From 656e4057cc1864458debc1f5b17ab17c6440bb85 Mon Sep 17 00:00:00 2001 From: Ahmad Farhat Date: Tue, 19 Jan 2021 18:28:10 -0500 Subject: [PATCH 016/203] Fixed 400 with share room and merge user (#2448) --- app/controllers/admins_controller.rb | 3 +-- app/controllers/users_controller.rb | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/app/controllers/admins_controller.rb b/app/controllers/admins_controller.rb index ee963ac3..f8412ccc 100644 --- a/app/controllers/admins_controller.rb +++ b/app/controllers/admins_controller.rb @@ -209,13 +209,12 @@ class AdminsController < ApplicationController initial_list = User.without_role(:super_admin) .where.not(uid: current_user.uid) .merge_list_search(params[:search]) - .pluck_to_hash(:uid, :name, :email) initial_list = initial_list.where(provider: @user_domain) if Rails.configuration.loadbalanced_configuration # Respond with JSON object of users respond_to do |format| - format.json { render body: initial_list.to_json } + format.json { render body: initial_list.pluck_to_hash(:uid, :name, :email).to_json } end end diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index 23afc65a..008de477 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -212,13 +212,12 @@ class UsersController < ApplicationController initial_list = User.where.not(uid: params[:owner_uid]) .with_role(roles_can_appear) .shared_list_search(params[:search]) - .pluck_to_hash(:uid, :name) initial_list = initial_list.where(provider: @user_domain) if Rails.configuration.loadbalanced_configuration # Respond with JSON object of users respond_to do |format| - format.json { render body: initial_list.to_json } + format.json { render body: initial_list.pluck_to_hash(:uid, :name).to_json } end end From 8c9535b0ecb1798ed1b86a580e5019566bd533a0 Mon Sep 17 00:00:00 2001 From: Tobias Gall Date: Wed, 20 Jan 2021 21:21:32 +0100 Subject: [PATCH 017/203] Increase Database pool size (#2445) The required pool size is calculated by RAILS_MAX_THREADS (default 5) + #Action Cable-Workers (default 4) = 9 The default pool size of 5 is to low for all required connections. Co-authored-by: Jesus Federico --- config/database.yml | 3 ++- sample.env | 8 ++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/config/database.yml b/config/database.yml index 7c55d757..2662a389 100644 --- a/config/database.yml +++ b/config/database.yml @@ -1,5 +1,5 @@ default: &default - pool: 5 + pool: 9 timeout: 5000 development: @@ -21,3 +21,4 @@ production: database: <%= ENV['DB_NAME'] || 'db/production/production.sqlite3' %> username: <%= ENV['DB_USERNAME'] %> password: <%= ENV['DB_PASSWORD'] %> + pool: <%= ENV['DB_POOL_SIZE'] || '9' %> diff --git a/sample.env b/sample.env index f036ebc8..7ab2c1d8 100644 --- a/sample.env +++ b/sample.env @@ -267,6 +267,11 @@ ENABLE_SSL=true # DB_NAME=greenlight_production # DB_USERNAME=postgres # DB_PASSWORD=password +# DB_POOL_SIZE=9 +# +# DB_POOL_SIZE should be set to RAILS_MAX_THREADS + 4 +# The ActionCable-Workers require 4 connections. +# Make sure your Database can handle the overall connection count calculated as follows: ( RAILS_MAX_THREADS + 4 ) * WEB_CONCURRENCY # # For deployments based on the docker-compose script also included, the HOST should be set with the Docker container id. # @@ -276,6 +281,7 @@ DB_PORT=5432 DB_NAME=greenlight_production DB_USERNAME=postgres DB_PASSWORD=password +DB_POOL_SIZE=9 # Use postgresql to handle ActionCable connections by default CABLE_ADAPTER=postgresql @@ -314,6 +320,8 @@ DEFAULT_REGISTRATION=open # The size of the thread pool per worker used by Greenlight's web server. # For details, see: https://github.com/puma/puma#thread-pool # Default: 5 +# +# If you change this value please correct the DB_POOL_SIZE to RAILS_MAX_THREADS + 4 (ActionCable-Workers) #RAILS_MAX_THREADS=5 # The amount of workers (separate processes) used by the web server. From 60b8bbfa067085d2d32423b569ed45258152d61a Mon Sep 17 00:00:00 2001 From: Ahmad Farhat Date: Wed, 20 Jan 2021 16:55:05 -0500 Subject: [PATCH 018/203] Shortened date for last session to make room block smaller (#2449) --- app/helpers/application_helper.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index cbbc8637..5691cedf 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -139,6 +139,6 @@ module ApplicationHelper # Returns a more friendly/readable date time object def view_date(date) return "" if date.nil? # Handle invalid dates - local_time(date) + local_time(date, "%b %d, %Y %-I:%M%P") end end From 44abc0e91ee62727966e21932e1429741f4e8d56 Mon Sep 17 00:00:00 2001 From: Jesus Federico Date: Wed, 20 Jan 2021 17:25:49 -0500 Subject: [PATCH 019/203] GRN2-XX: Patch to overcome performance issues with the database. (#2454) --- config/database.yml | 4 +++- sample.env | 17 ++++++++++++----- 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/config/database.yml b/config/database.yml index 2662a389..073153c1 100644 --- a/config/database.yml +++ b/config/database.yml @@ -1,5 +1,5 @@ default: &default - pool: 9 + pool: 5 timeout: 5000 development: @@ -22,3 +22,5 @@ production: username: <%= ENV['DB_USERNAME'] %> password: <%= ENV['DB_PASSWORD'] %> pool: <%= ENV['DB_POOL_SIZE'] || '9' %> + connect_timeout: <%= ENV['DB_CONNECT_TIMEOUT'] || '5' %> + read_timeout: <%= ENV['DB_READ_TIMEOUT'] || '120' %> diff --git a/sample.env b/sample.env index 7ab2c1d8..12a76e03 100644 --- a/sample.env +++ b/sample.env @@ -259,7 +259,7 @@ ENABLE_SSL=true # Database settings # # Greenlight may work out of the box with sqlite3, but for production it is recommended to use postgresql. -# In such case, these variables must be included. +# In such case, these variables must be included: # # DB_ADAPTER=postgresql # DB_HOST=postgres.example.com @@ -267,11 +267,19 @@ ENABLE_SSL=true # DB_NAME=greenlight_production # DB_USERNAME=postgres # DB_PASSWORD=password +# +# The ActionCable-Workers require 4 connections. So, when using postgres as the CABLE_ADAPTER +# make sure the Database can handle the overall connection count calculated as follows: +# ( RAILS_MAX_THREADS + 4 ) * WEB_CONCURRENCY +# So DB_POOL_SIZE should be set to RAILS_MAX_THREADS + 4 +# # DB_POOL_SIZE=9 # -# DB_POOL_SIZE should be set to RAILS_MAX_THREADS + 4 -# The ActionCable-Workers require 4 connections. -# Make sure your Database can handle the overall connection count calculated as follows: ( RAILS_MAX_THREADS + 4 ) * WEB_CONCURRENCY +# Additionally, there may be cases where the database has errors so the old db connections became stale. +# In order to overcome the lost of connections, it is recommended to add a timeout. +# +# DB_CONNECT_TIMEOUT=5 +# DB_READ_TIMEOUT=120 # # For deployments based on the docker-compose script also included, the HOST should be set with the Docker container id. # @@ -281,7 +289,6 @@ DB_PORT=5432 DB_NAME=greenlight_production DB_USERNAME=postgres DB_PASSWORD=password -DB_POOL_SIZE=9 # Use postgresql to handle ActionCable connections by default CABLE_ADAPTER=postgresql From e40f5f5ba7814a283857cf2bc4b3bb5fb33cef95 Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Sun, 24 Jan 2021 15:00:38 -0500 Subject: [PATCH 020/203] Translate /config/locales/en.yml in ja_JP (#2453) translation completed for the source file '/config/locales/en.yml' on the 'ja_JP' language. Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com> Co-authored-by: Ahmad Farhat --- config/locales/ja_JP.yml | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/config/locales/ja_JP.yml b/config/locales/ja_JP.yml index 4c17c7f9..142f569d 100644 --- a/config/locales/ja_JP.yml +++ b/config/locales/ja_JP.yml @@ -72,7 +72,7 @@ ja_JP: email_mapping: info: "メールアドレスを使用してユーザに役割を割り当てる。メールアドレス1=役割1,メールアドレス2=役割2の形式で記述する必要があります" title: メールアドレスによる役割の割り当て - update: + update: log_level: title: ログレベル information: 配置されたすべてのログレベルを変更する @@ -94,7 +94,7 @@ ja_JP: title: メンテナンスバナー display: セットする clear: 消去する - time: "例: アップデートが日本時間の12月13日23:00から予定されています。その間サインインがうまくできない可能性があります。" + time: "例: アップデートが日本時間の12月13日23:00から予定されています。その間サインインがうまくできない可能性があります。" preupload: info: ユーザがプレゼン資料を事前にアップロードできるようになります。この資料は、会議室固有の標準資料として使用されます。 title: プレゼン資料の事前アップロードを許可 @@ -106,7 +106,7 @@ ja_JP: invite: 招待制 open: 自由登録 rooms: - info: ユーザが所有できる会議室の数を制限します(メイン会議室を含む)。 この設定は管理者には適用されません。 + info: ユーザが所有できる会議室の数を制限します(主会議室を含む)。 この設定は管理者には適用されません。 title: ユーザあたりの会議室数 shared_access: info: 無効に設定すると、各会議室のドロップダウンから「アクセス管理」ボタンが削除され、ユーザが会議室を共有できなくなります @@ -138,8 +138,10 @@ ja_JP: settings: サイト設定が変更されました unauthorized: このユーザにアクションを実行する権限がありません recordings: + latest: 最新の録画 title: すべての録画 no_recordings: このサーバには録画がありません。 + search_info: ユーザの電子メールアドレスか、会議室のuidを入力して下さい。 roles: appear_in_share_list: 会議室共有のドロップダウンにこの役割を割り当てられたユーザを含める can_create_rooms: 会議室の作成権 @@ -303,7 +305,7 @@ ja_JP: home: ホーム settings: プロフィール signout: サインアウト - home_room: メイン会議室 + home_room: 主会議室 info_update_success: 情報を更新しました。 invalid_credentials: 入力されたメールアドレスとパスワードが登録内容と一致しませんでした。 もう一度試すか[パスワードを忘れた場合]をクリックしてパスワードをリセットしてください。 invalid_login_method: アカウントが一致しないため、ログインに失敗しました。 Omniauthでログインする必要があります。 @@ -347,7 +349,7 @@ ja_JP: root_link: サインイン subtitle: "%{role} の権限が取り消されました" invite: - info: "%{name} があなたのパーソナルスペースに招待されました" + info: "%{name} があなたをパーソナルスペースに招待しました" signup_info: メールを使ってサインアップするには、以下のボタンをクリックして、手順に従ってください。 signup_link: サインアップ signup: @@ -477,6 +479,7 @@ ja_JP: office365: Office 365 twitter: Twitter ldap: LDAP + openid_connect: OpenID接続 recaptcha: errors: recaptcha_unreachable: reCAPTCHA応答の検証に失敗しました。 もう一度お試しください。 @@ -543,12 +546,12 @@ ja_JP: create_room_error: 会議室の作成中にエラーが発生しました create_room_success: 会議室が作成されました delete: - home_room: メイン会議室は削除できません + home_room: 主会議室は削除できません success: 会議室を削除しました fail: "会議室の削除に失敗しました(%{error})" enter_the_access_code: 会議室のアクセスコードを入力してください invalid_provider: 無効なURLを入力しました。 URLを確認して、もう一度試してみてください。 - invitation_description: "BigBlueButtonを使用して%{name}に参加するよう招待されました。参加するためには下のリンクをクリックし、名前を入力してください。" + invitation_description: "BigBlueButtonを使用して%{name}に参加するよう招待されました。参加するためには下のリンクをクリックし、名前を入力してください。" invited: 招待されています recording_present: このセッションが録画されるかもしれないこと、その場合自分の声や動画が録画に含まれうることを承知しています。 invite_participants: 参加者を招待 @@ -571,7 +574,7 @@ ja_JP: preupload_error: 会議室のプレゼン資料をアップデートする際にエラーが起こりました preupload_remove_success: プレゼン資料の消去に成功 preupload_remove_error: 会議室のプレゼン資料を消去する際にエラーが起こりました - recordings: 録画 + recordings: 件の録画 room_limit: 許可された会議室数の上限に達しました room_limit_exceeded: "許可された会議室数を超えています。 この会議室にアクセスするには、会議室を %{difference} 個削除してください。" sessions: セッション From e383102187cc3bd13ff6b727bd4162d8dace4790 Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Sun, 24 Jan 2021 15:01:09 -0500 Subject: [PATCH 021/203] Translate /config/locales/en.yml in fr (#2451) translation completed for the source file '/config/locales/en.yml' on the 'fr' language. Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com> --- config/locales/fr.yml | 36 +++++++++++++++++++++++------------- 1 file changed, 23 insertions(+), 13 deletions(-) diff --git a/config/locales/fr.yml b/config/locales/fr.yml index db464382..353fc0c6 100644 --- a/config/locales/fr.yml +++ b/config/locales/fr.yml @@ -20,7 +20,7 @@ fr: activerecord: attributes: user: - accepted_terms: "Termes et Conditions" + accepted_terms: "Conditions générales d'utilisation" email: Adresse électronique name: Nom password: Mot de passe @@ -69,6 +69,10 @@ fr: regular: Base lighten: Plus clair darken: Plus sombre + email_mapping: + info: "Associez l'utilisateur à un role en utilisant son adresse électronique. Doit être au format email1=role1,email2=role2" + title: Mapping des rôles par adresse électronique + update: log_level: title: Verbosité du journal information: Changer la verbosité du journal pour tout le déploiement @@ -90,7 +94,7 @@ fr: title: Bannière de maintenance display: Définir clear: Effacer - time: "Exemple : Mise à jour prévue le 13 décembre à 23:00. Les utilisateurs peuvent rencontrer des problèmes pour se connecter." + time: "Exemple : Mise à jour prévue le 13 décembre à 23:00. Les utilisateurs peuvent rencontrer des problèmes pour se connecter." preupload: info: Les utilisateurs peuvent précharger une présentation qui sera utilisée comme présentation par défaut pour cette salle spécifique title: Permettre aux utilisateurs de précharger des présentations @@ -111,6 +115,7 @@ fr: tabs: appearance: Apparence administration: Administration + registration: Inscription settings: "Paramètres " title: Paramètres du site flash: @@ -133,8 +138,10 @@ fr: settings: Les paramètres du site ont bien été modifiés unauthorized: Vous n'êtes pas autorisé à effectuer cette action sur cet utilisateur. recordings: + latest: Derniers enregistrements title: Enregistrements du serveur no_recordings: Ce serveur n'a pas d'enregistrement. + search_info: Saisissez l'adresse électronique complète d'un utilisateur ou l'identifiant d'une salle roles: appear_in_share_list: Inclure les utilisateurs ayant ce rôle dans la liste déroulante de partage des salons can_create_rooms: Peut créer des salles @@ -173,6 +180,7 @@ fr: enabled: Toujours activé optional: Facultatif rooms: + timeout: "En raison du délai de %{server} du serveur, les informations relatives au statut et aux participants peuvent ne pas être exactes" title: Serveur des salons table: ended: "Terminé:%{session}" @@ -471,6 +479,7 @@ fr: office365: Office 365 twitter: Twitter ldap: LDAP + openid_connect: OpenID Connect recaptcha: errors: recaptcha_unreachable: "Oups, nous n'avons pas réussi à valider votre réponse reCAPTCHA. Veuillez réessayer." @@ -478,7 +487,7 @@ fr: recording: all_recordings: Tous les enregistrements email: Envoyer l'enregistrement par courriel - error: "Il y a eu une erreur lors de la récupération de %{count} enregistrement(s)" + error: "Il y a eu une erreur lors de la récupération de %{count} enregistrement(s)" no_recordings: "Ce salon n'a pas d'enregistrement %{inject}." no_user_recordings: "Actuellement, vous n'avez aucun enregistrement." no_matched_recordings: "Aucun enregistrement %{inject} ne correspond à votre recherche." @@ -542,7 +551,7 @@ fr: fail: "Erreur lors de la suppression de la salle (%{error})" enter_the_access_code: Veuillez introduire le code d'accès de la salle invalid_provider: Vous avez introduit une url non valide. Veuillez vérifier l'url et essayez à nouveau. - invitation_description: "Vous avez été invité à rejoindre 1%{name} en utilisant le BigBlueButton. Pour le faire, cliquez sur le lien ci-dessus et saisissez votre nom." + invitation_description: "Vous avez été invité à rejoindre 1%{name} en utilisant le BigBlueButton. Pour le faire, cliquez sur le lien ci-dessus et saisissez votre nom." invited: Vous avez été invité à rejoindre recording_present: Je reconnais que cette session va être enregistrée. Cela peut inclure ma voix et la vidéo si elle est activée. invite_participants: Inviter des participants @@ -565,7 +574,7 @@ fr: preupload_error: Erreur lors du chargement de la présentation preupload_remove_success: Présentation supprimée avec succès preupload_remove_error: "Erreur lors de la suppression de la présentation " - recordings: Enregistrements du salon + recordings: Enregistrements de salon room_limit: Vous avez atteint le nombre maximum de salles autorisé room_limit_exceeded: "Vous avez dépassé le nombre de salles autorisé. Veuillez en supprimer %{difference}pour pouvoir accéder à cette salle." sessions: Sessions @@ -577,7 +586,8 @@ fr: shared_access_success: Salle partagée avec succès shared_access_error: Il y a eu une erreur lors du partage de la salle start: Démarrer - unavailable: Ce salon est actuellement indisponible car le courrier électronique du propriétaire n'a pas été vérifié. + search: Rechercher une salle... + unavailable: Ce salon est actuellement indisponible car l'adresse électronique du propriétaire n'a pas été vérifié. update_settings_error: Une erreur s'est produite lors de la mise à jour des paramètres du salon. update_settings_success: Paramètres du salon mis à jour avec succès wait: @@ -589,7 +599,7 @@ fr: language: Langue provider: Fournisseur image: Image - image_url: URL de l'image profil + image_url: URL de l'image du profil roles: Rôle de l'utilisateur subtitle: Mettre à jour les informations de votre compte title: Informations de compte @@ -603,19 +613,19 @@ fr: confirmation: Confirmation du nouveau mot de passe new: Nouveau Mot de passe old: Ancien Mot de passe - subtitle: Changer votre Mot de passe + subtitle: Modifier votre mot de passe title: Mot de passe title: Profil search: Chercher signup: - password_confirm: Confirmation Mot de passe + password_confirm: Confirmation du mot de passe subtitle: Créer un Compte title: S’inscrire with: "S'inscrire via %{provider}" terms: accept: "J'accepte les %{href}" - accept_existing: J'accepte les termes et conditions - title: Termes et Conditions + accept_existing: J'accepte les conditions générales d'utilisation + title: Conditions générales d'utilisation test_install: > Ce déploiement utilise un serveur de test pré-configuré, vous devez le remplacer par le vôtre. Pour plus de détails, voir le %{href}. update: Mise à jour @@ -625,7 +635,7 @@ fr: already_verified: Le compte a déjà été vérifié invalid: Lien de vérification invalide not_verified: Votre compte n'a pas encore été vérifié. - resend: Renvoyer l'e-mail de vérification + resend: Renvoyer le courriel de vérification signin: Veuillez vous connecter pour accéder à votre compte. - title: Vérifiez votre e-mail + title: Vérifiez votre adresse électronique verification: Vérification From 0833491f413bcb28b87cc407376a6adb18f3514f Mon Sep 17 00:00:00 2001 From: Ahmad Farhat Date: Mon, 25 Jan 2021 20:14:33 -0500 Subject: [PATCH 022/203] Include shared rooms in room count for search (#2470) --- app/helpers/rooms_helper.rb | 7 +++++++ app/views/rooms/show.html.erb | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/app/helpers/rooms_helper.rb b/app/helpers/rooms_helper.rb index c14b57eb..229577ca 100644 --- a/app/helpers/rooms_helper.rb +++ b/app/helpers/rooms_helper.rb @@ -59,4 +59,11 @@ module RoomsHelper def hidden_format_public ENV.fetch("HIDDEN_FORMATS_PUBLIC", "").split(",") end + + # Returns the total number of visibile rooms for the current user + def total_room_count(user) + total = user.rooms.length + total += user.shared_rooms.length if shared_access_allowed + total + end end diff --git a/app/views/rooms/show.html.erb b/app/views/rooms/show.html.erb index 0a8bb30e..0d8903df 100644 --- a/app/views/rooms/show.html.erb +++ b/app/views/rooms/show.html.erb @@ -82,7 +82,7 @@
- <% if current_user.ordered_rooms.length > 5 %> + <% if total_room_count(current_user) > 5 %>
-
-
-
- - - <%= button_to t("administrator.site_settings.clear_auth.button"), admin_clear_auth_path, class: "btn btn-primary" %> -
-
-
<% end %> \ No newline at end of file From c738bb44ea46c6c4b245f3a08112e5a3465a5738 Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Wed, 10 Feb 2021 17:20:01 -0500 Subject: [PATCH 051/203] Translate /config/locales/en.yml in cs (#2522) translation completed for the source file '/config/locales/en.yml' on the 'cs' language. Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com> --- config/locales/cs.yml | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/config/locales/cs.yml b/config/locales/cs.yml index 37800b06..2ab6c671 100644 --- a/config/locales/cs.yml +++ b/config/locales/cs.yml @@ -69,6 +69,10 @@ cs: regular: Hlavní barva lighten: Světlá barva darken: Tmavá barva + email_mapping: + info: "Přiřaď uživateli roli podle e-mailu. Musí být ve formátu: email1=role1,email2=role2" + title: Mapování rolí podle e-mailu + update: log_level: title: Úroveň logování information: "Změní úroveň pro celý server " @@ -90,7 +94,7 @@ cs: title: Informace o údržbě display: Nastavit clear: Vyčistit - time: "Příklad: Údržba systému je naplánovaná na 13. prosince ve 23:00.\nUživatelé mohou mít potíže s přihlášením do systému." + time: "Příklad: Údržba systému je naplánovaná na 13. prosince ve 23:00.\nUživatelé mohou mít potíže s přihlášením do systému." preupload: info: "Uživatelé mohou nahrát prezentaci, která bude použita jako výchozí prezentace pro vybranou místnost." title: Povolit uživatelům nahrát výchozí prezentaci @@ -111,6 +115,7 @@ cs: tabs: appearance: Vzhled administration: Administrace + registration: Registrace settings: Nastavení title: Nastavení serveru flash: @@ -133,8 +138,10 @@ cs: settings: Nastavení serveru úspěšně změněno unauthorized: Nemáte dostatečná oprávnění k provedení akce. recordings: + latest: Poslední nahrávky title: Uložené nahrávky no_recordings: Na serveru dosud nejsou uloženy žádné nahrávky + search_info: Vložte uživatelův e-mail nebo identifikátor místnosti roles: appear_in_share_list: Uživatelé s touto rolí mohou sdílet místnost. can_create_rooms: Uživatel může vytvářet místnosti @@ -472,6 +479,7 @@ cs: office365: Office 365 twitter: Twitter ldap: LDAP + openid_connect: OpenID Connect recaptcha: errors: recaptcha_unreachable: Nepodařilo se nám ověřit Vaši odpověď na reCAPTCHA. Zkuste to prosím znovu. @@ -517,6 +525,7 @@ cs: remove: Odstranit rename: Přejmenovat reset_password: + captcha: "Ověření reCAPTCHA selhalo, zkuste to prosím znovu." invalid_token: Token resetu hesla je neplatný. Prosím proveďte reset svého hesla ještě jednou. subtitle: Resetovat heslo password: Nové heslo @@ -543,7 +552,7 @@ cs: fail: "Nepodařilo se smazat místnost (%{error})" enter_the_access_code: Vložte přístupový kód do místnosti invalid_provider: Vložili jste neplatné url. Prosím zkontrolujte url a zkuste to znovu. - invitation_description: "Byl jste pozván na videokonferenci%{name} v BigBlueButton. K připojení do místnosti klikněte na odkaz výše a zadejte svoje jméno." + invitation_description: "Byl jste pozván na videokonferenci%{name} v BigBlueButton. K připojení do místnosti klikněte na odkaz výše a zadejte svoje jméno." invited: Byl jste pozván na konferenci v místnosti recording_present: Souhlasím s nahráváním sezení v místnosti včetně mého hlasu a web kamery pokud jsou zapnuté. invite_participants: Pozvánka pro účastníky From 96b554bb5bf8fd3f386fe0e4baeac017f53c57d7 Mon Sep 17 00:00:00 2001 From: Ahmad Farhat Date: Fri, 12 Feb 2021 18:35:00 -0500 Subject: [PATCH 052/203] added sqlite to Gemfile (#2528) --- Gemfile | 5 +++-- scripts/image_build.sh | 7 ------- 2 files changed, 3 insertions(+), 9 deletions(-) diff --git a/Gemfile b/Gemfile index 1fe7ac8c..9f066b20 100644 --- a/Gemfile +++ b/Gemfile @@ -85,6 +85,9 @@ gem 'pluck_to_hash', '~> 1.0.2' gem 'local_time', '~> 2.1.0' +# Use a sqlite database in test and development. +gem 'sqlite3', '~> 1.3.6' + group :production do # Use a postgres database in production. gem 'pg', '~> 0.18' @@ -106,8 +109,6 @@ group :development, :test do gem 'byebug', platform: :mri # Environment configuration. gem 'dotenv-rails' - # Use a sqlite database in test and development. - gem 'sqlite3', '~> 1.3.6' end group :test do diff --git a/scripts/image_build.sh b/scripts/image_build.sh index 47566a43..1cba0377 100755 --- a/scripts/image_build.sh +++ b/scripts/image_build.sh @@ -55,13 +55,6 @@ if [ "$CD_REF_NAME" != "master" ] && [[ "$CD_REF_NAME" != *"release"* ]] && [[ " exit 0 fi -# Include sqlite for production -sqliteCount="$(grep "gem 'sqlite3'" Gemfile | wc -l)" - -if [ $sqliteCount -lt 2 ]; then - sed -i "/^group :production do/a\ \ gem 'sqlite3', '~> 1.3.6'" Gemfile -fi - # Set the version tag when it is a release or the commit sha was included. if [[ "$CD_REF_NAME" == *"release"* ]]; then export CD_VERSION_CODE=${CD_REF_NAME:8} From 3614d0fc5ed6ef1a71324e12e65dff16ccee1c47 Mon Sep 17 00:00:00 2001 From: Fred Dixon Date: Sat, 13 Feb 2021 23:09:56 -0400 Subject: [PATCH 053/203] Point to Greenlight mailing list --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 454102cc..ca26cd35 100644 --- a/README.md +++ b/README.md @@ -33,4 +33,4 @@ Greenlight is built using Ruby on Rails. Many developers already know Rails well We invite you to build upon Greenlight and help make it better. See [Contributing to BigBlueButton](http://docs.bigbluebutton.org/support/faq.html#contributing-to-bigbluebutton). -We invite your feedback, questions, and suggests about Greenlight too. Please post them to the [developer mailing list](https://groups.google.com/forum/#!forum/bigbluebutton-dev). +We invite your feedback, questions, and suggests about Greenlight too. Please post them to the [Greenlight mailing list](https://groups.google.com/forum/#!forum/bigbluebutton-greenlight). From 51cc00bcffe2baa89f110c7952ba6686d2793a72 Mon Sep 17 00:00:00 2001 From: Ahmad Farhat Date: Sun, 14 Feb 2021 14:01:12 -0500 Subject: [PATCH 054/203] Only build image on release (#2530) --- .github/workflows/build.release.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/build.release.yml b/.github/workflows/build.release.yml index f77fa761..3f8fa9c9 100644 --- a/.github/workflows/build.release.yml +++ b/.github/workflows/build.release.yml @@ -5,6 +5,7 @@ env: name: Build Release on: release: + types: [released] jobs: main: From 7c547c36ecc23c92759847a7085da168838f14ee Mon Sep 17 00:00:00 2001 From: Ahmad Farhat Date: Sun, 14 Feb 2021 14:06:19 -0500 Subject: [PATCH 055/203] Removed old travis stuff (#2531) --- .dockerignore | 1 - README.md | 1 - 2 files changed, 2 deletions(-) diff --git a/.dockerignore b/.dockerignore index eb2c7816..5da345a5 100644 --- a/.dockerignore +++ b/.dockerignore @@ -25,6 +25,5 @@ vendor/bundle Dockerfile .gitlab-ci.yml .rubocop.yml -.travis.yml spec test \ No newline at end of file diff --git a/README.md b/README.md index ca26cd35..375b9968 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,5 @@ # Greenlight -![Travis CI](https://travis-ci.org/bigbluebutton/greenlight.svg?branch=master) ![Coverage !Status](https://coveralls.io/repos/github/bigbluebutton/greenlight/badge.svg?branch=master) ![Docker Pulls](https://img.shields.io/docker/pulls/bigbluebutton/greenlight.svg) From 19434df22c06a50927b4e47097ae122841d3f96e Mon Sep 17 00:00:00 2001 From: Jesus Federico Date: Wed, 17 Feb 2021 10:40:31 -0500 Subject: [PATCH 056/203] added rake task for checking livness on k8s deployments (#2537) --- lib/tasks/liveness.rake | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 lib/tasks/liveness.rake diff --git a/lib/tasks/liveness.rake b/lib/tasks/liveness.rake new file mode 100644 index 00000000..dd1a7b31 --- /dev/null +++ b/lib/tasks/liveness.rake @@ -0,0 +1,6 @@ +# frozen_string_literal: true + +desc('livenessProbe') +task liveness: :environment do + puts "success" +end From c5b00e89aab2622cb206733b632acfb4225dd3b7 Mon Sep 17 00:00:00 2001 From: Lars Kiesow Date: Tue, 23 Feb 2021 00:14:33 +0100 Subject: [PATCH 057/203] Update to Ruby 2.7 (#2292) * Update to Ruby 2.7 The currently used Ruby 2.5 is pretty old and is nearing its end of life [1]. This patch updates the used Ruby version to the current stable version. [1] https://www.ruby-lang.org/en/downloads/branches/ * Update .ruby-version to 2.7.2 Co-authored-by: Ahmad Farhat --- .ruby-version | 2 +- Dockerfile | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.ruby-version b/.ruby-version index 73462a5a..37c2961c 100644 --- a/.ruby-version +++ b/.ruby-version @@ -1 +1 @@ -2.5.1 +2.7.2 diff --git a/Dockerfile b/Dockerfile index d2fbe32e..ad0a5e2e 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM ruby:2.5.1-alpine AS base +FROM ruby:2.7.2-alpine AS base # Set a variable for the install location. ARG RAILS_ROOT=/usr/src/app @@ -24,9 +24,9 @@ COPY Gemfile Gemfile.lock $RAILS_ROOT/ RUN bundle config --global frozen 1 \ && bundle install --deployment --without development:test:assets -j4 --path=vendor/bundle \ - && rm -rf vendor/bundle/ruby/2.5.0/cache/*.gem \ - && find vendor/bundle/ruby/2.5.0/gems/ -name "*.c" -delete \ - && find vendor/bundle/ruby/2.5.0/gems/ -name "*.o" -delete + && rm -rf vendor/bundle/ruby/2.7.0/cache/*.gem \ + && find vendor/bundle/ruby/2.7.0/gems/ -name "*.c" -delete \ + && find vendor/bundle/ruby/2.7.0/gems/ -name "*.o" -delete # Adding project files. COPY . . @@ -36,7 +36,7 @@ RUN rm -rf tmp/cache spec ############### Build step done ############### -FROM ruby:2.5.1-alpine +FROM ruby:2.7.2-alpine # Set a variable for the install location. ARG RAILS_ROOT=/usr/src/app From 09ab074aaf1c0d2b6a00921721692adb5ed8915b Mon Sep 17 00:00:00 2001 From: Ahmad Farhat Date: Fri, 26 Feb 2021 17:34:07 -0500 Subject: [PATCH 058/203] Complete refactor of Gemfile and upgraded gems (#2553) --- .rubocop.yml | 22 +- Gemfile | 163 +++----- Gemfile.lock | 353 +++++++++--------- .../account_activations_controller.rb | 2 +- app/controllers/admins_controller.rb | 2 +- app/controllers/application_controller.rb | 17 +- app/controllers/concerns/authenticator.rb | 2 +- app/controllers/concerns/rolify.rb | 5 +- app/controllers/health_check_controller.rb | 8 +- app/controllers/rooms_controller.rb | 10 +- app/controllers/sessions_controller.rb | 7 +- app/helpers/application_helper.rb | 9 +- app/helpers/users_helper.rb | 2 +- app/mailers/user_mailer.rb | 2 +- app/models/user.rb | 2 +- config/application.rb | 5 +- config/environments/production.rb | 2 +- config/puma.rb | 8 +- db/migrate/20190726153012_add_custom_roles.rb | 11 +- lib/bbb_api.rb | 2 +- lib/omniauth_options.rb | 12 +- lib/tasks/migrate_old_office365_users.rake | 2 +- lib/tasks/room.rake | 2 +- lib/tasks/user.rake | 8 +- spec/controllers/rooms_controller_spec.rb | 20 +- spec/controllers/users_controller_spec.rb | 6 +- spec/spec_helper.rb | 14 +- test/mailers/previews/user_mailer_preview.rb | 5 +- test/test_helper.rb | 0 29 files changed, 327 insertions(+), 376 deletions(-) delete mode 100644 test/test_helper.rb diff --git a/.rubocop.yml b/.rubocop.yml index 0e7a2d4f..9dcae9ac 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -5,9 +5,7 @@ AllCops: DisabledByDefault: false TargetRubyVersion: 2.5 -# Gems within groups in the Gemfile should be alphabetically sorted. -Bundler/OrderedGems: - Enabled: false + NewCops: enable Style/BlockDelimiters: Enabled: false @@ -138,7 +136,7 @@ Metrics/AbcSize: # A complexity metric that is strongly correlated to the number # of test cases needed to validate a method. Metrics/CyclomaticComplexity: - Max: 17 + Max: 20 # Checks for method parameter names that contain capital letters, end in numbers, or do not meet a minimal length. Naming/MethodParameterName: @@ -176,4 +174,18 @@ Style/HashTransformValues: Style/SlicingWithRange: Enabled: true - \ No newline at end of file + +Style/OptionalBooleanParameter: + Enabled: false + +Lint/DuplicateBranch: + Enabled: false + +Lint/ConstantDefinitionInBlock: + Enabled: false + +Lint/EmptyBlock: + Enabled: false + +Style/HashLikeCase: + Enabled: false \ No newline at end of file diff --git a/Gemfile b/Gemfile index 9f066b20..1039e975 100644 --- a/Gemfile +++ b/Gemfile @@ -8,139 +8,72 @@ git_source(:github) do |repo_name| end # Bundle edge Rails instead: gem 'rails', github: 'rails/rails' -gem 'rails', '~> 5.2.4.4' - -# Use Puma as the app server -gem 'puma', '~> 3.12' - -# Use SCSS for stylesheets -gem 'sassc-rails' - -# Use Uglifier as compressor for JavaScript assets -gem 'uglifier', '>= 1.3.0' - -# Use CoffeeScript for .coffee assets and views -gem 'coffee-rails', '~> 4.2' - -# See https://github.com/rails/execjs#readme for more supported runtimes -# gem 'mini_racer', platforms: :ruby - -# Use jquery as the JavaScript library -gem 'jquery-rails', '~> 4.4' -gem 'jquery-ui-rails' - -# Turbolinks makes navigating your web application faster. Read more: https://github.com/turbolinks/turbolinks -gem 'turbolinks', '~> 5' - -# Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder -gem 'jbuilder', '~> 2.5' - -# Use Redis adapter to run Action Cable in production -# gem 'redis', '~> 3.0' - -# Use ActiveModel has_secure_password +gem 'aws-sdk-s3', '~> 1.88.1' gem 'bcrypt', '~> 3.1.7' - -# Reduces boot times through caching; required in config/boot.rb -gem 'bootsnap', '>= 1.1.0', require: false - -gem 'sprockets', '< 4.0.0' - -# Authentication. -gem 'omniauth' -gem 'omniauth-twitter' -gem 'omniauth-google-oauth2' -gem 'omniauth_openid_connect' -gem 'omniauth-bn-launcher', '~> 0.1.3' -gem 'net-ldap' -gem 'bn-ldap-authentication', '~> 0.1.4' -gem 'omniauth-bn-office365', '~> 0.1.1' - -# BigBlueButton API wrapper. gem 'bigbluebutton-api-ruby', git: 'https://github.com/mconf/bigbluebutton-api-ruby.git', branch: 'master' - -# Front-end. +gem 'bn-ldap-authentication', '~> 0.1.4' +gem 'bootsnap', '~> 1.7.2', require: false gem 'bootstrap', '~> 4.3.1' -gem 'tabler-rubygem', git: 'https://github.com/blindsidenetworks/tabler-rubygem.git', tag: '0.1.4.1' -gem 'pagy' +gem 'cancancan', '~> 2.3.0' +gem 'coveralls', '~> 0.8.23', require: false gem 'font-awesome-sass', '~> 5.9.0' - -# For detecting the users preferred language. -gem 'http_accept_language' - -# Use Capistrano for deployment -# gem 'capistrano-rails', group: :development - -# Markdown parsing. -gem 'redcarpet' - -# For limiting access based on user roles -gem 'cancancan', '~> 2.0' - -# Active Storage gems -gem 'aws-sdk-s3', '~> 1.75' -gem 'google-cloud-storage', '~> 1.26' - -gem 'pluck_to_hash', '~> 1.0.2' - +gem 'google-cloud-storage', '~> 1.30.0' +gem 'http_accept_language', '~> 2.1.1' +gem 'i18n-language-mapping', '~> 0.1.1' +gem 'jbuilder', '~> 2.11.2' +gem 'jquery-rails', '~> 4.4.0' +gem 'jquery-ui-rails', '~> 6.0.1' gem 'local_time', '~> 2.1.0' - -# Use a sqlite database in test and development. +gem 'net-ldap', '~> 0.17.0' +gem 'omniauth', '~> 1.9.1' +gem 'omniauth-bn-launcher', '~> 0.1.3' +gem 'omniauth-bn-office365', '~> 0.1.1' +gem 'omniauth-google-oauth2', '~> 0.7.0' +gem 'omniauth_openid_connect', '~> 0.3.5' +gem 'omniauth-twitter', '~> 1.4.0' +gem 'pagy', '~> 3.11.0' +gem 'pluck_to_hash', '~> 1.0.2' +gem 'puma', '~> 3.12.6' +gem 'rails', '~> 5.2.4.4' +gem 'random_password', '~> 0.1.1' +gem "recaptcha", '~> 5.7.0' +gem 'redcarpet', '~> 3.5.1' +gem 'remote_syslog_logger', '~> 1.0.4' +gem 'rubocop', '~> 1.10.0' +gem 'sassc-rails', '~> 2.1.2' +gem 'sprockets', '~> 3.7.2' gem 'sqlite3', '~> 1.3.6' +gem 'tabler-rubygem', git: 'https://github.com/blindsidenetworks/tabler-rubygem.git', tag: '0.1.4.1' +gem 'turbolinks', '~> 5.2.1' +gem 'tzinfo-data', '~> 1.2021.1' +gem 'uglifier', '~> 4.2.0' group :production do - # Use a postgres database in production. + gem 'hiredis', '~> 0.6.3' + gem "lograge", '~> 0.11.2' gem 'pg', '~> 0.18' - gem 'sequel' - - # For a better logging library in production - gem "lograge" - - # Use for the cache store in production - gem 'redis' - gem 'hiredis' + gem 'redis', '~> 4.2.5' + gem 'sequel', '~> 5.41.0' end -# Ruby linting. -gem 'rubocop' - group :development, :test do - # Call 'byebug' anywhere in the code to stop execution and get a debugger console - gem 'byebug', platform: :mri - # Environment configuration. - gem 'dotenv-rails' + gem 'byebug', '~> 11.1', platform: :mri + gem 'dotenv-rails', '~> 2.7' end group :test do - # Include Rspec and other testing utilities. + gem 'action-cable-testing', '~> 0.6' + gem "factory_bot_rails", '~> 6.1' + gem 'faker', '~> 2.16' + gem 'rails-controller-testing', '~> 1.0' gem 'rspec-rails', '~> 3.7' - gem 'action-cable-testing' - gem 'rails-controller-testing' gem 'shoulda-matchers', '~> 3.1' - gem 'faker' - gem "factory_bot_rails" - gem 'webmock' + gem 'webmock', '~> 3.11' end group :development do - # Access an IRB console on exception pages or by using <%= console %> anywhere in the code. - gem 'web-console', '>= 3.3.0' - gem 'listen', '~> 3.0.5' - # Spring speeds up development by keeping your application running in the background. Read more: https://github.com/rails/spring - gem 'spring' - gem 'spring-watcher-listen', '~> 2.0.0' + gem 'listen', '~> 3.0' + gem 'spring', '~> 2.1' + gem 'spring-watcher-listen', '~> 2.0' + gem 'web-console', '~> 3.7' end - -gem 'remote_syslog_logger' - -# Windows does not include zoneinfo files, so bundle the tzinfo-data gem -gem 'tzinfo-data' - -gem 'coveralls', require: false - -gem 'random_password' - -# Adds helpers for the Google reCAPTCHA API -gem "recaptcha" - -gem 'i18n-language-mapping', '~> 0.1.1' diff --git a/Gemfile.lock b/Gemfile.lock index d0c5d412..b81c24b5 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -25,43 +25,43 @@ GEM specs: action-cable-testing (0.6.1) actioncable (>= 5.0) - actioncable (5.2.4.4) - actionpack (= 5.2.4.4) + actioncable (5.2.4.5) + actionpack (= 5.2.4.5) nio4r (~> 2.0) websocket-driver (>= 0.6.1) - actionmailer (5.2.4.4) - actionpack (= 5.2.4.4) - actionview (= 5.2.4.4) - activejob (= 5.2.4.4) + actionmailer (5.2.4.5) + actionpack (= 5.2.4.5) + actionview (= 5.2.4.5) + activejob (= 5.2.4.5) mail (~> 2.5, >= 2.5.4) rails-dom-testing (~> 2.0) - actionpack (5.2.4.4) - actionview (= 5.2.4.4) - activesupport (= 5.2.4.4) + actionpack (5.2.4.5) + actionview (= 5.2.4.5) + activesupport (= 5.2.4.5) rack (~> 2.0, >= 2.0.8) rack-test (>= 0.6.3) rails-dom-testing (~> 2.0) rails-html-sanitizer (~> 1.0, >= 1.0.2) - actionview (5.2.4.4) - activesupport (= 5.2.4.4) + actionview (5.2.4.5) + activesupport (= 5.2.4.5) builder (~> 3.1) erubi (~> 1.4) rails-dom-testing (~> 2.0) rails-html-sanitizer (~> 1.0, >= 1.0.3) - activejob (5.2.4.4) - activesupport (= 5.2.4.4) + activejob (5.2.4.5) + activesupport (= 5.2.4.5) globalid (>= 0.3.6) - activemodel (5.2.4.4) - activesupport (= 5.2.4.4) - activerecord (5.2.4.4) - activemodel (= 5.2.4.4) - activesupport (= 5.2.4.4) + activemodel (5.2.4.5) + activesupport (= 5.2.4.5) + activerecord (5.2.4.5) + activemodel (= 5.2.4.5) + activesupport (= 5.2.4.5) arel (>= 9.0) - activestorage (5.2.4.4) - actionpack (= 5.2.4.4) - activerecord (= 5.2.4.4) + activestorage (5.2.4.5) + actionpack (= 5.2.4.5) + activerecord (= 5.2.4.5) marcel (~> 0.3.1) - activesupport (5.2.4.4) + activesupport (5.2.4.5) concurrent-ruby (~> 1.0, >= 1.0.2) i18n (>= 0.7, < 2) minitest (~> 5.1) @@ -70,32 +70,32 @@ GEM public_suffix (>= 2.0.2, < 5.0) aes_key_wrap (1.1.0) arel (9.0.0) - ast (2.4.0) + ast (2.4.2) attr_required (1.0.1) - autoprefixer-rails (9.7.6) + autoprefixer-rails (10.2.4.0) execjs aws-eventstream (1.1.0) - aws-partitions (1.343.0) - aws-sdk-core (3.104.1) + aws-partitions (1.429.0) + aws-sdk-core (3.112.0) aws-eventstream (~> 1, >= 1.0.2) aws-partitions (~> 1, >= 1.239.0) aws-sigv4 (~> 1.1) jmespath (~> 1.0) - aws-sdk-kms (1.36.0) - aws-sdk-core (~> 3, >= 3.99.0) + aws-sdk-kms (1.42.0) + aws-sdk-core (~> 3, >= 3.112.0) aws-sigv4 (~> 1.1) - aws-sdk-s3 (1.75.0) - aws-sdk-core (~> 3, >= 3.104.1) + aws-sdk-s3 (1.88.1) + aws-sdk-core (~> 3, >= 3.112.0) aws-sdk-kms (~> 1) aws-sigv4 (~> 1.1) - aws-sigv4 (1.2.1) + aws-sigv4 (1.2.2) aws-eventstream (~> 1, >= 1.0.2) - bcrypt (3.1.13) + bcrypt (3.1.16) bindata (2.4.8) bindex (0.8.1) bn-ldap-authentication (0.1.4) net-ldap (~> 0) - bootsnap (1.4.6) + bootsnap (1.7.2) msgpack (~> 1.0) bootstrap (4.3.1) autoprefixer-rails (>= 9.1.0) @@ -105,71 +105,74 @@ GEM byebug (11.1.3) cancancan (2.3.0) childprocess (4.0.0) - coffee-rails (4.2.2) - coffee-script (>= 2.2.0) - railties (>= 4.0.0) - coffee-script (2.4.1) - coffee-script-source - execjs - coffee-script-source (1.12.2) - concurrent-ruby (1.1.7) + concurrent-ruby (1.1.8) coveralls (0.8.23) json (>= 1.8, < 3) simplecov (~> 0.16.1) term-ansicolor (~> 1.3) thor (>= 0.19.4, < 2.0) tins (~> 1.6) - crack (0.4.3) - safe_yaml (~> 1.0.0) + crack (0.4.5) + rexml crass (1.0.6) declarative (0.0.20) declarative-option (0.1.0) - diff-lcs (1.3) - digest-crc (0.6.1) - rake (~> 13.0) - docile (1.3.2) - dotenv (2.7.5) - dotenv-rails (2.7.5) - dotenv (= 2.7.5) - railties (>= 3.2, < 6.1) - erubi (1.9.0) + diff-lcs (1.4.4) + digest-crc (0.6.3) + rake (>= 12.0.0, < 14.0.0) + docile (1.3.5) + dotenv (2.7.6) + dotenv-rails (2.7.6) + dotenv (= 2.7.6) + railties (>= 3.2) + erubi (1.10.0) execjs (2.7.0) - factory_bot (5.2.0) - activesupport (>= 4.2.0) - factory_bot_rails (5.2.0) - factory_bot (~> 5.2.0) - railties (>= 4.2.0) - faker (2.11.0) + factory_bot (6.1.0) + activesupport (>= 5.0.0) + factory_bot_rails (6.1.0) + factory_bot (~> 6.1.0) + railties (>= 5.0.0) + faker (2.16.0) i18n (>= 1.6, < 2) - faraday (1.0.1) + faraday (1.3.0) + faraday-net_http (~> 1.0) multipart-post (>= 1.2, < 3) - ffi (1.12.2) + ruby2_keywords + faraday-net_http (1.0.1) + ffi (1.14.2) font-awesome-sass (5.9.0) sassc (>= 1.11) globalid (0.4.2) activesupport (>= 4.2.0) - google-api-client (0.42.1) + google-apis-core (0.2.1) addressable (~> 2.5, >= 2.5.1) - googleauth (~> 0.9) + googleauth (~> 0.14) httpclient (>= 2.8.1, < 3.0) mini_mime (~> 1.0) representable (~> 3.0) retriable (>= 2.0, < 4.0) - signet (~> 0.12) + rexml + signet (~> 0.14) + webrick + google-apis-iamcredentials_v1 (0.1.0) + google-apis-core (~> 0.1) + google-apis-storage_v1 (0.2.0) + google-apis-core (~> 0.1) google-cloud-core (1.5.0) google-cloud-env (~> 1.0) google-cloud-errors (~> 1.0) - google-cloud-env (1.3.3) + google-cloud-env (1.4.0) faraday (>= 0.17.3, < 2.0) google-cloud-errors (1.0.1) - google-cloud-storage (1.26.2) + google-cloud-storage (1.30.0) addressable (~> 2.5) digest-crc (~> 0.4) - google-api-client (~> 0.33) + google-apis-iamcredentials_v1 (~> 0.1) + google-apis-storage_v1 (~> 0.1) google-cloud-core (~> 1.2) googleauth (~> 0.9) mini_mime (~> 1.0) - googleauth (0.13.0) + googleauth (0.15.1) faraday (>= 0.17.3, < 2.0) jwt (>= 1.4, < 3.0) memoist (~> 0.16) @@ -181,10 +184,10 @@ GEM hiredis (0.6.3) http_accept_language (2.1.1) httpclient (2.8.3) - i18n (1.8.5) + i18n (1.8.9) concurrent-ruby (~> 1.0) i18n-language-mapping (0.1.2) - jbuilder (2.10.0) + jbuilder (2.11.2) activesupport (>= 5.0.0) jmespath (1.4.0) jquery-rails (4.4.0) @@ -193,22 +196,22 @@ GEM thor (>= 0.14, < 2.0) jquery-ui-rails (6.0.1) railties (>= 3.2.16) - json (2.3.0) + json (2.5.1) json-jwt (1.13.0) activesupport (>= 4.2) aes_key_wrap bindata - jwt (2.2.1) - listen (3.0.8) - rb-fsevent (~> 0.9, >= 0.9.4) - rb-inotify (~> 0.9, >= 0.9.7) + jwt (2.2.2) + listen (3.4.1) + rb-fsevent (~> 0.10, >= 0.10.3) + rb-inotify (~> 0.9, >= 0.9.10) local_time (2.1.0) lograge (0.11.2) actionpack (>= 4) activesupport (>= 4) railties (>= 4) request_store (~> 1.0) - loofah (2.7.0) + loofah (2.9.0) crass (~> 1.0.2) nokogiri (>= 1.5.9) mail (2.7.1) @@ -220,17 +223,17 @@ GEM mimemagic (0.3.5) mini_mime (1.0.2) mini_portile2 (2.5.0) - minitest (5.14.2) - msgpack (1.3.3) - multi_json (1.14.1) + minitest (5.14.4) + msgpack (1.4.2) + multi_json (1.15.0) multi_xml (0.6.0) multipart-post (2.1.1) - net-ldap (0.16.2) - nio4r (2.5.4) + net-ldap (0.17.0) + nio4r (2.5.5) nokogiri (1.11.1) mini_portile2 (~> 2.5.0) racc (~> 1.4) - oauth (0.5.4) + oauth (0.5.5) oauth2 (1.4.4) faraday (>= 0.8, < 2.0) jwt (>= 1.0, < 3.0) @@ -250,9 +253,9 @@ GEM jwt (>= 2.0) omniauth (>= 1.1.1) omniauth-oauth2 (>= 1.5) - omniauth-oauth (1.1.0) + omniauth-oauth (1.2.0) oauth - omniauth (~> 1.0) + omniauth (>= 1.0, < 3) omniauth-oauth2 (1.5.0) oauth2 (~> 1.1) omniauth (~> 1.2) @@ -273,17 +276,17 @@ GEM validate_email validate_url webfinger (>= 1.0.1) - os (1.1.0) - pagy (3.8.1) - parallel (1.19.1) - parser (2.7.1.3) - ast (~> 2.4.0) + os (1.1.1) + pagy (3.11.0) + parallel (1.20.1) + parser (3.0.0.0) + ast (~> 2.4.1) pg (0.21.0) pluck_to_hash (1.0.2) activerecord (>= 4.0.2) activesupport (>= 4.0.2) popper_js (1.16.0) - public_suffix (4.0.5) + public_suffix (4.0.6) puma (3.12.6) racc (1.5.2) rack (2.2.3) @@ -295,44 +298,45 @@ GEM rack (>= 2.1.0) rack-test (1.1.0) rack (>= 1.0, < 3) - rails (5.2.4.4) - actioncable (= 5.2.4.4) - actionmailer (= 5.2.4.4) - actionpack (= 5.2.4.4) - actionview (= 5.2.4.4) - activejob (= 5.2.4.4) - activemodel (= 5.2.4.4) - activerecord (= 5.2.4.4) - activestorage (= 5.2.4.4) - activesupport (= 5.2.4.4) + rails (5.2.4.5) + actioncable (= 5.2.4.5) + actionmailer (= 5.2.4.5) + actionpack (= 5.2.4.5) + actionview (= 5.2.4.5) + activejob (= 5.2.4.5) + activemodel (= 5.2.4.5) + activerecord (= 5.2.4.5) + activestorage (= 5.2.4.5) + activesupport (= 5.2.4.5) bundler (>= 1.3.0) - railties (= 5.2.4.4) + railties (= 5.2.4.5) sprockets-rails (>= 2.0.0) - rails-controller-testing (1.0.4) - actionpack (>= 5.0.1.x) - actionview (>= 5.0.1.x) - activesupport (>= 5.0.1.x) + rails-controller-testing (1.0.5) + actionpack (>= 5.0.1.rc1) + actionview (>= 5.0.1.rc1) + activesupport (>= 5.0.1.rc1) rails-dom-testing (2.0.3) activesupport (>= 4.2.0) nokogiri (>= 1.6) rails-html-sanitizer (1.3.0) loofah (~> 2.3) - railties (5.2.4.4) - actionpack (= 5.2.4.4) - activesupport (= 5.2.4.4) + railties (5.2.4.5) + actionpack (= 5.2.4.5) + activesupport (= 5.2.4.5) method_source rake (>= 0.8.7) thor (>= 0.19.0, < 2.0) rainbow (3.0.0) - rake (13.0.1) + rake (13.0.3) random_password (0.1.1) rb-fsevent (0.10.4) rb-inotify (0.10.1) ffi (~> 1.0) - recaptcha (5.5.0) + recaptcha (5.7.0) json redcarpet (3.5.1) - redis (4.1.4) + redis (4.2.5) + regexp_parser (2.1.1) remote_syslog_logger (1.0.4) syslog_protocol representable (3.0.4) @@ -343,9 +347,9 @@ GEM rack (>= 1.4) retriable (3.1.2) rexml (3.2.4) - rspec-core (3.9.2) + rspec-core (3.9.3) rspec-support (~> 3.9.3) - rspec-expectations (3.9.2) + rspec-expectations (3.9.4) diff-lcs (>= 1.2.0, < 2.0) rspec-support (~> 3.9.0) rspec-mocks (3.9.1) @@ -359,21 +363,22 @@ GEM rspec-expectations (~> 3.9.0) rspec-mocks (~> 3.9.0) rspec-support (~> 3.9.0) - rspec-support (3.9.3) - rubocop (0.84.0) + rspec-support (3.9.4) + rubocop (1.10.0) parallel (~> 1.10) - parser (>= 2.7.0.1) + parser (>= 3.0.0.0) rainbow (>= 2.2.2, < 4.0) + regexp_parser (>= 1.8, < 3.0) rexml - rubocop-ast (>= 0.0.3) + rubocop-ast (>= 1.2.0, < 2.0) ruby-progressbar (~> 1.7) - unicode-display_width (>= 1.4.0, < 2.0) - rubocop-ast (0.0.3) - parser (>= 2.7.0.1) - ruby-progressbar (1.10.1) + unicode-display_width (>= 1.4.0, < 3.0) + rubocop-ast (1.4.1) + parser (>= 2.7.1.5) + ruby-progressbar (1.11.0) + ruby2_keywords (0.0.4) rubyzip (2.3.0) - safe_yaml (1.0.5) - sassc (2.3.0) + sassc (2.4.0) ffi (~> 1.9) sassc-rails (2.1.2) railties (>= 4.0.0) @@ -381,10 +386,10 @@ GEM sprockets (> 3.0) sprockets-rails tilt - sequel (5.32.0) + sequel (5.41.0) shoulda-matchers (3.1.3) activesupport (>= 4.0.0) - signet (0.14.0) + signet (0.14.1) addressable (~> 2.3) faraday (>= 0.17.3, < 2.0) jwt (>= 1.5, < 3.0) @@ -394,7 +399,7 @@ GEM json (>= 1.8, < 3) simplecov-html (~> 0.10.0) simplecov-html (0.10.2) - spring (2.1.0) + spring (2.1.1) spring-watcher-listen (2.0.1) listen (>= 2.7, < 4.0) spring (>= 1.2, < 3.0) @@ -414,22 +419,22 @@ GEM syslog_protocol (0.9.2) term-ansicolor (1.7.1) tins (~> 1.0) - thor (1.0.1) + thor (1.1.0) thread_safe (0.3.6) tilt (2.0.10) - tins (1.25.0) + tins (1.28.0) sync turbolinks (5.2.1) turbolinks-source (~> 5.2) turbolinks-source (5.2.0) - tzinfo (1.2.7) + tzinfo (1.2.9) thread_safe (~> 0.1) - tzinfo-data (1.2020.1) + tzinfo-data (1.2021.1) tzinfo (>= 1.0.0) uber (0.1.0) uglifier (4.2.0) execjs (>= 0.3.0, < 3) - unicode-display_width (1.7.0) + unicode-display_width (2.0.0) validate_email (0.1.6) activemodel (>= 3.0) mail (>= 2.2.5) @@ -444,74 +449,74 @@ GEM webfinger (1.1.0) activesupport httpclient (>= 2.4) - webmock (3.8.3) + webmock (3.11.2) addressable (>= 2.3.6) crack (>= 0.3.2) hashdiff (>= 0.4.0, < 2.0.0) + webrick (1.7.0) websocket-driver (0.7.3) websocket-extensions (>= 0.1.0) websocket-extensions (0.1.5) - xml-simple (1.1.5) + xml-simple (1.1.8) PLATFORMS ruby DEPENDENCIES - action-cable-testing - aws-sdk-s3 (~> 1.75) + action-cable-testing (~> 0.6) + aws-sdk-s3 (~> 1.88.1) bcrypt (~> 3.1.7) bigbluebutton-api-ruby! bn-ldap-authentication (~> 0.1.4) - bootsnap (>= 1.1.0) + bootsnap (~> 1.7.2) bootstrap (~> 4.3.1) - byebug - cancancan (~> 2.0) - coffee-rails (~> 4.2) - coveralls - dotenv-rails - factory_bot_rails - faker + byebug (~> 11.1) + cancancan (~> 2.3.0) + coveralls (~> 0.8.23) + dotenv-rails (~> 2.7) + factory_bot_rails (~> 6.1) + faker (~> 2.16) font-awesome-sass (~> 5.9.0) - google-cloud-storage (~> 1.26) - hiredis - http_accept_language + google-cloud-storage (~> 1.30.0) + hiredis (~> 0.6.3) + http_accept_language (~> 2.1.1) i18n-language-mapping (~> 0.1.1) - jbuilder (~> 2.5) - jquery-rails (~> 4.4) - jquery-ui-rails - listen (~> 3.0.5) + jbuilder (~> 2.11.2) + jquery-rails (~> 4.4.0) + jquery-ui-rails (~> 6.0.1) + listen (~> 3.0) local_time (~> 2.1.0) - lograge - net-ldap - omniauth + lograge (~> 0.11.2) + net-ldap (~> 0.17.0) + omniauth (~> 1.9.1) omniauth-bn-launcher (~> 0.1.3) omniauth-bn-office365 (~> 0.1.1) - omniauth-google-oauth2 - omniauth-twitter - omniauth_openid_connect - pagy + omniauth-google-oauth2 (~> 0.7.0) + omniauth-twitter (~> 1.4.0) + omniauth_openid_connect (~> 0.3.5) + pagy (~> 3.11.0) pg (~> 0.18) pluck_to_hash (~> 1.0.2) - puma (~> 3.12) + puma (~> 3.12.6) rails (~> 5.2.4.4) - rails-controller-testing - random_password - recaptcha - redcarpet - redis - remote_syslog_logger + rails-controller-testing (~> 1.0) + random_password (~> 0.1.1) + recaptcha (~> 5.7.0) + redcarpet (~> 3.5.1) + redis (~> 4.2.5) + remote_syslog_logger (~> 1.0.4) rspec-rails (~> 3.7) - rubocop - sassc-rails - sequel + rubocop (~> 1.10.0) + sassc-rails (~> 2.1.2) + sequel (~> 5.41.0) shoulda-matchers (~> 3.1) - spring - spring-watcher-listen (~> 2.0.0) - sprockets (< 4.0.0) + spring (~> 2.1) + spring-watcher-listen (~> 2.0) + sprockets (~> 3.7.2) sqlite3 (~> 1.3.6) tabler-rubygem! - turbolinks (~> 5) - tzinfo-data - uglifier (>= 1.3.0) - web-console (>= 3.3.0) - webmock + turbolinks (~> 5.2.1) + tzinfo-data (~> 1.2021.1) + uglifier (~> 4.2.0) + web-console (~> 3.7) + webmock (~> 3.11) diff --git a/app/controllers/account_activations_controller.rb b/app/controllers/account_activations_controller.rb index 0de5e776..7fa4f1dc 100644 --- a/app/controllers/account_activations_controller.rb +++ b/app/controllers/account_activations_controller.rb @@ -41,7 +41,7 @@ class AccountActivationsController < ApplicationController flash: { success: I18n.t("registration.approval.signup") } if @user.has_role?(:pending) # Redirect user to sign in path with success flash - redirect_to signin_path, flash: { success: I18n.t("verify.activated") + " " + I18n.t("verify.signin") } + redirect_to signin_path, flash: { success: "#{I18n.t('verify.activated')} #{I18n.t('verify.signin')}" } else redirect_to root_path, flash: { alert: I18n.t("verify.invalid") } end diff --git a/app/controllers/admins_controller.rb b/app/controllers/admins_controller.rb index f8412ccc..dc7bcc40 100644 --- a/app/controllers/admins_controller.rb +++ b/app/controllers/admins_controller.rb @@ -228,7 +228,7 @@ class AdminsController < ApplicationController flash_message = I18n.t("administrator.flash.settings") if params[:value] == "Default Recording Visibility" - flash_message += ". " + I18n.t("administrator.site_settings.recording_visibility.warning") + flash_message += ". #{I18n.t('administrator.site_settings.recording_visibility.warning')}" end redirect_to admin_site_settings_path(tab: tab), flash: { success: flash_message } diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index f3cb5248..d58f5d8d 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -29,13 +29,11 @@ class ApplicationController < ActionController::Base def current_user @current_user ||= User.includes(:role, :main_room).find_by(id: session[:user_id]) - if Rails.configuration.loadbalanced_configuration - if @current_user && !@current_user.has_role?(:super_admin) && - @current_user.provider != @user_domain + if Rails.configuration.loadbalanced_configuration && (@current_user && !@current_user.has_role?(:super_admin) && + @current_user.provider != @user_domain) @current_user = nil session.clear end - end @current_user end @@ -86,8 +84,8 @@ class ApplicationController < ActionController::Base end maintenance_string = @settings.get_value("Maintenance Banner").presence || Rails.configuration.maintenance_window - if maintenance_string.present? - flash.now[:maintenance] = maintenance_string unless cookies[:maintenance_window] == maintenance_string + if maintenance_string.present? && cookies[:maintenance_window] != maintenance_string + flash.now[:maintenance] = maintenance_string end end @@ -268,17 +266,18 @@ class ApplicationController < ActionController::Base rescue => e logger.error "Error in retrieve provider info: #{e}" @hide_signin = true - if e.message.eql? "No user with that id exists" + case e.message + when "No user with that id exists" set_default_settings render "errors/greenlight_error", locals: { message: I18n.t("errors.not_found.user_not_found.message"), help: I18n.t("errors.not_found.user_not_found.help") } - elsif e.message.eql? "Provider not included." + when "Provider not included." set_default_settings render "errors/greenlight_error", locals: { message: I18n.t("errors.not_found.user_missing.message"), help: I18n.t("errors.not_found.user_missing.help") } - elsif e.message.eql? "That user has no configured provider." + when "That user has no configured provider." if Setting.exists?(provider: @user_domain) # Keep the branding @settings = Setting.find_by(provider: @user_domain) diff --git a/app/controllers/concerns/authenticator.rb b/app/controllers/concerns/authenticator.rb index 577bf571..10b1eee6 100644 --- a/app/controllers/concerns/authenticator.rb +++ b/app/controllers/concerns/authenticator.rb @@ -113,7 +113,7 @@ module Authenticator old_user.rooms.each do |room| room.owner = user - room.name = "Old " + room.name if room.id == old_user.main_room.id + room.name = "Old #{room.name}" if room.id == old_user.main_room.id room.save! end diff --git a/app/controllers/concerns/rolify.rb b/app/controllers/concerns/rolify.rb index f580ed2f..a49092f8 100644 --- a/app/controllers/concerns/rolify.rb +++ b/app/controllers/concerns/rolify.rb @@ -123,9 +123,10 @@ module Rolify :can_manage_rooms_recordings, :can_appear_in_share_list, :colour) permission_params.transform_values! do |v| - if v == "0" + case v + when "0" "false" - elsif v == "1" + when "1" "true" else v diff --git a/app/controllers/health_check_controller.rb b/app/controllers/health_check_controller.rb index 0c2fbb2d..8ecc0414 100644 --- a/app/controllers/health_check_controller.rb +++ b/app/controllers/health_check_controller.rb @@ -47,9 +47,7 @@ class HealthCheckController < ApplicationController end def database_check - if defined?(ActiveRecord) - raise "Database not responding" unless ActiveRecord::Migrator.current_version - end + raise "Database not responding" if defined?(ActiveRecord) && !ActiveRecord::Migrator.current_version raise "Pending migrations" unless ActiveRecord::Migration.check_pending!.nil? end @@ -61,9 +59,7 @@ class HealthCheckController < ApplicationController settings = ActionMailer::Base.smtp_settings smtp = Net::SMTP.new(settings[:address], settings[:port]) - if settings[:enable_starttls_auto] == "true" - smtp.enable_starttls_auto if smtp.respond_to?(:enable_starttls_auto) - end + smtp.enable_starttls_auto if settings[:enable_starttls_auto] == ("true") && smtp.respond_to?(:enable_starttls_auto) if settings[:authentication].present? && settings[:authentication] != "none" smtp.start(settings[:domain]) do |s| diff --git a/app/controllers/rooms_controller.rb b/app/controllers/rooms_controller.rb index c63d989f..cc06e4a5 100644 --- a/app/controllers/rooms_controller.rb +++ b/app/controllers/rooms_controller.rb @@ -332,11 +332,11 @@ class RoomsController < ApplicationController def create_room_settings_string(options) room_settings = { - "muteOnStart": options[:mute_on_join] == "1", - "requireModeratorApproval": options[:require_moderator_approval] == "1", - "anyoneCanStart": options[:anyone_can_start] == "1", - "joinModerator": options[:all_join_moderator] == "1", - "recording": options[:recording] == "1", + muteOnStart: options[:mute_on_join] == "1", + requireModeratorApproval: options[:require_moderator_approval] == "1", + anyoneCanStart: options[:anyone_can_start] == "1", + joinModerator: options[:all_join_moderator] == "1", + recording: options[:recording] == "1", } room_settings.to_json diff --git a/app/controllers/sessions_controller.rb b/app/controllers/sessions_controller.rb index dcf014f2..4fc9d014 100644 --- a/app/controllers/sessions_controller.rb +++ b/app/controllers/sessions_controller.rb @@ -125,13 +125,14 @@ class SessionsController < ApplicationController def ldap ldap_config = {} ldap_config[:host] = ENV['LDAP_SERVER'] - ldap_config[:port] = ENV['LDAP_PORT'].to_i != 0 ? ENV['LDAP_PORT'].to_i : 389 + ldap_config[:port] = ENV['LDAP_PORT'].to_i.zero? ? 389 : ENV['LDAP_PORT'].to_i ldap_config[:bind_dn] = ENV['LDAP_BIND_DN'] ldap_config[:password] = ENV['LDAP_PASSWORD'] ldap_config[:auth_method] = ENV['LDAP_AUTH'] - ldap_config[:encryption] = if ENV['LDAP_METHOD'] == 'ssl' + ldap_config[:encryption] = case ENV['LDAP_METHOD'] + when 'ssl' 'simple_tls' - elsif ENV['LDAP_METHOD'] == 'tls' + when 'tls' 'start_tls' end ldap_config[:base] = ENV['LDAP_BASE'] diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index 5691cedf..f1d4c2a3 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -75,13 +75,14 @@ module ApplicationHelper end def translated_role_name(role) - if role.name == "denied" + case role.name + when "denied" I18n.t("roles.banned") - elsif role.name == "pending" + when "pending" I18n.t("roles.pending") - elsif role.name == "admin" + when "admin" I18n.t("roles.admin") - elsif role.name == "user" + when "user" I18n.t("roles.user") else role.name diff --git a/app/helpers/users_helper.rb b/app/helpers/users_helper.rb index 1d691d49..7cc01984 100644 --- a/app/helpers/users_helper.rb +++ b/app/helpers/users_helper.rb @@ -44,7 +44,7 @@ module UsersHelper # Returns language selection options for user edit def language_options locales = I18n.available_locales - language_opts = [['<<<< ' + t("language_default") + ' >>>>', "default"]] + language_opts = [["<<<< #{t('language_default')} >>>>", "default"]] locales.each do |locale| language_mapping = I18n::Language::Mapping.language_mapping_list[locale.to_s.gsub("_", "-")] language_opts.push([language_mapping["nativeName"], locale.to_s]) diff --git a/app/mailers/user_mailer.rb b/app/mailers/user_mailer.rb index f7ac797a..41d9a046 100644 --- a/app/mailers/user_mailer.rb +++ b/app/mailers/user_mailer.rb @@ -43,7 +43,7 @@ class UserMailer < ApplicationMailer def user_promoted(user, role, url, settings) @settings = settings @url = url - @admin_url = url + "admins" + @admin_url = "#{url}admins" @image = logo_image @color = user_color @role = translated_role_name(role) diff --git a/app/models/user.rb b/app/models/user.rb index 66f6fc31..679cbdd1 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -41,7 +41,7 @@ class User < ApplicationRecord validate :check_if_email_can_be_blank validates :email, length: { maximum: 256 }, allow_blank: true, uniqueness: { case_sensitive: false, scope: :provider }, - format: { with: /\A[\w+\-\'.]+@[a-z\d\-.]+\.[a-z]+\z/i } + format: { with: /\A[\w+\-'.]+@[a-z\d\-.]+\.[a-z]+\z/i } validates :password, length: { minimum: 6 }, confirmation: true, if: :greenlight_account?, on: :create diff --git a/config/application.rb b/config/application.rb index e47e7543..92943bf9 100644 --- a/config/application.rb +++ b/config/application.rb @@ -149,9 +149,10 @@ module Greenlight config.primary_color_darken_default = "#316cbe" # Default registration method if the user does not specify one - config.registration_method_default = if ENV["DEFAULT_REGISTRATION"] == "invite" + config.registration_method_default = case ENV["DEFAULT_REGISTRATION"] + when "invite" config.registration_methods[:invite] - elsif ENV["DEFAULT_REGISTRATION"] == "approval" + when "approval" config.registration_methods[:approval] else config.registration_methods[:open] diff --git a/config/environments/production.rb b/config/environments/production.rb index 07a3251b..f92ff48e 100644 --- a/config/environments/production.rb +++ b/config/environments/production.rb @@ -148,7 +148,7 @@ Rails.application.configure do config.log_tags = [:request_id] if ENV["RAILS_LOG_TO_STDOUT"] == "true" - logger = ActiveSupport::Logger.new(STDOUT) + logger = ActiveSupport::Logger.new($stdout) logger.formatter = config.log_formatter config.logger = ActiveSupport::TaggedLogging.new(logger) elsif ENV["RAILS_LOG_REMOTE_NAME"] && ENV["RAILS_LOG_REMOTE_PORT"] diff --git a/config/puma.rb b/config/puma.rb index 44bed0b5..8c27eac3 100644 --- a/config/puma.rb +++ b/config/puma.rb @@ -6,16 +6,16 @@ # the maximum value specified for Puma. Default is set to 5 threads for minimum # and maximum; this matches the default thread size of Active Record. # -threads_count = ENV.fetch("RAILS_MAX_THREADS") { 5 } +threads_count = ENV.fetch("RAILS_MAX_THREADS", 5) threads threads_count, threads_count # Specifies the `port` that Puma will listen on to receive requests; default is 3000. # -port ENV.fetch("PORT") { 80 } +port ENV.fetch("PORT", 80) # Specifies the `environment` that Puma will run in. # -environment ENV.fetch("RAILS_ENV") { "development" } +environment ENV.fetch("RAILS_ENV", "development") # Specifies the number of `workers` to boot in clustered mode. # Workers are forked webserver processes. If using threads and workers together @@ -23,7 +23,7 @@ environment ENV.fetch("RAILS_ENV") { "development" } # Workers do not work on JRuby or Windows (both of which do not support # processes). # -workers ENV.fetch("WEB_CONCURRENCY") { 1 } +workers ENV.fetch("WEB_CONCURRENCY", 1) # Use the `preload_app!` method when specifying a `workers` number. # This directive tells Puma to first boot the application and load code diff --git a/db/migrate/20190726153012_add_custom_roles.rb b/db/migrate/20190726153012_add_custom_roles.rb index 1c0b1fd6..2d82e3e5 100644 --- a/db/migrate/20190726153012_add_custom_roles.rb +++ b/db/migrate/20190726153012_add_custom_roles.rb @@ -12,15 +12,16 @@ class AddCustomRoles < ActiveRecord::Migration[5.2] # Determine what ids corresponded to what roles in the old table old_roles.each do |role| - if role["name"] == "super_admin" + case role["name"] + when "super_admin" super_admin_id = role["id"] - elsif role["name"] == "user" + when "user" user_id = role["id"] - elsif role["name"] == "admin" + when "admin" admin_id = role["id"] - elsif role["name"] == "denied" + when "denied" denied_id = role["id"] - elsif role["name"] == "pending" + when "pending" pending_id = role["id"] end end diff --git a/lib/bbb_api.rb b/lib/bbb_api.rb index dedfdd88..29938c5b 100644 --- a/lib/bbb_api.rb +++ b/lib/bbb_api.rb @@ -33,7 +33,7 @@ module BbbApi # Build the URI. uri = encode_bbb_url( - Rails.configuration.loadbalancer_endpoint + api + '/', + "#{Rails.configuration.loadbalancer_endpoint}#{api}/", Rails.configuration.loadbalancer_secret, { name: provider }, route diff --git a/lib/omniauth_options.rb b/lib/omniauth_options.rb index 43b80aa1..61996ecd 100644 --- a/lib/omniauth_options.rb +++ b/lib/omniauth_options.rb @@ -20,11 +20,11 @@ module OmniauthOptions module_function def omniauth_options(env) - if env['omniauth.strategy'].options[:name] == "bn_launcher" + case env['omniauth.strategy'].options[:name] + when "bn_launcher" protocol = Rails.env.production? ? "https" : env["rack.url_scheme"] - customer_redirect_url = protocol + "://" + env["SERVER_NAME"] + ":" + - env["SERVER_PORT"] + customer_redirect_url = "#{protocol}://#{env['SERVER_NAME']}:#{env['SERVER_PORT']}" user_domain = parse_user_domain(env["SERVER_NAME"]) env['omniauth.strategy'].options[:customer] = user_domain env['omniauth.strategy'].options[:customer_redirect_url] = customer_redirect_url @@ -33,11 +33,11 @@ module OmniauthOptions # This is only used in the old launcher and should eventually be removed env['omniauth.strategy'].options[:checksum] = generate_checksum(user_domain, customer_redirect_url, Rails.configuration.launcher_secret) - elsif env['omniauth.strategy'].options[:name] == "google" + when "google" set_hd(env, ENV['GOOGLE_OAUTH2_HD']) - elsif env['omniauth.strategy'].options[:name] == "office365" + when "office365" set_hd(env, ENV['OFFICE365_HD']) - elsif env['omniauth.strategy'].options[:name] == "openid_connect" + when "openid_connect" set_hd(env, ENV['OPENID_CONNECT_HD']) end end diff --git a/lib/tasks/migrate_old_office365_users.rake b/lib/tasks/migrate_old_office365_users.rake index aaf3cdbc..a0a6d60b 100644 --- a/lib/tasks/migrate_old_office365_users.rake +++ b/lib/tasks/migrate_old_office365_users.rake @@ -20,7 +20,7 @@ namespace :office365 do old_user.save! else old_main_room = old_user.main_room - old_main_room.name = "Old " + old_main_room.name + old_main_room.name = "Old #{old_main_room.name}" old_main_room.save! new_user.rooms << old_user.rooms diff --git a/lib/tasks/room.rake b/lib/tasks/room.rake index 7deec6a9..b5d900e9 100644 --- a/lib/tasks/room.rake +++ b/lib/tasks/room.rake @@ -39,7 +39,7 @@ namespace :room do next if room.uid.split("-").length > 3 begin - new_uid = room.uid + "-" + SecureRandom.alphanumeric(3).downcase + new_uid = "#{room.uid}-#{SecureRandom.alphanumeric(3).downcase}" puts "Updating #{room.uid} to #{new_uid}" room.update_attributes(uid: new_uid) rescue => e diff --git a/lib/tasks/user.rake b/lib/tasks/user.rake index 21b8ecea..b26e0427 100644 --- a/lib/tasks/user.rake +++ b/lib/tasks/user.rake @@ -35,7 +35,10 @@ namespace :user do u[:email].prepend "superadmin-" if args[:role] == "super_admin" # Create account if it doesn't exist - if !User.exists?(email: u[:email], provider: u[:provider]) + if User.exists?(email: u[:email], provider: u[:provider]) + puts "Account with that email already exists" + puts "Email: #{u[:email]}" + else user = User.create(name: u[:name], email: u[:email], password: u[:password], provider: u[:provider], email_verified: true, accepted_terms: true) @@ -52,9 +55,6 @@ namespace :user do puts "Password: #{u[:password]}" puts "Role: #{u[:role]}" puts "PLEASE CHANGE YOUR PASSWORD IMMEDIATELY" if u[:password] == Rails.configuration.admin_password_default - else - puts "Account with that email already exists" - puts "Email: #{u[:email]}" end end end diff --git a/spec/controllers/rooms_controller_spec.rb b/spec/controllers/rooms_controller_spec.rb index 675bd92d..f427a279 100644 --- a/spec/controllers/rooms_controller_spec.rb +++ b/spec/controllers/rooms_controller_spec.rb @@ -182,8 +182,8 @@ describe RoomsController, type: :controller do @request.session[:user_id] = @owner.id name = Faker::Games::Pokemon.name - room_params = { name: name, "mute_on_join": "1", - "require_moderator_approval": "1", "anyone_can_start": "1", "all_join_moderator": "1" } + room_params = { name: name, mute_on_join: "1", + require_moderator_approval: "1", anyone_can_start: "1", all_join_moderator: "1" } json_room_settings = "{\"muteOnStart\":true,\"requireModeratorApproval\":true," \ "\"anyoneCanStart\":true,\"joinModerator\":true,\"recording\":false}" @@ -199,8 +199,8 @@ describe RoomsController, type: :controller do it "should respond with JSON object of the room_settings" do @request.session[:user_id] = @owner.id - @owner.main_room.update_attribute(:room_settings, { "muteOnStart": true, "requireModeratorApproval": true, - "anyoneCanStart": true, "joinModerator": true }.to_json) + @owner.main_room.update_attribute(:room_settings, { muteOnStart: true, requireModeratorApproval: true, + anyoneCanStart: true, joinModerator: true }.to_json) json_room_settings = { "anyoneCanStart" => true, "joinModerator" => true, @@ -224,7 +224,7 @@ describe RoomsController, type: :controller do it "should redirect back to main room with error if it fails" do @request.session[:user_id] = @owner.id - room_params = { name: "", "mute_on_join": "1" } + room_params = { name: "", mute_on_join: "1" } post :create, params: { room: room_params } @@ -237,7 +237,7 @@ describe RoomsController, type: :controller do @request.session[:user_id] = @owner.id - room_params = { name: Faker::Games::Pokemon.name, "mute_on_join": "1" } + room_params = { name: Faker::Games::Pokemon.name, mute_on_join: "1" } post :create, params: { room: room_params } @@ -583,7 +583,7 @@ describe RoomsController, type: :controller do @request.session[:user_id] = @user.id name = Faker::Name.first_name - room_params = { room_uid: @secondary_room.uid, room: { "name": name } } + room_params = { room_uid: @secondary_room.uid, room: { name: name } } expect { post :update_settings, params: room_params }.to change { @secondary_room.reload.name } .from(@secondary_room.name).to(name) @@ -593,7 +593,7 @@ describe RoomsController, type: :controller do it "properly updates room settings through the room settings modal and redirects to current page" do @request.session[:user_id] = @user.id - room_params = { "mute_on_join": "1", "name": @secondary_room.name, "recording": "1" } + room_params = { mute_on_join: "1", name: @secondary_room.name, recording: "1" } formatted_room_params = "{\"muteOnStart\":true,\"requireModeratorApproval\":false," \ "\"anyoneCanStart\":false,\"joinModerator\":false,\"recording\":true}" # JSON string format @@ -616,7 +616,7 @@ describe RoomsController, type: :controller do @admin.set_role :admin @request.session[:user_id] = @admin.id - room_params = { "mute_on_join": "1", "name": @secondary_room.name } + room_params = { mute_on_join: "1", name: @secondary_room.name } formatted_room_params = "{\"muteOnStart\":true,\"requireModeratorApproval\":false," \ "\"anyoneCanStart\":false,\"joinModerator\":false,\"recording\":false}" # JSON string format @@ -632,7 +632,7 @@ describe RoomsController, type: :controller do @admin.set_role :admin @request.session[:user_id] = @admin.id - room_params = { "mute_on_join": "1", "name": @secondary_room.name } + room_params = { mute_on_join: "1", name: @secondary_room.name } expect { post :update_settings, params: { room_uid: @secondary_room.uid, room: room_params } } .not_to change { @secondary_room.reload.room_settings } diff --git a/spec/controllers/users_controller_spec.rb b/spec/controllers/users_controller_spec.rb index 9b37d5a9..feabd28c 100644 --- a/spec/controllers/users_controller_spec.rb +++ b/spec/controllers/users_controller_spec.rb @@ -416,7 +416,7 @@ describe UsersController, type: :controller do tmp_role1.update_permission("send_promoted_email", "true") params = random_valid_user_params - params = params.merge!(user_uid: user, user: { role_id: tmp_role1.id.to_s }) + params.merge!(user_uid: user, user: { role_id: tmp_role1.id.to_s }) expect { post :update, params: params }.to change { ActionMailer::Base.deliveries.count }.by(1) @@ -440,7 +440,7 @@ describe UsersController, type: :controller do @request.session[:user_id] = admin.id params = random_valid_user_params - params = params.merge!(user_uid: user, user: { role_id: new_role.id.to_s }) + params.merge!(user_uid: user, user: { role_id: new_role.id.to_s }) expect(user.role.name).to eq("test1") expect(user.main_room).to be_nil @@ -503,7 +503,7 @@ describe UsersController, type: :controller do user: { password: "incorrect_password", new_password: @password, - password_confirmation: @password + "_random_string", + password_confirmation: "#{@password}_random_string", } } post :update_password, params: params.merge!(user_uid: @user) diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index c8c43a17..efc0cfb4 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -54,27 +54,27 @@ RSpec.configure do |config| .with( headers: { - 'Accept': '*/*', + Accept: '*/*', 'Accept-Encoding': 'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'User-Agent': 'Ruby', } ) .to_return(status: 200, body: "", headers: {}) - stub_request(:any, /#{ENV['LOADBALANCER_ENDPOINT'] + 'api'}/) + stub_request(:any, /#{"#{ENV['LOADBALANCER_ENDPOINT']}api"}/) .with( headers: { - 'Accept': '*/*', + Accept: '*/*', 'Accept-Encoding': 'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'User-Agent': 'Ruby', } ) .to_return(status: 200, body: "", headers: {}) if ENV['LOADBALANCER_ENDPOINT'] - stub_request(:any, /#{ENV['LOADBALANCER_ENDPOINT'] + 'api\/getUser'}/) + stub_request(:any, /#{"#{ENV['LOADBALANCER_ENDPOINT']}api\\/getUser"}/) .with( headers: { - 'Accept': '*/*', + Accept: '*/*', 'Accept-Encoding': 'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'User-Agent': 'Ruby', } @@ -90,11 +90,11 @@ RSpec.configure do |config| secret ", headers: {}) if ENV['LOADBALANCER_ENDPOINT'] - stub_request(:any, /#{ENV['LOADBALANCER_ENDPOINT'] + 'api2\/getUserGreenlightCredentials'}/) + stub_request(:any, /#{"#{ENV['LOADBALANCER_ENDPOINT']}api2\\/getUserGreenlightCredentials"}/) .with( headers: { - 'Accept': '*/*', + Accept: '*/*', 'Accept-Encoding': 'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'User-Agent': 'Ruby', } diff --git a/test/mailers/previews/user_mailer_preview.rb b/test/mailers/previews/user_mailer_preview.rb index ae8d1d33..4cab5da0 100644 --- a/test/mailers/previews/user_mailer_preview.rb +++ b/test/mailers/previews/user_mailer_preview.rb @@ -2,6 +2,7 @@ class UserMailerPreview < ActionMailer::Preview def initialize(_params) + super @logo = "https://raw.githubusercontent.com/bigbluebutton/greenlight/master/app/assets/images/logo_with_text.png" @color = "#467fcf" end @@ -11,7 +12,7 @@ class UserMailerPreview < ActionMailer::Preview def password_reset user = User.first user.reset_token = User.new_token - url = "http://example.com" + "/password_resets/" + user.reset_token + "/edit?email=" + user.email + url = "http://example.com/password_resets/#{user.reset_token}/edit?email=#{user.email}" UserMailer.password_reset(user, url, @logo, @color) end @@ -19,7 +20,7 @@ class UserMailerPreview < ActionMailer::Preview # http://localhost:3000/rails/mailers/user_mailer/verify_email def verify_email user = User.first - url = "http://example.com" + "/u/verify/confirm/" + user.uid + url = "http://example.com/u/verify/confirm/#{user.uid}" UserMailer.verify_email(user, url, @logo, @color) end diff --git a/test/test_helper.rb b/test/test_helper.rb deleted file mode 100644 index e69de29b..00000000 From 3eaa61a46350f6a5a7725199ee3110b5f0dd6532 Mon Sep 17 00:00:00 2001 From: Mitsutaka Sato Date: Sun, 28 Feb 2021 07:21:38 +1300 Subject: [PATCH 059/203] Set timeout for valid_url (#2552) Co-authored-by: Ahmad Farhat --- app/helpers/application_helper.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index f1d4c2a3..2725e60d 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -110,6 +110,7 @@ module ApplicationHelper # Make a GET request and validate content type http = Net::HTTP.new(url.host, url.port) http.use_ssl = (url.scheme == "https") + http.read_timeout = 10 http.start do |web| response = web.head(url.request_uri) From c113b5e456624f37979fe2192afd594742d413c1 Mon Sep 17 00:00:00 2001 From: Lars Kiesow Date: Sun, 28 Feb 2021 18:43:57 +0100 Subject: [PATCH 060/203] More Resilient Parsing of Booleans (#1840) This patch makes parsing booleans from configuration settings more resilient to ensure no accidental errors occur e.g. due to the use of upper or lowercase letters. Example: Without this patch, the following configuration would disable Greenlight accounts which is quite unexpected behavior from a users perspective: ALLOW_GREENLIGHT_ACCOUNTS=True Co-authored-by: Ahmad Farhat --- config/application.rb | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/config/application.rb b/config/application.rb index 92943bf9..e683c15e 100644 --- a/config/application.rb +++ b/config/application.rb @@ -33,6 +33,11 @@ module Greenlight # Application configuration should go into files in config/initializers # -- all .rb files in that directory are automatically loaded. + def parse_bool(val, default = false) + val = ActiveModel::Type::Boolean.new.cast(val) + val.nil? ? default : val + end + # Use custom error routes. config.exceptions_app = routes @@ -87,16 +92,16 @@ module Greenlight config.smtp_sender = ENV['SMTP_SENDER'] || "notifications@example.com" # Determine if GreenLight should enable email verification - config.enable_email_verification = (ENV['ALLOW_MAIL_NOTIFICATIONS'] == "true") + config.enable_email_verification = parse_bool(ENV['ALLOW_MAIL_NOTIFICATIONS']) # Determine if GreenLight should allow non-omniauth signup/login. - config.allow_user_signup = (ENV['ALLOW_GREENLIGHT_ACCOUNTS'] == "true") + config.allow_user_signup = parse_bool(ENV['ALLOW_GREENLIGHT_ACCOUNTS']) # Configure custom banner message. config.banner_message = ENV['BANNER_MESSAGE'] # Enable/disable recording thumbnails. - config.recording_thumbnails = (ENV['RECORDING_THUMBNAILS'] != "false") + config.recording_thumbnails = parse_bool(ENV['RECORDING_THUMBNAILS'], true) # Configure which settings are available to user on room creation/edit after creation config.room_features = ENV['ROOM_FEATURES'] || "" @@ -111,7 +116,7 @@ module Greenlight config.recaptcha_enabled = ENV['RECAPTCHA_SITE_KEY'].present? && ENV['RECAPTCHA_SECRET_KEY'].present? # Show/hide "Add to Google Calendar" button in the room page - config.enable_google_calendar_button = (ENV['ENABLE_GOOGLE_CALENDAR_BUTTON'] == "true") + config.enable_google_calendar_button = parse_bool(ENV['ENABLE_GOOGLE_CALENDAR_BUTTON']) # Enum containing the different possible registration methods config.registration_methods = { open: "0", invite: "1", approval: "2" } @@ -119,11 +124,11 @@ module Greenlight config.google_analytics = ENV["GOOGLE_ANALYTICS_TRACKING_ID"].present? # Will always be true unless explicitly set to false - config.enable_cache = ENV["ENABLE_CACHED_PROVIDER"] != "false" + config.enable_cache = parse_bool(ENV["ENABLE_CACHED_PROVIDER"], true) # MAINTENANCE config.maintenance_window = ENV["MAINTENANCE_WINDOW"] - config.maintenance_mode = ENV["MAINTENANCE_MODE"] == "true" + config.maintenance_mode = parse_bool(ENV["MAINTENANCE_MODE"]) config.report_issue_url = ENV["REPORT_ISSUE_URL"] config.help_url = ENV["HELP_URL"].nil? ? "https://docs.bigbluebutton.org/greenlight/gl-overview.html" : ENV["HELP_URL"] From c754447598a2e1541f440156d15bb69ab28acfbf Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Mon, 1 Mar 2021 18:43:20 -0500 Subject: [PATCH 061/203] Translate /config/locales/en.yml in ca (#2549) translation completed for the source file '/config/locales/en.yml' on the 'ca' language. Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com> --- config/locales/ca.yml | 590 +++++++++++++++++++++--------------------- 1 file changed, 300 insertions(+), 290 deletions(-) diff --git a/config/locales/ca.yml b/config/locales/ca.yml index 82c00445..3719ad4e 100644 --- a/config/locales/ca.yml +++ b/config/locales/ca.yml @@ -32,13 +32,13 @@ ca: administrator: site_settings: authentication: - disabled: Deshabilitada + disabled: Inhabilitada enabled: Habilitada info: Permetre només a usuaris autenticats unir-se a una sala title: Requerir autenticació per a utilitzar les sales - user-info: Cal registrar-se a la part superior pare a accedir a aquesta sala + user-info: Cal registrar-se a la part superior per a accedir a aquesta sala branding: - change: Canviar imatge + change: Canvia la imatge info: Canviar la imatge personalitzada que es mostra a la cantonada superior esquerra placeholder: Enllaç de la imatge... title: Imatge personalitzada @@ -57,102 +57,109 @@ ca: invalid: Enllaç no vàlid cache: info: "Neteja la memòria cau de proveïdors emmagatzemats, el que força una petició de la informació actualitzada" - title: Netejar memòria cau de proveïdor - button: Netejar memòria cau + title: Neteja memòria cau de proveïdor + button: Neteja memòria cau clear_auth: info: "Esborra l'autenticador actual pels usuaris, permetent-els tornar a iniciar sessió amb un mètode d'autenticació diferent" - title: Netejar l'autenticador actual - button: Netejar autenticació + title: Neteja l'autenticador actual + button: Neteja l'autenticació color: - info: Netejar el color regular cambiarà tant el color clar como el fosc. Els valors d'Aclarir i Enfosquir es poden canviar individualment + info: Netejar el color normal canviarà tant el color clar com el fosc. Els valors clar i fosc es poden canviar individualment title: Color principal - regular: Regular - lighten: Aclarir - darken: Enfosquir + regular: Normal + lighten: Clar + darken: Fosc + email_mapping: + info: "Indica com han d'acabar les adreces de correu que vulguis donar-lis un rol pre-existent, amb aquesta sintaxi: @elmeudomini.com=Nom de rol,@unaltredomini.org=Un altre rol" + title: Rols per defecte per a certes adreces de correu (o dominis de correu) d'usuaris que es registrin + update: log_level: title: Nivell de registre - information: Canviar el nivell de registre per a toda la implementació - debug: Depurar + information: Canvia el nivell de registre per a toda la implementació + debug: Depuració info: Informació warn: Advertència error: Error fatal: Fatal unknown: Desconegut recording_visibility: - info: Establir la visibilitat per defecte de les noves gravacions - title: Visibilitat per defecte de gravacions - warning: Aquesta configuració només serà aplicada a les noves sessiones + info: Estableix la visibilitat predeterminada dels nous enregistraments + title: Visibilitat per defecte dels enregistraments + warning: Aquesta configuració només s'aplicarà a les sales que no s'està executant require_consent: - info: "Aquesta configuració habilita una configuració de sala, que permet als propietaris de sales especificar quines sales poden ser gravades. Els usuaris que accedeixen a una sala amb gravació han de donar el seu consentiment abans d'unir-se." - title: Requerir el consentiment del propietari de la sala i la persona que accedeix per a realitzar la gravació + info: "Aquesta configuració habilita una configuració de sala, que permet als propietaris de sales especificar quines sales poden ser enregistrades. Els usuaris que accedeixen a una sala amb enregistrament han de donar el seu consentiment abans d'unir-s'hi." + title: Requereix el consentiment del propietari de la sala i la persona que accedeix per a realitzar l'enregistrament maintenance_banner: - info: Mostra un banner per a informar a l'usuari d'un manteniment programat - title: Banner de manteniment + info: Mostra un bàner per a informar a l'usuari d'un manteniment programat + title: Bàner de manteniment display: Estableix clear: Neteja - time: "Exemple: actualització programada pel 13 de desembre a las 23:00h. Els usuaris poden experimentar problemes per a iniciar sessió." + time: "Exemple: actualització programada pel 13 de desembre a les 23:00h. Els usuaris poden experimentar problemes per a iniciar sessió." preupload: info: Els usuaris poden carregar prèviament una presentació per a utilitzar-la com a presentació predeterminada per a aquesta sala específica - title: Permetre als usuaris carregar prèviament presentacions + title: Permet als usuaris carregar prèviament presentacions registration: - info: Canviar la forma de registre d'usuaris + info: Canvia la forma de registre d'usuaris title: Mètode de registre methods: - approval: Autoritzar/Denegar + approval: Autoritza o denega invite: Registre per invitació open: Registre obert rooms: info: Estableix el límit de sales que un usuari pot tenir (incloent la sala principal). Aquesta configuració no s'aplica als administradors. title: Número de sales per usuari shared_access: - info: "Si s'estableix en deshabilitat, s'eliminarà el botó del menú desplegable d'opcions de sala, el que evitarà que els usuaris comparteixin sales" - title: Permetre els usuaris compartir sales - subtitle: Personalitzar Greenlight + info: "Si s'estableix en inhabilitat, s'eliminarà el botó del menú desplegable d'opcions de sala, el que evitarà que els usuaris comparteixin sales" + title: Permet que els usuaris comparteixin sales + subtitle: Personalitza Greenlight tabs: appearance: Apariència administration: Administració + registration: Registrar-se settings: Configuració title: Configuració del lloc web flash: - approved: L'usuari ha estat autoritzat - banned: L'usuari ha estat bloquejat. - unbanned: L'usuari ha estat desbloquejat. - delete: L'usuari ha estat eliminat. - delete_fail: L'usuari no s'ha pogut eliminar. - demoted: L'usuari ha estat degradat. - invite: "Invitació enviada correctament a %{email}" - invite_email_verification: "L'enviament de correus electrònics ha d'estar habilitat per a poder fer ús d'aquest mètode de registre. Si us plau, contacta amb l'administrador del sistema." - merge_fail: S'ha produït un problema al fusionar els comptes d'usuari. Comprova els usuaris seleccionats i torna a provar-ho + approved: S'ha autoritzat l'usuari correctament. + banned: S'ha blocat l'usuari correctament. + unbanned: S'ha desblocat l'usuari correctament. + delete: S'ha eliminat l'usuari correctament. + delete_fail: No s'ha pogut eliminar l'usuari. + demoted: S'ha degradat l'usuari correctament. + invite: "La Invitació s'ha enviat correctament a %{email}" + invite_email_verification: L'enviament de correus electrònics ha d'estar habilitat per a poder fer ús d'aquest mètode de registre. Contacteu amb l'administrador del sistema. + merge_fail: S'ha produït un problema en fusionar els comptes d'usuari. Comproveu els usuaris seleccionats i torneu a provar-ho merge_success: Els comptes d'usuari s'han fusionat correctament - perm_deleted: L'usuari ha estat eliminat permanentement + perm_deleted: S'ha eliminat l'usuari permanentment promoted: L'usuari ha estat promogut. registration_method_updated: Mètode de registre actualitzat - reset_password: S'ha enviat a l'usuari un missatge de correu per a recuperar la contrasenya. (Demana-li revisar la carpeta de correu brossa si no l'ha rebut) - restored: L'usuari ha estat recuperat amb èxit + reset_password: S'ha enviat a l'usuari un missatge de correu per a recuperar la contrasenya. (Demaneu-li revisar la carpeta de correu brossa si no l'ha rebut) + restored: S'ha recuperat l'usuari amb èxit room_configuration: La configuració de la sala s'ha modificat correctament - settings: La configuració de sistema ha estat actualitzada - unauthorized: No està autoritzat per a executar operacions sobre aquest usuari. + settings: S'ha actualitzat la configuració de sistema correctament + unauthorized: No esteu autoritzat per a executar operacions sobre aquest usuari. recordings: - title: Gravacions - no_recordings: Aquest servidor no te gravacions. + latest: Darrers enregistraments + title: Servidor d'enregistraments + no_recordings: Aquest servidor no té cap enregistrament. + search_info: "Escriviu l'adreça de correu completa d'un usuari o el UID d'una sala (ex.: cao-k2t-xhf)" roles: - appear_in_share_list: Aquest servidor no te gravacions + appear_in_share_list: Inclou els usuaris amb aquest rol en el desplegable per a compartir sales can_create_rooms: Pot crear sales - delete: Eliminar rol - invalid_create: Ha hagut un error al crear el nou rol. Verifica els valors assignats i torna a intentar-ho - invalid_order: Ha hagut un error a l'actualitzar la prioritat del rol. Verifica els valors assignats i torna a intentar-ho - invalid_update: Ha hagut un error a l'actualitzar els permissos del rol. Verifica els valors assignats i torna a intentar-ho - manage_rooms_recordings: Permetre que els usuaris amb aquest rol administrin servidors de sala i gravacions + delete: Elimina el rol + invalid_create: S'ha produït un error en crear el nou rol. Verifiqueu els valors assignats i torneu a intentar-ho + invalid_order: S'ha produït un error en actualitzar la prioritat del rol. Verifiqueu els valors assignats i torneu a intentar-ho + invalid_update: S'ha produït un error en actualitzar els permisos del rol. Verifiqueu els valors assignats i torneu a intentar-ho + manage_rooms_recordings: Permet que els usuaris amb aquest rol administrin servidors de sala i enregistraments name: Nom del rol new_role: Crea un nou rol - role_has_users: "Aquest rol es troba assignado a %{user_count} comptes d'usuari. Cal esborrar tots els comptes associats a aquest rol abans d'eliminar-lo." + role_has_users: "Aquest rol es troba assignat a %{user_count} comptes d'usuari. Cal esborrar tots els comptes associats a aquest rol abans d'eliminar-lo." title: Rols - promote_email: Enviar un missatge als usuaris als que s'hagi assignat aquest rol - demote_email: Enviar un missatge als usuaris als que s'hagi eliminat aquest rol - edit_site_settings: Permetre als usuaris amb aquest rol editar configuracions - edit_roles: Permetre als usuaris amb aquest rol editar altres rols - manage_users: Permetre als usuaris amb aquest rol gestionar altres usuaris - invalid_assignment: Ha hagut un error a l'assignar el rol o els rols a l'usuari. Verifica els valors assignats i torna a provar + promote_email: Envia un missatge als usuaris a qui s'hagi assignat aquest rol + demote_email: Envia un missatge als usuaris a qui s'hagi eliminat aquest rol + edit_site_settings: Permet als usuaris amb aquest rol editar configuracions + edit_roles: Permet als usuaris amb aquest rol editar altres rols + manage_users: Permet als usuaris amb aquest rol gestionar altres usuaris + invalid_assignment: S'ha produït un error en assignar el rol o els rols a l'usuari. Verifiqueu els valors assignats i torneu a provar colour: title: Color del rol info: Defineix el color que s'associarà al rol @@ -165,11 +172,11 @@ ca: allow_any: info: "Permet a qualsevol usuari iniciar la reunió en qualsevol moment. De forma predeterminada, només el propietari de la sala pot iniciar la reunió." all_moderator: - info: Otorga a tots els usuaris els privilegis d'usuari moderador a BigBlueButton quan s'uneixen a la reunió. + info: Atorga a tots els usuaris els privilegis d'usuari moderador a BigBlueButton quan s'uneixen a la reunió. recordings: - info: "Permet als propietaris de sales especificar si desitgen l'opció de gravar una sala o no. Si está habilitada, el moderador encara ha de fer hacer clic al botó \"Grava\" una vegada hagi començat la reunió." + info: "Permet als propietaris de sales especificar si desitgen l'opció d'enregistrar una sala o no. Si està habilitada, el moderador encara ha de fer clic en el botó «Enregsitra» una vegada hagi començat la reunió." options: - disabled: Deshabilitada + disabled: Inhabilitada enabled: Sempre habilitada optional: Opcional rooms: @@ -183,67 +190,67 @@ ca: running: En funcionamient started: "Iniciada: %{session}" status: Estat - view: Mostrar + view: Mostra title: Configuració de l'organització users: - invite: Convidar usuari + invite: Convida un usuari edit: - title: Editar detalls d'usuari + title: Edita detalls de l'usuari settings: - approve: Autoritzar - decline: Denegar - ban: Bloquejar usuari - delete: Eliminar - edit: Editar - edit_roles: Editar els rols d'usuari - merge: Fusionar - perm_delete: Eliminar permanentment - unban: Desbloquejar usuari - undelete: Recuperar + approve: Autoritza + decline: Denega + ban: Bloca l'usuari + delete: Elimina + edit: Edita + edit_roles: Edita els rols d'usuari + merge: Fusiona + perm_delete: Elimina permanentment + unban: Desbloca l'usuari + undelete: Recupera table: authenticator: Verificador created: Creat time: Temps enviat name: Nom - not_found: No s'han trobat usuaris amb aquest criteri - no_users: No s'han trobat usuaris + not_found: No s'ha trobat cap usuari amb aquest criteri + no_users: No s'ha trobat cap usuari role: Rol uid: Identificador d'usuari username: Nom d'usuari - valid: Valid - title: Administrar usuaris - add_to_google_calendar: "Afegir al Calendari de Google" + valid: Vàlid + title: Administrar els usuaris + add_to_google_calendar: "Afegeix al Calendari de Google" bigbluebutton: BigBlueButton - bigbluebutton_exception: Os pedrer! Ha hagut un error a l'iniciar la sessió. - cancel: Cancel·lar + bigbluebutton_exception: Os pedrer! S'ha produït un error en iniciar la sessió. + cancel: Cancel·la cookies: - cookie_info: "Les cookies (galetes) ens ajuden a proveir els nostres serveis. En utilitzar els nostres serveis, aceptes la nostra utlització de les cookies." + cookie_info: "Les galetes ens ajuden a proveir els nostres serveis. En utilitzar els nostres serveis, accepteu l'ús que fem de les galetes." cookie_button: Accepto - copied: Copiada - copy: Copiar + copied: S'ha copiat + copy: Copia date: - month_names: [~, Gener, Febrer, Març, Abril, Maig, Juny, Juliol, Agost, Setembre, Octubre, Novembre, Decembre] - default_admin: "Estàs utilitzant la contrasenya per defecte per aquest compte d'usuari. Fes clic aquí per a canviar-la" - delete: Eliminar - delivery_error: "Ha hagut un error durant l'enviament de correu electrònic. Si us plau, contacta amb un administrador." + month_names: [~, Gener, Febrer, Març, Abril, Maig, Juny, Juliol, Agost, Setembre, Octubre, Novembre, Desembre] + default_admin: "Esteu utilitzant la contrasenya per defecte d'aquest compte d'usuari. Feu clic aquí per a canviar-la" + delete: Elimina + delivery_error: S'ha produït un error durant l'enviament de correu electrònic. Contacteu amb un administrador. docs: Documentació email: Compte de correu - email_sent: "El seu %{email_type} correu electrònic ha estat enviat. (Revisa la teva carpeta de correu brossa si no l'has rebut)" - enter_your_name: Introdueix el teu nom + email_sent: "S'ha enviat el vostre %{email_type} correu electrònic. (Reviseu la carpeta de correu brossa si no l'heu rebut)" + enter_your_name: Indiqueu el vostre nom! errors: bigbluebutton: - help: "Assegura't de que has seguit els passos correctament. Més informació" - message: La URL o clau secreta del servidor BigBlueButton no són vàlids + help: "Assegureu-vos que heu seguit els passos correctament. Més informació" + message: L'URL o clau secreta del servidor BigBlueButton no són vàlids title: Error del servidor internal: message: Sembla que alguna cosa ha fallat del nostre costat. - help: "L'error ha estat registrat, el revisarem en breu." - report: Reportar problema + help: "S'ha enregistrat l'error, el revisarem aviat." + report: Reporta un problema maintenance: message: El sistema es troba en manteniment. - help: Tornarem aviat. + help: Tornarem aviat! migration_error: - contact_admin: "Si no ets administrador, si us plau, contacta amb un d'ells." + contact_admin: "Si no sou administrador, contacteu amb un d'ells." continue: M'agradaria continuar utilitzant la versió 1.0 notice: > Greenlight ha trobat un error al migrar la base de dades.
Això pot estar provocat perquè no ha actualitzat Greenlight a la versió 2.0 @@ -254,236 +261,237 @@ ca: too_short: és massa curta invalid: es invàlida taken: ja existeix - accepted: ha de ser aceptat + accepted: ha de ser acceptat confirmation: "no coincideix %{attribute}" inclusion: no està inclòs a la lista no_provider: message: El lloc al que està intentant accedir no es troba actiu - help: "Si us plau, contacta amb l'administrador del sistema per a configurar Greenlight" + help: Contacteu amb l'administrador del sistema per a configurar Greenlight not_found: - message: "Ens sap greu, la pàgina que estàs buscant no existe." - help: "¿És possible que hagi estat eliminada?" + message: "Ens sap greu, la pàgina que esteu cercant no existeix." + help: "És possible que s'hagi eliminat?" user_not_found: - help: "Si us plau, contacta amb l'administrador." + help: Contacteu amb l'administrador. message: "Ens sap greu, aquest usuari no està registrat." user_missing: - help: "Si us plau, verifica l'enllaç i torna a provar." + help: Verifiqueu l'enllaç i torneu a provar. message: L'enllaç que introduït no és vàlid. title: Errors unauthorized: - message: No te accés a aquesta aplicació - help: "Si creus que és un error, si us plau, contacta amb l'administrador del sistema." + message: No té accés a aquesta aplicació + help: "Si penseu que és un error, contacteu amb l'administrador del sistema." expired_reset_token: L'enllaç per a recuperar la contrasenya ha caducat. features: title: Funcions rooms: Sales personalitzades - recordings: Administració de gravacions + recordings: Administració d'enregistraments designs: Diseny personalitzat authentication: Autenticació d'usuari footer: - legal: Termes legales + legal: Termes legals privpolicy: Política de privacitat powered_by: "Funciona amb %{href}" forgot_password: subtitle: He oblidat la contrasenya email: Compte de correu - submit: Enviar - go_back: Enrera + submit: Envia + go_back: Enrere greenlight: Greenlight header: - all_recordings: Totes les gravacions + all_recordings: Tots els enregistraments dropdown: account_settings: Organització - help: "Necessites ajuda?" + help: "Us cal ajuda?" home: Inici settings: Perfil d'usuari - signout: Sortir + signout: Surt home_room: Sala principal info_update_success: Informació actualitzada amb èxit. - invalid_credentials: El correu electrònic i contrasenya introduïts no coincideixen amb els registres. Inténtelo de nou o haga clic en recuperar contrasenya. - invalid_login_method: L'inici de sessió ha fallat per la falta de coincidència de compte. Necessites iniciar sessió amb un dels proveïdors. - invite_message: "Per a convidar a algú a la sessió, envia-li aquest enllaç:" + invalid_credentials: El correu electrònic i contrasenya introduïts no coincideixen amb els registres. Torneu a intentar o feu clic a «Recupera la contrasenya». + invalid_login_method: L'inici de sessió ha fallat per la falta de coincidència de compte. Cal que inicieu sessió amb un dels proveïdors. + invite_message: "Per a convidar a algú a la sessió, enveu-li aquest enllaç:" javascript: room: mailer: - subject: 'convidat a veure una gravació.' - body: 'Fes clic a enllaç per a veure la gravació:' - autogenerated: 'Aquest correu electrònic s ha generat automàticament per BigBlueButton' - footer: 'BigBlueButton és un sistema open source, basat en web, per a videoconferència. Per a més informació, visita https://bigbluebutton.org/.' + subject: 'us ha convidat a veure un enregistrament.' + body: 'Feu clic a enllaç per a veure l''enregistrament:' + autogenerated: 'Aquest correu electrònic s''ha generat automàticament per BigBlueButton' + footer: 'BigBlueButton és un sistema de codi obert, basat en web, per a videoconferència. Per a més informació, visiteu https://bigbluebutton.org/.' search: - start: Començar la cerca... + start: Comença la cerca... landing: - about: "%{href} és una interfície web per al teu servidor de conferències de codi obert BigBlueButton. Pots crear les teves pròpies sales per a ser anfitrió de sessions o unir-te a altres utilitzant un enllaç curt adequat." + about: "%{href} és una interfície web per al vostre servidor de conferències de codi obert BigBlueButton. Podeu crear les vostres pròpies sales per a ser amfitrió de sessions o unir-vos a altres utilitzant un enllaç curt adequat." welcome: Benvingut a Greenlight. - video: Mira el nostre tutorial sobre com utilizar Greenlight + video: Mireu el nostre tutorial sobre com utilitzar Greenlight upgrade: Mostra'm com actualitzar a la versió 2.0 - version: "Hem publicat una nova versió de Greenlight, però la teva base de dades no és compatible." - language_default: Per omissió (idioma del navegador) - ldap_error: No es pot connectar al servidor LDAP. Comprova la configuració de LDAP a l'arxiu "env" i assegurat de que el teu servidor s'està executant. - login: Iniciar sessió - login_title: Iniciar sessió al teu compte + version: "Hem publicat una nova versió de Greenlight, però la vostra base de dades no és compatible." + language_default: Per omissió (llengua del navegador) + ldap_error: No es pot connectar al servidor LDAP. Comproveu la configuració de LDAP en el fitxer «env» i assegureu-vos que el vostre servidor s'està executant. + login: Inicia sessió + login_title: Inicieu sessió al vostre compte mailer: user: approve: - info: El teu compte ha estat autoritzat. - signin: "Per accedir a les teves sales personals, fes clic al botó inferior i inicia sessió." - signin_link: Iniciar sessió + info: El vostre compte ha estat autoritzat. + signin: "Per a accedir a les vostres sales personals, feu clic al botó inferior i inicieu sessió." + signin_link: Inicia sessió signup: - info: S'ha registrat un nou usuari. - more-info: Per a permetre l'accés d'aquest usuari has d'aprovar el seu compte d'usuari a través de la configuració de l'organització. - admins_link: Anar a la pàgina de l'organització - subject: Registre d'usuari nou + info: S'ha enregistrat un nou usuari. + more-info: Per a permetre l'accés d'aquest usuari heu d'aprovar-ne el compte d'usuari a través de la configuració de l'organització. + admins_link: Vés a la pàgina de l'organització + subject: Registre d'usuari Greenlight nou username: "L'usuari s'ha registrat com a %{name} amb el correu electrònic %{email}." subject: Compte d'usuari autoritzat - username: "El teu nom d'usuari és %{email}." + username: "El vostre nom d'usuari és %{email}." demoted: - info: "Ja no ets %{role} a %{url}." - more-info: Des d'aquest moment tens els mateixos privilegis que un usuari regular. - root_link: Iniciar sessió + info: "Ja no sou %{role} a %{url}." + more-info: Des d'aquest moment teniu els mateixos privilegis que un usuari normal. + root_link: Inicia sessió subtitle: "Permís de %{role} eliminat" invite: - info: "Has estat convidat a tenir el teu espai personal amb %{name}" - signup_info: "Per a registrar-te utilizant el teu compte de correu, fes clic al botó inferior i segueix els passos indicats." - signup_link: Registrar-se + info: "Heu estat convidat a tenir el vostre espai personal amb %{name}" + signup_info: "Per a registrar-vos utilizant el vostre compte de correu, feu clic al botó inferior i seguiu els passos indicats." + signup_link: Registre signup: info: Un usuari que va ser convidat a registrar-se ha completat el seu registre. - admins_link: Anar a la pàgina de l'organització - subject: Registre d'usuari nou - username: "L'usuari s'ha registrado com a %{name} amb el correu electrònic %{email}. " + admins_link: Vés a la pàgina de l'organització + subject: Registre d'usuari Greenlight nou + username: "L'usuari s'ha registrat com a %{name} amb el correu electrònic %{email}. " subject: Invitació per a unir-se a BigBlueButton - username: "El teu nom d'usuari és %{email}." + username: "El vostre nom d'usuari és %{email}." password_reset: - title: 'La contrasenya ha estat reiniciada' - welcome: "S'ha sol·licitat un canvi de contrasenya pel correu electrònic %{email}" - message: 'Si vas fer una sol·licitud per a reiniciar la teva contrasenya, fes clic a aquest enllaç per a iniciar el procés.' - reset_link: Reiniciar la contrasenya + title: 'S''ha restablert la contrasenya' + welcome: "S'ha sol·licitat un canvi de contrasenya per al correu electrònic %{email}" + message: 'Si vau fer una sol·licitud per a restablir la contrasenya, feu clic en aquest enllaç per a iniciar el procés.' + reset_link: Restablir la contrasenya expire: Aquest enllaç caduca en dues hores - ignore: Pots ignorar aquest missatge sense problemes si no has estat tu qui va sol·licitar el canvi de contrasenya. + ignore: Podeu ignorar aquest missatge sense problemes si no sou qui heu sol·licitat el canvi de contrasenya. promoted: - admins_link: Anar a la pàgina de l'organització - info: "El teu rol ha canviat a %{role} a %{url}." - more-info: "Per a veure les noves funcions que se t'han activat visita %{url}" + admins_link: Vés a la pàgina de l'organització + info: "El vostre rol ha canviat a %{role} a %{url}." + more-info: "Per a veure les noves funcions que se us han activat visiteu %{url}" subtitle: "Permisos de %{role} assignats" verify_email: - welcome: "Benvingut al teu espa personal %{name}" - success: "Fent ús de %{bigbluebutton}, pots crear les teves pròpies sales per a realitzar reunions i col·laborar amb altres." - username: "El teu nom d'usuari és %{email}" - verify: "Per a verificar el compte, fes clic al botó inferior." - verify_text: 'Utiliza aquest enllaç per a verificar el teu compte: %{url}' - verify_link: Verificar el compte d'usuari - thanks: Gràcies per unir-te i que tinguis bon dia! - max_concurrent: S'ha arribat al número màxim de sessions permeses + welcome: "Benvingut al vostre espai personal %{name}" + success: "Fent ús de %{bigbluebutton}, podeu crear les vostres pròpies sales per a fer reunions i col·laborar amb altres usuaris." + username: "El vostre nom d'usuari és %{email}" + verify: "Per a verificar el compte, feu clic al botó inferior." + verify_text: 'Utilitzeu aquest enllaç per a verificar el vostre compte: %{url}' + verify_link: Verifica el compte d'usuari + thanks: Gràcies per unir-vos i que tingueu bon dia! + max_concurrent: S'ha arribat al nombre màxim de sessions permeses merged: Fusionat modal: create_role: - create: Crear un nou rol - footer_text: Pots modificar els permisos per a aquest rol de manera individual una vez que haya estat creado - name_placeholder: Introdueix el nom del rol + create: Crea un nou rol + footer_text: Podeu modificar els permisos per a aquest rol de manera individual una vegada que l'hàgiu creat + name_placeholder: Introduïu el nom del rol not_blank: El nom de rol no pot estar buit - title: Crear un nou rol + title: Crea un nou rol create_room: access_code: Codi d'accés - access_code_placeholder: Generar un nou codi d'accés + access_code_placeholder: Genera un nou codi d'accés auto_join: Envia'm a la sala automàticament quan comenci la sessió - create: Crea sala - free_delete: Podràs eliminar la sala en el moment que vulguis - name_placeholder: Introdueix un nom per a la sala + create: Crea una sala + free_delete: Podreu eliminar la sala en el moment que vulgueu + name_placeholder: Introduïu un nom per a la sala not_blank: El nom de la sala no pot estar buit - title: Crear una sala nova + title: Crea una sala nova delete_account: - confirm: "Estàs segur d'eliminar aquest compte d'usuari?" + confirm: "Esteu segur de voler eliminar aquest compte d'usuari?" delete: Estic segur d'eliminar aquest compte keep: "De fet, la mantindré" - delete_warning: Aquesta acció desactiva el compte d'usuari. Tos els usuaris desactivats es mostren a la pestanya d'eliminats. - warning: "Aquesta decisió és irrevesible, No podràs recuperar la informació associada" + delete_warning: Aquesta acció desactiva el compte d'usuari. Tots els usuaris desactivats es mostren a la pestanya d'eliminats. + warning: "Aquesta decisió és irreversible, No podreu recuperar la informació associada" delete_rec: - delete: "Estic segur, elimina aquesta gravació." - header: "Estàs segur de voler eliminar aquesta gravació?" - warning: No podràs recuperar aquesta gravació + delete: "N'estic segur, elimina aquest enregistrament." + header: "Esteu segur de voler eliminar aquest enregistrament?" + warning: No podreu recuperar aquest enregistrament delete_room: - confirm: "Estàs segur de voler eliminar %{room}?" + confirm: "Esteu segur de voler eliminar %{room}?" delete: "Estc segur, elimina aquesta sala" keep: "He canviat de parer, la mantindré" - warning: No podràs recuperar aquesta sala - recording_warning: "o qualsevol de les teves %{recordings_num} gravacions associades." + warning: No podreu recuperar aquesta sala + recording_warning: "o qualsevol dels vostres %{recordings_num} enregistraments associats." invite_user: - email_placeholder: Introdueix els correus electrònics d'usuari (separats per coma) + email_placeholder: Introduïu els correus electrònics d'usuari (separats per coma) footer: L'usuari rebrà un correu electrònic amb instruccions de com registrar-se - send: Enviar invitació - title: Convidar usuari + send: Envia la invitació + title: Convida l'usuari login: or: o - with: "Iniciar sessió amb %{provider}" - forgot_password: "Has oblidat la teva contrasenya?" + with: "Inicia sessió amb %{provider}" + forgot_password: "Heu oblidat la contrasenya?" preupload: change: Substitueix la presentació - choose: Selecciona un arxiu + choose: Trieu un fitxer... current: "Presentació actual:" footer: "En funció de la mida de la presentació, és possible que es necessiti més temps per a carregar-la abans de poder utilitzar-la." - invalid: "Mida o tipus d'arxiu no vàlids. Si us plau, consulta les restriccions a continuación." - title: Afegir presentació - use: Utilitzar presentació + invalid: Mida o tipus de fitxer no vàlids. Consulteu les restriccions a continuació. + title: Afegir una presentació + use: Utilitza una presentació rename_recording: remove_shared: - title: "Estàs segur de voler eliminar aquesta sala de la teva llista de sales?" + title: "Esteu segur de voler eliminar aquesta sala de la llista de sales?" delete: "Estic segur, elimina aquesta sala." - warning: NO podràs accedir a aquesta sala en el futur. + warning: NO podreu accedir a aquesta sala en el futur. room_settings: title: Configuració de la sala - update: Actualitzar la sala - client: Seleccionar el tipus de client + update: Actualitza la sala + client: Seleccioneu el tipus de client join_moderator: Tots els usuaris s'uneixen com a moderadors - mute: Deshabilitar micròfon d'usuaris al entrar - require_approval: Requerir aprovació del moderador abans de unir-se a la sessió - start: Permetre als usuaris iniciar aquesta sessió - footer_text: Pots fer canvis a la teva sala en qualsevol moment - recording: Permetre a aquesta sala ser gravada + mute: Desactiva micròfon d'usuaris a l'entrar + require_approval: Requereix l'aprovació del moderador abans d'unir-se a la sessió + start: Permet als usuaris iniciar aquesta sessió + footer_text: Podeu fer canvis a la sala en qualsevol moment + recording: Permet l'enregistrament d'aquesta sala rename_room: - name_placeholder: Introdueix un nou nom per a la sala... + name_placeholder: Introduïu un nou nom per a la sala... share_access: - footer: Compartir una sala amb un usuari permet que iniciï la sala i veure les gravacions de la sala. + footer: Compartir una sala amb un usuari permet que iniciï la sala i veure els enregistraments de la sala. list: Compartit amb - title: Compartir accés a la sala - save: Guardar canvis - cancel_changes: Cancel·lar canvis - select: Seleccionar usuari + title: Comparteix l'accés a la sala + save: Desa els canvis + cancel_changes: Cancel·la els canvis + select: Seleccioneu un usuari merge_user: - cancel: Cancel·lar - from: Compte per a ser fusionada - title: Fusionar comptes d'usuari + cancel: Cancel·la + from: Compte per a ser fusionat + title: Fusiona els comptes d'usuari to: Compte principal - save: Fusionar + save: Fusiona footer: Les sales del compte que es fusionarà es transferiran a la llista de sales del compte principal i posteriorment s'eliminarà el compte. - name_update_success: El nom de la sala ha estat actualitzat correctament - no_user_email_exists: "No hi ha cap usuari existent amb el correu electrònic especificat. Si us plau, assegura't de que l'has escrit correctament." - omniauth_error: "Ha hagut un error a l'intentar autenticar utilitzant OmniAuth. Si us plau, torna a intentar-ho o contacta amb un administrador!" - omniauth_specific_error: "Error %{error} a l'intentar autenticar utilitzant OmniAuth. Si us plau, torna a intentar-ho o contacta amb un administrador!" + name_update_success: El nom de la sala s'ha actualitzat correctament + no_user_email_exists: No hi ha cap usuari existent amb el correu electrònic especificat. Assegureu-vos que l'heu escrit correctament. + omniauth_error: S'ha produït un error en intentar autenticar utilitzant OmniAuth. Torneu a intentar-ho o contacteu amb un administrador! + omniauth_specific_error: "Error %{error} en intentar autenticar utilitzant OmniAuth. Torneu a intentar-ho o contacteu amb un administrador!" pagy: nav: - prev: "‹ Anterior" - next: "Següent ›" + prev: "‹ Enrere" + next: "Endavant ›" gap: "…" password: Contrasenya password_empty_notice: La contrasenya no pot estar buida - password_reset_success: La contrasenya ha estat canviada - password_different_notice: La contrasenyes introduïdes no coincideix + password_reset_success: S'ha canviat la contrasenya. + password_different_notice: Les contrasenyes introduïdes no coincideixen provider: google: Google office365: Office 365 twitter: Twitter ldap: LDAP + openid_connect: OpenID Connect recaptcha: errors: - recaptcha_unreachable: Os pedrer! La resposta del teu reCAPTCHA ha fallat. Torna a intentar-ho. - verification_failed: "La verificació reCAPTCHA ha fallat, torna a intentar-ho." + recaptcha_unreachable: Os pedrer! La resposta del reCAPTCHA ha fallat. Torneu a intentar-ho. + verification_failed: "La verificació reCAPTCHA ha fallat, torneu a intentar-ho." recording: - all_recordings: Totes les gravacions - email: Enviar correu electrònic amb la gravació - error: "Ha hagut un error al recuperar %{count} gravació(ns)." - no_recordings: "Aquesta sala no te gravacions %{inject}" - no_user_recordings: No tens gravacions - no_matched_recordings: "No hi ha %{inject} gravacions que coincideixin amb la teva cerca." - recorded_on: "Gravada el %{date}" + all_recordings: Tots els enregistraments + email: Envia un correu electrònic amb l'enregistrament + error: "S'ha produït un error en recuperar %{count} enregsitrament(s)." + no_recordings: "Aquesta sala no té cap registrament %{inject}." + no_user_recordings: No teniu cap enregisrament + no_matched_recordings: "No hi ha %{inject} enregistraments que coincideixin amb la cerca." + recorded_on: "Enregsitrada el %{date}" table: name: Nom thumbnails: Miniatures d'imatge @@ -502,27 +510,28 @@ ca: video: Vídeo registration: approval: - fail: "El teu compte d'usuari encara no ha estat autorizat. Si han passat varis dies des del teu registre, et recomanem contactar amb l'administrador." - signup: El teu compte d'usuari ha estat creat i se li ha enviat una notificació a l'administrador per a la seva autorització. + fail: "El vostre compte d'usuari encara no ha estat autoritzat. Si han passat alguns dies des del vostre registre, us recomanem contactar amb l'administrador." + signup: El vostre compte d'usuari ha estat creat i se li ha enviat una notificació a l'administrador per a la seva autorització. banned: - fail: "No tens accés a aquesta aplicació. Si creus que es tracta d'un error, contacta l'administrador del sistema." + fail: "No teniu accés a aquesta aplicació. Si penseu que es tracta d'un error, contacteu amb l'administrador del sistema." deprecated: - new_signin: Selecciona un nou mètode de autenticació. Todes les sales vinculades al teu compte anterior seran migrades al nou compte - twitter_signin: "L'accés a través de Twitter és obsolet i serà eliminat a la següent versió. Fes clic aquí per a moure el teu compte d'usuari i el seu contingut a un compte vinculat a un altre mètode d'autenticació" - twitter_signup: "El registre de nous comptes amb Twitter és obsolet. Si us plau, utiliza un mètode d'autenticació diferent per a registrar-te." - merge_success: El teu compte vinculat a Twitter s'ha fusionat correctament amb el teu nou compte. El compte vinculat amb Twitter ha estat eliminat. + new_signin: Seleccioneu un nou mètode d'autenticació. Totes les sales vinculades al vostre compte anterior es migraran al compte nou + twitter_signin: "L'accés a través de Twitter és obsolet i serà eliminat a la següent versió. Feu clic aquí per a moure el vostre compte d'usuari i el seu contingut a un compte vinculat a un altre mètode d'autenticació" + twitter_signup: El registre de nous comptes amb Twitter és obsolet. Utilitzeu un mètode d'autenticació diferent per a registrar-vos + merge_success: El vostre compte vinculat a Twitter s'ha fusionat correctament amb el compte nou. El compte vinculat amb Twitter ha estat eliminat. invite: - fail: "El teu codi ha caducat o no és vàlid. Si creus que es tracta d'un error, contacta amb l'administrador del sistema." - no_invite: No tens una invitació per a ingresar. Contacta amb l'administrador del sistema per a obtenir-ne una. - remove: Eliminar - rename: Canviar nom + fail: "El codi ha caducat o no és vàlid. Si penseu que es tracta d'un error, contacteu amb l'administrador del sistema." + no_invite: No teniu una invitació per a ingressar. Contacteu amb l'administrador del sistema per a obtenir-ne una. + remove: Elimina + rename: Canvia el nom reset_password: - invalid_token: El token de restabliment de contrasenya no és vàlid. Intenta restablir la teva contrasenya de nou. - subtitle: Reiniciar contrasenya - password: Nova contrasenya - confirm: Confirmació de nova contrasenya - update: Actualitzar contrasenya - auth_change: "El mètode d'autenticación ha canviat. Si us plau, consulta el teu correu electrònic per a configurar la teva contrasenya." + captcha: "La verificació reCAPTCHA ha fallat, torneu a intentar-ho." + invalid_token: El token de restabliment de contrasenya no és vàlid. Intenteu restablir la contrasenya de nou. + subtitle: Restableix la contrasenya + password: Contrasenya nova + confirm: Confirmació de la contrasenya nova + update: Actualitza la contrasenya + auth_change: El mètode d'autenticació ha canviat. Consulteu el correu electrònic per a configurar la contrasenya. roles: active: Actiu admin: Administrador @@ -531,102 +540,103 @@ ca: pending: Pendent user: Usuari room: - access_code_required: Introdueix un codi d'accés vàlid per a unir-te a la sala - add_presentation: Afegir presentació + access_code_required: Introduïu un codi d'accés vàlid per a unir-vos a la sala + add_presentation: Afegeix una presentació copy_access: Copia el codi d'accés - create_room: Crear una sala - create_room_error: Ha hagut un error al crear la sala + create_room: Crea una sala + create_room_error: S'ha produït un error en crear la sala create_room_success: La sala s'ha creat correctament delete: home_room: No és possible eliminar la sala principal - success: Sala eliminada correctament - fail: "S'ha produït un error a l'eliminar la sala (%{error})" - enter_the_access_code: Introdueix el codi d'accés de la sala - invalid_provider: L'enllaç introduït no és vàlid. Comprova'l i torna a intentar-ho. - invitation_description: "Ha estat convidat a unir-te a %{name} utilitzant BigBlueButton. Per a unir-te, fes clic a l'enllaç superior i introdueix el teu nom." - invited: Ha estat convidat a unir-te - recording_present: Reconec que aquesta sessió es gravarà. Això pot incloure la meva veu i el meu vídeo si està activat. - invite_participants: Convidar participants - join: Entrar + success: S'ha eliminat la sala correctament + fail: "S'ha produït un error en eliminar la sala (%{error})" + enter_the_access_code: Introduïu el codi d'accés de la sala + invalid_provider: L'enllaç introduït no és vàlid. Comproveu-lo i torneu a intentar-ho. + invitation_description: "Heu estat convidat a unir-vos a %{name} utilitzant BigBlueButton. Per a unir-vos-hi, feu clic a l'enllaç superior i introduïu el vostre nom." + invited: Heu estat convidat a unir-vos + recording_present: Reconec que aquesta sessió s'enregistrarà. Això pot incloure la meva veu i el meu vídeo si està activat. + invite_participants: Convida participants + join: Entra last_session: "Última sessió a %{session}" - login: Entrar + login: Entra owner: Propietari owner_banned: Aquesta sala no és accessible actualment no_room: - description: Introdueix l'enllaç o ID de la sala a la que vols unir-te. + description: Introduïu l'enllaç o ID de la sala a la qual voleu unir-vos. edit_profile: Edita el perfil d'usuari - go_to: Anar a sala - invalid_room_uid: L'enllaç o UID que has introduït no és vàlid. + go_to: Vés a la sala + invalid_room_uid: L'enllaç o UID que heu introduït no és vàlid. placeholder: Enllaç/uid de la sala - no_recent_rooms: No has utilitzat cap sala recientement - recent_rooms: Ves a Sales utilizadas recentement - title: Uneix-te a una Sala - no_sessions: Aquesta sala encara no te sessions - preupload_success: Presentació afegida correctament - preupload_error: Ha hagut un error actualitzant la presentació de la sala + no_recent_rooms: No heu utilitzat cap sala recientement + recent_rooms: Vés a les sales utilitzades recentment + title: Uneix-te a una sala + no_sessions: Aquesta sala encara no té cap sessió + preupload_success: La presentació s'ha afegit correctament + preupload_error: S'ha produït un error en actualitzar la presentació de la sala preupload_remove_success: Eliminació de presentació correcta - preupload_remove_error: Ha hagut un error eliminant la presentació de la sala - recordings: Gravacions de sala - room_limit: Has arribat al número límit de sales permeses - room_limit_exceeded: "Has arribat al número límit de sales permeses. Si us plau, elimina %{difference} sala(es) per poder accedir a aquesta." + preupload_remove_error: S'ha produït un error en eliminar la presentació de la sala + recordings: Enregistraments de sala + room_limit: Heu arribat al nombre límit de sales permeses + room_limit_exceeded: "Heu superat el nombre de sales permeses. Elimineu %{difference} sales per a poder accedir a aquesta." sessions: Sessions settings: Configuració de sala - share: Gestionar accés + share: Gestiona l'accés shared_by: "Compartit per %{email}" - remove_shared_access_success: S'ha eliminat correctament la sala compartida de la teva llista de sales - remove_shared_access_error: Ha hagut un error eliminant la sala compartida de la teva llista de sales + remove_shared_access_success: S'ha eliminat correctament la sala compartida de la llista de sales + remove_shared_access_error: S'ha produït un error en eliminar la sala compartida de la llista de sales shared_access_success: Sala compartida correctament - shared_access_error: Ha hagut un error compartint la sala + shared_access_error: S'ha produït un error en compartir la sala start: Inicia - unavailable: Aquesta sala no es troba disponible perquè el compte de correu del seu propietari no ha estat verificat. - update_settings_error: Ha hagut un error a l'actualitzar la configuració de la sala + search: Cerca sala... + unavailable: Aquesta sala no es troba disponible perquè el compte de correu del seu propietari no s'ha verificat. + update_settings_error: S'ha produït un error en actualitzar la configuració de la sala update_settings_success: La configuració de la sala ha estat actualitzada correctament wait: message: La sessió encara no ha començat. - auto: Seràs enviat a la sala automàticament quan comenci la sessió + auto: Se us enviarà cap a la sala automàticament quan comenci la sessió settings: account: fullname: Nom complet - language: Idioma + language: Llengua provider: Proveïdor image: Imatge image_url: Enllaç a la imatge de perfil roles: Rol d'usuari - subtitle: Actualitzar informació d'usuari + subtitle: Actualitzeu la vostra informació d'usuari title: Informació del compte - reset_password: Restablir contrasenya d'usuari + reset_password: Restableix la contrasenya d'usuari delete: button: "Sí, m'agradaria eliminar el meu compte d'usuari." - disclaimer: "Si tries eliminar el teu compte d'usuari, no podrà recuperar-se. Tota la informació relacionada amb el teu compte, incloses configuració, sales y gravacions, serà eliminada." + disclaimer: "Si trieu eliminar el vostre compte d'usuari, no podrà recuperar-se. Tota la informació relacionada amb el compte, incloses la configuració, sales i enregistraments, s'eliminarà." subtitle: Eliminar el compte de forma permanent - title: Eliminar compte + title: Elimina el compte password: confirmation: Confirmació de contrasenya nova new: Contrasenya nova old: Contrasenya anterior - subtitle: Canviar la teva contrasenya + subtitle: Canvia la contrasenya title: Contrasenya title: Perfil d'usuari search: Cerca signup: password_confirm: Confirmació de contrasenya - subtitle: Crear un compte - title: Registrar-se - with: "Registrar-se utilitzant %{provider}" + subtitle: Crea un compte + title: Registre + with: "Registre amb %{provider}" terms: - accept: Accepto els termes y condicions d'ús + accept: "Accepto els %{href}" accept_existing: Accepto els termes y condicions d'ús - title: Termes y condicions d'ús + title: Termes i condicions d'ús test_install: > - Aquesta instal·lació està utilitzant el servidor de proves pre-configurat. Hauria de ser substituït amb el teu propi servidor. Per a més detalls consulta %{href}. + Aquesta instal·lació està utilitzant el servidor de proves pre-configurat. Hauria de ser substituït amb el vostre propi servidor. Per a més detalls consulta %{href}. update: Actualitza verify: accept: Verifica - activated: Compte de correu verificada. - already_verified: Compte de correu verificada amb anterioritat + activated: Compte verificat. + already_verified: El compte ja s'ha verificat invalid: Enllaç de verificació no vàlid - not_verified: El teu compte de correu no ha estat verificat - resend: Reenviar enllaç per a verificació de compte de correu - signin: "Inicia sessió per a tenir accés al teu compte " - title: Verifica el teu compte de correu + not_verified: El compte encara no s'ha verificat + resend: Torna a enviar l'enllaç de verificació + signin: "Inicieu sessió per a tenir accés al vostre compte " + title: Verifiqueu l'adreça electrònica verification: Verificació From ba0ec6ba71a12fa90a364f8ceea8132ee24e7acf Mon Sep 17 00:00:00 2001 From: zimmersi <74589100+zimmersi@users.noreply.github.com> Date: Tue, 2 Mar 2021 00:50:00 +0100 Subject: [PATCH 062/203] enable SMTPS: SMTP over direct TLS connection (#2485) * enable SMTPS: SMTP over direct TLS connection * remove gem 'sqlite3', '~> 1.3.6' as requested * enable SMTPS: SMTP over direct TLS connection * remove gem 'sqlite3', '~> 1.3.6' as requested * changed image name to kwgl * rebase and rubocop -a * removed gem 'sqlite3', '~> 1.3.6' --- config/environments/production.rb | 3 +++ sample.env | 3 +++ 2 files changed, 6 insertions(+) diff --git a/config/environments/production.rb b/config/environments/production.rb index f92ff48e..12e84b39 100644 --- a/config/environments/production.rb +++ b/config/environments/production.rb @@ -107,6 +107,9 @@ Rails.application.configure do } end + # enable SMTPS: SMTP over direct TLS connection + ActionMailer::Base.smtp_settings[:tls] = true if ENV['SMTP_TLS'].present? && ENV['SMTP_TLS'] != "false" + # If configured to 'none' don't check the smtp servers certificate ActionMailer::Base.smtp_settings[:openssl_verify_mode] = ENV['SMTP_OPENSSL_VERIFY_MODE'] if ENV['SMTP_OPENSSL_VERIFY_MODE'].present? diff --git a/sample.env b/sample.env index 12a76e03..2d62c0c7 100644 --- a/sample.env +++ b/sample.env @@ -135,6 +135,9 @@ GOOGLE_ANALYTICS_TRACKING_ID= # SMTP_AUTH=plain # SMTP_STARTTLS_AUTO=true # +# enable SMTPS: SMTP over direct TLS connection; usually port 465 +# SMTP_TLS=true +# # If your mail server has a self-signed certificate, you'll also need to include the line below. # Please note that enable this presents its own security risks and should not be done unless necessary. # SMTP_OPENSSL_VERIFY_MODE=none From 779b41a64a6eea815ca99efdc6dcbb0b263e7ddb Mon Sep 17 00:00:00 2001 From: Mitsutaka Sato Date: Thu, 4 Mar 2021 11:41:10 +1300 Subject: [PATCH 063/203] Add open_timeout (#2555) --- app/helpers/application_helper.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index 2725e60d..57d683f3 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -111,6 +111,7 @@ module ApplicationHelper http = Net::HTTP.new(url.host, url.port) http.use_ssl = (url.scheme == "https") http.read_timeout = 10 + http.open_timeout = 10 http.start do |web| response = web.head(url.request_uri) From cd4433798c49b3272decaf14a662312c6778ff17 Mon Sep 17 00:00:00 2001 From: Ahmad Farhat Date: Thu, 4 Mar 2021 18:01:01 -0500 Subject: [PATCH 064/203] GRN2-354: Switch default database to Postgres 13.2 (#2563) * Switch default database to Postgres 13.2 * Update pg version in Github Actions --- .github/workflows/main.yml | 2 +- docker-compose.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 435439aa..c7342457 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -21,7 +21,7 @@ jobs: services: postgres: - image: postgres + image: postgres:13.2-alpine env: POSTGRES_DB: postgres POSTGRES_PASSWORD: postgres diff --git a/docker-compose.yml b/docker-compose.yml index d334c9ee..e6a4b4bf 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -24,7 +24,7 @@ services: links: - db db: - image: postgres:9.5 + image: postgres:13.2-alpine restart: unless-stopped ports: - 127.0.0.1:5432:5432 From 32da1ee206ebc5ff33e89da1dd5c37678649e3f2 Mon Sep 17 00:00:00 2001 From: Ahmad Farhat Date: Sun, 7 Mar 2021 14:30:11 -0500 Subject: [PATCH 065/203] Forked the workflows to avoid potential disruption (#2565) --- .github/workflows/build.push.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.push.yml b/.github/workflows/build.push.yml index e281d7ba..3f05b819 100644 --- a/.github/workflows/build.push.yml +++ b/.github/workflows/build.push.yml @@ -22,13 +22,13 @@ jobs: password: ${{ secrets.DOCKER_PASSWORD }} - name: Compute Short SHA - uses: benjlevesque/short-sha@v1.2 + uses: farhatahmad/short-sha@v1.2 id: short-sha with: length: 7 - name: Get Branch Name - uses: tj-actions/branch-names@v2 + uses: farhatahmad/branch-names@v2 id: branch-name - name: Build and Push latest From 4cd41f5aa8fdc04fc0070532c050bddd09f8e12b Mon Sep 17 00:00:00 2001 From: Ahmad Farhat Date: Sun, 14 Mar 2021 14:06:11 -0400 Subject: [PATCH 066/203] Replace all CRLF files to LF (#2572) --- .github/workflows/build.release.yml | 64 ++-- app/views/rooms/show.html.erb | 280 +++++++++--------- .../shared/modals/_invite_user_modal.html.erb | 88 +++--- .../shared/modals/_share_room_modal.html.erb | 86 +++--- app/views/user_mailer/invite_email.html.erb | 86 +++--- app/views/user_mailer/invite_email.text.erb | 54 ++-- 6 files changed, 329 insertions(+), 329 deletions(-) diff --git a/.github/workflows/build.release.yml b/.github/workflows/build.release.yml index 3f8fa9c9..46cecd08 100644 --- a/.github/workflows/build.release.yml +++ b/.github/workflows/build.release.yml @@ -1,32 +1,32 @@ -env: - RUBY_VERSION: 2.7.2 - - -name: Build Release -on: - release: - types: [released] - -jobs: - main: - name: Build Docker Image - runs-on: ubuntu-18.04 - steps: - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v1 - - - name: Login to Github Container Registry - uses: docker/login-action@v1 - with: - username: ${{ secrets.DOCKER_USERNAME }} - password: ${{ secrets.DOCKER_PASSWORD }} - - - name: Build and Push release - uses: docker/build-push-action@v2 - with: - push: true - tags: | - bigbluebutton/greenlight:latest - bigbluebutton/greenlight:v2 - bigbluebutton/greenlight:${{ github.event.release.tag_name }} - build-args: version_code=${{ github.event.release.tag_name }} +env: + RUBY_VERSION: 2.7.2 + + +name: Build Release +on: + release: + types: [released] + +jobs: + main: + name: Build Docker Image + runs-on: ubuntu-18.04 + steps: + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v1 + + - name: Login to Github Container Registry + uses: docker/login-action@v1 + with: + username: ${{ secrets.DOCKER_USERNAME }} + password: ${{ secrets.DOCKER_PASSWORD }} + + - name: Build and Push release + uses: docker/build-push-action@v2 + with: + push: true + tags: | + bigbluebutton/greenlight:latest + bigbluebutton/greenlight:v2 + bigbluebutton/greenlight:${{ github.event.release.tag_name }} + build-args: version_code=${{ github.event.release.tag_name }} diff --git a/app/views/rooms/show.html.erb b/app/views/rooms/show.html.erb index 0d8903df..3feb5219 100644 --- a/app/views/rooms/show.html.erb +++ b/app/views/rooms/show.html.erb @@ -1,140 +1,140 @@ -<% -# BigBlueButton open source conferencing system - http://www.bigbluebutton.org/. -# Copyright (c) 2018 BigBlueButton Inc. and by respective authors (see below). -# This program is free software; you can redistribute it and/or modify it under the -# terms of the GNU Lesser General Public License as published by the Free Software -# Foundation; either version 3.0 of the License, or (at your option) any later -# version. -# -# BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY -# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. -# You should have received a copy of the GNU Lesser General Public License along -# with BigBlueButton; if not, see . -%> - -<% exceeds_limit = current_room_exceeds_limit(@room)%> -<% if exceeds_limit%> -
- <%= t("room.room_limit_exceeded", difference: @diff) %> -
-<% end %> -
-
-
-
-
-

<%= title(@room.name) %>

- <% if current_user.main_room == @room %> - - <% else %> - - <% end %> -
-

<%= @room.sessions %> <%= t("room.sessions") %><% unless hide_recording_tables %> | <%= @recordings.length %> <%= t("room.recordings") %><% end %>

- <% unless exceeds_limit %> - -
-
- -
-
-
-
- -
-
- <% if @room.access_code.present? %> - - - <% end %> - <% if Rails.configuration.enable_google_calendar_button %> - - - <%= t("add_to_google_calendar") %> - - <% end %> -
-
-
-
- <% end %> -
-
- <% if @room_running %> - <%= button_to t("room.join"), room_path(@room), class: "btn btn-primary btn-block px-7 start-button float-right", "data-disable": "" %> - <% else %> - <% unless exceeds_limit %> - <%= button_to t("room.start"), start_room_path(@room), class: "btn btn-primary btn-block px-7 start-button float-right", "data-disable": "" %> - <% end %> - <% end %> -
-
- - <% if total_room_count(current_user) > 5 %> - - <% end %> - -
- <% if current_user.role.get_permission("can_create_rooms") %> - <% current_user.ordered_rooms.each do |room| %> -
- <%= link_to room do %> - <%= render "rooms/components/room_block", room: room %> - <% end %> -
- <% end %> - <% end %> - - <% if shared_access_allowed %> - <% current_user.shared_rooms.each do |room| %> -
- <%= link_to room do %> - <%= render "rooms/components/shared_room_block", room: room %> - <% end %> -
- <% end %> - <% end %> - - <% if current_user.role.get_permission("can_create_rooms") && !room_limit_exceeded %> - <%= render "rooms/components/create_room_block"%> - <% end %> -
-
-
- -<% unless hide_recording_tables %> - <%= render "shared/sessions", recordings: @recordings, pagy: @pagy, only_public: false, shared_room: @shared_room, user_recordings: false, title: t("room.recordings")%> -<% end %> - -<%= render "shared/modals/delete_room_modal" %> - -<%= render "shared/modals/create_room_modal" %> - -<% if preupload_allowed? %> - <%= render "shared/modals/preupload_presentation_modal" %> -<% end %> - -<% if shared_access_allowed %> - <%= render "shared/modals/share_room_modal" %> - <%= render "shared/modals/remove_access_modal" %> -<% end %> +<% +# BigBlueButton open source conferencing system - http://www.bigbluebutton.org/. +# Copyright (c) 2018 BigBlueButton Inc. and by respective authors (see below). +# This program is free software; you can redistribute it and/or modify it under the +# terms of the GNU Lesser General Public License as published by the Free Software +# Foundation; either version 3.0 of the License, or (at your option) any later +# version. +# +# BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. +# You should have received a copy of the GNU Lesser General Public License along +# with BigBlueButton; if not, see . +%> + +<% exceeds_limit = current_room_exceeds_limit(@room)%> +<% if exceeds_limit%> +
+ <%= t("room.room_limit_exceeded", difference: @diff) %> +
+<% end %> +
+
+
+
+
+

<%= title(@room.name) %>

+ <% if current_user.main_room == @room %> + + <% else %> + + <% end %> +
+

<%= @room.sessions %> <%= t("room.sessions") %><% unless hide_recording_tables %> | <%= @recordings.length %> <%= t("room.recordings") %><% end %>

+ <% unless exceeds_limit %> + +
+
+ +
+
+
+
+ +
+
+ <% if @room.access_code.present? %> + + + <% end %> + <% if Rails.configuration.enable_google_calendar_button %> + + + <%= t("add_to_google_calendar") %> + + <% end %> +
+
+
+
+ <% end %> +
+
+ <% if @room_running %> + <%= button_to t("room.join"), room_path(@room), class: "btn btn-primary btn-block px-7 start-button float-right", "data-disable": "" %> + <% else %> + <% unless exceeds_limit %> + <%= button_to t("room.start"), start_room_path(@room), class: "btn btn-primary btn-block px-7 start-button float-right", "data-disable": "" %> + <% end %> + <% end %> +
+
+ + <% if total_room_count(current_user) > 5 %> + + <% end %> + +
+ <% if current_user.role.get_permission("can_create_rooms") %> + <% current_user.ordered_rooms.each do |room| %> +
+ <%= link_to room do %> + <%= render "rooms/components/room_block", room: room %> + <% end %> +
+ <% end %> + <% end %> + + <% if shared_access_allowed %> + <% current_user.shared_rooms.each do |room| %> +
+ <%= link_to room do %> + <%= render "rooms/components/shared_room_block", room: room %> + <% end %> +
+ <% end %> + <% end %> + + <% if current_user.role.get_permission("can_create_rooms") && !room_limit_exceeded %> + <%= render "rooms/components/create_room_block"%> + <% end %> +
+
+
+ +<% unless hide_recording_tables %> + <%= render "shared/sessions", recordings: @recordings, pagy: @pagy, only_public: false, shared_room: @shared_room, user_recordings: false, title: t("room.recordings")%> +<% end %> + +<%= render "shared/modals/delete_room_modal" %> + +<%= render "shared/modals/create_room_modal" %> + +<% if preupload_allowed? %> + <%= render "shared/modals/preupload_presentation_modal" %> +<% end %> + +<% if shared_access_allowed %> + <%= render "shared/modals/share_room_modal" %> + <%= render "shared/modals/remove_access_modal" %> +<% end %> diff --git a/app/views/shared/modals/_invite_user_modal.html.erb b/app/views/shared/modals/_invite_user_modal.html.erb index b7680877..b8e5a768 100644 --- a/app/views/shared/modals/_invite_user_modal.html.erb +++ b/app/views/shared/modals/_invite_user_modal.html.erb @@ -1,44 +1,44 @@ -<% -# BigBlueButton open source conferencing system - http://www.bigbluebutton.org/. -# Copyright (c) 2018 BigBlueButton Inc. and by respective authors (see below). -# This program is free software; you can redistribute it and/or modify it under the -# terms of the GNU Lesser General Public License as published by the Free Software -# Foundation; either version 3.0 of the License, or (at your option) any later -# version. -# -# BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY -# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. -# You should have received a copy of the GNU Lesser General Public License along -# with BigBlueButton; if not, see . -%> - - +<% +# BigBlueButton open source conferencing system - http://www.bigbluebutton.org/. +# Copyright (c) 2018 BigBlueButton Inc. and by respective authors (see below). +# This program is free software; you can redistribute it and/or modify it under the +# terms of the GNU Lesser General Public License as published by the Free Software +# Foundation; either version 3.0 of the License, or (at your option) any later +# version. +# +# BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. +# You should have received a copy of the GNU Lesser General Public License along +# with BigBlueButton; if not, see . +%> + + diff --git a/app/views/shared/modals/_share_room_modal.html.erb b/app/views/shared/modals/_share_room_modal.html.erb index 57a50c6d..038917e1 100644 --- a/app/views/shared/modals/_share_room_modal.html.erb +++ b/app/views/shared/modals/_share_room_modal.html.erb @@ -1,43 +1,43 @@ -<% -# BigBlueButton open source conferencing system - http://www.bigbluebutton.org/. -# Copyright (c) 2018 BigBlueButton Inc. and by respective authors (see below). -# This program is free software; you can redistribute it and/or modify it under the -# terms of the GNU Lesser General Public License as published by the Free Software -# Foundation; either version 3.0 of the License, or (at your option) any later -# version. -# -# BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY -# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. -# You should have received a copy of the GNU Lesser General Public License along -# with BigBlueButton; if not, see . -%> - - +<% +# BigBlueButton open source conferencing system - http://www.bigbluebutton.org/. +# Copyright (c) 2018 BigBlueButton Inc. and by respective authors (see below). +# This program is free software; you can redistribute it and/or modify it under the +# terms of the GNU Lesser General Public License as published by the Free Software +# Foundation; either version 3.0 of the License, or (at your option) any later +# version. +# +# BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. +# You should have received a copy of the GNU Lesser General Public License along +# with BigBlueButton; if not, see . +%> + + diff --git a/app/views/user_mailer/invite_email.html.erb b/app/views/user_mailer/invite_email.html.erb index 6f7c6505..a822b6ce 100644 --- a/app/views/user_mailer/invite_email.html.erb +++ b/app/views/user_mailer/invite_email.html.erb @@ -1,43 +1,43 @@ -<% -# BigBlueButton open source conferencing system - http://www.bigbluebutton.org/. -# -# Copyright (c) 2018 BigBlueButton Inc. and by respective authors (see below). -# -# This program is free software; you can redistribute it and/or modify it under the -# terms of the GNU Lesser General Public License as published by the Free Software -# Foundation; either version 3.0 of the License, or (at your option) any later -# version. -# -# BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY -# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License along -# with BigBlueButton; if not, see . -%> - -
-
- <%= image_tag(@image, height: '70') %> - -

- <%= t('mailer.user.invite.subject') %> -

- -

- <%= t('mailer.user.invite.info', name: @name) %> -

- -

- <%= t('mailer.user.invite.username', email: @email) %> -

- -

- <%= t('mailer.user.invite.signup_info') %> -

- - - <%= t('mailer.user.invite.signup_link') %> - -
-
+<% +# BigBlueButton open source conferencing system - http://www.bigbluebutton.org/. +# +# Copyright (c) 2018 BigBlueButton Inc. and by respective authors (see below). +# +# This program is free software; you can redistribute it and/or modify it under the +# terms of the GNU Lesser General Public License as published by the Free Software +# Foundation; either version 3.0 of the License, or (at your option) any later +# version. +# +# BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License along +# with BigBlueButton; if not, see . +%> + +
+
+ <%= image_tag(@image, height: '70') %> + +

+ <%= t('mailer.user.invite.subject') %> +

+ +

+ <%= t('mailer.user.invite.info', name: @name) %> +

+ +

+ <%= t('mailer.user.invite.username', email: @email) %> +

+ +

+ <%= t('mailer.user.invite.signup_info') %> +

+ + + <%= t('mailer.user.invite.signup_link') %> + +
+
diff --git a/app/views/user_mailer/invite_email.text.erb b/app/views/user_mailer/invite_email.text.erb index 0cef70c2..f5f259d1 100644 --- a/app/views/user_mailer/invite_email.text.erb +++ b/app/views/user_mailer/invite_email.text.erb @@ -1,27 +1,27 @@ -<% -# BigBlueButton open source conferencing system - http://www.bigbluebutton.org/. -# -# Copyright (c) 2018 BigBlueButton Inc. and by respective authors (see below). -# -# This program is free software; you can redistribute it and/or modify it under the -# terms of the GNU Lesser General Public License as published by the Free Software -# Foundation; either version 3.0 of the License, or (at your option) any later -# version. -# -# BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY -# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License along -# with BigBlueButton; if not, see . -%> - -<%= t('mailer.user.invite.subject') %> - -<%= t('mailer.user.invite.info', name: @name) %> - -<%= t('mailer.user.invite.username', email: @email) %> - -<%= t('mailer.user.invite.signup_info') %> - -<%= @url %> +<% +# BigBlueButton open source conferencing system - http://www.bigbluebutton.org/. +# +# Copyright (c) 2018 BigBlueButton Inc. and by respective authors (see below). +# +# This program is free software; you can redistribute it and/or modify it under the +# terms of the GNU Lesser General Public License as published by the Free Software +# Foundation; either version 3.0 of the License, or (at your option) any later +# version. +# +# BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License along +# with BigBlueButton; if not, see . +%> + +<%= t('mailer.user.invite.subject') %> + +<%= t('mailer.user.invite.info', name: @name) %> + +<%= t('mailer.user.invite.username', email: @email) %> + +<%= t('mailer.user.invite.signup_info') %> + +<%= @url %> From 9dc59b12112c2b586738203517b555b5358a2c2b Mon Sep 17 00:00:00 2001 From: zechmeister Date: Sun, 14 Mar 2021 19:24:30 +0100 Subject: [PATCH 067/203] Add optional moderator codes (#2413) * add column for moderator code * add interface for moderator access code * add support for write and update moderator access * check if correct moderator_code in session * move access code form into own component * add support for moderator access code * add support for moderator access code * add copy code button for moderator code * freeze all the things * add tests for moderator access code * add helpfer for moderator_access setting * add setting for moderator access code * show setting for moderator access code * add checks for moderator code setting * use method from room controller for moderator password check * add tests for login with moderator access code * add check for moderator code setting * check if moderator codes are enabled in settings * only display form for moderator code if enabled in settings * add newline at end of file * make check for moderator code available as helper * align style of join button and access code button * add localization for moderator codes * add field for moderator codes * add field for moderator access code to rooms * fixes for rubocop * fix LineLenghts for rubocop * fix double space Co-authored-by: Ahmad Farhat --- app/assets/javascripts/room.js | 44 ++- app/assets/stylesheets/rooms.scss | 4 +- app/controllers/application_controller.rb | 6 + app/controllers/concerns/joiner.rb | 5 +- app/controllers/rooms_controller.rb | 30 +- app/helpers/admins_helper.rb | 8 + app/models/setting.rb | 2 + .../site_settings/_settings.html.erb | 21 ++ .../_enter_access_code_form.html.erb | 29 ++ .../rooms/components/_room_block.html.erb | 2 +- app/views/rooms/join.html.erb | 29 +- app/views/rooms/show.html.erb | 287 +++++++++--------- .../shared/modals/_create_room_modal.html.erb | 13 + config/application.rb | 3 + config/locales/de_DE.yml | 10 + config/locales/en.yml | 10 + ...2132_add_moderator_access_code_to_rooms.rb | 7 + db/schema.rb | 3 +- spec/controllers/rooms_controller_spec.rb | 108 +++++++ 19 files changed, 447 insertions(+), 174 deletions(-) create mode 100644 app/views/rooms/components/_enter_access_code_form.html.erb create mode 100644 db/migrate/20210108032132_add_moderator_access_code_to_rooms.rb diff --git a/app/assets/javascripts/room.js b/app/assets/javascripts/room.js index d5861d8f..d953f613 100644 --- a/app/assets/javascripts/room.js +++ b/app/assets/javascripts/room.js @@ -184,17 +184,19 @@ function copyInvite() { } } -function copyAccess() { - $('#copy-code').attr("type", "text") - $('#copy-code').select() +function copyAccess(target) { + input = target ? $("#copy-" + target + "-code") : $("#copy-code") + input.attr("type", "text") + input.select() if (document.execCommand("copy")) { - $('#copy-code').attr("type", "hidden") - copy = $("#copy-access") + input.attr("type", "hidden") + copy = target ? $("#copy-" + target + "-access") : $("#copy-access") copy.addClass('btn-success'); copy.html("" + getLocalizedString("copied")) setTimeout(function(){ copy.removeClass('btn-success'); - copy.html("" + getLocalizedString("room.copy_access")) + originalString = target ? getLocalizedString("room.copy_" + target + "_access") : getLocalizedString("room.copy_access") + copy.html("" + originalString) }, 1000) } } @@ -202,7 +204,9 @@ function copyAccess() { function showCreateRoom(target) { $("#create-room-name").val("") $("#create-room-access-code").text(getLocalizedString("modal.create_room.access_code_placeholder")) + $("#create-room-moderator-access-code").text(getLocalizedString("modal.create_room.moderator_access_code_placeholder")) $("#room_access_code").val(null) + $("#room_moderator_access_code").val(null) $("#createRoomModal form").attr("action", $("body").data('relative-root')) $("#room_mute_on_join").prop("checked", $("#room_mute_on_join").data("default")) @@ -254,6 +258,16 @@ function showUpdateRoom(target) { $("#create-room-access-code").text(getLocalizedString("modal.create_room.access_code_placeholder")) $("#room_access_code").val(null) } + + var moderatorAccessCode = modal.closest(".room-block").data("room-moderator-access-code") + + if(moderatorAccessCode){ + $("#create-room-moderator-access-code").text(getLocalizedString("modal.create_room.moderator_access_code") + ": " + moderatorAccessCode) + $("#room_moderator_access_code").val(moderatorAccessCode) + } else { + $("#create-room-moderator-access-code").text(getLocalizedString("modal.create_room.moderator_access_code_placeholder")) + $("#room_moderator_access_code").val(null) + } } function showDeleteRoom(target) { @@ -291,6 +305,24 @@ function ResetAccessCode(){ $("#room_access_code").val(null) } +function generateModeratorAccessCode(){ + const accessCodeLength = 6 + var validCharacters = "abcdefghijklmopqrstuvwxyz" + var accessCode = "" + + for( var i = 0; i < accessCodeLength; i++){ + accessCode += validCharacters.charAt(Math.floor(Math.random() * validCharacters.length)); + } + + $("#create-room-moderator-access-code").text(getLocalizedString("modal.create_room.moderator_access_code") + ": " + accessCode) + $("#room_moderator_access_code").val(accessCode) +} + +function ResetModeratorAccessCode(){ + $("#create-room-moderator-access-code").text(getLocalizedString("modal.create_room.moderator_access_code_placeholder")) + $("#room_moderator_access_code").val(null) +} + function saveAccessChanges() { let listItemsToAdd = $("#user-list li:not(.remove-shared)").toArray().map(user => $(user).data("uid")) diff --git a/app/assets/stylesheets/rooms.scss b/app/assets/stylesheets/rooms.scss index 26709952..573ec5c4 100644 --- a/app/assets/stylesheets/rooms.scss +++ b/app/assets/stylesheets/rooms.scss @@ -32,8 +32,8 @@ font-size: 20px !important; } -.join-input { - height: 48px; +.moderator-code-label { + margin-top: 150px !important; } .home-indicator { diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index d58f5d8d..75ac36f0 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -186,6 +186,12 @@ class ApplicationController < ActionController::Base end helper_method :recording_consent_required? + # Indicates whether users are allowed to add moderator access codes to rooms + def moderator_code_allowed? + @settings.get_value("Moderator Access Codes") == "true" + end + helper_method :moderator_code_allowed? + # Returns a list of allowed file types def allowed_file_types Rails.configuration.allowed_file_types diff --git a/app/controllers/concerns/joiner.rb b/app/controllers/concerns/joiner.rb index 96958c05..6c6b016e 100644 --- a/app/controllers/concerns/joiner.rb +++ b/app/controllers/concerns/joiner.rb @@ -50,10 +50,11 @@ module Joiner def join_room(opts) @room_settings = JSON.parse(@room[:room_settings]) - if room_running?(@room.bbb_id) || @room.owned_by?(current_user) || room_setting_with_config("anyoneCanStart") + moderator_privileges = @room.owned_by?(current_user) || valid_moderator_access_code(session[:moderator_access_code]) + if room_running?(@room.bbb_id) || room_setting_with_config("anyoneCanStart") || moderator_privileges # Determine if the user needs to join as a moderator. - opts[:user_is_moderator] = @room.owned_by?(current_user) || room_setting_with_config("joinModerator") || @shared_room + opts[:user_is_moderator] = room_setting_with_config("joinModerator") || @shared_room || moderator_privileges opts[:record] = record_meeting opts[:require_moderator_approval] = room_setting_with_config("requireModeratorApproval") opts[:mute_on_start] = room_setting_with_config("muteOnStart") diff --git a/app/controllers/rooms_controller.rb b/app/controllers/rooms_controller.rb index cc06e4a5..2de6aac6 100644 --- a/app/controllers/rooms_controller.rb +++ b/app/controllers/rooms_controller.rb @@ -44,7 +44,9 @@ class RoomsController < ApplicationController return redirect_to current_user.main_room, flash: { alert: I18n.t("room.room_limit") } if room_limit_exceeded # Create room - @room = Room.new(name: room_params[:name], access_code: room_params[:access_code]) + @room = Room.new(name: room_params[:name], + access_code: room_params[:access_code], + moderator_access_code: room_params[:moderator_access_code]) @room.owner = current_user @room.room_settings = create_room_settings_string(room_params) @@ -109,8 +111,9 @@ class RoomsController < ApplicationController @shared_room = room_shared_with_user unless @room.owned_by?(current_user) || @shared_room - # Don't allow users to join unless they have a valid access code or the room doesn't have an access code - if @room.access_code && !@room.access_code.empty? && @room.access_code != session[:access_code] + # Don't allow users to join unless they have a valid access code or the room doesn't have an access codes + valid_access_code = !@room.access_code.present? || @room.access_code == session[:access_code] + if !valid_access_code && !valid_moderator_access_code(session[:moderator_access_code]) return redirect_to room_path(room_uid: params[:room_uid]), flash: { alert: I18n.t("room.access_code_required") } end @@ -203,7 +206,8 @@ class RoomsController < ApplicationController @room.update_attributes( name: options[:name], room_settings: room_settings_string, - access_code: options[:access_code] + access_code: options[:access_code], + moderator_access_code: options[:moderator_access_code] ) flash[:success] = I18n.t("room.update_settings_success") @@ -321,9 +325,16 @@ class RoomsController < ApplicationController # POST /:room_uid/login def login - session[:access_code] = room_params[:access_code] + # use same form for access_code and moderator_access_code + if valid_moderator_access_code(room_params[:access_code]) + session[:moderator_access_code] = room_params[:access_code] + else + session[:access_code] = room_params[:access_code] + end - flash[:alert] = I18n.t("room.access_code_required") if session[:access_code] != @room.access_code + if session[:access_code] != @room.access_code && !valid_moderator_access_code(session[:moderator_access_code]) + flash[:alert] = I18n.t("room.access_code_required") + end redirect_to room_path(@room.uid) end @@ -345,7 +356,7 @@ class RoomsController < ApplicationController def room_params params.require(:room).permit(:name, :auto_join, :mute_on_join, :access_code, :require_moderator_approval, :anyone_can_start, :all_join_moderator, - :recording, :presentation) + :recording, :presentation, :moderator_access_code) end # Find the room from the uid. @@ -412,6 +423,11 @@ class RoomsController < ApplicationController end helper_method :room_limit_exceeded + def valid_moderator_access_code(code) + code == @room.moderator_access_code && !@room.moderator_access_code.blank? && moderator_code_allowed? + end + helper_method :valid_moderator_access_code + def record_meeting # If the require consent setting is checked, then check the room setting, else, set to true if recording_consent_required? diff --git a/app/helpers/admins_helper.rb b/app/helpers/admins_helper.rb index 91f3a2e7..f21f877b 100644 --- a/app/helpers/admins_helper.rb +++ b/app/helpers/admins_helper.rb @@ -89,6 +89,14 @@ module AdminsHelper end end + def moderator_codes_string + if @settings.get_value("Moderator Access Codes") == "true" + I18n.t("administrator.site_settings.moderator_codes.enabled") + else + I18n.t("administrator.site_settings.moderator_codes.disabled") + end + end + def log_level_string case Rails.logger.level when 0 diff --git a/app/models/setting.rb b/app/models/setting.rb index 1ee18192..27cff084 100644 --- a/app/models/setting.rb +++ b/app/models/setting.rb @@ -66,6 +66,8 @@ class Setting < ApplicationRecord Rails.configuration.shared_access_default when "Preupload Presentation" Rails.configuration.preupload_presentation_default + when "Moderator Access Codes" + Rails.configuration.moderator_codes_default when "Room Configuration Mute On Join" room_config_setting("mute-on-join") when "Room Configuration Require Moderator" diff --git a/app/views/admins/components/site_settings/_settings.html.erb b/app/views/admins/components/site_settings/_settings.html.erb index 464d3088..fa4cf6eb 100644 --- a/app/views/admins/components/site_settings/_settings.html.erb +++ b/app/views/admins/components/site_settings/_settings.html.erb @@ -143,6 +143,27 @@ +
+
+
+ + + +
+
+
diff --git a/app/views/rooms/components/_enter_access_code_form.html.erb b/app/views/rooms/components/_enter_access_code_form.html.erb new file mode 100644 index 00000000..4f1beddd --- /dev/null +++ b/app/views/rooms/components/_enter_access_code_form.html.erb @@ -0,0 +1,29 @@ +<% +# BigBlueButton open source conferencing system - http://www.bigbluebutton.org/. +# Copyright (c) 2018 BigBlueButton Inc. and by respective authors (see below). +# This program is free software; you can redistribute it and/or modify it under the +# terms of the GNU Lesser General Public License as published by the Free Software +# Foundation; either version 3.0 of the License, or (at your option) any later +# version. +# +# BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. +# You should have received a copy of the GNU Lesser General Public License along +# with BigBlueButton; if not, see . +%> + +<%= form_for :room, url: login_room_path(@room.uid) do |f| %> +
+ <%= f.text_field :access_code, + required: true, + class: "form-control join-form", + placeholder: access_code_type == 'moderator' ? t("room.enter_the_moderator_access_code") : t("room.enter_the_access_code"), + value: "" , + autofocus: true, + maxlength: 26 %> + + <%= f.button t("room.login"), type: :submit, class: "btn btn-primary btn-sm px-7 form-control join-form" %> + +
+<% end %> diff --git a/app/views/rooms/components/_room_block.html.erb b/app/views/rooms/components/_room_block.html.erb index 4b57db74..d2a9baf2 100644 --- a/app/views/rooms/components/_room_block.html.erb +++ b/app/views/rooms/components/_room_block.html.erb @@ -13,7 +13,7 @@ # with BigBlueButton; if not, see . %> -
+
diff --git a/app/views/rooms/join.html.erb b/app/views/rooms/join.html.erb index cac7a022..f38f9e4d 100644 --- a/app/views/rooms/join.html.erb +++ b/app/views/rooms/join.html.erb @@ -15,23 +15,15 @@ <% content_for(:page_desc) { t("room.invitation_description", name: @room.name) } %> -<% valid_access_code = @room.access_code.nil? || @room.access_code.empty? || @room.access_code == session[:access_code] %> -<%= render 'rooms/components/room_event', render_recordings: valid_access_code do %> +<% access_code_set = @room.access_code.present? %> +<% valid_access_code = access_code_set && @room.access_code == session[:access_code] %> +<% moderator_access_code_set = @room.moderator_access_code.present? && moderator_code_allowed? %> +<% valid_moderator_access_code = valid_moderator_access_code(session[:moderator_access_code]) %> + +<%= render 'rooms/components/room_event', render_recordings: valid_access_code || valid_moderator_access_code do %> <% if room_authentication_required %>

<%= t("administrator.site_settings.authentication.user-info") %>

- <% elsif !valid_access_code %> - <%= form_for :room, url: login_room_path(@room.uid) do |f| %> -
- <%= f.text_field :access_code, - required: true, - class: "form-control join-form", - placeholder: t("room.enter_the_access_code"), - value: "" , - autofocus: true %> - <%= f.submit t("room.login"), class: "btn btn-primary btn-sm col-sm-3 form-control join-form" %> -
- <% end %> - <% else %> + <% elsif valid_moderator_access_code || valid_access_code || !access_code_set %> <%= form_for room_path(@room), method: :post do |f| %>
<%= f.hidden_field(:search, :value => params[:search])%> @@ -59,5 +51,12 @@ <% end %> <% end %> + <% if moderator_access_code_set && !valid_moderator_access_code %> + + + <%= render "rooms/components/enter_access_code_form", access_code_type: 'moderator' %> + <% end %> + <% else %> + <%= render "rooms/components/enter_access_code_form", access_code_type: 'standard_access' %> <% end %> <% end %> diff --git a/app/views/rooms/show.html.erb b/app/views/rooms/show.html.erb index 3feb5219..ab190452 100644 --- a/app/views/rooms/show.html.erb +++ b/app/views/rooms/show.html.erb @@ -1,140 +1,147 @@ -<% -# BigBlueButton open source conferencing system - http://www.bigbluebutton.org/. -# Copyright (c) 2018 BigBlueButton Inc. and by respective authors (see below). -# This program is free software; you can redistribute it and/or modify it under the -# terms of the GNU Lesser General Public License as published by the Free Software -# Foundation; either version 3.0 of the License, or (at your option) any later -# version. -# -# BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY -# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. -# You should have received a copy of the GNU Lesser General Public License along -# with BigBlueButton; if not, see . -%> - -<% exceeds_limit = current_room_exceeds_limit(@room)%> -<% if exceeds_limit%> -
- <%= t("room.room_limit_exceeded", difference: @diff) %> -
-<% end %> -
-
-
-
-
-

<%= title(@room.name) %>

- <% if current_user.main_room == @room %> - - <% else %> - - <% end %> -
-

<%= @room.sessions %> <%= t("room.sessions") %><% unless hide_recording_tables %> | <%= @recordings.length %> <%= t("room.recordings") %><% end %>

- <% unless exceeds_limit %> - -
-
- -
-
-
-
- -
-
- <% if @room.access_code.present? %> - - - <% end %> - <% if Rails.configuration.enable_google_calendar_button %> - - - <%= t("add_to_google_calendar") %> - - <% end %> -
-
-
-
- <% end %> -
-
- <% if @room_running %> - <%= button_to t("room.join"), room_path(@room), class: "btn btn-primary btn-block px-7 start-button float-right", "data-disable": "" %> - <% else %> - <% unless exceeds_limit %> - <%= button_to t("room.start"), start_room_path(@room), class: "btn btn-primary btn-block px-7 start-button float-right", "data-disable": "" %> - <% end %> - <% end %> -
-
- - <% if total_room_count(current_user) > 5 %> - - <% end %> - -
- <% if current_user.role.get_permission("can_create_rooms") %> - <% current_user.ordered_rooms.each do |room| %> -
- <%= link_to room do %> - <%= render "rooms/components/room_block", room: room %> - <% end %> -
- <% end %> - <% end %> - - <% if shared_access_allowed %> - <% current_user.shared_rooms.each do |room| %> -
- <%= link_to room do %> - <%= render "rooms/components/shared_room_block", room: room %> - <% end %> -
- <% end %> - <% end %> - - <% if current_user.role.get_permission("can_create_rooms") && !room_limit_exceeded %> - <%= render "rooms/components/create_room_block"%> - <% end %> -
-
-
- -<% unless hide_recording_tables %> - <%= render "shared/sessions", recordings: @recordings, pagy: @pagy, only_public: false, shared_room: @shared_room, user_recordings: false, title: t("room.recordings")%> -<% end %> - -<%= render "shared/modals/delete_room_modal" %> - -<%= render "shared/modals/create_room_modal" %> - -<% if preupload_allowed? %> - <%= render "shared/modals/preupload_presentation_modal" %> -<% end %> - -<% if shared_access_allowed %> - <%= render "shared/modals/share_room_modal" %> - <%= render "shared/modals/remove_access_modal" %> -<% end %> +<% +# BigBlueButton open source conferencing system - http://www.bigbluebutton.org/. +# Copyright (c) 2018 BigBlueButton Inc. and by respective authors (see below). +# This program is free software; you can redistribute it and/or modify it under the +# terms of the GNU Lesser General Public License as published by the Free Software +# Foundation; either version 3.0 of the License, or (at your option) any later +# version. +# +# BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. +# You should have received a copy of the GNU Lesser General Public License along +# with BigBlueButton; if not, see . +%> + +<% exceeds_limit = current_room_exceeds_limit(@room)%> +<% if exceeds_limit%> +
+ <%= t("room.room_limit_exceeded", difference: @diff) %> +
+<% end %> +
+
+
+
+
+

<%= title(@room.name) %>

+ <% if current_user.main_room == @room %> + + <% else %> + + <% end %> +
+

<%= @room.sessions %> <%= t("room.sessions") %><% unless hide_recording_tables %> | <%= @recordings.length %> <%= t("room.recordings") %><% end %>

+ <% unless exceeds_limit %> + +
+
+ +
+
+
+
+ +
+
+ <% if @room.access_code.present? %> + + + <% end %> + <% if moderator_code_allowed? && @room.moderator_access_code.present? %> + + + <% end %> + <% if Rails.configuration.enable_google_calendar_button %> + + + <%= t("add_to_google_calendar") %> + + <% end %> +
+
+
+
+ <% end %> +
+
+ <% if @room_running %> + <%= button_to t("room.join"), room_path(@room), class: "btn btn-primary btn-block px-7 start-button float-right", "data-disable": "" %> + <% else %> + <% unless exceeds_limit %> + <%= button_to t("room.start"), start_room_path(@room), class: "btn btn-primary btn-block px-7 start-button float-right", "data-disable": "" %> + <% end %> + <% end %> +
+
+ + <% if total_room_count(current_user) > 5 %> + + <% end %> + +
+ <% if current_user.role.get_permission("can_create_rooms") %> + <% current_user.ordered_rooms.each do |room| %> +
+ <%= link_to room do %> + <%= render "rooms/components/room_block", room: room %> + <% end %> +
+ <% end %> + <% end %> + + <% if shared_access_allowed %> + <% current_user.shared_rooms.each do |room| %> +
+ <%= link_to room do %> + <%= render "rooms/components/shared_room_block", room: room %> + <% end %> +
+ <% end %> + <% end %> + + <% if current_user.role.get_permission("can_create_rooms") && !room_limit_exceeded %> + <%= render "rooms/components/create_room_block"%> + <% end %> +
+
+
+ +<% unless hide_recording_tables %> + <%= render "shared/sessions", recordings: @recordings, pagy: @pagy, only_public: false, shared_room: @shared_room, user_recordings: false, title: t("room.recordings")%> +<% end %> + +<%= render "shared/modals/delete_room_modal" %> + +<%= render "shared/modals/create_room_modal" %> + +<% if preupload_allowed? %> + <%= render "shared/modals/preupload_presentation_modal" %> +<% end %> + +<% if shared_access_allowed %> + <%= render "shared/modals/share_room_modal" %> + <%= render "shared/modals/remove_access_modal" %> +<% end %> diff --git a/app/views/shared/modals/_create_room_modal.html.erb b/app/views/shared/modals/_create_room_modal.html.erb index cab6f6b4..e85d9ecb 100644 --- a/app/views/shared/modals/_create_room_modal.html.erb +++ b/app/views/shared/modals/_create_room_modal.html.erb @@ -43,6 +43,19 @@
+ <% if moderator_code_allowed? %> +
+ + + + <%= f.label :moderator_access_code, t("modal.create_room.moderator_access_code_placeholder"), id: "create-room-moderator-access-code", class: "form-control" %> + <%= f.hidden_field :moderator_access_code %> + + + +
+ <% end %> + <% mute = room_configuration("Room Configuration Mute On Join") %> <% if mute != "disabled" %> <% if recording_thumbnails? %> @@ -50,6 +52,8 @@ <% if recording_thumbnails? %> data-room-access-code="<%= room.access_code %>"> + data-room-access-code="<%= room.access_code %>" data-room-moderator-access-code="<%= room.moderator_access_code %>">
- <% sorted_formats = recording[:playbacks].sort_by! { |p| p[:type] } %> - <% sorted_formats.each do |p| %> - <%= link_to t("recording.format.#{p[:type]}"), p[:url], class: "btn btn-sm btn-primary", target: "_blank" %> + <% unless recording[:state] == "unpublished" %> + <% sorted_formats = recording[:playbacks].sort_by! { |p| p[:type] } %> + <% sorted_formats.each do |p| %> + <%= link_to t("recording.format.#{p[:type]}"), p[:url], class: "btn btn-sm btn-primary", target: "_blank" %> + <% end %> <% end %> diff --git a/app/views/shared/components/_recording_row.html.erb b/app/views/shared/components/_recording_row.html.erb index 9efe062a..bd394c66 100644 --- a/app/views/shared/components/_recording_row.html.erb +++ b/app/views/shared/components/_recording_row.html.erb @@ -32,10 +32,12 @@ - <% p = recording[:playbacks].find do |p| p.key?(:preview) end %> - <% if p %> - <% safe_recording_images(p[:preview][:images][:image]).each do |img| %> - <%= image_tag(img[:content].strip, class: "thumbnail px-2") %> + <% if recording[:state] != "unpublished" %> + <% p = recording[:playbacks].find do |p| p.key?(:preview) end %> + <% if p %> + <% safe_recording_images(p[:preview][:images][:image]).each do |img| %> + <%= image_tag(img[:content].strip, class: "thumbnail px-2") %> + <% end %> <% end %> <% end %> - <% sorted_formats = recording[:playbacks].sort_by! { |p| p[:type] } %> - <% sorted_formats.each do |p| %> - <%= link_to t("recording.format.#{p[:type]}"), p[:url], class: "btn btn-sm btn-primary", target: "_blank" %> + <% unless recording[:state] == "unpublished" %> + <% sorted_formats = recording[:playbacks].sort_by! { |p| p[:type] } %> + <% sorted_formats.each do |p| %> + <%= link_to t("recording.format.#{p[:type]}"), p[:url], class: "btn btn-sm btn-primary", target: "_blank" %> + <% end %> <% end %> diff --git a/config/locales/en.yml b/config/locales/en.yml index 4fa9b725..f305cb0e 100755 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -510,6 +510,7 @@ en: visibility: Visibility formats: Formats visibility: + inaccessible: Inaccessible public: Public unlisted: Unlisted format: diff --git a/spec/concerns/bbb_server_spec.rb b/spec/concerns/bbb_server_spec.rb index 6d3f3364..b6cb2375 100644 --- a/spec/concerns/bbb_server_spec.rb +++ b/spec/concerns/bbb_server_spec.rb @@ -82,6 +82,24 @@ describe BbbServer do end context "#recordings" do + it "publishes a recording" do + allow_any_instance_of(BigBlueButton::BigBlueButtonApi).to receive(:publish_recordings).and_return( + returncode: true, published: true + ) + + expect(publish_recording(Faker::IDNumber.valid)) + .to contain_exactly([:returncode, true], [:published, true]) + end + + it "unpublishes a recording" do + allow_any_instance_of(BigBlueButton::BigBlueButtonApi).to receive(:publish_recordings).and_return( + returncode: true, published: false + ) + + expect(unpublish_recording(Faker::IDNumber.valid)) + .to contain_exactly([:returncode, true], [:published, false]) + end + it "deletes the recording" do allow_any_instance_of(BigBlueButton::BigBlueButtonApi).to receive(:delete_recordings).and_return( returncode: true, deleted: true From 506a26ac86888cb56eeb59a336e61adb0e051b77 Mon Sep 17 00:00:00 2001 From: Ahmad Farhat Date: Thu, 3 Jun 2021 17:25:26 -0400 Subject: [PATCH 131/203] Fixed issues with inaccessible recording (#2755) --- app/views/admins/components/_server_recording_row.html.erb | 4 ++-- app/views/shared/components/_recording_row.html.erb | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/app/views/admins/components/_server_recording_row.html.erb b/app/views/admins/components/_server_recording_row.html.erb index 6e2362f3..6041191b 100644 --- a/app/views/admins/components/_server_recording_row.html.erb +++ b/app/views/admins/components/_server_recording_row.html.erb @@ -42,7 +42,7 @@ - <% unless recording[:state] == "unpublished" %> + <% if recording[:published] %> <% sorted_formats = recording[:playbacks].sort_by! { |p| p[:type] } %> <% sorted_formats.each do |p| %> <%= link_to t("recording.format.#{p[:type]}"), p[:url], class: "btn btn-sm btn-primary", target: "_blank" %> diff --git a/app/views/shared/components/_recording_row.html.erb b/app/views/shared/components/_recording_row.html.erb index bd394c66..a6c4cb3c 100644 --- a/app/views/shared/components/_recording_row.html.erb +++ b/app/views/shared/components/_recording_row.html.erb @@ -32,7 +32,7 @@ - <% if recording[:state] != "unpublished" %> + <% if recording[:published] %> <% p = recording[:playbacks].find do |p| p.key?(:preview) end %> <% if p %> <% safe_recording_images(p[:preview][:images][:image]).each do |img| %> @@ -52,7 +52,7 @@ - <% unless recording[:state] == "unpublished" %> + <% if recording[:published] %> <% sorted_formats = recording[:playbacks].sort_by! { |p| p[:type] } %> <% sorted_formats.each do |p| %> <%= link_to t("recording.format.#{p[:type]}"), p[:url], class: "btn btn-sm btn-primary", target: "_blank" %> From 9bdf2d74c72d9405b44aee13e2b4809664691ad4 Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Thu, 3 Jun 2021 17:29:11 -0400 Subject: [PATCH 132/203] Translate /config/locales/en.yml in gl (#2754) translation completed for the source file '/config/locales/en.yml' on the 'gl' language. Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com> --- config/locales/gl.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/config/locales/gl.yml b/config/locales/gl.yml index 30e38371..7120e66b 100644 --- a/config/locales/gl.yml +++ b/config/locales/gl.yml @@ -268,6 +268,7 @@ gl: accepted: ten que ser aceptado confirmation: "%{attribute} non coincide" inclusion: non está incluído na lista + domain: "debe rematar con «%{email_domain}»" no_provider: message: O sitio ao que está tentando acceder non está activo help: Póñase en contacto co administrador do sistema para configurar Greenlight @@ -312,6 +313,7 @@ gl: home_room: Sala principal info_update_success: Actualizouse correctamente a información invalid_credentials: O correo e o contrasinal que introduciu non coinciden cos nosos rexistros. Tenteo de novo ou prema en «Esquecín o contrasinal» para restabelecer o seu contrasinal. + invalid_credentials_external: O correo e o contrasinal que introduciu non coinciden cos nosos rexistros. Tenteo de novo. invalid_login_method: Produciuse un fallo no acceso por mor da non coincidencia da conta. Debe acceder con omniauth. invite_message: "Para convidar a alguén á xuntanza, envíelle esta ligazón:" javascript: @@ -507,6 +509,7 @@ gl: visibility: Visibilidade formats: Formatos visibility: + inaccessible: Inaccesíbel public: Pública unlisted: Sen listar format: From 4dcfc29608bca229a1e2f2b5927ebf08c92e12d3 Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Thu, 3 Jun 2021 17:29:26 -0400 Subject: [PATCH 133/203] Translate /config/locales/en.yml in de_DE (#2752) translation completed for the source file '/config/locales/en.yml' on the 'de_DE' language. Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com> --- config/locales/de_DE.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/config/locales/de_DE.yml b/config/locales/de_DE.yml index 82b6ddf9..168de942 100644 --- a/config/locales/de_DE.yml +++ b/config/locales/de_DE.yml @@ -509,6 +509,7 @@ de_DE: visibility: Sichtbarkeit formats: Formate visibility: + inaccessible: Nicht verfügbar public: Öffentlich unlisted: Nicht gelistet format: From bb9e33d9934c5830b40d4dbbd0405d273c54e9ea Mon Sep 17 00:00:00 2001 From: Ahmad Farhat Date: Thu, 3 Jun 2021 17:48:19 -0400 Subject: [PATCH 134/203] Upgraded i18n mapping gem (#2756) * Upgraded i18n mapping gem * Rubocop --- Gemfile | 2 +- Gemfile.lock | 4 ++-- app/helpers/users_helper.rb | 8 ++++++-- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/Gemfile b/Gemfile index 7bef8d15..10ea0e46 100644 --- a/Gemfile +++ b/Gemfile @@ -19,7 +19,7 @@ gem 'coveralls', '~> 0.8.23', require: false gem 'font-awesome-sass', '~> 5.9.0' gem 'google-cloud-storage', '~> 1.30.0' gem 'http_accept_language', '~> 2.1.1' -gem 'i18n-language-mapping', '~> 0.1.1' +gem 'i18n-language-mapping', '~> 0.1.3.1' gem 'jbuilder', '~> 2.11.2' gem 'jquery-rails', '~> 4.4.0' gem 'jquery-ui-rails', '~> 6.0.1' diff --git a/Gemfile.lock b/Gemfile.lock index a77a0bfb..364ada3b 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -186,7 +186,7 @@ GEM httpclient (2.8.3) i18n (1.8.10) concurrent-ruby (~> 1.0) - i18n-language-mapping (0.1.2) + i18n-language-mapping (0.1.3.1) jbuilder (2.11.2) activesupport (>= 5.0.0) jmespath (1.4.0) @@ -479,7 +479,7 @@ DEPENDENCIES google-cloud-storage (~> 1.30.0) hiredis (~> 0.6.3) http_accept_language (~> 2.1.1) - i18n-language-mapping (~> 0.1.1) + i18n-language-mapping (~> 0.1.3.1) jbuilder (~> 2.11.2) jquery-rails (~> 4.4.0) jquery-ui-rails (~> 6.0.1) diff --git a/app/helpers/users_helper.rb b/app/helpers/users_helper.rb index 7cc01984..30b1640e 100644 --- a/app/helpers/users_helper.rb +++ b/app/helpers/users_helper.rb @@ -44,12 +44,16 @@ module UsersHelper # Returns language selection options for user edit def language_options locales = I18n.available_locales - language_opts = [["<<<< #{t('language_default')} >>>>", "default"]] + languages = [["<<<< #{t('language_default')} >>>>", "default"]] + language_opts = [] + locales.each do |locale| language_mapping = I18n::Language::Mapping.language_mapping_list[locale.to_s.gsub("_", "-")] language_opts.push([language_mapping["nativeName"], locale.to_s]) end - language_opts.sort + language_opts.sort_by!(&:last) + + languages + language_opts end # Returns a list of roles that the user can have From e131972478bc474cd957ca20cec6dbfe8f95697e Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Mon, 7 Jun 2021 18:09:37 -0400 Subject: [PATCH 135/203] Translate /config/locales/en.yml in ar (#2760) translation completed for the source file '/config/locales/en.yml' on the 'ar' language. Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com> --- config/locales/ar.yml | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/config/locales/ar.yml b/config/locales/ar.yml index 0d61d1c2..d6ca02f8 100644 --- a/config/locales/ar.yml +++ b/config/locales/ar.yml @@ -229,7 +229,7 @@ ar: cookies: cookie_info: ملفات تعريف الارتباط تساعدنا على تقديم خدماتنا. باستخدام خدماتنا ، أنت توافق على استخدامنا لملفات تعريف الارتباط. cookie_button: أنا موافق - policy: "لمزيد من المعلومات ، راجع موقعنا سياسة خاصة." + policy: "لمزيد من المعلومات ، راجع موقعنا سياسة خاصة." copied: تم النسخ copy: نسخ date: @@ -268,6 +268,7 @@ ar: accepted: يجب أن تكون مقبولة confirmation: "لا يتطابق مع %{attribute}" inclusion: غير مدرج في القائمة + domain: "يجب أن ينتهي بـ \"%{email_domain}\"" no_provider: message: لم يتم تمكين الموقع الذي تحاول الوصول إليه help: الرجاء الاتصال بمسؤول النظام لإعداد Greenlight @@ -312,6 +313,7 @@ ar: home_room: غرفة الإستقبال info_update_success: تحديث المعلومات بنجاح. invalid_credentials: لم تتطابق رسالة البريد الإلكتروني وكلمة المرور التي أدخلتها مع سجلاتنا. حاول مرة أخرى أو انقر فوق نسيت كلمة المرور لإعادة تعيين كلمة المرور الخاصة بك. + invalid_credentials_external: البريد الإلكتروني وكلمة المرور اللذان أدخلتهما لا يتطابقان مع سجلاتنا. حاول مرة اخرى. invalid_login_method: فشل تسجيل الدخول بسبب عدم تطابق الحساب. تحتاج إلى تسجيل الدخول مع omniauth. invite_message: "لدعوة شخص ما إلى الاجتماع ، أرسل لهم هذا الرابط:" javascript: @@ -407,7 +409,7 @@ ar: delete_account: confirm: هل تريد بالتأكيد حذف هذا الحساب؟ delete: أنا متأكد، قم بحذف هذا الحساب. - keep: في الواقع ، سأحافظ عليه. + keep: في الواقع ، سأحتفظ به. delete_warning: سيؤدي ذلك إلى إلغاء تنشيط حساب المستخدم. يمكن العثور على جميع المستخدمين غير النشطين تحت علامة تبويب المحذوفات. warning: هذا القرار نهائي.لن تكون قادرًا على استعادة البيانات المرتبطة. delete_rec: @@ -507,6 +509,7 @@ ar: visibility: الظهور formats: الصيغة visibility: + inaccessible: يتعذر الوصول إليه public: عامة unlisted: غير مدرج format: @@ -563,7 +566,7 @@ ar: enter_the_moderator_access_code: أدخل رمز مشرف الغرفة! optional_moderator_access_code: "رمز الوسيط الاختياري:" invalid_provider: لقد أدخلت رابطًا غير صالح. يرجى التحقق من عنوان URL والمحاولة مرة أخرى. - invitation_description: "لقد تمت دعوتك للانضمام إلى %{name} باستخدام BigBlueButton. للانضمام ، انقر فوق الارتباط أعلاه وأدخل اسمك." + invitation_description: "لقد تمت دعوتك للانضمام إلى %{name} باستخدام BigBlueButton. \nللانضمام ، انقر فوق الرابط أعلاه وأدخل اسمك." invited: لقد تمت دعوتك للانضمام recording_present: أقر بأنه سيتم تسجيل هذه الجلسة. قد يشمل ذلك صوتي وفيديو إذا تم تمكينه. invite_participants: دعوة المشاركين From 75fd49aa7ee8863949510de8122674943846f470 Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Mon, 7 Jun 2021 18:11:02 -0400 Subject: [PATCH 136/203] Translate /config/locales/en.yml in fa_IR (#2759) translation completed for the source file '/config/locales/en.yml' on the 'fa_IR' language. Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com> --- config/locales/fa_IR.yml | 297 ++++++++++++++++++++------------------- 1 file changed, 150 insertions(+), 147 deletions(-) diff --git a/config/locales/fa_IR.yml b/config/locales/fa_IR.yml index 23cd9977..adb5093b 100644 --- a/config/locales/fa_IR.yml +++ b/config/locales/fa_IR.yml @@ -40,7 +40,7 @@ fa_IR: branding: change: تغییر تصویر info: تغییر تصویر شخصی سازی که در گوشه بالای سمت چپ به نمایش در می آید - placeholder: ادرس تصویر ... + placeholder: آدرس تصویر ... title: تصویر شخصی سازی invalid: نشانی وب نامعتبر است legal: @@ -56,9 +56,9 @@ fa_IR: title: سیاست حریم خصوصی invalid: نشانی وب نامعتبر است cache: - info: کش ارائه دهنده ذخیره شده را حذف می کند تا اجبار به یک درخواست جدید برای اطلاعات به روز رسانی شده کند - title: پاک کردن کش ارائه دهنده - button: پاک کردن کش + info: حافظه نهان ارائه دهنده ذخیره شده را حذف می کند تا اجبار به یک درخواست جدید برای اطلاعات به روز رسانی شده کند + title: پاک کردن حافظه نهان ارائه دهنده + button: پاک کردن حافظه نهان clear_auth: info: احراز هویت کننده کنونی را پاک می کند تا به کاربران مجوز ورود مجدد با روش احراز هویت دیگری را بدهد title: پاک کردن احراز هویت کننده @@ -66,32 +66,32 @@ fa_IR: color: info: تغییر مرتب رنگ هم میزان روشنایی و هم میزان تاریکی را تغییر می دهد. روشنایی و تاریکی به صورت مجزا می توانند تغییرکنند. title: رنگ اصلی - regular: منظم + regular: معمولی lighten: روشن تر - darken: تیره + darken: تیره تر email_mapping: - info: "بر اساس فرمت ایمیل کاربران، نقشی را به آن‌ها بدهید. باید به صورت فرمت email1=role1,email2=role2 باشد" - title: دادن نقش براساس فرمت ایمیل + info: "بر اساس قالب ایمیل کاربران، نقشی را به آن‌ها بدهید. باید در قالب email1=role1,email2=role2 باشد." + title: دادن نقش براساس قالب ایمیل update: log_level: - title: سطح لاگ گیری - information: تغییر سطح لاگ گیری برای همه نصب ها - debug: دیباگ + title: سطح گزارش گیری + information: تغییر سطح گزارش گیری برای همه نصب ها + debug: عیب یابی info: اطلاع رسانی warn: سطح خطای متوسط error: خطا fatal: خطای بحرانی - unknown: نا مشخص + unknown: نامشخص recording_visibility: info: اعمال وضعیت نمایش جلسات ضبط شده جدید title: وضعیت نمایش پبش فرض جلسات ضبط شده - warning: این تنظیم تنها به جلساتی که در حال اجرا نیستند اعمال خواهد شد + warning: این تنظیم تنها بر جلساتی که در حال اجرا نیستند اعمال خواهد شد require_consent: info: این تنظیم، یک تنظیم به تنظم اتاق اضافه می‌کند تا مالک‌های اتاق مشخص کنند کدام یک از اتاق‌ها قابلیت ضبط دارند. کاربرانی که به یک اتاق در حال ضبط اضافه می‌شوند، باید قبل از ورود رضایت بدهند. - title: برای ضبط نیاز به رضایت مالک و اعضا هست + title: برای ضبط نیاز به رضایت مالک و اعضا است maintenance_banner: - info: نمایش یک بنر برای اطلاع دادن کاربران از یک تعمیراز قبل برنامه‌ریزی شده - title: بنر تعمیر + info: نمایش یک آگهی برای اطلاع کاربران از یک تعمیر از قبل برنامه‌ریزی شده + title: آگهی تعمیر display: تنظیم clear: پاک کردن time: "برای نمونه: یک به‌روزرسانی در تاریخ ۲۳ آذر ساعت ۲۳:۰۰ قرار است رخ بدهد. کاربران ممکن است در ورود به سایت دچار اختلال شوند." @@ -99,15 +99,15 @@ fa_IR: info: کاربران می‌توانند برای یک اتاق مشخص، از قبل یک ارائه بارگذاری کنند به عنوان ارئه پیشفرض title: به کاربران اجازه بده تا ارائه‌های خود را از پیش بارگذاری کنند registration: - info: تغییر روشی که کاربران در وب سایت ثبت نام میکنند - title: روش تبت نام + info: تغییر روشی که کاربران در وبگاه ثبت نام می کنند. + title: روش ثبت نام methods: approval: تایید/رد - invite: پیوستن توسط دعوت نامه + invite: عضویت با دعوت نامه open: باز کردن ثبت نام rooms: info: ایجاد محدودیت برای تعداد اتاق هایی که یک کاربر می تواند داشته باشد (شامل اتاق خانه). این تنظیم به مدیران اعمال نخواهد شد. - title: تعداد اتاق ها به ازاء کاربر + title: تعداد اتاق ها به ازای کاربر shared_access: info: تنظیمات غیر فعال سازی، دکمه انتخاب گرینه ها را از اتاق حذف می کند تا کاربران را از به اشتراک گذازی اتاق ها منع کند title: امکان اشتراک گذاری اتاق ها به کاربران عادی @@ -119,8 +119,8 @@ fa_IR: settings: تنظیم‌ها title: تنظیمات سایت flash: - approved: کاربر با موفقیت تایید شد - banned: کاربر با موفقیت منع شد + approved: کاربر با موفقیت تایید شد. + banned: کاربر با موفقیت منع شد. unbanned: کاربر با موفقیت رفع ممنوعیت شد. delete: کاربر با موفقیت حذف شد delete_fail: حذف کاربر با خطا مواجه شد @@ -152,10 +152,10 @@ fa_IR: manage_rooms_recordings: دادن مجوز برای مدیریت اتاق های سرور و رکورد ها به کاربرانی که این نقش را دارند name: نام نقش new_role: ایجاد نقش جدید - role_has_users: "این نقش به حساب های کاربری %{user_count} داده شد. لطفا از حذف همه حساب های کاربری از این نقش، قبل از حذف آن اطمینان حاصل کیند" + role_has_users: "این نقش به حساب های کاربری %{user_count} داده شد. لطفا از حذف همه حساب های کاربری از این نقش، قبل از حذف آن اطمینان حاصل کkdn." title: نقش ها - promote_email: ارسال ایمیل به کاربران زمانیکه این نقش به آنها داده می شود - demote_email: ارسال ایمیل به کاربران، زمانیکه این نقش از آنها گرفته می شود + promote_email: ارسال ایمیل به کاربران زمانی که این نقش به آنها داده می شود + demote_email: ارسال ایمیل به کاربران، زمانی که این نقش از آنها گرفته می شود edit_site_settings: دادن مجوز ویرایش تنظیمات به کاربرانی که این نقش را دارند edit_roles: دادن مجوز ویرایش سایر نقش ها به کاربرانی که این نقش را دارند manage_users: دادن مجوز مدیریت کاربران به کاربرانی که این نقش را دارند @@ -177,10 +177,10 @@ fa_IR: info: به مالک‌های اتاق‌ این قابلیت را می‌دهد تا مشخص کنند آیا گزینه‌ی ضبط اتاق را می‌خواهند یا نه.اگر فعال باشد، ناظم همچنان باید روی دکمه‌ی «ضبط» کلیک کند وقتی جلسه شروع شد. moderator_codes: info: به مالکین اتاق‌های این اجازه داده می‌شود تا به صورت دلخواه یک پین تولید کنند تا بتوانند به بقیه کاربرها این اجازه را بدهند که به صورت مستقیم به عنوان مدیر جلسه وارد شوند. - title: کد دسترسی مدیر جلسه + title: کد دسترسی مدیر options: - disabled: غیرفعال شده - enabled: همیشه فعال شود + disabled: غیر فعال + enabled: همیشه فعال optional: اختیاری rooms: timeout: "به علت وقفه در درخواست خدمتگزار %{server}، ممکن است اطلاعات وضعیت و شرکت کنندگان دقیق نباشد" @@ -188,7 +188,7 @@ fa_IR: table: ended: "به پایان رسید: %{session}" id: شناسه - not_running: در حال اجرا نبودن + not_running: در حال اجرا نیست participants: شركت كنندگان running: در حال اجرا started: "شروع شده: %{session}" @@ -212,8 +212,8 @@ fa_IR: undelete: لغو پاک کردن table: authenticator: احراز کننده هویت - created: ایجاد شده - time: زمان ارسال شده + created: زمان ایجاد + time: زمان ارسال name: نام not_found: کاربری متناسب با جستجوی شما یافت نشد no_users: کاربری یافت نشد @@ -224,16 +224,16 @@ fa_IR: title: مدیریت کاربران add_to_google_calendar: "افزودن تقویم گوگل" bigbluebutton: بیگ بلو باتن - bigbluebutton_exception: اوپس، خطایی در هنگام شروع جلسه رخ داده است! + bigbluebutton_exception: آه، خطایی در هنگام شروع جلسه رخ داده است! cancel: لغو cookies: cookie_info: کوکی ها به ما کمک میکنند تا خدمات خود را ارائه دهیم. با استفاده از این خدمات، شما با استفاده از کوکی های ما موافقت میکنید. cookie_button: موافق هستم policy: "برای اطلاعات بیشتر سیاست حریم خصوصی ما را ببینید." - copied: کپی شد - copy: کپی + copied: رونوشت شد + copy: رونوشت date: - month_names: [~, ژانویه, فوریه, مارچ, اوریل, می, ژوئن, جولای, آگوست, سپتامبر, اکتبر, نوامبر, دسامبر] + month_names: [~, ژانویه, فوریه, مارس, آپریل, می, ژوئن, جولای, آگوست, سپتامبر, اکتبر, نوامبر, دسامبر] default_admin: "شما هنوز از رمز عبور پیش فرض استفاده میکنید. لطفا برای تغییر آن اینجا را کلیک کنید" delete: حذف delivery_error: خطایی در هنگام تحویل ایمیل رخ داده است، لطفا با مدیر تماس بگیرید! @@ -244,33 +244,34 @@ fa_IR: errors: bigbluebutton: help: "لطفا مطمئن شوید که قدم های درست برداشته شده اند. بیشتر بیاموزید" - message: ادرس و رمز نادرست بیگ بلو باتن + message: آدرس و رمز نادرست بیگ بلو باتن title: خطای سرور internal: message: به نظر می رسد چیزی سمت ما به مشکل بر خورده است help: خطا لاگ شده است، ما نگاهی به آن خواهیم انداخت! report: گزارش خرابی maintenance: - message: متاسفانه بابت نگهداشت سیستم در دسترس نیست - help: به زودی بر میگردیم + message: سامانه در دست تعمیر است. + help: به زودی برمی‌گردیم migration_error: contact_admin: اگر شما مدیر نیستید، لطفا با یک مدیر تماس بگیرید. - continue: ما تمایل به ماندن در نسخه 1.0 را دارم. + continue: تمایل به ماندن در نسخه 1.0 را دارم. notice: > - خطایی در انتقال دیتابیس گرین لایت رخ داده است.
این ممکن است به دلیل این باشد که شما به نسخه 2.0 گرین لایت به روز رسانی نکرده اید. + خطایی در انتقال پایگاه داده گرین لایت رخ داده است.
علت می تواند این باشد که شما به نسخه 2.0 گرین لایت به‌روزرسانی نکرده اید. upgrade: به من نشان بده چگونه به نسخه 2.0 به روز رسانی کنم! version: ما یک نسخه جدید از گرین لایت را منتشر کرده ایم، اما پایگاه داده شما با آن سازگاری ندارد. messages: - blank: نمیتواند خالی باشد + blank: نمی‌تواند خالی باشد too_short: بسیار کوتاه است invalid: معتبر نیست taken: از قبل گرفته شده است - accepted: میبایست تایید شود + accepted: می‌بایست تایید شود confirmation: "با %{attribute} تطابق ندارد" inclusion: در لیست قرار داده نشده است + domain: "باید به «%{email_domain}» ختم شود" no_provider: - message: سایتی که شما تلاش به دسترسی به آن را دارید فعال نیست - help: لطفا برای پیکربندی برنامه با مدیر سیستم تماس بگیرید + message: سایتی که می‌خواهید به آن دسترسی داشته باشید فعال نیست + help: لطفا برای پیکربندی برنامه با مدیر سامانه تماس بگیرید not_found: message: متاسفانه، صفحه ای که دنبال آن میگردید وجود ندارد. help: آیا ممکن است حذف شده باشد؟ @@ -279,7 +280,7 @@ fa_IR: message: متاسفانه، این کاربر ثبت نام نکرده است user_missing: help: لطفا لینک ارسال شده را تایید و دوباره تلاش کنید - message: ادرسی که شما وارد کرده اید معتبر نیست + message: آدرسی که شما وارد کرده اید معتبر نیست title: خطاها unauthorized: message: شما امکان دسترسی به این برنامه را ندارید @@ -307,54 +308,55 @@ fa_IR: account_settings: سازمان help: نیاز به کمک دارید؟ home: خانه - settings: پروفایل + settings: نمایه signout: خروج home_room: اتاق خانه - info_update_success: اطلاعات با موفقیت بارگزاری شد - invalid_credentials: ایمیل و رمز عبوری که وارد کرده اید با سیستم ما انطباق ندارد، دوباره تلاش کنید یا روی بازیابی رمز عبور کلیک کنید تا رمز عبورتان را زیست کنید + info_update_success: اطلاعات با موفقیت بارگذاری شد. + invalid_credentials: ایمیل یا رمز عبوری که وارد کرده اید اشتباهند. دوباره تلاش کنید یا روی بازیابی رمز عبور کلیک و رمز عبورتان را عوض کنید. + invalid_credentials_external: ایمیل و کلمه عبوری که وارد کرده‌اید اشتباهند. لطفا بعدا دوباره تلاش کنید. invalid_login_method: ورود به دلیل عدم تطابق حساب کاربری با خطا مواجه شد. شما می بایست توسط مکانیزم omniauth وارد شوید. - invite_message: "برای دعوت کسی به جلسه، این ادرس را برای آنها بفرستید" + invite_message: "برای دعوت دیگران به جلسه، این آدرس را برای آنها بفرستید:" javascript: room: mailer: subject: 'شما را برای مشاهده جلسه ضبط شده دعوت کرده است.' - body: 'برای مشاهده ضبط جلسات، از ادرس زیر استفاده کنید' - autogenerated: 'این ایمیل به صورت خودکار توسط بیگ بلو باتن تولید شده است' - footer: 'بیگ بلو باتن یک برنامه کنفرانس وبی متن باز است، برای اطلاعات بیشتر به بیگ بلو باتن در ادرس https://bigbluebutton.org/ مراجعه کنید.' + body: 'برای مشاهده ضبط جلسات، از آدرس زیر استفاده کنید:' + autogenerated: 'این ایمیل به صورت خودکار توسط بیگ بلو باتن تولید شده است.' + footer: 'بیگ بلو باتن یک برنامه نشست وبی متن باز است، برای اطلاعات بیشتر به بیگ بلو باتن به آدرس https://bigbluebutton.org مراجعه کنید.' search: - start: در حال جستجو... + start: آغاز جستجو ... landing: - about: "%{href} یک واسط کاربری ساده برای استفاده از سرور کنفرانس وبی متن باز بیگ بلو باتن است. شما می توانید اتاق هایی برای میزبانی جلسات خود یا پیوستن به جلسات دیگران از طریق ادرس آنها، ایجاد کنید." - welcome: به بیگ بلو باتن خوش آمدید - video: ویدئوی آموزشی ما را در مورد استفاده از گرین لایت مشاهده کنید + about: "%{href} یک واسط کاربری ساده برای استفاده از برنامه نشست وبی متن باز بیگ بلو باتن است. شما می توانید اتاق هایی برای میزبانی جلسات ایجاد کنید یا با یک پیوند کوتاه به جلسات دیگر بپیوندید." + welcome: به بیگ بلو باتن خوش آمدید. + video: ویدیوی آموزشی ما را در مورد استفاده از گرین لایت مشاهده کنید upgrade: به من نشان بده چگونه به نسخه 2.0 به روز رسانی کنم! version: ما یک نسخه جدید از گرین لایت را منتشر کرده ایم، اما پایگاه داده شما با آن سازگاری ندارد. language_default: پیشفرض (زبان مرورگر) ldap_error: امکان دسترسی به سرور LDAP وجود ندارد. لطفا تنظیمات LDAP خود را در فایل env بررسی کرده و مطمئن شوید سرور در حال اجرا است. login: ورود - login_title: به حساب کاربری تان وارد شوید + login_title: به حساب خود وارد شوید mailer: user: approve: info: حساب کاربری شما تایید شده است. - signin: برای دسترسی به اتاق های شخصی خود، روی دگمه زیر کلیک کرده و وارد شوید. + signin: برای دسترسی به اتاق های شخصی خود، روی دکمه زیر کلیک کرده و وارد شوید. signin_link: ورود signup: - info: یک کاربر جدید در گرین لایت ثبت نامه کرده است + info: یک کاربر جدید در گرین لایت ثبت نام کرده است. more-info: برای داشتن مجوز دسترسی برای این کاربر به گرین لایت، شما می بایست حساب کاربری آن ها را در تنظیمات سازمان تایید کنید. admins_link: مشاهده صفحه سازمان subject: ثبت نام کاربر جدید گرین لایت - username: "کاربر با نام %{name} و ادرس ایمیل %{email} ثبت نام کرده است." + username: "کاربر با نام %{name} و آدرس ایمیل %{email} ثبت نام کرده است." subject: حساب کاربری تایید شد username: "نام کاربری شما %{email} است." demoted: - info: "شما دیگر یک %{role} برای %{url} نیستید" + info: "شما دیگر یک %{role} برای %{url} نیستید." more-info: شما در حال حاضر مجوزات یک کاربر عادی را دارید root_link: ورود subtitle: "مجوزات %{role} گرفته شد" invite: info: "شما به فضای شخصی خود توسط %{name} دعوت شده اید" - signup_info: برای ثبت نام از طریق ادرس ایمیلتان، روی دکمه زیر کلیک کرده و مراحل را انجام دهید. + signup_info: برای ثبت نام از طریق آدرس ایمیلتان، روی دکمه زیر کلیک کرده و مراحل را انجام دهید. signup_link: ثبت نام valid: "این دعوت تا %{date} معتبر خواهد بود." signup: @@ -367,31 +369,31 @@ fa_IR: password_reset: title: 'بازنشانی رمز عبور' welcome: "درخواست تغییر رمز عبور برای ایمیل %{email} داده شده است" - message: 'اگر شما درخواست تغیر رمز عبور داده اید، پس لطفا روی لینک زیر برای تغییر رمز عبور کلیک کنید' + message: 'اگر شما درخواست تغییر رمز عبور داده اید، پس لطفا روی پیوند زیر برای تغییر رمز عبور کلیک کنید:' reset_link: رمز عبور را بازنشانی کن - expire: این ادرس در دو ساعت آینده خاتمه خواهد یافت. - ignore: اگر شما این درخواست را نداده اید، می توانید این ایمیل را نادیده بگیرید + expire: این آدرس در دو ساعت آینده منقضی خواهد شد. + ignore: اگر شما این درخواست را نداده اید، می توانید این ایمیل را نادیده بگیرید. promoted: admins_link: مشاهده صفحه شرکت - info: "شما الان %{role} برای %{url} هستید" + info: "شما الان %{role} برای %{url} هستید." more-info: "برای مشاهده توانایی هایتان لطفا %{url} را مشاهده کنید" subtitle: "دسترسی های %{role} داده شد" verify_email: welcome: "%{name}! به فضای شخصی خود خوش آمده اید." success: "با استفاده از %{bigbluebutton}، شما میتوانید اتاق های شخصی برای میزبابی جلسات و همکاری با دیگران برای خود ایجاد کنید." username: "نام کاربری شما %{email} است." - verify: برای تایید حساب کاربری خود، تنها کافی است روی دگمه زیر کلیک کنید. + verify: برای تایید حساب کاربری خود، تنها کافی است روی دکمه زیر کلیک کنید. verify_text: 'برای تایید حساب کاربری خود، تنها کافی است از زیر استفاده کنید: %{url}' verify_link: حساب کاربری را تایید کنید thanks: با تشکر از پیوستن شما و روز خوبی داشته باشید! - max_concurrent: به سقف مجاز تعداد بیشینه جلسات همزمان رسیده اید! + max_concurrent: به سقف بیشینه تعداد جلسات همزمان رسیده اید! merged: ادغام شده modal: create_role: create: ایجاد یک نقش جدید footer_text: شما می توانید مجوزات این نقش را بعد از ایجاد ویرایش کنید name_placeholder: وارد کردن نام یک نقش - not_blank: نام نقش نمیتواند خالی باشد + not_blank: نام نقش نمی‌تواند خالی باشد title: ایجاد یک نقش جدید create_room: access_code: کد دسترسی @@ -400,64 +402,64 @@ fa_IR: moderator_access_code_placeholder: ایجاد کد اختیاری برای مدیران جلسه auto_join: به صورت خودکار من را وارد جلسه کن create: ایجاد اتاق - free_delete: شما به صورت دلخواه مجاز به حذف این اتاق در هر زمانی هستید. - name_placeholder: نام یک اتاق را وارد کنید... + free_delete: می توانید هر موقع این اتاق را حذف کنید. + name_placeholder: نام یک اتاق را وارد کنید ... not_blank: نام اتاق نمی تواند خالی باشد. title: ایجاد اتاق جدید delete_account: confirm: آیا مطمئنید که می خواهید این حساب کاربری را حذف کنید؟ delete: من مطمئنم، این حساب کاربری را حذف کن. - keep: در واقع، ترجیح میدم نگهش دارم. - delete_warning: این حساب کاربری را غیرفعال می کند. لیست تمام کاربرات غیر فعال را می توانید در تب حذف شده ها مشاهده کنید - warning: این تصمیم نهایی است. شما امکان بازیابی داده های مرتبط را نخواهید داشت + keep: در واقع، ترجیح می‌دهم آن را نگه دارم. + delete_warning: این حساب کاربری را غیرفعال خواهد کرد. لیست تمام کاربران غیر فعال را می توانید در سربرگ حذف شده ها مشاهده کنید. + warning: این تصمیم نهایی است. شما امکان بازیابی داده های مرتبط را نخواهید داشت . delete_rec: - delete: بلی اطمینان دارم، این جلسه‌ی ضبط شده را حذف کن. + delete: بلی اطمینان دارم، این جلسه ضبط شده را حذف کن. header: آیا از حذف این جلسه‌ی ضبط شده اطمینان دارید؟ - warning: نخواهید توانست این ضبط را بازیابی کنید + warning: امکان بازیابی این ضبط وجود نخواهد داشت delete_room: confirm: "آیا شما مطمئنید که می خواهید اتاق %{room} را حذف کنید؟" delete: من مطمئنم، این اتاق را حذف کن. - keep: با فکر کردن مجدد، من نگهش میدارم. + keep: نظرم عوض شد، آن را نگه می دارم. warning: شما قادر به بازیابی جلسه نخواهید بود recording_warning: "یا هر کدام از %{recordings_num} جلسات مربوطه" invite_user: email_placeholder: ایمیل کاربران را وارد کنید (توسط کاما از هم جدا شده) - footer: کاربر ایمیلی شامل دستورالعمل چگونگی ثبت نام را دریافت خواهد کرد + footer: کاربر، ایمیلی شامل دستورالعمل چگونگی ثبت نام را دریافت خواهد کرد send: ارسال دعوت نامه title: دعوت کاربر login: or: یا with: "ورود با %{provider}" - forgot_password: رمز عبور خود را فراموش کرده اید؟ + forgot_password: رمز عبور خود را فراموش کرده‌اید؟ preupload: change: تعویض ارائه - choose: یک فایل انتخاب کنید... + choose: یک پرونده انتخاب کنید... current: "ارائه فعلی:" - footer: با توجه به سایز ارائه ممکن است زمان بیشتری برای بارگذاری صرف شود تا قابل استفاده شود. - invalid: سایز یا نوع فایل اشتباه است. لطفا محدودیت‌های زیر را مشاهده کنید. + footer: با توجه به حجم ارائه ممکن است زمان بیشتری برای بارگذاری صرف شود تا قابل استفاده شود. + invalid: حجم یا نوع فایل اشتباه است. لطفا محدودیت‌های زیر را ببینید. title: اضافه کردن ارائه use: از ارائه استفاده بکن rename_recording: remove_shared: title: آیا مطمئنید که می خواهید این اتاق را از لیست اتاق هایتان حذف کنید؟ - delete: من مطمئنم، این اتاق را حذف کن + delete: من مطمئنم، این اتاق را حذف کن. warning: شما دیگر امکان دسترسی به این اتاق را نخواهید داشت room_settings: title: تنظیمات اتاق - update: به روز رسانی اتاق - client: انتخاب نوع کلاینت - join_moderator: تمام کاربران به عنوان مدیر وارد می شوند - mute: کاربران هنگام ورود به صورت بی صدا وارد شدند - require_approval: نیازمند موافقت مدیر قبل از ورود می باشد + update: به‌روزرسانی اتاق + client: انتخاب نوع مشتری + join_moderator: تمام کاربران به عنوان مدیر وارد شوند + mute: کاربران هنگام پیوستن به صورت بی‌صدا وارد شوند + require_approval: نیازمند موافقت مدیر قبل از پیوستن است start: هر کاربری اجازه شروع این جلسه را دارد - footer_text: تنظیمات مربوط به اتاق شما در هر زمانی قابل انجام خواهد بود. + footer_text: تنظیمات اتاق شما در هر زمانی قابل انجام است. recording: اجازه می‌دهم اتاق ضبط شود rename_room: name_placeholder: وارد کردن نام اتاق جدید... share_access: - footer: اشتراک گذاری یک اتاق با یک کاربر به آن اجازه می دهد تا جلسه را شروع کرده و رکورد های اتاق را مشاهده کند. - list: اشتراک گذاری شده با - title: اشتراک دسترسی های اتاق + footer: اشتراک اتاق با یک کاربر به او اجازه می دهد تا جلسه را شروع و ضبط های آن را مشاهده کند. + list: اشتراک‌گذاری شده با + title: اشتراک دسترسی‌های اتاق save: ذخیره تغییرات cancel_changes: لغو تغییرات select: انتخاب کاربر @@ -469,9 +471,9 @@ fa_IR: save: ادغام footer: اتاق های حساب کاری که با آن ادغام می شود، به حساب کاربری حساب اولیه منتقل شده و سپس حساب کاربری حذف می شود. name_update_success: نام اتاق با موفقیت تغییر یافت! - no_user_email_exists: کاربری با ایمیل مشخص شده وجود ندارد. لطفا مطمئن شوید آن را درست تایپ کرده اید. + no_user_email_exists: کاربری با ایمیل مشخص شده وجود ندارد. لطفا مطمئن شوید آن را درست نوشته اید. omniauth_error: خطایی در هنگام احراز هویت با مکانیزم omniauth به وجود آمده است. لطفا دوباره تلاش کنید یا با مدیر تماس بگیرید! - omniauth_specific_error: "خطای %{error} هنگام احراز هویت با omniauth رخ داده است، لطفا دوباره تلاش کنید تا با مدیر سیستم تماس بگیرید" + omniauth_specific_error: "خطای %{error} هنگام احراز هویت با omniauth رخ داده است، لطفا دوباره تلاش کنید تا با مدیر سامانه تماس بگیرید!" pagy: nav: prev: "‹ قبلی" @@ -483,77 +485,78 @@ fa_IR: password_different_notice: تاییدیه رمز عبور با رمز ارائه شده مطابقت ندارد. provider: google: گوگل - office365: افیس 365 + office365: آفیس ۳۶۵ twitter: توییتر ldap: LDAP - openid_connect: کد OpenID + openid_connect: OpenID Connect recaptcha: errors: - recaptcha_unreachable: اوپس، ما در دریافت پاسخ احراز هویت از reCAPTCHA به مشکل بر خوردیم. لطفا دوباره تلاش کنید. + recaptcha_unreachable: آه، ما در دریافت پاسخ احراز هویت از reCAPTCHA به مشکل برخوردیم. لطفا دوباره تلاش کنید. verification_failed: احراز هویت reCAPTCHA به مشکل برخورده است، لطفا دوباره تلاش کنید. recording: all_recordings: تمام جلسات ضبط شده - email: ارسال جلسات ضبط شده توسط ایمیل - error: "خطایی در هنگام بازیابی لیست رکورد(های) %{count} به وجود امده است" - no_recordings: "این اتاق مورد ضبط شده ای %{inject} ندارد." - no_user_recordings: شما در حال حاظر هیچ جلسه ی ضبط شده ای ندارید. - no_matched_recordings: "هیج %{inject} مورد ضبط شده ای مطابق با جستجوی شما یافت نشد." + email: ایمیل کردن ضبط + error: "خطایی در هنگام بازیابی ضبط(های) %{count} رخ داده است" + no_recordings: "این اتاق هیچ ضبط%{inject} ندارد." + no_user_recordings: شما فعلا هیچ ضبطی ندارید. + no_matched_recordings: "هیج %{inject} ضبطی مطابق با جستجوی شما یافت نشد." recorded_on: "ضبط شده در %{date}" table: name: نام - thumbnails: تصاویر کوچک + thumbnails: بندانگشتی‌ها length: طول users: کاربران - visibility: حالت نمایش + visibility: قابلیت دید formats: قالب ها visibility: + inaccessible: عدم دسترسی public: عمومی - unlisted: لیست نشده + unlisted: فهرست نشده format: - notes: یادداشت ها - podcast: پادکست - presentation: ارائه - statistics: امار - video: ویدئو + notes: یادداشت‌ها + podcast: پادپخش + presentation: ارایه + statistics: آمار + video: ویدیو registration: approval: fail: حساب کاربری شما هنوز تایید نشده است. اگر چند روز از ثبت نام شما گذشته است، لطفا با مدیر خود تماس بگیرید. signup: حساب کاربری شما با موفقیت ایجاد شد و برای تایید به مدیر ارسال شد. banned: - fail: شما دسترسی به این برنامه ندارید. اگر فکر میکنید این اشتباه است، لطفا با مدیر سیستم خود تماس بگیرید + fail: شما دسترسی به این برنامه ندارید. اگر فکر می‌کنید این اشتباه است، لطفا با مدیر سامانه تماس بگیرید. deprecated: new_signin: یک روش ورود جدید برای حساب کاربری خود انتخاب کنید. تمام اتاق ها از حساب کاربری قدیمی به حساب جدید منتقل خواهند شد. - twitter_signin: "لاگین توسط حساب کاربری توییتر قدیمی شده است و دیگر در نسخه بعدی غیر فعال خواهد شد. اینحا را کلیک کنید تا حساب کاربری خود را به یک روش احراز هویت جدید منتقل کنید" - twitter_signup: ثبت نام توسط توییتر قدیمی شده است، لطفا روش ثبت نام دیگری انتخاب کنید - merge_success: حساب کاربری توییتر شما با موفقیت به حساب کاربری جدید شما منتقل شد. حساب کاربری قدیمی توییتتر شما حذف شد + twitter_signin: "ورود با حساب کاربری توییتر دور انداخته شده است و در نسخه های بعدی حذف خواهد شد. اینحا کلیک کنید تا حساب کاربری خود را به یک روش احراز هویت جدید منتقل کنید" + twitter_signup: ثبت نام توسط توییتر دور انداخته شده است، لطفا روش ثبت نام دیگری انتخاب کنید + merge_success: حساب کاربری توییتر شما با موفقیت به حساب کاربری جدید شما منتقل شد. حساب کاربری قدیمی توییتر شما حذف شد invite: - fail: توکن شما به اتمام رسیده یا اشتباه است. اگر فک میکنید این اشتباه است، لطفا با مدیر سیستم خود تماس بگیرید + fail: بلیط شما منقضی شده یا اشتباه است. اگر فکر می‌کنید مشکلی هست، لطفا با مدیر سامانه تماس بگیرید. no_invite: شما دعوت نامه ای برای ورود ندارید، لطفا برای دریافت آن با مدیر تماس بگیرید. remove: حذف rename: تغییر نام reset_password: captcha: احراز هویت reCAPTCHA به مشکل برخورده است، لطفا دوباره تلاش کنید. - invalid_token: توکن تنظیم مجدد رمزعبور نامعتبر است. لطفا دوباره رمزعبور را دوباره تنظیم کنید. + invalid_token: بلیط تنظیم مجدد رمز عبور نامعتبر است. لطفا دوباره رمز عبور را تنظیم کنید. subtitle: بازنشانی رمز عبور password: رمز عبور جدید confirm: تایید رمز عبور جدید - update: به روز رسانی رمز عبور - auth_change: روش احراز هویت تغییر کرده است. لطفا ایمیل خود را برای ست کردن رمز عبور بررسی کنید + update: به‌روزرسانی رمز عبور + auth_change: روش احراز هویت تغییر کرده است. لطفا ایمیل خود را برای تنظیم رمز عبور بررسی کنید. roles: active: فعال admin: مدیر banned: منع شده - deleted: حذف شد + deleted: حذف شده pending: در انتظار تایید invited: دعوت شده user: کاربر room: - access_code_required: لطفا کد دسترسی معتبر برای ورود به جلسه را وارد کنید - add_presentation: اضافه کردن ارائه - copy_access: کپی کد دسترسی + access_code_required: لطفا یک کد دسترسی برای ورود به جلسه وارد کنید + add_presentation: اضافه کردن ارایه + copy_access: رونوشت کد دسترسی copy_moderator_access: رونوشت کد مدیر create_room: ایجاد یک اتاق - create_room_error: خطایی در هنگام ایجاد اتاق به وجود آمده است + create_room_error: خطایی در هنگام ایجاد اتاق رخ داده است create_room_success: اتاق با موفقیت ایجاد شد delete: home_room: امکان حذف اتاق خانه کاربر وجود ندارد @@ -561,11 +564,11 @@ fa_IR: fail: "خطا در حذف اتاق (%{error})" enter_the_access_code: کد دسترسی به اتاق را وارد کنید enter_the_moderator_access_code: کد مدیر اتاق را وارد کنید! - optional_moderator_access_code: "کد اختیاری مدیر:" - invalid_provider: شما ادرس نامعتبری را وارد کرده اید، لطفا ادرس را بررسی کرده و دوباره تلاش کنید - invitation_description: "با استفاده از بیگ بلو باتن از شما دعوت شده است تا به %{name} بپیوندید. برای پیوستن، لینک زیر را کلیک کنید و نام خود را درج کنید." - invited: شما برای ملحق شدن دعوت شده اید - recording_present: من متوجه هستم که این جلسه قرار است ضبظ شود. این موضوع شامل صدا و تصویر من در صورت فعال بودن می‌باشد. + optional_moderator_access_code: "کد مدیر (اختیاری):" + invalid_provider: شما آدرس نامعتبری را وارد کرده اید، لطفا آدرس را بررسی و دوباره تلاش کنید. + invitation_description: "با استفاده از بیگ بلو باتن از شما دعوت شده است تا به %{name} بپیوندید. برای پیوستن، پیوند زیر را کلیک کنید و نام خود را درج کنید." + invited: شما برای پیوستن دعوت شده اید + recording_present: من متوجه هستم که این جلسه قرار است ضبط شود. این موضوع شامل صدا و تصویر من در صورت فعال بودن است. invite_participants: دعوت شرکت کنندگان join: پیوستن last_session: "آخرین جلسه در %{session}" @@ -573,13 +576,13 @@ fa_IR: owner: مالک owner_banned: این اتاق درحال حاضر در دسترس نیست no_room: - description: لطفا ادرس یا شناسه اتاقی که می خواهید وارد آن شوید را وارد کنید - edit_profile: ویرایش پروفایل کاربری + description: لطفا آدرس یا شناسه اتاقی که می خواهید وارد آن شوید را وارد کنید + edit_profile: ویرایش نمایه کاربری go_to: رفتن به اتاق - invalid_room_uid: شناسه/ادرسی که وارد کردید نامعتبر است - placeholder: ادرس/شناسه اتاق + invalid_room_uid: شناسه/آدرسی که وارد کردید نامعتبر است. + placeholder: آدرس/شناسه اتاق no_recent_rooms: شما اخیرا وارد جلسه ای نشده اید - recent_rooms: رفتن به اتاقی که اخیرا وارد شده اید + recent_rooms: رفتن به اتاقی که اخیرا وارد آن شده اید title: وارد شدن به جلسه no_sessions: این اتاق هنوز جلسه ای ندارد! preupload_success: ارئه با موفقیت اضافه شد @@ -587,39 +590,39 @@ fa_IR: preupload_remove_success: ارائه با موفقیت پاک شد preupload_remove_error: مشکلی در پاک کردن ارائه رخ داده است recordings: موارد ضبط شده اتاق - room_limit: شما به تعداد ماکسیمم اتاق های مجاز رسیدید. - room_limit_exceeded: "شما به ماکسیمم تعداد اتاق های مجاز رسیده اید، لطفا %{difference} اتاق (ها) حذف کنید تا به این اتاق وارید شوید." + room_limit: شما به بیشینه تعداد اتاق های مجاز رسیدید. + room_limit_exceeded: "شما به بیشینه تعداد اتاق های مجاز رسیده اید، لطفا %{difference} اتاق (ها) حذف کنید تا به این اتاق وارید شوید." sessions: جلسات settings: تنظیمات اتاق share: مدیریت دسترسی ها - shared_by: "اشتراک گذاری شده بوسیله %{email}" + shared_by: "اشتراک گذاری شده با %{email}" remove_shared_access_success: اتاق اشتراکی از لیست اتاق های شما با موفقیت حذف شد remove_shared_access_error: خطایی در حذف اتاق اشتراکی از لیست شما رخ داده است shared_access_success: اتاق با موفقیت به اشتراک گذاشته شد shared_access_error: خطایی در اشتراک اتاق رخ داد start: آغاز - search: جستوجو اتاق... + search: جستجو برای اتاق... unavailable: این اتاق به دلیل اینکه ایمیل صاحب آن هنوز تایید نشده است در دسترس نیست. update_settings_error: خطایی در به روز رسانی تنظیمات اتاق رخ داده است update_settings_success: اطلاعات اتاق با موفقیت به روز رسانی شد wait: message: این جلسه هنوز شروع نشده است - auto: شما هنگامی که جلسه شروع شود، به صورت خودکار به جلسه ملحق خواهید شد. + auto: هنگامی که جلسه شروع شود، به صورت خودکار به جلسه ملحق خواهید شد. settings: account: - fullname: نام کامل + fullname: نام و نام خانوادگی language: زبان - provider: ارائه کننده + provider: ارایه کننده image: تصویر - image_url: آدرس تصویر پروفایل + image_url: آدرس تصویر نمایه roles: نقش کاربر - subtitle: به روز رسانی اطلاعات حساب کاربری + subtitle: به‌روزرسانی اطلاعات حساب کاربری title: اطلاعات حساب کاربری reset_password: بازنشانی رمز عبور کاربر delete: button: بله، من مایل به حذف حساب کاربری خود هستم. - disclaimer: اگر شما انتخاب کنید که می خواهید حساب کاربری خود را پاک کنید، دیگر امکان بازگشت وجود نخواهد داشت . تمام اطلاعات شامل حساب کاربری شما، تنظیمات مربوطه، اتاق ها و جلسات ضبط شده حذف خواهند شد. - subtitle: حذف کامل حساب کاربری تان + disclaimer: اگر حساب کاربری خود را پاک کنید، امکان بازیابی اطلاعات وجود نخواهد داشت. تمام اطلاعات حساب شما، شامل تنظیمات، اتاق ها و جلسات ضبط شده حذف خواهند شد. + subtitle: حذف کامل حساب شما title: حذف حساب کاربری password: confirmation: تاییدیه رمز عبور @@ -627,7 +630,7 @@ fa_IR: old: رمز عبور قدیمی subtitle: تغییر رمز عبور شما title: رمز عبور - title: پروفایل + title: نمایه search: جستجو signup: password_confirm: تایید رمز عبور @@ -639,13 +642,13 @@ fa_IR: accept_existing: من شرایط و قوانین را می پذیرم title: شرایط و قوانین test_install: > - این پیاده سازی از سرور تستی پیش فرض استفاده میکند، شما می بایست آن را با تنظیمات خود جایگزین کنید. برای جزئیات %{href} را مشاهده کنید. + این پیاده سازی از سرور آزمایشی پیش‌فرض استفاده می‌کند، شما می بایست آن را با تنظیمات خود جایگزین کنید. برای جزئیات %{href} را مشاهده کنید. update: به‌روزرسانی verify: accept: تاییدیه activated: حساب کاربری تایید شد! already_verified: حساب کاربری قبلا تایید شده است - invalid: ادرس تاییدیه غیر معتبر + invalid: آدرس تاییدیه غیر معتبر not_verified: حساب کاربری شما هنوز تایید نشده است. resend: ارسال مجدد ایمیل تاییدیه signin: لطفا به منظور دسترسی به حساب کاربری خود وارد شوید. From b61df09b943b09ff79d37655968aa3f64c84422c Mon Sep 17 00:00:00 2001 From: Henning Date: Tue, 8 Jun 2021 00:32:18 +0200 Subject: [PATCH 137/203] Internationalize date format (#2685) * Changed view_date helper to use datetime format from i18n * Removed German translation for date format, should be added via transifex Co-authored-by: Henning Schumann Co-authored-by: Ahmad Farhat --- app/helpers/application_helper.rb | 2 +- config/locales/en.yml | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index 238cddf3..b0f8625d 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -135,6 +135,6 @@ module ApplicationHelper # Returns a more friendly/readable date time object def view_date(date) return "" if date.nil? # Handle invalid dates - local_time(date, "%b %d, %Y %-I:%M%P") + local_time(date, :default) end end diff --git a/config/locales/en.yml b/config/locales/en.yml index f305cb0e..b6fb72af 100755 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -645,6 +645,9 @@ en: test_install: > This deployment is using a pre-configured testing server, you should replace this with your own. For details, see the %{href}. + time: + formats: + default: "%b %d, %Y %-I:%M%P" update: Update verify: accept: Verify From 184ffdb288ec20887bc9fc1697bfc66ed5a3390b Mon Sep 17 00:00:00 2001 From: Dennis1993 Date: Tue, 8 Jun 2021 01:13:00 +0200 Subject: [PATCH 138/203] Add autofocus and required attributes (#2703) * Set required attribute to input fields It is needed to type in a username and password. This attribute force it and reduce useless requests to the server and shows the user the problem directly. * Update signin.html.erb * add autofocus and required attributes * add autofocus and required attributes Co-authored-by: Ahmad Farhat --- app/views/sessions/ldap_signin.html.erb | 4 ++-- app/views/sessions/new.html.erb | 8 ++++---- app/views/sessions/signin.html.erb | 4 ++-- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/app/views/sessions/ldap_signin.html.erb b/app/views/sessions/ldap_signin.html.erb index 799aa306..df9e5bbb 100644 --- a/app/views/sessions/ldap_signin.html.erb +++ b/app/views/sessions/ldap_signin.html.erb @@ -12,7 +12,7 @@ - <%= f.text_field :username, class: "form-control", placeholder: t("administrator.users.table.username"), value: "", autocomplete: "username", autocapitalize: "none", spellcheck: "false", autofocus: "" %> + <%= f.text_field :username, class: "form-control", placeholder: t("administrator.users.table.username"), value: "", autocomplete: "username", autocapitalize: "none", spellcheck: "false", autofocus: "", required: "" %>
@@ -20,7 +20,7 @@ - <%= f.password_field :password, class: "form-control", placeholder: t("password"), value: "" %> + <%= f.password_field :password, class: "form-control", placeholder: t("password"), value: "", required: "" %>
diff --git a/app/views/sessions/new.html.erb b/app/views/sessions/new.html.erb index 3cea851f..189f796b 100644 --- a/app/views/sessions/new.html.erb +++ b/app/views/sessions/new.html.erb @@ -41,22 +41,22 @@ <%= form_for @user, url: create_user_path, method: :post do |f| %>
<%= f.label :name, t("settings.account.fullname"), class: "form-label" %> - <%= f.text_field :name, class: "form-control #{form_is_invalid?(@user, :name)}", placeholder: t("settings.account.fullname") %> + <%= f.text_field :name, class: "form-control #{form_is_invalid?(@user, :name)}", placeholder: t("settings.account.fullname"), autofocus: "", required: "" %>
<%= @user.errors.full_messages_for(:name).first %>
<%= f.label :email, t("email"), class: "form-label" %> - <%= f.email_field :email, class: "form-control #{form_is_invalid?(@user, :email)}", placeholder: t("email") %> + <%= f.email_field :email, class: "form-control #{form_is_invalid?(@user, :email)}", placeholder: t("email"), required: "" %>
<%= @user.errors.full_messages_for(:email).first %>
<%= f.label :password, t("password"), class: "form-label" %> - <%= f.password_field :password, class: "form-control #{form_is_invalid?(@user, :password)}", placeholder: t("password") %> + <%= f.password_field :password, class: "form-control #{form_is_invalid?(@user, :password)}", placeholder: t("password"), required: "" %>
<%= @user.errors.full_messages_for(:password).first %>
<%= f.label :password_confirmation, t("signup.password_confirm"), class: "form-label" %> - <%= f.password_field :password_confirmation, class: "form-control #{form_is_invalid?(@user, :password_confirmation)}", placeholder: t("signup.password_confirm") %> + <%= f.password_field :password_confirmation, class: "form-control #{form_is_invalid?(@user, :password_confirmation)}", placeholder: t("signup.password_confirm"), required: "" %>
<%= @user.errors.full_messages_for(:password_confirmation).first %>
<% if Rails.configuration.terms %> diff --git a/app/views/sessions/signin.html.erb b/app/views/sessions/signin.html.erb index cb089911..364bdbae 100644 --- a/app/views/sessions/signin.html.erb +++ b/app/views/sessions/signin.html.erb @@ -44,7 +44,7 @@ - <%= f.email_field :email, class: "form-control", placeholder: t("email"), value: "" %> + <%= f.email_field :email, class: "form-control", placeholder: t("email"), value: "", autofocus: "", required: "" %>
@@ -52,7 +52,7 @@ - <%= f.password_field :password, class: "form-control", placeholder: t("password"), value: "" %> + <%= f.password_field :password, class: "form-control", placeholder: t("password"), value: "", required: "" %>
<% if Rails.configuration.enable_email_verification %> From 5ba763a2166f59494d7da36c9bffaa521c726d20 Mon Sep 17 00:00:00 2001 From: Ahmad Farhat Date: Tue, 8 Jun 2021 22:56:07 -0400 Subject: [PATCH 139/203] Moderator access code now being shown in the admin room settings (#2774) --- app/views/admins/components/_server_room_row.html.erb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/admins/components/_server_room_row.html.erb b/app/views/admins/components/_server_room_row.html.erb index 3c30d6cc..83e575b2 100644 --- a/app/views/admins/components/_server_room_row.html.erb +++ b/app/views/admins/components/_server_room_row.html.erb @@ -13,7 +13,7 @@ # with BigBlueButton; if not, see . %> -
<% if room.id == room.owner.room_id %> From d9ba15333c9496825fe47f589feb4b7570e00793 Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Tue, 8 Jun 2021 22:57:33 -0400 Subject: [PATCH 140/203] Translate /config/locales/en.yml in ar_IQ (#2769) translation completed for the source file '/config/locales/en.yml' on the 'ar_IQ' language. Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com> --- config/locales/ar_IQ.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/config/locales/ar_IQ.yml b/config/locales/ar_IQ.yml index a29ea8c9..30375203 100644 --- a/config/locales/ar_IQ.yml +++ b/config/locales/ar_IQ.yml @@ -268,6 +268,7 @@ ar_IQ: accepted: يجب أن تكون مقبولة confirmation: "لا يتطابق مع %{attribute}" inclusion: غير مدرج في القائمة + domain: "يجب أن ينتهي بـ \"%{email_domain}\"" no_provider: message: لم يتم تمكين الموقع الذي تحاول الوصول إليه help: الرجاء الاتصال بمسؤول النظام لإعداد Greenlight @@ -312,6 +313,7 @@ ar_IQ: home_room: غرفة الإستقبال info_update_success: تحديث المعلومات بنجاح. invalid_credentials: لم تتطابق رسالة البريد الإلكتروني وكلمة المرور التي أدخلتها مع سجلاتنا. حاول مرة أخرى أو انقر فوق نسيت كلمة المرور لإعادة تعيين كلمة المرور الخاصة بك. + invalid_credentials_external: البريد الإلكتروني وكلمة المرور اللذان أدخلتهما لا يتطابقان مع سجلاتنا. حاول مرة اخرى. invalid_login_method: فشل تسجيل الدخول بسبب عدم تطابق الحساب. تحتاج إلى تسجيل الدخول مع omniauth. invite_message: "لدعوة شخص ما إلى الاجتماع ، أرسل لهم هذا الرابط:" javascript: @@ -507,6 +509,7 @@ ar_IQ: visibility: الظهور formats: الصيغة visibility: + inaccessible: يتعذر الوصول إليها public: عامة unlisted: غير مدرج format: @@ -640,6 +643,9 @@ ar_IQ: title: الشروط والأحكام test_install: > يستخدم هذا النشر خادم اختبار تمت تهيئته مسبقًا ، ويجب استبداله بخادمك الشخصي. لمزيد من التفاصيل ، اطلع على%{href} . + time: + formats: + default: "%b %d, %Y %-I:%M%P" update: تحديث verify: accept: تحقق From fba7837c8b3332165c3ad99cee744460112f2780 Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Tue, 8 Jun 2021 22:58:16 -0400 Subject: [PATCH 141/203] Translate /config/locales/en.yml in de_DE (#2766) translation completed for the source file '/config/locales/en.yml' on the 'de_DE' language. Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com> Co-authored-by: Ahmad Farhat --- config/locales/de_DE.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/config/locales/de_DE.yml b/config/locales/de_DE.yml index 168de942..142c408c 100644 --- a/config/locales/de_DE.yml +++ b/config/locales/de_DE.yml @@ -643,6 +643,9 @@ de_DE: title: Allgemeine Nutzungsbedingungen test_install: > Diese Installation verwendet einen vorkonfigurierten Testserver. Sie sollten diesen durch Ihren eigenen Server ersetzen. Weitere Informationen dazu unter %{href}. + time: + formats: + default: "%b %d, %Y %-I:%M%P" update: Aktualisieren verify: accept: Verifizieren From be121aefe2884141c952ecc9052230356dc72ed0 Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Tue, 8 Jun 2021 22:58:53 -0400 Subject: [PATCH 142/203] Translate '/config/locales/en.yml' in 'fa_IR' (#2767) * Translate /config/locales/en.yml in fa_IR translation completed for the source file '/config/locales/en.yml' on the 'fa_IR' language. * Translate /config/locales/en.yml in fa_IR translation completed for the source file '/config/locales/en.yml' on the 'fa_IR' language. Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com> Co-authored-by: Ahmad Farhat --- config/locales/fa_IR.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/config/locales/fa_IR.yml b/config/locales/fa_IR.yml index adb5093b..c820a157 100644 --- a/config/locales/fa_IR.yml +++ b/config/locales/fa_IR.yml @@ -643,6 +643,9 @@ fa_IR: title: شرایط و قوانین test_install: > این پیاده سازی از سرور آزمایشی پیش‌فرض استفاده می‌کند، شما می بایست آن را با تنظیمات خود جایگزین کنید. برای جزئیات %{href} را مشاهده کنید. + time: + formats: + default: "%b %d، %Y %-I:%M%P" update: به‌روزرسانی verify: accept: تاییدیه From 4658de820f861d3f47683fdde7f62efd045ff907 Mon Sep 17 00:00:00 2001 From: Mohamad Abras Date: Wed, 9 Jun 2021 05:59:37 +0300 Subject: [PATCH 143/203] fix current user being nil on delete account page (#2749) --- app/controllers/users_controller.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index 008de477..c2d7d2d2 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -79,6 +79,7 @@ class UsersController < ApplicationController # GET /u/:user_uid/delete_account def delete_account + redirect_to signin_path unless current_user end # POST /u/:user_uid/edit From 998342e51fbad1eb587a3cba2bf825e999fd7f99 Mon Sep 17 00:00:00 2001 From: Ahmad Farhat Date: Mon, 14 Jun 2021 19:59:25 -0400 Subject: [PATCH 144/203] Fixed overflowing menu (#2782) --- app/assets/stylesheets/admins.scss | 4 ++++ app/views/admins/components/_rooms.html.erb | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/app/assets/stylesheets/admins.scss b/app/assets/stylesheets/admins.scss index 38c40afc..7b93539a 100644 --- a/app/assets/stylesheets/admins.scss +++ b/app/assets/stylesheets/admins.scss @@ -98,4 +98,8 @@ .admin-tabs { justify-content: space-around; +} + +#rooms-table-div { + overflow: visible; } \ No newline at end of file diff --git a/app/views/admins/components/_rooms.html.erb b/app/views/admins/components/_rooms.html.erb index 39259229..c0be9a12 100644 --- a/app/views/admins/components/_rooms.html.erb +++ b/app/views/admins/components/_rooms.html.erb @@ -15,7 +15,7 @@
-
+
From 41a204d1cb82a26a6fb2ad0449ebc97b10b656ba Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Mon, 14 Jun 2021 20:00:34 -0400 Subject: [PATCH 145/203] Translate /config/locales/en.yml in ja_JP (#2780) translation completed for the source file '/config/locales/en.yml' on the 'ja_JP' language. Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com> --- config/locales/ja_JP.yml | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/config/locales/ja_JP.yml b/config/locales/ja_JP.yml index 5e2e86a9..0ee7214d 100644 --- a/config/locales/ja_JP.yml +++ b/config/locales/ja_JP.yml @@ -268,6 +268,7 @@ ja_JP: accepted: 受け入れる必要があります confirmation: "%{attribute} と一致しません" inclusion: リストに含まれていません + domain: "\"%{email_domain}\"で終わる必要があります" no_provider: message: アクセスしようとしているサイトは有効になっていません help: Greenlightの設定については、システム管理者にお問い合わせください。 @@ -312,6 +313,7 @@ ja_JP: home_room: 主会議室 info_update_success: 情報を更新しました。 invalid_credentials: 入力されたメールアドレスとパスワードが登録内容と一致しませんでした。 もう一度試すか[パスワードを忘れた場合]をクリックしてパスワードをリセットしてください。 + invalid_credentials_external: 入力したEメールアドレスとパスワードがこちらの記録と違っています。もう一度入力してみてください。 invalid_login_method: アカウントが一致しないため、ログインに失敗しました。 Omniauthでログインする必要があります。 invite_message: "誰かを会議に招待するには、このリンクを送信します:" javascript: @@ -507,6 +509,7 @@ ja_JP: visibility: 公開度 formats: 再生フォーマット visibility: + inaccessible: 閲覧不可 public: 公開 unlisted: 限定公開 format: @@ -582,9 +585,9 @@ ja_JP: recent_rooms: 最近参加した会議室に移動 title: 会議に参加 no_sessions: まだ会議は一度も開催されていません! - preupload_success: プレゼン資料の追加に成功 + preupload_success: プレゼン資料を追加しました preupload_error: 会議室のプレゼン資料をアップデートする際にエラーが起こりました - preupload_remove_success: プレゼン資料の消去に成功 + preupload_remove_success: プレゼン資料を消去しました preupload_remove_error: 会議室のプレゼン資料を消去する際にエラーが起こりました recordings: 件の録画 room_limit: 許可された会議室数の上限に達しました @@ -640,6 +643,9 @@ ja_JP: title: 利用規約 test_install: > この構成では、事前に構成されたテストサーバを使用しています。これを独自のものに置き換える必要があります。 詳細については %{href} をご覧ください。 + time: + formats: + default: "%Y年%b%d %-I:%M%P" update: 更新 verify: accept: 確認 From d33330f21fa8c04dcac9c019be14807ff4d4aade Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Mon, 14 Jun 2021 20:00:59 -0400 Subject: [PATCH 146/203] Translate /config/locales/en.yml in es (#2778) translation completed for the source file '/config/locales/en.yml' on the 'es' language. Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com> --- config/locales/es.yml | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/config/locales/es.yml b/config/locales/es.yml index 1d40d4f7..c4eefe68 100644 --- a/config/locales/es.yml +++ b/config/locales/es.yml @@ -268,6 +268,7 @@ es: accepted: debe ser aceptado confirmation: "no coincide %{attribute}" inclusion: no está incluido en la lista + domain: "debe terminar con \"%{email_domain}\"" no_provider: message: El sitio al que está intentando acceder no se encuentra activo help: "Por favor, contacte con el administrador del sistema para configurar Greenlight" @@ -312,6 +313,7 @@ es: home_room: Sala principal info_update_success: Información actualizada con éxito. invalid_credentials: El correo electrónico y la contraseña introducidos no coinciden con los registros. Inténtelo de nuevo o haga clic en recuperar contraseña. + invalid_credentials_external: El correo electrónico y la contraseña introducidos no coinciden con los registros. Inténtelo de nuevo. invalid_login_method: El inicio de sesión falló debido a la falta de coincidencia de cuenta. Necesitas iniciar sesión con uno de los proveedores. invite_message: "Para invitar a alguien a la sesión, envíele este enlace:" javascript: @@ -507,6 +509,7 @@ es: visibility: Visibilidad formats: Formatos visibility: + inaccessible: Inaccesible public: Pública unlisted: No listada format: @@ -560,7 +563,7 @@ es: success: Sala eliminada correctamente fail: "Se ha producido un error al eliminar la sala (%{error})" enter_the_access_code: Introduce el código de acceso de la sala - enter_the_moderator_access_code: Introduzca el código de moderador de la sala + enter_the_moderator_access_code: ¡Introduzca el código de moderador de la sala! optional_moderator_access_code: "Código opcional de moderador:" invalid_provider: El enlace introducido no es válido. Revísalo e inténtalo de nuevo. invitation_description: "Ha sido invitado a unirse a %{name} usando BigBlueButton. Para unirse, haga clic en el enlace superior e introduzca su nombre." @@ -640,6 +643,9 @@ es: title: Términos y condiciones test_install: > Esta instalación esta haciendo uso del servidor para pruebas que viene pre-configurado. Debería ser substituido con tu propio servidor. Para más detalles vea %{href}. + time: + formats: + default: "%b %d, %Y %-I:%M%P" update: Actualizar verify: accept: Verificar From cdc50e9a627a633ee9656246ca3620b2db7c203a Mon Sep 17 00:00:00 2001 From: Ahmad Farhat Date: Fri, 18 Jun 2021 14:17:55 -0400 Subject: [PATCH 147/203] Remove recording sort (#2788) --- .../admins/components/_recordings.html.erb | 35 +++---------------- 1 file changed, 5 insertions(+), 30 deletions(-) diff --git a/app/views/admins/components/_recordings.html.erb b/app/views/admins/components/_recordings.html.erb index 6030b692..9c0de542 100644 --- a/app/views/admins/components/_recordings.html.erb +++ b/app/views/admins/components/_recordings.html.erb @@ -19,45 +19,20 @@
- - - - - From cb3e597a61ffc043cf9b8af56d0746f1bcae0a87 Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Fri, 18 Jun 2021 14:26:59 -0400 Subject: [PATCH 148/203] Translate /config/locales/en.yml in da (#2786) translation completed for the source file '/config/locales/en.yml' on the 'da' language. Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com> --- config/locales/da.yml | 37 ++++++++++++++++++++++++++++++++----- 1 file changed, 32 insertions(+), 5 deletions(-) diff --git a/config/locales/da.yml b/config/locales/da.yml index 999854a5..621e7635 100644 --- a/config/locales/da.yml +++ b/config/locales/da.yml @@ -69,6 +69,10 @@ da: regular: Almindelig lighten: Lysere darken: Mørkere + email_mapping: + info: "Giv brugeren en rolle ved hjælp af deres e-mail. Skal være i formatet email1 = rolle1, email2 = rolle2\n " + title: Giv Roller via Email + update: log_level: title: Log Niveau information: Skift Log Niveau for hele systemet @@ -90,7 +94,7 @@ da: title: Vedligeholdelses Banner display: Sæt clear: Ryd - time: "Eksempel: Opdatering planlagt 13. december @ 23:00 ET. Brugere kan have problemer med at logge ind." + time: "Eksempel: Opdatering planlagt 13. december @ 23:00 ET. Brugere kan have problemer med at logge ind." preupload: info: "Brugere kan forhåndsindlæse en præsentation, der skal bruges som standardpræsentation for det specifikke rum" title: Tillad Brugere at Forhåndsindlæse Præsentationer @@ -111,6 +115,7 @@ da: tabs: appearance: Udseende administration: Administration + registration: Registrering settings: Indstillinger title: Side Indstillinger flash: @@ -133,8 +138,10 @@ da: settings: Sidens indstillinger er blevet ændret med succes unauthorized: Du er ikke godkendt til at lave denne handling på brugeren recordings: + latest: Sidste nye Optagelser title: Server Optagelser no_recordings: Denne server har ingen optagelser. + search_info: Indtast en brugers fulde e-mail eller et rums uid roles: appear_in_share_list: Inkluder brugere med denne rolle i rullemenuen for delte rum can_create_rooms: Kan oprette rum @@ -168,12 +175,15 @@ da: info: "Giver alle brugernes moderatorrettigheder i BigBlueButton, når de deltager i mødet." recordings: info: "Tillader rum ejere at specificere, om de vil have muligheden for at optage et værelse eller ej. Hvis aktiveret, skal moderatoren stadig klikke på \"Optag\" -knappen, når mødet er startet." + moderator_codes: + info: "Giver rum ejere mulighed for valgfrit at generere en moderator-pin, som giver andre brugere mulighed for at deltage direkte som moderatorer." + title: Moderator Adgangskode options: disabled: Deaktiver enabled: Altid Aktiveret optional: Valgfri rooms: - timeout: " \nPå grund af %{server} Serveren fik timeout for serveranmodning, oplysningerne om status og deltagere er muligvis ikke korrekte" + timeout: "På grund af %{server} Serveren fik timeout for serveranmodning, oplysningerne om status og deltagere er muligvis ikke korrekte" title: Server Rum table: ended: "Sluttede: %{session}" @@ -219,6 +229,7 @@ da: cookies: cookie_info: "Cookies hjælper os med at levere vores service. Ved at bruge vores system, godkender du samtidigt vores brug af cookies." cookie_button: Jeg er enig + policy: "For mere information, læs voresprivatlivs politik." copied: Kopiret copy: Kopier date: @@ -257,6 +268,7 @@ da: accepted: skal accepteres confirmation: "passer ikke til %{attribute}" inclusion: er ikke inkluderet i listen + domain: "skal ende med \"%{email_domain}\"" no_provider: message: Siden du prøver at få adgang til er ikke slået til help: Kontakt venligst din system administrator for at indstille Greenlight @@ -301,6 +313,7 @@ da: home_room: Hjemme Rum info_update_success: Informationerne er opdateret med succes. invalid_credentials: "Den indtastede email og adgangskode, passer ikke på det vi har stående i vores system. Prøv igen, eller klik på Glemt Adgangskode, for at nulstille denne. " + invalid_credentials_external: "Den email og adgangskode du indtastede, matchede ikke i vores system. Prøv venligst igen." invalid_login_method: "Dit login forsøg fejlede da der var en fejl med kontoen.\nDu bliver nødt til at logge ind med omniauth." invite_message: "For at invitere nogen til et møde, skal du sende dem dette link:" javascript: @@ -345,6 +358,7 @@ da: info: "Du er blevet inviteret til dit eget personlige rum af %{name}" signup_info: "For at oprette dig med din email, klik på knappen nedenunder og følg vejledningen." signup_link: Opret Konto + valid: "Invitationen er gyldig indtil: %{date}" signup: info: En bruger der var inviteret har oprette sig på Greenlight. admins_link: Besøg Indstillings Siden @@ -383,7 +397,9 @@ da: title: Opret Ny Rolle create_room: access_code: Adgangs Kode + moderator_access_code: Moderator Adgangskode access_code_placeholder: Generer en adgangskode til rummet. Valgfrit. + moderator_access_code_placeholder: Generer en valgfri adgangskode til moderatorer auto_join: Tilslut mig automatisk i rummet. create: Opret Rum free_delete: Du vil kunne slette dette rum på et hvilket som helst tidspunkt. @@ -398,7 +414,7 @@ da: warning: Denne beslutning er afgørende. Du vil ikke kunne genskabe data igen. delete_rec: delete: "Jeg er sikker, slet denne optagelse." - header: " \nEr du sikker på, at du vil slette denne optagelse?" + header: "Er du sikker på, at du vil slette denne optagelse?" warning: Du vil ikke have mulighed for at genskabe denne optagelse delete_room: confirm: "Er du sikker på du vil slette %{room}?" @@ -472,6 +488,7 @@ da: office365: Office 365 twitter: Twitter ldap: LDAP + openid_connect: OpenID Connect recaptcha: errors: recaptcha_unreachable: "Årh nej, vi kunne ikke bekræfte din reCAPTCHA forbindelse. Prøv venligst igen." @@ -492,6 +509,7 @@ da: visibility: Synlighed formats: Formater visibility: + inaccessible: Utilgængelig public: Synlig unlisted: Skjult format: @@ -517,6 +535,7 @@ da: remove: Fjern rename: Omdøb reset_password: + captcha: "reCAPTCHA verifikation fejlede, prøv venligst igen." invalid_token: Token til nulstilling af adgangskode er ugyldigt. Prøv at nulstille din adgangskode igen. subtitle: Nulstil Adgangskode password: Ny Adgangskode @@ -529,11 +548,13 @@ da: banned: Bortvist deleted: Slettet pending: Afventer + invited: Inviteret user: Bruger room: access_code_required: Indtast venligst en gyldig adgangskode for at deltage i rummet add_presentation: Tilføj Præsentation copy_access: Kopier Adgangskode + copy_moderator_access: Kopier Moderator Adgangskode create_room: Opret et Rum create_room_error: Der var en fejl ved oprettelsen af rummet create_room_success: Rummet blev oprettet med succes @@ -542,8 +563,10 @@ da: success: Rummet blev slettet med succes fail: "Kunne ikke slette rummet (%{error})" enter_the_access_code: Indtast rummets adgangskode + enter_the_moderator_access_code: Indtast rummets moderator adgangskode! + optional_moderator_access_code: "Valgfri Moderator Adgangskode:" invalid_provider: Du har indtastet en forkert url. Tjek venligst adressen og prøv igen. - invitation_description: "Du er blevet inviteret til at deltage %{name} ved hjælp af BigBlueButton. For at deltage skal du klikke på linket ovenfor og indtaste dit navn." + invitation_description: "Du er blevet inviteret til at deltage %{name} ved hjælp af BigBlueButton. For at deltage skal du klikke på linket ovenfor og indtaste dit navn." invited: Du er blevet inviteret til at deltage recording_present: "Jeg anerkender, at denne session vil blive optaget. Dette kan omfatte min stemme og video, hvis det er aktiveret." invite_participants: Inviter Deltagere @@ -578,6 +601,7 @@ da: shared_access_success: Rummet blev delt med succes shared_access_error: Der var en fejl ved deling af rummet start: Start + search: Søg efter rum... unavailable: Dette rum er i øjeblikket ikke tilgængeligt på grund af ejerens e-mail ikke er blevet bekræftet. update_settings_error: Der var en fejl ved opdateringen af indstillingerne for rummet update_settings_success: Indstillingerne for rummet blev opdateret med succes. @@ -586,7 +610,7 @@ da: auto: Du vil automatisk blive tilsluttet når mødet starter. settings: account: - fullname: Fulde navn + fullname: Fulde Navn language: Sprog provider: Udbyder image: Billede @@ -619,6 +643,9 @@ da: title: Regler og Betingelser test_install: > Denne installation bruger en forudkonfigureret testserver, du skal erstatte denne med din egen. For detaljer, se %{href}. + time: + formats: + default: "%b %d, %Y %-I:%M%P" update: Opdater verify: accept: Bekræft From e54208f71010d479705fc1f30312ece4aeb32670 Mon Sep 17 00:00:00 2001 From: Moritz <15136847+Nemental@users.noreply.github.com> Date: Fri, 18 Jun 2021 20:28:33 +0200 Subject: [PATCH 149/203] S3-compatible object storage API (#2720) * s3 active_storage * updated readme --- config/environments/production.rb | 2 ++ config/storage.yml | 7 +++++++ sample.env | 7 +++++++ 3 files changed, 16 insertions(+) diff --git a/config/environments/production.rb b/config/environments/production.rb index 54f40706..c55c70c1 100644 --- a/config/environments/production.rb +++ b/config/environments/production.rb @@ -63,6 +63,8 @@ Rails.application.configure do # Store uploaded files on the local file system (see config/storage.yml for options) config.active_storage.service = if ENV["AWS_ACCESS_KEY_ID"].present? :amazon + elsif ENV["S3_ACCESS_KEY_ID"].present? + :s3 elsif ENV["GCS_PRIVATE_KEY_ID"].present? :google else diff --git a/config/storage.yml b/config/storage.yml index 1c872b81..520c99e0 100644 --- a/config/storage.yml +++ b/config/storage.yml @@ -13,6 +13,13 @@ amazon: secret_access_key: <%= ENV['AWS_SECRET_ACCESS_KEY'] %> region: <%= ENV['AWS_REGION'] %> bucket: <%= ENV['AWS_BUCKET'] %> +s3: + service: S3 + endpoint: <%= ENV['S3_ENDPOINT'] %> + access_key_id: <%= ENV['S3_ACCESS_KEY_ID'] %> + secret_access_key: <%= ENV['S3_SECRET_ACCESS_KEY'] %> + region: <%= ENV['S3_REGION'] %> + bucket: <%= ENV['S3_BUCKET'] %> # Remember not to checkin your GCS keyfile to a repository google: diff --git a/sample.env b/sample.env index ad93036f..0bb33966 100644 --- a/sample.env +++ b/sample.env @@ -326,6 +326,13 @@ DEFAULT_REGISTRATION=open # AWS_REGION= # AWS_BUCKET= # +# For S3-compatible API: +# S3_ENDPOINT= +# S3_ACCESS_KEY_ID= +# S3_SECRET_ACCESS_KEY= +# S3_REGION= +# S3_BUCKET= +# # For GCS Storage: # GCS_PROJECT_ID= # GCS_PRIVATE_KEY_ID= From 0f12eaa885e41f4832608791b7a2973886d0c6b0 Mon Sep 17 00:00:00 2001 From: Ahmad Farhat Date: Fri, 18 Jun 2021 14:59:00 -0400 Subject: [PATCH 150/203] Fixed public recording strings (#2789) --- app/views/shared/_sessions.html.erb | 4 ++-- config/locales/en.yml | 6 ++++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/app/views/shared/_sessions.html.erb b/app/views/shared/_sessions.html.erb index cba1fb27..c7a9e242 100644 --- a/app/views/shared/_sessions.html.erb +++ b/app/views/shared/_sessions.html.erb @@ -77,7 +77,7 @@ <% if recordings.empty? %> @@ -86,7 +86,7 @@ <% if user_recordings %> <%= t("recording.no_user_recordings") %> <% else %> - <%= t("recording.no_recordings", inject: only_public ? t("recording.visibility.public").downcase + " " : "") %> + <%= only_public ? t("recording.no_public_recordings") : t("recording.no_recordings") %> <% end %> diff --git a/config/locales/en.yml b/config/locales/en.yml index b6fb72af..da320a4d 100755 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -498,9 +498,11 @@ en: all_recordings: All Recordings email: Email Recording error: There was an error retrieving %{count} recording(s) - no_recordings: This room has no %{inject}recordings. + no_public_recordings: This room has no public recordings. + no_recordings: This room has no recordings. no_user_recordings: You currently have no recordings. - no_matched_recordings: No %{inject} recordings match your search. + no_matched_pub_recordings: No public recordings match your search. + no_matched_recordings: No recordings match your search. recorded_on: Recorded on %{date} table: name: Name From e0775122d4f3825bf52e710c11d3201ed7deec5b Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Sat, 19 Jun 2021 17:40:47 -0400 Subject: [PATCH 151/203] Translate '/config/locales/en.yml' in 'de_DE' (#2790) * Translate /config/locales/en.yml in de_DE translation completed for the source file '/config/locales/en.yml' on the 'de_DE' language. * Translate /config/locales/en.yml in de_DE translation completed for the source file '/config/locales/en.yml' on the 'de_DE' language. Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com> Co-authored-by: Ahmad Farhat --- config/locales/de_DE.yml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/config/locales/de_DE.yml b/config/locales/de_DE.yml index 142c408c..172ad808 100644 --- a/config/locales/de_DE.yml +++ b/config/locales/de_DE.yml @@ -497,9 +497,11 @@ de_DE: all_recordings: Alle Aufzeichnungen email: Aufzeichnungslink per E-Mail error: "Beim Abruf von %{count} Aufzeichnung(en) ist ein Fehler aufgetreten." - no_recordings: "Dieser Raum hat keine %{inject} Aufzeichnungen." + no_public_recordings: Dieser Raum hat keine öffentlichen Aufzeichnungen. + no_recordings: Dieser Raum hat keine Aufzeichnungen. no_user_recordings: Momentan sind keine Aufzeichnungen verfügbar. - no_matched_recordings: "Keine %{inject} Aufzeichnungen passen zu Ihrer Suche." + no_matched_pub_recordings: Keine öffentlichen Aufzeichnungen passen zu Ihrer Suche. + no_matched_recordings: Keine Aufzeichnungen passen zu Ihrer Suche. recorded_on: "Aufgezeichnet am %{date}" table: name: Name From a7ecd54381909cfe67d9607fd6d2a13204c453a4 Mon Sep 17 00:00:00 2001 From: Julien Gribonvald Date: Thu, 24 Jun 2021 00:16:37 +0200 Subject: [PATCH 152/203] Feat: recording perm (#2775) * fix: comment into code not related - abusive copy/paste * Add user permission for recording Add a role permission 'can_launch_record' to users to set the ability to run recording. By default everybody can record, but we can set to the user role without perm to record and create a new role for those who can. --- app/controllers/admins_controller.rb | 2 ++ app/controllers/application_controller.rb | 2 +- app/controllers/concerns/recorder.rb | 9 ++++++++ app/controllers/concerns/rolify.rb | 2 +- app/controllers/rooms_controller.rb | 6 ++++-- app/models/role.rb | 9 ++++---- app/views/admins/components/_roles.html.erb | 11 +++++++--- .../shared/modals/_create_room_modal.html.erb | 4 ++-- config/locales/en.yml | 1 + config/locales/fr.yml | 1 + ...add_can_launch_recording_to_permissions.rb | 21 +++++++++++++++++++ 11 files changed, 55 insertions(+), 13 deletions(-) create mode 100644 db/migrate/20210319160827_add_can_launch_recording_to_permissions.rb diff --git a/app/controllers/admins_controller.rb b/app/controllers/admins_controller.rb index ce752999..0cf463a6 100644 --- a/app/controllers/admins_controller.rb +++ b/app/controllers/admins_controller.rb @@ -31,6 +31,8 @@ class AdminsController < ApplicationController before_action :find_deleted_user, only: manage_deleted_users before_action :verify_admin_of_user, only: [manage_users, manage_deleted_users] + helper_method :perm_to_record_meeting + # GET /admins def index # Initializa the data manipulation variables diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index cfdd66c8..06c922ec 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -180,7 +180,7 @@ class ApplicationController < ActionController::Base end helper_method :shared_access_allowed - # Indicates whether users are allowed to share rooms + # Indicates whether users should consent recoding when joining rooms def recording_consent_required? @settings.get_value("Require Recording Consent") == "true" end diff --git a/app/controllers/concerns/recorder.rb b/app/controllers/concerns/recorder.rb index 0365fb2d..6093733e 100644 --- a/app/controllers/concerns/recorder.rb +++ b/app/controllers/concerns/recorder.rb @@ -123,6 +123,15 @@ module Recorder end end + def perm_to_record_meeting + # define perm without init config of room setting + if recording_consent_required? + @settings.get_value("Room Configuration Recording") != "disabled" && current_user&.role&.get_permission("can_launch_recording") + else + current_user&.role&.get_permission("can_launch_recording") + end + end + private # Gets the email of the room owner to which the recording belongs to diff --git a/app/controllers/concerns/rolify.rb b/app/controllers/concerns/rolify.rb index a49092f8..868cd87e 100644 --- a/app/controllers/concerns/rolify.rb +++ b/app/controllers/concerns/rolify.rb @@ -120,7 +120,7 @@ module Rolify role_params = params.require(:role).permit(:name) permission_params = params.require(:role).permit(:can_create_rooms, :send_promoted_email, :send_demoted_email, :can_edit_site_settings, :can_edit_roles, :can_manage_users, - :can_manage_rooms_recordings, :can_appear_in_share_list, :colour) + :can_launch_recording, :can_manage_rooms_recordings, :can_appear_in_share_list, :colour) permission_params.transform_values! do |v| case v diff --git a/app/controllers/rooms_controller.rb b/app/controllers/rooms_controller.rb index fd4233c1..0472b99c 100644 --- a/app/controllers/rooms_controller.rb +++ b/app/controllers/rooms_controller.rb @@ -35,6 +35,8 @@ class RoomsController < ApplicationController before_action :verify_user_not_admin, only: [:show] skip_before_action :verify_authenticity_token, only: [:join] + helper_method :perm_to_record_meeting + # POST / def create # Return to root if user is not signed in @@ -436,9 +438,9 @@ class RoomsController < ApplicationController def record_meeting # If the require consent setting is checked, then check the room setting, else, set to true if recording_consent_required? - room_setting_with_config("recording") + room_setting_with_config("recording") && current_user&.role&.get_permission("can_launch_recording") else - true + current_user&.role&.get_permission("can_launch_recording") end end diff --git a/app/models/role.rb b/app/models/role.rb index b9af4b89..8fcae4b7 100644 --- a/app/models/role.rb +++ b/app/models/role.rb @@ -38,13 +38,13 @@ class Role < ApplicationRecord Role.create(name: "admin", provider: provider, priority: 0, colour: "#f1c40f") .update_all_role_permissions(can_create_rooms: true, send_promoted_email: true, send_demoted_email: true, can_edit_site_settings: true, can_manage_rooms_recordings: true, - can_edit_roles: true, can_manage_users: true) + can_launch_recording: true, can_edit_roles: true, can_manage_users: true) Role.create(name: "pending", provider: provider, priority: -1, colour: "#17a2b8").update_all_role_permissions Role.create(name: "denied", provider: provider, priority: -2, colour: "#343a40").update_all_role_permissions Role.create(name: "super_admin", provider: provider, priority: -3, colour: "#cd201f") - .update_all_role_permissions(can_create_rooms: true, - send_promoted_email: true, send_demoted_email: true, can_edit_site_settings: true, - can_edit_roles: true, can_manage_users: true, can_manage_rooms_recordings: true) + .update_all_role_permissions(can_create_rooms: true, send_promoted_email: true, + send_demoted_email: true, can_edit_site_settings: true, can_manage_rooms_recordings: true, + can_launch_recording: true, can_edit_roles: true, can_manage_users: true) end def self.create_new_role(role_name, provider) @@ -72,6 +72,7 @@ class Role < ApplicationRecord update_permission("can_manage_users", permissions[:can_manage_users].to_s) update_permission("can_manage_rooms_recordings", permissions[:can_manage_rooms_recordings].to_s) update_permission("can_appear_in_share_list", permissions[:can_appear_in_share_list].to_s) + update_permission("can_launch_recording", permissions[:can_launch_recording].to_s) end # Updates the value of the permission and enables it diff --git a/app/views/admins/components/_roles.html.erb b/app/views/admins/components/_roles.html.erb index a622bff6..dcfb7b1b 100644 --- a/app/views/admins/components/_roles.html.erb +++ b/app/views/admins/components/_roles.html.erb @@ -20,8 +20,8 @@
<% @roles.each do |role| %> - <%= link_to admin_roles_path(selected_role: role.id), - class: "#{"sort-disabled" if role.name == "user" || role.name == "admin" || role.priority <= current_role.priority } dropdown-item list-group-item list-group-item-action #{"active" if @selected_role.id == role.id}", + <%= link_to admin_roles_path(selected_role: role.id), + class: "#{"sort-disabled" if role.name == "user" || role.name == "admin" || role.priority <= current_role.priority } dropdown-item list-group-item list-group-item-action #{"active" if @selected_role.id == role.id}", id: dom_id(role) do %> <%= translated_role_name(role) %> <% end %> @@ -36,7 +36,7 @@ <%= form_with model: @selected_role, url: admin_update_role_path(@selected_role.id), method: :post do |f| %> <%= f.label :name, t('administrator.roles.name'), class: "form-label" %> <%= f.text_field :name, class: 'form-control mb-3', value: translated_role_name(@selected_role), readonly: edit_disabled || @selected_role.name == "user" || @selected_role.name == "admin", required: true %> - + <%= f.hidden_field :colour, id: "role-colour", value: role_colour(@selected_role) %>
@@ -58,6 +58,11 @@ <%= f.check_box :can_manage_users, checked: @selected_role.get_permission("can_manage_users"), class: "custom-switch-input", disabled: edit_disabled || !current_role.get_permission("can_manage_users") %> + <% end %> - + <% any_start = room_configuration("Room Configuration Allow Any Start") %> <% if any_start != "disabled" %> <% end %> <% recording = room_configuration("Room Configuration Recording") %> - <% if recording_consent_required? && recording != "disabled" %> + <% if recording_consent_required? && recording != "disabled" && perm_to_record_meeting %>
"> + <%= t("recording.table.name") %> - <% if @order_column == "name" && @order_direction == "desc" %> - ↓ - <% elsif @order_column == "name" && @order_direction == "asc" %> - ↑ - <% end %> "> + <%= t("recording.table.length") %> - <% if @order_column == "length" && @order_direction == "desc" %> - ↓ - <% elsif @order_column == "length" && @order_direction == "asc" %> - ↑ - <% end %> "> + <%= t("recording.table.users") %> - <% if @order_column == "users" && @order_direction == "desc" %> - ↓ - <% elsif @order_column == "users" && @order_direction == "asc" %> - ↑ - <% end %> "> + <%= t("recording.table.visibility") %> - <% if @order_column == "visibility" && @order_direction == "desc" %> - ↓ - <% elsif @order_column == "visibility" && @order_direction == "asc" %> - ↑ - <% end %> "> + <%= t("recording.table.formats") %> - <% if @order_column == "formats" && @order_direction == "desc" %> - ↓ - <% elsif @order_column == "formats" && @order_direction == "asc" %> - ↑ - <% end %>