Compare commits
9
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d6d972d16b | ||
|
|
ccc3de3597 | ||
|
|
7b72f50c1c | ||
|
|
87ccc5c041 | ||
|
|
37a11ffff4 | ||
|
|
208f4366c4 | ||
|
|
b39da3050b | ||
|
|
e7813b2d5e | ||
|
|
171c18677a |
No files matched your search
@@ -1,163 +0,0 @@
|
||||
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"]
|
||||
@@ -1,67 +0,0 @@
|
||||
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
|
||||
@@ -1,72 +0,0 @@
|
||||
# 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"]
|
||||
@@ -1,3 +0,0 @@
|
||||
disable_plaintext_auth = no
|
||||
auth_mechanisms = plain login
|
||||
!include auth-ldap.conf.ext
|
||||
@@ -1,11 +0,0 @@
|
||||
mail_location = maildir:/var/mail/%n
|
||||
namespace inbox {
|
||||
inbox = yes
|
||||
}
|
||||
mail_privileged_group = mail
|
||||
protocol !indexer-worker {
|
||||
}
|
||||
|
||||
protocol imap {
|
||||
mail_plugins = $mail_plugins acl
|
||||
}
|
||||
@@ -1,88 +0,0 @@
|
||||
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 =
|
||||
}
|
||||
}
|
||||
@@ -1,5 +0,0 @@
|
||||
protocol lmtp {
|
||||
postmaster_address = postmaster@example.org
|
||||
# Space separated list of plugins to load (default is global mail_plugins).
|
||||
mail_plugins = $mail_plugins sieve
|
||||
}
|
||||
@@ -1,3 +0,0 @@
|
||||
plugin {
|
||||
acl = vfile
|
||||
}
|
||||
@@ -1,3 +0,0 @@
|
||||
plugin {
|
||||
sieve = file:/var/sieve/%n@example.org;active=/var/sieve/%n@example.org/.dovecot.sieve
|
||||
}
|
||||
@@ -1,17 +0,0 @@
|
||||
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
|
||||
|
||||
@@ -1,9 +0,0 @@
|
||||
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))
|
||||
@@ -1,13 +0,0 @@
|
||||
## 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.
@@ -1 +0,0 @@
|
||||
deb [signed-by=/etc/apt/keyrings/dovecot.gpg] http://repo.dovecot.org/ce-2.3.21.1/debian/bullseye bullseye main
|
||||
@@ -1,182 +0,0 @@
|
||||
#!/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
|
||||
@@ -1,277 +0,0 @@
|
||||
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
|
||||
@@ -1,3 +0,0 @@
|
||||
FROM httpd:2.4
|
||||
|
||||
ADD httpd.conf /usr/local/apache2/conf/httpd.conf
|
||||
@@ -1,772 +0,0 @@
|
||||
#
|
||||
# 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>
|
||||
@@ -1,20 +0,0 @@
|
||||
-----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-----
|
||||
@@ -1,16 +0,0 @@
|
||||
-----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-----
|
||||
@@ -1,28 +0,0 @@
|
||||
-----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-----
|
||||
@@ -1,7 +0,0 @@
|
||||
#!/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
|
||||
|
||||
@@ -1,166 +0,0 @@
|
||||
# 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
|
||||
@@ -1,8 +0,0 @@
|
||||
# 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
|
||||
|
||||
@@ -1,12 +0,0 @@
|
||||
#!/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
|
||||
@@ -1 +0,0 @@
|
||||
example.org
|
||||
@@ -1,52 +0,0 @@
|
||||
# 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
|
||||
@@ -1 +0,0 @@
|
||||
@example.org root
|
||||
@@ -1,518 +0,0 @@
|
||||
#!/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
|
||||
}
|
||||
@@ -1,14 +0,0 @@
|
||||
#!/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"
|
||||
@@ -1,147 +0,0 @@
|
||||
#!/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
|
||||
@@ -1,53 +0,0 @@
|
||||
#!/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
|
||||
@@ -1,107 +0,0 @@
|
||||
{
|
||||
/* ********************* 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;
|
||||
|
||||
}
|
||||
@@ -1,15 +0,0 @@
|
||||
// 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"
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,108 +0,0 @@
|
||||
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:
|
||||
@@ -1,74 +0,0 @@
|
||||
## 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
|
||||
```
|
||||
+2
-28
@@ -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://bugs.sogo.nu/).
|
||||
[bug tracking system](https://sogo.nu/bugs/).
|
||||
|
||||
Please make sure to respect the following guidelines when reporting a bug:
|
||||
|
||||
@@ -16,32 +16,6 @@ Please make sure to respect the following guidelines when reporting a bug:
|
||||
|
||||
Begin by reading [SOGo Developer's Guide](../Documentation/SOGoDevelopersGuide.asciidoc).
|
||||
|
||||
### 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/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/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/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/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.
|
||||
|
||||
### Git Commit Guidelines
|
||||
|
||||
We have very precise rules over how our git commit messages can be formatted. This leads to **more
|
||||
@@ -107,7 +81,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://bugs.sogo.nu) issues that this commit **Fixes** or **Resolves**.
|
||||
place to reference [Mantis](https://sogo.nu/bus/) 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.
|
||||
|
||||
-31
@@ -10,10 +10,8 @@
|
||||
*/obj/
|
||||
.scss-lint-config.yml_
|
||||
ActiveSync/ActiveSync.SOGo
|
||||
API/API.SOGo
|
||||
Documentation/*.docbook
|
||||
Documentation/*.pdf
|
||||
Documentation/*.html
|
||||
SoObjects/SOGo/SOGo.framework/
|
||||
SoObjects/SOGo/derived_src/
|
||||
Tests/*/config.py
|
||||
@@ -30,32 +28,3 @@ UI/WebServerResources/scss/.sass-cache/
|
||||
config.make
|
||||
doc
|
||||
tags
|
||||
.DS_Store
|
||||
Tests/package-lock.json
|
||||
.vscode
|
||||
.configure-test*
|
||||
UI/WebServerResources/package-lock.json
|
||||
|
||||
# CKEditor
|
||||
UI/WebServerResources/js/vendor/ckeditor/samples/
|
||||
UI/WebServerResources/js/vendor/ckeditor/skins/n1theme/readme.md
|
||||
UI/WebServerResources/js/vendor/ckeditor/*.md
|
||||
UI/WebServerResources/js/vendor/ckeditor/adapters/jquery.js
|
||||
UI/WebServerResources/js/vendor/ckeditor/bender-runner.config.json
|
||||
UI/WebServerResources/js/vendor/ckeditor/plugins/onchange/docs
|
||||
UI/WebServerResources/js/vendor/ckeditor/plugins/scayt/*.md
|
||||
UI/WebServerResources/js/vendor/ckeditor/skins/n1theme/*.md
|
||||
|
||||
# Transifex
|
||||
.tx/config_20230213185112.bak
|
||||
|
||||
# Tests
|
||||
Tests/node_modules
|
||||
Tests/lib/config.js
|
||||
Tests/results.xml
|
||||
Tests/results
|
||||
|
||||
# SAML2 autogenerated files
|
||||
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/Alinto/material.git
|
||||
url = https://github.com/angular/material
|
||||
+451
-47
@@ -1,60 +1,464 @@
|
||||
[main]
|
||||
host = https://www.transifex.com
|
||||
lang_map = fr: French, pt_BR: BrazilianPortuguese, ru: Russian, sk: Slovak, es_AR: SpanishArgentina, fi: Finnish, id_ID: Indonesian, lt: Lithuanian, tr_TR: TurkishTurkey, zh_TW: ChineseTaiwan, ar: Arabic, cs: Czech, nn_NO: NorwegianNynorsk, sl_SI: Slovenian, uk: Ukrainian, zh_CN: ChineseChina, sv: Swedish, bg_BG: Bulgarian, cy: Welsh, is: Icelandic, sr: Serbian, lv: Latvian, pl: Polish, ro_RO: Romanian, bs_BA: Bosnian,ca: Catalan, he: Hebrew, kk: Kazakh, pt: Portuguese, es_ES: SpanishSpain, eu: Basque, hu: Hungarian, ja: Japanese, mk_MK: Macedonian, nb_NO: NorwegianBokmal, nl: Dutch, sr@latin: SerbianLatin, da_DK: Danish, de: German, hr_HR: Croatian, it: Italian, sr_ME@latin: Montenegrin, gl_ES: Galician
|
||||
|
||||
[o:alinto:p:sogo:r:soobjects-appointments]
|
||||
source_file = SoObjects/Appointments/English.lproj/Localizable.strings
|
||||
source_lang = en
|
||||
file_filter = SoObjects/Appointments/<lang>.lproj/Localizable.strings
|
||||
[sogo.ui-mailerui]
|
||||
source_file = UI/MailerUI/English.lproj/Localizable.strings
|
||||
source_lang = en
|
||||
trans.ar = UI/MailerUI/Arabic.lproj/Localizable.strings
|
||||
trans.ca = UI/MailerUI/Catalan.lproj/Localizable.strings
|
||||
trans.cs = UI/MailerUI/Czech.lproj/Localizable.strings
|
||||
trans.cy = UI/MailerUI/Welsh.lproj/Localizable.strings
|
||||
trans.da_DK = UI/MailerUI/Danish.lproj/Localizable.strings
|
||||
trans.de = UI/MailerUI/German.lproj/Localizable.strings
|
||||
trans.es_AR = UI/MailerUI/SpanishArgentina.lproj/Localizable.strings
|
||||
trans.es_ES = UI/MailerUI/SpanishSpain.lproj/Localizable.strings
|
||||
trans.eu = UI/MailerUI/Basque.lproj/Localizable.strings
|
||||
trans.fi = UI/MailerUI/Finnish.lproj/Localizable.strings
|
||||
trans.fr = UI/MailerUI/French.lproj/Localizable.strings
|
||||
trans.he = UI/MailerUI/Hebrew.lproj/Localizable.strings
|
||||
trans.hr_HR = UI/MailerUI/Croatian.lproj/Localizable.strings
|
||||
trans.hu = UI/MailerUI/Hungarian.lproj/Localizable.strings
|
||||
trans.id_ID = UI/MailerUI/Indonesian.lproj/Localizable.strings
|
||||
trans.is = UI/MailerUI/Icelandic.lproj/Localizable.strings
|
||||
trans.it = UI/MailerUI/Italian.lproj/Localizable.strings
|
||||
trans.ja = UI/MailerUI/Japanese.lproj/Localizable.strings
|
||||
trans.lt = UI/MailerUI/Lithuanian.lproj/Localizable.strings
|
||||
trans.lv = UI/MailerUI/Latvian.lproj/Localizable.strings
|
||||
trans.mk_MK = UI/MailerUI/Macedonian.lproj/Localizable.strings
|
||||
trans.nb_NO = UI/MailerUI/NorwegianBokmal.lproj/Localizable.strings
|
||||
trans.nl = UI/MailerUI/Dutch.lproj/Localizable.strings
|
||||
trans.nn_NO = UI/MailerUI/NorwegianNynorsk.lproj/Localizable.strings
|
||||
trans.pl = UI/MailerUI/Polish.lproj/Localizable.strings
|
||||
trans.pt = UI/MailerUI/Portuguese.lproj/Localizable.strings
|
||||
trans.pt_BR = UI/MailerUI/BrazilianPortuguese.lproj/Localizable.strings
|
||||
trans.ro_RO = UI/MailerUI/Romanian.lproj/Localizable.strings
|
||||
trans.ru = UI/MailerUI/Russian.lproj/Localizable.strings
|
||||
trans.sk = UI/MailerUI/Slovak.lproj/Localizable.strings
|
||||
trans.sl_SI = UI/MailerUI/Slovenian.lproj/Localizable.strings
|
||||
trans.sr = UI/MailerUI/Serbian.lproj/Localizable.strings
|
||||
trans.sr@latin = UI/MailerUI/SerbianLatin.lproj/Localizable.strings
|
||||
trans.sv = UI/MailerUI/Swedish.lproj/Localizable.strings
|
||||
trans.tr_TR = UI/MailerUI/TurkishTurkey.lproj/Localizable.strings
|
||||
trans.uk = UI/MailerUI/Ukrainian.lproj/Localizable.strings
|
||||
trans.zh_CN = UI/MailerUI/ChineseChina.lproj/Localizable.strings
|
||||
trans.zh_TW = UI/MailerUI/ChineseTaiwan.lproj/Localizable.strings
|
||||
|
||||
[sogo.ui-preferencesui]
|
||||
source_file = UI/PreferencesUI/English.lproj/Localizable.strings
|
||||
source_lang = en
|
||||
trans.ar = UI/PreferencesUI/Arabic.lproj/Localizable.strings
|
||||
trans.ca = UI/PreferencesUI/Catalan.lproj/Localizable.strings
|
||||
trans.cs = UI/PreferencesUI/Czech.lproj/Localizable.strings
|
||||
trans.cy = UI/PreferencesUI/Welsh.lproj/Localizable.strings
|
||||
trans.da_DK = UI/PreferencesUI/Danish.lproj/Localizable.strings
|
||||
trans.de = UI/PreferencesUI/German.lproj/Localizable.strings
|
||||
trans.es_AR = UI/PreferencesUI/SpanishArgentina.lproj/Localizable.strings
|
||||
trans.es_ES = UI/PreferencesUI/SpanishSpain.lproj/Localizable.strings
|
||||
trans.eu = UI/PreferencesUI/Basque.lproj/Localizable.strings
|
||||
trans.fi = UI/PreferencesUI/Finnish.lproj/Localizable.strings
|
||||
trans.fr = UI/PreferencesUI/French.lproj/Localizable.strings
|
||||
trans.he = UI/PreferencesUI/Hebrew.lproj/Localizable.strings
|
||||
trans.hr_HR = UI/PreferencesUI/Croatian.lproj/Localizable.strings
|
||||
trans.hu = UI/PreferencesUI/Hungarian.lproj/Localizable.strings
|
||||
trans.id_ID = UI/PreferencesUI/Indonesian.lproj/Localizable.strings
|
||||
trans.is = UI/PreferencesUI/Icelandic.lproj/Localizable.strings
|
||||
trans.it = UI/PreferencesUI/Italian.lproj/Localizable.strings
|
||||
trans.ja = UI/PreferencesUI/Japanese.lproj/Localizable.strings
|
||||
trans.lt = UI/PreferencesUI/Lithuanian.lproj/Localizable.strings
|
||||
trans.lv = UI/PreferencesUI/Latvian.lproj/Localizable.strings
|
||||
trans.mk_MK = UI/PreferencesUI/Macedonian.lproj/Localizable.strings
|
||||
trans.nb_NO = UI/PreferencesUI/NorwegianBokmal.lproj/Localizable.strings
|
||||
trans.nl = UI/PreferencesUI/Dutch.lproj/Localizable.strings
|
||||
trans.nn_NO = UI/PreferencesUI/NorwegianNynorsk.lproj/Localizable.strings
|
||||
trans.pl = UI/PreferencesUI/Polish.lproj/Localizable.strings
|
||||
trans.pt = UI/PreferencesUI/Portuguese.lproj/Localizable.strings
|
||||
trans.pt_BR = UI/PreferencesUI/BrazilianPortuguese.lproj/Localizable.strings
|
||||
trans.ro_RO = UI/PreferencesUI/Romanian.lproj/Localizable.strings
|
||||
trans.ru = UI/PreferencesUI/Russian.lproj/Localizable.strings
|
||||
trans.sk = UI/PreferencesUI/Slovak.lproj/Localizable.strings
|
||||
trans.sl_SI = UI/PreferencesUI/Slovenian.lproj/Localizable.strings
|
||||
trans.sr = UI/PreferencesUI/Serbian.lproj/Localizable.strings
|
||||
trans.sr@latin = UI/PreferencesUI/SerbianLatin.lproj/Localizable.strings
|
||||
trans.sv = UI/PreferencesUI/Swedish.lproj/Localizable.strings
|
||||
trans.tr_TR = UI/PreferencesUI/TurkishTurkey.lproj/Localizable.strings
|
||||
trans.uk = UI/PreferencesUI/Ukrainian.lproj/Localizable.strings
|
||||
trans.zh_CN = UI/PreferencesUI/ChineseChina.lproj/Localizable.strings
|
||||
trans.zh_TW = UI/PreferencesUI/ChineseTaiwan.lproj/Localizable.strings
|
||||
|
||||
[o:alinto:p:sogo:r:soobjects-contacts]
|
||||
source_file = SoObjects/Contacts/English.lproj/Localizable.strings
|
||||
source_lang = en
|
||||
file_filter = SoObjects/Contacts/<lang>.lproj/Localizable.strings
|
||||
[sogo.ui-scheduler]
|
||||
source_file = UI/Scheduler/English.lproj/Localizable.strings
|
||||
source_lang = en
|
||||
trans.ar = UI/Scheduler/Arabic.lproj/Localizable.strings
|
||||
trans.ca = UI/Scheduler/Catalan.lproj/Localizable.strings
|
||||
trans.cs = UI/Scheduler/Czech.lproj/Localizable.strings
|
||||
trans.cy = UI/Scheduler/Welsh.lproj/Localizable.strings
|
||||
trans.da_DK = UI/Scheduler/Danish.lproj/Localizable.strings
|
||||
trans.de = UI/Scheduler/German.lproj/Localizable.strings
|
||||
trans.es_AR = UI/Scheduler/SpanishArgentina.lproj/Localizable.strings
|
||||
trans.es_ES = UI/Scheduler/SpanishSpain.lproj/Localizable.strings
|
||||
trans.eu = UI/Scheduler/Basque.lproj/Localizable.strings
|
||||
trans.fi = UI/Scheduler/Finnish.lproj/Localizable.strings
|
||||
trans.fr = UI/Scheduler/French.lproj/Localizable.strings
|
||||
trans.he = UI/Scheduler/Hebrew.lproj/Localizable.strings
|
||||
trans.hr_HR = UI/Scheduler/Croatian.lproj/Localizable.strings
|
||||
trans.hu = UI/Scheduler/Hungarian.lproj/Localizable.strings
|
||||
trans.id_ID = UI/Scheduler/Indonesian.lproj/Localizable.strings
|
||||
trans.is = UI/Scheduler/Icelandic.lproj/Localizable.strings
|
||||
trans.it = UI/Scheduler/Italian.lproj/Localizable.strings
|
||||
trans.ja = UI/Scheduler/Japanese.lproj/Localizable.strings
|
||||
trans.lt = UI/Scheduler/Lithuanian.lproj/Localizable.strings
|
||||
trans.lv = UI/Scheduler/Latvian.lproj/Localizable.strings
|
||||
trans.mk_MK = UI/Scheduler/Macedonian.lproj/Localizable.strings
|
||||
trans.nb_NO = UI/Scheduler/NorwegianBokmal.lproj/Localizable.strings
|
||||
trans.nl = UI/Scheduler/Dutch.lproj/Localizable.strings
|
||||
trans.nn_NO = UI/Scheduler/NorwegianNynorsk.lproj/Localizable.strings
|
||||
trans.pl = UI/Scheduler/Polish.lproj/Localizable.strings
|
||||
trans.pt = UI/Scheduler/Portuguese.lproj/Localizable.strings
|
||||
trans.pt_BR = UI/Scheduler/BrazilianPortuguese.lproj/Localizable.strings
|
||||
trans.ro_RO = UI/Scheduler/Romanian.lproj/Localizable.strings
|
||||
trans.ru = UI/Scheduler/Russian.lproj/Localizable.strings
|
||||
trans.sk = UI/Scheduler/Slovak.lproj/Localizable.strings
|
||||
trans.sl_SI = UI/Scheduler/Slovenian.lproj/Localizable.strings
|
||||
trans.sr = UI/Scheduler/Serbian.lproj/Localizable.strings
|
||||
trans.sr@latin = UI/Scheduler/SerbianLatin.lproj/Localizable.strings
|
||||
trans.sv = UI/Scheduler/Swedish.lproj/Localizable.strings
|
||||
trans.tr_TR = UI/Scheduler/TurkishTurkey.lproj/Localizable.strings
|
||||
trans.uk = UI/Scheduler/Ukrainian.lproj/Localizable.strings
|
||||
trans.zh_CN = UI/Scheduler/ChineseChina.lproj/Localizable.strings
|
||||
trans.zh_TW = UI/Scheduler/ChineseTaiwan.lproj/Localizable.strings
|
||||
|
||||
[o:alinto:p:sogo:r:soobjects-mailer]
|
||||
source_file = SoObjects/Mailer/English.lproj/Localizable.strings
|
||||
source_lang = en
|
||||
file_filter = SoObjects/Mailer/<lang>.lproj/Localizable.strings
|
||||
[sogo.ui-contacts]
|
||||
source_file = UI/Contacts/English.lproj/Localizable.strings
|
||||
source_lang = en
|
||||
trans.ar = UI/Contacts/Arabic.lproj/Localizable.strings
|
||||
trans.ca = UI/Contacts/Catalan.lproj/Localizable.strings
|
||||
trans.cs = UI/Contacts/Czech.lproj/Localizable.strings
|
||||
trans.cy = UI/Contacts/Welsh.lproj/Localizable.strings
|
||||
trans.da_DK = UI/Contacts/Danish.lproj/Localizable.strings
|
||||
trans.de = UI/Contacts/German.lproj/Localizable.strings
|
||||
trans.es_AR = UI/Contacts/SpanishArgentina.lproj/Localizable.strings
|
||||
trans.es_ES = UI/Contacts/SpanishSpain.lproj/Localizable.strings
|
||||
trans.eu = UI/Contacts/Basque.lproj/Localizable.strings
|
||||
trans.fi = UI/Contacts/Finnish.lproj/Localizable.strings
|
||||
trans.fr = UI/Contacts/French.lproj/Localizable.strings
|
||||
trans.he = UI/Contacts/Hebrew.lproj/Localizable.strings
|
||||
trans.hr_HR = UI/Contacts/Croatian.lproj/Localizable.strings
|
||||
trans.hu = UI/Contacts/Hungarian.lproj/Localizable.strings
|
||||
trans.id_ID = UI/Contacts/Indonesian.lproj/Localizable.strings
|
||||
trans.is = UI/Contacts/Icelandic.lproj/Localizable.strings
|
||||
trans.it = UI/Contacts/Italian.lproj/Localizable.strings
|
||||
trans.ja = UI/Contacts/Japanese.lproj/Localizable.strings
|
||||
trans.lt = UI/Contacts/Lithuanian.lproj/Localizable.strings
|
||||
trans.lv = UI/Contacts/Latvian.lproj/Localizable.strings
|
||||
trans.mk_MK = UI/Contacts/Macedonian.lproj/Localizable.strings
|
||||
trans.nb_NO = UI/Contacts/NorwegianBokmal.lproj/Localizable.strings
|
||||
trans.nl = UI/Contacts/Dutch.lproj/Localizable.strings
|
||||
trans.nn_NO = UI/Contacts/NorwegianNynorsk.lproj/Localizable.strings
|
||||
trans.pl = UI/Contacts/Polish.lproj/Localizable.strings
|
||||
trans.pt = UI/Contacts/Portuguese.lproj/Localizable.strings
|
||||
trans.pt_BR = UI/Contacts/BrazilianPortuguese.lproj/Localizable.strings
|
||||
trans.ro_RO = UI/Contacts/Romanian.lproj/Localizable.strings
|
||||
trans.ru = UI/Contacts/Russian.lproj/Localizable.strings
|
||||
trans.sk = UI/Contacts/Slovak.lproj/Localizable.strings
|
||||
trans.sl_SI = UI/Contacts/Slovenian.lproj/Localizable.strings
|
||||
trans.sr = UI/Contacts/Serbian.lproj/Localizable.strings
|
||||
trans.sr@latin = UI/Contacts/SerbianLatin.lproj/Localizable.strings
|
||||
trans.sv = UI/Contacts/Swedish.lproj/Localizable.strings
|
||||
trans.tr_TR = UI/Contacts/TurkishTurkey.lproj/Localizable.strings
|
||||
trans.uk = UI/Contacts/Ukrainian.lproj/Localizable.strings
|
||||
trans.zh_CN = UI/Contacts/ChineseChina.lproj/Localizable.strings
|
||||
trans.zh_TW = UI/Contacts/ChineseTaiwan.lproj/Localizable.strings
|
||||
|
||||
[o:alinto:p:sogo:r:ui-administrationui]
|
||||
source_file = UI/AdministrationUI/English.lproj/Localizable.strings
|
||||
source_lang = en
|
||||
file_filter = UI/AdministrationUI/<lang>.lproj/Localizable.strings
|
||||
[sogo.ui-mainui]
|
||||
source_file = UI/MainUI/English.lproj/Localizable.strings
|
||||
source_lang = en
|
||||
trans.ar = UI/MainUI/Arabic.lproj/Localizable.strings
|
||||
trans.ca = UI/MainUI/Catalan.lproj/Localizable.strings
|
||||
trans.cs = UI/MainUI/Czech.lproj/Localizable.strings
|
||||
trans.cy = UI/MainUI/Welsh.lproj/Localizable.strings
|
||||
trans.da_DK = UI/MainUI/Danish.lproj/Localizable.strings
|
||||
trans.de = UI/MainUI/German.lproj/Localizable.strings
|
||||
trans.es_AR = UI/MainUI/SpanishArgentina.lproj/Localizable.strings
|
||||
trans.es_ES = UI/MainUI/SpanishSpain.lproj/Localizable.strings
|
||||
trans.eu = UI/MainUI/Basque.lproj/Localizable.strings
|
||||
trans.fi = UI/MainUI/Finnish.lproj/Localizable.strings
|
||||
trans.fr = UI/MainUI/French.lproj/Localizable.strings
|
||||
trans.he = UI/MainUI/Hebrew.lproj/Localizable.strings
|
||||
trans.hr_HR = UI/MainUI/Croatian.lproj/Localizable.strings
|
||||
trans.hu = UI/MainUI/Hungarian.lproj/Localizable.strings
|
||||
trans.id_ID = UI/MainUI/Indonesian.lproj/Localizable.strings
|
||||
trans.is = UI/MainUI/Icelandic.lproj/Localizable.strings
|
||||
trans.it = UI/MainUI/Italian.lproj/Localizable.strings
|
||||
trans.ja = UI/MainUI/Japanese.lproj/Localizable.strings
|
||||
trans.lt = UI/MainUI/Lithuanian.lproj/Localizable.strings
|
||||
trans.lv = UI/MainUI/Latvian.lproj/Localizable.strings
|
||||
trans.mk_MK = UI/MainUI/Macedonian.lproj/Localizable.strings
|
||||
trans.nb_NO = UI/MainUI/NorwegianBokmal.lproj/Localizable.strings
|
||||
trans.nl = UI/MainUI/Dutch.lproj/Localizable.strings
|
||||
trans.nn_NO = UI/MainUI/NorwegianNynorsk.lproj/Localizable.strings
|
||||
trans.pl = UI/MainUI/Polish.lproj/Localizable.strings
|
||||
trans.pt = UI/MainUI/Portuguese.lproj/Localizable.strings
|
||||
trans.pt_BR = UI/MainUI/BrazilianPortuguese.lproj/Localizable.strings
|
||||
trans.ro_RO = UI/MainUI/Romanian.lproj/Localizable.strings
|
||||
trans.ru = UI/MainUI/Russian.lproj/Localizable.strings
|
||||
trans.sk = UI/MainUI/Slovak.lproj/Localizable.strings
|
||||
trans.sl_SI = UI/MainUI/Slovenian.lproj/Localizable.strings
|
||||
trans.sr = UI/MainUI/Serbian.lproj/Localizable.strings
|
||||
trans.sr@latin = UI/MainUI/SerbianLatin.lproj/Localizable.strings
|
||||
trans.sv = UI/MainUI/Swedish.lproj/Localizable.strings
|
||||
trans.tr_TR = UI/MainUI/TurkishTurkey.lproj/Localizable.strings
|
||||
trans.uk = UI/MainUI/Ukrainian.lproj/Localizable.strings
|
||||
trans.zh_CN = UI/MainUI/ChineseChina.lproj/Localizable.strings
|
||||
trans.zh_TW = UI/MainUI/ChineseTaiwan.lproj/Localizable.strings
|
||||
|
||||
[o:alinto:p:sogo:r:ui-common]
|
||||
source_file = UI/Common/English.lproj/Localizable.strings
|
||||
source_lang = en
|
||||
file_filter = UI/Common/<lang>.lproj/Localizable.strings
|
||||
[sogo.ui-common]
|
||||
source_file = UI/Common/English.lproj/Localizable.strings
|
||||
source_lang = en
|
||||
trans.ar = UI/Common/Arabic.lproj/Localizable.strings
|
||||
trans.ca = UI/Common/Catalan.lproj/Localizable.strings
|
||||
trans.cs = UI/Common/Czech.lproj/Localizable.strings
|
||||
trans.cy = UI/Common/Welsh.lproj/Localizable.strings
|
||||
trans.da_DK = UI/Common/Danish.lproj/Localizable.strings
|
||||
trans.de = UI/Common/German.lproj/Localizable.strings
|
||||
trans.es_AR = UI/Common/SpanishArgentina.lproj/Localizable.strings
|
||||
trans.es_ES = UI/Common/SpanishSpain.lproj/Localizable.strings
|
||||
trans.eu = UI/Common/Basque.lproj/Localizable.strings
|
||||
trans.fi = UI/Common/Finnish.lproj/Localizable.strings
|
||||
trans.fr = UI/Common/French.lproj/Localizable.strings
|
||||
trans.he = UI/Common/Hebrew.lproj/Localizable.strings
|
||||
trans.hr_HR = UI/Common/Croatian.lproj/Localizable.strings
|
||||
trans.hu = UI/Common/Hungarian.lproj/Localizable.strings
|
||||
trans.id_ID = UI/Common/Indonesian.lproj/Localizable.strings
|
||||
trans.is = UI/Common/Icelandic.lproj/Localizable.strings
|
||||
trans.it = UI/Common/Italian.lproj/Localizable.strings
|
||||
trans.ja = UI/Common/Japanese.lproj/Localizable.strings
|
||||
trans.lt = UI/Common/Lithuanian.lproj/Localizable.strings
|
||||
trans.lv = UI/Common/Latvian.lproj/Localizable.strings
|
||||
trans.mk_MK = UI/Common/Macedonian.lproj/Localizable.strings
|
||||
trans.nb_NO = UI/Common/NorwegianBokmal.lproj/Localizable.strings
|
||||
trans.nl = UI/Common/Dutch.lproj/Localizable.strings
|
||||
trans.nn_NO = UI/Common/NorwegianNynorsk.lproj/Localizable.strings
|
||||
trans.pl = UI/Common/Polish.lproj/Localizable.strings
|
||||
trans.pt = UI/Common/Portuguese.lproj/Localizable.strings
|
||||
trans.pt_BR = UI/Common/BrazilianPortuguese.lproj/Localizable.strings
|
||||
trans.ro_RO = UI/Common/Romanian.lproj/Localizable.strings
|
||||
trans.ru = UI/Common/Russian.lproj/Localizable.strings
|
||||
trans.sk = UI/Common/Slovak.lproj/Localizable.strings
|
||||
trans.sl_SI = UI/Common/Slovenian.lproj/Localizable.strings
|
||||
trans.sr = UI/Common/Serbian.lproj/Localizable.strings
|
||||
trans.sr@latin = UI/Common/SerbianLatin.lproj/Localizable.strings
|
||||
trans.sv = UI/Common/Swedish.lproj/Localizable.strings
|
||||
trans.tr_TR = UI/Common/TurkishTurkey.lproj/Localizable.strings
|
||||
trans.uk = UI/Common/Ukrainian.lproj/Localizable.strings
|
||||
trans.zh_CN = UI/Common/ChineseChina.lproj/Localizable.strings
|
||||
trans.zh_TW = UI/Common/ChineseTaiwan.lproj/Localizable.strings
|
||||
|
||||
[o:alinto:p:sogo:r:ui-contacts]
|
||||
source_file = UI/Contacts/English.lproj/Localizable.strings
|
||||
source_lang = en
|
||||
file_filter = UI/Contacts/<lang>.lproj/Localizable.strings
|
||||
[sogo.ui-administrationui]
|
||||
source_file = UI/AdministrationUI/English.lproj/Localizable.strings
|
||||
source_lang = en
|
||||
trans.ar = UI/AdministrationUI/Arabic.lproj/Localizable.strings
|
||||
trans.ca = UI/AdministrationUI/Catalan.lproj/Localizable.strings
|
||||
trans.cs = UI/AdministrationUI/Czech.lproj/Localizable.strings
|
||||
trans.cy = UI/AdministrationUI/Welsh.lproj/Localizable.strings
|
||||
trans.da_DK = UI/AdministrationUI/Danish.lproj/Localizable.strings
|
||||
trans.de = UI/AdministrationUI/German.lproj/Localizable.strings
|
||||
trans.es_AR = UI/AdministrationUI/SpanishArgentina.lproj/Localizable.strings
|
||||
trans.es_ES = UI/AdministrationUI/SpanishSpain.lproj/Localizable.strings
|
||||
trans.eu = UI/AdministrationUI/Basque.lproj/Localizable.strings
|
||||
trans.fi = UI/AdministrationUI/Finnish.lproj/Localizable.strings
|
||||
trans.fr = UI/AdministrationUI/French.lproj/Localizable.strings
|
||||
trans.he = UI/AdministrationUI/Hebrew.lproj/Localizable.strings
|
||||
trans.hr_HR = UI/AdministrationUI/Croatian.lproj/Localizable.strings
|
||||
trans.hu = UI/AdministrationUI/Hungarian.lproj/Localizable.strings
|
||||
trans.id_ID = UI/AdministrationUI/Indonesian.lproj/Localizable.strings
|
||||
trans.is = UI/AdministrationUI/Icelandic.lproj/Localizable.strings
|
||||
trans.it = UI/AdministrationUI/Italian.lproj/Localizable.strings
|
||||
trans.ja = UI/AdministrationUI/Japanese.lproj/Localizable.strings
|
||||
trans.lt = UI/AdministrationUI/Lithuanian.lproj/Localizable.strings
|
||||
trans.lv = UI/AdministrationUI/Latvian.lproj/Localizable.strings
|
||||
trans.mk_MK = UI/AdministrationUI/Macedonian.lproj/Localizable.strings
|
||||
trans.nb_NO = UI/AdministrationUI/NorwegianBokmal.lproj/Localizable.strings
|
||||
trans.nl = UI/AdministrationUI/Dutch.lproj/Localizable.strings
|
||||
trans.nn_NO = UI/AdministrationUI/NorwegianNynorsk.lproj/Localizable.strings
|
||||
trans.pl = UI/AdministrationUI/Polish.lproj/Localizable.strings
|
||||
trans.pt = UI/AdministrationUI/Portuguese.lproj/Localizable.strings
|
||||
trans.pt_BR = UI/AdministrationUI/BrazilianPortuguese.lproj/Localizable.strings
|
||||
trans.ro_RO = UI/AdministrationUI/Romanian.lproj/Localizable.strings
|
||||
trans.ru = UI/AdministrationUI/Russian.lproj/Localizable.strings
|
||||
trans.sk = UI/AdministrationUI/Slovak.lproj/Localizable.strings
|
||||
trans.sl_SI = UI/AdministrationUI/Slovenian.lproj/Localizable.strings
|
||||
trans.sr = UI/AdministrationUI/Serbian.lproj/Localizable.strings
|
||||
trans.sr@latin = UI/AdministrationUI/SerbianLatin.lproj/Localizable.strings
|
||||
trans.sv = UI/AdministrationUI/Swedish.lproj/Localizable.strings
|
||||
trans.tr_TR = UI/AdministrationUI/TurkishTurkey.lproj/Localizable.strings
|
||||
trans.uk = UI/AdministrationUI/Ukrainian.lproj/Localizable.strings
|
||||
trans.zh_CN = UI/AdministrationUI/ChineseChina.lproj/Localizable.strings
|
||||
trans.zh_TW = UI/AdministrationUI/ChineseTaiwan.lproj/Localizable.strings
|
||||
|
||||
[o:alinto:p:sogo:r:ui-mailerui]
|
||||
source_file = UI/MailerUI/English.lproj/Localizable.strings
|
||||
source_lang = en
|
||||
file_filter = UI/MailerUI/<lang>.lproj/Localizable.strings
|
||||
[sogo.soobjects-appointments]
|
||||
source_file = SoObjects/Appointments/English.lproj/Localizable.strings
|
||||
source_lang = en
|
||||
trans.ar = SoObjects/Appointments/Arabic.lproj/Localizable.strings
|
||||
trans.ca = SoObjects/Appointments/Catalan.lproj/Localizable.strings
|
||||
trans.cs = SoObjects/Appointments/Czech.lproj/Localizable.strings
|
||||
trans.cy = SoObjects/Appointments/Welsh.lproj/Localizable.strings
|
||||
trans.da_DK = SoObjects/Appointments/Danish.lproj/Localizable.strings
|
||||
trans.de = SoObjects/Appointments/German.lproj/Localizable.strings
|
||||
trans.es_AR = SoObjects/Appointments/SpanishArgentina.lproj/Localizable.strings
|
||||
trans.es_ES = SoObjects/Appointments/SpanishSpain.lproj/Localizable.strings
|
||||
trans.eu = SoObjects/Appointments/Basque.lproj/Localizable.strings
|
||||
trans.fi = SoObjects/Appointments/Finnish.lproj/Localizable.strings
|
||||
trans.fr = SoObjects/Appointments/French.lproj/Localizable.strings
|
||||
trans.he = SoObjects/Appointments/Hebrew.lproj/Localizable.strings
|
||||
trans.hr_HR = SoObjects/Appointments/Croatian.lproj/Localizable.strings
|
||||
trans.hu = SoObjects/Appointments/Hungarian.lproj/Localizable.strings
|
||||
trans.id_ID = SoObjects/Appointments/Indonesian.lproj/Localizable.strings
|
||||
trans.is = SoObjects/Appointments/Icelandic.lproj/Localizable.strings
|
||||
trans.it = SoObjects/Appointments/Italian.lproj/Localizable.strings
|
||||
trans.ja = SoObjects/Appointments/Japanese.lproj/Localizable.strings
|
||||
trans.lt = SoObjects/Appointments/Lithuanian.lproj/Localizable.strings
|
||||
trans.lv = SoObjects/Appointments/Latvian.lproj/Localizable.strings
|
||||
trans.mk_MK = SoObjects/Appointments/Macedonian.lproj/Localizable.strings
|
||||
trans.nb_NO = SoObjects/Appointments/NorwegianBokmal.lproj/Localizable.strings
|
||||
trans.nl = SoObjects/Appointments/Dutch.lproj/Localizable.strings
|
||||
trans.nn_NO = SoObjects/Appointments/NorwegianNynorsk.lproj/Localizable.strings
|
||||
trans.pl = SoObjects/Appointments/Polish.lproj/Localizable.strings
|
||||
trans.pt = SoObjects/Appointments/Portuguese.lproj/Localizable.strings
|
||||
trans.pt_BR = SoObjects/Appointments/BrazilianPortuguese.lproj/Localizable.strings
|
||||
trans.ro_RO = SoObjects/Appointments/Romanian.lproj/Localizable.strings
|
||||
trans.ru = SoObjects/Appointments/Russian.lproj/Localizable.strings
|
||||
trans.sk = SoObjects/Appointments/Slovak.lproj/Localizable.strings
|
||||
trans.sl_SI = SoObjects/Appointments/Slovenian.lproj/Localizable.strings
|
||||
trans.sr = SoObjects/Appointments/Serbian.lproj/Localizable.strings
|
||||
trans.sr@latin = SoObjects/Appointments/SerbianLatin.lproj/Localizable.strings
|
||||
trans.sv = SoObjects/Appointments/Swedish.lproj/Localizable.strings
|
||||
trans.tr_TR = SoObjects/Appointments/TurkishTurkey.lproj/Localizable.strings
|
||||
trans.uk = SoObjects/Appointments/Ukrainian.lproj/Localizable.strings
|
||||
trans.zh_CN = SoObjects/Appointments/ChineseChina.lproj/Localizable.strings
|
||||
trans.zh_TW = SoObjects/Appointments/ChineseTaiwan.lproj/Localizable.strings
|
||||
|
||||
[o:alinto:p:sogo:r:ui-mailpartviewers]
|
||||
source_file = UI/MailPartViewers/English.lproj/Localizable.strings
|
||||
source_lang = en
|
||||
file_filter = UI/MailPartViewers/<lang>.lproj/Localizable.strings
|
||||
[sogo.soobjects-contacts]
|
||||
source_file = SoObjects/Contacts/English.lproj/Localizable.strings
|
||||
source_lang = en
|
||||
trans.ar = SoObjects/Contacts/Arabic.lproj/Localizable.strings
|
||||
trans.ca = SoObjects/Contacts/Catalan.lproj/Localizable.strings
|
||||
trans.cs = SoObjects/Contacts/Czech.lproj/Localizable.strings
|
||||
trans.cy = SoObjects/Contacts/Welsh.lproj/Localizable.strings
|
||||
trans.da_DK = SoObjects/Contacts/Danish.lproj/Localizable.strings
|
||||
trans.de = SoObjects/Contacts/German.lproj/Localizable.strings
|
||||
trans.es_AR = SoObjects/Contacts/SpanishArgentina.lproj/Localizable.strings
|
||||
trans.es_ES = SoObjects/Contacts/SpanishSpain.lproj/Localizable.strings
|
||||
trans.eu = SoObjects/Contacts/Basque.lproj/Localizable.strings
|
||||
trans.fi = SoObjects/Contacts/Finnish.lproj/Localizable.strings
|
||||
trans.fr = SoObjects/Contacts/French.lproj/Localizable.strings
|
||||
trans.he = SoObjects/Contacts/Hebrew.lproj/Localizable.strings
|
||||
trans.hr_HR = SoObjects/Contacts/Croatian.lproj/Localizable.strings
|
||||
trans.hu = SoObjects/Contacts/Hungarian.lproj/Localizable.strings
|
||||
trans.id_ID = SoObjects/Contacts/Indonesian.lproj/Localizable.strings
|
||||
trans.is = SoObjects/Contacts/Icelandic.lproj/Localizable.strings
|
||||
trans.it = SoObjects/Contacts/Italian.lproj/Localizable.strings
|
||||
trans.ja = SoObjects/Contacts/Japanese.lproj/Localizable.strings
|
||||
trans.lt = SoObjects/Contacts/Lithuanian.lproj/Localizable.strings
|
||||
trans.lv = SoObjects/Contacts/Latvian.lproj/Localizable.strings
|
||||
trans.mk_MK = SoObjects/Contacts/Macedonian.lproj/Localizable.strings
|
||||
trans.nb_NO = SoObjects/Contacts/NorwegianBokmal.lproj/Localizable.strings
|
||||
trans.nl = SoObjects/Contacts/Dutch.lproj/Localizable.strings
|
||||
trans.nn_NO = SoObjects/Contacts/NorwegianNynorsk.lproj/Localizable.strings
|
||||
trans.pl = SoObjects/Contacts/Polish.lproj/Localizable.strings
|
||||
trans.pt = SoObjects/Contacts/Portuguese.lproj/Localizable.strings
|
||||
trans.pt_BR = SoObjects/Contacts/BrazilianPortuguese.lproj/Localizable.strings
|
||||
trans.ro_RO = SoObjects/Contacts/Romanian.lproj/Localizable.strings
|
||||
trans.ru = SoObjects/Contacts/Russian.lproj/Localizable.strings
|
||||
trans.sk = SoObjects/Contacts/Slovak.lproj/Localizable.strings
|
||||
trans.sl_SI = SoObjects/Contacts/Slovenian.lproj/Localizable.strings
|
||||
trans.sr = SoObjects/Contacts/Serbian.lproj/Localizable.strings
|
||||
trans.sr@latin = SoObjects/Contacts/SerbianLatin.lproj/Localizable.strings
|
||||
trans.sv = SoObjects/Contacts/Swedish.lproj/Localizable.strings
|
||||
trans.tr_TR = SoObjects/Contacts/TurkishTurkey.lproj/Localizable.strings
|
||||
trans.uk = SoObjects/Contacts/Ukrainian.lproj/Localizable.strings
|
||||
trans.zh_CN = SoObjects/Contacts/ChineseChina.lproj/Localizable.strings
|
||||
trans.zh_TW = SoObjects/Contacts/ChineseTaiwan.lproj/Localizable.strings
|
||||
|
||||
[o:alinto:p:sogo:r:ui-mainui]
|
||||
source_file = UI/MainUI/English.lproj/Localizable.strings
|
||||
source_lang = en
|
||||
file_filter = UI/MainUI/<lang>.lproj/Localizable.strings
|
||||
|
||||
[o:alinto:p:sogo:r:ui-preferencesui]
|
||||
source_file = UI/PreferencesUI/English.lproj/Localizable.strings
|
||||
source_lang = en
|
||||
file_filter = UI/PreferencesUI/<lang>.lproj/Localizable.strings
|
||||
|
||||
[o:alinto:p:sogo:r:ui-scheduler]
|
||||
source_file = UI/Scheduler/English.lproj/Localizable.strings
|
||||
source_lang = en
|
||||
file_filter = UI/Scheduler/<lang>.lproj/Localizable.strings
|
||||
[sogo.soobjects-mailer]
|
||||
source_file = SoObjects/Mailer/English.lproj/Localizable.strings
|
||||
source_lang = en
|
||||
trans.ar = SoObjects/Mailer/Arabic.lproj/Localizable.strings
|
||||
trans.ca = SoObjects/Mailer/Catalan.lproj/Localizable.strings
|
||||
trans.cs = SoObjects/Mailer/Czech.lproj/Localizable.strings
|
||||
trans.cy = SoObjects/Mailer/Welsh.lproj/Localizable.strings
|
||||
trans.da_DK = SoObjects/Mailer/Danish.lproj/Localizable.strings
|
||||
trans.de = SoObjects/Mailer/German.lproj/Localizable.strings
|
||||
trans.es_AR = SoObjects/Mailer/SpanishArgentina.lproj/Localizable.strings
|
||||
trans.es_ES = SoObjects/Mailer/SpanishSpain.lproj/Localizable.strings
|
||||
trans.eu = SoObjects/Mailer/Basque.lproj/Localizable.strings
|
||||
trans.fi = SoObjects/Mailer/Finnish.lproj/Localizable.strings
|
||||
trans.fr = SoObjects/Mailer/French.lproj/Localizable.strings
|
||||
trans.he = SoObjects/Mailer/Hebrew.lproj/Localizable.strings
|
||||
trans.hr_HR = SoObjects/Mailer/Croatian.lproj/Localizable.strings
|
||||
trans.hu = SoObjects/Mailer/Hungarian.lproj/Localizable.strings
|
||||
trans.id_ID = SoObjects/Mailer/Indonesian.lproj/Localizable.strings
|
||||
trans.is = SoObjects/Mailer/Icelandic.lproj/Localizable.strings
|
||||
trans.it = SoObjects/Mailer/Italian.lproj/Localizable.strings
|
||||
trans.ja = SoObjects/Mailer/Japanese.lproj/Localizable.strings
|
||||
trans.lt = SoObjects/Mailer/Lithuanian.lproj/Localizable.strings
|
||||
trans.lv = SoObjects/Mailer/Latvian.lproj/Localizable.strings
|
||||
trans.mk_MK = SoObjects/Mailer/Macedonian.lproj/Localizable.strings
|
||||
trans.nb_NO = SoObjects/Mailer/NorwegianBokmal.lproj/Localizable.strings
|
||||
trans.nl = SoObjects/Mailer/Dutch.lproj/Localizable.strings
|
||||
trans.nn_NO = SoObjects/Mailer/NorwegianNynorsk.lproj/Localizable.strings
|
||||
trans.pl = SoObjects/Mailer/Polish.lproj/Localizable.strings
|
||||
trans.pt = SoObjects/Mailer/Portuguese.lproj/Localizable.strings
|
||||
trans.pt_BR = SoObjects/Mailer/BrazilianPortuguese.lproj/Localizable.strings
|
||||
trans.ro_RO = SoObjects/Mailer/Romanian.lproj/Localizable.strings
|
||||
trans.ru = SoObjects/Mailer/Russian.lproj/Localizable.strings
|
||||
trans.sk = SoObjects/Mailer/Slovak.lproj/Localizable.strings
|
||||
trans.sl_SI = SoObjects/Mailer/Slovenian.lproj/Localizable.strings
|
||||
trans.sr = SoObjects/Mailer/Serbian.lproj/Localizable.strings
|
||||
trans.sr@latin = SoObjects/Mailer/SerbianLatin.lproj/Localizable.strings
|
||||
trans.sv = SoObjects/Mailer/Swedish.lproj/Localizable.strings
|
||||
trans.tr_TR = SoObjects/Mailer/TurkishTurkey.lproj/Localizable.strings
|
||||
trans.uk = SoObjects/Mailer/Ukrainian.lproj/Localizable.strings
|
||||
trans.zh_CN = SoObjects/Mailer/ChineseChina.lproj/Localizable.strings
|
||||
trans.zh_TW = SoObjects/Mailer/ChineseTaiwan.lproj/Localizable.strings
|
||||
|
||||
[sogo.ui-mailpartviewers]
|
||||
source_file = UI/MailPartViewers/English.lproj/Localizable.strings
|
||||
source_lang = en
|
||||
trans.ar = UI/MailPartViewers/Arabic.lproj/Localizable.strings
|
||||
trans.ca = UI/MailPartViewers/Catalan.lproj/Localizable.strings
|
||||
trans.cs = UI/MailPartViewers/Czech.lproj/Localizable.strings
|
||||
trans.cy = UI/MailPartViewers/Welsh.lproj/Localizable.strings
|
||||
trans.da_DK = UI/MailPartViewers/Danish.lproj/Localizable.strings
|
||||
trans.de = UI/MailPartViewers/German.lproj/Localizable.strings
|
||||
trans.es_AR = UI/MailPartViewers/SpanishArgentina.lproj/Localizable.strings
|
||||
trans.es_ES = UI/MailPartViewers/SpanishSpain.lproj/Localizable.strings
|
||||
trans.eu = UI/MailPartViewers/Basque.lproj/Localizable.strings
|
||||
trans.fi = UI/MailPartViewers/Finnish.lproj/Localizable.strings
|
||||
trans.fr = UI/MailPartViewers/French.lproj/Localizable.strings
|
||||
trans.he = UI/MailPartViewers/Hebrew.lproj/Localizable.strings
|
||||
trans.hr_HR = UI/MailPartViewers/Croatian.lproj/Localizable.strings
|
||||
trans.hu = UI/MailPartViewers/Hungarian.lproj/Localizable.strings
|
||||
trans.id_ID = UI/MailPartViewers/Indonesian.lproj/Localizable.strings
|
||||
trans.is = UI/MailPartViewers/Icelandic.lproj/Localizable.strings
|
||||
trans.it = UI/MailPartViewers/Italian.lproj/Localizable.strings
|
||||
trans.ja = UI/MailPartViewers/Japanese.lproj/Localizable.strings
|
||||
trans.lt = UI/MailPartViewers/Lithuanian.lproj/Localizable.strings
|
||||
trans.lv = UI/MailPartViewers/Latvian.lproj/Localizable.strings
|
||||
trans.mk_MK = UI/MailPartViewers/Macedonian.lproj/Localizable.strings
|
||||
trans.nb_NO = UI/MailPartViewers/NorwegianBokmal.lproj/Localizable.strings
|
||||
trans.nl = UI/MailPartViewers/Dutch.lproj/Localizable.strings
|
||||
trans.nn_NO = UI/MailPartViewers/NorwegianNynorsk.lproj/Localizable.strings
|
||||
trans.pl = UI/MailPartViewers/Polish.lproj/Localizable.strings
|
||||
trans.pt = UI/MailPartViewers/Portuguese.lproj/Localizable.strings
|
||||
trans.pt_BR = UI/MailPartViewers/BrazilianPortuguese.lproj/Localizable.strings
|
||||
trans.ro_RO = UI/MailPartViewers/Romanian.lproj/Localizable.strings
|
||||
trans.ru = UI/MailPartViewers/Russian.lproj/Localizable.strings
|
||||
trans.sk = UI/MailPartViewers/Slovak.lproj/Localizable.strings
|
||||
trans.sl_SI = UI/MailPartViewers/Slovenian.lproj/Localizable.strings
|
||||
trans.sr = UI/MailPartViewers/Serbian.lproj/Localizable.strings
|
||||
trans.sr@latin = UI/MailPartViewers/SerbianLatin.lproj/Localizable.strings
|
||||
trans.sv = UI/MailPartViewers/Swedish.lproj/Localizable.strings
|
||||
trans.tr_TR = UI/MailPartViewers/TurkishTurkey.lproj/Localizable.strings
|
||||
trans.uk = UI/MailPartViewers/Ukrainian.lproj/Localizable.strings
|
||||
trans.zh_CN = UI/MailPartViewers/ChineseChina.lproj/Localizable.strings
|
||||
trans.zh_TW = UI/MailPartViewers/ChineseTaiwan.lproj/Localizable.strings
|
||||
+1
-1
@@ -5,7 +5,7 @@ const tracker = {
|
||||
|
||||
module.exports = {
|
||||
tagPrefix: "SOGo-",
|
||||
issueUrlFormat: "https://bugs.sogo.nu/view.php?id={{id}}",
|
||||
issueUrlFormat: "https://sogo.nu/bugs/view.php?id={{id}}",
|
||||
compareUrlFormat: "{{host}}/{{owner}}/{{repository}}/compare/{{previousTag}}...{{currentTag}}",
|
||||
types: [
|
||||
{type: "feat", section: "Features"},
|
||||
|
||||
@@ -1,28 +0,0 @@
|
||||
|
||||
# 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
|
||||
@@ -1,16 +0,0 @@
|
||||
# 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
|
||||
@@ -1,35 +0,0 @@
|
||||
/*
|
||||
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
|
||||
@@ -1,52 +0,0 @@
|
||||
/*
|
||||
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.
@@ -1,54 +0,0 @@
|
||||
/*
|
||||
|
||||
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
|
||||
@@ -1,399 +0,0 @@
|
||||
/*
|
||||
|
||||
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
|
||||
@@ -1,11 +0,0 @@
|
||||
/*
|
||||
Copyright (C) todo...
|
||||
*/
|
||||
|
||||
#import <Foundation/NSObject.h>
|
||||
|
||||
@interface SOGoAPIProduct : NSObject
|
||||
@end
|
||||
|
||||
@implementation SOGoAPIProduct
|
||||
@end /* SOGoAPIProduct */
|
||||
@@ -1,33 +0,0 @@
|
||||
/*
|
||||
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
|
||||
@@ -1,74 +0,0 @@
|
||||
/*
|
||||
Copyright (C) todo...
|
||||
*/
|
||||
|
||||
#import <SOGoAPIUserFolder.h>
|
||||
|
||||
#import <GDLContentStore/GCSFolderManager.h>
|
||||
|
||||
@implementation SOGoAPIUserFolder
|
||||
|
||||
- (id) init
|
||||
{
|
||||
[super init];
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
- (void) dealloc
|
||||
{
|
||||
[super dealloc];
|
||||
}
|
||||
|
||||
|
||||
- (NSDictionary *) action: (WOContext*) ctx withParam: (NSDictionary *) param
|
||||
{
|
||||
NSDictionary* result;
|
||||
NSArray *folders;
|
||||
NSMutableArray *cardavLinks, *caldavLinks;
|
||||
NSString *serverUrl, *basePath, *c_uid, *url;
|
||||
GCSFolderManager *fm;
|
||||
int max, i;
|
||||
|
||||
//Should be a user
|
||||
c_uid = [[[param objectForKey: @"user"] objectForKey: @"emails"] objectAtIndex: 0];
|
||||
|
||||
//fetch folders
|
||||
fm = [GCSFolderManager defaultFolderManager];
|
||||
basePath = [NSString stringWithFormat: @"/Users/%@", c_uid];
|
||||
folders = [fm listSubFoldersAtPath: basePath recursive: YES];
|
||||
|
||||
//Generate dav link
|
||||
max = [folders count];
|
||||
serverUrl = [[ctx serverURL] absoluteString];
|
||||
|
||||
cardavLinks = [NSMutableArray array];
|
||||
caldavLinks = [NSMutableArray array];
|
||||
serverUrl = [[ctx serverURL] absoluteString];
|
||||
for (i = 0; i < max; i++)
|
||||
{
|
||||
url = [NSString stringWithFormat: @"%@/SOGo/dav/%@/%@", serverUrl, c_uid, [folders objectAtIndex: i]];
|
||||
if([url rangeOfString:@"/Calendar/"].location == NSNotFound)
|
||||
{
|
||||
//Contacts
|
||||
[cardavLinks addObject: url];
|
||||
}
|
||||
else
|
||||
{
|
||||
//Calendar
|
||||
[caldavLinks addObject: url];
|
||||
}
|
||||
}
|
||||
|
||||
result = [[NSDictionary alloc] initWithObjectsAndKeys:
|
||||
c_uid, @"username",
|
||||
cardavLinks, @"contact",
|
||||
caldavLinks, @"calendar",
|
||||
nil];
|
||||
|
||||
[result autorelease];
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
@end /* SOGoAPIVersion */
|
||||
@@ -1,33 +0,0 @@
|
||||
/*
|
||||
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
|
||||
@@ -1,42 +0,0 @@
|
||||
/*
|
||||
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 */
|
||||
@@ -1,34 +0,0 @@
|
||||
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)
|
||||
@@ -1,31 +0,0 @@
|
||||
{
|
||||
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 += $(shell pkg-config --cflags libwbxml2)
|
||||
ADDITIONAL_INCLUDE_DIRS += -I/usr/include/libwbxml-1.0/
|
||||
ADDITIONAL_LDFLAGS += -Wl,--no-as-needed -lwbxml2
|
||||
|
||||
-include GNUmakefile.preamble
|
||||
|
||||
@@ -36,7 +36,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
@interface NGMimeMessage (ActiveSync)
|
||||
|
||||
- (NSArray *) allBareRecipients;
|
||||
- (NSArray *) allRecipients;
|
||||
|
||||
@end
|
||||
|
||||
|
||||
@@ -38,47 +38,39 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
@implementation NGMimeMessage (ActiveSync)
|
||||
|
||||
- (NSArray *) allRecipients
|
||||
- (void) _addRecipients: (NSEnumerator *) enumerator
|
||||
toArray: (NSMutableArray *) recipients
|
||||
{
|
||||
NGMailAddressParser *parser;
|
||||
NSEnumerator *addressList;
|
||||
NSMutableArray *allRecipients;
|
||||
NGMailAddress *address;
|
||||
NSEnumerator *recipients;
|
||||
NSString *s;
|
||||
NSString *fieldNames[] = {@"to", @"cc", @"bcc"};
|
||||
unsigned int count;
|
||||
|
||||
allRecipients = [NSMutableArray arrayWithCapacity: 16];
|
||||
|
||||
for (count = 0; count < 3; count++)
|
||||
while ((s = [enumerator nextObject]))
|
||||
{
|
||||
recipients = [[self headersForKey: fieldNames[count]] objectEnumerator];
|
||||
while ((s = [recipients nextObject]))
|
||||
{
|
||||
parser = [NGMailAddressParser mailAddressParserWithString: s];
|
||||
addressList = [[parser parseAddressList] objectEnumerator];
|
||||
while ((address = [addressList nextObject]))
|
||||
[allRecipients addObject: [address address]];
|
||||
}
|
||||
parser = [NGMailAddressParser mailAddressParserWithString: s];
|
||||
addressList = [[parser parseAddressList] objectEnumerator];
|
||||
|
||||
while ((address = [addressList nextObject]))
|
||||
[recipients addObject: [address address]];
|
||||
}
|
||||
|
||||
return allRecipients;
|
||||
}
|
||||
|
||||
- (NSArray *) allBareRecipients
|
||||
- (NSArray *) allRecipients
|
||||
{
|
||||
NSMutableArray *bareRecipients;
|
||||
NSEnumerator *allRecipients;
|
||||
NSString *recipient;
|
||||
NSMutableArray *recipients;
|
||||
|
||||
bareRecipients = [NSMutableArray array];
|
||||
recipients = [NSMutableArray array];
|
||||
|
||||
allRecipients = [[self allRecipients] objectEnumerator];
|
||||
while ((recipient = [allRecipients nextObject]))
|
||||
[bareRecipients addObject: [recipient pureEMailAddress]];
|
||||
[self _addRecipients: [[self headersForKey: @"to"] objectEnumerator]
|
||||
toArray: recipients];
|
||||
|
||||
return bareRecipients;
|
||||
[self _addRecipients: [[self headersForKey: @"cc"] objectEnumerator]
|
||||
toArray: recipients];
|
||||
|
||||
[self _addRecipients: [[self headersForKey: @"bcc"] objectEnumerator]
|
||||
toArray: recipients];
|
||||
|
||||
return recipients;
|
||||
}
|
||||
|
||||
@end
|
||||
@@ -114,7 +114,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
if (ret != WBXML_OK)
|
||||
{
|
||||
[self errorWithFormat: @"wbxml2xml failed: %s\n", wbxml_errors_string(ret)];
|
||||
[self errorWithFormat: @"wbxml2xmlFromContent: failed: %s\n", wbxml_errors_string(ret)];
|
||||
[self _dumpToFile];
|
||||
return nil;
|
||||
}
|
||||
@@ -147,7 +147,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
if (ret != WBXML_OK)
|
||||
{
|
||||
[self logWithFormat: @"xml2wbxml failed: %s\n", wbxml_errors_string(ret)];
|
||||
[self logWithFormat: @"xml2wbxmlFromContent: failed: %s\n", wbxml_errors_string(ret)];
|
||||
[self _dumpToFile];
|
||||
return nil;
|
||||
}
|
||||
@@ -162,7 +162,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
if (ret != WBXML_OK)
|
||||
{
|
||||
[self errorWithFormat: @"xml2wbxml failed: %s\n", wbxml_errors_string(ret)];
|
||||
[self errorWithFormat: @"xml2wbxmlFromContent: failed: %s\n", wbxml_errors_string(ret)];
|
||||
[self _dumpToFile];
|
||||
free(wbxml);
|
||||
wbxml_conv_xml2wbxml_destroy(conv);
|
||||
|
||||
@@ -2627,17 +2627,17 @@ FIXME
|
||||
// We first check of any of the collections we want to sync are already
|
||||
// in an other sync process. If that's the case, we do not do anything
|
||||
// and we return immediately. So we'll let the other sync process terminate
|
||||
globalMetadata = [self globalMetadataForDevice];
|
||||
for (j = 0; j < [allCollections count]; j++)
|
||||
{
|
||||
aCollection = [allCollections objectAtIndex: j];
|
||||
globalMetadata = [self globalMetadataForDevice];
|
||||
|
||||
key = [NSString stringWithFormat: @"SyncRequest+%@", [[[(id)[aCollection getElementsByTagName: @"CollectionId"] lastObject] textValue] stringByUnescapingURL]];
|
||||
|
||||
if (!([[globalMetadata objectForKey: key] isEqual: processIdentifier]))
|
||||
{
|
||||
if (debugOn)
|
||||
[self logWithFormat: @"EAS - Discard response %@", globalMetadata];
|
||||
[self logWithFormat: @"EAS - Discard response %@", [self globalMetadataForDevice]];
|
||||
|
||||
[output appendString: @"<Status>13</Status>"];
|
||||
[output appendString: @"</Sync>"];
|
||||
|
||||
File diff suppressed because it is too large.
Load diff
@@ -60,7 +60,6 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#import <NGMime/NGMimeFileData.h>
|
||||
#import <NGMime/NGMimeMultipartBody.h>
|
||||
#import <NGMime/NGMimeType.h>
|
||||
#import <NGMime/NGMimeHeaderFields.h>
|
||||
#import <NGMail/NGMimeMessageParser.h>
|
||||
#import <NGMail/NGMimeMessage.h>
|
||||
#import <NGMail/NGMimeMessageGenerator.h>
|
||||
@@ -291,36 +290,6 @@ struct GlobalObjectId {
|
||||
}
|
||||
|
||||
|
||||
// Format replyTo
|
||||
//
|
||||
// If there are multiple e-mail addresses, they are separated by a semi-colon.
|
||||
- (NSString *) _replyToAddressesFrom: (NSArray *) enveloppeAddresses
|
||||
{
|
||||
NSMutableArray *addresses;
|
||||
NSString *rc;
|
||||
NGImap4EnvelopeAddress *address;
|
||||
NSString *email;
|
||||
int count, max;
|
||||
|
||||
rc = nil;
|
||||
max = [enveloppeAddresses count];
|
||||
|
||||
if (max > 0)
|
||||
{
|
||||
addresses = [NSMutableArray array];
|
||||
for (count = 0; count < max; count++)
|
||||
{
|
||||
address = [enveloppeAddresses objectAtIndex: count];
|
||||
email = [NSString stringWithFormat: @"%@", [address email]];
|
||||
|
||||
[addresses addObject: email];
|
||||
}
|
||||
rc = [addresses componentsJoinedByString: @"; "];
|
||||
}
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
//
|
||||
//
|
||||
//
|
||||
@@ -410,7 +379,7 @@ struct GlobalObjectId {
|
||||
|
||||
charset = [[[self lookupInfoForBodyPart: key] objectForKey: @"parameterList"] objectForKey: @"charset"];
|
||||
|
||||
if (![charset length] || [charset caseInsensitiveCompare: @"us-ascii"] == NSOrderedSame)
|
||||
if (![charset length])
|
||||
charset = @"utf-8";
|
||||
|
||||
s = [NSString stringWithData: d usingEncodingNamed: charset];
|
||||
@@ -457,7 +426,7 @@ struct GlobalObjectId {
|
||||
|
||||
body = [thePart body];
|
||||
|
||||
if ([body isKindOfClass: [NGMimeMultipartBody class]] || [body isKindOfClass: [NGMimeMessage class]])
|
||||
if ([body isKindOfClass: [NGMimeMultipartBody class]])
|
||||
{
|
||||
[self _sanitizedMIMEPart: body
|
||||
performed: b];
|
||||
@@ -509,13 +478,6 @@ struct GlobalObjectId {
|
||||
RELEASE(fdata);
|
||||
*b = YES;
|
||||
}
|
||||
else if ([body isKindOfClass: [NSData class]])
|
||||
{
|
||||
[thePart setHeader: @"base64" forKey: @"content-transfer-encoding"];
|
||||
[thePart setBody: [body dataByEncodingBase64]];
|
||||
[thePart setHeader: [NSString stringWithFormat:@"%d", (int)[[thePart body] length]]
|
||||
forKey: @"content-length"];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -708,7 +670,7 @@ struct GlobalObjectId {
|
||||
|
||||
charset = [[[self lookupInfoForBodyPart: @""] objectForKey: @"parameterList"] objectForKey: @"charset"];
|
||||
|
||||
if (![charset length] || [charset caseInsensitiveCompare: @"us-ascii"] == NSOrderedSame)
|
||||
if (![charset length])
|
||||
charset = @"utf-8";
|
||||
|
||||
d = [[self fetchPlainTextParts] objectForKey: @""];
|
||||
@@ -1139,11 +1101,10 @@ struct GlobalObjectId {
|
||||
[s appendFormat: @"<ContentClass xmlns=\"Email:\">%@</ContentClass>", @"urn:content-classes:message"];
|
||||
}
|
||||
|
||||
// ReplyTo
|
||||
value = [self _replyToAddressesFrom: [self replyToEnvelopeAddresses]];
|
||||
if (value)
|
||||
[s appendFormat: @"<Reply-To xmlns=\"Email:\">%@</Reply-To>", [value activeSyncRepresentationInContext: context]];
|
||||
|
||||
// Reply-To - FIXME
|
||||
//NSArray *replyTo = [[message objectForKey: @"envelope"] replyTo];
|
||||
//if ([replyTo count])
|
||||
// [s appendFormat: @"<Reply-To xmlns=\"Email:\">%@</Reply-To>", [addressFormatter stringForArray: replyTo]];
|
||||
|
||||
// InternetCPID - 65001 == UTF-8, we use this all the time for now.
|
||||
// - 20127 == US-ASCII
|
||||
|
||||
@@ -40,7 +40,7 @@
|
||||
<Proxy http://127.0.0.1:20000>
|
||||
RequestHeader set "x-webobjects-server-port" "8843"
|
||||
RequestHeader set "x-webobjects-server-name" "CHANGETHIS:8843"
|
||||
RequestHeader set "x-webobjects-server-url" "https://CHANGETHIS:8843"
|
||||
RequestHeader set "x-webobjects-server-url" "http://CHANGETHIS:8843"
|
||||
RequestHeader set "x-webobjects-server-protocol" "HTTP/1.0"
|
||||
AddDefaultCharset UTF-8
|
||||
</Proxy>
|
||||
|
||||
+11
-20
@@ -25,11 +25,6 @@ Alias /SOGo/WebServerResources/ \
|
||||
# Don't send the Referer header for cross-origin requests
|
||||
Header always set Referrer-Policy "same-origin"
|
||||
|
||||
<Location /SOGo>
|
||||
# Don't cache dynamic content
|
||||
Header set Cache-Control "max-age=0, no-cache, no-store"
|
||||
</Location>
|
||||
|
||||
## Uncomment the following to enable proxy-side authentication, you will then
|
||||
## need to set the "SOGoTrustProxyAuthentication" SOGo user default to YES and
|
||||
## adjust the "x-webobjects-remote-user" proxy header in the "Proxy" section
|
||||
@@ -53,12 +48,8 @@ Header always set Referrer-Policy "same-origin"
|
||||
#</Location>
|
||||
|
||||
ProxyRequests Off
|
||||
ProxyPreserveHost On
|
||||
SetEnv proxy-nokeepalive 1
|
||||
|
||||
# Uncomment the following lines if you experience "Bad gateway" errors with mod_proxy
|
||||
#SetEnv proxy-initial-not-pooled 1
|
||||
#SetEnv force-proxy-request-1.0 1
|
||||
ProxyPreserveHost On
|
||||
|
||||
# When using CAS, you should uncomment this and install cas-proxy-validate.py
|
||||
# in /usr/lib/cgi-bin to reduce server overloading
|
||||
@@ -80,24 +71,24 @@ SetEnv proxy-nokeepalive 1
|
||||
# http://127.0.0.1:20000/SOGo/Microsoft-Server-ActiveSync \
|
||||
# retry=60 connectiontimeout=5 timeout=360
|
||||
|
||||
ProxyPass /SOGo http://127.0.0.1:20000/SOGo retry=0 nocanon
|
||||
ProxyPass /SOGo http://127.0.0.1:20000/SOGo retry=0
|
||||
|
||||
<Proxy http://127.0.0.1:20000/SOGo>
|
||||
## Adjust the following to your configuration
|
||||
## and make sure to enable the headers module
|
||||
<IfModule headers_module>
|
||||
RequestHeader set "x-webobjects-server-port" "443"
|
||||
SetEnvIf Host (.*) HTTP_HOST=$1
|
||||
RequestHeader set "x-webobjects-server-name" "%{HTTP_HOST}e" env=HTTP_HOST
|
||||
RequestHeader set "x-webobjects-server-url" "https://%{HTTP_HOST}e" env=HTTP_HOST
|
||||
<IfModule headers_module>
|
||||
RequestHeader set "x-webobjects-server-port" "443"
|
||||
SetEnvIf Host (.*) HTTP_HOST=$1
|
||||
RequestHeader set "x-webobjects-server-name" "%{HTTP_HOST}e" env=HTTP_HOST
|
||||
RequestHeader set "x-webobjects-server-url" "https://%{HTTP_HOST}e" env=HTTP_HOST
|
||||
|
||||
## When using proxy-side autentication, you need to uncomment and
|
||||
## adjust the following line:
|
||||
RequestHeader unset "x-webobjects-remote-user"
|
||||
# RequestHeader set "x-webobjects-remote-user" "%{REMOTE_USER}e" env=REMOTE_USER
|
||||
RequestHeader unset "x-webobjects-remote-user"
|
||||
# RequestHeader set "x-webobjects-remote-user" "%{REMOTE_USER}e" env=REMOTE_USER
|
||||
|
||||
RequestHeader set "x-webobjects-server-protocol" "HTTP/1.0"
|
||||
</IfModule>
|
||||
RequestHeader set "x-webobjects-server-protocol" "HTTP/1.0"
|
||||
</IfModule>
|
||||
|
||||
AddDefaultCharset UTF-8
|
||||
|
||||
|
||||
-1216
File diff suppressed because it is too large.
Load diff
@@ -8,7 +8,7 @@ HTML = $(patsubst %.asciidoc,%.html, $(ASCIIDOCS))
|
||||
asciidoctor-pdf \
|
||||
-a pdf-fontsdir=fonts \
|
||||
-a release_version=`git describe --abbrev=0 --tags | cut -d'-' -f 2` \
|
||||
-a release_month=`LANG=en_US.UTF-8 date +%B` \
|
||||
-a release_month=`date +%B` \
|
||||
-a pdf-theme=asciidoctor-pdf-theme.yml \
|
||||
--trace \
|
||||
$<
|
||||
@@ -17,7 +17,7 @@ HTML = $(patsubst %.asciidoc,%.html, $(ASCIIDOCS))
|
||||
asciidoctor \
|
||||
-D . \
|
||||
-a release_version=`git describe --abbrev=0 --tags | cut -d'-' -f 2` \
|
||||
-a release_month=`LANG=en_US.UTF-8 date +%B` \
|
||||
-a release_month=`date +%B` \
|
||||
-n \
|
||||
$<
|
||||
|
||||
|
||||
File diff suppressed because it is too large.
Load diff
@@ -22,7 +22,7 @@ devices (iPhone, iPod touch, and iPad).
|
||||
The instructions are based on version {release_version} of SOGo.
|
||||
|
||||
The latest version of this guide is available at
|
||||
https://www.sogo.nu/support.html#/documentation.
|
||||
https://sogo.nu/downloads/documentation.html.
|
||||
|
||||
Introduction
|
||||
------------
|
||||
|
||||
@@ -46,7 +46,7 @@ device, or Outlook 2013
|
||||
|
||||
SOGo is developed by a community of developers located mainly in North
|
||||
America and Europe. More information can be found on
|
||||
https://www.sogo.nu/.
|
||||
http://www.sogo.nu/.
|
||||
|
||||
Installation
|
||||
------------
|
||||
@@ -167,7 +167,7 @@ For example, one would replace:
|
||||
|
||||
by:
|
||||
|
||||
<Seq about="https://sogo.nu" isi:updateURL="https://sogo.acme.com/plugins/updates.php?plugin=%ITEM_ID%&version=%ITEM_VERSION%&platform=%PLATFORM%">
|
||||
<Seq about="http://inverse.ca/sogo-integrator/extensions" isi:updateURL="https://sogo.acme.com/plugins/updates.php?plugin=%ITEM_ID%&version=%ITEM_VERSION%&platform=%PLATFORM%">
|
||||
|
||||
if the SOGo server is accessible from the following URL:
|
||||
|
||||
|
||||
@@ -22,7 +22,7 @@ Guide_ for more information on installing and configuring SOGo.
|
||||
The instructions are based on version {release_version} of SOGo.
|
||||
|
||||
The latest version of this guide is available
|
||||
at https://www.sogo.nu/support.html#/documentation.
|
||||
at https://sogo.nu/downloads/documentation.html.
|
||||
|
||||
Introduction
|
||||
------------
|
||||
@@ -50,7 +50,7 @@ https://www.facebook.com/caldavsynchronizer/[CalDav Synchronizer on Facebook]
|
||||
Enterprise Support
|
||||
~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Alinto (https://alinto.com/[http://alinto.com]) offers professional services around SOGo to help organizations deploy the solution and
|
||||
Inverse (http://inverse.ca/[http://inverse.ca]) offers professional services around SOGo to help organizations deploy the solution and
|
||||
migrate from their legacy systems.
|
||||
|
||||
For enterprise support on the integration between SOGo and Microsoft Outlook using the Outlook CalDav Synchronizer, please visit https://caldavsynchronizer.org/enterprise
|
||||
|
||||
@@ -1,323 +0,0 @@
|
||||
#
|
||||
# https://github.com/asciidoctor/asciidoctor-pdf/blob/master/docs/theming-guide.adoc
|
||||
#
|
||||
|
||||
font:
|
||||
catalog:
|
||||
# Noto Serif supports Latin, Latin-1 Supplement, Latin Extended-A, Greek, Cyrillic, Vietnamese & an assortment of symbols
|
||||
#Noto Serif:
|
||||
# normal: notoserif-regular-subset.ttf
|
||||
# bold: notoserif-bold-subset.ttf
|
||||
# italic: notoserif-italic-subset.ttf
|
||||
# bold_italic: notoserif-bold_italic-subset.ttf
|
||||
Lato-Light:
|
||||
normal: lato/Lato-Light.ttf
|
||||
bold: lato/Lato-Regular.ttf
|
||||
italic: lato/Lato-LightItalic.ttf
|
||||
bold_italic: lato/Lato-Italic.ttf
|
||||
# M+ 1mn supports ASCII and the circled numbers used for conums
|
||||
#M+ 1mn:
|
||||
# normal: mplus1mn-regular-subset.ttf
|
||||
# bold: mplus1mn-bold-subset.ttf
|
||||
# italic: mplus1mn-italic-subset.ttf
|
||||
# bold_italic: mplus1mn-bold_italic-subset.ttf
|
||||
Inconsolata:
|
||||
normal: inconsolata.ttf
|
||||
bold: inconsolata.ttf
|
||||
italic: inconsolata.ttf
|
||||
bold_italic: inconsolata.ttf
|
||||
page:
|
||||
background_color: FFFFFF
|
||||
layout: portrait
|
||||
initial_zoom: FitH
|
||||
margin: [1in, 1in, 1in, 1in]
|
||||
# margin_inner and margin_outer keys are used for recto/verso print margins when media=prepress
|
||||
margin_inner: 1in
|
||||
margin_outer: 1in
|
||||
size: Letter
|
||||
base:
|
||||
align: justify
|
||||
# color as hex string (leading # is optional)
|
||||
font_color: 333333
|
||||
font_color: 000000
|
||||
# color as RGB array
|
||||
#font_color: [51, 51, 51]
|
||||
# color as CMYK array (approximated)
|
||||
#font_color: [0, 0, 0, 0.92]
|
||||
#font_color: [0, 0, 0, 92%]
|
||||
font_family: Lato-Light
|
||||
# choose one of these font_size/line_height_length combinations
|
||||
#font_size: 14
|
||||
#line_height_length: 20
|
||||
#font_size: 11.25
|
||||
#line_height_length: 18
|
||||
#font_size: 11.2
|
||||
#line_height_length: 16
|
||||
font_size: 10
|
||||
#line_height_length: 15
|
||||
# correct line height for Noto Serif metrics
|
||||
line_height_length: 10
|
||||
#font_size: 11.25
|
||||
#line_height_length: 18
|
||||
line_height: $base_line_height_length / $base_font_size
|
||||
font_size_large: round($base_font_size * 1.25)
|
||||
font_size_small: round($base_font_size * 0.85)
|
||||
font_size_min: $base_font_size * 0.75
|
||||
font_style: normal
|
||||
border_color: EEEEEE
|
||||
border_radius: 4
|
||||
border_width: 0.5
|
||||
section:
|
||||
indent: [0.67in, 0]
|
||||
role:
|
||||
line-through:
|
||||
text_decoration: line-through
|
||||
underline:
|
||||
text_decoration: underline
|
||||
big:
|
||||
font_size: $base_font_size_large
|
||||
small:
|
||||
font_size: $base_font_size_small
|
||||
subtitle:
|
||||
font_size: 0.8em
|
||||
font_color: 999999
|
||||
# FIXME vertical_rhythm is weird; we should think in terms of ems
|
||||
#vertical_rhythm: $base_line_height_length * 2 / 3
|
||||
# correct line height for Noto Serif metrics (comes with built-in line height)
|
||||
vertical_rhythm: $base_line_height_length
|
||||
horizontal_rhythm: $base_line_height_length
|
||||
# QUESTION should vertical_spacing be block_spacing instead?
|
||||
vertical_spacing: $vertical_rhythm
|
||||
link:
|
||||
font_color: 428BCA
|
||||
font_color: 007BFF
|
||||
# literal is currently used for inline monospaced in prose and table cells
|
||||
literal:
|
||||
font_color: 333333
|
||||
font_color: B12146
|
||||
font_color: E83E8C
|
||||
font_family: Inconsolata
|
||||
button:
|
||||
content: "[\u2009%s\u2009]"
|
||||
font_style: bold
|
||||
key:
|
||||
background_color: F5F5F5
|
||||
background_color: F8F8F8
|
||||
border_color: CCCCCC
|
||||
border_offset: 2
|
||||
border_radius: 2
|
||||
border_width: 0.5
|
||||
font_family: $literal_font_family
|
||||
separator: "\u202f+\u202f"
|
||||
mark:
|
||||
background_color: FFFF00
|
||||
border_offset: 1
|
||||
menu:
|
||||
caret_content: " <font size=\"1.15em\"><color rgb=\"b12146\">\u203a</color></font> "
|
||||
heading:
|
||||
align: left
|
||||
font_color: $base_font_color
|
||||
font_style: bold
|
||||
# h1 is used for part titles (book doctype) or the doctitle (article doctype)
|
||||
h1_font_size: floor($base_font_size * 2.6)
|
||||
# h2 is used for chapter titles (book doctype only)
|
||||
h2_font_size: floor($base_font_size * 2.15)
|
||||
h3_font_size: round($base_font_size * 1.7)
|
||||
h4_font_size: $base_font_size_large
|
||||
h5_font_size: $base_font_size
|
||||
h6_font_size: $base_font_size_small
|
||||
#line_height: 1.4
|
||||
# correct line height for Noto Serif metrics (comes with built-in line height)
|
||||
line_height: 1
|
||||
margin_top: $vertical_rhythm * 0.4
|
||||
margin_bottom: $vertical_rhythm * 0.9
|
||||
min_height_after: $base_line_height_length * 1.5
|
||||
h2-margin_bottom: 60
|
||||
#h2-text_decoration: underline
|
||||
title_page:
|
||||
align: right
|
||||
logo:
|
||||
top: 10%
|
||||
title:
|
||||
top: 55%
|
||||
font_size: $heading_h1_font_size
|
||||
font_color: 999999
|
||||
font_color: $base_font_color
|
||||
line_height: 0.9
|
||||
subtitle:
|
||||
font_size: $heading_h3_font_size
|
||||
font_style: bold_italic
|
||||
line_height: 1
|
||||
authors:
|
||||
margin_top: $base_font_size * 1.25
|
||||
font_size: $base_font_size_large
|
||||
font_color: 181818
|
||||
revision:
|
||||
margin_top: $base_font_size * 1.25
|
||||
block:
|
||||
margin_top: 0
|
||||
margin_bottom: $vertical_rhythm
|
||||
caption:
|
||||
align: left
|
||||
font_size: $base_font_size * 0.95
|
||||
font_style: italic
|
||||
# FIXME perhaps set line_height instead of / in addition to margins?
|
||||
margin_inside: $vertical_rhythm / 3
|
||||
#margin_inside: $vertical_rhythm / 4
|
||||
margin_outside: 0
|
||||
lead:
|
||||
font_size: $base_font_size_large
|
||||
line_height: 1.4
|
||||
abstract:
|
||||
font_color: 5C6266
|
||||
font_size: $lead_font_size
|
||||
line_height: $lead_line_height
|
||||
font_style: italic
|
||||
first_line_font_style: bold
|
||||
title:
|
||||
align: center
|
||||
font_color: $heading_font_color
|
||||
font_size: $heading_h4_font_size
|
||||
font_style: $heading_font_style
|
||||
admonition:
|
||||
column_rule_color: $base_border_color
|
||||
column_rule_width: $base_border_width
|
||||
padding: [0, $horizontal_rhythm, 0, $horizontal_rhythm]
|
||||
# icon:
|
||||
# caution:
|
||||
# name: far-lightbulb
|
||||
# name: fa-fire
|
||||
# stroke_color: 111111
|
||||
# size: 24
|
||||
label:
|
||||
text_transform: uppercase
|
||||
font_style: bold
|
||||
# caution:
|
||||
# font_color: F77D05
|
||||
blockquote:
|
||||
font_size: $base_font_size_large
|
||||
border_color: $base_border_color
|
||||
border_width: 0
|
||||
border_left_width: 5
|
||||
# FIXME disable negative padding bottom once margin collapsing is implemented
|
||||
padding: [0, $horizontal_rhythm, $block_margin_bottom * -0.75, $horizontal_rhythm + $blockquote_border_left_width / 2]
|
||||
cite_font_size: $base_font_size_small
|
||||
cite_font_color: 999999
|
||||
verse:
|
||||
font_size: $blockquote_font_size
|
||||
border_color: $blockquote_border_color
|
||||
border_width: $blockquote_border_width
|
||||
border_left_width: $blockquote_border_left_width
|
||||
padding: $blockquote_padding
|
||||
cite_font_size: $blockquote_cite_font_size
|
||||
cite_font_color: $blockquote_cite_font_color
|
||||
# code is used for source blocks (perhaps change to source or listing?)
|
||||
code:
|
||||
font_color: $base_font_color
|
||||
#font_color: FFFFFF
|
||||
font_family: $literal_font_family
|
||||
font_size: ceil($base_font_size)
|
||||
padding: $code_font_size
|
||||
line_height: 1.25
|
||||
# line_gap is an experimental property to control how a background color is applied to an inline block element
|
||||
line_gap: 3.8
|
||||
background_color: F5F5F5
|
||||
background_color: F8F8F8
|
||||
#background_color: 6C757D
|
||||
border_color: CCCCCC
|
||||
border_radius: $base_border_radius
|
||||
border_radius: 0
|
||||
border_width: 0.75
|
||||
border_width: 0
|
||||
conum:
|
||||
font_family: $literal_font_family
|
||||
font_color: $literal_font_color
|
||||
font_size: $base_font_size
|
||||
line_height: 4 / 3
|
||||
glyphs: circled
|
||||
example:
|
||||
border_color: $base_border_color
|
||||
border_radius: $base_border_radius
|
||||
border_width: 0.75
|
||||
background_color: $page-background-color
|
||||
# FIXME reenable padding bottom once margin collapsing is implemented
|
||||
padding: [$vertical_rhythm, $horizontal_rhythm, 0, $horizontal_rhythm]
|
||||
image:
|
||||
align: left
|
||||
prose:
|
||||
margin_top: $block_margin_top
|
||||
margin_bottom: $block_margin_bottom
|
||||
sidebar:
|
||||
background_color: EEEEEE
|
||||
border_color: E1E1E1
|
||||
border_radius: $base_border_radius
|
||||
border_width: $base_border_width
|
||||
# FIXME reenable padding bottom once margin collapsing is implemented
|
||||
padding: [$vertical_rhythm, $vertical_rhythm * 1.25, 0, $vertical_rhythm * 1.25]
|
||||
title:
|
||||
align: center
|
||||
font_color: $heading_font_color
|
||||
font_size: $heading_h4_font_size
|
||||
font_style: $heading_font_style
|
||||
thematic_break:
|
||||
border_color: $base_border_color
|
||||
border_style: solid
|
||||
border_width: $base_border_width
|
||||
margin_top: $vertical_rhythm * 0.5
|
||||
margin_bottom: $vertical_rhythm * 1.5
|
||||
description_list:
|
||||
term_font_style: bold
|
||||
term_spacing: $vertical_rhythm / 4
|
||||
description_indent: $horizontal_rhythm * 1.25
|
||||
outline_list:
|
||||
indent: $horizontal_rhythm * 1.5
|
||||
#marker_font_color: 404040
|
||||
# NOTE outline_list_item_spacing applies to list items that do not have complex content
|
||||
item_spacing: $vertical_rhythm / 2
|
||||
table:
|
||||
background_color: $page_background_color
|
||||
border_color: DDDDDD
|
||||
border_width: $base_border_width
|
||||
cell_padding: 3
|
||||
head:
|
||||
font_style: bold
|
||||
border_bottom_width: $base_border_width * 2.5
|
||||
body:
|
||||
stripe_background_color: F9F9F9
|
||||
foot:
|
||||
background_color: F0F0F0
|
||||
toc:
|
||||
indent: $horizontal_rhythm
|
||||
line_height: $base_line_height
|
||||
dot_leader:
|
||||
#content: ". "
|
||||
font_color: A9A9A9
|
||||
#levels: 2 3
|
||||
footnotes:
|
||||
font_size: round($base_font_size * 0.75)
|
||||
item_spacing: $outline_list_item_spacing / 2
|
||||
header:
|
||||
# Can't show chapter number. See https://github.com/asciidoctor/asciidoctor-pdf/issues/1373
|
||||
font_size: $base_font_size_small
|
||||
line_height: 1
|
||||
vertical_align: middle
|
||||
footer:
|
||||
font_size: $base_font_size_small
|
||||
# NOTE if background_color is set, background and border will span width of page
|
||||
#border_color: DDDDDD
|
||||
border_width: 0.25
|
||||
#height: $base_line_height_length * 2.5
|
||||
height: $base_line_height_length * 5
|
||||
line_height: 1
|
||||
padding: [$base_line_height_length / 2, 1, 0, 1]
|
||||
vertical_align: top
|
||||
recto: &shared_footer
|
||||
#columns: "<50% =0% >50%"
|
||||
left:
|
||||
content: 'Copyright © Inverse inc.'
|
||||
center:
|
||||
content: '{chapter-title}'
|
||||
right:
|
||||
content: '{page-number}'
|
||||
verso: *shared_footer
|
||||
#columns: $footer_recto_columns
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 8.5 KiB |
File renamed without changes.
@@ -5,9 +5,8 @@
|
||||
This file is part of the SOGo project.
|
||||
Authors:
|
||||
- Inverse inc. <info@inverse.ca>
|
||||
- Alinto <contact@sogo.nu>
|
||||
|
||||
Copyright (C) 2008-2022 Inverse inc. / Alinto
|
||||
Copyright (C) 2008-2018 Inverse inc.
|
||||
License: GFDL 1.2 or later. http://www.gnu.org/licenses/fdl.html
|
||||
|
||||
////
|
||||
@@ -23,6 +22,6 @@ https://sogo.nu/support/faq.html
|
||||
You can also read the mailing archives or post your questions to it. For
|
||||
details, see :
|
||||
|
||||
https://mailing.sogo.nu/sympa/info/users
|
||||
https://lists.inverse.ca/sogo
|
||||
|
||||
// vim: set syntax=asciidoc tabstop=2 shiftwidth=2 expandtab:
|
||||
@@ -5,9 +5,8 @@
|
||||
This file is part of the SOGo project.
|
||||
Authors:
|
||||
- Inverse inc. <info@inverse.ca>
|
||||
- Alinto <contact@sogo.nu>
|
||||
|
||||
Copyright (C) 2008-2022 Inverse inc. / Alinto
|
||||
Copyright (C) 2008-2021 Inverse inc.
|
||||
License: GFDL 1.2 or later. http://www.gnu.org/licenses/fdl.html
|
||||
|
||||
////
|
||||
@@ -16,14 +15,14 @@ Commercial Support and Contact Information
|
||||
------------------------------------------
|
||||
|
||||
For any questions or comments, do not hesitate to contact us by writing
|
||||
an email to contact@sogo.nu.
|
||||
an email to support@inverse.ca.
|
||||
|
||||
Alinto (https://alinto.com) offers professional services around SOGo
|
||||
Inverse (https://inverse.ca/) offers professional services around SOGo
|
||||
to help organizations deploy the solution, customize, migrate versions or
|
||||
from another system, performance tuning or aligning with best practices.
|
||||
|
||||
Hourly rates or support packages are offered to best suit your needs.
|
||||
|
||||
Please visit https://alinto.com/ for details.
|
||||
Please visit https://inverse.ca/ for details.
|
||||
|
||||
// vim: set syntax=asciidoc tabstop=2 shiftwidth=2 expandtab:
|
||||
@@ -1,6 +1,6 @@
|
||||
Version {release_version} - {release_month} {docyear}
|
||||
|
||||
Copyright © {docyear} Inverse inc. / Alinto
|
||||
Copyright © {docyear} Inverse inc.
|
||||
|
||||
Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in the section entitled "GNU Free Documentation License".
|
||||
|
||||
@@ -10,5 +10,4 @@ Copyright © Łukasz Dziedzic, http://www.latofonts.com, with Reserved Font Name
|
||||
|
||||
Copyright © Raph Levien, http://levien.com/, with Reserved Font Name: "Inconsolata".
|
||||
|
||||
image::images/inverse-logo.jpeg[width="25%",pdfwidth="50%",align="right"]
|
||||
image::images/alinto.small.png[width="25%",pdfwidth="50%",align="right"]
|
||||
image::images/inverse-logo.jpg[width="25%",pdfwidth="50%",align="right"]
|
||||
@@ -5,9 +5,8 @@
|
||||
This file is part of the SOGo project.
|
||||
Authors:
|
||||
- Inverse inc. <info@inverse.ca>
|
||||
- Alinto <contact@sogo.nu>
|
||||
|
||||
Copyright (C) 2008-2022 Inverse inc. / Alinto
|
||||
Copyright (C) 2008-2021 Inverse inc.
|
||||
License: GFDL 1.2 or later. http://www.gnu.org/licenses/fdl.html
|
||||
|
||||
////
|
||||
|
||||
@@ -5,9 +5,8 @@
|
||||
This file is part of the SOGo project.
|
||||
Authors:
|
||||
- Inverse inc. <info@inverse.ca>
|
||||
- Alinto <contact@sogo.nu>
|
||||
|
||||
Copyright (C) 2008-2022 Inverse inc. / Alinto
|
||||
Copyright (C) 2008-2018 Inverse inc.
|
||||
License: GFDL 1.2 or later. http://www.gnu.org/licenses/fdl.html
|
||||
|
||||
////
|
||||
|
||||
@@ -9,7 +9,6 @@ SUBPROJECTS = \
|
||||
SoObjects \
|
||||
Main \
|
||||
UI \
|
||||
API \
|
||||
Tools \
|
||||
Tests/Unit \
|
||||
|
||||
|
||||
+21
-51
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
Copyright (C) 2005-2022 Inverse inc.
|
||||
Copyright (C) 2005-2016 Inverse inc.
|
||||
|
||||
This file is part of SOGo
|
||||
|
||||
@@ -199,7 +199,7 @@ static BOOL debugLeaks;
|
||||
/* FIXME: make use of [EOChannelAdaptor describeTableNames] instead */
|
||||
tableName = [url lastPathComponent];
|
||||
if ([tc evaluateExpressionX:
|
||||
[NSString stringWithFormat: @"SELECT 1 FROM %@ WHERE 1 = 2",
|
||||
[NSString stringWithFormat: @"SELECT count(*) FROM %@",
|
||||
tableName]])
|
||||
{
|
||||
// We re-acquire the channel in case it was abruptly closed between statements
|
||||
@@ -232,7 +232,7 @@ static BOOL debugLeaks;
|
||||
|
||||
tableName = [NSString stringWithFormat: @"sogo_quick_%@", typeName];
|
||||
driver = [url substringToIndex: [url rangeOfString: @":"].location];
|
||||
sql = [NSString stringWithFormat: @"SELECT 1 FROM %@ WHERE 1 = 2",
|
||||
sql = [NSString stringWithFormat: @"SELECT count(*) FROM %@",
|
||||
tableName];
|
||||
if ([channel evaluateExpressionX: sql])
|
||||
{
|
||||
@@ -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
|
||||
{
|
||||
[self errorWithFormat: @"No value specified for '%@'", tmp];
|
||||
ok = NO;
|
||||
value = [defaults stringForKey: tmp];
|
||||
if (value)
|
||||
[self _checkTableWithCM: cm tableURL: value andType: tmp];
|
||||
else
|
||||
{
|
||||
[self errorWithFormat: @"No value specified for '%@'", tmp];
|
||||
ok = NO;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (combined)
|
||||
{
|
||||
@@ -314,23 +314,14 @@ 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];
|
||||
}
|
||||
|
||||
//Create mandatory openId table, if used
|
||||
if([defaults hasOpenIdType])
|
||||
{
|
||||
[[fm openIdFolder] createFolderIfNotExists];
|
||||
}
|
||||
{
|
||||
[[fm alarmsFolder] createFolderIfNotExists];
|
||||
}
|
||||
}
|
||||
|
||||
return ok;
|
||||
@@ -358,10 +349,8 @@ static BOOL debugLeaks;
|
||||
{
|
||||
if ([[context request] handledByDefaultHandler])
|
||||
authenticator = [SOGoWebAuthenticator sharedSOGoWebAuthenticator];
|
||||
else {
|
||||
else
|
||||
authenticator = [SOGoDAVAuthenticator sharedSOGoDAVAuthenticator];
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return authenticator;
|
||||
@@ -374,23 +363,10 @@ static BOOL debugLeaks;
|
||||
{
|
||||
SOGoUser *user;
|
||||
id userFolder;
|
||||
NSData *decodedLogin;
|
||||
NSString *login;
|
||||
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];
|
||||
}
|
||||
user = [SOGoUser userWithLogin: _key roles: nil];
|
||||
if (user)
|
||||
userFolder = [$(@"SOGoUserFolder") objectWithName: login
|
||||
userFolder = [$(@"SOGoUserFolder") objectWithName: _key
|
||||
inContainer: self];
|
||||
else
|
||||
userFolder = nil;
|
||||
@@ -417,7 +393,7 @@ static BOOL debugLeaks;
|
||||
{
|
||||
id obj;
|
||||
WORequest *request;
|
||||
BOOL isDAVRequest, isAPIRequest;
|
||||
BOOL isDAVRequest;
|
||||
SOGoSystemDefaults *sd;
|
||||
|
||||
/* put locale info into the context in case it's not there */
|
||||
@@ -425,14 +401,8 @@ static BOOL debugLeaks;
|
||||
|
||||
sd = [SOGoSystemDefaults sharedSystemDefaults];
|
||||
request = [_ctx request];
|
||||
isAPIRequest = [[request requestHandlerKey] isEqualToString:@"SOGoAPI"];
|
||||
isDAVRequest = [[request requestHandlerKey] isEqualToString:@"dav"];
|
||||
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 || [sd isWebAccessEnabled])
|
||||
{
|
||||
if (isDAVRequest)
|
||||
{
|
||||
@@ -462,7 +432,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];
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -502,7 +472,7 @@ static BOOL debugLeaks;
|
||||
|
||||
- (void) checkIfDaemonHasToBeShutdown
|
||||
{
|
||||
unsigned long long vmem;
|
||||
unsigned int vmem;
|
||||
|
||||
if (vMemSizeLimit > 0)
|
||||
{
|
||||
|
||||
+1
-10
@@ -48,16 +48,7 @@ main (int argc, char **argv, char **env)
|
||||
rc = 0;
|
||||
sd = [SOGoSystemDefaults sharedSystemDefaults];
|
||||
[NSTimeZone setDefaultTimeZone: [sd timeZone]];
|
||||
//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);
|
||||
}
|
||||
WOWatchDogApplicationMain (@"SOGo", argc, (void *) argv);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
@@ -12,35 +12,29 @@ There are multiple ways you can contribute to the project
|
||||
|
||||
## Source Code
|
||||
|
||||
You can browse the lastest version of the source code online from Alinto's github repository:
|
||||
You can browse the lastest version of the source code online from Inverse's github repository:
|
||||
|
||||
* [https://github.com/Alinto/sogo](https://github.com/Alinto/sogo)
|
||||
* [https://github.com/inverse-inc/sogo](https://github.com/inverse-inc/sogo)
|
||||
|
||||
To compile SOGo, you first need to obtain the source code of both SOGo and SOPE. The source code of SOPE and SOGo can be obtained from Alinto's github repositories:
|
||||
To compile SOGo, you first need to obtain the source code of both SOGo and SOPE. The source code of SOPE and SOGo can be obtained from Inverse's github repositories:
|
||||
|
||||
* [https://github.com/Alinto/sope/archive/master.zip](https://github.com/Alinto/sope/archive/master.zip)
|
||||
* [https://github.com/Alinto/sogo/archive/master.zip](https://github.com/Alinto/sogo/archive/master.zip)
|
||||
* [https://github.com/inverse-inc/sope/archive/master.zip](https://github.com/inverse-inc/sope/archive/master.zip)
|
||||
* [https://github.com/inverse-inc/sogo/archive/master.zip](https://github.com/inverse-inc/sogo/archive/master.zip)
|
||||
|
||||
The source code of the SOGo Connector extension for Thunderbird 78+ can be obtained from Alinto's github repository:
|
||||
The source code of the SOGo Connector extension for Thunderbird 78+ can be obtained from Inverse's github repository:
|
||||
|
||||
* [https://github.com/Alinto/sogo-connector](https://github.com/Alinto/sogo-connector)
|
||||
* [https://github.com/inverse-inc/sogo-connector](https://github.com/inverse-inc/sogo-connector)
|
||||
|
||||
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:
|
||||
|
||||
* [en] English - [Alinto](https://www.alinto.com)
|
||||
* [en] English - [Inverse inc.](https://inverse.ca/)
|
||||
* [ar] Arabic - Anass Ahmed
|
||||
* [eu] Basque - Gorka Gonzalez
|
||||
* [bs_BA] Bosnian - Refik Bećirović
|
||||
* [pr_BR] Brazilian Portuguese - Alexandre Marcilio
|
||||
* [bg] Bulgarian - Todor Todorov
|
||||
* [ca] Catalan - Hector M. Rulot Segovia
|
||||
* [zh_CN] Chinese (China) - Thomas Kuiper
|
||||
* [zh_TW] Chinese (Taiwan)
|
||||
@@ -49,8 +43,7 @@ SOGo and its associated components are available in various languages. The follo
|
||||
* [da_DK] Danish (Denmark) - Altibox
|
||||
* [nl] Dutch - Roel van Os
|
||||
* [fi] Finnish - Kari Salmu
|
||||
* [fr] French - [Alinto](https://www.alinto.com)
|
||||
* [gl] Galician - Simon Lang
|
||||
* [fr] French - [Inverse](https://inverse.ca/)
|
||||
* [de] German - Alexander Greiner-Baer
|
||||
* [he] Hebrew - Raz Aidlitz
|
||||
* [hu] Hungarian - Sándor Kuti
|
||||
@@ -58,12 +51,10 @@ SOGo and its associated components are available in various languages. The follo
|
||||
* [is] Icelandic - Anna Jonna Armannsdottir
|
||||
* [it] Italian - Alessio Fattorini
|
||||
* [jp] Japanese - Ryo Yamamoto
|
||||
* [kk] Kazakh - Nazym Idrissova
|
||||
* [lv] Latvian - Juris Balandis
|
||||
* [lt] Lithuanian - Mantas Liobė
|
||||
* [mk_MK] Macedonian - Miroslav Jovanovic
|
||||
* [sr_ME] Montenegrin - Ivan Pleskonjić
|
||||
* [nb_NO] Norwegian (Bokmål) - Jan Ivar Karlsen / Altibox
|
||||
* [nb_NO] Norwegian (Bokmål) - Jan Ivar Karlsen
|
||||
* [nn_NO] Norwegian (Nynorsk) - Altibox
|
||||
* [pl] Polish - Paweł Bogusławski
|
||||
* [pt] Portuguese - Eduardo Crispim
|
||||
@@ -76,8 +67,8 @@ SOGo and its associated components are available in various languages. The follo
|
||||
* [es_AR] Spanish (Argentina) - Federico Alberto Sayd
|
||||
* [es_ES] Spanish (Spain) - Dominique Couot
|
||||
* [sv] Swedish - Peter Johansson
|
||||
* [tr_TR] Turkish (Turkey) - Muhammed Yalçınkaya, Sinan Kurşunoğlu
|
||||
* [tr_TR] Turkish (Turkey) - Sinan Kurşunoğlu
|
||||
* [uk] Ukrainian - Oleksa Stasevych
|
||||
* [cy] Welsh - Iona Bailey
|
||||
|
||||
If you would like to translate the software in an other language, please consult the [FAQ](https://sogo.nu/support/faq/how-to-translate-sogo-in-another-language.html).
|
||||
If you would like to translate the software in an other language, please consult the [FAQ](https://sogo.nu/support/faq/how-to-translate-sogo-in-another-language.html). You can also subscribe to the SOGo i18n mailing list to follow string additions or changes. To subscribe to i18n@sogo.nu, send an email to i18n-request@sogo.nu with SUBSCRIBE i18n as the subject. Archived posts are [available online](https://lists.inverse.ca/sogo/arc/i18n).
|
||||
@@ -39,7 +39,7 @@
|
||||
didOpen = YES;
|
||||
}
|
||||
|
||||
sql = [NSString stringWithFormat: @"SELECT 1 FROM %@ WHERE 1 = 2",
|
||||
sql = [NSString stringWithFormat: @"SELECT COUNT(*) FROM %@ WHERE 1 = 2",
|
||||
tableName];
|
||||
ex = [self evaluateExpressionX: sql];
|
||||
[self cancelFetch];
|
||||
|
||||
@@ -25,13 +25,10 @@
|
||||
#include <EOControl/EOQualifier.h>
|
||||
|
||||
@class NSMutableString;
|
||||
@class EOAdaptor;
|
||||
|
||||
@interface EOQualifier(GCS)
|
||||
|
||||
- (void) appendSQLToString: (NSMutableString *) _ms;
|
||||
- (void) appendSQLToString: (NSMutableString *) _ms
|
||||
withAdaptor: (EOAdaptor *) _adaptor;
|
||||
- (void) _gcsAppendToString: (NSMutableString *) _ms;
|
||||
|
||||
@end
|
||||
|
||||
|
||||
@@ -24,10 +24,6 @@
|
||||
#import <NGExtensions/NSNull+misc.h>
|
||||
#import <NGExtensions/NSObject+Logs.h>
|
||||
|
||||
#import <GDLAccess/EOAdaptor.h>
|
||||
#import <GDLAccess/EOAttribute.h>
|
||||
#import <GDLAccess/EOSQLExpression.h>
|
||||
|
||||
#import "EOQualifier+GCS.h"
|
||||
|
||||
#if (defined(__GNU_LIBOBJC__) && (__GNU_LIBOBJC__ >= 20100911)) || defined(APPLE_RUNTIME) || defined(__GNUSTEP_RUNTIME__)
|
||||
@@ -37,9 +33,9 @@
|
||||
@implementation EOQualifier(GCS)
|
||||
|
||||
- (void) _appendAndQualifier: (EOAndQualifier *) _q
|
||||
withAdaptor: (EOAdaptor *) _adaptor
|
||||
toString: (NSMutableString *) _ms
|
||||
{
|
||||
// TODO: move to EOQualifier category
|
||||
NSArray *qs;
|
||||
unsigned i, count;
|
||||
|
||||
@@ -50,15 +46,14 @@
|
||||
for (i = 0; i < count; i++) {
|
||||
if (i != 0) [_ms appendString:@" AND "];
|
||||
if (count > 1) [_ms appendString:@"("];
|
||||
[[qs objectAtIndex:i] appendSQLToString: _ms
|
||||
withAdaptor: _adaptor];
|
||||
[[qs objectAtIndex:i] _gcsAppendToString: _ms];
|
||||
if (count > 1) [_ms appendString:@")"];
|
||||
}
|
||||
}
|
||||
- (void) _appendOrQualifier: (EOAndQualifier *) _q
|
||||
withAdaptor: (EOAdaptor *) _adaptor
|
||||
toString: (NSMutableString *) _ms
|
||||
- (void)_appendOrQualifier: (EOAndQualifier *) _q
|
||||
toString: (NSMutableString *) _ms
|
||||
{
|
||||
// TODO: move to EOQualifier category
|
||||
NSArray *qs;
|
||||
unsigned i, count;
|
||||
|
||||
@@ -69,28 +64,23 @@
|
||||
for (i = 0; i < count; i++) {
|
||||
if (i != 0) [_ms appendString:@" OR "];
|
||||
if (count > 1) [_ms appendString:@"("];
|
||||
[[qs objectAtIndex:i] appendSQLToString: _ms
|
||||
withAdaptor: _adaptor];
|
||||
[[qs objectAtIndex:i] _gcsAppendToString: _ms];
|
||||
if (count > 1) [_ms appendString:@")"];
|
||||
}
|
||||
}
|
||||
|
||||
- (void) _appendNotQualifier: (EONotQualifier *) _q
|
||||
withAdaptor: (EOAdaptor *) _adaptor
|
||||
toString:(NSMutableString *) _ms
|
||||
- (void)_appendNotQualifier: (EONotQualifier *)_q
|
||||
toString:(NSMutableString *) _ms
|
||||
{
|
||||
[_ms appendString:@" NOT ("];
|
||||
[[_q qualifier] appendSQLToString: _ms
|
||||
withAdaptor: _adaptor];
|
||||
[[_q qualifier] _gcsAppendToString: _ms];
|
||||
[_ms appendString:@")"];
|
||||
}
|
||||
|
||||
- (void) _appendKeyValueQualifier: (EOKeyValueQualifier *) _q
|
||||
withAdaptor: (EOAdaptor *) _adaptor
|
||||
toString: (NSMutableString *) _ms
|
||||
{
|
||||
id val;
|
||||
EOAttribute *attribute;
|
||||
NSString *qKey, *qOperator, *qValue, *qFormat;
|
||||
BOOL isCI;
|
||||
|
||||
@@ -129,33 +119,9 @@
|
||||
qValue = [val stringValue];
|
||||
else if ([val isKindOfClass: [NSString class]]) {
|
||||
if ([(EOKeyValueQualifier *)self formatted])
|
||||
{
|
||||
qValue = val;
|
||||
}
|
||||
qValue = val;
|
||||
else
|
||||
{
|
||||
if (_adaptor)
|
||||
{
|
||||
// The value is a string, assume qualifier applies to a varchar column type
|
||||
attribute = [EOAttribute new];
|
||||
[attribute setExternalType: @"varchar"];
|
||||
[attribute autorelease];
|
||||
|
||||
if (sel_isEqual([_q selector], EOQualifierOperatorLike) ||
|
||||
sel_isEqual([_q selector], EOQualifierOperatorCaseInsensitiveLike))
|
||||
{
|
||||
qValue = [[_adaptor expressionClass] sqlPatternFromShellPattern: val];
|
||||
qValue = [_adaptor formatValue: qValue
|
||||
forAttribute: attribute];
|
||||
}
|
||||
else
|
||||
qValue = [_adaptor formatValue: val
|
||||
forAttribute: attribute];
|
||||
}
|
||||
else
|
||||
// No adaptor provided, don't parse value
|
||||
qValue = [NSString stringWithFormat: @"'%@'", val];
|
||||
}
|
||||
qValue = [NSString stringWithFormat: @"'%@'", val];
|
||||
}
|
||||
else {
|
||||
qValue = @"NULL";
|
||||
@@ -189,43 +155,29 @@
|
||||
}
|
||||
|
||||
- (void) _appendQualifier: (EOQualifier *) _q
|
||||
withAdaptor: (EOAdaptor *) _adaptor
|
||||
toString: (NSMutableString *) _ms
|
||||
{
|
||||
if (_q == nil) return;
|
||||
|
||||
if ([_q isKindOfClass: [EOAndQualifier class]])
|
||||
[self _appendAndQualifier: (id)_q
|
||||
withAdaptor: _adaptor
|
||||
toString: _ms];
|
||||
else if ([_q isKindOfClass: [EOOrQualifier class]])
|
||||
[self _appendOrQualifier: (id)_q
|
||||
withAdaptor: _adaptor
|
||||
toString: _ms];
|
||||
toString:_ms];
|
||||
else if ([_q isKindOfClass: [EOKeyValueQualifier class]])
|
||||
[self _appendKeyValueQualifier: (id)_q
|
||||
withAdaptor: _adaptor
|
||||
toString: _ms];
|
||||
toString:_ms];
|
||||
else if ([_q isKindOfClass: [EONotQualifier class]])
|
||||
[self _appendNotQualifier: (id)_q
|
||||
withAdaptor: (EOAdaptor *) _adaptor
|
||||
toString: _ms];
|
||||
toString:_ms];
|
||||
else
|
||||
[self errorWithFormat:@"unknown qualifier: %@", _q];
|
||||
}
|
||||
|
||||
- (void) appendSQLToString: (NSMutableString *) _ms
|
||||
- (void) _gcsAppendToString: (NSMutableString *) _ms
|
||||
{
|
||||
[self _appendQualifier: self
|
||||
withAdaptor: nil
|
||||
toString: _ms];
|
||||
}
|
||||
|
||||
- (void) appendSQLToString: (NSMutableString *) _ms
|
||||
withAdaptor: (EOAdaptor *) _adaptor
|
||||
{
|
||||
[self _appendQualifier: self
|
||||
withAdaptor: _adaptor
|
||||
toString: _ms];
|
||||
}
|
||||
|
||||
|
||||
@@ -1,53 +0,0 @@
|
||||
/* 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 */
|
||||
@@ -1,347 +0,0 @@
|
||||
/* 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
|
||||
@@ -1,6 +1,6 @@
|
||||
/* GCSAlarmsFolder.m - this file is part of SOGo
|
||||
*
|
||||
* Copyright (C) 2010-2022 Inverse inc.
|
||||
* Copyright (C) 2010-2016 Inverse inc.
|
||||
*
|
||||
* 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
|
||||
@@ -182,7 +182,7 @@ static NSString *alarmsFolderURLString = nil;
|
||||
|
||||
queries = [tc specialQueries];
|
||||
|
||||
sql = [NSString stringWithFormat: @"SELECT 1 FROM %@ WHERE 1 = 2",
|
||||
sql = [NSString stringWithFormat: @"SELECT count(*) FROM %@",
|
||||
[self _storeTableName]];
|
||||
if ([tc evaluateExpressionX: sql])
|
||||
{
|
||||
@@ -202,7 +202,7 @@ static NSString *alarmsFolderURLString = nil;
|
||||
|
||||
/* table has the following fields:
|
||||
c_path VARCHAR(255) NOT NULL
|
||||
c_name VARCHAR(255) NOT NULL
|
||||
c_name VARCHAR(255) NOT NULLo
|
||||
c_uid VARCHAR(255) NOT NULL
|
||||
c_recurrence_id INT NULL
|
||||
c_alarm_number INT NOT NULL
|
||||
|
||||
@@ -51,7 +51,6 @@
|
||||
- (void)releaseChannel:(EOAdaptorChannel *)_channel;
|
||||
- (void)releaseChannel:(EOAdaptorChannel *)_channel
|
||||
immediately:(BOOL)_immediately;
|
||||
- (void) releaseAllChannels;
|
||||
|
||||
/* checking for tables */
|
||||
|
||||
|
||||
@@ -399,27 +399,6 @@ static NSTimeInterval ChannelCollectionTimer = 5 * 60;
|
||||
}
|
||||
}
|
||||
|
||||
- (void) releaseAllChannels
|
||||
{
|
||||
EOAdaptorChannel *channel;
|
||||
GCSChannelHandle *handle;
|
||||
NSEnumerator *e;
|
||||
|
||||
e = [busyChannels objectEnumerator];
|
||||
while ((handle = [e nextObject]))
|
||||
{
|
||||
[handle retain];
|
||||
ASSIGN (handle->lastReleaseTime, [NSCalendarDate date]);
|
||||
[busyChannels removeObject: handle];
|
||||
channel = [handle channel];
|
||||
if (debugPools)
|
||||
[self logWithFormat: @"releaseAllChannels: freeing old channel (age %ds, %p) ", (int)[handle age], channel];
|
||||
if ([channel isOpen])
|
||||
[channel closeChannel];
|
||||
[handle release];
|
||||
}
|
||||
}
|
||||
|
||||
/* checking for tables */
|
||||
|
||||
- (BOOL) canConnect: (NSURL *) _url
|
||||
|
||||
@@ -159,6 +159,10 @@
|
||||
/* helpers */
|
||||
|
||||
- (EOAttribute *) _attributeForColumn: (NSString *) _field;
|
||||
- (void) _findQualifiers: (id) qualifier
|
||||
withAdaptor: (EOAdaptor *) adaptor;
|
||||
- (void) _formatQualifierValue: (EOKeyValueQualifier *) qualifier
|
||||
withAdaptor: (EOAdaptor *) adaptor;
|
||||
@end
|
||||
|
||||
#endif /* __GDLContentStore_GCSFolder_H__ */
|
||||
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
Copyright (C) 2004-2007 SKYRIX Software AG
|
||||
Copyright (C) 2007 Helge Hess
|
||||
Copyright (c) 2008-2022 Inverse inc.
|
||||
Copyright (c) 2008-2019 Inverse inc.
|
||||
|
||||
This file is part of SOGo.
|
||||
|
||||
@@ -26,11 +26,9 @@
|
||||
|
||||
#import <EOControl/EOFetchSpecification.h>
|
||||
#import <EOControl/EOSortOrdering.h>
|
||||
#import <EOControl/EOQualifier.h>
|
||||
|
||||
#import <GDLAccess/EOEntity.h>
|
||||
#import <GDLAccess/EOAttribute.h>
|
||||
#import <GDLAccess/EOSQLExpression.h>
|
||||
#import <GDLAccess/EOSQLQualifier.h>
|
||||
#import <GDLAccess/EOAdaptor.h>
|
||||
#import <GDLAccess/EOAdaptorContext.h>
|
||||
@@ -403,9 +401,19 @@ static GCSStringFormatter *stringFormatter = nil;
|
||||
adaptor = [adaptorCtx adaptor];
|
||||
}
|
||||
|
||||
if ([qualifier isKindOfClass: [EOAndQualifier class]])
|
||||
[self _findQualifiers: (id)qualifier withAdaptor: adaptor];
|
||||
else if ([qualifier isKindOfClass: [EOOrQualifier class]])
|
||||
[self _findQualifiers: (id)qualifier withAdaptor: adaptor];
|
||||
else if ([qualifier isKindOfClass: [EOKeyValueQualifier class]])
|
||||
[self _formatQualifierValue: (EOKeyValueQualifier *)qualifier withAdaptor: adaptor];
|
||||
else if ([qualifier isKindOfClass: [EONotQualifier class]])
|
||||
[self _formatQualifierValue: (EOKeyValueQualifier *)[(id)qualifier qualifier] withAdaptor: adaptor];
|
||||
else
|
||||
[self errorWithFormat:@"unknown qualifier: %@", qualifier];
|
||||
|
||||
ms = [NSMutableString stringWithCapacity:32];
|
||||
[qualifier appendSQLToString: ms
|
||||
withAdaptor: adaptor];
|
||||
[qualifier _gcsAppendToString: ms];
|
||||
}
|
||||
else
|
||||
ms = nil;
|
||||
@@ -413,6 +421,51 @@ static GCSStringFormatter *stringFormatter = nil;
|
||||
return ms;
|
||||
}
|
||||
|
||||
- (void) _findQualifiers: (id) qualifier
|
||||
withAdaptor: (EOAdaptor *) adaptor
|
||||
{
|
||||
NSArray *qs;
|
||||
unsigned i, count;
|
||||
|
||||
if (qualifier == nil) return;
|
||||
|
||||
qs = [qualifier qualifiers];
|
||||
if ((count = [qs count]) == 0)
|
||||
return;
|
||||
|
||||
for (i = 0; i < count; i++) {
|
||||
id q = [qs objectAtIndex: i];
|
||||
if ([q isKindOfClass: [EOAndQualifier class]])
|
||||
[self _findQualifiers: q withAdaptor: adaptor];
|
||||
else if ([q isKindOfClass:[EOOrQualifier class]])
|
||||
[self _findQualifiers: q withAdaptor: adaptor];
|
||||
else if ([q isKindOfClass:[EOKeyValueQualifier class]])
|
||||
[self _formatQualifierValue: (EOKeyValueQualifier *)q withAdaptor: adaptor];
|
||||
else if ([q isKindOfClass:[EONotQualifier class]])
|
||||
[self _formatQualifierValue: (EOKeyValueQualifier *)[q qualifier] withAdaptor: adaptor];
|
||||
else
|
||||
[self errorWithFormat:@"unknown qualifier: %@", q];
|
||||
}
|
||||
}
|
||||
|
||||
- (void) _formatQualifierValue: (EOKeyValueQualifier *) qualifier
|
||||
withAdaptor: (EOAdaptor *) adaptor
|
||||
{
|
||||
NSString *field;
|
||||
EOAttribute *attribute;
|
||||
NSString *formattedValue;
|
||||
|
||||
field = [qualifier key];
|
||||
attribute = [self _attributeForColumn: field];
|
||||
if (attribute && [[qualifier value] isNotNull])
|
||||
{
|
||||
formattedValue = [adaptor formatValue: [qualifier value]
|
||||
forAttribute: attribute];
|
||||
[qualifier setValue: formattedValue];
|
||||
[qualifier setFormatted: YES];
|
||||
}
|
||||
}
|
||||
|
||||
- (NSString *)_sqlForSortOrderings:(NSArray *)_so {
|
||||
NSMutableString *sql;
|
||||
unsigned i, count;
|
||||
@@ -987,7 +1040,7 @@ andAttribute: (EOAttribute *)_attribute
|
||||
NSDictionary *currentRow;
|
||||
NSNumber *storedVersion;
|
||||
BOOL isNewRecord, hasInsertDelegate, hasUpdateDelegate;
|
||||
NSCalendarDate *nowDate, *startDate;
|
||||
NSCalendarDate *nowDate;
|
||||
NSNumber *now;
|
||||
EOEntity *quickTableEntity, *storeTableEntity;
|
||||
NSArray *rows;
|
||||
@@ -1002,7 +1055,6 @@ andAttribute: (EOAttribute *)_attribute
|
||||
error = nil;
|
||||
nowDate = [NSCalendarDate date];
|
||||
now = [NSNumber numberWithUnsignedInt:[nowDate timeIntervalSince1970]];
|
||||
startDate = nil;
|
||||
|
||||
if (doLogStore)
|
||||
[self logWithFormat:@"should store content: '%@'\n%@", _name, _content];
|
||||
@@ -1072,7 +1124,6 @@ andAttribute: (EOAttribute *)_attribute
|
||||
|
||||
[contentRow setObject:_name forKey:@"c_name"];
|
||||
[contentRow setObject:now forKey:@"c_lastmodified"];
|
||||
|
||||
if (isNewRecord)
|
||||
{
|
||||
[contentRow setObject:now forKey:@"c_creationdate"];
|
||||
@@ -1143,21 +1194,6 @@ andAttribute: (EOAttribute *)_attribute
|
||||
}
|
||||
else
|
||||
{
|
||||
// Update c_startdate for appointments
|
||||
if ([theComponent respondsToSelector:@selector(startDate)]) {
|
||||
NSTimeInterval t;
|
||||
startDate = [theComponent startDate];
|
||||
t = [startDate timeIntervalSince1970];
|
||||
if (startDate) {
|
||||
if (t < (long long)INT_MAX && t > (long long)INT_MIN) {
|
||||
[quickRow setObject:[NSNumber numberWithInt: t] forKey:@"c_startdate"];
|
||||
} else {
|
||||
[self errorWithFormat:@"Unexpected value. Invalid start date for timestamp %f", t];
|
||||
[quickRow setObject:[NSNumber numberWithInt: 0] forKey:@"c_startdate"];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!ofFlags.sameTableForQuick)
|
||||
error = (hasUpdateDelegate
|
||||
? [quickChannel updateRowX: quickRow
|
||||
|
||||
@@ -31,7 +31,7 @@
|
||||
*/
|
||||
|
||||
@class NSString, NSArray, NSURL, NSDictionary, NSException;
|
||||
@class GCSChannelManager, GCSAlarmsFolder, GCSAdminFolder, GCSFolder, GCSFolderType, GCSSessionsFolder, GCSOpenIdFolder;
|
||||
@class GCSChannelManager, GCSAlarmsFolder, GCSFolder, GCSFolderType, GCSSessionsFolder;
|
||||
|
||||
@interface GCSFolderManager : NSObject
|
||||
{
|
||||
@@ -89,12 +89,6 @@
|
||||
/* sessions */
|
||||
- (GCSSessionsFolder *)sessionsFolder;
|
||||
|
||||
/* admin */
|
||||
- (GCSAdminFolder *)adminFolder;
|
||||
|
||||
/* openid */
|
||||
- (GCSOpenIdFolder *) openIdFolder;
|
||||
|
||||
/* folder types */
|
||||
|
||||
- (GCSFolderType *)folderTypeWithName:(NSString *)_name;
|
||||
|
||||
@@ -37,8 +37,6 @@
|
||||
#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"
|
||||
@@ -499,18 +497,6 @@ 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
|
||||
{
|
||||
|
||||
@@ -1,57 +0,0 @@
|
||||
/* 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 */
|
||||
@@ -1,363 +0,0 @@
|
||||
/* GCSAdminFolder.m - this file is part of SOGo
|
||||
*
|
||||
* Copyright (C) 2023 Alinto
|
||||
*
|
||||
* This file is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2, or (at your option)
|
||||
* any later version.
|
||||
*
|
||||
* This file is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; see the file COPYING. If not, write to
|
||||
* the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
* Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
|
||||
|
||||
#import <NGExtensions/NSObject+Logs.h>
|
||||
#import <NGExtensions/NSNull+misc.h>
|
||||
|
||||
#import <GDLAccess/EOAdaptorContext.h>
|
||||
#import <GDLAccess/EOAttribute.h>
|
||||
#import <GDLAccess/EOEntity.h>
|
||||
#import <GDLAccess/EOSQLQualifier.h>
|
||||
|
||||
#import "EOQualifier+GCS.h"
|
||||
#import "GCSChannelManager.h"
|
||||
#import "GCSFolderManager.h"
|
||||
#import "GCSSpecialQueries.h"
|
||||
#import "NSURL+GCS.h"
|
||||
|
||||
#import "GCSOpenIdFolder.h"
|
||||
|
||||
static NSString *openIdFolderURLString = nil;
|
||||
|
||||
#warning GCSOpenIdFolder should share a common ancestor with GCSFolder
|
||||
|
||||
@implementation GCSOpenIdFolder
|
||||
|
||||
+ (void) initialize
|
||||
{
|
||||
NSUserDefaults *ud;
|
||||
|
||||
if (!openIdFolderURLString)
|
||||
{
|
||||
ud = [NSUserDefaults standardUserDefaults];
|
||||
ASSIGN (openIdFolderURLString, [ud stringForKey: @"OCSOpenIdURL"]);
|
||||
}
|
||||
}
|
||||
|
||||
+ (id) openIdFolderWithFolderManager: (GCSFolderManager *) newFolderManager
|
||||
{
|
||||
GCSOpenIdFolder *newFolder;
|
||||
|
||||
if (openIdFolderURLString)
|
||||
{
|
||||
newFolder = [self new];
|
||||
[newFolder autorelease];
|
||||
[newFolder setFolderManager: newFolderManager];
|
||||
}
|
||||
else
|
||||
{
|
||||
[self errorWithFormat: @"'OCSOpenIdURL' is not set"];
|
||||
newFolder = nil;
|
||||
}
|
||||
|
||||
return newFolder;
|
||||
}
|
||||
|
||||
- (void) setFolderManager: (GCSFolderManager *) newFolderManager
|
||||
{
|
||||
ASSIGN (folderManager, newFolderManager);
|
||||
}
|
||||
|
||||
/* accessors */
|
||||
|
||||
- (NSURL *) _location
|
||||
{
|
||||
NSURL *location;
|
||||
|
||||
if (openIdFolderURLString)
|
||||
location = [NSURL URLWithString: openIdFolderURLString];
|
||||
else
|
||||
{
|
||||
[self warnWithFormat: @"'OCSOpenIdURL' is not set"];
|
||||
location = nil;
|
||||
}
|
||||
|
||||
return location;
|
||||
}
|
||||
|
||||
- (GCSChannelManager *) _channelManager
|
||||
{
|
||||
return [folderManager channelManager];
|
||||
}
|
||||
|
||||
- (NSString *) _storeTableName
|
||||
{
|
||||
return [[self _location] gcsTableName];
|
||||
}
|
||||
|
||||
- (EOEntity *) _storeTableEntityForChannel: (EOAdaptorChannel *) tc
|
||||
{
|
||||
static EOEntity *entity = nil;
|
||||
EOAttribute *attribute;
|
||||
NSString *tableName;
|
||||
NSString *columns[] = {@"c_user_session", @"c_old_session", @"c_session_started", @"c_refresh_token", @"c_access_token_expires_in", @"c_refresh_token_expires_in", nil };
|
||||
NSString **column;
|
||||
NSMutableArray *keys;
|
||||
NSDictionary *types;
|
||||
|
||||
if (!entity)
|
||||
{
|
||||
entity = [EOEntity new];
|
||||
tableName = [self _storeTableName];
|
||||
[entity setName: tableName];
|
||||
[entity setExternalName: tableName];
|
||||
|
||||
types = [[tc specialQueries] openIdAttributeTypes];
|
||||
|
||||
column = columns;
|
||||
while (*column)
|
||||
{
|
||||
attribute = [EOAttribute new];
|
||||
[attribute setName: *column];
|
||||
[attribute setColumnName: *column];
|
||||
[attribute setExternalType: [types objectForKey: *column]];
|
||||
[entity addAttribute: attribute];
|
||||
[attribute release];
|
||||
column++;
|
||||
}
|
||||
|
||||
keys = [NSMutableArray arrayWithCapacity: 1];
|
||||
[keys addObject: [entity attributeNamed: @"c_user_session"]];
|
||||
[entity setPrimaryKeyAttributes: keys];
|
||||
|
||||
keys = [NSMutableArray arrayWithCapacity: 5];
|
||||
[keys addObject: [entity attributeNamed: @"c_old_session"]];
|
||||
[keys addObject: [entity attributeNamed: @"c_session_started"]];
|
||||
[keys addObject: [entity attributeNamed: @"c_refresh_token"]];
|
||||
[keys addObject: [entity attributeNamed: @"c_access_token_expires_in"]];
|
||||
[keys addObject: [entity attributeNamed: @"c_refresh_token_expires_in"]];
|
||||
[entity setClassProperties: keys];
|
||||
[entity setAttributesUsedForLocking: [NSArray array]];
|
||||
}
|
||||
|
||||
return entity;
|
||||
}
|
||||
|
||||
/* connection */
|
||||
|
||||
- (EOAdaptorChannel *) _acquireStoreChannel
|
||||
{
|
||||
return [[self _channelManager] acquireOpenChannelForURL: [self _location]];
|
||||
}
|
||||
|
||||
- (void) _releaseChannel: (EOAdaptorChannel *) _channel
|
||||
{
|
||||
[[self _channelManager] releaseChannel:_channel immediately: YES];
|
||||
}
|
||||
|
||||
- (BOOL) canConnectStore
|
||||
{
|
||||
return [[self _channelManager] canConnect:[self _location]];
|
||||
}
|
||||
|
||||
- (void) createFolderIfNotExists
|
||||
{
|
||||
EOAdaptorChannel *tc;
|
||||
NSString *sql, *tableName;
|
||||
GCSSpecialQueries *queries;
|
||||
|
||||
tc = [self _acquireStoreChannel];
|
||||
tableName = [self _storeTableName];
|
||||
|
||||
queries = [tc specialQueries];
|
||||
|
||||
sql = [NSString stringWithFormat: @"SELECT 1 FROM %@ WHERE 1 = 2", tableName];
|
||||
if ([tc evaluateExpressionX: sql])
|
||||
{
|
||||
sql = [queries createOpenIdFolderWithName: tableName];
|
||||
if (![tc evaluateExpressionX: sql])
|
||||
[self logWithFormat: @"openid folder table '%@' successfully created!", tableName];
|
||||
}
|
||||
else
|
||||
[tc cancelFetch];
|
||||
|
||||
[self _releaseChannel: tc];
|
||||
}
|
||||
|
||||
/* operations */
|
||||
|
||||
/* table has the following fields:
|
||||
c_user_session varchar(255) NOT NULL,
|
||||
c_session_started int(11) NOT NULL,
|
||||
c_refresh_token varchar(4096) DEFAULT '',
|
||||
c_access_token_expires_in int(11) NOT NULL,
|
||||
c_refresh_token_expires_in int(11) DEFAULT NULL,
|
||||
*/
|
||||
|
||||
- (NSDictionary *) recordForSession: (NSString *) _user_session useOldSession: (BOOL) use_old_session
|
||||
{
|
||||
EOAdaptorChannel *tc;
|
||||
EOAdaptorContext *context;
|
||||
NSException *error;
|
||||
NSArray *attrs;
|
||||
NSDictionary *record;
|
||||
EOEntity *entity;
|
||||
EOSQLQualifier *qualifier;
|
||||
|
||||
record = nil;
|
||||
|
||||
tc = [self _acquireStoreChannel];
|
||||
if (tc)
|
||||
{
|
||||
context = [tc adaptorContext];
|
||||
entity = [self _storeTableEntityForChannel: tc];
|
||||
if(!use_old_session)
|
||||
qualifier = [[EOSQLQualifier alloc] initWithEntity: entity
|
||||
qualifierFormat: @"c_user_session='%@'", _user_session];
|
||||
else
|
||||
qualifier = [[EOSQLQualifier alloc] initWithEntity: entity
|
||||
qualifierFormat: @"c_old_session='%@'", _user_session];
|
||||
[qualifier autorelease];
|
||||
|
||||
[context beginTransaction];
|
||||
error = [tc selectAttributesX: [entity attributesUsedForFetch]
|
||||
describedByQualifier: qualifier
|
||||
fetchOrder: nil
|
||||
lock: NO];
|
||||
if (error)
|
||||
[self errorWithFormat:@"%s: cannot execute fetch: %@", __PRETTY_FUNCTION__, error];
|
||||
else
|
||||
{
|
||||
attrs = [tc describeResults: NO];
|
||||
record = [tc fetchAttributes: attrs withZone: NULL];
|
||||
[tc cancelFetch];
|
||||
}
|
||||
[context rollbackTransaction];
|
||||
[self _releaseChannel: tc];
|
||||
}
|
||||
|
||||
return record;
|
||||
}
|
||||
|
||||
- (NSString *) getRefreshToken: (NSString *) _user_session
|
||||
{
|
||||
NSDictionary *r;
|
||||
|
||||
r = [self recordForSession: _user_session useOldSession: NO];
|
||||
if (r && [r objectForKey:@"c_refresh_token"])
|
||||
return [r objectForKey:@"c_refresh_token"];
|
||||
|
||||
return nil;
|
||||
}
|
||||
|
||||
- (NSString *) getNewToken: (NSString *) _old_session
|
||||
{
|
||||
NSDictionary *r;
|
||||
r = [self recordForSession: _old_session useOldSession: YES];
|
||||
if (r && [r objectForKey:@"c_user_session"])
|
||||
return [r objectForKey:@"c_user_session"];
|
||||
|
||||
return nil;
|
||||
}
|
||||
|
||||
|
||||
- (NSException *) writeOpenIdSession: (NSString *) _user_session
|
||||
withOldSession: (NSString *) _old_session
|
||||
withRefreshToken: (NSString *) _refresh_token
|
||||
withExpire: (NSNumber *) _expire
|
||||
withRefreshExpire: (NSNumber *) _refresh_expire
|
||||
{
|
||||
NSDictionary *record, *newRecord;
|
||||
NSException *error;
|
||||
NSCalendarDate *nowDate;
|
||||
int now, nowExpire, nowRefreshExpire;
|
||||
EOAdaptorChannel *tc;
|
||||
EOAdaptorContext *context;
|
||||
EOEntity *entity;
|
||||
EOSQLQualifier *qualifier;
|
||||
|
||||
error = nil;
|
||||
tc = [self _acquireStoreChannel];
|
||||
if (tc)
|
||||
{
|
||||
context = [tc adaptorContext];
|
||||
|
||||
nowDate = [NSCalendarDate date];
|
||||
now = (nowDate ? (int)[nowDate timeIntervalSince1970] : 0);
|
||||
nowExpire = now + [_expire intValue];
|
||||
if(_refresh_expire)
|
||||
nowRefreshExpire = now + [_refresh_expire intValue];
|
||||
else
|
||||
nowRefreshExpire = -1;
|
||||
if(!_old_session)
|
||||
_old_session = @"";
|
||||
|
||||
newRecord = [NSDictionary dictionaryWithObjectsAndKeys: _user_session, @"c_user_session",
|
||||
_old_session, @"c_old_session",
|
||||
[NSNumber numberWithInt:now], @"c_session_started",
|
||||
_refresh_token, @"c_refresh_token",
|
||||
[NSNumber numberWithInt:nowExpire] , @"c_access_token_expires_in",
|
||||
[NSNumber numberWithInt:nowRefreshExpire] , @"c_refresh_token_expires_in",
|
||||
nil];
|
||||
record = [self recordForSession: _user_session useOldSession: NO];
|
||||
entity = [self _storeTableEntityForChannel: tc];
|
||||
[context beginTransaction];
|
||||
if (!record)
|
||||
{
|
||||
//If the session already exist no need to update it as it is unique
|
||||
error = [tc insertRowX: newRecord forEntity: entity];
|
||||
}
|
||||
|
||||
if (error)
|
||||
{
|
||||
[context rollbackTransaction];
|
||||
[self errorWithFormat:@"%s: cannot write record: %@", __PRETTY_FUNCTION__, error];
|
||||
}
|
||||
else
|
||||
[context commitTransaction];
|
||||
[self _releaseChannel: tc];
|
||||
}
|
||||
return error;
|
||||
}
|
||||
|
||||
- (NSException *) deleteOpenIdSessionFor: (NSString *) _user_session
|
||||
{
|
||||
EOAdaptorChannel *tc;
|
||||
EOAdaptorContext *context;
|
||||
EOEntity *entity;
|
||||
EOSQLQualifier *qualifier;
|
||||
NSException *error;
|
||||
|
||||
error = nil;
|
||||
tc = [self _acquireStoreChannel];
|
||||
if (tc)
|
||||
{
|
||||
context = [tc adaptorContext];
|
||||
entity = [self _storeTableEntityForChannel: tc];
|
||||
qualifier = [[EOSQLQualifier alloc] initWithEntity: entity
|
||||
qualifierFormat: @"c_user_session='%@'",_user_session];
|
||||
[qualifier autorelease];
|
||||
[context beginTransaction];
|
||||
error = [tc deleteRowsDescribedByQualifierX: qualifier];
|
||||
if (error)
|
||||
{
|
||||
[context rollbackTransaction];
|
||||
[self errorWithFormat:@"%s: cannot delete record: %@", __PRETTY_FUNCTION__, error];
|
||||
}
|
||||
else
|
||||
[context commitTransaction];
|
||||
[self _releaseChannel: tc];
|
||||
}
|
||||
|
||||
return error;
|
||||
}
|
||||
|
||||
@end
|
||||
@@ -1,6 +1,8 @@
|
||||
/* GCSSessionsFolder.m - this file is part of SOGo
|
||||
*
|
||||
* Copyright (C) 2010-2022 Inverse inc.
|
||||
* Copyright (C) 2010-2011 Inverse inc.
|
||||
*
|
||||
* Author: Ludovic Marcotte <lmarcotte@inverse.ca>
|
||||
*
|
||||
* 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
|
||||
@@ -179,7 +181,7 @@ static NSString *sessionsFolderURLString = nil;
|
||||
|
||||
queries = [tc specialQueries];
|
||||
|
||||
sql = [NSString stringWithFormat: @"SELECT 1 FROM %@ WHERE 1 = 2", tableName];
|
||||
sql = [NSString stringWithFormat: @"SELECT count(*) FROM %@", tableName];
|
||||
if ([tc evaluateExpressionX: sql])
|
||||
{
|
||||
sql = [queries createSessionsFolderWithName: tableName];
|
||||
|
||||
@@ -39,14 +39,8 @@
|
||||
- (NSString *) createSessionsFolderWithName: (NSString *) tableName;
|
||||
- (NSDictionary *) sessionsAttributeTypes;
|
||||
|
||||
- (NSString *)createAdminFolderWithName:(NSString *)tableName;
|
||||
- (NSDictionary *)adminAttributeTypes;
|
||||
|
||||
- (NSString *)createOpenIdFolderWithName:(NSString *)tableName;
|
||||
- (NSDictionary *)openIdAttributeTypes;
|
||||
|
||||
- (NSString *) updateCPathInFolderInfo:(NSString *)tableName
|
||||
withCPath2:(NSString *)c_path2;
|
||||
- (NSString *) updateCPathInFolderInfo: (NSString *) tableName
|
||||
withCPath2: (NSString *) c_path2;
|
||||
|
||||
@end
|
||||
|
||||
|
||||
@@ -81,35 +81,6 @@
|
||||
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];
|
||||
@@ -186,62 +157,6 @@
|
||||
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
|
||||
@@ -274,7 +189,7 @@
|
||||
static NSString *sqlFolderFormat
|
||||
= (@"CREATE TABLE %@ ("
|
||||
@" c_id VARCHAR(255) PRIMARY KEY,"
|
||||
@" c_value VARCHAR(4096) NOT NULL,"
|
||||
@" c_value VARCHAR(255) NOT NULL,"
|
||||
@" c_creationdate INT4 NOT NULL,"
|
||||
@" c_lastseen INT4 NOT NULL)");
|
||||
|
||||
@@ -347,62 +262,6 @@
|
||||
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
|
||||
@@ -435,7 +294,7 @@
|
||||
static NSString *sqlFolderFormat
|
||||
= (@"CREATE TABLE %@ ("
|
||||
@" c_id VARCHAR(255) PRIMARY KEY,"
|
||||
@" c_value VARCHAR(4096) NOT NULL,"
|
||||
@" c_value VARCHAR(255) NOT NULL,"
|
||||
@" c_creationdate INT NOT NULL,"
|
||||
@" c_lastseen INT NOT NULL)");
|
||||
|
||||
@@ -508,62 +367,6 @@
|
||||
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
|
||||
@@ -595,7 +398,7 @@
|
||||
static NSString *sqlFolderFormat
|
||||
= (@"CREATE TABLE %@ ("
|
||||
@" c_id VARCHAR2(255) PRIMARY KEY,"
|
||||
@" c_value VARCHAR2(4096) NOT NULL,"
|
||||
@" c_value VARCHAR2(255) NOT NULL,"
|
||||
@" c_creationdate INTEGER NOT NULL,"
|
||||
@" c_lastseen INTEGER NOT NULL)");
|
||||
|
||||
|
||||
Loaded 100 of 1856 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user