Merge branch 'develop' into feature/phone-input

# Conflicts:
#	packages/components/index.js
This commit is contained in:
Elyor Djalilov 2022-10-03 12:20:33 +05:00
commit 41261e64b9
940 changed files with 133073 additions and 101819 deletions

View File

@ -0,0 +1,42 @@
name: 4testing multiarch-build
on:
push:
branches: [ "develop" ]
jobs:
build:
runs-on: ubuntu-latest
strategy:
matrix:
platform: [linux/amd64]
steps:
-
name: Checkout
uses: actions/checkout@v2
-
name: Set up QEMU
uses: docker/setup-qemu-action@v2
-
name: Set up Docker Buildx
id: buildx
uses: docker/setup-buildx-action@v1
-
name: Login to DockerHub
uses: docker/login-action@v2
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
-
name: Build 4testing
run: |
cd ./build/install/docker
REPO="onlyoffice" \
DOCKER_IMAGE_PREFIX="4testing-docspace" \
DOCKER_TAG="develop" \
DOCKERFILE="Dockerfile.app" \
docker buildx bake -f build.yml \
--set *.args.GIT_BRANCH="develop" \
--set *.platform=linux/amd64 \
--push
shell: bash

View File

@ -48,7 +48,8 @@ DIST="";
REV="";
KERNEL="";
INSTALL_KAFKA="true";
INSTALL_REDIS="true";
INSTALL_RABBITMQ="true";
INSTALL_MYSQL_SERVER="true";
INSTALL_DOCUMENT_SERVER="true";
INSTALL_PRODUCT="true";
@ -58,6 +59,7 @@ HUB="";
USERNAME="";
PASSWORD="";
MYSQL_VERSION=""
MYSQL_DATABASE=""
MYSQL_USER=""
MYSQL_PASSWORD=""
@ -65,19 +67,17 @@ MYSQL_ROOT_PASSWORD=""
MYSQL_HOST=""
DATABASE_MIGRATION="true"
ZOO_PORT=""
ZOO_HOST=""
KAFKA_HOST=""
ELK_VERSION=""
ELK_HOST=""
DOCUMENT_SERVER_IMAGE_NAME=onlyoffice/4testing-documentserver-ee:latest
DOCUMENT_SERVER_JWT_SECRET=""
DOCUMENT_SERVER_JWT_HEADER=""
DOCUMENT_SERVER_HOST=""
APP_CORE_BASE_DOMAIN=""
APP_CORE_MACHINEKEY=""
APP_DOTNET_ENV=""
ENV_EXTENSION=""
HELP_TARGET="install-Docker.sh";
@ -138,9 +138,16 @@ while [ "$1" != "" ]; do
fi
;;
-ikafka | --installkafka )
-ira | --installrabbitmq )
if [ "$2" != "" ]; then
INSTALL_KAFKA=$2
INSTALL_RABBITMQ=$2
shift
fi
;;
-ire | --installredis )
if [ "$2" != "" ]; then
INSTALL_REDIS=$2
shift
fi
;;
@ -187,27 +194,6 @@ while [ "$1" != "" ]; do
fi
;;
-zp | --zookeeperport )
if [ "$2" != "" ]; then
ZOO_PORT=$2
shift
fi
;;
-zh | --zookeeperhost )
if [ "$2" != "" ]; then
ZOO_HOST=$2
shift
fi
;;
-kh | --kafkahost )
if [ "$2" != "" ]; then
KAFKA_HOST=$2
shift
fi
;;
-esh | --elasticsearchhost )
if [ "$2" != "" ]; then
ELK_HOST=$2
@ -252,7 +238,7 @@ while [ "$1" != "" ]; do
-env | --environment )
if [ "$2" != "" ]; then
APP_DOTNET_ENV=$2
ENV_EXTENSION=$2
shift
fi
;;
@ -311,16 +297,14 @@ while [ "$1" != "" ]; do
echo " -ids, --installdocumentserver install or update document server (true|false)"
echo " -di, --documentserverimage document server image name"
echo " -imysql, --installmysql install or update mysql (true|false)"
echo " -ikafka, --installkafka install or update kafka (true|false)"
echo " -ira, --installrabbitmq install or update rabbitmq (true|false)"
echo " -ire, --installredis install or update redis (true|false)"
echo " -mysqlrp, --mysqlrootpassword mysql server root password"
echo " -mysqld, --mysqldatabase $PRODUCT database name"
echo " -mysqlu, --mysqluser $PRODUCT database user"
echo " -mysqlp, --mysqlpassword $PRODUCT database password"
echo " -mysqlh, --mysqlhost mysql server host"
echo " -dsh, --docspdcehost $PRODUCT host"
echo " -zp, --zookeeperport zookeeper port (default value 2181)"
echo " -zh, --zookeeperhost zookeeper host"
echo " -kh, --kafkahost kafka host"
echo " -esh, --elasticsearchhost elasticsearch host"
echo " -env, --environment $PRODUCT environment"
echo " -skiphc, --skiphardwarecheck skip hardware check (true|false)"
@ -826,6 +810,7 @@ install_mysql_server () {
MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD:-"$MYSQL_PASSWORD"}
fi
reconfigure MYSQL_VERSION ${MYSQL_VERSION}
reconfigure MYSQL_DATABASE ${MYSQL_DATABASE}
reconfigure MYSQL_USER ${MYSQL_USER}
reconfigure MYSQL_PASSWORD ${MYSQL_PASSWORD}
@ -842,35 +827,47 @@ install_document_server () {
fi
reconfigure DOCUMENT_SERVER_IMAGE_NAME ${DOCUMENT_SERVER_IMAGE_NAME}
reconfigure DOCUMENT_SERVER_JWT_HEADER ${DOCUMENT_SERVER_JWT_HEADER}
reconfigure DOCUMENT_SERVER_JWT_SECRET ${DOCUMENT_SERVER_JWT_SECRET}
reconfigure DOCUMENT_SERVER_HOST ${DOCUMENT_SERVER_HOST}
docker-compose -f $BASE_DIR/ds.yml up -d
}
install_kafka () {
reconfigure ZOO_PORT ${ZOO_PORT}
reconfigure ZOO_HOST ${ZOO_HOST}
reconfigure KAFKA_HOST ${KAFKA_HOST}
install_rabbitmq () {
if ! command_exists docker-compose; then
install_docker_compose
fi
docker-compose -f $BASE_DIR/kafka.yml up -d
docker-compose -f $BASE_DIR/rabbitmq.yml up -d
}
install_redis () {
if ! command_exists docker-compose; then
install_docker_compose
fi
docker-compose -f $BASE_DIR/redis.yml up -d
}
install_product () {
if ! command_exists docker-compose; then
install_docker_compose
fi
reconfigure ENV_EXTENSION ${ENV_EXTENSION}
reconfigure ELK_HOST ${ELK_HOST}
reconfigure ELK_VERSION ${ELK_VERSION}
reconfigure SERVICE_PORT ${SERVICE_PORT}
reconfigure APP_CORE_MACHINEKEY ${APP_CORE_MACHINEKEY}
reconfigure APP_CORE_BASE_DOMAIN ${APP_CORE_BASE_DOMAIN}
reconfigure DOCKER_TAG ${DOCKER_TAG}
if [[ -n $EXTERNAL_PORT ]]; then
sed -i "s/8092:8092/${EXTERNAL_PORT}:8092/g" $BASE_DIR/$PRODUCT.yml
sed -i "s/8092:8092/${EXTERNAL_PORT}:8092/g" $BASE_DIR/appserver.yml
fi
docker-compose -f $BASE_DIR/$PRODUCT.yml up -d
docker-compose -f $BASE_DIR/migration-runner.yml up -d
docker-compose -f $BASE_DIR/appserver.yml up -d
docker-compose -f $BASE_DIR/notify.yml up -d
}
@ -903,7 +900,7 @@ check_image_RepoDigest() {
}
docker_image_update() {
docker-compose -f $BASE_DIR/notify.yml -f $BASE_DIR/$PRODUCT.yml down --volumes
docker-compose -f $BASE_DIR/notify.yml -f $BASE_DIR/appserver.yml down --volumes
docker-compose -f $BASE_DIR/build.yml pull
}
@ -943,16 +940,14 @@ save_parameters_from_configs() {
MYSQL_ROOT_PASSWORD=$(save_parameter MYSQL_ROOT_PASSWORD $MYSQL_ROOT_PASSWORD)
MYSQL_HOST=$(save_parameter MYSQL_HOST $MYSQL_HOST)
DOCUMENT_SERVER_JWT_SECRET=$(save_parameter DOCUMENT_SERVER_JWT_SECRET $DOCUMENT_SERVER_JWT_SECRET)
DOCUMENT_SERVER_JWT_HEADER=$(save_parameter DOCUMENT_SERVER_JWT_HEADER $DOCUMENT_SERVER_JWT_HEADER)
DOCUMENT_SERVER_HOST=$(save_parameter DOCUMENT_SERVER_HOST $DOCUMENT_SERVER_HOST)
ZOO_PORT=$(save_parameter ZOO_PORT $ZOO_PORT)
ZOO_HOST=$(save_parameter ZOO_HOST $ZOO_HOST)
KAFKA_HOST=$(save_parameter KAFKA_HOST $KAFKA_HOST)
ELK_HOST=$(save_parameter ELK_HOST $ELK_HOST)
SERVICE_PORT=$(save_parameter SERVICE_PORT $SERVICE_PORT)
APP_CORE_MACHINEKEY=$(save_parameter APP_CORE_MACHINEKEY $APP_CORE_MACHINEKEY)
APP_CORE_BASE_DOMAIN=$(save_parameter APP_CORE_BASE_DOMAIN $APP_CORE_BASE_DOMAIN)
if [ ${EXTERNAL_PORT} = "8092" ]; then
EXTERNAL_PORT=$(grep -oP '(?<=- ).*?(?=:8092)' /app/onlyoffice/$PRODUCT.yml)
EXTERNAL_PORT=$(grep -oP '(?<=- ).*?(?=:8092)' /app/onlyoffice/appserver.yml)
fi
}
@ -1004,8 +999,12 @@ start_installation () {
install_document_server
fi
if [ "$INSTALL_KAFKA" == "true" ]; then
install_kafka
if [ "$INSTALL_RABBITMQ" == "true" ]; then
install_rabbitmq
fi
if [ "$INSTALL_REDIS" == "true" ]; then
install_redis
fi
if [ "$INSTALL_PRODUCT" == "true" ]; then

View File

@ -4,19 +4,19 @@ set -e
PRODUCT="docspace"
ENVIRONMENT="production"
PACKAGE_SYSNAME="onlyoffice"
APP_DIR="/etc/onlyoffice/${PRODUCT}"
APP_DIR="/etc/${PACKAGE_SYSNAME}/${PRODUCT}"
PRODUCT_DIR="/var/www/${PRODUCT}"
USER_CONF="$APP_DIR/appsettings.$ENVIRONMENT.json"
NGINX_DIR="/etc/nginx"
NGINX_CONF="${NGINX_DIR}/conf.d"
SYSTEMD_DIR="/lib/systemd/system"
MYSQL=""
DB_HOST=""
DB_HOST="localhost"
DB_PORT="3306"
DB_NAME=""
DB_USER=""
DB_NAME="${PACKAGE_SYSNAME}"
DB_USER="root"
DB_PWD=""
APP_HOST="localhost"
@ -31,7 +31,8 @@ ELK_PORT="9200"
RABBITMQ_HOST="localhost"
RABBITMQ_USER="guest"
RABBITMQ_PWD="guest"
RABBITMQ_PASSWORD="guest"
RABBITMQ_PORT="5672"
REDIS_HOST="localhost"
REDIS_PORT="6379"
@ -156,12 +157,19 @@ while [ "$1" != "" ]; do
fi
;;
-rbp | --rabbitmqpassword )
-rbpw | --rabbitmqpassword )
if [ "$2" != "" ]; then
RABBITMQ_PASSWORD=$2
shift
fi
;;
-rbp | --rabbitmqport )
if [ "$2" != "" ]; then
RABBITMQ_PORT=$2
shift
fi
;;
-? | -h | --help )
echo " Usage: bash ${PRODUCT}-configuration.sh [PARAMETER] [[PARAMETER], ...]"
@ -176,8 +184,9 @@ while [ "$1" != "" ]; do
echo " -rdh, --redishost redis ip"
echo " -rdp, --redisport redis port (default 6379)"
echo " -rbh, --rabbitmqhost rabbitmq ip"
echo " -rbp, --rabbitmqport rabbitmq port"
echo " -rbu, --rabbitmquser rabbitmq user"
echo " -rbp, --rabbitmqpassword rabbitmq password"
echo " -rbpw, --rabbitmqpassword rabbitmq password"
echo " -mysqlh, --mysqlhost mysql server host"
echo " -mysqld, --mysqldatabase ${PRODUCT} database name"
echo " -mysqlu, --mysqluser ${PRODUCT} database user"
@ -216,7 +225,7 @@ install_json() {
#Creating a user-defined .json
if [ ! -e $USER_CONF ]; then
echo "{}" >> $USER_CONF
chown onlyoffice:onlyoffice $USER_CONF
chown ${PACKAGE_SYSNAME}:${PACKAGE_SYSNAME} $USER_CONF
set_core_machinekey
$JSON_USERCONF "this.core={'base-domain': \"$APP_HOST\", 'machinekey': \"$CORE_MACHINEKEY\" }" >/dev/null 2>&1
@ -224,14 +233,16 @@ install_json() {
}
restart_services() {
echo -n "Restarting services... "
sed -e "s/ENVIRONMENT=.*/ENVIRONMENT=$ENVIRONMENT/" -e "s/environment=.*/environment=$ENVIRONMENT/" -i $SYSTEMD_DIR/${PRODUCT}*.service >/dev/null 2>&1
sed -e "s/ENVIRONMENT=.*/ENVIRONMENT=$ENVIRONMENT/" -e "s/environment=.*/environment=$ENVIRONMENT/" -i /lib/systemd/system/${PRODUCT}*.service >/dev/null 2>&1
systemctl daemon-reload
systemctl start ${PRODUCT}-migration-runner || true
echo -n "Updating database... "
systemctl start ${PRODUCT}-migration-runner >/dev/null 2>&1 || true
sleep 15
echo "OK"
for SVC in api urlshortener socket studio-notify notify \
echo -n "Restarting services... "
for SVC in login api urlshortener socket studio-notify notify \
people-server files files-services studio backup telegram-service \
webhooks-service clear-events backup-background migration ssoauth doceditor
do
@ -412,7 +423,7 @@ setup_nginx(){
# Remove default nginx website
rm -f $NGINX_CONF/default.conf >/dev/null 2>&1 || rm -f $NGINX_DIR/sites-enabled/default >/dev/null 2>&1
sed -i "s/listen.*;/listen $APP_PORT;/" $NGINX_CONF/onlyoffice.conf
sed -i "s/listen.*;/listen $APP_PORT;/" $NGINX_CONF/${PACKAGE_SYSNAME}.conf
if [ "$DIST" = "RedHat" ]; then
# Remove default nginx settings
@ -427,12 +438,26 @@ setup_nginx(){
if $(getenforce) >/dev/null 2>&1; then
case $(getenforce) in
enforcing|permissive)
PORTS+=('8081') #Storybook
PORTS+=("$DOCUMENT_SERVER_PORT")
PORTS+=('5001') #ASC.Web.Studio
PORTS+=('5002') #ASC.People
PORTS+=('5008') #ASC.Files/client
PORTS+=('5000') #ASC.Web.Api
PORTS+=('5001') #client
PORTS+=('5003') #ASC.Web.Studio
PORTS+=('5004') #ASC.People
PORTS+=('5005') #ASC.Notify
PORTS+=('5006') #ASC.Studio.Notify
PORTS+=('5007') #ASC.Files/server
PORTS+=('5009') #ASC.Files/service
PORTS+=('5011') #ASC.Login
PORTS+=('5012') #ASC.Data.Backup
PORTS+=('5013') #ASC.Files/editor
PORTS+=('5018') #ASC.Migration
PORTS+=('5027') #ASC.ClearEvents
PORTS+=('5028') #ASC.Socket.IO
PORTS+=('5029') #ASC.UrlShortener
PORTS+=('5031') #ASC.Webhooks.Service
PORTS+=('5032') #ASC.Data.Backup.BackgroundTasks
PORTS+=('8081') #Storybook
PORTS+=('9834') #ASC.SsoAuth
PORTS+=('51702') #ASC.TelegramService
setsebool -P httpd_can_network_connect on
;;
disabled)
@ -448,7 +473,6 @@ setup_nginx(){
fi
fi
chown nginx:nginx /etc/nginx/* -R
sudo sed -e 's/#//' -i $NGINX_CONF/onlyoffice.conf
systemctl enable nginx >/dev/null 2>&1
systemctl restart nginx
echo "OK"
@ -456,13 +480,13 @@ setup_nginx(){
setup_docs() {
echo -n "Configuring Docs... "
local DS_CONF="/etc/onlyoffice/documentserver/local.json"
local DS_CONF="/etc/${PACKAGE_SYSNAME}/documentserver/local.json"
local JSON_DSCONF="$JSON $DS_CONF -e"
#Changing the Docs port in nginx conf
sed -i "s/0.0.0.0:.*;/0.0.0.0:$DOCUMENT_SERVER_PORT;/" $NGINX_CONF/ds.conf
sed -i "s/]:.*;/]:$DOCUMENT_SERVER_PORT default_server;/g" $NGINX_CONF/ds.conf
sed "0,/proxy_pass .*;/{s/proxy_pass .*;/proxy_pass http:\/\/${DOCUMENT_SERVER_HOST}:${DOCUMENT_SERVER_PORT};/}" -i $NGINX_CONF/onlyoffice.conf
sed "0,/proxy_pass .*;/{s/proxy_pass .*;/proxy_pass http:\/\/${DOCUMENT_SERVER_HOST}:${DOCUMENT_SERVER_PORT};/}" -i $NGINX_CONF/${PACKAGE_SYSNAME}.conf
#Enable JWT validation for Docs
$JSON_DSCONF "this.services.CoAuthoring.token.enable.browser='true'" >/dev/null 2>&1
@ -475,7 +499,7 @@ setup_docs() {
#Save Docs address and JWT in .json
$JSON_USERCONF "this.files={'docservice': {\
'secret': {'value': \"$DOCUMENT_SERVER_JWT_SECRET\",'header': \"$DOCUMENT_SERVER_JWT_HEADER\"}, \
'url': {'public': '/ds-vpath/','internal': \"http://${DOCUMENT_SERVER_HOST}:${DOCUMENT_SERVER_PORT}\",'portal': \"http://$APP_HOST:$APP_PORT\"}}}" >/dev/null 2>&1
'url': {'public': \"http://${DOCUMENT_SERVER_HOST}:${DOCUMENT_SERVER_PORT}\", 'internal': \"http://${DOCUMENT_SERVER_HOST}:${DOCUMENT_SERVER_PORT}\",'portal': \"http://$APP_HOST:$APP_PORT\"}}}" >/dev/null 2>&1
#Docs Database Migration
local DOCUMENT_SERVER_DB_HOST=$(json -f ${DS_CONF} services.CoAuthoring.sql.dbHost)
@ -485,7 +509,7 @@ setup_docs() {
local DOCUMENT_SERVER_DB_PASSWORD=$(json -f ${DS_CONF} services.CoAuthoring.sql.dbPass)
local DS_CONNECTION_STRING="Host=${DOCUMENT_SERVER_DB_HOST};Port=${DOCUMENT_SERVER_DB_PORT};Database=${DOCUMENT_SERVER_DB_NAME};Username=${DOCUMENT_SERVER_DB_USERNAME};Password=${DOCUMENT_SERVER_DB_PASSWORD};"
sed "s/Host=.*/$DS_CONNECTION_STRING;\"/g" -i $PRODUCT_DIR/services/ASC.Migration.Runner/appsettings.json
sed "s/Host=.*/$DS_CONNECTION_STRING\"/g" -i $PRODUCT_DIR/services/ASC.Migration.Runner/appsettings.json
echo "OK"
}
@ -576,7 +600,7 @@ setup_redis() {
setup_rabbitmq() {
echo -n "Configuring rabbitmq... "
$JSON $APP_DIR/rabbitmq.json -e "this.RabbitMQ={'Hostname': \"${RABBITMQ_HOST}\",'UserName': \"${RABBITMQ_USER}\",'Password': \"${RABBITMQ_PASSWORD}\" }" >/dev/null 2>&1
$JSON $APP_DIR/rabbitmq.json -e "this.RabbitMQ={'Hostname': \"${RABBITMQ_HOST}\",'UserName': \"${RABBITMQ_USER}\",'Password': \"${RABBITMQ_PASSWORD}\",'Port': \"${RABBITMQ_PORT}\",'VirtualHost': \"/\" }" >/dev/null 2>&1
systemctl enable rabbitmq-server >/dev/null 2>&1
systemctl restart rabbitmq-server
@ -607,7 +631,7 @@ if $PACKAGE_MANAGER nginx >/dev/null 2>&1; then
setup_nginx
fi
if $PACKAGE_MANAGER onlyoffice-documentserver >/dev/null 2>&1 || $PACKAGE_MANAGER onlyoffice-documentserver-de >/dev/null 2>&1 || $PACKAGE_MANAGER onlyoffice-documentserver-ee >/dev/null 2>&1; then
if $PACKAGE_MANAGER ${PACKAGE_SYSNAME}-documentserver >/dev/null 2>&1 || $PACKAGE_MANAGER ${PACKAGE_SYSNAME}-documentserver-de >/dev/null 2>&1 || $PACKAGE_MANAGER ${PACKAGE_SYSNAME}-documentserver-ee >/dev/null 2>&1; then
setup_docs
fi

View File

@ -61,6 +61,7 @@ SERVICE_NAME=(
migration
doceditor
migration-runner
login
)
reassign_values (){
@ -154,24 +155,32 @@ reassign_values (){
WORK_DIR="${BASE_DIR}/services/ASC.Migration.Runner/"
EXEC_FILE="ASC.Migration.Runner.dll"
;;
login )
SERVICE_PORT="5011"
WORK_DIR="${BASE_DIR}/products/ASC.Login/login/"
EXEC_FILE="server.js"
;;
esac
SERVICE_NAME="$1"
if [[ "${EXEC_FILE}" == *".js" ]]; then
SERVICE_TYPE="simple"
SERVICE_TYPE="simple"
RESTART="always"
EXEC_START="${NODE_RUN} ${WORK_DIR}${EXEC_FILE} --app.port=${SERVICE_PORT} --app.appsettings=${PATH_TO_CONF} --app.environment=${ENVIRONMENT}"
elif [[ "${SERVICE_NAME}" = "migration-runner" ]]; then
SERVICE_TYPE="notify"
SERVICE_TYPE="simple"
RESTART="no"
EXEC_START="${DOTNET_RUN} ${WORK_DIR}${EXEC_FILE}"
else
SERVICE_TYPE="notify"
SERVICE_TYPE="notify"
RESTART="always"
EXEC_START="${DOTNET_RUN} ${WORK_DIR}${EXEC_FILE} --urls=${APP_URLS}:${SERVICE_PORT} --pathToConf=${PATH_TO_CONF} \
--'\$STORAGE_ROOT'=${STORAGE_ROOT} --log:dir=${LOG_DIR} --log:name=${SERVICE_NAME}${CORE}${ENVIRONMENT}"
fi
}
write_to_file () {
sed -i -e 's#${SERVICE_NAME}#'$SERVICE_NAME'#g' -e 's#${WORK_DIR}#'$WORK_DIR'#g' -e \
"s#\${EXEC_START}#$EXEC_START#g" -e "s#\${SERVICE_TYPE}#$SERVICE_TYPE#g" $BUILD_PATH/${PRODUCT}-${SERVICE_NAME[$i]}.service
sed -i -e 's#${SERVICE_NAME}#'$SERVICE_NAME'#g' -e 's#${WORK_DIR}#'$WORK_DIR'#g' -e "s#\${RESTART}#$RESTART#g" \
-e "s#\${EXEC_START}#$EXEC_START#g" -e "s#\${SERVICE_TYPE}#$SERVICE_TYPE#g" $BUILD_PATH/${PRODUCT}-${SERVICE_NAME[$i]}.service
}
mkdir -p $BUILD_PATH

View File

@ -10,7 +10,7 @@ WorkingDirectory=${WORK_DIR}
ExecStart=${EXEC_START}
TimeoutSec=600
Restart=always
Restart=${RESTART}
PrivateTmp=false
[Install]

View File

@ -17,6 +17,7 @@ db_input medium {{product}}/redis-port || true
db_input medium {{product}}/rabbitmq-host || true
db_input medium {{product}}/rabbitmq-user || true
db_input medium {{product}}/rabbitmq-port || true
db_input medium {{product}}/rabbitmq-password || true
db_input medium {{product}}/db-host || true

View File

@ -16,6 +16,7 @@ Depends: {{product}}-api (= {{package_header_tag_version}}),
{{product}}-doceditor(= {{package_header_tag_version}}),
{{product}}-files (= {{package_header_tag_version}}),
{{product}}-files-services (= {{package_header_tag_version}}),
{{product}}-login (= {{package_header_tag_version}}),
{{product}}-migration (= {{package_header_tag_version}}),
{{product}}-migration-runner (= {{package_header_tag_version}}),
{{product}}-notify (= {{package_header_tag_version}}),
@ -192,3 +193,11 @@ Depends: {{product}}-common (= {{package_header_tag_version}}),
${misc:Depends},
${shlibs:Depends}
Description: Description
Package: {{product}}-login
Architecture: any
Depends: {{product}}-common (= {{package_header_tag_version}}),
nodejs (>=14),
${misc:Depends},
${shlibs:Depends}
Description: Description

View File

@ -31,6 +31,8 @@ case "$1" in
RABBITMQ_HOST="$RET"
db_get {{product}}/rabbitmq-user || true
RABBITMQ_USER="$RET"
db_get {{product}}/rabbitmq-port || true
RABBITMQ_PORT="$RET"
db_get {{product}}/rabbitmq-password || true
RABBITMQ_PASSWORD="$RET"
@ -46,8 +48,8 @@ case "$1" in
db_get onlyoffice/ds-port || true
DOCUMENT_SERVER_PORT="$RET"
bash /usr/bin/{{product}}-configuration.sh -e $ENVIRONMENT -mysqlh $DB_HOST -mysqld $DB_NAME -mysqlu $DB_USER -mysqlp $DB_PWD -ash $APP_HOST -asp $APP_PORT \
-dsh $DOCUMENT_SERVER_HOST -dsp $DOCUMENT_SERVER_PORT -rdh $REDIS_HOST -rdp $REDIS_PORT -rbh $RABBITMQ_HOST -rbu $RABBITMQ_USER -rbp $RABBITMQ_PASSWORD -ess $ELK_SHEME -esh $ELK_HOST -esp $ELK_PORT
bash /usr/bin/{{product}}-configuration.sh -e $ENVIRONMENT -mysqlh $DB_HOST -mysqld $DB_NAME -mysqlu $DB_USER -mysqlp $DB_PWD -ash $APP_HOST -asp $APP_PORT -dsh $DOCUMENT_SERVER_HOST \
-dsp $DOCUMENT_SERVER_PORT -rdh $REDIS_HOST -rdp $REDIS_PORT -rbh $RABBITMQ_HOST -rbp $RABBITMQ_PORT -rbu $RABBITMQ_USER -rbpw $RABBITMQ_PASSWORD -ess $ELK_SHEME -esh $ELK_HOST -esp $ELK_PORT
;;
abort-upgrade|abort-remove|abort-deconfigure)

View File

@ -0,0 +1 @@
../../../build/deploy/login/* var/www/{{product}}/products/ASC.Login/login

View File

@ -3,4 +3,3 @@
../../../config/nginx/includes/onlyoffice*.conf etc/nginx/includes
../../../build/deploy/public/* var/www/{{product}}/public
../../../build/deploy/client/* var/www/{{product}}/client
../../../build/deploy/login/* var/www/{{product}}/login

View File

@ -32,6 +32,7 @@ override_dh_auto_build:
bash build-backend.sh -sp ${SRC_PATH}; \
bash publish-backend.sh -sp ${SRC_PATH}
rm ${SRC_PATH}/config/nginx/onlyoffice-login.conf
sed -i "s@var/www@var/www/${PRODUCT}@g" ${SRC_PATH}/config/nginx/*.conf
sed -i "s@var/www@var/www/${PRODUCT}@g" ${SRC_PATH}/config/nginx/includes/*.conf

View File

@ -63,6 +63,11 @@ Type: string
Default: localhost
Description: RabbitMQ host:
Template: {{product}}/rabbitmq-port
Type: string
Default: 5672
Description: RabbitMQ port:
Template: {{product}}/rabbitmq-user
Type: string
Default: guest

View File

@ -2,12 +2,13 @@
PRODUCT=onlyoffice
REPO=${PRODUCT}
STATUS=""
DOCKER_IMAGE_PREFIX=${STATUS}docspace
DOCKER_TAG=latest
CONTAINER_PREFIX=${PRODUCT}-
MYSQL_VERSION=8.0.18
ELK_VERSION=7.13.1
SERVICE_PORT=5050
CONTAINER_PREFIX=${PRODUCT}-
DOCUMENT_SERVER_IMAGE_NAME=onlyoffice/4testing-documentserver-ee:latest
DOCKER_TAG=latest
DOCKERFILE=Dockerfile.app
# zookeeper #
@ -69,6 +70,7 @@
MIGRATION_RUNNER_HOST=${CONTAINER_PREFIX}migration-runner
PROXY_HOST=${CONTAINER_PREFIX}proxy
DOCEDITOR_HOST=${CONTAINER_PREFIX}doceditor
LOGIN_HOST=${CONTAINER_PREFIX}login
# proxy upstream environment #
SERVICE_API_SYSTEM=${API_SYSTEM_HOST}:${SERVICE_PORT}
@ -91,5 +93,6 @@
SERVICE_STUDIO=${STUDIO_HOST}:${SERVICE_PORT}
SERVICE_SSOAUTH=${SSOAUTH_HOST}:${SERVICE_PORT}
SERVICE_DOCEDITOR=${DOCEDITOR_HOST}:5013
SERVICE_LOGIN=${LOGIN_HOST}:5011
NETWORK_NAME=${PRODUCT}

View File

@ -23,20 +23,19 @@ ENV LANG=en_US.UTF-8 \
LC_ALL=en_US.UTF-8
RUN apt-get -y update && \
apt-get -y upgrade && \
apt-get -y dist-upgrade && \
apt-get install -yq sudo locales && \
addgroup --system --gid 107 onlyoffice && \
adduser -uid 104 --quiet --home /var/www/onlyoffice --system --gid 107 onlyoffice && \
apt-get install -yq \
sudo \
locales \
git \
npm && \
locale-gen en_US.UTF-8 && \
apt-get -y update && \
apt-get install -yq git apt-utils npm && \
npm install --global yarn && \
curl -fsSL https://deb.nodesource.com/setup_16.x | sudo -E bash - && \
apt-get install -y nodejs
apt-get install -y nodejs && \
rm -rf /var/lib/apt/lists/*
RUN echo ${GIT_BRANCH} && \
git clone --recurse-submodules -b ${GIT_BRANCH} https://github.com/ONLYOFFICE/AppServer.git ${SRC_PATH}
git clone --depth 1 --recurse-submodules -b ${GIT_BRANCH} https://github.com/ONLYOFFICE/DocSpace.git ${SRC_PATH}
RUN cd ${SRC_PATH} && \
# mkdir -p /app/onlyoffice/config/ && cp -rf config/* /app/onlyoffice/config/ && \
@ -62,9 +61,7 @@ RUN cd ${SRC_PATH} && \
COPY config/mysql/conf.d/mysql.cnf /etc/mysql/conf.d/mysql.cnf
RUN rm -rf /var/lib/apt/lists/*
FROM $DOTNET_RUN as builder
FROM $DOTNET_RUN as dotnetrun
ARG BUILD_PATH
ARG SRC_PATH
ENV BUILD_PATH=${BUILD_PATH}
@ -79,10 +76,15 @@ RUN mkdir -p /var/log/onlyoffice && \
chown onlyoffice:onlyoffice /var/log -R && \
chown onlyoffice:onlyoffice /var/www -R && \
apt-get -y update && \
apt-get -y upgrade && \
apt-get install -yq sudo nano curl vim python3-pip && \
apt-get install -yq libgdiplus && \
pip3 install --upgrade jsonpath-ng multipledispatch
apt-get install -yq \
sudo \
nano \
curl \
vim \
python3-pip \
libgdiplus && \
pip3 install --upgrade jsonpath-ng multipledispatch && \
rm -rf /var/lib/apt/lists/*
COPY --from=base --chown=onlyoffice:onlyoffice /app/onlyoffice/config/* /app/onlyoffice/config/
@ -90,7 +92,7 @@ COPY --from=base --chown=onlyoffice:onlyoffice /app/onlyoffice/config/* /app/onl
EXPOSE 5050
ENTRYPOINT ["python3", "docker-entrypoint.py"]
FROM node:16.16-slim as nodeBuild
FROM node:16.16-slim as noderun
ARG BUILD_PATH
ARG SRC_PATH
ENV BUILD_PATH=${BUILD_PATH}
@ -104,9 +106,14 @@ RUN mkdir -p /var/log/onlyoffice && \
chown onlyoffice:onlyoffice /var/log -R && \
chown onlyoffice:onlyoffice /var/www -R && \
apt-get -y update && \
apt-get -y upgrade && \
apt-get install -yq sudo nano curl vim python3-pip && \
pip3 install --upgrade jsonpath-ng multipledispatch
apt-get install -yq \
sudo \
nano \
curl \
vim \
python3-pip && \
pip3 install --upgrade jsonpath-ng multipledispatch && \
rm -rf /var/lib/apt/lists/*
COPY --from=base --chown=onlyoffice:onlyoffice /app/onlyoffice/config/* /app/onlyoffice/config/
@ -114,7 +121,7 @@ EXPOSE 5050
ENTRYPOINT ["python3", "docker-entrypoint.py"]
## Nginx image ##
FROM nginx AS web
FROM nginx AS proxy
ARG SRC_PATH
ARG BUILD_PATH
ARG COUNT_WORKER_CONNECTIONS=1024
@ -123,16 +130,14 @@ ENV DNS_NAMESERVER=127.0.0.11 \
MAP_HASH_BUCKET_SIZE=""
RUN apt-get -y update && \
apt-get -y upgrade && \
apt-get install -yq vim && \
# Remove default nginx website
rm -rf /var/lib/apt/lists/* && \
rm -rf /usr/share/nginx/html/*
# copy static services files and config values
COPY --from=base /etc/nginx/conf.d /etc/nginx/conf.d
COPY --from=base /etc/nginx/includes /etc/nginx/includes
COPY --from=base ${SRC_PATH}/build/deploy/client ${BUILD_PATH}/client
COPY --from=base ${SRC_PATH}/build/deploy/login ${BUILD_PATH}/login
COPY --from=base ${SRC_PATH}/build/deploy/public ${BUILD_PATH}/public
COPY /config/nginx/templates/upstream.conf.template /etc/nginx/templates/upstream.conf.template
COPY /config/nginx/templates/nginx.conf.template /etc/nginx/nginx.conf.template
@ -142,33 +147,40 @@ COPY prepare-nginx-proxy.sh /docker-entrypoint.d/prepare-nginx-proxy.sh
RUN chown nginx:nginx /etc/nginx/* -R && \
chown nginx:nginx /docker-entrypoint.d/* && \
# changes for upstream configure
sed -i 's/localhost:5010/$service_api_system/' /etc/nginx/conf.d/onlyoffice.conf && \
sed -i 's/localhost:5012/$service_backup/' /etc/nginx/conf.d/onlyoffice.conf && \
sed -i 's/localhost:5021/$service_crm/' /etc/nginx/conf.d/onlyoffice.conf && \
sed -i 's/localhost:5007/$service_files/' /etc/nginx/conf.d/onlyoffice.conf && \
sed -i 's/localhost:5004/$service_people_server/' /etc/nginx/conf.d/onlyoffice.conf && \
sed -i 's/localhost:5020/$service_projects_server/' /etc/nginx/conf.d/onlyoffice.conf && \
sed -i 's/localhost:5000/$service_api/' /etc/nginx/conf.d/onlyoffice.conf && \
sed -i 's/localhost:5003/$service_studio/' /etc/nginx/conf.d/onlyoffice.conf && \
sed -i 's/localhost:5023/$service_calendar/' /etc/nginx/conf.d/onlyoffice.conf && \
sed -i 's/localhost:9899/$service_socket/' /etc/nginx/conf.d/onlyoffice.conf && \
sed -i 's/localhost:9834/$service_sso/' /etc/nginx/conf.d/onlyoffice.conf && \
sed -i 's/localhost:5022/$service_mail/' /etc/nginx/conf.d/onlyoffice.conf && \
sed -i 's/localhost:9999/$service_urlshortener/' /etc/nginx/conf.d/onlyoffice.conf && \
sed -i 's/localhost:5034/$service_migration/' /etc/nginx/conf.d/onlyoffice.conf && \
sed -i 's/localhost:5013/$service_doceditor/' /etc/nginx/conf.d/onlyoffice.conf && \
sed -i 's/127.0.0.1:5010/$service_api_system/' /etc/nginx/conf.d/onlyoffice.conf && \
sed -i 's/127.0.0.1:5012/$service_backup/' /etc/nginx/conf.d/onlyoffice.conf && \
sed -i 's/127.0.0.1:5021/$service_crm/' /etc/nginx/conf.d/onlyoffice.conf && \
sed -i 's/127.0.0.1:5007/$service_files/' /etc/nginx/conf.d/onlyoffice.conf && \
sed -i 's/127.0.0.1:5004/$service_people_server/' /etc/nginx/conf.d/onlyoffice.conf && \
sed -i 's/127.0.0.1:5020/$service_projects_server/' /etc/nginx/conf.d/onlyoffice.conf && \
sed -i 's/127.0.0.1:5000/$service_api/' /etc/nginx/conf.d/onlyoffice.conf && \
sed -i 's/127.0.0.1:5003/$service_studio/' /etc/nginx/conf.d/onlyoffice.conf && \
sed -i 's/127.0.0.1:5023/$service_calendar/' /etc/nginx/conf.d/onlyoffice.conf && \
sed -i 's/127.0.0.1:9899/$service_socket/' /etc/nginx/conf.d/onlyoffice.conf && \
sed -i 's/127.0.0.1:9834/$service_sso/' /etc/nginx/conf.d/onlyoffice.conf && \
sed -i 's/127.0.0.1:5022/$service_mail/' /etc/nginx/conf.d/onlyoffice.conf && \
sed -i 's/127.0.0.1:9999/$service_urlshortener/' /etc/nginx/conf.d/onlyoffice.conf && \
sed -i 's/127.0.0.1:5034/$service_migration/' /etc/nginx/conf.d/onlyoffice.conf && \
sed -i 's/127.0.0.1:5013/$service_doceditor/' /etc/nginx/conf.d/onlyoffice.conf && \
sed -i 's/127.0.0.1:5011/$service_login/' /etc/nginx/conf.d/onlyoffice.conf && \
sed -i 's/172.*/$document_server;/' /etc/nginx/conf.d/onlyoffice.conf
## Doceditor ##
FROM nodeBuild as doceditor
FROM noderun as doceditor
WORKDIR ${BUILD_PATH}/products/ASC.Files/editor
COPY --from=base --chown=onlyoffice:onlyoffice ${SRC_PATH}/build/deploy/editor/ .
EXPOSE 5013
ENTRYPOINT ["node", "server.js"]
## Login ##
FROM noderun as login
WORKDIR ${BUILD_PATH}/products/ASC.Login/login
COPY --from=base --chown=onlyoffice:onlyoffice ${SRC_PATH}/build/deploy/login/ .
ENTRYPOINT ["node", "server.js"]
## ASC.Data.Backup.BackgroundTasks ##
FROM builder AS backup_background
FROM dotnetrun AS backup_background
WORKDIR ${BUILD_PATH}/services/ASC.Data.Backup.BackgroundTasks/
COPY --chown=onlyoffice:onlyoffice docker-entrypoint.py ./docker-entrypoint.py
@ -177,7 +189,7 @@ COPY --from=base --chown=onlyoffice:onlyoffice ${BUILD_PATH}/services/ASC.Data.B
CMD ["ASC.Data.Backup.BackgroundTasks.dll", "ASC.Data.Backup.BackgroundTasks"]
## ASC.ClearEvents ##
FROM builder AS clear-events
FROM dotnetrun AS clear-events
WORKDIR ${BUILD_PATH}/services/ASC.ClearEvents/
COPY --chown=onlyoffice:onlyoffice docker-entrypoint.py ./docker-entrypoint.py
@ -186,7 +198,7 @@ COPY --from=base --chown=onlyoffice:onlyoffice ${BUILD_PATH}/services/ASC.ClearE
CMD ["ASC.ClearEvents.dll", "ASC.ClearEvents"]
## ASC.Migration ##
FROM builder AS migration
FROM dotnetrun AS migration
WORKDIR ${BUILD_PATH}/services/ASC.Migration/
COPY --chown=onlyoffice:onlyoffice docker-entrypoint.py ./docker-entrypoint.py
@ -195,7 +207,7 @@ COPY --from=base --chown=onlyoffice:onlyoffice ${BUILD_PATH}/services/ASC.Migrat
CMD ["ASC.Migration.dll", "ASC.Migration"]
## ASC.Data.Backup ##
FROM builder AS backup
FROM dotnetrun AS backup
WORKDIR ${BUILD_PATH}/services/ASC.Data.Backup/
COPY --chown=onlyoffice:onlyoffice docker-entrypoint.py ./docker-entrypoint.py
@ -204,7 +216,7 @@ COPY --from=base --chown=onlyoffice:onlyoffice ${BUILD_PATH}/services/ASC.Data.B
CMD ["ASC.Data.Backup.dll", "ASC.Data.Backup"]
## ASC.Files ##
FROM builder AS files
FROM dotnetrun AS files
WORKDIR ${BUILD_PATH}/products/ASC.Files/server/
COPY --chown=onlyoffice:onlyoffice docker-entrypoint.py ./docker-entrypoint.py
@ -213,7 +225,7 @@ COPY --from=base --chown=onlyoffice:onlyoffice ${BUILD_PATH}/products/ASC.Files/
CMD ["ASC.Files.dll", "ASC.Files"]
## ASC.Files.Service ##
FROM builder AS files_services
FROM dotnetrun AS files_services
WORKDIR ${BUILD_PATH}/products/ASC.Files/service/
COPY --chown=onlyoffice:onlyoffice docker-entrypoint.py ./docker-entrypoint.py
@ -222,7 +234,7 @@ COPY --from=base --chown=onlyoffice:onlyoffice ${BUILD_PATH}/services/ASC.Files.
CMD ["ASC.Files.Service.dll", "ASC.Files.Service"]
## ASC.Notify ##
FROM builder AS notify
FROM dotnetrun AS notify
WORKDIR ${BUILD_PATH}/services/ASC.Notify/service
COPY --chown=onlyoffice:onlyoffice docker-entrypoint.py ./docker-entrypoint.py
@ -231,7 +243,7 @@ COPY --from=base --chown=onlyoffice:onlyoffice ${BUILD_PATH}/services/ASC.Notify
CMD ["ASC.Notify.dll", "ASC.Notify"]
## ASC.People ##
FROM builder AS people_server
FROM dotnetrun AS people_server
WORKDIR ${BUILD_PATH}/products/ASC.People/server/
COPY --chown=onlyoffice:onlyoffice docker-entrypoint.py ./docker-entrypoint.py
@ -240,7 +252,7 @@ COPY --from=base --chown=onlyoffice:onlyoffice ${BUILD_PATH}/products/ASC.People
CMD ["ASC.People.dll", "ASC.People"]
## ASC.Socket.IO ##
FROM nodeBuild AS socket
FROM noderun AS socket
WORKDIR ${BUILD_PATH}/services/ASC.Socket.IO/
COPY --chown=onlyoffice:onlyoffice docker-entrypoint.py ./docker-entrypoint.py
@ -249,7 +261,7 @@ COPY --from=base --chown=onlyoffice:onlyoffice ${BUILD_PATH}/services/ASC.Socket
CMD ["server.js", "ASC.Socket.IO"]
## ASC.SsoAuth ##
FROM nodeBuild AS ssoauth
FROM noderun AS ssoauth
WORKDIR ${BUILD_PATH}/services/ASC.SsoAuth/
COPY --chown=onlyoffice:onlyoffice docker-entrypoint.py ./docker-entrypoint.py
@ -258,7 +270,7 @@ COPY --from=base --chown=onlyoffice:onlyoffice ${BUILD_PATH}/services/ASC.SsoAu
CMD ["app.js", "ASC.SsoAuth"]
## ASC.Studio.Notify ##
FROM builder AS studio_notify
FROM dotnetrun AS studio_notify
WORKDIR ${BUILD_PATH}/services/ASC.Studio.Notify/service/
COPY --chown=onlyoffice:onlyoffice docker-entrypoint.py ./docker-entrypoint.py
@ -267,7 +279,7 @@ COPY --from=base --chown=onlyoffice:onlyoffice ${BUILD_PATH}/services/ASC.Studio
CMD ["ASC.Studio.Notify.dll", "ASC.Studio.Notify"]
## ASC.TelegramService ##
FROM builder AS telegram_service
FROM dotnetrun AS telegram_service
WORKDIR ${BUILD_PATH}/services/ASC.TelegramService/
COPY --chown=onlyoffice:onlyoffice docker-entrypoint.py ./docker-entrypoint.py
@ -276,7 +288,7 @@ COPY --from=base --chown=onlyoffice:onlyoffice ${BUILD_PATH}/services/ASC.Telegr
CMD ["ASC.TelegramService.dll", "ASC.TelegramService"]
## ASC.UrlShortener ##
FROM nodeBuild AS urlshortener
FROM noderun AS urlshortener
WORKDIR ${BUILD_PATH}/services/ASC.UrlShortener/service/
COPY --chown=onlyoffice:onlyoffice docker-entrypoint.py ./docker-entrypoint.py
@ -285,7 +297,7 @@ COPY --from=base --chown=onlyoffice:onlyoffice ${BUILD_PATH}/services/ASC.UrlSh
CMD ["index.js", "ASC.UrlShortener"]
## ASC.Web.Api ##
FROM builder AS api
FROM dotnetrun AS api
WORKDIR ${BUILD_PATH}/studio/ASC.Web.Api/
COPY --chown=onlyoffice:onlyoffice docker-entrypoint.py ./docker-entrypoint.py
@ -294,7 +306,7 @@ COPY --from=base --chown=onlyoffice:onlyoffice ${BUILD_PATH}/services/ASC.Web.Ap
CMD ["ASC.Web.Api.dll", "ASC.Web.Api"]
## ASC.Webhooks.Service ##
FROM builder AS webhooks-service
FROM dotnetrun AS webhooks-service
WORKDIR ${BUILD_PATH}/services/ASC.Webhooks.Service/
COPY --chown=onlyoffice:onlyoffice docker-entrypoint.py ./docker-entrypoint.py
@ -303,7 +315,7 @@ COPY --from=base --chown=onlyoffice:onlyoffice ${BUILD_PATH}/services/ASC.Webhoo
CMD ["ASC.Webhooks.Service.dll", "ASC.Webhooks.Service"]
## ASC.Web.Studio ##
FROM builder AS studio
FROM dotnetrun AS studio
WORKDIR ${BUILD_PATH}/studio/ASC.Web.Studio/
COPY --chown=onlyoffice:onlyoffice docker-entrypoint.py ./docker-entrypoint.py

View File

@ -51,59 +51,59 @@ services:
- "9300"
onlyoffice-backup-background-tasks:
<<: *x-service-base
image: "${REPO}/${STATUS}appserver-backup-background:${DOCKER_TAG}"
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-backup-background:${DOCKER_TAG}"
container_name: ${BACKUP_BACKGRUOND_TASKS_HOST}
onlyoffice-backup:
<<: *x-service-base
image: "${REPO}/${STATUS}appserver-backup:${DOCKER_TAG}"
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-backup:${DOCKER_TAG}"
container_name: ${BACKUP_HOST}
onlyoffice-clear-events:
<<: *x-service-base
image: "${REPO}/${STATUS}appserver-clear-events:${DOCKER_TAG}"
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-clear-events:${DOCKER_TAG}"
container_name: ${CLEAR_EVENTS_HOST}
onlyoffice-migration:
<<: *x-service-base
image: "${REPO}/${STATUS}appserver-migration:${DOCKER_TAG}"
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-migration:${DOCKER_TAG}"
container_name: ${MIGRATION_HOST}
onlyoffice-files:
<<: *x-service-base
image: "${REPO}/${STATUS}appserver-files:${DOCKER_TAG}"
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-files:${DOCKER_TAG}"
container_name: ${FILES_HOST}
onlyoffice-files-services:
<<: *x-service-base
image: "${REPO}/${STATUS}appserver-files-services:${DOCKER_TAG}"
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-files-services:${DOCKER_TAG}"
container_name: ${FILES_SERVICES_HOST}
onlyoffice-people-server:
<<: *x-service-base
image: "${REPO}/${STATUS}appserver-people-server:${DOCKER_TAG}"
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-people-server:${DOCKER_TAG}"
container_name: ${PEOPLE_SERVER_HOST}
onlyoffice-socket:
<<: *x-service-base
image: "${REPO}/${STATUS}appserver-socket:${DOCKER_TAG}"
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-socket:${DOCKER_TAG}"
container_name: ${SOCKET_HOST}
expose:
- ${SERVICE_PORT}
onlyoffice-studio-notify:
<<: *x-service-base
image: "${REPO}/${STATUS}appserver-studio-notify:${DOCKER_TAG}"
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-studio-notify:${DOCKER_TAG}"
container_name: ${STUDIO_NOTIFY_HOST}
onlyoffice-telegram-service:
<<: *x-service-base
image: "${REPO}/${STATUS}appserver-telegram-service:${DOCKER_TAG}"
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-telegram-service:${DOCKER_TAG}"
container_name: ${TELEGRAM_SERVICE_HOST}
onlyoffice-urlshortener:
<<: *x-service-base
image: "${REPO}/${STATUS}appserver-urlshortener:${DOCKER_TAG}"
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-urlshortener:${DOCKER_TAG}"
container_name: ${URLSHORTENER_HOST}
expose:
- ${SERVICE_PORT}
@ -111,17 +111,17 @@ services:
onlyoffice-api:
<<: *x-service-base
image: "${REPO}/${STATUS}appserver-api:${DOCKER_TAG}"
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-api:${DOCKER_TAG}"
container_name: ${API_HOST}
onlyoffice-studio:
<<: *x-service-base
image: "${REPO}/${STATUS}appserver-studio:${DOCKER_TAG}"
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-studio:${DOCKER_TAG}"
container_name: ${STUDIO_HOST}
onlyoffice-ssoauth:
<<: *x-service-base
image: "${REPO}/${STATUS}appserver-ssoauth:${DOCKER_TAG}"
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-ssoauth:${DOCKER_TAG}"
container_name: ${SSOAUTH_HOST}
expose:
- ${SERVICE_PORT}
@ -129,18 +129,25 @@ services:
onlyoffice-webhooks-service:
<<: *x-service-base
image: "${REPO}/${STATUS}appserver-webhooks-service:${DOCKER_TAG}"
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-webhooks-service:${DOCKER_TAG}"
container_name: ${WEBHOOKS_SERVICE_HOST}
onlyoffice-doceditor:
image: "${REPO}/${STATUS}appserver-doceditor:${DOCKER_TAG}"
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-doceditor:${DOCKER_TAG}"
container_name: ${DOCEDITOR_HOST}
restart: always
expose:
- "5013"
onlyoffice-login:
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-login:${DOCKER_TAG}"
container_name: ${LOGIN_HOST}
restart: always
expose:
- "5011"
onlyoffice-proxy:
image: "${REPO}/${STATUS}appserver-proxy:${DOCKER_TAG}"
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-proxy:${DOCKER_TAG}"
container_name: ${PROXY_HOST}
restart: always
expose:
@ -165,6 +172,8 @@ services:
- onlyoffice-api
- onlyoffice-studio
- onlyoffice-ssoauth
- onlyoffice-doceditor
- onlyoffice-login
environment:
- SERVICE_BACKUP=${SERVICE_BACKUP}
- SERVICE_FILES=${SERVICE_FILES}
@ -182,6 +191,7 @@ services:
- SERVICE_STUDIO=${SERVICE_STUDIO}
- SERVICE_SSOAUTH=${SERVICE_SSOAUTH}
- SERVICE_DOCEDITOR=${SERVICE_DOCEDITOR}
- SERVICE_LOGIN=${SERVICE_LOGIN}
- DOCUMENT_SERVER=${DOCUMENT_SERVER_HOST}
- SERVICE_PORT=${SERVICE_PORT}
volumes:

View File

@ -6,144 +6,151 @@ services:
context: ./
dockerfile: "${DOCKERFILE}"
target: backup_background
image: "${REPO}/${STATUS}appserver-backup-background:${DOCKER_TAG}"
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-backup-background:${DOCKER_TAG}"
onlyoffice-clear-events:
build:
context: ./
dockerfile: "${DOCKERFILE}"
target: clear-events
image: "${REPO}/${STATUS}appserver-clear-events:${DOCKER_TAG}"
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-clear-events:${DOCKER_TAG}"
onlyoffice-migration:
build:
context: ./
dockerfile: "${DOCKERFILE}"
target: migration
image: "${REPO}/${STATUS}appserver-migration:${DOCKER_TAG}"
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-migration:${DOCKER_TAG}"
onlyoffice-backup:
build:
context: ./
dockerfile: "${DOCKERFILE}"
target: backup
image: "${REPO}/${STATUS}appserver-backup:${DOCKER_TAG}"
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-backup:${DOCKER_TAG}"
onlyoffice-files:
build:
context: ./
dockerfile: "${DOCKERFILE}"
target: files
image: "${REPO}/${STATUS}appserver-files:${DOCKER_TAG}"
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-files:${DOCKER_TAG}"
onlyoffice-files-services:
build:
context: ./
dockerfile: "${DOCKERFILE}"
target: files_services
image: "${REPO}/${STATUS}appserver-files-services:${DOCKER_TAG}"
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-files-services:${DOCKER_TAG}"
onlyoffice-notify:
build:
context: ./
dockerfile: "${DOCKERFILE}"
target: notify
image: "${REPO}/${STATUS}appserver-notify:${DOCKER_TAG}"
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-notify:${DOCKER_TAG}"
onlyoffice-people-server:
build:
context: ./
dockerfile: "${DOCKERFILE}"
target: people_server
image: "${REPO}/${STATUS}appserver-people-server:${DOCKER_TAG}"
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-people-server:${DOCKER_TAG}"
onlyoffice-socket:
build:
context: ./
dockerfile: "${DOCKERFILE}"
target: socket
image: "${REPO}/${STATUS}appserver-socket:${DOCKER_TAG}"
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-socket:${DOCKER_TAG}"
onlyoffice-studio-notify:
build:
context: ./
dockerfile: "${DOCKERFILE}"
target: studio_notify
image: "${REPO}/${STATUS}appserver-studio-notify:${DOCKER_TAG}"
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-studio-notify:${DOCKER_TAG}"
onlyoffice-telegram-service:
build:
context: ./
dockerfile: "${DOCKERFILE}"
target: telegram_service
image: "${REPO}/${STATUS}appserver-telegram-service:${DOCKER_TAG}"
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-telegram-service:${DOCKER_TAG}"
onlyoffice-urlshortener:
build:
context: ./
dockerfile: "${DOCKERFILE}"
target: urlshortener
image: "${REPO}/${STATUS}appserver-urlshortener:${DOCKER_TAG}"
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-urlshortener:${DOCKER_TAG}"
onlyoffice-api:
build:
context: ./
dockerfile: "${DOCKERFILE}"
target: api
image: "${REPO}/${STATUS}appserver-api:${DOCKER_TAG}"
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-api:${DOCKER_TAG}"
onlyoffice-studio:
build:
context: ./
dockerfile: "${DOCKERFILE}"
target: studio
image: "${REPO}/${STATUS}appserver-studio:${DOCKER_TAG}"
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-studio:${DOCKER_TAG}"
onlyoffice-ssoauth:
build:
context: ./
dockerfile: "${DOCKERFILE}"
target: ssoauth
image: "${REPO}/${STATUS}appserver-ssoauth:${DOCKER_TAG}"
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-ssoauth:${DOCKER_TAG}"
onlyoffice-webhooks-service:
build:
context: ./
dockerfile: "${DOCKERFILE}"
target: webhooks-service
image: "${REPO}/${STATUS}appserver-webhooks-service:${DOCKER_TAG}"
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-webhooks-service:${DOCKER_TAG}"
onlyoffice-bin-share:
build:
context: ./
dockerfile: "${DOCKERFILE}"
target: bin_share
image: "${REPO}/${STATUS}appserver-bin-share:${DOCKER_TAG}"
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-bin-share:${DOCKER_TAG}"
onlyoffice-wait-bin-share:
build:
context: ./
dockerfile: "${DOCKERFILE}"
target: wait_bin_share
image: "${REPO}/${STATUS}appserver-wait-bin-share:${DOCKER_TAG}"
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-wait-bin-share:${DOCKER_TAG}"
onlyoffice-doceditor:
build:
context: ./
dockerfile: "${DOCKERFILE}"
target: doceditor
image: "${REPO}/${STATUS}appserver-doceditor:${DOCKER_TAG}"
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-doceditor:${DOCKER_TAG}"
onlyoffice-login:
build:
context: ./
dockerfile: "${DOCKERFILE}"
target: login
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-login:${DOCKER_TAG}"
onlyoffice-proxy:
build:
context: ./
dockerfile: "${DOCKERFILE}"
target: web
image: "${REPO}/${STATUS}appserver-proxy:${DOCKER_TAG}"
target: proxy
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-proxy:${DOCKER_TAG}"
onlyoffice-migration-runner:
build:
context: ./
dockerfile: "${DOCKERFILE}"
target: onlyoffice-migration-runner
image: "${REPO}/${STATUS}appserver-migration-runner:${DOCKER_TAG}"
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-migration-runner:${DOCKER_TAG}"

View File

@ -1,5 +1,10 @@
resolver $DNS_NAMESERVER valid=30s;
map $SERVICE_LOGIN $service_login {
volatile;
$SERVICE_LOGIN $SERVICE_LOGIN;
}
map $SERVICE_DOCEDITOR $service_doceditor {
volatile;
$SERVICE_DOCEDITOR $SERVICE_DOCEDITOR;

View File

@ -1,6 +1,7 @@
#!/bin/bash
export DOCKER_TAG=$DOCKER_TAG
BUILD_NUMBER="$(date "+%Y%m%d%H")"
docker-compose -f build.yml build \
--build-arg GIT_BRANCH=$SOURCE_BRANCH \
--build-arg PRODUCT_VERSION=$PRODUCT_VERSION \

View File

@ -1,11 +1,10 @@
#!/bin/bash
export DOCKER_TAG=$DOCKER_TAG
BASE_NAME="appserver"
BUILD_NUMBER="$(date "+%Y%m%d%H")"
docker-compose -f build.yml push
# Get docker images name to array
arrayImagesName=($(docker image ls | grep "$DOCKER_TAG" | grep "$STATUS" | grep "$BASE_NAME" | awk '{print $1}' ))
arrayImagesName=($(docker image ls | grep "$DOCKER_TAG" | grep "$DOCKER_IMAGE_PREFIX" | awk '{print $1}' ))
# Modify docker image tag
for i in ${!arrayImagesName[@]}; do

View File

@ -2,7 +2,7 @@ version: "3.8"
services:
onlyoffice-migration-runner:
image: "${REPO}/${STATUS}appserver-migration-runner:${DOCKER_TAG}"
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-migration-runner:${DOCKER_TAG}"
container_name: ${MIGRATION_RUNNER_HOST}
restart: "no"
environment:

View File

@ -31,7 +31,7 @@ x-service:
services:
onlyoffice-notify:
<<: *x-service-base
image: "${REPO}/${STATUS}appserver-notify:${DOCKER_TAG}"
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-notify:${DOCKER_TAG}"
container_name: ${NOTIFY_HOST}
networks:

View File

@ -7,7 +7,7 @@ bash build/install/common/build-backend.sh --srcpath %{_builddir}/%{sourcename}
bash build/install/common/publish-backend.sh --srcpath %{_builddir}/%{sourcename}
rename -f -v "s/product([^\/]*)$/%{product}\$1/g" build/install/common/*.sh
sed -i "s@var/www@var/www/%{product}@g" config/nginx/*.conf && sed -i "s@var/www@var/www/%{product}@g" config/nginx/includes/*.conf
sed -i "s@var/www@var/www/%{product}@g" config/nginx/*.conf && sed -i "s@var/www@var/www/%{product}@g" config/nginx/includes/*.conf && rm config/nginx/onlyoffice-login.conf
json -I -f %{_builddir}/%{sourcename}/config/appsettings.services.json -e "this.logPath=\"/var/log/onlyoffice/%{product}\"" \
-e "this.urlshortener={ 'path': '../ASC.UrlShortener/index.js' }" -e "this.thumb={ 'path': '../ASC.Thumbnails/' }" -e "this.socket={ 'path': '../ASC.Socket.IO/' }" \

View File

@ -74,7 +74,6 @@
%{_sysconfdir}/nginx/conf.d/*
%{buildpath}/public/
%{buildpath}/client/
%{buildpath}/login/
%files studio-notify
%defattr(-, onlyoffice, onlyoffice, -)
@ -189,3 +188,10 @@
%{buildpath}/services/ASC.Migration.Runner/
/usr/lib/systemd/system/%{product}-migration-runner.service
%dir %{buildpath}/services/
%files login
%defattr(-, onlyoffice, onlyoffice, -)
%{buildpath}/products/ASC.Login/login
/usr/lib/systemd/system/%{product}-login.service
%dir %{buildpath}/products/
%dir %{buildpath}/products/ASC.Login/

View File

@ -29,13 +29,13 @@ mkdir -p "%{buildroot}%{buildpath}/studio/ASC.Web.Api/"
mkdir -p "%{buildroot}%{buildpath}/studio/ASC.Web.Studio/"
mkdir -p "%{buildroot}%{buildpath}/public/"
mkdir -p "%{buildroot}%{buildpath}/client/"
mkdir -p "%{buildroot}%{buildpath}/login/"
mkdir -p "%{buildroot}%{buildpath}/products/ASC.Login/login/"
mkdir -p "%{buildroot}/usr/lib/systemd/system/"
cp -rf %{_builddir}/%{sourcename}/ASC.Migration.Runner/service/* "%{buildroot}%{buildpath}/services/ASC.Migration.Runner/"
cp -rf %{_builddir}/%{sourcename}/build/deploy/editor/* "%{buildroot}%{buildpath}/products/ASC.Files/editor/"
cp -rf %{_builddir}/%{sourcename}/build/deploy/public/* "%{buildroot}%{buildpath}/public/"
cp -rf %{_builddir}/%{sourcename}/build/deploy/client/* "%{buildroot}%{buildpath}/client/"
cp -rf %{_builddir}/%{sourcename}/build/deploy/login/* "%{buildroot}%{buildpath}/login/"
cp -rf %{_builddir}/%{sourcename}/build/deploy/login/* "%{buildroot}%{buildpath}/products/ASC.Login/login/"
cp -rf %{_builddir}/%{sourcename}/build/install/RadicalePlugins/* "%{buildroot}%{buildpath}/Tools/radicale/plugins/"
cp -rf %{_builddir}/%{sourcename}/build/install/common/%{product}-configuration.sh "%{buildroot}%{_bindir}/"
cp -rf %{_builddir}/%{sourcename}/build/install/common/systemd/modules/* "%{buildroot}/usr/lib/systemd/system/"

View File

@ -163,3 +163,11 @@ Requires: %name-common = %version-%release
Requires: dotnet-sdk-6.0
AutoReqProv: no
%description migration-runner
%package login
Summary: login
Group: Applications/Internet
Requires: %name-common = %version-%release
Requires: nodejs >= 14.0
AutoReqProv: no
%description login

View File

@ -30,6 +30,7 @@ Requires: %name-clear-events = %version-%release
Requires: %name-doceditor = %version-%release
Requires: %name-files = %version-%release
Requires: %name-files-services = %version-%release
Requires: %name-login = %version-%release
Requires: %name-migration = %version-%release
Requires: %name-migration-runner = %version-%release
Requires: %name-notify = %version-%release

View File

@ -1,266 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<DOCUMENT Type="Advanced Installer" CreateVersion="18.6" version="18.7" Modules="enterprise" RootPath="." Language="en" Id="{2D2C7C0E-FA78-4158-A222-DA463E882AAC}">
<COMPONENT cid="caphyon.advinst.msicomp.MsiPropsComponent">
<ROW Property="AI_BITMAP_DISPLAY_MODE" Value="0"/>
<ROW Property="AI_CURRENT_YEAR" Value="2022" ValueLocId="-"/>
<ROW Property="AI_PREDEF_LCONDS_PROPS" Value="AI_DETECTED_INTERNET_CONNECTION"/>
<ROW Property="AI_PRODUCTNAME_ARP" Value="Apache Kafka"/>
<ROW Property="AI_UNINSTALLER" Value="msiexec.exe"/>
<ROW Property="ALLUSERS" Value="1"/>
<ROW Property="ARPNOMODIFY" MultiBuildValue="DefaultBuild:1"/>
<ROW Property="ARPNOREPAIR" Value="1"/>
<ROW Property="ARPSYSTEMCOMPONENT" Value="1"/>
<ROW Property="Manufacturer" Value="Apache"/>
<ROW Property="ProductCode" Value="1033:{79F55836-69B9-46CE-B03D-7679D38C0AD4} " Type="16"/>
<ROW Property="ProductLanguage" Value="1033"/>
<ROW Property="ProductName" Value="Apache Kafka"/>
<ROW Property="ProductVersion" Value="1.0.0"/>
<ROW Property="SecureCustomProperties" Value="OLDPRODUCTS;AI_NEWERPRODUCTFOUND"/>
<ROW Property="ServiceName_Apache_Kafka" Value="Apache Kafka"/>
<ROW Property="ServiceName_Apache_ZooKeeper" Value="Apache ZooKeeper"/>
<ROW Property="UpgradeCode" Value="{9202447D-B999-4041-B479-B3789A872456}"/>
<ROW Property="WindowsType9X" MultiBuildValue="DefaultBuild:Windows 9x/ME" ValueLocId="-"/>
<ROW Property="WindowsType9XDisplay" MultiBuildValue="DefaultBuild:Windows 9x/ME" ValueLocId="-"/>
<ROW Property="WindowsTypeNT40" MultiBuildValue="DefaultBuild:Windows NT 4.0" ValueLocId="-"/>
<ROW Property="WindowsTypeNT40Display" MultiBuildValue="DefaultBuild:Windows NT 4.0" ValueLocId="-"/>
<ROW Property="WindowsTypeNT50" MultiBuildValue="DefaultBuild:Windows 2000" ValueLocId="-"/>
<ROW Property="WindowsTypeNT50Display" MultiBuildValue="DefaultBuild:Windows 2000" ValueLocId="-"/>
<ROW Property="WindowsTypeNT5X" MultiBuildValue="DefaultBuild:Windows XP/2003" ValueLocId="-"/>
<ROW Property="WindowsTypeNT5XDisplay" MultiBuildValue="DefaultBuild:Windows XP/2003" ValueLocId="-"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.MsiDirsComponent">
<ROW Directory="APPDIR" Directory_Parent="TARGETDIR" DefaultDir="APPDIR:." IsPseudoRoot="1"/>
<ROW Directory="TARGETDIR" DefaultDir="SourceDir"/>
<ROW Directory="WindowsVolume" Directory_Parent="TARGETDIR" DefaultDir="WINDOW~1|WindowsVolume" IsPseudoRoot="1"/>
<ROW Directory="kafka_2.122.8.0_Dir" Directory_Parent="kafkazookeeper_Dir" DefaultDir="kafka"/>
<ROW Directory="kafkazookeeper_Dir" Directory_Parent="WindowsVolume" DefaultDir="Apache"/>
<ROW Directory="tools_Dir" Directory_Parent="kafka_2.122.8.0_Dir" DefaultDir="tools"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.MsiCompsComponent">
<ROW Component="AI_CustomARPName" ComponentId="{0A28214B-8B18-41A6-8221-28805AFC74D8}" Directory_="APPDIR" Attributes="4" KeyPath="DisplayName" Options="1"/>
<ROW Component="AI_DisableModify" ComponentId="{9AEFD4E1-809A-4BA7-8210-A26107288AD8}" Directory_="APPDIR" Attributes="4" KeyPath="NoModify" Options="1"/>
<ROW Component="APPDIR" ComponentId="{65AA756C-1422-4BF9-9839-FC3C55E40801}" Directory_="APPDIR" Attributes="0"/>
<ROW Component="Apache" ComponentId="{AD0BEF35-DD7E-47D2-8E16-10F0066B56D7}" Directory_="kafkazookeeper_Dir" Attributes="0"/>
<ROW Component="ProductInformation" ComponentId="{0A3116F5-AD20-4DBA-A42B-68B3CE9DB645}" Directory_="APPDIR" Attributes="4" KeyPath="Version"/>
<ROW Component="kafka.exe" ComponentId="{193EC233-51DE-4D1E-9528-A22252F0661E}" Directory_="tools_Dir" Attributes="0" KeyPath="kafka.exe"/>
<ROW Component="kafka.xml" ComponentId="{531D2348-5D97-434D-9AC6-2B73961605F4}" Directory_="tools_Dir" Attributes="0" KeyPath="kafka.xml" Type="0"/>
<ROW Component="zookeeper.exe" ComponentId="{2E8D451F-F3A5-46E8-B3A5-E4087EABB148}" Directory_="tools_Dir" Attributes="0" KeyPath="zookeeper.exe"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.MsiFeatsComponent">
<ROW Feature="MainFeature" Title="MainFeature" Description="Description" Display="1" Level="1" Directory_="APPDIR" Attributes="0"/>
<ATTRIBUTE name="CurrentFeature" value="MainFeature"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.MsiFilesComponent">
<ROW File="kafka.exe" Component_="kafka.exe" FileName="kafka.exe" Attributes="0" SourcePath="kafka-zookeeper\kafka\tools\kafka.exe" SelfReg="false" DigSign="true"/>
<ROW File="kafka.xml" Component_="kafka.xml" FileName="kafka.xml" Attributes="0" SourcePath="kafka-zookeeper\kafka\tools\kafka.xml" SelfReg="false"/>
<ROW File="zookeeper.exe" Component_="zookeeper.exe" FileName="ZOOKEE~1.EXE|zookeeper.exe" Attributes="0" SourcePath="kafka-zookeeper\kafka\tools\zookeeper.exe" SelfReg="false" DigSign="true"/>
<ROW File="zookeeper.xml" Component_="kafka.xml" FileName="ZOOKEE~1.XML|zookeeper.xml" Attributes="0" SourcePath="kafka-zookeeper\kafka\tools\zookeeper.xml" SelfReg="false"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.BootstrOptComponent">
<ROW BootstrOptKey="GlobalOptions" DownloadFolder="[AppDataFolder][|Manufacturer]\[|ProductName]\prerequisites" Options="2"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.BootstrapperUISequenceComponent">
<ROW Action="AI_DetectSoftware" Sequence="151"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.BuildComponent">
<ROW BuildKey="DefaultBuild" BuildName="DefaultBuild" BuildOrder="1" BuildType="0" PackageFolder="publish" PackageFileName="[|ProductName]" Languages="en" InstallationType="4" UseLargeSchema="true" Unicode="true" UACExecutionLevel="2"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.DictionaryComponent">
<ROW Path="&lt;AI_DICTS&gt;ui.ail"/>
<ROW Path="&lt;AI_DICTS&gt;ui_en.ail"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.FragmentComponent">
<ROW Fragment="CommonUI.aip" Path="&lt;AI_FRAGS&gt;CommonUI.aip"/>
<ROW Fragment="FolderDlg.aip" Path="&lt;AI_THEMES&gt;classic\fragments\FolderDlg.aip"/>
<ROW Fragment="MaintenanceTypeDlg.aip" Path="&lt;AI_THEMES&gt;classic\fragments\MaintenanceTypeDlg.aip"/>
<ROW Fragment="MaintenanceWelcomeDlg.aip" Path="&lt;AI_THEMES&gt;classic\fragments\MaintenanceWelcomeDlg.aip"/>
<ROW Fragment="SequenceDialogs.aip" Path="&lt;AI_THEMES&gt;classic\fragments\SequenceDialogs.aip"/>
<ROW Fragment="Sequences.aip" Path="&lt;AI_FRAGS&gt;Sequences.aip"/>
<ROW Fragment="StaticUIStrings.aip" Path="&lt;AI_FRAGS&gt;StaticUIStrings.aip"/>
<ROW Fragment="UI.aip" Path="&lt;AI_THEMES&gt;classic\fragments\UI.aip"/>
<ROW Fragment="Validation.aip" Path="&lt;AI_FRAGS&gt;Validation.aip"/>
<ROW Fragment="VerifyRemoveDlg.aip" Path="&lt;AI_THEMES&gt;classic\fragments\VerifyRemoveDlg.aip"/>
<ROW Fragment="VerifyRepairDlg.aip" Path="&lt;AI_THEMES&gt;classic\fragments\VerifyRepairDlg.aip"/>
<ROW Fragment="WelcomeDlg.aip" Path="&lt;AI_THEMES&gt;classic\fragments\WelcomeDlg.aip"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.MsiActionTextComponent">
<ROW Action="AI_ConfigFailActions" Description="Configure service failure actions" DescriptionLocId="ActionText.Description.AI_ConfigFailActions" Template="Service: [1]" TemplateLocId="ActionText.Template.AI_ConfigFailActions"/>
<ROW Action="AI_ProcessFailActions" Description="Generating actions to configure service failure actions" DescriptionLocId="ActionText.Description.AI_ProcessFailActions" Template="Service: [1]" TemplateLocId="ActionText.Template.AI_ProcessFailActions"/>
<ROW Action="AI_TxtUpdaterCommit" Description="Commit text file changes." DescriptionLocId="ActionText.Description.AI_TxtUpdaterCommit" Template="Commit text file changes." TemplateLocId="ActionText.Template.AI_TxtUpdaterCommit"/>
<ROW Action="AI_TxtUpdaterConfig" Description="Executing text file updates" DescriptionLocId="ActionText.Description.AI_TxtUpdaterConfig" Template="Updating text file: &quot;[1]&quot;" TemplateLocId="ActionText.Template.AI_TxtUpdaterConfig"/>
<ROW Action="AI_TxtUpdaterInstall" Description="Generating actions to configure text files updates" DescriptionLocId="ActionText.Description.AI_TxtUpdaterInstall"/>
<ROW Action="AI_TxtUpdaterRollback" Description="Rolling back text file changes." DescriptionLocId="ActionText.Description.AI_TxtUpdaterRollback" Template="Rolling back text file changes." TemplateLocId="ActionText.Template.AI_TxtUpdaterRollback"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.MsiBinaryComponent">
<ROW Name="PowerShellScriptLauncher.dll" SourcePath="&lt;AI_CUSTACTS&gt;PowerShellScriptLauncher.dll"/>
<ROW Name="SoftwareDetector.dll" SourcePath="&lt;AI_CUSTACTS&gt;SoftwareDetector.dll"/>
<ROW Name="TxtUpdater.dll" SourcePath="&lt;AI_CUSTACTS&gt;TxtUpdater.dll"/>
<ROW Name="aicustact.dll" SourcePath="&lt;AI_CUSTACTS&gt;aicustact.dll"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.MsiControlEventComponent">
<ROW Dialog_="WelcomeDlg" Control_="Next" Event="NewDialog" Argument="FolderDlg" Condition="AI_INSTALL" Ordering="1"/>
<ROW Dialog_="FolderDlg" Control_="Next" Event="NewDialog" Argument="VerifyReadyDlg" Condition="AI_INSTALL" Ordering="201"/>
<ROW Dialog_="FolderDlg" Control_="Back" Event="NewDialog" Argument="WelcomeDlg" Condition="AI_INSTALL" Ordering="1"/>
<ROW Dialog_="VerifyReadyDlg" Control_="Install" Event="EndDialog" Argument="Return" Condition="AI_INSTALL" Ordering="197"/>
<ROW Dialog_="VerifyReadyDlg" Control_="Back" Event="NewDialog" Argument="FolderDlg" Condition="AI_INSTALL" Ordering="201"/>
<ROW Dialog_="MaintenanceWelcomeDlg" Control_="Next" Event="NewDialog" Argument="MaintenanceTypeDlg" Condition="AI_MAINT" Ordering="99"/>
<ROW Dialog_="CustomizeDlg" Control_="Next" Event="NewDialog" Argument="VerifyReadyDlg" Condition="AI_MAINT" Ordering="101"/>
<ROW Dialog_="CustomizeDlg" Control_="Back" Event="NewDialog" Argument="MaintenanceTypeDlg" Condition="AI_MAINT" Ordering="1"/>
<ROW Dialog_="VerifyReadyDlg" Control_="Install" Event="EndDialog" Argument="Return" Condition="AI_MAINT" Ordering="198"/>
<ROW Dialog_="VerifyReadyDlg" Control_="Back" Event="NewDialog" Argument="CustomizeDlg" Condition="AI_MAINT" Ordering="202"/>
<ROW Dialog_="MaintenanceTypeDlg" Control_="ChangeButton" Event="NewDialog" Argument="CustomizeDlg" Condition="AI_MAINT" Ordering="501"/>
<ROW Dialog_="MaintenanceTypeDlg" Control_="Back" Event="NewDialog" Argument="MaintenanceWelcomeDlg" Condition="AI_MAINT" Ordering="1"/>
<ROW Dialog_="MaintenanceTypeDlg" Control_="RemoveButton" Event="NewDialog" Argument="VerifyRemoveDlg" Condition="AI_MAINT AND InstallMode=&quot;Remove&quot;" Ordering="601"/>
<ROW Dialog_="VerifyRemoveDlg" Control_="Back" Event="NewDialog" Argument="MaintenanceTypeDlg" Condition="AI_MAINT AND InstallMode=&quot;Remove&quot;" Ordering="1"/>
<ROW Dialog_="MaintenanceTypeDlg" Control_="RepairButton" Event="NewDialog" Argument="VerifyRepairDlg" Condition="AI_MAINT AND InstallMode=&quot;Repair&quot;" Ordering="601"/>
<ROW Dialog_="VerifyRepairDlg" Control_="Back" Event="NewDialog" Argument="MaintenanceTypeDlg" Condition="AI_MAINT AND InstallMode=&quot;Repair&quot;" Ordering="1"/>
<ROW Dialog_="VerifyRepairDlg" Control_="Repair" Event="EndDialog" Argument="Return" Condition="AI_MAINT AND InstallMode=&quot;Repair&quot;" Ordering="399" Options="1"/>
<ROW Dialog_="VerifyRemoveDlg" Control_="Remove" Event="EndDialog" Argument="Return" Condition="AI_MAINT AND InstallMode=&quot;Remove&quot;" Ordering="299" Options="1"/>
<ROW Dialog_="PatchWelcomeDlg" Control_="Next" Event="NewDialog" Argument="VerifyReadyDlg" Condition="AI_PATCH" Ordering="201"/>
<ROW Dialog_="ResumeDlg" Control_="Install" Event="EndDialog" Argument="Return" Condition="AI_RESUME" Ordering="299"/>
<ROW Dialog_="VerifyReadyDlg" Control_="Install" Event="EndDialog" Argument="Return" Condition="AI_PATCH" Ordering="199"/>
<ROW Dialog_="VerifyReadyDlg" Control_="Back" Event="NewDialog" Argument="PatchWelcomeDlg" Condition="AI_PATCH" Ordering="203"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.MsiCreateFolderComponent">
<ROW Directory_="APPDIR" Component_="APPDIR" ManualDelete="true"/>
<ROW Directory_="kafkazookeeper_Dir" Component_="Apache" ManualDelete="false"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.MsiCustActComponent">
<ROW Action="AI_BACKUP_AI_SETUPEXEPATH" Type="51" Source="AI_SETUPEXEPATH_ORIGINAL" Target="[AI_SETUPEXEPATH]"/>
<ROW Action="AI_ConfigFailActions" Type="11265" Source="aicustact.dll" Target="ConfigureServFailActions" WithoutSeq="true"/>
<ROW Action="AI_DATA_SETTER" Type="51" Source="CustomActionData" Target="AEQAaQBnAGkAdABhAGwAbAB5AFMAaQBnAG4AUwBjAHIAaQBwAHQAAgABAEYAbABhAGcAcwACADYAAQBQAGEAcgBhAG0AcwACAAEAUwBjAHIAaQBwAHQAAgAjAFIAZQBxAHUAaQByAGUAcwAgAC0AdgBlAHIAcwBpAG8AbgAgADMADQAKAFAAYQByAGEAbQAoACkADQAKAA0ACgAkAEEAUABQAEQASQBSACAAPQAgAEEASQBfAEcAZQB0AE0AcwBpAFAAcgBvAHAAZQByAHQAeQAgAEEAUABQAEQASQBSAA0ACgAkAE0AQQBJAE4ARABJAFIAIAA9ACAAJABBAFAAUABEAEkAUgAuAFQAbwBTAHQAcgBpAG4AZwAoACkAIAArACAAIgAuAC4AIgANAAoAUgBlAG0AbwB2AGUALQBJAHQAZQBtACAAJABNAEEASQBOAEQASQBSACAALQBSAGUAYwB1AHIAcwBl"/>
<ROW Action="AI_DATA_SETTER_1" Type="51" Source="CustomActionData" Target="[~]"/>
<ROW Action="AI_DOWNGRADE" Type="19" Target="4010"/>
<ROW Action="AI_DetectSoftware" Type="257" Source="SoftwareDetector.dll" Target="OnDetectSoftware"/>
<ROW Action="AI_DpiContentScale" Type="1" Source="aicustact.dll" Target="DpiContentScale"/>
<ROW Action="AI_EnableDebugLog" Type="321" Source="aicustact.dll" Target="EnableDebugLog"/>
<ROW Action="AI_GetArpIconPath" Type="1" Source="aicustact.dll" Target="GetArpIconPath"/>
<ROW Action="AI_InstallModeCheck" Type="1" Source="aicustact.dll" Target="UpdateInstallMode" WithoutSeq="true"/>
<ROW Action="AI_PREPARE_UPGRADE" Type="65" Source="aicustact.dll" Target="PrepareUpgrade"/>
<ROW Action="AI_ProcessFailActions" Type="1" Source="aicustact.dll" Target="ProcessFailActions" AdditionalSeq="AI_DATA_SETTER_1"/>
<ROW Action="AI_RESTORE_AI_SETUPEXEPATH" Type="51" Source="AI_SETUPEXEPATH" Target="[AI_SETUPEXEPATH_ORIGINAL]"/>
<ROW Action="AI_RESTORE_LOCATION" Type="65" Source="aicustact.dll" Target="RestoreLocation"/>
<ROW Action="AI_ResolveKnownFolders" Type="1" Source="aicustact.dll" Target="AI_ResolveKnownFolders"/>
<ROW Action="AI_RestartElevated" Type="1" Source="aicustact.dll" Target="RestartElevated"/>
<ROW Action="AI_SHOW_LOG" Type="65" Source="aicustact.dll" Target="LaunchLogFile" WithoutSeq="true"/>
<ROW Action="AI_STORE_LOCATION" Type="51" Source="ARPINSTALLLOCATION" Target="[APPDIR]"/>
<ROW Action="AI_TxtUpdaterCommit" Type="11777" Source="TxtUpdater.dll" Target="OnTxtUpdaterCommit" WithoutSeq="true"/>
<ROW Action="AI_TxtUpdaterConfig" Type="11265" Source="TxtUpdater.dll" Target="OnTxtUpdaterConfig" WithoutSeq="true"/>
<ROW Action="AI_TxtUpdaterInstall" Type="1" Source="TxtUpdater.dll" Target="OnTxtUpdaterInstall"/>
<ROW Action="AI_TxtUpdaterRollback" Type="11521" Source="TxtUpdater.dll" Target="OnTxtUpdaterRollback" WithoutSeq="true"/>
<ROW Action="RemoveManufactorDir" Type="65" Source="PowerShellScriptLauncher.dll" Target="RunPowerShellScript" Options="1" AdditionalSeq="AI_DATA_SETTER"/>
<ROW Action="SET_APPDIR" Type="307" Source="APPDIR" Target="[ProgramFilesFolder][Manufacturer]\[ProductName]"/>
<ROW Action="SET_SHORTCUTDIR" Type="307" Source="SHORTCUTDIR" Target="[ProgramMenuFolder][ProductName]"/>
<ROW Action="SET_TARGETDIR_TO_APPDIR" Type="51" Source="TARGETDIR" Target="[APPDIR]"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.MsiEnvComponent">
<ROW Environment="JAVA_HOME" Name="=-*JAVA_HOME" Value="[PATH_TO_JAVA]" Component_="Apache"/>
<ROW Environment="Path" Name="=*Path" Value="[~];%JAVA_HOME%\bin" Component_="Apache"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.MsiFeatCompsComponent">
<ROW Feature_="MainFeature" Component_="APPDIR"/>
<ROW Feature_="MainFeature" Component_="ProductInformation"/>
<ROW Feature_="MainFeature" Component_="Apache"/>
<ROW Feature_="MainFeature" Component_="kafka.exe"/>
<ROW Feature_="MainFeature" Component_="kafka.xml"/>
<ROW Feature_="MainFeature" Component_="zookeeper.exe"/>
<ROW Feature_="MainFeature" Component_="AI_CustomARPName"/>
<ROW Feature_="MainFeature" Component_="AI_DisableModify"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.MsiInstExSeqComponent">
<ROW Action="AI_DOWNGRADE" Condition="AI_NEWERPRODUCTFOUND AND (UILevel &lt;&gt; 5)" Sequence="210"/>
<ROW Action="AI_RESTORE_LOCATION" Condition="APPDIR=&quot;&quot;" Sequence="749"/>
<ROW Action="AI_STORE_LOCATION" Condition="(Not Installed) OR REINSTALL" Sequence="1501"/>
<ROW Action="AI_PREPARE_UPGRADE" Condition="AI_UPGRADE=&quot;No&quot; AND (Not Installed)" Sequence="1397"/>
<ROW Action="AI_ResolveKnownFolders" Sequence="52"/>
<ROW Action="AI_EnableDebugLog" Sequence="51"/>
<ROW Action="RemoveManufactorDir" Condition="( NOT Installed )" Sequence="6602"/>
<ROW Action="AI_DATA_SETTER" Condition="( NOT Installed )" Sequence="6601"/>
<ROW Action="AI_ProcessFailActions" Sequence="5848"/>
<ROW Action="AI_DATA_SETTER_1" Sequence="5847"/>
<ROW Action="AI_TxtUpdaterInstall" Sequence="5101"/>
<ROW Action="AI_DetectSoftware" Sequence="101"/>
<ROW Action="AI_GetArpIconPath" Sequence="1401"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.MsiInstallUISequenceComponent">
<ROW Action="AI_RESTORE_LOCATION" Condition="APPDIR=&quot;&quot;" Sequence="749"/>
<ROW Action="AI_ResolveKnownFolders" Sequence="54"/>
<ROW Action="AI_DpiContentScale" Sequence="53"/>
<ROW Action="AI_EnableDebugLog" Sequence="52"/>
<ROW Action="AI_BACKUP_AI_SETUPEXEPATH" Sequence="99"/>
<ROW Action="AI_RESTORE_AI_SETUPEXEPATH" Condition="AI_SETUPEXEPATH_ORIGINAL" Sequence="102"/>
<ROW Action="AI_DetectSoftware" Sequence="101"/>
<ROW Action="AI_RestartElevated" Sequence="51" Builds="DefaultBuild"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.MsiLaunchConditionsComponent">
<ROW Condition="((VersionNT &lt;&gt; 501) AND (VersionNT &lt;&gt; 502))" Description="[ProductName] cannot be installed on [WindowsTypeNT5XDisplay]." DescriptionLocId="AI.LaunchCondition.NoNT5X" IsPredefined="true" Builds="DefaultBuild"/>
<ROW Condition="(VersionNT &lt;&gt; 400)" Description="[ProductName] cannot be installed on [WindowsTypeNT40Display]." DescriptionLocId="AI.LaunchCondition.NoNT40" IsPredefined="true" Builds="DefaultBuild"/>
<ROW Condition="(VersionNT &lt;&gt; 500)" Description="[ProductName] cannot be installed on [WindowsTypeNT50Display]." DescriptionLocId="AI.LaunchCondition.NoNT50" IsPredefined="true" Builds="DefaultBuild"/>
<ROW Condition="AI_DETECTED_INTERNET_CONNECTION" Description="[ProductName] requires an active Internet connection for installation. Please check your network configuration and proxy settings." DescriptionLocId="AI.LaunchCondition.Internet" IsPredefined="true" Builds="DefaultBuild"/>
<ROW Condition="VersionNT" Description="[ProductName] cannot be installed on [WindowsType9XDisplay]." DescriptionLocId="AI.LaunchCondition.No9X" IsPredefined="true" Builds="DefaultBuild"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.MsiRegsComponent">
<ROW Registry="Comments" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[ProductName] [ProductVersion]" Name="Comments" Value="[ARPCOMMENTS]" Component_="AI_CustomARPName"/>
<ROW Registry="Contact" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[ProductName] [ProductVersion]" Name="Contact" Value="[ARPCONTACT]" Component_="AI_CustomARPName"/>
<ROW Registry="CurrentVersion" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion" Name="\"/>
<ROW Registry="DisplayIcon" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[ProductName] [ProductVersion]" Name="DisplayIcon" Value="[ARP_ICON_PATH]" Component_="AI_CustomARPName"/>
<ROW Registry="DisplayName" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[ProductName] [ProductVersion]" Name="DisplayName" Value="[AI_PRODUCTNAME_ARP]" Component_="AI_CustomARPName"/>
<ROW Registry="DisplayVersion" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[ProductName] [ProductVersion]" Name="DisplayVersion" Value="[ProductVersion]" Component_="AI_CustomARPName"/>
<ROW Registry="EstimatedSize" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[ProductName] [ProductVersion]" Name="EstimatedSize" Value="#[AI_ARP_SIZE]" Component_="AI_CustomARPName" VirtualValue="#"/>
<ROW Registry="HelpLink" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[ProductName] [ProductVersion]" Name="HelpLink" Value="[ARPHELPLINK]" Component_="AI_CustomARPName"/>
<ROW Registry="HelpTelephone" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[ProductName] [ProductVersion]" Name="HelpTelephone" Value="[ARPHELPTELEPHONE]" Component_="AI_CustomARPName"/>
<ROW Registry="InstallLocation" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[ProductName] [ProductVersion]" Name="InstallLocation" Value="[APPDIR]" Component_="AI_CustomARPName"/>
<ROW Registry="Manufacturer" Root="-1" Key="Software\[Manufacturer]" Name="\"/>
<ROW Registry="Microsoft" Root="-1" Key="Software\Microsoft" Name="\"/>
<ROW Registry="ModifyPath" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[ProductName] [ProductVersion]" Name="ModifyPath" Value="[AI_UNINSTALLER] /i [ProductCode] AI_UNINSTALLER_CTP=1" Component_="AI_CustomARPName"/>
<ROW Registry="NoModify" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[ProductName] [ProductVersion]" Name="NoModify" Value="#1" Component_="AI_DisableModify" VirtualValue="#"/>
<ROW Registry="NoRepair" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[ProductName] [ProductVersion]" Name="NoRepair" Value="#1" Component_="AI_CustomARPName" VirtualValue="#"/>
<ROW Registry="Path" Root="-1" Key="Software\[Manufacturer]\[ProductName]" Name="Path" Value="[APPDIR]" Component_="ProductInformation"/>
<ROW Registry="ProductName" Root="-1" Key="Software\[Manufacturer]\[ProductName]" Name="\"/>
<ROW Registry="ProductNameProductVersion" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[ProductName] [ProductVersion]" Name="\"/>
<ROW Registry="Publisher" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[ProductName] [ProductVersion]" Name="Publisher" Value="[Manufacturer]" Component_="AI_CustomARPName"/>
<ROW Registry="Readme" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[ProductName] [ProductVersion]" Name="Readme" Value="[ARPREADME]" Component_="AI_CustomARPName"/>
<ROW Registry="Software" Root="-1" Key="Software" Name="\"/>
<ROW Registry="URLInfoAbout" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[ProductName] [ProductVersion]" Name="URLInfoAbout" Value="[ARPURLINFOABOUT]" Component_="AI_CustomARPName"/>
<ROW Registry="URLUpdateInfo" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[ProductName] [ProductVersion]" Name="URLUpdateInfo" Value="[ARPURLUPDATEINFO]" Component_="AI_CustomARPName"/>
<ROW Registry="Uninstall" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall" Name="\"/>
<ROW Registry="UninstallPath" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[ProductName] [ProductVersion]" Name="UninstallPath" Value="[AI_UNINSTALLER] /x [ProductCode] AI_UNINSTALLER_CTP=1" Component_="AI_CustomARPName"/>
<ROW Registry="UninstallString" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[ProductName] [ProductVersion]" Name="UninstallString" Value="[AI_UNINSTALLER] /x [ProductCode] AI_UNINSTALLER_CTP=1" Component_="AI_CustomARPName"/>
<ROW Registry="Version" Root="-1" Key="Software\[Manufacturer]\[ProductName]" Name="Version" Value="[ProductVersion]" Component_="ProductInformation"/>
<ROW Registry="VersionMajor" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[ProductName] [ProductVersion]" Name="VersionMajor" Value="#1" Component_="AI_CustomARPName" VirtualValue="#"/>
<ROW Registry="VersionMinor" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[ProductName] [ProductVersion]" Name="VersionMinor" Value="#0" Component_="AI_CustomARPName" VirtualValue="#"/>
<ROW Registry="Windows" Root="-1" Key="Software\Microsoft\Windows" Name="\"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.MsiServConfigComponent">
<ROW MsiServiceConfig="Apache_Kafka" Name="[ServiceName_Apache_Kafka]" Event="1" ConfigType="3" Argument="1" Component_="kafka.exe"/>
<ROW MsiServiceConfig="Apache_ZooKeeper" Name="[ServiceName_Apache_ZooKeeper]" Event="1" ConfigType="3" Argument="1" Component_="zookeeper.exe"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.MsiServConfigFailureActionsComponent">
<ROW MsiServiceConfigFailureActions="Apache_Kafka" Name="[ServiceName_Apache_Kafka]" Event="1" ResetPeriod="0" Actions="1[~]1[~]1" DelayActions="1[~]1[~]1" Component_="kafka.exe"/>
<ROW MsiServiceConfigFailureActions="Apache_ZooKeeper" Name="[ServiceName_Apache_ZooKeeper]" Event="1" ResetPeriod="0" Actions="1[~]1[~]1" DelayActions="1[~]1[~]1" Component_="zookeeper.exe"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.MsiServCtrlComponent">
<ROW ServiceControl="Apache_Kafka" Name="[ServiceName_Apache_Kafka]" Event="161" Wait="1" Component_="kafka.exe"/>
<ROW ServiceControl="Apache_ZooKeeper" Name="[ServiceName_Apache_ZooKeeper]" Event="161" Wait="1" Component_="zookeeper.exe"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.MsiServInstComponent">
<ROW ServiceInstall="Apache_Kafka" Name="[ServiceName_Apache_Kafka]" DisplayName="[ServiceName_Apache_Kafka]" ServiceType="16" StartType="2" ErrorControl="1" Component_="kafka.exe"/>
<ROW ServiceInstall="Apache_ZooKeeper" Name="[ServiceName_Apache_ZooKeeper]" DisplayName="[ServiceName_Apache_ZooKeeper]" ServiceType="16" StartType="2" ErrorControl="1" Component_="zookeeper.exe"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.MsiThemeComponent">
<ATTRIBUTE name="UsedTheme" value="classic"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.MsiUpgradeComponent">
<ROW UpgradeCode="[|UpgradeCode]" VersionMin="0.0.1" VersionMax="[|ProductVersion]" Attributes="257" ActionProperty="OLDPRODUCTS"/>
<ROW UpgradeCode="[|UpgradeCode]" VersionMin="[|ProductVersion]" Attributes="2" ActionProperty="AI_NEWERPRODUCTFOUND"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.SynchronizedFolderComponent">
<ROW Directory_="kafka_2.122.8.0_Dir" SourcePath="kafka-zookeeper\kafka" Feature="MainFeature" ExcludePattern="*~|#*#|%*%|._|CVS|.cvsignore|SCCS|vssver.scc|mssccprj.scc|vssver2.scc|.svn|.DS_Store" ExcludeFlags="6" FileAddOptions="4"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.TxtUpdateComponent">
<ROW Name="ReplaceWinVol" TxtUpdateSet="xml" FindPattern="{WindowsVolume}" ReplacePattern="[WindowsVolume]" Options="2" Order="0" FileEncoding="-1"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.TxtUpdateSetComponent">
<ROW Key="xml" Component="zookeeper.exe" FileName="*.xml" Directory="tools_Dir" Options="17"/>
</COMPONENT>
</DOCUMENT>

View File

@ -1,197 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<DOCUMENT Type="Advanced Installer" CreateVersion="18.6.1" version="18.7" Modules="enterprise" RootPath="." Language="en" Id="{93F1E21E-F074-444A-9756-659088E0DA02}">
<COMPONENT cid="caphyon.advinst.msicomp.MsiPropsComponent">
<ROW Property="AI_BITMAP_DISPLAY_MODE" Value="0"/>
<ROW Property="AI_CURRENT_YEAR" Value="2022" ValueLocId="-"/>
<ROW Property="AI_PRODUCTNAME_ARP" Value="Apache ZooKeeper"/>
<ROW Property="AI_UNINSTALLER" Value="msiexec.exe"/>
<ROW Property="ALLUSERS" Value="1"/>
<ROW Property="ARPNOMODIFY" MultiBuildValue="DefaultBuild:1"/>
<ROW Property="ARPNOREPAIR" Value="1"/>
<ROW Property="ARPSYSTEMCOMPONENT" Value="1"/>
<ROW Property="Manufacturer" Value="Apache"/>
<ROW Property="ProductCode" Value="1033:{DA471CF9-78DC-4D13-AB18-87B4604538FA} " Type="16"/>
<ROW Property="ProductLanguage" Value="1033"/>
<ROW Property="ProductName" Value="Apache ZooKeeper"/>
<ROW Property="ProductVersion" Value="1.0.0" Type="32"/>
<ROW Property="SecureCustomProperties" Value="OLDPRODUCTS;AI_NEWERPRODUCTFOUND"/>
<ROW Property="UpgradeCode" Value="{5CB34BEC-536C-45BA-8C86-77E055EF4325}"/>
<ROW Property="WindowsType9X" MultiBuildValue="DefaultBuild:Windows 9x/ME" ValueLocId="-"/>
<ROW Property="WindowsType9XDisplay" MultiBuildValue="DefaultBuild:Windows 9x/ME" ValueLocId="-"/>
<ROW Property="WindowsTypeNT40" MultiBuildValue="DefaultBuild:Windows NT 4.0" ValueLocId="-"/>
<ROW Property="WindowsTypeNT40Display" MultiBuildValue="DefaultBuild:Windows NT 4.0" ValueLocId="-"/>
<ROW Property="WindowsTypeNT50" MultiBuildValue="DefaultBuild:Windows 2000" ValueLocId="-"/>
<ROW Property="WindowsTypeNT50Display" MultiBuildValue="DefaultBuild:Windows 2000" ValueLocId="-"/>
<ROW Property="WindowsTypeNT5X" MultiBuildValue="DefaultBuild:Windows XP/2003" ValueLocId="-"/>
<ROW Property="WindowsTypeNT5XDisplay" MultiBuildValue="DefaultBuild:Windows XP/2003" ValueLocId="-"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.MsiDirsComponent">
<ROW Directory="APPDIR" Directory_Parent="TARGETDIR" DefaultDir="APPDIR:." IsPseudoRoot="1"/>
<ROW Directory="TARGETDIR" DefaultDir="SourceDir"/>
<ROW Directory="WindowsVolume" Directory_Parent="TARGETDIR" DefaultDir="WINDOW~1|WindowsVolume" IsPseudoRoot="1"/>
<ROW Directory="apachezookeeper3.7.0bin_Dir" Directory_Parent="kafkazookeeper_Dir" DefaultDir="ZOOKEE~1|zookeeper"/>
<ROW Directory="kafkazookeeper_Dir" Directory_Parent="WindowsVolume" DefaultDir="Apache"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.MsiCompsComponent">
<ROW Component="AI_CustomARPName" ComponentId="{DA50695D-FCFD-46A6-90BD-50D219311605}" Directory_="APPDIR" Attributes="4" KeyPath="DisplayName" Options="1"/>
<ROW Component="AI_DisableModify" ComponentId="{01A44BB2-4D9C-4BE1-A645-EDB8A011DC61}" Directory_="APPDIR" Attributes="4" KeyPath="NoModify" Options="1"/>
<ROW Component="APPDIR" ComponentId="{7C252C97-43D5-4EE8-884E-1BF7D1A2D490}" Directory_="APPDIR" Attributes="0"/>
<ROW Component="ProductInformation" ComponentId="{0903BE7F-28BE-4981-B82B-2D9A86C43A63}" Directory_="APPDIR" Attributes="4" KeyPath="Version"/>
<ROW Component="zookeeper" ComponentId="{F2EFFE90-2C47-4BAF-9541-143E8ADF5B4B}" Directory_="apachezookeeper3.7.0bin_Dir" Attributes="0"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.MsiFeatsComponent">
<ROW Feature="MainFeature" Title="MainFeature" Description="Description" Display="1" Level="1" Directory_="APPDIR" Attributes="0"/>
<ATTRIBUTE name="CurrentFeature" value="MainFeature"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.BootstrOptComponent">
<ROW BootstrOptKey="GlobalOptions" DownloadFolder="[AppDataFolder][|Manufacturer]\[|ProductName]\prerequisites" Options="2"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.BuildComponent">
<ROW BuildKey="DefaultBuild" BuildName="DefaultBuild" BuildOrder="1" BuildType="0" PackageFolder="publish" PackageFileName="[|ProductName]" Languages="en" InstallationType="4" UseLargeSchema="true" Unicode="true" UACExecutionLevel="2"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.DictionaryComponent">
<ROW Path="&lt;AI_DICTS&gt;ui.ail"/>
<ROW Path="&lt;AI_DICTS&gt;ui_en.ail"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.FragmentComponent">
<ROW Fragment="CommonUI.aip" Path="&lt;AI_FRAGS&gt;CommonUI.aip"/>
<ROW Fragment="FolderDlg.aip" Path="&lt;AI_THEMES&gt;classic\fragments\FolderDlg.aip"/>
<ROW Fragment="MaintenanceTypeDlg.aip" Path="&lt;AI_THEMES&gt;classic\fragments\MaintenanceTypeDlg.aip"/>
<ROW Fragment="MaintenanceWelcomeDlg.aip" Path="&lt;AI_THEMES&gt;classic\fragments\MaintenanceWelcomeDlg.aip"/>
<ROW Fragment="SequenceDialogs.aip" Path="&lt;AI_THEMES&gt;classic\fragments\SequenceDialogs.aip"/>
<ROW Fragment="Sequences.aip" Path="&lt;AI_FRAGS&gt;Sequences.aip"/>
<ROW Fragment="StaticUIStrings.aip" Path="&lt;AI_FRAGS&gt;StaticUIStrings.aip"/>
<ROW Fragment="UI.aip" Path="&lt;AI_THEMES&gt;classic\fragments\UI.aip"/>
<ROW Fragment="Validation.aip" Path="&lt;AI_FRAGS&gt;Validation.aip"/>
<ROW Fragment="VerifyRemoveDlg.aip" Path="&lt;AI_THEMES&gt;classic\fragments\VerifyRemoveDlg.aip"/>
<ROW Fragment="VerifyRepairDlg.aip" Path="&lt;AI_THEMES&gt;classic\fragments\VerifyRepairDlg.aip"/>
<ROW Fragment="WelcomeDlg.aip" Path="&lt;AI_THEMES&gt;classic\fragments\WelcomeDlg.aip"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.MsiBinaryComponent">
<ROW Name="PowerShellScriptLauncher.dll" SourcePath="&lt;AI_CUSTACTS&gt;PowerShellScriptLauncher.dll"/>
<ROW Name="aicustact.dll" SourcePath="&lt;AI_CUSTACTS&gt;aicustact.dll"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.MsiControlEventComponent">
<ROW Dialog_="WelcomeDlg" Control_="Next" Event="NewDialog" Argument="FolderDlg" Condition="AI_INSTALL" Ordering="1"/>
<ROW Dialog_="FolderDlg" Control_="Next" Event="NewDialog" Argument="VerifyReadyDlg" Condition="AI_INSTALL" Ordering="201"/>
<ROW Dialog_="FolderDlg" Control_="Back" Event="NewDialog" Argument="WelcomeDlg" Condition="AI_INSTALL" Ordering="1"/>
<ROW Dialog_="VerifyReadyDlg" Control_="Install" Event="EndDialog" Argument="Return" Condition="AI_INSTALL" Ordering="197"/>
<ROW Dialog_="VerifyReadyDlg" Control_="Back" Event="NewDialog" Argument="FolderDlg" Condition="AI_INSTALL" Ordering="201"/>
<ROW Dialog_="MaintenanceWelcomeDlg" Control_="Next" Event="NewDialog" Argument="MaintenanceTypeDlg" Condition="AI_MAINT" Ordering="99"/>
<ROW Dialog_="CustomizeDlg" Control_="Next" Event="NewDialog" Argument="VerifyReadyDlg" Condition="AI_MAINT" Ordering="101"/>
<ROW Dialog_="CustomizeDlg" Control_="Back" Event="NewDialog" Argument="MaintenanceTypeDlg" Condition="AI_MAINT" Ordering="1"/>
<ROW Dialog_="VerifyReadyDlg" Control_="Install" Event="EndDialog" Argument="Return" Condition="AI_MAINT" Ordering="198"/>
<ROW Dialog_="VerifyReadyDlg" Control_="Back" Event="NewDialog" Argument="CustomizeDlg" Condition="AI_MAINT" Ordering="202"/>
<ROW Dialog_="MaintenanceTypeDlg" Control_="ChangeButton" Event="NewDialog" Argument="CustomizeDlg" Condition="AI_MAINT" Ordering="501"/>
<ROW Dialog_="MaintenanceTypeDlg" Control_="Back" Event="NewDialog" Argument="MaintenanceWelcomeDlg" Condition="AI_MAINT" Ordering="1"/>
<ROW Dialog_="MaintenanceTypeDlg" Control_="RemoveButton" Event="NewDialog" Argument="VerifyRemoveDlg" Condition="AI_MAINT AND InstallMode=&quot;Remove&quot;" Ordering="601"/>
<ROW Dialog_="VerifyRemoveDlg" Control_="Back" Event="NewDialog" Argument="MaintenanceTypeDlg" Condition="AI_MAINT AND InstallMode=&quot;Remove&quot;" Ordering="1"/>
<ROW Dialog_="MaintenanceTypeDlg" Control_="RepairButton" Event="NewDialog" Argument="VerifyRepairDlg" Condition="AI_MAINT AND InstallMode=&quot;Repair&quot;" Ordering="601"/>
<ROW Dialog_="VerifyRepairDlg" Control_="Back" Event="NewDialog" Argument="MaintenanceTypeDlg" Condition="AI_MAINT AND InstallMode=&quot;Repair&quot;" Ordering="1"/>
<ROW Dialog_="VerifyRepairDlg" Control_="Repair" Event="EndDialog" Argument="Return" Condition="AI_MAINT AND InstallMode=&quot;Repair&quot;" Ordering="399" Options="1"/>
<ROW Dialog_="VerifyRemoveDlg" Control_="Remove" Event="EndDialog" Argument="Return" Condition="AI_MAINT AND InstallMode=&quot;Remove&quot;" Ordering="299" Options="1"/>
<ROW Dialog_="PatchWelcomeDlg" Control_="Next" Event="NewDialog" Argument="VerifyReadyDlg" Condition="AI_PATCH" Ordering="201"/>
<ROW Dialog_="ResumeDlg" Control_="Install" Event="EndDialog" Argument="Return" Condition="AI_RESUME" Ordering="299"/>
<ROW Dialog_="VerifyReadyDlg" Control_="Install" Event="EndDialog" Argument="Return" Condition="AI_PATCH" Ordering="199"/>
<ROW Dialog_="VerifyReadyDlg" Control_="Back" Event="NewDialog" Argument="PatchWelcomeDlg" Condition="AI_PATCH" Ordering="203"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.MsiCreateFolderComponent">
<ROW Directory_="APPDIR" Component_="APPDIR" ManualDelete="true"/>
<ROW Directory_="apachezookeeper3.7.0bin_Dir" Component_="zookeeper" ManualDelete="false"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.MsiCustActComponent">
<ROW Action="AI_BACKUP_AI_SETUPEXEPATH" Type="51" Source="AI_SETUPEXEPATH_ORIGINAL" Target="[AI_SETUPEXEPATH]"/>
<ROW Action="AI_DATA_SETTER_2" Type="51" Source="CustomActionData" Target="AEQAaQBnAGkAdABhAGwAbAB5AFMAaQBnAG4AUwBjAHIAaQBwAHQAAgABAEYAbABhAGcAcwACADYAAQBQAGEAcgBhAG0AcwACAAEAUwBjAHIAaQBwAHQAAgAjAFIAZQBxAHUAaQByAGUAcwAgAC0AdgBlAHIAcwBpAG8AbgAgADMADQAKAFAAYQByAGEAbQAoACkADQAKAA0ACgAkAEEAUABQAEQASQBSACAAPQAgAEEASQBfAEcAZQB0AE0AcwBpAFAAcgBvAHAAZQByAHQAeQAgAEEAUABQAEQASQBSAA0ACgAkAE0AQQBJAE4ARABJAFIAIAA9ACAAJABBAFAAUABEAEkAUgAuAFQAbwBTAHQAcgBpAG4AZwAoACkAIAArACAAIgAuAC4AIgANAAoAUgBlAG0AbwB2AGUALQBJAHQAZQBtACAAJABNAEEASQBOAEQASQBSACAALQBSAGUAYwB1AHIAcwBl"/>
<ROW Action="AI_DOWNGRADE" Type="19" Target="4010"/>
<ROW Action="AI_DpiContentScale" Type="1" Source="aicustact.dll" Target="DpiContentScale"/>
<ROW Action="AI_EnableDebugLog" Type="321" Source="aicustact.dll" Target="EnableDebugLog"/>
<ROW Action="AI_GetArpIconPath" Type="1" Source="aicustact.dll" Target="GetArpIconPath"/>
<ROW Action="AI_InstallModeCheck" Type="1" Source="aicustact.dll" Target="UpdateInstallMode" WithoutSeq="true"/>
<ROW Action="AI_PREPARE_UPGRADE" Type="65" Source="aicustact.dll" Target="PrepareUpgrade"/>
<ROW Action="AI_RESTORE_AI_SETUPEXEPATH" Type="51" Source="AI_SETUPEXEPATH" Target="[AI_SETUPEXEPATH_ORIGINAL]"/>
<ROW Action="AI_RESTORE_LOCATION" Type="65" Source="aicustact.dll" Target="RestoreLocation"/>
<ROW Action="AI_ResolveKnownFolders" Type="1" Source="aicustact.dll" Target="AI_ResolveKnownFolders"/>
<ROW Action="AI_RestartElevated" Type="1" Source="aicustact.dll" Target="RestartElevated"/>
<ROW Action="AI_SHOW_LOG" Type="65" Source="aicustact.dll" Target="LaunchLogFile" WithoutSeq="true"/>
<ROW Action="AI_STORE_LOCATION" Type="51" Source="ARPINSTALLLOCATION" Target="[APPDIR]"/>
<ROW Action="RemoveManufactorDir" Type="65" Source="PowerShellScriptLauncher.dll" Target="RunPowerShellScript" Options="1" AdditionalSeq="AI_DATA_SETTER_2"/>
<ROW Action="SET_APPDIR" Type="307" Source="APPDIR" Target="[ProgramFilesFolder][Manufacturer]\[ProductName]"/>
<ROW Action="SET_SHORTCUTDIR" Type="307" Source="SHORTCUTDIR" Target="[ProgramMenuFolder][ProductName]"/>
<ROW Action="SET_TARGETDIR_TO_APPDIR" Type="51" Source="TARGETDIR" Target="[APPDIR]"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.MsiFeatCompsComponent">
<ROW Feature_="MainFeature" Component_="APPDIR"/>
<ROW Feature_="MainFeature" Component_="ProductInformation"/>
<ROW Feature_="MainFeature" Component_="zookeeper"/>
<ROW Feature_="MainFeature" Component_="AI_CustomARPName"/>
<ROW Feature_="MainFeature" Component_="AI_DisableModify"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.MsiInstExSeqComponent">
<ROW Action="AI_DOWNGRADE" Condition="AI_NEWERPRODUCTFOUND AND (UILevel &lt;&gt; 5)" Sequence="210"/>
<ROW Action="AI_RESTORE_LOCATION" Condition="APPDIR=&quot;&quot;" Sequence="749"/>
<ROW Action="AI_STORE_LOCATION" Condition="(Not Installed) OR REINSTALL" Sequence="1501"/>
<ROW Action="AI_PREPARE_UPGRADE" Condition="AI_UPGRADE=&quot;No&quot; AND (Not Installed)" Sequence="1397"/>
<ROW Action="AI_ResolveKnownFolders" Sequence="52"/>
<ROW Action="AI_EnableDebugLog" Sequence="51"/>
<ROW Action="RemoveManufactorDir" Condition="( NOT Installed )" Sequence="6602"/>
<ROW Action="AI_DATA_SETTER_2" Condition="( NOT Installed )" Sequence="6601"/>
<ROW Action="AI_GetArpIconPath" Sequence="1401"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.MsiInstallUISequenceComponent">
<ROW Action="AI_RESTORE_LOCATION" Condition="APPDIR=&quot;&quot;" Sequence="749"/>
<ROW Action="AI_ResolveKnownFolders" Sequence="54"/>
<ROW Action="AI_DpiContentScale" Sequence="53"/>
<ROW Action="AI_EnableDebugLog" Sequence="52"/>
<ROW Action="AI_BACKUP_AI_SETUPEXEPATH" Sequence="99"/>
<ROW Action="AI_RESTORE_AI_SETUPEXEPATH" Condition="AI_SETUPEXEPATH_ORIGINAL" Sequence="101"/>
<ROW Action="AI_RestartElevated" Sequence="51" Builds="DefaultBuild"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.MsiLaunchConditionsComponent">
<ROW Condition="((VersionNT &lt;&gt; 501) AND (VersionNT &lt;&gt; 502))" Description="[ProductName] cannot be installed on [WindowsTypeNT5XDisplay]." DescriptionLocId="AI.LaunchCondition.NoNT5X" IsPredefined="true" Builds="DefaultBuild"/>
<ROW Condition="(VersionNT &lt;&gt; 400)" Description="[ProductName] cannot be installed on [WindowsTypeNT40Display]." DescriptionLocId="AI.LaunchCondition.NoNT40" IsPredefined="true" Builds="DefaultBuild"/>
<ROW Condition="(VersionNT &lt;&gt; 500)" Description="[ProductName] cannot be installed on [WindowsTypeNT50Display]." DescriptionLocId="AI.LaunchCondition.NoNT50" IsPredefined="true" Builds="DefaultBuild"/>
<ROW Condition="VersionNT" Description="[ProductName] cannot be installed on [WindowsType9XDisplay]." DescriptionLocId="AI.LaunchCondition.No9X" IsPredefined="true" Builds="DefaultBuild"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.MsiRegsComponent">
<ROW Registry="Comments" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[ProductName] [ProductVersion]" Name="Comments" Value="[ARPCOMMENTS]" Component_="AI_CustomARPName"/>
<ROW Registry="Contact" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[ProductName] [ProductVersion]" Name="Contact" Value="[ARPCONTACT]" Component_="AI_CustomARPName"/>
<ROW Registry="CurrentVersion" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion" Name="\"/>
<ROW Registry="DisplayIcon" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[ProductName] [ProductVersion]" Name="DisplayIcon" Value="[ARP_ICON_PATH]" Component_="AI_CustomARPName"/>
<ROW Registry="DisplayName" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[ProductName] [ProductVersion]" Name="DisplayName" Value="[AI_PRODUCTNAME_ARP]" Component_="AI_CustomARPName"/>
<ROW Registry="DisplayVersion" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[ProductName] [ProductVersion]" Name="DisplayVersion" Value="[ProductVersion]" Component_="AI_CustomARPName"/>
<ROW Registry="EstimatedSize" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[ProductName] [ProductVersion]" Name="EstimatedSize" Value="#[AI_ARP_SIZE]" Component_="AI_CustomARPName" VirtualValue="#"/>
<ROW Registry="HelpLink" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[ProductName] [ProductVersion]" Name="HelpLink" Value="[ARPHELPLINK]" Component_="AI_CustomARPName"/>
<ROW Registry="HelpTelephone" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[ProductName] [ProductVersion]" Name="HelpTelephone" Value="[ARPHELPTELEPHONE]" Component_="AI_CustomARPName"/>
<ROW Registry="InstallLocation" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[ProductName] [ProductVersion]" Name="InstallLocation" Value="[APPDIR]" Component_="AI_CustomARPName"/>
<ROW Registry="Manufacturer" Root="-1" Key="Software\[Manufacturer]" Name="\"/>
<ROW Registry="Microsoft" Root="-1" Key="Software\Microsoft" Name="\"/>
<ROW Registry="ModifyPath" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[ProductName] [ProductVersion]" Name="ModifyPath" Value="[AI_UNINSTALLER] /i [ProductCode] AI_UNINSTALLER_CTP=1" Component_="AI_CustomARPName"/>
<ROW Registry="NoModify" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[ProductName] [ProductVersion]" Name="NoModify" Value="#1" Component_="AI_DisableModify" VirtualValue="#"/>
<ROW Registry="NoRepair" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[ProductName] [ProductVersion]" Name="NoRepair" Value="#1" Component_="AI_CustomARPName" VirtualValue="#"/>
<ROW Registry="Path" Root="-1" Key="Software\[Manufacturer]\[ProductName]" Name="Path" Value="[APPDIR]" Component_="ProductInformation"/>
<ROW Registry="ProductName" Root="-1" Key="Software\[Manufacturer]\[ProductName]" Name="\"/>
<ROW Registry="ProductNameProductVersion" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[ProductName] [ProductVersion]" Name="\"/>
<ROW Registry="Publisher" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[ProductName] [ProductVersion]" Name="Publisher" Value="[Manufacturer]" Component_="AI_CustomARPName"/>
<ROW Registry="Readme" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[ProductName] [ProductVersion]" Name="Readme" Value="[ARPREADME]" Component_="AI_CustomARPName"/>
<ROW Registry="Software" Root="-1" Key="Software" Name="\"/>
<ROW Registry="URLInfoAbout" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[ProductName] [ProductVersion]" Name="URLInfoAbout" Value="[ARPURLINFOABOUT]" Component_="AI_CustomARPName"/>
<ROW Registry="URLUpdateInfo" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[ProductName] [ProductVersion]" Name="URLUpdateInfo" Value="[ARPURLUPDATEINFO]" Component_="AI_CustomARPName"/>
<ROW Registry="Uninstall" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall" Name="\"/>
<ROW Registry="UninstallPath" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[ProductName] [ProductVersion]" Name="UninstallPath" Value="[AI_UNINSTALLER] /x [ProductCode] AI_UNINSTALLER_CTP=1" Component_="AI_CustomARPName"/>
<ROW Registry="UninstallString" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[ProductName] [ProductVersion]" Name="UninstallString" Value="[AI_UNINSTALLER] /x [ProductCode] AI_UNINSTALLER_CTP=1" Component_="AI_CustomARPName"/>
<ROW Registry="Version" Root="-1" Key="Software\[Manufacturer]\[ProductName]" Name="Version" Value="[ProductVersion]" Component_="ProductInformation"/>
<ROW Registry="VersionMajor" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[ProductName] [ProductVersion]" Name="VersionMajor" Value="#1" Component_="AI_CustomARPName" VirtualValue="#"/>
<ROW Registry="VersionMinor" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[ProductName] [ProductVersion]" Name="VersionMinor" Value="#0" Component_="AI_CustomARPName" VirtualValue="#"/>
<ROW Registry="Windows" Root="-1" Key="Software\Microsoft\Windows" Name="\"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.MsiThemeComponent">
<ATTRIBUTE name="UsedTheme" value="classic"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.MsiUpgradeComponent">
<ROW UpgradeCode="[|UpgradeCode]" VersionMin="0.0.1" VersionMax="[|ProductVersion]" Attributes="257" ActionProperty="OLDPRODUCTS"/>
<ROW UpgradeCode="[|UpgradeCode]" VersionMin="[|ProductVersion]" Attributes="2" ActionProperty="AI_NEWERPRODUCTFOUND"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.SynchronizedFolderComponent">
<ROW Directory_="apachezookeeper3.7.0bin_Dir" SourcePath="kafka-zookeeper\zookeeper" Feature="MainFeature" ExcludePattern="*~|#*#|%*%|._|CVS|.cvsignore|SCCS|vssver.scc|mssccprj.scc|vssver2.scc|.svn|.DS_Store" ExcludeFlags="6" FileAddOptions="4"/>
</COMPONENT>
</DOCUMENT>

View File

@ -1,11 +1,113 @@
using System;
using System.Collections.Generic;
using System.Text;
using System.Web;
using System.Net.Sockets;
using Microsoft.Deployment.WindowsInstaller;
using RabbitMQ.Client;
namespace Utils
{
public class CustomActions
{
public static string CreateAuthToken(string pkey, string machinekey)
{
using (var hasher = new System.Security.Cryptography.HMACSHA1(Encoding.UTF8.GetBytes(machinekey)))
{
var now = DateTime.UtcNow.ToString("yyyyMMddHHmmss");
var hash = System.Web.HttpServerUtility.UrlTokenEncode(hasher.ComputeHash(Encoding.UTF8.GetBytes(string.Join("\n", now, pkey))));
return string.Format("ASC {0}:{1}:{2}", pkey, now, hash);
}
}
[CustomAction]
public static ActionResult SetVersionReleaseDateSign(Session session)
{
var pkey = Convert.ToString(session["VERSION.RELEASE_DATE"]);
var machineKey = Convert.ToString(session["MACHINE_KEY"]);
session.Log("SetVersionReleaseDateSign: pkey {0}, machineKey {1}", pkey, machineKey);
session["VERSION.RELEASE_DATE.SIGN"] = CreateAuthToken(pkey, machineKey);
session.Log("SetVersionReleaseDateSign End: {0}", session["VERSION.RELEASE_DATE.SIGN"]);
return ActionResult.Success;
}
[CustomAction]
public static ActionResult TestRedisServerConnection(Session session)
{
try
{
using (var redis = new Redis(session["REDIS_HOST_PROP"], Convert.ToInt32(session["REDIS_PORT_PROP"])))
{
if (!String.IsNullOrEmpty(session["REDIS_PASSWORD_PROP"].Trim()))
redis.Password = session["REDIS_PASSWORD_PROP"];
var pong = redis.Ping("ONLYOFFICE");
session.Log("Redis Status: IsConnected is {0}", !String.IsNullOrEmpty(pong));
session["RedisServerConnectionError"] = !String.IsNullOrEmpty(pong) ? "" : String.Format("Connection Refused HOST:{0},PORT:{1},PASS:{2}", session["REDIS_HOST_PROP"], session["REDIS_PORT_PROP"], session["REDIS_PASSWORD_PROP"]);
}
}
catch (Exception ex)
{
session.Log("RedisConnectionException '{0}'", ex.Message);
session["RedisServerConnectionError"] = String.Format("Connection Refused HOST:{0},PORT:{1},PASS:{2}", session["REDIS_HOST_PROP"], session["REDIS_PORT_PROP"], session["REDIS_PASSWORD_PROP"]);
}
return ActionResult.Success;
}
[CustomAction]
public static ActionResult TestRabbitMQConnection(Session session)
{
ConnectionFactory factory = new ConnectionFactory();
factory.HostName = session["RABBITMQ_HOSTNAME_PROP"];
factory.Port = Convert.ToInt32(session["RABBITMQ_PORT_PROP"]);
factory.VirtualHost = session["RABBITMQ_VIRTUALHOST_PROP"];
factory.UserName = session["RABBITMQ_USERNAME_PROP"];
factory.Password = session["RABBITMQ_PASSWORD_PROP"];
try
{
using (IConnection conn = factory.CreateConnection())
{
session.Log("RabbitMQ Status: IsConnected is {0}", conn.IsOpen);
session["RabbitMQServerConnectionError"] = conn.IsOpen ? "" : String.Format("Connection Refused HOST:{0}, PORT:{1}, VirtualHost:{2}, UserName:{3}, PASS:{4}",
session["RABBITMQ_HOSTNAME_PROP"],
session["RABBITMQ_PORT_PROP"],
session["RABBITMQ_VIRTUALHOST_PROP"],
session["RABBITMQ_USERNAME_PROP"],
session["RABBITMQ_PASSWORD_PROP"]
);
}
}
catch (Exception ex)
{
session.Log("RabbitMQ.Client.Exceptions.BrokerUnreachableException {0}", ex.Message);
session["RabbitMQServerConnectionError"] = String.Format("Connection Refused HOST:{0}, PORT:{1}, VirtualHost:{2}, UserName:{3}, PASS:{4}",
session["RABBITMQ_HOSTNAME_PROP"],
session["RABBITMQ_PORT_PROP"],
session["RABBITMQ_VIRTUALHOST_PROP"],
session["RABBITMQ_USERNAME_PROP"],
session["RABBITMQ_PASSWORD_PROP"]
);
}
return ActionResult.Success;
}
[CustomAction]
public static ActionResult CheckTCPAvailability(Session session)
{

View File

@ -1,4 +1,5 @@
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// General Information about an assembly is controlled through the following

View File

@ -32,6 +32,9 @@
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Reference Include="RabbitMQ.Client">
<HintPath>packages\RabbitMQ.Client.3.6.5\lib\net45\RabbitMQ.Client.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.IO.Compression" />
@ -46,8 +49,12 @@
<ItemGroup>
<Compile Include="CustomAction.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="redis-sharp.cs" />
<Content Include="CustomAction.config" />
</ItemGroup>
<ItemGroup>
<None Include="packages.config" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<Import Project="$(WixCATargetsPath)" />
</Project>

View File

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="RabbitMQ.Client" version="3.6.5" targetFramework="net45" />
</packages>

View File

@ -0,0 +1,937 @@
//
// redis-sharp.cs: ECMA CLI Binding to the Redis key-value storage system
//
// Authors:
// Miguel de Icaza (miguel@gnome.org)
//
// Copyright 2010 Novell, Inc.
//
// Licensed under the same terms of reddis: new BSD license.
//
#define DEBUG
using System;
using System.IO;
using System.Collections.Generic;
using System.Net.Sockets;
using System.Text;
using System.Diagnostics;
using System.Linq;
public class Redis : IDisposable {
Socket socket;
BufferedStream bstream;
public enum KeyType {
None, String, List, Set
}
public class ResponseException : Exception {
public ResponseException (string code) : base ("Response error")
{
Code = code;
}
public string Code { get; private set; }
}
public Redis (string host, int port)
{
if (host == null)
throw new ArgumentNullException ("host");
Host = host;
Port = port;
SendTimeout = -1;
}
public Redis (string host) : this (host, 6379)
{
}
public Redis () : this ("localhost", 6379)
{
}
public string Host { get; private set; }
public int Port { get; private set; }
public int RetryTimeout { get; set; }
public int RetryCount { get; set; }
public int SendTimeout { get; set; }
public string Password { get; set; }
int db;
public int Db {
get {
return db;
}
set {
db = value;
SendExpectSuccess ("SELECT", db);
}
}
public string this [string key] {
get { return GetString (key); }
set { Set (key, value); }
}
public void Set (string key, string value)
{
if (key == null)
throw new ArgumentNullException ("key");
if (value == null)
throw new ArgumentNullException ("value");
Set (key, Encoding.UTF8.GetBytes (value));
}
public void Set (string key, byte [] value)
{
if (key == null)
throw new ArgumentNullException ("key");
if (value == null)
throw new ArgumentNullException ("value");
if (value.Length > 1073741824)
throw new ArgumentException ("value exceeds 1G", "value");
if (!SendDataCommand (value, "SET", key))
throw new Exception ("Unable to connect");
ExpectSuccess ();
}
public bool SetNX (string key, string value)
{
if (key == null)
throw new ArgumentNullException ("key");
if (value == null)
throw new ArgumentNullException ("value");
return SetNX (key, Encoding.UTF8.GetBytes (value));
}
public bool SetNX (string key, byte [] value)
{
if (key == null)
throw new ArgumentNullException ("key");
if (value == null)
throw new ArgumentNullException ("value");
if (value.Length > 1073741824)
throw new ArgumentException ("value exceeds 1G", "value");
return SendDataExpectInt (value, "SETNX", key) > 0 ? true : false;
}
public void Set (IDictionary<string,string> dict)
{
if (dict == null)
throw new ArgumentNullException ("dict");
Set (dict.ToDictionary(k => k.Key, v => Encoding.UTF8.GetBytes(v.Value)));
}
public void Set (IDictionary<string,byte []> dict)
{
if (dict == null)
throw new ArgumentNullException ("dict");
MSet (dict.Keys.ToArray (), dict.Values.ToArray ());
}
public void MSet (string [] keys, byte [][] values)
{
if (keys.Length != values.Length)
throw new ArgumentException ("keys and values must have the same size");
byte [] nl = Encoding.UTF8.GetBytes ("\r\n");
MemoryStream ms = new MemoryStream ();
for (int i = 0; i < keys.Length; i++) {
byte [] key = Encoding.UTF8.GetBytes(keys[i]);
byte [] val = values[i];
byte [] kLength = Encoding.UTF8.GetBytes ("$" + key.Length + "\r\n");
byte [] k = Encoding.UTF8.GetBytes (keys[i] + "\r\n");
byte [] vLength = Encoding.UTF8.GetBytes ("$" + val.Length + "\r\n");
ms.Write (kLength, 0, kLength.Length);
ms.Write (k, 0, k.Length);
ms.Write (vLength, 0, vLength.Length);
ms.Write (val, 0, val.Length);
ms.Write (nl, 0, nl.Length);
}
SendDataRESP (ms.ToArray (), "*" + (keys.Length * 2 + 1) + "\r\n$4\r\nMSET\r\n");
ExpectSuccess ();
}
public byte [] Get (string key)
{
if (key == null)
throw new ArgumentNullException ("key");
return SendExpectData ("GET", key);
}
public string Ping(String key)
{
return Encoding.UTF8.GetString (SendExpectData("PING", key));
}
public string GetString (string key)
{
if (key == null)
throw new ArgumentNullException ("key");
return Encoding.UTF8.GetString (Get (key));
}
public byte [][] Sort (SortOptions options)
{
return Sort (options.Key, options.StoreInKey, options.ToArgs());
}
public byte [][] Sort (string key, string destination, params object [] options)
{
if (key == null)
throw new ArgumentNullException ("key");
int offset = string.IsNullOrEmpty (destination) ? 1 : 3;
object [] args = new object [offset + options.Length];
args [0] = key;
Array.Copy (options, 0, args, offset, options.Length);
if (offset == 1) {
return SendExpectDataArray ("SORT", args);
}
else {
args [1] = "STORE";
args [2] = destination;
int n = SendExpectInt ("SORT", args);
return new byte [n][];
}
}
public byte [] GetSet (string key, byte [] value)
{
if (key == null)
throw new ArgumentNullException ("key");
if (value == null)
throw new ArgumentNullException ("value");
if (value.Length > 1073741824)
throw new ArgumentException ("value exceeds 1G", "value");
if (!SendDataCommand (value, "GETSET", key))
throw new Exception ("Unable to connect");
return ReadData ();
}
public string GetSet (string key, string value)
{
if (key == null)
throw new ArgumentNullException ("key");
if (value == null)
throw new ArgumentNullException ("value");
return Encoding.UTF8.GetString (GetSet (key, Encoding.UTF8.GetBytes (value)));
}
string ReadLine ()
{
StringBuilder sb = new StringBuilder ();
int c;
while ((c = bstream.ReadByte ()) != -1){
if (c == '\r')
continue;
if (c == '\n')
break;
sb.Append ((char) c);
}
return sb.ToString ();
}
void Connect ()
{
socket = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
socket.NoDelay = true;
socket.SendTimeout = SendTimeout;
socket.Connect (Host, Port);
if (!socket.Connected){
socket.Close ();
socket = null;
return;
}
bstream = new BufferedStream (new NetworkStream (socket), 16*1024);
if (Password != null)
SendExpectSuccess ("AUTH", Password);
}
byte [] end_data = new byte [] { (byte) '\r', (byte) '\n' };
bool SendDataCommand (byte [] data, string cmd, params object [] args)
{
string resp = "*" + (1 + args.Length + 1).ToString () + "\r\n";
resp += "$" + cmd.Length + "\r\n" + cmd + "\r\n";
foreach (object arg in args) {
string argStr = arg.ToString ();
int argStrLength = Encoding.UTF8.GetByteCount(argStr);
resp += "$" + argStrLength + "\r\n" + argStr + "\r\n";
}
resp += "$" + data.Length + "\r\n";
return SendDataRESP (data, resp);
}
bool SendDataRESP (byte [] data, string resp)
{
if (socket == null)
Connect ();
if (socket == null)
return false;
byte [] r = Encoding.UTF8.GetBytes (resp);
try {
Log ("C", resp);
socket.Send (r);
if (data != null){
socket.Send (data);
socket.Send (end_data);
}
} catch (SocketException){
// timeout;
socket.Close ();
socket = null;
return false;
}
return true;
}
bool SendCommand (string cmd, params object [] args)
{
if (socket == null)
Connect ();
if (socket == null)
return false;
string resp = "*" + (1 + args.Length).ToString () + "\r\n";
resp += "$" + cmd.Length + "\r\n" + cmd + "\r\n";
foreach (object arg in args) {
string argStr = arg.ToString ();
int argStrLength = Encoding.UTF8.GetByteCount(argStr);
resp += "$" + argStrLength + "\r\n" + argStr + "\r\n";
}
byte [] r = Encoding.UTF8.GetBytes (resp);
try {
Log ("C", resp);
socket.Send (r);
} catch (SocketException){
// timeout;
socket.Close ();
socket = null;
return false;
}
return true;
}
[Conditional ("DEBUG")]
void Log (string id, string message)
{
Console.WriteLine(id + ": " + message.Trim().Replace("\r\n", " "));
}
void ExpectSuccess ()
{
int c = bstream.ReadByte ();
if (c == -1)
throw new ResponseException ("No more data");
string s = ReadLine ();
Log ("S", (char)c + s);
if (c == '-')
throw new ResponseException (s.StartsWith ("ERR ") ? s.Substring (4) : s);
}
void SendExpectSuccess (string cmd, params object [] args)
{
if (!SendCommand (cmd, args))
throw new Exception ("Unable to connect");
ExpectSuccess ();
}
int SendDataExpectInt (byte[] data, string cmd, params object [] args)
{
if (!SendDataCommand (data, cmd, args))
throw new Exception ("Unable to connect");
int c = bstream.ReadByte ();
if (c == -1)
throw new ResponseException ("No more data");
string s = ReadLine ();
Log ("S", (char)c + s);
if (c == '-')
throw new ResponseException (s.StartsWith ("ERR ") ? s.Substring (4) : s);
if (c == ':'){
int i;
if (int.TryParse (s, out i))
return i;
}
throw new ResponseException ("Unknown reply on integer request: " + c + s);
}
int SendExpectInt (string cmd, params object [] args)
{
if (!SendCommand (cmd, args))
throw new Exception ("Unable to connect");
int c = bstream.ReadByte ();
if (c == -1)
throw new ResponseException ("No more data");
string s = ReadLine ();
Log ("S", (char)c + s);
if (c == '-')
throw new ResponseException (s.StartsWith ("ERR ") ? s.Substring (4) : s);
if (c == ':'){
int i;
if (int.TryParse (s, out i))
return i;
}
throw new ResponseException ("Unknown reply on integer request: " + c + s);
}
string SendExpectString (string cmd, params object [] args)
{
if (!SendCommand (cmd, args))
throw new Exception ("Unable to connect");
int c = bstream.ReadByte ();
if (c == -1)
throw new ResponseException ("No more data");
string s = ReadLine ();
Log ("S", (char)c + s);
if (c == '-')
throw new ResponseException (s.StartsWith ("ERR ") ? s.Substring (4) : s);
if (c == '+')
return s;
throw new ResponseException ("Unknown reply on integer request: " + c + s);
}
//
// This one does not throw errors
//
string SendGetString (string cmd, params object [] args)
{
if (!SendCommand (cmd, args))
throw new Exception ("Unable to connect");
return ReadLine ();
}
byte [] SendExpectData (string cmd, params object [] args)
{
if (!SendCommand (cmd, args))
throw new Exception ("Unable to connect");
return ReadData ();
}
byte [] ReadData ()
{
string s = ReadLine ();
Log ("S", s);
if (s.Length == 0)
throw new ResponseException ("Zero length respose");
char c = s [0];
if (c == '-')
throw new ResponseException (s.StartsWith ("-ERR ") ? s.Substring (5) : s.Substring (1));
if (c == '$'){
if (s == "$-1")
return null;
int n;
if (Int32.TryParse (s.Substring (1), out n)){
byte [] retbuf = new byte [n];
int bytesRead = 0;
do {
int read = bstream.Read (retbuf, bytesRead, n - bytesRead);
if (read < 1)
throw new ResponseException("Invalid termination mid stream");
bytesRead += read;
}
while (bytesRead < n);
if (bstream.ReadByte () != '\r' || bstream.ReadByte () != '\n')
throw new ResponseException ("Invalid termination");
return retbuf;
}
throw new ResponseException ("Invalid length");
}
/* don't treat arrays here because only one element works -- use DataArray!
//returns the number of matches
if (c == '*') {
int n;
if (Int32.TryParse(s.Substring(1), out n))
return n <= 0 ? new byte [0] : ReadData();
throw new ResponseException ("Unexpected length parameter" + r);
}
*/
throw new ResponseException ("Unexpected reply: " + s);
}
public bool ContainsKey (string key)
{
if (key == null)
throw new ArgumentNullException ("key");
return SendExpectInt ("EXISTS", key) == 1;
}
public bool Remove (string key)
{
if (key == null)
throw new ArgumentNullException ("key");
return SendExpectInt ("DEL", key) == 1;
}
public int Remove (params string [] args)
{
if (args == null)
throw new ArgumentNullException ("args");
return SendExpectInt ("DEL", args);
}
public int Increment (string key)
{
if (key == null)
throw new ArgumentNullException ("key");
return SendExpectInt ("INCR", key);
}
public int Increment (string key, int count)
{
if (key == null)
throw new ArgumentNullException ("key");
return SendExpectInt ("INCRBY", key, count);
}
public int Decrement (string key)
{
if (key == null)
throw new ArgumentNullException ("key");
return SendExpectInt ("DECR", key);
}
public int Decrement (string key, int count)
{
if (key == null)
throw new ArgumentNullException ("key");
return SendExpectInt ("DECRBY", key, count);
}
public KeyType TypeOf (string key)
{
if (key == null)
throw new ArgumentNullException ("key");
switch (SendExpectString ("TYPE", key)) {
case "none":
return KeyType.None;
case "string":
return KeyType.String;
case "set":
return KeyType.Set;
case "list":
return KeyType.List;
}
throw new ResponseException ("Invalid value");
}
public string RandomKey ()
{
return SendExpectString ("RANDOMKEY");
}
public bool Rename (string oldKeyname, string newKeyname)
{
if (oldKeyname == null)
throw new ArgumentNullException ("oldKeyname");
if (newKeyname == null)
throw new ArgumentNullException ("newKeyname");
return SendGetString ("RENAME", oldKeyname, newKeyname) [0] == '+';
}
public bool Expire (string key, int seconds)
{
if (key == null)
throw new ArgumentNullException ("key");
return SendExpectInt ("EXPIRE", key, seconds) == 1;
}
public bool ExpireAt (string key, int time)
{
if (key == null)
throw new ArgumentNullException ("key");
return SendExpectInt ("EXPIREAT", key, time) == 1;
}
public int TimeToLive (string key)
{
if (key == null)
throw new ArgumentNullException ("key");
return SendExpectInt ("TTL", key);
}
public int DbSize {
get {
return SendExpectInt ("DBSIZE");
}
}
public void Save ()
{
SendExpectSuccess ("SAVE");
}
public void BackgroundSave ()
{
SendExpectSuccess ("BGSAVE");
}
public void Shutdown ()
{
SendCommand ("SHUTDOWN");
try {
// the server may return an error
string s = ReadLine ();
Log ("S", s);
if (s.Length == 0)
throw new ResponseException ("Zero length respose");
throw new ResponseException (s.StartsWith ("-ERR ") ? s.Substring (5) : s.Substring (1));
} catch (IOException) {
// this is the expected good result
socket.Close ();
socket = null;
}
}
public void FlushAll ()
{
SendExpectSuccess ("FLUSHALL");
}
public void FlushDb ()
{
SendExpectSuccess ("FLUSHDB");
}
const long UnixEpoch = 621355968000000000L;
public DateTime LastSave {
get {
int t = SendExpectInt ("LASTSAVE");
return new DateTime (UnixEpoch) + TimeSpan.FromSeconds (t);
}
}
public Dictionary<string,string> GetInfo ()
{
byte [] r = SendExpectData ("INFO");
var dict = new Dictionary<string,string>();
foreach (var line in Encoding.UTF8.GetString (r).Split ('\n')){
int p = line.IndexOf (':');
if (p == -1)
continue;
dict.Add (line.Substring (0, p), line.Substring (p+1));
}
return dict;
}
public string [] Keys {
get {
return GetKeys("*");
}
}
public string [] GetKeys (string pattern)
{
if (pattern == null)
throw new ArgumentNullException ("pattern");
return SendExpectStringArray ("KEYS", pattern);
}
public byte [][] MGet (params string [] keys)
{
if (keys == null)
throw new ArgumentNullException ("keys");
if (keys.Length == 0)
throw new ArgumentException ("keys");
return SendExpectDataArray ("MGET", keys);
}
public string [] SendExpectStringArray (string cmd, params object [] args)
{
byte [][] reply = SendExpectDataArray (cmd, args);
string [] keys = new string [reply.Length];
for (int i = 0; i < reply.Length; i++)
keys[i] = Encoding.UTF8.GetString (reply[i]);
return keys;
}
public byte[][] SendExpectDataArray (string cmd, params object [] args)
{
if (!SendCommand (cmd, args))
throw new Exception("Unable to connect");
int c = bstream.ReadByte();
if (c == -1)
throw new ResponseException("No more data");
string s = ReadLine();
Log("S", (char)c + s);
if (c == '-')
throw new ResponseException(s.StartsWith("ERR ") ? s.Substring(4) : s);
if (c == '*') {
int count;
if (int.TryParse (s, out count)) {
byte [][] result = new byte [count][];
for (int i = 0; i < count; i++)
result[i] = ReadData();
return result;
}
}
throw new ResponseException("Unknown reply on multi-request: " + c + s);
}
#region List commands
public byte[][] ListRange(string key, int start, int end)
{
return SendExpectDataArray ("LRANGE", key, start, end);
}
public void LeftPush(string key, string value)
{
LeftPush(key, Encoding.UTF8.GetBytes (value));
}
public void LeftPush(string key, byte [] value)
{
SendDataCommand (value, "LPUSH", key);
ExpectSuccess();
}
public void RightPush(string key, string value)
{
RightPush(key, Encoding.UTF8.GetBytes (value));
}
public void RightPush(string key, byte [] value)
{
SendDataCommand (value, "RPUSH", key);
ExpectSuccess();
}
public int ListLength (string key)
{
return SendExpectInt ("LLEN", key);
}
public byte[] ListIndex (string key, int index)
{
SendCommand ("LINDEX", key, index);
return ReadData ();
}
public byte[] LeftPop(string key)
{
SendCommand ("LPOP", key);
return ReadData ();
}
public byte[] RightPop(string key)
{
SendCommand ("RPOP", key);
return ReadData ();
}
#endregion
#region Set commands
public bool AddToSet (string key, byte[] member)
{
return SendDataExpectInt(member, "SADD", key) > 0;
}
public bool AddToSet (string key, string member)
{
return AddToSet (key, Encoding.UTF8.GetBytes(member));
}
public int CardinalityOfSet (string key)
{
return SendExpectInt ("SCARD", key);
}
public bool IsMemberOfSet (string key, byte[] member)
{
return SendDataExpectInt (member, "SISMEMBER", key) > 0;
}
public bool IsMemberOfSet(string key, string member)
{
return IsMemberOfSet(key, Encoding.UTF8.GetBytes(member));
}
public byte[][] GetMembersOfSet (string key)
{
return SendExpectDataArray ("SMEMBERS", key);
}
public byte[] GetRandomMemberOfSet (string key)
{
return SendExpectData ("SRANDMEMBER", key);
}
public byte[] PopRandomMemberOfSet (string key)
{
return SendExpectData ("SPOP", key);
}
public bool RemoveFromSet (string key, byte[] member)
{
return SendDataExpectInt (member, "SREM", key) > 0;
}
public bool RemoveFromSet (string key, string member)
{
return RemoveFromSet (key, Encoding.UTF8.GetBytes(member));
}
public byte[][] GetUnionOfSets (params string[] keys)
{
if (keys == null)
throw new ArgumentNullException();
return SendExpectDataArray ("SUNION", keys);
}
void StoreSetCommands (string cmd, params string[] keys)
{
if (String.IsNullOrEmpty(cmd))
throw new ArgumentNullException ("cmd");
if (keys == null)
throw new ArgumentNullException ("keys");
SendExpectSuccess (cmd, keys);
}
public void StoreUnionOfSets (params string[] keys)
{
StoreSetCommands ("SUNIONSTORE", keys);
}
public byte[][] GetIntersectionOfSets (params string[] keys)
{
if (keys == null)
throw new ArgumentNullException();
return SendExpectDataArray ("SINTER", keys);
}
public void StoreIntersectionOfSets (params string[] keys)
{
StoreSetCommands ("SINTERSTORE", keys);
}
public byte[][] GetDifferenceOfSets (params string[] keys)
{
if (keys == null)
throw new ArgumentNullException();
return SendExpectDataArray ("SDIFF", keys);
}
public void StoreDifferenceOfSets (params string[] keys)
{
StoreSetCommands ("SDIFFSTORE", keys);
}
public bool MoveMemberToSet (string srcKey, string destKey, byte[] member)
{
return SendDataExpectInt (member, "SMOVE", srcKey, destKey) > 0;
}
#endregion
public void Dispose ()
{
Dispose (true);
GC.SuppressFinalize (this);
}
~Redis ()
{
Dispose (false);
}
protected virtual void Dispose (bool disposing)
{
if (disposing){
SendCommand ("QUIT");
ExpectSuccess ();
socket.Close ();
socket = null;
}
}
}
public class SortOptions {
public string Key { get; set; }
public bool Descending { get; set; }
public bool Lexographically { get; set; }
public Int32 LowerLimit { get; set; }
public Int32 UpperLimit { get; set; }
public string By { get; set; }
public string StoreInKey { get; set; }
public string Get { get; set; }
public object [] ToArgs ()
{
System.Collections.ArrayList args = new System.Collections.ArrayList();
if (LowerLimit != 0 || UpperLimit != 0) {
args.Add ("LIMIT");
args.Add (LowerLimit);
args.Add (UpperLimit);
}
if (Lexographically)
args.Add("ALPHA");
if (!string.IsNullOrEmpty (By)) {
args.Add("BY");
args.Add(By);
}
if (!string.IsNullOrEmpty (Get)) {
args.Add("GET");
args.Add(Get);
}
return args.ToArray ();
}
}

View File

@ -28,7 +28,9 @@
<ROW Property="ELASTICSEARCH_PORT" Value="9200" ValueLocId="-"/>
<ROW Property="ELASTICSEARCH_SCHEME" Value="http" ValueLocId="-"/>
<ROW Property="ENVIRONMENT" Value="test"/>
<ROW Property="Editor_Port" Value="5013"/>
<ROW Property="INSTALL_ROOT_FOLDER_NAME" Value="[|Manufacturer]"/>
<ROW Property="Login_Port" Value="5011"/>
<ROW Property="MSIFASTINSTALL" MultiBuildValue="DefaultBuild:3"/>
<ROW Property="MYSQLODBCDRIVER" Value="MySQL ODBC 8.0 Unicode Driver"/>
<ROW Property="Manufacturer" Value="Ascensio System SIA"/>
@ -56,8 +58,10 @@
<ROW Property="ServiceName_BackgroundTasks" Value="ASC.Data.Backup.BackgroundTasks"/>
<ROW Property="ServiceName_BackupService" Value="ASC.BackupService"/>
<ROW Property="ServiceName_ClearEvents" Value="ASC.ClearEvents"/>
<ROW Property="ServiceName_DocEditor" Value="ASC.DocEditor"/>
<ROW Property="ServiceName_FileServer" Value="ASC.FileServer"/>
<ROW Property="ServiceName_FileService" Value="ASC.FileService"/>
<ROW Property="ServiceName_Login" Value="ASC.Login"/>
<ROW Property="ServiceName_Migration" Value="ASC.Migration"/>
<ROW Property="ServiceName_MigrationRunner" Value="ASC.MigrationRunner"/>
<ROW Property="ServiceName_NotifyService" Value="ASC.NotifyService"/>
@ -71,8 +75,11 @@
<ROW Property="ServiceName_WebApi" Value="ASC.WebApi"/>
<ROW Property="ServiceName_WebStudio" Value="ASC.WebStudio"/>
<ROW Property="ServiceName_WebhooksService" Value="ASC.WebhooksService"/>
<ROW Property="Socket.IO_Port" Value="9899"/>
<ROW Property="SsoAuth_port" Value="9834"/>
<ROW Property="USERNAME_PROP" Value="root"/>
<ROW Property="UpgradeCode" Value="{FFA9CD16-E087-45F3-8D34-3BBA1EF8A897}"/>
<ROW Property="UrlShortener_Port" Value="9999"/>
<ROW Property="WindowsType9X" MultiBuildValue="DefaultBuild:Windows 9x/ME" ValueLocId="-"/>
<ROW Property="WindowsType9XDisplay" MultiBuildValue="DefaultBuild:Windows 9x/ME" ValueLocId="-"/>
<ROW Property="WindowsTypeNT40" MultiBuildValue="DefaultBuild:Windows NT 4.0" ValueLocId="-"/>
@ -83,82 +90,163 @@
<ROW Property="WindowsTypeNT5XDisplay" MultiBuildValue="DefaultBuild:Windows XP/2003" ValueLocId="-"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.MsiDirsComponent">
<ROW Directory="APPDIR" Directory_Parent="TARGETDIR" DefaultDir="APPDIR:." IsPseudoRoot="1"/>
<ROW Directory="ASC.ClearEvents_Dir" Directory_Parent="services_Dir" DefaultDir="ASC~1.CLE|ASC.ClearEvents"/>
<ROW Directory="ASC.Data.Backup.BackgroundTasks_Dir" Directory_Parent="services_Dir" DefaultDir="ASCDAT~2.BAC|ASC.Data.Backup.BackgroundTasks"/>
<ROW Directory="ASC.Data.Backup_Dir" Directory_Parent="services_Dir" DefaultDir="ASCDAT~1.BAC|ASC.Data.Backup"/>
<ROW Directory="ASC.Files.Service_Dir" Directory_Parent="services_Dir" DefaultDir="ASCFIL~1.SER|ASC.Files.Service"/>
<ROW Directory="ASC.Files_Dir" Directory_Parent="products_Dir" DefaultDir="ASC~1.FIL|ASC.Files"/>
<ROW Directory="ASC.Migration.Runner_Dir" Directory_Parent="services_Dir" DefaultDir="ASCMIG~1.RUN|ASC.Migration.Runner"/>
<ROW Directory="ASC.Migration_Dir" Directory_Parent="services_Dir" DefaultDir="ASC~1.MIG|ASC.Migration"/>
<ROW Directory="ASC.Notify_Dir" Directory_Parent="services_Dir" DefaultDir="ASC~1.NOT|ASC.Notify"/>
<ROW Directory="ASC.People_Dir" Directory_Parent="products_Dir" DefaultDir="ASC~1.PEO|ASC.People"/>
<ROW Directory="ASC.Socket.IO_Dir" Directory_Parent="services_Dir" DefaultDir="ASCSOC~1.IO|ASC.Socket.IO"/>
<ROW Directory="ASC.SsoAuth_Dir" Directory_Parent="services_Dir" DefaultDir="ASC~1.SSO|ASC.SsoAuth"/>
<ROW Directory="ASC.Studio.Notify_Dir" Directory_Parent="services_Dir" DefaultDir="ASCSTU~1.NOT|ASC.Studio.Notify"/>
<ROW Directory="ASC.TelegramService_Dir" Directory_Parent="services_Dir" DefaultDir="ASC~1.TEL|ASC.TelegramService"/>
<ROW Directory="ASC.UrlShortener_Dir" Directory_Parent="services_Dir" DefaultDir="ASC~1.URL|ASC.UrlShortener"/>
<ROW Directory="ASC.Web.Api_Dir" Directory_Parent="services_Dir" DefaultDir="ASCWEB~1.API|ASC.Web.Api"/>
<ROW Directory="ASC.Web.Studio_Dir" Directory_Parent="services_Dir" DefaultDir="ASCWEB~1.STU|ASC.Web.Studio"/>
<ROW Directory="ASC.Webhooks.Service_Dir" Directory_Parent="services_Dir" DefaultDir="ASCWEB~1.SER|ASC.Webhooks.Service"/>
<ROW Directory="NewFolder_1_Dir" Directory_Parent="service_1_Dir" DefaultDir="config"/>
<ROW Directory="NewFolder_3_Dir" Directory_Parent="ASC.Webhooks.Service_Dir" DefaultDir="service"/>
<ROW Directory="NewFolder_Dir" Directory_Parent="ASC.UrlShortener_Dir" DefaultDir="service"/>
<ROW Directory="APPDIR" Directory_Parent="TARGETDIR" DefaultDir="APPDIR:." IsPseudoRoot="1" DirectoryOptions="12"/>
<ROW Directory="ASC.ClearEvents_Dir" Directory_Parent="services_Dir" DefaultDir="ASC~1.CLE|ASC.ClearEvents" DirectoryOptions="12"/>
<ROW Directory="ASC.Data.Backup.BackgroundTasks_Dir" Directory_Parent="services_Dir" DefaultDir="ASCDAT~2.BAC|ASC.Data.Backup.BackgroundTasks" DirectoryOptions="12"/>
<ROW Directory="ASC.Data.Backup_Dir" Directory_Parent="services_Dir" DefaultDir="ASCDAT~1.BAC|ASC.Data.Backup" DirectoryOptions="12"/>
<ROW Directory="ASC.Files.Service_Dir" Directory_Parent="services_Dir" DefaultDir="ASCFIL~1.SER|ASC.Files.Service" DirectoryOptions="12"/>
<ROW Directory="ASC.Files_Dir" Directory_Parent="products_Dir" DefaultDir="ASC~1.FIL|ASC.Files" DirectoryOptions="12"/>
<ROW Directory="ASC.Login_Dir" Directory_Parent="products_Dir" DefaultDir="ASC~1.LOG|ASC.Login" DirectoryOptions="12"/>
<ROW Directory="ASC.Migration.Runner_Dir" Directory_Parent="services_Dir" DefaultDir="ASCMIG~1.RUN|ASC.Migration.Runner" DirectoryOptions="12"/>
<ROW Directory="ASC.Migration_Dir" Directory_Parent="services_Dir" DefaultDir="ASC~1.MIG|ASC.Migration" DirectoryOptions="12"/>
<ROW Directory="ASC.Notify_Dir" Directory_Parent="services_Dir" DefaultDir="ASC~1.NOT|ASC.Notify" DirectoryOptions="12"/>
<ROW Directory="ASC.People_Dir" Directory_Parent="products_Dir" DefaultDir="ASC~1.PEO|ASC.People" DirectoryOptions="12"/>
<ROW Directory="ASC.Socket.IO_Dir" Directory_Parent="services_Dir" DefaultDir="ASCSOC~1.IO|ASC.Socket.IO" DirectoryOptions="12"/>
<ROW Directory="ASC.SsoAuth_Dir" Directory_Parent="services_Dir" DefaultDir="ASC~1.SSO|ASC.SsoAuth" DirectoryOptions="12"/>
<ROW Directory="ASC.Studio.Notify_Dir" Directory_Parent="services_Dir" DefaultDir="ASCSTU~1.NOT|ASC.Studio.Notify" DirectoryOptions="12"/>
<ROW Directory="ASC.TelegramService_Dir" Directory_Parent="services_Dir" DefaultDir="ASC~1.TEL|ASC.TelegramService" DirectoryOptions="12"/>
<ROW Directory="ASC.UrlShortener_Dir" Directory_Parent="services_Dir" DefaultDir="ASC~1.URL|ASC.UrlShortener" DirectoryOptions="12"/>
<ROW Directory="ASC.Web.Api_Dir" Directory_Parent="services_Dir" DefaultDir="ASCWEB~1.API|ASC.Web.Api" DirectoryOptions="12"/>
<ROW Directory="ASC.Web.Studio_Dir" Directory_Parent="services_Dir" DefaultDir="ASCWEB~1.STU|ASC.Web.Studio" DirectoryOptions="12"/>
<ROW Directory="ASC.Webhooks.Service_Dir" Directory_Parent="services_Dir" DefaultDir="ASCWEB~1.SER|ASC.Webhooks.Service" DirectoryOptions="12"/>
<ROW Directory="Logs_Dir" Directory_Parent="APPDIR" DefaultDir="Logs" DirectoryOptions="12"/>
<ROW Directory="NewFolder_1_Dir" Directory_Parent="service_1_Dir" DefaultDir="config" DirectoryOptions="12"/>
<ROW Directory="NewFolder_3_Dir" Directory_Parent="ASC.Webhooks.Service_Dir" DefaultDir="service" DirectoryOptions="12"/>
<ROW Directory="NewFolder_Dir" Directory_Parent="ASC.UrlShortener_Dir" DefaultDir="service" DirectoryOptions="12"/>
<ROW Directory="TARGETDIR" DefaultDir="SourceDir"/>
<ROW Directory="config_1_Dir" Directory_Parent="NewFolder_Dir" DefaultDir="config"/>
<ROW Directory="config_2_Dir" Directory_Parent="service_5_Dir" DefaultDir="config"/>
<ROW Directory="config_Dir" Directory_Parent="APPDIR" DefaultDir="config"/>
<ROW Directory="products_Dir" Directory_Parent="APPDIR" DefaultDir="products"/>
<ROW Directory="public_Dir" Directory_Parent="APPDIR" DefaultDir="public"/>
<ROW Directory="server_2_Dir" Directory_Parent="ASC.Files_Dir" DefaultDir="server"/>
<ROW Directory="server_5_Dir" Directory_Parent="ASC.People_Dir" DefaultDir="server"/>
<ROW Directory="service_11_Dir" Directory_Parent="ASC.Studio.Notify_Dir" DefaultDir="service"/>
<ROW Directory="service_12_Dir" Directory_Parent="ASC.TelegramService_Dir" DefaultDir="service"/>
<ROW Directory="service_15_Dir" Directory_Parent="ASC.Web.Api_Dir" DefaultDir="service"/>
<ROW Directory="service_16_Dir" Directory_Parent="ASC.Web.Studio_Dir" DefaultDir="service"/>
<ROW Directory="service_1_Dir" Directory_Parent="ASC.Socket.IO_Dir" DefaultDir="service"/>
<ROW Directory="service_2_Dir" Directory_Parent="ASC.Data.Backup_Dir" DefaultDir="service"/>
<ROW Directory="service_3_Dir" Directory_Parent="ASC.Data.Backup.BackgroundTasks_Dir" DefaultDir="service"/>
<ROW Directory="service_4_Dir" Directory_Parent="ASC.Migration_Dir" DefaultDir="service"/>
<ROW Directory="service_5_Dir" Directory_Parent="ASC.SsoAuth_Dir" DefaultDir="service"/>
<ROW Directory="service_6_Dir" Directory_Parent="ASC.Migration.Runner_Dir" DefaultDir="service"/>
<ROW Directory="service_7_Dir" Directory_Parent="ASC.Files.Service_Dir" DefaultDir="service"/>
<ROW Directory="service_9_Dir" Directory_Parent="ASC.Notify_Dir" DefaultDir="service"/>
<ROW Directory="service_Dir" Directory_Parent="ASC.ClearEvents_Dir" DefaultDir="service"/>
<ROW Directory="services_Dir" Directory_Parent="APPDIR" DefaultDir="services"/>
<ROW Directory="tools_Dir" Directory_Parent="APPDIR" DefaultDir="tools"/>
<ROW Directory="conf_Dir" Directory_Parent="nginx_Dir" DefaultDir="conf" DirectoryOptions="12"/>
<ROW Directory="config_1_Dir" Directory_Parent="NewFolder_Dir" DefaultDir="config" DirectoryOptions="12"/>
<ROW Directory="config_2_Dir" Directory_Parent="service_5_Dir" DefaultDir="config" DirectoryOptions="12"/>
<ROW Directory="config_Dir" Directory_Parent="APPDIR" DefaultDir="config" DirectoryOptions="12"/>
<ROW Directory="editor_Dir" Directory_Parent="ASC.Files_Dir" DefaultDir="editor" DirectoryOptions="12"/>
<ROW Directory="includes_Dir" Directory_Parent="conf_Dir" DefaultDir="includes" DirectoryOptions="12"/>
<ROW Directory="login_Dir" Directory_Parent="ASC.Login_Dir" DefaultDir="login" DirectoryOptions="12"/>
<ROW Directory="logs_Dir" Directory_Parent="nginx_Dir" DefaultDir="logs" DirectoryOptions="12"/>
<ROW Directory="nginx_Dir" Directory_Parent="APPDIR" DefaultDir="nginx" DirectoryOptions="12"/>
<ROW Directory="products_Dir" Directory_Parent="APPDIR" DefaultDir="products" DirectoryOptions="12"/>
<ROW Directory="server_2_Dir" Directory_Parent="ASC.Files_Dir" DefaultDir="server" DirectoryOptions="12"/>
<ROW Directory="server_5_Dir" Directory_Parent="ASC.People_Dir" DefaultDir="server" DirectoryOptions="12"/>
<ROW Directory="service_11_Dir" Directory_Parent="ASC.Studio.Notify_Dir" DefaultDir="service" DirectoryOptions="12"/>
<ROW Directory="service_12_Dir" Directory_Parent="ASC.TelegramService_Dir" DefaultDir="service" DirectoryOptions="12"/>
<ROW Directory="service_15_Dir" Directory_Parent="ASC.Web.Api_Dir" DefaultDir="service" DirectoryOptions="12"/>
<ROW Directory="service_16_Dir" Directory_Parent="ASC.Web.Studio_Dir" DefaultDir="service" DirectoryOptions="12"/>
<ROW Directory="service_1_Dir" Directory_Parent="ASC.Socket.IO_Dir" DefaultDir="service" DirectoryOptions="12"/>
<ROW Directory="service_2_Dir" Directory_Parent="ASC.Data.Backup_Dir" DefaultDir="service" DirectoryOptions="12"/>
<ROW Directory="service_3_Dir" Directory_Parent="ASC.Data.Backup.BackgroundTasks_Dir" DefaultDir="service" DirectoryOptions="12"/>
<ROW Directory="service_4_Dir" Directory_Parent="ASC.Migration_Dir" DefaultDir="service" DirectoryOptions="12"/>
<ROW Directory="service_5_Dir" Directory_Parent="ASC.SsoAuth_Dir" DefaultDir="service" DirectoryOptions="12"/>
<ROW Directory="service_6_Dir" Directory_Parent="ASC.Migration.Runner_Dir" DefaultDir="service" DirectoryOptions="12"/>
<ROW Directory="service_7_Dir" Directory_Parent="ASC.Files.Service_Dir" DefaultDir="service" DirectoryOptions="12"/>
<ROW Directory="service_9_Dir" Directory_Parent="ASC.Notify_Dir" DefaultDir="service" DirectoryOptions="12"/>
<ROW Directory="service_Dir" Directory_Parent="ASC.ClearEvents_Dir" DefaultDir="service" DirectoryOptions="12"/>
<ROW Directory="services_Dir" Directory_Parent="APPDIR" DefaultDir="services" DirectoryOptions="12"/>
<ROW Directory="temp_10_Dir" Directory_Parent="service_16_Dir" DefaultDir="temp" DirectoryOptions="12"/>
<ROW Directory="temp_11_Dir" Directory_Parent="NewFolder_3_Dir" DefaultDir="temp" DirectoryOptions="12"/>
<ROW Directory="temp_12_Dir" Directory_Parent="service_12_Dir" DefaultDir="temp" DirectoryOptions="12"/>
<ROW Directory="temp_13_Dir" Directory_Parent="server_2_Dir" DefaultDir="temp" DirectoryOptions="12"/>
<ROW Directory="temp_14_Dir" Directory_Parent="server_5_Dir" DefaultDir="temp" DirectoryOptions="12"/>
<ROW Directory="temp_1_Dir" Directory_Parent="service_Dir" DefaultDir="temp" DirectoryOptions="12"/>
<ROW Directory="temp_2_Dir" Directory_Parent="service_3_Dir" DefaultDir="temp" DirectoryOptions="12"/>
<ROW Directory="temp_3_Dir" Directory_Parent="service_7_Dir" DefaultDir="temp" DirectoryOptions="12"/>
<ROW Directory="temp_4_Dir" Directory_Parent="service_2_Dir" DefaultDir="temp" DirectoryOptions="12"/>
<ROW Directory="temp_5_Dir" Directory_Parent="service_4_Dir" DefaultDir="temp" DirectoryOptions="12"/>
<ROW Directory="temp_6_Dir" Directory_Parent="service_6_Dir" DefaultDir="temp" DirectoryOptions="12"/>
<ROW Directory="temp_7_Dir" Directory_Parent="service_9_Dir" DefaultDir="temp" DirectoryOptions="12"/>
<ROW Directory="temp_8_Dir" Directory_Parent="service_11_Dir" DefaultDir="temp" DirectoryOptions="12"/>
<ROW Directory="temp_9_Dir" Directory_Parent="service_15_Dir" DefaultDir="temp" DirectoryOptions="12"/>
<ROW Directory="temp_Dir" Directory_Parent="nginx_Dir" DefaultDir="temp" DirectoryOptions="12"/>
<ROW Directory="tools_Dir" Directory_Parent="APPDIR" DefaultDir="tools" DirectoryOptions="12"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.MsiCompsComponent">
<ROW Component="AI_CustomARPName" ComponentId="{5283455D-3786-42EC-9887-FCF453E2FBF9}" Directory_="APPDIR" Attributes="4" KeyPath="DisplayName" Options="1"/>
<ROW Component="AI_DisableModify" ComponentId="{E036B14F-E2E4-4247-B9AB-55C1F6142BF9}" Directory_="APPDIR" Attributes="4" KeyPath="NoModify" Options="1"/>
<ROW Component="AI_ExePath" ComponentId="{EDF666FF-8C56-4EB7-8255-67DA879A090C}" Directory_="APPDIR" Attributes="4" KeyPath="AI_ExePath"/>
<ROW Component="APPDIR" ComponentId="{E32A4F89-E985-4E8E-AB26-DFCD685A316B}" Directory_="APPDIR" Attributes="0"/>
<ROW Component="ASC.ClearEvents" ComponentId="{73FB7C9B-9AA8-4BB6-A2C3-E85F6B5BE1D5}" Directory_="ASC.ClearEvents_Dir" Attributes="0"/>
<ROW Component="ASC.ClearEvents.exe" ComponentId="{208F2E9D-F72D-47D8-8B6E-0B85E3EAD12E}" Directory_="service_Dir" Attributes="0" KeyPath="ASC.ClearEvents.exe"/>
<ROW Component="ASC.Data.Backup" ComponentId="{DDE1435C-947F-4507-B55B-B0594193F8E4}" Directory_="ASC.Data.Backup_Dir" Attributes="0"/>
<ROW Component="ASC.Data.Backup.BackgroundTasks" ComponentId="{E6D04525-2108-45E9-8DC2-AD692A66026A}" Directory_="ASC.Data.Backup.BackgroundTasks_Dir" Attributes="0"/>
<ROW Component="ASC.Data.Backup.BackgroundTasks.exe" ComponentId="{CB715B3B-BFC0-4A4D-8B47-B1DB7A99A49E}" Directory_="service_3_Dir" Attributes="0" KeyPath="ASC.Data.Backup.BackgroundTasks.exe"/>
<ROW Component="ASC.Data.Backup.exe" ComponentId="{240665F1-DDCF-4FFB-ABEE-2F784ACD87E6}" Directory_="service_2_Dir" Attributes="256" KeyPath="ASC.Data.Backup.exe"/>
<ROW Component="ASC.Files" ComponentId="{7D4356CB-8A55-4528-8CF6-E3C6181DC119}" Directory_="ASC.Files_Dir" Attributes="0"/>
<ROW Component="ASC.Files.Service" ComponentId="{10E5C648-6B24-40DB-926A-4E26E7ABBE7E}" Directory_="ASC.Files.Service_Dir" Attributes="0"/>
<ROW Component="ASC.Files.Service.exe" ComponentId="{14D153CC-E7A6-4818-A310-9CE1F332DCDA}" Directory_="service_7_Dir" Attributes="256" KeyPath="ASC.Files.Service.exe"/>
<ROW Component="ASC.Files.exe" ComponentId="{4D48DD81-BABF-4E1C-A216-C72C1EA8428B}" Directory_="server_2_Dir" Attributes="256" KeyPath="ASC.Files.exe"/>
<ROW Component="ASC.Login" ComponentId="{323B1636-C7E9-4DA2-8575-92D939FA381F}" Directory_="ASC.Login_Dir" Attributes="0"/>
<ROW Component="ASC.Migration" ComponentId="{26C33C84-C6FC-4DDB-8DFA-F7012F29C4EC}" Directory_="ASC.Migration_Dir" Attributes="0"/>
<ROW Component="ASC.Migration.Runner" ComponentId="{C03F968B-6259-4CE7-89C7-3236EDD2170C}" Directory_="ASC.Migration.Runner_Dir" Attributes="0"/>
<ROW Component="ASC.Migration.Runner.exe" ComponentId="{124E8A20-2ECA-4DC0-ACD9-DBEA64CCF2CF}" Directory_="service_6_Dir" Attributes="256" KeyPath="ASC.Migration.Runner.exe"/>
<ROW Component="ASC.Migration.exe" ComponentId="{C65B4FF9-AAE7-41EF-B05F-737FF78DEB4F}" Directory_="service_4_Dir" Attributes="0" KeyPath="ASC.Migration.exe"/>
<ROW Component="ASC.Notify" ComponentId="{A94C4D5B-1426-4B3D-ACF5-0C316E4E792D}" Directory_="ASC.Notify_Dir" Attributes="0"/>
<ROW Component="ASC.Notify.exe" ComponentId="{7457E31A-B6FC-4A71-A5C0-174C9E965051}" Directory_="service_9_Dir" Attributes="256" KeyPath="ASC.Notify.exe"/>
<ROW Component="ASC.People" ComponentId="{8FDAD389-26DF-47BE-8DC5-A9DE5DF3BD22}" Directory_="ASC.People_Dir" Attributes="0"/>
<ROW Component="ASC.People.exe" ComponentId="{044D57BC-8BAC-4D64-AB36-141BAA1F2E15}" Directory_="server_5_Dir" Attributes="256" KeyPath="ASC.People.exe"/>
<ROW Component="ASC.Socket.IO" ComponentId="{A22A1FDB-2706-4133-812D-0AA1E5B5BF02}" Directory_="ASC.Socket.IO_Dir" Attributes="0"/>
<ROW Component="ASC.SsoAuth" ComponentId="{0A4502F2-6D3B-491B-86B1-BDC54C78FE18}" Directory_="ASC.SsoAuth_Dir" Attributes="0"/>
<ROW Component="ASC.Studio.Notify" ComponentId="{49CD6FD5-5B49-4CB9-8EDD-654922F11F88}" Directory_="ASC.Studio.Notify_Dir" Attributes="0"/>
<ROW Component="ASC.Studio.Notify.exe" ComponentId="{AFB3D13A-4F5B-46E1-8819-3517A228C22B}" Directory_="service_11_Dir" Attributes="256" KeyPath="ASC.Studio.Notify.exe"/>
<ROW Component="ASC.TelegramService" ComponentId="{57B76E6A-DEF4-4242-96D4-E43AEBC68A97}" Directory_="ASC.TelegramService_Dir" Attributes="0"/>
<ROW Component="ASC.TelegramService.exe" ComponentId="{475A1DBC-3864-434E-86E2-497D70D39BDE}" Directory_="service_12_Dir" Attributes="256" KeyPath="ASC.TelegramService.exe"/>
<ROW Component="ASC.UrlShortener" ComponentId="{B5FB450A-789E-4096-BE2D-7E9E92FA665C}" Directory_="ASC.UrlShortener_Dir" Attributes="0"/>
<ROW Component="ASC.Web.Api" ComponentId="{CFFB4D5A-23D0-4BD6-BB8D-A62FCE92B883}" Directory_="ASC.Web.Api_Dir" Attributes="0"/>
<ROW Component="ASC.Web.Api.exe" ComponentId="{E726DF21-2E7E-4C62-8F6E-C63C65B041EC}" Directory_="service_15_Dir" Attributes="256" KeyPath="ASC.Web.Api.exe"/>
<ROW Component="ASC.Web.Studio" ComponentId="{8C58AEA7-5FC3-4506-ACF6-611A801D0426}" Directory_="ASC.Web.Studio_Dir" Attributes="0"/>
<ROW Component="ASC.Web.Studio.exe" ComponentId="{00F95035-98D9-44AD-9DB4-B34306EE2170}" Directory_="service_16_Dir" Attributes="256" KeyPath="ASC.Web.Studio.exe"/>
<ROW Component="ASC.Webhooks.Service" ComponentId="{9B39D301-7EAD-48C8-A88C-A3570C132D08}" Directory_="ASC.Webhooks.Service_Dir" Attributes="0"/>
<ROW Component="ASC.Webhooks.Service.exe" ComponentId="{9D6002C5-A610-4B28-982C-2DB794571878}" Directory_="NewFolder_3_Dir" Attributes="0" KeyPath="ASC.Webhooks.Service.exe"/>
<ROW Component="DocEditor.exe" ComponentId="{FBE9155F-9ACD-4A1A-9198-891ED73BA90C}" Directory_="tools_Dir" Attributes="0" KeyPath="DocEditor.exe"/>
<ROW Component="Login.exe" ComponentId="{FBE9155F-9ACD-4A1A-9198-891ED73BA202}" Directory_="tools_Dir" Attributes="0" KeyPath="Login.exe"/>
<ROW Component="Logs" ComponentId="{6C28AF1C-0190-4DE3-A753-430496711F3C}" Directory_="Logs_Dir" Attributes="0"/>
<ROW Component="ProductInformation" ComponentId="{5FB28D19-6A7D-4078-901F-58C2DF0DE176}" Directory_="APPDIR" Attributes="4" KeyPath="Version"/>
<ROW Component="Proxy.exe" ComponentId="{913596AD-5C75-4418-8C3A-FAB2A70530DB}" Directory_="tools_Dir" Attributes="0" KeyPath="Proxy.exe"/>
<ROW Component="Socket.IO.exe" ComponentId="{D08CDE1C-FB16-49AB-98A2-92FD887774F1}" Directory_="tools_Dir" Attributes="0" KeyPath="Socket.IO.exe"/>
<ROW Component="SsoAuth.exe" ComponentId="{B4A48C44-5FC0-43D8-9CFB-EB4A4AAB4169}" Directory_="tools_Dir" Attributes="0" KeyPath="SsoAuth.exe"/>
<ROW Component="UrlShortener.exe" ComponentId="{1F1D4189-385A-4AE1-8011-A82ED137DA22}" Directory_="tools_Dir" Attributes="0" KeyPath="UrlShortener.exe"/>
<ROW Component="conf" ComponentId="{88EC3AED-DF73-4B66-A228-9A87CFB5519D}" Directory_="conf_Dir" Attributes="0"/>
<ROW Component="config" ComponentId="{B58E086D-0CB4-4F53-8411-3AE5A46D1DE4}" Directory_="config_Dir" Attributes="0"/>
<ROW Component="config_socketio" ComponentId="{4F28A197-AD56-48D0-9E97-9F88A73BE24E}" Directory_="NewFolder_1_Dir" Attributes="0"/>
<ROW Component="config_ssoauth" ComponentId="{D51A4591-143D-4C91-8665-BED153555AC0}" Directory_="config_2_Dir" Attributes="0"/>
<ROW Component="config_urlshortener" ComponentId="{3A8A13E2-9BAA-485B-9E09-A6AD3EF70127}" Directory_="config_1_Dir" Attributes="0"/>
<ROW Component="favicon.ico" ComponentId="{31B18A50-6FF2-4C5E-8A1F-018247C8C55C}" Directory_="public_Dir" Attributes="0" KeyPath="favicon.ico" Type="0"/>
<ROW Component="proxy.exe" ComponentId="{913596AD-5C75-4418-8C3A-FAB2A70530DB}" Directory_="tools_Dir" Attributes="0" KeyPath="proxy.exe"/>
<ROW Component="proxy.xml" ComponentId="{92B2BA6A-009B-4731-A0E2-A6C729DC8A68}" Directory_="tools_Dir" Attributes="0" KeyPath="proxy.xml" Type="0"/>
<ROW Component="public" ComponentId="{025757D9-89DC-4136-A278-2B273D3A741A}" Directory_="public_Dir" Attributes="0"/>
<ROW Component="editor" ComponentId="{7BB6D12C-B38B-435D-8A86-2D5D2AB0543F}" Directory_="editor_Dir" Attributes="0"/>
<ROW Component="includes" ComponentId="{6F7827D0-7F14-4F09-BB3C-98E0633F5D1B}" Directory_="includes_Dir" Attributes="0"/>
<ROW Component="login" ComponentId="{17166A18-3A7B-44FF-A6A3-0938FD45B107}" Directory_="login_Dir" Attributes="0"/>
<ROW Component="logs" ComponentId="{183C2BF5-A348-407D-BEB4-8A5A6C3D7DB8}" Directory_="logs_Dir" Attributes="0"/>
<ROW Component="nginx" ComponentId="{F6782189-7D44-4DDE-B1A5-5DF8D2B839F5}" Directory_="nginx_Dir" Attributes="0"/>
<ROW Component="products" ComponentId="{5A3B0279-AFE0-456F-9685-5422D5E731B6}" Directory_="products_Dir" Attributes="0"/>
<ROW Component="server_ASC.Files" ComponentId="{8B02814C-6260-4A36-8C09-26AF31CDE52A}" Directory_="server_2_Dir" Attributes="0"/>
<ROW Component="server_ASC.People" ComponentId="{BDBA6378-A15F-44CC-BD6E-232FB7CFBA59}" Directory_="server_5_Dir" Attributes="0"/>
<ROW Component="service_ASC.ClearEvents" ComponentId="{1BDE62CE-18DF-4372-9B95-41287FA84740}" Directory_="service_Dir" Attributes="0"/>
<ROW Component="service_ASC.Data.Backup" ComponentId="{F5899AA1-8093-4BB3-862C-34A782831A72}" Directory_="service_2_Dir" Attributes="0"/>
<ROW Component="service_ASC.Data.Backup.BachgroundTasks" ComponentId="{CCF47514-0441-44B9-A77D-C4E5619638BB}" Directory_="service_3_Dir" Attributes="0"/>
<ROW Component="service_ASC.File.Service" ComponentId="{C94C9F5B-91E0-4AE3-8A7B-752198128A1E}" Directory_="service_7_Dir" Attributes="0"/>
<ROW Component="service_ASC.Migration" ComponentId="{F209787D-632E-4E20-8415-7D71DBAE5B5A}" Directory_="service_4_Dir" Attributes="0"/>
<ROW Component="service_ASC.Migration.Runner" ComponentId="{A21DD084-2228-4E0E-9F32-7A04F6766F8D}" Directory_="service_6_Dir" Attributes="0"/>
<ROW Component="service_ASC.Notify" ComponentId="{1A0897FF-9EBE-4D01-AFC5-3CBF264CA6C2}" Directory_="service_9_Dir" Attributes="0"/>
<ROW Component="service_ASC.Socket.IO" ComponentId="{F050F8C3-24CF-45F6-AFA4-05F2C121BA1E}" Directory_="service_1_Dir" Attributes="0"/>
<ROW Component="service_ASC.SsoAuth" ComponentId="{1DD71548-898E-4C6D-9D54-7DB4ABF7E976}" Directory_="service_5_Dir" Attributes="0"/>
<ROW Component="service_ASC.Studio.Notify" ComponentId="{C30289A6-F81B-4C4B-9C77-969DBD83EF66}" Directory_="service_11_Dir" Attributes="0"/>
<ROW Component="service_ASC.TelegramService" ComponentId="{1CB6D2E9-EE2F-4FEC-82E6-77B775303032}" Directory_="service_12_Dir" Attributes="0"/>
<ROW Component="service_ASC.Urlshortner" ComponentId="{B8D83118-B7EA-4C8D-85AD-01A0098561D9}" Directory_="NewFolder_Dir" Attributes="0"/>
<ROW Component="service_ASC.Web.Studio" ComponentId="{24E30A59-BC9C-4497-9B31-9FDD1130851B}" Directory_="service_16_Dir" Attributes="0"/>
<ROW Component="service_ASC.WebApi" ComponentId="{C9664C57-4333-4E95-B94E-E78C6CB28058}" Directory_="service_15_Dir" Attributes="0"/>
<ROW Component="service_ASC.Webhooks.Service" ComponentId="{EB2FD18F-FEAD-4C36-9B8B-556E7D84AE28}" Directory_="NewFolder_3_Dir" Attributes="0"/>
<ROW Component="services" ComponentId="{8F9FE4E0-772E-487A-A61D-7019807D88D4}" Directory_="services_Dir" Attributes="0"/>
<ROW Component="temp_ASC.ClearEvents" ComponentId="{0D0BC98A-425B-4217-B420-4DA6B25F23DD}" Directory_="temp_1_Dir" Attributes="0"/>
<ROW Component="temp_ASC.Data.Backup.BackgroundTasks" ComponentId="{29E2557D-6012-44B2-A9D4-D773157411E2}" Directory_="temp_2_Dir" Attributes="0"/>
<ROW Component="temp_ASC.Data.Buckup" ComponentId="{53DD808E-59C8-471C-8F2B-05F7ED92D2A7}" Directory_="temp_4_Dir" Attributes="0"/>
<ROW Component="temp_ASC.File.Service" ComponentId="{D36D733E-3659-46FB-9127-876F179702BD}" Directory_="temp_3_Dir" Attributes="0"/>
<ROW Component="temp_ASC.Files" ComponentId="{B25665D3-EB6F-4010-A93A-2423983A426A}" Directory_="temp_13_Dir" Attributes="0"/>
<ROW Component="temp_ASC.Migration" ComponentId="{BEA71B3C-222C-4565-B0D1-A5671BE029F5}" Directory_="temp_5_Dir" Attributes="0"/>
<ROW Component="temp_ASC.Migration.Runner" ComponentId="{3B95B108-8CEE-487D-AE0B-2E93C1749611}" Directory_="temp_6_Dir" Attributes="0"/>
<ROW Component="temp_ASC.Notify" ComponentId="{471221C5-3F91-476D-B87F-F504AC55D9A6}" Directory_="temp_7_Dir" Attributes="0"/>
<ROW Component="temp_ASC.People" ComponentId="{F4E45171-654B-455B-A261-A7C52830AEC0}" Directory_="temp_14_Dir" Attributes="0"/>
<ROW Component="temp_ASC.Studio.Notify" ComponentId="{F61A9699-F7DF-47F7-BE8B-B57ED43CCAC6}" Directory_="temp_8_Dir" Attributes="0"/>
<ROW Component="temp_ASC.TelegramService" ComponentId="{0BF04783-7F52-4926-B269-E1C6B9C90CF8}" Directory_="temp_12_Dir" Attributes="0"/>
<ROW Component="temp_ASC.Web.Api" ComponentId="{BBE4771E-AF81-4B40-84C8-AACD26A8AAEE}" Directory_="temp_9_Dir" Attributes="0"/>
<ROW Component="temp_ASC.Web.Studio" ComponentId="{50C05886-70FB-42A5-B4F9-333B317B1E25}" Directory_="temp_10_Dir" Attributes="0"/>
<ROW Component="temp_ASC.Webhooks.Service" ComponentId="{21F5F636-660F-4116-9DB2-9BFDC0365708}" Directory_="temp_11_Dir" Attributes="0"/>
<ROW Component="temp_nginx" ComponentId="{44C32C3C-30B2-4FB2-B6C0-F88B4C3F3F26}" Directory_="temp_Dir" Attributes="0"/>
<ROW Component="tools" ComponentId="{3BE057FE-EC94-4514-8961-A8660D9E6EB4}" Directory_="tools_Dir" Attributes="0"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.MsiFeatsComponent">
<ROW Feature="MainFeature" Title="MainFeature" Description="Description" Display="1" Level="1" Directory_="APPDIR" Attributes="0"/>
@ -174,20 +262,17 @@
<ROW File="ASC.TelegramService.exe" Component_="ASC.TelegramService.exe" FileName="ASCTEL~1.EXE|ASC.TelegramService.exe" Attributes="0" SourcePath="Files\services\ASC.TelegramService\service\ASC.TelegramService.exe" SelfReg="false" DigSign="true"/>
<ROW File="ASC.Web.Studio.exe" Component_="ASC.Web.Studio.exe" FileName="ASCWEB~1.EXE|ASC.Web.Studio.exe" Attributes="0" SourcePath="Files\services\ASC.Web.Studio\service\ASC.Web.Studio.exe" SelfReg="false" DigSign="true"/>
<ROW File="ASC.Web.Api.exe" Component_="ASC.Web.Api.exe" FileName="ASCWEB~1.EXE|ASC.Web.Api.exe" Attributes="0" SourcePath="Files\services\ASC.Web.Api\service\ASC.Web.Api.exe" SelfReg="false" DigSign="true"/>
<ROW File="proxy.exe" Component_="proxy.exe" FileName="ONLYO~13.EXE|proxy.exe" Attributes="0" SourcePath="Files\tools\proxy.exe" SelfReg="false" DigSign="true"/>
<ROW File="proxy.xml" Component_="proxy.xml" FileName="ONLYO~13.XML|proxy.xml" Attributes="0" SourcePath="Files\tools\proxy.xml" SelfReg="false"/>
<ROW File="Proxy.exe" Component_="Proxy.exe" FileName="Proxy.exe" Attributes="0" SourcePath="Files\tools\Proxy.exe" SelfReg="false" DigSign="true"/>
<ROW File="Socket.IO.exe" Component_="Socket.IO.exe" FileName="SOCKET~1.EXE|Socket.IO.exe" Attributes="0" SourcePath="Files\tools\Socket.IO.exe" SelfReg="false" DigSign="true"/>
<ROW File="Socket.IO.xml" Component_="proxy.xml" FileName="SOCKET~1.XML|Socket.IO.xml" Attributes="0" SourcePath="Files\tools\Socket.IO.xml" SelfReg="false"/>
<ROW File="SsoAuth.exe" Component_="SsoAuth.exe" FileName="SsoAuth.exe" Attributes="0" SourcePath="Files\tools\SsoAuth.exe" SelfReg="false" DigSign="true"/>
<ROW File="SsoAuth.xml" Component_="proxy.xml" FileName="SsoAuth.xml" Attributes="0" SourcePath="Files\tools\SsoAuth.xml" SelfReg="false"/>
<ROW File="UrlShortener.exe" Component_="UrlShortener.exe" FileName="URLSHO~1.EXE|UrlShortener.exe" Attributes="0" SourcePath="Files\tools\UrlShortener.exe" SelfReg="false" DigSign="true"/>
<ROW File="UrlShortener.xml" Component_="proxy.xml" FileName="URLSHO~1.XML|UrlShortener.xml" Attributes="0" SourcePath="Files\tools\UrlShortener.xml" SelfReg="false"/>
<ROW File="ASC.ClearEvents.exe" Component_="ASC.ClearEvents.exe" FileName="ASCCLE~1.EXE|ASC.ClearEvents.exe" Attributes="0" SourcePath="Files\services\ASC.ClearEvents\service\ASC.ClearEvents.exe" SelfReg="false" DigSign="true"/>
<ROW File="ASC.Data.Backup.BackgroundTasks.exe" Component_="ASC.Data.Backup.BackgroundTasks.exe" FileName="ASCDAT~1.EXE|ASC.Data.Backup.BackgroundTasks.exe" Attributes="0" SourcePath="Files\services\ASC.Data.Backup.BackgroundTasks\service\ASC.Data.Backup.BackgroundTasks.exe" SelfReg="false" DigSign="true"/>
<ROW File="ASC.Migration.exe" Component_="ASC.Migration.exe" FileName="ASCMIG~1.EXE|ASC.Migration.exe" Attributes="0" SourcePath="Files\services\ASC.Migration\service\ASC.Migration.exe" SelfReg="false" DigSign="true"/>
<ROW File="ASC.Webhooks.Service.exe" Component_="ASC.Webhooks.Service.exe" FileName="ASCWEB~1.EXE|ASC.Webhooks.Service.exe" Attributes="0" SourcePath="Files\services\ASC.Webhooks.Service\service\ASC.Webhooks.Service.exe" SelfReg="false" DigSign="true"/>
<ROW File="ASC.Migration.Runner.exe" Component_="ASC.Migration.Runner.exe" FileName="ASCMIG~2.EXE|ASC.Migration.Runner.exe" Attributes="0" SourcePath="Files\services\ASC.Migration.Runner\service\ASC.Migration.Runner.exe" SelfReg="false" DigSign="true"/>
<ROW File="favicon.ico" Component_="favicon.ico" FileName="favicon.ico" Attributes="0" SourcePath="Files\public\favicon.ico" SelfReg="false" DigSign="true"/>
<ROW File="DocEditor.exe" Component_="DocEditor.exe" FileName="DOCEDI~1.EXE|DocEditor.exe" Attributes="0" SourcePath="Files\tools\DocEditor.exe" SelfReg="false" DigSign="true"/>
<ROW File="Login.exe" Component_="Login.exe" FileName="LOGIN~1.EXE|Login.exe" Attributes="0" SourcePath="Files\tools\Login.exe" SelfReg="false" DigSign="true"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.BootstrOptComponent">
<ROW BootstrOptKey="GlobalOptions" DownloadFolder="[AppDataFolder][|Manufacturer]\[|ProductName]\prerequisites" Options="2"/>
@ -222,15 +307,79 @@
<ROW Fragment="WelcomePrereqDlg.aip" Path="&lt;AI_THEMES&gt;classic\fragments\WelcomePrereqDlg.aip"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.JsonFileComponent">
<ROW JsonFile="Newfile.json_1" FileName="APPSET~1.JSO|appsettings.test.json" DirProperty="config_Dir" Component="AI_ExePath" RootProperty="Root_1" Flags="6" IndentUnits="2"/>
<ROW JsonFile="Newfile.json" FileName="ELASTI~1.JSO|elastic.test.json" DirProperty="config_Dir" Component="config" RootProperty="Root" Flags="6" IndentUnits="2"/>
<ROW JsonFile="Newfile.json_1" FileName="APPSET~1.JSO|appsettings.test.json" DirProperty="config_Dir" Component="config" RootProperty="Root_1" Flags="6" IndentUnits="2"/>
<ROW JsonFile="Newfile.json_2" FileName="RABBIT~1.JSO|rabbitmq.test.json" DirProperty="config_Dir" Component="config" RootProperty="Root_2" Flags="6" IndentUnits="2"/>
<ROW JsonFile="Newfile.json_3" FileName="REDIST~1.JSO|redis.test.json" DirProperty="config_Dir" Component="config" RootProperty="Root_3" Flags="6" IndentUnits="2"/>
<ROW JsonFile="Newfile.json_4" FileName="APPSET~2.JSO|appsettings.services.json" DirProperty="config_Dir" Component="config" RootProperty="Root_4" Flags="6" IndentUnits="2"/>
<ROW JsonFile="Newfile.json_5" FileName="APPSET~3.JSO|appsettings.json" DirProperty="config_Dir" Component="config" RootProperty="Root_5" Flags="6" IndentUnits="2"/>
<ROW JsonFile="Newfile.json_6" FileName="CONFIG~1.JSO|config.json" DirProperty="NewFolder_1_Dir" Component="config_socketio" RootProperty="Root_6" Flags="6" IndentUnits="2"/>
<ROW JsonFile="config.json" FileName="CONFIG~1.JSO|config.json" DirProperty="config_2_Dir" Component="config_ssoauth" RootProperty="Root_7" Flags="6" IndentUnits="2"/>
<ROW JsonFile="config.json_1" FileName="CONFIG~1.JSO|config.json" DirProperty="config_1_Dir" Component="config_urlshortener" RootProperty="Root_8" Flags="6" IndentUnits="2"/>
<ROW JsonFile="config.json_2" FileName="CONFIG~1.JSO|config.json" DirProperty="login_Dir" Component="login" RootProperty="Root_9" Flags="6" IndentUnits="2"/>
<ROW JsonFile="config.json_3" FileName="CONFIG~1.JSO|config.json" DirProperty="editor_Dir" Component="editor" RootProperty="Root_10" Flags="6" IndentUnits="2"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.JsonPropertyComponent">
<ROW JsonProperty="ConnectionStrings_1" Parent="Root_1" Name="ConnectionStrings" Condition="1" Order="0" Flags="60"/>
<ROW JsonProperty="Host" Parent="elastic" Name="Host" Condition="1" Order="0" Flags="57" Value="[ELASTICSEARCH_HOST]"/>
<ROW JsonProperty="Host_1" Parent="_" Name="Host" Condition="1" Order="0" Flags="57" Value="[REDIS_HOST_PROP]"/>
<ROW JsonProperty="Hostname" Parent="RabbitMQ" Name="Hostname" Condition="1" Order="0" Flags="57" Value="[RABBITMQ_HOSTNAME_PROP]"/>
<ROW JsonProperty="Hosts" Parent="Redis" Name="Hosts" Condition="1" Order="0" Flags="61"/>
<ROW JsonProperty="PORT" Parent="Root_9" Name="PORT" Condition="1" Order="1" Flags="57" Value="[Login_Port]"/>
<ROW JsonProperty="PORT_1" Parent="Root_10" Name="PORT" Condition="1" Order="1" Flags="57" Value="[Editor_Port]"/>
<ROW JsonProperty="Password" Parent="RabbitMQ" Name="Password" Condition="1" Order="2" Flags="57" Value="[RABBITMQ_PASSWORD_PROP]"/>
<ROW JsonProperty="Port" Parent="elastic" Name="Port" Condition="1" Order="2" Flags="57" Value="[ELASTICSEARCH_PORT]"/>
<ROW JsonProperty="Port_1" Parent="RabbitMQ" Name="Port" Condition="1" Order="3" Flags="59" Value="[RABBITMQ_PORT_PROP]"/>
<ROW JsonProperty="Port_2" Parent="_" Name="Port" Condition="1" Order="1" Flags="57" Value="[REDIS_PORT_PROP]"/>
<ROW JsonProperty="RabbitMQ" Parent="Root_2" Name="RabbitMQ" Condition="1" Order="0" Flags="60"/>
<ROW JsonProperty="Redis" Parent="Root_3" Name="Redis" Condition="1" Order="0" Flags="60"/>
<ROW JsonProperty="Root" Name="Root" Condition="1" Order="0" Flags="60"/>
<ROW JsonProperty="Root_1" Name="Root" Condition="1" Order="0" Flags="60"/>
<ROW JsonProperty="Root_10" Name="Root" Condition="1" Order="0" Flags="60"/>
<ROW JsonProperty="Root_2" Name="Root" Condition="1" Order="0" Flags="60"/>
<ROW JsonProperty="Root_3" Name="Root" Condition="1" Order="0" Flags="60"/>
<ROW JsonProperty="Root_4" Name="Root" Condition="1" Order="0" Flags="60"/>
<ROW JsonProperty="Root_5" Name="Root" Condition="1" Order="0" Flags="60"/>
<ROW JsonProperty="Root_6" Name="Root" Condition="1" Order="0" Flags="60"/>
<ROW JsonProperty="Root_7" Name="Root" Condition="1" Order="0" Flags="60"/>
<ROW JsonProperty="Root_8" Name="Root" Condition="1" Order="0" Flags="60"/>
<ROW JsonProperty="Root_9" Name="Root" Condition="1" Order="0" Flags="60"/>
<ROW JsonProperty="Scheme" Parent="elastic" Name="Scheme" Condition="1" Order="1" Flags="57" Value="[ELASTICSEARCH_SCHEME]"/>
<ROW JsonProperty="UserName" Parent="RabbitMQ" Name="UserName" Condition="1" Order="1" Flags="57" Value="[RABBITMQ_USERNAME_PROP]"/>
<ROW JsonProperty="VirtualHost" Parent="RabbitMQ" Name="VirtualHost" Condition="1" Order="4" Flags="57" Value="[RABBITMQ_VIRTUALHOST_PROP]"/>
<ROW JsonProperty="_" Parent="Hosts" Name="0" Condition="1" Order="0" Flags="60"/>
<ROW JsonProperty="app" Parent="Root_6" Name="app" Condition="1" Order="0" Flags="60"/>
<ROW JsonProperty="app_1" Parent="Root_7" Name="app" Condition="1" Order="0" Flags="60"/>
<ROW JsonProperty="app_2" Parent="Root_8" Name="app" Condition="1" Order="0" Flags="60"/>
<ROW JsonProperty="app_3" Parent="Root_9" Name="app" Condition="1" Order="0" Flags="60"/>
<ROW JsonProperty="app_4" Parent="Root_10" Name="app" Condition="1" Order="0" Flags="60"/>
<ROW JsonProperty="appsettings" Parent="app" Name="appsettings" Condition="1" Order="1" Flags="57" Value="[APPDIR_FORWARD_SLASH]config"/>
<ROW JsonProperty="appsettings_1" Parent="app_1" Name="appsettings" Condition="1" Order="1" Flags="57" Value="[APPDIR_FORWARD_SLASH]config"/>
<ROW JsonProperty="appsettings_2" Parent="app_2" Name="appsettings" Condition="1" Order="1" Flags="57" Value="[APPDIR_FORWARD_SLASH]config"/>
<ROW JsonProperty="appsettings_3" Parent="app_3" Name="appsettings" Condition="1" Order="0" Flags="57" Value="[APPDIR_FORWARD_SLASH]config"/>
<ROW JsonProperty="appsettings_4" Parent="app_4" Name="appsettings" Condition="1" Order="0" Flags="57" Value="[APPDIR_FORWARD_SLASH]config"/>
<ROW JsonProperty="connectionString_1" Parent="default_1" Name="connectionString" Condition="1" Order="0" Flags="57" Value="Server=[SERVER_PROP];Port=3306;Database=[DATABASE_PROP];User ID=[USERNAME_PROP];Password=[PASSWORD_PROP];Pooling=true;Character Set=utf8;AutoEnlist=false;SSL Mode=none"/>
<ROW JsonProperty="core" Parent="Root_4" Name="core" Condition="1" Order="0" Flags="60"/>
<ROW JsonProperty="core_1" Parent="Root_5" Name="core" Condition="1" Order="0" Flags="60"/>
<ROW JsonProperty="core_2" Parent="Root_1" Name="core" Condition="1" Order="2" Flags="60"/>
<ROW JsonProperty="default_1" Parent="ConnectionStrings_1" Name="default" Condition="1" Order="0" Flags="60"/>
<ROW JsonProperty="elastic" Parent="Root" Name="elastic" Condition="1" Order="0" Flags="60"/>
<ROW JsonProperty="enabled" Parent="migration" Name="enabled" Condition="1" Order="0" Flags="57" Value="[DATABASE_MIGRATION]"/>
<ROW JsonProperty="environment" Parent="app" Name="environment" Condition="1" Order="2" Flags="57" Value="[ENVIRONMENT]"/>
<ROW JsonProperty="environment_1" Parent="app_1" Name="environment" Condition="1" Order="2" Flags="57" Value="[ENVIRONMENT]"/>
<ROW JsonProperty="environment_2" Parent="app_2" Name="environment" Condition="1" Order="2" Flags="57" Value="[ENVIRONMENT]"/>
<ROW JsonProperty="folder" Parent="products" Name="folder" Condition="1" Order="0" Flags="57" Value="[APPDIR_FORWARD_SLASH]products"/>
<ROW JsonProperty="folder_1" Parent="products_1" Name="folder" Condition="1" Order="0" Flags="57" Value="[APPDIR_FORWARD_SLASH]products"/>
<ROW JsonProperty="logPath" Parent="Root_4" Name="logPath" Condition="1" Order="1" Flags="57" Value="[APPDIR_FORWARD_SLASH]Logs"/>
<ROW JsonProperty="machinekey" Parent="core_2" Name="machinekey" Condition="1" Order="0" Flags="57" Value="[MACHINE_KEY]"/>
<ROW JsonProperty="machinekey_1" Parent="app_1" Name="machinekey" Condition="1" Order="3" Flags="57" Value="[MACHINE_KEY]"/>
<ROW JsonProperty="machinekey_2" Parent="core_1" Name="machinekey" Condition="1" Order="0" Flags="57" Value="[MACHINE_KEY]"/>
<ROW JsonProperty="migration" Parent="Root_1" Name="migration" Condition="1" Order="1" Flags="60"/>
<ROW JsonProperty="port" Parent="app" Name="port" Condition="1" Order="0" Flags="57" Value="[Socket.IO_Port]"/>
<ROW JsonProperty="port_1" Parent="app_1" Name="port" Condition="1" Order="0" Flags="57" Value="[SsoAuth_port]"/>
<ROW JsonProperty="port_2" Parent="app_2" Name="port" Condition="1" Order="0" Flags="57" Value="[UrlShortener_Port]"/>
<ROW JsonProperty="products" Parent="core" Name="products" Condition="1" Order="0" Flags="60"/>
<ROW JsonProperty="products_1" Parent="core_2" Name="products" Condition="1" Order="1" Flags="60"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.MsiActionTextComponent">
<ROW Action="AI_ConfigFailActions" Description="Configure service failure actions" DescriptionLocId="ActionText.Description.AI_ConfigFailActions" Template="Service: [1]" TemplateLocId="ActionText.Template.AI_ConfigFailActions"/>
@ -255,7 +404,6 @@
<ROW Property="AI_SETUPEXEPATH" Signature_="AI_EXE_PATH_CU" Builds="DefaultBuild"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.MsiBinaryComponent">
<ROW Name="PowerShellScriptLauncher.dll" SourcePath="&lt;AI_CUSTACTS&gt;PowerShellScriptLauncher.dll"/>
<ROW Name="Prereq.dll" SourcePath="&lt;AI_CUSTACTS&gt;Prereq.dll"/>
<ROW Name="SoftwareDetector.dll" SourcePath="&lt;AI_CUSTACTS&gt;SoftwareDetector.dll"/>
<ROW Name="TxtUpdater.dll" SourcePath="&lt;AI_CUSTACTS&gt;TxtUpdater.dll"/>
@ -265,6 +413,7 @@
<ROW Name="dialog.bmp" SourcePath="Resources\dialog.bmp"/>
<ROW Name="jsonCfg.dll" SourcePath="&lt;AI_CUSTACTS&gt;jsonCfg.dll"/>
<ROW Name="lzmaextractor.dll" SourcePath="&lt;AI_CUSTACTS&gt;lzmaextractor.dll"/>
<ROW Name="userAccounts.dll" SourcePath="&lt;AI_CUSTACTS&gt;userAccounts.dll"/>
<ROW Name="utils.vbs" SourcePath="utils.vbs"/>
<ROW Name="viewer.exe" SourcePath="&lt;AI_CUSTACTS&gt;viewer.exe"/>
</COMPONENT>
@ -578,12 +727,72 @@
<ROW Directory_="config_1_Dir" Component_="config_urlshortener" ManualDelete="false"/>
<ROW Directory_="config_2_Dir" Component_="config_ssoauth" ManualDelete="false"/>
<ROW Directory_="NewFolder_1_Dir" Component_="config_socketio" ManualDelete="false"/>
<ROW Directory_="public_Dir" Component_="public" ManualDelete="true"/>
<ROW Directory_="login_Dir" Component_="login" ManualDelete="false"/>
<ROW Directory_="editor_Dir" Component_="editor" ManualDelete="false"/>
<ROW Directory_="conf_Dir" Component_="conf" ManualDelete="false"/>
<ROW Directory_="includes_Dir" Component_="includes" ManualDelete="false"/>
<ROW Directory_="nginx_Dir" Component_="nginx" ManualDelete="false"/>
<ROW Directory_="tools_Dir" Component_="tools" ManualDelete="false"/>
<ROW Directory_="products_Dir" Component_="products" ManualDelete="false"/>
<ROW Directory_="ASC.Files_Dir" Component_="ASC.Files" ManualDelete="false"/>
<ROW Directory_="server_2_Dir" Component_="server_ASC.Files" ManualDelete="false"/>
<ROW Directory_="ASC.Login_Dir" Component_="ASC.Login" ManualDelete="false"/>
<ROW Directory_="ASC.People_Dir" Component_="ASC.People" ManualDelete="false"/>
<ROW Directory_="server_5_Dir" Component_="server_ASC.People" ManualDelete="false"/>
<ROW Directory_="services_Dir" Component_="services" ManualDelete="false"/>
<ROW Directory_="ASC.Migration.Runner_Dir" Component_="ASC.Migration.Runner" ManualDelete="false"/>
<ROW Directory_="service_6_Dir" Component_="service_ASC.Migration.Runner" ManualDelete="false"/>
<ROW Directory_="ASC.ClearEvents_Dir" Component_="ASC.ClearEvents" ManualDelete="false"/>
<ROW Directory_="service_Dir" Component_="service_ASC.ClearEvents" ManualDelete="false"/>
<ROW Directory_="ASC.UrlShortener_Dir" Component_="ASC.UrlShortener" ManualDelete="false"/>
<ROW Directory_="NewFolder_Dir" Component_="service_ASC.Urlshortner" ManualDelete="false"/>
<ROW Directory_="ASC.Data.Backup.BackgroundTasks_Dir" Component_="ASC.Data.Backup.BackgroundTasks" ManualDelete="false"/>
<ROW Directory_="service_3_Dir" Component_="service_ASC.Data.Backup.BachgroundTasks" ManualDelete="false"/>
<ROW Directory_="ASC.Socket.IO_Dir" Component_="ASC.Socket.IO" ManualDelete="false"/>
<ROW Directory_="service_1_Dir" Component_="service_ASC.Socket.IO" ManualDelete="false"/>
<ROW Directory_="ASC.Data.Backup_Dir" Component_="ASC.Data.Backup" ManualDelete="false"/>
<ROW Directory_="service_2_Dir" Component_="service_ASC.Data.Backup" ManualDelete="false"/>
<ROW Directory_="ASC.Migration_Dir" Component_="ASC.Migration" ManualDelete="false"/>
<ROW Directory_="service_4_Dir" Component_="service_ASC.Migration" ManualDelete="false"/>
<ROW Directory_="ASC.Files.Service_Dir" Component_="ASC.Files.Service" ManualDelete="false"/>
<ROW Directory_="service_7_Dir" Component_="service_ASC.File.Service" ManualDelete="false"/>
<ROW Directory_="ASC.TelegramService_Dir" Component_="ASC.TelegramService" ManualDelete="false"/>
<ROW Directory_="service_12_Dir" Component_="service_ASC.TelegramService" ManualDelete="false"/>
<ROW Directory_="ASC.Notify_Dir" Component_="ASC.Notify" ManualDelete="false"/>
<ROW Directory_="service_9_Dir" Component_="service_ASC.Notify" ManualDelete="false"/>
<ROW Directory_="ASC.SsoAuth_Dir" Component_="ASC.SsoAuth" ManualDelete="false"/>
<ROW Directory_="service_5_Dir" Component_="service_ASC.SsoAuth" ManualDelete="false"/>
<ROW Directory_="ASC.Studio.Notify_Dir" Component_="ASC.Studio.Notify" ManualDelete="false"/>
<ROW Directory_="service_11_Dir" Component_="service_ASC.Studio.Notify" ManualDelete="false"/>
<ROW Directory_="ASC.Web.Api_Dir" Component_="ASC.Web.Api" ManualDelete="false"/>
<ROW Directory_="service_15_Dir" Component_="service_ASC.WebApi" ManualDelete="false"/>
<ROW Directory_="ASC.Web.Studio_Dir" Component_="ASC.Web.Studio" ManualDelete="false"/>
<ROW Directory_="service_16_Dir" Component_="service_ASC.Web.Studio" ManualDelete="false"/>
<ROW Directory_="ASC.Webhooks.Service_Dir" Component_="ASC.Webhooks.Service" ManualDelete="false"/>
<ROW Directory_="NewFolder_3_Dir" Component_="service_ASC.Webhooks.Service" ManualDelete="false"/>
<ROW Directory_="Logs_Dir" Component_="Logs" ManualDelete="false"/>
<ROW Directory_="temp_Dir" Component_="temp_nginx" ManualDelete="false"/>
<ROW Directory_="logs_Dir" Component_="logs" ManualDelete="false"/>
<ROW Directory_="temp_1_Dir" Component_="temp_ASC.ClearEvents" ManualDelete="false"/>
<ROW Directory_="temp_2_Dir" Component_="temp_ASC.Data.Backup.BackgroundTasks" ManualDelete="false"/>
<ROW Directory_="temp_3_Dir" Component_="temp_ASC.File.Service" ManualDelete="false"/>
<ROW Directory_="temp_4_Dir" Component_="temp_ASC.Data.Buckup" ManualDelete="false"/>
<ROW Directory_="temp_5_Dir" Component_="temp_ASC.Migration" ManualDelete="false"/>
<ROW Directory_="temp_6_Dir" Component_="temp_ASC.Migration.Runner" ManualDelete="false"/>
<ROW Directory_="temp_7_Dir" Component_="temp_ASC.Notify" ManualDelete="false"/>
<ROW Directory_="temp_8_Dir" Component_="temp_ASC.Studio.Notify" ManualDelete="false"/>
<ROW Directory_="temp_9_Dir" Component_="temp_ASC.Web.Api" ManualDelete="false"/>
<ROW Directory_="temp_10_Dir" Component_="temp_ASC.Web.Studio" ManualDelete="false"/>
<ROW Directory_="temp_11_Dir" Component_="temp_ASC.Webhooks.Service" ManualDelete="false"/>
<ROW Directory_="temp_12_Dir" Component_="temp_ASC.TelegramService" ManualDelete="false"/>
<ROW Directory_="temp_13_Dir" Component_="temp_ASC.Files" ManualDelete="false"/>
<ROW Directory_="temp_14_Dir" Component_="temp_ASC.People" ManualDelete="false"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.MsiCustActComponent">
<ROW Action="AI_AppSearchEx" Type="1" Source="Prereq.dll" Target="DoAppSearchEx"/>
<ROW Action="AI_BACKUP_AI_SETUPEXEPATH" Type="51" Source="AI_SETUPEXEPATH_ORIGINAL" Target="[AI_SETUPEXEPATH]"/>
<ROW Action="AI_ConfigFailActions" Type="11265" Source="aicustact.dll" Target="ConfigureServFailActions" WithoutSeq="true"/>
<ROW Action="AI_ConfigPermissions" Type="1" Source="userAccounts.dll" Target="OnConfigPermissions" AdditionalSeq="AI_DATA_SETTER_4"/>
<ROW Action="AI_DATA_SETTER" Type="51" Source="CustomActionData" Target="[ELASTICSEARCH_MSG]&#13;\n[ELASTICSEARCH_SCHEME]://[ELASTICSEARCH_HOST]:[ELASTICSEARCH_PORT] |[ProductName] Setup |MB_OK,MB_ICONWARNING,MB_DEFBUTTON1||[CLIENTPROCESSID]"/>
<ROW Action="AI_DATA_SETTER_1" Type="51" Source="CustomActionData" Target="HOST=[ELASTICSEARCH_HOST];PORT=[ELASTICSEARCH_PORT];OUTPUT=ELK_CONNECTION"/>
<ROW Action="AI_DATA_SETTER_10" Type="51" Source="CustomActionData" Target="MySQL80"/>
@ -594,6 +803,7 @@
<ROW Action="AI_DATA_SETTER_18" Type="51" Source="CustomActionData" Target="[RabbitMQServerConnectionError] |[ProductName] Setup |MB_OK,MB_ICONWARNING,MB_DEFBUTTON1||[CLIENTPROCESSID]"/>
<ROW Action="AI_DATA_SETTER_2" Type="51" Source="CustomActionData" Target="[AI_SETUPEXEPATH]"/>
<ROW Action="AI_DATA_SETTER_3" Type="51" Source="CustomActionData" Target="[~]"/>
<ROW Action="AI_DATA_SETTER_4" Type="51" Source="CustomActionData" Target="[~]"/>
<ROW Action="AI_DATA_SETTER_5" Type="51" Source="CustomActionData" Target="[RedisServerConnectionError] |[ProductName] Setup |MB_OK,MB_ICONWARNING,MB_DEFBUTTON1||[CLIENTPROCESSID]"/>
<ROW Action="AI_DATA_SETTER_6" Type="51" Source="CustomActionData" Target="[APPDIR_FORWARD_SLASH]"/>
<ROW Action="AI_DATA_SETTER_7" Type="51" Source="CustomActionData" Target="[~]"/>
@ -620,13 +830,17 @@
<ROW Action="AI_JsonRollback" Type="11521" Source="jsonCfg.dll" Target="OnJsonRollback" WithoutSeq="true"/>
<ROW Action="AI_JsonUninstall" Type="1" Source="jsonCfg.dll" Target="OnJsonUninstall" AdditionalSeq="AI_DATA_SETTER_8"/>
<ROW Action="AI_PREPARE_UPGRADE" Type="65" Source="aicustact.dll" Target="PrepareUpgrade"/>
<ROW Action="AI_PrepareRevokePermissions" Type="1" Source="userAccounts.dll" Target="OnPrepareRevokePermissions"/>
<ROW Action="AI_ProcessFailActions" Type="1" Source="aicustact.dll" Target="ProcessFailActions" AdditionalSeq="AI_DATA_SETTER_3"/>
<ROW Action="AI_RESTORE_AI_SETUPEXEPATH" Type="51" Source="AI_SETUPEXEPATH" Target="[AI_SETUPEXEPATH_ORIGINAL]"/>
<ROW Action="AI_RESTORE_LOCATION" Type="65" Source="aicustact.dll" Target="RestoreLocation"/>
<ROW Action="AI_ResolveKnownFolders" Type="1" Source="aicustact.dll" Target="AI_ResolveKnownFolders"/>
<ROW Action="AI_ResolveLocalizedCredentials" Type="1" Source="aicustact.dll" Target="GetLocalizedCredentials"/>
<ROW Action="AI_RestartElevated" Type="1" Source="aicustact.dll" Target="RestartElevated"/>
<ROW Action="AI_RevokePermissions" Type="11265" Source="userAccounts.dll" Target="OnRevokePermissions" WithoutSeq="true"/>
<ROW Action="AI_SHOW_LOG" Type="65" Source="aicustact.dll" Target="LaunchLogFile" WithoutSeq="true"/>
<ROW Action="AI_STORE_LOCATION" Type="51" Source="ARPINSTALLLOCATION" Target="[APPDIR]"/>
<ROW Action="AI_SetPermissions" Type="11265" Source="userAccounts.dll" Target="OnSetPermissions" WithoutSeq="true"/>
<ROW Action="AI_TxtUpdaterCommit" Type="11777" Source="TxtUpdater.dll" Target="OnTxtUpdaterCommit" WithoutSeq="true"/>
<ROW Action="AI_TxtUpdaterConfig" Type="11265" Source="TxtUpdater.dll" Target="OnTxtUpdaterConfig" WithoutSeq="true"/>
<ROW Action="AI_TxtUpdaterInstall" Type="1" Source="TxtUpdater.dll" Target="OnTxtUpdaterInstall"/>
@ -639,9 +853,10 @@
<ROW Action="SET_APPDIR" Type="307" Source="APPDIR" Target="[ProgramFilesFolder][Manufacturer]\[ProductName]" MultiBuildTarget="DefaultBuild:[ProgramFilesFolder][INSTALL_ROOT_FOLDER_NAME]\DocSpace"/>
<ROW Action="SET_SHORTCUTDIR" Type="307" Source="SHORTCUTDIR" Target="[ProgramMenuFolder][ProductName]" MultiBuildTarget="DefaultBuild:[ProgramMenuFolder][INSTALL_ROOT_FOLDER_NAME]\DocSpace"/>
<ROW Action="SET_TARGETDIR_TO_APPDIR" Type="51" Source="TARGETDIR" Target="[APPDIR]"/>
<ROW Action="SetMACHINEKEY" Type="51" Source="MACHINE_KEY" Target="[ComputerName]"/>
<ROW Action="Set_APPDIR_FORWARD_SLASH" Type="38" Target="Script Text" TargetUnformatted="Session.Property(&quot;APPDIR_FORWARD_SLASH&quot;) = Replace(Session.Property(&quot;APPDIR&quot;), &quot;\&quot;, &quot;/&quot;)&#13;&#10;" AdditionalSeq="AI_DATA_SETTER_6"/>
<ROW Action="StartElasticSearchService" Type="3073" Source="aicustact.dll" Target="StartWinService" Options="1" AdditionalSeq="AI_DATA_SETTER_13"/>
<ROW Action="StartMigrationRunner" Type="3106" Source="service_6_Dir" Target="&quot;[APPDIR]services\ASC.Migration.Runner\service\ASC.Migration.Runner.exe&quot;"/>
<ROW Action="StartMigrationRunner" Type="3074" Source="viewer.exe" Target="/EnforcedRunAsAdmin /RunAsAdmin /HideWindow /dir &quot;[APPDIR]\services\ASC.Migration.Runner\service&quot; &quot;[APPDIR]services\ASC.Migration.Runner\service\ASC.Migration.Runner.exe&quot;" Options="1"/>
<ROW Action="StartMySQLService" Type="1" Source="aicustact.dll" Target="StartWinService" Options="1" AdditionalSeq="AI_DATA_SETTER_11"/>
<ROW Action="StopElasticSearchService" Type="1" Source="aicustact.dll" Target="StopWinService" Options="1" AdditionalSeq="AI_DATA_SETTER_12"/>
<ROW Action="StopMySQLService" Type="1" Source="aicustact.dll" Target="StopWinService" Options="1" AdditionalSeq="AI_DATA_SETTER_10"/>
@ -675,8 +890,7 @@
<ROW Feature_="MainFeature" Component_="ASC.Web.Studio.exe"/>
<ROW Feature_="MainFeature" Component_="ASC.Files.exe"/>
<ROW Feature_="MainFeature" Component_="ASC.Web.Api.exe"/>
<ROW Feature_="MainFeature" Component_="proxy.xml"/>
<ROW Feature_="MainFeature" Component_="proxy.exe"/>
<ROW Feature_="MainFeature" Component_="Proxy.exe"/>
<ROW Feature_="MainFeature" Component_="config"/>
<ROW Feature_="MainFeature" Component_="AI_CustomARPName"/>
<ROW Feature_="MainFeature" Component_="AI_DisableModify"/>
@ -691,8 +905,68 @@
<ROW Feature_="MainFeature" Component_="ASC.Migration.exe"/>
<ROW Feature_="MainFeature" Component_="ASC.Webhooks.Service.exe"/>
<ROW Feature_="MainFeature" Component_="ASC.Migration.Runner.exe"/>
<ROW Feature_="MainFeature" Component_="favicon.ico"/>
<ROW Feature_="MainFeature" Component_="public"/>
<ROW Feature_="MainFeature" Component_="DocEditor.exe"/>
<ROW Feature_="MainFeature" Component_="Login.exe"/>
<ROW Feature_="MainFeature" Component_="login"/>
<ROW Feature_="MainFeature" Component_="editor"/>
<ROW Feature_="MainFeature" Component_="conf"/>
<ROW Feature_="MainFeature" Component_="includes"/>
<ROW Feature_="MainFeature" Component_="nginx"/>
<ROW Feature_="MainFeature" Component_="tools"/>
<ROW Feature_="MainFeature" Component_="products"/>
<ROW Feature_="MainFeature" Component_="ASC.Files"/>
<ROW Feature_="MainFeature" Component_="server_ASC.Files"/>
<ROW Feature_="MainFeature" Component_="ASC.Login"/>
<ROW Feature_="MainFeature" Component_="ASC.People"/>
<ROW Feature_="MainFeature" Component_="server_ASC.People"/>
<ROW Feature_="MainFeature" Component_="services"/>
<ROW Feature_="MainFeature" Component_="ASC.Migration.Runner"/>
<ROW Feature_="MainFeature" Component_="service_ASC.Migration.Runner"/>
<ROW Feature_="MainFeature" Component_="ASC.ClearEvents"/>
<ROW Feature_="MainFeature" Component_="service_ASC.ClearEvents"/>
<ROW Feature_="MainFeature" Component_="ASC.UrlShortener"/>
<ROW Feature_="MainFeature" Component_="service_ASC.Urlshortner"/>
<ROW Feature_="MainFeature" Component_="ASC.Data.Backup.BackgroundTasks"/>
<ROW Feature_="MainFeature" Component_="service_ASC.Data.Backup.BachgroundTasks"/>
<ROW Feature_="MainFeature" Component_="ASC.Socket.IO"/>
<ROW Feature_="MainFeature" Component_="service_ASC.Socket.IO"/>
<ROW Feature_="MainFeature" Component_="ASC.Data.Backup"/>
<ROW Feature_="MainFeature" Component_="service_ASC.Data.Backup"/>
<ROW Feature_="MainFeature" Component_="ASC.Migration"/>
<ROW Feature_="MainFeature" Component_="service_ASC.Migration"/>
<ROW Feature_="MainFeature" Component_="ASC.Files.Service"/>
<ROW Feature_="MainFeature" Component_="service_ASC.File.Service"/>
<ROW Feature_="MainFeature" Component_="ASC.TelegramService"/>
<ROW Feature_="MainFeature" Component_="service_ASC.TelegramService"/>
<ROW Feature_="MainFeature" Component_="ASC.Notify"/>
<ROW Feature_="MainFeature" Component_="service_ASC.Notify"/>
<ROW Feature_="MainFeature" Component_="ASC.SsoAuth"/>
<ROW Feature_="MainFeature" Component_="service_ASC.SsoAuth"/>
<ROW Feature_="MainFeature" Component_="ASC.Studio.Notify"/>
<ROW Feature_="MainFeature" Component_="service_ASC.Studio.Notify"/>
<ROW Feature_="MainFeature" Component_="ASC.Web.Api"/>
<ROW Feature_="MainFeature" Component_="service_ASC.WebApi"/>
<ROW Feature_="MainFeature" Component_="ASC.Web.Studio"/>
<ROW Feature_="MainFeature" Component_="service_ASC.Web.Studio"/>
<ROW Feature_="MainFeature" Component_="ASC.Webhooks.Service"/>
<ROW Feature_="MainFeature" Component_="service_ASC.Webhooks.Service"/>
<ROW Feature_="MainFeature" Component_="Logs"/>
<ROW Feature_="MainFeature" Component_="temp_nginx"/>
<ROW Feature_="MainFeature" Component_="logs"/>
<ROW Feature_="MainFeature" Component_="temp_ASC.ClearEvents"/>
<ROW Feature_="MainFeature" Component_="temp_ASC.Data.Backup.BackgroundTasks"/>
<ROW Feature_="MainFeature" Component_="temp_ASC.File.Service"/>
<ROW Feature_="MainFeature" Component_="temp_ASC.Data.Buckup"/>
<ROW Feature_="MainFeature" Component_="temp_ASC.Migration"/>
<ROW Feature_="MainFeature" Component_="temp_ASC.Migration.Runner"/>
<ROW Feature_="MainFeature" Component_="temp_ASC.Notify"/>
<ROW Feature_="MainFeature" Component_="temp_ASC.Studio.Notify"/>
<ROW Feature_="MainFeature" Component_="temp_ASC.Web.Api"/>
<ROW Feature_="MainFeature" Component_="temp_ASC.Web.Studio"/>
<ROW Feature_="MainFeature" Component_="temp_ASC.Webhooks.Service"/>
<ROW Feature_="MainFeature" Component_="temp_ASC.TelegramService"/>
<ROW Feature_="MainFeature" Component_="temp_ASC.Files"/>
<ROW Feature_="MainFeature" Component_="temp_ASC.People"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.MsiIconsComponent">
<ROW Name="icon.exe" SourcePath="Resources\icon.ico" Index="0"/>
@ -702,8 +976,8 @@
<ROW Action="AI_RESTORE_LOCATION" Condition="APPDIR=&quot;&quot;" Sequence="749"/>
<ROW Action="AI_STORE_LOCATION" Condition="(Not Installed) OR REINSTALL" Sequence="1501"/>
<ROW Action="AI_PREPARE_UPGRADE" Condition="AI_UPGRADE=&quot;No&quot; AND (Not Installed)" Sequence="1397"/>
<ROW Action="AI_ResolveKnownFolders" Sequence="52"/>
<ROW Action="AI_EnableDebugLog" Sequence="51"/>
<ROW Action="AI_ResolveKnownFolders" Sequence="53"/>
<ROW Action="AI_EnableDebugLog" Sequence="52"/>
<ROW Action="AI_AppSearchEx" Sequence="103"/>
<ROW Action="AI_DetectSoftware" Sequence="102"/>
<ROW Action="AI_BACKUP_AI_SETUPEXEPATH" Sequence="99" Builds="DefaultBuild"/>
@ -724,35 +998,42 @@
<ROW Action="AI_DATA_SETTER_7" Condition="(REMOVE &lt;&gt; &quot;ALL&quot;)" Sequence="5101"/>
<ROW Action="AI_JsonUninstall" Condition="(REMOVE)" Sequence="3102"/>
<ROW Action="AI_DATA_SETTER_8" Condition="(REMOVE)" Sequence="3101"/>
<ROW Action="StopMySQLService" Condition="( NOT Installed AND NOT OLDPRODUCTS ) AND ( AI_PROCESS_STATE &lt;&gt; &quot;Not Found&quot; )" Sequence="1605"/>
<ROW Action="AI_DATA_SETTER_10" Condition="( NOT Installed AND NOT OLDPRODUCTS ) AND ( AI_PROCESS_STATE &lt;&gt; &quot;Not Found&quot; )" Sequence="1604"/>
<ROW Action="StartMySQLService" Condition="( NOT Installed AND NOT OLDPRODUCTS ) AND ( AI_PROCESS_STATE &lt;&gt; &quot;Not Found&quot; )" Sequence="1607"/>
<ROW Action="AI_DATA_SETTER_11" Condition="( NOT Installed AND NOT OLDPRODUCTS ) AND ( AI_PROCESS_STATE &lt;&gt; &quot;Not Found&quot; )" Sequence="1606"/>
<ROW Action="Set_APPDIR_FORWARD_SLASH" Condition="( NOT Installed )" Sequence="1615"/>
<ROW Action="AI_DATA_SETTER_6" Condition="( NOT Installed )" Sequence="1614"/>
<ROW Action="MySQLConfigure" Condition="( NOT Installed )" Sequence="1601"/>
<ROW Action="DetectMySQLService" Condition="( ( NOT Installed AND NOT OLDPRODUCTS ) OR ( Installed AND REMOVE &lt;&gt; &quot;ALL&quot; AND AI_INSTALL_MODE &lt;&gt; &quot;Remove&quot; ) )" Sequence="1603"/>
<ROW Action="AI_DATA_SETTER_9" Condition="( ( NOT Installed AND NOT OLDPRODUCTS ) OR ( Installed AND REMOVE &lt;&gt; &quot;ALL&quot; AND AI_INSTALL_MODE &lt;&gt; &quot;Remove&quot; ) )" Sequence="1602"/>
<ROW Action="ElasticSearchSetup" Condition="( NOT Installed )" Sequence="1611"/>
<ROW Action="StopElasticSearchService" Condition="( NOT Installed )" Sequence="1609"/>
<ROW Action="AI_DATA_SETTER_12" Condition="( NOT Installed )" Sequence="1608"/>
<ROW Action="ElasticSearchInstallPlugin" Condition="( NOT Installed )" Sequence="1610"/>
<ROW Action="StartElasticSearchService" Condition="( NOT Installed )" Sequence="1613"/>
<ROW Action="AI_DATA_SETTER_13" Condition="( NOT Installed )" Sequence="1612"/>
<ROW Action="StopMySQLService" Condition="( NOT Installed AND NOT OLDPRODUCTS ) AND ( AI_PROCESS_STATE &lt;&gt; &quot;Not Found&quot; )" Sequence="1606"/>
<ROW Action="AI_DATA_SETTER_10" Condition="( NOT Installed AND NOT OLDPRODUCTS ) AND ( AI_PROCESS_STATE &lt;&gt; &quot;Not Found&quot; )" Sequence="1605"/>
<ROW Action="Set_APPDIR_FORWARD_SLASH" Condition="( NOT Installed )" Sequence="1616"/>
<ROW Action="AI_DATA_SETTER_6" Condition="( NOT Installed )" Sequence="1615"/>
<ROW Action="MySQLConfigure" Condition="( NOT Installed )" Sequence="1602"/>
<ROW Action="DetectMySQLService" Condition="( ( NOT Installed AND NOT OLDPRODUCTS ) OR ( Installed AND REMOVE &lt;&gt; &quot;ALL&quot; AND AI_INSTALL_MODE &lt;&gt; &quot;Remove&quot; ) )" Sequence="1604"/>
<ROW Action="AI_DATA_SETTER_9" Condition="( ( NOT Installed AND NOT OLDPRODUCTS ) OR ( Installed AND REMOVE &lt;&gt; &quot;ALL&quot; AND AI_INSTALL_MODE &lt;&gt; &quot;Remove&quot; ) )" Sequence="1603"/>
<ROW Action="ElasticSearchSetup" Condition="( NOT Installed )" Sequence="1612"/>
<ROW Action="StopElasticSearchService" Condition="( NOT Installed )" Sequence="1610"/>
<ROW Action="AI_DATA_SETTER_12" Condition="( NOT Installed )" Sequence="1609"/>
<ROW Action="ElasticSearchInstallPlugin" Condition="( NOT Installed )" Sequence="1611"/>
<ROW Action="StartElasticSearchService" Condition="( NOT Installed )" Sequence="1614"/>
<ROW Action="AI_DATA_SETTER_13" Condition="( NOT Installed )" Sequence="1613"/>
<ROW Action="AI_GetArpIconPath" Sequence="1401"/>
<ROW Action="StartMySQLService" Condition="( NOT Installed AND NOT OLDPRODUCTS ) AND ( AI_PROCESS_STATE &lt;&gt; &quot;Not Found&quot; )" Sequence="1608"/>
<ROW Action="AI_DATA_SETTER_11" Condition="( NOT Installed AND NOT OLDPRODUCTS ) AND ( AI_PROCESS_STATE &lt;&gt; &quot;Not Found&quot; )" Sequence="1607"/>
<ROW Action="StartMigrationRunner" Condition="( NOT Installed )" Sequence="5826"/>
<ROW Action="SetMACHINEKEY" Condition="( NOT Installed )" Sequence="1601"/>
<ROW Action="AI_DETECT_MODERNWIN" Condition="(VersionNT &gt;= 603)" Sequence="54" MsiKey="AI_DETECT_MODERNWIN"/>
<ROW Action="AI_ResolveLocalizedCredentials" Sequence="51"/>
<ROW Action="AI_ConfigPermissions" Condition="REMOVE &lt;&gt; &quot;ALL&quot;" Sequence="5852"/>
<ROW Action="AI_DATA_SETTER_4" Condition="REMOVE &lt;&gt; &quot;ALL&quot;" Sequence="5851"/>
<ROW Action="AI_PrepareRevokePermissions" Condition="REMOVE = &quot;ALL&quot;" Sequence="1699"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.MsiInstallUISequenceComponent">
<ROW Action="AI_RESTORE_LOCATION" Condition="APPDIR=&quot;&quot;" Sequence="749"/>
<ROW Action="AI_ResolveKnownFolders" Sequence="54"/>
<ROW Action="AI_DpiContentScale" Sequence="53"/>
<ROW Action="AI_EnableDebugLog" Sequence="52"/>
<ROW Action="AI_ResolveKnownFolders" Sequence="55"/>
<ROW Action="AI_DpiContentScale" Sequence="54"/>
<ROW Action="AI_EnableDebugLog" Sequence="53"/>
<ROW Action="AI_BACKUP_AI_SETUPEXEPATH" Sequence="99"/>
<ROW Action="AI_RESTORE_AI_SETUPEXEPATH" Condition="AI_SETUPEXEPATH_ORIGINAL" Sequence="103"/>
<ROW Action="AI_AppSearchEx" Sequence="102"/>
<ROW Action="AI_DetectSoftware" Sequence="101"/>
<ROW Action="MySQLConfigureGUI" Condition="( NOT Installed )" Sequence="1101"/>
<ROW Action="AI_RestartElevated" Sequence="51"/>
<ROW Action="AI_RestartElevated" Sequence="52"/>
<ROW Action="AI_ResolveLocalizedCredentials" Sequence="51"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.MsiLaunchConditionsComponent">
<ROW Condition="((VersionNT &lt;&gt; 501) AND (VersionNT &lt;&gt; 502))" Description="[ProductName] cannot be installed on [WindowsTypeNT5XDisplay]." DescriptionLocId="AI.LaunchCondition.NoNT5X" IsPredefined="true" Builds="DefaultBuild"/>
@ -762,6 +1043,73 @@
<ROW Condition="SETUPEXEDIR OR (REMOVE=&quot;ALL&quot;)" Description="This package can only be run from a bootstrapper." DescriptionLocId="AI.LaunchCondition.RequireBootstrapper" IsPredefined="true" Builds="DefaultBuild"/>
<ROW Condition="VersionNT" Description="[ProductName] cannot be installed on [WindowsType9XDisplay]." DescriptionLocId="AI.LaunchCondition.No9X" IsPredefined="true" Builds="DefaultBuild"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.MsiLockPermComponent">
<ROW LockObject="APPDIR" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1179785" Flags="2"/>
<ROW LockObject="config_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1179785" Flags="2"/>
<ROW LockObject="nginx_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1179785" Flags="2"/>
<ROW LockObject="conf_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1179785" Flags="2"/>
<ROW LockObject="includes_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1179785" Flags="2"/>
<ROW LockObject="tools_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1180063" Flags="2"/>
<ROW LockObject="products_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1179785" Flags="2"/>
<ROW LockObject="editor_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1179785" Flags="2"/>
<ROW LockObject="ASC.Files_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1179785" Flags="2"/>
<ROW LockObject="login_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1179785" Flags="2"/>
<ROW LockObject="server_2_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1179785" Flags="2"/>
<ROW LockObject="ASC.Login_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1179785" Flags="2"/>
<ROW LockObject="ASC.People_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1179785" Flags="2"/>
<ROW LockObject="server_5_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1179785" Flags="2"/>
<ROW LockObject="services_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1179785" Flags="2"/>
<ROW LockObject="ASC.Migration.Runner_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1179785" Flags="2"/>
<ROW LockObject="service_6_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1179785" Flags="2"/>
<ROW LockObject="ASC.ClearEvents_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1179785" Flags="2"/>
<ROW LockObject="service_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1179785" Flags="2"/>
<ROW LockObject="ASC.UrlShortener_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1179785" Flags="2"/>
<ROW LockObject="NewFolder_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1179785" Flags="2"/>
<ROW LockObject="config_1_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1179785" Flags="2"/>
<ROW LockObject="NewFolder_1_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1179785" Flags="2"/>
<ROW LockObject="ASC.Data.Backup.BackgroundTasks_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1179785" Flags="2"/>
<ROW LockObject="service_3_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1179785" Flags="2"/>
<ROW LockObject="ASC.Socket.IO_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1179785" Flags="2"/>
<ROW LockObject="service_1_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1179785" Flags="2"/>
<ROW LockObject="ASC.Data.Backup_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1179785" Flags="2"/>
<ROW LockObject="service_2_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1179785" Flags="2"/>
<ROW LockObject="ASC.Migration_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1179785" Flags="2"/>
<ROW LockObject="service_4_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1179785" Flags="2"/>
<ROW LockObject="ASC.Files.Service_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1179785" Flags="2"/>
<ROW LockObject="service_7_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1179785" Flags="2"/>
<ROW LockObject="ASC.TelegramService_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1179785" Flags="2"/>
<ROW LockObject="service_12_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1179785" Flags="2"/>
<ROW LockObject="ASC.Notify_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1179785" Flags="2"/>
<ROW LockObject="service_9_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1179785" Flags="2"/>
<ROW LockObject="ASC.SsoAuth_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1179785" Flags="2"/>
<ROW LockObject="config_2_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1179785" Flags="2"/>
<ROW LockObject="service_5_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1179785" Flags="2"/>
<ROW LockObject="ASC.Studio.Notify_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1179785" Flags="2"/>
<ROW LockObject="service_11_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1179785" Flags="2"/>
<ROW LockObject="ASC.Web.Api_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1179785" Flags="2"/>
<ROW LockObject="service_15_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1179785" Flags="2"/>
<ROW LockObject="ASC.Web.Studio_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1179785" Flags="2"/>
<ROW LockObject="service_16_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1179785" Flags="2"/>
<ROW LockObject="ASC.Webhooks.Service_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1179785" Flags="2"/>
<ROW LockObject="NewFolder_3_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1179785" Flags="2"/>
<ROW LockObject="Logs_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1180063" Flags="2"/>
<ROW LockObject="temp_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1180063" Flags="2"/>
<ROW LockObject="logs_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1180063" Flags="2"/>
<ROW LockObject="temp_1_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1180063" Flags="2"/>
<ROW LockObject="temp_2_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1180063" Flags="2"/>
<ROW LockObject="temp_3_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1180063" Flags="2"/>
<ROW LockObject="temp_4_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1180063" Flags="2"/>
<ROW LockObject="temp_5_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1180063" Flags="2"/>
<ROW LockObject="temp_6_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1180063" Flags="2"/>
<ROW LockObject="temp_7_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1180063" Flags="2"/>
<ROW LockObject="temp_8_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1180063" Flags="2"/>
<ROW LockObject="temp_9_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1180063" Flags="2"/>
<ROW LockObject="temp_10_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1180063" Flags="2"/>
<ROW LockObject="temp_11_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1180063" Flags="2"/>
<ROW LockObject="temp_12_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1180063" Flags="2"/>
<ROW LockObject="temp_13_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1180063" Flags="2"/>
<ROW LockObject="temp_14_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1180063" Flags="2"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.MsiRegLocatorComponent">
<ROW Signature_="AI_EXE_PATH_CU" Root="1" Key="Software\Caphyon\Advanced Installer\LZMA\[ProductCode]\[ProductVersion]" Name="AI_ExePath" Type="2"/>
<ROW Signature_="AI_EXE_PATH_LM" Root="2" Key="Software\Caphyon\Advanced Installer\LZMA\[ProductCode]\[ProductVersion]" Name="AI_ExePath" Type="2"/>
@ -795,12 +1143,14 @@
<ROW MsiServiceConfig="ServiceName_BackgroundTasks" Name="[ServiceName_BackgroundTasks]" Event="1" ConfigType="3" Argument="1" Component_="ASC.Data.Backup.BackgroundTasks.exe"/>
<ROW MsiServiceConfig="ServiceName_BackupService" Name="[ServiceName_BackupService]" Event="1" ConfigType="3" Argument="1" Component_="ASC.Data.Backup.exe"/>
<ROW MsiServiceConfig="ServiceName_ClearEvents" Name="[ServiceName_ClearEvents]" Event="1" ConfigType="3" Argument="1" Component_="ASC.ClearEvents.exe"/>
<ROW MsiServiceConfig="ServiceName_DocEditor" Name="[ServiceName_DocEditor]" Event="1" ConfigType="3" Argument="1" Component_="DocEditor.exe"/>
<ROW MsiServiceConfig="ServiceName_FileServer" Name="[ServiceName_FileServer]" Event="1" ConfigType="3" Argument="1" Component_="ASC.Files.exe"/>
<ROW MsiServiceConfig="ServiceName_FileService" Name="[ServiceName_FileService]" Event="1" ConfigType="3" Argument="1" Component_="ASC.Files.Service.exe"/>
<ROW MsiServiceConfig="ServiceName_Login" Name="[ServiceName_Login]" Event="1" ConfigType="3" Argument="1" Component_="Login.exe"/>
<ROW MsiServiceConfig="ServiceName_Migration" Name="[ServiceName_Migration]" Event="1" ConfigType="3" Argument="1" Component_="ASC.Migration.exe"/>
<ROW MsiServiceConfig="ServiceName_NotifyService" Name="[ServiceName_NotifyService]" Event="1" ConfigType="3" Argument="1" Component_="ASC.Notify.exe"/>
<ROW MsiServiceConfig="ServiceName_PeopleServer" Name="[ServiceName_PeopleServer]" Event="1" ConfigType="3" Argument="1" Component_="ASC.People.exe"/>
<ROW MsiServiceConfig="ServiceName_Proxy" Name="[ServiceName_Proxy]" Event="1" ConfigType="3" Argument="1" Component_="proxy.exe"/>
<ROW MsiServiceConfig="ServiceName_Proxy" Name="[ServiceName_Proxy]" Event="1" ConfigType="3" Argument="1" Component_="Proxy.exe"/>
<ROW MsiServiceConfig="ServiceName_Socket.IO" Name="[ServiceName_Socket.IO]" Event="1" ConfigType="3" Argument="1" Component_="Socket.IO.exe"/>
<ROW MsiServiceConfig="ServiceName_SsoAuth" Name="[ServiceName_SsoAuth]" Event="1" ConfigType="3" Argument="1" Component_="SsoAuth.exe"/>
<ROW MsiServiceConfig="ServiceName_StudioNotifyService" Name="[ServiceName_StudioNotifyService]" Event="1" ConfigType="3" Argument="1" Component_="ASC.Studio.Notify.exe"/>
@ -811,35 +1161,38 @@
<ROW MsiServiceConfig="ServiceName_WebhooksService" Name="[ServiceName_WebhooksService]" Event="1" ConfigType="3" Argument="1" Component_="ASC.Webhooks.Service.exe"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.MsiServConfigFailureActionsComponent">
<ROW MsiServiceConfigFailureActions="ServiceName_BackgroundTasks" Name="[ServiceName_BackgroundTasks]" Event="1" ResetPeriod="0" Actions="1[~]1[~]1" DelayActions="0[~]1[~]1" Component_="ASC.Data.Backup.BackgroundTasks.exe"/>
<ROW MsiServiceConfigFailureActions="ServiceName_BackupService" Name="[ServiceName_BackupService]" Event="1" ResetPeriod="0" Actions="1[~]1[~]1" DelayActions="0[~]1[~]1" Component_="ASC.Data.Backup.exe"/>
<ROW MsiServiceConfigFailureActions="ServiceName_ClearEvents" Name="[ServiceName_ClearEvents]" Event="1" ResetPeriod="0" Actions="1[~]1[~]1" DelayActions="0[~]1[~]1" Component_="ASC.ClearEvents.exe"/>
<ROW MsiServiceConfigFailureActions="ServiceName_FileServer" Name="[ServiceName_FileServer]" Event="1" ResetPeriod="0" Actions="1[~]1[~]1" DelayActions="0[~]1[~]1" Component_="ASC.Files.exe"/>
<ROW MsiServiceConfigFailureActions="ServiceName_FileService" Name="[ServiceName_FileService]" Event="1" ResetPeriod="0" Actions="1[~]1[~]1" DelayActions="0[~]1[~]1" Component_="ASC.Files.Service.exe"/>
<ROW MsiServiceConfigFailureActions="ServiceName_Migration" Name="[ServiceName_Migration]" Event="1" ResetPeriod="0" Actions="1[~]1[~]1" DelayActions="0[~]1[~]1" Component_="ASC.Migration.exe"/>
<ROW MsiServiceConfigFailureActions="ServiceName_NotifyService" Name="[ServiceName_NotifyService]" Event="1" ResetPeriod="0" Actions="1[~]1[~]1" DelayActions="0[~]1[~]1" Component_="ASC.Notify.exe"/>
<ROW MsiServiceConfigFailureActions="ServiceName_PeopleServer" Name="[ServiceName_PeopleServer]" Event="1" ResetPeriod="0" Actions="1[~]1[~]1" DelayActions="0[~]1[~]1" Component_="ASC.People.exe"/>
<ROW MsiServiceConfigFailureActions="ServiceName_Proxy" Name="[ServiceName_Proxy]" Event="1" ResetPeriod="0" Actions="1[~]1[~]1" DelayActions="0[~]1[~]1" Component_="proxy.exe"/>
<ROW MsiServiceConfigFailureActions="ServiceName_Socket.IO" Name="[ServiceName_Socket.IO]" Event="1" ResetPeriod="0" Actions="1[~]1[~]1" DelayActions="0[~]1[~]1" Component_="Socket.IO.exe"/>
<ROW MsiServiceConfigFailureActions="ServiceName_SsoAuth" Name="[ServiceName_SsoAuth]" Event="1" ResetPeriod="0" Actions="1[~]1[~]1" DelayActions="0[~]1[~]1" Component_="SsoAuth.exe"/>
<ROW MsiServiceConfigFailureActions="ServiceName_StudioNotifyService" Name="[ServiceName_StudioNotifyService]" Event="1" ResetPeriod="0" Actions="1[~]1[~]1" DelayActions="0[~]1[~]1" Component_="ASC.Studio.Notify.exe"/>
<ROW MsiServiceConfigFailureActions="ServiceName_TelegramService" Name="[ServiceName_TelegramService]" Event="1" ResetPeriod="0" Actions="1[~]1[~]1" DelayActions="0[~]1[~]1" Component_="ASC.TelegramService.exe"/>
<ROW MsiServiceConfigFailureActions="ServiceName_UrlShortenerService" Name="[ServiceName_UrlShortenerService]" Event="1" ResetPeriod="0" Actions="1[~]1[~]1" DelayActions="0[~]1[~]1" Component_="UrlShortener.exe"/>
<ROW MsiServiceConfigFailureActions="ServiceName_WebApi" Name="[ServiceName_WebApi]" Event="1" ResetPeriod="0" Actions="1[~]1[~]1" DelayActions="0[~]1[~]1" Component_="ASC.Web.Api.exe"/>
<ROW MsiServiceConfigFailureActions="ServiceName_WebStudio" Name="[ServiceName_WebStudio]" Event="1" ResetPeriod="0" Actions="1[~]1[~]1" DelayActions="0[~]1[~]1" Component_="ASC.Web.Studio.exe"/>
<ROW MsiServiceConfigFailureActions="ServiceName_WebhooksService" Name="[ServiceName_WebhooksService]" Event="1" ResetPeriod="0" Actions="1[~]1[~]1" DelayActions="0[~]1[~]1" Component_="ASC.Webhooks.Service.exe"/>
<ROW MsiServiceConfigFailureActions="ServiceName_BackgroundTasks" Name="[ServiceName_BackgroundTasks]" Event="1" ResetPeriod="0" Actions="1[~]1[~]1" DelayActions="1[~]1[~]1" Component_="ASC.Data.Backup.BackgroundTasks.exe"/>
<ROW MsiServiceConfigFailureActions="ServiceName_BackupService" Name="[ServiceName_BackupService]" Event="1" ResetPeriod="0" Actions="1[~]1[~]1" DelayActions="1[~]1[~]1" Component_="ASC.Data.Backup.exe"/>
<ROW MsiServiceConfigFailureActions="ServiceName_ClearEvents" Name="[ServiceName_ClearEvents]" Event="1" ResetPeriod="0" Actions="1[~]1[~]1" DelayActions="1[~]1[~]1" Component_="ASC.ClearEvents.exe"/>
<ROW MsiServiceConfigFailureActions="ServiceName_DocEditor" Name="[ServiceName_DocEditor]" Event="1" ResetPeriod="0" Actions="1[~]1[~]1" DelayActions="1[~]1[~]1" Component_="DocEditor.exe"/>
<ROW MsiServiceConfigFailureActions="ServiceName_FileServer" Name="[ServiceName_FileServer]" Event="1" ResetPeriod="0" Actions="1[~]1[~]1" DelayActions="1[~]1[~]1" Component_="ASC.Files.exe"/>
<ROW MsiServiceConfigFailureActions="ServiceName_FileService" Name="[ServiceName_FileService]" Event="1" ResetPeriod="0" Actions="1[~]1[~]1" DelayActions="1[~]1[~]1" Component_="ASC.Files.Service.exe"/>
<ROW MsiServiceConfigFailureActions="ServiceName_Login" Name="[ServiceName_Login]" Event="1" ResetPeriod="0" Actions="1[~]1[~]1" DelayActions="1[~]1[~]1" Component_="Login.exe"/>
<ROW MsiServiceConfigFailureActions="ServiceName_Migration" Name="[ServiceName_Migration]" Event="1" ResetPeriod="0" Actions="1[~]1[~]1" DelayActions="1[~]1[~]1" Component_="ASC.Migration.exe"/>
<ROW MsiServiceConfigFailureActions="ServiceName_NotifyService" Name="[ServiceName_NotifyService]" Event="1" ResetPeriod="0" Actions="1[~]1[~]1" DelayActions="1[~]1[~]1" Component_="ASC.Notify.exe"/>
<ROW MsiServiceConfigFailureActions="ServiceName_PeopleServer" Name="[ServiceName_PeopleServer]" Event="1" ResetPeriod="0" Actions="1[~]1[~]1" DelayActions="1[~]1[~]1" Component_="ASC.People.exe"/>
<ROW MsiServiceConfigFailureActions="ServiceName_Proxy" Name="[ServiceName_Proxy]" Event="1" ResetPeriod="0" Actions="1[~]1[~]1" DelayActions="1[~]1[~]1" Component_="Proxy.exe"/>
<ROW MsiServiceConfigFailureActions="ServiceName_Socket.IO" Name="[ServiceName_Socket.IO]" Event="1" ResetPeriod="0" Actions="1[~]1[~]1" DelayActions="1[~]1[~]1" Component_="Socket.IO.exe"/>
<ROW MsiServiceConfigFailureActions="ServiceName_SsoAuth" Name="[ServiceName_SsoAuth]" Event="1" ResetPeriod="0" Actions="1[~]1[~]1" DelayActions="1[~]1[~]1" Component_="SsoAuth.exe"/>
<ROW MsiServiceConfigFailureActions="ServiceName_StudioNotifyService" Name="[ServiceName_StudioNotifyService]" Event="1" ResetPeriod="0" Actions="1[~]1[~]1" DelayActions="1[~]1[~]1" Component_="ASC.Studio.Notify.exe"/>
<ROW MsiServiceConfigFailureActions="ServiceName_TelegramService" Name="[ServiceName_TelegramService]" Event="1" ResetPeriod="0" Actions="1[~]1[~]1" DelayActions="1[~]1[~]1" Component_="ASC.TelegramService.exe"/>
<ROW MsiServiceConfigFailureActions="ServiceName_UrlShortenerService" Name="[ServiceName_UrlShortenerService]" Event="1" ResetPeriod="0" Actions="1[~]1[~]1" DelayActions="1[~]1[~]1" Component_="UrlShortener.exe"/>
<ROW MsiServiceConfigFailureActions="ServiceName_WebApi" Name="[ServiceName_WebApi]" Event="1" ResetPeriod="0" Actions="1[~]1[~]1" DelayActions="1[~]1[~]1" Component_="ASC.Web.Api.exe"/>
<ROW MsiServiceConfigFailureActions="ServiceName_WebStudio" Name="[ServiceName_WebStudio]" Event="1" ResetPeriod="0" Actions="1[~]1[~]1" DelayActions="1[~]1[~]1" Component_="ASC.Web.Studio.exe"/>
<ROW MsiServiceConfigFailureActions="ServiceName_WebhooksService" Name="[ServiceName_WebhooksService]" Event="1" ResetPeriod="0" Actions="1[~]1[~]1" DelayActions="1[~]1[~]1" Component_="ASC.Webhooks.Service.exe"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.MsiServCtrlComponent">
<ROW ServiceControl="ASC.ClearEvents.exe" Name="[ServiceName_ClearEvents]" Event="161" Wait="0" Component_="ASC.ClearEvents.exe"/>
<ROW ServiceControl="ASC.Data.Backup.BackgroundTasks.exe" Name="[ServiceName_BackgroundTasks]" Event="161" Wait="0" Component_="ASC.Data.Backup.BackgroundTasks.exe"/>
<ROW ServiceControl="ASC.Migration.exe" Name="[ServiceName_Migration]" Event="161" Wait="0" Component_="ASC.Migration.exe"/>
<ROW ServiceControl="ASC.Webhooks.Service.exe" Name="[ServiceName_WebhooksService]" Event="161" Wait="0" Component_="ASC.Webhooks.Service.exe"/>
<ROW ServiceControl="ServiceName_BackgroundTasks" Name="[ServiceName_BackgroundTasks]" Event="161" Wait="0" Component_="ASC.Data.Backup.BackgroundTasks.exe"/>
<ROW ServiceControl="ServiceName_BackupService" Name="[ServiceName_BackupService]" Event="161" Wait="0" Component_="ASC.Data.Backup.exe"/>
<ROW ServiceControl="ServiceName_ClearEvents" Name="[ServiceName_ClearEvents]" Event="161" Wait="0" Component_="ASC.ClearEvents.exe"/>
<ROW ServiceControl="ServiceName_DocEditor" Name="[ServiceName_DocEditor]" Event="161" Wait="0" Component_="DocEditor.exe"/>
<ROW ServiceControl="ServiceName_FileServer" Name="[ServiceName_FileServer]" Event="161" Wait="0" Component_="ASC.Files.exe"/>
<ROW ServiceControl="ServiceName_FileService" Name="[ServiceName_FileService]" Event="161" Wait="0" Component_="ASC.Files.Service.exe"/>
<ROW ServiceControl="ServiceName_Login" Name="[ServiceName_Login]" Event="161" Wait="0" Component_="Login.exe"/>
<ROW ServiceControl="ServiceName_Migration" Name="[ServiceName_Migration]" Event="161" Wait="0" Component_="ASC.Migration.exe"/>
<ROW ServiceControl="ServiceName_NotifyService" Name="[ServiceName_NotifyService]" Event="161" Wait="0" Component_="ASC.Notify.exe"/>
<ROW ServiceControl="ServiceName_PeopleServer" Name="[ServiceName_PeopleServer]" Event="161" Wait="0" Component_="ASC.People.exe"/>
<ROW ServiceControl="ServiceName_Proxy" Name="[ServiceName_Proxy]" Event="161" Wait="0" Component_="proxy.exe"/>
<ROW ServiceControl="ServiceName_Proxy" Name="[ServiceName_Proxy]" Event="161" Wait="0" Component_="Proxy.exe"/>
<ROW ServiceControl="ServiceName_Socket.IO" Name="[ServiceName_Socket.IO]" Event="161" Wait="0" Component_="Socket.IO.exe"/>
<ROW ServiceControl="ServiceName_SsoAuth" Name="[ServiceName_SsoAuth]" Event="161" Wait="0" Component_="SsoAuth.exe"/>
<ROW ServiceControl="ServiceName_StudioNotifyService" Name="[ServiceName_StudioNotifyService]" Event="161" Wait="0" Component_="ASC.Studio.Notify.exe"/>
@ -847,25 +1200,28 @@
<ROW ServiceControl="ServiceName_UrlShortenerService" Name="[ServiceName_UrlShortenerService]" Event="161" Wait="0" Component_="UrlShortener.exe"/>
<ROW ServiceControl="ServiceName_WebApi" Name="[ServiceName_WebApi]" Event="161" Wait="0" Component_="ASC.Web.Api.exe"/>
<ROW ServiceControl="ServiceName_WebStudio" Name="[ServiceName_WebStudio]" Event="161" Wait="0" Component_="ASC.Web.Studio.exe"/>
<ROW ServiceControl="ServiceName_WebhooksService" Name="[ServiceName_WebhooksService]" Event="161" Wait="0" Component_="ASC.Webhooks.Service.exe"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.MsiServInstComponent">
<ROW ServiceInstall="ASC.ClearEvents.exe" Name="[ServiceName_ClearEvents]" DisplayName="[ServiceName_ClearEvents]" ServiceType="16" StartType="2" ErrorControl="1" Arguments="--urls=[APP_URLS]:5027 --ENVIRONMENT=[ENVIRONMENT] --pathToConf=&quot;[APPDIR]config&quot; --$STORAGE_ROOT=&quot;[APPDIR]Data&quot; --log:dir=&quot;[APPDIR]Logs&quot; --log:name=[ServiceName_BackupService] --core:products:folder=&quot;[APPDIR]products&quot; [SUBFOLDER_SERVER]" Component_="ASC.ClearEvents.exe"/>
<ROW ServiceInstall="ASC.Data.Backup.BackgroundTasks.exe" Name="[ServiceName_BackgroundTasks]" DisplayName="[ServiceName_BackgroundTasks]" ServiceType="16" StartType="2" ErrorControl="1" Arguments="--urls=[APP_URLS]:5032 --ENVIRONMENT=[ENVIRONMENT] --pathToConf=&quot;[APPDIR]config&quot; --$STORAGE_ROOT=&quot;[APPDIR]Data&quot; --log:dir=&quot;[APPDIR]Logs&quot; --log:name=[ServiceName_BackupService] --core:products:folder=&quot;[APPDIR]products&quot; [SUBFOLDER_SERVER]" Component_="ASC.Data.Backup.BackgroundTasks.exe"/>
<ROW ServiceInstall="ASC.Migration.exe" Name="[ServiceName_Migration]" DisplayName="[ServiceName_Migration]" ServiceType="16" StartType="2" ErrorControl="1" Arguments="--urls=[APP_URLS]:5018 --ENVIRONMENT=[ENVIRONMENT] --pathToConf=&quot;[APPDIR]config&quot; --$STORAGE_ROOT=&quot;[APPDIR]Data&quot; --log:dir=&quot;[APPDIR]Logs&quot; --log:name=[ServiceName_BackupService] --core:products:folder=&quot;[APPDIR]products&quot; [SUBFOLDER_SERVER]" Component_="ASC.Migration.exe"/>
<ROW ServiceInstall="ASC.Webhooks.Service.exe" Name="[ServiceName_WebhooksService]" DisplayName="[ServiceName_WebhooksService]" ServiceType="16" StartType="2" ErrorControl="1" Arguments="--urls=[APP_URLS]:5031 --ENVIRONMENT=[ENVIRONMENT] --pathToConf=&quot;[APPDIR]config&quot; --$STORAGE_ROOT=&quot;[APPDIR]Data&quot; --log:dir=&quot;[APPDIR]Logs&quot; --log:name=[ServiceName_BackupService] --core:products:folder=&quot;[APPDIR]products&quot; [SUBFOLDER_SERVER]" Component_="ASC.Webhooks.Service.exe"/>
<ROW ServiceInstall="ServiceName_BackupService" Name="[ServiceName_BackupService]" DisplayName="[ServiceName_BackupService]" ServiceType="16" StartType="2" ErrorControl="1" Arguments="--urls=[APP_URLS]:5012 --ENVIRONMENT=[ENVIRONMENT] --pathToConf=&quot;[APPDIR]config&quot; --$STORAGE_ROOT=&quot;[APPDIR]Data&quot; --log:dir=&quot;[APPDIR]Logs&quot; --log:name=[ServiceName_BackupService] --core:products:folder=&quot;[APPDIR]products&quot; [SUBFOLDER_SERVER]" Component_="ASC.Data.Backup.exe"/>
<ROW ServiceInstall="ServiceName_FileServer" Name="[ServiceName_FileServer]" DisplayName="[ServiceName_FileServer]" ServiceType="16" StartType="2" ErrorControl="1" Arguments="--urls=[APP_URLS]:5007 --ENVIRONMENT=[ENVIRONMENT] --pathToConf=&quot;[APPDIR]config&quot; --$STORAGE_ROOT=&quot;[APPDIR]Data&quot; --log:dir=&quot;[APPDIR]Logs&quot; --log:name=[ServiceName_FileServer] [SUBFOLDER_SERVER]" Component_="ASC.Files.exe"/>
<ROW ServiceInstall="ServiceName_FileService" Name="[ServiceName_FileService]" DisplayName="[ServiceName_FileService]" ServiceType="16" StartType="2" ErrorControl="1" Arguments="--urls=[APP_URLS]:5009 --ENVIRONMENT=[ENVIRONMENT] --pathToConf=&quot;[APPDIR]config&quot; --$STORAGE_ROOT=&quot;[APPDIR]Data&quot; --log:dir=&quot;[APPDIR]Logs&quot; --log:name=[ServiceName_FileService] --core:products:folder=&quot;[APPDIR]products&quot; [SUBFOLDER_SERVER]" Component_="ASC.Files.Service.exe"/>
<ROW ServiceInstall="ServiceName_NotifyService" Name="[ServiceName_NotifyService]" DisplayName="[ServiceName_NotifyService]" ServiceType="16" StartType="2" ErrorControl="1" Arguments="--urls=[APP_URLS]:5005 --ENVIRONMENT=[ENVIRONMENT] --pathToConf=&quot;[APPDIR]config&quot; --$STORAGE_ROOT=&quot;[APPDIR]Data&quot; --log:dir=&quot;[APPDIR]Logs&quot; --log:name=[ServiceName_NotifyService] --core:products:folder=&quot;[APPDIR]products&quot; [SUBFOLDER_SERVER]" Component_="ASC.Notify.exe"/>
<ROW ServiceInstall="ServiceName_PeopleServer" Name="[ServiceName_PeopleServer]" DisplayName="[ServiceName_PeopleServer]" ServiceType="16" StartType="2" ErrorControl="1" Arguments="--urls=[APP_URLS]:5004 --ENVIRONMENT=[ENVIRONMENT] --pathToConf=&quot;[APPDIR]config&quot; --$STORAGE_ROOT=&quot;[APPDIR]Data&quot; --log:dir=&quot;[APPDIR]Logs&quot; --log:name=[ServiceName_PeopleServer] [SUBFOLDER_SERVER]" Component_="ASC.People.exe"/>
<ROW ServiceInstall="ServiceName_Proxy" Name="[ServiceName_Proxy]" DisplayName="[ServiceName_Proxy]" ServiceType="16" StartType="2" ErrorControl="1" Component_="proxy.exe"/>
<ROW ServiceInstall="ServiceName_Socket.IO" Name="[ServiceName_Socket.IO]" DisplayName="[ServiceName_Socket.IO]" ServiceType="16" StartType="2" ErrorControl="1" Component_="Socket.IO.exe"/>
<ROW ServiceInstall="ServiceName_SsoAuth" Name="[ServiceName_SsoAuth]" DisplayName="[ServiceName_SsoAuth]" ServiceType="16" StartType="2" ErrorControl="1" Component_="SsoAuth.exe"/>
<ROW ServiceInstall="ServiceName_StudioNotifyService" Name="[ServiceName_StudioNotifyService]" DisplayName="[ServiceName_StudioNotifyService]" ServiceType="16" StartType="2" ErrorControl="1" Arguments="--urls=[APP_URLS]:5006 --ENVIRONMENT=[ENVIRONMENT] --pathToConf=&quot;[APPDIR]config&quot; --$STORAGE_ROOT=&quot;[APPDIR]Data&quot; --log:dir=&quot;[APPDIR]Logs&quot; --log:name=[ServiceName_StudioNotifyService] --core:products:folder=&quot;[APPDIR]products&quot; [SUBFOLDER_SERVER]" Component_="ASC.Studio.Notify.exe"/>
<ROW ServiceInstall="ServiceName_TelegramService" Name="[ServiceName_TelegramService]" DisplayName="[ServiceName_TelegramService]" ServiceType="16" StartType="2" ErrorControl="1" Arguments="--urls=[APP_URLS]:51702 --ENVIRONMENT=[ENVIRONMENT] --pathToConf=&quot;[APPDIR]config&quot; --$STORAGE_ROOT=&quot;[APPDIR]Data&quot; --log:dir=&quot;[APPDIR]Logs&quot; --log:name=[ServiceName_TelegramService] [SUBFOLDER_SERVER]" Component_="ASC.TelegramService.exe"/>
<ROW ServiceInstall="ServiceName_UrlShortenerService" Name="[ServiceName_UrlShortenerService]" DisplayName="[ServiceName_UrlShortenerService]" ServiceType="16" StartType="2" ErrorControl="1" Component_="UrlShortener.exe"/>
<ROW ServiceInstall="ServiceName_WebApi" Name="[ServiceName_WebApi]" DisplayName="[ServiceName_WebApi]" ServiceType="16" StartType="2" ErrorControl="1" Arguments="--urls=[APP_URLS]:5000 --ENVIRONMENT=[ENVIRONMENT] --pathToConf=&quot;[APPDIR]config&quot; --$STORAGE_ROOT=&quot;[APPDIR]Data&quot; --log:dir=&quot;[APPDIR]Logs&quot; --log:name=[ServiceName_WebApi] [SUBFOLDER_SERVER]" Component_="ASC.Web.Api.exe"/>
<ROW ServiceInstall="ServiceName_WebStudio" Name="[ServiceName_WebStudio]" DisplayName="[ServiceName_WebStudio]" ServiceType="16" StartType="2" ErrorControl="1" Arguments="--urls=[APP_URLS]:5003 --ENVIRONMENT=[ENVIRONMENT] --pathToConf=&quot;[APPDIR]config&quot; --$STORAGE_ROOT=&quot;[APPDIR]Data&quot; --log:dir=&quot;[APPDIR]Logs&quot; --log:name=[ServiceName_WebStudio] [SUBFOLDER_SERVER]" Component_="ASC.Web.Studio.exe"/>
<ROW ServiceInstall="ServiceName_BackgroundTasks" Name="[ServiceName_BackgroundTasks]" DisplayName="[ServiceName_BackgroundTasks]" ServiceType="16" StartType="2" ErrorControl="1" StartName="NT AUTHORITY\LocalService" Arguments="--urls=[APP_URLS]:5032 --ENVIRONMENT=[ENVIRONMENT] --pathToConf=&quot;[APPDIR]config&quot; --$STORAGE_ROOT=&quot;[APPDIR]Data&quot; --log:dir=&quot;[APPDIR]Logs&quot; --log:name=[ServiceName_BackupService] --core:products:folder=&quot;[APPDIR]products&quot; [SUBFOLDER_SERVER]" Component_="ASC.Data.Backup.BackgroundTasks.exe"/>
<ROW ServiceInstall="ServiceName_BackupService" Name="[ServiceName_BackupService]" DisplayName="[ServiceName_BackupService]" ServiceType="16" StartType="2" ErrorControl="1" StartName="NT AUTHORITY\LocalService" Arguments="--urls=[APP_URLS]:5012 --ENVIRONMENT=[ENVIRONMENT] --pathToConf=&quot;[APPDIR]config&quot; --$STORAGE_ROOT=&quot;[APPDIR]Data&quot; --log:dir=&quot;[APPDIR]Logs&quot; --log:name=[ServiceName_BackupService] --core:products:folder=&quot;[APPDIR]products&quot; [SUBFOLDER_SERVER]" Component_="ASC.Data.Backup.exe"/>
<ROW ServiceInstall="ServiceName_ClearEvents" Name="[ServiceName_ClearEvents]" DisplayName="[ServiceName_ClearEvents]" ServiceType="16" StartType="2" ErrorControl="1" StartName="NT AUTHORITY\LocalService" Arguments="--urls=[APP_URLS]:5027 --ENVIRONMENT=[ENVIRONMENT] --pathToConf=&quot;[APPDIR]config&quot; --$STORAGE_ROOT=&quot;[APPDIR]Data&quot; --log:dir=&quot;[APPDIR]Logs&quot; --log:name=[ServiceName_BackupService] --core:products:folder=&quot;[APPDIR]products&quot; [SUBFOLDER_SERVER]" Component_="ASC.ClearEvents.exe"/>
<ROW ServiceInstall="ServiceName_DocEditor" Name="[ServiceName_DocEditor]" DisplayName="[ServiceName_DocEditor]" ServiceType="16" StartType="2" ErrorControl="1" StartName="NT AUTHORITY\LocalService" Component_="DocEditor.exe"/>
<ROW ServiceInstall="ServiceName_FileServer" Name="[ServiceName_FileServer]" DisplayName="[ServiceName_FileServer]" ServiceType="16" StartType="2" ErrorControl="1" StartName="NT AUTHORITY\LocalService" Arguments="--urls=[APP_URLS]:5007 --ENVIRONMENT=[ENVIRONMENT] --pathToConf=&quot;[APPDIR]config&quot; --$STORAGE_ROOT=&quot;[APPDIR]Data&quot; --log:dir=&quot;[APPDIR]Logs&quot; --log:name=[ServiceName_FileServer] [SUBFOLDER_SERVER]" Component_="ASC.Files.exe"/>
<ROW ServiceInstall="ServiceName_FileService" Name="[ServiceName_FileService]" DisplayName="[ServiceName_FileService]" ServiceType="16" StartType="2" ErrorControl="1" StartName="NT AUTHORITY\LocalService" Arguments="--urls=[APP_URLS]:5009 --ENVIRONMENT=[ENVIRONMENT] --pathToConf=&quot;[APPDIR]config&quot; --$STORAGE_ROOT=&quot;[APPDIR]Data&quot; --log:dir=&quot;[APPDIR]Logs&quot; --log:name=[ServiceName_FileService] --core:products:folder=&quot;[APPDIR]products&quot; [SUBFOLDER_SERVER]" Component_="ASC.Files.Service.exe"/>
<ROW ServiceInstall="ServiceName_Login" Name="[ServiceName_Login]" DisplayName="[ServiceName_Login]" ServiceType="16" StartType="2" ErrorControl="1" StartName="NT AUTHORITY\LocalService" Component_="Login.exe"/>
<ROW ServiceInstall="ServiceName_Migration" Name="[ServiceName_Migration]" DisplayName="[ServiceName_Migration]" ServiceType="16" StartType="2" ErrorControl="1" StartName="NT AUTHORITY\LocalService" Arguments="--urls=[APP_URLS]:5018 --ENVIRONMENT=[ENVIRONMENT] --pathToConf=&quot;[APPDIR]config&quot; --$STORAGE_ROOT=&quot;[APPDIR]Data&quot; --log:dir=&quot;[APPDIR]Logs&quot; --log:name=[ServiceName_BackupService] --core:products:folder=&quot;[APPDIR]products&quot; [SUBFOLDER_SERVER]" Component_="ASC.Migration.exe"/>
<ROW ServiceInstall="ServiceName_NotifyService" Name="[ServiceName_NotifyService]" DisplayName="[ServiceName_NotifyService]" ServiceType="16" StartType="2" ErrorControl="1" StartName="NT AUTHORITY\LocalService" Arguments="--urls=[APP_URLS]:5005 --ENVIRONMENT=[ENVIRONMENT] --pathToConf=&quot;[APPDIR]config&quot; --$STORAGE_ROOT=&quot;[APPDIR]Data&quot; --log:dir=&quot;[APPDIR]Logs&quot; --log:name=[ServiceName_NotifyService] --core:products:folder=&quot;[APPDIR]products&quot; [SUBFOLDER_SERVER]" Component_="ASC.Notify.exe"/>
<ROW ServiceInstall="ServiceName_PeopleServer" Name="[ServiceName_PeopleServer]" DisplayName="[ServiceName_PeopleServer]" ServiceType="16" StartType="2" ErrorControl="1" StartName="NT AUTHORITY\LocalService" Arguments="--urls=[APP_URLS]:5004 --ENVIRONMENT=[ENVIRONMENT] --pathToConf=&quot;[APPDIR]config&quot; --$STORAGE_ROOT=&quot;[APPDIR]Data&quot; --log:dir=&quot;[APPDIR]Logs&quot; --log:name=[ServiceName_PeopleServer] [SUBFOLDER_SERVER]" Component_="ASC.People.exe"/>
<ROW ServiceInstall="ServiceName_Proxy" Name="[ServiceName_Proxy]" DisplayName="[ServiceName_Proxy]" ServiceType="16" StartType="2" ErrorControl="1" StartName="NT AUTHORITY\LocalService" Component_="Proxy.exe"/>
<ROW ServiceInstall="ServiceName_Socket.IO" Name="[ServiceName_Socket.IO]" DisplayName="[ServiceName_Socket.IO]" ServiceType="16" StartType="2" ErrorControl="1" StartName="NT AUTHORITY\LocalService" Component_="Socket.IO.exe"/>
<ROW ServiceInstall="ServiceName_SsoAuth" Name="[ServiceName_SsoAuth]" DisplayName="[ServiceName_SsoAuth]" ServiceType="16" StartType="2" ErrorControl="1" StartName="NT AUTHORITY\LocalService" Component_="SsoAuth.exe"/>
<ROW ServiceInstall="ServiceName_StudioNotifyService" Name="[ServiceName_StudioNotifyService]" DisplayName="[ServiceName_StudioNotifyService]" ServiceType="16" StartType="2" ErrorControl="1" StartName="NT AUTHORITY\LocalService" Arguments="--urls=[APP_URLS]:5006 --ENVIRONMENT=[ENVIRONMENT] --pathToConf=&quot;[APPDIR]config&quot; --$STORAGE_ROOT=&quot;[APPDIR]Data&quot; --log:dir=&quot;[APPDIR]Logs&quot; --log:name=[ServiceName_StudioNotifyService] --core:products:folder=&quot;[APPDIR]products&quot; [SUBFOLDER_SERVER]" Component_="ASC.Studio.Notify.exe"/>
<ROW ServiceInstall="ServiceName_TelegramService" Name="[ServiceName_TelegramService]" DisplayName="[ServiceName_TelegramService]" ServiceType="16" StartType="2" ErrorControl="1" StartName="NT AUTHORITY\LocalService" Arguments="--urls=[APP_URLS]:51702 --ENVIRONMENT=[ENVIRONMENT] --pathToConf=&quot;[APPDIR]config&quot; --$STORAGE_ROOT=&quot;[APPDIR]Data&quot; --log:dir=&quot;[APPDIR]Logs&quot; --log:name=[ServiceName_TelegramService] [SUBFOLDER_SERVER]" Component_="ASC.TelegramService.exe"/>
<ROW ServiceInstall="ServiceName_UrlShortenerService" Name="[ServiceName_UrlShortenerService]" DisplayName="[ServiceName_UrlShortenerService]" ServiceType="16" StartType="2" ErrorControl="1" StartName="NT AUTHORITY\LocalService" Component_="UrlShortener.exe"/>
<ROW ServiceInstall="ServiceName_WebApi" Name="[ServiceName_WebApi]" DisplayName="[ServiceName_WebApi]" ServiceType="16" StartType="2" ErrorControl="1" StartName="NT AUTHORITY\LocalService" Arguments="--urls=[APP_URLS]:5000 --ENVIRONMENT=[ENVIRONMENT] --pathToConf=&quot;[APPDIR]config&quot; --$STORAGE_ROOT=&quot;[APPDIR]Data&quot; --log:dir=&quot;[APPDIR]Logs&quot; --log:name=[ServiceName_WebApi] [SUBFOLDER_SERVER]" Component_="ASC.Web.Api.exe"/>
<ROW ServiceInstall="ServiceName_WebStudio" Name="[ServiceName_WebStudio]" DisplayName="[ServiceName_WebStudio]" ServiceType="16" StartType="2" ErrorControl="1" StartName="NT AUTHORITY\LocalService" Arguments="--urls=[APP_URLS]:5003 --ENVIRONMENT=[ENVIRONMENT] --pathToConf=&quot;[APPDIR]config&quot; --$STORAGE_ROOT=&quot;[APPDIR]Data&quot; --log:dir=&quot;[APPDIR]Logs&quot; --log:name=[ServiceName_WebStudio] [SUBFOLDER_SERVER]" Component_="ASC.Web.Studio.exe"/>
<ROW ServiceInstall="ServiceName_WebhooksService" Name="[ServiceName_WebhooksService]" DisplayName="[ServiceName_WebhooksService]" ServiceType="16" StartType="2" ErrorControl="1" StartName="NT AUTHORITY\LocalService" Arguments="--urls=[APP_URLS]:5031 --ENVIRONMENT=[ENVIRONMENT] --pathToConf=&quot;[APPDIR]config&quot; --$STORAGE_ROOT=&quot;[APPDIR]Data&quot; --log:dir=&quot;[APPDIR]Logs&quot; --log:name=[ServiceName_BackupService] --core:products:folder=&quot;[APPDIR]products&quot; [SUBFOLDER_SERVER]" Component_="ASC.Webhooks.Service.exe"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.MsiThemeComponent">
<ATTRIBUTE name="UsedTheme" value="classic"/>
@ -930,19 +1286,15 @@
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.TxtUpdateComponent">
<ROW Name="ReplaceAppDir" TxtUpdateSet="xml" FindPattern="{APPDIR}" ReplacePattern="[APPDIR]" Options="2" Order="0" FileEncoding="-1"/>
<ROW Name="ReplaceAppDir" TxtUpdateSet="appsettings.test.json" FindPattern="{APPDIRCONF}" ReplacePattern="[APPDIR_FORWARD_SLASH]" Options="2" Order="0" FileEncoding="-1"/>
<ROW Name="ReplaceElasticHost" TxtUpdateSet="YourFile.txt" FindPattern=".Host.:.*" ReplacePattern="&quot;Host&quot;: &quot;localhost&quot;," Options="3" Order="0" FileEncoding="-1"/>
<ROW Name="ReplaceWinVol" TxtUpdateSet="xml" FindPattern="{WindowsVolume}" ReplacePattern="[WindowsVolume]" Options="2" Order="1" FileEncoding="-1"/>
<ROW Name="ReplaceAppDir" TxtUpdateSet="json" FindPattern="{APPDIRCONF}" ReplacePattern="[APPDIR_FORWARD_SLASH]" Options="2" Order="0" FileEncoding="-1"/>
<ROW Name="ReplaceAppDir" TxtUpdateSet="config.json" FindPattern="{APPDIRCONF}" ReplacePattern="[APPDIR_FORWARD_SLASH]" Options="2" Order="0" FileEncoding="-1"/>
<ROW Name="ReplaceAppDir" TxtUpdateSet="config.json_1" FindPattern="{APPDIRCONF}" ReplacePattern="[APPDIR_FORWARD_SLASH]" Options="2" Order="0" FileEncoding="-1"/>
<ROW Name="ReplaceInclude" TxtUpdateSet="YourFile.txt" FindPattern="/etc/nginx/includes" ReplacePattern="includes" Options="2" Order="0" FileEncoding="-1"/>
<ROW Name="ReplaceRoot" TxtUpdateSet="YourFile.txt_1" FindPattern="/var/www" ReplacePattern=".." Options="2" Order="0" FileEncoding="-1"/>
<ROW Name="ReplaceRoot" TxtUpdateSet="YourFile.txt_2" FindPattern="/var/www" ReplacePattern=".." Options="2" Order="0" FileEncoding="-1"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.TxtUpdateSetComponent">
<ROW Key="YourFile.txt" Component="AI_ExePath" FileName="elastic.json" Directory="config_Dir" Options="17"/>
<ROW Key="appsettings.test.json" Component="Socket.IO.exe" FileName="*.json" Directory="config_Dir" Options="17"/>
<ROW Key="config.json" Component="proxy.xml" FileName="config.json" Directory="config_2_Dir" Options="17"/>
<ROW Key="config.json_1" Component="proxy.xml" FileName="config.json" Directory="NewFolder_1_Dir" Options="17"/>
<ROW Key="json" Component="proxy.xml" FileName="config.json" Directory="config_1_Dir" Options="17"/>
<ROW Key="YourFile.txt" Component="conf" FileName="onlyoffice.conf" Directory="conf_Dir" Options="17"/>
<ROW Key="YourFile.txt_1" Component="conf" FileName="onlyoffice-client.conf" Directory="conf_Dir" Options="17"/>
<ROW Key="YourFile.txt_2" Component="includes" FileName="onlyoffice-public.conf" Directory="includes_Dir" Options="17"/>
<ROW Key="xml" Component="AI_ExePath" FileName="*.xml" Directory="tools_Dir" Options="17"/>
</COMPONENT>
</DOCUMENT>

View File

@ -4,14 +4,12 @@ echo #####################
echo # build backend #
echo #####################
set SRC_PATH=%~s2
pushd %~1
call dotnet build ASC.Web.sln
echo "== Build ASC.Thumbnails =="
pushd common\ASC.Thumbnails
call yarn install --frozen-lockfile
popd
call dotnet build ASC.Web.slnf
call dotnet build ASC.Migrations.sln -o %SRC_PATH%\services\ASC.Migration.Runner\service
echo "== Build ASC.UrlShortener =="
pushd common\ASC.UrlShortener

View File

@ -1,88 +1,61 @@
REM echo ######## Set variables ########
set "publisher="Ascensio System SIA""
set "zookeeper_version=3.7.1"
set "kafka_version=2.8.0"
set "nginx_version=1.21.1"
set "scala_version=2.12"
set "nuget="%cd%\thirdparty\SimpleRestServices\src\.nuget\NuGet.exe""
REM echo ######## Extracting and preparing files to build ########
%sevenzip% x build\install\win\nginx-%nginx_version%.zip -o"build\install\win\Files" -y
xcopy "build\install\win\Files\nginx-%nginx_version%" "build\install\win\Files\nginx" /s /y /b /i
rmdir build\install\win\Files\nginx-%nginx_version% /s /q
rmdir build\install\win\kafka-zookeeper /s /q
md build\install\win\kafka-zookeeper
md build\install\win\Files\nginx\temp
md build\install\win\Files\nginx\logs
%tar% -xvf build\install\win\apache-zookeeper-%zookeeper_version%-bin.tar.gz -C build\install\win\kafka-zookeeper
%tar% -xvf build\install\win\kafka_%scala_version%-%kafka_version%.tgz -C build\install\win\kafka-zookeeper
ren build\install\win\kafka-zookeeper\apache-zookeeper-%zookeeper_version%-bin zookeeper
ren build\install\win\kafka-zookeeper\kafka_%scala_version%-%kafka_version% kafka
md build\install\win\kafka-zookeeper\kafka\tools
md build\install\win\Files\tools
copy build\install\win\WinSW.NET4new.exe "build\install\win\kafka-zookeeper\kafka\tools\kafka.exe" /y
copy build\install\win\WinSW.NET4new.exe "build\install\win\kafka-zookeeper\kafka\tools\zookeeper.exe" /y
copy build\install\win\tools\zookeeper.xml "build\install\win\kafka-zookeeper\kafka\tools\zookeeper.xml" /y
copy build\install\win\tools\kafka.xml "build\install\win\kafka-zookeeper\kafka\tools\kafka.xml" /y
del /f /q build\install\win\apache-zookeeper-%zookeeper_version%-bin.*
del /f /q build\install\win\kafka_%scala_version%-%kafka_version%.*
copy build\install\win\WinSW.NET4.exe "build\install\win\Files\tools\proxy.exe" /y
copy build\install\win\tools\proxy.xml "build\install\win\Files\tools\proxy.xml" /y
md build\install\win\Files\Logs
md build\install\win\Files\service\
md build\install\win\Files\products\ASC.Files\server\temp
md build\install\win\Files\products\ASC.People\server\temp
md build\install\win\Files\services\ASC.Data.Backup\service\temp
md build\install\win\Files\services\ASC.Files.Service\service\temp
md build\install\win\Files\services\ASC.Notify\service\temp
md build\install\win\Files\services\ASC.Studio.Notify\service\temp
md build\install\win\Files\services\ASC.TelegramService\service\temp
md build\install\win\Files\services\ASC.Data.Backup.BackgroundTasks\service\temp
md build\install\win\Files\services\ASC.ClearEvents\service\temp
md build\install\win\Files\services\ASC.Migration\service\temp
md build\install\win\Files\services\ASC.Webhooks.Service\service\temp
md build\install\win\Files\services\ASC.Web.Api\service\temp
md build\install\win\Files\services\ASC.Web.Studio\service\temp
copy build\install\win\WinSW.NET4.exe "build\install\win\Files\tools\Proxy.exe" /y
copy build\install\win\tools\Proxy.xml "build\install\win\Files\tools\Proxy.xml" /y
copy build\install\win\WinSW3.0.0.exe "build\install\win\Files\tools\Socket.IO.exe" /y
copy build\install\win\tools\Socket.IO.xml "build\install\win\Files\tools\Socket.IO.xml" /y
copy build\install\win\WinSW3.0.0.exe "build\install\win\Files\tools\UrlShortener.exe" /y
copy build\install\win\tools\UrlShortener.xml "build\install\win\Files\tools\UrlShortener.xml" /y
copy build\install\win\WinSW3.0.0.exe "build\install\win\Files\tools\SsoAuth.exe" /y
copy build\install\win\tools\SsoAuth.xml "build\install\win\Files\tools\SsoAuth.xml" /y
copy build\install\win\WinSW3.0.0.exe "build\install\win\Files\tools\DocEditor.exe" /y
copy build\install\win\tools\DocEditor.xml "build\install\win\Files\tools\DocEditor.xml" /y
copy build\install\win\WinSW3.0.0.exe "build\install\win\Files\tools\Login.exe" /y
copy build\install\win\tools\Login.xml "build\install\win\Files\tools\Login.xml" /y
copy "build\install\win\nginx.conf" "build\install\win\Files\nginx\conf\nginx.conf" /y
copy "build\install\win\kafka-zookeeper\zookeeper\conf\zoo_sample.cfg" "build\install\win\kafka-zookeeper\zookeeper\conf\zoo.cfg" /y
del /f /q "build\install\win\kafka-zookeeper\zookeeper\conf\zoo_sample.cfg"
rmdir build\install\win\publish /s /q
del /f /q build\install\win\Files\nginx\conf\onlyoffice-login.conf
REM echo ######## Build Utils ########
%nuget% install %cd%\build\install\win\CustomActions\C#\Utils\packages.config -OutputDirectory %cd%\build\install\win\CustomActions\C#\Utils\packages
%msbuild% build\install\win\CustomActions\C#\Utils\Utils.csproj
copy build\install\win\CustomActions\C#\Utils\bin\Debug\Utils.CA.dll build\install\win\Utils.CA.dll /y
rmdir build\install\win\CustomActions\C#\Utils\bin /s /q
rmdir build\install\win\CustomActions\C#\Utils\obj /s /q
REM echo ######## Edit zookeeper/kafka cfg and proprties files ########
%sed% -i "s/\(dataDir\).*/\1=.\/..\/zookeeper\/Data/g" build/install/win/kafka-zookeeper/zookeeper/conf/zoo.cfg
%sed% -i "s/\(log.dirs\)=.*/\1=kafka-logs/g" build/install/win/kafka-zookeeper/kafka/config/server.properties
%sed% -i "s/\(zookeeper.connect\)=.*/\1=localhost:2181/g" build/install/win/kafka-zookeeper/kafka/config/server.properties
%sed% -i "s/\(clientPort\)=.*/\1=2181/g" build/install/win/kafka-zookeeper/kafka/config/zookeeper.properties
%sed% -i "s/\(dataDir\).*/\1=.\/..\/zookeeper\/Data/g" build/install/win/kafka-zookeeper/kafka/config/zookeeper.properties
%sed% -i "s/\(bootstrap.servers\)=.*/\1=localhost:9092/g" build/install/win/kafka-zookeeper/kafka/config/consumer.properties
%sed% -i "s/\(bootstrap.servers\)=.*/\1=localhost:9092/g" build/install/win/kafka-zookeeper/kafka/config/connect-standalone.properties
%sed% -i "s/\(offset.storage.file.filename\)=.*/\1=kafka-offsets/g" build/install/win/kafka-zookeeper/kafka/config/connect-standalone.properties
%sed% -i "s/\(logger.kafka.controller\)=.*,/\1=INFO,/g" build/install/win/kafka-zookeeper/kafka/config/log4j.properties
%sed% -i "s/\(logger.state.change.logger\)=.*,/\1=INFO,/g" build/install/win/kafka-zookeeper/kafka/config/log4j.properties
echo log4j.logger.kafka.producer.async.DefaultEventHandler=INFO, kafkaAppender >> build/install/win/kafka-zookeeper/kafka/config/log4j.properties
echo exit /b 1 >> build/install/win/kafka-zookeeper/kafka/bin/windows/zookeeper-server-start.bat
echo exit /b 1 >> build/install/win/kafka-zookeeper/kafka/bin/windows/kafka-server-start.bat
REM echo ######## Edit nginx conf files ########
%sed% -i "s!#rewrite!rewrite!g" build/install/win/Files/nginx/conf/onlyoffice.conf
%sed% -i "s!/etc/nginx/includes!includes!g" build/install/win/Files/nginx/conf/onlyoffice.conf
%sed% -i "s!/var/www!..!g" build/install/win/Files/nginx/conf/onlyoffice-*.conf
%sed% -i "s!/var/www!..!g" build/install/win/Files/nginx/conf/includes/onlyoffice-*.conf
REM echo ######## Edit json files ########
%sed% -i "s!\(\"machinekey\":\).\".*\"!\1 \"1123askdasjklasbnd\"!g" build/install/win/Files/config/appsettings*.json
%sed% -i "s!\(\"folder\":\).\".*\"!\1 \"{APPDIRCONF}products\"!g" build/install/win/Files/config/appsettings*.json
%sed% -i "s!\(\"path\":\).\".*\"!\1 \"{APPDIRCONF}services\/ASC.Socket.IO\/service\"!g" build/install/win/Files/config/socket*.json
%sed% -i "s!\(\"path\":\).\".*\"!\1 \"{APPDIRCONF}services\/ASC.Thumbnails\/service\"!g" build/install/win/Files/config/thumb*.json
%sed% -i "s!\(\"path\":\).\".*\"!\1 \"{APPDIRCONF}services\/ASC.UrlShortener\/service\/index.js\"!g" build/install/win/Files/config/urlshortener*.json
%sed% -i "s!\(\"path\":\).\".*\"!\1 \"{APPDIRCONF}services\/ASC.SsoAuth\/service\"!g" build/install/win/Files/config/ssoauth*.json
%sed% -i "s!\(\"path\":\).\".*\"!\1 \"{APPDIRCONF}services\/ASC.UrlShortener\/service\/index.js\"!g" build/install/win/Files/config/appsettings.services.json
%sed% -i "s!\(\"log\":\).\".*\"!\1 \"{APPDIRCONF}Logs\/urlshortener.log\"!g" build/install/win/Files/config/appsettings.services.json
REM echo ######## Delete temp files ########
del /f /q build\install\win\Files\config\sed*
del /f /q build\install\win\Files\nginx\conf\sed*
del /f /q build\install\win\Files\nginx\conf\includes\sed*
del /f /q build\install\win\kafka-zookeeper\zookeeper\conf\sed*
del /f /q build\install\win\kafka-zookeeper\kafka\config\sed*
del /f /q build\install\win\Files\services\*\service\config\sed*
del /f /q build\install\win\*.back.*
REM echo ######## Build kafka/zookeeper ########
%AdvancedInstaller% /rebuild "build\install\win\Apache ZooKeeper.aip"
copy "build\install\win\publish\Apache ZooKeeper.msi" "build\install\win\Apache ZooKeeper.msi" /y
%AdvancedInstaller% /rebuild "build\install\win\Apache Kafka.aip"
copy "build\install\win\publish\Apache Kafka.msi" "build\install\win\Apache Kafka.msi" /y
REM echo ######## Build MySQL Server Installer ########
iscc /Qp /S"byparam="signtool" sign /a /n "%publisher%" /t http://timestamp.digicert.com $f" "build\install\win\MySQL Server Installer Runner.iss"

View File

@ -29,9 +29,6 @@ function DownloadComponents {
}
}
$zookeeper_version = '3.7.1'
$kafka_version = '2.8.0'
$scala_version = '2.12'
$nginx_version = '1.21.1'
$path_prereq = "${pwd}\build\install\win\"
@ -43,17 +40,6 @@ $prerequisites = @(
link = "https://nginx.org/download/nginx-${nginx_version}.zip";
}
@{
download_allways = $false;
name = "apache-zookeeper-${zookeeper_version}-bin.tar.gz";
link = "https://dlcdn.apache.org/zookeeper/zookeeper-${zookeeper_version}/apache-zookeeper-${zookeeper_version}-bin.tar.gz";
}
@{
download_allways = $false;
name = "kafka_${scala_version}-${kafka_version}.tgz";
link = "https://archive.apache.org/dist/kafka/${kafka_version}/kafka_${scala_version}-${kafka_version}.tgz";
}
@{
download_allways = $false;
name = "WinSW.NET4new.exe";
@ -61,4 +47,16 @@ $prerequisites = @(
}
)
$path_nuget_packages = "${pwd}\.nuget\packages\"
$nuget_packages = @(
@{
download_allways = $false;
name = "rabbitmq.client.3.6.5.nupkg";
link = "https://www.nuget.org/api/v2/package/RabbitMQ.Client/3.6.5";
}
)
DownloadComponents $prerequisites $path_prereq
DownloadComponents $nuget_packages $path_nuget_packages

View File

@ -4,9 +4,12 @@ echo ######################
echo # build frontend #
echo ######################
pushd %~1
set DEBUG_INFO=%~2
pushd %~s1
call yarn install
if "%DEBUG_INFO%"=="true" yarn debug-info
call yarn build
call yarn deploy

View File

@ -17,10 +17,6 @@ if defined SecondArg (
)
xcopy "%PathToRepository%\build\deploy\public" "%PathToAppFolder%\public" /s /y /b /i
xcopy "%PathToRepository%\build\deploy\studio\client" "%PathToAppFolder%\studio\client" /s /y /b /i
xcopy "%PathToRepository%\build\deploy\studio\login" "%PathToAppFolder%\studio\login" /s /y /b /i
xcopy "%PathToRepository%\build\deploy\products\ASC.Files\client" "%PathToAppFolder%\products\ASC.Files\client" /s /y /b /i
xcopy "%PathToRepository%\build\deploy\products\ASC.Files\editor" "%PathToAppFolder%\products\ASC.Files\editor" /s /y /b /i
xcopy "%PathToRepository%\build\deploy\products\ASC.People\client" "%PathToAppFolder%\products\ASC.People\client" /s /y /b /i
xcopy "%PathToRepository%\build\deploy\client" "%PathToAppFolder%\client" /s /y /b /i
xcopy "%PathToRepository%\config\nginx" "%PathToAppFolder%\nginx\conf" /s /y /b /i
xcopy "%PathToRepository%\config\*" "%PathToAppFolder%\config" /y /b /i

View File

@ -32,54 +32,7 @@ http {
keepalive_timeout 65;
#gzip on;
server {
set $public_root ../public;
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html;
index index.html index.htm;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
include onlyoffice.conf;
include onlyoffice-*.conf;
# HTTPS server
#
#server {
# listen 443 ssl;
# server_name localhost;
# ssl_certificate cert.pem;
# ssl_certificate_key cert.key;
# ssl_session_cache shared:SSL:1m;
# ssl_session_timeout 5m;
# ssl_ciphers HIGH:!aNULL:!MD5;
# ssl_prefer_server_ciphers on;
# location / {
# root html;
# index index.html index.htm;
# }
#}
}

View File

@ -16,34 +16,24 @@ if defined SecondArg (
set PathToAppFolder=%FirstArg%\publish
)
rem publish in directory 'products'
REM dotnet publish "%PathToRepository%\products\ASC.Calendar\server\ASC.Calendar.csproj" -c Release --self-contained false -o "%PathToAppFolder%\products\ASC.Calendar\server"
REM dotnet publish "%PathToRepository%\products\ASC.CRM\server\ASC.CRM.csproj" -c Release --self-contained false -o "%PathToAppFolder%\products\ASC.CRM\server"
rem backend services (dotnet) in directory 'products'
dotnet publish "%PathToRepository%\products\ASC.Files\server\ASC.Files.csproj" -c Release --self-contained false -o "%PathToAppFolder%\products\ASC.Files\server"
REM dotnet publish "%PathToRepository%\products\ASC.Mail\server\ASC.Mail.csproj" -c Release --self-contained false -o "%PathToAppFolder%\products\ASC.Mail\server"
dotnet publish "%PathToRepository%\products\ASC.People\server\ASC.People.csproj" -c Release --self-contained false -o "%PathToAppFolder%\products\ASC.People\server"
REM dotnet publish "%PathToRepository%\products\ASC.Projects\server\ASC.Projects.csproj" -c Release --self-contained false -o "%PathToAppFolder%\products\ASC.Projects\server"
rem publish in directory 'services'
dotnet publish "%PathToRepository%\common\services\ASC.ApiSystem\ASC.ApiSystem.csproj" -c Release --self-contained false -o "%PathToAppFolder%\services\ASC.ApiSystem\service"
rem backend services (dotnet) in directory 'services'
dotnet publish "%PathToRepository%\common\services\ASC.Data.Backup\ASC.Data.Backup.csproj" -c Release --self-contained false -o "%PathToAppFolder%\services\ASC.Data.Backup\service"
dotnet publish "%PathToRepository%\common\services\ASC.Data.Storage.Encryption\ASC.Data.Storage.Encryption.csproj" -c Release --self-contained false -o "%PathToAppFolder%\services\ASC.Data.Storage.Encryption\service"
dotnet publish "%PathToRepository%\products\ASC.Files\service\ASC.Files.Service.csproj" -c Release --self-contained false -o "%PathToAppFolder%\services\ASC.Files.Service\service"
dotnet publish "%PathToRepository%\common\services\ASC.Data.Storage.Migration\ASC.Data.Storage.Migration.csproj" -c Release --self-contained false -o "%PathToAppFolder%\services\ASC.Data.Storage.Migration\service"
dotnet publish "%PathToRepository%\common\services\ASC.Notify\ASC.Notify.csproj" -c Release --self-contained false -o "%PathToAppFolder%\services\ASC.Notify\service"
dotnet publish "%PathToRepository%\common\services\ASC.Socket.IO.Svc\ASC.Socket.IO.Svc.csproj" -c Release --self-contained false -o "%PathToAppFolder%\services\ASC.Socket.IO.Svc\service"
dotnet publish "%PathToRepository%\common\services\ASC.Studio.Notify\ASC.Studio.Notify.csproj" -c Release --self-contained false -o "%PathToAppFolder%\services\ASC.Studio.Notify\service"
dotnet publish "%PathToRepository%\common\services\ASC.TelegramService\ASC.TelegramService.csproj" -c Release --self-contained false -o "%PathToAppFolder%\services\ASC.TelegramService\service"
dotnet publish "%PathToRepository%\common\services\ASC.Thumbnails.Svc\ASC.Thumbnails.Svc.csproj" -c Release --self-contained false -o "%PathToAppFolder%\services\ASC.Thumbnails.Svc\service"
dotnet publish "%PathToRepository%\common\services\ASC.UrlShortener.Svc\ASC.UrlShortener.Svc.csproj" -c Release --self-contained false -o "%PathToAppFolder%\services\ASC.UrlShortener.Svc\service"
dotnet publish "%PathToRepository%\common\services\ASC.Data.Backup.BackgroundTasks\ASC.Data.Backup.BackgroundTasks.csproj" -c Release --self-contained false -o "%PathToAppFolder%\services\ASC.Data.Backup.BackgroundTasks\service"
dotnet publish "%PathToRepository%\common\services\ASC.ClearEvents\ASC.ClearEvents.csproj" -c Release --self-contained false -o "%PathToAppFolder%\services\ASC.ClearEvents\service"
dotnet publish "%PathToRepository%\common\ASC.Migration\ASC.Migration.csproj" -c Release --self-contained false -o "%PathToAppFolder%\services\ASC.Migration\service"
dotnet publish "%PathToRepository%\common\services\ASC.Webhooks.Service\ASC.Webhooks.Service.csproj" -c Release --self-contained false -o "%PathToAppFolder%\services\ASC.Webhooks.Service\service"
dotnet publish "%PathToRepository%\web\ASC.Web.Api\ASC.Web.Api.csproj" -c Release --self-contained false -o "%PathToAppFolder%\services\ASC.Web.Api\service"
dotnet publish "%PathToRepository%\web\ASC.Web.Studio\ASC.Web.Studio.csproj" -c Release --self-contained false -o "%PathToAppFolder%\services\ASC.Web.Studio\service"
dotnet publish "%PathToRepository%\common\services\ASC.SsoAuth.Svc\ASC.SsoAuth.Svc.csproj" -c Release --self-contained false -o "%PathToAppFolder%\services\ASC.SsoAuth.Svc\service"
rem Publish backend services (Nodejs)
mkdir "%PathToAppFolder%\services\ASC.Thumbnails\service"
xcopy "%PathToRepository%\common\ASC.Thumbnails" "%PathToAppFolder%\services\ASC.Thumbnails\service" /s /y /b /i
rem backend services (Nodejs) in directory 'services'
mkdir "%PathToAppFolder%\services\ASC.UrlShortener\service"
xcopy "%PathToRepository%\common\ASC.UrlShortener" "%PathToAppFolder%\services\ASC.UrlShortener\service" /s /y /b /i
@ -52,3 +42,10 @@ xcopy "%PathToRepository%\common\ASC.Socket.IO" "%PathToAppFolder%\services\ASC.
mkdir "%PathToAppFolder%\services\ASC.SsoAuth\service"
xcopy "%PathToRepository%\common\ASC.SsoAuth" "%PathToAppFolder%\services\ASC.SsoAuth\service" /s /y /b /i
rem backend services (Nodejs) in directory 'products'
mkdir "%PathToAppFolder%\products\ASC.Login\login"
xcopy "%PathToRepository%\build\deploy\login" "%PathToAppFolder%\products\ASC.Login\login" /s /y /b /i
mkdir "%PathToAppFolder%\products\ASC.Files\editor"
xcopy "%PathToRepository%\build\deploy\editor" "%PathToAppFolder%\products\ASC.Files\editor" /s /y /b /i

View File

@ -0,0 +1,14 @@
<service>
<id>ASC.DocEditor</id>
<name>ASC.DocEditor</name>
<description>This service runs ASC.DocEditor</description>
<priority>RealTime</priority>
<startmode>Automatic</startmode>
<onfailure action="restart" delay="10 sec"/>
<executable>node</executable>
<arguments>&quot;{APPDIR}products\ASC.Files\editor\server.js&quot;</arguments>
<log mode="roll-by-size">
<sizeThreshold>10240</sizeThreshold>
<keepFiles>8</keepFiles>
</log>
</service>

View File

@ -0,0 +1,14 @@
<service>
<id>ASC.Login</id>
<name>ASC.Login</name>
<description>This service runs ASC.Login</description>
<priority>RealTime</priority>
<startmode>Automatic</startmode>
<onfailure action="restart" delay="10 sec"/>
<executable>node</executable>
<arguments>&quot;{APPDIR}products\ASC.Login\login\server.js&quot;</arguments>
<log mode="roll-by-size">
<sizeThreshold>10240</sizeThreshold>
<keepFiles>8</keepFiles>
</log>
</service>

View File

@ -0,0 +1,14 @@
<service>
<id>ASC.Socket.IO</id>
<name>ASC.Socket.IO</name>
<description>This service runs ASC.Socket.IO</description>
<priority>RealTime</priority>
<startmode>Automatic</startmode>
<onfailure action="restart" delay="10 sec"/>
<executable>node</executable>
<arguments>&quot;{APPDIR}services\ASC.Socket.IO\service\server.js&quot;</arguments>
<log mode="roll-by-size">
<sizeThreshold>10240</sizeThreshold>
<keepFiles>8</keepFiles>
</log>
</service>

View File

@ -0,0 +1,14 @@
<service>
<id>ASC.SsoAuth</id>
<name>ASC.SsoAuth</name>
<description>This service runs ASC.SsoAuth</description>
<priority>RealTime</priority>
<startmode>Automatic</startmode>
<onfailure action="restart" delay="10 sec"/>
<executable>node</executable>
<arguments>&quot;{APPDIR}services\ASC.SsoAuth\service\app.js&quot;</arguments>
<log mode="roll-by-size">
<sizeThreshold>10240</sizeThreshold>
<keepFiles>8</keepFiles>
</log>
</service>

View File

@ -0,0 +1,14 @@
<service>
<id>ASC.UrlShortener</id>
<name>ASC.UrlShortener</name>
<description>This service runs ASC.UrlShortener</description>
<priority>RealTime</priority>
<startmode>Automatic</startmode>
<onfailure action="restart" delay="10 sec"/>
<executable>node</executable>
<arguments>&quot;{APPDIR}services\ASC.UrlShortener\service\index.js&quot;</arguments>
<log mode="roll-by-size">
<sizeThreshold>10240</sizeThreshold>
<keepFiles>8</keepFiles>
</log>
</service>

View File

@ -1,15 +0,0 @@
<service>
<id>kafka</id>
<name>kafka</name>
<description>This service runs kafka</description>
<priority>RealTime</priority>
<startmode>Automatic</startmode>
<onfailure action="restart" delay="1 sec"/>
<executable>{WindowsVolume}Apache\kafka\bin\windows\kafka-server-start.bat</executable>
<arguments>{WindowsVolume}Apache\kafka\config\server.properties</arguments>
<workingdirectory>{WindowsVolume}Apache\kafka</workingdirectory>
<log mode="roll-by-size">
<sizeThreshold>10240</sizeThreshold>
<keepFiles>8</keepFiles>
</log>
</service>

View File

@ -1,15 +0,0 @@
<service>
<id>zookeeper</id>
<name>zookeeper</name>
<description>This service runs zookeeper</description>
<priority>RealTime</priority>
<startmode>Automatic</startmode>
<onfailure action="restart" delay="1 sec"/>
<executable>{WindowsVolume}Apache\kafka\bin\windows\zookeeper-server-start.bat</executable>
<arguments>{WindowsVolume}Apache\kafka\config\zookeeper.properties</arguments>
<workingdirectory>{WindowsVolume}Apache\kafka</workingdirectory>
<log mode="roll-by-size">
<sizeThreshold>10240</sizeThreshold>
<keepFiles>8</keepFiles>
</log>
</service>

View File

@ -1,4 +1,4 @@
@echo off
PUSHD %~dp0..\..
set servicepath=%cd%\web\ASC.Web.Api\bin\Debug\ASC.Web.Api.exe urls=http://0.0.0.0:5000 $STORAGE_ROOT=%cd%\Data log:dir=%cd%\Logs log:name=api pathToConf=%cd%\config core:products:folder=%cd%\products
set servicepath=%cd%\web\ASC.Web.Api\bin\Debug\ASC.Web.Api.exe urls=http://0.0.0.0:5000 $STORAGE_ROOT=%cd%\Data log:dir=%cd%\Logs log:name=web.api pathToConf=%cd%\config core:products:folder=%cd%\products

View File

@ -1,4 +1,4 @@
@echo off
PUSHD %~dp0..\..
set servicepath=%cd%\web\ASC.Web.Studio\bin\Debug\ASC.Web.Studio.exe urls=http://0.0.0.0:5003 $STORAGE_ROOT=%cd%\Data log:dir=%cd%\Logs log:name=studio pathToConf=%cd%\config core:products:folder=%cd%\products
set servicepath=%cd%\web\ASC.Web.Studio\bin\Debug\ASC.Web.Studio.exe urls=http://0.0.0.0:5003 $STORAGE_ROOT=%cd%\Data log:dir=%cd%\Logs log:name=web.studio pathToConf=%cd%\config core:products:folder=%cd%\products

View File

@ -603,7 +603,7 @@ public class LdapOperationJob : DistributedTaskProgress
foreach (var user in users)
{
if (!user.Equals(Constants.LostUser) && !user.IsVisitor(_userManager))
if (!user.Equals(Constants.LostUser) && !_userManager.IsVisitor(user))
{
if (!usersWithRightsFlat.Contains(user.Id.ToString()))
{
@ -1051,7 +1051,7 @@ public class LdapOperationJob : DistributedTaskProgress
case LdapOperationType.Save:
case LdapOperationType.Sync:
removedUser.Sid = null;
if (!removedUser.IsOwner(_tenantManager.GetCurrentTenant()) && !(_currentUser != null && _currentUser.Id == removedUser.Id && removedUser.IsAdmin(_userManager)))
if (!removedUser.IsOwner(_tenantManager.GetCurrentTenant()) && !(_currentUser != null && _currentUser.Id == removedUser.Id && _userManager.IsAdmin(removedUser)))
{
removedUser.Status = EmployeeStatus.Terminated; // Disable user on portal
}

View File

@ -290,7 +290,7 @@ public class LdapUserManager
var notifuEngineQueue = scope.ServiceProvider.GetRequiredService<NotifyEngineQueue>();
var client = workContext.NotifyContext.RegisterClient(notifuEngineQueue, source);
var confirmLink = _commonLinkUtility.GetConfirmationUrl(ldapUserInfo.Email, ConfirmType.EmailActivation);
var confirmLink = _commonLinkUtility.GetConfirmationEmailUrl(ldapUserInfo.Email, ConfirmType.EmailActivation);
client.SendNoticeToAsync(
NotifyConstants.ActionLdapActivation,

View File

@ -21,7 +21,7 @@
<PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="6.0.7" />
<PackageReference Include="Microsoft.Extensions.Hosting.Systemd" Version="6.0.0" />
<PackageReference Include="Microsoft.Extensions.Hosting.WindowsServices" Version="6.0.0" />
<PackageReference Include="NLog.Web.AspNetCore" Version="5.1.0" />
<PackageReference Include="NLog.Web.AspNetCore" Version="5.1.4" />
<PackageReference Include="StackExchange.Redis.Extensions.AspNetCore" Version="8.0.4" />
<PackageReference Include="StackExchange.Redis.Extensions.Newtonsoft" Version="8.0.4" />
<PackageReference Include="Autofac.Extensions.DependencyInjection" Version="7.2.0" />

View File

@ -273,35 +273,3 @@ public abstract class BaseStartup
}
}
public static class LogNLogConfigureExtenstion
{
private static LoggingConfiguration GetXmlLoggingConfiguration(IHostEnvironment hostEnvironment, IConfiguration configuration)
{
var loggerConfiguration = new XmlLoggingConfiguration(CrossPlatform.PathCombine(configuration["pathToConf"], "nlog.config"));
var settings = new ConfigurationExtension(configuration).GetSetting<NLogSettings>("log");
if (!string.IsNullOrEmpty(settings.Name))
{
loggerConfiguration.Variables["name"] = settings.Name;
}
if (!string.IsNullOrEmpty(settings.Dir))
{
var dir = Path.IsPathRooted(settings.Dir) ? settings.Dir : CrossPlatform.PathCombine(hostEnvironment.ContentRootPath, settings.Dir);
loggerConfiguration.Variables["dir"] = dir.TrimEnd('/').TrimEnd('\\') + Path.DirectorySeparatorChar;
}
return loggerConfiguration;
}
public static IHostBuilder ConfigureNLogLogging(this IHostBuilder hostBuilder)
{
return hostBuilder.ConfigureLogging((hostBuildexContext, r) =>
{
LogManager.ThrowConfigExceptions = false;
r.AddNLog(GetXmlLoggingConfiguration(hostBuildexContext.HostingEnvironment, hostBuildexContext.Configuration));
});
}
}

View File

@ -47,16 +47,15 @@ public static class ConfigurationManagerExtension
{"pathToConf", path }
});
config.AddJsonFile("appsettings.json")
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", true)
.AddJsonFile("storage.json")
.AddJsonFile("kafka.json")
.AddJsonFile($"kafka.{env.EnvironmentName}.json", true)
.AddJsonFile("rabbitmq.json")
.AddJsonFile($"rabbitmq.{env.EnvironmentName}.json", true)
.AddJsonFile("redis.json")
.AddJsonFile($"redis.{env.EnvironmentName}.json", true);
config.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true, reloadOnChange: true)
.AddJsonFile("storage.json", optional: false, reloadOnChange: true)
.AddJsonFile("kafka.json", optional: true, reloadOnChange: true)
.AddJsonFile($"kafka.{env.EnvironmentName}.json", optional: true, reloadOnChange: true)
.AddJsonFile("rabbitmq.json", optional: true, reloadOnChange: true)
.AddJsonFile($"rabbitmq.{env.EnvironmentName}.json", optional: true, reloadOnChange: true)
.AddJsonFile("redis.json", optional: true, reloadOnChange: true)
.AddJsonFile($"redis.{env.EnvironmentName}.json", optional: true, reloadOnChange: true);
return config;
}

View File

@ -24,6 +24,8 @@
// content are licensed under the terms of the Creative Commons Attribution-ShareAlike 4.0
// International. See the License terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode
using NLog.Web;
namespace ASC.Api.Core.Extensions;
public static class HostBuilderExtension
@ -33,8 +35,10 @@ public static class HostBuilderExtension
hostBuilder.UseSystemd();
hostBuilder.UseWindowsService();
hostBuilder.UseServiceProviderFactory(new AutofacServiceProviderFactory());
hostBuilder.ConfigureNLogLogging();
hostBuilder.UseNLog();
return hostBuilder;
}
}
}

View File

@ -0,0 +1,69 @@
// (c) Copyright Ascensio System SIA 2010-2022
//
// This program is a free software product.
// You can redistribute it and/or modify it under the terms
// of the GNU Affero General Public License (AGPL) version 3 as published by the Free Software
// Foundation. In accordance with Section 7(a) of the GNU AGPL its Section 15 shall be amended
// to the effect that Ascensio System SIA expressly excludes the warranty of non-infringement of
// any third-party rights.
//
// This program is distributed WITHOUT ANY WARRANTY, without even the implied warranty
// of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For details, see
// the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html
//
// You can contact Ascensio System SIA at Lubanas st. 125a-25, Riga, Latvia, EU, LV-1021.
//
// The interactive user interfaces in modified source and object code versions of the Program must
// display Appropriate Legal Notices, as required under Section 5 of the GNU AGPL version 3.
//
// Pursuant to Section 7(b) of the License you must retain the original Product logo when
// distributing the program. Pursuant to Section 7(e) we decline to grant you any rights under
// trademark law for use of our trademarks.
//
// All the Product's GUI elements, including illustrations and icon sets, as well as technical writing
// content are licensed under the terms of the Creative Commons Attribution-ShareAlike 4.0
// International. See the License terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode
using NLog.AWS.Logger;
namespace ASC.Api.Core.Extensions;
public static class ISetupBuilderExtension
{
public static ISetupBuilder LoadConfiguration(this ISetupBuilder loggingBuilder, IConfiguration configuration, IHostEnvironment hostEnvironment)
{
var conf = new XmlLoggingConfiguration(CrossPlatform.PathCombine(configuration["pathToConf"], "nlog.config"));
var settings = new ConfigurationExtension(configuration).GetSetting<NLogSettings>("log");
if (!string.IsNullOrEmpty(settings.Name))
{
conf.Variables["name"] = settings.Name;
}
if (!string.IsNullOrEmpty(settings.Dir))
{
var dir = Path.IsPathRooted(settings.Dir) ? settings.Dir : CrossPlatform.PathCombine(hostEnvironment.ContentRootPath, settings.Dir);
conf.Variables["dir"] = dir.TrimEnd('/').TrimEnd('\\') + Path.DirectorySeparatorChar;
}
foreach (var targetName in new[] { "aws", "aws_sql" })
{
var awsTarget = conf.FindTargetByName<AWSTarget>(targetName);
if (awsTarget == null) continue;
//hack
if (!string.IsNullOrEmpty(settings.Name))
{
awsTarget.LogGroup = awsTarget.LogGroup.Replace("${var:name}", settings.Name);
}
if (!string.IsNullOrEmpty(settings.AWSSecretAccessKey))
{
awsTarget.Credentials = new Amazon.Runtime.BasicAWSCredentials(settings.AWSAccessKeyId, settings.AWSSecretAccessKey);
}
}
return loggingBuilder.LoadConfiguration(conf);
}
}

View File

@ -81,24 +81,40 @@ public static class ServiceCollectionExtension
services.AddSingleton<IRabbitMQPersistentConnection>(sp =>
{
var cfg = sp.GetRequiredService<IConfiguration>();
var settings = cfg.GetSection("RabbitMQ").Get<RabbitMQSettings>();
var logger = sp.GetRequiredService<ILogger<DefaultRabbitMQPersistentConnection>>();
var factory = new ConnectionFactory()
{
HostName = settings.HostName,
DispatchConsumersAsync = true
};
if (!string.IsNullOrEmpty(settings.UserName))
{
factory.UserName = settings.UserName;
}
if (!string.IsNullOrEmpty(settings.Password))
{
factory.Password = settings.Password;
};
if (!string.IsNullOrEmpty(rabbitMQConfiguration.Uri))
{
factory.Uri = new Uri(rabbitMQConfiguration.Uri);
}
else
{
factory.HostName = rabbitMQConfiguration.HostName;
factory.UserName = rabbitMQConfiguration.UserName;
factory.Password = rabbitMQConfiguration.Password;
factory.Port = rabbitMQConfiguration.Port;
factory.VirtualHost = rabbitMQConfiguration.VirtualHost;
}
if (rabbitMQConfiguration.EnableSsl)
{
factory.Ssl = new SslOption
{
Enabled = rabbitMQConfiguration.EnableSsl,
Version = SslProtocols.Tls12
};
if (!string.IsNullOrEmpty(rabbitMQConfiguration.SslCertPath))
{
factory.Ssl.CertPath = rabbitMQConfiguration.SslCertPath;
factory.Ssl.ServerName = rabbitMQConfiguration.SslServerName;
}
}
var retryCount = 5;

View File

@ -182,8 +182,8 @@ public class EmployeeFullDtoHelper : EmployeeDtoHelper
Terminated = _apiDateTimeHelper.Get(userInfo.TerminatedDate),
WorkFrom = _apiDateTimeHelper.Get(userInfo.WorkFromDate),
Email = userInfo.Email,
IsVisitor = userInfo.IsVisitor(_userManager),
IsAdmin = userInfo.IsAdmin(_userManager),
IsVisitor = _userManager.IsVisitor(userInfo),
IsAdmin = _userManager.IsAdmin(userInfo),
IsOwner = userInfo.IsOwner(_context.Tenant),
IsLDAP = userInfo.IsLDAP(),
IsSSO = userInfo.IsSSO()

View File

@ -23,74 +23,96 @@
// All the Product's GUI elements, including illustrations and icon sets, as well as technical writing
// content are licensed under the terms of the Creative Commons Attribution-ShareAlike 4.0
// International. See the License terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode
using ValidationResult = ASC.Security.Cryptography.EmailValidationKeyProvider.ValidationResult;
namespace ASC.Api.Core.Security;
[Scope]
public class RoomInvitationLinksService
public class DocSpaceLinkHelper
{
private readonly CommonLinkUtility _commonLinkUtility;
private readonly IDbContextFactory<MessagesContext> _dbContextFactory;
private readonly IHttpContextAccessor _httpContextAccessor;
private readonly MessageService _messageService;
private readonly MessageTarget _messageTarget;
private readonly UserManager _userManager;
private readonly MessageService _messageService;
private readonly IDbContextFactory<MessagesContext> _dbContextFactory;
public RoomInvitationLinksService(
CommonLinkUtility commonLinkUtility,
private readonly Signature _signature;
private readonly EmailValidationKeyProvider _emailValidationKeyProvider;
public TimeSpan ExpirationInterval => _emailValidationKeyProvider.ValidEmailKeyInterval;
public TimeSpan ExpirationVisitInterval => _emailValidationKeyProvider.ValidVisitLinkInterval;
public DocSpaceLinkHelper(
IHttpContextAccessor httpContextAccessor,
MessageTarget messageTarget,
UserManager userManager,
MessageService messageService,
IDbContextFactory<MessagesContext> dbContextFactory)
MessageService messageService,
Signature signature,
IDbContextFactory<MessagesContext> dbContextFactory,
EmailValidationKeyProvider emailValidationKeyProvider)
{
_commonLinkUtility = commonLinkUtility;
_httpContextAccessor = httpContextAccessor;
_messageTarget = messageTarget;
_userManager = userManager;
_messageService = messageService;
_dbContextFactory = dbContextFactory;
_messageService = messageService;
_dbContextFactory = dbContextFactory;
_signature = signature;
_emailValidationKeyProvider = emailValidationKeyProvider;
}
public string GenerateLink<T>(T id, int fileShare, EmployeeType employeeType, Guid guid)
public string MakeKey(Guid linkId)
{
return GenerateLink(id, string.Empty, fileShare, employeeType, guid);
return _signature.Create(linkId);
}
public string GenerateLink<T>(T id, string email, int fileShare, EmployeeType employeeType, Guid guid)
public string MakeKey(string email)
{
var user = _userManager.GetUserByEmail(email);
return email + ConfirmType.LinkInvite.ToStringFast() + EmployeeType.User.ToStringFast();
}
if (user != ASC.Core.Users.Constants.LostUser)
public Guid Parse(string key)
{
return _signature.Read<Guid>(key);
}
public ValidationResult Validate(string key, string email)
{
return string.IsNullOrEmpty(email) ? ValidateExternalLink(key) : ValidateEmailLink(email, key);
}
private ValidationResult ValidateEmailLink(string email, string key)
{
var result = _emailValidationKeyProvider.ValidateEmailKey(MakeKey(email), key, ExpirationInterval);
if (result == ValidationResult.Ok)
{
throw new Exception("The user with this email already exists");
}
var canUsed = CanUsed(email, key, ExpirationVisitInterval);
var postifx = (int)employeeType + fileShare + id.ToString();
var link = _commonLinkUtility.GetConfirmationUrl(email, ConfirmType.LinkInvite, postifx, guid)
+ $"&emplType={employeeType:d}&roomId={id}&access={fileShare}";
return link;
}
public bool VisitProcess(string id, string email, string key, TimeSpan interval)
{
if (!string.IsNullOrEmpty(email))
{
var user = _userManager.GetUserByEmail(email);
if (user != ASC.Core.Users.Constants.LostUser)
if (!canUsed)
{
return false;
return ValidationResult.Expired;
}
}
var message = GetLinkInfo(id, email, key);
return result;
}
private ValidationResult ValidateExternalLink(string key)
{
var payload = Parse(key);
if (payload == default)
{
return ValidationResult.Invalid;
}
return ValidationResult.Ok;
}
private bool CanUsed(string email, string key, TimeSpan interval)
{
var message = GetLinkInfo(email, key);
if (message == null)
{
SaveVisitLinkInfo(id, email, key);
SaveVisitLinkInfo(email, key);
return true;
}
@ -98,27 +120,27 @@ public class RoomInvitationLinksService
return message.Date + interval > DateTime.UtcNow;
}
private void SaveVisitLinkInfo(string id, string email, string key)
{
var headers = _httpContextAccessor?.HttpContext?.Request?.Headers;
var target = _messageTarget.CreateFromGroupValues(email != null ? new[] { id, email } : new[] { id });
_messageService.Send(headers, MessageAction.RoomInviteLinkUsed, target, key);
}
private AuditEvent GetLinkInfo(string id, string email, string key)
private AuditEvent GetLinkInfo(string email, string key)
{
using var context = _dbContextFactory.CreateDbContext();
var target = _messageTarget.CreateFromGroupValues(email != null ? new[] { id, email } : new[] { id });
var target = _messageTarget.Create(email);
var description = JsonConvert.SerializeObject(new[] { key },
new JsonSerializerSettings
{
DateTimeZoneHandling = DateTimeZoneHandling.Utc
});
var message = context.AuditEvents.Where(a => a.Target == target.ToString() &&
var message = context.AuditEvents.Where(a => a.Target == target.ToString() &&
a.DescriptionRaw == description).FirstOrDefault();
return message;
}
private void SaveVisitLinkInfo(string email, string key)
{
var headers = _httpContextAccessor?.HttpContext?.Request?.Headers;
var target = _messageTarget.Create(email);
_messageService.Send(headers, MessageAction.RoomInviteLinkUsed, target, key);
}
}

View File

@ -38,7 +38,7 @@ public class EmailValidationKeyModelHelper
private readonly AuthContext _authContext;
private readonly UserManager _userManager;
private readonly AuthManager _authentication;
private readonly RoomInvitationLinksService _roomLinksService;
private readonly DocSpaceLinkHelper _docSpaceLinkHelper;
private readonly AuditEventsRepository _auditEventsRepository;
private readonly TenantUtil _tenantUtil;
private readonly MessageTarget _messageTarget;
@ -49,7 +49,7 @@ public class EmailValidationKeyModelHelper
AuthContext authContext,
UserManager userManager,
AuthManager authentication,
RoomInvitationLinksService roomLinksService,
DocSpaceLinkHelper docSpaceLinkHelper,
AuditEventsRepository auditEventsRepository,
TenantUtil tenantUtil,
MessageTarget messageTarget)
@ -59,7 +59,7 @@ public class EmailValidationKeyModelHelper
_authContext = authContext;
_userManager = userManager;
_authentication = authentication;
_roomLinksService = roomLinksService;
_docSpaceLinkHelper = docSpaceLinkHelper;
_auditEventsRepository = auditEventsRepository;
_tenantUtil = tenantUtil;
_messageTarget = messageTarget;
@ -87,11 +87,6 @@ public class EmailValidationKeyModelHelper
request.TryGetValue("uid", out var userIdKey);
Guid.TryParse(userIdKey, out var userId);
request.TryGetValue("access", out var fileShareRaw);
int.TryParse(fileShareRaw, out var fileShare);
request.TryGetValue("roomId", out var roomId);
return new EmailValidationKeyModel
{
Email = _email,
@ -99,14 +94,12 @@ public class EmailValidationKeyModelHelper
Key = key,
Type = cType,
UiD = userId,
RoomAccess = fileShare,
RoomId = roomId
};
}
public ValidationResult Validate(EmailValidationKeyModel inDto)
{
var (key, emplType, email, uiD, type, fileShare, roomId) = inDto;
var (key, emplType, email, uiD, type) = inDto;
ValidationResult checkKeyResult;
@ -117,18 +110,12 @@ public class EmailValidationKeyModelHelper
break;
case ConfirmType.LinkInvite:
if (fileShare != default && !string.IsNullOrEmpty(roomId))
{
checkKeyResult = _provider.ValidateEmailKey(email + type + ((int)emplType + (int)fileShare + roomId), key, _provider.ValidEmailKeyInterval);
if (checkKeyResult == ValidationResult.Ok &&
!_roomLinksService.VisitProcess(roomId, email, key, _provider.ValidVisitLinkInterval))
{
checkKeyResult = ValidationResult.Expired;
}
break;
}
checkKeyResult = _docSpaceLinkHelper.Validate(key, email);
checkKeyResult = _provider.ValidateEmailKey(type.ToString() + (int)emplType, key, _provider.ValidEmailKeyInterval);
if (checkKeyResult == ValidationResult.Invalid)
{
checkKeyResult = _provider.ValidateEmailKey(type.ToString() + (int)emplType, key, _provider.ValidEmailKeyInterval);
}
break;
case ConfirmType.PortalOwnerChange:

View File

@ -29,6 +29,7 @@
<PackageReference Include="ARSoft.Tools.NetStandard.DXSdata" Version="1.0.0" />
<PackageReference Include="Autofac.Configuration" Version="6.0.0" />
<PackageReference Include="AutoMapper" Version="11.0.1" />
<PackageReference Include="AWS.Logger.NLog" Version="3.1.0" />
<PackageReference Include="Confluent.Kafka" Version="1.9.0" />
<PackageReference Include="Google.Protobuf" Version="3.21.4" />
<PackageReference Include="Grpc.Tools" Version="2.47.0">
@ -54,7 +55,7 @@
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference> -->
<PackageReference Include="NLog" Version="5.0.1" />
<PackageReference Include="NLog" Version="5.0.4" />
<PackageReference Include="NVelocity" Version="1.2.0" />
<PackageReference Include="protobuf-net" Version="3.1.17" />
<PackageReference Include="RabbitMQ.Client" Version="6.4.0" />

View File

@ -24,13 +24,15 @@
// content are licensed under the terms of the Creative Commons Attribution-ShareAlike 4.0
// International. See the License terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode
using System.Security.Authentication;
namespace ASC.Common.Caching;
[Singletone]
public class RabbitMQCache<T> : IDisposable, ICacheNotify<T> where T : IMessage<T>, new()
{
private IConnection _connection;
private readonly IConnectionFactory _connectionFactory;
private readonly ConnectionFactory _factory;
private IModel _consumerChannel;
private readonly Guid _instanceId;
@ -53,14 +55,37 @@ public class RabbitMQCache<T> : IDisposable, ICacheNotify<T> where T : IMessage<
var rabbitMQConfiguration = configuration.GetSection("rabbitmq").Get<RabbitMQSettings>();
_connectionFactory = new ConnectionFactory
_factory = new ConnectionFactory();
if (!string.IsNullOrEmpty(rabbitMQConfiguration.Uri))
{
HostName = rabbitMQConfiguration.HostName,
UserName = rabbitMQConfiguration.UserName,
Password = rabbitMQConfiguration.Password
};
_factory.Uri = new Uri(rabbitMQConfiguration.Uri);
}
else
{
_factory.HostName = rabbitMQConfiguration.HostName;
_factory.UserName = rabbitMQConfiguration.UserName;
_factory.Password = rabbitMQConfiguration.Password;
_factory.Port = rabbitMQConfiguration.Port;
_factory.VirtualHost = rabbitMQConfiguration.VirtualHost;
}
if (rabbitMQConfiguration.EnableSsl)
{
_factory.Ssl = new SslOption
{
Enabled = rabbitMQConfiguration.EnableSsl,
Version = SslProtocols.Tls12
};
if (!string.IsNullOrEmpty(rabbitMQConfiguration.SslCertPath))
{
_factory.Ssl.CertPath = rabbitMQConfiguration.SslCertPath;
_factory.Ssl.ServerName = rabbitMQConfiguration.SslServerName;
}
}
_connection = _connectionFactory.CreateConnection();
_connection = _factory.CreateConnection();
_consumerChannel = CreateConsumerChannel();
StartBasicConsume();
@ -125,7 +150,7 @@ public class RabbitMQCache<T> : IDisposable, ICacheNotify<T> where T : IMessage<
return;
}
_connection = _connectionFactory.CreateConnection();
_connection = _factory.CreateConnection();
_connection.ConnectionShutdown += (s, e) => TryConnect();
_connection.CallbackException += (s, e) => TryConnect();
_connection.ConnectionBlocked += (s, e) => TryConnect();
@ -213,6 +238,11 @@ public class RabbitMQSettings
{
public string HostName { get; set; }
public string UserName { get; set; }
public string Password { get; set; }
public string Password { get; set; }
public int Port { get; set; }
public string VirtualHost { get; set; }
public string Uri { get; set; }
public bool EnableSsl { get; set; }
public string SslServerName { get; set; }
public string SslCertPath { get; set; }
}

View File

@ -30,5 +30,8 @@ namespace ASC.Common.Logging;
public class NLogSettings
{
public string Name { get; set; }
public string Dir { get; set; }
public string Dir { get; set; }
public string AWSAccessKeyId { get; set; }
public string AWSSecretAccessKey {get; set;}
}

View File

@ -54,18 +54,17 @@ public class Signature
return Read<T>(signature, Encoding.UTF8.GetString(_machinePseudoKeys.GetMachineConstant()));
}
public static T Read<T>(string signature, string secret)
public T Read<T>(string signature, Action<string> signatureResolver = null)
{
return Read<T>(signature, Encoding.UTF8.GetString(_machinePseudoKeys.GetMachineConstant()), signatureResolver);
}
public static T Read<T>(string signature, string secret, Action<string> signatureResolver = null)
{
try
{
var lastSignChar = Int32.Parse(signature.Substring(signature.Length - 1));
signature = signature.Remove(signature.Length - 1);
signatureResolver?.Invoke(signature);
while(lastSignChar > 0)
{
signature = signature + "=";
lastSignChar--;
}
var payloadParts = Encoding.UTF8.GetString(WebEncoders.Base64UrlDecode(signature)).Split('?');
if (GetHashBase64(payloadParts[1].Trim() + secret) == payloadParts[0])

View File

@ -144,10 +144,10 @@ public class UserManager
switch (type)
{
case EmployeeType.User:
users = users.Where(u => !u.IsVisitor(this));
users = users.Where(u => !this.IsVisitor(u));
break;
case EmployeeType.Visitor:
users = users.Where(u => u.IsVisitor(this));
users = users.Where(u => this.IsVisitor(u));
break;
}
@ -715,7 +715,7 @@ public class UserManager
if (group == null)
{
group = ToGroup(Constants.BuildinGroups.FirstOrDefault(r => r.ID == groupID) ?? Constants.LostGroupInfo);
group = ToGroup(Constants.BuildinGroups.FirstOrDefault(r => r.ID == groupID) ?? Constants.LostGroupInfo);
}
if (group == null)

View File

@ -31,6 +31,7 @@ public class TenantIpRestrictions
public int Id { get; set; }
public int Tenant { get; set; }
public string Ip { get; set; }
public bool ForAdmin { get; set; }
}
public static class TenantIpRestrictionsExtension
@ -63,6 +64,11 @@ public static class TenantIpRestrictionsExtension
.HasCharSet("utf8")
.UseCollation("utf8_general_ci");
entity.Property(e => e.ForAdmin)
.IsRequired()
.HasColumnName("for_admin")
.HasColumnType("TINYINT(1)");
entity.Property(e => e.Tenant).HasColumnName("tenant");
});
}
@ -83,6 +89,11 @@ public static class TenantIpRestrictionsExtension
.HasColumnName("ip")
.HasMaxLength(50);
entity.Property(e => e.ForAdmin)
.IsRequired()
.HasColumnName("for_admin")
.HasColumnType("TINYINT(1)");
entity.Property(e => e.Tenant).HasColumnName("tenant");
});

View File

@ -24,6 +24,8 @@
// content are licensed under the terms of the Creative Commons Attribution-ShareAlike 4.0
// International. See the License terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode
using ASC.Notify;
namespace ASC.Core.Common.Hosting;
[Scope]
@ -48,6 +50,10 @@ public class RegisterInstanceDao<T> : IRegisterInstanceDao<T> where T : IHostedS
if (inst == null)
{
await _instanceRegistrationContext.AddAsync(obj);
}
else
{
_instanceRegistrationContext.Entry(inst).CurrentValues.SetValues(obj);
}
bool saveFailed;

View File

@ -60,7 +60,7 @@ public class RegisterInstanceManager<T> : IRegisterInstanceManager<T> where T :
{
var firstAliceInstance = GetFirstAliveInstance(instances);
if (firstAliceInstance != null && firstAliceInstance.InstanceRegistrationId == instance.InstanceRegistrationId)
if (firstAliceInstance == null || firstAliceInstance.InstanceRegistrationId == instance.InstanceRegistrationId)
{
instance.IsActive = true;
}

View File

@ -468,7 +468,8 @@ public enum MessageAction
RoomArchived = 5072,
RoomUnarchived = 5073,
RoomDeleted = 5074,
RoomUpdateAccess = 5075,
RoomUpdateAccess = 5075,
RoomInvintationUpdateAccess = 5082,
TagCreated = 5076,
TagsDeleted = 5077,

View File

@ -59,11 +59,12 @@ public class EmailValidationKeyProvider
}
if (!TimeSpan.TryParse(configuration["visit:validinterval"], out var validVisitLinkInterval))
{
ValidVisitLinkInterval = TimeSpan.FromMinutes(15);
validVisitLinkInterval = TimeSpan.FromMinutes(15);
}
ValidEmailKeyInterval = validInterval;
ValidAuthKeyInterval = authValidInterval;
ValidVisitLinkInterval = validVisitLinkInterval;
_logger = logger;
}
@ -168,11 +169,9 @@ public class EmailValidationKeyModel
public string Email { get; set; }
public Guid? UiD { get; set; }
public ConfirmType? Type { get; set; }
public int RoomAccess { get; set; }
public string RoomId { get; set; }
public void Deconstruct(out string key, out EmployeeType? emplType, out string email, out Guid? uiD, out ConfirmType? type, out int roomAccess, out string roomId)
public void Deconstruct(out string key, out EmployeeType? emplType, out string email, out Guid? uiD, out ConfirmType? type)
{
(key, emplType, email, uiD, type, roomAccess, roomId) = (Key, EmplType, Email, UiD, Type, RoomAccess, RoomId);
(key, emplType, email, uiD, type) = (Key, EmplType, Email, UiD, Type);
}
}

View File

@ -43,19 +43,36 @@ public static class UserExtensions
return ui != null && ui.Id == authContext.CurrentAccount.ID;
}
public static bool IsAdmin(this UserInfo ui, UserManager UserManager)
public static bool IsAdmin(this UserManager userManager, Guid id)
{
return ui != null && UserManager.IsUserInGroup(ui.Id, Constants.GroupAdmin.ID);
var ui = userManager.GetUsers(id);
return userManager.IsAdmin(ui);
}
public static bool IsVisitor(this UserInfo ui, UserManager UserManager)
public static bool IsAdmin(this UserManager userManager, UserInfo ui)
{
return ui != null && UserManager.IsUserInGroup(ui.Id, Constants.GroupVisitor.ID);
return ui != null && userManager.IsUserInGroup(ui.Id, Constants.GroupAdmin.ID);
}
public static bool IsOutsider(this UserInfo ui, UserManager userManager)
public static bool IsVisitor(this UserManager userManager, Guid id)
{
return IsVisitor(ui, userManager) && ui.Id == Constants.OutsideUser.Id;
var ui = userManager.GetUsers(id);
return userManager.IsVisitor(ui);
}
public static bool IsVisitor(this UserManager userManager, UserInfo ui)
{
return ui != null && userManager.IsUserInGroup(ui.Id, Constants.GroupVisitor.ID);
}
public static bool IsOutsider(this UserManager userManager, Guid id)
{
return userManager.IsVisitor(id) && id == Constants.OutsideUser.Id;
}
public static bool IsOutsider(this UserManager userManager, UserInfo ui)
{
return userManager.IsVisitor(ui) && ui.Id == Constants.OutsideUser.Id;
}
public static bool IsLDAP(this UserInfo ui)

View File

@ -72,7 +72,7 @@ public class BackupAjaxHandler
_tempPath = tempPath;
}
public void StartBackup(BackupStorageType storageType, Dictionary<string, string> storageParams, bool backupMail)
public void StartBackup(BackupStorageType storageType, Dictionary<string, string> storageParams)
{
DemandPermissionsBackup();
@ -80,7 +80,6 @@ public class BackupAjaxHandler
{
TenantId = GetCurrentTenantId(),
UserId = _securityContext.CurrentAccount.ID,
BackupMail = backupMail,
StorageType = storageType,
StorageParams = storageParams
};
@ -141,7 +140,7 @@ public class BackupAjaxHandler
return _backupService.GetBackupHistory(GetCurrentTenantId());
}
public void CreateSchedule(BackupStorageType storageType, Dictionary<string, string> storageParams, int backupsStored, CronParams cronParams, bool backupMail)
public void CreateSchedule(BackupStorageType storageType, Dictionary<string, string> storageParams, int backupsStored, CronParams cronParams)
{
DemandPermissionsBackup();
@ -155,7 +154,6 @@ public class BackupAjaxHandler
var scheduleRequest = new CreateScheduleRequest
{
TenantId = _tenantManager.GetCurrentTenant().Id,
BackupMail = backupMail,
Cron = cronParams.ToString(),
NumberOfBackupsStored = backupsStored,
StorageType = storageType,
@ -198,7 +196,6 @@ public class BackupAjaxHandler
StorageType = response.StorageType,
StorageParams = response.StorageParams.ToDictionary(r => r.Key, r => r.Value) ?? new Dictionary<string, string>(),
CronParams = new CronParams(response.Cron),
BackupMail = response.BackupMail.NullIfDefault(),
BackupsStored = response.NumberOfBackupsStored.NullIfDefault(),
LastBackupTime = response.LastBackupTime
};
@ -224,7 +221,6 @@ public class BackupAjaxHandler
var Schedule = new CreateScheduleRequest
{
TenantId = _tenantManager.GetCurrentTenant().Id,
BackupMail = schedule.BackupMail != null && (bool)schedule.BackupMail,
Cron = schedule.CronParams.ToString(),
NumberOfBackupsStored = schedule.BackupsStored == null ? 0 : (int)schedule.BackupsStored,
StorageType = schedule.StorageType,
@ -337,7 +333,7 @@ public class BackupAjaxHandler
#region transfer
public void StartTransfer(string targetRegion, bool notifyUsers, bool transferMail)
public void StartTransfer(string targetRegion, bool notifyUsers)
{
DemandPermissionsTransfer();
@ -347,7 +343,6 @@ public class BackupAjaxHandler
{
TenantId = GetCurrentTenantId(),
TargetRegion = targetRegion,
BackupMail = transferMail,
NotifyUsers = notifyUsers
});
@ -405,7 +400,6 @@ public class BackupAjaxHandler
public BackupStorageType StorageType { get; set; }
public Dictionary<string, string> StorageParams { get; set; }
public CronParams CronParams { get; set; }
public bool? BackupMail { get; set; }
public int? BackupsStored { get; set; }
public DateTime LastBackupTime { get; set; }
}

View File

@ -41,7 +41,6 @@ public class StartBackupRequest
{
public int TenantId { get; set; }
public Guid UserId { get; set; }
public bool BackupMail { get; set; }
public BackupStorageType StorageType { get; set; }
public string StorageBasePath { get; set; }
public Dictionary<string, string> StorageParams { get; set; }
@ -61,7 +60,6 @@ public class StartTransferRequest
public int TenantId { get; set; }
public string TargetRegion { get; set; }
public bool NotifyUsers { get; set; }
public bool BackupMail { get; set; }
}
public class TransferRegion
@ -91,7 +89,6 @@ public class ScheduleResponse
{
public BackupStorageType StorageType { get; set; }
public string StorageBasePath { get; set; }
public bool BackupMail { get; set; }
public int NumberOfBackupsStored { get; set; }
public string Cron { get; set; }
public DateTime LastBackupTime { get; set; }

View File

@ -124,7 +124,7 @@ public class NotifyHelper
foreach (var user in users)
{
var hash = _authManager.GetUserPasswordStamp(user.Id).ToString("s");
var confirmationUrl = _commonLinkUtility.GetConfirmationUrl(user.Email, ConfirmType.PasswordChange, hash);
var confirmationUrl = _commonLinkUtility.GetConfirmationEmailUrl(user.Email, ConfirmType.PasswordChange, hash);
Func<string> greenButtonText = () => BackupResource.ButtonSetPassword;

View File

@ -30,8 +30,6 @@ public class BackupSchedule : BaseEntity
{
public int TenantId { get; set; }
public bool BackupMail { get; set; }
public string Cron { get; set; }
public int BackupsStored { get; set; }
@ -76,11 +74,6 @@ public static class BackupScheduleExtension
.HasColumnType("int(10)")
.ValueGeneratedNever();
entity.Property(e => e.BackupMail)
.HasColumnName("backup_mail")
.HasColumnType("tinyint(1)")
.HasDefaultValueSql("'0'");
entity.Property(e => e.Cron)
.IsRequired()
.HasColumnName("cron")
@ -132,11 +125,6 @@ public static class BackupScheduleExtension
.HasColumnName("tenant_id")
.HasMaxLength(10);
entity.Property(e => e.BackupMail)
.HasColumnName("backup_mail")
.HasMaxLength(10)
.HasDefaultValueSql("'0'");
entity.Property(e => e.Cron)
.IsRequired()
.HasColumnName("cron")

View File

@ -38,14 +38,12 @@ public record BackupRequestIntegrationEvent : IntegrationEvent
int tenantId,
Guid createBy,
Dictionary<string, string> storageParams,
bool backupMail,
bool isScheduled = false,
int backupsStored = 0,
string storageBasePath = "") : base(createBy, tenantId)
{
StorageType = storageType;
StorageParams = storageParams;
BackupMail = backupMail;
IsScheduled = isScheduled;
BackupsStored = backupsStored;
StorageBasePath = storageBasePath;
@ -57,9 +55,6 @@ public record BackupRequestIntegrationEvent : IntegrationEvent
[ProtoMember(2)]
public Dictionary<string, string> StorageParams { get; private init; }
[ProtoMember(3)]
public bool BackupMail { get; private init; }
[ProtoMember(4)]
public bool IsScheduled { get; private init; }

View File

@ -126,7 +126,7 @@ public class BackupService : IBackupService
public void StartTransfer(StartTransferRequest request)
{
var progress = _backupWorker.StartTransfer(request.TenantId, request.TargetRegion, request.BackupMail, request.NotifyUsers);
var progress = _backupWorker.StartTransfer(request.TenantId, request.TargetRegion, request.NotifyUsers);
if (!string.IsNullOrEmpty(progress.Error))
{
throw new FaultException();
@ -209,7 +209,6 @@ public class BackupService : IBackupService
{
TenantId = request.TenantId,
Cron = request.Cron,
BackupMail = request.BackupMail,
BackupsStored = request.NumberOfBackupsStored,
StorageType = request.StorageType,
StorageBasePath = request.StorageBasePath,
@ -231,7 +230,6 @@ public class BackupService : IBackupService
{
StorageType = schedule.StorageType,
StorageBasePath = schedule.StorageBasePath,
BackupMail = schedule.BackupMail,
NumberOfBackupsStored = schedule.BackupsStored,
Cron = schedule.Cron,
LastBackupTime = schedule.LastBackupTime,

View File

@ -209,7 +209,7 @@ public class BackupWorker
}
}
public BackupProgress StartTransfer(int tenantId, string targetRegion, bool transferMail, bool notify)
public BackupProgress StartTransfer(int tenantId, string targetRegion, bool notify)
{
lock (_synchRoot)
{
@ -223,7 +223,7 @@ public class BackupWorker
if (item == null)
{
item = _serviceProvider.GetService<TransferProgressItem>();
item.Init(targetRegion, transferMail, tenantId, TempFolder, _limit, notify, _currentRegion, _configPaths);
item.Init(targetRegion, tenantId, TempFolder, _limit, notify, _currentRegion, _configPaths);
_progressQueue.EnqueueTask(item);
}

View File

@ -54,7 +54,6 @@ namespace ASC.Data.Backup.Services;
[Transient]
public class BackupProgressItem : BaseBackupProgressItem
{
public bool BackupMail { get; set; }
public Dictionary<string, string> StorageParams { get; set; }
public string TempFolder { get; set; }
@ -94,7 +93,6 @@ public class BackupProgressItem : BaseBackupProgressItem
TenantId = schedule.TenantId;
_storageType = schedule.StorageType;
_storageBasePath = schedule.StorageBasePath;
BackupMail = schedule.BackupMail;
StorageParams = JsonConvert.DeserializeObject<Dictionary<string, string>>(schedule.StorageParams);
_isScheduled = isScheduled;
TempFolder = tempFolder;
@ -109,7 +107,6 @@ public class BackupProgressItem : BaseBackupProgressItem
TenantId = request.TenantId;
_storageType = request.StorageType;
_storageBasePath = request.StorageBasePath;
BackupMail = request.BackupMail;
StorageParams = request.StorageParams.ToDictionary(r => r.Key, r => r.Value);
_isScheduled = isScheduled;
TempFolder = tempFolder;
@ -142,11 +139,7 @@ public class BackupProgressItem : BaseBackupProgressItem
{
var backupTask = _backupPortalTask;
backupTask.Init(TenantId, _configPaths[_currentRegion], tempFile, _limit);
if (!BackupMail)
{
backupTask.IgnoreModule(ModuleName.Mail);
}
backupTask.Init(TenantId, _configPaths[_currentRegion], tempFile, _limit);
backupTask.ProgressChanged += (sender, args) =>
{

View File

@ -74,7 +74,6 @@ public class TransferProgressItem : BaseBackupProgressItem
}
public string TargetRegion { get; set; }
public bool TransferMail { get; set; }
public bool Notify { get; set; }
public string TempFolder { get; set; }
public Dictionary<string, string> ConfigPaths { get; set; }
@ -83,7 +82,6 @@ public class TransferProgressItem : BaseBackupProgressItem
public void Init(
string targetRegion,
bool transferMail,
int tenantId,
string tempFolder,
int limit,
@ -93,7 +91,6 @@ public class TransferProgressItem : BaseBackupProgressItem
{
TenantId = tenantId;
TargetRegion = targetRegion;
TransferMail = transferMail;
Notify = notify;
TempFolder = tempFolder;
ConfigPaths = configPaths;
@ -122,11 +119,8 @@ public class TransferProgressItem : BaseBackupProgressItem
{
Percentage = args.Progress;
PublishChanges();
};
if (!TransferMail)
{
transferProgressItem.IgnoreModule(ModuleName.Mail);
}
};
transferProgressItem.RunJob();
Link = GetLink(alias, false);

View File

@ -1,101 +0,0 @@
// (c) Copyright Ascensio System SIA 2010-2022
//
// This program is a free software product.
// You can redistribute it and/or modify it under the terms
// of the GNU Affero General Public License (AGPL) version 3 as published by the Free Software
// Foundation. In accordance with Section 7(a) of the GNU AGPL its Section 15 shall be amended
// to the effect that Ascensio System SIA expressly excludes the warranty of non-infringement of
// any third-party rights.
//
// This program is distributed WITHOUT ANY WARRANTY, without even the implied warranty
// of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For details, see
// the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html
//
// You can contact Ascensio System SIA at Lubanas st. 125a-25, Riga, Latvia, EU, LV-1021.
//
// The interactive user interfaces in modified source and object code versions of the Program must
// display Appropriate Legal Notices, as required under Section 5 of the GNU AGPL version 3.
//
// Pursuant to Section 7(b) of the License you must retain the original Product logo when
// distributing the program. Pursuant to Section 7(e) we decline to grant you any rights under
// trademark law for use of our trademarks.
//
// All the Product's GUI elements, including illustrations and icon sets, as well as technical writing
// content are licensed under the terms of the Creative Commons Attribution-ShareAlike 4.0
// International. See the License terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode
namespace ASC.Data.Backup.Tasks.Modules;
public class CalendarModuleSpecifics : ModuleSpecificsBase
{
public override ModuleName ModuleName => ModuleName.Calendar;
public override IEnumerable<TableInfo> Tables => _tables;
public override IEnumerable<RelationInfo> TableRelations => _tableRelations;
private readonly RelationInfo[] _tableRelations;
private readonly TableInfo[] _tables = new[]
{
new TableInfo("calendar_calendars", "tenant", "id") {UserIDColumns = new[] {"owner_id"}},
new TableInfo("calendar_calendar_item"),
new TableInfo("calendar_calendar_user") {UserIDColumns = new[] {"user_id"}},
new TableInfo("calendar_events", "tenant", "id")
{
UserIDColumns = new[] {"owner_id"},
DateColumns = new Dictionary<string, bool> {{"start_date", true}, {"end_date", true}}
},
new TableInfo("calendar_event_history", "tenant"),
new TableInfo("calendar_event_item"),
new TableInfo("calendar_event_user") {UserIDColumns = new[] {"user_id"}},
new TableInfo("calendar_notifications", "tenant")
{
UserIDColumns = new[] {"user_id"},
DateColumns = new Dictionary<string, bool> {{"notify_date", true}}
}
};
public CalendarModuleSpecifics(Helpers helpers)
: base(helpers)
{
_tableRelations = new[]
{
new RelationInfo("calendar_calendars", "id", "calendar_calendar_item", "calendar_id"),
new RelationInfo("calendar_calendars", "id", "calendar_calendar_user", "calendar_id"),
new RelationInfo("calendar_calendars", "id", "calendar_events", "calendar_id"),
new RelationInfo("calendar_calendars", "id", "calendar_event_history", "calendar_id"),
new RelationInfo("calendar_events", "id", "calendar_event_history", "event_id"),
new RelationInfo("calendar_events", "id", "calendar_event_item", "event_id"),
new RelationInfo("calendar_events", "id", "calendar_event_user", "event_id"),
new RelationInfo("calendar_events", "id", "calendar_notifications", "event_id"),
new RelationInfo("core_user", "id", "calendar_calendar_item", "item_id", typeof(TenantsModuleSpecifics),
x => Convert.ToInt32(x["is_group"]) == 0),
new RelationInfo("core_group", "id", "calendar_calendar_item", "item_id", typeof(TenantsModuleSpecifics),
x => Convert.ToInt32(x["is_group"]) == 1 && !helpers.IsEmptyOrSystemGroup(Convert.ToString(x["item_id"]))),
new RelationInfo("core_user", "id", "calendar_event_item", "item_id", typeof(TenantsModuleSpecifics),
x => Convert.ToInt32(x["is_group"]) == 0),
new RelationInfo("core_group", "id", "calendar_event_item", "item_id", typeof(TenantsModuleSpecifics),
x => Convert.ToInt32(x["is_group"]) == 1 && !helpers.IsEmptyOrSystemGroup(Convert.ToString(x["item_id"])))
};
}
protected override string GetSelectCommandConditionText(int tenantId, TableInfo table)
{
if (table.Name == "calendar_calendar_item" || table.Name == "calendar_calendar_user")
{
return "inner join calendar_calendars as t1 on t1.id = t.calendar_id where t1.tenant = " + tenantId;
}
if (table.Name == "calendar_event_item" || table.Name == "calendar_event_user")
{
return "inner join calendar_events as t1 on t1.id = t.event_id where t1.tenant = " + tenantId;
}
if (table.Name == "calendar_event_history")
{
return string.Format(
"inner join calendar_calendars as t1 on t1.id = t.calendar_id and t1.tenant = t.tenant inner join calendar_events as t2 on t2.id = t.event_id where t1.tenant = {0} and t2.tenant = {0}",
tenantId);
}
return base.GetSelectCommandConditionText(tenantId, table);
}
}

View File

@ -1,289 +0,0 @@
// (c) Copyright Ascensio System SIA 2010-2022
//
// This program is a free software product.
// You can redistribute it and/or modify it under the terms
// of the GNU Affero General Public License (AGPL) version 3 as published by the Free Software
// Foundation. In accordance with Section 7(a) of the GNU AGPL its Section 15 shall be amended
// to the effect that Ascensio System SIA expressly excludes the warranty of non-infringement of
// any third-party rights.
//
// This program is distributed WITHOUT ANY WARRANTY, without even the implied warranty
// of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For details, see
// the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html
//
// You can contact Ascensio System SIA at Lubanas st. 125a-25, Riga, Latvia, EU, LV-1021.
//
// The interactive user interfaces in modified source and object code versions of the Program must
// display Appropriate Legal Notices, as required under Section 5 of the GNU AGPL version 3.
//
// Pursuant to Section 7(b) of the License you must retain the original Product logo when
// distributing the program. Pursuant to Section 7(e) we decline to grant you any rights under
// trademark law for use of our trademarks.
//
// All the Product's GUI elements, including illustrations and icon sets, as well as technical writing
// content are licensed under the terms of the Creative Commons Attribution-ShareAlike 4.0
// International. See the License terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode
namespace ASC.Data.Backup.Tasks.Modules;
public class CommunityModuleSpecifics : ModuleSpecificsBase
{
public override ModuleName ModuleName => ModuleName.Community;
public override IEnumerable<TableInfo> Tables => _tables;
public override IEnumerable<RelationInfo> TableRelations => _tableRelations;
private readonly TableInfo[] _tables = new[]
{
new TableInfo("bookmarking_bookmark", "Tenant", "ID")
{
UserIDColumns = new[] {"UserCreatorID"},
DateColumns = new Dictionary<string, bool> {{"Date", false}}
},
new TableInfo("bookmarking_bookmarktag", "tenant"),
new TableInfo("bookmarking_comment", "tenant", "ID", IdType.Guid)
{
UserIDColumns = new[] {"UserID"},
DateColumns = new Dictionary<string, bool> {{"Datetime", false}}
},
new TableInfo("bookmarking_tag", "tenant", "TagID"),
new TableInfo("bookmarking_userbookmark", "tenant", "UserBookmarkID")
{
UserIDColumns = new[] {"UserID"},
DateColumns = new Dictionary<string, bool> {{"DateAdded", false}, {"LastModified", false}}
},
new TableInfo("bookmarking_userbookmarktag", "tenant"),
new TableInfo("blogs_comments", "Tenant", "id", IdType.Guid)
{
UserIDColumns = new[] {"created_by"},
DateColumns = new Dictionary<string, bool> {{"created_when", false}}
},
new TableInfo("blogs_posts", "Tenant", "post_id", IdType.Autoincrement)
{
UserIDColumns = new[] {"created_by"},
DateColumns = new Dictionary<string, bool> {{"created_when", false}, {"LastModified", false}}
},
new TableInfo("blogs_reviewposts", "Tenant")
{
UserIDColumns = new[] {"reviewed_by"},
DateColumns = new Dictionary<string, bool> {{"timestamp", false}}
},
new TableInfo("blogs_tags", "Tenant"),
new TableInfo("events_comment", "Tenant", "id")
{
UserIDColumns = new[] {"Creator"},
DateColumns = new Dictionary<string, bool> {{"Date", false}}
},
new TableInfo("events_feed", "Tenant", "id")
{
UserIDColumns = new[] {"Creator"},
DateColumns = new Dictionary<string, bool> {{"Date", false}, {"LastModified", false}}
},
new TableInfo("events_poll", "Tenant")
{
DateColumns = new Dictionary<string, bool> {{"StartDate", true}, {"EndDate", true}}
},
new TableInfo("events_pollanswer", "Tenant") {UserIDColumns = new[] {"User"}}, //todo: check //varchar(64)?
new TableInfo("events_pollvariant", "Tenant", "Id"),
new TableInfo("events_reader", "Tenant") {UserIDColumns = new[] {"Reader"}}, //todo: check
new TableInfo("forum_answer", "TenantID", "id")
{
UserIDColumns = new[] {"user_id"},
DateColumns = new Dictionary<string, bool> {{"create_date", false}}
},
new TableInfo("forum_answer_variant"),
new TableInfo("forum_attachment", "TenantID", "id")
{
DateColumns = new Dictionary<string, bool> {{"create_date", false}}
},
new TableInfo("forum_category", "TenantID", "id")
{
UserIDColumns = new[] {"poster_id"},
DateColumns = new Dictionary<string, bool> {{"create_date", false}}
},
new TableInfo("forum_lastvisit", "tenantid")
{
UserIDColumns = new[] {"user_id"},
DateColumns = new Dictionary<string, bool> {{"last_visit", false}}
},
new TableInfo("forum_post", "TenantID", "id")
{
UserIDColumns = new[] {"poster_id", "editor_id"},
DateColumns = new Dictionary<string, bool> {{"create_date", false}, {"edit_date", false}, {"LastModified", false}}
},
new TableInfo("forum_question", "TenantID", "id") {DateColumns = new Dictionary<string, bool> {{"create_date", false}}},
new TableInfo("forum_tag", "TenantID", "id"),
new TableInfo("forum_thread", "TenantID", "id")
{
UserIDColumns = new[] {"recent_poster_id"},
DateColumns = new Dictionary<string, bool> {{"recent_post_date", false}}
},
new TableInfo("forum_topic", "TenantID", "id")
{
UserIDColumns = new[] {"poster_id"},
DateColumns = new Dictionary<string, bool> {{"create_date", false}, {"LastModified", false}}
},
new TableInfo("forum_topicwatch", "TenantID") {UserIDColumns = new[] {"UserID"}},
new TableInfo("forum_topic_tag"),
new TableInfo("forum_variant", idColumn: "id"),
new TableInfo("wiki_categories", "Tenant"),
new TableInfo("wiki_comments", "Tenant", "Id", IdType.Guid)
{
UserIDColumns = new[] {"UserId"},
DateColumns = new Dictionary<string, bool> {{"Date", false}}
},
new TableInfo("wiki_files", "Tenant")
{
UserIDColumns = new[] {"UserID"},
DateColumns = new Dictionary<string, bool> {{"Date", false}}
},
new TableInfo("wiki_pages", "tenant", "id", IdType.Autoincrement)
{
UserIDColumns = new[] {"modified_by"},
DateColumns = new Dictionary<string, bool> {{"modified_on", false}}
},
new TableInfo("wiki_pages_history", "Tenant")
{
UserIDColumns = new[] {"create_by"},
DateColumns = new Dictionary<string, bool> {{"create_on", false}}
},
};
private readonly RelationInfo[] _tableRelations = new[]
{
new RelationInfo("bookmarking_bookmark", "ID", "bookmarking_bookmarktag", "BookmarkID"),
new RelationInfo("bookmarking_tag", "TagID", "bookmarking_bookmarktag", "TagID"),
new RelationInfo("bookmarking_bookmark", "ID", "bookmarking_comment", "BookmarkID"),
new RelationInfo("bookmarking_comment", "ID", "bookmarking_comment", "Parent"),
new RelationInfo("bookmarking_bookmark", "ID", "bookmarking_userbookmark", "BookmarkID"),
new RelationInfo("bookmarking_tag", "TagID", "bookmarking_userbookmarktag", "TagID"),
new RelationInfo("bookmarking_userbookmark", "UserBookmarkID", "bookmarking_userbookmarktag", "UserBookmarkID"),
new RelationInfo("blogs_comments", "id", "blogs_comments", "parent_id"),
new RelationInfo("blogs_posts", "id", "blogs_comments", "post_id"),
new RelationInfo("blogs_comments", "id", "blogs_posts", "LastCommentId", null, null, RelationImportance.Low),
new RelationInfo("blogs_posts", "id", "blogs_reviewposts", "post_id"),
new RelationInfo("blogs_posts", "id", "blogs_tags", "post_id"),
new RelationInfo("events_feed", "Id", "events_comment", "Feed"),
new RelationInfo("events_comment", "Id", "events_comment", "Parent"),
new RelationInfo("events_feed", "Id", "events_poll", "Id"),
new RelationInfo("events_pollvariant", "Id", "events_pollanswer", "Variant"),
new RelationInfo("events_feed", "Id", "events_pollvariant", "Poll"),
new RelationInfo("events_feed", "Id", "events_reader", "Feed"),
new RelationInfo("forum_question", "id", "forum_answer", "question_id"),
new RelationInfo("forum_answer", "id", "forum_answer_variant", "answer_id"),
new RelationInfo("forum_variant", "id", "forum_answer_variant", "variant_id"),
new RelationInfo("forum_post", "id", "forum_attachment", "post_id"),
new RelationInfo("forum_category", "id", "forum_attachment", "path"),
new RelationInfo("forum_thread", "id", "forum_attachment", "path"),
new RelationInfo("forum_thread", "id", "forum_lastvisit", "thread_id"),
new RelationInfo("forum_topic", "id", "forum_post", "topic_id"),
new RelationInfo("forum_post", "id", "forum_post", "parent_post_id"),
new RelationInfo("forum_topic", "id", "forum_question", "topic_id"),
new RelationInfo("forum_category", "id", "forum_thread", "category_id"),
new RelationInfo("forum_post", "id", "forum_thread", "recent_post_id", null, null, RelationImportance.Low),
new RelationInfo("forum_topic", "id", "forum_thread", "recent_topic_id", null, null, RelationImportance.Low),
new RelationInfo("forum_thread", "id", "forum_topic", "thread_id"),
new RelationInfo("forum_question", "id", "forum_topic", "question_id", null, null, RelationImportance.Low),
new RelationInfo("forum_post", "id", "forum_topic", "recent_post_id", null, null, RelationImportance.Low),
new RelationInfo("forum_topic", "id", "forum_topicwatch", "TopicID"),
new RelationInfo("forum_topic", "id", "forum_topic_tag", "topic_id"),
new RelationInfo("forum_tag", "id", "forum_topic_tag", "tag_id"),
new RelationInfo("forum_question", "id", "forum_variant", "question_id"),
new RelationInfo("wiki_comments", "Id", "wiki_comments", "ParentId")
};
public CommunityModuleSpecifics(Helpers helpers)
: base(helpers) { }
public override bool TryAdjustFilePath(bool dump, ColumnMapper columnMapper, ref string filePath)
{
filePath = PreparePath(dump, columnMapper, "/", filePath);
return filePath != null;
}
protected override bool TryPrepareValue(bool dump, DbConnection connection, ColumnMapper columnMapper, TableInfo table, string columnName, IEnumerable<RelationInfo> relations, ref object value)
{
relations = relations.ToList();
if (relations.All(x => x.ChildTable == "forum_attachment" && x.ChildColumn == "path"))
{
value = PreparePath(dump, columnMapper, "\\", Convert.ToString(value));
return value != null;
}
return base.TryPrepareValue(dump, connection, columnMapper, table, columnName, relations, ref value);
}
protected override bool TryPrepareValue(DbConnection connection, ColumnMapper columnMapper, TableInfo table, string columnName, ref object value)
{
var column = columnName.ToLowerInvariant();
if (table.Name == "forum_post" && column == "text" ||
table.Name == "events_feed" && column == "text" ||
table.Name == "events_comment" && column == "comment" ||
table.Name == "blogs_posts" && column == "content" ||
table.Name == "blogs_comments" && column == "content" ||
table.Name == "bookmarking_comment" && column == "content" ||
table.Name == "wiki_comments" && column == "body")
{
value = FCKEditorPathUtility.CorrectStoragePath(value as string, columnMapper.GetTenantMapping());
return true;
}
return base.TryPrepareValue(connection, columnMapper, table, columnName, ref value);
}
protected override string GetSelectCommandConditionText(int tenantId, TableInfo table)
{
if (table.Name == "forum_answer_variant")
{
return "inner join forum_answer as t1 on t1.id = t.answer_id where t1.TenantID = " + tenantId;
}
if (table.Name == "forum_variant")
{
return "inner join forum_question as t1 on t1.id = t.question_id where t1.TenantID = " + tenantId;
}
if (table.Name == "forum_topic_tag")
{
return "inner join forum_topic as t1 on t1.id = t.topic_id where t1.TenantID = " + tenantId;
}
return base.GetSelectCommandConditionText(tenantId, table);
}
private static string PreparePath(bool dump, ColumnMapper columnMapper, string partsSeparator, string path)
{
var parts = path.Split(new[] { partsSeparator }, StringSplitOptions.None);
if (parts.Length != 4)
{
return null;
}
var categoryId = columnMapper.GetMapping("forum_category", "id", parts[0]);
if (categoryId == null)
{
if (!dump)
{
return null;
}
categoryId = parts[0];
}
var threadId = columnMapper.GetMapping("forum_thread", "id", parts[1]);
if (threadId == null)
{
if (!dump)
{
return null;
}
threadId = parts[1];
}
parts[0] = categoryId.ToString();
parts[1] = threadId.ToString();
return string.Join(partsSeparator, parts);
}
}

View File

@ -91,51 +91,6 @@ public class CoreModuleSpecifics : ModuleSpecificsBase
new RelationInfo("core_group", "id", "core_usergroup", "groupid", typeof(TenantsModuleSpecifics),
x => !helpers.IsEmptyOrSystemGroup(Convert.ToString(x["groupid"]))),
new RelationInfo("crm_contact", "id", "core_acl", "object", typeof(CrmModuleSpecifics),
x => Convert.ToString(x["object"]).StartsWith(CrmCompanyAclObjectStart) || Convert.ToString(x["object"]).StartsWith(CrmPersonAclObjectStart)),
new RelationInfo("crm_deal", "id", "core_acl", "object", typeof(CrmModuleSpecifics),
x => Convert.ToString(x["object"]).StartsWith(CrmDealAclObjectStart)),
new RelationInfo("crm_case", "id", "core_acl", "object", typeof(CrmModuleSpecifics),
x => Convert.ToString(x["object"]).StartsWith(CrmCasesAclObjectStart)),
new RelationInfo("crm_relationship_event", "id", "core_acl", "object", typeof(CrmModuleSpecifics2),
x => Convert.ToString(x["object"]).StartsWith(CrmRelationshipEventAclObjectStart)),
new RelationInfo("calendar_calendars", "id", "core_acl", "object", typeof(CalendarModuleSpecifics),
x => Convert.ToString(x["object"]).StartsWith(CalendarCalendarAclObjectStart)),
new RelationInfo("calendar_events", "id", "core_acl", "object", typeof(CalendarModuleSpecifics),
x => Convert.ToString(x["object"]).StartsWith(CalendarEventAclObjectStart)),
new RelationInfo("projects_projects", "id", "core_subscription", "object", typeof(ProjectsModuleSpecifics),
x => ValidateSource(_projectsSourceID, x)),
new RelationInfo("projects_tasks", "id", "core_subscription", "object", typeof(ProjectsModuleSpecifics),
x => ValidateSource(_projectsSourceID, x) && Convert.ToString(x["object"]).StartsWith("Task_")),
new RelationInfo("projects_messages", "id", "core_subscription", "object", typeof(ProjectsModuleSpecifics),
x => ValidateSource(_projectsSourceID, x) && Convert.ToString(x["object"]).StartsWith("Message_")),
new RelationInfo("projects_milestones", "id", "core_subscription", "object", typeof(ProjectsModuleSpecifics),
x => ValidateSource(_projectsSourceID, x) && Convert.ToString(x["object"]).StartsWith("Milestone_")),
new RelationInfo("bookmarking_bookmark", "ID", "core_subscription", "object", typeof(CommunityModuleSpecifics),
x => ValidateSource(_bookmarksSourceID, x) && !string.IsNullOrEmpty(Convert.ToString(x["object"]))),
new RelationInfo("forum_topic", "id", "core_subscription", "object", typeof(CommunityModuleSpecifics),
x => ValidateSource(_forumsSourceID, x) && Convert.ToString(x["action"]) == ForumsNewPostInTopicActionID && !string.IsNullOrEmpty(Convert.ToString(x["object"]))),
new RelationInfo("forum_thread", "id", "core_subscription", "object", typeof(CommunityModuleSpecifics),
x => ValidateSource(_forumsSourceID, x) && Convert.ToString(x["action"]) == ForumsNewPostInThreadActionID && !string.IsNullOrEmpty(Convert.ToString(x["object"]))),
new RelationInfo("events_feed", "id", "core_subscription", "object", typeof(CommunityModuleSpecifics),
x => ValidateSource(_newsSourceID, x) && Convert.ToString(x["action"]) == NewsNewCommentActionID && !string.IsNullOrEmpty(Convert.ToString(x["object"]))),
new RelationInfo("blogs_posts", "id", "core_subscription", "object", typeof(CommunityModuleSpecifics),
x => ValidateSource(_blogsSourceID, x) && Convert.ToString(x["action"]) == BlogsNewCommentActionID),
new RelationInfo("core_user", "id", "feed_users", "user_id", typeof(CoreModuleSpecifics)),
new RelationInfo("files_folder", "id", "backup_backup", "storage_base_path", typeof(FilesModuleSpecifics),

View File

@ -1,356 +0,0 @@
// (c) Copyright Ascensio System SIA 2010-2022
//
// This program is a free software product.
// You can redistribute it and/or modify it under the terms
// of the GNU Affero General Public License (AGPL) version 3 as published by the Free Software
// Foundation. In accordance with Section 7(a) of the GNU AGPL its Section 15 shall be amended
// to the effect that Ascensio System SIA expressly excludes the warranty of non-infringement of
// any third-party rights.
//
// This program is distributed WITHOUT ANY WARRANTY, without even the implied warranty
// of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For details, see
// the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html
//
// You can contact Ascensio System SIA at Lubanas st. 125a-25, Riga, Latvia, EU, LV-1021.
//
// The interactive user interfaces in modified source and object code versions of the Program must
// display Appropriate Legal Notices, as required under Section 5 of the GNU AGPL version 3.
//
// Pursuant to Section 7(b) of the License you must retain the original Product logo when
// distributing the program. Pursuant to Section 7(e) we decline to grant you any rights under
// trademark law for use of our trademarks.
//
// All the Product's GUI elements, including illustrations and icon sets, as well as technical writing
// content are licensed under the terms of the Creative Commons Attribution-ShareAlike 4.0
// International. See the License terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode
namespace ASC.Data.Backup.Tasks.Modules;
public class CrmModuleSpecifics : ModuleSpecificsBase
{
public override ModuleName ModuleName => ModuleName.Crm;
public override IEnumerable<TableInfo> Tables => _tables;
public override IEnumerable<RelationInfo> TableRelations => _tableRelations;
private readonly TableInfo[] _tables = new[]
{
new TableInfo("crm_case", "tenant_id", "id")
{
UserIDColumns = new[] {"create_by", "last_modifed_by"},
DateColumns = new Dictionary<string, bool> {{"create_on", false}, {"last_modifed_on", false}}
},
new TableInfo("crm_contact", "tenant_id", "id")
{
UserIDColumns = new[] {"create_by", "last_modifed_by"},
DateColumns = new Dictionary<string, bool> {{"create_on", false}, {"last_modifed_on", false}}
},
new TableInfo("crm_contact_info", "tenant_id", "id")
{
UserIDColumns = new[] {"last_modifed_by"},
DateColumns = new Dictionary<string, bool> {{"last_modifed_on", false}}
},
new TableInfo("crm_deal", "tenant_id", "id")
{
UserIDColumns = new[] {"create_by", "last_modifed_by", "responsible_id"},
DateColumns = new Dictionary<string, bool> {{"create_on", false}, {"last_modifed_on", false}, {"expected_close_date", true}, {"actual_close_date", true}}
},
new TableInfo("crm_deal_milestone", "tenant_id", "id"),
new TableInfo("crm_field_description", "tenant_id", "id"),
new TableInfo("crm_list_item", "tenant_id", "id"),
new TableInfo("crm_projects", "tenant_id"),
new TableInfo("crm_tag", "tenant_id", "id"),
new TableInfo("crm_task", "tenant_id", "id")
{
UserIDColumns = new[] {"create_by", "last_modifed_by", "responsible_id"},
DateColumns = new Dictionary<string, bool> {{"create_on", false}, {"last_modifed_on", false}, {"deadline", true}}
},
new TableInfo("crm_task_template", "tenant_id", "id")
{
UserIDColumns = new[] {"create_by", "last_modifed_by", "responsible_id"},
DateColumns = new Dictionary<string, bool> {{"create_on", false}, {"last_modifed_on", false}}
},
new TableInfo("crm_task_template_container", "tenant_id", "id")
{
UserIDColumns = new[] {"create_by", "last_modifed_by"},
DateColumns = new Dictionary<string, bool> {{"create_on", false}, {"last_modifed_on", false}}
},
new TableInfo("crm_task_template_task", "tenant_id"),
new TableInfo("crm_currency_rate", "tenant_id", "id")
{
UserIDColumns = new[] {"create_by", "last_modified_by"},
DateColumns = new Dictionary<string, bool> {{"create_on", false}, {"last_modified_on", false}}
}
};
private readonly RelationInfo[] _tableRelations = new[]
{
new RelationInfo("crm_contact", "id", "crm_contact", "company_id"),
new RelationInfo("crm_list_item", "id", "crm_contact", "status_id"),
new RelationInfo("crm_list_item", "id", "crm_contact", "contact_type_id"),
new RelationInfo("crm_contact", "id", "crm_contact_info", "contact_id"),
new RelationInfo("crm_deal_milestone", "id", "crm_deal", "deal_milestone_id"),
new RelationInfo("crm_contact", "id", "crm_deal", "contact_id"),
new RelationInfo("projects_projects", "id", "crm_projects", "project_id", typeof(ProjectsModuleSpecifics)),
new RelationInfo("crm_contact", "id", "crm_projects", "contact_id"),
new RelationInfo("crm_contact", "id", "crm_task", "entity_id", x => ResolveRelation(x, 0, 4, 5)),
new RelationInfo("crm_deal", "id", "crm_task", "entity_id", x => ResolveRelation(x, 1)),
new RelationInfo("crm_task", "id", "crm_task", "entity_id", x => ResolveRelation(x, 3)),
new RelationInfo("crm_case", "id", "crm_task", "entity_id", x => ResolveRelation(x, 7)),
new RelationInfo("crm_contact", "id", "crm_task", "contact_id"),
new RelationInfo("crm_list_item", "id", "crm_task", "category_id"),
new RelationInfo("crm_list_item", "id", "crm_task_template", "category_id"),
new RelationInfo("crm_task_template_container", "id", "crm_task_template", "container_id"),
new RelationInfo("crm_task", "id", "crm_task_template_task", "task_id"),
new RelationInfo("crm_task_template", "id", "crm_task_template_task", "task_template_id")
};
public CrmModuleSpecifics(Helpers helpers)
: base(helpers) { }
public override bool TryAdjustFilePath(bool dump, ColumnMapper columnMapper, ref string filePath)
{
var pathMatch = Regex.Match(filePath, @"^photos/\d+/\d+/\d+/contact_(?'contactId'\d+)(?'sizeExtension'_\d+_\d+\.\w+)$", RegexOptions.Compiled);
if (pathMatch.Success)
{
var contactId = columnMapper.GetMapping("crm_contact", "id", pathMatch.Groups["contactId"].Value);
if (contactId == null)
{
if (!dump)
{
return false;
}
contactId = pathMatch.Groups["contactId"].Value;
}
var s = contactId.ToString().PadLeft(6, '0');
filePath = string.Format("photos/{0}/{1}/{2}/contact_{3}{4}", s.Substring(0, 2), s.Substring(2, 2), s.Substring(4), contactId, pathMatch.Groups["sizeExtension"].Value);
return true;
}
return false;
}
private static bool ResolveRelation(DataRowInfo row, params int[] matchingTypes)
{
var entityType = Convert.ToInt32(row["entity_type"]);
return matchingTypes.Contains(entityType);
}
}
//todo: hack: in future there be no modules only tables!!!
public class CrmModuleSpecifics2 : ModuleSpecificsBase
{
public override string ConnectionStringName => "crm";
public override ModuleName ModuleName => ModuleName.Crm2;
public override IEnumerable<TableInfo> Tables => _tables;
public override IEnumerable<RelationInfo> TableRelations => _tableRelations;
private readonly TableInfo[] _tables = new[]
{
new TableInfo("crm_field_value", "tenant_id", "id", IdType.Autoincrement) {UserIDColumns = new[] {"last_modifed_by"}},
new TableInfo("crm_entity_contact"),
new TableInfo("crm_entity_tag"),
new TableInfo("crm_relationship_event", "tenant_id", "id") {UserIDColumns = new[] {"create_by", "last_modifed_by"}},
};
private readonly RelationInfo[] _tableRelations = new[]
{
new RelationInfo("crm_contact", "id", "crm_field_value", "entity_id", x => ResolveRelation(x, 0, 4, 5)),
new RelationInfo("crm_deal", "id", "crm_field_value", "entity_id", x => ResolveRelation(x, 1)),
new RelationInfo("crm_task", "id", "crm_field_value", "entity_id", x => ResolveRelation(x, 3)),
new RelationInfo("crm_case", "id", "crm_field_value", "entity_id", x => ResolveRelation(x, 7)),
new RelationInfo("crm_field_description", "id", "crm_field_value", "field_id"),
new RelationInfo("crm_contact", "id", "crm_entity_contact", "entity_id", x => ResolveRelation(x, 0, 4, 5)),
new RelationInfo("crm_deal", "id", "crm_entity_contact", "entity_id", x => ResolveRelation(x, 1)),
new RelationInfo("crm_task", "id", "crm_entity_contact", "entity_id", x => ResolveRelation(x, 3)),
new RelationInfo("crm_case", "id", "crm_entity_contact", "entity_id", x => ResolveRelation(x, 7)),
new RelationInfo("crm_contact", "id", "crm_entity_contact", "contact_id"),
new RelationInfo("crm_contact", "id", "crm_entity_tag", "entity_id", x => ResolveRelation(x, 0, 4, 5)),
new RelationInfo("crm_deal", "id", "crm_entity_tag", "entity_id", x => ResolveRelation(x, 1)),
new RelationInfo("crm_task", "id", "crm_entity_tag", "entity_id", x => ResolveRelation(x, 3)),
new RelationInfo("crm_case", "id", "crm_entity_tag", "entity_id", x => ResolveRelation(x, 7)),
new RelationInfo("crm_tag", "id", "crm_entity_tag", "tag_id"),
new RelationInfo("crm_contact", "id", "crm_relationship_event", "entity_id", typeof(CrmModuleSpecifics), x => ResolveRelation(x, 0, 4, 5)),
new RelationInfo("crm_deal", "id", "crm_relationship_event", "entity_id", typeof(CrmModuleSpecifics), x => ResolveRelation(x, 1)),
new RelationInfo("crm_relationship_event", "id", "crm_relationship_event", "entity_id", typeof(CrmModuleSpecifics), x => ResolveRelation(x, 2)),
new RelationInfo("crm_task", "id", "crm_relationship_event", "entity_id", typeof(CrmModuleSpecifics), x => ResolveRelation(x, 3)),
new RelationInfo("crm_case", "id", "crm_relationship_event", "entity_id", typeof(CrmModuleSpecifics), x => ResolveRelation(x, 7)),
new RelationInfo("crm_contact", "id", "crm_relationship_event", "contact_id", typeof(CrmModuleSpecifics)),
new RelationInfo("crm_list_item", "id", "crm_relationship_event", "category_id", typeof(CrmModuleSpecifics)),
new RelationInfo("crm_relationship_event", "id", "crm_field_value", "entity_id", typeof(CrmModuleSpecifics), x => ResolveRelation(x, 2)),
new RelationInfo("crm_relationship_event", "id", "crm_entity_tag", "entity_id", typeof(CrmModuleSpecifics), x => ResolveRelation(x, 2)),
new RelationInfo("crm_relationship_event", "id", "crm_entity_contact", "entity_id", typeof(CrmModuleSpecifics), x => ResolveRelation(x, 2)),
new RelationInfo("mail_mail", "id", "crm_relationship_event", "content", typeof(MailModuleSpecifics), x => Convert.ToInt32(x["category_id"]) == -3),
};
public CrmModuleSpecifics2(Helpers helpers) : base(helpers) { }
public override bool TryAdjustFilePath(bool dump, ColumnMapper columnMapper, ref string filePath)
{
var match = Regex.Match(filePath, @"(?<=folder_\d+/message_)\d+(?=\.html)"); //todo:
if (match.Success)
{
var mappedMessageId = Convert.ToString(columnMapper.GetMapping("mail_mail", "id", match.Value));
if (dump && string.IsNullOrEmpty(mappedMessageId))
{
mappedMessageId = match.Value;
}
if (!string.IsNullOrEmpty(mappedMessageId))
{
filePath = string.Format("folder_{0}/message_{1}.html", (Convert.ToInt32(mappedMessageId) / 1000 + 1) * 1000, mappedMessageId);
}
return true;
}
return base.TryAdjustFilePath(dump, columnMapper, ref filePath);
}
protected override string GetSelectCommandConditionText(int tenantId, TableInfo table)
{
if (table.Name == "crm_entity_contact")
{
return "inner join crm_contact as t1 on t1.id = t.contact_id where t1.tenant_id = " + tenantId;
}
if (table.Name == "crm_entity_tag")
{
return "inner join crm_tag as t1 on t1.id = t.tag_id where t1.tenant_id = " + tenantId;
}
return base.GetSelectCommandConditionText(tenantId, table);
}
protected override bool TryPrepareValue(DbConnection connection, ColumnMapper columnMapper, RelationInfo relation, ref object value)
{
if (relation.ChildTable == "crm_relationship_event" && relation.ChildColumn == "content")
{
value = Regex.Replace(
Convert.ToString(value),
@"(?<=""message_id"":|/Products/CRM/HttpHandlers/filehandler\.ashx\?action=mailmessage&message_id=)\d+",
match =>
{
var mappedMessageId = Convert.ToString(columnMapper.GetMapping(relation.ParentTable, relation.ParentColumn, match.Value));
var success = !string.IsNullOrEmpty(mappedMessageId);
return success ? mappedMessageId : match.Value;
});
return true;
}
return base.TryPrepareValue(connection, columnMapper, relation, ref value);
}
private static bool ResolveRelation(DataRowInfo row, params int[] matchingTypes)
{
var entityType = Convert.ToInt32(row["entity_type"]);
return matchingTypes.Contains(entityType);
}
}
public class CrmInvoiceModuleSpecifics : ModuleSpecificsBase
{
public override ModuleName ModuleName => ModuleName.CrmInvoice;
public override string ConnectionStringName => "crm";
public override IEnumerable<TableInfo> Tables
{
get
{
return new List<TableInfo>
{
new TableInfo("crm_organisation_logo", "tenant_id", "id")
{
UserIDColumns = new[] {"create_by"},
DateColumns = new Dictionary<string, bool> {{"create_on", false}}
},
new TableInfo("crm_invoice", "tenant_id", "id")
{
UserIDColumns = new[] {"create_by", "last_modified_by"},
DateColumns = new Dictionary<string, bool> {{"create_on", false}, {"last_modified_on", false}, {"due_date", false}, {"issue_date", false}}
},
new TableInfo("crm_invoice_item", "tenant_id", "id")
{
UserIDColumns = new[] {"create_by", "last_modified_by"},
DateColumns = new Dictionary<string, bool> {{"create_on", false}, {"last_modified_on", false}}
},
new TableInfo("crm_invoice_line", "tenant_id", "id"),
new TableInfo("crm_invoice_tax", "tenant_id", "id")
{
UserIDColumns = new[] {"create_by", "last_modified_by"},
DateColumns = new Dictionary<string, bool> {{"create_on", false}, {"last_modified_on", false}}
}
};
}
}
public override IEnumerable<RelationInfo> TableRelations
{
get
{
return new List<RelationInfo>
{
new RelationInfo("crm_contact", "id", "crm_invoice", "contact_id"),
new RelationInfo("crm_contact", "id", "crm_invoice", "consignee_id"),
new RelationInfo("crm_contact", "id", "crm_invoice", "entity_id", x => ResolveRelation(x, 0, 4, 5)),
new RelationInfo("crm_deal", "id", "crm_invoice", "entity_id", x => ResolveRelation(x, 1)),
new RelationInfo("crm_task", "id", "crm_invoice", "entity_id", x => ResolveRelation(x, 3)),
new RelationInfo("crm_case", "id", "crm_invoice", "entity_id", x => ResolveRelation(x, 7)),
new RelationInfo("files_file", "id", "crm_invoice", "file_id", typeof(FilesModuleSpecifics)),
new RelationInfo("crm_invoice_tax", "id", "crm_invoice_item", "invoice_tax1_id"),
new RelationInfo("crm_invoice_tax", "id", "crm_invoice_item", "invoice_tax2_id"),
new RelationInfo("crm_invoice_tax", "id", "crm_invoice_line", "invoice_tax1_id"),
new RelationInfo("crm_invoice_tax", "id", "crm_invoice_line", "invoice_tax2_id"),
new RelationInfo("crm_invoice", "id", "crm_invoice_line", "invoice_id"),
new RelationInfo("crm_invoice_item", "id", "crm_invoice_line", "invoice_item_id"),
};
}
}
public CrmInvoiceModuleSpecifics(Helpers helpers) : base(helpers) { }
protected override bool TryPrepareValue(DbConnection connection, ColumnMapper columnMapper, TableInfo table, string columnName, ref object value)
{
if (value == null)
{
return false;
}
if (table.Name == "crm_invoice" && columnName == "json_data")
{
var data = JObject.Parse((string)value);
var oldValue = Convert.ToInt32(data["LogoBase64Id"]);
if (oldValue != 0)
{
data["LogoBase64Id"] = Convert.ToInt32(columnMapper.GetMapping("crm_organisation_logo", "id", oldValue));
}
oldValue = Convert.ToInt32(data["DeliveryAddressID"]);
if (oldValue != 0)
{
data["DeliveryAddressID"] = Convert.ToInt32(columnMapper.GetMapping("crm_contact_info", "id", oldValue));
}
oldValue = Convert.ToInt32(data["BillingAddressID"]);
if (oldValue != 0)
{
data["BillingAddressID"] = Convert.ToInt32(columnMapper.GetMapping("crm_contact_info", "id", oldValue));
}
value = data.ToString();
return true;
}
return base.TryPrepareValue(connection, columnMapper, table, columnName, ref value);
}
private static bool ResolveRelation(DataRowInfo row, params int[] matchingTypes)
{
var entityType = Convert.ToInt32(row["entity_type"]);
return matchingTypes.Contains(entityType);
}
}

View File

@ -74,11 +74,6 @@ public class FilesModuleSpecifics : ModuleSpecificsBase
}),
new RelationInfo("core_user", "id", "files_security", "subject", typeof(TenantsModuleSpecifics)),
new RelationInfo("core_group", "id", "files_security", "subject", typeof(TenantsModuleSpecifics)),
new RelationInfo("crm_deal", "id", "files_bunch_objects", "right_node", typeof(CrmModuleSpecifics),
x => Convert.ToString(x["right_node"]).StartsWith(_bunchRightNodeStartCrmOpportunity)),
new RelationInfo("projects_projects", "id", "files_bunch_objects", "right_node", typeof(ProjectsModuleSpecifics),
x => Convert.ToString(x["right_node"]).StartsWith(_bunchRightNodeStartProject, StringComparison.InvariantCultureIgnoreCase)),
new RelationInfo("files_folder", "id", "files_bunch_objects", "left_node"),
new RelationInfo("files_folder", "id", "files_file", "folder_id"),
@ -318,18 +313,6 @@ public class FilesModuleSpecifics2 : ModuleSpecificsBase
private readonly RelationInfo[] _rels = new[]
{
new RelationInfo("projects_messages", "id", "files_tag", "name", typeof(ProjectsModuleSpecifics),
x => Convert.ToString(x["name"]).StartsWith(_tagStartMessage, StringComparison.InvariantCultureIgnoreCase)),
new RelationInfo("projects_tasks", "id", "files_tag", "name", typeof(ProjectsModuleSpecifics),
x => Convert.ToString(x["name"]).StartsWith(_tagStartTask, StringComparison.InvariantCultureIgnoreCase)),
new RelationInfo("projects_projects", "id", "files_tag", "name", typeof(ProjectsModuleSpecifics),
x => Convert.ToString(x["name"]).StartsWith(_tagStartProject, StringComparison.InvariantCultureIgnoreCase)),
new RelationInfo("crm_relationship_event", "id", "files_tag", "name", typeof(CrmModuleSpecifics2),
x => Convert.ToString(x["name"]).StartsWith(_tagStartRelationshipEvent, StringComparison.InvariantCultureIgnoreCase)),
new RelationInfo("files_tag", "id", "files_tag_link", "tag_id", typeof(FilesModuleSpecifics)),
new RelationInfo("files_file", "id", "files_tag_link", "entry_id", typeof(FilesModuleSpecifics),

View File

@ -29,16 +29,9 @@ namespace ASC.Data.Backup.Tasks.Modules;
public enum ModuleName
{
Audit,
Calendar,
Community,
Core,
Crm,
Crm2,
CrmInvoice,
Files,
Files2,
Mail,
Projects,
Tenants,
WebStudio
}

View File

@ -1,304 +0,0 @@
// (c) Copyright Ascensio System SIA 2010-2022
//
// This program is a free software product.
// You can redistribute it and/or modify it under the terms
// of the GNU Affero General Public License (AGPL) version 3 as published by the Free Software
// Foundation. In accordance with Section 7(a) of the GNU AGPL its Section 15 shall be amended
// to the effect that Ascensio System SIA expressly excludes the warranty of non-infringement of
// any third-party rights.
//
// This program is distributed WITHOUT ANY WARRANTY, without even the implied warranty
// of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For details, see
// the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html
//
// You can contact Ascensio System SIA at Lubanas st. 125a-25, Riga, Latvia, EU, LV-1021.
//
// The interactive user interfaces in modified source and object code versions of the Program must
// display Appropriate Legal Notices, as required under Section 5 of the GNU AGPL version 3.
//
// Pursuant to Section 7(b) of the License you must retain the original Product logo when
// distributing the program. Pursuant to Section 7(e) we decline to grant you any rights under
// trademark law for use of our trademarks.
//
// All the Product's GUI elements, including illustrations and icon sets, as well as technical writing
// content are licensed under the terms of the Creative Commons Attribution-ShareAlike 4.0
// International. See the License terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode
namespace ASC.Data.Backup.Tasks.Modules;
internal class MailModuleSpecifics : ModuleSpecificsBase
{
public override ModuleName ModuleName => ModuleName.Mail;
public override IEnumerable<TableInfo> Tables => _tables;
public override IEnumerable<RelationInfo> TableRelations => _tableRelations;
private readonly ILogger<ModuleProvider> _logger;
private readonly Helpers _helpers;
private readonly TableInfo[] _tables = new[]
{
new TableInfo("mail_attachment", "tenant", "id"),
new TableInfo("mail_chain", "tenant") {UserIDColumns = new[] {"id_user"}},
new TableInfo("mail_contacts", "tenant", "id") {UserIDColumns = new[] {"id_user"}},
new TableInfo("mail_folder_counters", "tenant") {UserIDColumns = new[] {"id_user"}},
new TableInfo("mail_mail", "tenant", "id")
{
UserIDColumns = new[] {"id_user"},
DateColumns = new Dictionary<string, bool> {{"date_received", false}, {"date_sent", false}, {"chain_date", false}}
},
new TableInfo("mail_mailbox", "tenant", "id")
{
UserIDColumns = new[] {"id_user"},
DateColumns = new Dictionary<string, bool> {{"begin_date", false}}
},
new TableInfo("mail_tag", "tenant", "id") {UserIDColumns = new[] {"id_user"}},
new TableInfo("mail_tag_addresses", "tenant"),
new TableInfo("mail_tag_mail", "tenant") {UserIDColumns = new[] {"id_user"}},
new TableInfo("mail_chain_x_crm_entity", "id_tenant"),
new TableInfo("mail_mailbox_signature", "tenant"),
new TableInfo("mail_mailbox_autoreply", "tenant"),
new TableInfo("mail_mailbox_autoreply_history", "tenant"),
new TableInfo("mail_contact_info", "tenant", "id") {UserIDColumns = new[] {"id_user"}},
new TableInfo("mail_mailbox_provider", idColumn: "id"),
new TableInfo("mail_mailbox_domain", idColumn: "id"),
new TableInfo("mail_mailbox_server", idColumn: "id")
};
private readonly RelationInfo[] _tableRelations = new[]
{
new RelationInfo("mail_mail", "id", "mail_attachment", "id_mail"),
new RelationInfo("mail_mailbox", "id", "mail_chain", "id_mailbox"),
new RelationInfo("mail_tag", "id", "mail_chain", "tags"),
new RelationInfo("crm_tag", "id", "mail_chain", "tags", typeof(CrmModuleSpecifics)),
new RelationInfo("mail_mailbox", "id", "mail_mail", "id_mailbox"),
new RelationInfo("crm_tag", "id", "mail_tag", "crm_id", typeof(CrmModuleSpecifics)),
new RelationInfo("mail_tag", "id", "mail_tag_addresses", "id_tag", x => Convert.ToInt32(x["id_tag"]) > 0),
new RelationInfo("crm_tag", "id", "mail_tag_addresses", "id_tag", typeof(CrmModuleSpecifics), x => Convert.ToInt32(x["id_tag"]) < 0),
new RelationInfo("mail_mail", "id", "mail_tag_mail", "id_mail"),
new RelationInfo("mail_tag", "id", "mail_tag_mail", "id_tag", x => Convert.ToInt32(x["id_tag"]) > 0),
new RelationInfo("crm_tag", "id", "mail_tag_mail", "id_tag", typeof(CrmModuleSpecifics), x => Convert.ToInt32(x["id_tag"]) < 0),
new RelationInfo("mail_mailbox", "id", "mail_chain_x_crm_entity", "id_mailbox"),
new RelationInfo("crm_contact", "id", "mail_chain_x_crm_entity", "entity_id", typeof(CrmModuleSpecifics), x => Convert.ToInt32(x["entity_type"]) == 1),
new RelationInfo("crm_case", "id", "mail_chain_x_crm_entity", "entity_id", typeof(CrmModuleSpecifics), x => Convert.ToInt32(x["entity_type"]) == 2),
new RelationInfo("crm_deal", "id", "mail_chain_x_crm_entity", "entity_id", typeof(CrmModuleSpecifics), x => Convert.ToInt32(x["entity_type"]) == 3),
new RelationInfo("mail_mailbox", "id", "mail_mailbox_signature", "id_mailbox"),
new RelationInfo("files_folder", "id", "mail_mailbox", "email_in_folder", typeof(FilesModuleSpecifics)),
new RelationInfo("mail_mailbox", "id", "mail_mailbox_autoreply", "id_mailbox"),
new RelationInfo("mail_mailbox", "id", "mail_mailbox_autoreply_history", "id_mailbox"),
new RelationInfo("mail_contacts", "id", "mail_contact_info", "id_contact"),
new RelationInfo("mail_mailbox_provider", "id", "mail_mailbox_domain", "id_provider"),
new RelationInfo("mail_mailbox_server", "id", "mail_mailbox", "id_smtp_server"),
new RelationInfo("mail_mailbox_server", "id", "mail_mailbox", "id_in_server")
};
public MailModuleSpecifics(ILogger<ModuleProvider> logger, Helpers helpers) : base(helpers)
{
_logger = logger;
_helpers = helpers;
}
public override bool TryAdjustFilePath(bool dump, ColumnMapper columnMapper, ref string filePath)
{
//todo: hack: will be changed later
filePath = Regex.Replace(filePath, @"^[-\w]+(?=/)", match => dump ? match.Value : columnMapper.GetUserMapping(match.Value));
return !filePath.StartsWith("/");
}
public override void PrepareData(DataTable data)
{
if (data.TableName == "mail_mailbox")
{
var address = data.Columns.Cast<DataColumn>().Single(c => c.ColumnName == "address");
var smtp = data.Columns.Cast<DataColumn>().Single(c => c.ColumnName == "smtp_password");
var pop3 = data.Columns.Cast<DataColumn>().Single(c => c.ColumnName == "pop3_password");
var token = data.Columns.Cast<DataColumn>().Single(c => c.ColumnName == "token");
for (var i = 0; i < data.Rows.Count; i++)
{
var row = data.Rows[i];
try
{
row[smtp] = _helpers.CreateHash2(row[smtp] as string);
row[pop3] = _helpers.CreateHash2(row[pop3] as string);
row[token] = _helpers.CreateHash2(row[token] as string);
}
catch (Exception ex)
{
_logger.ErrorCanNotPrepareData(row[address] as string, ex);
data.Rows.Remove(row);
i--;
}
}
}
}
public override Stream PrepareData(string key, Stream stream, ColumnMapper columnMapper)
{
if (!key.EndsWith("body.html"))
{
return stream;
}
using (var streamReader = new StreamReader(stream, Encoding.UTF8, true, 1024, true))
{
var data = streamReader.ReadToEnd();
data = Regex.Replace(data, @"(htmleditorfiles|aggregator)(\/0\/|\/[\d]+\/\d\d\/\d\d\/)([-\w]+(?=/))",
match => "/" + TenantPath.CreatePath(columnMapper.GetTenantMapping().ToString()) + "/" + columnMapper.GetUserMapping(match.Groups[3].Value));
var content = Encoding.UTF8.GetBytes(data);
stream.Position = 0;
stream.Write(content, 0, content.Length);
}
return stream;
}
protected override string GetSelectCommandConditionText(int tenantId, TableInfo table)
{
//optimization: 1) do not include "deleted" rows, 2) backup mail only for the last 30 days
switch (table.Name)
{
case "mail_mailbox_provider":
return string.Format("where t.id in " +
"(select distinct t2.id_provider from mail_mailbox t1 " +
"inner join mail_mailbox_server t2 on t2.id in (t1.id_in_server, t1.id_smtp_server) and t2.is_user_data = 1 " +
"where t1.tenant = {0} and t1.is_removed = 0)", tenantId);
// mail_mailbox_domain.id_provider not in index
case "mail_mailbox_domain":
return string.Format("where t.id_provider in " +
"(select distinct t2.id_provider from mail_mailbox t1 " +
"inner join mail_mailbox_server t2 on t2.id in (t1.id_in_server, t1.id_smtp_server) and t2.is_user_data = 1 " +
"where t1.tenant = {0} and t1.is_removed = 0)", tenantId);
case "mail_mailbox_server":
return string.Format("where t.id in " +
"(select distinct t2.id from mail_mailbox t1 " +
"inner join mail_mailbox_server t2 on t2.id in (t1.id_in_server, t1.id_smtp_server) and t2.is_user_data = 1 " +
"where t1.tenant = {0} and t1.is_removed = 0)", tenantId);
case "mail_mailbox":
return string.Format("where t.is_removed = 0 and t.tenant = {0}", tenantId);
//condition on chain_date because of Bug 18855 - transfer mail only for the last 30 days
case "mail_mail":
return string.Format("inner join mail_mailbox t1 on t1.id = t.id_mailbox " +
"where t.tenant = {0} and t1.tenant = {0} and t.is_removed = 0 and t1.is_removed = 0 and t.chain_date > '{1}'",
tenantId,
DateTime.UtcNow.Subtract(TimeSpan.FromDays(30)).ToString("yyyy-MM-dd HH:mm:ss"));
case "mail_attachment":
case "mail_tag_mail":
return string.Format("inner join mail_mail as t1 on t1.id = t.id_mail " +
"inner join mail_mailbox as t2 on t2.id = t1.id_mailbox " +
"where t1.tenant = {0} and t2.tenant = {0} and t1.is_removed = 0 and t2.is_removed = 0 and t1.chain_date > '{1}'",
tenantId,
DateTime.UtcNow.Subtract(TimeSpan.FromDays(30)).ToString("yyyy-MM-dd HH:mm:ss"));
case "mail_chain":
return string.Format("inner join mail_mailbox t1 on t1.id = t.id_mailbox " +
"where t.tenant = {0} and t1.is_removed = 0",
tenantId);
default:
return base.GetSelectCommandConditionText(tenantId, table);
}
}
protected override string GetDeleteCommandConditionText(int tenantId, TableInfo table)
{
//delete all rows regardless of whether there is is_removed = 1 or not
return base.GetSelectCommandConditionText(tenantId, table);
}
protected override bool TryPrepareRow(bool dump, DbConnection connection, ColumnMapper columnMapper, TableInfo table, DataRowInfo row, out Dictionary<string, object> preparedRow)
{
if (table.Name == "mail_mailbox")
{
var boxType = row["is_server_mailbox"];
if (boxType != null && Convert.ToBoolean(int.Parse(boxType.ToString())))
{
preparedRow = null;
return false;
}
}
return base.TryPrepareRow(dump, connection, columnMapper, table, row, out preparedRow);
}
protected override bool TryPrepareValue(bool dump, DbConnection connection, ColumnMapper columnMapper, TableInfo table, string columnName, IEnumerable<RelationInfo> relations, ref object value)
{
relations = relations.ToList();
if (relations.All(x => x.ChildTable == "mail_chain" && x.ChildColumn == "tags"))
{
var mappedTags = new List<string>();
foreach (var tag in value.ToString().Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries).Select(x => Convert.ToInt32(x)))
{
object tagId;
if (tag > 0)
{
tagId = columnMapper.GetMapping("mail_tag", "id", tag);
}
else
{
tagId = columnMapper.GetMapping("crm_tag", "id", -tag);
if (tagId != null)
{
tagId = -Convert.ToInt32(tagId);
}
}
if (tagId != null)
{
mappedTags.Add(tagId.ToString());
}
}
value = string.Join(",", mappedTags.ToArray());
return true;
}
return base.TryPrepareValue(dump, connection, columnMapper, table, columnName, relations, ref value);
}
protected override bool TryPrepareValue(DbConnection connection, ColumnMapper columnMapper, RelationInfo relation, ref object value)
{
if (relation.ParentTable == "crm_tag" && relation.ChildColumn == "id_tag"
&& (relation.ChildTable == "mail_tag_mail" || relation.ChildTable == "mail_tag_addresses"))
{
var crmTagId = columnMapper.GetMapping(relation.ParentTable, relation.ParentColumn, -Convert.ToInt32(value));
if (crmTagId == null)
{
return false;
}
value = -Convert.ToInt32(crmTagId);
return true;
}
return base.TryPrepareValue(connection, columnMapper, relation, ref value);
}
protected override bool TryPrepareValue(DbConnection connection, ColumnMapper columnMapper, TableInfo table, string columnName, ref object value)
{
if (table.Name == "mail_mailbox" && (columnName == "smtp_password" || columnName == "pop3_password") && value != null)
{
try
{
value = _helpers.CreateHash(value as string); // save original hash
}
catch (Exception err)
{
_logger.ErrorCanNotPrepareValue(value, err);
value = null;
}
return true;
}
return base.TryPrepareValue(connection, columnMapper, table, columnName, ref value);
}
}

View File

@ -37,15 +37,8 @@ public class ModuleProvider
{
new TenantsModuleSpecifics(coreSettings,helpers),
new AuditModuleSpecifics(helpers),
new CommunityModuleSpecifics(helpers),
new CalendarModuleSpecifics(helpers),
new ProjectsModuleSpecifics(helpers),
new CrmModuleSpecifics(helpers),
new FilesModuleSpecifics(logger,helpers),
new MailModuleSpecifics(logger,helpers),
new CrmModuleSpecifics2(helpers),
new FilesModuleSpecifics2(helpers),
new CrmInvoiceModuleSpecifics(helpers),
new WebStudioModuleSpecifics(helpers),
new CoreModuleSpecifics(helpers)
}
@ -56,10 +49,6 @@ public class ModuleProvider
return storageModuleName switch
{
"files" => AllModules.FirstOrDefault(m => m.ModuleName == ModuleName.Files),
"projects" => AllModules.FirstOrDefault(m => m.ModuleName == ModuleName.Projects),
"crm" => AllModules.FirstOrDefault(m => m.ModuleName == (storageDomainName == "mail_messages" ? ModuleName.Crm2 : ModuleName.Crm)),
"forum" => AllModules.FirstOrDefault(m => m.ModuleName == ModuleName.Community),
"mailaggregator" => AllModules.FirstOrDefault(m => m.ModuleName == ModuleName.Mail),
_ => null,
};
}

View File

@ -1,204 +0,0 @@
// (c) Copyright Ascensio System SIA 2010-2022
//
// This program is a free software product.
// You can redistribute it and/or modify it under the terms
// of the GNU Affero General Public License (AGPL) version 3 as published by the Free Software
// Foundation. In accordance with Section 7(a) of the GNU AGPL its Section 15 shall be amended
// to the effect that Ascensio System SIA expressly excludes the warranty of non-infringement of
// any third-party rights.
//
// This program is distributed WITHOUT ANY WARRANTY, without even the implied warranty
// of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For details, see
// the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html
//
// You can contact Ascensio System SIA at Lubanas st. 125a-25, Riga, Latvia, EU, LV-1021.
//
// The interactive user interfaces in modified source and object code versions of the Program must
// display Appropriate Legal Notices, as required under Section 5 of the GNU AGPL version 3.
//
// Pursuant to Section 7(b) of the License you must retain the original Product logo when
// distributing the program. Pursuant to Section 7(e) we decline to grant you any rights under
// trademark law for use of our trademarks.
//
// All the Product's GUI elements, including illustrations and icon sets, as well as technical writing
// content are licensed under the terms of the Creative Commons Attribution-ShareAlike 4.0
// International. See the License terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode
namespace ASC.Data.Backup.Tasks.Modules;
public class ProjectsModuleSpecifics : ModuleSpecificsBase
{
public override ModuleName ModuleName => ModuleName.Projects;
public override IEnumerable<TableInfo> Tables => _tables;
public override IEnumerable<RelationInfo> TableRelations => _tableRelations;
private readonly TableInfo[] _tables = new[]
{
new TableInfo("projects_comments", "tenant_id", "comment_id", IdType.Autoincrement) {UserIDColumns = new[] {"create_by"}},
new TableInfo("projects_following_project_participant") {UserIDColumns = new[] {"participant_id"}},
new TableInfo("projects_messages", "tenant_id", "id")
{
UserIDColumns = new[] {"create_by", "last_modified_by"},
DateColumns = new Dictionary<string, bool> {{"create_on", false}, {"last_modified_on", false}}
},
new TableInfo("projects_milestones", "tenant_id", "id")
{
UserIDColumns = new[] {"create_by", "last_modified_by", "responsible_id"},
DateColumns = new Dictionary<string, bool> {{"deadline", true}, {"status_changed", false}, {"create_on", false}, {"last_modified_on", false}}
},
new TableInfo("projects_projects", "tenant_id", "id")
{
UserIDColumns = new[] {"create_by", "last_modified_by", "responsible_id"},
DateColumns = new Dictionary<string, bool> {{"status_changed", false}, {"create_on", false}, {"last_modified_on", false}}
},
new TableInfo("projects_project_participant", "tenant") {UserIDColumns = new[] {"participant_id"}},
new TableInfo("projects_project_tag"),
new TableInfo("projects_report_template", "tenant_id", "id") {UserIDColumns = new[] {"create_by"}},
new TableInfo("projects_subtasks", "tenant_id", "id")
{
UserIDColumns = new[] {"create_by", "last_modified_by", "responsible_id"},
DateColumns = new Dictionary<string, bool> {{"status_changed", false}, {"create_on", false}, {"last_modified_on", false}}
},
new TableInfo("projects_tags", "tenant_id", "id"),
new TableInfo("projects_tasks", "tenant_id", "id")
{
UserIDColumns = new[] {"create_by", "last_modified_by", "responsible_id"},
DateColumns = new Dictionary<string, bool> {{"status_changed", true}, {"deadline", true}, {"create_on", false}, {"last_modified_on", true}, {"start_date", true}}
},
new TableInfo("projects_tasks_responsible", "tenant_id") {UserIDColumns = new[] {"responsible_id"}},
new TableInfo("projects_templates", "tenant_id", "id") {UserIDColumns = new[] {"create_by", "last_modified_by"}},
new TableInfo("projects_time_tracking", "tenant_id", "id")
{
UserIDColumns = new[] {"create_by", "person_id"},
DateColumns = new Dictionary<string, bool> {{"date", true}, {"create_on", false}, {"status_changed", true}}
},
new TableInfo("projects_tasks_links", "tenant_id"),
new TableInfo("projects_tasks_order", "tenant_id")
};
private readonly RelationInfo[] _tableRelations = new[]
{
new RelationInfo("projects_comments", "id", "projects_comments", "parent_id"),
new RelationInfo("projects_messages", "id", "projects_comments", "target_uniq_id", x => Convert.ToString(x["target_uniq_id"]).StartsWith("Message_", StringComparison.InvariantCultureIgnoreCase)),
new RelationInfo("projects_tasks", "id", "projects_comments", "target_uniq_id", x => Convert.ToString(x["target_uniq_id"]).StartsWith("Task_", StringComparison.InvariantCultureIgnoreCase)),
new RelationInfo("projects_milestones", "id", "projects_comments", "target_uniq_id", x => Convert.ToString(x["target_uniq_id"]).StartsWith("Milestone_", StringComparison.InvariantCultureIgnoreCase)),
new RelationInfo("projects_projects", "id", "projects_following_project_participant", "project_id"),
new RelationInfo("projects_projects", "id", "projects_messages", "project_id"),
new RelationInfo("projects_projects", "id", "projects_milestones", "project_id"),
new RelationInfo("projects_projects", "id", "projects_project_participant", "project_id"),
new RelationInfo("projects_projects", "id", "projects_project_tag", "project_id"),
new RelationInfo("projects_tags", "id", "projects_project_tag", "tag_id"),
new RelationInfo("projects_tasks", "id", "projects_subtasks", "task_id"),
new RelationInfo("projects_projects", "id", "projects_tasks", "project_id"),
new RelationInfo("projects_milestones", "id", "projects_tasks", "milestone_id"),
new RelationInfo("projects_tasks", "id", "projects_tasks_responsible", "task_id"),
new RelationInfo("projects_projects", "id", "projects_time_tracking", "project_id"),
new RelationInfo("projects_tasks", "id", "projects_time_tracking", "relative_task_id"),
new RelationInfo("projects_tasks", "id", "projects_tasks_links", "task_id"),
new RelationInfo("projects_tasks", "id", "projects_tasks_links", "parent_id"),
new RelationInfo("projects_projects", "id", "projects_tasks_order", "project_id"),
new RelationInfo("projects_tasks", "id", "projects_tasks_order", "task_order"),
new RelationInfo("projects_milestones", "id", "projects_tasks_order", "task_order")
};
public ProjectsModuleSpecifics(Helpers helpers) : base(helpers) { }
public override bool TryAdjustFilePath(bool dump, ColumnMapper columnMapper, ref string filePath)
{
var match = Regex.Match(filePath, @"^thumbs/\d+/\d+/\d+/(?'fileId'\d+)\.jpg$");
if (match.Success)
{
var fileId = columnMapper.GetMapping("files_file", "id", match.Groups["fileId"].Value);
if (fileId == null)
{
if (!dump)
{
return false;
}
fileId = match.Groups["fileId"].Value;
}
var s = fileId.ToString().PadRight(6, '0');
filePath = string.Format("thumbs/{0}/{1}/{2}/{3}.jpg", s.Substring(0, 2), s.Substring(2, 2), s.Substring(4), fileId);
return true;
}
return false;
}
protected override string GetSelectCommandConditionText(int tenantId, TableInfo table)
{
if (table.Name == "projects_project_tag" || table.Name == "projects_following_project_participant")
{
return "inner join projects_projects as t1 on t1.id = t.project_id where t1.tenant_id = " + tenantId;
}
return base.GetSelectCommandConditionText(tenantId, table);
}
protected override bool TryPrepareValue(DbConnection connection, ColumnMapper columnMapper, TableInfo table, string columnName, ref object value)
{
if (table.Name == "projects_comments" && columnName == "content" ||
table.Name == "projects_messages" && columnName == "content")
{
value = FCKEditorPathUtility.CorrectStoragePath(value as string, columnMapper.GetTenantMapping());
return true;
}
return base.TryPrepareValue(connection, columnMapper, table, columnName, ref value);
}
protected override bool TryPrepareValue(DbConnection connection, ColumnMapper columnMapper, RelationInfo relation, ref object value)
{
if (relation.ChildTable == "projects_comments" && relation.ChildColumn == "target_uniq_id")
{
var valParts = value.ToString().Split('_');
var entityId = columnMapper.GetMapping(relation.ParentTable, relation.ParentColumn, valParts[1]);
if (entityId == null)
{
return false;
}
value = string.Format("{0}_{1}", valParts[0], entityId);
return true;
}
return base.TryPrepareValue(connection, columnMapper, relation, ref value);
}
protected override bool TryPrepareValue(bool dump, DbConnection connection, ColumnMapper columnMapper, TableInfo table, string columnName, IEnumerable<RelationInfo> relations, ref object value)
{
if (table.Name == "projects_tasks_order" && columnName == "task_order")
{
value = Regex.Replace(
Convert.ToString(value),
@"(?<=""tasks"":\[(\d+,)*)\d+,?",
match =>
{
var mappedId = Convert.ToString(columnMapper.GetMapping("projects_tasks", "id", match.Value.TrimEnd(',')));
return !string.IsNullOrEmpty(mappedId) && match.Value.EndsWith(',') ? mappedId + "," : mappedId;
},
RegexOptions.Compiled);
value = Regex.Replace(
Convert.ToString(value),
@"(?<=""milestones"":\[(\d+,)*)\d+,?",
match =>
{
var mappedId = Convert.ToString(columnMapper.GetMapping("projects_milestones", "id", match.Value.TrimEnd(',')));
return !string.IsNullOrEmpty(mappedId) && match.Value.EndsWith(',') ? mappedId + "," : mappedId;
},
RegexOptions.Compiled);
return true;
}
return base.TryPrepareValue(dump, connection, columnMapper, table, columnName, relations, ref value);
}
}

View File

@ -41,11 +41,7 @@ public class WebStudioModuleSpecifics : ModuleSpecificsBase
new TableInfo("webstudio_uservisit", "tenantid") {InsertMethod = InsertMethod.None}
};
private readonly RelationInfo[] _relations = new[]
{
new RelationInfo("crm_organisation_logo", "id", "webstudio_settings", "Data", typeof(CrmInvoiceModuleSpecifics),
x => _crmSettingsId == new Guid(Convert.ToString(x["ID"])))
};
private readonly RelationInfo[] _relations = new RelationInfo[0];
public WebStudioModuleSpecifics(Helpers helpers) : base(helpers) { }

View File

@ -24,25 +24,32 @@
// content are licensed under the terms of the Creative Commons Attribution-ShareAlike 4.0
// International. See the License terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode
using ASC.EventBus.Log;
namespace ASC.Notify.IntegrationEvents.EventHandling;
[Scope]
public class EncryptionDataStorageRequestedIntegrationEventHandler : IIntegrationEventHandler<EncryptionDataStorageRequestedIntegration>
{
private readonly ILogger _logger;
private readonly EncryptionWorker _encryptionWorker;
public EncryptionDataStorageRequestedIntegrationEventHandler(EncryptionWorker encryptionWorker)
public EncryptionDataStorageRequestedIntegrationEventHandler(EncryptionWorker encryptionWorker,
ILogger<EncryptionDataStorageRequestedIntegrationEventHandler> logger)
{
_encryptionWorker = encryptionWorker;
_logger = logger;
}
public async Task Handle(EncryptionDataStorageRequestedIntegration @event)
{
// using (_logger.BeginScope(new[] { new KeyValuePair<string, object>("integrationEventContext", $"{@event.Id}-{Program.AppName}") }))
// {
// _logger.InformationHandlingIntegrationEvent(@event.Id, Program.AppName, @event);
// _logger.InformationHandlingIntegrationEvent(@event.Id, Program.AppName, @event);
_encryptionWorker.Start(@event.EncryptionSettings, @event.ServerRootPath);
_encryptionWorker.Start(@event.EncryptionSettings, @event.ServerRootPath);
await Task.CompletedTask;
await Task.CompletedTask;
// }
}
}

View File

@ -47,7 +47,7 @@ public class IPRestrictionsRepository
.ToList();
}
public List<string> Save(IEnumerable<string> ips, int tenant)
public List<IpRestrictionBase> Save(IEnumerable<IpRestrictionBase> ips, int tenant)
{
using var tenantDbContext = _dbContextManager.CreateDbContext();
var strategy = tenantDbContext.Database.CreateExecutionStrategy();
@ -64,7 +64,9 @@ public class IPRestrictionsRepository
var ipsList = ips.Select(r => new TenantIpRestrictions
{
Tenant = tenant,
Ip = r
Ip = r.Ip,
ForAdmin = r.ForAdmin
});
tenantDbContext.TenantIpRestrictions.AddRange(ipsList);

View File

@ -27,9 +27,16 @@
namespace ASC.IPSecurity;
[Serializable]
public class IPRestriction : IMapFrom<TenantIpRestrictions>
public class IPRestriction : IpRestrictionBase, IMapFrom<TenantIpRestrictions>
{
public int Id { get; set; }
public int Tenant { get; set; }
public string Ip { get; set; }
}
public class IpRestrictionBase
{
public string Ip { get; set; }
public bool ForAdmin { get; set; }
}

View File

@ -78,7 +78,7 @@ public class IPRestrictionsService
return restrictions;
}
public IEnumerable<string> Save(IEnumerable<string> ips, int tenant)
public IEnumerable<IpRestrictionBase> Save(IEnumerable<IpRestrictionBase> ips, int tenant)
{
var restrictions = _ipRestrictionsRepository.Save(ips, tenant);
_notify.Publish(new IPRestrictionItem { TenantId = tenant }, CacheNotifyAction.InsertOrUpdate);

View File

@ -68,4 +68,15 @@ internal class IPAddressRange
return true;
}
public static bool IsInRange(string ipAddress, string CIDRmask)
{
var parts = CIDRmask.Split('/');
var IP_addr = BitConverter.ToInt32(IPAddress.Parse(ipAddress).GetAddressBytes(), 0);
var CIDR_addr = BitConverter.ToInt32(IPAddress.Parse(parts[0]).GetAddressBytes(), 0);
var CIDR_mask = IPAddress.HostToNetworkOrder(-1 << (32 - int.Parse(parts[1])));
return (IP_addr & CIDR_mask) == (CIDR_addr & CIDR_mask);
}
}

View File

@ -38,20 +38,26 @@ public class IPSecurity
private readonly IPRestrictionsService _ipRestrictionsService;
private readonly string _currentIpForTest;
private readonly string _myNetworks;
private readonly SecurityContext _securityContext;
private readonly UserManager _userManager;
public IPSecurity(
IConfiguration configuration,
IHttpContextAccessor httpContextAccessor,
AuthContext authContext,
TenantManager tenantManager,
IPRestrictionsService iPRestrictionsService,
IPRestrictionsService iPRestrictionsService,
SecurityContext securityContext,
UserManager userManager,
ILogger<IPSecurity> logger)
{
_logger = logger;
_httpContextAccessor = httpContextAccessor;
_authContext = authContext;
_tenantManager = tenantManager;
_ipRestrictionsService = iPRestrictionsService;
_ipRestrictionsService = iPRestrictionsService;
_securityContext = securityContext;
_userManager = userManager;
_currentIpForTest = configuration["ipsecurity:test"];
_myNetworks = configuration["ipsecurity:mynetworks"];
var hideSettings = (configuration["web:hide-settings"] ?? "").Split(new[] { ',', ';', ' ' });
@ -97,9 +103,11 @@ public class IPSecurity
var ips = string.IsNullOrWhiteSpace(requestIps)
? Array.Empty<string>()
: requestIps.Split(new[] { ",", " " }, StringSplitOptions.RemoveEmptyEntries);
: requestIps.Split(new[] { ",", " " }, StringSplitOptions.RemoveEmptyEntries);
var isAdmin = _userManager.IsUserInGroup(_securityContext.CurrentAccount.ID, Core.Users.Constants.GroupAdmin.ID);
if (ips.Any(requestIp => restrictions.Any(restriction => MatchIPs(GetIpWithoutPort(requestIp), restriction.Ip))))
if (ips.Any(requestIp => restrictions.Any(restriction => (restriction.ForAdmin ? isAdmin : true) && MatchIPs(GetIpWithoutPort(requestIp), restriction.Ip))))
{
return true;
}
@ -131,6 +139,11 @@ public class IPSecurity
var range = new IPAddressRange(lower, upper);
return range.IsInRange(IPAddress.Parse(requestIp));
}
if (restrictionIp.IndexOf('/') > -1)
{
return IPAddressRange.IsInRange(requestIp, restrictionIp);
}
return requestIp == restrictionIp;

View File

@ -65,7 +65,7 @@ public class MigrationController : ControllerBase
[HttpGet("backuptmp")]
public string GetTmpFolder()
{
if (!_coreBaseSettings.Standalone || !_userManager.GetUsers(_authContext.CurrentAccount.ID).IsAdmin(_userManager))
if (!_coreBaseSettings.Standalone || !_userManager.IsAdmin(_authContext.CurrentAccount.ID))
{
throw new System.Security.SecurityException();
}
@ -86,7 +86,7 @@ public class MigrationController : ControllerBase
[HttpGet("list")]
public string[] List()
{
if (!_coreBaseSettings.Standalone || !_userManager.GetUsers(_authContext.CurrentAccount.ID).IsAdmin(_userManager))
if (!_coreBaseSettings.Standalone || !_userManager.IsAdmin(_authContext.CurrentAccount.ID))
{
throw new System.Security.SecurityException();
}
@ -102,7 +102,7 @@ public class MigrationController : ControllerBase
[HttpPost("init/{migratorName}")]
public void UploadAndInit(string migratorName, string path)
{
if (!_coreBaseSettings.Standalone || !_userManager.GetUsers(_authContext.CurrentAccount.ID).IsAdmin(_userManager))
if (!_coreBaseSettings.Standalone || !_userManager.IsAdmin(_authContext.CurrentAccount.ID))
{
throw new System.Security.SecurityException();
}
@ -141,7 +141,7 @@ public class MigrationController : ControllerBase
[HttpGet("status")]
public object Status()
{
if (!_coreBaseSettings.Standalone || !_userManager.GetUsers(_authContext.CurrentAccount.ID).IsAdmin(_userManager))
if (!_coreBaseSettings.Standalone || !_userManager.IsAdmin(_authContext.CurrentAccount.ID))
{
throw new System.Security.SecurityException();
}
@ -175,7 +175,7 @@ public class MigrationController : ControllerBase
[HttpPost("cancel")]
public void Cancel()
{
if (!_coreBaseSettings.Standalone || !_userManager.GetUsers(_authContext.CurrentAccount.ID).IsAdmin(_userManager))
if (!_coreBaseSettings.Standalone || !_userManager.IsAdmin(_authContext.CurrentAccount.ID))
{
throw new System.Security.SecurityException();
}
@ -195,7 +195,7 @@ public class MigrationController : ControllerBase
[HttpPost("migrate")]
public void Migrate(MigrationApiInfo info)
{
if (!_coreBaseSettings.Standalone || !_userManager.GetUsers(_authContext.CurrentAccount.ID).IsAdmin(_userManager))
if (!_coreBaseSettings.Standalone || !_userManager.IsAdmin(_authContext.CurrentAccount.ID))
{
throw new System.Security.SecurityException();
}
@ -220,7 +220,7 @@ public class MigrationController : ControllerBase
[HttpGet("logs")]
public async Task Logs()
{
if (!_coreBaseSettings.Standalone || !_userManager.GetUsers(_authContext.CurrentAccount.ID).IsAdmin(_userManager))
if (!_coreBaseSettings.Standalone || !_userManager.IsAdmin(_authContext.CurrentAccount.ID))
{
throw new System.Security.SecurityException();
}
@ -243,7 +243,7 @@ public class MigrationController : ControllerBase
[HttpPost("finish")]
public void Finish(bool isSendWelcomeEmail)
{
if (!_coreBaseSettings.Standalone || !_userManager.GetUsers(_authContext.CurrentAccount.ID).IsAdmin(_userManager))
if (!_coreBaseSettings.Standalone || !_userManager.IsAdmin(_authContext.CurrentAccount.ID))
{
throw new System.Security.SecurityException();
}

View File

@ -270,8 +270,8 @@ public class GwsMigratingFiles : MigratingFiles
list.Add(new AceWrapper
{
Share = shareType.Value,
SubjectId = entryGuid,
Access = shareType.Value,
Id = entryGuid,
SubjectGroup = false
});
}

View File

@ -225,8 +225,8 @@ public class NCMigratingFiles : MigratingFiles
var entryGuid = userToShare == null ? groupToShare.Guid : userToShare.Guid;
list.Add(new AceWrapper
{
Share = shareType.Value,
SubjectId = entryGuid,
Access = shareType.Value,
Id = entryGuid,
SubjectGroup = false
});
}

Some files were not shown because too many files have changed in this diff Show More