diff --git a/src/app/Backends/DAV.php b/src/app/Backends/DAV.php --- a/src/app/Backends/DAV.php +++ b/src/app/Backends/DAV.php @@ -314,6 +314,45 @@ return $response !== false; } + /** + * Initialize DAV folders (collections) + * + * @param \App\User $user User object + * @param array $folders Folders list (path, displayname, type, components) + * + * @return bool True on success, False on error + */ + public static function initDefaultFolders(\App\User $user, array $folders) + { + // FIXME: It looks like we'll need a way to authenticate the user, or cyrus admin + $dav = new self($email, $password); + + foreach ($folders as $props) { + $folder = new DAV\Folder(); + $folder->href = "addressbooks/user/{$user->email}/{$props['path']}"; + $folder->name = $props['displayname'] ?? ''; + $folder->types = ['collection', $props['type']]; + $folder->components = $props['components'] ?? []; + + // folder already exists? check the properties and update if needed + if ($existing = $dav->folderInfo($folder->href)) { + if ($existing->name != $folder->name || $existing->components != $folder->components) { + if (!$dav->folderUpdate($folder)) { + \Log::error("Failed to update DAV folder {$folder->href}"); + return false; + } + } + } + + if (!$dav->folderCreate($folder)) { + \Log::error("Failed to create DAV folder {$folder->href}"); + return false; + } + } + + return true; + } + /** * Search DAV objects in a folder. * diff --git a/src/app/Jobs/User/CreateJob.php b/src/app/Jobs/User/CreateJob.php --- a/src/app/Jobs/User/CreateJob.php +++ b/src/app/Jobs/User/CreateJob.php @@ -106,6 +106,13 @@ $user->status |= \App\User::STATUS_IMAP_READY; } + $folders = \config('services.dav.default_folders'); + if (count($folders)) { + if (!\App\Backends\DAV::initDefaultFolders($user, $folders)) { + throw new \Exception("Failed to initialize DAV folders for user {$this->userId}."); + } + } + // Make user active in non-mandate mode only if ( !($wallet = $user->wallet()) diff --git a/src/config/services.php b/src/config/services.php --- a/src/config/services.php +++ b/src/config/services.php @@ -1,5 +1,32 @@ 'Default', + 'displayname' => 'Calendar', + 'components' => ['VEVENT'], + 'type' => 'calendar', + ], + [ + 'path' => 'Tasks', + 'displayname' => 'Tasks', + 'components' => ['VTODO'], + 'type' => 'calendar', + ], + [ + // FIXME: Same here, should we use 'Contacts'? + 'path' => 'Default', + 'displayname' => 'Contacts', + 'type' => 'addressbook', + ], + ]; +} + return [ /* @@ -58,6 +85,7 @@ 'dav' => [ 'uri' => env('DAV_URI', 'https://proxy/'), + 'default_folders' => $dav_folders, ], 'activesync' => [