diff --git a/app/models/package.rb b/app/models/package.rb index c5749adc2..51ce9801b 100644 --- a/app/models/package.rb +++ b/app/models/package.rb @@ -1,48 +1,8 @@ # Copyright (C) 2012-2014 Zammad Foundation, http://zammad-foundation.org/ -require 'rexml/document' class Package < ApplicationModel @@root = Rails.root.to_s # rubocop:disable Style/ClassVars - # build package based on .szpm - # Package.build( - # file: 'package.szpm', - # root: '/path/to/src/extention/', - # output: '/path/to/package_location/' - # ) - def self.build(data) - - if data[:file] - xml = _read_file(data[:file], data[:root] || true) - package = _parse(xml) - elsif data[:string] - package = _parse(data[:string]) - end - - build_date = REXML::Element.new('build_date') - build_date.text = Time.zone.now.iso8601 - build_host = REXML::Element.new('build_host') - build_host.text = Socket.gethostname - - package.root.insert_after('//zpm/description', build_date) - package.root.insert_after('//zpm/description', build_host) - package.elements.each('zpm/filelist/file') do |element| - location = element.attributes['location'] - content = _read_file(location, data[:root]) - base64 = Base64.encode64(content) - element.text = base64 - end - if data[:output] - location = "#{data[:output]}/#{package.elements['zpm/name'].text}-#{package.elements['zpm/version'].text}.zpm" - logger.info "NOTICE: writting package to '#{location}'" - file = File.new(location, 'wb') - file.write(package.to_s) - file.close - return true - end - package.to_s - end - # Package.auto_install # install all packages located under auto_install/*.zpm def self.auto_install @@ -178,17 +138,17 @@ class Package < ApplicationModel # Package.install(string: zpm_as_string) def self.install(data) if data[:file] - xml = _read_file(data[:file], true) - package = _parse(xml) + json = _read_file(data[:file], true) + package = JSON.parse(json) elsif data[:string] - package = _parse(data[:string]) + package = JSON.parse(data[:string]) end # package meta data meta = { - name: package.elements['zpm/name'].text, - version: package.elements['zpm/version'].text, - vendor: package.elements['zpm/vendor'].text, + name: package['name'], + version: package['version'], + vendor: package['vendor'], state: 'uninstalled', created_by_id: 1, updated_by_id: 1, @@ -220,7 +180,7 @@ class Package < ApplicationModel Store.add( object: 'Package', o_id: record.id, - data: package.to_s, + data: package.to_json, filename: "#{meta[:name]}-#{meta[:version]}.zpm", preferences: {}, created_by_id: UserInfo.current_user_id || 1, @@ -228,13 +188,11 @@ class Package < ApplicationModel end # write files - package.elements.each('zpm/filelist/file') do |element| - location = element.attributes['location'] - permission = element.attributes['permission'] || '644' - base64 = element.text - content = Base64.decode64(base64) - content = _write_file(location, permission, content) - end + package['files'].each { |file| + permission = file['permission'] || '644' + content = Base64.decode64(file['content']) + _write_file(file['location'], permission, content) + } # update package state record.state = 'installed' @@ -264,55 +222,33 @@ class Package < ApplicationModel def self.uninstall(data) if data[:string] - package = _parse(data[:string]) + package = JSON.parse(data[:string]) else - file = _get_bin(data[:name], data[:version]) - package = _parse(file) + json_file = _get_bin(data[:name], data[:version]) + package = JSON.parse(json_file) end - # package meta data - meta = { - name: package.elements['zpm/name'].text, - version: package.elements['zpm/version'].text, - } - # down migrations if !data[:migration_not_down] - Package::Migration.migrate(meta[:name], 'reverse') + Package::Migration.migrate(package['name'], 'reverse') end - package.elements.each('zpm/filelist/file') do |element| - location = element.attributes['location'] - permission = element.attributes['permission'] || '644' - base64 = element.text - content = Base64.decode64(base64) - content = _delete_file(location, permission, content) - end - - # prebuild assets + package['files'].each { |file| + permission = file['permission'] || '644' + content = Base64.decode64(file['content']) + _delete_file(file['location'], permission, content) + } # delete package record = Package.find_by( - name: meta[:name], - version: meta[:version], + name: package['name'], + version: package['version'], ) record.destroy true end - def self._parse(xml) - logger.debug xml.inspect - begin - package = REXML::Document.new(xml) - rescue => e - logger.error 'ERROR: ' + e.inspect - return - end - logger.debug package.inspect - package - end - def self._get_bin(name, version) package = Package.find_by( name: name, @@ -470,7 +406,6 @@ class Package < ApplicationModel Kernel.const_get(classname).up Package::Migration.create(name: package.underscore, version: version) end - } end end diff --git a/test/unit/package_test.rb b/test/unit/package_test.rb index 0a8b8e8f1..413354930 100644 --- a/test/unit/package_test.rb +++ b/test/unit/package_test.rb @@ -7,25 +7,36 @@ class PackageTest < ActiveSupport::TestCase # test 1 - normal install { - zpm: ' - - UnitTestSample - 1.0.1 - Znuny GmbH - http://znuny.org/ - ABC - some description - - YWJjw6TDtsO8w58= - YWJjw6TDtsO8w58= - Y2xhc3MgQ3JlYXRlQmFzZSA8IEFjdGl2ZVJlY29yZDo6TWlncmF0aW9uDQogIGRlZiBzZWxmLnVw -DQogICBjcmVhdGVfdGFibGUgOnNhbXBsZV90YWJsZXMgZG8gfHR8DQogICAgICB0LmNvbHVtbiA6 -bmFtZSwgICAgICAgICAgIDpzdHJpbmcsIDpsaW1pdCA9PiAxNTAsICA6bnVsbCA9PiB0cnVlDQog -ICAgICB0LmNvbHVtbiA6ZGF0YSwgICAgICAgICAgIDpzdHJpbmcsIDpsaW1pdCA9PiA1MDAwLCA6 -bnVsbCA9PiB0cnVlDQogICAgZW5kDQogIGVuZA0KDQogIGRlZiBzZWxmLmRvd24NCiAgICBkcm9w -X3RhYmxlIDpzYW1wbGVfdGFibGVzDQogIGVuZA0KZW5k - -', + zpm: '{ + "name": "UnitTestSample", + "version": "1.0.1", + "vendor": "Znuny GmbH", + "license": "ABC", + "url": "http://znuny.org/", + "description": [ + { + "language": "en", + "text": "some description" + } + ], + "files": [ + { + "permission": "644", + "location": "test.txt", + "content": "YWJjw6TDtsO8w58=" + }, + { + "permission": "644", + "location": "some/dir/test.txt", + "content": "YWJjw6TDtsO8w58=" + }, + { + "permission": "644", + "location": "db/addon/unit_test_sample/20121212000001_create_base.rb", + "content": "Y2xhc3MgQ3JlYXRlQmFzZSA8IEFjdGl2ZVJlY29yZDo6TWlncmF0aW9uDQogIGRlZiBzZWxmLnVw\nDQogICBjcmVhdGVfdGFibGUgOnNhbXBsZV90YWJsZXMgZG8gfHR8DQogICAgICB0LmNvbHVtbiA6\nbmFtZSwgICAgICAgICAgIDpzdHJpbmcsIDpsaW1pdCA9PiAxNTAsICA6bnVsbCA9PiB0cnVlDQog\nICAgICB0LmNvbHVtbiA6ZGF0YSwgICAgICAgICAgIDpzdHJpbmcsIDpsaW1pdCA9PiA1MDAwLCA6\nbnVsbCA9PiB0cnVlDQogICAgZW5kDQogIGVuZA0KDQogIGRlZiBzZWxmLmRvd24NCiAgICBkcm9w\nX3RhYmxlIDpzYW1wbGVfdGFibGVzDQogIGVuZA0KZW5k" + } + ] +}', action: 'install', result: true, verify: { @@ -52,61 +63,88 @@ X3RhYmxlIDpzYW1wbGVfdGFibGVzDQogIGVuZA0KZW5k # test 2 - try to install same package again / should not work { - zpm: ' - - UnitTestSample - 1.0.1 - Znuny GmbH - http://znuny.org/ - ABC - some description - - YWJjw6TDtsO8w58= - -', + zpm: '{ + "name": "UnitTestSample", + "version": "1.0.1", + "vendor": "Znuny GmbH", + "license": "ABC", + "url": "http://znuny.org/", + "description": [ + { + "language": "en", + "text": "some description" + } + ], + "files": [ + { + "permission": "644", + "location": "test.txt", + "content": "YWJjw6TDtsO8w58=" + } + ] +}', action: 'install', result: false, }, # test 3 - try to install lower version / should not work { - zpm: ' - - UnitTestSample - 1.0.0 - Znuny GmbH - http://znuny.org/ - ABC - some description - - YWJjw6TDtsO8w58= - -', + zpm: '{ + "name": "UnitTestSample", + "version": "1.0.0", + "vendor": "Znuny GmbH", + "license": "ABC", + "url": "http://znuny.org/", + "description": [ + { + "language": "en", + "text": "some description" + } + ], + "files": [ + { + "permission": "644", + "location": "test.txt", + "content": "YWJjw6TDtsO8w58=" + } + ] +}', action: 'install', result: false, }, # test 4 - upgrade 7 should work { - zpm: ' - - UnitTestSample - 1.0.2 - Znuny GmbH - http://znuny.org/ - ABC - some description - - YWJjw6TDtsO8w58= - YWJjw6TDtsO8w58= - Y2xhc3MgQ3JlYXRlQmFzZSA8IEFjdGl2ZVJlY29yZDo6TWlncmF0aW9uDQogIGRlZiBzZWxmLnVw -DQogICBjcmVhdGVfdGFibGUgOnNhbXBsZV90YWJsZXMgZG8gfHR8DQogICAgICB0LmNvbHVtbiA6 -bmFtZSwgICAgICAgICAgIDpzdHJpbmcsIDpsaW1pdCA9PiAxNTAsICA6bnVsbCA9PiB0cnVlDQog -ICAgICB0LmNvbHVtbiA6ZGF0YSwgICAgICAgICAgIDpzdHJpbmcsIDpsaW1pdCA9PiA1MDAwLCA6 -bnVsbCA9PiB0cnVlDQogICAgZW5kDQogIGVuZA0KDQogIGRlZiBzZWxmLmRvd24NCiAgICBkcm9w -X3RhYmxlIDpzYW1wbGVfdGFibGVzDQogIGVuZA0KZW5k - -', + zpm: '{ + "name": "UnitTestSample", + "version": "1.0.2", + "vendor": "Znuny GmbH", + "license": "ABC", + "url": "http://znuny.org/", + "description": [ + { + "language": "en", + "text": "some description" + } + ], + "files": [ + { + "permission": "644", + "location": "test.txt2", + "content": "YWJjw6TDtsO8w58=" + }, + { + "permission": "644", + "location": "some/dir/test.txt2", + "content": "YWJjw6TDtsO8w58=" + }, + { + "permission": "644", + "location": "db/addon/unit_test_sample/20121212000001_create_base.rb", + "content": "Y2xhc3MgQ3JlYXRlQmFzZSA8IEFjdGl2ZVJlY29yZDo6TWlncmF0aW9uDQogIGRlZiBzZWxmLnVw\nDQogICBjcmVhdGVfdGFibGUgOnNhbXBsZV90YWJsZXMgZG8gfHR8DQogICAgICB0LmNvbHVtbiA6\nbmFtZSwgICAgICAgICAgIDpzdHJpbmcsIDpsaW1pdCA9PiAxNTAsICA6bnVsbCA9PiB0cnVlDQog\nICAgICB0LmNvbHVtbiA6ZGF0YSwgICAgICAgICAgIDpzdHJpbmcsIDpsaW1pdCA9PiA1MDAwLCA6\nbnVsbCA9PiB0cnVlDQogICAgZW5kDQogIGVuZA0KDQogIGRlZiBzZWxmLmRvd24NCiAgICBkcm9w\nX3RhYmxlIDpzYW1wbGVfdGFibGVzDQogIGVuZA0KZW5k" + } + ] +}', action: 'install', result: true, verify: { @@ -157,25 +195,36 @@ X3RhYmxlIDpzYW1wbGVfdGFibGVzDQogIGVuZA0KZW5k # test 5 - check auto_install mechanism { - zpm: ' - - UnitTestSample - 1.0.2 - Znuny GmbH - http://znuny.org/ - ABC - some description - - YWJjw6TDtsO8w58= - YWJjw6TDtsO8w58= - Y2xhc3MgQ3JlYXRlQmFzZSA8IEFjdGl2ZVJlY29yZDo6TWlncmF0aW9uDQogIGRlZiBzZWxmLnVw -DQogICBjcmVhdGVfdGFibGUgOnNhbXBsZV90YWJsZXMgZG8gfHR8DQogICAgICB0LmNvbHVtbiA6 -bmFtZSwgICAgICAgICAgIDpzdHJpbmcsIDpsaW1pdCA9PiAxNTAsICA6bnVsbCA9PiB0cnVlDQog -ICAgICB0LmNvbHVtbiA6ZGF0YSwgICAgICAgICAgIDpzdHJpbmcsIDpsaW1pdCA9PiA1MDAwLCA6 -bnVsbCA9PiB0cnVlDQogICAgZW5kDQogIGVuZA0KDQogIGRlZiBzZWxmLmRvd24NCiAgICBkcm9w -X3RhYmxlIDpzYW1wbGVfdGFibGVzDQogIGVuZA0KZW5k - -', + zpm: '{ + "name": "UnitTestSample", + "version": "1.0.2", + "vendor": "Znuny GmbH", + "license": "ABC", + "url": "http://znuny.org/", + "description": [ + { + "language": "en", + "text": "some description" + } + ], + "files": [ + { + "permission": "644", + "location": "test.txt2", + "content": "YWJjw6TDtsO8w58=" + }, + { + "permission": "644", + "location": "some/dir/test.txt2", + "content": "YWJjw6TDtsO8w58=" + }, + { + "permission": "644", + "location": "db/addon/unit_test_sample/20121212000001_create_base.rb", + "content": "Y2xhc3MgQ3JlYXRlQmFzZSA8IEFjdGl2ZVJlY29yZDo6TWlncmF0aW9uDQogIGRlZiBzZWxmLnVw\nDQogICBjcmVhdGVfdGFibGUgOnNhbXBsZV90YWJsZXMgZG8gfHR8DQogICAgICB0LmNvbHVtbiA6\nbmFtZSwgICAgICAgICAgIDpzdHJpbmcsIDpsaW1pdCA9PiAxNTAsICA6bnVsbCA9PiB0cnVlDQog\nICAgICB0LmNvbHVtbiA6ZGF0YSwgICAgICAgICAgIDpzdHJpbmcsIDpsaW1pdCA9PiA1MDAwLCA6\nbnVsbCA9PiB0cnVlDQogICAgZW5kDQogIGVuZA0KDQogIGRlZiBzZWxmLmRvd24NCiAgICBkcm9w\nX3RhYmxlIDpzYW1wbGVfdGFibGVzDQogIGVuZA0KZW5k" + } + ] +}', action: 'auto_install', result: true, verify: {