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.
60 lines
2.5 KiB
Ruby
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
|