diff --git a/.github/workflows/ci.build.prerelease.yml b/.github/workflows/ci.build.prerelease.yml index 8d959a0cda..0cd662a5e9 100644 --- a/.github/workflows/ci.build.prerelease.yml +++ b/.github/workflows/ci.build.prerelease.yml @@ -1,5 +1,5 @@ env: - RUBY_VERSION: 3.1 + RUBY_VERSION: 3.3 name: CI Build Pre-Release on: diff --git a/.github/workflows/ci.build.push.yml b/.github/workflows/ci.build.push.yml index ed102702a9..c44230bdf4 100644 --- a/.github/workflows/ci.build.push.yml +++ b/.github/workflows/ci.build.push.yml @@ -1,5 +1,5 @@ env: - RUBY_VERSION: 3.1 + RUBY_VERSION: 3.3 name: CI Build Push on: diff --git a/.github/workflows/ci.build.release.yml b/.github/workflows/ci.build.release.yml index 64616d00c6..4f95bbae0d 100644 --- a/.github/workflows/ci.build.release.yml +++ b/.github/workflows/ci.build.release.yml @@ -1,5 +1,5 @@ env: - RUBY_VERSION: 3.1 + RUBY_VERSION: 3.3 name: CI Build Release on: @@ -13,7 +13,7 @@ jobs: DOCKER_REPOSITORY: ${{ secrets.DOCKER_REPOSITORY }} DOCKER_BUILD_ENABLED: ${{ secrets.DOCKER_BUILD_ENABLED }} DOCKER_BUILD_ALTERNATE_ENABLED: ${{ secrets.DOCKER_BUILD_ALTERNATE_ENABLED }} - runs-on: ubuntu-20.04 + runs-on: ubuntu-24.04 steps: - name: Checkout if: contains(env.DOCKER_BUILD_ENABLED, 'true') diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index f0262ffacf..c10e475cef 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,5 +1,5 @@ env: - RUBY_VERSION: 3.1.0 + RUBY_VERSION: 3.3 DATABASE_URL: postgres://postgres:postgres@localhost/greenlight-actions RAILS_ENV: test @@ -11,7 +11,7 @@ on: jobs: test: name: Rubocop + RSpec + ESLint + License Header Check - runs-on: ubuntu-20.04 + runs-on: ubuntu-24.04 services: postgres: @@ -37,6 +37,9 @@ jobs: with: ruby-version: ${{ env.RUBY_VERSION }} + - name: Install imagemagick + run: sudo apt-get install -y imagemagick + - name: Bundle cache uses: actions/cache@v2 with: diff --git a/.rubocop.yml b/.rubocop.yml index a2f21d57c0..3a19619f6f 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -14,7 +14,7 @@ AllCops: - 'vendor/bundle/**/*' - 'config/routes.rb' DisabledByDefault: false - TargetRubyVersion: 3.1 + TargetRubyVersion: 3.3 NewCops: enable # Document classes and non-namespace modules. @@ -73,7 +73,7 @@ Metrics/ClassLength: # A calculated magnitude based on number of assignments, # branches, and conditions. Metrics/AbcSize: - Max: 85 + Max: 95 Metrics/ParameterLists: CountKeywordArgs: false @@ -82,10 +82,10 @@ RSpec/AnyInstance: Enabled: false Metrics/CyclomaticComplexity: - Max: 18 + Max: 25 Metrics/PerceivedComplexity: - Max: 18 + Max: 25 Rails/Exit: Exclude: diff --git a/.ruby-version b/.ruby-version deleted file mode 100644 index fd2a01863f..0000000000 --- a/.ruby-version +++ /dev/null @@ -1 +0,0 @@ -3.1.0 diff --git a/Dockerfile b/Dockerfile index f7687b5fed..6de22ea155 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM ruby:alpine3.17 AS base +FROM ruby:3.3-alpine3.20 AS base ARG RAILS_ROOT=/usr/src/app ENV RAILS_ROOT=${RAILS_ROOT} diff --git a/Gemfile b/Gemfile index 9e19b81431..c5357c8bde 100644 --- a/Gemfile +++ b/Gemfile @@ -3,35 +3,35 @@ source 'https://rubygems.org' git_source(:github) { |repo| "https://github.com/#{repo}.git" } -ruby '>= 3.0' +ruby '>= 3.3' -gem 'active_model_serializers', '>= 0.10.14' -gem 'active_storage_validations', '>= 1.1.0' +gem 'active_model_serializers', '>= 0.10.15' +gem 'active_storage_validations', '>= 1.3.4' gem 'aws-sdk-s3', require: false gem 'bcrypt', '~> 3.1.7' gem 'bigbluebutton-api-ruby', '1.9.1' gem 'bootsnap', require: false gem 'clamby', '~> 1.6.10' gem 'cssbundling-rails', '>= 1.3.3' -gem 'data_migrate', '>= 9.4.0' +gem 'data_migrate', '>= 11.2' gem 'dotenv-rails' gem 'google-cloud-storage', '~> 1.44', require: false gem 'hcaptcha' -gem 'hiredis', '~> 0.6.0' gem 'i18n-language-mapping' gem 'image_processing', '~> 1.2' -gem 'jbuilder' +gem 'jbuilder', '>= 2.12' gem 'jsbundling-rails', '>= 1.2.2' gem 'jwt' gem 'mini_magick', '>= 4.9.5' +gem 'nkf', '~> 0.2.0' gem 'omniauth', '~> 2.1.2' gem 'omniauth_openid_connect', '>= 0.6.1' gem 'omniauth-rails_csrf_protection', '~> 1.0.2' gem 'pagy', '~> 6.0', '>= 6.0.0' gem 'pg' -gem 'puma', '~> 5.6' -gem 'rails', '~> 7.1.3', '>= 7.1.3.3' -gem 'redis', '~> 4.0' +gem 'puma', '~> 6.4' +gem 'rails', '~> 7.2.2' +gem 'redis', '~> 4.8.0' gem 'sprockets-rails', '>= 3.5.0' gem 'tzinfo-data', platforms: %i[mingw mswin x64_mingw jruby] @@ -54,11 +54,11 @@ group :test do gem 'factory_bot', '>= 6.4.1' gem 'factory_bot_rails', '>= 6.4.3' gem 'faker' - gem 'rspec-rails', '>= 6.0.4' + gem 'rspec-rails', '~> 7.1' gem 'selenium-webdriver' gem 'shoulda-matchers', '~> 5.0' gem 'webdrivers' - gem 'webmock' + gem 'webmock', '>= 3.23.1' end group :production do diff --git a/Gemfile.lock b/Gemfile.lock index 86bfec749b..be878cc1b3 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,90 +1,88 @@ GEM remote: https://rubygems.org/ specs: - actioncable (7.1.3.4) - actionpack (= 7.1.3.4) - activesupport (= 7.1.3.4) + actioncable (7.2.2.1) + actionpack (= 7.2.2.1) + activesupport (= 7.2.2.1) nio4r (~> 2.0) websocket-driver (>= 0.6.1) zeitwerk (~> 2.6) - actionmailbox (7.1.3.4) - actionpack (= 7.1.3.4) - activejob (= 7.1.3.4) - activerecord (= 7.1.3.4) - activestorage (= 7.1.3.4) - activesupport (= 7.1.3.4) - mail (>= 2.7.1) - net-imap - net-pop - net-smtp - actionmailer (7.1.3.4) - actionpack (= 7.1.3.4) - actionview (= 7.1.3.4) - activejob (= 7.1.3.4) - activesupport (= 7.1.3.4) - mail (~> 2.5, >= 2.5.4) - net-imap - net-pop - net-smtp + actionmailbox (7.2.2.1) + actionpack (= 7.2.2.1) + activejob (= 7.2.2.1) + activerecord (= 7.2.2.1) + activestorage (= 7.2.2.1) + activesupport (= 7.2.2.1) + mail (>= 2.8.0) + actionmailer (7.2.2.1) + actionpack (= 7.2.2.1) + actionview (= 7.2.2.1) + activejob (= 7.2.2.1) + activesupport (= 7.2.2.1) + mail (>= 2.8.0) rails-dom-testing (~> 2.2) - actionpack (7.1.3.4) - actionview (= 7.1.3.4) - activesupport (= 7.1.3.4) + actionpack (7.2.2.1) + actionview (= 7.2.2.1) + activesupport (= 7.2.2.1) nokogiri (>= 1.8.5) racc - rack (>= 2.2.4) + rack (>= 2.2.4, < 3.2) rack-session (>= 1.0.1) rack-test (>= 0.6.3) rails-dom-testing (~> 2.2) rails-html-sanitizer (~> 1.6) - actiontext (7.1.3.4) - actionpack (= 7.1.3.4) - activerecord (= 7.1.3.4) - activestorage (= 7.1.3.4) - activesupport (= 7.1.3.4) + useragent (~> 0.16) + actiontext (7.2.2.1) + actionpack (= 7.2.2.1) + activerecord (= 7.2.2.1) + activestorage (= 7.2.2.1) + activesupport (= 7.2.2.1) globalid (>= 0.6.0) nokogiri (>= 1.8.5) - actionview (7.1.3.4) - activesupport (= 7.1.3.4) + actionview (7.2.2.1) + activesupport (= 7.2.2.1) builder (~> 3.1) erubi (~> 1.11) rails-dom-testing (~> 2.2) rails-html-sanitizer (~> 1.6) - active_model_serializers (0.10.14) + active_model_serializers (0.10.15) actionpack (>= 4.1) activemodel (>= 4.1) case_transform (>= 0.2) jsonapi-renderer (>= 0.1.1.beta1, < 0.3) - active_storage_validations (1.1.0) - activejob (>= 5.2.0) - activemodel (>= 5.2.0) - activestorage (>= 5.2.0) - activesupport (>= 5.2.0) - activejob (7.1.3.4) - activesupport (= 7.1.3.4) + active_storage_validations (1.3.5) + activejob (>= 6.1.4) + activemodel (>= 6.1.4) + activestorage (>= 6.1.4) + activesupport (>= 6.1.4) + marcel (>= 1.0.3) + activejob (7.2.2.1) + activesupport (= 7.2.2.1) globalid (>= 0.3.6) - activemodel (7.1.3.4) - activesupport (= 7.1.3.4) - activerecord (7.1.3.4) - activemodel (= 7.1.3.4) - activesupport (= 7.1.3.4) + activemodel (7.2.2.1) + activesupport (= 7.2.2.1) + activerecord (7.2.2.1) + activemodel (= 7.2.2.1) + activesupport (= 7.2.2.1) timeout (>= 0.4.0) - activestorage (7.1.3.4) - actionpack (= 7.1.3.4) - activejob (= 7.1.3.4) - activerecord (= 7.1.3.4) - activesupport (= 7.1.3.4) + activestorage (7.2.2.1) + actionpack (= 7.2.2.1) + activejob (= 7.2.2.1) + activerecord (= 7.2.2.1) + activesupport (= 7.2.2.1) marcel (~> 1.0) - activesupport (7.1.3.4) + activesupport (7.2.2.1) base64 + benchmark (>= 0.3) bigdecimal - concurrent-ruby (~> 1.0, >= 1.0.2) + concurrent-ruby (~> 1.0, >= 1.3.1) connection_pool (>= 2.2.5) drb i18n (>= 1.6, < 2) + logger (>= 1.4.2) minitest (>= 5.1) - mutex_m - tzinfo (~> 2.0) + securerandom (>= 0.3) + tzinfo (~> 2.0, >= 2.0.5) addressable (2.8.1) public_suffix (>= 2.0.2, < 6.0) aes_key_wrap (1.1.0) @@ -106,8 +104,9 @@ GEM aws-sigv4 (~> 1.4) aws-sigv4 (1.5.2) aws-eventstream (~> 1, >= 1.0.2) - base64 (0.1.1) + base64 (0.1.2) bcrypt (3.1.18) + benchmark (0.4.0) bigbluebutton-api-ruby (1.9.1) childprocess (>= 1.0.1) ffi (>= 1.9.24) @@ -135,14 +134,15 @@ GEM activesupport childprocess (4.1.0) clamby (1.6.10) - concurrent-ruby (1.3.3) + concurrent-ruby (1.3.4) connection_pool (2.4.1) - crack (0.4.5) + crack (1.0.0) + bigdecimal rexml crass (1.0.6) cssbundling-rails (1.3.3) railties (>= 6.0.0) - data_migrate (9.4.0) + data_migrate (11.2.0) activerecord (>= 6.1) railties (>= 6.1) date (3.3.4) @@ -150,7 +150,7 @@ GEM irb (>= 1.5.0) reline (>= 0.3.1) declarative (0.0.20) - diff-lcs (1.5.0) + diff-lcs (1.5.1) digest-crc (0.6.5) rake (>= 12.0.0, < 14.0.0) dotenv (2.8.1) @@ -158,7 +158,7 @@ GEM dotenv (= 2.8.1) railties (>= 3.2) drb (2.2.1) - erubi (1.12.0) + erubi (1.13.0) factory_bot (6.4.5) activesupport (>= 5.0.0) factory_bot_rails (6.4.3) @@ -209,23 +209,22 @@ GEM multi_json (~> 1.11) os (>= 0.9, < 2.0) signet (>= 0.16, < 2.a) - hashdiff (1.0.1) + hashdiff (1.1.2) hashie (5.0.0) hcaptcha (7.1.0) json - hiredis (0.6.3) httpclient (2.8.3) - i18n (1.14.5) + i18n (1.14.6) concurrent-ruby (~> 1.0) i18n-language-mapping (0.1.3.1) image_processing (1.12.2) mini_magick (>= 4.9.5, < 5) ruby-vips (>= 2.0.17, < 3) io-console (0.7.2) - irb (1.13.1) + irb (1.14.1) rdoc (>= 4.0.0) reline (>= 0.4.2) - jbuilder (2.11.5) + jbuilder (2.13.0) actionview (>= 5.0.0) activesupport (>= 5.0.0) jmespath (1.6.2) @@ -242,6 +241,7 @@ GEM jsonapi-renderer (0.2.2) jwt (2.7.0) language_server-protocol (3.17.0.3) + logger (1.6.2) lograge (0.14.0) actionpack (>= 4) activesupport (>= 4) @@ -261,13 +261,12 @@ GEM mini_magick (4.12.0) mini_mime (1.1.5) mini_portile2 (2.8.7) - minitest (5.23.1) + minitest (5.25.1) msgpack (1.6.0) multi_json (1.15.0) - mutex_m (0.2.0) net-http (0.4.1) uri - net-imap (0.4.12) + net-imap (0.4.17) date net-protocol net-pop (0.1.2) @@ -277,10 +276,11 @@ GEM net-smtp (0.5.0) net-protocol nio4r (2.7.3) - nokogiri (1.16.5) + nkf (0.2.0) + nokogiri (1.16.7) mini_portile2 (~> 2.8.2) racc (~> 1.4) - nokogiri (1.16.5-x86_64-linux) + nokogiri (1.16.7-x86_64-linux) racc (~> 1.4) omniauth (2.1.2) hashie (>= 3.4.6) @@ -315,10 +315,10 @@ GEM psych (5.1.2) stringio public_suffix (5.0.3) - puma (5.6.8) + puma (6.5.0) nio4r (~> 2.0) - racc (1.8.0) - rack (2.2.9) + racc (1.8.1) + rack (2.2.10) rack-oauth2 (2.2.0) activesupport attr_required @@ -336,20 +336,20 @@ GEM rackup (1.0.0) rack (< 3) webrick - rails (7.1.3.4) - actioncable (= 7.1.3.4) - actionmailbox (= 7.1.3.4) - actionmailer (= 7.1.3.4) - actionpack (= 7.1.3.4) - actiontext (= 7.1.3.4) - actionview (= 7.1.3.4) - activejob (= 7.1.3.4) - activemodel (= 7.1.3.4) - activerecord (= 7.1.3.4) - activestorage (= 7.1.3.4) - activesupport (= 7.1.3.4) + rails (7.2.2.1) + actioncable (= 7.2.2.1) + actionmailbox (= 7.2.2.1) + actionmailer (= 7.2.2.1) + actionpack (= 7.2.2.1) + actiontext (= 7.2.2.1) + actionview (= 7.2.2.1) + activejob (= 7.2.2.1) + activemodel (= 7.2.2.1) + activerecord (= 7.2.2.1) + activestorage (= 7.2.2.1) + activesupport (= 7.2.2.1) bundler (>= 1.15.0) - railties (= 7.1.3.4) + railties (= 7.2.2.1) rails-dom-testing (2.2.0) activesupport (>= 5.0.0) minitest @@ -357,10 +357,10 @@ GEM rails-html-sanitizer (1.6.0) loofah (~> 2.21) nokogiri (~> 1.14) - railties (7.1.3.4) - actionpack (= 7.1.3.4) - activesupport (= 7.1.3.4) - irb + railties (7.2.2.1) + actionpack (= 7.2.2.1) + activesupport (= 7.2.2.1) + irb (~> 1.13) rackup (>= 1.0.0) rake (>= 12.2) thor (~> 1.0, >= 1.2.2) @@ -371,7 +371,7 @@ GEM psych (>= 4.0.0) redis (4.8.0) regexp_parser (2.8.1) - reline (0.5.9) + reline (0.5.10) io-console (~> 0.5) remote_syslog_logger (1.0.4) syslog_protocol @@ -382,24 +382,24 @@ GEM request_store (1.5.1) rack (>= 1.4) retriable (3.1.2) - rexml (3.2.6) - rspec-core (3.12.2) - rspec-support (~> 3.12.0) - rspec-expectations (3.12.3) + rexml (3.3.9) + rspec-core (3.13.2) + rspec-support (~> 3.13.0) + rspec-expectations (3.13.3) diff-lcs (>= 1.2.0, < 2.0) - rspec-support (~> 3.12.0) - rspec-mocks (3.12.6) + rspec-support (~> 3.13.0) + rspec-mocks (3.13.2) diff-lcs (>= 1.2.0, < 2.0) - rspec-support (~> 3.12.0) - rspec-rails (6.1.0) - actionpack (>= 6.1) - activesupport (>= 6.1) - railties (>= 6.1) - rspec-core (~> 3.12) - rspec-expectations (~> 3.12) - rspec-mocks (~> 3.12) - rspec-support (~> 3.12) - rspec-support (3.12.1) + rspec-support (~> 3.13.0) + rspec-rails (7.1.0) + actionpack (>= 7.0) + activesupport (>= 7.0) + railties (>= 7.0) + rspec-core (~> 3.13) + rspec-expectations (~> 3.13) + rspec-mocks (~> 3.13) + rspec-support (~> 3.13) + rspec-support (3.13.2) rubocop (1.56.1) base64 (~> 0.1.1) json (~> 2.3) @@ -431,6 +431,7 @@ GEM ruby-vips (2.1.4) ffi (~> 1.12) rubyzip (2.3.2) + securerandom (0.4.0) selenium-webdriver (4.8.0) rexml (~> 3.2, >= 3.2.5) rubyzip (>= 1.2.2, < 3.0) @@ -449,14 +450,14 @@ GEM actionpack (>= 6.1) activesupport (>= 6.1) sprockets (>= 3.0.0) - stringio (3.1.0) + stringio (3.1.1) swd (2.0.2) activesupport (>= 3) attr_required (>= 0.0.5) faraday (~> 2.0) faraday-follow_redirects syslog_protocol (0.9.2) - thor (1.3.1) + thor (1.3.2) timeout (0.4.1) trailblazer-option (0.1.2) tzinfo (2.0.6) @@ -464,6 +465,7 @@ GEM uber (0.1.0) unicode-display_width (2.4.2) uri (0.13.0) + useragent (0.16.11) validate_email (0.1.6) activemodel (>= 3.0) mail (>= 2.2.5) @@ -483,11 +485,11 @@ GEM activesupport faraday (~> 2.0) faraday-follow_redirects - webmock (3.18.1) + webmock (3.24.0) addressable (>= 2.8.0) crack (>= 0.3.2) hashdiff (>= 0.4.0, < 2.0.0) - webrick (1.8.1) + webrick (1.8.2) websocket (1.2.9) websocket-driver (0.7.6) websocket-extensions (>= 0.1.0) @@ -496,15 +498,15 @@ GEM rexml xpath (3.2.0) nokogiri (~> 1.8) - zeitwerk (2.6.15) + zeitwerk (2.6.18) PLATFORMS ruby x86_64-linux DEPENDENCIES - active_model_serializers (>= 0.10.14) - active_storage_validations (>= 1.1.0) + active_model_serializers (>= 0.10.15) + active_storage_validations (>= 1.3.4) aws-sdk-s3 bcrypt (~> 3.1.7) bigbluebutton-api-ruby (= 1.9.1) @@ -512,7 +514,7 @@ DEPENDENCIES capybara clamby (~> 1.6.10) cssbundling-rails (>= 1.3.3) - data_migrate (>= 9.4.0) + data_migrate (>= 11.2) debug dotenv-rails factory_bot (>= 6.4.1) @@ -520,24 +522,24 @@ DEPENDENCIES faker google-cloud-storage (~> 1.44) hcaptcha - hiredis (~> 0.6.0) i18n-language-mapping image_processing (~> 1.2) - jbuilder + jbuilder (>= 2.12) jsbundling-rails (>= 1.2.2) jwt lograge (~> 0.14.0) mini_magick (>= 4.9.5) + nkf (~> 0.2.0) omniauth (~> 2.1.2) omniauth-rails_csrf_protection (~> 1.0.2) omniauth_openid_connect (>= 0.6.1) pagy (~> 6.0, >= 6.0.0) pg - puma (~> 5.6) - rails (~> 7.1.3, >= 7.1.3.3) - redis (~> 4.0) + puma (~> 6.4) + rails (~> 7.2.2) + redis (~> 4.8.0) remote_syslog_logger - rspec-rails (>= 6.0.4) + rspec-rails (~> 7.1) rubocop (~> 1.26) rubocop-capybara (~> 2.19.0) rubocop-factory_bot (~> 2.24.0) @@ -550,4 +552,4 @@ DEPENDENCIES tzinfo-data web-console (>= 4.2.1) webdrivers - webmock + webmock (>= 3.23.1) diff --git a/app/assets/locales/fr.json b/app/assets/locales/fr.json index ae585974d1..b2a996448b 100644 --- a/app/assets/locales/fr.json +++ b/app/assets/locales/fr.json @@ -164,6 +164,10 @@ "wrong_access_code": "Code d'accès erroné", "generate_viewers_access_code": "Générer un code d'accès pour les auditeurs", "generate_mods_access_code": "Générer un code d'accès pour les modérateurs", + "server_tag": "Choisir un type de serveur pour cette salle", + "default_tag_name": "Par défaut", + "server_tag_desired": "Demandé", + "server_tag_required": "Exigé", "are_you_sure_delete_room": "Êtes vous sur de vouloir supprimer cette salle?" } }, @@ -178,7 +182,7 @@ "formats": "Lecture", "published": "Publiée", "unpublished": "Non publiée", - "protected": "Protégée", + "protected": "Protégé", "public": "Public", "public_protected": "Public/Protégé", "length_in_minutes": "{{recording.length}} min.", @@ -303,7 +307,7 @@ "registration": { "registration": "Inscription", "role_mapping_by_email": "Configuration des rôles par courriel", - "role_mapping_by_email_description": "Configurer le rôle d'un utilisateur en se servant de son courriel. Doit être au format suivant: rôle1=courriel1, rôle2=courriel2", + "role_mapping_by_email_description": "Configurer le rôle d'un utilisateur en se servant de son courriel. Doit être au format suivant: role1=email1, role2=email2", "enter_role_mapping_rule": "Saisir une règle de configuration des rôles", "resync_on_login": "Resynchroniser les données utilisateur à chaque authentification", "resync_on_login_description": "Resynchroniser les données utilisateur de Greenlight à chacune de ses connexions, afin qu'elles correspondent toujours avec celles du service d'authentification", @@ -315,7 +319,10 @@ "open": "Inscription libre", "invite": "Rejoindre sur invitation", "approval": "Approuver/Refuser" - } + }, + "allowed_domains": "Domaines de courriels autorisés", + "allowed_domains_signup_description": "Pour les connexions, autoriser des domaines de courriels spécifiques", + "enter_allowed_domains_rule" : "Saisissez les domaines autorisés" } }, "room_configuration": { @@ -413,10 +420,11 @@ "brand_color_updated": "La couleur de la marque a été mise à jour.", "brand_image_updated": "L'image de marque a été actualisée.", "brand_image_deleted": "L'image de marque a été supprimée.", - "privacy_policy_updated": "La politique de confidentialité a été mise à jour.", + "privacy_policy_updated": "Les règles de confidentialité ont été mises à jour", "helpcenter_updated": "Le lien vers le centre d'aide a été mis à jour", "terms_of_service_updated": "Les conditions de service ont été mises à jour.", - "maintenance_updated": "Le bandeau de maintenance a été mis à jour" + "maintenance_updated": "Le bandeau de maintenance a été mis à jour", + "allowed_domains_signup_updated": "Les noms de domaines autorisés ont été mis à jour" }, "recording": { "recording_visibility_updated": "La visibilité de l'enregistrement a été mise à jour.", @@ -437,6 +445,7 @@ }, "error": { "problem_completing_action": "L'action que vous voulez réaliser n'aboutit pas. Veuillez réessayer", + "server_type_unavailable": "Le type de serveur demandé n'est pas disponible. Veuillez choisir un type de serveur différent dans les paramètres de la salle.", "file_type_not_supported": "Ce type de fichier n'est pas pris en charge", "file_size_too_large": "La taille du fichier est trop importante", "file_upload_error": "Le fichier ne peut pas être téléversé", @@ -533,6 +542,11 @@ }, "url": { "invalid": "URL non valide" + }, + "text_form": { + "value": { + "required": "Veuillez saisir un message" + } } }, "room": { diff --git a/app/assets/locales/gl.json b/app/assets/locales/gl.json index 49e2a9cbe9..a37ef4aed5 100644 --- a/app/assets/locales/gl.json +++ b/app/assets/locales/gl.json @@ -14,6 +14,7 @@ "report": "Informar", "share": "Compartir", "cancel": "Cancelar", + "reset": "Restabelecer", "close": "Pechar", "delete": "Eliminar", "copy": "Copiar a ligazón para unirse", @@ -163,6 +164,10 @@ "wrong_access_code": "Código de acceso incorrecto", "generate_viewers_access_code": "Xerar un código de acceso para os espectadores", "generate_mods_access_code": "Xerar un código de acceso para os moderadores", + "server_tag": "Seleccione un tipo de servidor para esta sala", + "default_tag_name": "Predeterminado", + "server_tag_desired": "Desexado", + "server_tag_required": "Obrigatorio", "are_you_sure_delete_room": "Confirma que quere eliminar esta sala?" } }, @@ -229,7 +234,8 @@ "empty_invited_users_subtext": "Cando o estado dun usuario cambia a convidado, aparece aquí.", "invited": { "time_sent": "Hora de envío", - "valid": "Valida" + "valid": "Valida", + "revoke": "Revogar" } }, "server_rooms": { @@ -272,8 +278,8 @@ "administration": { "administration": "Administración", "terms": "Terms & Conditions", - "privacy": "Directiva de privacidade", - "privacy_policy": "Directiva de privacidade", + "privacy": "Aviso de privacidade", + "privacy_policy": "Aviso de privacidade", "change_term_links": "Cambiar as ligazóns das condicións que aparecen na parte inferior da páxina", "change_privacy_link": "Cambiar a ligazón de privacidade que aparece na parte inferior da páxina", "helpcenter": "Centro de axuda", @@ -301,7 +307,7 @@ "registration": { "registration": "Rexistro", "role_mapping_by_email": "Asignación de roles por correo", - "role_mapping_by_email_description": "Asigne o usuario a un rol usando o seu correo electrónico. Debe ter o formato: rol1=correo-e1, rol2=correo-e2", + "role_mapping_by_email_description": "Asigne o usuario a un rol usando o seu correo-e. Debe ter o formato: rol1=correo-e1, rol2=correo-e2", "enter_role_mapping_rule": "Introduza unha regra de asignación de roles", "resync_on_login": "Volver sincronizar os datos do usuario en cada acceso", "resync_on_login_description": "Volver sincronizar a información dun usuario cada vez que acceda, facendo que o provedor de autenticación externo coincida sempre coa información en Greenlight", @@ -313,7 +319,10 @@ "open": "Rexistro aberto", "invite": "Unirse por convite", "approval": "Aceptar/declinar" - } + }, + "allowed_domains": "Dominios de correo-e permitidos", + "allowed_domains_signup_description": "Permitir o rexistro con dominios de correo-e específicos. O formato debe ser: @proba.com,dominio.com", + "enter_allowed_domains_rule" : "Introduza os dominios permitidos" } }, "room_configuration": { @@ -411,10 +420,11 @@ "brand_color_updated": "A cor corporativa foi actualizada.", "brand_image_updated": "A imaxe corporativa foi actualizada.", "brand_image_deleted": "A imaxe corporativa foi eliminada.", - "privacy_policy_updated": "A directiva de pivacidade foi actualizada.", + "privacy_policy_updated": "O aviso de pivacidade foi actualizado.", "helpcenter_updated": "Actualizouse a ligazón do centro de axuda.", "terms_of_service_updated": "Actualizáronse as condicións do servizo.", - "maintenance_updated": "Actualizouse o báner de mantemento." + "maintenance_updated": "Actualizouse o báner de mantemento.", + "allowed_domains_signup_updated": "Foron actualizados os dominios de correo-e permitidos." }, "recording": { "recording_visibility_updated": "Foi actualizada a visibilidade da gravación.", @@ -429,11 +439,13 @@ "role_permission_updated": "Foron actualizados os permisos de rol." }, "invitations": { - "invitation_sent": "Enviouse un convite" + "invitation_sent": "Enviouse un convite", + "invitation_revoked": "Foi revogado un convite" } }, "error": { "problem_completing_action": "Non é posíbel completar a acción.\n Tenteo de novo.", + "server_type_unavailable": "O tipo de servidor requirido non está dispoñíbel. Seleccione un tipo diferente nos axustes da sala.", "file_type_not_supported": "O tipo de ficheiro non é compatible.", "file_size_too_large": "O ficheiro é demasiado grande.", "file_upload_error": "Non é posíbel enviar o ficheiro.", @@ -530,6 +542,11 @@ }, "url": { "invalid": "URL incorrecto" + }, + "text_form": { + "value": { + "required": "Introduza algunha mensaxe" + } } }, "room": { diff --git a/app/assets/locales/hu.json b/app/assets/locales/hu.json index 9a5bec5926..225a0267de 100644 --- a/app/assets/locales/hu.json +++ b/app/assets/locales/hu.json @@ -14,6 +14,7 @@ "report": "Jelentés", "share": "Megosztás", "cancel": "Mégse", + "reset": "Reszetelés", "close": "Bezárás", "delete": "Törlés", "copy": "Másolás", @@ -163,6 +164,10 @@ "wrong_access_code": "Hibás hozzáférési kód", "generate_viewers_access_code": "Hozzáférési kód előállítása a látogatók számára", "generate_mods_access_code": "Hozzáférési kód előállítása a moderátorok számára", + "server_tag": "Válasszon szervertípust a szobához", + "default_tag_name": "Alapértelmezett", + "server_tag_desired": "Kívánt", + "server_tag_required": "Kötelező", "are_you_sure_delete_room": "Biztos, hogy törli ezt a szobát?" } }, @@ -229,7 +234,8 @@ "empty_invited_users_subtext": "Ha egy felhasználó állapota meghívottá válik, akkor itt fog megjelenni.", "invited": { "time_sent": "Küldési idő", - "valid": "Érvényes" + "valid": "Érvényes", + "revoke": "Visszavonás" } }, "server_rooms": { @@ -272,13 +278,17 @@ "administration": { "administration": "Üzemeltetés", "terms": "Felhasználási feltételek", - "privacy": "Adatvédelmi nyilatkozat", - "privacy_policy": "Adatvédelmi nyilatkozat", + "privacy": "Adatvédelmi közlemény", + "privacy_policy": "Adatvédelmi közlemény", "change_term_links": "A lap alján megjelenő felhasználási feltételek hivatkozásának módosítása", "change_privacy_link": "A lap alján megjelenő adatvédelmi hivatkozás módosítása", "helpcenter": "Súgóközpont", "change_helpcenter_link": "A profil legördülő alatt megjelenő Súgóközpont link módosítsa", + "maintenance": "Karbantartási szalaghirdetés", + "change_maintenance_text": "A fejlécben megjelenő karbantartási szalaghirdetés szövegének módosítása.", "change_url": "Webcím módosítása", + "set_text": "Szöveg beállítása", + "clear_banner": "Szalaghirdetés törlése", "enter_link": "Itt adja meg a hivatkozást" }, "settings": { @@ -288,7 +298,11 @@ "allow_users_to_preupload_presentation": "A felhasználók előre feltöltheti a bemutatójukat", "allow_users_to_preupload_presentation_description": "A felhasználók előre feltöltheti a használandó bemutatójukat az adott szoba alapértelmezett bemutatójaként", "default_visibility": "Felvétel alapértelmezett láthatósága", - "default_visibility_description": "Alapértelmezés szerint minden újonnan létrehozott felvételnél ez lesz a láthatóság" + "default_visibility_description": "Alapértelmezés szerint minden újonnan létrehozott felvételnél ez lesz a láthatóság", + "session_timeout": "Munkamenet időtúllépése", + "session_timeout_description": "A munkamenet időtúllépését az alapértelmezett 1 napos vagy a kiterjesztett 7 napos munkamenet sütire konfigurálhatja", + "default_session_timeout": "Alapértelmezett (1 nap)", + "extended_session_timeout": "Kiterjesztett (7 nap)" }, "registration": { "registration": "Regisztráció", @@ -305,7 +319,10 @@ "open": "Nyílt regisztráció", "invite": "Csatlakozás meghívással", "approval": "Engedélyezés/elutasítás" - } + }, + "allowed_domains": "Engedélyezett e-mail domainek", + "allowed_domains_signup_description": "Meghatározott e-mail domainek regisztrációjának engedélyezése. A helyes formátum: @test.hu, domain.hu", + "enter_allowed_domains_rule" : "Adja meg az engedélyezett domaineket" } }, "room_configuration": { @@ -403,9 +420,11 @@ "brand_color_updated": "A márkaszín sikerese módosította.", "brand_image_updated": "A márkaképet sikeresen módosította.", "brand_image_deleted": "A márkakép sikeresen törölte.", - "privacy_policy_updated": "Adatvédelmi nyilatkozat frissítve.", + "privacy_policy_updated": "Az adatvédelmi közleményt frissítették.", "helpcenter_updated": "A Súgóközpont linkjét sikeresen módosította.", - "terms_of_service_updated": "A szolgáltatási feltételek frissítésre kerültek." + "terms_of_service_updated": "A szolgáltatási feltételek frissítésre kerültek.", + "maintenance_updated": "A karbantartási szalaghirdetést frissítettük.", + "allowed_domains_signup_updated": "Az engedélyezett email domaineket sikeresen módosította." }, "recording": { "recording_visibility_updated": "Felvétel láthatósága frissítve.", @@ -420,11 +439,13 @@ "role_permission_updated": "Szerepkör jogosultsága frissítve" }, "invitations": { - "invitation_sent": "Meghívó elküldve" + "invitation_sent": "Meghívó elküldve", + "invitation_revoked": "A meghívást visszautasították" } }, "error": { "problem_completing_action": "Probléma lépett fel a művelet befejezése során. \n Próbálja újra.", + "server_type_unavailable": "A kiválasztott szervertípus nem érhető el. Kérem, válasszon másikat.", "file_type_not_supported": "A fájltípus nem támogatott.", "file_size_too_large": "A fájl túl nagy.", "file_upload_error": "A fájlt nem sikerült feltölteni.", @@ -521,6 +542,11 @@ }, "url": { "invalid": "Érvénytelen webcím" + }, + "text_form": { + "value": { + "required": "Írjon egy üzenetet" + } } }, "room": { @@ -676,7 +702,8 @@ "site_settings": { "fields": { "value": { - "placeholder": "Adja meg a hivatkozást itt…" + "placeholder": "Adja meg a hivatkozást itt…", + "text_placeholder": "Ide írjon..." } } }, diff --git a/app/assets/locales/ja.json b/app/assets/locales/ja.json index 41f1604f09..b54c5fb072 100644 --- a/app/assets/locales/ja.json +++ b/app/assets/locales/ja.json @@ -312,7 +312,7 @@ "resync_on_login": "サインインごとにユーザーのデーターを再同期", "resync_on_login_description": "サインインのたびにユーザーの情報を再同期し、外部の承認提供者の情報とGreenlightの情報とを常に一致させます", "default_role": "標準の役割", - "default_role_description": "新しく作成されたユーザーに自動的に割り当てられる役割です", + "default_role_description": "新しく作成されたユーザーにはこの役割が自動的に割り当てられます", "registration_method": "登録方法", "registration_method_description": "ユーザーがこのサイトに登録する方法を変更します", "registration_methods" : { diff --git a/app/assets/locales/ko_KR.json b/app/assets/locales/ko_KR.json index 2ab8b0cef4..2cbe00fcec 100644 --- a/app/assets/locales/ko_KR.json +++ b/app/assets/locales/ko_KR.json @@ -14,15 +14,20 @@ "report": "보고서", "share": "공유", "cancel": "취소", + "reset": "리셋", "close": "닫기", "delete": "삭제", "copy": "참여 링크 복사", + "copy_viewer_code": "뷰어 코드 복사", + "copy_moderator_code": "모데라토 코드 복사", "or": "또는", "online": "온라인", "help_center": "도움말 센터", "are_you_sure": "확실합니까?", "return_home": "홈으로 돌아가기", "created_at": "에서 생성", + "view_recordings": "레코딩 보기", + "join_session": "세션에 참여", "no_result_search_input": "\"{{ searchInput }}\"에 대한 결과를 찾을 수 없습니다.", "action_permanent": "이 작업은 실행 취소할 수 없습니다.", "homepage": { @@ -79,6 +84,7 @@ "account_info": "계정 정보", "delete_account": "계정 삭제", "change_password": "패스워드 변경", + "set_password": "새로운 패스워드 설정", "reset_password": "패스워드 초기화", "update_account_info": "계정 정보 업데이트", "current_password": "현재 패스워드", @@ -127,6 +133,7 @@ "click_to_upload": "업로드하려면 클릭하세요.", "drag_and_drop": "또는 드래그 앤 드롭", "upload_description": "사무실 문서 또는 PDF 파일({{size}}이하)을 업로드합니다. 파일 크기에 따라 파일을 사용하려면 업로드하는 데 추가 시간이 필요할 수 있습니다", + "delete_presentation": "프레젠테이션 삭제", "are_you_sure_delete_presentation": "이 프레젠테이션을 삭제하시겠습니까?" }, "shared_access": { @@ -157,12 +164,17 @@ "wrong_access_code": "잘못된 액세스 코드입니다.", "generate_viewers_access_code": "참여자용 액세스 코드 생성", "generate_mods_access_code": "진행자용 액세스 코드 생성", + "server_tag": "이 방에 대한 서버 유형 선택", + "default_tag_name": "기본", + "server_tag_desired": "요청", + "server_tag_required": "필수", "are_you_sure_delete_room": "이 Room을 삭제 하시겠습니까?" } }, "recording": { "recording": "녹화", "recordings": "녹화", + "processing": "레코딩 처리 중...", "name": "이름", "length": "길이", "users": "사용자", @@ -171,11 +183,15 @@ "published": "게시됨", "unpublished": "게시되지 않음", "protected": "보호", + "public": "공개", + "public_protected": "공개/보호", "length_in_minutes": "{{recording.length}} 분.", "processing_recording": "녹화를 인코딩 중입니다. 몇 분 정도 걸릴 수 있습니다...", "copy_recording_urls": "녹화 Url(S) 복사", "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": "녹화된 기록을 찾을 수 없음" @@ -218,7 +234,8 @@ "empty_invited_users_subtext": "사용자의 상태가 초대됨으로 변경되면 여기에 나타납니다.", "invited": { "time_sent": "보낸 시간", - "valid": "유효한" + "valid": "유효한", + "revoke": "취소" } }, "server_rooms": { @@ -265,7 +282,13 @@ "privacy_policy": "개인 정보 보호 정책", "change_term_links": "페이지 하단에 나타나는 용어 링크 변경", "change_privacy_link": "페이지 하단에 나타나는 용어 링크 변경", + "helpcenter": "도움말 센터", + "change_helpcenter_link": "프로필 드롭다운 아래에 표시되는 도움말 센터 링크 변경", + "maintenance": "유지 관리 배너", + "change_maintenance_text": "헤더에 표시되는 유지 관리 배너 텍스트 변경", "change_url": "URL 변경", + "set_text": "텍스트 설정", + "clear_banner": "배너 삭제", "enter_link": "링크 입력" }, "settings": { @@ -273,7 +296,13 @@ "allow_users_to_share_rooms": "사용자의 Room 공유 허용", "allow_users_to_share_rooms_description": "사용 불가능으로 설정하면 Room 선택사항 드롭다운 메뉴에서 버튼이 제거되어 사용자가 Room을 공유할 수 없습니다", "allow_users_to_preupload_presentation": "사용자에게 프레젠테이션 발표자료 사전 업로드 허용", - "allow_users_to_preupload_presentation_description": "사용자는 특정 Room에서 발표자료로 사용할 프리젠테이션을 미리 업로드할 수 있습니다" + "allow_users_to_preupload_presentation_description": "사용자는 특정 Room에서 발표자료로 사용할 프리젠테이션을 미리 업로드할 수 있습니다", + "default_visibility": "기본 녹음 가시성", + "default_visibility_description": "새로 생성된 모든 녹음은 기본적으로 이 가시성을 갖습니다.", + "session_timeout": "세션 타임아웃", + "session_timeout_description": "기본 쿠키 1일 또는 확장 세션 쿠키 7일로 세션 타임아웃을 구성할 수 있습니다", + "default_session_timeout": "기본 (1일)", + "extended_session_timeout": "확장 (7일)" }, "registration": { "registration": "등록", @@ -290,7 +319,10 @@ "open": "공개 등록", "invite": "초대로 참여", "approval": "승인/거부" - } + }, + "allowed_domains": "허용된 이메일 도메인", + "allowed_domains_signup_description": "특정 이메일 도메인이 가입할 수 있도록 허용합니다. 형식은 @test.com,domain.com 이어야 합니다", + "enter_allowed_domains_rule" : "허용된 도메인을 입력하세요" } }, "room_configuration": { @@ -341,7 +373,9 @@ "manage_site_settings": "이 역할을 가진 사용자에게 사이트 설정 관리 허용", "manage_roles": "이 역할을 가진 사용자가 다른 역할을 편집하도록 허용", "shared_list": "Room 공유 드롭다운 메뉴에 이 역할을 가진 사용자 포함", - "room_limit": "Room 제한" + "room_limit": "Room 제한", + "email_on_signup": "새 사용자가 가입하면 이메일을 받습니다.", + "allowed_recording_visibility": "허용된 녹음 가시성" } } }, @@ -352,6 +386,7 @@ "user_updated": "사용자가 업데이트되었습니다.", "user_deleted": "사용자가 삭제되었습니다.", "avatar_updated": "아바타가 업데이트되었습니다.", + "password_changed": "비밀번호가 성공적으로 업데이트되었습니다. 다시 로그인하십시오.", "password_updated": "암호가 업데이트되었습니다.", "account_activated": "계정이 활성화되었습니다.", "activation_email_sent": "계정을 활성화하기 위한 지침이 포함된 이메일이 전송되었습니다.", @@ -376,7 +411,9 @@ "access_code_copied": "액세스 코드가 복사되었습니다.", "access_code_generated": "새 액세스 코드가 생성되었습니다.", "access_code_deleted": "액세스 코드가 삭제되었습니다.", - "copied_meeting_url": "미팅 URL이 복사되었습니다. 링크를 통하여 미팅에 참여할 수 있습니다." + "copied_meeting_url": "미팅 URL이 복사되었습니다. 링크를 통하여 미팅에 참여할 수 있습니다.", + "copied_viewer_code": "뷰어 액세스 코드가 복사되었습니다.", + "copied_moderator_code": "모데라토의 액세스 코드가 복사되었습니다." }, "site_settings": { "site_setting_updated": "사이트 설정이 업데이트되었습니다.", @@ -384,7 +421,10 @@ "brand_image_updated": "브랜드 이미지가 업데이트되었습니다.", "brand_image_deleted": "브랜드 이미지가 삭제되었습니다.", "privacy_policy_updated": "개인 정보 보호 정책이 업데이트되었습니다.", - "terms_of_service_updated": "서비스 약관이 업데이트되었습니다." + "helpcenter_updated": "도움말 센터 링크가 업데이트되었습니다.", + "terms_of_service_updated": "서비스 약관이 업데이트되었습니다.", + "maintenance_updated": "유지 관리 배너가 업데이트되었습니다.", + "allowed_domains_signup_updated": "허용된 이메일 도메인이 업데이트되었습니다." }, "recording": { "recording_visibility_updated": "녹화 가시성이 업데이트되었습니다.", @@ -399,15 +439,18 @@ "role_permission_updated": "역할의 권한이 업데이트되었습니다." }, "invitations": { - "invitation_sent": "초대장을 보냈습니다." + "invitation_sent": "초대장을 보냈습니다.", + "invitation_revoked": "초대가 취소되었습니다." } }, "error": { "problem_completing_action": "작업을 완료할 수 없습니다. \n다시 시도하십시오.", + "server_type_unavailable": "요구된 서버 유형을 사용할 수 없습니다. room 설정에서 다른 유형을 선택하십시오.", "file_type_not_supported": "파일 형식이 지원되지 않습니다.", "file_size_too_large": "파일 크기가 너무 큽니다.", "file_upload_error": "파일을 업로드할 수 없습니다.", "signin_required": "이 페이지에 액세스하려면 로그인해야 합니다.", + "malware_detected": "악성 소프트웨어가 감지됨! 업로드한 파일에 악성 소프트웨어가 포함될 수 있습니다. 파일을 확인하고 다시 시도하십시오.", "roles": { "role_assigned": "이 역할은 적어도 한 명의 사용자에게 할당되어 있으므로 삭제할 수 없습니다." }, @@ -499,6 +542,11 @@ }, "url": { "invalid": "잘못된 URL" + }, + "text_form": { + "value": { + "required": "메시지를 입력해주세요" + } } }, "room": { @@ -654,7 +702,8 @@ "site_settings": { "fields": { "value": { - "placeholder": "링크 입력..." + "placeholder": "링크 입력...", + "text_placeholder": "여기에 텍스트를 입력하세요." } } }, diff --git a/app/assets/locales/ru.json b/app/assets/locales/ru.json index a5da2be4a9..dcb62ff136 100644 --- a/app/assets/locales/ru.json +++ b/app/assets/locales/ru.json @@ -14,9 +14,12 @@ "report": "Отчет", "share": "Предоставить доступ", "cancel": "Отмена", + "reset": "Сбросить", "close": "Закрыть", "delete": "Удалить", "copy": "Скопировать ссылку", + "copy_viewer_code": "Скопировать код участника", + "copy_moderator_code": "Скопировать код модератора", "or": "Или", "online": "Онлайн", "help_center": "Центр поддержки", @@ -161,6 +164,10 @@ "wrong_access_code": "Неверный код доступа", "generate_viewers_access_code": "Код доступа для участников", "generate_mods_access_code": "Код доступа для модераторов", + "server_tag": "Выберите тип сервера для этой комнаты", + "default_tag_name": "По умолчанию", + "server_tag_desired": "Желаемый", + "server_tag_required": "Обязательный", "are_you_sure_delete_room": "Вы уверены, что хотите удалить эту комнату?" } }, @@ -227,7 +234,8 @@ "empty_invited_users_subtext": "Когда статус пользователя изменится на «приглашенный», он появится здесь.", "invited": { "time_sent": "Время отправки", - "valid": "Действителен" + "valid": "Действителен", + "revoke": "Отозвать" } }, "server_rooms": { @@ -276,7 +284,11 @@ "change_privacy_link": "Изменить ссылку на политику конфиденциальности, которая появляется внизу страницы", "helpcenter": "Справочный центр", "change_helpcenter_link": "Измените ссылку Справочного центра, которая появляется под раскрывающимся списком профиля", + "maintenance": "Баннер технического обслуживания", + "change_maintenance_text": "Измените текст баннера технического обслуживания, который отображается в заголовке", "change_url": "Изменить URL", + "set_text": "Задать текст", + "clear_banner": "Очистить баннер", "enter_link": "Введите ссылку здесь" }, "settings": { @@ -286,7 +298,11 @@ "allow_users_to_preupload_presentation": "Разрешить пользователям предварительно загружать презентации", "allow_users_to_preupload_presentation_description": "Пользователи могут предварительно загрузить презентацию, которая будет использоваться в качестве презентации по умолчанию для этой комнаты", "default_visibility": "Статус видимости записи по умолчанию", - "default_visibility_description": "Все вновь созданные записи будут иметь этот статус видимости по умолчанию." + "default_visibility_description": "Все вновь созданные записи будут иметь этот статус видимости по умолчанию.", + "session_timeout": "Время ожидания сеанса", + "session_timeout_description": "Вы можете настроить время ожидания сеанса с помощью стандартного куки на 1 день или расширенного куки сеанса на 7 дней", + "default_session_timeout": "Стандартный (1 день)", + "extended_session_timeout": "Расширенный (7 дней)" }, "registration": { "registration": "Регистрация", @@ -303,7 +319,10 @@ "open": "Открытая регистрация", "invite": "Вход по приглашению", "approval": "Одобрить/отклонить" - } + }, + "allowed_domains": "Разрешенные домены электронной почты", + "allowed_domains_signup_description": "Разрешить определенные домены электронной почты для регистрации. Формат должен быть: @test.com,domain.com", + "enter_allowed_domains_rule" : "Введите разрешенные домены" } }, "room_configuration": { @@ -392,7 +411,9 @@ "access_code_copied": "Код доступа скопирован.", "access_code_generated": "Код доступа создан.", "access_code_deleted": "Код доступа удален.", - "copied_meeting_url": "Ссылка встречи скопирована. Ссылку можно использовать для присоединения к встрече." + "copied_meeting_url": "Ссылка встречи скопирована. Ссылку можно использовать для присоединения к встрече.", + "copied_viewer_code": "Код доступа участника вебинара был скопирован.", + "copied_moderator_code": "Код доступа модератора вебинара был скопирован." }, "site_settings": { "site_setting_updated": "Настройки сайта обновлены.", @@ -401,7 +422,9 @@ "brand_image_deleted": "Фирменное изображение удалено.", "privacy_policy_updated": "Политика конфиденциальности обновлена.", "helpcenter_updated": "Ссылка на Справочный центр обновлена", - "terms_of_service_updated": "Условия использования обновлены." + "terms_of_service_updated": "Условия использования обновлены.", + "maintenance_updated": "Баннер технического обслуживания обновлен.", + "allowed_domains_signup_updated": "Разрешенные домены электронной почты были обновлены" }, "recording": { "recording_visibility_updated": "Видимость записи обновлена.", @@ -416,15 +439,18 @@ "role_permission_updated": "Права роли обновлены." }, "invitations": { - "invitation_sent": "Выслать приглашение" + "invitation_sent": "Выслать приглашение", + "invitation_revoked": "Приглашение было отозвано" } }, "error": { "problem_completing_action": "Не удалось завершить данное действие. \n Пожалуйста, попробуйте еще раз.", + "server_type_unavailable": "Требуемый тип сервера недоступен. Пожалуйста, выберите другой тип в настройках комнаты", "file_type_not_supported": "Тип файла не поддерживается", "file_size_too_large": "Размер файла слишком большой", "file_upload_error": "Файл не может быть загружен.", "signin_required": "Для доступа к странице вы должны авторизоваться в системе. ", + "malware_detected": "Обнаружена вредоносная программа! Файл, который вы загрузили, может содержать вредоносное ПО. Пожалуйста, проверьте ваш файл и попробуйте снова.", "roles": { "role_assigned": "Эту роль нельзя удалить, т.к. она назначена как минимум одному пользователю." }, @@ -516,6 +542,11 @@ }, "url": { "invalid": "Неверная ссылка" + }, + "text_form": { + "value": { + "required": "Пожалуйста, введите сообщение" + } } }, "room": { @@ -671,7 +702,8 @@ "site_settings": { "fields": { "value": { - "placeholder": "Введите ссылку сюда..." + "placeholder": "Введите ссылку сюда...", + "text_placeholder": "Введите текст здесь..." } } }, diff --git a/app/assets/locales/tr.json b/app/assets/locales/tr.json index e55ac85b1c..1b4889e472 100644 --- a/app/assets/locales/tr.json +++ b/app/assets/locales/tr.json @@ -319,7 +319,10 @@ "open": "Serbest hesap açma", "invite": "Çağrı ile katılma", "approval": "Onayla/Reddet" - } + }, + "allowed_domains": "İzin verilen e-posta etki alanları", + "allowed_domains_signup_description": "Belirli e-posta etki alanlarından hesap açılmasına izin verir. Şu biçimde yazılmalıdır: @deneme.com,etkialani.com", + "enter_allowed_domains_rule" : "İzin verilen etki alanlarını yazın" } }, "room_configuration": { @@ -420,7 +423,8 @@ "privacy_policy_updated": "Gizlilik bildirimi güncellendi.", "helpcenter_updated": "Yardım merkezi bağlantısı güncellendi.", "terms_of_service_updated": "Hizmet koşulları güncellendi.", - "maintenance_updated": "Bakım duyurusu güncellendi." + "maintenance_updated": "Bakım duyurusu güncellendi.", + "allowed_domains_signup_updated": "İzin verilen e-posta etki alanları güncellendi." }, "recording": { "recording_visibility_updated": "Kayıt görünürlüğü güncellendi.", diff --git a/app/controllers/api/v1/users_controller.rb b/app/controllers/api/v1/users_controller.rb index 6661d71a91..15ad2f57c4 100644 --- a/app/controllers/api/v1/users_controller.rb +++ b/app/controllers/api/v1/users_controller.rb @@ -35,7 +35,7 @@ def show render_data data: user, status: :ok end - # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity + # rubocop:disable Metrics/AbcSize # POST /api/v1/users.json # Creates and saves a new user record in the database with the provided parameters def create @@ -62,7 +62,7 @@ def create create_user_params[:language] = current_user&.language || I18n.default_locale if create_user_params[:language].blank? # renders an error if the user is signing up with an invalid domain based off site settings - return render_error errors: Rails.configuration.custom_error_msgs[:unauthorized], status: :forbidden unless valid_domain? + return render_error errors: Rails.configuration.custom_error_msgs[:banned_user], status: :forbidden unless valid_domain? user = UserCreator.new(user_params: create_user_params.except(:invite_token), provider: current_provider, role: default_role).call @@ -97,7 +97,7 @@ def create render_error errors: Rails.configuration.custom_error_msgs[:record_invalid], status: :bad_request end end - # rubocop:enable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity + # rubocop:enable Metrics/AbcSize # PATCH /api/v1/users/:id.json # Updates the values of a user @@ -169,11 +169,7 @@ def create_user_params end def update_user_params - @update_user_params ||= if external_auth? - params.require(:user).permit(:password, :avatar, :language, :role_id, :invite_token) - else - params.require(:user).permit(:name, :password, :avatar, :language, :role_id, :invite_token) - end + @update_user_params ||= params.require(:user).permit(permitted_params) end def change_password_params @@ -198,6 +194,14 @@ def valid_domain? end false end + + def permitted_params + is_admin = PermissionsChecker.new(current_user:, permission_names: 'ManageUsers', current_provider:).call + + return %i[password avatar language role_id invite_token] if external_auth? && !is_admin + + %i[name password avatar language role_id invite_token] + end end end end diff --git a/app/controllers/external_controller.rb b/app/controllers/external_controller.rb index ec57eb1006..d552dae03a 100644 --- a/app/controllers/external_controller.rb +++ b/app/controllers/external_controller.rb @@ -32,6 +32,13 @@ def create_user user = User.find_by(external_id: credentials['uid'], provider:) + # Fallback mechanism to search by email + if user.blank? && ENV.fetch('USE_EMAIL_AS_EXTERNAL_ID_FALLBACK', 'false') == 'true' + 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 @@ -41,9 +48,10 @@ def create_user return redirect_to root_path(error: Rails.configuration.custom_error_msgs[:invite_token_invalid]) end - return render_error status: :forbidden unless valid_domain?(user_info[:email]) + # Redirect to root if the user doesn't exist and has an invalid domain + return redirect_to root_path(error: Rails.configuration.custom_error_msgs[:banned_user]) if new_user && !valid_domain?(user_info[:email]) - # Create the user if they dont exist + # Create the user if they don't exist if new_user user = UserCreator.new(user_params: user_info, provider: current_provider, role: default_role).call user.save! @@ -106,6 +114,8 @@ def recording_ready RecordingCreator.new(recording:, first_creation: true).call render json: {}, status: :ok + rescue JWT::DecodeError + render json: {}, status: :unauthorized end # GET /meeting_ended diff --git a/app/javascript/components/admin/site_settings/registration/Registration.jsx b/app/javascript/components/admin/site_settings/registration/Registration.jsx index 7d9029666f..764e5b00f5 100644 --- a/app/javascript/components/admin/site_settings/registration/Registration.jsx +++ b/app/javascript/components/admin/site_settings/registration/Registration.jsx @@ -108,6 +108,7 @@ export default function Registration() {