From 91aae4d755504518258c9b4c9aae8baa4eabc2dc Mon Sep 17 00:00:00 2001 From: Benjamin Neff Date: Sun, 28 Apr 2019 11:33:56 +0200 Subject: [PATCH 01/81] Fix 500er when calling protocol handler with invalid URL --- app/services/diaspora_link_service.rb | 10 ++++++---- spec/services/diaspora_link_service_spec.rb | 12 ++++++++++++ 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/app/services/diaspora_link_service.rb b/app/services/diaspora_link_service.rb index 1923aa01d..a8ab51420 100644 --- a/app/services/diaspora_link_service.rb +++ b/app/services/diaspora_link_service.rb @@ -10,7 +10,9 @@ class DiasporaLinkService end def find_or_fetch_entity - entity_finder.find || fetch_entity + if type && guid + entity_finder.find || fetch_entity + end end private @@ -38,8 +40,8 @@ class DiasporaLinkService def parse normalize match = DiasporaFederation::Federation::DiasporaUrlParser::DIASPORA_URL_REGEX.match(link) - @author = match[1] - @type = match[2] - @guid = match[3] + if match + @author, @type, @guid = match.captures + end end end diff --git a/spec/services/diaspora_link_service_spec.rb b/spec/services/diaspora_link_service_spec.rb index bde411a27..fd3f6e6b3 100644 --- a/spec/services/diaspora_link_service_spec.rb +++ b/spec/services/diaspora_link_service_spec.rb @@ -40,5 +40,17 @@ describe DiasporaLinkService do expect(service.find_or_fetch_entity).to be_nil end end + + context "with invalid links" do + it "returns nil when the link is invalid" do + service = described_class.new("web+diaspora://something_invalid") + expect(service.find_or_fetch_entity).to be_nil + end + + it "returns nil when the author is valid, but rest of the link is invalid" do + service = described_class.new("web+diaspora://#{alice.diaspora_handle}/foo/bar") + expect(service.find_or_fetch_entity).to be_nil + end + end end end From 17af65e22cb789c70d464a175b98081e5d1de46e Mon Sep 17 00:00:00 2001 From: Benjamin Neff Date: Sun, 28 Apr 2019 14:00:57 +0200 Subject: [PATCH 02/81] Allow links with only the diaspora ID to link to a profile closes #8000 --- Changelog.md | 1 + app/services/diaspora_link_service.rb | 10 ++++++++++ spec/services/diaspora_link_service_spec.rb | 16 ++++++++++++++++ 3 files changed, 27 insertions(+) diff --git a/Changelog.md b/Changelog.md index 0fe58b64f..049ce06ba 100644 --- a/Changelog.md +++ b/Changelog.md @@ -6,6 +6,7 @@ ## Features * Add a manifest.json file as a first step to make diaspora* a Progressive Web App [#7998](https://github.com/diaspora/diaspora/pull/7998) +* Allow `web+diaspora://` links to link to a profile with only the diaspora ID [#8000](https://github.com/diaspora/diaspora/pull/8000) # 0.7.10.0 diff --git a/app/services/diaspora_link_service.rb b/app/services/diaspora_link_service.rb index a8ab51420..ca8ffea76 100644 --- a/app/services/diaspora_link_service.rb +++ b/app/services/diaspora_link_service.rb @@ -12,6 +12,8 @@ class DiasporaLinkService def find_or_fetch_entity if type && guid entity_finder.find || fetch_entity + elsif author + find_or_fetch_person end end @@ -30,6 +32,12 @@ class DiasporaLinkService @entity_finder ||= Diaspora::EntityFinder.new(type, guid) end + def find_or_fetch_person + Person.find_or_fetch_by_identifier(author) + rescue DiasporaFederation::Discovery::DiscoveryError + nil + end + def normalize link.gsub!(%r{^web\+diaspora://}, "diaspora://") || link.gsub!(%r{^//}, "diaspora://") || @@ -42,6 +50,8 @@ class DiasporaLinkService match = DiasporaFederation::Federation::DiasporaUrlParser::DIASPORA_URL_REGEX.match(link) if match @author, @type, @guid = match.captures + else + @author = %r{^diaspora://(#{Validation::Rule::DiasporaId::DIASPORA_ID_REGEX})$}u.match(link)&.captures&.first end end end diff --git a/spec/services/diaspora_link_service_spec.rb b/spec/services/diaspora_link_service_spec.rb index fd3f6e6b3..c65004e31 100644 --- a/spec/services/diaspora_link_service_spec.rb +++ b/spec/services/diaspora_link_service_spec.rb @@ -52,5 +52,21 @@ describe DiasporaLinkService do expect(service.find_or_fetch_entity).to be_nil end end + + context "with only a diaspora ID" do + let(:person) { FactoryGirl.create(:person) } + let(:link) { "diaspora://#{person.diaspora_handle}" } + + it "returns the person" do + expect(service.find_or_fetch_entity).to eq(person) + end + + it "returns nil when person is non fetchable" do + expect(Person).to receive(:find_or_fetch_by_identifier) + .with(person.diaspora_handle).and_raise(DiasporaFederation::Discovery::DiscoveryError) + + expect(service.find_or_fetch_entity).to be_nil + end + end end end From 1e827161fe24c34bcbd92fc686272887b2f6f4d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonne=20Ha=C3=9F?= Date: Sun, 28 Apr 2019 11:08:16 +0200 Subject: [PATCH 03/81] rubocop: increase complexity limits [ci skip] --- .rubocop.yml | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/.rubocop.yml b/.rubocop.yml index 3544f1517..0647b5e48 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -18,7 +18,7 @@ Metrics/LineLength: # Too short methods lead to extraction of single-use methods, which can make # the code easier to read (by naming things), but can also clutter the class -Metrics/MethodLength: +Metrics/MethodLength: Max: 20 # The guiding principle of classes is SRP, SRP can't be accurately measured by LoC @@ -26,11 +26,17 @@ Metrics/ClassLength: Max: 1500 Metrics/ModuleLength: Max: 1500 - -# Raise AbcSize from 15 to 20 + +# Raise complexity metrics Metrics/AbcSize: Max: 20 +Metrics/CyclomaticComplexity: + Max: 20 + +Metrics/PerceivedComplexity: + Max: 20 + # Some blocks are longer. Metrics/BlockLength: ExcludedMethods: @@ -88,7 +94,7 @@ Lint/AssignmentInCondition: AllowSafeAssignment: false # A specialized exception class will take one or more arguments and construct the message from it. -# So both variants make sense. +# So both variants make sense. Style/RaiseArgs: Enabled: false @@ -151,11 +157,11 @@ Lint/ShadowingOuterLocalVariable: # Check with yard instead. Style/Documentation: - Enabled: false + Enabled: false # This is just silly. Calling the argument `other` in all cases makes no sense. Naming/BinaryOperatorParameterName: - Enabled: false + Enabled: false # There are valid cases, for example debugging Cucumber steps, # also they'll fail CI anyway From 3f74a759b3313a65fc00d2e9bc9368a4236ab0cb Mon Sep 17 00:00:00 2001 From: cmrd Senya Date: Sun, 28 Apr 2019 19:28:25 +0300 Subject: [PATCH 04/81] Bump diaspora_federation --- Gemfile | 6 +++--- Gemfile.lock | 20 ++++++++++---------- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/Gemfile b/Gemfile index f47b36ee2..ec75c2556 100644 --- a/Gemfile +++ b/Gemfile @@ -15,8 +15,8 @@ gem "unicorn-worker-killer", "0.4.4" # Federation -gem "diaspora_federation-json_schema", "0.2.5" -gem "diaspora_federation-rails", "0.2.5" +gem "diaspora_federation-json_schema", "0.2.6" +gem "diaspora_federation-rails", "0.2.6" # API and JSON @@ -293,7 +293,7 @@ group :test do gem "timecop", "0.9.1" gem "webmock", "3.5.1", require: false - gem "diaspora_federation-test", "0.2.5" + gem "diaspora_federation-test", "0.2.6" # Coverage gem "coveralls", "0.8.22", require: false diff --git a/Gemfile.lock b/Gemfile.lock index a1bd39555..ead2af7e0 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -173,18 +173,18 @@ GEM devise rails (>= 3.0.4) diaspora-prosody-config (0.0.7) - diaspora_federation (0.2.5) + diaspora_federation (0.2.6) faraday (>= 0.9.0, < 0.16.0) - faraday_middleware (>= 0.10.0, < 0.13.0) + faraday_middleware (>= 0.10.0, < 0.14.0) nokogiri (~> 1.6, >= 1.6.8) typhoeus (~> 1.0) valid (~> 1.0) - diaspora_federation-json_schema (0.2.5) - diaspora_federation-rails (0.2.5) + diaspora_federation-json_schema (0.2.6) + diaspora_federation-rails (0.2.6) actionpack (>= 4.2, < 6) - diaspora_federation (= 0.2.5) - diaspora_federation-test (0.2.5) - diaspora_federation (= 0.2.5) + diaspora_federation (= 0.2.6) + diaspora_federation-test (0.2.6) + diaspora_federation (= 0.2.6) fabrication (~> 2.16) uuid (~> 2.3, >= 2.3.8) diff-lcs (1.3) @@ -787,9 +787,9 @@ DEPENDENCIES devise (= 4.6.1) devise_lastseenable (= 0.0.6) diaspora-prosody-config (= 0.0.7) - diaspora_federation-json_schema (= 0.2.5) - diaspora_federation-rails (= 0.2.5) - diaspora_federation-test (= 0.2.5) + diaspora_federation-json_schema (= 0.2.6) + diaspora_federation-rails (= 0.2.6) + diaspora_federation-test (= 0.2.6) entypo-rails (= 3.0.0) eye (= 0.10.0) factory_girl_rails (= 4.8.0) From 1da118780e3edb611c245819435c4149ba497119 Mon Sep 17 00:00:00 2001 From: lislis Date: Sun, 28 Apr 2019 19:06:48 +0200 Subject: [PATCH 05/81] Two factor authentication (#7751) --- .gitignore | 1 + Gemfile | 2 + Gemfile.lock | 14 ++ app/assets/stylesheets/login.scss | 1 + app/controllers/application_controller.rb | 7 + app/controllers/sessions_controller.rb | 50 +++++++- .../two_factor_authentications_controller.rb | 60 +++++++++ app/controllers/users_controller.rb | 2 + app/helpers/application_helper.rb | 5 + app/models/user.rb | 11 +- app/views/sessions/two_factor.html.haml | 39 ++++++ app/views/shared/_settings_nav.haml | 2 + .../two_factor_authentications/_activate.haml | 11 ++ .../two_factor_authentications/_confirm.haml | 33 +++++ .../_deactivate.haml | 28 ++++ .../two_factor_authentications/_recovery.haml | 18 +++ .../_token_form.haml | 4 + .../confirm_2fa.html.haml | 11 ++ .../recovery_codes.html.haml | 12 ++ .../two_factor_authentications/show.html.haml | 15 +++ config/initializers/devise.rb | 9 ++ .../initializers/filter_parameter_logging.rb | 1 + config/locales/diaspora/en.yml | 36 ++++++ config/routes.rb | 6 + ...29175654_add_devise_two_factor_to_users.rb | 11 ++ ...05225_add_two_factor_backupable_to_user.rb | 7 + features/desktop/change_password.feature | 3 +- .../desktop/two_factor_authentication.feature | 90 +++++++++++++ features/mobile/change_password.feature | 5 +- features/step_definitions/two_factor_steps.rb | 67 ++++++++++ features/support/paths.rb | 2 + lib/configuration_methods.rb | 30 ++++- lib/tasks/generate_2fa_encription_key.rake | 24 ++++ ..._factor_authentications_controller_spec.rb | 120 ++++++++++++++++++ spec/models/user_spec.rb | 7 + 35 files changed, 729 insertions(+), 15 deletions(-) create mode 100644 app/controllers/two_factor_authentications_controller.rb create mode 100644 app/views/sessions/two_factor.html.haml create mode 100644 app/views/two_factor_authentications/_activate.haml create mode 100644 app/views/two_factor_authentications/_confirm.haml create mode 100644 app/views/two_factor_authentications/_deactivate.haml create mode 100644 app/views/two_factor_authentications/_recovery.haml create mode 100644 app/views/two_factor_authentications/_token_form.haml create mode 100644 app/views/two_factor_authentications/confirm_2fa.html.haml create mode 100644 app/views/two_factor_authentications/recovery_codes.html.haml create mode 100644 app/views/two_factor_authentications/show.html.haml create mode 100644 db/migrate/20171229175654_add_devise_two_factor_to_users.rb create mode 100644 db/migrate/20180302105225_add_two_factor_backupable_to_user.rb create mode 100644 features/desktop/two_factor_authentication.feature create mode 100644 features/step_definitions/two_factor_steps.rb create mode 100644 lib/tasks/generate_2fa_encription_key.rake create mode 100644 spec/controllers/two_factor_authentications_controller_spec.rb diff --git a/.gitignore b/.gitignore index 65d3c2649..48f5537ad 100644 --- a/.gitignore +++ b/.gitignore @@ -11,6 +11,7 @@ app/assets/images/custom/ # Configuration files config/diaspora.yml config/initializers/secret_token.rb +config/initializers/twofa_encryption_key.rb .bundle vendor/bundle/ vendor/cache/ diff --git a/Gemfile b/Gemfile index 0e444ee31..f20886f8c 100644 --- a/Gemfile +++ b/Gemfile @@ -28,7 +28,9 @@ gem "yajl-ruby", "1.4.1" # Authentication gem "devise", "4.6.1" +gem "devise-two-factor", "3.0.3" gem "devise_lastseenable", "0.0.6" +gem "rqrcode", "0.10.1" # Captcha diff --git a/Gemfile.lock b/Gemfile.lock index 12da75e2c..0780e7b3f 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -60,6 +60,8 @@ GEM mime-types (>= 2.99) unf ast (2.4.0) + attr_encrypted (3.1.0) + encryptor (~> 3.0.0) attr_required (1.0.1) autoprefixer-rails (8.6.5) execjs @@ -173,6 +175,12 @@ GEM railties (>= 4.1.0, < 6.0) responders warden (~> 1.2.3) + devise-two-factor (3.0.3) + activesupport (< 5.3) + attr_encrypted (>= 1.3, < 4, != 2) + devise (~> 4.0) + railties (< 5.3) + rotp (~> 2.0) devise_lastseenable (0.0.6) devise rails (>= 3.0.4) @@ -195,6 +203,7 @@ GEM docile (1.3.1) domain_name (0.5.20180417) unf (>= 0.0.5, < 1.0.0) + encryptor (3.0.0) entypo-rails (3.0.0) railties (>= 4.1, < 6) equalizer (0.0.11) @@ -603,6 +612,9 @@ GEM responders (2.4.1) actionpack (>= 4.2.0, < 6.0) railties (>= 4.2.0, < 6.0) + rotp (2.1.2) + rqrcode (0.10.1) + chunky_png (~> 1.0) rspec (3.8.0) rspec-core (~> 3.8.0) rspec-expectations (~> 3.8.0) @@ -798,6 +810,7 @@ DEPENDENCIES cucumber-rails (= 1.6.0) database_cleaner (= 1.7.0) devise (= 4.6.1) + devise-two-factor (= 3.0.3) devise_lastseenable (= 0.0.6) diaspora-prosody-config (= 0.0.7) diaspora_federation-json_schema (= 0.2.6) @@ -891,6 +904,7 @@ DEPENDENCIES redcarpet (= 3.4.0) redis (= 3.3.5) responders (= 2.4.1) + rqrcode (= 0.10.1) rspec-json_expectations (~> 2.1) rspec-rails (= 3.8.2) rubocop (= 0.66.0) diff --git a/app/assets/stylesheets/login.scss b/app/assets/stylesheets/login.scss index b0336a8e0..bdb62a343 100644 --- a/app/assets/stylesheets/login.scss +++ b/app/assets/stylesheets/login.scss @@ -1,4 +1,5 @@ .page-sessions.action-new, +.page-sessions.action-create, .page-passwords.action-new, .page-passwords.action-edit { padding-top: 25px; diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 89411fb4e..86d763887 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -27,6 +27,7 @@ class ApplicationController < ActionController::Base before_action :gon_set_current_user before_action :gon_set_appconfig before_action :gon_set_preloads + before_action :configure_permitted_parameters, if: :devise_controller? inflection_method grammatical_gender: :gender @@ -182,4 +183,10 @@ class ApplicationController < ActionController::Base return unless gon.preloads.nil? gon.preloads = {} end + + protected + + def configure_permitted_parameters + devise_parameter_sanitizer.permit(:sign_in, keys: [:otp_attempt]) + end end diff --git a/app/controllers/sessions_controller.rb b/app/controllers/sessions_controller.rb index 0f3bd1c46..9d483a0cc 100644 --- a/app/controllers/sessions_controller.rb +++ b/app/controllers/sessions_controller.rb @@ -5,10 +5,54 @@ # the COPYRIGHT file. class SessionsController < Devise::SessionsController - after_action :reset_authentication_token, only: [:create] - before_action :reset_authentication_token, only: [:destroy] + # rubocop:disable Rails/LexicallyScopedActionFilter + before_action :authenticate_with_2fa, only: :create + after_action :reset_authentication_token, only: :create + before_action :reset_authentication_token, only: :destroy + # rubocop:enable Rails/LexicallyScopedActionFilter + + def find_user + return User.find(session[:otp_user_id]) if session[:otp_user_id] + + User.find_for_authentication(username: params[:user][:username]) if params[:user][:username] + end + + def authenticate_with_2fa + self.resource = find_user + u = find_user + + return true unless u&.otp_required_for_login? + + if params[:user][:otp_attempt].present? && session[:otp_user_id] + authenticate_with_two_factor_via_otp(u) + elsif u&.valid_password?(params[:user][:password]) + prompt_for_two_factor(u) + end + end + + def valid_otp_attempt?(user) + user.validate_and_consume_otp!(params[:user][:otp_attempt]) || + user.invalidate_otp_backup_code!(params[:user][:otp_attempt]) + rescue OpenSSL::Cipher::CipherError => _error + false + end + + def authenticate_with_two_factor_via_otp(user) + if valid_otp_attempt?(user) + session.delete(:otp_user_id) + sign_in(user) + else + flash.now[:alert] = "Invalid token" + prompt_for_two_factor(user) + end + end + + def prompt_for_two_factor(user) + session[:otp_user_id] = user.id + render :two_factor + end def reset_authentication_token - current_user.reset_authentication_token! unless current_user.nil? + current_user&.reset_authentication_token! end end diff --git a/app/controllers/two_factor_authentications_controller.rb b/app/controllers/two_factor_authentications_controller.rb new file mode 100644 index 000000000..e5350b38e --- /dev/null +++ b/app/controllers/two_factor_authentications_controller.rb @@ -0,0 +1,60 @@ +# frozen_string_literal: true + +class TwoFactorAuthenticationsController < ApplicationController + before_action :authenticate_user! + before_action :verify_otp_required, only: [:create] + + def show + @user = current_user + end + + def create + current_user.otp_secret = User.generate_otp_secret(32) + current_user.save! + redirect_to confirm_two_factor_authentication_path + end + + def confirm_2fa + redirect_to two_factor_authentication_path if current_user.otp_required_for_login? + end + + def confirm_and_activate_2fa + if current_user.validate_and_consume_otp!(params[:user][:code]) + current_user.otp_required_for_login = true + current_user.save! + + flash[:notice] = t("two_factor_auth.flash.success_activation") + redirect_to recovery_codes_two_factor_authentication_path + else + flash[:alert] = t("two_factor_auth.flash.error_token") + redirect_to confirm_two_factor_authentication_path + end + end + + def recovery_codes + @recovery_codes = current_user.generate_otp_backup_codes! + current_user.save! + end + + def destroy + if acceptable_code? + current_user.otp_required_for_login = false + current_user.save! + flash[:notice] = t("two_factor_auth.flash.success_deactivation") + else + flash.now[:alert] = t("two_factor_auth.flash.error_token") + end + redirect_to two_factor_authentication_path + end + + private + + def verify_otp_required + redirect_to two_factor_authentication_path if current_user.otp_required_for_login? + end + + def acceptable_code? + current_user.validate_and_consume_otp!(params[:two_factor_authentication][:code]) || + current_user.invalidate_otp_backup_code!(params[:two_factor_authentication][:code]) + end +end diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index 1f10ebfc2..726f46f2e 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -152,6 +152,8 @@ class UsersController < ApplicationController :auto_follow_back_aspect_id, :getting_started, :post_default_public, + :otp_required_for_login, + :otp_secret, email_preferences: UserPreference::VALID_EMAIL_TYPES.map(&:to_sym) ) end diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index 213d034b6..36cce9bce 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -72,4 +72,9 @@ module ApplicationHelper buf << [nonced_javascript_tag("$.fx.off = true;")] if Rails.env.test? buf.join("\n").html_safe end + + def qrcode_uri + label = current_user.username + current_user.otp_provisioning_uri(label, issuer: AppConfig.environment.url) + end end diff --git a/app/models/user.rb b/app/models/user.rb index 069b0ac77..0f9336eca 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -19,7 +19,15 @@ class User < ApplicationRecord scope :halfyear_actives, ->(time = Time.now) { logged_in_since(time - 6.month) } scope :active, -> { joins(:person).where(people: {closed_account: false}) } - devise :database_authenticatable, :registerable, + attribute :otp_secret + + devise :two_factor_authenticatable, + :two_factor_backupable, + otp_secret_encryption_key: AppConfig.twofa_encryption_key, + otp_backup_code_length: 16, + otp_number_of_backup_codes: 10 + + devise :registerable, :recoverable, :rememberable, :trackable, :validatable, :lockable, :lastseenable, :lock_strategy => :none, :unlock_strategy => :none @@ -42,6 +50,7 @@ class User < ApplicationRecord validate :no_person_with_same_username serialize :hidden_shareables, Hash + serialize :otp_backup_codes, Array has_one :person, inverse_of: :owner, foreign_key: :owner_id has_one :profile, through: :person diff --git a/app/views/sessions/two_factor.html.haml b/app/views/sessions/two_factor.html.haml new file mode 100644 index 000000000..8e40dc411 --- /dev/null +++ b/app/views/sessions/two_factor.html.haml @@ -0,0 +1,39 @@ +- content_for :page_title do + = AppConfig.settings.pod_name + " - " + t("two_factor_auth.title") + +.container#twofa + .text-center + .logos-asterisk + %h1 + = t("two_factor_auth.title") + + + = form_for resource, as: resource_name, + url: session_path(resource_name), + html: {class: "block-form"}, + method: :post do |f| + %fieldset + %label.sr-only#otp-label{for: "otp_attempt"} + = t("two_factor_auth.input_token.label") + + = f.text_field :otp_attempt, + type: :text, + placeholder: t("two_factor_auth.input_token.placeholder"), + required: true, + autofocus: true, + class: "input-block-level form-control" + %p= t "two_factor_auth.recovery.reminder" + + + .actions + = f.button t("devise.sessions.new.sign_in"), + type: :submit, + class: "btn btn-large btn-block btn-primary" + + .text-center + - if display_password_reset_link? + = link_to t("devise.shared.links.forgot_your_password"), + new_password_path(resource_name), id: "forgot_password_link" + %br + - if display_registration_link? + = link_to t("devise.shared.links.sign_up"), new_registration_path(resource_name) diff --git a/app/views/shared/_settings_nav.haml b/app/views/shared/_settings_nav.haml index e54f3e424..c5e5a3d6c 100644 --- a/app/views/shared/_settings_nav.haml +++ b/app/views/shared/_settings_nav.haml @@ -9,6 +9,8 @@ class: request.path == edit_user_path ? "list-group-item active" : "list-group-item" = link_to t("privacy"), privacy_settings_path, class: current_page?(privacy_settings_path) ? "list-group-item active" : "list-group-item" + = link_to t("two_factor_auth.title"), two_factor_authentication_path, + class: current_page?(two_factor_authentication_path) ? "list-group-item active" : "list-group-item" = link_to t("_services"), services_path, class: current_page?(services_path) ? "list-group-item active" : "list-group-item" = link_to t("_applications"), api_openid_connect_user_applications_path, diff --git a/app/views/two_factor_authentications/_activate.haml b/app/views/two_factor_authentications/_activate.haml new file mode 100644 index 000000000..ef6b0a7ff --- /dev/null +++ b/app/views/two_factor_authentications/_activate.haml @@ -0,0 +1,11 @@ +.col-md-12 + .row + .col-md-12 + %h3= t("two_factor_auth.title") + %p= t("two_factor_auth.explanation") + + .well= t("two_factor_auth.deactivated.status") + = form_for "user", url: two_factor_authentication_path, html: {method: :post} do |f| + = f.hidden_field :otp_required_for_login, value: true + .clearfix.form-group= f.submit t("two_factor_auth.deactivated.change_button"), + class: "btn btn-primary pull-right" diff --git a/app/views/two_factor_authentications/_confirm.haml b/app/views/two_factor_authentications/_confirm.haml new file mode 100644 index 000000000..b2ec2af90 --- /dev/null +++ b/app/views/two_factor_authentications/_confirm.haml @@ -0,0 +1,33 @@ +.col-md-12 + .row + .col-md-12 + %h3= t("two_factor_auth.confirm.title") + %p= t("two_factor_auth.confirm.status") + .small-horizontal-spacer + %h4= t("two_factor_auth.confirm.scan_title") + .row + .col-md-6 + %p= t("two_factor_auth.confirm.scan_explanation") + .two-factor-qr + != RQRCode::QRCode.new(qrcode_uri).as_svg(offset: 10, fill: "ffffff", module_size: 5) + + .col-md-6 + %p= t("two_factor_auth.confirm.manual_explanation") + %p!= t("two_factor_auth.confirm.manual_explanation_cont") + %pre.well= current_user.otp_secret.scan(/.{4}/).join(" ") + + .row + .col-md-12 + .small-horizontal-spacer + %h4= t("two_factor_auth.confirm.input_title") + = t("two_factor_auth.confirm.input_explanation") + = form_for "user", url: confirm_two_factor_authentication_path, + html: {method: :post, class: "form-horizontal"} do |f| + .form-group + = f.label :code, t("two_factor_auth.input_token.label"), class: "control-label col-sm-6" + .col-sm-6 + = f.text_field :code, placeholder: t("two_factor_auth.input_token.placeholder"), class: "form-control" + .form-group + .col-sm-12 + = link_to t("cancel"), two_factor_authentication_path, class: "btn btn-default" + = f.submit t("two_factor_auth.confirm.activate_button"), class: "btn btn-primary pull-right" diff --git a/app/views/two_factor_authentications/_deactivate.haml b/app/views/two_factor_authentications/_deactivate.haml new file mode 100644 index 000000000..c982265de --- /dev/null +++ b/app/views/two_factor_authentications/_deactivate.haml @@ -0,0 +1,28 @@ +.col-md-12 + .row + .col-md-12 + %h3= t("two_factor_auth.title") + %p= t("two_factor_auth.explanation") + .well= t("two_factor_auth.activated.status") + + %hr + + %h4= t("two_factor_auth.activated.change_button") + %p= t("two_factor_auth.activated.change_label") + + = form_for "two_factor_authentication", url: two_factor_authentication_path, + html: {method: :delete, class: "form-horizontal"} do |f| + .form-group + = f.label :code, t("two_factor_auth.input_token.label"), class: "control-label col-sm-6" + .col-sm-6 + = f.text_field :code, placeholder: t("two_factor_auth.input_token.placeholder"), class: "form-control" + = t("two_factor_auth.recovery.reminder") + .clearfix= f.submit t("two_factor_auth.activated.change_button"), class: "btn btn-primary pull-right" + + %hr + + %h4= t("two_factor_auth.recovery.title") + %p= t("two_factor_auth.recovery.explanation_short") + %p= t("two_factor_auth.recovery.invalidation_notice") + %p= link_to t("two_factor_auth.recovery.button"), + recovery_codes_two_factor_authentication_path, class: "btn btn-default" diff --git a/app/views/two_factor_authentications/_recovery.haml b/app/views/two_factor_authentications/_recovery.haml new file mode 100644 index 000000000..3f192e7d3 --- /dev/null +++ b/app/views/two_factor_authentications/_recovery.haml @@ -0,0 +1,18 @@ +.col-md-12 + .row + .col-md-12 + %h3= t("two_factor_auth.title") + .well= t("two_factor_auth.activated.status") + + %hr + + %h3= t("two_factor_auth.recovery.title") + %p= t("two_factor_auth.recovery.explanation") + + %ol.recovery-codes + - @recovery_codes.each do |code| + %li< + %samp= code + + .form-group.submit_block.clearfix + = link_to t("ok"), two_factor_authentication_path, class: "btn btn-primary pull-right" diff --git a/app/views/two_factor_authentications/_token_form.haml b/app/views/two_factor_authentications/_token_form.haml new file mode 100644 index 000000000..616cd7a67 --- /dev/null +++ b/app/views/two_factor_authentications/_token_form.haml @@ -0,0 +1,4 @@ +.form-group + = f.label :code, t("two_factor_auth.input_token.label"), class: "control-label col-sm-6" + .col-sm-6 + = f.text_field :code, placeholder: t("two_factor_auth.input_token.placeholder"), class: "form-control" diff --git a/app/views/two_factor_authentications/confirm_2fa.html.haml b/app/views/two_factor_authentications/confirm_2fa.html.haml new file mode 100644 index 000000000..36a8dcb08 --- /dev/null +++ b/app/views/two_factor_authentications/confirm_2fa.html.haml @@ -0,0 +1,11 @@ +- content_for :page_title do + = t("two_factor_auth.confirm.title") + +.container-fluid + .row + .col-md-3 + .sidebar + = render "shared/settings_nav" + .col-md-9 + .framed-content.clearfix + = render "confirm" diff --git a/app/views/two_factor_authentications/recovery_codes.html.haml b/app/views/two_factor_authentications/recovery_codes.html.haml new file mode 100644 index 000000000..98b4490d5 --- /dev/null +++ b/app/views/two_factor_authentications/recovery_codes.html.haml @@ -0,0 +1,12 @@ +- content_for :page_title do + = t("two_factor_auth.title") + = t("two_factor_auth.recovery.title") + +.container-fluid + .row + .col-md-3 + .sidebar + = render "shared/settings_nav" + .col-md-9 + .framed-content.clearfix + = render "recovery" diff --git a/app/views/two_factor_authentications/show.html.haml b/app/views/two_factor_authentications/show.html.haml new file mode 100644 index 000000000..a68902ac9 --- /dev/null +++ b/app/views/two_factor_authentications/show.html.haml @@ -0,0 +1,15 @@ +- content_for :page_title do + = t("two_factor_auth.title") + +.container-fluid + .row + .col-md-3 + .sidebar + = render "shared/settings_nav" + .col-md-9 + .framed-content.clearfix + + - if @user.otp_required_for_login + = render "deactivate" + - else + = render "activate" diff --git a/config/initializers/devise.rb b/config/initializers/devise.rb index bdd334b26..38a1eafad 100644 --- a/config/initializers/devise.rb +++ b/config/initializers/devise.rb @@ -15,6 +15,11 @@ end # Use this hook to configure devise mailer, warden hooks and so forth. # Many of these configuration options can be set straight in your model. Devise.setup do |config| + config.warden do |manager| + manager.default_strategies(scope: :user).unshift :two_factor_authenticatable + manager.default_strategies(scope: :user).unshift :two_factor_backupable + end + # The secret key used by Devise. Devise uses this key to generate # random tokens. Changing this key will render invalid all existing # confirmation, reset password and unlock tokens in the database. @@ -270,4 +275,8 @@ Devise.setup do |config| # When using omniauth, Devise cannot automatically set Omniauth path, # so you need to do it manually. For the users scope, it would be: # config.omniauth_path_prefix = '/my_engine/users/auth' + + # if a user enables 2fa this would log them in without requiring them + # to enter a token + config.sign_in_after_reset_password = false end diff --git a/config/initializers/filter_parameter_logging.rb b/config/initializers/filter_parameter_logging.rb index 2a915d470..791647716 100644 --- a/config/initializers/filter_parameter_logging.rb +++ b/config/initializers/filter_parameter_logging.rb @@ -4,3 +4,4 @@ # Configure sensitive parameters which will be filtered from the log file. Rails.application.config.filter_parameters += %i[password message text bio] +Rails.application.config.filter_parameters += [:otp_attempt] diff --git a/config/locales/diaspora/en.yml b/config/locales/diaspora/en.yml index 88ee05b20..007c05efc 100644 --- a/config/locales/diaspora/en.yml +++ b/config/locales/diaspora/en.yml @@ -1311,6 +1311,42 @@ en: email_confirmed: "Email %{email} activated" email_not_confirmed: "Email could not be activated. Wrong link?" + two_factor_auth: + title: "Two-factor authentication" + explanation: "Two-factor authentication is a powerful way to ensure you are the only one able to sign in to your account. When signing in, you will enter a 6-digit code along with your password to prove your identity. Be careful though: if you lose your phone and the recovery codes created when you activate this feature, access to your diaspora* account will be blocked forever." + activated: + status: "Two-factor authentication activated" + change_label: "Deactivate two-factor authentication by entering a TOTP token." + change_button: "Deactivate" + deactivated: + status: "Two-factor authentication not activated" + change_label: "Activate two-factor authentication" + change_button: "Activate" + confirm: + title: "Confirm activation" + status: "Two-factor authentication is not fully activated yet, you need to confirm activation with a TOTP token" + scan_title: "Scan the QR code" + scan_explanation: "Please scan the QR code with a TOTP capable app, such as andOTP (Android), FreeOTP (iOS), SailOTP (SailfishOS)." + manual_explanation: "In case you can’t scan the QR code automatically you can manually enter the secret in your app." + manual_explanation_cont: "We are using time-based one-time passwords (TOTP) with six-digit tokens. In case your app prompts you for a time interval and algorithm enter 30 seconds and sha1 respectively.
The spaces are just for readability, please enter the code without them." + input_title: "Confim with TOTP token" + input_explanation: "After scanning or entering the secret, enter the six-digit code you see and confirm the setup." + activate_button: "Confirm and activate" + input_token: + label: "Two-factor token" + placeholder: "six-digit two-factor token" + recovery: + title: "Recovery codes" + reminder: "Alternatively, you can use one of the recovery codes." + explanation: "If you ever lose access to your phone, you can use one of the recovery codes below to regain access to your account. Keep the recovery codes safe. For example, you may print them and store them with other important documents." + explanation_short: "Recovery codes allow you to regain access to your account if you lose your phone. Note that you can use each recovery code only once." + invalidation_notice: "If you've lost your recovery codes, you can regenerate them here. Your old recovery codes will be invalidated." + button: "Generate new recovery codes" + flash: + success_activation: "Successfully activated two-factor authentication" + success_deactivation: "Successfully deactivated two-factor authentication" + error_token: "Token was incorrect or invalid" + will_paginate: previous_label: "« previous" next_label: "next »" diff --git a/config/routes.rb b/config/routes.rb index 7f1e36102..4115bf5ba 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -119,6 +119,12 @@ Rails.application.routes.draw do get "getting_started_completed" => :getting_started_completed end + resource :two_factor_authentication, only: %i[show create destroy] do + get :confirm, action: :confirm_2fa + post :confirm, action: :confirm_and_activate_2fa + get :recovery_codes + end + devise_for :users, controllers: {sessions: :sessions}, skip: :registration devise_scope :user do get "/users/sign_up" => "registrations#new", :as => :new_user_registration diff --git a/db/migrate/20171229175654_add_devise_two_factor_to_users.rb b/db/migrate/20171229175654_add_devise_two_factor_to_users.rb new file mode 100644 index 000000000..f66a4e77e --- /dev/null +++ b/db/migrate/20171229175654_add_devise_two_factor_to_users.rb @@ -0,0 +1,11 @@ +# frozen_string_literal: true + +class AddDeviseTwoFactorToUsers < ActiveRecord::Migration[5.1] + def change + add_column :users, :encrypted_otp_secret, :string + add_column :users, :encrypted_otp_secret_iv, :string + add_column :users, :encrypted_otp_secret_salt, :string + add_column :users, :consumed_timestep, :integer + add_column :users, :otp_required_for_login, :boolean + end +end diff --git a/db/migrate/20180302105225_add_two_factor_backupable_to_user.rb b/db/migrate/20180302105225_add_two_factor_backupable_to_user.rb new file mode 100644 index 000000000..f9b6c0b5e --- /dev/null +++ b/db/migrate/20180302105225_add_two_factor_backupable_to_user.rb @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +class AddTwoFactorBackupableToUser < ActiveRecord::Migration[5.1] + def change + add_column :users, :otp_backup_codes, :text + end +end diff --git a/features/desktop/change_password.feature b/features/desktop/change_password.feature index f37ebe045..7b30014ec 100644 --- a/features/desktop/change_password.feature +++ b/features/desktop/change_password.feature @@ -29,8 +29,7 @@ Feature: Change password When I follow the "Change my password" link from the last sent email When I fill out the password reset form with "supersecret" and "supersecret" And I submit the password reset form - Then I should be on the stream page - And I sign out manually + Then I should be on the new user session page And I sign in manually as "georges_abitbol" with password "supersecret" Then I should be on the stream page diff --git a/features/desktop/two_factor_authentication.feature b/features/desktop/two_factor_authentication.feature new file mode 100644 index 000000000..ae8e2d2ef --- /dev/null +++ b/features/desktop/two_factor_authentication.feature @@ -0,0 +1,90 @@ +# frozen_string_literal: true +@javascript +Feature: Two-factor autentication + + Scenario: Activate 2fa + Given a user with email "alice@test.com" + When I sign in as "alice@test.com" + When I go to the two-factor authentication page + And I press "Activate" + Then I should see "Confirm activation" + When I scan the QR code and fill in a valid TOTP token for "alice@test.com" + And I press "Confirm and activate" + Then I should see "Two-factor authentication activated" + And I should see "Recovery codes" + When I confirm activation + Then I should see "Two-factor authentication activated" + And I should see "Deactivate" + + Scenario: Signing in with 2fa activated and correct token + Given a user with username "alice" and password "secret" + And 2fa is activated for "alice" + When I go to the login page + And I fill in username "alice" and password "secret" + And press "Sign in" + Then I should see "Two-factor authentication" + When I fill in a valid TOTP token for "alice" + And I press "Sign in" + Then I should be on the stream page + + Scenario: Trying to sign in with 2fa activated and incorrect token + Given a user with username "alice" and password "secret" + And 2fa is activated for "alice" + When I go to the login page + And I fill in username "alice" and password "secret" + And press "Sign in" + Then I should see "Two-factor authentication" + When I fill in an invalid TOTP token + And I press "Sign in" + Then I should see "Two-factor authentication" + + Scenario: Signing in with 2fa activated and a recovery code + Given a user with username "alice" and password "secret" + And 2fa is activated for "alice" + When I go to the login page + And I fill in username "alice" and password "secret" + And press "Sign in" + Then I should see "Two-factor authentication" + When I fill in a recovery code from "alice" + And I press "Sign in" + Then I should be on the stream page + + Scenario: Regenerating recovery codes + Given a user with email "alice@test.com" + When I sign in as "alice@test.com" + And 2fa is activated for "alice@test.com" + When I go to the two-factor authentication page + Then I should see "Generate new recovery codes" + When I press the recovery code generate button + Then I should see a list of recovery codes + + Scenario: Deactivating 2fa with correct token + Given a user with email "alice@test.com" + When I sign in as "alice@test.com" + And 2fa is activated for "alice@test.com" + When I go to the two-factor authentication page + Then I should see "Deactivate" + When I fill in a valid TOTP token to deactivate for "alice@test.com" + And I press "Deactivate" + Then I should see "Two-factor authentication not activated" + + Scenario: Deactivating 2fa with recovery token + Given a user with email "alice@test.com" + When I sign in as "alice@test.com" + And 2fa is activated for "alice@test.com" + When I go to the two-factor authentication page + Then I should see "Deactivate" + When I fill in a recovery code to deactivate from "alice@test.com" + And I press "Deactivate" + Then I should see "Two-factor authentication not activated" + + Scenario: Trying to deactivate with incorrect token + Given a user with email "alice@test.com" + When I sign in as "alice@test.com" + And 2fa is activated for "alice@test.com" + When I go to the two-factor authentication page + Then I should see "Deactivate" + When I fill in an invalid TOTP token to deactivate + And I press "Deactivate" + Then I should see "Two-factor authentication activated" + And I should see "Deactivate" diff --git a/features/mobile/change_password.feature b/features/mobile/change_password.feature index f30edb215..f3bcdb445 100644 --- a/features/mobile/change_password.feature +++ b/features/mobile/change_password.feature @@ -31,9 +31,8 @@ Feature: Change password When I follow the "Change my password" link from the last sent email And I fill out the password reset form with "supersecret" and "supersecret" And I submit the password reset form - Then I should be on the stream page - When I sign out - And I go to the login page + Then I should be on the new user session page + When I go to the login page And I sign in manually as "georges_abitbol" with password "supersecret" on the mobile website Then I should be on the stream page diff --git a/features/step_definitions/two_factor_steps.rb b/features/step_definitions/two_factor_steps.rb new file mode 100644 index 000000000..7b5ab2319 --- /dev/null +++ b/features/step_definitions/two_factor_steps.rb @@ -0,0 +1,67 @@ +# frozen_string_literal: true + +When /^I scan the QR code and fill in a valid TOTP token for "([^"]*)"$/ do |email| + @me = find_user email + fill_in "user_code", with: @me.current_otp +end + +When /^I fill in a valid TOTP token for "([^"]*)"$/ do |username| + @me = find_user username + fill_in "user_otp_attempt", with: @me.current_otp +end + +When /^I fill in an invalid TOTP token$/ do + fill_in "user_otp_attempt", with: "c0ffee" +end + +When /^I fill in a valid TOTP token to deactivate for "([^"]*)"$/ do |username| + @me = find_user username + fill_in "two_factor_authentication_code", with: @me.current_otp +end + +When /^I fill in an invalid TOTP token to deactivate$/ do + fill_in "two_factor_authentication_code", with: "c0ffee" +end + +When /^I fill in a recovery code from "([^"]*)"$/ do |username| + @me = find_user username + @codes = @me.generate_otp_backup_codes! + @me.save! + fill_in "user_otp_attempt", with: @codes.first +end + +When /^I fill in a recovery code to deactivate from "([^"]*)"$/ do |username| + @me = find_user username + @codes = @me.generate_otp_backup_codes! + @me.save! + fill_in "two_factor_authentication_code", with: @codes.first +end + +When /^I confirm activation$/ do + find(".btn-primary", match: :first).click +end + +When /^2fa is activated for "([^"]*)"$/ do |username| + @me = find_user username + @me.otp_secret = User.generate_otp_secret(32) + @me.otp_required_for_login = true + @me.save! +end + +When /^I fill in username "([^"]*)" and password "([^"]*)"$/ do |username, password| + fill_in "user_username", with: username + fill_in "user_password", with: password +end + +Then /^I should see a list of recovery codes$/ do + find(".recovery-codes", match: :first) + find(".recovery-codes li samp", match: :first) +end + +When /^I press the recovery code generate button$/ do + find(".btn-default", match: :first).click +end + +def find_user(username) + User.find_by(username: username) || User.find_by(email: username) +end diff --git a/features/support/paths.rb b/features/support/paths.rb index a486ef245..7962fe17d 100644 --- a/features/support/paths.rb +++ b/features/support/paths.rb @@ -40,6 +40,8 @@ module NavigationHelpers edit_user_path when /^forgot password page$/ new_user_password_path + when /^the two-factor authentication page$/ + two_factor_authentication_path when %r{^"(/.*)"} Regexp.last_match(1) else diff --git a/lib/configuration_methods.rb b/lib/configuration_methods.rb index 511e8e2d2..487b70672 100644 --- a/lib/configuration_methods.rb +++ b/lib/configuration_methods.rb @@ -52,25 +52,43 @@ module Configuration def secret_token if heroku? - return ENV['SECRET_TOKEN'] if ENV['SECRET_TOKEN'] + return ENV["SECRET_TOKEN"] if ENV["SECRET_TOKEN"] + warn "FATAL: Running on Heroku with SECRET_TOKEN unset" warn " Run heroku config:add SECRET_TOKEN=#{SecureRandom.hex(40)}" - Process.exit(1) + abort else token_file = File.expand_path( - '../config/initializers/secret_token.rb', + "../config/initializers/secret_token.rb", File.dirname(__FILE__) ) - unless File.exist? token_file - `DISABLE_SPRING=1 bin/rake generate:secret_token` - end + system "DISABLE_SPRING=1 bin/rake generate:secret_token" unless File.exist? token_file require token_file Diaspora::Application.config.secret_key_base end end + def twofa_encryption_key + if heroku? + return ENV["TWOFA_ENCRYPTION_KEY"] if ENV["TWOFA_ENCRYPTION_KEY"] + + warn "FATAL: Running on Heroku with TWOFA_ENCRYPTION_KEY unset" + warn " Run heroku config:add TWOFA_ENCRYPTION_KEY=#{SecureRandom.hex(32)}" + abort + else + key_file = File.expand_path( + "../config/initializers/twofa_encryption_key.rb", + File.dirname(__FILE__) + ) + system "DISABLE_SPRING=1 bin/rake generate:twofa_key" unless File.exist? key_file + require key_file + Diaspora::Application.config.twofa_encryption_key + end + end + def version_string return @version_string unless @version_string.nil? + @version_string = version.number.to_s @version_string = "#{@version_string}-p#{git_revision[0..7]}" if git_available? @version_string diff --git a/lib/tasks/generate_2fa_encription_key.rake b/lib/tasks/generate_2fa_encription_key.rake new file mode 100644 index 000000000..53572f51f --- /dev/null +++ b/lib/tasks/generate_2fa_encription_key.rake @@ -0,0 +1,24 @@ +# frozen_string_literal: true + +namespace :generate do + desc "Generates a key for encrypting 2fa tokens" + task :twofa_key do + path = Rails.root.join("config", "initializers", "twofa_encryption_key.rb") + key = SecureRandom.hex(32) + File.open(path, "w") do |f| + f.write <<~CONF + # frozen_string_literal: true + + # The 2fa encryption key is used to encrypt users' OTP tokens in the database. + + # You can regenerate this key by running `rake generate:twofa_key` + + # If you change this key after a user has set up 2fa + # the users' tokens cannot be recovered + # and they will not be able to log in again! + + Diaspora::Application.config.twofa_encryption_key = "#{key}" + CONF + end + end +end diff --git a/spec/controllers/two_factor_authentications_controller_spec.rb b/spec/controllers/two_factor_authentications_controller_spec.rb new file mode 100644 index 000000000..585061385 --- /dev/null +++ b/spec/controllers/two_factor_authentications_controller_spec.rb @@ -0,0 +1,120 @@ +# frozen_string_literal: true + +describe TwoFactorAuthenticationsController, type: :controller do + before do + @user = FactoryGirl.create :user + sign_in @user + end + + describe "#show" do + it "shows the deactivated state of 2fa" do + get :show + expect(response.body).to match I18n.t("two_factor_auth.title") + expect(response.body).to match I18n.t("two_factor_auth.deactivated.status") + expect(@user).to have_attributes(otp_required_for_login: nil) + end + + it "shows the activated state of 2fa" do + activate_2fa + get :show + expect(response.body).to match I18n.t("two_factor_auth.title") + expect(response.body).to match I18n.t("two_factor_auth.activated.status") + expect(response.body).to match I18n.t("two_factor_auth.input_token.label") + expect(response.body).to match I18n.t("two_factor_auth.recovery.button") + expect(@user).to have_attributes(otp_required_for_login: true) + end + end + + describe "#create" do + it "sets the otp_secret flag" do + post :create, params: {user: {otp_required_for_login: "true"}} + expect(response).to be_redirect + expect(response.location).to match confirm_two_factor_authentication_path + end + end + + describe "#confirm_2fa" do + context "2fa is not yet activated" do + before do + create_otp_token + end + it "shows the QR verification code" do + get :confirm_2fa + expect(response.body).to match I18n.t("two_factor_auth.confirm.title") + expect(response.body).to include("svg") + expect(response.body).to match(/#{@user.otp_secret.scan(/.{4}/).join(" ")}/) + expect(response.body).to match I18n.t("two_factor_auth.input_token.label") + end + end + context "2fa is already activated" do + before do + activate_2fa + end + + it "redirects back" do + get :confirm_2fa + expect(response).to be_redirect + expect(response.location).to match two_factor_authentication_path + end + end + end + + describe "#confirm_and_activate_2fa" do + before do + create_otp_token + end + it "redirects back to confirm when token was wrong" do + post :confirm_and_activate_2fa, params: {user: {code: "not valid token"}} + expect(response.location).to match confirm_two_factor_authentication_path + expect(flash[:alert]).to match I18n.t("two_factor_auth.flash.error_token") + end + it "redirects to #recovery_codes when token was correct" do + post :confirm_and_activate_2fa, params: {user: {code: @user.current_otp}} + expect(response.location).to match recovery_codes_two_factor_authentication_path + expect(flash[:notice]).to match I18n.t("two_factor_auth.flash.success_activation") + end + end + + describe "#recovery_codes" do + before do + activate_2fa + end + it "shows recovery codes page" do + get :recovery_codes + expect(response.body).to match I18n.t("two_factor_auth.recovery.title") + expect(@user).to have_attributes(otp_required_for_login: true) + end + end + + describe "#destroy" do + before do + activate_2fa + end + it "deactivates 2fa if token is correct" do + delete :destroy, params: {two_factor_authentication: {code: @user.current_otp}} + expect(response).to be_redirect + expect(flash[:notice]).to match I18n.t("two_factor_auth.flash.success_deactivation") + end + + it "does nothing if token is wrong" do + delete :destroy, params: {two_factor_authentication: {code: "a wrong code"}} + expect(response).to be_redirect + expect(flash[:alert]).to match I18n.t("two_factor_auth.flash.error_token") + end + end + + def create_otp_token + @user.otp_secret = User.generate_otp_secret(32) + @user.save! + end + + def confirm_activation + @user.otp_required_for_login = true + @user.save! + end + + def activate_2fa + create_otp_token + confirm_activation + end +end diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb index d264493a8..13aa6fae8 100644 --- a/spec/models/user_spec.rb +++ b/spec/models/user_spec.rb @@ -983,6 +983,13 @@ describe User, :type => :model do post_default_public exported_at exported_photos_at + consumed_timestep + encrypted_otp_secret + encrypted_otp_secret_iv + encrypted_otp_secret_salt + otp_backup_codes + otp_required_for_login + otp_secret ) ) end From 9d5b981809435b05b06e300a5495a71085e89882 Mon Sep 17 00:00:00 2001 From: lislis Date: Sun, 28 Apr 2019 19:06:48 +0200 Subject: [PATCH 06/81] Two factor authentication (#7751) --- .gitignore | 1 + Changelog.md | 3 +- Gemfile | 2 + Gemfile.lock | 14 ++ app/assets/stylesheets/login.scss | 1 + app/controllers/application_controller.rb | 7 + app/controllers/sessions_controller.rb | 50 +++++++- .../two_factor_authentications_controller.rb | 60 +++++++++ app/controllers/users_controller.rb | 2 + app/helpers/application_helper.rb | 5 + app/models/user.rb | 11 +- app/views/sessions/two_factor.html.haml | 39 ++++++ app/views/shared/_settings_nav.haml | 2 + .../two_factor_authentications/_activate.haml | 11 ++ .../two_factor_authentications/_confirm.haml | 33 +++++ .../_deactivate.haml | 28 ++++ .../two_factor_authentications/_recovery.haml | 18 +++ .../_token_form.haml | 4 + .../confirm_2fa.html.haml | 11 ++ .../recovery_codes.html.haml | 12 ++ .../two_factor_authentications/show.html.haml | 15 +++ config/initializers/devise.rb | 9 ++ .../initializers/filter_parameter_logging.rb | 1 + config/locales/diaspora/en.yml | 36 ++++++ config/routes.rb | 6 + ...29175654_add_devise_two_factor_to_users.rb | 11 ++ ...05225_add_two_factor_backupable_to_user.rb | 7 + features/desktop/change_password.feature | 3 +- .../desktop/two_factor_authentication.feature | 90 +++++++++++++ features/mobile/change_password.feature | 5 +- features/step_definitions/two_factor_steps.rb | 67 ++++++++++ features/support/paths.rb | 2 + lib/configuration_methods.rb | 30 ++++- lib/tasks/generate_2fa_encription_key.rake | 24 ++++ ..._factor_authentications_controller_spec.rb | 120 ++++++++++++++++++ spec/models/user_spec.rb | 7 + 36 files changed, 731 insertions(+), 16 deletions(-) create mode 100644 app/controllers/two_factor_authentications_controller.rb create mode 100644 app/views/sessions/two_factor.html.haml create mode 100644 app/views/two_factor_authentications/_activate.haml create mode 100644 app/views/two_factor_authentications/_confirm.haml create mode 100644 app/views/two_factor_authentications/_deactivate.haml create mode 100644 app/views/two_factor_authentications/_recovery.haml create mode 100644 app/views/two_factor_authentications/_token_form.haml create mode 100644 app/views/two_factor_authentications/confirm_2fa.html.haml create mode 100644 app/views/two_factor_authentications/recovery_codes.html.haml create mode 100644 app/views/two_factor_authentications/show.html.haml create mode 100644 db/migrate/20171229175654_add_devise_two_factor_to_users.rb create mode 100644 db/migrate/20180302105225_add_two_factor_backupable_to_user.rb create mode 100644 features/desktop/two_factor_authentication.feature create mode 100644 features/step_definitions/two_factor_steps.rb create mode 100644 lib/tasks/generate_2fa_encription_key.rake create mode 100644 spec/controllers/two_factor_authentications_controller_spec.rb diff --git a/.gitignore b/.gitignore index 65d3c2649..48f5537ad 100644 --- a/.gitignore +++ b/.gitignore @@ -11,6 +11,7 @@ app/assets/images/custom/ # Configuration files config/diaspora.yml config/initializers/secret_token.rb +config/initializers/twofa_encryption_key.rb .bundle vendor/bundle/ vendor/cache/ diff --git a/Changelog.md b/Changelog.md index 049ce06ba..3f44db66b 100644 --- a/Changelog.md +++ b/Changelog.md @@ -5,8 +5,9 @@ ## Bug fixes ## Features -* Add a manifest.json file as a first step to make diaspora* a Progressive Web App [#7998](https://github.com/diaspora/diaspora/pull/7998) +* Add a manifest.json file as a first step to make diaspora\* a Progressive Web App [#7998](https://github.com/diaspora/diaspora/pull/7998) * Allow `web+diaspora://` links to link to a profile with only the diaspora ID [#8000](https://github.com/diaspora/diaspora/pull/8000) +* Support TOTP two factor authentication [#7751](https://github.com/diaspora/diaspora/pull/7751) # 0.7.10.0 diff --git a/Gemfile b/Gemfile index ec75c2556..cd54325d8 100644 --- a/Gemfile +++ b/Gemfile @@ -27,7 +27,9 @@ gem "json-schema", "2.8.1" # Authentication gem "devise", "4.6.1" +gem "devise-two-factor", "3.0.3" gem "devise_lastseenable", "0.0.6" +gem "rqrcode", "0.10.1" # Captcha diff --git a/Gemfile.lock b/Gemfile.lock index ead2af7e0..38e879e6d 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -60,6 +60,8 @@ GEM mime-types (>= 2.99) unf ast (2.4.0) + attr_encrypted (3.1.0) + encryptor (~> 3.0.0) attr_required (1.0.1) autoprefixer-rails (8.6.5) execjs @@ -169,6 +171,12 @@ GEM railties (>= 4.1.0, < 6.0) responders warden (~> 1.2.3) + devise-two-factor (3.0.3) + activesupport (< 5.3) + attr_encrypted (>= 1.3, < 4, != 2) + devise (~> 4.0) + railties (< 5.3) + rotp (~> 2.0) devise_lastseenable (0.0.6) devise rails (>= 3.0.4) @@ -191,6 +199,7 @@ GEM docile (1.3.1) domain_name (0.5.20180417) unf (>= 0.0.5, < 1.0.0) + encryptor (3.0.0) entypo-rails (3.0.0) railties (>= 4.1, < 6) equalizer (0.0.11) @@ -596,6 +605,9 @@ GEM responders (2.4.1) actionpack (>= 4.2.0, < 6.0) railties (>= 4.2.0, < 6.0) + rotp (2.1.2) + rqrcode (0.10.1) + chunky_png (~> 1.0) rspec (3.8.0) rspec-core (~> 3.8.0) rspec-expectations (~> 3.8.0) @@ -785,6 +797,7 @@ DEPENDENCIES cucumber-rails (= 1.6.0) database_cleaner (= 1.7.0) devise (= 4.6.1) + devise-two-factor (= 3.0.3) devise_lastseenable (= 0.0.6) diaspora-prosody-config (= 0.0.7) diaspora_federation-json_schema (= 0.2.6) @@ -876,6 +889,7 @@ DEPENDENCIES redcarpet (= 3.4.0) redis (= 3.3.5) responders (= 2.4.1) + rqrcode (= 0.10.1) rspec-json_expectations (~> 2.1) rspec-rails (= 3.8.2) rubocop (= 0.66.0) diff --git a/app/assets/stylesheets/login.scss b/app/assets/stylesheets/login.scss index b0336a8e0..bdb62a343 100644 --- a/app/assets/stylesheets/login.scss +++ b/app/assets/stylesheets/login.scss @@ -1,4 +1,5 @@ .page-sessions.action-new, +.page-sessions.action-create, .page-passwords.action-new, .page-passwords.action-edit { padding-top: 25px; diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 89411fb4e..86d763887 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -27,6 +27,7 @@ class ApplicationController < ActionController::Base before_action :gon_set_current_user before_action :gon_set_appconfig before_action :gon_set_preloads + before_action :configure_permitted_parameters, if: :devise_controller? inflection_method grammatical_gender: :gender @@ -182,4 +183,10 @@ class ApplicationController < ActionController::Base return unless gon.preloads.nil? gon.preloads = {} end + + protected + + def configure_permitted_parameters + devise_parameter_sanitizer.permit(:sign_in, keys: [:otp_attempt]) + end end diff --git a/app/controllers/sessions_controller.rb b/app/controllers/sessions_controller.rb index 0f3bd1c46..9d483a0cc 100644 --- a/app/controllers/sessions_controller.rb +++ b/app/controllers/sessions_controller.rb @@ -5,10 +5,54 @@ # the COPYRIGHT file. class SessionsController < Devise::SessionsController - after_action :reset_authentication_token, only: [:create] - before_action :reset_authentication_token, only: [:destroy] + # rubocop:disable Rails/LexicallyScopedActionFilter + before_action :authenticate_with_2fa, only: :create + after_action :reset_authentication_token, only: :create + before_action :reset_authentication_token, only: :destroy + # rubocop:enable Rails/LexicallyScopedActionFilter + + def find_user + return User.find(session[:otp_user_id]) if session[:otp_user_id] + + User.find_for_authentication(username: params[:user][:username]) if params[:user][:username] + end + + def authenticate_with_2fa + self.resource = find_user + u = find_user + + return true unless u&.otp_required_for_login? + + if params[:user][:otp_attempt].present? && session[:otp_user_id] + authenticate_with_two_factor_via_otp(u) + elsif u&.valid_password?(params[:user][:password]) + prompt_for_two_factor(u) + end + end + + def valid_otp_attempt?(user) + user.validate_and_consume_otp!(params[:user][:otp_attempt]) || + user.invalidate_otp_backup_code!(params[:user][:otp_attempt]) + rescue OpenSSL::Cipher::CipherError => _error + false + end + + def authenticate_with_two_factor_via_otp(user) + if valid_otp_attempt?(user) + session.delete(:otp_user_id) + sign_in(user) + else + flash.now[:alert] = "Invalid token" + prompt_for_two_factor(user) + end + end + + def prompt_for_two_factor(user) + session[:otp_user_id] = user.id + render :two_factor + end def reset_authentication_token - current_user.reset_authentication_token! unless current_user.nil? + current_user&.reset_authentication_token! end end diff --git a/app/controllers/two_factor_authentications_controller.rb b/app/controllers/two_factor_authentications_controller.rb new file mode 100644 index 000000000..e5350b38e --- /dev/null +++ b/app/controllers/two_factor_authentications_controller.rb @@ -0,0 +1,60 @@ +# frozen_string_literal: true + +class TwoFactorAuthenticationsController < ApplicationController + before_action :authenticate_user! + before_action :verify_otp_required, only: [:create] + + def show + @user = current_user + end + + def create + current_user.otp_secret = User.generate_otp_secret(32) + current_user.save! + redirect_to confirm_two_factor_authentication_path + end + + def confirm_2fa + redirect_to two_factor_authentication_path if current_user.otp_required_for_login? + end + + def confirm_and_activate_2fa + if current_user.validate_and_consume_otp!(params[:user][:code]) + current_user.otp_required_for_login = true + current_user.save! + + flash[:notice] = t("two_factor_auth.flash.success_activation") + redirect_to recovery_codes_two_factor_authentication_path + else + flash[:alert] = t("two_factor_auth.flash.error_token") + redirect_to confirm_two_factor_authentication_path + end + end + + def recovery_codes + @recovery_codes = current_user.generate_otp_backup_codes! + current_user.save! + end + + def destroy + if acceptable_code? + current_user.otp_required_for_login = false + current_user.save! + flash[:notice] = t("two_factor_auth.flash.success_deactivation") + else + flash.now[:alert] = t("two_factor_auth.flash.error_token") + end + redirect_to two_factor_authentication_path + end + + private + + def verify_otp_required + redirect_to two_factor_authentication_path if current_user.otp_required_for_login? + end + + def acceptable_code? + current_user.validate_and_consume_otp!(params[:two_factor_authentication][:code]) || + current_user.invalidate_otp_backup_code!(params[:two_factor_authentication][:code]) + end +end diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index 1f10ebfc2..726f46f2e 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -152,6 +152,8 @@ class UsersController < ApplicationController :auto_follow_back_aspect_id, :getting_started, :post_default_public, + :otp_required_for_login, + :otp_secret, email_preferences: UserPreference::VALID_EMAIL_TYPES.map(&:to_sym) ) end diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index 213d034b6..36cce9bce 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -72,4 +72,9 @@ module ApplicationHelper buf << [nonced_javascript_tag("$.fx.off = true;")] if Rails.env.test? buf.join("\n").html_safe end + + def qrcode_uri + label = current_user.username + current_user.otp_provisioning_uri(label, issuer: AppConfig.environment.url) + end end diff --git a/app/models/user.rb b/app/models/user.rb index 069b0ac77..0f9336eca 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -19,7 +19,15 @@ class User < ApplicationRecord scope :halfyear_actives, ->(time = Time.now) { logged_in_since(time - 6.month) } scope :active, -> { joins(:person).where(people: {closed_account: false}) } - devise :database_authenticatable, :registerable, + attribute :otp_secret + + devise :two_factor_authenticatable, + :two_factor_backupable, + otp_secret_encryption_key: AppConfig.twofa_encryption_key, + otp_backup_code_length: 16, + otp_number_of_backup_codes: 10 + + devise :registerable, :recoverable, :rememberable, :trackable, :validatable, :lockable, :lastseenable, :lock_strategy => :none, :unlock_strategy => :none @@ -42,6 +50,7 @@ class User < ApplicationRecord validate :no_person_with_same_username serialize :hidden_shareables, Hash + serialize :otp_backup_codes, Array has_one :person, inverse_of: :owner, foreign_key: :owner_id has_one :profile, through: :person diff --git a/app/views/sessions/two_factor.html.haml b/app/views/sessions/two_factor.html.haml new file mode 100644 index 000000000..8e40dc411 --- /dev/null +++ b/app/views/sessions/two_factor.html.haml @@ -0,0 +1,39 @@ +- content_for :page_title do + = AppConfig.settings.pod_name + " - " + t("two_factor_auth.title") + +.container#twofa + .text-center + .logos-asterisk + %h1 + = t("two_factor_auth.title") + + + = form_for resource, as: resource_name, + url: session_path(resource_name), + html: {class: "block-form"}, + method: :post do |f| + %fieldset + %label.sr-only#otp-label{for: "otp_attempt"} + = t("two_factor_auth.input_token.label") + + = f.text_field :otp_attempt, + type: :text, + placeholder: t("two_factor_auth.input_token.placeholder"), + required: true, + autofocus: true, + class: "input-block-level form-control" + %p= t "two_factor_auth.recovery.reminder" + + + .actions + = f.button t("devise.sessions.new.sign_in"), + type: :submit, + class: "btn btn-large btn-block btn-primary" + + .text-center + - if display_password_reset_link? + = link_to t("devise.shared.links.forgot_your_password"), + new_password_path(resource_name), id: "forgot_password_link" + %br + - if display_registration_link? + = link_to t("devise.shared.links.sign_up"), new_registration_path(resource_name) diff --git a/app/views/shared/_settings_nav.haml b/app/views/shared/_settings_nav.haml index e54f3e424..c5e5a3d6c 100644 --- a/app/views/shared/_settings_nav.haml +++ b/app/views/shared/_settings_nav.haml @@ -9,6 +9,8 @@ class: request.path == edit_user_path ? "list-group-item active" : "list-group-item" = link_to t("privacy"), privacy_settings_path, class: current_page?(privacy_settings_path) ? "list-group-item active" : "list-group-item" + = link_to t("two_factor_auth.title"), two_factor_authentication_path, + class: current_page?(two_factor_authentication_path) ? "list-group-item active" : "list-group-item" = link_to t("_services"), services_path, class: current_page?(services_path) ? "list-group-item active" : "list-group-item" = link_to t("_applications"), api_openid_connect_user_applications_path, diff --git a/app/views/two_factor_authentications/_activate.haml b/app/views/two_factor_authentications/_activate.haml new file mode 100644 index 000000000..ef6b0a7ff --- /dev/null +++ b/app/views/two_factor_authentications/_activate.haml @@ -0,0 +1,11 @@ +.col-md-12 + .row + .col-md-12 + %h3= t("two_factor_auth.title") + %p= t("two_factor_auth.explanation") + + .well= t("two_factor_auth.deactivated.status") + = form_for "user", url: two_factor_authentication_path, html: {method: :post} do |f| + = f.hidden_field :otp_required_for_login, value: true + .clearfix.form-group= f.submit t("two_factor_auth.deactivated.change_button"), + class: "btn btn-primary pull-right" diff --git a/app/views/two_factor_authentications/_confirm.haml b/app/views/two_factor_authentications/_confirm.haml new file mode 100644 index 000000000..b2ec2af90 --- /dev/null +++ b/app/views/two_factor_authentications/_confirm.haml @@ -0,0 +1,33 @@ +.col-md-12 + .row + .col-md-12 + %h3= t("two_factor_auth.confirm.title") + %p= t("two_factor_auth.confirm.status") + .small-horizontal-spacer + %h4= t("two_factor_auth.confirm.scan_title") + .row + .col-md-6 + %p= t("two_factor_auth.confirm.scan_explanation") + .two-factor-qr + != RQRCode::QRCode.new(qrcode_uri).as_svg(offset: 10, fill: "ffffff", module_size: 5) + + .col-md-6 + %p= t("two_factor_auth.confirm.manual_explanation") + %p!= t("two_factor_auth.confirm.manual_explanation_cont") + %pre.well= current_user.otp_secret.scan(/.{4}/).join(" ") + + .row + .col-md-12 + .small-horizontal-spacer + %h4= t("two_factor_auth.confirm.input_title") + = t("two_factor_auth.confirm.input_explanation") + = form_for "user", url: confirm_two_factor_authentication_path, + html: {method: :post, class: "form-horizontal"} do |f| + .form-group + = f.label :code, t("two_factor_auth.input_token.label"), class: "control-label col-sm-6" + .col-sm-6 + = f.text_field :code, placeholder: t("two_factor_auth.input_token.placeholder"), class: "form-control" + .form-group + .col-sm-12 + = link_to t("cancel"), two_factor_authentication_path, class: "btn btn-default" + = f.submit t("two_factor_auth.confirm.activate_button"), class: "btn btn-primary pull-right" diff --git a/app/views/two_factor_authentications/_deactivate.haml b/app/views/two_factor_authentications/_deactivate.haml new file mode 100644 index 000000000..c982265de --- /dev/null +++ b/app/views/two_factor_authentications/_deactivate.haml @@ -0,0 +1,28 @@ +.col-md-12 + .row + .col-md-12 + %h3= t("two_factor_auth.title") + %p= t("two_factor_auth.explanation") + .well= t("two_factor_auth.activated.status") + + %hr + + %h4= t("two_factor_auth.activated.change_button") + %p= t("two_factor_auth.activated.change_label") + + = form_for "two_factor_authentication", url: two_factor_authentication_path, + html: {method: :delete, class: "form-horizontal"} do |f| + .form-group + = f.label :code, t("two_factor_auth.input_token.label"), class: "control-label col-sm-6" + .col-sm-6 + = f.text_field :code, placeholder: t("two_factor_auth.input_token.placeholder"), class: "form-control" + = t("two_factor_auth.recovery.reminder") + .clearfix= f.submit t("two_factor_auth.activated.change_button"), class: "btn btn-primary pull-right" + + %hr + + %h4= t("two_factor_auth.recovery.title") + %p= t("two_factor_auth.recovery.explanation_short") + %p= t("two_factor_auth.recovery.invalidation_notice") + %p= link_to t("two_factor_auth.recovery.button"), + recovery_codes_two_factor_authentication_path, class: "btn btn-default" diff --git a/app/views/two_factor_authentications/_recovery.haml b/app/views/two_factor_authentications/_recovery.haml new file mode 100644 index 000000000..3f192e7d3 --- /dev/null +++ b/app/views/two_factor_authentications/_recovery.haml @@ -0,0 +1,18 @@ +.col-md-12 + .row + .col-md-12 + %h3= t("two_factor_auth.title") + .well= t("two_factor_auth.activated.status") + + %hr + + %h3= t("two_factor_auth.recovery.title") + %p= t("two_factor_auth.recovery.explanation") + + %ol.recovery-codes + - @recovery_codes.each do |code| + %li< + %samp= code + + .form-group.submit_block.clearfix + = link_to t("ok"), two_factor_authentication_path, class: "btn btn-primary pull-right" diff --git a/app/views/two_factor_authentications/_token_form.haml b/app/views/two_factor_authentications/_token_form.haml new file mode 100644 index 000000000..616cd7a67 --- /dev/null +++ b/app/views/two_factor_authentications/_token_form.haml @@ -0,0 +1,4 @@ +.form-group + = f.label :code, t("two_factor_auth.input_token.label"), class: "control-label col-sm-6" + .col-sm-6 + = f.text_field :code, placeholder: t("two_factor_auth.input_token.placeholder"), class: "form-control" diff --git a/app/views/two_factor_authentications/confirm_2fa.html.haml b/app/views/two_factor_authentications/confirm_2fa.html.haml new file mode 100644 index 000000000..36a8dcb08 --- /dev/null +++ b/app/views/two_factor_authentications/confirm_2fa.html.haml @@ -0,0 +1,11 @@ +- content_for :page_title do + = t("two_factor_auth.confirm.title") + +.container-fluid + .row + .col-md-3 + .sidebar + = render "shared/settings_nav" + .col-md-9 + .framed-content.clearfix + = render "confirm" diff --git a/app/views/two_factor_authentications/recovery_codes.html.haml b/app/views/two_factor_authentications/recovery_codes.html.haml new file mode 100644 index 000000000..98b4490d5 --- /dev/null +++ b/app/views/two_factor_authentications/recovery_codes.html.haml @@ -0,0 +1,12 @@ +- content_for :page_title do + = t("two_factor_auth.title") + = t("two_factor_auth.recovery.title") + +.container-fluid + .row + .col-md-3 + .sidebar + = render "shared/settings_nav" + .col-md-9 + .framed-content.clearfix + = render "recovery" diff --git a/app/views/two_factor_authentications/show.html.haml b/app/views/two_factor_authentications/show.html.haml new file mode 100644 index 000000000..a68902ac9 --- /dev/null +++ b/app/views/two_factor_authentications/show.html.haml @@ -0,0 +1,15 @@ +- content_for :page_title do + = t("two_factor_auth.title") + +.container-fluid + .row + .col-md-3 + .sidebar + = render "shared/settings_nav" + .col-md-9 + .framed-content.clearfix + + - if @user.otp_required_for_login + = render "deactivate" + - else + = render "activate" diff --git a/config/initializers/devise.rb b/config/initializers/devise.rb index bdd334b26..38a1eafad 100644 --- a/config/initializers/devise.rb +++ b/config/initializers/devise.rb @@ -15,6 +15,11 @@ end # Use this hook to configure devise mailer, warden hooks and so forth. # Many of these configuration options can be set straight in your model. Devise.setup do |config| + config.warden do |manager| + manager.default_strategies(scope: :user).unshift :two_factor_authenticatable + manager.default_strategies(scope: :user).unshift :two_factor_backupable + end + # The secret key used by Devise. Devise uses this key to generate # random tokens. Changing this key will render invalid all existing # confirmation, reset password and unlock tokens in the database. @@ -270,4 +275,8 @@ Devise.setup do |config| # When using omniauth, Devise cannot automatically set Omniauth path, # so you need to do it manually. For the users scope, it would be: # config.omniauth_path_prefix = '/my_engine/users/auth' + + # if a user enables 2fa this would log them in without requiring them + # to enter a token + config.sign_in_after_reset_password = false end diff --git a/config/initializers/filter_parameter_logging.rb b/config/initializers/filter_parameter_logging.rb index 2a915d470..791647716 100644 --- a/config/initializers/filter_parameter_logging.rb +++ b/config/initializers/filter_parameter_logging.rb @@ -4,3 +4,4 @@ # Configure sensitive parameters which will be filtered from the log file. Rails.application.config.filter_parameters += %i[password message text bio] +Rails.application.config.filter_parameters += [:otp_attempt] diff --git a/config/locales/diaspora/en.yml b/config/locales/diaspora/en.yml index 88ee05b20..007c05efc 100644 --- a/config/locales/diaspora/en.yml +++ b/config/locales/diaspora/en.yml @@ -1311,6 +1311,42 @@ en: email_confirmed: "Email %{email} activated" email_not_confirmed: "Email could not be activated. Wrong link?" + two_factor_auth: + title: "Two-factor authentication" + explanation: "Two-factor authentication is a powerful way to ensure you are the only one able to sign in to your account. When signing in, you will enter a 6-digit code along with your password to prove your identity. Be careful though: if you lose your phone and the recovery codes created when you activate this feature, access to your diaspora* account will be blocked forever." + activated: + status: "Two-factor authentication activated" + change_label: "Deactivate two-factor authentication by entering a TOTP token." + change_button: "Deactivate" + deactivated: + status: "Two-factor authentication not activated" + change_label: "Activate two-factor authentication" + change_button: "Activate" + confirm: + title: "Confirm activation" + status: "Two-factor authentication is not fully activated yet, you need to confirm activation with a TOTP token" + scan_title: "Scan the QR code" + scan_explanation: "Please scan the QR code with a TOTP capable app, such as andOTP (Android), FreeOTP (iOS), SailOTP (SailfishOS)." + manual_explanation: "In case you can’t scan the QR code automatically you can manually enter the secret in your app." + manual_explanation_cont: "We are using time-based one-time passwords (TOTP) with six-digit tokens. In case your app prompts you for a time interval and algorithm enter 30 seconds and sha1 respectively.
The spaces are just for readability, please enter the code without them." + input_title: "Confim with TOTP token" + input_explanation: "After scanning or entering the secret, enter the six-digit code you see and confirm the setup." + activate_button: "Confirm and activate" + input_token: + label: "Two-factor token" + placeholder: "six-digit two-factor token" + recovery: + title: "Recovery codes" + reminder: "Alternatively, you can use one of the recovery codes." + explanation: "If you ever lose access to your phone, you can use one of the recovery codes below to regain access to your account. Keep the recovery codes safe. For example, you may print them and store them with other important documents." + explanation_short: "Recovery codes allow you to regain access to your account if you lose your phone. Note that you can use each recovery code only once." + invalidation_notice: "If you've lost your recovery codes, you can regenerate them here. Your old recovery codes will be invalidated." + button: "Generate new recovery codes" + flash: + success_activation: "Successfully activated two-factor authentication" + success_deactivation: "Successfully deactivated two-factor authentication" + error_token: "Token was incorrect or invalid" + will_paginate: previous_label: "« previous" next_label: "next »" diff --git a/config/routes.rb b/config/routes.rb index 7f1e36102..4115bf5ba 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -119,6 +119,12 @@ Rails.application.routes.draw do get "getting_started_completed" => :getting_started_completed end + resource :two_factor_authentication, only: %i[show create destroy] do + get :confirm, action: :confirm_2fa + post :confirm, action: :confirm_and_activate_2fa + get :recovery_codes + end + devise_for :users, controllers: {sessions: :sessions}, skip: :registration devise_scope :user do get "/users/sign_up" => "registrations#new", :as => :new_user_registration diff --git a/db/migrate/20171229175654_add_devise_two_factor_to_users.rb b/db/migrate/20171229175654_add_devise_two_factor_to_users.rb new file mode 100644 index 000000000..f66a4e77e --- /dev/null +++ b/db/migrate/20171229175654_add_devise_two_factor_to_users.rb @@ -0,0 +1,11 @@ +# frozen_string_literal: true + +class AddDeviseTwoFactorToUsers < ActiveRecord::Migration[5.1] + def change + add_column :users, :encrypted_otp_secret, :string + add_column :users, :encrypted_otp_secret_iv, :string + add_column :users, :encrypted_otp_secret_salt, :string + add_column :users, :consumed_timestep, :integer + add_column :users, :otp_required_for_login, :boolean + end +end diff --git a/db/migrate/20180302105225_add_two_factor_backupable_to_user.rb b/db/migrate/20180302105225_add_two_factor_backupable_to_user.rb new file mode 100644 index 000000000..f9b6c0b5e --- /dev/null +++ b/db/migrate/20180302105225_add_two_factor_backupable_to_user.rb @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +class AddTwoFactorBackupableToUser < ActiveRecord::Migration[5.1] + def change + add_column :users, :otp_backup_codes, :text + end +end diff --git a/features/desktop/change_password.feature b/features/desktop/change_password.feature index f37ebe045..7b30014ec 100644 --- a/features/desktop/change_password.feature +++ b/features/desktop/change_password.feature @@ -29,8 +29,7 @@ Feature: Change password When I follow the "Change my password" link from the last sent email When I fill out the password reset form with "supersecret" and "supersecret" And I submit the password reset form - Then I should be on the stream page - And I sign out manually + Then I should be on the new user session page And I sign in manually as "georges_abitbol" with password "supersecret" Then I should be on the stream page diff --git a/features/desktop/two_factor_authentication.feature b/features/desktop/two_factor_authentication.feature new file mode 100644 index 000000000..ae8e2d2ef --- /dev/null +++ b/features/desktop/two_factor_authentication.feature @@ -0,0 +1,90 @@ +# frozen_string_literal: true +@javascript +Feature: Two-factor autentication + + Scenario: Activate 2fa + Given a user with email "alice@test.com" + When I sign in as "alice@test.com" + When I go to the two-factor authentication page + And I press "Activate" + Then I should see "Confirm activation" + When I scan the QR code and fill in a valid TOTP token for "alice@test.com" + And I press "Confirm and activate" + Then I should see "Two-factor authentication activated" + And I should see "Recovery codes" + When I confirm activation + Then I should see "Two-factor authentication activated" + And I should see "Deactivate" + + Scenario: Signing in with 2fa activated and correct token + Given a user with username "alice" and password "secret" + And 2fa is activated for "alice" + When I go to the login page + And I fill in username "alice" and password "secret" + And press "Sign in" + Then I should see "Two-factor authentication" + When I fill in a valid TOTP token for "alice" + And I press "Sign in" + Then I should be on the stream page + + Scenario: Trying to sign in with 2fa activated and incorrect token + Given a user with username "alice" and password "secret" + And 2fa is activated for "alice" + When I go to the login page + And I fill in username "alice" and password "secret" + And press "Sign in" + Then I should see "Two-factor authentication" + When I fill in an invalid TOTP token + And I press "Sign in" + Then I should see "Two-factor authentication" + + Scenario: Signing in with 2fa activated and a recovery code + Given a user with username "alice" and password "secret" + And 2fa is activated for "alice" + When I go to the login page + And I fill in username "alice" and password "secret" + And press "Sign in" + Then I should see "Two-factor authentication" + When I fill in a recovery code from "alice" + And I press "Sign in" + Then I should be on the stream page + + Scenario: Regenerating recovery codes + Given a user with email "alice@test.com" + When I sign in as "alice@test.com" + And 2fa is activated for "alice@test.com" + When I go to the two-factor authentication page + Then I should see "Generate new recovery codes" + When I press the recovery code generate button + Then I should see a list of recovery codes + + Scenario: Deactivating 2fa with correct token + Given a user with email "alice@test.com" + When I sign in as "alice@test.com" + And 2fa is activated for "alice@test.com" + When I go to the two-factor authentication page + Then I should see "Deactivate" + When I fill in a valid TOTP token to deactivate for "alice@test.com" + And I press "Deactivate" + Then I should see "Two-factor authentication not activated" + + Scenario: Deactivating 2fa with recovery token + Given a user with email "alice@test.com" + When I sign in as "alice@test.com" + And 2fa is activated for "alice@test.com" + When I go to the two-factor authentication page + Then I should see "Deactivate" + When I fill in a recovery code to deactivate from "alice@test.com" + And I press "Deactivate" + Then I should see "Two-factor authentication not activated" + + Scenario: Trying to deactivate with incorrect token + Given a user with email "alice@test.com" + When I sign in as "alice@test.com" + And 2fa is activated for "alice@test.com" + When I go to the two-factor authentication page + Then I should see "Deactivate" + When I fill in an invalid TOTP token to deactivate + And I press "Deactivate" + Then I should see "Two-factor authentication activated" + And I should see "Deactivate" diff --git a/features/mobile/change_password.feature b/features/mobile/change_password.feature index f30edb215..f3bcdb445 100644 --- a/features/mobile/change_password.feature +++ b/features/mobile/change_password.feature @@ -31,9 +31,8 @@ Feature: Change password When I follow the "Change my password" link from the last sent email And I fill out the password reset form with "supersecret" and "supersecret" And I submit the password reset form - Then I should be on the stream page - When I sign out - And I go to the login page + Then I should be on the new user session page + When I go to the login page And I sign in manually as "georges_abitbol" with password "supersecret" on the mobile website Then I should be on the stream page diff --git a/features/step_definitions/two_factor_steps.rb b/features/step_definitions/two_factor_steps.rb new file mode 100644 index 000000000..7b5ab2319 --- /dev/null +++ b/features/step_definitions/two_factor_steps.rb @@ -0,0 +1,67 @@ +# frozen_string_literal: true + +When /^I scan the QR code and fill in a valid TOTP token for "([^"]*)"$/ do |email| + @me = find_user email + fill_in "user_code", with: @me.current_otp +end + +When /^I fill in a valid TOTP token for "([^"]*)"$/ do |username| + @me = find_user username + fill_in "user_otp_attempt", with: @me.current_otp +end + +When /^I fill in an invalid TOTP token$/ do + fill_in "user_otp_attempt", with: "c0ffee" +end + +When /^I fill in a valid TOTP token to deactivate for "([^"]*)"$/ do |username| + @me = find_user username + fill_in "two_factor_authentication_code", with: @me.current_otp +end + +When /^I fill in an invalid TOTP token to deactivate$/ do + fill_in "two_factor_authentication_code", with: "c0ffee" +end + +When /^I fill in a recovery code from "([^"]*)"$/ do |username| + @me = find_user username + @codes = @me.generate_otp_backup_codes! + @me.save! + fill_in "user_otp_attempt", with: @codes.first +end + +When /^I fill in a recovery code to deactivate from "([^"]*)"$/ do |username| + @me = find_user username + @codes = @me.generate_otp_backup_codes! + @me.save! + fill_in "two_factor_authentication_code", with: @codes.first +end + +When /^I confirm activation$/ do + find(".btn-primary", match: :first).click +end + +When /^2fa is activated for "([^"]*)"$/ do |username| + @me = find_user username + @me.otp_secret = User.generate_otp_secret(32) + @me.otp_required_for_login = true + @me.save! +end + +When /^I fill in username "([^"]*)" and password "([^"]*)"$/ do |username, password| + fill_in "user_username", with: username + fill_in "user_password", with: password +end + +Then /^I should see a list of recovery codes$/ do + find(".recovery-codes", match: :first) + find(".recovery-codes li samp", match: :first) +end + +When /^I press the recovery code generate button$/ do + find(".btn-default", match: :first).click +end + +def find_user(username) + User.find_by(username: username) || User.find_by(email: username) +end diff --git a/features/support/paths.rb b/features/support/paths.rb index a486ef245..7962fe17d 100644 --- a/features/support/paths.rb +++ b/features/support/paths.rb @@ -40,6 +40,8 @@ module NavigationHelpers edit_user_path when /^forgot password page$/ new_user_password_path + when /^the two-factor authentication page$/ + two_factor_authentication_path when %r{^"(/.*)"} Regexp.last_match(1) else diff --git a/lib/configuration_methods.rb b/lib/configuration_methods.rb index 511e8e2d2..487b70672 100644 --- a/lib/configuration_methods.rb +++ b/lib/configuration_methods.rb @@ -52,25 +52,43 @@ module Configuration def secret_token if heroku? - return ENV['SECRET_TOKEN'] if ENV['SECRET_TOKEN'] + return ENV["SECRET_TOKEN"] if ENV["SECRET_TOKEN"] + warn "FATAL: Running on Heroku with SECRET_TOKEN unset" warn " Run heroku config:add SECRET_TOKEN=#{SecureRandom.hex(40)}" - Process.exit(1) + abort else token_file = File.expand_path( - '../config/initializers/secret_token.rb', + "../config/initializers/secret_token.rb", File.dirname(__FILE__) ) - unless File.exist? token_file - `DISABLE_SPRING=1 bin/rake generate:secret_token` - end + system "DISABLE_SPRING=1 bin/rake generate:secret_token" unless File.exist? token_file require token_file Diaspora::Application.config.secret_key_base end end + def twofa_encryption_key + if heroku? + return ENV["TWOFA_ENCRYPTION_KEY"] if ENV["TWOFA_ENCRYPTION_KEY"] + + warn "FATAL: Running on Heroku with TWOFA_ENCRYPTION_KEY unset" + warn " Run heroku config:add TWOFA_ENCRYPTION_KEY=#{SecureRandom.hex(32)}" + abort + else + key_file = File.expand_path( + "../config/initializers/twofa_encryption_key.rb", + File.dirname(__FILE__) + ) + system "DISABLE_SPRING=1 bin/rake generate:twofa_key" unless File.exist? key_file + require key_file + Diaspora::Application.config.twofa_encryption_key + end + end + def version_string return @version_string unless @version_string.nil? + @version_string = version.number.to_s @version_string = "#{@version_string}-p#{git_revision[0..7]}" if git_available? @version_string diff --git a/lib/tasks/generate_2fa_encription_key.rake b/lib/tasks/generate_2fa_encription_key.rake new file mode 100644 index 000000000..53572f51f --- /dev/null +++ b/lib/tasks/generate_2fa_encription_key.rake @@ -0,0 +1,24 @@ +# frozen_string_literal: true + +namespace :generate do + desc "Generates a key for encrypting 2fa tokens" + task :twofa_key do + path = Rails.root.join("config", "initializers", "twofa_encryption_key.rb") + key = SecureRandom.hex(32) + File.open(path, "w") do |f| + f.write <<~CONF + # frozen_string_literal: true + + # The 2fa encryption key is used to encrypt users' OTP tokens in the database. + + # You can regenerate this key by running `rake generate:twofa_key` + + # If you change this key after a user has set up 2fa + # the users' tokens cannot be recovered + # and they will not be able to log in again! + + Diaspora::Application.config.twofa_encryption_key = "#{key}" + CONF + end + end +end diff --git a/spec/controllers/two_factor_authentications_controller_spec.rb b/spec/controllers/two_factor_authentications_controller_spec.rb new file mode 100644 index 000000000..585061385 --- /dev/null +++ b/spec/controllers/two_factor_authentications_controller_spec.rb @@ -0,0 +1,120 @@ +# frozen_string_literal: true + +describe TwoFactorAuthenticationsController, type: :controller do + before do + @user = FactoryGirl.create :user + sign_in @user + end + + describe "#show" do + it "shows the deactivated state of 2fa" do + get :show + expect(response.body).to match I18n.t("two_factor_auth.title") + expect(response.body).to match I18n.t("two_factor_auth.deactivated.status") + expect(@user).to have_attributes(otp_required_for_login: nil) + end + + it "shows the activated state of 2fa" do + activate_2fa + get :show + expect(response.body).to match I18n.t("two_factor_auth.title") + expect(response.body).to match I18n.t("two_factor_auth.activated.status") + expect(response.body).to match I18n.t("two_factor_auth.input_token.label") + expect(response.body).to match I18n.t("two_factor_auth.recovery.button") + expect(@user).to have_attributes(otp_required_for_login: true) + end + end + + describe "#create" do + it "sets the otp_secret flag" do + post :create, params: {user: {otp_required_for_login: "true"}} + expect(response).to be_redirect + expect(response.location).to match confirm_two_factor_authentication_path + end + end + + describe "#confirm_2fa" do + context "2fa is not yet activated" do + before do + create_otp_token + end + it "shows the QR verification code" do + get :confirm_2fa + expect(response.body).to match I18n.t("two_factor_auth.confirm.title") + expect(response.body).to include("svg") + expect(response.body).to match(/#{@user.otp_secret.scan(/.{4}/).join(" ")}/) + expect(response.body).to match I18n.t("two_factor_auth.input_token.label") + end + end + context "2fa is already activated" do + before do + activate_2fa + end + + it "redirects back" do + get :confirm_2fa + expect(response).to be_redirect + expect(response.location).to match two_factor_authentication_path + end + end + end + + describe "#confirm_and_activate_2fa" do + before do + create_otp_token + end + it "redirects back to confirm when token was wrong" do + post :confirm_and_activate_2fa, params: {user: {code: "not valid token"}} + expect(response.location).to match confirm_two_factor_authentication_path + expect(flash[:alert]).to match I18n.t("two_factor_auth.flash.error_token") + end + it "redirects to #recovery_codes when token was correct" do + post :confirm_and_activate_2fa, params: {user: {code: @user.current_otp}} + expect(response.location).to match recovery_codes_two_factor_authentication_path + expect(flash[:notice]).to match I18n.t("two_factor_auth.flash.success_activation") + end + end + + describe "#recovery_codes" do + before do + activate_2fa + end + it "shows recovery codes page" do + get :recovery_codes + expect(response.body).to match I18n.t("two_factor_auth.recovery.title") + expect(@user).to have_attributes(otp_required_for_login: true) + end + end + + describe "#destroy" do + before do + activate_2fa + end + it "deactivates 2fa if token is correct" do + delete :destroy, params: {two_factor_authentication: {code: @user.current_otp}} + expect(response).to be_redirect + expect(flash[:notice]).to match I18n.t("two_factor_auth.flash.success_deactivation") + end + + it "does nothing if token is wrong" do + delete :destroy, params: {two_factor_authentication: {code: "a wrong code"}} + expect(response).to be_redirect + expect(flash[:alert]).to match I18n.t("two_factor_auth.flash.error_token") + end + end + + def create_otp_token + @user.otp_secret = User.generate_otp_secret(32) + @user.save! + end + + def confirm_activation + @user.otp_required_for_login = true + @user.save! + end + + def activate_2fa + create_otp_token + confirm_activation + end +end diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb index d264493a8..13aa6fae8 100644 --- a/spec/models/user_spec.rb +++ b/spec/models/user_spec.rb @@ -983,6 +983,13 @@ describe User, :type => :model do post_default_public exported_at exported_photos_at + consumed_timestep + encrypted_otp_secret + encrypted_otp_secret_iv + encrypted_otp_secret_salt + otp_backup_codes + otp_required_for_login + otp_secret ) ) end From 607659939d1113c2840e7b36eced7d6f0c6c637f Mon Sep 17 00:00:00 2001 From: Benjamin Neff Date: Sun, 28 Apr 2019 18:38:46 +0200 Subject: [PATCH 07/81] Enable paranoid mode for devise fixes #8001 closes #8003 --- Changelog.md | 1 + app/views/devise/passwords/new.haml | 4 ---- config/initializers/devise.rb | 2 +- config/locales/devise/devise.en.yml | 1 - features/desktop/change_password.feature | 4 ++-- features/mobile/change_password.feature | 4 ++-- spec/controllers/passwords_controller_spec.rb | 2 +- 7 files changed, 7 insertions(+), 11 deletions(-) diff --git a/Changelog.md b/Changelog.md index 3f44db66b..e4ab25b92 100644 --- a/Changelog.md +++ b/Changelog.md @@ -1,6 +1,7 @@ # 0.7.11.0 ## Refactor +* Enable paranoid mode for devise [#8003](https://github.com/diaspora/diaspora/pull/8003) ## Bug fixes diff --git a/app/views/devise/passwords/new.haml b/app/views/devise/passwords/new.haml index 9a5683b63..c62fe9aaa 100644 --- a/app/views/devise/passwords/new.haml +++ b/app/views/devise/passwords/new.haml @@ -9,10 +9,6 @@ = AppConfig.settings.pod_name = form_for(resource, as: resource_name, url: password_path(resource_name), html: {class: "form-horizontal block-form"}, autocomplete: 'off') do |f| - - unless resource.errors.empty? - %legend - %i - = t('devise.passwords.new.no_account') # this is an error message and should not be displayed as a legend %fieldset %label#emailLabel.sr-only{for: "user_email"} = t("devise.passwords.new.email") diff --git a/config/initializers/devise.rb b/config/initializers/devise.rb index 38a1eafad..327cef80e 100644 --- a/config/initializers/devise.rb +++ b/config/initializers/devise.rb @@ -97,7 +97,7 @@ Devise.setup do |config| # It will change confirmation, password recovery and other workflows # to behave the same regardless if the e-mail provided was right or wrong. # Does not affect registerable. - # config.paranoid = true + config.paranoid = true # By default Devise will store the user in session. You can skip storage for # particular strategies by setting this option. diff --git a/config/locales/devise/devise.en.yml b/config/locales/devise/devise.en.yml index 45f35a238..47f78cf2d 100644 --- a/config/locales/devise/devise.en.yml +++ b/config/locales/devise/devise.en.yml @@ -66,7 +66,6 @@ en: confirm_password: Confirm password new: forgot_password: Forgot your password? - no_account: No account with this email exists reset_password: Reset password email: Email address send_password_instructions: Send me reset password instructions diff --git a/features/desktop/change_password.feature b/features/desktop/change_password.feature index 7b30014ec..695193249 100644 --- a/features/desktop/change_password.feature +++ b/features/desktop/change_password.feature @@ -25,7 +25,7 @@ Feature: Change password Given I am on forgot password page When I fill out forgot password form with "forgetful@users.net" And I submit forgot password form - Then I should see "You will receive an email with instructions" + Then I should see "If your email address exists in our database, you will receive a password recovery link at your email address in a few minutes." When I follow the "Change my password" link from the last sent email When I fill out the password reset form with "supersecret" and "supersecret" And I submit the password reset form @@ -49,4 +49,4 @@ Feature: Change password Given I am on forgot password page When I fill out forgot password form with "notanemail" And I submit forgot password form - Then I should see "No account with this email exists" + Then I should see "If your email address exists in our database, you will receive a password recovery link at your email address in a few minutes." diff --git a/features/mobile/change_password.feature b/features/mobile/change_password.feature index f3bcdb445..8f7c0c060 100644 --- a/features/mobile/change_password.feature +++ b/features/mobile/change_password.feature @@ -27,7 +27,7 @@ Feature: Change password And I am on forgot password page When I fill out forgot password form with "forgetful@users.net" And I submit forgot password form - Then I should see "You will receive an email with instructions" + Then I should see "If your email address exists in our database, you will receive a password recovery link at your email address in a few minutes." When I follow the "Change my password" link from the last sent email And I fill out the password reset form with "supersecret" and "supersecret" And I submit the password reset form @@ -52,4 +52,4 @@ Feature: Change password Given I am on forgot password page When I fill out forgot password form with "notanemail" And I submit forgot password form - Then I should see "No account with this email exists" + Then I should see "If your email address exists in our database, you will receive a password recovery link at your email address in a few minutes." diff --git a/spec/controllers/passwords_controller_spec.rb b/spec/controllers/passwords_controller_spec.rb index 870907904..289fcd975 100644 --- a/spec/controllers/passwords_controller_spec.rb +++ b/spec/controllers/passwords_controller_spec.rb @@ -13,7 +13,7 @@ describe Devise::PasswordsController, type: :controller do context "when there is no such user" do it "succeeds" do post :create, params: {user: {email: "foo@example.com"}} - expect(response).to be_success + expect(response).to redirect_to(new_user_session_path) end it "doesn't send email" do From ef137f09f2717b61970555c87c414aa367d9a1c4 Mon Sep 17 00:00:00 2001 From: Dennis Schubert Date: Mon, 29 Apr 2019 23:32:41 +0200 Subject: [PATCH 08/81] Add lock icon to the 2fa OTP field --- app/views/sessions/two_factor.html.haml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/sessions/two_factor.html.haml b/app/views/sessions/two_factor.html.haml index 8e40dc411..f7fd7f592 100644 --- a/app/views/sessions/two_factor.html.haml +++ b/app/views/sessions/two_factor.html.haml @@ -15,7 +15,7 @@ %fieldset %label.sr-only#otp-label{for: "otp_attempt"} = t("two_factor_auth.input_token.label") - + %i.entypo-lock = f.text_field :otp_attempt, type: :text, placeholder: t("two_factor_auth.input_token.placeholder"), From 3c06bb2f4c1b2c8135a6f83359301ac0e117b93e Mon Sep 17 00:00:00 2001 From: Dennis Schubert Date: Mon, 29 Apr 2019 23:34:59 +0200 Subject: [PATCH 09/81] Center

s inside formes used as secondary labels closes #8004 --- app/assets/stylesheets/forms.scss | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/app/assets/stylesheets/forms.scss b/app/assets/stylesheets/forms.scss index 2f0717bba..27be8a013 100644 --- a/app/assets/stylesheets/forms.scss +++ b/app/assets/stylesheets/forms.scss @@ -93,5 +93,10 @@ textarea { } ::placeholder { text-transform: uppercase; } + + p { + margin-top: .5rem; + text-align: center; + } } } From ecda6eccf6b87a499960b8caf9d869b961132637 Mon Sep 17 00:00:00 2001 From: Benjamin Neff Date: Tue, 30 Apr 2019 00:45:44 +0200 Subject: [PATCH 10/81] Remove password reset and sign up link below two factor form They don't make sense on that page, because at this stage, the user already has an account and also has already entered their password. closes #8005 --- app/views/sessions/two_factor.html.haml | 8 -------- 1 file changed, 8 deletions(-) diff --git a/app/views/sessions/two_factor.html.haml b/app/views/sessions/two_factor.html.haml index f7fd7f592..76c29bbd4 100644 --- a/app/views/sessions/two_factor.html.haml +++ b/app/views/sessions/two_factor.html.haml @@ -29,11 +29,3 @@ = f.button t("devise.sessions.new.sign_in"), type: :submit, class: "btn btn-large btn-block btn-primary" - - .text-center - - if display_password_reset_link? - = link_to t("devise.shared.links.forgot_your_password"), - new_password_path(resource_name), id: "forgot_password_link" - %br - - if display_registration_link? - = link_to t("devise.shared.links.sign_up"), new_registration_path(resource_name) From 54fd4846c0607ea1a3de07f65e9a39920cf4ba8a Mon Sep 17 00:00:00 2001 From: Benjamin Neff Date: Tue, 30 Apr 2019 02:36:23 +0200 Subject: [PATCH 11/81] Use password to disable 2FA instead of a token Using token doesn't make much sense when you can generate new tokens right below. closes #8006 --- .../two_factor_authentications_controller.rb | 9 ++----- .../_deactivate.haml | 5 ++-- config/locales/diaspora/en.yml | 2 +- .../desktop/two_factor_authentication.feature | 24 ++++++------------- features/step_definitions/session_steps.rb | 2 +- features/step_definitions/two_factor_steps.rb | 16 ------------- ..._factor_authentications_controller_spec.rb | 11 ++++----- 7 files changed, 18 insertions(+), 51 deletions(-) diff --git a/app/controllers/two_factor_authentications_controller.rb b/app/controllers/two_factor_authentications_controller.rb index e5350b38e..8dafbf3c4 100644 --- a/app/controllers/two_factor_authentications_controller.rb +++ b/app/controllers/two_factor_authentications_controller.rb @@ -37,12 +37,12 @@ class TwoFactorAuthenticationsController < ApplicationController end def destroy - if acceptable_code? + if current_user.valid_password?(params[:two_factor_authentication][:password]) current_user.otp_required_for_login = false current_user.save! flash[:notice] = t("two_factor_auth.flash.success_deactivation") else - flash.now[:alert] = t("two_factor_auth.flash.error_token") + flash[:alert] = t("users.destroy.wrong_password") end redirect_to two_factor_authentication_path end @@ -52,9 +52,4 @@ class TwoFactorAuthenticationsController < ApplicationController def verify_otp_required redirect_to two_factor_authentication_path if current_user.otp_required_for_login? end - - def acceptable_code? - current_user.validate_and_consume_otp!(params[:two_factor_authentication][:code]) || - current_user.invalidate_otp_backup_code!(params[:two_factor_authentication][:code]) - end end diff --git a/app/views/two_factor_authentications/_deactivate.haml b/app/views/two_factor_authentications/_deactivate.haml index c982265de..501f2cb2c 100644 --- a/app/views/two_factor_authentications/_deactivate.haml +++ b/app/views/two_factor_authentications/_deactivate.haml @@ -13,10 +13,9 @@ = form_for "two_factor_authentication", url: two_factor_authentication_path, html: {method: :delete, class: "form-horizontal"} do |f| .form-group - = f.label :code, t("two_factor_auth.input_token.label"), class: "control-label col-sm-6" + = f.label :password, t("users.edit.current_password"), class: "control-label col-sm-6" .col-sm-6 - = f.text_field :code, placeholder: t("two_factor_auth.input_token.placeholder"), class: "form-control" - = t("two_factor_auth.recovery.reminder") + = f.password_field :password, class: "form-control" .clearfix= f.submit t("two_factor_auth.activated.change_button"), class: "btn btn-primary pull-right" %hr diff --git a/config/locales/diaspora/en.yml b/config/locales/diaspora/en.yml index 007c05efc..6e8a8a096 100644 --- a/config/locales/diaspora/en.yml +++ b/config/locales/diaspora/en.yml @@ -1316,7 +1316,7 @@ en: explanation: "Two-factor authentication is a powerful way to ensure you are the only one able to sign in to your account. When signing in, you will enter a 6-digit code along with your password to prove your identity. Be careful though: if you lose your phone and the recovery codes created when you activate this feature, access to your diaspora* account will be blocked forever." activated: status: "Two-factor authentication activated" - change_label: "Deactivate two-factor authentication by entering a TOTP token." + change_label: "Deactivate two-factor authentication by entering your password" change_button: "Deactivate" deactivated: status: "Two-factor authentication not activated" diff --git a/features/desktop/two_factor_authentication.feature b/features/desktop/two_factor_authentication.feature index ae8e2d2ef..1e2e8a61f 100644 --- a/features/desktop/two_factor_authentication.feature +++ b/features/desktop/two_factor_authentication.feature @@ -51,40 +51,30 @@ Feature: Two-factor autentication Scenario: Regenerating recovery codes Given a user with email "alice@test.com" - When I sign in as "alice@test.com" And 2fa is activated for "alice@test.com" + When I sign in as "alice@test.com" When I go to the two-factor authentication page Then I should see "Generate new recovery codes" When I press the recovery code generate button Then I should see a list of recovery codes - Scenario: Deactivating 2fa with correct token + Scenario: Deactivating 2fa with correct password Given a user with email "alice@test.com" - When I sign in as "alice@test.com" And 2fa is activated for "alice@test.com" + When I sign in as "alice@test.com" When I go to the two-factor authentication page Then I should see "Deactivate" - When I fill in a valid TOTP token to deactivate for "alice@test.com" + When I put in my password in "two_factor_authentication_password" And I press "Deactivate" Then I should see "Two-factor authentication not activated" - Scenario: Deactivating 2fa with recovery token + Scenario: Trying to deactivate with incorrect password Given a user with email "alice@test.com" - When I sign in as "alice@test.com" And 2fa is activated for "alice@test.com" + When I sign in as "alice@test.com" When I go to the two-factor authentication page Then I should see "Deactivate" - When I fill in a recovery code to deactivate from "alice@test.com" - And I press "Deactivate" - Then I should see "Two-factor authentication not activated" - - Scenario: Trying to deactivate with incorrect token - Given a user with email "alice@test.com" - When I sign in as "alice@test.com" - And 2fa is activated for "alice@test.com" - When I go to the two-factor authentication page - Then I should see "Deactivate" - When I fill in an invalid TOTP token to deactivate + When I fill in "two_factor_authentication_password" with "incorrect" And I press "Deactivate" Then I should see "Two-factor authentication activated" And I should see "Deactivate" diff --git a/features/step_definitions/session_steps.rb b/features/step_definitions/session_steps.rb index a31de421f..4b08d1498 100644 --- a/features/step_definitions/session_steps.rb +++ b/features/step_definitions/session_steps.rb @@ -31,7 +31,7 @@ When /^I (?:sign|log) in with password "([^"]*)"( on the mobile website)?$/ do | end When /^I put in my password in "([^"]*)"$/ do |field| - step %(I fill in "#{field}" with "#{@me.password}") + step %(I fill in "#{field}" with "#{@me.password}") end When /^I fill out change password section with my password and "([^"]*)" and "([^"]*)"$/ do |new_pass, confirm_pass| diff --git a/features/step_definitions/two_factor_steps.rb b/features/step_definitions/two_factor_steps.rb index 7b5ab2319..40e3cd7de 100644 --- a/features/step_definitions/two_factor_steps.rb +++ b/features/step_definitions/two_factor_steps.rb @@ -14,15 +14,6 @@ When /^I fill in an invalid TOTP token$/ do fill_in "user_otp_attempt", with: "c0ffee" end -When /^I fill in a valid TOTP token to deactivate for "([^"]*)"$/ do |username| - @me = find_user username - fill_in "two_factor_authentication_code", with: @me.current_otp -end - -When /^I fill in an invalid TOTP token to deactivate$/ do - fill_in "two_factor_authentication_code", with: "c0ffee" -end - When /^I fill in a recovery code from "([^"]*)"$/ do |username| @me = find_user username @codes = @me.generate_otp_backup_codes! @@ -30,13 +21,6 @@ When /^I fill in a recovery code from "([^"]*)"$/ do |username| fill_in "user_otp_attempt", with: @codes.first end -When /^I fill in a recovery code to deactivate from "([^"]*)"$/ do |username| - @me = find_user username - @codes = @me.generate_otp_backup_codes! - @me.save! - fill_in "two_factor_authentication_code", with: @codes.first -end - When /^I confirm activation$/ do find(".btn-primary", match: :first).click end diff --git a/spec/controllers/two_factor_authentications_controller_spec.rb b/spec/controllers/two_factor_authentications_controller_spec.rb index 585061385..e17a6e3ca 100644 --- a/spec/controllers/two_factor_authentications_controller_spec.rb +++ b/spec/controllers/two_factor_authentications_controller_spec.rb @@ -19,7 +19,6 @@ describe TwoFactorAuthenticationsController, type: :controller do get :show expect(response.body).to match I18n.t("two_factor_auth.title") expect(response.body).to match I18n.t("two_factor_auth.activated.status") - expect(response.body).to match I18n.t("two_factor_auth.input_token.label") expect(response.body).to match I18n.t("two_factor_auth.recovery.button") expect(@user).to have_attributes(otp_required_for_login: true) end @@ -90,16 +89,16 @@ describe TwoFactorAuthenticationsController, type: :controller do before do activate_2fa end - it "deactivates 2fa if token is correct" do - delete :destroy, params: {two_factor_authentication: {code: @user.current_otp}} + it "deactivates 2fa if password is correct" do + delete :destroy, params: {two_factor_authentication: {password: @user.password}} expect(response).to be_redirect expect(flash[:notice]).to match I18n.t("two_factor_auth.flash.success_deactivation") end - it "does nothing if token is wrong" do - delete :destroy, params: {two_factor_authentication: {code: "a wrong code"}} + it "does nothing if password is wrong" do + delete :destroy, params: {two_factor_authentication: {password: "a wrong password"}} expect(response).to be_redirect - expect(flash[:alert]).to match I18n.t("two_factor_auth.flash.error_token") + expect(flash[:alert]).to match I18n.t("users.destroy.wrong_password") end end From caf822f497f0f4018f0f56e3256655b4e5cec286 Mon Sep 17 00:00:00 2001 From: Dennis Schubert Date: Wed, 1 May 2019 00:14:47 +0200 Subject: [PATCH 12/81] Make sure 2fa settings have the right background color closes #8008 --- app/assets/stylesheets/base.scss | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/assets/stylesheets/base.scss b/app/assets/stylesheets/base.scss index 3de954947..a4c3a5d96 100644 --- a/app/assets/stylesheets/base.scss +++ b/app/assets/stylesheets/base.scss @@ -10,14 +10,15 @@ body { .page-contacts, .page-conversations, .page-notifications, -.page-people.action-show, .page-people.action-contacts, +.page-people.action-show, .page-photos, .page-posts, .page-profiles.action-edit, .page-services.action-index, .page-streams, .page-tags, +.page-two_factor_authentications, .page-user_applications, .page-users.action-edit, .page-users.action-update, From 554faa41164d67dfc3864b6e4cdda6f55a337e18 Mon Sep 17 00:00:00 2001 From: flaburgan Date: Sun, 28 Apr 2019 13:03:14 +0200 Subject: [PATCH 13/81] Reorganize steps a bit --- features/step_definitions/custom_web_steps.rb | 80 +------------------ .../step_definitions/left_navbar_steps.rb | 23 ++++++ features/step_definitions/posts_steps.rb | 72 ++--------------- features/step_definitions/publisher_steps.rb | 74 +++++++++++++++++ features/step_definitions/stream_steps.rb | 55 +++++++++++-- 5 files changed, 152 insertions(+), 152 deletions(-) create mode 100644 features/step_definitions/left_navbar_steps.rb create mode 100644 features/step_definitions/publisher_steps.rb diff --git a/features/step_definitions/custom_web_steps.rb b/features/step_definitions/custom_web_steps.rb index 041afe439..15a84578b 100644 --- a/features/step_definitions/custom_web_steps.rb +++ b/features/step_definitions/custom_web_steps.rb @@ -61,18 +61,6 @@ And /^I submit the form$/ do find("input[type='submit']").click end -And /^I expand the publisher$/ do - click_publisher -end - -And /^I close the publisher$/ do - find("#publisher .md-cancel").click -end - -Then /^the publisher should be expanded$/ do - find("#publisher")["class"].should_not include("closed") -end - Then /^the text area wrapper mobile should be with attachments$/ do find("#publisher-textarea-wrapper")["class"].should include("with_attachments") end @@ -88,48 +76,6 @@ And /^I hover over the "([^"]+)"$/ do |element| find("#{element}", match: :first).hover end -When /^I prepare the deletion of the first post$/ do - find(".stream .stream-element", match: :first).hover - within(find(".stream .stream-element", match: :first)) do - ctrl = find(".control-icons") - ctrl.hover - ctrl.find(".remove_post").click - end -end - -When /^I prepare hiding the first post$/ do - find(".stream .stream-element", match: :first).hover - within(find(".stream .stream-element", match: :first)) do - ctrl = find(".control-icons") - ctrl.hover - ctrl.find(".hide_post").click - end -end - -When /^I click to delete the first post$/ do - accept_alert do - step "I prepare the deletion of the first post" - end - expect(find(".stream")).to have_no_css(".stream-element.loaded.deleting") -end - -When /^I click to hide the first post$/ do - accept_alert do - step "I prepare hiding the first post" - end -end - -When /^I click to delete the first comment$/ do - within("div.comment", match: :first) do - find(".comment_delete", visible: false).click - end -end - -When /^I click to delete the first uploaded photo$/ do - page.execute_script("$('#photodropzone .x').css('display', 'block');") - find("#photodropzone .x", match: :first).trigger "click" -end - And /^I click on selector "([^"]*)"$/ do |selector| find(selector).click end @@ -221,15 +167,7 @@ When /^I resize my window to 800x600$/ do page.driver.resize(800, 600) end -Then 'I should see an image attached to the post' do - step %(I should see a "img" within ".stream-element div.photo-attachments") -end - -Then 'I press the attached image' do - step %(I press the 1st "img" within ".stream-element div.photo-attachments") -end - -And "I wait for the popovers to appear" do +And /^I wait for the popovers to appear$/ do expect(page).to have_selector(".popover", count: 3) end @@ -282,22 +220,6 @@ When /^I focus the "([^"]+)" field$/ do |field| find_field(field).click end -Given /^I have configured a Bitcoin address$/ do - AppConfig.settings.bitcoin_address = "AAAAAA" -end - -Then /^I should see the Bitcoin address$/ do - find("#bitcoin_address")['value'].should == "AAAAAA" -end - -Given /^I have configured a Liberapay username$/ do - AppConfig.settings.liberapay_username = "BBBBBB" -end - -Then /^I should see the Liberapay donate button$/ do - find("#liberapay-button")["href"].should == "https://liberapay.com/BBBBBB/donate" -end - Given /^"([^"]*)" is hidden$/ do |selector| page.should have_selector(selector, visible: false) page.should_not have_selector(selector) diff --git a/features/step_definitions/left_navbar_steps.rb b/features/step_definitions/left_navbar_steps.rb new file mode 100644 index 000000000..4a88bebb1 --- /dev/null +++ b/features/step_definitions/left_navbar_steps.rb @@ -0,0 +1,23 @@ +# frozen_string_literal: true + +When /^(?:|I )click on "([^"]*)" navbar title$/ do |title| + with_scope(".info-bar") do + find("h5", text: title).click + end +end + +Given /^I have configured a Bitcoin address$/ do + AppConfig.settings.bitcoin_address = "AAAAAA" +end + +Then /^I should see the Bitcoin address$/ do + find("#bitcoin_address")['value'].should == "AAAAAA" +end + +Given /^I have configured a Liberapay username$/ do + AppConfig.settings.liberapay_username = "BBBBBB" +end + +Then /^I should see the Liberapay donate button$/ do + find("#liberapay-button")["href"].should == "https://liberapay.com/BBBBBB/donate" +end diff --git a/features/step_definitions/posts_steps.rb b/features/step_definitions/posts_steps.rb index 7f8c93466..da3ee2924 100644 --- a/features/step_definitions/posts_steps.rb +++ b/features/step_definitions/posts_steps.rb @@ -8,36 +8,6 @@ Then /^the post should be expanded$/ do first_post_expanded? end -Then /^I should see an uploaded image within the photo drop zone$/ do - expect(find("#photodropzone img")["src"]).to include("uploads/images") -end - -Then /^I should not see an uploaded image within the photo drop zone$/ do - page.should_not have_css "#photodropzone img" -end - -Then /^I should not see any posts in my stream$/ do - expect(page).not_to have_selector("#paginate .loader") - expect(page).not_to have_selector(".stream-element .media") - expect(page).to have_selector(".stream-element .no-posts-info") -end - -Then /^I should not see any picture in my stream$/ do - expect(page).to have_selector(".photo_area img", count: 0) -end - -Then /^I should see (\d+) pictures in my stream$/ do |count| - expect(page).to have_selector(".photo_area img", count: count) -end - -Then /^I should not be able to submit the publisher$/ do - expect(publisher_submittable?).to be false -end - -Then /^I should see "([^"]*)" in the publisher$/ do |text| - expect(page).to have_field("status_message[text]", with: text) -end - Given /^I have a limited post with text "([^\"]*)" in the aspect "([^"]*)"$/ do |text, aspect_name| @me.post :status_message, text: text, to: @me.aspects.where(name: aspect_name).first.id end @@ -83,10 +53,6 @@ And /^the post with text "([^"]*)" is reshared by "([^"]*)"$/ do |text, email| user.post(:reshare, :root_guid => root.guid, :public => true, :to => user.aspect_ids) end -And /^I submit the publisher$/ do - submit_publisher -end - When /^I click on the first block button/ do find(".stream-element", match: :first).hover find(".block_user").click @@ -100,40 +66,14 @@ When /^I expand the post$/ do expand_first_post end -When /^I click the publisher and post "([^"]*)"$/ do |text| - click_and_post(text) -end - -When /^I post an extremely long status message$/ do - click_and_post("I am a very interesting message " * 64) -end - -When /^I write the status message "([^"]*)"$/ do |text| - write_in_publisher(text) -end - -When /^I insert an extremely long status message$/ do - write_in_publisher("I am a very interesting message " * 64) -end - -When /^I append "([^"]*)" to the publisher$/ do |text| - append_to_publisher(text) -end - -When /^I attach "([^"]*)" to the publisher$/ do |path| - upload_file_with_publisher(path) -end - When /^I open the show page of the "([^"]*)" post$/ do |post_text| visit post_path_by_content(post_text) end -When /^I select "([^"]*)" on the aspect dropdown$/ do |text| - page.execute_script( - "$('#publisher .dropdown .dropdown_list, #publisher .aspect-dropdown .dropdown-menu') - .find('li').each(function(i,el){ - var elem = $(el); - if ('" + text + "' == $.trim(elem.text()) ) { - elem.click(); - }});") +Then /^I should see an image attached to the post$/ do + step %(I should see a "img" within ".stream-element div.photo-attachments") +end + +Then /^I press the attached image$/ do + step %(I press the 1st "img" within ".stream-element div.photo-attachments") end diff --git a/features/step_definitions/publisher_steps.rb b/features/step_definitions/publisher_steps.rb new file mode 100644 index 000000000..8479b1429 --- /dev/null +++ b/features/step_definitions/publisher_steps.rb @@ -0,0 +1,74 @@ +# frozen_string_literal: true + +Then /^I expand the publisher$/ do + click_publisher +end + +And /^I close the publisher$/ do + find("#publisher .md-cancel").click +end + +Then /^the publisher should be expanded$/ do + find("#publisher")["class"].should_not include("closed") +end + +When /^I click to delete the first uploaded photo$/ do + page.execute_script("$('#photodropzone .x').css('display', 'block');") + image_count = all(".publisher_photo img", wait: false).count + find("#photodropzone .x", match: :first).trigger "click" + page.assert_selector(".publisher_photo img", count: image_count - 1) +end + +Then /^I should see an uploaded image within the photo drop zone$/ do + expect(find("#photodropzone img")["src"]).to include("uploads/images") +end + +Then /^I should not see an uploaded image within the photo drop zone$/ do + page.should_not have_css "#photodropzone img" +end + +Then /^I should not be able to submit the publisher$/ do + expect(publisher_submittable?).to be false +end + +Then /^I should see "([^"]*)" in the publisher$/ do |text| + expect(page).to have_field("status_message[text]", with: text) +end + +When /^I write the status message "([^"]*)"$/ do |text| + write_in_publisher(text) +end + +When /^I insert an extremely long status message$/ do + write_in_publisher("I am a very interesting message " * 64) +end + +When /^I append "([^"]*)" to the publisher$/ do |text| + append_to_publisher(text) +end + +When /^I attach "([^"]*)" to the publisher$/ do |path| + upload_file_with_publisher(path) +end + +And /^I submit the publisher$/ do + submit_publisher +end + +When /^I click the publisher and post "([^"]*)"$/ do |text| + click_and_post(text) +end + +When /^I post an extremely long status message$/ do + click_and_post("I am a very interesting message " * 64) +end + +When /^I select "([^"]*)" on the aspect dropdown$/ do |text| + page.execute_script( + "$('#publisher .dropdown .dropdown_list, #publisher .aspect-dropdown .dropdown-menu') + .find('li').each(function(i,el){ + var elem = $(el); + if ('" + text + "' == $.trim(elem.text()) ) { + elem.click(); + }});") +end diff --git a/features/step_definitions/stream_steps.rb b/features/step_definitions/stream_steps.rb index 5d241eaa0..eacc1668e 100644 --- a/features/step_definitions/stream_steps.rb +++ b/features/step_definitions/stream_steps.rb @@ -4,10 +4,6 @@ When /^I (?:like|unlike) the post "([^"]*)" in the stream$/ do |post_text| like_stream_post(post_text) end -Then /^I should see an image in the publisher$/ do - photo_in_publisher.should be_present -end - Then /^"([^"]*)" should be post (\d+)$/ do |post_text, position| stream_element_numbers_content(position).should have_content(post_text) end @@ -24,8 +20,53 @@ Then /^I should have (\d+) nsfw posts$/ do |num_posts| page.should have_css(".nsfw-shield", count: num_posts.to_i) end -When /^(?:|I )click on "([^"]*)" navbar title$/ do |title| - with_scope(".info-bar") do - find("h5", text: title).click +When /^I prepare the deletion of the first post$/ do + find(".stream .stream-element", match: :first).hover + within(find(".stream .stream-element", match: :first)) do + ctrl = find(".control-icons") + ctrl.hover + ctrl.find(".remove_post").click end end + +When /^I prepare hiding the first post$/ do + find(".stream .stream-element", match: :first).hover + within(find(".stream .stream-element", match: :first)) do + ctrl = find(".control-icons") + ctrl.hover + ctrl.find(".hide_post").click + end +end + +When /^I click to delete the first post$/ do + accept_alert do + step "I prepare the deletion of the first post" + end + expect(find(".stream")).to have_no_css(".stream-element.loaded.deleting") +end + +When /^I click to hide the first post$/ do + accept_alert do + step "I prepare hiding the first post" + end +end + +When /^I click to delete the first comment$/ do + within("div.comment", match: :first) do + find(".comment_delete", visible: false).click + end +end + +Then /^I should not see any posts in my stream$/ do + expect(page).not_to have_selector("#paginate .loader") + expect(page).not_to have_selector(".stream-element .media") + expect(page).to have_selector(".stream-element .no-posts-info") +end + +Then /^I should not see any picture in my stream$/ do + expect(page).to have_selector(".photo_area img", count: 0) +end + +Then /^I should see (\d+) pictures in my stream$/ do |count| + expect(page).to have_selector(".photo_area img", count: count) +end From 83a9877def158b282a9afe0d424bc81329e2b1c5 Mon Sep 17 00:00:00 2001 From: flaburgan Date: Sun, 28 Apr 2019 15:02:28 +0200 Subject: [PATCH 14/81] Improve likes steps closes #8002 --- Changelog.md | 2 +- features/desktop/likes.feature | 13 +++++---- .../step_definitions/left_navbar_steps.rb | 2 +- features/step_definitions/publisher_steps.rb | 3 +- features/step_definitions/stream_steps.rb | 29 +++++++++++++++++++ 5 files changed, 41 insertions(+), 8 deletions(-) diff --git a/Changelog.md b/Changelog.md index e4ab25b92..e22291293 100644 --- a/Changelog.md +++ b/Changelog.md @@ -2,7 +2,7 @@ ## Refactor * Enable paranoid mode for devise [#8003](https://github.com/diaspora/diaspora/pull/8003) - +* Refactor likes cucumber test [#8002](https://github.com/diaspora/diaspora/pull/8002) ## Bug fixes ## Features diff --git a/features/desktop/likes.feature b/features/desktop/likes.feature index 73227004d..02bd395e8 100644 --- a/features/desktop/likes.feature +++ b/features/desktop/likes.feature @@ -16,13 +16,14 @@ Feature: Liking posts Scenario: Liking and unliking a post from the stream Then I should not have activated notifications for the post When I like the post "I like unicorns" in the stream - Then I should see "Unlike" within ".stream-element .feedback" - And I should see a ".likes .media" within "#main-stream .stream-element" + Then the post "I like unicorns" should have the "Unlike" action available + And the post "I like unicorns" should have 1 like + And the post "I like unicorns" should have a like from "Alice Smith" And I should have activated notifications for the post When I unlike the post "I like unicorns" in the stream - Then I should see "Like" within ".stream-element .feedback" - And I should not see a ".likes .media" within "#main-stream .stream-element" + Then the post "I like unicorns" should have the "Like" action available + And the post "I like unicorns" shouldn't have any likes Scenario: Liking and unliking a post from a single post page @@ -39,4 +40,6 @@ Feature: Liking posts When I like the post "I like unicorns" in the stream And I sign out And I sign in as "bob@bob.bob" - Then I should see a ".likes" within "#main-stream .stream-element" + Then the post "I like unicorns" should have the "Like" action available + And the post "I like unicorns" should have 1 like + And the post "I like unicorns" should have a like from "Alice Smith" diff --git a/features/step_definitions/left_navbar_steps.rb b/features/step_definitions/left_navbar_steps.rb index 4a88bebb1..f84f3526a 100644 --- a/features/step_definitions/left_navbar_steps.rb +++ b/features/step_definitions/left_navbar_steps.rb @@ -11,7 +11,7 @@ Given /^I have configured a Bitcoin address$/ do end Then /^I should see the Bitcoin address$/ do - find("#bitcoin_address")['value'].should == "AAAAAA" + find("#bitcoin_address")["value"].should == "AAAAAA" end Given /^I have configured a Liberapay username$/ do diff --git a/features/step_definitions/publisher_steps.rb b/features/step_definitions/publisher_steps.rb index 8479b1429..f0d6a8c46 100644 --- a/features/step_definitions/publisher_steps.rb +++ b/features/step_definitions/publisher_steps.rb @@ -70,5 +70,6 @@ When /^I select "([^"]*)" on the aspect dropdown$/ do |text| var elem = $(el); if ('" + text + "' == $.trim(elem.text()) ) { elem.click(); - }});") + }});" + ) end diff --git a/features/step_definitions/stream_steps.rb b/features/step_definitions/stream_steps.rb index eacc1668e..853df81ca 100644 --- a/features/step_definitions/stream_steps.rb +++ b/features/step_definitions/stream_steps.rb @@ -4,6 +4,35 @@ When /^I (?:like|unlike) the post "([^"]*)" in the stream$/ do |post_text| like_stream_post(post_text) end +Then /^the post "([^"]*)" should have the "([^"]*)" action available$/ do |post_text, action_text| + within_post(post_text) do + find(".feedback").should have_content(action_text) + end +end + +Then /^the post "([^"]*)" shouldn't have any likes$/ do |post_text| + within_post(post_text) do + find(".likes").should have_no_css(".avatar", visible: true) + end +end + +Then /^the post "([^"]*)" should have (\d+) like(?:s|)$/ do |post_text, likes_number| + within_post(post_text) do + find(".expand-likes").should have_content(likes_number) + end +end + +Then /^the post "([^"]*)" should have a like from "([^"]*)"$/ do |post_text, username| + within_post(post_text) do + find(".expand-likes").click + find(".likes .avatar")["data-original-title"].should have_content(username) + end +end + +Then /^I should see an image in the publisher$/ do + photo_in_publisher.should be_present +end + Then /^"([^"]*)" should be post (\d+)$/ do |post_text, position| stream_element_numbers_content(position).should have_content(post_text) end From 39b86ed486be7e9bc4b906988b54111aa0e5d971 Mon Sep 17 00:00:00 2001 From: Dennis Schubert Date: Sun, 5 May 2019 04:21:37 +0200 Subject: [PATCH 15/81] Remvoe unused Changelog headline [ci skip] --- Changelog.md | 1 - 1 file changed, 1 deletion(-) diff --git a/Changelog.md b/Changelog.md index e22291293..2dbd4123d 100644 --- a/Changelog.md +++ b/Changelog.md @@ -3,7 +3,6 @@ ## Refactor * Enable paranoid mode for devise [#8003](https://github.com/diaspora/diaspora/pull/8003) * Refactor likes cucumber test [#8002](https://github.com/diaspora/diaspora/pull/8002) -## Bug fixes ## Features * Add a manifest.json file as a first step to make diaspora\* a Progressive Web App [#7998](https://github.com/diaspora/diaspora/pull/7998) From 3704be8becff1e33d9fb4915b17d2586883f8d8b Mon Sep 17 00:00:00 2001 From: Dennis Schubert Date: Sun, 5 May 2019 04:22:10 +0200 Subject: [PATCH 16/81] Prepare 0.7.12.0 cycle [ci skip] --- Changelog.md | 8 ++++++++ config/defaults.yml | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/Changelog.md b/Changelog.md index 2dbd4123d..37091fb49 100644 --- a/Changelog.md +++ b/Changelog.md @@ -1,3 +1,11 @@ +# 0.7.12.0 + +## Refactor + +## Bug fixes + +## Features + # 0.7.11.0 ## Refactor diff --git a/config/defaults.yml b/config/defaults.yml index c04665f69..d866ccec6 100644 --- a/config/defaults.yml +++ b/config/defaults.yml @@ -4,7 +4,7 @@ defaults: version: - number: "0.7.10.99" # Do not touch unless doing a release, do not backport the version number that's in master + number: "0.7.11.99" # Do not touch unless doing a release, do not backport the version number that's in master heroku: false environment: url: "http://localhost:3000/" From 2d23a2601e744719f0696db209275cd85fdbb140 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonne=20Ha=C3=9F?= Date: Thu, 9 May 2019 16:37:55 +0200 Subject: [PATCH 17/81] fix old photos without a remote_photo_path or remote_photo_name closes #8012 --- Changelog.md | 3 +++ .../20190509125709_fix_missing_remote_photo_fields.rb | 11 +++++++++++ 2 files changed, 14 insertions(+) create mode 100644 db/migrate/20190509125709_fix_missing_remote_photo_fields.rb diff --git a/Changelog.md b/Changelog.md index 2dbd4123d..90b3bff77 100644 --- a/Changelog.md +++ b/Changelog.md @@ -4,6 +4,9 @@ * Enable paranoid mode for devise [#8003](https://github.com/diaspora/diaspora/pull/8003) * Refactor likes cucumber test [#8002](https://github.com/diaspora/diaspora/pull/8002) +## Bug fixes +* Fix old photos without remote url for export [#8012](https://github.com/diaspora/diaspora/pull/8012) + ## Features * Add a manifest.json file as a first step to make diaspora\* a Progressive Web App [#7998](https://github.com/diaspora/diaspora/pull/7998) * Allow `web+diaspora://` links to link to a profile with only the diaspora ID [#8000](https://github.com/diaspora/diaspora/pull/8000) diff --git a/db/migrate/20190509125709_fix_missing_remote_photo_fields.rb b/db/migrate/20190509125709_fix_missing_remote_photo_fields.rb new file mode 100644 index 000000000..8d6462643 --- /dev/null +++ b/db/migrate/20190509125709_fix_missing_remote_photo_fields.rb @@ -0,0 +1,11 @@ +# frozen_string_literal: true + +class FixMissingRemotePhotoFields < ActiveRecord::Migration[5.1] + def up + Photo.where(remote_photo_path: nil).each do |photo| + photo.write_attribute(:unprocessed_image, photo.read_attribute(:processed_image)) + photo.update_remote_path + photo.save! + end + end +end From 165b8f4f6e4e0a0c7a4577c1f3a9ffcb3d8a7a09 Mon Sep 17 00:00:00 2001 From: Benjamin Neff Date: Sat, 11 May 2019 19:06:42 +0200 Subject: [PATCH 18/81] Don't encrypt the OTP secret It doesn't add any security to have this encrypted, but it adds complexity for podmins, because they need to backup the key. closes #8014 --- .gitignore | 1 - app/models/user.rb | 3 +- ...29175654_add_devise_two_factor_to_users.rb | 12 +++-- ...0190511150503_decrypt_two_factor_secret.rb | 52 +++++++++++++++++++ lib/configuration_methods.rb | 18 ------- lib/tasks/generate_2fa_encription_key.rake | 24 --------- spec/models/user_spec.rb | 4 +- 7 files changed, 61 insertions(+), 53 deletions(-) create mode 100644 db/migrate/20190511150503_decrypt_two_factor_secret.rb delete mode 100644 lib/tasks/generate_2fa_encription_key.rake diff --git a/.gitignore b/.gitignore index 48f5537ad..65d3c2649 100644 --- a/.gitignore +++ b/.gitignore @@ -11,7 +11,6 @@ app/assets/images/custom/ # Configuration files config/diaspora.yml config/initializers/secret_token.rb -config/initializers/twofa_encryption_key.rb .bundle vendor/bundle/ vendor/cache/ diff --git a/app/models/user.rb b/app/models/user.rb index 0f9336eca..8d30efa97 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -19,11 +19,10 @@ class User < ApplicationRecord scope :halfyear_actives, ->(time = Time.now) { logged_in_since(time - 6.month) } scope :active, -> { joins(:person).where(people: {closed_account: false}) } - attribute :otp_secret + attr_encrypted :otp_secret, if: false, prefix: "plain_" devise :two_factor_authenticatable, :two_factor_backupable, - otp_secret_encryption_key: AppConfig.twofa_encryption_key, otp_backup_code_length: 16, otp_number_of_backup_codes: 10 diff --git a/db/migrate/20171229175654_add_devise_two_factor_to_users.rb b/db/migrate/20171229175654_add_devise_two_factor_to_users.rb index f66a4e77e..47280dd20 100644 --- a/db/migrate/20171229175654_add_devise_two_factor_to_users.rb +++ b/db/migrate/20171229175654_add_devise_two_factor_to_users.rb @@ -2,10 +2,12 @@ class AddDeviseTwoFactorToUsers < ActiveRecord::Migration[5.1] def change - add_column :users, :encrypted_otp_secret, :string - add_column :users, :encrypted_otp_secret_iv, :string - add_column :users, :encrypted_otp_secret_salt, :string - add_column :users, :consumed_timestep, :integer - add_column :users, :otp_required_for_login, :boolean + change_table :users, bulk: true do |t| + t.string :encrypted_otp_secret + t.string :encrypted_otp_secret_iv + t.string :encrypted_otp_secret_salt + t.integer :consumed_timestep + t.boolean :otp_required_for_login + end end end diff --git a/db/migrate/20190511150503_decrypt_two_factor_secret.rb b/db/migrate/20190511150503_decrypt_two_factor_secret.rb new file mode 100644 index 000000000..b1d21f5f6 --- /dev/null +++ b/db/migrate/20190511150503_decrypt_two_factor_secret.rb @@ -0,0 +1,52 @@ +# frozen_string_literal: true + +class DecryptTwoFactorSecret < ActiveRecord::Migration[5.1] + class User < ApplicationRecord + end + + def up + add_column :users, :plain_otp_secret, :string + + key = twofa_encryption_key + decrypt_existing_secrets(key) if key + + change_table :users, bulk: true do |t| + t.remove :encrypted_otp_secret + t.remove :encrypted_otp_secret_iv + t.remove :encrypted_otp_secret_salt + end + end + + def down + raise ActiveRecord::IrreversibleMigration + end + + private + + def twofa_encryption_key + if AppConfig.heroku? + ENV["TWOFA_ENCRYPTION_KEY"] + else + key_file = File.expand_path("../../config/initializers/twofa_encryption_key.rb", File.dirname(__FILE__)) + + if File.exist? key_file + require key_file + File.delete(key_file) + + return Diaspora::Application.config.twofa_encryption_key + end + end + end + + def decrypt_existing_secrets(key) + User.where.not(encrypted_otp_secret: nil).each do |user| + user.plain_otp_secret = Encryptor.decrypt( + value: user.encrypted_otp_secret.unpack("m").first, + key: key, + iv: user.encrypted_otp_secret_iv.unpack("m").first, + salt: user.encrypted_otp_secret_salt.slice(1..-1).unpack("m").first + ) + user.save! + end + end +end diff --git a/lib/configuration_methods.rb b/lib/configuration_methods.rb index 487b70672..58a050f8c 100644 --- a/lib/configuration_methods.rb +++ b/lib/configuration_methods.rb @@ -68,24 +68,6 @@ module Configuration end end - def twofa_encryption_key - if heroku? - return ENV["TWOFA_ENCRYPTION_KEY"] if ENV["TWOFA_ENCRYPTION_KEY"] - - warn "FATAL: Running on Heroku with TWOFA_ENCRYPTION_KEY unset" - warn " Run heroku config:add TWOFA_ENCRYPTION_KEY=#{SecureRandom.hex(32)}" - abort - else - key_file = File.expand_path( - "../config/initializers/twofa_encryption_key.rb", - File.dirname(__FILE__) - ) - system "DISABLE_SPRING=1 bin/rake generate:twofa_key" unless File.exist? key_file - require key_file - Diaspora::Application.config.twofa_encryption_key - end - end - def version_string return @version_string unless @version_string.nil? diff --git a/lib/tasks/generate_2fa_encription_key.rake b/lib/tasks/generate_2fa_encription_key.rake deleted file mode 100644 index 53572f51f..000000000 --- a/lib/tasks/generate_2fa_encription_key.rake +++ /dev/null @@ -1,24 +0,0 @@ -# frozen_string_literal: true - -namespace :generate do - desc "Generates a key for encrypting 2fa tokens" - task :twofa_key do - path = Rails.root.join("config", "initializers", "twofa_encryption_key.rb") - key = SecureRandom.hex(32) - File.open(path, "w") do |f| - f.write <<~CONF - # frozen_string_literal: true - - # The 2fa encryption key is used to encrypt users' OTP tokens in the database. - - # You can regenerate this key by running `rake generate:twofa_key` - - # If you change this key after a user has set up 2fa - # the users' tokens cannot be recovered - # and they will not be able to log in again! - - Diaspora::Application.config.twofa_encryption_key = "#{key}" - CONF - end - end -end diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb index 13aa6fae8..560432927 100644 --- a/spec/models/user_spec.rb +++ b/spec/models/user_spec.rb @@ -984,9 +984,7 @@ describe User, :type => :model do exported_at exported_photos_at consumed_timestep - encrypted_otp_secret - encrypted_otp_secret_iv - encrypted_otp_secret_salt + plain_otp_secret otp_backup_codes otp_required_for_login otp_secret From e04ddd0bccba2b54912af59ae27b88653f9d3ad0 Mon Sep 17 00:00:00 2001 From: David Moseler Date: Sun, 20 Jan 2019 22:42:47 -0200 Subject: [PATCH 19/81] Clarify pod is part of diaspora in splash screen --- app/assets/stylesheets/home.scss | 10 ++++++++++ app/views/home/default.haml | 2 ++ config/locales/diaspora/en.yml | 1 + 3 files changed, 13 insertions(+) diff --git a/app/assets/stylesheets/home.scss b/app/assets/stylesheets/home.scss index 1dd6555ad..71795fa70 100644 --- a/app/assets/stylesheets/home.scss +++ b/app/assets/stylesheets/home.scss @@ -42,6 +42,16 @@ padding: 15px; } + .clarification-header { + background-color: $grey; + border: 1px solid $border-grey; + display: inline-block; + margin-bottom: 10px; + margin-top: 10px; + padding: 5px; + text-align: center; + } + .login-form { fieldset { background: none; } diff --git a/app/views/home/default.haml b/app/views/home/default.haml index 2a7a789c7..177b4d048 100644 --- a/app/views/home/default.haml +++ b/app/views/home/default.haml @@ -4,6 +4,8 @@ .row .col-md-8.text-center %h1= t("home.default.headline", pod_name: pod_name) + - if pod_name != "diaspora*" + %h2.clarification-header= t("home.default.clarify") %h2= t("home.default.byline") .col-md-4.login-form = render partial: "sessions/form", locals: {mobile: false, resource: User.new, resource_name: :user} diff --git a/config/locales/diaspora/en.yml b/config/locales/diaspora/en.yml index 6e8a8a096..101925fcd 100644 --- a/config/locales/diaspora/en.yml +++ b/config/locales/diaspora/en.yml @@ -553,6 +553,7 @@ en: home: default: headline: "Welcome to %{pod_name}" + clarify: "Part of the diaspora* federated network" byline: "The online social world where you are in control" be_who_you_want_to_be: "Be who you want to be" be_who_you_want_to_be_info: "A lot of networks insist that you use your real identity. Not diaspora*. Here you can choose who you want to be, and share as much or as little about yourself as you want. It really is up to you how you want to interact with other people." From 6826e89a95f5ab6e3e6c0bffce0d68a1daf6594a Mon Sep 17 00:00:00 2001 From: flaburgan Date: Wed, 8 May 2019 22:42:08 +0200 Subject: [PATCH 20/81] Change design, add a link to the official website fixes #7910 closes #7966 --- Changelog.md | 1 + app/assets/stylesheets/home.scss | 14 ++++++-------- app/views/home/default.haml | 4 +++- config/locales/diaspora/en.yml | 3 ++- 4 files changed, 12 insertions(+), 10 deletions(-) diff --git a/Changelog.md b/Changelog.md index 30e39af59..b0818162a 100644 --- a/Changelog.md +++ b/Changelog.md @@ -5,6 +5,7 @@ ## Bug fixes ## Features +* Add line mentioning diaspora\* on the splash page [#7966](https://github.com/diaspora/diaspora/pull/7966) # 0.7.11.0 diff --git a/app/assets/stylesheets/home.scss b/app/assets/stylesheets/home.scss index 71795fa70..147f4386a 100644 --- a/app/assets/stylesheets/home.scss +++ b/app/assets/stylesheets/home.scss @@ -42,14 +42,12 @@ padding: 15px; } - .clarification-header { - background-color: $grey; - border: 1px solid $border-grey; - display: inline-block; - margin-bottom: 10px; - margin-top: 10px; - padding: 5px; - text-align: center; + .part-of-diaspora { + font-style: italic; + + a { + color: $white; + } } .login-form { diff --git a/app/views/home/default.haml b/app/views/home/default.haml index 177b4d048..bf948f68a 100644 --- a/app/views/home/default.haml +++ b/app/views/home/default.haml @@ -5,7 +5,9 @@ .col-md-8.text-center %h1= t("home.default.headline", pod_name: pod_name) - if pod_name != "diaspora*" - %h2.clarification-header= t("home.default.clarify") + %h2.part-of-diaspora + != t("home.default.part_of_diaspora", + diaspora_site_link: link_to(t("home.default.diaspora_site_link"), "https://diasporafoundation.org/")) %h2= t("home.default.byline") .col-md-4.login-form = render partial: "sessions/form", locals: {mobile: false, resource: User.new, resource_name: :user} diff --git a/config/locales/diaspora/en.yml b/config/locales/diaspora/en.yml index 101925fcd..f6434e66e 100644 --- a/config/locales/diaspora/en.yml +++ b/config/locales/diaspora/en.yml @@ -553,7 +553,8 @@ en: home: default: headline: "Welcome to %{pod_name}" - clarify: "Part of the diaspora* federated network" + part_of_diaspora: "Part of the %{diaspora_site_link}" + diaspora_site_link: "diaspora* federated network" byline: "The online social world where you are in control" be_who_you_want_to_be: "Be who you want to be" be_who_you_want_to_be_info: "A lot of networks insist that you use your real identity. Not diaspora*. Here you can choose who you want to be, and share as much or as little about yourself as you want. It really is up to you how you want to interact with other people." From 469983a6239da6f68d5d8160176bab25ffb38460 Mon Sep 17 00:00:00 2001 From: alebor-5 Date: Mon, 15 Oct 2018 18:04:23 +0200 Subject: [PATCH 21/81] Improve communication about signing up on closed pods fixes #7767 --- app/assets/stylesheets/help.scss | 23 +++++++++++++++++ app/controllers/registrations_controller.rb | 8 ++++-- app/views/help/registration_closed.html.haml | 25 +++++++++++++++++++ .../help/registration_closed.mobile.haml | 11 ++++++++ app/views/layouts/_header_not_connected.haml | 2 +- config/locales/diaspora/en.yml | 4 +++ config/routes.rb | 1 + .../registrations_controller_spec.rb | 10 +++----- 8 files changed, 75 insertions(+), 9 deletions(-) create mode 100644 app/views/help/registration_closed.html.haml create mode 100644 app/views/help/registration_closed.mobile.haml diff --git a/app/assets/stylesheets/help.scss b/app/assets/stylesheets/help.scss index c19e09439..3dfc335af 100644 --- a/app/assets/stylesheets/help.scss +++ b/app/assets/stylesheets/help.scss @@ -106,3 +106,26 @@ ul#help_nav { } } } + +.ball{ + background: image-url('branding/ball.png') no-repeat; + background-size: contain; + height: 633px; + max-width: 100%; +} + +.v-center { + display: table; + height: 633px; + } + +.content { + display: table-cell; + vertical-align: middle; + + h2 { + font-size: 35px; + margin: 12px; + text-align: left; + } +} diff --git a/app/controllers/registrations_controller.rb b/app/controllers/registrations_controller.rb index 1224160fd..142563314 100644 --- a/app/controllers/registrations_controller.rb +++ b/app/controllers/registrations_controller.rb @@ -33,8 +33,12 @@ class RegistrationsController < Devise::RegistrationsController def check_registrations_open_or_valid_invite! return true if AppConfig.settings.enable_registrations? || invite.try(:can_be_used?) - flash[:error] = params[:invite] ? t("registrations.invalid_invite") : t("registrations.closed") - redirect_to new_user_session_path + if params[:invite] + flash[:error] = t("registrations.invalid_invite") + redirect_to new_user_session_path + else + redirect_to registration_closed_path + end end def invite diff --git a/app/views/help/registration_closed.html.haml b/app/views/help/registration_closed.html.haml new file mode 100644 index 000000000..ea794a5b2 --- /dev/null +++ b/app/views/help/registration_closed.html.haml @@ -0,0 +1,25 @@ +- content_for :page_title do + = AppConfig.settings.pod_name + " - " + t("devise.shared.links.sign_up_closed") + +.container + .row + .col-md-10.offset1 + .col-md-7.hidden-phone + %h1.ball + .col-md-5.v-center + .content + %h2 + = t("devise.shared.links.sign_up_closed") + + != t("help.closed_pod", + wiki: link_to("another pod", "https://diasporafoundation.org/getting_started/sign_up")) + + != t("help.find_pods", + poduptime: link_to("Poduptime", "https://podupti.me/")) + + != t("help.other_questions", + wiki: link_to("Wiki", "https://wiki.diasporafoundation.org/Choosing_a_pod")) + + + + diff --git a/app/views/help/registration_closed.mobile.haml b/app/views/help/registration_closed.mobile.haml new file mode 100644 index 000000000..f3822cc51 --- /dev/null +++ b/app/views/help/registration_closed.mobile.haml @@ -0,0 +1,11 @@ +%h2 + = t("devise.shared.links.sign_up_closed") + +!= t("help.closed_pod", + wiki: link_to("another pod", "https://diasporafoundation.org/getting_started/sign_up")) + +!= t("help.find_pods", + poduptime: link_to("Poduptime", "https://podupti.me/")) + +!= t("help.other_questions", + wiki: link_to("Wiki", "https://wiki.diasporafoundation.org/Choosing_a_pod")) diff --git a/app/views/layouts/_header_not_connected.haml b/app/views/layouts/_header_not_connected.haml index c8760e3cb..4ed08291c 100644 --- a/app/views/layouts/_header_not_connected.haml +++ b/app/views/layouts/_header_not_connected.haml @@ -1,5 +1,5 @@ %ul.nav.navbar-nav.navbar-right - - if AppConfig.settings.enable_registrations? && !current_page?(controller: "/registrations", action: :new) + - unless current_page?(controller: "/registrations", action: :new) %li= link_to t("devise.shared.links.sign_up"), new_user_registration_path, class: "login" - unless current_page?(controller: "/sessions", action: :new) %li= link_to t("devise.shared.links.sign_in"), new_user_session_path, class: "login" diff --git a/config/locales/diaspora/en.yml b/config/locales/diaspora/en.yml index f6434e66e..a3bb4eddf 100644 --- a/config/locales/diaspora/en.yml +++ b/config/locales/diaspora/en.yml @@ -346,6 +346,10 @@ en: tutorials: "tutorials" tutorial: "tutorial" irc: "IRC" + closed_pod: "This pod is currently closed to new registrations. However, you can still join the diaspora* network by registering on %{wiki}. Because all pods are interconnected, you will have access to the same content there." + find_pods: "You can find pods at %{poduptime}." + other_questions: "If you have any other questions regarding choosing a pod, checkout our %{wiki}." + choose_another: "Please, choose another pod" wiki: "wiki" faq: "FAQ" markdown: "Markdown" diff --git a/config/routes.rb b/config/routes.rb index 4115bf5ba..66b3ecf92 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -205,6 +205,7 @@ Rails.application.routes.draw do # Help get 'help' => 'help#faq', :as => 'help' + get "help/registration_closed" => "help#registration_closed", :as => "registration_closed" get 'help/:topic' => 'help#faq' #Protocol Url diff --git a/spec/controllers/registrations_controller_spec.rb b/spec/controllers/registrations_controller_spec.rb index c7063e728..c1aa7744c 100644 --- a/spec/controllers/registrations_controller_spec.rb +++ b/spec/controllers/registrations_controller_spec.rb @@ -25,16 +25,14 @@ describe RegistrationsController, type: :controller do AppConfig.settings.enable_registrations = false end - it "redirects #new to the login page" do + it "redirects #new to the registration closed page" do get :new - expect(flash[:error]).to eq(I18n.t("registrations.closed")) - expect(response).to redirect_to new_user_session_path + expect(response).to redirect_to registration_closed_path end - it "redirects #create to the login page" do + it "redirects #create to the registration closed page" do post :create, params: valid_params - expect(flash[:error]).to eq(I18n.t("registrations.closed")) - expect(response).to redirect_to new_user_session_path + expect(response).to redirect_to registration_closed_path end it "does not redirect if there is a valid invite token" do From 4feab5219e7c9943a98512001e9080dc2937bbc3 Mon Sep 17 00:00:00 2001 From: flaburgan Date: Thu, 2 May 2019 17:27:27 +0200 Subject: [PATCH 22/81] Use a partial to share code between mobile and desktop, add the new route to the RegistrationController, drop flash message for closed registrations --- app/assets/stylesheets/help.scss | 23 ----------------- app/assets/stylesheets/registration.scss | 16 +++++++----- app/controllers/registrations_controller.rb | 16 ++++++------ app/views/help/registration_closed.html.haml | 25 ------------------- app/views/registrations/_form.haml | 2 +- .../_registrations_closed.haml} | 0 app/views/registrations/new.haml | 15 ++++++----- .../registrations/registrations_closed.haml | 8 ++++++ .../registrations_closed.mobile.haml | 10 ++++++++ config/locales/diaspora/en.yml | 4 +-- config/routes.rb | 2 +- ...gns_up.feature => getting_started.feature} | 6 ++--- features/desktop/registrations.feature | 24 ++++++++++++++++++ ...signs_up.feature => registrations.feature} | 3 +-- features/step_definitions/session_steps.rb | 8 ++++++ features/step_definitions/user_steps.rb | 8 ------ .../registrations_controller_spec.rb | 15 +++++------ 17 files changed, 91 insertions(+), 94 deletions(-) delete mode 100644 app/views/help/registration_closed.html.haml rename app/views/{help/registration_closed.mobile.haml => registrations/_registrations_closed.haml} (100%) create mode 100644 app/views/registrations/registrations_closed.haml create mode 100644 app/views/registrations/registrations_closed.mobile.haml rename features/desktop/{signs_up.feature => getting_started.feature} (96%) create mode 100644 features/desktop/registrations.feature rename features/mobile/{signs_up.feature => registrations.feature} (93%) diff --git a/app/assets/stylesheets/help.scss b/app/assets/stylesheets/help.scss index 3dfc335af..c19e09439 100644 --- a/app/assets/stylesheets/help.scss +++ b/app/assets/stylesheets/help.scss @@ -106,26 +106,3 @@ ul#help_nav { } } } - -.ball{ - background: image-url('branding/ball.png') no-repeat; - background-size: contain; - height: 633px; - max-width: 100%; -} - -.v-center { - display: table; - height: 633px; - } - -.content { - display: table-cell; - vertical-align: middle; - - h2 { - font-size: 35px; - margin: 12px; - text-align: left; - } -} diff --git a/app/assets/stylesheets/registration.scss b/app/assets/stylesheets/registration.scss index 123161d6a..5fb2a2bc6 100644 --- a/app/assets/stylesheets/registration.scss +++ b/app/assets/stylesheets/registration.scss @@ -1,5 +1,4 @@ -.page-registrations.action-new, -.page-registrations.action-create { +.page-registrations { .ball { background: image-url('branding/ball.png') no-repeat; background-size: contain; @@ -12,19 +11,24 @@ height: 633px; } + @media (max-width: $screen-xs-max) { + .v-center { + height: auto; + } + } + .content { display: table-cell; vertical-align: middle; - h2 { + h1 { font-size: 35px; - margin: 12px; - text-align: center; + margin: 12px 0; } } form { - max-width: 400px; + max-width: 500px; } .captcha-img { diff --git a/app/controllers/registrations_controller.rb b/app/controllers/registrations_controller.rb index 142563314..7ba743756 100644 --- a/app/controllers/registrations_controller.rb +++ b/app/controllers/registrations_controller.rb @@ -5,9 +5,9 @@ # the COPYRIGHT file. class RegistrationsController < Devise::RegistrationsController - before_action :check_registrations_open_or_valid_invite! + before_action :check_registrations_open_or_valid_invite!, except: :registrations_closed - layout -> { request.format == :mobile ? "application" : "with_header" } + layout -> { request.format == :mobile ? "application" : "with_header_with_footer" } def create @user = User.build(user_params) @@ -28,17 +28,17 @@ class RegistrationsController < Devise::RegistrationsController end end + def registrations_closed + render "registrations/registrations_closed" + end + private def check_registrations_open_or_valid_invite! return true if AppConfig.settings.enable_registrations? || invite.try(:can_be_used?) - if params[:invite] - flash[:error] = t("registrations.invalid_invite") - redirect_to new_user_session_path - else - redirect_to registration_closed_path - end + flash[:error] = t("registrations.invalid_invite") if params[:invite] + redirect_to registrations_closed_path end def invite diff --git a/app/views/help/registration_closed.html.haml b/app/views/help/registration_closed.html.haml deleted file mode 100644 index ea794a5b2..000000000 --- a/app/views/help/registration_closed.html.haml +++ /dev/null @@ -1,25 +0,0 @@ -- content_for :page_title do - = AppConfig.settings.pod_name + " - " + t("devise.shared.links.sign_up_closed") - -.container - .row - .col-md-10.offset1 - .col-md-7.hidden-phone - %h1.ball - .col-md-5.v-center - .content - %h2 - = t("devise.shared.links.sign_up_closed") - - != t("help.closed_pod", - wiki: link_to("another pod", "https://diasporafoundation.org/getting_started/sign_up")) - - != t("help.find_pods", - poduptime: link_to("Poduptime", "https://podupti.me/")) - - != t("help.other_questions", - wiki: link_to("Wiki", "https://wiki.diasporafoundation.org/Choosing_a_pod")) - - - - diff --git a/app/views/registrations/_form.haml b/app/views/registrations/_form.haml index 56bbb04fb..9cd6ce0f7 100644 --- a/app/views/registrations/_form.haml +++ b/app/views/registrations/_form.haml @@ -4,7 +4,7 @@ - if mobile %legend = image_tag("branding/logos/header-logo2x.png", height: 40, width: 40) - = t("aspects.aspect_stream.make_something") + = AppConfig.settings.pod_name - if mobile = f.label :email, t("registrations.new.email"), class: "control-label", id: "emailLabel" diff --git a/app/views/help/registration_closed.mobile.haml b/app/views/registrations/_registrations_closed.haml similarity index 100% rename from app/views/help/registration_closed.mobile.haml rename to app/views/registrations/_registrations_closed.haml diff --git a/app/views/registrations/new.haml b/app/views/registrations/new.haml index 96f9c2733..bf034f9da 100644 --- a/app/views/registrations/new.haml +++ b/app/views/registrations/new.haml @@ -1,12 +1,11 @@ #registration .container .row - .col-md-10.offset1 - .col-md-7.hidden-phone - %h1.ball - .col-md-5.v-center - .content.text-center - %h2#pod-name - = AppConfig.settings.pod_name + .col-sm-6.hidden-xs + .ball + .col-sm-6.col-xs-12.v-center + .content.text-center + %h1#pod-name + = AppConfig.settings.pod_name - = render partial: "form", locals: {mobile: false} + = render partial: "form", locals: {mobile: false} diff --git a/app/views/registrations/registrations_closed.haml b/app/views/registrations/registrations_closed.haml new file mode 100644 index 000000000..c84db60f6 --- /dev/null +++ b/app/views/registrations/registrations_closed.haml @@ -0,0 +1,8 @@ +#registration + .container + .row + .col-sm-6.hidden-xs + .ball + .col-sm-6.col-xs-12.v-center + .content + = render partial: "registrations_closed" diff --git a/app/views/registrations/registrations_closed.mobile.haml b/app/views/registrations/registrations_closed.mobile.haml new file mode 100644 index 000000000..255620aca --- /dev/null +++ b/app/views/registrations/registrations_closed.mobile.haml @@ -0,0 +1,10 @@ + +.stream#main-stream + - flash.each do |name, msg| + .expose#flash-container + .flash-message{class: "message alert alert-#{flash_class name}", role: "alert"} + = msg + + .login-form + .login-container + = render partial: "registrations_closed" diff --git a/config/locales/diaspora/en.yml b/config/locales/diaspora/en.yml index a3bb4eddf..9331f797d 100644 --- a/config/locales/diaspora/en.yml +++ b/config/locales/diaspora/en.yml @@ -347,8 +347,8 @@ en: tutorial: "tutorial" irc: "IRC" closed_pod: "This pod is currently closed to new registrations. However, you can still join the diaspora* network by registering on %{wiki}. Because all pods are interconnected, you will have access to the same content there." - find_pods: "You can find pods at %{poduptime}." - other_questions: "If you have any other questions regarding choosing a pod, checkout our %{wiki}." + find_pods: "There’s a list of pods you can sign up to at %{poduptime}." + other_questions: "If you have any other questions regarding choosing a pod, check out our %{wiki}." choose_another: "Please, choose another pod" wiki: "wiki" faq: "FAQ" diff --git a/config/routes.rb b/config/routes.rb index 66b3ecf92..8517e7ee8 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -129,6 +129,7 @@ Rails.application.routes.draw do devise_scope :user do get "/users/sign_up" => "registrations#new", :as => :new_user_registration post "/users" => "registrations#create", :as => :user_registration + get "/registrations_closed" => "registrations#registrations_closed", :as => :registrations_closed end get "users/invitations" => "invitations#new", :as => "new_user_invitation" @@ -205,7 +206,6 @@ Rails.application.routes.draw do # Help get 'help' => 'help#faq', :as => 'help' - get "help/registration_closed" => "help#registration_closed", :as => "registration_closed" get 'help/:topic' => 'help#faq' #Protocol Url diff --git a/features/desktop/signs_up.feature b/features/desktop/getting_started.feature similarity index 96% rename from features/desktop/signs_up.feature rename to features/desktop/getting_started.feature index 2703069e0..bbebd5efa 100644 --- a/features/desktop/signs_up.feature +++ b/features/desktop/getting_started.feature @@ -98,11 +98,11 @@ Feature: new user registration Then I should not be able to sign up And I should have a validation error on "user_password, user_password_confirmation" - Scenario: User signs up with an already existing username and email and then tries to sign in (Issue #6136) + Scenario: User signs up with an already existing username and email and then tries to sign in When I log out manually And I go to the new user registration page - And I fill in the new user form with an existing email and username + And I fill in the new user form And I submit the form Then I should see a flash message indicating failure - When I click the sign in button + When I follow "Sign in" Then I should not see a flash message indicating failure diff --git a/features/desktop/registrations.feature b/features/desktop/registrations.feature new file mode 100644 index 000000000..1abcc09c4 --- /dev/null +++ b/features/desktop/registrations.feature @@ -0,0 +1,24 @@ +@javascript +Feature: New user registration + In order to use Diaspora* + As a desktop user + I want to register an account + + Scenario: user signs up and goes to getting started + Given I am on the new user registration page + When I fill in the new user form + And I press "Create account" + Then I should be on the getting started page + And I should see the 'getting started' contents + + Scenario: registrations are closed, user is informed + Given the registrations are closed + When I am on the new user registration page + Then I should see "Open signups are closed at this time" + + Scenario: User is unable to register even by manually sending the POST request + Given I am on the new user registration page + When I fill in the new user form + Given the registrations are closed + When I press "Create account" + Then I should see "Open signups are closed at this time" diff --git a/features/mobile/signs_up.feature b/features/mobile/registrations.feature similarity index 93% rename from features/mobile/signs_up.feature rename to features/mobile/registrations.feature index 3277ef131..43bc9dc75 100644 --- a/features/mobile/signs_up.feature +++ b/features/mobile/registrations.feature @@ -5,8 +5,7 @@ Feature: New user registration I want to register an account Background: - Given I am on the login page - And I follow "Create account" within "#main-nav" + Given I am on the new user registration page Scenario: user signs up and goes to getting started When I fill in the new user form diff --git a/features/step_definitions/session_steps.rb b/features/step_definitions/session_steps.rb index 4b08d1498..14d8f24ff 100644 --- a/features/step_definitions/session_steps.rb +++ b/features/step_definitions/session_steps.rb @@ -74,3 +74,11 @@ end Then (/^I should see the 'getting started' contents$/) do confirm_getting_started_contents end + +Given /^the registrations are closed$/ do + AppConfig.settings.enable_registrations = false +end + +When /^I fill in the new user form$/ do + fill_in_new_user_form +end diff --git a/features/step_definitions/user_steps.rb b/features/step_definitions/user_steps.rb index ee4e71b69..804642cae 100644 --- a/features/step_definitions/user_steps.rb +++ b/features/step_definitions/user_steps.rb @@ -218,20 +218,12 @@ When /^I view "([^\"]*)"'s first post$/ do |email| visit post_path(post) end -When /^I fill in the new user form/ do - fill_in_new_user_form -end - And /^I should be able to friend "([^\"]*)"$/ do |email| user = User.find_by_email(email) step 'I should see a ".aspect-dropdown"' step "I should see \"#{user.name}\"" end -When /^I click the sign in button$/ do - click_link "Sign in" -end - Given /^I did request my photos$/ do @me.perform_export_photos! end diff --git a/spec/controllers/registrations_controller_spec.rb b/spec/controllers/registrations_controller_spec.rb index c1aa7744c..7bb94bcaa 100644 --- a/spec/controllers/registrations_controller_spec.rb +++ b/spec/controllers/registrations_controller_spec.rb @@ -25,14 +25,14 @@ describe RegistrationsController, type: :controller do AppConfig.settings.enable_registrations = false end - it "redirects #new to the registration closed page" do + it "redirects #new to the registrations closed page" do get :new - expect(response).to redirect_to registration_closed_path + expect(response).to redirect_to registrations_closed_path end - it "redirects #create to the registration closed page" do + it "redirects #create to the registrations closed page" do post :create, params: valid_params - expect(response).to redirect_to registration_closed_path + expect(response).to redirect_to registrations_closed_path end it "does not redirect if there is a valid invite token" do @@ -43,7 +43,8 @@ describe RegistrationsController, type: :controller do it "does redirect if there is an invalid invite token" do get :new, params: {invite: {token: "fssdfsd"}} - expect(response).to redirect_to new_user_session_path + expect(flash[:error]).to eq(I18n.t("registrations.invalid_invite")) + expect(response).to redirect_to registrations_closed_path end it "does redirect if there are no invites available with this code" do @@ -51,7 +52,7 @@ describe RegistrationsController, type: :controller do code.update_attributes(count: 0) get :new, params: {invite: {token: code.token}} - expect(response).to redirect_to new_user_session_path + expect(response).to redirect_to registrations_closed_path end it "does redirect when invitations are closed now" do @@ -59,7 +60,7 @@ describe RegistrationsController, type: :controller do AppConfig.settings.invitations.open = false get :new, params: {invite: {token: code.token}} - expect(response).to redirect_to new_user_session_path + expect(response).to redirect_to registrations_closed_path end it "does not redirect when the registration is open" do From e5ba9a1a4696f30ba4e6e51893dbdd5c1c0cccca Mon Sep 17 00:00:00 2001 From: Benjamin Neff Date: Sat, 11 May 2019 22:53:57 +0200 Subject: [PATCH 23/81] Move translations to registrations.closed And remove unused translations and make "another pod" translatable. closes #7896 --- Changelog.md | 1 + app/views/registrations/_registrations_closed.haml | 8 ++++---- config/locales/diaspora/en.yml | 10 +++++----- 3 files changed, 10 insertions(+), 9 deletions(-) diff --git a/Changelog.md b/Changelog.md index b0818162a..904b9b895 100644 --- a/Changelog.md +++ b/Changelog.md @@ -6,6 +6,7 @@ ## Features * Add line mentioning diaspora\* on the splash page [#7966](https://github.com/diaspora/diaspora/pull/7966) +* Improve communication about signing up on closed pods [#7896](https://github.com/diaspora/diaspora/pull/7896) # 0.7.11.0 diff --git a/app/views/registrations/_registrations_closed.haml b/app/views/registrations/_registrations_closed.haml index f3822cc51..c1b9b3a8f 100644 --- a/app/views/registrations/_registrations_closed.haml +++ b/app/views/registrations/_registrations_closed.haml @@ -1,11 +1,11 @@ %h2 = t("devise.shared.links.sign_up_closed") -!= t("help.closed_pod", - wiki: link_to("another pod", "https://diasporafoundation.org/getting_started/sign_up")) +!= t("registrations.closed.closed_pod", + wiki: link_to(t("registrations.closed.another_pod"), "https://diasporafoundation.org/getting_started/sign_up")) -!= t("help.find_pods", +!= t("registrations.closed.find_pods", poduptime: link_to("Poduptime", "https://podupti.me/")) -!= t("help.other_questions", +!= t("registrations.closed.other_questions", wiki: link_to("Wiki", "https://wiki.diasporafoundation.org/Choosing_a_pod")) diff --git a/config/locales/diaspora/en.yml b/config/locales/diaspora/en.yml index 9331f797d..fa3aa016f 100644 --- a/config/locales/diaspora/en.yml +++ b/config/locales/diaspora/en.yml @@ -346,10 +346,6 @@ en: tutorials: "tutorials" tutorial: "tutorial" irc: "IRC" - closed_pod: "This pod is currently closed to new registrations. However, you can still join the diaspora* network by registering on %{wiki}. Because all pods are interconnected, you will have access to the same content there." - find_pods: "There’s a list of pods you can sign up to at %{poduptime}." - other_questions: "If you have any other questions regarding choosing a pod, check out our %{wiki}." - choose_another: "Please, choose another pod" wiki: "wiki" faq: "FAQ" markdown: "Markdown" @@ -1056,7 +1052,11 @@ en: terms_link: "terms of service" create: success: "You’ve joined diaspora*!" - closed: "Signups are closed on this diaspora* pod." + closed: + closed_pod: "This pod is currently closed to new registrations. However, you can still join the diaspora* network by registering on %{wiki}. Because all pods are interconnected, you will have access to the same content there." + another_pod: "another pod" + find_pods: "There’s a list of pods you can sign up to at %{poduptime}." + other_questions: "If you have any other questions regarding choosing a pod, check out our %{wiki}." invalid_invite: "The invite link you provided is no longer valid!" reshares: From 5aec9b966ca9e1b086922c2db0d06a44c8acd8a5 Mon Sep 17 00:00:00 2001 From: Benjamin Neff Date: Mon, 13 May 2019 22:49:16 +0200 Subject: [PATCH 24/81] updated 74 locale files [ci skip] --- config/locales/devise/devise.ar.yml | 1 - config/locales/devise/devise.art-nvi.yml | 1 - config/locales/devise/devise.bg.yml | 1 - config/locales/devise/devise.br.yml | 1 - config/locales/devise/devise.bs.yml | 1 - config/locales/devise/devise.cs.yml | 1 - config/locales/devise/devise.cy.yml | 1 - config/locales/devise/devise.da.yml | 1 - config/locales/devise/devise.de-moo.yml | 1 - config/locales/devise/devise.de.yml | 1 - config/locales/devise/devise.de_formal.yml | 1 - config/locales/devise/devise.el.yml | 1 - config/locales/devise/devise.en_1337.yml | 1 - config/locales/devise/devise.en_shaw.yml | 1 - config/locales/devise/devise.en_valspeak.yml | 1 - config/locales/devise/devise.eo.yml | 1 - config/locales/devise/devise.es-AR.yml | 1 - config/locales/devise/devise.es-CL.yml | 1 - config/locales/devise/devise.es-MX.yml | 1 - config/locales/devise/devise.es.yml | 1 - config/locales/devise/devise.et.yml | 1 - config/locales/devise/devise.eu.yml | 1 - config/locales/devise/devise.fi.yml | 1 - config/locales/devise/devise.fr.yml | 1 - config/locales/devise/devise.he.yml | 1 - config/locales/devise/devise.hu.yml | 1 - .../locales/devise/devise.hye-classical.yml | 1 - config/locales/devise/devise.hye.yml | 1 - config/locales/devise/devise.ia.yml | 1 - config/locales/devise/devise.id.yml | 1 - config/locales/devise/devise.is.yml | 1 - config/locales/devise/devise.it.yml | 1 - config/locales/devise/devise.ja.yml | 1 - config/locales/devise/devise.ka.yml | 1 - config/locales/devise/devise.ko.yml | 1 - config/locales/devise/devise.lt.yml | 1 - config/locales/devise/devise.mk.yml | 1 - config/locales/devise/devise.ms.yml | 1 - config/locales/devise/devise.nb.yml | 1 - config/locales/devise/devise.nds.yml | 1 - config/locales/devise/devise.nl.yml | 1 - config/locales/devise/devise.nn.yml | 1 - config/locales/devise/devise.oc.yml | 1 - config/locales/devise/devise.pa.yml | 1 - config/locales/devise/devise.pl.yml | 1 - config/locales/devise/devise.pt-BR.yml | 1 - config/locales/devise/devise.pt-PT.yml | 1 - config/locales/devise/devise.ro.yml | 1 - config/locales/devise/devise.ru.yml | 1 - config/locales/devise/devise.sc.yml | 1 - config/locales/devise/devise.sk.yml | 1 - config/locales/devise/devise.sl.yml | 1 - config/locales/devise/devise.sr.yml | 1 - config/locales/devise/devise.sv.yml | 1 - config/locales/devise/devise.te.yml | 1 - config/locales/devise/devise.tr.yml | 1 - config/locales/devise/devise.uk.yml | 1 - config/locales/devise/devise.vi.yml | 1 - config/locales/devise/devise.zh-CN.yml | 1 - config/locales/devise/devise.zh-TW.yml | 1 - config/locales/diaspora/bg.yml | 35 ++++++++++++++ config/locales/diaspora/da.yml | 48 +++++++++++++++++-- config/locales/diaspora/de.yml | 2 + config/locales/diaspora/es-CL.yml | 14 ++++++ config/locales/diaspora/fr.yml | 37 ++++++++++++++ config/locales/diaspora/hu.yml | 4 +- config/locales/diaspora/ia.yml | 29 +++++++++-- config/locales/diaspora/it.yml | 34 +++++++++++++ config/locales/diaspora/ja.yml | 43 +++++++++++++++++ config/locales/diaspora/pt-BR.yml | 35 ++++++++++++++ config/locales/diaspora/sv.yml | 36 ++++++++++++++ config/locales/javascript/javascript.da.yml | 1 + config/locales/javascript/javascript.de.yml | 1 + config/locales/javascript/javascript.ja.yml | 10 ++-- 74 files changed, 314 insertions(+), 75 deletions(-) diff --git a/config/locales/devise/devise.ar.yml b/config/locales/devise/devise.ar.yml index da3745647..fb2d0cdbf 100644 --- a/config/locales/devise/devise.ar.yml +++ b/config/locales/devise/devise.ar.yml @@ -54,7 +54,6 @@ ar: new: email: "البريد الإلكترونيّ" forgot_password: "أنسيت كلمة المرور؟" - no_account: "ليس هناك حساب بهذا البريد الإلكترونيّ" reset_password: "صفّر كلمة المرور" send_password_instructions: "أرسل لي إرشادات تصفير كلمة المرور" send_instructions: "سيصلك بريد إلكترونيّ قريبًا فيه إرشادات تصفير كلمة المرور." diff --git a/config/locales/devise/devise.art-nvi.yml b/config/locales/devise/devise.art-nvi.yml index 8ea0dc560..a15ca9cdf 100644 --- a/config/locales/devise/devise.art-nvi.yml +++ b/config/locales/devise/devise.art-nvi.yml @@ -28,7 +28,6 @@ art-nvi: change_password: "Leykatem oeyä ftemlì'ut" new: forgot_password: "Ngal tswama' ngeyä ftemlì'uti srak?" - no_account: "Kea Diaspora a hu fìImeyl fkeytok. Diasporari txo perey, ayoe terìng ayDiasporat ye'rìn" send_password_instructions: "Fpe' oeru aysänumet fte oe tsivun leykivatem oeyä ftemlì'ut" send_instructions: "Ngal tayel Imeylit a wìntxu ngaru fya'ot a ngal leykatem ngeyä ftemlì'ut." updated: "Ngeyä ftemlì'u lìmatem. Nga tung fìtsengmì set." diff --git a/config/locales/devise/devise.bg.yml b/config/locales/devise/devise.bg.yml index c06f9406e..fc711e86c 100644 --- a/config/locales/devise/devise.bg.yml +++ b/config/locales/devise/devise.bg.yml @@ -50,7 +50,6 @@ bg: change_password: "Промяна на паролата" new: forgot_password: "Забравена парола?" - no_account: "Не съществува акаунт с въведената ел. поща. Ако очаквате покана, знайте че ние ги раздаваме възможно най-бързо" send_password_instructions: "Изпращане на инструкции за възстановяване на паролата" send_instructions: "Ще получите ел. писмо с инструкции за промяна на паролата." updated: "Паролата е променена успешно. Сега сте вписани." diff --git a/config/locales/devise/devise.br.yml b/config/locales/devise/devise.br.yml index 7a69f754d..5304bc37f 100644 --- a/config/locales/devise/devise.br.yml +++ b/config/locales/devise/devise.br.yml @@ -54,7 +54,6 @@ br: new: email: "Chomlec'h postel" forgot_password: "Ankouaet ho ker-tremen ganeoc'h?" - no_account: "N'eus kont ebet stag ouzh ar postel-mañ." reset_password: "Adtermeniñ ar ger-tremen" send_password_instructions: "Kas din an titouroù evit adsevel ma ger-tremen" send_instructions: "Emaoc'h o vont da resev ur postel a-raok pell gant titouroù evit gouzout an doare da adsevel ho ker-tremen." diff --git a/config/locales/devise/devise.bs.yml b/config/locales/devise/devise.bs.yml index 54c2d9d98..8397de68c 100644 --- a/config/locales/devise/devise.bs.yml +++ b/config/locales/devise/devise.bs.yml @@ -51,7 +51,6 @@ bs: change_password: "Promjeni moju šifru" new: forgot_password: "Zaboravili ste šifru?" - no_account: "Ne postoji račun sa ovom e-mail adresom. Ako očekujete pozivnicu, šaljemo ih čim prije." send_password_instructions: "Pošalji mi uputstva za resetovanje šifre" send_instructions: "Dobit ćete e-mail sa uputstvima kako da resetujete vašu šifru za par minuta." updated: "Vaša šifra je uspješno promijenjena. Sada ste prijavljeni." diff --git a/config/locales/devise/devise.cs.yml b/config/locales/devise/devise.cs.yml index 9273ef7d3..7988eda06 100644 --- a/config/locales/devise/devise.cs.yml +++ b/config/locales/devise/devise.cs.yml @@ -62,7 +62,6 @@ cs: new: email: "E-mailová adresa" forgot_password: "Zapomněli jste heslo?" - no_account: "Neexistuje žádný účet s touto e-mailovou adresou. Pokud čekáte na pozvání, budeme je vydávat, co nejdříve to bude možné" reset_password: "Znovunastavit heslo" send_password_instructions: "Zaslat instrukce k nastavení nového hesla." no_token: "Na tuto stránku se nemůžete dostat, pokud nepřicházíte z e-mailu pro obnovení hesla. Pokud z e-mailu přicházíte, ujistěte se, že používáte celé poskytnuté URL." diff --git a/config/locales/devise/devise.cy.yml b/config/locales/devise/devise.cy.yml index 97dfae845..ec5fa7e31 100644 --- a/config/locales/devise/devise.cy.yml +++ b/config/locales/devise/devise.cy.yml @@ -37,7 +37,6 @@ cy: change_password: "Newid fy nghyfrinair" new: forgot_password: "Wedi anghofio eich cyfrinair?" - no_account: "Dim cyfrif gyda e-bost hwn yn bodoli. Os ydych yn aros am wahodd, rhaid i chi aros hwyrach bach..." send_instructions: "Byddwch yn derbyn e-bost â chyfarwyddiadau ar sut i gadarnhau eich cyfrif mewn ychydig funudau." updated: "Newidiwyd eich cyfrinair yn llwyddiannus. Rydych chi wedi arwyddo i fewn." registrations: diff --git a/config/locales/devise/devise.da.yml b/config/locales/devise/devise.da.yml index 8243f6d7d..eb68bee89 100644 --- a/config/locales/devise/devise.da.yml +++ b/config/locales/devise/devise.da.yml @@ -62,7 +62,6 @@ da: new: email: "E-mail adresse" forgot_password: "Glemt din adgangskode?" - no_account: "Ingen konto med denne email adresse eksisterer." reset_password: "Nulstil adgangskode" send_password_instructions: "Send mig instruktioner til nulstilning af adgangskode" no_token: "Du kan ikke tilgå denne side uden at komme fra en e-mail med nulstilling af dit kodeord. Hvis du kommer fra sådan en e-mail, undersøg venligst at du har brugt hele den URL der stod i mailen." diff --git a/config/locales/devise/devise.de-moo.yml b/config/locales/devise/devise.de-moo.yml index 78e47d7e5..689f20c70 100644 --- a/config/locales/devise/devise.de-moo.yml +++ b/config/locales/devise/devise.de-moo.yml @@ -62,7 +62,6 @@ de-moo: new: email: "Email-Adresse" forgot_password: "Passwort vergessen?" - no_account: "Es existiert keine Kuh mit dieser E-Mail-Adresse" reset_password: "Passwort zurücksetzen" send_password_instructions: "Anleitung zum Zurücksetzen des Кennworts anfordern" no_token: "Du kannst auf diese Weide nicht zugreifen, ohne von einer E-Mail zur Passwortrücksetzung zu kommen. Falls du von einer E-Mail zur Passwortrücksetzung kommst, vergewissere dich bitte, dass du die vollständige angegebene URL verwendet hast." diff --git a/config/locales/devise/devise.de.yml b/config/locales/devise/devise.de.yml index a07c3d995..8c2148a60 100644 --- a/config/locales/devise/devise.de.yml +++ b/config/locales/devise/devise.de.yml @@ -62,7 +62,6 @@ de: new: email: "E-Mail-Adresse" forgot_password: "Kennwort vergessen?" - no_account: "Es existiert kein Benutzerkonto mit dieser E-Mail-Adresse" reset_password: "Kennwort zurücksetzen" send_password_instructions: "Anleitung zum Zurücksetzen des Кennworts anfordern" no_token: "Du kannst auf diese Seite nicht zugreifen, ohne von einer E-Mail zur Passwortrücksetzung zu kommen. Falls du von einer E-Mail zur Passwortrücksetzung kommst, vergewissere dich bitte, dass du die vollständige angegebene URL verwendet hast." diff --git a/config/locales/devise/devise.de_formal.yml b/config/locales/devise/devise.de_formal.yml index 5e836020e..116d5f9ca 100644 --- a/config/locales/devise/devise.de_formal.yml +++ b/config/locales/devise/devise.de_formal.yml @@ -62,7 +62,6 @@ de_formal: new: email: "E-Mail-Adresse" forgot_password: "Passwort vergessen?" - no_account: "Es existiert kein Benutzerkonto mit dieser E-Mail-Adresse" reset_password: "Passwort zurücksetzen" send_password_instructions: "Anleitung zum Zurücksetzen des Кennworts anfordern" no_token: "Sie können auf diese Seite nicht zugreifen, ohne von einer E-Mail zur Passwortrücksetzung zu kommen. Falls sie von einer E-Mail zur Passwortrücksetzung kommen, vergewissern Sie sich bitte, dass Sie die vollständige angegebene URL verwendet haben." diff --git a/config/locales/devise/devise.el.yml b/config/locales/devise/devise.el.yml index a3092ad6b..24f5fe522 100644 --- a/config/locales/devise/devise.el.yml +++ b/config/locales/devise/devise.el.yml @@ -54,7 +54,6 @@ el: new: email: "Διεύθυνση email" forgot_password: "Ξεχάσατε τον κωδικό σας;" - no_account: "Δεν υπάρχει λογαριασμός με αυτό το email. Αν περιμένετε για πρόσκληση, θα γίνουν αποστολές το συντομότερο δυνατόν" reset_password: "Επαναφορά κωδικού" send_password_instructions: "Στείλτε μου οδηγίες επαναφοράς κωδικού" send_instructions: "Θα λάβετε ένα email με οδηγίες για το πως να επαναφέρετε τον κωδικό πρόσβασης σας σε λίγα λεπτά." diff --git a/config/locales/devise/devise.en_1337.yml b/config/locales/devise/devise.en_1337.yml index c9d9f584e..3f78ebae3 100644 --- a/config/locales/devise/devise.en_1337.yml +++ b/config/locales/devise/devise.en_1337.yml @@ -48,7 +48,6 @@ en_1337: change_password: "CH4NG3 MY *****" new: forgot_password: "F0RG07 Y0UR *****?" - no_account: "404 - N07 F0UND!" send_password_instructions: "R3537 MY *****!!" send_instructions: "G0NN4 R3C113V3 R3537 1N57RUC71ON5 BY M41L!" updated: "***** CH4NG3D" diff --git a/config/locales/devise/devise.en_shaw.yml b/config/locales/devise/devise.en_shaw.yml index c3403e868..bcc5e08d0 100644 --- a/config/locales/devise/devise.en_shaw.yml +++ b/config/locales/devise/devise.en_shaw.yml @@ -46,7 +46,6 @@ en_shaw: change_password: "𐑗𐑱𐑯𐑡 𐑥𐑲 𐑐𐑨𐑕𐑢𐑼𐑛" new: forgot_password: "𐑓𐑹𐑜𐑪𐑑 𐑿𐑼 𐑐𐑨𐑕𐑢𐑼𐑛?" - no_account: "𐑯𐑴 𐑩𐑒𐑬𐑯𐑑 𐑢𐑦𐑞 𐑞𐑦𐑕 𐑦-𐑥𐑱𐑤 𐑧𐑜𐑟𐑦𐑕𐑑𐑕. 𐑦𐑓 𐑿 𐑸 𐑢𐑱𐑑𐑦𐑙 𐑓𐑹 𐑩𐑯 𐑦𐑯𐑝𐑲𐑑, 𐑢𐑰 𐑸 𐑮𐑴𐑤𐑦𐑙 𐑞𐑧𐑥 𐑬𐑑 𐑨𐑟 𐑕𐑵𐑯 𐑨𐑟 𐑐𐑪𐑕𐑦𐑚𐑩𐑤" send_password_instructions: "𐑕𐑧𐑯𐑛 𐑥𐑰 𐑮𐑦𐑕𐑧𐑑 𐑐𐑨𐑕𐑢𐑼𐑛 𐑦𐑯𐑕𐑑𐑮𐑳𐑒𐑖𐑩𐑯𐑟" send_instructions: "𐑿 𐑢𐑦𐑤 𐑮𐑦𐑕𐑰𐑝 𐑩𐑯 𐑦-𐑥𐑱𐑤 𐑢𐑦𐑞 𐑦𐑯𐑕𐑑𐑮𐑳𐑒𐑖𐑩𐑯𐑟 𐑩𐑚𐑬𐑑 𐑣𐑬 𐑑 𐑮𐑦𐑕𐑧𐑑 𐑿𐑼 𐑐𐑨𐑕𐑢𐑼𐑛 𐑦𐑯 𐑩 𐑓𐑿 𐑥𐑦𐑯𐑩𐑑𐑕." updated: "𐑿𐑼 𐑐𐑨𐑕𐑢𐑼𐑛 𐑢𐑪𐑟 𐑗𐑱𐑯𐑡𐑛 𐑕𐑩𐑒𐑕𐑧𐑕𐑓𐑫𐑤𐑦. 𐑿 𐑸 𐑯𐑬 𐑕𐑲𐑯𐑛 𐑦𐑯." diff --git a/config/locales/devise/devise.en_valspeak.yml b/config/locales/devise/devise.en_valspeak.yml index 052b6572f..51159c2d4 100644 --- a/config/locales/devise/devise.en_valspeak.yml +++ b/config/locales/devise/devise.en_valspeak.yml @@ -57,7 +57,6 @@ en_valspeak: new: email: "Email addy" forgot_password: "Oh noes!? did u like, forget ur passwerd? D:" - no_account: "sry but liek, no account that has this email existz... sry bout that :\\" reset_password: "Reset passwerd" send_password_instructions: "Send meh stuff on how 2 reset mah passwerd plz! Kthxbye <3" send_instructions: "U will like, receive an email wit some txt on how 2 liek... reset ur passwerd in a few min, kay? So just chillax till then, kay? Kay. <3" diff --git a/config/locales/devise/devise.eo.yml b/config/locales/devise/devise.eo.yml index a11e2af00..8244a70cf 100644 --- a/config/locales/devise/devise.eo.yml +++ b/config/locales/devise/devise.eo.yml @@ -50,7 +50,6 @@ eo: change_password: "Ŝanĝi mian pasvorton" new: forgot_password: "Ĉu vi forgesis vian pasvorton?" - no_account: "Ne ekzistas konto kun ĉi tiu retpoŝtadreso. Se vi atendas inviton, ni plej rapide sendos ilin" send_password_instructions: "Sendi al mi instrukciojn por restartigi pasvorton" send_instructions: "Post kelkaj minutoj vi ricevos retpoŝton kun instrukcioj pri kiel restartigi vian pasvorton." updated: "Vi sukcese ŝanĝis vian pasvorton. Vi nun estas ensalutinta." diff --git a/config/locales/devise/devise.es-AR.yml b/config/locales/devise/devise.es-AR.yml index 3b39eecf1..c22f4d628 100644 --- a/config/locales/devise/devise.es-AR.yml +++ b/config/locales/devise/devise.es-AR.yml @@ -62,7 +62,6 @@ es-AR: new: email: "Correo electrónico" forgot_password: "¿Olvidaste tu contraseña?" - no_account: "No hay ninguna cuenta con esta dirección de correo electrónico. Si estás esperando una invitación, te la enviaremos tan pronto como sea posible." reset_password: "Resetear contraseña" send_password_instructions: "Enviame instrucciones para cambiar mi contraseña." no_token: "No puedes acceder a esta página si no vienes de un mensaje de restablecimiento de contraseña. Si vienes de un mensaje de restablecimiento de contraseña, por favor asegúrate de que has utilizado la URL completa proporcionada en el mensaje." diff --git a/config/locales/devise/devise.es-CL.yml b/config/locales/devise/devise.es-CL.yml index a0c900776..1f2e1a2d5 100644 --- a/config/locales/devise/devise.es-CL.yml +++ b/config/locales/devise/devise.es-CL.yml @@ -58,7 +58,6 @@ es-CL: change_password: "Cambiar mi contraseña" new: forgot_password: "¿Olvidaste tu contraseña?" - no_account: "No existe una cuenta asociada con ese email. Si estas esperando una invitación, la enviaremos a la brevedad" send_password_instructions: "Envíame instrucciones para restablecer la contraseña" no_token: "No puedes acceder a esta página sino viene de un correo electrónico de restablecimiento de contraseña. Si viene de un correo electrónico de restablecimiento de contraseña, por favor asegúrese de que utilizó la URL completa proporcionada." send_instructions: "Recibirás un correo con instrucciones para restablecer tu contraseña en pocos minutos." diff --git a/config/locales/devise/devise.es-MX.yml b/config/locales/devise/devise.es-MX.yml index afb2b5481..398ea72e6 100644 --- a/config/locales/devise/devise.es-MX.yml +++ b/config/locales/devise/devise.es-MX.yml @@ -52,7 +52,6 @@ es-MX: new: email: "Dirección de correo electrónico" forgot_password: "¿Olvidaste tu contraseña?" - no_account: "No existe una cuenta con este correo electrónico." reset_password: "Restablecer contraseña" send_password_instructions: "Envíame instrucciones para restablecer la contraseña." send_instructions: "Recibirás un correo electrónico con instrucciones para restablecer tu contraseña dentro de pocos minutos." diff --git a/config/locales/devise/devise.es.yml b/config/locales/devise/devise.es.yml index cbf73e3a9..797f02f9d 100644 --- a/config/locales/devise/devise.es.yml +++ b/config/locales/devise/devise.es.yml @@ -62,7 +62,6 @@ es: new: email: "Dirección de correo" forgot_password: "¿Has olvidado tu contraseña?" - no_account: "No existe una cuenta con ese correo" reset_password: "Resetear contraseña" send_password_instructions: "Envíame instrucciones para restablecer la contraseña" no_token: "No puedes acceder a esta página sin venir un correo de reseteo de contraseña. Si vienes de uno de estos correos, por favor asegúrate de utilizar la URL proporcionada." diff --git a/config/locales/devise/devise.et.yml b/config/locales/devise/devise.et.yml index 132ebbbbb..fdb805020 100644 --- a/config/locales/devise/devise.et.yml +++ b/config/locales/devise/devise.et.yml @@ -42,7 +42,6 @@ et: change_password: "Muuda parooli" new: forgot_password: "Unustasid parooli?" - no_account: "Sellise e-mailiga kontot pole. Kui sa ootad kutset, siis saadame selle esimesel võimalusel" send_password_instructions: "Saada mulle juhised salasõna lähtestamiseks." send_instructions: "Mõne minuti jooksul saad e-kirja juhistega oma parooli muutmiseks." updated: "Sinu parool on edukalt muudetud. Oled nüüd sisse logitud." diff --git a/config/locales/devise/devise.eu.yml b/config/locales/devise/devise.eu.yml index b855e8124..80e01cefc 100644 --- a/config/locales/devise/devise.eu.yml +++ b/config/locales/devise/devise.eu.yml @@ -50,7 +50,6 @@ eu: change_password: "Nire pasahitza aldatu" new: forgot_password: "Pasahitza ahaztu duzu?" - no_account: "Ez da konturik e-posta horrekin. Gonbidapen baten zain bazaude, ahal dugun azkarren bidaliko dizugu bat" send_password_instructions: "Bidali iezadazu pasahitzaren berrezarpenerako argibideak" send_instructions: "Hurrengo minutuetan email bat jasoko dituzu pasahitza berrezartzeko argibideekin." updated: "Zure pasahitza arrakastaz aldatu duzu. Autentikatuta zaude orain." diff --git a/config/locales/devise/devise.fi.yml b/config/locales/devise/devise.fi.yml index d0030e248..d102a6455 100644 --- a/config/locales/devise/devise.fi.yml +++ b/config/locales/devise/devise.fi.yml @@ -59,7 +59,6 @@ fi: new: email: "Sähköpostiosoite" forgot_password: "Unohditko salasanasi?" - no_account: "Tunnusta tälle sähköpostiosoitteelle ei ole olemassa." reset_password: "Vaihda salasana" send_password_instructions: "Lähetä minulle salasanan uudelleenasettamisohjeet" send_instructions: "Saat hetken päästä sähköpostiisi ohjeet siitä, miten voit asettaa salasanasi uudelleen." diff --git a/config/locales/devise/devise.fr.yml b/config/locales/devise/devise.fr.yml index 7855c95f9..c50dcf6d9 100644 --- a/config/locales/devise/devise.fr.yml +++ b/config/locales/devise/devise.fr.yml @@ -62,7 +62,6 @@ fr: new: email: "Adresse E-mail" forgot_password: "Mot de passe oublié ?" - no_account: "Aucun compte n'est associé à cette adresse de courrier électronique." reset_password: "Réinitialiser le mot de passe" send_password_instructions: "Envoyer les instructions de réinitialisation de mot de passe" no_token: "Vous ne pouvez accéder à cette page sans venir d'un e-mail de réinitialisation du mot de passe. Veuillez vérifier que vous avez utiliser l'URL en entier." diff --git a/config/locales/devise/devise.he.yml b/config/locales/devise/devise.he.yml index ecc0c8f05..d17dae6ac 100644 --- a/config/locales/devise/devise.he.yml +++ b/config/locales/devise/devise.he.yml @@ -54,7 +54,6 @@ he: new: email: "כתובת דוא\"ל" forgot_password: "שכחת את סיסמתך?" - no_account: "לא קיים חשבון עם כתובת דוא״ל זו" reset_password: "איפוס סיסמה" send_password_instructions: "שליחת הנחיות איפוס הססמה אלי" send_instructions: "בעוד מספר דקות תתקבל בתיבת הדוא״ל שלך הודעה עם הנחיות כיצד לאפס את סיסמתך." diff --git a/config/locales/devise/devise.hu.yml b/config/locales/devise/devise.hu.yml index f0e29db72..e7730cba2 100644 --- a/config/locales/devise/devise.hu.yml +++ b/config/locales/devise/devise.hu.yml @@ -54,7 +54,6 @@ hu: new: email: "E-mail cím" forgot_password: "Elfelejtetted a jelszavad?" - no_account: "Ehhez az e-mail címhez nem tartozik fiók." reset_password: "Jelszó visszaállítása" send_password_instructions: "Új jelszót igénylek" send_instructions: "Néhány perc múlva kapsz egy e-mailt arról, hogyan állíthatod alaphelyzetbe a jelszavadat." diff --git a/config/locales/devise/devise.hye-classical.yml b/config/locales/devise/devise.hye-classical.yml index c71e60362..50a0953c0 100644 --- a/config/locales/devise/devise.hye-classical.yml +++ b/config/locales/devise/devise.hye-classical.yml @@ -61,7 +61,6 @@ hye-classical: new: email: "Էլ․ հասցէ" forgot_password: "Մոռացե՞լ ես գաղտնաբառդ" - no_account: "Այս էլ.հասցէով հաշիւ չկայ։" reset_password: "Վերականգնել գաղտնաբառը" send_password_instructions: "Ուղարկէք ինձ գաղտնաբառը փոխելու ցուցումները" no_token: "Այս էջը հասանելի է միայն գաղտնաբառը վերականգնելու յղումով նամակից գալու դէպքում։ Եթէ հէնց այդտեղից է, որ եկել ես, հաւաստիացիր, որ ամբողջական յղումն ես օգտագործել։" diff --git a/config/locales/devise/devise.hye.yml b/config/locales/devise/devise.hye.yml index 0f7810430..a16917e5d 100644 --- a/config/locales/devise/devise.hye.yml +++ b/config/locales/devise/devise.hye.yml @@ -59,7 +59,6 @@ hye: new: email: "Էլ․հասցե" forgot_password: "Մոռացե՞լ ես գաղտնաբառդ" - no_account: "Այս էլ.հասցեով հաշիվ չկա։" reset_password: "Վերականգնել գաղտնաբառը" send_password_instructions: "Ուղարկեք ինձ գաղտնաբառը փոխելու ցուցումները" no_token: "Այս էջը հասանելի է միայն գաղնաբառը վերականգնելու հղումով նամակից գալու դեպքում։ Եթե հենց այդտեղից է, որ եկել ես, հավաստիացիր, որ ամբողջական հղումն ես օգտագործել։" diff --git a/config/locales/devise/devise.ia.yml b/config/locales/devise/devise.ia.yml index a136688b2..b950b6a63 100644 --- a/config/locales/devise/devise.ia.yml +++ b/config/locales/devise/devise.ia.yml @@ -62,7 +62,6 @@ ia: new: email: "Adresse de e-mail" forgot_password: "Contrasigno oblidate?" - no_account: "Nulle conto con iste adresse de e-mail existe." reset_password: "Reinitialisar contrasigno" send_password_instructions: "Inviar instructiones pro reinitialisar contrasigno" no_token: "Tu non pote acceder a iste pagina sin venir ab un e-mail pro reinitialisar contrasigno. Si tu de facto veni ab un e-mail pro reinitialisar contrasigno, per favor assecura te de usar le totalitate del URL fornite." diff --git a/config/locales/devise/devise.id.yml b/config/locales/devise/devise.id.yml index d05e206a5..ba9c6d945 100644 --- a/config/locales/devise/devise.id.yml +++ b/config/locales/devise/devise.id.yml @@ -50,7 +50,6 @@ id: change_password: "Ubah kata sandi saya" new: forgot_password: "Lupa kata sandi anda?" - no_account: "Tidak ditemukan akun dengan E-mail ini. Jika anda menunggu invitasi (undangan), kami akan menyebarkannya secepatnya" send_password_instructions: "Kirimkan saya instruksi untuk membuat ulang kata sandi" send_instructions: "Anda akan menerima email berisi petunjuk cara membuat ulang kata sandi Anda dalam beberapa menit." updated: "Kata kunci Anda telah berhasil diubah. Anda sekarang sudah masuk." diff --git a/config/locales/devise/devise.is.yml b/config/locales/devise/devise.is.yml index 5e3b06edb..9ffef47bb 100644 --- a/config/locales/devise/devise.is.yml +++ b/config/locales/devise/devise.is.yml @@ -54,7 +54,6 @@ is: new: email: "Netfang" forgot_password: "Gleymdirðu lykilorðinu þínu?" - no_account: "Enginn notandi með þetta netfang ert til" reset_password: "Endurstilla lykilorð" send_password_instructions: "Senda mér leiðbeiningar um hvernig ég get endurstillt lykilorðið mitt" send_instructions: "Þú munt fá tölvupóst innan fárra mínútna, með leiðbeiningum um hvernig þú getur endurstillt lykilorð þitt." diff --git a/config/locales/devise/devise.it.yml b/config/locales/devise/devise.it.yml index d98fc1a09..ad7e1a328 100644 --- a/config/locales/devise/devise.it.yml +++ b/config/locales/devise/devise.it.yml @@ -56,7 +56,6 @@ it: new: email: "Indirizzo email" forgot_password: "Hai dimenticato la password?" - no_account: "Non esiste un account con questo indirizzo email" reset_password: "Azzera password" send_password_instructions: "Inviami le istruzioni per reimpostare la password." send_instructions: "Tra pochi minuti riceverai una email con le istruzioni su come cambiare la tua password." diff --git a/config/locales/devise/devise.ja.yml b/config/locales/devise/devise.ja.yml index 17bb41697..3cd4aaf70 100644 --- a/config/locales/devise/devise.ja.yml +++ b/config/locales/devise/devise.ja.yml @@ -62,7 +62,6 @@ ja: new: email: "メールアドレス" forgot_password: "パスワードを忘れましたか?" - no_account: "このメールアドレスに一致するアカウントは存在しません" reset_password: "パスワードの再設定" send_password_instructions: "パスワード再発行の手続きメールを送ってください。" no_token: "パスワードリセットのメールからではないと、このページにアクセスすることはできません。パスワードリセットのメールから来た場合は、提供された完全なURLを使用していることを確認してください。" diff --git a/config/locales/devise/devise.ka.yml b/config/locales/devise/devise.ka.yml index ee749762a..abe1c3e0e 100644 --- a/config/locales/devise/devise.ka.yml +++ b/config/locales/devise/devise.ka.yml @@ -50,7 +50,6 @@ ka: change_password: "ჩემი პაროლის შეცვლა" new: forgot_password: "დაგავიწყდათ თქვენი პაროლი?" - no_account: "ამ ელ-ფოსტით ანგარიში არ არსებობს. თუ თქვენ მოსაწვევს ელოდებით, ჩვენ მათ დაგზავნას რაც შეიძლება მალე მოვახდენთ" send_password_instructions: "გამომიგზავნეთ პაროლის განახლების ინსტრუქცია" send_instructions: "თქვენ რამდენიმე წუთში მიიღებთ ელ-ფოსტას ინსტრუქციებით თუ როგორ უნდა შეცვალოთ თქვენი პაროლი." updated: "პაროლი წარამტებით შეიცვალა. თქვენ ახლა შემოსული ხართ." diff --git a/config/locales/devise/devise.ko.yml b/config/locales/devise/devise.ko.yml index 6a027fcb2..576f65508 100644 --- a/config/locales/devise/devise.ko.yml +++ b/config/locales/devise/devise.ko.yml @@ -54,7 +54,6 @@ ko: new: email: "이메일" forgot_password: "암호를 잊었습니까?" - no_account: "등록되지 않은 이메일 주소입니다." reset_password: "암호 재설정" send_password_instructions: "암호 재설정 메일 보내기" send_instructions: "몇 분 안으로 암호를 초기화하기 위한 이메일이 도착합니다." diff --git a/config/locales/devise/devise.lt.yml b/config/locales/devise/devise.lt.yml index 34e27ae0a..2461cb093 100644 --- a/config/locales/devise/devise.lt.yml +++ b/config/locales/devise/devise.lt.yml @@ -50,7 +50,6 @@ lt: change_password: "Keisti mano slaptažodį" new: forgot_password: "Pamiršai slaptažodį?" - no_account: "Tokio el. pašto mūsų sistemoje nėra užregistruota. Laukiančius pakvietimo įspėjame, kad išsiųsime juos kai tik galėsime." send_password_instructions: "Siųsti nurodymus, kaip atstatyti slaptažodį" send_instructions: "Netrukus gausite el. laišką su nurodymais, kaip atstatyti slaptažodį." updated: "Slaptažodis sėkmingai pakeistas. Prisijungta." diff --git a/config/locales/devise/devise.mk.yml b/config/locales/devise/devise.mk.yml index 4813fd490..2c648a3ed 100644 --- a/config/locales/devise/devise.mk.yml +++ b/config/locales/devise/devise.mk.yml @@ -46,7 +46,6 @@ mk: change_password: "Промена на лозинка" new: forgot_password: "Ја заборавивте лозинката?" - no_account: "No account with this email exsists. If you are waiting for an invite, we are rolling them out as soon as possible" send_password_instructions: "Испрати ми ги инструкциите за ресетирање на лозинката" send_instructions: "За неколку минути ќе добиете е-маил со инструкции за начинот на кој може да ја ресетирате вашата лозинка." updated: "Вашата лозинка беше успешно променета. Сега сте најавени." diff --git a/config/locales/devise/devise.ms.yml b/config/locales/devise/devise.ms.yml index b5cc36d6c..bb90cd9bd 100644 --- a/config/locales/devise/devise.ms.yml +++ b/config/locales/devise/devise.ms.yml @@ -53,7 +53,6 @@ ms: new: email: "Alamat emel" forgot_password: "Lupa kata laluan anda?" - no_account: "Tiada akaun dengan e-mel ini wujud. Jika anda sedang menunggu untuk jemputan, kami memusing mereka secepat mungkin" reset_password: "Tetapkan semula kata laluan" send_password_instructions: "Hantar saya arahan menetap semula kata laluan" send_instructions: "Anda akan menerima e-mel dengan arahan mengenai cara untuk menetapkan semula kata laluan anda dalam beberapa minit." diff --git a/config/locales/devise/devise.nb.yml b/config/locales/devise/devise.nb.yml index fca18e624..acea84092 100644 --- a/config/locales/devise/devise.nb.yml +++ b/config/locales/devise/devise.nb.yml @@ -62,7 +62,6 @@ nb: new: email: "E-post" forgot_password: "Glemt passordet?" - no_account: "Det finnes ingen bruker med denne e-post adressen. Hvis du venter på en invitasjon, sender vi dem ut så snart vi kan." reset_password: "Resett passord" send_password_instructions: "Send meg instruksjoner for å tilbakestille passordet" no_token: "Du kan ikke se denne siden uten å komme fra en e-post for å tilbakestille passord. Dersom du kom fra en e-post for å tilbakestille passord, sørg for at du bruker den fullstendige URL-en som ble oppgitt i e-posten." diff --git a/config/locales/devise/devise.nds.yml b/config/locales/devise/devise.nds.yml index 60e950217..d3ef320d4 100644 --- a/config/locales/devise/devise.nds.yml +++ b/config/locales/devise/devise.nds.yml @@ -37,7 +37,6 @@ nds: new: email: "E-Mail-Adress" forgot_password: "Hest du dien Passwoort vergeten?" - no_account: "Dat gift keen Konto mit disse E-Mail-Adress" reset_password: "Passwoort trüchsetten" send_password_instructions: "Schick mi Anwiesungen ton Trüchsetten von mien Passwoort" updated: "Dien Passwoort is erfolgriek ännert worn. Du bist nu anmeld." diff --git a/config/locales/devise/devise.nl.yml b/config/locales/devise/devise.nl.yml index 1aa3f9783..6106d5a8d 100644 --- a/config/locales/devise/devise.nl.yml +++ b/config/locales/devise/devise.nl.yml @@ -57,7 +57,6 @@ nl: new: email: "E-mailadres" forgot_password: "Wachtwoord vergeten?" - no_account: "Er bestaat geen account met dit e-mailadres" reset_password: "Herstel wachtwoord" send_password_instructions: "Stuur mij instructies om mijn wachtwoord te resetten" send_instructions: "Je ontvangt binnen enkele minuten een e-mail met instructies om je wachtwoord opnieuw in te stellen." diff --git a/config/locales/devise/devise.nn.yml b/config/locales/devise/devise.nn.yml index 938ab4d33..f7a936c0f 100644 --- a/config/locales/devise/devise.nn.yml +++ b/config/locales/devise/devise.nn.yml @@ -50,7 +50,6 @@ nn: change_password: "Endra passordet mitt" new: forgot_password: "Har du gløymt passordet ditt?" - no_account: "Det finst ingen konto med denne e-postadressa. Om du ventar på ein invitasjon, skal du veta at vi sender dei ut så fort vi kan." send_password_instructions: "Send meg opplysningar om korleis nullstilla passordet" send_instructions: "Om ei lita stund vil du få ein e-post med opplysningar om korleis du kan nullstilla passordet ditt." updated: "Passordet ditt vart endra. Du er no pålogga." diff --git a/config/locales/devise/devise.oc.yml b/config/locales/devise/devise.oc.yml index aaa1d1c00..7c3d8d285 100644 --- a/config/locales/devise/devise.oc.yml +++ b/config/locales/devise/devise.oc.yml @@ -62,7 +62,6 @@ oc: new: email: "Adreça de corrièl" forgot_password: "Avètz oblidat vòstre senhal ?" - no_account: "Cap de compte es pas associat a aquesta adreça de corrièr electronic." reset_password: "Reïnicializar lo senhal" send_password_instructions: "Mandar las instruccions de reïnicializacion de senhal" no_token: "Podètz pas accedir a aquesta pagina sens venir d'un corrièl de reïnicializacion de senhal. S'es lo cas, mercés de vos assegurar qu'avètz utilizat l'URL completa." diff --git a/config/locales/devise/devise.pa.yml b/config/locales/devise/devise.pa.yml index 36f3cc881..90d4af823 100644 --- a/config/locales/devise/devise.pa.yml +++ b/config/locales/devise/devise.pa.yml @@ -40,7 +40,6 @@ pa: change_password: "ਮੇਰਾ ਪਾਸਵਰਡ ਬਦਲੋ" new: forgot_password: "ਆਪਣਾ ਪਾਸਵਰਡ ਭੁੱਲ ਗਏ ਹੋ?" - no_account: "No account with this email exsists. If you are waiting for an invite, we are rolling them out as soon as possible" updated: "ਤੁਹਾਡਾ ਪਾਸਵਰਡ ਠੀਕ ਤਹ੍ਹਾਂ ਬਦਲਿਆ ਗਿਆ ਹੈ। ਹੁਣ ਤੁਸੀਂ ਸਾਈਨ ਇਨ ਕਰ ਸਕਦੇ ਹੋ।" sessions: new: diff --git a/config/locales/devise/devise.pl.yml b/config/locales/devise/devise.pl.yml index ce7dbc522..9c420e58e 100644 --- a/config/locales/devise/devise.pl.yml +++ b/config/locales/devise/devise.pl.yml @@ -62,7 +62,6 @@ pl: new: email: "Adres e-mail" forgot_password: "Nie pamiętasz hasła?" - no_account: "Konto z podanym adresem e-mail nie istnieje" reset_password: "Resetuj hasło" send_password_instructions: "Wyślij mi instrukcję resetowania hasła" no_token: "Nie możesz pomyślnie odwiedzić tej strony w inny sposób niż poprzez kliknięcie odnośnika w e-mailu resetu hasła. Jeśli znalazłeś się tutaj właśnie przez tego typu e-mail, upewnij się, że kliknąłeś lub wkleiłeś pełny adres URL." diff --git a/config/locales/devise/devise.pt-BR.yml b/config/locales/devise/devise.pt-BR.yml index 10a698c59..9abf94b9b 100644 --- a/config/locales/devise/devise.pt-BR.yml +++ b/config/locales/devise/devise.pt-BR.yml @@ -62,7 +62,6 @@ pt-BR: new: email: "Endereço de email" forgot_password: "Esqueceu sua senha?" - no_account: "Não há nenhuma conta com este email" reset_password: "Resetar senha" send_password_instructions: "Envie-me instruções para redefinir minha senha." no_token: "Você só pode acessar esta página a partir de um e-mail de recuperação de senha. Se esse é o caso, certifique-se que usou o URL fornecido completo." diff --git a/config/locales/devise/devise.pt-PT.yml b/config/locales/devise/devise.pt-PT.yml index f0a1cbbc0..b617786ae 100644 --- a/config/locales/devise/devise.pt-PT.yml +++ b/config/locales/devise/devise.pt-PT.yml @@ -53,7 +53,6 @@ pt-PT: new: email: "Endereço de e-mail" forgot_password: "Esqueceu a sua palavra-passe?" - no_account: "Não existe nenhuma conta com este e-mail." reset_password: "Redefinir palavra-passe" send_password_instructions: "Enviem-me instruções para redefinir a minha palavra-passe" send_instructions: "Dentro de alguns minutos irá receber uma mensagem com as instruções sobre como redefinir a sua palavra-passe." diff --git a/config/locales/devise/devise.ro.yml b/config/locales/devise/devise.ro.yml index e748a7a6e..3060240e8 100644 --- a/config/locales/devise/devise.ro.yml +++ b/config/locales/devise/devise.ro.yml @@ -51,7 +51,6 @@ ro: change_password: "Schimbă-mi parola" new: forgot_password: "Aţi uitat parola?" - no_account: "Nici un cont cu acest e-mail există. Dacă sunteţi în aşteptare pentru o invitaţie, le vom trimite cât mai curând posibil.\n" send_password_instructions: "Trimite-mi instrucţiunile pentru a reseta parola" send_instructions: "În scurt timp veți primi un email cu instrucțiuni pentru resetarea parolei." updated: "Parolă schimbată cu success. Sunteți acum autentificat(ă)." diff --git a/config/locales/devise/devise.ru.yml b/config/locales/devise/devise.ru.yml index da78c65de..8e4721f5d 100644 --- a/config/locales/devise/devise.ru.yml +++ b/config/locales/devise/devise.ru.yml @@ -62,7 +62,6 @@ ru: new: email: "E-mail" forgot_password: "Забыли пароль?" - no_account: "Аккаунт с таким E-mail не существует" reset_password: "Сброс пароля" send_password_instructions: "Отправить мне инструкции по сбросу пароля" no_token: "Эта страница доступна только из письма по сбросу пароля. Если вы пришли по ссылке из такого письма, то удостоверьтесь, что использовали полный путь, указаный в ссылке." diff --git a/config/locales/devise/devise.sc.yml b/config/locales/devise/devise.sc.yml index 5bec014de..3df2ef529 100644 --- a/config/locales/devise/devise.sc.yml +++ b/config/locales/devise/devise.sc.yml @@ -62,7 +62,6 @@ sc: new: email: "Indiritzu de p. eletrònica" forgot_password: "As ismentigadu sa crae tua?" - no_account: "Non b'est unu contu cun custu indiritzu de p. eletrònica" reset_password: "Torra a impostare sa crae" send_password_instructions: "Imbia·mi sas istrutziones pro torrare a impostare sa crae" no_token: "Non podes intrare in custa pàgina chene partire dae una lìtera de posta eletrònica pro s'impostatzione de sa crae. Si benis dae una de cussas lìteras ista atentu a impreare s'URL intreu frunidu." diff --git a/config/locales/devise/devise.sk.yml b/config/locales/devise/devise.sk.yml index bdb57702d..5f8a5f94b 100644 --- a/config/locales/devise/devise.sk.yml +++ b/config/locales/devise/devise.sk.yml @@ -55,7 +55,6 @@ sk: new: email: "E-mailová adresa" forgot_password: "Zabudol (-la) si heslo?" - no_account: "Účet s takouto e-mailovou adresou neexistuje" reset_password: "Obnoviť heslo" send_password_instructions: "Pošlite mi pokyny na zmenu hesla" no_token: "Na túto stránku sa môžeš dostať iba z e-mailu na obnovenie hesla. Ak ideš z neho, skontroluj, či si zadal/a/ celú URL adresu." diff --git a/config/locales/devise/devise.sl.yml b/config/locales/devise/devise.sl.yml index ec82852d2..93ce69bea 100644 --- a/config/locales/devise/devise.sl.yml +++ b/config/locales/devise/devise.sl.yml @@ -50,7 +50,6 @@ sl: change_password: "Spremeni geslo" new: forgot_password: "Ste pozabili geslo?" - no_account: "Uporabniški račun s tem e-naslovom ne obstaja. V kolikor še čakate na povabilo, vas prosimo za potrpljenje." send_password_instructions: "Pošlji navodila za ponastavitev gesla" send_instructions: "V nekaj minutah boste prejeli e-pošto z navodili za ponastavitev vašega gesla." updated: "Vaše geslo je bilo uspešno spremenjeno. Zdaj ste prijavljeni." diff --git a/config/locales/devise/devise.sr.yml b/config/locales/devise/devise.sr.yml index 7b30bcb74..004f438e9 100644 --- a/config/locales/devise/devise.sr.yml +++ b/config/locales/devise/devise.sr.yml @@ -50,7 +50,6 @@ sr: change_password: "Промени лозинку" new: forgot_password: "Заборавили сте лозинку?" - no_account: "Не постоји налог са овим имејлом.  Ако чекаш позивницу, послаћемо је што пре можемо." send_password_instructions: "Пошаљите ми упутство за промену лозинке." send_instructions: "За пар минута ћеш примити имејл са упутством како да промениш лозинку." updated: "Успешно сте променили лозинку. Сада сте пријављени." diff --git a/config/locales/devise/devise.sv.yml b/config/locales/devise/devise.sv.yml index 1d61a9201..c06282c09 100644 --- a/config/locales/devise/devise.sv.yml +++ b/config/locales/devise/devise.sv.yml @@ -62,7 +62,6 @@ sv: new: email: "E-postadress" forgot_password: "Har du glömt ditt lösenord?" - no_account: "Det finns inget konto med den här e-postadressen." reset_password: "Återställ lösenord" send_password_instructions: "Skicka information om hur jag återställer lösenordet" no_token: "Du får inte tillgång till den här sidan utan en länk för att ställa in ett nytt lösenord via e-post. Om du kom hit genom en sådan, kontrollera att de använde hela URL:en som angavs." diff --git a/config/locales/devise/devise.te.yml b/config/locales/devise/devise.te.yml index 86209d875..5d48241d1 100644 --- a/config/locales/devise/devise.te.yml +++ b/config/locales/devise/devise.te.yml @@ -54,7 +54,6 @@ te: new: email: "ఈమెయిలు చిరునామా" forgot_password: "మీ సంకేతపదాన్ని మర్చిపోయారా?" - no_account: "ఈ ఈమెయిలుతో ఎటువంటి ఖాతా లేదు" reset_password: "సంకేతపదం మళ్ళీపెట్టు" send_password_instructions: "నాకు పాస్వర్డ్ను పునరుద్ధరించడానికి సూచనలను పంపండి" send_instructions: "మీకు కొన్ని నిమిషాల్లో మీ సంకేతపదాన్ని పునరుద్ధరించడానికి సూచనలతో ఈమెయిల్ వస్తుంది." diff --git a/config/locales/devise/devise.tr.yml b/config/locales/devise/devise.tr.yml index 84b08e113..0e2da8375 100644 --- a/config/locales/devise/devise.tr.yml +++ b/config/locales/devise/devise.tr.yml @@ -50,7 +50,6 @@ tr: change_password: "Parola değiştirme" new: forgot_password: "Parolanızı mı unuttunuz?" - no_account: "Bu e-posta adresiyle alınmış hesap bulunmamaktadır. Eğer bir davetiye için bekliyorsanız, en kısa zamanda size ulaştıracağız." send_password_instructions: "Bana parola yenileme talimatları gönder" send_instructions: "Bir kaç dakika içerisinde parolanızı nasıl sıfırlayacağınızı açıklayan bir e-posta alacaksınız." updated: "Parolanız değiştirilmiştir. Şu anda giriş yapmış bulunuyorsunuz." diff --git a/config/locales/devise/devise.uk.yml b/config/locales/devise/devise.uk.yml index 0dc4c8487..7ffdf12af 100644 --- a/config/locales/devise/devise.uk.yml +++ b/config/locales/devise/devise.uk.yml @@ -62,7 +62,6 @@ uk: new: email: "E-mail" forgot_password: "Забули пароль?" - no_account: "Аккаунт з таким E-mail не існує" reset_password: "Зміна паролю" send_password_instructions: "Відправити мені інструкції зі скидання пароля" no_token: "Ви не можете отримати доступ до цієї сторінки, не прийшовши скидання пароля з електронної пошти. Якщо ви прийшли з електронної пошти для скидання пароля, будь ласка, переконайтеся, що ви використовували повний URL." diff --git a/config/locales/devise/devise.vi.yml b/config/locales/devise/devise.vi.yml index 09a40f957..f78be7f0b 100644 --- a/config/locales/devise/devise.vi.yml +++ b/config/locales/devise/devise.vi.yml @@ -50,7 +50,6 @@ vi: change_password: "Đổi mật khẩu" new: forgot_password: "Quên mật khẩu?" - no_account: "Không có tài khoản nào với địa chỉ thư điện tử này. Nếu bạn đang chờ để được mời, chúng tôi sẽ cố gắng sớm nhất có thể" send_password_instructions: "Gửi cho tôi hướng dẫn thiết đặt lại mật khẩu" send_instructions: "Bạn sẽ nhận được thư chứa chỉ dẫn cách thiết lập lại mật khẩu trong ít phút nữa." updated: "Đã đổi mật khẩu. Bạn đã đăng nhập." diff --git a/config/locales/devise/devise.zh-CN.yml b/config/locales/devise/devise.zh-CN.yml index 531f6fe6e..58bf44649 100644 --- a/config/locales/devise/devise.zh-CN.yml +++ b/config/locales/devise/devise.zh-CN.yml @@ -50,7 +50,6 @@ zh-CN: change_password: "修改密码" new: forgot_password: "忘记密码?" - no_account: "暂无与此邮箱关联的帐号。如果您在等待邀请函, 我们将尽快寄出." send_password_instructions: "请向我发送密码重置步骤" send_instructions: "几分钟内您将收到一封包含密码重置步骤的邮件。" updated: "密码修改成功。您已经登入了。" diff --git a/config/locales/devise/devise.zh-TW.yml b/config/locales/devise/devise.zh-TW.yml index b34378975..44f636034 100644 --- a/config/locales/devise/devise.zh-TW.yml +++ b/config/locales/devise/devise.zh-TW.yml @@ -62,7 +62,6 @@ zh-TW: new: email: "電子信箱" forgot_password: "忘記密碼了嗎?" - no_account: "沒有和這個電子信箱關聯的帳號" reset_password: "重設密碼" send_password_instructions: "傳送密碼重設的步驟給我" no_token: "這個頁面只給重設密碼的電子郵件使用。如果你真的是點密碼重設信件過來的,請確定用的是信件中完整的網址。" diff --git a/config/locales/diaspora/bg.yml b/config/locales/diaspora/bg.yml index ea39a0833..0743109c9 100644 --- a/config/locales/diaspora/bg.yml +++ b/config/locales/diaspora/bg.yml @@ -510,6 +510,41 @@ bg: follow: "Следете #%{tag}" none: "Не съществува празна марка!" stop_following: "Прекратяване следването на #%{tag}" + two_factor_auth: + activated: + change_button: "Деактивирай" + change_label: "Деактивирайте двуфакторното удостоверяване, като въведете Вашата парола" + status: "Двуфакторното удостоверяване е активирано." + confirm: + activate_button: "Потвърди и активирай" + input_explanation: "След като сканирате или въведете тайната, въведете 6-цифровия код, който виждате и потвърдете настройката." + input_title: "Потвърди с ВБЕП ключ." + manual_explanation: "В случай, че не можете да сканирате QR кода автоматично, можете ръчно да въведете тайната във Вашето приложение." + manual_explanation_cont: "Ние използваме времево-базирани еднократни пароли (ВБЕП) с 6-цифрови ключове. В случай, че Вашето приложение поиска времеви интервал и алгоритъм, въведете съответно 30 секунди и sha1.
Интервалите са просто за по-лесно четене, моля, въведете кода без тях." + scan_explanation: "Моля, сканирайте QR кода с ВБЕП приложение, като andOTP (Андроид), FreeOTP (iOS), SailOTP (SailfishOS)." + scan_title: "Сканирай QR кода" + status: "Двуфакторното удостоверяване все още не е напълно активирано. Трябва да потвърдите активацията с ВБЕП ключ." + title: "Потвърждение на активирането" + deactivated: + change_button: "Активирай" + change_label: "Активиране на двуфакторно удостоверяване" + status: "Двуфакторното удостоверяване не е активирано." + explanation: "Двуфакторното удостоверяване е мощен начин да сте сигурни, че Вие сте единственият, който може да се вписва във Вашия акаунт. Когато се вписвате, ще въвеждате 6-цифрен код заедно с Вашата парола, за да докажете, че сте Вие. Но внимавайте: ако изгубите телефона си и кодовете за възстановяване, които сте създали, когато активирате тази услига, достъпът до Вашия акаунт в Диаспора ще бъде блокиран завинаги." + flash: + error_token: "Ключът е неправилен или невалиден" + success_activation: "Успешно активирано двуфакторно удостоверяване" + success_deactivation: "Успешно деактивирано двуфакторно удостоверяване" + input_token: + label: "Двуфакторен ключ" + placeholder: "6-цифров двуфакторен ключ" + recovery: + button: "Генерирай нови кодове за възстановяване" + explanation: "Ако някога изгубите достъп до телефона си, можете да ползвате някой от кодовете за възстановяване по-долу, за да получите достъп до акаунта си. Пазете кодовете за възстановяване на сигурно място. Например, можете да ги разпечатате на принтер и да ги съхранявате заедно с други важни документи." + explanation_short: "Кодовете за възстановяване Ви позволяват да получите достъп до акаунта си, ако изгубите Вашия телефон. Помнете, че можете да използвате всеки код за възстановяване само по веднъж." + invalidation_notice: "Ако сте изгубили Вашите кодове за възстановяване, можете да генерирате нови тук. Старите Ви кодове ще бъдат анулирани." + reminder: "Като алтернатива, можете да ползвате някой от кодовете за възстановяване." + title: "Кодове за възстановяване" + title: "Двуфакторно удостоверяване" username: "Потребителско име" users: confirm_email: diff --git a/config/locales/diaspora/da.yml b/config/locales/diaspora/da.yml index 1ba72e8bc..39b599da8 100644 --- a/config/locales/diaspora/da.yml +++ b/config/locales/diaspora/da.yml @@ -117,7 +117,7 @@ da: are_you_sure_lock_account: "Er du sikker på at du vil låse denne konto?" are_you_sure_unlock_account: "Er du sikker på at du vil genåbne denne konto?" close_account: "Luk konto" - delete_admin: "%{name} er blevet fjernet fra admin-listen" + delete_admin: "%{name} er blevet fjernet fra admin-listen." delete_moderator: "%{name} er blevet fjernet fra moderator-listen." delete_spotlight: "%{name} er blevet fjernet fra community spotlight." does_not_exist: "Brugeren eksisterer ikke!" @@ -169,6 +169,9 @@ da: login_required: "Du skal logge ind for at kunne autorisere denne applikation" title: "Ups! Noget gik galt :(" scopes: + aud: + description: "Dette giver aud tilladelser til applicationen" + name: "aud" name: description: "Dette giver applikationen adgang til dit navn" name: "navn" @@ -205,7 +208,7 @@ da: tos: "Se applikationens servicevilkår" are_you_sure: "Er du sikker?" are_you_sure_delete_account: "Er du helt sikker på at du ønsker at lukke din konto? Det kan ikke fortrydes!" - are_you_sure_ignore_user: "Vil du ignorere denne bruger. Er du sikker?" + are_you_sure_ignore_user: "Du er ved at ignorere denne bruger. Er du sikker?" aspect_memberships: destroy: failure: "Kunne ikke fjerne person fra aspekt." @@ -485,7 +488,7 @@ da: format_text_q: "Hvordan kan jeg formatere teksten i mine indlæg (fed, kursiv, osv.)?" hide_posts_a: "Hvis du peger med musen på toppen af et indlæg vil et X dukke op til højre. Tryk på det for at skjule indlægget og fjerne notifikationer om det. Du kan stadig se indlægget hvis du besøger den person der lavede indlæggets profilside." hide_posts_q: "Hvordan skjuler jeg et indlæg?" - ignore_user_a1: "Hvis du deler med den pågældende person, vil det at fjerne dem fra dine aspekter stoppe de fleste af deres indlæg fra at vises i din strøm. En mere gennemgribende metode er at \"ignorere\" denne konto. Dette forhindrer, at deres indlæg vises i din strøm, og de kan ikke længere lide eller kommentere dine indlæg. De vil dog stadig være i stand til at videresende dine indlæg, kommentere videredelinger af dine indlæg, og deres kommentarer til indlæg fra andre personer der vises i din strøm, vil stadig være synlige for dig." + ignore_user_a1: "Hvis du deler med den pågældende person, vil det at fjerne dem fra dine aspekter stoppe de fleste af deres indlæg fra at vises i din strøm. En mere gennemgribende metode er at \"ignorere\" denne konto. Dette forhindrer, at deres indlæg vises i din strøm, og de kan ikke længere synes om eller kommentere dine indlæg. De vil dog stadig være i stand til at videredele dine indlæg, kommentere videredelinger af dine indlæg, og deres kommentarer til indlæg fra andre personer der vises i din strøm, vil stadig være synlige for dig." ignore_user_a2: "For at ignorere en konto skal du klikke på ikonet \"ignorér\" (en cirkel med en diagonal linje gennem) øverst til højre for et af deres indlæg. Deres indlæg forsvinder øjeblikkeligt fra din strøm. Alternativt kan du gå til deres profilside og klikke på ignoreringsikonet der. Du kan stadig se deres indlæg på deres profilside eller ved at bruge single-postvisningen." ignore_user_a3: "En liste over personer, du ignorerer, findes i dine kontoindstillinger under Privatliv. Hvis du vil stoppe med at ignorere nogen, skal du fjerne dem fra listen på den pågældende side." ignore_user_q: "Hvordan sørger jeg for at en brugers indlæg ikke optræder i min strøm?" @@ -643,6 +646,8 @@ da: public_feed: "Offentligt Diaspora-nyhedsfeed for %{name}" source_package: "Download kildekoden" statistics_link: "Pod statistik" + switch_to_standard_mode: "Skift til standard tilstand" + switch_to_touch_optimized_mode: "Skift til touch-optimeret tilstand" whats_new: "Hvad er nyt?" header: code: "Kode" @@ -1193,6 +1198,41 @@ da: one: "En person har brugt %{tag} tag" other: "%{count} personer har brugt %{tag} tag" zero: "Ingen har brugt %{tag} tag" + two_factor_auth: + activated: + change_button: "Deaktiver" + change_label: "Deaktiver to-faktor godkendelse ved at indtaste dit kodeord" + status: "To-faktor godkendelse aktiveret" + confirm: + activate_button: "Bekræft og aktiver" + input_explanation: "Efter at have skannet eller indtastet hemmeligheden skal du indtaste den sekscifrede kode du ser og bekræfte opsætningen." + input_title: "Bekræft med TOTP token" + manual_explanation: "Hvis du ikke kan scanne QR-koden automatisk, kan du manuelt indtaste hemmeligheden i din app." + manual_explanation_cont: "Vi bruger tidsbaserede engangsadgangskoder (TOTP) med sekscifrede symboler. Hvis din app beder dig om et tidsinterval og en algoritme, indtaster du 30 sekunder og sha1.
Mellemrummene er der kun for bedre læsbarhed. Indtast koden uden dem." + scan_explanation: "Skan venligst QR-koden med en TOTP-kompatibel app, f.eks. OgOTP (Android), FreeOTP (iOS), SailOTP (SailfishOS)." + scan_title: "Skan QR koden" + status: "To-faktor godkendelse er ikke fuldt aktiveret endnu. Du skal bekræfte aktivering med et TOTP-token" + title: "Bekræft aktivering" + deactivated: + change_button: "Aktiver" + change_label: "Aktiver to-faktor godkendelse" + status: "To-faktor godkendelse ikke aktiveret" + explanation: "To-faktor godkendelse er en effektiv måde at sikre, at du er den eneste, der kan logge ind på din konto. Når du logger ind, indtaster du en 6-cifret kode sammen med dit kodeord for at bevise din identitet. Husk dog at være forsigtig: hvis du mister din telefon og genoprettelseskoderne der oprettes når du aktiverer denne funktion, vil adgang til din Diaspora-konto blive blokeret for altid." + flash: + error_token: "Token var forkert eller ugyldigt" + success_activation: "Vellykket aktivering af to-faktor godkendelse" + success_deactivation: "Vellykket deaktivering af to-faktor godkendelse" + input_token: + label: "To-faktor token" + placeholder: "sekscifret to-faktor token" + recovery: + button: "Generer nye gendannelseskoder" + explanation: "Hvis du mister adgang til din telefon, kan du bruge en af genoprettelseskoderne nedenfor for at genvinde adgangen til din konto. Hold genoprettelseskoderne sikre. Du kan f.eks. udskrive dem og gemme dem sammen med andre vigtige dokumenter." + explanation_short: "Gendannelseskoder giver dig mulighed for at få adgang til din konto hvis du mister din telefon. Bemærk at du kun kan bruge hver genopretningskode én gang." + invalidation_notice: "Hvis du har mistet dine gendannelseskoder, kan du regenerere dem her. Dine gamle gendannelseskoder bliver herefter gjort ugyldige." + reminder: "Alternativt kan du bruge en af gendannelseskoderne." + title: "Gendannelseskoder" + title: "To-faktor godkendelse" username: "Brugernavn" users: confirm_email: @@ -1241,7 +1281,7 @@ da: new_password: "Nyt adgangskode" private_message: "... du har modtaget en privat besked." protocol_handler: - browser: "Denne protokol er i øjeblikket i den eksperimentelle fase, og om de interaktioner der bruger protokollen virker er afhængigt af din browser. Hvis du vil styre eller fjerne denne handler, gør du det via dine browserindstillinger. Knappen nedenfor vil altid være aktiveret, og du skal sætte handleren separat i hver browser du bruger." + browser: "Denne protokol er i øjeblikket i den eksperimentelle fase, og om de interaktioner der bruger protokollen virker, er afhængigt af din browser. Hvis du vil styre eller fjerne denne handler, gør du det via dine browserindstillinger. Knappen nedenfor vil altid være aktiveret, og du skal sætte handleren separat i hver browser du bruger." description: "web + diaspora: // er en ny webprotokol, som vi har introduceret. Ethvert link til en Diaspora-side på et eksternt websted der bruger denne protokol, kan åbnes i den pod hvor din Diaspora-konto er registreret. Klik på knappen nedenfor for at indstille din browser til at bruge %{pod_url} for at genkende eksterne web + diaspora: // links." register: "Registrer web+diaspora:// handler i denne browser" title: "web+diaspora:// protokol handler" diff --git a/config/locales/diaspora/de.yml b/config/locales/diaspora/de.yml index 662b22e6a..425848f97 100644 --- a/config/locales/diaspora/de.yml +++ b/config/locales/diaspora/de.yml @@ -208,6 +208,7 @@ de: tos: "Die Nutzungsbedingungen der Anwendung ansehen" are_you_sure: "Bist du dir sicher?" are_you_sure_delete_account: "Möchtest du dein Konto wirklich schließen? Dieser Schritt kann nicht rückgängig gemacht werden!" + are_you_sure_ignore_user: "Bist du sicher das du den Nutzer ignorieren möchtest?" aspect_memberships: destroy: failure: "Die Person konnte nicht aus dem Aspekt entfernt werden." @@ -645,6 +646,7 @@ de: public_feed: "Öffentlicher diaspora* Feed von %{name}" source_package: "Quelltextpaket runterladen" statistics_link: "Pod-Statistiken" + switch_to_standard_mode: "In den Standard-Modus wechseln" switch_to_touch_optimized_mode: "Wechseln zum touch-optimierten Modus" whats_new: "Was gibt’s Neues?" header: diff --git a/config/locales/diaspora/es-CL.yml b/config/locales/diaspora/es-CL.yml index b111fe1fc..9a4d81071 100644 --- a/config/locales/diaspora/es-CL.yml +++ b/config/locales/diaspora/es-CL.yml @@ -673,6 +673,20 @@ es-CL: follow: "Seguir a #%{tag}" none: "¡La etiqueta vacía no existe!" stop_following: "Dejar de seguir a #%{tag}" + two_factor_auth: + activated: + change_label: "Desactiva la verificación en dos pasos ingresando tu contraseña" + status: "Verificación en dos pasos activada" + confirm: + status: "La verificación en dos pasos no está completamente activada. Necesitas confirmar la activación con un token TOTP." + deactivated: + change_label: "Activar la verificación en dos pasos" + status: "La verificación en dos pasos no está activada" + explanation: "La verificación en dos pasos es una forma poderosa de asegurar que seas el único que puede acceder a tu cuenta. Al iniciar sesión, ingresarás un código de 6 dígitos junto a tu contraseña para demostrar tu identidad. Ten cuidado: si pierdes tu teléfono y los códigos de recuperación creados cuando actives esta característica, el acceso a tu cuenta de diaspora* será bloquedo para siempre." + flash: + success_activation: "Verificación en dos pasos activada exitosamente" + success_deactivation: "Verificación en dos pasos desactivada exitosamente" + title: "Verificación en dos pasos" username: "Nombre de usuario" users: confirm_email: diff --git a/config/locales/diaspora/fr.yml b/config/locales/diaspora/fr.yml index 64ca24f37..6b74d24c8 100644 --- a/config/locales/diaspora/fr.yml +++ b/config/locales/diaspora/fr.yml @@ -1183,6 +1183,43 @@ fr: one: "1 personne marquée avec %{tag}" other: "%{count} personnes marquées avec %{tag}" zero: "Personne n'est marqué avec %{tag}" + two_factor_auth: + activated: + change_button: "Désactiver" + change_label: "Désactivez la double authentification en saisissant votre mot de passe" + status: "La double authentification est activée" + confirm: + activate_button: "Confirmer et activer" + input_explanation: "Après avoir scanné ou saisi le secret, entrez le code à 6 chiffres affiché par l'application pour confirmer la mise en place de la double authentification." + input_title: "Confirmer avec un jeton TOTP" + manual_explanation: "Si vous ne pouvez pas scanner le code QR, vous pouvez saisir le secret manuellement dans votre application." + manual_explanation_cont: |- + Nous utilisons des codes à usage unique TOTP de 6 chiffres. Si votre application vous demande un intervalle de temps et un algorithme, choisissez 30 secondes et sha1 respectivement.
+ Les espaces sont juste ajoutés par souci de lisibilité, merci de les ignorer à la saisie. + scan_explanation: "Merci de scanner le code QR avec une application TOTP, telle que andOTP (Android), FreeOTP (iOS), SailOTP (SailfishOS)." + scan_title: "Scannez le code QR" + status: "La double authentification n'est pas encore complétement activée, vous devez confirmer l'activation avec un jeton TOTP" + title: "Confirmer l'activation" + deactivated: + change_button: "Activer" + change_label: "Activer la double authentification" + status: "Double authentification inactive" + explanation: "La double authentification est un moyen efficace de garantir que vous serez le seul à pouvoir vous identifier avec votre compte. À la connexion, vous saisirez un code à 6 chiffres en plus de votre mot de passe afin de prouver votre identité. Soyez prudent néanmoins : si vous égarez votre téléphone et vos codes de récupération créés à l'activation de cette fonctionnalité, vous perdrez définitivement l'accès à votre compte diaspora*." + flash: + error_token: "Le jeton est incorrect ou invalide" + success_activation: "Double authentification activée avec succès" + success_deactivation: "Double authentification désactivée avec succès" + input_token: + label: "Jeton de double authentification" + placeholder: "jeton de double authentification à 6 chiffres" + recovery: + button: "Générer des nouveaux codes de récupération" + explanation: "Si vous perdez l'accès à votre téléphone, vous pouvez utiliser l'un de ces codes de récupération pour récupérer l'accès à votre compte diaspora*. Gardez ces codes dans un lieu sûr. Par exemple, vous pouvez les imprimer et les ranger avec vos autres documents importants." + explanation_short: "Les codes de récupération vous permettent de récupérer l'accès à votre compte si vous perdez votre téléphone. Notez que chaque code de récupération ne peut être utilisé qu'une seule fois." + invalidation_notice: "Si vous avez perdu vos codes de récupération, vous pouvez les générer à nouveau ici. Vos précédents codes seront invalidés." + reminder: "Sinon, vous pouvez utiliser l'un de ces codes de récupération." + title: "Codes de récupération" + title: "Double authentification" username: "Nom d'utilisateur" users: confirm_email: diff --git a/config/locales/diaspora/hu.yml b/config/locales/diaspora/hu.yml index fa9c5cb52..f9f5e0e5a 100644 --- a/config/locales/diaspora/hu.yml +++ b/config/locales/diaspora/hu.yml @@ -281,9 +281,11 @@ hu: account_and_data_management: close_account_a: "Kattints a beállítások oldal alján található \"Fiók törlése\" gombra." close_account_q: "Hogyan törölhetek egy magot (a felhasználói fiókomat)?" + data_other_podmins_a: "Amikor egy másik pod felhasználójával megosztasz valamit, az adott kiszolgáló az összes megosztott bejegyzést, illetve a profiladataidról készült másolatot tárolja a saját adatbázisában (cache-eli), amelyek ezáltal hozzáférhetővé válnak az azt karbantartó személy számára. Ha törölsz egy bejegyzést vagy egy profiladatot, az törlődik az általad használt podról, amelyik ekkor törlési kérést küld az összes olyan pod felé, ahol korábban ez az adat már tárolódott. A képeid kizárólag a te kiszolgálódon rögzülnek, más podok csak hivatkozásokat kapnak róluk." data_other_podmins_q: "Más podok üzemeltetői láthatják az adataimat?" - data_visible_to_podmin_a: "Röviden: mindent. A podok közötti kapcsolat mindig titkosított (a diaspora* a saját protokollját és SSL-t használ), de a podokon tárolt adatok nincsenek kódolva. Ha az adott pod adatbázisának karbantartója (általában az a személy, aki a podot üzemelteti) szeretné, hozzáférhet minden profiladatodhoz és minden bejegyzésedhez (ahogy az a legtöbb felhasználói adatot tároló weboldalnál lenni szokott). Ezért hagyjuk meg neked a választás lehetőségét, hogy arra a podra iratkozz fel, amelyikre szeretnél, s hogy te dönthess, melyik pod rendszergazdájára bízod az adataidat. A saját podod üzemeltetése magasabb biztonságot jelent, hiszen te szabályozod az adatbázishoz való hozzáférést." + data_visible_to_podmin_a: "Röviden: mindent. A podok közötti kapcsolat mindig titkosított (a diaspora* a saját protokollját és SSL-t használ), de a podokon tárolt adatok nincsenek kódolva. Ha az adott pod adatbázisának karbantartója (általában az a személy, aki a podot üzemelteti) szeretné, hozzáférhet minden profiladatodhoz és minden bejegyzésedhez (ahogy az a legtöbb, felhasználói adatot tároló weboldalnál lenni szokott). Ezért hagyjuk meg neked a választás lehetőségét, hogy arra a podra iratkozz fel, amelyikre szeretnél, s hogy te dönthesd el, melyik pod rendszergazdájára bízod az adataidat. Saját pod üzemeltetése nagyobb biztonságot jelent, hiszen te szabályozod az adatbázishoz való hozzáférést." data_visible_to_podmin_q: "Mennyi adatot láthat rólam az általam használt pod üzemeltetője?" + download_data_a: "Igen. A Beállítások oldal \"felhasználói fiók\" nevű fülén találsz két gombot legalul: egyet az adataid letöltéséhez, egyet pedig a fényképeid letöltéséhez." download_data_q: "Letölthetek egy másolatot a magban (a felhasználói fiókomban) található összes adatomról?" move_pods_a: "A diaspora* 0.7.0.0 számú verziója megvalósítja a fiók elköltöztetésének első lépcsőfokát: mostantól letöltheted az összes adatodat a beállítások / felhasználói fiók / adatok letöltése menüpontban. Tartsd őket biztonságban! Egy későbbi kiadásban lehetőséged lesz a teljes fiókodat áttelepíteni egy másik podra, beleértve a bejegyzéseidet és az ismerőseid listáját is." move_pods_q: "Hogy tudom áthelyezni ezt a magot (a fiókomat) az egyik podról a másikra?" diff --git a/config/locales/diaspora/ia.yml b/config/locales/diaspora/ia.yml index 7a8401808..0f0dcb551 100644 --- a/config/locales/diaspora/ia.yml +++ b/config/locales/diaspora/ia.yml @@ -90,15 +90,18 @@ ia: week: "Septimana" user_entry: account_closed: "Conto claudite" + admin: "Administrator" diaspora_handle: "ID de diaspora*" email: "E-mail" guid: "GUID" id: "ID" invite_token: "Indicio de invitation" last_seen: "Ultime session" + moderator: "Moderator" ? "no" : "No" nsfw: "#nsfw" + spotlight: "In evidentia" unknown: "Incognite" ? "yes" : Si @@ -106,14 +109,29 @@ ia: account_closing_scheduled: "Le conto de %{name} es planate a esser claudite. Illo essera processate in alcun momentos…" account_locking_scheduled: "Le conto de %{name} es planate a esser blocate. Illo essera processate in alcun momentos…" account_unlocking_scheduled: "Le conto de %{name} es planate a esser disblocate. Illo essera processate in alcun momentos…" + add_admin: "%{name} ha essite facite administrator." add_invites: "Adder invitationes" + add_moderator: "%{name} ha essite facite moderator." + add_spotlight: "%{name} ha essite addite a \"Usatores in evidentia\"." are_you_sure: "Es tu secur de voler clauder iste conto?" are_you_sure_lock_account: "Es tu secur de voler blocar iste conto?" are_you_sure_unlock_account: "Es tu secur de voler disblocar iste conto?" close_account: "Clauder conto" + delete_admin: "%{name} ha essite removite del lista de administratores." + delete_moderator: "%{name} ha essite removite del lista de moderatores." + delete_spotlight: "%{name} ha essite removite de \"Usatores in evidentia\"." + does_not_exist: "Usator non existe!" email_to: "Adresse de e-mail a invitar" invite: "Invitar" lock_account: "Blocar conto" + make_admin: "Facer administrator" + make_moderator: "Facer moderator" + make_spotlight: "Adder a \"Usatores in evidentia\"" + remove_admin: "Remover como administrator" + remove_moderator: "Remover como moderator" + remove_spotlight: "Remover de \"Usatores in evidentia\"" + role_implemented: "%{name} ha jam recipite iste rolo!" + role_removal_implemented: "%{name} ha jam essite removite de iste rolo!" under_13: "Monstrar usatores con minus de 13 annos (COPPA)" unlock_account: "Disblocar conto" users: @@ -766,7 +784,7 @@ ia: body: |- Hallo %{name}, - Le tue datos personal ha essite processate e preparate pro discargamento. Pro discargar, seque [iste ligamine](%{url}). + Le archivo de tu datos personal ha essite preparate pro discargamento via [iste ligamine](%{url}). Amicalmente, @@ -946,7 +964,7 @@ ia: edit: allow_search: "Permitter que on te cerca in diaspora*" basic: "Mi profilo basic" - basic_hint: "Cata elemento de profilo es facultative. Le profilo basic es sempre visibile pro le publico." + basic_hint: "Cata elemento de tu profilo es optional. Le profilo basic es sempre visibile pro le publico." extended: "Mi profilo extendite" extended_hint: "Clicca sur le commutator pro definir le visibilitate de tu profilo extendite. \"Public\" vole dicer que illo es visibile pro tote le internet, \"limitate\" vole dicer que solmente le personas in tu aspectos de contacto videra iste information." extended_visibility_text: "Visibilitate de tu profilo extendite:" @@ -1197,7 +1215,7 @@ ia: edit_account: "Modificar conto" email_awaiting_confirmation: "Nos te ha inviate un ligamine de activation al adresse %{unconfirmed_email}. Usque al momento que tu seque iste ligamine pro activar le nove adresse, nos va continuar a usar tu adresse original %{email}." export_data: "Exportar datos" - export_in_progress: "Le datos personal tue es actualmente sub preparation. Per favor, reveni in alcun momentos." + export_in_progress: "Nos prepara in iste momento un archivo de tu datos personal. Per favor, reveni in alcun momentos." export_photos_in_progress: "Le tractamento de tu photos non ha ancora terminate. Per favor, essaya lo de novo in qualque momentos." following: "Configuration de divider" last_exported_html: "(Ultime actualisation %{timeago})" @@ -1207,8 +1225,9 @@ ia: new_password: "Contrasigno nove" private_message: "tu recipe un message private" protocol_handler: - description: "Un clic sur iste button demandara a tu navigator web de installar un gestor que permitte a nos de aperir le adresses URL web+diaspora:// sur tu pod principal. Isto es ancora experimental e le interactiones dependera de tu navigator web specific." - register: "Registrar" + browser: "Iste protocollo es actualmente in le stadio experimental e le successo del interactiones que lo usa dependera de tu navigator del web. Si tu vole modificar o remover iste gestor, tu debe facer lo via le configuration de tu navigator. Le button hic infra essera sempre activate, e tu debera configurar le gestor separatemente in cata navigator que tu usa." + description: "web+diaspora:// es un nove protocollo web que nos ha introducite. Omne ligamine a un pagina diaspora* sur un sito web externe que usa iste protocollo pote esser aperite in le pod que alberga tu conto diaspora*. Clicca sur le button hic infra pro facer que tu navigator del web usa %{pod_url} pro recognoscer le ligamines web+diaspora:// externe." + register: "Registrar le gestor web+diaspora:// sur iste navigator" title: "Gestor de protocollo web+diaspora://" receive_email_notifications: "Reciper notificationes per e-mail quando:" request_export: "Requestar le datos de mi profilo" diff --git a/config/locales/diaspora/it.yml b/config/locales/diaspora/it.yml index 5ca893ce6..c4f76f057 100644 --- a/config/locales/diaspora/it.yml +++ b/config/locales/diaspora/it.yml @@ -866,6 +866,40 @@ it: follow: "Segui #%{tag}" none: "Il tag vuoto non esiste!" stop_following: "Non seguire più #%{tag}" + two_factor_auth: + activated: + change_button: "Disattiva" + change_label: "Per disattivare l'autenticazione a due fattori inserire la propria password" + status: "Autenticazione a due fattori attivata" + confirm: + activate_button: "Confermare e attivare" + input_explanation: "Dopo avere scansionato o inserito il codice segreto inserite il codice di 6 cifre che vedrete sullo schermo e confermate il setup." + input_title: "Confermare con token TOTP" + manual_explanation: "Nel caso non sia possibile acquisire automaticamente il QR code è possibile inserire il codice segreto nell'app." + manual_explanation_cont: "Noi usiamo time-based one-time passwords (TOTP) con token di 6 cifre. Nel caso in cui la vostra app vi chieda un intervallo di tempo e l'algoritmo inserite rispettivamente un tempo di 30 secondi e il valore sha1.
Gli spazi sono inseriti solo per la leggibilità, inserite il codice senza di essi." + scan_explanation: "Si prega di scansionare il QR code con una app predisposta per il TOTP come AndOTP (Android), FreeOTP (iOS), SAilOTP (Sailfish OS)." + scan_title: "Scansionare il QR code" + status: "L'autenticazione a due fattori non è ancora pienamente attiva, è necessario confermate l'attivazione con un token TOTP" + title: "Confermare attivazione" + deactivated: + change_button: "Attivare" + change_label: "Attivare l'autenticazione a due fattori" + status: "Autenticazione a due fattori non attivata" + explanation: "L'autenticazione a due fattori è uno strumento potente per darvi la certezza di essere la sola persona in grado di accedere al vostro account. Al momento di collegarvi, dovrete inserire assieme alla vostra password un codice a 6 cifre per provare la vostra identità. Dovrete però stare attenti: se perdete il telefono e i codici di ripristino che verranno creati all'attivazione della funzionalità il vostro account su diaspora* sarà bloccato per sempre." + flash: + error_token: "Token sbagliato o non valido" + success_activation: "Autenticazione a due fattori attivata" + success_deactivation: "Autenticazione a due fattori disattivata" + input_token: + label: "Token a due fattori" + placeholder: "token a due fattori di sei cifre" + recovery: + button: "Generare i nuovi codici di recupero" + explanation: "Se non fosse più possibile accedere al proprio telefono, è ancora possibile usare uno dei seguenti codici di recupero per ottenere nuovamente l'accesso al proprio account. Tenete al sicuro questi codici, ad esempio stampandoli e conservandoli assieme agli altri documenti importanti." + explanation_short: "I codici di recupero permettono di riottenere l'accesso al proprio account in caso di smarrimento del telefono. Notare che ogni codice di recupero può essere utilizzato una volta sola." + invalidation_notice: "In caso di smarrimento dei codici di recupero possono essere rigenerati qui. I codici di recupero precedenti verranno invalidati." + reminder: "Come alternativa potete usare uno dei codici di recupero." + title: "Codici di recupero" username: "Nome Utente" users: confirm_email: diff --git a/config/locales/diaspora/ja.yml b/config/locales/diaspora/ja.yml index e67346183..0096821cc 100644 --- a/config/locales/diaspora/ja.yml +++ b/config/locales/diaspora/ja.yml @@ -97,6 +97,7 @@ ja: ? "no" : いいえ nsfw: "#nsfw" + spotlight: "スポットライト" unknown: "不明" ? "yes" : はい @@ -107,20 +108,26 @@ ja: add_admin: "%{name} さんは管理者に指定された。" add_invites: "招待を追加" add_moderator: "%{name} さんはモデレータとして指名された" + add_spotlight: "%{name} さんがコミュニティのスポットライトに追加されました。" are_you_sure: "このアカウントを削除してもよろしいですか?" are_you_sure_lock_account: "このアカウントをロックしてもよろしいですか?" are_you_sure_unlock_account: "このアカウントのロックを解除してもよろしいですか?" close_account: "アカウントを削除する" delete_admin: "%{name} さんは管理者から外された。" delete_moderator: "%{name} さんはモデレータから外された" + delete_spotlight: "%{name} さんがコミュニティのスポットライトから削除されました。" does_not_exist: "そのユーザは存在しません。" email_to: "招待のメール" invite: "招待" lock_account: "アカウントをロックする" make_admin: "このユーザーを管理者に指名する" make_moderator: "このユーザーをモデレーターに指名する" + make_spotlight: "コミュニティのスポットライトに追加する" remove_admin: "このユーザーを管理者から外す" remove_moderator: "このユーザーをモデレーターから外す" + remove_spotlight: "コミュニティのスポットライトから削除する" + role_implemented: "%{name} さんはすでにこの役割が与えられています!" + role_removal_implemented: "%{name} さんはすでにこの役割が削除されています!" under_13: "13歳以下のユーザーに表示する (COPPA)" unlock_account: "アカウントのロックを解除する" users: @@ -1144,6 +1151,41 @@ ja: tagged_people: other: "%{count} 人が %{tag} でタグ付けしています" zero: "誰も %{tag} でタグ付けしていません" + two_factor_auth: + activated: + change_button: "無効にする" + change_label: "パスワードを入力して2要素認証を無効にします" + status: "2要素認証を有効にしました" + confirm: + activate_button: "確認して有効にする" + input_explanation: "スキャンまたはシークレットを入力したら、表示された6桁のコードを入力して設定を確認します。" + input_title: "TOTPトークンで確認" + manual_explanation: "自動的にQRコードをスキャンできない場合は、手動でアプリにシークレットを入力できます。" + manual_explanation_cont: "6桁のトークンを使用した、時間ベースのワンタイムパスワード (TOTP) を使用しています。 アプリが、時間間隔とアルゴリズムを入力するように要求した場合は、それぞれ30秒とsha1を入力してください。
スペースは読みやすくするためのものです。スペースを入れずにコードを入力してください。" + scan_explanation: "andOTP (Android), FreeOTP (iOS), SailOTP (SailfishOS) などのTOTP対応アプリでQRコードをスキャンしてください。" + scan_title: "QRコードをスキャン" + status: "2要素認証はまだ完全に有効になっていません。TOTPトークンで有効化を確認する必要があります" + title: "有効化の確認" + deactivated: + change_button: "有効にする" + change_label: "2要素認証を有効にする" + status: "2要素認証は有効になっていません" + explanation: "2要素認証は、自分のアカウントにサインインできる唯一の人であることを確認するための強力な方法です。 サインインするときに、あなたのIDを証明するためにパスワードと共に6桁のコードを入力します。 ただし、ご注意ください。携帯電話を紛失したときや、この機能を有効にしたときに作成された回復コードをなくした場合は、ダイアスポラ* アカウントのアクセスは永久にブロックされます。" + flash: + error_token: "トークンが間違っているか無効です" + success_activation: "2要素認証を有効にしました" + success_deactivation: "2要素認証を無効にしました" + input_token: + label: "2要素トークン" + placeholder: "6桁の2要素トークン" + recovery: + button: "新しい回復コードを生成する" + explanation: "お使いの携帯電話にアクセスできなくなった場合、アカウントにアクセスできるようにするために下記の回復コードを一つ使うことができます。 回復コードを安全に保管してください。 例えば、それらを印刷して他の重要な書類と共に保存することができます。" + explanation_short: "回復コードを使用すると、お使いの携帯電話を紛失した場合でもアカウントへのアクセスを取り戻すことができます。 それぞれの回復コードは1回しか使用できません。" + invalidation_notice: "回復コードを紛失した場合は、ここで再生成できます。 古い回復コードは無効になります。" + reminder: "あるいは、回復コードを1つ使用することができます。" + title: "回復コード" + title: "2 要素認証" username: "ユーザー名" users: confirm_email: @@ -1192,6 +1234,7 @@ ja: new_password: "新しいパスワード" private_message: "非公開メッセージが届いたとき" protocol_handler: + browser: "このプロトコルは現在実験段階で、それを使ったインタラクションが成功するかどうかはご利用のブラウザに依存します。 この処理を管理または削除したい場合は、ブラウザの設定でこれを行ってください。 下のボタンは常に有効になっているので、使用するブラウザごとに個別に処理を設定する必要があります。" description: "このボタンをクリックするとホームポッドの web+diaspora:// URLを開くことができるハンドラをインストールするようにブラウザに要求されます。これは現在実験中で対応はブラウザによって異なります。" register: "登録" title: "web+diaspora:// プロトコルハンドラ" diff --git a/config/locales/diaspora/pt-BR.yml b/config/locales/diaspora/pt-BR.yml index 68344f888..ca57342ef 100644 --- a/config/locales/diaspora/pt-BR.yml +++ b/config/locales/diaspora/pt-BR.yml @@ -1176,6 +1176,41 @@ pt-BR: one: "1 pessoa marcada com %{tag}" other: "%{count} pessoas marcadas com %{tag}" zero: "Ninguém marcado com %{tag}" + two_factor_auth: + activated: + change_button: "Desativar" + change_label: "Insira sua senha para desativar a autenticação em duas etapas" + status: "Autenticação em duas etapas ativada" + confirm: + activate_button: "Confirmar e ativar" + input_explanation: "Depois de escanear ou digitar a senha, insira o código de seis dígitos que apareceu para você e confirme." + input_title: "Confirme com o código TOTP" + manual_explanation: "Caso não possa escanear o código QR de forma automática, digite a senha manualmente no aplicativo." + manual_explanation_cont: "Usamos senhas únicas baseadas em tempo (TOTP) com códigos de seis dígitos. Caso o seu aplicativo pergunte intervalo de tempo e algoritmo, insira 30 segundos e sha1, respectivamente.
Os espaços servem apenas para melhorar a legibilidade; por favor, digite o código sem eles." + scan_explanation: "Por favor, escaneie o código QR com um aplicativo que leia TOTP, tal como andOTP (Android), FreeOTP (iOS), SailOTP (SailfishOS)." + scan_title: "Escaneie o código QR" + status: "A autenticação em duas etapas ainda não foi ativada completamente; você precisa confirmar a ativação com um código TOTP." + title: "Confirmar ativação" + deactivated: + change_button: "Ativar" + change_label: "Ativar autenticação em duas etapas" + status: "Autenticação em duas etapas desativada" + explanation: "A autenticação em duas etapas é uma maneira eficiente de garantir que você seja a única pessoa capaz de entrar na sua conta. Ao entrar, você terá que digitar um código de seis dígitos além da sua senha para provar a sua identidade. Mas cuidado: se você perder seu celular e os códigos de recuperação criados durante a ativação deste recurso, o acesso à sua conta na diaspora* será bloqueado para sempre." + flash: + error_token: "Código incorreto ou inválido" + success_activation: "Autenticação em duas etapas ativada com sucesso" + success_deactivation: "Autenticação em duas etapas desativada com sucesso" + input_token: + label: "Código de autenticação" + placeholder: "código de autenticação com seis dígitos" + recovery: + button: "Gerar novos códigos de recuperação" + explanation: "Se algum dia você perder o seu celular, você pode usar um dos códigos de recuperação abaixo para recuperar o acesso à sua conta. Guarde-os em segurança. Por exemplo, você pode imprimi-los e armazená-los junto com outros documentos importantes." + explanation_short: "Códigos de recuperação permitem que você recupere o acesso à conta caso você perca seu celular. Repare que você só pode usar cada código uma única vez." + invalidation_notice: "Se você perder seus códigos de recuperação, pode regerá-los aqui. Os antigos serão invalidados." + reminder: "Uma alternativa é usar um dos códigos de recuperação." + title: "Códigos de recuperação" + title: "Autenticação em duas etapas" username: "Usuário" users: confirm_email: diff --git a/config/locales/diaspora/sv.yml b/config/locales/diaspora/sv.yml index f7266bb75..bc3ec6f71 100644 --- a/config/locales/diaspora/sv.yml +++ b/config/locales/diaspora/sv.yml @@ -90,15 +90,18 @@ sv: week: "Vecka" user_entry: account_closed: "Konto borttaget" + admin: "Administratör" diaspora_handle: "Diaspora*-id" email: "E-post" guid: "Globalt identifieringsnummer (GUID)" id: "id" invite_token: "Inbjudningskort" last_seen: "Sedd senast" + moderator: "Moderator" ? "no" : Nej nsfw: "#nsfw" + spotlight: "Strålkastarljus" unknown: "Okänd" ? "yes" : Ja @@ -106,14 +109,29 @@ sv: account_closing_scheduled: "Kontot för %{name} är låst och kommer att raderas om en stund." account_locking_scheduled: "Kontot för användaren %{name} är schemalagt för att låsas. Det kommer ske om en liten stund..." account_unlocking_scheduled: "Kontot för användaren %{name} är schemalagt för att låsas upp. Det kommer ske om en liten stund..." + add_admin: "%{name} har skapats som admin." add_invites: "Lägg till inbjudningar" + add_moderator: "%{name} har gjorts till moderator." + add_spotlight: "%{name} har lagts till i strålkastarljuset." are_you_sure: "Är du säker på att du vill ta bort ditt konto?" are_you_sure_lock_account: "Är du säker på att du vill låsa detta konto?" are_you_sure_unlock_account: "Är du säker på att du vill låsa upp detta konta?" close_account: "Ta bort konto" + delete_admin: "%{name} har tagits bort från administratörslistan." + delete_moderator: "%{name} har tagits bort från moderatorlistan." + delete_spotlight: "%{name} har tagits ut ur strålkastarljuset." + does_not_exist: "Användare finns inte!" email_to: "Skicka ett e-brev för att bjuda in" invite: "Bjud in" lock_account: "Lås konto" + make_admin: "Skapa admin" + make_moderator: "Skapa moderator" + make_spotlight: "Lägg till i strålkastarljuset" + remove_admin: "Ta bort som admin" + remove_moderator: "Ta bort som moderator" + remove_spotlight: "Ta bort ur strålkastarljustet" + role_implemented: "%{name} har redan tillgivits rollen!" + role_removal_implemented: "%{name} har redan ifråntagits rollen!" under_13: "Visa användare som är yngre än 13 år" unlock_account: "Lås upp konto" users: @@ -190,6 +208,7 @@ sv: tos: "Kika på tillämpningens användarvillkor." are_you_sure: "Är du säker?" are_you_sure_delete_account: "Är du säker på att du vill avsluta ditt konto? Detta kan inte ångras!" + are_you_sure_ignore_user: "Du kommer att ignorera användaren. Är du säker på din sak?" aspect_memberships: destroy: failure: "Kunde inte ta bort personen från aspekten" @@ -627,6 +646,8 @@ sv: public_feed: "Offentligt Diaspora*-flöde för %{name}" source_package: "Ladda ned källkodspaketet" statistics_link: "Serverstatistik" + switch_to_standard_mode: "Ändra till standardläge." + switch_to_touch_optimized_mode: "Ändra till fingervänligt läge." whats_new: "Vad är nytt?" header: code: "Källkod" @@ -1164,6 +1185,21 @@ sv: one: "En person är taggad med %{tag}" other: "%{count} personer är taggade med %{tag}" zero: "Ingen har taggats med %{tag}" + two_factor_auth: + activated: + change_button: "Inaktivera" + change_label: "Inaktivera tvåfaktorautentisering med ditt lösenord" + status: "Tvåfaktorautentisering aktiverat" + confirm: + scan_title: "Läs in QR-kod" + status: "Tvåfaktorautentisering har inte the fullo aktiverats än. Du behöver verifiera med en TOTP-pollett." + title: "Bekräfta aktivering" + deactivated: + change_button: "Aktivera" + change_label: "Aktivera tvåfaktorautentisering" + status: "Tvåfaktorautentisering inaktiverat" + explanation: "Tvåfaktorautentisering är ett kraftfullt sätt att försäkra om att det bara är du som kan logga in på ditt konto. När du loggar in, kommer du ange en sexsiffrig kod tillsammans med ditt löseord för att påvisa din identitet. Men var ändock aktsam: om du blir av med din telefon och koderna som genereras för denna funktionalitet, kommer du aldrig kunna komma åt ditt konto igen." + title: "Tvåfaktorautentisering" username: "Användarnamn" users: confirm_email: diff --git a/config/locales/javascript/javascript.da.yml b/config/locales/javascript/javascript.da.yml index 53c645d05..2a35067ef 100644 --- a/config/locales/javascript/javascript.da.yml +++ b/config/locales/javascript/javascript.da.yml @@ -133,6 +133,7 @@ da: recent_notifications: "Seneste notifikationer" search: "Søg" settings: "Indstillinger" + switch_to_touch_optimized_mode: "Skift til touch-optimeret tilstand" toggle_navigation: "Slå navigation til/fra" view_all: "Se alle" hide_post: "Skjul dette indlæg?" diff --git a/config/locales/javascript/javascript.de.yml b/config/locales/javascript/javascript.de.yml index 5903b4129..7b8ec8bda 100644 --- a/config/locales/javascript/javascript.de.yml +++ b/config/locales/javascript/javascript.de.yml @@ -133,6 +133,7 @@ de: recent_notifications: "Neuste Benachrichtigungen" search: "Suchen" settings: "Einstellungen" + switch_to_touch_optimized_mode: "In den touch-optimierten Modus wechseln" toggle_navigation: "Navigation umschalten" view_all: "Alle anzeigen" hide_post: "Diesen Beitrag ausblenden?" diff --git a/config/locales/javascript/javascript.ja.yml b/config/locales/javascript/javascript.ja.yml index 2ef3f4121..18b593cbd 100644 --- a/config/locales/javascript/javascript.ja.yml +++ b/config/locales/javascript/javascript.ja.yml @@ -53,15 +53,15 @@ ja: up_to_date: "ポッドは最新です!" and: "および" aspect_dropdown: - add_to_aspect: "Add to aspect" + add_to_aspect: "アスペクトに追加" all_aspects: "全てのアスペクト" error: "<%= name %>さんとシェアを始めることができません。 無視しますか?" error_remove: "アスペクトから<%= name %>さんを削除できませんでした :(" mobile_row_checked: "<%= name %> (削除)" mobile_row_unchecked: "<%= name %> (追加)" select_aspects: "アスペクトを選択する" - started_sharing_with: "You have started sharing with <%= name %>!" - stopped_sharing_with: "You have stopped sharing with <%= name %>." + started_sharing_with: "<%= name %>さんとシェアを始めました!" + stopped_sharing_with: "<%= name %>さんとシェアをやめました。" toggle: other: "<%= count %> アスペクトに" zero: "<%= count %> アスペクトに" @@ -87,7 +87,7 @@ ja: hide: "コメントを隠す" no_comments: "まだコメントはありません。" show: "全てのコメントを表示する" - confirm_dialog: "本当にいいですか。" + confirm_dialog: "よろしいですか?" confirm_unload: "このページを離れることを確認してください。入力したデータは保存されません。" contacts: add_contact: "連絡先を追加" @@ -111,7 +111,7 @@ ja: failed_to_remove: "エントリーの削除に失敗しました!" getting_started: alright_ill_wait: "OK、私は待ちます。" - hey: "Hey, <%= name %>!" + hey: "こんにちは。 <%= name %> さん!" no_tags: "タグを何もフォローしていません!続行しますか?" preparing_your_stream: "パーソナライズ ストリームを準備しています..." header: From d5b7c6d779774454e60e8a6ed7bd1e2c001a43da Mon Sep 17 00:00:00 2001 From: Benjamin Neff Date: Tue, 21 May 2019 01:11:32 +0200 Subject: [PATCH 25/81] Don't relay others relayable on archive import --- lib/archive_importer/entity_importer.rb | 2 +- lib/diaspora/federation/receive.rb | 41 ++++++++++--------- .../archive_importer/entity_importer_spec.rb | 22 +++++++++- spec/lib/diaspora/federation/receive_spec.rb | 8 ++-- spec/models/photo_spec.rb | 2 +- 5 files changed, 47 insertions(+), 28 deletions(-) diff --git a/lib/archive_importer/entity_importer.rb b/lib/archive_importer/entity_importer.rb index 6314c9e21..9ed4d04f9 100644 --- a/lib/archive_importer/entity_importer.rb +++ b/lib/archive_importer/entity_importer.rb @@ -11,7 +11,7 @@ class ArchiveImporter end def import - self.persisted_object = Diaspora::Federation::Receive.perform(entity) + self.persisted_object = Diaspora::Federation::Receive.perform(entity, skip_relaying: true) rescue DiasporaFederation::Entities::Signable::SignatureVerificationFailed, DiasporaFederation::Discovery::InvalidDocument, DiasporaFederation::Discovery::DiscoveryError, diff --git a/lib/diaspora/federation/receive.rb b/lib/diaspora/federation/receive.rb index 7148c2521..7ab52c2b0 100644 --- a/lib/diaspora/federation/receive.rb +++ b/lib/diaspora/federation/receive.rb @@ -5,8 +5,8 @@ module Diaspora module Receive extend Diaspora::Logging - def self.perform(entity) - public_send(Mappings.receiver_for(entity), entity) + def self.perform(entity, opts={}) + public_send(Mappings.receiver_for(entity), entity, opts) end def self.account_deletion(entity) @@ -17,9 +17,9 @@ module Diaspora logger.warn "ignoring error on receive AccountDeletion:#{entity.author}: #{e.class}: #{e.message}" end - def self.account_migration(entity) + def self.account_migration(entity, opts) old_person = author_of(entity) - profile = profile(entity.profile) + profile = profile(entity.profile, opts) return if AccountMigration.where(old_person: old_person, new_person: profile.person).exists? AccountMigration.create!(old_person: old_person, new_person: profile.person) rescue => e # rubocop:disable Lint/RescueWithoutErrorClass @@ -28,8 +28,8 @@ module Diaspora nil end - def self.comment(entity) - receive_relayable(Comment, entity) do + def self.comment(entity, opts) + receive_relayable(Comment, entity, opts) do Comment.new( author: author_of(entity), guid: entity.guid, @@ -40,7 +40,7 @@ module Diaspora end end - def self.contact(entity) + def self.contact(entity, _opts) recipient = Person.find_by(diaspora_handle: entity.recipient).owner if entity.sharing Contact.create_or_update_sharing_contact(recipient, author_of(entity)) @@ -50,7 +50,7 @@ module Diaspora end end - def self.conversation(entity) + def self.conversation(entity, _opts) author = author_of(entity) ignore_existing_guid(Conversation, entity.guid, author) do Conversation.create!( @@ -64,8 +64,8 @@ module Diaspora end end - def self.like(entity) - receive_relayable(Like, entity) do + def self.like(entity, opts) + receive_relayable(Like, entity, opts) do Like.new( author: author_of(entity), guid: entity.guid, @@ -75,13 +75,13 @@ module Diaspora end end - def self.message(entity) + def self.message(entity, _opts) ignore_existing_guid(Message, entity.guid, author_of(entity)) do build_message(entity).tap(&:save!) end end - def self.participation(entity) + def self.participation(entity, _opts) author = author_of(entity) ignore_existing_guid(Participation, entity.guid, author) do Participation.create!( @@ -92,7 +92,7 @@ module Diaspora end end - def self.photo(entity) + def self.photo(entity, _opts) author = author_of(entity) persisted_photo = load_from_database(Photo, entity.guid, author) @@ -114,8 +114,8 @@ module Diaspora end end - def self.poll_participation(entity) - receive_relayable(PollParticipation, entity) do + def self.poll_participation(entity, opts) + receive_relayable(PollParticipation, entity, opts) do PollParticipation.new( author: author_of(entity), guid: entity.guid, @@ -125,7 +125,7 @@ module Diaspora end end - def self.profile(entity) + def self.profile(entity, _opts) author_of(entity).profile.tap do |profile| profile.update_attributes( first_name: entity.first_name, @@ -145,7 +145,7 @@ module Diaspora end end - def self.reshare(entity) + def self.reshare(entity, _opts) author = author_of(entity) ignore_existing_guid(Reshare, entity.guid, author) do Reshare.create!( @@ -178,7 +178,7 @@ module Diaspora end end - def self.status_message(entity) + def self.status_message(entity, _opts) # rubocop:disable Metrics/AbcSize try_load_existing_guid(StatusMessage, entity.guid, author_of(entity)) do StatusMessage.new( author: author_of(entity), @@ -257,8 +257,9 @@ module Diaspora end end - private_class_method def self.receive_relayable(klass, entity) - save_relayable(klass, entity) { yield }.tap {|relayable| relay_relayable(relayable) if relayable } + private_class_method def self.receive_relayable(klass, entity, opts) + save_relayable(klass, entity) { yield } + .tap {|relayable| relay_relayable(relayable) if relayable && !opts[:skip_relaying] } end private_class_method def self.save_relayable(klass, entity) diff --git a/spec/lib/archive_importer/entity_importer_spec.rb b/spec/lib/archive_importer/entity_importer_spec.rb index 969368ce2..ecc11b49a 100644 --- a/spec/lib/archive_importer/entity_importer_spec.rb +++ b/spec/lib/archive_importer/entity_importer_spec.rb @@ -23,7 +23,7 @@ describe ArchiveImporter::EntityImporter do it "runs entity receive routine" do expect(Diaspora::Federation::Receive).to receive(:perform) - .with(kind_of(DiasporaFederation::Entities::StatusMessage)) + .with(kind_of(DiasporaFederation::Entities::StatusMessage), skip_relaying: true) .and_call_original instance.import @@ -59,7 +59,7 @@ describe ArchiveImporter::EntityImporter do it "runs entity receive routine" do expect(Diaspora::Federation::Receive).to receive(:perform) - .with(kind_of(DiasporaFederation::Entities::Comment)) + .with(kind_of(DiasporaFederation::Entities::Comment), skip_relaying: true) .and_call_original instance.import comment = Comment.find_by(guid: guid) @@ -67,6 +67,24 @@ describe ArchiveImporter::EntityImporter do expect(comment.author).to eq(author.person) end + it "does not relay a remote comment during import" do + comment_author = FactoryGirl.build(:user) + comment_author.person.owner = nil + comment_author.person.pod = Pod.find_or_create_by(url: "http://example.net") + comment_author.person.save! + + status_message = FactoryGirl.create(:status_message, author: alice.person, public: true) + comment_data = Fabricate.attributes_for(:comment_entity, + author: comment_author.diaspora_handle, + parent_guid: status_message.guid).tap do |data| + data[:author_signature] = Fabricate(:comment_entity, data).sign_with_key(comment_author.encryption_key) + end + + expect(Diaspora::Federation::Dispatcher).not_to receive(:defer_dispatch) + + ArchiveImporter::EntityImporter.new(Fabricate(:comment_entity, comment_data).to_json.as_json, nil).import + end + it "rescues DiasporaFederation::Entities::Signable::SignatureVerificationFailed" do expect(Person).to receive(:find_or_fetch_by_identifier) .with(author.diaspora_handle) diff --git a/spec/lib/diaspora/federation/receive_spec.rb b/spec/lib/diaspora/federation/receive_spec.rb index 1b3e087e7..9e345dc25 100644 --- a/spec/lib/diaspora/federation/receive_spec.rb +++ b/spec/lib/diaspora/federation/receive_spec.rb @@ -43,7 +43,7 @@ describe Diaspora::Federation::Receive do } it "saves the account deletion" do - Diaspora::Federation::Receive.account_migration(account_migration_entity) + Diaspora::Federation::Receive.perform(account_migration_entity) expect(AccountMigration.exists?(old_person: sender, new_person: new_person)).to be_truthy end @@ -53,7 +53,7 @@ describe Diaspora::Federation::Receive do expect(AccountMigration).not_to receive(:create!) - expect(Diaspora::Federation::Receive.account_migration(account_migration_entity)).to be_nil + expect(Diaspora::Federation::Receive.perform(account_migration_entity)).to be_nil expect(AccountMigration.exists?(old_person: sender, new_person: new_person)).to be_truthy end @@ -64,7 +64,7 @@ describe Diaspora::Federation::Receive do raise "Some database error" end - expect(Diaspora::Federation::Receive.account_migration(account_migration_entity)).to be_nil + expect(Diaspora::Federation::Receive.perform(account_migration_entity)).to be_nil expect(AccountMigration.exists?(old_person: sender, new_person: new_person)).to be_truthy end @@ -757,7 +757,7 @@ describe Diaspora::Federation::Receive do end it "does not overwrite the photos if they already exist" do - received_photo = Diaspora::Federation::Receive.photo(photo1) + received_photo = Diaspora::Federation::Receive.perform(photo1) received_photo.text = "foobar" received_photo.save! diff --git a/spec/models/photo_spec.rb b/spec/models/photo_spec.rb index 225d609a8..0b4996506 100644 --- a/spec/models/photo_spec.rb +++ b/spec/models/photo_spec.rb @@ -197,7 +197,7 @@ describe Photo, :type => :model do @saved_photo.destroy - Diaspora::Federation::Receive.photo(federation_photo) + Diaspora::Federation::Receive.perform(federation_photo) new_photo = Photo.find_by(guid: @saved_photo.guid) expect(new_photo.url).to eq(url) From 1227f34b2a12cd840baf1cb70fccb3b289df3203 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonne=20Ha=C3=9F?= Date: Thu, 23 May 2019 18:13:00 +0200 Subject: [PATCH 26/81] Pass normalized URI to OpenGraphReader This ensures the hostname is downcase and thus subsequent third party library assumptions hold, namely http-cookie (pulled through faraday-cookie_jar) doesn't raise closes #8021 --- Changelog.md | 1 + app/models/open_graph_cache.rb | 4 +++- spec/models/open_graph_cache_spec.rb | 21 +++++++++++++++++++-- 3 files changed, 23 insertions(+), 3 deletions(-) diff --git a/Changelog.md b/Changelog.md index 904b9b895..16e59a54e 100644 --- a/Changelog.md +++ b/Changelog.md @@ -3,6 +3,7 @@ ## Refactor ## Bug fixes +* Improve handling of mixed case hostnames while fetching OpenGraph data [#8021](https://github.com/diaspora/diaspora/pull/8021) ## Features * Add line mentioning diaspora\* on the splash page [#7966](https://github.com/diaspora/diaspora/pull/7966) diff --git a/app/models/open_graph_cache.rb b/app/models/open_graph_cache.rb index dc297f25b..e23fe9c7b 100644 --- a/app/models/open_graph_cache.rb +++ b/app/models/open_graph_cache.rb @@ -33,7 +33,9 @@ class OpenGraphCache < ApplicationRecord end def fetch_and_save_opengraph_data! - object = OpenGraphReader.fetch!(self.url) + uri = URI.parse(url.start_with?("http") ? url : "http://#{url}") + uri.normalize! + object = OpenGraphReader.fetch!(uri) return unless object diff --git a/spec/models/open_graph_cache_spec.rb b/spec/models/open_graph_cache_spec.rb index 40d7eebd8..7bd0c81a4 100644 --- a/spec/models/open_graph_cache_spec.rb +++ b/spec/models/open_graph_cache_spec.rb @@ -8,7 +8,7 @@ describe OpenGraphCache, type: :model do describe "fetch_and_save_opengraph_data!" do context "with an unsecure video url" do it "doesn't save the video url" do - expect(OpenGraphReader).to receive(:fetch!).with("https://example.com/article/123").and_return( + expect(OpenGraphReader).to receive(:fetch!).with(URI.parse("https://example.com/article/123")).and_return( double( og: double( description: "This is the article lead", @@ -34,7 +34,7 @@ describe OpenGraphCache, type: :model do context "with a secure video url" do it "saves the video url" do - expect(OpenGraphReader).to receive(:fetch!).with("https://example.com/article/123").and_return( + expect(OpenGraphReader).to receive(:fetch!).with(URI.parse("https://example.com/article/123")).and_return( double( og: double( description: "This is the article lead", @@ -57,5 +57,22 @@ describe OpenGraphCache, type: :model do expect(ogc.video_url).to eq("https://bandcamp.com/EmbeddedPlayer/v=2/track=12/size=small") end end + + context "a mixed case hostname" do + it "downcases the hostname" do + stub_request(:head, "http:///wetter.com") + .with(headers: { + "Accept" => "text/html", + "User-Agent" => "OpenGraphReader/0.6.2 (+https://github.com/jhass/open_graph_reader)" + }) + .to_return(status: 200, body: "", headers: + {"Set-Cookie" => "Dabgroup=A;path=/;Expires=Thu, 23 May 2019 16:12:01 GMT;httpOnly"}) + + ogc = OpenGraphCache.new(url: "Wetter.com") + expect { + ogc.fetch_and_save_opengraph_data! + }.to_not raise_error + end + end end end From d8b3718a08eb30589a2eee0d285d3041277b3a77 Mon Sep 17 00:00:00 2001 From: flaburgan Date: Tue, 11 Jun 2019 13:00:03 +0200 Subject: [PATCH 27/81] Fix wrong padding for captcha label in registration form fixes #8016 closes #8028 --- app/assets/stylesheets/registration.scss | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/app/assets/stylesheets/registration.scss b/app/assets/stylesheets/registration.scss index 5fb2a2bc6..6fd755464 100644 --- a/app/assets/stylesheets/registration.scss +++ b/app/assets/stylesheets/registration.scss @@ -38,16 +38,13 @@ width: 120px; } - .captcha-input { + .form-control.captcha-input { border-bottom: 1px solid $input-border; border-bottom-left-radius: 5px; border-bottom-right-radius: 5px; box-sizing: border-box; - font-size: 16px; - height: 40px; line-height: $line-height-base; - padding: 10px 10px 10px 130px; - width: 100%; + padding-left: 130px; } .terms > a { From 78538d034a3fe90295bf9c4514359b2a882d3d13 Mon Sep 17 00:00:00 2001 From: flaburgan Date: Tue, 11 Jun 2019 13:32:08 +0200 Subject: [PATCH 28/81] Harmonize markdown titles sizes fixes #7757 closes #8029 --- Changelog.md | 1 + app/assets/stylesheets/markdown-content.scss | 24 ++++++++++++++++++++ 2 files changed, 25 insertions(+) diff --git a/Changelog.md b/Changelog.md index 16e59a54e..312916363 100644 --- a/Changelog.md +++ b/Changelog.md @@ -1,6 +1,7 @@ # 0.7.12.0 ## Refactor +* Harmonize markdown titles sizes [#8029](https://github.com/diaspora/diaspora/pull/8029) ## Bug fixes * Improve handling of mixed case hostnames while fetching OpenGraph data [#8021](https://github.com/diaspora/diaspora/pull/8021) diff --git a/app/assets/stylesheets/markdown-content.scss b/app/assets/stylesheets/markdown-content.scss index 6b092dbdb..c5813de21 100644 --- a/app/assets/stylesheets/markdown-content.scss +++ b/app/assets/stylesheets/markdown-content.scss @@ -16,6 +16,30 @@ } } + h1 { + font-size: 2.7rem; + } + + h2 { + font-size: 2.3rem; + } + + h3 { + font-size: 2rem; + } + + h4 { + font-size: 1.8rem; + } + + h5 { + font-size: 1.6rem; + } + + h6 { + font-size: 1.4rem; + } + .img-responsive { display: inline; } From ef31ea6b965f2955983429c7de784e3c2db6234a Mon Sep 17 00:00:00 2001 From: Benjamin Neff Date: Thu, 6 Jun 2019 02:19:17 +0200 Subject: [PATCH 29/81] Enable remember me for all forms fixes #8023 --- app/models/user.rb | 4 ++++ app/views/devise/passwords/edit.haml | 1 - app/views/sessions/_form.haml | 1 - 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/app/models/user.rb b/app/models/user.rb index 8d30efa97..8ab4f9be6 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -591,6 +591,10 @@ class User < ApplicationRecord end end + def remember_me + true + end + private def clearable_fields diff --git a/app/views/devise/passwords/edit.haml b/app/views/devise/passwords/edit.haml index 126ae62f4..28e2126ea 100644 --- a/app/views/devise/passwords/edit.haml +++ b/app/views/devise/passwords/edit.haml @@ -37,7 +37,6 @@ autocorrect: "off", aria: {labelledby: "passwordConfirmationLabel"} - = hidden_field(:user, :remember_me, value: 1) = f.submit t("devise.passwords.edit.change_password"), class: "btn btn-block btn-primary" .text-center diff --git a/app/views/sessions/_form.haml b/app/views/sessions/_form.haml index ba56cbf04..a4e608386 100644 --- a/app/views/sessions/_form.haml +++ b/app/views/sessions/_form.haml @@ -40,5 +40,4 @@ autocorrect: "off", aria: {labelledby: "passwordLabel"} - = f.hidden_field :remember_me, value: 1 = f.submit t("devise.sessions.new.sign_in"), class: "btn btn-large btn-block btn-primary" From 88e35d3f3a585c88d3b262b140d9052f3fb18ce8 Mon Sep 17 00:00:00 2001 From: Benjamin Neff Date: Sun, 16 Jun 2019 04:46:42 +0200 Subject: [PATCH 30/81] Use :database_authenticatable strategy to check password for OTP user This: * makes sure that after_database_authentication is called for users with enabled 2fa. * handles paranoid mode correctly --- app/controllers/sessions_controller.rb | 10 +++++----- config/initializers/devise.rb | 5 ----- 2 files changed, 5 insertions(+), 10 deletions(-) diff --git a/app/controllers/sessions_controller.rb b/app/controllers/sessions_controller.rb index 9d483a0cc..fc3aa97b3 100644 --- a/app/controllers/sessions_controller.rb +++ b/app/controllers/sessions_controller.rb @@ -19,14 +19,14 @@ class SessionsController < Devise::SessionsController def authenticate_with_2fa self.resource = find_user - u = find_user - return true unless u&.otp_required_for_login? + return true unless resource&.otp_required_for_login? if params[:user][:otp_attempt].present? && session[:otp_user_id] - authenticate_with_two_factor_via_otp(u) - elsif u&.valid_password?(params[:user][:password]) - prompt_for_two_factor(u) + authenticate_with_two_factor_via_otp(resource) + else + strategy = Warden::Strategies[:database_authenticatable].new(warden.env, :user) + prompt_for_two_factor(strategy.user) if strategy.valid? && strategy._run!.successful? end end diff --git a/config/initializers/devise.rb b/config/initializers/devise.rb index 327cef80e..5cb23cc6d 100644 --- a/config/initializers/devise.rb +++ b/config/initializers/devise.rb @@ -15,11 +15,6 @@ end # Use this hook to configure devise mailer, warden hooks and so forth. # Many of these configuration options can be set straight in your model. Devise.setup do |config| - config.warden do |manager| - manager.default_strategies(scope: :user).unshift :two_factor_authenticatable - manager.default_strategies(scope: :user).unshift :two_factor_backupable - end - # The secret key used by Devise. Devise uses this key to generate # random tokens. Changing this key will render invalid all existing # confirmation, reset password and unlock tokens in the database. From 5602dc4418d4c5bc3e8af4e0eaec22f7cf5699dd Mon Sep 17 00:00:00 2001 From: Benjamin Neff Date: Sun, 16 Jun 2019 04:48:56 +0200 Subject: [PATCH 31/81] Use username parameter first if present this makes sure we don't use an old otp_user_id from an old session closes #8031 --- Changelog.md | 1 + app/controllers/sessions_controller.rb | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/Changelog.md b/Changelog.md index 312916363..883529eba 100644 --- a/Changelog.md +++ b/Changelog.md @@ -5,6 +5,7 @@ ## Bug fixes * Improve handling of mixed case hostnames while fetching OpenGraph data [#8021](https://github.com/diaspora/diaspora/pull/8021) +* Fix "remember me" with two factor authentication enabled [#8031](https://github.com/diaspora/diaspora/pull/8031) ## Features * Add line mentioning diaspora\* on the splash page [#7966](https://github.com/diaspora/diaspora/pull/7966) diff --git a/app/controllers/sessions_controller.rb b/app/controllers/sessions_controller.rb index fc3aa97b3..e679c85a4 100644 --- a/app/controllers/sessions_controller.rb +++ b/app/controllers/sessions_controller.rb @@ -12,9 +12,9 @@ class SessionsController < Devise::SessionsController # rubocop:enable Rails/LexicallyScopedActionFilter def find_user - return User.find(session[:otp_user_id]) if session[:otp_user_id] + return User.find_for_authentication(username: params[:user][:username]) if params[:user][:username] - User.find_for_authentication(username: params[:user][:username]) if params[:user][:username] + User.find(session[:otp_user_id]) if session[:otp_user_id] end def authenticate_with_2fa From d674f5391046f27b62aa1d450bc1283fde0a8fd2 Mon Sep 17 00:00:00 2001 From: Benjamin Neff Date: Mon, 17 Jun 2019 01:18:12 +0200 Subject: [PATCH 32/81] Start 0.7.13.0 cycle --- Changelog.md | 8 ++++++++ config/defaults.yml | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/Changelog.md b/Changelog.md index 883529eba..ffc4bb5f3 100644 --- a/Changelog.md +++ b/Changelog.md @@ -1,3 +1,11 @@ +# 0.7.13.0 + +## Refactor + +## Bug fixes + +## Features + # 0.7.12.0 ## Refactor diff --git a/config/defaults.yml b/config/defaults.yml index d866ccec6..e50131b2e 100644 --- a/config/defaults.yml +++ b/config/defaults.yml @@ -4,7 +4,7 @@ defaults: version: - number: "0.7.11.99" # Do not touch unless doing a release, do not backport the version number that's in master + number: "0.7.12.99" # Do not touch unless doing a release, do not backport the version number that's in master heroku: false environment: url: "http://localhost:3000/" From 1e8a96d81786bf435931d6efaea1370dead43b02 Mon Sep 17 00:00:00 2001 From: Benjamin Neff Date: Tue, 25 Jun 2019 02:06:07 +0200 Subject: [PATCH 33/81] updated 64 locale files [ci skip] --- config/locales/devise/devise.pt-BR.yml | 2 +- config/locales/diaspora/ar.yml | 1 - config/locales/diaspora/be.yml | 88 +++++-- config/locales/diaspora/bg.yml | 1 - config/locales/diaspora/br.yml | 1 - config/locales/diaspora/bs.yml | 1 - config/locales/diaspora/cs.yml | 1 - config/locales/diaspora/da.yml | 8 +- config/locales/diaspora/de-CH.yml | 1 - config/locales/diaspora/de-moo.yml | 71 +++++- config/locales/diaspora/de.yml | 57 ++++- config/locales/diaspora/de_formal.yml | 69 ++++- config/locales/diaspora/el.yml | 1 - config/locales/diaspora/en_1337.yml | 1 - config/locales/diaspora/en_pirate.yml | 1 - config/locales/diaspora/en_shaw.yml | 1 - config/locales/diaspora/en_valspeak.yml | 1 - config/locales/diaspora/eo.yml | 1 - config/locales/diaspora/es-AR.yml | 1 - config/locales/diaspora/es-CL.yml | 1 - config/locales/diaspora/es-MX.yml | 1 - config/locales/diaspora/es.yml | 110 +++++--- config/locales/diaspora/eu.yml | 1 - config/locales/diaspora/fi.yml | 1 - config/locales/diaspora/fr.yml | 8 +- config/locales/diaspora/he.yml | 1 - config/locales/diaspora/hu.yml | 1 - config/locales/diaspora/hye-classical.yml | 1 - config/locales/diaspora/hye.yml | 1 - config/locales/diaspora/ia.yml | 3 +- config/locales/diaspora/is.yml | 1 - config/locales/diaspora/it.yml | 1 - config/locales/diaspora/ja.yml | 1 - config/locales/diaspora/ka.yml | 1 - config/locales/diaspora/ko.yml | 1 - config/locales/diaspora/la.yml | 2 +- config/locales/diaspora/lt.yml | 1 - config/locales/diaspora/mk.yml | 1 - config/locales/diaspora/ml.yml | 1 - config/locales/diaspora/nb.yml | 1 - config/locales/diaspora/nds.yml | 1 - config/locales/diaspora/nl.yml | 1 - config/locales/diaspora/nn.yml | 1 - config/locales/diaspora/oc.yml | 29 ++- config/locales/diaspora/pl.yml | 1 - config/locales/diaspora/pt-BR.yml | 22 +- config/locales/diaspora/pt-PT.yml | 1 - config/locales/diaspora/ro.yml | 236 ++++++++++++------ config/locales/diaspora/ru.yml | 1 - config/locales/diaspora/sc.yml | 1 - config/locales/diaspora/sk.yml | 1 - config/locales/diaspora/sl.yml | 1 - config/locales/diaspora/sr.yml | 1 - config/locales/diaspora/sv.yml | 69 +++-- config/locales/diaspora/te.yml | 1 - config/locales/diaspora/tr.yml | 37 ++- config/locales/diaspora/uk.yml | 1 - config/locales/diaspora/vi.yml | 1 - config/locales/diaspora/zh-CN.yml | 1 - config/locales/diaspora/zh-TW.yml | 1 - .../locales/javascript/javascript.de-moo.yml | 1 + .../javascript/javascript.de_formal.yml | 1 + config/locales/javascript/javascript.es.yml | 10 +- config/locales/javascript/javascript.sv.yml | 3 +- 64 files changed, 628 insertions(+), 243 deletions(-) diff --git a/config/locales/devise/devise.pt-BR.yml b/config/locales/devise/devise.pt-BR.yml index 9abf94b9b..dcfce4184 100644 --- a/config/locales/devise/devise.pt-BR.yml +++ b/config/locales/devise/devise.pt-BR.yml @@ -86,7 +86,7 @@ pt-BR: remember_me: "Lembre-se de mim" sign_in: "Entrar" username: "Nome de usuário" - signed_in: "Você entrou com sucesso." + signed_in: "Você entrou." signed_out: "Você saiu com sucesso." shared: links: diff --git a/config/locales/diaspora/ar.yml b/config/locales/diaspora/ar.yml index 3040692d0..32ac565f1 100644 --- a/config/locales/diaspora/ar.yml +++ b/config/locales/diaspora/ar.yml @@ -442,7 +442,6 @@ ar: updated: "تم تحديث ملفك الشخصى" public: "عامّ" registrations: - closed: "التسجيلات مغلقة على هذه المنصة" create: success: "لقد انضممت الى دياسبرا " new: diff --git a/config/locales/diaspora/be.yml b/config/locales/diaspora/be.yml index bea5c8758..f8d08b687 100644 --- a/config/locales/diaspora/be.yml +++ b/config/locales/diaspora/be.yml @@ -15,7 +15,7 @@ be: contact: attributes: person_id: - taken: "павінна быць унікальным у кантактах гэтага карыстальніка." + taken: "мусіць быць унікальным у кантактах гэтага карыстальніка." person: attributes: diaspora_handle: @@ -23,7 +23,7 @@ be: reshare: attributes: root_guid: - taken: "Добра, але гэта ты ўжо перапосціў!" + taken: "Падабаецца? Але ты ўжо падзяліуся гэтым!" user: attributes: email: @@ -33,42 +33,52 @@ be: username: invalid: "Памылка. Дазваляюцца літары, лічбы і падкрэсліванні." taken: "ужо існуе." - all_aspects: "усе катыгорыі" + all_aspects: "Усе аспекты" are_you_sure: "сапраўды?" - are_you_sure_delete_account: "Вы сапраўды хочаце выдаліць Ваш акаўнт? Гэта не магчыма будзе адмяніць!" + are_you_sure_delete_account: "Вы сапраўды жадаеце выдаліць Ваш акаўнт? Гэта не магчыма будзе адмяніць!" aspects: add_to_aspect: failure: "Памылка пры спробе дадаць кантакты да аспекта." success: "Кантакты паспяхова дададзены ў аспект." aspect_listings: add_an_aspect: "+ дадаць катыгорыю" + aspect_stream: + stay_updated: "Заўжды на сувязі" destroy: - failure: "%{name} не пустая і не можа быць выдалена." + failure: "%{name} не магчыма выдаліць." success: "%{name} паспяхова выдалена" edit: - aspect_list_is_not_visible: "спіс катыгорый не бачны для ўсіх" - aspect_list_is_visible: "спіс катыгорый бачны для ўсіх" + aspect_list_is_not_visible: "Кантакты ў гэтым аспекце ня бачны нікому" + aspect_list_is_visible: "Кантакты ў гэтым аспекце бачны для ўсіх" confirm_remove_aspect: "ты сапраўды жадаешь выдаліць гэтую катыгорыю?" rename: "перайменаваць" - update: "абнавіць" - updating: "абнаўляю ..." + update: "аднавіць" + updating: "аднаўляю ..." index: donate: "падзяка" help: do_you: "Гэта тычыцца:" - here_to_help: "Супольнасці Diaspora тут!" - need_help: "дапамога патрэбна?" + feature_suggestion: "... жадаеце нешта %{link} прапанаваць?" + find_a_bug: "... знайшлі %{link}?" + have_a_question: "... маеце %{link}?" + here_to_help: "Суполка Дыаспара* заўсёды побач!" + need_help: "Патрэбна дапамога?" tag_bug: "памылка" + tag_feature: "функцыя" tag_question: "пытанне" + introduce_yourself: "Гэта ваша ручаіна. Скокайце ды пакажыце сябе." new_here: follow: "Сачы за %{link} і вітай новых карыстальнікаў diaspora*!" learn_more: "паказаць больш" - title: "Прывітанне, Новы Ўдзельнік!(чалавек)" + title: "Прывітай новых удзельнікаў" + services: + content: "Вы можаце дадаць наступныя паслугі ў diaspora*:" + heading: "Далучыць паслугі" welcome_to_diaspora: "Вітаем ў Diaspora, %{name}!" no_contacts_message: - community_spotlight: "супольны прагляд" + community_spotlight: "Рэкамендуемыя удзельнікі" or_spotlight: "ты можаш таксама падзяліцца %{link}" - try_adding_some_more_contacts: "ты можаш знайсці ці дадаць новыя катракты" + try_adding_some_more_contacts: "ты можаш знайсці ці %{invite_link} новыя кантакты." you_should_add_some_more_contacts: "спачатку дадай пару кантактаў" seed: acquaintances: "знаёмыя" @@ -79,13 +89,31 @@ be: failure: "не магчыма захаваць катыгорыю %{name}, занадта дліная назва." success: "катыгорыя %{name} была паспяхова выдалена" cancel: "адмяніць" + comments: + new_comment: + comment: "Каментарыі" + commenting: "Каменціраванне" contacts: index: - all_contacts: "усе кантакты" + all_contacts: "Усе кантакты" + my_contacts: "Мае кантакты" + start_a_conversation: "Пачаць гутарку" + title: "Кантакты" conversations: + create: + fail: "Памылковае паведамленне" + sent: "Паведамленне даслана" + index: + inbox: "Уваходныя" + no_messages: "Няма паведамленняў" new: send: "даслаць" sending: "адсылаю ..." + subject: "Тэма" + show: + delete: "Выдаліць гутарку" + reply: "Адачаць" + replying: "Адказваем..." delete: "выдаліць" email: "Email" error_messages: @@ -93,16 +121,33 @@ be: correct_the_following_errors_and_try_again: "спраўляй памылкі і паспрабуй зноў." fill_me_out: "запоўні мяне" find_people: "Пошук людзей ці #тэгаў" + help: + aspects: + title: "Аспекты" + what_is_an_aspect_q: "Што такое аспект?" invitations: + create: + no_more: "Больш няма запрашенняў" new: - invite_someone_to_join: "запрасі каго-небудзь да Diaspora!" + invite_someone_to_join: "Запрасі яшчэ кагосці да Diaspora*!" language: "мова" + send_an_invitation: "Даслаць запрашэнне" layouts: + application: + powered_by: "Заснавана на diaspora*" + whats_new: "Што новага?" header: + code: "Код" + logout: "Выйсці" + profile: "Профіль" settings: "налады" limited: "абмежавана" more: "больш" - no_results: "нічога не знайшлось" + no_results: "Нічога не знайшлось" + notifier: + click_here: "Націсні сюды" + hello: "Вітаем, %{name}!" + thanks: "Дзякуй," nsfw: "не дзеля ўсіх вачэй" ok: "ok" privacy: "Прыватнасць" @@ -110,4 +155,11 @@ be: public: "адкрыта" search: "Пошук" settings: "Налады" - username: "Імя карыстальніка" \ No newline at end of file + streams: + aspects: + title: "Мае аспекты" + aspects_stream: "Аспекты" + username: "Імя карыстальніка" + users: + edit: + auto_follow_aspect: "Дадаваць гэтых карыстальнікаў у аспект:" \ No newline at end of file diff --git a/config/locales/diaspora/bg.yml b/config/locales/diaspora/bg.yml index 0743109c9..4ec918514 100644 --- a/config/locales/diaspora/bg.yml +++ b/config/locales/diaspora/bg.yml @@ -404,7 +404,6 @@ bg: updated: "Профилът е обновен" public: "Публична" registrations: - closed: "Нови регистрации не са възможни на този pod на Diaspora." create: success: "Вие се присъединихте към Diaspora!" invalid_invite: "Връзката за покана, която предоставихте, вече не е валидна!" diff --git a/config/locales/diaspora/br.yml b/config/locales/diaspora/br.yml index 10d0ccdf5..6a06c708c 100644 --- a/config/locales/diaspora/br.yml +++ b/config/locales/diaspora/br.yml @@ -505,7 +505,6 @@ br: updated: "Patrom nevesaet" public: "A-wel d'an holl" registrations: - closed: "Stanket eo an enskrivadur war ar pod diaspora*-mañ" create: success: "Enskrivet oc'h war diaspora* !" invalid_invite: "Al liamm pedadenn roet ganeoc'h n'eo ket mat ken" diff --git a/config/locales/diaspora/bs.yml b/config/locales/diaspora/bs.yml index ecca3b459..0e53ec6c3 100644 --- a/config/locales/diaspora/bs.yml +++ b/config/locales/diaspora/bs.yml @@ -495,7 +495,6 @@ bs: updated: "Profil ažuriran" public: "Javno" registrations: - closed: "Prijave su zatvorene na ovom Diaspora podu." create: success: "Pridružili ste se Diaspori!" invalid_invite: "Veza pozivnice koji ste obezbijedili više nije važeća!" diff --git a/config/locales/diaspora/cs.yml b/config/locales/diaspora/cs.yml index 9d2946e5e..72f614f31 100644 --- a/config/locales/diaspora/cs.yml +++ b/config/locales/diaspora/cs.yml @@ -1017,7 +1017,6 @@ cs: updated: "Profil aktualizován" public: "Veřejné" registrations: - closed: "Přihlášky nejsou na tomto podu diaspory* otevřeny." create: success: "Připojili jste se k diaspoře*!" invalid_invite: "Odkaz na pozvánku, který jste poskytli, již neplatí!" diff --git a/config/locales/diaspora/da.yml b/config/locales/diaspora/da.yml index 39b599da8..9215ea650 100644 --- a/config/locales/diaspora/da.yml +++ b/config/locales/diaspora/da.yml @@ -593,9 +593,11 @@ da: byline: "Det sociale netværk hvor det er dig der har kontrollen" choose_your_audience: "Vælg dit publikum" choose_your_audience_info: "Ved hjælp af Diasporas aspekter kan du vælge de mennesker du vil dele med. Du kan privat eller offentlig som du har lyst til. Del et sjovt foto med hele verden, eller en dyb hemmelighed kun med dine nærmeste. Du bestemmer." + diaspora_site_link: "Diaspora fødereret netværk" headline: "Velkommen til %{pod_name}" own_your_data: "Vær i besiddelse af dine egne data" own_your_data_info: "Mange sociale netværk tjener penge på dine data ved at analysere din opførsel og derefter bruge informationen til at sælge reklamer. Diaspora bruger ikke dine data til noget, men står til rådighed så du kan kommunikere og dele med andre." + part_of_diaspora: "Del af %{diaspora_site_link}" podmin: byline: "Du er i gang med at ændre internettet. Lad os komme i gang." configuration_info: "Åben %{database_path} og %{diaspora_path} i din favorit editor og gennemgå dem omhyggeligt. De er udførligt kommenteret." @@ -1011,7 +1013,11 @@ da: updated: "Profil opdateret" public: "Offentlig" registrations: - closed: "Der er lukket for tilmeldinger på denne Diaspora server." + closed: + another_pod: "en anden pod" + closed_pod: "Denne pod er for tiden lukket for tilgang. Du kan dog stadig blive en del af Diaspora-netværket ved at tilmelde dig på %{wiki}. Fordi alle Diasporas pods er forbundet, vil du stadig have adgang til det samme indhold der." + find_pods: "Der er en liste over de pods du kan tilmelde dig på %{poduptime}." + other_questions: "Har du nogen spørgsmål vedrørende valg af pod, se vores %{wiki}." create: success: "Du er nu en del af Diaspora!" invalid_invite: "Det invitations-link som du anvendte er ikke længere gyldigt!" diff --git a/config/locales/diaspora/de-CH.yml b/config/locales/diaspora/de-CH.yml index 82cac40d6..49f5aa339 100644 --- a/config/locales/diaspora/de-CH.yml +++ b/config/locales/diaspora/de-CH.yml @@ -592,7 +592,6 @@ de-CH: updated: "Pofil aktualisiert" public: "Öffentlich" registrations: - closed: "Uf dem pod isch d'Registrierig deaktiviert" create: success: "Du bisch ez volle Hahne bi diaspora* debii!" invalid_invite: "De Iiladigslink wo'd benutzt hesch isch nüme gültig!" diff --git a/config/locales/diaspora/de-moo.yml b/config/locales/diaspora/de-moo.yml index 5ce0be51a..61f2e569c 100644 --- a/config/locales/diaspora/de-moo.yml +++ b/config/locales/diaspora/de-moo.yml @@ -90,15 +90,18 @@ de-moo: week: "Woche" user_entry: account_closed: "Konto wurde geschlossen" + admin: "Leitkuh" diaspora_handle: "diaspora* ID" email: "E-Mail" guid: "GUID" id: "ID" invite_token: "Einladungstoken" last_seen: "Zuletzt gesehen" + moderator: "Moderierkuh" ? "no" : Nein nsfw: "#nsfw" + spotlight: "Schaukasten" unknown: "Unbekannt" ? "yes" : Ja @@ -106,14 +109,29 @@ de-moo: account_closing_scheduled: "Das Konto von %{name} soll geschlossen werden. Dies dauert ein paar Augenblicke..." account_locking_scheduled: "Das Konto von %{name} ist zur Sperrung vorgesehen. Es wird in wenigen Augenblicken verarbeitet..." account_unlocking_scheduled: "Das Konto von %{name} ist zur Entsperrung vorgesehen. Es wird in wenigen Augenblicken verarbeitet..." + add_admin: "%{name} wurde zur Leitkuh befördert." add_invites: "Einladungen hinzufügen" + add_moderator: "%{name} wurde zur Moderierkuh befördert." + add_spotlight: "%{name} wurde in den Gemeinschafts-Schaukasten gestellt." are_you_sure: "Willst du dein Konto wirklich schließen?" are_you_sure_lock_account: "Bist du dir sicher, dass du dieses Konto sperren willst?" are_you_sure_unlock_account: "Bist du sicher, dass du dieses Konto entsperren willst?" close_account: "Konto schließen" + delete_admin: "%{name} wurde von der Liste der Leitkühe entfernt." + delete_moderator: "%{name} wurde von der Liste der Moderierkühe entfernt." + delete_spotlight: "%{name} wurde vom Gemeinschafts-Schaukasten entfernt." + does_not_exist: "Kuh existiert nicht!" email_to: "per E-Mail einladen" invite: "Einladen" lock_account: "Konto sperren" + make_admin: "Zur Leitkuh befördern" + make_moderator: "Zur Moderierkuh befördern" + make_spotlight: "In den Gemeinschafts-Schaukasten stellen" + remove_admin: "Als Leitkuh absetzen" + remove_moderator: "Als Moderierkuh absetzen" + remove_spotlight: "Aus dem Gemeinschafts-Schaukasten entfernen" + role_implemented: "%{name} hat diese Rolle bereits erhalten!" + role_removal_implemented: "%{name} wurde diese Rolle bereits entzogen!" under_13: "Zeige Kühe, die unter 13 Jahre alt sind (COPPA)" unlock_account: "Konto entsperren" users: @@ -190,6 +208,7 @@ de-moo: tos: "Die Nutzungsbedingungen der Anwendung ansehen" are_you_sure: "Bist du dir sicher?" are_you_sure_delete_account: "Möchtest du dein Konto wirklich schließen? Dieser Schritt kann nicht rückgängig gemacht werden!" + are_you_sure_ignore_user: "Bist du sicher, dass du diese Kuh ignorieren möchtest?" aspect_memberships: destroy: failure: "Die Kuh konnte nicht aus der Herde entfernt werden." @@ -364,7 +383,7 @@ de-moo: close_account_a: "Gehe an das Ende deiner Kontoeinstellungen und drücke auf die Schaltfläche „Konto schließen“. Um den Vorgang abzuschließen, wirst du dann aufgefordert, dein Kennwort einzugeben. Denk dran: Wenn du dein Konto schließt, kannst du dich auf diesem Bauernhof nie wieder mit dem gleichen Benutzernamen registrieren." close_account_q: "Wie kann ich mein Konto löschen?" data_other_podmins_a: "Wenn du mit jemandem auf einem anderen Bauernhof teilst, werden alle Beiträge, die du teilst, und eine Kopie deiner Profildaten auf dessen Bauernhof gespeichert („gecached“) und sind der Datenbankleitkuh des Bauernhofs zugänglich. Wenn du einen Beitrag oder deine Profildaten löschst, geschieht dies auch auf allen anderen Bauernhöfen, auf denen die Daten bisher gespeichert waren. Deine Bilder werden nur auf deinen eigenen Bauernhof gespeichert; nur Links, die zu ihnen führen, werden anderen Bauernhöfen übermittelt." - data_other_podmins_q: "Kann die Leitkuh meines Bauernhofs meine Informationen sehen?" + data_other_podmins_q: "Können die Leitkühe anderer Bauernhöfe meine Informationen sehen?" data_visible_to_podmin_a: "Kurzum: alles. Die Kommunikation zwischen Bauernhöfen läuft immer verschlüsselt ab (mittels SSL und diaspora*s eigener Übertragungsverschlüsselung), aber gespeichert werden die Daten unverschlüsselt. Wenn sie wollte, könnte die Leitkuh deines Bauernhofs (normalerweise die Kuh, die den Bauernhofs betreibt) auf deine gesamten Kontodaten und alles, was du postest, zugreifen (wie auch bei den meisten anderen Webseiten, die Benutzerdaten speichern). Das ist der Grund dafür, dass wir dich auswählen lassen, auf welchem Bauernhof du dich registrierst, damit du einen Bauernhof auswählen kannst, dessen Leitkuh du deine Daten gerne anvertraust. Das Betreiben eines eigenen Bauernhofs gibt dir mehr Sicherheit, weil du dann den Zugriff auf die Datenbank kontrollierst." data_visible_to_podmin_q: "Wie viele Informationen kann die Leitkuh meines Bauernhofs sehen?" download_data_a: "Ja. Unten im Bereich „Konto“ deiner Einstellungen sind zwei Schaltflächen, mit denen du deine Daten oder Fotos herunterladen kannst." @@ -574,9 +593,11 @@ de-moo: byline: "Die soziale Onlinewelt, in der du deine Daten in der Hand hast." choose_your_audience: "Wähle dein Publikum" choose_your_audience_info: "diaspora*s Herden ermöglichen dir, nur mit den Kühen zu teilen, mit denen du möchtest. Du kannst so öffentlich oder privat sein, wie du willst. Teile ein witziges Foto mit der ganzen Welt oder ein tiefes Geheimnis nur mit deinen engsten Freunden. Es ist deine Entscheidung." + diaspora_site_link: "föderierten diaspora*-Netzwerks" headline: "Willkommen auf %{pod_name}" own_your_data: "Deine Daten, dein Eigentum" own_your_data_info: "Viele Netzwerke nutzen deine Daten, um Geld zu verdienen, indem sie deine Interaktionen auswerten und diese Informationen verwenden, um dir Werbung zu zeigen. diaspora* nutzt deine Daten zu keinem anderen Zweck, als es dir zu ermöglichen, dich mit anderen zu verbinden und mit ihnen zu teilen." + part_of_diaspora: "Teil des %{diaspora_site_link}" podmin: byline: "Du bist drauf und dran, das Internet zu ändern. Lass uns gleich alles einrichten, okay?" configuration_info: "Öffne %{database_path} und %{diaspora_path} in deinem Lieblingstexteditor und sieh sie gründlich durch, sie sind ausführlich kommentiert." @@ -627,6 +648,8 @@ de-moo: public_feed: "Öffentlicher diaspora* Feed von %{name}" source_package: "Quellcodepaket herunterladen" statistics_link: "Bauernhof-Statistiken" + switch_to_standard_mode: "In den Standardmodus wechseln" + switch_to_touch_optimized_mode: "In den touch-optimierten Modus wechseln" whats_new: "Was gibt's Neues?" header: code: "Code" @@ -1004,7 +1027,11 @@ de-moo: updated: "Profil aktualisiert" public: "Öffentlich" registrations: - closed: "Neuregistrierungen sind auf diesem Bauernhof geschlossen." + closed: + another_pod: "einem anderen Bauernhof" + closed_pod: "Dieser Bauernhof ist derzeit für Neuanmeldungen geschlossen. Du kannst dem diaspora*-Netzwerk trotzdem beitreten, indem du sich auf %{wiki} registrierst. Da alle Bauernhöfe miteinander verbunden sind, hast du von dort aus Zugriff auf dieselben Inhalte." + find_pods: "Es gibt eine Liste von Bauernhöfen, auf denen du dich registrieren kannst, auf %{poduptime}." + other_questions: "Wenn du noch weitere Fragen dazu hast, wie du einen Bauernhof auswählst, lies unser %{wiki}." create: success: "Du bist diaspora* beigetreten!" invalid_invite: "Der von dir erstellte Einladungs-Link ist nicht mehr gültig!" @@ -1195,6 +1222,41 @@ de-moo: one: "Eine Kuh ist mit %{tag} getaggt" other: "%{count} Kühe sind mit %{tag} getaggt" zero: "Keine Kuh ist mit %{tag} getaggt" + two_factor_auth: + activated: + change_button: "Deaktivieren" + change_label: "Die Zwei-Faktor-Authentifizierung deaktivieren durch Eingabe deines Passworts" + status: "Zwei-Faktor-Authentifizierung aktiviert" + confirm: + activate_button: "Bestätigen und aktivieren" + input_explanation: "Nach dem Scan oder der Eingabe des Schlüssels, gib den sechsstelligen Code ein, der dir angezeigt wird und bestätige die Einstellungen." + input_title: "Bestätige mit dem TOTP-Token" + manual_explanation: "Falls du den QR-Code nicht automatisch scannen kannst, kannst du den Schlüssel manuell in deiner App eingeben." + manual_explanation_cont: "Wir nutzen ein zeitgesteuertes Einmalpasswortverfahren (Time-based One-time Passwords, TOTP) mit sechsstelligen Tokens. Falls deine App dich nach einem Zeitintervall und Algorithmus fragt, gib 30 Sekunden und sha1 ein.
Die Leerzeichen dienen nur der besseren Lesbarkeit, gib den Code ohne diese ein." + scan_explanation: "Bitte scanne den QR-Code mit einer TOTP-fähigen App, wie andOTP (Android), FreeOTP (iOS), oder SailOTP (SailfishOS)." + scan_title: "Scanne den QR-Code" + status: "Die Zwei-Faktor-Authentifizierung wurde noch nicht vollständig aktiviert. Du musst die Aktivierung mit einem TOTP-Token bestätigen." + title: "Aktivierung bestätigen" + deactivated: + change_button: "Aktivieren" + change_label: "Zwei-Faktor-Authentifizierung aktivieren" + status: "Zwei-Faktor-Authentifizierung nicht aktiviert" + explanation: "Die Zwei-Faktor-Authentifizierung ist eine wirkungsvolle Methode, um sicherzustellen, dass du die einzige Kuh bist, die sich in deinem Konto anmelden kann. Bei der Anmeldung gibst du einen 6-stelligen Code zusammen mit deinem Passwort ein, um deine Identität zu bestätigen. Achtung: Wenn du dein Telefon verlierst und die bei Aktivierung dieser Funktion erstellten Wiederherstellungscodes verloren gehen, wird der Zugriff auf dein diaspora*-Konto für immer gesperrt." + flash: + error_token: "Token war falsch oder ungültig" + success_activation: "Zwei-Faktor-Authentifizierung erfolgreich aktiviert" + success_deactivation: "Zwei-Faktor-Authentifizierung erfolgreich deaktiviert" + input_token: + label: "Zwei-Faktor Token" + placeholder: "sechsstelliges Zwei-Faktor-Token" + recovery: + button: "Neue Wiederherstellungscodes generieren" + explanation: "Wenn du jemals den Zugriff auf dein Telefon verlierst, kannst du einen der folgenden Wiederherstellungscodes verwenden, um wieder auf dein Konto zuzugreifen. Bewahre die Wiederherstellungscodes sicher auf. Du kannst sie beispielsweise ausdrucken und zusammen mit anderen wichtigen Dokumenten ablegen." + explanation_short: "Mithilfe von Wiederherstellungscodes kannst du den Zugriff auf dein Konto wiederherstellen, wenn du dein Telefon verlierst. Beachte, dass du jeden Wiederherstellungscode nur einmal verwenden kannst." + invalidation_notice: "Wenn du deine Wiederherstellungscodes verloren hast, kannst du diese hier neu generieren. Deine alten Wiederherstellungscodes werden ungültig." + reminder: "Alternativ kannst du einen der Wiederherstellungscodes benutzen." + title: "Wiederherstellungscodes" + title: "Zwei-Faktor-Authentifizierung" username: "Benutzername" users: confirm_email: @@ -1243,8 +1305,9 @@ de-moo: new_password: "Neues Kennwort" private_message: "… du eine private Nachricht erhältst?" protocol_handler: - description: "Beim Klick auf diese Schaltfläche wird dein Browser aufgefordert, einen Handler zu installieren, wodurch web+diaspora:// URLs auf deinem Heimatbauernhof geöffnet werden können. Diese Funktion ist derzeit experimentell und die Interaktionen sind abhängig von Ihrem Browser." - register: "Registrieren" + browser: "Dieses Protokoll befindet sich derzeit in einer experimentellen Phase und der Erfolg der Interaktionen damit ist von deinem Browser abhängig. Möchtest du diesen Handler verwalten oder entfernen, tust du dies über deine Browsereinstellungen. Die Schaltfläche unten ist immer aktiviert und du musst den Handler in jedem von dir verwendeten Browser separat setzen." + description: "web+diaspora:// ist ein neues Webprotokoll, das wir eingeführt haben. Jeder Link nach diaspora* von einer externen Webseite, die dieses Protokoll nutzt, kann auf dem Bauernhof geöffnet werden, auf dem dein Konto registriert ist. Klicke auf die untenstehende Schaltfläche, um deinen Browser so einzustellen, dass er %{pod_url} zur Erkennung von externen web+diaspora:// Links nutzt." + register: "Registriere den web+diaspora:// Handler auf diesem Browser" title: "web+diaspora:// protocol handler" receive_email_notifications: "E-Mail-Benachrichtigungen empfangen, wenn …" request_export: "Meine Profildaten anfordern" diff --git a/config/locales/diaspora/de.yml b/config/locales/diaspora/de.yml index 425848f97..88c146b4b 100644 --- a/config/locales/diaspora/de.yml +++ b/config/locales/diaspora/de.yml @@ -118,7 +118,7 @@ de: are_you_sure_unlock_account: "Bist du dir sicher, dass du dieses Konto entsperren möchtest?" close_account: "Konto schließen" delete_admin: "%{name} wurde von der Liste der Administratoren entfernt." - delete_moderator: "%{name} wurde von der Liste der Moderatoren entfernt." + delete_moderator: "%{name} wurde von der Liste der Moderatoren entfernt." delete_spotlight: "%{name} wurde vom Gemeinschafts-Schaukasten entfernt." does_not_exist: "Benutzer existiert nicht!" email_to: "per E-Mail einladen" @@ -208,7 +208,7 @@ de: tos: "Die Nutzungsbedingungen der Anwendung ansehen" are_you_sure: "Bist du dir sicher?" are_you_sure_delete_account: "Möchtest du dein Konto wirklich schließen? Dieser Schritt kann nicht rückgängig gemacht werden!" - are_you_sure_ignore_user: "Bist du sicher das du den Nutzer ignorieren möchtest?" + are_you_sure_ignore_user: "Bist du sicher, dass du den Nutzer ignorieren möchtest?" aspect_memberships: destroy: failure: "Die Person konnte nicht aus dem Aspekt entfernt werden." @@ -593,9 +593,11 @@ de: byline: "Die soziale Onlinewelt, in der du deine Daten in der Hand hast." choose_your_audience: "Wähle dein Publikum" choose_your_audience_info: "diaspora*s Aspekte ermöglichen dir, nur mit den Menschen zu teilen, mit denen du möchtest. Du kannst so öffentlich oder privat sein, wie du willst. Teile ein witziges Foto mit der ganzen Welt oder ein tiefes Geheimnis nur mit deinen engsten Freunden. Es ist deine Entscheidung." + diaspora_site_link: "föderierten diaspora*-Netzwerks" headline: "Willkommen auf %{pod_name}" own_your_data: "Deine Daten, dein Eigentum" own_your_data_info: "Viele Netzwerke nutzen deine Daten, um Geld zu verdienen, indem Sie deine Interaktionen auswerten und diese Informationen verwenden, um dir Werbung zu zeigen. diaspora* nutzt deine Daten zu keinem anderen Zweck, als es dir zu ermöglichen, dich mit anderen zu verbinden und mit ihnen zu teilen." + part_of_diaspora: "Teil des %{diaspora_site_link}" podmin: byline: "Du bist drauf und dran, das Internet zu ändern. Lass uns gleich alles einrichten, okay?" configuration_info: "Öffne %{database_path} und %{diaspora_path} in deinem Lieblingstexteditor und sieh sie gründlich durch, sie sind ausführlich kommentiert." @@ -646,8 +648,8 @@ de: public_feed: "Öffentlicher diaspora* Feed von %{name}" source_package: "Quelltextpaket runterladen" statistics_link: "Pod-Statistiken" - switch_to_standard_mode: "In den Standard-Modus wechseln" - switch_to_touch_optimized_mode: "Wechseln zum touch-optimierten Modus" + switch_to_standard_mode: "In den Standardmodus wechseln" + switch_to_touch_optimized_mode: "In den touch-optimierten Modus wechseln" whats_new: "Was gibt’s Neues?" header: code: "Code" @@ -1008,7 +1010,11 @@ de: updated: "Profil aktualisiert" public: "Öffentlich" registrations: - closed: "Neuregistrierungen sind auf diesem diaspora*-Pod geschlossen." + closed: + another_pod: "einem anderen Pod" + closed_pod: "Dieser Pod ist derzeit für Neuanmeldungen geschlossen. Du kannst dem diaspora*-Netzwerk trotzdem beitreten, indem du dich auf %{wiki} registrierst. Da alle Pods miteinander verbunden sind, hast du von dort aus Zugriff auf dieselben Inhalte." + find_pods: "Es gibt eine Liste von Pods, auf denen du dich registrieren kannst, auf %{poduptime}." + other_questions: "Wenn du noch weitere Fragen dazu hast, wie du einen Pod auswählst, lies unser %{wiki}." create: success: "Du bist diaspora* beigetreten!" invalid_invite: "Der von dir erstellte Einladungs-Link ist nicht mehr gültig!" @@ -1195,6 +1201,41 @@ de: one: "1 Person ist mit %{tag} getaggt" other: "%{count} Personen sind mit %{tag} getaggt" zero: "Niemand ist mit %{tag} getaggt" + two_factor_auth: + activated: + change_button: "Deaktivieren" + change_label: "Die Zwei-Faktor-Authentifizierung deaktivieren durch Eingabe deines Passworts" + status: "Zwei-Faktor-Authentifizierung aktiviert" + confirm: + activate_button: "Bestätigen und aktivieren" + input_explanation: "Nach dem Scan oder der Eingabe des Schlüssels, gib den sechsstelligen Code ein, der dir angezeigt wird und bestätige die Einstellungen." + input_title: "Bestätige mit dem TOTP-Token" + manual_explanation: "Falls du den QR-Code nicht automatisch scannen kannst, kannst du den Schlüssel manuell in deiner App eingeben." + manual_explanation_cont: "Wir nutzen ein zeitgesteuertes Einmalpasswortverfahren (Time-based One-time Passwords, TOTP) mit sechsstelligen Tokens. Falls deine App dich nach einem Zeitintervall und Algorithmus fragt, gib 30 Sekunden und sha1 ein.
Die Leerzeichen dienen nur der besseren Lesbarkeit, gib den Code ohne diese ein." + scan_explanation: "Bitte scanne den QR-Code mit einer TOTP-fähigen App, wie andOTP (Android), FreeOTP (iOS), oder SailOTP (SailfishOS)." + scan_title: "Scanne den QR-Code" + status: "Die Zwei-Faktor-Authentifizierung wurde noch nicht vollständig aktiviert. Du musst die Aktivierung mit einem TOTP-Token bestätigen." + title: "Aktivierung bestätigen" + deactivated: + change_button: "Aktivieren" + change_label: "Zwei-Faktor-Authentifizierung aktivieren" + status: "Zwei-Faktor-Authentifizierung nicht aktiviert" + explanation: "Die Zwei-Faktor-Authentifizierung ist eine wirkungsvolle Methode, um sicherzustellen, dass du die einzige Person bist, die sich in deinem Konto anmelden kann. Bei der Anmeldung gibst du einen 6-stelligen Code zusammen mit deinem Passwort ein, um deine Identität zu bestätigen. Achtung: Wenn du dein Telefon verlierst und die bei Aktivierung dieser Funktion erstellten Wiederherstellungscodes verloren gehen, wird der Zugriff auf dein diaspora*-Konto für immer gesperrt." + flash: + error_token: "Token war falsch oder ungültig" + success_activation: "Zwei-Faktor-Authentifizierung erfolgreich aktiviert" + success_deactivation: "Zwei-Faktor-Authentifizierung erfolgreich deaktiviert" + input_token: + label: "Zwei-Faktor-Token" + placeholder: "sechsstelliges Zwei-Faktor-Token" + recovery: + button: "Neue Wiederherstellungscodes generieren" + explanation: "Wenn du jemals den Zugriff auf dein Telefon verlierst, kannst du einen der folgenden Wiederherstellungscodes verwenden, um wieder auf dein Konto zuzugreifen. Bewahre die Wiederherstellungscodes sicher auf. Du kannst sie beispielsweise ausdrucken und zusammen mit anderen wichtigen Dokumenten ablegen." + explanation_short: "Mithilfe von Wiederherstellungscodes kannst du den Zugriff auf dein Konto wiederherstellen, wenn du dein Telefon verlierst. Beachte, dass du jeden Wiederherstellungscode nur einmal verwenden kannst." + invalidation_notice: "Wenn du deine Wiederherstellungscodes verloren hast, kannst du diese hier neu generieren. Deine alten Wiederherstellungscodes werden ungültig." + reminder: "Alternativ kannst du einen der Wiederherstellungscodes benutzen." + title: "Wiederherstellungscodes" + title: "Zwei-Faktor-Authentifizierung" username: "Benutzername" users: confirm_email: @@ -1243,9 +1284,9 @@ de: new_password: "Neues Kennwort" private_message: "du eine private Nachricht erhältst" protocol_handler: - browser: "Dieses Protokoll befindet sich derzeit in einer experimentellen Phase und der Erfolg der Interaktionen, die es verwenden, ist von deinem Browser abhängig. Möchtest du diesen Handler verwalten oder entfernen, tust du dies mit deinen Browser-Einstellungen. Die untere Schaltfläche ist immer aktiviert und du musst den Handler in jedem von dir verwendeten Browser separat setzen." - description: "Beim Klick auf diese Schaltfläche wird dein Browser aufgefordert, einen Handler zu installieren, wodurch web+diaspora:// URLs auf deinem Heimatpod geöffnet werden können. Diese Funktion ist derzeit experimentell und die Interaktionen sind abhängig von deinem Browser." - register: "Registrieren" + browser: "Dieses Protokoll befindet sich derzeit in einer experimentellen Phase und der Erfolg der Interaktionen damit ist von deinem Browser abhängig. Möchtest du diesen Handler verwalten oder entfernen, tust du dies über deine Browsereinstellungen. Die Schaltfläche unten ist immer aktiviert und du musst den Handler in jedem von dir verwendeten Browser separat setzen." + description: "web+diaspora:// ist ein neues Webprotokoll, das wir eingeführt haben. Jeder Link nach diaspora* von einer externen Webseite, die dieses Protokoll nutzt, kann auf dem Pod geöffnet werden, auf dem dein Konto registriert ist. Klicke auf die untenstehende Schaltfläche, um deinen Browser so einzustellen, dass er %{pod_url} zur Erkennung von externen web+diaspora:// Links nutzt." + register: "Registriere den web+diaspora:// Handler auf diesem Browser" title: "web+diaspora:// protocol handler" receive_email_notifications: "E-Mail-Benachrichtigungen empfangen, wenn …" request_export: "Meine Profildaten anfordern" diff --git a/config/locales/diaspora/de_formal.yml b/config/locales/diaspora/de_formal.yml index 2753af7de..4cdca0599 100644 --- a/config/locales/diaspora/de_formal.yml +++ b/config/locales/diaspora/de_formal.yml @@ -90,15 +90,18 @@ de_formal: week: "Woche" user_entry: account_closed: "Konto wurde geschlossen." + admin: "Administrator" diaspora_handle: "diaspora* ID" email: "E-Mail" guid: "GUID" id: "ID" invite_token: "Einladungstoken" last_seen: "Zuletzt gesehen" + moderator: "Moderator" ? "no" : Nein nsfw: "NSFW (unangemessen für den Arbeitsplatz)" + spotlight: "Schaukasten" unknown: "Unbekannt" ? "yes" : Ja @@ -106,14 +109,29 @@ de_formal: account_closing_scheduled: "Das Konto von %{name} soll geschlossen werden. Dies dauert ein paar Augenblicke..." account_locking_scheduled: "Das Konto von %{name} ist zur Sperrung vorgesehen. Es wird in wenigen Augenblicken verarbeitet..." account_unlocking_scheduled: "Das Konto von %{name} ist zur Entsperrung vorgesehen. Es wird in wenigen Augenblicken verarbeitet..." + add_admin: "%{name} wurde zum Administrator befördert." add_invites: "Einladungen hinzufügen" + add_moderator: "%{name} wurde zum Moderator befördert." + add_spotlight: "%{name} wurde in den Gemeinschafts-Schaukasten gestellt" are_you_sure: "Möchten Sie Ihr Konto wirklich schließen?" are_you_sure_lock_account: "Sind Sie sicher, dass Sie dieses Konto sperren möchten?" are_you_sure_unlock_account: "Sind Sie sicher, dass Sie dieses Konto entsperren möchten?" close_account: "Konto schließen" + delete_admin: "%{name} wurde von der Liste der Administratoren entfernt." + delete_moderator: "%{name} wurde von der Liste der Moderatoren entfernt." + delete_spotlight: "%{name} wurde vom Gemeinschafts-Schaukasten entfernt." + does_not_exist: "Benutzer existiert nicht!" email_to: "per E-Mail einladen" invite: "Einladen" lock_account: "Konto sperren" + make_admin: "Zum Administrator befördern" + make_moderator: "Zum Moderator befördern" + make_spotlight: "In den Gemeinschafts-Schaukasten stellen" + remove_admin: "Als Administrator entfernen" + remove_moderator: "Als Moderator entfernen" + remove_spotlight: "Aus dem Gemeinschafts-Schaukasten entfernen" + role_implemented: "%{name} hat diese Rolle bereits erhalten!" + role_removal_implemented: "%{name} wurde diese Rolle bereits entzogen!" under_13: "Zeige Benutzer, die unter 13 Jahre alt sind (COPPA)" unlock_account: "Konto entsperren" users: @@ -190,6 +208,7 @@ de_formal: tos: "Die Nutzungsbedingungen der Anwendung ansehen" are_you_sure: "Sind Sie sicher?" are_you_sure_delete_account: "Möchten Sie Ihr Konto wirklich schließen? Dieser Schritt kann nicht rückgängig gemacht werden!" + are_you_sure_ignore_user: "Sind Sie sicher, dass Sie den Nutzer ignorieren möchten?" aspect_memberships: destroy: failure: "Die Person konnte nicht aus dem Aspekt entfernt werden." @@ -574,9 +593,11 @@ de_formal: byline: "Die soziale Onlinewelt, in der Sie Ihre Daten in der Hand haben" choose_your_audience: "Wählen Sie Ihr Publikum" choose_your_audience_info: "diaspora*s Aspekte ermöglichen Ihnen, nur mit den Menschen zu teilen, mit denen Sie möchten. Sie können so öffentlich oder privat sein, wie Sie möchten. Teilen Sie ein witziges Foto mit der ganzen Welt oder ein tiefes Geheimnis nur mit Ihren engsten Freunden. Es ist Ihre Entscheidung." + diaspora_site_link: "föderierten diaspora*-Netzwerks" headline: "Willkommen auf %{pod_name}" own_your_data: "Ihre Daten, Ihr Eigentum" own_your_data_info: "Viele Netzwerke nutzen Ihre Daten, um Geld zu verdienen, indem Sie Ihre Interaktionen auswerten und diese Informationen verwenden, um Ihnen Werbung anzuzeigen. diaspora* nutzt Ihre Daten zu keinem anderen Zweck, als es Ihnen zu ermöglichen, sich mit anderen zu verbinden und mit ihnen zu teilen." + part_of_diaspora: "Teil des %{diaspora_site_link}" podmin: byline: "Sie sind im Begriff, das Internet zu ändern. Lassen Sie uns gleich alles einrichten, okay?" configuration_info: "Öffnen Sie %{database_path} und %{diaspora_path} in Ihrem Lieblingstexteditor und sehen Sie sie gründlich durch, sie sind ausführlich kommentiert." @@ -627,6 +648,8 @@ de_formal: public_feed: "Öffentlicher diaspora* Feed von %{name}" source_package: "Quelltextpaket herunterladen" statistics_link: "Pod-Statistiken" + switch_to_standard_mode: "In den Standardmodus wechseln" + switch_to_touch_optimized_mode: "In den touch-optimierten Modus wechseln" whats_new: "Was gibt’s Neues?" header: code: "Code" @@ -979,7 +1002,11 @@ de_formal: updated: "Profil aktualisiert" public: "Öffentlich" registrations: - closed: "Neuregistrierungen sind auf diesem Pod geschlossen." + closed: + another_pod: "einem anderen Pod" + closed_pod: "Dieser Pod ist derzeit für Neuanmeldungen geschlossen. Sie können dem diaspora*-Netzwerk trotzdem beitreten, indem Sie sich auf %{wiki} registrieren. Da alle Pods miteinander verbunden sind, haben Sie von dort aus Zugriff auf dieselben Inhalte." + find_pods: "Es gibt eine Liste von Pods, auf denen Sie sich registrieren können, auf %{poduptime}." + other_questions: "Wenn Sie noch weitere Fragen dazu haben, wie Sie einen Pod auswählen, lesen Sie unser %{wiki}." create: success: "Sie sind diaspora* beigetreten!" invalid_invite: "Der von Ihnen erstellte Einladungs-Link ist nicht mehr gültig!" @@ -1166,6 +1193,41 @@ de_formal: one: "1 Person getaggt mit %{tag}" other: "%{count} Personen getaggt mit %{tag}" zero: "Keiner getaggt mit %{tag}" + two_factor_auth: + activated: + change_button: "Deaktivieren" + change_label: "Die Zwei-Faktor-Authentifizierung deaktivieren durch Eingabe Ihres Passworts" + status: "Zwei-Faktor-Authentifizierung aktiviert" + confirm: + activate_button: "Bestätigen und aktivieren" + input_explanation: "Nach dem Scan oder der Eingabe des Schlüssels, geben Sie den sechsstelligen Code ein, der Ihnen angezeigt wird und bestätigen Sie die Einstellungen." + input_title: "Bestätigen Sie mit dem TOTP-Token" + manual_explanation: "Falls Sie den QR-Code nicht automatisch scannen können, können Sie den Schlüssel manuell in Ihrer App eingeben." + manual_explanation_cont: "Wir nutzen ein zeitgesteuertes Einmalpasswortverfahren (Time-based One-time Passwords, TOTP) mit sechsstelligen Tokens. Falls Ihre App Sie nach einem Zeitintervall und Algorithmus fragt, geben Sie 30 Sekunden und sha1 ein.
Die Leerzeichen dienen nur der besseren Lesbarkeit, geben Sie den Code ohne diese ein." + scan_explanation: "Bitte scannen Sie den QR-Code mit einer TOTP-fähigen App, wie andOTP (Android), FreeOTP (iOS), oder SailOTP (SailfishOS)." + scan_title: "Scannen Sie den QR-Code" + status: "Die Zwei-Faktor-Authentifizierung wurde noch nicht vollständig aktiviert. Sie müssen die Aktivierung mit einem TOTP-Token bestätigen." + title: "Aktivierung bestätigen" + deactivated: + change_button: "Aktivieren" + change_label: "Zwei-Faktor-Authentifizierung aktivieren" + status: "Zwei-Faktor-Authentifizierung nicht aktiviert" + explanation: "Die Zwei-Faktor-Authentifizierung ist eine wirkungsvolle Methode, um sicherzustellen, dass Sie die einzige Person sind, die sich in Ihrem Konto anmelden kann. Bei der Anmeldung geben Sie einen 6-stelligen Code zusammen mit Ihrem Passwort ein, um Ihre Identität zu bestätigen. Achtung: Wenn Sie Ihr Telefon verlieren und die bei Aktivierung dieser Funktion erstellten Wiederherstellungscodes verlieren, wird der Zugriff auf Ihr diaspora*-Konto für immer gesperrt." + flash: + error_token: "Token war falsch oder ungültig" + success_activation: "Zwei-Faktor-Authentifizierung erfolgreich aktiviert" + success_deactivation: "Zwei-Faktor-Authentifizierung erfolgreich deaktiviert" + input_token: + label: "Zwei-Faktor-Token" + placeholder: "sechsstelliges Zwei-Faktor-Token" + recovery: + button: "Neue Wiederherstellungscodes generieren" + explanation: "Wenn Sie jemals den Zugriff auf Ihr Telefon verlieren, können Sie einen der folgenden Wiederherstellungscodes verwenden, um wieder auf Ihr Konto zuzugreifen. Bewahren Sie die Wiederherstellungscodes sicher auf. Sie können sie beispielsweise ausdrucken und zusammen mit anderen wichtigen Dokumenten ablegen." + explanation_short: "Mithilfe von Wiederherstellungscodes können Sie den Zugriff auf Ihr Konto wiederherstellen, wenn Sie Ihr Telefon verlieren. Beachten Sie, dass Sie jeden Wiederherstellungscode nur einmal verwenden können." + invalidation_notice: "Wenn Sie Ihre Wiederherstellungscodes verloren haben, können Sie diese hier neu generieren. Ihre alten Wiederherstellungscodes werden ungültig." + reminder: "Alternativ können Sie einen der Wiederherstellungscodes benutzen." + title: "Wiederherstellungscodes" + title: "Zwei-Faktor-Authentifizierung" username: "Benutzername" users: confirm_email: @@ -1214,8 +1276,9 @@ de_formal: new_password: "Neues Passwort" private_message: "Sie eine private Nachricht erhalten" protocol_handler: - description: "Beim Klick auf diese Schaltfläche wird Ihr Browser aufgefordert, einen Handler zu installieren, wodurch web+diaspora:// URLs auf Ihrem Heimatpod geöffnet werden können. Diese Funktion ist derzeit experimentell und die Interaktionen sind abhängig von Ihrem Browser." - register: "Registrieren" + browser: "Dieses Protokoll befindet sich derzeit in einer experimentellen Phase und der Erfolg der Interaktionen damit ist von Ihrem Browser abhängig. Möchten Sie diesen Handler verwalten oder entfernen, tun Sie dies über Ihre Browsereinstellungen. Die Schaltfläche unten ist immer aktiviert und Sie müssen den Handler in jedem von Ihnen verwendeten Browser separat setzen." + description: "web+diaspora:// ist ein neues Webprotokoll, das wir eingeführt haben. Jeder Link nach diaspora* von einer externen Webseite, die dieses Protokoll nutzt, kann auf dem Pod geöffnet werden, auf dem Ihr Konto registriert ist. Klicken Sie auf die untenstehende Schaltfläche, um Ihren Browser so einzustellen, dass er %{pod_url} zur Erkennung von externen web+diaspora:// Links nutzt." + register: "Registriere den web+diaspora:// Handler auf diesem Browser" title: "web+diaspora:// protocol handler" receive_email_notifications: "E-Mail-Benachrichtigungen empfangen, wenn:" request_export: "Meine Profildaten anfordern" diff --git a/config/locales/diaspora/el.yml b/config/locales/diaspora/el.yml index d3dd49eba..68b38f9f7 100644 --- a/config/locales/diaspora/el.yml +++ b/config/locales/diaspora/el.yml @@ -469,7 +469,6 @@ el: updated: "Το προφίλ ενημερώθηκε" public: "Δημόσιο" registrations: - closed: "Οι εγγραφές είναι κλειστές σε αυτό το pod του diaspora*." create: success: "Έγινες μέλος στο diaspora*!" invalid_invite: "Ο σύνδεσμος που έδωσες δεν είναι πια έγκυρος!" diff --git a/config/locales/diaspora/en_1337.yml b/config/locales/diaspora/en_1337.yml index f547e499c..ae7605555 100644 --- a/config/locales/diaspora/en_1337.yml +++ b/config/locales/diaspora/en_1337.yml @@ -440,7 +440,6 @@ en_1337: updated: "PR0F1L3 UPD473D" public: "pub1!c" registrations: - closed: "51GNUP5 4R3 CL053D 0N 7H15 D* P0D!" create: success: "U H4V3 J01N3D D*" invalid_invite: "7H3 1NV173 L1NK U PR0V1D3D 15 N0 L0N63R V4L1D!" diff --git a/config/locales/diaspora/en_pirate.yml b/config/locales/diaspora/en_pirate.yml index cdd026664..ac63d8060 100644 --- a/config/locales/diaspora/en_pirate.yml +++ b/config/locales/diaspora/en_pirate.yml @@ -408,7 +408,6 @@ en_pirate: updated: "Ye profile updated" public: "The Sea can see this" registrations: - closed: "Signups be closed on this ship!" create: success: "Ye've joined diaspora*! YARGH!" invalid_invite: "The invite link ye provided is no longer valid ye scalawag! Yar!" diff --git a/config/locales/diaspora/en_shaw.yml b/config/locales/diaspora/en_shaw.yml index a06872275..3088871c8 100644 --- a/config/locales/diaspora/en_shaw.yml +++ b/config/locales/diaspora/en_shaw.yml @@ -304,7 +304,6 @@ en_shaw: updated: "𐑐𐑮𐑴𐑓𐑲𐑤 𐑳𐑐𐑛𐑱𐑑𐑩𐑛" public: "𐑐𐑳𐑚𐑤𐑦𐑒" registrations: - closed: "𐑕𐑲𐑯𐑩𐑐𐑕 𐑸 𐑒𐑤𐑴𐑟𐑛 𐑪𐑯 𐑞𐑦𐑕 ·𐑛𐑦𐑨𐑕𐑐𐑹𐑩 𐑐𐑪𐑛." create: success: "𐑿'𐑝 𐑡𐑶𐑯𐑛 ·𐑛𐑦𐑨𐑕𐑐𐑹𐑩!" new: diff --git a/config/locales/diaspora/en_valspeak.yml b/config/locales/diaspora/en_valspeak.yml index 5bd4e3c83..305e5df24 100644 --- a/config/locales/diaspora/en_valspeak.yml +++ b/config/locales/diaspora/en_valspeak.yml @@ -765,7 +765,6 @@ en_valspeak: updated: "Profie updated!!! <3" public: "like, every1 can c this" registrations: - closed: "Signups r like... closed on here... sry bout that :\\ totally lame, right?" create: success: "u've joined d*!!! OMFG YAAAAAYYY!! :DDD" invalid_invite: "OMG, dude, ur invite link is like... SOOOO old... like... gross. so like, sry but its no longer valid. Kthxbye<3" diff --git a/config/locales/diaspora/eo.yml b/config/locales/diaspora/eo.yml index b51ad479c..f8aa1db3b 100644 --- a/config/locales/diaspora/eo.yml +++ b/config/locales/diaspora/eo.yml @@ -529,7 +529,6 @@ eo: updated: "Profilo ĝisdatigita" public: "Publika" registrations: - closed: "Registrado estas fermita ĉe tiu ĉi DIASPORA* 'pod' (servilo)." create: success: "Vi aniĝis al DIASPORA*!" invalid_invite: "La invitoligilo, kiun vi donis, ne plu validas!" diff --git a/config/locales/diaspora/es-AR.yml b/config/locales/diaspora/es-AR.yml index 7041e8082..8b52739b3 100644 --- a/config/locales/diaspora/es-AR.yml +++ b/config/locales/diaspora/es-AR.yml @@ -965,7 +965,6 @@ es-AR: updated: "Perfil actualizado" public: "Público" registrations: - closed: "Los registros están cerrados en este servidor de diaspora*." create: success: "¡Te has unido a diaspora*!" invalid_invite: "¡El enlace de la invitación ya no es válido!" diff --git a/config/locales/diaspora/es-CL.yml b/config/locales/diaspora/es-CL.yml index 9a4d81071..7c47f7894 100644 --- a/config/locales/diaspora/es-CL.yml +++ b/config/locales/diaspora/es-CL.yml @@ -563,7 +563,6 @@ es-CL: updated: "Perfil actualizado" public: "Publico" registrations: - closed: "Los registros están cerrados en este servidor de Diaspora." create: success: "¡Te has unido a Diaspora!" invalid_invite: "¡El enlace de invitación ya no es válido!" diff --git a/config/locales/diaspora/es-MX.yml b/config/locales/diaspora/es-MX.yml index bd87397be..77b3a49bd 100644 --- a/config/locales/diaspora/es-MX.yml +++ b/config/locales/diaspora/es-MX.yml @@ -560,7 +560,6 @@ es-MX: updated: "Perfil actualizado" public: "Público" registrations: - closed: "Los registros están cerrados en este servidor de Diaspora." create: success: "¡Te has unido a Diaspora!" invalid_invite: "¡El enlace de invitación que proporcionaste ya no es válido!" diff --git a/config/locales/diaspora/es.yml b/config/locales/diaspora/es.yml index 00929b83a..c7b804b1c 100644 --- a/config/locales/diaspora/es.yml +++ b/config/locales/diaspora/es.yml @@ -33,7 +33,7 @@ es: reshare: attributes: root_guid: - taken: "Es buena, ¿eh? ¡Ya habías compartido esa publicación!" + taken: "Genial pero... ¡ya has compartido esa publicación!" user: attributes: email: @@ -69,7 +69,7 @@ es: zero: "%{count} comentarios" current_segment: "El período actual tiene un promedio de %{post_yest} publicaciones por usuario, de %{post_day}" daily: "Diario" - display_results: "Mostrando resultados del período %{segment}" + display_results: "Mostrando resultados en el espacio de tiempo %{segment}" go: "Adelante" month: "Mes" posts: @@ -94,6 +94,7 @@ es: email: "Correo Electrónico" guid: "GUID" id: "identificador" + invite_token: "Token de invitación" last_seen: "visto por última vez" moderator: "Moderador" ? "no" @@ -170,18 +171,18 @@ es: aud: description: "" name: - name: "nombre" + name: "Nombre" nickname: name: "apodo" openid: description: "Permite que la aplicación lea tu perfil básico" name: "perfil básico" picture: - description: "Esto otorga permisos de imagen a la aplicación." + description: "Esto permite a la aplicación el acceso a la galería de imágenes." name: "fotografía" profile: - description: "Esto permite que la aplicación lea tu perfil completo" - name: "Perfil completo" + description: "Esto permite que la aplicación tenga acceso a la información que figura en tu perfil." + name: "Perfil." read: description: "Esto permite a la aplicación leer tu portada, tus conversaciones y tu perfil completo" name: "leer perfil, portada y conversaciones" @@ -219,7 +220,7 @@ es: stay_updated: "Mantente actualizado" stay_updated_explanation: "Tu página principal la forman todos tus contactos, las etiquetas que sigues, y si lo deseas, las publicaciones de diferentes miembros creativos de la comunidad." destroy: - failure: "%{name} no pudo ser eliminado." + failure: "%{name} no ha podido eliminarse." success: "%{name} fue eliminado con éxito." success_auto_follow_back: "Se borró correctamente %{name}. Este aspecto se usaba para seguir automáticamente a los usuarios, revisa tu configuración para seleccionar un nuevo aspecto de autoseguimiento." edit: @@ -249,7 +250,7 @@ es: tag_question: "pregunta" tutorial_link_text: "Tutoriales" tutorials_and_wiki: "%{faq}, %{tutorial} y %{wiki}: ayuda para dar tus primeros pasos." - introduce_yourself: "Ésta es tu página principal. Adelante, preséntate..." + introduce_yourself: "Ésta es tu página principal. ¡Adelante, preséntate!" keep_pod_running: "Haz que %{pod} vaya más rápido, ¡invita a café a nuestros servidores con una donación mensual!" new_here: follow: "¡Sigue %{link} y da la bienvenida a los nuevos miembros de Diaspora*!" @@ -275,7 +276,7 @@ es: success: "Tu aspecto, %{name}, fue editado con éxito." blocks: create: - failure: "No pude ignorar a este usuario. #evasion" + failure: "No ha sido posible ignorar a este usuario. #evasiónderesponsabilidades" success: "Bien, no verás a esa persona en tu entrada otra vez. #silencio!" destroy: failure: "No podría dejar de ignorar a ese usuario. #evasion" @@ -585,9 +586,11 @@ es: byline: "La red social mundial donde tú tienes el control" choose_your_audience: "Escoge tu público" choose_your_audience_info: "Los aspectos de diaspora* te permiten compartir sólamente con las personas que quieras. Puedes ser tan público o privado como prefieras. Comparte una foto divertida con el mundo entero, o un oscuro secreto con tus amigos más cercanos. Tú tienes el control." + diaspora_site_link: "Red federada de diaspora*" headline: "Bienvenido a %{pod_name}" own_your_data: "Sé el dueño de tus datos" own_your_data_info: "Muchas redes usan tus datos para hacer dinero analizando tus interacciones y usando esa información para mostrarte anuncios. diaspora* no usa tus datos para ningún propósito distinto que permitirte estar en contacto con otros." + part_of_diaspora: "Parte de %{diaspora_site_link}" podmin: byline: "Estas a punto de cambiar internet. Vamos a configurarlo, ¿de acuerdo?" configuration_info: "Abre %{database_path} y %{diaspora_path} en tu editor de texto favorito y revisalos cuidadosamente, están comentados al detalle." @@ -608,7 +611,7 @@ es: update_your_pod: "Actualiza tu pod" update_your_pod_info: "Puedes encontrar %{update_instructions}" invitation_codes: - already_logged_in: "Has sido invitado por %{inviter} para unirte a este pod, pero ya tienes la sesión iniciada." + already_logged_in: "Has recibido una invitación de %{inviter} para unirte a este pod pero ya has iniciado la sesión." not_valid: "Ese código de invitación ya no es válido" invitations: create: @@ -616,7 +619,7 @@ es: empty: "Por favor, introduce al menos una dirección de correo electrónico." no_more: "No tienes más invitaciones." note_already_sent: "Las invitaciones han sido enviadas a: %{emails}" - rejected: "Hubo problemas con las siguientes direcciones de correo: %{emails}" + rejected: "Por favor, verifica las siguientes direcciones de correo electrónico: %{emails}" sent: "Las invitaciones han sido enviadas a: %{emails}" new: codes_left: @@ -649,7 +652,7 @@ es: toggle_navigation: "Cambiar navegación" likes: create: - error: "¡Falló el 'me gusta'!" + error: "Ha ocurrido un error al darle \"Me gusta\"." destroy: error: "Ocurrió un error al quitar el \"Me gusta\"" limited: "Limitado" @@ -688,6 +691,7 @@ es: mark_read: "Marcar como leído" mark_unread: "Marcar como no leído" mentioned: "Mencionado" + mentioned_in_comment: "Mencionado en el comentario." no_notifications: "Todavía no tienes ninguna notificación." notifications: "Notificaciones" reshared: "Compartido" @@ -710,6 +714,9 @@ es: one: "%{actors} te ha mencionado en una publicación eliminada." other: "%{actors} te han mencionado en una publicación eliminada." zero: "%{actors} te han mencionado en una publicación eliminada." + mentioned_in_comment: + one: "%{actors} te ha mencionado en un comentario de la publicación %{post_link}." + other: "%{actors} te han mencionado en un comentario de la publicación %{post_link}." mentioned_in_comment_deleted: one: "%{actors} te ha mencionado en un comentario eliminado." other: "%{actors} te han mencionado en un comentario eliminado." @@ -748,26 +755,26 @@ es: view_profile: "Ver el perfil de %{name}" csrf_token_fail: body: |- - Hola %{name}, + Hola, %{name}: - diaspora* ha detectado un intento de acceso a tu cuenta que podría ser no autorizado. Para evitar que tu información pueda verse comprometida, se ha cerrado tu sesión. No te preocupes, puedes entrar otra vez de forma segura. + Diaspora* ha detectado un intento de acceso a tu cuenta que podría ser no autorizado. Se ha procedido al cierre de sesión para evitar que tu información pueda verse comprometida. No te preocupes; puedes entrar otra vez de forma segura. - Se ha recibido una solicitud usando un token CSFR incorrecto o incompleto. Podría ser algo inocente, pero podría ser también una petición falsificada procedente de otra web (CSFR). + Se ha recibido una solicitud usando un token CSFR incorrecto o inexistente. Podría ser algo inocente, pero podría ser también una petición falsificada procedente de otra web (un ataque CSFR). - Esto podría haber sido causado por: + Puede haber varios motivos por los que esto puede haber ocurrido: - - Una extensión manipulando la solicitud o realizando solicitudes sin emplear un token (código de seguridad); - - Una pestaña abierta de la sesión anterior; - - Otra página web realizando solicitudes, con o sin tu permiso; + - Una extensión manipulando la solicitud o realizando solicitudes sin emplear un token (código de seguridad). + - Una pestaña abierta de la sesión anterior. + - Otra página web realizando solicitudes, con o sin tu permiso. - Otras aplicaciones externas; - Código malicioso intentando acceder a tu información. Para más información acerca de CSFR ver %{link}%{link}. - Si ves este mensaje de forma repetida, por favor revisa los anteriores puntos, incluyendo las extensiones de tu buscador de internet.  + Si ves este mensaje de forma repetida, por favor revisa los anteriores puntos, incluyendo las extensiones de tu navegador de internet.  Gracias, - El robot del email de dispora*! + ¡El robot de email de dispora*! subject: "Hemos recibido una solicitud no autorizada desde tu cuenta, %{name}" email_sent_by_diaspora: "Este correo electrónico fue enviado por %{pod_name}. Si quieres dejar de recibir correos como este," export_email: @@ -842,6 +849,9 @@ es: mentioned: limited_post: "Se te mencionó en un post privado." subject: "%{name} te mencionó en diaspora*" + mentioned_in_comment: + limited_post: "Te han mencionado en un comentario de una publicación privada." + reply: "Contestar o ver esta conversación >" private_message: reply_to_or_view: "Responder o ver esta conversación >" subject: "Tienes un nuevo mensaje privado" @@ -975,7 +985,11 @@ es: updated: "Perfil actualizado" public: "Público" registrations: - closed: "Los registros están cerrados en este servidor de Diaspora." + closed: + another_pod: "Otro pod" + closed_pod: "La inscripción de nuevos usuarios se encuentra cerrada en este momento en este pod. Puedes unirte de todas maneras a la red de diaspora* registrándote en %{wiki}. ¡Tendrás acceso al mismo tipo de contenido ya que todos los pods están entrelazados y conectados de forma interna!" + find_pods: "Lista de los pods en los que es posible registrarse: %{poduptime}" + other_questions: "Échale un vistazo nuestra %{wiki} si no sabes que pod elegir." create: success: "¡Te has unido a Diaspora*!" invalid_invite: "¡El enlace de la invitación ya no es válido!" @@ -1050,11 +1064,11 @@ es: mobile_row_checked: "%{name} (eliminar)" mobile_row_unchecked: "%{name} (añadir)" toggle: - one: "En %{count} aspecto" - other: "En %{count} aspectos" - zero: "En ningún aspecto" + one: "En %{count} grupo." + other: "En %{count} grupos." + zero: "En ningún grupo." invitations: - by_email: "Invita a más personas a través de correo electrónico." + by_email: "Mandar invitaciones por correo electrónico." invite_your_friends: "Invita a tus contactos" invites: "Invitaciones" share_this: "¡Comparte este enlace a través de correo electrónico, blog o tu red social favorita!" @@ -1063,11 +1077,11 @@ es: control_your_audience: "Controla tu público" logged_in: "Conectado a %{service}" manage: "Gestionar servicios conectados" - new_user_welcome_message: "Utiliza #etiquetas para clasificar tus publicaciones y encuentra a gente que comparte tus intereses. Nombra a personas especiales usando @Mentions" + new_user_welcome_message: "Utiliza #etiquetas para clasificar tus publicaciones y encontrar a gente que comparte tus aficiones. Usa las @menciones para mencionar a quien quieras." outside: "Los mensajes públicos podrán ser vistos por otros fuera de Diaspora*." share: "Comparte" title: "Configurar los servicios conectados" - visibility_dropdown: "Usa este menú desplegable para cambiar la visibilidad de tu publicación. (Te sugerimos hacerlo público la primera vez.)" + visibility_dropdown: "Usa este menú desplegable para cambiar la visibilidad de tu publicación. (Te recomendamos que esta primera publicación sea pública)." publisher: discard_post: "Descartar publicación" formatWithMarkdown: "Puedes usar %{markdown_link} para dar formato al mensaje." @@ -1163,6 +1177,41 @@ es: one: "Una persona etiquetada con %{tag}" other: "%{count} personas etiquetadas con %{tag}" zero: "Nadie etiquetado con %{tag}" + two_factor_auth: + activated: + change_button: "Desactivar." + change_label: "Introduce tu contraseña para desactivar la autentificación de doble factor." + status: "Se ha activado la autentificación de doble factor." + confirm: + activate_button: "Confirmar y activar." + input_explanation: "Cuando hayas escaneado el código QR o introducido el secreto, introduce el código de seis dígitos y confirma la configuración." + input_title: "Confirmar con token TOTP." + manual_explanation: "En caso de no poder escanear el código QR automáticamente, puedes introducir manualmente el secreto en tu aplicación." + manual_explanation_cont: "Estamos usando contraseñas de un solo uso con tiempo limitado de utilización (TOTP) con tokens de seis dígitos. Si tu aplicación te pide un intervalo de tiempo y un algoritmo, introduce 30 segundos y sha1 respectivamente.
Los espacios se muestran solamente para facilitar la lectura. Por favor, intruce el código sin espacios." + scan_explanation: "Por favor, escanea el código QR con una aplicación que soporte TOTP. Algunos ejemplos: andOTP (Android), FreeOTP (iOS), SailOTP (SailfishOS)." + scan_title: "Escanea el código QR." + status: "La autentificación de doble factor no está completamente activada todavía. Tienes que confirmar la activación con un token TOTP." + title: "Confirmar activación." + deactivated: + change_button: "Activar." + change_label: "Activar la autentificación de doble factor." + status: "La autentificación de doble factor no está activada." + explanation: "La autentificación de doble factor es una forma muy potente de asegurarse que tú eres la única persona que tiene acceso a tu cuenta. En el momento de acceder tendrás que introducir un código de seis dígitos, además de tu contraseña, para verificar tu identidad. ¡Ten mucho cuidado! El acceso a tu cuenta de diaspora* se bloqueará de forma permanente si pierdes el teléfono móvil y los códigos que se crearon al activar esta función." + flash: + error_token: "El token es incorrecto o no es válido." + success_activation: "La autentificación de doble factor ha sido activada correctamente." + success_deactivation: "La autentificación de doble factor ha sido desactivada correctamente." + input_token: + label: "Token de doble factor." + placeholder: "Token de seis dígitos para la autentificación de doble factor." + recovery: + button: "Generar nuevos códigos de recuperación." + explanation: "Puedes usar alguno de los códigos de recuperación mostrados más abajo para volver a acceder a tu cuenta si alguna vez dejas de tener acceso a tu teléfono móvil. Un ejemplo para esto sería imprimir los códigos y guardarlos junto a otra documentación importante." + explanation_short: "Los códigos de recuperación te permiten volver a acceder a tu cuenta en el caso de pérdida de tu teléfono móvil. Por favor, ten en cuenta que solo puedes usar una vez cada código." + invalidation_notice: "Por si acaso has perdido los códigos de recuperación, aquí puedes volver a generarlos. Los códigos de recuperación anteriores dejarán de tener validez." + reminder: "También puedes usar uno de los códigos de recuperación." + title: "Códigos de recuperación." + title: "Autentificación de doble factor." username: "Nombre de usuario" users: confirm_email: @@ -1195,7 +1244,7 @@ es: comment_on_post: "...alguien comentó en tu publicación" current_password: "Contraseña actual" current_password_expl: "con la que inicias sesión..." - default_post_visibility: "Seleccionados los aspectos por defecto para publicar." + default_post_visibility: "Grupos seleccionados por defecto para publicar." download_export: "Descargar mi perfil" download_export_photos: "Descargar mis fotografías" edit_account: "Editar cuenta" @@ -1207,11 +1256,14 @@ es: last_exported_html: "(Última actualización %{timeago})" liked: "a alguien le gusta tu publicación" mentioned: "te mencionan en una publicación" + mentioned_in_comment: "Te han mencionado en un comentario." new_password: "Nueva contraseña" private_message: "has recibido un mensaje privado" protocol_handler: browser: "Este protocolo está actualmente en una fase experimental y su buen funcionamiento dependerá de tu navegador. Si quieres gestionar o eliminar esta funcionalidad, puedes hacerlo a través de la configuración del navegador. El botón siempre estará activado, y tu necesitas configurar la funcionalidad en cada navegador para usarlo." + description: "web+diaspora:// es un protocolo de red que hemos introducido. Todos los enlaces que apunten a una página de diaspora* en una página web externa, y que usen este protocolo, se podrá abrir en el pod en el que tengas registrada tu cuenta de diaspora* . Pincha en el botón más abajo para indicar a tu navegador que use %{pod_url} para reconocer enlaces web+diaspora:// externos." register: "Registro" + title: "web+diaspora:// controlador de protocolo" receive_email_notifications: "Recibir notificaciones por correo cuando..." request_export: "Solicitar los datos de mi perfil" request_export_photos: "Solicitar mis fotografías" diff --git a/config/locales/diaspora/eu.yml b/config/locales/diaspora/eu.yml index 420d46cfe..f68f0ac29 100644 --- a/config/locales/diaspora/eu.yml +++ b/config/locales/diaspora/eu.yml @@ -429,7 +429,6 @@ eu: updated: "Profila eguneratu duzu." public: "Publikoa" registrations: - closed: "Izen emateak itxirik daude Diaspora zerbitzari hontan." create: success: "Diasporarekin bat egin duzu!" invalid_invite: "Eman duzun gonbidapen esteka ez da jada baliagarria!" diff --git a/config/locales/diaspora/fi.yml b/config/locales/diaspora/fi.yml index 23540ef5a..3b69c0393 100644 --- a/config/locales/diaspora/fi.yml +++ b/config/locales/diaspora/fi.yml @@ -919,7 +919,6 @@ fi: updated: "Profiili päivitetty" public: "Julkinen" registrations: - closed: "Rekisteröityminen on suljettu tässä Diaspora-podissa." create: success: "Olet liittynyt Diasporaan!" invalid_invite: "Antamasi kutsulinkki ei ole enää voimassa!" diff --git a/config/locales/diaspora/fr.yml b/config/locales/diaspora/fr.yml index 6b74d24c8..bd2c6b1e5 100644 --- a/config/locales/diaspora/fr.yml +++ b/config/locales/diaspora/fr.yml @@ -595,9 +595,11 @@ fr: byline: "Le réseau social où vous gardez le contrôle." choose_your_audience: "Choisissez votre public" choose_your_audience_info: "Les aspects de diaspora* vous permettent de partager seulement avec les personnes que vous choisissez. Vous demeurez aussi ouvert ou aussi restreint que vous le souhaitez. Partagez des photos amusantes avec le monde entier, ou un grand secret avec vos amis les plus proches. C'est vous qui avez le contrôle." + diaspora_site_link: "réseau fédéré diaspora*" headline: "Bienvenue sur %{pod_name}" own_your_data: "Soyez propriétaire de vos données" own_your_data_info: "De nombreux réseaux utilisent vos données pour gagner de l'argent en analysant vos interactions et en utilisant ces informations pour vous proposer des publicités ciblées. Vos données sur diaspora* ne servent qu'à vous mettre en relation et à partager avec d'autres personnes." + part_of_diaspora: "Nœud du %{diaspora_site_link}" podmin: byline: "Vous êtes sur le point de changer la face d'Internet. Prêt à vous lancer ?" configuration_info: "Ouvrez %{database_path} et %{diaspora_path} dans votre éditeur de texte favori et relisez-les soigneusement, ils sont abondamment commentés." @@ -996,7 +998,11 @@ fr: updated: "Profil mis à jour" public: "Public" registrations: - closed: "Les inscriptions sont fermées sur ce pod diaspora*." + closed: + another_pod: "un autre pod" + closed_pod: "Les inscriptions sont actuellement fermées sur ce pod. Néanmoins, vous pouvez toujours rejoindre le réseau diaspora* en vous inscrivant sur %{wiki}. Comme tous les pods sont interconnectés, vous accéderez au même contenu." + find_pods: "Une liste de pods sur lesquels vous pouvez vous inscrire est disponible sur %{poduptime}." + other_questions: "Si vous avez d'autres questions sur le choix d'un pod, consultez notre %{wiki}." create: success: "Vous avez rejoint diaspora* !" invalid_invite: "Le lien d'invitation que vous avez fourni n'est plus valide !" diff --git a/config/locales/diaspora/he.yml b/config/locales/diaspora/he.yml index c7c586103..573a2f68e 100644 --- a/config/locales/diaspora/he.yml +++ b/config/locales/diaspora/he.yml @@ -467,7 +467,6 @@ he: updated: "הפרופיל עודכן" public: "ציבורי" registrations: - closed: "ההרשמה סגורה בפוד זה של דיאספורה*." create: success: "הצטרפת לדיאספורה*!" invalid_invite: "הקישור להזמנה שסיפקת אינו תקף יותר!" diff --git a/config/locales/diaspora/hu.yml b/config/locales/diaspora/hu.yml index f9f5e0e5a..a72b3b642 100644 --- a/config/locales/diaspora/hu.yml +++ b/config/locales/diaspora/hu.yml @@ -780,7 +780,6 @@ hu: updated: "Profil frissítve" public: "Nyilvános" registrations: - closed: "A regisztrációs lehetőség zárolva van ezen a diaspora* kiszolgálón." create: success: "Csatlakoztál a diaspora* közösségi oldalra!" invalid_invite: "Ez a meghívó többé nem érvényes!" diff --git a/config/locales/diaspora/hye-classical.yml b/config/locales/diaspora/hye-classical.yml index dc917cdfd..61a442fbb 100644 --- a/config/locales/diaspora/hye-classical.yml +++ b/config/locales/diaspora/hye-classical.yml @@ -963,7 +963,6 @@ hye-classical: updated: "Էջդ թարմացուեց" public: "Հրապարակային" registrations: - closed: "Գրանցումները հասանելի չեն դիասպորա*֊ի այս հանգոյցում։" create: success: "Դու միացա՜ր դիասպորա*֊ին։" invalid_invite: "Հրաւէրի յղումը, որ տուել ես, այլեւս վաւեր չէ։" diff --git a/config/locales/diaspora/hye.yml b/config/locales/diaspora/hye.yml index 7e3995e40..d27468be7 100644 --- a/config/locales/diaspora/hye.yml +++ b/config/locales/diaspora/hye.yml @@ -926,7 +926,6 @@ hye: updated: "Էջդ թարմացվեց" public: "Հրապարակային" registrations: - closed: "Գրանցումները հասանելի չեն դիասպորա*յի այս փոդում։" create: success: "Դու միացար դիասպորա*յի՜ն։" invalid_invite: "Հրավերի հղումը, որ տվել ես, այլեւս վավեր չէ։" diff --git a/config/locales/diaspora/ia.yml b/config/locales/diaspora/ia.yml index 0f0dcb551..63e970386 100644 --- a/config/locales/diaspora/ia.yml +++ b/config/locales/diaspora/ia.yml @@ -593,9 +593,11 @@ ia: byline: "Le mundo social in linea ubi tu ha le controlo" choose_your_audience: "Elige tu audientia" choose_your_audience_info: "Le \"aspectos\" de diaspora* permitte divider cosas solmente con le personas appropriate. Tu pote scriber in publico o si privatemente como tu vole. Divide un photo amusante con tote le mundo, o divide un secreto personal con tu amicos intime. Le controlo es tue." + diaspora_site_link: "rete federate de diaspora*" headline: "Benvenite a %{pod_name}" own_your_data: "Possede tu datos" own_your_data_info: "Multe retes usa tu datos pro ganiar moneta analysante tu interactiones e usante iste information pro diriger publicitate a te. diaspora* non usa tu datos pro alcun scopo, salvo illo de permitter te de connecter e divider cosas con altere personas." + part_of_diaspora: "Parte del %{diaspora_site_link}" podmin: byline: "Tu es sur le puncto de cambiar le facie de Internet. Preste a comenciar?" configuration_info: "Aperi %{database_path} e %{diaspora_path} in tu editor de texto preferite e revide los meticulosemente; illos ha commentos extense." @@ -990,7 +992,6 @@ ia: updated: "Profilo actualisate" public: "Public" registrations: - closed: "Le creation de contos es claudite in iste pod de diaspora*." create: success: "Tu ha adherite a diaspora*!" invalid_invite: "Le ligamine de invitation que tu ha fornite non plus es valide." diff --git a/config/locales/diaspora/is.yml b/config/locales/diaspora/is.yml index 80ed8eea9..5d8ae27ce 100644 --- a/config/locales/diaspora/is.yml +++ b/config/locales/diaspora/is.yml @@ -397,7 +397,6 @@ is: updated: "Síðan mín uppfærð" public: "Opið öllum" registrations: - closed: "Lokað er fyrir innskráningar á þessum Diaspora* pod." create: success: "Nú hefurðu tengst Diaspora*!" new: diff --git a/config/locales/diaspora/it.yml b/config/locales/diaspora/it.yml index c4f76f057..053250870 100644 --- a/config/locales/diaspora/it.yml +++ b/config/locales/diaspora/it.yml @@ -713,7 +713,6 @@ it: updated: "Profilo aggiornato" public: "Pubblico" registrations: - closed: "Su questo pod Diaspora le iscrizioni sono chiuse." create: success: "Ora fai parte di Diaspora!" invalid_invite: "L'invito che hai usato non è più valido!" diff --git a/config/locales/diaspora/ja.yml b/config/locales/diaspora/ja.yml index 0096821cc..2b51505b2 100644 --- a/config/locales/diaspora/ja.yml +++ b/config/locales/diaspora/ja.yml @@ -964,7 +964,6 @@ ja: updated: "プロフィールを更新しました" public: "公開" registrations: - closed: "このダイアスポラ*ポッドでは新規登録を受け付けていません。" create: success: "ダイアスポラの新規登録が完了しました!" invalid_invite: "提供された招待リンクは、もはや有効ではありません!" diff --git a/config/locales/diaspora/ka.yml b/config/locales/diaspora/ka.yml index 56e5d4635..63ef21388 100644 --- a/config/locales/diaspora/ka.yml +++ b/config/locales/diaspora/ka.yml @@ -350,7 +350,6 @@ ka: updated: "პროფილი განახლდა" public: "საჯაროდ" registrations: - closed: "რეგისტრაცია დახურულია დიასპორას ამ პოდზე." create: success: "თქვენ შეუერთდით დიასპორას!" new: diff --git a/config/locales/diaspora/ko.yml b/config/locales/diaspora/ko.yml index d93a23310..50f0f7478 100644 --- a/config/locales/diaspora/ko.yml +++ b/config/locales/diaspora/ko.yml @@ -444,7 +444,6 @@ ko: updated: "프로필을 업데이트했습니다" public: "공개" registrations: - closed: "우리 디아스포라 팓은 가입이 닫혀있습니다." create: success: "디아스포라에 가입되었습니다!" invalid_invite: "내가 제공한 초대 링크가 더 이상 유효하지 않습니다!" diff --git a/config/locales/diaspora/la.yml b/config/locales/diaspora/la.yml index dee73a872..243957b32 100644 --- a/config/locales/diaspora/la.yml +++ b/config/locales/diaspora/la.yml @@ -196,7 +196,7 @@ la: publisher: new_user_prefill: hello: "Salvēte, mihi nōmen est %{new_user_tag}. " - newhere: "nova/novus" + newhere: "NovusHic" posting: "Dīvulgāre..." share: "Impertī" whats_on_your_mind: "Quid tibi in animō est?" diff --git a/config/locales/diaspora/lt.yml b/config/locales/diaspora/lt.yml index c2353d40c..7d20f2ba7 100644 --- a/config/locales/diaspora/lt.yml +++ b/config/locales/diaspora/lt.yml @@ -298,7 +298,6 @@ lt: updated: "Profilis atnaujintas" public: "Viešas" registrations: - closed: "Naujų paskyrų kūrimas šiame Diasporos serveryje yra uždarytas." create: success: "Prisijungei prie Diasporos!" new: diff --git a/config/locales/diaspora/mk.yml b/config/locales/diaspora/mk.yml index 41e56a7b8..bca8726e3 100644 --- a/config/locales/diaspora/mk.yml +++ b/config/locales/diaspora/mk.yml @@ -250,7 +250,6 @@ mk: your_tags_placeholder: "i.e. #diaspora #ironing #kittens #music" public: "Јавно" registrations: - closed: "Регистрирањето е затворено." create: success: "Вие и се придруживте на Diaspora!" new: diff --git a/config/locales/diaspora/ml.yml b/config/locales/diaspora/ml.yml index 13046e5c7..57bbf1827 100644 --- a/config/locales/diaspora/ml.yml +++ b/config/locales/diaspora/ml.yml @@ -532,7 +532,6 @@ ml: updated: "പ്രൊഫൈല്‍ വിജയകരമായൊ തിരുത്തിയിരിക്കുന്നു." public: "പൊതുവായി" registrations: - closed: "ഈ ഡയാസ്പുറ പോഡില്‍ ചേരുന്നത് അടച്ചിരിക്കുന്നു." create: success: "താങ്കള്‍ ഡയസ്പോറയില്‍ ചേര്‍ന്നിരിക്കുന്നു!" invalid_invite: "താങ്കൾ നൽകിയ ക്ഷണക്കത്ത് സാധുവല്ല!" diff --git a/config/locales/diaspora/nb.yml b/config/locales/diaspora/nb.yml index eeb81e78e..e3af2cc1f 100644 --- a/config/locales/diaspora/nb.yml +++ b/config/locales/diaspora/nb.yml @@ -985,7 +985,6 @@ nb: updated: "Profil oppdatert" public: "Offentlig" registrations: - closed: "Denne diaspora*-belgen er stengt for registreringer." create: success: "Du er nå med i diaspora*!" invalid_invite: "Invitasjonslenken som du brukte er ikke gyldig lenger!" diff --git a/config/locales/diaspora/nds.yml b/config/locales/diaspora/nds.yml index 7d9882034..52cf3f1e2 100644 --- a/config/locales/diaspora/nds.yml +++ b/config/locales/diaspora/nds.yml @@ -582,7 +582,6 @@ nds: updated: "Profil aktualisiert" public: "Öffentlich" registrations: - closed: "Registrerungen sind op dissen diaspora*-Pod schloten." create: success: "Du bist nu bi diaspora*!" invalid_invite: "Dien Inlodungslink is nich mehr gültig!" diff --git a/config/locales/diaspora/nl.yml b/config/locales/diaspora/nl.yml index eee6c634b..105f4374e 100644 --- a/config/locales/diaspora/nl.yml +++ b/config/locales/diaspora/nl.yml @@ -994,7 +994,6 @@ nl: updated: "Profiel bijgewerkt" public: "Openbaar" registrations: - closed: "Registratie op deze diaspora* pod is niet mogelijk." create: success: "Je bent nu lid van diaspora*!" invalid_invite: "De uitnodigingslink die je gebruikt is niet langer geldig!" diff --git a/config/locales/diaspora/nn.yml b/config/locales/diaspora/nn.yml index 12900bb09..0d3b550be 100644 --- a/config/locales/diaspora/nn.yml +++ b/config/locales/diaspora/nn.yml @@ -482,7 +482,6 @@ nn: updated: "Profilen vart oppdatert" public: "Offentleg" registrations: - closed: "Kan ikkje oppretta brukarar på denne Diaspora-poden." create: success: "Du er vorten med i Diaspora." invalid_invite: "Invitasjonslenkja du nytta er ikkje lengjer gyldig!" diff --git a/config/locales/diaspora/oc.yml b/config/locales/diaspora/oc.yml index 9b5b4b398..71ce42897 100644 --- a/config/locales/diaspora/oc.yml +++ b/config/locales/diaspora/oc.yml @@ -595,9 +595,11 @@ oc: byline: "La ret sociala ont gardatz lo contraròtle." choose_your_audience: "Causissètz vòstre public" choose_your_audience_info: "Los aspèctes de diaspora* vos permeton de partejar solament amb lo mond que volètz. Podètz èsser public o privat tan que volètz. Partejatz una fòto divertissenta amb lo mond complet, o un grand secrèt amb vòstre melhors amics. Avètz lo contraròtle." + diaspora_site_link: "Malhum federat diapora*" headline: "Benvenguda sus %{pod_name}" own_your_data: "Siatz proprietari de vòstras donadas" own_your_data_info: "Mantun rets emplegan vòstras donadas per se far de moneda en analisant vòstras interaccions e en emplegant aquelas informacions per vos far de reclama. diaspora* utilizant pas vòstras donadas que per vos permetre de comunicar e partejar amb lo mond." + part_of_diaspora: "Membre del %{diaspora_site_link}" podmin: byline: "Sètz a mand de cambiar la fàcia d'Internet. Prèst a vos lançar ?" configuration_info: "Dobrissètz %{database_path} e %{diaspora_path} dins vòstre editor de tèxte favorit e relegissètz-los menimosament, son comentats abondament." @@ -992,7 +994,8 @@ oc: updated: "Perfil a jorn" public: "Public" registrations: - closed: "Las inscripcions son tampadas sus aqueste pod diaspora*." + closed: + another_pod: "un autre pod" create: success: "Avètz rejunt diaspora*!" invalid_invite: "Lo ligam de convit donat es pas mai valid !" @@ -1180,6 +1183,30 @@ oc: one: "1 persona marcada amb %{tag}" other: "%{count} personas marcadas amb %{tag}" zero: "Degun es pas marcat amb %{tag}" + two_factor_auth: + activated: + change_button: "Desactivar" + change_label: "Desactivatz l’autentificacion en dos temps en picar vòstre senhal" + status: "Autentificacion en dos temps activiada" + confirm: + activate_button: "Confirmar e activar" + input_title: "Confirmar amb un geton TOTP" + scan_title: "Numerizar lo còdi QR" + title: "Confirmatz l’activacion" + deactivated: + change_button: "Activar" + change_label: "Activar l’autentificacion en dos temps" + status: "L’autentificacion en dos temps es pas activada" + flash: + error_token: "Lo geton èra incorrècte o invalid" + success_activation: "Autentificacion en dos temps corrèctament activada" + success_deactivation: "Autentificacion en dos temps corrèctament desactivada" + input_token: + label: "Geton dos factors" + recovery: + button: "Generar de nòus còdis de recuperacion" + title: "Còdis de recuperacion" + title: "Autentificacion en dos temps" username: "Nom d'utilizaire" users: confirm_email: diff --git a/config/locales/diaspora/pl.yml b/config/locales/diaspora/pl.yml index 87f8a41eb..e4d4b165a 100644 --- a/config/locales/diaspora/pl.yml +++ b/config/locales/diaspora/pl.yml @@ -998,7 +998,6 @@ pl: updated: "Profil został pomyślnie zaktualizowany" public: "Publiczny" registrations: - closed: "Ten pod diaspory* nie zezwala na rejestrację nowych użytkowników." create: success: "Dołączyłeś do diaspory*!" invalid_invite: "Podane łącze do zaproszenia jest nieważne!" diff --git a/config/locales/diaspora/pt-BR.yml b/config/locales/diaspora/pt-BR.yml index ca57342ef..51f830cd7 100644 --- a/config/locales/diaspora/pt-BR.yml +++ b/config/locales/diaspora/pt-BR.yml @@ -431,7 +431,7 @@ pt-BR: get_support_a_wiki: "Pesquise na %{link}" get_support_q: "E se minha pergunta não for respondida neste FAQ? Onde mais eu posso encontrar ajuda?" getting_started_a: "Você está com sorte. Experimente a %{tutorial_series} no site do projeto. Ela é um guia, passo a passo, para o processo de cadastro e para os recursos básicos da diaspora*." - getting_started_q: "Socorro! Preciso de alguma ajuda básica para começar!" + getting_started_q: "Socorro! Preciso aprender o básico para começar!" title: "Obter ajuda" getting_started_tutorial: "a série tutorial \"Começando\"" here: "aqui" @@ -593,9 +593,11 @@ pt-BR: byline: "O mundo social on-line em que você está no controle" choose_your_audience: "Escolha sua plateia" choose_your_audience_info: "Os aspectos da diaspora* permitem que você decida com quem vai compartilhar. Você escolhe quanta privacidade quer ter. Compartilhe uma foto engraçada com todo mundo e guarde aquele segredo para os seus amigos mais próximos. Você está no controle." + diaspora_site_link: "rede federada diaspora*" headline: "É bom ver você em %{pod_name}" own_your_data: "Os seus dados são seus" own_your_data_info: "Várias redes lucram com seus dados, analisando as suas interações e usando as informações obtidas para fazer publicidade. A diaspora* não usa seus dados para nada além de possibilitar que você se conecte e compartilhe com outras pessoas." + part_of_diaspora: "Parte da %{diaspora_site_link}" podmin: byline: "Você está prestes a revolucionar a internet. Vamos começar?" configuration_info: "Abra %{database_path} e %{diaspora_path} no seu editor de texto favorito e revise-os cuidadosamente, estão minuciosamente comentados." @@ -989,7 +991,11 @@ pt-BR: updated: "Perfil Atualizado!" public: "Público" registrations: - closed: "Os cadastros estão temporariamente desabilitados neste servidor diaspora*." + closed: + another_pod: "outro pod" + closed_pod: "Este pod está fechado para novos cadastros, porém você ainda pode entrar na rede diaspora* cadastrando-se em %{wiki}. Como todos os pods estão interconectados, de lá você terá acesso ao mesmo conteúdo." + find_pods: "Há uma lista de pods nos quais você pode se cadastrar em %{poduptime}." + other_questions: "Se você tiver alguma outra pergunta sobre a seleção de pods, confira nossa %{wiki}." create: success: "Você se juntou à diaspora*!" invalid_invite: "O link com o convite não é mais válido." @@ -1186,8 +1192,8 @@ pt-BR: input_explanation: "Depois de escanear ou digitar a senha, insira o código de seis dígitos que apareceu para você e confirme." input_title: "Confirme com o código TOTP" manual_explanation: "Caso não possa escanear o código QR de forma automática, digite a senha manualmente no aplicativo." - manual_explanation_cont: "Usamos senhas únicas baseadas em tempo (TOTP) com códigos de seis dígitos. Caso o seu aplicativo pergunte intervalo de tempo e algoritmo, insira 30 segundos e sha1, respectivamente.
Os espaços servem apenas para melhorar a legibilidade; por favor, digite o código sem eles." - scan_explanation: "Por favor, escaneie o código QR com um aplicativo que leia TOTP, tal como andOTP (Android), FreeOTP (iOS), SailOTP (SailfishOS)." + manual_explanation_cont: "Usamos senhas únicas baseadas em tempo (TOTP) com códigos de seis dígitos. Caso o seu aplicativo pergunte intervalo de tempo e algoritmo, insira 30 segundos e SHA-1, respectivamente.
Os espaços servem apenas para melhorar a legibilidade; por favor, digite o código sem eles." + scan_explanation: "Por favor, escaneie o código QR com um aplicativo que leia TOTP, tal como andOTP (Android), FreeOTP (iOS) ou SailOTP (SailfishOS)." scan_title: "Escaneie o código QR" status: "A autenticação em duas etapas ainda não foi ativada completamente; você precisa confirmar a ativação com um código TOTP." title: "Confirmar ativação" @@ -1195,7 +1201,7 @@ pt-BR: change_button: "Ativar" change_label: "Ativar autenticação em duas etapas" status: "Autenticação em duas etapas desativada" - explanation: "A autenticação em duas etapas é uma maneira eficiente de garantir que você seja a única pessoa capaz de entrar na sua conta. Ao entrar, você terá que digitar um código de seis dígitos além da sua senha para provar a sua identidade. Mas cuidado: se você perder seu celular e os códigos de recuperação criados durante a ativação deste recurso, o acesso à sua conta na diaspora* será bloqueado para sempre." + explanation: "A autenticação em duas etapas é uma maneira eficiente de garantir que você seja a única pessoa capaz de entrar na sua conta. Ao entrar, você terá que digitar um código de seis dígitos, além da sua senha, para provar a sua identidade. Mas cuidado: se você perder seu celular e os códigos de recuperação criados durante a ativação deste recurso, o acesso à sua conta na diaspora* será bloqueado para sempre." flash: error_token: "Código incorreto ou inválido" success_activation: "Autenticação em duas etapas ativada com sucesso" @@ -1205,9 +1211,9 @@ pt-BR: placeholder: "código de autenticação com seis dígitos" recovery: button: "Gerar novos códigos de recuperação" - explanation: "Se algum dia você perder o seu celular, você pode usar um dos códigos de recuperação abaixo para recuperar o acesso à sua conta. Guarde-os em segurança. Por exemplo, você pode imprimi-los e armazená-los junto com outros documentos importantes." - explanation_short: "Códigos de recuperação permitem que você recupere o acesso à conta caso você perca seu celular. Repare que você só pode usar cada código uma única vez." - invalidation_notice: "Se você perder seus códigos de recuperação, pode regerá-los aqui. Os antigos serão invalidados." + explanation: "Se algum dia você perder o seu celular, poderá usar um dos códigos de recuperação abaixo para recuperar o acesso à sua conta. Guarde-os em segurança. Por exemplo, você pode imprimi-los e armazená-los junto com outros documentos importantes." + explanation_short: "Códigos de recuperação permitem que você recupere o acesso à conta caso perca seu celular. Repare que você só pode usar cada código uma única vez." + invalidation_notice: "Se você perder seus códigos de recuperação, poderá regerá-los aqui. Os antigos serão invalidados." reminder: "Uma alternativa é usar um dos códigos de recuperação." title: "Códigos de recuperação" title: "Autenticação em duas etapas" diff --git a/config/locales/diaspora/pt-PT.yml b/config/locales/diaspora/pt-PT.yml index 9a2e15905..1498253fe 100644 --- a/config/locales/diaspora/pt-PT.yml +++ b/config/locales/diaspora/pt-PT.yml @@ -734,7 +734,6 @@ pt-PT: updated: "Perfil atualizado" public: "Público" registrations: - closed: "Os registos estão encerrados neste servidor do diaspora*." create: success: "Aderiu ao diaspora*!" invalid_invite: "A hiperligação de convite fornecida já não é válida!" diff --git a/config/locales/diaspora/ro.yml b/config/locales/diaspora/ro.yml index 905c17450..3c78febbe 100644 --- a/config/locales/diaspora/ro.yml +++ b/config/locales/diaspora/ro.yml @@ -25,6 +25,10 @@ ro: attributes: poll: already_participated: "Deja ai răspuns la acest chestionar!" + reshare: + attributes: + root_guid: + taken: "Atat de bun, ei? Ai distribuit deja acea postare!" user: attributes: email: @@ -40,6 +44,7 @@ ro: pod_network: "Rețeaua de servere" pod_stats: "Statisticile serverului" user_search: "Căutare utilizatori" + weekly_user_stats: "Statistici saptamanale ale utilizatorului" pods: pod_network: "Rețeaua de servere" stats: @@ -50,9 +55,23 @@ ro: one: "%{count} comentariu" other: "%{count} comentarii" zero: "%{count} comentarii" + current_segment: "Media postarilor de la data de %{post_day} a segmentului curent este de %{post_yest}" daily: "Zilnic" + display_results: "Afisare rezultate pentru segmentul %{segment}" go: "Înainte" month: "Lună" + posts: + few: "%{count} postari" + one: "%{count} postare" + other: "%{count} postari" + zero: "postari" + shares: + few: "%{count} distribuiri" + one: "O singura distribuire" + other: "%{count} distribuiri" + zero: "distribuiri" + tag_name: "Numele etichetei: %{name_tag} Numarul: %{count_tag}" + usage_statistic: "Statistici ale utilizării" users: few: "%{count} utilizatori" one: "%{count} utilizator" @@ -61,13 +80,27 @@ ro: week: "Săptămână" user_search: add_invites: "Adaugă invitații" + email_to: "Trimite email pentru a invita" invite: "Invită" + under_13: "Afiseaja utilizatorilor sub 13 ani (COPPA)" users: few: "am găsit %{count} utilizatori" one: "am găsit %{count} utilizator" other: "am găsit %{count} utilizatori" zero: "am găsit %{count} utilizatori" - all_aspects: "All aspects" + you_currently: + few: "Momentan aveti %{count} invitatii ramase %{link}" + one: "Momentan mai aveti o singura invitatie ramasa %{link} " + other: "Momentan aveti %{count} invitatii ramase %{link}" + zero: "Momentan nu v-a mai ramas nici o invitatie %{link}" + weekly_user_stats: + amount_of: + few: "Numarul de utilizatori nou in aceasta saptamana este: %{count}" + one: "Numarul de utilizatori nou in aceasta saptamana este: %{count}" + other: "Numarul de utilizatori nou in aceasta saptamana este: %{count}" + zero: "Numarul de utilizatori nou in aceasta saptamana este: nici unul" + current_server: "Data curenta a serverului este %{date}" + all_aspects: "Toate aspectele" api: openid_connect: scopes: @@ -89,6 +122,7 @@ ro: aspect_listings: add_an_aspect: "+ Adaugă un aspect" aspect_stream: + make_something: "Fa ceva" stay_updated: "Rămâi la curent" stay_updated_explanation: "Fluxul tău de date este populat cu toate contactele tale, toate etichetele pe care le urmărești și articolele publicate de unii membri creativi ai comunității." destroy: @@ -117,7 +151,9 @@ ro: tag_feature: "funcție" tag_question: "întrebare" tutorial_link_text: "Îndrumări" + tutorials_and_wiki: "%{faq}, %{tutorial} si %{wiki}: ajutor pentru primii tai pasi." introduce_yourself: "Acesta este fluxul tău. Fă-ți prezentarea." + keep_pod_running: "Tineti %{pod} functional cumparand serverelor \"cafeaua\" lor necesara cu o donatie lunara!" new_here: follow: "Urmează legătura %{link} si urează-le bun venit noilor utilizatori în comunitatea Diaspora" learn_more: "Află mai multe" @@ -140,8 +176,12 @@ ro: failure: "Apectul tău, %{name}, are numele prea lung ca să fie salvat" success: "Aspectul, %{name}, a fost editat cu succes." blocks: + create: + failure: "Nu am putut sa ignor acel utilizator. #evasion" + success: "Bine, nu vei mai vedea acel utilizator in fluxul tau din nou. #silencio!" destroy: failure: "Nu am putut ignora acel user. #evasion" + success: "Sa vedem ce au de spus! #sayhello" bookmarklet: explanation: "%{link} from anywhere by bookmarking this link." post_something: "Publică ceva pe diaspora*" @@ -194,11 +234,29 @@ ro: find_people: "Găsește persoane sau #etichete" help: account_and_data_management: + close_account_a: "Accesați partea de jos a paginii dumneavoastra de setări și faceți clic pe butonul \"Închidere cont\". Vi se va cere să introduceți parola pentru a finaliza procesul. Rețineți că, dacă vă închideți contul, nu veți putea reinregistra niciodată numele de utilizator pe acest cont." + close_account_q: "Cum ii pot sterege sementele (contul)?" data_other_podmins_q: "Pot oare administratorii altor servere să vadă informațiile mele?" data_visible_to_podmin_q: "Cât de mult din informațiile mele poate vedea administratorul?" + download_data_a: "Da. În partea de jos a filei Cont din pagina de setari veti gasi două butoane: unul pentru descarcarea datelor ai unul pentru descarcarea fotografiilor." + download_data_q: "Pot descarca o copie a tuturor datelor mele continute in semintele mele (cont)?" + move_pods_a: "Versiunea 0.7.0.0 a diaspora * oferă prima etapă de migrare a contului: acum puteți să exportați toate datele din secțiunea \"Cont\" din setările utilizatorului. Păstrează-ți datele în siguranță! Într-o versiune viitoare veți putea să mutați întregul cont, inclusiv postările și persoanele de contact, într-un alt pod." move_pods_q: "Cum pot să transfer contul meu de pe un server pe altul?" + title: "Contul si gestionarea datelor" + foundation_website: "pagina web a fundatiei diaspora*" getting_help: + get_support_a_hashtag: "Întrebați într-un post public pe diaspora * folosind hashtag-ul %{question}" + get_support_a_irc: "Alaturate nou pe %{irc} (live chat)" get_support_a_tutorials: "Vezi %{tutorials}le noastre" + get_support_a_website: "Vizitati-ne aici %{link}" + get_support_a_wiki: "Cauta pe %{link}" + get_support_q: "Ce se intampla daca nu primesc raspuns la intrebarea mea in FAQ? Unde altundeva pot primi ajutor?" + getting_started_a: "Ai noroc. Încercați %{tutorial_series} pe site-ul nostru. Acesta va va duce pas cu pas prin procesul de înregistrare si va va învata toate lucrurile de baza pe care trebuie sa le cunoașteti despre utilizarea diasporei *." + getting_started_q: "Ajutor! Am nevoie ajutor de baza pentru a porni!" + title: "Primind ajutor" + getting_started_tutorial: "Seria de instrucțiuni \"Noțiuni de bază\"" + here: "aici" + irc: "IRC" posts_and_posting: post_location_a: "În editor faceți clic pe pictograma PIN de lângă cameră. Acest lucru va introduce locația de OpenStreetMap. Puteți edita locația dvs. - dacă doriți puteți să introduceți doar orașul în loc de adresa specifică." post_location_q: "Cum adaug locația mea la un post?" @@ -221,6 +279,8 @@ ro: tags_in_comments_q: "Pot să pun etichete în comentarii sau doar în postări?" title: "Etichete" what_are_tags_for_q: "Pentru ce sunt etichetele?" + third_party_tools: "Instrumente de la parteneri terti" + tutorial: "tutorial" tutorials: "îndrumări" wiki: "Wiki" home: @@ -235,18 +295,29 @@ ro: make_yourself_an_admin: "Devino administrator" invitations: create: + empty: "Va rugam sa introduceti cel putin o adresa de eail." no_more: "Nu mai dispui de invitații." + note_already_sent: "Invitaii au fost deja triise catre: %{emails}" rejected: "Urmatoarele adrese de email au prezentat probleme:" sent: "Invitațiile a fost expediate către: %{emails}" new: + codes_left: + few: "%{count} invitatii au mai ramas pe acest cod" + one: "O singura invitatie a mai ramas pe acest cod" + other: "%{count} invitatii au mai ramas pe acest cod" + zero: "Nu a mai ramasa nici o invitatie pe acest cod" comma_separated_plz: "Poți introduce mai multe adrese de email separate de virgulă." invite_someone_to_join: "Invită pe cineva pe Diaspora!" language: "Limbă" + paste_link: "Impartaseste acest link cu prietenii tai pentru ai invita in diaspora* sau trimitele un email direct." send_an_invitation: "Trimite o invitație" + sending_invitation: "Se trimite invitatia..." layouts: application: back_to_top: "Înapoi la începutul paginii" powered_by: "Rulează pe diaspora*" + public_feed: "Flux public diaspora* pentru %{name}" + source_package: "Descarca pachetul care contine codul sursa" whats_new: "Ce mai e nou?" header: code: "Codul" @@ -258,26 +329,20 @@ ro: no_results: "Nu am găsit nimic" notifications: also_commented: - few: "%{actors} also commented on %{post_author}'s %{post_link}." - many: "%{actors} also commented on %{post_author}'s %{post_link}." - one: "%{actors} also commented on %{post_author}'s %{post_link}." - other: "%{actors} also commented on %{post_author}'s %{post_link}." - two: "%{actors} also commented on %{post_author}'s %{post_link}." - zero: "%{actors} also commented on %{post_author}'s %{post_link}." + few: "%{actors} deasemenea au comentat la %{post_link} lui %{post_author}." + one: "%{actors} deasemenea a comentat la %{post_link} lui %{post_author}." + other: "%{actors} deasemenea au comentat la %{post_link} lui %{post_author}." + zero: "%{actors} deasemenea au comentat la %{post_link} lui %{post_author} ." also_commented_deleted: - few: "%{actors} le-a placut publicatia stearsa de tine." - many: "%{actors} au put comentarii pe o publicatie deja stearsa." - one: "%{actors} i-a placut publicatia stearsa de tine." - other: "%{actors} le-a placut publicatia stearsa de tine." - two: "%{actors} commented on a deleted post." - zero: "%{actors} commented on a deleted post." + few: "%{actors} au comentat la o postare stearsa." + one: "%{actors} a comentat la o postare stearsa." + other: "%{actors} au comentat la o postare stearsa." + zero: "%{actors} au comentat la o postare stearsa." comment_on_post: - few: "%{actors} au pus comentarii pe %{post_link}." - many: "%{actors} au pus comentarii pe %{post_link}." - one: "%{actors} a comentat pe %{post_link} ta." - other: "%{actors} au comentat pe %{post_link} ta." - two: "%{actors} commented on your %{post_link}." - zero: "%{actors} commented on your %{post_link}." + few: "%{actors} au comentat la %{post_link}." + one: "%{actors} a comentat la %{post_link}." + other: "%{actors} au comentat la %{post_link}." + zero: "%{actors} au comentat la %{post_link}." index: all_notifications: "Toate notificările" and: "și" @@ -294,61 +359,45 @@ ro: show_all: "Arată toate" show_unread: "Arată necitite" liked: - few: "%{actors} has just liked your %{post_link}." - many: "%{actors} has just liked your %{post_link}." - one: "%{actors} has just liked your %{post_link}." - other: "%{actors} has just liked your %{post_link}." - two: "%{actors} has just liked your %{post_link}." - zero: "%{actors} has just liked your %{post_link}." + few: "%{actors} ti-au apreciat %{post_link}." + one: "%{actors} ti-a apreciat %{post_link}." + other: "%{actors} ti-au apreciat %{post_link}." + zero: "%{actors} ti-au apreciat %{post_link}." liked_post_deleted: - few: "%{actors} au placut publicatia stearsa de tine." - many: "%{actors} le-au placut publicatia stearsa de tine." - one: "%{actors} i-a placut publicatia stearsa de tine." - other: "%{actors} le-a placut publicatia stearsa de tine." - two: "%{actors} liked your deleted post." - zero: "%{actors} liked your deleted post." + few: "%{actors} au apreciat postarea stearsa de tine." + one: "%{actors} a apreciat postarea stearsa de tine." + other: "%{actors} au apreciat postarea stearsa de tine." + zero: "%{actors} au apreciat postarea stearsa de tine." mentioned: - few: "%{actors} has mentioned you in a %{post_link}." - many: "%{actors} has mentioned you in a %{post_link}." - one: "%{actors} v-a amintit intro %{post_link}." - other: "%{actors} has mentioned you in a %{post_link}." - two: "%{actors} has mentioned you in a %{post_link}." - zero: "%{actors} has mentioned you in a %{post_link}." + few: "%{actors} te-au mentionat in %{post_link}." + one: "%{actors} te-a mentionat in %{post_link}." + other: "%{actors} te-au mentionat in %{post_link}." + zero: "%{actors} te-au mentionat in %{post_link}." mentioned_deleted: - few: "%{actors} te-au amintit intro publicatie deja stearsa." - many: "%{actors} te-au amintit intro publicatie deja stearsa." - one: "%{actors} te-a amintit intro publicatie deja stearsa." - other: "%{actors} te-au amintit intro publicatie deja stearsa." - two: "%{actors} mentioned you in a deleted post." - zero: "%{actors} mentioned you in a deleted post." + few: "%{actors} te-au mentionat intr-o postare stearsa." + one: "%{actors} te-a mentionat intr-o postare stearsa." + other: "%{actors} te-au mentionat intr-o postare stearsa." + zero: "%{actors} te-au mentionat intr-o postare stearsa." private_message: - few: "%{actors} sent you a message." - many: "%{actors} sent you a message." - one: "%{actors} sent you a message." - other: "%{actors} sent you a message." - two: "%{actors} sent you a message." - zero: "%{actors} sent you a message." + few: "%{actors} ti-au trimis un mesaj." + one: "%{actors} ti-a trimis un mesaj." + other: "%{actors} ti-au trimis un mesaj." + zero: "%{actors} ti-au trimis un mesaj." reshared: - few: "%{actors} has reshared your %{post_link}." - many: "%{actors} has reshared your %{post_link}." - one: "%{actors} has reshared your %{post_link}." - other: "%{actors} has reshared your %{post_link}." - two: "%{actors} has reshared your %{post_link}." - zero: "%{actors} has reshared your %{post_link}." + few: "%{actors} ti-au redistribuit postarea %{post_link}." + one: "%{actors} ti-a redistribuit postarea %{post_link}." + other: "%{actors} ti-au redistribuit postarea %{post_link}." + zero: "%{actors} ti-au redistribuit postarea %{post_link}." reshared_post_deleted: - few: "%{actors} reshared your deleted post." - many: "%{actors} reshared your deleted post." - one: "%{actors} reshared your deleted post." - other: "%{actors} reshared your deleted post." - two: "%{actors} reshared your deleted post." - zero: "%{actors} reshared your deleted post." + few: "%{actors} au redistribuit postarea ta stearsa." + one: "%{actors} a redistribuit postarea ta stearsa." + other: "%{actors} au redistribuit postarea ta stearsa." + zero: "%{actors} au redistribuit postarea ta stearsa." started_sharing: - few: "%{actors} started sharing with you." - many: "%{actors} started sharing with you." - one: "%{actors} started sharing with you." - other: "%{actors} started sharing with you." - two: "%{actors} started sharing with you." - zero: "%{actors} started sharing with you." + few: "%{actors} au inceput sa impartaseasca cu tine." + one: "%{actors} a inceput sa impartaseasca cu tine." + other: "%{actors} a inceput sa impartaseasca cu tine." + zero: "%{actors} au inceput sa impartaseasca cu tine." notifier: a_post_you_shared: "o publicatie." click_here: "Clic aici" @@ -357,6 +406,7 @@ ro: reply: "Răspunde sau uita-te la publicația lui %{name} >" confirm_email: click_link: "Pentru a activa adresa nouă de email %{unconfirmed_email}, urmează această legătură:" + subject: "Va rugam sa va activati noua adresa de email %{unconfirmed_email}" contacts_birthday: view_profile: "Vezi profilul lui %{name}" email_sent_by_diaspora: "Acest email a fost expediat de către %{pod_name}. Dacă nu dorești să mai primești asemenea emailuri," @@ -391,6 +441,7 @@ ro: [1]: %{invite_url} [2]: %{diasporafoundation_url} + invited_you: "%{name} te-a invitat pe diaspora*" liked: liked: "lui %{name} i-a plăcut publicația ta" view_post: "Vezi publicația >" @@ -403,11 +454,11 @@ ro: reshared: "%{name} a partajat postarea ta" view_post: "Vezi articolul >" single_admin: - admin: "Administratorul local de Diaspora" + admin: "Administratorul tau diaspora*" subject: "Un mesaj despre contul tău de diaspora*:" started_sharing: sharing: "a inceput sa comunice cu tine!" - subject: "%{name} has started sharing with you on Diaspora*" + subject: "%{name} a inceput sa distribuie cu tine pe Diaspora*" view_profile: "Vezi profilul lui %{name}" thanks: "Mulțumim," to_change_your_notification_settings: "pentru a schimba setăriile notificărilor" @@ -420,6 +471,7 @@ ro: looking_for: "Cauți publicații marcate cu %{tag_link}?" no_one_found: "... dar nimeni nu a fost găsit." no_results: "Hey! Trebuie să cauți ceva." + results_for: "Utilizatorii care se potrivesc termenului %{search_term}" searching: "Caut acum, așteaptă un pic..." person: thats_you: "Ești tu!" @@ -446,12 +498,10 @@ ro: title: "Un articol de la %{name}" show: photos_by: - few: "%{count} photos by %{author}" - many: "%{count} photos by %{author}" - one: "One photo by %{author}" - other: "%{count} photos by %{author}" - two: "Two photos by %{author}" - zero: "No photos by %{author}" + few: "%{count} fotografii de %{author}" + one: "O singura fotografie de %{author}" + other: "%{count} fotografii de %{author}" + zero: "%{author} nu are fotografii" reshare_by: "Partajat de către %{author}" privacy: "Confidențialitate" profile: "Profil" @@ -474,9 +524,9 @@ ro: updated: "Profil actualizat" public: "Public" registrations: - closed: "Ȋnscrierile sunt ȋnchise pe acest pod Diaspora." create: success: "Bun venit pe Diaspora!" + invalid_invite: "Linkul de invitație pe care l-ați furnizat nu mai este valabil!" new: email: "Adresa email" enter_email: "Introduce un e-mail" @@ -490,14 +540,19 @@ ro: report: reason_label: "Motiv:" reshares: + comment_email_subject: "%{resharer} redistribuirea postarii creata de %{author}" reshare: deleted: "Publicația originală a fost ștearsă de autorul ei." + reshare_confirmation: "Redistribuie postarea creata de %{author}?" reshared_via: "Distribuit prin" search: "Caută" services: create: + already_authorized: "Un utilizator cu id-ul %{diaspora_id} de diaspora a autorizat deja contul %{service_name}" failure: "Autentificarea a eșuat." success: "Autentificare cu succes." + destroy: + success: "Autentificare stearsa cu succes." failure: error: "Eroare la conectarea serviciului respectiv" index: @@ -505,21 +560,32 @@ ro: edit_services: "Editează servicii" logged_in_as: "Autentificat ca %{nickname}." really_disconnect: "Să deconectez %{service}?" + services_explanation: "Conectarea la serviciile de partajare terta vă oferă posibilitatea de a vă publica postarile în timp ce le scrieți în diaspora *." settings: "Setări" shared: + aspect_dropdown: + toggle: + few: "In %{count} aspecte" + one: "%{count} aspect" + other: "In %{count} aspecte" invitations: by_email: "Invită pe cineva prin e-mail" invite_your_friends: "Invită-ți prietenii" invites: "Invitații" + share_this: "Distribuie acest link prin email, blog sau reatea sociala!" public_explain: atom_feed: "Afișare feed RSS și Atom" + control_your_audience: "Controlează-ți publicul" logged_in: "Autentificat pe %{service}" manage: "gestionează serviciile la care ești conectat" + new_user_welcome_message: "Foloseste #hashtags ca sa iti clasifici postarile si ca sa gasesti persoane care impartasesc aceleasi interese. Cheama persoane minunate cu @Mentions" outside: "Mesajele publice vor fi disponibile pentru cei ce nu fac parte din Diaspora." share: "Distribuie" title: "Ești pe cale de a publica un mesaj public!" + visibility_dropdown: "Foloseste acest buton derulant pentru a schimba vizibilitatea postarii tale. (Noi va sugeram sa o faceti publica pe aceasta.)" publisher: discard_post: "Anulează publicația" + get_location: "Obtineti locatia dumneavoastra" new_user_prefill: hello: "Salutare tuturor, sunt #%{new_user_tag}. " i_like: "Sunt interesat(ă) de %{tags}. " @@ -529,6 +595,7 @@ ro: add_a_poll: "Adaugă un chestionar" posting: "Public..." share: "Distribuie" + whats_on_your_mind: "La ce te gandesti?" stream_element: via: "Prin %{link}" via_mobile: "Prin mobil" @@ -539,6 +606,8 @@ ro: streams: activity: title: "Activitatea proprie" + aspects: + title: "Aspectele mele" aspects_stream: "Aspecte" comment_stream: title: "Articole comentate" @@ -549,6 +618,8 @@ ro: follow: "Urmărește" title: "Etichetele #urmărite" followed_tags_stream: "Etichetele #urmărite" + like_stream: + title: "Flux de aprecieri" mentioned_stream: "@Menționări" mentions: title: "@Menționări" @@ -579,9 +650,12 @@ ro: email_not_confirmed: "E-Mail could not be activated. Wrong link?" destroy: no_password: "Introdu parola curentă pentru închiderea contului." + success: "Contul tau a fost blocat. Avem nevoie de aproximativ 20 de minute pe a finaliza inchidera contului tau.Va multumim pentru ca ati incercat diaspora*." wrong_password: "Parola introdusă nu coincide cu parola ta actuală." edit: also_commented: "...cineva comenteaza de asemenea pe publicatia unei persoane din contacte?" + auto_follow_aspect: "Alege un aspect pentru utilizatorii cu care impartasesti automat:" + auto_follow_back: "Distribuie automat cu utilizatorii care distribuie cu tine" birthday: "e ziua de nastere a cuiva" change: "Modifică" change_email: "Modifică adresa email" @@ -591,6 +665,10 @@ ro: close_account: dont_go: "Te rog, nu pleca!" lock_username: "Numele tău de utilizator va fi blocat. Nu vei putea să creezi alt cont pe acest server cu același ID." + locked_out: "Vei fi delogat si blocat in afara contului pana cant iti va fi sters contul." + make_diaspora_better: "Ne-am bucura foarte mult daca ai ramane si ne-ai ajuta sa facem diaspora* mai eficienta in loc sa o parasesti. Daca vrei cu adevarat sa pleci, in orice caz, uite ce se va intampla in continuare:" + mr_wiggles: "Mr Wiggles va fi trist vazandu-te plecand" + no_turning_back: "Nu exista cale de intoarcere! Daca esti cu adevarat sigur, introdu parola ta dedesubt." what_we_delete: "We delete all of your posts, profile data, as soon as humanly possible. Your comments will hang around, but be associated with your Diaspora Handle." close_account_text: "Închide cont" comment_on_post: "...cineva comenteaza pe o publicatie proprie?" @@ -604,12 +682,18 @@ ro: mentioned: "...sunteti mentionat intr-un post ?" new_password: "Parolă nouă" private_message: "...primesti un mesaj privat?" + receive_email_notifications: "Primeste notificari prin email atunci cand:" + reshared: "cineva redistribuie postarea ta" show_community_spotlight: "Afișează „reflectorul comunității” în flux" + show_getting_started: "Arata ponturi despre \"cum sa incepi\"" + started_sharing: "cineva incepe sa impartaseasca cu tine" stream_preferences: "Preferințe flux" your_email: "E-mailul tău" your_handle: "Identificatorul tău pe Diaspora" getting_started: awesome_take_me_to_diaspora: "Super! Du-mă la diaspora*" + community_welcome: "Comunitatea diaspora* este bucuroasa sa te aiba alaturi!" + hashtag_explanation: "Hastag-urile iti dau voie sa vorbesti despre interesele tale si sa le urmaresti. Ele te ajuta deasemenea sa gasesti peroane noi pe diaspora*" hashtag_suggestions: "Încearcă să urmărești așa etichete ca #arta, #filme, #gif etc." well_hello_there: "Bun venit" what_are_you_in_to: "Ce interese ai?" diff --git a/config/locales/diaspora/ru.yml b/config/locales/diaspora/ru.yml index b1ac52529..6657344f6 100644 --- a/config/locales/diaspora/ru.yml +++ b/config/locales/diaspora/ru.yml @@ -1037,7 +1037,6 @@ ru: updated: "Профиль обновлён" public: "Публичная" registrations: - closed: "На этом сервере Диаспоры регистрация закрыта." create: success: "Вы вступили в диаспору*!" invalid_invite: "Это приглашение уже недействительно!" diff --git a/config/locales/diaspora/sc.yml b/config/locales/diaspora/sc.yml index e76aa0799..85053daa3 100644 --- a/config/locales/diaspora/sc.yml +++ b/config/locales/diaspora/sc.yml @@ -989,7 +989,6 @@ sc: updated: "Profilu agiornadu" public: "Pùblicu" registrations: - closed: "Sas registratziones sunt serradas in custu pod de diaspora*." create: success: "Ti ses registradu in diaspora*!" invalid_invite: "Su ligàmene de invitu chi as impreadu no est prus vàlidu!" diff --git a/config/locales/diaspora/sk.yml b/config/locales/diaspora/sk.yml index ac4da3b6b..bd85051af 100644 --- a/config/locales/diaspora/sk.yml +++ b/config/locales/diaspora/sk.yml @@ -550,7 +550,6 @@ sk: updated: "Profil aktualizovaný" public: "Verejný" registrations: - closed: "Registrácie sú na tomto pode diaspory* pozastavené." create: success: "Pridal(a) si sa k diaspore*!" invalid_invite: "Odkaz na pozvánku, ktorý si zadal(a), už nie je platný!" diff --git a/config/locales/diaspora/sl.yml b/config/locales/diaspora/sl.yml index 37e72e04f..89377da75 100644 --- a/config/locales/diaspora/sl.yml +++ b/config/locales/diaspora/sl.yml @@ -443,7 +443,6 @@ sl: updated: "Profil posodobljen" public: "Javni" registrations: - closed: "Za ta Pod Diaspore registracije trenutno niso mogoče." create: success: "Pridružili ste se v omrežje Diaspora!" invalid_invite: "Povezava na povabilo, ki ste jo uporabili ni več veljavna!" diff --git a/config/locales/diaspora/sr.yml b/config/locales/diaspora/sr.yml index 0c10d27f7..929fdb3b8 100644 --- a/config/locales/diaspora/sr.yml +++ b/config/locales/diaspora/sr.yml @@ -221,7 +221,6 @@ sr: updated: "Ажурирај профил" public: "Јавно" registrations: - closed: "Регистрације су затворене за овај diaspora* под" create: success: "Придружили сте се diaspora*" new: diff --git a/config/locales/diaspora/sv.yml b/config/locales/diaspora/sv.yml index bc3ec6f71..ed1cd7960 100644 --- a/config/locales/diaspora/sv.yml +++ b/config/locales/diaspora/sv.yml @@ -109,24 +109,24 @@ sv: account_closing_scheduled: "Kontot för %{name} är låst och kommer att raderas om en stund." account_locking_scheduled: "Kontot för användaren %{name} är schemalagt för att låsas. Det kommer ske om en liten stund..." account_unlocking_scheduled: "Kontot för användaren %{name} är schemalagt för att låsas upp. Det kommer ske om en liten stund..." - add_admin: "%{name} har skapats som admin." + add_admin: "%{name} har gjorts till administratör." add_invites: "Lägg till inbjudningar" add_moderator: "%{name} har gjorts till moderator." - add_spotlight: "%{name} har lagts till i strålkastarljuset." + add_spotlight: "%{name} har lagts i strålkastarljuset." are_you_sure: "Är du säker på att du vill ta bort ditt konto?" are_you_sure_lock_account: "Är du säker på att du vill låsa detta konto?" are_you_sure_unlock_account: "Är du säker på att du vill låsa upp detta konta?" close_account: "Ta bort konto" - delete_admin: "%{name} har tagits bort från administratörslistan." - delete_moderator: "%{name} har tagits bort från moderatorlistan." - delete_spotlight: "%{name} har tagits ut ur strålkastarljuset." + delete_admin: "%{name} har tagits bort ur administratörslistan." + delete_moderator: "%{name} har tagits ur moderatorlistan." + delete_spotlight: "%{name} har tagits ur strålkastarljuset." does_not_exist: "Användare finns inte!" email_to: "Skicka ett e-brev för att bjuda in" invite: "Bjud in" lock_account: "Lås konto" - make_admin: "Skapa admin" - make_moderator: "Skapa moderator" - make_spotlight: "Lägg till i strålkastarljuset" + make_admin: "Gör administratör" + make_moderator: "Gör moderator" + make_spotlight: "Lägg in i strålkastarljuset" remove_admin: "Ta bort som admin" remove_moderator: "Ta bort som moderator" remove_spotlight: "Ta bort ur strålkastarljustet" @@ -484,7 +484,7 @@ sv: character_limit_q: "Vad är teckenbegränsning för inlägg?" embed_multimedia_a: "Det ska räcka med att bara klistra in länken till vad du vill bifoga i inlägget. Några av de sidor som stöds är: YouTube, Vimeo, SoundCloud och Flickr. Diaspora* använder oEmbed för den här egenskapen. Vi lägger till stöd för andra sidor hela tiden. Kom ihåg att göra enkla inlägg och bara använda fullständiga länkar, inga URL-förkortare. Inga operatorer efter länken och vänta ett slag efter att du klistrat in inlägget innan du laddar om sidan, efter att du skrivit inlägget." embed_multimedia_q: "Hur bäddar jag in en video, ljudspår eller annat multimediainnehåll i ett inlägg?" - format_text_a: "Du kan använda %{markdown}-systemet. Du kan se systemets syntax %{here}. Använd knappen för att förhandsgranska inlägget så att du ser att det blir som du hade tänkt dig." + format_text_a: "Diaspora använder ett förenklat system som kallas %{markdown}. Du som skriver har knappar för att hjälpa dig formatera texten. Om du vill formatera manuallt, hittar du hela syntaxen %{here}. Fliken för att förhandsvisa, ger dig möjlighet att se meddelandet innan du delar. Glöm inte att inte kan ändra efter publikation; var därför nogrann med att förhandsgranska innan!" format_text_q: "Hur kan jag formatera texten i mina inlägg? (Fet stil, kursivera, etcetera.)" hide_posts_a: "Om du pekar muspekaren överst på ett inlägg kommer ett kryss att dyka upp till höger. Tryck på det för att dölja inlägget och avsluta notifieringarna berörande det. Du kommer fortfarande kunna se inlägget om du besöker författarens profilsida." hide_posts_q: "Hur döljer jag ett inlägg?" @@ -492,7 +492,7 @@ sv: ignore_user_a2: "För att ignorera någon, tryck ikonen \"ignorera\" (cirkel med ett diagonalt streck) i övre högra hörnet av inlägg. Deras inlägg kommer omedelbart försvinna ur ditt flöde. Alternativt, kan du gå till deras profilsida och trycka på ignoreraknappen där. Du kan fortfarande se personens inlägg på dennes profilsida." ignore_user_a3: "Du hittar listan över ignorerade personer under Sekretess bland dina kontoinställningar. För att sluta ignorera någon, ta bort personen ur listan." ignore_user_q: "Hur tar jag bort någon från min ström?" - insert_images_a: "Tryck på den lilla kameraikonen för att bifoga en bild till inlägget. Tryck på ikonen igen för att lägga till fler foton. Du kan välja fler att ladda upp flera bilder samtidigt" + insert_images_a: "Om du vill ha en bild som finns på din dator i inlägg, välj den lilla kameraikonen. Du kan också dra bilden från katalogen, eller fler bilde, från datorn till ikonen. Om du vill ha bild från en annan webbsida i inlägget, väljer du istället formateringsknappen som då skriver in Markdown-koden åt dig." insert_images_comments_a: "Använd Markdown för att lägga in bilder från webben i en kommentar, precis som i ett inlägg. Du kan dock inte ladda upp bilder från din dator till kommentarer. Ladda upp dem på någon bilddelningssida och lägg därefter in bilderna i kommentarer." insert_images_comments_q: "Kan jag lägga till bilder i kommentarer?" insert_images_q: "Hur lägger jag in bilder till mitt inlägg?" @@ -502,7 +502,7 @@ sv: post_notification_q: "Hur gör jag för att ändra mina notifikationsinställningar för ett inlägg?" post_poll_a: "Tryck på grafikonen för att skapa en omröstning. Skriv in din fråga och åtminstone två alternativ. Glöm inte att göra inlägget publikt om du vill att alla ska kunna delta." post_poll_q: "Hur lägger jag till en omröstning till mitt inlägg?" - post_report_a: "Tryck på varningstriangeln i inläggets övre, högra hörn för att anmäla det till din podadminstratör. Ange sedan, noggrant, varför du valt att anmäla inlägget." + post_report_a: "Tryck på varningstriangeln i inläggets övre, högra hörn för att anmäla det till din podadminstratör. Ange sedan, noggrant, varför du valt att anmäla inlägget. Var så bussig och anmäl bara inlägg som bryter mot våra %{community_guidelines} eller användarvilkoren för din pod. Det kan exempelvis vara olagligt material, eller kränkande innehåll och spam." post_report_q: "Hur meddelar jag om kränkande inlägg?" size_of_images_a: "Nej. Bildernas storlek justeras automatiskt för att passa strömmen." size_of_images_q: "Kan jag själv anpassa bildstorleken i inlägg och kommentarer?" @@ -531,10 +531,10 @@ sv: who_sees_profile_a: "Din huvudsakliga profil (namn, foto och #taggar) är offentlig. Din utökade profil är däremot privat, men du kan göra den offentlig om du vill. Bara dem du delar med (dvs. med i dina aspekter) kan se din utökade profil om du har den privat. Andra kan endast se din offentliga information. När en profil blivit offentlig, kan vem som helst ta del av den och den kan indexeras av sökmotorer." who_sees_profile_q: "Vem ser min profil?" public_posts: - can_comment_reshare_like_a: "Bara de som är inloggade på Diaspora* kan kommentera, dela vidare och gilla dina offentliga inlägg." + can_comment_reshare_like_a: "Bara de som är inloggade på Diaspora* kan kommentera, dela vidare och gilla dina offentliga inlägg. Undantaget är dem du valt att ignorera. De kommer inte kunna gilla och kommentera dina inlägg." can_comment_reshare_like_q: "Vilka kan kommentera, dela och gilla mina publika inlägg?" deselect_aspect_posting_a: "Du påverkar inte dina publika inlägg genom att välja bort aspekter från dem. Inläggen kommer ändå att synas hos alla dina kontakter. Vill du bara att några aspekter ska se ditt inlägg, väljer du dem i listan under utgivaren." - deselect_aspect_posting_q: "Vad händer när jag tar väljer bort aspekter när jag ska göra ett offentligt inlägg?" + deselect_aspect_posting_q: "Vad händer när jag tar väljer bort aspekter i vänstra kolumnen när jag ska göra ett offentligt inlägg?" find_public_post_a: "Dina publika inlägg kommer att dyka upp i strömmarna som följer dig. Om du har fyrkantstaggar i dina publika inlägg kommer alla som följer taggen se inlägget i strömmen. Varje publikt inlägg ges en specifik webbadress så att vem som helst kan komma åt det, även om de inte är inloggade. Publika inlägg kan alltså länkas till direkt från (till exempel) Twitter och bloggar. De publika inläggen kan då också bli indexerade av sökmotorer." find_public_post_q: "Hur hittar man mina publika inlägg?" see_comment_reshare_like_a: "Kommentarer, gillanden och vidaredelningar av publika inlägg kommer att vara publika. Alla inloggade på Diaspora* och vem som helst på Internet kan se dina interaktioner med ett publikt inlägg." @@ -572,7 +572,7 @@ sv: tags: filter_tags_a: "Det är inte ännu inte möjligt att utföra i Diaspora*. Men något %{third_party_tools} kan finnas som stödjer denna funktion." filter_tags_q: "Hur filtrerar jag bort några av taggarna från mitt flöde?" - followed_tags_a: "När du sökt en tagg kan du trycka på knappen överst på taggens sida för att följa taggen. Då kommer då synas till vänster med andra taggar du följer. Trycker du på någon tagg i listan hamnar du på taggens sida och kommer att se de senaste inläggen med taggen. Tryck \"#Följda taggar\" för att se ett flöde med alla taggar du följer." + followed_tags_a: "När du sökt en tagg kan du trycka på knappen överst på taggens sida för att följa taggen. Då kommer då synas till vänster med andra taggar du följer. Trycker du på någon tagg i listan hamnar du på taggens sida och kommer att se de senaste inläggen med taggen. Tryck \"#Följda taggar\" för att se ett flöde med alla taggar du följer. Inlägg med den taggen kommer dyka upp i ditt huvudflöde." followed_tags_q: "Vad är \"#Följda taggar\" och hur följer man en tagg?" people_tag_page_a: "Det är personer som lagt till taggen i sin beskrivning på sin publika profilsida." people_tag_page_q: "Vilka är personerna till vänster på taggens sida?" @@ -593,9 +593,11 @@ sv: byline: "Den sociala världen på nätet där du har kontrollen." choose_your_audience: "Välj din publik" choose_your_audience_info: "Med Diasporas aspekter, kan du välja med vilka du delar med dig till. Du kan vara hur offentlig eller privat du vill. Dela med dig av roliga bilder med hela världen eller en hemlighet med dina närmaste vänner. Du bestämmer." + diaspora_site_link: "Diaspora* federerat nätverk" headline: "Välkommen till %{pod_name}" own_your_data: "Du äger din data" own_your_data_info: "Många nätverk använder din data för att tjäna pengar genom att analysera dig och använda din data för att sälja reklam riktad mot dig. Diaspora* använder inte din data för något annat än att låta dig kommunicera med andra." + part_of_diaspora: "En del av %{diaspora_site_link}" podmin: byline: "Du är just på väg att förändra Internet. Är du redo för att komma igång?" configuration_info: "Öppna %{database_path} och %{diaspora_path} i en textredigerare och gå igenom dem noggrant. De är fyllda med kommentarer." @@ -698,7 +700,7 @@ sv: mark_all_shown_as_read: "Märk allt som läst" mark_read: "Lästmärk" mark_unread: "Markera som oläst" - mentioned: "Omnämnd" + mentioned: "Omnämnd i inlägg" mentioned_in_comment: "Nämnd i kommentar" no_notifications: "Du har inga notifikationer än." notifications: "Notiser" @@ -998,7 +1000,11 @@ sv: updated: "Profilen har uppdaterats" public: "Publik" registrations: - closed: "Registreringsformuläret är avstängt på den här Diaspora*-servern." + closed: + another_pod: "annan pod" + closed_pod: "Denna pod är för närvarande stängd för nya registreringar. Du kan ändå gå med i Diaspora* genom registrering på %{wiki}. I och med att alla poddar är anslutna till varandra, kommer du komma åt allt innehåll ändå." + find_pods: "En lista med poddar du kan registrera dig på finns på %{poduptime}." + other_questions: "Om du har frågor gällande att välja pod, kan du läsa vår %{wiki}." create: success: "Du har nu gått med i Diaspora*!" invalid_invite: "Den angivna inbjudningslänken gäller inte längre." @@ -1016,13 +1022,13 @@ sv: terms_link: "användarvillkor" username: "Användarnamn" report: - comment_label: "Kommentar:%{data}" + comment_label: "Kommentar: %{data}" confirm_deletion: "Vill de radera objektet?" delete_link: "Radera objekt" not_found: "Inlägget eller kommentaren fanns inte. Det tycks har blivit borttaget av användaren." - post_label: "Inlägg: %{title}" + post_label: "Inlägg: %{content}" reason_label: "Orsak:" - reported_label: "Anmält av %{person}" + reported_label: "Anmält av %{person}" reported_user_details: "Detaljer gällande anmäld användare" review_link: "Markera som genomgånget" status: @@ -1191,6 +1197,12 @@ sv: change_label: "Inaktivera tvåfaktorautentisering med ditt lösenord" status: "Tvåfaktorautentisering aktiverat" confirm: + activate_button: "Bekräfta och aktivera" + input_explanation: "Efter skanning eller att ha skrivit den hemliga koden, skriver du in den sexsiffriga kod du ser och bekräftar uppsättningen." + input_title: "Bekräfta med TOTP-pollett." + manual_explanation: "Om du inte kan skanna QR-koden automatiskt, kan du göra det manuellt i din app med den hemliga koden." + manual_explanation_cont: "Vi använder oss av tidsbegränsade ongångslösenord (TOTP) med sex siffror långa polletter. Om din applikation frågar om ett tidintervall och algoritm, anger du 30 sekunder och sh1.
Mellanrummen är bara för läsbarhetens skull; du ska inte skriva dem." + scan_explanation: "Skanna QR-koden med en TOTP-kompatibel applikation, såsom andOTP (för Android), FreeOTP (för iOS), SailOTP (för SailfishOS)." scan_title: "Läs in QR-kod" status: "Tvåfaktorautentisering har inte the fullo aktiverats än. Du behöver verifiera med en TOTP-pollett." title: "Bekräfta aktivering" @@ -1199,6 +1211,20 @@ sv: change_label: "Aktivera tvåfaktorautentisering" status: "Tvåfaktorautentisering inaktiverat" explanation: "Tvåfaktorautentisering är ett kraftfullt sätt att försäkra om att det bara är du som kan logga in på ditt konto. När du loggar in, kommer du ange en sexsiffrig kod tillsammans med ditt löseord för att påvisa din identitet. Men var ändock aktsam: om du blir av med din telefon och koderna som genereras för denna funktionalitet, kommer du aldrig kunna komma åt ditt konto igen." + flash: + error_token: "Polletten var fel eller ogiltig" + success_activation: "Aktivering av tvåstegsautentisering lyckades" + success_deactivation: "Avaktivering av tvåstegsautentisering lyckades" + input_token: + label: "Tvåstegspollett" + placeholder: "Sexssiffrig tvåstegspollett" + recovery: + button: "Generera nya återställningskoder" + explanation: "Om du någonsin blir av med din telefon, kan du använda en av återställningskoderna nedanför för att återfå tillgång till ditt konto. Spara koderna på en säker plats. Du kan till exompel skriva ut dem och ha dem bland dina andra viktiga lappar." + explanation_short: "Återställningsskoder används för att återfå tillgång till ditt konto utifall att du blir av med din telefon. Du kan bara använda varje kod en enda gång." + invalidation_notice: "Om du blir av med dina återställningskoder, kan du generera nya här. Dina tidigare koder blir då ogiltiga." + reminder: "Alternativt kan du använda en återställningskod." + title: "Återställningsskoder" title: "Tvåfaktorautentisering" username: "Användarnamn" users: @@ -1248,8 +1274,9 @@ sv: new_password: "Nytt lösenord" private_message: "du mottager ett privat meddelande." protocol_handler: - description: "Din webbläsare kommer fråga om du vill hantera adresser med web+diaspora:// i din hempod när du tryck när du trycker på knappen. Funktionaliteten är för närvarande experimentell och användning beror på din webbläsare." - register: "Register" + browser: "Protokollet är för närvarande i en testfas och hur bra det kommer fungera kommer bero på din webbläsare. Om du vill ändra eller ta bort denna hantering, kommer du göra det med din webbläsares inställningar. Knappen nedanför kommer alltid vara påslagen och du behöver sätta hanteringen separat för varje webbläsare du använder." + description: "web+diaspora:// är ett nytt webbprotokoll vi har introducerat. Alla sådana länkar, både på Diaspora* och ute på nätet, kan öppnas i den pod du har ditt konto på. Tryck på knappen nedanför för att få %{pod_url} att känna av externa länkar av typen web+diaspora://." + register: "Registrera web+diaspora:// på din webbläsare" title: "Hantera protokollet web+diaspora://" receive_email_notifications: "Skicka notiser via e-post när:" request_export: "Efterfråga min profildata" diff --git a/config/locales/diaspora/te.yml b/config/locales/diaspora/te.yml index d38e5a34c..fca32997c 100644 --- a/config/locales/diaspora/te.yml +++ b/config/locales/diaspora/te.yml @@ -605,7 +605,6 @@ te: updated: "ప్రవర నవీకరించబడింది" public: "బహిరంగం" registrations: - closed: "ఈ డయాస్పోరా* పాడ్ పై కొత్త ప్రవేశాలు మూసివేయబడ్డాయి." create: success: "డయాస్పోరా*లో మీ చేరిక విజయవంతం!" invalid_invite: "మీరు ఇచ్చిన ఆహ్వానపు లంకె చెల్లుబాటులో లేదు!" diff --git a/config/locales/diaspora/tr.yml b/config/locales/diaspora/tr.yml index 0a7234b1b..7bdd34fe4 100644 --- a/config/locales/diaspora/tr.yml +++ b/config/locales/diaspora/tr.yml @@ -101,7 +101,7 @@ tr: current_server: "Şu andaki sunucu tarihi %{date}" all_aspects: "Tüm Yönler" are_you_sure: "Emin misin?" - are_you_sure_delete_account: "Hesabını kapatmak istediğinden emin misin? Bu geri alınamaz!" + are_you_sure_delete_account: "Hesabını kapatmak istediğinden emin misin? Bu işlemi geri alamazsın!" aspect_memberships: destroy: failure: "Yön'den kişi kaldırılamadı" @@ -178,7 +178,7 @@ tr: bookmarklet: explanation: "Diaspora'ya istediğin her yerden gönderi yapmak için %{link} bağlantısını yer imlerine ekle." heading: "Diaspora yer işareti" - post_something: "Diaspora için bir şey gönder" + post_something: "Diaspora'ya bir şey gönder" cancel: "İptal Et" color_themes: dark_green: "Koyu yeşil" @@ -255,7 +255,7 @@ tr: change_aspect_of_post_a: "Hayır, ama aynı içerikte başka bir gönderi hazırlayıp bunu farklı bir bakış yönünde gönderebilirsiniz." change_aspect_of_post_q: "Bir gönderiyi paylaştıktan sonra onu gören hedef bakışları değiştirebilir miyim?" contacts_know_aspect_a: "Hayır. Bakışın adını hiçbir şekilde göremezler." - contacts_know_aspect_q: "Diğerleri onları hangi bakışlara koyduğumu bilebilir mi?" + contacts_know_aspect_q: "Bağlantılarım onları hangi Cephe'lere koyduğumu bilebilir mi?" delete_aspect_a: "Akış görünümündeki kenar çubuğundan \"Yönlerim\"e tıkla ve silmek istediğin yönleri işaretle, ya da erişimlerim sayfasından ilgili yönü seçip çöp simgesine tıkla." delete_aspect_q: "Yön nasıl silinir?" person_multiple_aspects_a: "Evet. Kişiler sayfasına gidin ve kişilerime tıklayın. Her biri için sağdaki menüyü kullanarak, istediğiniz kadar çok bakışa ekleyip istediğiniz kadarından çıkarabilirsiniz. Profil sayfasındaki bakış seçicisine tıklayarak da bunu yapabilirsiniz. Hatta, imleci adının üzerine götürdüğünüzde çıkan 'kartı' kullanarak da aynı şeyi yapabilirsiniz." @@ -268,11 +268,11 @@ tr: rename_aspect_q: "Bakışın adını değiştirebilir miyim?" restrict_posts_i_see_a: "Evet. Kenar çubuğundaki Bakışlarım'a tıklayın ve seçiminizi değiştirmek için ilgili bakışlara tıklayın. Yalnızca seçili bakışlardan gelen gönderiler size görünür olacak." restrict_posts_i_see_q: "Gördüğüm gönderileri sadece belli bakışlara kısıtlayabilir miyim?" - title: "Bakışlar" - what_is_an_aspect_a: "Bakışlar diaspora* da kişileri gruplamanın bir yolu, dünyaya gösterdiğiniz yüzlerden biridir. Çalıştığınızdaki bakış açınız, ailenize karşı, çevrenizdeki kişilere karşı gösterdiğiniz farklı farklı olabilir." - what_is_an_aspect_q: "Bakış nedir?" + title: "Cepheler" + what_is_an_aspect_a: "Cepheler diaspora* da kişileri gruplamanın bir yoludur. Bir Cephe dünyaya gösterdiğiniz yüzlerden biridir. İş yerinizde veya ailenizde ya da üyesi olduğunuz kulüpteki arkadaşlarınız için kim olduğunuz olabilir." + what_is_an_aspect_q: "Cephe nedir?" who_sees_post_a: "Sınırlı gönderi yaparsanız, yalnızca o bakış(lar)a koyduğunuz kişilere görünür olacaktır. Bunun dışındakiler, gönderinizi açmadığınız sürece hiçbir şekilde onu göremeyeceklerdir. Yalnızca genel gönderiler hiçbir bakışa koymadığınız kişilere açıktır." - who_sees_post_q: "Bir bakışa gönderdiğimde onu kimler görür?" + who_sees_post_q: "Bir Cephe'ye gönderi gönderdiğimde onu kimler görür?" foundation_website: "diaspora vakfı web sitesi" getting_help: get_support_a_hashtag: "%{question} etiketini kullanarak diaspora* üzerinde açık bir gönderiyle sorun" @@ -435,8 +435,8 @@ tr: other: "%{actors} senin %{post_link} gönderini beğendi." zero: "%{actors} senin %{post_link} gönderini beğendi." liked_post_deleted: - other: "%{actors} silinmiş gönderinizi iğneledi." - zero: "%{actors} silinmiş gönderinizi iğnelemedi." + other: "%{actors} silinmiş gönderinizi beğendi.." + zero: "%{actors} silinmiş gönderinizi beğendi." mentioned: other: "%{actors} bir %{post_link} içinde seni andı." zero: "%{actors} bir %{post_link} içinde seni andı." @@ -461,9 +461,9 @@ tr: zero: "%{actors} sizinle paylaşıma başladı." notifier: a_post_you_shared: "gönderi" - click_here: "buraya" + click_here: "buraya tıklayın" comment_on_post: - reply: "Yanıtla ya da %{name} gönderisini görüntüle >" + reply: "%{name}'in gönderisini yanıtla ya da görüntüle >" confirm_email: click_link: "Yeni e-mail adresini %{unconfirmed_email} etkinleştirmek için şu bağlantıya tıkla:" subject: "Lütfen yeni e-mail adresini %{unconfirmed_email} etkinleştir" @@ -489,10 +489,10 @@ tr: [1]: %{invite_url} invited_you: "%{name} sizi Diaspora*'ya davet etti." liked: - liked: "%{name} gönderini iğneledi." + liked: "%{name} gönderini beğendi" view_post: "Gönderiyi görüntüle >" mentioned: - subject: "%{name} sana Diaspora*'da özel mesaj gönderdi " + subject: "%{name} Diaspora*'da sizi andı" private_message: reply_to_or_view: "Yanıtla ya da konuşmayı görüntüle >" remove_old_user: @@ -532,8 +532,8 @@ tr: reshared: "%{name} gönderini tekrar paylaştı" view_post: "Gönderiyi görüntüle>" single_admin: - admin: "Diaspora yönetici" - subject: "Diaspora hesabı hakkında bir mesaj:" + admin: "Diaspora yöneticiniz" + subject: "Diaspora hesabınız hakkında bir mesaj:" started_sharing: sharing: "sizinle paylaşıma başladı!" subject: "%{name} Diaspora*'da seninle paylaşıma başladı" @@ -606,14 +606,13 @@ tr: updated: "Profil güncellendi" public: "Genel" registrations: - closed: "Üyelik bu Diaspora'da kapandı." create: - success: "Diasporaya katıldınız!" + success: "Diaspora'ya katıldınız!" invalid_invite: "Gönderdiğiniz davetiye bağlantısı artık geçerli değil!" new: email: "E-POSTA" enter_email: "Bir e-posta girin" - enter_password: "Bir parola girin" + enter_password: "Bir parola girin (en az 6 karakter)" enter_password_again: "Daha önce olduğu gibi aynı parolayı girin." enter_username: "Bir kullanıcı adı seçin (sadece harfler, rakamlar ve alt çizgi)" password: "PAROLA" @@ -640,7 +639,7 @@ tr: reshare: deleted: "Gönderi yazarı tarafından silindi." reshare_confirmation: "Tekrar paylaş %{author} - %{text}?" - reshared_via: "tekrar paylaşıldı, bununla:" + reshared_via: "üzerinden yeniden paylaşıldı:" search: "Ara" services: create: diff --git a/config/locales/diaspora/uk.yml b/config/locales/diaspora/uk.yml index b14e95921..7517914a3 100644 --- a/config/locales/diaspora/uk.yml +++ b/config/locales/diaspora/uk.yml @@ -1027,7 +1027,6 @@ uk: updated: "Профіль оновлено" public: "Публічна" registrations: - closed: "У цій частині Діаспори реєстрація закрита." create: success: "Ласкаво просимо в Діаспору*!" invalid_invite: "Це запрошення вже недійсне!" diff --git a/config/locales/diaspora/vi.yml b/config/locales/diaspora/vi.yml index e2b05090f..6409f2edb 100644 --- a/config/locales/diaspora/vi.yml +++ b/config/locales/diaspora/vi.yml @@ -391,7 +391,6 @@ vi: updated: "Đã cập nhật hồ sơ" public: "Công khai" registrations: - closed: "Pod DIASPORA này không cho đăng kí nữa." create: success: "Bạn đã tham gia vào Diaspora!" invalid_invite: "Liên kết mời bạn cung cấp không còn hợp lệ!" diff --git a/config/locales/diaspora/zh-CN.yml b/config/locales/diaspora/zh-CN.yml index db8039dde..7d4df6cfc 100644 --- a/config/locales/diaspora/zh-CN.yml +++ b/config/locales/diaspora/zh-CN.yml @@ -423,7 +423,6 @@ zh-CN: updated: "个人档案更新成功" public: "公开" registrations: - closed: "此 Diaspora pod 不开放注册。" create: success: "您已成功加入 Diaspora 了!" invalid_invite: "此邀请链接已失效!" diff --git a/config/locales/diaspora/zh-TW.yml b/config/locales/diaspora/zh-TW.yml index c27ab46a4..a94dbdc9a 100644 --- a/config/locales/diaspora/zh-TW.yml +++ b/config/locales/diaspora/zh-TW.yml @@ -950,7 +950,6 @@ zh-TW: updated: "個人檔案已經更新了" public: "公開" registrations: - closed: "這個 diaspora* 豆莢不開放註冊。" create: success: "你已經成功加入 diaspora* 了!" invalid_invite: "你提供的邀請連結已經失效了!" diff --git a/config/locales/javascript/javascript.de-moo.yml b/config/locales/javascript/javascript.de-moo.yml index a717589ab..fcd24113d 100644 --- a/config/locales/javascript/javascript.de-moo.yml +++ b/config/locales/javascript/javascript.de-moo.yml @@ -133,6 +133,7 @@ de-moo: recent_notifications: "Neueste Benachrichtigungen" search: "Suche" settings: "Einstellungen" + switch_to_touch_optimized_mode: "In den touch-optimierten Modus wechseln" toggle_navigation: "Navigation umschalten" view_all: "Alle anzeigen" hide_post: "Diesen Beitrag ausblenden?" diff --git a/config/locales/javascript/javascript.de_formal.yml b/config/locales/javascript/javascript.de_formal.yml index 62fc75b68..64e2643d3 100644 --- a/config/locales/javascript/javascript.de_formal.yml +++ b/config/locales/javascript/javascript.de_formal.yml @@ -133,6 +133,7 @@ de_formal: recent_notifications: "Letzte Benachrichtigungen" search: "Find people or #tags" settings: "Einstellungen" + switch_to_touch_optimized_mode: "In den touch-optimierten Modus wechseln" toggle_navigation: "Navigation umschalten" view_all: "Alle ansehen" hide_post: "Diesen Beitrag ausblenden?" diff --git a/config/locales/javascript/javascript.es.yml b/config/locales/javascript/javascript.es.yml index b33dcc9f0..8db378131 100644 --- a/config/locales/javascript/javascript.es.yml +++ b/config/locales/javascript/javascript.es.yml @@ -96,22 +96,22 @@ es: confirm_unload: "Por favor, confirma que quieres abandonar esta página. Los datos que no hayas introducido, no serán guardados." contacts: add_contact: "Añadir contacto" - aspect_chat_is_enabled: "Los contactos de este \"aspecto\" pueden chatear contigo." - aspect_chat_is_not_enabled: "Los contactos de este \"aspecto\" no pueden chatear contigo." + aspect_chat_is_enabled: "Los contactos de este grupo pueden chatear contigo." + aspect_chat_is_not_enabled: "Los contactos de este grupo no pueden chatear contigo." error_add: "No se pudo añadir a <%= name %> al aspecto :(" error_remove: "No se pudo eliminar <%= name %> del aspecto :(" remove_contact: "Eliminar contacto" search_no_results: "No se encontraron contactos" conversation: create: - no_recipient: "¡Eh, primero tienes que agregar un destinatario!" + no_recipient: "¡Añade primero un destinatario!" new: no_contacts: "Necesitas añadir algún contacto antes de empezar una conversación." create: "Crear" delete: "Eliminar" edit: "Editar" errors: - connection: "No ha sido posible conectarse al servidor." + connection: "No se ha podido establecer la conexión con el servidor." failed_to_post_message: "¡Error al publicar el mensaje!" failed_to_remove: "¡Se produjo un error al eliminar la entrada!" getting_started: @@ -296,7 +296,7 @@ es: hour: "1 hora aproximadamente" hours: other: "%d horas aproximadamente" - inPast: "próximamente" + inPast: "Próximamente" minute: "1 minuto aproximadamente" minutes: other: "%d minutos" diff --git a/config/locales/javascript/javascript.sv.yml b/config/locales/javascript/javascript.sv.yml index 13b61a157..13f1cc80e 100644 --- a/config/locales/javascript/javascript.sv.yml +++ b/config/locales/javascript/javascript.sv.yml @@ -117,7 +117,7 @@ sv: getting_started: alright_ill_wait: "Okej, jag väntar." hey: "Hej, <%= name %>!" - no_tags: "Du, du följer ju inte några taggar! Vill du fortsätta ändå?" + no_tags: "Hörru, du följer ju inte några taggar! Vill du fortsätta ändå?" preparing_your_stream: "Förbereder din personliga ström..." header: admin: "Administratör" @@ -134,6 +134,7 @@ sv: recent_notifications: "Tidigare notiser" search: "Sök" settings: "Inställningar" + switch_to_touch_optimized_mode: "Växla till pekskärmläge" toggle_navigation: "Växla navigation" view_all: "Visa alla" hide_post: "Vill du dölja inlägget?" From e3de008453ce1f3d9dfd30ab9c70dfc3319efa82 Mon Sep 17 00:00:00 2001 From: NG Date: Wed, 26 Jun 2019 12:49:05 +0530 Subject: [PATCH 34/81] Do not show getting started after account import --- lib/archive_importer.rb | 2 ++ spec/lib/archive_importer_spec.rb | 1 + 2 files changed, 3 insertions(+) diff --git a/lib/archive_importer.rb b/lib/archive_importer.rb index d2310437c..c989c1b06 100644 --- a/lib/archive_importer.rb +++ b/lib/archive_importer.rb @@ -25,10 +25,12 @@ class ArchiveImporter email strip_exif show_community_spotlight_in_stream language disable_mail auto_follow_back ] data = convert_keys(archive_hash["user"], allowed_keys) + # setting getting_started to false as the user doesn't need to see the getting started wizard data.merge!( username: attr[:username], password: attr[:password], password_confirmation: attr[:password], + getting_started: false, person: { profile_attributes: profile_attributes } diff --git a/spec/lib/archive_importer_spec.rb b/spec/lib/archive_importer_spec.rb index 72f0db21e..504032d84 100644 --- a/spec/lib/archive_importer_spec.rb +++ b/spec/lib/archive_importer_spec.rb @@ -155,6 +155,7 @@ describe ArchiveImporter do expect(archive_importer.user.language).to eq("ru") expect(archive_importer.user.disable_mail).to eq(false) expect(archive_importer.user.auto_follow_back).to eq(true) + expect(archive_importer.user.getting_started).to be_falsey expect(archive_importer.user.profile.first_name).to eq("First") expect(archive_importer.user.profile.last_name).to eq("Last") From 034d78e3e4ac94037393bd6f718858e65edeec66 Mon Sep 17 00:00:00 2001 From: Benjamin Neff Date: Tue, 2 Jul 2019 01:50:36 +0200 Subject: [PATCH 35/81] Remove commentable functionality from photos This is not (and as far as I know, was never) used. If we want to make standalone photos commentable, we can always add it back, but it would also need to change federation for it to work, because comments support only posts there. But for now it makes the code cleaner and easier to remove it. --- app/models/photo.rb | 1 - .../20190701234716_photos_remove_comment_count.rb | 14 ++++++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) create mode 100644 db/migrate/20190701234716_photos_remove_comment_count.rb diff --git a/app/models/photo.rb b/app/models/photo.rb index 75d7f83a8..5552aefed 100644 --- a/app/models/photo.rb +++ b/app/models/photo.rb @@ -6,7 +6,6 @@ class Photo < ApplicationRecord include Diaspora::Federated::Base - include Diaspora::Commentable include Diaspora::Shareable # NOTE API V1 to be extracted diff --git a/db/migrate/20190701234716_photos_remove_comment_count.rb b/db/migrate/20190701234716_photos_remove_comment_count.rb new file mode 100644 index 000000000..4d6330960 --- /dev/null +++ b/db/migrate/20190701234716_photos_remove_comment_count.rb @@ -0,0 +1,14 @@ +# frozen_string_literal: true + +class PhotosRemoveCommentCount < ActiveRecord::Migration[5.1] + class Comment < ApplicationRecord + end + + def change + remove_column :photos, :comments_count, :integer + + reversible do |change| + change.up { Comment.where(commentable_type: "Photo").delete_all } + end + end +end From 4ae373e3a24ae628f3b20166cc66e5e389ee4468 Mon Sep 17 00:00:00 2001 From: Benjamin Neff Date: Wed, 3 Jul 2019 00:35:42 +0200 Subject: [PATCH 36/81] Bump rails --- Gemfile | 2 +- Gemfile.lock | 70 ++++++++++++++++++++++++++-------------------------- 2 files changed, 36 insertions(+), 36 deletions(-) diff --git a/Gemfile b/Gemfile index cd54325d8..3f669ebe1 100644 --- a/Gemfile +++ b/Gemfile @@ -2,7 +2,7 @@ source "https://rubygems.org" -gem "rails", "5.1.6.2" +gem "rails", "5.1.7" # Legacy Rails features, remove me! # responders (class level) diff --git a/Gemfile.lock b/Gemfile.lock index 38e879e6d..f9866a895 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -2,25 +2,25 @@ GEM remote: https://rubygems.org/ remote: https://rails-assets.org/ specs: - actioncable (5.1.6.2) - actionpack (= 5.1.6.2) + actioncable (5.1.7) + actionpack (= 5.1.7) nio4r (~> 2.0) websocket-driver (~> 0.6.1) - actionmailer (5.1.6.2) - actionpack (= 5.1.6.2) - actionview (= 5.1.6.2) - activejob (= 5.1.6.2) + actionmailer (5.1.7) + actionpack (= 5.1.7) + actionview (= 5.1.7) + activejob (= 5.1.7) mail (~> 2.5, >= 2.5.4) rails-dom-testing (~> 2.0) - actionpack (5.1.6.2) - actionview (= 5.1.6.2) - activesupport (= 5.1.6.2) + actionpack (5.1.7) + actionview (= 5.1.7) + activesupport (= 5.1.7) rack (~> 2.0) rack-test (>= 0.6.3) rails-dom-testing (~> 2.0) rails-html-sanitizer (~> 1.0, >= 1.0.2) - actionview (5.1.6.2) - activesupport (= 5.1.6.2) + actionview (5.1.7) + activesupport (= 5.1.7) builder (~> 3.1) erubi (~> 1.4) rails-dom-testing (~> 2.0) @@ -28,18 +28,18 @@ GEM active_model_serializers (0.9.7) activemodel (>= 3.2) concurrent-ruby (~> 1.0) - activejob (5.1.6.2) - activesupport (= 5.1.6.2) + activejob (5.1.7) + activesupport (= 5.1.7) globalid (>= 0.3.6) - activemodel (5.1.6.2) - activesupport (= 5.1.6.2) - activerecord (5.1.6.2) - activemodel (= 5.1.6.2) - activesupport (= 5.1.6.2) + activemodel (5.1.7) + activesupport (= 5.1.7) + activerecord (5.1.7) + activemodel (= 5.1.7) + activesupport (= 5.1.7) arel (~> 8.0) activerecord-import (1.0.1) activerecord (>= 3.2) - activesupport (5.1.6.2) + activesupport (5.1.7) concurrent-ruby (~> 1.0, >= 1.0.2) i18n (>= 0.7, < 2) minitest (~> 5.1) @@ -490,7 +490,7 @@ GEM psych (3.1.0) public_suffix (3.0.3) raabro (1.1.6) - rack (2.0.6) + rack (2.0.7) rack-cors (1.0.2) rack-google-analytics (1.2.0) actionpack @@ -511,17 +511,17 @@ GEM rack rack-test (1.1.0) rack (>= 1.0, < 3) - rails (5.1.6.2) - actioncable (= 5.1.6.2) - actionmailer (= 5.1.6.2) - actionpack (= 5.1.6.2) - actionview (= 5.1.6.2) - activejob (= 5.1.6.2) - activemodel (= 5.1.6.2) - activerecord (= 5.1.6.2) - activesupport (= 5.1.6.2) + rails (5.1.7) + actioncable (= 5.1.7) + actionmailer (= 5.1.7) + actionpack (= 5.1.7) + actionview (= 5.1.7) + activejob (= 5.1.7) + activemodel (= 5.1.7) + activerecord (= 5.1.7) + activesupport (= 5.1.7) bundler (>= 1.3.0) - railties (= 5.1.6.2) + railties (= 5.1.7) sprockets-rails (>= 2.0.0) rails-assets-autosize (4.0.2) rails-assets-backbone (1.3.3) @@ -584,9 +584,9 @@ GEM rails-timeago (2.17.1) actionpack (>= 3.1) activesupport (>= 3.1) - railties (5.1.6.2) - actionpack (= 5.1.6.2) - activesupport (= 5.1.6.2) + railties (5.1.7) + actionpack (= 5.1.7) + activesupport (= 5.1.7) method_source rake (>= 0.8.7) thor (>= 0.18.1, < 2.0) @@ -769,7 +769,7 @@ GEM hashdiff websocket-driver (0.6.5) websocket-extensions (>= 0.1.0) - websocket-extensions (0.1.3) + websocket-extensions (0.1.4) will_paginate (3.1.7) xpath (3.2.0) nokogiri (~> 1.8) @@ -858,7 +858,7 @@ DEPENDENCIES rack-piwik (= 0.3.0) rack-rewrite (= 1.5.1) rack-ssl (= 1.4.1) - rails (= 5.1.6.2) + rails (= 5.1.7) rails-assets-autosize (= 4.0.2)! rails-assets-backbone (= 1.3.3)! rails-assets-blueimp-gallery (= 2.33.0)! From e7a7f62531aa6796b4b4042d29091bc9645bda08 Mon Sep 17 00:00:00 2001 From: Benjamin Neff Date: Wed, 3 Jul 2019 00:39:30 +0200 Subject: [PATCH 37/81] Bump unicorn --- Gemfile | 2 +- Gemfile.lock | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Gemfile b/Gemfile index 3f669ebe1..f1330f01c 100644 --- a/Gemfile +++ b/Gemfile @@ -10,7 +10,7 @@ gem "responders", "2.4.1" # Appserver -gem "unicorn", "5.5.0", require: false +gem "unicorn", "5.5.1", require: false gem "unicorn-worker-killer", "0.4.4" # Federation diff --git a/Gemfile.lock b/Gemfile.lock index f9866a895..1929865ed 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -739,7 +739,7 @@ GEM unf_ext unf_ext (0.0.7.5) unicode-display_width (1.5.0) - unicorn (5.5.0) + unicorn (5.5.1) kgio (~> 2.6) raindrops (~> 0.7) unicorn-worker-killer (0.4.4) @@ -914,7 +914,7 @@ DEPENDENCIES twitter-text (= 1.14.7) typhoeus (= 1.3.1) uglifier (= 4.1.20) - unicorn (= 5.5.0) + unicorn (= 5.5.1) unicorn-worker-killer (= 0.4.4) uuid (= 2.3.9) versionist (= 1.7.0) From b1441356d2c2849d40ea815ea9bf0d623d3bcdd4 Mon Sep 17 00:00:00 2001 From: Benjamin Neff Date: Wed, 3 Jul 2019 00:48:36 +0200 Subject: [PATCH 38/81] Bump sidekiq --- Gemfile | 2 +- Gemfile.lock | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Gemfile b/Gemfile index f1330f01c..5f8b0de2f 100644 --- a/Gemfile +++ b/Gemfile @@ -38,7 +38,7 @@ gem "simple_captcha2", "0.4.3", require: "simple_captcha" # Background processing gem "redis", "3.3.5" # Pinned to 3.3.x because of https://github.com/antirez/redis/issues/4272 -gem "sidekiq", "5.2.5" +gem "sidekiq", "5.2.7" # Scheduled processing diff --git a/Gemfile.lock b/Gemfile.lock index 1929865ed..81de66909 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -664,7 +664,7 @@ GEM shellany (0.0.1) shoulda-matchers (4.0.1) activesupport (>= 4.2.0) - sidekiq (5.2.5) + sidekiq (5.2.7) connection_pool (~> 2.2, >= 2.2.2) rack (>= 1.5.0) rack-protection (>= 1.5.0) @@ -898,7 +898,7 @@ DEPENDENCIES sass-rails (= 5.0.7) secure_headers (= 6.1.0) shoulda-matchers (= 4.0.1) - sidekiq (= 5.2.5) + sidekiq (= 5.2.7) sidekiq-cron (= 1.1.0) simple_captcha2 (= 0.4.3) simplecov (= 0.16.1) From 07513e2ec039fd5a75a22a283914f8607cd01966 Mon Sep 17 00:00:00 2001 From: Benjamin Neff Date: Wed, 3 Jul 2019 00:52:08 +0200 Subject: [PATCH 39/81] Bump rack-cors --- Gemfile | 2 +- Gemfile.lock | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Gemfile b/Gemfile index 5f8b0de2f..b0cc27b8a 100644 --- a/Gemfile +++ b/Gemfile @@ -54,7 +54,7 @@ gem "configurate", "0.3.1" # Cross-origin resource sharing -gem "rack-cors", "1.0.2", require: "rack/cors" +gem "rack-cors", "1.0.3", require: "rack/cors" # CSS diff --git a/Gemfile.lock b/Gemfile.lock index 81de66909..31200591c 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -491,7 +491,7 @@ GEM public_suffix (3.0.3) raabro (1.1.6) rack (2.0.7) - rack-cors (1.0.2) + rack-cors (1.0.3) rack-google-analytics (1.2.0) actionpack activesupport @@ -853,7 +853,7 @@ DEPENDENCIES pronto-scss (= 0.9.1) pry pry-byebug - rack-cors (= 1.0.2) + rack-cors (= 1.0.3) rack-google-analytics (= 1.2.0) rack-piwik (= 0.3.0) rack-rewrite (= 1.5.1) From c154c4e2af3f5a2bf1b791b86054071cac4bab74 Mon Sep 17 00:00:00 2001 From: Benjamin Neff Date: Wed, 3 Jul 2019 01:10:53 +0200 Subject: [PATCH 40/81] Bump activerecord-import --- Gemfile | 2 +- Gemfile.lock | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Gemfile b/Gemfile index b0cc27b8a..f89c814ae 100644 --- a/Gemfile +++ b/Gemfile @@ -75,7 +75,7 @@ group :postgresql, optional: true do end -gem "activerecord-import", "1.0.1" +gem "activerecord-import", "1.0.2" # File uploading diff --git a/Gemfile.lock b/Gemfile.lock index 31200591c..ecb863da6 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -37,7 +37,7 @@ GEM activemodel (= 5.1.7) activesupport (= 5.1.7) arel (~> 8.0) - activerecord-import (1.0.1) + activerecord-import (1.0.2) activerecord (>= 3.2) activesupport (5.1.7) concurrent-ruby (~> 1.0, >= 1.0.2) @@ -780,7 +780,7 @@ PLATFORMS DEPENDENCIES active_model_serializers (= 0.9.7) - activerecord-import (= 1.0.1) + activerecord-import (= 1.0.2) acts-as-taggable-on (= 6.0.0) acts_as_api (= 1.0.1) addressable (= 2.5.2) From e2ce43c3c7e037617206df294a00b5e546da9fae Mon Sep 17 00:00:00 2001 From: Benjamin Neff Date: Wed, 3 Jul 2019 01:12:26 +0200 Subject: [PATCH 41/81] Bump fog-aws --- Gemfile | 2 +- Gemfile.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Gemfile b/Gemfile index f89c814ae..d6cd789e1 100644 --- a/Gemfile +++ b/Gemfile @@ -80,7 +80,7 @@ gem "activerecord-import", "1.0.2" # File uploading gem "carrierwave", "1.3.1" -gem "fog-aws", "3.4.0" +gem "fog-aws", "3.5.1" gem "mini_magick", "4.9.3" # GUID generation diff --git a/Gemfile.lock b/Gemfile.lock index ecb863da6..302bd367e 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -212,7 +212,7 @@ GEM tzinfo ethon (0.12.0) ffi (>= 1.3.0) - excon (0.62.0) + excon (0.64.0) execjs (2.7.0) eye (0.10.0) celluloid (~> 0.17.3) @@ -238,7 +238,7 @@ GEM activerecord (>= 2) activesupport (>= 2) hashdiff - fog-aws (3.4.0) + fog-aws (3.5.1) fog-core (~> 2.1) fog-json (~> 1.1) fog-xml (~> 0.1) @@ -392,7 +392,7 @@ GEM method_source (0.9.2) mime-types (3.2.2) mime-types-data (~> 3.2015) - mime-types-data (3.2018.0812) + mime-types-data (3.2019.0331) mini_magick (4.9.3) mini_mime (1.0.1) mini_portile2 (2.4.0) @@ -810,7 +810,7 @@ DEPENDENCIES faraday-cookie_jar (= 0.0.6) faraday_middleware (= 0.12.2) fixture_builder (= 0.5.2.rc3) - fog-aws (= 3.4.0) + fog-aws (= 3.5.1) fuubar (= 2.3.2) gon (= 6.2.1) guard (= 2.15.0) From 8f5c248536b28c139cee0763c0d1e21f2eaa145c Mon Sep 17 00:00:00 2001 From: Benjamin Neff Date: Wed, 3 Jul 2019 01:14:25 +0200 Subject: [PATCH 42/81] Bump handlebars_assets --- Gemfile | 2 +- Gemfile.lock | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Gemfile b/Gemfile index d6cd789e1..c6b5b66a8 100644 --- a/Gemfile +++ b/Gemfile @@ -92,7 +92,7 @@ gem "entypo-rails", "3.0.0" # JavaScript -gem "handlebars_assets", "0.23.3" +gem "handlebars_assets", "0.23.4" gem "jquery-rails", "4.3.3" gem "js-routes", "1.4.4" gem "js_image_paths", "0.1.1" diff --git a/Gemfile.lock b/Gemfile.lock index 302bd367e..6ca99b361 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -302,7 +302,7 @@ GEM temple (>= 0.8.0) thor tilt - handlebars_assets (0.23.3) + handlebars_assets (0.23.4) execjs (~> 2.0) sprockets (>= 2.0.0) tilt (>= 1.2) @@ -818,7 +818,7 @@ DEPENDENCIES guard-rubocop (= 1.3.0) haml_lint (= 0.28.0) hamlit (= 2.9.2) - handlebars_assets (= 0.23.3) + handlebars_assets (= 0.23.4) http_accept_language (= 2.1.1) i18n-inflector-rails (= 1.0.7) jasmine (= 3.3.0) From a018abcfe9ffdeca999901908a3ab3a15cc5d106 Mon Sep 17 00:00:00 2001 From: Benjamin Neff Date: Wed, 3 Jul 2019 01:16:07 +0200 Subject: [PATCH 43/81] Bump jquery --- Gemfile | 4 ++-- Gemfile.lock | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Gemfile b/Gemfile index c6b5b66a8..27de92bd4 100644 --- a/Gemfile +++ b/Gemfile @@ -93,12 +93,12 @@ gem "entypo-rails", "3.0.0" # JavaScript gem "handlebars_assets", "0.23.4" -gem "jquery-rails", "4.3.3" +gem "jquery-rails", "4.3.5" gem "js-routes", "1.4.4" gem "js_image_paths", "0.1.1" source "https://rails-assets.org" do - gem "rails-assets-jquery", "3.3.1" # Should be kept in sync with jquery-rails + gem "rails-assets-jquery", "3.4.1" # Should be kept in sync with jquery-rails gem "rails-assets-jquery.ui", "1.11.4" gem "rails-assets-highlightjs", "9.12.0" diff --git a/Gemfile.lock b/Gemfile.lock index 6ca99b361..c11347532 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -339,7 +339,7 @@ GEM rake jasmine-core (3.3.0) jasmine-jquery-rails (2.0.3) - jquery-rails (4.3.3) + jquery-rails (4.3.5) rails-dom-testing (>= 1, < 3) railties (>= 4.2.0) thor (>= 0.14, < 2.0) @@ -547,7 +547,7 @@ GEM rails-assets-jasmine (3.3.0) rails-assets-jasmine-ajax (3.4.0) rails-assets-jasmine (~> 3) - rails-assets-jquery (3.3.1) + rails-assets-jquery (3.4.1) rails-assets-jquery-colorbox (1.6.4) rails-assets-jquery (>= 1.3.2) rails-assets-jquery-fullscreen-plugin (0.5.0) @@ -823,7 +823,7 @@ DEPENDENCIES i18n-inflector-rails (= 1.0.7) jasmine (= 3.3.0) jasmine-jquery-rails (= 2.0.3) - jquery-rails (= 4.3.3) + jquery-rails (= 4.3.5) js-routes (= 1.4.4) js_image_paths (= 0.1.1) json (= 2.2.0) @@ -868,7 +868,7 @@ DEPENDENCIES rails-assets-fine-uploader (= 5.13.0)! rails-assets-highlightjs (= 9.12.0)! rails-assets-jasmine-ajax (= 3.4.0)! - rails-assets-jquery (= 3.3.1)! + rails-assets-jquery (= 3.4.1)! rails-assets-jquery-placeholder (= 2.3.1)! rails-assets-jquery-textchange (= 0.2.3)! rails-assets-jquery.are-you-sure (= 1.9.0)! From 325a9122b88eba3d726540b12aa8b0e6f0cf2b00 Mon Sep 17 00:00:00 2001 From: Benjamin Neff Date: Wed, 3 Jul 2019 01:17:15 +0200 Subject: [PATCH 44/81] Bump js-routes --- Gemfile | 2 +- Gemfile.lock | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Gemfile b/Gemfile index 27de92bd4..90a53cb27 100644 --- a/Gemfile +++ b/Gemfile @@ -94,7 +94,7 @@ gem "entypo-rails", "3.0.0" gem "handlebars_assets", "0.23.4" gem "jquery-rails", "4.3.5" -gem "js-routes", "1.4.4" +gem "js-routes", "1.4.7" gem "js_image_paths", "0.1.1" source "https://rails-assets.org" do diff --git a/Gemfile.lock b/Gemfile.lock index c11347532..e0c5bbd8b 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -343,8 +343,8 @@ GEM rails-dom-testing (>= 1, < 3) railties (>= 4.2.0) thor (>= 0.14, < 2.0) - js-routes (1.4.4) - railties (>= 3.2) + js-routes (1.4.7) + railties (>= 4) sprockets-rails js_image_paths (0.1.1) rails (>= 4.0, < 6.0) @@ -824,7 +824,7 @@ DEPENDENCIES jasmine (= 3.3.0) jasmine-jquery-rails (= 2.0.3) jquery-rails (= 4.3.5) - js-routes (= 1.4.4) + js-routes (= 1.4.7) js_image_paths (= 0.1.1) json (= 2.2.0) json-schema (= 2.8.1) From 56670865b92dc4d9d6dcae4656029c070af9a4ea Mon Sep 17 00:00:00 2001 From: Benjamin Neff Date: Wed, 3 Jul 2019 01:23:38 +0200 Subject: [PATCH 45/81] Bump leaflet-rails --- Gemfile | 2 +- Gemfile.lock | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Gemfile b/Gemfile index 90a53cb27..e7ecaaf43 100644 --- a/Gemfile +++ b/Gemfile @@ -138,7 +138,7 @@ gem "rails-i18n", "5.1.3" gem "markerb", "1.1.0" # Map -gem "leaflet-rails", "1.3.1" +gem "leaflet-rails", "1.5.1" # Parsing diff --git a/Gemfile.lock b/Gemfile.lock index e0c5bbd8b..1ebc03856 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -365,7 +365,7 @@ GEM jwt (2.1.0) kgio (2.11.2) kostya-sigar (2.0.6) - leaflet-rails (1.3.1) + leaflet-rails (1.5.1) rails (>= 4.2.0) listen (3.1.5) rb-fsevent (~> 0.9, >= 0.9.4) @@ -829,7 +829,7 @@ DEPENDENCIES json (= 2.2.0) json-schema (= 2.8.1) json-schema-rspec (= 0.0.4) - leaflet-rails (= 1.3.1) + leaflet-rails (= 1.5.1) logging-rails (= 0.6.0) markdown-it-html5-embed (= 1.0.0) markerb (= 1.1.0) From a6261fdc64b366e27ce371071a9aa9c081270b25 Mon Sep 17 00:00:00 2001 From: Benjamin Neff Date: Wed, 3 Jul 2019 01:26:19 +0200 Subject: [PATCH 46/81] Bump nokogiri --- Gemfile | 2 +- Gemfile.lock | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Gemfile b/Gemfile index e7ecaaf43..8707f466b 100644 --- a/Gemfile +++ b/Gemfile @@ -142,7 +142,7 @@ gem "leaflet-rails", "1.5.1" # Parsing -gem "nokogiri", "1.10.1" +gem "nokogiri", "1.10.3" gem "open_graph_reader", "0.6.2" # also update User-Agent in features/support/webmock.rb gem "redcarpet", "3.4.0" gem "ruby-oembed", "0.12.0" diff --git a/Gemfile.lock b/Gemfile.lock index 1ebc03856..8200b8cbe 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -408,7 +408,7 @@ GEM naught (1.1.0) nenv (0.3.0) nio4r (2.3.1) - nokogiri (1.10.1) + nokogiri (1.10.3) mini_portile2 (~> 2.4.0) notiffany (0.1.1) nenv (~> 0.1) @@ -837,7 +837,7 @@ DEPENDENCIES minitest mobile-fu (= 1.4.0) mysql2 (= 0.5.2) - nokogiri (= 1.10.1) + nokogiri (= 1.10.3) omniauth (= 1.9.0) omniauth-tumblr (= 1.2) omniauth-twitter (= 1.4.0) From ee503737cb4870009207914d986ff2c614b917bf Mon Sep 17 00:00:00 2001 From: Benjamin Neff Date: Wed, 3 Jul 2019 01:42:23 +0200 Subject: [PATCH 47/81] Bump secure_headers --- Gemfile | 2 +- Gemfile.lock | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Gemfile b/Gemfile index 8707f466b..d6bf43067 100644 --- a/Gemfile +++ b/Gemfile @@ -154,7 +154,7 @@ gem "string-direction", "1.2.1" # Security Headers -gem "secure_headers", "6.1.0" +gem "secure_headers", "6.1.1" # Services diff --git a/Gemfile.lock b/Gemfile.lock index 8200b8cbe..bb6fa7cae 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -660,7 +660,7 @@ GEM scss_lint (0.55.0) rake (>= 0.9, < 13) sass (~> 3.4.20) - secure_headers (6.1.0) + secure_headers (6.1.1) shellany (0.0.1) shoulda-matchers (4.0.1) activesupport (>= 4.2.0) @@ -896,7 +896,7 @@ DEPENDENCIES ruby-oembed (= 0.12.0) rubyzip (= 1.2.2) sass-rails (= 5.0.7) - secure_headers (= 6.1.0) + secure_headers (= 6.1.1) shoulda-matchers (= 4.0.1) sidekiq (= 5.2.7) sidekiq-cron (= 1.1.0) From c059550943fd726c82f30e4f833122595b36bc55 Mon Sep 17 00:00:00 2001 From: Benjamin Neff Date: Wed, 3 Jul 2019 01:48:30 +0200 Subject: [PATCH 48/81] Bump openid_connect --- Gemfile | 2 +- Gemfile.lock | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/Gemfile b/Gemfile index d6bf43067..f2da8d4cb 100644 --- a/Gemfile +++ b/Gemfile @@ -165,7 +165,7 @@ gem "omniauth-wordpress", "0.2.2" gem "twitter", "6.2.0" # OpenID Connect -gem "openid_connect", "1.1.6" +gem "openid_connect", "1.1.8" # Serializers diff --git a/Gemfile.lock b/Gemfile.lock index bb6fa7cae..404d85af6 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -350,7 +350,7 @@ GEM rails (>= 4.0, < 6.0) sprockets (>= 3.0.0) json (2.2.0) - json-jwt (1.10.0) + json-jwt (1.10.2) activesupport (>= 4.2) aes_key_wrap bindata @@ -442,7 +442,7 @@ GEM open_graph_reader (0.6.2) faraday (>= 0.9.0) nokogiri (~> 1.6) - openid_connect (1.1.6) + openid_connect (1.1.8) activemodel attr_required (>= 1.0.0) json-jwt (>= 1.5.0) @@ -488,7 +488,7 @@ GEM byebug (~> 11.0) pry (~> 0.10) psych (3.1.0) - public_suffix (3.0.3) + public_suffix (3.1.1) raabro (1.1.6) rack (2.0.7) rack-cors (1.0.3) @@ -497,7 +497,7 @@ GEM activesupport rack-mobile-detect (0.4.0) rack - rack-oauth2 (1.9.3) + rack-oauth2 (1.10.0) activesupport attr_required httpclient @@ -751,7 +751,7 @@ GEM validate_email (0.1.6) activemodel (>= 3.0) mail (>= 2.2.5) - validate_url (1.0.6) + validate_url (1.0.8) activemodel (>= 3.0.0) public_suffix versionist (1.7.0) @@ -843,7 +843,7 @@ DEPENDENCIES omniauth-twitter (= 1.4.0) omniauth-wordpress (= 0.2.2) open_graph_reader (= 0.6.2) - openid_connect (= 1.1.6) + openid_connect (= 1.1.8) pg (= 1.1.4) poltergeist (= 1.18.1) pronto (= 0.9.5) From fa08ebf7bde789b6d8733103886e3d783317786c Mon Sep 17 00:00:00 2001 From: Benjamin Neff Date: Wed, 3 Jul 2019 01:51:56 +0200 Subject: [PATCH 49/81] Bump addressable --- Gemfile | 2 +- Gemfile.lock | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/Gemfile b/Gemfile index f2da8d4cb..c0f30d116 100644 --- a/Gemfile +++ b/Gemfile @@ -181,7 +181,7 @@ gem "acts-as-taggable-on", "6.0.0" # URIs and HTTP -gem "addressable", "2.5.2", require: "addressable/uri" +gem "addressable", "2.6.0", require: "addressable/uri" gem "faraday", "0.15.4" gem "faraday_middleware", "0.12.2" gem "faraday-cookie_jar", "0.0.6" diff --git a/Gemfile.lock b/Gemfile.lock index 404d85af6..c4e77131b 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -50,7 +50,7 @@ GEM activemodel (>= 3.0.0) activesupport (>= 3.0.0) rack (>= 1.1.0) - addressable (2.5.2) + addressable (2.6.0) public_suffix (>= 2.0.2, < 4.0) aes_key_wrap (1.0.1) arel (8.0.0) @@ -403,7 +403,7 @@ GEM multi_json (1.13.1) multi_test (0.1.2) multi_xml (0.6.0) - multipart-post (2.0.0) + multipart-post (2.1.1) mysql2 (0.5.2) naught (1.1.0) nenv (0.3.0) @@ -654,9 +654,9 @@ GEM sassc (2.0.1) ffi (~> 1.9) rake - sawyer (0.8.1) - addressable (>= 2.3.5, < 2.6) - faraday (~> 0.8, < 1.0) + sawyer (0.8.2) + addressable (>= 2.3.5) + faraday (> 0.8, < 2.0) scss_lint (0.55.0) rake (>= 0.9, < 13) sass (~> 3.4.20) @@ -783,7 +783,7 @@ DEPENDENCIES activerecord-import (= 1.0.2) acts-as-taggable-on (= 6.0.0) acts_as_api (= 1.0.1) - addressable (= 2.5.2) + addressable (= 2.6.0) asset_sync (= 2.7.0) autoprefixer-rails (= 8.6.5) bootstrap-sass (= 3.4.1) From 06c582a672a085c23ad877ee7702b58506843fe0 Mon Sep 17 00:00:00 2001 From: Benjamin Neff Date: Wed, 3 Jul 2019 01:54:02 +0200 Subject: [PATCH 50/81] Bump faraday_middleware --- Gemfile | 2 +- Gemfile.lock | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Gemfile b/Gemfile index c0f30d116..3ecaad1d0 100644 --- a/Gemfile +++ b/Gemfile @@ -183,7 +183,7 @@ gem "acts-as-taggable-on", "6.0.0" gem "addressable", "2.6.0", require: "addressable/uri" gem "faraday", "0.15.4" -gem "faraday_middleware", "0.12.2" +gem "faraday_middleware", "0.13.1" gem "faraday-cookie_jar", "0.0.6" gem "typhoeus", "1.3.1" diff --git a/Gemfile.lock b/Gemfile.lock index c4e77131b..9c33bff22 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -231,7 +231,7 @@ GEM faraday-cookie_jar (0.0.6) faraday (>= 0.7.4) http-cookie (~> 1.0.0) - faraday_middleware (0.12.2) + faraday_middleware (0.13.1) faraday (>= 0.7.4, < 1.0) ffi (1.10.0) fixture_builder (0.5.2.rc3) @@ -808,7 +808,7 @@ DEPENDENCIES factory_girl_rails (= 4.8.0) faraday (= 0.15.4) faraday-cookie_jar (= 0.0.6) - faraday_middleware (= 0.12.2) + faraday_middleware (= 0.13.1) fixture_builder (= 0.5.2.rc3) fog-aws (= 3.5.1) fuubar (= 2.3.2) From 3a1428a67258714aeaef3dcfb308e373ff7be1b0 Mon Sep 17 00:00:00 2001 From: Benjamin Neff Date: Wed, 3 Jul 2019 01:55:44 +0200 Subject: [PATCH 51/81] Bump hamlit --- Gemfile | 2 +- Gemfile.lock | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Gemfile b/Gemfile index 3ecaad1d0..2c6586c82 100644 --- a/Gemfile +++ b/Gemfile @@ -190,7 +190,7 @@ gem "typhoeus", "1.3.1" # Views gem "gon", "6.2.1" -gem "hamlit", "2.9.2" +gem "hamlit", "2.9.3" gem "mobile-fu", "1.4.0" gem "rails-timeago", "2.17.1" gem "will_paginate", "3.1.7" diff --git a/Gemfile.lock b/Gemfile.lock index 9c33bff22..0842b1a2d 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -298,7 +298,7 @@ GEM rake (>= 10, < 13) rubocop (>= 0.50.0) sysexits (~> 1.1) - hamlit (2.9.2) + hamlit (2.9.3) temple (>= 0.8.0) thor tilt @@ -817,7 +817,7 @@ DEPENDENCIES guard-rspec (= 4.7.3) guard-rubocop (= 1.3.0) haml_lint (= 0.28.0) - hamlit (= 2.9.2) + hamlit (= 2.9.3) handlebars_assets (= 0.23.4) http_accept_language (= 2.1.1) i18n-inflector-rails (= 1.0.7) From d2c4faeb9f31ba27c0be801817adeeb505849dfb Mon Sep 17 00:00:00 2001 From: Benjamin Neff Date: Wed, 3 Jul 2019 01:58:51 +0200 Subject: [PATCH 52/81] Bump versionist --- Gemfile | 2 +- Gemfile.lock | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Gemfile b/Gemfile index 2c6586c82..c3eda088a 100644 --- a/Gemfile +++ b/Gemfile @@ -210,7 +210,7 @@ gem "rubyzip", "1.2.2", require: "zip" # https://github.com/discourse/discourse/pull/238 gem "minitest" -gem "versionist", "1.7.0" +gem "versionist", "2.0.0" # Windows and OSX have an execjs compatible runtime built-in, Linux users should # install Node.js or use "therubyracer". diff --git a/Gemfile.lock b/Gemfile.lock index 0842b1a2d..6ddb99c93 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -754,7 +754,7 @@ GEM validate_url (1.0.8) activemodel (>= 3.0.0) public_suffix - versionist (1.7.0) + versionist (2.0.0) activesupport (>= 3) railties (>= 3) yard (~> 0.9.11) @@ -773,7 +773,7 @@ GEM will_paginate (3.1.7) xpath (3.2.0) nokogiri (~> 1.8) - yard (0.9.18) + yard (0.9.20) PLATFORMS ruby @@ -917,7 +917,7 @@ DEPENDENCIES unicorn (= 5.5.1) unicorn-worker-killer (= 0.4.4) uuid (= 2.3.9) - versionist (= 1.7.0) + versionist (= 2.0.0) webmock (= 3.5.1) will_paginate (= 3.1.7) From 1458d2d57fcfaf760ed60efdacaf05c796d96ac8 Mon Sep 17 00:00:00 2001 From: Benjamin Neff Date: Wed, 3 Jul 2019 02:19:37 +0200 Subject: [PATCH 53/81] Bump rubocop --- .rubocop.yml | 5 ++--- Gemfile | 3 ++- Gemfile.lock | 24 +++++++++++++----------- 3 files changed, 17 insertions(+), 15 deletions(-) diff --git a/.rubocop.yml b/.rubocop.yml index 0647b5e48..28f9edea4 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -1,3 +1,5 @@ +require: rubocop-rails + AllCops: TargetRubyVersion: 2.3 Exclude: @@ -5,9 +7,6 @@ AllCops: - "db/schema.rb" - "config/locales/cldr/plurals.rb" -Rails: - Enabled: true - # Disable for rails 4 Rails/HttpPositionalArguments: Enabled: false diff --git a/Gemfile b/Gemfile index c3eda088a..9b30b2e8a 100644 --- a/Gemfile +++ b/Gemfile @@ -254,7 +254,8 @@ group :development do gem "pronto-haml", "0.9.0", require: false gem "pronto-rubocop", "0.9.1", require: false gem "pronto-scss", "0.9.1", require: false - gem "rubocop", "0.66.0", require: false + gem "rubocop", "0.72.0", require: false + gem "rubocop-rails", "2.1.0", require: false # Preloading environment diff --git a/Gemfile.lock b/Gemfile.lock index 6ddb99c93..c5c27fa7b 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -331,7 +331,7 @@ GEM i18n-inflector (~> 2.6) railties (>= 3.0.0) ipaddress (0.8.3) - jaro_winkler (1.5.2) + jaro_winkler (1.5.3) jasmine (3.3.0) jasmine-core (~> 3.3.0) phantomjs @@ -453,8 +453,8 @@ GEM validate_url webfinger (>= 1.0.1) orm_adapter (0.5.0) - parallel (1.14.0) - parser (2.6.2.0) + parallel (1.17.0) + parser (2.6.3.0) ast (~> 2.4.0) pg (1.1.4) phantomjs (2.1.1.0) @@ -487,7 +487,6 @@ GEM pry-byebug (3.7.0) byebug (~> 11.0) pry (~> 0.10) - psych (3.1.0) public_suffix (3.1.1) raabro (1.1.6) rack (2.0.7) @@ -630,16 +629,18 @@ GEM rspec-mocks (~> 3.8.0) rspec-support (~> 3.8.0) rspec-support (3.8.0) - rubocop (0.66.0) + rubocop (0.72.0) jaro_winkler (~> 1.5.1) parallel (~> 1.10) - parser (>= 2.5, != 2.5.1.1) - psych (>= 3.1.0) + parser (>= 2.6) rainbow (>= 2.2.2, < 4.0) ruby-progressbar (~> 1.7) - unicode-display_width (>= 1.4.0, < 1.6) + unicode-display_width (>= 1.4.0, < 1.7) + rubocop-rails (2.1.0) + rack (>= 1.1) + rubocop (>= 0.72.0) ruby-oembed (0.12.0) - ruby-progressbar (1.10.0) + ruby-progressbar (1.10.1) ruby_dep (1.5.0) rubyzip (1.2.2) rugged (0.28.1) @@ -738,7 +739,7 @@ GEM unf (0.1.4) unf_ext unf_ext (0.0.7.5) - unicode-display_width (1.5.0) + unicode-display_width (1.6.0) unicorn (5.5.1) kgio (~> 2.6) raindrops (~> 0.7) @@ -892,7 +893,8 @@ DEPENDENCIES rqrcode (= 0.10.1) rspec-json_expectations (~> 2.1) rspec-rails (= 3.8.2) - rubocop (= 0.66.0) + rubocop (= 0.72.0) + rubocop-rails (= 2.1.0) ruby-oembed (= 0.12.0) rubyzip (= 1.2.2) sass-rails (= 5.0.7) From 556fa42004f6a9db61aff7f875c4ef7749965088 Mon Sep 17 00:00:00 2001 From: Benjamin Neff Date: Wed, 3 Jul 2019 02:24:31 +0200 Subject: [PATCH 54/81] Bump fuubar --- Gemfile | 2 +- Gemfile.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Gemfile b/Gemfile index 9b30b2e8a..8e579fab9 100644 --- a/Gemfile +++ b/Gemfile @@ -277,7 +277,7 @@ group :test do # RSpec (unit tests, some integration tests) gem "fixture_builder", "0.5.2.rc3" - gem "fuubar", "2.3.2" + gem "fuubar", "2.4.0" gem "json-schema-rspec", "0.0.4" gem "rspec-json_expectations", "~> 2.1" diff --git a/Gemfile.lock b/Gemfile.lock index c5c27fa7b..2e2ddc527 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -258,7 +258,7 @@ GEM fugit (1.1.8) et-orbi (~> 1.1, >= 1.1.7) raabro (~> 1.1) - fuubar (2.3.2) + fuubar (2.4.0) rspec-core (~> 3.0) ruby-progressbar (~> 1.4) get_process_mem (0.2.3) @@ -611,7 +611,7 @@ GEM rspec-core (~> 3.8.0) rspec-expectations (~> 3.8.0) rspec-mocks (~> 3.8.0) - rspec-core (3.8.0) + rspec-core (3.8.2) rspec-support (~> 3.8.0) rspec-expectations (3.8.2) diff-lcs (>= 1.2.0, < 2.0) @@ -628,7 +628,7 @@ GEM rspec-expectations (~> 3.8.0) rspec-mocks (~> 3.8.0) rspec-support (~> 3.8.0) - rspec-support (3.8.0) + rspec-support (3.8.2) rubocop (0.72.0) jaro_winkler (~> 1.5.1) parallel (~> 1.10) @@ -812,7 +812,7 @@ DEPENDENCIES faraday_middleware (= 0.13.1) fixture_builder (= 0.5.2.rc3) fog-aws (= 3.5.1) - fuubar (= 2.3.2) + fuubar (= 2.4.0) gon (= 6.2.1) guard (= 2.15.0) guard-rspec (= 4.7.3) From 800676a90f2b8e86e6df1be1ad1cb4ef808674be Mon Sep 17 00:00:00 2001 From: Benjamin Neff Date: Wed, 3 Jul 2019 02:27:12 +0200 Subject: [PATCH 55/81] Bump rspec-json_expectations --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index 2e2ddc527..9d93a1864 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -616,7 +616,7 @@ GEM rspec-expectations (3.8.2) diff-lcs (>= 1.2.0, < 2.0) rspec-support (~> 3.8.0) - rspec-json_expectations (2.1.0) + rspec-json_expectations (2.2.0) rspec-mocks (3.8.0) diff-lcs (>= 1.2.0, < 2.0) rspec-support (~> 3.8.0) From 26b247bf98c673c77156d21d40c34e22f08d4c92 Mon Sep 17 00:00:00 2001 From: Benjamin Neff Date: Wed, 3 Jul 2019 02:34:43 +0200 Subject: [PATCH 56/81] Bump webmock --- Gemfile | 2 +- Gemfile.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Gemfile b/Gemfile index 8e579fab9..91c18c44d 100644 --- a/Gemfile +++ b/Gemfile @@ -294,7 +294,7 @@ group :test do gem "factory_girl_rails", "4.8.0" gem "shoulda-matchers", "4.0.1" gem "timecop", "0.9.1" - gem "webmock", "3.5.1", require: false + gem "webmock", "3.6.0", require: false gem "diaspora_federation-test", "0.2.6" diff --git a/Gemfile.lock b/Gemfile.lock index 9d93a1864..e9d748403 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -306,7 +306,7 @@ GEM execjs (~> 2.0) sprockets (>= 2.0.0) tilt (>= 1.2) - hashdiff (0.3.8) + hashdiff (0.4.0) hashie (3.6.0) http (3.3.0) addressable (~> 2.3) @@ -764,10 +764,10 @@ GEM webfinger (1.1.0) activesupport httpclient (>= 2.4) - webmock (3.5.1) + webmock (3.6.0) addressable (>= 2.3.6) crack (>= 0.3.2) - hashdiff + hashdiff (>= 0.4.0, < 2.0.0) websocket-driver (0.6.5) websocket-extensions (>= 0.1.0) websocket-extensions (0.1.4) @@ -920,7 +920,7 @@ DEPENDENCIES unicorn-worker-killer (= 0.4.4) uuid (= 2.3.9) versionist (= 2.0.0) - webmock (= 3.5.1) + webmock (= 3.6.0) will_paginate (= 3.1.7) BUNDLED WITH From 18b0dd0060c6b3b38531c5d1515a8706e3330cf0 Mon Sep 17 00:00:00 2001 From: Benjamin Neff Date: Wed, 3 Jul 2019 02:35:29 +0200 Subject: [PATCH 57/81] Bump coveralls --- Gemfile | 2 +- Gemfile.lock | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Gemfile b/Gemfile index 91c18c44d..37858d5d9 100644 --- a/Gemfile +++ b/Gemfile @@ -299,7 +299,7 @@ group :test do gem "diaspora_federation-test", "0.2.6" # Coverage - gem "coveralls", "0.8.22", require: false + gem "coveralls", "0.8.23", require: false end group :development, :test do diff --git a/Gemfile.lock b/Gemfile.lock index e9d748403..1e83c0c8d 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -130,11 +130,11 @@ GEM concurrent-ruby (1.1.5) configurate (0.3.1) connection_pool (2.2.2) - coveralls (0.8.22) + coveralls (0.8.23) json (>= 1.8, < 3) simplecov (~> 0.16.1) term-ansicolor (~> 1.3) - thor (~> 0.19.4) + thor (>= 0.19.4, < 2.0) tins (~> 1.6) crack (0.4.3) safe_yaml (~> 1.0.0) @@ -196,7 +196,7 @@ GEM fabrication (~> 2.16) uuid (~> 2.3, >= 2.3.8) diff-lcs (1.3) - docile (1.3.1) + docile (1.3.2) domain_name (0.5.20180417) unf (>= 0.0.5, < 1.0.0) encryptor (3.0.0) @@ -714,7 +714,7 @@ GEM tilt (2.0.9) timecop (0.9.1) timers (4.3.0) - tins (1.20.2) + tins (1.20.3) to_regexp (0.2.1) turbo_dev_assets (0.0.2) twitter (6.2.0) @@ -793,7 +793,7 @@ DEPENDENCIES carrierwave (= 1.3.1) compass-rails (= 3.1.0) configurate (= 0.3.1) - coveralls (= 0.8.22) + coveralls (= 0.8.23) cucumber-api-steps (= 0.14) cucumber-rails (= 1.6.0) database_cleaner (= 1.7.0) From 51e7958c4b4a423dc39a969eceadce5ec4d76ddd Mon Sep 17 00:00:00 2001 From: Benjamin Neff Date: Wed, 3 Jul 2019 02:38:23 +0200 Subject: [PATCH 58/81] Bump pronto --- Gemfile | 10 +++++----- Gemfile.lock | 45 ++++++++++++++++++++++----------------------- 2 files changed, 27 insertions(+), 28 deletions(-) diff --git a/Gemfile b/Gemfile index 37858d5d9..7cbe17734 100644 --- a/Gemfile +++ b/Gemfile @@ -249,11 +249,11 @@ group :development do # Linters gem "haml_lint", "0.28.0", require: false - gem "pronto", "0.9.5", require: false - gem "pronto-eslint", "0.9.1", require: false - gem "pronto-haml", "0.9.0", require: false - gem "pronto-rubocop", "0.9.1", require: false - gem "pronto-scss", "0.9.1", require: false + gem "pronto", "0.10.0", require: false + gem "pronto-eslint", "0.10.0", require: false + gem "pronto-haml", "0.10.0", require: false + gem "pronto-rubocop", "0.10.0", require: false + gem "pronto-scss", "0.10.0", require: false gem "rubocop", "0.72.0", require: false gem "rubocop-rails", "2.1.0", require: false diff --git a/Gemfile.lock b/Gemfile.lock index 1e83c0c8d..f18f22ece 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -263,7 +263,7 @@ GEM ruby-progressbar (~> 1.4) get_process_mem (0.2.3) gherkin (5.1.0) - gitlab (4.10.0) + gitlab (4.11.0) httparty (~> 0.14, >= 0.14.0) terminal-table (~> 1.5, >= 1.5.1) globalid (0.4.2) @@ -318,7 +318,7 @@ GEM http-form_data (2.1.1) http_accept_language (2.1.1) http_parser.rb (0.6.0) - httparty (0.16.4) + httparty (0.17.0) mime-types (~> 3.0) multi_xml (>= 0.5.2) httpclient (2.8.3) @@ -420,7 +420,7 @@ GEM multi_json (~> 1.3) multi_xml (~> 0.5) rack (>= 1.2, < 3) - octokit (4.13.0) + octokit (4.14.0) sawyer (~> 0.8.0, >= 0.5.3) omniauth (1.9.0) hashie (>= 3.4.6, < 3.7.0) @@ -462,24 +462,24 @@ GEM capybara (>= 2.1, < 4) cliver (~> 0.3.1) websocket-driver (>= 0.2.0) - pronto (0.9.5) + pronto (0.10.0) gitlab (~> 4.0, >= 4.0.0) httparty (>= 0.13.7) octokit (~> 4.7, >= 4.7.0) - rainbow (~> 2.1) + rainbow (>= 2.2, < 4.0) rugged (~> 0.24, >= 0.23.0) - thor (~> 0.19.0) - pronto-eslint (0.9.1) + thor (~> 0.20.0) + pronto-eslint (0.10.0) eslintrb (~> 2.0, >= 2.0.0) - pronto (~> 0.9.0) - pronto-haml (0.9.0) + pronto (~> 0.10.0) + pronto-haml (0.10.0) haml_lint (~> 0.23) - pronto (~> 0.9.0) - pronto-rubocop (0.9.1) - pronto (~> 0.9.0) + pronto (~> 0.10.0) + pronto-rubocop (0.10.0) + pronto (~> 0.10.0) rubocop (~> 0.50, >= 0.49.1) - pronto-scss (0.9.1) - pronto (~> 0.9.0) + pronto-scss (0.10.0) + pronto (~> 0.10.0) scss_lint (~> 0.43, >= 0.43.0) pry (0.12.2) coderay (~> 1.1.0) @@ -589,8 +589,7 @@ GEM method_source rake (>= 0.8.7) thor (>= 0.18.1, < 2.0) - rainbow (2.2.2) - rake + rainbow (3.0.0) raindrops (0.19.0) rake (12.3.2) rb-fsevent (0.10.3) @@ -643,7 +642,7 @@ GEM ruby-progressbar (1.10.1) ruby_dep (1.5.0) rubyzip (1.2.2) - rugged (0.28.1) + rugged (0.28.2) safe_yaml (1.0.5) sass (3.4.25) sass-rails (5.0.7) @@ -709,7 +708,7 @@ GEM tins (~> 1.0) terminal-table (1.8.0) unicode-display_width (~> 1.1, >= 1.1.1) - thor (0.19.4) + thor (0.20.3) thread_safe (0.3.6) tilt (2.0.9) timecop (0.9.1) @@ -847,11 +846,11 @@ DEPENDENCIES openid_connect (= 1.1.8) pg (= 1.1.4) poltergeist (= 1.18.1) - pronto (= 0.9.5) - pronto-eslint (= 0.9.1) - pronto-haml (= 0.9.0) - pronto-rubocop (= 0.9.1) - pronto-scss (= 0.9.1) + pronto (= 0.10.0) + pronto-eslint (= 0.10.0) + pronto-haml (= 0.10.0) + pronto-rubocop (= 0.10.0) + pronto-scss (= 0.10.0) pry pry-byebug rack-cors (= 1.0.3) From 435e60c214d911b91a344971015b3669994193b6 Mon Sep 17 00:00:00 2001 From: Benjamin Neff Date: Wed, 3 Jul 2019 02:40:12 +0200 Subject: [PATCH 59/81] Bump cucumber-rails --- Gemfile | 2 +- Gemfile.lock | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/Gemfile b/Gemfile index 7cbe17734..70ec4f098 100644 --- a/Gemfile +++ b/Gemfile @@ -307,7 +307,7 @@ group :development, :test do gem "rspec-rails", "3.8.2" # Cucumber (integration tests) - gem "cucumber-rails", "1.6.0", require: false + gem "cucumber-rails", "1.7.0", require: false # Jasmine (client side application tests (JS)) gem "jasmine", "3.3.0" diff --git a/Gemfile.lock b/Gemfile.lock index f18f22ece..daae27299 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -65,7 +65,7 @@ GEM attr_required (1.0.1) autoprefixer-rails (8.6.5) execjs - backports (3.12.0) + backports (3.15.0) bcrypt (3.1.12) bindata (2.4.4) bootstrap-sass (3.4.1) @@ -156,12 +156,12 @@ GEM cucumber-tag_expressions (~> 1.1.0) gherkin (~> 5.0) cucumber-expressions (6.0.1) - cucumber-rails (1.6.0) - capybara (>= 1.1.2, < 4) + cucumber-rails (1.7.0) + capybara (>= 2.3.0, < 4) cucumber (>= 3.0.2, < 4) mime-types (>= 1.17, < 4) nokogiri (~> 1.8) - railties (>= 4, < 6) + railties (>= 4.2, < 7) cucumber-tag_expressions (1.1.1) cucumber-wire (0.0.1) database_cleaner (1.7.0) @@ -597,7 +597,7 @@ GEM ffi (~> 1.0) redcarpet (3.4.0) redis (3.3.5) - regexp_parser (1.3.0) + regexp_parser (1.5.1) request_store (1.4.1) rack (>= 1.4) responders (2.4.1) @@ -794,7 +794,7 @@ DEPENDENCIES configurate (= 0.3.1) coveralls (= 0.8.23) cucumber-api-steps (= 0.14) - cucumber-rails (= 1.6.0) + cucumber-rails (= 1.7.0) database_cleaner (= 1.7.0) devise (= 4.6.1) devise-two-factor (= 3.0.3) From 1e2e06426835f2275dd27348006991f7d1773f2a Mon Sep 17 00:00:00 2001 From: Benjamin Neff Date: Wed, 3 Jul 2019 02:47:03 +0200 Subject: [PATCH 60/81] Bump jasmine --- Gemfile | 2 +- Gemfile.lock | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Gemfile b/Gemfile index 70ec4f098..0725b3057 100644 --- a/Gemfile +++ b/Gemfile @@ -310,7 +310,7 @@ group :development, :test do gem "cucumber-rails", "1.7.0", require: false # Jasmine (client side application tests (JS)) - gem "jasmine", "3.3.0" + gem "jasmine", "3.4.0" gem "jasmine-jquery-rails", "2.0.3" gem "rails-assets-jasmine-ajax", "3.4.0", source: "https://rails-assets.org" gem "sinon-rails", "1.15.0" diff --git a/Gemfile.lock b/Gemfile.lock index daae27299..e19fa764c 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -332,12 +332,12 @@ GEM railties (>= 3.0.0) ipaddress (0.8.3) jaro_winkler (1.5.3) - jasmine (3.3.0) - jasmine-core (~> 3.3.0) + jasmine (3.4.0) + jasmine-core (~> 3.4.0) phantomjs rack (>= 1.2.1) rake - jasmine-core (3.3.0) + jasmine-core (3.4.0) jasmine-jquery-rails (2.0.3) jquery-rails (4.3.5) rails-dom-testing (>= 1, < 3) @@ -543,7 +543,7 @@ GEM rails-assets-favico.js (0.3.10) rails-assets-fine-uploader (5.13.0) rails-assets-highlightjs (9.12.0) - rails-assets-jasmine (3.3.0) + rails-assets-jasmine (3.4.0) rails-assets-jasmine-ajax (3.4.0) rails-assets-jasmine (~> 3) rails-assets-jquery (3.4.1) @@ -821,7 +821,7 @@ DEPENDENCIES handlebars_assets (= 0.23.4) http_accept_language (= 2.1.1) i18n-inflector-rails (= 1.0.7) - jasmine (= 3.3.0) + jasmine (= 3.4.0) jasmine-jquery-rails (= 2.0.3) jquery-rails (= 4.3.5) js-routes (= 1.4.7) From cde29af5451a835d5a7fe6564b9014335199da19 Mon Sep 17 00:00:00 2001 From: Benjamin Neff Date: Wed, 3 Jul 2019 02:48:04 +0200 Subject: [PATCH 61/81] Bump rails-assets-jasmine-ajax --- Gemfile | 2 +- Gemfile.lock | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Gemfile b/Gemfile index 0725b3057..b5188789a 100644 --- a/Gemfile +++ b/Gemfile @@ -312,7 +312,7 @@ group :development, :test do # Jasmine (client side application tests (JS)) gem "jasmine", "3.4.0" gem "jasmine-jquery-rails", "2.0.3" - gem "rails-assets-jasmine-ajax", "3.4.0", source: "https://rails-assets.org" + gem "rails-assets-jasmine-ajax", "4.0.0", source: "https://rails-assets.org" gem "sinon-rails", "1.15.0" # For `assigns` in controller specs diff --git a/Gemfile.lock b/Gemfile.lock index e19fa764c..f5abd625f 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -544,7 +544,7 @@ GEM rails-assets-fine-uploader (5.13.0) rails-assets-highlightjs (9.12.0) rails-assets-jasmine (3.4.0) - rails-assets-jasmine-ajax (3.4.0) + rails-assets-jasmine-ajax (4.0.0) rails-assets-jasmine (~> 3) rails-assets-jquery (3.4.1) rails-assets-jquery-colorbox (1.6.4) @@ -867,7 +867,7 @@ DEPENDENCIES rails-assets-diaspora_jsxc (= 0.1.5.develop.7)! rails-assets-fine-uploader (= 5.13.0)! rails-assets-highlightjs (= 9.12.0)! - rails-assets-jasmine-ajax (= 3.4.0)! + rails-assets-jasmine-ajax (= 4.0.0)! rails-assets-jquery (= 3.4.1)! rails-assets-jquery-placeholder (= 2.3.1)! rails-assets-jquery-textchange (= 0.2.3)! From 2503934a04774b52039f2cc82e64c2a6a86af357 Mon Sep 17 00:00:00 2001 From: Benjamin Neff Date: Wed, 3 Jul 2019 02:53:42 +0200 Subject: [PATCH 62/81] Bump fabrication --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index f5abd625f..482a4169c 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -220,7 +220,7 @@ GEM kostya-sigar (~> 2.0.0) state_machines thor - fabrication (2.20.1) + fabrication (2.20.2) factory_girl (4.8.0) activesupport (>= 3.0.0) factory_girl_rails (4.8.0) From 4b921816eb06bc5c5143e1989af31de5f2af12f2 Mon Sep 17 00:00:00 2001 From: Benjamin Neff Date: Wed, 3 Jul 2019 02:54:50 +0200 Subject: [PATCH 63/81] Bump ffi --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index 482a4169c..1b308993a 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -233,7 +233,7 @@ GEM http-cookie (~> 1.0.0) faraday_middleware (0.13.1) faraday (>= 0.7.4, < 1.0) - ffi (1.10.0) + ffi (1.11.1) fixture_builder (0.5.2.rc3) activerecord (>= 2) activesupport (>= 2) From 5278ae6a9628c3dd9a070d8ce67b8c658e571b3b Mon Sep 17 00:00:00 2001 From: Benjamin Neff Date: Wed, 3 Jul 2019 02:57:25 +0200 Subject: [PATCH 64/81] Bump fugit --- Gemfile.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 1b308993a..6d28c64df 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -208,7 +208,7 @@ GEM execjs multi_json (>= 1.3) rake - et-orbi (1.1.7) + et-orbi (1.2.1) tzinfo ethon (0.12.0) ffi (>= 1.3.0) @@ -255,8 +255,8 @@ GEM fog-core nokogiri (>= 1.5.11, < 2.0.0) formatador (0.2.5) - fugit (1.1.8) - et-orbi (~> 1.1, >= 1.1.7) + fugit (1.2.2) + et-orbi (~> 1.1, >= 1.1.8) raabro (~> 1.1) fuubar (2.4.0) rspec-core (~> 3.0) From b654ca7f82fd3a56a44d0cd163e848c87497bcc7 Mon Sep 17 00:00:00 2001 From: Benjamin Neff Date: Wed, 3 Jul 2019 02:59:18 +0200 Subject: [PATCH 65/81] Bump rails-assets-bootstrap --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index 6d28c64df..1d873dd4a 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -526,7 +526,7 @@ GEM rails-assets-backbone (1.3.3) rails-assets-underscore (>= 1.8.3) rails-assets-blueimp-gallery (2.33.0) - rails-assets-bootstrap (3.3.7) + rails-assets-bootstrap (3.4.1) rails-assets-jquery (>= 1.9.1, < 4) rails-assets-bootstrap-markdown (2.10.0) rails-assets-bootstrap (~> 3) From 4b2414c9eb093c86ac874314de3cb0e86fe9c875 Mon Sep 17 00:00:00 2001 From: Benjamin Neff Date: Wed, 3 Jul 2019 03:00:42 +0200 Subject: [PATCH 66/81] Bump rspec-expectations and rspec-mocks --- Gemfile.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 1d873dd4a..72f797cca 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -612,11 +612,11 @@ GEM rspec-mocks (~> 3.8.0) rspec-core (3.8.2) rspec-support (~> 3.8.0) - rspec-expectations (3.8.2) + rspec-expectations (3.8.4) diff-lcs (>= 1.2.0, < 2.0) rspec-support (~> 3.8.0) rspec-json_expectations (2.2.0) - rspec-mocks (3.8.0) + rspec-mocks (3.8.1) diff-lcs (>= 1.2.0, < 2.0) rspec-support (~> 3.8.0) rspec-rails (3.8.2) From 6ede2ade7b89aa4d181f10c31fd4d83ea4076159 Mon Sep 17 00:00:00 2001 From: Benjamin Neff Date: Wed, 3 Jul 2019 03:01:38 +0200 Subject: [PATCH 67/81] Bump bcrypt --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index 72f797cca..e35403b5f 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -66,7 +66,7 @@ GEM autoprefixer-rails (8.6.5) execjs backports (3.15.0) - bcrypt (3.1.12) + bcrypt (3.1.13) bindata (2.4.4) bootstrap-sass (3.4.1) autoprefixer-rails (>= 5.2.1) From 18d6d39c625d457c2cf1ee605820de4bd3c42c0c Mon Sep 17 00:00:00 2001 From: Benjamin Neff Date: Wed, 3 Jul 2019 03:02:17 +0200 Subject: [PATCH 68/81] Bump jwt --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index e35403b5f..abd274995 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -362,7 +362,7 @@ GEM jsonpath (1.0.1) multi_json to_regexp (~> 0.2.1) - jwt (2.1.0) + jwt (2.2.1) kgio (2.11.2) kostya-sigar (2.0.6) leaflet-rails (1.5.1) From 2b8cc070f27271e464734da64c8b522c85b3e7ca Mon Sep 17 00:00:00 2001 From: Benjamin Neff Date: Wed, 3 Jul 2019 03:03:07 +0200 Subject: [PATCH 69/81] Bump jsonpath --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index abd274995..b3e006112 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -359,7 +359,7 @@ GEM json-schema-rspec (0.0.4) json-schema (~> 2.5) rspec - jsonpath (1.0.1) + jsonpath (1.0.4) multi_json to_regexp (~> 0.2.1) jwt (2.2.1) From 68234fc91f783c0a3eb4f9c5e8a81b408a95c3aa Mon Sep 17 00:00:00 2001 From: Benjamin Neff Date: Wed, 3 Jul 2019 03:03:46 +0200 Subject: [PATCH 70/81] Bump macaddr --- Gemfile.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index b3e006112..e05d0a4d2 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -381,8 +381,8 @@ GEM crass (~> 1.0.2) nokogiri (>= 1.5.9) lumberjack (1.0.13) - macaddr (1.7.1) - systemu (~> 2.6.2) + macaddr (1.7.2) + systemu (~> 2.6.5) mail (2.7.1) mini_mime (>= 0.1.1) markdown-it-html5-embed (1.0.0) From 397dbdbee84182094c71f67ab1082c22a4166ac9 Mon Sep 17 00:00:00 2001 From: Benjamin Neff Date: Wed, 3 Jul 2019 03:04:30 +0200 Subject: [PATCH 71/81] Bump unf_ext closes #8042 --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index e05d0a4d2..67acf8a3f 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -737,7 +737,7 @@ GEM execjs (>= 0.3.0, < 3) unf (0.1.4) unf_ext - unf_ext (0.0.7.5) + unf_ext (0.0.7.6) unicode-display_width (1.6.0) unicorn (5.5.1) kgio (~> 2.6) From df4e79b842fa16b370c8c4b07b82bdd328f3ef7e Mon Sep 17 00:00:00 2001 From: Benjamin Neff Date: Tue, 2 Jul 2019 02:37:02 +0200 Subject: [PATCH 72/81] Cleanup pending photos which were never posted with cronjob Only delete photos older than a day, so we don't delete photos for posts which were uploaded 10 minutes ago and the author is still writing the post for it. closes #8041 --- Changelog.md | 1 + app/workers/cleanup_pending_photos.rb | 11 ++++++++ config/initializers/sidekiq_scheduled.rb | 5 ++++ spec/workers/cleanup_pending_photos_spec.rb | 31 +++++++++++++++++++++ 4 files changed, 48 insertions(+) create mode 100644 app/workers/cleanup_pending_photos.rb create mode 100644 spec/workers/cleanup_pending_photos_spec.rb diff --git a/Changelog.md b/Changelog.md index ffc4bb5f3..1f18982b5 100644 --- a/Changelog.md +++ b/Changelog.md @@ -5,6 +5,7 @@ ## Bug fixes ## Features +* Add cronjob to cleanup pending photos which were never posted [#8041](https://github.com/diaspora/diaspora/pull/8041) # 0.7.12.0 diff --git a/app/workers/cleanup_pending_photos.rb b/app/workers/cleanup_pending_photos.rb new file mode 100644 index 000000000..e7cabf54b --- /dev/null +++ b/app/workers/cleanup_pending_photos.rb @@ -0,0 +1,11 @@ +# frozen_string_literal: true + +module Workers + class CleanupPendingPhotos < Base + sidekiq_options queue: :low + + def perform + Photo.where(pending: true).where("created_at < ?", 1.day.ago).destroy_all + end + end +end diff --git a/config/initializers/sidekiq_scheduled.rb b/config/initializers/sidekiq_scheduled.rb index ac9140e38..46fc92adb 100644 --- a/config/initializers/sidekiq_scheduled.rb +++ b/config/initializers/sidekiq_scheduled.rb @@ -29,6 +29,11 @@ def default_job_config "class": "Workers::CleanupOldExports" }, + cleanup_pending_photos: { + "cron": "#{random_minute.call} #{random_hour.call} * * *", + "class": "Workers::CleanupPendingPhotos" + }, + queue_users_for_removal: { "cron": "#{random_minute.call} #{random_hour.call} * * *", "class": "Workers::QueueUsersForRemoval" diff --git a/spec/workers/cleanup_pending_photos_spec.rb b/spec/workers/cleanup_pending_photos_spec.rb new file mode 100644 index 000000000..1a92cac96 --- /dev/null +++ b/spec/workers/cleanup_pending_photos_spec.rb @@ -0,0 +1,31 @@ +# frozen_string_literal: true + +describe Workers::CleanupPendingPhotos do + let!(:photo) { FactoryGirl.create(:photo, author: alice.person, pending: true) } + + it "removes pending photos" do + Timecop.travel(25.hours) do + Workers::CleanupPendingPhotos.new.perform + expect(Photo).not_to exist(photo.id) + end + end + + it "does not remove pending photos newer than one day" do + Timecop.travel(1.hour) do + Workers::CleanupPendingPhotos.new.perform + expect(Photo).to exist(photo.id) + end + end + + it "does not remove posted photos" do + StatusMessageCreationService.new(alice).create( + status_message: {text: "Post with photo"}, + public: true, + photos: [photo.id] + ) + Timecop.travel(25.hours) do + Workers::CleanupPendingPhotos.new.perform + expect(Photo).to exist(photo.id) + end + end +end From b42c9896bc62e17be267e682f280f39877108e53 Mon Sep 17 00:00:00 2001 From: Benjamin Neff Date: Thu, 4 Jul 2019 01:47:55 +0200 Subject: [PATCH 73/81] Migrate pending profile photos and fix upload to unpend profile photos fixes #8043 closes #8044 --- app/controllers/photos_controller.rb | 7 +------ db/migrate/20190703231700_fix_pending_profile_photos.rb | 9 +++++++++ spec/controllers/photos_controller_spec.rb | 8 +++++--- 3 files changed, 15 insertions(+), 9 deletions(-) create mode 100644 db/migrate/20190703231700_fix_pending_profile_photos.rb diff --git a/app/controllers/photos_controller.rb b/app/controllers/photos_controller.rb index 1f8a37182..52d44732f 100644 --- a/app/controllers/photos_controller.rb +++ b/app/controllers/photos_controller.rb @@ -147,12 +147,7 @@ class PhotosController < ApplicationController current_user.dispatch_post(@photo, to: photo_params[:aspect_ids]) end - if photo_params[:set_profile_photo] - profile_params = {:image_url => @photo.url(:thumb_large), - :image_url_medium => @photo.url(:thumb_medium), - :image_url_small => @photo.url(:thumb_small)} - current_user.update_profile(profile_params) - end + current_user.update_profile(photo: @photo) if photo_params[:set_profile_photo] respond_to do |format| format.json{ render(:layout => false , :json => {"success" => true, "data" => @photo}.to_json )} diff --git a/db/migrate/20190703231700_fix_pending_profile_photos.rb b/db/migrate/20190703231700_fix_pending_profile_photos.rb new file mode 100644 index 000000000..51b3a1512 --- /dev/null +++ b/db/migrate/20190703231700_fix_pending_profile_photos.rb @@ -0,0 +1,9 @@ +# frozen_string_literal: true + +class FixPendingProfilePhotos < ActiveRecord::Migration[5.1] + def up + Photo.where(pending: true).each do |photo| + photo.update(pending: false) if Profile.where(image_url: photo.url(:thumb_large)).exists? + end + end +end diff --git a/spec/controllers/photos_controller_spec.rb b/spec/controllers/photos_controller_spec.rb index 424eeb235..f9f17762e 100644 --- a/spec/controllers/photos_controller_spec.rb +++ b/spec/controllers/photos_controller_spec.rb @@ -44,7 +44,7 @@ describe PhotosController, :type => :controller do describe '#create' do before do allow(@controller).to receive(:file_handler).and_return(uploaded_photo) - @params = {:photo => {:user_file => uploaded_photo, :aspect_ids => "all"} } + @params = {photo: {user_file: uploaded_photo, aspect_ids: "all", pending: true}} end it "creates a photo" do @@ -67,11 +67,13 @@ describe PhotosController, :type => :controller do expect(Photo.last.author).to eq(alice.person) end - it 'can set the photo as the profile photo' do + it "can set the photo as the profile photo and unpends the photo" do old_url = alice.person.profile.image_url @params[:photo][:set_profile_photo] = true post :create, params: @params - expect(alice.reload.person.profile.image_url).not_to eq(old_url) + new_url = alice.reload.person.profile.image_url + expect(new_url).not_to eq(old_url) + expect(Photo.find_by(remote_photo_name: new_url.rpartition("_").last).pending).to be_falsey end end From 593614aef1fa16e2986a2e7b70d212f82c057991 Mon Sep 17 00:00:00 2001 From: Benjamin Neff Date: Sat, 6 Jul 2019 22:43:41 +0200 Subject: [PATCH 74/81] Bump fuubar Version 2.4.0 was yanked ... why do people do such things? m( https://github.com/thekompanee/fuubar/issues/111 --- Gemfile | 2 +- Gemfile.lock | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Gemfile b/Gemfile index b5188789a..0b64155aa 100644 --- a/Gemfile +++ b/Gemfile @@ -277,7 +277,7 @@ group :test do # RSpec (unit tests, some integration tests) gem "fixture_builder", "0.5.2.rc3" - gem "fuubar", "2.4.0" + gem "fuubar", "2.4.1" gem "json-schema-rspec", "0.0.4" gem "rspec-json_expectations", "~> 2.1" diff --git a/Gemfile.lock b/Gemfile.lock index 67acf8a3f..01b6acdcd 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -258,7 +258,7 @@ GEM fugit (1.2.2) et-orbi (~> 1.1, >= 1.1.8) raabro (~> 1.1) - fuubar (2.4.0) + fuubar (2.4.1) rspec-core (~> 3.0) ruby-progressbar (~> 1.4) get_process_mem (0.2.3) @@ -811,7 +811,7 @@ DEPENDENCIES faraday_middleware (= 0.13.1) fixture_builder (= 0.5.2.rc3) fog-aws (= 3.5.1) - fuubar (= 2.4.0) + fuubar (= 2.4.1) gon (= 6.2.1) guard (= 2.15.0) guard-rspec (= 4.7.3) From 6a7e937d909f96297e6b8e2635b290d665144ce1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonne=20Ha=C3=9F?= Date: Sun, 25 Aug 2019 19:45:18 +0200 Subject: [PATCH 75/81] Update open_graph_reader to 0.7.0 This should fix undefined method `og' for # for sites that have OpenGraph tags of other namespaces but no actual OpenGraph core tags --- Gemfile | 2 +- Gemfile.lock | 4 ++-- features/support/webmock.rb | 2 +- spec/models/open_graph_cache_spec.rb | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Gemfile b/Gemfile index 0b64155aa..87a3965d4 100644 --- a/Gemfile +++ b/Gemfile @@ -143,7 +143,7 @@ gem "leaflet-rails", "1.5.1" # Parsing gem "nokogiri", "1.10.3" -gem "open_graph_reader", "0.6.2" # also update User-Agent in features/support/webmock.rb +gem "open_graph_reader", "0.7.0" # also update User-Agent in features/support/webmock.rb gem "redcarpet", "3.4.0" gem "ruby-oembed", "0.12.0" gem "twitter-text", "1.14.7" diff --git a/Gemfile.lock b/Gemfile.lock index 01b6acdcd..a8c30bee3 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -439,7 +439,7 @@ GEM rack omniauth-wordpress (0.2.2) omniauth-oauth2 (>= 1.1.0) - open_graph_reader (0.6.2) + open_graph_reader (0.7.0) faraday (>= 0.9.0) nokogiri (~> 1.6) openid_connect (1.1.8) @@ -842,7 +842,7 @@ DEPENDENCIES omniauth-tumblr (= 1.2) omniauth-twitter (= 1.4.0) omniauth-wordpress (= 0.2.2) - open_graph_reader (= 0.6.2) + open_graph_reader (= 0.7.0) openid_connect (= 1.1.8) pg (= 1.1.4) poltergeist (= 1.18.1) diff --git a/features/support/webmock.rb b/features/support/webmock.rb index f6d4726bf..cce1de904 100644 --- a/features/support/webmock.rb +++ b/features/support/webmock.rb @@ -7,7 +7,7 @@ Before do stub_request(:head, /.+/).with( headers: { "Accept" => "text/html", - "User-Agent" => "OpenGraphReader/0.6.2 (+https://github.com/jhass/open_graph_reader)" + "User-Agent" => "OpenGraphReader/0.7.0 (+https://github.com/jhass/open_graph_reader)" } ).to_return(status: 200, body: "", headers: {"Content-Type" => "text/plain"}) end diff --git a/spec/models/open_graph_cache_spec.rb b/spec/models/open_graph_cache_spec.rb index 7bd0c81a4..799f726ac 100644 --- a/spec/models/open_graph_cache_spec.rb +++ b/spec/models/open_graph_cache_spec.rb @@ -63,7 +63,7 @@ describe OpenGraphCache, type: :model do stub_request(:head, "http:///wetter.com") .with(headers: { "Accept" => "text/html", - "User-Agent" => "OpenGraphReader/0.6.2 (+https://github.com/jhass/open_graph_reader)" + "User-Agent" => "OpenGraphReader/0.7.0 (+https://github.com/jhass/open_graph_reader)" }) .to_return(status: 200, body: "", headers: {"Set-Cookie" => "Dabgroup=A;path=/;Expires=Thu, 23 May 2019 16:12:01 GMT;httpOnly"}) From 5b09e9d38d772663c2d5b9bca62f5fa2249b5ae4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonne=20Ha=C3=9F?= Date: Fri, 30 Aug 2019 12:41:18 +0200 Subject: [PATCH 76/81] install libidn-dev on travis --- .travis.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.travis.yml b/.travis.yml index 6df40becc..a998fd3e2 100644 --- a/.travis.yml +++ b/.travis.yml @@ -17,6 +17,10 @@ cache: - app/assets/images - tmp/cache/assets +addons: + apt: + packages: libidn11-dev + branches: only: - 'master' From 6937fa13e5c6b3c06101c107ceba4af22482b059 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonne=20Ha=C3=9F?= Date: Fri, 30 Aug 2019 13:51:16 +0200 Subject: [PATCH 77/81] travis: ensure postgresql and mysql are available --- .travis.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.travis.yml b/.travis.yml index a998fd3e2..22e924937 100644 --- a/.travis.yml +++ b/.travis.yml @@ -21,6 +21,10 @@ addons: apt: packages: libidn11-dev +services: + - postgresql + - mysql + branches: only: - 'master' From ba16185b8e6062346a0bf54975929632ed4c667d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonne=20Ha=C3=9F?= Date: Fri, 30 Aug 2019 15:28:14 +0200 Subject: [PATCH 78/81] install ghostscript on travis closes #8049 --- .travis.yml | 4 +++- Changelog.md | 1 + 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 22e924937..e32431bdd 100644 --- a/.travis.yml +++ b/.travis.yml @@ -19,7 +19,9 @@ cache: addons: apt: - packages: libidn11-dev + packages: + - libidn11-dev + - ghostscript services: - postgresql diff --git a/Changelog.md b/Changelog.md index 1f18982b5..8b37f409b 100644 --- a/Changelog.md +++ b/Changelog.md @@ -3,6 +3,7 @@ ## Refactor ## Bug fixes +* Fix error while trying to fetch some sites with invalid OpenGraph data [#8049](https://github.com/diaspora/diaspora/pull/8049) ## Features * Add cronjob to cleanup pending photos which were never posted [#8041](https://github.com/diaspora/diaspora/pull/8041) From 862fa38f8b4b4a2e96f1919807f20c33b5399d9e Mon Sep 17 00:00:00 2001 From: Dennis Schubert Date: Fri, 18 Oct 2019 23:14:14 +0200 Subject: [PATCH 79/81] Remove the JSXC/Prosody integration. As per discussion on https://discourse.diasporafoundation.org/t/removing-diaspora-s-current-chat-integration/2718, nobody raised serious concerns or objections. Given future plans, we do not think having an unfinished implementation of something that likely will not get finished in the current form is worth it. So let's get rid of it. --- .eslintrc | 1 - .gitignore | 5 -- Changelog.md | 6 ++ Gemfile | 4 -- Gemfile.lock | 16 ----- app/assets/config/manifest.js | 1 - app/assets/javascripts/app/pages/contacts.js | 18 ------ app/assets/javascripts/app/views/help_view.js | 59 +++++------------- app/assets/javascripts/jsxc.js | 50 --------------- app/assets/stylesheets/_application.scss | 2 - app/assets/stylesheets/chat.scss | 14 ----- app/assets/stylesheets/contacts.scss | 3 - app/assets/stylesheets/help.scss | 12 ---- app/assets/templates/faq_chat_tpl.jst.hbs | 6 -- app/assets/templates/help_tpl.jst.hbs | 6 -- app/controllers/application_controller.rb | 1 - app/controllers/aspects_controller.rb | 10 +-- app/helpers/jsxc_helper.rb | 15 ----- app/presenters/node_info_presenter.rb | 5 -- app/serializers/export/aspect_serializer.rb | 2 +- app/views/contacts/_header.html.haml | 7 --- app/views/streams/main_stream.html.haml | 5 -- config/certs/README | 7 --- config/defaults.yml | 15 ----- config/diaspora.yml.example | 62 ------------------- config/eye.rb | 9 --- config/initializers/prosody.rb | 24 ------- config/initializers/secure_headers.rb | 8 --- config/locales/diaspora/en.yml | 5 -- config/locales/javascript/javascript.en.yml | 2 - config/routes.rb | 1 - db/migrate/20191018014242_remove_chat.rb | 10 +++ lib/archive_importer.rb | 2 +- lib/schemas/archive-format.json | 3 +- script/server | 16 ----- .../jasmine_fixtures/contacts_spec.rb | 1 - spec/helpers/jsxc_helper_spec.rb | 21 ------- spec/integration/exporter_spec.rb | 6 +- spec/integration/migration_service_spec.rb | 4 +- spec/javascripts/app/pages/contacts_spec.js | 23 ------- spec/javascripts/app/views/help_view_spec.js | 27 -------- .../javascripts/jasmine_helpers/SpecHelper.js | 1 - spec/lib/archive_importer_spec.rb | 1 - spec/presenters/node_info_presenter_spec.rb | 12 ---- .../export/aspect_serializer_spec.rb | 3 +- 45 files changed, 39 insertions(+), 472 deletions(-) delete mode 100644 app/assets/javascripts/jsxc.js delete mode 100644 app/assets/stylesheets/chat.scss delete mode 100644 app/assets/templates/faq_chat_tpl.jst.hbs delete mode 100644 app/helpers/jsxc_helper.rb delete mode 100644 config/certs/README delete mode 100644 config/initializers/prosody.rb create mode 100644 db/migrate/20191018014242_remove_chat.rb delete mode 100644 spec/helpers/jsxc_helper_spec.rb diff --git a/.eslintrc b/.eslintrc index fd80c6478..5a45c4f49 100644 --- a/.eslintrc +++ b/.eslintrc @@ -16,7 +16,6 @@ "Handlebars": false, "HandlebarsTemplates": false, "ImagePaths": false, - "jsxc": false, "L": false, "OSM": false, "PerfectScrollbar": false, diff --git a/.gitignore b/.gitignore index 65d3c2649..c18b96c64 100644 --- a/.gitignore +++ b/.gitignore @@ -1,8 +1,3 @@ -# XMPP certificates, keys and user data -config/certs/*.crt -config/certs/*.key -config/prosody.cfg.lua - # Trademark sillyness app/views/home/_show.* app/views/terms/terms.* diff --git a/Changelog.md b/Changelog.md index f3c543662..73b2e9a24 100644 --- a/Changelog.md +++ b/Changelog.md @@ -1,5 +1,11 @@ # 0.8.0.0 +## The chat integration has been removed + +After [a discussion with our community on Discourse](https://discourse.diasporafoundation.org/t/2718), we decided to remove the pieces of XMPP chat integration that were put in place a while ago. When we first added the chat support, we merged the implementation in an unfinished state in the hopes that the open issues will be addressed eventually, and the implementation would end up more polished. This ended up not being the case. After careful consideration and discussion, we did not manage to come up with clear reasons why we need a chat implementation, so we decided that the best way forward would be to remove it. + +Although the chat was never enabled per default and was marked as experimental, some production pods did set up the integration and offered an XMPP service to their users. After this release, diaspora\* will no longer contain a chat applet, so users will no longer be able to use the webchat inside diaspora\*. The existing module that is used to enable users to authenticate to Prosody using their diaspora\* credentials will continue to work, but contact list synchronization might not work without further changes to the Prosody module, which is developed independently from this project. + ## Refactor * Add bootstrapping for using ECMAScript 6 with automatic transpiling for compatibility [#7581](https://github.com/diaspora/diaspora/pull/7581) * Remove backporting of mention syntax [#7788](https://github.com/diaspora/diaspora/pull/7788) diff --git a/Gemfile b/Gemfile index 5be4afe9e..fc1062884 100644 --- a/Gemfile +++ b/Gemfile @@ -175,10 +175,6 @@ gem "openid_connect", "1.1.8" gem "active_model_serializers", "0.9.7" -# XMPP chat dependencies -gem "diaspora-prosody-config", "0.0.7" -gem "rails-assets-diaspora_jsxc", "0.1.5.develop.7", source: "https://rails-assets.org" - # Tags gem "acts-as-taggable-on", "6.0.0" diff --git a/Gemfile.lock b/Gemfile.lock index 76bb7b357..56cd3defe 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -184,7 +184,6 @@ GEM devise_lastseenable (0.0.6) devise rails (>= 3.0.4) - diaspora-prosody-config (0.0.7) diaspora_federation (0.2.6) faraday (>= 0.9.0, < 0.16.0) faraday_middleware (>= 0.10.0, < 0.14.0) @@ -538,31 +537,18 @@ GEM rails-assets-corejs-typeahead (1.2.1) rails-assets-jquery (>= 1.11) rails-assets-cropperjs (1.4.3) - rails-assets-diaspora_jsxc (0.1.5.develop.7) - rails-assets-emojione (~> 2.0.1) - rails-assets-favico.js (>= 0.3.10, < 0.4) - rails-assets-jquery-colorbox (~> 1.6.3) - rails-assets-jquery-fullscreen-plugin (~> 0.5.0) - rails-assets-jquery.slimscroll (~> 1.3.6) - rails-assets-jquery.ui (~> 1.11.4) - rails-assets-emojione (2.0.1) - rails-assets-favico.js (0.3.10) rails-assets-fine-uploader (5.13.0) rails-assets-highlightjs (9.12.0) rails-assets-jasmine (3.4.0) rails-assets-jasmine-ajax (4.0.0) rails-assets-jasmine (~> 3) rails-assets-jquery (3.4.1) - rails-assets-jquery-colorbox (1.6.4) - rails-assets-jquery (>= 1.3.2) - rails-assets-jquery-fullscreen-plugin (0.5.0) rails-assets-jquery-placeholder (2.3.1) rails-assets-jquery (>= 1.6) rails-assets-jquery-textchange (0.2.3) rails-assets-jquery rails-assets-jquery.are-you-sure (1.9.0) rails-assets-jquery (>= 1.4.2) - rails-assets-jquery.slimscroll (1.3.8) rails-assets-jquery.ui (1.11.4) rails-assets-jquery (>= 1.6) rails-assets-markdown-it--markdown-it-for-inline (0.1.1) @@ -812,7 +798,6 @@ DEPENDENCIES devise (= 4.6.1) devise-two-factor (= 3.0.3) devise_lastseenable (= 0.0.6) - diaspora-prosody-config (= 0.0.7) diaspora_federation-json_schema (= 0.2.6) diaspora_federation-rails (= 0.2.6) diaspora_federation-test (= 0.2.6) @@ -878,7 +863,6 @@ DEPENDENCIES rails-assets-bootstrap-markdown (= 2.10.0)! rails-assets-corejs-typeahead (= 1.2.1)! rails-assets-cropperjs (= 1.4.3)! - rails-assets-diaspora_jsxc (= 0.1.5.develop.7)! rails-assets-fine-uploader (= 5.13.0)! rails-assets-highlightjs (= 9.12.0)! rails-assets-jasmine-ajax (= 4.0.0)! diff --git a/app/assets/config/manifest.js b/app/assets/config/manifest.js index fc75a31f6..04515b804 100644 --- a/app/assets/config/manifest.js +++ b/app/assets/config/manifest.js @@ -2,7 +2,6 @@ //= link jquery3.js //= link jquery_ujs.js //= link main.js -//= link jsxc.js //= link bookmarklet.js //= link mobile/bookmarklet.js //= link mobile/mobile.js diff --git a/app/assets/javascripts/app/pages/contacts.js b/app/assets/javascripts/app/pages/contacts.js index 0035951c0..8c8d34654 100644 --- a/app/assets/javascripts/app/pages/contacts.js +++ b/app/assets/javascripts/app/pages/contacts.js @@ -5,14 +5,12 @@ app.pages.Contacts = Backbone.View.extend({ el: "#contacts_container", events: { - "click #chat_privilege_toggle" : "toggleChatPrivilege", "click #change_aspect_name" : "showAspectNameForm", "click .conversation_button": "showMessageModal", "click .invitations-button": "showInvitationsModal" }, initialize: function(opts) { - this.chatToggle = $("#chat_privilege_toggle i"); this.stream = opts.stream; this.stream.render(); $("#people-stream.contacts .header i").tooltip({"placement": "bottom"}); @@ -27,22 +25,6 @@ app.pages.Contacts = Backbone.View.extend({ this.setupAspectSorting(); }, - toggleChatPrivilege: function() { - if (this.chatToggle.hasClass("enabled")) { - this.chatToggle.tooltip("destroy") - .removeClass("enabled") - .removeAttr("data-original-title") - .attr("title", Diaspora.I18n.t("contacts.aspect_chat_is_not_enabled")) - .tooltip({"placement": "bottom"}); - } else { - this.chatToggle.tooltip("destroy") - .addClass("enabled") - .removeAttr("data-original-title") - .attr("title", Diaspora.I18n.t("contacts.aspect_chat_is_enabled")) - .tooltip({"placement": "bottom"}); - } - }, - showAspectNameForm: function() { $(".header > h3").hide(); var aspectName = $.trim($(".header h3 #aspect_name").text()); diff --git a/app/assets/javascripts/app/views/help_view.js b/app/assets/javascripts/app/views/help_view.js index 24052f09f..619395b6e 100644 --- a/app/assets/javascripts/app/views/help_view.js +++ b/app/assets/javascripts/app/views/help_view.js @@ -9,8 +9,7 @@ app.views.Help = app.views.StaticContentView.extend({ "click .faq-link-sharing": "sharing", "click .faq-link-posts-and-posting": "postsAndPosting", "click .faq-link-tags": "tags", - "click .faq-link-keyboard-shortcuts": "keyboardShortcuts", - "click .faq-link-chat": "chat" + "click .faq-link-keyboard-shortcuts": "keyboardShortcuts" }, initialize : function() { @@ -39,31 +38,22 @@ app.views.Help = app.views.StaticContentView.extend({ } }; - this.CHAT_SUBS = { - add_contact_roster_a: { - toggle_privilege: this.getChatIcons(), - contacts_page: this.linkHtml(Routes.contacts(), Diaspora.I18n.t("chat.contacts_page")) - } - }; - this.data = { - title_header: Diaspora.I18n.t( 'title_header' ), - title_getting_help: Diaspora.I18n.t( 'getting_help.title' ), - title_account_and_data_management: Diaspora.I18n.t( 'account_and_data_management.title' ), - title_aspects: Diaspora.I18n.t( 'aspects.title' ), - title_mentions: Diaspora.I18n.t( 'mentions.title' ), - title_pods: Diaspora.I18n.t( 'pods.title' ), - title_posts_and_posting: Diaspora.I18n.t( 'posts_and_posting.title' ), - title_private_posts: Diaspora.I18n.t( 'private_posts.title' ), - title_public_posts: Diaspora.I18n.t( 'public_posts.title' ), - title_resharing_posts: Diaspora.I18n.t( 'resharing_posts.title' ), + title_header: Diaspora.I18n.t("title_header"), + title_getting_help: Diaspora.I18n.t("getting_help.title"), + title_account_and_data_management: Diaspora.I18n.t("account_and_data_management.title"), + title_aspects: Diaspora.I18n.t("aspects.title"), + title_mentions: Diaspora.I18n.t("mentions.title"), + title_pods: Diaspora.I18n.t("pods.title"), + title_posts_and_posting: Diaspora.I18n.t("posts_and_posting.title"), + title_private_posts: Diaspora.I18n.t("private_posts.title"), + title_public_posts: Diaspora.I18n.t("public_posts.title"), + title_resharing_posts: Diaspora.I18n.t("resharing_posts.title"), title_profile: Diaspora.I18n.t("profile.title"), - title_sharing: Diaspora.I18n.t( 'sharing.title' ), - title_tags: Diaspora.I18n.t( 'tags.title' ), - title_keyboard_shortcuts: Diaspora.I18n.t( 'keyboard_shortcuts.title' ), - title_miscellaneous: Diaspora.I18n.t( 'miscellaneous.title' ), - title_chat: Diaspora.I18n.t( 'chat.title' ), - chat_enabled: this.chatEnabled() + title_sharing: Diaspora.I18n.t("sharing.title"), + title_tags: Diaspora.I18n.t("tags.title"), + title_keyboard_shortcuts: Diaspora.I18n.t("keyboard_shortcuts.title"), + title_miscellaneous: Diaspora.I18n.t("miscellaneous.title") }; return this; @@ -199,27 +189,8 @@ app.views.Help = app.views.StaticContentView.extend({ e.preventDefault(); }, - chat: function(e){ - this.renderStaticSection("chat", "faq_chat", this.CHAT_SUBS); - this.menuClicked(e); - - e.preventDefault(); - }, - linkHtml: function(url, text) { return "" + text + ""; - }, - - chatEnabled: function(){ - return gon.appConfig.chat.enabled; - }, - - getChatIcons: function(){ - return "

" + - " " + - " " + - " " + - "
"; } }); // @license-end diff --git a/app/assets/javascripts/jsxc.js b/app/assets/javascripts/jsxc.js deleted file mode 100644 index 66ed5d622..000000000 --- a/app/assets/javascripts/jsxc.js +++ /dev/null @@ -1,50 +0,0 @@ -//= require emojione -//= require favico.js/favico - -//= require jquery.ui/ui/resizable -//= require jquery.ui/ui/draggable -//= require jquery.slimscroll/jquery.slimscroll -//= require jquery-colorbox -//= require jquery-fullscreen-plugin - -//= require diaspora_jsxc - -// initialize jsxc xmpp client -$(document).ready(function() { - if (app.currentUser.authenticated()) { - $.post("/user/auth_token", null, function(data) { - if (jsxc && data['token']) { - var jid = app.currentUser.get('diaspora_id'); - jsxc.init({ - root: '/assets/diaspora_jsxc', - rosterAppend: 'body', - otr: { - debug: true, - SEND_WHITESPACE_TAG: true, - WHITESPACE_START_AKE: true - }, - onlineHelp: "/help/chat", - priority: { - online: 1, - chat: 1 - }, - displayRosterMinimized: function() { - return false; - }, - xmpp: { - url: $('script#jsxc').data('endpoint'), - username: jid.replace(/@.*?$/g, ''), - domain: jid.replace(/^.*?@/g, ''), - jid: jid, - password: data.token, - resource: 'diaspora-jsxc', - overwrite: true, - onlogin: true - } - }); - } else { - console.error('No token found! Authenticated!?'); - } - }, 'json'); - } -}); diff --git a/app/assets/stylesheets/_application.scss b/app/assets/stylesheets/_application.scss index 2eb0c4810..ae8ca9c06 100644 --- a/app/assets/stylesheets/_application.scss +++ b/app/assets/stylesheets/_application.scss @@ -84,8 +84,6 @@ @import 'stream'; @import 'stream_element'; @import 'comments'; -@import 'diaspora_jsxc'; -@import 'chat'; @import 'markdown-content'; @import 'oembed'; @import 'media-embed'; diff --git a/app/assets/stylesheets/chat.scss b/app/assets/stylesheets/chat.scss deleted file mode 100644 index 8adb9dd52..000000000 --- a/app/assets/stylesheets/chat.scss +++ /dev/null @@ -1,14 +0,0 @@ -body > .container-fluid.chat-roster-shown { - padding-right: 224px; - #back-to-top { right: 244px; } -} -body > .container-fluid.chat-roster-hidden { - #back-to-top { right: 54px; } -} - -// This element is instanciated by JSXC. Does not have to follow naming conventions -// scss-lint:disable IdSelector, SelectorFormat -#jsxc_roster { - top: $navbar-height; -} -// scss-lint:enable IdSelector, SelectorFormat diff --git a/app/assets/stylesheets/contacts.scss b/app/assets/stylesheets/contacts.scss index 8a35dbe48..2773f92d3 100644 --- a/app/assets/stylesheets/contacts.scss +++ b/app/assets/stylesheets/contacts.scss @@ -37,9 +37,6 @@ text-decoration: none; margin-right: 25px; } - #chat_privilege_toggle > .enabled { - color: $text-color-active; - } .contacts-header-icon { font-size: 24.5px; line-height: 40px; diff --git a/app/assets/stylesheets/help.scss b/app/assets/stylesheets/help.scss index c19e09439..f6075d679 100644 --- a/app/assets/stylesheets/help.scss +++ b/app/assets/stylesheets/help.scss @@ -91,18 +91,6 @@ ul#help_nav { border-radius: 0px 0px 4px 4px; background-color: white; padding: 10px 20px; - - div.help-chat-icons{ - text-align: center; - font-size: 50px; - line-height: 70px; - - [class^="entypo-"], [class*="entypo-"] { - color: $text-color-pale; - - &.entypo-chat { color: $text-color-active; } - } - } } } } diff --git a/app/assets/templates/faq_chat_tpl.jst.hbs b/app/assets/templates/faq_chat_tpl.jst.hbs deleted file mode 100644 index fb3633345..000000000 --- a/app/assets/templates/faq_chat_tpl.jst.hbs +++ /dev/null @@ -1,6 +0,0 @@ -
- -

{{ add_contact_roster_q }}

-
-
{{{ add_contact_roster_a }}}
-
\ No newline at end of file diff --git a/app/assets/templates/help_tpl.jst.hbs b/app/assets/templates/help_tpl.jst.hbs index 16dc93075..ee88469e7 100644 --- a/app/assets/templates/help_tpl.jst.hbs +++ b/app/assets/templates/help_tpl.jst.hbs @@ -64,12 +64,6 @@ {{ title_miscellaneous }} {{ title_miscellaneous }} - {{#if chat_enabled }} -
  • - {{ title_chat }} - {{ title_chat }} -
  • - {{/if}} diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 86d763887..c1a16ff94 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -162,7 +162,6 @@ class ApplicationController < ActionController::Base def gon_set_appconfig gon.push(appConfig: { - chat: {enabled: AppConfig.chat.enabled?}, settings: {podname: AppConfig.settings.pod_name}, map: {mapbox: { enabled: AppConfig.map.mapbox.enabled?, diff --git a/app/controllers/aspects_controller.rb b/app/controllers/aspects_controller.rb index b970f7596..40405f175 100644 --- a/app/controllers/aspects_controller.rb +++ b/app/controllers/aspects_controller.rb @@ -76,14 +76,6 @@ class AspectsController < ApplicationController head :no_content end - def toggle_chat_privilege - @aspect = current_user.aspects.where(:id => params[:aspect_id]).first - - @aspect.chat_enabled = !@aspect.chat_enabled - @aspect.save - head :no_content - end - private def connect_person_to_aspect(aspecting_person_id) @@ -97,6 +89,6 @@ class AspectsController < ApplicationController end def aspect_params - params.require(:aspect).permit(:name, :chat_enabled, :order_id) + params.require(:aspect).permit(:name, :order_id) end end diff --git a/app/helpers/jsxc_helper.rb b/app/helpers/jsxc_helper.rb deleted file mode 100644 index d94597d55..000000000 --- a/app/helpers/jsxc_helper.rb +++ /dev/null @@ -1,15 +0,0 @@ -# frozen_string_literal: true - -module JsxcHelper - def get_bosh_endpoint - proto = AppConfig.chat.server.bosh.proto - port = AppConfig.chat.server.bosh.port - bind = AppConfig.chat.server.bosh.bind - host = AppConfig.pod_uri.host - - unless AppConfig.chat.server.bosh.proxy? - return "#{proto}://#{host}:#{port}#{bind}" - end - AppConfig.url_to bind - end -end diff --git a/app/presenters/node_info_presenter.rb b/app/presenters/node_info_presenter.rb index e0c2c579b..f2f1566eb 100644 --- a/app/presenters/node_info_presenter.rb +++ b/app/presenters/node_info_presenter.rb @@ -23,7 +23,6 @@ class NodeInfoPresenter doc.services.outbound = available_services doc.open_registrations = open_registrations? doc.metadata["nodeName"] = name - doc.metadata["xmppChat"] = chat_enabled? doc.metadata["camo"] = camo_config doc.metadata["adminAccount"] = admin_account end @@ -70,10 +69,6 @@ class NodeInfoPresenter AppConfig.settings.enable_registrations? end - def chat_enabled? - AppConfig.chat.enabled? - end - def camo_config { markdown: AppConfig.privacy.camo.proxy_markdown_images?, diff --git a/app/serializers/export/aspect_serializer.rb b/app/serializers/export/aspect_serializer.rb index 938939ad9..478bef3fa 100644 --- a/app/serializers/export/aspect_serializer.rb +++ b/app/serializers/export/aspect_serializer.rb @@ -2,6 +2,6 @@ module Export class AspectSerializer < ActiveModel::Serializer - attributes :name, :chat_enabled + attributes :name end end diff --git a/app/views/contacts/_header.html.haml b/app/views/contacts/_header.html.haml index 4348e0dea..7acc2e93a 100644 --- a/app/views/contacts/_header.html.haml +++ b/app/views/contacts/_header.html.haml @@ -4,13 +4,6 @@ - if @aspect.contacts.size > 0 && @aspect.contacts.size < 20 = start_a_conversation_link(@aspect, @aspect.contacts.size) - -if AppConfig.chat.enabled? - = link_to aspect_toggle_chat_privilege_path(@aspect), id: "chat_privilege_toggle", class: "contacts_button", method: :put, remote: true do - -if @aspect.chat_enabled? - %i.entypo-chat.enabled.contacts-header-icon{title: t("javascripts.contacts.aspect_chat_is_enabled")} - -else - %i.entypo-chat.contacts-header-icon{title: t("javascripts.contacts.aspect_chat_is_not_enabled")} - = link_to @aspect, method: "delete", data: { confirm: t("aspects.edit.confirm_remove_aspect") }, class: "delete contacts_button", id: "delete_aspect" do %i.entypo-trash.contacts-header-icon{title: t("delete")} .pull-right.contact-list-search diff --git a/app/views/streams/main_stream.html.haml b/app/views/streams/main_stream.html.haml index abc6f1f36..f69edd2d3 100644 --- a/app/views/streams/main_stream.html.haml +++ b/app/views/streams/main_stream.html.haml @@ -2,11 +2,6 @@ -# licensed under the Affero General Public License version 3 or later. See -# the COPYRIGHT file. -- content_for :head do - - if AppConfig.chat.enabled? - = javascript_include_tag :jsxc, id: 'jsxc', - data: { endpoint: get_bosh_endpoint } - - if current_user&.getting_started? #welcome-to-diaspora .container-fluid diff --git a/config/certs/README b/config/certs/README deleted file mode 100644 index 2e8573574..000000000 --- a/config/certs/README +++ /dev/null @@ -1,7 +0,0 @@ -If you want to encrypt your chat streams with prosody. -Add to `config/certs` your server certificate and key. - -The domain name should be included in the file name e.g.: - -* example.com.crt -* example.com.key diff --git a/config/defaults.yml b/config/defaults.yml index be7dc1dc1..619c43a0c 100644 --- a/config/defaults.yml +++ b/config/defaults.yml @@ -49,21 +49,6 @@ defaults: unicorn_timeout: 90 embed_sidekiq_worker: false sidekiq_workers: 1 - chat: - enabled: false - server: - enabled: true - certs: "config/certs" - bosh: - proxy: false - proto: 'http' - address: '0.0.0.0' - port: 5280 - bind: '/http-bind' - log: - info: 'log/prosody.log' - error: 'log/prosody.err' - debug: false map: mapbox: enabled: false diff --git a/config/diaspora.yml.example b/config/diaspora.yml.example index 746f0685d..c95be222d 100644 --- a/config/diaspora.yml.example +++ b/config/diaspora.yml.example @@ -208,68 +208,6 @@ configuration: ## Section ## increase environment.sidekiq.concurrency instead! #sidekiq_workers: 1 - ## Diaspora has an internal XMPP web-client. If you want to enable the chat - ## functionality or want to use a custom XMPP server, then you should edit - ## the following configuration. - chat: ## Section - - ## Enable the chat service and all its components. - ## - ## Please make sure that you followed the Installation-Instructions first: - ## https://wiki.diasporafoundation.org/Integration/Chat#Installation.2FUpdate - #enabled: true - - ## Custom XMPP server configuration goes here. - server: ## Section - - ## Use the configuration bridge to prosody (default=true). - ## In case you want to run your own server or want to configure - ## prosody on your own, you should disable it. - #enabled: false - - ## Set the directory in which to look for virtual hosts TLS certificates. - #certs: 'config/certs' - - ## XEP-0124 BOSH requests - ## The easiest way of avoiding certificate and mixed-content issues - ## is to use a proxy, e.g.: - ## - ## Apache: https://wiki.diasporafoundation.org/Integration/Chat#Apache2 - ## Nginx: https://wiki.diasporafoundation.org/Integration/Chat#Nginx - ## - ## If you configured your proxy correctly, - ## you should set the proxy option to 'true' - bosh: ## Section - - ## If you'd like to use a proxy, you should set the proxy - ## option to true, otherwise jsxc always tries to - ## connect directly to the port specified below. - #proxy: true - - ## Configure the protocol used to access the BOSH endpoint - #proto: http - - ## Configure the address that prosody should listen on. - #address: '0.0.0.0' - - ## Configure the BOSH port. - #port: 5280 - - ## Configure the bind endpoint. - #bind: '/http-bind' - - ## Specify log behaviour here. - log: ## Section - - ## Log file location. - #info: 'log/prosody.log' - - ## Error log file location. - #error: 'log/prosody.err' - - ## The debug level logs all XML sent and received by the server. - #debug: false - ## Displays the location of a post in a map. Per default we are using the map ## tiles of the Heidelberg University (http://giscience.uni-hd.de). ## You also have the possibility to use the map tiles of https://www.mapbox.com diff --git a/config/eye.rb b/config/eye.rb index a7d54e308..20dfe9c86 100644 --- a/config/eye.rb +++ b/config/eye.rb @@ -50,13 +50,4 @@ Eye.application("diaspora") do end end end - - with_condition(AppConfig.chat.enabled? && AppConfig.chat.server.enabled?) do - process :xmpp do - start_command "bin/bundle exec rails runner Prosody.start" - daemonize true - pid_file "tmp/pids/xmpp.pid" - stop_signals [:TERM, 10.seconds, :KILL] - end - end end diff --git a/config/initializers/prosody.rb b/config/initializers/prosody.rb deleted file mode 100644 index df179e5c0..000000000 --- a/config/initializers/prosody.rb +++ /dev/null @@ -1,24 +0,0 @@ -# frozen_string_literal: true - -if AppConfig.chat.enabled? && AppConfig.chat.server.enabled? - db = Rails.application.config - .database_configuration[Rails.env] - - Prosody.update_configuration( - bosh_port: AppConfig.chat.server.bosh.port, bosh_path: AppConfig.chat.server.bosh.bind, - bosh_interface: AppConfig.chat.server.bosh.address, - - log_debug: (AppConfig.chat.server.log.debug? ? "debug" : "info"), - log_info: "#{Dir.pwd}/#{AppConfig.chat.server.log.info}", - log_error: "#{Dir.pwd}/#{AppConfig.chat.server.log.error}", - - certs: "#{Dir.pwd}/#{AppConfig.chat.server.certs}", - hostname: AppConfig.environment.url, - - virtualhost_driver: db["adapter"], - virtualhost_database: db["database"], - virtualhost_username: db["username"], - virtualhost_password: db["password"], - virtualhost_host: db["host"] - ) -end diff --git a/config/initializers/secure_headers.rb b/config/initializers/secure_headers.rb index c02d9cd94..967df9c84 100644 --- a/config/initializers/secure_headers.rb +++ b/config/initializers/secure_headers.rb @@ -29,14 +29,6 @@ SecureHeaders::Configuration.default do |config| csp[:style_src] << asset_host end - if AppConfig.chat.enabled? - csp[:media_src] << "data:" - - unless AppConfig.chat.server.bosh.proxy? - csp[:connect_src] << "#{AppConfig.pod_uri.host}:#{AppConfig.chat.server.bosh.port}" - end - end - csp[:script_src] << "code.jquery.com" if AppConfig.privacy.jquery_cdn? csp[:form_action] << "www.paypal.com" if AppConfig.settings.paypal_donations.enable? diff --git a/config/locales/diaspora/en.yml b/config/locales/diaspora/en.yml index fa3aa016f..5800302ff 100644 --- a/config/locales/diaspora/en.yml +++ b/config/locales/diaspora/en.yml @@ -400,11 +400,6 @@ en: rename_aspect_a: "Click “My aspects” in the side-bar from a stream view and click the pencil icon by the aspect you want to rename, or go to your Contacts page and select the relevant aspect. Then click the edit icon next to the aspect name at the top of this page, change the name and press “Update”." delete_aspect_q: "How do I delete an aspect?" delete_aspect_a: "Click “My aspects” in the side-bar from a stream view and click the pencil icon by the aspect you want to delete, or go to your Contacts page and select the relevant aspect. Then click the trash icon in the top right of the page." - chat: - title: "Chat" - contacts_page: "contacts page" - add_contact_roster_q: "How do I chat with someone in diaspora*?" - add_contact_roster_a: "First, you need to enable chat for one of the aspects that person is in. To do so, go to the %{contacts_page}, select the aspect you want and click on the chat icon to enable chat for the aspect. %{toggle_privilege} You could, if you prefer, create a special aspect called “Chat” and add the people you want to chat with to that aspect. Once you’ve done this, open the chat interface and select the person you want to chat with." mentions: title: "Mentions" what_is_a_mention_q: "What is a “mention”?" diff --git a/config/locales/javascript/javascript.en.yml b/config/locales/javascript/javascript.en.yml index 372d26705..ed0e12931 100644 --- a/config/locales/javascript/javascript.en.yml +++ b/config/locales/javascript/javascript.en.yml @@ -121,8 +121,6 @@ en: contacts: add_contact: "Add contact" - aspect_chat_is_enabled: "Contacts in this aspect are able to chat with you." - aspect_chat_is_not_enabled: "Contacts in this aspect are not able to chat with you." remove_contact: "Remove contact" error_add: "Couldn’t add <%= name %> to the aspect :(" error_remove: "Couldn’t remove <%= name %> from the aspect :(" diff --git a/config/routes.rb b/config/routes.rb index 8517e7ee8..e5969a097 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -59,7 +59,6 @@ Rails.application.routes.draw do get "aspects" => "streams#aspects", :as => "aspects_stream" resources :aspects, except: %i(index new edit) do - put :toggle_chat_privilege collection do put "order" => :update_order end diff --git a/db/migrate/20191018014242_remove_chat.rb b/db/migrate/20191018014242_remove_chat.rb new file mode 100644 index 000000000..f6f1b3d9d --- /dev/null +++ b/db/migrate/20191018014242_remove_chat.rb @@ -0,0 +1,10 @@ +# frozen_string_literal: true + +class RemoveChat < ActiveRecord::Migration[5.1] + def up + remove_column :aspects, :chat_enabled + drop_table :chat_contacts + drop_table :chat_fragments + drop_table :chat_offline_messages + end +end diff --git a/lib/archive_importer.rb b/lib/archive_importer.rb index c989c1b06..8eb3a2342 100644 --- a/lib/archive_importer.rb +++ b/lib/archive_importer.rb @@ -66,7 +66,7 @@ class ArchiveImporter def import_aspects contact_groups.each do |group| begin - user.aspects.create!(group.slice("name", "chat_enabled")) + user.aspects.create!(group.slice("name")) rescue ActiveRecord::RecordInvalid => e logger.warn "#{self}: #{e}" end diff --git a/lib/schemas/archive-format.json b/lib/schemas/archive-format.json index 77ef84fb2..0bb79017e 100644 --- a/lib/schemas/archive-format.json +++ b/lib/schemas/archive-format.json @@ -30,8 +30,7 @@ "items": { "type": "object", "properties": { - "name": { "type": "string" }, - "chat_enabled": { "type": "boolean" } + "name": { "type": "string" } }, "required": [ "name" diff --git a/script/server b/script/server index 9cc8ee51a..86151d973 100755 --- a/script/server +++ b/script/server @@ -110,9 +110,6 @@ vars=$(bin/bundle exec ruby ./script/get_config.rb \ single_process_mode=environment.single_process_mode? \ embed_sidekiq_worker=server.embed_sidekiq_worker \ workers=server.sidekiq_workers \ - chat=chat.enabled \ - chat_server=chat.server.enabled \ - chat_bosh_proxy=chat.server.bosh.proxy \ redis_url=environment.redis \ | grep -vE "is not writable|as your home directory temporarily" ) @@ -189,19 +186,6 @@ https://github.com/diaspora/diaspora/issues/4202 for details " fi -if [ "$chat" = "true" -a "$chat_server" = "true" -a "$chat_bosh_proxy" = "false" ] -then - warning " -***************************************************************** -You enabled the chat feature but haven't configured BOSH! That -could lead to mixed-content problems with the http clients. Please -think about editing your proxy configuration as described in: - -diaspora.yml.example -***************************************************************** -" -fi - # Use libjemalloc if it's available for better memory usage command -v ldconfig > /dev/null 2>&1 if [ $? -eq 0 ]; then diff --git a/spec/controllers/jasmine_fixtures/contacts_spec.rb b/spec/controllers/jasmine_fixtures/contacts_spec.rb index fdd1beeeb..f2fccfcb6 100644 --- a/spec/controllers/jasmine_fixtures/contacts_spec.rb +++ b/spec/controllers/jasmine_fixtures/contacts_spec.rb @@ -7,7 +7,6 @@ describe ContactsController, :type => :controller do describe '#index' do before do - AppConfig.chat.enabled = true @aspect = bob.aspects.create(:name => "another aspect") bob.share_with alice.person, @aspect bob.share_with eve.person, @aspect diff --git a/spec/helpers/jsxc_helper_spec.rb b/spec/helpers/jsxc_helper_spec.rb deleted file mode 100644 index 0d80218c2..000000000 --- a/spec/helpers/jsxc_helper_spec.rb +++ /dev/null @@ -1,21 +0,0 @@ -# frozen_string_literal: true - -describe JsxcHelper, :type => :helper do - before do - AppConfig.chat.server.bosh.port = 1234 - AppConfig.chat.server.bosh.bind = "/bind" - end - - describe "#get_bosh_endpoint" do - it "using http scheme and default values" do - AppConfig.chat.server.bosh.proxy = false - expect(helper.get_bosh_endpoint).to include %Q(http://localhost:1234/bind) - end - - it "using https scheme and no port" do - AppConfig.chat.server.bosh.proxy = true - allow(AppConfig).to receive(:pod_uri).and_return(Addressable::URI.parse("https://localhost/")) - expect(helper.get_bosh_endpoint).to include %Q(https://localhost/bind) - end - end -end diff --git a/spec/integration/exporter_spec.rb b/spec/integration/exporter_spec.rb index ac9bdbfd9..7794c07de 100644 --- a/spec/integration/exporter_spec.rb +++ b/spec/integration/exporter_spec.rb @@ -46,12 +46,10 @@ describe Diaspora::Exporter do user: { "contact_groups": [ { - "name": "generic", - "chat_enabled": false + "name": "generic" }, { - "name": "Work", - "chat_enabled": false + "name": "Work" } ] } diff --git a/spec/integration/migration_service_spec.rb b/spec/integration/migration_service_spec.rb index af5d6f237..f4daf1645 100644 --- a/spec/integration/migration_service_spec.rb +++ b/spec/integration/migration_service_spec.rb @@ -148,8 +148,7 @@ describe MigrationService do } ], "contact_groups": [ - {"name":"Friends","chat_enabled":true}, - {"name":"Friends","chat_enabled":false} + {"name":"Friends"} ], "post_subscriptions": [ "#{unknown_subscription_guid}", @@ -303,7 +302,6 @@ describe MigrationService do aspect = user.aspects.find_by(name: "Friends") expect(aspect).not_to be_nil - expect(aspect.chat_enabled).to be_truthy poll_participation = PollParticipation.find_by(author: user.person, guid: poll_participation_entity.guid) expect(poll_participation).not_to be_nil diff --git a/spec/javascripts/app/pages/contacts_spec.js b/spec/javascripts/app/pages/contacts_spec.js index c9d972ec6..4df7d4e4a 100644 --- a/spec/javascripts/app/pages/contacts_spec.js +++ b/spec/javascripts/app/pages/contacts_spec.js @@ -11,29 +11,6 @@ describe("app.pages.Contacts", function(){ }); }); - context('toggle chat privilege', function() { - beforeEach(function() { - this.chatToggle = $("#chat_privilege_toggle"); - this.chatIcon = $("#chat_privilege_toggle i"); - }); - - it('updates the title for the tooltip', function() { - expect(this.chatIcon.attr("data-original-title")).toBe( - Diaspora.I18n.t("contacts.aspect_chat_is_not_enabled") - ); - this.chatToggle.trigger("click"); - expect(this.chatIcon.attr("data-original-title")).toBe( - Diaspora.I18n.t("contacts.aspect_chat_is_enabled") - ); - }); - - it("toggles the chat icon", function() { - expect(this.chatIcon.hasClass("enabled")).toBeFalsy(); - this.chatToggle.trigger("click"); - expect(this.chatIcon.hasClass("enabled")).toBeTruthy(); - }); - }); - context('show aspect name form', function() { beforeEach(function() { this.button = $('#change_aspect_name'); diff --git a/spec/javascripts/app/views/help_view_spec.js b/spec/javascripts/app/views/help_view_spec.js index e73830267..c4671886a 100644 --- a/spec/javascripts/app/views/help_view_spec.js +++ b/spec/javascripts/app/views/help_view_spec.js @@ -1,6 +1,5 @@ describe("app.views.Help", function(){ beforeEach(function(){ - gon.appConfig = {chat: {enabled: false}}; this.locale = JSON.parse(spec.readFixture("locale_en_help_json")); Diaspora.I18n.reset(); Diaspora.I18n.load(this.locale, "en"); @@ -134,30 +133,4 @@ describe("app.views.Help", function(){ }); }); }); - - describe("chat section", function(){ - describe("chat enabled", function(){ - beforeEach(function(){ - gon.appConfig = {chat: {enabled: true}}; - this.view = new app.views.Help(); - this.view.render(); - }); - - it('should display the chat', function(){ - expect(this.view.$el.find('a[data-section=chat]').length).toBe(1); - }); - }); - - describe("chat disabled", function(){ - beforeEach(function(){ - gon.appConfig = {chat: {enabled: false}}; - this.view = new app.views.Help(); - this.view.render(); - }); - - it('should not display the chat', function () { - expect(this.view.$el.find('a[data-section=chat]').length).toBe(0); - }); - }); - }); }); diff --git a/spec/javascripts/jasmine_helpers/SpecHelper.js b/spec/javascripts/jasmine_helpers/SpecHelper.js index 4b0bd9175..a9f2b7083 100644 --- a/spec/javascripts/jasmine_helpers/SpecHelper.js +++ b/spec/javascripts/jasmine_helpers/SpecHelper.js @@ -76,7 +76,6 @@ beforeEach(function() { // add gon defaults window.gon = { appConfig: { - chat: {enabled: false}, settings: {podname: "MyPod"}, map: { mapbox: { diff --git a/spec/lib/archive_importer_spec.rb b/spec/lib/archive_importer_spec.rb index 504032d84..aa360c417 100644 --- a/spec/lib/archive_importer_spec.rb +++ b/spec/lib/archive_importer_spec.rb @@ -63,7 +63,6 @@ describe ArchiveImporter do } }, "contact_groups" => [{ - "chat_enabled" => true, "name" => "Friends" }], "followed_tags" => [target.tag_followings.first.tag.name], diff --git a/spec/presenters/node_info_presenter_spec.rb b/spec/presenters/node_info_presenter_spec.rb index 8929213b0..ab4cb09c2 100644 --- a/spec/presenters/node_info_presenter_spec.rb +++ b/spec/presenters/node_info_presenter_spec.rb @@ -39,7 +39,6 @@ describe NodeInfoPresenter do }, "metadata" => { "nodeName" => AppConfig.settings.pod_name, - "xmppChat" => AppConfig.chat.enabled?, "camo" => { "markdown" => AppConfig.privacy.camo.proxy_markdown_images?, "opengraph" => AppConfig.privacy.camo.proxy_opengraph_thumbnails?, @@ -118,16 +117,6 @@ describe NodeInfoPresenter do end end - context "when chat is enabled" do - before do - AppConfig.chat.enabled = true - end - - it "should mark the xmppChat metadata as true" do - expect(hash).to include "metadata" => include("xmppChat" => true) - end - end - context "when camo is enabled" do before do AppConfig.privacy.camo.proxy_markdown_images = true @@ -173,7 +162,6 @@ describe NodeInfoPresenter do }, "metadata" => { "nodeName" => AppConfig.settings.pod_name, - "xmppChat" => AppConfig.chat.enabled?, "camo" => { "markdown" => AppConfig.privacy.camo.proxy_markdown_images?, "opengraph" => AppConfig.privacy.camo.proxy_opengraph_thumbnails?, diff --git a/spec/serializers/export/aspect_serializer_spec.rb b/spec/serializers/export/aspect_serializer_spec.rb index eba297f19..41ea5e874 100644 --- a/spec/serializers/export/aspect_serializer_spec.rb +++ b/spec/serializers/export/aspect_serializer_spec.rb @@ -6,8 +6,7 @@ describe Export::AspectSerializer do it "has aspect attributes" do expect(serializer.attributes).to eq( - name: aspect.name, - chat_enabled: aspect.chat_enabled + name: aspect.name ) end end From 3856b44c5769a2995a21dba186d54a80bff691c1 Mon Sep 17 00:00:00 2001 From: FeruzOripov Date: Wed, 2 Oct 2019 09:19:43 +0500 Subject: [PATCH 80/81] Refactoring aspects_controller.rb closes #8064 --- app/controllers/aspects_controller.rb | 40 +++++++++++++-------------- 1 file changed, 19 insertions(+), 21 deletions(-) diff --git a/app/controllers/aspects_controller.rb b/app/controllers/aspects_controller.rb index b970f7596..07b1c8804 100644 --- a/app/controllers/aspects_controller.rb +++ b/app/controllers/aspects_controller.rb @@ -29,21 +29,19 @@ class AspectsController < ApplicationController end def destroy - @aspect = current_user.aspects.where(id: params[:id]).first - begin - if current_user.auto_follow_back && @aspect.id == current_user.auto_follow_back_aspect.id + if current_user.auto_follow_back && aspect.id == current_user.auto_follow_back_aspect.id current_user.update(auto_follow_back: false, auto_follow_back_aspect: nil) - flash[:notice] = I18n.t "aspects.destroy.success_auto_follow_back", name: @aspect.name + flash[:notice] = I18n.t "aspects.destroy.success_auto_follow_back", name: aspect.name else - flash[:notice] = I18n.t "aspects.destroy.success", name: @aspect.name + flash[:notice] = I18n.t "aspects.destroy.success", name: aspect.name end - @aspect.destroy + aspect.destroy rescue ActiveRecord::StatementInvalid => e - flash[:error] = I18n.t "aspects.destroy.failure", name: @aspect.name + flash[:error] = I18n.t "aspects.destroy.failure", name: aspect.name end - if request.referer.include?('contacts') + if request.referer.include?("contacts") redirect_to contacts_path else redirect_to aspects_path @@ -51,41 +49,41 @@ class AspectsController < ApplicationController end def show - if @aspect = current_user.aspects.where(:id => params[:id]).first - redirect_to aspects_path('a_ids[]' => @aspect.id) + if aspect + redirect_to aspects_path("a_ids[]" => aspect.id) else redirect_to aspects_path end end def update - @aspect = current_user.aspects.where(:id => params[:id]).first - - if @aspect.update_attributes!(aspect_params) - flash[:notice] = I18n.t 'aspects.update.success', :name => @aspect.name + if aspect.update!(aspect_params) + flash[:notice] = I18n.t "aspects.update.success", name: aspect.name else - flash[:error] = I18n.t 'aspects.update.failure', :name => @aspect.name + flash[:error] = I18n.t "aspects.update.failure", name: aspect.name end - render :json => { :id => @aspect.id, :name => @aspect.name } + render json: {id: aspect.id, name: aspect.name} end def update_order params[:ordered_aspect_ids].each_with_index do |id, i| - current_user.aspects.find(id).update_attributes(order_id: i) + current_user.aspects.find(id).update(order_id: i) end head :no_content end def toggle_chat_privilege - @aspect = current_user.aspects.where(:id => params[:aspect_id]).first - - @aspect.chat_enabled = !@aspect.chat_enabled - @aspect.save + aspect.chat_enabled = !aspect.chat_enabled + aspect.save head :no_content end private + def aspect + @aspect ||= current_user.aspects.where(id: (params[:id] || params[:aspect_id])).first + end + def connect_person_to_aspect(aspecting_person_id) @person = Person.find(aspecting_person_id) if @contact = current_user.contact_for(@person) From 36b4076af6239d01eda2a446f5a3b8c64b49aa93 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonne=20Ha=C3=9F?= Date: Thu, 19 Sep 2019 18:00:00 +0200 Subject: [PATCH 81/81] set better example values for unicorn stdout/stderr log settings [ci skip] closes #8058 --- Changelog.md | 1 + config/diaspora.yml.example | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/Changelog.md b/Changelog.md index 8b37f409b..4389a0089 100644 --- a/Changelog.md +++ b/Changelog.md @@ -1,6 +1,7 @@ # 0.7.13.0 ## Refactor +* Set better example values for unicorn stdout/stderr log settings [#8058](https://github.com/diaspora/diaspora/pull/8058) ## Bug fixes * Fix error while trying to fetch some sites with invalid OpenGraph data [#8049](https://github.com/diaspora/diaspora/pull/8049) diff --git a/config/diaspora.yml.example b/config/diaspora.yml.example index 8c1b54615..c2a47b001 100644 --- a/config/diaspora.yml.example +++ b/config/diaspora.yml.example @@ -186,8 +186,8 @@ configuration: ## Section #rails_environment: 'development' ## Write unicorn stderr and stdout log. - #stderr_log: '/usr/local/app/diaspora/log/unicorn-stderr.log' - #stdout_log: '/usr/local/app/diaspora/log/unicorn-stdout.log' + #stderr_log: 'log/unicorn-stderr.log' + #stdout_log: 'log/unicorn-stdout.log' ## Number of Unicorn worker processes (default=2). ## Increase this if you have many users.