1: <?php
2: /*****************************************************************************************
3: * X2Engine Open Source Edition is a customer relationship management program developed by
4: * X2Engine, Inc. Copyright (C) 2011-2016 X2Engine Inc.
5: *
6: * This program is free software; you can redistribute it and/or modify it under
7: * the terms of the GNU Affero General Public License version 3 as published by the
8: * Free Software Foundation with the addition of the following permission added
9: * to Section 15 as permitted in Section 7(a): FOR ANY PART OF THE COVERED WORK
10: * IN WHICH THE COPYRIGHT IS OWNED BY X2ENGINE, X2ENGINE DISCLAIMS THE WARRANTY
11: * OF NON INFRINGEMENT OF THIRD PARTY RIGHTS.
12: *
13: * This program is distributed in the hope that it will be useful, but WITHOUT
14: * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
15: * FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
16: * details.
17: *
18: * You should have received a copy of the GNU Affero General Public License along with
19: * this program; if not, see http://www.gnu.org/licenses or write to the Free
20: * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
21: * 02110-1301 USA.
22: *
23: * You can contact X2Engine, Inc. P.O. Box 66752, Scotts Valley,
24: * California 95067, USA. or at email address contact@x2engine.com.
25: *
26: * The interactive user interfaces in modified source and object code versions
27: * of this program must display Appropriate Legal Notices, as required under
28: * Section 5 of the GNU Affero General Public License version 3.
29: *
30: * In accordance with Section 7(b) of the GNU Affero General Public License version 3,
31: * these Appropriate Legal Notices must retain the display of the "Powered by
32: * X2Engine" logo. If the display of the logo is not reasonably feasible for
33: * technical reasons, the Appropriate Legal Notices must display the words
34: * "Powered by X2Engine".
35: *****************************************************************************************/
36:
37: Yii::import('application.components.util.*');
38:
39: /**
40: * Base action class for actions associated with the updater utility.
41: *
42: * The updater is kept separate from the rest of the application like this to
43: * enable updating it to the latest version pre-emptively without harming any
44: * other part of the application with incompatibilities. For this reason,
45: * coupling between actions and the controller is intentionally kept very loose
46: * and limited to use of ubiquitous methods like {@link CController::render()},
47: * with the exception of "error500" (which was in AdminController as of the
48: * switch to the new self-contained updater utility).
49: *
50: * References to the application singleton and controller are thus accompanied
51: * by or wrapped in a slew of conditional statements for purposes of backwards
52: * compatibility.
53: *
54: * @package application.components.webupdater
55: * @author Demitri Morgan <demitri@x2engine.com>
56: */
57: abstract class WebUpdaterAction extends CAction{
58:
59: public function behaviors() {
60: return array(
61: 'UpdaterBehavior' => array(
62: 'class' => 'application.components.UpdaterBehavior'
63: )
64: );
65: }
66:
67: /**
68: * Override of CAction's construct; all child classes need to have the
69: * behavior {@link UpdaterBehavior} attached and enabled.
70: *
71: * @param type $controller
72: * @param type $id
73: */
74: public function __construct($controller, $id){
75: parent::__construct($controller, $id);
76: $this->attachBehaviors($this->behaviors());
77: // Be certain we can continue safely:
78: $this->requireDependencies();
79: }
80:
81: /**
82: * Wrapper for {@link UpdaterBehavior::updateUpdater} that displays errors
83: * in a user-friendly way and reloads the page.
84: *
85: * It contains hideous references to the controller (specifically,
86: * {@link AdminController}) only to avoid code duplication while at the same
87: * time remaining backwards-compatible with earlier versions (which will
88: * download AdminController, hence necessitating that AdminController have
89: * all the necessary functions for throwing errors in cases of missing
90: * dependencies that can't be auto-retrieved).
91: */
92: public function runUpdateUpdater($updaterCheck, $redirect){
93: try{
94: if(count($classes = $this->updateUpdater($updaterCheck))){
95: $this->output(Yii::t('admin', 'One or more dependencies of AdminController are missing and could not be automatically retrieved. They are {classes}', array('{classes}' => implode(', ', $classes))), 'error', 1);
96: $this->controller->missingClassesException($classes);
97: }
98: $this->output(Yii::t('admin', 'The updater is now up-to-date and compliant with the updates server.'));
99: $this->controller->redirect($redirect);
100: }catch(Exception $e){
101: $this->controller->error500($e->getMessage());
102: }
103: }
104: }
105: ?>
106: