Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1a8273ead5 | ||
|
|
b5deb663ad | ||
|
|
9aab41975d | ||
|
|
fcb688723f | ||
|
|
077ba07314 | ||
|
|
6bbe8100b9 | ||
|
|
9954c3607b | ||
|
|
085fc4a9eb | ||
|
|
e36d0d219b | ||
|
|
c5fb3482e2 | ||
|
|
bc4c9ba0e6 | ||
|
|
54debcf47d | ||
|
|
6d8d4f7c39 | ||
|
|
4b397f68f5 | ||
|
|
fdb88abc12 | ||
|
|
d3e5a004db | ||
|
|
9f4440b07f | ||
|
|
3e61a52673 | ||
|
|
532b8dc202 | ||
|
|
828f85c720 | ||
|
|
aa6575c42b | ||
|
|
1ba83ec57d | ||
|
|
bbc04913b9 | ||
|
|
1dcf475d3b | ||
|
|
1bf955d193 | ||
|
|
264f94b64d | ||
|
|
d7fc5a52b8 | ||
|
|
5f6168d536 | ||
|
|
c792ddb601 | ||
|
|
c31b3f4592 | ||
|
|
f4adf6267d | ||
|
|
aae9e6065f | ||
|
|
20e7c890de | ||
|
|
961702de67 | ||
|
|
3ac01f7051 | ||
|
|
bbd17f5531 | ||
|
|
8c4f56c971 | ||
|
|
1d0b6a622c | ||
|
|
ade923d21d | ||
|
|
54f8af30ce | ||
|
|
5c48745c94 | ||
|
|
4ec3d2091a | ||
|
|
3616e56289 | ||
|
|
47548f0939 | ||
|
|
068f1f3154 | ||
|
|
c88f95586a | ||
|
|
07c75280bb | ||
|
|
0fadd4cb72 | ||
|
|
eb7f551e88 | ||
|
|
148fab9409 | ||
|
|
7c59e6b3bf | ||
|
|
ca425e6752 | ||
|
|
9e431d08a2 | ||
|
|
788ece452b | ||
|
|
696b8eed4d | ||
|
|
ab9f0c1bf1 | ||
|
|
4a68909060 | ||
|
|
1f8dc12929 | ||
|
|
7c6b6743e0 | ||
|
|
4be3ba227c | ||
|
|
3aa14a43e2 | ||
|
|
f6d18c208e | ||
|
|
7c36a65b7c | ||
|
|
52ae03d064 | ||
|
|
a860101003 | ||
|
|
397d0ee5fc | ||
|
|
da15327c92 | ||
|
|
f273d3e513 | ||
|
|
9a3a06c957 | ||
|
|
5753a52ab4 | ||
|
|
b86f59411a | ||
|
|
20d6b98f07 | ||
|
|
80abd1d896 | ||
|
|
4438a2e647 | ||
|
|
81406434d6 | ||
|
|
65f7b2552a | ||
|
|
d23bb125a3 | ||
|
|
39fa4fc38f | ||
|
|
ae4d6a07f3 | ||
|
|
d43f3378a5 | ||
|
|
2bf0780942 | ||
|
|
4367ca5247 | ||
|
|
7617db7383 | ||
|
|
4d5cf314b5 | ||
|
|
7b0319d616 | ||
|
|
0f2faec7d4 | ||
|
|
51cf90d620 | ||
|
|
ef6f53f48c | ||
|
|
1f379d51fd | ||
|
|
a98d4b9944 | ||
|
|
e0677705aa | ||
|
|
f110498d3f | ||
|
|
2912e07e0b | ||
|
|
ac6abb66ec | ||
|
|
6bb9796550 | ||
|
|
7d8b8a4ba3 | ||
|
|
d72cc8fdef | ||
|
|
83bdc145f9 | ||
|
|
60f2f1b9fc | ||
|
|
0bc20b1b79 | ||
|
|
5c2020dc3e | ||
|
|
0dccf10505 | ||
|
|
6de11e58ee | ||
|
|
4c09ebfb6e | ||
|
|
d1d9024eca | ||
|
|
7328623e11 | ||
|
|
c53f09ddec | ||
|
|
50ba658fbd | ||
|
|
a1f2670485 | ||
|
|
8904350b71 | ||
|
|
c3234882eb | ||
|
|
458d39d48a |
No files matched your search
@@ -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"]
|
||||||
@@ -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
|
||||||
@@ -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"]
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
disable_plaintext_auth = no
|
||||||
|
auth_mechanisms = plain login
|
||||||
|
!include auth-ldap.conf.ext
|
||||||
@@ -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
|
||||||
|
}
|
||||||
@@ -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 =
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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
|
||||||
|
}
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
plugin {
|
||||||
|
acl = vfile
|
||||||
|
}
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
plugin {
|
||||||
|
sieve = file:/var/sieve/%n@example.org;active=/var/sieve/%n@example.org/.dovecot.sieve
|
||||||
|
}
|
||||||
@@ -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
|
||||||
|
|
||||||
@@ -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))
|
||||||
@@ -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
|
||||||
Binary file not shown.
@@ -0,0 +1 @@
|
|||||||
|
deb [signed-by=/etc/apt/keyrings/dovecot.gpg] http://repo.dovecot.org/ce-2.3.21.1/debian/bullseye bullseye main
|
||||||
Executable
+182
@@ -0,0 +1,182 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
# Use this script to test if a given TCP host/port are available
|
||||||
|
|
||||||
|
WAITFORIT_cmdname=${0##*/}
|
||||||
|
|
||||||
|
echoerr() { if [[ $WAITFORIT_QUIET -ne 1 ]]; then echo "$@" 1>&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
|
||||||
@@ -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
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
FROM httpd:2.4
|
||||||
|
|
||||||
|
ADD httpd.conf /usr/local/apache2/conf/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 <URL:http://httpd.apache.org/docs/2.4/> for detailed information.
|
||||||
|
# In particular, see
|
||||||
|
# <URL:http://httpd.apache.org/docs/2.4/mod/directives.html>
|
||||||
|
# for a discussion of each configuration directive.
|
||||||
|
#
|
||||||
|
# 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 <VirtualHost>
|
||||||
|
# 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
|
||||||
|
<IfModule !mpm_prefork_module>
|
||||||
|
#LoadModule cgid_module modules/mod_cgid.so
|
||||||
|
</IfModule>
|
||||||
|
<IfModule mpm_prefork_module>
|
||||||
|
#LoadModule cgi_module modules/mod_cgi.so
|
||||||
|
</IfModule>
|
||||||
|
#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
|
||||||
|
|
||||||
|
<IfModule unixd_module>
|
||||||
|
#
|
||||||
|
# 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
|
||||||
|
|
||||||
|
</IfModule>
|
||||||
|
|
||||||
|
# 'Main' server configuration
|
||||||
|
#
|
||||||
|
# The directives in this section set up the values used by the 'main'
|
||||||
|
# server, which responds to any requests that aren't handled by a
|
||||||
|
# <VirtualHost> definition. These values also provide defaults for
|
||||||
|
# any <VirtualHost> containers you may define later in the file.
|
||||||
|
#
|
||||||
|
# All of these directives may appear inside <VirtualHost> containers,
|
||||||
|
# in which case these default settings will be overridden for the
|
||||||
|
# virtual host being defined.
|
||||||
|
#
|
||||||
|
|
||||||
|
#
|
||||||
|
# ServerAdmin: Your address, where problems with the server should be
|
||||||
|
# e-mailed. This address appears on some server-generated pages, such
|
||||||
|
# as error documents. e.g. admin@your-domain.com
|
||||||
|
#
|
||||||
|
ServerAdmin 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
|
||||||
|
# <Directory> blocks below.
|
||||||
|
#
|
||||||
|
<Directory />
|
||||||
|
AllowOverride none
|
||||||
|
Require all granted
|
||||||
|
</Directory>
|
||||||
|
|
||||||
|
#
|
||||||
|
# Note that from this point forward you must specifically allow
|
||||||
|
# particular features to be enabled - so if something's not working as
|
||||||
|
# you might expect, make sure that you have specifically enabled it
|
||||||
|
# below.
|
||||||
|
#
|
||||||
|
|
||||||
|
#
|
||||||
|
# DocumentRoot: The directory out of which you will serve your
|
||||||
|
# documents. By default, all requests are taken from this directory, but
|
||||||
|
# symbolic links and aliases may be used to point to other locations.
|
||||||
|
#
|
||||||
|
DocumentRoot "/usr/local/apache2/htdocs"
|
||||||
|
<Directory "/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
|
||||||
|
</Directory>
|
||||||
|
|
||||||
|
#
|
||||||
|
# DirectoryIndex: sets the file that Apache will serve if a directory
|
||||||
|
# is requested.
|
||||||
|
#
|
||||||
|
<IfModule dir_module>
|
||||||
|
DirectoryIndex index.html
|
||||||
|
</IfModule>
|
||||||
|
|
||||||
|
#
|
||||||
|
# The following lines prevent .htaccess and .htpasswd files from being
|
||||||
|
# viewed by Web clients.
|
||||||
|
#
|
||||||
|
<Files ".ht*">
|
||||||
|
Require all denied
|
||||||
|
</Files>
|
||||||
|
|
||||||
|
#
|
||||||
|
# ErrorLog: The location of the error log file.
|
||||||
|
# If you do not specify an ErrorLog directive within a <VirtualHost>
|
||||||
|
# container, error messages relating to that virtual host will be
|
||||||
|
# logged here. If you *do* define an error logfile for a <VirtualHost>
|
||||||
|
# container, that host's errors will be logged there and not here.
|
||||||
|
#
|
||||||
|
ErrorLog /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
|
||||||
|
|
||||||
|
<IfModule log_config_module>
|
||||||
|
#
|
||||||
|
# The following directives define some format nicknames for use with
|
||||||
|
# a CustomLog directive (see below).
|
||||||
|
#
|
||||||
|
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
|
||||||
|
LogFormat "%h %l %u %t \"%r\" %>s %b" common
|
||||||
|
|
||||||
|
<IfModule logio_module>
|
||||||
|
# You need to enable mod_logio.c to use %I and %O
|
||||||
|
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio
|
||||||
|
</IfModule>
|
||||||
|
|
||||||
|
#
|
||||||
|
# The location and format of the access logfile (Common Logfile Format).
|
||||||
|
# If you do not define any access logfiles within a <VirtualHost>
|
||||||
|
# container, they will be logged here. Contrariwise, if you *do*
|
||||||
|
# define per-<VirtualHost> access logfiles, transactions will be
|
||||||
|
# logged therein and *not* in this file.
|
||||||
|
#
|
||||||
|
CustomLog /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
|
||||||
|
</IfModule>
|
||||||
|
|
||||||
|
<IfModule alias_module>
|
||||||
|
#
|
||||||
|
# Redirect: Allows you to tell clients about documents that used to
|
||||||
|
# exist in your server's namespace, but do not anymore. The client
|
||||||
|
# will make a new request for the document at its new location.
|
||||||
|
# Example:
|
||||||
|
# Redirect permanent /foo http://www.example.com/bar
|
||||||
|
|
||||||
|
#
|
||||||
|
# Alias: Maps web paths into filesystem paths and is used to
|
||||||
|
# access content that does not live under the DocumentRoot.
|
||||||
|
# Example:
|
||||||
|
# Alias /webpath /full/filesystem/path
|
||||||
|
#
|
||||||
|
# If you include a trailing / on /webpath then the server will
|
||||||
|
# require it to be present in the URL. You will also likely
|
||||||
|
# need to provide a <Directory> section to allow access to
|
||||||
|
# the filesystem path.
|
||||||
|
|
||||||
|
#
|
||||||
|
# ScriptAlias: This controls which directories contain server scripts.
|
||||||
|
# ScriptAliases are essentially the same as Aliases, except that
|
||||||
|
# documents in the target directory are treated as applications and
|
||||||
|
# run by the server when requested rather than as documents sent to the
|
||||||
|
# client. The same rules about trailing "/" apply to ScriptAlias
|
||||||
|
# directives as to Alias.
|
||||||
|
#
|
||||||
|
ScriptAlias /cgi-bin/ "/usr/local/apache2/cgi-bin/"
|
||||||
|
|
||||||
|
</IfModule>
|
||||||
|
|
||||||
|
<IfModule cgid_module>
|
||||||
|
#
|
||||||
|
# ScriptSock: On threaded servers, designate the path to the UNIX
|
||||||
|
# socket used to communicate with the CGI daemon of mod_cgid.
|
||||||
|
#
|
||||||
|
#Scriptsock cgisock
|
||||||
|
</IfModule>
|
||||||
|
|
||||||
|
#
|
||||||
|
# "/usr/local/apache2/cgi-bin" should be changed to whatever your ScriptAliased
|
||||||
|
# CGI directory exists, if you have that configured.
|
||||||
|
#
|
||||||
|
<Directory "/usr/local/apache2/cgi-bin">
|
||||||
|
AllowOverride None
|
||||||
|
Options None
|
||||||
|
Require all granted
|
||||||
|
</Directory>
|
||||||
|
|
||||||
|
<IfModule headers_module>
|
||||||
|
#
|
||||||
|
# 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
|
||||||
|
</IfModule>
|
||||||
|
|
||||||
|
<IfModule mime_module>
|
||||||
|
#
|
||||||
|
# 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
|
||||||
|
</IfModule>
|
||||||
|
|
||||||
|
#
|
||||||
|
# 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
|
||||||
|
<IfModule proxy_html_module>
|
||||||
|
Include conf/extra/proxy-html.conf
|
||||||
|
</IfModule>
|
||||||
|
|
||||||
|
# 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.
|
||||||
|
#
|
||||||
|
<IfModule ssl_module>
|
||||||
|
SSLRandomSeed startup builtin
|
||||||
|
SSLRandomSeed connect builtin
|
||||||
|
</IfModule>
|
||||||
|
|
||||||
|
|
||||||
|
###########################
|
||||||
|
#
|
||||||
|
# SOGo HTTP
|
||||||
|
#
|
||||||
|
###########################
|
||||||
|
|
||||||
|
|
||||||
|
<VirtualHost *:80>
|
||||||
|
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/
|
||||||
|
|
||||||
|
<Directory /usr/lib/GNUstep/SOGo/>
|
||||||
|
<IfVersion < 2.4>
|
||||||
|
Order deny,allow
|
||||||
|
Allow from all
|
||||||
|
</IfVersion>
|
||||||
|
<IfVersion >= 2.4>
|
||||||
|
Require all granted
|
||||||
|
</IfVersion>
|
||||||
|
|
||||||
|
# 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.
|
||||||
|
<IfModule expires_module>
|
||||||
|
ExpiresActive On
|
||||||
|
ExpiresDefault "access plus 1 year"
|
||||||
|
</IfModule>
|
||||||
|
</Directory>
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
|
<Proxy http://sogo:50000/SOGo>
|
||||||
|
## 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
|
||||||
|
</Proxy>
|
||||||
|
|
||||||
|
RewriteEngine On
|
||||||
|
RewriteRule ^/SOGo/(.*)$ /SOGo/$1 [env=REMOTE_HOST:%{REMOTE_ADDR},PT]
|
||||||
|
|
||||||
|
# For Apple autoconfiguration
|
||||||
|
<IfModule rewrite_module>
|
||||||
|
RewriteEngine On
|
||||||
|
RewriteRule ^/.well-known/caldav/?$ /SOGo/dav [R=301]
|
||||||
|
RewriteRule ^/.well-known/carddav/?$ /SOGo/dav [R=301]
|
||||||
|
</IfModule>
|
||||||
|
|
||||||
|
<Directory /src/SOGo/Tests/results>
|
||||||
|
Options Indexes FollowSymLinks
|
||||||
|
AllowOverride None
|
||||||
|
Require all granted
|
||||||
|
</Directory>
|
||||||
|
|
||||||
|
Alias /tests /src/SOGo/Tests/results
|
||||||
|
</VirtualHost>
|
||||||
|
|
||||||
|
###########################
|
||||||
|
#
|
||||||
|
# SOGo HTTP (for tests)
|
||||||
|
#
|
||||||
|
###########################
|
||||||
|
|
||||||
|
<VirtualHost *:81>
|
||||||
|
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/
|
||||||
|
|
||||||
|
<Directory /usr/lib/GNUstep/SOGo/>
|
||||||
|
<IfVersion < 2.4>
|
||||||
|
Order deny,allow
|
||||||
|
Allow from all
|
||||||
|
</IfVersion>
|
||||||
|
<IfVersion >= 2.4>
|
||||||
|
Require all granted
|
||||||
|
</IfVersion>
|
||||||
|
|
||||||
|
# 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.
|
||||||
|
<IfModule expires_module>
|
||||||
|
ExpiresActive On
|
||||||
|
ExpiresDefault "access plus 1 year"
|
||||||
|
</IfModule>
|
||||||
|
</Directory>
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
|
<Proxy http://sogo:50000/SOGo>
|
||||||
|
## 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
|
||||||
|
</Proxy>
|
||||||
|
|
||||||
|
RewriteEngine On
|
||||||
|
RewriteRule ^/SOGo/(.*)$ /SOGo/$1 [env=REMOTE_HOST:%{REMOTE_ADDR},PT]
|
||||||
|
|
||||||
|
# For Apple autoconfiguration
|
||||||
|
<IfModule rewrite_module>
|
||||||
|
RewriteEngine On
|
||||||
|
RewriteRule ^/.well-known/caldav/?$ /SOGo/dav [R=301]
|
||||||
|
RewriteRule ^/.well-known/carddav/?$ /SOGo/dav [R=301]
|
||||||
|
</IfModule>
|
||||||
|
</VirtualHost>
|
||||||
|
|
||||||
|
|
||||||
|
###########################
|
||||||
|
#
|
||||||
|
# SOGo HTTPS
|
||||||
|
#
|
||||||
|
###########################
|
||||||
|
|
||||||
|
|
||||||
|
<VirtualHost *:443>
|
||||||
|
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
|
||||||
|
|
||||||
|
<Directory /usr/lib/GNUstep/SOGo/>
|
||||||
|
<IfVersion < 2.4>
|
||||||
|
Order deny,allow
|
||||||
|
Allow from all
|
||||||
|
</IfVersion>
|
||||||
|
<IfVersion >= 2.4>
|
||||||
|
Require all granted
|
||||||
|
</IfVersion>
|
||||||
|
|
||||||
|
# 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.
|
||||||
|
<IfModule expires_module>
|
||||||
|
ExpiresActive On
|
||||||
|
ExpiresDefault "access plus 1 year"
|
||||||
|
</IfModule>
|
||||||
|
</Directory>
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
|
<Proxy http://sogo:50000/SOGo>
|
||||||
|
## 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
|
||||||
|
</Proxy>
|
||||||
|
|
||||||
|
|
||||||
|
RewriteEngine On
|
||||||
|
RewriteRule ^/SOGo/(.*)$ /SOGo/$1 [env=REMOTE_HOST:%{REMOTE_ADDR},PT]
|
||||||
|
|
||||||
|
# For Apple autoconfiguration
|
||||||
|
<IfModule rewrite_module>
|
||||||
|
RewriteEngine On
|
||||||
|
RewriteRule ^/.well-known/caldav/?$ /SOGo/dav [R=301]
|
||||||
|
RewriteRule ^/.well-known/carddav/?$ /SOGo/dav [R=301]
|
||||||
|
</IfModule>
|
||||||
|
|
||||||
|
<Directory /src/SOGo/Tests/results>
|
||||||
|
Options Indexes FollowSymLinks
|
||||||
|
AllowOverride None
|
||||||
|
Require all granted
|
||||||
|
</Directory>
|
||||||
|
|
||||||
|
Alias /tests /src/SOGo/Tests/results
|
||||||
|
</VirtualHost>
|
||||||
@@ -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-----
|
||||||
@@ -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-----
|
||||||
@@ -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-----
|
||||||
Executable
+7
@@ -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
|
||||||
|
|
||||||
@@ -0,0 +1,166 @@
|
|||||||
|
# extended LDIF
|
||||||
|
#
|
||||||
|
# LDAPv3
|
||||||
|
# base <dc=example,dc=org> 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
|
||||||
@@ -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
|
||||||
|
|
||||||
Executable
+12
@@ -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
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
example.org
|
||||||
@@ -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
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
@example.org root
|
||||||
Executable
+518
@@ -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 <<EOF
|
||||||
|
export default {
|
||||||
|
hostname: "httpd",
|
||||||
|
port: "81",
|
||||||
|
username: "sogo-tests1",
|
||||||
|
password: "sogo",
|
||||||
|
superuser: "sogo-tests-super",
|
||||||
|
superuser_password: "sogo",
|
||||||
|
subscriber_username: "sogo-tests2",
|
||||||
|
subscriber_password: "sogo",
|
||||||
|
attendee1: "sogo-tests2@example.org",
|
||||||
|
attendee1_username: "sogo-tests2",
|
||||||
|
attendee1_password: "sogo",
|
||||||
|
attendee1_delegate: "sogo-tests3@example.org",
|
||||||
|
attendee1_delegate_username: "sogo-tests3",
|
||||||
|
attendee1_delegate_password: "sogo",
|
||||||
|
resource_no_overbook: "res",
|
||||||
|
resource_can_overbook: "res-nolimit",
|
||||||
|
white_listed_attendee: {
|
||||||
|
"sogo-tests1": "John Doe <sogo-tests1@example.org>"
|
||||||
|
},
|
||||||
|
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 <<EOF > $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 "<table style=\"margin-bottom: 10px;\"><tbody><tr><td colspan=\"3\" style=\"background-color: aquamarine;\"><strong>$1</strong></td></tr><tr>" >> "$SRC_SOGO/Tests/results/index.html"
|
||||||
|
echo "<td>Total</td><td>Failed</td><td>Not executed</td></tr><tr>" >> "$SRC_SOGO/Tests/results/index.html"
|
||||||
|
if [ $FAIL -gt 0 ]
|
||||||
|
then
|
||||||
|
echo "<td>$TOTAL</td><td style=\"color: red;\">$FAIL</td><td>$NOT_EXECUTED</td>" >> "$SRC_SOGO/Tests/results/index.html"
|
||||||
|
echo "</tr><tr><td colspan=\"3\" style=\"color: red;\"><strong>Tests failed</strong></td>" >> "$SRC_SOGO/Tests/results/index.html"
|
||||||
|
else
|
||||||
|
echo "<td>$TOTAL</td><td>$FAIL</td><td>$NOT_EXECUTED</td>" >> "$SRC_SOGO/Tests/results/index.html"
|
||||||
|
echo "</tr><tr><td colspan=\"3\" style=\"color: #170;\"><strong>Tests success</strong></td>" >> "$SRC_SOGO/Tests/results/index.html"
|
||||||
|
fi
|
||||||
|
echo "</tr><tr><td colspan=\"3\"><a href=\"$2.html\" target=\"_blank\">View test report</a></td>" >> "$SRC_SOGO/Tests/results/index.html"
|
||||||
|
echo "</tr></tbody></table>" >> "$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 "<html><head><style>table, th, td {border: 1px solid darkgrey;border-collapse: collapse; width: 400px; font-family: monospace;}</style></head><body>" > "$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 "</body>" >> "$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
|
||||||
|
}
|
||||||
@@ -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"
|
||||||
Executable
+147
@@ -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
|
||||||
@@ -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
|
||||||
@@ -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;
|
||||||
|
|
||||||
|
}
|
||||||
@@ -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"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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:
|
||||||
@@ -0,0 +1,74 @@
|
|||||||
|
## 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 among those three users.
|
||||||
|
|
||||||
|
**If you have troubles, you may need to build sogo once, see the next section for that.**
|
||||||
|
|
||||||
|
## 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
|
||||||
|
```
|
||||||
+4
-1
@@ -10,6 +10,7 @@
|
|||||||
*/obj/
|
*/obj/
|
||||||
.scss-lint-config.yml_
|
.scss-lint-config.yml_
|
||||||
ActiveSync/ActiveSync.SOGo
|
ActiveSync/ActiveSync.SOGo
|
||||||
|
API/API.SOGo
|
||||||
Documentation/*.docbook
|
Documentation/*.docbook
|
||||||
Documentation/*.pdf
|
Documentation/*.pdf
|
||||||
Documentation/*.html
|
Documentation/*.html
|
||||||
@@ -55,4 +56,6 @@ Tests/results.xml
|
|||||||
Tests/results
|
Tests/results
|
||||||
|
|
||||||
# SAML2 autogenerated files
|
# SAML2 autogenerated files
|
||||||
SoObjects/SOGo/SOGoSAML2Exceptions.*
|
SoObjects/SOGo/SOGoSAML2Exceptions.*
|
||||||
|
|
||||||
|
node_modules
|
||||||
+1
-1
@@ -1,3 +1,3 @@
|
|||||||
[submodule "UI/WebServerResources/angular-material"]
|
[submodule "UI/WebServerResources/angular-material"]
|
||||||
path = UI/WebServerResources/angular-material
|
path = UI/WebServerResources/angular-material
|
||||||
url = https://github.com/angular/material
|
url = https://github.com/Alinto/material.git
|
||||||
@@ -0,0 +1,28 @@
|
|||||||
|
|
||||||
|
# GNUstep makefile
|
||||||
|
|
||||||
|
include common.make
|
||||||
|
|
||||||
|
BUNDLE_NAME = API
|
||||||
|
|
||||||
|
API_PRINCIPAL_CLASS = SOGoAPIProduct
|
||||||
|
|
||||||
|
API_OBJC_FILES = \
|
||||||
|
SOGoAPIProduct.m \
|
||||||
|
SOGoAPI.m \
|
||||||
|
SOGoAPIVersion.m \
|
||||||
|
SOGoAPIUserFolder.m \
|
||||||
|
SOGoAPIDispatcher.m
|
||||||
|
|
||||||
|
API_RESOURCE_FILES += \
|
||||||
|
product.plist
|
||||||
|
|
||||||
|
API_LANGUAGES = $(SOGO_LANGUAGES)
|
||||||
|
|
||||||
|
API_LOCALIZED_RESOURCE_FILES = Localizable.strings
|
||||||
|
|
||||||
|
ADDITIONAL_INCLUDE_DIRS += -I../SOPE/ -I../SoObjects/
|
||||||
|
|
||||||
|
-include GNUmakefile.preamble
|
||||||
|
include $(GNUSTEP_MAKEFILES)/bundle.make
|
||||||
|
-include GNUmakefile.postamble
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
# compile settings
|
||||||
|
|
||||||
|
ADDITIONAL_CPPFLAGS += \
|
||||||
|
-DSOGO_MAJOR_VERSION=$(MAJOR_VERSION) \
|
||||||
|
-DSOGO_MINOR_VERSION=$(MINOR_VERSION) \
|
||||||
|
-DSOGO_PATCH_VERSION=$(SUBMINOR_VERSION) \
|
||||||
|
-DSOGO_LIBDIR="@\"$(SOGO_LIBDIR)\""
|
||||||
|
|
||||||
|
ADDITIONAL_INCLUDE_DIRS += \
|
||||||
|
-D_GNU_SOURCE -I../SOPE/ -I../SoObjects/
|
||||||
|
|
||||||
|
ADDITIONAL_LIB_DIRS += \
|
||||||
|
-L../SoObjects/SOGo/SOGo.framework/sogo -lSOGo \
|
||||||
|
-L../SOPE/GDLContentStore/$(GNUSTEP_OBJ_DIR)/ -lGDLContentStore \
|
||||||
|
-L../SOPE/NGCards/$(GNUSTEP_OBJ_DIR)/ -lNGCards \
|
||||||
|
-lEOControl -lNGStreams -lNGMime -lNGExtensions -lNGObjWeb -lWEExtensions
|
||||||
@@ -0,0 +1,35 @@
|
|||||||
|
/*
|
||||||
|
Copyright (C) 2004-2005 SKYRIX Software AG
|
||||||
|
|
||||||
|
This file is part of SOPE.
|
||||||
|
|
||||||
|
SOPE is free software; you can redistribute it and/or modify it under
|
||||||
|
the terms of the GNU Lesser General Public License as published by the
|
||||||
|
Free Software Foundation; either version 2, or (at your option) any
|
||||||
|
later version.
|
||||||
|
|
||||||
|
SOPE is distributed in the hope that it will be useful, but WITHOUT ANY
|
||||||
|
WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
|
||||||
|
License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public
|
||||||
|
License along with SOPE; see the file COPYING. If not, write to the
|
||||||
|
Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
|
||||||
|
02111-1307, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#import <Foundation/Foundation.h>
|
||||||
|
#import <Foundation/NSObject.h>
|
||||||
|
#import <Foundation/NSDictionary.h>
|
||||||
|
#import <Foundation/NSArray.h>
|
||||||
|
|
||||||
|
@class WOContext;
|
||||||
|
|
||||||
|
@interface SOGoAPI : NSObject
|
||||||
|
- (NSArray *) methodAllowed;
|
||||||
|
- (BOOL) needAuth;
|
||||||
|
- (NSArray *) paramNeeded;
|
||||||
|
- (NSDictionary *) action: (WOContext*) ctx withParam: (NSDictionary *) param;
|
||||||
|
|
||||||
|
@end
|
||||||
@@ -0,0 +1,52 @@
|
|||||||
|
/*
|
||||||
|
Copyright (C) todo...
|
||||||
|
*/
|
||||||
|
|
||||||
|
#import <SOGoAPI.h>
|
||||||
|
|
||||||
|
|
||||||
|
@implementation SOGoAPI
|
||||||
|
|
||||||
|
- (id) init
|
||||||
|
{
|
||||||
|
[super init];
|
||||||
|
|
||||||
|
return self;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void) dealloc
|
||||||
|
{
|
||||||
|
[super dealloc];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (NSArray *) methodAllowed
|
||||||
|
{
|
||||||
|
NSArray *result;
|
||||||
|
|
||||||
|
result = [NSArray arrayWithObjects:@"GET",nil];
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (BOOL) needAuth
|
||||||
|
{
|
||||||
|
return YES;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (NSArray *) paramNeeded
|
||||||
|
{
|
||||||
|
return nil;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (NSDictionary *) action: (WOContext*) ctx withParam: (NSDictionary *) param
|
||||||
|
{
|
||||||
|
NSDictionary* result;
|
||||||
|
|
||||||
|
result = [[NSDictionary alloc] initWithObjectsAndKeys:
|
||||||
|
@"API not defined", @"error",
|
||||||
|
nil];
|
||||||
|
[result autorelease];
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@end /* SOGoAPI */
|
||||||
Whitespace-only changes.
@@ -0,0 +1,54 @@
|
|||||||
|
/*
|
||||||
|
|
||||||
|
Copyright (c) 2014-2015, Inverse inc.
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
modification, are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
|
* Redistributions of source code must retain the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer.
|
||||||
|
* Redistributions in binary form must reproduce the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer in the
|
||||||
|
documentation and/or other materials provided with the distribution.
|
||||||
|
* Neither the name of the Inverse inc. nor the
|
||||||
|
names of its contributors may be used to endorse or promote products
|
||||||
|
derived from this software without specific prior written permission.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||||
|
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
|
||||||
|
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#import <Foundation/NSObject.h>
|
||||||
|
#import <SOGo/WORequest+SOGo.h>
|
||||||
|
#import <SOGo/WOResponse+SOGo.h>
|
||||||
|
|
||||||
|
@class NSCalendarDate;
|
||||||
|
@class NSException;
|
||||||
|
@class NSMutableDictionary;
|
||||||
|
@class NSURL;
|
||||||
|
@class NSNumber;
|
||||||
|
|
||||||
|
static volatile BOOL apiShouldTerminate = NO;
|
||||||
|
|
||||||
|
@interface SOGoAPIDispatcher : NSObject
|
||||||
|
{
|
||||||
|
|
||||||
|
id context;
|
||||||
|
BOOL debugOn;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (NSException *) dispatchRequest: (WORequest*) theRequest
|
||||||
|
inResponse: (WOResponse*) theResponse
|
||||||
|
context: (id) theContext;
|
||||||
|
|
||||||
|
@end
|
||||||
@@ -0,0 +1,399 @@
|
|||||||
|
/*
|
||||||
|
|
||||||
|
Copyright (c) 2014, Inverse inc.
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
modification, are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
|
* Redistributions of source code must retain the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer.
|
||||||
|
* Redistributions in binary form must reproduce the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer in the
|
||||||
|
documentation and/or other materials provided with the distribution.
|
||||||
|
* Neither the name of the Inverse inc. nor the
|
||||||
|
names of its contributors may be used to endorse or promote products
|
||||||
|
derived from this software without specific prior written permission.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||||
|
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
|
||||||
|
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "SOGoAPIDispatcher.h"
|
||||||
|
|
||||||
|
#import <Foundation/NSAutoreleasePool.h>
|
||||||
|
#import <NGObjWeb/NSException+HTTP.h>
|
||||||
|
#import <NGObjWeb/WOContext+SoObjects.h>
|
||||||
|
#import <NGObjWeb/WOCoreApplication.h>
|
||||||
|
#import <NGExtensions/NSObject+Logs.h>
|
||||||
|
#import <NGExtensions/NSString+misc.h>
|
||||||
|
#import <NGExtensions/NSString+Encoding.h>
|
||||||
|
#import <SOGo/SOGoSystemDefaults.h>
|
||||||
|
#import <SOGo/SOGoUser.h>
|
||||||
|
#import <SOGo/SOGoUserManager.h>
|
||||||
|
#import <SOGo/NSString+Utilities.h>
|
||||||
|
#import <SOGo/WORequest+SOGo.h>
|
||||||
|
#import <SOGo/WOResponse+SOGo.h>
|
||||||
|
#import <SOGo/NSArray+Utilities.h>
|
||||||
|
#import <SOGo/NSString+Utilities.h>
|
||||||
|
#import <SOGo/SOGoOpenIdSession.h>
|
||||||
|
|
||||||
|
|
||||||
|
void handle_api_terminate(int signum)
|
||||||
|
{
|
||||||
|
NSLog(@"Forcing termination of API loop.");
|
||||||
|
apiShouldTerminate = YES;
|
||||||
|
[[WOCoreApplication application] terminateAfterTimeInterval: 1];
|
||||||
|
}
|
||||||
|
|
||||||
|
@implementation SOGoAPIDispatcher
|
||||||
|
|
||||||
|
- (id) init
|
||||||
|
{
|
||||||
|
[super init];
|
||||||
|
|
||||||
|
debugOn = [[SOGoSystemDefaults sharedSystemDefaults] apiDebugEnabled];
|
||||||
|
apiShouldTerminate = NO;
|
||||||
|
|
||||||
|
signal(SIGTERM, handle_api_terminate);
|
||||||
|
|
||||||
|
return self;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void) dealloc
|
||||||
|
{
|
||||||
|
[super dealloc];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void) _sendAPIErrorResponse: (WOResponse* ) response
|
||||||
|
withMessage: (NSString *) message
|
||||||
|
withStatus: (unsigned int) status
|
||||||
|
{
|
||||||
|
NSDictionary *msg;
|
||||||
|
msg = [[NSDictionary alloc] initWithObjectsAndKeys:
|
||||||
|
message, @"error",
|
||||||
|
nil];
|
||||||
|
[response setStatus: status];
|
||||||
|
[response setContent: [msg jsonRepresentation]];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (NSString *) _getActionFromUri: (NSString *) _uri
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
_uri always start with /SOGo/SOGoAPI
|
||||||
|
full _uri example /SOGo/SOGoAPI/Action/subaction1?param1¶m2
|
||||||
|
*/
|
||||||
|
|
||||||
|
NSString *uriWithoutParams, *action, *prefix;
|
||||||
|
NSArray *uriSplits;
|
||||||
|
|
||||||
|
prefix = @"/SOGo/SOGoAPI";
|
||||||
|
action = @"";
|
||||||
|
|
||||||
|
uriWithoutParams = [_uri urlWithoutParameters];
|
||||||
|
if(![uriWithoutParams hasPrefix: prefix])
|
||||||
|
{
|
||||||
|
[self errorWithFormat: @"Uri for API request does not start with /SOGo/SOGoAPI: %@", uriWithoutParams];
|
||||||
|
return nil;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
uriWithoutParams = [uriWithoutParams substringFromIndex:[prefix length]];
|
||||||
|
}
|
||||||
|
|
||||||
|
//remove first and last '/'' if needed
|
||||||
|
if([uriWithoutParams hasPrefix: @"/"])
|
||||||
|
{
|
||||||
|
uriWithoutParams = [uriWithoutParams substringFromIndex:1];
|
||||||
|
}
|
||||||
|
if([uriWithoutParams hasSuffix: @"/"])
|
||||||
|
{
|
||||||
|
uriWithoutParams = [uriWithoutParams substringToIndex:([uriWithoutParams length] -1)];
|
||||||
|
}
|
||||||
|
if([uriWithoutParams length] == 0)
|
||||||
|
{
|
||||||
|
[self warnWithFormat: @"Uri for API request has no action, make Version instead: %@", uriWithoutParams];
|
||||||
|
return @"SOGoAPIVersion";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
uriSplits = [uriWithoutParams componentsSeparatedByString: @"/"];
|
||||||
|
action = [@"SOGoAPI" stringByAppendingString: [uriSplits objectAtIndex: 0]];
|
||||||
|
if(debugOn)
|
||||||
|
[self logWithFormat: @"API request, action made is %@", action];
|
||||||
|
}
|
||||||
|
|
||||||
|
return action;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (NSDictionary *) _authBasicCheck: (NSString *) auth
|
||||||
|
{
|
||||||
|
NSDictionary *user;
|
||||||
|
NSRange rng;
|
||||||
|
NSString *decodeCred, *domain, *login, *pwd;
|
||||||
|
SOGoUserManager *lm;
|
||||||
|
SOGoPasswordPolicyError perr;
|
||||||
|
int expire, grace;
|
||||||
|
BOOL rc;
|
||||||
|
|
||||||
|
user = nil;
|
||||||
|
|
||||||
|
decodeCred = [[auth substringFromIndex:5] stringByTrimmingLeadWhiteSpaces];
|
||||||
|
decodeCred = [decodeCred stringByDecodingBase64];
|
||||||
|
|
||||||
|
rng = [decodeCred rangeOfString:@":"];
|
||||||
|
login = [decodeCred substringToIndex:rng.location];
|
||||||
|
pwd = [decodeCred substringFromIndex:(rng.location + rng.length)];
|
||||||
|
|
||||||
|
domain = nil;
|
||||||
|
perr = PolicyNoError;
|
||||||
|
rc = ([[SOGoUserManager sharedUserManager]
|
||||||
|
checkLogin: [login stringByReplacingString: @"%40"
|
||||||
|
withString: @"@"]
|
||||||
|
password: pwd
|
||||||
|
domain: &domain
|
||||||
|
perr: &perr
|
||||||
|
expire: &expire
|
||||||
|
grace: &grace
|
||||||
|
additionalInfo: nil]
|
||||||
|
&& perr == PolicyNoError);
|
||||||
|
|
||||||
|
if(rc)
|
||||||
|
{
|
||||||
|
//Fecth user info
|
||||||
|
lm = [SOGoUserManager sharedUserManager];
|
||||||
|
user = [lm contactInfosForUserWithUIDorEmail: login];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
user = nil;
|
||||||
|
|
||||||
|
return user;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (NSDictionary *) _authOpenId: (NSString *) auth withDomain: (NSString *) domain
|
||||||
|
{
|
||||||
|
NSDictionary *user;
|
||||||
|
NSString *token, *login;
|
||||||
|
SOGoOpenIdSession *openIdSession;
|
||||||
|
SOGoUserManager *lm;
|
||||||
|
|
||||||
|
user = nil;
|
||||||
|
token = [[auth substringFromIndex:6] stringByTrimmingLeadWhiteSpaces];
|
||||||
|
|
||||||
|
openIdSession = [SOGoOpenIdSession OpenIdSession: domain];
|
||||||
|
if(![openIdSession sessionIsOk])
|
||||||
|
{
|
||||||
|
[self errorWithFormat: @"API - OpenId server not found or has unexpected behavior, contact your admin."];
|
||||||
|
return nil;
|
||||||
|
}
|
||||||
|
|
||||||
|
[openIdSession setAccessToken: token];
|
||||||
|
login = [openIdSession login: @""];
|
||||||
|
|
||||||
|
if(login && ![login isEqualToString: @"anonymous"])
|
||||||
|
{
|
||||||
|
//Fecth user info
|
||||||
|
lm = [SOGoUserManager sharedUserManager];
|
||||||
|
user = [lm contactInfosForUserWithUIDorEmail: login];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
user = nil;
|
||||||
|
|
||||||
|
return user;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
- (NSException *) dispatchRequest: (WORequest*) theRequest
|
||||||
|
inResponse: (WOResponse*) theResponse
|
||||||
|
context: (id) theContext
|
||||||
|
{
|
||||||
|
NSAutoreleasePool *pool;
|
||||||
|
id activeUser;
|
||||||
|
NSString *method, *action, *error;
|
||||||
|
NSDictionary *form;
|
||||||
|
NSArray *paramNeeded;
|
||||||
|
NSMutableDictionary *paramInjected, *ret;
|
||||||
|
NSBundle *bundle;
|
||||||
|
id classAction;
|
||||||
|
Class clazz;
|
||||||
|
|
||||||
|
|
||||||
|
pool = [[NSAutoreleasePool alloc] init];
|
||||||
|
ASSIGN(context, theContext);
|
||||||
|
|
||||||
|
//Get the api action, check it
|
||||||
|
action = [self _getActionFromUri: [theRequest uri]];
|
||||||
|
if(!action)
|
||||||
|
{
|
||||||
|
error = [NSString stringWithFormat: @"No actions found for request to API: %@", [theRequest uri]];
|
||||||
|
[self errorWithFormat: error];
|
||||||
|
[self _sendAPIErrorResponse: theResponse withMessage: error withStatus: 400];
|
||||||
|
RELEASE(context);
|
||||||
|
RELEASE(pool);
|
||||||
|
return nil;
|
||||||
|
}
|
||||||
|
|
||||||
|
//Get the class for this action, check it
|
||||||
|
bundle = [NSBundle bundleForClass: NSClassFromString(@"SOGoAPIProduct")];
|
||||||
|
clazz = [bundle classNamed: action];
|
||||||
|
if(!clazz)
|
||||||
|
{
|
||||||
|
error = [NSString stringWithFormat: @"No backend API found for action: %@", action];
|
||||||
|
[self errorWithFormat: error];
|
||||||
|
[self _sendAPIErrorResponse: theResponse withMessage: error withStatus: 400];
|
||||||
|
RELEASE(context);
|
||||||
|
RELEASE(pool);
|
||||||
|
return nil;
|
||||||
|
}
|
||||||
|
|
||||||
|
//try to instantiate the class
|
||||||
|
NS_DURING
|
||||||
|
{
|
||||||
|
classAction = [[clazz alloc] init];
|
||||||
|
}
|
||||||
|
NS_HANDLER
|
||||||
|
{
|
||||||
|
error = [NSString stringWithFormat: @"Can't alloc and init class: %@", classAction];
|
||||||
|
[self errorWithFormat: error];
|
||||||
|
[self _sendAPIErrorResponse: theResponse withMessage: error withStatus: 500];
|
||||||
|
RELEASE(context);
|
||||||
|
RELEASE(pool);
|
||||||
|
return nil;
|
||||||
|
}
|
||||||
|
NS_ENDHANDLER;
|
||||||
|
|
||||||
|
//Check method
|
||||||
|
method = [theRequest method];
|
||||||
|
if(![[classAction methodAllowed] containsObject: method])
|
||||||
|
{
|
||||||
|
error = [NSString stringWithFormat: @"Method %@ not allowed for action %@", method, action];
|
||||||
|
[self errorWithFormat: error];
|
||||||
|
[self _sendAPIErrorResponse: theResponse withMessage: error withStatus: 400];
|
||||||
|
RELEASE(context);
|
||||||
|
RELEASE(pool);
|
||||||
|
return nil;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
paramInjected = [NSMutableDictionary dictionary];
|
||||||
|
//Check parameters
|
||||||
|
if((paramNeeded = [classAction paramNeeded]) && [paramNeeded count] >= 1)
|
||||||
|
{
|
||||||
|
NSDictionary* formAndQuery = [theRequest formValues];
|
||||||
|
for(NSString *param in paramNeeded)
|
||||||
|
{
|
||||||
|
id value;
|
||||||
|
if((value = [formAndQuery objectForKey: param]))
|
||||||
|
{
|
||||||
|
NSString* trueValue;
|
||||||
|
if ([value isKindOfClass: [NSArray class]])
|
||||||
|
trueValue = [value lastObject];
|
||||||
|
else
|
||||||
|
trueValue = value;
|
||||||
|
[paramInjected setObject: trueValue forKey: param];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
error = [NSString stringWithFormat: @"Missing param %@ for action %@", param, action];
|
||||||
|
[self errorWithFormat: error];
|
||||||
|
[self _sendAPIErrorResponse: theResponse withMessage: error withStatus: 400];
|
||||||
|
RELEASE(context);
|
||||||
|
RELEASE(pool);
|
||||||
|
return nil;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if([classAction needAuth])
|
||||||
|
{
|
||||||
|
if(debugOn)
|
||||||
|
[self logWithFormat: @"Check auth for action %@", action];
|
||||||
|
//check auth
|
||||||
|
NSString *auth = [theRequest headerForKey: @"authorization"];
|
||||||
|
if(auth)
|
||||||
|
{
|
||||||
|
NSDictionary* user;
|
||||||
|
if([[auth lowercaseString] hasPrefix: @"basic"])
|
||||||
|
{
|
||||||
|
//basic auth
|
||||||
|
user = [self _authBasicCheck: auth];
|
||||||
|
}
|
||||||
|
else if([[auth lowercaseString] hasPrefix: @"bearer"])
|
||||||
|
{
|
||||||
|
//openid auth, we may need to know the user-domain to know which openid server to fetch
|
||||||
|
NSString *domain = [theRequest headerForKey: @"user-domain"];
|
||||||
|
user = [self _authOpenId: auth withDomain: domain];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
error = [NSString stringWithFormat: @"Authorization method incorrect: %@ for action %@", auth, action];
|
||||||
|
[self errorWithFormat: error];
|
||||||
|
[self _sendAPIErrorResponse: theResponse withMessage: error withStatus: 401];
|
||||||
|
RELEASE(context);
|
||||||
|
RELEASE(pool);
|
||||||
|
return nil;
|
||||||
|
}
|
||||||
|
|
||||||
|
//add current user in paramInjected
|
||||||
|
if(user){
|
||||||
|
if(debugOn)
|
||||||
|
[self logWithFormat: @"User authenticated %@", user];
|
||||||
|
[paramInjected setObject: user forKey: @"user"];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
error = [NSString stringWithFormat: @"User wrong login or not found for action %@", action];
|
||||||
|
[self errorWithFormat: error];
|
||||||
|
[self _sendAPIErrorResponse: theResponse withMessage: error withStatus: 401];
|
||||||
|
RELEASE(context);
|
||||||
|
RELEASE(pool);
|
||||||
|
return nil;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
error = [NSString stringWithFormat: @"No authorization header found for action %@", action];
|
||||||
|
[self errorWithFormat: error];
|
||||||
|
[self _sendAPIErrorResponse: theResponse withMessage: error withStatus: 401];
|
||||||
|
RELEASE(context);
|
||||||
|
RELEASE(pool);
|
||||||
|
return nil;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//Execute action
|
||||||
|
NS_DURING
|
||||||
|
{
|
||||||
|
ret = [classAction action: context withParam: paramInjected];
|
||||||
|
}
|
||||||
|
NS_HANDLER
|
||||||
|
{
|
||||||
|
error = [NSString stringWithFormat: @"Internal error during: %@", action];
|
||||||
|
[self errorWithFormat: error];
|
||||||
|
[self _sendAPIErrorResponse: theResponse withMessage: error withStatus: 500];
|
||||||
|
RELEASE(context);
|
||||||
|
RELEASE(pool);
|
||||||
|
return nil;
|
||||||
|
}
|
||||||
|
NS_ENDHANDLER;
|
||||||
|
|
||||||
|
|
||||||
|
//Make the response
|
||||||
|
[theResponse setContent: [ret jsonRepresentation]];
|
||||||
|
|
||||||
|
RELEASE(context);
|
||||||
|
RELEASE(pool);
|
||||||
|
|
||||||
|
return nil;
|
||||||
|
}
|
||||||
|
|
||||||
|
@end
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
/*
|
||||||
|
Copyright (C) todo...
|
||||||
|
*/
|
||||||
|
|
||||||
|
#import <Foundation/NSObject.h>
|
||||||
|
|
||||||
|
@interface SOGoAPIProduct : NSObject
|
||||||
|
@end
|
||||||
|
|
||||||
|
@implementation SOGoAPIProduct
|
||||||
|
@end /* SOGoAPIProduct */
|
||||||
@@ -0,0 +1,33 @@
|
|||||||
|
/*
|
||||||
|
Copyright (C) 2004-2005 SKYRIX Software AG
|
||||||
|
|
||||||
|
This file is part of SOPE.
|
||||||
|
|
||||||
|
SOPE is free software; you can redistribute it and/or modify it under
|
||||||
|
the terms of the GNU Lesser General Public License as published by the
|
||||||
|
Free Software Foundation; either version 2, or (at your option) any
|
||||||
|
later version.
|
||||||
|
|
||||||
|
SOPE is distributed in the hope that it will be useful, but WITHOUT ANY
|
||||||
|
WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
|
||||||
|
License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public
|
||||||
|
License along with SOPE; see the file COPYING. If not, write to the
|
||||||
|
Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
|
||||||
|
02111-1307, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#import <Foundation/Foundation.h>
|
||||||
|
#import <Foundation/NSObject.h>
|
||||||
|
#import <Foundation/NSDictionary.h>
|
||||||
|
#import <Foundation/NSArray.h>
|
||||||
|
#import <SOGoAPI.h>
|
||||||
|
|
||||||
|
@class WOContext;
|
||||||
|
|
||||||
|
@interface SOGoAPIUserFolder : SOGoAPI
|
||||||
|
- (NSArray *) methodAllowed;
|
||||||
|
- (NSDictionary *) action: (WOContext*) ctx withParam: (NSDictionary *) param;
|
||||||
|
@end
|
||||||
@@ -0,0 +1,74 @@
|
|||||||
|
/*
|
||||||
|
Copyright (C) todo...
|
||||||
|
*/
|
||||||
|
|
||||||
|
#import <SOGoAPIUserFolder.h>
|
||||||
|
|
||||||
|
#import <GDLContentStore/GCSFolderManager.h>
|
||||||
|
|
||||||
|
@implementation SOGoAPIUserFolder
|
||||||
|
|
||||||
|
- (id) init
|
||||||
|
{
|
||||||
|
[super init];
|
||||||
|
|
||||||
|
return self;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void) dealloc
|
||||||
|
{
|
||||||
|
[super dealloc];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
- (NSDictionary *) action: (WOContext*) ctx withParam: (NSDictionary *) param
|
||||||
|
{
|
||||||
|
NSDictionary* result;
|
||||||
|
NSArray *folders;
|
||||||
|
NSMutableArray *cardavLinks, *caldavLinks;
|
||||||
|
NSString *serverUrl, *basePath, *c_uid, *url;
|
||||||
|
GCSFolderManager *fm;
|
||||||
|
int max, i;
|
||||||
|
|
||||||
|
//Should be a user
|
||||||
|
c_uid = [[[param objectForKey: @"user"] objectForKey: @"emails"] objectAtIndex: 0];
|
||||||
|
|
||||||
|
//fetch folders
|
||||||
|
fm = [GCSFolderManager defaultFolderManager];
|
||||||
|
basePath = [NSString stringWithFormat: @"/Users/%@", c_uid];
|
||||||
|
folders = [fm listSubFoldersAtPath: basePath recursive: YES];
|
||||||
|
|
||||||
|
//Generate dav link
|
||||||
|
max = [folders count];
|
||||||
|
serverUrl = [[ctx serverURL] absoluteString];
|
||||||
|
|
||||||
|
cardavLinks = [NSMutableArray array];
|
||||||
|
caldavLinks = [NSMutableArray array];
|
||||||
|
serverUrl = [[ctx serverURL] absoluteString];
|
||||||
|
for (i = 0; i < max; i++)
|
||||||
|
{
|
||||||
|
url = [NSString stringWithFormat: @"%@/SOGo/dav/%@/%@", serverUrl, c_uid, [folders objectAtIndex: i]];
|
||||||
|
if([url rangeOfString:@"/Calendar/"].location == NSNotFound)
|
||||||
|
{
|
||||||
|
//Contacts
|
||||||
|
[cardavLinks addObject: url];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//Calendar
|
||||||
|
[caldavLinks addObject: url];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
result = [[NSDictionary alloc] initWithObjectsAndKeys:
|
||||||
|
c_uid, @"username",
|
||||||
|
cardavLinks, @"contact",
|
||||||
|
caldavLinks, @"calendar",
|
||||||
|
nil];
|
||||||
|
|
||||||
|
[result autorelease];
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@end /* SOGoAPIVersion */
|
||||||
@@ -0,0 +1,33 @@
|
|||||||
|
/*
|
||||||
|
Copyright (C) 2004-2005 SKYRIX Software AG
|
||||||
|
|
||||||
|
This file is part of SOPE.
|
||||||
|
|
||||||
|
SOPE is free software; you can redistribute it and/or modify it under
|
||||||
|
the terms of the GNU Lesser General Public License as published by the
|
||||||
|
Free Software Foundation; either version 2, or (at your option) any
|
||||||
|
later version.
|
||||||
|
|
||||||
|
SOPE is distributed in the hope that it will be useful, but WITHOUT ANY
|
||||||
|
WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
|
||||||
|
License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public
|
||||||
|
License along with SOPE; see the file COPYING. If not, write to the
|
||||||
|
Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
|
||||||
|
02111-1307, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#import <Foundation/Foundation.h>
|
||||||
|
#import <Foundation/NSObject.h>
|
||||||
|
#import <Foundation/NSDictionary.h>
|
||||||
|
#import <Foundation/NSArray.h>
|
||||||
|
#import <SOGoAPI.h>
|
||||||
|
|
||||||
|
@class WOContext;
|
||||||
|
|
||||||
|
@interface SOGoAPIVersion : SOGoAPI
|
||||||
|
- (NSArray *) methodAllowed;
|
||||||
|
- (NSDictionary *) action: (WOContext*) ctx withParam: (NSDictionary *) param;
|
||||||
|
@end
|
||||||
@@ -0,0 +1,42 @@
|
|||||||
|
/*
|
||||||
|
Copyright (C) todo...
|
||||||
|
*/
|
||||||
|
|
||||||
|
#import <SOGoAPIVersion.h>
|
||||||
|
|
||||||
|
|
||||||
|
@implementation SOGoAPIVersion
|
||||||
|
|
||||||
|
- (id) init
|
||||||
|
{
|
||||||
|
[super init];
|
||||||
|
|
||||||
|
return self;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void) dealloc
|
||||||
|
{
|
||||||
|
[super dealloc];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (BOOL) needAuth
|
||||||
|
{
|
||||||
|
return NO;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (NSDictionary *) action: (WOContext*) ctx withParam: (NSDictionary *) param
|
||||||
|
{
|
||||||
|
NSDictionary* result;
|
||||||
|
|
||||||
|
result = [[NSDictionary alloc] initWithObjectsAndKeys:
|
||||||
|
[NSNumber numberWithInt:SOGO_MAJOR_VERSION], @"major",
|
||||||
|
[NSNumber numberWithInt:SOGO_MINOR_VERSION], @"minor",
|
||||||
|
[NSNumber numberWithInt:SOGO_PATCH_VERSION], @"patch",
|
||||||
|
nil];
|
||||||
|
|
||||||
|
[result autorelease];
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@end /* SOGoAPIVersion */
|
||||||
@@ -0,0 +1,34 @@
|
|||||||
|
include ../config.make
|
||||||
|
include $(GNUSTEP_MAKEFILES)/common.make
|
||||||
|
include ../Version
|
||||||
|
|
||||||
|
NEEDS_GUI=no
|
||||||
|
BUNDLE_EXTENSION = .SOGo
|
||||||
|
BUNDLE_INSTALL_DIR = $(SOGO_LIBDIR)
|
||||||
|
WOBUNDLE_EXTENSION = $(BUNDLE_EXTENSION)
|
||||||
|
WOBUNDLE_INSTALL_DIR = $(BUNDLE_INSTALL_DIR)
|
||||||
|
|
||||||
|
# SYSTEM_LIB_DIR += -L/usr/local/lib -L/usr/lib
|
||||||
|
|
||||||
|
ADDITIONAL_INCLUDE_DIRS += \
|
||||||
|
-I.. \
|
||||||
|
-I../.. \
|
||||||
|
-I../../SOPE
|
||||||
|
|
||||||
|
ADDITIONAL_LIB_DIRS += \
|
||||||
|
-L../SoObjects/SOGo/SOGo.framework/Versions/Current/sogo \
|
||||||
|
-L../SoObjects/SOGo/$(GNUSTEP_OBJ_DIR)/ \
|
||||||
|
-L../SOPE/NGCards/$(GNUSTEP_OBJ_DIR)/ \
|
||||||
|
-L/usr/local/lib \
|
||||||
|
-Wl,-rpath,$(SOGO_SYSLIBDIR)/sogo
|
||||||
|
|
||||||
|
BUNDLE_LIBS += \
|
||||||
|
-lSOGo \
|
||||||
|
-lGDLContentStore \
|
||||||
|
-lGDLAccess \
|
||||||
|
-lNGObjWeb \
|
||||||
|
-lNGCards -lNGMime -lNGLdap \
|
||||||
|
-lNGStreams -lNGExtensions -lEOControl \
|
||||||
|
-lDOM -lSaxObjC -lSBJson
|
||||||
|
|
||||||
|
ADDITIONAL_BUNDLE_LIBS += $(BUNDLE_LIBS)
|
||||||
@@ -0,0 +1,31 @@
|
|||||||
|
{
|
||||||
|
requires = ( MAIN, Appointments, Contacts, Mailer );
|
||||||
|
|
||||||
|
publicResources = ();
|
||||||
|
|
||||||
|
factories = {};
|
||||||
|
|
||||||
|
classes = {
|
||||||
|
SOGoAPI = {
|
||||||
|
protectedBy = "<public>";
|
||||||
|
defaultRoles = {
|
||||||
|
"View" = ( "Authenticated", "PublicUser" );
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
categories = {
|
||||||
|
SOGoAPI = {
|
||||||
|
slots = {
|
||||||
|
};
|
||||||
|
methods = {
|
||||||
|
Version = {
|
||||||
|
protectedBy = "View";
|
||||||
|
pageName = "SOGoAPI";
|
||||||
|
actionName = "sogoVersion";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
+149
@@ -2,6 +2,155 @@
|
|||||||
|
|
||||||
All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
|
All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
|
||||||
|
|
||||||
|
## [5.12.1](https://github.com/Alinto/sogo/compare/SOGo-5.12.0...SOGo-5.12.1) (2025-04-30)
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* **calendar:** Make the Jitsi meeting room prefix configurable ([4a68909](https://github.com/Alinto/sogo/commit/4a689090607bc6c4e6385202e9fdaef7308a94fe))
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* **calendar:** Fix typo Jisti × Jitsi ([ab9f0c1](https://github.com/Alinto/sogo/commit/ab9f0c1bf1f8930b9cbbf592efe69c68654f35c2))
|
||||||
|
* **calendar:** properly show the URL property in iCalendar ([eb7f551](https://github.com/Alinto/sogo/commit/eb7f551e88f2c6693354b6c3b617861d4b63a1bb))
|
||||||
|
* **calendar:** put valarm at the end of vevent block to satisfy outlook.office.com which is too lazy to follow the spec ([148fab9](https://github.com/Alinto/sogo/commit/148fab9409abf703f56ae8ed701547f23d685711))
|
||||||
|
* **db:** log an error if the table sogo_folder_info is malformed ([3616e56](https://github.com/Alinto/sogo/commit/3616e562894be63fcdb7007b5f172d99f5ff59eb))
|
||||||
|
* **folder:** fix folders sorting for special folders ([1f8dc12](https://github.com/Alinto/sogo/commit/1f8dc1292924672489a4a1c76f557a9f0bc65662))
|
||||||
|
* **iOS:** iOS 18.4 encodes caldav url and put %40 instead of @ for username. Fix that. ([9e431d0](https://github.com/Alinto/sogo/commit/9e431d08a273f519ff833b15189d2d3ebef4fc79))
|
||||||
|
* **ldap:** update baseDN with correct domain if needed ([ca425e6](https://github.com/Alinto/sogo/commit/ca425e6752fd28d68e35cc4c1b7dd6f7b3c43ab4))
|
||||||
|
* **sieve:** Correctly update default sieve filter for new users ([7c59e6b](https://github.com/Alinto/sogo/commit/7c59e6b3bf4684c2884e5f0bd39009719e5ba1b9))
|
||||||
|
* **smtp:** fix string type ([788ece4](https://github.com/Alinto/sogo/commit/788ece452b80a0270169178d5e596972797d0906))
|
||||||
|
* **tnef:** add protection against malformed winmail.dat ([7c6b674](https://github.com/Alinto/sogo/commit/7c6b6743e017effcc0078c9ebc026d628f4b71af))
|
||||||
|
* **typo:** Fix typo 'attachements' ([#367](https://bugs.sogo.nu/view.php?id=367)) ([4ec3d20](https://github.com/Alinto/sogo/commit/4ec3d2091a8f5c26b4c4463b4fa9c89ef26f63ba))
|
||||||
|
* **ui:** Change angular material to fix issues with Safari iOS 18+ ([068f1f3](https://github.com/Alinto/sogo/commit/068f1f315498c9bc5a0513e62c7a3fd250d974ad))
|
||||||
|
* **ui:** Change angular material to fix issues with Safari iOS 18+ ([07c7528](https://github.com/Alinto/sogo/commit/07c75280bb06816562b1fb5747acf8efa39cb4a0))
|
||||||
|
|
||||||
|
|
||||||
|
### Localization
|
||||||
|
|
||||||
|
* **ar:** Update Arabic translations ([5c48745](https://github.com/Alinto/sogo/commit/5c48745c94380bfa02f36c751b0389e06d676493))
|
||||||
|
* **bg_BG:** Update Bulgarian translations ([1d0b6a6](https://github.com/Alinto/sogo/commit/1d0b6a622c30b8f55ac17db0d131992a733d356b))
|
||||||
|
* **bs_BA:** Update Bosnian translations ([ade923d](https://github.com/Alinto/sogo/commit/ade923d21d409a9bffca609826a630480ea561dc))
|
||||||
|
* **ca:** Update Catalan translations ([8c4f56c](https://github.com/Alinto/sogo/commit/8c4f56c971002c4e0bb9764c0d7c24fc5cfd3a92))
|
||||||
|
* **cy:** Update Welsh translations ([54debcf](https://github.com/Alinto/sogo/commit/54debcf47d5896b58917705ff85bada391a26919))
|
||||||
|
* **es_AR:** Update SpanishArgentina translations ([4b397f6](https://github.com/Alinto/sogo/commit/4b397f68f51f00945cab57bdec77ab5d68e68753))
|
||||||
|
* **eu:** Update Basque translations ([54f8af3](https://github.com/Alinto/sogo/commit/54f8af30cefe4024d6697a35de25fb1d7896785e))
|
||||||
|
* **fi:** Update Finnish translations ([aae9e60](https://github.com/Alinto/sogo/commit/aae9e6065fda25803c37a43ca2e067df88aba166))
|
||||||
|
* **he:** Update Hebrew translations ([f4adf62](https://github.com/Alinto/sogo/commit/f4adf6267d271d91a75d2176424e98862662e9f8))
|
||||||
|
* **hr_HR:** Update Croatian translations ([961702d](https://github.com/Alinto/sogo/commit/961702de6706531817818063a4a96b40862aa05d))
|
||||||
|
* **hu:** Update Hungarian translations ([c31b3f4](https://github.com/Alinto/sogo/commit/c31b3f4592c6564c4f372cf4e63c4be3564c75bf))
|
||||||
|
* **id_ID:** Update Indonesian translations ([5f6168d](https://github.com/Alinto/sogo/commit/5f6168d5365450e40f6e289be694fab5585ba0cc))
|
||||||
|
* **is:** Update Icelandic translations ([c792ddb](https://github.com/Alinto/sogo/commit/c792ddb601830896cd936e21bb69c17f8d11e705))
|
||||||
|
* **it:** Update Italian translations ([d7fc5a5](https://github.com/Alinto/sogo/commit/d7fc5a52b8284594a6be4050b6c56cffc0fea472))
|
||||||
|
* **ja:** Update Japanese translations ([264f94b](https://github.com/Alinto/sogo/commit/264f94b64d5ea1147d45b7040fc5c3c0bc1d368b))
|
||||||
|
* **kk:** Update Kazakh translations ([1bf955d](https://github.com/Alinto/sogo/commit/1bf955d1930caf920c34be8ffb3e46b47eb0f232))
|
||||||
|
* **lt:** Update Lithuanian translations ([bbc0491](https://github.com/Alinto/sogo/commit/bbc04913b9a3219cd31cfcfc4b0ec79fbee76713))
|
||||||
|
* **lv:** Update Latvian translations ([1dcf475](https://github.com/Alinto/sogo/commit/1dcf475d3b0394474950eb73169fcfeab55305cf))
|
||||||
|
* **mk_MK:** Update Macedonian translations ([1ba83ec](https://github.com/Alinto/sogo/commit/1ba83ec57d7e65f6f28542a89222ec58570d5cef))
|
||||||
|
* **nl:** Update Dutch translations ([20e7c89](https://github.com/Alinto/sogo/commit/20e7c890dea0a52925b18be2a5ae09ccd4c23dd9))
|
||||||
|
* **nn_NO:** Update NorwegianNynorsk translations ([828f85c](https://github.com/Alinto/sogo/commit/828f85c7204c86951db4654f2d254a1361ad0d98))
|
||||||
|
* **ro_RO:** Update Romanian translations ([532b8dc](https://github.com/Alinto/sogo/commit/532b8dc2028b1a1db26566df7baa964daf9bd6b7))
|
||||||
|
* **sk:** Update Slovak translations ([d3e5a00](https://github.com/Alinto/sogo/commit/d3e5a004dbdd80c6bba405a34dcbbb28819a0fa7))
|
||||||
|
* **sl_SI:** Update Slovenian translations ([fdb88ab](https://github.com/Alinto/sogo/commit/fdb88abc1251a8763e4c8e5dacf38e3191180fba))
|
||||||
|
* **sr_ME@latin:** Update Montenegrin translations ([aa6575c](https://github.com/Alinto/sogo/commit/aa6575c42b54b27ca9510ea0f02426a7657ed519))
|
||||||
|
* **sr@latin:** Update SerbianLatin translations ([9f4440b](https://github.com/Alinto/sogo/commit/9f4440b07f142cc0c68561b4413e56fe5c5322ff))
|
||||||
|
* **sr:** Update Serbian translations ([3e61a52](https://github.com/Alinto/sogo/commit/3e61a52673092c38ce2f7a32ebd855afab61782a))
|
||||||
|
* **sv:** Update Swedish translations ([6d8d4f7](https://github.com/Alinto/sogo/commit/6d8d4f7c39fb1c1e9373a9268589b8e6546617ed))
|
||||||
|
* **zh_CN:** Update ChineseChina translations ([bbd17f5](https://github.com/Alinto/sogo/commit/bbd17f55310e5b2e163eeaaf2cb259ae042f8557))
|
||||||
|
* **zh_TW:** Update ChineseTaiwan translations ([3ac01f7](https://github.com/Alinto/sogo/commit/3ac01f70516a25f6db65ffa5c03d6d5a833479fe))
|
||||||
|
|
||||||
|
## [5.12.0](https://github.com/Alinto/sogo/compare/SOGo-5.11.2...SOGo-5.12.0) (2025-03-24)
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* **calendar:** Can defined the Jitsi server url for meeting created ([9f4f48a](https://github.com/Alinto/sogo/commit/9f4f48a44fe97685a5757ec6cec1de802454ccd7))
|
||||||
|
* **calendar:** Can now create Jitsi link when making event ([42c227b](https://github.com/Alinto/sogo/commit/42c227beca64066018d48e29e3d2594f9b99dcc0))
|
||||||
|
* **core:** Check password strength on login (SQL Source). Closes [#6025](https://bugs.sogo.nu/view.php?id=6025). ([178b1a3](https://github.com/Alinto/sogo/commit/178b1a3a0e2e549daea4c229cdf24980e76158d2))
|
||||||
|
* **dev:** add devcontainer config to test and dev on sogo ([8904350](https://github.com/Alinto/sogo/commit/8904350b711cf4ac21da0e1e8af6f33bc8a1df1a))
|
||||||
|
* **mail:** Deletion of mail older than x. Closes [#6023](https://bugs.sogo.nu/view.php?id=6023). ([6f86506](https://github.com/Alinto/sogo/commit/6f86506b28c79610b58e67c78c53548afecf979e) [ea427ea](https://github.com/Alinto/sogo/commit/ea427ea41af2275da249180eaf30377d76dd3727))
|
||||||
|
* **openID:** add OpenId SSO config ([458d39d](https://github.com/Alinto/sogo/commit/458d39d48a23390cf81350f53804565b8dc2bdf2) [c323488](https://github.com/Alinto/sogo/commit/c3234882eb0dc2a8b7a7fd1eed8f109f6e0b8f24))
|
||||||
|
|
||||||
|
### Enhancement
|
||||||
|
* **mail:** Add move to icon on the mail view. Closes [#6028](https://bugs.sogo.nu/view.php?id=6028). ([f65ab9b](https://github.com/Alinto/sogo/commit/f65ab9b43a829eebfa22d7332eb18100d55e61b4))
|
||||||
|
* **mail:** Add sort by recipient instead of from in sent folder. Change subject_or_to in sent folder for search instead of subject_or_from. Closes [#6030](https://bugs.sogo.nu/view.php?id=6030). ([2258d5c](https://github.com/Alinto/sogo/commit/2258d5cd60e3cddd400da305c38f928e065f6a5c))
|
||||||
|
* **mail:** Add 'Return-Receipt-To' header for mail receipt ([b3c77a0](https://github.com/Alinto/sogo/commit/b3c77a0e004409a5a55ffe02a171192a13d9e3dc))
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* **addressBook:** fix [#2](https://bugs.sogo.nu/view.php?id=2)f9c2cf show email if no display name for contact in list ([7328623](https://github.com/Alinto/sogo/commit/7328623e1172823cd15ded8fa7c42da393b1fcb5)), closes [#2f9c2](https://bugs.sogo.nu/view.php?id=2f9c2)
|
||||||
|
* **auth:** add missing method to auth class ([d1d9024](https://github.com/Alinto/sogo/commit/d1d9024eca8cc0de2674815788f87342463df5ee))
|
||||||
|
* **calendar:** Ensure organizers are properly removed from attendee's calendars. Fix issue where organizers were also set as attendees. Removed organizer in attendees list. ([da32b3f](https://github.com/Alinto/sogo/commit/da32b3f86d9cb1e730f5fab27d6767498d46167d) [c90e2b0](https://github.com/Alinto/sogo/commit/c90e2b0501ed40693ce2fa43cafbbf93a0863468))
|
||||||
|
* **calendar:** fix commit f1257088 ([0186398](https://github.com/Alinto/sogo/commit/01863987dd1ecb14b9f86b97cab02d9f1ea6db78))
|
||||||
|
* **calendar:** Fix issue where EXDATE removes modified occurence. The behavior is now identical to G Agenda. This fix may reduce the 'missing exception error'. ([5bab727](https://github.com/Alinto/sogo/commit/5bab72726aa8b08baaa189310ede27cf9747be5e))
|
||||||
|
* **calendar:** Fix SOGoDAVCalendarStartTimeLimit parameter. Events are retrieved when initial sync is done. ([c05b331](https://github.com/Alinto/sogo/commit/c05b331ac02520c294443bbb2ceda5e69b1667d0))
|
||||||
|
* **calendar:** if rrule is infinite don't count rdates as last dates ([e44bc1f](https://github.com/Alinto/sogo/commit/e44bc1fc91588976c4399724c034d3bae386119f))
|
||||||
|
* **calendar:** In some case, the startTime was not properly set ([169a0c6](https://github.com/Alinto/sogo/commit/169a0c61251a658e62f83a8f24a07e447d1dbcca))
|
||||||
|
* **calendar:** prevent to return the same user twice in ldap groups ([f125708](https://github.com/Alinto/sogo/commit/f1257088f2b0513219309286190e5671e7dec624))
|
||||||
|
* **calendar:** properly store the vevent is the correct order for reccurence and reccurence-id ([d15f0ee](https://github.com/Alinto/sogo/commit/d15f0ee80498231fcc3cd1d1a118f46f33ea4d36))
|
||||||
|
* **contacts:** Fix empty chip in contact group when c_cn is not populated ([2f9c2cf](https://github.com/Alinto/sogo/commit/2f9c2cf4da35b67ec5d9f4b7e887614608c8018b))
|
||||||
|
* **core:** Specify application name in WORequest to avoid computing app name in SOPE. Sometimes the app name is wrongly defined due to invalid URL calls. ([253d14c](https://github.com/Alinto/sogo/commit/253d14cfce7552615bbf1e0cf9b242bcd99552b8))
|
||||||
|
* **htmlViewer:** if the the tag img is not a url but a base64 image, keep it in the preview ([f8ff98b](https://github.com/Alinto/sogo/commit/f8ff98b657b61408208f7a14632bb323dec32a49))
|
||||||
|
* **mail:** Correct attachment handling when creating emails from templates ([617c1bb](https://github.com/Alinto/sogo/commit/617c1bbc64d49355bade711a7dc7523bf7450a14))
|
||||||
|
* **mail:** Fix assertion when failed to decode base64 mime body mail part ([0a828a7](https://github.com/Alinto/sogo/commit/0a828a739e10299605eaff72ffaf90a1908b54e8))
|
||||||
|
* **mail:** Fix ckeditor issue where the font-size disappear after mail sent. Use font-size instead of css class. ([70f72eb](https://github.com/Alinto/sogo/commit/70f72eb92f0f14501758a5660391aa43862e98e7))
|
||||||
|
* **mail:** Fix ckeditor margin for to make difference between line breaks and paragraph. Fixes [#6056](https://bugs.sogo.nu/view.php?id=6056). ([a09f4d8](https://github.com/Alinto/sogo/commit/a09f4d8f498932edee92976ed24b271ed3cd5204))
|
||||||
|
* **mail:** Fix error when searching string with quote ([b40d777](https://github.com/Alinto/sogo/commit/b40d777a86104d08dbd8168b8e12c198a3d4321a))
|
||||||
|
* **mail:** Fix issue where unread counter is invalid when whanging folder. Fixes [#6064](https://bugs.sogo.nu/view.php?id=6064). ([0364f7f](https://github.com/Alinto/sogo/commit/0364f7f2a426041d010ad664172e6206c4bbfd6f))
|
||||||
|
* **mail:** Fix mail sub folders sorting. Fixes [#6058](https://bugs.sogo.nu/view.php?id=6058). ([395a01e](https://github.com/Alinto/sogo/commit/395a01ed5204c6c138e7d855370dd8acf902e6b4))
|
||||||
|
* **totp:** correctly send a string and leading zero ([5cba10c](https://github.com/Alinto/sogo/commit/5cba10ccff81ccee12e03472c50f43c713d5abc4))
|
||||||
|
* **users:** don't look up for users when they change language on root page ([29e00f3](https://github.com/Alinto/sogo/commit/29e00f3e9eb92581e0fe5d4193a534f04a1d2b1a))
|
||||||
|
* **users:** try to always use the user domain in the basDN with %d ([78655ae](https://github.com/Alinto/sogo/commit/78655ae1270534339d1ea9d1860afe7699bfd98e))
|
||||||
|
* **users:** when using multi-domains configuration, only request the apopriate usersources. ([beb0d9c](https://github.com/Alinto/sogo/commit/beb0d9cb1bfbcac12650d3a77835d86c34245985))
|
||||||
|
|
||||||
|
|
||||||
|
### Localization
|
||||||
|
|
||||||
|
* **ar:** Update Arabic translations ([6de11e5](https://github.com/Alinto/sogo/commit/6de11e58ee9607b1d4884bca0035d09e87f43b47))
|
||||||
|
* **bg_BG:** Update Bulgarian translations ([60f2f1b](https://github.com/Alinto/sogo/commit/60f2f1b9fc2e0c4e32da86615f074336fce825e5))
|
||||||
|
* **bs_BA:** Update Bosnian translations ([5c2020d](https://github.com/Alinto/sogo/commit/5c2020dc3e184d9c9f6a674c8b0f51323d01d509))
|
||||||
|
* **ca:** Update Catalan translations ([83bdc14](https://github.com/Alinto/sogo/commit/83bdc145f9498201b6f3319af30adc1f5e86f4f9))
|
||||||
|
* **cs:** Update Czech translations ([ac6abb6](https://github.com/Alinto/sogo/commit/ac6abb66ec79c2e5ee4d083d80effdebc081248d))
|
||||||
|
* **cy:** Update Welsh translations ([7c36a65](https://github.com/Alinto/sogo/commit/7c36a65b7c1506d4dfe89869e9e810ea2928ebe4))
|
||||||
|
* **da_DK:** Update Danish translations ([2912e07](https://github.com/Alinto/sogo/commit/2912e07e0b32ed5c62ed4aae3d07dcc9a364e00b))
|
||||||
|
* **de:** Update German translations ([1f379d5](https://github.com/Alinto/sogo/commit/1f379d51fd8ca51d3fc3f9e2fe138e9cde9c8f92))
|
||||||
|
* **es_AR:** Update SpanishArgentina translations ([f273d3e](https://github.com/Alinto/sogo/commit/f273d3e513e4134389a81658e44131e00a4c0e17))
|
||||||
|
* **es_ES:** Update SpanishSpain translations ([da15327](https://github.com/Alinto/sogo/commit/da15327c92a7cfbbc97dd1b58a2e10180035d99e))
|
||||||
|
* **eu:** Update Basque translations ([0dccf10](https://github.com/Alinto/sogo/commit/0dccf105051fcd9631629419888397453804a1a2))
|
||||||
|
* **fi:** Update Finnish translations ([e067770](https://github.com/Alinto/sogo/commit/e0677705aa9c5376ad3f3e61761847a2e562e042))
|
||||||
|
* **fr:** Update French translations ([f6d18c2](https://github.com/Alinto/sogo/commit/f6d18c208e52a8fef1d2f7563442069d54f68a8a))
|
||||||
|
* **gl:** Update Galician translations ([a98d4b9](https://github.com/Alinto/sogo/commit/a98d4b99448e55952a8f87c9f2c976e846ed9790))
|
||||||
|
* **he:** Update Hebrew translations ([ef6f53f](https://github.com/Alinto/sogo/commit/ef6f53f48cbc251b212d185ad63c2298b6a73698))
|
||||||
|
* **hr_HR:** Update Croatian translations ([6bb9796](https://github.com/Alinto/sogo/commit/6bb97965500786fc89327fd5ec0127c493c4d2c0))
|
||||||
|
* **hu:** Update Hungarian translations ([51cf90d](https://github.com/Alinto/sogo/commit/51cf90d62067ec1b62f77236974f90abd582eb5c))
|
||||||
|
* **id_ID:** Update Indonesian translations ([7b0319d](https://github.com/Alinto/sogo/commit/7b0319d616c4ca3915f871b7ab39d38517f5445d))
|
||||||
|
* **is:** Update Icelandic translations ([0f2faec](https://github.com/Alinto/sogo/commit/0f2faec7d4a00b1db4b1b4a4dbadc8f0050718d4))
|
||||||
|
* **it:** Update Italian translations ([4d5cf31](https://github.com/Alinto/sogo/commit/4d5cf314b5f95608193b521f77a203757784e354))
|
||||||
|
* **ja:** Update Japanese translations ([4c09ebf](https://github.com/Alinto/sogo/commit/4c09ebfb6ed5124f335c5801f6f83d0521db1643))
|
||||||
|
* **kk:** Update Kazakh translations ([7617db7](https://github.com/Alinto/sogo/commit/7617db7383d5d5fc8f0a6cfe44ede6b7c6262c66))
|
||||||
|
* **lt:** Update Lithuanian translations ([2bf0780](https://github.com/Alinto/sogo/commit/2bf0780942fc4a2d43d50ce03338cd31cd31769e))
|
||||||
|
* **lv:** Update Latvian translations ([4367ca5](https://github.com/Alinto/sogo/commit/4367ca5247d85e1abf60f95df716a5ad7627763d))
|
||||||
|
* **mk_MK:** Update Macedonian translations ([d43f337](https://github.com/Alinto/sogo/commit/d43f3378a5098c1c6bee02cbf208335ab03783ff))
|
||||||
|
* **nb_NO:** Update NorwegianBokmal translations ([39fa4fc](https://github.com/Alinto/sogo/commit/39fa4fc38fa5515b3ae01d03d9714ef55978e4a2))
|
||||||
|
* **nl:** Update Dutch translations ([f110498](https://github.com/Alinto/sogo/commit/f110498d3f981024b4bef2c142477a6ba94cdef0))
|
||||||
|
* **nn_NO:** Update NorwegianNynorsk translations ([d23bb12](https://github.com/Alinto/sogo/commit/d23bb125a3d3eba5fe6ba96c289a032bd0955577))
|
||||||
|
* **pl:** Update Polish translations ([65f7b25](https://github.com/Alinto/sogo/commit/65f7b2552a640a32c466174e407064f25f2e24fb))
|
||||||
|
* **pt_BR:** Update BrazilianPortuguese translations ([0bc20b1](https://github.com/Alinto/sogo/commit/0bc20b1b791969eb146286bb6814bc1be7aa50e3))
|
||||||
|
* **pt:** Update Portuguese translations ([8140643](https://github.com/Alinto/sogo/commit/81406434d66b04c0098259bda890585ecdbacb79))
|
||||||
|
* **ro_RO:** Update Romanian translations ([4438a2e](https://github.com/Alinto/sogo/commit/4438a2e647edd63abe01ea842259b3fd0f8e0682))
|
||||||
|
* **ru:** Update Russian translations ([80abd1d](https://github.com/Alinto/sogo/commit/80abd1d896480aeb7f43b2b4abf1da4b433d561a))
|
||||||
|
* **sk:** Update Slovak translations ([5753a52](https://github.com/Alinto/sogo/commit/5753a52ab4726662dcff37be8002441d6031bfca))
|
||||||
|
* **sl_SI:** Update Slovenian translations ([9a3a06c](https://github.com/Alinto/sogo/commit/9a3a06c957df7221b1860cd3909bf6caa8bc74c3))
|
||||||
|
* **sr_ME@latin:** Update Montenegrin translations ([ae4d6a0](https://github.com/Alinto/sogo/commit/ae4d6a07f3079ca28e1e8ff5655e2c2156a90a09))
|
||||||
|
* **sr@latin:** Update SerbianLatin translations ([b86f594](https://github.com/Alinto/sogo/commit/b86f59411a8a31933b72da39001f845dd00881d8))
|
||||||
|
* **sr:** Update Serbian translations ([20d6b98](https://github.com/Alinto/sogo/commit/20d6b98f07e6ead91137ecad761ea86393e3f6b8))
|
||||||
|
* **sv:** Update Swedish translations ([397d0ee](https://github.com/Alinto/sogo/commit/397d0ee5fc892bb616187e2b3aa91d5ea5a9f4b3))
|
||||||
|
* **tr_TR:** Update TurkishTurkey translations ([a860101](https://github.com/Alinto/sogo/commit/a8601010030bc4dcad405435310cef546fa16297))
|
||||||
|
* **uk:** Update Ukrainian translations ([52ae03d](https://github.com/Alinto/sogo/commit/52ae03d0649eec6915e995896f1f04e4b69214a9))
|
||||||
|
* **zh_CN:** Update ChineseChina translations ([d72cc8f](https://github.com/Alinto/sogo/commit/d72cc8fdef7661ff084a1bef19115a47cf6298c2))
|
||||||
|
* **zh_TW:** Update ChineseTaiwan translations ([7d8b8a4](https://github.com/Alinto/sogo/commit/7d8b8a4ba3470da14f18a4129fcdd23775cd1676))
|
||||||
|
|
||||||
### [5.11.2](https://github.com/Alinto/sogo/compare/SOGo-5.11.1...SOGo-5.11.2) (2024-10-15)
|
### [5.11.2](https://github.com/Alinto/sogo/compare/SOGo-5.11.1...SOGo-5.11.2) (2024-10-15)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -437,8 +437,8 @@ Defaults to `300`.
|
|||||||
|
|
||||||
|S |SOGoAuthenticationType
|
|S |SOGoAuthenticationType
|
||||||
|Parameter used to define the way by which users will be authenticated.
|
|Parameter used to define the way by which users will be authenticated.
|
||||||
For C.A.S., specify `cas`. For SAML2, specify `saml2`. For anything
|
For C.A.S., specify `cas`. For SAML2, specify `saml2`. For opendID Connect, specify `openid`.
|
||||||
else, leave that value empty.
|
For anything else, leave that value empty.
|
||||||
|
|
||||||
|S |SOGoTrustProxyAuthentication
|
|S |SOGoTrustProxyAuthentication
|
||||||
|Parameter used to set whether HTTP username should be trusted.
|
|Parameter used to set whether HTTP username should be trusted.
|
||||||
@@ -490,6 +490,12 @@ the jitsi server used for creating the meeting link.
|
|||||||
|
|
||||||
Defaults to `https://meet.jit.si` when unset.
|
Defaults to `https://meet.jit.si` when unset.
|
||||||
|
|
||||||
|
|D |SOGoCalendarJitsiRoomPrefix
|
||||||
|
|Only used if SOGoCalendarEnableJitsiLink is set to YES. The string for
|
||||||
|
the Jitsi room prefix used for creating the meeting link.
|
||||||
|
|
||||||
|
Defaults to `SOGo_meeting/` when unset.
|
||||||
|
|
||||||
|S |SOGoSAML2PrivateKeyLocation
|
|S |SOGoSAML2PrivateKeyLocation
|
||||||
|The location of the SSL private key file on the filesystem that is used
|
|The location of the SSL private key file on the filesystem that is used
|
||||||
by SOGo to sign and encrypt communications with the SAML2 identity
|
by SOGo to sign and encrypt communications with the SAML2 identity
|
||||||
@@ -828,8 +834,6 @@ Obiously, if your users can connect without specifying a domain, let this parame
|
|||||||
|S |SOGoDomainAllowed
|
|S |SOGoDomainAllowed
|
||||||
|Parameter used to define which domains SOGo should allowed during a connection request. This parameter is an array of strings.
|
|Parameter used to define which domains SOGo should allowed during a connection request. This parameter is an array of strings.
|
||||||
|
|
||||||
|S |SOGoURLCreateAccount
|
|
||||||
|Add a link below the login form and set the link using the value of this setting.
|
|
||||||
|
|
||||||
|S |SOGoPasswordRecoveryEnabled
|
|S |SOGoPasswordRecoveryEnabled
|
||||||
|Boolean enable password recovery with secret question or secondary e-mail. Default value is `NO`.
|
|Boolean enable password recovery with secret question or secondary e-mail. Default value is `NO`.
|
||||||
@@ -1559,6 +1563,81 @@ SOGoIMAPCASServiceName should be set to the actual imap service name
|
|||||||
expected by pam_cas, otherwise it will fail to authenticate incoming
|
expected by pam_cas, otherwise it will fail to authenticate incoming
|
||||||
connection properly.
|
connection properly.
|
||||||
|
|
||||||
|
|
||||||
|
Authenticating using OPENID
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
SOGo natively supports OPENID authentication. For activating OpenId authentication you need first to make sure that
|
||||||
|
_SOGoAuthenticationType_ is set to `openid`,
|
||||||
|
_SOGoXSRFValidationEnabled_ is set to `NO` and set the following parameters:
|
||||||
|
|
||||||
|
[cols="^4,46,50a"]
|
||||||
|
|=======================================================================
|
||||||
|
|S |OCSOpenIdURL
|
||||||
|
|Parameter used to set the database URL for openID session.
|
||||||
|
|
||||||
|
For MariaDB/MySQL, set the database URL to something like: mysql://sogo:sogo@127.0.0.1:3306/sogo/sogo_openid.
|
||||||
|
|
||||||
|
|
||||||
|
|S |SOGoOpenIdConfigUrl
|
||||||
|
|Parameter used to specify the endpoint of OpenID Provider Configuration, mandatory. For example:
|
||||||
|
https://myopenid.net/.well-known/openid-configuration
|
||||||
|
|
||||||
|
|S |SOGoOpenIdClient
|
||||||
|
|Name of your openid client, mandatory.
|
||||||
|
|
||||||
|
|S |SOGoOpenIdClientSecret
|
||||||
|
|Secret of your openid client, mandatory
|
||||||
|
|
||||||
|
|S |SOGoOpenIdScope
|
||||||
|
|Scope or your openid client, mandatory. List of words space separated like this:
|
||||||
|
"openid profile email"
|
||||||
|
|
||||||
|
|S |SOGoOpenIdEmailParam
|
||||||
|
|Name of the parameter from user profile that contains the mail/uid.
|
||||||
|
|
||||||
|
Defaults to `email` when unset.
|
||||||
|
|
||||||
|
|S |SOGoOpenIdEnableRefreshToken
|
||||||
|
|Set to `YES` to Enable the mechanism of refresh token if provided. You may have to configure
|
||||||
|
and/or add a value to your scope for it to work.
|
||||||
|
|
||||||
|
Defaults to `NO` when unset.
|
||||||
|
|
||||||
|
|S |SOGoOpenIdTokenCheckInterval
|
||||||
|
|Number of seconds before sogo check again the user's access token validity.
|
||||||
|
This is to prevent sogo to do too much request to the openid server.
|
||||||
|
|
||||||
|
Defaults to `0` when unset.
|
||||||
|
|
||||||
|
|S |SOGoOpenIdLogoutEnabled
|
||||||
|
|Allow user to end their openId with the webmail. Meaning that will disconnect them from
|
||||||
|
the others applicaitons as well. The openid server must have a end_session_endpoint.
|
||||||
|
|
||||||
|
Defaults to `NO` when unset.
|
||||||
|
|=======================================================================
|
||||||
|
|
||||||
|
|
||||||
|
The tricky part shows up for the imap and smtp sever. SOGo doesn't know the password
|
||||||
|
of the user and only have its access token. A new auth mechanism has been implemented,
|
||||||
|
the https://developers.google.com/gmail/imap/xoauth2-protocol#initial_client_response[xoauth2]
|
||||||
|
|
||||||
|
You can set it with the parameter _NGImap4AuthMechanism_ and/or _SOGoSMTPAuthenticationType_
|
||||||
|
|
||||||
|
*With dovecot:* +
|
||||||
|
Dovecot natively supports xoauth2 and can be figured as such: https://doc.dovecot.org/2.3/configuration_manual/authentication/oauth2/
|
||||||
|
|
||||||
|
*With cyrus:* +
|
||||||
|
Cyrus doesn't support xoauth2 mechanism and pluggins or homemade solutions must be found. +
|
||||||
|
_Please note, as Alinto uses dovecot, we didn't investigate cyrus' case. If one member of the community
|
||||||
|
finds a solution, we will be happy to update this documentation._
|
||||||
|
|
||||||
|
As you can see, a new database table is used for handling openid session. The table is automaticcaly created when _OCSOpenIdURL_ is set.
|
||||||
|
If the user quits the webmail without logging out or trough another application,
|
||||||
|
the session will stays in the table and be useless. That's why a new sogo-tool command has been added to clean this table.
|
||||||
|
You can put it in a cron to do that periodicly. +
|
||||||
|
See _<<sogo-tool-clean-openid-sessions,sogo-tool clean-openid-sessions>>_.
|
||||||
|
|
||||||
Authenticating using SAML2
|
Authenticating using SAML2
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
@@ -2113,8 +2192,7 @@ To disable TLS verification for localhost domains, add
|
|||||||
|
|
||||||
|D |SOGoSMTPAuthenticationType
|
|D |SOGoSMTPAuthenticationType
|
||||||
|Activate SMTP authentication and specifies which type is in use.
|
|Activate SMTP authentication and specifies which type is in use.
|
||||||
Current, only `PLAIN` is supported and other values will cause
|
Current, Are supported `PLAIN` and 'xoauth2' for openid.
|
||||||
the authentication to fail.
|
|
||||||
|
|
||||||
|D |SOGoSMTPMasterUserEnabled
|
|D |SOGoSMTPMasterUserEnabled
|
||||||
|Enable specific SMTP user account for system e-mails (notifications, reminders, ...). Default is `NO`.
|
|Enable specific SMTP user account for system e-mails (notifications, reminders, ...). Default is `NO`.
|
||||||
@@ -2297,6 +2375,7 @@ SASL mechanism. Using `AUTHENTICATE` instead of `LOGIN` is also necessary
|
|||||||
to enable UTF-8 characters in users' passwords. To enable simple use of
|
to enable UTF-8 characters in users' passwords. To enable simple use of
|
||||||
`AUTHENTICATE` for this purpose, set this setting to `plain`. Please note
|
`AUTHENTICATE` for this purpose, set this setting to `plain`. Please note
|
||||||
that this feature might be limited at this time.
|
that this feature might be limited at this time.
|
||||||
|
Now support `xoauth2` mechanism when using openid. Be sure you imap server undesrtands this mechanism.
|
||||||
|
|
||||||
|D |NGImap4ConnectionGroupIdPrefix
|
|D |NGImap4ConnectionGroupIdPrefix
|
||||||
|Prefix to prepend to names in IMAP ACL transactions, to indicate the
|
|Prefix to prepend to names in IMAP ACL transactions, to indicate the
|
||||||
@@ -2677,7 +2756,7 @@ Defaults to `inline` when unset.
|
|||||||
|Show recipients or sender full email in mailboxes if set to `YES`. Default value is `NO`.
|
|Show recipients or sender full email in mailboxes if set to `YES`. Default value is `NO`.
|
||||||
|
|
||||||
|U |SOGoMailHideInlineAttachments
|
|U |SOGoMailHideInlineAttachments
|
||||||
|Hide attachements for inline images if set to `YES`. Default value is `NO`.
|
|Hide attachments for inline images if set to `YES`. Default value is `NO`.
|
||||||
|
|
||||||
|
|
||||||
|U |SOGoMailCustomFullName
|
|U |SOGoMailCustomFullName
|
||||||
@@ -3630,6 +3709,22 @@ sogo-tool checkup user1
|
|||||||
sogo-tool checkup -d user1
|
sogo-tool checkup -d user1
|
||||||
----
|
----
|
||||||
|
|
||||||
|
|
||||||
|
[[sogo-tool-clean-openid-sessions]]
|
||||||
|
|
||||||
|
sogo-tool clean-openid-sessions
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
Obviously only usefull if you have set SOGo with openId authentication.
|
||||||
|
Will clean all expired openId sessions from the database.
|
||||||
|
|
||||||
|
sogo-tool clean-openid-sessions
|
||||||
|
|
||||||
|
Example:
|
||||||
|
----
|
||||||
|
sogo-tool clean-openid-sessions
|
||||||
|
----
|
||||||
|
|
||||||
sogo-tool cleanup
|
sogo-tool cleanup
|
||||||
~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ SUBPROJECTS = \
|
|||||||
SoObjects \
|
SoObjects \
|
||||||
Main \
|
Main \
|
||||||
UI \
|
UI \
|
||||||
|
API \
|
||||||
Tools \
|
Tools \
|
||||||
Tests/Unit \
|
Tests/Unit \
|
||||||
|
|
||||||
|
|||||||
+31
-14
@@ -288,16 +288,16 @@ static BOOL debugLeaks;
|
|||||||
|
|
||||||
e = [urlStrings objectEnumerator];
|
e = [urlStrings objectEnumerator];
|
||||||
while (ok && (tmp = [e nextObject]))
|
while (ok && (tmp = [e nextObject]))
|
||||||
|
{
|
||||||
|
value = [defaults stringForKey: tmp];
|
||||||
|
if (value)
|
||||||
|
[self _checkTableWithCM: cm tableURL: value andType: tmp];
|
||||||
|
else
|
||||||
{
|
{
|
||||||
value = [defaults stringForKey: tmp];
|
[self errorWithFormat: @"No value specified for '%@'", tmp];
|
||||||
if (value)
|
ok = NO;
|
||||||
[self _checkTableWithCM: cm tableURL: value andType: tmp];
|
|
||||||
else
|
|
||||||
{
|
|
||||||
[self errorWithFormat: @"No value specified for '%@'", tmp];
|
|
||||||
ok = NO;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (combined)
|
if (combined)
|
||||||
{
|
{
|
||||||
@@ -322,9 +322,15 @@ static BOOL debugLeaks;
|
|||||||
|
|
||||||
// Create the email alarms table, if required
|
// Create the email alarms table, if required
|
||||||
if ([defaults enableEMailAlarms])
|
if ([defaults enableEMailAlarms])
|
||||||
{
|
{
|
||||||
[[fm alarmsFolder] createFolderIfNotExists];
|
[[fm alarmsFolder] createFolderIfNotExists];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//Create mandatory openId table, if used
|
||||||
|
if([defaults hasOpenIdType])
|
||||||
|
{
|
||||||
|
[[fm openIdFolder] createFolderIfNotExists];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return ok;
|
return ok;
|
||||||
@@ -377,7 +383,12 @@ static BOOL debugLeaks;
|
|||||||
if([login isEqualToString: @"changeLanguage"])
|
if([login isEqualToString: @"changeLanguage"])
|
||||||
user = nil;
|
user = nil;
|
||||||
else
|
else
|
||||||
|
{
|
||||||
|
//Here the user is expected to be name or name@domain.com
|
||||||
|
//However iOS 18.4 sanitize the caldav url and put %40 instead of @
|
||||||
|
login = [login stringByReplacingOccurrencesOfString: @"%40" withString: @"@"];
|
||||||
user = [SOGoUser userWithLogin: login roles: nil];
|
user = [SOGoUser userWithLogin: login roles: nil];
|
||||||
|
}
|
||||||
if (user)
|
if (user)
|
||||||
userFolder = [$(@"SOGoUserFolder") objectWithName: login
|
userFolder = [$(@"SOGoUserFolder") objectWithName: login
|
||||||
inContainer: self];
|
inContainer: self];
|
||||||
@@ -406,7 +417,7 @@ static BOOL debugLeaks;
|
|||||||
{
|
{
|
||||||
id obj;
|
id obj;
|
||||||
WORequest *request;
|
WORequest *request;
|
||||||
BOOL isDAVRequest;
|
BOOL isDAVRequest, isAPIRequest;
|
||||||
SOGoSystemDefaults *sd;
|
SOGoSystemDefaults *sd;
|
||||||
|
|
||||||
/* put locale info into the context in case it's not there */
|
/* put locale info into the context in case it's not there */
|
||||||
@@ -414,8 +425,14 @@ static BOOL debugLeaks;
|
|||||||
|
|
||||||
sd = [SOGoSystemDefaults sharedSystemDefaults];
|
sd = [SOGoSystemDefaults sharedSystemDefaults];
|
||||||
request = [_ctx request];
|
request = [_ctx request];
|
||||||
|
isAPIRequest = [[request requestHandlerKey] isEqualToString:@"SOGoAPI"];
|
||||||
isDAVRequest = [[request requestHandlerKey] isEqualToString:@"dav"];
|
isDAVRequest = [[request requestHandlerKey] isEqualToString:@"dav"];
|
||||||
if (isDAVRequest || [sd isWebAccessEnabled])
|
if(isAPIRequest && ![_key isEqualToString:@"SOGo"] && ![_key isEqualToString:@"SOGoAPI"])
|
||||||
|
{
|
||||||
|
//The request will be handle by the API Dispatcher
|
||||||
|
obj = nil;
|
||||||
|
}
|
||||||
|
else if (isDAVRequest || [sd isWebAccessEnabled])
|
||||||
{
|
{
|
||||||
if (isDAVRequest)
|
if (isDAVRequest)
|
||||||
{
|
{
|
||||||
@@ -445,7 +462,7 @@ static BOOL debugLeaks;
|
|||||||
{
|
{
|
||||||
obj = [self lookupUser: _key inContext: _ctx];
|
obj = [self lookupUser: _key inContext: _ctx];
|
||||||
if (!obj && ![_key isEqualToString: @"public"])
|
if (!obj && ![_key isEqualToString: @"public"])
|
||||||
obj = [self lookupUser: @"anonymous" inContext: _ctx];
|
obj = [self lookupUser: @"anonymous" inContext: _ctx];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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).
|
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
|
## Translations
|
||||||
|
|
||||||
SOGo and its associated components are available in various languages. The following list describes the official translations alongside their maintainers:
|
SOGo and its associated components are available in various languages. The following list describes the official translations alongside their maintainers:
|
||||||
|
|||||||
@@ -31,7 +31,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
@class NSString, NSArray, NSURL, NSDictionary, NSException;
|
@class NSString, NSArray, NSURL, NSDictionary, NSException;
|
||||||
@class GCSChannelManager, GCSAlarmsFolder, GCSAdminFolder, GCSFolder, GCSFolderType, GCSSessionsFolder;
|
@class GCSChannelManager, GCSAlarmsFolder, GCSAdminFolder, GCSFolder, GCSFolderType, GCSSessionsFolder, GCSOpenIdFolder;
|
||||||
|
|
||||||
@interface GCSFolderManager : NSObject
|
@interface GCSFolderManager : NSObject
|
||||||
{
|
{
|
||||||
@@ -92,6 +92,9 @@
|
|||||||
/* admin */
|
/* admin */
|
||||||
- (GCSAdminFolder *)adminFolder;
|
- (GCSAdminFolder *)adminFolder;
|
||||||
|
|
||||||
|
/* openid */
|
||||||
|
- (GCSOpenIdFolder *) openIdFolder;
|
||||||
|
|
||||||
/* folder types */
|
/* folder types */
|
||||||
|
|
||||||
- (GCSFolderType *)folderTypeWithName:(NSString *)_name;
|
- (GCSFolderType *)folderTypeWithName:(NSString *)_name;
|
||||||
|
|||||||
@@ -38,6 +38,7 @@
|
|||||||
#import "EOAdaptorChannel+GCS.h"
|
#import "EOAdaptorChannel+GCS.h"
|
||||||
#import "GCSAlarmsFolder.h"
|
#import "GCSAlarmsFolder.h"
|
||||||
#import "GCSAdminFolder.h"
|
#import "GCSAdminFolder.h"
|
||||||
|
#import "GCSOpenIdFolder.h"
|
||||||
#import "GCSFolder.h"
|
#import "GCSFolder.h"
|
||||||
#import "GCSFolderType.h"
|
#import "GCSFolderType.h"
|
||||||
#import "GCSSessionsFolder.h"
|
#import "GCSSessionsFolder.h"
|
||||||
@@ -504,6 +505,12 @@ static BOOL _singleStoreMode = NO;
|
|||||||
return [GCSAdminFolder adminFolderWithFolderManager: self];
|
return [GCSAdminFolder adminFolderWithFolderManager: self];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* openId */
|
||||||
|
- (GCSOpenIdFolder *) openIdFolder
|
||||||
|
{
|
||||||
|
return [GCSOpenIdFolder openIdFolderWithFolderManager: self];
|
||||||
|
}
|
||||||
|
|
||||||
- (NSString *)generateSQLWhereForInternalNames:(NSArray *)_names
|
- (NSString *)generateSQLWhereForInternalNames:(NSArray *)_names
|
||||||
exactMatch:(BOOL)_beExact orDirectSubfolderMatch:(BOOL)_directSubs
|
exactMatch:(BOOL)_beExact orDirectSubfolderMatch:(BOOL)_directSubs
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -0,0 +1,57 @@
|
|||||||
|
/* GCSAdminFolder.h - this file is part of $PROJECT_NAME_HERE$
|
||||||
|
*
|
||||||
|
* Copyright (C) 2023 Alinto
|
||||||
|
*
|
||||||
|
* This file is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2, or (at your option)
|
||||||
|
* any later version.
|
||||||
|
*
|
||||||
|
* This file is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; see the file COPYING. If not, write to
|
||||||
|
* the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
|
* Boston, MA 02111-1307, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef GCSOPENIDFOLDER_H
|
||||||
|
#define GCSOPENIDOLDER_H
|
||||||
|
|
||||||
|
|
||||||
|
@class NSCalendarDate;
|
||||||
|
@class NSException;
|
||||||
|
@class NSNumber;
|
||||||
|
@class NSString;
|
||||||
|
|
||||||
|
@class GCSFolderManager;
|
||||||
|
|
||||||
|
@interface GCSOpenIdFolder : NSObject
|
||||||
|
{
|
||||||
|
GCSFolderManager *folderManager;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ (id)openIdFolderWithFolderManager:(GCSFolderManager *)newFolderManager;
|
||||||
|
|
||||||
|
- (void) setFolderManager: (GCSFolderManager *) newFolderManager;
|
||||||
|
|
||||||
|
/* operations */
|
||||||
|
|
||||||
|
- (void) createFolderIfNotExists;
|
||||||
|
- (BOOL) canConnectStore;
|
||||||
|
|
||||||
|
- (NSString *) getRefreshToken: (NSString *) _user_session useOldSession: (BOOL) use_old_session;
|
||||||
|
- (NSString *) getNewToken: (NSString *) _old_session;
|
||||||
|
- (NSException *) writeOpenIdSession: (NSString *) _user_session
|
||||||
|
withOldSession: (NSString *) _old_session
|
||||||
|
withRefreshToken: (NSString *) _refresh_token
|
||||||
|
withExpire: (NSNumber *) _expire
|
||||||
|
withRefreshExpire: (NSNumber *) _refresh_expire;
|
||||||
|
- (NSException *) deleteOpenIdSessionFor: (NSString *) _user_session;
|
||||||
|
|
||||||
|
@end
|
||||||
|
|
||||||
|
#endif /* GCSALARMSFOLDER_H */
|
||||||
@@ -0,0 +1,363 @@
|
|||||||
|
/* GCSAdminFolder.m - this file is part of SOGo
|
||||||
|
*
|
||||||
|
* Copyright (C) 2023 Alinto
|
||||||
|
*
|
||||||
|
* This file is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2, or (at your option)
|
||||||
|
* any later version.
|
||||||
|
*
|
||||||
|
* This file is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; see the file COPYING. If not, write to
|
||||||
|
* the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
|
* Boston, MA 02111-1307, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#import <NGExtensions/NSObject+Logs.h>
|
||||||
|
#import <NGExtensions/NSNull+misc.h>
|
||||||
|
|
||||||
|
#import <GDLAccess/EOAdaptorContext.h>
|
||||||
|
#import <GDLAccess/EOAttribute.h>
|
||||||
|
#import <GDLAccess/EOEntity.h>
|
||||||
|
#import <GDLAccess/EOSQLQualifier.h>
|
||||||
|
|
||||||
|
#import "EOQualifier+GCS.h"
|
||||||
|
#import "GCSChannelManager.h"
|
||||||
|
#import "GCSFolderManager.h"
|
||||||
|
#import "GCSSpecialQueries.h"
|
||||||
|
#import "NSURL+GCS.h"
|
||||||
|
|
||||||
|
#import "GCSOpenIdFolder.h"
|
||||||
|
|
||||||
|
static NSString *openIdFolderURLString = nil;
|
||||||
|
|
||||||
|
#warning GCSOpenIdFolder should share a common ancestor with GCSFolder
|
||||||
|
|
||||||
|
@implementation GCSOpenIdFolder
|
||||||
|
|
||||||
|
+ (void) initialize
|
||||||
|
{
|
||||||
|
NSUserDefaults *ud;
|
||||||
|
|
||||||
|
if (!openIdFolderURLString)
|
||||||
|
{
|
||||||
|
ud = [NSUserDefaults standardUserDefaults];
|
||||||
|
ASSIGN (openIdFolderURLString, [ud stringForKey: @"OCSOpenIdURL"]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
+ (id) openIdFolderWithFolderManager: (GCSFolderManager *) newFolderManager
|
||||||
|
{
|
||||||
|
GCSOpenIdFolder *newFolder;
|
||||||
|
|
||||||
|
if (openIdFolderURLString)
|
||||||
|
{
|
||||||
|
newFolder = [self new];
|
||||||
|
[newFolder autorelease];
|
||||||
|
[newFolder setFolderManager: newFolderManager];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
[self errorWithFormat: @"'OCSOpenIdURL' is not set"];
|
||||||
|
newFolder = nil;
|
||||||
|
}
|
||||||
|
|
||||||
|
return newFolder;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void) setFolderManager: (GCSFolderManager *) newFolderManager
|
||||||
|
{
|
||||||
|
ASSIGN (folderManager, newFolderManager);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* accessors */
|
||||||
|
|
||||||
|
- (NSURL *) _location
|
||||||
|
{
|
||||||
|
NSURL *location;
|
||||||
|
|
||||||
|
if (openIdFolderURLString)
|
||||||
|
location = [NSURL URLWithString: openIdFolderURLString];
|
||||||
|
else
|
||||||
|
{
|
||||||
|
[self warnWithFormat: @"'OCSOpenIdURL' is not set"];
|
||||||
|
location = nil;
|
||||||
|
}
|
||||||
|
|
||||||
|
return location;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (GCSChannelManager *) _channelManager
|
||||||
|
{
|
||||||
|
return [folderManager channelManager];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (NSString *) _storeTableName
|
||||||
|
{
|
||||||
|
return [[self _location] gcsTableName];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (EOEntity *) _storeTableEntityForChannel: (EOAdaptorChannel *) tc
|
||||||
|
{
|
||||||
|
static EOEntity *entity = nil;
|
||||||
|
EOAttribute *attribute;
|
||||||
|
NSString *tableName;
|
||||||
|
NSString *columns[] = {@"c_user_session", @"c_old_session", @"c_session_started", @"c_refresh_token", @"c_access_token_expires_in", @"c_refresh_token_expires_in", nil };
|
||||||
|
NSString **column;
|
||||||
|
NSMutableArray *keys;
|
||||||
|
NSDictionary *types;
|
||||||
|
|
||||||
|
if (!entity)
|
||||||
|
{
|
||||||
|
entity = [EOEntity new];
|
||||||
|
tableName = [self _storeTableName];
|
||||||
|
[entity setName: tableName];
|
||||||
|
[entity setExternalName: tableName];
|
||||||
|
|
||||||
|
types = [[tc specialQueries] openIdAttributeTypes];
|
||||||
|
|
||||||
|
column = columns;
|
||||||
|
while (*column)
|
||||||
|
{
|
||||||
|
attribute = [EOAttribute new];
|
||||||
|
[attribute setName: *column];
|
||||||
|
[attribute setColumnName: *column];
|
||||||
|
[attribute setExternalType: [types objectForKey: *column]];
|
||||||
|
[entity addAttribute: attribute];
|
||||||
|
[attribute release];
|
||||||
|
column++;
|
||||||
|
}
|
||||||
|
|
||||||
|
keys = [NSMutableArray arrayWithCapacity: 1];
|
||||||
|
[keys addObject: [entity attributeNamed: @"c_user_session"]];
|
||||||
|
[entity setPrimaryKeyAttributes: keys];
|
||||||
|
|
||||||
|
keys = [NSMutableArray arrayWithCapacity: 5];
|
||||||
|
[keys addObject: [entity attributeNamed: @"c_old_session"]];
|
||||||
|
[keys addObject: [entity attributeNamed: @"c_session_started"]];
|
||||||
|
[keys addObject: [entity attributeNamed: @"c_refresh_token"]];
|
||||||
|
[keys addObject: [entity attributeNamed: @"c_access_token_expires_in"]];
|
||||||
|
[keys addObject: [entity attributeNamed: @"c_refresh_token_expires_in"]];
|
||||||
|
[entity setClassProperties: keys];
|
||||||
|
[entity setAttributesUsedForLocking: [NSArray array]];
|
||||||
|
}
|
||||||
|
|
||||||
|
return entity;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* connection */
|
||||||
|
|
||||||
|
- (EOAdaptorChannel *) _acquireStoreChannel
|
||||||
|
{
|
||||||
|
return [[self _channelManager] acquireOpenChannelForURL: [self _location]];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void) _releaseChannel: (EOAdaptorChannel *) _channel
|
||||||
|
{
|
||||||
|
[[self _channelManager] releaseChannel:_channel immediately: YES];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (BOOL) canConnectStore
|
||||||
|
{
|
||||||
|
return [[self _channelManager] canConnect:[self _location]];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void) createFolderIfNotExists
|
||||||
|
{
|
||||||
|
EOAdaptorChannel *tc;
|
||||||
|
NSString *sql, *tableName;
|
||||||
|
GCSSpecialQueries *queries;
|
||||||
|
|
||||||
|
tc = [self _acquireStoreChannel];
|
||||||
|
tableName = [self _storeTableName];
|
||||||
|
|
||||||
|
queries = [tc specialQueries];
|
||||||
|
|
||||||
|
sql = [NSString stringWithFormat: @"SELECT 1 FROM %@ WHERE 1 = 2", tableName];
|
||||||
|
if ([tc evaluateExpressionX: sql])
|
||||||
|
{
|
||||||
|
sql = [queries createOpenIdFolderWithName: tableName];
|
||||||
|
if (![tc evaluateExpressionX: sql])
|
||||||
|
[self logWithFormat: @"openid folder table '%@' successfully created!", tableName];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
[tc cancelFetch];
|
||||||
|
|
||||||
|
[self _releaseChannel: tc];
|
||||||
|
}
|
||||||
|
|
||||||
|
/* operations */
|
||||||
|
|
||||||
|
/* table has the following fields:
|
||||||
|
c_user_session varchar(255) NOT NULL,
|
||||||
|
c_session_started int(11) NOT NULL,
|
||||||
|
c_refresh_token varchar(4096) DEFAULT '',
|
||||||
|
c_access_token_expires_in int(11) NOT NULL,
|
||||||
|
c_refresh_token_expires_in int(11) DEFAULT NULL,
|
||||||
|
*/
|
||||||
|
|
||||||
|
- (NSDictionary *) recordForSession: (NSString *) _user_session useOldSession: (BOOL) use_old_session
|
||||||
|
{
|
||||||
|
EOAdaptorChannel *tc;
|
||||||
|
EOAdaptorContext *context;
|
||||||
|
NSException *error;
|
||||||
|
NSArray *attrs;
|
||||||
|
NSDictionary *record;
|
||||||
|
EOEntity *entity;
|
||||||
|
EOSQLQualifier *qualifier;
|
||||||
|
|
||||||
|
record = nil;
|
||||||
|
|
||||||
|
tc = [self _acquireStoreChannel];
|
||||||
|
if (tc)
|
||||||
|
{
|
||||||
|
context = [tc adaptorContext];
|
||||||
|
entity = [self _storeTableEntityForChannel: tc];
|
||||||
|
if(!use_old_session)
|
||||||
|
qualifier = [[EOSQLQualifier alloc] initWithEntity: entity
|
||||||
|
qualifierFormat: @"c_user_session='%@'", _user_session];
|
||||||
|
else
|
||||||
|
qualifier = [[EOSQLQualifier alloc] initWithEntity: entity
|
||||||
|
qualifierFormat: @"c_old_session='%@'", _user_session];
|
||||||
|
[qualifier autorelease];
|
||||||
|
|
||||||
|
[context beginTransaction];
|
||||||
|
error = [tc selectAttributesX: [entity attributesUsedForFetch]
|
||||||
|
describedByQualifier: qualifier
|
||||||
|
fetchOrder: nil
|
||||||
|
lock: NO];
|
||||||
|
if (error)
|
||||||
|
[self errorWithFormat:@"%s: cannot execute fetch: %@", __PRETTY_FUNCTION__, error];
|
||||||
|
else
|
||||||
|
{
|
||||||
|
attrs = [tc describeResults: NO];
|
||||||
|
record = [tc fetchAttributes: attrs withZone: NULL];
|
||||||
|
[tc cancelFetch];
|
||||||
|
}
|
||||||
|
[context rollbackTransaction];
|
||||||
|
[self _releaseChannel: tc];
|
||||||
|
}
|
||||||
|
|
||||||
|
return record;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (NSString *) getRefreshToken: (NSString *) _user_session
|
||||||
|
{
|
||||||
|
NSDictionary *r;
|
||||||
|
|
||||||
|
r = [self recordForSession: _user_session useOldSession: NO];
|
||||||
|
if (r && [r objectForKey:@"c_refresh_token"])
|
||||||
|
return [r objectForKey:@"c_refresh_token"];
|
||||||
|
|
||||||
|
return nil;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (NSString *) getNewToken: (NSString *) _old_session
|
||||||
|
{
|
||||||
|
NSDictionary *r;
|
||||||
|
r = [self recordForSession: _old_session useOldSession: YES];
|
||||||
|
if (r && [r objectForKey:@"c_user_session"])
|
||||||
|
return [r objectForKey:@"c_user_session"];
|
||||||
|
|
||||||
|
return nil;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
- (NSException *) writeOpenIdSession: (NSString *) _user_session
|
||||||
|
withOldSession: (NSString *) _old_session
|
||||||
|
withRefreshToken: (NSString *) _refresh_token
|
||||||
|
withExpire: (NSNumber *) _expire
|
||||||
|
withRefreshExpire: (NSNumber *) _refresh_expire
|
||||||
|
{
|
||||||
|
NSDictionary *record, *newRecord;
|
||||||
|
NSException *error;
|
||||||
|
NSCalendarDate *nowDate;
|
||||||
|
int now, nowExpire, nowRefreshExpire;
|
||||||
|
EOAdaptorChannel *tc;
|
||||||
|
EOAdaptorContext *context;
|
||||||
|
EOEntity *entity;
|
||||||
|
EOSQLQualifier *qualifier;
|
||||||
|
|
||||||
|
error = nil;
|
||||||
|
tc = [self _acquireStoreChannel];
|
||||||
|
if (tc)
|
||||||
|
{
|
||||||
|
context = [tc adaptorContext];
|
||||||
|
|
||||||
|
nowDate = [NSCalendarDate date];
|
||||||
|
now = (nowDate ? (int)[nowDate timeIntervalSince1970] : 0);
|
||||||
|
nowExpire = now + [_expire intValue];
|
||||||
|
if(_refresh_expire)
|
||||||
|
nowRefreshExpire = now + [_refresh_expire intValue];
|
||||||
|
else
|
||||||
|
nowRefreshExpire = -1;
|
||||||
|
if(!_old_session)
|
||||||
|
_old_session = @"";
|
||||||
|
|
||||||
|
newRecord = [NSDictionary dictionaryWithObjectsAndKeys: _user_session, @"c_user_session",
|
||||||
|
_old_session, @"c_old_session",
|
||||||
|
[NSNumber numberWithInt:now], @"c_session_started",
|
||||||
|
_refresh_token, @"c_refresh_token",
|
||||||
|
[NSNumber numberWithInt:nowExpire] , @"c_access_token_expires_in",
|
||||||
|
[NSNumber numberWithInt:nowRefreshExpire] , @"c_refresh_token_expires_in",
|
||||||
|
nil];
|
||||||
|
record = [self recordForSession: _user_session useOldSession: NO];
|
||||||
|
entity = [self _storeTableEntityForChannel: tc];
|
||||||
|
[context beginTransaction];
|
||||||
|
if (!record)
|
||||||
|
{
|
||||||
|
//If the session already exist no need to update it as it is unique
|
||||||
|
error = [tc insertRowX: newRecord forEntity: entity];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (error)
|
||||||
|
{
|
||||||
|
[context rollbackTransaction];
|
||||||
|
[self errorWithFormat:@"%s: cannot write record: %@", __PRETTY_FUNCTION__, error];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
[context commitTransaction];
|
||||||
|
[self _releaseChannel: tc];
|
||||||
|
}
|
||||||
|
return error;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (NSException *) deleteOpenIdSessionFor: (NSString *) _user_session
|
||||||
|
{
|
||||||
|
EOAdaptorChannel *tc;
|
||||||
|
EOAdaptorContext *context;
|
||||||
|
EOEntity *entity;
|
||||||
|
EOSQLQualifier *qualifier;
|
||||||
|
NSException *error;
|
||||||
|
|
||||||
|
error = nil;
|
||||||
|
tc = [self _acquireStoreChannel];
|
||||||
|
if (tc)
|
||||||
|
{
|
||||||
|
context = [tc adaptorContext];
|
||||||
|
entity = [self _storeTableEntityForChannel: tc];
|
||||||
|
qualifier = [[EOSQLQualifier alloc] initWithEntity: entity
|
||||||
|
qualifierFormat: @"c_user_session='%@'",_user_session];
|
||||||
|
[qualifier autorelease];
|
||||||
|
[context beginTransaction];
|
||||||
|
error = [tc deleteRowsDescribedByQualifierX: qualifier];
|
||||||
|
if (error)
|
||||||
|
{
|
||||||
|
[context rollbackTransaction];
|
||||||
|
[self errorWithFormat:@"%s: cannot delete record: %@", __PRETTY_FUNCTION__, error];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
[context commitTransaction];
|
||||||
|
[self _releaseChannel: tc];
|
||||||
|
}
|
||||||
|
|
||||||
|
return error;
|
||||||
|
}
|
||||||
|
|
||||||
|
@end
|
||||||
@@ -42,6 +42,9 @@
|
|||||||
- (NSString *)createAdminFolderWithName:(NSString *)tableName;
|
- (NSString *)createAdminFolderWithName:(NSString *)tableName;
|
||||||
- (NSDictionary *)adminAttributeTypes;
|
- (NSDictionary *)adminAttributeTypes;
|
||||||
|
|
||||||
|
- (NSString *)createOpenIdFolderWithName:(NSString *)tableName;
|
||||||
|
- (NSDictionary *)openIdAttributeTypes;
|
||||||
|
|
||||||
- (NSString *) updateCPathInFolderInfo:(NSString *)tableName
|
- (NSString *) updateCPathInFolderInfo:(NSString *)tableName
|
||||||
withCPath2:(NSString *)c_path2;
|
withCPath2:(NSString *)c_path2;
|
||||||
|
|
||||||
|
|||||||
@@ -95,6 +95,21 @@
|
|||||||
return nil;
|
return nil;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- (NSString *) createOpenIdFolderWithName: (NSString *) tableName
|
||||||
|
{
|
||||||
|
[self subclassResponsibility: _cmd];
|
||||||
|
|
||||||
|
return nil;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (NSDictionary *) openIdAttributeTypes
|
||||||
|
{
|
||||||
|
[self subclassResponsibility: _cmd];
|
||||||
|
|
||||||
|
return nil;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
- (NSString *) createFolderTableWithName: (NSString *) tableName
|
- (NSString *) createFolderTableWithName: (NSString *) tableName
|
||||||
{
|
{
|
||||||
[self subclassResponsibility: _cmd];
|
[self subclassResponsibility: _cmd];
|
||||||
@@ -195,6 +210,38 @@
|
|||||||
return types;
|
return types;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- (NSString *) createOpenIdFolderWithName: (NSString *) tableName
|
||||||
|
{
|
||||||
|
static NSString *sqlFolderFormat
|
||||||
|
= (@"CREATE TABLE %@ ("
|
||||||
|
@" c_user_session VARCHAR(4096) NOT NULL,"
|
||||||
|
@" c_old_session VARCHAR(4096) NULL,"
|
||||||
|
@" c_session_started INT4 NOT NULL,"
|
||||||
|
@" c_refresh_token VARCHAR(4096) NULL,"
|
||||||
|
@" c_access_token_expires_in INT4 NULL,"
|
||||||
|
@" c_refresh_token_expires_in INT4 NULL)");
|
||||||
|
|
||||||
|
return [NSString stringWithFormat: sqlFolderFormat, tableName];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (NSDictionary *) openIdAttributeTypes
|
||||||
|
{
|
||||||
|
static NSMutableDictionary *types = nil;
|
||||||
|
|
||||||
|
if (!types)
|
||||||
|
{
|
||||||
|
types = [NSMutableDictionary new];
|
||||||
|
[types setObject: @"varchar" forKey: @"c_user_session"];
|
||||||
|
[types setObject: @"varchar" forKey: @"c_old_session"];
|
||||||
|
[types setObject: @"int" forKey: @"c_session_started"];
|
||||||
|
[types setObject: @"varchar" forKey: @"c_refresh_token"];
|
||||||
|
[types setObject: @"int" forKey: @"c_access_token_expires_in"];
|
||||||
|
[types setObject: @"int" forKey: @"c_refresh_token_expires_in"];
|
||||||
|
}
|
||||||
|
|
||||||
|
return types;
|
||||||
|
}
|
||||||
|
|
||||||
- (NSString *) createFolderTableWithName: (NSString *) tableName
|
- (NSString *) createFolderTableWithName: (NSString *) tableName
|
||||||
{
|
{
|
||||||
static NSString *sqlFolderFormat
|
static NSString *sqlFolderFormat
|
||||||
@@ -324,6 +371,38 @@
|
|||||||
return types;
|
return types;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- (NSString *) createOpenIdFolderWithName: (NSString *) tableName
|
||||||
|
{
|
||||||
|
static NSString *sqlFolderFormat
|
||||||
|
= (@"CREATE TABLE %@ ("
|
||||||
|
@" c_user_session VARCHAR(4096) NOT NULL,"
|
||||||
|
@" c_old_session VARCHAR(4096) NULL,"
|
||||||
|
@" c_session_started INT4 NOT NULL,"
|
||||||
|
@" c_refresh_token VARCHAR(4096) NULL,"
|
||||||
|
@" c_access_token_expires_in INT4 NULL,"
|
||||||
|
@" c_refresh_token_expires_in INT4 NULL)");
|
||||||
|
|
||||||
|
return [NSString stringWithFormat: sqlFolderFormat, tableName];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (NSDictionary *) openIdAttributeTypes
|
||||||
|
{
|
||||||
|
static NSMutableDictionary *types = nil;
|
||||||
|
|
||||||
|
if (!types)
|
||||||
|
{
|
||||||
|
types = [NSMutableDictionary new];
|
||||||
|
[types setObject: @"varchar" forKey: @"c_user_session"];
|
||||||
|
[types setObject: @"varchar" forKey: @"c_old_session"];
|
||||||
|
[types setObject: @"int" forKey: @"c_session_started"];
|
||||||
|
[types setObject: @"varchar" forKey: @"c_refresh_token"];
|
||||||
|
[types setObject: @"int" forKey: @"c_access_token_expires_in"];
|
||||||
|
[types setObject: @"int" forKey: @"c_refresh_token_expires_in"];
|
||||||
|
}
|
||||||
|
|
||||||
|
return types;
|
||||||
|
}
|
||||||
|
|
||||||
- (NSString *) createFolderTableWithName: (NSString *) tableName
|
- (NSString *) createFolderTableWithName: (NSString *) tableName
|
||||||
{
|
{
|
||||||
static NSString *sqlFolderFormat
|
static NSString *sqlFolderFormat
|
||||||
@@ -453,6 +532,38 @@
|
|||||||
return types;
|
return types;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- (NSString *) createOpenIdFolderWithName: (NSString *) tableName
|
||||||
|
{
|
||||||
|
static NSString *sqlFolderFormat
|
||||||
|
= (@"CREATE TABLE %@ ("
|
||||||
|
@" c_user_session VARCHAR2(4096) NOT NULL,"
|
||||||
|
@" c_old_session VARCHAR2(4096) NULL,"
|
||||||
|
@" c_session_started INTEGER NOT NULL,"
|
||||||
|
@" c_refresh_token VARCHAR2(4096) NULL,"
|
||||||
|
@" c_access_token_expires_in INTEGER NULL,"
|
||||||
|
@" c_refresh_token_expires_in INTEGER NULL)");
|
||||||
|
|
||||||
|
return [NSString stringWithFormat: sqlFolderFormat, tableName];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (NSDictionary *) openIdAttributeTypes
|
||||||
|
{
|
||||||
|
static NSMutableDictionary *types = nil;
|
||||||
|
|
||||||
|
if (!types)
|
||||||
|
{
|
||||||
|
types = [NSMutableDictionary new];
|
||||||
|
[types setObject: @"varchar2" forKey: @"c_user_session"];
|
||||||
|
[types setObject: @"varchar2" forKey: @"c_old_session"];
|
||||||
|
[types setObject: @"integer" forKey: @"c_session_started"];
|
||||||
|
[types setObject: @"varchar2" forKey: @"c_refresh_token"];
|
||||||
|
[types setObject: @"integer" forKey: @"c_access_token_expires_in"];
|
||||||
|
[types setObject: @"integer" forKey: @"c_refresh_token_expires_in"];
|
||||||
|
}
|
||||||
|
|
||||||
|
return types;
|
||||||
|
}
|
||||||
|
|
||||||
- (NSString *) createFolderTableWithName: (NSString *) tableName
|
- (NSString *) createFolderTableWithName: (NSString *) tableName
|
||||||
{
|
{
|
||||||
static NSString *sqlFolderFormat
|
static NSString *sqlFolderFormat
|
||||||
|
|||||||
@@ -28,13 +28,14 @@ libGDLContentStore_HEADER_FILES += \
|
|||||||
GCSAdminFolder.h \
|
GCSAdminFolder.h \
|
||||||
GCSContext.h \
|
GCSContext.h \
|
||||||
GCSFieldInfo.h \
|
GCSFieldInfo.h \
|
||||||
GCSFolder.h \
|
GCSFolder.h \
|
||||||
GCSFolderManager.h \
|
GCSFolderManager.h \
|
||||||
GCSFolderType.h \
|
GCSFolderType.h \
|
||||||
GCSChannelManager.h \
|
GCSChannelManager.h \
|
||||||
|
GCSOpenIdFolder.h \
|
||||||
GCSSessionsFolder.h \
|
GCSSessionsFolder.h \
|
||||||
GCSSpecialQueries.h \
|
GCSSpecialQueries.h \
|
||||||
GCSStringFormatter.h \
|
GCSStringFormatter.h \
|
||||||
|
|
||||||
libGDLContentStore_OBJC_FILES += \
|
libGDLContentStore_OBJC_FILES += \
|
||||||
NSURL+GCS.m \
|
NSURL+GCS.m \
|
||||||
@@ -45,13 +46,14 @@ libGDLContentStore_OBJC_FILES += \
|
|||||||
GCSAdminFolder.m \
|
GCSAdminFolder.m \
|
||||||
GCSContext.m \
|
GCSContext.m \
|
||||||
GCSFieldInfo.m \
|
GCSFieldInfo.m \
|
||||||
GCSFolder.m \
|
GCSFolder.m \
|
||||||
GCSFolderManager.m \
|
GCSFolderManager.m \
|
||||||
GCSFolderType.m \
|
GCSFolderType.m \
|
||||||
GCSChannelManager.m \
|
GCSChannelManager.m \
|
||||||
|
GCSOpenIdFolder.m \
|
||||||
GCSSessionsFolder.m \
|
GCSSessionsFolder.m \
|
||||||
GCSSpecialQueries.m \
|
GCSSpecialQueries.m \
|
||||||
GCSStringFormatter.m \
|
GCSStringFormatter.m \
|
||||||
|
|
||||||
# framework support
|
# framework support
|
||||||
|
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ PRODID:-//Alinto//NONSGML IANA 2024b//EN
|
|||||||
VERSION:2.0
|
VERSION:2.0
|
||||||
BEGIN:VTIMEZONE
|
BEGIN:VTIMEZONE
|
||||||
TZID:Africa/Abidjan
|
TZID:Africa/Abidjan
|
||||||
LAST-MODIFIED:20241008T100856Z
|
LAST-MODIFIED:20250324T091428Z
|
||||||
X-LIC-LOCATION:Africa/Abidjan
|
X-LIC-LOCATION:Africa/Abidjan
|
||||||
BEGIN:STANDARD
|
BEGIN:STANDARD
|
||||||
TZNAME:GMT
|
TZNAME:GMT
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ PRODID:-//Alinto//NONSGML IANA 2024b//EN
|
|||||||
VERSION:2.0
|
VERSION:2.0
|
||||||
BEGIN:VTIMEZONE
|
BEGIN:VTIMEZONE
|
||||||
TZID:Africa/Algiers
|
TZID:Africa/Algiers
|
||||||
LAST-MODIFIED:20241008T100856Z
|
LAST-MODIFIED:20250324T091428Z
|
||||||
X-LIC-LOCATION:Africa/Algiers
|
X-LIC-LOCATION:Africa/Algiers
|
||||||
BEGIN:STANDARD
|
BEGIN:STANDARD
|
||||||
TZNAME:CET
|
TZNAME:CET
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ PRODID:-//Alinto//NONSGML IANA 2024b//EN
|
|||||||
VERSION:2.0
|
VERSION:2.0
|
||||||
BEGIN:VTIMEZONE
|
BEGIN:VTIMEZONE
|
||||||
TZID:Africa/Bissau
|
TZID:Africa/Bissau
|
||||||
LAST-MODIFIED:20241008T100856Z
|
LAST-MODIFIED:20250324T091428Z
|
||||||
X-LIC-LOCATION:Africa/Bissau
|
X-LIC-LOCATION:Africa/Bissau
|
||||||
BEGIN:STANDARD
|
BEGIN:STANDARD
|
||||||
TZNAME:GMT
|
TZNAME:GMT
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ PRODID:-//Alinto//NONSGML IANA 2024b//EN
|
|||||||
VERSION:2.0
|
VERSION:2.0
|
||||||
BEGIN:VTIMEZONE
|
BEGIN:VTIMEZONE
|
||||||
TZID:Africa/Cairo
|
TZID:Africa/Cairo
|
||||||
LAST-MODIFIED:20241008T100856Z
|
LAST-MODIFIED:20250324T091428Z
|
||||||
X-LIC-LOCATION:Africa/Cairo
|
X-LIC-LOCATION:Africa/Cairo
|
||||||
BEGIN:DAYLIGHT
|
BEGIN:DAYLIGHT
|
||||||
TZNAME:EEST
|
TZNAME:EEST
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ VERSION:2.0
|
|||||||
BEGIN:VTIMEZONE
|
BEGIN:VTIMEZONE
|
||||||
TZID:Africa/Casablanca
|
TZID:Africa/Casablanca
|
||||||
TZUNTIL:20870511T020001Z
|
TZUNTIL:20870511T020001Z
|
||||||
LAST-MODIFIED:20241008T100856Z
|
LAST-MODIFIED:20250324T091428Z
|
||||||
X-LIC-LOCATION:Africa/Casablanca
|
X-LIC-LOCATION:Africa/Casablanca
|
||||||
BEGIN:STANDARD
|
BEGIN:STANDARD
|
||||||
TZNAME:%z
|
TZNAME:%z
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ PRODID:-//Alinto//NONSGML IANA 2024b//EN
|
|||||||
VERSION:2.0
|
VERSION:2.0
|
||||||
BEGIN:VTIMEZONE
|
BEGIN:VTIMEZONE
|
||||||
TZID:Africa/Ceuta
|
TZID:Africa/Ceuta
|
||||||
LAST-MODIFIED:20241008T100856Z
|
LAST-MODIFIED:20250324T091428Z
|
||||||
X-LIC-LOCATION:Africa/Ceuta
|
X-LIC-LOCATION:Africa/Ceuta
|
||||||
BEGIN:DAYLIGHT
|
BEGIN:DAYLIGHT
|
||||||
TZNAME:CEST
|
TZNAME:CEST
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ VERSION:2.0
|
|||||||
BEGIN:VTIMEZONE
|
BEGIN:VTIMEZONE
|
||||||
TZID:Africa/El_Aaiun
|
TZID:Africa/El_Aaiun
|
||||||
TZUNTIL:20870511T020001Z
|
TZUNTIL:20870511T020001Z
|
||||||
LAST-MODIFIED:20241008T100856Z
|
LAST-MODIFIED:20250324T091428Z
|
||||||
X-LIC-LOCATION:Africa/El_Aaiun
|
X-LIC-LOCATION:Africa/El_Aaiun
|
||||||
BEGIN:STANDARD
|
BEGIN:STANDARD
|
||||||
TZNAME:%z
|
TZNAME:%z
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ PRODID:-//Alinto//NONSGML IANA 2024b//EN
|
|||||||
VERSION:2.0
|
VERSION:2.0
|
||||||
BEGIN:VTIMEZONE
|
BEGIN:VTIMEZONE
|
||||||
TZID:Africa/Johannesburg
|
TZID:Africa/Johannesburg
|
||||||
LAST-MODIFIED:20241008T100856Z
|
LAST-MODIFIED:20250324T091428Z
|
||||||
X-LIC-LOCATION:Africa/Johannesburg
|
X-LIC-LOCATION:Africa/Johannesburg
|
||||||
BEGIN:STANDARD
|
BEGIN:STANDARD
|
||||||
TZNAME:SAST
|
TZNAME:SAST
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ PRODID:-//Alinto//NONSGML IANA 2024b//EN
|
|||||||
VERSION:2.0
|
VERSION:2.0
|
||||||
BEGIN:VTIMEZONE
|
BEGIN:VTIMEZONE
|
||||||
TZID:Africa/Juba
|
TZID:Africa/Juba
|
||||||
LAST-MODIFIED:20241008T100856Z
|
LAST-MODIFIED:20250324T091428Z
|
||||||
X-LIC-LOCATION:Africa/Juba
|
X-LIC-LOCATION:Africa/Juba
|
||||||
BEGIN:STANDARD
|
BEGIN:STANDARD
|
||||||
TZNAME:CAT
|
TZNAME:CAT
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ PRODID:-//Alinto//NONSGML IANA 2024b//EN
|
|||||||
VERSION:2.0
|
VERSION:2.0
|
||||||
BEGIN:VTIMEZONE
|
BEGIN:VTIMEZONE
|
||||||
TZID:Africa/Khartoum
|
TZID:Africa/Khartoum
|
||||||
LAST-MODIFIED:20241008T100856Z
|
LAST-MODIFIED:20250324T091428Z
|
||||||
X-LIC-LOCATION:Africa/Khartoum
|
X-LIC-LOCATION:Africa/Khartoum
|
||||||
BEGIN:STANDARD
|
BEGIN:STANDARD
|
||||||
TZNAME:CAT
|
TZNAME:CAT
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ PRODID:-//Alinto//NONSGML IANA 2024b//EN
|
|||||||
VERSION:2.0
|
VERSION:2.0
|
||||||
BEGIN:VTIMEZONE
|
BEGIN:VTIMEZONE
|
||||||
TZID:Africa/Lagos
|
TZID:Africa/Lagos
|
||||||
LAST-MODIFIED:20241008T100856Z
|
LAST-MODIFIED:20250324T091428Z
|
||||||
X-LIC-LOCATION:Africa/Lagos
|
X-LIC-LOCATION:Africa/Lagos
|
||||||
BEGIN:STANDARD
|
BEGIN:STANDARD
|
||||||
TZNAME:WAT
|
TZNAME:WAT
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ PRODID:-//Alinto//NONSGML IANA 2024b//EN
|
|||||||
VERSION:2.0
|
VERSION:2.0
|
||||||
BEGIN:VTIMEZONE
|
BEGIN:VTIMEZONE
|
||||||
TZID:Africa/Maputo
|
TZID:Africa/Maputo
|
||||||
LAST-MODIFIED:20241008T100856Z
|
LAST-MODIFIED:20250324T091428Z
|
||||||
X-LIC-LOCATION:Africa/Maputo
|
X-LIC-LOCATION:Africa/Maputo
|
||||||
BEGIN:STANDARD
|
BEGIN:STANDARD
|
||||||
TZNAME:CAT
|
TZNAME:CAT
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ PRODID:-//Alinto//NONSGML IANA 2024b//EN
|
|||||||
VERSION:2.0
|
VERSION:2.0
|
||||||
BEGIN:VTIMEZONE
|
BEGIN:VTIMEZONE
|
||||||
TZID:Africa/Monrovia
|
TZID:Africa/Monrovia
|
||||||
LAST-MODIFIED:20241008T100856Z
|
LAST-MODIFIED:20250324T091428Z
|
||||||
X-LIC-LOCATION:Africa/Monrovia
|
X-LIC-LOCATION:Africa/Monrovia
|
||||||
BEGIN:STANDARD
|
BEGIN:STANDARD
|
||||||
TZNAME:GMT
|
TZNAME:GMT
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ PRODID:-//Alinto//NONSGML IANA 2024b//EN
|
|||||||
VERSION:2.0
|
VERSION:2.0
|
||||||
BEGIN:VTIMEZONE
|
BEGIN:VTIMEZONE
|
||||||
TZID:Africa/Nairobi
|
TZID:Africa/Nairobi
|
||||||
LAST-MODIFIED:20241008T100856Z
|
LAST-MODIFIED:20250324T091428Z
|
||||||
X-LIC-LOCATION:Africa/Nairobi
|
X-LIC-LOCATION:Africa/Nairobi
|
||||||
BEGIN:STANDARD
|
BEGIN:STANDARD
|
||||||
TZNAME:EAT
|
TZNAME:EAT
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ PRODID:-//Alinto//NONSGML IANA 2024b//EN
|
|||||||
VERSION:2.0
|
VERSION:2.0
|
||||||
BEGIN:VTIMEZONE
|
BEGIN:VTIMEZONE
|
||||||
TZID:Africa/Ndjamena
|
TZID:Africa/Ndjamena
|
||||||
LAST-MODIFIED:20241008T100856Z
|
LAST-MODIFIED:20250324T091428Z
|
||||||
X-LIC-LOCATION:Africa/Ndjamena
|
X-LIC-LOCATION:Africa/Ndjamena
|
||||||
BEGIN:STANDARD
|
BEGIN:STANDARD
|
||||||
TZNAME:WAT
|
TZNAME:WAT
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ PRODID:-//Alinto//NONSGML IANA 2024b//EN
|
|||||||
VERSION:2.0
|
VERSION:2.0
|
||||||
BEGIN:VTIMEZONE
|
BEGIN:VTIMEZONE
|
||||||
TZID:Africa/Sao_Tome
|
TZID:Africa/Sao_Tome
|
||||||
LAST-MODIFIED:20241008T100856Z
|
LAST-MODIFIED:20250324T091428Z
|
||||||
X-LIC-LOCATION:Africa/Sao_Tome
|
X-LIC-LOCATION:Africa/Sao_Tome
|
||||||
BEGIN:STANDARD
|
BEGIN:STANDARD
|
||||||
TZNAME:GMT
|
TZNAME:GMT
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ PRODID:-//Alinto//NONSGML IANA 2024b//EN
|
|||||||
VERSION:2.0
|
VERSION:2.0
|
||||||
BEGIN:VTIMEZONE
|
BEGIN:VTIMEZONE
|
||||||
TZID:Africa/Tripoli
|
TZID:Africa/Tripoli
|
||||||
LAST-MODIFIED:20241008T100856Z
|
LAST-MODIFIED:20250324T091428Z
|
||||||
X-LIC-LOCATION:Africa/Tripoli
|
X-LIC-LOCATION:Africa/Tripoli
|
||||||
BEGIN:STANDARD
|
BEGIN:STANDARD
|
||||||
TZNAME:EET
|
TZNAME:EET
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ PRODID:-//Alinto//NONSGML IANA 2024b//EN
|
|||||||
VERSION:2.0
|
VERSION:2.0
|
||||||
BEGIN:VTIMEZONE
|
BEGIN:VTIMEZONE
|
||||||
TZID:Africa/Tunis
|
TZID:Africa/Tunis
|
||||||
LAST-MODIFIED:20241008T100856Z
|
LAST-MODIFIED:20250324T091428Z
|
||||||
X-LIC-LOCATION:Africa/Tunis
|
X-LIC-LOCATION:Africa/Tunis
|
||||||
BEGIN:STANDARD
|
BEGIN:STANDARD
|
||||||
TZNAME:CET
|
TZNAME:CET
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ PRODID:-//Alinto//NONSGML IANA 2024b//EN
|
|||||||
VERSION:2.0
|
VERSION:2.0
|
||||||
BEGIN:VTIMEZONE
|
BEGIN:VTIMEZONE
|
||||||
TZID:Africa/Windhoek
|
TZID:Africa/Windhoek
|
||||||
LAST-MODIFIED:20241008T100856Z
|
LAST-MODIFIED:20250324T091428Z
|
||||||
X-LIC-LOCATION:Africa/Windhoek
|
X-LIC-LOCATION:Africa/Windhoek
|
||||||
BEGIN:STANDARD
|
BEGIN:STANDARD
|
||||||
TZNAME:CAT
|
TZNAME:CAT
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ PRODID:-//Alinto//NONSGML IANA 2024b//EN
|
|||||||
VERSION:2.0
|
VERSION:2.0
|
||||||
BEGIN:VTIMEZONE
|
BEGIN:VTIMEZONE
|
||||||
TZID:America/Adak
|
TZID:America/Adak
|
||||||
LAST-MODIFIED:20241008T100856Z
|
LAST-MODIFIED:20250324T091428Z
|
||||||
X-LIC-LOCATION:America/Adak
|
X-LIC-LOCATION:America/Adak
|
||||||
BEGIN:DAYLIGHT
|
BEGIN:DAYLIGHT
|
||||||
TZNAME:HDT
|
TZNAME:HDT
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ PRODID:-//Alinto//NONSGML IANA 2024b//EN
|
|||||||
VERSION:2.0
|
VERSION:2.0
|
||||||
BEGIN:VTIMEZONE
|
BEGIN:VTIMEZONE
|
||||||
TZID:America/Anchorage
|
TZID:America/Anchorage
|
||||||
LAST-MODIFIED:20241008T100856Z
|
LAST-MODIFIED:20250324T091428Z
|
||||||
X-LIC-LOCATION:America/Anchorage
|
X-LIC-LOCATION:America/Anchorage
|
||||||
BEGIN:DAYLIGHT
|
BEGIN:DAYLIGHT
|
||||||
TZNAME:AKDT
|
TZNAME:AKDT
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ PRODID:-//Alinto//NONSGML IANA 2024b//EN
|
|||||||
VERSION:2.0
|
VERSION:2.0
|
||||||
BEGIN:VTIMEZONE
|
BEGIN:VTIMEZONE
|
||||||
TZID:America/Araguaina
|
TZID:America/Araguaina
|
||||||
LAST-MODIFIED:20241008T100856Z
|
LAST-MODIFIED:20250324T091428Z
|
||||||
X-LIC-LOCATION:America/Araguaina
|
X-LIC-LOCATION:America/Araguaina
|
||||||
BEGIN:STANDARD
|
BEGIN:STANDARD
|
||||||
TZNAME:%z
|
TZNAME:%z
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ PRODID:-//Alinto//NONSGML IANA 2024b//EN
|
|||||||
VERSION:2.0
|
VERSION:2.0
|
||||||
BEGIN:VTIMEZONE
|
BEGIN:VTIMEZONE
|
||||||
TZID:America/Argentina/Buenos_Aires
|
TZID:America/Argentina/Buenos_Aires
|
||||||
LAST-MODIFIED:20241008T100856Z
|
LAST-MODIFIED:20250324T091428Z
|
||||||
X-LIC-LOCATION:America/Argentina/Buenos_Aires
|
X-LIC-LOCATION:America/Argentina/Buenos_Aires
|
||||||
BEGIN:STANDARD
|
BEGIN:STANDARD
|
||||||
TZNAME:%z
|
TZNAME:%z
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ PRODID:-//Alinto//NONSGML IANA 2024b//EN
|
|||||||
VERSION:2.0
|
VERSION:2.0
|
||||||
BEGIN:VTIMEZONE
|
BEGIN:VTIMEZONE
|
||||||
TZID:America/Argentina/Catamarca
|
TZID:America/Argentina/Catamarca
|
||||||
LAST-MODIFIED:20241008T100856Z
|
LAST-MODIFIED:20250324T091428Z
|
||||||
X-LIC-LOCATION:America/Argentina/Catamarca
|
X-LIC-LOCATION:America/Argentina/Catamarca
|
||||||
BEGIN:STANDARD
|
BEGIN:STANDARD
|
||||||
TZNAME:%z
|
TZNAME:%z
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ PRODID:-//Alinto//NONSGML IANA 2024b//EN
|
|||||||
VERSION:2.0
|
VERSION:2.0
|
||||||
BEGIN:VTIMEZONE
|
BEGIN:VTIMEZONE
|
||||||
TZID:America/Argentina/Cordoba
|
TZID:America/Argentina/Cordoba
|
||||||
LAST-MODIFIED:20241008T100856Z
|
LAST-MODIFIED:20250324T091428Z
|
||||||
X-LIC-LOCATION:America/Argentina/Cordoba
|
X-LIC-LOCATION:America/Argentina/Cordoba
|
||||||
BEGIN:STANDARD
|
BEGIN:STANDARD
|
||||||
TZNAME:%z
|
TZNAME:%z
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ PRODID:-//Alinto//NONSGML IANA 2024b//EN
|
|||||||
VERSION:2.0
|
VERSION:2.0
|
||||||
BEGIN:VTIMEZONE
|
BEGIN:VTIMEZONE
|
||||||
TZID:America/Argentina/Jujuy
|
TZID:America/Argentina/Jujuy
|
||||||
LAST-MODIFIED:20241008T100856Z
|
LAST-MODIFIED:20250324T091428Z
|
||||||
X-LIC-LOCATION:America/Argentina/Jujuy
|
X-LIC-LOCATION:America/Argentina/Jujuy
|
||||||
BEGIN:STANDARD
|
BEGIN:STANDARD
|
||||||
TZNAME:%z
|
TZNAME:%z
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ PRODID:-//Alinto//NONSGML IANA 2024b//EN
|
|||||||
VERSION:2.0
|
VERSION:2.0
|
||||||
BEGIN:VTIMEZONE
|
BEGIN:VTIMEZONE
|
||||||
TZID:America/Argentina/La_Rioja
|
TZID:America/Argentina/La_Rioja
|
||||||
LAST-MODIFIED:20241008T100856Z
|
LAST-MODIFIED:20250324T091428Z
|
||||||
X-LIC-LOCATION:America/Argentina/La_Rioja
|
X-LIC-LOCATION:America/Argentina/La_Rioja
|
||||||
BEGIN:STANDARD
|
BEGIN:STANDARD
|
||||||
TZNAME:%z
|
TZNAME:%z
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ PRODID:-//Alinto//NONSGML IANA 2024b//EN
|
|||||||
VERSION:2.0
|
VERSION:2.0
|
||||||
BEGIN:VTIMEZONE
|
BEGIN:VTIMEZONE
|
||||||
TZID:America/Argentina/Mendoza
|
TZID:America/Argentina/Mendoza
|
||||||
LAST-MODIFIED:20241008T100856Z
|
LAST-MODIFIED:20250324T091428Z
|
||||||
X-LIC-LOCATION:America/Argentina/Mendoza
|
X-LIC-LOCATION:America/Argentina/Mendoza
|
||||||
BEGIN:STANDARD
|
BEGIN:STANDARD
|
||||||
TZNAME:%z
|
TZNAME:%z
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ PRODID:-//Alinto//NONSGML IANA 2024b//EN
|
|||||||
VERSION:2.0
|
VERSION:2.0
|
||||||
BEGIN:VTIMEZONE
|
BEGIN:VTIMEZONE
|
||||||
TZID:America/Argentina/Rio_Gallegos
|
TZID:America/Argentina/Rio_Gallegos
|
||||||
LAST-MODIFIED:20241008T100856Z
|
LAST-MODIFIED:20250324T091428Z
|
||||||
X-LIC-LOCATION:America/Argentina/Rio_Gallegos
|
X-LIC-LOCATION:America/Argentina/Rio_Gallegos
|
||||||
BEGIN:STANDARD
|
BEGIN:STANDARD
|
||||||
TZNAME:%z
|
TZNAME:%z
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ PRODID:-//Alinto//NONSGML IANA 2024b//EN
|
|||||||
VERSION:2.0
|
VERSION:2.0
|
||||||
BEGIN:VTIMEZONE
|
BEGIN:VTIMEZONE
|
||||||
TZID:America/Argentina/Salta
|
TZID:America/Argentina/Salta
|
||||||
LAST-MODIFIED:20241008T100856Z
|
LAST-MODIFIED:20250324T091428Z
|
||||||
X-LIC-LOCATION:America/Argentina/Salta
|
X-LIC-LOCATION:America/Argentina/Salta
|
||||||
BEGIN:STANDARD
|
BEGIN:STANDARD
|
||||||
TZNAME:%z
|
TZNAME:%z
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ PRODID:-//Alinto//NONSGML IANA 2024b//EN
|
|||||||
VERSION:2.0
|
VERSION:2.0
|
||||||
BEGIN:VTIMEZONE
|
BEGIN:VTIMEZONE
|
||||||
TZID:America/Argentina/San_Juan
|
TZID:America/Argentina/San_Juan
|
||||||
LAST-MODIFIED:20241008T100856Z
|
LAST-MODIFIED:20250324T091428Z
|
||||||
X-LIC-LOCATION:America/Argentina/San_Juan
|
X-LIC-LOCATION:America/Argentina/San_Juan
|
||||||
BEGIN:STANDARD
|
BEGIN:STANDARD
|
||||||
TZNAME:%z
|
TZNAME:%z
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ PRODID:-//Alinto//NONSGML IANA 2024b//EN
|
|||||||
VERSION:2.0
|
VERSION:2.0
|
||||||
BEGIN:VTIMEZONE
|
BEGIN:VTIMEZONE
|
||||||
TZID:America/Argentina/San_Luis
|
TZID:America/Argentina/San_Luis
|
||||||
LAST-MODIFIED:20241008T100856Z
|
LAST-MODIFIED:20250324T091428Z
|
||||||
X-LIC-LOCATION:America/Argentina/San_Luis
|
X-LIC-LOCATION:America/Argentina/San_Luis
|
||||||
BEGIN:STANDARD
|
BEGIN:STANDARD
|
||||||
TZNAME:%z
|
TZNAME:%z
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ PRODID:-//Alinto//NONSGML IANA 2024b//EN
|
|||||||
VERSION:2.0
|
VERSION:2.0
|
||||||
BEGIN:VTIMEZONE
|
BEGIN:VTIMEZONE
|
||||||
TZID:America/Argentina/Tucuman
|
TZID:America/Argentina/Tucuman
|
||||||
LAST-MODIFIED:20241008T100856Z
|
LAST-MODIFIED:20250324T091428Z
|
||||||
X-LIC-LOCATION:America/Argentina/Tucuman
|
X-LIC-LOCATION:America/Argentina/Tucuman
|
||||||
BEGIN:STANDARD
|
BEGIN:STANDARD
|
||||||
TZNAME:%z
|
TZNAME:%z
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ PRODID:-//Alinto//NONSGML IANA 2024b//EN
|
|||||||
VERSION:2.0
|
VERSION:2.0
|
||||||
BEGIN:VTIMEZONE
|
BEGIN:VTIMEZONE
|
||||||
TZID:America/Argentina/Ushuaia
|
TZID:America/Argentina/Ushuaia
|
||||||
LAST-MODIFIED:20241008T100856Z
|
LAST-MODIFIED:20250324T091428Z
|
||||||
X-LIC-LOCATION:America/Argentina/Ushuaia
|
X-LIC-LOCATION:America/Argentina/Ushuaia
|
||||||
BEGIN:STANDARD
|
BEGIN:STANDARD
|
||||||
TZNAME:%z
|
TZNAME:%z
|
||||||
|
|||||||
@@ -3,21 +3,13 @@ PRODID:-//Alinto//NONSGML IANA 2024b//EN
|
|||||||
VERSION:2.0
|
VERSION:2.0
|
||||||
BEGIN:VTIMEZONE
|
BEGIN:VTIMEZONE
|
||||||
TZID:America/Asuncion
|
TZID:America/Asuncion
|
||||||
LAST-MODIFIED:20241008T100856Z
|
LAST-MODIFIED:20250324T091428Z
|
||||||
X-LIC-LOCATION:America/Asuncion
|
X-LIC-LOCATION:America/Asuncion
|
||||||
BEGIN:DAYLIGHT
|
|
||||||
TZNAME:%z
|
|
||||||
TZOFFSETFROM:-0400
|
|
||||||
TZOFFSETTO:-0300
|
|
||||||
DTSTART:19701004T000000
|
|
||||||
RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=1SU
|
|
||||||
END:DAYLIGHT
|
|
||||||
BEGIN:STANDARD
|
BEGIN:STANDARD
|
||||||
TZNAME:%z
|
TZNAME:%z
|
||||||
TZOFFSETFROM:-0300
|
TZOFFSETFROM:-0300
|
||||||
TZOFFSETTO:-0400
|
TZOFFSETTO:-0300
|
||||||
DTSTART:19700322T000000
|
DTSTART:19700101T000000
|
||||||
RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=4SU
|
|
||||||
END:STANDARD
|
END:STANDARD
|
||||||
END:VTIMEZONE
|
END:VTIMEZONE
|
||||||
END:VCALENDAR
|
END:VCALENDAR
|
||||||
@@ -3,7 +3,7 @@ PRODID:-//Alinto//NONSGML IANA 2024b//EN
|
|||||||
VERSION:2.0
|
VERSION:2.0
|
||||||
BEGIN:VTIMEZONE
|
BEGIN:VTIMEZONE
|
||||||
TZID:America/Bahia
|
TZID:America/Bahia
|
||||||
LAST-MODIFIED:20241008T100856Z
|
LAST-MODIFIED:20250324T091428Z
|
||||||
X-LIC-LOCATION:America/Bahia
|
X-LIC-LOCATION:America/Bahia
|
||||||
BEGIN:STANDARD
|
BEGIN:STANDARD
|
||||||
TZNAME:%z
|
TZNAME:%z
|
||||||
|
|||||||
Loaded 100 of 705 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user