From 0bbd9e281f903609e35103447354d00c07fdd231 Mon Sep 17 00:00:00 2001 From: Ahmad Farhat Date: Wed, 15 Nov 2023 11:36:32 -0500 Subject: [PATCH 01/68] Remove active_record_serializer logs in prod (#5520) --- Gemfile.lock | 6 ------ config/environments/production.rb | 10 +++------- .../initializers/active_model_serializers.rb | 19 +++++++++++++++++++ 3 files changed, 22 insertions(+), 13 deletions(-) create mode 100644 config/initializers/active_model_serializers.rb diff --git a/Gemfile.lock b/Gemfile.lock index c397e10c2a4..beccedf92db 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -538,9 +538,3 @@ DEPENDENCIES web-console (>= 4.2.1) webdrivers webmock - -RUBY VERSION - ruby 3.0.0p0 - -BUNDLED WITH - 2.2.3 diff --git a/config/environments/production.rb b/config/environments/production.rb index 9e785e50979..9f91ad5db76 100644 --- a/config/environments/production.rb +++ b/config/environments/production.rb @@ -135,17 +135,13 @@ # require "syslog/logger" # config.logger = ActiveSupport::TaggedLogging.new(Syslog::Logger.new "app-name") - if ENV['RAILS_LOG_TO_STDOUT'].present? - $stdout.sync = true - logger = ActiveSupport::Logger.new($stdout) - logger.formatter = config.log_formatter - config.logger = ActiveSupport::TaggedLogging.new(logger) - end - if ENV['RAILS_LOG_REMOTE_NAME'] && ENV['RAILS_LOG_REMOTE_PORT'] require 'remote_syslog_logger' logger_program = ENV['RAILS_LOG_REMOTE_TAG'] || "greenlight-v3-#{ENV.fetch('RAILS_ENV', nil)}" logger = RemoteSyslogLogger.new(ENV['RAILS_LOG_REMOTE_NAME'], ENV['RAILS_LOG_REMOTE_PORT'], program: logger_program) + else + $stdout.sync = true + logger = ActiveSupport::Logger.new($stdout) end logger.formatter = config.log_formatter diff --git a/config/initializers/active_model_serializers.rb b/config/initializers/active_model_serializers.rb new file mode 100644 index 00000000000..4b0fa598901 --- /dev/null +++ b/config/initializers/active_model_serializers.rb @@ -0,0 +1,19 @@ +# BigBlueButton open source conferencing system - http://www.bigbluebutton.org/. +# +# Copyright (c) 2022 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. +# +# Greenlight 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 Greenlight; if not, see . + +# frozen_string_literal: true + +ActiveModelSerializers.logger = Logger.new(IO::NULL) if Rails.env.production? From c8b70d13f55e9a8f9365608af8fecc4c947959c6 Mon Sep 17 00:00:00 2001 From: Ahmad Farhat Date: Wed, 15 Nov 2023 11:50:29 -0500 Subject: [PATCH 02/68] fix error with trailing slash (#5522) * fix error with trailing slash * eslint * eslint again --- app/javascript/routes/AuthenticatedOnly.jsx | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/app/javascript/routes/AuthenticatedOnly.jsx b/app/javascript/routes/AuthenticatedOnly.jsx index f8fde5ed103..c8997407b40 100644 --- a/app/javascript/routes/AuthenticatedOnly.jsx +++ b/app/javascript/routes/AuthenticatedOnly.jsx @@ -15,9 +15,7 @@ // with Greenlight; if not, see . import React from 'react'; -import { - Navigate, Outlet, useLocation, useMatch, -} from 'react-router-dom'; +import { Navigate, Outlet, useMatch } from 'react-router-dom'; import { useTranslation } from 'react-i18next'; import { toast } from 'react-toastify'; import { useAuth } from '../contexts/auth/AuthProvider'; @@ -26,7 +24,6 @@ import useDeleteSession from '../hooks/mutations/sessions/useDeleteSession'; export default function AuthenticatedOnly() { const { t } = useTranslation(); const currentUser = useAuth(); - const location = useLocation(); const roomsMatch = useMatch('/rooms/:friendlyId'); const superAdminMatch = useMatch('/admin/*'); const deleteSession = useDeleteSession({ showToast: false }); @@ -46,7 +43,7 @@ export default function AuthenticatedOnly() { // Custom logic to redirect from Rooms page to join page if the user isn't signed in if (!currentUser.signed_in && roomsMatch) { - return ; + return ; } if (currentUser.signed_in && currentUser.isSuperAdmin && !superAdminMatch) { From c536ca38849c7c65a90c16490a82114583b4cbe2 Mon Sep 17 00:00:00 2001 From: Ahmad Farhat Date: Mon, 20 Nov 2023 11:25:16 -0500 Subject: [PATCH 03/68] Increased room limit max to 10000 (#5530) --- app/javascript/hooks/forms/admin/roles/useEditRoleLimitForm.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/javascript/hooks/forms/admin/roles/useEditRoleLimitForm.js b/app/javascript/hooks/forms/admin/roles/useEditRoleLimitForm.js index 347c2ac4334..8f7583fc575 100644 --- a/app/javascript/hooks/forms/admin/roles/useEditRoleLimitForm.js +++ b/app/javascript/hooks/forms/admin/roles/useEditRoleLimitForm.js @@ -25,7 +25,7 @@ export function useEditRoleLimitFormValidation() { value: yup.number().required('forms.validations.role.limit.required') .typeError('forms.validations.role.type.error') .min(0, 'forms.validations.role.limit.min') - .max(100, 'forms.validations.role.limit.max'), + .max(10000, 'forms.validations.role.limit.max'), })), []); } From 6a766425d882326e4cafd205b40553386d442775 Mon Sep 17 00:00:00 2001 From: Rahul Rodrigues Date: Mon, 20 Nov 2023 11:26:13 -0500 Subject: [PATCH 04/68] extended join url to accept joinFormName to autofill join name (#5526) * extended join url to accept joinFormName to autofill join name * updated existing useEffect joinFormName --- .../components/rooms/room/join/JoinCard.jsx | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/app/javascript/components/rooms/room/join/JoinCard.jsx b/app/javascript/components/rooms/room/join/JoinCard.jsx index e24a2b8462d..dc7a5a10d7c 100644 --- a/app/javascript/components/rooms/room/join/JoinCard.jsx +++ b/app/javascript/components/rooms/room/join/JoinCard.jsx @@ -18,7 +18,7 @@ import React, { useState, useEffect } from 'react'; import Card from 'react-bootstrap/Card'; import { - Navigate, Link, useParams, + Navigate, Link, useParams, useLocation, } from 'react-router-dom'; import { Button, Col, Row, Stack, Form as RegularForm, @@ -61,6 +61,11 @@ export default function JoinCard() { const path = encodeURIComponent(document.location.pathname); + // get queryParams for JoinFormName + const location = useLocation(); + const queryParams = new URLSearchParams(location.search); + const joinFormName = queryParams.get('joinFormName'); + useEffect(() => { // set cookie to return to if needed const date = new Date(); date.setTime(date.getTime() + (60 * 1000)); // expire the cookie in 1min @@ -86,10 +91,12 @@ export default function JoinCard() { useEffect(() => { // Default Join name to authenticated user full name. - if (currentUser?.name) { + if (joinFormName) { + methods.setValue('name', joinFormName); + } else if (currentUser?.name) { methods.setValue('name', currentUser.name); } - }, [currentUser?.name]); + }, [joinFormName, currentUser?.name]); useEffect(() => { // Room channel subscription: From 265ce2d8a5dae6e79e60dd330d1491689b2936a7 Mon Sep 17 00:00:00 2001 From: Ahmad Farhat Date: Mon, 20 Nov 2023 11:26:58 -0500 Subject: [PATCH 05/68] Add a new role permission for receiving an email on user signup (#5529) * Add a new role permission for receiving an email on user signup * Fix text email * rubo --- app/assets/locales/en.json | 3 +- app/controllers/api/v1/users_controller.rb | 3 ++ app/controllers/concerns/client_routable.rb | 4 +++ .../admin/roles/forms/EditRoleForm.jsx | 7 ++++ app/mailers/user_mailer.rb | 21 ++++++++++- .../new_user_signup_email.html.erb | 30 ++++++++++++++++ .../new_user_signup_email.text.erb | 26 ++++++++++++++ config/locales/en.yml | 7 ++++ ...7151542_add_email_on_sign_up_permission.rb | 36 +++++++++++++++++++ db/data_schema.rb | 2 +- spec/controllers/users_controller_spec.rb | 10 ++++++ test/mailers/previews/user_mailer_preview.rb | 6 ++++ 12 files changed, 152 insertions(+), 3 deletions(-) create mode 100644 app/views/user_mailer/new_user_signup_email.html.erb create mode 100644 app/views/user_mailer/new_user_signup_email.text.erb create mode 100644 db/data/20231117151542_add_email_on_sign_up_permission.rb diff --git a/app/assets/locales/en.json b/app/assets/locales/en.json index 162b628ab7e..bc52d3968f5 100644 --- a/app/assets/locales/en.json +++ b/app/assets/locales/en.json @@ -350,7 +350,8 @@ "manage_site_settings": "Allow users with this role to manage site settings", "manage_roles": "Allow users with this role to edit other roles", "shared_list": "Include users with this role in the dropdown for sharing rooms", - "room_limit": "Room Limit" + "room_limit": "Room Limit", + "email_on_signup": "Receive an email when a new user signs up" } } }, diff --git a/app/controllers/api/v1/users_controller.rb b/app/controllers/api/v1/users_controller.rb index 98b5202494f..a99129ccfa8 100644 --- a/app/controllers/api/v1/users_controller.rb +++ b/app/controllers/api/v1/users_controller.rb @@ -76,6 +76,9 @@ def create UserMailer.with(user:, activation_url: activate_account_url(token), base_url: request.base_url, provider: current_provider).activate_account_email.deliver_later + + UserMailer.with(user:, admin_panel_url:, provider: current_provider) + .new_user_signup_email.deliver_later end create_default_room(user) diff --git a/app/controllers/concerns/client_routable.rb b/app/controllers/concerns/client_routable.rb index 32321642da4..f9fc4f3bbd8 100644 --- a/app/controllers/concerns/client_routable.rb +++ b/app/controllers/concerns/client_routable.rb @@ -33,4 +33,8 @@ def reset_password_url(token) def pending_path "#{root_path}pending" end + + def admin_panel_url + "#{root_url}admin/users" + end end diff --git a/app/javascript/components/admin/roles/forms/EditRoleForm.jsx b/app/javascript/components/admin/roles/forms/EditRoleForm.jsx index 08101684c09..5e90df42c1d 100644 --- a/app/javascript/components/admin/roles/forms/EditRoleForm.jsx +++ b/app/javascript/components/admin/roles/forms/EditRoleForm.jsx @@ -130,6 +130,13 @@ export default function EditRoleForm({ role }) { defaultValue={rolePermissions?.SharedList === 'true'} /> + +
diff --git a/app/mailers/user_mailer.rb b/app/mailers/user_mailer.rb index 3e00b6fc028..fb530613de7 100644 --- a/app/mailers/user_mailer.rb +++ b/app/mailers/user_mailer.rb @@ -42,11 +42,20 @@ def invitation_email @email = params[:email] @name = params[:name] @signup_url = params[:signup_url] - @email = params[:email] mail(to: @email, subject: t('email.invitation.invitation_to_join')) end + def new_user_signup_email + @user = params[:user] + @admin_panel_url = params[:admin_panel_url] + emails = admin_emails + + return if emails.blank? # Dont send anything if no-one has EmailOnSignup enabled + + mail(to: emails, subject: t('email.new_user_signup.new_user')) + end + private def preset @@ -59,4 +68,14 @@ def branding @brand_image = ActionController::Base.helpers.image_url(branding_hash['BrandingImage'], host: @base_url) @brand_color = branding_hash['PrimaryColor'] end + + def admin_emails + # Find all the roles that have EmailOnSignup enabled + role_ids = Role.joins(role_permissions: :permission) + .with_provider(@provider) + .where(role_permissions: { value: 'true' }, permission: { name: 'EmailOnSignup' }) + .pluck(:id) + + User.where(role_id: role_ids).pluck(:email) + end end diff --git a/app/views/user_mailer/new_user_signup_email.html.erb b/app/views/user_mailer/new_user_signup_email.html.erb new file mode 100644 index 00000000000..acdff87f880 --- /dev/null +++ b/app/views/user_mailer/new_user_signup_email.html.erb @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + +
+

<%= t('email.new_user_signup.new_user') %>

+ +

<%= t('email.new_user_signup.new_user_description') %>

+ +

<%= t('email.new_user_signup.name', name: @user.name) %>

+

<%= t('email.new_user_signup.email', email: @user.email) %>

+ +

<%= t('email.new_user_signup.take_action') %>

+ + + <%= t('email.new_user_signup.admin_panel') %> + +
diff --git a/app/views/user_mailer/new_user_signup_email.text.erb b/app/views/user_mailer/new_user_signup_email.text.erb new file mode 100644 index 00000000000..bf3f123789b --- /dev/null +++ b/app/views/user_mailer/new_user_signup_email.text.erb @@ -0,0 +1,26 @@ +<%# + BigBlueButton open source conferencing system - http://www.bigbluebutton.org/. + + Copyright (c) 2022 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. + + Greenlight 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 Greenlight; if not, see http://www.gnu.org/licenses/. +%> + +--- +<%= t('email.new_user_signup.new_user') %> +<%= t('email.new_user_signup.new_user_description' %> +<%= t('email.new_user_signup.name', name: @user.name) %> +<%= t('email.new_user_signup.email', email: @user.email) %> +<%= t('email.new_user_signup.take_action') %> +<%= @signup_url %> +--- diff --git a/config/locales/en.yml b/config/locales/en.yml index 983931086ff..ba04fe59fc5 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -65,6 +65,13 @@ en: get_started: To sign up, please click the button below and follow the steps. valid_invitation: The invitation is valid for 24 hours. sign_up: Sign Up + new_user_signup: + new_user: New User Signup + new_user_description: A new user has signed up to use BigBlueButton. + name: "Name: %{name}" + email: "Email: %{email}" + admin_panel: "Administrator Panel" + take_action: "To view the new user or to take the necessary action, visit the Administrator Panel" reset: password_reset: Reset Password password_reset_requested: A password reset has been requested for %{email}. diff --git a/db/data/20231117151542_add_email_on_sign_up_permission.rb b/db/data/20231117151542_add_email_on_sign_up_permission.rb new file mode 100644 index 00000000000..d2bd13e1a49 --- /dev/null +++ b/db/data/20231117151542_add_email_on_sign_up_permission.rb @@ -0,0 +1,36 @@ +# BigBlueButton open source conferencing system - http://www.bigbluebutton.org/. +# +# Copyright (c) 2022 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. +# +# Greenlight 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 Greenlight; if not, see . + +# frozen_string_literal: true + +class AddEmailOnSignUpPermission < ActiveRecord::Migration[7.1] + def up + email_permission = Permission.create!(name: 'EmailOnSignup') + admin = Role.find_by(name: 'Administrator') + + values = [{ role: admin, permission: email_permission, value: 'true' }] + + Role.where.not(name: 'Administrator').each do |role| + values.push({ role:, permission: email_permission, value: 'false' }) + end + + RolePermission.create! values + end + + def down + raise ActiveRecord::IrreversibleMigration + end +end diff --git a/db/data_schema.rb b/db/data_schema.rb index 5e92e7bfeca..d9e08cdffb3 100644 --- a/db/data_schema.rb +++ b/db/data_schema.rb @@ -1 +1 @@ -DataMigrate::Data.define(version: 20231030185844) +DataMigrate::Data.define(version: 20231117151542) diff --git a/spec/controllers/users_controller_spec.rb b/spec/controllers/users_controller_spec.rb index e7f59cde501..81a9d594ec7 100644 --- a/spec/controllers/users_controller_spec.rb +++ b/spec/controllers/users_controller_spec.rb @@ -66,6 +66,16 @@ expect(User.find_by(email: user_params[:user][:email]).role.name).to eq('User') end + context 'EmailOnSignup' do + it 'emails all admins that a new user has signed up' do + post :create, params: user_params + + expect(ActionMailer::MailDeliveryJob).to have_been_enqueued + .at(:no_wait).exactly(:once) + .with('UserMailer', 'new_user_signup_email', 'deliver_now', Hash) + end + end + context 'User language' do it 'Persists the user language in the user record' do post :create, params: user_params diff --git a/test/mailers/previews/user_mailer_preview.rb b/test/mailers/previews/user_mailer_preview.rb index 58726734423..f7161ee0674 100644 --- a/test/mailers/previews/user_mailer_preview.rb +++ b/test/mailers/previews/user_mailer_preview.rb @@ -38,4 +38,10 @@ def invitation_email UserMailer.with(user: fake_user.new('user', 'user@users'), invitation_url: 'https://example.com/invite').invitation_email end + + def new_user_signup_email + fake_user = Struct.new(:name, :email) + + UserMailer.with(user: fake_user.new('user', 'user@users')).new_user_signup_email + end end From 233d836ec8fbbdb1dbb639c56778c0501362f4ee Mon Sep 17 00:00:00 2001 From: Ahmad Farhat Date: Mon, 20 Nov 2023 11:43:32 -0500 Subject: [PATCH 06/68] Fix issue with recordings resync when no recordings are returned (#5538) --- lib/tasks/server_recordings_sync.rake | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/tasks/server_recordings_sync.rake b/lib/tasks/server_recordings_sync.rake index c74260742d5..5046b5ebac6 100644 --- a/lib/tasks/server_recordings_sync.rake +++ b/lib/tasks/server_recordings_sync.rake @@ -26,6 +26,8 @@ task :server_recordings_sync, %i[provider] => :environment do |_task, args| recordings = BigBlueButtonApi.new(provider: args[:provider]).get_recordings(meeting_ids:) + next if recordings[:recordings].blank? + # Skip the entire batch if the first and last recordings exist if Recording.exists?(record_id: recordings[:recordings][0][:recordID]) && Recording.exists?(record_id: recordings[:recordings][-1][:recordID]) next From 6b46931ef76dd7a5011f59ee2741db1d1ec3dbe9 Mon Sep 17 00:00:00 2001 From: Ahmad Farhat Date: Mon, 20 Nov 2023 13:17:17 -0500 Subject: [PATCH 07/68] Make changes to openid_connect uid field (#5523) * Make changes to openid_connect uid field * Clean up --- .rubocop.yml | 4 ++-- .../api/v1/migrations/external_controller.rb | 3 --- app/controllers/external_controller.rb | 10 +++++++++- config/initializers/omniauth.rb | 4 ++-- sample.env | 1 + 5 files changed, 14 insertions(+), 8 deletions(-) diff --git a/.rubocop.yml b/.rubocop.yml index 9f6ae1c9eb4..db58bc26007 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -70,7 +70,7 @@ Metrics/ClassLength: # A calculated magnitude based on number of assignments, # branches, and conditions. Metrics/AbcSize: - Max: 65 + Max: 75 Metrics/ParameterLists: CountKeywordArgs: false @@ -82,7 +82,7 @@ Metrics/CyclomaticComplexity: Max: 16 Metrics/PerceivedComplexity: - Max: 15 + Max: 17 Rails/Exit: Exclude: diff --git a/app/controllers/api/v1/migrations/external_controller.rb b/app/controllers/api/v1/migrations/external_controller.rb index b398e241e5f..f5191878ad5 100644 --- a/app/controllers/api/v1/migrations/external_controller.rb +++ b/app/controllers/api/v1/migrations/external_controller.rb @@ -16,8 +16,6 @@ # frozen_string_literal: true -# rubocop:disable Metrics/PerceivedComplexity - module Api module V1 module Migrations @@ -276,4 +274,3 @@ def generate_secure_pwd end end end -# rubocop:enable Metrics/PerceivedComplexity diff --git a/app/controllers/external_controller.rb b/app/controllers/external_controller.rb index 7e916805665..a4b87b6af1b 100644 --- a/app/controllers/external_controller.rb +++ b/app/controllers/external_controller.rb @@ -30,7 +30,15 @@ def create_user user_info = build_user_info(credentials) - user = User.find_by(external_id: credentials['uid'], provider:) || User.find_by(email: credentials['info']['email'], provider:) + user = User.find_by(external_id: credentials['uid'], provider:) + + # Fallback mechanism to search by email + if user.blank? + user = User.find_by(email: credentials['info']['email'], provider:) + # Update the user's external id to the latest value to avoid using the fallback + user.update(external_id: credentials['uid']) if user.present? && credentials['uid'].present? + end + new_user = user.blank? registration_method = SettingGetter.new(setting_name: 'RegistrationMethod', provider: current_provider).call diff --git a/config/initializers/omniauth.rb b/config/initializers/omniauth.rb index 9567c502786..7d0a0cb7c90 100644 --- a/config/initializers/omniauth.rb +++ b/config/initializers/omniauth.rb @@ -29,7 +29,7 @@ env['omniauth.strategy'].options[:issuer] = issuer_url env['omniauth.strategy'].options[:scope] = %i[openid email profile] - env['omniauth.strategy'].options[:uid_field] = ENV.fetch('OPENID_CONNECT_UID_FIELD', 'preferred_username') + env['omniauth.strategy'].options[:uid_field] = ENV.fetch('OPENID_CONNECT_UID_FIELD', 'sub') env['omniauth.strategy'].options[:discovery] = true env['omniauth.strategy'].options[:client_options].identifier = ENV.fetch('OPENID_CONNECT_CLIENT_ID') env['omniauth.strategy'].options[:client_options].secret = secret @@ -46,7 +46,7 @@ provider :openid_connect, issuer:, scope: %i[openid email profile], - uid_field: ENV.fetch('OPENID_CONNECT_UID_FIELD', 'preferred_username'), + uid_field: ENV.fetch('OPENID_CONNECT_UID_FIELD', 'sub'), discovery: true, client_options: { identifier: ENV.fetch('OPENID_CONNECT_CLIENT_ID'), diff --git a/sample.env b/sample.env index 7a5f35434d3..9b3a2510d9f 100644 --- a/sample.env +++ b/sample.env @@ -44,6 +44,7 @@ REDIS_URL= #OPENID_CONNECT_CLIENT_SECRET= #OPENID_CONNECT_ISSUER= #OPENID_CONNECT_REDIRECT= +#OPENID_CONNECT_UID_FIELD= # To enable hCaptcha on the user sign up and sign in, define these 2 keys #HCAPTCHA_SITE_KEY= From d2f7896653614eca8e789c36869bdf6faff60de8 Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Mon, 20 Nov 2023 13:17:34 -0500 Subject: [PATCH 08/68] Translate app/assets/locales/en.json in gl (#5541) 100% translated source file: 'app/assets/locales/en.json' on 'gl'. Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com> --- app/assets/locales/gl.json | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/app/assets/locales/gl.json b/app/assets/locales/gl.json index 4732cc120d2..650eff6569b 100644 --- a/app/assets/locales/gl.json +++ b/app/assets/locales/gl.json @@ -81,6 +81,7 @@ "account_info": "Información da conta", "delete_account": "Eliminar a conta", "change_password": "Cambiar o contrasinal", + "set_password": "Defina o seu novo contrasinal", "reset_password": "Restabelecer o contrasinal", "update_account_info": "Actualizar a información da conta", "current_password": "Contrasinal actual", @@ -129,6 +130,7 @@ "click_to_upload": "Prema para enviar", "drag_and_drop": " ou arrastre e solte", "upload_description": "Envíe calquera documento de oficina ou ficheiro PDF (non maior que {{size}}). Dependendo do tamaño do ficheiro, pode requirir un tempo adicional para envialo antes de poder utilizalo", + "delete_presentation": "Eliminar presentación", "are_you_sure_delete_presentation": "Confirma que quere eliminar esta presentación?" }, "shared_access": { @@ -165,6 +167,7 @@ "recording": { "recording": "Gravación", "recordings": "Gravacións", + "processing": "Procesando as gravacións…", "name": "Nome", "length": "Duración", "users": "Usuarios", @@ -347,7 +350,8 @@ "manage_site_settings": "Permitir que os usuarios con este rol xestionen os axustes do sitio", "manage_roles": "Permitir que os usuarios con este rol editen outros roles", "shared_list": "Incluir os usuarios con este rol no menú despregábel para compartir salas", - "room_limit": "Límite de salas" + "room_limit": "Límite de salas", + "email_on_signup": "Recibir un correo-e cando se rexistre un novo usuario" } } }, @@ -358,6 +362,7 @@ "user_updated": "O usuario foi actualizado.", "user_deleted": "O usuario foi eliminado.", "avatar_updated": "O avatar foi actualizado.", + "password_changed": "O seu contrasinal foi actualizado correctamente. Acceda de novo.", "password_updated": "O contrasinal foi actualizado.", "account_activated": "A súa conta foi activada.", "activation_email_sent": "Enviouse un correo que contén as instrucións para activar a súa conta.", From a38baa11e4d3bb8b027253398e2e60b86507076b Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Mon, 20 Nov 2023 13:17:43 -0500 Subject: [PATCH 09/68] Translate config/locales/en.yml in gl (#5540) 100% translated source file: 'config/locales/en.yml' on 'gl'. Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com> --- config/locales/gl.yml | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/config/locales/gl.yml b/config/locales/gl.yml index 56ad6f04108..4165a924750 100644 --- a/config/locales/gl.yml +++ b/config/locales/gl.yml @@ -65,6 +65,13 @@ gl: get_started: "Para rexistrarse, prema no seguinte botón e siga os pasos." valid_invitation: O convite é válido durante 24 horas. sign_up: Rexistrarse + new_user_signup: + new_user: Rexistro de novo usuario + new_user_description: Rexistrouse un novo usuario para usar BigBlueButton. + name: "Nome: %{name}" + email: "Correo-e: %{email}" + admin_panel: "Panel de administración" + take_action: "Para ver o novo usuario ou realizar a acción necesaria, visite o Panel de administración" reset: password_reset: Restabelecer o contrasinal password_reset_requested: "Solicitouse un restabelecemento de contrasinal para %{email}." @@ -73,4 +80,4 @@ gl: link_expires: A ligazón caducará en 1 hora. ignore_request: "Se Vde. non fixo unha solicitude para cambiar o seu contrasinal, ignore este correo" room: - new_room_name: "Sala de %{username}" + new_room_name: " \nSala de %{username}" From e5adc7523be40818664386308704f469700c03f8 Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Mon, 20 Nov 2023 13:17:59 -0500 Subject: [PATCH 10/68] Updates for file config/locales/en.yml in ru (#5531) * Translate config/locales/en.yml in ru 100% translated source file: 'config/locales/en.yml' on 'ru'. * Removing config/locales/en.yml in ru 77% of minimum 100% translated source file: 'config/locales/en.yml' on 'ru'. --------- Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com> From a21088d7adc7cdaa2c39004b7fae48713a8de8aa Mon Sep 17 00:00:00 2001 From: Ahmad Farhat Date: Mon, 20 Nov 2023 14:17:26 -0500 Subject: [PATCH 11/68] Prevent local users from signing in if external accounts is enabled (#5542) --- app/controllers/api/v1/sessions_controller.rb | 3 +- app/controllers/concerns/authorizable.rb | 5 + spec/controllers/sessions_controller_spec.rb | 110 +++++++++++------- 3 files changed, 77 insertions(+), 41 deletions(-) diff --git a/app/controllers/api/v1/sessions_controller.rb b/app/controllers/api/v1/sessions_controller.rb index 41eb19cbe6d..bbf1372a65f 100644 --- a/app/controllers/api/v1/sessions_controller.rb +++ b/app/controllers/api/v1/sessions_controller.rb @@ -20,6 +20,7 @@ module Api module V1 class SessionsController < ApiController skip_before_action :ensure_authenticated, only: %i[index create] + before_action :ensure_unauthenticated, only: :create # GET /api/v1/sessions # Returns the current_user @@ -43,7 +44,7 @@ def create return render_error if user.blank? # Will return an error if the user is NOT from the current provider and if the user is NOT a super admin - return render_error if user.provider != current_provider && !user.super_admin? + return render_error status: :forbidden if !user.super_admin? && (user.provider != current_provider || external_auth?) # Password is not set (local user migrated from v2) if user.external_id.blank? && user.password_digest.blank? diff --git a/app/controllers/concerns/authorizable.rb b/app/controllers/concerns/authorizable.rb index cea926b72ba..4b8b404975c 100644 --- a/app/controllers/concerns/authorizable.rb +++ b/app/controllers/concerns/authorizable.rb @@ -29,6 +29,11 @@ def ensure_authenticated render_error status: :unauthorized unless current_user end + # Ensures that the user is NOT logged in + def ensure_unauthenticated + render_error status: :unauthorized if current_user + end + # PermissionsChecker service will return a true or false depending on whether the current_user's role has the provided permission_name def ensure_authorized(permission_names, user_id: nil, friendly_id: nil, record_id: nil) render_error status: :forbidden unless PermissionsChecker.new( diff --git a/spec/controllers/sessions_controller_spec.rb b/spec/controllers/sessions_controller_spec.rb index e2202d26998..4b234930f82 100644 --- a/spec/controllers/sessions_controller_spec.rb +++ b/spec/controllers/sessions_controller_spec.rb @@ -54,46 +54,6 @@ expect(session[:session_token]).to eq(user.session_token) end - it 'returns UnverifiedUser error if the user is not verified' do - unverified_user = create(:user, password: 'Password1!', verified: false) - - post :create, params: { - session: { - email: unverified_user.email, - password: 'Password1!' - } - } - - expect(response.parsed_body['data']).to eq(unverified_user.id) - expect(response.parsed_body['errors']).to eq('UnverifiedUser') - end - - it 'returns BannedUser error if the user is banned' do - banned_user = create(:user, password: 'Password1!', status: :banned) - - post :create, params: { - session: { - email: banned_user.email, - password: 'Password1!' - } - } - - expect(response.parsed_body['errors']).to eq('BannedUser') - end - - it 'returns Pending error if the user is banned' do - banned_user = create(:user, password: 'Password1!', status: :pending) - - post :create, params: { - session: { - email: banned_user.email, - password: 'Password1!' - } - } - - expect(response.parsed_body['errors']).to eq('PendingUser') - end - it 'logs in with greenlight account before bn account' do post :create, params: { session: { email: user.email, password: 'Password1!' } } expect(response).to have_http_status(:ok) @@ -107,6 +67,76 @@ expect(response).to have_http_status(:ok) expect(session[:session_token]).to eq(super_admin.reload.session_token) end + + context 'errors' do + it 'returns unauthorized if the user is already signed in' do + sign_in_user(user) + + post :create, params: { + session: { + email: 'email@email.com', + password: 'Password1!', + extend_session: false + } + }, as: :json + + expect(response).to be_unauthorized + end + + it 'returns forbidden if the external auth is enabled' do + allow(controller).to receive(:external_auth?).and_return(true) + + post :create, params: { + session: { + email: 'email@email.com', + password: 'Password1!', + extend_session: false + } + }, as: :json + + expect(response).to be_forbidden + end + + it 'returns UnverifiedUser error if the user is not verified' do + unverified_user = create(:user, password: 'Password1!', verified: false) + + post :create, params: { + session: { + email: unverified_user.email, + password: 'Password1!' + } + } + + expect(response.parsed_body['data']).to eq(unverified_user.id) + expect(response.parsed_body['errors']).to eq('UnverifiedUser') + end + + it 'returns BannedUser error if the user is banned' do + banned_user = create(:user, password: 'Password1!', status: :banned) + + post :create, params: { + session: { + email: banned_user.email, + password: 'Password1!' + } + } + + expect(response.parsed_body['errors']).to eq('BannedUser') + end + + it 'returns Pending error if the user is banned' do + banned_user = create(:user, password: 'Password1!', status: :pending) + + post :create, params: { + session: { + email: banned_user.email, + password: 'Password1!' + } + } + + expect(response.parsed_body['errors']).to eq('PendingUser') + end + end end describe '#destroy' do From 6227a46d38e60760fc0830401f20a1b2fdabd98a Mon Sep 17 00:00:00 2001 From: Daniel Molkentin Date: Mon, 20 Nov 2023 21:59:47 +0100 Subject: [PATCH 12/68] feat(migrations): Import password digests from Greenlight2 (#5507) * feat(migrations): Import password digests from Greenlight2 * Update external_controller.rb * Update external_controller.rb --------- Co-authored-by: Ahmad Farhat Co-authored-by: Ahmad Farhat --- .../api/v1/migrations/external_controller.rb | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/app/controllers/api/v1/migrations/external_controller.rb b/app/controllers/api/v1/migrations/external_controller.rb index f5191878ad5..717af9694dd 100644 --- a/app/controllers/api/v1/migrations/external_controller.rb +++ b/app/controllers/api/v1/migrations/external_controller.rb @@ -75,7 +75,7 @@ def create_role end # POST /api/v1/migrations/users.json - # Expects: { user: { :name, :email, :external_id, :language, :role } } + # Expects: { user: { :name, :email, :password_digest, :provider, :external_id, :language, :role } } # Returns: { data: Array[serializable objects] , errors: Array[String] } # Does: Creates a user. def create_user @@ -103,10 +103,8 @@ def create_user return render_error(status: :bad_request, errors: user&.errors&.to_a) unless user.save - if user_hash[:provider] != 'greenlight' - user.password_digest = nil - user.save(validations: false) - end + user.password_digest = user_hash[:provider] == 'greenlight' ? user_hash[:password_digest] : nil + user.save(validations: false) render_data status: :created end @@ -228,7 +226,7 @@ def role_params end def user_params - decrypted_params.require(:user).permit(:name, :email, :provider, :external_id, :language, :role, :created_at) + decrypted_params.require(:user).permit(:name, :email, :password_digest, :provider, :external_id, :language, :role, :created_at) end def room_params From f675c6c6b483c8b16b0d57591bfad6afe1194080 Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Tue, 21 Nov 2023 09:49:43 -0500 Subject: [PATCH 13/68] Translate config/locales/en.yml in ar (#5550) 100% translated source file: 'config/locales/en.yml' on 'ar'. Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com> --- config/locales/ar.yml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/config/locales/ar.yml b/config/locales/ar.yml index a2d57909d90..50f99d3f94d 100644 --- a/config/locales/ar.yml +++ b/config/locales/ar.yml @@ -65,6 +65,13 @@ ar: get_started: للتسجيل ، يرجى النقر فوق الزر أدناه واتباع الخطوات. valid_invitation: الدعوة صالحة لمدة 24 ساعة. sign_up: التسجيل + new_user_signup: + new_user: تسجيل مستخدم جديد + new_user_description: قام مستخدم جديد بالتسجيل لاستخدام بك بلو بتن. + name: "الاسم: %{name}" + email: "البريد: %{email}" + admin_panel: "لوحة الإدارة" + take_action: "لعرض المستخدم الجديد أو اتخاذ الإجراء اللازم، قم بزيارة لوحة الادارة" reset: password_reset: إعادة تعيين كلمة المرور password_reset_requested: "تم طلب إعادة تعيين كلمة المرور لـ %{email}." From 541f8bc78cd04693e6c97776834416ec9ebc3dad Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Tue, 21 Nov 2023 09:49:51 -0500 Subject: [PATCH 14/68] Translate config/locales/en.yml in fa_IR (#5549) 100% translated source file: 'config/locales/en.yml' on 'fa_IR'. Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com> --- config/locales/fa_IR.yml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/config/locales/fa_IR.yml b/config/locales/fa_IR.yml index 53e1eaf7e77..c522174169f 100644 --- a/config/locales/fa_IR.yml +++ b/config/locales/fa_IR.yml @@ -65,6 +65,13 @@ fa_IR: get_started: برای ثبت‌نام، لطفا روی دکمهٔ زیر کلیک کنید و گام‌ها را دنبال کنید. valid_invitation: دعوت‌نامه فقط ۴۸ ساعت اعتبار دارد. sign_up: ثبت‌نام + new_user_signup: + new_user: ثبت نام کاربر جدید + new_user_description: یک کاربر جدید برای استفاده از BigBlueButton ثبت نام کرده است. + name: "نام: %{name}" + email: "ایمیل: %{email}" + admin_panel: "پنل مدیر کل" + take_action: "برای مشاهده کاربر جدید یا انجام اقدامات لازم، به پنل مدیر مراجعه کنید" reset: password_reset: بازنشانی گذرواژه password_reset_requested: "بازنشانی گذرواژه برای %{email} درخواست شده‌است." From fda25486c5e8d61403c11336a749e6ea0d1b40fc Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Tue, 21 Nov 2023 09:50:03 -0500 Subject: [PATCH 15/68] Translate app/assets/locales/en.json in fa_IR (#5548) 100% translated source file: 'app/assets/locales/en.json' on 'fa_IR'. Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com> --- app/assets/locales/fa_IR.json | 373 +++++++++++++++++----------------- 1 file changed, 189 insertions(+), 184 deletions(-) diff --git a/app/assets/locales/fa_IR.json b/app/assets/locales/fa_IR.json index c249902625e..f787efe242f 100644 --- a/app/assets/locales/fa_IR.json +++ b/app/assets/locales/fa_IR.json @@ -1,7 +1,7 @@ { "start": "شروع", "search": "جستجو", - "home": "صفحه اصلی", + "home": "صفحهٔ خانه", "previous": "قبلی", "back": "بازگشت", "next": "بعدی", @@ -9,52 +9,52 @@ "join": "پیوستن", "edit": "ویرایش", "save": "ذخیره", - "save_changes": "ذخیره تغییرات", + "save_changes": "ذخیرهٔ تغییرات", "update": "به‌روزرسانی", "report": "گزارش", - "share": "اشتراک گذاری", + "share": "هم‌رسانی", "cancel": "انصراف", "close": "بستن", "delete": "حذف", - "copy": "کپی پیوند عضویت", + "copy": "رونوشت پیوند عضویت", "or": "یا", "online": "آنلاین", "help_center": "مرکز راهنمایی", - "are_you_sure": "آیا مطمئنی؟", - "return_home": "بازگشت به صفحه اصلی", - "created_at": "ایجاد شده در", + "are_you_sure": "آیا مطمئن هستید؟", + "return_home": "بازگشت به صفحهٔ خانه", + "created_at": "ایجادشده در", "view_recordings": "مشاهدهٔ ضبط‌شده‌ها", "join_session": "پیوستن به نشست", "no_result_search_input": "هیچ نتیجه‌ای برای «{{ searchInput }}» یافت نشد", "action_permanent": "این عمل قابل بازگردانی نیست.", "homepage": { "welcome_bbb": "به BigBlueButton خوش آمدید.", - "bigbluebutton_description": "BigBlueButton یک سیستم کنفرانس وب متن باز برای کلاس‌های آنلاین است. این پلتفرم زمان را برای یادگیری کاربردی به حداکثر می‌رساند و به دانش‌اموزان امکاناتی ارائه می‌دهد تا با یکدیگر همکاری کنند و بازخورد دریافت کنند.", - "greenlight_description": "اتاق‌های خود را برای میزبانی جلسات با استفاده از یک پیوند کوتاه و راحت برای پیوستن دیگران ایجاد کنید.", - "learn_more": "درباره BigBlueButton بیشتر بدانید", + "bigbluebutton_description": "BigBlueButton یک سیستم کنفرانس وب متن‌باز برای کلاس‌های آنلاین است. این سکو زمان یادگیری کاربردی را به حداکثر می‌رساند و به دانش‌اموزان امکاناتی ارائه می‌دهد تا با یک‌دیگر همکاری کنند و در لحظه بازخورد دریافت کنند.", + "greenlight_description": "اتاق‌های خود را برای میزبانی جلسات ایجاد کنید یا با استفاده از یک پیوند کوتاه و راحت به اتاق‌های دیگران بپیوندید.", + "learn_more": "دربارهٔ BigBlueButton بیشتر بدانید", "explore_features": "کاوش ویژگی‌های ما", - "meeting_title": " راه‌اندازی جلسه", - "meeting_description": "یک کلاس مجازی به صورت ویدیوای، صوتی، اشتراک گذاری صفحه نمایش، گفتگو و تمام ابزارهای مورد نیاز برای یادگیری کاربردی راه‌اندازی کنید.", - "recording_title": "ضبط جلسات خود", - "recording_description": "جلسات BigBlueButton را ضبط کنید و آنها را با دانش‌آموزان به اشتراک بگذارید تا مطالب را دوباره بررسی و مشاهده کنند.", + "meeting_title": " راه‌اندازی یک جلسه", + "meeting_description": "یک کلاس مجازی به همراه ویدیو، صدا، اشتراک‌گذاری صفحه نمایش، گپ و تمام ابزارهای مورد نیاز برای یادگیری کاربردی راه‌اندازی کنید.", + "recording_title": "جلسات خود را ضبط کنید", + "recording_description": "جلسات BigBlueButton را ضبط کنید و آنها را با دانش‌آموزان هم‌رسانی کنید تا مطالب را بررسی و روی آن فکر کنند.", "settings_title": "مدیریت اتاق‌های خود", "settings_description": "تنظیمات اتاق‌ها و جلسه خود را به گونه‌ای پیکربندی کنید که در روند کلاسی تأثیر بهتری داشته باشد.", - "and_more_title": "و بیشتر!", + "and_more_title": "و موارد بیشتر!", "and_more_description": "BigBlueButton برای یادگیری کاربردی، ابزارهای درونی مختلفی را ارائه می‌کند و برای صرفه‌جویی در وقت شما در طول کلاس طراحی شده است.", "enter_meeting_url": "نشانی اینترنتی جلسه را وارد کنید", - "enter_meeting_url_instruction": "لطفا نشانی اینترنتی جلسه BigBlueButton خود را در فیلد زیر وارد کنید." + "enter_meeting_url_instruction": "لطفا نشانی اینترنتی جلسه BigBlueButton خود را در زمینهٔ متنی زیر وارد کنید." }, "authentication": { "sign_in": "ورود", - "sign_up": "ثبت نام", + "sign_up": "ثبت‌نام", "sign_out": "خروج", - "email": "ایمیل", + "email": "رایانامه", "password": "گذرواژه", - "confirm_password": "تایید گذرواژه", - "enter_email": "ایمیل خود را وارد کنید", + "confirm_password": "تأیید گذرواژه", + "enter_email": "رایانامهٔ خود را وارد کنید", "enter_name": "نام خود را وارد کنید", "remember_me": "مرا به خاطر بسپار", - "forgot_password": "رمز عبور را فراموش کرده‌اید؟", + "forgot_password": "گذرواژه را فراموش کرده‌اید؟", "dont_have_account": "حساب کاربری ندارید؟", "create_account": "ایجاد حساب کاربری", "create_an_account": "ایجاد یک حساب کاربری", @@ -64,11 +64,11 @@ "user": "کاربر", "users": "کاربران", "name": "نام", - "email_address": "نشانی ایمیل", - "authenticator": "احراز هویت", + "email_address": "نشانی رایانامه", + "authenticator": "احرازگر هویت", "full_name": "نام کامل", "no_user_found": "هیچ کاربری پیدا نشد", - "type_three_characters": "لطفا سه «۳» کاراکتر یا بیشتر برای نمایش دیگر کاربران تایپ کنید.", + "type_three_characters": "لطفا سه «۳» نویسه یا بیشتر برای نمایش دیگر کاربران تایپ کنید.", "search_not_found": "هیچ کاربری پیدا نشد", "profile": { "profile": "نمایه", @@ -81,24 +81,25 @@ "account_info": "اطلاعات حساب کاربری", "delete_account": "حذف حساب کاربری", "change_password": "تغییر گذرواژه", + "set_password": "گذرواژهٔ جدید خود را وارد کنید", "reset_password": "بازنشانی گذرواژه", "update_account_info": "به‌روزرسانی اطلاعات حساب کاربری", - "current_password": "گذرواژه فعلی", - "new_password": "گذرواژه جدید", - "confirm_password": "تایید گذرواژه", + "current_password": "گذرواژهٔ فعلی", + "new_password": "گذرواژهٔ جدید", + "confirm_password": "تأیید گذرواژه", "permanently_delete_account": "حساب کاربری خود را برای همیشه حذف کنید", - "delete_account_description": "اگر حساب کاربری خود را حذف کنید، قابل بازیابی نخواهد بود.\nتمام اطلاعات مربوط به حساب کاربری شما، از جمله تنظیمات، اتاق‌ها و موارد ضبط شده حذف خواهد شد.", + "delete_account_description": "اگر حساب کاربری خود را حذف کنید، قابل بازیابی نخواهد بود.\nتمام اطلاعات مربوط به حساب کاربری شما، از جمله تنظیمات، اتاق‌ها و موارد ضبط‌شده حذف خواهند شد.", "delete_account_confirmation": "بله، من می‌خواهم حساب کاربریم را حذف کنم", "are_you_sure_delete_account": "آیا مطمئن هستید که می‌خواهید حساب کاربری خود را حذف کنید؟" }, "avatar": { - "upload_avatar": "بارگذاری آواتار", - "delete_avatar": "حذف آواتار", - "crop_avatar": "برش آواتار شما" + "upload_avatar": "بارگذاری تصویر نمایه", + "delete_avatar": "حذف تصویر نمایه", + "crop_avatar": "برش تصویر نمایهٔ شما" }, "pending": { "title": "در انتظار ثبت‌نام", - "message": "ممنون از اینکه ثبت نام کردید! حساب کاربری شما در حال حاضر در انتظار تایید توسط مدیر کل است." + "message": "ممنون از این‌که ثبت‌نام کردید! حساب کاربری شما در حال حاضر در انتظار تأیید توسط یک مدیر کل است." } }, "room": { @@ -110,44 +111,45 @@ "delete_room": "حذف اتاق", "create_new_room": "ایجاد اتاق جدید", "enter_room_name": "نام اتاق را وارد کنید", - "shared_by": "اشتراک گذاشته شده توسط", + "shared_by": "هم‌رسانی‌شده توسط", "last_session": "آخرین جلسه: {{ localizedTime }}", "no_last_session": "هنوز هیچ جلسه‌ای از قبل ایجاد نشده است", "search_not_found": "هیچ اتاقی پیدا نشد", "rooms_list_is_empty": "شما هنوز هیچ اتاقی ندارید!", - "rooms_list_empty_create_room": "با کلیک بر روی دکمه زیر و وارد کردن نام اتاق، اولین اتاق خود را ایجاد کنید.", + "rooms_list_empty_create_room": "با کلیک بر روی دکمهٔ زیر و وارد کردن نام اتاق، اولین اتاق خود را ایجاد کنید.", "meeting": { "start_meeting": "شروع جلسه", - "join_meeting": "به جلسه بپیوندید", + "join_meeting": "پیوستن به جلسه", "meeting_invitation": "شما برای پیوستن به جلسه دعوت شده‌اید", "meeting_not_started": "جلسه هنوز شروع نشده است", - "join_meeting_automatically": "با شروع جلسه به طور خودکار به آن ملحق خواهید شد", - "recording_consent": "من اذعان دارم که این جلسه ممکن است، ضبط شود. این ممکن است شامل صدا و ویدیو من در صورت فعال شدن، باشد." + "join_meeting_automatically": "با شروع جلسه، به طور خودکار به آن خواهید پیوست.", + "recording_consent": "من متوجه هستم که این جلسه ممکن است ضبط شود. این ممکن است شامل صدا و ویدیوی من در صورت فعال‌بودن نیز باشد." }, "presentation": { "presentation": "ارائه", "click_to_upload": "برای بارگذاری کلیک کنید", "drag_and_drop": " یا بکشید و رها کنید", "upload_description": "هر سند اداری یا پرونده PDF (بزرگتر از {{size}}) را بارگذاری کنید. بسته به اندازه پرونده، ممکن است به زمان بیشتری برای بارگذاری نیاز باشد تا بتوان از آن استفاده کرد.", + "delete_presentation": "حذف ارائه", "are_you_sure_delete_presentation": "آیا مطمئن هستید که می‌خواهید این ارائه را حذف کنید؟" }, "shared_access": { "access": "دسترسی", - "add_share_access": "+ اشتراک گذاری دسترسی", - "share_room_access": "دسترسی به اتاق را به اشتراک بگذارید", - "add_some_users": "زمان افزودن چند کاربر است!", - "add_some_users_description": "برای افزودن کاربران جدید، روی دکمه زیر کلیک کنید و کاربرانی را که می‌خواهید این اتاق را با آنها به اشتراک بگذارید، جستجو یا انتخاب کنید.", + "add_share_access": "+ هم‌رسانی دسترسی", + "share_room_access": "هم‌رسانی دسترسی به اتاق", + "add_some_users": "اکنون زمان افزودن چند کاربر است!", + "add_some_users_description": "برای افزودن کاربران جدید، روی دکمهٔ زیر کلیک کنید و کاربرانی را که می‌خواهید این اتاق را با آنها هم‌رسانی کنید، جستجو یا انتخاب کنید.", "delete_shared_access": "حذف دسترسی هم‌رسانی‌شده", - "are_you_sure_delete_shared_access": "آیا مطمئن هستید که می‌خواهید این دسترسی اشتراک گذاری را حذف کنید؟" + "are_you_sure_delete_shared_access": "آیا مطمئن هستید که می‌خواهید این دسترسی هم‌رسانی‌شده را حذف کنید؟" }, "settings": { "settings": "تنظیمات", "room_name": "نام اتاق", "user_settings": "تنظیمات کاربر", "allow_room_to_be_recorded": "اجازه دهید اتاق ضبط شود", - "require_signed_in": "کاربران قبل از پیوستن به جلسه، ملزم به ورود به سیستم شوند", - "require_signed_in_message": "برای پیوستن به این اتاق باید وارد سیستم شوید.", - "require_mod_approval": "قبل از پیوستن به جلسه نیاز به تایید مدیر باشد", + "require_signed_in": "کاربران قبل از ورود به جلسه، نیازمند ورود به سیستم باشند", + "require_signed_in_message": "برای پیوستن به این اتاق باید وارد حساب کاربری خود شوید.", + "require_mod_approval": "قبل از پیوستن به جلسه نیاز به تأیید مدیر باشد", "allow_any_user_to_start": "به هر کاربری اجازه دهید این جلسه را شروع کند", "all_users_join_as_mods": "همه کاربران به عنوان مدیر عضو شوند", "mute_users_on_join": "کاربران هنگام پیوستن بی‌صدا شوند", @@ -163,45 +165,46 @@ } }, "recording": { - "recording": "در حال ضبط", - "recordings": "ضبط شده‌ها", + "recording": "ضبط", + "recordings": "ضبط‌شده‌ها", + "processing": "درحال پردازش ضبط‌ها", "name": "نام", "length": "طول مدت", "users": "کاربران", - "visibility": "قابلیت دیدن", + "visibility": "قابلیت مشاهده", "formats": "قالب‌ها", - "published": "منتشر شده", - "unpublished": "منتشر نشده", - "protected": "محافظت شده", + "published": "منتشرشده", + "unpublished": "منتشرنشده", + "protected": "محافظت‌شده", "public": "عمومی", "public_protected": "عمومی/محافظت‌شده", "length_in_minutes": "{{recording.length}} دقیقه.", - "processing_recording": "در حال پردازش ضبط، این‌کار ممکن است چند دقیقه طول بکشد...", - "copy_recording_urls": "کپی نشانی(های) ضبط شده", - "recordings_list_empty": "شما هنوز هیچ جلسه ضبط شده‌ای ندارید!", + "processing_recording": "در حال پردازش ضبط؛ این‌کار ممکن است چند دقیقه طول بکشد...", + "copy_recording_urls": "رونوشت نشانی(های) ضبط", + "recordings_list_empty": "شما هنوز هیچ جلسهٔ ضبط‌شده‌ای ندارید!", "public_recordings_list_empty": "هنوز هیچ ضبط عمومی‌ای وجود ندارد!", "recordings_list_empty_description": "بعد از شروع جلسه و ضبط آن، موارد ضبط‌شده در این‌جا نمایان می‌شوند.", "public_recordings_list_empty_description": "موارد ضبط‌شده هنگامی که موجود شوند در این‌جا پدیدار خواهند شد.", "delete_recording": "حذف ضبط", - "are_you_sure_delete_recording": "آیا مطمئنید که می‌خواهید این ضبط را حذف کنید؟", + "are_you_sure_delete_recording": "آیا مطمئن هستید که می‌خواهید این ضبط را حذف کنید؟", "search_not_found": "هیچ ضبطی یافت نشد" }, "admin": { - "admin_panel": "پنل مدیر کل", + "admin_panel": "تابلوی مدیر کل", "manage_users": { "manage_users": "مدیریت کاربران", "active": "فعال", - "approve": "تایید", - "decline": "رد کردن", + "approve": "تأیید", + "decline": "ردکردن", "pending": "در انتظار", - "banned": "مسدود شده", + "banned": "مسدودشده", "ban": "مسدود", "unban": "لغو مسدودیت", - "deleted": "حذف شده", - "invited_tab": "دعوت شده", + "deleted": "حذف‌شده", + "invited_tab": "دعوت‌شده", "invite_user": "دعوت از کاربر", - "send_invitation": "ارسال دعوتنامه", - "enter_user_email": "ایمیل کاربر را وارد کنید", + "send_invitation": "ارسال دعوت‌نامه", + "enter_user_email": "رایانامهٔ کاربر را وارد کنید", "new_user": "کاربر جدید", "add_new_user": "کاربر جدید", "create_new_user": "ایجاد کاربر جدید", @@ -216,14 +219,14 @@ "delete_account_warning": "اگر این حساب کاربری را حذف کنید، قابل بازیابی نخواهد بود.", "empty_active_users": "هنوز هیچ کاربر فعالی در این سرور وجود ندارد!", "empty_active_users_subtext": "هنگامی که وضعیت یک کاربر به فعال تغییر می‌کند، در اینجا نمایان می‌شوند.", - "empty_pending_users": "هنوز هیچ کاربر در انتظار تایید در این سرور وجود ندارد!", - "empty_pending_users_subtext": "هنگامی که وضعیت یک کاربر به در انتظارِ تایید تغییر می‌کند، در اینجا نمایان می‌شوند.", - "empty_banned_users": "هنوز هیچ کاربر مسدود شده‌ای در این سرور وجود ندارد!", - "empty_banned_users_subtext": "هنگامی که وضعیت یک کاربر به مسدود شده تغییر می‌کند، در اینجا نمایان می‌شوند.", + "empty_pending_users": "هنوز هیچ کاربر درانتظار تأیید در این سرور وجود ندارد!", + "empty_pending_users_subtext": "هنگامی که وضعیت یک کاربر به در انتظارِ تأیید تغییر می‌کند، در اینجا نمایان می‌شوند.", + "empty_banned_users": "هنوز هیچ کاربر مسدودشده‌ای در این سرور وجود ندارد!", + "empty_banned_users_subtext": "هنگامی که وضعیت یک کاربر به مسدودشده تغییر می‌کند، در اینجا نمایان می‌شوند.", "empty_invited_users": "هنوز هیچ کاربر دعوت‌شده‌ای در این سرور وجود ندارد!", "empty_invited_users_subtext": "هنگامی که وضعیت یک کاربر به دعوت‌شده تغییر می‌کند، در اینجا نمایان می‌شوند.", "invited": { - "time_sent": "زمان ارسال شده", + "time_sent": "زمان ارسال‌شده", "valid": "معتبر" } }, @@ -232,22 +235,22 @@ "name": "نام", "owner": "صاحب", "room_id": "شناسه اتاق", - "participants": "شركت كنندگان", + "participants": "شركت‌كنندگان", "status": "وضعیت", "running": "در حال اجرا", "not_running": "در حال اجرا نیست", "active": "فعال", - "current_session": "جلسه فعلی: {{lastSession}}", + "current_session": "جلسهٔ کنونی: {{lastSession}}", "last_session": "آخرین جلسه: {{localizedTime}}", "no_meeting_yet": "هنوز هیچ جلسه‌ای وجود ندارد.", "delete_server_rooms": "حذف اتاق سرور", - "resync_recordings": "همگام‌سازی مجدد ضبط شده‌ها", + "resync_recordings": "همگام‌سازی مجدد ضبط‌شده‌ها", "empty_room_list": "هنوز هیچ اتاق سروری وجود ندارد!", - "empty_room_list_subtext": "پس از اینکه اولین اتاق خود را ایجاد کنید در اینجا نمایان می‌شوند." + "empty_room_list_subtext": "اتاق‌ها پس از این‌که اولین اتاق خود را ایجاد کنید در اینجا نمایان می‌شوند." }, "server_recordings": { - "server_recordings": "سرور ضبط شده‌ها", - "latest_recordings": "آخرین موارد ضبط شده", + "server_recordings": "ضبط‌شده‌های سرور", + "latest_recordings": "آخرین ضبط‌شده‌ها", "no_recordings_found": "هیچ ضبطی یافت نشد." }, "site_settings": { @@ -265,37 +268,37 @@ "remove_branding_image": "حذف تصویر برند" }, "administration": { - "administration": "مدیر کل", + "administration": "مدیریت", "terms": "شرایط و ضوابط", "privacy": "سیاست حفظ حریم خصوصی", "privacy_policy": "سیاست حفظ حریم خصوصی", - "change_term_links": "تغییر مقررات پیوندهایی که در پایین صفحه ظاهر می‌شوند", - "change_privacy_link": "پیوند حریم خصوصی که در پایین صفحه ظاهر می‌شود را تغییر دهید", + "change_term_links": "تغییر پیوندهای مقررات که در پایین صفحه نمایان می‌شوند", + "change_privacy_link": "پیوند حریم خصوصی که در پایین صفحه نمایان می‌شود را تغییر دهید", "change_url": "تغییر نشانی اینترنتی", "enter_link": "پیوند را اینجا وارد کنید" }, "settings": { "settings": "تنظیمات", - "allow_users_to_share_rooms": "به کاربران اجازه دهید، اتاق‌ها را به اشتراک بگذارند", - "allow_users_to_share_rooms_description": "تنظیمات غیرفعال باشد، دکمه‌ها از منوی کشویی گزینه‌های اتاق حذف می‌شود و از اشتراک‌گذاری اتاق توسط کاربران جلوگیری می‌کند", + "allow_users_to_share_rooms": "به کاربران اجازه دهید اتاق‌ها را هم‌رسانی کنند", + "allow_users_to_share_rooms_description": "تنظیم برروی غیرفعال، دکمه را از فهرست کشویی گزینه‌های اتاق حذف می‌کند و از هم‌رسانی اتاق‌ها توسط کاربران جلوگیری می‌کند", "allow_users_to_preupload_presentation": "به کاربران اجازه دهید تا ارائه‌ها را از قبل بارگذاری کنند", - "allow_users_to_preupload_presentation_description": "کاربران می‌توانند یک ارائه را از قبل بارگذاری کنند تا به عنوان ارائه پیش‌فرض برای آن اتاق خاص استفاده شود" + "allow_users_to_preupload_presentation_description": "کاربران می‌توانند یک ارائه را از قبل بارگذاری کنند تا به عنوان ارائهٔ پیش‌فرض برای آن اتاق خاص استفاده شود" }, "registration": { - "registration": "ثبت نام", - "role_mapping_by_email": "اعطا نقش از طریق ایمیل", - "role_mapping_by_email_description": "با استفاده از ایمیل کاربر نقشی بهش اعطا کنید. باید در قالب: role1=email1، role2=email2 باشد", - "enter_role_mapping_rule": "یک قانون اعطا نقش را وارد کنید", + "registration": "ثبت‌نام", + "role_mapping_by_email": "سپردن نقش از طریق رایانامه", + "role_mapping_by_email_description": "با استفاده از رایانامهٔ کاربر نقشی به او بسپارید. باید در قالب: role1=email1, role2=email2 باشد", + "enter_role_mapping_rule": "یک قانون سپردن نقش را وارد کنید", "resync_on_login": "همگام‌سازی مجدد داده‌های کاربر در هر بار ورود", - "resync_on_login_description": "هر بار که کاربر وارد سیستم می‌شود، اطلاعات کاربر را مجددا همگام‌سازی می‌کند و باعث می‌شود که ارائه‌دهنده احراز هویت خارجی همیشه با اطلاعات موجود در Greenlight مطابقت داشته باشد.", + "resync_on_login_description": "هر بار که کاربر وارد سیستم می‌شود، اطلاعات کاربر را مجددا همگام‌سازی می‌کند و باعث می‌شود که ارائه‌دهندهٔ احراز هویت خارجی همیشه با اطلاعات موجود در Greenlight مطابقت داشته باشد.", "default_role": "نقش پیش‌فرض", - "default_role_description": "نقش پیش‌فرضی که به کاربران تازه ایجاد شده اختصاص داده می‌شود", - "registration_method": "روش ثبت نام", - "registration_method_description": "نحوه ثبت نام کاربران در وب‌سایت را تغییر دهید", + "default_role_description": "نقش پیش‌فرضی که به کاربران تازهٔ ایجاد‌شده اختصاص داده می‌شود", + "registration_method": "روش ثبت‌نام", + "registration_method_description": "نحوه ثبت‌نام کاربران در وب‌سایت را تغییر دهید", "registration_methods" : { - "open": "باز کردن ثبت نام", - "invite": "پیوستن با دعوتنامه", - "approval": "تایید/رد کردن" + "open": "بازکردن ثبت‌نام", + "invite": "پیوستن با دعوت‌نامه", + "approval": "تأیید/رد" } } }, @@ -304,24 +307,24 @@ "default": "اختیاری (پیش‌فرض: فعال‌شده)", "optional": "اختیاری (پیش‌فرض: غیرفعال‌شده)", "enabled": "اجباری فعال‌شده", - "disabled": "غیرفعال شد", + "disabled": "غیرفعال‌شده", "configurations": { "allow_room_to_be_recorded": "اجازه دهید اتاق ضبط شود", - "allow_room_to_be_recorded_description": "به صاحبان اتاق اجازه می‌دهد تعیین کنند که آیا می‌خواهند، اتاق را ضبط کنند یا خیر. اگر فعال باشد، مدیر همچنان باید پس از شروع جلسه، روی دکمه «ضبط» کلیک کند.", - "require_user_signed_in": "کاربران قبل از پیوستن به جلسه، ملزم به ورود به سیستم شوند", - "require_user_signed_in_description": "فقط به کاربرانی که دارای حساب کاربری در Greenlight هستند، اجازه می‌دهد به جلسه بپیوندند. اگر وارد سیستم نشده باشند، هنگام تلاش برای پیوستن به اتاق، به صفحه ورود هدایت می‌شوند.", + "allow_room_to_be_recorded_description": "به صاحبان اتاق اجازه می‌دهد تعیین کنند که آیا می‌خواهند امکان ضبط اتاق را داشته باشند یا خیر. اگر فعال باشد، مدیر همچنان باید پس از شروع جلسه، روی دکمهٔ «ضبط» کلیک کند.", + "require_user_signed_in": "کاربران قبل از ورود به جلسه، نیازمند ورود به سیستم باشند", + "require_user_signed_in_description": "فقط به کاربرانی که دارای حساب کاربری در Greenlight هستند اجازه می‌دهد به جلسه بپیوندند. اگر وارد سیستم نشده باشند، هنگام تلاش برای پیوستن به اتاق، به صفحهٔ ورود هدایت می‌شوند.", "require_mod_approval": "قبل از پیوستن به جلسه نیاز به تایید مدیر باشد", - "require_mod_approval_description": "هنگامی که کاربر سعی می‌کند به جلسه بپیوندد، از مدیر جلسه BigBlueButton درخواست می‌کند. در صورت تایید کاربر، می‌تواند به جلسه بپیوندد.", + "require_mod_approval_description": "هنگامی که یک کاربر سعی می‌کند به جلسه بپیوندد، از مدیر جلسه BigBlueButton درخواست می‌کند. در صورت تأییدشدن کاربر، می‌تواند به جلسه بپیوندد.", "allow_any_user_to_start_meeting": "به هر کاربری اجازه دهید تا جلسه را شروع کند", "allow_any_user_to_start_meeting_description": "به هر کاربری اجازه دهید جلسه را در هر زمانی که خواست شروع کند. به‌طور پیش‌فرض، فقط صاحب اتاق می‌تواند جلسه را شروع کند.", - "allow_users_to_join_as_mods": "همه کاربران به عنوان مدیر عضو شوند", - "allow_users_to_join_as_mods_description": "به همه کاربران هنگام پیوستن به جلسه، در BigBlueButton اختیارات مدیر را می‌دهد", + "allow_users_to_join_as_mods": "همهٔ کاربران به عنوان مدیر بپیوندند", + "allow_users_to_join_as_mods_description": "به همهٔ کاربران هنگام پیوستن به جلسه، در BigBlueButton اختیارات مدیر را می‌دهد", "mute_users_on_join": "کاربران هنگام پیوستن بی‌صدا شوند", - "mute_users_on_join_description": "هنگامی که کاربر به جلسه BigBlueButton می‌پیوندد، به‌طور خودکار بی‌صدا می‌شود", + "mute_users_on_join_description": "هنگامی که کاربر به جلسهٔ BigBlueButton می‌پیوندد، به‌طور خودکار بی‌صدا می‌شود", "viewer_access_code": "کد دسترسی بینندگان", - "viewer_access_code_description": "به صاحبان اتاق اجازه می‌دهد تا یک کد الفبایی تصادفی داشته باشند که می‌تواند با کاربران به اشتراک بگذارند. در صورت تولید کد، برای پیوستن کاربران به جلسات اتاق الزامی است.", + "viewer_access_code_description": "به صاحبان اتاق اجازه می‌دهد تا یک کد الفبایی تصادفی داشته باشند که می‌تواند با کاربران هم‌رسانی شود. اگر کد تولید شده باشد، برای پیوستن کاربران به جلسات اتاق الزامی است.", "mod_access_code": "کد دسترسی مدیر", - "mod_access_code_description": "به صاحبان اتاق اجازه می‌دهد تا یک کد الفبایی تصادفی داشته باشند که می‌تواند با کاربران به اشتراک بگذارند. کد، در صورت تولید، مورد نیاز نخواهد بود و در صورت استفاده در هر جلسه اتاق، کاربر به عنوان مدیر ملحق خواهد شد." + "mod_access_code_description": "به صاحبان اتاق اجازه می‌دهد تا یک کد الفبایی تصادفی داشته باشند که می‌تواند با کاربران هم‌رسانی کنند. کد، در صورت تولید، مورد نیاز نخواهد بود و در صورت استفاده در هر جلسه اتاق، کاربر به عنوان مدیر به جلسه خواهد پیوست." } }, "roles": { @@ -343,93 +346,95 @@ "record": "به کاربران دارای این نقش اجازه دهید تا جلسات خود را ضبط کنند", "manage_users": "به کاربران دارای این نقش اجازه دهید تا کاربران را مدیریت کنند", "manage_rooms": "به کاربران دارای این نقش اجازه دهید تا اتاق‌های سرور را مدیریت کنند", - "manage_recordings": "به کاربران دارای این نقش اجازه دهید تا جلسات ضبط‌شده سرور را مدیریت کنند", + "manage_recordings": "به کاربران دارای این نقش اجازه دهید تا جلسات ضبط‌شدهٔ سرور را مدیریت کنند", "manage_site_settings": "به کاربران دارای این نقش اجازه دهید تا تنظیمات سایت را مدیریت کنند", "manage_roles": "به کاربران دارای این نقش اجازه دهید تا دیگر نقش‌ها را ویرایش کنند", - "shared_list": "کاربران دارای این نقش را در فهرست کشویی اشتراک‌گذاری اتاق‌ها بگنجانید", - "room_limit": "محدودیت اتاق" + "shared_list": "کاربران دارای این نقش را در فهرست کشویی هم‌رسانی اتاق‌ها بگنجانید", + "room_limit": "محدودیت اتاق", + "email_on_signup": "دریافت ایمیل زمانی که یک کاربر جدید ثبت نام می‌کند" } } }, "toast": { "success": { "user": { - "user_created": "یک کاربر جدید ایجاد شده‌ است.", - "user_updated": "کاربر به‌روز شده‌ است.", - "user_deleted": "کاربر حذف شده‌ است.", - "avatar_updated": "تصویر نمایه به‌روز شده‌ است.", - "password_updated": "گذرواژه به‌روز شده‌ است.", - "account_activated": "حساب کاربری شما فعال شده‌ است.", - "activation_email_sent": "ایمیلی حاوی راهنماهای فعال‌سازی حساب کاربری شما ارسال شده‌ است.", - "reset_pwd_email_sent": "ایمیلی حاوی راهنماهای بازنشانی گذرواژه شما ارسال شده‌ است." + "user_created": "یک کاربر جدید ایجاد شده‌است.", + "user_updated": "کاربر به‌روز شده‌است.", + "user_deleted": "کاربر حذف شده‌است.", + "avatar_updated": "تصویر نمایه به‌روز شده‌است.", + "password_changed": "گذرواژهٔ شما با موفقیت به‌روزرسانی شد. لطفا دوباره وارد شوید.", + "password_updated": "گذرواژه به‌روز شده‌است.", + "account_activated": "حساب کاربری شما فعال شده‌است.", + "activation_email_sent": "رایانامه‌ای حاوی راهنماهای فعال‌سازی حساب کاربری شما ارسال شده‌است.", + "reset_pwd_email_sent": "رایانامه‌ای حاوی راهنماهای بازنشانی گذرواژه شما ارسال شده‌است." }, "session": { "signed_out": "از سیستم خارج شده‌اید." }, "room": { - "room_created": "یک اتاق جدید ایجاد شده‌ است.", - "room_updated": "اتاق به‌روز شده‌ است.", - "room_deleted": "اتاق حذف شده‌ است.", - "room_shared": "اتاق اشتراک‌گذاری شده‌ است.", - "room_unshared": "اشتراک‌گذاری اتاق لغو شده‌ است.", + "room_created": "یک اتاق جدید ایجاد شده‌است.", + "room_updated": "اتاق به‌روز شده‌است.", + "room_deleted": "اتاق حذف شده‌است.", + "room_shared": "اتاق هم‌رسانی شده‌است.", + "room_unshared": "هم‌رسانی اتاق لغو شده‌است.", "recordings_synced": "ضبط‌‌شده‌های اتاق همگام‌سازی شده‌اند.", - "room_configuration_updated": "پیکربندی اتاق به‌روز شده‌ است.", - "room_setting_updated": "تنظیمات اتاق به‌روز شده‌ است.", - "presentation_updated": "ارائه به‌روز شده‌ است.", - "presentation_deleted": "ارائه حذف شده‌ است.", + "room_configuration_updated": "پیکربندی اتاق به‌روز شده‌است.", + "room_setting_updated": "تنظیمات اتاق به‌روز شده‌است.", + "presentation_updated": "ارائه به‌روز شده‌است.", + "presentation_deleted": "ارائه حذف شده‌است.", "joining_meeting": "در حال پیوستن به جلسه...", "meeting_started": "جلسه شروع شد.", - "access_code_copied": "کد دسترسی کپی شده‌ است.", - "access_code_generated": "کد دسترسی تولید شده‌ است.", - "access_code_deleted": "کد دسترسی حذف شده‌ است.", - "copied_meeting_url": "نشانی اینترنتی جلسه کپی شده‌ است. این پیوند می‌تواند برای پیوستن به جلسه استفاده شود." + "access_code_copied": "کد دسترسی رونوشت شده‌است.", + "access_code_generated": "کد دسترسی تولید شده‌است.", + "access_code_deleted": "کد دسترسی حذف شده‌است.", + "copied_meeting_url": "نشانی اینترنتی جلسه رونوشت شده‌است. این پیوند می‌تواند برای پیوستن به جلسه استفاده شود." }, "site_settings": { "site_setting_updated": "تنظیمات سایت به‌روز شده‌اند.", - "brand_color_updated": "رنگ برند به‌روز شده‌ است.", - "brand_image_updated": "تصویر برند به‌روز شده‌ است.", - "brand_image_deleted": "تصویر برند حذف شده‌ است.", - "privacy_policy_updated": "سیاست حفظ حریم خصوصی به‌روز شده‌ است.", - "terms_of_service_updated": "شرایط خدمات به‌روز شده‌ است." + "brand_color_updated": "رنگ برند به‌روز شده‌است.", + "brand_image_updated": "تصویر برند به‌روز شده‌است.", + "brand_image_deleted": "تصویر برند حذف شده‌است.", + "privacy_policy_updated": "سیاست حفظ حریم خصوصی به‌روز شده‌است.", + "terms_of_service_updated": "شرایط خدمات به‌روز شده‌است." }, "recording": { - "recording_visibility_updated": "قابلیت مشاهده ضبط به‌روز شده‌ است.", - "recording_name_updated": "نام جلسه ضبط‌شده به‌روز شده‌ است.", - "recording_deleted": "جلسه ضبط‌شده حذف شده‌ است.", - "copied_urls": "نشانی‌های اینترنتی جلسه ضبط‌شده کپی شده‌ است." + "recording_visibility_updated": "قابلیت مشاهدهٔ ضبط به‌روز شده‌است.", + "recording_name_updated": "نام جلسهٔ ضبط‌شده به‌روز شده‌است.", + "recording_deleted": "جلسهٔ ضبط‌شده حذف شده‌است.", + "copied_urls": "نشانی‌های اینترنتی جلسهٔ ضبط‌شده رونوشت شده‌است." }, "role": { - "role_created": "یک نقش جدید ایجاد شده‌ است.", - "role_updated": "نقش به‌روز شده‌ است.", - "role_deleted": "نقش حذف شده‌ است.", - "role_permission_updated": "دسترسی نقش به‌روز شده‌ است." + "role_created": "یک نقش جدید ایجاد شده‌است.", + "role_updated": "نقش به‌روز شده‌است.", + "role_deleted": "نقش حذف شده‌است.", + "role_permission_updated": "دسترسی نقش به‌روز شده‌است." }, "invitations": { - "invitation_sent": "دعوت‌نامه ارسال شده‌ است." + "invitation_sent": "دعوت‌نامه ارسال شده‌است." } }, "error": { "problem_completing_action": "این عمل نمی‌تواند تکمیل شود.\nلطفا دوباره تلاش کنید.", "file_type_not_supported": "نوع پرونده پشتیبانی نمی‌شود.", - "file_size_too_large": "اندازه پرونده خیلی بزرگ است.", + "file_size_too_large": "اندازهٔ پرونده خیلی بزرگ است.", "file_upload_error": "پرونده نمی‌تواند بارگذاری شود.", "signin_required": "برای دسترسی به این صفحه باید وارد سیستم شده باشید.", "roles": { - "role_assigned": "این نقش نمی‌تواند حذف شود، زیرا به حداقل یک کاربر اختصاص داده شده‌ است." + "role_assigned": "این نقش نمی‌تواند حذف شود، زیرا به حداقل یک کاربر اختصاص داده شده‌است." }, "users": { "signup_error": "شما نمی‌توانید احراز هویت شوید. لطفا با مدیریت تماس بگیرید.", - "invalid_invite": "ژتون دعوتنامه شما یا نامعتبر است یا نادرست است. لطفا با مدیریت تماس بگیرید تا یک ژتون جدید دریافت کنید", - "email_exists": "یک حساب کاربری با این ایمیل از قبل وجود دارد. لطفا با ایمیل دیگری دوباره امتحان کنید.", + "invalid_invite": "ژتون دعوت‌نامهٔ شما یا نامعتبر است یا نادرست است. لطفا با مدیریت تماس بگیرید تا یک ژتون جدید دریافت کنید.", + "email_exists": "یک حساب کاربری با این رایانامه از قبل وجود دارد. لطفا با رایانامهٔ دیگری دوباره امتحان کنید.", "old_password": "گذرواژه‌ای که وارد کرده‌اید اشتباه است.", - "pending": "ثبت‌نام شما در انتظار تایید مدیر کل است. لطفا بعدا دوباره تلاش کنید.", - "banned": "شما به این برنامه دسترسی ندارید. اگر فکر می‌کنید که اشتباهی رخ داده است، لطفا با مدیریت تماس بگیرید." + "pending": "ثبت‌نام شما در انتظار تأیید مدیر کل است. لطفا بعدا دوباره تلاش کنید.", + "banned": "شما به این برنامه دسترسی ندارید. اگف فکر می‌کنید که اشتباهی رخ داده است، لطفا با مدیریت تماس بگیرید." }, "rooms": { "room_limit": "به دلیل رسیدن به سقف مجاز تعداد اتاق‌ها، نمی‌توانید اتاق ایجاد کنید." }, "session": { - "invalid_credentials": "نام‌کاربری یا گذرواژه نامعتبر است. لطفا اطلاعات کاربری خود را تایید کنید و دوباره امتحان کنید." + "invalid_credentials": "نام‌کاربری یا گذرواژه نامعتبر است. لطفا اطلاعات کاربری خود را تأیید کنید و دوباره امتحان کنید." } } }, @@ -444,9 +449,9 @@ "account_activation_page": { "title": "فعال‌سازی حساب کاربری", "account_unverified": "حساب کاربری شما هنوز تایید نشده است.", - "message": "برای استفاده از Greenlight، لطفا با دنبال‌کردن راهنماهای موجود در ایمیل فعال‌سازی که برای شما ارسال شده‌است، حساب کاربری خود را تأیید کنید.", - "resend_activation_link": "اگر ایمیل فعال‌سازی را دریافت نکرده‌اید یا در استفاده از آن مشکل دارید، روی دکمه زیر کلیک کنید تا ایمیل فعال‌سازی جدیدی را درخواست دهید.", - "resend_btn_lbl": "ارسال مجدد تائیدیه" + "message": "برای استفاده از Greenlight، لطفا با دنبال‌کردن راهنماهای موجود در رایانامه فعال‌سازی که برای شما ارسال شده‌است، حساب کاربری خود را تأیید کنید.", + "resend_activation_link": "اگر رایانامه فعال‌سازی را دریافت نکرده‌اید یا در استفاده از آن مشکل دارید، روی دکمهٔ زیر کلیک کنید تا رایانامه فعال‌سازی جدیدی را درخواست دهید.", + "resend_btn_lbl": "ارسال مجدد تأییدیه" }, "forms": { "validations": { @@ -456,10 +461,10 @@ "max": "نام باید حداکثر ۲۵۵ نویسه داشته باشد" }, "email": { - "required": "لطفا یک ایمیل وارد کنید", - "email": "مقدار وارد شده با قالب ایمیل مطابقت ندارد", - "min": "ایمیل باید حداقل ۶ نویسه داشته باشد", - "max": "ایمیل باید حداکثر ۲۵۵ نویسه داشته باشد" + "required": "لطفا یک رایانامه وارد کنید", + "email": "مقدار واردشده با قالب رایانامه مطابقت ندارد", + "min": "رایانامه باید حداقل ۶ نویسه داشته باشد", + "max": "رایانامه باید حداکثر ۲۵۵ نویسه داشته باشد" }, "password": { "required": "لطفا یک گذرواژه وارد کنید", @@ -472,12 +477,12 @@ "max": "گذرواژه باید حداکثر ۲۵۵ نویسه داشته باشد" }, "password_confirmation": { - "required": "لطفا تایید گذرواژه را وارد کنید", + "required": "لطفا تأیید گذرواژه را وارد کنید", "match": "گذرواژه‌ها با هم یکسان نمی‌باشند" }, "emails": { - "required": "لطفا حداقل یک ایمیل معتبر وارد کنید", - "list": "لطفا فهرستی از ایمیل‌های معتبر جدا شده با ویرگول ارائه دهید (user@users.com,user1@users.com,user2@users.com)" + "required": "لطفا حداقل یک رایانامهٔ معتبر وارد کنید", + "list": "لطفا فهرستی از رایانامه‌های معتبر جداشده با ویرگول ارائه دهید (user@users.com,user1@users.com,user2@users.com)" }, "role_name": { "required": "لطفا نام نقش را وارد کنید" @@ -526,7 +531,7 @@ "placeholder": "کد دسترسی را وارد کنید" }, "recording_consent": { - "label": "من اذعان دارم که این جلسه ممکن است، ضبط شود. این ممکن است شامل صدا و ویدیو من در صورت فعال شدن، باشد." + "label": "من متوجه هستم که این جلسه ممکن است ضبط شود. این ممکن است شامل صدا و ویدیوی من در صورت فعال‌بودن نیز باشد." } } }, @@ -538,24 +543,24 @@ "placeholder": "نام کامل خود را وارد کنید" }, "email": { - "label": "ایمیل", - "placeholder": "ایمیل خود را وارد کنید" + "label": "رایانامه", + "placeholder": "رایانامهٔ خود را وارد کنید" }, "password": { "label": "گذرواژه", "placeholder": "ایجاد گذرواژه" }, "password_confirmation": { - "label": "تایید گذرواژه", - "placeholder": "تایید گذرواژه" + "label": "تأیید گذرواژه", + "placeholder": "تأیید گذرواژه" } } }, "signin": { "fields": { "email": { - "label": "ایمیل", - "placeholder": "ایمیل" + "label": "رایانامه", + "placeholder": "رایانامه" }, "password": { "label": "گذرواژه", @@ -569,46 +574,46 @@ "change_password": { "fields": { "old_password": { - "label": "گذرواژه فعلی", - "placeholder": "گذرواژه خود را وارد کنید" + "label": "گذرواژهٔ فعلی", + "placeholder": "گذرواژهٔ خود را وارد کنید" }, "new_password": { - "label": "گذرواژه جدید", - "placeholder": "گذرواژه جدید خود را وارد کنید" + "label": "گذرواژهٔ جدید", + "placeholder": "گذرواژهٔ جدید خود را وارد کنید" }, "password_confirmation": { - "label": "تایید گذرواژه", - "placeholder": "گذرواژه جدید خود را تایید کنید" + "label": "تأیید گذرواژه", + "placeholder": "گذرواژهٔ جدید خود را تأیید کنید" } }, "validations": { "old_password": { - "required": "لطفا گذرواژه کنونی خود را وارد کنید" + "required": "لطفا گذرواژهٔ کنونی خود را وارد کنید" } } }, "forget_password": { "fields": { "email": { - "label": "ایمیل", - "placeholder": "ایمیل حساب کاربری را وارد کنید" + "label": "رایانامه", + "placeholder": "رایانامهٔ حساب کاربری را وارد کنید" } }, "validations": { "email": { - "required": "لطفا ایمیل حساب کاربری را وارد کنید" + "required": "لطفا رایانامهٔ حساب کاربری را وارد کنید" } } }, "reset_password": { "fields": { "new_password": { - "label": "گذرواژه جدید", - "placeholder": "گذرواژه جدید خود را وارد کنید" + "label": "گذرواژهٔ جدید", + "placeholder": "گذرواژهٔ جدید خود را وارد کنید" }, "password_confirmation": { - "label": "تایید گذرواژه", - "placeholder": "گذرواژه جدید خود را تایید کنید" + "label": "تأیید گذرواژه", + "placeholder": "گذرواژهٔ جدید خود را تأیید کنید" } } }, @@ -618,7 +623,7 @@ "label": "نام کامل" }, "email": { - "label": "ایمیل" + "label": "رایانامه" }, "language": { "label": "زبان" @@ -634,18 +639,18 @@ "fields": { "full_name": { "label": "نام کامل", - "placeholder": "نام کامل خود را وارد کنید" + "placeholder": "نام کامل کاربر را وارد کنید" }, "email": { - "label": "ایمیل", - "placeholder": "ایمیل خود را وارد کنید" + "label": "رایانامه", + "placeholder": "رایانامهٔ کاربر را وارد کنید" }, "password": { "label": "گذرواژه", - "placeholder": "گذرواژه کاربر را وارد کنید" + "placeholder": "گذرواژهٔ کاربر را وارد کنید" }, "password_confirmation": { - "label": "تایید گذرواژه", + "label": "تأیید گذرواژه", "placeholder": "تأیید گذرواژه" } } @@ -653,7 +658,7 @@ "invite_user": { "fields": { "emails": { - "label": "ایمیل‌ها" + "label": "رایانامه‌ها" } } }, From 63bc8772e944dceb0d1a7b872d6927abfbe7bfa2 Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Tue, 21 Nov 2023 09:50:22 -0500 Subject: [PATCH 16/68] Translate config/locales/en.yml in el (#5546) 100% translated source file: 'config/locales/en.yml' on 'el'. Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com> --- config/locales/el.yml | 35 +++++++++++++++++++++-------------- 1 file changed, 21 insertions(+), 14 deletions(-) diff --git a/config/locales/el.yml b/config/locales/el.yml index 3c5b7a7db44..dfa0cc2b368 100644 --- a/config/locales/el.yml +++ b/config/locales/el.yml @@ -47,30 +47,37 @@ el: opengraph: - description: "Εκπαιδευτείτε με χρήση του BigBlueButton, την αξιόπιστη λύση διαδικτυακής διάσκεψης ανοιχτού κώδικα που επιτρέπει την απρόσκοπτη εικονική συνεργασία και τη διαδικτυακή εμπειρία εκπαίδευσης." + description: "Μάθετε να χρησιμοποιείτε το BigBlueButton, την αξιόπιστη λύση διαδικτυακής διάσκεψης ανοιχτού κώδικα, που επιτρέπει την απρόσκοπτη εικονική συνεργασία και τη διαδικτυακή εμπειρία μάθησης." meeting: - moderator_message: "Για να προσκαλέσετε κάποιον στη συνεδρίαση, στείλτε τον σύνδεσμο:" + moderator_message: "Για αποστολή πρόσκλησης στη διάσκεψη, χρησιμοποιήστε τον σύνδεσμο:" access_code: "Κωδικός πρόσβασης: %{code}" email: activation: account_activation: Ενεργοποίηση λογαριασμού - welcome_to_bbb: Καλώς ορίσατε στο BigBlueButton! - get_started: "Για να ξεκινήσετε, παρακαλούμε ενεργοποιήστε τον λογαριασμό σας κάνοντας κλικ στο κουμπί παρακάτω." + welcome_to_bbb: Καλώς ήρθατε στο BigBlueButton! + get_started: "Για να ξεκινήσετε, παρακαλούμε ενεργοποιήστε τον λογαριασμό σας κάνοντας κλικ στο παρακάτω κουμπί." activate_account: Ενεργοποίηση λογαριασμού - link_expires: Ο σύνδεσμος θα λήξει σε 24 ώρες. - if_link_expires: "Εάν έληξε ο σύνδεσμος, συνδεθείτε και ζητήστε νέο email ενεργοποίησης." + link_expires: Ο σύνδεσμος θα λήξη σε 24 ώρες. + if_link_expires: "Εάν ο σύνδεσμος λήξει, συνδεθείτε και ζητήστε νέο email ενεργοποίησης." invitation: - invitation_to_join: Πρόσκληση BigBlueButton - you_have_been_invited: "Έχετε προσκληθεί από τον/την %{name}, να δημιουργήσετε έναν λογαριασμό BigBlueButton." - get_started: "Για να εγγραφείτε, παρακαλούμε κάντε κλικ στο κουμπί παρακάτω και ακολουθήστε τα βήματα." + invitation_to_join: Πρόσκληση στο BigBlueButton + you_have_been_invited: "Έχετε προσκληθεί να δημιουργήσετε λογαριασμό στο BigBlueButton από τον/την %{name}." + get_started: "Για εγγραφή, παρακαλούμε κάντε κλικ στο παρακάτω κουμπί και ακολουθήστε τα βήματα." valid_invitation: Η πρόσκληση ισχύει για 24 ώρες. sign_up: Εγγραφή + new_user_signup: + new_user: Εγγραφή νέου χρήστη + new_user_description: Ένας νέος χρήστης έχει εγγραφεί για να χρησιμοποιήσει το BigBlueButton. + name: "Όνομα: %{name}" + email: "Email: %{email}" + admin_panel: "Πίνακας ελέγχου διαχειριστή" + take_action: "Για να δείτε τον νέο χρήστη ή για να κάνετε τις απαραίτητες ενέργειες, επισκεφτείτε τον «Πίνακα ελέγχου» του διαχειριστή." reset: - password_reset: Επαναφορά κωδικού πρόσβασης - password_reset_requested: "Αίτημα επαναφοράς κωδικού πρόσβασης για %{email}." - password_reset_confirmation: "Για επαναφορά κωδικού πρόσβασης, παρακαλούμε κάντε κλικ στο παρακάτω κουμπί." + password_reset: Αίτημα επαναφοράς κωδικού πρόσβασης + password_reset_requested: "Ένα αίτημα επαναφοράς κωδικού πρόσβασης στάλθηκε για %{email}." + password_reset_confirmation: "Για επαναφορά του κωδικού πρόσβασης σας, παρακαλούμε κάντε κλικ στο παρακάτω κουμπί." reset_password: Επαναφορά κωδικού πρόσβασης - link_expires: Ο σύνδεσμος θα λήξει σε 1 ώρα. - ignore_request: "Εάν δεν υποβάλατε αίτημα αλλαγής κωδικού πρόσβασης, παρακαλούμε αγνοήστε αυτό το email." + link_expires: Ο σύνδεσμος θα λήξη σε 1 ώρα. + ignore_request: "Εάν δε ζητήσατε εσείς την αλλαγή του κωδικού πρόσβασης σας, παρακαλούμε αγνοείστε αυτό το email." room: new_room_name: "Αίθουσα του %{username}" From c74e356b7cb33a420693824cc1e0c87fed78c725 Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Tue, 21 Nov 2023 09:50:30 -0500 Subject: [PATCH 17/68] Translate app/assets/locales/en.json in el (#5545) 100% translated source file: 'app/assets/locales/en.json' on 'el'. Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com> --- app/assets/locales/el.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/assets/locales/el.json b/app/assets/locales/el.json index 3590b585ba0..28f353e9fa6 100644 --- a/app/assets/locales/el.json +++ b/app/assets/locales/el.json @@ -350,7 +350,8 @@ "manage_site_settings": "Να επιτρέπεται στους χρήστες με αυτόν τον ρόλο να διαχειρίζονται τις ρυθμίσεις του ιστοτόπου", "manage_roles": "Να επιτρέπεται στους χρήστες με αυτόν τον ρόλο να επεξεργάζονται άλλους ρόλους", "shared_list": "Να συμπεριλαμβάνονται χρήστες με αυτόν τον ρόλο στο αναπτυσσόμενο μενού για κοινή χρήση αιθουσών", - "room_limit": "Όριο αίθουσας" + "room_limit": "Όριο αίθουσας", + "email_on_signup": "Λάβετε ένα email όταν εγγραφεί ένας νέος χρήστης" } } }, From 6cca5577230de0ee841c84b7fc4f93ae27942087 Mon Sep 17 00:00:00 2001 From: Rahul Rodrigues Date: Tue, 21 Nov 2023 09:51:28 -0500 Subject: [PATCH 18/68] added links to docs (#5544) --- sample.env | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/sample.env b/sample.env index 9b3a2510d9f..64bec297982 100644 --- a/sample.env +++ b/sample.env @@ -25,6 +25,7 @@ REDIS_URL= ### SMTP CONFIGURATION # Emails are required for the basic features of Greenlight to function. # Please refer to your SMTP provider to get the values for the variables below +# More information: https://docs.bigbluebutton.org/greenlight/v3/install/#email-setup #SMTP_SENDER_EMAIL= #SMTP_SENDER_NAME= #SMTP_SERVER= @@ -39,7 +40,7 @@ REDIS_URL= #SMTP_SSL_VERIFY=true ### EXTERNAL AUTHENTICATION METHODS -# +# More information: https://docs.bigbluebutton.org/greenlight/v3/install/#openid-connect-setup #OPENID_CONNECT_CLIENT_ID= #OPENID_CONNECT_CLIENT_SECRET= #OPENID_CONNECT_ISSUER= @@ -47,6 +48,7 @@ REDIS_URL= #OPENID_CONNECT_UID_FIELD= # To enable hCaptcha on the user sign up and sign in, define these 2 keys +# More information: https://docs.bigbluebutton.org/greenlight/v3/install/#hcaptcha-setup #HCAPTCHA_SITE_KEY= #HCAPTCHA_SECRET_KEY= @@ -71,9 +73,11 @@ REDIS_URL= # Define the default locale language code (i.e. 'en' for English) from the following list: # [en, ar, fr, es, fa_IR] +# More information: https://docs.bigbluebutton.org/greenlight/v3/install/#default-locale-setup #DEFAULT_LOCALE=en # Set this if you like to deploy Greenlight on a relative root path other than / +# More information: https://docs.bigbluebutton.org/greenlight/v3/install/#relative-url-root-path-subdirectory-setup #RELATIVE_URL_ROOT=/gl ## Define log level in production. From 9299fb32a669b5e55635258c3b4115a665192371 Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Tue, 21 Nov 2023 10:39:52 -0500 Subject: [PATCH 19/68] Translate config/locales/en.yml in fr (#5552) 100% translated source file: 'config/locales/en.yml' on 'fr'. Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com> --- config/locales/fr.yml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/config/locales/fr.yml b/config/locales/fr.yml index 7802eab8c5d..297559a0dc0 100644 --- a/config/locales/fr.yml +++ b/config/locales/fr.yml @@ -65,6 +65,13 @@ fr: get_started: "Pour vous inscrire, veuillez cliquer sur le bouton ci-dessous et suivre les étapes proposées" valid_invitation: L'invitation est valable pendant 24 heures. sign_up: inscription + new_user_signup: + new_user: Un nouvel utilisateur s'est inscrit + new_user_description: Un nouvel utilisateur s'est inscrit pour utiliser BigBlueButton. + name: "Nom: %{name}" + email: "Courriel: %{email}" + admin_panel: "Panneau Administrateur" + take_action: "Pour afficher le nouvel utilisateur ou pour toute action nécessaire, consultez le panneau Administrateur" reset: password_reset: Demande de réinitialisation du mot de passe password_reset_requested: "Une demande de réinitialisation de mot de passe est demandée par 1%{email}" From 43db66c4814e21be3b86633f49fcafd3fe361f20 Mon Sep 17 00:00:00 2001 From: Rahul Rodrigues Date: Tue, 21 Nov 2023 10:59:23 -0500 Subject: [PATCH 20/68] added wording to explain default language a little more concisely in sample.env (#5553) --- sample.env | 1 + 1 file changed, 1 insertion(+) diff --git a/sample.env b/sample.env index 64bec297982..b5b79673743 100644 --- a/sample.env +++ b/sample.env @@ -73,6 +73,7 @@ REDIS_URL= # Define the default locale language code (i.e. 'en' for English) from the following list: # [en, ar, fr, es, fa_IR] +# The DEFAULT_LOCALE setting specifies the default language, overriding the browser language which is always set. # More information: https://docs.bigbluebutton.org/greenlight/v3/install/#default-locale-setup #DEFAULT_LOCALE=en From b3c3d0e778e2e8df30e26be8fb70d297c8331479 Mon Sep 17 00:00:00 2001 From: Ahmad Farhat Date: Tue, 21 Nov 2023 11:16:01 -0500 Subject: [PATCH 21/68] Fix failing rspecs (#5554) * Fix failing rspecs * more tests --- .../migrations/external_controller_spec.rb | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/spec/controllers/migrations/external_controller_spec.rb b/spec/controllers/migrations/external_controller_spec.rb index f15c602782e..1efac7b25ca 100644 --- a/spec/controllers/migrations/external_controller_spec.rb +++ b/spec/controllers/migrations/external_controller_spec.rb @@ -150,6 +150,7 @@ name: 'user', email: 'user@users.com', provider: 'greenlight', + password_digest: 'fake_password_digest', language: 'language', role: valid_user_role.name } @@ -185,8 +186,8 @@ expect(user.role).to eq(valid_user_role) expect(user.session_token).to be_present expect(user.provider).to eq('greenlight') + expect(user.password_digest).to eq(valid_user_params[:password_digest]) expect(response).to have_http_status(:created) - expect(user.password_digest).to be_present end it 'creates the user without a password if provider is not greenlight' do @@ -251,8 +252,8 @@ expect(user.role).to eq(valid_user_role) expect(user.session_token).to be_present expect(user.provider).to eq('greenlight') + expect(user.password_digest).to eq(valid_user_params[:password_digest]) expect(response).to have_http_status(:created) - expect(user.password_digest).to be_blank end end @@ -296,14 +297,17 @@ end end - context 'when providing a :provider or a :password' do - before { valid_user_params.merge!(password: 'Password1!') } + context 'when providing a valid :password_digest' do + before do + temp_user = create(:user, password: 'Password1!') + valid_user_params.merge!(password_digest: temp_user.password_digest) + end it 'returns :created and creates a user while ignoring the extra values' do encrypted_params = encrypt_params({ user: valid_user_params }, expires_in: 10.seconds) - expect { post :create_user, params: { v2: { encrypted_params: } } }.to change(User, :count).from(0).to(1) + expect { post :create_user, params: { v2: { encrypted_params: } } }.to change(User, :count).by(1) - user = User.take + user = User.find_by(email: valid_user_params[:email]) expect(user.name).to eq(valid_user_params[:name]) expect(user.email).to eq(valid_user_params[:email]) expect(user.language).to eq(valid_user_params[:language]) @@ -311,7 +315,7 @@ expect(user.session_token).to be_present expect(user.provider).to eq(valid_user_params[:provider]) expect(response).to have_http_status(:created) - expect(user.authenticate('Password1!')).to be_falsy + expect(user.authenticate('Password1!')).to be_truthy end end From 2d369dac6d75b19ade577db8252d26ce2fb50a06 Mon Sep 17 00:00:00 2001 From: Rahul Rodrigues Date: Tue, 21 Nov 2023 13:34:30 -0500 Subject: [PATCH 22/68] fixed admin room access issues (#5543) * fixed admin room access issues * fixed eslint errors * updated to use room shared boolean over owner name --- .../components/rooms/room/shared_access/SharedAccess.jsx | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/app/javascript/components/rooms/room/shared_access/SharedAccess.jsx b/app/javascript/components/rooms/room/shared_access/SharedAccess.jsx index d3d8069b0f1..a0d484c42dd 100644 --- a/app/javascript/components/rooms/room/shared_access/SharedAccess.jsx +++ b/app/javascript/components/rooms/room/shared_access/SharedAccess.jsx @@ -29,6 +29,7 @@ import useDeleteSharedAccess from '../../../../hooks/mutations/shared_accesses/u import useSharedUsers from '../../../../hooks/queries/shared_accesses/useSharedUsers'; import SharedAccessEmpty from './SharedAccessEmpty'; import useRoom from '../../../../hooks/queries/rooms/useRoom'; +import { useAuth } from '../../../../contexts/auth/AuthProvider'; export default function SharedAccess() { const { t } = useTranslation(); @@ -37,6 +38,8 @@ export default function SharedAccess() { const { data: sharedUsers } = useSharedUsers(friendlyId, searchInput); const deleteSharedAccess = useDeleteSharedAccess(friendlyId); const { data: room } = useRoom(friendlyId); + const currentUser = useAuth(); + const isAdmin = currentUser?.role.name === 'Administrator'; if (sharedUsers?.length || searchInput) { return ( @@ -45,7 +48,7 @@ export default function SharedAccess() {
- { !room.shared && ( + { (!room.shared || isAdmin) && ( - {!room.shared && ( + { (!room.shared || isAdmin) && (
diff --git a/app/views/user_mailer/new_user_signup_email.text.erb b/app/views/user_mailer/new_user_signup_email.text.erb index bf3f123789b..1d3b468ca3b 100644 --- a/app/views/user_mailer/new_user_signup_email.text.erb +++ b/app/views/user_mailer/new_user_signup_email.text.erb @@ -18,9 +18,9 @@ --- <%= t('email.new_user_signup.new_user') %> -<%= t('email.new_user_signup.new_user_description' %> +<%= t('email.new_user_signup.new_user_description') %> <%= t('email.new_user_signup.name', name: @user.name) %> <%= t('email.new_user_signup.email', email: @user.email) %> <%= t('email.new_user_signup.take_action') %> -<%= @signup_url %> +<%= @admin_panel_url %> --- From 45558c49a8ab946c6d3b1e819bdd9287ddc9becb Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Wed, 22 Nov 2023 13:33:46 -0500 Subject: [PATCH 29/68] Translate app/assets/locales/en.json in tr (#5562) 100% translated source file: 'app/assets/locales/en.json' on 'tr'. Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com> --- app/assets/locales/tr.json | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/app/assets/locales/tr.json b/app/assets/locales/tr.json index caa315b28fd..8f6d4a8b342 100644 --- a/app/assets/locales/tr.json +++ b/app/assets/locales/tr.json @@ -81,6 +81,7 @@ "account_info": "Hesap bilgileri", "delete_account": "Hesabı sil", "change_password": "Parolayı değiştir", + "set_password": "Yeni parolanızı ayarlayın", "reset_password": "Parolayı sıfırla", "update_account_info": "Hesap bilgilerinizi güncelleyin", "current_password": "Geçerli parola", @@ -129,6 +130,7 @@ "click_to_upload": "Yüklemek için tıklayın", "drag_and_drop": "ya da sürükleyip bırakın", "upload_description": "Herhangi bir Office belgesi ya da PDF dosyası ({{size}} boyutundan büyük olmayan) yükleyin. Dosyanın boyutuna bağlı olarak, kullanılmadan önce karşıya yüklenmesi biraz sürebilir.", + "delete_presentation": "Sunumu sil", "are_you_sure_delete_presentation": "Bu sunumu silmek istediğinize emin misiniz?" }, "shared_access": { @@ -165,6 +167,7 @@ "recording": { "recording": "Kaydediliyor", "recordings": "Kayıtlar", + "processing": "Kayıtlar işleniyor...", "name": "Ad", "length": "Süre", "users": "Kullanıcılar", @@ -347,7 +350,8 @@ "manage_site_settings": "Bu roldeki kullanıcılar site ayarlarını yönetebilsin", "manage_roles": "Bu roldeki kullanıcılar diğer kullanıcı rollerini düzenleyebilsin", "shared_list": "Bu roldeki kullanıcılar oda paylaşma açılan kutularında görüntülensin", - "room_limit": "Oda sayısı sınırı" + "room_limit": "Oda sayısı sınırı", + "email_on_signup": "Yeni bir kullanıcı hesap açtığında e-posta alın" } } }, @@ -358,6 +362,7 @@ "user_updated": "Kullanıcı güncellendi.", "user_deleted": "Kullanıcı silindi.", "avatar_updated": "Avatar güncellendi.", + "password_changed": "Parolanız güncellendi. Lütfen yeniden oturum açın.", "password_updated": "Parola güncellendi.", "account_activated": "Hesap etkinleştirildi. Lütfen hesabınızla oturum açın.", "activation_email_sent": "Etkinleştirme e-postası gönderildi.", From b360602e6960167e99d598622d02618012f0b0c8 Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Wed, 22 Nov 2023 13:33:57 -0500 Subject: [PATCH 30/68] Translate config/locales/en.yml in tr (#5561) 100% translated source file: 'config/locales/en.yml' on 'tr'. Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com> --- config/locales/tr.yml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/config/locales/tr.yml b/config/locales/tr.yml index 61da9c74d42..0dc558d6ee4 100644 --- a/config/locales/tr.yml +++ b/config/locales/tr.yml @@ -65,6 +65,13 @@ tr: get_started: Hesap açmak için aşağıdaki düğmeye tıklayın ve yönergeleri izleyin. valid_invitation: Bu çağrı 24 saat süreyle geçerlidir. sign_up: Hesap aç + new_user_signup: + new_user: Yeni kullanıcı hesabı açma + new_user_description: Yeni bir kullanıcı BigBlueButton kullanmak için hesap açtı. + name: "Adı: %{name}" + email: "E-posta adresi: %{email}" + admin_panel: "Yönetim panosu" + take_action: "Yeni kullanıcıyı görüntülemek ya da gerekli işlemi yapmak için yönetim panosuna gidin" reset: password_reset: Parolayı sıfırla password_reset_requested: "%{email} için bir parola sıfırlama isteğinde bulunuldu." From cc9ab54fed3d1c3c7242e46a0d642739b9ffccca Mon Sep 17 00:00:00 2001 From: Ahmad Farhat Date: Wed, 22 Nov 2023 15:50:12 -0500 Subject: [PATCH 31/68] More fixes for email notification (#5566) --- app/controllers/api/v1/users_controller.rb | 2 +- app/controllers/api/v1/verify_account_controller.rb | 5 ++--- app/controllers/external_controller.rb | 5 ++++- config/locales/en.yml | 2 +- 4 files changed, 8 insertions(+), 6 deletions(-) diff --git a/app/controllers/api/v1/users_controller.rb b/app/controllers/api/v1/users_controller.rb index 558dda4a9d9..253371103f1 100644 --- a/app/controllers/api/v1/users_controller.rb +++ b/app/controllers/api/v1/users_controller.rb @@ -77,7 +77,7 @@ def create activation_url: activate_account_url(token), base_url: request.base_url, provider: current_provider).activate_account_email.deliver_later - UserMailer.with(user:, admin_panel_url:, provider: current_provider).new_user_signup_email.deliver_later + UserMailer.with(user:, admin_panel_url:, base_url: request.base_url, provider: current_provider).new_user_signup_email.deliver_later end create_default_room(user) diff --git a/app/controllers/api/v1/verify_account_controller.rb b/app/controllers/api/v1/verify_account_controller.rb index 8e508fc0597..876eb3014dd 100644 --- a/app/controllers/api/v1/verify_account_controller.rb +++ b/app/controllers/api/v1/verify_account_controller.rb @@ -29,9 +29,8 @@ class VerifyAccountController < ApiController def create token = @user.generate_activation_token! - UserMailer.with(user: @user, - activation_url: activate_account_url(token), base_url: request.base_url, - provider: current_provider).activate_account_email.deliver_later + UserMailer.with(user: @user, activation_url: activate_account_url(token), + base_url: request.base_url, provider: current_provider).activate_account_email.deliver_later render_data status: :ok end diff --git a/app/controllers/external_controller.rb b/app/controllers/external_controller.rb index 0c6e2bbe4a2..4bb6bdeb8b2 100644 --- a/app/controllers/external_controller.rb +++ b/app/controllers/external_controller.rb @@ -55,7 +55,10 @@ def create_user create_default_room(user) # Send admins an email if smtp is enabled - UserMailer.with(user:, admin_panel_url:, provider: current_provider).new_user_signup_email.deliver_later if ENV['SMTP_SERVER'].present? + if ENV['SMTP_SERVER'].present? + UserMailer.with(user:, admin_panel_url:, base_url: request.base_url, + provider: current_provider).new_user_signup_email.deliver_later + end end if SettingGetter.new(setting_name: 'ResyncOnLogin', provider:).call diff --git a/config/locales/en.yml b/config/locales/en.yml index ba04fe59fc5..a5437ca7f3e 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -66,7 +66,7 @@ en: valid_invitation: The invitation is valid for 24 hours. sign_up: Sign Up new_user_signup: - new_user: New User Signup + new_user: New BigBlueButton User Signup new_user_description: A new user has signed up to use BigBlueButton. name: "Name: %{name}" email: "Email: %{email}" From 8dd97ad4411ea32e7e6996e7c0fda0184653ea39 Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Thu, 23 Nov 2023 10:01:10 -0500 Subject: [PATCH 32/68] Translate config/locales/en.yml in ja (#5573) 100% translated source file: 'config/locales/en.yml' on 'ja'. Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com> --- config/locales/ja.yml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/config/locales/ja.yml b/config/locales/ja.yml index 4bf19f3fde4..5f11983552a 100644 --- a/config/locales/ja.yml +++ b/config/locales/ja.yml @@ -65,6 +65,13 @@ ja: get_started: 登録するには下のボタンをクリックし、手順にしたがってください。 valid_invitation: この招待は24時間有効です。 sign_up: 登録 + new_user_signup: + new_user: 新しいBigBlueButtonユーザーの登録 + new_user_description: 新しいBigBlueButtonユーザーの登録が行われました。 + name: "名前: %{name}" + email: "メール: %{email}" + admin_panel: "管理者パネル" + take_action: "新しいユーザーをチェックしたり、必要な操作を行ったりするには、管理者パネルを使用してください" reset: password_reset: パスワード再設定 password_reset_requested: "%{email}に対してパスワードの再設定が要請されました。" From a7ae93a7ec4fb1207c3290ef7a43ec77d9843793 Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Thu, 23 Nov 2023 10:01:30 -0500 Subject: [PATCH 33/68] Updates for file app/assets/locales/en.json in ja (#5572) * Translate app/assets/locales/en.json in ja 100% translated source file: 'app/assets/locales/en.json' on 'ja'. * Translate app/assets/locales/en.json in ja 100% translated source file: 'app/assets/locales/en.json' on 'ja'. --------- Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com> --- app/assets/locales/ja.json | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/app/assets/locales/ja.json b/app/assets/locales/ja.json index 16e35f3efbb..25c63162a34 100644 --- a/app/assets/locales/ja.json +++ b/app/assets/locales/ja.json @@ -81,6 +81,7 @@ "account_info": "アカウント情報", "delete_account": "アカウント削除", "change_password": "パスワード変更", + "set_password": "新しいパスワードを入力", "reset_password": "パスワード再設定", "update_account_info": "アカウント情報の更新", "current_password": "現在のパスワード", @@ -129,6 +130,7 @@ "click_to_upload": "クリックしてアップロード", "drag_and_drop": "またはドラッグ&ドロップ", "upload_description": "OfficeドキュメントかPDFファイル(サイズ{{size}}以下)をアップロードしてください。ファイルの大きさによっては、使用可能になるまでに少し時間がかかるかもしれません。", + "delete_presentation": "プレゼンファイルを削除", "are_you_sure_delete_presentation": "本当にこのプレゼンファイルを削除しますか?" }, "shared_access": { @@ -165,6 +167,7 @@ "recording": { "recording": "録画", "recordings": "録画", + "processing": "録画を処理しています...", "name": "名前", "length": "長さ", "users": "参加者", @@ -347,7 +350,8 @@ "manage_site_settings": "この役割のユーザーに、サイト全体の設定を許可する", "manage_roles": "この役割のユーザーに、他の役割の内容を変更することを許可する", "shared_list": "この役割のユーザーを、会議室を共有できるユーザーのリストに含める", - "room_limit": "作成できる会議室数の制限" + "room_limit": "作成できる会議室数の制限", + "email_on_signup": "新しいユーザーが登録したときメールを受け取る" } } }, @@ -358,6 +362,7 @@ "user_updated": "ユーザーが更新されました。", "user_deleted": "ユーザーが削除されました。", "avatar_updated": "アバターが更新されました。", + "password_changed": "パスワードが更新されました。もう一度サインインしてください。", "password_updated": "パスワードが更新されました。", "account_activated": "アカウントが有効化されました。サインインしてみてください。", "activation_email_sent": "アクチベーションメールが送信されました", From d8141488861559e620a1e7b6fd5300149cda8d22 Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Thu, 23 Nov 2023 10:01:41 -0500 Subject: [PATCH 34/68] Translate config/locales/en.yml in fr (#5571) 100% translated source file: 'config/locales/en.yml' on 'fr'. Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com> --- config/locales/fr.yml | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/config/locales/fr.yml b/config/locales/fr.yml index 297559a0dc0..a7d46912e4d 100644 --- a/config/locales/fr.yml +++ b/config/locales/fr.yml @@ -47,37 +47,37 @@ fr: opengraph: - description: "Apprenez à utiliser BigBlueButton, la solution de webconférence open-source, fiable et qui offre une expérience adaptée aux collaborations comme aux apprentissages en ligne." + description: "Apprenez à utiliser BigBlueButton, la solution de webconférence open-source, fiable et qui offre une expérience adaptée aux collaborations comme aux apprentissages en ligne." meeting: - moderator_message: "Pour inviter quelqu'un à la réunion, envoyez ce lien:" - access_code: "Code d'accès: 1%{code}" + moderator_message: "Pour inviter quelqu'un à la réunion, envoyez-lui ce lien :" + access_code: "Code d'accès: %{code}" email: activation: account_activation: Activation du compte - welcome_to_bbb: Bienvenue dans BigBlueButton! - get_started: "Pour commencer, veuillez activer votre compte en cliquant sur le lien ci-dessous." + welcome_to_bbb: Bienvenue dans BigBlueButton + get_started: "Pour commencer, veuillez activer votre compte en cliquant sur le bouton ci-dessous." activate_account: Activer le compte link_expires: Le lien expirera dans 24 heures. - if_link_expires: "Si le lien a expiré, veuillez vous connecter et demander un nouveau courriel d'activation" + if_link_expires: "Si le lien a expiré, veuillez vous connecter et demander un nouveau courriel pour l'activation." invitation: - invitation_to_join: Invitation à rejoindre BigBlueButton - you_have_been_invited: "Vous avez été invité à créer un compte dans BigBlueButton par 1%{name}." - get_started: "Pour vous inscrire, veuillez cliquer sur le bouton ci-dessous et suivre les étapes proposées" + invitation_to_join: Invitation BigBlueButton + you_have_been_invited: "Vous avez été invité à créer un compte BigBlueButton par %{name} ." + get_started: "Pour vous inscrire, veuillez cliquer sur le bouton ci-dessous et suivre les instructions." valid_invitation: L'invitation est valable pendant 24 heures. - sign_up: inscription + sign_up: Inscription new_user_signup: - new_user: Un nouvel utilisateur s'est inscrit + new_user: Inscription d'un nouvel utilisateur à BigBlueButton new_user_description: Un nouvel utilisateur s'est inscrit pour utiliser BigBlueButton. name: "Nom: %{name}" - email: "Courriel: %{email}" + email: "Courriel: %{email}" admin_panel: "Panneau Administrateur" - take_action: "Pour afficher le nouvel utilisateur ou pour toute action nécessaire, consultez le panneau Administrateur" + take_action: "Pour afficher le nouvel utilisateur ou toute action nécessaire, consultez le Panneau Administrateur" reset: - password_reset: Demande de réinitialisation du mot de passe - password_reset_requested: "Une demande de réinitialisation de mot de passe est demandée par 1%{email}" - password_reset_confirmation: "Pour réinitialiser votre mot de passe, veuillez cliquer sur la bouton ci-dessous\"" - reset_password: Réinitialisation du mot de passe + password_reset: Réinitialiser le mot de passe + password_reset_requested: "Une réinitialisation de mot de passe a été demandée par %{email} ." + password_reset_confirmation: "Pour réinitialiser votre mot de passe, veuillez cliquer sur le bouton ci-dessous." + reset_password: Réinitialiser le mot de passe link_expires: Le lien expirera dans 1 heure. - ignore_request: "Si vous n'avez pas demandé à changer de mot de passe, ignorez ce message." + ignore_request: "Si vous n'avez pas demandé un changement de mot de passe, veuillez ignorer ce courriel." room: new_room_name: "Salle de %{username}" From cebfb1098fd90936c58a1fa3c12f06ae26425d78 Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Thu, 23 Nov 2023 10:01:50 -0500 Subject: [PATCH 35/68] Translate config/locales/en.yml in gl (#5570) 100% translated source file: 'config/locales/en.yml' on 'gl'. Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com> --- config/locales/gl.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/config/locales/gl.yml b/config/locales/gl.yml index 4165a924750..7cff02e9fa3 100644 --- a/config/locales/gl.yml +++ b/config/locales/gl.yml @@ -66,7 +66,7 @@ gl: valid_invitation: O convite é válido durante 24 horas. sign_up: Rexistrarse new_user_signup: - new_user: Rexistro de novo usuario + new_user: Novo rexistro de usuario de BigBlueButton new_user_description: Rexistrouse un novo usuario para usar BigBlueButton. name: "Nome: %{name}" email: "Correo-e: %{email}" @@ -80,4 +80,4 @@ gl: link_expires: A ligazón caducará en 1 hora. ignore_request: "Se Vde. non fixo unha solicitude para cambiar o seu contrasinal, ignore este correo" room: - new_room_name: " \nSala de %{username}" + new_room_name: "Sala de %{username}" From e9043de0f71a1d1edb89efff9f3a5522f917fcb8 Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Thu, 23 Nov 2023 10:02:04 -0500 Subject: [PATCH 36/68] Translate config/locales/en.yml in gl (#5569) 100% translated source file: 'config/locales/en.yml' on 'gl'. Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com> From 14aa5904bffc6fd93573f3b455dae235087de683 Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Thu, 23 Nov 2023 10:02:14 -0500 Subject: [PATCH 37/68] Translate config/locales/en.yml in tr (#5568) 100% translated source file: 'config/locales/en.yml' on 'tr'. Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com> --- config/locales/tr.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/locales/tr.yml b/config/locales/tr.yml index 0dc558d6ee4..b63de8e6b4e 100644 --- a/config/locales/tr.yml +++ b/config/locales/tr.yml @@ -66,7 +66,7 @@ tr: valid_invitation: Bu çağrı 24 saat süreyle geçerlidir. sign_up: Hesap aç new_user_signup: - new_user: Yeni kullanıcı hesabı açma + new_user: Yeni BigBlueButton kullanıcı hesabı açılışı new_user_description: Yeni bir kullanıcı BigBlueButton kullanmak için hesap açtı. name: "Adı: %{name}" email: "E-posta adresi: %{email}" From af2b0edd5e2092c3aefac4da36bbc126bd68c056 Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Thu, 23 Nov 2023 10:02:23 -0500 Subject: [PATCH 38/68] Translate config/locales/en.yml in tr (#5567) 100% translated source file: 'config/locales/en.yml' on 'tr'. Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com> --- config/locales/tr.yml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/config/locales/tr.yml b/config/locales/tr.yml index b63de8e6b4e..4bd81d1b32e 100644 --- a/config/locales/tr.yml +++ b/config/locales/tr.yml @@ -47,23 +47,23 @@ tr: opengraph: - description: "Sorunsuz sanal işbirliği ve çevrim içi öğrenme deneyimleri sağlayan, güvenilir ve açık kaynaklı internet üzerinden görüşme çözümü BigBlueButton uygulamasını kullanarak öğrenin." + description: "Sorunsuz sanal işbirliği ve çevrim içi öğrenme deneyimi sağlayan, güvenilir açık kaynaklı internet konferansı çözümü BigBlueButton uygulamasını kullanarak öğrenin." meeting: - moderator_message: "Toplantıya katılmasını istediğiniz kişilere bu bağlantıyı gönderin: " + moderator_message: "Toplantıya çağırmak istediğiniz kişilere bu bağlantıyı gönderin:" access_code: "Erişim kodu: %{code}" email: activation: account_activation: Hesap etkinleştirme welcome_to_bbb: BigBlueButton uygulamasına hoş geldiniz! - get_started: "Başlamak için, lütfen aşağıdaki düğmeye tıklayarak hesabınızı etkinleştirin." + get_started: Lütfen başlamak için aşağıdaki düğmeye tıklayarak hesabınızı etkinleştirin. activate_account: Hesabı etkinleştir - link_expires: Bağlantı 24 saat sonra geçersiz olacak. - if_link_expires: Bağlantının süresi geçerse oturum açarak yeni bir etkinleştirme e-postası alın. + link_expires: Bu bağlantı 24 saat sonra geçersiz olacak. + if_link_expires: "Bağlantının süresi geçerse, yeni bir etkinleştirme e-postası almak için oturum açın." invitation: invitation_to_join: BigBlueButton çağrısı you_have_been_invited: "%{name} tarafından bir BigBlueButton hesabı açmaya çağrıldınız." get_started: Hesap açmak için aşağıdaki düğmeye tıklayın ve yönergeleri izleyin. - valid_invitation: Bu çağrı 24 saat süreyle geçerlidir. + valid_invitation: Çağrı 24 saat boyunca geçerlidir. sign_up: Hesap aç new_user_signup: new_user: Yeni BigBlueButton kullanıcı hesabı açılışı @@ -74,10 +74,10 @@ tr: take_action: "Yeni kullanıcıyı görüntülemek ya da gerekli işlemi yapmak için yönetim panosuna gidin" reset: password_reset: Parolayı sıfırla - password_reset_requested: "%{email} için bir parola sıfırlama isteğinde bulunuldu." + password_reset_requested: "%{email} e-posta adresi için parola sıfırlama isteğinde bulunuldu." password_reset_confirmation: Parolanızı sıfırlamak için aşağıdaki düğmeye tıklayın. reset_password: Parolayı sıfırla link_expires: Bağlantı 1 saat sonra geçersiz olacak. - ignore_request: Parola değiştirme isteğinde bulunmadıysanız bu e-postayı yok sayabilirsiniz. + ignore_request: Parolanızı değiştirme isteğinde bulunmadıysanız bu e-postayı yok sayabilirsiniz. room: new_room_name: "%{username} kullanıcısının odası" From b82f8ef333df5ac8416cee8b70c7f6ff88319f98 Mon Sep 17 00:00:00 2001 From: Ahmad Farhat Date: Wed, 29 Nov 2023 10:40:32 -0500 Subject: [PATCH 39/68] Fixed issues with uploads (profile, presentation, branding) (#5590) --- app/controllers/api/v1/admin/site_settings_controller.rb | 2 +- .../mutations/admin/site_settings/useUpdateSiteSetting.jsx | 6 +++++- .../hooks/mutations/rooms/useUploadPresentation.jsx | 6 +++++- app/javascript/hooks/mutations/users/useCreateAvatar.jsx | 6 +++++- 4 files changed, 16 insertions(+), 4 deletions(-) diff --git a/app/controllers/api/v1/admin/site_settings_controller.rb b/app/controllers/api/v1/admin/site_settings_controller.rb index 6b8a273c0c7..49109a35d4a 100644 --- a/app/controllers/api/v1/admin/site_settings_controller.rb +++ b/app/controllers/api/v1/admin/site_settings_controller.rb @@ -35,7 +35,7 @@ def index render_data data: site_settings, status: :ok end - # GET /api/v1/admin/site_settings/:name.json + # PATCH /api/v1/admin/site_settings/:name.json # Updates the value of the specified Site Setting def update site_setting = SiteSetting.joins(:setting) diff --git a/app/javascript/hooks/mutations/admin/site_settings/useUpdateSiteSetting.jsx b/app/javascript/hooks/mutations/admin/site_settings/useUpdateSiteSetting.jsx index 0fb1a452857..c956b524044 100644 --- a/app/javascript/hooks/mutations/admin/site_settings/useUpdateSiteSetting.jsx +++ b/app/javascript/hooks/mutations/admin/site_settings/useUpdateSiteSetting.jsx @@ -35,7 +35,11 @@ export default function useUpdateSiteSetting(name) { settings = data; } - return axios.patch(`/admin/site_settings/${name}.json`, settings); + return axios.patch(`/admin/site_settings/${name}.json`, settings, { + headers: { + 'Content-Type': 'multipart/form-data', + }, + }); }; const handleSuccess = () => { diff --git a/app/javascript/hooks/mutations/rooms/useUploadPresentation.jsx b/app/javascript/hooks/mutations/rooms/useUploadPresentation.jsx index 4830574d162..3f5e0e2c750 100644 --- a/app/javascript/hooks/mutations/rooms/useUploadPresentation.jsx +++ b/app/javascript/hooks/mutations/rooms/useUploadPresentation.jsx @@ -28,7 +28,11 @@ export default function useUploadPresentation(friendlyId) { fileValidation(presentation, 'presentation'); const formData = new FormData(); formData.append('room[presentation]', presentation); - return axios.patch(`/rooms/${friendlyId}.json`, formData); + return axios.patch(`/rooms/${friendlyId}.json`, formData, { + headers: { + 'Content-Type': 'multipart/form-data', + }, + }); }; const mutation = useMutation(uploadPresentation, { diff --git a/app/javascript/hooks/mutations/users/useCreateAvatar.jsx b/app/javascript/hooks/mutations/users/useCreateAvatar.jsx index ab4baf77c69..106ade8fd90 100644 --- a/app/javascript/hooks/mutations/users/useCreateAvatar.jsx +++ b/app/javascript/hooks/mutations/users/useCreateAvatar.jsx @@ -30,7 +30,11 @@ export default function useCreateAvatar(currentUser) { }); const formData = new FormData(); formData.append('user[avatar]', avatarBlob); - return axios.patch(`/users/${currentUser.id}.json`, formData); + return axios.patch(`/users/${currentUser.id}.json`, formData, { + headers: { + 'Content-Type': 'multipart/form-data', + }, + }); } const mutation = useMutation( From 9f0d9d07235769eb2145dca52a9a329146d8131b Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Wed, 29 Nov 2023 10:40:45 -0500 Subject: [PATCH 40/68] Translate config/locales/en.yml in ru (#5586) 100% translated source file: 'config/locales/en.yml' on 'ru'. Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com> --- config/locales/ru.yml | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/config/locales/ru.yml b/config/locales/ru.yml index b3d9bee508b..c64b8d67040 100644 --- a/config/locales/ru.yml +++ b/config/locales/ru.yml @@ -65,6 +65,13 @@ ru: get_started: "Чтобы зарегистрироваться, нажмите кнопку ниже и следуйте инструкциям." valid_invitation: Приглашение действительно в течение 24 часов. sign_up: Зарегистрироваться + new_user_signup: + new_user: Новая регистрация пользователя + new_user_description: Зарегистрирован новый пользователь. + name: "Имя: %{name}" + email: "Email: %{email}" + admin_panel: "Панель администратора" + take_action: "Чтобы просмотреть нового пользователя, откройте панель администратора" reset: password_reset: Сброс пароля password_reset_requested: "Запрошен сброс пароля для %{email}." @@ -72,3 +79,5 @@ ru: reset_password: Сбросить пароль link_expires: Срок действия ссылки истекает через 1 час. ignore_request: "Если вы не отправляли запрос на смену пароля, проигнорируйте это письмо." + room: + new_room_name: "Комната для встреч пользователя %{username}" From 77583fb39875b439245f4c0fb4efeb9bd981df3f Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Wed, 29 Nov 2023 10:40:55 -0500 Subject: [PATCH 41/68] Translate app/assets/locales/en.json in ru (#5585) 100% translated source file: 'app/assets/locales/en.json' on 'ru'. Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com> --- app/assets/locales/ru.json | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/app/assets/locales/ru.json b/app/assets/locales/ru.json index 96220e82bd3..e0cae0ae32a 100644 --- a/app/assets/locales/ru.json +++ b/app/assets/locales/ru.json @@ -23,6 +23,8 @@ "are_you_sure": "Вы уверены?", "return_home": "Вернуться Домой", "created_at": "Создано", + "view_recordings": "Посмотреть записи", + "join_session": "Присоединиться к вебинару", "no_result_search_input": "Не удалось найти никаких результатов для \"{{ searchInput }}\"", "action_permanent": "Это действие не может быть отменено.", "homepage": { @@ -79,6 +81,7 @@ "account_info": "Информация об аккаунте", "delete_account": "Удалить аккаунт", "change_password": "Сменить пароль", + "set_password": "Установить новый пароль", "reset_password": "Сбросить пароль", "update_account_info": "Обновить информацию об аккаунте", "current_password": "Текущий пароль", @@ -108,7 +111,7 @@ "delete_room": "Удалить комнату", "create_new_room": "Создать новую комнату", "enter_room_name": "Введите название комнаты", - "shared_by": "доступ предоставлен ", + "shared_by": "опубликовано", "last_session": "Последний сеанс: {{ localizedTime }}", "no_last_session": "Предыдущие сеансы отсутствуют", "search_not_found": "Комнаты не найдены", @@ -127,6 +130,7 @@ "click_to_upload": "Нажмите, чтобы загрузить ", "drag_and_drop": "или перетащите и отпустите", "upload_description": "Загрузите любой офисный документ или PDF (размером не более {{size}}). В зависимости от размера файла, для загрузки может потребоваться дополнительное время, прежде чем его можно будет использовать", + "delete_presentation": "Удалить презентацию", "are_you_sure_delete_presentation": "Вы уверены, что хотите удалить эту презентацию?" }, "shared_access": { @@ -163,6 +167,7 @@ "recording": { "recording": "Запись", "recordings": "Записи", + "processing": "Записи обрабатываются...", "name": "Имя", "length": "Длина", "users": "Пользователи", @@ -171,11 +176,15 @@ "published": "Опубликована", "unpublished": "Не опубликована", "protected": "Защищенные", + "public": "Публичная", + "public_protected": "Публичная/Защищенная", "length_in_minutes": "{{recording.length}} мин.", "processing_recording": "Обработка записи, это может занять несколько минут...", "copy_recording_urls": "Скопировать ссылку на запись", "recordings_list_empty": "У вас еще нет записей!", + "public_recordings_list_empty": "Публичных записей нет!", "recordings_list_empty_description": "Записи появятся здесь после того, как вы начнете встречу и запишете ее.", + "public_recordings_list_empty_description": "Записи будут появляться здесь по мере поступления.", "delete_recording": "Удалить запись", "are_you_sure_delete_recording": "Вы уверены, что хотите удалить эту запись?", "search_not_found": "Записи не найдены" @@ -341,7 +350,8 @@ "manage_site_settings": "Разрешить пользователям с этой ролью управлять настройками сайта", "manage_roles": "Разрешить пользователям с этой ролью изменять другие роли", "shared_list": "Включите пользователей с этой ролью в раскрывающийся список для совместного использования комнат.", - "room_limit": "Ограничение комнаты" + "room_limit": "Ограничение комнаты", + "email_on_signup": "Отправлять email, когда новый пользователь зарегистрируется" } } }, @@ -352,6 +362,7 @@ "user_updated": "Пользователь обновлен.", "user_deleted": "Пользователь удален.", "avatar_updated": "Аватар обновлен.", + "password_changed": "Пароль успешно обновлен. Пожалуйста, войдите в систему еще раз.", "password_updated": "Пароль обновлен.", "account_activated": "Учетная запись успешно активирована. Пожалуйста, войдите в ваш аккаунт.", "activation_email_sent": "Письмо активации было выслано", From 889e8efc8c9cce61d03227bfaf0ca9db6687133a Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Wed, 29 Nov 2023 10:41:06 -0500 Subject: [PATCH 42/68] Translate config/locales/en.yml in fa_IR (#5582) 100% translated source file: 'config/locales/en.yml' on 'fa_IR'. Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com> --- config/locales/fa_IR.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/locales/fa_IR.yml b/config/locales/fa_IR.yml index c522174169f..d65cbec8312 100644 --- a/config/locales/fa_IR.yml +++ b/config/locales/fa_IR.yml @@ -66,7 +66,7 @@ fa_IR: valid_invitation: دعوت‌نامه فقط ۴۸ ساعت اعتبار دارد. sign_up: ثبت‌نام new_user_signup: - new_user: ثبت نام کاربر جدید + new_user: ثبت نام کاربر جدید BigBlueButton new_user_description: یک کاربر جدید برای استفاده از BigBlueButton ثبت نام کرده است. name: "نام: %{name}" email: "ایمیل: %{email}" From 00714eb1fcdb61f8dd9ad018c8d30addc6341437 Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Wed, 29 Nov 2023 10:41:20 -0500 Subject: [PATCH 43/68] Translate config/locales/en.yml in fa_IR (#5581) 100% translated source file: 'config/locales/en.yml' on 'fa_IR'. Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com> --- config/locales/fa_IR.yml | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/config/locales/fa_IR.yml b/config/locales/fa_IR.yml index d65cbec8312..d8586cadfd2 100644 --- a/config/locales/fa_IR.yml +++ b/config/locales/fa_IR.yml @@ -47,37 +47,37 @@ fa_IR: opengraph: - description: با استفاده از BigBlueButton بیاموزید؛ راه‌حل متن‌باز و قابل اعتماد کنفرانس تحت وب که همکاری مجازی یکپارچه و تجربیات یادگیری آنلاین را امکان‌پذیر می‌کند. + description: یادگیری با استفاده از BigBlueButton، راه‌حل متن‌باز کنفرانس وب قابل اعتماد است که همکاری مجازی یکپارچه و تجربیات یادگیری آنلاین را امکان پذیر می‌کند. meeting: - moderator_message: "برای دعوت از افراد دیگر به این جلسه، این پیوند را برای آن‌ها ارسال کنید:" + moderator_message: "برای دعوت از افراد دیگر به این جلسه، این پیوند را برای آنها ارسال کنید:" access_code: "کد دسترسی: %{code}" email: activation: account_activation: فعال‌سازی حساب کاربری welcome_to_bbb: به BigBlueButton خوش آمدید. - get_started: برای شروع، لطفا با کلیک بر روی دکمهٔ زیر حساب کاربری خود را فعال کنید. - activate_account: فعال‌کردن حساب کاربری + get_started: برای شروع، لطفا با کلیک بر روی دکمه زیر حساب کاربری خود را فعال کنید. + activate_account: فعال کردن حساب کاربری link_expires: این پیوند ۲۴ ساعت دیگر منقضی خواهد شد. - if_link_expires: در صورت منقضی‌شدن پیوند، لطفا وارد شوید و درخواست یک رایانامهٔ فعال‌سازی جدید کنید. + if_link_expires: در صورت منقضی شدن پیوند، لطفا در سیستم وارد شوید و درخواست فعال سازی ایمیل، جدید کنید. invitation: - invitation_to_join: دعوت‌نامهٔ BigBlueButton + invitation_to_join: دعوت به پیوستن به BigBlueButton you_have_been_invited: "شما توسط %{name} برای ایجاد حساب کاربری در BigBlueButton دعوت شده‌اید." - get_started: برای ثبت‌نام، لطفا روی دکمهٔ زیر کلیک کنید و گام‌ها را دنبال کنید. - valid_invitation: دعوت‌نامه فقط ۴۸ ساعت اعتبار دارد. - sign_up: ثبت‌نام + get_started: برای ثبت نام لطفا روی دکمه زیر کلیک کنید و مراحل را دنبال کنید. + valid_invitation: The invitation is valid for 24 hours. + sign_up: ثبت نام new_user_signup: new_user: ثبت نام کاربر جدید BigBlueButton new_user_description: یک کاربر جدید برای استفاده از BigBlueButton ثبت نام کرده است. name: "نام: %{name}" email: "ایمیل: %{email}" - admin_panel: "پنل مدیر کل" - take_action: "برای مشاهده کاربر جدید یا انجام اقدامات لازم، به پنل مدیر مراجعه کنید" + admin_panel: "پنل مدیریت" + take_action: "برای مشاهده کاربر جدید یا انجام اقدامات لازم، به پنل مدیریت مراجعه کنید" reset: - password_reset: بازنشانی گذرواژه - password_reset_requested: "بازنشانی گذرواژه برای %{email} درخواست شده‌است." - password_reset_confirmation: برای بازنشانی گذرواژه، لطفا روی دکمهٔ زیر کلیک کنید. - reset_password: بازنشانی گذرواژه + password_reset: بازنشانی رمز عبور + password_reset_requested: "بازنشانی رمز عبور برای %{email} درخواست شده است." + password_reset_confirmation: برای بازنشانی رمز عبور، لطفا روی دکمه زیر کلیک کنید. + reset_password: بازنشانی رمز عبور link_expires: این پیوند ۱ ساعت دیگر منقضی خواهد شد. - ignore_request: اگر درخواستی برای تغییر گذرواژه خود نکرده‌اید، لطفا این رایانامه را نادیده بگیرید. + ignore_request: اگر درخواستی برای تغییر رمز عبور خود نکرده‌اید، لطفا این ایمیل را نادیده بگیرید. room: new_room_name: "اتاق %{username}" From fd13b9daa04f495788ebb430ca7dbb010da98964 Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Wed, 29 Nov 2023 10:41:32 -0500 Subject: [PATCH 44/68] Translate config/locales/en.yml in ar (#5576) 100% translated source file: 'config/locales/en.yml' on 'ar'. Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com> --- config/locales/ar.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/locales/ar.yml b/config/locales/ar.yml index 50f99d3f94d..e17e5d7499e 100644 --- a/config/locales/ar.yml +++ b/config/locales/ar.yml @@ -66,7 +66,7 @@ ar: valid_invitation: الدعوة صالحة لمدة 24 ساعة. sign_up: التسجيل new_user_signup: - new_user: تسجيل مستخدم جديد + new_user: تسجيل مستخدم جديد في بك بلو بتن new_user_description: قام مستخدم جديد بالتسجيل لاستخدام بك بلو بتن. name: "الاسم: %{name}" email: "البريد: %{email}" From f8a6636860127529cea4ea0d01931a3b7cf06c46 Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Wed, 29 Nov 2023 10:41:43 -0500 Subject: [PATCH 45/68] Translate config/locales/en.yml in el (#5575) 100% translated source file: 'config/locales/en.yml' on 'el'. Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com> --- config/locales/el.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/locales/el.yml b/config/locales/el.yml index dfa0cc2b368..0b8b9de2574 100644 --- a/config/locales/el.yml +++ b/config/locales/el.yml @@ -66,7 +66,7 @@ el: valid_invitation: Η πρόσκληση ισχύει για 24 ώρες. sign_up: Εγγραφή new_user_signup: - new_user: Εγγραφή νέου χρήστη + new_user: Εγγραφή νέου χρήστη BigBlueButton new_user_description: Ένας νέος χρήστης έχει εγγραφεί για να χρησιμοποιήσει το BigBlueButton. name: "Όνομα: %{name}" email: "Email: %{email}" From b1d00c1d1e37e6eeed79e2284438f53dbafd343a Mon Sep 17 00:00:00 2001 From: Ahmad Farhat Date: Thu, 30 Nov 2023 10:15:16 -0500 Subject: [PATCH 46/68] Fix site settings not updating (#5591) --- .../admin/site_settings/useUpdateSiteSetting.jsx | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/app/javascript/hooks/mutations/admin/site_settings/useUpdateSiteSetting.jsx b/app/javascript/hooks/mutations/admin/site_settings/useUpdateSiteSetting.jsx index c956b524044..797a169f487 100644 --- a/app/javascript/hooks/mutations/admin/site_settings/useUpdateSiteSetting.jsx +++ b/app/javascript/hooks/mutations/admin/site_settings/useUpdateSiteSetting.jsx @@ -26,20 +26,18 @@ export default function useUpdateSiteSetting(name) { const uploadPresentation = (data) => { let settings; + let headers = { 'Content-Type': 'application/json' }; if (name === 'BrandingImage') { fileValidation(data, 'image'); settings = new FormData(); settings.append('site_setting[value]', data); + headers = { 'Content-Type': 'multipart/form-data' }; } else { settings = data; } - return axios.patch(`/admin/site_settings/${name}.json`, settings, { - headers: { - 'Content-Type': 'multipart/form-data', - }, - }); + return axios.patch(`/admin/site_settings/${name}.json`, settings, { headers }); }; const handleSuccess = () => { From 98485ddff16e84a89391f3191aaee1cdd5e9566a Mon Sep 17 00:00:00 2001 From: Rahul Rodrigues Date: Tue, 12 Dec 2023 16:20:22 -0500 Subject: [PATCH 47/68] fixed language dropdown overflow (#5611) --- app/assets/stylesheets/profile.scss | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/app/assets/stylesheets/profile.scss b/app/assets/stylesheets/profile.scss index 8dd7ff8b317..a9990344803 100644 --- a/app/assets/stylesheets/profile.scss +++ b/app/assets/stylesheets/profile.scss @@ -66,3 +66,9 @@ display: none; } } + +#updateUserFormLanguage .dropdown-menu { + max-height: 20vh; + overflow-y: auto; + background-clip: border-box; +} From 4554909b721d85d62de5d8708766ce461e0e1d8e Mon Sep 17 00:00:00 2001 From: Rahul Rodrigues Date: Wed, 13 Dec 2023 09:41:53 -0500 Subject: [PATCH 48/68] fix for when user does not have can create room permissions rooms page loads and doesnt error out (#5602) Co-authored-by: Ahmad Farhat --- .../api/v1/recordings_controller.rb | 3 --- app/controllers/api/v1/rooms_controller.rb | 2 +- .../components/rooms/EmptyRoomsList.jsx | 13 ++++++---- app/javascript/components/rooms/RoomsList.jsx | 25 +++++++++++-------- 4 files changed, 23 insertions(+), 20 deletions(-) diff --git a/app/controllers/api/v1/recordings_controller.rb b/app/controllers/api/v1/recordings_controller.rb index 09262909c0b..f52cdf50dbf 100644 --- a/app/controllers/api/v1/recordings_controller.rb +++ b/app/controllers/api/v1/recordings_controller.rb @@ -28,9 +28,6 @@ class RecordingsController < ApiController before_action only: %i[update update_visibility recording_url] do ensure_authorized(%w[ManageRecordings SharedRoom PublicRecordings], record_id: params[:id]) end - before_action only: %i[index recordings_count] do - ensure_authorized('CreateRoom') - end # GET /api/v1/recordings.json # Returns all of the current_user's recordings diff --git a/app/controllers/api/v1/rooms_controller.rb b/app/controllers/api/v1/rooms_controller.rb index e1e4a982e70..65888045875 100644 --- a/app/controllers/api/v1/rooms_controller.rb +++ b/app/controllers/api/v1/rooms_controller.rb @@ -23,7 +23,7 @@ class RoomsController < ApiController before_action :find_room, only: %i[show update destroy recordings recordings_processing purge_presentation public_show public_recordings] - before_action only: %i[create index] do + before_action only: %i[create] do ensure_authorized('CreateRoom') end before_action only: %i[create] do diff --git a/app/javascript/components/rooms/EmptyRoomsList.jsx b/app/javascript/components/rooms/EmptyRoomsList.jsx index 2932d129229..c6d02adbd78 100644 --- a/app/javascript/components/rooms/EmptyRoomsList.jsx +++ b/app/javascript/components/rooms/EmptyRoomsList.jsx @@ -26,6 +26,7 @@ import UserBoardIcon from './UserBoardIcon'; export default function EmptyRoomsList() { const { t } = useTranslation(); const currentUser = useAuth(); + const canCreate = currentUser?.permissions.CreateRoom; const mutationWrapper = (args) => useCreateRoom({ userId: currentUser.id, ...args }); return ( @@ -39,11 +40,13 @@ export default function EmptyRoomsList() { { t('room.rooms_list_empty_create_room') } - { t('room.add_new_room') }} - title={t('room.create_new_room')} - body={} - /> + { (canCreate === 'true') && ( + { t('room.add_new_room') }} + title={t('room.create_new_room')} + body={} + /> + )} diff --git a/app/javascript/components/rooms/RoomsList.jsx b/app/javascript/components/rooms/RoomsList.jsx index c70bf51c21e..aedda0543e5 100644 --- a/app/javascript/components/rooms/RoomsList.jsx +++ b/app/javascript/components/rooms/RoomsList.jsx @@ -35,6 +35,7 @@ export default function RoomsList() { const [searchInput, setSearchInput] = useState(''); const { isLoading, data: rooms } = useRooms(searchInput); const currentUser = useAuth(); + const canCreate = currentUser?.permissions.CreateRoom; const mutationWrapper = (args) => useCreateRoom({ userId: currentUser.id, ...args }); if (!isLoading && rooms?.length === 0 && !searchInput) { @@ -47,17 +48,19 @@ export default function RoomsList() {
- {t('room.add_new_room')} - - )} - title={t('room.create_new_room')} - body={} - /> + { (canCreate === 'true') && ( + {t('room.add_new_room')} + + )} + title={t('room.create_new_room')} + body={} + /> + )}
{ From 7422a461314e597ac3f14d236ab9e3699c1918aa Mon Sep 17 00:00:00 2001 From: Rahul Rodrigues Date: Wed, 13 Dec 2023 09:44:19 -0500 Subject: [PATCH 49/68] added user rake task set_admin_role (#5587) * added user rake task set_admin_role * fixed rubocop offenses * added guard clauses to user:set_admin_role rake task * minor refactor user.update rake task --- lib/tasks/user.rake | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/lib/tasks/user.rake b/lib/tasks/user.rake index 22cc08a4f9c..018249ac52e 100644 --- a/lib/tasks/user.rake +++ b/lib/tasks/user.rake @@ -43,6 +43,27 @@ namespace :user do exit 0 end + desc 'Set user role to Administrator' + task :set_admin_role, %i[email] => :environment do |_task, args| + email = args[:email] + + # return err if no user email provided + err 'Please provide an email address of the user you wish to set to Administrator role.' if email.blank? + + user = User.find_by(email:, provider: 'greenlight') + + # return err if user not found + err "User with email: #{email} not found" if user.blank? + + role = Role.find_by(name: 'Administrator', provider: 'greenlight') + + # return err if Administrator role not found + err "Role 'Administrator' not found for provider 'greenlight'" if role.blank? + + user.update(role:) + success "User role set to Administrator for email: #{email}" + end + private def check_role!(user:) From 74d40f520156959b8a00c9167b3505f36f06c88c Mon Sep 17 00:00:00 2001 From: Rahul Rodrigues Date: Wed, 13 Dec 2023 09:44:47 -0500 Subject: [PATCH 50/68] access_code on joinCard autofill if viewerCode query param passed (#5610) * viewerCode query param if passed autofills access_code on joinCard * fixed eslint space error * separate useEfect for viewerCode param --- app/javascript/components/rooms/room/join/JoinCard.jsx | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/app/javascript/components/rooms/room/join/JoinCard.jsx b/app/javascript/components/rooms/room/join/JoinCard.jsx index dc7a5a10d7c..6c4034eade3 100644 --- a/app/javascript/components/rooms/room/join/JoinCard.jsx +++ b/app/javascript/components/rooms/room/join/JoinCard.jsx @@ -65,6 +65,7 @@ export default function JoinCard() { const location = useLocation(); const queryParams = new URLSearchParams(location.search); const joinFormName = queryParams.get('joinFormName'); + const viewerCode = queryParams.get('viewerCode'); useEffect(() => { // set cookie to return to if needed const date = new Date(); @@ -98,6 +99,13 @@ export default function JoinCard() { } }, [joinFormName, currentUser?.name]); + useEffect(() => { + // Default viewerCode if passed as query param + if (viewerCode) { + methods.setValue('access_code', viewerCode); + } + }, [viewerCode]); + useEffect(() => { // Room channel subscription: if (roomStatusAPI.isSuccess) { From 0ba52e05b5943b320e46591e162288be9ddaa417 Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Wed, 13 Dec 2023 09:49:27 -0500 Subject: [PATCH 51/68] Translate app/assets/locales/en.json in fr (#5608) 100% translated source file: 'app/assets/locales/en.json' on 'fr'. Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com> --- app/assets/locales/fr.json | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/app/assets/locales/fr.json b/app/assets/locales/fr.json index 966c237d7ec..e70c291424d 100644 --- a/app/assets/locales/fr.json +++ b/app/assets/locales/fr.json @@ -81,6 +81,7 @@ "account_info": "Informations sur le compte", "delete_account": "Supprimer le compte", "change_password": "Changer de mot de passe", + "set_password": "Définissez votre nouveau mot de passe", "reset_password": "Réinitialiser le mot de passe", "update_account_info": "Mettre à jour les informations du compte", "current_password": "Mot de passe actuel", @@ -110,7 +111,7 @@ "delete_room": "Supprimer une salle", "create_new_room": "Créer une nouvelle salle", "enter_room_name": "Saisissez le nom de la salle", - "shared_by": "Partagé par", + "shared_by": "partagé par", "last_session": "Dernière session : {{ localizedTime }}", "no_last_session": "Il n'y a aucune session précédente", "search_not_found": "Aucune salle trouvée", @@ -129,6 +130,7 @@ "click_to_upload": "Cliquez pour téléverser", "drag_and_drop": "ou glissez-déposez", "upload_description": "Téléverser tout document Office ou fichier PDF (d'un volume inférieur à {{size}}). Le délai avant de pouvoir utiliser le fichier varie en fonction de son volume.", + "delete_presentation": "Effacer la présentation", "are_you_sure_delete_presentation": "Etes-vous sûr de vouloir supprimer cet enregistrement ?" }, "shared_access": { @@ -165,6 +167,7 @@ "recording": { "recording": "Enregistrement", "recordings": "Enregistrements", + "processing": "Enregistrements en cours de traitement...", "name": "Nom", "length": "Durée", "users": "Utilisateurs", @@ -347,7 +350,8 @@ "manage_site_settings": "Permettre aux utilisateurs avec ce rôle de gérer les paramètres du site", "manage_roles": "Permettre aux utilisateurs avec ce rôle de modifier les autres rôles", "shared_list": "Inclure les utilisateurs avec ce rôle dans le menu déroulant du partage des salles", - "room_limit": "Limite pour la salle" + "room_limit": "Limite pour la salle", + "email_on_signup": "Recevoir un email quand un nouvel utilisateur s'inscrit" } } }, @@ -358,6 +362,7 @@ "user_updated": "L'utilisateur a été mis à jour.", "user_deleted": "L'utilisateur a été supprimé.", "avatar_updated": "L'avatar a été mis à jour.", + "password_changed": "Votre mot de passe a été mis à jour. Veuillez vous identifier à nouveau.", "password_updated": "Le mot de passe a été changé.", "account_activated": "Le compte a été activé avec succès. Veuillez vous connecter à votre compte.", "activation_email_sent": "Un courriel d'activation a été envoyé.", From a01b7ff17d7aee29405216d5bb912ca929f640d3 Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Wed, 13 Dec 2023 09:49:39 -0500 Subject: [PATCH 52/68] Translate config/locales/en.yml in fr (#5607) 100% translated source file: 'config/locales/en.yml' on 'fr'. Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com> --- config/locales/fr.yml | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/config/locales/fr.yml b/config/locales/fr.yml index a7d46912e4d..2ecaf4ef040 100644 --- a/config/locales/fr.yml +++ b/config/locales/fr.yml @@ -47,37 +47,37 @@ fr: opengraph: - description: "Apprenez à utiliser BigBlueButton, la solution de webconférence open-source, fiable et qui offre une expérience adaptée aux collaborations comme aux apprentissages en ligne." + description: "Apprenez à utiliser BigBlueButton, la solution de webconférence open-source, fiable et qui offre une expérience adaptée aux collaborations comme aux apprentissages en ligne." meeting: - moderator_message: "Pour inviter quelqu'un à la réunion, envoyez-lui ce lien :" - access_code: "Code d'accès: %{code}" + moderator_message: "Pour inviter quelqu'un à la réunion, envoyez ce lien:" + access_code: "Code d'accès: 1%{code}" email: activation: account_activation: Activation du compte - welcome_to_bbb: Bienvenue dans BigBlueButton - get_started: "Pour commencer, veuillez activer votre compte en cliquant sur le bouton ci-dessous." + welcome_to_bbb: Bienvenue dans BigBlueButton! + get_started: "Pour commencer, veuillez activer votre compte en cliquant sur le lien ci-dessous." activate_account: Activer le compte link_expires: Le lien expirera dans 24 heures. - if_link_expires: "Si le lien a expiré, veuillez vous connecter et demander un nouveau courriel pour l'activation." + if_link_expires: "Si le lien a expiré, veuillez vous connecter et demander un nouveau courriel d'activation" invitation: - invitation_to_join: Invitation BigBlueButton - you_have_been_invited: "Vous avez été invité à créer un compte BigBlueButton par %{name} ." - get_started: "Pour vous inscrire, veuillez cliquer sur le bouton ci-dessous et suivre les instructions." + invitation_to_join: Invitation à rejoindre BigBlueButton + you_have_been_invited: "Vous avez été invité à créer un compte dans BigBlueButton par 1%{name}." + get_started: "Pour vous inscrire, veuillez cliquer sur le bouton ci-dessous et suivre les étapes proposées" valid_invitation: L'invitation est valable pendant 24 heures. - sign_up: Inscription + sign_up: inscription new_user_signup: - new_user: Inscription d'un nouvel utilisateur à BigBlueButton + new_user: Nouvelle inscription d'un utilisateur dans BigBlueButton new_user_description: Un nouvel utilisateur s'est inscrit pour utiliser BigBlueButton. name: "Nom: %{name}" - email: "Courriel: %{email}" + email: "Courriel: %{email}" admin_panel: "Panneau Administrateur" - take_action: "Pour afficher le nouvel utilisateur ou toute action nécessaire, consultez le Panneau Administrateur" + take_action: "Pour afficher le nouvel utilisateur ou pour toute action nécessaire, consultez le panneau Administrateur" reset: - password_reset: Réinitialiser le mot de passe - password_reset_requested: "Une réinitialisation de mot de passe a été demandée par %{email} ." - password_reset_confirmation: "Pour réinitialiser votre mot de passe, veuillez cliquer sur le bouton ci-dessous." - reset_password: Réinitialiser le mot de passe + password_reset: Demande de réinitialisation du mot de passe + password_reset_requested: "Une demande de réinitialisation de mot de passe est demandée par 1%{email}" + password_reset_confirmation: "Pour réinitialiser votre mot de passe, veuillez cliquer sur la bouton ci-dessous\"" + reset_password: Réinitialisation du mot de passe link_expires: Le lien expirera dans 1 heure. - ignore_request: "Si vous n'avez pas demandé un changement de mot de passe, veuillez ignorer ce courriel." + ignore_request: "Si vous n'avez pas demandé à changer de mot de passe, ignorez ce message." room: new_room_name: "Salle de %{username}" From 75b23a992bd78e5c0ae928b86e2416ddeea2c89d Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Wed, 13 Dec 2023 09:49:50 -0500 Subject: [PATCH 53/68] Updates for file config/locales/en.yml in ar (#5605) * Translate config/locales/en.yml in ar 100% translated source file: 'config/locales/en.yml' on 'ar'. * Translate config/locales/en.yml in ar 100% translated source file: 'config/locales/en.yml' on 'ar'. * Translate config/locales/en.yml in ar 100% translated source file: 'config/locales/en.yml' on 'ar'. * Translate config/locales/en.yml in ar 100% translated source file: 'config/locales/en.yml' on 'ar'. * Translate config/locales/en.yml in ar 100% translated source file: 'config/locales/en.yml' on 'ar'. * Translate config/locales/en.yml in ar 100% translated source file: 'config/locales/en.yml' on 'ar'. --------- Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com> --- config/locales/ar.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/config/locales/ar.yml b/config/locales/ar.yml index e17e5d7499e..4949ba0553d 100644 --- a/config/locales/ar.yml +++ b/config/locales/ar.yml @@ -47,27 +47,27 @@ ar: opengraph: - description: تعلم باستخدام بك بلو بتن ، الحل الموثوق به لعقد المؤتمرات عبر الويب مفتوح المصدر والذي يتيح التعاون الافتراضي السلس وتجارب التعلم عبر الإنترنت. + description: تعلم باستخدام بك_بلو_بتن ، الحل الموثوق به لعقد المؤتمرات عبر الويب مفتوح المصدر والذي يتيح التعاون الافتراضي السلس وتجارب التعلم عبر الإنترنت. meeting: moderator_message: "لدعوة شخص ما إلى الاجتماع ، أرسل لهم هذا الرابط:" access_code: "رمز الوصول: %{code}" email: activation: account_activation: تفعيل الحساب - welcome_to_bbb: مرحبًا بك في بك بلو بتن! + welcome_to_bbb: مرحبًا بك في بك_بلو_بتن! get_started: للبدء ، يرجى تفعيل حسابك بالضغط على الزر أدناه. activate_account: تفعيل حساب link_expires: ستنتهي صلاحية الرابط في غضون 24 ساعة. if_link_expires: في حالة انتهاء صلاحية الرابط ، يرجى تسجيل الدخول وطلب بريد إلكتروني جديد للتنشيط. invitation: - invitation_to_join: دعوة بك بلو بتن - you_have_been_invited: "لقد تمت دعوتك لإنشاء حساب بك بلو بتن بواسطة %{name}." + invitation_to_join: دعوة بك_بلو_بتن + you_have_been_invited: "لقد تمت دعوتك لإنشاء حساب بك_بلو_بتن بواسطة %{name}." get_started: للتسجيل ، يرجى النقر فوق الزر أدناه واتباع الخطوات. valid_invitation: الدعوة صالحة لمدة 24 ساعة. sign_up: التسجيل new_user_signup: - new_user: تسجيل مستخدم جديد في بك بلو بتن - new_user_description: قام مستخدم جديد بالتسجيل لاستخدام بك بلو بتن. + new_user: تسجيل مستخدم جديد في بك_بلو_بتن + new_user_description: قام مستخدم جديد بالتسجيل لاستخدام بك_بلو_بتن. name: "الاسم: %{name}" email: "البريد: %{email}" admin_panel: "لوحة الإدارة" From 2f86ea22cb8a2b308cb46e29b5afe1948b6dbc32 Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Wed, 13 Dec 2023 09:50:07 -0500 Subject: [PATCH 54/68] Translate config/locales/en.yml in de (#5598) 100% translated source file: 'config/locales/en.yml' on 'de'. Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com> --- config/locales/de.yml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/config/locales/de.yml b/config/locales/de.yml index 57910ff4ad9..4fc5b33a19f 100644 --- a/config/locales/de.yml +++ b/config/locales/de.yml @@ -65,6 +65,13 @@ de: get_started: "Um dich zu registrieren, klicken bitte auf diese Schaltfläche." valid_invitation: Die Einladung ist 24 Stunden gültig. sign_up: Registrieren + new_user_signup: + new_user: Anmeldung eines neuen BigBlueButton-Nutzers + new_user_description: Ein neuer Nutzer hat sich angemeldet um BigBlueButton zu benutzen. + name: "Name: %{name}" + email: "E-Mail: %{email}" + admin_panel: "Administrator-Panel" + take_action: "Besuchen Sie das Administrator-Panel um den neuen Nutzer zu sehen und entsprechende Maßnahmen zu ergreifen" reset: password_reset: Passwort zurücksetzen password_reset_requested: "Eine Passwortrücksetzung wurde für %{email} beantragt." From 45dfdfec22b7040c5489f82790bfa4e5c266a574 Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Wed, 13 Dec 2023 09:50:18 -0500 Subject: [PATCH 55/68] Translate app/assets/locales/en.json in de (#5597) 100% translated source file: 'app/assets/locales/en.json' on 'de'. Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com> --- app/assets/locales/de.json | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/app/assets/locales/de.json b/app/assets/locales/de.json index c5f5d9b3b47..6ea8381fe04 100644 --- a/app/assets/locales/de.json +++ b/app/assets/locales/de.json @@ -81,6 +81,7 @@ "account_info": "Kontoinformation", "delete_account": "Konto löschen", "change_password": "Passwort ändern", + "set_password": "Setzen Sie Ihr neues Passwort", "reset_password": "Passwort zurücksetzen", "update_account_info": "Konto aktualisieren", "current_password": "Aktuelles Passwort", @@ -129,6 +130,7 @@ "click_to_upload": "Klicken zum Hochladen", "drag_and_drop": " oder Datei per Drag & Drop hier ablegen.", "upload_description": "Ein Office-Dokument oder eine PDF-Datei hochladen (nicht größer als {{size}}). Abhängig von der Größe kann das eine gewisse Zeit dauern.", + "delete_presentation": "Präsentation löschen", "are_you_sure_delete_presentation": "Diese Präsentation wirklich löschen?" }, "shared_access": { @@ -165,6 +167,7 @@ "recording": { "recording": "Aufzeichnung", "recordings": "Aufzeichnungen", + "processing": "Aufzeichnungen werden erstellt...", "name": "Name", "length": "Länge", "users": "Nutzer:innen", @@ -347,7 +350,8 @@ "manage_site_settings": "Nutzer:innen mit dieser Rolle erlauben, die Webseiteneinstellungen zu verwalten", "manage_roles": "Nutzer:innen mit dieser Rolle erlauben, andere Rollen zu bearbeiten", "shared_list": "Nutzer:innen mit dieser Rolle in die Auswahlliste für die gemeinsame Nutzung von Räumen aufnehmen", - "room_limit": "Raumlimit" + "room_limit": "Raumlimit", + "email_on_signup": "Bei Anmeldung neuer Nutzer E-Mail erhalten" } } }, @@ -358,6 +362,7 @@ "user_updated": "Nutzer:in aktualisiert.", "user_deleted": "Nutzer:in gelöscht.", "avatar_updated": "Avatar aktualisiert.", + "password_changed": "Passwort erfolgreich aktualisiert. Bitte erneut anmelden.", "password_updated": "Passwort aktualisiert.", "account_activated": "Konto erfolgreich aktiviert. Bitte melden Sie sich in Ihrem Konto an.", "activation_email_sent": "E-Mail zur Aktivierung wurde gesendet", From 1006dace6629ebb333fa96e70cc600465100b8f7 Mon Sep 17 00:00:00 2001 From: Anton Georgiev Date: Wed, 13 Dec 2023 09:54:30 -0500 Subject: [PATCH 56/68] [Snyk] Security upgrade factory_bot_rails from 6.4.0 to 6.4.2 (#5580) * fix: Gemfile & Gemfile.lock to reduce vulnerabilities The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-RUBY-RACK-1061917 * Update Gemfile.lock --------- Co-authored-by: snyk-bot Co-authored-by: Ahmad Farhat --- Gemfile | 2 +- Gemfile.lock | 7 +++---- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/Gemfile b/Gemfile index 9108f673cde..7fa0c910996 100644 --- a/Gemfile +++ b/Gemfile @@ -49,7 +49,7 @@ end group :test do gem 'capybara' gem 'factory_bot', '>= 6.4.1' - gem 'factory_bot_rails', '>= 6.3.0' + gem 'factory_bot_rails', '>= 6.4.2' gem 'faker' gem 'rspec-rails', '>= 6.0.4' gem 'selenium-webdriver' diff --git a/Gemfile.lock b/Gemfile.lock index 3377223f90b..3851b5bd66a 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -158,9 +158,9 @@ GEM drb (2.2.0) ruby2_keywords erubi (1.12.0) - factory_bot (6.4.1) + factory_bot (6.4.2) activesupport (>= 5.0.0) - factory_bot_rails (6.4.0) + factory_bot_rails (6.4.2) factory_bot (~> 6.4) railties (>= 5.0.0) faker (3.1.1) @@ -506,7 +506,7 @@ DEPENDENCIES debug dotenv-rails factory_bot (>= 6.4.1) - factory_bot_rails (>= 6.3.0) + factory_bot_rails (>= 6.4.2) faker google-cloud-storage (~> 1.44) hcaptcha @@ -539,4 +539,3 @@ DEPENDENCIES web-console (>= 4.2.1) webdrivers webmock - From a5a18507f50ecf8ca08944b1de714a69896cbfec Mon Sep 17 00:00:00 2001 From: Jesus Federico Date: Wed, 13 Dec 2023 09:55:36 -0500 Subject: [PATCH 57/68] Rename mirror.yml to .mirror.yml (#5564) --- .github/workflows/{mirror.yml => .mirror.yml} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename .github/workflows/{mirror.yml => .mirror.yml} (100%) diff --git a/.github/workflows/mirror.yml b/.github/workflows/.mirror.yml similarity index 100% rename from .github/workflows/mirror.yml rename to .github/workflows/.mirror.yml From acfd54fb6a4cde5c9608b4a9fcc1d41707a2d618 Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Wed, 13 Dec 2023 11:29:10 -0500 Subject: [PATCH 58/68] Translate app/assets/locales/en.json in fr (#5615) 100% translated source file: 'app/assets/locales/en.json' on 'fr'. Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com> --- app/assets/locales/fr.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/assets/locales/fr.json b/app/assets/locales/fr.json index e70c291424d..db54f9e1d04 100644 --- a/app/assets/locales/fr.json +++ b/app/assets/locales/fr.json @@ -29,7 +29,7 @@ "action_permanent": "Cette action ne peut être annulée", "homepage": { "welcome_bbb": "Bienvenue sur BigBlueButton.", - "bigbluebutton_description": "BigBluButton est un système de webconférence dont le code source ouvert et qui est destinée à l'enseignement en ligne. La plateforme permet de profiter au mieux du temps dédié à la formation en favorisant la collaboration et une supervision en temps réel. ", + "bigbluebutton_description": "BigBlueButton est un système de webconférence dont le code source ouvert et qui est destinée à l'enseignement en ligne. La plateforme permet de profiter au mieux du temps dédié à la formation en favorisant la collaboration et une supervision en temps réel. ", "greenlight_description": "Créez vos salles et sessions ou rejoignez celles de autres grâce à un lien court et pratique.", "learn_more": "En apprendre plus sur BigBlueButton", "explore_features": "Découvrez les fonctionnalités", From 31fa9ab6d4e333321a977b36092ea77e67838809 Mon Sep 17 00:00:00 2001 From: Ahmad Farhat Date: Wed, 13 Dec 2023 14:14:45 -0500 Subject: [PATCH 59/68] Limit recording visibility by Role (#5614) * initial work * more work * Final work * Remove unneeded changes * Fixes to versions --- app/assets/locales/en.json | 3 +- .../stylesheets/application.bootstrap.scss | 15 + .../v1/admin/role_permissions_controller.rb | 2 +- .../api/v1/recordings_controller.rb | 8 +- .../admin/roles/forms/EditRoleForm.jsx | 34 + .../components/recordings/RecordingRow.jsx | 85 +- .../utilities/SimpleSelect.jsx | 2 +- app/services/tenant_setup.rb | 6 +- ...4647_add_visibility_to_role_permissions.rb | 15 + db/data_schema.rb | 2 +- package-lock.json | 13910 ++++++---------- package.json | 3 +- .../controllers/recordings_controller_spec.rb | 26 +- spec/factories/role_factory.rb | 2 + yarn.lock | 3645 ++-- 15 files changed, 7352 insertions(+), 10406 deletions(-) create mode 100644 db/data/20231210154647_add_visibility_to_role_permissions.rb diff --git a/app/assets/locales/en.json b/app/assets/locales/en.json index bc52d3968f5..85489e6c004 100644 --- a/app/assets/locales/en.json +++ b/app/assets/locales/en.json @@ -351,7 +351,8 @@ "manage_roles": "Allow users with this role to edit other roles", "shared_list": "Include users with this role in the dropdown for sharing rooms", "room_limit": "Room Limit", - "email_on_signup": "Receive an email when a new user signs up" + "email_on_signup": "Receive an email when a new user signs up", + "allowed_recording_visibility": "Allowed recording visibilities" } } }, diff --git a/app/assets/stylesheets/application.bootstrap.scss b/app/assets/stylesheets/application.bootstrap.scss index 9254303d881..57e48faba32 100644 --- a/app/assets/stylesheets/application.bootstrap.scss +++ b/app/assets/stylesheets/application.bootstrap.scss @@ -284,6 +284,21 @@ input.search-bar { } } +.custom-select { + .select-brand-control { + border-color: var(--brand-color) !important; + box-shadow: 0 0 0 1px var(--brand-color) !important; + } + + .select-brand-option { + background-color: whitesmoke; + color: var(--brand-color) !important; + &:active { + background-color: var(--brand-color-light) !important; + } + } +} + //Brand :root { --brand-color: ''; diff --git a/app/controllers/api/v1/admin/role_permissions_controller.rb b/app/controllers/api/v1/admin/role_permissions_controller.rb index b694807ca1e..f1cf0f30ca2 100644 --- a/app/controllers/api/v1/admin/role_permissions_controller.rb +++ b/app/controllers/api/v1/admin/role_permissions_controller.rb @@ -50,7 +50,7 @@ def update private def role_params - params.require(:role).permit(:role_id, :name, :value) + params.require(:role).permit(:role_id, :name, :value, value: []) end def create_default_room diff --git a/app/controllers/api/v1/recordings_controller.rb b/app/controllers/api/v1/recordings_controller.rb index f52cdf50dbf..2602753212f 100644 --- a/app/controllers/api/v1/recordings_controller.rb +++ b/app/controllers/api/v1/recordings_controller.rb @@ -63,9 +63,13 @@ def destroy def update_visibility new_visibility = params[:visibility].to_s - new_visibility_params = visibility_params_of(new_visibility) + allowed_visibilities = JSON.parse(RolePermission.joins(:permission) + .find_by(role_id: current_user.role_id, permission: { name: 'AccessToVisibilities' }) + .value) + + return render_error status: :forbidden unless allowed_visibilities.include?(new_visibility) - return render_error status: :bad_request if new_visibility_params.nil? + new_visibility_params = visibility_params_of(new_visibility) bbb_api = BigBlueButtonApi.new(provider: current_provider) diff --git a/app/javascript/components/admin/roles/forms/EditRoleForm.jsx b/app/javascript/components/admin/roles/forms/EditRoleForm.jsx index 5e90df42c1d..b80e15dcdbf 100644 --- a/app/javascript/components/admin/roles/forms/EditRoleForm.jsx +++ b/app/javascript/components/admin/roles/forms/EditRoleForm.jsx @@ -18,6 +18,7 @@ import React from 'react'; import PropTypes from 'prop-types'; import { Button, Stack } from 'react-bootstrap'; import { useTranslation } from 'react-i18next'; +import Select from 'react-select'; import Form from '../../../shared_components/forms/Form'; import FormControl from '../../../shared_components/forms/FormControl'; import useUpdateRole from '../../../../hooks/mutations/admin/roles/useUpdateRole'; @@ -44,6 +45,14 @@ export default function EditRoleForm({ role }) { const { methods: methodsName, fields: fieldsName } = useEditRoleNameForm({ defaultValues: { name: role?.name } }); + const visibilityOptions = [ + { value: 'Published', label: 'Published' }, + { value: 'Unpublished', label: 'Unpublished' }, + { value: 'Protected', label: 'Protected' }, + { value: 'Public', label: 'Public' }, + { value: 'Public/Protected', label: 'Public/Protected' }, + ]; + const { methods: methodsLimit, fields: fieldsLimit, @@ -137,6 +146,31 @@ export default function EditRoleForm({ role }) { defaultValue={rolePermissions?.EmailOnSignup === 'true'} /> + + +
+ {t('admin.roles.edit.allowed_recording_visibility')} +
+
+