Fixed time zone calculation issue
[GitHub/WoltLab/WCF.git] / wcfsetup / install / files / lib / acp / page / PackageInstallationConfirmPage.class.php
1 <?php
2 namespace wcf\acp\page;
3 use wcf\data\package\installation\queue\PackageInstallationQueue;
4 use wcf\data\package\Package;
5 use wcf\data\package\PackageCache;
6 use wcf\page\AbstractPage;
7 use wcf\system\exception\IllegalLinkException;
8 use wcf\system\package\PackageArchive;
9 use wcf\system\package\PackageInstallationDispatcher;
10 use wcf\system\WCF;
11 use wcf\system\WCFACP;
12
13 /**
14 * Shows a confirmation page prior to start installing.
15 *
16 * @author Alexander Ebert
17 * @copyright 2001-2014 WoltLab GmbH
18 * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
19 * @package com.woltlab.wcf
20 * @subpackage acp.page
21 * @category Community Framework
22 */
23 class PackageInstallationConfirmPage extends AbstractPage {
24 /**
25 * @see \wcf\page\AbstractPage::$activeMenuItem
26 */
27 public $activeMenuItem = 'wcf.acp.menu.link.package.install';
28
29 /**
30 * number of missing packages
31 * @var integer
32 */
33 public $missingPackages = 0;
34
35 /**
36 * list of unsatisfied requirements
37 * @var array<array>
38 */
39 public $openRequirements = array();
40
41 /**
42 * package installation dispatcher object
43 * @var \wcf\system\package\PackageInstallationDispatcher
44 */
45 public $packageInstallationDispatcher = null;
46
47 /**
48 * package installation queue object
49 * @var \wcf\data\package\installation\queue\PackageInstallationQueue
50 */
51 public $queue = null;
52
53 /**
54 * queue id
55 * @var integer
56 */
57 public $queueID = 0;
58
59 /**
60 * list of requirements
61 * @var array<array>
62 */
63 public $requirements = array();
64
65 /**
66 * @see \wcf\page\IPage::readParameters()
67 */
68 public function readParameters() {
69 parent::readParameters();
70
71 if (isset($_REQUEST['queueID'])) $this->queueID = intval($_REQUEST['queueID']);
72 $this->queue = new PackageInstallationQueue($this->queueID);
73 if (!$this->queue->queueID || $this->queue->done) {
74 throw new IllegalLinkException();
75 }
76
77 if ($this->queue->action == 'install') {
78 WCF::getSession()->checkPermissions(array('admin.system.package.canInstallPackage'));
79 }
80 else {
81 WCF::getSession()->checkPermissions(array('admin.system.package.canUpdatePackage'));
82 }
83 }
84
85 /**
86 * @see \wcf\page\IPage::readData()
87 */
88 public function readData() {
89 parent::readData();
90
91 $this->packageInstallationDispatcher = new PackageInstallationDispatcher($this->queue);
92
93 // get requirements
94 $this->requirements = $this->packageInstallationDispatcher->getArchive()->getRequirements();
95 $this->openRequirements = $this->packageInstallationDispatcher->getArchive()->getOpenRequirements();
96
97 foreach ($this->requirements as &$requirement) {
98 if (isset($this->openRequirements[$requirement['name']])) {
99 $requirement['status'] = 'missing';
100 $requirement['action'] = $this->openRequirements[$requirement['name']]['action'];
101
102 if (!isset($requirement['file'])) {
103 if ($requirement['action'] === 'update') {
104 $requirement['status'] = 'missingVersion';
105 $requirement['existingVersion'] = $this->openRequirements[$requirement['name']]['existingVersion'];
106 }
107 $this->missingPackages++;
108 }
109 else {
110 $requirement['status'] = 'delivered';
111 $packageArchive = new PackageArchive($this->packageInstallationDispatcher->getArchive()->extractTar($requirement['file']));
112 $packageArchive->openArchive();
113
114 // make sure that the delivered package is correct
115 if ($requirement['name'] != $packageArchive->getPackageInfo('name')) {
116 $requirement['status'] = 'invalidDeliveredPackage';
117 $requirement['deliveredPackage'] = $packageArchive->getPackageInfo('name');
118 $this->missingPackages++;
119 }
120 else if (isset($requirement['minversion'])) {
121 // make sure that the delivered version is sufficient
122 if (Package::compareVersion($requirement['minversion'], $packageArchive->getPackageInfo('version')) > 0) {
123 $requirement['deliveredVersion'] = $packageArchive->getPackageInfo('version');
124 $requirement['status'] = 'missingVersion';
125 $this->missingPackages++;
126 }
127 }
128 }
129 }
130 else {
131 $requirement['status'] = 'installed';
132 }
133
134 $requirement['package'] = PackageCache::getInstance()->getPackageByIdentifier($requirement['name']);
135 }
136
137 unset($requirement);
138 }
139
140 /**
141 * @see \wcf\page\IPage::assignVariables()
142 */
143 public function assignVariables() {
144 parent::assignVariables();
145
146 WCF::getTPL()->assign(array(
147 'archive' => $this->packageInstallationDispatcher->getArchive(),
148 'requiredPackages' => $this->requirements,
149 'missingPackages' => $this->missingPackages,
150 'excludingPackages' => $this->packageInstallationDispatcher->getArchive()->getConflictedExcludingPackages(),
151 'excludedPackages' => $this->packageInstallationDispatcher->getArchive()->getConflictedExcludedPackages(),
152 'queue' => $this->queue
153 ));
154 }
155
156 /**
157 * @see \wcf\page\IPage::show()
158 */
159 public function show() {
160 // check master password
161 WCFACP::checkMasterPassword();
162
163 parent::show();
164 }
165 }