Open Journal Systems  3.3.0
PKPInstall.inc.php
1 <?php
2 
28 import('lib.pkp.classes.install.Installer');
29 import('classes.core.Services');
30 
31 use Illuminate\Database\Capsule\Manager as Capsule;
32 
33 class PKPInstall extends Installer {
34 
42  function __construct($xmlDescriptor, $params, $isPlugin) {
43  parent::__construct($xmlDescriptor, $params, $isPlugin);
44  }
45 
49  function isUpgrade() {
50  return false;
51  }
52 
57  function preInstall() {
58  if(!isset($this->currentVersion)) {
59  $this->currentVersion = Version::fromString('');
60  }
61 
62  $this->locale = $this->getParam('locale');
63  $this->installedLocales = $this->getParam('additionalLocales');
64  if (!isset($this->installedLocales) || !is_array($this->installedLocales)) {
65  $this->installedLocales = array();
66  }
67  if (!in_array($this->locale, $this->installedLocales) && AppLocale::isLocaleValid($this->locale)) {
68  array_push($this->installedLocales, $this->locale);
69  }
70 
71  // Connect to database
72  $conn = new DBConnection(
73  $driver = $this->getParam('databaseDriver'),
74  $this->getParam('databaseHost'),
75  $this->getParam('databaseUsername'),
76  $this->getParam('databasePassword'),
77  $this->getParam('createDatabase') ? null : $this->getParam('databaseName'),
78  false,
79  $connectionCharset = $this->getParam('connectionCharset') == '' ? false : $this->getParam('connectionCharset')
80  );
81 
82  $this->dbconn =& $conn->getDBConn();
83 
84  if (!$conn->isConnected()) {
85  $this->setError(INSTALLER_ERROR_DB, $this->dbconn->errorMsg());
86  return false;
87  }
88 
89  // Map valid config options to Illuminate database drivers
90  $driver = strtolower($driver);
91  if (substr($driver, 0, 8) === 'postgres') {
92  $driver = 'pgsql';
93  } else {
94  $driver = 'mysql';
95  }
96 
97  $capsule = new Capsule;
98  $capsule->addConnection([
99  'driver' => $driver,
100  'host' => $this->getParam('databaseHost'),
101  'database' => $this->getParam('databaseName'),
102  'username' => $this->getParam('databaseUsername'),
103  'password' => $this->getParam('databasePassword'),
104  'charset' => $connectionCharset == 'latin1'?'latin1':'utf8',
105  'collation' => 'utf8_general_ci',
106  ]);
107  $capsule->setAsGlobal();
108 
110 
111  return parent::preInstall();
112  }
113 
114 
115  //
116  // Installer actions
117  //
118 
123  function getCreateDirectories() {
124  return array('site');
125  }
126 
132  function createDirectories() {
133  // Check if files directory exists and is writeable
134  if (!(file_exists($this->getParam('filesDir')) && is_writeable($this->getParam('filesDir')))) {
135  // Files upload directory unusable
136  $this->setError(INSTALLER_ERROR_GENERAL, 'installer.installFilesDirError');
137  return false;
138  } else {
139  // Create required subdirectories
140  $dirsToCreate = $this->getCreateDirectories();
141  import('lib.pkp.classes.file.FileManager');
142  $fileManager = new FileManager();
143  foreach ($dirsToCreate as $dirName) {
144  $dirToCreate = $this->getParam('filesDir') . '/' . $dirName;
145  if (!file_exists($dirToCreate)) {
146  if (!$fileManager->mkdir($dirToCreate)) {
147  $this->setError(INSTALLER_ERROR_GENERAL, 'installer.installFilesDirError');
148  return false;
149  }
150  }
151  }
152  }
153 
154  // Check if public files directory exists and is writeable
155  $publicFilesDir = Config::getVar('files', 'public_files_dir');
156  if (!(file_exists($publicFilesDir) && is_writeable($publicFilesDir))) {
157  // Public files upload directory unusable
158  $this->setError(INSTALLER_ERROR_GENERAL, 'installer.publicFilesDirError');
159  return false;
160  } else {
161  // Create required subdirectories
162  $dirsToCreate = $this->getCreateDirectories();
163  import('lib.pkp.classes.file.FileManager');
164  $fileManager = new FileManager();
165  foreach ($dirsToCreate as $dirName) {
166  $dirToCreate = $publicFilesDir . '/' . $dirName;
167  if (!file_exists($dirToCreate)) {
168  if (!$fileManager->mkdir($dirToCreate)) {
169  $this->setError(INSTALLER_ERROR_GENERAL, 'installer.publicFilesDirError');
170  return false;
171  }
172  }
173  }
174  }
175 
176  return true;
177  }
178 
183  function createDatabase() {
184  if (!$this->getParam('createDatabase')) {
185  return true;
186  }
187 
188  // Get database creation sql
189  $dbdict = NewDataDictionary($this->dbconn);
190 
191  list($sql) = $dbdict->CreateDatabase($this->getParam('databaseName'));
192  unset($dbdict);
193 
194  if (!$this->executeSQL($sql)) {
195  return false;
196  }
197 
198  // Re-connect to the created database
199  $this->dbconn->disconnect();
200 
201  $conn = new DBConnection(
202  $this->getParam('databaseDriver'),
203  $this->getParam('databaseHost'),
204  $this->getParam('databaseUsername'),
205  $this->getParam('databasePassword'),
206  $this->getParam('databaseName'),
207  true,
208  $this->getParam('connectionCharset') == '' ? false : $this->getParam('connectionCharset')
209  );
210 
212 
213  $this->dbconn =& $conn->getDBConn();
214 
215  if (!$conn->isConnected()) {
216  $this->setError(INSTALLER_ERROR_DB, $this->dbconn->errorMsg());
217  return false;
218  }
219 
220  return true;
221  }
222 
227  function createConfig() {
228  $request = Application::get()->getRequest();
229  return $this->updateConfig(
230  array(
231  'general' => array(
232  'installed' => 'On',
233  'base_url' => $request->getBaseUrl(),
234  'enable_beacon' => $this->getParam('enableBeacon')?'On':'Off',
235  ),
236  'database' => array(
237  'driver' => $this->getParam('databaseDriver'),
238  'host' => $this->getParam('databaseHost'),
239  'username' => $this->getParam('databaseUsername'),
240  'password' => $this->getParam('databasePassword'),
241  'name' => $this->getParam('databaseName')
242  ),
243  'i18n' => array(
244  'locale' => $this->getParam('locale'),
245  'client_charset' => $this->getParam('clientCharset'),
246  'connection_charset' => $this->getParam('connectionCharset') == '' ? 'Off' : $this->getParam('connectionCharset'),
247  ),
248  'files' => array(
249  'files_dir' => $this->getParam('filesDir')
250  ),
251  'oai' => array(
252  'repository_id' => $this->getParam('oaiRepositoryId')
253  )
254  )
255  );
256  }
257 
262  function createData() {
263  $siteLocale = $this->getParam('locale');
264 
265  // Add initial site administrator user
266  $userDao = DAORegistry::getDAO('UserDAO', $this->dbconn);
267  $user = $userDao->newDataObject();
268  $user->setUsername($this->getParam('adminUsername'));
269  $user->setPassword(Validation::encryptCredentials($this->getParam('adminUsername'), $this->getParam('adminPassword'), $this->getParam('encryption')));
270  $user->setGivenName($user->getUsername(), $siteLocale);
271  $user->setFamilyName($user->getUsername(), $siteLocale);
272  $user->setEmail($this->getParam('adminEmail'));
273  $user->setInlineHelp(1);
274  if (!$userDao->insertObject($user)) {
275  $this->setError(INSTALLER_ERROR_DB, $this->dbconn->errorMsg());
276  return false;
277  }
278 
279  // Create an admin user group
280  AppLocale::requireComponents(LOCALE_COMPONENT_PKP_DEFAULT);
281  $userGroupDao = DAORegistry::getDAO('UserGroupDAO', $this->dbconn);
282  $adminUserGroup = $userGroupDao->newDataObject();
283  $adminUserGroup->setRoleId(ROLE_ID_SITE_ADMIN);
284  $adminUserGroup->setContextId(CONTEXT_ID_NONE);
285  $adminUserGroup->setDefault(true);
286  foreach ($this->installedLocales as $locale) {
287  $name = __('default.groups.name.siteAdmin', array(), $locale);
288  $namePlural = __('default.groups.plural.siteAdmin', array(), $locale);
289  $adminUserGroup->setData('name', $name, $locale);
290  $adminUserGroup->setData('namePlural', $namePlural, $locale);
291  }
292  if (!$userGroupDao->insertObject($adminUserGroup)) {
293  $this->setError(INSTALLER_ERROR_DB, $this->dbconn->errorMsg());
294  return false;
295  }
296 
297  // Put the installer into this user group
298  $userGroupDao->assignUserToGroup($user->getId(), $adminUserGroup->getId());
299 
300  // Add initial site data
301  $siteDao = DAORegistry::getDAO('SiteDAO', $this->dbconn);
302  $site = $siteDao->newDataObject();
303  $site->setRedirect(0);
304  $site->setMinPasswordLength(INSTALLER_DEFAULT_MIN_PASSWORD_LENGTH);
305  $site->setPrimaryLocale($siteLocale);
306  $site->setInstalledLocales($this->installedLocales);
307  $site->setSupportedLocales($this->installedLocales);
308  if (!$siteDao->insertSite($site)) {
309  $this->setError(INSTALLER_ERROR_DB, $this->dbconn->errorMsg());
310  return false;
311  }
312 
313  // Install email template list and data for each locale
314  foreach ($this->installedLocales as $locale) {
315  AppLocale::requireComponents(LOCALE_COMPONENT_APP_EMAIL, $locale);
316  }
317  $emailTemplateDao = DAORegistry::getDAO('EmailTemplateDAO'); /* @var $emailTemplateDao EmailTemplateDAO */
318  $emailTemplateDao->installEmailTemplates($emailTemplateDao->getMainEmailTemplatesFilename(), $this->installedLocales);
319 
320  // Install default site settings
321  $schemaService = Services::get('schema');
322  $site = $schemaService->setDefaults(SCHEMA_SITE, $site, $site->getSupportedLocales(), $site->getPrimaryLocale());
323  $site->setData('contactEmail', $this->getParam('adminEmail'), $site->getPrimaryLocale());
324  $siteDao->updateObject($site);
325 
326  return true;
327  }
328 }
AppLocale\requireComponents
static requireComponents()
Definition: env1/MockAppLocale.inc.php:56
Validation\encryptCredentials
static encryptCredentials($username, $password, $encryption=false, $legacy=false)
Definition: Validation.inc.php:255
DBConnection
Class for accessing the low-level database connection. Currently integrated with ADOdb (from http://a...
Definition: DBConnection.inc.php:19
Installer\$params
$params
Definition: Installer.inc.php:52
PKPInstall\createConfig
createConfig()
Definition: PKPInstall.inc.php:227
Installer\executeSQL
executeSQL($sql)
Definition: Installer.inc.php:516
PKPInstall\getCreateDirectories
getCreateDirectories()
Definition: PKPInstall.inc.php:123
DAORegistry\getDAO
static & getDAO($name, $dbconn=null)
Definition: DAORegistry.inc.php:57
Installer\getParam
getParam($name)
Definition: Installer.inc.php:566
Installer\setError
setError($type, $msg)
Definition: Installer.inc.php:658
PKPInstall\createDirectories
createDirectories()
Definition: PKPInstall.inc.php:132
Installer\updateConfig
updateConfig($configParams)
Definition: Installer.inc.php:539
PKPInstall\isUpgrade
isUpgrade()
Definition: PKPInstall.inc.php:49
Config\getVar
static getVar($section, $key, $default=null)
Definition: Config.inc.php:35
Installer\$isPlugin
$isPlugin
Definition: Installer.inc.php:46
Installer\$sql
$sql
Definition: Installer.inc.php:100
PKPInstall\preInstall
preInstall()
Definition: PKPInstall.inc.php:57
Version\fromString
static fromString($versionString, $productType=null, $product=null, $productClass='', $lazyLoad=0, $sitewide=1)
Definition: Version.inc.php:67
PKPInstall
Definition: PKPInstall.inc.php:33
Installer
Base class for install and upgrade scripts.
Definition: Installer.inc.php:34
PKPApplication\get
static get()
Definition: PKPApplication.inc.php:235
FileManager
Class defining basic operations for file management.
Definition: FileManager.inc.php:35
PKPInstall\createDatabase
createDatabase()
Definition: PKPInstall.inc.php:183
PKPLocale\isLocaleValid
static isLocaleValid($locale)
Definition: PKPLocale.inc.php:505
PKPInstall\__construct
__construct($xmlDescriptor, $params, $isPlugin)
Definition: PKPInstall.inc.php:42
DBConnection\getInstance
static getInstance($setInstance=null)
Definition: DBConnection.inc.php:241
Installer\$locale
$locale
Definition: Installer.inc.php:76
PKPInstall\createData
createData()
Definition: PKPInstall.inc.php:262
PKPServices\get
static get($service)
Definition: PKPServices.inc.php:49