Page Menu
Home
Phorge
Search
Configure Global Search
Log In
Files
F117882121
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Flag For Later
Award Token
Authored By
Unknown
Size
101 KB
Referenced Files
None
Subscribers
None
View Options
diff --git a/docker-compose.yml b/docker-compose.yml
index 40e69af9..2fa88e70 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -1,244 +1,295 @@
version: '3'
services:
coturn:
build:
context: ./docker/coturn/
container_name: kolab-coturn
healthcheck:
interval: 10s
test: "kill -0 $$(cat /tmp/turnserver.pid)"
timeout: 5s
retries: 30
environment:
- TURN_PUBLIC_IP=${COTURN_PUBLIC_IP}
- TURN_LISTEN_PORT=3478
- TURN_STATIC_SECRET=${COTURN_STATIC_SECRET}
hostname: sturn.mgmt.com
image: kolab-coturn
network_mode: host
restart: on-failure
tty: true
kolab:
build:
context: ./docker/kolab/
args:
DB_KOLAB_DATABASE: kolab
DB_KOLAB_USERNAME: kolab
DB_KOLAB_PASSWORD: ${DB_PASSWORD:?"DB_PASSWORD is missing"}
container_name: kolab
privileged: true
depends_on:
mariadb:
condition: service_healthy
pdns:
condition: service_healthy
extra_hosts:
- "kolab.mgmt.com:127.0.0.1"
- "services.${APP_DOMAIN}:172.18.0.4"
environment:
- APP_DOMAIN=${APP_DOMAIN}
- LDAP_HOST=127.0.0.1
- LDAP_ADMIN_BIND_DN=${LDAP_ADMIN_BIND_DN}
- LDAP_ADMIN_BIND_PW=${LDAP_ADMIN_BIND_PW}
- LDAP_SERVICE_BIND_PW=${LDAP_SERVICE_BIND_PW}
- LDAP_HOSTED_BIND_PW=${LDAP_HOSTED_BIND_PW}
- DB_HOST=mariadb
- DB_ROOT_PASSWORD=${DB_ROOT_PASSWORD}
- DB_HKCCP_DATABASE=${DB_DATABASE}
- DB_HKCCP_USERNAME=${DB_USERNAME}
- DB_HKCCP_PASSWORD=${DB_PASSWORD:?"DB_PASSWORD is missing"}
- DB_KOLAB_DATABASE=kolab
- DB_KOLAB_USERNAME=kolab
- DB_KOLAB_PASSWORD=${DB_PASSWORD:?"DB_PASSWORD is missing"}
- - DB_RC_USERNAME=roundcube
- - DB_RC_PASSWORD=${DB_PASSWORD:?"DB_PASSWORD is missing"}
- SSL_CERTIFICATE=${KOLAB_SSL_CERTIFICATE:?"KOLAB_SSL_CERTIFICATE is missing"}
- SSL_CERTIFICATE_FULLCHAIN=${KOLAB_SSL_CERTIFICATE_FULLCHAIN:?"KOLAB_SSL_CERTIFICATE_FULLCHAIN is missing"}
- SSL_CERTIFICATE_KEY=${KOLAB_SSL_CERTIFICATE_KEY:?"KOLAB_SSL_CERTIFICATE_KEY is missing"}
- IMAP_HOST=127.0.0.1
- IMAP_PORT=11993
- IMAP_ADMIN_LOGIN=${IMAP_ADMIN_LOGIN}
- IMAP_ADMIN_PASSWORD=${IMAP_ADMIN_PASSWORD}
- MAIL_HOST=127.0.0.1
- MAIL_PORT=10587
healthcheck:
interval: 10s
test: "systemctl is-active kolab-init || exit 1"
timeout: 5s
retries: 30
start_period: 5m
# This makes docker's dns, resolve via pdns for this container.
# Please note it does not affect /etc/resolv.conf
dns: 172.18.0.11
hostname: kolab.mgmt.com
image: kolab
networks:
kolab:
ipv4_address: 172.18.0.5
ports:
- "12143:12143"
tmpfs:
- /run
- /tmp
- /var/run
- /var/tmp
tty: true
volumes:
- ./ext/:/src/:ro
- /etc/letsencrypt/:/etc/letsencrypt/:ro
- ./docker/certs/ca.cert:/etc/pki/tls/certs/ca.cert:ro
- ./docker/certs/ca.cert:/etc/pki/ca-trust/source/anchors/ca.cert:ro
- ./docker/certs/kolab.hosted.com.cert:${KOLAB_SSL_CERTIFICATE:?err}
- ./docker/certs/kolab.hosted.com.chain.pem:${KOLAB_SSL_CERTIFICATE_FULLCHAIN:?err}
- ./docker/certs/kolab.hosted.com.key:${KOLAB_SSL_CERTIFICATE_KEY:?err}
- ./docker/kolab/utils:/root/utils:ro
- /sys/fs/cgroup:/sys/fs/cgroup:ro
- imap:/imapdata
- ldap:/ldapdata
+ roundcube:
+ build:
+ context: ./docker/roundcube/
+ container_name: roundcube
+ hostname: roundcube.hosted.com
+ depends_on:
+ mariadb:
+ condition: service_healthy
+ pdns:
+ condition: service_healthy
+ kolab:
+ condition: service_healthy
+ environment:
+ - APP_DOMAIN=${APP_DOMAIN}
+ - LDAP_HOST=kolab
+ - LDAP_ADMIN_BIND_DN=${LDAP_ADMIN_BIND_DN}
+ - LDAP_ADMIN_BIND_PW=${LDAP_ADMIN_BIND_PW}
+ - LDAP_SERVICE_BIND_PW=${LDAP_SERVICE_BIND_PW}
+ - LDAP_HOSTED_BIND_PW=${LDAP_HOSTED_BIND_PW}
+ - DB_HOST=mariadb
+ - DB_ROOT_PASSWORD=${DB_ROOT_PASSWORD}
+ - DB_RC_DATABASE=roundcube
+ - DB_RC_USERNAME=roundcube
+ - DB_RC_PASSWORD=${DB_PASSWORD:?"DB_PASSWORD is missing"}
+ - IMAP_HOST=tls://haproxy
+ - IMAP_PORT=145
+ - IMAP_ADMIN_LOGIN=${IMAP_ADMIN_LOGIN}
+ - IMAP_ADMIN_PASSWORD=${IMAP_ADMIN_PASSWORD}
+ - MAIL_HOST=tls://kolab
+ - MAIL_PORT=10587
+ healthcheck:
+ interval: 10s
+ test: "kill -0 $$(cat /run/httpd/httpd.pid)"
+ timeout: 5s
+ retries: 30
+ # This makes docker's dns, resolve via pdns for this container.
+ # Please note it does not affect /etc/resolv.conf
+ dns: 172.18.0.11
+ image: roundcube
+ networks:
+ kolab:
+ ipv4_address: 172.18.0.9
+ ports:
+ - "8001:80"
+ tmpfs:
+ - /run
+ - /tmp
+ - /var/run
+ - /var/tmp
+ volumes:
+ - ./ext/:/src.orig/:ro
mariadb:
container_name: kolab-mariadb
environment:
- MARIADB_ROOT_PASSWORD=${DB_ROOT_PASSWORD}
- TZ="+02:00"
- DB_HKCCP_DATABASE=${DB_DATABASE}
- DB_HKCCP_USERNAME=${DB_USERNAME}
- DB_HKCCP_PASSWORD=${DB_PASSWORD}
healthcheck:
interval: 10s
test: test -e /var/run/mysqld/mysqld.sock
timeout: 5s
retries: 30
image: mariadb:latest
networks:
- kolab
volumes:
- ./docker/mariadb/mysql-init/:/docker-entrypoint-initdb.d/
- mariadb:/var/lib/mysql
haproxy:
build:
context: ./docker/haproxy/
healthcheck:
interval: 10s
test: "kill -0 $$(cat /var/run/haproxy.pid)"
timeout: 5s
retries: 30
container_name: kolab-haproxy
hostname: haproxy.hosted.com
image: kolab-haproxy
networks:
- kolab
tmpfs:
- /run
- /tmp
- /var/run
- /var/tmp
tty: true
volumes:
- ./docker/certs/:/etc/certs/:ro
- /etc/letsencrypt/:/etc/letsencrypt/:ro
pdns:
build:
context: ./docker/pdns/
args:
DB_HOST: mariadb
DB_DATABASE: ${DB_DATABASE:?DB_DATABASE}
DB_USERNAME: ${DB_USERNAME:?DB_USERNAME}
DB_PASSWORD: ${DB_PASSWORD:?DB_PASSWORD}
container_name: kolab-pdns
hostname: pdns
depends_on:
mariadb:
condition: service_healthy
healthcheck:
interval: 10s
test: "systemctl status pdns || exit 1"
timeout: 5s
retries: 30
image: kolab-pdns
networks:
kolab:
ipv4_address: 172.18.0.11
tmpfs:
- /run
- /tmp
- /var/run
- /var/tmp
tty: true
volumes:
- /sys/fs/cgroup:/sys/fs/cgroup:ro
redis:
build:
context: ./docker/redis/
healthcheck:
interval: 10s
test: "redis-cli ping || exit 1"
timeout: 5s
retries: 30
container_name: kolab-redis
hostname: redis
image: redis
networks:
- kolab
volumes:
- ./docker/redis/redis.conf:/usr/local/etc/redis/redis.conf:ro
webapp:
build:
context: ./docker/webapp/
container_name: kolab-webapp
image: kolab-webapp
healthcheck:
interval: 10s
test: "/src/kolabsrc/artisan octane:status || exit 1"
timeout: 5s
retries: 30
start_period: 5m
depends_on:
kolab:
condition: service_healthy
redis:
condition: service_healthy
+ roundcube:
+ condition: service_healthy
networks:
kolab:
ipv4_address: 172.18.0.4
volumes:
- ./src:/src/kolabsrc.orig:ro
ports:
- "8000:8000"
meet:
build:
context: ./docker/meet/
healthcheck:
interval: 10s
test: "curl --insecure -H 'X-AUTH-TOKEN: ${MEET_SERVER_TOKEN}' --fail https://${MEET_LISTENING_HOST}:12443/meetmedia/api/health || exit 1"
timeout: 5s
retries: 30
start_period: 5m
environment:
- WEBRTC_LISTEN_IP=${MEET_WEBRTC_LISTEN_IP:?err}
- PUBLIC_DOMAIN=${MEET_PUBLIC_DOMAIN:?err}
- LISTENING_HOST=${MEET_LISTENING_HOST:?err}
- LISTENING_PORT=12443
- TURN_SERVER=${MEET_TURN_SERVER}
- TURN_STATIC_SECRET=${COTURN_STATIC_SECRET}
- AUTH_TOKEN=${MEET_SERVER_TOKEN:?err}
- WEBHOOK_TOKEN=${MEET_WEBHOOK_TOKEN:?err}
- WEBHOOK_URL=${APP_PUBLIC_URL:?err}/api/webhooks/meet
- SSL_CERT=/etc/pki/tls/certs/meet.${APP_WEBSITE_DOMAIN:?err}.cert
- SSL_KEY=/etc/pki/tls/private/meet.${APP_WEBSITE_DOMAIN:?err}.key
network_mode: host
container_name: kolab-meet
image: kolab-meet
volumes:
- ./meet/server:/src/meet/:ro
- ./docker/certs/meet.${APP_WEBSITE_DOMAIN}.cert:/etc/pki/tls/certs/meet.${APP_WEBSITE_DOMAIN}.cert
- ./docker/certs/meet.${APP_WEBSITE_DOMAIN}.key:/etc/pki/tls/private/meet.${APP_WEBSITE_DOMAIN}.key
networks:
kolab:
driver: bridge
ipam:
config:
- subnet: "172.18.0.0/24"
volumes:
mariadb:
imap:
ldap:
diff --git a/docker/roundcube/Dockerfile b/docker/roundcube/Dockerfile
new file mode 100644
index 00000000..a229c9d1
--- /dev/null
+++ b/docker/roundcube/Dockerfile
@@ -0,0 +1,79 @@
+FROM quay.io/centos/centos:stream9
+
+MAINTAINER Christian Mollekopf <mollekopf@apheleia-it.ch>
+
+ENV HOME=/opt/app-root/src
+
+LABEL io.k8s.description="Platform for serving PHP roundcube applications" \
+ io.k8s.display-name="Roundcube" \
+ io.openshift.expose-services="80:http" \
+ io.openshift.tags="builder,php,apache"
+
+#FIXME switch to centos9 because we need the php extensions for libkolabxml and libkolab
+RUN dnf -y update
+
+# Add EPEL.
+RUN dnf -y install 'dnf-command(config-manager)' && \
+ dnf config-manager --set-enabled crb && \
+ dnf -y install \
+ epel-release epel-next-release && \
+ dnf clean all
+
+# Add the EPEL key.
+RUN rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-9
+
+
+# Add kolab
+RUN rpm --import https://mirror.apheleia-it.ch/repos/Kolab:/16/key.asc && \
+ rpm -Uvh https://mirror.apheleia-it.ch/repos/Kolab:/16/kolab-16-for-el9stream.rpm
+
+# Install php modules
+RUN sed -i -e '/^ssl/d' /etc/yum.repos.d/kolab*.repo && \
+ dnf config-manager --enable kolab-16-testing &&\
+ dnf -y --setopt tsflags= install php-kolab php-kolabformat &&\
+ dnf clean all
+
+RUN dnf -y install \
+ composer \
+ diffutils \
+ file \
+ git \
+ make \
+ unzip \
+ curl-minimal \
+ mariadb \
+ which \
+ rsync \
+ openssl-devel \
+ httpd \
+ patch \
+ php-cli \
+ php-common \
+ php-devel \
+ php-ldap \
+ php-opcache \
+ php-pecl-apcu \
+ php-mysqlnd \
+ php-gd \
+ php-fpm \
+ php-pear \
+ ImageMagick \
+ re2c \
+ npm \
+ wget && \
+ dnf clean all
+
+
+RUN npm install -g less less-plugin-clean-css
+
+WORKDIR ${HOME}
+
+COPY /rootfs /
+RUN /opt/app-root/src/build.sh
+
+EXPOSE 80
+
+# https://httpd.apache.org/docs/2.4/stopping.html#gracefulstop
+STOPSIGNAL SIGWINCH
+
+CMD [ "/opt/app-root/src/init.sh" ]
diff --git a/docker/roundcube/rootfs/etc/httpd/conf.d/chwala.conf b/docker/roundcube/rootfs/etc/httpd/conf.d/chwala.conf
new file mode 100644
index 00000000..2ef5d6ae
--- /dev/null
+++ b/docker/roundcube/rootfs/etc/httpd/conf.d/chwala.conf
@@ -0,0 +1,33 @@
+Alias /chwala /opt/app-root/src/chwala/public_html
+
+<Directory "/opt/app-root/src/chwala/public_html/">
+ AllowOverride None
+
+# php_flag session.auto_start Off
+# php_flag display_errors Off
+# php_flag log_errors On
+# php_flag suhosin.session.encrypt Off
+# php_value error_log /var/log/chwala/errors
+
+ <IfModule mod_authz_core.c>
+ # Apache 2.4
+ Require all granted
+ </IfModule>
+ <IfModule !mod_authz_core.c>
+ # Apache 2.2
+ Order Allow,Deny
+ Allow from All
+ </IfModule>
+
+ <IfModule mod_rewrite.c>
+ RewriteEngine on
+ # NOTE: This needs to point to the base uri of your installation.
+ RewriteBase /chwala/
+
+ # Rewrite document URLs of the form api/document/:id to api/index.php?method=document&id=:id
+ RewriteCond %{REQUEST_FILENAME} !-f
+ RewriteCond %{REQUEST_FILENAME} !-d
+ RewriteRule ^api/document/(.*)$ api/index.php?method=document&id=$1 [L,QSA]
+ RewriteRule ^api/wopi/(.*)$ api/index.php?wopi=1&method=$1 [L,QSA]
+ </IfModule>
+</Directory>
diff --git a/docker/roundcube/rootfs/etc/httpd/conf.d/freebusy.conf b/docker/roundcube/rootfs/etc/httpd/conf.d/freebusy.conf
new file mode 100644
index 00000000..abf30797
--- /dev/null
+++ b/docker/roundcube/rootfs/etc/httpd/conf.d/freebusy.conf
@@ -0,0 +1,13 @@
+ScriptAlias /freebusy /opt/app-root/src/freebusy/public_html/index.php
+
+<Directory "/opt/app-root/src/freebusy/public_html/">
+ AllowOverride All
+
+ <ifModule mod_authz_core.c>
+ Require all granted
+ </ifModule>
+ <ifModule !mod_authz_core.c>
+ Order Allow,Deny
+ Allow from All
+ </ifModule>
+</Directory>
diff --git a/docker/roundcube/rootfs/etc/httpd/conf.d/iRony.conf b/docker/roundcube/rootfs/etc/httpd/conf.d/iRony.conf
new file mode 100644
index 00000000..25e9183a
--- /dev/null
+++ b/docker/roundcube/rootfs/etc/httpd/conf.d/iRony.conf
@@ -0,0 +1,25 @@
+Alias /iRony /opt/app-root/src/iRony/public_html
+
+<Directory "/opt/app-root/src/iRony/public_html/">
+ AllowOverride All
+
+ <IfModule mod_authz_core.c>
+ # Apache 2.4
+ Require all granted
+ </IfModule>
+ <IfModule !mod_authz_core.c>
+ # Apache 2.2
+ Order Allow,Deny
+ Allow from All
+ </IfModule>
+
+ RewriteEngine On
+ RewriteBase /iRony/
+ RewriteRule ^\.well-known/caldav / [R,L]
+ RewriteRule ^\.well-known/carddav / [R,L]
+
+ RewriteCond %{REQUEST_FILENAME} !-f
+ RewriteCond %{REQUEST_FILENAME} !-d
+ RewriteRule (.*) index.php [qsappend,last]
+
+</Directory>
diff --git a/docker/roundcube/rootfs/etc/httpd/conf.d/kolab-autoconf.conf b/docker/roundcube/rootfs/etc/httpd/conf.d/kolab-autoconf.conf
new file mode 100644
index 00000000..abf32a2b
--- /dev/null
+++ b/docker/roundcube/rootfs/etc/httpd/conf.d/kolab-autoconf.conf
@@ -0,0 +1,19 @@
+# for https://domain.tld (and https://autodiscover.domain.tld)
+Alias /autodiscover/autodiscover.xml /opt/app-root/src/autoconf/public_html/index.php
+Alias /Autodiscover/Autodiscover.xml /opt/app-root/src/autoconf/public_html/index.php
+Alias /AutoDiscover/AutoDiscover.xml /opt/app-root/src/autoconf/public_html/index.php
+# for http://autoconfig.domain.tld
+Alias /mail/config-v1.1.xml /opt/app-root/src/autoconf/public_html/index.php
+# for http://domain.tld
+Alias /.well-known/autoconfig/mail/config-v1.1.xml /opt/app-root/src/autoconf/public_html/index.php
+
+<Directory "/opt/app-root/src/autoconf/public_html">
+ AllowOverride None
+ <ifModule mod_authz_core.c>
+ Require all granted
+ </ifModule>
+ <ifModule !mod_authz_core.c>
+ Order Allow,Deny
+ Allow from All
+ </ifModule>
+</Directory>
diff --git a/docker/roundcube/rootfs/etc/httpd/conf.d/kolab-syncroton.conf b/docker/roundcube/rootfs/etc/httpd/conf.d/kolab-syncroton.conf
new file mode 100644
index 00000000..11e95fda
--- /dev/null
+++ b/docker/roundcube/rootfs/etc/httpd/conf.d/kolab-syncroton.conf
@@ -0,0 +1,44 @@
+ScriptAlias /Microsoft-Server-ActiveSync /opt/app-root/src/syncroton/index.php
+
+<Directory "/opt/app-root/src/syncroton/">
+ AllowOverride All
+ <ifModule mod_authz_core.c>
+ Require all granted
+ </ifModule>
+ <ifModule !mod_authz_core.c>
+ Order Allow,Deny
+ Allow from All
+ </ifModule>
+</Directory>
+
+<Directory "/opt/app-root/src/syncroton/config/">
+ Options -FollowSymLinks
+ <ifModule mod_authz_core.c>
+ Require all denied
+ </ifModule>
+ <ifModule !mod_authz_core.c>
+ Order Deny,Allow
+ Deny from All
+ </ifModule>
+</Directory>
+
+<Directory "/opt/app-root/src/syncroton/lib/">
+ <ifModule mod_authz_core.c>
+ Require all denied
+ </ifModule>
+ <ifModule !mod_authz_core.c>
+ Order Deny,Allow
+ Deny from All
+ </ifModule>
+</Directory>
+
+<Directory "/opt/app-root/src/syncroton/logs/">
+ Options -FollowSymLinks
+ <ifModule mod_authz_core.c>
+ Require all denied
+ </ifModule>
+ <ifModule !mod_authz_core.c>
+ Order Deny,Allow
+ Deny from All
+ </ifModule>
+</Directory>
diff --git a/docker/roundcube/rootfs/etc/httpd/conf.d/roundcubemail.conf b/docker/roundcube/rootfs/etc/httpd/conf.d/roundcubemail.conf
new file mode 100644
index 00000000..ec5b8e36
--- /dev/null
+++ b/docker/roundcube/rootfs/etc/httpd/conf.d/roundcubemail.conf
@@ -0,0 +1,30 @@
+Alias /roundcubemail /opt/app-root/src/roundcubemail/public_html/
+Alias /webmail /opt/app-root/src/roundcubemail/public_html/
+
+<LocationMatch "/assets/">
+ <IfModule mod_deflate.c>
+ SetEnv no-gzip
+ </IfModule>
+ <IfModule mod_expires.c>
+ ExpiresActive On
+ ExpiresDefault "access plus 1 month"
+ </IfModule>
+</LocationMatch>
+
+<Directory "/opt/app-root/src/roundcubemail/public_html">
+ Options +FollowSymLinks
+ AllowOverride None
+
+ <ifModule mod_rewrite.c>
+ RewriteEngine On
+ RewriteCond %{REQUEST_URI} ^/(roundcubemail|webmail)
+ RewriteRule ^[a-zA-Z0-9]{16}/(.*) /%1/$1 [PT,L]
+ </ifModule>
+ <ifModule mod_authz_core.c>
+ Require all granted
+ </ifModule>
+ <ifModule !mod_authz_core.c>
+ Order Allow,Deny
+ Allow from All
+ </ifModule>
+</Directory>
diff --git a/docker/roundcube/rootfs/etc/httpd/conf/httpd.conf b/docker/roundcube/rootfs/etc/httpd/conf/httpd.conf
new file mode 100644
index 00000000..be4e3b53
--- /dev/null
+++ b/docker/roundcube/rootfs/etc/httpd/conf/httpd.conf
@@ -0,0 +1,358 @@
+#
+# This is the main Apache HTTP server configuration file. It contains the
+# configuration directives that give the server its instructions.
+# See <URL:http://httpd.apache.org/docs/2.4/> for detailed information.
+# In particular, see
+# <URL:http://httpd.apache.org/docs/2.4/mod/directives.html>
+# for a discussion of each configuration directive.
+#
+# See the httpd.conf(5) man page for more information on this configuration,
+# and httpd.service(8) on using and configuring the httpd service.
+#
+# Do NOT simply read the instructions in here without understanding
+# what they do. They're here only as hints or reminders. If you are unsure
+# consult the online docs. You have been warned.
+#
+# Configuration and logfile names: If the filenames you specify for many
+# of the server's control files begin with "/" (or "drive:/" for Win32), the
+# server will use that explicit path. If the filenames do *not* begin
+# with "/", the value of ServerRoot is prepended -- so 'log/access_log'
+# with ServerRoot set to '/www' will be interpreted by the
+# server as '/www/log/access_log', where as '/log/access_log' will be
+# interpreted as '/log/access_log'.
+
+#
+# ServerRoot: The top of the directory tree under which the server's
+# configuration, error, and log files are kept.
+#
+# Do not add a slash at the end of the directory path. If you point
+# ServerRoot at a non-local disk, be sure to specify a local disk on the
+# Mutex directive, if file-based mutexes are used. If you wish to share the
+# same ServerRoot for multiple httpd daemons, you will need to change at
+# least PidFile.
+#
+ServerRoot "/etc/httpd"
+
+#
+# Listen: Allows you to bind Apache to specific IP addresses and/or
+# ports, instead of the default. See also the <VirtualHost>
+# directive.
+#
+# Change this to Listen on a specific IP address, but note that if
+# httpd.service is enabled to run at boot time, the address may not be
+# available when the service starts. See the httpd.service(8) man
+# page for more information.
+#
+#Listen 12.34.56.78:80
+Listen 80
+
+#
+# Dynamic Shared Object (DSO) Support
+#
+# To be able to use the functionality of a module which was built as a DSO you
+# have to place corresponding `LoadModule' lines at this location so the
+# directives contained in it are actually available _before_ they are used.
+# Statically compiled modules (those listed by `httpd -l') do not need
+# to be loaded here.
+#
+# Example:
+# LoadModule foo_module modules/mod_foo.so
+#
+Include conf.modules.d/*.conf
+
+#
+# If you wish httpd to run as a different user or group, you must run
+# httpd as root initially and it will switch.
+#
+# User/Group: The name (or #number) of the user/group to run httpd as.
+# It is usually good practice to create a dedicated user and group for
+# running httpd, as with most system services.
+#
+User apache
+Group apache
+
+# 'Main' server configuration
+#
+# The directives in this section set up the values used by the 'main'
+# server, which responds to any requests that aren't handled by a
+# <VirtualHost> definition. These values also provide defaults for
+# any <VirtualHost> containers you may define later in the file.
+#
+# All of these directives may appear inside <VirtualHost> containers,
+# in which case these default settings will be overridden for the
+# virtual host being defined.
+#
+
+#
+# ServerAdmin: Your address, where problems with the server should be
+# e-mailed. This address appears on some server-generated pages, such
+# as error documents. e.g. admin@your-domain.com
+#
+ServerAdmin root@localhost
+
+#
+# ServerName gives the name and port that the server uses to identify itself.
+# This can often be determined automatically, but we recommend you specify
+# it explicitly to prevent problems during startup.
+#
+# If your host doesn't have a registered DNS name, enter its IP address here.
+#
+#ServerName www.example.com:80
+
+#
+# Deny access to the entirety of your server's filesystem. You must
+# explicitly permit access to web content directories in other
+# <Directory> blocks below.
+#
+<Directory />
+ AllowOverride none
+ Require all denied
+</Directory>
+
+#
+# Note that from this point forward you must specifically allow
+# particular features to be enabled - so if something's not working as
+# you might expect, make sure that you have specifically enabled it
+# below.
+#
+
+#
+# DocumentRoot: The directory out of which you will serve your
+# documents. By default, all requests are taken from this directory, but
+# symbolic links and aliases may be used to point to other locations.
+#
+DocumentRoot "/var/www/html"
+
+#
+# Relax access to content within /var/www.
+#
+<Directory "/var/www">
+ AllowOverride None
+ # Allow open access:
+ Require all granted
+</Directory>
+
+# Further relax access to the default document root:
+<Directory "/var/www/html">
+ #
+ # Possible values for the Options directive are "None", "All",
+ # or any combination of:
+ # Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews
+ #
+ # Note that "MultiViews" must be named *explicitly* --- "Options All"
+ # doesn't give it to you.
+ #
+ # The Options directive is both complicated and important. Please see
+ # http://httpd.apache.org/docs/2.4/mod/core.html#options
+ # for more information.
+ #
+ Options Indexes FollowSymLinks
+
+ #
+ # AllowOverride controls what directives may be placed in .htaccess files.
+ # It can be "All", "None", or any combination of the keywords:
+ # Options FileInfo AuthConfig Limit
+ #
+ AllowOverride None
+
+ #
+ # Controls who can get stuff from this server.
+ #
+ Require all granted
+</Directory>
+
+#
+# DirectoryIndex: sets the file that Apache will serve if a directory
+# is requested.
+#
+<IfModule dir_module>
+ DirectoryIndex index.html
+</IfModule>
+
+#
+# The following lines prevent .htaccess and .htpasswd files from being
+# viewed by Web clients.
+#
+<Files ".ht*">
+ Require all denied
+</Files>
+
+#
+# ErrorLog: The location of the error log file.
+# If you do not specify an ErrorLog directive within a <VirtualHost>
+# container, error messages relating to that virtual host will be
+# logged here. If you *do* define an error logfile for a <VirtualHost>
+# container, that host's errors will be logged there and not here.
+#
+ErrorLog "logs/error_log"
+
+#
+# LogLevel: Control the number of messages logged to the error_log.
+# Possible values include: debug, info, notice, warn, error, crit,
+# alert, emerg.
+#
+LogLevel warn
+
+<IfModule log_config_module>
+ #
+ # The following directives define some format nicknames for use with
+ # a CustomLog directive (see below).
+ #
+ LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
+ LogFormat "%h %l %u %t \"%r\" %>s %b" common
+
+ <IfModule logio_module>
+ # You need to enable mod_logio.c to use %I and %O
+ LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio
+ </IfModule>
+
+ #
+ # The location and format of the access logfile (Common Logfile Format).
+ # If you do not define any access logfiles within a <VirtualHost>
+ # container, they will be logged here. Contrariwise, if you *do*
+ # define per-<VirtualHost> access logfiles, transactions will be
+ # logged therein and *not* in this file.
+ #
+ #CustomLog "logs/access_log" common
+
+ #
+ # If you prefer a logfile with access, agent, and referer information
+ # (Combined Logfile Format) you can use the following directive.
+ #
+ CustomLog "logs/access_log" combined
+</IfModule>
+
+<IfModule alias_module>
+ #
+ # Redirect: Allows you to tell clients about documents that used to
+ # exist in your server's namespace, but do not anymore. The client
+ # will make a new request for the document at its new location.
+ # Example:
+ # Redirect permanent /foo http://www.example.com/bar
+
+ #
+ # Alias: Maps web paths into filesystem paths and is used to
+ # access content that does not live under the DocumentRoot.
+ # Example:
+ # Alias /webpath /full/filesystem/path
+ #
+ # If you include a trailing / on /webpath then the server will
+ # require it to be present in the URL. You will also likely
+ # need to provide a <Directory> section to allow access to
+ # the filesystem path.
+
+ #
+ # ScriptAlias: This controls which directories contain server scripts.
+ # ScriptAliases are essentially the same as Aliases, except that
+ # documents in the target directory are treated as applications and
+ # run by the server when requested rather than as documents sent to the
+ # client. The same rules about trailing "/" apply to ScriptAlias
+ # directives as to Alias.
+ #
+ ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"
+
+</IfModule>
+
+#
+# "/var/www/cgi-bin" should be changed to whatever your ScriptAliased
+# CGI directory exists, if you have that configured.
+#
+<Directory "/var/www/cgi-bin">
+ AllowOverride None
+ Options None
+ Require all granted
+</Directory>
+
+<IfModule mime_module>
+ #
+ # TypesConfig points to the file containing the list of mappings from
+ # filename extension to MIME-type.
+ #
+ TypesConfig /etc/mime.types
+
+ #
+ # AddType allows you to add to or override the MIME configuration
+ # file specified in TypesConfig for specific file types.
+ #
+ #AddType application/x-gzip .tgz
+ #
+ # AddEncoding allows you to have certain browsers uncompress
+ # information on the fly. Note: Not all browsers support this.
+ #
+ #AddEncoding x-compress .Z
+ #AddEncoding x-gzip .gz .tgz
+ #
+ # If the AddEncoding directives above are commented-out, then you
+ # probably should define those extensions to indicate media types:
+ #
+ AddType application/x-compress .Z
+ AddType application/x-gzip .gz .tgz
+
+ #
+ # AddHandler allows you to map certain file extensions to "handlers":
+ # actions unrelated to filetype. These can be either built into the server
+ # or added with the Action directive (see below)
+ #
+ # To use CGI scripts outside of ScriptAliased directories:
+ # (You will also need to add "ExecCGI" to the "Options" directive.)
+ #
+ #AddHandler cgi-script .cgi
+
+ # For type maps (negotiated resources):
+ #AddHandler type-map var
+
+ #
+ # Filters allow you to process content before it is sent to the client.
+ #
+ # To parse .shtml files for server-side includes (SSI):
+ # (You will also need to add "Includes" to the "Options" directive.)
+ #
+ AddType text/html .shtml
+ AddOutputFilter INCLUDES .shtml
+</IfModule>
+
+#
+# Specify a default charset for all content served; this enables
+# interpretation of all content as UTF-8 by default. To use the
+# default browser choice (ISO-8859-1), or to allow the META tags
+# in HTML content to override this choice, comment out this
+# directive:
+#
+AddDefaultCharset UTF-8
+
+<IfModule mime_magic_module>
+ #
+ # The mod_mime_magic module allows the server to use various hints from the
+ # contents of the file itself to determine its type. The MIMEMagicFile
+ # directive tells the module where the hint definitions are located.
+ #
+ MIMEMagicFile conf/magic
+</IfModule>
+
+#
+# Customizable error responses come in three flavors:
+# 1) plain text 2) local redirects 3) external redirects
+#
+# Some examples:
+#ErrorDocument 500 "The server made a boo boo."
+#ErrorDocument 404 /missing.html
+#ErrorDocument 404 "/cgi-bin/missing_handler.pl"
+#ErrorDocument 402 http://www.example.com/subscription_info.html
+#
+
+#
+# EnableMMAP and EnableSendfile: On systems that support it,
+# memory-mapping or the sendfile syscall may be used to deliver
+# files. This usually improves server performance, but must
+# be turned off when serving from networked-mounted
+# filesystems or if support for these functions is otherwise
+# broken on your system.
+# Defaults if commented: EnableMMAP On, EnableSendfile Off
+#
+#EnableMMAP off
+EnableSendfile on
+
+# Supplemental configuration
+#
+# Load config files in the "/etc/httpd/conf.d" directory, if any.
+IncludeOptional conf.d/*.conf
diff --git a/docker/roundcube/rootfs/etc/kolab/kolab.conf b/docker/roundcube/rootfs/etc/kolab/kolab.conf
new file mode 100644
index 00000000..f9010e1c
--- /dev/null
+++ b/docker/roundcube/rootfs/etc/kolab/kolab.conf
@@ -0,0 +1,21 @@
+[autodiscover]
+activesync = %d
+imap = ssl://%d:993
+smtp = ssl://%d:465
+
+; LDAP attribute used as login
+login_attribute = mail
+
+; optional service name
+service_name = Kolab Groupware
+service_short = Kolab
+
+; enables HTTP/LDAP debugging
+;debug_mode = trace
+
+[ldap]
+service_bind_dn = uid=kolab-service,ou=Special Users,dc=example,dc=org
+service_bind_pw = Welcome2KolabSystems
+domain_name_attribute = associateddomain
+domain_filter = (&(associatedDomain=*))
+domain_base_dn = cn=kolab,cn=config
diff --git a/docker/roundcube/rootfs/etc/roundcubemail/acl.inc.php b/docker/roundcube/rootfs/etc/roundcubemail/acl.inc.php
new file mode 100644
index 00000000..e6a6a017
--- /dev/null
+++ b/docker/roundcube/rootfs/etc/roundcubemail/acl.inc.php
@@ -0,0 +1,14 @@
+<?php
+ $config['acl_advanced_mode'] = false;
+ $config['acl_users_source'] = 'kolab_addressbook';
+ $config['acl_users_field'] = 'mail';
+ $config['acl_users_filter'] = 'objectClass=inetorgperson';
+
+ $config['acl_groups'] = true;
+ $config['acl_group_prefix'] = 'group:';
+
+ if (file_exists(RCUBE_CONFIG_DIR . '/' . $_SERVER["HTTP_HOST"] . '/' . basename(__FILE__))) {
+ include_once(RCUBE_CONFIG_DIR . '/' . $_SERVER["HTTP_HOST"] . '/' . basename(__FILE__));
+ }
+
+?>
diff --git a/docker/roundcube/rootfs/etc/roundcubemail/calendar.inc.php b/docker/roundcube/rootfs/etc/roundcubemail/calendar.inc.php
new file mode 100644
index 00000000..1a97b475
--- /dev/null
+++ b/docker/roundcube/rootfs/etc/roundcubemail/calendar.inc.php
@@ -0,0 +1,73 @@
+<?php
+ $config['calendar_driver'] = "kolab";
+ $config['calendar_default_view'] = "agendaWeek";
+ $config['calendar_timeslots'] = 2;
+ $config['calendar_first_day'] = 1;
+ $config['calendar_first_hour'] = 6;
+ $config['calendar_work_start'] = 6;
+ $config['calendar_work_end'] = 18;
+ $config['calendar_event_coloring'] = 0;
+ $config['calendar_caldav_url'] = 'http://%h/iRony/calendars/%u/%i';
+
+ $config['calendar_itip_smtp_server'] = '';
+ $config['calendar_itip_smtp_user'] = '';
+ $config['calendar_itip_smtp_pass'] = '';
+
+ $config['calendar_itip_send_option'] = 3;
+ $config['calendar_itip_after_action'] = 0;
+
+ $config['calendar_freebusy_trigger'] = false;
+
+ $config['kolab_invitation_calendars'] = true;
+
+ $config['calendar_contact_birthdays'] = true;
+
+ $config['calendar_resources_driver'] = 'ldap';
+
+ $config['calendar_resources_directory'] = array(
+ 'name' => 'Kolab Resources',
+ 'hosts' => getenv('LDAP_HOST'),
+ 'port' => 389,
+ 'use_tls' => false,
+ 'base_dn' => 'dc=hosted,dc=com',
+ 'user_specific' => true,
+ 'bind_dn' => '%dn',
+ 'bind_pass' => '',
+ 'search_base_dn' => 'dc=hosted,dc=com',
+ 'search_bind_dn' => 'uid=kolab-service,ou=Special Users,dc=mgmt,dc=com',
+ 'search_bind_pw' => getenv('LDAP_SERVICE_BIND_PW'),
+ 'search_filter' => '(&(objectClass=inetorgperson)(mail=%fu))',
+ 'ldap_version' => 3,
+ 'filter' => '(|(|(objectclass=groupofuniquenames)(objectclass=groupofurls))(objectclass=kolabsharedfolder))',
+ 'search_fields' => array('cn'),
+ 'sort' => array('cn'),
+ 'scope' => 'sub',
+ 'fuzzy_search' => true,
+ 'fieldmap' => array(
+ // Internal => LDAP
+ 'name' => 'cn',
+ 'email' => 'mail',
+ 'owner' => 'owner',
+ 'description' => 'description',
+ 'attributes' => 'kolabdescattribute',
+ 'members' => 'uniquemember',
+ // these mappings are required for owner display
+ 'phone' => 'telephoneNumber',
+ 'mobile' => 'mobile',
+ ),
+
+ 'class_type_map' => array(
+ 'kolabsharedfolder' => 'resource',
+ 'groupofuniquenames' => 'collection',
+ ),
+
+ 'groups' => array(
+ 'name_attr' => 'cn',
+ ),
+ );
+
+ if (file_exists(RCUBE_CONFIG_DIR . '/' . ($_SERVER["HTTP_HOST"] ?? null) . '/' . basename(__FILE__))) {
+ include_once(RCUBE_CONFIG_DIR . '/' . ($_SERVER["HTTP_HOST"] ?? null) . '/' . basename(__FILE__));
+ }
+
+?>
diff --git a/docker/roundcube/rootfs/etc/roundcubemail/config.inc.php b/docker/roundcube/rootfs/etc/roundcubemail/config.inc.php
new file mode 100644
index 00000000..00116be4
--- /dev/null
+++ b/docker/roundcube/rootfs/etc/roundcubemail/config.inc.php
@@ -0,0 +1,255 @@
+<?php
+ $config = array();
+
+ $dbUsername = getenv('DB_RC_USERNAME');
+ $dbPass = getenv('DB_RC_PASSWORD');
+ $dbDatabase = getenv('DB_RC_DATABASE');
+ $dbHost = getenv('DB_HOST');
+ $config['db_dsnw'] = "mysql://$dbUsername:$dbPass@$dbHost/$dbDatabase";
+
+ $config['session_domain'] = '';
+ $config['des_key'] = "wgtmEUSH9KOZC9rK8Qa5A6r4";
+ $config['username_domain'] = 'kolab.org';
+ $config['use_secure_urls'] = true;
+
+ $config['mail_domain'] = '';
+
+ // IMAP Server Settings
+ $config['default_host'] = getenv('IMAP_HOST');
+ $config['default_port'] = getenv('IMAP_PORT');
+ $config['imap_delimiter'] = '/';
+ $config['imap_force_lsub'] = true;
+
+ // IMAP Connection TLS settings, adjust for Production
+ // Required for PHP >= 5.6
+ $config['imap_conn_options'] = [
+ 'ssl' => [
+ 'verify_peer_name' => false,
+ 'verify_peer' => false,
+ 'allow_self_signed' => true
+ ],
+ 'proxy_protocol' => 2
+ ];
+ $config['proxy_whitelist'] = ['127.0.0.1', '172.18.0.7'];
+
+ // Caching and storage settings
+ $config['imap_cache'] = 'db';
+ $config['imap_cache_ttl'] = '10d';
+ $config['messages_cache'] = 'db';
+ $config['message_cache_ttl'] = '10d';
+ $config['session_storage'] = 'db';
+
+ // SMTP Server Settings
+ $config['smtp_server'] = getenv('MAIL_HOST');
+ $config['smtp_port'] = getenv('MAIL_PORT');
+ $config['smtp_user'] = '%u';
+ $config['smtp_pass'] = '%p';
+ $config['smtp_helo_host'] = $_SERVER["HTTP_HOST"] ?? null;
+
+ // SMTP Connection TLS settings, adjust for Production
+ // Required for PHP >= 5.6
+ $config['smtp_conn_options'] = Array(
+ 'ssl' => Array(
+ 'verify_peer_name' => false,
+ 'verify_peer' => false,
+ 'allow_self_signed' => true
+ )
+ );
+
+ // LDAP Settings
+ $config['ldap_cache'] = 'db';
+ $config['ldap_cache_ttl'] = '1h';
+
+ // Kolab specific defaults
+ $config['product_name'] = 'Kolab Groupware';
+ $config['quota_zero_as_unlimited'] = false;
+ $config['login_lc'] = 2;
+ $config['auto_create_user'] = true;
+ $config['enable_installer'] = false;
+ // The SMTP server does not allow empty identities
+ $config['mdn_use_from'] = true;
+
+ // Plugins
+ $config['plugins'] = array(
+ 'kolab_auth',
+ 'acl',
+ 'archive',
+ 'calendar',
+ 'jqueryui',
+ 'kolab_activesync',
+ 'kolab_addressbook',
+ 'kolab_config',
+ 'kolab_delegation',
+ 'kolab_files',
+ 'kolab_folders',
+ 'kolab_notes',
+ 'kolab_tags',
+ 'managesieve',
+ 'newmail_notifier',
+ 'odfviewer',
+ 'password',
+ 'redundant_attachments',
+ 'tasklist',
+ // contextmenu must be after kolab_addressbook (#444)
+ 'contextmenu',
+'enigma',
+ );
+
+
+ // Do not show deleted messages, mark deleted messages as read,
+ // and flag them as deleted instead of moving them to the Trash
+ // folder.
+ $config['skip_deleted'] = true;
+ $config['read_when_deleted'] = true;
+ $config['flag_for_deletion'] = true;
+ $config['delete_always'] = true;
+
+ $config['session_lifetime'] = 180;
+ $config['password_charset'] = 'UTF-8';
+ $config['useragent'] = 'Kolab 16/Roundcube ' . RCUBE_VERSION;
+
+ $config['message_sort_col'] = 'date';
+
+ $config['spellcheck_engine'] = 'pspell';
+ $config['spellcheck_dictionary'] = true;
+ $config['spellcheck_ignore_caps'] = true;
+ $config['spellcheck_ignore_nums'] = true;
+ $config['spellcheck_ignore_syms'] = true;
+ $config['spellcheck_languages'] = array(
+ 'da' => 'Dansk',
+ 'de' => 'Deutsch',
+ 'en' => 'English',
+ 'es' => 'Español',
+ 'fr' => 'Français',
+ 'it' => 'Italiano',
+ 'nl' => 'Nederlands',
+ 'pt' => 'Português',
+ 'ru' => 'Русский',
+ 'sv' => 'Svenska'
+ );
+
+ $config['undo_timeout'] = 10;
+ $config['upload_progress'] = 2;
+ $config['address_template'] = '{street}<br/>{locality} {zipcode}<br/>{country} {region}';
+ $config['preview_pane'] = true;
+ $config['preview_pane_mark_read'] = 0;
+
+ $config['autoexpand_threads'] = 2;
+ $config['top_posting'] = 0;
+ $config['sig_above'] = false;
+ $config['mdn_requests'] = 0;
+ $config['mdn_default'] = false;
+ $config['dsn_default'] = false;
+ $config['reply_same_folder'] = false;
+
+ if (file_exists(RCUBE_CONFIG_DIR . '/' . ($_SERVER["HTTP_HOST"] ?? null) . '/' . basename(__FILE__))) {
+ include_once(RCUBE_CONFIG_DIR . '/' . ($_SERVER["HTTP_HOST"] ?? null) . '/' . basename(__FILE__));
+ }
+
+ // Re-apply mandatory settings here.
+
+ $config['debug_level'] = 1;
+ $config['devel_mode'] = false;
+ $config['log_driver'] = 'file';
+ $config['log_date_format'] = 'd-M-Y H:i:s,u O';
+ $config['syslog_id'] = 'roundcube';
+ $config['syslog_facility'] = LOG_USER;
+ $config['smtp_log'] = false;
+ $config['log_logins'] = true;
+ $config['log_session'] = false;
+ $config['sql_debug'] = false;
+ $config['memcache_debug'] = false;
+ $config['imap_debug'] = false;
+ $config['ldap_debug'] = false;
+ $config['smtp_debug'] = false;
+
+ $config['skin'] = 'kolab';
+ $config['skin_include_php'] = false;
+ $config['mime_magic'] = null;
+ $config['im_identify_path'] = '/usr/bin/identify';
+ $config['im_convert_path'] = '/usr/bin/convert';
+ $config['log_dir'] = 'logs/';
+ #$config['temp_dir'] = '/var/lib/roundcubemail/';
+
+ // Some additional default folders (archive plugin)
+ $config['archive_mbox'] = 'Archive';
+ // The Kolab daemon by default creates 'Spam'
+ $config['junk_mbox'] = 'Spam';
+ $config['default_folders'] = array('INBOX', 'Drafts', 'Sent', 'Spam', 'Trash', 'Archive');
+
+ $config['address_book_type'] = 'ldap';
+ $config['autocomplete_min_length'] = 3;
+ $config['autocomplete_threads'] = 0;
+ $config['autocomplete_max'] = 15;
+ $config['ldap_public'] = array(
+ 'kolab_addressbook' => array(
+ 'name' => 'Global Address Book',
+ 'hosts' => Array(getenv('LDAP_HOST')),
+ 'port' => 389,
+ 'use_tls' => false,
+ 'base_dn' => 'dc=hosted,dc=com',
+ 'user_specific' => true,
+ 'bind_dn' => '%dn',
+ 'bind_pass' => '',
+ 'search_base_dn' => 'dc=hosted,dc=com',
+ 'search_bind_dn' => 'uid=kolab-service,ou=Special Users,dc=mgmt,dc=com',
+ 'search_bind_pw' => getenv('LDAP_SERVICE_BIND_PW'),
+ 'search_filter' => '(&(objectClass=inetorgperson)(mail=%fu))',
+ 'writable' => false,
+ 'LDAP_Object_Classes' => array("top", "inetorgperson"),
+ 'required_fields' => array("cn", "sn", "mail"),
+ 'LDAP_rdn' => 'uid',
+ 'ldap_version' => 3, // using LDAPv3
+ 'search_fields' => array('displayname', 'mail'),
+ 'sort' => array('displayname', 'sn', 'givenname', 'cn'),
+ 'scope' => 'sub',
+ 'filter' => '(objectClass=inetorgperson)',
+ 'vlv' => true,
+ 'vlv_search' => true,
+ 'fuzzy_search' => true,
+ 'sizelimit' => '0',
+ 'timelimit' => '0',
+ 'fieldmap' => Array(
+ // Roundcube => LDAP
+ 'name' => 'displayName',
+ 'surname' => 'sn',
+ 'firstname' => 'givenName',
+ 'middlename' => 'initials',
+ 'email:primary' => 'mail',
+ 'email:alias' => 'alias',
+ 'email:personal' => 'mailalternateaddress',
+ 'phone:main' => 'telephoneNumber',
+ 'phone:work' => 'alternateTelephoneNumber',
+ 'phone:mobile' => 'mobile',
+ 'phone:work2' => 'blackberry',
+ 'jobtitle' => 'title',
+ 'manager' => 'manager',
+ 'assistant' => 'secretary',
+ 'photo' => 'jpegphoto'
+ ),
+ 'groups' => Array(
+ 'base_dn' => 'dc=hosted,dc=com',
+ 'filter' => '(&' . '(|(objectclass=groupofuniquenames)(objectclass=groupofurls))' . '(mail=*))',
+ 'object_classes' => Array("top", "groupOfUniqueNames"),
+ 'member_attr' => 'uniqueMember',
+ ),
+ ),
+ );
+
+ $config['autocomplete_addressbooks'] = Array(
+ 'kolab_addressbook'
+ );
+
+ $config['autocomplete_single'] = true;
+
+ $config['htmleditor'] = 0;
+
+ $config['kolab_http_request'] = Array(
+ 'ssl_verify_host' => false,
+ 'ssl_verify_peer' => false,
+ );
+
+ @include('kolab_syncroton.inc.php');
+
+
+?>
diff --git a/docker/roundcube/rootfs/etc/roundcubemail/dav.inc.php b/docker/roundcube/rootfs/etc/roundcubemail/dav.inc.php
new file mode 100644
index 00000000..257c1ec7
--- /dev/null
+++ b/docker/roundcube/rootfs/etc/roundcubemail/dav.inc.php
@@ -0,0 +1,160 @@
+<?php
+
+/*
+ +-------------------------------------------------------------------------+
+ | Configuration for the Kolab DAV server |
+ | |
+ | Copyright (C) 2013, Kolab Systems AG |
+ | |
+ | This program is free software: you can redistribute it and/or modify |
+ | it under the terms of the GNU Affero General Public License as |
+ | published by the Free Software Foundation, either version 3 of the |
+ | License, or (at your option) any later version. |
+ | |
+ | This program is distributed in the hope that it will be useful, |
+ | but WITHOUT ANY WARRANTY; without even the implied warranty of |
+ | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
+ | GNU Affero General Public License for more details. |
+ | |
+ | You should have received a copy of the GNU Affero General Public License|
+ | along with this program. If not, see <http://www.gnu.org/licenses/>. |
+ | |
+ +-------------------------------------------------------------------------+
+*/
+
+$config = array();
+
+// The HTTP path to the iRony root directory.
+// Set to / if the service is registered as document root for a virtual host
+$config['base_uri'] = '/iRony/';
+
+// User agent string written to kolab storage MIME messages
+$config['useragent'] = 'Kolab DAV Server libkolab/' . RCUBE_VERSION;
+
+// Type of Auth cache. Supported values: 'db', 'apc' and 'memcache'.
+// Note: This is only for username canonification map.
+$config['kolabdav_auth_cache'] = 'db';
+
+// lifetime of the Auth cache, possible units: s, m, h, d, w
+$config['kolabdav_auth_cache_ttl'] = '1h';
+
+// enable debug console showing the internal function calls triggered
+// by http requests. This will write log to /var/log/iRony/console
+$config['kolabdav_console'] = false;
+
+// enable logging of full HTTP payload
+// (bitmask of these values: 2 = HTTP Requests, 4 = HTTP Responses)
+$config['kolabdav_http_log'] = 0;
+
+// expose iTip invitations from email inbox in CalDAV scheduling inbox.
+// this will make capable CalDAV clients process event invitations and
+// as a result, the invitation messages are removed from the email inbox.
+// WARNING: this feature is still experimental and not fully implemented.
+// See https://git.kolab.org/T93 for details and implementation status.
+$config['kolabdav_caldav_inbox'] = false;
+
+// Enables the CardDAV Directory Gateway Extension by exposing an
+// LDAP-based address book in the pricipals address book collection.
+// Properties of this option are the same as for $config['ldap_public'] entries.
+// NOTE: Mapping of (additional) 'uid' and 'changed' fields is required!
+/*
+$config['kolabdav_ldap_directory'] = array(
+ 'name' => 'Global Address Book',
+ 'hosts' => 'localhost',
+ 'port' => 389,
+ 'use_tls' => false,
+ // If true the base_dn, bind_dn and bind_pass default to the user's credentials.
+ 'user_specific' => false,
+ // It's possible to bind with the current user's credentials for individual address books.
+ // The login name is used to search for the DN to bind with
+ 'search_base_dn' => 'ou=People,dc=example,dc=org',
+ 'search_bind_dn' => 'uid=kolab-service,ou=Special Users,dc=example,dc=org',
+ 'search_bind_pw' => 'Welcome2KolabSystems',
+ 'search_filter' => '(&(objectClass=inetOrgPerson)(mail=%fu))',
+ // When 'user_specific' is enabled following variables can be used in base_dn/bind_dn config:
+ // %fu - The full username provided, assumes the username is an email
+ // address, uses the username_domain value if not an email address.
+ // %u - The username prior to the '@'.
+ // %d - The domain name after the '@'.
+ // %dc - The domain name hierarchal string e.g. "dc=test,dc=domain,dc=com"
+ // %dn - DN found by ldap search when search_filter/search_base_dn are used
+ 'base_dn' => 'ou=People,dc=example,dc=org',
+ 'bind_dn' => 'uid=kolab-service,ou=Special Users,dc=example,dc=org',
+ 'bind_pass' => 'Welcome2KolabSystems',
+ 'ldap_version' => 3,
+ 'filter' => '(objectClass=inetOrgPerson)',
+ 'search_fields' => array('displayname', 'mail'),
+ 'sort' => array('displayname', 'sn', 'givenname', 'cn'),
+ 'scope' => 'sub',
+ 'searchonly' => true, // Set to false to enable listing
+ 'sizelimit' => '1000',
+ 'timelimit' => '0',
+ 'fieldmap' => array(
+ // Roundcube => LDAP
+ 'name' => 'displayName',
+ 'surname' => 'sn',
+ 'firstname' => 'givenName',
+ 'middlename' => 'initials',
+ 'prefix' => 'title',
+ 'email:work' => 'mail',
+ 'email:other' => 'alias',
+ 'phone:main' => 'telephoneNumber',
+ 'phone:work' => 'alternateTelephoneNumber',
+ 'phone:mobile' => 'mobile',
+ 'phone:work2' => 'blackberry',
+ 'street' => 'street',
+ 'zipcode' => 'postalCode',
+ 'locality' => 'l',
+ 'organization' => 'o',
+ 'jobtitle' => 'title',
+ 'photo' => 'jpegphoto',
+ // required for internal handling and caching
+ 'uid' => 'nsuniqueid',
+ 'changed' => 'modifytimestamp',
+ ),
+);
+
+// Expose all resources as an LDAP-based address book in the pricipals address book collection.
+// This enables Non-Kolab-Clients to add resources to an event.
+// Properties of this option are the same as for $config['kolabdav_ldap_directory'] entries.
+$config['kolabdav_ldap_resources'] = array(
+ 'name' => 'Global Resources',
+ 'hosts' => 'localhost',
+ 'port' => 389,
+ 'use_tls' => false,
+ 'user_specific' => false,
+ 'search_base_dn' => 'ou=People,dc=example,dc=org',
+ 'search_bind_dn' => 'uid=kolab-service,ou=Special Users,dc=example,dc=org',
+ 'search_bind_pw' => 'Welcome2KolabSystems',
+ 'search_filter' => '(&(objectClass=inetOrgPerson)(mail=%fu))',
+ 'base_dn' => 'ou=Resources,dc=example,dc=org',
+ 'bind_dn' => 'uid=kolab-service,ou=Special Users,dc=example,dc=org',
+ 'bind_pass' => 'Welcome2KolabSystems',
+ 'ldap_version' => 3,
+ 'filter' => '(|(objectclass=groupofuniquenames)(objectclass=groupofurls)(objectclass=kolabsharedfolder))',
+ 'search_fields' => array('displayname', 'mail'),
+ 'sort' => array('displayname', 'sn', 'givenname', 'cn'),
+ 'scope' => 'sub',
+ 'searchonly' => false, // Set to false to enable listing
+ 'sizelimit' => '1000',
+ 'timelimit' => '0',
+ 'fieldmap' => array(
+ // Internal => LDAP
+ 'name' => 'cn',
+ 'email' => 'mail',
+ 'owner' => 'owner',
+ 'description' => 'description',
+ 'attributes' => 'kolabdescattribute',
+ 'members' => 'uniquemember',
+ // these mappings are required for owner display
+ 'phone' => 'telephoneNumber',
+ 'mobile' => 'mobile',
+ ),
+);
+
+*/
+
+// Enable caching for LDAP directory data.
+// This is recommended with 'searchonly' => false to speed-up sychronization of multiple clients
+// $config['kolabdav_ldap_cache'] = 'memcache';
+// $config['kolabdav_ldap_cache_ttl'] = 600; // in seconds
diff --git a/docker/roundcube/rootfs/etc/roundcubemail/kolab_activesync.inc.php b/docker/roundcube/rootfs/etc/roundcubemail/kolab_activesync.inc.php
new file mode 100644
index 00000000..20011256
--- /dev/null
+++ b/docker/roundcube/rootfs/etc/roundcubemail/kolab_activesync.inc.php
@@ -0,0 +1,7 @@
+<?php
+
+// The page with Activesync clients configuration manual
+$config['activesync_setup_url'] = 'https://kb.kolabenterprise.com/documentation/setting-up-an-activesync-client';
+// Force a subscription state per devicetype (lowercase) and folder
+// States can be: 0 => not subscribed, 1 => subscribed, 2 => subscribed with alarm
+$config['activesync_force_subscriptions'] = array('windowsoutlook15' => array('INBOX' => 1, 'Sent' => 1, 'Trash' => 1, 'Calendar' => 1, 'Contacts' => 1, 'Tasks' => 1));
diff --git a/docker/roundcube/rootfs/etc/roundcubemail/kolab_addressbook.inc.php b/docker/roundcube/rootfs/etc/roundcubemail/kolab_addressbook.inc.php
new file mode 100644
index 00000000..0f6b8ab6
--- /dev/null
+++ b/docker/roundcube/rootfs/etc/roundcubemail/kolab_addressbook.inc.php
@@ -0,0 +1,20 @@
+<?php
+
+
+// This option allows to set addressbooks priority or to disable some
+// of them. Disabled addressbooks will be not shown in the UI. Default: 0.
+// 0 - "Global address book(s) first". Use all address books, starting with the global (LDAP)
+// 1 - "Personal address book(s) first". Use all address books, starting with the personal (Kolab)
+// 2 - "Global address book(s) only". Use the global (LDAP) addressbook. Disable the personal.
+// 3 - "Personal address book(s) only". Use the personal (Kolab) addressbook(s). Disable the global.
+$config['kolab_addressbook_prio'] = 0;
+
+// Base URL to build fully qualified URIs to access address books via CardDAV
+// The following replacement variables are supported:
+// %h - Current HTTP host
+// %u - Current webmail user name
+// %n - Folder name
+// %i - Folder UUID
+$config['kolab_addressbook_carddav_url'] = 'http://%h/iRony/addressbooks/%u/%i';
+
+?>
diff --git a/docker/roundcube/rootfs/etc/roundcubemail/kolab_auth.inc.php b/docker/roundcube/rootfs/etc/roundcubemail/kolab_auth.inc.php
new file mode 100644
index 00000000..013267c7
--- /dev/null
+++ b/docker/roundcube/rootfs/etc/roundcubemail/kolab_auth.inc.php
@@ -0,0 +1,70 @@
+<?php
+
+ // The id of the LDAP address book (which refers to the rcmail_config['ldap_public'])
+ // or complete addressbook definition array.
+ $config['kolab_auth_addressbook'] = Array(
+ 'name' => 'Kolab Auth',
+ 'hosts' => Array(getenv('LDAP_HOST')),
+ 'port' => 389,
+ 'use_tls' => false,
+ 'user_specific' => true,
+ 'base_dn' => 'dc=hosted,dc=com',
+ 'bind_dn' => 'uid=kolab-service,ou=Special Users,dc=mgmt,dc=com',
+ 'bind_pass' => getenv('LDAP_SERVICE_BIND_PW'),
+ 'writable' => false,
+ 'ldap_version' => 3, // using LDAPv3
+ 'fieldmap' => Array(
+ 'name' => 'displayname',
+ 'email' => 'mail',
+ 'email:alias' => 'alias',
+ 'role' => 'nsroledn',
+ ),
+ 'sort' => 'displayname',
+ 'scope' => 'sub',
+ 'filter' => '(objectClass=*)',
+ 'fuzzy_search' => true,
+ 'sizelimit' => '0',
+ 'timelimit' => '0',
+ 'groups' => Array(
+ 'base_dn' => 'dc=hosted,dc=com',
+ 'filter' => '(|(objectclass=groupofuniquenames)(objectclass=groupofurls))',
+ 'object_classes' => Array('top', 'groupOfUniqueNames'),
+ 'member_attr' => 'uniqueMember',
+ ),
+ );
+
+
+ // This will overwrite defined filter
+ $config['kolab_auth_filter'] = '(&' . '(objectclass=inetorgperson)' . '(|(uid=%u)(mail=%fu)(alias=%fu)))';
+
+ // Use this fields (from fieldmap configuration) to get authentication ID
+ $config['kolab_auth_login'] = 'email';
+
+ // Use this fields (from fieldmap configuration) for default identity
+ $config['kolab_auth_name'] = 'name';
+ $config['kolab_auth_alias'] = 'alias';
+ $config['kolab_auth_email'] = 'email';
+
+ if (preg_match('/\/helpdesk-login\//', $_SERVER["REQUEST_URI"] ?? null) ) {
+
+ // Login and password of the admin user. Enables "Login As" feature.
+ $config['kolab_auth_admin_login'] = getenv('IMAP_ADMIN_LOGIN');
+ $config['kolab_auth_admin_password'] = getenv('IMAP_ADMIN_PASSWORD');
+
+ $config['kolab_auth_auditlog'] = true;
+ }
+
+ // Administrative role field (from fieldmap configuration) which must be filled with
+ // specified value which adds privilege to login as another user.
+ $config['kolab_auth_role'] = 'role';
+ $config['kolab_auth_role_value'] = 'cn=kolab-admin,dc=mgmt,dc=com';
+
+ // Administrative group name to which user must be assigned to
+ // which adds privilege to login as another user.
+ $config['kolab_auth_group'] = 'Kolab Helpdesk';
+
+ if (file_exists(RCUBE_CONFIG_DIR . '/' . ($_SERVER["HTTP_HOST"] ?? null) . '/' . basename(__FILE__))) {
+ include_once(RCUBE_CONFIG_DIR . '/' . ($_SERVER["HTTP_HOST"] ?? null) . '/' . basename(__FILE__));
+ }
+
+?>
diff --git a/docker/roundcube/rootfs/etc/roundcubemail/kolab_delegation.inc.php b/docker/roundcube/rootfs/etc/roundcubemail/kolab_delegation.inc.php
new file mode 100644
index 00000000..f8358198
--- /dev/null
+++ b/docker/roundcube/rootfs/etc/roundcubemail/kolab_delegation.inc.php
@@ -0,0 +1,14 @@
+<?php
+ // This will overwrite defined LDAP filter
+ // Note: LDAP addressbook defined for kolab_auth plugin is used
+ $config['kolab_delegation_filter'] = '(|(objectClass=inetorgperson)(&(objectclass=kolabsharedfolder)(kolabFolderType=mail)))';
+
+ // Delegates field (from fieldmap configuration) to get delegates list
+ // Note: This is a field name, not LDAP attribute name
+ // Note: LDAP addressbook defined for kolab_auth plugin is used
+ $config['kolab_delegation_delegate_field'] = 'kolabDelegate';
+
+ // Remove all user identities which do not match the users primary or alias
+ // addresses and delegators addresses
+ $config['kolab_delegation_purge_identities'] = false;
+?>
diff --git a/docker/roundcube/rootfs/etc/roundcubemail/kolab_files.inc.php b/docker/roundcube/rootfs/etc/roundcubemail/kolab_files.inc.php
new file mode 100644
index 00000000..3ba79bed
--- /dev/null
+++ b/docker/roundcube/rootfs/etc/roundcubemail/kolab_files.inc.php
@@ -0,0 +1,29 @@
+<?php
+
+// URL of kolab-chwala installation
+$config['kolab_files_url'] = 'https://' . ($_SERVER["HTTP_HOST"] ?? null) . '/chwala/';
+$config['kolab_files_server_url'] = 'http://127.0.0.1/chwala/';
+
+// List of files list columns. Available are: name, size, mtime, type
+$config['kolab_files_list_cols'] = array('name', 'mtime', 'size');
+
+// Name of the column to sort files list by
+$config['kolab_files_sort_col'] = 'name';
+
+// Order of the files list sort
+$config['kolab_files_sort_order'] = 'asc';
+
+// Number of concurent requests for searching and collections listing. Default: 1
+$config['kolab_files_search_threads'] = 1;
+
+// LDAP addressbook that would be searched for user names autocomplete.
+// That should be an array refering to the $config['ldap_public'] array key
+// or complete addressbook configuration array.
+$config['kolab_files_users_source'] = 'kolab_addressbook';
+
+// The LDAP attribute which will be used as ACL user identifier
+$config['kolab_files_users_field'] = 'mail';
+
+// The LDAP search filter will be combined with search queries
+$config['kolab_files_users_filter'] = '';
+?>
diff --git a/docker/roundcube/rootfs/etc/roundcubemail/kolab_folders.inc.php b/docker/roundcube/rootfs/etc/roundcubemail/kolab_folders.inc.php
new file mode 100644
index 00000000..d64717b0
--- /dev/null
+++ b/docker/roundcube/rootfs/etc/roundcubemail/kolab_folders.inc.php
@@ -0,0 +1,21 @@
+<?php
+ $config['kolab_folders_configuration_default'] = 'Configuration';
+ $config['kolab_folders_event_default'] = 'Calendar';
+ $config['kolab_folders_contact_default'] = 'Contacts';
+ $config['kolab_folders_task_default'] = 'Tasks';
+ $config['kolab_folders_note_default'] = 'Notes';
+ $config['kolab_folders_file_default'] = 'Files';
+ $config['kolab_folders_freebusy_default'] = 'Freebusy';
+ $config['kolab_folders_journal_default'] = 'Journal';
+ $config['kolab_folders_mail_inbox'] = 'INBOX';
+ $config['kolab_folders_mail_drafts'] = 'Drafts';
+ $config['kolab_folders_mail_sentitems'] = 'Sent';
+ $config['kolab_folders_mail_junkemail'] = 'Spam';
+ $config['kolab_folders_mail_outbox'] = '';
+ $config['kolab_folders_mail_wastebasket'] = 'Trash';
+
+ if (file_exists(RCUBE_CONFIG_DIR . '/' . $_SERVER["HTTP_HOST"] . '/' . basename(__FILE__))) {
+ include_once(RCUBE_CONFIG_DIR . '/' . $_SERVER["HTTP_HOST"] . '/' . basename(__FILE__));
+ }
+
+?>
diff --git a/docker/roundcube/rootfs/etc/roundcubemail/kolab_syncroton.inc.php b/docker/roundcube/rootfs/etc/roundcubemail/kolab_syncroton.inc.php
new file mode 100644
index 00000000..a72b3555
--- /dev/null
+++ b/docker/roundcube/rootfs/etc/roundcubemail/kolab_syncroton.inc.php
@@ -0,0 +1,125 @@
+<?php
+
+// This file lists all ActiveSync-related configuration options
+
+// Enables ActiveSync protocol debuging
+$config['activesync_debug'] = false;
+
+// If specified all ActiveSync-related logs will be saved to this file
+// Note: This doesn't change Roundcube Framework log locations
+$config['activesync_log_file'] = null;
+
+// Type of ActiveSync cache. Supported values: 'db', 'apc' and 'memcache'.
+// Note: This is only for some additional data like timezones mapping.
+$config['activesync_cache'] = 'db';
+
+// lifetime of ActiveSync cache
+// possible units: s, m, h, d, w
+$config['activesync_cache_ttl'] = '1d';
+
+// Type of ActiveSync Auth cache. Supported values: 'db', 'apc' and 'memcache'.
+// Note: This is only for username canonification map.
+$config['activesync_auth_cache'] = 'db';
+
+// lifetime of ActiveSync Auth cache
+// possible units: s, m, h, d, w
+$config['activesync_auth_cache_ttl'] = '1d';
+
+// List of global addressbooks (GAL)
+// Note: If empty 'autocomplete_addressbooks' setting will be used
+$config['activesync_addressbooks'] = array();
+
+// ActiveSync => Roundcube contact fields map for GAL search
+/* Default: array(
+ 'alias' => 'nickname',
+ 'company' => 'organization',
+ 'displayName' => 'name',
+ 'emailAddress' => 'email',
+ 'firstName' => 'firstname',
+ 'lastName' => 'surname',
+ 'mobilePhone' => 'phone.mobile',
+ 'office' => 'office',
+ 'picture' => 'photo',
+ 'phone' => 'phone',
+ 'title' => 'jobtitle',
+);
+*/
+$config['activesync_gal_fieldmap'] = null;
+
+// List of device types that will sync the LDAP addressbook(s) as a normal folder.
+// For devices that do not support GAL searching, e.g. Outlook.
+// Note: To make the LDAP addressbook sources working we need two additional
+// fields ('uid' and 'changed') specified in the fieldmap array
+// of the LDAP configuration ('ldap_public' option). For example:
+// 'uid' => 'nsuniqueid',
+// 'changed' => 'modifytimestamp',
+// Examples:
+// array('windowsoutlook') # enable for Oultook only
+// true # enable for all
+$config['activesync_gal_sync'] = false;
+
+// GAL cache. As reading all contacts from LDAP may be slow, caching is recommended.
+$config['activesync_gal_cache'] = 'db';
+
+// TTL of GAL cache entries. Technically this causes that synchronized
+// contacts will not be updated (queried) often than the specified interval.
+$config['activesync_gal_cache_ttl'] = '1d';
+
+// List of Roundcube plugins
+// WARNING: Not all plugins used in Roundcube can be listed here
+$config['activesync_plugins'] = array(
+ 'libcalendaring',
+ 'libkolab'
+);
+
+// Defines for how many seconds we'll sleep between every
+// action for detecting changes in folders. Default: 60
+$config['activesync_ping_timeout'] = 60;
+
+// Defines maximum Ping interval in seconds. Default: 900 (15 minutes)
+$config['activesync_ping_interval'] = 900;
+
+// We start detecting changes n seconds since the last sync of a folder
+// Default: 180
+$config['activesync_quiet_time'] = 0;
+
+// Defines maximum number of folders in a single Sync/Ping request. Default: 100.
+$config['activesync_max_folders'] = 100;
+
+// When a device is reqistered, by default a set of folders are
+// subscribed for syncronization, i.e. INBOX and personal folders with
+// defined folder type:
+// mail.drafts, mail.wastebasket, mail.sentitems, mail.outbox,
+// event, event.default,
+// contact, contact.default,
+// task, task.default
+// This default set can be extended by adding following values:
+// 1 - all subscribed folders in personal namespace
+// 2 - all folders in personal namespace
+// 4 - all subscribed folders in other users namespace
+// 8 - all folders in other users namespace
+// 16 - all subscribed folders in shared namespace
+// 32 - all folders in shared namespace
+$config['activesync_init_subscriptions'] = 21;
+
+// Defines blacklist of devices (device type strings) that do not support folder hierarchies.
+// When set to an array folder hierarchies are used on all devices not listed here.
+// When set to null an old whitelist approach will be used where we do opposite
+// action and enable folder hierarchies only on device types known to support it.
+$config['activesync_multifolder_blacklist'] = array();
+
+// Blacklist overwrites for specified object type. If set to an array
+// it will have a precedence over 'activesync_multifolder_blacklist' list only for that type.
+// Note: Outlook does not support multiple folders for contacts,
+// in that case use $config['activesync_multifolder_blacklist_contact'] = array('windowsoutlook');
+$config['activesync_multifolder_blacklist_mail'] = null;
+$config['activesync_multifolder_blacklist_event'] = null;
+$config['activesync_multifolder_blacklist_contact'] = array('windowsoutlook');
+$config['activesync_multifolder_blacklist_note'] = null;
+$config['activesync_multifolder_blacklist_task'] = null;
+
+$config['activesync_protected_folders'] = array('windowsoutlook' => array('INBOX', 'Sent', 'Trash'));
+
+// Enables adding sender name in the From: header of send email
+// when a device uses email address only (e.g. iOS devices)
+$config['activesync_fix_from'] = false;
diff --git a/docker/roundcube/rootfs/etc/roundcubemail/libkolab.inc.php b/docker/roundcube/rootfs/etc/roundcubemail/libkolab.inc.php
new file mode 100644
index 00000000..76161ce8
--- /dev/null
+++ b/docker/roundcube/rootfs/etc/roundcubemail/libkolab.inc.php
@@ -0,0 +1,16 @@
+<?php
+
+ $config['kolab_freebusy_server'] = '/freebusy';
+
+ if (file_exists(RCUBE_CONFIG_DIR . '/' . ($_SERVER["HTTP_HOST"] ?? null) . '/' . basename(__FILE__))) {
+ include_once(RCUBE_CONFIG_DIR . '/' . ($_SERVER["HTTP_HOST"] ?? null) . '/' . basename(__FILE__));
+ }
+
+ $config['kolab_cache'] = true;
+
+ $config['kolab_ssl_verify_host'] = false;
+ $config['kolab_ssl_verify_peer'] = false;
+
+ $config['kolab_use_subscriptions'] = true;
+
+?>
diff --git a/docker/roundcube/rootfs/etc/roundcubemail/managesieve.inc.php b/docker/roundcube/rootfs/etc/roundcubemail/managesieve.inc.php
new file mode 100644
index 00000000..db2024ee
--- /dev/null
+++ b/docker/roundcube/rootfs/etc/roundcubemail/managesieve.inc.php
@@ -0,0 +1,31 @@
+<?php
+ $config['managesieve_port'] = 4190;
+ $config['managesieve_host'] = '%h';
+ $config['managesieve_auth_type'] = 'PLAIN';
+ $config['managesieve_auth_cid'] = null;
+ $config['managesieve_auth_pw'] = null;
+ $config['managesieve_usetls'] = true;
+ $config['managesieve_default'] = '/etc/dovecot/sieve/global';
+ $config['managesieve_mbox_encoding'] = 'UTF-8';
+ $config['managesieve_replace_delimiter'] = '';
+ $config['managesieve_disabled_extensions'] = array();
+ $config['managesieve_debug'] = false;
+ $config['managesieve_vacation'] = 1;
+
+ $config['managesieve_filename_extension'] = '';
+ $config['managesieve_kolab_master'] = true;
+
+ // ManageSieve Connection TLS settings, adjust for Production
+ $config['managesieve_conn_options'] = Array(
+ 'ssl' => Array(
+ 'verify_peer_name' => false,
+ 'verify_peer' => false,
+ 'allow_self_signed' => true
+ )
+ );
+
+ if (file_exists(RCUBE_CONFIG_DIR . '/' . $_SERVER["HTTP_HOST"] . '/' . basename(__FILE__))) {
+ include_once(RCUBE_CONFIG_DIR . '/' . $_SERVER["HTTP_HOST"] . '/' . basename(__FILE__));
+ }
+
+?>
diff --git a/docker/roundcube/rootfs/etc/roundcubemail/mimetypes.inc.php b/docker/roundcube/rootfs/etc/roundcubemail/mimetypes.inc.php
new file mode 100644
index 00000000..efb4698e
--- /dev/null
+++ b/docker/roundcube/rootfs/etc/roundcubemail/mimetypes.inc.php
@@ -0,0 +1,56 @@
+<?php
+
+/**
+ * Local mapping file to specify mime-types based on common file-name extensions
+ *
+ * Please note that this mapping takes precedence over the content-based mime-type detection
+ * and should only contain mappings which cannot be detected properly from the file contents.
+ */
+
+return [
+ 'xls' => 'application/vnd.ms-excel',
+ 'xlm' => 'application/vnd.ms-excel',
+ 'xla' => 'application/vnd.ms-excel',
+ 'xlc' => 'application/vnd.ms-excel',
+ 'xlt' => 'application/vnd.ms-excel',
+ 'xlw' => 'application/vnd.ms-excel',
+ 'pdf' => 'application/pdf',
+ 'ppt' => 'application/vnd.ms-powerpoint',
+ 'pps' => 'application/vnd.ms-powerpoint',
+ 'pot' => 'application/vnd.ms-powerpoint',
+ 'doc' => 'application/msword',
+ 'dot' => 'application/msword',
+ 'odc' => 'application/vnd.oasis.opendocument.chart',
+ 'otc' => 'application/vnd.oasis.opendocument.chart-template',
+ 'odf' => 'application/vnd.oasis.opendocument.formula',
+ 'otf' => 'application/vnd.oasis.opendocument.formula-template',
+ 'odg' => 'application/vnd.oasis.opendocument.graphics',
+ 'otg' => 'application/vnd.oasis.opendocument.graphics-template',
+ 'odi' => 'application/vnd.oasis.opendocument.image',
+ 'oti' => 'application/vnd.oasis.opendocument.image-template',
+ 'odp' => 'application/vnd.oasis.opendocument.presentation',
+ 'otp' => 'application/vnd.oasis.opendocument.presentation-template',
+ 'ods' => 'application/vnd.oasis.opendocument.spreadsheet',
+ 'ots' => 'application/vnd.oasis.opendocument.spreadsheet-template',
+ 'odt' => 'application/vnd.oasis.opendocument.text',
+ 'otm' => 'application/vnd.oasis.opendocument.text-master',
+ 'ott' => 'application/vnd.oasis.opendocument.text-template',
+ 'oth' => 'application/vnd.oasis.opendocument.text-web',
+ 'docm' => 'application/vnd.ms-word.document.macroEnabled.12',
+ 'docx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
+ 'dotm' => 'application/vnd.ms-word.template.macroEnabled.12',
+ 'dotx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.template',
+ 'ppsm' => 'application/vnd.ms-powerpoint.slideshow.macroEnabled.12',
+ 'ppsx' => 'application/vnd.openxmlformats-officedocument.presentationml.slideshow',
+ 'pptm' => 'application/vnd.ms-powerpoint.presentation.macroEnabled.12',
+ 'pptx' => 'application/vnd.openxmlformats-officedocument.presentationml.presentation',
+ 'xlsb' => 'application/vnd.ms-excel.sheet.binary.macroEnabled.12',
+ 'xlsm' => 'application/vnd.ms-excel.sheet.macroEnabled.12',
+ 'xlsx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
+ 'xps' => 'application/vnd.ms-xpsdocument',
+ 'rar' => 'application/x-rar-compressed',
+ '7z' => 'application/x-7z-compressed',
+ 's7z' => 'application/x-7z-compressed',
+ 'vcf' => 'text/vcard',
+ 'ics' => 'text/calendar',
+];
diff --git a/docker/roundcube/rootfs/etc/roundcubemail/password.inc.php b/docker/roundcube/rootfs/etc/roundcubemail/password.inc.php
new file mode 100644
index 00000000..09808d92
--- /dev/null
+++ b/docker/roundcube/rootfs/etc/roundcubemail/password.inc.php
@@ -0,0 +1,155 @@
+<?php
+
+ // Password Plugin options
+ // -----------------------
+ // A driver to use for password change. Default: "sql".
+ // See README file for list of supported driver names.
+ $config['password_driver'] = 'ldap_simple';
+
+ // Determine whether current password is required to change password.
+ // Default: false.
+ $config['password_confirm_current'] = true;
+
+ // Require the new password to be a certain length.
+ // set to blank to allow passwords of any length
+ $config['password_minimum_length'] = 6;
+
+ // Require the new password to contain a letter and punctuation character
+ // Change to false to remove this check.
+ $config['password_require_nonalpha'] = false;
+
+ // Enables logging of password changes into logs/password
+ $config['password_log'] = true;
+
+
+ // LDAP and LDAP_SIMPLE Driver options
+ // -----------------------------------
+ // LDAP server name to connect to.
+ // You can provide one or several hosts in an array in which case the hosts are tried from left to right.
+ // Exemple: array('ldap1.exemple.com', 'ldap2.exemple.com');
+ // Default: 'localhost'
+ $config['password_ldap_host'] = getenv('LDAP_HOST');
+
+ // LDAP server port to connect to
+ // Default: '389'
+ $config['password_ldap_port'] = '389';
+
+ // TLS is started after connecting
+ // Using TLS for password modification is recommended.
+ // Default: false
+ $config['password_ldap_starttls'] = false;
+
+ // LDAP version
+ // Default: '3'
+ $config['password_ldap_version'] = '3';
+
+ // LDAP base name (root directory)
+ // Exemple: 'dc=exemple,dc=com'
+ $config['password_ldap_basedn'] = 'dc=hosted,dc=com';
+
+ // LDAP connection method
+ // There is two connection method for changing a user's LDAP password.
+ // 'user': use user credential (recommended, require password_confirm_current=true)
+ // 'admin': use admin credential (this mode require password_ldap_adminDN and password_ldap_adminPW)
+ // Default: 'user'
+ $config['password_ldap_method'] = 'user';
+
+ // LDAP Admin DN
+ // Used only in admin connection mode
+ // Default: null
+ $config['password_ldap_adminDN'] = null;
+
+ // LDAP Admin Password
+ // Used only in admin connection mode
+ // Default: null
+ $config['password_ldap_adminPW'] = null;
+
+ // LDAP user DN mask
+ // The user's DN is mandatory and as we only have his login,
+ // we need to re-create his DN using a mask
+ // '%login' will be replaced by the current roundcube user's login
+ // '%name' will be replaced by the current roundcube user's name part
+ // '%domain' will be replaced by the current roundcube user's domain part
+ // '%dc' will be replaced by domain name hierarchal string e.g. "dc=test,dc=domain,dc=com"
+ // Exemple: 'uid=%login,ou=people,dc=exemple,dc=com'
+ // $config['password_ldap_userDN_mask'] = 'uid=%login,ou=people,dc=exemple,dc=com';
+
+ // LDAP search DN
+ // The DN roundcube should bind with to find out user's DN
+ // based on his login. Note that you should comment out the default
+ // password_ldap_userDN_mask setting for this to take effect.
+ // Use this if you cannot specify a general template for user DN with
+ // password_ldap_userDN_mask. You need to perform a search based on
+ // users login to find his DN instead. A common reason might be that
+ // your users are placed under different ou's like engineering or
+ // sales which cannot be derived from their login only.
+ $config['password_ldap_searchDN'] = 'uid=kolab-service,ou=Special Users,dc=mgmt,dc=com';
+
+ // LDAP search password
+ // If password_ldap_searchDN is set, the password to use for
+ // binding to search for user's DN. Note that you should comment out the default
+ // password_ldap_userDN_mask setting for this to take effect.
+ // Warning: Be sure to set approperiate permissions on this file so this password
+ // is only accesible to roundcube and don't forget to restrict roundcube's access to
+ // your directory as much as possible using ACLs. Should this password be compromised
+ // you want to minimize the damage.
+ $config['password_ldap_searchPW'] = getenv('LDAP_SERVICE_BIND_PW');
+
+ // LDAP search base
+ // If password_ldap_searchDN is set, the base to search in using the filter below.
+ // Note that you should comment out the default password_ldap_userDN_mask setting
+ // for this to take effect.
+ $config['password_ldap_search_base'] = 'dc=hosted,dc=com';
+
+ // LDAP search filter
+ // If password_ldap_searchDN is set, the filter to use when
+ // searching for user's DN. Note that you should comment out the default
+ // password_ldap_userDN_mask setting for this to take effect.
+ // '%login' will be replaced by the current roundcube user's login
+ // '%name' will be replaced by the current roundcube user's name part
+ // '%domain' will be replaced by the current roundcube user's domain part
+ // '%dc' will be replaced by domain name hierarchal string e.g. "dc=test,dc=domain,dc=com"
+ // Example: '(uid=%login)'
+ // Example: '(&(objectClass=posixAccount)(uid=%login))'
+ $config['password_ldap_search_filter'] = '(&(|(uid=%login)(mail=%login)(mailAlternateAddress=%login)(alias=%login))(objectclass=kolabinetorgperson))';
+
+ // LDAP password hash type
+ // Standard LDAP encryption type which must be one of: crypt,
+ // ext_des, md5crypt, blowfish, md5, sha, smd5, ssha, or clear.
+ // Please note that most encodage types require external libraries
+ // to be included in your PHP installation, see function hashPassword in drivers/ldap.php for more info.
+ // Default: 'crypt'
+ $config['password_ldap_encodage'] = 'clear';
+
+ // LDAP password attribute
+ // Name of the ldap's attribute used for storing user password
+ // Default: 'userPassword'
+ $config['password_ldap_pwattr'] = 'userPassword';
+
+ // LDAP password force replace
+ // Force LDAP replace in cases where ACL allows only replace not read
+ // See http://pear.php.net/package/Net_LDAP2/docs/latest/Net_LDAP2/Net_LDAP2_Entry.html#methodreplace
+ // Default: true
+ $config['password_ldap_force_replace'] = true;
+
+ // LDAP Password Last Change Date
+ // Some places use an attribute to store the date of the last password change
+ // The date is meassured in "days since epoch" (an integer value)
+ // Whenever the password is changed, the attribute will be updated if set (e.g. shadowLastChange)
+ $config['password_ldap_lchattr'] = '';
+
+ // LDAP Samba password attribute, e.g. sambaNTPassword
+ // Name of the LDAP's Samba attribute used for storing user password
+ $config['password_ldap_samba_pwattr'] = '';
+
+ // LDAP Samba Password Last Change Date attribute, e.g. sambaPwdLastSet
+ // Some places use an attribute to store the date of the last password change
+ // The date is meassured in "seconds since epoch" (an integer value)
+ // Whenever the password is changed, the attribute will be updated if set
+ $config['password_ldap_samba_lchattr'] = '';
+
+ if (file_exists(RCUBE_CONFIG_DIR . '/' . $_SERVER["HTTP_HOST"] . '/' . basename(__FILE__))) {
+ include_once(RCUBE_CONFIG_DIR . '/' . $_SERVER["HTTP_HOST"] . '/' . basename(__FILE__));
+ }
+
+?>
diff --git a/docker/roundcube/rootfs/etc/roundcubemail/recipient_to_contact.inc.php b/docker/roundcube/rootfs/etc/roundcubemail/recipient_to_contact.inc.php
new file mode 100644
index 00000000..9d22aeb8
--- /dev/null
+++ b/docker/roundcube/rootfs/etc/roundcubemail/recipient_to_contact.inc.php
@@ -0,0 +1,3 @@
+<?php
+ $config['recipient_to_contact_addressbooks'] = array();
+ $config['recipient_to_contact_enabled_by_default'] = true;
diff --git a/docker/roundcube/rootfs/etc/roundcubemail/tasklist.inc.php b/docker/roundcube/rootfs/etc/roundcubemail/tasklist.inc.php
new file mode 100644
index 00000000..399344cd
--- /dev/null
+++ b/docker/roundcube/rootfs/etc/roundcubemail/tasklist.inc.php
@@ -0,0 +1,11 @@
+<?php
+
+// backend type (database, kolab)
+$config['tasklist_driver'] = 'kolab';
+
+// default sorting order of tasks listing (auto, datetime, startdatetime, flagged, complete, changed)
+$config['tasklist_sort_col'] = '';
+
+// default sorting order for tasks listing (asc or desc)
+$config['tasklist_sort_order'] = 'asc';
+
diff --git a/docker/roundcube/rootfs/etc/roundcubemail/terms.html b/docker/roundcube/rootfs/etc/roundcubemail/terms.html
new file mode 100644
index 00000000..4fcabc71
--- /dev/null
+++ b/docker/roundcube/rootfs/etc/roundcubemail/terms.html
@@ -0,0 +1,10 @@
+<html>
+ <head>
+ </head>
+ <body>
+ <h1>Welcome to Kolab Groupware</h1>
+ <p>
+ Here could be your Message of the Day.
+ </p>
+ </body>
+</html>
diff --git a/docker/roundcube/rootfs/etc/roundcubemail/terms.inc.php b/docker/roundcube/rootfs/etc/roundcubemail/terms.inc.php
new file mode 100644
index 00000000..28b450cb
--- /dev/null
+++ b/docker/roundcube/rootfs/etc/roundcubemail/terms.inc.php
@@ -0,0 +1,22 @@
+<?php
+
+ /* terms plugin */
+
+ // log accepted terms
+ $config['terms_log'] = true;
+
+ // renew agreement if older than YYYY-MM-DD HH:MM:SS
+ // NOTICE: Must be in past and set accordingly to server Timezone!!!
+ $config['terms_date'] = '2011-02-24 00:00:00';
+
+ // renew agreement automatically afer x days
+ $config['terms_renew'] = 28; // 0 = never
+
+ // always request terms agreement after login
+ $config['terms_always'] = false;
+
+ if (file_exists(RCUBE_CONFIG_DIR . '/' . $_SERVER["HTTP_HOST"] . '/' . basename(__FILE__))) {
+ include_once(RCUBE_CONFIG_DIR . '/' . $_SERVER["HTTP_HOST"] . '/' . basename(__FILE__));
+ }
+
+?>
diff --git a/docker/roundcube/rootfs/opt/app-root/src/build.sh b/docker/roundcube/rootfs/opt/app-root/src/build.sh
new file mode 100755
index 00000000..ddd91e04
--- /dev/null
+++ b/docker/roundcube/rootfs/opt/app-root/src/build.sh
@@ -0,0 +1,62 @@
+#!/bin/bash
+set -e
+set -x
+
+pushd /opt/app-root/src/
+
+# Clone what we don't find (roundcubemail-skin-elastic is not publicly available, so can't be included this way)
+if [ ! -d roundcubemail ]; then
+ # Push this branch on an apheleia-it repo
+ git clone --branch dev/kolab-1.5 https://github.com/cmollekopf/roundcubemail.git roundcubemail
+fi
+if [ ! -d roundcubemail-plugins-kolab ]; then
+ git clone --branch master https://git.kolab.org/diffusion/RPK/roundcubemail-plugins-kolab.git roundcubemail-plugins-kolab
+fi
+if [ ! -d syncroton ]; then
+ git clone --branch master https://git.kolab.org/diffusion/S/syncroton.git syncroton
+fi
+if [ ! -d iRony ]; then
+ git clone --branch master https://git.kolab.org/source/iRony.git iRony
+fi
+if [ ! -d chwala ]; then
+ git clone --branch master https://git.kolab.org/diffusion/C/chwala.git chwala
+fi
+if [ ! -d autoconf ]; then
+ git clone --branch master https://git.kolab.org/diffusion/AC/autoconf.git autoconf
+fi
+if [ ! -d freebusy ]; then
+ git clone --branch master https://git.kolab.org/diffusion/F/freebusy.git freebusy
+fi
+
+
+pushd roundcubemail
+cp /opt/app-root/src/composer.json composer.json
+rm -rf vendor/ composer.lock
+php -dmemory_limit=-1 $(command -v composer) install
+
+cd /opt/app-root/src/
+./update.sh
+cd /opt/app-root/src/roundcubemail
+
+# Adjust the configs
+
+sed -i -r \
+ -e "s/'vlv'(\s+)=> false,/'vlv'\1=> true,/g" \
+ -e "s/'vlv_search'(\s+)=> false,/'vlv_search'\1=> true,/g" \
+ -e "s/inetOrgPerson/inetorgperson/g" \
+ -e "s/kolabInetOrgPerson/inetorgperson/g" \
+ config/*.inc.php
+
+sed -i -r -e "s|\$config\['enigma_pgp_homedir'\] = .*$|\$config['enigma_pgp_homedir'] = '/tmp/';|g" config/enigma.inc.php
+sed -i -r -e "s|\$config\['enigma_passwordless'\] = .*$|\$config['enigma_passwordless'] = true;|g" config/enigma.inc.php
+sed -i -r -e "s|\$config\['enigma_multihost'\] = .*$|\$config['enigma_multihost'] = true;|g" config/enigma.inc.php
+echo "\$config['enigma_woat'] = true;" >> config/enigma.inc.php
+
+sed -i -r -e "s|\$config\['managesieve_host'\] = .*$|\$config['managesieve_host'] = 'kolab';|g" config/managesieve.inc.php
+
+popd
+
+# Set the php timezone
+sed -i -r -e 's|^(;*)date\.timezone.*$|date.timezone = Europe/Zurich|g' /etc/php.ini
+# Allow environment variables from fpm
+sed -i -e "s/;clear_env/clear_env/" /etc/php-fpm.d/www.conf
diff --git a/docker/roundcube/rootfs/opt/app-root/src/composer.json b/docker/roundcube/rootfs/opt/app-root/src/composer.json
new file mode 100755
index 00000000..f0f3f126
--- /dev/null
+++ b/docker/roundcube/rootfs/opt/app-root/src/composer.json
@@ -0,0 +1,179 @@
+{
+ "name": "kolab/roundcubemail",
+ "description": "The Roundcube Webmail suite",
+ "license": "GPL-3.0+",
+ "version": "1.5.3",
+ "config": {
+ "platform": {
+ "php": "7.2.24"
+ },
+ "allow-plugins": {
+ "roundcube/plugin-installer": true
+ }
+ },
+ "repositories": [
+ {
+ "type": "path",
+ "url": "/opt/app-root/src/roundcubemail-plugins-kolab/plugins/kolab_activesync",
+ "options": {
+ "symlink": false
+ }
+ },
+ {
+ "type": "path",
+ "url": "/opt/app-root/src/roundcubemail-plugins-kolab/plugins/kolab_addressbook",
+ "options": {
+ "symlink": false
+ }
+ },
+ {
+ "type": "path",
+ "url": "/opt/app-root/src/roundcubemail-plugins-kolab/plugins/kolab_auth",
+ "options": {
+ "symlink": false
+ }
+ },
+ {
+ "type": "path",
+ "url": "/opt/app-root/src/roundcubemail-plugins-kolab/plugins/kolab_config",
+ "options": {
+ "symlink": false
+ }
+ },
+ {
+ "type": "path",
+ "url": "/opt/app-root/src/roundcubemail-plugins-kolab/plugins/kolab_delegation",
+ "options": {
+ "symlink": false
+ }
+ },
+ {
+ "type": "path",
+ "url": "/opt/app-root/src/roundcubemail-plugins-kolab/plugins/kolab_files",
+ "options": {
+ "symlink": false
+ }
+ },
+ {
+ "type": "path",
+ "url": "/opt/app-root/src/roundcubemail-plugins-kolab/plugins/kolab_folders",
+ "options": {
+ "symlink": false
+ }
+ },
+ {
+ "type": "path",
+ "url": "/opt/app-root/src/roundcubemail-plugins-kolab/plugins/kolab_notes",
+ "options": {
+ "symlink": false
+ }
+ },
+ {
+ "type": "path",
+ "url": "/opt/app-root/src/roundcubemail-plugins-kolab/plugins/kolab_tags",
+ "options": {
+ "symlink": false
+ }
+ },
+ {
+ "type": "path",
+ "url": "/opt/app-root/src/roundcubemail-plugins-kolab/plugins/kolab_chat",
+ "options": {
+ "symlink": false
+ }
+ },
+ {
+ "type": "path",
+ "url": "/opt/app-root/src/roundcubemail-plugins-kolab/plugins/odfviewer",
+ "options": {
+ "symlink": false
+ }
+ },
+ {
+ "type": "path",
+ "url": "/opt/app-root/src/roundcubemail-plugins-kolab/plugins/pdfviewer",
+ "options": {
+ "symlink": false
+ }
+ },
+ {
+ "type": "path",
+ "url": "/opt/app-root/src/roundcubemail-plugins-kolab/plugins/tasklist",
+ "options": {
+ "symlink": false
+ }
+ },
+ {
+ "type": "path",
+ "url": "/opt/app-root/src/roundcubemail-plugins-kolab/plugins/calendar",
+ "options": {
+ "symlink": false
+ }
+ },
+ {
+ "type": "path",
+ "url": "/opt/app-root/src/roundcubemail-plugins-kolab/plugins/libcalendaring",
+ "options": {
+ "symlink": false
+ }
+ },
+ {
+ "type": "path",
+ "url": "/opt/app-root/src/roundcubemail-plugins-kolab/plugins/libkolab",
+ "options": {
+ "symlink": false
+ }
+ },
+ {
+ "type": "composer",
+ "url": "https://plugins.roundcube.net"
+ }
+ ],
+ "require": {
+ "php": ">=7.2.0",
+ "pear/pear-core-minimal": "~1.10.1",
+ "pear/auth_sasl": "~1.1.0",
+ "pear/mail_mime": "~1.10.0",
+ "pear/http_request2": "~2.5.0",
+ "pear/net_smtp": "~1.10.0",
+ "pear/crypt_gpg": "~1.6.3",
+ "pear/net_sieve": "~1.4.5",
+ "roundcube/plugin-installer": "~0.2.0",
+ "roundcube/rtf-html-php": "~2.1",
+ "masterminds/html5": "~2.7.0",
+ "endroid/qr-code": "~1.6.5",
+ "guzzlehttp/guzzle": "^7.4.1",
+ "kolab/calendar": "~3.5.11",
+ "kolab/kolab_activesync": "~3.5.6",
+ "kolab/kolab_addressbook": "~3.5.6",
+ "kolab/kolab_auth": "~3.5.6",
+ "kolab/kolab_chat": "~3.5.2",
+ "kolab/kolab_config": "~3.4.0",
+ "kolab/kolab_delegation": "~3.5.11",
+ "kolab/kolab_files": "~3.5.2",
+ "kolab/kolab_folders": "~3.5.2",
+ "kolab/kolab_notes": "~3.5.5",
+ "kolab/kolab_tags": "~3.5.2",
+ "kolab/net_ldap3": "dev-master",
+ "kolab/odfviewer": "~3.4.0",
+ "kolab/pdfviewer": "~3.4.0",
+ "kolab/tasklist": "~3.5.10",
+ "johndoh/contextmenu": "~3.2.1",
+ "zf1/zend-json": "~1.12.11",
+ "zf1/zend-log": "~1.12.11",
+ "zf1/zend-controller": "~1.12.11",
+ "sabre/vobject" : "~4.5.1",
+ "sabre/dav" : "~4.0",
+ "sabre/http" : "~5.0",
+ "smarty/smarty" : "~3.1.7"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^4.8.36 || ^5.7.21",
+ "phpstan/phpstan": "^1.4",
+ "squizlabs/php_codesniffer": "^3.6",
+ "phpcompatibility/php-compatibility": "^9.3"
+ },
+ "suggest": {
+ "mkopinsky/zxcvbn-php": "^4.4.2 required for Zxcvbn password strength driver"
+ }
+}
diff --git a/docker/roundcube/rootfs/opt/app-root/src/enable-xdebug.sh b/docker/roundcube/rootfs/opt/app-root/src/enable-xdebug.sh
new file mode 100755
index 00000000..416179cd
--- /dev/null
+++ b/docker/roundcube/rootfs/opt/app-root/src/enable-xdebug.sh
@@ -0,0 +1,24 @@
+#!/bin/bash
+
+dnf -y install php-xdebug
+
+cat << EOF > /etc/php.d/xdebug.ini
+zend_extension=/usr/lib64/php/modules/xdebug.so
+
+# Profiler config for xdebug3
+#xdebug.mode=profile
+#xdebug.output_dir="/tmp/"
+#xdebug.start_with_request=trigger
+
+# Profiler config for xdebug2
+#xdebug.remote_log="/tmp/xdebug.log"
+xdebug.profiler_enable = 0
+# Enable using a XDEBUG_PROFILE GET/POST parameter
+xdebug.profiler_enable_trigger = 1
+xdebug.profiler_output_dir = "/tmp/"
+#xdebug.remote_enable=on
+#xdebug.remote_port=9000
+#xdebug.remote_autostart=0
+#xdebug.remote_connect_back=on
+#xdebug.idekey=editor-xdebug
+EOF
diff --git a/docker/roundcube/rootfs/opt/app-root/src/init.sh b/docker/roundcube/rootfs/opt/app-root/src/init.sh
new file mode 100755
index 00000000..1b9f6950
--- /dev/null
+++ b/docker/roundcube/rootfs/opt/app-root/src/init.sh
@@ -0,0 +1,75 @@
+#!/bin/bash
+set -e
+set -x
+
+pushd /opt/app-root/src/
+
+sed -i -r -e "s|service_bind_pw = .*$|service_bind_pw = $LDAP_SERVICE_BIND_PW|g" /etc/kolab/kolab.conf
+
+pushd roundcubemail
+
+## Copy our configs over the default ones
+cp /etc/roundcubemail/* config/
+
+DES_KEY=$(openssl rand -base64 24);
+sed -i -r -e "s|\$config\['des_key'\] = .*$|\$config['des_key'] = \"$DES_KEY\";|g" config/config.inc.php
+
+# Initialize the db
+cat > /tmp/kolab-setup-my.cnf << EOF
+[client]
+host=${DB_HOST}
+user=root
+password=${DB_ROOT_PASSWORD}
+EOF
+
+mysql --defaults-file=/tmp/kolab-setup-my.cnf <<EOF
+CREATE DATABASE IF NOT EXISTS $DB_RC_DATABASE CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
+CREATE USER IF NOT EXISTS $DB_RC_USERNAME@'%' IDENTIFIED BY '$DB_RC_PASSWORD';
+ALTER USER $DB_RC_USERNAME@'%' IDENTIFIED BY '$DB_RC_PASSWORD';
+GRANT ALL PRIVILEGES ON $DB_RC_DATABASE.* TO $DB_RC_USERNAME@'%';
+FLUSH PRIVILEGES;
+EOF
+
+# Run roundcube and plugin database initializations
+bin/initdb.sh --dir SQL/ || :
+
+for plugin in $(find plugins -mindepth 1 -maxdepth 1 -type d | sort); do
+ if [ ! -z "$(find ${plugin} -type d -name SQL)" ]; then
+ for dir in $(find plugins/$(basename ${plugin})/ -type d -name SQL); do
+ # Skip plugins with multiple drivers and no kolab driver
+ if [ ! -z "$(echo $dir | grep driver)" ]; then
+ if [ -z "$(echo $dir | grep kolab)" ]; then
+ continue
+ fi
+ fi
+
+ bin/initdb.sh \
+ --dir $dir \
+ --package $(basename ${plugin}) \
+ >/dev/null 2>&1 || :
+ done
+ fi
+done
+
+# FIXME should we be runnin updates?
+# bin/updatedb.sh --dir SQL/ --package roundcube
+# bin/updatedb.sh --dir plugins/libkolab/SQL/ --package libkolab
+# bin/updatedb.sh --dir plugins/calendar/SQL/ --package calendar
+
+popd
+
+roundcubemail/bin/initdb.sh --dir syncroton/docs/SQL/ || :
+roundcubemail/bin/initdb.sh --dir chwala/doc/SQL/ || :
+
+# Fix permissions. Logfiles could have been written as root during dbinit especially.
+chmod 777 -R roundcubemail/logs
+chmod 777 -R roundcubemail/temp
+
+echo ""
+echo "Done, starting httpd..."
+
+mkdir -p /run/php-fpm
+/usr/sbin/php-fpm
+chmod 777 /run/php-fpm
+mkdir -p /run/httpd
+exec httpd -DFOREGROUND
diff --git a/docker/roundcube/rootfs/opt/app-root/src/reload.sh b/docker/roundcube/rootfs/opt/app-root/src/reload.sh
new file mode 100755
index 00000000..619e9d68
--- /dev/null
+++ b/docker/roundcube/rootfs/opt/app-root/src/reload.sh
@@ -0,0 +1,3 @@
+#!/bin/bash
+
+kill -SIGUSR1 1
diff --git a/docker/roundcube/rootfs/opt/app-root/src/update-from-source.sh b/docker/roundcube/rootfs/opt/app-root/src/update-from-source.sh
new file mode 100755
index 00000000..189b24f7
--- /dev/null
+++ b/docker/roundcube/rootfs/opt/app-root/src/update-from-source.sh
@@ -0,0 +1,35 @@
+#!/bin/bash
+#Update from source (rather then via composer which updates to the latest commit)
+
+for repo in roundcubemail syncroton iRony chwala autoconf freebusy
+do
+ if [ -d /src.orig/$directory ]; then
+ rsync -av \
+ --exclude=vendor \
+ --exclude=temp \
+ --exclude=config \
+ --exclude=logs \
+ --exclude=.git \
+ --exclude=config.inc.php \
+ --exclude=composer.json \
+ --exclude=composer.lock \
+ /src.orig/$directory/ /opt/app-root/src/$directory
+ fi
+done
+
+pushd /src.orig/roundcubemail-plugins-kolab/plugins
+
+for plugin in $(ls -1d)
+do
+ if [ -d /opt/app-root/src/roundcubemail/plugins/${plugin}/ ]; then
+ rsync -av \
+ --exclude=vendor \
+ --exclude=composer.json \
+ --exclude=config.inc.php \
+ $plugin/ /opt/app-root/src/roundcubemail/plugins/$plugin
+ fi
+done
+popd
+
+
+./reload.sh
diff --git a/docker/roundcube/rootfs/opt/app-root/src/update.sh b/docker/roundcube/rootfs/opt/app-root/src/update.sh
new file mode 100755
index 00000000..00bab99d
--- /dev/null
+++ b/docker/roundcube/rootfs/opt/app-root/src/update.sh
@@ -0,0 +1,178 @@
+#!/bin/bash
+set -e
+set -x
+
+# Look for local repositories
+for repo in roundcubemail roundcubemail-plugins-kolab roundcubemail-skin-elastic syncroton iRony chwala autoconf freebusy
+do
+ if [ -d /src.orig/$repo ]; then
+ rsync -av \
+ --exclude=vendor \
+ --exclude=temp \
+ --exclude=logs \
+ --exclude=composer.lock \
+ /src.orig/$repo/ /opt/app-root/src/$repo
+ fi
+done
+
+pushd /opt/app-root/src/
+
+LESSC=/usr/local/bin/lessc
+SKINS=(kolab plesk)
+
+pushd roundcubemail
+cp /opt/app-root/src/composer.json composer.json
+
+php -dmemory_limit=-1 $(command -v composer) update
+
+bin/install-jsdeps.sh
+
+# May require an "npm install less" and "npm install less-plugin-clean-css"
+pushd skins/elastic
+$LESSC -x styles/styles.less > styles/styles.css
+$LESSC -x styles/print.less > styles/print.css
+$LESSC -x styles/embed.less > styles/embed.css
+popd
+$LESSC --clean-css="--s1 --advanced" --rewrite-urls=all plugins/libkolab/skins/elastic/libkolab.less > plugins/libkolab/skins/elastic/libkolab.min.css
+
+bin/updatecss.sh --dir skins/elastic
+popd
+
+# Install skins
+for skin in "${SKINS[@]}"; do
+ if [ -d "roundcubemail-skin-elastic/$skin" ]; then
+ cp -r "roundcubemail-skin-elastic/$skin" roundcubemail/skins/
+ else
+ echo "Skin $skin is not available"
+ fi
+done
+
+pushd roundcubemail
+
+for skin in $(ls -1d skins/* | grep -vE '(classic|elastic|larry)'); do
+ skin=$(basename $skin)
+
+ # Copy elastic skin over $skin (but don't overwrite what already existis)
+ find \
+ ./skins/elastic/ \
+ ./plugins/libkolab/skins/elastic/ \
+ -type f | sort | while read file; do
+ target_dir=$(dirname ${file} | sed -e 's|%{datadir}|.|g' -e 's|./public_html/assets/|./|g' -e 's|./public_html/assets/plugins/libkolab/|./|g' -e "s/elastic/$skin/g")
+ file_name=$(basename ${file})
+ echo "Target: $target_dir, file $file_name"
+ if [ ! -d ${target_dir} ]; then
+ mkdir -p ${target_dir}
+ fi
+ if [ ! -f "${target_dir}/${file_name}" ]; then
+ cp -av "${file}" "${target_dir}"
+ fi
+ done
+
+ # Replace elastic references, but don't change the depends value in meta.json
+ sed -i -e "s/\"elastic\"/\"$skin\"/g" \
+ $(find skins/$skin/ plugins/libkolab/skins/$skin/ -type f -not -name "meta.json")
+
+ pushd skins/$skin
+ $LESSC -x styles/styles.less > styles/styles.css
+ $LESSC -x styles/print.less > styles/print.css
+ $LESSC -x styles/embed.less > styles/embed.css
+ popd
+ $LESSC --clean-css="--s1 --advanced" --rewrite-urls=all plugins/libkolab/skins/$skin/libkolab.less > plugins/libkolab/skins/$skin/libkolab.min.css
+
+ # Compile and compress the CSS
+ #for file in `find . -type f -name "styles.less" -o -name "print.less" -o -name "embed.less" -o -name "libkolab.less"`; do
+ # %{_bindir}/lessc --relative-urls ${file} > $(dirname ${file})/$(basename ${file} .less).css
+ #
+ # sed -i \
+ # -e "s|../../../skins/plesk/images/contactpic.png|../../../../skins/plesk/images/contactpic.png|" \
+ # -e "s|../../../skins/plesk/images/watermark.jpg|../../../../skins/plesk/images/watermark.jpg|" \
+ # $(dirname ${file})/$(basename ${file} .less).css
+ #
+ # cat $(dirname ${file})/$(basename ${file} .less).css
+ #done
+
+ bin/updatecss.sh --dir "skins/$skin"
+done
+
+## Configs
+
+# Install plugin configs
+for plugin in $(find plugins/ -mindepth 1 -maxdepth 1 -type d -exec basename {} \; | sort); do
+ if [ -f "plugins/${plugin}/config.inc.php.dist" ]; then
+ pushd plugins/${plugin}
+ mv config.inc.php.dist ../../config/${plugin}.inc.php
+ rm -f config.inc.php
+ ln -s ../../config/${plugin}.inc.php config.inc.php
+ popd
+ fi
+done
+
+# Copy our configs over the default ones
+cp /etc/roundcubemail/* config/
+
+DES_KEY=$(openssl rand -base64 24);
+sed -i -r -e "s|\$config\['des_key'\] = .*$|\$config['des_key'] = \"$DES_KEY\";|g" config/config.inc.php
+
+##Fix permissions
+chmod 777 -R logs
+chmod 777 -R temp
+
+popd
+
+# Maybe redo this in case of updates
+# Install chwala
+pushd chwala
+rm -f lib/ext/Roundcube lib/drivers/kolab/plugins vendor
+mkdir -p lib/ext
+ln -s ../../../roundcubemail/program/lib/Roundcube lib/ext/Roundcube
+ln -s ../../../../roundcubemail/plugins lib/drivers/kolab/plugins
+ln -s ../roundcubemail/vendor vendor
+rm -R config
+ln -s ../roundcubemail/config config
+chmod 777 -R cache
+chmod 777 -R logs
+popd
+
+
+# Install iRony
+pushd iRony
+rm -f lib/FileAPI lib/Roundcube lib/plugins vendor
+ln -s ../../chwala/lib lib/FileAPI
+ln -s ../../roundcubemail/program/lib/Roundcube lib/Roundcube
+ln -s ../../roundcubemail/plugins lib/plugins
+ln -s ../roundcubemail/vendor vendor
+rm -R config
+ln -s ../roundcubemail/config config
+mkdir -p logs
+chmod 777 -R logs
+mkdir -p temp
+chmod 777 -R temp
+popd
+
+
+# Install syncroton
+pushd syncroton
+rm -f lib/ext/Roundcube lib/plugins vendor
+mkdir -p lib/ext
+ln -s ../../../roundcubemail/program/lib/Roundcube lib/ext/Roundcube
+ln -s ../../roundcubemail/plugins lib/plugins
+ln -s ../roundcubemail/vendor vendor
+rm -R config
+ln -s ../roundcubemail/config config
+chmod 777 -R logs
+popd
+
+# Install autoconf
+pushd autoconf
+rm -f vendor
+ln -s ../roundcubemail/vendor vendor
+chmod 777 -R logs
+popd
+
+# Install freebusy
+pushd freebusy
+rm -f vendor
+ln -s ../roundcubemail/vendor vendor
+mkdir -p logs
+chmod 777 -R logs
+popd
File Metadata
Details
Attached
Mime Type
text/x-diff
Expires
Mon, Apr 6, 12:20 AM (1 w, 3 d ago)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
18831694
Default Alt Text
(101 KB)
Attached To
Mode
rK kolab
Attached
Detach File
Event Timeline