From 8904350b711cf4ac21da0e1e8af6f33bc8a1df1a Mon Sep 17 00:00:00 2001 From: Hivert Quentin Date: Thu, 13 Mar 2025 15:38:48 +0100 Subject: [PATCH] feat(dev): add devcontainer config to test and dev on sogo --- .devcontainer/Dockerfile.devcontainer | 163 ++++ .devcontainer/conf/db/mysql.sql | 67 ++ .devcontainer/conf/dovecot/Dockerfile | 72 ++ .../conf/dovecot/conf.d/10-auth.conf | 3 + .../conf/dovecot/conf.d/10-mail.conf | 11 + .../conf/dovecot/conf.d/10-master.conf | 88 ++ .../conf/dovecot/conf.d/20-lmtp.conf | 5 + .devcontainer/conf/dovecot/conf.d/90-acl.conf | 3 + .../conf/dovecot/conf.d/90-sieve.conf | 3 + .../conf/dovecot/conf.d/auth-ldap.conf.ext | 17 + .../conf/dovecot/dovecot-ldap.conf.ext | 9 + .devcontainer/conf/dovecot/dovecot.conf | 13 + .devcontainer/conf/dovecot/dovecot.gpg | Bin 0 -> 2863 bytes .devcontainer/conf/dovecot/dovecot.list | 1 + .devcontainer/conf/dovecot/wait-for-it.sh | 182 +++++ .devcontainer/conf/httpd/CanadaHolidays.ics | 277 +++++++ .devcontainer/conf/httpd/Dockerfile | 3 + .devcontainer/conf/httpd/httpd.conf | 772 ++++++++++++++++++ .../conf/httpd/ssl/apache-selfsigned.crt | 20 + .../conf/httpd/ssl/apache-selfsigned.csr | 16 + .../conf/httpd/ssl/apache-selfsigned.key | 28 + .devcontainer/conf/httpd/ssl/generate.sh | 7 + .devcontainer/conf/ldap/users.ldif | 166 ++++ .devcontainer/conf/postfix/Dockerfile | 8 + .devcontainer/conf/postfix/entrypoint.sh | 12 + .devcontainer/conf/postfix/mailname | 1 + .devcontainer/conf/postfix/main.cf | 52 ++ .devcontainer/conf/postfix/virtual | 1 + .devcontainer/conf/sogo/common.sh | 518 ++++++++++++ .devcontainer/conf/sogo/compile_sogo.sh | 14 + .devcontainer/conf/sogo/devenv | 147 ++++ .devcontainer/conf/sogo/entrypoint.sh | 53 ++ .devcontainer/conf/sogo/sogo.conf | 107 +++ .devcontainer/devcontainer.json | 15 + .devcontainer/docker-compose.yml | 108 +++ .devcontainer/readme.md | 72 ++ .gitignore | 4 +- README.md | 4 + 38 files changed, 3041 insertions(+), 1 deletion(-) create mode 100644 .devcontainer/Dockerfile.devcontainer create mode 100644 .devcontainer/conf/db/mysql.sql create mode 100644 .devcontainer/conf/dovecot/Dockerfile create mode 100644 .devcontainer/conf/dovecot/conf.d/10-auth.conf create mode 100644 .devcontainer/conf/dovecot/conf.d/10-mail.conf create mode 100644 .devcontainer/conf/dovecot/conf.d/10-master.conf create mode 100644 .devcontainer/conf/dovecot/conf.d/20-lmtp.conf create mode 100644 .devcontainer/conf/dovecot/conf.d/90-acl.conf create mode 100644 .devcontainer/conf/dovecot/conf.d/90-sieve.conf create mode 100644 .devcontainer/conf/dovecot/conf.d/auth-ldap.conf.ext create mode 100644 .devcontainer/conf/dovecot/dovecot-ldap.conf.ext create mode 100644 .devcontainer/conf/dovecot/dovecot.conf create mode 100644 .devcontainer/conf/dovecot/dovecot.gpg create mode 100644 .devcontainer/conf/dovecot/dovecot.list create mode 100755 .devcontainer/conf/dovecot/wait-for-it.sh create mode 100644 .devcontainer/conf/httpd/CanadaHolidays.ics create mode 100644 .devcontainer/conf/httpd/Dockerfile create mode 100644 .devcontainer/conf/httpd/httpd.conf create mode 100644 .devcontainer/conf/httpd/ssl/apache-selfsigned.crt create mode 100644 .devcontainer/conf/httpd/ssl/apache-selfsigned.csr create mode 100644 .devcontainer/conf/httpd/ssl/apache-selfsigned.key create mode 100755 .devcontainer/conf/httpd/ssl/generate.sh create mode 100644 .devcontainer/conf/ldap/users.ldif create mode 100644 .devcontainer/conf/postfix/Dockerfile create mode 100755 .devcontainer/conf/postfix/entrypoint.sh create mode 100644 .devcontainer/conf/postfix/mailname create mode 100644 .devcontainer/conf/postfix/main.cf create mode 100644 .devcontainer/conf/postfix/virtual create mode 100755 .devcontainer/conf/sogo/common.sh create mode 100644 .devcontainer/conf/sogo/compile_sogo.sh create mode 100755 .devcontainer/conf/sogo/devenv create mode 100644 .devcontainer/conf/sogo/entrypoint.sh create mode 100644 .devcontainer/conf/sogo/sogo.conf create mode 100644 .devcontainer/devcontainer.json create mode 100644 .devcontainer/docker-compose.yml create mode 100644 .devcontainer/readme.md diff --git a/.devcontainer/Dockerfile.devcontainer b/.devcontainer/Dockerfile.devcontainer new file mode 100644 index 000000000..d5ee5cccf --- /dev/null +++ b/.devcontainer/Dockerfile.devcontainer @@ -0,0 +1,163 @@ +FROM ubuntu:noble + +# The standard user with which vscode-server will be executed +ARG USERNAME=sogo +ARG USER_ID=1000 GROUP_ID=1000 + +ENV CONTAINER_USERNAME=${USERNAME} + +# rename user ubuntu to ${USERNAME} +RUN usermod -l ${CONTAINER_USERNAME} ubuntu && groupmod -n ${CONTAINER_USERNAME} ubuntu + +RUN apt-get update && apt-get install -y sudo \ + && usermod -aG sudo ${CONTAINER_USERNAME} \ + && echo ${CONTAINER_USERNAME} ALL=\(ALL\) NOPASSWD:ALL > /etc/sudoers.d/${CONTAINER_USERNAME} \ + && chmod 0440 /etc/sudoers.d/${CONTAINER_USERNAME} + +# Ensure sudo group users are not asked for a password +RUN echo '%sudo ALL=(ALL) NOPASSWD:ALL' > /etc/sudoers.d/${CONTAINER_USERNAME} && chmod 0440 /etc/sudoers.d/${CONTAINER_USERNAME} + +ENV WORKSPACE=/workspace +RUN mkdir -p ${WORKSPACE} && chown -R ${CONTAINER_USERNAME}:${CONTAINER_USERNAME} ${WORKSPACE} + +RUN apt-get clean && apt-get update --allow-unauthenticated --allow-insecure-repositories \ + && apt-get install -y --fix-missing git cmake libexpat-dev curl telnet nano + + +WORKDIR /tmp/build + +RUN mkdir -p /src/libwbxml && mkdir -p /tmp/build/libwbxml +RUN git clone https://github.com/libwbxml/libwbxml.git /src/libwbxml/ +RUN cmake -B/tmp/build/libwbxml -DCMAKE_INSTALL_PREFIX=$prefix /src/libwbxml && cd /tmp/build/libwbxml && make && make install +# For backward compatibility + +WORKDIR ${WORKSPACE} + +RUN ln -s /include/libwbxml-1.1 /usr/include/libwbxml-1.0 +RUN ln -s /include/libwbxml-1.1 /usr/include/libwbxml +RUN ln -s /include/libwbxml-1.1 /usr/include/libwbxml-1.1 + +# download, prepare & compile +RUN echo "Download SOPE sources" \ + && git clone https://github.com/Alinto/sope.git /src/SOPE \ + && echo "install required packages" \ + && apt-get update \ + && apt-get upgrade --allow-unauthenticated -qy \ + && DEBIAN_FRONTEND=noninteractive TZ=Etc/UTC apt-get install --allow-unauthenticated -qy --no-install-recommends \ + gnustep-make \ + gnustep-base-runtime \ + libgnustep-base-dev \ + pkg-config \ + make \ + gobjc \ + g++ \ + gdb gdbserver \ + vim \ + liblasso3-dev \ + python-is-python3 \ + libz-dev \ + zlib1g-dev \ + libpq-dev \ + libmysqlclient-dev \ + libcurl4-openssl-dev \ + libsodium-dev \ + libxml2-dev \ + libssl-dev \ + libldap2-dev \ + libzip-dev \ + mariadb-client \ + postgresql-client \ + tmpreaper \ + python3-m2crypto \ + python3-simplejson \ + python3-vobject \ + python3-dateutil \ + postgresql-server-dev-all \ + libmemcached-dev \ + libcurl4-openssl-dev \ + tzdata \ + libytnef0 \ + libytnef0-dev \ + liboath-dev \ + sudo \ + lsof \ + systemd \ + tcpdump \ + jq libxml2-utils + +RUN echo "compiling sope" \ + && cd /src/SOPE \ + && ./configure --with-gnustep --enable-debug --disable-strip \ + && make \ + && make install + +# copy sogo local sources +COPY / /src/SOGo +RUN chown -R ${CONTAINER_USERNAME}:${CONTAINER_USERNAME} /src/SOGo + +# install sogo +RUN echo "compiling sogo" + +# RUN chmod +x /src/SOGo/configure +WORKDIR /src/SOGo +RUN ./configure --enable-debug --disable-strip --enable-mfa +RUN make +RUN make install +RUN echo "register sogo library" +RUN echo "/usr/local/lib/sogo" > /etc/ld.so.conf.d/sogo.conf +RUN ldconfig +RUN echo "create directories and enforce permissions" +RUN install -o sogo -g sogo -m 755 -d /var/run/sogo +RUN install -o sogo -g sogo -m 750 -d /var/spool/sogo +RUN install -o sogo -g sogo -m 750 -d /var/log/sogo + +WORKDIR ${WORKSPACE} + +# Copy the binary file into /usr/local/bin +COPY .devcontainer/conf/sogo/compile_sogo.sh /usr/local/bin/compile_sogo.sh +# Set the appropriate permissions +RUN chmod +x /usr/local/bin/compile_sogo.sh + +# Install nodejs +RUN curl -sL https://deb.nodesource.com/setup_16.x | bash - +RUN apt install -qy nodejs \ + && npm i -g grunt + +# Users +RUN useradd sogo-tests1 && \ + useradd sogo-tests2 && \ + useradd sogo-tests3 && \ + useradd sogo-tests-super + +# Tests +RUN npm i -g xunit-viewer + + +# SOGo +RUN apt-get clean && apt-get install -y --no-install-recommends wget && cd /tmp && \ + wget https://raw.githubusercontent.com/Alinto/sogo/master/packaging/debian/sogo.init && \ + ln -s /usr/local/sbin/sogod /usr/sbin/sogod && \ + mv sogo.init /etc/init.d/sogod && chmod +x /etc/init.d/sogod && \ + mkdir /etc/sogo +COPY .devcontainer/conf/sogo/sogo.conf /etc/sogo/ +ADD .devcontainer/conf/sogo/sogo.conf /etc/sogo/sogo-base.conf + +# Clean +RUN apt-get clean && rm -rf /var/lib/apt/lists/* + +# Dev env script +ADD .devcontainer/conf/sogo/devenv /usr/sbin/ +ADD .devcontainer/conf/sogo/common.sh /include/ +RUN chmod +x /usr/sbin/devenv +RUN chmod +x /include/common.sh + +# Interface the environment +EXPOSE 50000 50001 + +# Entrypoint +ADD .devcontainer/conf/sogo/entrypoint.sh / +RUN chmod +x /entrypoint.sh + +USER ${CONTAINER_USERNAME} + +ENTRYPOINT ["/entrypoint.sh"] \ No newline at end of file diff --git a/.devcontainer/conf/db/mysql.sql b/.devcontainer/conf/db/mysql.sql new file mode 100644 index 000000000..737a5cfad --- /dev/null +++ b/.devcontainer/conf/db/mysql.sql @@ -0,0 +1,67 @@ +CREATE USER IF NOT EXISTS 'sogobuild'@'%' IDENTIFIED BY 'sogo123'; +GRANT ALL PRIVILEGES ON * . * TO 'sogobuild'@'%'; + +FLUSH PRIVILEGES; + +CREATE DATABASE IF NOT EXISTS sogo; +USE sogo; +-- INSERT INTO +CREATE DATABASE IF NOT EXISTS sogo_integration_tests_auth; +USE sogo_integration_tests_auth; +-- MySQL dump 10.16 Distrib 10.1.48-MariaDB, for debian-linux-gnu (x86_64) +-- +-- Host: localhost Database: sogo_integration_tests_auth +-- ------------------------------------------------------ +-- Server version 10.1.48-MariaDB-0+deb9u2 + +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; +/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; +/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; +/*!40101 SET NAMES utf8mb4 */; +/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; +/*!40103 SET TIME_ZONE='+00:00' */; +/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; +/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; +/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; +/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; + +-- +-- Table structure for table `sogoauth` +-- + +DROP TABLE IF EXISTS `sogoauth`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `sogoauth` ( + `c_uid` varchar(255) NOT NULL, + `c_name` varchar(255) NOT NULL, + `c_password` varchar(255) DEFAULT NULL, + `c_cn` varchar(255) DEFAULT NULL, + `mail` varchar(255) DEFAULT NULL, + `kind` varchar(255) DEFAULT NULL, + `multiplebookings` int(11) DEFAULT NULL, + PRIMARY KEY (`c_uid`), + UNIQUE KEY `c_name` (`c_name`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `sogoauth` +-- + +LOCK TABLES `sogoauth` WRITE; +/*!40000 ALTER TABLE `sogoauth` DISABLE KEYS */; +INSERT INTO `sogoauth` VALUES ('res','res','sogo','Resource no overbook','res@example.org','location',1),('res-nolimit','res-nolimit','sogo','Resource can overbook','res-nolimit@example.org','location',0),('sogo-tests-super','sogo-tests-super','sogo','sogo test super','sogo-tests-super@example.org',NULL,NULL),('sogo-tests1','sogo-tests1','sogo','sogo One','sogo-tests1@example.org',NULL,NULL),('sogo-tests2','sogo-tests2','sogo','sogo Two','sogo-tests2@example.org',NULL,NULL),('sogo-tests3','sogo-tests3','sogo','sogo Three','sogo-tests3@example.org',NULL,NULL); +/*!40000 ALTER TABLE `sogoauth` ENABLE KEYS */; +UNLOCK TABLES; +/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; + +/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; +/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; +/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; +/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; +/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; +/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; +/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; + +-- Dump completed on 2023-02-22 4:15:31 diff --git a/.devcontainer/conf/dovecot/Dockerfile b/.devcontainer/conf/dovecot/Dockerfile new file mode 100644 index 000000000..011fed3f0 --- /dev/null +++ b/.devcontainer/conf/dovecot/Dockerfile @@ -0,0 +1,72 @@ +# From https://github.com/dovecot/docker/blob/main/2.3.21.1/ +FROM debian:11-slim + +LABEL org.opencontainers.image.authors="dovecot@dovecot.org" + +ENV container=docker \ + LC_ALL=C +ARG DEBIAN_FRONTEND=noninteractive + +ADD dovecot.gpg /etc/apt/keyrings/dovecot.gpg +ADD dovecot.list /etc/apt/sources.list.d + +RUN apt-get -y update && apt-get -y install \ + tini \ + dovecot-core \ + dovecot-gssapi \ + dovecot-imapd \ + dovecot-ldap \ + dovecot-lmtpd \ + dovecot-managesieved \ + dovecot-mysql \ + dovecot-pgsql \ + dovecot-pop3d \ + dovecot-sieve \ + dovecot-solr \ + dovecot-sqlite \ + dovecot-submissiond \ + ca-certificates \ + ssl-cert && \ + rm -rf /var/lib/apt/lists && \ + groupadd -g 1000 vmail && \ + useradd -u 1000 -g 1000 vmail -d /srv/vmail && \ + passwd -l vmail && \ + rm -rf /etc/dovecot && \ + mkdir /srv/mail && \ + chown vmail:vmail /srv/mail && \ + make-ssl-cert generate-default-snakeoil && \ + mkdir /etc/dovecot && \ + ln -s /etc/ssl/certs/ssl-cert-snakeoil.pem /etc/dovecot/cert.pem && \ + ln -s /etc/ssl/private/ssl-cert-snakeoil.key /etc/dovecot/key.pem + +#ADD dovecot.conf /etc/dovecot/dovecot.conf + +# Add for SOGo env +RUN apt-get update --allow-insecure-repositories && \ + apt-get install --allow-unauthenticated -y dovecot-ldap dovecot-sieve dovecot-managesieved dovecot-lmtpd + +RUN chown -R dovecot:dovecot /var/mail +RUN mkdir /var/sieve && \ + chmod -R 755 /var/sieve && \ + chown -R vmail:vmail /var/sieve + +ADD dovecot.conf /etc/dovecot/dovecot.conf +ADD conf.d /etc/dovecot/conf.d +ADD dovecot-ldap.conf.ext /etc/dovecot/dovecot-ldap.conf.ext +# Clean +RUN apt-get clean && rm -rf /var/lib/apt/lists/* +# End add for SOGo env + +ADD wait-for-it.sh /wait-for-it.sh + +EXPOSE 24 +EXPOSE 110 +EXPOSE 143 +EXPOSE 587 +EXPOSE 990 +EXPOSE 993 +EXPOSE 4190 + +VOLUME ["/etc/dovecot", "/srv/mail"] +ENTRYPOINT ["/usr/bin/tini", "--"] +CMD ["./wait-for-it.sh", "openldap:389", "--", "/usr/sbin/dovecot", "-F"] diff --git a/.devcontainer/conf/dovecot/conf.d/10-auth.conf b/.devcontainer/conf/dovecot/conf.d/10-auth.conf new file mode 100644 index 000000000..dd79ba884 --- /dev/null +++ b/.devcontainer/conf/dovecot/conf.d/10-auth.conf @@ -0,0 +1,3 @@ +disable_plaintext_auth = no +auth_mechanisms = plain login +!include auth-ldap.conf.ext diff --git a/.devcontainer/conf/dovecot/conf.d/10-mail.conf b/.devcontainer/conf/dovecot/conf.d/10-mail.conf new file mode 100644 index 000000000..1e357f863 --- /dev/null +++ b/.devcontainer/conf/dovecot/conf.d/10-mail.conf @@ -0,0 +1,11 @@ +mail_location = maildir:/var/mail/%n +namespace inbox { + inbox = yes +} +mail_privileged_group = mail +protocol !indexer-worker { +} + +protocol imap { + mail_plugins = $mail_plugins acl +} \ No newline at end of file diff --git a/.devcontainer/conf/dovecot/conf.d/10-master.conf b/.devcontainer/conf/dovecot/conf.d/10-master.conf new file mode 100644 index 000000000..7de606b30 --- /dev/null +++ b/.devcontainer/conf/dovecot/conf.d/10-master.conf @@ -0,0 +1,88 @@ +service imap-login { + inet_listener imap { + #port = 143 + } + inet_listener imaps { + #port = 993 + #ssl = yes + } +} + +service pop3-login { + inet_listener pop3 { + #port = 110 + } + inet_listener pop3s { + #port = 995 + #ssl = yes + } +} + +service submission-login { + inet_listener submission { + #port = 587 + } +} + +service lmtp { + unix_listener /var/spool/dovecot-lmtp { + mode = 0660 + user = root + group = root + } + inet_listener lmtp { + port = 24 + } +} + +service imap { + # Most of the memory goes to mmap()ing files. You may need to increase this + # limit if you have huge mailboxes. + #vsz_limit = $default_vsz_limit + + # Max. number of IMAP processes (connections) + #process_limit = 1024 +} + +service pop3 { + # Max. number of POP3 processes (connections) + #process_limit = 1024 +} + +service submission { + # Max. number of SMTP Submission processes (connections) + #process_limit = 1024 +} + +service auth { + unix_listener auth-userdb { + #mode = 0666 + #user = + #group = + } + + # Postfix smtp-auth + #unix_listener /var/spool/postfix/private/auth { + # mode = 0666 + #} + + # Auth process is run as this user. + #user = $default_internal_user +} + +service auth-worker { + # Auth worker process is run as root by default, so that it can access + # /etc/shadow. If this isn't necessary, the user should be changed to + # $default_internal_user. + #user = root +} + +service dict { + # If dict proxy is used, mail processes should have access to its socket. + # For example: mode=0660, group=vmail and global mail_access_groups=vmail + unix_listener dict { + #mode = 0600 + #user = + #group = + } +} diff --git a/.devcontainer/conf/dovecot/conf.d/20-lmtp.conf b/.devcontainer/conf/dovecot/conf.d/20-lmtp.conf new file mode 100644 index 000000000..d28e5fb7f --- /dev/null +++ b/.devcontainer/conf/dovecot/conf.d/20-lmtp.conf @@ -0,0 +1,5 @@ +protocol lmtp { + postmaster_address = postmaster@example.org + # Space separated list of plugins to load (default is global mail_plugins). + mail_plugins = $mail_plugins sieve +} diff --git a/.devcontainer/conf/dovecot/conf.d/90-acl.conf b/.devcontainer/conf/dovecot/conf.d/90-acl.conf new file mode 100644 index 000000000..004ac03e5 --- /dev/null +++ b/.devcontainer/conf/dovecot/conf.d/90-acl.conf @@ -0,0 +1,3 @@ +plugin { + acl = vfile +} \ No newline at end of file diff --git a/.devcontainer/conf/dovecot/conf.d/90-sieve.conf b/.devcontainer/conf/dovecot/conf.d/90-sieve.conf new file mode 100644 index 000000000..1e68615a4 --- /dev/null +++ b/.devcontainer/conf/dovecot/conf.d/90-sieve.conf @@ -0,0 +1,3 @@ +plugin { + sieve = file:/var/sieve/%n@example.org;active=/var/sieve/%n@example.org/.dovecot.sieve +} diff --git a/.devcontainer/conf/dovecot/conf.d/auth-ldap.conf.ext b/.devcontainer/conf/dovecot/conf.d/auth-ldap.conf.ext new file mode 100644 index 000000000..2504820fc --- /dev/null +++ b/.devcontainer/conf/dovecot/conf.d/auth-ldap.conf.ext @@ -0,0 +1,17 @@ +passdb { + driver = ldap + + # Path for LDAP configuration file, see example-config/dovecot-ldap.conf.ext + args = /etc/dovecot/dovecot-ldap.conf.ext +} + +userdb { + driver = ldap + args = /etc/dovecot/dovecot-ldap.conf.ext + + # Default fields can be used to specify defaults that LDAP may override + #default_fields = home=/home/virtual/%u +} + +mail_gid = 8 + diff --git a/.devcontainer/conf/dovecot/dovecot-ldap.conf.ext b/.devcontainer/conf/dovecot/dovecot-ldap.conf.ext new file mode 100644 index 000000000..82bd04e48 --- /dev/null +++ b/.devcontainer/conf/dovecot/dovecot-ldap.conf.ext @@ -0,0 +1,9 @@ +hosts = openldap:389 +dn = cn=admin,dc=example,dc=org +dnpass = password +debug_level = -1 +auth_bind = yes +ldap_version = 3 +base = ou=users,dc=example,dc=org +user_filter = (&(objectClass=posixAccount)(uid=%u)) +user_filter = (|(uid=%u)(mail=%u)) \ No newline at end of file diff --git a/.devcontainer/conf/dovecot/dovecot.conf b/.devcontainer/conf/dovecot/dovecot.conf new file mode 100644 index 000000000..da62f37e3 --- /dev/null +++ b/.devcontainer/conf/dovecot/dovecot.conf @@ -0,0 +1,13 @@ +## Dovecot configuration file + +!include_try /usr/share/dovecot/protocols.d/*.protocol +!include conf.d/*.conf +protocols = imap lmtp sieve +!include_try local.conf + +log_path = /dev/stderr +auth_verbose = yes +auth_debug = yes +mail_debug = yes + +mail_plugins = acl \ No newline at end of file diff --git a/.devcontainer/conf/dovecot/dovecot.gpg b/.devcontainer/conf/dovecot/dovecot.gpg new file mode 100644 index 0000000000000000000000000000000000000000..e73ab31eff5739e3e34695ba9d10642f87884bfc GIT binary patch literal 2863 zcmV+~3()kL0u2OOGK#_h5CGT2huibtg^-RzDE5f-&G)@t-}LzxkR`8P%)lRHeTb17 ze>D&#q;qdZVPyW7DL=M9s;)&hL9yX)5+U}fK18K<1{o7&2yl1%g`>Y)coCLf(e(;= zap^QZ8{l!L>~4jv#!9peO?kH_Hds#WlR;?XiAw)>`8LgVO|PvR=8vA&baa`^*vnpQa?AS7aP<%{h-cH9-sfg3#zyS@i%k`#M^AZ3lp2{5m zfG2IH3TIp4g`a~gG*U(TD@E&pSG*IK#4fc1l>wg8jna@RNx#h}G8&B;>o>@|DIRnH zeIC;hv-Y~anWoQYkkW&8M4C`G4?zVSLNI|P;70T%rK#kyLOG9 z=-u(Dfch)=`N}HN=&}JtmH!@7$N_=ArzlJl1znPOo7Db3ijf&Vs5V5Bbx13~_*@ra zG$fh_fB;NQzgJ|PO*n4#x}sE_J`KtEpm17S{)20N4I4}!yqQk35X@8%ptrTkDe0aK zt~15f#2ZYdd7{g9{#1b9Myl0&Ysrt8tnw3np^cPb0rE}4lrUku)8qZNX(0TK-ya4^ z2V;Yh6X3wzL@P|I#3G-teGV@w3(<{%9T0!?19d-79GevQ#}@2%>X8A!)w&P3HTCuE z5@dnbZfMSF6dM2$0RRECGDL57Wn*u2AVY6$ZFO#Gba@~}WNCD1Z*CwwWN&t5V{ddV zV`V^OZ+2y4Z*(qia%Vn?0yqQ{0RjLb1p-ArSk=6eM!Zj{TuP7Au41AW{7FbLORXrqHO%$~39XT9XSKKBQa7VHcvjATNnoR2fa8F`E?yi$^jVGaO!s0^h>33%jc8%7fo+Y>MDhya`Pnu! zC+7OP&eWPIT$7&y_u}KUHA{X4*|NgIcuMeWPuC$yrGZ+Uz3giJ29Tk*6wli4;(@x)i zd()U96F0#r|L>c(v|sn0X_^7$^-dV62(}cDKe5{wv0ZqcM)lP_k!A-kQP}`;D6Z6Q z;Iu;aWo(l^Dl{tfH-f^F$MrLw(}?mTS5)L;K&iM-vxk)rtyuy4eEs-9nRkOYL1_KB zR_kPV4IXq0=YcX& z<@MT-Ui8L@xPn!UtXS-?&$)h?cit@J6sW16SUYW%_pfeRFEm|gh$%(O4ZpIb!n3b} zH2ofq=UVDXn|rqt7k|M+;Eu3Nx^NrE6&O|x9Wpff3F?(`ENCTs($xmt)Z-v5%;ggh zCov`_JmMNfhDmv-Gq^2s;r59W$xrlU6$wp=vfokVK;%e*Km0eWf7ETt1L-es1$>OV z{wGA9EU%Y#a}6TCh2C?ZZv+eG@Ex^xnbcIqEiIU#3TXdpQJ6;nJ<2!UzfLB{wo?f4 zCW(jqwRGkX>8X0$mTN7w;F*2TLsu*mW2C zS2psx8eI5eVH139dVO5tJuF=N$0U0+I{x%Gjo1H&$Pu#%al%B7Ch%ENdI-;?qR87T zxHK))?I0c-U|BKpPz7zlg8$(TLOg28(j9cZxdIIYS~7~l0T2Ma&?Stp2ZzhX4veX3 z0*}y&*^_|twJ)`mxF{vq%iEc?tI{axOA17`;NKewds)GmkzTkXJ&jtr{70emnN|r} z&=6La?84mJGEUORXs}sRkyyFDFssc}^4S6J;1$;R88{n8)j;fF&58c z6v(ftl`Nd95~LXYTI47Y@v)t#W8y!#&NE|<;OBIeF%_c_xtI#OZY^Mugsov~6lu_! z`&*df@*=1s%=wa&Gc2sgDuEi|S<3;`FF=l8vd?1zF^T_2@3#t#>v zIL&BefGBYWQT>WKEQ#Q-PypL$!SkICB#o5Y5EjJ|y$q&3_!i?^8m0|tOpvv&HnjXa z+0&den~`4PohQouIknLZw<7Qe5UzciwCXr%Jm4#pC^6_&J73K+EwhkmkaaK0sQ1pD zZxbNOGlD@gOiiNwQ`BZjUr40fO~Hd`Otm<=Pp(93WM#;0WvqeH+7#yi5di=Ji2@%47y$wR2?YXLGK#_i z8w>yn2@n{gNUrTbouN*a5B@0%R(Uu)0<0CNWH2YLA|tnMw1f~MFmmzooYFp?h})yO zKwDYlFX*JQ7`$O^8a-;wqEt7M4_Yb)I8)RS^Cg(-P`-$EMjm}yVBQ$wlQe7GGR2RC z)dQEt#2tL?xM)SlPlubXRh>|&kYd7en>>hcE3zhw(}Zo<=4!mHHIlKO%C>t?c@Qvu zad@I9(koQ5+_`YcKqA=bRaQK7+@_wIbl%l_u41&~+~P7Qd&Gcv$$91CI<4SLx4@t> z;gTfV4BnWU)F8S)2N8i{{iVSx)pQQ)cm*zWMUpjLa^mdtt;{Vh{%B{rWaE(uOY{?1 zGnhyq33SD#O_l25{PZLAFEB2|NI~rwTYRTeZ z43!AzkL0wFZU9xR+jhvi&Q#Qm7pXRWW(c6?w;1!`u>eKKq$2bvyezQVbU2abq|?Rs z_T4GuB?9#`XfTJKUF`hHbx@k#U_|DhA+LZkpwtZa1im&zuzw&2; fi } + +usage() +{ + cat << USAGE >&2 +Usage: + $WAITFORIT_cmdname host:port [-s] [-t timeout] [-- command args] + -h HOST | --host=HOST Host or IP under test + -p PORT | --port=PORT TCP port under test + Alternatively, you specify the host and port as host:port + -s | --strict Only execute subcommand if the test succeeds + -q | --quiet Don't output any status messages + -t TIMEOUT | --timeout=TIMEOUT + Timeout in seconds, zero for no timeout + -- COMMAND ARGS Execute command with args after the test finishes +USAGE + exit 1 +} + +wait_for() +{ + if [[ $WAITFORIT_TIMEOUT -gt 0 ]]; then + echoerr "$WAITFORIT_cmdname: waiting $WAITFORIT_TIMEOUT seconds for $WAITFORIT_HOST:$WAITFORIT_PORT" + else + echoerr "$WAITFORIT_cmdname: waiting for $WAITFORIT_HOST:$WAITFORIT_PORT without a timeout" + fi + WAITFORIT_start_ts=$(date +%s) + while : + do + if [[ $WAITFORIT_ISBUSY -eq 1 ]]; then + nc -z $WAITFORIT_HOST $WAITFORIT_PORT + WAITFORIT_result=$? + else + (echo -n > /dev/tcp/$WAITFORIT_HOST/$WAITFORIT_PORT) >/dev/null 2>&1 + WAITFORIT_result=$? + fi + if [[ $WAITFORIT_result -eq 0 ]]; then + WAITFORIT_end_ts=$(date +%s) + echoerr "$WAITFORIT_cmdname: $WAITFORIT_HOST:$WAITFORIT_PORT is available after $((WAITFORIT_end_ts - WAITFORIT_start_ts)) seconds" + break + fi + sleep 1 + done + return $WAITFORIT_result +} + +wait_for_wrapper() +{ + # In order to support SIGINT during timeout: http://unix.stackexchange.com/a/57692 + if [[ $WAITFORIT_QUIET -eq 1 ]]; then + timeout $WAITFORIT_BUSYTIMEFLAG $WAITFORIT_TIMEOUT $0 --quiet --child --host=$WAITFORIT_HOST --port=$WAITFORIT_PORT --timeout=$WAITFORIT_TIMEOUT & + else + timeout $WAITFORIT_BUSYTIMEFLAG $WAITFORIT_TIMEOUT $0 --child --host=$WAITFORIT_HOST --port=$WAITFORIT_PORT --timeout=$WAITFORIT_TIMEOUT & + fi + WAITFORIT_PID=$! + trap "kill -INT -$WAITFORIT_PID" INT + wait $WAITFORIT_PID + WAITFORIT_RESULT=$? + if [[ $WAITFORIT_RESULT -ne 0 ]]; then + echoerr "$WAITFORIT_cmdname: timeout occurred after waiting $WAITFORIT_TIMEOUT seconds for $WAITFORIT_HOST:$WAITFORIT_PORT" + fi + return $WAITFORIT_RESULT +} + +# process arguments +while [[ $# -gt 0 ]] +do + case "$1" in + *:* ) + WAITFORIT_hostport=(${1//:/ }) + WAITFORIT_HOST=${WAITFORIT_hostport[0]} + WAITFORIT_PORT=${WAITFORIT_hostport[1]} + shift 1 + ;; + --child) + WAITFORIT_CHILD=1 + shift 1 + ;; + -q | --quiet) + WAITFORIT_QUIET=1 + shift 1 + ;; + -s | --strict) + WAITFORIT_STRICT=1 + shift 1 + ;; + -h) + WAITFORIT_HOST="$2" + if [[ $WAITFORIT_HOST == "" ]]; then break; fi + shift 2 + ;; + --host=*) + WAITFORIT_HOST="${1#*=}" + shift 1 + ;; + -p) + WAITFORIT_PORT="$2" + if [[ $WAITFORIT_PORT == "" ]]; then break; fi + shift 2 + ;; + --port=*) + WAITFORIT_PORT="${1#*=}" + shift 1 + ;; + -t) + WAITFORIT_TIMEOUT="$2" + if [[ $WAITFORIT_TIMEOUT == "" ]]; then break; fi + shift 2 + ;; + --timeout=*) + WAITFORIT_TIMEOUT="${1#*=}" + shift 1 + ;; + --) + shift + WAITFORIT_CLI=("$@") + break + ;; + --help) + usage + ;; + *) + echoerr "Unknown argument: $1" + usage + ;; + esac +done + +if [[ "$WAITFORIT_HOST" == "" || "$WAITFORIT_PORT" == "" ]]; then + echoerr "Error: you need to provide a host and port to test." + usage +fi + +WAITFORIT_TIMEOUT=${WAITFORIT_TIMEOUT:-15} +WAITFORIT_STRICT=${WAITFORIT_STRICT:-0} +WAITFORIT_CHILD=${WAITFORIT_CHILD:-0} +WAITFORIT_QUIET=${WAITFORIT_QUIET:-0} + +# Check to see if timeout is from busybox? +WAITFORIT_TIMEOUT_PATH=$(type -p timeout) +WAITFORIT_TIMEOUT_PATH=$(realpath $WAITFORIT_TIMEOUT_PATH 2>/dev/null || readlink -f $WAITFORIT_TIMEOUT_PATH) + +WAITFORIT_BUSYTIMEFLAG="" +if [[ $WAITFORIT_TIMEOUT_PATH =~ "busybox" ]]; then + WAITFORIT_ISBUSY=1 + # Check if busybox timeout uses -t flag + # (recent Alpine versions don't support -t anymore) + if timeout &>/dev/stdout | grep -q -e '-t '; then + WAITFORIT_BUSYTIMEFLAG="-t" + fi +else + WAITFORIT_ISBUSY=0 +fi + +if [[ $WAITFORIT_CHILD -gt 0 ]]; then + wait_for + WAITFORIT_RESULT=$? + exit $WAITFORIT_RESULT +else + if [[ $WAITFORIT_TIMEOUT -gt 0 ]]; then + wait_for_wrapper + WAITFORIT_RESULT=$? + else + wait_for + WAITFORIT_RESULT=$? + fi +fi + +if [[ $WAITFORIT_CLI != "" ]]; then + if [[ $WAITFORIT_RESULT -ne 0 && $WAITFORIT_STRICT -eq 1 ]]; then + echoerr "$WAITFORIT_cmdname: strict mode, refusing to execute subprocess" + exit $WAITFORIT_RESULT + fi + exec "${WAITFORIT_CLI[@]}" +else + exit $WAITFORIT_RESULT +fi diff --git a/.devcontainer/conf/httpd/CanadaHolidays.ics b/.devcontainer/conf/httpd/CanadaHolidays.ics new file mode 100644 index 000000000..2541b0fb8 --- /dev/null +++ b/.devcontainer/conf/httpd/CanadaHolidays.ics @@ -0,0 +1,277 @@ +BEGIN:VCALENDAR +PRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN +VERSION:2.0 +BEGIN:VTIMEZONE +TZID:America/Denver +X-LIC-LOCATION:America/Denver +BEGIN:DAYLIGHT +TZOFFSETFROM:-0700 +TZOFFSETTO:-0600 +TZNAME:MDT +DTSTART:19700308T020000 +RRULE:FREQ=YEARLY;BYDAY=2SU;BYMONTH=3 +END:DAYLIGHT +BEGIN:STANDARD +TZOFFSETFROM:-0600 +TZOFFSETTO:-0700 +TZNAME:MST +DTSTART:19701101T020000 +RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=11 +END:STANDARD +END:VTIMEZONE +BEGIN:VEVENT +CREATED:20120117T215905Z +LAST-MODIFIED:20120117T215919Z +DTSTAMP:20120117T215919Z +UID:58f2f5bb-3be9-43d5-998b-088c593dbc85 +SUMMARY:New Year's Day +DTSTART;TZID=America/Denver:20120101T081500 +DTEND;TZID=America/Denver:20120101T090500 +END:VEVENT +BEGIN:VEVENT +CREATED:20120117T215933Z +LAST-MODIFIED:20120117T215941Z +DTSTAMP:20120117T215941Z +UID:7fdfe99e-3485-4af4-8949-2b0c8c829d17 +SUMMARY:Epiphany +DTSTART;VALUE=DATE:20120106 +DTEND;VALUE=DATE:20120107 +END:VEVENT +BEGIN:VEVENT +CREATED:20120117T215959Z +LAST-MODIFIED:20120117T220007Z +DTSTAMP:20120117T220007Z +UID:112cd226-2600-48d3-b5e8-55ab497c7a10 +SUMMARY:Groundhog Day +DTSTART;VALUE=DATE:20120202 +DTEND;VALUE=DATE:20120203 +END:VEVENT +BEGIN:VEVENT +CREATED:20120117T220032Z +LAST-MODIFIED:20120117T220040Z +DTSTAMP:20120117T220040Z +UID:42daa2c5-42e0-4cbc-a614-1284b2f3378b +SUMMARY:Valentine's Day +DTSTART;VALUE=DATE:20120214 +DTEND;VALUE=DATE:20120215 +END:VEVENT +BEGIN:VEVENT +CREATED:20120117T220145Z +LAST-MODIFIED:20120117T220156Z +DTSTAMP:20120117T220156Z +UID:d35c66b7-cc8f-4fa8-b980-eae06732a679 +SUMMARY:St. Patrick's Day +DTSTART;VALUE=DATE:20120317 +DTEND;VALUE=DATE:20120318 +END:VEVENT +BEGIN:VEVENT +CREATED:20120117T220208Z +LAST-MODIFIED:20120117T220215Z +DTSTAMP:20120117T220215Z +UID:15440c4b-f459-4599-9d92-5906555eb6d1 +SUMMARY:Good Friday +DTSTART;VALUE=DATE:20120406 +DTEND;VALUE=DATE:20120407 +END:VEVENT +BEGIN:VEVENT +CREATED:20120117T220225Z +LAST-MODIFIED:20120117T220232Z +DTSTAMP:20120117T220232Z +UID:00c93d5e-4c1a-45b0-a4f5-3a60b4ba865b +SUMMARY:Easter Sunday +DTSTART;VALUE=DATE:20120408 +DTEND;VALUE=DATE:20120409 +END:VEVENT +BEGIN:VEVENT +CREATED:20120117T220244Z +LAST-MODIFIED:20120117T220251Z +DTSTAMP:20120117T220251Z +UID:8443f87e-ccc7-4bbc-bdc2-8244f459638f +SUMMARY:Vimy Ridge Day +DTSTART;VALUE=DATE:20120409 +DTEND;VALUE=DATE:20120410 +END:VEVENT +BEGIN:VEVENT +CREATED:20120117T220301Z +LAST-MODIFIED:20120117T220307Z +DTSTAMP:20120117T220307Z +UID:3b2035b3-1b4c-4f08-8a38-5ab3d57ef4bb +SUMMARY:Easter Monday +DTSTART;VALUE=DATE:20120409 +DTEND;VALUE=DATE:20120410 +END:VEVENT +BEGIN:VEVENT +CREATED:20120117T220407Z +LAST-MODIFIED:20120117T220411Z +DTSTAMP:20120117T220411Z +UID:dc725c0c-587a-4f7d-997f-521478528973 +SUMMARY:Canada Day +DTSTART;VALUE=DATE:20120701 +DTEND;VALUE=DATE:20120702 +END:VEVENT +BEGIN:VEVENT +CREATED:20120117T220615Z +LAST-MODIFIED:20120117T220622Z +DTSTAMP:20120117T220622Z +UID:5663c847-3a29-492b-aeab-1d009852ad67 +SUMMARY:Halloween +DTSTART;VALUE=DATE:20121031 +DTEND;VALUE=DATE:20121101 +END:VEVENT +BEGIN:VEVENT +CREATED:20120117T220859Z +LAST-MODIFIED:20120117T220905Z +DTSTAMP:20120117T220905Z +UID:ab6e8de1-e4cd-46c2-a031-5e030d7d56d2 +SUMMARY:Christmas Eve +DTSTART;VALUE=DATE:20121224 +DTEND;VALUE=DATE:20121225 +END:VEVENT +BEGIN:VEVENT +CREATED:20120117T220911Z +LAST-MODIFIED:20120117T220917Z +DTSTAMP:20120117T220917Z +UID:6a7de4c3-bb70-477c-91b8-5d780c19d4ca +SUMMARY:Christmas +DTSTART;VALUE=DATE:20121225 +DTEND;VALUE=DATE:20121226 +END:VEVENT +BEGIN:VEVENT +CREATED:20120117T220920Z +LAST-MODIFIED:20120117T220943Z +DTSTAMP:20120117T220943Z +UID:4913c6ab-5332-4094-811a-f6060616fda3 +SUMMARY:Boxing Day (Most regions) +DTSTART;VALUE=DATE:20121226 +DTEND;VALUE=DATE:20121227 +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20120117T220956Z +LAST-MODIFIED:20120117T221003Z +DTSTAMP:20120117T221003Z +UID:43bc10df-bd29-4f2b-aa0f-c6cc8cf3839f +SUMMARY:New Year's Eve +DTSTART;VALUE=DATE:20121231 +DTEND;VALUE=DATE:20130101 +END:VEVENT +BEGIN:VEVENT +CREATED:20120117T221726Z +LAST-MODIFIED:20120117T221734Z +DTSTAMP:20120117T221734Z +UID:a51d1d54-72c6-4fe7-8080-bb78b3ab0c09 +SUMMARY:New Year's Day +DTSTART;VALUE=DATE:20120101 +DTEND;VALUE=DATE:20120102 +END:VEVENT +BEGIN:VEVENT +CREATED:20120117T220055Z +LAST-MODIFIED:20120117T221850Z +DTSTAMP:20120117T221850Z +UID:31cc39a6-9b41-4a5f-9fd2-f5c43ad686fb +SUMMARY:Family Day (AB\, ON\, SK) +DTSTART;VALUE=DATE:20120220 +DTEND;VALUE=DATE:20120221 +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20120117T220125Z +LAST-MODIFIED:20120117T221906Z +DTSTAMP:20120117T221906Z +UID:4370e2c8-0863-456c-b1d0-e64ec8a06ef1 +SUMMARY:Commonwealth Day +DTSTART;VALUE=DATE:20120312 +DTEND;VALUE=DATE:20120313 +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20120117T220321Z +LAST-MODIFIED:20120117T221951Z +DTSTAMP:20120117T221951Z +UID:722dc2f8-c0c8-457b-902c-30e94aee23bb +SUMMARY:Victoria Day (Most regions) +DTSTART;VALUE=DATE:20120521 +DTEND;VALUE=DATE:20120522 +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20120117T220346Z +LAST-MODIFIED:20120117T222004Z +DTSTAMP:20120117T222004Z +UID:f782fb4f-7d96-425c-ae58-839d0f8a9283 +SUMMARY:National Aboriginal Day +DTSTART;VALUE=DATE:20120621 +DTEND;VALUE=DATE:20120622 +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20120117T220419Z +LAST-MODIFIED:20120117T222100Z +DTSTAMP:20120117T222100Z +UID:e9a8bda0-2fa1-4cdf-94e1-5eb5467869ff +SUMMARY:Canada Day - statutory holiday +DTSTART;VALUE=DATE:20120702 +DTEND;VALUE=DATE:20120703 +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20120117T220450Z +LAST-MODIFIED:20120117T222123Z +DTSTAMP:20120117T222123Z +UID:074e1958-329b-45b8-b918-3d6807c9deb4 +SUMMARY:Civic/Provincial Day (Many regions) +DTSTART;VALUE=DATE:20120806 +DTEND;VALUE=DATE:20120807 +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20120117T220527Z +LAST-MODIFIED:20120117T222135Z +DTSTAMP:20120117T222135Z +UID:e2bc628c-79da-4f09-bfbb-b1d1ea9ca79f +SUMMARY:Labour Day (All) +DTSTART;VALUE=DATE:20120903 +DTEND;VALUE=DATE:20120904 +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20120117T220553Z +LAST-MODIFIED:20120117T222145Z +DTSTAMP:20120117T222145Z +UID:ed33f08c-fcb1-44ee-9173-1bd7051093fb +SUMMARY:Thanksgiving Day (All) +DTSTART;VALUE=DATE:20121008 +DTEND;VALUE=DATE:20121009 +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20120117T220635Z +LAST-MODIFIED:20120117T222159Z +DTSTAMP:20120117T222159Z +UID:27bff647-69a4-4be8-9647-6dd1ad3b4d60 +SUMMARY:Remembrance Day (Most regions) +DTSTART;VALUE=DATE:20121111 +DTEND;VALUE=DATE:20121112 +X-MOZ-GENERATION:2 +END:VEVENT +BEGIN:VEVENT +CREATED:20120117T220727Z +LAST-MODIFIED:20120117T222205Z +DTSTAMP:20120117T222205Z +UID:487d87a7-618f-4f07-bba2-9f472be8c836 +SUMMARY:Remembrance Day observed (Many regions) +DTSTART;VALUE=DATE:20121112 +DTEND;VALUE=DATE:20121113 +X-MOZ-GENERATION:1 +END:VEVENT +BEGIN:VEVENT +CREATED:20120117T220816Z +LAST-MODIFIED:20120117T222220Z +DTSTAMP:20120117T222220Z +UID:696de927-4e80-4d07-a283-550f51ec324e +SUMMARY:Anniversary of the Statute of Westminster +DTSTART;VALUE=DATE:20121211 +DTEND;VALUE=DATE:20121212 +X-MOZ-GENERATION:1 +END:VEVENT +END:VCALENDAR diff --git a/.devcontainer/conf/httpd/Dockerfile b/.devcontainer/conf/httpd/Dockerfile new file mode 100644 index 000000000..6fea866c9 --- /dev/null +++ b/.devcontainer/conf/httpd/Dockerfile @@ -0,0 +1,3 @@ +FROM httpd:2.4 + +ADD httpd.conf /usr/local/apache2/conf/httpd.conf \ No newline at end of file diff --git a/.devcontainer/conf/httpd/httpd.conf b/.devcontainer/conf/httpd/httpd.conf new file mode 100644 index 000000000..29f9fd2bc --- /dev/null +++ b/.devcontainer/conf/httpd/httpd.conf @@ -0,0 +1,772 @@ +# +# This is the main Apache HTTP server configuration file. It contains the +# configuration directives that give the server its instructions. +# See for detailed information. +# In particular, see +# +# for a discussion of each configuration directive. +# +# 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 "logs/access_log" +# with ServerRoot set to "/usr/local/apache2" will be interpreted by the +# server as "/usr/local/apache2/logs/access_log", whereas "/logs/access_log" +# will be interpreted as '/logs/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 "/usr/local/apache2" + +# +# Mutex: Allows you to set the mutex mechanism and mutex file directory +# for individual mutexes, or change the global defaults +# +# Uncomment and change the directory if mutexes are file-based and the default +# mutex file directory is not on a local disk or is not appropriate for some +# other reason. +# +# Mutex default:logs + +# +# Listen: Allows you to bind Apache to specific IP addresses and/or +# ports, instead of the default. See also the +# directive. +# +# Change this to Listen on specific IP addresses as shown below to +# prevent Apache from glomming onto all bound IP addresses. +# +#Listen 12.34.56.78:80 +Listen 80 +Listen 81 +Listen 443 + +# +# 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 +# +LoadModule mpm_event_module modules/mod_mpm_event.so +#LoadModule mpm_prefork_module modules/mod_mpm_prefork.so +#LoadModule mpm_worker_module modules/mod_mpm_worker.so +LoadModule authn_file_module modules/mod_authn_file.so +#LoadModule authn_dbm_module modules/mod_authn_dbm.so +#LoadModule authn_anon_module modules/mod_authn_anon.so +#LoadModule authn_dbd_module modules/mod_authn_dbd.so +#LoadModule authn_socache_module modules/mod_authn_socache.so +LoadModule authn_core_module modules/mod_authn_core.so +LoadModule authz_host_module modules/mod_authz_host.so +LoadModule authz_groupfile_module modules/mod_authz_groupfile.so +LoadModule authz_user_module modules/mod_authz_user.so +#LoadModule authz_dbm_module modules/mod_authz_dbm.so +#LoadModule authz_owner_module modules/mod_authz_owner.so +#LoadModule authz_dbd_module modules/mod_authz_dbd.so +LoadModule authz_core_module modules/mod_authz_core.so +#LoadModule authnz_ldap_module modules/mod_authnz_ldap.so +#LoadModule authnz_fcgi_module modules/mod_authnz_fcgi.so +LoadModule access_compat_module modules/mod_access_compat.so +LoadModule auth_basic_module modules/mod_auth_basic.so +#LoadModule auth_form_module modules/mod_auth_form.so +#LoadModule auth_digest_module modules/mod_auth_digest.so +#LoadModule allowmethods_module modules/mod_allowmethods.so +#LoadModule isapi_module modules/mod_isapi.so +#LoadModule file_cache_module modules/mod_file_cache.so +#LoadModule cache_module modules/mod_cache.so +#LoadModule cache_disk_module modules/mod_cache_disk.so +#LoadModule cache_socache_module modules/mod_cache_socache.so +#LoadModule socache_shmcb_module modules/mod_socache_shmcb.so +#LoadModule socache_dbm_module modules/mod_socache_dbm.so +#LoadModule socache_memcache_module modules/mod_socache_memcache.so +#LoadModule socache_redis_module modules/mod_socache_redis.so +#LoadModule watchdog_module modules/mod_watchdog.so +#LoadModule macro_module modules/mod_macro.so +#LoadModule dbd_module modules/mod_dbd.so +#LoadModule bucketeer_module modules/mod_bucketeer.so +#LoadModule dumpio_module modules/mod_dumpio.so +#LoadModule echo_module modules/mod_echo.so +#LoadModule example_hooks_module modules/mod_example_hooks.so +#LoadModule case_filter_module modules/mod_case_filter.so +#LoadModule case_filter_in_module modules/mod_case_filter_in.so +#LoadModule example_ipc_module modules/mod_example_ipc.so +#LoadModule buffer_module modules/mod_buffer.so +#LoadModule data_module modules/mod_data.so +#LoadModule ratelimit_module modules/mod_ratelimit.so +LoadModule reqtimeout_module modules/mod_reqtimeout.so +#LoadModule ext_filter_module modules/mod_ext_filter.so +#LoadModule request_module modules/mod_request.so +#LoadModule include_module modules/mod_include.so +LoadModule filter_module modules/mod_filter.so +#LoadModule reflector_module modules/mod_reflector.so +#LoadModule substitute_module modules/mod_substitute.so +#LoadModule sed_module modules/mod_sed.so +#LoadModule charset_lite_module modules/mod_charset_lite.so +#LoadModule deflate_module modules/mod_deflate.so +#LoadModule xml2enc_module modules/mod_xml2enc.so +#LoadModule proxy_html_module modules/mod_proxy_html.so +#LoadModule brotli_module modules/mod_brotli.so +LoadModule mime_module modules/mod_mime.so +#LoadModule ldap_module modules/mod_ldap.so +LoadModule log_config_module modules/mod_log_config.so +#LoadModule log_debug_module modules/mod_log_debug.so +#LoadModule log_forensic_module modules/mod_log_forensic.so +#LoadModule logio_module modules/mod_logio.so +#LoadModule lua_module modules/mod_lua.so +LoadModule env_module modules/mod_env.so +#LoadModule mime_magic_module modules/mod_mime_magic.so +#LoadModule cern_meta_module modules/mod_cern_meta.so +#LoadModule expires_module modules/mod_expires.so +LoadModule headers_module modules/mod_headers.so +#LoadModule ident_module modules/mod_ident.so +#LoadModule usertrack_module modules/mod_usertrack.so +#LoadModule unique_id_module modules/mod_unique_id.so +LoadModule setenvif_module modules/mod_setenvif.so +LoadModule version_module modules/mod_version.so +#LoadModule remoteip_module modules/mod_remoteip.so +LoadModule proxy_module modules/mod_proxy.so +#LoadModule proxy_connect_module modules/mod_proxy_connect.so +#LoadModule proxy_ftp_module modules/mod_proxy_ftp.so +LoadModule proxy_http_module modules/mod_proxy_http.so +#LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so +#LoadModule proxy_scgi_module modules/mod_proxy_scgi.so +#LoadModule proxy_uwsgi_module modules/mod_proxy_uwsgi.so +#LoadModule proxy_fdpass_module modules/mod_proxy_fdpass.so +#LoadModule proxy_wstunnel_module modules/mod_proxy_wstunnel.so +#LoadModule proxy_ajp_module modules/mod_proxy_ajp.so +#LoadModule proxy_balancer_module modules/mod_proxy_balancer.so +#LoadModule proxy_express_module modules/mod_proxy_express.so +#LoadModule proxy_hcheck_module modules/mod_proxy_hcheck.so +#LoadModule session_module modules/mod_session.so +#LoadModule session_cookie_module modules/mod_session_cookie.so +#LoadModule session_crypto_module modules/mod_session_crypto.so +#LoadModule session_dbd_module modules/mod_session_dbd.so +#LoadModule slotmem_shm_module modules/mod_slotmem_shm.so +#LoadModule slotmem_plain_module modules/mod_slotmem_plain.so +LoadModule ssl_module modules/mod_ssl.so +#LoadModule optional_hook_export_module modules/mod_optional_hook_export.so +#LoadModule optional_hook_import_module modules/mod_optional_hook_import.so +#LoadModule optional_fn_import_module modules/mod_optional_fn_import.so +#LoadModule optional_fn_export_module modules/mod_optional_fn_export.so +#LoadModule dialup_module modules/mod_dialup.so +#LoadModule http2_module modules/mod_http2.so +#LoadModule proxy_http2_module modules/mod_proxy_http2.so +#LoadModule md_module modules/mod_md.so +#LoadModule lbmethod_byrequests_module modules/mod_lbmethod_byrequests.so +#LoadModule lbmethod_bytraffic_module modules/mod_lbmethod_bytraffic.so +#LoadModule lbmethod_bybusyness_module modules/mod_lbmethod_bybusyness.so +#LoadModule lbmethod_heartbeat_module modules/mod_lbmethod_heartbeat.so +LoadModule unixd_module modules/mod_unixd.so +#LoadModule heartbeat_module modules/mod_heartbeat.so +#LoadModule heartmonitor_module modules/mod_heartmonitor.so +#LoadModule dav_module modules/mod_dav.so +LoadModule status_module modules/mod_status.so +LoadModule autoindex_module modules/mod_autoindex.so +#LoadModule asis_module modules/mod_asis.so +#LoadModule info_module modules/mod_info.so +#LoadModule suexec_module modules/mod_suexec.so + + #LoadModule cgid_module modules/mod_cgid.so + + + #LoadModule cgi_module modules/mod_cgi.so + +#LoadModule dav_fs_module modules/mod_dav_fs.so +#LoadModule dav_lock_module modules/mod_dav_lock.so +#LoadModule vhost_alias_module modules/mod_vhost_alias.so +#LoadModule negotiation_module modules/mod_negotiation.so +LoadModule dir_module modules/mod_dir.so +#LoadModule imagemap_module modules/mod_imagemap.so +#LoadModule actions_module modules/mod_actions.so +#LoadModule speling_module modules/mod_speling.so +#LoadModule userdir_module modules/mod_userdir.so +LoadModule alias_module modules/mod_alias.so +LoadModule rewrite_module modules/mod_rewrite.so + + +# +# 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 www-data +Group www-data + + + +# '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 +# definition. These values also provide defaults for +# any containers you may define later in the file. +# +# All of these directives may appear inside 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 you@example.com + +# +# 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 +# blocks below. +# + + AllowOverride none + Require all granted + + +# +# 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 "/usr/local/apache2/htdocs" + + # + # 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: + # AllowOverride FileInfo AuthConfig Limit + # + AllowOverride None + + # + # Controls who can get stuff from this server. + # + Require all granted + + +# +# DirectoryIndex: sets the file that Apache will serve if a directory +# is requested. +# + + DirectoryIndex index.html + + +# +# The following lines prevent .htaccess and .htpasswd files from being +# viewed by Web clients. +# + + Require all denied + + +# +# ErrorLog: The location of the error log file. +# If you do not specify an ErrorLog directive within a +# container, error messages relating to that virtual host will be +# logged here. If you *do* define an error logfile for a +# container, that host's errors will be logged there and not here. +# +ErrorLog /proc/self/fd/2 + +# +# LogLevel: Control the number of messages logged to the error_log. +# Possible values include: debug, info, notice, warn, error, crit, +# alert, emerg. +# +LogLevel warn + + + # + # 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 + + + # 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 + + + # + # The location and format of the access logfile (Common Logfile Format). + # If you do not define any access logfiles within a + # container, they will be logged here. Contrariwise, if you *do* + # define per- access logfiles, transactions will be + # logged therein and *not* in this file. + # + CustomLog /proc/self/fd/1 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 + + + + # + # 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 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/ "/usr/local/apache2/cgi-bin/" + + + + + # + # ScriptSock: On threaded servers, designate the path to the UNIX + # socket used to communicate with the CGI daemon of mod_cgid. + # + #Scriptsock cgisock + + +# +# "/usr/local/apache2/cgi-bin" should be changed to whatever your ScriptAliased +# CGI directory exists, if you have that configured. +# + + AllowOverride None + Options None + Require all granted + + + + # + # Avoid passing HTTP_PROXY environment to CGI's on this or any proxied + # backend servers which have lingering "httpoxy" defects. + # 'Proxy' request header is undefined by the IETF, not listed by IANA + # + RequestHeader unset Proxy early + + + + # + # TypesConfig points to the file containing the list of mappings from + # filename extension to MIME-type. + # + TypesConfig conf/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 + + +# +# 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 + +# +# 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 +# + +# +# MaxRanges: Maximum number of Ranges in a request before +# returning the entire resource, or one of the special +# values 'default', 'none' or 'unlimited'. +# Default setting is to accept 200 Ranges. +#MaxRanges unlimited + +# +# 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: EnableMMAP On, EnableSendfile Off +# +#EnableMMAP off +#EnableSendfile on + +# Supplemental configuration +# +# The configuration files in the conf/extra/ directory can be +# included to add extra features or to modify the default configuration of +# the server, or you may simply copy their contents here and change as +# necessary. + +# Server-pool management (MPM specific) +#Include conf/extra/httpd-mpm.conf + +# Multi-language error messages +#Include conf/extra/httpd-multilang-errordoc.conf + +# Fancy directory listings +#Include conf/extra/httpd-autoindex.conf + +# Language settings +#Include conf/extra/httpd-languages.conf + +# User home directories +#Include conf/extra/httpd-userdir.conf + +# Real-time info on requests and configuration +#Include conf/extra/httpd-info.conf + +# Virtual hosts +#Include conf/extra/httpd-vhosts.conf + +# Local access to the Apache HTTP Server Manual +#Include conf/extra/httpd-manual.conf + +# Distributed authoring and versioning (WebDAV) +#Include conf/extra/httpd-dav.conf + +# Various default settings +#Include conf/extra/httpd-default.conf + +# Configure mod_proxy_html to understand HTML4/XHTML1 + +Include conf/extra/proxy-html.conf + + +# Secure (SSL/TLS) connections +#Include conf/extra/httpd-ssl.conf +# +# Note: The following must must be present to support +# starting without SSL on platforms with no /dev/random equivalent +# but a statically compiled-in mod_ssl. +# + +SSLRandomSeed startup builtin +SSLRandomSeed connect builtin + + + +########################### +# +# SOGo HTTP +# +########################### + + + + ServerAdmin support@sogo.nu + ServerName dev.sogo + + Alias /SOGo.woa/WebServerResources/ /usr/local/lib/GNUstep/SOGo/WebServerResources/ + Alias /SOGo/WebServerResources/ /usr/local/lib/GNUstep/SOGo/WebServerResources/ + + + + Order deny,allow + Allow from all + + = 2.4> + Require all granted + + + # Explicitly allow caching of static content to avoid browser specific behavior. + # A resource's URL MUST change in order to have the client load the new version. + + ExpiresActive On + ExpiresDefault "access plus 1 year" + + + + CustomLog /tmp/sogo.log combined + + ProxyRequests Off + SetEnv proxy-nokeepalive 1 + ProxyPreserveHost On + ProxyPass /SOGo http://sogo:50000/SOGo retry=0 + ProxyPass /Microsoft-Server-ActiveSync http://sogo:50000/SOGo/Microsoft-Server-ActiveSync retry=0 connectiontimeout=5 timeout=3600 + ProxyPass /keycloak http://keycloak:8080/keycloak retry=0 + ProxyPassReverse /keycloak http://keycloak:8080/keycloak + + + ## adjust the following to your configuration + RequestHeader set "x-webobjects-server-port" "80" + RequestHeader set "x-webobjects-server-name" "127.0.0.1" + RequestHeader set "x-webobjects-server-url" "http://127.0.0.1" + RequestHeader set "x-webobjects-server-protocol" "HTTP/1.0" + RequestHeader set "x-webobjects-remote-host" "127.0.0.1" + + AddDefaultCharset UTF-8 + + Order allow,deny + Allow from all + + + RewriteEngine On + RewriteRule ^/SOGo/(.*)$ /SOGo/$1 [env=REMOTE_HOST:%{REMOTE_ADDR},PT] + + # For Apple autoconfiguration + + RewriteEngine On + RewriteRule ^/.well-known/caldav/?$ /SOGo/dav [R=301] + RewriteRule ^/.well-known/carddav/?$ /SOGo/dav [R=301] + + + + Options Indexes FollowSymLinks + AllowOverride None + Require all granted + + + Alias /tests /src/SOGo/Tests/results + + +########################### +# +# SOGo HTTP (for tests) +# +########################### + + + ServerAdmin support@sogo.nu + ServerName dev.sogo + + Alias /SOGo.woa/WebServerResources/ /usr/local/lib/GNUstep/SOGo/WebServerResources/ + Alias /SOGo/WebServerResources/ /usr/local/lib/GNUstep/SOGo/WebServerResources/ + + + + Order deny,allow + Allow from all + + = 2.4> + Require all granted + + + # Explicitly allow caching of static content to avoid browser specific behavior. + # A resource's URL MUST change in order to have the client load the new version. + + ExpiresActive On + ExpiresDefault "access plus 1 year" + + + + CustomLog /tmp/sogo.log combined + + ProxyRequests Off + SetEnv proxy-nokeepalive 1 + ProxyPreserveHost On + ProxyPass /SOGo http://sogo:50000/SOGo retry=0 + ProxyPass /Microsoft-Server-ActiveSync http://sogo:50000/SOGo/Microsoft-Server-ActiveSync retry=0 connectiontimeout=5 timeout=3600 + + + ## adjust the following to your configuration + RequestHeader set "x-webobjects-server-port" "81" + RequestHeader set "x-webobjects-server-name" "httpd" + RequestHeader set "x-webobjects-server-url" "http://httpd" + + RequestHeader set "x-webobjects-server-protocol" "HTTP/1.0" + RequestHeader set "x-webobjects-remote-host" "httpd" + + AddDefaultCharset UTF-8 + + Order allow,deny + Allow from all + + + RewriteEngine On + RewriteRule ^/SOGo/(.*)$ /SOGo/$1 [env=REMOTE_HOST:%{REMOTE_ADDR},PT] + + # For Apple autoconfiguration + + RewriteEngine On + RewriteRule ^/.well-known/caldav/?$ /SOGo/dav [R=301] + RewriteRule ^/.well-known/carddav/?$ /SOGo/dav [R=301] + + + + +########################### +# +# SOGo HTTPS +# +########################### + + + + ServerAdmin support@sogo.nu + ServerName dev.sogo + + Alias /SOGo.woa/WebServerResources/ /usr/local/lib/GNUstep/SOGo/WebServerResources/ + Alias /SOGo/WebServerResources/ /usr/local/lib/GNUstep/SOGo/WebServerResources/ + + SSLEngine on + SSLCertificateFile /ssl/apache-selfsigned.crt + SSLCertificateKeyFile /ssl/apache-selfsigned.key + + + + Order deny,allow + Allow from all + + = 2.4> + Require all granted + + + # Explicitly allow caching of static content to avoid browser specific behavior. + # A resource's URL MUST change in order to have the client load the new version. + + ExpiresActive On + ExpiresDefault "access plus 1 year" + + + + CustomLog /tmp/sogo.log combined + + ProxyRequests Off + SetEnv proxy-nokeepalive 1 + ProxyPreserveHost On + ProxyPass /SOGo http://sogo:50000/SOGo retry=0 + ProxyPass /Microsoft-Server-ActiveSync http://sogo:50000/SOGo/Microsoft-Server-ActiveSync retry=0 connectiontimeout=5 timeout=3600 + ProxyPass /keycloak http://keycloak:8080/keycloak retry=0 + ProxyPassReverse /keycloak http://keycloak:8080/keycloak + + + ## adjust the following to your configuration + RequestHeader set "x-webobjects-server-port" "443" + RequestHeader set "x-webobjects-server-name" "127.0.0.1" + RequestHeader set "x-webobjects-server-url" "https://127.0.0.1" + + RequestHeader set "x-webobjects-server-protocol" "HTTP/1.0" + RequestHeader set "x-webobjects-remote-host" "127.0.0.1" + + AddDefaultCharset UTF-8 + + Order allow,deny + Allow from all + + + + RewriteEngine On + RewriteRule ^/SOGo/(.*)$ /SOGo/$1 [env=REMOTE_HOST:%{REMOTE_ADDR},PT] + + # For Apple autoconfiguration + + RewriteEngine On + RewriteRule ^/.well-known/caldav/?$ /SOGo/dav [R=301] + RewriteRule ^/.well-known/carddav/?$ /SOGo/dav [R=301] + + + + Options Indexes FollowSymLinks + AllowOverride None + Require all granted + + + Alias /tests /src/SOGo/Tests/results + diff --git a/.devcontainer/conf/httpd/ssl/apache-selfsigned.crt b/.devcontainer/conf/httpd/ssl/apache-selfsigned.crt new file mode 100644 index 000000000..b0e5db5fa --- /dev/null +++ b/.devcontainer/conf/httpd/ssl/apache-selfsigned.crt @@ -0,0 +1,20 @@ +-----BEGIN CERTIFICATE----- +MIIDOTCCAiGgAwIBAgIUCMtp7zGBSm27mjkmvqMww9BtkBowDQYJKoZIhvcNAQEL +BQAwRTELMAkGA1UEBhMCQVUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoM +GEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDAeFw0yNDA3MjcyMjM4MTdaFw0zNDA3 +MjUyMjM4MTdaMEUxCzAJBgNVBAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEw +HwYDVQQKDBhJbnRlcm5ldCBXaWRnaXRzIFB0eSBMdGQwggEiMA0GCSqGSIb3DQEB +AQUAA4IBDwAwggEKAoIBAQCtpzPeBvnCJJD36iaTClW1dprzqs9yMqEyLHaczOIm +VEsUG6ykWx1XpH4adAfVuVkyKgIuVWK57F4wmDq6mpyycfIbhT2r93fWkW5k10vU +c1QG6CPiQs01n0H3BqMXfbkYmJ5Re63cDawRT5aofpc2ClSk7odrL2cF0keb84qB +4b6M4D2fGEL9dkwzXeKysMqmcur6jsfAv1ojB4lie+q2UR3VIvU2OP8NQckJJ4le +O5i20gR5iX71KykgCy4J2OelU18RH3yY9AZd+m6rWokIqqvS3Izz1hTRC7TQUDql +RCWCCyLZolWs9T5K2i23lpswWX+bjtkR1NAqPy+W0WJfAgMBAAGjITAfMB0GA1Ud +DgQWBBTUzyYg3BCKqzFWJSu/iTNxknyphjANBgkqhkiG9w0BAQsFAAOCAQEAouJq +l6vdg5x/nOBRO+opqIetyc0iux/aJb4QxcMgMgH0c756+EhIFtkx6oxMf7PfNqXF +xykkjE5qRMWdtYRsR9unYX/aXJG22iHce9rbK7NgQe0UvqfTZcHCLuvjJA+Iyxnk +KPUboPoBqE9ByOhX9NnMBkmhJPe/l4pE0h8hXPEFYvTDfAYYFh6+4JAtEqF+E8ZW +UBPZLG+nM48TuPte8iWRHZyn70h2dGQ05Wzlov58ftV1AY5BAo7z3b/ZCEz3gTNe ++TcN413F1drctxjSXAd5OuqTEUOutaUwdwAbRQpOXuMDabXGQvTXMIRnHG0QLmQo +YzVEGaUAWP4MeXrvIQ== +-----END CERTIFICATE----- diff --git a/.devcontainer/conf/httpd/ssl/apache-selfsigned.csr b/.devcontainer/conf/httpd/ssl/apache-selfsigned.csr new file mode 100644 index 000000000..3be42b38f --- /dev/null +++ b/.devcontainer/conf/httpd/ssl/apache-selfsigned.csr @@ -0,0 +1,16 @@ +-----BEGIN CERTIFICATE REQUEST----- +MIICijCCAXICAQAwRTELMAkGA1UEBhMCQVUxEzARBgNVBAgMClNvbWUtU3RhdGUx +ITAfBgNVBAoMGEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDCCASIwDQYJKoZIhvcN +AQEBBQADggEPADCCAQoCggEBAK2nM94G+cIkkPfqJpMKVbV2mvOqz3IyoTIsdpzM +4iZUSxQbrKRbHVekfhp0B9W5WTIqAi5VYrnsXjCYOrqanLJx8huFPav3d9aRbmTX +S9RzVAboI+JCzTWfQfcGoxd9uRiYnlF7rdwNrBFPlqh+lzYKVKTuh2svZwXSR5vz +ioHhvozgPZ8YQv12TDNd4rKwyqZy6vqOx8C/WiMHiWJ76rZRHdUi9TY4/w1ByQkn +iV47mLbSBHmJfvUrKSALLgnY56VTXxEffJj0Bl36bqtaiQiqq9LcjPPWFNELtNBQ +OqVEJYILItmiVaz1PkraLbeWmzBZf5uO2RHU0Co/L5bRYl8CAwEAAaAAMA0GCSqG +SIb3DQEBCwUAA4IBAQBgCABl1ViXYbRIMtZR4UA2Cd0jY5kqMq0CePWHDYOI+eUP +qcnx+sVNZN5ixDdm3Dv6g7dwu3g8FZ3oC/jS/JhTJbbVubPq21T3nv0ZIOL3rmMp +hJsWBBanVgLi3MD+UsF/2IrJYf7mOR2OEVmb4dglUJNgkcbuaTA4nF5nFS/gVZxg +id6wvGygNuoGXhWVOC1amr+xYqt6Wv/U2vA8fQ9LWL7L7/eU2ol2VurC8bEAQYRR +7O8WOk9j2njDRzE8HHKg7iSSDleMiYtAcs2HIljlTAB7mQolkYpcfyIOE1wFWG14 +IhS/p2SxHfvUKvJIgauG7DkFeURRtnqEioB2JwyE +-----END CERTIFICATE REQUEST----- diff --git a/.devcontainer/conf/httpd/ssl/apache-selfsigned.key b/.devcontainer/conf/httpd/ssl/apache-selfsigned.key new file mode 100644 index 000000000..a91c0be65 --- /dev/null +++ b/.devcontainer/conf/httpd/ssl/apache-selfsigned.key @@ -0,0 +1,28 @@ +-----BEGIN PRIVATE KEY----- +MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCtpzPeBvnCJJD3 +6iaTClW1dprzqs9yMqEyLHaczOImVEsUG6ykWx1XpH4adAfVuVkyKgIuVWK57F4w +mDq6mpyycfIbhT2r93fWkW5k10vUc1QG6CPiQs01n0H3BqMXfbkYmJ5Re63cDawR +T5aofpc2ClSk7odrL2cF0keb84qB4b6M4D2fGEL9dkwzXeKysMqmcur6jsfAv1oj +B4lie+q2UR3VIvU2OP8NQckJJ4leO5i20gR5iX71KykgCy4J2OelU18RH3yY9AZd ++m6rWokIqqvS3Izz1hTRC7TQUDqlRCWCCyLZolWs9T5K2i23lpswWX+bjtkR1NAq +Py+W0WJfAgMBAAECggEAETSSfFp56d/FnUqjLR5xBNxjgzur93HyFrk2Z1gaxWwZ ++ZFkYZnFe9GId7EstY2lEMX+FqkkcazBsv7iPWrkQP9D2wYwk2v0K7DtHICturb9 +NFH70YcyMzCRpfAPvgbEOB5RprEiYL3aC+e0KFhNPcV4QtR/W6yuqxz9NgPDTWru +g061RKNlqkeNUp5cnOWhj2Z98SfyZEmN8eIYNW0/neGHiYzXgrpWNvlu5Y1yuZxF +ztapr4Oigl6CK7uJ0fOMRsGDdpjfAmOaXGJn2Y848VjUDvlj4HuyW2InPvDwd5t2 +Do/1zqasMMPl+xa7729Sr5oWYu4IaG/sTTLGQNC2gQKBgQDoeXAQDtwxche3Bddw +WEn6ZtpbgDyeoDroZ4P9Fzyq5Rc3HJxv4WFILlYR16buJlPn7QARUD8r2/n+oTiA +CN75z5YDKoRmKbCflp2OHmSWWCd7lIzpxaOoOwtPYhOWyaR4BEfaGPjowUz0XBfr +Zp80APMOhNZKeeLUOR+Skk09VwKBgQC/Oevluv9rvELX2h09BvE63ZwHjdqW0xaz +udSGATpssOeu+9k4E0WKqbyzIhYzR0tGYDHqgdAvU5sr++q/ImhIrz4qRgBSBZs1 +/1DvbarjogoSZK4lKB20vme+b329sv4TE1c+tusFmLQc+beS67MWfCtvoRzT79Lj +WVjhUWjWOQKBgQDParIykZ+iukIweRTMVunCcYw3gYYUna+RdfKMmPP3IimBcZSe +Of/bMAR5LOjyqN3KG2opCGkkj8NQjbXkfoW7a5xTvNaedGnzKaXvjGyAu6yWlWbY +mQ845V1k+YOy0LxenKsjC47h1L39dEGfNVOsSYCTHrA3iOJ6KXFjDAfARwKBgAqK +yet/VKd+2HyH5MbBhDkHkJuGAYABISZFX2cH2E23rv4hmkcSIOpVEzcY8PpgutCl +avsPrwd853gUSkvBPNiM+LNh6pCbCISAj9izRhGIlF+RN1yLCqA1Qwjnopn7rTAm +B9BIS0qisYNLbQhngBcEP2zHCAzTEuA/w7ugPlRZAoGBAK2wW8ByG3DagT2S4BPB +kR/199rdPlNDr6x/BUdceYD76+ZvUsE+mJpzyluU4ECJwNlWLQZkw4uAaRWUNGP6 +wPYQH2LwXLoj9kxckHEdrC9S0uyEs7A8j60SrGGEtylLG7xS9LyGWj3ZwrycmPoA +DOKRLBQCahiob4BAfDfQjXDg +-----END PRIVATE KEY----- diff --git a/.devcontainer/conf/httpd/ssl/generate.sh b/.devcontainer/conf/httpd/ssl/generate.sh new file mode 100755 index 000000000..2403a4b03 --- /dev/null +++ b/.devcontainer/conf/httpd/ssl/generate.sh @@ -0,0 +1,7 @@ +#!/bin/bash + +rm -f apache-selfsigned.key apache-selfsigned.csr apache-selfsigned.crt +openssl genpkey -algorithm RSA -out apache-selfsigned.key +openssl req -new -key apache-selfsigned.key -out apache-selfsigned.csr +openssl x509 -req -days 3650 -in apache-selfsigned.csr -signkey apache-selfsigned.key -out apache-selfsigned.crt + diff --git a/.devcontainer/conf/ldap/users.ldif b/.devcontainer/conf/ldap/users.ldif new file mode 100644 index 000000000..5c7890ff4 --- /dev/null +++ b/.devcontainer/conf/ldap/users.ldif @@ -0,0 +1,166 @@ +# extended LDIF +# +# LDAPv3 +# base with scope subtree +# filter: (objectclass=*) +# requesting: ALL +# + +# example.org +dn: dc=example,dc=org +objectClass: dcObject +objectClass: organization +dc: example +o: example + +# users, example.org +dn: ou=users,dc=example,dc=org +objectClass: organizationalUnit +ou: users + +dn: ou=groups,dc=example,dc=org +objectClass: organizationalUnit +ou: groups + +dn: uid=sogo,ou=users,dc=example,dc=org +uid: sogo +cn: Sogo +sn: Sogo +mail: sogo@example.org +objectClass: inetOrgPerson +objectClass: posixAccount +objectClass: shadowAccount +userPassword:: c29nbw== +uidNumber: 1000 +gidNumber: 1000 +homeDirectory: /home/sogo + +dn: uid=cyrus,ou=users,dc=example,dc=org +uid: cyrus +cn: cyrus +sn: cyrus +objectClass: inetOrgPerson +objectClass: posixAccount +objectClass: shadowAccount +userPassword:: c29nbw== +uidNumber: 1000 +gidNumber: 1000 +homeDirectory: /home/cyrus + +dn: uid=sogo-tests1,ou=users,dc=example,dc=org +uid: sogo-tests1 +cn: Dude +sn: Love +givenName: Dude +homePhone: +1 (123) 456-7890 +l: Vladivostok +telephoneNumber: +1 (120) 987-6543 +mail: sogo-tests1@example.org +objectClass: inetOrgPerson +objectClass: posixAccount +objectClass: shadowAccount +userPassword:: c29nbw== +uidNumber: 1000 +gidNumber: 1000 +homeDirectory: /home/sogo-tests1 + +dn: uid=sogo-tests2,ou=users,dc=example,dc=org +uid: sogo-tests2 +cn: Hewill +sn: Crashit +givenName: Hewill +homePhone: +1 (123) 456-7890 +l: Vladivostok +telephoneNumber: +1 (120) 987-6543 +mail: sogo-tests2@example.org +objectClass: inetOrgPerson +objectClass: posixAccount +objectClass: shadowAccount +userPassword:: c29nbw== +uidNumber: 1000 +gidNumber: 1000 +homeDirectory: /home/sogo-tests2 + +dn: uid=sogo-tests3,ou=users,dc=example,dc=org +uid: sogo-tests3 +cn: Ithas +sn: Exploded +givenName: Ithas +homePhone: +1 (123) 456-7890 +l: Vladivostok +telephoneNumber: +1 (120) 987-6543 +mail: sogo-tests3@example.org +objectClass: inetOrgPerson +objectClass: posixAccount +objectClass: shadowAccount +userPassword:: c29nbw== +uidNumber: 1000 +gidNumber: 1000 +homeDirectory: /home/sogo-tests3 + +dn: uid=sogo-tests-super,ou=users,dc=example,dc=org +uid: sogo-tests-super +cn: John Doe +sn: Doe +givenName: John +homePhone: +1 (123) 456-7890 +l: Vladivostok +telephoneNumber: +1 (120) 987-6543 +mail: sogo-tests-super@example.org +objectClass: inetOrgPerson +objectClass: posixAccount +objectClass: shadowAccount +userPassword:: c29nbw== +uidNumber: 1000 +gidNumber: 1000 +homeDirectory: /home/sogo-tests-super + +dn: uid=res,ou=users,dc=example,dc=org +uid: res +cn: resource No Overbook +sn: source +departmentNumber: 1 +description: location +givenName: res +mail: res@example.org +objectClass: inetOrgPerson +objectClass: posixAccount +objectClass: shadowAccount +userPassword:: c29nbw== +uidNumber: 1000 +gidNumber: 1000 +homeDirectory: /home/res + +dn: uid=res-nolimit,ou=users,dc=example,dc=org +uid: res-nolimit +cn: resource Overbook +sn: source +departmentNumber: 0 +description: location +givenName: res-nolimit +mail: res-nolimit@example.org +objectClass: inetOrgPerson +objectClass: posixAccount +objectClass: shadowAccount +userPassword:: c29nbw== +uidNumber: 1000 +gidNumber: 1000 +homeDirectory: /home/res-nolimit + +# readers, users, example.org +dn: uid=readers,ou=users,dc=example,dc=org +objectClass: extensibleObject +objectClass: groupOfNames +cn: readers +mail: readers@example.org +member: uid=sogo-tests1,ou=users,dc=example,dc=org +member: uid=sogo-tests2,ou=users,dc=example,dc=org +member: uid=sogo-tests3,ou=users,dc=example,dc=org + + +# search result +search: 2 +result: 0 Success + +# numResponses: 14 +# numEntries: 13 \ No newline at end of file diff --git a/.devcontainer/conf/postfix/Dockerfile b/.devcontainer/conf/postfix/Dockerfile new file mode 100644 index 000000000..49f737fe3 --- /dev/null +++ b/.devcontainer/conf/postfix/Dockerfile @@ -0,0 +1,8 @@ +# original catatnight/postfix +FROM agiledigital/postfix:latest + +ADD main.cf /etc/postfix/main.cf +ADD mailname /etc/mailname +ADD virtual /etc/postfix/virtual +ADD entrypoint.sh /entrypoint.sh + diff --git a/.devcontainer/conf/postfix/entrypoint.sh b/.devcontainer/conf/postfix/entrypoint.sh new file mode 100755 index 000000000..89f45c5c4 --- /dev/null +++ b/.devcontainer/conf/postfix/entrypoint.sh @@ -0,0 +1,12 @@ +#!/bin/bash + +cp /etc/postfix/main.cf /etc/postfix/main.cf.bak +chown root:root /etc/postfix/virtual +chown root:root /etc/postfix/virtual.db +postmap /etc/postfix/virtual + +/opt/install.sh +# /opt/install.sh make changes /etc/postfix/main.cf, so restore bak file +rm -f /etc/postfix/main.cf +cp /etc/postfix/main.cf.bak /etc/postfix/main.cf +/usr/bin/supervisord -c /etc/supervisor/supervisord.conf \ No newline at end of file diff --git a/.devcontainer/conf/postfix/mailname b/.devcontainer/conf/postfix/mailname new file mode 100644 index 000000000..0af0977a7 --- /dev/null +++ b/.devcontainer/conf/postfix/mailname @@ -0,0 +1 @@ +example.org \ No newline at end of file diff --git a/.devcontainer/conf/postfix/main.cf b/.devcontainer/conf/postfix/main.cf new file mode 100644 index 000000000..ab565f888 --- /dev/null +++ b/.devcontainer/conf/postfix/main.cf @@ -0,0 +1,52 @@ +# Debian specific: Specifying a file name will cause the first +# line of that file to be used as the name. The Debian default +# is /etc/mailname. +#myorigin = /etc/mailname + +smtpd_banner = $myhostname ESMTP $mail_name (Ubuntu) +biff = no + +# appending .domain is the MUA's job. +append_dot_mydomain = no + +# Uncomment the next line to generate "delayed mail" warnings +#delay_warning_time = 4h + +readme_directory = no + +# See http://www.postfix.org/COMPATIBILITY_README.html -- default to 3.6 on +# fresh installs. +compatibility_level = 3.6 + +# TLS parameters +smtpd_tls_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem +smtpd_tls_key_file=/etc/ssl/private/ssl-cert-snakeoil.key +smtpd_tls_security_level=may + +smtp_tls_CApath=/etc/ssl/certs +smtp_tls_security_level=may +smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache + +smtp_sender_dependent_authentication = yes +smtp_sasl_auth_enable = yes +smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd + +smtpd_relay_restrictions = permit_mynetworks permit_sasl_authenticated defer_unauth_destination +myhostname = localhost +alias_maps = hash:/etc/aliases +alias_database = hash:/etc/aliases +mydestination = example.org +mydomain = example.org +relayhost = +mailbox_size_limit = 51200000 +recipient_delimiter = +inet_interfaces = all +inet_protocols = all +maillog_file = /var/log/mail.log +myorigin = /etc/mailname +default_transport = error +relay_transport = error + +mailbox_transport = lmtp:inet:imapd:24 + +local_recipient_maps = hash:/etc/postfix/virtual diff --git a/.devcontainer/conf/postfix/virtual b/.devcontainer/conf/postfix/virtual new file mode 100644 index 000000000..c279a6486 --- /dev/null +++ b/.devcontainer/conf/postfix/virtual @@ -0,0 +1 @@ +@example.org root \ No newline at end of file diff --git a/.devcontainer/conf/sogo/common.sh b/.devcontainer/conf/sogo/common.sh new file mode 100755 index 000000000..217f9f649 --- /dev/null +++ b/.devcontainer/conf/sogo/common.sh @@ -0,0 +1,518 @@ +#!/bin/bash + +TESTS_RET=0 +SRC_SOPE=$1 +SRC_SOGO=$2 +TESTS_FAILED=false +TESTS_RESULTS=() +JSON_TEST_RESULTS_PATH="/tmp/tests_results.json" + +export TERM=xterm + +# formatting +bold=$(tput bold) +normal=$(tput sgr0) +underline=$(tput smul) +no_underline=$(tput rmul) +red=$(tput setaf 1) +green=$(tput setaf 2) +yellow=$(tput setaf 3) +blue=$(tput setaf 4) +magenta=$(tput setaf 5) +cyan=$(tput setaf 6) +white=$(tput setaf 7) + +title() { + echo "${bold}${cyan}$1${normal}" +} + +subtitle() { + echo "${magenta}$1${normal}" +} + +subsubtitle() { + echo "${cyan}$1${normal}" +} + +texterror() { + echo "${bold}${red}$1${normal}" +} + +textwarning() { + echo "${bold}${yellow}$1${normal}" +} + +textsuccess() { + echo "${bold}${green}$1${normal}" +} + +stepsuccess() { + echo -e "$1 ${bold}${green}✔ ${normal}${bold}$2${normal}" +} + +steperror() { + echo -e "$1 ${bold}${red}𐄂 ${normal}${bold}$2${normal}" +} + +in_array() { + local SEARCH_ELEMENT + SEARCH_ELEMENT="$1" + shift + local ELEMENT + for ELEMENT in "$@"; do + if [[ "$ELEMENT" == "$SEARCH_ELEMENT" ]]; then + return 0 + fi + done + return 1 +} + +is_in_docker() { + if [ -f /.dockerenv ]; then + return 0 + else + return 1 + fi +} + +get_latest_github_commit_hash() { + REPO="$1" + BRANCH="${2:-master}" + TOKEN="$3" + GITHUB_API_URL="https://api.github.com/repos/$REPO/commits/$BRANCH" + LATEST_COMMIT_HASH=$(curl -s -k -H "Authorization: token $TOKEN" $GITHUB_API_URL | grep '"sha"' | head -n 1 | awk '{print $2}' | tr -d '",') + + echo "$LATEST_COMMIT_HASH" +} + +build_system_header() { + echo "${white} " + echo "${white} " + echo "${white} " + echo "${white} ${green}▒▒▒▒${white} " + echo "${white} ${green}▒▒▒${white} ${green}▒▒▒▒${white} " + echo "${white} ${green}▒▒▒${white} ${green}▒▒▒${white} ${green}▒▒${white} " + echo "${white} ${green}▒▒▒${white} ${green}▒▒${white} ${green}▒▒${white} ${green}▒▒${white} " + echo "${white} ${green}▒▒▒▒▒▒▒▒▒▒${white} ${green}▒▒▒▒▒▒▒▒▒▒▒${white} ${green}▒▒▒▒▒▒▒▒▒▒▒▒${white} ${green}▒▒${white} ${green}▒▒${white} ${green}▒▒${white} ${green}▒▒${white} " + echo "${white} ${green}▒▒${white} ${green}▒▒${white} ${green}▒▒▒${white} ${green}▒▒▒${white} ${green}▒▒▒${white} ${green}▒▒▒${white} ${green}▒▒${white} ${green}▒▒▒▒▒▒${white} ${green}▒▒▒${white} " + echo "${white} ${green}▒▒▒${white} ${green}▒▒▒${white} ${green}▒▒▒${white} ${green}▒▒${white} ${green}▒▒▒${white} ${green}▒▒${white} ${green}▒▒▒${white} " + echo "${white} ${green}▒▒▒▒▒▒▒${white} ${green}▒▒▒${white} ${green}▒▒${white} ${green}▒▒▒${white} ${green}▒▒▒${white} ${green}▒▒▒▒▒▒▒▒▒${white} " + echo "${white} ${green}▒▒▒▒${white} ${green}▒▒▒${white} ${green}▒▒${white} ${green}▒▒${white} ${green}▒▒▒${white} " + echo "${white} ${green}▒▒▒${white} ${green}▒▒${white} ${green}▒▒▒${white} ${green}▒▒▒${white} ${green}▒▒${white} " + echo "${white} ${green}▒▒▒${white} ${green}▒▒▒${white} ${green}▒▒▒${white} ${green}▒▒▒${white} ${green}▒▒▒${white} ${green}▒▒▒${white} " + echo "${white} ${green}▒▒▒▒▒▒▒▒▒${white} ${green}▒▒▒▒▒▒▒▒▒▒${white} ${green}▒▒▒▒▒▒▒▒▒▒${white} " + echo "${white} ${green}▒▒▒${white} " + echo "${white} ${green}▒▒${white} " + echo "${white} ${green}▒▒▒▒▒▒▒▒▒▒▒▒▒${white} " + echo "${white} ${green}▒▒▒${white} ${green}▒▒▒${white} " + echo "${white} ${green}▒▒${white} ${green}▒▒▒${white} " + echo "${white} ${green}▒▒${white} ${green}▒▒${white} " + echo "${white} ${green}▒▒▒▒${white} ${green}▒▒▒▒${white} " + echo "${white} ${green}▒▒▒▒▒▒▒▒▒▒${white} " + echo "${white} " + echo "${white} ${bold}${green}BUILD SYSTEM${normal} " + echo "${white} " + echo "" +} + + +check_exit_code() { + local EXIT_CODE=$? + if [ $EXIT_CODE -ne 0 ]; then + return $EXIT_CODE + fi + } + +function prep_tests { + # install node modules + cd "$SRC_SOGO/Tests" && \ + npm config set loglevel=error && \ + npm install > /dev/null + RC=$? + GRC=$(($GRC+$RC)) + if [ $RC -ne 0 ]; then + MSG="$MSG\nError installing node modules" + error_out + fi + + # fixup the tests configuration + cd "$SRC_SOGO/Tests/lib" && \ + cat >config.js <" + }, + mailserver: "dovecot", + testput_nbrdays: 30, + sieve_server: "dovecot", + sieve_port: 4190, + sogo_user: "sogo", + sogo_tool_path: "/usr/sbin/sogo-tool", + webCalendarURL: "http://httpd/CanadaHolidays.ics", + timeout: 600000 +} +EOF + RC=$? + GRC=$(($GRC+$RC)) + if [ $RC -ne 0 ]; then + MSG="$MSG\nError creating config.js" + error_out + fi + + sleep 1 +} + +function prep_tests_mysql { + rm /etc/sogo/sogo.conf + cp /etc/sogo/sogo-tests-mysql-ldap.conf /etc/sogo/sogo.conf + + TMP_FILE=$(mktemp) + chmod 600 $TMP_FILE + cat < $TMP_FILE +[client] +user = sogobuild +password = sogo123 +host = mariadb +EOF + + # drop the mysql database and recreate it + echo "drop database sogo_integration_tests;" | mysql --defaults-extra-file=$TMP_FILE -h mariadb + echo "create database sogo_integration_tests charset=utf8;" | mysql --defaults-extra-file=$TMP_FILE -h mariadb + + rm $TMP_FILE + + RC=$? + GRC=$(($GRC+$RC)) + if [ $RC -ne 0 ]; then + MSG="$MSG\nError recreating MySQL database" + error_out + fi +} + +function prep_tests_postgresql { + rm /etc/sogo/sogo.conf + cp /etc/sogo/sogo-tests-postgresql-ldap.conf /etc/sogo/sogo.conf + + # drop the postgresql database and recreate it + # the env var is unsafe, i know... just easier and non sensitive anyway + PGPASSWORD=sogo123 dropdb -U sogobuild -h postgres sogo_integration_tests + PGPASSWORD=sogo123 createdb -O sogobuild -U sogobuild -h postgres sogo_integration_tests + RC=$? + GRC=$(($GRC+$RC)) + if [ $RC -ne 0 ]; then + MSG="$MSG\nError recreating postgresql database" + error_out + fi +} + +function prep_tests_mysql_auth { + rm /etc/sogo/sogo.conf + cp /etc/sogo/sogo-tests-mysql.conf /etc/sogo/sogo.conf +} + +function prep_tests_postgresql_auth { + rm /etc/sogo/sogo.conf + cp /etc/sogo/sogo-tests-postgresql.conf /etc/sogo/sogo.conf +} + +function prep_tests_mysql_combined { + rm /etc/sogo/sogo.conf + cp /etc/sogo/sogo-tests-mysql-ldap-combined.conf /etc/sogo/sogo.conf +} + +function prep_tests_mysql_auth_combined { + rm /etc/sogo/sogo.conf + cp /etc/sogo/sogo-tests-mysql-combined.conf /etc/sogo/sogo.conf +} + +function prep_tests_postgresql_combined { + rm /etc/sogo/sogo.conf + cp /etc/sogo/sogo-tests-postgresql-ldap-combined.conf /etc/sogo/sogo.conf +} + +function prep_tests_postgresql_auth_combined { + rm /etc/sogo/sogo.conf + cp /etc/sogo/sogo-tests-postgresql-combined.conf /etc/sogo/sogo.conf +} + +function error_out { + set +x + echo -e "$MSG" + exit 1 +} + +function check_tests { + FAIL=$(cat /tmp/out.log | grep -m 1 -Eo "([0-9]+)\s+failure" | cut -d' ' -f 1) + TOTAL=$(cat /tmp/out.log | grep -m 1 -Eo "([0-9]+)\s+spec" | cut -d' ' -f 1) + NOT_EXECUTED=$(cat /tmp/out.log | grep -m 1 -Eo "([0-9]+)\s+pending" | cut -d' ' -f 1) + + # If test fail + if [ $FAIL -gt 0 ] + then + TESTS_RET=1 + fi + + # Console + echo -e "\033[1mTests results for $1\033[0m" >> "$SRC_SOGO/Tests/results/tests_results.txt" + echo -e "Total : $TOTAL" >> "$SRC_SOGO/Tests/results/tests_results.txt" + if [ $FAIL -gt 0 ] + then + echo -e "\033[0;31mFailed : $FAIL\033[0m" >> "$SRC_SOGO/Tests/results/tests_results.txt" + else + echo -e "Failed : $FAIL" >> "$SRC_SOGO/Tests/results/tests_results.txt" + fi + echo -e "Not executed : $NOT_EXECUTED" >> "$SRC_SOGO/Tests/results/tests_results.txt" + if [ $FAIL -gt 0 ] + then + echo -e "\033[0;31mTests failed\033[0m" >> "$SRC_SOGO/Tests/results/tests_results.txt" + else + echo -e "\033[0;36mTests success\033[0m" >> "$SRC_SOGO/Tests/results/tests_results.txt" + fi + echo "" >> "$SRC_SOGO/Tests/results/tests_results.txt" + + # HTML + echo "" >> "$SRC_SOGO/Tests/results/index.html" + echo "" >> "$SRC_SOGO/Tests/results/index.html" + if [ $FAIL -gt 0 ] + then + echo "" >> "$SRC_SOGO/Tests/results/index.html" + echo "" >> "$SRC_SOGO/Tests/results/index.html" + else + echo "" >> "$SRC_SOGO/Tests/results/index.html" + echo "" >> "$SRC_SOGO/Tests/results/index.html" + fi + echo "" >> "$SRC_SOGO/Tests/results/index.html" + echo "
$1
TotalFailedNot executed
$TOTAL$FAIL$NOT_EXECUTED
Tests failed$TOTAL$FAIL$NOT_EXECUTED
Tests success
View test report
" >> "$SRC_SOGO/Tests/results/index.html" + if [ $TESTS_RET -eq 1 ] + then + echo -e "\033[0;31mFailed\033[0m" + return 131 + else + echo -e "\033[0;36mSuccess\033[0m" + fi +} + +function run_tests { + RET=0 + USE_PKILL=$3 + + # create empty logfile + cat /dev/null >/tmp/out.log + + if [ "$USE_PKILL" -eq 1 ]; then + pkill -9 sogod + else + service sogod stop + fi + # Kill residual SOGo process + LSOF_OUT=$(lsof -i TCP@127.0.0.1 -Fp | tr -d p) + if [ ! -z "$LSOF_OUT" ]; then + kill -9 $LSOF_OUT + fi + + + # restart services + if [ "$USE_PKILL" -eq 1 ]; then + su -s /bin/bash -c "/usr/sbin/sogod -WOWorkersCount 3 -WOPidFile /var/run/sogo/sogo.pid -WOLogFile /var/log/sogo/sogo.log" sogo + else + service sogod start + fi + + # wait for it to settle + sleep 3 + + # run the tests and gather output + cd "$SRC_SOGO/Tests" + RC=$? + GRC=$(($GRC+$RC)) + if [ $RC -ne 0 ]; then + MSG="$MSG\nCan't cd into the Tests folder..." + error_out + fi + npm run test-junit 2>&1 | tee -a /tmp/out.log + + RC=$? + GRC=$(($GRC+$RC)) + if [ $RC -ne 0 ]; then + MSG="$MSG\nError running the integration tests" + error_out + fi + + # source GNUstep.sh +# set +x + #. /usr/share/GNUstep/Makefiles/GNUstep.sh +# set -x + + # teststrings + # run only once, no point in running with all the backend + # substitutions + # if [[ -z ${TEST_RUN_COUNT} || ${TEST_RUN_COUNT} -lt 1 ]]; then + # cd Integration + # ./teststrings.sh 2>&1 | tee -a /tmp/out.log + # fi + + # stop sogo when we're done + if [ "$USE_PKILL" -eq 1 ]; then + pkill -9 sogod + else + service sogod stop + fi + + XML_FILE="$SRC_SOGO/Tests/results/$2" + mv /tmp/results.xml "$XML_FILE" + + check_tests "$1" "$2" + + # Generate JSON + TOTAL_TESTS=$(xmllint --xpath 'sum(//testsuite/@tests)' "$XML_FILE") + TOTAL_FAILURES=$(xmllint --xpath 'sum(//testsuite/@failures)' "$XML_FILE") + TOTAL_ERRORS=$(xmllint --xpath 'sum(//testsuite/@errors)' "$XML_FILE") + TOTAL_FAILED=$(($TOTAL_FAILURES + $TOTAL_ERRORS)) + TOTAL_SUCCESS=$(($TOTAL_TESTS - $TOTAL_FAILED)) + if [ "$TOTAL_FAILED" -gt 0 ]; then + FAILED=true + TESTS_FAILED=true + else + FAILED=false + fi + JSON_DATA=$(jq -n \ + --argjson total_tests "$TOTAL_TESTS" \ + --argjson total_failed "$TOTAL_FAILED" \ + --argjson total_success "$TOTAL_SUCCESS" \ + --arg description "$1" \ + --arg scenario "$2" \ + --argjson failed "$FAILED" \ + '{scenario: $scenario, description: $description, total_tests: $total_tests, total_failed: $total_failed, total_success: $total_success, failed: $failed}') + TESTS_RESULTS+=("$JSON_DATA") +} + +test() { + #set -x + USE_PKILL=${1:-0} + TESTS_FAILED=false + TESTS_RESULTS=() + rm -f "$JSON_TEST_RESULTS_PATH" + if [ "${SKIP_TESTS:-0}" -eq 1 ]; then + subsubtitle "Skipping tests" + return 0; + fi + + # INTEGRATION TESTS + if [[ -d "$SRC_SOGO/Tests/results" ]]; then + rm -Rf "$SRC_SOGO/Tests/results" + fi + + mkdir -p "$SRC_SOGO/Tests/results" + echo "" > "$SRC_SOGO/Tests/results/tests_results.txt" + echo "" > "$SRC_SOGO/Tests/results/index.html" + + test_title_color="${bold}${yellow}" + + # MySQL + echo "${test_title_color}Running tests with LDAP auth and MySQL backend${normal}" + prep_tests + prep_tests_mysql + run_tests "Running tests with LDAP auth and MySQL backend" "results-mysql-ldap.xml" $USE_PKILL + + echo "${test_title_color}Running tests with MySQL auth and MySQL backend${normal}" + prep_tests + prep_tests_mysql + prep_tests_mysql_auth + run_tests "Running tests with MySQL auth and MySQL backend" "results-mysql.xml" $USE_PKILL + + echo "${test_title_color}Running tests with LDAP auth and MySQL backend, combined database tables${normal}" + prep_tests + prep_tests_mysql + prep_tests_mysql_combined + run_tests "Running tests with LDAP auth and MySQL backend, combined database tables" "results-mysql-ldap-combined.xml" $USE_PKILL + + echo "${test_title_color}Running tests with MySQL auth and MySQL backend, combined database tables${normal}" + prep_tests + prep_tests_mysql + prep_tests_mysql_auth_combined + run_tests "Running tests with MySQL auth and MySQL backend, combined database tables" "results-mysql-combined.xml" $USE_PKILL + + + # PGSQL + echo "${test_title_color}Running tests with LDAP auth and postgresql backend${normal}" + prep_tests + prep_tests_postgresql + run_tests "Running tests with LDAP auth and postgresql backend" "results-postgresql-ldap.xml" $USE_PKILL + + echo "${test_title_color}Running tests with postgresql auth and postgresql backend${normal}" + prep_tests + prep_tests_postgresql + prep_tests_postgresql_auth + run_tests "Running tests with postgresql auth and postgresql backend" "results-postgresql.xml" $USE_PKILL + + echo "${test_title_color}Running tests with LDAP auth and postgresql backend, combined database tables${normal}" + prep_tests + prep_tests_postgresql + prep_tests_postgresql_combined + run_tests "Running tests with LDAP auth and postgresql backend, combined database tables" "results-postgresql-ldap-combined.xml" $USE_PKILL + + echo "${test_title_color}Running tests with postgresql auth and postgresql backend, combined database tables${normal}" + prep_tests + prep_tests_postgresql + prep_tests_postgresql_auth_combined + run_tests "Running tests with postgresql auth and postgresql backend, combined database tables" "results-postgresql-combined.xml" $USE_PKILL + + + # set -x + + # JUnit + for file in $SRC_SOGO/Tests/results/*.xml #$xmlfiles + do + xunit-viewer -r $file -c -o "$file.html" + done + cat "$SRC_SOGO/Tests/results/tests_results.txt" + echo "" >> "$SRC_SOGO/Tests/results/index.html" + chown 644 -R "$SRC_SOGO/Tests/results" + chown -R www-data:www-data "$SRC_SOGO/Tests/results" + + # Restore conf + rm /etc/sogo/sogo.conf + cp /etc/sogo/sogo-base.conf /etc/sogo/sogo.conf + if [ "$USE_PKILL" -eq 1 ]; then + pkill -9 sogod + su -s /bin/bash -c "/usr/sbin/sogod -WOWorkersCount 3 -WOPidFile /var/run/sogo/sogo.pid -WOLogFile /var/log/sogo/sogo.log" sogo + else + service sogod restart > /dev/null + fi + + # Global json results + TESTS_RESULTS_JSON=$(printf '%s\n' "${TESTS_RESULTS[@]}" | jq -s .) + FINAL_JSON=$(jq -n \ + --argjson tests_failed "$TESTS_FAILED" \ + --argjson tests "$TESTS_RESULTS_JSON" \ + '{failed: $tests_failed, tests: $tests}') + echo "$FINAL_JSON" > $JSON_TEST_RESULTS_PATH + + result_link="${bold}${magenta}--------------------------------------------------\nTests results : https://127.0.0.1/tests/index.html${normal}" + + # If test fail + if [ $TESTS_RET -eq 1 ] + then + echo -e "$result_link [${bold}${red}Failed${normal}]\n" + return 131 + else + echo -e "$result_link [${bold}${green}Success${normal}]\n" + return 0 + fi +} diff --git a/.devcontainer/conf/sogo/compile_sogo.sh b/.devcontainer/conf/sogo/compile_sogo.sh new file mode 100644 index 000000000..098875d49 --- /dev/null +++ b/.devcontainer/conf/sogo/compile_sogo.sh @@ -0,0 +1,14 @@ +#!/bin/bash +cd ${WORKSPACE} \ +./configure --enable-debug --disable-strip --enable-mfa \ +make \ +make install \ +echo "register sogo library" \ +echo "/usr/local/lib/sogo" > /etc/ld.so.conf.d/sogo.conf \ +ldconfig \ +echo "create directories and enforce permissions" \ +install -o sogo -g sogo -m 755 -d /var/run/sogo \ +install -o sogo -g sogo -m 750 -d /var/spool/sogo \ +install -o sogo -g sogo -m 750 -d /var/log/sogo + +su -s /bin/bash - sogo -c "echo \"set debuginfod enabled off\" >> ~/.gdbinit" \ No newline at end of file diff --git a/.devcontainer/conf/sogo/devenv b/.devcontainer/conf/sogo/devenv new file mode 100755 index 000000000..3e4926124 --- /dev/null +++ b/.devcontainer/conf/sogo/devenv @@ -0,0 +1,147 @@ +#!/bin/bash + +SRC_SOPE=/src/SOPE/ +SRC_SOGO=/src/SOGo/ + +source /include/common.sh $SRC_SOPE $SRC_SOGO + +options="h:b:ba:br:d" +long_options="help,build,build-all,build-resources,debug" +parsed_options=$(getopt -o $options -l $long_options) + +# Check for errors in parsing +if [ $? -ne 0 ]; then + exit 1 +fi + +# Evaluate the parsed options +#eval set -- "$parsed_options" + +help() { + echo "${green} ----------------------" + echo "| ${bold}SOGo Dev env${normal}${green} |" + echo " ----------------------" + echo + echo "${normal}Options are :${cyan}" + + echo -e "-h, --help\t\tShow help" + echo -e "-b, --build\t\tBuild sogo app" + echo -e "-ba, --build-all\tClean, build sogo and sope" + echo -e "-br, --build-resources\tBuild only sogo JS/CSS resources" + echo -e "-d, --debug\t\tStart sogo in debug with gdb" + echo "${normal}" +} + +ssl_fix() { + if [[ -z "${LD_PRELOAD}" ]]; then + LIBSSL_LOCATION=$(find / -type f -name "libssl.so.*" -print -quit);echo "LD_PRELOAD=$LIBSSL_LOCATION" >> /etc/default/sogo + echo "LD_LIBRARY_PATH=/usr/local/lib/sogo:/usr/local/lib:$LD_LIBRARY_PATH" >> /etc/default/sogo + export LD_PRELOAD=$LIBSSL_LOCATION + else + echo "LD_PRELOAD=$LD_PRELOAD" >> /etc/default/sogo + echo "LD_LIBRARY_PATH=/usr/local/lib/sogo:/usr/local/lib:$LD_LIBRARY_PATH" >> /etc/default/sogo + export LD_PRELOAD=$LD_PRELOAD + fi +} + +build_resources() { + cd $SRC_SOGO + npm config set loglevel=error + git config --global --add safe.directory '*' + cd UI/WebServerResources + make dev + make install +} + +build_sogo() { + service sogod stop + ssl_fix + cd $SRC_SOGO + cd ActiveSync + make && make install + cd .. + ./configure --enable-saml2 --enable-debug --disable-strip --enable-mfa + make + make install + build_resources + RC=$? + if [ $RC -ne 0 ]; then + exit $RC + fi + if [ -z "$1" ] + then + service sogod start + fi +} + +build_all() { + service sogod stop + cd $SRC_SOPE + make clean + ./configure --with-gnustep --enable-debug --disable-strip + make + make install + cd $SRC_SOGO + cd ActiveSync + make clean + cd .. + make clean + build_sogo + RC=$? + if [ $RC -ne 0 ]; then + exit $RC + fi +} + +debug() { + build_sogo "norestart" + echo "${magenta}================" + echo "GDB reminders :" + echo " * run : Run app (set breakpoints before)" + echo " * break SOGo.m:494 : Add breakpoint example" + echo " * c : continue" + echo " * n : next" + echo " * list 504 : show lines around" + echo " * p var : print variable 'var'" + echo " * po var : print object 'var'" + echo " * bt : Show stacktrace" + echo " * bt full : Show stacktrace with all vars" + echo "================${normal}" + echo "" + + su -s /bin/bash - sogo -c "gdb --args /usr/local/sbin/sogod -WOUseWatchDog NO -WONoDetach YES -WOPort 0.0.0.0:50000 -WOWorkersCount 1 -WOPidFile /var/run/sogo/sogo.pid" +} + +# Process the options +while true; do + case "$1" in + -b|--build) + build_sogo + exit 0 + ;; + -ba|--build-all) + build_all + exit 0 + ;; + -br|--build-resources) + build_resources + exit 0 + ;; + -d|--debug) + debug + exit 0 + ;; + -h|--help) + help + exit 0 + ;; + --) + shift + break + ;; + *) + help + exit 1 + ;; + esac +done diff --git a/.devcontainer/conf/sogo/entrypoint.sh b/.devcontainer/conf/sogo/entrypoint.sh new file mode 100644 index 000000000..173305701 --- /dev/null +++ b/.devcontainer/conf/sogo/entrypoint.sh @@ -0,0 +1,53 @@ +#!/bin/bash + + +bold=$(tput bold) +normal=$(tput sgr0) +green=$(tput setaf 2) +white=$(tput setaf 7) +magenta=$(tput setaf 5) +cyan=$(tput setaf 6) +underline=$(tput smul) +no_underline=$(tput rmul) + +cd /src/SOGo + +echo "${white} " +echo "${white} " +echo "${white} " +echo "${white} ${green}▒▒▒▒${white} " +echo "${white} ${green}▒▒▒${white} ${green}▒▒▒▒${white} " +echo "${white} ${green}▒▒▒${white} ${green}▒▒▒${white} ${green}▒▒${white} " +echo "${white} ${green}▒▒▒${white} ${green}▒▒${white} ${green}▒▒${white} ${green}▒▒${white} " +echo "${white} ${green}▒▒▒▒▒▒▒▒▒▒${white} ${green}▒▒▒▒▒▒▒▒▒▒▒${white} ${green}▒▒▒▒▒▒▒▒▒▒▒▒${white} ${green}▒▒${white} ${green}▒▒${white} ${green}▒▒${white} ${green}▒▒${white} " +echo "${white} ${green}▒▒${white} ${green}▒▒${white} ${green}▒▒▒${white} ${green}▒▒▒${white} ${green}▒▒▒${white} ${green}▒▒▒${white} ${green}▒▒${white} ${green}▒▒▒▒▒▒${white} ${green}▒▒▒${white} " +echo "${white} ${green}▒▒▒${white} ${green}▒▒▒${white} ${green}▒▒▒${white} ${green}▒▒${white} ${green}▒▒▒${white} ${green}▒▒${white} ${green}▒▒▒${white} " +echo "${white} ${green}▒▒▒▒▒▒▒${white} ${green}▒▒▒${white} ${green}▒▒${white} ${green}▒▒▒${white} ${green}▒▒▒${white} ${green}▒▒▒▒▒▒▒▒▒${white} " +echo "${white} ${green}▒▒▒▒${white} ${green}▒▒▒${white} ${green}▒▒${white} ${green}▒▒${white} ${green}▒▒▒${white} " +echo "${white} ${green}▒▒▒${white} ${green}▒▒${white} ${green}▒▒▒${white} ${green}▒▒▒${white} ${green}▒▒${white} " +echo "${white} ${green}▒▒▒${white} ${green}▒▒▒${white} ${green}▒▒▒${white} ${green}▒▒▒${white} ${green}▒▒▒${white} ${green}▒▒▒${white} " +echo "${white} ${green}▒▒▒▒▒▒▒▒▒${white} ${green}▒▒▒▒▒▒▒▒▒▒${white} ${green}▒▒▒▒▒▒▒▒▒▒${white} " +echo "${white} ${green}▒▒▒${white} " +echo "${white} ${green}▒▒${white} " +echo "${white} ${green}▒▒▒▒▒▒▒▒▒▒▒▒▒${white} " +echo "${white} ${green}▒▒▒${white} ${green}▒▒▒${white} " +echo "${white} ${green}▒▒${white} ${green}▒▒▒${white} " +echo "${white} ${green}▒▒${white} ${green}▒▒${white} " +echo "${white} ${green}▒▒▒▒${white} ${green}▒▒▒▒${white} " +echo "${white} ${green}▒▒▒▒▒▒▒▒▒▒${white} " +echo "${white} " +echo "${white} ${bold}${green}DEVELOPER${normal} " +echo "${white} " +echo "${bold}${magenta}Access : https://127.0.0.1/SOGo/${normal}" +echo "${bold}${cyan}Use ${underline}devenv${no_underline} command to start${normal}" +echo "" + +HAS_OLD_SOGO_INSTANCE=$(find /usr/local/lib/sogo/ -type f -name libSOGoUI.so.* | wc -l) +if [ "$HAS_OLD_SOGO_INSTANCE" -gt 1 ]; then + echo "${bold}${red}/!\ You have an instable dev environment (two sogo libraries versions). This can be caused by a disynchronized SOGo code source (docker and local environment) This can be fixed by updating your local git repositories, delete and rebuild docker compose. You can also run devenv -ba.${normal}" +fi + + +/etc/init.d/sogod restart +# Run for ever +tail -f /dev/null diff --git a/.devcontainer/conf/sogo/sogo.conf b/.devcontainer/conf/sogo/sogo.conf new file mode 100644 index 000000000..75a624071 --- /dev/null +++ b/.devcontainer/conf/sogo/sogo.conf @@ -0,0 +1,107 @@ +{ + /* ********************* Main SOGo configuration file ********************** + * * + * Since the content of this file is a dictionary in OpenStep plist format, * + * the curly braces enclosing the body of the configuration are mandatory. * + * See the Installation Guide for details on the format. * + * * + * C and C++ style comments are supported. * + * * + * This example configuration contains only a subset of all available * + * configuration parameters. Please see the installation guide more details. * + * * + * ~sogo/GNUstep/Defaults/.GNUstepDefaults has precedence over this file, * + * make sure to move it away to avoid unwanted parameter overrides. * + * * + * **************************************************************************/ + + /* Database configuration (mysql://, postgresql:// or oracle://) */ + WOPort = "0.0.0.0:50000"; + + + // MySQL + SOGoProfileURL = "mysql://sogobuild:sogo123@mariadb:3306/sogo/sogo_user_profile"; + OCSFolderInfoURL = "mysql://sogobuild:sogo123@mariadb:3306/sogo/sogo_folder_info"; + OCSSessionsFolderURL = "mysql://sogobuild:sogo123@mariadb:3306/sogo/sogo_sessions_folder"; + OCSEMailAlarmsFolderURL = "mysql://sogobuild:sogo123@mariadb:3306/sogo/sogo_alarms_folder"; + OCSCacheFolderURL = "mysql://sogobuild:sogo123@mariadb:3306/sogo/sogo_cache_folder"; + OCSStoreURL = "mysql://sogobuild:sogo123@mariadb:3306/sogo/sogo_store"; + OCSAclURL = "mysql://sogobuild:sogo123@mariadb:3306/sogo/sogo_acl"; + + + //Password + SOGoPasswordChangeEnabled = YES; + SOGoPasswordRecoveryEnabled = YES; + + SOGoFirstWeekOfYear = "January1"; + WOWorkersCount = 10; + WOWatchDogRequestTimeout = 5; + WOListenQueueSize = 15; + + SOGoUserSources = ( + { + CNFieldName = cn; + IDFieldName = uid; + UIDFieldName = uid; + baseDN = "ou=users,dc=example,dc=org"; + bindDN = "cn=admin,dc=example,dc=org"; + bindPassword = "password"; + canAuthenticate = YES; + displayName = "Shared Addresses"; + hostname = "openldap"; + id = public; + isAddressBook = YES; + port = 389; + KindFieldName = description; + MultipleBookingsFieldName="departmentNumber"; + } + ); + + SOGoDisableSharing = (); + SOGoDisableExport = (); + SOGoDisableSharingAnyAuthUser = (); + + + //Identities + SOGoMailAuxiliaryUserAccountsEnabled = YES; + + SOGoPageTitle = NewName; + SOGoSieveScriptsEnabled = YES; + SOGoForwardEnabled = YES; + SOGoNotificationEnabled = YES; + SOGoVacationEnabled = YES; + SOGoEnableEMailAlarms = YES; + SOGoEnablePublicAccess = YES; + SOGoTimeZone = Europe/Paris; + SOGoIMAPServer = "imapd:143"; + NGImap4AuthMechanism = "plain"; + SOGoSieveServer = "sieve://imapd:4190"; + SOGoMailingMechanism = smtp; + SOGoSMTPServer = "smtpd"; + SOGoCalendarDefaultRoles = ("PublicDAndTViewer"); + SOGoAppointmentSendEMailNotifications = YES; + SOGoMailDomain = "example.org"; + SOGoLanguage = "English"; + SOGoSuperUsernames = ("sogo-tests-super"); + SOGoCalendarDefaultRoles = ("PublicDAndTViewer"); + SOGoMemcachedHost = "memcached"; + SOGoXSRFValidationEnabled = NO; + + NGImap4ConnectionStringSeparator = "/"; + + + + + /* Debug */ + SoDebugBaseURL = YES; + SOGoDebugRequests = YES; + ImapDebugEnabled = YES; + LDAPDebugEnabled = YES; + PGDebugEnabled = YES; + SMTPDebugEnabled = YES; + MySQL4DebugEnabled = YES; + SOGoUIxDebugEnabled = YES; + WOLogFile = /var/log/sogo/sogo.log; + SOGoDebugLeaks = YES; + +} diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json new file mode 100644 index 000000000..7c10a6f04 --- /dev/null +++ b/.devcontainer/devcontainer.json @@ -0,0 +1,15 @@ +// For format details, see https://aka.ms/devcontainer.json. For config options, see the +// README at: https://github.com/devcontainers/templates/tree/main/src/docker-existing-dockerfile +{ + "name": "sogo", + "dockerComposeFile": "docker-compose.yml", + "service": "sogo", + "workspaceFolder": "/workspace", + "customizations": { + "vscode": { + "extensions": [ + "ms-azuretools.vscode-docker" + ] + } + } +} \ No newline at end of file diff --git a/.devcontainer/docker-compose.yml b/.devcontainer/docker-compose.yml new file mode 100644 index 000000000..b93e31a44 --- /dev/null +++ b/.devcontainer/docker-compose.yml @@ -0,0 +1,108 @@ +services: + memcached: + image: memcached:1.6 + container_name: sogo_memcached + restart: unless-stopped + httpd: + build: + context: ./conf/httpd/ + dockerfile: Dockerfile + container_name: sogo_httpd + restart: unless-stopped + depends_on: + - sogo + ports: + - 80:80 + - 443:443 + volumes: + - ./conf/httpd/ssl:/ssl + - ./conf/httpd/CanadaHolidays.ics:/usr/local/apache2/htdocs/CanadaHolidays.ics + - sogo-static-files:/usr/local/lib/GNUstep + mariadb: + image: mariadb:11 + container_name: sogo_mariadb + restart: unless-stopped + environment: + MYSQL_ROOT_PASSWORD: password + MYSQL_DATABASE: db + ports: + - 3307:3306 + volumes: + - sogo-mariadb:/var/lib/mysql + - ./conf/db/mysql.sql:/docker-entrypoint-initdb.d/init-sogo.sql + openldap: + image: bitnami/openldap:2.5 + container_name: sogo_openldap + restart: unless-stopped + ports: + - "389:389" + environment: + LDAP_PORT_NUMBER: 389 + LDAP_ADMIN_USERNAME: "admin" + LDAP_ADMIN_PASSWORD: "password" + LDAP_BIND_PASSWORD: "password" + LDAP_ROOT: "dc=example,dc=org" + LDAP_ADMIN_DN: "cn=admin,dc=example,dc=org" + LDAP_CUSTOM_LDIF_DIR: "/ldifs" + #BITNAMI_DEBUG: true + volumes: + - ./conf/ldap/users.ldif:/ldifs/users.ldif # User data + imapd: # Dovecot + build: + context: ./conf/dovecot/ + dockerfile: Dockerfile + container_name: sogo_dovecot + restart: unless-stopped + depends_on: + - openldap + ports: + - "143:143" + - "993:993" + - "4190:4190" + - "24:24" + volumes: + - sogo-mail-data:/var/mail + - sogo-sieve-data:/var/sieve + smtpd: # Postfix + build: + context: ./conf/postfix/ + dockerfile: Dockerfile + container_name: sogo_postfix + restart: unless-stopped + ports: + - "25:25" + depends_on: + - imapd + - openldap + entrypoint: /entrypoint.sh + sogo: + container_name: sogo_dev + restart: unless-stopped + tty: true + build: + context: ../ + dockerfile: .devcontainer/Dockerfile.devcontainer + ports: + - 50000:50000 + cap_add: + - SYS_PTRACE + - NET_ADMIN + - NET_RAW + depends_on: + - openldap + - memcached + - mariadb + - imapd + - smtpd + volumes: + - ..:/workspace + - sogo-static-files:/usr/local/lib/GNUstep + - ./conf/sogo/sogo.conf:/etc/sogo/sogo.conf + # - /path/to/sope_folder:/src/SOPE # Uncomment this line if you want to mount SOPE source code + +volumes: + sogo-mariadb: + sogo-postgres: + sogo-mail-data: + sogo-sieve-data: + sogo-static-files: diff --git a/.devcontainer/readme.md b/.devcontainer/readme.md new file mode 100644 index 000000000..9ed088561 --- /dev/null +++ b/.devcontainer/readme.md @@ -0,0 +1,72 @@ +## Dev Container + +The SOGo dev container will deploy a complete environnement to work and test with SOGo + +This environnement contains: +- a mariadb database +- an imap server (dovecot) and a smtp server (postfix) +- a ldap server for the user source +- an Apache server +- The SOGo instance + +## How to use the devcontainer + +Simply clone the source code of the SOGo repo and open id with Visual Code Studio. If this is not already the case, you will need the [Dev Container Extension](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers). Then, simply execute the command "New Dev COntainer" and VCS will start building it. + + +When it's all build, go to http://127.0.0.1/SOGo. You have 3 users to login with: +`sogo-tests1`, `sogo-tests2`, `sogo-tests3` with all the same password `sogo` + +You can only send mail and receive mail within the domain `example.org` + +## How to work on SOGo + + +### To modify the source and build + +After modifyng the source in VCS, in your container's terminalthere is a command tool `devenv` with following options for building: +``` +-b, --build Build sogo app +-ba, --build-all Clean, build sogo and sope +-br, --build-resources Build only sogo JS/CSS resources +``` + +To build sogo simplye does +```shell +sudo devenv -b +``` +- The options -br will only build the front +- The options -ba will also build [SOPE](https://github.com/Alinto/sope) (low-level of SOGo, needs to be build before SOGo) + + +### To use the debugger + +Inside the sogo container there is a tool to launch SOGo with the [debugger gdb](https://sourceware.org/gdb/). + +Use one of the following command: + +```shell +sudo devenv -d +sudo devenv --debug +``` + + +### To change sogo.conf + +The sogo.conf is linked to the one here [.devcontainer/conf/sogo/sogo.conf](conf/sogo/sogo.conf) + +Modify it as you wish then you need to restart the sogo service inside the container: +```shell +service sogod restart +``` + +### To modify SOPE + +Sometimes, you may have to change SOPE source code. In order to do that: +- First, clone the SOPE repo locally. +- Uncomment line 101 of the docker-compose.yml file and put the correct path to your SOPE folder. It should end with 'sope' like this: `/home/myuser/github/sope` +- Then, you have to rebuild your devcontainer. +- Now you can modify the source of SOPE and build it by going inside the sogo_dev container and do. +```shell +sudo devenv -ba +``` \ No newline at end of file diff --git a/.gitignore b/.gitignore index 6bf274703..a5ed35220 100644 --- a/.gitignore +++ b/.gitignore @@ -55,4 +55,6 @@ Tests/results.xml Tests/results # SAML2 autogenerated files -SoObjects/SOGo/SOGoSAML2Exceptions.* \ No newline at end of file +SoObjects/SOGo/SOGoSAML2Exceptions.* + +node_modules \ No newline at end of file diff --git a/README.md b/README.md index 7be89c2e1..13de625ea 100644 --- a/README.md +++ b/README.md @@ -27,6 +27,10 @@ The source code of the SOGo Connector extension for Thunderbird 78+ can be obtai Please refer to the [FAQ](https://sogo.nu/support.html#/faq) for [compilation instructions](https://sogo.nu/support/faq/how-do-i-compile-sogo.html). +## Dev Container + +A dev container is available to use, read more there [read more there](.devcontainer/readme.md) + ## Translations SOGo and its associated components are available in various languages. The following list describes the official translations alongside their maintainers: