Skip to content

Commit

Permalink
Fixes #4577 - Multiple uninstalling packages will course missing back…
Browse files Browse the repository at this point in the history
…up files.
  • Loading branch information
rolfschmidt committed Apr 19, 2023
1 parent 7739671 commit be63355
Show file tree
Hide file tree
Showing 2 changed files with 64 additions and 9 deletions.
23 changes: 14 additions & 9 deletions app/models/package.rb
Original file line number Diff line number Diff line change
Expand Up @@ -349,18 +349,23 @@ def self.uninstall(data)
Package::Migration.migrate(package['name'], 'reverse')
end

package['files'].each do |file|
permission = file['permission'] || '644'
content = Base64.decode64(file['content'])
_delete_file(file['location'], permission, content)
record = Package.find_by(
name: package['name'],
version: package['version'],
)

if record.state == 'installed'
package['files'].each do |file|
permission = file['permission'] || '644'
content = Base64.decode64(file['content'])
_delete_file(file['location'], permission, content)
end
end

# delete package
if !data[:reinstall]
record = Package.find_by(
name: package['name'],
version: package['version'],
)
if data[:reinstall]
record.update(state: 'uninstalled')
else
record.destroy
end

Expand Down
50 changes: 50 additions & 0 deletions spec/models/package_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -209,4 +209,54 @@ def get_package_structure(name, files, version = '1.0.1')
include_examples 'check not allowed file location', '%2e%2e/%2e%2e/%2e%2e/%2e%2e/%2e%2e/tmp/test_controller.rb'
end
end

describe 'Multiple uninstalling packages will course missing backup files #4577' do
let(:core_file) { Rails.root.join('app/models/ticket.rb') }
let(:orig_content) { File.read(core_file) }

let(:package_zpm_files_json) do
<<-JSON
[
{
"permission": "644",
"location": "app/models/ticket.rb",
"content": "YWJjw6TDtsO8w58="
}
]
JSON
end

before do
orig_content
end

it 'does handle reinstalls properly', :aggregate_failures do
described_class.install(string: package_zpm_json)
expect(File.exist?(core_file)).to be(true)
expect(File.read(core_file)).to eq('abcäöüß')
expect(File.exist?("#{core_file}.save")).to be(true)
expect(File.read("#{core_file}.save")).to eq(orig_content)

described_class.uninstall(string: package_zpm_json, migration_not_down: true, reinstall: true)
expect(File.exist?(core_file)).to be(true)
expect(File.read(core_file)).to eq(orig_content)
expect(File.exist?("#{core_file}.save")).to be(false)

described_class.uninstall(string: package_zpm_json, migration_not_down: true, reinstall: true)
expect(File.exist?(core_file)).to be(true)
expect(File.read(core_file)).to eq(orig_content)
expect(File.exist?("#{core_file}.save")).to be(false)

described_class.reinstall(package_name)
expect(File.exist?(core_file)).to be(true)
expect(File.read(core_file)).to eq('abcäöüß')
expect(File.exist?("#{core_file}.save")).to be(true)
expect(File.read("#{core_file}.save")).to eq(orig_content)

described_class.uninstall(string: package_zpm_json)
expect(File.exist?(core_file)).to be(true)
expect(File.read(core_file)).to eq(orig_content)
expect(File.exist?("#{core_file}.save")).to be(false)
end
end
end

0 comments on commit be63355

Please sign in to comment.