Files
server/usr/share/psa-pear/pear/kronolith-import-squirrelmail-calendar
2026-01-07 20:52:11 +01:00

127 lines
4.7 KiB
PHP
Executable File

#!/usr/bin/env php
<?php
/**
* This script imports SquirrelMail database calendars into Kronolith.
*
* The first argument must be a DSN to the database containing the calendar
* and event tables, e.g.: "mysql://root:password@localhost/squirrelmail".
*
* Copyright 2008-2017 Horde LLC (http://www.horde.org/)
*
* See the enclosed file COPYING for license information (GPL). If you
* did not receive this file, see http://www.horde.org/licenses/gpl.
*
* @author Jan Schneider <jan@horde.org>
*/
if (file_exists(__DIR__ . '/../../kronolith/lib/Application.php')) {
$baseDir = __DIR__ . '/../';
} else {
require_once 'PEAR/Config.php';
$baseDir = PEAR_Config::singleton()
->get('horde_dir', null, 'pear.horde.org') . '/kronolith/';
}
require_once $baseDir . 'lib/Application.php';
Horde_Registry::appInit('kronolith', array('cli' => true, 'user_admin' => true));
// Read command line parameters.
if ($argc != 2) {
$cli->message('Too many or too few parameters.', 'cli.error');
$cli->writeln('Usage: kronolith-import-squirrelmail-calendar DSN');
$cli->writeln($cli->indent('DSN are json-encoded connection parameters to the database containing the "userprefs" table. Example:'));
$cli->writeln($cli->indent('{"adapter":"mysql","user":"root","password":"password","host":"localhost","database":"squirrelmail"}'));
exit;
}
$db = $injector->getInstance('Horde_Db')->createDb(json_decode($argv[1]));
$default_tz = date_default_timezone_get();
// Loop through SquirrelMail calendars.
$read_stmt = 'SELECT reader_name FROM calendar_readers WHERE calendar_id = ?';
$write_stmt = 'SELECT writer_name FROM calendar_writers WHERE calendar_id = ?';
$users = $db->select('SELECT id, name, owner_name FROM calendars, calendar_owners WHERE calendars.id = calendar_owners.calendar_id');
foreach ($users as $row) {
$user = $row['owner_name'];
$registry->setAuth($user, array());
$cli->message('Creating calendar ' . $row['name']);
$kronolith_shares = $injector->getInstance('Kronolith_Shares');
$share = $kronolith_shares->newShare($GLOBALS['registry']->getAuth(), $row['id'], $row['name']);
$kronolith_shares->addShare($share);
// Add permissions.
$permissions = array();
$result = $db->select($read_stmt, array($row['id']));
foreach ($result as $perm_row) {
$permissions[$perm_row[0]] = Horde_Perms::READ | Horde_Perms::SHOW;
}
$result = $db->select($write_stmt, array($row['id']));
foreach ($result as $perm_row) {
if (isset($permissions[$perm_row[0]])) {
$permissions[$perm_row[0]] |= Horde_Perms::EDIT;
} else {
$permissions[$perm_row[0]] = Horde_Perms::EDIT;
}
}
if (count($permissions)) {
$perm = $share->getPermission();
foreach ($permissions as $key => $value) {
$perm->addUserPermission($key, $value, false);
}
$share->setPermission($perm);
$share->save();
}
}
$handle = $db->select('SELECT event_id, calendar_id, ical_raw, owner_name, prefval FROM events, event_owners LEFT JOIN userprefs ON event_owners.owner_name = userprefs.user AND userprefs.prefkey = \'timezone\' WHERE events.id = event_owners.event_key ORDER BY calendar_id, userprefs.prefval, event_owners.owner_name');
$ical = new Horde_Icalendar();
$tz = $calendar = $user = $count = null;
foreach ($handle as $row) {
// Open calendar.
if ($calendar != $row['calendar_id']) {
if (!is_null($count)) {
$cli->message(' Added ' . $count . ' events', 'cli.success');
}
$calendar = $row['calendar_id'];
$cli->message('Importing events into ' . $calendar);
$kronolith_driver->open($calendar);
$count = 0;
}
// Set timezone.
if ($tz != $row['prefval']) {
$tz = $row['prefval'];
date_default_timezone_set($tz ? $tz : $default_tz);
}
// Set user.
if ($user != $row['owner_name']) {
$user = $row['owner_name'];
$registry->setAuth($user, array());
}
// Parse event.
try {
$ical->parsevCalendar($row['ical_raw']);
} catch (Horde_Icalendar_Exception $e) {
$cli->message(' ' . $e->getMessage(), 'cli.warning');
continue;
}
$components = $ical->getComponents();
if (!count($components)) {
$cli->message(' No iCalendar data was found.', 'cli.warning');
continue;
}
// Save event.
$event = $kronolith_driver->getEvent();
$event->fromiCalendar($components[0]);
try {
$event->save();
} catch (Exception $e) {
$cli->message(' ' . $e->getMessage(), 'cli.error');
continue;
}
$count++;
}
if (!is_null($count)) {
$cli->message(' Added ' . $count . ' events', 'cli.success');
}