Browse Source

Merge tag 'v3.1.2'

Mike Barnes 4 months ago
parent
commit
2f69e82069
33 changed files with 570 additions and 393 deletions
  1. 26
    0
      CHANGELOG.md
  2. 16
    5
      Dockerfile
  3. 6
    6
      Gemfile
  4. 20
    22
      Gemfile.lock
  5. 1
    1
      app/controllers/accounts_controller.rb
  6. 1
    1
      app/controllers/api/v1/announcements_controller.rb
  7. 10
    17
      app/controllers/api/v1/statuses/bookmarks_controller.rb
  8. 1
    2
      app/controllers/api/v1/statuses/favourited_by_accounts_controller.rb
  9. 9
    17
      app/controllers/api/v1/statuses/favourites_controller.rb
  10. 1
    2
      app/controllers/api/v1/statuses/reblogged_by_accounts_controller.rb
  11. 14
    13
      app/controllers/api/v1/statuses/reblogs_controller.rb
  12. 1
    2
      app/controllers/auth/registrations_controller.rb
  13. 3
    0
      app/javascript/mastodon/base_polyfills.js
  14. 22
    3
      app/javascript/mastodon/components/error_boundary.js
  15. 2
    1
      app/javascript/mastodon/load_polyfills.js
  16. 1
    1
      app/javascript/mastodon/main.js
  17. 4
    3
      app/services/activitypub/process_account_service.rb
  18. 2
    0
      app/services/backup_service.rb
  19. 2
    3
      app/services/follow_service.rb
  20. 1
    1
      app/services/resolve_account_service.rb
  21. 3
    3
      app/views/admin/accounts/show.html.haml
  22. 1
    1
      app/views/auth/registrations/new.html.haml
  23. 6
    0
      app/views/authorize_interactions/show.html.haml
  24. 1
    0
      config/locales/en.yml
  25. 7
    0
      lib/mastodon/accounts_cli.rb
  26. 2
    6
      lib/mastodon/migration_helpers.rb
  27. 1
    1
      lib/mastodon/version.rb
  28. 16
    14
      package.json
  29. 49
    18
      spec/controllers/api/v1/statuses/bookmarks_controller_spec.rb
  30. 59
    27
      spec/controllers/api/v1/statuses/favourites_controller_spec.rb
  31. 59
    27
      spec/controllers/api/v1/statuses/reblogs_controller_spec.rb
  32. 24
    4
      spec/controllers/auth/registrations_controller_spec.rb
  33. 199
    192
      yarn.lock

+ 26
- 0
CHANGELOG.md View File

@@ -3,6 +3,32 @@ Changelog
3 3
 
4 4
 All notable changes to this project will be documented in this file.
5 5
 
6
+## [v3.1.2] - 2020-02-27
7
+### Added
8
+
9
+- Add `--reset-password` option to `tootctl accounts modify` ([ThibG](https://github.com/tootsuite/mastodon/pull/13126))
10
+- Add source-mapped stacktrace to error message in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/13082))
11
+
12
+### Fixed
13
+
14
+- Fix dismissing an announcement twice raising an obscure error ([ThibG](https://github.com/tootsuite/mastodon/pull/13124))
15
+- Fix misleading error when attempting to re-send a pending follow request ([ThibG](https://github.com/tootsuite/mastodon/pull/13133))
16
+- Fix backups failing when files are missing from media attachments ([ThibG](https://github.com/tootsuite/mastodon/pull/13146))
17
+- Fix duplicate accounts being created when fetching an account for its key only ([ThibG](https://github.com/tootsuite/mastodon/pull/13147))
18
+- Fix `/web` redirecting to `/web/web` in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/13128))
19
+- Fix previously OStatus-based accounts not being detected as ActivityPub ([ThibG](https://github.com/tootsuite/mastodon/pull/13129))
20
+- Fix account JSON/RSS not being cacheable due to wrong mime type comparison ([ThibG](https://github.com/tootsuite/mastodon/pull/13116))
21
+- Fix old browsers crashing because of missing `finally` polyfill in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/13115))
22
+- Fix account's bio not being shown if there are no proofs/fields in admin UI ([ThibG](https://github.com/tootsuite/mastodon/pull/13075))
23
+- Fix sign-ups without checked user agreement being accepted through the web form ([ThibG](https://github.com/tootsuite/mastodon/pull/13088))
24
+- Fix non-x64 architectures not being able to build Docker image because of hardcoded Node.js architecture ([SaraSmiseth](https://github.com/tootsuite/mastodon/pull/13081))
25
+- Fix invite request input not being shown on sign-up error if left empty ([ThibG](https://github.com/tootsuite/mastodon/pull/13089))
26
+- Fix some migration hints mentioning GitLab instead of Mastodon ([saper](https://github.com/tootsuite/mastodon/pull/13084))
27
+
28
+### Security
29
+
30
+- Fix leak of arbitrary statuses through unfavourite action in REST API ([Gargron](https://github.com/tootsuite/mastodon/pull/13161))
31
+
6 32
 ## [3.1.1] - 2020-02-10
7 33
 ### Fixed
8 34
 

+ 16
- 5
Dockerfile View File

@@ -5,14 +5,25 @@ SHELL ["bash", "-c"]
5 5
 
6 6
 # Install Node v12 (LTS)
7 7
 ENV NODE_VER="12.14.0"  
8
-RUN	echo "Etc/UTC" > /etc/localtime && \
8
+RUN	ARCH= && \
9
+    dpkgArch="$(dpkg --print-architecture)" && \
10
+  case "${dpkgArch##*-}" in \
11
+    amd64) ARCH='x64';; \
12
+    ppc64el) ARCH='ppc64le';; \
13
+    s390x) ARCH='s390x';; \
14
+    arm64) ARCH='arm64';; \
15
+    armhf) ARCH='armv7l';; \
16
+    i386) ARCH='x86';; \
17
+    *) echo "unsupported architecture"; exit 1 ;; \
18
+  esac && \
19
+    echo "Etc/UTC" > /etc/localtime && \
9 20
 	apt update && \
10 21
 	apt -y install wget python && \
11 22
 	cd ~ && \
12
-	wget https://nodejs.org/download/release/v$NODE_VER/node-v$NODE_VER-linux-x64.tar.gz && \
13
-	tar xf node-v$NODE_VER-linux-x64.tar.gz && \
14
-	rm node-v$NODE_VER-linux-x64.tar.gz && \
15
-	mv node-v$NODE_VER-linux-x64 /opt/node
23
+	wget https://nodejs.org/download/release/v$NODE_VER/node-v$NODE_VER-linux-$ARCH.tar.gz && \
24
+	tar xf node-v$NODE_VER-linux-$ARCH.tar.gz && \
25
+	rm node-v$NODE_VER-linux-$ARCH.tar.gz && \
26
+	mv node-v$NODE_VER-linux-$ARCH /opt/node
16 27
 
17 28
 # Install jemalloc
18 29
 ENV JE_VER="5.2.1"

+ 6
- 6
Gemfile View File

@@ -9,7 +9,7 @@ gem 'puma', '~> 4.3'
9 9
 gem 'rails', '~> 5.2.4'
10 10
 gem 'sprockets', '~> 3.7.2'
11 11
 gem 'thor', '~> 0.20'
12
-gem 'rack', '~> 2.1.2'
12
+gem 'rack', '~> 2.2.2'
13 13
 
14 14
 gem 'thwait', '~> 0.1.0'
15 15
 gem 'e2mmap', '~> 0.1.0'
@@ -101,14 +101,14 @@ gem 'webpacker', '~> 4.2'
101 101
 gem 'webpush'
102 102
 
103 103
 gem 'json-ld'
104
-gem 'json-ld-preloaded', '~> 3.0'
104
+gem 'json-ld-preloaded', '~> 3.1'
105 105
 gem 'rdf-normalize', '~> 0.4'
106 106
 
107 107
 group :development, :test do
108 108
   gem 'fabrication', '~> 2.21'
109 109
   gem 'fuubar', '~> 2.5'
110 110
   gem 'i18n-tasks', '~> 0.9', require: false
111
-  gem 'pry-byebug', '~> 3.7'
111
+  gem 'pry-byebug', '~> 3.8'
112 112
   gem 'pry-rails', '~> 0.3'
113 113
   gem 'rspec-rails', '~> 3.9'
114 114
 end
@@ -118,13 +118,13 @@ group :production, :test do
118 118
 end
119 119
 
120 120
 group :test do
121
-  gem 'capybara', '~> 3.30'
121
+  gem 'capybara', '~> 3.31'
122 122
   gem 'climate_control', '~> 0.2'
123 123
   gem 'faker', '~> 2.10'
124 124
   gem 'microformats', '~> 4.2'
125 125
   gem 'rails-controller-testing', '~> 1.0'
126 126
   gem 'rspec-sidekiq', '~> 3.0'
127
-  gem 'simplecov', '~> 0.17', require: false
127
+  gem 'simplecov', '~> 0.18', require: false
128 128
   gem 'webmock', '~> 3.8'
129 129
   gem 'parallel_tests', '~> 2.30'
130 130
 end
@@ -136,7 +136,7 @@ group :development do
136 136
   gem 'binding_of_caller', '~> 0.7'
137 137
   gem 'bullet', '~> 6.1'
138 138
   gem 'letter_opener', '~> 1.7'
139
-  gem 'letter_opener_web', '~> 1.3'
139
+  gem 'letter_opener_web', '~> 1.4'
140 140
   gem 'memory_profiler'
141 141
   gem 'rubocop', '~> 0.79', require: false
142 142
   gem 'rubocop-rails', '~> 2.4', require: false

+ 20
- 22
Gemfile.lock View File

@@ -127,7 +127,7 @@ GEM
127 127
     bundler-audit (0.6.1)
128 128
       bundler (>= 1.2.0, < 3)
129 129
       thor (~> 0.18)
130
-    byebug (11.0.0)
130
+    byebug (11.1.1)
131 131
     capistrano (3.11.2)
132 132
       airbrussh (>= 1.0.0)
133 133
       i18n
@@ -144,7 +144,7 @@ GEM
144 144
       sshkit (~> 1.3)
145 145
     capistrano-yarn (2.0.2)
146 146
       capistrano (~> 3.0)
147
-    capybara (3.30.0)
147
+    capybara (3.31.0)
148 148
       addressable
149 149
       mini_mime (>= 0.1.3)
150 150
       nokogiri (~> 1.8)
@@ -311,10 +311,9 @@ GEM
311 311
       multi_json (~> 1.14)
312 312
       rack (~> 2.0)
313 313
       rdf (~> 3.1)
314
-    json-ld-preloaded (3.0.6)
315
-      json-ld (~> 3.0)
316
-      multi_json (~> 1.12)
317
-      rdf (~> 3.0)
314
+    json-ld-preloaded (3.1.0)
315
+      json-ld (~> 3.1)
316
+      rdf (~> 3.1)
318 317
     jsonapi-renderer (0.2.2)
319 318
     jwt (2.1.0)
320 319
     kaminari (1.1.1)
@@ -333,7 +332,7 @@ GEM
333 332
       addressable (~> 2.3)
334 333
     letter_opener (1.7.0)
335 334
       launchy (~> 2.2)
336
-    letter_opener_web (1.3.4)
335
+    letter_opener_web (1.4.0)
337 336
       actionmailer (>= 3.2)
338 337
       letter_opener (~> 1.0)
339 338
       railties (>= 3.2)
@@ -375,7 +374,7 @@ GEM
375 374
       net-ssh (>= 2.6.5, < 6.0.0)
376 375
     net-ssh (5.2.0)
377 376
     nio4r (2.5.2)
378
-    nokogiri (1.10.7)
377
+    nokogiri (1.10.8)
379 378
       mini_portile2 (~> 2.4.0)
380 379
     nokogumbo (2.0.1)
381 380
       nokogiri (~> 1.8, >= 1.8.4)
@@ -418,7 +417,7 @@ GEM
418 417
     pg (1.2.2)
419 418
     pghero (2.4.1)
420 419
       activerecord (>= 5)
421
-    pkg-config (1.4.0)
420
+    pkg-config (1.4.1)
422 421
     premailer (1.11.1)
423 422
       addressable
424 423
       css_parser (>= 1.6.0)
@@ -430,7 +429,7 @@ GEM
430 429
     pry (0.12.2)
431 430
       coderay (~> 1.1.0)
432 431
       method_source (~> 0.9.0)
433
-    pry-byebug (3.7.0)
432
+    pry-byebug (3.8.0)
434 433
       byebug (~> 11.0)
435 434
       pry (~> 0.10)
436 435
     pry-rails (0.3.9)
@@ -441,7 +440,7 @@ GEM
441 440
     pundit (2.1.0)
442 441
       activesupport (>= 3.0.0)
443 442
     raabro (1.1.6)
444
-    rack (2.1.2)
443
+    rack (2.2.2)
445 444
     rack-attack (6.2.2)
446 445
       rack (>= 1.0, < 3)
447 446
     rack-cors (1.1.1)
@@ -550,7 +549,7 @@ GEM
550 549
       rainbow (>= 2.2.2, < 4.0)
551 550
       ruby-progressbar (~> 1.7)
552 551
       unicode-display_width (>= 1.4.0, < 1.7)
553
-    rubocop-rails (2.4.1)
552
+    rubocop-rails (2.4.2)
554 553
       rack (>= 1.1)
555 554
       rubocop (>= 0.72.0)
556 555
     ruby-progressbar (1.10.1)
@@ -584,11 +583,10 @@ GEM
584 583
     simple_form (5.0.1)
585 584
       actionpack (>= 5.0)
586 585
       activemodel (>= 5.0)
587
-    simplecov (0.17.1)
586
+    simplecov (0.18.2)
588 587
       docile (~> 1.1)
589
-      json (>= 1.8, < 3)
590
-      simplecov-html (~> 0.10.0)
591
-    simplecov-html (0.10.2)
588
+      simplecov-html (~> 0.11)
589
+    simplecov-html (0.12.0)
592 590
     sprockets (3.7.2)
593 591
       concurrent-ruby (~> 1.0)
594 592
       rack (> 1, < 3)
@@ -680,7 +678,7 @@ DEPENDENCIES
680 678
   capistrano-rails (~> 1.4)
681 679
   capistrano-rbenv (~> 2.1)
682 680
   capistrano-yarn (~> 2.0)
683
-  capybara (~> 3.30)
681
+  capybara (~> 3.31)
684 682
   charlock_holmes (~> 0.7.7)
685 683
   chewy (~> 5.1)
686 684
   cld3 (~> 3.2.6)
@@ -714,10 +712,10 @@ DEPENDENCIES
714 712
   idn-ruby
715 713
   iso-639
716 714
   json-ld
717
-  json-ld-preloaded (~> 3.0)
715
+  json-ld-preloaded (~> 3.1)
718 716
   kaminari (~> 1.1)
719 717
   letter_opener (~> 1.7)
720
-  letter_opener_web (~> 1.3)
718
+  letter_opener_web (~> 1.4)
721 719
   link_header (~> 0.0)
722 720
   lograge (~> 0.11)
723 721
   makara (~> 0.4)
@@ -745,11 +743,11 @@ DEPENDENCIES
745 743
   posix-spawn!
746 744
   premailer-rails
747 745
   private_address_check (~> 0.5)
748
-  pry-byebug (~> 3.7)
746
+  pry-byebug (~> 3.8)
749 747
   pry-rails (~> 0.3)
750 748
   puma (~> 4.3)
751 749
   pundit (~> 2.1)
752
-  rack (~> 2.1.2)
750
+  rack (~> 2.2.2)
753 751
   rack-attack (~> 6.2)
754 752
   rack-cors (~> 1.1)
755 753
   rails (~> 5.2.4)
@@ -773,7 +771,7 @@ DEPENDENCIES
773 771
   sidekiq-unique-jobs (~> 6.0)
774 772
   simple-navigation (~> 4.1)
775 773
   simple_form (~> 5.0)
776
-  simplecov (~> 0.17)
774
+  simplecov (~> 0.18)
777 775
   sprockets (~> 3.7.2)
778 776
   sprockets-rails (~> 3.2)
779 777
   stackprof

+ 1
- 1
app/controllers/accounts_controller.rb View File

@@ -9,7 +9,7 @@ class AccountsController < ApplicationController
9 9
   before_action :set_cache_headers
10 10
   before_action :set_body_classes
11 11
 
12
-  skip_around_action :set_locale, if: -> { [:json, :rss].include?(request.format) }
12
+  skip_around_action :set_locale, if: -> { [:json, :rss].include?(request.format&.to_sym) }
13 13
   skip_before_action :require_functional!
14 14
 
15 15
   def show

+ 1
- 1
app/controllers/api/v1/announcements_controller.rb View File

@@ -11,7 +11,7 @@ class Api::V1::AnnouncementsController < Api::BaseController
11 11
   end
12 12
 
13 13
   def dismiss
14
-    AnnouncementMute.create!(account: current_account, announcement: @announcement)
14
+    AnnouncementMute.find_or_create_by!(account: current_account, announcement: @announcement)
15 15
     render_empty
16 16
   end
17 17
 

+ 10
- 17
app/controllers/api/v1/statuses/bookmarks_controller.rb View File

@@ -5,35 +5,28 @@ class Api::V1::Statuses::BookmarksController < Api::BaseController
5 5
 
6 6
   before_action -> { doorkeeper_authorize! :write, :'write:bookmarks' }
7 7
   before_action :require_user!
8
+  before_action :set_status
8 9
 
9 10
   respond_to :json
10 11
 
11 12
   def create
12
-    @status = bookmarked_status
13
+    current_account.bookmarks.find_or_create_by!(account: current_account, status: @status)
13 14
     render json: @status, serializer: REST::StatusSerializer
14 15
   end
15 16
 
16 17
   def destroy
17
-    @status = requested_status
18
-    @bookmarks_map = { @status.id => false }
18
+    bookmark = current_account.bookmarks.find_by(status: @status)
19
+    bookmark&.destroy!
19 20
 
20
-    bookmark = Bookmark.find_by!(account: current_user.account, status: @status)
21
-    bookmark.destroy!
22
-
23
-    render json: @status, serializer: REST::StatusSerializer, relationships: StatusRelationshipsPresenter.new([@status], current_user&.account_id, bookmarks_map: @bookmarks_map)
21
+    render json: @status, serializer: REST::StatusSerializer, relationships: StatusRelationshipsPresenter.new([@status], current_account.id, bookmarks_map: { @status.id => false })
24 22
   end
25 23
 
26 24
   private
27 25
 
28
-  def bookmarked_status
29
-    authorize_with current_user.account, requested_status, :show?
30
-
31
-    bookmark = Bookmark.find_or_create_by!(account: current_user.account, status: requested_status)
32
-
33
-    bookmark.status.reload
34
-  end
35
-
36
-  def requested_status
37
-    Status.find(params[:status_id])
26
+  def set_status
27
+    @status = Status.find(params[:status_id])
28
+    authorize @status, :show?
29
+  rescue Mastodon::NotPermittedError
30
+    not_found
38 31
   end
39 32
 end

+ 1
- 2
app/controllers/api/v1/statuses/favourited_by_accounts_controller.rb View File

@@ -69,8 +69,7 @@ class Api::V1::Statuses::FavouritedByAccountsController < Api::BaseController
69 69
     @status = Status.find(params[:status_id])
70 70
     authorize @status, :show?
71 71
   rescue Mastodon::NotPermittedError
72
-    # Reraise in order to get a 404 instead of a 403 error code
73
-    raise ActiveRecord::RecordNotFound
72
+    not_found
74 73
   end
75 74
 
76 75
   def pagination_params(core_params)

+ 9
- 17
app/controllers/api/v1/statuses/favourites_controller.rb View File

@@ -5,34 +5,26 @@ class Api::V1::Statuses::FavouritesController < Api::BaseController
5 5
 
6 6
   before_action -> { doorkeeper_authorize! :write, :'write:favourites' }
7 7
   before_action :require_user!
8
+  before_action :set_status
8 9
 
9 10
   respond_to :json
10 11
 
11 12
   def create
12
-    @status = favourited_status
13
+    FavouriteService.new.call(current_account, @status)
13 14
     render json: @status, serializer: REST::StatusSerializer
14 15
   end
15 16
 
16 17
   def destroy
17
-    @status = requested_status
18
-    @favourites_map = { @status.id => false }
19
-
20
-    UnfavouriteWorker.perform_async(current_user.account_id, @status.id)
21
-
22
-    render json: @status, serializer: REST::StatusSerializer, relationships: StatusRelationshipsPresenter.new([@status], current_user&.account_id, favourites_map: @favourites_map)
18
+    UnfavouriteWorker.perform_async(current_account.id, @status.id)
19
+    render json: @status, serializer: REST::StatusSerializer, relationships: StatusRelationshipsPresenter.new([@status], current_account.id, favourites_map: { @status.id => false })
23 20
   end
24 21
 
25 22
   private
26 23
 
27
-  def favourited_status
28
-    service_result.status.reload
29
-  end
30
-
31
-  def service_result
32
-    FavouriteService.new.call(current_user.account, requested_status)
33
-  end
34
-
35
-  def requested_status
36
-    Status.find(params[:status_id])
24
+  def set_status
25
+    @status = Status.find(params[:status_id])
26
+    authorize @status, :show?
27
+  rescue Mastodon::NotPermittedError
28
+    not_found
37 29
   end
38 30
 end

+ 1
- 2
app/controllers/api/v1/statuses/reblogged_by_accounts_controller.rb View File

@@ -66,8 +66,7 @@ class Api::V1::Statuses::RebloggedByAccountsController < Api::BaseController
66 66
     @status = Status.find(params[:status_id])
67 67
     authorize @status, :show?
68 68
   rescue Mastodon::NotPermittedError
69
-    # Reraise in order to get a 404 instead of a 403 error code
70
-    raise ActiveRecord::RecordNotFound
69
+    not_found
71 70
   end
72 71
 
73 72
   def pagination_params(core_params)

+ 14
- 13
app/controllers/api/v1/statuses/reblogs_controller.rb View File

@@ -5,33 +5,34 @@ class Api::V1::Statuses::ReblogsController < Api::BaseController
5 5
 
6 6
   before_action -> { doorkeeper_authorize! :write, :'write:statuses' }
7 7
   before_action :require_user!
8
+  before_action :set_reblog
8 9
 
9 10
   respond_to :json
10 11
 
11 12
   def create
12
-    @status = ReblogService.new.call(current_user.account, status_for_reblog, reblog_params)
13
+    @status = ReblogService.new.call(current_account, @reblog, reblog_params)
13 14
     render json: @status, serializer: REST::StatusSerializer
14 15
   end
15 16
 
16 17
   def destroy
17
-    @status = status_for_destroy.reblog
18
-    @reblogs_map = { @status.id => false }
18
+    @status = current_account.statuses.find_by(reblog_of_id: @reblog.id)
19 19
 
20
-    authorize status_for_destroy, :unreblog?
21
-    status_for_destroy.discard
22
-    RemovalWorker.perform_async(status_for_destroy.id)
20
+    if @status
21
+      authorize @status, :unreblog?
22
+      @status.discard
23
+      RemovalWorker.perform_async(@status.id)
24
+    end
23 25
 
24
-    render json: @status, serializer: REST::StatusSerializer, relationships: StatusRelationshipsPresenter.new([@status], current_user&.account_id, reblogs_map: @reblogs_map)
26
+    render json: @reblog, serializer: REST::StatusSerializer, relationships: StatusRelationshipsPresenter.new([@status], current_account.id, reblogs_map: { @reblog.id => false })
25 27
   end
26 28
 
27 29
   private
28 30
 
29
-  def status_for_reblog
30
-    Status.find params[:status_id]
31
-  end
32
-
33
-  def status_for_destroy
34
-    @status_for_destroy ||= current_user.account.statuses.where(reblog_of_id: params[:status_id]).first!
31
+  def set_reblog
32
+    @reblog = Status.find(params[:status_id])
33
+    authorize @reblog, :show?
34
+  rescue Mastodon::NotPermittedError
35
+    not_found
35 36
   end
36 37
 
37 38
   def reblog_params

+ 1
- 2
app/controllers/auth/registrations_controller.rb View File

@@ -41,7 +41,6 @@ class Auth::RegistrationsController < Devise::RegistrationsController
41 41
 
42 42
     resource.locale             = I18n.locale
43 43
     resource.invite_code        = params[:invite_code] if resource.invite_code.blank?
44
-    resource.agreement          = true
45 44
     resource.current_sign_in_ip = request.remote_ip
46 45
 
47 46
     resource.current_sign_in_ip = request.remote_ip if resource.current_sign_in_ip.nil?
@@ -50,7 +49,7 @@ class Auth::RegistrationsController < Devise::RegistrationsController
50 49
 
51 50
   def configure_sign_up_params
52 51
     devise_parameter_sanitizer.permit(:sign_up) do |u|
53
-      u.permit({ account_attributes: [:username], invite_request_attributes: [:text] }, :email, :password, :password_confirmation, :invite_code)
52
+      u.permit({ account_attributes: [:username], invite_request_attributes: [:text] }, :email, :password, :password_confirmation, :invite_code, :agreement)
54 53
     end
55 54
   end
56 55
 

+ 3
- 0
app/javascript/mastodon/base_polyfills.js View File

@@ -6,6 +6,7 @@ import assign from 'object-assign';
6 6
 import values from 'object.values';
7 7
 import isNaN from 'is-nan';
8 8
 import { decode as decodeBase64 } from './utils/base64';
9
+import promiseFinally from 'promise.prototype.finally';
9 10
 
10 11
 if (!Array.prototype.includes) {
11 12
   includes.shim();
@@ -23,6 +24,8 @@ if (!Number.isNaN) {
23 24
   Number.isNaN = isNaN;
24 25
 }
25 26
 
27
+promiseFinally.shim();
28
+
26 29
 if (!HTMLCanvasElement.prototype.toBlob) {
27 30
   const BASE64_MARKER = ';base64,';
28 31
 

+ 22
- 3
app/javascript/mastodon/components/error_boundary.js View File

@@ -2,6 +2,7 @@ import React from 'react';
2 2
 import PropTypes from 'prop-types';
3 3
 import { FormattedMessage } from 'react-intl';
4 4
 import { version, source_url } from 'mastodon/initial_state';
5
+import StackTrace from 'stacktrace-js';
5 6
 
6 7
 export default class ErrorBoundary extends React.PureComponent {
7 8
 
@@ -11,24 +12,42 @@ export default class ErrorBoundary extends React.PureComponent {
11 12
 
12 13
   state = {
13 14
     hasError: false,
15
+    errorMessage: undefined,
14 16
     stackTrace: undefined,
17
+    mappedStackTrace: undefined,
15 18
     componentStack: undefined,
16 19
   };
17 20
 
18 21
   componentDidCatch (error, info) {
19 22
     this.setState({
20 23
       hasError: true,
24
+      errorMessage: error.toString(),
21 25
       stackTrace: error.stack,
22 26
       componentStack: info && info.componentStack,
23
-      copied: false,
27
+      mappedStackTrace: undefined,
28
+    });
29
+
30
+    StackTrace.fromError(error).then((stackframes) => {
31
+      this.setState({
32
+        mappedStackTrace: stackframes.map((sf) => sf.toString()).join('\n'),
33
+      });
34
+    }).catch(() => {
35
+      this.setState({
36
+        mappedStackTrace: undefined,
37
+      });
24 38
     });
25 39
   }
26 40
 
27 41
   handleCopyStackTrace = () => {
28
-    const { stackTrace } = this.state;
42
+    const { errorMessage, stackTrace, mappedStackTrace } = this.state;
29 43
     const textarea = document.createElement('textarea');
30 44
 
31
-    textarea.textContent    = stackTrace;
45
+    let contents = [errorMessage, stackTrace];
46
+    if (mappedStackTrace) {
47
+      contents.push(mappedStackTrace);
48
+    }
49
+
50
+    textarea.textContent    = contents.join('\n\n\n');
32 51
     textarea.style.position = 'fixed';
33 52
 
34 53
     document.body.appendChild(textarea);

+ 2
- 1
app/javascript/mastodon/load_polyfills.js View File

@@ -18,7 +18,8 @@ function loadPolyfills() {
18 18
     Number.isNaN &&
19 19
     Object.assign &&
20 20
     Object.values &&
21
-    window.Symbol
21
+    window.Symbol &&
22
+    Promise.prototype.finally
22 23
   );
23 24
 
24 25
   // Latest version of Firefox and Safari do not have IntersectionObserver.

+ 1
- 1
app/javascript/mastodon/main.js View File

@@ -12,7 +12,7 @@ function main() {
12 12
   if (window.history && history.replaceState) {
13 13
     const { pathname, search, hash } = window.location;
14 14
     const path = pathname + search + hash;
15
-    if (!(/^\/web[$/]/).test(path)) {
15
+    if (!(/^\/web($|\/)/).test(path)) {
16 16
       history.replaceState(null, document.title, `/web${path}`);
17 17
     }
18 18
   }

+ 4
- 3
app/services/activitypub/process_account_service.rb View File

@@ -20,9 +20,10 @@ class ActivityPub::ProcessAccountService < BaseService
20 20
 
21 21
     RedisLock.acquire(lock_options) do |lock|
22 22
       if lock.acquired?
23
-        @account        = Account.find_remote(@username, @domain)
24
-        @old_public_key = @account&.public_key
25
-        @old_protocol   = @account&.protocol
23
+        @account          = Account.remote.find_by(uri: @uri) if @options[:only_key]
24
+        @account        ||= Account.find_remote(@username, @domain)
25
+        @old_public_key   = @account&.public_key
26
+        @old_protocol     = @account&.protocol
26 27
 
27 28
         create_account if @account.nil?
28 29
         update_account

+ 2
- 0
app/services/backup_service.rb View File

@@ -66,6 +66,8 @@ class BackupService < BaseService
66 66
   def dump_media_attachments!(tar)
67 67
     MediaAttachment.attached.where(account: account).reorder(nil).find_in_batches do |media_attachments|
68 68
       media_attachments.each do |m|
69
+        next unless m.file&.path
70
+
69 71
         download_to_tar(tar, m.file, m.file.path)
70 72
       end
71 73
 

+ 2
- 3
app/services/follow_service.rb View File

@@ -18,14 +18,13 @@ class FollowService < BaseService
18 18
     if source_account.following?(target_account)
19 19
       # We're already following this account, but we'll call follow! again to
20 20
       # make sure the reblogs status is set correctly.
21
-      source_account.follow!(target_account, reblogs: reblogs)
22
-      return
21
+      return source_account.follow!(target_account, reblogs: reblogs)
23 22
     elsif source_account.requested?(target_account)
24 23
       # This isn't managed by a method in AccountInteractions, so we modify it
25 24
       # ourselves if necessary.
26 25
       req = source_account.follow_requests.find_by(target_account: target_account)
27 26
       req.update!(show_reblogs: reblogs)
28
-      return
27
+      return req
29 28
     end
30 29
 
31 30
     ActivityTracker.increment('activity:interactions')

+ 1
- 1
app/services/resolve_account_service.rb View File

@@ -99,7 +99,7 @@ class ResolveAccountService < BaseService
99 99
       if lock.acquired?
100 100
         @account = Account.find_remote(@username, @domain)
101 101
 
102
-        next if (@account.present? && !@account.activitypub?) || actor_json.nil?
102
+        next if actor_json.nil?
103 103
 
104 104
         @account = ActivityPub::ProcessAccountService.new.call(@username, @domain, actor_json)
105 105
       else

+ 3
- 3
app/views/admin/accounts/show.html.haml View File

@@ -27,9 +27,9 @@
27 27
                     = fa_icon 'check'
28 28
                 = Formatter.instance.format_field(account, field.value, custom_emojify: true)
29 29
 
30
-      - if account.note.present?
31
-        %div
32
-          .account__header__content.emojify= Formatter.instance.simplified_format(account, custom_emojify: true)
30
+    - if account.note.present?
31
+      %div
32
+        .account__header__content.emojify= Formatter.instance.simplified_format(account, custom_emojify: true)
33 33
 
34 34
 .dashboard__counters{ style: 'margin-top: 10px' }
35 35
   %div

+ 1
- 1
app/views/auth/registrations/new.html.haml View File

@@ -27,7 +27,7 @@
27 27
 
28 28
   - if approved_registrations? && !@invite.present?
29 29
     .fields-group
30
-      = f.simple_fields_for :invite_request do |invite_request_fields|
30
+      = f.simple_fields_for :invite_request, resource.invite_request || resource.build_invite_request do |invite_request_fields|
31 31
         = invite_request_fields.input :text, as: :text, wrapper: :with_block_label, required: false
32 32
 
33 33
   = f.input :invite_code, as: :hidden

+ 6
- 0
app/views/authorize_interactions/show.html.haml View File

@@ -10,6 +10,12 @@
10 10
       %strong
11 11
         = t('authorize_follow.already_following')
12 12
 
13
+    = render 'post_follow_actions'
14
+  - elsif current_account.requested?(@resource)
15
+    .flash-message
16
+      %strong
17
+        = t('authorize_follow.already_requested')
18
+
13 19
     = render 'post_follow_actions'
14 20
   - else
15 21
     = form_tag authorize_interaction_path, method: :post, class: 'simple_form' do

+ 1
- 0
config/locales/en.yml View File

@@ -661,6 +661,7 @@ en:
661 661
     trouble_logging_in: Trouble logging in?
662 662
   authorize_follow:
663 663
     already_following: You are already following this account
664
+    already_requested: You have already sent a follow request to that account
664 665
     error: Unfortunately, there was an error looking up the remote account
665 666
     follow: Follow
666 667
     follow_request: 'You have sent a follow request to:'

+ 7
- 0
lib/mastodon/accounts_cli.rb View File

@@ -120,6 +120,7 @@ module Mastodon
120 120
     option :disable, type: :boolean
121 121
     option :disable_2fa, type: :boolean
122 122
     option :approve, type: :boolean
123
+    option :reset_password, type: :boolean
123 124
     desc 'modify USERNAME', 'Modify a user'
124 125
     long_desc <<-LONG_DESC
125 126
       Modify a user account.
@@ -138,6 +139,9 @@ module Mastodon
138 139
 
139 140
       With the --disable-2fa option, the two-factor authentication
140 141
       requirement for the user can be removed.
142
+
143
+      With the --reset-password option, the user's password is replaced by
144
+      a randomly-generated one, printed in the output.
141 145
     LONG_DESC
142 146
     def modify(username)
143 147
       user = Account.find_local(username)&.user
@@ -152,6 +156,8 @@ module Mastodon
152 156
         user.moderator = options[:role] == 'moderator'
153 157
       end
154 158
 
159
+      password = SecureRandom.hex if options[:reset_password]
160
+      user.password = password if options[:reset_password]
155 161
       user.email = options[:email] if options[:email]
156 162
       user.disabled = false if options[:enable]
157 163
       user.disabled = true if options[:disable]
@@ -161,6 +167,7 @@ module Mastodon
161 167
 
162 168
       if user.save
163 169
         say('OK', :green)
170
+        say("New password: #{password}") if options[:reset_password]
164 171
       else
165 172
         user.errors.to_h.each do |key, error|
166 173
           say('Failure/Error: ', :red)

+ 2
- 6
lib/mastodon/migration_helpers.rb View File

@@ -886,16 +886,12 @@ module Mastodon
886 886
 Your database user is not allowed to create, drop, or execute triggers on the
887 887
 table #{table}.
888 888
 
889
-If you are using PostgreSQL you can solve this by logging in to the GitLab
889
+If you are using PostgreSQL you can solve this by logging in to the Mastodon
890 890
 database (#{dbname}) using a super user and running:
891 891
 
892 892
     ALTER USER #{user} WITH SUPERUSER
893 893
 
894
-For MySQL you instead need to run:
895
-
896
-    GRANT ALL PRIVILEGES ON *.* TO #{user}@'%'
897
-
898
-Both queries will grant the user super user permissions, ensuring you don't run
894
+The query will grant the user super user permissions, ensuring you don't run
899 895
 into similar problems in the future (e.g. when new tables are created).
900 896
         EOF
901 897
       end

+ 1
- 1
lib/mastodon/version.rb View File

@@ -13,7 +13,7 @@ module Mastodon
13 13
     end
14 14
 
15 15
     def patch
16
-      1
16
+      2
17 17
     end
18 18
 
19 19
     def flags

+ 16
- 14
package.json View File

@@ -59,20 +59,20 @@
59 59
   },
60 60
   "private": true,
61 61
   "dependencies": {
62
-    "@babel/core": "^7.8.3",
62
+    "@babel/core": "^7.8.4",
63 63
     "@babel/plugin-proposal-class-properties": "^7.8.3",
64 64
     "@babel/plugin-proposal-decorators": "^7.8.3",
65
-    "@babel/plugin-transform-react-inline-elements": "^7.8.0",
66
-    "@babel/plugin-transform-runtime": "^7.7.6",
65
+    "@babel/plugin-transform-react-inline-elements": "^7.8.3",
66
+    "@babel/plugin-transform-runtime": "^7.8.3",
67 67
     "@babel/preset-env": "^7.8.3",
68 68
     "@babel/preset-react": "^7.8.3",
69 69
     "@babel/runtime": "^7.8.3",
70
-    "@gamestdio/websocket": "^0.3.2",
71 70
     "@clusterws/cws": "^0.17.3",
71
+    "@gamestdio/websocket": "^0.3.2",
72 72
     "array-includes": "^3.1.1",
73 73
     "arrow-key-navigation": "^1.1.0",
74 74
     "autoprefixer": "^9.7.4",
75
-    "axios": "^0.19.1",
75
+    "axios": "^0.19.2",
76 76
     "babel-loader": "^8.0.6",
77 77
     "babel-plugin-lodash": "^3.3.4",
78 78
     "babel-plugin-preval": "^4.0.0",
@@ -120,6 +120,7 @@
120 120
     "pg": "^6.4.0",
121 121
     "postcss-loader": "^3.0.0",
122 122
     "postcss-object-fit-images": "^1.1.2",
123
+    "promise.prototype.finally": "^3.1.2",
123 124
     "prop-types": "^15.5.10",
124 125
     "punycode": "^2.1.0",
125 126
     "rails-ujs": "^5.2.4",
@@ -133,37 +134,38 @@
133 134
     "react-motion": "^0.5.2",
134 135
     "react-notification": "^6.8.5",
135 136
     "react-overlays": "^0.9.1",
136
-    "react-redux": "^7.1.3",
137
+    "react-redux": "^7.2.0",
137 138
     "react-redux-loading-bar": "^4.0.8",
138 139
     "react-router-dom": "^4.1.1",
139 140
     "react-router-scroll-4": "^1.0.0-beta.1",
140 141
     "react-select": "^3.0.8",
141 142
     "react-sparklines": "^1.7.0",
142
-    "react-swipeable-views": "^0.13.4",
143
+    "react-swipeable-views": "^0.13.9",
143 144
     "react-textarea-autosize": "^7.1.2",
144 145
     "react-toggle": "^4.1.1",
145 146
     "redis": "^2.7.1",
146 147
     "redux": "^4.0.5",
147 148
     "redux-immutable": "^4.0.0",
148 149
     "redux-thunk": "^2.2.0",
149
-    "rellax": "^1.10.0",
150
+    "rellax": "^1.12.1",
150 151
     "requestidlecallback": "^0.3.0",
151 152
     "reselect": "^4.0.0",
152
-    "rimraf": "^3.0.0",
153
-    "sass": "^1.24.2",
153
+    "rimraf": "^3.0.2",
154
+    "sass": "^1.25.0",
154 155
     "sass-loader": "^8.0.2",
156
+    "stacktrace-js": "^2.0.2",
155 157
     "stringz": "^2.0.0",
156 158
     "substring-trie": "^1.0.2",
157
-    "terser-webpack-plugin": "^2.3.2",
159
+    "terser-webpack-plugin": "^2.3.5",
158 160
     "tesseract.js": "^2.0.0-alpha.16",
159 161
     "throng": "^4.0.0",
160 162
     "tiny-queue": "^0.2.1",
161
-    "uuid": "^3.3.3",
163
+    "uuid": "^3.4.0",
162 164
     "wavesurfer.js": "^3.3.1",
163 165
     "webpack": "^4.41.5",
164 166
     "webpack-assets-manifest": "^3.1.1",
165 167
     "webpack-bundle-analyzer": "^3.6.0",
166
-    "webpack-cli": "^3.3.10",
168
+    "webpack-cli": "^3.3.11",
167 169
     "webpack-merge": "^4.2.1",
168 170
     "wicg-inert": "^3.0.0"
169 171
   },
@@ -173,7 +175,7 @@
173 175
     "enzyme": "^3.11.0",
174 176
     "enzyme-adapter-react-16": "^1.15.2",
175 177
     "eslint": "^6.8.0",
176
-    "eslint-plugin-import": "~2.20.0",
178
+    "eslint-plugin-import": "~2.20.1",
177 179
     "eslint-plugin-jsx-a11y": "~6.2.3",
178 180
     "eslint-plugin-promise": "~4.2.1",
179 181
     "eslint-plugin-react": "~7.17.0",

+ 49
- 18
spec/controllers/api/v1/statuses/bookmarks_controller_spec.rb View File

@@ -21,36 +21,67 @@ describe Api::V1::Statuses::BookmarksController do
21 21
         post :create, params: { status_id: status.id }
22 22
       end
23 23
 
24
-      it 'returns http success' do
25
-        expect(response).to have_http_status(:success)
26
-      end
24
+      context 'with public status' do
25
+        it 'returns http success' do
26
+          expect(response).to have_http_status(:success)
27
+        end
28
+
29
+        it 'updates the bookmarked attribute' do
30
+          expect(user.account.bookmarked?(status)).to be true
31
+        end
32
+
33
+        it 'returns json with updated attributes' do
34
+          hash_body = body_as_json
27 35
 
28
-      it 'updates the bookmarked attribute' do
29
-        expect(user.account.bookmarked?(status)).to be true
36
+          expect(hash_body[:id]).to eq status.id.to_s
37
+          expect(hash_body[:bookmarked]).to be true
38
+        end
30 39
       end
31 40
 
32
-      it 'return json with updated attributes' do
33
-        hash_body = body_as_json
41
+      context 'with private status of not-followed account' do
42
+        let(:status) { Fabricate(:status, visibility: :private) }
34 43
 
35
-        expect(hash_body[:id]).to eq status.id.to_s
36
-        expect(hash_body[:bookmarked]).to be true
44
+        it 'returns http not found' do
45
+          expect(response).to have_http_status(404)
46
+        end
37 47
       end
38 48
     end
39 49
 
40 50
     describe 'POST #destroy' do
41
-      let(:status) { Fabricate(:status, account: user.account) }
51
+      context 'with public status' do
52
+        let(:status) { Fabricate(:status, account: user.account) }
42 53
 
43
-      before do
44
-        Bookmark.find_or_create_by!(account: user.account, status: status)
45
-        post :destroy, params: { status_id: status.id }
46
-      end
54
+        before do
55
+          Bookmark.find_or_create_by!(account: user.account, status: status)
56
+          post :destroy, params: { status_id: status.id }
57
+        end
47 58
 
48
-      it 'returns http success' do
49
-        expect(response).to have_http_status(:success)
59
+        it 'returns http success' do
60
+          expect(response).to have_http_status(:success)
61
+        end
62
+
63
+        it 'updates the bookmarked attribute' do
64
+          expect(user.account.bookmarked?(status)).to be false
65
+        end
66
+
67
+        it 'returns json with updated attributes' do
68
+          hash_body = body_as_json
69
+
70
+          expect(hash_body[:id]).to eq status.id.to_s
71
+          expect(hash_body[:bookmarked]).to be false
72
+        end
50 73
       end
51 74
 
52
-      it 'updates the bookmarked attribute' do
53
-        expect(user.account.bookmarked?(status)).to be false
75
+      context 'with private status that was not bookmarked' do
76
+        let(:status) { Fabricate(:status, visibility: :private) }
77
+
78
+        before do
79
+          post :destroy, params: { status_id: status.id }
80
+        end
81
+
82
+        it 'returns http not found' do
83
+          expect(response).to have_http_status(404)
84
+        end
54 85
       end
55 86
     end
56 87
   end

+ 59
- 27
spec/controllers/api/v1/statuses/favourites_controller_spec.rb View File

@@ -21,45 +21,77 @@ describe Api::V1::Statuses::FavouritesController do
21 21
         post :create, params: { status_id: status.id }
22 22
       end
23 23
 
24
-      it 'returns http success' do
25
-        expect(response).to have_http_status(200)
24
+      context 'with public status' do
25
+        it 'returns http success' do
26
+          expect(response).to have_http_status(200)
27
+        end
28
+
29
+        it 'updates the favourites count' do
30
+          expect(status.favourites.count).to eq 1
31
+        end
32
+
33
+        it 'updates the favourited attribute' do
34
+          expect(user.account.favourited?(status)).to be true
35
+        end
36
+
37
+        it 'returns json with updated attributes' do
38
+          hash_body = body_as_json
39
+
40
+          expect(hash_body[:id]).to eq status.id.to_s
41
+          expect(hash_body[:favourites_count]).to eq 1
42
+          expect(hash_body[:favourited]).to be true
43
+        end
26 44
       end
27 45
 
28
-      it 'updates the favourites count' do
29
-        expect(status.favourites.count).to eq 1
30
-      end
31
-
32
-      it 'updates the favourited attribute' do
33
-        expect(user.account.favourited?(status)).to be true
34
-      end
35
-
36
-      it 'return json with updated attributes' do
37
-        hash_body = body_as_json
46
+      context 'with private status of not-followed account' do
47
+        let(:status) { Fabricate(:status, visibility: :private) }
38 48
 
39
-        expect(hash_body[:id]).to eq status.id.to_s
40
-        expect(hash_body[:favourites_count]).to eq 1
41
-        expect(hash_body[:favourited]).to be true
49
+        it 'returns http not found' do
50
+          expect(response).to have_http_status(404)
51
+        end
42 52
       end
43 53
     end
44 54
 
45 55
     describe 'POST #destroy' do
46
-      let(:status) { Fabricate(:status, account: user.account) }
56
+      context 'with public status' do
57
+        let(:status) { Fabricate(:status, account: user.account) }
47 58
 
48
-      before do
49
-        FavouriteService.new.call(user.account, status)
50
-        post :destroy, params: { status_id: status.id }
51
-      end
59
+        before do
60
+          FavouriteService.new.call(user.account, status)
61
+          post :destroy, params: { status_id: status.id }
62
+        end
52 63
 
53
-      it 'returns http success' do
54
-        expect(response).to have_http_status(200)
55
-      end
64
+        it 'returns http success' do
65
+          expect(response).to have_http_status(200)
66
+        end
67
+
68
+        it 'updates the favourites count' do
69
+          expect(status.favourites.count).to eq 0
70
+        end
71
+
72
+        it 'updates the favourited attribute' do
73
+          expect(user.account.favourited?(status)).to be false
74
+        end
56 75
 
57
-      it 'updates the favourites count' do
58
-        expect(status.favourites.count).to eq 0
76
+        it 'returns json with updated attributes' do
77
+          hash_body = body_as_json
78
+
79
+          expect(hash_body[:id]).to eq status.id.to_s
80
+          expect(hash_body[:favourites_count]).to eq 0
81
+          expect(hash_body[:favourited]).to be false
82
+        end
59 83
       end
60 84
 
61
-      it 'updates the favourited attribute' do
62
-        expect(user.account.favourited?(status)).to be false
85
+      context 'with private status that was not favourited' do
86
+        let(:status) { Fabricate(:status, visibility: :private) }
87
+
88
+        before do
89
+          post :destroy, params: { status_id: status.id }
90
+        end
91
+
92
+        it 'returns http not found' do
93
+          expect(response).to have_http_status(404)
94
+        end
63 95
       end
64 96
     end
65 97
   end

+ 59
- 27
spec/controllers/api/v1/statuses/reblogs_controller_spec.rb View File

@@ -21,45 +21,77 @@ describe Api::V1::Statuses::ReblogsController do
21 21
         post :create, params: { status_id: status.id }
22 22
       end
23 23
 
24
-      it 'returns http success' do
25
-        expect(response).to have_http_status(200)
24
+      context 'with public status' do
25
+        it 'returns http success' do
26
+          expect(response).to have_http_status(200)
27
+        end
28
+
29
+        it 'updates the reblogs count' do
30
+          expect(status.reblogs.count).to eq 1
31
+        end
32
+
33
+        it 'updates the reblogged attribute' do
34
+          expect(user.account.reblogged?(status)).to be true
35
+        end
36
+
37
+        it 'returns json with updated attributes' do
38
+          hash_body = body_as_json
39
+
40
+          expect(hash_body[:reblog][:id]).to eq status.id.to_s
41
+          expect(hash_body[:reblog][:reblogs_count]).to eq 1
42
+          expect(hash_body[:reblog][:reblogged]).to be true
43
+        end
26 44
       end
27 45
 
28
-      it 'updates the reblogs count' do
29
-        expect(status.reblogs.count).to eq 1
30
-      end
31
-
32
-      it 'updates the reblogged attribute' do
33
-        expect(user.account.reblogged?(status)).to be true
34
-      end
35
-
36
-      it 'return json with updated attributes' do
37
-        hash_body = body_as_json
46
+      context 'with private status of not-followed account' do
47
+        let(:status) { Fabricate(:status, visibility: :private) }
38 48
 
39
-        expect(hash_body[:reblog][:id]).to eq status.id.to_s
40
-        expect(hash_body[:reblog][:reblogs_count]).to eq 1
41
-        expect(hash_body[:reblog][:reblogged]).to be true
49
+        it 'returns http not found' do
50
+          expect(response).to have_http_status(404)
51
+        end
42 52
       end
43 53
     end
44 54
 
45 55
     describe 'POST #destroy' do
46
-      let(:status) { Fabricate(:status, account: user.account) }
56
+      context 'with public status' do
57
+        let(:status) { Fabricate(:status, account: user.account) }
47 58
 
48
-      before do
49
-        ReblogService.new.call(user.account, status)
50
-        post :destroy, params: { status_id: status.id }
51
-      end
59
+        before do
60
+          ReblogService.new.call(user.account, status)
61
+          post :destroy, params: { status_id: status.id }
62
+        end
52 63
 
53
-      it 'returns http success' do
54
-        expect(response).to have_http_status(200)
55
-      end
64
+        it 'returns http success' do
65
+          expect(response).to have_http_status(200)
66
+        end
67
+
68
+        it 'updates the reblogs count' do
69
+          expect(status.reblogs.count).to eq 0
70
+        end
71
+
72
+        it 'updates the reblogged attribute' do
73
+          expect(user.account.reblogged?(status)).to be false
74
+        end
56 75
 
57
-      it 'updates the reblogs count' do
58
-        expect(status.reblogs.count).to eq 0
76
+        it 'returns json with updated attributes' do
77
+          hash_body = body_as_json
78
+
79
+          expect(hash_body[:id]).to eq status.id.to_s
80
+          expect(hash_body[:reblogs_count]).to eq 0
81
+          expect(hash_body[:reblogged]).to be false
82
+        end
59 83
       end
60 84
 
61
-      it 'updates the reblogged attribute' do
62
-        expect(user.account.reblogged?(status)).to be false
85
+      context 'with private status that was not reblogged' do
86
+        let(:status) { Fabricate(:status, visibility: :private) }
87
+
88
+        before do
89
+          post :destroy, params: { status_id: status.id }
90
+        end
91
+
92
+        it 'returns http not found' do
93
+          expect(response).to have_http_status(404)
94
+        end
63 95
       end
64 96
     end
65 97
   end

+ 24
- 4
spec/controllers/auth/registrations_controller_spec.rb View File

@@ -100,7 +100,7 @@ RSpec.describe Auth::RegistrationsController, type: :controller do
100 100
       subject do
101 101
         Setting.registrations_mode = 'open'
102 102
         request.headers["Accept-Language"] = accept_language
103
-        post :create, params: { user: { account_attributes: { username: 'test' }, email: 'test@example.com', password: '12345678', password_confirmation: '12345678' } }
103
+        post :create, params: { user: { account_attributes: { username: 'test' }, email: 'test@example.com', password: '12345678', password_confirmation: '12345678', agreement: 'true' } }
104 104
       end
105 105
 
106 106
       it 'redirects to setup' do
@@ -116,6 +116,26 @@ RSpec.describe Auth::RegistrationsController, type: :controller do
116 116
       end
117 117
     end
118 118
 
119
+    context 'when user has not agreed to terms of service' do
120
+      around do |example|
121
+        registrations_mode = Setting.registrations_mode
122
+        example.run
123
+        Setting.registrations_mode = registrations_mode
124
+      end
125
+
126
+      subject do
127
+        Setting.registrations_mode = 'open'
128
+        request.headers["Accept-Language"] = accept_language
129
+        post :create, params: { user: { account_attributes: { username: 'test' }, email: 'test@example.com', password: '12345678', password_confirmation: '12345678', agreement: 'false' } }
130
+      end
131
+
132
+      it 'does not create user' do
133
+        subject
134
+        user = User.find_by(email: 'test@example.com')
135
+        expect(user).to be_nil
136
+      end
137
+    end
138
+
119 139
     context 'approval-based registrations without invite' do
120 140
       around do |example|
121 141
         registrations_mode = Setting.registrations_mode
@@ -126,7 +146,7 @@ RSpec.describe Auth::RegistrationsController, type: :controller do
126 146
       subject do
127 147
         Setting.registrations_mode = 'approved'
128 148
         request.headers["Accept-Language"] = accept_language
129
-        post :create, params: { user: { account_attributes: { username: 'test' }, email: 'test@example.com', password: '12345678', password_confirmation: '12345678' } }
149
+        post :create, params: { user: { account_attributes: { username: 'test' }, email: 'test@example.com', password: '12345678', password_confirmation: '12345678', agreement: 'true' } }
130 150
       end
131 151
 
132 152
       it 'redirects to setup' do
@@ -154,7 +174,7 @@ RSpec.describe Auth::RegistrationsController, type: :controller do
154 174
         Setting.registrations_mode = 'approved'
155 175
         request.headers["Accept-Language"] = accept_language
156 176
         invite = Fabricate(:invite, max_uses: nil, expires_at: 1.hour.ago)
157
-        post :create, params: { user: { account_attributes: { username: 'test' }, email: 'test@example.com', password: '12345678', password_confirmation: '12345678', 'invite_code': invite.code } }
177
+        post :create, params: { user: { account_attributes: { username: 'test' }, email: 'test@example.com', password: '12345678', password_confirmation: '12345678', 'invite_code': invite.code, agreement: 'true' } }
158 178
       end
159 179
 
160 180
       it 'redirects to setup' do
@@ -182,7 +202,7 @@ RSpec.describe Auth::RegistrationsController, type: :controller do
182 202
         Setting.registrations_mode = 'approved'
183 203
         request.headers["Accept-Language"] = accept_language
184 204
         invite = Fabricate(:invite, max_uses: nil, expires_at: 1.hour.from_now)
185
-        post :create, params: { user: { account_attributes: { username: 'test' }, email: 'test@example.com', password: '12345678', password_confirmation: '12345678', 'invite_code': invite.code } }
205
+        post :create, params: { user: { account_attributes: { username: 'test' }, email: 'test@example.com', password: '12345678', password_confirmation: '12345678', 'invite_code': invite.code, agreement: 'true' } }
186 206
       end
187 207
 
188 208
       it 'redirects to setup' do

+ 199
- 192
yarn.lock View File

@@ -18,17 +18,17 @@
18 18
     invariant "^2.2.4"
19 19
     semver "^5.5.0"
20 20
 
21
-"@babel/core@^7.1.0", "@babel/core@^7.4.5", "@babel/core@^7.8.3":
22
-  version "7.8.3"
23
-  resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.8.3.tgz#30b0ebb4dd1585de6923a0b4d179e0b9f5d82941"
24
-  integrity sha512-4XFkf8AwyrEG7Ziu3L2L0Cv+WyY47Tcsp70JFmpftbAA1K7YL/sgE9jh9HyNj08Y/U50ItUchpN0w6HxAoX1rA==
21
+"@babel/core@^7.1.0", "@babel/core@^7.4.5", "@babel/core@^7.8.4":
22
+  version "7.8.4"
23
+  resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.8.4.tgz#d496799e5c12195b3602d0fddd77294e3e38e80e"
24
+  integrity sha512-0LiLrB2PwrVI+a2/IEskBopDYSd8BCb3rOvH7D5tzoWd696TBEduBvuLVm4Nx6rltrLZqvI3MCalB2K2aVzQjA==
25 25
   dependencies:
26 26
     "@babel/code-frame" "^7.8.3"
27
-    "@babel/generator" "^7.8.3"
28
-    "@babel/helpers" "^7.8.3"
29
-    "@babel/parser" "^7.8.3"
27
+    "@babel/generator" "^7.8.4"
28
+    "@babel/helpers" "^7.8.4"
29
+    "@babel/parser" "^7.8.4"
30 30
     "@babel/template" "^7.8.3"
31
-    "@babel/traverse" "^7.8.3"
31
+    "@babel/traverse" "^7.8.4"
32 32
     "@babel/types" "^7.8.3"
33 33
     convert-source-map "^1.7.0"
34 34
     debug "^4.1.0"
@@ -39,10 +39,10 @@
39 39
     semver "^5.4.1"
40 40
     source-map "^0.5.0"
41 41
 
42
-"@babel/generator@^7.0.0", "@babel/generator@^7.8.3":
43
-  version "7.8.3"
44
-  resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.8.3.tgz#0e22c005b0a94c1c74eafe19ef78ce53a4d45c03"
45
-  integrity sha512-WjoPk8hRpDRqqzRpvaR8/gDUPkrnOOeuT2m8cNICJtZH6mwaCo3v0OKMI7Y6SM1pBtyijnLtAL0HDi41pf41ug==
42
+"@babel/generator@^7.0.0", "@babel/generator@^7.8.4":
43
+  version "7.8.4"
44
+  resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.8.4.tgz#35bbc74486956fe4251829f9f6c48330e8d0985e"
45
+  integrity sha512-PwhclGdRpNAf3IxZb0YVuITPZmmrXz9zf6fH8lT4XbrmfQKr6ryBzhv593P5C6poJRciFCL/eHGW2NuGrgEyxA==
46 46
   dependencies:
47 47
     "@babel/types" "^7.8.3"
48 48
     jsesc "^2.5.1"
@@ -64,14 +64,6 @@
64 64
     "@babel/helper-explode-assignable-expression" "^7.8.3"
65 65
     "@babel/types" "^7.8.3"
66 66
 
67
-"@babel/helper-builder-react-jsx@^7.8.0":
68
-  version "7.8.0"
69
-  resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.8.0.tgz#4b9111eb862f5fd8840c37d200610fa95ab0aad8"
70
-  integrity sha512-Zg7VLtZzcAHoQ13S0pEIGKo8OAG3s5kjsk/4keGmUeNuc810T9fVp6izIaL8ZVeAErRFWJdvqFItY3QMTHMsSg==
71
-  dependencies:
72
-    "@babel/types" "^7.8.0"
73
-    esutils "^2.0.0"
74
-
75 67
 "@babel/helper-builder-react-jsx@^7.8.3":
76 68
   version "7.8.3"
77 69
   resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.8.3.tgz#dee98d7d79cc1f003d80b76fe01c7f8945665ff6"
@@ -167,7 +159,7 @@
167 159
   dependencies:
168 160
     "@babel/types" "^7.8.3"
169 161
 
170
-"@babel/helper-module-imports@^7.0.0", "@babel/helper-module-imports@^7.0.0-beta.49", "@babel/helper-module-imports@^7.7.4", "@babel/helper-module-imports@^7.8.3":
162
+"@babel/helper-module-imports@^7.0.0", "@babel/helper-module-imports@^7.0.0-beta.49", "@babel/helper-module-imports@^7.8.3":
171 163
   version "7.8.3"
172 164
   resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.8.3.tgz#7fe39589b39c016331b6b8c3f441e8f0b1419498"
173 165
   integrity sha512-R0Bx3jippsbAEtzkpZ/6FIiuzOURPcMjHp+Z6xPe6DtApDJx+w7UYyOLanZqO8+wKR9G10s/FmHXvxaMd9s6Kg==
@@ -251,13 +243,13 @@
251 243
     "@babel/traverse" "^7.8.3"
252 244
     "@babel/types" "^7.8.3"
253 245
 
254
-"@babel/helpers@^7.8.3":
255
-  version "7.8.3"
256
-  resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.8.3.tgz#382fbb0382ce7c4ce905945ab9641d688336ce85"
257
-  integrity sha512-LmU3q9Pah/XyZU89QvBgGt+BCsTPoQa+73RxAQh8fb8qkDyIfeQnmgs+hvzhTCKTzqOyk7JTkS3MS1S8Mq5yrQ==
246
+"@babel/helpers@^7.8.4":
247
+  version "7.8.4"
248
+  resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.8.4.tgz#754eb3ee727c165e0a240d6c207de7c455f36f73"
249
+  integrity sha512-VPbe7wcQ4chu4TDQjimHv/5tj73qz88o12EPkO2ValS2QiQS/1F2SsjyIGNnAD0vF/nZS6Cf9i+vW6HIlnaR8w==
258 250
   dependencies:
259 251
     "@babel/template" "^7.8.3"
260
-    "@babel/traverse" "^7.8.3"
252
+    "@babel/traverse" "^7.8.4"
261 253
     "@babel/types" "^7.8.3"
262 254
 
263 255
 "@babel/highlight@^7.8.3":
@@ -269,10 +261,10 @@
269 261
     esutils "^2.0.2"
270 262
     js-tokens "^4.0.0"
271 263
 
272
-"@babel/parser@^7.0.0", "@babel/parser@^7.1.0", "@babel/parser@^7.8.3":
273
-  version "7.8.3"
274
-  resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.8.3.tgz#790874091d2001c9be6ec426c2eed47bc7679081"
275
-  integrity sha512-/V72F4Yp/qmHaTALizEm9Gf2eQHV3QyTL3K0cNfijwnMnb1L+LDlAubb/ZnSdGAVzVSWakujHYs1I26x66sMeQ==
264
+"@babel/parser@^7.0.0", "@babel/parser@^7.1.0", "@babel/parser@^7.8.3", "@babel/parser@^7.8.4":
265
+  version "7.8.4"
266
+  resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.8.4.tgz#d1dbe64691d60358a974295fa53da074dd2ce8e8"
267
+  integrity sha512-0fKu/QqildpXmPVaRBoXOlyBb3MC+J0A66x97qEfLOMkn3u6nfY5esWogQwi/K0BjASYy4DbnsEWnpNL6qT5Mw==
276 268
 
277 269
 "@babel/plugin-proposal-async-generator-functions@^7.8.3":
278 270
   version "7.8.3"
@@ -619,13 +611,13 @@
619 611
   dependencies:
620 612
     "@babel/helper-plugin-utils" "^7.8.3"
621 613
 
622
-"@babel/plugin-transform-react-inline-elements@^7.8.0":
623
-  version "7.8.0"
624
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-inline-elements/-/plugin-transform-react-inline-elements-7.8.0.tgz#851799e0f66708563b9ada01b175affa1085f0d5"
625
-  integrity sha512-LZCsQfeoF8qqc6IaxJfAe4iSgWlbsdKeEkdxDtb8uzvcDbtXxUYjgUcSsqWgbpC88PIEv65SNzlQZo9/mymgQw==
614
+"@babel/plugin-transform-react-inline-elements@^7.8.3":
615
+  version "7.8.3"
616
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-inline-elements/-/plugin-transform-react-inline-elements-7.8.3.tgz#fc234d02a35bb188ee3f933d068824e067e42b23"
617
+  integrity sha512-CGKUlW3vtgk6YYrIMyfpohmmpILnaeFwszqwTIcem2LQkK1qWJj5w2yTZ7LJr2IR8F0XQ60AZoM8jgAB4zpxCg==
626 618
   dependencies:
627
-    "@babel/helper-builder-react-jsx" "^7.8.0"
628
-    "@babel/helper-plugin-utils" "^7.8.0"
619
+    "@babel/helper-builder-react-jsx" "^7.8.3"
620
+    "@babel/helper-plugin-utils" "^7.8.3"
629 621
 
630 622
 "@babel/plugin-transform-react-jsx-self@^7.8.3":
631 623
   version "7.8.3"
@@ -666,13 +658,13 @@
666 658
   dependencies:
667 659
     "@babel/helper-plugin-utils" "^7.8.3"
668 660
 
669
-"@babel/plugin-transform-runtime@^7.7.6":
670
-  version "7.7.6"
671
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.7.6.tgz#4f2b548c88922fb98ec1c242afd4733ee3e12f61"
672
-  integrity sha512-tajQY+YmXR7JjTwRvwL4HePqoL3DYxpYXIHKVvrOIvJmeHe2y1w4tz5qz9ObUDC9m76rCzIMPyn4eERuwA4a4A==
661
+"@babel/plugin-transform-runtime@^7.8.3":
662
+  version "7.8.3"
663
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.8.3.tgz#c0153bc0a5375ebc1f1591cb7eea223adea9f169"
664
+  integrity sha512-/vqUt5Yh+cgPZXXjmaG9NT8aVfThKk7G4OqkVhrXqwsC5soMn/qTCxs36rZ2QFhpfTJcjw4SNDIZ4RUb8OL4jQ==
673 665
   dependencies:
674
-    "@babel/helper-module-imports" "^7.7.4"
675
-    "@babel/helper-plugin-utils" "^7.0.0"
666
+    "@babel/helper-module-imports" "^7.8.3"
667
+    "@babel/helper-plugin-utils" "^7.8.3"
676 668
     resolve "^1.8.1"
677 669
     semver "^5.5.1"
678 670
 
@@ -825,22 +817,22 @@
825 817
     "@babel/parser" "^7.8.3"
826 818
     "@babel/types" "^7.8.3"
827 819
 
828
-"@babel/traverse@^7.0.0", "@babel/traverse@^7.1.0", "@babel/traverse@^7.8.3":
829
-  version "7.8.3"
830
-  resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.8.3.tgz#a826215b011c9b4f73f3a893afbc05151358bf9a"
831
-  integrity sha512-we+a2lti+eEImHmEXp7bM9cTxGzxPmBiVJlLVD+FuuQMeeO7RaDbutbgeheDkw+Xe3mCfJHnGOWLswT74m2IPg==
820
+"@babel/traverse@^7.0.0", "@babel/traverse@^7.1.0", "@babel/traverse@^7.8.3", "@babel/traverse@^7.8.4":
821
+  version "7.8.4"
822
+  resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.8.4.tgz#f0845822365f9d5b0e312ed3959d3f827f869e3c"
823
+  integrity sha512-NGLJPZwnVEyBPLI+bl9y9aSnxMhsKz42so7ApAv9D+b4vAFPpY013FTS9LdKxcABoIYFU52HcYga1pPlx454mg==
832 824
   dependencies:
833 825
     "@babel/code-frame" "^7.8.3"
834
-    "@babel/generator" "^7.8.3"
826
+    "@babel/generator" "^7.8.4"
835 827
     "@babel/helper-function-name" "^7.8.3"
836 828
     "@babel/helper-split-export-declaration" "^7.8.3"
837
-    "@babel/parser" "^7.8.3"
829
+    "@babel/parser" "^7.8.4"
838 830
     "@babel/types" "^7.8.3"
839 831
     debug "^4.1.0"
840 832
     globals "^11.1.0"
841 833
     lodash "^4.17.13"
842 834
 
843
-"@babel/types@^7.0.0", "@babel/types@^7.0.0-beta.49", "@babel/types@^7.3.0", "@babel/types@^7.8.0", "@babel/types@^7.8.3":
835
+"@babel/types@^7.0.0", "@babel/types@^7.0.0-beta.49", "@babel/types@^7.3.0", "@babel/types@^7.8.3":
844 836
   version "7.8.3"
845 837
   resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.8.3.tgz#5a383dffa5416db1b73dedffd311ffd0788fb31c"
846 838
   integrity sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==
@@ -1710,11 +1702,6 @@ arrow-key-navigation@^1.1.0:
1710 1702
   resolved "https://registry.yarnpkg.com/arrow-key-navigation/-/arrow-key-navigation-1.1.0.tgz#c0f7021d006593e2e34e79aa1f032714877d3a76"
1711 1703
   integrity sha512-u73yfJRmKye5eZiMNrAUKaBIRt47/1NM8WEtVAPjjMDab/PVn0sKIuapvCxl7C+tI9nH0QOl1Tc2YL2aO9n9Zw==
1712 1704
 
1713
-asap@~2.0.3:
1714
-  version "2.0.6"
1715
-  resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46"
1716
-  integrity sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=
1717
-
1718 1705
 asn1.js@^4.0.0:
1719 1706
   version "4.10.1"
1720 1707
   resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.10.1.tgz#b9c2bf5805f1e64aadeed6df3a2bfafb5a73f5a0"
@@ -1817,10 +1804,10 @@ axios@^0.18.0:
1817 1804
     follow-redirects "1.5.10"
1818 1805
     is-buffer "^2.0.2"
1819 1806
 
1820
-axios@^0.19.1:
1821
-  version "0.19.1"
1822
-  resolved "https://registry.yarnpkg.com/axios/-/axios-0.19.1.tgz#8a6a04eed23dfe72747e1dd43c604b8f1677b5aa"
1823
-  integrity sha512-Yl+7nfreYKaLRvAvjNPkvfjnQHJM1yLBY3zhqAwcJSwR/6ETkanUgylgtIvkvz0xJ+p/vZuNw8X7Hnb7Whsbpw==
1807
+axios@^0.19.2:
1808
+  version "0.19.2"
1809
+  resolved "https://registry.yarnpkg.com/axios/-/axios-0.19.2.tgz#3ea36c5d8818d0d5f8a8a97a6d36b86cdc00cb27"
1810
+  integrity sha512-fjgm5MvRHLhx+osE2xoekY70AhARk3a6hkN+3Io1jc00jtquGvxYlKlsFUhmUET0V5te6CcZI7lcv2Ym61mjHA==
1824 1811
   dependencies:
1825 1812
     follow-redirects "1.5.10"
1826 1813
 
@@ -2827,11 +2814,6 @@ core-js-compat@^3.6.2:
2827 2814
     browserslist "^4.8.3"
2828 2815
     semver "7.0.0"
2829 2816
 
2830
-core-js@^1.0.0:
2831
-  version "1.2.7"
2832
-  resolved "https://registry.yarnpkg.com/core-js/-/core-js-1.2.7.tgz#652294c14651db28fa93bd2d5ff2983a4f08c636"
2833
-  integrity sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY=
2834
-
2835 2817
 core-js@^2.4.0:
2836 2818
   version "2.6.1"
2837 2819
   resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.1.tgz#87416ae817de957a3f249b3b5ca475d4aaed6042"
@@ -3179,11 +3161,6 @@ csstype@^2.5.7:
3179 3161
   resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.6.6.tgz#c34f8226a94bbb10c32cc0d714afdf942291fc41"
3180 3162
   integrity sha512-RpFbQGUE74iyPgvr46U9t1xoQBM8T4BL8SxrN66Le2xYAPSaDJJKeztV3awugusb3g3G9iL8StmkBBXhcbbXhg==
3181 3163
 
3182
-csstype@^2.6.7:
3183
-  version "2.6.8"
3184
-  resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.6.8.tgz#0fb6fc2417ffd2816a418c9336da74d7f07db431"
3185
-  integrity sha512-msVS9qTuMT5zwAGCVm4mxfrZ18BNc6Csd0oJAtiFMZ1FAx1CCvy2+5MDmYoix63LM/6NDbNtodCiGYGmFgO0dA==
3186
-
3187 3164
 cyclist@^1.0.1:
3188 3165
   version "1.0.1"
3189 3166
   resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-1.0.1.tgz#596e9698fd0c80e12038c2b82d6eb1b35b6224d9"
@@ -3466,14 +3443,6 @@ dom-helpers@^3.2.1, dom-helpers@^3.3.1:
3466 3443
   dependencies:
3467 3444
     "@babel/runtime" "^7.1.2"
3468 3445
 
3469
-dom-helpers@^5.1.3:
3470
-  version "5.1.3"
3471
-  resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-5.1.3.tgz#7233248eb3a2d1f74aafca31e52c5299cc8ce821"
3472
-  integrity sha512-nZD1OtwfWGRBWlpANxacBEZrEuLa16o1nh7YopFWeoF68Zt8GGEmzHu6Xv4F3XaFIC+YXtTLrzgqKxFgLEe4jw==
3473
-  dependencies:
3474
-    "@babel/runtime" "^7.6.3"
3475
-    csstype "^2.6.7"
3476
-
3477 3446
 dom-serializer@0:
3478 3447
   version "0.1.0"
3479 3448
   resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.1.0.tgz#073c697546ce0780ce23be4a28e293e40bc30c82"
@@ -3627,13 +3596,6 @@ encodeurl@~1.0.2:
3627 3596
   resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59"
3628 3597
   integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=
3629 3598
 
3630
-encoding@^0.1.11:
3631
-  version "0.1.12"
3632
-  resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.12.tgz#538b66f3ee62cd1ab51ec323829d1f9480c74beb"
3633
-  integrity sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=
3634
-  dependencies:
3635
-    iconv-lite "~0.4.13"
3636
-
3637 3599
 end-of-stream@^1.0.0, end-of-stream@^1.1.0:
3638 3600
   version "1.4.4"
3639 3601
   resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0"
@@ -3732,6 +3694,13 @@ error-ex@^1.2.0, error-ex@^1.3.1:
3732 3694
   dependencies:
3733 3695
     is-arrayish "^0.2.1"
3734 3696
 
3697
+error-stack-parser@^2.0.6:
3698
+  version "2.0.6"
3699
+  resolved "https://registry.yarnpkg.com/error-stack-parser/-/error-stack-parser-2.0.6.tgz#5a99a707bd7a4c58a797902d48d82803ede6aad8"
3700
+  integrity sha512-d51brTeqC+BHlwF0BhPtcYgF5nlzf9ZZ0ZIUQNZpc9ZB9qw5IJ2diTrBY9jlCJkTLITYPjmiX6OWCwH+fuyNgQ==
3701
+  dependencies:
3702
+    stackframe "^1.1.1"
3703
+
3735 3704
 es-abstract@^1.13.0, es-abstract@^1.15.0, es-abstract@^1.17.0, es-abstract@^1.17.0-next.1, es-abstract@^1.5.1:
3736 3705
   version "1.17.0"
3737 3706
   resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.0.tgz#f42a517d0036a5591dbb2c463591dc8bb50309b1"
@@ -3749,6 +3718,23 @@ es-abstract@^1.13.0, es-abstract@^1.15.0, es-abstract@^1.17.0, es-abstract@^1.17
3749 3718
     string.prototype.trimleft "^2.1.1"
3750 3719
     string.prototype.trimright "^2.1.1"
3751 3720
 
3721
+es-abstract@^1.17.0-next.0:
3722
+  version "1.17.4"
3723
+  resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.4.tgz#e3aedf19706b20e7c2594c35fc0d57605a79e184"
3724
+  integrity sha512-Ae3um/gb8F0mui/jPL+QiqmglkUsaQf7FwBEHYIFkztkneosu9imhqHpBzQ3h1vit8t5iQ74t6PEVvphBZiuiQ==
3725
+  dependencies:
3726
+    es-to-primitive "^1.2.1"
3727
+    function-bind "^1.1.1"
3728
+    has "^1.0.3"
3729
+    has-symbols "^1.0.1"
3730
+    is-callable "^1.1.5"
3731
+    is-regex "^1.0.5"
3732
+    object-inspect "^1.7.0"
3733
+    object-keys "^1.1.1"
3734
+    object.assign "^4.1.0"
3735
+    string.prototype.trimleft "^2.1.1"
3736
+    string.prototype.trimright "^2.1.1"
3737
+
3752 3738
 es-to-primitive@^1.2.1:
3753 3739
   version "1.2.1"
3754 3740
   resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a"
@@ -3878,10 +3864,10 @@ eslint-plugin-eslint-plugin@^2.1.0:
3878 3864
   resolved "https://registry.yarnpkg.com/eslint-plugin-eslint-plugin/-/eslint-plugin-eslint-plugin-2.1.0.tgz#a7a00f15a886957d855feacaafee264f039e62d5"
3879 3865
   integrity sha512-kT3A/ZJftt28gbl/Cv04qezb/NQ1dwYIbi8lyf806XMxkus7DvOVCLIfTXMrorp322Pnoez7+zabXH29tADIDg==
3880 3866
 
3881
-eslint-plugin-import@~2.20.0:
3882
-  version "2.20.0"
3883
-  resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.20.0.tgz#d749a7263fb6c29980def8e960d380a6aa6aecaa"
3884
-  integrity sha512-NK42oA0mUc8Ngn4kONOPsPB1XhbUvNHqF+g307dPV28aknPoiNnKLFd9em4nkswwepdF5ouieqv5Th/63U7YJQ==
3867
+eslint-plugin-import@~2.20.1:
3868
+  version "2.20.1"
3869
+  resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.20.1.tgz#802423196dcb11d9ce8435a5fc02a6d3b46939b3"
3870
+  integrity sha512-qQHgFOTjguR+LnYRoToeZWT62XM55MBVXObHM6SKFd1VzDcX/vqT1kAz8ssqigh5eMj8qXcRoXXGZpPP6RfdCw==
3885 3871
   dependencies:
3886 3872
     array-includes "^3.0.3"
3887 3873
     array.prototype.flat "^1.2.1"
@@ -4328,19 +4314,6 @@ fb-watchman@^2.0.0:
4328 4314
   dependencies:
4329 4315
     bser "^2.0.0"
4330 4316
 
4331
-fbjs@^0.8.4:
4332
-  version "0.8.17"
4333
-  resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.8.17.tgz#c4d598ead6949112653d6588b01a5cdcd9f90fdd"
4334
-  integrity sha1-xNWY6taUkRJlPWWIsBpc3Nn5D90=
4335
-  dependencies:
4336
-    core-js "^1.0.0"
4337
-    isomorphic-fetch "^2.1.1"
4338
-    loose-envify "^1.0.0"
4339
-    object-assign "^4.1.0"
4340
-    promise "^7.1.1"
4341
-    setimmediate "^1.0.5"
4342
-    ua-parser-js "^0.7.18"
4343
-
4344 4317
 figgy-pudding@^3.5.1:
4345 4318
   version "3.5.1"
4346 4319
   resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.1.tgz#862470112901c727a0e495a80744bd5baa1d6790"
@@ -4925,6 +4898,11 @@ has-flag@^3.0.0:
4925 4898
   resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
4926 4899
   integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0=
4927 4900
 
4901
+has-flag@^4.0.0:
4902
+  version "4.0.0"
4903
+  resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b"
4904
+  integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==
4905
+
4928 4906
 has-symbols@^1.0.0, has-symbols@^1.0.1:
4929 4907
   version "1.0.1"
4930 4908
   resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8"
@@ -5191,7 +5169,7 @@ https-browserify@^1.0.0:
5191 5169
   resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73"
5192 5170
   integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=
5193 5171
 
5194
-iconv-lite@0.4.24, iconv-lite@^0.4.24, iconv-lite@^0.4.4, iconv-lite@~0.4.13:
5172
+iconv-lite@0.4.24, iconv-lite@^0.4.24, iconv-lite@^0.4.4:
5195 5173
   version "0.4.24"
5196 5174
   resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b"
5197 5175
   integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==
@@ -5755,7 +5733,7 @@ is-resolvable@^1.0.0:
5755 5733
   resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88"
5756 5734
   integrity sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==
5757 5735
 
5758
-is-stream@^1.0.1, is-stream@^1.1.0:
5736
+is-stream@^1.1.0:
5759 5737
   version "1.1.0"
5760 5738
   resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44"
5761 5739
   integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ=
@@ -5836,14 +5814,6 @@ isobject@^3.0.0, isobject@^3.0.1:
5836 5814
   resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df"
5837 5815
   integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8=
5838 5816
 
5839
-isomorphic-fetch@^2.1.1:
5840
-  version "2.2.1"
5841
-  resolved "https://registry.yarnpkg.com/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz#611ae1acf14f5e81f729507472819fe9733558a9"
5842
-  integrity sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk=
5843
-  dependencies:
5844
-    node-fetch "^1.0.1"
5845
-    whatwg-fetch ">=0.10.0"
5846
-
5847 5817
 isstream@~0.1.2:
5848 5818
   version "0.1.2"
5849 5819
   resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a"
@@ -6245,6 +6215,14 @@ jest-worker@^24.6.0, jest-worker@^24.9.0:
6245 6215
     merge-stream "^2.0.0"
6246 6216
     supports-color "^6.1.0"
6247 6217
 
6218
+jest-worker@^25.1.0:
6219
+  version "25.1.0"
6220
+  resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-25.1.0.tgz#75d038bad6fdf58eba0d2ec1835856c497e3907a"
6221
+  integrity sha512-ZHhHtlxOWSxCoNOKHGbiLzXnl42ga9CxDr27H36Qn+15pQZd3R/F24jrmjDelw9j/iHUIWMWs08/u2QN50HHOg==
6222
+  dependencies:
6223
+    merge-stream "^2.0.0"
6224
+    supports-color "^7.0.0"
6225
+
6248 6226
 jest@^24.9.0:
6249 6227
   version "24.9.0"
6250 6228
   resolved "https://registry.yarnpkg.com/jest/-/jest-24.9.0.tgz#987d290c05a08b52c56188c1002e368edb007171"
@@ -7106,14 +7084,6 @@ nice-try@^1.0.4:
7106 7084
   resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366"
7107 7085
   integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==
7108 7086
 
7109
-node-fetch@^1.0.1:
7110
-  version "1.7.3"
7111
-  resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.3.tgz#980f6f72d85211a5347c6b2bc18c5b84c3eb47ef"
7112
-  integrity sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==
7113
-  dependencies:
7114
-    encoding "^0.1.11"
7115
-    is-stream "^1.0.1"
7116
-
7117 7087
 node-forge@0.9.0:
7118 7088
   version "0.9.0"
7119 7089
   resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.9.0.tgz#d624050edbb44874adca12bb9a52ec63cb782579"
@@ -7562,10 +7532,10 @@ p-limit@^1.1.0:
7562 7532
   dependencies:
7563 7533
     p-try "^1.0.0"
7564 7534
 
7565
-p-limit@^2.0.0, p-limit@^2.2.0, p-limit@^2.2.1:
7566
-  version "2.2.1"
7567
-  resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.2.1.tgz#aa07a788cc3151c939b5131f63570f0dd2009537"
7568
-  integrity sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg==
7535
+p-limit@^2.0.0, p-limit@^2.2.0, p-limit@^2.2.1, p-limit@^2.2.2:
7536
+  version "2.2.2"
7537
+  resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.2.2.tgz#61279b67721f5287aa1c13a9a7fbbc48c9291b1e"
7538
+  integrity sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==
7569 7539
   dependencies:
7570 7540
     p-try "^2.0.0"
7571 7541
 
@@ -8401,12 +8371,14 @@ promise-inflight@^1.0.1:
8401 8371
   resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3"
8402 8372
   integrity sha1-mEcocL8igTL8vdhoEputEsPAKeM=
8403 8373
 
8404
-promise@^7.1.1:
8405
-  version "7.3.1"
8406
-  resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf"
8407
-  integrity sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==
8374
+promise.prototype.finally@^3.1.2:
8375
+  version "3.1.2"
8376
+  resolved "https://registry.yarnpkg.com/promise.prototype.finally/-/promise.prototype.finally-3.1.2.tgz#b8af89160c9c673cefe3b4c4435b53cfd0287067"
8377
+  integrity sha512-A2HuJWl2opDH0EafgdjwEw7HysI8ff/n4lW4QEVBCUXFk9QeGecBWv0Deph0UmLe3tTNYegz8MOjsVuE6SMoJA==
8408 8378
   dependencies:
8409
-    asap "~2.0.3"
8379
+    define-properties "^1.1.3"
8380
+    es-abstract "^1.17.0-next.0"
8381
+    function-bind "^1.1.1"
8410 8382
 
8411 8383
 prompts@^2.0.1:
8412 8384
   version "2.0.3"
@@ -8752,14 +8724,13 @@ react-redux-loading-bar@^4.0.8:
8752 8724
     prop-types "^15.6.2"
8753 8725
     react-lifecycles-compat "^3.0.2"
8754 8726
 
8755
-react-redux@^7.1.3:
8756
-  version "7.1.3"
8757
-  resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-7.1.3.tgz#717a3d7bbe3a1b2d535c94885ce04cdc5a33fc79"
8758
-  integrity sha512-uI1wca+ECG9RoVkWQFF4jDMqmaw0/qnvaSvOoL/GA4dNxf6LoV8sUAcNDvE5NWKs4hFpn0t6wswNQnY3f7HT3w==
8727
+react-redux@^7.2.0:
8728
+  version "7.2.0"
8729
+  resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-7.2.0.tgz#f970f62192b3981642fec46fd0db18a074fe879d"
8730
+  integrity sha512-EvCAZYGfOLqwV7gh849xy9/pt55rJXPwmYvI4lilPM5rUT/1NxuuN59ipdBksRVSvz0KInbPnp4IfoXJXCqiDA==
8759 8731
   dependencies:
8760 8732
     "@babel/runtime" "^7.5.5"
8761 8733
     hoist-non-react-statics "^3.3.0"
8762
-    invariant "^2.2.4"
8763 8734
     loose-envify "^1.4.0"
8764 8735
     prop-types "^15.7.2"
8765 8736
     react-is "^16.9.0"
@@ -8818,36 +8789,35 @@ react-sparklines@^1.7.0:
8818 8789
   dependencies:
8819 8790
     prop-types "^15.5.10"
8820 8791
 
8821
-react-swipeable-views-core@^0.13.1:
8822
-  version "0.13.1"
8823
-  resolved "https://registry.yarnpkg.com/react-swipeable-views-core/-/react-swipeable-views-core-0.13.1.tgz#8829a922462a8bdd701709cd1b385393d38f1527"
8824
-  integrity sha512-EP8sCvvD7VDiZLglPt9icMuMNu8qLRLk0ab/fB1HXv7lX8ClnwF3UMCM0ZrN3sguSY7CsX3LevducGGsT1VcDg==
8792
+react-swipeable-views-core@^0.13.7:
8793
+  version "0.13.7"
8794
+  resolved "https://registry.yarnpkg.com/react-swipeable-views-core/-/react-swipeable-views-core-0.13.7.tgz#c082b553f26e83fd20fc17f934200eb717023c8a"
8795
+  integrity sha512-ekn9oDYfBt0oqJSGGwLEhKvn+QaqMGTy//9dURTLf+vp7W5j6GvmKryYdnwJCDITaPFI2hujXV4CH9krhvaE5w==
8825 8796
   dependencies:
8826 8797
     "@babel/runtime" "7.0.0"
8827 8798
     warning "^4.0.1"
8828 8799
 
8829
-react-swipeable-views-utils@^0.13.4:
8830
-  version "0.13.4"
8831
-  resolved "https://registry.yarnpkg.com/react-swipeable-views-utils/-/react-swipeable-views-utils-0.13.4.tgz#809fe408e55ed80f84eea508074387c23febf0ab"
8832
-  integrity sha512-C6Ppq7Z5JIn4l8gKuRzzoGcm5Yiu57HBribjZ0T8DIeLisvIvk8A+Wysb1JhP0hsnJ9hIozlEZ8oJi4eBUTRXg==
8800
+react-swipeable-views-utils@^0.13.9:
8801
+  version "0.13.9"
8802
+  resolved "https://registry.yarnpkg.com/react-swipeable-views-utils/-/react-swipeable-views-utils-0.13.9.tgz#a66e98f2f4502d8b00182901f80d13b2f903e10f"
8803
+  integrity sha512-QLGxRKrbJCbWz94vkWLzb1Daaa2Y/TZKmsNKQ6WSNrS+chrlfZ3z9tqZ7YUJlW6pRWp3QZdLSY3UE3cN0TXXmw==
8833 8804
   dependencies:
8834 8805
     "@babel/runtime" "7.0.0"
8835
-    fbjs "^0.8.4"
8836 8806
     keycode "^2.1.7"
8837 8807
     prop-types "^15.6.0"
8838 8808
     react-event-listener "^0.6.0"
8839
-    react-swipeable-views-core "^0.13.1"
8809
+    react-swipeable-views-core "^0.13.7"
8810
+    shallow-equal "^1.2.1"
8840 8811
 
8841
-react-swipeable-views@^0.13.4:
8842
-  version "0.13.4"
8843
-  resolved "https://registry.yarnpkg.com/react-swipeable-views/-/react-swipeable-views-0.13.4.tgz#ebbe50a8592b185dbedf9e0060eaee09cf6b2c67"
8844
-  integrity sha512-Qwmaj8LASEgxp3i4FBEgs1LM/Yqk7mFRp0fRgXH515NIEePUcjrrkuwvvmvwNQLDbN6PNv4QAuosEaTRyjEOUA==
8812
+react-swipeable-views@^0.13.9:
8813
+  version "0.13.9"
8814
+  resolved "https://registry.yarnpkg.com/react-swipeable-views/-/react-swipeable-views-0.13.9.tgz#d6a6c508bf5288ad55509f9c65916db5df0f2cec"
8815
+  integrity sha512-WXC2FKYvZ9QdJ31v9LjEJEl1bA7E4AcaloTkbW0uU0dYf5uvv4aOpiyxubvOkVl1a5L2UAHmKSif4TmJ9usrSg==
8845 8816
   dependencies:
8846 8817
     "@babel/runtime" "7.0.0"
8847
-    dom-helpers "^5.1.3"
8848 8818
     prop-types "^15.5.4"
8849
-    react-swipeable-views-core "^0.13.1"
8850
-    react-swipeable-views-utils "^0.13.4"
8819
+    react-swipeable-views-core "^0.13.7"
8820
+    react-swipeable-views-utils "^0.13.9"
8851 8821
     warning "^4.0.1"
8852 8822
 
8853 8823
 react-test-renderer@^16.0.0-0, react-test-renderer@^16.12.0:
@@ -9102,10 +9072,10 @@ regjsparser@^0.6.0:
9102 9072
   dependencies:
9103 9073
     jsesc "~0.5.0"
9104 9074
 
9105
-rellax@^1.10.0:
9106
-  version "1.10.0"
9107
-  resolved "https://registry.yarnpkg.com/rellax/-/rellax-1.10.0.tgz#0308b813b458f9175d37ffb4272e1f616eab1341"
9108
-  integrity sha512-BtxD9b8cAQcTs6iat1fqKvHMjIZ8CaxjsC5U/cIIVHC4LjkIsr0ZmeqxUm5ZvBvyjLwfPbU8Wcryp77sR5C8QA==
9075
+rellax@^1.12.1:
9076
+  version "1.12.1"
9077
+  resolved "https://registry.yarnpkg.com/rellax/-/rellax-1.12.1.tgz#1b433ef7ac4aa3573449a33efab391c112f6b34d"
9078
+  integrity sha512-XBIi0CDpW5FLTujYjYBn1CIbK2CJL6TsAg/w409KghP2LucjjzBjsujXDAjyBLWgsfupfUcL5WzdnIPcGfK7XA==
9109 9079
 
9110 9080
 remove-trailing-separator@^1.0.1:
9111 9081
   version "1.1.0"
@@ -9305,24 +9275,24 @@ rgba-regex@^1.0.0:
9305 9275
   resolved "https://registry.yarnpkg.com/rgba-regex/-/rgba-regex-1.0.0.tgz#43374e2e2ca0968b0ef1523460b7d730ff22eeb3"
9306 9276
   integrity sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=
9307 9277
 
9308
-rimraf@2.6.3, rimraf@^2.6.2, rimraf@~2.6.2:
9278
+rimraf@2.6.3, rimraf@~2.6.2:
9309 9279
   version "2.6.3"
9310 9280
   resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab"
9311 9281
   integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==
9312 9282
   dependencies:
9313 9283
     glob "^7.1.3"
9314 9284
 
9315
-rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.3, rimraf@^2.7.1:
9285
+rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2, rimraf@^2.6.3, rimraf@^2.7.1:
9316 9286
   version "2.7.1"
9317 9287
   resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec"
9318 9288
   integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==
9319 9289
   dependencies:
9320 9290
     glob "^7.1.3"
9321 9291
 
9322
-rimraf@^3.0.0:
9323
-  version "3.0.0"
9324
-  resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.0.tgz#614176d4b3010b75e5c390eb0ee96f6dc0cebb9b"
9325
-  integrity sha512-NDGVxTsjqfunkds7CqsOiEnxln4Bo7Nddl3XhS4pXg5OzwkLqJ971ZVAAnB+DDLnF76N+VnDEiBHaVV8I06SUg==
9292
+rimraf@^3.0.2:
9293
+  version "3.0.2"
9294
+  resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a"
9295
+  integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==
9326 9296
   dependencies:
9327 9297
     glob "^7.1.3"
9328 9298
 
@@ -9448,10 +9418,10 @@ sass-loader@^8.0.2:
9448 9418
     schema-utils "^2.6.1"
9449 9419
     semver "^6.3.0"
9450 9420
 
9451
-sass@^1.24.2:
9452
-  version "1.24.2"
9453
-  resolved "https://registry.yarnpkg.com/sass/-/sass-1.24.2.tgz#0a0e0f00368be6808b2e94470172266ac45498fe"
9454
-  integrity sha512-0JxdMMRd0fOmGFQFRI91vh4n0Ed766ib9JwPUa+1C37zn3VaqlHxbknUn/6LqP/MSfvNPxRYoCrYf5g8vu4OHw==
9421
+sass@^1.25.0:
9422
+  version "1.25.0"
9423
+  resolved "https://registry.yarnpkg.com/sass/-/sass-1.25.0.tgz#f8bd7dfbb39d6b0305e27704a8ebe637820693f3"
9424
+  integrity sha512-uQMjye0Y70SEDGO56n0j91tauqS9E1BmpKHtiYNQScXDHeaE9uHwNEqQNFf4Bes/3DHMNinB6u79JsG10XWNyw==
9455 9425
   dependencies:
9456 9426
     chokidar ">=2.0.0 <4.0.0"
9457 9427
 
@@ -9477,10 +9447,10 @@ schema-utils@^1.0.0:
9477 9447
     ajv-errors "^1.0.0"
9478 9448
     ajv-keywords "^3.1.0"
9479 9449
 
9480
-schema-utils@^2.5.0, schema-utils@^2.6.0, schema-utils@^2.6.1:
9481
-  version "2.6.1"
9482
-  resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.6.1.tgz#eb78f0b945c7bcfa2082b3565e8db3548011dc4f"
9483
-  integrity sha512-0WXHDs1VDJyo+Zqs9TKLKyD/h7yDpHUhEFsM2CzkICFdoX1av+GBq/J2xRTFfsQO5kBfhZzANf2VcIm84jqDbg==
9450
+schema-utils@^2.5.0, schema-utils@^2.6.0, schema-utils@^2.6.1, schema-utils@^2.6.4:
9451
+  version "2.6.4"
9452
+  resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.6.4.tgz#a27efbf6e4e78689d91872ee3ccfa57d7bdd0f53"
9453
+  integrity sha512-VNjcaUxVnEeun6B2fiiUDjXXBtD4ZSH7pdbfIu1pOFwgptDPLMo/z9jr4sUfsjFVPqDCEin/F7IYlq7/E6yDbQ==
9484 9454
   dependencies:
9485 9455
     ajv "^6.10.2"
9486 9456
     ajv-keywords "^3.4.1"
@@ -9587,7 +9557,7 @@ set-value@^2.0.0, set-value@^2.0.1:
9587 9557
     is-plain-object "^2.0.3"
9588 9558
     split-string "^3.0.1"
9589 9559
 
9590
-setimmediate@^1.0.4, setimmediate@^1.0.5:
9560
+setimmediate@^1.0.4:
9591 9561
   version "1.0.5"
9592 9562
   resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285"
9593 9563
   integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=
@@ -9617,6 +9587,11 @@ shallow-clone@^3.0.0:
9617 9587
   dependencies:
9618 9588
     kind-of "^6.0.2"
9619 9589
 
9590
+shallow-equal@^1.2.1:
9591
+  version "1.2.1"
9592
+  resolved "https://registry.yarnpkg.com/shallow-equal/-/shallow-equal-1.2.1.tgz#4c16abfa56043aa20d050324efa68940b0da79da"
9593
+  integrity sha512-S4vJDjHHMBaiZuT9NPb616CSmLf618jawtv3sufLl6ivK8WocjAo58cXwbRV1cgqxH0Qbv+iUt6m05eqEa2IRA==
9594
+
9620 9595
 shebang-command@^1.2.0:
9621 9596
   version "1.2.0"
9622 9597
   resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea"
@@ -9786,6 +9761,11 @@ source-map-url@^0.4.0:
9786 9761
   resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3"
9787 9762
   integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=
9788 9763
 
9764
+source-map@0.5.6:
9765
+  version "0.5.6"
9766
+  resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.6.tgz#75ce38f52bf0733c5a7f0c118d81334a2bb5f412"
9767
+  integrity sha1-dc449SvwczxafwwRjYEzSiu19BI=
9768
+
9789 9769
 source-map@^0.5.0, source-map@^0.5.3, source-map@^0.5.6, source-map@^0.5.7:
9790 9770
   version "0.5.7"
9791 9771
   resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
@@ -9899,11 +9879,40 @@ stable@~0.1.6:
9899 9879
   resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf"
9900 9880
   integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==
9901 9881
 
9882
+stack-generator@^2.0.5:
9883
+  version "2.0.5"
9884
+  resolved "https://registry.yarnpkg.com/stack-generator/-/stack-generator-2.0.5.tgz#fb00e5b4ee97de603e0773ea78ce944d81596c36"
9885
+  integrity sha512-/t1ebrbHkrLrDuNMdeAcsvynWgoH/i4o8EGGfX7dEYDoTXOYVAkEpFdtshlvabzc6JlJ8Kf9YdFEoz7JkzGN9Q==
9886
+  dependencies:
9887
+    stackframe "^1.1.1"
9888
+
9902 9889
 stack-utils@^1.0.1:
9903 9890
   version "1.0.2"
9904 9891
   resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-1.0.2.tgz#33eba3897788558bebfc2db059dc158ec36cebb8"
9905 9892
   integrity sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA==
9906 9893
 
9894
+stackframe@^1.1.1:
9895
+  version "1.1.1"
9896
+  resolved "https://registry.yarnpkg.com/stackframe/-/stackframe-1.1.1.tgz#ffef0a3318b1b60c3b58564989aca5660729ec71"
9897
+  integrity sha512-0PlYhdKh6AfFxRyK/v+6/k+/mMfyiEBbTM5L94D0ZytQnJ166wuwoTYLHFWGbs2dpA8Rgq763KGWmN1EQEYHRQ==
9898
+
9899
+stacktrace-gps@^3.0.4:
9900
+  version "3.0.4"
9901
+  resolved "https://registry.yarnpkg.com/stacktrace-gps/-/stacktrace-gps-3.0.4.tgz#7688dc2fc09ffb3a13165ebe0dbcaf41bcf0c69a"
9902
+  integrity sha512-qIr8x41yZVSldqdqe6jciXEaSCKw1U8XTXpjDuy0ki/apyTn/r3w9hDAAQOhZdxvsC93H+WwwEu5cq5VemzYeg==
9903
+  dependencies:
9904
+    source-map "0.5.6"
9905
+    stackframe "^1.1.1"
9906
+
9907
+stacktrace-js@^2.0.2:
9908
+  version "2.0.2"
9909
+  resolved "https://registry.yarnpkg.com/stacktrace-js/-/stacktrace-js-2.0.2.tgz#4ca93ea9f494752d55709a081d400fdaebee897b"
9910
+  integrity sha512-Je5vBeY4S1r/RnLydLl0TBTi3F2qdfWmYsGvtfZgEI+SCprPppaIhQf5nGcal4gI4cGpCV/duLcAzT1np6sQqg==
9911
+  dependencies:
9912
+    error-stack-parser "^2.0.6"
9913
+    stack-generator "^2.0.5"
9914
+    stacktrace-gps "^3.0.4"
9915
+
9907 9916
 static-extend@^0.1.1:
9908 9917
   version "0.1.2"
9909 9918
   resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6"
@@ -10141,6 +10150,13 @@ supports-color@^5.3.0:
10141 10150
   dependencies:
10142 10151
     has-flag "^3.0.0"
10143 10152
 
10153
+supports-color@^7.0.0:
10154
+  version "7.1.0"
10155
+  resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.1.0.tgz#68e32591df73e25ad1c4b49108a2ec507962bfd1"
10156
+  integrity sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==
10157
+  dependencies:
10158
+    has-flag "^4.0.0"
10159
+
10144 10160
 svgo@^1.0.0:
10145 10161
   version "1.1.1"
10146 10162
   resolved "https://registry.yarnpkg.com/svgo/-/svgo-1.1.1.tgz#12384b03335bcecd85cfa5f4e3375fed671cb985"
@@ -10231,15 +10247,16 @@ terser-webpack-plugin@^1.4.3:
10231 10247
     webpack-sources "^1.4.0"
10232 10248
     worker-farm "^1.7.0"
10233 10249
 
10234
-terser-webpack-plugin@^2.3.2:
10235
-  version "2.3.2"
10236
-  resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-2.3.2.tgz#6d3d1b0590c8f729bfbaeb7fb2528b8b62db4c74"
10237
-  integrity sha512-SmvB/6gtEPv+CJ88MH5zDOsZdKXPS/Uzv2//e90+wM1IHFUhsguPKEILgzqrM1nQ4acRXN/SV4Obr55SXC+0oA==
10250
+terser-webpack-plugin@^2.3.5:
10251
+  version "2.3.5"
10252
+  resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-2.3.5.tgz#5ad971acce5c517440ba873ea4f09687de2f4a81"
10253
+  integrity sha512-WlWksUoq+E4+JlJ+h+U+QUzXpcsMSSNXkDy9lBVkSqDn1w23Gg29L/ary9GeJVYCGiNJJX7LnVc4bwL1N3/g1w==
10238 10254
   dependencies:
10239 10255
     cacache "^13.0.1"
10240 10256
     find-cache-dir "^3.2.0"
10241
-    jest-worker "^24.9.0"
10242
-    schema-utils "^2.6.1"
10257
+    jest-worker "^25.1.0"
10258
+    p-limit "^2.2.2"
10259
+    schema-utils "^2.6.4"
10243 10260
     serialize-javascript "^2.1.2"
10244 10261
     source-map "^0.6.1"
10245 10262
     terser "^4.4.3"
@@ -10500,11 +10517,6 @@ typedarray@^0.0.6:
10500 10517
   resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
10501 10518
   integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=
10502 10519
 
10503
-ua-parser-js@^0.7.18:
10504
-  version "0.7.19"
10505
-  resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.19.tgz#94151be4c0a7fb1d001af7022fdaca4642659e4b"
10506
-  integrity sha512-T3PVJ6uz8i0HzPxOF9SWzWAlfN/DavlpQqepn22xgve/5QecC+XMCAtmUNnY7C9StehaV6exjUCI801lOI7QlQ==
10507
-
10508 10520
 uglify-js@^3.1.4:
10509 10521
   version "3.7.2"
10510 10522
   resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.7.2.tgz#cb1a601e67536e9ed094a92dd1e333459643d3f9"
@@ -10682,10 +10694,10 @@ utils-merge@1.0.1:
10682 10694
   resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713"
10683 10695
   integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=
10684 10696
 
10685
-uuid@^3.0.1, uuid@^3.3.2, uuid@^3.3.3:
10686
-  version "3.3.3"
10687
-  resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.3.tgz#4568f0216e78760ee1dbf3a4d2cf53e224112866"
10688
-  integrity sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ==
10697
+uuid@^3.0.1, uuid@^3.3.2, uuid@^3.4.0:
10698
+  version "3.4.0"
10699
+  resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee"
10700
+  integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==
10689 10701
 
10690 10702
 v8-compile-cache@2.0.3, v8-compile-cache@^2.0.3:
10691 10703
   version "2.0.3"
@@ -10820,10 +10832,10 @@ webpack-bundle-analyzer@^3.6.0:
10820 10832
     opener "^1.5.1"
10821 10833
     ws "^6.0.0"
10822 10834
 
10823
-webpack-cli@^3.3.10:
10824
-  version "3.3.10"
10825
-  resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-3.3.10.tgz#17b279267e9b4fb549023fae170da8e6e766da13"
10826
-  integrity sha512-u1dgND9+MXaEt74sJR4PR7qkPxXUSQ0RXYq8x1L6Jg1MYVEmGPrH6Ah6C4arD4r0J1P5HKjRqpab36k0eIzPqg==
10835
+webpack-cli@^3.3.11:
10836
+  version "3.3.11"
10837
+  resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-3.3.11.tgz#3bf21889bf597b5d82c38f215135a411edfdc631"
10838
+  integrity sha512-dXlfuml7xvAFwYUPsrtQAA9e4DOe58gnzSxhgrO/ZM/gyXTBowrsYeubyN4mqGhYdpXMFNyQ6emjJS9M7OBd4g==
10827 10839
   dependencies:
10828 10840
     chalk "2.4.2"
10829 10841
     cross-spawn "6.0.5"
@@ -10960,11 +10972,6 @@ whatwg-encoding@^1.0.1, whatwg-encoding@^1.0.3:
10960 10972
   dependencies:
10961 10973
     iconv-lite "0.4.24"
10962 10974
 
10963
-whatwg-fetch@>=0.10.0:
10964
-  version "3.0.0"
10965
-  resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz#fc804e458cc460009b1a2b966bc8817d2578aefb"
10966
-  integrity sha512-9GSJUgz1D4MfyKU7KRqwOjXCXTqWdFNvEr7eUBYchQiVc744mqK/MzXPNR2WsPkmkOa4ywfg8C2n8h+13Bey1Q==
10967
-
10968 10975
 whatwg-mimetype@^2.1.0, whatwg-mimetype@^2.2.0:
10969 10976
   version "2.3.0"
10970 10977
   resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf"

Loading…
Cancel
Save