diaspora/spec/integration/import_service_spec.rb
Benjamin Neff d3c2407df1
Don't overwrite photos of other users during import
If a photo with the same filename already exists, generate a new random
filename, and re-federate the photo with that filename. This ensures
users can't modify their archive to overwrite other users photos.
2021-11-24 02:42:31 +01:00

60 lines
2.5 KiB
Ruby

# frozen_string_literal: true
describe ImportService do
context "import photos archive" do
let(:user) { FactoryBot.create(:user) }
let(:photo) { FactoryBot.create(:status_message_with_photo, author: user.person).photos.first }
let(:photo_archive) {
user.perform_export_photos!
photo_archive = user.exported_photos_file
# cleanup photo after creating the archive, so it's like it was imported from a remote pod
photo.unprocessed_image = nil
photo.random_string = nil
photo.remote_photo_path = "https://old.example.com/uploads/images/"
photo.save
photo_archive
}
it "imports the photo with the same name" do
old_random_string = photo.random_string
inlined_jobs { ImportService.new.import_by_files(nil, photo_archive.current_path, user.username) }
imported_photo = photo.reload
expect(imported_photo.random_string).to include(old_random_string)
expect(imported_photo.unprocessed_image.path).to include(old_random_string)
expect(imported_photo.processed_image.path).to include(old_random_string)
expect(imported_photo.remote_photo_name).to include(old_random_string)
expect(imported_photo.remote_photo_path).to eq("#{AppConfig.pod_uri}uploads/images/")
end
it "imports the photo with a new random name if a conflicting photo already exists" do
old_random_string = photo.random_string
photo_archive_path = photo_archive.current_path
sm = FactoryBot.create(:status_message)
FactoryBot.create(:photo, author: sm.author, status_message: sm, random_string: old_random_string)
expect(Diaspora::Federation::Dispatcher).to receive(:build) do |user_param, photo_param|
expect(user_param).to eq(user)
expect(photo_param.id).to eq(photo.id)
dispatcher = double
expect(dispatcher).to receive(:dispatch)
dispatcher
end
inlined_jobs { ImportService.new.import_by_files(nil, photo_archive_path, user.username) }
imported_photo = photo.reload
new_random_string = imported_photo.random_string
expect(new_random_string).not_to include(old_random_string)
expect(imported_photo.unprocessed_image.path).to include(new_random_string)
expect(imported_photo.processed_image.path).to include(new_random_string)
expect(imported_photo.remote_photo_name).to include(new_random_string)
expect(imported_photo.remote_photo_path).to eq("#{AppConfig.pod_uri}uploads/images/")
end
end
end