From 0b0b6f6021ba20189485ca26ccc4419a0bec6d24 Mon Sep 17 00:00:00 2001 From: Cyril Chapellier Date: Sun, 14 Jan 2024 16:36:20 +0100 Subject: [PATCH] Timezone: add the ability to change it easily (#100) --- .env | 2 ++ README.md | 22 ++++++++++++++++++ .../bad_timezone_configuration_env_var.png | Bin 0 -> 23281 bytes config/services.yaml | 1 + docker/.env | 2 ++ docker/Dockerfile | 3 --- docker/docker-compose-postgresql.yml | 1 + docker/docker-compose-sqlite.yml | 1 + docker/docker-compose.yml | 1 + src/Controller/Admin/DashboardController.php | 8 ++++++- src/Kernel.php | 14 +++++++++++ templates/dashboard.html.twig | 7 ++++-- translations/messages+intl-icu.en.xlf | 12 ++++++---- 13 files changed, 64 insertions(+), 10 deletions(-) create mode 100644 _screenshots/bad_timezone_configuration_env_var.png diff --git a/.env b/.env index 7209c02..971e669 100644 --- a/.env +++ b/.env @@ -20,6 +20,8 @@ APP_SECRET=630dc0d699fd37e720aff268f75583ed #TRUSTED_HOSTS='^localhost|example\.com$' ###< symfony/framework-bundle ### +APP_TIMEZONE="Europe/Paris" + ###> doctrine/doctrine-bundle ### DATABASE_DRIVER=mysql # or postgresql, or sqlite # Format described at https://www.doctrine-project.org/projects/doctrine-dbal/en/latest/reference/configuration.html#connecting-using-a-url diff --git a/README.md b/README.md index 8fce978..f7c214d 100644 --- a/README.md +++ b/README.md @@ -125,6 +125,20 @@ You can use an absolute file path here, and you can use Symfony's `%kernel.logs_ LOG_FILE_PATH="%kernel.logs_dir%/%kernel.environment%.log" ``` +h. The timezone you want for the app + +This must comply with the [official list](https://www.php.net/manual/en/timezones.php) + +``` +APP_TIMEZONE="Australia/Lord_Howe" +``` + +> Set a void value like so: +> ``` +> APP_TIMEZONE= +> ``` +> in your environment file if you wish to use the **actual default timezone of the server**, and not enforcing it. + ### Specific environment variables for IMAP and LDAP authentication methods In case you use the `IMAP` auth type, you must specify the auth url (_the "mailbox" url_) in `IMAP_AUTH_URL`. See https://www.php.net/manual/en/function.imap-open.php for more details. @@ -427,6 +441,14 @@ Depending on how you run Davis, logs are either: > > It's `./var/log` (relative to the Davis installation), not `/var/log` +### I have a "Bad timezone configuration env var" error on the dashboard + +If you see this: + +![Bad timezone configuration env var error](_screenshots/bad_timezone_configuration_env_var.png) + +It means that the value you set for the `APP_TIMEZONE` env var is not a correct timezone, as per [the official list](https://www.php.net/manual/en/timezones.php). Your timezone has thus not been set and is the server's default (Here, UTC). Adjust the setting accordingly. + ### I have a 500 and no tables have been created You probably forgot to run the migration once to create the necessary DB schema diff --git a/_screenshots/bad_timezone_configuration_env_var.png b/_screenshots/bad_timezone_configuration_env_var.png new file mode 100644 index 0000000000000000000000000000000000000000..1944d96b86e151f1e25b8d7e2cf0ea1e845c58b9 GIT binary patch literal 23281 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 z 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 literal 0 HcmV?d00001 diff --git a/config/services.yaml b/config/services.yaml index ab946fc..fbe5695 100644 --- a/config/services.yaml +++ b/config/services.yaml @@ -5,6 +5,7 @@ # https://symfony.com/doc/current/best_practices/configuration.html#application-related-configuration parameters: default_database_driver: "mysql" + timezone: '%env(APP_TIMEZONE)%' services: # default configuration for services in *this* file diff --git a/docker/.env b/docker/.env index 869949f..fb6d8f6 100644 --- a/docker/.env +++ b/docker/.env @@ -1,6 +1,8 @@ # For the MariaDB container mainly DB_ROOT_PASSWORD=notSoSecure +TIMEZONE="Europe/Paris" + # The Davis database, user and password DB_DATABASE=davis DB_USER=davis_user diff --git a/docker/Dockerfile b/docker/Dockerfile index 3c103aa..adf8f00 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -59,9 +59,6 @@ RUN apk --update --virtual build-deps-imap add --no-cache imap-dev openssl-dev k && apk del build-deps-imap \ && rm -rf /tmp/* -# Set timezone correctly -RUN echo 'date.timezone = "Europe/Paris"' > /usr/local/etc/php/conf.d/timezone.ini - # Davis installation ADD . /var/www/davis WORKDIR /var/www/davis diff --git a/docker/docker-compose-postgresql.yml b/docker/docker-compose-postgresql.yml index 7916a0a..c2359ee 100644 --- a/docker/docker-compose-postgresql.yml +++ b/docker/docker-compose-postgresql.yml @@ -50,6 +50,7 @@ services: - WEBDAV_TMP_DIR=${WEBDAV_TMP_DIR} - WEBDAV_PUBLIC_DIR=${WEBDAV_PUBLIC_DIR} - INVITE_FROM_ADDRESS=${INVITE_FROM_ADDRESS} + - APP_TIMEZONE=${TIMEZONE} depends_on: - postgresql volumes: diff --git a/docker/docker-compose-sqlite.yml b/docker/docker-compose-sqlite.yml index 7a23afc..911912d 100644 --- a/docker/docker-compose-sqlite.yml +++ b/docker/docker-compose-sqlite.yml @@ -40,6 +40,7 @@ services: - WEBDAV_TMP_DIR=${WEBDAV_TMP_DIR} - WEBDAV_PUBLIC_DIR=${WEBDAV_PUBLIC_DIR} - INVITE_FROM_ADDRESS=${INVITE_FROM_ADDRESS} + - APP_TIMEZONE=${TIMEZONE} volumes: - davis_www:/var/www/davis - davis_data:/data diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml index 9a5106a..27c9010 100644 --- a/docker/docker-compose.yml +++ b/docker/docker-compose.yml @@ -51,6 +51,7 @@ services: - WEBDAV_TMP_DIR=${WEBDAV_TMP_DIR} - WEBDAV_PUBLIC_DIR=${WEBDAV_PUBLIC_DIR} - INVITE_FROM_ADDRESS=${INVITE_FROM_ADDRESS} + - APP_TIMEZONE=${TIMEZONE} depends_on: - mysql volumes: diff --git a/src/Controller/Admin/DashboardController.php b/src/Controller/Admin/DashboardController.php index 8ea9056..0222b7f 100644 --- a/src/Controller/Admin/DashboardController.php +++ b/src/Controller/Admin/DashboardController.php @@ -24,13 +24,19 @@ class DashboardController extends AbstractController $events = $doctrine->getRepository(CalendarObject::class)->findAll(); $contacts = $doctrine->getRepository(Card::class)->findAll(); + $timezoneParameter = $this->getParameter('timezone'); + return $this->render('dashboard.html.twig', [ 'users' => $users, 'calendars' => $calendars, 'addressbooks' => $addressbooks, 'events' => $events, 'contacts' => $contacts, - 'timezone' => date_default_timezone_get(), + 'timezone' => [ + 'actual_default' => date_default_timezone_get(), + 'not_set_in_app' => '' === $timezoneParameter, + 'bad_value' => '' !== $timezoneParameter && !in_array($timezoneParameter, \DateTimeZone::listIdentifiers()), + ], 'version' => \App\Version::VERSION, 'sabredav_version' => \Sabre\DAV\Version::VERSION, ]); diff --git a/src/Kernel.php b/src/Kernel.php index b016861..0f43d2f 100644 --- a/src/Kernel.php +++ b/src/Kernel.php @@ -11,6 +11,20 @@ class Kernel extends BaseKernel { use MicroKernelTrait; + public function boot(): void + { + parent::boot(); + $timezone = $this->getContainer()->getParameter('timezone'); + if ('' === $timezone) { + return; + } + try { + date_default_timezone_set($timezone); + } catch (\Exception $e) { + // We don't crash the app, the setting will be flagged as incorrect in the dashboard + } + } + protected function configureContainer(ContainerConfigurator $container): void { $container->import('../config/{packages}/*.yaml'); diff --git a/templates/dashboard.html.twig b/templates/dashboard.html.twig index 737f48e..474b1b5 100644 --- a/templates/dashboard.html.twig +++ b/templates/dashboard.html.twig @@ -41,8 +41,11 @@
  • {{ "dashboard.version"|trans }} : {{ version }} (SabreDAV {{ sabredav_version }})
  • {{ "dashboard.auth"|trans }} : {{ authMethod }} ({{ "dashboard.auth_realm"|trans }}: {{ authRealm }})
  • {{ "dashboard.invite_from_address"|trans }} : {{ invite_from_address|default('Not set') }}
  • -
  • {{ "dashboard.server_timezone"|trans }} : {{ timezone }} {{ "dashboard.how_to_change_it"|trans }}
  • - +
  • + {{ "dashboard.server_timezone"|trans }} : {{ timezone.actual_default }} + {% if timezone.not_set_in_app %}{{ "dashboard.no_timezone_configuration"|trans }}{% endif %} + {% if timezone.bad_value %}{{ "dashboard.bad_timezone_configuration"|trans }}{% endif %} +
  • diff --git a/translations/messages+intl-icu.en.xlf b/translations/messages+intl-icu.en.xlf index a213b07..cd7cc38 100644 --- a/translations/messages+intl-icu.en.xlf +++ b/translations/messages+intl-icu.en.xlf @@ -119,11 +119,15 @@ dashboard.server_timezone - Server Timezone + App (PHP) Timezone - - dashboard.how_to_change_it - How to change it ? + + dashboard.bad_timezone_configuration + Bad timezone configuration env var + + + dashboard.no_timezone_configuration + Timezone not enforced by app dashboard.users