Merge branch 'next-minor' into develop

This commit is contained in:
Benjamin Neff 2021-11-23 00:56:41 +01:00
commit 4902a35972
No known key found for this signature in database
GPG key ID: 971464C3F1A90194
26 changed files with 417 additions and 214 deletions

View file

@ -48,6 +48,9 @@ Although the chat was never enabled per default and was marked as experimental,
## Bug fixes ## Bug fixes
* Ensure the log folder exists [#8287](https://github.com/diaspora/diaspora/pull/8287) * Ensure the log folder exists [#8287](https://github.com/diaspora/diaspora/pull/8287)
* Limit name length in header [#8313] (https://github.com/diaspora/diaspora/pull/8313)
* Fix fallback avatar in hovercards [#8316](https://github.com/diaspora/diaspora/pull/8316)
* Use old person private key for export if relayable author migrated away [#8310](https://github.com/diaspora/diaspora/pull/8310)
## Features ## Features
* Add tags to tumblr posts [#8244](https://github.com/diaspora/diaspora/pull/8244) * Add tags to tumblr posts [#8244](https://github.com/diaspora/diaspora/pull/8244)
@ -58,6 +61,8 @@ Although the chat was never enabled per default and was marked as experimental,
* Add podmin mail address to the footer [#8242](https://github.com/diaspora/diaspora/pull/8242) * Add podmin mail address to the footer [#8242](https://github.com/diaspora/diaspora/pull/8242)
* Add username to password-reset mail [#8037](https://github.com/diaspora/diaspora/pull/8037) * Add username to password-reset mail [#8037](https://github.com/diaspora/diaspora/pull/8037)
* Resend account migration and deletion for closed recipients [#8309](https://github.com/diaspora/diaspora/pull/8309) * Resend account migration and deletion for closed recipients [#8309](https://github.com/diaspora/diaspora/pull/8309)
* Add sharing status to hovercards [#8317](https://github.com/diaspora/diaspora/pull/8317)
* Migrate photo URLs and cleanup old uploaded photos [#8314](https://github.com/diaspora/diaspora/pull/8314)
# 0.7.15.0 # 0.7.15.0

59
Gemfile
View file

@ -29,8 +29,8 @@ gem "yajl-ruby", "1.4.1"
gem "devise", "4.8.0" gem "devise", "4.8.0"
gem "devise_lastseenable", "0.0.6" gem "devise_lastseenable", "0.0.6"
gem "devise-two-factor", "4.0.0" gem "devise-two-factor", "4.0.1"
gem "rqrcode", "2.0.0" gem "rqrcode", "2.1.0"
# Captcha # Captcha
@ -38,8 +38,8 @@ gem "simple_captcha2", "0.5.0", require: "simple_captcha"
# Background processing # Background processing
gem "redis", "4.3.1" gem "redis", "4.5.1"
gem "sidekiq", "6.2.1" gem "sidekiq", "6.2.2"
# Scheduled processing # Scheduled processing
@ -47,12 +47,12 @@ gem "sidekiq-cron", "1.2.0"
# Compression # Compression
gem "terser", "1.1.5" gem "terser", "1.1.7"
# Configuration # Configuration
gem "configurate", "0.5.0" gem "configurate", "0.5.0"
gem "toml-rb", "2.0.1" gem "toml-rb", "2.1.0"
# Cross-origin resource sharing # Cross-origin resource sharing
@ -60,7 +60,7 @@ gem "rack-cors", "1.1.1", require: "rack/cors"
# CSS # CSS
gem "autoprefixer-rails", "10.2.5.1" gem "autoprefixer-rails", "10.3.3.0"
gem "bootstrap-sass", "3.4.1" gem "bootstrap-sass", "3.4.1"
gem "bootstrap-switch-rails", "3.3.3" # 3.3.4 and 3.3.5 is broken, see https://github.com/Bttstrp/bootstrap-switch/issues/691 gem "bootstrap-switch-rails", "3.3.3" # 3.3.4 and 3.3.5 is broken, see https://github.com/Bttstrp/bootstrap-switch/issues/691
gem "compass-rails", "3.1.0" gem "compass-rails", "3.1.0"
@ -81,7 +81,7 @@ gem "activerecord-import", "1.1.0"
# File uploading # File uploading
gem "carrierwave", "2.2.2" gem "carrierwave", "2.2.2"
gem "fog-aws", "3.10.0" gem "fog-aws", "3.12.0"
gem "mini_magick", "4.11.0" gem "mini_magick", "4.11.0"
# GUID generation # GUID generation
@ -96,7 +96,7 @@ gem "entypo-rails", "3.0.0"
gem "handlebars_assets", "0.23.9" gem "handlebars_assets", "0.23.9"
gem "jquery-rails", "4.4.0" gem "jquery-rails", "4.4.0"
gem "jquery-ui-rails", "5.0.5" gem "jquery-ui-rails", "5.0.5"
gem "js-routes", "1.4.14" gem "js-routes", "2.1.2"
gem "js_image_paths", "0.1.1" gem "js_image_paths", "0.1.1"
gem "sprockets-es6", "0.9.2" gem "sprockets-es6", "0.9.2"
@ -147,7 +147,7 @@ gem "leaflet-rails", "1.7.0"
# Parsing # Parsing
gem "nokogiri", "1.11.7" gem "nokogiri", "1.12.5"
gem "open_graph_reader", "0.7.2" # also update User-Agent in features/support/webmock.rb and open_graph_cache_spec.rb gem "open_graph_reader", "0.7.2" # also update User-Agent in features/support/webmock.rb and open_graph_cache_spec.rb
gem "redcarpet", "3.5.1" gem "redcarpet", "3.5.1"
gem "ruby-oembed", "0.15.0" gem "ruby-oembed", "0.15.0"
@ -159,18 +159,19 @@ gem "string-direction", "1.2.2"
# Security Headers # Security Headers
gem "secure_headers", "6.3.2" gem "secure_headers", "6.3.3"
# Services # Services
gem "omniauth", "1.9.1" gem "omniauth", "2.0.4"
gem "omniauth-tumblr", "1.2" gem "omniauth-rails_csrf_protection", "1.0.0"
gem "omniauth-twitter", "1.4.0" gem "omniauth-tumblr", "1.2"
gem "omniauth-wordpress", "0.2.2" gem "omniauth-twitter", "1.4.0"
gem "twitter", "7.0.0" gem "omniauth-wordpress", "0.2.2"
gem "twitter", "7.0.0"
# OpenID Connect # OpenID Connect
gem "openid_connect", "1.2.0" gem "openid_connect", "1.3.0"
# Serializers # Serializers
@ -182,19 +183,19 @@ gem "acts-as-taggable-on", "8.1.0"
# URIs and HTTP # URIs and HTTP
gem "addressable", "2.7.0", require: "addressable/uri" gem "addressable", "2.8.0", require: "addressable/uri"
gem "faraday", "0.17.4" gem "faraday", "0.17.4"
gem "faraday_middleware", "0.13.1" gem "faraday-cookie_jar", "0.0.7"
gem "faraday-cookie_jar", "0.0.6" gem "faraday_middleware", "0.14.0"
gem "typhoeus", "1.4.0" gem "typhoeus", "1.4.0"
# Views # Views
gem "gon", "6.4.0" gem "gon", "6.4.0"
gem "hamlit", "2.15.0" gem "hamlit", "2.15.1"
gem "mobile-fu", "1.4.0" gem "mobile-fu", "1.4.0"
gem "rails-timeago", "2.19.1" gem "rails-timeago", "2.19.1"
gem "will_paginate", "3.3.0" gem "will_paginate", "3.3.1"
# Logging # Logging
@ -202,7 +203,7 @@ gem "logging-rails", "0.6.0", require: "logging/rails"
# Reading and writing zip files # Reading and writing zip files
gem "rubyzip", "2.3.0", require: "zip" gem "rubyzip", "2.3.2", require: "zip"
# Prevent occasions where minitest is not bundled in # Prevent occasions where minitest is not bundled in
# packaged versions of ruby. See following issues/prs: # packaged versions of ruby. See following issues/prs:
@ -237,7 +238,7 @@ group :production do # we don"t install these on travis to speed up test runs
# Third party asset hosting # Third party asset hosting
gem "asset_sync", "2.14.2", require: false gem "asset_sync", "2.15.0", require: false
end end
group :development do group :development do
@ -275,7 +276,7 @@ group :test do
gem "apparition", "0.6.0" gem "apparition", "0.6.0"
gem "capybara", "3.35.3" gem "capybara", "3.35.3"
gem "database_cleaner-active_record", "1.8.0" gem "database_cleaner-active_record", "2.0.1"
gem "cucumber-api-steps", "0.14", require: false gem "cucumber-api-steps", "0.14", require: false
@ -284,21 +285,21 @@ group :test do
gem "factory_bot_rails", "6.1.0" gem "factory_bot_rails", "6.1.0"
gem "shoulda-matchers", "4.5.1" gem "shoulda-matchers", "4.5.1"
gem "timecop", "0.9.4" gem "timecop", "0.9.4"
gem "webmock", "3.13.0", require: false gem "webmock", "3.14.0", require: false
gem "diaspora_federation-test", "0.2.7" gem "diaspora_federation-test", "0.2.7"
end end
group :development, :test do group :development, :test do
# RSpec (unit tests, some integration tests) # RSpec (unit tests, some integration tests)
gem "rspec-rails", "5.0.1" gem "rspec-rails", "5.0.2"
# Cucumber (integration tests) # Cucumber (integration tests)
gem "cucumber-rails", "2.3.0", require: false gem "cucumber-rails", "2.4.0", require: false
# Jasmine (client side application tests (JS)) # Jasmine (client side application tests (JS))
gem "chrome_remote", "0.3.0" gem "chrome_remote", "0.3.0"
gem "jasmine", "3.7.0" gem "jasmine", "3.10.0"
gem "jasmine-jquery-rails", "2.0.3" gem "jasmine-jquery-rails", "2.0.3"
gem "rails-assets-jasmine-ajax", "4.0.0", source: "https://gems.diasporafoundation.org" gem "rails-assets-jasmine-ajax", "4.0.0", source: "https://gems.diasporafoundation.org"
gem "sinon-rails", "1.15.0" gem "sinon-rails", "1.15.0"

View file

@ -54,14 +54,14 @@ GEM
activemodel (>= 3.0.0) activemodel (>= 3.0.0)
activesupport (>= 3.0.0) activesupport (>= 3.0.0)
rack (>= 1.1.0) rack (>= 1.1.0)
addressable (2.7.0) addressable (2.8.0)
public_suffix (>= 2.0.2, < 5.0) public_suffix (>= 2.0.2, < 5.0)
aes_key_wrap (1.1.0) aes_key_wrap (1.1.0)
apparition (0.6.0) apparition (0.6.0)
capybara (~> 3.13, < 4) capybara (~> 3.13, < 4)
websocket-driver (>= 0.6.5) websocket-driver (>= 0.6.5)
arel (9.0.0) arel (9.0.0)
asset_sync (2.14.2) asset_sync (2.15.0)
activemodel (>= 4.1.0) activemodel (>= 4.1.0)
fog-core fog-core
mime-types (>= 2.99) mime-types (>= 2.99)
@ -70,8 +70,8 @@ GEM
attr_encrypted (3.1.0) attr_encrypted (3.1.0)
encryptor (~> 3.0.0) encryptor (~> 3.0.0)
attr_required (1.0.1) attr_required (1.0.1)
autoprefixer-rails (10.2.5.1) autoprefixer-rails (10.3.3.0)
execjs (> 0) execjs (~> 2)
babel-source (5.8.35) babel-source (5.8.35)
babel-transpiler (0.7.0) babel-transpiler (0.7.0)
babel-source (>= 4.0, < 6) babel-source (>= 4.0, < 6)
@ -149,57 +149,59 @@ GEM
crack (0.4.5) crack (0.4.5)
rexml rexml
crass (1.0.6) crass (1.0.6)
cucumber (5.3.0) cucumber (7.1.0)
builder (~> 3.2, >= 3.2.4) builder (~> 3.2, >= 3.2.4)
cucumber-core (~> 8.0, >= 8.0.1) cucumber-core (~> 10.1, >= 10.1.0)
cucumber-create-meta (~> 2.0, >= 2.0.2) cucumber-create-meta (~> 6.0, >= 6.0.1)
cucumber-cucumber-expressions (~> 10.3, >= 10.3.0) cucumber-cucumber-expressions (~> 14.0, >= 14.0.0)
cucumber-gherkin (~> 15.0, >= 15.0.2) cucumber-gherkin (~> 22.0, >= 22.0.0)
cucumber-html-formatter (~> 9.0, >= 9.0.0) cucumber-html-formatter (~> 17.0, >= 17.0.0)
cucumber-messages (~> 13.1, >= 13.1.0) cucumber-messages (~> 17.1, >= 17.1.1)
cucumber-wire (~> 4.0, >= 4.0.1) cucumber-wire (~> 6.2, >= 6.2.0)
diff-lcs (~> 1.4, >= 1.4.4) diff-lcs (~> 1.4, >= 1.4.4)
mime-types (~> 3.3, >= 3.3.1)
multi_test (~> 0.1, >= 0.1.2) multi_test (~> 0.1, >= 0.1.2)
sys-uname (~> 1.2, >= 1.2.1) sys-uname (~> 1.2, >= 1.2.2)
cucumber-api-steps (0.14.0) cucumber-api-steps (0.14.0)
cucumber (>= 2.0.2) cucumber (>= 2.0.2)
jsonpath (>= 0.1.2) jsonpath (>= 0.1.2)
cucumber-core (8.0.1) cucumber-core (10.1.0)
cucumber-gherkin (~> 15.0, >= 15.0.2) cucumber-gherkin (~> 22.0, >= 22.0.0)
cucumber-messages (~> 13.0, >= 13.0.1) cucumber-messages (~> 17.1, >= 17.1.1)
cucumber-tag-expressions (~> 2.0, >= 2.0.4) cucumber-tag-expressions (~> 4.0, >= 4.0.2)
cucumber-create-meta (2.0.4) cucumber-create-meta (6.0.2)
cucumber-messages (~> 13.1, >= 13.1.0) cucumber-messages (~> 17.1, >= 17.1.1)
sys-uname (~> 1.2, >= 1.2.1) sys-uname (~> 1.2, >= 1.2.2)
cucumber-cucumber-expressions (10.3.0) cucumber-cucumber-expressions (14.0.0)
cucumber-gherkin (15.0.2) cucumber-gherkin (22.0.0)
cucumber-messages (~> 13.0, >= 13.0.1) cucumber-messages (~> 17.1, >= 17.1.1)
cucumber-html-formatter (9.0.0) cucumber-html-formatter (17.0.0)
cucumber-messages (~> 13.0, >= 13.0.1) cucumber-messages (~> 17.1, >= 17.1.0)
cucumber-messages (13.2.1) cucumber-messages (17.1.1)
protobuf-cucumber (~> 3.10, >= 3.10.8) cucumber-rails (2.4.0)
cucumber-rails (2.3.0)
capybara (>= 2.18, < 4) capybara (>= 2.18, < 4)
cucumber (>= 3.0.2, < 6) cucumber (>= 3.2, < 8)
mime-types (~> 3.2) mime-types (~> 3.3)
nokogiri (~> 1.8) nokogiri (~> 1.10)
railties (>= 5.0, < 7) railties (>= 5.0, < 7)
cucumber-tag-expressions (2.0.4) rexml (~> 3.0)
cucumber-wire (4.0.1) webrick (~> 1.7)
cucumber-core (~> 8.0, >= 8.0.1) cucumber-tag-expressions (4.1.0)
cucumber-cucumber-expressions (~> 10.3, >= 10.3.0) cucumber-wire (6.2.0)
cucumber-messages (~> 13.0, >= 13.0.1) cucumber-core (~> 10.1, >= 10.1.0)
database_cleaner (1.8.5) cucumber-cucumber-expressions (~> 14.0, >= 14.0.0)
database_cleaner-active_record (1.8.0) cucumber-messages (~> 17.1, >= 17.1.1)
activerecord database_cleaner-active_record (2.0.1)
database_cleaner (~> 1.8.0) activerecord (>= 5.a)
database_cleaner-core (~> 2.0.0)
database_cleaner-core (2.0.1)
devise (4.8.0) devise (4.8.0)
bcrypt (~> 3.0) bcrypt (~> 3.0)
orm_adapter (~> 0.1) orm_adapter (~> 0.1)
railties (>= 4.1.0) railties (>= 4.1.0)
responders responders
warden (~> 1.2.3) warden (~> 1.2.3)
devise-two-factor (4.0.0) devise-two-factor (4.0.1)
activesupport (< 6.2) activesupport (< 6.2)
attr_encrypted (>= 1.3, < 4, != 2) attr_encrypted (>= 1.3, < 4, != 2)
devise (~> 4.0) devise (~> 4.0)
@ -235,11 +237,11 @@ GEM
execjs execjs
multi_json (>= 1.3) multi_json (>= 1.3)
rake rake
et-orbi (1.2.4) et-orbi (1.2.6)
tzinfo tzinfo
ethon (0.15.0) ethon (0.15.0)
ffi (>= 1.15.0) ffi (>= 1.15.0)
excon (0.82.0) excon (0.88.0)
execjs (2.8.1) execjs (2.8.1)
eye (0.10.0) eye (0.10.0)
celluloid (~> 0.17.3) celluloid (~> 0.17.3)
@ -255,10 +257,10 @@ GEM
railties (>= 5.0.0) railties (>= 5.0.0)
faraday (0.17.4) faraday (0.17.4)
multipart-post (>= 1.2, < 3) multipart-post (>= 1.2, < 3)
faraday-cookie_jar (0.0.6) faraday-cookie_jar (0.0.7)
faraday (>= 0.7.4) faraday (>= 0.8.0)
http-cookie (~> 1.0.0) http-cookie (~> 1.0.0)
faraday_middleware (0.13.1) faraday_middleware (0.14.0)
faraday (>= 0.7.4, < 1.0) faraday (>= 0.7.4, < 1.0)
ffi (1.15.4) ffi (1.15.4)
ffi-compiler (1.0.1) ffi-compiler (1.0.1)
@ -268,7 +270,7 @@ GEM
activerecord (>= 2) activerecord (>= 2)
activesupport (>= 2) activesupport (>= 2)
hashdiff hashdiff
fog-aws (3.10.0) fog-aws (3.12.0)
fog-core (~> 2.1) fog-core (~> 2.1)
fog-json (~> 1.1) fog-json (~> 1.1)
fog-xml (~> 0.1) fog-xml (~> 0.1)
@ -281,11 +283,11 @@ GEM
fog-json (1.2.0) fog-json (1.2.0)
fog-core fog-core
multi_json (~> 1.10) multi_json (~> 1.10)
fog-xml (0.1.3) fog-xml (0.1.4)
fog-core fog-core
nokogiri (>= 1.5.11, < 2.0.0) nokogiri (>= 1.5.11, < 2.0.0)
formatador (0.3.0) formatador (0.3.0)
fugit (1.5.0) fugit (1.5.2)
et-orbi (~> 1.1, >= 1.1.8) et-orbi (~> 1.1, >= 1.1.8)
raabro (~> 1.4) raabro (~> 1.4)
fuubar (2.5.1) fuubar (2.5.1)
@ -296,14 +298,14 @@ GEM
gitlab (4.17.0) gitlab (4.17.0)
httparty (~> 0.18) httparty (~> 0.18)
terminal-table (~> 1.5, >= 1.5.1) terminal-table (~> 1.5, >= 1.5.1)
globalid (0.4.2) globalid (0.5.2)
activesupport (>= 4.2.0) activesupport (>= 5.0)
gon (6.4.0) gon (6.4.0)
actionpack (>= 3.0.20) actionpack (>= 3.0.20)
i18n (>= 0.7) i18n (>= 0.7)
multi_json multi_json
request_store (>= 1.0) request_store (>= 1.0)
haml (5.2.1) haml (5.2.2)
temple (>= 0.8.0) temple (>= 0.8.0)
tilt tilt
haml_lint (0.37.1) haml_lint (0.37.1)
@ -312,7 +314,7 @@ GEM
rainbow rainbow
rubocop (>= 0.50.0) rubocop (>= 0.50.0)
sysexits (~> 1.1) sysexits (~> 1.1)
hamlit (2.15.0) hamlit (2.15.1)
temple (>= 0.8.2) temple (>= 0.8.2)
thor thor
tilt tilt
@ -334,11 +336,11 @@ GEM
ffi-compiler (>= 1.0, < 2.0) ffi-compiler (>= 1.0, < 2.0)
http_accept_language (2.1.1) http_accept_language (2.1.1)
http_parser.rb (0.6.0) http_parser.rb (0.6.0)
httparty (0.18.1) httparty (0.20.0)
mime-types (~> 3.0) mime-types (~> 3.0)
multi_xml (>= 0.5.2) multi_xml (>= 0.5.2)
httpclient (2.8.3) httpclient (2.8.3)
i18n (1.8.10) i18n (1.8.11)
concurrent-ruby (~> 1.0) concurrent-ruby (~> 1.0)
i18n-inflector (2.6.7) i18n-inflector (2.6.7)
i18n (>= 0.4.1) i18n (>= 0.4.1)
@ -351,12 +353,13 @@ GEM
mini_magick (>= 4.9.5, < 5) mini_magick (>= 4.9.5, < 5)
ruby-vips (>= 2.0.17, < 3) ruby-vips (>= 2.0.17, < 3)
ipaddress (0.8.3) ipaddress (0.8.3)
jasmine (3.7.0) jasmine (3.10.0)
jasmine-core (~> 3.7.0) jasmine-core (~> 3.10.0)
phantomjs phantomjs
rack (>= 1.2.1) rack (>= 2.1.4)
rake rake
jasmine-core (3.7.1) webrick
jasmine-core (3.10.1)
jasmine-jquery-rails (2.0.3) jasmine-jquery-rails (2.0.3)
jquery-rails (4.4.0) jquery-rails (4.4.0)
rails-dom-testing (>= 1, < 3) rails-dom-testing (>= 1, < 3)
@ -364,7 +367,7 @@ GEM
thor (>= 0.14, < 2.0) thor (>= 0.14, < 2.0)
jquery-ui-rails (5.0.5) jquery-ui-rails (5.0.5)
railties (>= 3.2.16) railties (>= 3.2.16)
js-routes (1.4.14) js-routes (2.1.2)
railties (>= 4) railties (>= 4)
js_image_paths (0.1.1) js_image_paths (0.1.1)
rails (>= 4.0, < 6.0) rails (>= 4.0, < 6.0)
@ -381,9 +384,9 @@ GEM
rspec rspec
jsonpath (1.1.0) jsonpath (1.1.0)
multi_json multi_json
jwt (2.2.3) jwt (2.3.0)
kgio (2.11.4) kgio (2.11.4)
kostya-sigar (2.0.8) kostya-sigar (2.0.10)
leaflet-rails (1.7.0) leaflet-rails (1.7.0)
rails (>= 4.2.0) rails (>= 4.2.0)
listen (3.5.1) listen (3.5.1)
@ -402,19 +405,18 @@ GEM
systemu (~> 2.6.5) systemu (~> 2.6.5)
mail (2.7.1) mail (2.7.1)
mini_mime (>= 0.1.1) mini_mime (>= 0.1.1)
marcel (1.0.1) marcel (1.0.2)
markdown-it-html5-embed (1.0.0) markdown-it-html5-embed (1.0.0)
markerb (1.1.0) markerb (1.1.0)
memoizable (0.4.2) memoizable (0.4.2)
thread_safe (~> 0.3, >= 0.3.1) thread_safe (~> 0.3, >= 0.3.1)
method_source (1.0.0) method_source (1.0.0)
middleware (0.1.0)
mime-types (3.3.1) mime-types (3.3.1)
mime-types-data (~> 3.2015) mime-types-data (~> 3.2015)
mime-types-data (3.2021.0225) mime-types-data (3.2021.0901)
mini_magick (4.11.0) mini_magick (4.11.0)
mini_mime (1.1.0) mini_mime (1.1.2)
mini_portile2 (2.5.3) mini_portile2 (2.6.1)
minitest (5.14.4) minitest (5.14.4)
mobile-fu (1.4.0) mobile-fu (1.4.0)
rack-mobile-detect rack-mobile-detect
@ -425,11 +427,11 @@ GEM
multipart-post (2.1.1) multipart-post (2.1.1)
mysql2 (0.5.3) mysql2 (0.5.3)
naught (1.1.0) naught (1.1.0)
nio4r (2.5.7) nio4r (2.5.8)
nokogiri (1.11.7) nokogiri (1.12.5)
mini_portile2 (~> 2.5.0) mini_portile2 (~> 2.6.1)
racc (~> 1.4) racc (~> 1.4)
oauth (0.5.6) oauth (0.5.7)
oauth2 (1.4.7) oauth2 (1.4.7)
faraday (>= 0.8, < 2.0) faraday (>= 0.8, < 2.0)
jwt (>= 1.0, < 3.0) jwt (>= 1.0, < 3.0)
@ -439,15 +441,19 @@ GEM
octokit (4.21.0) octokit (4.21.0)
faraday (>= 0.9) faraday (>= 0.9)
sawyer (~> 0.8.0, >= 0.5.3) sawyer (~> 0.8.0, >= 0.5.3)
omniauth (1.9.1) omniauth (2.0.4)
hashie (>= 3.4.6) hashie (>= 3.4.6)
rack (>= 1.6.2, < 3) rack (>= 1.6.2, < 3)
rack-protection
omniauth-oauth (1.2.0) omniauth-oauth (1.2.0)
oauth oauth
omniauth (>= 1.0, < 3) omniauth (>= 1.0, < 3)
omniauth-oauth2 (1.7.1) omniauth-oauth2 (1.7.2)
oauth2 (~> 1.4) oauth2 (~> 1.4)
omniauth (>= 1.9, < 3) omniauth (>= 1.9, < 3)
omniauth-rails_csrf_protection (1.0.0)
actionpack (>= 4.2)
omniauth (~> 2.0)
omniauth-tumblr (1.2) omniauth-tumblr (1.2)
multi_json multi_json
omniauth-oauth (~> 1.0) omniauth-oauth (~> 1.0)
@ -459,7 +465,7 @@ GEM
open_graph_reader (0.7.2) open_graph_reader (0.7.2)
faraday (>= 0.9.0) faraday (>= 0.9.0)
nokogiri (~> 1.6) nokogiri (~> 1.6)
openid_connect (1.2.0) openid_connect (1.3.0)
activemodel activemodel
attr_required (>= 1.0.0) attr_required (>= 1.0.0)
json-jwt (>= 1.5.0) json-jwt (>= 1.5.0)
@ -470,8 +476,8 @@ GEM
validate_url validate_url
webfinger (>= 1.0.1) webfinger (>= 1.0.1)
orm_adapter (0.5.0) orm_adapter (0.5.0)
parallel (1.20.1) parallel (1.21.0)
parser (3.0.1.1) parser (3.0.2.0)
ast (~> 2.4.1) ast (~> 2.4.1)
pg (1.2.3) pg (1.2.3)
phantomjs (2.1.1.0) phantomjs (2.1.1.0)
@ -496,11 +502,6 @@ GEM
pronto-scss (0.11.0) pronto-scss (0.11.0)
pronto (~> 0.11.0) pronto (~> 0.11.0)
scss_lint (~> 0.43, >= 0.43.0) scss_lint (~> 0.43, >= 0.43.0)
protobuf-cucumber (3.10.8)
activesupport (>= 3.2)
middleware
thor
thread_safe
pry (0.14.1) pry (0.14.1)
coderay (~> 1.1) coderay (~> 1.1)
method_source (~> 1.0) method_source (~> 1.0)
@ -518,13 +519,15 @@ GEM
activesupport activesupport
rack-mobile-detect (0.4.0) rack-mobile-detect (0.4.0)
rack rack
rack-oauth2 (1.17.0) rack-oauth2 (1.19.0)
activesupport activesupport
attr_required attr_required
httpclient httpclient
json-jwt (>= 1.11.0) json-jwt (>= 1.11.0)
rack (>= 2.1.0) rack (>= 2.1.0)
rack-piwik (0.3.0) rack-piwik (0.3.0)
rack-protection (2.1.0)
rack
rack-rewrite (1.5.1) rack-rewrite (1.5.1)
rack-ssl (1.4.1) rack-ssl (1.4.1)
rack rack
@ -601,11 +604,11 @@ GEM
rainbow (3.0.0) rainbow (3.0.0)
raindrops (0.19.2) raindrops (0.19.2)
rake (12.3.3) rake (12.3.3)
rb-fsevent (0.10.4) rb-fsevent (0.11.0)
rb-inotify (0.10.1) rb-inotify (0.10.1)
ffi (~> 1.0) ffi (~> 1.0)
redcarpet (3.5.1) redcarpet (3.5.1)
redis (4.3.1) redis (4.5.1)
regexp_parser (2.1.1) regexp_parser (2.1.1)
request_store (1.5.0) request_store (1.5.0)
rack (>= 1.4) rack (>= 1.4)
@ -614,10 +617,10 @@ GEM
railties (>= 5.0) railties (>= 5.0)
rexml (3.2.5) rexml (3.2.5)
rotp (6.2.0) rotp (6.2.0)
rqrcode (2.0.0) rqrcode (2.1.0)
chunky_png (~> 1.0) chunky_png (~> 1.0)
rqrcode_core (~> 1.0) rqrcode_core (~> 1.0)
rqrcode_core (1.0.0) rqrcode_core (1.2.0)
rspec (3.10.0) rspec (3.10.0)
rspec-core (~> 3.10.0) rspec-core (~> 3.10.0)
rspec-expectations (~> 3.10.0) rspec-expectations (~> 3.10.0)
@ -631,7 +634,7 @@ GEM
rspec-mocks (3.10.2) rspec-mocks (3.10.2)
diff-lcs (>= 1.2.0, < 2.0) diff-lcs (>= 1.2.0, < 2.0)
rspec-support (~> 3.10.0) rspec-support (~> 3.10.0)
rspec-rails (5.0.1) rspec-rails (5.0.2)
actionpack (>= 5.2) actionpack (>= 5.2)
activesupport (>= 5.2) activesupport (>= 5.2)
railties (>= 5.2) railties (>= 5.2)
@ -639,7 +642,7 @@ GEM
rspec-expectations (~> 3.10) rspec-expectations (~> 3.10)
rspec-mocks (~> 3.10) rspec-mocks (~> 3.10)
rspec-support (~> 3.10) rspec-support (~> 3.10)
rspec-support (3.10.2) rspec-support (3.10.3)
rubocop (0.93.1) rubocop (0.93.1)
parallel (~> 1.10) parallel (~> 1.10)
parser (>= 2.7.1.5) parser (>= 2.7.1.5)
@ -657,9 +660,9 @@ GEM
rubocop (>= 0.90.0, < 2.0) rubocop (>= 0.90.0, < 2.0)
ruby-oembed (0.15.0) ruby-oembed (0.15.0)
ruby-progressbar (1.11.0) ruby-progressbar (1.11.0)
ruby-vips (2.1.2) ruby-vips (2.1.3)
ffi (~> 1.12) ffi (~> 1.12)
rubyzip (2.3.0) rubyzip (2.3.2)
rugged (1.0.1) rugged (1.0.1)
sass (3.4.25) sass (3.4.25)
sass-rails (5.0.7) sass-rails (5.0.7)
@ -676,10 +679,10 @@ GEM
scss_lint (0.55.0) scss_lint (0.55.0)
rake (>= 0.9, < 13) rake (>= 0.9, < 13)
sass (~> 3.4.20) sass (~> 3.4.20)
secure_headers (6.3.2) secure_headers (6.3.3)
shoulda-matchers (4.5.1) shoulda-matchers (4.5.1)
activesupport (>= 4.2.0) activesupport (>= 4.2.0)
sidekiq (6.2.1) sidekiq (6.2.2)
connection_pool (>= 2.2.2) connection_pool (>= 2.2.2)
rack (~> 2.0) rack (~> 2.0)
redis (>= 4.2.0) redis (>= 4.2.0)
@ -711,7 +714,7 @@ GEM
ssrf_filter (1.0.7) ssrf_filter (1.0.7)
state_machines (0.5.0) state_machines (0.5.0)
string-direction (1.2.2) string-direction (1.2.2)
swd (1.2.0) swd (1.3.0)
activesupport (>= 3) activesupport (>= 3)
attr_required (>= 0.0.5) attr_required (>= 0.0.5)
httpclient (>= 2.4) httpclient (>= 2.4)
@ -722,14 +725,14 @@ GEM
temple (0.8.2) temple (0.8.2)
terminal-table (1.8.0) terminal-table (1.8.0)
unicode-display_width (~> 1.1, >= 1.1.1) unicode-display_width (~> 1.1, >= 1.1.1)
terser (1.1.5) terser (1.1.7)
execjs (>= 0.3.0, < 3) execjs (>= 0.3.0, < 3)
thor (1.1.0) thor (1.1.0)
thread_safe (0.3.6) thread_safe (0.3.6)
tilt (2.0.10) tilt (2.0.10)
timecop (0.9.4) timecop (0.9.4)
timers (4.3.3) timers (4.3.3)
toml-rb (2.0.1) toml-rb (2.1.0)
citrus (~> 3.0, > 3.0) citrus (~> 3.0, > 3.0)
turbo_dev_assets (0.0.2) turbo_dev_assets (0.0.2)
twitter (7.0.0) twitter (7.0.0)
@ -752,8 +755,8 @@ GEM
thread_safe (~> 0.1) thread_safe (~> 0.1)
unf (0.1.4) unf (0.1.4)
unf_ext unf_ext
unf_ext (0.0.7.7) unf_ext (0.0.8)
unicode-display_width (1.7.0) unicode-display_width (1.8.0)
unicorn (6.0.0) unicorn (6.0.0)
kgio (~> 2.6) kgio (~> 2.6)
raindrops (~> 0.7) raindrops (~> 0.7)
@ -775,17 +778,18 @@ GEM
yard (~> 0.9.20) yard (~> 0.9.20)
warden (1.2.9) warden (1.2.9)
rack (>= 2.0.9) rack (>= 2.0.9)
webfinger (1.1.0) webfinger (1.2.0)
activesupport activesupport
httpclient (>= 2.4) httpclient (>= 2.4)
webmock (3.13.0) webmock (3.14.0)
addressable (>= 2.3.6) addressable (>= 2.8.0)
crack (>= 0.3.2) crack (>= 0.3.2)
hashdiff (>= 0.4.0, < 2.0.0) hashdiff (>= 0.4.0, < 2.0.0)
webrick (1.7.0)
websocket-driver (0.7.5) websocket-driver (0.7.5)
websocket-extensions (>= 0.1.0) websocket-extensions (>= 0.1.0)
websocket-extensions (0.1.5) websocket-extensions (0.1.5)
will_paginate (3.3.0) will_paginate (3.3.1)
xpath (3.2.0) xpath (3.2.0)
nokogiri (~> 1.8) nokogiri (~> 1.8)
yajl-ruby (1.4.1) yajl-ruby (1.4.1)
@ -799,10 +803,10 @@ DEPENDENCIES
activerecord-import (= 1.1.0) activerecord-import (= 1.1.0)
acts-as-taggable-on (= 8.1.0) acts-as-taggable-on (= 8.1.0)
acts_as_api (= 1.0.1) acts_as_api (= 1.0.1)
addressable (= 2.7.0) addressable (= 2.8.0)
apparition (= 0.6.0) apparition (= 0.6.0)
asset_sync (= 2.14.2) asset_sync (= 2.15.0)
autoprefixer-rails (= 10.2.5.1) autoprefixer-rails (= 10.3.3.0)
bootstrap-sass (= 3.4.1) bootstrap-sass (= 3.4.1)
bootstrap-switch-rails (= 3.3.3) bootstrap-switch-rails (= 3.3.3)
capybara (= 3.35.3) capybara (= 3.35.3)
@ -811,10 +815,10 @@ DEPENDENCIES
compass-rails (= 3.1.0) compass-rails (= 3.1.0)
configurate (= 0.5.0) configurate (= 0.5.0)
cucumber-api-steps (= 0.14) cucumber-api-steps (= 0.14)
cucumber-rails (= 2.3.0) cucumber-rails (= 2.4.0)
database_cleaner-active_record (= 1.8.0) database_cleaner-active_record (= 2.0.1)
devise (= 4.8.0) devise (= 4.8.0)
devise-two-factor (= 4.0.0) devise-two-factor (= 4.0.1)
devise_lastseenable (= 0.0.6) devise_lastseenable (= 0.0.6)
diaspora_federation-json_schema (= 0.2.7) diaspora_federation-json_schema (= 0.2.7)
diaspora_federation-rails (= 0.2.7) diaspora_federation-rails (= 0.2.7)
@ -823,22 +827,22 @@ DEPENDENCIES
eye (= 0.10.0) eye (= 0.10.0)
factory_bot_rails (= 6.1.0) factory_bot_rails (= 6.1.0)
faraday (= 0.17.4) faraday (= 0.17.4)
faraday-cookie_jar (= 0.0.6) faraday-cookie_jar (= 0.0.7)
faraday_middleware (= 0.13.1) faraday_middleware (= 0.14.0)
fixture_builder (= 0.5.2) fixture_builder (= 0.5.2)
fog-aws (= 3.10.0) fog-aws (= 3.12.0)
fuubar (= 2.5.1) fuubar (= 2.5.1)
gon (= 6.4.0) gon (= 6.4.0)
haml_lint (= 0.37.1) haml_lint (= 0.37.1)
hamlit (= 2.15.0) hamlit (= 2.15.1)
handlebars_assets (= 0.23.9) handlebars_assets (= 0.23.9)
http_accept_language (= 2.1.1) http_accept_language (= 2.1.1)
i18n-inflector-rails (= 1.0.7) i18n-inflector-rails (= 1.0.7)
jasmine (= 3.7.0) jasmine (= 3.10.0)
jasmine-jquery-rails (= 2.0.3) jasmine-jquery-rails (= 2.0.3)
jquery-rails (= 4.4.0) jquery-rails (= 4.4.0)
jquery-ui-rails (= 5.0.5) jquery-ui-rails (= 5.0.5)
js-routes (= 1.4.14) js-routes (= 2.1.2)
js_image_paths (= 0.1.1) js_image_paths (= 0.1.1)
json (= 2.3.0) json (= 2.3.0)
json-schema (= 2.8.1) json-schema (= 2.8.1)
@ -852,13 +856,14 @@ DEPENDENCIES
minitest minitest
mobile-fu (= 1.4.0) mobile-fu (= 1.4.0)
mysql2 (= 0.5.3) mysql2 (= 0.5.3)
nokogiri (= 1.11.7) nokogiri (= 1.12.5)
omniauth (= 1.9.1) omniauth (= 2.0.4)
omniauth-rails_csrf_protection (= 1.0.0)
omniauth-tumblr (= 1.2) omniauth-tumblr (= 1.2)
omniauth-twitter (= 1.4.0) omniauth-twitter (= 1.4.0)
omniauth-wordpress (= 0.2.2) omniauth-wordpress (= 0.2.2)
open_graph_reader (= 0.7.2) open_graph_reader (= 0.7.2)
openid_connect (= 1.2.0) openid_connect (= 1.3.0)
pg (= 1.2.3) pg (= 1.2.3)
pronto (= 0.11.0) pronto (= 0.11.0)
pronto-eslint (= 0.11.0) pronto-eslint (= 0.11.0)
@ -900,19 +905,19 @@ DEPENDENCIES
rails-i18n (= 5.1.3) rails-i18n (= 5.1.3)
rails-timeago (= 2.19.1) rails-timeago (= 2.19.1)
redcarpet (= 3.5.1) redcarpet (= 3.5.1)
redis (= 4.3.1) redis (= 4.5.1)
responders (= 3.0.1) responders (= 3.0.1)
rqrcode (= 2.0.0) rqrcode (= 2.1.0)
rspec-json_expectations (~> 2.1) rspec-json_expectations (~> 2.1)
rspec-rails (= 5.0.1) rspec-rails (= 5.0.2)
rubocop (= 0.93.1) rubocop (= 0.93.1)
rubocop-rails (= 2.9.1) rubocop-rails (= 2.9.1)
ruby-oembed (= 0.15.0) ruby-oembed (= 0.15.0)
rubyzip (= 2.3.0) rubyzip (= 2.3.2)
sass-rails (= 5.0.7) sass-rails (= 5.0.7)
secure_headers (= 6.3.2) secure_headers (= 6.3.3)
shoulda-matchers (= 4.5.1) shoulda-matchers (= 4.5.1)
sidekiq (= 6.2.1) sidekiq (= 6.2.2)
sidekiq-cron (= 1.2.0) sidekiq-cron (= 1.2.0)
simple_captcha2 (= 0.5.0) simple_captcha2 (= 0.5.0)
simplecov (= 0.21.2) simplecov (= 0.21.2)
@ -920,9 +925,9 @@ DEPENDENCIES
sprockets-es6 (= 0.9.2) sprockets-es6 (= 0.9.2)
sprockets-rails (= 3.2.2) sprockets-rails (= 3.2.2)
string-direction (= 1.2.2) string-direction (= 1.2.2)
terser (= 1.1.5) terser (= 1.1.7)
timecop (= 0.9.4) timecop (= 0.9.4)
toml-rb (= 2.0.1) toml-rb (= 2.1.0)
turbo_dev_assets (= 0.0.2) turbo_dev_assets (= 0.0.2)
twitter (= 7.0.0) twitter (= 7.0.0)
twitter-text (= 3.1.0) twitter-text (= 3.1.0)
@ -931,8 +936,8 @@ DEPENDENCIES
unicorn-worker-killer (= 0.4.5) unicorn-worker-killer (= 0.4.5)
uuid (= 2.3.9) uuid (= 2.3.9)
versionist (= 2.0.1) versionist (= 2.0.1)
webmock (= 3.13.0) webmock (= 3.14.0)
will_paginate (= 3.3.0) will_paginate (= 3.3.1)
yajl-ruby (= 1.4.1) yajl-ruby (= 1.4.1)
BUNDLED WITH BUNDLED WITH

View file

@ -44,7 +44,7 @@ Handlebars.registerHelper('linkToPerson', function(context, block) {
// relationship indicator for profile page // relationship indicator for profile page
Handlebars.registerHelper("sharingMessage", function(person) { Handlebars.registerHelper("sharingMessage", function(person) {
var i18nScope = "people.helper.is_not_sharing"; var i18nScope = "people.helper.is_not_sharing";
var icon = "circle"; var icon = "entypo-record";
if( person.is_sharing ) { if( person.is_sharing ) {
i18nScope = "people.helper.is_sharing"; i18nScope = "people.helper.is_sharing";
icon = "entypo-check"; icon = "entypo-check";

View file

@ -19,10 +19,15 @@ app.views.Hovercard = app.views.Base.extend({
this.showMe = false; this.showMe = false;
this.parent = null; // current 'hovercardable' element that caused HC to appear this.parent = null; // current 'hovercardable' element that caused HC to appear
this.active = true; this.active = true;
}, },
presenter: function() {
return _.extend({}, this.defaultPresenter(), {
person: this.person
});
},
postRenderTemplate: function() { postRenderTemplate: function() {
this.$el.appendTo($("body")); this.$el.appendTo($("body"));
@ -102,14 +107,14 @@ app.views.Hovercard = app.views.Base.extend({
if( !person || person.length === 0 ) { if( !person || person.length === 0 ) {
throw new Error("received data is not a person object"); throw new Error("received data is not a person object");
} }
var personModel = new app.models.Person(person);
person.is_sharing = personModel.isSharing();
self.person = person;
if (app.currentUser.authenticated()) { if (app.currentUser.authenticated()) {
self.aspectMembershipDropdown = new app.views.AspectMembership({person: new app.models.Person(person)}); self.aspectMembershipDropdown = new app.views.AspectMembership({person: personModel});
} }
self.render(); self.render();
self._populateHovercardWith(person);
if( !self.showMe ) { if( !self.showMe ) {
// mouse has left element // mouse has left element
return; return;
@ -118,23 +123,6 @@ app.views.Hovercard = app.views.Base.extend({
}); });
}, },
_populateHovercardWith: function(person) {
this.avatarLink.attr("href", this.href());
this.personLink.attr("href", this.href());
this.personLink.text(person.name);
this.personID.text(person.diaspora_id);
if (person.profile) {
this.avatar.attr("src", person.profile.avatar);
// set hashtags
this.hashtags.empty();
this.hashtags.html($(_.map(person.profile.tags, function(tag) {
return $("<a></a>", {href: Routes.tag(tag)}).text("#" + tag)[0];
})));
}
},
_positionHovercard: function() { _positionHovercard: function() {
var p_pos = this.parent.offset(); var p_pos = this.parent.offset();
var p_height = this.parent.height(); var p_height = this.parent.height();

View file

@ -55,8 +55,8 @@ body {
.tag:hover { background-color: desaturate(darken($link-color, 35%), 20%); } .tag:hover { background-color: desaturate(darken($link-color, 35%), 20%); }
#profile_container .profile_header { #sharing_message.entypo-check {
#author_info #sharing_message.entypo-check { color: lighten($green, 10%); } color: lighten($green, 10%);
} }
#invitationsModal #email_invitation { border-top: 1px dashed $gray-light; } #invitationsModal #email_invitation { border-top: 1px dashed $gray-light; }

View file

@ -119,6 +119,19 @@
} }
} }
.dropdown-toggle {
align-items: center;
display: flex;
.user-name {
margin-right: 3px;
max-width: 250px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
}
.user-menu-dropdown { .user-menu-dropdown {
padding: 0; padding: 0;
} }

View file

@ -33,6 +33,12 @@
text-overflow: ellipsis; text-overflow: ellipsis;
} }
.status-container {
align-items: center;
display: flex;
margin-bottom: 5px;
}
#hovercard_dropdown_container { #hovercard_dropdown_container {
overflow: visible !important; /* otherwise the aspect dropdown is cropped */ overflow: visible !important; /* otherwise the aspect dropdown is cropped */
} }
@ -53,10 +59,7 @@
.handle { .handle {
color: $text-grey; color: $text-grey;
line-height: 18px; margin-right: 2px;
padding-top: 0px;
margin-top: 0px;
margin-bottom: 5px;
} }
.btn-group.aspect-membership-dropdown { margin: 0 !important; } .btn-group.aspect-membership-dropdown { margin: 0 !important; }

View file

@ -5,6 +5,7 @@
} }
.invitations-button { padding-left: 0; } .invitations-button { padding-left: 0; }
} }
#people-stream { #people-stream {
.media, .media-body { .media, .media-body {
overflow: visible; overflow: visible;
@ -28,6 +29,7 @@
.info { font-size: $font-size-small; } .info { font-size: $font-size-small; }
} }
} }
#blocked_people { #blocked_people {
.blocked-person { .blocked-person {
border-bottom: 1px solid $border-grey; border-bottom: 1px solid $border-grey;
@ -45,3 +47,13 @@
.btn-danger { margin-top: 9px; } .btn-danger { margin-top: 9px; }
} }
} }
#sharing_message {
&.entypo-check {
color: darken($brand-success, 20%);
}
&.entypo-record {
color: $text-grey;
}
}

View file

@ -28,11 +28,6 @@
#sharing_message { #sharing_message {
cursor: default; cursor: default;
font-size: 20px; font-size: 20px;
&.circle {
color: $text-grey;
&:before { content: '\26aa'; }
}
&.entypo-check { color: darken($brand-success,20%); }
} }
.description { .description {
margin-bottom: 20px; margin-bottom: 20px;

View file

@ -69,7 +69,7 @@
<ul class="nav navbar-nav navbar-right"> <ul class="nav navbar-nav navbar-right">
<li class="dropdown user-menu" id="user-menu"> <li class="dropdown user-menu" id="user-menu">
<a href="{{urlTo "person" current_user.guid}}" class="dropdown-toggle hidden-xs hidden-sm" data-toggle="dropdown" role="button" aria-expanded="false"> <a href="{{urlTo "person" current_user.guid}}" class="dropdown-toggle hidden-xs hidden-sm" data-toggle="dropdown" role="button" aria-expanded="false">
<span class="user-avatar pull-left"> <span class="user-avatar">
{{{personImage current_user "small"}}} {{{personImage current_user "small"}}}
</span> </span>
<span class="user-name">{{current_user.name}}</span> <span class="user-name">{{current_user.name}}</span>

View file

@ -1,15 +1,22 @@
{{#with person}}
<div id="hovercard"> <div id="hovercard">
<a class='person_avatar'> <a class="person_avatar" href="{{urlTo 'person' guid}}">
<img class="avatar"> <img class="avatar" src="{{profile.avatar}}" />
</a> </a>
<h4> <h4>
<a class="person"></a> <a class="person" href="{{urlTo 'person' guid}}">{{name}}</a>
</h4> </h4>
<div class="handle"></div> <div class="status-container">
<div class="handle">{{diaspora_id}}</div>
{{{sharingMessage this}}}
</div>
<div id="hovercard_dropdown_container"></div> <div id="hovercard_dropdown_container"></div>
<div class="card-footer"> <div class="card-footer">
<div class="footer-container"> <div class="footer-container">
<div class="hashtags"></div> <div class="hashtags">
{{fmtTags profile.tags}}
</div>
</div> </div>
</div> </div>
</div> </div>
{{/with}}

View file

@ -97,6 +97,10 @@ class AccountMigration < ApplicationRecord
old_user && new_user old_user && new_user
end end
def includes_photo_migration?
remote_photo_path.present?
end
def tombstone_old_user_and_update_all_references def tombstone_old_user_and_update_all_references
ActiveRecord::Base.transaction do ActiveRecord::Base.transaction do
account_deleter.tombstone_person_and_profile account_deleter.tombstone_person_and_profile
@ -146,6 +150,7 @@ class AccountMigration < ApplicationRecord
end end
def update_all_references def update_all_references
update_remote_photo_path if remotely_initiated? && includes_photo_migration?
update_person_references update_person_references
update_user_references if user_changed_id_locally? update_user_references if user_changed_id_locally?
end end
@ -224,6 +229,20 @@ class AccountMigration < ApplicationRecord
.destroy_all .destroy_all
end end
def update_remote_photo_path
Photo.where(author: old_person)
.update_all(remote_photo_path: remote_photo_path) # rubocop:disable Rails/SkipsModelValidations
return unless user_left_our_pod?
Photo.where(author: old_person).find_in_batches do |batch|
batch.each do |photo|
photo.processed_image = nil
photo.unprocessed_image = nil
logger.warn "Error cleaning up photo #{photo.id}" unless photo.save
end
end
end
def update_person_references def update_person_references
logger.debug "Updating references from person id=#{old_person.id} to person id=#{newest_person.id}" logger.debug "Updating references from person id=#{old_person.id} to person id=#{newest_person.id}"
eliminate_person_duplicates eliminate_person_duplicates

View file

@ -47,7 +47,7 @@ class PersonPresenter < BasePresenter
end end
def hovercard def hovercard
base_hash_with_contact.merge(profile: ProfilePresenter.new(profile).for_hovercard) full_hash.merge(profile: ProfilePresenter.new(profile).for_hovercard)
end end
def metas_attributes def metas_attributes

View file

@ -5,11 +5,26 @@
# are used as for federation messages generation. # are used as for federation messages generation.
class FederationEntitySerializer < ActiveModel::Serializer class FederationEntitySerializer < ActiveModel::Serializer
include SerializerPostProcessing include SerializerPostProcessing
include Diaspora::Logging
private private
def modify_serializable_object(hash) def modify_serializable_object(hash)
hash.merge(entity.to_json) hash.merge(entity.to_json)
rescue DiasporaFederation::Entities::Relayable::AuthorPrivateKeyNotFound => e
# The author of this relayable probably migrated from this pod to a different pod,
# and we neither have the signature nor the new private key to generate a valid signature.
# But we can use the private key of the old user to generate the signature it had when this entity was created
old_person = AccountMigration.joins(:old_person)
.where("new_person_id = ? AND people.owner_id IS NOT NULL", object.author_id)
.first.old_person
if old_person
logger.info "Using private key of #{old_person.diaspora_handle} to export: #{e.message}"
object.author = old_person
hash.merge(entity.to_json)
else
logger.warn "Skip entity for export because #{e.class}: #{e.message}"
end
end end
def entity def entity

View file

@ -17,7 +17,7 @@
- else - else
= t("services.index.not_logged_in") = t("services.index.not_logged_in")
= link_to(t("services.index.connect"), "/auth/#{provider}") = link_to(t("services.index.connect"), "/auth/#{provider}", method: :post)
- else - else
.well .well

View file

@ -122,7 +122,7 @@
- if service_unconnected?(service) - if service_unconnected?(service)
= link_to(content_tag(:div, nil, = link_to(content_tag(:div, nil,
class: "social-media-logos-#{service.to_s.downcase}-24x24", class: "social-media-logos-#{service.to_s.downcase}-24x24",
title: service.to_s.titleize), "/auth/#{service}") title: service.to_s.titleize), "/auth/#{service}", method: :post)
.section.collapsed .section.collapsed
.title .title

View file

@ -3,4 +3,6 @@
JsRoutes.setup do |config| JsRoutes.setup do |config|
config.camel_case = true config.camel_case = true
config.compact = true config.compact = true
config.module_type = nil
config.namespace = "Routes"
end end

View file

@ -0,0 +1,7 @@
# frozen_string_literal: true
class AddRemotePhotoPathToAccountMigration < ActiveRecord::Migration[5.2]
def change
add_column :account_migrations, :remote_photo_path, :text
end
end

View file

@ -49,3 +49,21 @@ Feature: Hovercards
Then I should see a hovercard Then I should see a hovercard
And I should see "#first" hashtag in the hovercard And I should see "#first" hashtag in the hovercard
And I should see "#second" hashtag in the hovercard And I should see "#second" hashtag in the hovercard
Scenario: Hovercards contain the aspect membership and the sharing status
Given a user with email "alice@alice.alice" is connected with "bob@bob.bob"
And I sign in as "alice@alice.alice"
And I am on "bob@bob.bob"'s page
When I activate the first hovercard
Then I should see a hovercard
And I should see "Besties" within ".aspect-membership-dropdown"
And I should see a "[title='Bob Jones is sharing with you']" within ".status-container"
And I should see a ".entypo-check" within ".sharing_message_container"
Scenario: Hovercards contain sharing status when not sharing
Given I sign in as "alice@alice.alice"
And I am on "bob@bob.bob"'s page
When I activate the first hovercard
Then I should see a hovercard
And I should see a "[title='Bob Jones is not sharing with you']" within ".status-container"
And I should see a ".entypo-record" within ".sharing_message_container"

View file

@ -31,7 +31,11 @@ module Diaspora
profile = profile(entity.profile, opts) profile = profile(entity.profile, opts)
return if AccountMigration.exists?(old_person: old_person, new_person: profile.person) return if AccountMigration.exists?(old_person: old_person, new_person: profile.person)
AccountMigration.create!(old_person: old_person, new_person: profile.person).tap do |migration| AccountMigration.create!(
old_person: old_person,
new_person: profile.person,
remote_photo_path: entity.remote_photo_path
).tap do |migration|
migration.signature = entity.signature if old_person.local? migration.signature = entity.signature if old_person.local?
migration.save! migration.save!
end end

View file

@ -149,9 +149,29 @@ shared_examples_for "migration scenarios initiated locally" do
[] []
end end
inlined_jobs do inlined_jobs { run_migration }
run_migration end
end
it "does not change the remote paths" do
photo = FactoryBot.create(:photo, author: old_person)
remote_photo_path = photo.remote_photo_path
run_migration
expect(photo.reload.remote_photo_path).to eq(remote_photo_path)
end
end
shared_examples_for "remote photo migration" do
it "changes the remote paths of photos of the old person" do
old_photo = FactoryBot.create(:photo, author: old_person)
new_photo = FactoryBot.create(:photo, author: new_person)
new_remote_photo_path = old_photo.remote_photo_path
run_migration
expect(old_photo.reload.remote_photo_path).to eq("https://diaspora.example.tld/uploads/images/")
expect(new_photo.reload.remote_photo_path).to eq(new_remote_photo_path)
end end
end end
@ -210,6 +230,8 @@ describe "account migration" do
include_examples "migration scenarios initiated remotely" include_examples "migration scenarios initiated remotely"
include_examples "remote photo migration"
context "when new person has been migrated before" do context "when new person has been migrated before" do
let(:intermidiate_person) { create_remote_user("remote-d.net").person } let(:intermidiate_person) { create_remote_user("remote-d.net").person }
@ -238,6 +260,8 @@ describe "account migration" do
include_examples "migration scenarios initiated remotely" include_examples "migration scenarios initiated remotely"
include_examples "remote photo migration"
it_behaves_like "migration scenarios with local old user" it_behaves_like "migration scenarios with local old user"
it_behaves_like "deletes all of the user data" do it_behaves_like "deletes all of the user data" do
@ -287,9 +311,10 @@ describe "account migration" do
def run_migration def run_migration
AccountMigration.create!( AccountMigration.create!(
old_person: old_user.person, old_person: old_user.person,
new_person: new_user.person, new_person: new_user.person,
old_private_key: old_user.serialized_private_key old_private_key: old_user.serialized_private_key,
remote_photo_path: "https://diaspora.example.tld/uploads/images/"
).perform! ).perform!
end end
@ -326,7 +351,9 @@ describe "account migration" do
let(:new_person) { new_user.person } let(:new_person) { new_user.person }
def run_migration def run_migration
AccountMigration.create!(old_person: old_person, new_person: new_person).perform! AccountMigration.create!(old_person: old_person,
new_person: new_person,
remote_photo_path: "https://diaspora.example.tld/uploads/images/").perform!
end end
include_examples "every migration scenario" include_examples "every migration scenario"

View file

@ -55,7 +55,9 @@ describe "Receive federation messages feature" do
it "receives account migration correctly" do it "receives account migration correctly" do
run_migration run_migration
expect(AccountMigration.where(old_person: sender.person, new_person: new_user.person)).to exist expect(AccountMigration.where(old_person: sender.person, new_person: new_user.person)).to exist
expect(AccountMigration.find_by(old_person: sender.person, new_person: new_user.person)).to be_performed account_migration = AccountMigration.find_by(old_person: sender.person, new_person: new_user.person)
expect(account_migration).to be_performed
expect(account_migration.remote_photo_path).to eq("https://diaspora.example.tld/uploads/images/")
end end
it "doesn't run the same migration for the second time" do it "doesn't run the same migration for the second time" do

View file

@ -16,7 +16,11 @@ describe("app.views.Hovercard", function() {
this.view._populateHovercard(); this.view._populateHovercard();
jasmine.Ajax.requests.mostRecent().respondWith({ jasmine.Ajax.requests.mostRecent().respondWith({
status: 200, status: 200,
responseText: JSON.stringify({id: 1337}) responseText: JSON.stringify({
id: 1337,
guid: "ba64fce01b04013aa8db34c93d7886ce",
name: "Edward Snowden"
})
}); });
expect(this.view.aspectMembershipDropdown).toEqual(undefined); expect(this.view.aspectMembershipDropdown).toEqual(undefined);
}); });
@ -56,7 +60,11 @@ describe("app.views.Hovercard", function() {
this.view._populateHovercard(); this.view._populateHovercard();
jasmine.Ajax.requests.mostRecent().respondWith({ jasmine.Ajax.requests.mostRecent().respondWith({
status: 200, status: 200,
responseText: JSON.stringify({id: 1337}) responseText: JSON.stringify({
id: 1337,
guid: "ba64fce01b04013aa8db34c93d7886ce",
name: "Edward Snowden"
})
}); });
expect(this.view.aspectMembershipDropdown).not.toEqual(undefined); expect(this.view.aspectMembershipDropdown).not.toEqual(undefined);
}); });
@ -65,7 +73,14 @@ describe("app.views.Hovercard", function() {
this.view._populateHovercard(); this.view._populateHovercard();
jasmine.Ajax.requests.mostRecent().respondWith({ jasmine.Ajax.requests.mostRecent().respondWith({
status: 200, status: 200,
responseText: JSON.stringify({id: 1337, profile: {tags: ["first", "second"]}}) responseText: JSON.stringify({
id: 1337,
guid: "ba64fce01b04013aa8db34c93d7886ce",
name: "Edward Snowden",
profile: {
tags: ["first", "second"]
}
})
}); });
var first = this.view.hashtags.find("a:contains('#first')"); var first = this.view.hashtags.find("a:contains('#first')");
@ -75,6 +90,36 @@ describe("app.views.Hovercard", function() {
expect(first.first()[0].href).toContain(Routes.tag("first")); expect(first.first()[0].href).toContain(Routes.tag("first"));
expect(second.first()[0].href).toContain(Routes.tag("second")); expect(second.first()[0].href).toContain(Routes.tag("second"));
}); });
it("indicates when the user is sharing with me", function() {
this.view._populateHovercard();
jasmine.Ajax.requests.mostRecent().respondWith({
status: 200,
responseText: JSON.stringify({
id: 1337,
guid: "ba64fce01b04013aa8db34c93d7886ce",
name: "Edward Snowden",
relationship: "sharing"
})
});
var message = this.view.$el.find("#sharing_message");
expect(message).toHaveClass("entypo-check");
});
it("indicates when the user is not sharing with me", function() {
this.view._populateHovercard();
jasmine.Ajax.requests.mostRecent().respondWith({
status: 200,
responseText: JSON.stringify({
id: 1337,
guid: "ba64fce01b04013aa8db34c93d7886ce",
name: "Edward Snowden",
relationship: "receiving"
})
});
var message = this.view.$el.find("#sharing_message");
expect(message).toHaveClass("entypo-record");
});
}); });
}); });
}); });

View file

@ -17,7 +17,9 @@ describe AccountMigration, type: :model do
let(:old_person) { FactoryBot.create(:person) } let(:old_person) { FactoryBot.create(:person) }
let(:new_person) { FactoryBot.create(:person) } let(:new_person) { FactoryBot.create(:person) }
let(:account_migration) { let(:account_migration) {
AccountMigration.create!(old_person: old_person, new_person: new_person) AccountMigration.create!(old_person: old_person,
new_person: new_person,
remote_photo_path: "https://diaspora.example.tld/uploads/images/")
} }
describe "receive" do describe "receive" do
@ -129,6 +131,34 @@ describe AccountMigration, type: :model do
expect(Diaspora::Federation::Dispatcher).to receive(:defer_dispatch).with(contact.user, contact) expect(Diaspora::Federation::Dispatcher).to receive(:defer_dispatch).with(contact.user, contact)
account_migration.perform! account_migration.perform!
end end
it "cleans up old local photos" do
photo = FactoryBot.create(:photo, author: old_person)
photo.processed_image.store!(photo.unprocessed_image)
photo.save!
account_migration.perform!
updated_photo = photo.reload
expect(updated_photo.remote_photo_path).to eq("https://diaspora.example.tld/uploads/images/")
expect(updated_photo.processed_image.path).to be_nil
expect(updated_photo.unprocessed_image.path).to be_nil
end
it "does nothing if migration doesn't contain a new remote_photo_path" do
photo = FactoryBot.create(:photo, author: old_person)
photo.processed_image.store!(photo.unprocessed_image)
photo.save!
remote_photo_path = photo.remote_photo_path
AccountMigration.create!(old_person: old_person, new_person: new_person).perform!
updated_photo = photo.reload
expect(updated_photo.remote_photo_path).to eq(remote_photo_path)
expect(updated_photo.processed_image.path).not_to be_nil
expect(updated_photo.unprocessed_image.path).not_to be_nil
end
end end
context "with local new and remote old users" do context "with local new and remote old users" do

View file

@ -13,9 +13,14 @@ describe Export::OthersDataSerializer do
serializer.associations serializer.associations
end end
context "with user's activity" do it "uses old local user private key if the author was migrated away from the pod" do
before do post = DataGenerator.new(user).status_message_with_activity
DataGenerator.new(user).activity
old_comment_author = post.comments.first.author
AccountMigration.create!(old_person: old_comment_author, new_person: FactoryBot.create(:person)).perform!
serializer.associations[:relayables].select {|r| r[:entity_type] == "comment" }.each do |comment|
expect(comment[:entity_data][:author]).to eq(old_comment_author.diaspora_handle)
end end
end end
end end