Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/diaspora/diaspora.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenjamin Neff <benjamin@coding4coffee.ch>2019-05-13 23:50:35 +0300
committerBenjamin Neff <benjamin@coding4coffee.ch>2019-05-13 23:51:22 +0300
commitdc7c5ffef62a3baeeaf3bce726f156add1cd1694 (patch)
treeb85e04a16065b02b991b43c8dad339c2752a3d5e
parent663da1ef2573863eb870e0edbd50050f261f3d30 (diff)
parent5aec9b966ca9e1b086922c2db0d06a44c8acd8a5 (diff)
Merge branch 'release/0.7.11.0'v0.7.11.0
-rw-r--r--.rubocop.yml18
-rw-r--r--Changelog.md14
-rw-r--r--Gemfile70
-rw-r--r--Gemfile.lock338
-rw-r--r--app/assets/images/branding/apple-splash.pngbin17720 -> 0 bytes
-rw-r--r--app/assets/images/branding/logos/app-icon-512.pngbin0 -> 25524 bytes
-rw-r--r--app/assets/images/branding/logos/app-icon.pngbin0 -> 8991 bytes
-rw-r--r--app/assets/stylesheets/base.scss3
-rw-r--r--app/assets/stylesheets/forms.scss5
-rw-r--r--app/assets/stylesheets/login.scss1
-rw-r--r--app/controllers/application_controller.rb7
-rw-r--r--app/controllers/manifest_controller.rb27
-rw-r--r--app/controllers/sessions_controller.rb50
-rw-r--r--app/controllers/two_factor_authentications_controller.rb55
-rw-r--r--app/controllers/users_controller.rb2
-rw-r--r--app/helpers/application_helper.rb5
-rw-r--r--app/models/user.rb10
-rw-r--r--app/services/diaspora_link_service.rb20
-rw-r--r--app/views/devise/confirmations/new.html.haml4
-rw-r--r--app/views/devise/passwords/edit.mobile.haml2
-rw-r--r--app/views/devise/passwords/new.haml4
-rw-r--r--app/views/devise/passwords/new.mobile.haml2
-rw-r--r--app/views/devise/unlocks/new.html.haml4
-rw-r--r--app/views/layouts/_head.haml (renamed from app/views/application/_head.haml)2
-rw-r--r--app/views/layouts/application.html.haml2
-rw-r--r--app/views/layouts/application.mobile.haml7
-rw-r--r--app/views/sessions/two_factor.html.haml31
-rw-r--r--app/views/shared/_settings_nav.haml2
-rw-r--r--app/views/two_factor_authentications/_activate.haml11
-rw-r--r--app/views/two_factor_authentications/_confirm.haml33
-rw-r--r--app/views/two_factor_authentications/_deactivate.haml27
-rw-r--r--app/views/two_factor_authentications/_recovery.haml18
-rw-r--r--app/views/two_factor_authentications/_token_form.haml4
-rw-r--r--app/views/two_factor_authentications/confirm_2fa.html.haml11
-rw-r--r--app/views/two_factor_authentications/recovery_codes.html.haml12
-rw-r--r--app/views/two_factor_authentications/show.html.haml15
-rw-r--r--config/defaults.yml2
-rw-r--r--config/initializers/devise.rb11
-rw-r--r--config/initializers/filter_parameter_logging.rb1
-rw-r--r--config/initializers/secure_headers.rb3
-rw-r--r--config/locales/devise/devise.ar.yml1
-rw-r--r--config/locales/devise/devise.art-nvi.yml1
-rw-r--r--config/locales/devise/devise.bg.yml1
-rw-r--r--config/locales/devise/devise.br.yml1
-rw-r--r--config/locales/devise/devise.bs.yml1
-rw-r--r--config/locales/devise/devise.cs.yml1
-rw-r--r--config/locales/devise/devise.cy.yml1
-rw-r--r--config/locales/devise/devise.da.yml1
-rw-r--r--config/locales/devise/devise.de-moo.yml1
-rw-r--r--config/locales/devise/devise.de.yml1
-rw-r--r--config/locales/devise/devise.de_formal.yml1
-rw-r--r--config/locales/devise/devise.el.yml1
-rw-r--r--config/locales/devise/devise.en.yml1
-rw-r--r--config/locales/devise/devise.en_1337.yml1
-rw-r--r--config/locales/devise/devise.en_shaw.yml1
-rw-r--r--config/locales/devise/devise.en_valspeak.yml1
-rw-r--r--config/locales/devise/devise.eo.yml1
-rw-r--r--config/locales/devise/devise.es-AR.yml1
-rw-r--r--config/locales/devise/devise.es-CL.yml1
-rw-r--r--config/locales/devise/devise.es-MX.yml1
-rw-r--r--config/locales/devise/devise.es.yml1
-rw-r--r--config/locales/devise/devise.et.yml1
-rw-r--r--config/locales/devise/devise.eu.yml1
-rw-r--r--config/locales/devise/devise.fi.yml1
-rw-r--r--config/locales/devise/devise.fr.yml1
-rw-r--r--config/locales/devise/devise.he.yml1
-rw-r--r--config/locales/devise/devise.hu.yml1
-rw-r--r--config/locales/devise/devise.hye-classical.yml1
-rw-r--r--config/locales/devise/devise.hye.yml1
-rw-r--r--config/locales/devise/devise.ia.yml1
-rw-r--r--config/locales/devise/devise.id.yml1
-rw-r--r--config/locales/devise/devise.is.yml1
-rw-r--r--config/locales/devise/devise.it.yml1
-rw-r--r--config/locales/devise/devise.ja.yml1
-rw-r--r--config/locales/devise/devise.ka.yml1
-rw-r--r--config/locales/devise/devise.ko.yml1
-rw-r--r--config/locales/devise/devise.lt.yml1
-rw-r--r--config/locales/devise/devise.mk.yml1
-rw-r--r--config/locales/devise/devise.ms.yml1
-rw-r--r--config/locales/devise/devise.nb.yml1
-rw-r--r--config/locales/devise/devise.nds.yml1
-rw-r--r--config/locales/devise/devise.nl.yml1
-rw-r--r--config/locales/devise/devise.nn.yml1
-rw-r--r--config/locales/devise/devise.oc.yml1
-rw-r--r--config/locales/devise/devise.pa.yml1
-rw-r--r--config/locales/devise/devise.pl.yml1
-rw-r--r--config/locales/devise/devise.pt-BR.yml1
-rw-r--r--config/locales/devise/devise.pt-PT.yml1
-rw-r--r--config/locales/devise/devise.ro.yml1
-rw-r--r--config/locales/devise/devise.ru.yml1
-rw-r--r--config/locales/devise/devise.sc.yml1
-rw-r--r--config/locales/devise/devise.sk.yml1
-rw-r--r--config/locales/devise/devise.sl.yml1
-rw-r--r--config/locales/devise/devise.sr.yml1
-rw-r--r--config/locales/devise/devise.sv.yml1
-rw-r--r--config/locales/devise/devise.te.yml1
-rw-r--r--config/locales/devise/devise.tr.yml1
-rw-r--r--config/locales/devise/devise.uk.yml1
-rw-r--r--config/locales/devise/devise.vi.yml1
-rw-r--r--config/locales/devise/devise.zh-CN.yml1
-rw-r--r--config/locales/devise/devise.zh-TW.yml1
-rw-r--r--config/locales/diaspora/bg.yml35
-rw-r--r--config/locales/diaspora/da.yml48
-rw-r--r--config/locales/diaspora/de.yml2
-rw-r--r--config/locales/diaspora/en.yml36
-rw-r--r--config/locales/diaspora/es-CL.yml14
-rw-r--r--config/locales/diaspora/fr.yml37
-rw-r--r--config/locales/diaspora/hu.yml4
-rw-r--r--config/locales/diaspora/ia.yml29
-rw-r--r--config/locales/diaspora/it.yml34
-rw-r--r--config/locales/diaspora/ja.yml43
-rw-r--r--config/locales/diaspora/pt-BR.yml35
-rw-r--r--config/locales/diaspora/sv.yml36
-rw-r--r--config/locales/javascript/javascript.da.yml1
-rw-r--r--config/locales/javascript/javascript.de.yml1
-rw-r--r--config/locales/javascript/javascript.ja.yml10
-rw-r--r--config/routes.rb7
-rw-r--r--db/migrate/20171229175654_add_devise_two_factor_to_users.rb13
-rw-r--r--db/migrate/20180302105225_add_two_factor_backupable_to_user.rb7
-rw-r--r--db/migrate/20190509125709_fix_missing_remote_photo_fields.rb11
-rw-r--r--db/migrate/20190511150503_decrypt_two_factor_secret.rb52
-rw-r--r--features/desktop/change_password.feature7
-rw-r--r--features/desktop/likes.feature13
-rw-r--r--features/desktop/two_factor_authentication.feature80
-rw-r--r--features/mobile/change_password.feature9
-rw-r--r--features/step_definitions/custom_web_steps.rb80
-rw-r--r--features/step_definitions/left_navbar_steps.rb23
-rw-r--r--features/step_definitions/posts_steps.rb72
-rw-r--r--features/step_definitions/publisher_steps.rb75
-rw-r--r--features/step_definitions/session_steps.rb2
-rw-r--r--features/step_definitions/stream_steps.rb76
-rw-r--r--features/step_definitions/two_factor_steps.rb51
-rw-r--r--features/support/paths.rb2
-rw-r--r--graphics/app-icon.svg4
-rw-r--r--lib/configuration_methods.rb12
-rw-r--r--spec/controllers/passwords_controller_spec.rb2
-rw-r--r--spec/controllers/two_factor_authentications_controller_spec.rb119
-rw-r--r--spec/lib/diaspora/federation/entities_spec.rb2
-rw-r--r--spec/lib/diaspora/federation/receive_spec.rb3
-rw-r--r--spec/models/user_spec.rb5
-rw-r--r--spec/services/diaspora_link_service_spec.rb28
141 files changed, 1536 insertions, 478 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
diff --git a/Changelog.md b/Changelog.md
index 96f44e5b6..90b3bff77 100644
--- a/Changelog.md
+++ b/Changelog.md
@@ -1,3 +1,17 @@
+# 0.7.11.0
+
+## 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
+* 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)
+* Support TOTP two factor authentication [#7751](https://github.com/diaspora/diaspora/pull/7751)
+
# 0.7.10.0
## Refactor
diff --git a/Gemfile b/Gemfile
index b7ae543c9..cd54325d8 100644
--- a/Gemfile
+++ b/Gemfile
@@ -2,32 +2,34 @@
source "https://rubygems.org"
-gem "rails", "5.1.6"
+gem "rails", "5.1.6.2"
# Legacy Rails features, remove me!
# responders (class level)
-gem "responders", "2.4.0"
+gem "responders", "2.4.1"
# Appserver
-gem "unicorn", "5.4.1", require: false
+gem "unicorn", "5.5.0", require: false
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
gem "acts_as_api", "1.0.1"
-gem "json", "2.1.0"
+gem "json", "2.2.0"
gem "json-schema", "2.8.1"
# Authentication
-gem "devise", "4.5.0"
+gem "devise", "4.6.1"
+gem "devise-two-factor", "3.0.3"
gem "devise_lastseenable", "0.0.6"
+gem "rqrcode", "0.10.1"
# Captcha
@@ -36,15 +38,15 @@ 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.3"
+gem "sidekiq", "5.2.5"
# Scheduled processing
-gem "sidekiq-cron", "1.0.4"
+gem "sidekiq-cron", "1.1.0"
# Compression
-gem "uglifier", "4.1.19"
+gem "uglifier", "4.1.20"
# Configuration
@@ -57,7 +59,7 @@ gem "rack-cors", "1.0.2", require: "rack/cors"
# CSS
gem "autoprefixer-rails", "8.6.5"
-gem "bootstrap-sass", "3.3.7"
+gem "bootstrap-sass", "3.4.1"
gem "bootstrap-switch-rails", "3.3.3" # 3.3.4 is broken, see https://github.com/Bttstrp/bootstrap-switch/issues/691
gem "compass-rails", "3.1.0"
gem "sass-rails", "5.0.7"
@@ -69,17 +71,17 @@ group :mysql, optional: true do
gem "mysql2", "0.5.2"
end
group :postgresql, optional: true do
- gem "pg", "1.1.3"
+ gem "pg", "1.1.4"
end
-gem "activerecord-import", "0.27.0"
+gem "activerecord-import", "1.0.1"
# File uploading
-gem "carrierwave", "1.2.3"
-gem "fog-aws", "3.3.0"
-gem "mini_magick", "4.9.2"
+gem "carrierwave", "1.3.1"
+gem "fog-aws", "3.4.0"
+gem "mini_magick", "4.9.3"
# GUID generation
gem "uuid", "2.3.9"
@@ -90,7 +92,7 @@ gem "entypo-rails", "3.0.0"
# JavaScript
-gem "handlebars_assets", "0.23.2"
+gem "handlebars_assets", "0.23.3"
gem "jquery-rails", "4.3.3"
gem "js-routes", "1.4.4"
gem "js_image_paths", "0.1.1"
@@ -129,7 +131,7 @@ gem "markdown-it-html5-embed", "1.0.0"
gem "http_accept_language", "2.1.1"
gem "i18n-inflector-rails", "1.0.7"
-gem "rails-i18n", "5.1.2"
+gem "rails-i18n", "5.1.3"
# Mail
@@ -140,7 +142,7 @@ gem "leaflet-rails", "1.3.1"
# Parsing
-gem "nokogiri", "1.8.5"
+gem "nokogiri", "1.10.1"
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"
@@ -152,11 +154,11 @@ gem "string-direction", "1.2.1"
# Security Headers
-gem "secure_headers", "6.0.0"
+gem "secure_headers", "6.1.0"
# Services
-gem "omniauth", "1.8.1"
+gem "omniauth", "1.9.0"
gem "omniauth-tumblr", "1.2"
gem "omniauth-twitter", "1.4.0"
gem "omniauth-wordpress", "0.2.2"
@@ -180,7 +182,7 @@ gem "acts-as-taggable-on", "6.0.0"
# URIs and HTTP
gem "addressable", "2.5.2", require: "addressable/uri"
-gem "faraday", "0.15.3"
+gem "faraday", "0.15.4"
gem "faraday_middleware", "0.12.2"
gem "faraday-cookie_jar", "0.0.6"
gem "typhoeus", "1.3.1"
@@ -188,10 +190,10 @@ gem "typhoeus", "1.3.1"
# Views
gem "gon", "6.2.1"
-gem "hamlit", "2.9.1"
+gem "hamlit", "2.9.2"
gem "mobile-fu", "1.4.0"
-gem "rails-timeago", "2.16.0"
-gem "will_paginate", "3.1.6"
+gem "rails-timeago", "2.17.1"
+gem "will_paginate", "3.1.7"
# Logging
@@ -234,7 +236,7 @@ group :production do # we don"t install these on travis to speed up test runs
# Third party asset hosting
- gem "asset_sync", "2.5.0", require: false
+ gem "asset_sync", "2.7.0", require: false
end
group :development do
@@ -243,7 +245,7 @@ group :development do
gem "guard-rspec", "4.7.3", require: false
gem "guard-rubocop", "1.3.0", require: false
gem "rb-fsevent", "0.10.3", require: false
- gem "rb-inotify", "0.9.10", require: false
+ gem "rb-inotify", "0.10.0", require: false
# Linters
gem "haml_lint", "0.28.0", require: false
@@ -252,7 +254,7 @@ 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.60.0", require: false
+ gem "rubocop", "0.66.0", require: false
# Preloading environment
@@ -280,7 +282,7 @@ group :test do
# Cucumber (integration tests)
- gem "capybara", "3.11.1"
+ gem "capybara", "3.15.0"
gem "database_cleaner", "1.7.0"
gem "poltergeist", "1.18.1"
@@ -289,11 +291,11 @@ group :test do
# General helpers
gem "factory_girl_rails", "4.8.0"
- gem "shoulda-matchers", "3.1.2"
+ gem "shoulda-matchers", "4.0.1"
gem "timecop", "0.9.1"
- gem "webmock", "3.4.2", require: false
+ 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
@@ -301,7 +303,7 @@ end
group :development, :test do
# RSpec (unit tests, some integration tests)
- gem "rspec-rails", "3.8.1"
+ gem "rspec-rails", "3.8.2"
# Cucumber (integration tests)
gem "cucumber-rails", "1.6.0", require: false
@@ -313,5 +315,5 @@ group :development, :test do
gem "sinon-rails", "1.15.0"
# For `assigns` in controller specs
- gem "rails-controller-testing", "1.0.2"
+ gem "rails-controller-testing", "1.0.4"
end
diff --git a/Gemfile.lock b/Gemfile.lock
index e2f46878b..38e879e6d 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)
- actionpack (= 5.1.6)
+ actioncable (5.1.6.2)
+ actionpack (= 5.1.6.2)
nio4r (~> 2.0)
websocket-driver (~> 0.6.1)
- actionmailer (5.1.6)
- actionpack (= 5.1.6)
- actionview (= 5.1.6)
- activejob (= 5.1.6)
+ actionmailer (5.1.6.2)
+ actionpack (= 5.1.6.2)
+ actionview (= 5.1.6.2)
+ activejob (= 5.1.6.2)
mail (~> 2.5, >= 2.5.4)
rails-dom-testing (~> 2.0)
- actionpack (5.1.6)
- actionview (= 5.1.6)
- activesupport (= 5.1.6)
+ actionpack (5.1.6.2)
+ actionview (= 5.1.6.2)
+ activesupport (= 5.1.6.2)
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)
- activesupport (= 5.1.6)
+ actionview (5.1.6.2)
+ activesupport (= 5.1.6.2)
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)
- activesupport (= 5.1.6)
+ activejob (5.1.6.2)
+ activesupport (= 5.1.6.2)
globalid (>= 0.3.6)
- activemodel (5.1.6)
- activesupport (= 5.1.6)
- activerecord (5.1.6)
- activemodel (= 5.1.6)
- activesupport (= 5.1.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)
arel (~> 8.0)
- activerecord-import (0.27.0)
+ activerecord-import (1.0.1)
activerecord (>= 3.2)
- activesupport (5.1.6)
+ activesupport (5.1.6.2)
concurrent-ruby (~> 1.0, >= 1.0.2)
i18n (>= 0.7, < 2)
minitest (~> 5.1)
@@ -54,26 +54,28 @@ GEM
public_suffix (>= 2.0.2, < 4.0)
aes_key_wrap (1.0.1)
arel (8.0.0)
- asset_sync (2.5.0)
+ asset_sync (2.7.0)
activemodel (>= 4.1.0)
fog-core
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
- backports (3.11.4)
+ backports (3.12.0)
bcrypt (3.1.12)
bindata (2.4.4)
- bootstrap-sass (3.3.7)
+ bootstrap-sass (3.4.1)
autoprefixer-rails (>= 5.2.1)
- sass (>= 3.3.4)
+ sassc (>= 2.0.0)
bootstrap-switch-rails (3.3.3)
buftok (0.2.0)
builder (3.2.3)
- byebug (10.0.2)
- capybara (3.11.1)
+ byebug (11.0.1)
+ capybara (3.15.0)
addressable
mini_mime (>= 0.1.3)
nokogiri (~> 1.8)
@@ -81,11 +83,11 @@ GEM
rack-test (>= 0.6.3)
regexp_parser (~> 1.2)
xpath (~> 3.2)
- carrierwave (1.2.3)
+ carrierwave (1.3.1)
activemodel (>= 4.0.0)
activesupport (>= 4.0.0)
mime-types (>= 1.16)
- celluloid (0.17.3)
+ celluloid (0.17.4)
celluloid-essentials
celluloid-extras
celluloid-fsm
@@ -106,7 +108,7 @@ GEM
timers (>= 4.1.1)
celluloid-supervision (0.20.6)
timers (>= 4.1.1)
- chunky_png (1.3.10)
+ chunky_png (1.3.11)
cliver (0.3.2)
coderay (1.1.2)
compass (1.0.3)
@@ -125,7 +127,7 @@ GEM
compass (~> 1.0.0)
sass-rails (< 5.1)
sprockets (< 4.0)
- concurrent-ruby (1.1.3)
+ concurrent-ruby (1.1.5)
configurate (0.3.1)
connection_pool (2.2.2)
coveralls (0.8.22)
@@ -163,45 +165,52 @@ GEM
cucumber-tag_expressions (1.1.1)
cucumber-wire (0.0.1)
database_cleaner (1.7.0)
- devise (4.5.0)
+ devise (4.6.1)
bcrypt (~> 3.0)
orm_adapter (~> 0.1)
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)
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)
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)
- erubi (1.7.1)
+ erubi (1.8.0)
eslintrb (2.1.0)
execjs
multi_json (>= 1.3)
rake
- et-orbi (1.1.6)
+ et-orbi (1.1.7)
tzinfo
- ethon (0.11.0)
+ ethon (0.12.0)
ffi (>= 1.3.0)
excon (0.62.0)
execjs (2.7.0)
@@ -217,19 +226,19 @@ GEM
factory_girl_rails (4.8.0)
factory_girl (~> 4.8.0)
railties (>= 3.0.0)
- faraday (0.15.3)
+ faraday (0.15.4)
multipart-post (>= 1.2, < 3)
faraday-cookie_jar (0.0.6)
faraday (>= 0.7.4)
http-cookie (~> 1.0.0)
faraday_middleware (0.12.2)
faraday (>= 0.7.4, < 1.0)
- ffi (1.9.25)
+ ffi (1.10.0)
fixture_builder (0.5.2.rc3)
activerecord (>= 2)
activesupport (>= 2)
hashdiff
- fog-aws (3.3.0)
+ fog-aws (3.4.0)
fog-core (~> 2.1)
fog-json (~> 1.1)
fog-xml (~> 0.1)
@@ -246,18 +255,18 @@ GEM
fog-core
nokogiri (>= 1.5.11, < 2.0.0)
formatador (0.2.5)
- fugit (1.1.6)
- et-orbi (~> 1.1, >= 1.1.6)
+ fugit (1.1.8)
+ et-orbi (~> 1.1, >= 1.1.7)
raabro (~> 1.1)
fuubar (2.3.2)
rspec-core (~> 3.0)
ruby-progressbar (~> 1.4)
get_process_mem (0.2.3)
gherkin (5.1.0)
- gitlab (4.7.0)
- httparty (>= 0.14.0)
- terminal-table (>= 1.5.1)
- globalid (0.4.1)
+ gitlab (4.10.0)
+ httparty (~> 0.14, >= 0.14.0)
+ terminal-table (~> 1.5, >= 1.5.1)
+ globalid (0.4.2)
activesupport (>= 4.2.0)
gon (6.2.1)
actionpack (>= 3.0)
@@ -289,16 +298,16 @@ GEM
rake (>= 10, < 13)
rubocop (>= 0.50.0)
sysexits (~> 1.1)
- hamlit (2.9.1)
+ hamlit (2.9.2)
temple (>= 0.8.0)
thor
tilt
- handlebars_assets (0.23.2)
+ handlebars_assets (0.23.3)
execjs (~> 2.0)
sprockets (>= 2.0.0)
tilt (>= 1.2)
- hashdiff (0.3.7)
- hashie (3.5.7)
+ hashdiff (0.3.8)
+ hashie (3.6.0)
http (3.3.0)
addressable (~> 2.3)
http-cookie (~> 1.0)
@@ -309,11 +318,11 @@ GEM
http-form_data (2.1.1)
http_accept_language (2.1.1)
http_parser.rb (0.6.0)
- httparty (0.16.3)
+ httparty (0.16.4)
mime-types (~> 3.0)
multi_xml (>= 0.5.2)
httpclient (2.8.3)
- i18n (1.1.1)
+ i18n (1.6.0)
concurrent-ruby (~> 1.0)
i18n-inflector (2.6.7)
i18n (>= 0.4.1)
@@ -322,7 +331,7 @@ GEM
i18n-inflector (~> 2.6)
railties (>= 3.0.0)
ipaddress (0.8.3)
- jaro_winkler (1.5.1)
+ jaro_winkler (1.5.2)
jasmine (3.3.0)
jasmine-core (~> 3.3.0)
phantomjs
@@ -340,9 +349,9 @@ GEM
js_image_paths (0.1.1)
rails (>= 4.0, < 6.0)
sprockets (>= 3.0.0)
- json (2.1.0)
- json-jwt (1.9.4)
- activesupport
+ json (2.2.0)
+ json-jwt (1.10.0)
+ activesupport (>= 4.2)
aes_key_wrap
bindata
json-schema (2.8.1)
@@ -350,12 +359,12 @@ GEM
json-schema-rspec (0.0.4)
json-schema (~> 2.5)
rspec
- jsonpath (0.9.6)
+ jsonpath (1.0.1)
multi_json
to_regexp (~> 0.2.1)
jwt (2.1.0)
kgio (2.11.2)
- kostya-sigar (2.0.4)
+ kostya-sigar (2.0.6)
leaflet-rails (1.3.1)
rails (>= 4.2.0)
listen (3.1.5)
@@ -384,9 +393,9 @@ GEM
mime-types (3.2.2)
mime-types-data (~> 3.2015)
mime-types-data (3.2018.0812)
- mini_magick (4.9.2)
+ mini_magick (4.9.3)
mini_mime (1.0.1)
- mini_portile2 (2.3.0)
+ mini_portile2 (2.4.0)
minitest (5.11.3)
mobile-fu (1.4.0)
rack-mobile-detect
@@ -399,8 +408,8 @@ GEM
naught (1.1.0)
nenv (0.3.0)
nio4r (2.3.1)
- nokogiri (1.8.5)
- mini_portile2 (~> 2.3.0)
+ nokogiri (1.10.1)
+ mini_portile2 (~> 2.4.0)
notiffany (0.1.1)
nenv (~> 0.1)
shellany (~> 0.0)
@@ -413,15 +422,15 @@ GEM
rack (>= 1.2, < 3)
octokit (4.13.0)
sawyer (~> 0.8.0, >= 0.5.3)
- omniauth (1.8.1)
- hashie (>= 3.4.6, < 3.6.0)
+ omniauth (1.9.0)
+ hashie (>= 3.4.6, < 3.7.0)
rack (>= 1.6.2, < 3)
omniauth-oauth (1.1.0)
oauth
omniauth (~> 1.0)
- omniauth-oauth2 (1.5.0)
+ omniauth-oauth2 (1.6.0)
oauth2 (~> 1.1)
- omniauth (~> 1.2)
+ omniauth (~> 1.9)
omniauth-tumblr (1.2)
multi_json
omniauth-oauth (~> 1.0)
@@ -444,16 +453,15 @@ GEM
validate_url
webfinger (>= 1.0.1)
orm_adapter (0.5.0)
- parallel (1.12.1)
- parser (2.5.3.0)
+ parallel (1.14.0)
+ parser (2.6.2.0)
ast (~> 2.4.0)
- pg (1.1.3)
+ pg (1.1.4)
phantomjs (2.1.1.0)
poltergeist (1.18.1)
capybara (>= 2.1, < 4)
cliver (~> 0.3.1)
websocket-driver (>= 0.2.0)
- powerpack (0.1.2)
pronto (0.9.5)
gitlab (~> 4.0, >= 4.0.0)
httparty (>= 0.13.7)
@@ -476,9 +484,10 @@ GEM
pry (0.12.2)
coderay (~> 1.1.0)
method_source (~> 0.9.0)
- pry-byebug (3.6.0)
- byebug (~> 10.0)
+ pry-byebug (3.7.0)
+ byebug (~> 11.0)
pry (~> 0.10)
+ psych (3.1.0)
public_suffix (3.0.3)
raabro (1.1.6)
rack (2.0.6)
@@ -495,24 +504,24 @@ GEM
json-jwt (>= 1.9.0)
rack
rack-piwik (0.3.0)
- rack-protection (2.0.4)
+ rack-protection (2.0.5)
rack
rack-rewrite (1.5.1)
rack-ssl (1.4.1)
rack
rack-test (1.1.0)
rack (>= 1.0, < 3)
- rails (5.1.6)
- actioncable (= 5.1.6)
- actionmailer (= 5.1.6)
- actionpack (= 5.1.6)
- actionview (= 5.1.6)
- activejob (= 5.1.6)
- activemodel (= 5.1.6)
- activerecord (= 5.1.6)
- activesupport (= 5.1.6)
+ 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)
bundler (>= 1.3.0)
- railties (= 5.1.6)
+ railties (= 5.1.6.2)
sprockets-rails (>= 2.0.0)
rails-assets-autosize (4.0.2)
rails-assets-backbone (1.3.3)
@@ -560,42 +569,45 @@ GEM
rails-assets-markdown-it-sup (1.0.0)
rails-assets-underscore (1.9.1)
rails-assets-utatti-perfect-scrollbar (1.4.0)
- rails-controller-testing (1.0.2)
- actionpack (~> 5.x, >= 5.0.1)
- actionview (~> 5.x, >= 5.0.1)
- activesupport (~> 5.x)
+ rails-controller-testing (1.0.4)
+ actionpack (>= 5.0.1.x)
+ actionview (>= 5.0.1.x)
+ activesupport (>= 5.0.1.x)
rails-dom-testing (2.0.3)
activesupport (>= 4.2.0)
nokogiri (>= 1.6)
rails-html-sanitizer (1.0.4)
loofah (~> 2.2, >= 2.2.2)
- rails-i18n (5.1.2)
+ rails-i18n (5.1.3)
i18n (>= 0.7, < 2)
railties (>= 5.0, < 6)
- rails-timeago (2.16.0)
+ rails-timeago (2.17.1)
actionpack (>= 3.1)
activesupport (>= 3.1)
- railties (5.1.6)
- actionpack (= 5.1.6)
- activesupport (= 5.1.6)
+ railties (5.1.6.2)
+ actionpack (= 5.1.6.2)
+ activesupport (= 5.1.6.2)
method_source
rake (>= 0.8.7)
thor (>= 0.18.1, < 2.0)
rainbow (2.2.2)
rake
raindrops (0.19.0)
- rake (12.3.1)
+ rake (12.3.2)
rb-fsevent (0.10.3)
- rb-inotify (0.9.10)
- ffi (>= 0.5.0, < 2)
+ rb-inotify (0.10.0)
+ ffi (~> 1.0)
redcarpet (3.4.0)
redis (3.3.5)
regexp_parser (1.3.0)
request_store (1.4.1)
rack (>= 1.4)
- responders (2.4.0)
- actionpack (>= 4.2.0, < 5.3)
- railties (>= 4.2.0, < 5.3)
+ 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)
@@ -609,7 +621,7 @@ GEM
rspec-mocks (3.8.0)
diff-lcs (>= 1.2.0, < 2.0)
rspec-support (~> 3.8.0)
- rspec-rails (3.8.1)
+ rspec-rails (3.8.2)
actionpack (>= 3.0)
activesupport (>= 3.0)
railties (>= 3.0)
@@ -618,20 +630,20 @@ GEM
rspec-mocks (~> 3.8.0)
rspec-support (~> 3.8.0)
rspec-support (3.8.0)
- rubocop (0.60.0)
+ rubocop (0.66.0)
jaro_winkler (~> 1.5.1)
parallel (~> 1.10)
parser (>= 2.5, != 2.5.1.1)
- powerpack (~> 0.1)
+ psych (>= 3.1.0)
rainbow (>= 2.2.2, < 4.0)
ruby-progressbar (~> 1.7)
- unicode-display_width (~> 1.4.0)
+ unicode-display_width (>= 1.4.0, < 1.6)
ruby-oembed (0.12.0)
ruby-progressbar (1.10.0)
ruby_dep (1.5.0)
rubyzip (1.2.2)
- rugged (0.27.5)
- safe_yaml (1.0.4)
+ rugged (0.28.1)
+ safe_yaml (1.0.5)
sass (3.4.25)
sass-rails (5.0.7)
railties (>= 4.0.0, < 6)
@@ -639,21 +651,25 @@ GEM
sprockets (>= 2.8, < 4.0)
sprockets-rails (>= 2.0, < 4.0)
tilt (>= 1.1, < 3)
+ sassc (2.0.1)
+ ffi (~> 1.9)
+ rake
sawyer (0.8.1)
addressable (>= 2.3.5, < 2.6)
faraday (~> 0.8, < 1.0)
scss_lint (0.55.0)
rake (>= 0.9, < 13)
sass (~> 3.4.20)
- secure_headers (6.0.0)
+ secure_headers (6.1.0)
shellany (0.0.1)
- shoulda-matchers (3.1.2)
- activesupport (>= 4.0.0)
- sidekiq (5.2.3)
+ shoulda-matchers (4.0.1)
+ activesupport (>= 4.2.0)
+ sidekiq (5.2.5)
connection_pool (~> 2.2, >= 2.2.2)
+ rack (>= 1.5.0)
rack-protection (>= 1.5.0)
redis (>= 3.3.5, < 5)
- sidekiq-cron (1.0.4)
+ sidekiq-cron (1.1.0)
fugit (~> 1.1)
sidekiq (>= 4.2.1)
simple_captcha2 (0.4.3)
@@ -687,16 +703,16 @@ GEM
httpclient (>= 2.4)
sysexits (1.2.0)
systemu (2.6.5)
- temple (0.8.0)
- term-ansicolor (1.7.0)
+ temple (0.8.1)
+ term-ansicolor (1.7.1)
tins (~> 1.0)
terminal-table (1.8.0)
unicode-display_width (~> 1.1, >= 1.1.1)
thor (0.19.4)
thread_safe (0.3.6)
- tilt (2.0.8)
+ tilt (2.0.9)
timecop (0.9.1)
- timers (4.2.0)
+ timers (4.3.0)
tins (1.20.2)
to_regexp (0.2.1)
turbo_dev_assets (0.0.2)
@@ -717,13 +733,13 @@ GEM
ethon (>= 0.9.0)
tzinfo (1.2.5)
thread_safe (~> 0.1)
- uglifier (4.1.19)
+ uglifier (4.1.20)
execjs (>= 0.3.0, < 3)
unf (0.1.4)
unf_ext
unf_ext (0.0.7.5)
- unicode-display_width (1.4.0)
- unicorn (5.4.1)
+ unicode-display_width (1.5.0)
+ unicorn (5.5.0)
kgio (~> 2.6)
raindrops (~> 0.7)
unicorn-worker-killer (0.4.4)
@@ -735,9 +751,9 @@ GEM
validate_email (0.1.6)
activemodel (>= 3.0)
mail (>= 2.2.5)
- validate_url (1.0.2)
+ validate_url (1.0.6)
activemodel (>= 3.0.0)
- addressable
+ public_suffix
versionist (1.7.0)
activesupport (>= 3)
railties (>= 3)
@@ -747,61 +763,62 @@ GEM
webfinger (1.1.0)
activesupport
httpclient (>= 2.4)
- webmock (3.4.2)
+ webmock (3.5.1)
addressable (>= 2.3.6)
crack (>= 0.3.2)
hashdiff
websocket-driver (0.6.5)
websocket-extensions (>= 0.1.0)
websocket-extensions (0.1.3)
- will_paginate (3.1.6)
+ will_paginate (3.1.7)
xpath (3.2.0)
nokogiri (~> 1.8)
- yard (0.9.16)
+ yard (0.9.18)
PLATFORMS
ruby
DEPENDENCIES
active_model_serializers (= 0.9.7)
- activerecord-import (= 0.27.0)
+ activerecord-import (= 1.0.1)
acts-as-taggable-on (= 6.0.0)
acts_as_api (= 1.0.1)
addressable (= 2.5.2)
- asset_sync (= 2.5.0)
+ asset_sync (= 2.7.0)
autoprefixer-rails (= 8.6.5)
- bootstrap-sass (= 3.3.7)
+ bootstrap-sass (= 3.4.1)
bootstrap-switch-rails (= 3.3.3)
- capybara (= 3.11.1)
- carrierwave (= 1.2.3)
+ capybara (= 3.15.0)
+ carrierwave (= 1.3.1)
compass-rails (= 3.1.0)
configurate (= 0.3.1)
coveralls (= 0.8.22)
cucumber-api-steps (= 0.14)
cucumber-rails (= 1.6.0)
database_cleaner (= 1.7.0)
- devise (= 4.5.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.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)
- faraday (= 0.15.3)
+ faraday (= 0.15.4)
faraday-cookie_jar (= 0.0.6)
faraday_middleware (= 0.12.2)
fixture_builder (= 0.5.2.rc3)
- fog-aws (= 3.3.0)
+ fog-aws (= 3.4.0)
fuubar (= 2.3.2)
gon (= 6.2.1)
guard (= 2.15.0)
guard-rspec (= 4.7.3)
guard-rubocop (= 1.3.0)
haml_lint (= 0.28.0)
- hamlit (= 2.9.1)
- handlebars_assets (= 0.23.2)
+ hamlit (= 2.9.2)
+ handlebars_assets (= 0.23.3)
http_accept_language (= 2.1.1)
i18n-inflector-rails (= 1.0.7)
jasmine (= 3.3.0)
@@ -809,25 +826,25 @@ DEPENDENCIES
jquery-rails (= 4.3.3)
js-routes (= 1.4.4)
js_image_paths (= 0.1.1)
- json (= 2.1.0)
+ json (= 2.2.0)
json-schema (= 2.8.1)
json-schema-rspec (= 0.0.4)
leaflet-rails (= 1.3.1)
logging-rails (= 0.6.0)
markdown-it-html5-embed (= 1.0.0)
markerb (= 1.1.0)
- mini_magick (= 4.9.2)
+ mini_magick (= 4.9.3)
minitest
mobile-fu (= 1.4.0)
mysql2 (= 0.5.2)
- nokogiri (= 1.8.5)
- omniauth (= 1.8.1)
+ nokogiri (= 1.10.1)
+ omniauth (= 1.9.0)
omniauth-tumblr (= 1.2)
omniauth-twitter (= 1.4.0)
omniauth-wordpress (= 0.2.2)
open_graph_reader (= 0.6.2)
openid_connect (= 1.1.6)
- pg (= 1.1.3)
+ pg (= 1.1.4)
poltergeist (= 1.18.1)
pronto (= 0.9.5)
pronto-eslint (= 0.9.1)
@@ -841,7 +858,7 @@ DEPENDENCIES
rack-piwik (= 0.3.0)
rack-rewrite (= 1.5.1)
rack-ssl (= 1.4.1)
- rails (= 5.1.6)
+ rails (= 5.1.6.2)
rails-assets-autosize (= 4.0.2)!
rails-assets-backbone (= 1.3.3)!
rails-assets-blueimp-gallery (= 2.33.0)!
@@ -864,24 +881,25 @@ DEPENDENCIES
rails-assets-markdown-it-sub (= 1.0.0)!
rails-assets-markdown-it-sup (= 1.0.0)!
rails-assets-utatti-perfect-scrollbar (= 1.4.0)!
- rails-controller-testing (= 1.0.2)
- rails-i18n (= 5.1.2)
- rails-timeago (= 2.16.0)
+ rails-controller-testing (= 1.0.4)
+ rails-i18n (= 5.1.3)
+ rails-timeago (= 2.17.1)
rb-fsevent (= 0.10.3)
- rb-inotify (= 0.9.10)
+ rb-inotify (= 0.10.0)
redcarpet (= 3.4.0)
redis (= 3.3.5)
- responders (= 2.4.0)
+ responders (= 2.4.1)
+ rqrcode (= 0.10.1)
rspec-json_expectations (~> 2.1)
- rspec-rails (= 3.8.1)
- rubocop (= 0.60.0)
+ rspec-rails (= 3.8.2)
+ rubocop (= 0.66.0)
ruby-oembed (= 0.12.0)
rubyzip (= 1.2.2)
sass-rails (= 5.0.7)
- secure_headers (= 6.0.0)
- shoulda-matchers (= 3.1.2)
- sidekiq (= 5.2.3)
- sidekiq-cron (= 1.0.4)
+ secure_headers (= 6.1.0)
+ shoulda-matchers (= 4.0.1)
+ sidekiq (= 5.2.5)
+ sidekiq-cron (= 1.1.0)
simple_captcha2 (= 0.4.3)
simplecov (= 0.16.1)
sinon-rails (= 1.15.0)
@@ -895,13 +913,13 @@ DEPENDENCIES
twitter (= 6.2.0)
twitter-text (= 1.14.7)
typhoeus (= 1.3.1)
- uglifier (= 4.1.19)
- unicorn (= 5.4.1)
+ uglifier (= 4.1.20)
+ unicorn (= 5.5.0)
unicorn-worker-killer (= 0.4.4)
uuid (= 2.3.9)
versionist (= 1.7.0)
- webmock (= 3.4.2)
- will_paginate (= 3.1.6)
+ webmock (= 3.5.1)
+ will_paginate (= 3.1.7)
BUNDLED WITH
- 1.17.1
+ 1.17.3
diff --git a/app/assets/images/branding/apple-splash.png b/app/assets/images/branding/apple-splash.png
deleted file mode 100644
index 8ba65c01d..000000000
--- a/app/assets/images/branding/apple-splash.png
+++ /dev/null
Binary files differ
diff --git a/app/assets/images/branding/logos/app-icon-512.png b/app/assets/images/branding/logos/app-icon-512.png
new file mode 100644
index 000000000..ec40b1115
--- /dev/null
+++ b/app/assets/images/branding/logos/app-icon-512.png
Binary files differ
diff --git a/app/assets/images/branding/logos/app-icon.png b/app/assets/images/branding/logos/app-icon.png
new file mode 100644
index 000000000..8c822f46c
--- /dev/null
+++ b/app/assets/images/branding/logos/app-icon.png
Binary files differ
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,
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;
+ }
}
}
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/manifest_controller.rb b/app/controllers/manifest_controller.rb
new file mode 100644
index 000000000..b4c4c7b82
--- /dev/null
+++ b/app/controllers/manifest_controller.rb
@@ -0,0 +1,27 @@
+# frozen_string_literal: true
+
+class ManifestController < ApplicationController
+ def show # rubocop:disable Metrics/MethodLength
+ render json: {
+ short_name: AppConfig.settings.pod_name,
+ name: AppConfig.settings.pod_name,
+ description: "diaspora* is a free, decentralized and privacy-respecting social network",
+ icons: [
+ {
+ src: helpers.image_path("branding/logos/app-icon.png"),
+ type: "image/png",
+ sizes: "192x192"
+ },
+ {
+ src: helpers.image_path("branding/logos/app-icon-512.png"),
+ type: "image/png",
+ sizes: "512x512"
+ }
+ ],
+ start_url: "/",
+ background_color: "#000000",
+ display: "standalone",
+ theme_color: "#000000"
+ }
+ 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..8dafbf3c4
--- /dev/null
+++ b/app/controllers/two_factor_authentications_controller.rb
@@ -0,0 +1,55 @@
+# 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 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[:alert] = t("users.destroy.wrong_password")
+ 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
+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..8d30efa97 100644
--- a/app/models/user.rb
+++ b/app/models/user.rb
@@ -19,7 +19,14 @@ 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,
+ attr_encrypted :otp_secret, if: false, prefix: "plain_"
+
+ devise :two_factor_authenticatable,
+ :two_factor_backupable,
+ 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 +49,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/services/diaspora_link_service.rb b/app/services/diaspora_link_service.rb
index 1923aa01d..ca8ffea76 100644
--- a/app/services/diaspora_link_service.rb
+++ b/app/services/diaspora_link_service.rb
@@ -10,7 +10,11 @@ class DiasporaLinkService
end
def find_or_fetch_entity
- entity_finder.find || fetch_entity
+ if type && guid
+ entity_finder.find || fetch_entity
+ elsif author
+ find_or_fetch_person
+ end
end
private
@@ -28,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://") ||
@@ -38,8 +48,10 @@ 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
+ else
+ @author = %r{^diaspora://(#{Validation::Rule::DiasporaId::DIASPORA_ID_REGEX})$}u.match(link)&.captures&.first
+ end
end
end
diff --git a/app/views/devise/confirmations/new.html.haml b/app/views/devise/confirmations/new.html.haml
index 04965f756..b1a4555d8 100644
--- a/app/views/devise/confirmations/new.html.haml
+++ b/app/views/devise/confirmations/new.html.haml
@@ -1,10 +1,10 @@
%h2 Resend confirmation instructions
= form_for(resource, :as => resource_name, :url => confirmation_path(resource_name)) do |f|
- = devise_error_messages!
+ = render partial: "devise/shared/error_messages"
%p
= f.label :email
%br/
= f.text_field :email
%p
= f.submit t('.resend_confirmation')
-= render :partial => "devise/shared/links"
+= render partial: "devise/shared/links"
diff --git a/app/views/devise/passwords/edit.mobile.haml b/app/views/devise/passwords/edit.mobile.haml
index a9d7df344..b3d758b12 100644
--- a/app/views/devise/passwords/edit.mobile.haml
+++ b/app/views/devise/passwords/edit.mobile.haml
@@ -6,7 +6,7 @@
.login-form
.login-container
= form_for(resource, as: resource_name, url: password_path(resource_name), html: { method: :put }) do |f|
- = devise_error_messages!
+ = render partial: "devise/shared/error_messages", formats: [:html]
= f.hidden_field :reset_password_token
%fieldset
%legend
diff --git a/app/views/devise/passwords/new.haml b/app/views/devise/passwords/new.haml
index 627aa3a1d..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|
- - if !devise_error_messages!.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/app/views/devise/passwords/new.mobile.haml b/app/views/devise/passwords/new.mobile.haml
index af496b0bf..63bcedfd8 100644
--- a/app/views/devise/passwords/new.mobile.haml
+++ b/app/views/devise/passwords/new.mobile.haml
@@ -9,7 +9,7 @@
%fieldset
%legend
=t('devise.passwords.new.forgot_password')
- - unless devise_error_messages!.empty?
+ - unless resource.errors.empty?
%i= t('devise.passwords.new.no_account')
.control-group
diff --git a/app/views/devise/unlocks/new.html.haml b/app/views/devise/unlocks/new.html.haml
index 6fff589eb..d3f1d629d 100644
--- a/app/views/devise/unlocks/new.html.haml
+++ b/app/views/devise/unlocks/new.html.haml
@@ -1,10 +1,10 @@
%h2 Resend unlock instructions
= form_for(resource, :as => resource_name, :url => unlock_path(resource_name)) do |f|
- = devise_error_messages!
+ = render partial: "devise/shared/error_messages"
%p
= f.label :email
%br/
= f.text_field :email
%p
= f.submit t('.resend_unlock')
-= render :partial => "devise/shared/links"
+= render partial: "devise/shared/links"
diff --git a/app/views/application/_head.haml b/app/views/layouts/_head.haml
index c8587e9d5..a85a96c74 100644
--- a/app/views/application/_head.haml
+++ b/app/views/layouts/_head.haml
@@ -4,7 +4,7 @@
%meta{charset: "utf-8"}/
= content_for?(:meta_data) ? yield(:meta_data) : metas_tags
-%meta{content: "yes", name: "mobile-web-app-capable"}/
+%link{rel: "manifest", href: "/manifest.json"}
/ favicon
/ For Apple devices
diff --git a/app/views/layouts/application.html.haml b/app/views/layouts/application.html.haml
index a50e428aa..63decb11f 100644
--- a/app/views/layouts/application.html.haml
+++ b/app/views/layouts/application.html.haml
@@ -12,7 +12,7 @@
= load_javascript_locales
= include_color_theme
- = render "head"
+ = render "layouts/head"
= translation_missing_warnings
%body{class: "page-#{controller_name} action-#{action_name}"}
diff --git a/app/views/layouts/application.mobile.haml b/app/views/layouts/application.mobile.haml
index 233122575..e9667dbbe 100644
--- a/app/views/layouts/application.mobile.haml
+++ b/app/views/layouts/application.mobile.haml
@@ -9,7 +9,7 @@
= javascript_include_tag "mobile/mobile"
= load_javascript_locales
- = render "head"
+ = render "layouts/head"
= include_color_theme "mobile"
%meta{name: "viewport", content: "width=device-width, minimum-scale=1, maximum-scale=1, user-scalable=no"}/
@@ -17,11 +17,6 @@
%meta{name: "MobileOptimized", content: "320"}/
%meta{"http-equiv" => "cleartype", :content => "on"}/
- / iOS mobile web app indicator
- / NOTE(we will enable these once we don't have to rely on back/forward buttons anymore)
- /%meta{:name => "apple-mobile-web-app-capable", :content => "yes"}
- /%link{:rel => "apple-touch-startup-image", :href => "/images/apple-splash.png"}
-
%body
#app
= render "layouts/header"
diff --git a/app/views/sessions/two_factor.html.haml b/app/views/sessions/two_factor.html.haml
new file mode 100644
index 000000000..76c29bbd4
--- /dev/null
+++ b/app/views/sessions/two_factor.html.haml
@@ -0,0 +1,31 @@
+- 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")
+ %i.entypo-lock
+ = 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"
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..501f2cb2c
--- /dev/null
+++ b/app/views/two_factor_authentications/_deactivate.haml
@@ -0,0 +1,27 @@
+.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 :password, t("users.edit.current_password"), class: "control-label col-sm-6"
+ .col-sm-6
+ = f.password_field :password, class: "form-control"
+ .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/defaults.yml b/config/defaults.yml
index 596615fdc..5bfe79979 100644
--- a/config/defaults.yml
+++ b/config/defaults.yml
@@ -4,7 +4,7 @@
defaults:
version:
- number: "0.7.10.0" # Do not touch unless doing a release, do not backport the version number that's in master
+ number: "0.7.11.0" # Do not touch unless doing a release, do not backport the version number that's in master
heroku: false
environment:
url: "http://localhost:3000/"
diff --git a/config/initializers/devise.rb b/config/initializers/devise.rb
index bdd334b26..327cef80e 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.
@@ -92,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.
@@ -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/initializers/secure_headers.rb b/config/initializers/secure_headers.rb
index d76d345b5..99d515ac2 100644
--- a/config/initializers/secure_headers.rb
+++ b/config/initializers/secure_headers.rb
@@ -16,7 +16,8 @@ SecureHeaders::Configuration.default do |config|
media_src: %w[https:],
script_src: %w['self' blob: 'unsafe-eval' platform.twitter.com cdn.syndication.twimg.com widgets.flickr.com
embedr.flickr.com www.instagram.com 'unsafe-inline'],
- style_src: %w['self' 'unsafe-inline' platform.twitter.com *.twimg.com]
+ style_src: %w['self' 'unsafe-inline' platform.twitter.com *.twimg.com],
+ manifest_src: %w['self']
}
if AppConfig.environment.assets.host.present?
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.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/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. <br /> Интервалите са просто за по-лесно четене, моля, въведете кода без тях."
+ 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. <br /> 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/en.yml b/config/locales/diaspora/en.yml
index 88ee05b20..6e8a8a096 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 your password"
+ 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. <br /> 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: "&laquo; previous"
next_label: "next &raquo;"
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.<br />
+ 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. <br /> 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を入力してください。 <br />スペースは読みやすくするためのものです。スペースを入れずにコードを入力してください。"
+ 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. <br /> 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:
diff --git a/config/routes.rb b/config/routes.rb
index 873299b9a..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
@@ -239,4 +245,5 @@ Rails.application.routes.draw do
end
get ".well-known/openid-configuration", to: "api/openid_connect/discovery#configuration"
+ get "manifest.json", to: "manifest#show"
end
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..47280dd20
--- /dev/null
+++ b/db/migrate/20171229175654_add_devise_two_factor_to_users.rb
@@ -0,0 +1,13 @@
+# frozen_string_literal: true
+
+class AddDeviseTwoFactorToUsers < ActiveRecord::Migration[5.1]
+ def change
+ 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/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/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
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/features/desktop/change_password.feature b/features/desktop/change_password.feature
index f37ebe045..695193249 100644
--- a/features/desktop/change_password.feature
+++ b/features/desktop/change_password.feature
@@ -25,12 +25,11 @@ 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
- 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
@@ -50,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/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/desktop/two_factor_authentication.feature b/features/desktop/two_factor_authentication.feature
new file mode 100644
index 000000000..1e2e8a61f
--- /dev/null
+++ b/features/desktop/two_factor_authentication.feature
@@ -0,0 +1,80 @@
+# 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"
+ 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 password
+ Given a user with email "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 put in my password in "two_factor_authentication_password"
+ And I press "Deactivate"
+ Then I should see "Two-factor authentication not activated"
+
+ Scenario: Trying to deactivate with incorrect password
+ Given a user with email "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 "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/mobile/change_password.feature b/features/mobile/change_password.feature
index f30edb215..8f7c0c060 100644
--- a/features/mobile/change_password.feature
+++ b/features/mobile/change_password.feature
@@ -27,13 +27,12 @@ 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
- 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
@@ -53,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/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..f84f3526a
--- /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..f0d6a8c46
--- /dev/null
+++ b/features/step_definitions/publisher_steps.rb
@@ -0,0 +1,75 @@
+# 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/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/stream_steps.rb b/features/step_definitions/stream_steps.rb
index 5d241eaa0..853df81ca 100644
--- a/features/step_definitions/stream_steps.rb
+++ b/features/step_definitions/stream_steps.rb
@@ -4,6 +4,31 @@ 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
@@ -24,8 +49,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
diff --git a/features/step_definitions/two_factor_steps.rb b/features/step_definitions/two_factor_steps.rb
new file mode 100644
index 000000000..40e3cd7de
--- /dev/null
+++ b/features/step_definitions/two_factor_steps.rb
@@ -0,0 +1,51 @@
+# 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 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 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/graphics/app-icon.svg b/graphics/app-icon.svg
new file mode 100644
index 000000000..f573a1396
--- /dev/null
+++ b/graphics/app-icon.svg
@@ -0,0 +1,4 @@
+<svg version="1.1" viewBox="0 0 65.131 65.131" xmlns="http://www.w3.org/2000/svg">
+ <path d="m28.214 64.754c-6.9441-0.80647-14.478-4.7044-19.429-10.053-8.1024-8.7516-10.823-21.337-7.0178-32.463 3.8465-11.248 12.917-19.153 24.746-21.569 7.2561-1.4817 14.813-0.27619 21.622 3.4495 7.517 4.1126 12.568 10.251 15.291 18.582 5.5678 17.038-4.1941 35.667-21.417 40.87-4.6929 1.4178-8.7675 1.7673-13.795 1.1834zm0.43913-17.263c2.0058-2.7986 3.7663-5.0883 3.9123-5.0883 0.14591 0 1.9109 2.2959 3.9221 5.102 2.0112 2.8061 3.827 5.0577 4.0349 5.0035 0.90081-0.23467 8.2871-5.9034 8.1633-6.265-0.07527-0.21984-1.7555-2.6427-3.7338-5.3842-1.9783-2.7414-3.552-5.0223-3.497-5.0686 0.05497-0.04629 2.8095-0.97845 6.1211-2.0715 3.3117-1.093 6.0224-2.1432 6.0239-2.3338 0.0073-0.92502-2.9094-9.4312-3.283-9.5746-0.23567-0.09043-2.9906 0.68953-6.1221 1.7332-3.1315 1.0437-5.8046 1.8977-5.9404 1.8977-0.13575 0-0.28828-2.9385-0.33895-6.53l-0.09213-6.53h-10.516l-0.09213 6.53c-0.05067 3.5915-0.20809 6.53-0.34982 6.53s-2.9544-0.90204-6.2504-2.0045l-5.9927-2.0045-1.5444 4.6339c-0.8494 2.5487-1.5444 4.866-1.5444 5.1496 0 0.36743 1.7311 1.087 6.0212 2.503 3.3117 1.093 6.0662 2.0252 6.1211 2.0715 0.05497 0.04629-1.5187 2.3272-3.497 5.0686-1.9783 2.7415-3.6605 5.1643-3.7382 5.3842-0.14163 0.40073 7.4833 6.2827 8.1896 6.3175 0.20673 0.01021 2.017-2.2712 4.0228-5.0698z" fill="#3e4142" stroke-width=".33922"/>
+ <path d="m23.631 51.953c-2.348-1.5418-6.9154-5.1737-7.0535-5.6088-0.06717-0.21164 0.45125-0.99318 3.3654-5.0734 2.269-3.177 3.7767-5.3581 3.7767-5.4637 0-0.03748-1.6061-0.60338-3.5691-1.2576-6.1342-2.0442-8.3916-2.9087-8.5288-3.2663-0.03264-0.08506 0.09511-0.68598 0.28388-1.3354 0.643-2.212 2.7038-8.4123 2.7959-8.4123 0.05052 0 2.6821 0.85982 5.848 1.9107 3.1659 1.0509 5.897 1.9222 6.0692 1.9362 0.3089 0.02514 0.31402 0.01925 0.38295-0.44107 0.09851-0.65784 0.26289-5.0029 0.2633-6.9599 1.87e-4 -0.90267 0.02801-2.5298 0.06184-3.6158l0.0615-1.9746h10.392l0.06492 4.4556c0.06287 4.3148 0.18835 7.8236 0.29865 8.3513 0.0295 0.14113 0.11236 0.2566 0.18412 0.2566 0.07176 0 1.6955-0.50861 3.6084-1.1303 4.5213-1.4693 6.2537-2.0038 7.3969-2.2822 0.87349-0.21269 0.94061-0.21704 1.0505-0.06806 0.45169 0.61222 3.3677 9.2365 3.1792 9.4025-0.33681 0.29628-2.492 1.1048-6.9823 2.6194-5.3005 1.7879-5.1321 1.7279-5.1321 1.8283 0 0.13754 0.95042 1.522 3.5468 5.1666 1.3162 1.8475 2.6802 3.7905 3.0311 4.3176l0.63804 0.95842-0.27216 0.28519c-1.1112 1.1644-7.3886 5.8693-7.8309 5.8693-0.22379 0-1.2647-1.2321-2.9284-3.4663-0.90374-1.2137-2.264-3.0402-3.0228-4.059-0.75878-1.0188-1.529-2.0203-1.7116-2.2256l-0.33201-0.37324-0.32674 0.37324c-0.43918 0.50169-2.226 2.867-3.8064 5.0388-2.1662 2.9767-3.6326 4.8055-3.8532 4.8055-0.05161 0-0.4788-0.25278-0.94931-0.56173z" fill="#fff" stroke-width=".093311"/>
+</svg>
diff --git a/lib/configuration_methods.rb b/lib/configuration_methods.rb
index 511e8e2d2..58a050f8c 100644
--- a/lib/configuration_methods.rb
+++ b/lib/configuration_methods.rb
@@ -52,18 +52,17 @@ 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
@@ -71,6 +70,7 @@ module Configuration
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/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
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..e17a6e3ca
--- /dev/null
+++ b/spec/controllers/two_factor_authentications_controller_spec.rb
@@ -0,0 +1,119 @@
+# 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.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 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 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("users.destroy.wrong_password")
+ 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/lib/diaspora/federation/entities_spec.rb b/spec/lib/diaspora/federation/entities_spec.rb
index 51e67a177..03f625573 100644
--- a/spec/lib/diaspora/federation/entities_spec.rb
+++ b/spec/lib/diaspora/federation/entities_spec.rb
@@ -63,7 +63,7 @@ describe Diaspora::Federation::Entities do
expect(federation_entity.parent_guid).to eq(diaspora_entity.post.guid)
expect(federation_entity.text).to eq(diaspora_entity.text)
expect(federation_entity.created_at).to eq(diaspora_entity.created_at)
- expect(federation_entity.edited_at).to eq(edited_at)
+ expect(federation_entity.edited_at).to be_within(1.second).of(edited_at)
expect(federation_entity.author_signature).to eq(diaspora_entity.signature.author_signature)
expect(federation_entity.signature_order.map(&:to_s)).to eq(diaspora_entity.signature.signature_order.order.split)
expect(federation_entity.additional_data).to eq(diaspora_entity.signature.additional_data)
diff --git a/spec/lib/diaspora/federation/receive_spec.rb b/spec/lib/diaspora/federation/receive_spec.rb
index deaea880e..1b3e087e7 100644
--- a/spec/lib/diaspora/federation/receive_spec.rb
+++ b/spec/lib/diaspora/federation/receive_spec.rb
@@ -110,7 +110,8 @@ describe Diaspora::Federation::Receive do
expect(comment.signature).not_to be_nil
expect(comment.signature.author_signature).to eq("aa")
- expect(comment.signature.additional_data).to eq("new_property" => "data", "edited_at" => comment_entity.edited_at)
+ expect(comment.signature.additional_data["new_property"]).to eq("data")
+ expect(comment.signature.additional_data["edited_at"]).to be_within(1.second).of(comment_entity.edited_at)
expect(comment.signature.order).to eq(comment_entity.signature_order.map(&:to_s))
end
diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb
index d264493a8..560432927 100644
--- a/spec/models/user_spec.rb
+++ b/spec/models/user_spec.rb
@@ -983,6 +983,11 @@ describe User, :type => :model do
post_default_public
exported_at
exported_photos_at
+ consumed_timestep
+ plain_otp_secret
+ otp_backup_codes
+ otp_required_for_login
+ otp_secret
)
)
end
diff --git a/spec/services/diaspora_link_service_spec.rb b/spec/services/diaspora_link_service_spec.rb
index bde411a27..c65004e31 100644
--- a/spec/services/diaspora_link_service_spec.rb
+++ b/spec/services/diaspora_link_service_spec.rb
@@ -40,5 +40,33 @@ 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
+
+ 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