[Feature] Add per user home directories (#143)

This commit is contained in:
Cyril Chapellier 2024-03-29 22:49:02 +01:00 committed by GitHub
parent 7b50e1b384
commit 76ffce2969
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 27 additions and 5 deletions

6
.env
View File

@ -72,7 +72,11 @@ INVITE_FROM_ADDRESS=no-reply@example.org
# Make sure that these directories exist, with write permissions for your server. # Make sure that these directories exist, with write permissions for your server.
# USE ABSOLUTE PATHS for better predictability # USE ABSOLUTE PATHS for better predictability
WEBDAV_TMP_DIR='/tmp' WEBDAV_TMP_DIR='/tmp'
WEBDAV_PUBLIC_DIR='/webdav' WEBDAV_PUBLIC_DIR='/webdav/public'
# By default, home directories are disabled totally (env var set to an empty string).
# If needed, it is recommended to use a folder that is NOT a child of the public dir,
# such as /webdav/homes for instance, so that users cannot access other users' homes.
WEBDAV_HOMES_DIR=
# Logging path # Logging path
# By default, it will log in the standard Symfony directory: var/log/prod.log (for production) # By default, it will log in the standard Symfony directory: var/log/prod.log (for production)

View File

@ -118,9 +118,14 @@ f. The paths for the WebDAV installation
``` ```
WEBDAV_TMP_DIR='/tmp' WEBDAV_TMP_DIR='/tmp'
WEBDAV_PUBLIC_DIR='/webdav' WEBDAV_PUBLIC_DIR='/webdav/public'
WEBDAV_HOMES_DIR=
``` ```
> [!NOTE]
>
> By default, home directories are disabled totally (the env var is set to an empty string). If needed, it is recommended to use a folder that is **NOT** a child of the public dir, such as `/webdav/homes` for instance, so that users cannot access other users' homes.
g. The log file path g. The log file path
You can use an absolute file path here, and you can use Symfony's `%kernel.logs_dir%` and `%kernel.environment%` placeholders if needed (as in the default value). Setting it to `/dev/null` will disable logging altogether. You can use an absolute file path here, and you can use Symfony's `%kernel.logs_dir%` and `%kernel.environment%` placeholders if needed (as in the default value). Setting it to `/dev/null` will disable logging altogether.

View File

@ -51,8 +51,9 @@ services:
$inviteAddress: "%env(INVITE_FROM_ADDRESS)%" $inviteAddress: "%env(INVITE_FROM_ADDRESS)%"
$authMethod: "%env(AUTH_METHOD)%" $authMethod: "%env(AUTH_METHOD)%"
$authRealm: "%env(AUTH_REALM)%" $authRealm: "%env(AUTH_REALM)%"
$webdavPublicDir: "%env(WEBDAV_PUBLIC_DIR)%" $webdavPublicDir: "%env(resolve:WEBDAV_PUBLIC_DIR)%"
$webdavTmpDir: "%env(WEBDAV_TMP_DIR)%" $webdavHomesDir: "%env(resolve:WEBDAV_HOMES_DIR)%"
$webdavTmpDir: "%env(resolve:WEBDAV_TMP_DIR)%"
App\Security\LoginFormAuthenticator: App\Security\LoginFormAuthenticator:
arguments: arguments:

View File

@ -69,6 +69,13 @@ class DAVController extends AbstractController
*/ */
protected $webdavPublicDir; protected $webdavPublicDir;
/**
* WebDAV User Homes directory.
*
* @var string | null
*/
protected $webdavHomesDir;
/** /**
* WebDAV Temporary directory. * WebDAV Temporary directory.
* *
@ -128,7 +135,7 @@ class DAVController extends AbstractController
*/ */
protected $server; protected $server;
public function __construct(MailerInterface $mailer, BasicAuth $basicAuthBackend, IMAPAuth $IMAPAuthBackend, LDAPAuth $LDAPAuthBackend, UrlGeneratorInterface $router, EntityManagerInterface $entityManager, LoggerInterface $logger, string $publicDir, bool $calDAVEnabled = true, bool $cardDAVEnabled = true, bool $webDAVEnabled = false, string $inviteAddress = null, string $authMethod = null, string $authRealm = null, string $webdavPublicDir = null, string $webdavTmpDir = null) public function __construct(MailerInterface $mailer, BasicAuth $basicAuthBackend, IMAPAuth $IMAPAuthBackend, LDAPAuth $LDAPAuthBackend, UrlGeneratorInterface $router, EntityManagerInterface $entityManager, LoggerInterface $logger, string $publicDir, bool $calDAVEnabled = true, bool $cardDAVEnabled = true, bool $webDAVEnabled = false, string $inviteAddress = null, string $authMethod = null, string $authRealm = null, string $webdavPublicDir = null, string $webdavHomesDir = null, string $webdavTmpDir = null)
{ {
$this->publicDir = $publicDir; $this->publicDir = $publicDir;
@ -138,6 +145,7 @@ class DAVController extends AbstractController
$this->inviteAddress = $inviteAddress ?? null; $this->inviteAddress = $inviteAddress ?? null;
$this->webdavPublicDir = $webdavPublicDir; $this->webdavPublicDir = $webdavPublicDir;
$this->webdavHomesDir = $webdavHomesDir;
$this->webdavTmpDir = $webdavTmpDir; $this->webdavTmpDir = $webdavTmpDir;
$this->em = $entityManager; $this->em = $entityManager;
@ -209,6 +217,10 @@ class DAVController extends AbstractController
new \Sabre\CalDAV\Principal\Collection($principalBackend), new \Sabre\CalDAV\Principal\Collection($principalBackend),
]; ];
if ($this->webdavHomesDir) {
$nodes[] = new \Sabre\DAVACL\FS\HomeCollection($principalBackend, $this->webdavHomesDir);
}
if ($this->calDAVEnabled) { if ($this->calDAVEnabled) {
$calendarBackend = new \Sabre\CalDAV\Backend\PDO($pdo); $calendarBackend = new \Sabre\CalDAV\Backend\PDO($pdo);
$nodes[] = new \Sabre\CalDAV\CalendarRoot($principalBackend, $calendarBackend); $nodes[] = new \Sabre\CalDAV\CalendarRoot($principalBackend, $calendarBackend);