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
* 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
* 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 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)
* 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

59
Gemfile
View file

@ -29,8 +29,8 @@ gem "yajl-ruby", "1.4.1"
gem "devise", "4.8.0"
gem "devise_lastseenable", "0.0.6"
gem "devise-two-factor", "4.0.0"
gem "rqrcode", "2.0.0"
gem "devise-two-factor", "4.0.1"
gem "rqrcode", "2.1.0"
# Captcha
@ -38,8 +38,8 @@ gem "simple_captcha2", "0.5.0", require: "simple_captcha"
# Background processing
gem "redis", "4.3.1"
gem "sidekiq", "6.2.1"
gem "redis", "4.5.1"
gem "sidekiq", "6.2.2"
# Scheduled processing
@ -47,12 +47,12 @@ gem "sidekiq-cron", "1.2.0"
# Compression
gem "terser", "1.1.5"
gem "terser", "1.1.7"
# Configuration
gem "configurate", "0.5.0"
gem "toml-rb", "2.0.1"
gem "toml-rb", "2.1.0"
# Cross-origin resource sharing
@ -60,7 +60,7 @@ gem "rack-cors", "1.1.1", require: "rack/cors"
# CSS
gem "autoprefixer-rails", "10.2.5.1"
gem "autoprefixer-rails", "10.3.3.0"
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 "compass-rails", "3.1.0"
@ -81,7 +81,7 @@ gem "activerecord-import", "1.1.0"
# File uploading
gem "carrierwave", "2.2.2"
gem "fog-aws", "3.10.0"
gem "fog-aws", "3.12.0"
gem "mini_magick", "4.11.0"
# GUID generation
@ -96,7 +96,7 @@ gem "entypo-rails", "3.0.0"
gem "handlebars_assets", "0.23.9"
gem "jquery-rails", "4.4.0"
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 "sprockets-es6", "0.9.2"
@ -147,7 +147,7 @@ gem "leaflet-rails", "1.7.0"
# 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 "redcarpet", "3.5.1"
gem "ruby-oembed", "0.15.0"
@ -159,18 +159,19 @@ gem "string-direction", "1.2.2"
# Security Headers
gem "secure_headers", "6.3.2"
gem "secure_headers", "6.3.3"
# Services
gem "omniauth", "1.9.1"
gem "omniauth-tumblr", "1.2"
gem "omniauth-twitter", "1.4.0"
gem "omniauth-wordpress", "0.2.2"
gem "twitter", "7.0.0"
gem "omniauth", "2.0.4"
gem "omniauth-rails_csrf_protection", "1.0.0"
gem "omniauth-tumblr", "1.2"
gem "omniauth-twitter", "1.4.0"
gem "omniauth-wordpress", "0.2.2"
gem "twitter", "7.0.0"
# OpenID Connect
gem "openid_connect", "1.2.0"
gem "openid_connect", "1.3.0"
# Serializers
@ -182,19 +183,19 @@ gem "acts-as-taggable-on", "8.1.0"
# 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_middleware", "0.13.1"
gem "faraday-cookie_jar", "0.0.6"
gem "faraday-cookie_jar", "0.0.7"
gem "faraday_middleware", "0.14.0"
gem "typhoeus", "1.4.0"
# Views
gem "gon", "6.4.0"
gem "hamlit", "2.15.0"
gem "hamlit", "2.15.1"
gem "mobile-fu", "1.4.0"
gem "rails-timeago", "2.19.1"
gem "will_paginate", "3.3.0"
gem "will_paginate", "3.3.1"
# Logging
@ -202,7 +203,7 @@ gem "logging-rails", "0.6.0", require: "logging/rails"
# 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
# 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
gem "asset_sync", "2.14.2", require: false
gem "asset_sync", "2.15.0", require: false
end
group :development do
@ -275,7 +276,7 @@ group :test do
gem "apparition", "0.6.0"
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
@ -284,21 +285,21 @@ group :test do
gem "factory_bot_rails", "6.1.0"
gem "shoulda-matchers", "4.5.1"
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"
end
group :development, :test do
# RSpec (unit tests, some integration tests)
gem "rspec-rails", "5.0.1"
gem "rspec-rails", "5.0.2"
# 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))
gem "chrome_remote", "0.3.0"
gem "jasmine", "3.7.0"
gem "jasmine", "3.10.0"
gem "jasmine-jquery-rails", "2.0.3"
gem "rails-assets-jasmine-ajax", "4.0.0", source: "https://gems.diasporafoundation.org"
gem "sinon-rails", "1.15.0"

View file

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

View file

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

View file

@ -19,10 +19,15 @@ app.views.Hovercard = app.views.Base.extend({
this.showMe = false;
this.parent = null; // current 'hovercardable' element that caused HC to appear
this.active = true;
},
presenter: function() {
return _.extend({}, this.defaultPresenter(), {
person: this.person
});
},
postRenderTemplate: function() {
this.$el.appendTo($("body"));
@ -102,14 +107,14 @@ app.views.Hovercard = app.views.Base.extend({
if( !person || person.length === 0 ) {
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()) {
self.aspectMembershipDropdown = new app.views.AspectMembership({person: new app.models.Person(person)});
self.aspectMembershipDropdown = new app.views.AspectMembership({person: personModel});
}
self.render();
self._populateHovercardWith(person);
if( !self.showMe ) {
// mouse has left element
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() {
var p_pos = this.parent.offset();
var p_height = this.parent.height();

View file

@ -55,8 +55,8 @@ body {
.tag:hover { background-color: desaturate(darken($link-color, 35%), 20%); }
#profile_container .profile_header {
#author_info #sharing_message.entypo-check { color: lighten($green, 10%); }
#sharing_message.entypo-check {
color: lighten($green, 10%);
}
#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 {
padding: 0;
}

View file

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

View file

@ -5,6 +5,7 @@
}
.invitations-button { padding-left: 0; }
}
#people-stream {
.media, .media-body {
overflow: visible;
@ -28,6 +29,7 @@
.info { font-size: $font-size-small; }
}
}
#blocked_people {
.blocked-person {
border-bottom: 1px solid $border-grey;
@ -45,3 +47,13 @@
.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 {
cursor: default;
font-size: 20px;
&.circle {
color: $text-grey;
&:before { content: '\26aa'; }
}
&.entypo-check { color: darken($brand-success,20%); }
}
.description {
margin-bottom: 20px;

View file

@ -69,7 +69,7 @@
<ul class="nav navbar-nav navbar-right">
<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">
<span class="user-avatar pull-left">
<span class="user-avatar">
{{{personImage current_user "small"}}}
</span>
<span class="user-name">{{current_user.name}}</span>

View file

@ -1,15 +1,22 @@
{{#with person}}
<div id="hovercard">
<a class='person_avatar'>
<img class="avatar">
<a class="person_avatar" href="{{urlTo 'person' guid}}">
<img class="avatar" src="{{profile.avatar}}" />
</a>
<h4>
<a class="person"></a>
<a class="person" href="{{urlTo 'person' guid}}">{{name}}</a>
</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 class="card-footer">
<div class="footer-container">
<div class="hashtags"></div>
<div class="hashtags">
{{fmtTags profile.tags}}
</div>
</div>
</div>
</div>
{{/with}}

View file

@ -97,6 +97,10 @@ class AccountMigration < ApplicationRecord
old_user && new_user
end
def includes_photo_migration?
remote_photo_path.present?
end
def tombstone_old_user_and_update_all_references
ActiveRecord::Base.transaction do
account_deleter.tombstone_person_and_profile
@ -146,6 +150,7 @@ class AccountMigration < ApplicationRecord
end
def update_all_references
update_remote_photo_path if remotely_initiated? && includes_photo_migration?
update_person_references
update_user_references if user_changed_id_locally?
end
@ -224,6 +229,20 @@ class AccountMigration < ApplicationRecord
.destroy_all
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
logger.debug "Updating references from person id=#{old_person.id} to person id=#{newest_person.id}"
eliminate_person_duplicates

View file

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

View file

@ -5,11 +5,26 @@
# are used as for federation messages generation.
class FederationEntitySerializer < ActiveModel::Serializer
include SerializerPostProcessing
include Diaspora::Logging
private
def modify_serializable_object(hash)
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
def entity

View file

@ -17,7 +17,7 @@
- else
= 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
.well

View file

@ -122,7 +122,7 @@
- if service_unconnected?(service)
= link_to(content_tag(:div, nil,
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
.title

View file

@ -3,4 +3,6 @@
JsRoutes.setup do |config|
config.camel_case = true
config.compact = true
config.module_type = nil
config.namespace = "Routes"
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
And I should see "#first" 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)
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.save!
end

View file

@ -149,9 +149,29 @@ shared_examples_for "migration scenarios initiated locally" do
[]
end
inlined_jobs do
run_migration
end
inlined_jobs { run_migration }
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
@ -210,6 +230,8 @@ describe "account migration" do
include_examples "migration scenarios initiated remotely"
include_examples "remote photo migration"
context "when new person has been migrated before" do
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 "remote photo migration"
it_behaves_like "migration scenarios with local old user"
it_behaves_like "deletes all of the user data" do
@ -287,9 +311,10 @@ describe "account migration" do
def run_migration
AccountMigration.create!(
old_person: old_user.person,
new_person: new_user.person,
old_private_key: old_user.serialized_private_key
old_person: old_user.person,
new_person: new_user.person,
old_private_key: old_user.serialized_private_key,
remote_photo_path: "https://diaspora.example.tld/uploads/images/"
).perform!
end
@ -326,7 +351,9 @@ describe "account migration" do
let(:new_person) { new_user.person }
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
include_examples "every migration scenario"

View file

@ -55,7 +55,9 @@ describe "Receive federation messages feature" do
it "receives account migration correctly" do
run_migration
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
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();
jasmine.Ajax.requests.mostRecent().respondWith({
status: 200,
responseText: JSON.stringify({id: 1337})
responseText: JSON.stringify({
id: 1337,
guid: "ba64fce01b04013aa8db34c93d7886ce",
name: "Edward Snowden"
})
});
expect(this.view.aspectMembershipDropdown).toEqual(undefined);
});
@ -56,7 +60,11 @@ describe("app.views.Hovercard", function() {
this.view._populateHovercard();
jasmine.Ajax.requests.mostRecent().respondWith({
status: 200,
responseText: JSON.stringify({id: 1337})
responseText: JSON.stringify({
id: 1337,
guid: "ba64fce01b04013aa8db34c93d7886ce",
name: "Edward Snowden"
})
});
expect(this.view.aspectMembershipDropdown).not.toEqual(undefined);
});
@ -65,7 +73,14 @@ describe("app.views.Hovercard", function() {
this.view._populateHovercard();
jasmine.Ajax.requests.mostRecent().respondWith({
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')");
@ -75,6 +90,36 @@ describe("app.views.Hovercard", function() {
expect(first.first()[0].href).toContain(Routes.tag("first"));
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(:new_person) { FactoryBot.create(:person) }
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
@ -129,6 +131,34 @@ describe AccountMigration, type: :model do
expect(Diaspora::Federation::Dispatcher).to receive(:defer_dispatch).with(contact.user, contact)
account_migration.perform!
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
context "with local new and remote old users" do

View file

@ -13,9 +13,14 @@ describe Export::OthersDataSerializer do
serializer.associations
end
context "with user's activity" do
before do
DataGenerator.new(user).activity
it "uses old local user private key if the author was migrated away from the pod" do
post = DataGenerator.new(user).status_message_with_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