Compare commits
456
Commits
feature-gdpr
...
fix_pkg
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
bb42f1fd07 | ||
|
|
bc6b849d66 | ||
|
|
51f1521dba | ||
|
|
516606baff | ||
|
|
a782424a30 | ||
|
|
f53d7b73db | ||
|
|
8766b7c6b3 | ||
|
|
8a907737de | ||
|
|
1a6f2825b6 | ||
|
|
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 | ||
|
|
5cba10ccff | ||
|
|
b48704e7ff | ||
|
|
69116d8eb7 | ||
|
|
d15f0ee804 | ||
|
|
a1e8a5c4af | ||
|
|
02dd5c3501 | ||
|
|
7a7f85d1a7 | ||
|
|
6d4016dfdb | ||
|
|
e06a0d2035 | ||
|
|
f8ff98b657 | ||
|
|
512f14f6d0 | ||
|
|
9f4f48a44f | ||
|
|
092e7694e0 | ||
|
|
42c227beca | ||
|
|
c400f45ef1 | ||
|
|
78655ae127 | ||
|
|
29e00f3e9e | ||
|
|
beb0d9cb1b | ||
|
|
5c1278a895 | ||
|
|
616c9291e0 | ||
|
|
9941e2a04b | ||
|
|
b40d777a86 | ||
|
|
70f72eb92f | ||
|
|
0a828a739e | ||
|
|
395a01ed52 | ||
|
|
c05b331ac0 | ||
|
|
da32b3f86d | ||
|
|
a09720cf22 | ||
|
|
0364f7f2a4 | ||
|
|
00082eb0bc | ||
|
|
178b1a3a0e | ||
|
|
9ffa72ee9b | ||
|
|
169a0c6125 | ||
|
|
c7b0133000 | ||
|
|
2f9c2cf4da | ||
|
|
57db6b5f91 | ||
|
|
f65ab9b43a | ||
|
|
2258d5cd60 | ||
|
|
ea427ea41a | ||
|
|
ce86d14826 | ||
|
|
7f7c743976 | ||
|
|
6f86506b28 | ||
|
|
e44bc1fc91 | ||
|
|
c90e2b0501 | ||
|
|
cd0324dd49 | ||
|
|
581b2c1912 | ||
|
|
9a9d968756 | ||
|
|
fe003eeef5 | ||
|
|
a09f4d8f49 | ||
|
|
617c1bbc64 | ||
|
|
5bab72726a | ||
|
|
01863987dd | ||
|
|
f1257088f2 | ||
|
|
1c611a0a4a | ||
|
|
f2ba6870d5 | ||
|
|
253d14cfce | ||
|
|
b3c77a0e00 | ||
|
|
cba0c6d420 | ||
|
|
1d8ee80c39 | ||
|
|
04a9a8773d | ||
|
|
a466628126 | ||
|
|
60b59ae1bc | ||
|
|
8ff2c962ab | ||
|
|
ffe4f9406b | ||
|
|
592f35bbec | ||
|
|
1d3b502bc7 | ||
|
|
80a76895dd | ||
|
|
78ea981e7f | ||
|
|
a4de35748b | ||
|
|
41aecca692 | ||
|
|
190c2c86ed | ||
|
|
56598d1e37 | ||
|
|
4ee6d5af9d | ||
|
|
594b0249c3 | ||
|
|
64f17880c7 | ||
|
|
59d48cb382 | ||
|
|
2da4aa8cb8 | ||
|
|
1c20c1ead3 | ||
|
|
a7023bce16 | ||
|
|
84fe91c29c | ||
|
|
68f4fc1343 | ||
|
|
2a1744998c | ||
|
|
196e10f44c | ||
|
|
01607b151d | ||
|
|
0cbd082c1d | ||
|
|
41a0f8d9af | ||
|
|
2dd10970a4 | ||
|
|
2f75a7fb1b | ||
|
|
c1e4dc5a0e | ||
|
|
fa2caf9026 | ||
|
|
f42f94da84 | ||
|
|
1f6bbc1044 | ||
|
|
a24d59dfaf | ||
|
|
91a249009b | ||
|
|
16f371dba7 | ||
|
|
86446a059c | ||
|
|
160a464d63 | ||
|
|
17d85f84f7 | ||
|
|
b602b2b188 | ||
|
|
fad8c21473 | ||
|
|
6537d961e1 | ||
|
|
56012c65e1 | ||
|
|
dd1a6607fe | ||
|
|
94d32c419c | ||
|
|
7b7cfdb499 | ||
|
|
a4f03978cf | ||
|
|
7de9dc8f9b | ||
|
|
33df476db5 | ||
|
|
b889064dbc | ||
|
|
9a0e03bf9a | ||
|
|
84c0fb496d | ||
|
|
65f29f21dc | ||
|
|
8d4597d361 | ||
|
|
5bb025323f | ||
|
|
a84ab7655d | ||
|
|
88c9074aea | ||
|
|
c4b58a6ae7 | ||
|
|
0c2c9d7682 | ||
|
|
227b92b743 | ||
|
|
de289d9b4c | ||
|
|
2fabfdfb9f | ||
|
|
b82fa1d077 | ||
|
|
8bf1a77efc | ||
|
|
37f2b1dc5c | ||
|
|
ed3e790b47 | ||
|
|
85c1cc7fa3 | ||
|
|
fa2312470a | ||
|
|
1136c18288 | ||
|
|
0e5657e635 | ||
|
|
ca0b00107a | ||
|
|
be6a69a4d6 | ||
|
|
0b530f9e36 | ||
|
|
55563d2113 | ||
|
|
1aa59dcd7e | ||
|
|
943e96f459 | ||
|
|
6b6dc6b3b8 | ||
|
|
bcb2410b12 | ||
|
|
af630f033d | ||
|
|
6e11cdf289 | ||
|
|
68b17a5c4a | ||
|
|
5ee190468e | ||
|
|
b8f2e00306 | ||
|
|
990f1e8e8f | ||
|
|
58db9c980e | ||
|
|
980b5e28dd | ||
|
|
eb63e6d047 | ||
|
|
59e76d6b26 | ||
|
|
99da6e0f81 | ||
|
|
9d71be9c45 | ||
|
|
ef88039a4a | ||
|
|
a06331eb86 | ||
|
|
ed951667ec | ||
|
|
f621d97289 | ||
|
|
1aa7d81a87 | ||
|
|
0cbcad9d91 | ||
|
|
43388ac42c | ||
|
|
eee160e5bf | ||
|
|
2637434436 | ||
|
|
4b343f7070 | ||
|
|
591d283425 | ||
|
|
f96eb4d3ca | ||
|
|
0168ca56b2 | ||
|
|
703f0ff1b6 | ||
|
|
c5582ba819 | ||
|
|
2dd45dfb93 | ||
|
|
67e1a50c80 | ||
|
|
cbb0e85a19 | ||
|
|
2756176503 | ||
|
|
1a47fdb7d6 | ||
|
|
910effd664 | ||
|
|
7ec7a7d6ae | ||
|
|
53d77f3105 | ||
|
|
45fd999010 | ||
|
|
31c0473c48 | ||
|
|
ebca25ca62 | ||
|
|
6b514bb159 | ||
|
|
314b39dd1c | ||
|
|
6ac8525bfe | ||
|
|
9eb8039698 | ||
|
|
863280d6ac | ||
|
|
19ee54fe05 | ||
|
|
229596da2b | ||
|
|
c2d9050539 | ||
|
|
9b5a8cb6fc | ||
|
|
2e2e36e0a2 | ||
|
|
880eb89719 | ||
|
|
5830053026 | ||
|
|
f815848a86 | ||
|
|
f8c354c302 | ||
|
|
d9ee884459 | ||
|
|
526aa281d9 | ||
|
|
49e9988b82 | ||
|
|
20678b43ad | ||
|
|
d4046673ee | ||
|
|
2f4c125bdd | ||
|
|
98e00d09a3 | ||
|
|
a9e02d94a2 | ||
|
|
2e37e59ed1 | ||
|
|
ae01ed077d | ||
|
|
cb55413e91 | ||
|
|
0fafda55d6 | ||
|
|
bc804ae823 | ||
|
|
127df39689 | ||
|
|
711403f024 | ||
|
|
049a569d7f | ||
|
|
e6ff9a408d | ||
|
|
06ea167ee5 | ||
|
|
7c0699b96f | ||
|
|
adf1117046 | ||
|
|
5215aa4f41 | ||
|
|
599c40b9f6 | ||
|
|
e39c104436 | ||
|
|
7b233422f5 | ||
|
|
0cfaa7740a | ||
|
|
65ab6962d8 | ||
|
|
96331cac90 | ||
|
|
815a87de0b | ||
|
|
e4cb0a35ef | ||
|
|
f609c31a32 | ||
|
|
f51c756cda | ||
|
|
dd965baae1 | ||
|
|
1719baea7a | ||
|
|
e131cd7961 | ||
|
|
b7a71140f2 | ||
|
|
2b23ff3eb8 | ||
|
|
cc061582f4 | ||
|
|
185770a35e | ||
|
|
fd9b8dcfcd | ||
|
|
8267b5afd3 | ||
|
|
e92fb8f52d | ||
|
|
b8a6d576e1 | ||
|
|
4dba56f70d | ||
|
|
776a798e17 | ||
|
|
09a97b199f | ||
|
|
d9c36c6985 | ||
|
|
5ff1f5396c | ||
|
|
092bc9a120 | ||
|
|
ca1d5495ab | ||
|
|
34407df4f7 | ||
|
|
2b1e7bdb67 | ||
|
|
c93b1e9775 | ||
|
|
30f819e2a4 | ||
|
|
7582266479 | ||
|
|
24888b23d5 | ||
|
|
2db48dc7fb | ||
|
|
91c22c0800 | ||
|
|
5146d9d215 | ||
|
|
0f0ecf7521 | ||
|
|
c827880f2a | ||
|
|
26719a1461 | ||
|
|
add792fc1e | ||
|
|
ee55f7a64f | ||
|
|
71e66d65b8 | ||
|
|
adf2d409ba | ||
|
|
ab8c236621 | ||
|
|
74a730d094 | ||
|
|
adc17a3639 | ||
|
|
a75bfbb2c7 | ||
|
|
e924ac4e67 | ||
|
|
c3cefb6ae8 | ||
|
|
ae85548f27 | ||
|
|
8581aa7840 | ||
|
|
82db4d99d4 | ||
|
|
28f446a6ad | ||
|
|
ef29aa2bab | ||
|
|
62d5414936 | ||
|
|
ce8c697d96 | ||
|
|
ad75555a0f | ||
|
|
c8eee39017 | ||
|
|
af22a30f12 | ||
|
|
c5b6611f89 | ||
|
|
7e78781044 | ||
|
|
31eb7987d8 | ||
|
|
344d4da930 | ||
|
|
65d31f2b14 | ||
|
|
434be9ea71 | ||
|
|
ace1515dfc | ||
|
|
c2fc80ecd1 | ||
|
|
1206d2f459 | ||
|
|
083fa1fefd | ||
|
|
6d9647e353 | ||
|
|
4337e875eb | ||
|
|
2aec2ec7b0 | ||
|
|
6aab869b81 | ||
|
|
3acab3f896 | ||
|
|
889fe1eb39 | ||
|
|
31a66c461a | ||
|
|
fc778295ff | ||
|
|
42511d666f | ||
|
|
5197b9bd0b | ||
|
|
26f05a693c | ||
|
|
a6319e1689 | ||
|
|
311c358580 | ||
|
|
adc2d74e54 | ||
|
|
f5cd67972b | ||
|
|
5081de1639 | ||
|
|
d46a436cc4 | ||
|
|
dde154df3f | ||
|
|
7ace9c2c22 | ||
|
|
9898e5210f | ||
|
|
ff3c3054a6 | ||
|
|
f56910db1e | ||
|
|
ce0e650c62 | ||
|
|
1361341545 | ||
|
|
04596c9f4e | ||
|
|
9e37d212b9 | ||
|
|
e6bfab7ee1 | ||
|
|
f0010afef4 | ||
|
|
59bd290d62 | ||
|
|
63248772c1 | ||
|
|
455fe97cbe | ||
|
|
f43974bbb7 | ||
|
|
fc0f5d9d98 | ||
|
|
2146870071 | ||
|
|
2e7a7a97cc | ||
|
|
49b0316b9e | ||
|
|
569cf8e0ae | ||
|
|
5710c4d97e | ||
|
|
9560bdcf0c | ||
|
|
eee50697b0 | ||
|
|
0d0eda2698 | ||
|
|
9e3e3b2291 | ||
|
|
a6fc83c35b | ||
|
|
7104ae6d23 | ||
|
|
25c72a523e | ||
|
|
fb3a159cf7 | ||
|
|
e81fdadecc | ||
|
|
f27b33a0c8 | ||
|
|
68398d2086 | ||
|
|
930a06e520 | ||
|
|
26b14671f5 | ||
|
|
153f444c3f | ||
|
|
fec99c95db | ||
|
|
00d69560ba | ||
|
|
5ad1d9d9c3 | ||
|
|
8dc69efd70 | ||
|
|
2748d1dd08 | ||
|
|
99f87a26dc | ||
|
|
acd4a1f4aa | ||
|
|
f04c73d495 | ||
|
|
5c944617d0 |
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
|
||||
```
|
||||
+12
-12
@@ -3,7 +3,7 @@
|
||||
## Reporting Bugs and Suggesting Enhancements
|
||||
|
||||
If you encounter a possible bug with SOGo, you can access our
|
||||
[bug tracking system](https://sogo.nu/bugs/).
|
||||
[bug tracking system](https://bugs.sogo.nu/).
|
||||
|
||||
Please make sure to respect the following guidelines when reporting a bug:
|
||||
|
||||
@@ -19,25 +19,25 @@ Begin by reading [SOGo Developer's Guide](../Documentation/SOGoDevelopersGuide.a
|
||||
### Translations
|
||||
|
||||
Three type of files must be translated. The first type are **Localizable.strings**; they can be
|
||||
translated online using **[Transifex](https://www.transifex.com/inverse/sogo/)**. To use Transifex,
|
||||
translated online using **[Transifex](https://www.transifex.com/alinto/sogo/)**. To use Transifex,
|
||||
you must first sign up for a [free account](https://www.transifex.com/signup/). Once registered,
|
||||
[request a new team](https://www.transifex.com/inverse/teams/) for your language. Once authorized,
|
||||
[request a new team](https://www.transifex.com/alinto/teams/) for your language. Once authorized,
|
||||
you'll be able to start/continue translating SOGo in your language.
|
||||
|
||||
The second type are **wox and html templates**. Only words outside the tags (<>) must be
|
||||
translated. Start by duplicating the English templates:
|
||||
|
||||
* [UI/Templates/SOGoACLEnglishAdditionAdvisory.wox](https://raw.githubusercontent.com/inverse-inc/sogo/master/UI/Templates/SOGoACLEnglishAdditionAdvisory.wox)
|
||||
* [UI/Templates/SOGoACLEnglishRemovalAdvisory.wox](https://raw.githubusercontent.com/inverse-inc/sogo/master/UI/Templates/SOGoACLEnglishRemovalAdvisory.wox)
|
||||
* [UI/Templates/SOGoACLEnglishModificationAdvisory.wox](https://raw.githubusercontent.com/inverse-inc/sogo/master/UI/Templates/SOGoACLEnglishModificationAdvisory.wox)
|
||||
* [UI/Templates/SOGoFolderEnglishAdditionAdvisory.wox](https://raw.githubusercontent.com/inverse-inc/sogo/master/UI/Templates/SOGoFolderEnglishAdditionAdvisory.wox)
|
||||
* [UI/Templates/SOGoFolderEnglishRemovalAdvisory.wox](https://raw.githubusercontent.com/inverse-inc/sogo/master/UI/Templates/SOGoFolderEnglishRemovalAdvisory.wox)
|
||||
* [SoObjects/Mailer/SOGoMailEnglishForward.wo/SOGoMailEnglishForward.html](https://raw.githubusercontent.com/inverse-inc/sogo/master/SoObjects/Mailer/SOGoMailEnglishForward.wo/SOGoMailEnglishForward.html)
|
||||
* [SoObjects/Mailer/SOGoMailEnglishReply.wo/SOGoMailEnglishReply.html](https://raw.githubusercontent.com/inverse-inc/sogo/master/SoObjects/Mailer/SOGoMailEnglishReply.wo/SOGoMailEnglishReply.html)
|
||||
* [UI/Templates/SOGoACLEnglishAdditionAdvisory.wox](https://raw.githubusercontent.com/alinto/sogo/master/UI/Templates/SOGoACLEnglishAdditionAdvisory.wox)
|
||||
* [UI/Templates/SOGoACLEnglishRemovalAdvisory.wox](https://raw.githubusercontent.com/alinto/sogo/master/UI/Templates/SOGoACLEnglishRemovalAdvisory.wox)
|
||||
* [UI/Templates/SOGoACLEnglishModificationAdvisory.wox](https://raw.githubusercontent.com/alinto/sogo/master/UI/Templates/SOGoACLEnglishModificationAdvisory.wox)
|
||||
* [UI/Templates/SOGoFolderEnglishAdditionAdvisory.wox](https://raw.githubusercontent.com/alinto/sogo/master/UI/Templates/SOGoFolderEnglishAdditionAdvisory.wox)
|
||||
* [UI/Templates/SOGoFolderEnglishRemovalAdvisory.wox](https://raw.githubusercontent.com/alinto/sogo/master/UI/Templates/SOGoFolderEnglishRemovalAdvisory.wox)
|
||||
* [SoObjects/Mailer/SOGoMailEnglishForward.wo/SOGoMailEnglishForward.html](https://raw.githubusercontent.com/alinto/sogo/master/SoObjects/Mailer/SOGoMailEnglishForward.wo/SOGoMailEnglishForward.html)
|
||||
* [SoObjects/Mailer/SOGoMailEnglishReply.wo/SOGoMailEnglishReply.html](https://raw.githubusercontent.com/alinto/sogo/master/SoObjects/Mailer/SOGoMailEnglishReply.wo/SOGoMailEnglishReply.html)
|
||||
|
||||
The third type is the locale file formatted as a **plist**. Duplicate the English locale. Beware that words with other characters than [a-zA-Z] (accents, non-latin...) must be between double quotes ("). You can look at other files as arabic or french to have an example:
|
||||
|
||||
* [UI/MainUI/English.lproj/Locale](https://raw.githubusercontent.com/inverse-inc/sogo/master/UI/MainUI/English.lproj/Locale)
|
||||
* [UI/MainUI/English.lproj/Locale](https://raw.githubusercontent.com/alinto/sogo/master/UI/MainUI/English.lproj/Locale)
|
||||
|
||||
Once translated, create an archive with all the files and [contact
|
||||
us](https://sogo.nu/support.html#/commercial). We'll integrate it in the next version of SOGo.
|
||||
@@ -107,7 +107,7 @@ The body should include the motivation for the change and contrast this with pre
|
||||
|
||||
#### Footer
|
||||
The footer should contain any information about **Breaking Changes** and is also the
|
||||
place to reference [Mantis](https://sogo.nu/bugs/) issues that this commit **Fixes** or **Resolves**.
|
||||
place to reference [Mantis](https://bugs.sogo.nu) issues that this commit **Fixes** or **Resolves**.
|
||||
|
||||
> Breaking Changes are intended to be highlighted in the CHANGELOG as changes that will require
|
||||
> community users to modify their code after updating to a version that contains this commit.
|
||||
|
||||
+4
-1
@@ -10,6 +10,7 @@
|
||||
*/obj/
|
||||
.scss-lint-config.yml_
|
||||
ActiveSync/ActiveSync.SOGo
|
||||
API/API.SOGo
|
||||
Documentation/*.docbook
|
||||
Documentation/*.pdf
|
||||
Documentation/*.html
|
||||
@@ -55,4 +56,6 @@ Tests/results.xml
|
||||
Tests/results
|
||||
|
||||
# SAML2 autogenerated files
|
||||
SoObjects/SOGo/SOGoSAML2Exceptions.*
|
||||
SoObjects/SOGo/SOGoSAML2Exceptions.*
|
||||
|
||||
node_modules
|
||||
+1
-1
@@ -1,3 +1,3 @@
|
||||
[submodule "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,110 @@
|
||||
/*
|
||||
Copyright (C) todo...
|
||||
*/
|
||||
|
||||
#import <SOGoAPIUserFolder.h>
|
||||
|
||||
#import <GDLContentStore/GCSFolderManager.h>
|
||||
#import <GDLContentStore/GCSFolder.h>
|
||||
|
||||
@implementation SOGoAPIUserFolder
|
||||
|
||||
- (id) init
|
||||
{
|
||||
[super init];
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
- (void) dealloc
|
||||
{
|
||||
[super dealloc];
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
|
||||
|
||||
{
|
||||
"calendar":[
|
||||
{
|
||||
"name":"DidyShared",
|
||||
"url":"http://127.0.0.1/SOGo/dav/sogo-tests1@example.org/Calendar/12509-67F67D00-1-3105AF40"
|
||||
},
|
||||
{
|
||||
"name":"LocalDidy",
|
||||
"url":"http://127.0.0.1/SOGo/dav/sogo-tests1@example.org/Calendar/1BC38-67B60000-1-6E4B6880"
|
||||
},
|
||||
{
|
||||
"name":"Personal Calendar",
|
||||
"url":"http://127.0.0.1/SOGo/dav/sogo-tests1@example.org/Calendar/personal"
|
||||
}
|
||||
],
|
||||
"username":"sogo-tests1@example.org",
|
||||
"contact":[
|
||||
{
|
||||
"name":"Personal Address Book",
|
||||
"url":"http://127.0.0.1/SOGo/dav/sogo-tests1@example.org/Contacts/personal"
|
||||
}
|
||||
]
|
||||
}
|
||||
**/
|
||||
|
||||
- (NSDictionary *) action: (WOContext*) ctx withParam: (NSDictionary *) param
|
||||
{
|
||||
NSDictionary* result;
|
||||
NSArray *folders;
|
||||
NSMutableArray *cardavLinks, *caldavLinks;
|
||||
NSString *serverUrl, *basePath, *c_uid, *url;
|
||||
GCSFolderManager *fm;
|
||||
GCSFolder *folder;
|
||||
|
||||
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 listSubFoldersAndNamesAtPath: 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++)
|
||||
{
|
||||
NSMutableDictionary *folderRet;
|
||||
folderRet = [NSMutableDictionary dictionary];
|
||||
folder = [folders objectAtIndex: i];
|
||||
url = [NSString stringWithFormat: @"%@/SOGo/dav/%@/%@", serverUrl, c_uid, [folder objectForKey: @"path"]];
|
||||
[folderRet setObject: url forKey: @"url"];
|
||||
[folderRet setObject: [folder objectForKey: @"name"] forKey: @"name"];
|
||||
if([url rangeOfString:@"/Calendar/"].location == NSNotFound)
|
||||
{
|
||||
//Contacts
|
||||
[cardavLinks addObject: folderRet];
|
||||
}
|
||||
else
|
||||
{
|
||||
//Calendar
|
||||
[caldavLinks addObject: folderRet];
|
||||
}
|
||||
}
|
||||
|
||||
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";
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
}
|
||||
@@ -34,7 +34,7 @@ ActiveSync_RESOURCE_FILES += \
|
||||
ADDITIONAL_OBJCFLAGS += -Wno-deprecated-declarations
|
||||
ADDITIONAL_INCLUDE_DIRS += -I../SOPE/ -I../SoObjects/
|
||||
ADDITIONAL_LIB_DIRS += -L../SOPE/GDLContentStore/obj/ -L../SOPE/NGCards/obj/
|
||||
ADDITIONAL_INCLUDE_DIRS += -I/usr/include/libwbxml-1.0/
|
||||
ADDITIONAL_INCLUDE_DIRS += $(shell pkg-config --cflags libwbxml2)
|
||||
ADDITIONAL_LDFLAGS += -Wl,--no-as-needed -lwbxml2
|
||||
|
||||
-include GNUmakefile.preamble
|
||||
|
||||
+401
@@ -2,6 +2,407 @@
|
||||
|
||||
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)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **mail:** modify the message-id to not start by XX- that trigger a native spamassassin rule ([1d8ee80](https://github.com/Alinto/sogo/commit/1d8ee80c394382d26e50457cda9f9292b0f4f63b))
|
||||
* **security:** fix a security issue introduced in 5.11.1 with parameter SOGoForbidUnknownDomainsAuth ([04a9a87](https://github.com/Alinto/sogo/commit/04a9a8773dfb30dcc86c6146eed175a9a115f6b2))
|
||||
|
||||
## [5.11.1](https://github.com/Alinto/sogo/compare/SOGo-5.11.0...SOGo-5.11.1) (2024-10-08)
|
||||
|
||||
|
||||
### Enhancements
|
||||
|
||||
* **login:** add parameters to prevent uneccesary connection request when the domain is unknown ([56598d1](https://github.com/Alinto/sogo/commit/56598d1e3777265ebb09fa19e7a719f673aaee40))
|
||||
* **sieve:** add from on notificatons ([1c20c1e](https://github.com/Alinto/sogo/commit/1c20c1ead3094ca109a5334fdf33726a0e638365))
|
||||
* **build:** Use pkgconfig to compute cflags for wbxml2 instead of hardcoding them. Thanks to [jmallach](https://github.com/jmallach)
|
||||
|
||||
### Regression Fixes
|
||||
* **calendar:** Fix regression on repeat task ([2a17449](https://github.com/Alinto/sogo/commit/2a1744998c0023f3cbaddd6ee90275ee1baf6cc3))
|
||||
* **mail:** Add an option in Preferences to display full email instead of name alone in mailboxes. Fix issue caused by advanced search. ([fa2caf9](https://github.com/Alinto/sogo/commit/fa2caf902666367e247850ce9da82737b5ec6bbb))
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **calendar:** Fix all day recurring event displayed on 2 days when a DST change occurs at the endDate ([2f75a7f](https://github.com/Alinto/sogo/commit/2f75a7fb1b57cbb4d98ec1596fe5b3d98cdd0934))
|
||||
* **ckeditor5:** prevent ckeditor5 to preview media ([2dd1097](https://github.com/Alinto/sogo/commit/2dd10970a4e0cbe8f2e8a9c0241d139d4ce006fa))
|
||||
* **mail:** Fix assertion when there is an empty image in the mail. Fixes [#6035](https://bugs.sogo.nu/view.php?id=6035). ([59d48cb](https://github.com/Alinto/sogo/commit/59d48cb38285ab019013972baa3e5269b6188a5e))
|
||||
* **mail:** Fix highlighsearch html rendering on subject ([0cbd082](https://github.com/Alinto/sogo/commit/0cbd082c1d48c70d87e58a8bb8ae05183676e2a1))
|
||||
* **mail:** Fix HTML mail rendering issue ([41a0f8d](https://github.com/Alinto/sogo/commit/41a0f8d9afc3a9d29f26c4109620252a82002ae4))
|
||||
* **mail:** Fix issue where mailto: links are badly formatted when html composing ([86446a0](https://github.com/Alinto/sogo/commit/86446a059ce70adf103c27768040e52087000812))
|
||||
* **mail:** Fix issue where unread counter is invalid when whanging folder. Fixes [#6001](https://bugs.sogo.nu/view.php?id=6001). ([1f6bbc1](https://github.com/Alinto/sogo/commit/1f6bbc1044e8c4f715b96b1b95bfb0eef888e7a3) [91a2490](https://github.com/Alinto/sogo/commit/91a249009b4a700b0a2b335450b32a73985b8dd1))
|
||||
* **mail:** improve algo to fetch imap folders for mail view ([68f4fc1](https://github.com/Alinto/sogo/commit/68f4fc134312bc28031e2be0167c117f67c6f0b8))
|
||||
* **security:** Prevent user to add html script in its preferences ([a7023bc](https://github.com/Alinto/sogo/commit/a7023bce1642ec1fd25fe68f0541407d78f321a0))
|
||||
* **sogo-tool:** prevent a bug when restoring two events with same id ([84fe91c](https://github.com/Alinto/sogo/commit/84fe91c29c24440980df4311d0ae0835337f1ec4))
|
||||
* **tests:** Add timeout on all async tests ([64f1788](https://github.com/Alinto/sogo/commit/64f17880c739e9feef8ce69ed221d83586b773a1))
|
||||
|
||||
|
||||
### Localization
|
||||
|
||||
* **de:** Update German translations ([592f35b](https://github.com/Alinto/sogo/commit/592f35bbec2823e72f1790c8b629c485f3e5500d))
|
||||
* **pt_BR:** Update BrazilianPortuguese translations ([1d3b502](https://github.com/Alinto/sogo/commit/1d3b502bc78f50c9038027036036c6d37d7fe340))
|
||||
* **pt:** Update Portuguese translations ([a4de357](https://github.com/Alinto/sogo/commit/a4de35748babced2f385046d97055fec8d80e667))
|
||||
* **ru:** Update Russian translations ([78ea981](https://github.com/Alinto/sogo/commit/78ea981e7f4254a8353e276c309fe54443bdd090))
|
||||
* **tr_TR:** Update TurkishTurkey translations ([41aecca](https://github.com/Alinto/sogo/commit/41aecca692f93134c6dd0d535ed7479182f7fd23))
|
||||
* **uk:** Update Ukrainian translations ([80a7689](https://github.com/Alinto/sogo/commit/80a76895dd59402e884d0226f59bd8edd7e8a9c1))
|
||||
|
||||
## [5.11.0](https://github.com/Alinto/sogo/compare/SOGo-5.10.0...SOGo-5.11.0) (2024-08-07)
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* **core:** Add MySQL/MariaDB SSL connection support ([0168ca5](https://github.com/Alinto/sogo/commit/0168ca56b2e5f51ac98be2a78ddfcea4a688b74f))
|
||||
* **core:** Update to ckeditor 5 ([0cfaa77](https://github.com/Alinto/sogo/commit/0cfaa7740af509389e43c395649ea82a3fb432be) [e92fb8f](https://github.com/Alinto/sogo/commit/e92fb8f52d615b72a6945760aecdf95039e1cbf2) [b7a7114](https://github.com/Alinto/sogo/commit/b7a71140f2b3eefb494a3acc151fe556ce1d3ce4) [a9e02d9](https://github.com/Alinto/sogo/commit/a9e02d94a26cd30c9e56196a1ec24ddec0c4db9c) [98e00d0](https://github.com/Alinto/sogo/commit/98e00d09a3e31b388592e2d1068d89bc57ff1d99) [2b23ff3](https://github.com/Alinto/sogo/commit/2b23ff3eb8dac6acc570b1aaa6e0baff72dd17ea) [65ab696](https://github.com/Alinto/sogo/commit/65ab6962d870baeba7cb4b3c1b66eb6447174e1b) [dd965ba](https://github.com/Alinto/sogo/commit/dd965baae110176c6144ccd64cbade3ef757966a))
|
||||
* **mail:** Improve mail search (advanced search) ([ed95166](https://github.com/Alinto/sogo/commit/ed951667ec610b8ad48a49a606b6b1c33c60914d) [f621d97](https://github.com/Alinto/sogo/commit/f621d972893c94977cda432efe3dcc837ec8bf58) [0cbcad9](https://github.com/Alinto/sogo/commit/0cbcad9d91cd52afcfd14034786457a106013182) [9eb8039](https://github.com/Alinto/sogo/commit/9eb80396988bd7c8ac3a1f44dbc48147ced20750))
|
||||
|
||||
|
||||
### Enhancements
|
||||
|
||||
* **calendar:** Add option to disable email appointmoint notifications when using caldav ([2637434](https://github.com/Alinto/sogo/commit/2637434436c19157ce6255fb071dcb99cf57ad89))
|
||||
* **mail:** Add 'View raw message' mail contextual option. This option open message in a popup without HTML mail CSS content modification. ([6ac8525](https://github.com/Alinto/sogo/commit/6ac8525bfe161409c0565e3dca1e9e92f87c1c08))
|
||||
* **mail:** Add location in email ics representation template ([591d283](https://github.com/Alinto/sogo/commit/591d2834252441a9593f27012f7b148d38b9a511))
|
||||
* **mail:** add options to not add X-Foward header in mail ([96331ca](https://github.com/Alinto/sogo/commit/96331cac905ee7b6dc1adfda083dcefffe0f8795))
|
||||
* **ytnef:** add possibility to add event to calendar from winmail.dat ([f609c31](https://github.com/Alinto/sogo/commit/f609c31a324683dd4c210284f672618cfffb9908))
|
||||
* **calendar:** Optimization of date computation when handle attendees. Report of 77b2d9f8. ([53d77f3](https://github.com/Alinto/sogo/commit/53d77f3105c2d7f6aa2be1cac691dd19a4754df8))
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **addressbook:** Removed SOGoGlobalAddressBookFirstEntries (use listRequiresDot instead) and move SOGoGlobalAddressBookFirstEntriesCount to globalAddressBookFirstEntriesCount in source scope. This fixed the broken listRequiresDot in 5.10 ([4dba56f](https://github.com/Alinto/sogo/commit/4dba56f70dbda81822b3fd26e1420c367c1b7298))
|
||||
* **attachment:** properly download openxmlformats in attachments ([2e2e36e](https://github.com/Alinto/sogo/commit/2e2e36e0a2b759d5d734bdefc274f127937e9b89))
|
||||
* **calendar(js):** escape CSS selector names ([5c94461](https://github.com/Alinto/sogo/commit/5c944617d0efdc03a72a677e9f60922cb3ab90bd))
|
||||
* **calendar(js):** prevent duplicate event creation in case of an event conflict ([f04c73d](https://github.com/Alinto/sogo/commit/f04c73d495dfce6e93d33ceb0964f1ee6aeb51a5))
|
||||
* **calendar:** Fix all day recurring event displayed on 2 days when a DST change occurs at the endDate ([980b5e2](https://github.com/Alinto/sogo/commit/980b5e28dd0c4cfd42619c64872bb08674d64765))
|
||||
* **calendar:** Fix assertion when is_cycle is set but without c_cycleinfo ([d404667](https://github.com/Alinto/sogo/commit/d4046673eebf21180f494e516a39a7b04243f669) [49e9988](https://github.com/Alinto/sogo/commit/49e9988b82b206ae751feb10979f5e0859d2ec77) [d9ee884](https://github.com/Alinto/sogo/commit/d9ee88445997a21623b33129fe28466042229696))
|
||||
* **calendar:** fix crash when using a 2*16bits chars at the 75th char of ics file ([31c0473](https://github.com/Alinto/sogo/commit/31c0473c48238de2288e5a5c0c8295fc67710d32))
|
||||
* **calendar:** fix disabled change view buttons ([910effd](https://github.com/Alinto/sogo/commit/910effd664e24a3fc5343145f24a2e2d9cf58027))
|
||||
* **calendar:** Fix empty recurence list when creating event from mail ([2756176](https://github.com/Alinto/sogo/commit/27561765038358243a628853b47b20c2db256dc2))
|
||||
* **calendar:** Fix issue on template introduced in commit [#275617650](https://bugs.sogo.nu/view.php?id=275617650) ([eee160e](https://github.com/Alinto/sogo/commit/eee160e5bf60b2e59b96adabae805d61c5d85292))
|
||||
* **calendar:** Fix issue when doubleclick creates an event of 2 days after creating an event > 1 days ([7b23342](https://github.com/Alinto/sogo/commit/7b233422f5790147dd2522261c3b79dac85bfd6c))
|
||||
* **calendar:** Fix issue where a calendar's subscribed user can give acl to another user ([ae01ed0](https://github.com/Alinto/sogo/commit/ae01ed077dcca8d3c3778cde6645075dada9b92d) [cb55413](https://github.com/Alinto/sogo/commit/cb55413e91ac0f10b649abaaeaa5fdab141f0958) [0fafda5](https://github.com/Alinto/sogo/commit/0fafda55d633401c1eeadcbfafd9ae251234787a))
|
||||
* **calendar:** Fix NSData returned instead of NSString on c_cycleinfo depending on database issue. CLoses [#5940](https://bugs.sogo.nu/view.php?id=5940). ([5215aa4](https://github.com/Alinto/sogo/commit/5215aa4f4114acc09bc923542e4fe23fa2779d3b))
|
||||
* **calendar:** Memory optimization on _appendCycleException ([45fd999](https://github.com/Alinto/sogo/commit/45fd999010a80ee39c7fa26f96c1460ddf0d3af9))
|
||||
* **calendar:** resource was busy even if they have delegated ([880eb89](https://github.com/Alinto/sogo/commit/880eb897191c906d141afafe628d66f9a5025640) [5830053](https://github.com/Alinto/sogo/commit/58300530260469594f40db7ee3b67e34ba60d1ce))
|
||||
* **chore:** Remove check on -p option to sogo-ealarms-notify as the SMTP Master account has been implemented ([f96eb4d](https://github.com/Alinto/sogo/commit/f96eb4d3ca32a916ecc63221d022014f736cd94b))
|
||||
* **contacts:** can now reset contacts categories more than once ([526aa28](https://github.com/Alinto/sogo/commit/526aa281d9a92e9fd29046b8a1551aea16c58772))
|
||||
* **core:** Add disableSubgroups option in SOGoUserSources LDAP settings to avoid infinite recursive loop when using a group name with the same name as a member. Fixes [#5913](https://bugs.sogo.nu/view.php?id=5913) ([fd9b8dc](https://github.com/Alinto/sogo/commit/fd9b8dcfcd07217e7456a67c2e69f13fca743874))
|
||||
* **core:** Add timer to avoid spamming onEditorChanged for CKEditor 5. Fixes [#5944](https://bugs.sogo.nu/view.php?id=5944). ([bc804ae](https://github.com/Alinto/sogo/commit/bc804ae823a8a61e6cb02495759f75a104c77753) [2f4c125](https://github.com/Alinto/sogo/commit/2f4c125bdd9b5eebbba41e2204e2fc9c93a3eebd))
|
||||
* **core:** Clean html parasite code to avoid ckeditor hangs. Fixes [#5944](https://bugs.sogo.nu/view.php?id=5944). ([127df39](https://github.com/Alinto/sogo/commit/127df3968998c96d5349f7368adba1e5e371ed4c))
|
||||
* **core:** Fix int overflow on vms and rss computation ([4b343f7](https://github.com/Alinto/sogo/commit/4b343f707016f2b45fbd71c6c2f039b50a076f30))
|
||||
* **core:** Improve error logging on url encryption ([b8a6d57](https://github.com/Alinto/sogo/commit/b8a6d576e19828ffddf6c8e3c3353efd03836b2e))
|
||||
* **core:** Notify sgCkeditor component when clicking the send button to update content. Fixes [#5952](https://bugs.sogo.nu/view.php?id=5952). ([c2d9050](https://github.com/Alinto/sogo/commit/c2d9050539c13f843f2a7395b0b9a24a4b8db3f3))
|
||||
* **core:** On some emails print, first page is blank. Closes [#5602](https://bugs.sogo.nu/view.php?id=5602). ([e39c104](https://github.com/Alinto/sogo/commit/e39c1044364d68df49ea6142072928d0b0e4c1eb))
|
||||
* **doc:** Fix typo with SOGoURLEncryptionEnabled in documentation ([a06331e](https://github.com/Alinto/sogo/commit/a06331eb86aad8ec9a30f30df55aa4282a78654c))
|
||||
* **event:** fix rdate timezones ([e4cb0a3](https://github.com/Alinto/sogo/commit/e4cb0a35ef34b496d8b7e0d6e2e10fe0844e37f8))
|
||||
* **event:** resource was considered busy for an event he has delegated ([adf1117](https://github.com/Alinto/sogo/commit/adf111704642126272301ab7961603fb0b787c9e))
|
||||
* **event:** user was considered busy for an event he has delegated ([815a87d](https://github.com/Alinto/sogo/commit/815a87de0b8bc8e8a7431b8a7b3aedc66d4dde2a))
|
||||
* **languages:** somme "array" strings were using the wrong comma delimiter ([7c0699b](https://github.com/Alinto/sogo/commit/7c0699b96ff1539011e04a1d60f8f4c7334e79b1))
|
||||
* **mail:** Add encoding fallback when there are ISO char in file name. Fixes [#5388](https://bugs.sogo.nu/view.php?id=5388). ([e6ff9a4](https://github.com/Alinto/sogo/commit/e6ff9a408d94d2817ce0d9b9f078811e19ea4a39))
|
||||
* **mail:** Fix advanced search no select/action on results. Fixes [#5978](https://bugs.sogo.nu/view.php?id=5978) ([1a47fdb](https://github.com/Alinto/sogo/commit/1a47fdb7d62242001c770ac28df84bf8c999c179))
|
||||
* **mail:** Fix errors while spamming arrow keys on mail list. The transition was not finished ([049a569](https://github.com/Alinto/sogo/commit/049a569d7faff5f3a507671d17bc0da309ec14ac))
|
||||
* **mail:** Fix Exception when using delegated identities. Closes [#5951](https://bugs.sogo.nu/view.php?id=5951) ([f8c354c](https://github.com/Alinto/sogo/commit/f8c354c302b34b1676764a869481f8a6160f6120))
|
||||
* **mail:** Fix invalid content when forwarding a text/plain mail. Fixes [#5983](https://bugs.sogo.nu/view.php?id=5983). ([ef88039](https://github.com/Alinto/sogo/commit/ef88039a4a3d590de09cf75da5668db9d6fd29f0) [43388ac](https://github.com/Alinto/sogo/commit/43388ac42c99a6fc47cc4191291f81d45faf9a8d))
|
||||
* **mail:** Fix not called draft expunge function when sending mail. ([7ec7a7d](https://github.com/Alinto/sogo/commit/7ec7a7d6aead1a7aee025324e2ae64696b2d087c))
|
||||
* **mail:** Fix template issues with Galician and Basque ([19ee54f](https://github.com/Alinto/sogo/commit/19ee54fe055bc6a45bae6e5f71dcdb60bad766fd))
|
||||
* **mail:** Fix ukrainian encoding issue. Fixes [#5702](https://bugs.sogo.nu/view.php?id=5702). ([776a798](https://github.com/Alinto/sogo/commit/776a798e173e6bacc29c8ab3d32bddabd383da55))
|
||||
* **mail:** Fix unsupported koi-u encoding ([5710c4d](https://github.com/Alinto/sogo/commit/5710c4d97e2fbcf3ff0b187f1100892d8efcacb2))
|
||||
* **mail:** Remove some css when generating UIxMailPartHTMLViewer. Sometimes, the mail contains SOGo mail template in the content, and broke mail display. ([863280d](https://github.com/Alinto/sogo/commit/863280d6ac54783a7fe6a8ce3fcdd8c3a4c4e4ff))
|
||||
* **mail:** Removed bracket display when inline text or inline html ([06ea167](https://github.com/Alinto/sogo/commit/06ea167ee58c65f54cf4474927d977513d380b3b))
|
||||
* **mail:** Restore scroll position when refreshing emails ([9d71be9](https://github.com/Alinto/sogo/commit/9d71be9c45eb9b9af0cb62be99a440ea7652248b))
|
||||
* **mail:** Update len value as data is modified in loop. This fixes the issue on sanitizedContentUsingVoidTags whenthere are meta html tags in mail content. ([99da6e0](https://github.com/Alinto/sogo/commit/99da6e0f81a99f94e453ece7fe0761fcf1186fb6))
|
||||
* **mail:** When the signature is empty, the -- seperator appears. ([58db9c9](https://github.com/Alinto/sogo/commit/58db9c980eb518dc726e908307988b98cf7a4d84))
|
||||
* **preferences:** Can not save preferences when there is a constraint on mail ([990f1e8](https://github.com/Alinto/sogo/commit/990f1e8e8fda67537a3a4ed3a067011e3b81e7dd))
|
||||
* **ui:** Fix invalid display when creating new appointment / mail on mobile. Initialize isFullscreen to if screen is in portrait. Fixes [#5970](https://bugs.sogo.nu/view.php?id=5970). ([314b39d](https://github.com/Alinto/sogo/commit/314b39dd1c65e321920fdc095915c2954a53b944))
|
||||
* **vulnerability:** prevent cross-site scripting when previewing attachments ([2e37e59](https://github.com/Alinto/sogo/commit/2e37e59ed140d4aee0ff2fba579ca5f83f2c5920))
|
||||
|
||||
|
||||
### Localization
|
||||
|
||||
* **ar:** Update Arabic translations ([1aa59dc](https://github.com/Alinto/sogo/commit/1aa59dcd7e5755873ac0a68c770ecb33efe50077))
|
||||
* **bg_BG:** Update Bulgarian translations ([be6a69a](https://github.com/Alinto/sogo/commit/be6a69a4d600da2ac3bccd00d10b185871295c2a))
|
||||
* **bs_BA:** Update Bosnian translations ([0b530f9](https://github.com/Alinto/sogo/commit/0b530f9e36a996f9910432b5410ce14e0c74a979))
|
||||
* **calendar:** Change Email Attendees to Email Attendees (internal users ([eb63e6d](https://github.com/Alinto/sogo/commit/eb63e6d047c4f3967b83f17c6457d353acf2d9ae))
|
||||
* **ca:** Update Catalan translations ([ca0b001](https://github.com/Alinto/sogo/commit/ca0b00107a65b2cd5b78d084d8591a99d6055d07))
|
||||
* **cs:** Update Czech translations ([5ee1904](https://github.com/Alinto/sogo/commit/5ee190468e7616e2fb05a90fd146dbb0a76ccb6a))
|
||||
* **cy:** Update Welsh translations ([fad8c21](https://github.com/Alinto/sogo/commit/fad8c21473bdb975826a37f728f7da76a21afd6f))
|
||||
* **da_DK:** Update Danish translations ([bcb2410](https://github.com/Alinto/sogo/commit/bcb2410b1224981f0fec618f2e073197d2539666))
|
||||
* **de:** Update German translations ([37f2b1d](https://github.com/Alinto/sogo/commit/37f2b1dc5c630ea58ad356c568d706bb81747cb7))
|
||||
* **es_AR:** Update SpanishArgentina translations ([94d32c4](https://github.com/Alinto/sogo/commit/94d32c419c525067415c8ff9c2aa44fd00c361ed))
|
||||
* **es_ES:** Update SpanishSpain translations ([6e11cdf](https://github.com/Alinto/sogo/commit/6e11cdf2893727ae77625cad1d0be4cd0e60e1bd))
|
||||
* **eu:** Update Basque translations ([55563d2](https://github.com/Alinto/sogo/commit/55563d21132c43841fe009ea93e71bae5058a37c))
|
||||
* **fi:** Update Finnish translations ([ed3e790](https://github.com/Alinto/sogo/commit/ed3e790b47f60b2b2548888c23eeb1945c7d8156))
|
||||
* **gl:** Update Galician translations ([6b6dc6b](https://github.com/Alinto/sogo/commit/6b6dc6b3b845357b2d9986abe3b84e91484f7c58))
|
||||
* **he:** Update Hebrew translations ([8bf1a77](https://github.com/Alinto/sogo/commit/8bf1a77efc12eeaf41b4f6d32aec6eddfe5f4f5c))
|
||||
* **hr_HR:** Update Croatian translations ([fa23124](https://github.com/Alinto/sogo/commit/fa2312470adff5026c1d8b75c3e32109b55e51a4))
|
||||
* **hu:** Update Hungarian translations ([b82fa1d](https://github.com/Alinto/sogo/commit/b82fa1d0771b082d07e3c654e41a3ef82888e525))
|
||||
* **id_ID:** Update Indonesian translations ([de289d9](https://github.com/Alinto/sogo/commit/de289d9b4cd7b0ed6050183acb020c8e1c4054ca))
|
||||
* **is:** Update Icelandic translations ([2fabfdf](https://github.com/Alinto/sogo/commit/2fabfdfb9f78df085531a4525707311004d6c4ed))
|
||||
* **it:** Update Italian translations ([227b92b](https://github.com/Alinto/sogo/commit/227b92b7434ded7f54affe9aad629b08a3e2badf))
|
||||
* **ja:** Update Japanese translations ([0c2c9d7](https://github.com/Alinto/sogo/commit/0c2c9d7682a9ca66ac4d3778ae0efc907f525aa8))
|
||||
* **kk:** Update Kazakh translations ([c4b58a6](https://github.com/Alinto/sogo/commit/c4b58a6ae75110482801b4aa2141b564b8943476))
|
||||
* **lt:** Update Lithuanian translations ([a84ab76](https://github.com/Alinto/sogo/commit/a84ab7655d05aec16c0d247d13f6da3b46a95221))
|
||||
* **lv:** Update Latvian translations ([88c9074](https://github.com/Alinto/sogo/commit/88c9074aeab8759d841ea79db2245520fe998543))
|
||||
* **mk_MK:** Update Macedonian translations ([5bb0253](https://github.com/Alinto/sogo/commit/5bb025323f63b93b984707ffa507d900846f6ec5))
|
||||
* **nb_NO:** Update NorwegianBokmal translations ([943e96f](https://github.com/Alinto/sogo/commit/943e96f459cc5a8fd93ec8da36f064f251d30dc2))
|
||||
* **nl:** Update Dutch translations ([85c1cc7](https://github.com/Alinto/sogo/commit/85c1cc7fa3f3e21b6a158cd51c3e640e94f0e81e))
|
||||
* **nn_NO:** Update NorwegianNynorsk translations ([65f29f2](https://github.com/Alinto/sogo/commit/65f29f21dc2d957e3bcabdedb8873e71f65461ee))
|
||||
* **pl:** Update Polish translations ([84c0fb4](https://github.com/Alinto/sogo/commit/84c0fb496d5727ccb4248b96b36d57a620ef440a))
|
||||
* **pt_BR:** Update BrazilianPortuguese translations ([af630f0](https://github.com/Alinto/sogo/commit/af630f033d3cc1188019e1f3cfe0ebb852f3560f))
|
||||
* **pt:** Update Portuguese translations ([9a0e03b](https://github.com/Alinto/sogo/commit/9a0e03bf9afdf049bcce0045411400931c6ce9f1))
|
||||
* **ro_RO:** Update Romanian translations ([b889064](https://github.com/Alinto/sogo/commit/b889064dbc7e137298ef8e70538f6a7196477596))
|
||||
* **ru:** Update Russian translations ([33df476](https://github.com/Alinto/sogo/commit/33df476db55890fcae1c40bd29e9e81017c86e72))
|
||||
* **sk:** Update Slovak translations ([7b7cfdb](https://github.com/Alinto/sogo/commit/7b7cfdb499766867430e49376185105cfbf2ab4f))
|
||||
* **sl_SI:** Update Slovenian translations ([68b17a5](https://github.com/Alinto/sogo/commit/68b17a5c4a6a2e015d32dc79c7b33d348be1a5f2))
|
||||
* **sr_ME@latin:** Update Montenegrin translations ([8d4597d](https://github.com/Alinto/sogo/commit/8d4597d3610928191313986490eafb44f3077ca5))
|
||||
* **sr@latin:** Update SerbianLatin translations ([a4f0397](https://github.com/Alinto/sogo/commit/a4f03978cfc815d3a337d94d5a46bbe10166306a))
|
||||
* **sr:** Update Serbian translations ([7de9dc8](https://github.com/Alinto/sogo/commit/7de9dc8f9ba3e62d082d91f4305c5be6c9d2a7c6))
|
||||
* **sv:** Update Swedish translations ([dd1a660](https://github.com/Alinto/sogo/commit/dd1a6607fe3ed9e65991d349588179acb7f2eb6c))
|
||||
* **tr_TR:** Update TurkishTurkey translations ([56012c6](https://github.com/Alinto/sogo/commit/56012c65e191937b5132c091f6366b6b24546a5f))
|
||||
* **uk:** Update Ukrainian translations ([6537d96](https://github.com/Alinto/sogo/commit/6537d961e13604ae373e787664f6fa91f9912ab5))
|
||||
* **zh_CN:** Update ChineseChina translations ([0e5657e](https://github.com/Alinto/sogo/commit/0e5657e635012cd2568e30060741e7114ef1a591))
|
||||
* **zh_TW:** Update ChineseTaiwan translations ([1136c18](https://github.com/Alinto/sogo/commit/1136c182885d716dc2613d58f59a58fdcf8d8168))
|
||||
|
||||
## [5.10.0](https://github.com/Alinto/sogo/compare/SOGo-5.9.1...SOGo-5.10.0) (2024-02-20)
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* **accounts:** Add parameter to encrypt/decrypt auxiliary account's password ([9898e52](https://github.com/Alinto/sogo/commit/9898e5210fb275f1fdd11a8287be673becb78073) [e6bfab7](https://github.com/Alinto/sogo/commit/e6bfab7ee17ca789d6e07be06577c742dfc9bb3f) [dde154d](https://github.com/Alinto/sogo/commit/dde154df3f766d7aa670835bb20686d9ef1eb302) [04596c9](https://github.com/Alinto/sogo/commit/04596c9f4e0ee480a63772b7ef9a51e183b2af52) [ce0e650](https://github.com/Alinto/sogo/commit/ce0e650c62e542c5c9e9817f1d91c7a5b6794712))
|
||||
* **accounts:** Can now add smtp server to auxilliary accounts ([adc2d74](https://github.com/Alinto/sogo/commit/adc2d74e544531ee94f3148ab32754a657c50cd8) [f0010af](https://github.com/Alinto/sogo/commit/f0010afef4d7a36b75d552ce42e48fa151772d9d)) *This feature has been sponsored by a user from the community: [sogouser5646](https://bugs.sogo.nu/view_user_page.php?id=3108)*
|
||||
* **calendar:** Add double click to calendar create events ([68398d2](https://github.com/Alinto/sogo/commit/68398d2086452f7b4eaae65eb005b2bbdedd3a9d))
|
||||
* **contact:** Show 100 first results for global address book ([17eca6f](https://github.com/Alinto/sogo/commit/17eca6f96a4537a580d66a4abb8ba13e965892c8))
|
||||
* **core:** Add message of the day ([2e7a7a9](https://github.com/Alinto/sogo/commit/2e7a7a97ccff6887bda1ef7b0d5c2f051c233fe5) [49b0316](https://github.com/Alinto/sogo/commit/49b0316b9e87ad1f6f6524e4e3d7c8f5031ff072) [eee5069](https://github.com/Alinto/sogo/commit/eee50697b09c03af251996cec593131ffd3609a6) [6324877](https://github.com/Alinto/sogo/commit/63248772c168cff618e6f1d831c0170dc80d56ff) [455fe97](https://github.com/Alinto/sogo/commit/455fe97cbe9c76dddefd74a9f945cb029d3731ba)) *This feature has been sponsored by the [University Of Cologne](https://portal.uni-koeln.de/en/uoc-home)*
|
||||
* **core:** Add URL encryption for GDPR compliancy ([930a06e](https://github.com/Alinto/sogo/commit/930a06e520de1d0d00f58c6be6def32679e4e68c) [10d789f](https://github.com/Alinto/sogo/commit/10d789fb1fe8157a19c71252fb9c485b90d9993c) [31c6f78](https://github.com/Alinto/sogo/commit/31c6f78913f109d081d5032ad010042e112a1f88) [64a6319](https://github.com/Alinto/sogo/commit/64a63196357b91bd8cfc92396c8fde16481d9b84) [7ace9c2](https://github.com/Alinto/sogo/commit/7ace9c2c222f086be196acc5c65bca2376abb0ab) [7104ae6](https://github.com/Alinto/sogo/commit/7104ae6d234ff5f2b2fbc59dea6c6b8b736c50f4) [42511d6](https://github.com/Alinto/sogo/commit/42511d666fe9cf979e59e590b2510c436a70460a) [fc77829](https://github.com/Alinto/sogo/commit/fc778295ffc1730a873d2c965efcf30ed04c748b) [f43974b](https://github.com/Alinto/sogo/commit/f43974bbb799ba5d2ea53587139a0d5569ae0082) [fc0f5d9](https://github.com/Alinto/sogo/commit/fc0f5d9d984df9a30a2a9e0ca25cdbbd15847a34) [2748d1d](https://github.com/Alinto/sogo/commit/2748d1dd081358c353624591fe302b1684488a4e))
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **acl:** bool was not set to NO ([e81fdad](https://github.com/Alinto/sogo/commit/e81fdadeccb3882717a852defe561afcf216b9a8))
|
||||
* **addressbook:** Fix exception when using multiple address book source and searching. Fixes [#5906](https://bugs.sogo.nu/view.php?id=5906). ([f85c531](https://github.com/Alinto/sogo/commit/f85c53190c38c4e28536f78e43623f6776248291))
|
||||
* **build:** fix missing ld flag in GNUmakefile ([136134](https://github.com/Alinto/sogo/commit/1361341545e7f45b86f8e7ed5ac7407a34ed361e)). *This fix has been made by @konsultaner*
|
||||
* **calendar:** Couldn't choose some reminder options when creating events ([8dc69ef](https://github.com/Alinto/sogo/commit/8dc69efd70bf93c9a41811d16ad24d578981407e))
|
||||
* **calendar:** Fix high memory usage when importing an ics ([3acab3f](https://github.com/Alinto/sogo/commit/3acab3f89612bde3e74b7f108e47ea3ff4bd9bb6))
|
||||
* **calendar:** Prevent clicking on delete event button when network is slow ([acd4a1f](https://github.com/Alinto/sogo/commit/acd4a1f4aa2177eb2b71ba9951307fe9c6adc7ce))
|
||||
* **contacts:** c_cn could be null whereas it isn't ([6aab869](https://github.com/Alinto/sogo/commit/6aab869b81e3c73c55ee6bc4f79128324cc08031))
|
||||
* **contacts:** Custom contacts categories in sogo.conf wasn't working ([26c7462](https://github.com/Alinto/sogo/commit/26c7462eb0e1a86c9d644a27724f81d8ae496cb7))
|
||||
* **core:** Add missing method WORequest+SOGo.h ([31a66c4](https://github.com/Alinto/sogo/commit/31a66c461abc72ee287a9b21b2fdb560655df7a8))
|
||||
* **core:** *SOPE* Add error handler on sax parsing (pushBytes) ([ff9a7f9](https://github.com/Alinto/sope/commit/ff9a7f9ab93f20b9106327babfce971b8b06672e))
|
||||
* **crypto:** add protections for decryption ([a6319e1](https://github.com/Alinto/sogo/commit/a6319e1689c351f9292350917f1f3e983ab0a7f5))
|
||||
* **crypto:** check if NSData is null terminated ([5197b9b](https://github.com/Alinto/sogo/commit/5197b9bd0b0150503824dfc68a6910116c2bf344))
|
||||
* **docs:** Fix typo in documentation ([9560bdc](https://github.com/Alinto/sogo/commit/9560bdcf0cd1139ce49f8c16127d0e227ee63a9b))
|
||||
* **gnustep:** *SOPE* chance constant name when using gnutspe > 1.29 ([393f20c](https://github.com/Alinto/sope/commit/393f20cce158b45f780346d5604d740ac7f295a6)) *This fix has been made by @binary-jam*
|
||||
* **http:** *SOPE* http header host was not correct for local url ([4b9366d](https://github.com/Alinto/sope/commit/4b9366d60c49729b5024b5d814ec643f8b3c3fa0))
|
||||
* **imap:** *SOPE* Fix some cases where IMAP delimiter was returned as empty([1160846](https://github.com/Alinto/sope/commit/1160846ac35a51d0ae85e73f5c1e0ec2ab3f0216))
|
||||
* **js:** Remove check version for ckeditor ([5081de1](https://github.com/Alinto/sogo/commit/5081de1639162be9d259a3c921fb05084f879ce4))
|
||||
* **mail:** Disable inline images in attachments when HTML emails writing is disabled. Fixes [#5877](https://bugs.sogo.nu/view.php?id=5877). ([0d0eda2](https://github.com/Alinto/sogo/commit/0d0eda26984e825c8af82528c749238678baf159))
|
||||
* **mail:** Fix inline pdf attachement issue when Hide inline attachment option is set. Now the option hides only inline images ([9e3e3b2](https://github.com/Alinto/sogo/commit/9e3e3b22911133c3da5ad5bb6f51e9b7d158a35f) [a6fc83c](https://github.com/Alinto/sogo/commit/a6fc83c35bf62430b4a626107ff62cfcf9532539))
|
||||
* **mail:** Fix inline text issue when Hide inline attachment option is set ([00d6956](https://github.com/Alinto/sogo/commit/00d69560ba3526f68396e5a1febf1e1d9d58726b))
|
||||
* **mail:** Fix security [@import](https://github.com/import) css injection ([2146870](https://github.com/Alinto/sogo/commit/21468700718ed71774eaf2979ee59330fc569424))
|
||||
* **mail:** Use text/plain fallback if an error occured while parsing html message ([f56910d](https://github.com/Alinto/sogo/commit/f56910db1efe25d2ce1d36db787c010a9f2a36f9))
|
||||
* **mail:**: *SOPE* allow 'GMT' timezone in mail header ([604c8ef](https://github.com/Alinto/sope/commit/604c8ef291b2755dc5c821a9fcea7aafdef5eb7b))
|
||||
* **password recovery:** Add default from mail parameter ([26b1467](https://github.com/Alinto/sogo/commit/26b14671f5e3edc6ff40212d4bbe153c0decb2eb))
|
||||
* **preferences:** Add error message when SOGoCreateIdentitiesDisabled is enabled and user try to activate html fields with browser inspector. Check changes of email and replyTo. ([f27b33a](https://github.com/Alinto/sogo/commit/f27b33a0c8b4a98490090faec20912b349ab35fe))
|
||||
* **preferences:** Fix error 500 when changing password ([37379ba](https://github.com/Alinto/sogo/commit/37379ba416abb7beef56439f2a584a0445e17c7f))
|
||||
* **sql:** *SOPE* remove deprecated param for mysql ([3d4613c8](https://github.com/Alinto/sope/commit/3d4613c89f6537fa0bcaefe6105c517513bd84c1))
|
||||
* **ui:** Fix text/placeholder overlaps when Chrome autofill applies ([51b6c0d](https://github.com/Alinto/sogo/commit/51b6c0d9a3ee1b2c43011b2f29ff50f78327caad))
|
||||
|
||||
|
||||
### Localization
|
||||
|
||||
* **ar:** Update Arabic translations ([1206d2f](https://github.com/Alinto/sogo/commit/1206d2f459cd2446010b2e2badb096d6c4b71902))
|
||||
* **bg_BG:** Update Bulgarian translations ([65d31f2](https://github.com/Alinto/sogo/commit/65d31f2b144d04a882454cd6cf8f301837b05a0a))
|
||||
* **bs_BA:** Update Bosnian translations ([ace1515](https://github.com/Alinto/sogo/commit/ace1515dfcebf809b22afa46b86941c390189d9a))
|
||||
* **ca:** Update Catalan translations ([344d4da](https://github.com/Alinto/sogo/commit/344d4da9308fb72ed399c04fb94277d9eb903b17))
|
||||
* **cs:** Update Czech translations ([af22a30](https://github.com/Alinto/sogo/commit/af22a30f12eaeb55ad782e34575208f936f267c6))
|
||||
* **cy:** Update Welsh translations ([ca1d549](https://github.com/Alinto/sogo/commit/ca1d5495ab0d88a1196666201c4e9242ee74d93b))
|
||||
* **da_DK:** Update Danish translations ([c8eee39](https://github.com/Alinto/sogo/commit/c8eee39017382b1bcc5b5e752cd77331defe698e))
|
||||
* **de:** Update German translations ([28f446a](https://github.com/Alinto/sogo/commit/28f446a6ad63dc0b74fde94b3a599ac57f76346c))
|
||||
* **es_AR:** Update SpanishArgentina translations ([7582266](https://github.com/Alinto/sogo/commit/7582266479043aa4f5acfcada2eef85a7c0b6010))
|
||||
* **es_ES:** Update SpanishSpain translations ([30f819e](https://github.com/Alinto/sogo/commit/30f819e2a42545b468f37f6d9e0506ebdf240874))
|
||||
* **eu:** Update Basque translations ([c2fc80e](https://github.com/Alinto/sogo/commit/c2fc80ecd1b83d368332047fc732195874adb6a3))
|
||||
* **fi:** Update Finnish translations ([ce8c697](https://github.com/Alinto/sogo/commit/ce8c697d96322decb9008ce35a04b3df26e694a8))
|
||||
* **fr:** Update French translations ([62d5414](https://github.com/Alinto/sogo/commit/62d5414936f5d71cb82a8a6f1e2725c0bbed32bb))
|
||||
* **gl:** Update Galician translations ([ef29aa2](https://github.com/Alinto/sogo/commit/ef29aa2bab7fad5cdfe22223f71191f9a067953e))
|
||||
* **he:** Update Hebrew translations ([82db4d9](https://github.com/Alinto/sogo/commit/82db4d99d429d35a9764a43b94b25bbb2231d309))
|
||||
* **hr_HR:** Update Croatian translations ([c5b6611](https://github.com/Alinto/sogo/commit/c5b6611f8977e7e15c4971c34a1961ae56a821c2))
|
||||
* **hu:** Update Hungarian translations ([8581aa7](https://github.com/Alinto/sogo/commit/8581aa7840bb8c4346c62c344e79ce64db72a806))
|
||||
* **id_ID:** Update Indonesian translations ([c3cefb6](https://github.com/Alinto/sogo/commit/c3cefb6ae8865c5544f2a33033525c4cdea42aab))
|
||||
* **is:** Update Icelandic translations ([ae85548](https://github.com/Alinto/sogo/commit/ae85548f2734e7c93a83426ec78f8b0eb991a35d))
|
||||
* **it:** Update Italian translations ([e924ac4](https://github.com/Alinto/sogo/commit/e924ac4e67f74c517aecd691d343700980ddd384))
|
||||
* **ja:** Update Japanese translations ([a75bfbb](https://github.com/Alinto/sogo/commit/a75bfbb2c7ac03f7dadf5ae48dfbd312a7c4c367))
|
||||
* **kk:** Update Kazakh translations ([adc17a3](https://github.com/Alinto/sogo/commit/adc17a3639fed8a69417079f68caef9a86cfce01))
|
||||
* **lt:** Update Lithuanian translations ([ab8c236](https://github.com/Alinto/sogo/commit/ab8c236621a08b92bfc90654e6e620c47319b9f7))
|
||||
* **lv:** Update Latvian translations ([74a730d](https://github.com/Alinto/sogo/commit/74a730d094a7184c5aa3febb8f0bcd610fa6f113))
|
||||
* **mk_MK:** Update Macedonian translations ([adf2d40](https://github.com/Alinto/sogo/commit/adf2d409bad3c7dbf53bcc141604d807591f665c))
|
||||
* **nb_NO:** Update NorwegianBokmal translations ([ee55f7a](https://github.com/Alinto/sogo/commit/ee55f7a64fb456aa1b791636752a331d70a7a407))
|
||||
* **nl:** Update Dutch translations ([ad75555](https://github.com/Alinto/sogo/commit/ad75555a0f6ec7f8b00310f323813d513d949088))
|
||||
* **nn_NO:** Update NorwegianNynorsk translations ([add792f](https://github.com/Alinto/sogo/commit/add792fc1e7020b64a4ec8f905740172dad9be35))
|
||||
* **pl:** Update Polish translations ([083fa1f](https://github.com/Alinto/sogo/commit/083fa1fefd8704aebc7b7e3f24eff5f2ad5d41c8))
|
||||
* **pt_BR:** Update BrazilianPortuguese translations ([434be9e](https://github.com/Alinto/sogo/commit/434be9ea71e21205ba8f08c0b78bf22e50a600d7))
|
||||
* **pt:** Update Portuguese translations ([26719a1](https://github.com/Alinto/sogo/commit/26719a146189301d7daf30035698bd6a332c245a))
|
||||
* **ro_RO:** Update Romanian translations ([c827880](https://github.com/Alinto/sogo/commit/c827880f2a1e812a959c63c7d6e9752fafd69023))
|
||||
* **ru:** Update Russian translations ([0f0ecf7](https://github.com/Alinto/sogo/commit/0f0ecf75218df232268faf8c9aa030bcd1511051))
|
||||
* **sk:** Update Slovak translations ([2db48dc](https://github.com/Alinto/sogo/commit/2db48dc7fb68515daf9218106d61944d1a46617d))
|
||||
* **sl_SI:** Update Slovenian translations ([24888b2](https://github.com/Alinto/sogo/commit/24888b23d59b7e3b874ff312c96d474260fd5366))
|
||||
* **sr_ME@latin:** Update Montenegrin translations ([71e66d6](https://github.com/Alinto/sogo/commit/71e66d65b8d10e3f0371c92cbf7719c1fecf7708))
|
||||
* **sr@latin:** Update SerbianLatin translations ([91c22c0](https://github.com/Alinto/sogo/commit/91c22c08001952de7563eb9627bf6da2eddcb721))
|
||||
* **sr:** Update Serbian translations ([5146d9d](https://github.com/Alinto/sogo/commit/5146d9d2156799914cc9c392102c4ee86e3eceaf))
|
||||
* **sv:** Update Swedish translations ([c93b1e9](https://github.com/Alinto/sogo/commit/c93b1e977539cd11bc52057b6ffcdf57334bb572))
|
||||
* **tr_TR:** Update TurkishTurkey translations ([2b1e7bd](https://github.com/Alinto/sogo/commit/2b1e7bdb67312e5ea34d370b22c8e9d60550bc93))
|
||||
* **uk:** Update Ukrainian translations ([34407df](https://github.com/Alinto/sogo/commit/34407df4f7713646cf8cd1a7bd60b875965fd617))
|
||||
* **zh_CN:** Update ChineseChina translations ([31eb798](https://github.com/Alinto/sogo/commit/31eb7987d8d95f23b94360ad854f9077298e0975))
|
||||
* **zh_TW:** Update ChineseTaiwan translations ([7e78781](https://github.com/Alinto/sogo/commit/7e78781044f7d43f3c347e5fcc9e2285212ae445))
|
||||
|
||||
## [5.9.1](https://github.com/Alinto/sogo/compare/SOGo-5.9.0...SOGo-5.9.1) (2023-12-12)
|
||||
|
||||
|
||||
|
||||
@@ -70,7 +70,7 @@ Assumptions
|
||||
SOGo reuses many components in an infrastructure. Thus, it requires the
|
||||
following:
|
||||
|
||||
* Database server (MySQL, PostgreSQL or Oracle)
|
||||
* Database server (MariaDB, MySQL, PostgreSQL or Oracle)
|
||||
* LDAP server (OpenLDAP, Novell eDirectory, Microsoft Active Directory
|
||||
and others)
|
||||
* SMTP server (Postfix, Sendmail and others)
|
||||
@@ -165,7 +165,7 @@ The following operating systems are currently supported by SOGo:
|
||||
* Red Hat Enterprise Linux (RHEL) Server 7, 8 and 9
|
||||
* Community ENTerprise Operating System (CentOS) 7, 8 and 9
|
||||
* Debian GNU/Linux 7.0 (Wheezy), 8.0 (Jessie), 9.0 (Stretch), 10 (Buster), 11 (Bullseye) and 12 (Bookworm)
|
||||
* Ubuntu 14.04 (Trusty), 16.04 (Xenial), 18.04 (Bionic), 20.04 (Focal) and 22.04 (Jammy)
|
||||
* Ubuntu 14.04 (Trusty), 16.04 (Xenial), 18.04 (Bionic), 20.04 (Focal), 22.04 (Jammy) and 24.04 (Noble)
|
||||
|
||||
Make sure the required components are started automatically at boot time
|
||||
and that they are running before proceeding with the SOGo configuration.
|
||||
@@ -193,6 +193,9 @@ should apply to all supported operating systems.
|
||||
Software Downloads
|
||||
~~~~~~~~~~~~~~~~~~
|
||||
|
||||
**In order to access the community build, go to https://www.sogo.nu/download.html[SOGo website]
|
||||
and select "Development (nightly builds)" at the bottom of the page.**
|
||||
|
||||
[NOTE]
|
||||
In order to access the production builds, you need a proper support contract
|
||||
from https://sogo.nu/support/index_new.html#support-plans[Alinto]. Continue
|
||||
@@ -265,8 +268,8 @@ This will install SOGo and its dependencies such as GNUstep, the SOPE
|
||||
packages and memcached. Once the base packages are installed, you need
|
||||
to install the proper database connector suitable for your environment.
|
||||
You need to install `sope49-gdl1-postgresql` for the PostgreSQL database
|
||||
system, `sope49-gdl1-mysql` for MySQL or `sope49-gdl1-oracle` for Oracle.
|
||||
The installation command will thus look like this:
|
||||
system, `sope49-gdl1-mysql` for MariaDB/MySQL or `sope49-gdl1-oracle`
|
||||
for Oracle. The installation command will thus look like this:
|
||||
|
||||
yum install sope49-gdl1-postgresql
|
||||
|
||||
@@ -437,8 +440,8 @@ Defaults to `300`.
|
||||
|
||||
|S |SOGoAuthenticationType
|
||||
|Parameter used to define the way by which users will be authenticated.
|
||||
For C.A.S., specify `cas`. For SAML2, specify `saml2`. For anything
|
||||
else, leave that value empty.
|
||||
For C.A.S., specify `cas`. For SAML2, specify `saml2`. For opendID Connect, specify `openid`.
|
||||
For anything else, leave that value empty.
|
||||
|
||||
|S |SOGoTrustProxyAuthentication
|
||||
|Parameter used to set whether HTTP username should be trusted.
|
||||
@@ -477,6 +480,25 @@ example.
|
||||
|
||||
Defaults to `YES` when unset.
|
||||
|
||||
|S |SOGoCalendarEnableJitsiLink
|
||||
|Parameter allowing users to create Jitsi link when creating an event.
|
||||
Be aware that a least one of the attendees will need an account from a
|
||||
platform that Jitsi supports: Google, Facebook or Github
|
||||
|
||||
Defaults to `NO` when unset.
|
||||
|
||||
|D |SOGoCalendarJitsiBaseUrl
|
||||
|Only used if SOGoCalendarEnableJitsiLink is set to YES. String for the URL of
|
||||
the jitsi server used for creating the meeting link.
|
||||
|
||||
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
|
||||
|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
|
||||
@@ -530,6 +552,10 @@ This could be `America/New_York`, `Europe/Berlin`, `Asia/Tokyo` or
|
||||
|
||||
In our example, we set the time zone to `America/Montreal`.
|
||||
|
||||
|D |SOGoMailDisableXForward
|
||||
|Parameter used to prevent sogo from adding the mail header X-Forward that
|
||||
contains the user ip. Set to 'YES' to disable this header. Default to 'NO'.
|
||||
|
||||
|D |SOGoMailDomain
|
||||
|Parameter used to set the default domain name used by SOGo. SOGo uses
|
||||
this parameter to build the list of valid email addresses for users.
|
||||
@@ -802,12 +828,25 @@ Default value is `YES`, or enabled.
|
||||
authentication and global address books. Multiple sources can be
|
||||
specified as an array of dictionaries.
|
||||
|
||||
|S |SOGoForbidUnknownDomainsAuth
|
||||
|Boolean. If set to `YES`, prevent user that try to connect with an unknown domain.
|
||||
The known domains are set in parameter `SOGoDomainAllowed` and/or the domains listed in a <<multi-domains-configuration, Multi-domains Configuration>>. Default value is `NO`.
|
||||
|
||||
Obiously, if your users can connect without specifying a domain, let this parameter to `NO`.
|
||||
|
||||
|S |SOGoDomainAllowed
|
||||
|Parameter used to define which domains SOGo should allowed during a connection request. This parameter is an array of strings.
|
||||
|
||||
|
||||
|S |SOGoPasswordRecoveryEnabled
|
||||
|Boolean enable password recovery with secret question or secondary e-mail. Default value is `NO`.
|
||||
|
||||
|S |SOGoPasswordRecoveryDomains
|
||||
|List of domains where password recovery is enabled, for example `(example.org, example.net)`. If empty array `()`, disabled for all domains. If not set, enabled for all domains.
|
||||
|
||||
|D |SOGoPasswordRecoveryFrom
|
||||
|From email when `SOGoPasswordRecoverySecondaryEmail` is set and no user domain is defined - otherwise it will use noreply@foo.bar where foo.bar is the selected user domain. Default value is `noreply@domain.com`.
|
||||
|
||||
|U |SOGoPasswordRecoveryMode
|
||||
|User password recovery mode. Values can be `Disabled`, `SecretQuestion` or `SecondaryEmail`.
|
||||
|
||||
@@ -827,19 +866,114 @@ specified as an array of dictionaries.
|
||||
|Disable identity creation for users in preferences. If `YES`, users won't be able to add new identities and will allow to change only full name, signature and default identity. Default value is `NO`. Note : If this settings is set to `YES`, it will not be possible to crete auxiliary mail accounts.
|
||||
|
||||
|S |SOGoURLEncryptionEnabled
|
||||
|Enable URL encryption to make SOGo GDPR compatible. Setting this parameter to `YES` will encrypt username in URL. The encryption data are cached to avoid high cpu usage, ig the value of thie parameter is changed, memcached server needs to be restarted. If the encryption is enabled, the DAV url will change. Default value is `NO`.
|
||||
|Enable URL encryption to make SOGo GDPR compatible. Setting this parameter to `YES` will encrypt username in URL. The encryption data are cached to avoid high cpu usage, if the value of thie parameter is changed, memcached server needs to be restarted. Default value is `NO`.
|
||||
|
||||
|S |SOGoURLEncryptionPassphrase
|
||||
|Passphrase for `SOGoURLEncryptionEnabled`. The string must be 128 bits (16 characters). If this settings change, the cache server must be restarted, and the DAV url will change. Default value is `SOGoSuperSecret0`.
|
||||
|
||||
|S |SOGoGlobalAddressBookFirstEntries
|
||||
|Display first entries in Global Address Book. Default value is `NO`. If source is LDAP, the LDAP overlay `sssvlv` must be enabled on the system for server side sorting.
|
||||
|
||||
|S |SOGoGlobalAddressBookFirstEntriesCount
|
||||
|Number of entries displayed when `SOGoGlobalAddressBookFirstEntries` is enabled. Default value is `100`.
|
||||
|D |SOGoForceRawHtmlSignature
|
||||
|Add `<div class="raw-html-embed sogo-raw-html-embed">` around signature to avoid CKEditor 5 modifying HTML code and breaking signature (https://bugs.sogo.nu/view.php?id=5920). Default value is `YES` (tag is added).
|
||||
|
||||
|=======================================================================
|
||||
|
||||
|
||||
[[Secret-for-sensitive-data]]
|
||||
|
||||
Secret for sensitive data
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
_Since 5.10_
|
||||
|
||||
SOGo can store sensitive data in its database. In default behavior, SOGo will not do anything and store them in plain text.
|
||||
Starting with 5.10, you can now set a secret for SOGo to encrypt this data in database.
|
||||
The encryption method is AES-GCM with a 256 bits key.
|
||||
|
||||
Two parameters in your sogo.conf are needed to do that
|
||||
|
||||
[cols="^4,46,50a"]
|
||||
|=======================================================================
|
||||
|
||||
|S |SOGoSecretType
|
||||
|Parameter to define what kind is the secret: 'plain' to directly put the secret in _SOGoSecretValue_, 'env'
|
||||
to put the name of a environment variable in _SOGoSecretValue_ or 'none' to not use any secret.
|
||||
For now, it is only used to encrypt/decrypt auxiliary account's password. the secret must be
|
||||
256 bits long i.e. 32 utf8 chars string.
|
||||
|
||||
Defaults to 'none' when unset
|
||||
|
||||
|S |SOGoSecretValue
|
||||
|Parameter used whenever SOGo need a secret to encrypt/decrypt. For now,
|
||||
only for password of auxiliary accounts. If _SOGoSecretType_ is 'plain',
|
||||
directly put the secret here. if _SOGoSecretType_ is 'env', put the name
|
||||
of the environment variable here. Must be set with _SOGoSecretType_.
|
||||
If _SOGoSecretType_ is not 'none', sogo won't start is the value is unfetchable or incorrect
|
||||
|
||||
There is no default value
|
||||
|
||||
|=======================================================================
|
||||
|
||||
If you want to use an environment variable, set:
|
||||
----
|
||||
SOGoSecretType = "env";
|
||||
SOGoSecretValue = "SOGO_SECRET";
|
||||
----
|
||||
SOGO_SECRET must be an environment variable containing a 32 chars (256 bits) string. Note that SOGO_SECRET must be accessible
|
||||
to the unix user 'sogo'. If you use sogo with systemd or init.d, be sure your process have access to that environment variable.
|
||||
|
||||
If you want to directly put the secret in your sogo.conf:
|
||||
----
|
||||
SOGoSecretType = "plain";
|
||||
SOGoSecretValue = "secret_is_a_32_characters_string";
|
||||
----
|
||||
|
||||
*Note that if _SOGoSecretType_ is set to something different than 'none', sogo will check the secret and won't start if it is not ok.
|
||||
The reason will be given in the log (size, can't found the env...)*
|
||||
|
||||
If you want to use a secret for the first time or change the secret. There is a a _sogo-tool_ command to encrypt all
|
||||
your sensitive data. Check the doc of _<<sogo-tool-update-secret,sogo-tool update-secret>>_
|
||||
|
||||
**How to use a secret for the first time?**
|
||||
|
||||
- Stop sogo
|
||||
- Modify your sogo.conf to add your secret
|
||||
- Use the sogo-tool command to encrypt all sensitive data that are already in your database
|
||||
----
|
||||
sogo-tool update-secret -n myNewSecret
|
||||
----
|
||||
- Restart sogo
|
||||
|
||||
**How to change the value of the secret?**
|
||||
|
||||
- Stop sogo
|
||||
- Modify your sogo.conf to modify your secret
|
||||
- Use the sogo-tool command to encrypt all sensitive data with the new secret, you will need to pass your current secret too.
|
||||
----
|
||||
sogo-tool update-secret -n myNewSecret -p myCurrentSecret
|
||||
----
|
||||
- Restart sogo
|
||||
|
||||
**I can't stop sogo in my environement**
|
||||
|
||||
In that case, simply modify the sogo.conf and use the sogo-tool. If you're unluncky, a user would have made
|
||||
a request that will encrypt its data without the correct secret at the same time you run sogo-tool.
|
||||
If that's the case, the wrong behavior and their solution are listed below.
|
||||
|
||||
**Unexpected behavior**
|
||||
|
||||
Be aware that it must have a synchronisation between the secret in your sogo.conf and the sensitive data in your database. Meaning if the
|
||||
data is not encrypted with the correct secret, some wrong behavior can happens. There are listed here as well as their solution.
|
||||
|
||||
As for now, it only affects the IMAP's passwords of auxiliary accounts and here the unexpected behavior in case of mismatch of secret are:
|
||||
|
||||
- *The auxiliary account of the user is correctly set but it can't see any mail folders*: The user will have to go to preferences -> mail -> imap accounts.
|
||||
Then it simply has to edit its account, put its password again and save the preferences. The password will be correctly encrypted then.
|
||||
- *the user has errors and blank pages*: Should not happen, please open a ticket. But, if it does, do this to unstuck the user:
|
||||
----
|
||||
sogo-tool user-preferences unset default <user> AuxiliaryMailAccounts
|
||||
----
|
||||
user being the full mail address or just the username if domainless. After that, the user will have to set its auxiliary accounts again.
|
||||
|
||||
|
||||
Authentication using LDAP
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
@@ -1164,14 +1298,21 @@ Defaults to `NO` when unset.
|
||||
(with read-only access). Note that if set to `NO`, autocompletion will
|
||||
not work for entries in this source and thus, freebusy lookups.
|
||||
|
||||
!displayName (optional)
|
||||
!If set as an address book, the human identification name of the LDAP
|
||||
|displayName (optional)
|
||||
|If set as an address book, the human identification name of the LDAP
|
||||
repository
|
||||
|
||||
|listRequiresDot (optional)
|
||||
|If set to `YES`, listing of this LDAP source is only possible when performing a search (respecting the SOGoSearchMinimumWordLength parameter) or when explicitly typing a single dot.
|
||||
Defaults to `YES` when unset.
|
||||
|
||||
|globalAddressBookFirstEntriesCount (optional)
|
||||
|Number of entries displayed when `listRequiresDot` is enabled. Default value is `-1` (all records / equals to SOGoLDAPQueryLimit). This parameter must be less or equal to SOGoLDAPQueryLimit. If source is LDAP, the LDAP overlay sssvlv must be enabled on the system for server side sorting.
|
||||
|
||||
|disableSubgroups (optional)
|
||||
|If set to `YES`, disable recursive search. Consider this option when groups have the same name than a member (https://bugs.sogo.nu/view.php?id=5913).
|
||||
Defaults to `NO` when unset.
|
||||
|
||||
|ModulesConstraints (optional)
|
||||
|Limits the access of any module through a constraint based on an LDAP
|
||||
attribute; must be a dictionary with keys `Mail`, and/or `Calendar`,
|
||||
@@ -1425,6 +1566,81 @@ SOGoIMAPCASServiceName should be set to the actual imap service name
|
||||
expected by pam_cas, otherwise it will fail to authenticate incoming
|
||||
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
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
@@ -1467,7 +1683,7 @@ appointments, tasks and contacts information. It also uses the database
|
||||
system to store personal preferences of SOGo users. In this guide, we
|
||||
assume you use PostgreSQL so commands provided the create the database
|
||||
are related to this application. However, other database servers are
|
||||
supported, such as MySQL and Oracle.
|
||||
supported, such as MariaDB, MySQL and Oracle.
|
||||
|
||||
First, make sure that your PostgreSQL server has TCP/IP connections
|
||||
support enabled.
|
||||
@@ -1532,7 +1748,7 @@ The following table describes the parameters that were set:
|
||||
|Parameter used to set the database URL so that SOGo can retrieve user
|
||||
profiles.
|
||||
|
||||
For MySQL, set the database URL to something like:
|
||||
For MariaDB/MySQL, set the database URL to something like:
|
||||
`mysql://sogo:sogo@127.0.0.1:3306/sogo/sogo_user_profile`.
|
||||
|
||||
|S |OCSFolderInfoURL
|
||||
@@ -1557,6 +1773,9 @@ URL could be set to something like:
|
||||
|
||||
See the "EMail reminders" section in this document for more information.
|
||||
|
||||
|S |SOGoEnableMailCleaning
|
||||
|Parameter used to enable cleaning folders and mailbox (remove mail older than X days). Default value is `NO`.
|
||||
|
||||
|S |SOGoDisableOrganizerEventCheck
|
||||
|Parameter used to disable organizer's calendar event check
|
||||
|
||||
@@ -1585,6 +1804,14 @@ if you set this parameter.
|
||||
|
||||
For PostgresSQL, set the database URL to something like:
|
||||
`postgresql://sogo:sogo@127.0.0.1:5432/sogo/sogo_cache_folder`.
|
||||
|
||||
|S |OCSAdminURL
|
||||
|Parameter used to set the database URL so that SOGo can use to store
|
||||
all administration elements.
|
||||
|
||||
For PostgresSQL, set the database URL to something like:
|
||||
`postgresql://sogo:sogo@127.0.0.1:5432/sogo/sogo_admin`.
|
||||
|
||||
|=======================================================================
|
||||
|
||||
|
||||
@@ -1598,7 +1825,8 @@ In addition to the seven tables described above, two other tables get
|
||||
created in the database: `sogo_quick_appointment` and `sogo_quick_contact`
|
||||
which store calendar and contact information.
|
||||
|
||||
If you're using MySQL, make sure in your `my.cnf` file you have:
|
||||
If you're using MariaDB/MySQL, make sure in your `my.cnf` file you
|
||||
have:
|
||||
|
||||
----
|
||||
[mysqld]
|
||||
@@ -1613,12 +1841,27 @@ default-character-set=utf8
|
||||
default-character-set=utf8
|
||||
----
|
||||
|
||||
MySQL complete Unicode compliance
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
MariaDB/MySQL SSL Connection
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
By default MySQL only supports a subset of UTF-8, meaning that characters such
|
||||
as emoji are not handled properly. Some extra steps at installation can be
|
||||
undertaken to leverage full Unicode support under MySQL.
|
||||
Add the following settings in the `sogo.conf` file to enable SSL connection
|
||||
between SOGo and MariaDB/MySQL :
|
||||
|
||||
----
|
||||
MySQL4SSLEnabled = YES;
|
||||
MySQL4SSLKeyPath = "/mysql_keys/client-key.pem";
|
||||
MySQL4SSLCertPath = "/mysql_keys/client-cert.pem";
|
||||
MySQL4SSLCaPath = "/mysql_keys/ca-cert.pem";
|
||||
----
|
||||
|
||||
|
||||
MariaDB/MySQL complete Unicode compliance
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
By default MariaDB/MySQL only supports a subset of UTF-8, meaning that
|
||||
characters such as emoji are not handled properly. Some extra steps at
|
||||
installation can be undertaken to leverage full Unicode support under
|
||||
MariaDB/MySQL.
|
||||
|
||||
IMPORTANT: Switching to complete Unicode compliance on an already-deployed SOGo
|
||||
is out of scope of this document, as it would typically involve delicate manual
|
||||
@@ -1626,10 +1869,11 @@ operations on the database system.
|
||||
|
||||
Requirements:
|
||||
|
||||
* MariaDB >= 5.5
|
||||
* MySQL >= 5.5
|
||||
* SOGo >= 3.1.0
|
||||
|
||||
Strongly suggested MySQL configuration settings (innodb* parameters are
|
||||
Strongly suggested MariaDB/MySQL configuration settings (innodb* parameters are
|
||||
mandatory *only* for versions lower than 8.0):
|
||||
|
||||
----
|
||||
@@ -1649,8 +1893,8 @@ innodb_large_prefix = TRUE # MySQL < 8.0 only
|
||||
----
|
||||
|
||||
CAUTION: Changing InnoDB parameters on an already deployed database server can
|
||||
cause severe data loss. Do not blindly edit MySQL parameters without reading
|
||||
and understanding the implication of such changes.
|
||||
cause severe data loss. Do not blindly edit MariaDB/MySQL parameters without
|
||||
reading and understanding the implication of such changes.
|
||||
|
||||
A parameter must be added to `sogo.conf` to turn on complete Unicode
|
||||
compliance:
|
||||
@@ -1670,8 +1914,8 @@ a command such as:
|
||||
mysql -hHOST -uUSER -p -D SOGO < Scripts/mysql-utf8mb4.sql
|
||||
----
|
||||
|
||||
Where `HOST`, `USER` and `SOGO` are your MySQL host, username and database name
|
||||
respectively.
|
||||
Where `HOST`, `USER` and `SOGO` are your MariaDB/MySQL host, username and
|
||||
database name respectively.
|
||||
|
||||
Once SOGo is running, you can test correctness by creating an event such as
|
||||
“Lunch with 🍕 and fries” and seeing it properly displayed in the SOGo
|
||||
@@ -1719,11 +1963,12 @@ they have the same name as popular LDAP attributes (such as `givenName`,
|
||||
|
||||
|userPasswordPolicy
|
||||
|
||||
|An array of dictionaries that define regular expressions used to determine whether a new password
|
||||
is valid.
|
||||
|An array of dictionaries that define regular expressions used to determine
|
||||
whether a new password is valid.
|
||||
|
||||
Each dictionary must contain the key "regex" associated to a string representing a regular
|
||||
expression. It can also contain the key "label" to briefly describe the constraint to the user. Example:
|
||||
Each dictionary must contain the key "regex" associated to a string
|
||||
representing a regular expression. It can also contain the key "label" to
|
||||
briefly describe the constraint to the user. Example:
|
||||
|
||||
----
|
||||
userPasswordPolicy = (
|
||||
@@ -1950,8 +2195,7 @@ To disable TLS verification for localhost domains, add
|
||||
|
||||
|D |SOGoSMTPAuthenticationType
|
||||
|Activate SMTP authentication and specifies which type is in use.
|
||||
Current, only `PLAIN` is supported and other values will cause
|
||||
the authentication to fail.
|
||||
Current, Are supported `PLAIN` and 'xoauth2' for openid.
|
||||
|
||||
|D |SOGoSMTPMasterUserEnabled
|
||||
|Enable specific SMTP user account for system e-mails (notifications, reminders, ...). Default is `NO`.
|
||||
@@ -2134,6 +2378,7 @@ SASL mechanism. Using `AUTHENTICATE` instead of `LOGIN` is also necessary
|
||||
to enable UTF-8 characters in users' passwords. To enable simple use of
|
||||
`AUTHENTICATE` for this purpose, set this setting to `plain`. Please note
|
||||
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
|
||||
|Prefix to prepend to names in IMAP ACL transactions, to indicate the
|
||||
@@ -2280,6 +2525,16 @@ appended to the user's vacation message. For example:
|
||||
|
||||
See `SOGoVacationHeaderTemplateFile` for available template variables.
|
||||
|
||||
|D |SOGoVacationAllowZeroDays
|
||||
|Parameter used to enable an option of 0 for the vacation days setting.
|
||||
A value of 0 means that auto response mails are sent for every incoming mail.
|
||||
|
||||
This option has to be supported by the IMAP host
|
||||
(see https://doc.dovecot.org/2.3/settings/pigeonhole-ext/vacation/#pigeonhole_setting-sieve_vacation_min_period
|
||||
for instructions regarding Dovecot/Pigeonhole).
|
||||
|
||||
Defaults to `NO` when unset.
|
||||
|
||||
|D |SOGoForwardEnabled
|
||||
|Parameter used to activate the edition from the preferences window of a
|
||||
forwarding email address. Requires Sieve script support on the IMAP
|
||||
@@ -2504,7 +2759,7 @@ Defaults to `inline` when unset.
|
||||
|Show recipients or sender full email in mailboxes if set to `YES`. Default value is `NO`.
|
||||
|
||||
|U |SOGoMailHideInlineAttachments
|
||||
|Hide inline message as attachements if set to `YES`. Default value is `NO`.
|
||||
|Hide attachments for inline images if set to `YES`. Default value is `NO`.
|
||||
|
||||
|
||||
|U |SOGoMailCustomFullName
|
||||
@@ -2694,6 +2949,8 @@ like this:
|
||||
}
|
||||
----
|
||||
|
||||
[[multi-domains-configuration]]
|
||||
|
||||
Multi-domains Configuration
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
@@ -3087,9 +3344,9 @@ instructions. On the SOGo side, _SOGoEnablePublicAccess_ must be set to
|
||||
need to adjust the word size of your IMAP server. In Dovecot, the parameter
|
||||
to increase is "imap_max_line_length" while under Cyrus IMAP Server, the
|
||||
parameter is "maxword". We suggest a buffer of 2MB.
|
||||
* If you are using MySQL, make sure you set "max_allowed_packet" to a large value
|
||||
since the EAS cache size can be large for mailboxes with thousands of messages.
|
||||
A 64M or even 128M value is recommended.
|
||||
* If you are using MariaDB/MySQL, make sure you set "max_allowed_packet" to a
|
||||
large value since the EAS cache size can be large for mailboxes with thousands
|
||||
of messages. A 64M or even 128M value is recommended.
|
||||
|
||||
In order to use the SOGo ActiveSync support code in production
|
||||
environments, you need to get a proper usage license from Microsoft.
|
||||
@@ -3455,6 +3712,22 @@ sogo-tool checkup 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
|
||||
~~~~~~~~~~~~~~~~~
|
||||
|
||||
@@ -3678,6 +3951,7 @@ Two contacts are considered duplicates when they have the same mails or display
|
||||
are duplicates, each one will get a score. The ones with the highest score will be kept and the others
|
||||
will be discarded. If two records have the same score, the first one to have reach it will be kept.
|
||||
The scores are distributed as such:
|
||||
|
||||
* Record which has been the last modified: +1
|
||||
* Record has the most content: +2
|
||||
* Record has the most quick field set: +3
|
||||
@@ -3756,6 +4030,37 @@ Example:
|
||||
sogo-tool update-autoreply -p /var/sogo/cred
|
||||
----
|
||||
|
||||
|
||||
[[sogo-tool-update-secret]]
|
||||
|
||||
|
||||
sogo-tool update-secret
|
||||
~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
_New in 5.10_
|
||||
|
||||
Please read this section before <<Secret-for-sensitive-data, Secret for sensitive data>>
|
||||
|
||||
This command will encrypt/decrypt sensitive data in your database. For now it only affects the IMAP's passwords of auxiliary account.
|
||||
A secret is a 32 chars utf-8 string (256 bits). Be careful, the secret use here must match the secret of _SOGoSecretValue_.
|
||||
|
||||
sogo-tool update-secret -n newSecret -o oldSecret
|
||||
|
||||
If your data are still plain and you want to encrypt them, use:
|
||||
----
|
||||
sogo-tool update-secret -n myNewSecret
|
||||
----
|
||||
|
||||
If your data are already encrypted with 'oldSecret' but you want to encrypt them with a new secret value 'myNewSecret':
|
||||
----
|
||||
sogo-tool update-secret -n myNewSecret -o oldSecret
|
||||
----
|
||||
|
||||
If your data are already encrypted with 'oldSecret' but you want to decrypt them to plain data:
|
||||
----
|
||||
sogo-tool update-secret -o oldSecret
|
||||
----
|
||||
|
||||
sogo-tool user-preferences
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
@@ -3770,7 +4075,7 @@ _Defaults_ stores all parameters that can be found in Preferences panel. So it g
|
||||
autoreply to many others options.
|
||||
|
||||
|
||||
user-preferences get|set|unset defaults|settings user key [value|-f filename] [-p credentialFile]
|
||||
user-preferences get|set|unset defaults|settings user key [value|-f filename] [-p credentialFile [-F]]
|
||||
|
||||
* First argument is the action *get*, *set* or *unset*
|
||||
* Second argument is parameter type *settings* or *defaults*
|
||||
@@ -3778,7 +4083,8 @@ autoreply to many others options.
|
||||
* Fourth argument *key* is the name of the parameters where to make the action
|
||||
* If the action is *set*, you should provide either *value* as fifth argument or a file with the value inside with *-f* filename/path
|
||||
* If the action is *set* or *unset* and the *key* concerns a sieve script (filter, vacation, forward...), you
|
||||
should provide a credential file, a one-line file that contains "username:password" of an admin account of your imap/sieve server.
|
||||
should provide a credential file, a one-line file that contains "username:password" of an admin account of your imap/sieve server. If you
|
||||
want t oforce the sieve script activation add -F after.
|
||||
|
||||
As there is a lot of parameters, this documentation will not go into details for each one. To know what are
|
||||
the key names and their value you should got to your database in table defined by _SOGoProfileURL_ in your sogo.conf.
|
||||
@@ -3807,7 +4113,7 @@ sogo-tool user-preferences unset defaults user1 Forward -p /etc/sogo/cred
|
||||
|
||||
*set* action:
|
||||
----
|
||||
sogo-tool user-preferences set defaults user1 Forward '{"forwardAddress":["sogo-tests2@sogo.alinto"],"enabled":1,"keepCopy":0}' -p cred
|
||||
sogo-tool user-preferences set defaults user1 Forward '{"forwardAddress":["sogo-tests2@sogo.alinto"],"enabled":1,"keepCopy":0}' -p cred -F
|
||||
----
|
||||
or create a json file which contains _{"forwardAddress":["sogo-tests2@sogo.alinto"],"enabled":1,"keepCopy":0}_ then:
|
||||
----
|
||||
@@ -3825,6 +4131,9 @@ current version of SOGo from the previous release.
|
||||
[cols="100a"]
|
||||
|=======================================================================
|
||||
|
||||
h|5.11
|
||||
|Parameters `SOGoGlobalAddressBookFirstEntries` and `SOGoGlobalAddressBookFirstEntriesCount` has been removed. Please use `listRequiresDot` and `globalAddressBookFirstEntriesCount` instead. Signature are now between a div tag to avoid CKEditor changing the content - set `SOGoForceRawHtmlSignature` to `NO` to leave signature (https://bugs.sogo.nu/view.php?id=5920).
|
||||
|
||||
h|5.9.0
|
||||
|Run the shell script `sql-update-5.8.4_to_5.9.0.sh` (if you are using MySQL). This will change the `c_defaults` to `MEDIUMTEXT`.
|
||||
|
||||
|
||||
@@ -9,6 +9,7 @@ SUBPROJECTS = \
|
||||
SoObjects \
|
||||
Main \
|
||||
UI \
|
||||
API \
|
||||
Tools \
|
||||
Tests/Unit \
|
||||
|
||||
|
||||
+43
-20
@@ -288,16 +288,16 @@ static BOOL debugLeaks;
|
||||
|
||||
e = [urlStrings objectEnumerator];
|
||||
while (ok && (tmp = [e nextObject]))
|
||||
{
|
||||
value = [defaults stringForKey: tmp];
|
||||
if (value)
|
||||
[self _checkTableWithCM: cm tableURL: value andType: tmp];
|
||||
else
|
||||
{
|
||||
value = [defaults stringForKey: tmp];
|
||||
if (value)
|
||||
[self _checkTableWithCM: cm tableURL: value andType: tmp];
|
||||
else
|
||||
{
|
||||
[self errorWithFormat: @"No value specified for '%@'", tmp];
|
||||
ok = NO;
|
||||
}
|
||||
[self errorWithFormat: @"No value specified for '%@'", tmp];
|
||||
ok = NO;
|
||||
}
|
||||
}
|
||||
|
||||
if (combined)
|
||||
{
|
||||
@@ -314,14 +314,23 @@ static BOOL debugLeaks;
|
||||
{
|
||||
fm = [GCSFolderManager defaultFolderManager];
|
||||
|
||||
// Create the sessions table
|
||||
[[fm adminFolder] createFolderIfNotExists];
|
||||
|
||||
// Create the sessions table
|
||||
[[fm sessionsFolder] createFolderIfNotExists];
|
||||
|
||||
// Create the email alarms table, if required
|
||||
if ([defaults enableEMailAlarms])
|
||||
{
|
||||
[[fm alarmsFolder] createFolderIfNotExists];
|
||||
}
|
||||
{
|
||||
[[fm alarmsFolder] createFolderIfNotExists];
|
||||
}
|
||||
|
||||
//Create mandatory openId table, if used
|
||||
if([defaults hasOpenIdType])
|
||||
{
|
||||
[[fm openIdFolder] createFolderIfNotExists];
|
||||
}
|
||||
}
|
||||
|
||||
return ok;
|
||||
@@ -351,7 +360,6 @@ static BOOL debugLeaks;
|
||||
authenticator = [SOGoWebAuthenticator sharedSOGoWebAuthenticator];
|
||||
else {
|
||||
authenticator = [SOGoDAVAuthenticator sharedSOGoDAVAuthenticator];
|
||||
[authenticator setContext: context];
|
||||
}
|
||||
|
||||
}
|
||||
@@ -368,10 +376,19 @@ static BOOL debugLeaks;
|
||||
id userFolder;
|
||||
NSData *decodedLogin;
|
||||
NSString *login;
|
||||
|
||||
login = [SOGoUser getDecryptedUsernameIfNeeded: _key withContext: _ctx];
|
||||
|
||||
user = [SOGoUser userWithLogin: login roles: nil];
|
||||
WORequest *request;
|
||||
|
||||
request = [_ctx request];
|
||||
login = [SOGoUser getDecryptedUsernameIfNeeded: _key request: request];
|
||||
if([login isEqualToString: @"changeLanguage"])
|
||||
user = nil;
|
||||
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];
|
||||
}
|
||||
if (user)
|
||||
userFolder = [$(@"SOGoUserFolder") objectWithName: login
|
||||
inContainer: self];
|
||||
@@ -400,7 +417,7 @@ static BOOL debugLeaks;
|
||||
{
|
||||
id obj;
|
||||
WORequest *request;
|
||||
BOOL isDAVRequest;
|
||||
BOOL isDAVRequest, isAPIRequest;
|
||||
SOGoSystemDefaults *sd;
|
||||
|
||||
/* put locale info into the context in case it's not there */
|
||||
@@ -408,8 +425,14 @@ static BOOL debugLeaks;
|
||||
|
||||
sd = [SOGoSystemDefaults sharedSystemDefaults];
|
||||
request = [_ctx request];
|
||||
isAPIRequest = [[request requestHandlerKey] isEqualToString:@"SOGoAPI"];
|
||||
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)
|
||||
{
|
||||
@@ -439,7 +462,7 @@ static BOOL debugLeaks;
|
||||
{
|
||||
obj = [self lookupUser: _key inContext: _ctx];
|
||||
if (!obj && ![_key isEqualToString: @"public"])
|
||||
obj = [self lookupUser: @"anonymous" inContext: _ctx];
|
||||
obj = [self lookupUser: @"anonymous" inContext: _ctx];
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -479,7 +502,7 @@ static BOOL debugLeaks;
|
||||
|
||||
- (void) checkIfDaemonHasToBeShutdown
|
||||
{
|
||||
unsigned int vmem;
|
||||
unsigned long long vmem;
|
||||
|
||||
if (vMemSizeLimit > 0)
|
||||
{
|
||||
|
||||
+10
-1
@@ -48,7 +48,16 @@ main (int argc, char **argv, char **env)
|
||||
rc = 0;
|
||||
sd = [SOGoSystemDefaults sharedSystemDefaults];
|
||||
[NSTimeZone setDefaultTimeZone: [sd timeZone]];
|
||||
WOWatchDogApplicationMain (@"SOGo", argc, (void *) argv);
|
||||
//Check if sogo secret is set and correct
|
||||
if([sd isSogoSecretSet] && ![sd sogoSecretValue])
|
||||
{
|
||||
rc =-1;
|
||||
NSLog (@"Sogo secret is not correctly set");
|
||||
}
|
||||
else
|
||||
{
|
||||
WOWatchDogApplicationMain (@"SOGo", argc, (void *) argv);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
@@ -27,6 +27,10 @@ The source code of the SOGo Connector extension for Thunderbird 78+ can be obtai
|
||||
|
||||
Please refer to the [FAQ](https://sogo.nu/support.html#/faq) for [compilation instructions](https://sogo.nu/support/faq/how-do-i-compile-sogo.html).
|
||||
|
||||
## Dev Container
|
||||
|
||||
A dev container is available to use, read more there [read more there](.devcontainer/readme.md)
|
||||
|
||||
## Translations
|
||||
|
||||
SOGo and its associated components are available in various languages. The following list describes the official translations alongside their maintainers:
|
||||
|
||||
@@ -0,0 +1,53 @@
|
||||
/* 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 GCSALARMSFOLDER_H
|
||||
#define GCSALARMSFOLDER_H
|
||||
|
||||
|
||||
@class NSCalendarDate;
|
||||
@class NSException;
|
||||
@class NSNumber;
|
||||
@class NSString;
|
||||
|
||||
@class GCSFolderManager;
|
||||
|
||||
@interface GCSAdminFolder : NSObject
|
||||
{
|
||||
GCSFolderManager *folderManager;
|
||||
}
|
||||
|
||||
+ (id)adminFolderWithFolderManager:(GCSFolderManager *)newFolderManager;
|
||||
|
||||
- (void) setFolderManager: (GCSFolderManager *) newFolderManager;
|
||||
|
||||
/* operations */
|
||||
|
||||
- (NSString *)getMotd;
|
||||
|
||||
- (void) createFolderIfNotExists;
|
||||
- (BOOL) canConnectStore;
|
||||
|
||||
- (NSException *)writeMotd:(NSString *)motd;
|
||||
- (NSException *)deleteMotd;
|
||||
|
||||
@end
|
||||
|
||||
#endif /* GCSALARMSFOLDER_H */
|
||||
@@ -0,0 +1,347 @@
|
||||
/* 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 "GCSAdminFolder.h"
|
||||
|
||||
static NSString *adminFolderURLString = nil;
|
||||
|
||||
#warning GCSAdminFolder should share a common ancestor with GCSFolder
|
||||
|
||||
@implementation GCSAdminFolder
|
||||
|
||||
+ (void) initialize
|
||||
{
|
||||
NSUserDefaults *ud;
|
||||
|
||||
if (!adminFolderURLString)
|
||||
{
|
||||
ud = [NSUserDefaults standardUserDefaults];
|
||||
ASSIGN (adminFolderURLString,
|
||||
[ud stringForKey: @"OCSAdminURL"]);
|
||||
}
|
||||
}
|
||||
|
||||
+ (id) adminFolderWithFolderManager: (GCSFolderManager *) newFolderManager
|
||||
{
|
||||
GCSAlarmsFolder *newFolder;
|
||||
|
||||
if (adminFolderURLString)
|
||||
{
|
||||
newFolder = [self new];
|
||||
[newFolder autorelease];
|
||||
[newFolder setFolderManager: newFolderManager];
|
||||
}
|
||||
else
|
||||
{
|
||||
[self errorWithFormat: @"'OCSAdminURL' is not set"];
|
||||
newFolder = nil;
|
||||
}
|
||||
|
||||
return newFolder;
|
||||
}
|
||||
|
||||
- (void) setFolderManager: (GCSFolderManager *) newFolderManager
|
||||
{
|
||||
ASSIGN (folderManager, newFolderManager);
|
||||
}
|
||||
|
||||
/* accessors */
|
||||
|
||||
- (NSURL *) _location
|
||||
{
|
||||
NSURL *location;
|
||||
|
||||
if (adminFolderURLString)
|
||||
location = [NSURL URLWithString: adminFolderURLString];
|
||||
else
|
||||
{
|
||||
[self warnWithFormat: @"'OCSAdminURL' 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_key", @"c_content", nil };
|
||||
NSString **column;
|
||||
NSMutableArray *keys;
|
||||
NSDictionary *types;
|
||||
|
||||
if (!entity)
|
||||
{
|
||||
entity = [EOEntity new];
|
||||
tableName = [self _storeTableName];
|
||||
[entity setName: tableName];
|
||||
[entity setExternalName: tableName];
|
||||
|
||||
types = [[tc specialQueries] adminAttributeTypes];
|
||||
|
||||
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_key"]];
|
||||
[entity setPrimaryKeyAttributes: keys];
|
||||
|
||||
keys = [NSMutableArray arrayWithCapacity: 1];
|
||||
[keys addObject: [entity attributeNamed: @"c_content"]];
|
||||
[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",
|
||||
[self _storeTableName]];
|
||||
if ([tc evaluateExpressionX: sql])
|
||||
{
|
||||
sql = [queries createAdminFolderWithName: tableName];
|
||||
if (![tc evaluateExpressionX: sql])
|
||||
[self logWithFormat:
|
||||
@"admin folder table '%@' successfully created!",
|
||||
tableName];
|
||||
}
|
||||
else
|
||||
[tc cancelFetch];
|
||||
|
||||
[self _releaseChannel: tc];
|
||||
}
|
||||
|
||||
/* operations */
|
||||
|
||||
/* table has the following fields:
|
||||
c_key VARCHAR(255) NOT NULL
|
||||
c_content MEDIUMTEXT NOT NULL
|
||||
*/
|
||||
|
||||
- (NSDictionary *) recordForEntryWithKey: (NSString *) key
|
||||
{
|
||||
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];
|
||||
qualifier = [[EOSQLQualifier alloc] initWithEntity: entity
|
||||
qualifierFormat:
|
||||
@"c_key='%@'",
|
||||
key];
|
||||
[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 *) getMotd {
|
||||
NSDictionary *r;
|
||||
|
||||
r = [self recordForEntryWithKey: @"motd"];
|
||||
if (r && [r objectForKey:@"c_content"]) {
|
||||
return [r objectForKey:@"c_content"];
|
||||
}
|
||||
|
||||
return nil;
|
||||
}
|
||||
|
||||
- (NSDictionary *) _newRecordWithKey: (NSString *) key
|
||||
content: (NSString *) content
|
||||
{
|
||||
return [NSDictionary dictionaryWithObjectsAndKeys: key, @"c_key",
|
||||
content, @"c_content",
|
||||
nil];
|
||||
}
|
||||
|
||||
- (NSException *) writeMotd: (NSString *)motd
|
||||
{
|
||||
NSDictionary *record, *newRecord;
|
||||
NSException *error;
|
||||
EOAdaptorChannel *tc;
|
||||
EOAdaptorContext *context;
|
||||
EOEntity *entity;
|
||||
EOSQLQualifier *qualifier;
|
||||
|
||||
error = nil;
|
||||
tc = [self _acquireStoreChannel];
|
||||
if (tc)
|
||||
{
|
||||
context = [tc adaptorContext];
|
||||
newRecord = [self _newRecordWithKey: @"motd" content: motd];
|
||||
record = [self recordForEntryWithKey: @"motd"];
|
||||
entity = [self _storeTableEntityForChannel: tc];
|
||||
[context beginTransaction];
|
||||
if (record)
|
||||
{
|
||||
qualifier = [[EOSQLQualifier alloc] initWithEntity: entity
|
||||
qualifierFormat:
|
||||
@"c_key='motd'"];
|
||||
[qualifier autorelease];
|
||||
error = [tc updateRowX: newRecord describedByQualifier: qualifier];
|
||||
}
|
||||
else
|
||||
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 *) deleteRecordForKey: (NSString *) key
|
||||
{
|
||||
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_key='%@'",
|
||||
key];
|
||||
[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;
|
||||
}
|
||||
|
||||
- (NSException *) deleteMotd
|
||||
{
|
||||
return [self deleteRecordForKey:@"motd"];
|
||||
}
|
||||
|
||||
@end
|
||||
@@ -202,7 +202,7 @@ static NSString *alarmsFolderURLString = nil;
|
||||
|
||||
/* table has the following fields:
|
||||
c_path VARCHAR(255) NOT NULL
|
||||
c_name VARCHAR(255) NOT NULLo
|
||||
c_name VARCHAR(255) NOT NULL
|
||||
c_uid VARCHAR(255) NOT NULL
|
||||
c_recurrence_id INT NULL
|
||||
c_alarm_number INT NOT NULL
|
||||
|
||||
@@ -31,7 +31,7 @@
|
||||
*/
|
||||
|
||||
@class NSString, NSArray, NSURL, NSDictionary, NSException;
|
||||
@class GCSChannelManager, GCSAlarmsFolder, GCSFolder, GCSFolderType, GCSSessionsFolder;
|
||||
@class GCSChannelManager, GCSAlarmsFolder, GCSAdminFolder, GCSFolder, GCSFolderType, GCSSessionsFolder, GCSOpenIdFolder;
|
||||
|
||||
@interface GCSFolderManager : NSObject
|
||||
{
|
||||
@@ -76,6 +76,7 @@
|
||||
|
||||
- (BOOL)folderExistsAtPath:(NSString *)_path;
|
||||
- (NSArray *)listSubFoldersAtPath:(NSString *)_path recursive:(BOOL)_flag;
|
||||
- (NSArray *)listSubFoldersAndNamesAtPath:(NSString *)_path recursive:(BOOL)_recursive;
|
||||
|
||||
- (NSDictionary *) recordAtPath: (NSString *) _path;
|
||||
- (GCSFolder *)folderAtPath:(NSString *)_path;
|
||||
@@ -89,6 +90,12 @@
|
||||
/* sessions */
|
||||
- (GCSSessionsFolder *)sessionsFolder;
|
||||
|
||||
/* admin */
|
||||
- (GCSAdminFolder *)adminFolder;
|
||||
|
||||
/* openid */
|
||||
- (GCSOpenIdFolder *) openIdFolder;
|
||||
|
||||
/* folder types */
|
||||
|
||||
- (GCSFolderType *)folderTypeWithName:(NSString *)_name;
|
||||
|
||||
@@ -37,6 +37,8 @@
|
||||
#import "GCSChannelManager.h"
|
||||
#import "EOAdaptorChannel+GCS.h"
|
||||
#import "GCSAlarmsFolder.h"
|
||||
#import "GCSAdminFolder.h"
|
||||
#import "GCSOpenIdFolder.h"
|
||||
#import "GCSFolder.h"
|
||||
#import "GCSFolderType.h"
|
||||
#import "GCSSessionsFolder.h"
|
||||
@@ -497,6 +499,18 @@ static BOOL _singleStoreMode = NO;
|
||||
return [GCSSessionsFolder sessionsFolderWithFolderManager: self];
|
||||
}
|
||||
|
||||
/* admin */
|
||||
- (GCSAdminFolder *) adminFolder
|
||||
{
|
||||
return [GCSAdminFolder adminFolderWithFolderManager: self];
|
||||
}
|
||||
|
||||
/* openId */
|
||||
- (GCSOpenIdFolder *) openIdFolder
|
||||
{
|
||||
return [GCSOpenIdFolder openIdFolderWithFolderManager: self];
|
||||
}
|
||||
|
||||
- (NSString *)generateSQLWhereForInternalNames:(NSArray *)_names
|
||||
exactMatch:(BOOL)_beExact orDirectSubfolderMatch:(BOOL)_directSubs
|
||||
{
|
||||
@@ -584,6 +598,27 @@ static BOOL _singleStoreMode = NO;
|
||||
return sql;
|
||||
}
|
||||
|
||||
- (NSString *)generateSQLPathAndNameFetchForInternalNames:(NSArray *)_names
|
||||
exactMatch:(BOOL)_beExact orDirectSubfolderMatch:(BOOL)_directSubs
|
||||
{
|
||||
/* fetches the 'path' subset for a given quick-names */
|
||||
NSMutableString *sql;
|
||||
NSString *ws;
|
||||
|
||||
ws = [self generateSQLWhereForInternalNames:_names
|
||||
exactMatch:_beExact orDirectSubfolderMatch:_directSubs];
|
||||
if ([ws length] == 0)
|
||||
return nil;
|
||||
|
||||
sql = [NSMutableString stringWithCapacity:256];
|
||||
[sql appendString:@"SELECT c_path, c_foldername FROM "];
|
||||
[sql appendString:[self folderInfoTableName]];
|
||||
[sql appendString:@" WHERE "];
|
||||
[sql appendString:ws];
|
||||
if (debugSQLGen) [self logWithFormat:@"PathFetch-SQL: %@", sql];
|
||||
return sql;
|
||||
}
|
||||
|
||||
/* handling folder names */
|
||||
|
||||
- (BOOL)_isStandardizedPath:(NSString *)_path {
|
||||
@@ -792,6 +827,72 @@ static BOOL _singleStoreMode = NO;
|
||||
return result;
|
||||
}
|
||||
|
||||
- (NSArray *)listSubFoldersAndNamesAtPath:(NSString *)_path recursive:(BOOL)_recursive{
|
||||
NSMutableArray *result;
|
||||
NSString *fname;
|
||||
NSArray *fnames, *records;
|
||||
NSString *sql;
|
||||
unsigned i, count;
|
||||
|
||||
if ((fnames = [self internalNamesFromPath:_path]) == nil) {
|
||||
[self debugWithFormat:@"got no internal names for path: '%@'", _path];
|
||||
return nil;
|
||||
}
|
||||
|
||||
sql = [self generateSQLPathAndNameFetchForInternalNames:fnames
|
||||
exactMatch:NO orDirectSubfolderMatch:(_recursive ? NO : YES)];
|
||||
if ([sql length] == 0) {
|
||||
[self debugWithFormat:@"got no SQL for names: %@", fnames];
|
||||
return nil;
|
||||
}
|
||||
|
||||
if ((records = [self performSQL:sql]) == nil) {
|
||||
[self logWithFormat:@"ERROR(%s): executing SQL failed: '%@'",
|
||||
__PRETTY_FUNCTION__, sql];
|
||||
return nil;
|
||||
}
|
||||
|
||||
if ((count = [records count]) == 0)
|
||||
return emptyArray;
|
||||
|
||||
result = [NSMutableArray arrayWithCapacity:(count > 128 ? 128 : count)];
|
||||
|
||||
fname = [self internalNameFromPath:_path];
|
||||
fname = [fname stringByAppendingString:@"/"]; /* add slash */
|
||||
for (i = 0; i < count; i++) {
|
||||
NSDictionary *record, *folderInfo;
|
||||
NSString *sname, *spath, *foldername;
|
||||
|
||||
record = [records objectAtIndex:i];
|
||||
sname = [record objectForKey:GCSPathRecordName];
|
||||
if (![sname hasPrefix:fname]) /* does not match at all ... */
|
||||
continue;
|
||||
|
||||
/* strip prefix and following slash */
|
||||
sname = [sname substringFromIndex:[fname length]];
|
||||
spath = [self pathPartFromInternalName:sname];
|
||||
|
||||
if (_recursive) {
|
||||
if ([spath length] > 0){
|
||||
foldername = [record objectForKey: @"c_foldername"];
|
||||
folderInfo = [NSDictionary dictionaryWithObjectsAndKeys: spath, @"path", foldername, @"name", nil];
|
||||
[result addObject:folderInfo];
|
||||
}
|
||||
}
|
||||
else {
|
||||
/* direct children only, so exclude everything with a slash */
|
||||
if ([sname rangeOfString:@"/"].length == 0 && [spath length] > 0)
|
||||
{
|
||||
foldername = [record objectForKey: @"c_foldername"];
|
||||
folderInfo = [NSDictionary dictionaryWithObjectsAndKeys: spath, @"path", foldername, @"name", nil];
|
||||
[result addObject:folderInfo];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
- (NSDictionary *) recordAtPath: (NSString *) _path
|
||||
{
|
||||
NSMutableString *sql;
|
||||
|
||||
@@ -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",
|
||||
[NSNumber numberWithInt:nowExpire] , @"c_access_token_expires_in",
|
||||
_refresh_token, @"c_refresh_token",
|
||||
[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
|
||||
@@ -39,8 +39,14 @@
|
||||
- (NSString *) createSessionsFolderWithName: (NSString *) tableName;
|
||||
- (NSDictionary *) sessionsAttributeTypes;
|
||||
|
||||
- (NSString *) updateCPathInFolderInfo: (NSString *) tableName
|
||||
withCPath2: (NSString *) c_path2;
|
||||
- (NSString *)createAdminFolderWithName:(NSString *)tableName;
|
||||
- (NSDictionary *)adminAttributeTypes;
|
||||
|
||||
- (NSString *)createOpenIdFolderWithName:(NSString *)tableName;
|
||||
- (NSDictionary *)openIdAttributeTypes;
|
||||
|
||||
- (NSString *) updateCPathInFolderInfo:(NSString *)tableName
|
||||
withCPath2:(NSString *)c_path2;
|
||||
|
||||
@end
|
||||
|
||||
|
||||
@@ -81,6 +81,35 @@
|
||||
return nil;
|
||||
}
|
||||
|
||||
- (NSString *) createAdminFolderWithName: (NSString *) tableName
|
||||
{
|
||||
[self subclassResponsibility: _cmd];
|
||||
|
||||
return nil;
|
||||
}
|
||||
|
||||
- (NSDictionary *) adminAttributeTypes
|
||||
{
|
||||
[self subclassResponsibility: _cmd];
|
||||
|
||||
return nil;
|
||||
}
|
||||
|
||||
- (NSString *) createOpenIdFolderWithName: (NSString *) tableName
|
||||
{
|
||||
[self subclassResponsibility: _cmd];
|
||||
|
||||
return nil;
|
||||
}
|
||||
|
||||
- (NSDictionary *) openIdAttributeTypes
|
||||
{
|
||||
[self subclassResponsibility: _cmd];
|
||||
|
||||
return nil;
|
||||
}
|
||||
|
||||
|
||||
- (NSString *) createFolderTableWithName: (NSString *) tableName
|
||||
{
|
||||
[self subclassResponsibility: _cmd];
|
||||
@@ -157,6 +186,62 @@
|
||||
return types;
|
||||
}
|
||||
|
||||
- (NSString *) createAdminFolderWithName: (NSString *) tableName
|
||||
{
|
||||
static NSString *sqlFolderFormat
|
||||
= (@"CREATE TABLE %@ ("
|
||||
@" c_key VARCHAR(255) NOT NULL,"
|
||||
@" c_content TEXT NOT NULL)");
|
||||
|
||||
return [NSString stringWithFormat: sqlFolderFormat, tableName];
|
||||
}
|
||||
|
||||
- (NSDictionary *) adminAttributeTypes
|
||||
{
|
||||
static NSMutableDictionary *types = nil;
|
||||
|
||||
if (!types)
|
||||
{
|
||||
types = [NSMutableDictionary new];
|
||||
[types setObject: @"varchar" forKey: @"c_key"];
|
||||
[types setObject: @"varchar" forKey: @"c_content"];
|
||||
}
|
||||
|
||||
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
|
||||
{
|
||||
static NSString *sqlFolderFormat
|
||||
@@ -262,6 +347,62 @@
|
||||
return types;
|
||||
}
|
||||
|
||||
- (NSString *) createAdminFolderWithName: (NSString *) tableName
|
||||
{
|
||||
static NSString *sqlFolderFormat
|
||||
= (@"CREATE TABLE %@ ("
|
||||
@" c_key VARCHAR(255) NOT NULL,"
|
||||
@" c_content MEDIUMTEXT NOT NULL)");
|
||||
|
||||
return [NSString stringWithFormat: sqlFolderFormat, tableName];
|
||||
}
|
||||
|
||||
- (NSDictionary *) adminAttributeTypes
|
||||
{
|
||||
static NSMutableDictionary *types = nil;
|
||||
|
||||
if (!types)
|
||||
{
|
||||
types = [NSMutableDictionary new];
|
||||
[types setObject: @"varchar" forKey: @"c_key"];
|
||||
[types setObject: @"varchar" forKey: @"c_content"];
|
||||
}
|
||||
|
||||
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
|
||||
{
|
||||
static NSString *sqlFolderFormat
|
||||
@@ -367,6 +508,62 @@
|
||||
return types;
|
||||
}
|
||||
|
||||
- (NSString *) createAdminFolderWithName: (NSString *) tableName
|
||||
{
|
||||
static NSString *sqlFolderFormat
|
||||
= (@"CREATE TABLE %@ ("
|
||||
@" c_key VARCHAR2(255) NOT NULL,"
|
||||
@" c_content VARCHAR2(65535) NOT NULL)");
|
||||
|
||||
return [NSString stringWithFormat: sqlFolderFormat, tableName];
|
||||
}
|
||||
|
||||
- (NSDictionary *) adminAttributeTypes
|
||||
{
|
||||
static NSMutableDictionary *types = nil;
|
||||
|
||||
if (!types)
|
||||
{
|
||||
types = [NSMutableDictionary new];
|
||||
[types setObject: @"varchar2" forKey: @"c_key"];
|
||||
[types setObject: @"varchar2" forKey: @"c_content"];
|
||||
}
|
||||
|
||||
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
|
||||
{
|
||||
static NSString *sqlFolderFormat
|
||||
|
||||
@@ -25,15 +25,17 @@ libGDLContentStore_HEADER_FILES += \
|
||||
EOAdaptorChannel+GCS.h \
|
||||
\
|
||||
GCSAlarmsFolder.h \
|
||||
GCSAdminFolder.h \
|
||||
GCSContext.h \
|
||||
GCSFieldInfo.h \
|
||||
GCSFolder.h \
|
||||
GCSFolder.h \
|
||||
GCSFolderManager.h \
|
||||
GCSFolderType.h \
|
||||
GCSChannelManager.h \
|
||||
GCSOpenIdFolder.h \
|
||||
GCSSessionsFolder.h \
|
||||
GCSSpecialQueries.h \
|
||||
GCSStringFormatter.h \
|
||||
GCSStringFormatter.h \
|
||||
|
||||
libGDLContentStore_OBJC_FILES += \
|
||||
NSURL+GCS.m \
|
||||
@@ -41,15 +43,17 @@ libGDLContentStore_OBJC_FILES += \
|
||||
EOQualifier+GCS.m \
|
||||
\
|
||||
GCSAlarmsFolder.m \
|
||||
GCSAdminFolder.m \
|
||||
GCSContext.m \
|
||||
GCSFieldInfo.m \
|
||||
GCSFolder.m \
|
||||
GCSFolder.m \
|
||||
GCSFolderManager.m \
|
||||
GCSFolderType.m \
|
||||
GCSChannelManager.m \
|
||||
GCSOpenIdFolder.m \
|
||||
GCSSessionsFolder.m \
|
||||
GCSSpecialQueries.m \
|
||||
GCSStringFormatter.m \
|
||||
GCSStringFormatter.m \
|
||||
|
||||
# framework support
|
||||
|
||||
|
||||
@@ -45,19 +45,27 @@
|
||||
[foldedString appendString: self];
|
||||
else
|
||||
{
|
||||
subStringRange = NSMakeRange (0, 75);
|
||||
[foldedString appendFormat: @"%@\r\n",
|
||||
[self substringWithRange: subStringRange]];
|
||||
subStringRange = NSMakeRange (75, 74);
|
||||
//Check if the 75th chars is a 2*16bits chars, in this case, cut one char before
|
||||
unichar c = [self characterAtIndex: 74];
|
||||
int substringCut;
|
||||
if (c >= 0xD800 && c <= 0xDBFF)
|
||||
substringCut = 74;
|
||||
else
|
||||
substringCut = 75;
|
||||
subStringRange = NSMakeRange (0, substringCut);
|
||||
[foldedString appendFormat: @"%@\r\n", [self substringWithRange: subStringRange]];
|
||||
|
||||
subStringRange = NSMakeRange (substringCut, 74);
|
||||
while ((length - subStringRange.location) > 75)
|
||||
{
|
||||
[foldedString appendFormat: @" %@\r\n",
|
||||
[self substringWithRange: subStringRange]];
|
||||
subStringRange.location += 74;
|
||||
c = [self characterAtIndex: (subStringRange.location+subStringRange.length-1)];
|
||||
if (c >= 0xD800 && c <= 0xDBFF)
|
||||
subStringRange.length--;
|
||||
[foldedString appendFormat: @" %@\r\n", [self substringWithRange: subStringRange]];
|
||||
subStringRange.location += subStringRange.length;
|
||||
}
|
||||
subStringRange.length = length - subStringRange.location;
|
||||
[foldedString appendFormat: @" %@",
|
||||
[self substringWithRange: subStringRange]];
|
||||
[foldedString appendFormat: @" %@", [self substringWithRange: subStringRange]];
|
||||
}
|
||||
|
||||
return foldedString;
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
BEGIN:VCALENDAR
|
||||
PRODID:-//Alinto//NONSGML IANA 2023c//EN
|
||||
PRODID:-//Alinto//NONSGML IANA 2024b//EN
|
||||
VERSION:2.0
|
||||
BEGIN:VTIMEZONE
|
||||
TZID:Africa/Abidjan
|
||||
LAST-MODIFIED:20230523T092157Z
|
||||
LAST-MODIFIED:20250324T091428Z
|
||||
X-LIC-LOCATION:Africa/Abidjan
|
||||
BEGIN:STANDARD
|
||||
TZNAME:GMT
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
BEGIN:VCALENDAR
|
||||
PRODID:-//Alinto//NONSGML IANA 2023c//EN
|
||||
PRODID:-//Alinto//NONSGML IANA 2024b//EN
|
||||
VERSION:2.0
|
||||
BEGIN:VTIMEZONE
|
||||
TZID:Africa/Algiers
|
||||
LAST-MODIFIED:20230523T092157Z
|
||||
LAST-MODIFIED:20250324T091428Z
|
||||
X-LIC-LOCATION:Africa/Algiers
|
||||
BEGIN:STANDARD
|
||||
TZNAME:CET
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
BEGIN:VCALENDAR
|
||||
PRODID:-//Alinto//NONSGML IANA 2023c//EN
|
||||
PRODID:-//Alinto//NONSGML IANA 2024b//EN
|
||||
VERSION:2.0
|
||||
BEGIN:VTIMEZONE
|
||||
TZID:Africa/Bissau
|
||||
LAST-MODIFIED:20230523T092157Z
|
||||
LAST-MODIFIED:20250324T091428Z
|
||||
X-LIC-LOCATION:Africa/Bissau
|
||||
BEGIN:STANDARD
|
||||
TZNAME:GMT
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
BEGIN:VCALENDAR
|
||||
PRODID:-//Alinto//NONSGML IANA 2023c//EN
|
||||
PRODID:-//Alinto//NONSGML IANA 2024b//EN
|
||||
VERSION:2.0
|
||||
BEGIN:VTIMEZONE
|
||||
TZID:Africa/Cairo
|
||||
LAST-MODIFIED:20230523T092157Z
|
||||
LAST-MODIFIED:20250324T091428Z
|
||||
X-LIC-LOCATION:Africa/Cairo
|
||||
BEGIN:DAYLIGHT
|
||||
TZNAME:EEST
|
||||
|
||||
@@ -1,13 +1,13 @@
|
||||
BEGIN:VCALENDAR
|
||||
PRODID:-//Alinto//NONSGML IANA 2023c//EN
|
||||
PRODID:-//Alinto//NONSGML IANA 2024b//EN
|
||||
VERSION:2.0
|
||||
BEGIN:VTIMEZONE
|
||||
TZID:Africa/Casablanca
|
||||
TZUNTIL:20870511T020001Z
|
||||
LAST-MODIFIED:20230523T092157Z
|
||||
LAST-MODIFIED:20250324T091428Z
|
||||
X-LIC-LOCATION:Africa/Casablanca
|
||||
BEGIN:STANDARD
|
||||
TZNAME:+01
|
||||
TZNAME:%z
|
||||
TZOFFSETFROM:+0100
|
||||
TZOFFSETTO:+0100
|
||||
DTSTART:19700101T000000
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
BEGIN:VCALENDAR
|
||||
PRODID:-//Alinto//NONSGML IANA 2023c//EN
|
||||
PRODID:-//Alinto//NONSGML IANA 2024b//EN
|
||||
VERSION:2.0
|
||||
BEGIN:VTIMEZONE
|
||||
TZID:Africa/Ceuta
|
||||
LAST-MODIFIED:20230523T092157Z
|
||||
LAST-MODIFIED:20250324T091428Z
|
||||
X-LIC-LOCATION:Africa/Ceuta
|
||||
BEGIN:DAYLIGHT
|
||||
TZNAME:CEST
|
||||
|
||||
@@ -1,13 +1,13 @@
|
||||
BEGIN:VCALENDAR
|
||||
PRODID:-//Alinto//NONSGML IANA 2023c//EN
|
||||
PRODID:-//Alinto//NONSGML IANA 2024b//EN
|
||||
VERSION:2.0
|
||||
BEGIN:VTIMEZONE
|
||||
TZID:Africa/El_Aaiun
|
||||
TZUNTIL:20870511T020001Z
|
||||
LAST-MODIFIED:20230523T092157Z
|
||||
LAST-MODIFIED:20250324T091428Z
|
||||
X-LIC-LOCATION:Africa/El_Aaiun
|
||||
BEGIN:STANDARD
|
||||
TZNAME:+01
|
||||
TZNAME:%z
|
||||
TZOFFSETFROM:+0100
|
||||
TZOFFSETTO:+0100
|
||||
DTSTART:19700101T000000
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
BEGIN:VCALENDAR
|
||||
PRODID:-//Alinto//NONSGML IANA 2023c//EN
|
||||
PRODID:-//Alinto//NONSGML IANA 2024b//EN
|
||||
VERSION:2.0
|
||||
BEGIN:VTIMEZONE
|
||||
TZID:Africa/Johannesburg
|
||||
LAST-MODIFIED:20230523T092157Z
|
||||
LAST-MODIFIED:20250324T091428Z
|
||||
X-LIC-LOCATION:Africa/Johannesburg
|
||||
BEGIN:STANDARD
|
||||
TZNAME:SAST
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
BEGIN:VCALENDAR
|
||||
PRODID:-//Alinto//NONSGML IANA 2023c//EN
|
||||
PRODID:-//Alinto//NONSGML IANA 2024b//EN
|
||||
VERSION:2.0
|
||||
BEGIN:VTIMEZONE
|
||||
TZID:Africa/Juba
|
||||
LAST-MODIFIED:20230523T092157Z
|
||||
LAST-MODIFIED:20250324T091428Z
|
||||
X-LIC-LOCATION:Africa/Juba
|
||||
BEGIN:STANDARD
|
||||
TZNAME:CAT
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
BEGIN:VCALENDAR
|
||||
PRODID:-//Alinto//NONSGML IANA 2023c//EN
|
||||
PRODID:-//Alinto//NONSGML IANA 2024b//EN
|
||||
VERSION:2.0
|
||||
BEGIN:VTIMEZONE
|
||||
TZID:Africa/Khartoum
|
||||
LAST-MODIFIED:20230523T092157Z
|
||||
LAST-MODIFIED:20250324T091428Z
|
||||
X-LIC-LOCATION:Africa/Khartoum
|
||||
BEGIN:STANDARD
|
||||
TZNAME:CAT
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
BEGIN:VCALENDAR
|
||||
PRODID:-//Alinto//NONSGML IANA 2023c//EN
|
||||
PRODID:-//Alinto//NONSGML IANA 2024b//EN
|
||||
VERSION:2.0
|
||||
BEGIN:VTIMEZONE
|
||||
TZID:Africa/Lagos
|
||||
LAST-MODIFIED:20230523T092157Z
|
||||
LAST-MODIFIED:20250324T091428Z
|
||||
X-LIC-LOCATION:Africa/Lagos
|
||||
BEGIN:STANDARD
|
||||
TZNAME:WAT
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
BEGIN:VCALENDAR
|
||||
PRODID:-//Alinto//NONSGML IANA 2023c//EN
|
||||
PRODID:-//Alinto//NONSGML IANA 2024b//EN
|
||||
VERSION:2.0
|
||||
BEGIN:VTIMEZONE
|
||||
TZID:Africa/Maputo
|
||||
LAST-MODIFIED:20230523T092157Z
|
||||
LAST-MODIFIED:20250324T091428Z
|
||||
X-LIC-LOCATION:Africa/Maputo
|
||||
BEGIN:STANDARD
|
||||
TZNAME:CAT
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
BEGIN:VCALENDAR
|
||||
PRODID:-//Alinto//NONSGML IANA 2023c//EN
|
||||
PRODID:-//Alinto//NONSGML IANA 2024b//EN
|
||||
VERSION:2.0
|
||||
BEGIN:VTIMEZONE
|
||||
TZID:Africa/Monrovia
|
||||
LAST-MODIFIED:20230523T092157Z
|
||||
LAST-MODIFIED:20250324T091428Z
|
||||
X-LIC-LOCATION:Africa/Monrovia
|
||||
BEGIN:STANDARD
|
||||
TZNAME:GMT
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
BEGIN:VCALENDAR
|
||||
PRODID:-//Alinto//NONSGML IANA 2023c//EN
|
||||
PRODID:-//Alinto//NONSGML IANA 2024b//EN
|
||||
VERSION:2.0
|
||||
BEGIN:VTIMEZONE
|
||||
TZID:Africa/Nairobi
|
||||
LAST-MODIFIED:20230523T092157Z
|
||||
LAST-MODIFIED:20250324T091428Z
|
||||
X-LIC-LOCATION:Africa/Nairobi
|
||||
BEGIN:STANDARD
|
||||
TZNAME:EAT
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
BEGIN:VCALENDAR
|
||||
PRODID:-//Alinto//NONSGML IANA 2023c//EN
|
||||
PRODID:-//Alinto//NONSGML IANA 2024b//EN
|
||||
VERSION:2.0
|
||||
BEGIN:VTIMEZONE
|
||||
TZID:Africa/Ndjamena
|
||||
LAST-MODIFIED:20230523T092157Z
|
||||
LAST-MODIFIED:20250324T091428Z
|
||||
X-LIC-LOCATION:Africa/Ndjamena
|
||||
BEGIN:STANDARD
|
||||
TZNAME:WAT
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
BEGIN:VCALENDAR
|
||||
PRODID:-//Alinto//NONSGML IANA 2023c//EN
|
||||
PRODID:-//Alinto//NONSGML IANA 2024b//EN
|
||||
VERSION:2.0
|
||||
BEGIN:VTIMEZONE
|
||||
TZID:Africa/Sao_Tome
|
||||
LAST-MODIFIED:20230523T092157Z
|
||||
LAST-MODIFIED:20250324T091428Z
|
||||
X-LIC-LOCATION:Africa/Sao_Tome
|
||||
BEGIN:STANDARD
|
||||
TZNAME:GMT
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
BEGIN:VCALENDAR
|
||||
PRODID:-//Alinto//NONSGML IANA 2023c//EN
|
||||
PRODID:-//Alinto//NONSGML IANA 2024b//EN
|
||||
VERSION:2.0
|
||||
BEGIN:VTIMEZONE
|
||||
TZID:Africa/Tripoli
|
||||
LAST-MODIFIED:20230523T092157Z
|
||||
LAST-MODIFIED:20250324T091428Z
|
||||
X-LIC-LOCATION:Africa/Tripoli
|
||||
BEGIN:STANDARD
|
||||
TZNAME:EET
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
BEGIN:VCALENDAR
|
||||
PRODID:-//Alinto//NONSGML IANA 2023c//EN
|
||||
PRODID:-//Alinto//NONSGML IANA 2024b//EN
|
||||
VERSION:2.0
|
||||
BEGIN:VTIMEZONE
|
||||
TZID:Africa/Tunis
|
||||
LAST-MODIFIED:20230523T092157Z
|
||||
LAST-MODIFIED:20250324T091428Z
|
||||
X-LIC-LOCATION:Africa/Tunis
|
||||
BEGIN:STANDARD
|
||||
TZNAME:CET
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
BEGIN:VCALENDAR
|
||||
PRODID:-//Alinto//NONSGML IANA 2023c//EN
|
||||
PRODID:-//Alinto//NONSGML IANA 2024b//EN
|
||||
VERSION:2.0
|
||||
BEGIN:VTIMEZONE
|
||||
TZID:Africa/Windhoek
|
||||
LAST-MODIFIED:20230523T092157Z
|
||||
LAST-MODIFIED:20250324T091428Z
|
||||
X-LIC-LOCATION:Africa/Windhoek
|
||||
BEGIN:STANDARD
|
||||
TZNAME:CAT
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
BEGIN:VCALENDAR
|
||||
PRODID:-//Alinto//NONSGML IANA 2023c//EN
|
||||
PRODID:-//Alinto//NONSGML IANA 2024b//EN
|
||||
VERSION:2.0
|
||||
BEGIN:VTIMEZONE
|
||||
TZID:America/Adak
|
||||
LAST-MODIFIED:20230523T092157Z
|
||||
LAST-MODIFIED:20250324T091428Z
|
||||
X-LIC-LOCATION:America/Adak
|
||||
BEGIN:DAYLIGHT
|
||||
TZNAME:HDT
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
BEGIN:VCALENDAR
|
||||
PRODID:-//Alinto//NONSGML IANA 2023c//EN
|
||||
PRODID:-//Alinto//NONSGML IANA 2024b//EN
|
||||
VERSION:2.0
|
||||
BEGIN:VTIMEZONE
|
||||
TZID:America/Anchorage
|
||||
LAST-MODIFIED:20230523T092157Z
|
||||
LAST-MODIFIED:20250324T091428Z
|
||||
X-LIC-LOCATION:America/Anchorage
|
||||
BEGIN:DAYLIGHT
|
||||
TZNAME:AKDT
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
BEGIN:VCALENDAR
|
||||
PRODID:-//Alinto//NONSGML IANA 2023c//EN
|
||||
PRODID:-//Alinto//NONSGML IANA 2024b//EN
|
||||
VERSION:2.0
|
||||
BEGIN:VTIMEZONE
|
||||
TZID:America/Araguaina
|
||||
LAST-MODIFIED:20230523T092157Z
|
||||
LAST-MODIFIED:20250324T091428Z
|
||||
X-LIC-LOCATION:America/Araguaina
|
||||
BEGIN:STANDARD
|
||||
TZNAME:-03
|
||||
TZNAME:%z
|
||||
TZOFFSETFROM:-0300
|
||||
TZOFFSETTO:-0300
|
||||
DTSTART:19700101T000000
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
BEGIN:VCALENDAR
|
||||
PRODID:-//Alinto//NONSGML IANA 2023c//EN
|
||||
PRODID:-//Alinto//NONSGML IANA 2024b//EN
|
||||
VERSION:2.0
|
||||
BEGIN:VTIMEZONE
|
||||
TZID:America/Argentina/Buenos_Aires
|
||||
LAST-MODIFIED:20230523T092157Z
|
||||
LAST-MODIFIED:20250324T091428Z
|
||||
X-LIC-LOCATION:America/Argentina/Buenos_Aires
|
||||
BEGIN:STANDARD
|
||||
TZNAME:-03
|
||||
TZNAME:%z
|
||||
TZOFFSETFROM:-0300
|
||||
TZOFFSETTO:-0300
|
||||
DTSTART:19700101T000000
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
BEGIN:VCALENDAR
|
||||
PRODID:-//Alinto//NONSGML IANA 2023c//EN
|
||||
PRODID:-//Alinto//NONSGML IANA 2024b//EN
|
||||
VERSION:2.0
|
||||
BEGIN:VTIMEZONE
|
||||
TZID:America/Argentina/Catamarca
|
||||
LAST-MODIFIED:20230523T092157Z
|
||||
LAST-MODIFIED:20250324T091428Z
|
||||
X-LIC-LOCATION:America/Argentina/Catamarca
|
||||
BEGIN:STANDARD
|
||||
TZNAME:-03
|
||||
TZNAME:%z
|
||||
TZOFFSETFROM:-0300
|
||||
TZOFFSETTO:-0300
|
||||
DTSTART:19700101T000000
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
BEGIN:VCALENDAR
|
||||
PRODID:-//Alinto//NONSGML IANA 2023c//EN
|
||||
PRODID:-//Alinto//NONSGML IANA 2024b//EN
|
||||
VERSION:2.0
|
||||
BEGIN:VTIMEZONE
|
||||
TZID:America/Argentina/Cordoba
|
||||
LAST-MODIFIED:20230523T092157Z
|
||||
LAST-MODIFIED:20250324T091428Z
|
||||
X-LIC-LOCATION:America/Argentina/Cordoba
|
||||
BEGIN:STANDARD
|
||||
TZNAME:-03
|
||||
TZNAME:%z
|
||||
TZOFFSETFROM:-0300
|
||||
TZOFFSETTO:-0300
|
||||
DTSTART:19700101T000000
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
BEGIN:VCALENDAR
|
||||
PRODID:-//Alinto//NONSGML IANA 2023c//EN
|
||||
PRODID:-//Alinto//NONSGML IANA 2024b//EN
|
||||
VERSION:2.0
|
||||
BEGIN:VTIMEZONE
|
||||
TZID:America/Argentina/Jujuy
|
||||
LAST-MODIFIED:20230523T092157Z
|
||||
LAST-MODIFIED:20250324T091428Z
|
||||
X-LIC-LOCATION:America/Argentina/Jujuy
|
||||
BEGIN:STANDARD
|
||||
TZNAME:-03
|
||||
TZNAME:%z
|
||||
TZOFFSETFROM:-0300
|
||||
TZOFFSETTO:-0300
|
||||
DTSTART:19700101T000000
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
BEGIN:VCALENDAR
|
||||
PRODID:-//Alinto//NONSGML IANA 2023c//EN
|
||||
PRODID:-//Alinto//NONSGML IANA 2024b//EN
|
||||
VERSION:2.0
|
||||
BEGIN:VTIMEZONE
|
||||
TZID:America/Argentina/La_Rioja
|
||||
LAST-MODIFIED:20230523T092157Z
|
||||
LAST-MODIFIED:20250324T091428Z
|
||||
X-LIC-LOCATION:America/Argentina/La_Rioja
|
||||
BEGIN:STANDARD
|
||||
TZNAME:-03
|
||||
TZNAME:%z
|
||||
TZOFFSETFROM:-0300
|
||||
TZOFFSETTO:-0300
|
||||
DTSTART:19700101T000000
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
BEGIN:VCALENDAR
|
||||
PRODID:-//Alinto//NONSGML IANA 2023c//EN
|
||||
PRODID:-//Alinto//NONSGML IANA 2024b//EN
|
||||
VERSION:2.0
|
||||
BEGIN:VTIMEZONE
|
||||
TZID:America/Argentina/Mendoza
|
||||
LAST-MODIFIED:20230523T092157Z
|
||||
LAST-MODIFIED:20250324T091428Z
|
||||
X-LIC-LOCATION:America/Argentina/Mendoza
|
||||
BEGIN:STANDARD
|
||||
TZNAME:-03
|
||||
TZNAME:%z
|
||||
TZOFFSETFROM:-0300
|
||||
TZOFFSETTO:-0300
|
||||
DTSTART:19700101T000000
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
BEGIN:VCALENDAR
|
||||
PRODID:-//Alinto//NONSGML IANA 2023c//EN
|
||||
PRODID:-//Alinto//NONSGML IANA 2024b//EN
|
||||
VERSION:2.0
|
||||
BEGIN:VTIMEZONE
|
||||
TZID:America/Argentina/Rio_Gallegos
|
||||
LAST-MODIFIED:20230523T092157Z
|
||||
LAST-MODIFIED:20250324T091428Z
|
||||
X-LIC-LOCATION:America/Argentina/Rio_Gallegos
|
||||
BEGIN:STANDARD
|
||||
TZNAME:-03
|
||||
TZNAME:%z
|
||||
TZOFFSETFROM:-0300
|
||||
TZOFFSETTO:-0300
|
||||
DTSTART:19700101T000000
|
||||
|
||||
Loaded 100 of 1175 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user