Page MenuHomePhorge

No OneTemporary

Authored By
Unknown
Size
57 KB
Referenced Files
None
Subscribers
None
diff --git a/bin/podman_shared b/bin/podman_shared
index e8e8bac8..c88bb935 100644
--- a/bin/podman_shared
+++ b/bin/podman_shared
@@ -1,414 +1,419 @@
#!/bin/bash
PODMAN=podman
if [ -d /etc/letsencrypt ]; then
LETSENCRYPT_VOLUME="-v /etc/letsencrypt/:/etc/letsencrypt/:ro"
fi
podman__build() {
path=$1
shift
name=$1
shift
if [[ "$CACHE_REGISTRY" != "" ]]; then
CACHE_ARGS="--layers --cache-from=$CACHE_REGISTRY/$name --cache-to=$CACHE_REGISTRY/$name --cache-ttl=24h"
fi
podman build $@ $CACHE_ARGS $path -t $name
}
podman__build_base() {
podman__build docker/base/ apheleia/almalinux9 -f almalinux9
podman__build docker/swoole apheleia/swoole
}
podman__build_webapp() {
podman__build docker/webapp kolab-webapp --ulimit nofile=65535:65535 \
${KOLAB_GIT_REMOTE:+"--build-arg=GIT_REMOTE=$KOLAB_GIT_REMOTE"} \
${KOLAB_GIT_REF:+"--build-arg=GIT_REF=$KOLAB_GIT_REF"}
}
podman__build_meet() {
podman__build docker/meet kolab-meet --ulimit nofile=65535:65535 \
${KOLAB_GIT_REMOTE:+"--build-arg=GIT_REMOTE=$KOLAB_GIT_REMOTE"} \
${KOLAB_GIT_REF:+"--build-arg=GIT_REF=$KOLAB_GIT_REF"}
}
podman__build_roundcube() {
podman__build docker/roundcube roundcube --ulimit nofile=65535:65535 \
${GIT_REMOTE_ROUNDCUBEMAIL:+"--build-arg=GIT_REMOTE_ROUNDCUBEMAIL=$GIT_REMOTE_ROUNDCUBEMAIL"} \
${GIT_REF_ROUNDCUBEMAIL:+"--build-arg=GIT_REF_ROUNDCUBEMAIL=$GIT_REF_ROUNDCUBEMAIL"} \
${GIT_REMOTE_ROUNDCUBEMAIL_PLUGINS:+"--build-arg=GIT_REMOTE_ROUNDCUBEMAIL_PLUGINS=$GIT_REMOTE_ROUNDCUBEMAIL_PLUGINS"} \
${GIT_REF_ROUNDCUBEMAIL_PLUGINS:+"--build-arg=GIT_REF_ROUNDCUBEMAIL_PLUGINS=$GIT_REF_ROUNDCUBEMAIL_PLUGINS"} \
${GIT_REMOTE_CHWALA:+"--build-arg=GIT_REMOTE_CHWALA=$GIT_REMOTE_CHWALA"} \
${GIT_REF_CHWALA:+"--build-arg=GIT_REF_CHWALA=$GIT_REF_CHWALA"} \
${GIT_REMOTE_SYNCROTON:+"--build-arg=GIT_REMOTE_SYNCROTON=$GIT_REMOTE_SYNCROTON"} \
${GIT_REF_SYNCROTON:+"--build-arg=GIT_REF_SYNCROTON=$GIT_REF_SYNCROTON"} \
${GIT_REMOTE_AUTOCONF:+"--build-arg=GIT_REMOTE_AUTOCONF=$GIT_REMOTE_AUTOCONF"} \
${GIT_REF_AUTOCONF:+"--build-arg=GIT_REF_AUTOCONF=$GIT_REF_AUTOCONF"} \
${GIT_REMOTE_IRONY:+"--build-arg=GIT_REMOTE_IRONY=$GIT_REMOTE_IRONY"} \
${GIT_REF_IRONY:+"--build-arg=GIT_REF_IRONY=$GIT_REF_IRONY"} \
${GIT_REMOTE_FREEBUSY:+"--build-arg=GIT_REMOTE_FREEBUSY=$GIT_REMOTE_FREEBUSY"} \
${GIT_REF_FREEBUSY:+"--build-arg=GIT_REF_FREEBUSY=$GIT_REF_FREEBUSY"}
}
podman__build_postfix() {
podman__build docker/postfix kolab-postfix
}
podman__build_imap() {
podman__build docker/imap kolab-imap \
${IMAP_GIT_REMOTE:+"--build-arg=GIT_REMOTE=$IMAP_GIT_REMOTE"} \
${IMAP_GIT_REF:+"--build-arg=GIT_REF=$IMAP_GIT_REF"}
}
podman__build_amavis() {
podman__build docker/amavis kolab-amavis
}
podman__build_proxy() {
podman__build docker/proxy kolab-proxy
}
podman__build_collabora() {
podman build docker/collabora -t kolab-collabora --build-arg=REPOSITORY="https://www.collaboraoffice.com/repos/CollaboraOnline/23.05-CODE/CODE-rpm/"
}
podman__build_coturn() {
podman build docker/coturn -t kolab-coturn
}
podman__build_utils() {
podman build docker/utils -t kolab-utils
}
podman__build_all() {
podman__build_base
podman__build_webapp
podman__build_meet
podman__build_postfix
podman__build_imap
podman__build_amavis
podman__build_collabora
podman build docker/mariadb -t mariadb
podman build docker/redis -t redis
podman__build_proxy
podman__build_coturn
podman__build_utils
podman build docker/fluentbit -t fluentbit
podman build docker/synapse -t synapse
podman build docker/element -t element
podman__build_roundcube
podman build docker/ldap -t ldap
}
kolab__validate() {
POD=$1
$PODMAN exec $POD-imap testsaslauthd -u cyrus-admin -p simple123
$PODMAN exec $POD-imap testsaslauthd -u "john@kolab.org" -p simple123
# Ensure the inbox is created
FOUND=false
for i in {1..60}; do
if $PODMAN exec $POD-imap bash -c 'echo "lm" | cyradm --auth PLAIN -u cyrus-admin -w simple123 --port 11143 localhost | grep "user/john@kolab.org"'; then
echo "Found mailbox";
FOUND=true
break
else
echo "Waiting for mailbox";
sleep 1;
fi
done
if ! $FOUND; then
echo "Failed to find the inbox for john@kolab.org"
exit 1
fi
}
podman__is_ready() {
if [[ "$(timeout 5 podman wait --condition running $1)" != "-1" ]]; then
echo "Container $1 is not running"
return 1
fi
# We can only wait for healthy if healthcheck is available
return 0
}
podman__healthcheck() {
for CONTAINER in $@; do
echo "Waiting for ${CONTAINER} to become healthy"
while [ $(podman healthcheck run ${CONTAINER}) ]; do
echo -n "."; sleep 5;
done
echo
# Abort if the container failed to start
if ! podman__is_ready $CONTAINER; then
exit 1
fi
done
}
podman__run() {
NAME=$1
shift
if [[ "$DEBUG_ARGS" != "" ]]; then
RUN_ARGS=$DEBUG_ARGS
else
RUN_ARGS="-dt --pod $POD --name $POD-$NAME"
fi
$PODMAN run $RUN_ARGS --replace "$@"
}
podman__run_proxy() {
podman__run proxy \
-v $CERTS_PATH:/etc/certs:ro \
$LETSENCRYPT_VOLUME \
-e APP_WEBSITE_DOMAIN \
-e SSL_CERTIFICATE=${KOLAB_SSL_CERTIFICATE} \
-e SSL_CERTIFICATE_KEY=${KOLAB_SSL_CERTIFICATE_KEY} \
-e WEBAPP_BACKEND="http://localhost:8000" \
-e MEET_BACKEND="http://localhost:12080" \
-e ROUNDCUBE_BACKEND="http://localhost:8080" \
-e DAV_BACKEND="http://localhost:11080" \
-e DAV_PATH="/dav" \
-e COLLABORA_BACKEND="http://localhost:9980" \
-e SIEVE_BACKEND="localhost:4190" \
kolab-proxy:latest $@
}
podman__run_roundcube() {
podman__run roundcube \
-v ./ext:/src.orig:ro \
-e APP_DOMAIN \
-e DES_KEY \
-e DB_HOST \
-e DB_RC_DATABASE="roundcube" \
-e DB_RC_USERNAME="roundcube" \
-e DB_RC_PASSWORD="${DB_PASSWORD:?"missing env variable"}" \
-e IMAP_HOST=127.0.0.1 \
-e IMAP_PORT=11143 \
-e IMAP_ADMIN_LOGIN \
-e IMAP_ADMIN_PASSWORD \
-e SUBMISSION_HOST=127.0.0.1 \
-e SUBMISSION_ENCRYPTION=starttls \
-e SUBMISSION_PORT=10587 \
-e IMAP_DEBUG \
-e LOG_DRIVER=stdout \
-e KOLAB_FILES_SERVER_URL=http://localhost:8080/chwala \
-e FILEAPI_WOPI_OFFICE=http://localhost:9980 \
-e FILEAPI_KOLABFILES_BASEURI=http://localhost:8000/api \
-e FILE_API_SERVER_URL=http://localhost:8080/chwala/api/ \
-e KOLAB_ADDRESSBOOK_CARDDAV_SERVER=http://localhost:11080/dav \
-e CALENDAR_CALDAV_SERVER=http://localhost:11080/dav \
-e TASKLIST_CALDAV_SERVER=http://localhost:11080/dav \
+ -e PASSPORT_WEBMAIL_SSO_CLIENT_ID \
+ -e PASSPORT_WEBMAIL_SSO_CLIENT_SECRET \
+ -e OAUTH_TOKEN_URI=http://localhost:8000/oauth/token/ \
+ -e OAUTH_REDIRECT_URI="https://${HOST}${WEBMAIL_URL}index.php/login/oauth" \
+ -e WEBMAIL_PATH="${WEBMAIL_URL}" \
-e REDIS_HOST=localhost \
-e REDIS_PASSWORD="${REDIS_PASSWORD:?"missing env variable"}" \
roundcube:latest $@
}
podman__run_mariadb() {
podman__run mariadb \
$MARIADB_STORAGE \
-e MYSQL_ROOT_PASSWORD=${DB_ROOT_PASSWORD:?"missing env variable"} \
-e TZ="+02:00" \
-e DB_HKCCP_DATABASE="kolabdev" \
-e DB_HKCCP_USERNAME="kolabdev" \
-e DB_HKCCP_PASSWORD=${DB_PASSWORD:?"missing env variable"} \
-e DB_KOLAB_DATABASE="kolab" \
-e DB_KOLAB_USERNAME="kolab" \
-e DB_KOLAB_PASSWORD=${DB_PASSWORD:?"missing env variable"} \
-e DB_RC_DATABASE="roundcube" \
-e DB_RC_USERNAME="roundcube" \
-e DB_RC_PASSWORD=${DB_PASSWORD:?"missing env variable"} \
--health-cmd "mysqladmin -u root ping && test -e /tmp/initialized" \
mariadb:latest $@
}
podman__run_ldap() {
podman__run ldap \
$LDAP_STORAGE \
-e APP_DOMAIN \
-e LDAP_BASE_DN="dc=mgmt,dc=com" \
-e LDAP_DOMAIN_BASE_DN="ou=Domains,dc=mgmt,dc=com" \
-e LDAP_HOSTS=ldap \
-e LDAP_PORT=389 \
-e LDAP_SERVICE_BIND_DN="uid=kolab-service,ou=Special Users,dc=mgmt,dc=com" \
-e LDAP_SERVICE_BIND_PW="simple123" \
-e LDAP_USE_SSL=false \
-e LDAP_USE_TLS=false \
-e LDAP_ADMIN_BIND_DN="cn=Directory Manager" \
-e LDAP_ADMIN_BIND_PW="simple123" \
-e LDAP_ADMIN_ROOT_DN="dc=mgmt,dc=com" \
-e LDAP_HOSTED_BIND_DN="uid=hosted-kolab-service,ou=Special Users,dc=mgmt,dc=com" \
-e LDAP_HOSTED_BIND_PW="simple123" \
-e LDAP_HOSTED_ROOT_DN="dc=hosted,dc=com" \
-e IMAP_ADMIN_LOGIN \
-e IMAP_ADMIN_PASSWORD \
--health-cmd "systemctl status dirsrv@kolab || exit 1" \
ldap:latest $@
}
podman__run_redis() {
podman__run redis \
$REDIS_STORAGE \
-e REDIS_PASSWORD="${REDIS_PASSWORD:?"missing env variable"}" \
--health-cmd "redis-cli ping || exit 1" \
redis:latest $@
}
podman__run_minio() {
podman__run minio \
$MINIO_STORAGE \
-e MINIO_ROOT_USER=${MINIO_USER:?"missing env variable"} \
-e MINIO_ROOT_PASSWORD=${MINIO_PASSWORD:?"missing env variable"} \
--health-cmd "mc ready local || exit 1" \
--entrypoint sh \
quay.io/minio/minio:latest -c 'mkdir -p /data/kolab && minio server /data --console-address ":9001"'
}
podman__run_webapp() {
# We run with a fixed config.demo overlay and override the environment with ci/env
podman__run webapp \
--env-file=$ENV_FILE \
-v ./src:/src/kolabsrc.orig:ro \
-v ./$CONFIG/src:/src/overlay:ro \
-e NOENVFILE=true \
-e APP_SERVICES_ALLOWED_DOMAINS="webapp,localhost,services.$HOST" \
-e KOLAB_ROLE=combined \
-e PASSPORT_PRIVATE_KEY="$PASSPORT_PRIVATE_KEY" \
-e PASSPORT_PUBLIC_KEY="$PASSPORT_PUBLIC_KEY" \
-e MINIO_ENDPOINT="http://localhost:9000" \
-e MEET_SERVER_URLS="http://127.0.0.1:12080/meetmedia/api/" \
-e MEET_SERVER_VERIFY_TLS=false \
--health-cmd "./artisan octane:status || exit 1" \
kolab-webapp:latest
}
podman__run_imap() {
podman__run imap \
$IMAP_SPOOL_STORAGE \
$IMAP_LIB_STORAGE \
-e APP_SERVICES_DOMAIN="localhost" \
-e SERVICES_PORT=8000 \
-e IMAP_ADMIN_LOGIN \
-e IMAP_ADMIN_PASSWORD \
--health-cmd "test -e /run/saslauthd/mux && kill -0 \$(cat /var/run/master.pid)" \
kolab-imap:latest $@
}
podman__run_postfix() {
podman__run postfix \
--privileged \
$POSTFIX_SPOOL_STORAGE \
$POSTFIX_LIB_STORAGE \
-v $CERTS_PATH:/etc/certs:ro \
$LETSENCRYPT_VOLUME \
-e SSL_CERTIFICATE="$KOLAB_SSL_CERTIFICATE" \
-e SSL_CERTIFICATE_FULLCHAIN="$KOLAB_SSL_CERTIFICATE_FULLCHAIN" \
-e SSL_CERTIFICATE_KEY="$KOLAB_SSL_CERTIFICATE_KEY" \
-e APP_DOMAIN \
-e APP_SERVICES_DOMAIN="localhost" \
-e SERVICES_PORT=8000 \
-e AMAVIS_HOST=127.0.0.1 \
-e DB_HOST=127.0.0.1 \
-e DB_USERNAME \
-e DB_PASSWORD \
-e DB_DATABASE \
-e LMTP_DESTINATION="localhost:11024" \
-e WITH_CONTENTFILTER \
--health-cmd "test -e /run/saslauthd/mux && kill -0 \$(cat /var/spool/postfix/pid/master.pid)" \
kolab-postfix:latest $@
}
podman__run_amavis() {
podman__run amavis \
-e APP_DOMAIN \
-e POSTFIX_HOST=localhost \
-e DB_HOST=localhost \
-e DB_USERNAME \
-e DB_PASSWORD \
-e DB_DATABASE \
kolab-amavis:latest $@
}
podman__run_collabora() {
podman__run collabora \
--privileged \
-e ALLOWED_HOSTS=${APP_DOMAIN} \
kolab-collabora:latest $@
}
podman__run_synapse() {
podman__run synapse \
$SYNAPSE_STORAGE \
-v $CERTS_PATH:/etc/certs:ro \
-e APP_DOMAIN \
-e KOLAB_URL="http://127.0.0.1:8000" \
-e SYNAPSE_OAUTH_CLIENT_ID="${PASSPORT_SYNAPSE_OAUTH_CLIENT_ID:?"missing env variable"}" \
-e SYNAPSE_OAUTH_CLIENT_SECRET="${PASSPORT_SYNAPSE_OAUTH_CLIENT_SECRET:?"missing env variable"}" \
synapse:latest $@
}
podman__run_element() {
podman__run element \
-e APP_DOMAIN \
element:latest $@
}
podman__run_vector() {
podman__run vector \
vector:latest $@
}
podman__run_meet() {
podman__run meet \
-v ./meet/server:/src/meet:ro \
-e WEBRTC_LISTEN_IP=0.0.0.0 \
-e WEBRTC_ANNOUNCED_ADDRESS=${PUBLIC_IP:?"missing env variable"} \
-e PUBLIC_DOMAIN=$APP_DOMAIN \
-e LISTENING_HOST=127.0.0.1 \
-e LISTENING_PORT=12080 \
-e DEBUG="*" \
-e TURN_SERVER=none \
-e AUTH_TOKEN=${MEET_SERVER_TOKEN} \
-e WEBHOOK_TOKEN=${MEET_WEBHOOK_TOKEN} \
-e WEBHOOK_URL=$APP_DOMAIN/api/webhooks/meet \
-e SSL_CERT=none \
-e FORCE_WSS=true \
kolab-meet:latest $@
}
function pin_commit() {
git ls-remote --exit-code -h "$1" "refs/heads/$2" | awk '{print $1}'
}
pin_git_refs() {
echo "Pinning commits"
# This are the pinned commits that are going to be used for the base images
export KOLAB_GIT_REMOTE=https://git.kolab.org/source/kolab
export KOLAB_GIT_REF=$(pin_commit "$KOLAB_GIT_REMOTE" "master")
export GIT_REMOTE_ROUNDCUBEMAIL=https://git.kolab.org/source/roundcubemail.git
export GIT_REF_ROUNDCUBEMAIL=$(pin_commit "$GIT_REMOTE_ROUNDCUBEMAIL" "dev/kolab-1.6")
export GIT_REMOTE_ROUNDCUBEMAIL_PLUGINS=https://git.kolab.org/diffusion/RPK/roundcubemail-plugins-kolab.git
export GIT_REF_ROUNDCUBEMAIL_PLUGINS=$(pin_commit "$GIT_REMOTE_ROUNDCUBEMAIL_PLUGINS" "master")
export GIT_REMOTE_CHWALA=https://git.kolab.org/diffusion/C/chwala.git
export GIT_REF_CHWALA=$(pin_commit "$GIT_REMOTE_CHWALA" "master")
export GIT_REMOTE_SYNCROTON=https://git.kolab.org/diffusion/S/syncroton.git
export GIT_REF_SYNCROTON=$(pin_commit "$GIT_REMOTE_SYNCROTON" "master")
export GIT_REMOTE_AUTOCONF=https://git.kolab.org/diffusion/AC/autoconf.git
export GIT_REF_AUTOCONF=$(pin_commit "$GIT_REMOTE_AUTOCONF" "master")
export GIT_REMOTE_IRONY=https://git.kolab.org/source/iRony.git
export GIT_REF_IRONY=$(pin_commit "$GIT_REMOTE_IRONY" "master")
export GIT_REMOTE_FREEBUSY=https://git.kolab.org/diffusion/F/freebusy.git
export GIT_REF_FREEBUSY=$(pin_commit "$GIT_REMOTE_FREEBUSY" "master")
export IMAP_GIT_REMOTE=https://git.kolab.org/source/cyrus-imapd
export IMAP_GIT_REF=$(pin_commit "$IMAP_GIT_REMOTE" "dev/kolab-3.6")
}
diff --git a/ci/env b/ci/env
index aeb33075..6dc72ca8 100644
--- a/ci/env
+++ b/ci/env
@@ -1,176 +1,179 @@
APP_NAME=Kolab
APP_ENV=local
APP_KEY=
APP_DEBUG=true
APP_URL=https://kolab.local
APP_PUBLIC_URL=https://kolab.local
APP_DOMAIN=kolab.local
APP_WEBSITE_DOMAIN=kolab.local
APP_THEME=default
APP_TENANT_ID=5
APP_LOCALE=en
APP_LOCALES=
APP_WITH_ADMIN=1
APP_WITH_RESELLER=1
APP_WITH_SERVICES=1
APP_WITH_FILES=1
APP_WITH_WALLET=1
APP_WITH_SIGNUP=1
APP_LDAP=0
APP_IMAP=1
APP_HEADER_CSP="connect-src 'self'; child-src 'self'; font-src 'self'; form-action 'self' data:; frame-ancestors 'self'; img-src blob: data: 'self' *; media-src 'self';"
APP_HEADER_XFO=sameorigin
ASSET_URL=https://kolab.local
WEBMAIL_URL=/roundcubemail/
SUPPORT_URL=/support
LOG_CHANNEL=stdout
LOG_SLOW_REQUESTS=5
LOG_DEPRECATIONS_CHANNEL=null
LOG_LEVEL=debug
DB_CONNECTION=mysql
DB_DATABASE=kolabdev
DB_HOST=127.0.0.1
DB_PASSWORD=simple123
DB_ROOT_PASSWORD=simple123
DB_PORT=3306
DB_USERNAME=kolabdev
BROADCAST_DRIVER=redis
CACHE_DRIVER=redis
QUEUE_CONNECTION=redis
SESSION_DRIVER=file
SESSION_LIFETIME=120
MFA_DSN=mysql://roundcube:simple123@127.0.0.1/roundcube
MFA_TOTP_DIGITS=6
MFA_TOTP_INTERVAL=30
MFA_TOTP_DIGEST=sha1
IMAP_URI=localhost:11143
IMAP_HOST=localhost
IMAP_PORT=11143
IMAP_GUAM_PORT=11143
IMAP_ADMIN_LOGIN=cyrus-admin
IMAP_ADMIN_PASSWORD=simple123
IMAP_VERIFY_HOST=false
IMAP_VERIFY_PEER=false
IMAP_WITH_GROUPWARE_DEFAULT_FOLDERS=false
SMTP_HOST=localhost
SMTP_PORT=10587
MEET_SERVER_URLS=https://127.0.0.1:6443/meetmedia/api/
MEET_SERVER_VERIFY_TLS=false
MEET_WEBRTC_LISTEN_IP='127.0.0.1'
MEET_PUBLIC_DOMAIN=kolab.local
MEET_LISTENING_HOST=127.0.0.1
PGP_ENABLE=true
PGP_BINARY=/usr/bin/gpg
PGP_AGENT=/usr/bin/gpg-agent
PGP_GPGCONF=/usr/bin/gpgconf
PGP_LENGTH=
REDIS_HOST=localhost
REDIS_PASSWORD=simple123
REDIS_PORT=6379
OCTANE_HTTP_HOST=kolab.local
SWOOLE_PACKAGE_MAX_LENGTH=10485760
MAIL_MAILER=smtp
MAIL_HOST=localhost
MAIL_PORT=587
MAIL_USERNAME="noreply@kolab.local"
MAIL_PASSWORD="simple123"
MAIL_ENCRYPTION=starttls
MAIL_FROM_ADDRESS="noreply@kolab.local"
MAIL_FROM_NAME="kolab.local"
MAIL_REPLYTO_ADDRESS="noreply@kolab.local"
MAIL_REPLYTO_NAME=null
MAIL_VERIFY_PEER='false'
RATELIMIT_WHITELIST="noreply@kolab.local"
DNS_TTL=3600
DNS_SPF="v=spf1 mx -all"
DNS_STATIC="%s. MX 10 ext-mx01.mykolab.com."
DNS_COPY_FROM=null
MIX_ASSET_PATH='/'
PASSWORD_POLICY=
COMPANY_NAME=kolab.org
COMPANY_ADDRESS=
COMPANY_DETAILS=
COMPANY_EMAIL=
COMPANY_LOGO=
COMPANY_FOOTER=
VAT_COUNTRIES=CH,LI
VAT_RATE=7.7
KB_ACCOUNT_DELETE=
KB_ACCOUNT_SUSPENDED=
KB_PAYMENT_SYSTEM=
KOLAB_SSL_CERTIFICATE=/etc/certs/kolab.local.cert
KOLAB_SSL_CERTIFICATE_FULLCHAIN=/etc/certs/kolab.local.chain.pem
KOLAB_SSL_CERTIFICATE_KEY=/etc/certs/kolab.local.key
OPENEXCHANGERATES_API_KEY=
FIREBASE_API_KEY=
MINIO_ENDPOINT=http://localhost:9000
MINIO_USER=minio
MINIO_PASSWORD=simple123
MINIO_BUCKET=kolab
FILESYSTEM_DISK=minio
TRUSTED_PROXIES="172.18.0.7/8,127.0.0.1/8"
MOLLIE_KEY=
STRIPE_KEY=
STRIPE_PUBLIC_KEY=
STRIPE_WEBHOOK_SECRET=
APP_PASSPHRASE=simple123
MEET_WEBHOOK_TOKEN=simple123
MEET_SERVER_TOKEN=simple123
APP_KEY=base64:EFXja/fHF01EMKiXW200b5zWOynbPzAHfUM78bOp+28=
PASSPORT_PROXY_OAUTH_CLIENT_ID=5909ca4f-df7e-45fe-b355-e7c195aef117
PASSPORT_PROXY_OAUTH_CLIENT_SECRET=3URb+3JGJM9wPuDnlUSTPOw2mqmHsoOV8NXanx9xwQM=
PASSPORT_SYNAPSE_OAUTH_CLIENT_ID=2909ca4f-df7e-45fe-b355-e7c195aef112
PASSPORT_SYNAPSE_OAUTH_CLIENT_SECRET=2URb+3JGJM9wPuDnlUSTPOw2mqmHsoOV8NXanx9xwQM=
+PASSPORT_WEBMAIL_SSO_CLIENT_ID=1909ca4f-df7e-45fe-b355-e7c195aef118
+PASSPORT_WEBMAIL_SSO_CLIENT_SECRET=1URb+3JGJM9wPuDnlUSTPOw2mqmHsoOV8NXanx9xwQM=
+
DES_KEY=kBxUM/53N9p9abusAoT0ZEAxwI2pxFz/
KOLAB_GIT_REF=master
KOLAB_GIT_REMOTE=https://git.kolab.org/source/kolab
GIT_REF_ROUNDCUBEMAIL=dev/kolab-1.5
GIT_REMOTE_ROUNDCUBEMAIL=https://git.kolab.org/source/roundcubemail.git
GIT_REF_ROUNDCUBEMAIL_PLUGINS=master
GIT_REMOTE_ROUNDCUBEMAIL_PLUGINS=https://git.kolab.org/diffusion/RPK/roundcubemail-plugins-kolab.git
GIT_REF_CHWALA=master
GIT_REMOTE_CHWALA=https://git.kolab.org/diffusion/C/chwala.git
GIT_REF_SYNCROTON=master
GIT_REMOTE_SYNCROTON=https://git.kolab.org/diffusion/S/syncroton.git
GIT_REF_AUTOCONF=master
GIT_REMOTE_AUTOCONF=https://git.kolab.org/diffusion/AC/autoconf.git
GIT_REF_IRONY=master
GIT_REMOTE_IRONY=https://git.kolab.org/source/iRony.git
GIT_REF_FREEBUSY=master
GIT_REMOTE_FREEBUSY=https://git.kolab.org/diffusion/F/freebusy.git
IMAP_GIT_REF=dev/kolab-3.6
IMAP_GIT_REMOTE=https://git.kolab.org/source/cyrus-imapd
diff --git a/ci/testctl b/ci/testctl
index 7c8c6de4..de6c6bad 100755
--- a/ci/testctl
+++ b/ci/testctl
@@ -1,550 +1,553 @@
#!/bin/bash
base_dir="$(dirname $(realpath "$0"))"
pushd "${base_dir}"
pushd ..
set -e
PASSPORT_PRIVATE_KEY="-----BEGIN PRIVATE KEY-----
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
bakhie7hJBP7BoOup+dD5NQPlXBQ434=
-----END PRIVATE KEY-----"
PASSPORT_PUBLIC_KEY="-----BEGIN PUBLIC KEY-----
MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEApmHkae115z3vMF9IjiUa
XrJH1Ljifxqs+XbDCFhQenz2iOf/bZDBMqfrwhBe3hVywa13kIuhf1TZlcJ/nRhE
IZIbg6BF6/GeHN998Cx/IjhBeFkG7f1hdxEXY5ibd7yq8vAfzizZpnCu4+LM/NvI
ei9mU+hj3GxrDbpMQTHCDDqX5aNEix8uFU4XaOm9UOJw9ivz19cqcnxWqJ49znxw
XUlS5k4Hewbwf2s2BWFhz+CDWPHMpWViLQ17qj5QRklNn39sUymP1kXKP3Y76zvW
zNVniPvFt+hHixxEa7tUEaTdtk4FgkNnWy0bFa7DIPC8ukjHvHHg10LeQiygDduI
xbdVJwYK/qitU68ZAbbufldlj2FoVLwSyP9qpxUIdRoljCop1kDu6xQiAq0VHEAV
LtgMpZhtD/6D4z644QJ8atx4Ljp/HEtTngaTh+/vLc9AnhHclX0/JmlbP1VkWWxG
9FIxS0TVPolRBs8948kLioTif9lrltJicxd6T0OuA5fny8l6hdSlzaD3pnr5pkYw
mVn5FgBAFnd/skX6DsRs+eb2lNahkvNZZ15z9UeU2Rl6J9uBx0vbkcB7eiSCPhRM
IKq/CtkyEgz8ce4kG18fJHDFDASRvGjaBu91lV5h7NLmhFLFzMvb7XoHrv/yD6TV
E5W47J/DrfrevJkzS1GV++MCAwEAAQ==
-----END PUBLIC KEY-----"
export HOST=kolab.local
export APP_WEBSITE_DOMAIN="$HOST"
export APP_DOMAIN=$HOST
export DES_KEY=kBxUM/53N9p9abusAoT0ZEAxwI2pxFz/
export DB_HOST=127.0.0.1
export KOLAB_SSL_CERTIFICATE=/etc/certs/kolab.local.cert
export KOLAB_SSL_CERTIFICATE_KEY=/etc/certs/kolab.local.key
export IMAP_HOST=localhost
export IMAP_PORT=11143
export IMAP_ADMIN_LOGIN=cyrus-admin
export IMAP_ADMIN_PASSWORD=simple123
export MAIL_HOST=localhost
export MAIL_PORT=10587
export IMAP_DEBUG=true
export DAV_URI=http://localhost:11080/dav/
export FILEAPI_WOPI_OFFICE=https://$HOST
export CALENDAR_CALDAV_SERVER=http://localhost:11080/dav
export KOLAB_ADDRESSBOOK_CARDDAV_SERVER=http://localhost:11080/dav
export DB_ROOT_PASSWORD=simple123
export DB_HKCCP_PASSWORD=simple123
export DB_KOLAB_PASSWORD=simple123
export DB_RC_PASSWORD=simple123
export DB_PASSWORD=simple123
export DB_USERNAME=kolabdev
export DB_DATABASE=kolabdev
export MINIO_ROOT_USER=minio
export MINIO_ROOT_PASSWORD=simple123
export MINIO_USER=minio
export MINIO_PASSWORD=simple123
export MEET_SERVER_TOKEN=simple123
export MEET_WEBHOOK_TOKEN=simple123
export PUBLIC_IP=127.0.0.1
export REDIS_PASSWORD=simple123
export CERTS_PATH=./ci/certs
export IMAP_SPOOL_STORAGE=--mount=type=tmpfs,tmpfs-size=128M,tmpfs-mode=777,destination=/var/spool/imap,U=true,notmpcopyup
export IMAP_LIB_STORAGE=--mount=type=tmpfs,tmpfs-size=128M,tmpfs-mode=777,destination=/var/lib/imap,U=true,notmpcopyup
export SYNAPSE_STORAGE=--mount=type=tmpfs,tmpfs-size=128M,tmpfs-mode=777,destination=/data,U=true,notmpcopyup
export MARIADB_STORAGE=--mount=type=tmpfs,tmpfs-size=512M,destination=/var/lib/mysql,U=true
export REDIS_STORAGE=--mount=type=tmpfs,tmpfs-size=128M,destination=/var/lib/redis,U=true
export MINIO_STORAGE=--mount=type=tmpfs,tmpfs-size=128M,destination=/data,U=true
export LDAP_STORAGE=--mount=type=tmpfs,tmpfs-size=128M,destination=/ldapdata,U=true,notmpcopyup
export PASSPORT_SYNAPSE_OAUTH_CLIENT_ID=2909ca4f-df7e-45fe-b355-e7c195aef112
export PASSPORT_SYNAPSE_OAUTH_CLIENT_SECRET=2URb+3JGJM9wPuDnlUSTPOw2mqmHsoOV8NXanx9xwQM=
+export PASSPORT_WEBMAIL_SSO_CLIENT_ID=1909ca4f-df7e-45fe-b355-e7c195aef118
+export PASSPORT_WEBMAIL_SSO_CLIENT_SECRET=1URb+3JGJM9wPuDnlUSTPOw2mqmHsoOV8NXanx9xwQM=
+export WEBMAIL_URL=/roundcubemail/
export WITH_CONTENTFILTER=true
export ENV_FILE=ci/env
export PODMAN_IGNORE_CGROUPSV1_WARNING=true
PODMAN="podman"
source bin/podman_shared
# Teardown the currently running environments (both the tests and dev pod)
kolab__teardown() {
$PODMAN pod rm --force tests
$PODMAN pod rm --force dev
}
podman__build_tests() {
podman__build docker/tests kolab-tests --ulimit nofile=65535:65535
}
# Build all containers required for testing
kolab__build() {
pin_git_refs
if [[ $1 != "" ]]; then
if declare -f "podman__build_$1" >/dev/null 2>&1; then
podman__build_$1
else
podman__build docker/$1 $1
fi
else
podman__build_base
podman__build_webapp
podman__build_meet
podman__build_imap
podman__build docker/mariadb mariadb
podman__build docker/redis redis
podman__build_proxy
podman__build docker/synapse synapse
podman__build docker/element element
podman__build_roundcube
podman__build_tests
env CERT_DIR=ci/certs APP_DOMAIN=$HOST bin/regen-certs
fi
}
# Setup the test environment in the "tests" pod.
kolab__setup() {
echo "Build"
kolab__build
echo "Setup"
export POD=tests
# Create the pod first
$PODMAN pod create --replace --name $POD
podman__run_mariadb
podman__run_redis
podman__healthcheck $POD-mariadb $POD-redis
podman__run_imap
podman__healthcheck $POD-imap
export CONFIG=config.demo
podman__run_webapp
podman__healthcheck $POD-webapp
# Ensure all commands are processed
echo "Flushing work queue"
$PODMAN exec -ti $POD-webapp ./artisan queue:work --stop-when-empty
podman__run_minio
podman__healthcheck $POD-minio
# Validate the test environment
kolab__validate $POD
}
# Execute a testsuite (testsuite|quicktest|tests/Feature/Jobs/WalletCheckTest.php). Requires setup to have been executed previously to prepare the "tests" pod.
kolab__test() {
export POD=tests
$PODMAN run -ti --pod tests --name $POD-kolab-tests --replace \
--env-file=ci/env \
-v ./src:/src/kolabsrc.orig:ro \
-e APP_SERVICES_DOMAINS="localhost" \
-e PASSPORT_PRIVATE_KEY="$PASSPORT_PRIVATE_KEY" \
-e PASSPORT_PUBLIC_KEY="$PASSPORT_PUBLIC_KEY" \
-e APP_URL="http://kolab.local" \
-e APP_PUBLIC_URL="http://kolab.local" \
-e APP_HEADER_CSP="" \
-e APP_HEADER_XFO="" \
-e ASSET_URL="http://kolab.local" \
-e MEET_SERVER_URLS="http://kolab.local/meetmedia/api/" \
-e DAV_URI \
kolab-tests:latest /init.sh $@
}
# Validate that the proxy works
kolab__proxytest() {
# Without element
$PODMAN run -ti --rm \
-v ./ci/certs/:/etc/certs/:ro \
-e APP_WEBSITE_DOMAIN \
-e SSL_CERTIFICATE=${KOLAB_SSL_CERTIFICATE} \
-e SSL_CERTIFICATE_KEY=${KOLAB_SSL_CERTIFICATE_KEY} \
-e WEBAPP_BACKEND="http://localhost:8000" \
-e MEET_BACKEND="http://localhost:12080" \
-e ROUNDCUBE_BACKEND="http://localhost:8080" \
-e DAV_BACKEND="http://localhost:11080" \
-e COLLABORA_BACKEND="http://localhost:9980" \
-e SIEVE_BACKEND="localhost:4190" \
kolab-proxy:latest /init.sh validate
# With element
$PODMAN run -ti --rm \
-v ./ci/certs/:/etc/certs/:ro \
-e APP_WEBSITE_DOMAIN \
-e SSL_CERTIFICATE=${KOLAB_SSL_CERTIFICATE} \
-e SSL_CERTIFICATE_KEY=${KOLAB_SSL_CERTIFICATE_KEY} \
-e WEBAPP_BACKEND="http://localhost:8000" \
-e MEET_BACKEND="http://localhost:12080" \
-e ROUNDCUBE_BACKEND="http://localhost:8080" \
-e DAV_BACKEND="http://localhost:11080" \
-e COLLABORA_BACKEND="http://localhost:9980" \
-e SIEVE_BACKEND="localhost:4190" \
-e ELEMENT_BACKEND=http://element:8880 \
-e MATRIX_BACKEND=http://synapse:8008 \
kolab-proxy:latest /init.sh validate
}
# Validate that imap works
kolab__imaptest() {
# With tls
$PODMAN run -ti --rm \
-v ./ci/certs/:/etc/certs/:ro \
$IMAP_SPOOL_STORAGE \
$IMAP_LIB_STORAGE \
-e SSL_CERTIFICATE=${KOLAB_SSL_CERTIFICATE} \
-e SSL_CERTIFICATE_KEY=${KOLAB_SSL_CERTIFICATE_KEY} \
-e TLS_SERVER_CA_FILE=${KOLAB_SSL_CERTIFICATE_KEY} \
-e APP_SERVICES_DOMAIN="localhost" \
-e SERVICES_PORT=8000 \
-e IMAP_ADMIN_LOGIN \
-e IMAP_ADMIN_PASSWORD \
-e WITH_TLS="true" \
kolab-imap:latest /init.sh validate
# Without tls
$PODMAN run -ti --rm \
$IMAP_SPOOL_STORAGE \
$IMAP_LIB_STORAGE \
-e APP_SERVICES_DOMAIN="localhost" \
-e SERVICES_PORT=8000 \
-e IMAP_ADMIN_LOGIN \
-e IMAP_ADMIN_PASSWORD \
kolab-imap:latest /init.sh validate
# Frontend with tls
$PODMAN run -ti --rm \
-v ./ci/certs/:/etc/certs/:ro \
$IMAP_SPOOL_STORAGE \
$IMAP_LIB_STORAGE \
-e SSL_CERTIFICATE=${KOLAB_SSL_CERTIFICATE} \
-e SSL_CERTIFICATE_KEY=${KOLAB_SSL_CERTIFICATE_KEY} \
-e TLS_SERVER_CA_FILE=${KOLAB_SSL_CERTIFICATE_KEY} \
-e APP_SERVICES_DOMAIN="localhost" \
-e SERVICES_PORT=8000 \
-e IMAP_ADMIN_LOGIN \
-e IMAP_ADMIN_PASSWORD \
-e ROLE="frontend" \
-e WITH_TLS="true" \
kolab-imap:latest /init.sh validate
}
# Lint the kolab4 codebase
kolab__lint() {
$PODMAN run --rm -ti \
-v ./src:/src/kolabsrc.orig:ro \
kolab-tests:latest /init.sh lint
}
# Setup the test environment and run a complete kolab4 testsuite
kolab__testrun() {
echo "Setup"
kolab__setup
echo "Test"
kolab__test testsuite
}
# Setup the test environment and run all available testsuites (including roundcube etc.)
kolab__testrun_complete() {
echo "Setup"
kolab__setup
echo "Test"
kolab__test lint
kolab__test testsuite
kolab__rctest syncroton lint
kolab__rctest syncroton testsuite
kolab__rctest irony lint
# kolab__rctest irony testsuite
kolab__rctest roundcubemail-plugins-kolab lint
# kolab__rctest roundcubemail-plugins-kolab testsuite
}
# Get a shell inside the container. Without arguments his gives you a shell in the test container, with argument inside one of the containers in the dev pod.
kolab__shell() {
if [[ $1 != "" ]]; then
POD=${POD:-dev}
container=$1
shift
command podman exec -ti $POD-$container /bin/bash
else
kolab__test shell
fi
}
# Run the roundcube testsuite
kolab__rctest() {
export POD=tests
DEBUG_ARGS="-ti --rm --pod tests --name debug-$1 -e KOLABOBJECTS_COMPAT_MODE=true -e DEBUG_USERS=john@kolab.org"
podman__run_roundcube ./init.sh $@
}
# Run some webserver configuration checks
kolab__rcwebservertest() {
export POD=dev
set -e
if $PODMAN exec $POD-roundcube curl -s -I -H 'Accept-Encoding: br,gzip,deflate' http://127.0.0.1:8080/roundcubemail/program/js/app.js | grep "Content-Encoding: gzip"; then
echo "deflate enabled"
else
echo "deflate not enabled"
exit 1
fi
if $PODMAN exec $POD-roundcube curl -s -I http://127.0.0.1:8080/roundcubemail/ | grep "Content-Security-Policy"; then
echo "serving a Content-Security-Policy"
else
echo "Content-Security-Policy is missing"
exit 1
fi
}
# Get a shell inside the roundcube test container to run/debug tests
kolab__rcshell() {
export POD=tests
DEBUG_ARGS="-ti --rm --pod tests --name debug-$1 -e KOLABOBJECTS_COMPAT_MODE=true -e DEBUG_USERS=john@kolab.org"
podman__run_roundcube ./init.sh $@
}
# Validate a deployment, currently only used for test pod
kolab__validate() {
POD=$1
$PODMAN exec $POD-imap testsaslauthd -u cyrus-admin -p simple123
$PODMAN exec $POD-imap testsaslauthd -u "john@kolab.org" -p simple123
# Ensure the inbox is created
FOUND=false
for i in {1..60}; do
if $PODMAN exec $POD-imap bash -c 'echo "lm" | cyradm --auth PLAIN -u cyrus-admin -w simple123 --port 11143 localhost | grep "user/john@kolab.org"'; then
echo "Found mailbox";
FOUND=true
break
else
echo "Waiting for mailbox";
sleep 1;
fi
done
if ! $FOUND; then
echo "Failed to find the inbox for john@kolab.org"
exit 1
fi
}
kolab__mailtransporttest() {
POD=${POD:-dev}
if $PODMAN run --rm -ti --pod=$POD kolab-utils:latest ./mailtransporttest.py --timeout 1 --sender-username admin@kolab.local --sender-password simple123 --sender-host localhost --sender-port 6465 --recipient-username noreply@kolab.local --recipient-password simple123 --recipient-host localhost --recipient-port 6993 --validate; then
echo "Success"
else
exit 1
fi
}
# Deploy a test deployment in the "dev" pod
kolab__deploy() {
export POD=dev
if [ `getenforce` == "Enforcing" ]; then
# Patches on how to correctly configure selinux are welcome
echo "selinux breaks networking, please disable"
exit 1
fi
# Create the pod first
$PODMAN pod create \
--replace \
--add-host=kolab.local:127.0.0.1 \
--publish "443:6443" \
--publish "465:6465" \
--publish "587:6587" \
--publish "143:6143" \
--publish "993:6993" \
--publish "6379:6379" \
--publish "3306:3306" \
--publish "11080:11080" \
--publish "11143:11143" \
--publish "11993:11993" \
--publish "44444:44444/udp" \
--publish "44444:44444/tcp" \
--name $POD
podman__run_mariadb
podman__run_redis
podman__healthcheck $POD-mariadb $POD-redis
# IMAP must be avialable for the seeder
podman__run_imap
podman__healthcheck $POD-imap
export CONFIG=config.prod
podman__run_webapp
podman__healthcheck $POD-webapp
# Ensure all commands are processed
echo "Flushing work queue"
$PODMAN exec -ti $POD-webapp ./artisan queue:work --stop-when-empty
$PODMAN exec $POD-webapp ./artisan user:password "admin@kolab.local" "simple123"
podman__run_synapse
podman__run_element
podman__run_minio
podman__healthcheck $POD-minio
podman__run_meet
podman__run_roundcube
podman__run_proxy
podman__run_postfix
podman__run_amavis
podman__run_collabora
echo "Deployment complete"
}
# Re-run a container in the dev pod
kolab__run() {
POD=dev
if [ "$1" == "--build" ]; then
shift
kolab__build $1
fi
podman__run_$1
}
kolab__debug() {
DEBUG_ARGS="-ti --rm --name debug-$1"
podman__run_$1 /bin/bash
}
# Monitor vue files for changes, and automatically reload the dev webapp container if anything changes. Requires "entr" on the host.
kolab__watch() {
trap 'kill $(jobs -p) 2>/dev/null' EXIT
find src/resources/ src/app -regex '.*\.\(vue\|php\|js\)$' | entr podman exec -ti dev-webapp bash -c "/update-source.sh; ./artisan octane:reload" &
podman exec -ti dev-webapp npm run watch
}
# Get the host to trust the generated ca
kolab__add_ca_trust() {
sudo trust anchor --store ci/certs/ca.cert
sudo update-ca-trust
}
# Generate mail in the admin inbox
kolab__generate_mail() {
$PODMAN run --pod=dev -t --rm kolab-utils:latest ./generatemail.py --maxAttachmentSize=3 --type=mail --count 100 --username admin@kolab.local --password simple123 --host localhost --port 11143 INBOX
}
# Trigger an activesync sync on the admin inbox
kolab__syncroton_sync() {
$PODMAN run -t --network=host --add-host=kolab.local:127.0.0.1 --rm kolab-utils:latest ./activesynccli.py --host kolab.local --user admin@kolab.local --password simple123 sync 38b950ebd62cd9a66929c89615d0fc04
}
# Access logs of container
kolab__logs() {
POD=dev
command podman logs --tail=1000 -f $POD-$1
}
# Mysql shell
kolab__db() {
POD=${POD:-dev}
$PODMAN exec -ti $POD-mariadb /bin/bash -c "mysql -h 127.0.0.1 -u kolabdev --password=simple123 --auto-rehash kolabdev"
}
kolab__rcdb() {
POD=${POD:-dev}
$PODMAN exec -ti $POD-mariadb /bin/bash -c "mysql -h 127.0.0.1 -u roundcube --password=simple123 --auto-rehash roundcube"
}
kolab__help() {
cat <<EOF
This is the kolab test execution utility.
This script manages building the containers, setting up a test environment, and executing the tests in that environment, using podman.
To run the kolab 4 testsuite:
testctl testrun
The following commands are available:
EOF
# Grep for functions with one line of context, then prettify and remove empty lines
grep -B1 ^kolab__ $0 | sed 's/ {//' | sed '/^$/d'
}
cmdname=$1
shift
# make sure we actually *did* get passed a valid function name
if declare -f "kolab__$cmdname" >/dev/null 2>&1; then
"kolab__$cmdname" "${@:1}"
else
echo "Function $cmdname not recognized" >&2
kolab__help
exit 1
fi
diff --git a/config.demo/src/database/seeds/PassportSeeder.php b/config.demo/src/database/seeds/PassportSeeder.php
index dcd22339..4d58b973 100644
--- a/config.demo/src/database/seeds/PassportSeeder.php
+++ b/config.demo/src/database/seeds/PassportSeeder.php
@@ -1,64 +1,64 @@
<?php
namespace Database\Seeds;
use Laravel\Passport\Passport;
use Illuminate\Database\Seeder;
class PassportSeeder extends Seeder
{
/**
* Run the database seeds.
*
* This emulates:
* './artisan passport:client --password --name="Kolab Password Grant Client" --provider=users'
*
* @return void
*/
public function run()
{
//Create a password grant client for the webapp
$client = Passport::client()->forceFill([
'user_id' => null,
'name' => "Kolab Password Grant Client",
'secret' => \config('auth.proxy.client_secret'),
'provider' => 'users',
'redirect' => 'https://' . \config('app.website_domain'),
'personal_access_client' => 0,
'password_client' => 1,
'revoked' => false,
]);
$client->id = \config('auth.proxy.client_id');
$client->save();
// Create a client for Webmail SSO
$client = Passport::client()->forceFill([
'user_id' => null,
'name' => 'Webmail SSO client',
'secret' => \config('auth.sso.client_secret'),
'provider' => 'users',
- 'redirect' => 'https://' . \config('app.website_domain') . '/roundcubemail/index.php/login/oauth',
+ 'redirect' => (str_starts_with(\config('app.webmail_url'), 'http') ? '' : 'https://' . \config('app.website_domain')) . \config('app.webmail_url') . 'index.php/login/oauth',
'personal_access_client' => 0,
'password_client' => 0,
'revoked' => false,
'allowed_scopes' => ['email', 'auth.token'],
]);
$client->id = \config('auth.sso.client_id');
$client->save();
// Create a client for synapse oauth
$client = Passport::client()->forceFill([
'user_id' => null,
'name' => "Synapse oauth client",
'secret' => \config('auth.synapse.client_secret'),
'provider' => 'users',
'redirect' => 'https://' . \config('app.website_domain') . "/_synapse/client/oidc/callback",
'personal_access_client' => 0,
'password_client' => 0,
'revoked' => false,
'allowed_scopes' => ['email'],
]);
$client->id = \config('auth.synapse.client_id');
$client->save();
}
}
diff --git a/config.prod/src/database/seeds/PassportSeeder.php b/config.prod/src/database/seeds/PassportSeeder.php
index 6fc68401..4d58b973 100644
--- a/config.prod/src/database/seeds/PassportSeeder.php
+++ b/config.prod/src/database/seeds/PassportSeeder.php
@@ -1,49 +1,64 @@
<?php
namespace Database\Seeds;
use Laravel\Passport\Passport;
use Illuminate\Database\Seeder;
class PassportSeeder extends Seeder
{
/**
* Run the database seeds.
*
* This emulates:
* './artisan passport:client --password --name="Kolab Password Grant Client" --provider=users'
*
* @return void
*/
public function run()
{
//Create a password grant client for the webapp
$client = Passport::client()->forceFill([
'user_id' => null,
'name' => "Kolab Password Grant Client",
'secret' => \config('auth.proxy.client_secret'),
'provider' => 'users',
'redirect' => 'https://' . \config('app.website_domain'),
'personal_access_client' => 0,
'password_client' => 1,
'revoked' => false,
]);
$client->id = \config('auth.proxy.client_id');
$client->save();
+ // Create a client for Webmail SSO
+ $client = Passport::client()->forceFill([
+ 'user_id' => null,
+ 'name' => 'Webmail SSO client',
+ 'secret' => \config('auth.sso.client_secret'),
+ 'provider' => 'users',
+ 'redirect' => (str_starts_with(\config('app.webmail_url'), 'http') ? '' : 'https://' . \config('app.website_domain')) . \config('app.webmail_url') . 'index.php/login/oauth',
+ 'personal_access_client' => 0,
+ 'password_client' => 0,
+ 'revoked' => false,
+ 'allowed_scopes' => ['email', 'auth.token'],
+ ]);
+ $client->id = \config('auth.sso.client_id');
+ $client->save();
+
// Create a client for synapse oauth
$client = Passport::client()->forceFill([
'user_id' => null,
'name' => "Synapse oauth client",
'secret' => \config('auth.synapse.client_secret'),
'provider' => 'users',
'redirect' => 'https://' . \config('app.website_domain') . "/_synapse/client/oidc/callback",
'personal_access_client' => 0,
'password_client' => 0,
'revoked' => false,
'allowed_scopes' => ['email'],
]);
$client->id = \config('auth.synapse.client_id');
$client->save();
}
}
diff --git a/docker/roundcube/Dockerfile b/docker/roundcube/Dockerfile
index 90eb680b..3df8972d 100644
--- a/docker/roundcube/Dockerfile
+++ b/docker/roundcube/Dockerfile
@@ -1,135 +1,137 @@
FROM apheleia/almalinux9
ENV HOME=/opt/app-root/src
# 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-el9.rpm
# Install php modules
RUN sed -i -e '/^ssl/d' /etc/yum.repos.d/kolab*.repo && \
dnf config-manager --enable kolab-16 &&\
dnf -y --setopt=install_weak_deps=False --setopt tsflags= install php-kolab php-kolabformat \
composer \
diffutils \
file \
git \
make \
unzip \
curl-minimal \
mariadb \
which \
rsync \
openssl \
httpd \
patch \
php-cli \
php-common \
php-ldap \
php-opcache \
php-pecl-apcu \
php-mysqlnd \
php-gd \
php-fpm \
php-pear \
php-redis \
ImageMagick \
re2c \
npm \
wget && \
dnf clean all
RUN npm install -g less less-plugin-clean-css
WORKDIR ${HOME}
COPY rootfs/opt/app-root/src/build.sh /opt/app-root/src/
COPY rootfs/opt/app-root/src/update.sh /opt/app-root/src/
COPY rootfs/opt/app-root/src/composer.json /opt/app-root/src/
COPY rootfs/opt/app-root/src/roundcubemail-config-templates /opt/app-root/src/roundcubemail-config-templates
ARG GIT_REF_ROUNDCUBEMAIL=dev/kolab-1.6
ARG GIT_REMOTE_ROUNDCUBEMAIL=https://git.kolab.org/source/roundcubemail.git
ARG GIT_REF_ROUNDCUBEMAIL_PLUGINS=master
ARG GIT_REMOTE_ROUNDCUBEMAIL_PLUGINS=https://git.kolab.org/diffusion/RPK/roundcubemail-plugins-kolab.git
ARG GIT_REF_CHWALA=master
ARG GIT_REMOTE_CHWALA=https://git.kolab.org/diffusion/C/chwala.git
ARG GIT_REF_SYNCROTON=master
ARG GIT_REMOTE_SYNCROTON=https://git.kolab.org/diffusion/S/syncroton.git
ARG GIT_REF_AUTOCONF=master
ARG GIT_REMOTE_AUTOCONF=https://git.kolab.org/diffusion/AC/autoconf.git
ARG GIT_REF_IRONY=master
ARG GIT_REMOTE_IRONY=https://git.kolab.org/source/iRony.git
ARG GIT_REF_FREEBUSY=master
ARG GIT_REMOTE_FREEBUSY=https://git.kolab.org/diffusion/F/freebusy.git
ARG GIT_REMOTE_SKIN_ELASTIC=""
ARG GIT_REF_SKIN_ELASTIC=master
ARG SKINS=kolab
RUN /opt/app-root/src/build.sh && \
for PATH in /run/php-fpm /run/httpd /var/log/httpd /var/lib/httpd /data /opt/app-root; \
do \
/usr/bin/mkdir -p $PATH; \
/usr/bin/chmod -R 777 $PATH; \
/usr/bin/chown -R 1001:0 $PATH; \
/usr/bin/chmod -R g=u $PATH; \
done
COPY /rootfs /
RUN chmod 777 /opt/app-root/src
RUN chmod -R 777 /etc/php.ini /etc/httpd /opt/app-root/src/*.sh
VOLUME /data
ENV RUN_MIGRATIONS=true
ENV KOLABOBJECTS_COMPAT_MODE=false
ENV LOGDRIVER=logfmt
ENV SKIN=kolab
ENV PRODUCT_NAME="Kolab Groupware"
# ENV SUPPORT_URL=
# ENV FILEAPI_KOLABFILES_BASEURI=
# ENV FILEAPI_WOPI_OFFICE=
# ENV FILE_API_URL=
# ENV FILE_API_SERVER_URL=
# ENV CALENDAR_CALDAV_SERVER=
# ENV TASKLIST_CALDAV_SERVER=
# ENV KOLAB_ADDRESSBOOK_CARDDAV_SERVER=
# ENV KOLAB_FILES_URL=
# ENV KOLAB_FILES_SERVER_URL=
# ENV IMAP_HOST=
# ENV IMAP_PORT=
# ENV IMAP_TLS=
# ENV IMAP_PROXY_PROTOCOL=
# ENV IMAP_ADMIN_LOGIN=
# ENV IMAP_ADMIN_PASSWORD=
# ENV DB_RC_USERNAME=
# ENV DB_RC_PASSWORD=
# ENV DB_RC_DATABASE=
# ENV DB_HOST=
# ENV DES_KEY=
# ENV APP_DOMAIN=
# ENV PROXY_WHITELIST=
# ENV SUBMISSION_HOST=
# ENV SUBMISSION_PORT=
# ENV SUBMISSION_ENCRYPTION=
# ENV DISABLED_PLUGINS=
# ENV EXTRA_PLUGINS=
# ENV SQL_DEBUG=
# ENV MEMCACHE_DEBUG=
# ENV IMAP_DEBUG=
# ENV SMTP_DEBUG=
# ENV DAV_DEBUG=
# ENV ACTIVESYNC_DEBUG=
# ENV REDIS_HOST=
# ENV REDIS_PASSWORD=
+# ENV PASSPORT_WEBMAIL_SSO_CLIENT_ID=
+# ENV PASSPORT_WEBMAIL_SSO_CLIENT_SECRET=
ENV CALDAV_WELLKNOWN_REDIRECT_PATH="/dav/calendars/user"
ENV CARDDAV_WELLKNOWN_REDIRECT_PATH="/dav/addressbooks/user"
USER 1001
EXPOSE 8080
# 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/opt/app-root/src/roundcubemail-config-templates/config.inc.php b/docker/roundcube/rootfs/opt/app-root/src/roundcubemail-config-templates/config.inc.php
index aad9d33d..2f086ee7 100644
--- a/docker/roundcube/rootfs/opt/app-root/src/roundcubemail-config-templates/config.inc.php
+++ b/docker/roundcube/rootfs/opt/app-root/src/roundcubemail-config-templates/config.inc.php
@@ -1,229 +1,240 @@
<?php
//This check is for some reason required under phpunit
if (!function_exists("getenvlist")) {
function getenvlist($name) {
$value = getenv($name);
return $value == null ? null : explode(",", $value) ;
}
}
$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";
$components = explode('.', $_SERVER["HTTP_HOST"] ?? "");
if (count($components) > 2) {
array_shift($components);
}
$config['session_domain'] = implode('.', $components);
$config['des_key'] = getenv('DES_KEY');
$config['username_domain'] = getenv('APP_DOMAIN');
$config['use_secure_urls'] = true;
$config['mail_domain'] = '';
// IMAP Server Settings
$config['imap_host'] = (getenv('IMAP_TLS') == "true" ? "ssl://" : "") . getenv('IMAP_HOST') . ':' . getenv('IMAP_PORT');
$config['imap_delimiter'] = '/';
$config['imap_force_lsub'] = true;
if (getenv('IMAP_TLS') == "true") {
$config['imap_conn_options'] = [
'ssl' => [
'verify_peer_name' => false,
'verify_peer' => false,
'allow_self_signed' => true
],
'proxy_protocol' => getenv('IMAP_PROXY_PROTOCOL')
];
}
$config['proxy_whitelist'] = getenvlist('PROXY_WHITELIST');
// Caching and storage settings
$config['imap_cache'] = 'redis';
$config['imap_cache_ttl'] = '10d';
$config['messages_cache'] = 'db'; // no redis available
$config['message_cache_ttl'] = '10d';
$config['session_storage'] = 'redis';
$config['redis_hosts'] = [getenv('REDIS_HOST') . ':6379:3:' . getenv('REDIS_PASSWORD')];
// SMTP Server Settings
if (getenv('SUBMISSION_ENCRYPTION') == "starttls") {
$config['smtp_host'] = "tls://" . getenv('SUBMISSION_HOST') . ':' . getenv('SUBMISSION_PORT');
} else {
$config['smtp_host'] = getenv('SUBMISSION_HOST') . ':' . getenv('SUBMISSION_PORT');
}
$config['smtp_user'] = '%u';
$config['smtp_pass'] = '%p';
$config['smtp_helo_host'] = $_SERVER["HTTP_HOST"] ?? null;
if (!empty(getenv('SUBMISSION_ENCRYPTION'))) {
$config['smtp_conn_options'] = [
'ssl' => [
'verify_peer_name' => false,
'verify_peer' => false,
'allow_self_signed' => true
]
];
}
// Kolab specific defaults
$config['product_name'] = getenv('PRODUCT_NAME');
$config['support_url'] = getenv('SUPPORT_URL');
$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
$plugins = [
'acl',
'archive',
'calendar',
'jqueryui',
'kolab_activesync',
'kolab_addressbook',
'kolab_files',
'managesieve',
'newmail_notifier',
'odfviewer',
'redundant_attachments',
'contextmenu',
'tasklist',
'enigma',
];
if (getenv('KOLABOBJECTS_COMPAT_MODE') == "true") {
$plugins[] = 'kolab_config';
$plugins[] = 'kolab_folders';
$plugins[] = 'kolab_notes';
$plugins[] = 'kolab_tags';
// These require ldap
// $plugins[] = 'kolab_auth';
// $plugins[] = 'kolab_delegation';
}
if ($disabledPlugins = getenvlist('DISABLED_PLUGINS')) {
$plugins = array_diff($plugins, $disabledPlugins);
}
if ($extraPlugins = getenvlist('EXTRA_PLUGINS')) {
$plugins = array_merge($plugins, $extraPlugins);
}
// contextmenu must be after kolab_addressbook (#444)
$plugins[] = 'contextmenu';
$config['plugins'] = $plugins;
// 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'] = getenv('LOG_DRIVER');
$config['per_user_logging'] = true;
$config['log_date_format'] = 'd-M-Y H:i:s,u O';
$config['smtp_log'] = false;
$config['log_logins'] = true;
$config['log_session'] = false;
$config['sql_debug'] = getenv('SQL_DEBUG');
$config['memcache_debug'] = getenv('MEMCACHE_DEBUG');
$config['imap_debug'] = getenv('IMAP_DEBUG');
$config['smtp_debug'] = getenv('SMTP_DEBUG');
$config['dav_debug'] = getenv('DAV_DEBUG');
$config['skin'] = getenv('SKIN');
$config['skin_include_php'] = false;
if (getenv('FORCE_SKIN') == "true") {
$config['dont_override'][] = 'skin';
}
$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/';
$config['create_default_folders'] = true;
// Some additional default folders (archive plugin)
$config['archive_mbox'] = 'Archive';
// The Kolab daemon by default creates 'Spam'
$config['junk_mbox'] = 'Spam';
// $config['address_book_type'] = 'ldap';
$config['autocomplete_min_length'] = 3;
$config['autocomplete_threads'] = 0;
$config['autocomplete_max'] = 15;
// Disable the default addressbook and use the dav addressbook by default
$config['address_book_type'] = '';
$config['autocomplete_single'] = true;
$config['htmleditor'] = 0;
$config['kolab_http_request'] = Array(
'ssl_verify_host' => false,
'ssl_verify_peer' => false,
);
+ $config['oauth_provider'] = 'generic';
+ $config['oauth_provider_name'] = 'Kolab';
+ $config['oauth_client_id'] = getenv('PASSPORT_WEBMAIL_SSO_CLIENT_ID');
+ $config['oauth_client_secret'] = getenv('PASSPORT_WEBMAIL_SSO_CLIENT_SECRET');
+ $config['oauth_auth_uri'] = getenv('OAUTH_AUTH_URI') ?: 'https://' . ($_SERVER['HTTP_HOST'] ?? null) . '/oauth/authorize';
+ $config['oauth_token_uri'] = getenv('OAUTH_TOKEN_URI') ?: 'http://localhost:8000/oauth/token';
+ $config['oauth_redirect_uri'] = getenv('OAUTH_REDIRECT_URI') ?: 'https://' . ($_SERVER['HTTP_HOST'] ?? null) . '/roundcubemail/index.php/login/oauth';
+
+ $config['oauth_scope'] = 'email openid auth.token';
+ $config['oauth_password_claim'] = 'auth.token';
+
@include('kolab_syncroton.inc.php');
@include('chwala.inc.php');
?>

File Metadata

Mime Type
text/x-diff
Expires
Fri, Apr 24, 10:32 AM (1 d, 5 h)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
18840207
Default Alt Text
(57 KB)

Event Timeline