aboutsummaryrefslogtreecommitdiffstats
path: root/vendor/sabre/dav/bin
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/sabre/dav/bin')
-rwxr-xr-x[-rw-r--r--]vendor/sabre/dav/bin/build.php60
-rwxr-xr-xvendor/sabre/dav/bin/migrateto17.php54
-rwxr-xr-xvendor/sabre/dav/bin/migrateto20.php453
-rwxr-xr-xvendor/sabre/dav/bin/migrateto21.php180
-rwxr-xr-xvendor/sabre/dav/bin/migrateto30.php171
-rwxr-xr-xvendor/sabre/dav/bin/naturalselection (renamed from vendor/sabre/dav/bin/naturalselection.py)30
-rwxr-xr-xvendor/sabre/dav/bin/sabredav.php10
7 files changed, 901 insertions, 57 deletions
diff --git a/vendor/sabre/dav/bin/build.php b/vendor/sabre/dav/bin/build.php
index 11cca1e61..82b1e7530 100644..100755
--- a/vendor/sabre/dav/bin/build.php
+++ b/vendor/sabre/dav/bin/build.php
@@ -1,3 +1,4 @@
+#!/usr/bin/env php
<?php
$tasks = [
@@ -9,10 +10,10 @@ $tasks = [
'init', 'test', 'clean',
],
'clean' => [],
- 'test' => [
+ 'test' => [
'composerupdate',
],
- 'init' => [],
+ 'init' => [],
'composerupdate' => [],
];
@@ -35,9 +36,9 @@ if (!isset($tasks[$currentTask])) {
$newTaskList = [];
$oldTaskList = [$currentTask => true];
-while(count($oldTaskList)>0) {
+while (count($oldTaskList) > 0) {
- foreach($oldTaskList as $task=>$foo) {
+ foreach ($oldTaskList as $task => $foo) {
if (!isset($tasks[$task])) {
echo "Dependency not found: " . $task, "\n";
@@ -46,7 +47,7 @@ while(count($oldTaskList)>0) {
$dependencies = $tasks[$task];
$fullFilled = true;
- foreach($dependencies as $dependency) {
+ foreach ($dependencies as $dependency) {
if (isset($newTaskList[$dependency])) {
// Already in the fulfilled task list.
continue;
@@ -65,7 +66,7 @@ while(count($oldTaskList)>0) {
}
-foreach(array_keys($newTaskList) as $task) {
+foreach (array_keys($newTaskList) as $task) {
echo "task: " . $task, "\n";
call_user_func($task);
@@ -100,7 +101,7 @@ function composerupdate() {
global $baseDir;
echo " Updating composer packages to latest version\n\n";
- system('cd ' . $baseDir . '; composer update --dev');
+ system('cd ' . $baseDir . '; composer update');
}
function test() {
@@ -120,12 +121,51 @@ function test() {
function buildzip() {
global $baseDir, $version;
- echo " Asking composer to download sabre/dav $version\n\n";
- system("composer create-project --no-dev sabre/dav build/SabreDAV $version", $code);
- if ($code!==0) {
+ echo " Generating composer.json\n";
+
+ $input = json_decode(file_get_contents(__DIR__ . '/../composer.json'), true);
+ $newComposer = [
+ "require" => $input['require'],
+ "config" => [
+ "bin-dir" => "./bin",
+ ],
+ "prefer-stable" => true,
+ "minimum-stability" => "alpha",
+ ];
+ unset(
+ $newComposer['require']['sabre/vobject'],
+ $newComposer['require']['sabre/http'],
+ $newComposer['require']['sabre/uri'],
+ $newComposer['require']['sabre/event']
+ );
+ $newComposer['require']['sabre/dav'] = $version;
+ mkdir('build/SabreDAV');
+ file_put_contents('build/SabreDAV/composer.json', json_encode($newComposer, JSON_PRETTY_PRINT));
+
+ echo " Downloading dependencies\n";
+ system("cd build/SabreDAV; composer install -n", $code);
+ if ($code !== 0) {
echo "Composer reported error code $code\n";
die(1);
}
+
+ echo " Removing pointless files\n";
+ unlink('build/SabreDAV/composer.json');
+ unlink('build/SabreDAV/composer.lock');
+
+ echo " Moving important files to the root of the project\n";
+
+ $fileNames = [
+ 'CHANGELOG.md',
+ 'LICENSE',
+ 'README.md',
+ 'examples',
+ ];
+ foreach ($fileNames as $fileName) {
+ echo " $fileName\n";
+ rename('build/SabreDAV/vendor/sabre/dav/' . $fileName, 'build/SabreDAV/' . $fileName);
+ }
+
// <zip destfile="build/SabreDAV-${sabredav.version}.zip" basedir="build/SabreDAV" prefix="SabreDAV/" />
echo "\n";
diff --git a/vendor/sabre/dav/bin/migrateto17.php b/vendor/sabre/dav/bin/migrateto17.php
index 66a9ee564..a1173c584 100755
--- a/vendor/sabre/dav/bin/migrateto17.php
+++ b/vendor/sabre/dav/bin/migrateto17.php
@@ -3,7 +3,7 @@
echo "SabreDAV migrate script for version 1.7\n";
-if ($argc<2) {
+if ($argc < 2) {
echo <<<HELLO
@@ -35,12 +35,12 @@ HELLO;
// There's a bunch of places where the autoloader could be, so we'll try all of
// them.
-$paths = array(
+$paths = [
__DIR__ . '/../vendor/autoload.php',
__DIR__ . '/../../../autoload.php',
-);
+];
-foreach($paths as $path) {
+foreach ($paths as $path) {
if (file_exists($path)) {
include $path;
break;
@@ -48,8 +48,8 @@ foreach($paths as $path) {
}
$dsn = $argv[1];
-$user = isset($argv[2])?$argv[2]:null;
-$pass = isset($argv[3])?$argv[3]:null;
+$user = isset($argv[2]) ? $argv[2] : null;
+$pass = isset($argv[3]) ? $argv[3] : null;
echo "Connecting to database: " . $dsn . "\n";
@@ -67,32 +67,32 @@ if (!$row) {
exit(-1);
}
-$requiredFields = array(
+$requiredFields = [
'id',
'calendardata',
'uri',
'calendarid',
'lastmodified',
-);
+];
-foreach($requiredFields as $requiredField) {
- if (!array_key_exists($requiredField,$row)) {
+foreach ($requiredFields as $requiredField) {
+ if (!array_key_exists($requiredField, $row)) {
echo "Error: The current 'calendarobjects' table was missing a field we expected to exist.\n";
echo "For safety reasons, this process is stopped.\n";
exit(-1);
}
}
-$fields17 = array(
+$fields17 = [
'etag',
'size',
'componenttype',
'firstoccurence',
'lastoccurence',
-);
+];
$found = 0;
-foreach($fields17 as $field) {
+foreach ($fields17 as $field) {
if (array_key_exists($field, $row)) {
$found++;
}
@@ -102,7 +102,7 @@ if ($found === 0) {
echo "The database had the 1.6 schema. Table will now be altered.\n";
echo "This may take some time for large tables\n";
- switch($pdo->getAttribute(PDO::ATTR_DRIVER_NAME)) {
+ switch ($pdo->getAttribute(PDO::ATTR_DRIVER_NAME)) {
case 'mysql' :
@@ -150,7 +150,7 @@ $stmt = $pdo->prepare('UPDATE calendarobjects SET etag = ?, size = ?, componentt
echo "Total records found: " . $result->rowCount() . "\n";
$done = 0;
$total = $result->rowCount();
-while($row = $result->fetch()) {
+while ($row = $result->fetch()) {
try {
$newData = getDenormalizedData($row['calendardata']);
@@ -161,14 +161,14 @@ while($row = $result->fetch()) {
echo "This record is ignored, you should inspect it to see if there's anything wrong.\n===\n";
continue;
}
- $stmt->execute(array(
+ $stmt->execute([
$newData['etag'],
$newData['size'],
$newData['componentType'],
$newData['firstOccurence'],
$newData['lastOccurence'],
$row['id'],
- ));
+ ]);
$done++;
if ($done % 500 === 0) {
@@ -188,7 +188,7 @@ if (array_key_exists('transparent', $row)) {
echo "Adding the 'transparent' field to the calendars table\n";
- switch($pdo->getAttribute(PDO::ATTR_DRIVER_NAME)) {
+ switch ($pdo->getAttribute(PDO::ATTR_DRIVER_NAME)) {
case 'mysql' :
$pdo->exec("ALTER TABLE calendars ADD transparent TINYINT(1) NOT NULL DEFAULT '0'");
@@ -229,8 +229,8 @@ function getDenormalizedData($calendarData) {
$component = null;
$firstOccurence = null;
$lastOccurence = null;
- foreach($vObject->getComponents() as $component) {
- if ($component->name!=='VTIMEZONE') {
+ foreach ($vObject->getComponents() as $component) {
+ if ($component->name !== 'VTIMEZONE') {
$componentType = $component->name;
break;
}
@@ -256,13 +256,13 @@ function getDenormalizedData($calendarData) {
$lastOccurence = $firstOccurence;
}
} else {
- $it = new \Sabre\VObject\RecurrenceIterator($vObject, (string)$component->UID);
+ $it = new \Sabre\VObject\Recur\EventIterator($vObject, (string)$component->UID);
$maxDate = new DateTime(\Sabre\CalDAV\Backend\PDO::MAX_DATE);
if ($it->isInfinite()) {
$lastOccurence = $maxDate->getTimeStamp();
} else {
$end = $it->getDtEnd();
- while($it->valid() && $end < $maxDate) {
+ while ($it->valid() && $end < $maxDate) {
$end = $it->getDtEnd();
$it->next();
@@ -273,12 +273,12 @@ function getDenormalizedData($calendarData) {
}
}
- return array(
- 'etag' => md5($calendarData),
- 'size' => strlen($calendarData),
- 'componentType' => $componentType,
+ return [
+ 'etag' => md5($calendarData),
+ 'size' => strlen($calendarData),
+ 'componentType' => $componentType,
'firstOccurence' => $firstOccurence,
'lastOccurence' => $lastOccurence,
- );
+ ];
}
diff --git a/vendor/sabre/dav/bin/migrateto20.php b/vendor/sabre/dav/bin/migrateto20.php
new file mode 100755
index 000000000..77236804f
--- /dev/null
+++ b/vendor/sabre/dav/bin/migrateto20.php
@@ -0,0 +1,453 @@
+#!/usr/bin/env php
+<?php
+
+echo "SabreDAV migrate script for version 2.0\n";
+
+if ($argc < 2) {
+
+ echo <<<HELLO
+
+This script help you migrate from a pre-2.0 database to 2.0 and later
+
+The 'calendars', 'addressbooks' and 'cards' tables will be upgraded, and new
+tables (calendarchanges, addressbookchanges, propertystorage) will be added.
+
+If you don't use the default PDO CalDAV or CardDAV backend, it's pointless to
+run this script.
+
+Keep in mind that ALTER TABLE commands will be executed. If you have a large
+dataset this may mean that this process takes a while.
+
+Lastly: Make a back-up first. This script has been tested, but the amount of
+potential variants are extremely high, so it's impossible to deal with every
+possible situation.
+
+In the worst case, you will lose all your data. This is not an overstatement.
+
+Usage:
+
+php {$argv[0]} [pdo-dsn] [username] [password]
+
+For example:
+
+php {$argv[0]} "mysql:host=localhost;dbname=sabredav" root password
+php {$argv[0]} sqlite:data/sabredav.db
+
+HELLO;
+
+ exit();
+
+}
+
+// There's a bunch of places where the autoloader could be, so we'll try all of
+// them.
+$paths = [
+ __DIR__ . '/../vendor/autoload.php',
+ __DIR__ . '/../../../autoload.php',
+];
+
+foreach ($paths as $path) {
+ if (file_exists($path)) {
+ include $path;
+ break;
+ }
+}
+
+$dsn = $argv[1];
+$user = isset($argv[2]) ? $argv[2] : null;
+$pass = isset($argv[3]) ? $argv[3] : null;
+
+echo "Connecting to database: " . $dsn . "\n";
+
+$pdo = new PDO($dsn, $user, $pass);
+$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
+$pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
+
+$driver = $pdo->getAttribute(PDO::ATTR_DRIVER_NAME);
+
+switch ($driver) {
+
+ case 'mysql' :
+ echo "Detected MySQL.\n";
+ break;
+ case 'sqlite' :
+ echo "Detected SQLite.\n";
+ break;
+ default :
+ echo "Error: unsupported driver: " . $driver . "\n";
+ die(-1);
+}
+
+foreach (['calendar', 'addressbook'] as $itemType) {
+
+ $tableName = $itemType . 's';
+ $tableNameOld = $tableName . '_old';
+ $changesTable = $itemType . 'changes';
+
+ echo "Upgrading '$tableName'\n";
+
+ // The only cross-db way to do this, is to just fetch a single record.
+ $row = $pdo->query("SELECT * FROM $tableName LIMIT 1")->fetch();
+
+ if (!$row) {
+
+ echo "No records were found in the '$tableName' table.\n";
+ echo "\n";
+ echo "We're going to rename the old table to $tableNameOld (just in case).\n";
+ echo "and re-create the new table.\n";
+
+ switch ($driver) {
+
+ case 'mysql' :
+ $pdo->exec("RENAME TABLE $tableName TO $tableNameOld");
+ switch ($itemType) {
+ case 'calendar' :
+ $pdo->exec("
+ CREATE TABLE calendars (
+ id INT(11) UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
+ principaluri VARCHAR(100),
+ displayname VARCHAR(100),
+ uri VARCHAR(200),
+ synctoken INT(11) UNSIGNED NOT NULL DEFAULT '1',
+ description TEXT,
+ calendarorder INT(11) UNSIGNED NOT NULL DEFAULT '0',
+ calendarcolor VARCHAR(10),
+ timezone TEXT,
+ components VARCHAR(20),
+ transparent TINYINT(1) NOT NULL DEFAULT '0',
+ UNIQUE(principaluri, uri)
+ ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
+ ");
+ break;
+ case 'addressbook' :
+ $pdo->exec("
+ CREATE TABLE addressbooks (
+ id INT(11) UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
+ principaluri VARCHAR(255),
+ displayname VARCHAR(255),
+ uri VARCHAR(200),
+ description TEXT,
+ synctoken INT(11) UNSIGNED NOT NULL DEFAULT '1',
+ UNIQUE(principaluri, uri)
+ ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
+ ");
+ break;
+ }
+ break;
+
+ case 'sqlite' :
+
+ $pdo->exec("ALTER TABLE $tableName RENAME TO $tableNameOld");
+
+ switch ($itemType) {
+ case 'calendar' :
+ $pdo->exec("
+ CREATE TABLE calendars (
+ id integer primary key asc,
+ principaluri text,
+ displayname text,
+ uri text,
+ synctoken integer,
+ description text,
+ calendarorder integer,
+ calendarcolor text,
+ timezone text,
+ components text,
+ transparent bool
+ );
+ ");
+ break;
+ case 'addressbook' :
+ $pdo->exec("
+ CREATE TABLE addressbooks (
+ id integer primary key asc,
+ principaluri text,
+ displayname text,
+ uri text,
+ description text,
+ synctoken integer
+ );
+ ");
+
+ break;
+ }
+ break;
+
+ }
+ echo "Creation of 2.0 $tableName table is complete\n";
+
+ } else {
+
+ // Checking if there's a synctoken field already.
+ if (array_key_exists('synctoken', $row)) {
+ echo "The 'synctoken' field already exists in the $tableName table.\n";
+ echo "It's likely you already upgraded, so we're simply leaving\n";
+ echo "the $tableName table alone\n";
+ } else {
+
+ echo "1.8 table schema detected\n";
+ switch ($driver) {
+
+ case 'mysql' :
+ $pdo->exec("ALTER TABLE $tableName ADD synctoken INT(11) UNSIGNED NOT NULL DEFAULT '1'");
+ $pdo->exec("ALTER TABLE $tableName DROP ctag");
+ $pdo->exec("UPDATE $tableName SET synctoken = '1'");
+ break;
+ case 'sqlite' :
+ $pdo->exec("ALTER TABLE $tableName ADD synctoken integer");
+ $pdo->exec("UPDATE $tableName SET synctoken = '1'");
+ echo "Note: there's no easy way to remove fields in sqlite.\n";
+ echo "The ctag field is no longer used, but it's kept in place\n";
+ break;
+
+ }
+
+ echo "Upgraded '$tableName' to 2.0 schema.\n";
+
+ }
+
+ }
+
+ try {
+ $pdo->query("SELECT * FROM $changesTable LIMIT 1");
+
+ echo "'$changesTable' already exists. Assuming that this part of the\n";
+ echo "upgrade was already completed.\n";
+
+ } catch (Exception $e) {
+ echo "Creating '$changesTable' table.\n";
+
+ switch ($driver) {
+
+ case 'mysql' :
+ $pdo->exec("
+ CREATE TABLE $changesTable (
+ id INT(11) UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
+ uri VARCHAR(200) NOT NULL,
+ synctoken INT(11) UNSIGNED NOT NULL,
+ {$itemType}id INT(11) UNSIGNED NOT NULL,
+ operation TINYINT(1) NOT NULL,
+ INDEX {$itemType}id_synctoken ({$itemType}id, synctoken)
+ ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
+
+ ");
+ break;
+ case 'sqlite' :
+ $pdo->exec("
+
+ CREATE TABLE $changesTable (
+ id integer primary key asc,
+ uri text,
+ synctoken integer,
+ {$itemType}id integer,
+ operation bool
+ );
+
+ ");
+ $pdo->exec("CREATE INDEX {$itemType}id_synctoken ON $changesTable ({$itemType}id, synctoken);");
+ break;
+
+ }
+
+ }
+
+}
+
+try {
+ $pdo->query("SELECT * FROM calendarsubscriptions LIMIT 1");
+
+ echo "'calendarsubscriptions' already exists. Assuming that this part of the\n";
+ echo "upgrade was already completed.\n";
+
+} catch (Exception $e) {
+ echo "Creating calendarsubscriptions table.\n";
+
+ switch ($driver) {
+
+ case 'mysql' :
+ $pdo->exec("
+CREATE TABLE calendarsubscriptions (
+ id INT(11) UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
+ uri VARCHAR(200) NOT NULL,
+ principaluri VARCHAR(100) NOT NULL,
+ source TEXT,
+ displayname VARCHAR(100),
+ refreshrate VARCHAR(10),
+ calendarorder INT(11) UNSIGNED NOT NULL DEFAULT '0',
+ calendarcolor VARCHAR(10),
+ striptodos TINYINT(1) NULL,
+ stripalarms TINYINT(1) NULL,
+ stripattachments TINYINT(1) NULL,
+ lastmodified INT(11) UNSIGNED,
+ UNIQUE(principaluri, uri)
+);
+ ");
+ break;
+ case 'sqlite' :
+ $pdo->exec("
+
+CREATE TABLE calendarsubscriptions (
+ id integer primary key asc,
+ uri text,
+ principaluri text,
+ source text,
+ displayname text,
+ refreshrate text,
+ calendarorder integer,
+ calendarcolor text,
+ striptodos bool,
+ stripalarms bool,
+ stripattachments bool,
+ lastmodified int
+);
+ ");
+
+ $pdo->exec("CREATE INDEX principaluri_uri ON calendarsubscriptions (principaluri, uri);");
+ break;
+
+ }
+
+}
+
+try {
+ $pdo->query("SELECT * FROM propertystorage LIMIT 1");
+
+ echo "'propertystorage' already exists. Assuming that this part of the\n";
+ echo "upgrade was already completed.\n";
+
+} catch (Exception $e) {
+ echo "Creating propertystorage table.\n";
+
+ switch ($driver) {
+
+ case 'mysql' :
+ $pdo->exec("
+CREATE TABLE propertystorage (
+ id INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
+ path VARBINARY(1024) NOT NULL,
+ name VARBINARY(100) NOT NULL,
+ value MEDIUMBLOB
+);
+ ");
+ $pdo->exec("
+CREATE UNIQUE INDEX path_property ON propertystorage (path(600), name(100));
+ ");
+ break;
+ case 'sqlite' :
+ $pdo->exec("
+CREATE TABLE propertystorage (
+ id integer primary key asc,
+ path TEXT,
+ name TEXT,
+ value TEXT
+);
+ ");
+ $pdo->exec("
+CREATE UNIQUE INDEX path_property ON propertystorage (path, name);
+ ");
+
+ break;
+
+ }
+
+}
+
+echo "Upgrading cards table to 2.0 schema\n";
+
+try {
+
+ $create = false;
+ $row = $pdo->query("SELECT * FROM cards LIMIT 1")->fetch();
+ if (!$row) {
+ $random = mt_rand(1000, 9999);
+ echo "There was no data in the cards table, so we're re-creating it\n";
+ echo "The old table will be renamed to cards_old$random, just in case.\n";
+
+ $create = true;
+
+ switch ($driver) {
+ case 'mysql' :
+ $pdo->exec("RENAME TABLE cards TO cards_old$random");
+ break;
+ case 'sqlite' :
+ $pdo->exec("ALTER TABLE cards RENAME TO cards_old$random");
+ break;
+
+ }
+ }
+
+} catch (Exception $e) {
+
+ echo "Exception while checking cards table. Assuming that the table does not yet exist.\n";
+ echo "Debug: ", $e->getMessage(), "\n";
+ $create = true;
+
+}
+
+if ($create) {
+ switch ($driver) {
+ case 'mysql' :
+ $pdo->exec("
+CREATE TABLE cards (
+ id INT(11) UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
+ addressbookid INT(11) UNSIGNED NOT NULL,
+ carddata MEDIUMBLOB,
+ uri VARCHAR(200),
+ lastmodified INT(11) UNSIGNED,
+ etag VARBINARY(32),
+ size INT(11) UNSIGNED NOT NULL
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
+
+ ");
+ break;
+
+ case 'sqlite' :
+
+ $pdo->exec("
+CREATE TABLE cards (
+ id integer primary key asc,
+ addressbookid integer,
+ carddata blob,
+ uri text,
+ lastmodified integer,
+ etag text,
+ size integer
+);
+ ");
+ break;
+
+ }
+} else {
+ switch ($driver) {
+ case 'mysql' :
+ $pdo->exec("
+ ALTER TABLE cards
+ ADD etag VARBINARY(32),
+ ADD size INT(11) UNSIGNED NOT NULL;
+ ");
+ break;
+
+ case 'sqlite' :
+
+ $pdo->exec("
+ ALTER TABLE cards ADD etag text;
+ ALTER TABLE cards ADD size integer;
+ ");
+ break;
+
+ }
+ echo "Reading all old vcards and populating etag and size fields.\n";
+ $result = $pdo->query('SELECT id, carddata FROM cards');
+ $stmt = $pdo->prepare('UPDATE cards SET etag = ?, size = ? WHERE id = ?');
+ while ($row = $result->fetch(\PDO::FETCH_ASSOC)) {
+ $stmt->execute([
+ md5($row['carddata']),
+ strlen($row['carddata']),
+ $row['id']
+ ]);
+ }
+
+
+}
+
+echo "Upgrade to 2.0 schema completed.\n";
diff --git a/vendor/sabre/dav/bin/migrateto21.php b/vendor/sabre/dav/bin/migrateto21.php
new file mode 100755
index 000000000..f42c4cf88
--- /dev/null
+++ b/vendor/sabre/dav/bin/migrateto21.php
@@ -0,0 +1,180 @@
+#!/usr/bin/env php
+<?php
+
+echo "SabreDAV migrate script for version 2.1\n";
+
+if ($argc < 2) {
+
+ echo <<<HELLO
+
+This script help you migrate from a pre-2.1 database to 2.1.
+
+Changes:
+ The 'calendarobjects' table will be upgraded.
+ 'schedulingobjects' will be created.
+
+If you don't use the default PDO CalDAV or CardDAV backend, it's pointless to
+run this script.
+
+Keep in mind that ALTER TABLE commands will be executed. If you have a large
+dataset this may mean that this process takes a while.
+
+Lastly: Make a back-up first. This script has been tested, but the amount of
+potential variants are extremely high, so it's impossible to deal with every
+possible situation.
+
+In the worst case, you will lose all your data. This is not an overstatement.
+
+Usage:
+
+php {$argv[0]} [pdo-dsn] [username] [password]
+
+For example:
+
+php {$argv[0]} "mysql:host=localhost;dbname=sabredav" root password
+php {$argv[0]} sqlite:data/sabredav.db
+
+HELLO;
+
+ exit();
+
+}
+
+// There's a bunch of places where the autoloader could be, so we'll try all of
+// them.
+$paths = [
+ __DIR__ . '/../vendor/autoload.php',
+ __DIR__ . '/../../../autoload.php',
+];
+
+foreach ($paths as $path) {
+ if (file_exists($path)) {
+ include $path;
+ break;
+ }
+}
+
+$dsn = $argv[1];
+$user = isset($argv[2]) ? $argv[2] : null;
+$pass = isset($argv[3]) ? $argv[3] : null;
+
+echo "Connecting to database: " . $dsn . "\n";
+
+$pdo = new PDO($dsn, $user, $pass);
+$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
+$pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
+
+$driver = $pdo->getAttribute(PDO::ATTR_DRIVER_NAME);
+
+switch ($driver) {
+
+ case 'mysql' :
+ echo "Detected MySQL.\n";
+ break;
+ case 'sqlite' :
+ echo "Detected SQLite.\n";
+ break;
+ default :
+ echo "Error: unsupported driver: " . $driver . "\n";
+ die(-1);
+}
+
+echo "Upgrading 'calendarobjects'\n";
+$addUid = false;
+try {
+ $result = $pdo->query('SELECT * FROM calendarobjects LIMIT 1');
+ $row = $result->fetch(\PDO::FETCH_ASSOC);
+
+ if (!$row) {
+ echo "No data in table. Going to try to add the uid field anyway.\n";
+ $addUid = true;
+ } elseif (array_key_exists('uid', $row)) {
+ echo "uid field exists. Assuming that this part of the migration has\n";
+ echo "Already been completed.\n";
+ } else {
+ echo "2.0 schema detected.\n";
+ $addUid = true;
+ }
+
+} catch (Exception $e) {
+ echo "Could not find a calendarobjects table. Skipping this part of the\n";
+ echo "upgrade.\n";
+}
+
+if ($addUid) {
+
+ switch ($driver) {
+ case 'mysql' :
+ $pdo->exec('ALTER TABLE calendarobjects ADD uid VARCHAR(200)');
+ break;
+ case 'sqlite' :
+ $pdo->exec('ALTER TABLE calendarobjects ADD uid TEXT');
+ break;
+ }
+
+ $result = $pdo->query('SELECT id, calendardata FROM calendarobjects');
+ $stmt = $pdo->prepare('UPDATE calendarobjects SET uid = ? WHERE id = ?');
+ $counter = 0;
+
+ while ($row = $result->fetch(\PDO::FETCH_ASSOC)) {
+
+ try {
+ $vobj = \Sabre\VObject\Reader::read($row['calendardata']);
+ } catch (\Exception $e) {
+ echo "Warning! Item with id $row[id] could not be parsed!\n";
+ continue;
+ }
+ $uid = null;
+ $item = $vobj->getBaseComponent();
+ if (!isset($item->UID)) {
+ echo "Warning! Item with id $item[id] does NOT have a UID property and this is required.\n";
+ continue;
+ }
+ $uid = (string)$item->UID;
+ $stmt->execute([$uid, $row['id']]);
+ $counter++;
+
+ }
+
+}
+
+echo "Creating 'schedulingobjects'\n";
+
+switch ($driver) {
+
+ case 'mysql' :
+ $pdo->exec('CREATE TABLE IF NOT EXISTS schedulingobjects
+(
+ id INT(11) UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
+ principaluri VARCHAR(255),
+ calendardata MEDIUMBLOB,
+ uri VARCHAR(200),
+ lastmodified INT(11) UNSIGNED,
+ etag VARCHAR(32),
+ size INT(11) UNSIGNED NOT NULL
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
+ ');
+ break;
+
+
+ case 'sqlite' :
+ $pdo->exec('CREATE TABLE IF NOT EXISTS schedulingobjects (
+ id integer primary key asc,
+ principaluri text,
+ calendardata blob,
+ uri text,
+ lastmodified integer,
+ etag text,
+ size integer
+)
+');
+ break;
+ $pdo->exec('
+ CREATE INDEX principaluri_uri ON calendarsubscriptions (principaluri, uri);
+ ');
+ break;
+}
+
+echo "Done.\n";
+
+echo "Upgrade to 2.1 schema completed.\n";
diff --git a/vendor/sabre/dav/bin/migrateto30.php b/vendor/sabre/dav/bin/migrateto30.php
new file mode 100755
index 000000000..9ca77c13c
--- /dev/null
+++ b/vendor/sabre/dav/bin/migrateto30.php
@@ -0,0 +1,171 @@
+#!/usr/bin/env php
+<?php
+
+echo "SabreDAV migrate script for version 3.0\n";
+
+if ($argc < 2) {
+
+ echo <<<HELLO
+
+This script help you migrate from a pre-3.0 database to 3.0 and later
+
+Changes:
+ * The propertystorage table has changed to allow storage of complex
+ properties.
+ * the vcardurl field in the principals table is no more. This was moved to
+ the propertystorage table.
+
+Keep in mind that ALTER TABLE commands will be executed. If you have a large
+dataset this may mean that this process takes a while.
+
+Lastly: Make a back-up first. This script has been tested, but the amount of
+potential variants are extremely high, so it's impossible to deal with every
+possible situation.
+
+In the worst case, you will lose all your data. This is not an overstatement.
+
+Usage:
+
+php {$argv[0]} [pdo-dsn] [username] [password]
+
+For example:
+
+php {$argv[0]} "mysql:host=localhost;dbname=sabredav" root password
+php {$argv[0]} sqlite:data/sabredav.db
+
+HELLO;
+
+ exit();
+
+}
+
+// There's a bunch of places where the autoloader could be, so we'll try all of
+// them.
+$paths = [
+ __DIR__ . '/../vendor/autoload.php',
+ __DIR__ . '/../../../autoload.php',
+];
+
+foreach ($paths as $path) {
+ if (file_exists($path)) {
+ include $path;
+ break;
+ }
+}
+
+$dsn = $argv[1];
+$user = isset($argv[2]) ? $argv[2] : null;
+$pass = isset($argv[3]) ? $argv[3] : null;
+
+echo "Connecting to database: " . $dsn . "\n";
+
+$pdo = new PDO($dsn, $user, $pass);
+$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
+$pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
+
+$driver = $pdo->getAttribute(PDO::ATTR_DRIVER_NAME);
+
+switch ($driver) {
+
+ case 'mysql' :
+ echo "Detected MySQL.\n";
+ break;
+ case 'sqlite' :
+ echo "Detected SQLite.\n";
+ break;
+ default :
+ echo "Error: unsupported driver: " . $driver . "\n";
+ die(-1);
+}
+
+echo "Upgrading 'propertystorage'\n";
+$addValueType = false;
+try {
+ $result = $pdo->query('SELECT * FROM propertystorage LIMIT 1');
+ $row = $result->fetch(\PDO::FETCH_ASSOC);
+
+ if (!$row) {
+ echo "No data in table. Going to re-create the table.\n";
+ $random = mt_rand(1000, 9999);
+ echo "Renaming propertystorage -> propertystorage_old$random and creating new table.\n";
+
+ switch ($driver) {
+
+ case 'mysql' :
+ $pdo->exec('RENAME TABLE propertystorage TO propertystorage_old' . $random);
+ $pdo->exec('
+ CREATE TABLE propertystorage (
+ id INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
+ path VARBINARY(1024) NOT NULL,
+ name VARBINARY(100) NOT NULL,
+ valuetype INT UNSIGNED,
+ value MEDIUMBLOB
+ );
+ ');
+ $pdo->exec('CREATE UNIQUE INDEX path_property_' . $random . ' ON propertystorage (path(600), name(100));');
+ break;
+ case 'sqlite' :
+ $pdo->exec('ALTER TABLE propertystorage RENAME TO propertystorage_old' . $random);
+ $pdo->exec('
+CREATE TABLE propertystorage (
+ id integer primary key asc,
+ path text,
+ name text,
+ valuetype integer,
+ value blob
+);');
+
+ $pdo->exec('CREATE UNIQUE INDEX path_property_' . $random . ' ON propertystorage (path, name);');
+ break;
+
+ }
+ } elseif (array_key_exists('valuetype', $row)) {
+ echo "valuetype field exists. Assuming that this part of the migration has\n";
+ echo "Already been completed.\n";
+ } else {
+ echo "2.1 schema detected. Going to perform upgrade.\n";
+ $addValueType = true;
+ }
+
+} catch (Exception $e) {
+ echo "Could not find a propertystorage table. Skipping this part of the\n";
+ echo "upgrade.\n";
+ echo $e->getMessage(), "\n";
+}
+
+if ($addValueType) {
+
+ switch ($driver) {
+ case 'mysql' :
+ $pdo->exec('ALTER TABLE propertystorage ADD valuetype INT UNSIGNED');
+ break;
+ case 'sqlite' :
+ $pdo->exec('ALTER TABLE propertystorage ADD valuetype INT');
+
+ break;
+ }
+
+ $pdo->exec('UPDATE propertystorage SET valuetype = 1 WHERE valuetype IS NULL ');
+
+}
+
+echo "Migrating vcardurl\n";
+
+$result = $pdo->query('SELECT id, uri, vcardurl FROM principals WHERE vcardurl IS NOT NULL');
+$stmt1 = $pdo->prepare('INSERT INTO propertystorage (path, name, valuetype, value) VALUES (?, ?, 3, ?)');
+
+while ($row = $result->fetch(\PDO::FETCH_ASSOC)) {
+
+ // Inserting the new record
+ $stmt1->execute([
+ 'addressbooks/' . basename($row['uri']),
+ '{http://calendarserver.org/ns/}me-card',
+ serialize(new Sabre\DAV\Xml\Property\Href($row['vcardurl']))
+ ]);
+
+ echo serialize(new Sabre\DAV\Xml\Property\Href($row['vcardurl']));
+
+}
+
+echo "Done.\n";
+echo "Upgrade to 3.0 schema completed.\n";
diff --git a/vendor/sabre/dav/bin/naturalselection.py b/vendor/sabre/dav/bin/naturalselection
index aa5554dd0..52720e31e 100755
--- a/vendor/sabre/dav/bin/naturalselection.py
+++ b/vendor/sabre/dav/bin/naturalselection
@@ -6,7 +6,7 @@
# http://www.rooftopsolutions.nl/
#
# This utility is distributed along with SabreDAV
-# license: http://code.google.com/p/sabredav/wiki/License Modified BSD License
+# license: http://sabre.io/license/ Modified BSD License
import os
from optparse import OptionParser
@@ -16,16 +16,16 @@ def getfreespace(path):
stat = os.statvfs(path)
return stat.f_frsize * stat.f_bavail
-def getbytesleft(path,treshold):
- return getfreespace(path)-treshold
+def getbytesleft(path,threshold):
+ return getfreespace(path)-threshold
-def run(cacheDir, treshold, sleep=5, simulate=False, min_erase = 0):
+def run(cacheDir, threshold, sleep=5, simulate=False, min_erase = 0):
- bytes = getbytesleft(cacheDir,treshold)
+ bytes = getbytesleft(cacheDir,threshold)
if (bytes>0):
- print "Bytes to go before we hit treshhold:", bytes
+ print "Bytes to go before we hit threshold:", bytes
else:
- print "Treshold exceeded with:", -bytes, "bytes"
+ print "Threshold exceeded with:", -bytes, "bytes"
dir = os.listdir(cacheDir)
dir2 = []
for file in dir:
@@ -46,7 +46,7 @@ def run(cacheDir, treshold, sleep=5, simulate=False, min_erase = 0):
left = min_erase
# If the min_erase setting is lower than the amount of bytes over
- # the treshold, we use that number instead.
+ # the threshold, we use that number instead.
if left < -bytes :
left = -bytes
@@ -72,8 +72,8 @@ def run(cacheDir, treshold, sleep=5, simulate=False, min_erase = 0):
def main():
parser = OptionParser(
- version="naturalselecton v0.3",
- description="Cache directory manager. Deletes cache entries based on accesstime and free space tresholds.\n" +
+ version="naturalselection v0.3",
+ description="Cache directory manager. Deletes cache entries based on accesstime and free space thresholds.\n" +
"This utility is distributed alongside SabreDAV.",
usage="usage: %prog [options] cacheDirectory",
)
@@ -98,15 +98,15 @@ def main():
default=5
)
parser.add_option(
- '-l','--treshold',
- help="Treshhold in bytes (default = 10737418240, which is 10GB)",
+ '-l','--threshold',
+ help="Threshold in bytes (default = 10737418240, which is 10GB)",
type="int",
- dest="treshold",
+ dest="threshold",
default=10737418240
)
parser.add_option(
'-m', '--min-erase',
- help="Minimum number of bytes to erase when the treshold is reached. " +
+ help="Minimum number of bytes to erase when the threshold is reached. " +
"Setting this option higher will reduce the amount of times the cache directory will need to be scanned. " +
"(the default is 1073741824, which is 1GB.)",
type="int",
@@ -130,7 +130,7 @@ def main():
cacheDir,
sleep=options.sleep,
simulate=options.simulate,
- treshold=options.treshold,
+ threshold=options.threshold,
min_erase=options.min_erase
)
if runs>0:
diff --git a/vendor/sabre/dav/bin/sabredav.php b/vendor/sabre/dav/bin/sabredav.php
index 34a674fd5..950075d1a 100755
--- a/vendor/sabre/dav/bin/sabredav.php
+++ b/vendor/sabre/dav/bin/sabredav.php
@@ -8,7 +8,7 @@ class CliLog {
function __construct() {
- $this->stream = fopen('php://stdout','w');
+ $this->stream = fopen('php://stdout', 'w');
}
@@ -20,19 +20,19 @@ class CliLog {
$log = new CliLog();
-if (php_sapi_name()!=='cli-server') {
+if (php_sapi_name() !== 'cli-server') {
die("This script is intended to run on the built-in php webserver");
}
// Finding composer
-$paths = array(
+$paths = [
__DIR__ . '/../vendor/autoload.php',
__DIR__ . '/../../../autoload.php',
-);
+];
-foreach($paths as $path) {
+foreach ($paths as $path) {
if (file_exists($path)) {
include $path;
break;