diff --git a/.github/workflows/4testing-multi-build.yml b/.github/workflows/4testing-multi-build.yml index 06e4ddd187..99b3df070c 100644 --- a/.github/workflows/4testing-multi-build.yml +++ b/.github/workflows/4testing-multi-build.yml @@ -31,6 +31,7 @@ jobs: with: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} + - name: Build 4testing run: | cd .${DOCKER_PATH} diff --git a/.github/workflows/build_packages.yml b/.github/workflows/build_packages.yml index 22c25aae09..e300673d57 100644 --- a/.github/workflows/build_packages.yml +++ b/.github/workflows/build_packages.yml @@ -63,7 +63,10 @@ jobs: wget https://packages.microsoft.com/config/$(lsb_release -is | \ tr [:upper:] [:lower:])/$(lsb_release -rs)/packages-microsoft-prod.deb -O packages-microsoft-prod.deb sudo dpkg -i packages-microsoft-prod.deb - wget -O - https://deb.nodesource.com/setup_18.x | sudo -E bash - + echo "deb [signed-by=/usr/share/keyrings/nodesource.gpg] https://deb.nodesource.com/node_18.x nodistro main" | tee /etc/apt/sources.list.d/nodesource.list + curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --no-default-keyring --keyring gnupg-ring:/usr/share/keyrings/nodesource.gpg --import + chmod 644 /usr/share/keyrings/nodesource.gpg + apt-get -y update sudo apt install -y dotnet-sdk-7.0 yarn nodejs dh-make rename dpkg-sig lintian sudo npm install -g json echo "BRANCH_NAME=$(echo ${GITHUB_REF#refs/heads/})" >> $GITHUB_OUTPUT @@ -133,7 +136,10 @@ jobs: wget https://packages.microsoft.com/config/$(lsb_release -is | \ tr [:upper:] [:lower:])/$(lsb_release -rs)/packages-microsoft-prod.deb -O packages-microsoft-prod.deb sudo dpkg -i packages-microsoft-prod.deb - wget -O - https://deb.nodesource.com/setup_18.x | sudo -E bash - + echo "deb [signed-by=/usr/share/keyrings/nodesource.gpg] https://deb.nodesource.com/node_18.x nodistro main" | tee /etc/apt/sources.list.d/nodesource.list + curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --no-default-keyring --keyring gnupg-ring:/usr/share/keyrings/nodesource.gpg --import + chmod 644 /usr/share/keyrings/nodesource.gpg + apt-get -y update sudo apt install -y dotnet-sdk-7.0 yarn nodejs dh-make rename python3-pip python3-rpm sudo npm install -g json sudo pip install rpmlint diff --git a/build/install/OneClickInstall/install-Debian/install-app.sh b/build/install/OneClickInstall/install-Debian/install-app.sh index 9e88d16ad9..c7849c089c 100644 --- a/build/install/OneClickInstall/install-Debian/install-app.sh +++ b/build/install/OneClickInstall/install-Debian/install-app.sh @@ -31,6 +31,7 @@ if [ "$UPDATE" = "true" ] && [ "$DOCUMENT_SERVER_INSTALLED" = "true" ]; then RECONFIGURE_PRODUCT="true" else + systemctl is-active openresty | grep -q "^active" && systemctl stop openresty apt-get install -y --only-upgrade ${ds_pkg_name}; fi fi @@ -60,6 +61,8 @@ if [ "$DOCUMENT_SERVER_INSTALLED" = "false" ]; then echo ${package_sysname}-documentserver $DS_COMMON_NAME/jwt-enabled select ${DS_JWT_ENABLED} | sudo debconf-set-selections echo ${package_sysname}-documentserver $DS_COMMON_NAME/jwt-secret select ${DS_JWT_SECRET} | sudo debconf-set-selections echo ${package_sysname}-documentserver $DS_COMMON_NAME/jwt-header select ${DS_JWT_HEADER} | sudo debconf-set-selections + + systemctl is-active openresty | grep -q "^active" && systemctl stop openresty if [ "$INSTALLATION_TYPE" = "COMMUNITY" ]; then apt-get install -yq ${package_sysname}-documentserver diff --git a/build/install/OneClickInstall/install-Debian/install-preq.sh b/build/install/OneClickInstall/install-Debian/install-preq.sh index 75271e8fc7..5ff6ca3801 100644 --- a/build/install/OneClickInstall/install-Debian/install-preq.sh +++ b/build/install/OneClickInstall/install-Debian/install-preq.sh @@ -40,7 +40,9 @@ chmod 644 /usr/share/keyrings/elastic-${ELASTIC_DIST}.x.gpg # add nodejs repo [[ "$DISTRIB_CODENAME" =~ ^(bionic|stretch)$ ]] && NODE_VERSION="16" || NODE_VERSION="18" -curl -sL https://deb.nodesource.com/setup_${NODE_VERSION}.x | bash - +echo "deb [signed-by=/usr/share/keyrings/nodesource.gpg] https://deb.nodesource.com/node_$NODE_VERSION.x nodistro main" | tee /etc/apt/sources.list.d/nodesource.list +curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --no-default-keyring --keyring gnupg-ring:/usr/share/keyrings/nodesource.gpg --import +chmod 644 /usr/share/keyrings/nodesource.gpg #add dotnet repo if [ "$DIST" = "debian" ] && [ "$DISTRIB_CODENAME" = "stretch" ]; then @@ -103,10 +105,7 @@ echo "deb [signed-by=/usr/share/keyrings/openresty.gpg] http://openresty.org/pac chmod 644 /usr/share/keyrings/openresty.gpg #Temporary fix for missing openresty repository for debian bookworm [ "$DISTRIB_CODENAME" = "bookworm" ] && sed -i "s/$DISTRIB_CODENAME/bullseye/g" /etc/apt/sources.list.d/openresty.list - -if systemctl is-active nginx | grep -q "active"; then - systemctl disable nginx && systemctl stop nginx -fi +systemctl is-active nginx | grep -q "^active" && systemctl stop nginx # setup msttcorefonts echo ttf-mscorefonts-installer msttcorefonts/accepted-mscorefonts-eula select true | debconf-set-selections diff --git a/build/install/OneClickInstall/install-Docker.sh b/build/install/OneClickInstall/install-Docker.sh index 2fed2f533a..1f2f5fbf73 100644 --- a/build/install/OneClickInstall/install-Docker.sh +++ b/build/install/OneClickInstall/install-Docker.sh @@ -867,6 +867,26 @@ read_continue_installation () { } domain_check () { + if ! command_exists dig; then + install_service dig dnsutils + fi + + if ! command_exists ping; then + if command_exists apt-get; then + install_service ping iputils-ping + elif command_exists yum; then + install_service ping iputils + fi + fi + + if ! command_exists ip; then + if command_exists apt-get; then + install_service ip iproute2 + elif command_exists yum; then + install_service ip iproute + fi + fi + DOMAINS=$(dig +short -x $(curl -s ifconfig.me) | sed 's/\.$//') if [[ -n "$DOMAINS" ]]; then @@ -875,7 +895,7 @@ domain_check () { if [[ -n "$IP_ADDRESS" && "$IP_ADDRESS" =~ ^(10\.|127\.|172\.(1[6-9]|2[0-9]|3[0-1])\.|192\.168\.) ]]; then LOCAL_RESOLVED_DOMAINS+="$DOMAIN" elif [[ -n "$IP_ADDRESS" ]]; then - APP_URL_PORTAL=${APP_URL_PORTAL-:"http://${DOMAIN}:${EXTERNAL_PORT}"} + APP_URL_PORTAL=${APP_URL_PORTAL:-"http://${DOMAIN}:${EXTERNAL_PORT}"} fi done <<< "$DOMAINS" fi @@ -1262,6 +1282,8 @@ install_elasticsearch () { install_product () { DOCKER_TAG="${DOCKER_TAG:-$(get_available_version ${IMAGE_NAME})}" + reconfigure DOCKER_TAG ${DOCKER_TAG} + [ "${UPDATE}" = "true" ] && LOCAL_CONTAINER_TAG="$(docker inspect --format='{{index .Config.Image}}' ${CONTAINER_NAME} | awk -F':' '{print $2}')" if [ "${UPDATE}" = "true" ] && [ "${LOCAL_CONTAINER_TAG}" != "${DOCKER_TAG}" ]; then @@ -1274,7 +1296,6 @@ install_product () { reconfigure APP_CORE_MACHINEKEY ${APP_CORE_MACHINEKEY} reconfigure APP_CORE_BASE_DOMAIN ${APP_CORE_BASE_DOMAIN} reconfigure APP_URL_PORTAL "${APP_URL_PORTAL:-"http://${PACKAGE_SYSNAME}-proxy:8092"}" - reconfigure DOCKER_TAG ${DOCKER_TAG} [[ -n $EXTERNAL_PORT ]] && sed -i "s/8092:8092/${EXTERNAL_PORT}:8092/g" $BASE_DIR/${PRODUCT}.yml diff --git a/build/install/OneClickInstall/install-RedHat/install-app.sh b/build/install/OneClickInstall/install-RedHat/install-app.sh index d824913724..5f4c5155d4 100644 --- a/build/install/OneClickInstall/install-RedHat/install-app.sh +++ b/build/install/OneClickInstall/install-RedHat/install-app.sh @@ -62,7 +62,7 @@ if [ "${MYSQL_FIRST_TIME_INSTALL}" = "true" ]; then MYSQL="mysql --connect-expired-password -u$MYSQL_SERVER_USER -D mysql"; else MYSQL="mysql --connect-expired-password -u$MYSQL_SERVER_USER -p${MYSQL_TEMPORARY_ROOT_PASS} -D mysql"; - MYSQL_ROOT_PASS=$(echo $MYSQL_TEMPORARY_ROOT_PASS | sed -e 's/;/%/g' -e 's/=/%/g'); + MYSQL_ROOT_PASS=$(cat /dev/urandom | tr -dc A-Za-z0-9 | head -c 12); fi MYSQL_AUTHENTICATION_PLUGIN=$($MYSQL -e "SHOW VARIABLES LIKE 'default_authentication_plugin';" -s | awk '{print $2}') diff --git a/build/install/OneClickInstall/install-RedHat/install-preq.sh b/build/install/OneClickInstall/install-RedHat/install-preq.sh index eaba21f38d..48e638d54f 100644 --- a/build/install/OneClickInstall/install-RedHat/install-preq.sh +++ b/build/install/OneClickInstall/install-RedHat/install-preq.sh @@ -60,8 +60,7 @@ curl -s https://packagecloud.io/install/repositories/rabbitmq/erlang/script.rpm. #add nodejs repo [ "$REV" = "7" ] && NODE_VERSION="16" || NODE_VERSION="18" -curl -sL https://rpm.nodesource.com/setup_${NODE_VERSION}.x | sed 's/centos|/'$DIST'|/g' | sudo bash - || true -rpm --import http://rpm.nodesource.com/pub/el/NODESOURCE-GPG-SIGNING-KEY-EL +yum install -y https://rpm.nodesource.com/pub_${NODE_VERSION}.x/nodistro/repo/nodesource-release-nodistro-1.noarch.rpm #add dotnet repo if [ $REV = "7" ] || [[ $DIST != "redhat" && $REV = "8" ]]; then @@ -95,10 +94,7 @@ END rpm --import https://openresty.org/package/pubkey.gpg OPENRESTY_REPO_FILE=$( [[ "$REV" -ge 9 ]] && echo "openresty2.repo" || echo "openresty.repo" ) curl -o /etc/yum.repos.d/openresty.repo "https://openresty.org/package/centos/${OPENRESTY_REPO_FILE}" - -if systemctl is-active nginx | grep -q "active"; then - systemctl disable nginx && systemctl stop nginx -fi +systemctl is-active nginx | grep -q "^active" && systemctl stop nginx ${package_manager} -y install epel-release \ python3 \ diff --git a/build/install/common/product-configuration b/build/install/common/product-configuration index 6c00fa142f..7046c400de 100644 --- a/build/install/common/product-configuration +++ b/build/install/common/product-configuration @@ -56,20 +56,6 @@ while [ "$1" != "" ]; do fi ;; - -dsh | --docshost ) - if [ "$2" != "" ]; then - DOCUMENT_SERVER_HOST=$2 - shift - fi - ;; - - -dsp | --docsport ) - if [ "$2" != "" ]; then - DOCUMENT_SERVER_PORT=$2 - shift - fi - ;; - -ess | --elasticsheme ) if [ "$2" != "" ]; then ELK_SHEME=$2 @@ -175,14 +161,34 @@ while [ "$1" != "" ]; do fi ;; + -js | --jwtsecret ) + if [ "$2" != "" ]; then + DOCUMENT_SERVER_JWT_SECRET=$2 + shift + fi + ;; + + -jh | --jwtheader ) + if [ "$2" != "" ]; then + DOCUMENT_SERVER_JWT_HEADER=$2 + shift + fi + ;; + + -docsurl | --docsurl ) + if [ "$2" != "" ]; then + DOCUMENT_SERVER_URL_EXTERNAL=$2 + shift + fi + ;; + -? | -h | --help ) echo " Usage: bash ${PRODUCT}-configuration [PARAMETER] [[PARAMETER], ...]" echo echo " Parameters:" echo " -ash, --appshost ${PRODUCT} ip" echo " -asp, --appsport ${PRODUCT} port (default 80)" - echo " -dsh, --docshost document server ip" - echo " -dsp, --docsport document server port (default 8083)" + echo " -docsurl, --docsurl $PACKAGE_SYSNAME docs server address (example http://$PACKAGE_SYSNAME-docs-address:8083)" echo " -esh, --elastichost elasticsearch ip" echo " -esp, --elasticport elasticsearch port (default 9200)" echo " -rdh, --redishost redis ip" @@ -195,6 +201,8 @@ while [ "$1" != "" ]; do echo " -mysqld, --mysqldatabase ${PRODUCT} database name" echo " -mysqlu, --mysqluser ${PRODUCT} database user" echo " -mysqlp, --mysqlpassword ${PRODUCT} database password" + echo " -js, --jwtsecret defines the secret key to validate the JWT in the request" + echo " -jh. --jwtheader defines the http header that will be used to send the JWT" echo " -mk, --machinekey setting for core.machinekey" echo " -e, --environment environment (default 'production')" echo " -?, -h, --help this help" @@ -309,7 +317,7 @@ establish_mysql_conn(){ command -v mysql >/dev/null 2>&1 || { echo "MySQL client not found"; exit 1; } - MYSQL="mysql -h$DB_HOST -u$DB_USER" + MYSQL="mysql -P$DB_PORT -h$DB_HOST -u$DB_USER" if [ -n "$DB_PWD" ]; then MYSQL="$MYSQL -p$DB_PWD" fi @@ -321,6 +329,10 @@ establish_mysql_conn(){ $MYSQL -e ";" >/dev/null 2>&1 || { echo "FAILURE"; exit 1; } fi + if $PACKAGE_MANAGER mysql-server >/dev/null 2>&1 || $PACKAGE_MANAGER mysql-community-server >/dev/null 2>&1; then + change_mysql_config + fi + #Save db settings in .json CONNECTION_STRING="Server=$DB_HOST;Port=$DB_PORT;Database=$DB_NAME;User ID=$DB_USER;Password=$DB_PWD;Pooling=true; \ Character Set=utf8; AutoEnlist=false; SSL Mode=none;AllowPublicKeyRetrieval=true;Connection Timeout=30;Maximum Pool Size=300" @@ -328,8 +340,7 @@ Character Set=utf8; AutoEnlist=false; SSL Mode=none;AllowPublicKeyRetrieval=true save_undefined_param "${USER_CONF}" "ConnectionStrings.default.connectionString" "${CONNECTION_STRING}" save_undefined_param "${APP_DIR}/apisystem.${ENVIRONMENT}.json" "ConnectionStrings.default.connectionString" "${CONNECTION_STRING}" - sed "s_\(\"ConnectionString\":\).*_\1 \"${CONNECTION_STRING//_/\\_}\"_" -i $PRODUCT_DIR/services/ASC.Migration.Runner/appsettings.runner.json - change_mysql_config + sed "s&\(\"ConnectionString\":\).*&\1 \"$(printf "%q" "${CONNECTION_STRING}")\"&" -i $PRODUCT_DIR/services/ASC.Migration.Runner/appsettings.runner.json #Enable database migration save_undefined_param "${USER_CONF}" "migration.enabled" "true" @@ -519,25 +530,42 @@ setup_openresty(){ echo "OK" } +# Function gets Document server host and port using regular expression, we need it to check connection +parse_external_docs_url () { + if [[ $DOCUMENT_SERVER_URL_EXTERNAL =~ ^(https?://)?([^:/]+)(:([0-9]+))?(/.*)?$ ]]; then + DOCUMENT_SERVER_PORT="${BASH_REMATCH[4]:-80}" + DOCUMENT_SERVER_HOST="${BASH_REMATCH[2]}" + + [[ -n ${BASH_REMATCH[1]} ]] || DOCUMENT_SERVER_URL_EXTERNAL="http://$DOCUMENT_SERVER_HOST:$DOCUMENT_SERVER_PORT" + fi + } + setup_docs() { echo -n "Configuring docs... " - local DS_CONF_DIR="/etc/${PACKAGE_SYSNAME}/documentserver" - local DOCUMENT_SERVER_HOST=${DOCUMENT_SERVER_HOST:-localhost} - local DOCUMENT_SERVER_PORT=${DOCUMENT_SERVER_PORT:-$(grep -oP '(?<=:)\d+(?=\s)' ${DS_CONF_DIR}/nginx/ds.conf)} + + if [ $1 == "LOCAL_DOCS_SERVER" ]; then + local DS_CONF_DIR="/etc/${PACKAGE_SYSNAME}/documentserver" + local DOCUMENT_SERVER_PORT=$(grep -oP '(?<=:)\d+(?=\s)' ${DS_CONF_DIR}/nginx/ds.conf) + local DOCUMENT_SERVER_JWT_SECRET=${DOCUMENT_SERVER_JWT_SECRET:-$(json -f ${DS_CONF_DIR}/local.json services.CoAuthoring.secret.inbox.string)} + local DOCUMENT_SERVER_JWT_HEADER=${DOCUMENT_SERVER_JWT_HEADER:-$(json -f ${DS_CONF_DIR}/local.json services.CoAuthoring.token.inbox.header)} + + $JSON ${DS_CONF_DIR}/local.json -e "this.rabbitmq = { 'url': 'amqp://${RABBITMQ_USER}:${RABBITMQ_PASSWORD}@${RABBITMQ_HOST}:${RABBITMQ_PORT}' }" >/dev/null 2>&1 + $JSON ${DS_CONF_DIR}/local.json -e "this.services.CoAuthoring.redis = { 'host': '$REDIS_HOST' }" >/dev/null 2>&1 + sed 's/\(listen .*:\)\([0-9]\{2,5\}\b\)\( default_server\)\?\(;\)/\1'${DOCUMENT_SERVER_PORT}'\3\4/' -i ${DS_CONF_DIR}/nginx/ds.conf + elif [ $1 == "EXTERNAL_DOCS_SERVER" ]; then + local APP_HOST=$(curl -s ifconfig.me) + local EXTERNAL_DOCS_FLAG="rewrite" + fi #Changing the Docs port in nginx conf - sed 's/\(listen .*:\)\([0-9]\{2,5\}\b\)\( default_server\)\?\(;\)/\1'${DOCUMENT_SERVER_PORT}'\3\4/' -i ${DS_CONF_DIR}/nginx/ds.conf - sed "0,/proxy_pass .*;/{s/proxy_pass .*;/proxy_pass http:\/\/${DOCUMENT_SERVER_HOST}:${DOCUMENT_SERVER_PORT};/}" -i ${NGINX_DIR}/conf.d/${PACKAGE_SYSNAME}.conf - - local DOCUMENT_SERVER_JWT_SECRET=$(json -f ${DS_CONF_DIR}/local.json services.CoAuthoring.secret.inbox.string) - local DOCUMENT_SERVER_JWT_HEADER=$(json -f ${DS_CONF_DIR}/local.json services.CoAuthoring.token.inbox.header) + sed "0,/proxy_pass .*;/{s#proxy_pass .*;#proxy_pass ${DOCUMENT_SERVER_URL_EXTERNAL:-http://$APP_HOST:$DOCUMENT_SERVER_PORT};#}" -i ${NGINX_DIR}/conf.d/${PACKAGE_SYSNAME}.conf #Save Docs address and JWT in .json - save_undefined_param "${USER_CONF}" "files.docservice.secret.value" "${DOCUMENT_SERVER_JWT_SECRET}" - save_undefined_param "${USER_CONF}" "files.docservice.secret.header" "${DOCUMENT_SERVER_JWT_HEADER} " - save_undefined_param "${USER_CONF}" "files.docservice.url.public" "/ds-vpath/" - save_undefined_param "${USER_CONF}" "files.docservice.url.internal" "http://${DOCUMENT_SERVER_HOST}:${DOCUMENT_SERVER_PORT}" - save_undefined_param "${USER_CONF}" "files.docservice.url.portal" "http://${APP_HOST}:${APP_PORT}" + save_undefined_param "${USER_CONF}" "files.docservice.secret.value" "${DOCUMENT_SERVER_JWT_SECRET}" "$EXTERNAL_DOCS_FLAG" + save_undefined_param "${USER_CONF}" "files.docservice.secret.header" "${DOCUMENT_SERVER_JWT_HEADER:-"AuthorizationJwt"}" "$EXTERNAL_DOCS_FLAG" + save_undefined_param "${USER_CONF}" "files.docservice.url.public" "${DOCUMENT_SERVER_URL_EXTERNAL:-"/ds-vpath/"}" "$EXTERNAL_DOCS_FLAG" + save_undefined_param "${USER_CONF}" "files.docservice.url.internal" "${DOCUMENT_SERVER_URL_EXTERNAL:-"http://$APP_HOST:$DOCUMENT_SERVER_PORT"}" "$EXTERNAL_DOCS_FLAG" + save_undefined_param "${USER_CONF}" "files.docservice.url.portal" "http://${APP_HOST}:${APP_PORT}" "$EXTERNAL_DOCS_FLAG" echo "OK" } @@ -617,10 +645,12 @@ setup_elasticsearch() { save_undefined_param "${APP_DIR}/elastic.${ENVIRONMENT}.json" "elastic.Port" "${ELK_PORT}" save_undefined_param "${APP_DIR}/elastic.${ENVIRONMENT}.json" "elastic.Threads" "1" - change_elasticsearch_config + if [ $1 == "LOCAL_ELASTIC_SERVER" ]; then + change_elasticsearch_config - systemctl enable elasticsearch >/dev/null 2>&1 - systemctl restart elasticsearch + systemctl enable elasticsearch >/dev/null 2>&1 + systemctl restart elasticsearch + fi echo "OK" } @@ -629,13 +659,16 @@ setup_redis() { $JSON $APP_DIR/redis.$ENVIRONMENT.json -e "this.Redis={'Hosts': [ { Host: \"${REDIS_HOST}\", Port: \"${REDIS_PORT}\" } ] }" >/dev/null 2>&1 - if [ -e /etc/redis/redis.conf ]; then + sed -i "s~\(redis_host =\).*~\1 \"$REDIS_HOST\"~" "${NGINX_DIR}/conf.d/${PACKAGE_SYSNAME}.conf" + sed -i "s~\(redis_port =\).*~\1 $REDIS_PORT~" "${NGINX_DIR}/conf.d/${PACKAGE_SYSNAME}.conf" + + if [ $1 == "LOCAL_REDIS_SERVER" ]; then sed "s_\(^bind\).*_\1 ${REDIS_HOST}_" -i /etc/redis/redis.conf sed -r "/^save\s[0-9]+/d" -i /etc/redis/redis.conf - fi - systemctl enable $REDIS_PACKAGE >/dev/null 2>&1 - systemctl restart $REDIS_PACKAGE + systemctl enable $REDIS_PACKAGE >/dev/null 2>&1 + systemctl restart $REDIS_PACKAGE + fi echo "OK" } @@ -649,8 +682,10 @@ setup_rabbitmq() { save_undefined_param "${APP_DIR}/rabbitmq.${ENVIRONMENT}.json" "RabbitMQ.Port" "${RABBITMQ_PORT}" save_undefined_param "${APP_DIR}/rabbitmq.${ENVIRONMENT}.json" "RabbitMQ.VirtualHost" "/" - systemctl enable rabbitmq-server >/dev/null 2>&1 - systemctl restart rabbitmq-server + if [ $1 == "LOCAL_RABBITMQ_SERVER" ]; then + systemctl enable rabbitmq-server >/dev/null 2>&1 + systemctl restart rabbitmq-server + fi echo "OK" } @@ -673,6 +708,19 @@ product_configuration(){ echo "OK" } +# Function below checks if there is a connection to the external service. 0 - OK, connection established +check_connection_external_services() { + exec {FD}<> /dev/tcp/$1/$2 && exec {FD}>&- + HOST_RESPONCE=$? + + if [[ $HOST_RESPONCE -ne 0 ]]; then + echo -e "Host is not responding: $1:$2" + return $HOST_RESPONCE + fi + + return $HOST_RESPONCE +} + if command -v yum >/dev/null 2>&1; then DIST="RedHat" PACKAGE_MANAGER="rpm -q" @@ -694,8 +742,12 @@ if $PACKAGE_MANAGER mysql-client >/dev/null 2>&1 || $PACKAGE_MANAGER mysql-commu fi 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 - setup_enterprise + setup_docs "LOCAL_DOCS_SERVER" + setup_enterprise +elif [[ ! -z $DOCUMENT_SERVER_URL_EXTERNAL ]]; then + parse_external_docs_url "$DOCUMENT_SERVER_URL_EXTERNAL" + check_connection_external_services "$DOCUMENT_SERVER_HOST" "$DOCUMENT_SERVER_PORT" || { echo "ONLYOFFICE Docs host is not responding"; } + setup_docs "EXTERNAL_DOCS_SERVER" fi if $PACKAGE_MANAGER openresty >/dev/null 2>&1; then @@ -703,15 +755,27 @@ if $PACKAGE_MANAGER openresty >/dev/null 2>&1; then fi if $PACKAGE_MANAGER elasticsearch >/dev/null 2>&1; then - setup_elasticsearch + setup_elasticsearch "LOCAL_ELASTIC_SERVER" +elif check_connection_external_services "$ELK_HOST" "$ELK_PORT"; then + setup_elasticsearch "EXTERNAL_ELASTIC_SERVER" +else + echo "Elasticsearch host is not responding" fi if $PACKAGE_MANAGER $REDIS_PACKAGE >/dev/null 2>&1 >/dev/null 2>&1; then - setup_redis + setup_redis "LOCAL_REDIS_SERVER" +elif check_connection_external_services "$REDIS_HOST" "$REDIS_PORT"; then + setup_redis "EXTERNAL_REDIS_SERVER" +else + echo "Redis host is not responding" fi if $PACKAGE_MANAGER rabbitmq-server >/dev/null 2>&1; then - setup_rabbitmq + setup_rabbitmq "LOCAL_RABBITMQ_SERVER" +elif check_connection_external_services "$RABBITMQ_HOST" "$RABBITMQ_PORT"; then + setup_rabbitmq "EXTERNAL_RABBITMQ_SERVER" +else + echo "Rabbitmq host is not responding" fi restart_services diff --git a/build/install/docker/.env b/build/install/docker/.env index 485649f886..1a43271ad8 100644 --- a/build/install/docker/.env +++ b/build/install/docker/.env @@ -99,7 +99,6 @@ DOCEDITOR_HOST=${CONTAINER_PREFIX}doceditor LOGIN_HOST=${CONTAINER_PREFIX}login HELTHCHECKS_HOST=${CONTAINER_PREFIX}healthchecks - REDIS_HOST=${CONTAINER_PREFIX}redis # proxy upstream environment # SERVICE_API_SYSTEM=${API_SYSTEM_HOST}:${SERVICE_PORT} diff --git a/build/install/docker/Dockerfile b/build/install/docker/Dockerfile index 605bc4a3eb..7fd95f323c 100644 --- a/build/install/docker/Dockerfile +++ b/build/install/docker/Dockerfile @@ -46,7 +46,10 @@ RUN apt-get -y update && \ npm && \ locale-gen en_US.UTF-8 && \ npm install --global yarn && \ - curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash - && \ + echo "deb [signed-by=/usr/share/keyrings/nodesource.gpg] https://deb.nodesource.com/node_18.x nodistro main" | tee /etc/apt/sources.list.d/nodesource.list && \ + curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --no-default-keyring --keyring gnupg-ring:/usr/share/keyrings/nodesource.gpg --import && \ + chmod 644 /usr/share/keyrings/nodesource.gpg && \ + apt-get -y update && \ apt-get install -y nodejs && \ rm -rf /var/lib/apt/lists/* RUN git clone -b main/community-server https://github.com/ONLYOFFICE/document-templates ${SRC_PATH}/ASC.Files/Server/DocStore diff --git a/build/install/docker/Dockerfile.app b/build/install/docker/Dockerfile.app index 4398ec0672..232d8a2961 100644 --- a/build/install/docker/Dockerfile.app +++ b/build/install/docker/Dockerfile.app @@ -31,7 +31,10 @@ RUN apt-get -y update && \ npm && \ locale-gen en_US.UTF-8 && \ npm install --global yarn && \ - curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash - && \ + echo "deb [signed-by=/usr/share/keyrings/nodesource.gpg] https://deb.nodesource.com/node_18.x nodistro main" | tee /etc/apt/sources.list.d/nodesource.list && \ + curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --no-default-keyring --keyring gnupg-ring:/usr/share/keyrings/nodesource.gpg --import && \ + chmod 644 /usr/share/keyrings/nodesource.gpg && \ + apt-get -y update && \ apt-get install -y nodejs && \ rm -rf /var/lib/apt/lists/* diff --git a/build/install/docker/config/nginx/templates/upstream.conf.template b/build/install/docker/config/nginx/templates/upstream.conf.template index 18d3bbb741..54e70d9b2a 100644 --- a/build/install/docker/config/nginx/templates/upstream.conf.template +++ b/build/install/docker/config/nginx/templates/upstream.conf.template @@ -2,82 +2,68 @@ resolver $DNS_NAMESERVER valid=30s; map $SERVICE_LOGIN $service_login { volatile; - $SERVICE_LOGIN $SERVICE_LOGIN; + "" 127.0.0.1:5011; + default $SERVICE_LOGIN; } map $SERVICE_DOCEDITOR $service_doceditor { volatile; - $SERVICE_DOCEDITOR $SERVICE_DOCEDITOR; -} - -map $SERVICE_CLIENT $service_client { - volatile; - $SERVICE_CLIENT $SERVICE_CLIENT; + "" 127.0.0.1:5013; + default $SERVICE_DOCEDITOR; } map $SERVICE_API_SYSTEM $service_api_system { volatile; - $SERVICE_API_SYSTEM $SERVICE_API_SYSTEM; + "" 127.0.0.1:5010; + default $SERVICE_API_SYSTEM; } map $SERVICE_BACKUP $service_backup { volatile; - $SERVICE_BACKUP $SERVICE_BACKUP; + "" 127.0.0.1:5012; + default $SERVICE_BACKUP; } map $SERVICE_FILES $service_files { volatile; - $SERVICE_FILES $SERVICE_FILES; -} - -map $SERVICE_FILES_SERVICES $service_files_services { - volatile; - $SERVICE_FILES_SERVICES $SERVICE_FILES_SERVICES; -} - -map $SERVICE_NOTIFY $service_notify { - volatile; - $SERVICE_NOTIFY $SERVICE_NOTIFY; + "" 127.0.0.1:5007; + default $SERVICE_FILES; } map $SERVICE_PEOPLE_SERVER $service_people_server { volatile; - $SERVICE_PEOPLE_SERVER $SERVICE_PEOPLE_SERVER; + "" 127.0.0.1:5004; + default $SERVICE_PEOPLE_SERVER; } map $SERVICE_SOCKET $service_socket { volatile; - $SERVICE_SOCKET $SERVICE_SOCKET; -} - -map $SERVICE_STUDIO_NOTIFY $service_studio_notify { - volatile; - $SERVICE_STUDIO_NOTIFY $SERVICE_STUDIO_NOTIFY; -} - -map $SERVICE_THUMBNAILS $service_thumbnails { - volatile; - $SERVICE_THUMBNAILS $SERVICE_THUMBNAILS; + "" 127.0.0.1:9899; + default $SERVICE_SOCKET; } map $SERVICE_API $service_api { volatile; - $SERVICE_API $SERVICE_API; + "" 127.0.0.1:5000; + default $SERVICE_API; } map $SERVICE_STUDIO $service_studio { volatile; - $SERVICE_STUDIO $SERVICE_STUDIO; + "" 127.0.0.1:5003; + default $SERVICE_STUDIO; } map $SERVICE_SSOAUTH $service_sso { volatile; - $SERVICE_SSOAUTH $SERVICE_SSOAUTH; + "" 127.0.0.1:9834; + default $SERVICE_SSOAUTH; } map $SERVICE_HELTHCHECKS $service_healthchecks { volatile; - $SERVICE_HELTHCHECKS $SERVICE_HELTHCHECKS; + "" 127.0.0.1:5033; + default $SERVICE_HELTHCHECKS; } map "$DOCUMENT_SERVER_URL_EXTERNAL" "$document_server" { @@ -85,3 +71,9 @@ map "$DOCUMENT_SERVER_URL_EXTERNAL" "$document_server" { default "$DOCUMENT_SERVER_URL_EXTERNAL"; "" "http://$DOCUMENT_CONTAINER_NAME"; } + +map $SERVICE_CLIENT $service_client { + volatile; + "" 127.0.0.1:5001; + default $SERVICE_CLIENT; +} diff --git a/build/install/docker/docspace.profiles.yml b/build/install/docker/docspace.profiles.yml index def430a81f..7e06fe719a 100644 --- a/build/install/docker/docspace.profiles.yml +++ b/build/install/docker/docspace.profiles.yml @@ -271,6 +271,9 @@ services: - SERVICE_HELTHCHECKS=${SERVICE_HELTHCHECKS} - DOCUMENT_CONTAINER_NAME=${DOCUMENT_CONTAINER_NAME} - DOCUMENT_SERVER_URL_EXTERNAL=${DOCUMENT_SERVER_URL_EXTERNAL} + - REDIS_CONTAINER_NAME=${REDIS_CONTAINER_NAME} + - REDIS_HOST=${REDIS_HOST} + - REDIS_PORT=${REDIS_PORT} - SERVICE_PORT=${SERVICE_PORT} volumes: - proxy_log:/var/log/nginx diff --git a/build/install/docker/docspace.yml b/build/install/docker/docspace.yml index 210f9967fc..2935cd5acd 100644 --- a/build/install/docker/docspace.yml +++ b/build/install/docker/docspace.yml @@ -220,7 +220,9 @@ services: - SERVICE_HELTHCHECKS=${SERVICE_HELTHCHECKS} - DOCUMENT_CONTAINER_NAME=${DOCUMENT_CONTAINER_NAME} - DOCUMENT_SERVER_URL_EXTERNAL=${DOCUMENT_SERVER_URL_EXTERNAL} + - REDIS_CONTAINER_NAME=${REDIS_CONTAINER_NAME} - REDIS_HOST=${REDIS_HOST} + - REDIS_PORT=${REDIS_PORT} - SERVICE_PORT=${SERVICE_PORT} volumes: - proxy_log:/var/log/nginx diff --git a/build/install/docker/prepare-nginx-proxy.sh b/build/install/docker/prepare-nginx-proxy.sh index 666dd206c9..fc0c38cb62 100755 --- a/build/install/docker/prepare-nginx-proxy.sh +++ b/build/install/docker/prepare-nginx-proxy.sh @@ -1,5 +1,7 @@ #!/bin/sh -REDIS_HOST=${REDIS_HOST:-"onlyoffice-redis"} +REDIS_HOST=${REDIS_HOST:-"${REDIS_CONTAINER_NAME}"} +REDIS_PORT=${REDIS_PORT:-"6379"} envsubst '$MAP_HASH_BUCKET_SIZE,$COUNT_WORKER_CONNECTIONS' < /etc/nginx/nginx.conf.template > /etc/nginx/nginx.conf -sed -i "s!redis_host = \"127.0.0.1\"!redis_host = \"${REDIS_HOST}\"!g" /etc/nginx/conf.d/onlyoffice.conf +sed -i "s~\(redis_host =\).*~\1 \"$REDIS_HOST\"~" /etc/nginx/conf.d/onlyoffice.conf +sed -i "s~\(redis_port =\).*~\1 $REDIS_PORT~" /etc/nginx/conf.d/onlyoffice.conf diff --git a/common/ASC.Core.Common/EF/Model/Notify/NotifyQueue.cs b/common/ASC.Core.Common/EF/Model/Notify/NotifyQueue.cs index bf398eb536..b90df48252 100644 --- a/common/ASC.Core.Common/EF/Model/Notify/NotifyQueue.cs +++ b/common/ASC.Core.Common/EF/Model/Notify/NotifyQueue.cs @@ -95,6 +95,9 @@ public static class NotifyQueueExtension .HasColumnName("creation_date") .HasColumnType("datetime"); + entity.HasIndex(e => e.CreationDate) + .HasDatabaseName("creation_date"); + entity.Property(e => e.Reciever) .HasColumnName("reciever") .HasColumnType("varchar(255)") @@ -155,6 +158,9 @@ public static class NotifyQueueExtension entity.Property(e => e.CreationDate).HasColumnName("creation_date"); + entity.HasIndex(e => e.CreationDate) + .HasDatabaseName("creation_date_notify_queue"); + entity.Property(e => e.Reciever) .HasColumnName("reciever") .HasMaxLength(255) diff --git a/common/ASC.Core.Common/Quota/ITenantQuotaFeatureChecker.cs b/common/ASC.Core.Common/Quota/ITenantQuotaFeatureChecker.cs index 44abf00e7c..3e27f67a83 100644 --- a/common/ASC.Core.Common/Quota/ITenantQuotaFeatureChecker.cs +++ b/common/ASC.Core.Common/Quota/ITenantQuotaFeatureChecker.cs @@ -34,6 +34,7 @@ public interface ITenantQuotaFeatureChecker public abstract class TenantQuotaFeatureChecker : ITenantQuotaFeatureChecker where T : TenantQuotaFeature where T1 : IComparable { + private static readonly object _lock = new object(); protected readonly ITenantQuotaFeatureStat _tenantQuotaFeatureStatistic; protected readonly TenantManager _tenantManager; @@ -64,11 +65,14 @@ public abstract class TenantQuotaFeatureChecker : ITenantQuotaFeatureChec protected void Check(TenantQuota quota, T1 newValue) { - var val = quota.GetFeature().Value; - - if (newValue.CompareTo(val) > 0) + lock (_lock) { - throw new TenantQuotaException(string.Format(Exception, val)); + var val = quota.GetFeature().Value; + + if (newValue.CompareTo(val) > 0) + { + throw new TenantQuotaException(string.Format(Exception, val)); + } } } } diff --git a/common/ASC.Data.Backup.Core/BackupFileUploadHandler.cs b/common/ASC.Data.Backup.Core/BackupFileUploadHandler.cs index 22fcfc8a9f..0fb194d6d8 100644 --- a/common/ASC.Data.Backup.Core/BackupFileUploadHandler.cs +++ b/common/ASC.Data.Backup.Core/BackupFileUploadHandler.cs @@ -35,56 +35,101 @@ public class BackupFileUploadHandler public async Task Invoke(HttpContext context, PermissionContext permissionContext, - BackupAjaxHandler backupAjaxHandler) + BackupAjaxHandler backupAjaxHandler, + ICache cache, + TenantManager tenantManager, + IConfiguration configuration) { - FileUploadResult result; + BackupFileUploadResult result = null; try { - if (context.Request.Form.Files.Count == 0) - { - result = Error("No files."); - } - if (!await permissionContext.CheckPermissionsAsync(SecutiryConstants.EditPortalSettings)) { - result = Error("Access denied."); + throw new ArgumentException("Access denied."); } - - var file = context.Request.Form.Files[0]; - - var filePath = await backupAjaxHandler.GetTmpFilePathAsync(); - - if (File.Exists(filePath)) + var tenantId = tenantManager.GetCurrentTenant().Id; + var path = await backupAjaxHandler.GetTmpFilePathAsync(); + if (context.Request.Query["Init"].ToString() == "true") { - File.Delete(filePath); - } + long.TryParse(context.Request.Query["totalSize"], out var size); + if (size <= 0) + { + throw new ArgumentException("Total size must be greater than 0."); + } - await using (var fileStream = File.Create(filePath)) + var maxSize = (await tenantManager.GetCurrentTenantQuotaAsync()).MaxTotalSize; + if (size > maxSize) + { + throw new ArgumentException(BackupResource.LargeBackup); + } + + try + { + if (File.Exists(path)) + { + File.Delete(path); + } + cache.Insert($"{tenantId} backupTotalSize", size.ToString(), TimeSpan.FromMinutes(10)); + + int.TryParse(configuration["files:uploader:chunk-size"], out var chunkSize); + chunkSize = chunkSize == 0 ? 10 * 1024 * 1024 : chunkSize; + + result = Success(chunkSize); + } + catch + { + throw new ArgumentException("Can't start upload."); + } + } + else { - await file.CopyToAsync(fileStream); - } + long.TryParse(cache.Get($"{tenantId} backupTotalSize"), out var totalSize); + if (totalSize <= 0) + { + throw new ArgumentException("Need init upload."); + } - result = Success(); + var file = context.Request.Form.Files[0]; + using var stream = file.OpenReadStream(); + + using var fs = File.Open(path, FileMode.Append); + await stream.CopyToAsync(fs); + + if (fs.Length >= totalSize) + { + cache.Remove($"{tenantId} backupTotalSize"); + result = Success(endUpload: true); + } + else + { + result = Success(); + } + } } catch (Exception error) { result = Error(error.Message); } - await context.Response.WriteAsync(System.Text.Json.JsonSerializer.Serialize(result)); + await context.Response.WriteAsync(System.Text.Json.JsonSerializer.Serialize(result, new System.Text.Json.JsonSerializerOptions() + { + DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull + })); } - private FileUploadResult Success() + private BackupFileUploadResult Success(int chunk = 0, bool endUpload = false) { - return new FileUploadResult + return new BackupFileUploadResult { - Success = true + Success = true, + ChunkSize = chunk, + EndUpload = endUpload }; } - private FileUploadResult Error(string messageFormat, params object[] args) + private BackupFileUploadResult Error(string messageFormat, params object[] args) { - return new FileUploadResult + return new BackupFileUploadResult { Success = false, Message = string.Format(messageFormat, args) @@ -92,6 +137,14 @@ public class BackupFileUploadHandler } } +internal class BackupFileUploadResult +{ + public bool Success { get; set; } + public string Message { get; set; } + public int ChunkSize { get; set; } + public bool EndUpload { get; set; } +} + public static class BackupFileUploadHandlerExtensions { public static IApplicationBuilder UseBackupFileUploadHandler(this IApplicationBuilder builder) diff --git a/common/ASC.Data.Backup.Core/BackupResource.Designer.cs b/common/ASC.Data.Backup.Core/BackupResource.Designer.cs index 234456afee..b2a5ad87f6 100644 --- a/common/ASC.Data.Backup.Core/BackupResource.Designer.cs +++ b/common/ASC.Data.Backup.Core/BackupResource.Designer.cs @@ -77,5 +77,14 @@ namespace ASC.Data.Backup.Core { return ResourceManager.GetString("ButtonSetPassword", resourceCulture); } } + + /// + /// Looks up a localized string similar to Backup is larger than the total size of the portal. + /// + internal static string LargeBackup { + get { + return ResourceManager.GetString("LargeBackup", resourceCulture); + } + } } } diff --git a/common/ASC.Data.Backup.Core/BackupResource.resx b/common/ASC.Data.Backup.Core/BackupResource.resx index 794f9913b7..6e1972226a 100644 --- a/common/ASC.Data.Backup.Core/BackupResource.resx +++ b/common/ASC.Data.Backup.Core/BackupResource.resx @@ -1,5 +1,64 @@  + @@ -53,10 +112,10 @@ 2.0 - System.Resources.ResXResourceReader, System.Windows.Forms, Version=6.0.2.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=6.0.2.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 The backup file is invalid. Please, use a file created in ONLYOFFICE v11.5 or later. @@ -64,4 +123,7 @@ Set Password + + Backup is larger than the total size of the portal + \ No newline at end of file diff --git a/common/ASC.Data.Backup.Core/GlobalUsings.cs b/common/ASC.Data.Backup.Core/GlobalUsings.cs index e515f7a4a8..8fdb3c00fa 100644 --- a/common/ASC.Data.Backup.Core/GlobalUsings.cs +++ b/common/ASC.Data.Backup.Core/GlobalUsings.cs @@ -33,6 +33,8 @@ global using System.Reflection; global using System.Security.Cryptography; global using System.ServiceModel; global using System.Text; + +global using System.Text.Json.Serialization; global using System.Text.RegularExpressions; global using System.Xml; global using System.Xml.Linq; @@ -82,7 +84,6 @@ global using ASC.Notify.Recipients; global using ASC.Security.Cryptography; global using ASC.Web.Core.PublicResources; global using ASC.Web.Core.Users; -global using ASC.Web.Core.Utility; global using ASC.Web.Core.WhiteLabel; global using ASC.Web.Files.Utils; global using ASC.Web.Studio.Core; diff --git a/common/ASC.Data.Storage/ZipOperators/ChunkZipWriteOperator.cs b/common/ASC.Data.Storage/ZipOperators/ChunkZipWriteOperator.cs index a597bf50f6..3f04994088 100644 --- a/common/ASC.Data.Storage/ZipOperators/ChunkZipWriteOperator.cs +++ b/common/ASC.Data.Storage/ZipOperators/ChunkZipWriteOperator.cs @@ -110,6 +110,7 @@ public class ChunkZipWriteOperator : IDataWriteOperator theMemStream.Position = 0; StoragePath = await _sessionHolder.UploadChunkAsync(_chunkedUploadSession, theMemStream, theMemStream.Length); + _sha.TransformBlock(buffer, 0, bytesRead, buffer, 0); } else { @@ -120,7 +121,6 @@ public class ChunkZipWriteOperator : IDataWriteOperator await theMemStream.CopyToAsync(_fileStream); _fileStream.Flush(); } - _sha.TransformBlock(buffer, 0, bytesRead, buffer, 0); } } if (last) diff --git a/common/ASC.SsoAuth/config/config.json b/common/ASC.SsoAuth/config/config.json index 540364fb9e..17c68a30e2 100644 --- a/common/ASC.SsoAuth/config/config.json +++ b/common/ASC.SsoAuth/config/config.json @@ -3,7 +3,7 @@ "name": "Onlyoffice Single Sign-On handler", "port": 9834, "appsettings": "../../../config", - "machinekey": "1123askdasjklasbnd", + "machinekey": "1123askdasjklasbnd", "environment": "Development", "logName": "web.sso.%DATE%.log", "contact": { @@ -22,8 +22,8 @@ "baseUrl": "http://localhost", "port": 80, "ssoUrl": "/ssologin.ashx", - "authUrl": "/Auth.aspx" - } + "authUrl": "/login" + } }, "routes": { "login": "/login", @@ -62,6 +62,6 @@ "data": "../../Data", "image-path": "images", "rebranding": "rebranding", - "https":"certs" + "https": "certs" } -} \ No newline at end of file +} diff --git a/common/ASC.SsoAuth/config/production.json b/common/ASC.SsoAuth/config/production.json index 1b3b640e1b..f4e937cde2 100644 --- a/common/ASC.SsoAuth/config/production.json +++ b/common/ASC.SsoAuth/config/production.json @@ -8,8 +8,8 @@ "logSamlData": false, "portal": { "ssoUrl": "/ssologin.ashx", - "authUrl": "/Auth.aspx" - } + "authUrl": "/login" + } }, "routes": { "login": "/sso/login", @@ -29,4 +29,4 @@ "maxFiles": "30d" } } -} \ No newline at end of file +} diff --git a/common/services/ASC.Data.Backup/GlobalUsings.cs b/common/services/ASC.Data.Backup/GlobalUsings.cs index 90030ba42a..c41d6ce81c 100644 --- a/common/services/ASC.Data.Backup/GlobalUsings.cs +++ b/common/services/ASC.Data.Backup/GlobalUsings.cs @@ -42,10 +42,10 @@ global using ASC.Files.Core.EF; global using ASC.Web.Api.Routing; global using ASC.Web.Studio.Core.Backup; global using ASC.Web.Studio.Core.Notify; -global using ASC.Web.Studio.Utility; -global using Microsoft.AspNetCore.Authorization; + global using Autofac; - + +global using Microsoft.AspNetCore.Authorization; global using Microsoft.AspNetCore.Http.Features; global using Microsoft.AspNetCore.Mvc; global using Microsoft.AspNetCore.Server.Kestrel.Core; diff --git a/config/appsettings.json b/config/appsettings.json index a815022f8b..7270f169ec 100644 --- a/config/appsettings.json +++ b/config/appsettings.json @@ -285,7 +285,17 @@ "documentation-email": "documentation@onlyoffice.com", "max-upload-size": 5242880, "zendesk-key": "", - "samesite": "" + "samesite": "", + "sso": { + "saml": { + "login":{ + "url" :"/sso/login" + }, + "logout":{ + "url" :"/sso/slo" + } + } + } }, "ConnectionStrings": { "default": { diff --git a/config/backup.json b/config/backup.json index f5b5ad0ab7..e2cce41629 100644 --- a/config/backup.json +++ b/config/backup.json @@ -16,6 +16,7 @@ { "Period":"00:15:00" }, - "ChunkSize": 20971520 + "ChunkSize": 20971520, + "MaxLocalSize": 1048576000 } } \ No newline at end of file diff --git a/config/nginx/onlyoffice.conf b/config/nginx/onlyoffice.conf index e3393714d8..e9730ea666 100644 --- a/config/nginx/onlyoffice.conf +++ b/config/nginx/onlyoffice.conf @@ -91,30 +91,6 @@ server { proxy_set_header Proxy ""; - set $csp ""; - access_by_lua ' - local key = string.format("csp:%s",ngx.var.host) - local redis = require "resty.redis" - local red = redis:new() - local redis_host = "127.0.0.1" - local redis_port = 6379 - - red:set_timeout(1000) -- 1 second - - local ok, err = red:connect(redis_host, redis_port) - if not ok then - ngx.log(ngx.ERR, "failed to connect to redis: ", err) - end - - local csp, err = red:hget(key, "data") - - if csp == ngx.null then - ngx.log(ngx.ERR, "failed to get redis key: ", err) - else - ngx.header.Content_Security_Policy = csp - end - '; - location ~* ^/ds-vpath/ { rewrite /ds-vpath/(.*) /$1 break; @@ -136,6 +112,31 @@ server { } location / { + set $csp ""; + access_by_lua ' + if ngx.req.get_method() == "GET" then + local key = string.format("csp:%s",ngx.var.host) + local redis = require "resty.redis" + local red = redis:new() + local redis_host = "127.0.0.1" + local redis_port = 6379 + + red:set_timeout(1000) -- 1 second + + local ok, err = red:connect(redis_host, redis_port) + if not ok then + ngx.log(ngx.ERR, "failed to connect to redis: ", err) + end + + local csp, err = red:hget(key, "data") + + if csp == ngx.null then + ngx.log(ngx.ERR, "failed to get redis key: ", err) + else + ngx.header.Content_Security_Policy = csp + end + end + '; proxy_pass http://127.0.0.1:5001; location ~* /(manifest.json|sw.js|appIcon(.)*\.png|icon.svg|bg-error.png|favicon.ico|debuginfo.md) { try_files /$basename /index.html =404; diff --git a/i18next/client.babel b/i18next/client.babel index 33bfdfab30..8532d09301 100644 --- a/i18next/client.babel +++ b/i18next/client.babel @@ -22545,6 +22545,122 @@ + + ErrorDeactivatedText + + + + + + az-Latn-AZ + false + + + bg-BG + false + + + cs-CZ + false + + + de-DE + false + + + el-GR + false + + + en-US + false + + + es-ES + false + + + fi-FI + false + + + fr-FR + false + + + hy-AM + false + + + it-IT + false + + + ja-JP + false + + + ko-KR + false + + + lo-LA + false + + + lv-LV + false + + + nl-NL + false + + + pl-PL + false + + + pt-BR + false + + + pt-PT + false + + + ro-RO + false + + + ru-RU + false + + + sk-SK + false + + + sl-SI + false + + + tr-TR + false + + + uk-UA + false + + + vi-VN + false + + + zh-CN + false + + + ErrorEmptyResponse diff --git a/i18next/common.babel b/i18next/common.babel index c778d5d402..4814d13d7c 100644 --- a/i18next/common.babel +++ b/i18next/common.babel @@ -27862,6 +27862,122 @@ + + SignInWithMicrosoft + + + + + + az-Latn-AZ + false + + + bg-BG + false + + + cs-CZ + false + + + de-DE + false + + + el-GR + false + + + en-US + false + + + es-ES + false + + + fi-FI + false + + + fr-FR + false + + + hy-AM + false + + + it-IT + false + + + ja-JP + false + + + ko-KR + false + + + lo-LA + false + + + lv-LV + false + + + nl-NL + false + + + pl-PL + false + + + pt-BR + false + + + pt-PT + false + + + ro-RO + false + + + ru-RU + false + + + sk-SK + false + + + sl-SI + false + + + tr-TR + false + + + uk-UA + false + + + vi-VN + false + + + zh-CN + false + + + SignInWithSso diff --git a/migrations/mysql/SaaS/MigrationContext/20230901122723_MigrationContext_Upgrade2.Designer.cs b/migrations/mysql/SaaS/MigrationContext/20230901122723_MigrationContext_Upgrade2.Designer.cs new file mode 100644 index 0000000000..ff121cffa3 --- /dev/null +++ b/migrations/mysql/SaaS/MigrationContext/20230901122723_MigrationContext_Upgrade2.Designer.cs @@ -0,0 +1,7155 @@ +// +using System; +using ASC.Migrations.Core; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; + +#nullable disable + +namespace ASC.Migrations.MySql.SaaS.Migrations +{ + [DbContext(typeof(MigrationContext))] + [Migration("20230901122723_MigrationContext_Upgrade2")] + partial class MigrationContext_Upgrade2 + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "7.0.5") + .HasAnnotation("Relational:MaxIdentifierLength", 64); + + modelBuilder.Entity("ASC.Core.Common.EF.Acl", b => + { + b.Property("TenantId") + .HasColumnType("int") + .HasColumnName("tenant"); + + b.Property("Subject") + .HasColumnType("varchar(38)") + .HasColumnName("subject") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("Action") + .HasColumnType("varchar(38)") + .HasColumnName("action") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("Object") + .ValueGeneratedOnAdd() + .HasColumnType("varchar(255)") + .HasColumnName("object") + .HasDefaultValueSql("''") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("AceType") + .HasColumnType("int") + .HasColumnName("acetype"); + + b.HasKey("TenantId", "Subject", "Action", "Object") + .HasName("PRIMARY"); + + b.ToTable("core_acl", (string)null); + + b.HasAnnotation("MySql:CharSet", "utf8"); + + b.HasData( + new + { + TenantId = -1, + Subject = "5d5b7260-f7f7-49f1-a1c9-95fbb6a12604", + Action = "ef5e6790-f346-4b6e-b662-722bc28cb0db", + Object = "", + AceType = 0 + }, + new + { + TenantId = -1, + Subject = "5d5b7260-f7f7-49f1-a1c9-95fbb6a12604", + Action = "f11e8f3f-46e6-4e55-90e3-09c22ec565bd", + Object = "", + AceType = 0 + }, + new + { + TenantId = -1, + Subject = "c5cc67d1-c3e8-43c0-a3ad-3928ae3e5b5e", + Action = "088d5940-a80f-4403-9741-d610718ce95c", + Object = "", + AceType = 0 + }, + new + { + TenantId = -1, + Subject = "c5cc67d1-c3e8-43c0-a3ad-3928ae3e5b5e", + Action = "08d66144-e1c9-4065-9aa1-aa4bba0a7bc8", + Object = "", + AceType = 0 + }, + new + { + TenantId = -1, + Subject = "abef62db-11a8-4673-9d32-ef1d8af19dc0", + Action = "08d75c97-cf3f-494b-90d1-751c941fe2dd", + Object = "", + AceType = 0 + }, + new + { + TenantId = -1, + Subject = "abef62db-11a8-4673-9d32-ef1d8af19dc0", + Action = "0d1f72a8-63da-47ea-ae42-0900e4ac72a9", + Object = "", + AceType = 0 + }, + new + { + TenantId = -1, + Subject = "abef62db-11a8-4673-9d32-ef1d8af19dc0", + Action = "13e30b51-5b4d-40a5-8575-cb561899eeb1", + Object = "", + AceType = 0 + }, + new + { + TenantId = -1, + Subject = "abef62db-11a8-4673-9d32-ef1d8af19dc0", + Action = "19f658ae-722b-4cd8-8236-3ad150801d96", + Object = "", + AceType = 0 + }, + new + { + TenantId = -1, + Subject = "abef62db-11a8-4673-9d32-ef1d8af19dc0", + Action = "2c6552b3-b2e0-4a00-b8fd-13c161e337b1", + Object = "", + AceType = 0 + }, + new + { + TenantId = -1, + Subject = "c5cc67d1-c3e8-43c0-a3ad-3928ae3e5b5e", + Action = "388c29d3-c662-4a61-bf47-fc2f7094224a", + Object = "", + AceType = 0 + }, + new + { + TenantId = -1, + Subject = "abef62db-11a8-4673-9d32-ef1d8af19dc0", + Action = "40bf31f4-3132-4e76-8d5c-9828a89501a3", + Object = "", + AceType = 0 + }, + new + { + TenantId = -1, + Subject = "abef62db-11a8-4673-9d32-ef1d8af19dc0", + Action = "49ae8915-2b30-4348-ab74-b152279364fb", + Object = "", + AceType = 0 + }, + new + { + TenantId = -1, + Subject = "c5cc67d1-c3e8-43c0-a3ad-3928ae3e5b5e", + Action = "63e9f35f-6bb5-4fb1-afaa-e4c2f4dec9bd", + Object = "", + AceType = 0 + }, + new + { + TenantId = -1, + Subject = "c5cc67d1-c3e8-43c0-a3ad-3928ae3e5b5e", + Action = "9018c001-24c2-44bf-a1db-d1121a570e74", + Object = "", + AceType = 0 + }, + new + { + TenantId = -1, + Subject = "abef62db-11a8-4673-9d32-ef1d8af19dc0", + Action = "948ad738-434b-4a88-8e38-7569d332910a", + Object = "", + AceType = 0 + }, + new + { + TenantId = -1, + Subject = "abef62db-11a8-4673-9d32-ef1d8af19dc0", + Action = "9d75a568-52aa-49d8-ad43-473756cd8903", + Object = "", + AceType = 0 + }, + new + { + TenantId = -1, + Subject = "c5cc67d1-c3e8-43c0-a3ad-3928ae3e5b5e", + Action = "a362fe79-684e-4d43-a599-65bc1f4e167f", + Object = "", + AceType = 0 + }, + new + { + TenantId = -1, + Subject = "c5cc67d1-c3e8-43c0-a3ad-3928ae3e5b5e", + Action = "c426c349-9ad4-47cd-9b8f-99fc30675951", + Object = "", + AceType = 0 + }, + new + { + TenantId = -1, + Subject = "c5cc67d1-c3e8-43c0-a3ad-3928ae3e5b5e", + Action = "d11ebcb9-0e6e-45e6-a6d0-99c41d687598", + Object = "", + AceType = 0 + }, + new + { + TenantId = -1, + Subject = "c5cc67d1-c3e8-43c0-a3ad-3928ae3e5b5e", + Action = "d1f3b53d-d9e2-4259-80e7-d24380978395", + Object = "", + AceType = 0 + }, + new + { + TenantId = -1, + Subject = "abef62db-11a8-4673-9d32-ef1d8af19dc0", + Action = "d49f4e30-da10-4b39-bc6d-b41ef6e039d3", + Object = "", + AceType = 0 + }, + new + { + TenantId = -1, + Subject = "abef62db-11a8-4673-9d32-ef1d8af19dc0", + Action = "d852b66f-6719-45e1-8657-18f0bb791690", + Object = "", + AceType = 0 + }, + new + { + TenantId = -1, + Subject = "c5cc67d1-c3e8-43c0-a3ad-3928ae3e5b5e", + Action = "e0759a42-47f0-4763-a26a-d5aa665bec35", + Object = "", + AceType = 0 + }, + new + { + TenantId = -1, + Subject = "c5cc67d1-c3e8-43c0-a3ad-3928ae3e5b5e", + Action = "e37239bd-c5b5-4f1e-a9f8-3ceeac209615", + Object = "", + AceType = 0 + }, + new + { + TenantId = -1, + Subject = "c5cc67d1-c3e8-43c0-a3ad-3928ae3e5b5e", + Action = "fbc37705-a04c-40ad-a68c-ce2f0423f397", + Object = "", + AceType = 0 + }, + new + { + TenantId = -1, + Subject = "c5cc67d1-c3e8-43c0-a3ad-3928ae3e5b5e", + Action = "fcac42b8-9386-48eb-a938-d19b3c576912", + Object = "", + AceType = 0 + }, + new + { + TenantId = -1, + Subject = "ba74ca02-873f-43dc-8470-8620c156bc67", + Action = "13e30b51-5b4d-40a5-8575-cb561899eeb1", + Object = "", + AceType = 0 + }, + new + { + TenantId = -1, + Subject = "ba74ca02-873f-43dc-8470-8620c156bc67", + Action = "49ae8915-2b30-4348-ab74-b152279364fb", + Object = "", + AceType = 0 + }, + new + { + TenantId = -1, + Subject = "ba74ca02-873f-43dc-8470-8620c156bc67", + Action = "63e9f35f-6bb5-4fb1-afaa-e4c2f4dec9bd", + Object = "", + AceType = 0 + }, + new + { + TenantId = -1, + Subject = "ba74ca02-873f-43dc-8470-8620c156bc67", + Action = "9018c001-24c2-44bf-a1db-d1121a570e74", + Object = "", + AceType = 0 + }, + new + { + TenantId = -1, + Subject = "ba74ca02-873f-43dc-8470-8620c156bc67", + Action = "d1f3b53d-d9e2-4259-80e7-d24380978395", + Object = "", + AceType = 0 + }, + new + { + TenantId = -1, + Subject = "ba74ca02-873f-43dc-8470-8620c156bc67", + Action = "e0759a42-47f0-4763-a26a-d5aa665bec35", + Object = "", + AceType = 0 + }, + new + { + TenantId = -1, + Subject = "ba74ca02-873f-43dc-8470-8620c156bc67", + Action = "e37239bd-c5b5-4f1e-a9f8-3ceeac209615", + Object = "", + AceType = 0 + }, + new + { + TenantId = -1, + Subject = "ba74ca02-873f-43dc-8470-8620c156bc67", + Action = "f11e88d7-f185-4372-927c-d88008d2c483", + Object = "", + AceType = 0 + }, + new + { + TenantId = -1, + Subject = "ba74ca02-873f-43dc-8470-8620c156bc67", + Action = "f11e8f3f-46e6-4e55-90e3-09c22ec565bd", + Object = "", + AceType = 0 + }, + new + { + TenantId = -1, + Subject = "bba32183-a14d-48ed-9d39-c6b4d8925fbf", + Action = "00e7dfc5-ac49-4fd3-a1d6-98d84e877ac4", + Object = "", + AceType = 0 + }, + new + { + TenantId = -1, + Subject = "bba32183-a14d-48ed-9d39-c6b4d8925fbf", + Action = "14be970f-7af5-4590-8e81-ea32b5f7866d", + Object = "", + AceType = 0 + }, + new + { + TenantId = -1, + Subject = "bba32183-a14d-48ed-9d39-c6b4d8925fbf", + Action = "18ecc94d-6afa-4994-8406-aee9dff12ce2", + Object = "", + AceType = 0 + }, + new + { + TenantId = -1, + Subject = "bba32183-a14d-48ed-9d39-c6b4d8925fbf", + Action = "298530eb-435e-4dc6-a776-9abcd95c70e9", + Object = "", + AceType = 0 + }, + new + { + TenantId = -1, + Subject = "bba32183-a14d-48ed-9d39-c6b4d8925fbf", + Action = "430eaf70-1886-483c-a746-1a18e3e6bb63", + Object = "", + AceType = 0 + }, + new + { + TenantId = -1, + Subject = "bba32183-a14d-48ed-9d39-c6b4d8925fbf", + Action = "557d6503-633b-4490-a14c-6473147ce2b3", + Object = "", + AceType = 0 + }, + new + { + TenantId = -1, + Subject = "bba32183-a14d-48ed-9d39-c6b4d8925fbf", + Action = "724cbb75-d1c9-451e-bae0-4de0db96b1f7", + Object = "", + AceType = 0 + }, + new + { + TenantId = -1, + Subject = "bba32183-a14d-48ed-9d39-c6b4d8925fbf", + Action = "7cb5c0d1-d254-433f-abe3-ff23373ec631", + Object = "", + AceType = 0 + }, + new + { + TenantId = -1, + Subject = "bba32183-a14d-48ed-9d39-c6b4d8925fbf", + Action = "91b29dcd-9430-4403-b17a-27d09189be88", + Object = "", + AceType = 0 + }, + new + { + TenantId = -1, + Subject = "bba32183-a14d-48ed-9d39-c6b4d8925fbf", + Action = "a18480a4-6d18-4c71-84fa-789888791f45", + Object = "", + AceType = 0 + }, + new + { + TenantId = -1, + Subject = "bba32183-a14d-48ed-9d39-c6b4d8925fbf", + Action = "b630d29b-1844-4bda-bbbe-cf5542df3559", + Object = "", + AceType = 0 + }, + new + { + TenantId = -1, + Subject = "bba32183-a14d-48ed-9d39-c6b4d8925fbf", + Action = "c62a9e8d-b24c-4513-90aa-7ff0f8ba38eb", + Object = "", + AceType = 0 + }, + new + { + TenantId = -1, + Subject = "bba32183-a14d-48ed-9d39-c6b4d8925fbf", + Action = "d7cdb020-288b-41e5-a857-597347618533", + Object = "", + AceType = 0 + }, + new + { + TenantId = -1, + Subject = "bba32183-a14d-48ed-9d39-c6b4d8925fbf", + Action = "662f3db7-9bc8-42cf-84da-2765f563e9b0", + Object = "", + AceType = 0 + }, + new + { + TenantId = -1, + Subject = "712d9ec3-5d2b-4b13-824f-71f00191dcca", + Action = "e0759a42-47f0-4763-a26a-d5aa665bec35", + Object = "", + AceType = 0 + }, + new + { + TenantId = -1, + Subject = "bba32183-a14d-48ed-9d39-c6b4d8925fbf", + Action = "0d68b142-e20a-446e-a832-0d6b0b65a164", + Object = "", + AceType = 0 + }, + new + { + TenantId = -1, + Subject = "c5cc67d1-c3e8-43c0-a3ad-3928ae3e5b5e", + Action = "6f05c382-8bca-4469-9424-c807a98c40d7", + Object = "", + AceType = 0 + }, + new + { + TenantId = -1, + Subject = "c5cc67d1-c3e8-43c0-a3ad-3928ae3e5b5e", + Action = "77777777-32ae-425f-99b5-83176061d1ae", + Object = "ASC.Web.Core.WebItemSecurity+WebItemSecurityObject|1e04460243b54d7982f3fd6208a11960", + AceType = 0 + }, + new + { + TenantId = -1, + Subject = "c5cc67d1-c3e8-43c0-a3ad-3928ae3e5b5e", + Action = "77777777-32ae-425f-99b5-83176061d1ae", + Object = "ASC.Web.Core.WebItemSecurity+WebItemSecurityObject|6743007c6f954d208c88a8601ce5e76d", + AceType = 0 + }, + new + { + TenantId = -1, + Subject = "c5cc67d1-c3e8-43c0-a3ad-3928ae3e5b5e", + Action = "77777777-32ae-425f-99b5-83176061d1ae", + Object = "ASC.Web.Core.WebItemSecurity+WebItemSecurityObject|e67be73df9ae4ce18fec1880cb518cb4", + AceType = 0 + }, + new + { + TenantId = -1, + Subject = "c5cc67d1-c3e8-43c0-a3ad-3928ae3e5b5e", + Action = "77777777-32ae-425f-99b5-83176061d1ae", + Object = "ASC.Web.Core.WebItemSecurity+WebItemSecurityObject|ea942538e68e49079394035336ee0ba8", + AceType = 1 + }, + new + { + TenantId = -1, + Subject = "c5cc67d1-c3e8-43c0-a3ad-3928ae3e5b5e", + Action = "77777777-32ae-425f-99b5-83176061d1ae", + Object = "ASC.Web.Core.WebItemSecurity+WebItemSecurityObject|32d24cb57ece46069c9419216ba42086", + AceType = 0 + }, + new + { + TenantId = -1, + Subject = "c5cc67d1-c3e8-43c0-a3ad-3928ae3e5b5e", + Action = "77777777-32ae-425f-99b5-83176061d1ae", + Object = "ASC.Web.Core.WebItemSecurity+WebItemSecurityObject|bf88953e3c434850a3fbb1e43ad53a3e", + AceType = 0 + }, + new + { + TenantId = -1, + Subject = "c5cc67d1-c3e8-43c0-a3ad-3928ae3e5b5e", + Action = "77777777-32ae-425f-99b5-83176061d1ae", + Object = "ASC.Web.Core.WebItemSecurity+WebItemSecurityObject|2a9230378b2d487b9a225ac0918acf3f", + AceType = 0 + }, + new + { + TenantId = -1, + Subject = "c5cc67d1-c3e8-43c0-a3ad-3928ae3e5b5e", + Action = "77777777-32ae-425f-99b5-83176061d1ae", + Object = "ASC.Web.Core.WebItemSecurity+WebItemSecurityObject|f4d98afdd336433287783c6945c81ea0", + AceType = 0 + }, + new + { + TenantId = -1, + Subject = "c5cc67d1-c3e8-43c0-a3ad-3928ae3e5b5e", + Action = "77777777-32ae-425f-99b5-83176061d1ae", + Object = "ASC.Web.Core.WebItemSecurity+WebItemSecurityObject|28b10049dd204f54b986873bc14ccfc7", + AceType = 1 + }, + new + { + TenantId = -1, + Subject = "c5cc67d1-c3e8-43c0-a3ad-3928ae3e5b5e", + Action = "77777777-32ae-425f-99b5-83176061d1ae", + Object = "ASC.Web.Core.WebItemSecurity+WebItemSecurityObject|3cfd481b46f24a4ab55cb8c0c9def02c", + AceType = 1 + }, + new + { + TenantId = -1, + Subject = "c5cc67d1-c3e8-43c0-a3ad-3928ae3e5b5e", + Action = "77777777-32ae-425f-99b5-83176061d1ae", + Object = "ASC.Web.Core.WebItemSecurity+WebItemSecurityObject|6a598c7491ae437da5f4ad339bd11bb2", + AceType = 1 + }, + new + { + TenantId = -1, + Subject = "c5cc67d1-c3e8-43c0-a3ad-3928ae3e5b5e", + Action = "77777777-32ae-425f-99b5-83176061d1ae", + Object = "ASC.Web.Core.WebItemSecurity+WebItemSecurityObject|742cf945cbbc4a5782d61600a12cf8ca", + AceType = 1 + }, + new + { + TenantId = -1, + Subject = "c5cc67d1-c3e8-43c0-a3ad-3928ae3e5b5e", + Action = "77777777-32ae-425f-99b5-83176061d1ae", + Object = "ASC.Web.Core.WebItemSecurity+WebItemSecurityObject|853b6eb973ee438d9b098ffeedf36234", + AceType = 1 + }, + new + { + TenantId = -1, + Subject = "c5cc67d1-c3e8-43c0-a3ad-3928ae3e5b5e", + Action = "77777777-32ae-425f-99b5-83176061d1ae", + Object = "ASC.Web.Core.WebItemSecurity+WebItemSecurityObject|46cfa73af32046cf8d5bcd82e1d67f26", + AceType = 0 + }, + new + { + TenantId = -1, + Subject = "c5cc67d1-c3e8-43c0-a3ad-3928ae3e5b5e", + Action = "77777777-32ae-425f-99b5-83176061d1ae", + Object = "ASC.Web.Core.WebItemSecurity+WebItemSecurityObject|37620ae5c40b45ce855a39dd7d76a1fa", + AceType = 0 + }); + }); + + modelBuilder.Entity("ASC.Core.Common.EF.DbGroup", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("varchar(38)") + .HasColumnName("id") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("CategoryId") + .HasColumnType("varchar(38)") + .HasColumnName("categoryid") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("LastModified") + .HasColumnType("timestamp") + .HasColumnName("last_modified"); + + b.Property("Name") + .IsRequired() + .HasColumnType("varchar(128)") + .HasColumnName("name") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("ParentId") + .HasColumnType("varchar(38)") + .HasColumnName("parentid") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("Removed") + .ValueGeneratedOnAdd() + .HasColumnType("tinyint(1)") + .HasColumnName("removed") + .HasDefaultValueSql("'0'"); + + b.Property("Sid") + .HasColumnType("varchar(512)") + .HasColumnName("sid") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("TenantId") + .HasColumnType("int") + .HasColumnName("tenant"); + + b.HasKey("Id"); + + b.HasIndex("LastModified") + .HasDatabaseName("last_modified"); + + b.HasIndex("TenantId", "ParentId") + .HasDatabaseName("parentid"); + + b.ToTable("core_group", (string)null); + + b.HasAnnotation("MySql:CharSet", "utf8"); + }); + + modelBuilder.Entity("ASC.Core.Common.EF.DbQuota", b => + { + b.Property("TenantId") + .HasColumnType("int") + .HasColumnName("tenant"); + + b.Property("Description") + .HasColumnType("varchar(128)") + .HasColumnName("description") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("Features") + .HasColumnType("text") + .HasColumnName("features"); + + b.Property("Name") + .HasColumnType("varchar(128)") + .HasColumnName("name") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("Price") + .ValueGeneratedOnAdd() + .HasColumnType("decimal(10,2)") + .HasColumnName("price") + .HasDefaultValueSql("'0.00'"); + + b.Property("ProductId") + .HasColumnType("varchar(128)") + .HasColumnName("product_id") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("Visible") + .ValueGeneratedOnAdd() + .HasColumnType("tinyint(1)") + .HasColumnName("visible") + .HasDefaultValueSql("'0'"); + + b.HasKey("TenantId") + .HasName("PRIMARY"); + + b.ToTable("tenants_quota", (string)null); + + b.HasAnnotation("MySql:CharSet", "utf8"); + + b.HasData( + new + { + TenantId = -1, + Features = "trial,audit,ldap,sso,whitelabel,thirdparty,restore,oauth,total_size:107374182400,file_size:100,manager:1", + Name = "trial", + Price = 0m, + Visible = false + }, + new + { + TenantId = -2, + Features = "audit,ldap,sso,whitelabel,thirdparty,restore,oauth,contentsearch,total_size:107374182400,file_size:1024,manager:1", + Name = "admin", + Price = 15m, + ProductId = "1002", + Visible = true + }, + new + { + TenantId = -3, + Features = "free,total_size:2147483648,manager:3,room:12", + Name = "startup", + Price = 0m, + Visible = false + }, + new + { + TenantId = -4, + Features = "total_size:1073741824", + Name = "disk", + Price = 0m, + ProductId = "1004", + Visible = false + }, + new + { + TenantId = -5, + Features = "manager:1", + Name = "admin1", + Price = 0m, + ProductId = "1005", + Visible = false + }, + new + { + TenantId = -6, + Features = "audit,ldap,sso,whitelabel,thirdparty,restore,oauth,contentsearch,file_size:1024", + Name = "subscription", + Price = 0m, + ProductId = "1001", + Visible = false + }, + new + { + TenantId = -7, + Features = "non-profit,audit,ldap,sso,thirdparty,restore,oauth,contentsearch,total_size:2147483648,file_size:1024,manager:20", + Name = "nonprofit", + Price = 0m, + Visible = false + }); + }); + + modelBuilder.Entity("ASC.Core.Common.EF.DbQuotaRow", b => + { + b.Property("TenantId") + .HasColumnType("int") + .HasColumnName("tenant"); + + b.Property("UserId") + .HasColumnType("char(36)") + .HasColumnName("user_id") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("Path") + .HasColumnType("varchar(255)") + .HasColumnName("path") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("Counter") + .ValueGeneratedOnAdd() + .HasColumnType("bigint") + .HasColumnName("counter") + .HasDefaultValueSql("'0'"); + + b.Property("LastModified") + .HasColumnType("timestamp") + .HasColumnName("last_modified"); + + b.Property("Tag") + .HasColumnType("varchar(1024)") + .HasColumnName("tag") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.HasKey("TenantId", "UserId", "Path") + .HasName("PRIMARY"); + + b.HasIndex("LastModified") + .HasDatabaseName("last_modified"); + + b.ToTable("tenants_quotarow", (string)null); + + b.HasAnnotation("MySql:CharSet", "utf8"); + }); + + modelBuilder.Entity("ASC.Core.Common.EF.DbSubscriptionMethod", b => + { + b.Property("TenantId") + .HasColumnType("int") + .HasColumnName("tenant"); + + b.Property("Source") + .HasColumnType("varchar(38)") + .HasColumnName("source") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("Action") + .HasColumnType("varchar(128)") + .HasColumnName("action") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("Recipient") + .HasColumnType("varchar(38)") + .HasColumnName("recipient") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("Sender") + .IsRequired() + .HasColumnType("varchar(1024)") + .HasColumnName("sender") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.HasKey("TenantId", "Source", "Action", "Recipient") + .HasName("PRIMARY"); + + b.ToTable("core_subscriptionmethod", (string)null); + + b.HasAnnotation("MySql:CharSet", "utf8"); + + b.HasData( + new + { + TenantId = -1, + Source = "asc.web.studio", + Action = "send_whats_new", + Recipient = "c5cc67d1-c3e8-43c0-a3ad-3928ae3e5b5e", + Sender = "email.sender" + }, + new + { + TenantId = -1, + Source = "6504977c-75af-4691-9099-084d3ddeea04", + Action = "new feed", + Recipient = "c5cc67d1-c3e8-43c0-a3ad-3928ae3e5b5e", + Sender = "email.sender|messanger.sender" + }, + new + { + TenantId = -1, + Source = "6a598c74-91ae-437d-a5f4-ad339bd11bb2", + Action = "new post", + Recipient = "c5cc67d1-c3e8-43c0-a3ad-3928ae3e5b5e", + Sender = "email.sender|messanger.sender" + }, + new + { + TenantId = -1, + Source = "853b6eb9-73ee-438d-9b09-8ffeedf36234", + Action = "new topic in forum", + Recipient = "c5cc67d1-c3e8-43c0-a3ad-3928ae3e5b5e", + Sender = "email.sender|messanger.sender" + }, + new + { + TenantId = -1, + Source = "9d51954f-db9b-4aed-94e3-ed70b914e101", + Action = "new photo uploaded", + Recipient = "c5cc67d1-c3e8-43c0-a3ad-3928ae3e5b5e", + Sender = "email.sender|messanger.sender" + }, + new + { + TenantId = -1, + Source = "28b10049-dd20-4f54-b986-873bc14ccfc7", + Action = "new bookmark created", + Recipient = "c5cc67d1-c3e8-43c0-a3ad-3928ae3e5b5e", + Sender = "email.sender|messanger.sender" + }, + new + { + TenantId = -1, + Source = "742cf945-cbbc-4a57-82d6-1600a12cf8ca", + Action = "new wiki page", + Recipient = "c5cc67d1-c3e8-43c0-a3ad-3928ae3e5b5e", + Sender = "email.sender|messanger.sender" + }, + new + { + TenantId = -1, + Source = "37620ae5-c40b-45ce-855a-39dd7d76a1fa", + Action = "BirthdayReminder", + Recipient = "abef62db-11a8-4673-9d32-ef1d8af19dc0", + Sender = "email.sender|messanger.sender" + }, + new + { + TenantId = -1, + Source = "6fe286a4-479e-4c25-a8d9-0156e332b0c0", + Action = "sharedocument", + Recipient = "c5cc67d1-c3e8-43c0-a3ad-3928ae3e5b5e", + Sender = "email.sender|messanger.sender" + }, + new + { + TenantId = -1, + Source = "6fe286a4-479e-4c25-a8d9-0156e332b0c0", + Action = "sharefolder", + Recipient = "c5cc67d1-c3e8-43c0-a3ad-3928ae3e5b5e", + Sender = "email.sender|messanger.sender" + }, + new + { + TenantId = -1, + Source = "6fe286a4-479e-4c25-a8d9-0156e332b0c0", + Action = "updatedocument", + Recipient = "c5cc67d1-c3e8-43c0-a3ad-3928ae3e5b5e", + Sender = "email.sender|messanger.sender" + }, + new + { + TenantId = -1, + Source = "6045b68c-2c2e-42db-9e53-c272e814c4ad", + Action = "invitetoproject", + Recipient = "c5cc67d1-c3e8-43c0-a3ad-3928ae3e5b5e", + Sender = "email.sender|messanger.sender" + }, + new + { + TenantId = -1, + Source = "6045b68c-2c2e-42db-9e53-c272e814c4ad", + Action = "milestonedeadline", + Recipient = "c5cc67d1-c3e8-43c0-a3ad-3928ae3e5b5e", + Sender = "email.sender|messanger.sender" + }, + new + { + TenantId = -1, + Source = "6045b68c-2c2e-42db-9e53-c272e814c4ad", + Action = "newcommentformessage", + Recipient = "c5cc67d1-c3e8-43c0-a3ad-3928ae3e5b5e", + Sender = "email.sender|messanger.sender" + }, + new + { + TenantId = -1, + Source = "6045b68c-2c2e-42db-9e53-c272e814c4ad", + Action = "newcommentformilestone", + Recipient = "c5cc67d1-c3e8-43c0-a3ad-3928ae3e5b5e", + Sender = "email.sender|messanger.sender" + }, + new + { + TenantId = -1, + Source = "6045b68c-2c2e-42db-9e53-c272e814c4ad", + Action = "newcommentfortask", + Recipient = "c5cc67d1-c3e8-43c0-a3ad-3928ae3e5b5e", + Sender = "email.sender|messanger.sender" + }, + new + { + TenantId = -1, + Source = "6045b68c-2c2e-42db-9e53-c272e814c4ad", + Action = "projectcreaterequest", + Recipient = "c5cc67d1-c3e8-43c0-a3ad-3928ae3e5b5e", + Sender = "email.sender|messanger.sender" + }, + new + { + TenantId = -1, + Source = "6045b68c-2c2e-42db-9e53-c272e814c4ad", + Action = "projecteditrequest", + Recipient = "c5cc67d1-c3e8-43c0-a3ad-3928ae3e5b5e", + Sender = "email.sender|messanger.sender" + }, + new + { + TenantId = -1, + Source = "6045b68c-2c2e-42db-9e53-c272e814c4ad", + Action = "removefromproject", + Recipient = "c5cc67d1-c3e8-43c0-a3ad-3928ae3e5b5e", + Sender = "email.sender|messanger.sender" + }, + new + { + TenantId = -1, + Source = "6045b68c-2c2e-42db-9e53-c272e814c4ad", + Action = "responsibleforproject", + Recipient = "c5cc67d1-c3e8-43c0-a3ad-3928ae3e5b5e", + Sender = "email.sender|messanger.sender" + }, + new + { + TenantId = -1, + Source = "6045b68c-2c2e-42db-9e53-c272e814c4ad", + Action = "responsiblefortask", + Recipient = "c5cc67d1-c3e8-43c0-a3ad-3928ae3e5b5e", + Sender = "email.sender|messanger.sender" + }, + new + { + TenantId = -1, + Source = "6045b68c-2c2e-42db-9e53-c272e814c4ad", + Action = "taskclosed", + Recipient = "c5cc67d1-c3e8-43c0-a3ad-3928ae3e5b5e", + Sender = "email.sender|messanger.sender" + }, + new + { + TenantId = -1, + Source = "40650da3-f7c1-424c-8c89-b9c115472e08", + Action = "calendar_sharing", + Recipient = "c5cc67d1-c3e8-43c0-a3ad-3928ae3e5b5e", + Sender = "email.sender|messanger.sender" + }, + new + { + TenantId = -1, + Source = "40650da3-f7c1-424c-8c89-b9c115472e08", + Action = "event_alert", + Recipient = "c5cc67d1-c3e8-43c0-a3ad-3928ae3e5b5e", + Sender = "email.sender|messanger.sender" + }, + new + { + TenantId = -1, + Source = "asc.web.studio", + Action = "admin_notify", + Recipient = "cd84e66b-b803-40fc-99f9-b2969a54a1de", + Sender = "email.sender" + }, + new + { + TenantId = -1, + Source = "13ff36fb-0272-4887-b416-74f52b0d0b02", + Action = "SetAccess", + Recipient = "abef62db-11a8-4673-9d32-ef1d8af19dc0", + Sender = "email.sender|messanger.sender" + }, + new + { + TenantId = -1, + Source = "13ff36fb-0272-4887-b416-74f52b0d0b02", + Action = "ResponsibleForTask", + Recipient = "abef62db-11a8-4673-9d32-ef1d8af19dc0", + Sender = "email.sender|messanger.sender" + }, + new + { + TenantId = -1, + Source = "13ff36fb-0272-4887-b416-74f52b0d0b02", + Action = "AddRelationshipEvent", + Recipient = "abef62db-11a8-4673-9d32-ef1d8af19dc0", + Sender = "email.sender|messanger.sender" + }, + new + { + TenantId = -1, + Source = "13ff36fb-0272-4887-b416-74f52b0d0b02", + Action = "ExportCompleted", + Recipient = "abef62db-11a8-4673-9d32-ef1d8af19dc0", + Sender = "email.sender|messanger.sender" + }, + new + { + TenantId = -1, + Source = "13ff36fb-0272-4887-b416-74f52b0d0b02", + Action = "CreateNewContact", + Recipient = "abef62db-11a8-4673-9d32-ef1d8af19dc0", + Sender = "email.sender|messanger.sender" + }, + new + { + TenantId = -1, + Source = "13ff36fb-0272-4887-b416-74f52b0d0b02", + Action = "ResponsibleForOpportunity", + Recipient = "abef62db-11a8-4673-9d32-ef1d8af19dc0", + Sender = "email.sender|messanger.sender" + }, + new + { + TenantId = -1, + Source = "asc.web.studio", + Action = "periodic_notify", + Recipient = "c5cc67d1-c3e8-43c0-a3ad-3928ae3e5b5e", + Sender = "email.sender" + }); + }); + + modelBuilder.Entity("ASC.Core.Common.EF.DbTariff", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasColumnName("id"); + + b.Property("Comment") + .HasColumnType("varchar(255)") + .HasColumnName("comment") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("CreateOn") + .HasColumnType("timestamp") + .HasColumnName("create_on"); + + b.Property("CustomerId") + .IsRequired() + .HasColumnType("varchar(255)") + .HasColumnName("customer_id") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("Stamp") + .HasColumnType("datetime") + .HasColumnName("stamp"); + + b.Property("TenantId") + .HasColumnType("int") + .HasColumnName("tenant"); + + b.HasKey("Id"); + + b.HasIndex("TenantId") + .HasDatabaseName("tenant"); + + b.ToTable("tenants_tariff", (string)null); + + b.HasAnnotation("MySql:CharSet", "utf8"); + }); + + modelBuilder.Entity("ASC.Core.Common.EF.DbTariffRow", b => + { + b.Property("TenantId") + .HasColumnType("int") + .HasColumnName("tenant"); + + b.Property("TariffId") + .HasColumnType("int") + .HasColumnName("tariff_id"); + + b.Property("Quota") + .HasColumnType("int") + .HasColumnName("quota"); + + b.Property("Quantity") + .HasColumnType("int") + .HasColumnName("quantity"); + + b.HasKey("TenantId", "TariffId", "Quota") + .HasName("PRIMARY"); + + b.ToTable("tenants_tariffrow", (string)null); + }); + + modelBuilder.Entity("ASC.Core.Common.EF.FireBaseUser", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasColumnName("id"); + + b.Property("Application") + .HasColumnType("varchar(20)") + .HasColumnName("application") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("FirebaseDeviceToken") + .HasColumnType("varchar(255)") + .HasColumnName("firebase_device_token") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("IsSubscribed") + .HasColumnType("tinyint(1)") + .HasColumnName("is_subscribed"); + + b.Property("TenantId") + .HasColumnType("int") + .HasColumnName("tenant_id"); + + b.Property("UserId") + .IsRequired() + .HasColumnType("varchar(36)") + .HasColumnName("user_id") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.HasKey("Id") + .HasName("PRIMARY"); + + b.HasIndex("TenantId", "UserId") + .HasDatabaseName("user_id"); + + b.ToTable("firebase_users", (string)null); + }); + + modelBuilder.Entity("ASC.Core.Common.EF.Model.AccountLinks", b => + { + b.Property("Id") + .HasColumnType("varchar(200)") + .HasColumnName("id") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("UId") + .HasColumnType("varchar(200)") + .HasColumnName("uid") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("Linked") + .HasColumnType("datetime") + .HasColumnName("linked"); + + b.Property("Profile") + .IsRequired() + .HasColumnType("text") + .HasColumnName("profile") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("Provider") + .HasColumnType("char(60)") + .HasColumnName("provider") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.HasKey("Id", "UId") + .HasName("PRIMARY"); + + b.HasIndex("UId") + .HasDatabaseName("uid"); + + b.ToTable("account_links", (string)null); + + b.HasAnnotation("MySql:CharSet", "utf8"); + }); + + modelBuilder.Entity("ASC.Core.Common.EF.Model.DbCoreSettings", b => + { + b.Property("TenantId") + .HasColumnType("int") + .HasColumnName("tenant"); + + b.Property("Id") + .HasColumnType("varchar(128)") + .HasColumnName("id") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("LastModified") + .HasColumnType("timestamp") + .HasColumnName("last_modified"); + + b.Property("Value") + .IsRequired() + .HasColumnType("mediumblob") + .HasColumnName("value"); + + b.HasKey("TenantId", "Id") + .HasName("PRIMARY"); + + b.ToTable("core_settings", (string)null); + + b.HasAnnotation("MySql:CharSet", "utf8"); + + b.HasData( + new + { + TenantId = -1, + Id = "CompanyWhiteLabelSettings", + LastModified = new DateTime(2022, 7, 8, 0, 0, 0, 0, DateTimeKind.Unspecified), + Value = new byte[] { 245, 71, 4, 138, 72, 101, 23, 21, 135, 217, 206, 188, 138, 73, 108, 96, 29, 150, 3, 31, 44, 28, 62, 145, 96, 53, 57, 66, 238, 118, 93, 172, 211, 22, 244, 181, 244, 40, 146, 67, 111, 196, 162, 27, 154, 109, 248, 255, 181, 17, 253, 127, 42, 65, 19, 90, 26, 206, 203, 145, 159, 159, 243, 105, 24, 71, 188, 165, 53, 85, 57, 37, 186, 251, 57, 96, 18, 162, 218, 80, 0, 101, 250, 100, 66, 97, 24, 51, 240, 215, 216, 169, 105, 100, 15, 253, 29, 83, 182, 236, 203, 53, 68, 251, 2, 150, 149, 148, 58, 136, 84, 37, 151, 82, 92, 227, 30, 52, 111, 40, 154, 155, 7, 126, 149, 100, 169, 87, 10, 129, 228, 138, 177, 101, 77, 67, 177, 216, 189, 201, 1, 213, 136, 216, 107, 198, 253, 221, 106, 255, 198, 17, 68, 14, 110, 90, 174, 182, 68, 222, 188, 77, 157, 19, 26, 68, 86, 97, 15, 81, 24, 171, 214, 114, 191, 175, 56, 56, 48, 52, 125, 82, 253, 113, 71, 41, 201, 5, 8, 118, 162, 191, 99, 196, 48, 198, 223, 79, 204, 174, 31, 97, 236, 20, 213, 218, 85, 34, 16, 74, 196, 209, 235, 14, 71, 209, 32, 131, 195, 84, 11, 66, 74, 19, 115, 255, 99, 69, 235, 210, 204, 15, 13, 4, 143, 127, 152, 125, 212, 91 } + }, + new + { + TenantId = -1, + Id = "FullTextSearchSettings", + LastModified = new DateTime(2022, 7, 8, 0, 0, 0, 0, DateTimeKind.Unspecified), + Value = new byte[] { 8, 120, 207, 5, 153, 181, 23, 202, 162, 211, 218, 237, 157, 6, 76, 62, 220, 238, 175, 67, 31, 53, 166, 246, 66, 220, 173, 160, 72, 23, 227, 81, 50, 39, 187, 177, 222, 110, 43, 171, 235, 158, 16, 119, 178, 207, 49, 140, 72, 152, 20, 84, 94, 135, 117, 1, 246, 51, 251, 190, 148, 2, 44, 252, 221, 2, 91, 83, 149, 151, 58, 245, 16, 148, 52, 8, 187, 86, 150, 46, 227, 93, 163, 95, 47, 131, 116, 207, 95, 209, 38, 149, 53, 148, 73, 215, 206, 251, 194, 199, 189, 17, 42, 229, 135, 82, 23, 154, 162, 165, 158, 94, 23, 128, 30, 88, 12, 204, 96, 250, 236, 142, 189, 211, 214, 18, 196, 136, 102, 102, 217, 109, 108, 240, 96, 96, 94, 100, 201, 10, 31, 170, 128, 192 } + }, + new + { + TenantId = -1, + Id = "SmtpSettings", + LastModified = new DateTime(2022, 7, 8, 0, 0, 0, 0, DateTimeKind.Unspecified), + Value = new byte[] { 240, 82, 224, 144, 161, 163, 117, 13, 173, 205, 78, 153, 97, 218, 4, 170, 81, 239, 1, 151, 226, 192, 98, 60, 241, 44, 88, 56, 191, 164, 10, 155, 72, 186, 239, 203, 227, 113, 88, 119, 49, 215, 227, 220, 158, 124, 96, 9, 116, 47, 158, 65, 93, 86, 219, 15, 10, 224, 142, 50, 248, 144, 75, 44, 68, 28, 198, 87, 198, 69, 67, 234, 238, 38, 32, 68, 162, 139, 67, 53, 220, 176, 240, 196, 233, 64, 29, 137, 31, 160, 99, 105, 249, 132, 202, 45, 71, 92, 134, 194, 55, 145, 121, 97, 197, 130, 119, 105, 131, 21, 133, 35, 10, 102, 172, 119, 135, 230, 251, 86, 253, 62, 55, 56, 146, 103, 164, 106 } + }); + }); + + modelBuilder.Entity("ASC.Core.Common.EF.Model.DbIPLookup", b => + { + b.Property("AddrType") + .HasColumnType("enum('ipv4','ipv6')") + .HasColumnName("addr_type"); + + b.Property("IPStart") + .HasColumnType("varbinary(16)") + .HasColumnName("ip_start"); + + b.Property("City") + .IsRequired() + .HasColumnType("varchar(80)") + .HasColumnName("city"); + + b.Property("Continent") + .IsRequired() + .HasColumnType("char(2)") + .HasColumnName("continent"); + + b.Property("Country") + .IsRequired() + .HasColumnType("char(2)") + .HasColumnName("country"); + + b.Property("District") + .IsRequired() + .HasColumnType("varchar(80)") + .HasColumnName("district"); + + b.Property("GeonameId") + .HasColumnType("int(10)") + .HasColumnName("geoname_id"); + + b.Property("IPEnd") + .IsRequired() + .HasColumnType("varbinary(16)") + .HasColumnName("ip_end"); + + b.Property("Latitude") + .HasColumnType("float") + .HasColumnName("latitude"); + + b.Property("Longitude") + .HasColumnType("float") + .HasColumnName("longitude"); + + b.Property("StateProv") + .IsRequired() + .HasColumnType("varchar(80)") + .HasColumnName("stateprov"); + + b.Property("StateProvCode") + .HasColumnType("varchar(15)") + .HasColumnName("stateprov_code"); + + b.Property("TimezoneName") + .IsRequired() + .HasColumnType("varchar(64)") + .HasColumnName("timezone_name"); + + b.Property("TimezoneOffset") + .HasColumnType("float") + .HasColumnName("timezone_offset"); + + b.Property("WeatherCode") + .IsRequired() + .HasColumnType("varchar(10)") + .HasColumnName("weather_code"); + + b.Property("ZipCode") + .HasColumnType("varchar(20)") + .HasColumnName("zipcode"); + + b.HasKey("AddrType", "IPStart"); + + b.ToTable("dbip_lookup", (string)null); + + b.HasAnnotation("MySql:CharSet", "utf8mb4"); + }); + + modelBuilder.Entity("ASC.Core.Common.EF.Model.DbTenant", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasColumnName("id"); + + b.Property("Alias") + .IsRequired() + .HasColumnType("varchar(100)") + .HasColumnName("alias") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("Calls") + .ValueGeneratedOnAdd() + .HasColumnType("tinyint(1)") + .HasColumnName("calls") + .HasDefaultValueSql("'1'"); + + b.Property("CreationDateTime") + .HasColumnType("datetime") + .HasColumnName("creationdatetime"); + + b.Property("Industry") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasColumnName("industry") + .HasDefaultValueSql("'0'"); + + b.Property("Language") + .IsRequired() + .ValueGeneratedOnAdd() + .HasColumnType("char(10)") + .HasColumnName("language") + .HasDefaultValueSql("'en-US'") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("LastModified") + .HasColumnType("timestamp") + .HasColumnName("last_modified"); + + b.Property("MappedDomain") + .HasColumnType("varchar(100)") + .HasColumnName("mappeddomain") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("Name") + .IsRequired() + .HasColumnType("varchar(255)") + .HasColumnName("name") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("OwnerId") + .HasColumnType("varchar(38)") + .HasColumnName("owner_id") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("PaymentId") + .HasColumnType("varchar(38)") + .HasColumnName("payment_id") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("Spam") + .ValueGeneratedOnAdd() + .HasColumnType("tinyint(1)") + .HasColumnName("spam") + .HasDefaultValueSql("'1'"); + + b.Property("Status") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasColumnName("status") + .HasDefaultValueSql("'0'"); + + b.Property("StatusChanged") + .HasColumnType("datetime") + .HasColumnName("statuschanged"); + + b.Property("TimeZone") + .HasColumnType("varchar(50)") + .HasColumnName("timezone") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("TrustedDomainsEnabled") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasColumnName("trusteddomainsenabled") + .HasDefaultValueSql("'1'"); + + b.Property("TrustedDomainsRaw") + .HasColumnType("varchar(1024)") + .HasColumnName("trusteddomains") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("Version") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasColumnName("version") + .HasDefaultValueSql("'2'"); + + b.Property("Version_Changed") + .HasColumnType("datetime") + .HasColumnName("version_changed"); + + b.HasKey("Id"); + + b.HasIndex("Alias") + .IsUnique() + .HasDatabaseName("alias"); + + b.HasIndex("LastModified") + .HasDatabaseName("last_modified"); + + b.HasIndex("MappedDomain") + .HasDatabaseName("mappeddomain"); + + b.HasIndex("Version") + .HasDatabaseName("version"); + + b.ToTable("tenants_tenants", (string)null); + + b.HasAnnotation("MySql:CharSet", "utf8"); + + b.HasData( + new + { + Id = 1, + Alias = "localhost", + Calls = false, + CreationDateTime = new DateTime(2021, 3, 9, 17, 46, 59, 97, DateTimeKind.Utc).AddTicks(4317), + Industry = 0, + LastModified = new DateTime(2022, 7, 8, 0, 0, 0, 0, DateTimeKind.Unspecified), + Name = "Web Office", + OwnerId = "66faa6e4-f133-11ea-b126-00ffeec8b4ef", + Spam = false, + Status = 0, + TrustedDomainsEnabled = 0, + Version = 0 + }, + new + { + Id = -1, + Alias = "settings", + Calls = false, + CreationDateTime = new DateTime(2021, 3, 9, 17, 46, 59, 97, DateTimeKind.Utc).AddTicks(4317), + Industry = 0, + LastModified = new DateTime(2022, 7, 8, 0, 0, 0, 0, DateTimeKind.Unspecified), + Name = "Web Office", + OwnerId = "00000000-0000-0000-0000-000000000000", + Spam = false, + Status = 1, + TrustedDomainsEnabled = 0, + Version = 0 + }); + }); + + modelBuilder.Entity("ASC.Core.Common.EF.Model.DbTenantForbiden", b => + { + b.Property("Address") + .HasColumnType("varchar(50)") + .HasColumnName("address") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.HasKey("Address") + .HasName("PRIMARY"); + + b.ToTable("tenants_forbiden", (string)null); + + b.HasAnnotation("MySql:CharSet", "utf8"); + + b.HasData( + new + { + Address = "controlpanel" + }, + new + { + Address = "localhost" + }); + }); + + modelBuilder.Entity("ASC.Core.Common.EF.Model.DbTenantPartner", b => + { + b.Property("TenantId") + .HasColumnType("int") + .HasColumnName("tenant_id"); + + b.Property("AffiliateId") + .HasColumnType("varchar(50)") + .HasColumnName("affiliate_id") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("Campaign") + .HasColumnType("varchar(50)") + .HasColumnName("campaign") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("PartnerId") + .HasColumnType("varchar(36)") + .HasColumnName("partner_id") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.HasKey("TenantId") + .HasName("PRIMARY"); + + b.ToTable("tenants_partners", (string)null); + + b.HasAnnotation("MySql:CharSet", "utf8"); + }); + + modelBuilder.Entity("ASC.Core.Common.EF.Model.DbTenantVersion", b => + { + b.Property("Id") + .HasColumnType("int") + .HasColumnName("id"); + + b.Property("DefaultVersion") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasColumnName("default_version") + .HasDefaultValueSql("'0'"); + + b.Property("Url") + .IsRequired() + .HasColumnType("varchar(64)") + .HasColumnName("url") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("Version") + .IsRequired() + .HasColumnType("varchar(64)") + .HasColumnName("version") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("Visible") + .ValueGeneratedOnAdd() + .HasColumnType("tinyint(1)") + .HasColumnName("visible") + .HasDefaultValueSql("'0'"); + + b.HasKey("Id"); + + b.ToTable("tenants_version", (string)null); + + b.HasAnnotation("MySql:CharSet", "utf8"); + }); + + modelBuilder.Entity("ASC.Core.Common.EF.Model.DbWebstudioIndex", b => + { + b.Property("IndexName") + .HasColumnType("varchar(50)") + .HasColumnName("index_name") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("LastModified") + .HasColumnType("timestamp") + .HasColumnName("last_modified"); + + b.HasKey("IndexName") + .HasName("PRIMARY"); + + b.ToTable("webstudio_index", (string)null); + + b.HasAnnotation("MySql:CharSet", "utf8"); + }); + + modelBuilder.Entity("ASC.Core.Common.EF.Model.DbWebstudioSettings", b => + { + b.Property("TenantId") + .HasColumnType("int") + .HasColumnName("TenantID"); + + b.Property("Id") + .HasColumnType("varchar(64)") + .HasColumnName("ID") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("UserId") + .HasColumnType("varchar(64)") + .HasColumnName("UserID") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("Data") + .IsRequired() + .HasColumnType("mediumtext") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.HasKey("TenantId", "Id", "UserId") + .HasName("PRIMARY"); + + b.HasIndex("Id") + .HasDatabaseName("ID"); + + b.ToTable("webstudio_settings", (string)null); + + b.HasAnnotation("MySql:CharSet", "utf8"); + + b.HasData( + new + { + TenantId = 1, + Id = "9a925891-1f92-4ed7-b277-d6f649739f06", + UserId = "00000000-0000-0000-0000-000000000000", + Data = "{\"Completed\":false}" + }); + }); + + modelBuilder.Entity("ASC.Core.Common.EF.Model.DbWebstudioUserVisit", b => + { + b.Property("TenantId") + .HasColumnType("int") + .HasColumnName("tenantid"); + + b.Property("VisitDate") + .HasColumnType("datetime") + .HasColumnName("visitdate"); + + b.Property("ProductId") + .HasColumnType("varchar(38)") + .HasColumnName("productid") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("UserId") + .HasColumnType("varchar(38)") + .HasColumnName("userid") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("FirstVisitTime") + .ValueGeneratedOnAdd() + .HasColumnType("datetime") + .HasColumnName("firstvisittime") + .HasDefaultValueSql("NULL"); + + b.Property("LastVisitTime") + .ValueGeneratedOnAdd() + .HasColumnType("datetime") + .HasColumnName("lastvisittime") + .HasDefaultValueSql("NULL"); + + b.Property("VisitCount") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasColumnName("visitcount") + .HasDefaultValueSql("'0'"); + + b.HasKey("TenantId", "VisitDate", "ProductId", "UserId") + .HasName("PRIMARY"); + + b.HasIndex("VisitDate") + .HasDatabaseName("visitdate"); + + b.ToTable("webstudio_uservisit", (string)null); + + b.HasAnnotation("MySql:CharSet", "utf8"); + }); + + modelBuilder.Entity("ASC.Core.Common.EF.Model.FilesConverts", b => + { + b.Property("Input") + .HasColumnType("varchar(50)") + .HasColumnName("input") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("Output") + .HasColumnType("varchar(50)") + .HasColumnName("output") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.HasKey("Input", "Output") + .HasName("PRIMARY"); + + b.ToTable("files_converts", (string)null); + + b.HasAnnotation("MySql:CharSet", "utf8"); + + b.HasData( + new + { + Input = ".csv", + Output = ".ods" + }, + new + { + Input = ".csv", + Output = ".pdf" + }, + new + { + Input = ".csv", + Output = ".ots" + }, + new + { + Input = ".csv", + Output = ".xlsx" + }, + new + { + Input = ".csv", + Output = ".xlsm" + }, + new + { + Input = ".csv", + Output = ".xltm" + }, + new + { + Input = ".csv", + Output = ".xltx" + }, + new + { + Input = ".doc", + Output = ".docx" + }, + new + { + Input = ".doc", + Output = ".docm" + }, + new + { + Input = ".doc", + Output = ".dotm" + }, + new + { + Input = ".doc", + Output = ".dotx" + }, + new + { + Input = ".doc", + Output = ".epub" + }, + new + { + Input = ".doc", + Output = ".fb2" + }, + new + { + Input = ".doc", + Output = ".html" + }, + new + { + Input = ".doc", + Output = ".ott" + }, + new + { + Input = ".doc", + Output = ".odt" + }, + new + { + Input = ".doc", + Output = ".pdf" + }, + new + { + Input = ".doc", + Output = ".rtf" + }, + new + { + Input = ".doc", + Output = ".txt" + }, + new + { + Input = ".docm", + Output = ".docx" + }, + new + { + Input = ".docm", + Output = ".dotm" + }, + new + { + Input = ".docm", + Output = ".html" + }, + new + { + Input = ".docm", + Output = ".dotx" + }, + new + { + Input = ".docm", + Output = ".epub" + }, + new + { + Input = ".docm", + Output = ".fb2" + }, + new + { + Input = ".docm", + Output = ".ott" + }, + new + { + Input = ".docm", + Output = ".odt" + }, + new + { + Input = ".docm", + Output = ".pdf" + }, + new + { + Input = ".docm", + Output = ".rtf" + }, + new + { + Input = ".docm", + Output = ".txt" + }, + new + { + Input = ".doct", + Output = ".docx" + }, + new + { + Input = ".docx", + Output = ".odt" + }, + new + { + Input = ".docx", + Output = ".pdf" + }, + new + { + Input = ".docx", + Output = ".rtf" + }, + new + { + Input = ".docx", + Output = ".txt" + }, + new + { + Input = ".docx", + Output = ".html" + }, + new + { + Input = ".docx", + Output = ".dotm" + }, + new + { + Input = ".docx", + Output = ".dotx" + }, + new + { + Input = ".docx", + Output = ".epub" + }, + new + { + Input = ".docx", + Output = ".fb2" + }, + new + { + Input = ".docx", + Output = ".ott" + }, + new + { + Input = ".docx", + Output = ".docm" + }, + new + { + Input = ".docx", + Output = ".docxf" + }, + new + { + Input = ".docxf", + Output = ".docm" + }, + new + { + Input = ".docxf", + Output = ".docx" + }, + new + { + Input = ".docxf", + Output = ".dotm" + }, + new + { + Input = ".docxf", + Output = ".odt" + }, + new + { + Input = ".docxf", + Output = ".oform" + }, + new + { + Input = ".docxf", + Output = ".pdf" + }, + new + { + Input = ".docxf", + Output = ".rtf" + }, + new + { + Input = ".docxf", + Output = ".txt" + }, + new + { + Input = ".docxf", + Output = ".dotx" + }, + new + { + Input = ".docxf", + Output = ".epub" + }, + new + { + Input = ".docxf", + Output = ".fb2" + }, + new + { + Input = ".docxf", + Output = ".html" + }, + new + { + Input = ".docxf", + Output = ".ott" + }, + new + { + Input = ".dot", + Output = ".docx" + }, + new + { + Input = ".dot", + Output = ".odt" + }, + new + { + Input = ".dot", + Output = ".pdf" + }, + new + { + Input = ".dot", + Output = ".rtf" + }, + new + { + Input = ".dot", + Output = ".txt" + }, + new + { + Input = ".dot", + Output = ".docm" + }, + new + { + Input = ".dot", + Output = ".dotm" + }, + new + { + Input = ".dot", + Output = ".dotx" + }, + new + { + Input = ".dot", + Output = ".epub" + }, + new + { + Input = ".dot", + Output = ".fb2" + }, + new + { + Input = ".dot", + Output = ".html" + }, + new + { + Input = ".dot", + Output = ".ott" + }, + new + { + Input = ".dotm", + Output = ".docx" + }, + new + { + Input = ".dotm", + Output = ".odt" + }, + new + { + Input = ".dotm", + Output = ".pdf" + }, + new + { + Input = ".dotm", + Output = ".rtf" + }, + new + { + Input = ".dotm", + Output = ".txt" + }, + new + { + Input = ".dotm", + Output = ".docm" + }, + new + { + Input = ".dotm", + Output = ".dotx" + }, + new + { + Input = ".dotm", + Output = ".epub" + }, + new + { + Input = ".dotm", + Output = ".fb2" + }, + new + { + Input = ".dotm", + Output = ".html" + }, + new + { + Input = ".dotm", + Output = ".ott" + }, + new + { + Input = ".dotx", + Output = ".docx" + }, + new + { + Input = ".dotx", + Output = ".odt" + }, + new + { + Input = ".dotx", + Output = ".pdf" + }, + new + { + Input = ".dotx", + Output = ".rtf" + }, + new + { + Input = ".dotx", + Output = ".txt" + }, + new + { + Input = ".dotx", + Output = ".docm" + }, + new + { + Input = ".dotx", + Output = ".dotm" + }, + new + { + Input = ".dotx", + Output = ".epub" + }, + new + { + Input = ".dotx", + Output = ".fb2" + }, + new + { + Input = ".dotx", + Output = ".html" + }, + new + { + Input = ".dotx", + Output = ".ott" + }, + new + { + Input = ".dps", + Output = ".odp" + }, + new + { + Input = ".dps", + Output = ".otp" + }, + new + { + Input = ".dps", + Output = ".pdf" + }, + new + { + Input = ".dps", + Output = ".potm" + }, + new + { + Input = ".dps", + Output = ".potx" + }, + new + { + Input = ".dps", + Output = ".ppsm" + }, + new + { + Input = ".dps", + Output = ".ppsx" + }, + new + { + Input = ".dps", + Output = ".pptm" + }, + new + { + Input = ".dps", + Output = ".pptx" + }, + new + { + Input = ".dpt", + Output = ".odp" + }, + new + { + Input = ".dpt", + Output = ".otp" + }, + new + { + Input = ".dpt", + Output = ".pdf" + }, + new + { + Input = ".dpt", + Output = ".potm" + }, + new + { + Input = ".dpt", + Output = ".potx" + }, + new + { + Input = ".dpt", + Output = ".ppsm" + }, + new + { + Input = ".dpt", + Output = ".ppsx" + }, + new + { + Input = ".dpt", + Output = ".pptm" + }, + new + { + Input = ".dpt", + Output = ".pptx" + }, + new + { + Input = ".epub", + Output = ".docx" + }, + new + { + Input = ".epub", + Output = ".odt" + }, + new + { + Input = ".epub", + Output = ".pdf" + }, + new + { + Input = ".epub", + Output = ".rtf" + }, + new + { + Input = ".epub", + Output = ".txt" + }, + new + { + Input = ".epub", + Output = ".docm" + }, + new + { + Input = ".epub", + Output = ".dotm" + }, + new + { + Input = ".epub", + Output = ".dotx" + }, + new + { + Input = ".epub", + Output = ".fb2" + }, + new + { + Input = ".epub", + Output = ".html" + }, + new + { + Input = ".epub", + Output = ".ott" + }, + new + { + Input = ".et", + Output = ".csv" + }, + new + { + Input = ".et", + Output = ".ods" + }, + new + { + Input = ".et", + Output = ".ots" + }, + new + { + Input = ".et", + Output = ".pdf" + }, + new + { + Input = ".et", + Output = ".xlsm" + }, + new + { + Input = ".et", + Output = ".xlsx" + }, + new + { + Input = ".et", + Output = ".xltm" + }, + new + { + Input = ".et", + Output = ".xltx" + }, + new + { + Input = ".ett", + Output = ".csv" + }, + new + { + Input = ".ett", + Output = ".ods" + }, + new + { + Input = ".ett", + Output = ".ots" + }, + new + { + Input = ".ett", + Output = ".pdf" + }, + new + { + Input = ".ett", + Output = ".xlsm" + }, + new + { + Input = ".ett", + Output = ".xlsx" + }, + new + { + Input = ".ett", + Output = ".xltm" + }, + new + { + Input = ".ett", + Output = ".xltx" + }, + new + { + Input = ".fb2", + Output = ".docx" + }, + new + { + Input = ".fb2", + Output = ".odt" + }, + new + { + Input = ".fb2", + Output = ".pdf" + }, + new + { + Input = ".fb2", + Output = ".rtf" + }, + new + { + Input = ".fb2", + Output = ".txt" + }, + new + { + Input = ".fb2", + Output = ".docm" + }, + new + { + Input = ".fb2", + Output = ".dotm" + }, + new + { + Input = ".fb2", + Output = ".dotx" + }, + new + { + Input = ".fb2", + Output = ".epub" + }, + new + { + Input = ".fb2", + Output = ".html" + }, + new + { + Input = ".fb2", + Output = ".ott" + }, + new + { + Input = ".fodp", + Output = ".odp" + }, + new + { + Input = ".fodp", + Output = ".pdf" + }, + new + { + Input = ".fodp", + Output = ".pptx" + }, + new + { + Input = ".fodp", + Output = ".otp" + }, + new + { + Input = ".fodp", + Output = ".potm" + }, + new + { + Input = ".fodp", + Output = ".potx" + }, + new + { + Input = ".fodp", + Output = ".ppsm" + }, + new + { + Input = ".fodp", + Output = ".ppsx" + }, + new + { + Input = ".fodp", + Output = ".pptm" + }, + new + { + Input = ".fods", + Output = ".csv" + }, + new + { + Input = ".fods", + Output = ".ods" + }, + new + { + Input = ".fods", + Output = ".pdf" + }, + new + { + Input = ".fods", + Output = ".xlsx" + }, + new + { + Input = ".fods", + Output = ".xlsm" + }, + new + { + Input = ".fods", + Output = ".xltm" + }, + new + { + Input = ".fods", + Output = ".xltx" + }, + new + { + Input = ".fods", + Output = ".ots" + }, + new + { + Input = ".fodt", + Output = ".docx" + }, + new + { + Input = ".fodt", + Output = ".odt" + }, + new + { + Input = ".fodt", + Output = ".docm" + }, + new + { + Input = ".fodt", + Output = ".pdf" + }, + new + { + Input = ".fodt", + Output = ".rtf" + }, + new + { + Input = ".fodt", + Output = ".txt" + }, + new + { + Input = ".fodt", + Output = ".dotm" + }, + new + { + Input = ".fodt", + Output = ".dotx" + }, + new + { + Input = ".fodt", + Output = ".epub" + }, + new + { + Input = ".fodt", + Output = ".fb2" + }, + new + { + Input = ".fodt", + Output = ".html" + }, + new + { + Input = ".fodt", + Output = ".ott" + }, + new + { + Input = ".htm", + Output = ".docm" + }, + new + { + Input = ".htm", + Output = ".docx" + }, + new + { + Input = ".htm", + Output = ".dotm" + }, + new + { + Input = ".htm", + Output = ".dotx" + }, + new + { + Input = ".htm", + Output = ".epub" + }, + new + { + Input = ".htm", + Output = ".fb2" + }, + new + { + Input = ".htm", + Output = ".html" + }, + new + { + Input = ".htm", + Output = ".odt" + }, + new + { + Input = ".htm", + Output = ".ott" + }, + new + { + Input = ".htm", + Output = ".pdf" + }, + new + { + Input = ".htm", + Output = ".rtf" + }, + new + { + Input = ".htm", + Output = ".txt" + }, + new + { + Input = ".html", + Output = ".docx" + }, + new + { + Input = ".html", + Output = ".odt" + }, + new + { + Input = ".html", + Output = ".pdf" + }, + new + { + Input = ".html", + Output = ".rtf" + }, + new + { + Input = ".html", + Output = ".txt" + }, + new + { + Input = ".html", + Output = ".docm" + }, + new + { + Input = ".html", + Output = ".dotm" + }, + new + { + Input = ".html", + Output = ".dotx" + }, + new + { + Input = ".html", + Output = ".epub" + }, + new + { + Input = ".html", + Output = ".fb2" + }, + new + { + Input = ".html", + Output = ".ott" + }, + new + { + Input = ".mht", + Output = ".docx" + }, + new + { + Input = ".mht", + Output = ".odt" + }, + new + { + Input = ".mht", + Output = ".pdf" + }, + new + { + Input = ".mht", + Output = ".rtf" + }, + new + { + Input = ".mht", + Output = ".txt" + }, + new + { + Input = ".mht", + Output = ".docm" + }, + new + { + Input = ".mht", + Output = ".dotm" + }, + new + { + Input = ".mht", + Output = ".dotx" + }, + new + { + Input = ".mht", + Output = ".epub" + }, + new + { + Input = ".mht", + Output = ".fb2" + }, + new + { + Input = ".mht", + Output = ".html" + }, + new + { + Input = ".mht", + Output = ".ott" + }, + new + { + Input = ".mhtml", + Output = ".docm" + }, + new + { + Input = ".mhtml", + Output = ".docx" + }, + new + { + Input = ".mhtml", + Output = ".dotm" + }, + new + { + Input = ".mhtml", + Output = ".dotx" + }, + new + { + Input = ".mhtml", + Output = ".epub" + }, + new + { + Input = ".mhtml", + Output = ".fb2" + }, + new + { + Input = ".mhtml", + Output = ".html" + }, + new + { + Input = ".mhtml", + Output = ".odt" + }, + new + { + Input = ".mhtml", + Output = ".ott" + }, + new + { + Input = ".mhtml", + Output = ".pdf" + }, + new + { + Input = ".mhtml", + Output = ".rtf" + }, + new + { + Input = ".mhtml", + Output = ".txt" + }, + new + { + Input = ".odp", + Output = ".pdf" + }, + new + { + Input = ".odp", + Output = ".pptx" + }, + new + { + Input = ".odp", + Output = ".otp" + }, + new + { + Input = ".odp", + Output = ".potm" + }, + new + { + Input = ".odp", + Output = ".potx" + }, + new + { + Input = ".odp", + Output = ".ppsm" + }, + new + { + Input = ".odp", + Output = ".ppsx" + }, + new + { + Input = ".odp", + Output = ".pptm" + }, + new + { + Input = ".otp", + Output = ".odp" + }, + new + { + Input = ".otp", + Output = ".pdf" + }, + new + { + Input = ".otp", + Output = ".potm" + }, + new + { + Input = ".otp", + Output = ".potx" + }, + new + { + Input = ".otp", + Output = ".pptm" + }, + new + { + Input = ".otp", + Output = ".ppsm" + }, + new + { + Input = ".otp", + Output = ".ppsx" + }, + new + { + Input = ".otp", + Output = ".pptx" + }, + new + { + Input = ".ods", + Output = ".csv" + }, + new + { + Input = ".ods", + Output = ".pdf" + }, + new + { + Input = ".ods", + Output = ".xlsx" + }, + new + { + Input = ".ods", + Output = ".ots" + }, + new + { + Input = ".ods", + Output = ".xlsm" + }, + new + { + Input = ".ods", + Output = ".xltm" + }, + new + { + Input = ".ods", + Output = ".xltx" + }, + new + { + Input = ".ots", + Output = ".csv" + }, + new + { + Input = ".ots", + Output = ".ods" + }, + new + { + Input = ".ots", + Output = ".pdf" + }, + new + { + Input = ".ots", + Output = ".xlsm" + }, + new + { + Input = ".ots", + Output = ".xltm" + }, + new + { + Input = ".ots", + Output = ".xltx" + }, + new + { + Input = ".ots", + Output = ".xlsx" + }, + new + { + Input = ".odt", + Output = ".docx" + }, + new + { + Input = ".odt", + Output = ".pdf" + }, + new + { + Input = ".odt", + Output = ".rtf" + }, + new + { + Input = ".odt", + Output = ".txt" + }, + new + { + Input = ".odt", + Output = ".docm" + }, + new + { + Input = ".odt", + Output = ".dotm" + }, + new + { + Input = ".odt", + Output = ".dotx" + }, + new + { + Input = ".odt", + Output = ".epub" + }, + new + { + Input = ".odt", + Output = ".fb2" + }, + new + { + Input = ".odt", + Output = ".html" + }, + new + { + Input = ".odt", + Output = ".ott" + }, + new + { + Input = ".ott", + Output = ".docx" + }, + new + { + Input = ".ott", + Output = ".odt" + }, + new + { + Input = ".ott", + Output = ".pdf" + }, + new + { + Input = ".ott", + Output = ".rtf" + }, + new + { + Input = ".ott", + Output = ".txt" + }, + new + { + Input = ".ott", + Output = ".docm" + }, + new + { + Input = ".ott", + Output = ".dotm" + }, + new + { + Input = ".ott", + Output = ".dotx" + }, + new + { + Input = ".ott", + Output = ".epub" + }, + new + { + Input = ".ott", + Output = ".fb2" + }, + new + { + Input = ".ott", + Output = ".html" + }, + new + { + Input = ".oxps", + Output = ".docm" + }, + new + { + Input = ".oxps", + Output = ".docx" + }, + new + { + Input = ".oxps", + Output = ".dotm" + }, + new + { + Input = ".oxps", + Output = ".dotx" + }, + new + { + Input = ".oxps", + Output = ".epub" + }, + new + { + Input = ".oxps", + Output = ".fb2" + }, + new + { + Input = ".oxps", + Output = ".html" + }, + new + { + Input = ".oxps", + Output = ".odt" + }, + new + { + Input = ".oxps", + Output = ".ott" + }, + new + { + Input = ".oxps", + Output = ".pdf" + }, + new + { + Input = ".oxps", + Output = ".rtf" + }, + new + { + Input = ".oxps", + Output = ".txt" + }, + new + { + Input = ".pdf", + Output = ".docm" + }, + new + { + Input = ".pdf", + Output = ".docx" + }, + new + { + Input = ".pdf", + Output = ".dotm" + }, + new + { + Input = ".pdf", + Output = ".dotx" + }, + new + { + Input = ".pdf", + Output = ".epub" + }, + new + { + Input = ".pdf", + Output = ".fb2" + }, + new + { + Input = ".pdf", + Output = ".html" + }, + new + { + Input = ".pdf", + Output = ".odt" + }, + new + { + Input = ".pdf", + Output = ".ott" + }, + new + { + Input = ".pdf", + Output = ".rtf" + }, + new + { + Input = ".pdf", + Output = ".txt" + }, + new + { + Input = ".pot", + Output = ".odp" + }, + new + { + Input = ".pot", + Output = ".pdf" + }, + new + { + Input = ".pot", + Output = ".pptx" + }, + new + { + Input = ".pot", + Output = ".otp" + }, + new + { + Input = ".pot", + Output = ".potm" + }, + new + { + Input = ".pot", + Output = ".potx" + }, + new + { + Input = ".pot", + Output = ".pptm" + }, + new + { + Input = ".pot", + Output = ".ppsm" + }, + new + { + Input = ".pot", + Output = ".ppsx" + }, + new + { + Input = ".potm", + Output = ".odp" + }, + new + { + Input = ".potm", + Output = ".pdf" + }, + new + { + Input = ".potm", + Output = ".pptx" + }, + new + { + Input = ".potm", + Output = ".otp" + }, + new + { + Input = ".potm", + Output = ".potx" + }, + new + { + Input = ".potm", + Output = ".pptm" + }, + new + { + Input = ".potm", + Output = ".ppsm" + }, + new + { + Input = ".potm", + Output = ".ppsx" + }, + new + { + Input = ".potx", + Output = ".odp" + }, + new + { + Input = ".potx", + Output = ".pdf" + }, + new + { + Input = ".potx", + Output = ".pptx" + }, + new + { + Input = ".potx", + Output = ".otp" + }, + new + { + Input = ".potx", + Output = ".potm" + }, + new + { + Input = ".potx", + Output = ".pptm" + }, + new + { + Input = ".potx", + Output = ".ppsm" + }, + new + { + Input = ".potx", + Output = ".ppsx" + }, + new + { + Input = ".pps", + Output = ".odp" + }, + new + { + Input = ".pps", + Output = ".pdf" + }, + new + { + Input = ".pps", + Output = ".pptx" + }, + new + { + Input = ".pps", + Output = ".otp" + }, + new + { + Input = ".pps", + Output = ".potm" + }, + new + { + Input = ".pps", + Output = ".potx" + }, + new + { + Input = ".pps", + Output = ".pptm" + }, + new + { + Input = ".pps", + Output = ".ppsm" + }, + new + { + Input = ".pps", + Output = ".ppsx" + }, + new + { + Input = ".ppsm", + Output = ".odp" + }, + new + { + Input = ".ppsm", + Output = ".pdf" + }, + new + { + Input = ".ppsm", + Output = ".pptx" + }, + new + { + Input = ".ppsm", + Output = ".otp" + }, + new + { + Input = ".ppsm", + Output = ".potm" + }, + new + { + Input = ".ppsm", + Output = ".potx" + }, + new + { + Input = ".ppsm", + Output = ".pptm" + }, + new + { + Input = ".ppsm", + Output = ".ppsx" + }, + new + { + Input = ".ppsx", + Output = ".odp" + }, + new + { + Input = ".ppsx", + Output = ".pdf" + }, + new + { + Input = ".ppsx", + Output = ".pptx" + }, + new + { + Input = ".ppsx", + Output = ".otp" + }, + new + { + Input = ".ppsx", + Output = ".potm" + }, + new + { + Input = ".ppsx", + Output = ".potx" + }, + new + { + Input = ".ppsx", + Output = ".ppsm" + }, + new + { + Input = ".ppsx", + Output = ".pptm" + }, + new + { + Input = ".ppt", + Output = ".odp" + }, + new + { + Input = ".ppt", + Output = ".pdf" + }, + new + { + Input = ".ppt", + Output = ".pptx" + }, + new + { + Input = ".ppt", + Output = ".otp" + }, + new + { + Input = ".ppt", + Output = ".potm" + }, + new + { + Input = ".ppt", + Output = ".potx" + }, + new + { + Input = ".ppt", + Output = ".pptm" + }, + new + { + Input = ".ppt", + Output = ".ppsm" + }, + new + { + Input = ".ppt", + Output = ".ppsx" + }, + new + { + Input = ".pptm", + Output = ".odp" + }, + new + { + Input = ".pptm", + Output = ".pdf" + }, + new + { + Input = ".pptm", + Output = ".pptx" + }, + new + { + Input = ".pptm", + Output = ".otp" + }, + new + { + Input = ".pptm", + Output = ".potm" + }, + new + { + Input = ".pptm", + Output = ".potx" + }, + new + { + Input = ".pptm", + Output = ".ppsm" + }, + new + { + Input = ".pptm", + Output = ".ppsx" + }, + new + { + Input = ".pptt", + Output = ".pptx" + }, + new + { + Input = ".pptx", + Output = ".odp" + }, + new + { + Input = ".pptx", + Output = ".pdf" + }, + new + { + Input = ".pptx", + Output = ".otp" + }, + new + { + Input = ".pptx", + Output = ".potm" + }, + new + { + Input = ".pptx", + Output = ".potx" + }, + new + { + Input = ".pptx", + Output = ".pptm" + }, + new + { + Input = ".pptx", + Output = ".ppsm" + }, + new + { + Input = ".pptx", + Output = ".ppsx" + }, + new + { + Input = ".rtf", + Output = ".odt" + }, + new + { + Input = ".rtf", + Output = ".pdf" + }, + new + { + Input = ".rtf", + Output = ".docx" + }, + new + { + Input = ".rtf", + Output = ".txt" + }, + new + { + Input = ".rtf", + Output = ".docm" + }, + new + { + Input = ".rtf", + Output = ".dotm" + }, + new + { + Input = ".rtf", + Output = ".dotx" + }, + new + { + Input = ".rtf", + Output = ".epub" + }, + new + { + Input = ".rtf", + Output = ".fb2" + }, + new + { + Input = ".rtf", + Output = ".html" + }, + new + { + Input = ".rtf", + Output = ".ott" + }, + new + { + Input = ".stw", + Output = ".docm" + }, + new + { + Input = ".stw", + Output = ".docx" + }, + new + { + Input = ".stw", + Output = ".dotm" + }, + new + { + Input = ".stw", + Output = ".dotx" + }, + new + { + Input = ".stw", + Output = ".epub" + }, + new + { + Input = ".stw", + Output = ".fb2" + }, + new + { + Input = ".stw", + Output = ".html" + }, + new + { + Input = ".stw", + Output = ".odt" + }, + new + { + Input = ".stw", + Output = ".ott" + }, + new + { + Input = ".stw", + Output = ".pdf" + }, + new + { + Input = ".stw", + Output = ".rtf" + }, + new + { + Input = ".stw", + Output = ".txt" + }, + new + { + Input = ".sxc", + Output = ".csv" + }, + new + { + Input = ".sxc", + Output = ".ods" + }, + new + { + Input = ".sxc", + Output = ".ots" + }, + new + { + Input = ".sxc", + Output = ".pdf" + }, + new + { + Input = ".sxc", + Output = ".xlsm" + }, + new + { + Input = ".sxc", + Output = ".xlsx" + }, + new + { + Input = ".sxc", + Output = ".xltm" + }, + new + { + Input = ".sxc", + Output = ".xltx" + }, + new + { + Input = ".sxi", + Output = ".odp" + }, + new + { + Input = ".sxi", + Output = ".otp" + }, + new + { + Input = ".sxi", + Output = ".pdf" + }, + new + { + Input = ".sxi", + Output = ".potm" + }, + new + { + Input = ".sxi", + Output = ".potx" + }, + new + { + Input = ".sxi", + Output = ".ppsm" + }, + new + { + Input = ".sxi", + Output = ".ppsx" + }, + new + { + Input = ".sxi", + Output = ".pptm" + }, + new + { + Input = ".sxi", + Output = ".pptx" + }, + new + { + Input = ".sxw", + Output = ".docm" + }, + new + { + Input = ".sxw", + Output = ".docx" + }, + new + { + Input = ".sxw", + Output = ".dotm" + }, + new + { + Input = ".sxw", + Output = ".dotx" + }, + new + { + Input = ".sxw", + Output = ".epub" + }, + new + { + Input = ".sxw", + Output = ".fb2" + }, + new + { + Input = ".sxw", + Output = ".html" + }, + new + { + Input = ".sxw", + Output = ".odt" + }, + new + { + Input = ".sxw", + Output = ".ott" + }, + new + { + Input = ".sxw", + Output = ".pdf" + }, + new + { + Input = ".sxw", + Output = ".rtf" + }, + new + { + Input = ".sxw", + Output = ".txt" + }, + new + { + Input = ".txt", + Output = ".pdf" + }, + new + { + Input = ".txt", + Output = ".docx" + }, + new + { + Input = ".txt", + Output = ".odt" + }, + new + { + Input = ".txt", + Output = ".rtf" + }, + new + { + Input = ".txt", + Output = ".docm" + }, + new + { + Input = ".txt", + Output = ".dotm" + }, + new + { + Input = ".txt", + Output = ".dotx" + }, + new + { + Input = ".txt", + Output = ".epub" + }, + new + { + Input = ".txt", + Output = ".fb2" + }, + new + { + Input = ".txt", + Output = ".html" + }, + new + { + Input = ".txt", + Output = ".ott" + }, + new + { + Input = ".wps", + Output = ".docm" + }, + new + { + Input = ".wps", + Output = ".docx" + }, + new + { + Input = ".wps", + Output = ".dotm" + }, + new + { + Input = ".wps", + Output = ".dotx" + }, + new + { + Input = ".wps", + Output = ".epub" + }, + new + { + Input = ".wps", + Output = ".fb2" + }, + new + { + Input = ".wps", + Output = ".html" + }, + new + { + Input = ".wps", + Output = ".odt" + }, + new + { + Input = ".wps", + Output = ".ott" + }, + new + { + Input = ".wps", + Output = ".pdf" + }, + new + { + Input = ".wps", + Output = ".rtf" + }, + new + { + Input = ".wps", + Output = ".txt" + }, + new + { + Input = ".wpt", + Output = ".docm" + }, + new + { + Input = ".wpt", + Output = ".docx" + }, + new + { + Input = ".wpt", + Output = ".dotm" + }, + new + { + Input = ".wpt", + Output = ".dotx" + }, + new + { + Input = ".wpt", + Output = ".epub" + }, + new + { + Input = ".wpt", + Output = ".fb2" + }, + new + { + Input = ".wpt", + Output = ".html" + }, + new + { + Input = ".wpt", + Output = ".odt" + }, + new + { + Input = ".wpt", + Output = ".ott" + }, + new + { + Input = ".wpt", + Output = ".pdf" + }, + new + { + Input = ".wpt", + Output = ".rtf" + }, + new + { + Input = ".wpt", + Output = ".txt" + }, + new + { + Input = ".xls", + Output = ".csv" + }, + new + { + Input = ".xls", + Output = ".ods" + }, + new + { + Input = ".xls", + Output = ".pdf" + }, + new + { + Input = ".xls", + Output = ".xlsx" + }, + new + { + Input = ".xls", + Output = ".ots" + }, + new + { + Input = ".xls", + Output = ".xlsm" + }, + new + { + Input = ".xls", + Output = ".xltm" + }, + new + { + Input = ".xls", + Output = ".xltx" + }, + new + { + Input = ".xlsb", + Output = ".csv" + }, + new + { + Input = ".xlsb", + Output = ".ods" + }, + new + { + Input = ".xlsb", + Output = ".ots" + }, + new + { + Input = ".xlsb", + Output = ".pdf" + }, + new + { + Input = ".xlsb", + Output = ".xlsm" + }, + new + { + Input = ".xlsb", + Output = ".xlsx" + }, + new + { + Input = ".xlsb", + Output = ".xltm" + }, + new + { + Input = ".xlsb", + Output = ".xltx" + }, + new + { + Input = ".xlsm", + Output = ".csv" + }, + new + { + Input = ".xlsm", + Output = ".xltm" + }, + new + { + Input = ".xlsm", + Output = ".xltx" + }, + new + { + Input = ".xlsm", + Output = ".ots" + }, + new + { + Input = ".xlsm", + Output = ".pdf" + }, + new + { + Input = ".xlsm", + Output = ".ods" + }, + new + { + Input = ".xlsm", + Output = ".xlsx" + }, + new + { + Input = ".xlsx", + Output = ".csv" + }, + new + { + Input = ".xlsx", + Output = ".ods" + }, + new + { + Input = ".xlsx", + Output = ".ots" + }, + new + { + Input = ".xlsx", + Output = ".pdf" + }, + new + { + Input = ".xlsx", + Output = ".xlsm" + }, + new + { + Input = ".xlsx", + Output = ".xltm" + }, + new + { + Input = ".xlsx", + Output = ".xltx" + }, + new + { + Input = ".xlst", + Output = ".xlsx" + }, + new + { + Input = ".xlt", + Output = ".csv" + }, + new + { + Input = ".xlt", + Output = ".ods" + }, + new + { + Input = ".xlt", + Output = ".pdf" + }, + new + { + Input = ".xlt", + Output = ".xlsx" + }, + new + { + Input = ".xlt", + Output = ".ots" + }, + new + { + Input = ".xlt", + Output = ".xlsm" + }, + new + { + Input = ".xlt", + Output = ".xltm" + }, + new + { + Input = ".xlt", + Output = ".xltx" + }, + new + { + Input = ".xltm", + Output = ".csv" + }, + new + { + Input = ".xltm", + Output = ".ods" + }, + new + { + Input = ".xltm", + Output = ".pdf" + }, + new + { + Input = ".xltm", + Output = ".ots" + }, + new + { + Input = ".xltm", + Output = ".xlsm" + }, + new + { + Input = ".xltm", + Output = ".xltx" + }, + new + { + Input = ".xltm", + Output = ".xlsx" + }, + new + { + Input = ".xltx", + Output = ".pdf" + }, + new + { + Input = ".xltx", + Output = ".csv" + }, + new + { + Input = ".xltx", + Output = ".ods" + }, + new + { + Input = ".xltx", + Output = ".ots" + }, + new + { + Input = ".xltx", + Output = ".xlsm" + }, + new + { + Input = ".xltx", + Output = ".xltm" + }, + new + { + Input = ".xltx", + Output = ".xlsx" + }, + new + { + Input = ".xml", + Output = ".docm" + }, + new + { + Input = ".xml", + Output = ".docx" + }, + new + { + Input = ".xml", + Output = ".dotm" + }, + new + { + Input = ".xml", + Output = ".dotx" + }, + new + { + Input = ".xml", + Output = ".epub" + }, + new + { + Input = ".xml", + Output = ".fb2" + }, + new + { + Input = ".xml", + Output = ".html" + }, + new + { + Input = ".xml", + Output = ".odt" + }, + new + { + Input = ".xml", + Output = ".ott" + }, + new + { + Input = ".xml", + Output = ".pdf" + }, + new + { + Input = ".xml", + Output = ".rtf" + }, + new + { + Input = ".xml", + Output = ".txt" + }, + new + { + Input = ".xps", + Output = ".docm" + }, + new + { + Input = ".xps", + Output = ".docx" + }, + new + { + Input = ".xps", + Output = ".dotm" + }, + new + { + Input = ".xps", + Output = ".dotx" + }, + new + { + Input = ".xps", + Output = ".epub" + }, + new + { + Input = ".xps", + Output = ".fb2" + }, + new + { + Input = ".xps", + Output = ".html" + }, + new + { + Input = ".xps", + Output = ".odt" + }, + new + { + Input = ".xps", + Output = ".ott" + }, + new + { + Input = ".xps", + Output = ".pdf" + }, + new + { + Input = ".xps", + Output = ".rtf" + }, + new + { + Input = ".xps", + Output = ".txt" + }); + }); + + modelBuilder.Entity("ASC.Core.Common.EF.Model.MobileAppInstall", b => + { + b.Property("UserEmail") + .HasColumnType("varchar(255)") + .HasColumnName("user_email") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("AppType") + .HasColumnType("int") + .HasColumnName("app_type"); + + b.Property("LastSign") + .ValueGeneratedOnAdd() + .HasColumnType("datetime") + .HasColumnName("last_sign") + .HasDefaultValueSql("NULL"); + + b.Property("RegisteredOn") + .HasColumnType("datetime") + .HasColumnName("registered_on"); + + b.HasKey("UserEmail", "AppType") + .HasName("PRIMARY"); + + b.ToTable("mobile_app_install", (string)null); + + b.HasAnnotation("MySql:CharSet", "utf8"); + }); + + modelBuilder.Entity("ASC.Core.Common.EF.Model.NotifyInfo", b => + { + b.Property("NotifyId") + .HasColumnType("int") + .HasColumnName("notify_id"); + + b.Property("Attempts") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasColumnName("attempts") + .HasDefaultValueSql("'0'"); + + b.Property("ModifyDate") + .HasColumnType("datetime") + .HasColumnName("modify_date"); + + b.Property("Priority") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasColumnName("priority") + .HasDefaultValueSql("'0'"); + + b.Property("State") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasColumnName("state") + .HasDefaultValueSql("'0'"); + + b.HasKey("NotifyId") + .HasName("PRIMARY"); + + b.HasIndex("State") + .HasDatabaseName("state"); + + b.ToTable("notify_info", (string)null); + + b.HasAnnotation("MySql:CharSet", "utf8"); + }); + + modelBuilder.Entity("ASC.Core.Common.EF.Model.NotifyQueue", b => + { + b.Property("NotifyId") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasColumnName("notify_id"); + + b.Property("Attachments") + .HasColumnType("text") + .HasColumnName("attachments") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("AutoSubmitted") + .HasColumnType("varchar(64)") + .HasColumnName("auto_submitted") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("Content") + .HasColumnType("text") + .HasColumnName("content") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("ContentType") + .HasColumnType("varchar(64)") + .HasColumnName("content_type") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("CreationDate") + .HasColumnType("datetime") + .HasColumnName("creation_date"); + + b.Property("Reciever") + .HasColumnType("varchar(255)") + .HasColumnName("reciever") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("ReplyTo") + .HasColumnType("varchar(1024)") + .HasColumnName("reply_to") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("Sender") + .HasColumnType("varchar(255)") + .HasColumnName("sender") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("SenderType") + .HasColumnType("varchar(64)") + .HasColumnName("sender_type") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("Subject") + .HasColumnType("varchar(1024)") + .HasColumnName("subject") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("TenantId") + .HasColumnType("int") + .HasColumnName("tenant_id"); + + b.HasKey("NotifyId") + .HasName("PRIMARY"); + + b.HasIndex("CreationDate") + .HasDatabaseName("creation_date"); + + b.HasIndex("TenantId"); + + b.ToTable("notify_queue", (string)null); + + b.HasAnnotation("MySql:CharSet", "utf8"); + }); + + modelBuilder.Entity("ASC.Core.Common.EF.Model.Regions", b => + { + b.Property("Region") + .HasColumnType("varchar(255)"); + + b.Property("ConnectionString") + .HasColumnType("longtext"); + + b.Property("Provider") + .HasColumnType("longtext"); + + b.HasKey("Region"); + + b.ToTable("Regions"); + + b.HasAnnotation("MySql:CharSet", "utf8"); + }); + + modelBuilder.Entity("ASC.Core.Common.EF.Model.ShortLink", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint(19)") + .HasColumnName("id"); + + b.Property("Link") + .HasColumnType("text") + .HasColumnName("link") + .UseCollation("utf8_bin"); + + b.Property("Short") + .HasColumnType("varchar(12)") + .HasColumnName("short") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.HasKey("Id") + .HasName("PRIMARY"); + + b.HasIndex("Short") + .IsUnique(); + + b.ToTable("short_links", (string)null); + + b + .HasAnnotation("MySql:CharSet", "utf8") + .HasAnnotation("Relational:Collation", "utf8_general_ci"); + }); + + modelBuilder.Entity("ASC.Core.Common.EF.Model.TelegramUser", b => + { + b.Property("TenantId") + .HasColumnType("int") + .HasColumnName("tenant_id"); + + b.Property("PortalUserId") + .HasColumnType("varchar(38)") + .HasColumnName("portal_user_id") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("TelegramUserId") + .HasColumnType("int") + .HasColumnName("telegram_user_id"); + + b.HasKey("TenantId", "PortalUserId") + .HasName("PRIMARY"); + + b.HasIndex("TelegramUserId") + .HasDatabaseName("tgId"); + + b.ToTable("telegram_users", (string)null); + + b.HasAnnotation("MySql:CharSet", "utf8"); + }); + + modelBuilder.Entity("ASC.Core.Common.EF.Model.TenantIpRestrictions", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasColumnName("id"); + + b.Property("ForAdmin") + .HasColumnType("TINYINT(1)") + .HasColumnName("for_admin"); + + b.Property("Ip") + .IsRequired() + .HasColumnType("varchar(50)") + .HasColumnName("ip") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("TenantId") + .HasColumnType("int") + .HasColumnName("tenant"); + + b.HasKey("Id"); + + b.HasIndex("TenantId") + .HasDatabaseName("tenant"); + + b.ToTable("tenants_iprestrictions", (string)null); + + b.HasAnnotation("MySql:CharSet", "utf8"); + }); + + modelBuilder.Entity("ASC.Core.Common.EF.Subscription", b => + { + b.Property("TenantId") + .HasColumnType("int") + .HasColumnName("tenant"); + + b.Property("Source") + .HasColumnType("varchar(38)") + .HasColumnName("source") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("Action") + .HasColumnType("varchar(128)") + .HasColumnName("action") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("Recipient") + .HasColumnType("varchar(38)") + .HasColumnName("recipient") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("Object") + .HasColumnType("varchar(128)") + .HasColumnName("object") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("Unsubscribed") + .ValueGeneratedOnAdd() + .HasColumnType("tinyint(1)") + .HasColumnName("unsubscribed") + .HasDefaultValueSql("'0'"); + + b.HasKey("TenantId", "Source", "Action", "Recipient", "Object") + .HasName("PRIMARY"); + + b.ToTable("core_subscription", (string)null); + + b.HasAnnotation("MySql:CharSet", "utf8"); + + b.HasData( + new + { + TenantId = -1, + Source = "asc.web.studio", + Action = "send_whats_new", + Recipient = "c5cc67d1-c3e8-43c0-a3ad-3928ae3e5b5e", + Object = "", + Unsubscribed = false + }, + new + { + TenantId = -1, + Source = "asc.web.studio", + Action = "rooms_activity", + Recipient = "c5cc67d1-c3e8-43c0-a3ad-3928ae3e5b5e", + Object = "", + Unsubscribed = false + }, + new + { + TenantId = -1, + Source = "6504977c-75af-4691-9099-084d3ddeea04", + Action = "new feed", + Recipient = "c5cc67d1-c3e8-43c0-a3ad-3928ae3e5b5e", + Object = "", + Unsubscribed = false + }, + new + { + TenantId = -1, + Source = "6a598c74-91ae-437d-a5f4-ad339bd11bb2", + Action = "new post", + Recipient = "c5cc67d1-c3e8-43c0-a3ad-3928ae3e5b5e", + Object = "", + Unsubscribed = false + }, + new + { + TenantId = -1, + Source = "853b6eb9-73ee-438d-9b09-8ffeedf36234", + Action = "new topic in forum", + Recipient = "c5cc67d1-c3e8-43c0-a3ad-3928ae3e5b5e", + Object = "", + Unsubscribed = false + }, + new + { + TenantId = -1, + Source = "9d51954f-db9b-4aed-94e3-ed70b914e101", + Action = "new photo uploaded", + Recipient = "c5cc67d1-c3e8-43c0-a3ad-3928ae3e5b5e", + Object = "", + Unsubscribed = false + }, + new + { + TenantId = -1, + Source = "28b10049-dd20-4f54-b986-873bc14ccfc7", + Action = "new bookmark created", + Recipient = "c5cc67d1-c3e8-43c0-a3ad-3928ae3e5b5e", + Object = "", + Unsubscribed = false + }, + new + { + TenantId = -1, + Source = "742cf945-cbbc-4a57-82d6-1600a12cf8ca", + Action = "new wiki page", + Recipient = "c5cc67d1-c3e8-43c0-a3ad-3928ae3e5b5e", + Object = "", + Unsubscribed = false + }, + new + { + TenantId = -1, + Source = "37620ae5-c40b-45ce-855a-39dd7d76a1fa", + Action = "BirthdayReminder", + Recipient = "abef62db-11a8-4673-9d32-ef1d8af19dc0", + Object = "", + Unsubscribed = false + }, + new + { + TenantId = -1, + Source = "6fe286a4-479e-4c25-a8d9-0156e332b0c0", + Action = "sharedocument", + Recipient = "c5cc67d1-c3e8-43c0-a3ad-3928ae3e5b5e", + Object = "", + Unsubscribed = false + }, + new + { + TenantId = -1, + Source = "6fe286a4-479e-4c25-a8d9-0156e332b0c0", + Action = "sharefolder", + Recipient = "c5cc67d1-c3e8-43c0-a3ad-3928ae3e5b5e", + Object = "", + Unsubscribed = false + }, + new + { + TenantId = -1, + Source = "40650da3-f7c1-424c-8c89-b9c115472e08", + Action = "calendar_sharing", + Recipient = "c5cc67d1-c3e8-43c0-a3ad-3928ae3e5b5e", + Object = "", + Unsubscribed = false + }, + new + { + TenantId = -1, + Source = "40650da3-f7c1-424c-8c89-b9c115472e08", + Action = "event_alert", + Recipient = "c5cc67d1-c3e8-43c0-a3ad-3928ae3e5b5e", + Object = "", + Unsubscribed = false + }, + new + { + TenantId = -1, + Source = "asc.web.studio", + Action = "admin_notify", + Recipient = "cd84e66b-b803-40fc-99f9-b2969a54a1de", + Object = "", + Unsubscribed = false + }, + new + { + TenantId = -1, + Source = "13ff36fb-0272-4887-b416-74f52b0d0b02", + Action = "SetAccess", + Recipient = "abef62db-11a8-4673-9d32-ef1d8af19dc0", + Object = "", + Unsubscribed = false + }, + new + { + TenantId = -1, + Source = "13ff36fb-0272-4887-b416-74f52b0d0b02", + Action = "ResponsibleForTask", + Recipient = "abef62db-11a8-4673-9d32-ef1d8af19dc0", + Object = "", + Unsubscribed = false + }, + new + { + TenantId = -1, + Source = "13ff36fb-0272-4887-b416-74f52b0d0b02", + Action = "AddRelationshipEvent", + Recipient = "abef62db-11a8-4673-9d32-ef1d8af19dc0", + Object = "", + Unsubscribed = false + }, + new + { + TenantId = -1, + Source = "13ff36fb-0272-4887-b416-74f52b0d0b02", + Action = "ExportCompleted", + Recipient = "abef62db-11a8-4673-9d32-ef1d8af19dc0", + Object = "", + Unsubscribed = false + }, + new + { + TenantId = -1, + Source = "13ff36fb-0272-4887-b416-74f52b0d0b02", + Action = "CreateNewContact", + Recipient = "abef62db-11a8-4673-9d32-ef1d8af19dc0", + Object = "", + Unsubscribed = false + }, + new + { + TenantId = -1, + Source = "13ff36fb-0272-4887-b416-74f52b0d0b02", + Action = "ResponsibleForOpportunity", + Recipient = "abef62db-11a8-4673-9d32-ef1d8af19dc0", + Object = "", + Unsubscribed = false + }, + new + { + TenantId = -1, + Source = "asc.web.studio", + Action = "periodic_notify", + Recipient = "c5cc67d1-c3e8-43c0-a3ad-3928ae3e5b5e", + Object = "", + Unsubscribed = false + }); + }); + + modelBuilder.Entity("ASC.Core.Common.EF.User", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("varchar(38)") + .HasColumnName("id") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("ActivationStatus") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasColumnName("activation_status") + .HasDefaultValueSql("'0'"); + + b.Property("BirthDate") + .HasColumnType("datetime") + .HasColumnName("bithdate"); + + b.Property("Contacts") + .HasColumnType("varchar(1024)") + .HasColumnName("contacts") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("CreateDate") + .HasColumnType("timestamp") + .HasColumnName("create_on"); + + b.Property("CultureName") + .HasColumnType("varchar(20)") + .HasColumnName("culture") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("Email") + .HasColumnType("varchar(255)") + .HasColumnName("email") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("FirstName") + .IsRequired() + .HasColumnType("varchar(64)") + .HasColumnName("firstname") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("LastModified") + .HasColumnType("datetime") + .HasColumnName("last_modified"); + + b.Property("LastName") + .IsRequired() + .HasColumnType("varchar(64)") + .HasColumnName("lastname") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("Location") + .HasColumnType("varchar(255)") + .HasColumnName("location") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("MobilePhone") + .HasColumnType("varchar(255)") + .HasColumnName("phone") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("MobilePhoneActivation") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasColumnName("phone_activation") + .HasDefaultValueSql("'0'"); + + b.Property("Notes") + .HasColumnType("varchar(512)") + .HasColumnName("notes") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("Removed") + .ValueGeneratedOnAdd() + .HasColumnType("tinyint(1)") + .HasColumnName("removed") + .HasDefaultValueSql("'0'"); + + b.Property("Sex") + .HasColumnType("tinyint(1)") + .HasColumnName("sex"); + + b.Property("Sid") + .HasColumnType("varchar(512)") + .HasColumnName("sid") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("SsoNameId") + .HasColumnType("varchar(512)") + .HasColumnName("sso_name_id") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("SsoSessionId") + .HasColumnType("varchar(512)") + .HasColumnName("sso_session_id") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("Status") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasColumnName("status") + .HasDefaultValueSql("'1'"); + + b.Property("TenantId") + .HasColumnType("int") + .HasColumnName("tenant"); + + b.Property("TerminatedDate") + .HasColumnType("datetime") + .HasColumnName("terminateddate"); + + b.Property("Title") + .HasColumnType("varchar(64)") + .HasColumnName("title") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("UserName") + .IsRequired() + .HasColumnType("varchar(255)") + .HasColumnName("username") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("WorkFromDate") + .HasColumnType("datetime") + .HasColumnName("workfromdate"); + + b.HasKey("Id") + .HasName("PRIMARY"); + + b.HasIndex("Email") + .HasDatabaseName("email"); + + b.HasIndex("LastModified") + .HasDatabaseName("last_modified"); + + b.HasIndex("TenantId", "UserName") + .HasDatabaseName("username"); + + b.ToTable("core_user", (string)null); + + b.HasAnnotation("MySql:CharSet", "utf8"); + + b.HasData( + new + { + Id = "66faa6e4-f133-11ea-b126-00ffeec8b4ef", + ActivationStatus = 0, + CreateDate = new DateTime(2022, 7, 8, 0, 0, 0, 0, DateTimeKind.Unspecified), + Email = "", + FirstName = "Administrator", + LastModified = new DateTime(2021, 3, 9, 9, 52, 55, 765, DateTimeKind.Utc).AddTicks(1420), + LastName = "", + MobilePhoneActivation = 0, + Removed = false, + Status = 1, + TenantId = 1, + UserName = "administrator", + WorkFromDate = new DateTime(2021, 3, 9, 9, 52, 55, 764, DateTimeKind.Utc).AddTicks(9157) + }); + }); + + modelBuilder.Entity("ASC.Core.Common.EF.UserDav", b => + { + b.Property("TenantId") + .HasColumnType("int") + .HasColumnName("tenant_id"); + + b.Property("UserId") + .HasColumnType("varchar(38)") + .HasColumnName("user_id") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.HasKey("TenantId", "UserId") + .HasName("PRIMARY"); + + b.ToTable("core_userdav", (string)null); + }); + + modelBuilder.Entity("ASC.Core.Common.EF.UserGroup", b => + { + b.Property("TenantId") + .HasColumnType("int") + .HasColumnName("tenant"); + + b.Property("Userid") + .HasColumnType("varchar(38)") + .HasColumnName("userid") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("UserGroupId") + .HasColumnType("varchar(38)") + .HasColumnName("groupid") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("RefType") + .HasColumnType("int") + .HasColumnName("ref_type"); + + b.Property("LastModified") + .HasColumnType("timestamp") + .HasColumnName("last_modified"); + + b.Property("Removed") + .ValueGeneratedOnAdd() + .HasColumnType("tinyint(1)") + .HasColumnName("removed") + .HasDefaultValueSql("'0'"); + + b.HasKey("TenantId", "Userid", "UserGroupId", "RefType") + .HasName("PRIMARY"); + + b.HasIndex("LastModified") + .HasDatabaseName("last_modified"); + + b.ToTable("core_usergroup", (string)null); + + b.HasAnnotation("MySql:CharSet", "utf8"); + + b.HasData( + new + { + TenantId = 1, + Userid = "66faa6e4-f133-11ea-b126-00ffeec8b4ef", + UserGroupId = "cd84e66b-b803-40fc-99f9-b2969a54a1de", + RefType = 0, + LastModified = new DateTime(2022, 7, 8, 0, 0, 0, 0, DateTimeKind.Unspecified), + Removed = false + }); + }); + + modelBuilder.Entity("ASC.Core.Common.EF.UserPhoto", b => + { + b.Property("UserId") + .ValueGeneratedOnAdd() + .HasColumnType("varchar(38)") + .HasColumnName("userid") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("Photo") + .IsRequired() + .HasColumnType("mediumblob") + .HasColumnName("photo"); + + b.Property("TenantId") + .HasColumnType("int") + .HasColumnName("tenant"); + + b.HasKey("UserId") + .HasName("PRIMARY"); + + b.HasIndex("TenantId") + .HasDatabaseName("tenant"); + + b.ToTable("core_userphoto", (string)null); + + b.HasAnnotation("MySql:CharSet", "utf8"); + }); + + modelBuilder.Entity("ASC.Core.Common.EF.UserSecurity", b => + { + b.Property("UserId") + .ValueGeneratedOnAdd() + .HasColumnType("varchar(38)") + .HasColumnName("userid") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("LastModified") + .IsRequired() + .HasColumnType("timestamp"); + + b.Property("PwdHash") + .HasColumnType("varchar(512)") + .HasColumnName("pwdhash") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("TenantId") + .HasColumnType("int") + .HasColumnName("tenant"); + + b.HasKey("UserId") + .HasName("PRIMARY"); + + b.HasIndex("PwdHash") + .HasDatabaseName("pwdhash"); + + b.HasIndex("TenantId") + .HasDatabaseName("tenant"); + + b.ToTable("core_usersecurity", (string)null); + + b.HasAnnotation("MySql:CharSet", "utf8"); + + b.HasData( + new + { + UserId = "66faa6e4-f133-11ea-b126-00ffeec8b4ef", + LastModified = new DateTime(2022, 7, 8, 0, 0, 0, 0, DateTimeKind.Unspecified), + PwdHash = "jGl25bVBBBW96Qi9Te4V37Fnqchz/Eu4qB9vKrRIqRg=", + TenantId = 1 + }); + }); + + modelBuilder.Entity("ASC.Core.Common.Hosting.InstanceRegistration", b => + { + b.Property("InstanceRegistrationId") + .HasColumnType("varchar(255)") + .HasColumnName("instance_registration_id") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("IsActive") + .HasColumnType("tinyint(4)") + .HasColumnName("is_active"); + + b.Property("LastUpdated") + .HasColumnType("datetime") + .HasColumnName("last_updated"); + + b.Property("WorkerTypeName") + .IsRequired() + .HasColumnType("varchar(255)") + .HasColumnName("worker_type_name") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.HasKey("InstanceRegistrationId") + .HasName("PRIMARY"); + + b.HasIndex("WorkerTypeName") + .HasDatabaseName("worker_type_name"); + + b.ToTable("hosting_instance_registration", (string)null); + }); + + modelBuilder.Entity("ASC.Data.Backup.EF.Model.BackupRecord", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(38)") + .HasColumnName("id") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("CreatedOn") + .HasColumnType("datetime") + .HasColumnName("created_on"); + + b.Property("ExpiresOn") + .ValueGeneratedOnAdd() + .HasColumnType("datetime") + .HasColumnName("expires_on") + .HasDefaultValueSql("'0001-01-01 00:00:00'"); + + b.Property("Hash") + .IsRequired() + .HasColumnType("varchar(64)") + .HasColumnName("hash") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("IsScheduled") + .HasColumnType("tinyint(1)") + .HasColumnName("is_scheduled"); + + b.Property("Name") + .IsRequired() + .HasColumnType("varchar(255)") + .HasColumnName("name") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("Removed") + .HasColumnType("tinyint(1)") + .HasColumnName("removed"); + + b.Property("StorageBasePath") + .ValueGeneratedOnAdd() + .HasColumnType("varchar(255)") + .HasColumnName("storage_base_path") + .HasDefaultValueSql("NULL") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("StorageParams") + .ValueGeneratedOnAdd() + .HasColumnType("text") + .HasColumnName("storage_params") + .HasDefaultValueSql("NULL") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("StoragePath") + .IsRequired() + .HasColumnType("varchar(255)") + .HasColumnName("storage_path") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("StorageType") + .HasColumnType("int(10)") + .HasColumnName("storage_type"); + + b.Property("TenantId") + .HasColumnType("int(10)") + .HasColumnName("tenant_id"); + + b.HasKey("Id") + .HasName("PRIMARY"); + + b.HasIndex("ExpiresOn") + .HasDatabaseName("expires_on"); + + b.HasIndex("IsScheduled") + .HasDatabaseName("is_scheduled"); + + b.HasIndex("TenantId") + .HasDatabaseName("tenant_id"); + + b.ToTable("backup_backup", (string)null); + + b.HasAnnotation("MySql:CharSet", "utf8"); + }); + + modelBuilder.Entity("ASC.Data.Backup.EF.Model.BackupSchedule", b => + { + b.Property("TenantId") + .HasColumnType("int(10)") + .HasColumnName("tenant_id"); + + b.Property("BackupsStored") + .HasColumnType("int(10)") + .HasColumnName("backups_stored"); + + b.Property("Cron") + .IsRequired() + .HasColumnType("varchar(255)") + .HasColumnName("cron") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("LastBackupTime") + .HasColumnType("datetime") + .HasColumnName("last_backup_time"); + + b.Property("StorageBasePath") + .ValueGeneratedOnAdd() + .HasColumnType("varchar(255)") + .HasColumnName("storage_base_path") + .HasDefaultValueSql("NULL") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("StorageParams") + .ValueGeneratedOnAdd() + .HasColumnType("text") + .HasColumnName("storage_params") + .HasDefaultValueSql("NULL") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("StorageType") + .HasColumnType("int(10)") + .HasColumnName("storage_type"); + + b.HasKey("TenantId") + .HasName("PRIMARY"); + + b.ToTable("backup_schedule", (string)null); + + b.HasAnnotation("MySql:CharSet", "utf8"); + }); + + modelBuilder.Entity("ASC.EventBus.Extensions.Logger.IntegrationEventLogEntry", b => + { + b.Property("EventId") + .ValueGeneratedOnAdd() + .HasColumnType("char(38)") + .HasColumnName("event_id") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("Content") + .IsRequired() + .HasColumnType("text") + .HasColumnName("content") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("CreateBy") + .IsRequired() + .HasColumnType("char(38)") + .HasColumnName("create_by") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("CreateOn") + .HasColumnType("datetime") + .HasColumnName("create_on"); + + b.Property("EventTypeName") + .IsRequired() + .HasColumnType("varchar(255)") + .HasColumnName("event_type_name") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("State") + .HasColumnType("int(11)") + .HasColumnName("state"); + + b.Property("TenantId") + .HasColumnType("int(11)") + .HasColumnName("tenant_id"); + + b.Property("TimesSent") + .HasColumnType("int(11)") + .HasColumnName("times_sent"); + + b.Property("TransactionId") + .HasColumnType("longtext"); + + b.HasKey("EventId") + .HasName("PRIMARY"); + + b.HasIndex("TenantId") + .HasDatabaseName("tenant_id"); + + b.ToTable("event_bus_integration_event_log", (string)null); + + b.HasAnnotation("MySql:CharSet", "utf8"); + }); + + modelBuilder.Entity("ASC.Feed.Model.FeedAggregate", b => + { + b.Property("Id") + .HasColumnType("varchar(88)") + .HasColumnName("id") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("AggregateDate") + .HasColumnType("datetime") + .HasColumnName("aggregated_date"); + + b.Property("Author") + .IsRequired() + .HasColumnType("char(38)") + .HasColumnName("author") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("ContextId") + .HasColumnType("text") + .HasColumnName("context_id") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("CreatedDate") + .HasColumnType("datetime") + .HasColumnName("created_date"); + + b.Property("GroupId") + .HasColumnType("varchar(70)") + .HasColumnName("group_id") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("Json") + .IsRequired() + .HasColumnType("mediumtext") + .HasColumnName("json") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("Keywords") + .HasColumnType("text") + .HasColumnName("keywords") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("ModifiedBy") + .IsRequired() + .HasColumnType("char(38)") + .HasColumnName("modified_by") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("ModifiedDate") + .HasColumnType("datetime") + .HasColumnName("modified_date"); + + b.Property("Module") + .IsRequired() + .HasColumnType("varchar(50)") + .HasColumnName("module") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("Product") + .IsRequired() + .HasColumnType("varchar(50)") + .HasColumnName("product") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("TenantId") + .HasColumnType("int") + .HasColumnName("tenant"); + + b.HasKey("Id"); + + b.HasIndex("TenantId", "AggregateDate") + .HasDatabaseName("aggregated_date"); + + b.HasIndex("TenantId", "ModifiedDate") + .HasDatabaseName("modified_date"); + + b.HasIndex("TenantId", "Product") + .HasDatabaseName("product"); + + b.ToTable("feed_aggregate", (string)null); + + b.HasAnnotation("MySql:CharSet", "utf8"); + }); + + modelBuilder.Entity("ASC.Feed.Model.FeedLast", b => + { + b.Property("LastKey") + .HasColumnType("varchar(128)") + .HasColumnName("last_key") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("LastDate") + .HasColumnType("datetime") + .HasColumnName("last_date"); + + b.HasKey("LastKey") + .HasName("PRIMARY"); + + b.ToTable("feed_last", (string)null); + + b.HasAnnotation("MySql:CharSet", "utf8"); + }); + + modelBuilder.Entity("ASC.Feed.Model.FeedReaded", b => + { + b.Property("TenantId") + .HasColumnType("int") + .HasColumnName("tenant_id"); + + b.Property("UserId") + .HasColumnType("varchar(38)") + .HasColumnName("user_id") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("Module") + .HasColumnType("varchar(50)") + .HasColumnName("module") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("TimeStamp") + .HasColumnType("datetime") + .HasColumnName("timestamp"); + + b.HasKey("TenantId", "UserId", "Module") + .HasName("PRIMARY"); + + b.ToTable("feed_readed", (string)null); + + b.HasAnnotation("MySql:CharSet", "utf8"); + }); + + modelBuilder.Entity("ASC.Feed.Model.FeedUsers", b => + { + b.Property("FeedId") + .HasColumnType("varchar(88)") + .HasColumnName("feed_id") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("UserId") + .HasColumnType("char(38)") + .HasColumnName("user_id") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.HasKey("FeedId", "UserId") + .HasName("PRIMARY"); + + b.HasIndex("UserId") + .HasDatabaseName("user_id"); + + b.ToTable("feed_users", (string)null); + + b.HasAnnotation("MySql:CharSet", "utf8"); + }); + + modelBuilder.Entity("ASC.Files.Core.EF.DbFile", b => + { + b.Property("TenantId") + .HasColumnType("int") + .HasColumnName("tenant_id"); + + b.Property("Id") + .HasColumnType("int") + .HasColumnName("id"); + + b.Property("Version") + .HasColumnType("int") + .HasColumnName("version"); + + b.Property("Category") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasColumnName("category") + .HasDefaultValueSql("'0'"); + + b.Property("Changes") + .HasColumnType("mediumtext") + .HasColumnName("changes") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("Comment") + .HasColumnType("varchar(255)") + .HasColumnName("comment") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("ContentLength") + .ValueGeneratedOnAdd() + .HasColumnType("bigint") + .HasColumnName("content_length") + .HasDefaultValueSql("'0'"); + + b.Property("ConvertedType") + .HasColumnType("varchar(10)") + .HasColumnName("converted_type") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("CreateBy") + .IsRequired() + .HasColumnType("char(38)") + .HasColumnName("create_by") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("CreateOn") + .HasColumnType("datetime") + .HasColumnName("create_on"); + + b.Property("CurrentVersion") + .ValueGeneratedOnAdd() + .HasColumnType("tinyint(1)") + .HasColumnName("current_version") + .HasDefaultValueSql("'0'"); + + b.Property("Encrypted") + .ValueGeneratedOnAdd() + .HasColumnType("tinyint(1)") + .HasColumnName("encrypted") + .HasDefaultValueSql("'0'"); + + b.Property("FileStatus") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasColumnName("file_status") + .HasDefaultValueSql("'0'"); + + b.Property("Forcesave") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasColumnName("forcesave") + .HasDefaultValueSql("'0'"); + + b.Property("ModifiedBy") + .IsRequired() + .HasColumnType("char(38)") + .HasColumnName("modified_by") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("ModifiedOn") + .HasColumnType("datetime") + .HasColumnName("modified_on"); + + b.Property("ParentId") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasColumnName("folder_id") + .HasDefaultValueSql("'0'"); + + b.Property("ThumbnailStatus") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasColumnName("thumb") + .HasDefaultValueSql("'0'"); + + b.Property("Title") + .IsRequired() + .HasColumnType("varchar(400)") + .HasColumnName("title") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("VersionGroup") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasColumnName("version_group") + .HasDefaultValueSql("'1'"); + + b.HasKey("TenantId", "Id", "Version") + .HasName("PRIMARY"); + + b.HasIndex("Id") + .HasDatabaseName("id"); + + b.HasIndex("ModifiedOn") + .HasDatabaseName("modified_on"); + + b.HasIndex("ParentId") + .HasDatabaseName("folder_id"); + + b.HasIndex("TenantId", "ParentId", "ContentLength") + .HasDatabaseName("tenant_id_folder_id_content_length"); + + b.HasIndex("TenantId", "ParentId", "ModifiedOn") + .HasDatabaseName("tenant_id_folder_id_modified_on"); + + b.HasIndex("TenantId", "ParentId", "Title") + .HasDatabaseName("tenant_id_folder_id_title"); + + b.ToTable("files_file", (string)null); + + b.HasAnnotation("MySql:CharSet", "utf8"); + }); + + modelBuilder.Entity("ASC.Files.Core.EF.DbFilesBunchObjects", b => + { + b.Property("TenantId") + .HasColumnType("int") + .HasColumnName("tenant_id"); + + b.Property("RightNode") + .HasColumnType("varchar(255)") + .HasColumnName("right_node") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("LeftNode") + .IsRequired() + .HasColumnType("varchar(255)") + .HasColumnName("left_node") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.HasKey("TenantId", "RightNode") + .HasName("PRIMARY"); + + b.HasIndex("LeftNode") + .HasDatabaseName("left_node"); + + b.ToTable("files_bunch_objects", (string)null); + + b.HasAnnotation("MySql:CharSet", "utf8"); + }); + + modelBuilder.Entity("ASC.Files.Core.EF.DbFilesLink", b => + { + b.Property("TenantId") + .HasColumnType("int") + .HasColumnName("tenant_id"); + + b.Property("SourceId") + .HasColumnType("varchar(32)") + .HasColumnName("source_id") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("LinkedId") + .HasColumnType("varchar(32)") + .HasColumnName("linked_id") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("LinkedFor") + .IsRequired() + .HasColumnType("char(38)") + .HasColumnName("linked_for") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.HasKey("TenantId", "SourceId", "LinkedId") + .HasName("PRIMARY"); + + b.HasIndex("TenantId", "SourceId", "LinkedId", "LinkedFor") + .HasDatabaseName("linked_for"); + + b.ToTable("files_link", (string)null); + + b.HasAnnotation("MySql:CharSet", "utf8"); + }); + + modelBuilder.Entity("ASC.Files.Core.EF.DbFilesProperties", b => + { + b.Property("TenantId") + .HasColumnType("int") + .HasColumnName("tenant_id"); + + b.Property("EntryId") + .HasColumnType("varchar(32)") + .HasColumnName("entry_id") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("Data") + .HasColumnType("mediumtext") + .HasColumnName("data") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.HasKey("TenantId", "EntryId") + .HasName("PRIMARY"); + + b.ToTable("files_properties", (string)null); + }); + + modelBuilder.Entity("ASC.Files.Core.EF.DbFilesSecurity", b => + { + b.Property("TenantId") + .HasColumnType("int") + .HasColumnName("tenant_id"); + + b.Property("EntryId") + .HasColumnType("varchar(50)") + .HasColumnName("entry_id") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("EntryType") + .HasColumnType("int") + .HasColumnName("entry_type"); + + b.Property("Subject") + .HasColumnType("char(38)") + .HasColumnName("subject") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("Options") + .HasColumnType("text") + .HasColumnName("options") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("Owner") + .IsRequired() + .HasColumnType("char(38)") + .HasColumnName("owner") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("Share") + .HasColumnType("int") + .HasColumnName("security"); + + b.Property("SubjectType") + .HasColumnType("int") + .HasColumnName("subject_type"); + + b.Property("TimeStamp") + .HasColumnType("timestamp") + .HasColumnName("timestamp"); + + b.HasKey("TenantId", "EntryId", "EntryType", "Subject") + .HasName("PRIMARY"); + + b.HasIndex("Owner") + .HasDatabaseName("owner"); + + b.HasIndex("TenantId", "EntryType", "EntryId", "Owner") + .HasDatabaseName("tenant_id"); + + b.ToTable("files_security", (string)null); + + b.HasAnnotation("MySql:CharSet", "utf8"); + }); + + modelBuilder.Entity("ASC.Files.Core.EF.DbFilesTag", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasColumnName("id"); + + b.Property("Name") + .IsRequired() + .HasColumnType("varchar(255)") + .HasColumnName("name") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("Owner") + .IsRequired() + .HasColumnType("varchar(38)") + .HasColumnName("owner") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("TenantId") + .HasColumnType("int") + .HasColumnName("tenant_id"); + + b.Property("Type") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasColumnName("flag") + .HasDefaultValueSql("'0'"); + + b.HasKey("Id"); + + b.HasIndex("TenantId", "Owner", "Name", "Type") + .HasDatabaseName("name"); + + b.ToTable("files_tag", (string)null); + + b.HasAnnotation("MySql:CharSet", "utf8"); + }); + + modelBuilder.Entity("ASC.Files.Core.EF.DbFilesTagLink", b => + { + b.Property("TenantId") + .HasColumnType("int") + .HasColumnName("tenant_id"); + + b.Property("TagId") + .HasColumnType("int") + .HasColumnName("tag_id"); + + b.Property("EntryId") + .HasColumnType("varchar(32)") + .HasColumnName("entry_id") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("EntryType") + .HasColumnType("int") + .HasColumnName("entry_type"); + + b.Property("Count") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasColumnName("tag_count") + .HasDefaultValueSql("'0'"); + + b.Property("CreateBy") + .HasColumnType("char(38)") + .HasColumnName("create_by") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("CreateOn") + .HasColumnType("datetime") + .HasColumnName("create_on"); + + b.HasKey("TenantId", "TagId", "EntryId", "EntryType") + .HasName("PRIMARY"); + + b.HasIndex("CreateOn") + .HasDatabaseName("create_on"); + + b.HasIndex("TenantId", "EntryId", "EntryType") + .HasDatabaseName("entry_id"); + + b.ToTable("files_tag_link", (string)null); + + b.HasAnnotation("MySql:CharSet", "utf8"); + }); + + modelBuilder.Entity("ASC.Files.Core.EF.DbFilesThirdpartyAccount", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasColumnName("id"); + + b.Property("CreateOn") + .HasColumnType("datetime") + .HasColumnName("create_on"); + + b.Property("FolderId") + .HasColumnType("text") + .HasColumnName("folder_id") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("FolderType") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasColumnName("folder_type") + .HasDefaultValueSql("'0'"); + + b.Property("HasLogo") + .HasColumnType("tinyint(1)") + .HasColumnName("has_logo"); + + b.Property("Password") + .IsRequired() + .HasColumnType("varchar(512)") + .HasColumnName("password") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("Private") + .HasColumnType("tinyint(1)") + .HasColumnName("private"); + + b.Property("Provider") + .IsRequired() + .ValueGeneratedOnAdd() + .HasColumnType("varchar(50)") + .HasColumnName("provider") + .HasDefaultValueSql("'0'") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("RoomType") + .HasColumnType("int") + .HasColumnName("room_type"); + + b.Property("TenantId") + .HasColumnType("int") + .HasColumnName("tenant_id"); + + b.Property("Title") + .IsRequired() + .HasColumnType("varchar(400)") + .HasColumnName("customer_title") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("Token") + .HasColumnType("text") + .HasColumnName("token") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("Url") + .HasColumnType("text") + .HasColumnName("url") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("UserId") + .IsRequired() + .HasColumnType("varchar(38)") + .HasColumnName("user_id") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("UserName") + .IsRequired() + .HasColumnType("varchar(100)") + .HasColumnName("user_name") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.HasKey("Id"); + + b.HasIndex("TenantId") + .HasDatabaseName("tenant_id"); + + b.ToTable("files_thirdparty_account", (string)null); + + b.HasAnnotation("MySql:CharSet", "utf8"); + }); + + modelBuilder.Entity("ASC.Files.Core.EF.DbFilesThirdpartyApp", b => + { + b.Property("UserId") + .HasColumnType("varchar(38)") + .HasColumnName("user_id") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("App") + .HasColumnType("varchar(50)") + .HasColumnName("app") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("ModifiedOn") + .HasColumnType("timestamp") + .HasColumnName("modified_on"); + + b.Property("TenantId") + .HasColumnType("int") + .HasColumnName("tenant_id"); + + b.Property("Token") + .HasColumnType("text") + .HasColumnName("token") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.HasKey("UserId", "App") + .HasName("PRIMARY"); + + b.HasIndex("TenantId"); + + b.ToTable("files_thirdparty_app", (string)null); + + b.HasAnnotation("MySql:CharSet", "utf8"); + }); + + modelBuilder.Entity("ASC.Files.Core.EF.DbFilesThirdpartyIdMapping", b => + { + b.Property("HashId") + .HasColumnType("char(32)") + .HasColumnName("hash_id") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("Id") + .IsRequired() + .HasColumnType("text") + .HasColumnName("id") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("TenantId") + .HasColumnType("int") + .HasColumnName("tenant_id"); + + b.HasKey("HashId") + .HasName("PRIMARY"); + + b.HasIndex("TenantId", "HashId") + .HasDatabaseName("index_1"); + + b.ToTable("files_thirdparty_id_mapping", (string)null); + + b.HasAnnotation("MySql:CharSet", "utf8"); + }); + + modelBuilder.Entity("ASC.Files.Core.EF.DbFolder", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasColumnName("id"); + + b.Property("CreateBy") + .IsRequired() + .HasColumnType("char(38)") + .HasColumnName("create_by") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("CreateOn") + .HasColumnType("datetime") + .HasColumnName("create_on"); + + b.Property("FilesCount") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasColumnName("filesCount") + .HasDefaultValueSql("'0'"); + + b.Property("FolderType") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasColumnName("folder_type") + .HasDefaultValueSql("'0'"); + + b.Property("FoldersCount") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasColumnName("foldersCount") + .HasDefaultValueSql("'0'"); + + b.Property("HasLogo") + .HasColumnType("tinyint(1)") + .HasColumnName("has_logo"); + + b.Property("ModifiedBy") + .IsRequired() + .HasColumnType("char(38)") + .HasColumnName("modified_by") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("ModifiedOn") + .HasColumnType("datetime") + .HasColumnName("modified_on"); + + b.Property("ParentId") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasColumnName("parent_id") + .HasDefaultValueSql("'0'"); + + b.Property("Private") + .ValueGeneratedOnAdd() + .HasColumnType("tinyint(1)") + .HasColumnName("private") + .HasDefaultValueSql("'0'"); + + b.Property("TenantId") + .HasColumnType("int") + .HasColumnName("tenant_id"); + + b.Property("Title") + .IsRequired() + .HasColumnType("varchar(400)") + .HasColumnName("title") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.HasKey("Id"); + + b.HasIndex("ModifiedOn") + .HasDatabaseName("modified_on"); + + b.HasIndex("TenantId", "ParentId") + .HasDatabaseName("parent_id"); + + b.HasIndex("TenantId", "ParentId", "ModifiedOn") + .HasDatabaseName("tenant_id_parent_id_modified_on"); + + b.HasIndex("TenantId", "ParentId", "Title") + .HasDatabaseName("tenant_id_parent_id_title"); + + b.ToTable("files_folder", (string)null); + + b.HasAnnotation("MySql:CharSet", "utf8"); + }); + + modelBuilder.Entity("ASC.Files.Core.EF.DbFolderTree", b => + { + b.Property("ParentId") + .HasColumnType("int") + .HasColumnName("parent_id"); + + b.Property("FolderId") + .HasColumnType("int") + .HasColumnName("folder_id"); + + b.Property("Level") + .HasColumnType("int") + .HasColumnName("level"); + + b.HasKey("ParentId", "FolderId") + .HasName("PRIMARY"); + + b.HasIndex("FolderId") + .HasDatabaseName("folder_id"); + + b.ToTable("files_folder_tree", (string)null); + + b.HasAnnotation("MySql:CharSet", "utf8"); + }); + + modelBuilder.Entity("ASC.MessagingSystem.EF.Model.DbAuditEvent", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasColumnName("id"); + + b.Property("Action") + .HasColumnType("int") + .HasColumnName("action"); + + b.Property("Browser") + .HasColumnType("varchar(200)") + .HasColumnName("browser") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("Date") + .HasColumnType("datetime") + .HasColumnName("date"); + + b.Property("DescriptionRaw") + .HasColumnType("varchar(20000)") + .HasColumnName("description") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("Initiator") + .HasColumnType("varchar(200)") + .HasColumnName("initiator") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("Ip") + .HasColumnType("varchar(50)") + .HasColumnName("ip") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("Page") + .HasColumnType("varchar(300)") + .HasColumnName("page") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("Platform") + .HasColumnType("varchar(200)") + .HasColumnName("platform") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("Target") + .HasColumnType("text") + .HasColumnName("target") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("TenantId") + .HasColumnType("int") + .HasColumnName("tenant_id"); + + b.Property("UserId") + .HasColumnType("char(38)") + .HasColumnName("user_id") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.HasKey("Id"); + + b.HasIndex("TenantId", "Date") + .HasDatabaseName("date"); + + b.ToTable("audit_events", (string)null); + + b.HasAnnotation("MySql:CharSet", "utf8"); + }); + + modelBuilder.Entity("ASC.MessagingSystem.EF.Model.DbLoginEvent", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasColumnName("id"); + + b.Property("Action") + .HasColumnType("int") + .HasColumnName("action"); + + b.Property("Active") + .HasColumnType("tinyint(1)") + .HasColumnName("active"); + + b.Property("Browser") + .HasColumnType("varchar(200)") + .HasColumnName("browser") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("Date") + .HasColumnType("datetime") + .HasColumnName("date"); + + b.Property("DescriptionRaw") + .HasColumnType("varchar(500)") + .HasColumnName("description") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("Ip") + .HasColumnType("varchar(50)") + .HasColumnName("ip") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("Login") + .HasColumnType("varchar(200)") + .HasColumnName("login") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("Page") + .HasColumnType("varchar(300)") + .HasColumnName("page") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("Platform") + .HasColumnType("varchar(200)") + .HasColumnName("platform") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("TenantId") + .HasColumnType("int") + .HasColumnName("tenant_id"); + + b.Property("UserId") + .IsRequired() + .HasColumnType("char(38)") + .HasColumnName("user_id") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.HasKey("Id"); + + b.HasIndex("Date") + .HasDatabaseName("date"); + + b.HasIndex("TenantId", "UserId") + .HasDatabaseName("tenant_id"); + + b.ToTable("login_events", (string)null); + + b.HasAnnotation("MySql:CharSet", "utf8"); + }); + + modelBuilder.Entity("ASC.Webhooks.Core.EF.Model.DbWebhook", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasColumnName("id"); + + b.Property("Method") + .ValueGeneratedOnAdd() + .HasMaxLength(10) + .HasColumnType("varchar(10)") + .HasColumnName("method") + .HasDefaultValueSql("''"); + + b.Property("Route") + .ValueGeneratedOnAdd() + .HasMaxLength(200) + .HasColumnType("varchar(200)") + .HasColumnName("route") + .HasDefaultValueSql("''"); + + b.HasKey("Id") + .HasName("PRIMARY"); + + b.ToTable("webhooks", (string)null); + + b.HasAnnotation("MySql:CharSet", "utf8"); + }); + + modelBuilder.Entity("ASC.Webhooks.Core.EF.Model.WebhooksConfig", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasColumnName("id"); + + b.Property("Enabled") + .ValueGeneratedOnAdd() + .HasColumnType("tinyint(1)") + .HasColumnName("enabled") + .HasDefaultValueSql("'1'"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("varchar(50)") + .HasColumnName("name"); + + b.Property("SSL") + .ValueGeneratedOnAdd() + .HasColumnType("tinyint(1)") + .HasColumnName("ssl") + .HasDefaultValueSql("'1'"); + + b.Property("SecretKey") + .ValueGeneratedOnAdd() + .HasMaxLength(50) + .HasColumnType("varchar(50)") + .HasColumnName("secret_key") + .HasDefaultValueSql("''"); + + b.Property("TenantId") + .HasColumnType("int") + .HasColumnName("tenant_id"); + + b.Property("Uri") + .ValueGeneratedOnAdd() + .HasColumnType("text") + .HasColumnName("uri") + .HasDefaultValueSql("''") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.HasKey("Id") + .HasName("PRIMARY"); + + b.HasIndex("TenantId") + .HasDatabaseName("tenant_id"); + + b.ToTable("webhooks_config", (string)null); + + b.HasAnnotation("MySql:CharSet", "utf8"); + }); + + modelBuilder.Entity("ASC.Webhooks.Core.EF.Model.WebhooksLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasColumnName("id"); + + b.Property("ConfigId") + .HasColumnType("int") + .HasColumnName("config_id"); + + b.Property("CreationTime") + .HasColumnType("datetime") + .HasColumnName("creation_time"); + + b.Property("Delivery") + .HasColumnType("datetime") + .HasColumnName("delivery"); + + b.Property("RequestHeaders") + .HasColumnType("json") + .HasColumnName("request_headers"); + + b.Property("RequestPayload") + .IsRequired() + .HasColumnType("text") + .HasColumnName("request_payload") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("ResponseHeaders") + .HasColumnType("json") + .HasColumnName("response_headers"); + + b.Property("ResponsePayload") + .HasColumnType("text") + .HasColumnName("response_payload") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("Status") + .HasColumnType("int") + .HasColumnName("status"); + + b.Property("TenantId") + .HasColumnType("int") + .HasColumnName("tenant_id"); + + b.Property("Uid") + .IsRequired() + .HasColumnType("varchar(36)") + .HasColumnName("uid") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("WebhookId") + .HasColumnType("int") + .HasColumnName("webhook_id"); + + b.HasKey("Id") + .HasName("PRIMARY"); + + b.HasIndex("ConfigId"); + + b.HasIndex("TenantId") + .HasDatabaseName("tenant_id"); + + b.ToTable("webhooks_logs", (string)null); + + b.HasAnnotation("MySql:CharSet", "utf8"); + }); + + modelBuilder.Entity("ASC.Core.Common.EF.Acl", b => + { + b.HasOne("ASC.Core.Common.EF.Model.DbTenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("ASC.Core.Common.EF.DbGroup", b => + { + b.HasOne("ASC.Core.Common.EF.Model.DbTenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("ASC.Core.Common.EF.DbQuotaRow", b => + { + b.HasOne("ASC.Core.Common.EF.Model.DbTenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("ASC.Core.Common.EF.DbSubscriptionMethod", b => + { + b.HasOne("ASC.Core.Common.EF.Model.DbTenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("ASC.Core.Common.EF.DbTariff", b => + { + b.HasOne("ASC.Core.Common.EF.Model.DbTenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("ASC.Core.Common.EF.DbTariffRow", b => + { + b.HasOne("ASC.Core.Common.EF.Model.DbTenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("ASC.Core.Common.EF.FireBaseUser", b => + { + b.HasOne("ASC.Core.Common.EF.Model.DbTenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("ASC.Core.Common.EF.Model.DbCoreSettings", b => + { + b.HasOne("ASC.Core.Common.EF.Model.DbTenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("ASC.Core.Common.EF.Model.DbTenantPartner", b => + { + b.HasOne("ASC.Core.Common.EF.Model.DbTenant", "Tenant") + .WithOne("Partner") + .HasForeignKey("ASC.Core.Common.EF.Model.DbTenantPartner", "TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("ASC.Core.Common.EF.Model.DbWebstudioSettings", b => + { + b.HasOne("ASC.Core.Common.EF.Model.DbTenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("ASC.Core.Common.EF.Model.DbWebstudioUserVisit", b => + { + b.HasOne("ASC.Core.Common.EF.Model.DbTenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("ASC.Core.Common.EF.Model.NotifyQueue", b => + { + b.HasOne("ASC.Core.Common.EF.Model.DbTenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("ASC.Core.Common.EF.Model.TelegramUser", b => + { + b.HasOne("ASC.Core.Common.EF.Model.DbTenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("ASC.Core.Common.EF.Model.TenantIpRestrictions", b => + { + b.HasOne("ASC.Core.Common.EF.Model.DbTenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("ASC.Core.Common.EF.Subscription", b => + { + b.HasOne("ASC.Core.Common.EF.Model.DbTenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("ASC.Core.Common.EF.User", b => + { + b.HasOne("ASC.Core.Common.EF.Model.DbTenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("ASC.Core.Common.EF.UserDav", b => + { + b.HasOne("ASC.Core.Common.EF.Model.DbTenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("ASC.Core.Common.EF.UserGroup", b => + { + b.HasOne("ASC.Core.Common.EF.Model.DbTenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("ASC.Core.Common.EF.UserPhoto", b => + { + b.HasOne("ASC.Core.Common.EF.Model.DbTenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("ASC.Core.Common.EF.UserSecurity", b => + { + b.HasOne("ASC.Core.Common.EF.Model.DbTenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("ASC.Data.Backup.EF.Model.BackupRecord", b => + { + b.HasOne("ASC.Core.Common.EF.Model.DbTenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("ASC.Data.Backup.EF.Model.BackupSchedule", b => + { + b.HasOne("ASC.Core.Common.EF.Model.DbTenant", "Tenant") + .WithOne() + .HasForeignKey("ASC.Data.Backup.EF.Model.BackupSchedule", "TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("ASC.EventBus.Extensions.Logger.IntegrationEventLogEntry", b => + { + b.HasOne("ASC.Core.Common.EF.Model.DbTenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("ASC.Feed.Model.FeedAggregate", b => + { + b.HasOne("ASC.Core.Common.EF.Model.DbTenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("ASC.Feed.Model.FeedReaded", b => + { + b.HasOne("ASC.Core.Common.EF.Model.DbTenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("ASC.Feed.Model.FeedUsers", b => + { + b.HasOne("ASC.Feed.Model.FeedAggregate", "Feed") + .WithMany() + .HasForeignKey("FeedId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Feed"); + }); + + modelBuilder.Entity("ASC.Files.Core.EF.DbFile", b => + { + b.HasOne("ASC.Core.Common.EF.Model.DbTenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("ASC.Files.Core.EF.DbFilesBunchObjects", b => + { + b.HasOne("ASC.Core.Common.EF.Model.DbTenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("ASC.Files.Core.EF.DbFilesLink", b => + { + b.HasOne("ASC.Core.Common.EF.Model.DbTenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("ASC.Files.Core.EF.DbFilesProperties", b => + { + b.HasOne("ASC.Core.Common.EF.Model.DbTenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("ASC.Files.Core.EF.DbFilesSecurity", b => + { + b.HasOne("ASC.Core.Common.EF.Model.DbTenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("ASC.Files.Core.EF.DbFilesTag", b => + { + b.HasOne("ASC.Core.Common.EF.Model.DbTenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("ASC.Files.Core.EF.DbFilesTagLink", b => + { + b.HasOne("ASC.Core.Common.EF.Model.DbTenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("ASC.Files.Core.EF.DbFilesThirdpartyAccount", b => + { + b.HasOne("ASC.Core.Common.EF.Model.DbTenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("ASC.Files.Core.EF.DbFilesThirdpartyApp", b => + { + b.HasOne("ASC.Core.Common.EF.Model.DbTenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("ASC.Files.Core.EF.DbFilesThirdpartyIdMapping", b => + { + b.HasOne("ASC.Core.Common.EF.Model.DbTenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("ASC.Files.Core.EF.DbFolder", b => + { + b.HasOne("ASC.Core.Common.EF.Model.DbTenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("ASC.Files.Core.EF.DbFolderTree", b => + { + b.HasOne("ASC.Files.Core.EF.DbFolder", "Folder") + .WithMany() + .HasForeignKey("FolderId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Folder"); + }); + + modelBuilder.Entity("ASC.MessagingSystem.EF.Model.DbAuditEvent", b => + { + b.HasOne("ASC.Core.Common.EF.Model.DbTenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("ASC.MessagingSystem.EF.Model.DbLoginEvent", b => + { + b.HasOne("ASC.Core.Common.EF.Model.DbTenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("ASC.Webhooks.Core.EF.Model.WebhooksConfig", b => + { + b.HasOne("ASC.Core.Common.EF.Model.DbTenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("ASC.Webhooks.Core.EF.Model.WebhooksLog", b => + { + b.HasOne("ASC.Webhooks.Core.EF.Model.WebhooksConfig", "Config") + .WithMany() + .HasForeignKey("ConfigId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("ASC.Core.Common.EF.Model.DbTenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Config"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("ASC.Core.Common.EF.Model.DbTenant", b => + { + b.Navigation("Partner"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/migrations/mysql/SaaS/MigrationContext/20230901122723_MigrationContext_Upgrade2.cs b/migrations/mysql/SaaS/MigrationContext/20230901122723_MigrationContext_Upgrade2.cs new file mode 100644 index 0000000000..95f306e36c --- /dev/null +++ b/migrations/mysql/SaaS/MigrationContext/20230901122723_MigrationContext_Upgrade2.cs @@ -0,0 +1,27 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace ASC.Migrations.MySql.SaaS.Migrations +{ + /// + public partial class MigrationContext_Upgrade2 : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.CreateIndex( + name: "creation_date", + table: "notify_queue", + column: "creation_date"); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropIndex( + name: "creation_date", + table: "notify_queue"); + } + } +} diff --git a/migrations/mysql/SaaS/MigrationContext/MigrationContextModelSnapshot.cs b/migrations/mysql/SaaS/MigrationContext/MigrationContextModelSnapshot.cs index 3536521850..b7e8f5642b 100644 --- a/migrations/mysql/SaaS/MigrationContext/MigrationContextModelSnapshot.cs +++ b/migrations/mysql/SaaS/MigrationContext/MigrationContextModelSnapshot.cs @@ -4618,6 +4618,9 @@ namespace ASC.Migrations.MySql.SaaS.Migrations b.HasKey("NotifyId") .HasName("PRIMARY"); + b.HasIndex("CreationDate") + .HasDatabaseName("creation_date"); + b.HasIndex("TenantId"); b.ToTable("notify_queue", (string)null); diff --git a/packages/client/public/locales/az/JavascriptSdk.json b/packages/client/public/locales/az/JavascriptSdk.json index 4728927b84..fb3ef4b225 100644 --- a/packages/client/public/locales/az/JavascriptSdk.json +++ b/packages/client/public/locales/az/JavascriptSdk.json @@ -5,6 +5,10 @@ "Code": "Daxil etmək üçün kod", "CopyWindowCode": "Pəncərənin kodunu kopyalayın", "CreateSampleHeader": "DocSpace yerləşdirmə nümunəsi yaradın", + "CSPDescription": "DocSpace-i vebsaytda iframe kimi təhlükəsiz şəkildə yerləşdirmək üçün onun URL-ni icazələr siyahısına əlavə edin.", + "CSPHeader": "DocSpace-i iframe kimi yerləşdirin", + "CSPHelp": "Bu parametr məzmun hücumlarından qorunmaq üçün istifadə edilə bilən təhlükəsizlik mexanizmidir. CSP təhlükəsiz mənbə yükləmə mənbələrini təsvir edir. \"Ağ siyahıya salınmayan\" mənbələrdən endrilmə bloklanıb. İstifadə olunacaq domenləri (protokollu) göstərin.", + "CSPInputPlaceholder": "URL'yi bu cür daxil edin: https://example.com", "CustomizingDisplay": "Ekranı fərdiləşdirin", "DataDisplay": "Məlumatların göstərilməsi parametrləri", "Descending": "Azalan", diff --git a/packages/client/public/locales/az/Settings.json b/packages/client/public/locales/az/Settings.json index 05d405dba5..9c46ca20ea 100644 --- a/packages/client/public/locales/az/Settings.json +++ b/packages/client/public/locales/az/Settings.json @@ -39,6 +39,7 @@ "BackupCreatedSuccess": "Ehtiyat nüsxə uğurla yaradıldı.", "BackupList": "Ehtiyyat siyahısı", "BackupListWarningText": "Siyahıdan müəyyən elementləri silsəniz, onların müvafiq faylları da silinəcək. Bu əməliyyat geri qaytarıla bilməz. Bütün faylları silmək üçün linkdən istifadə edin:", + "BetaLabel": "BETA", "Branding": "Brendləşmə", "BrandingSectionDescription": "Şirkət məlumatlarınızı göstərin, DocSpace interfeysində göstərilən xarici resurslara və e-poçt ünvanlarına keçidlər əlavə edin.", "BrandingSubtitle": "İstifadəçilərə brendlə bağlı təcrübə təmin etmək üçün bu seçimdən istifadə edin.", diff --git a/packages/client/public/locales/bg/JavascriptSdk.json b/packages/client/public/locales/bg/JavascriptSdk.json index 5bfeecf4d0..5114172de8 100644 --- a/packages/client/public/locales/bg/JavascriptSdk.json +++ b/packages/client/public/locales/bg/JavascriptSdk.json @@ -5,6 +5,10 @@ "Code": "Код за вмъкване", "CopyWindowCode": "Копирайте кода за вграждане на прозореца", "CreateSampleHeader": "Създайте примерно DocSpace вграждане", + "CSPDescription": "За безопасно вграждане на DocSpace като iframe в уебсайт, добавете URL адреса му към вашия списък с разрешени.", + "CSPHeader": "Вградете DocSpace като iframe", + "CSPHelp": "Тази настройка е защитен механизъм, който може да се използва за защита срещу атаки на инжектирано съдържание. CSP описва сигурни източници за изтегляне на ресурси. Изтеглянето от ресурси, които не са включени в „белия списък“, е блокирано. Посочете домейните (заедно с протокола), с които ще работи.", + "CSPInputPlaceholder": "Въведете URL адреса така: https://example.com", "CustomizingDisplay": "Персонализиране на дисплея", "DataDisplay": "Настройки за дисплей на данните", "Descending": "Низходящ", diff --git a/packages/client/public/locales/bg/Settings.json b/packages/client/public/locales/bg/Settings.json index 63df9af758..bd860fcaa4 100644 --- a/packages/client/public/locales/bg/Settings.json +++ b/packages/client/public/locales/bg/Settings.json @@ -39,6 +39,7 @@ "BackupCreatedSuccess": "Резервното копие е създадено успешно.", "BackupList": "Списък с резервни копия", "BackupListWarningText": "Ако изтриете всички елементи от списъка, съответните им файлове също ще бъдат изтрити. Това действие не може да бъде отменено. За да изтриете всички файлове, използвайте връзката:", + "BetaLabel": "BETA", "Branding": "Брандинг", "BrandingSectionDescription": "Посочете информацията за вашата компания, добавете линкове към външни ресурси и имейл адреси, показвани в DocSpace интерфейса.", "BrandingSubtitle": "Използвайте тази опция, за да предоставите брандинг преживяване на потребителите си.", diff --git a/packages/client/public/locales/cs/JavascriptSdk.json b/packages/client/public/locales/cs/JavascriptSdk.json index 167daf7a82..a5770f316d 100644 --- a/packages/client/public/locales/cs/JavascriptSdk.json +++ b/packages/client/public/locales/cs/JavascriptSdk.json @@ -5,6 +5,10 @@ "Code": "Kód pro vložení", "CopyWindowCode": "Kopírování kódu pro vložení okna", "CreateSampleHeader": "Vytvoření vzorového vložení DocSpace", + "CSPDescription": "Chcete-li bezpečně vložit DocSpace jako iframe do webové stránky, přidejte její adresu URL do seznamu povolených adres.", + "CSPHeader": "Vložit DocSpace jako iframe", + "CSPHelp": "Toto nastavení je bezpečnostní mechanismus, který lze použít k ochraně před útoky typu \"content injection\". CSP popisuje bezpečné zdroje pro stahování zdrojů. Stahování ze zdrojů, které nejsou uvedeny na `bílém seznamu`, je blokováno. Zadejte domény (spolu s protokolem), se kterými bude pracovat.", + "CSPInputPlaceholder": "Zadejte adresu URL takto: https://example.com", "CustomizingDisplay": "Přizpůsobení zobrazení", "DataDisplay": "Nastavení zobrazení dat", "Descending": "Sestupně", diff --git a/packages/client/public/locales/cs/Settings.json b/packages/client/public/locales/cs/Settings.json index fb7f757ab4..ac13059545 100644 --- a/packages/client/public/locales/cs/Settings.json +++ b/packages/client/public/locales/cs/Settings.json @@ -39,6 +39,7 @@ "BackupCreatedSuccess": "Kopie zálohy byla úspěšně vytvořena.", "BackupList": "Seznam záloh", "BackupListWarningText": "Pokud odstraníte nějaké položky ze seznamu, budou také odstraněny odpovídající soubory. Tuto akci nelze vrátit zpět. Chcete-li odstranit všechny soubory, použijte odkaz:", + "BetaLabel": "BETA", "Branding": "Branding", "BrandingSectionDescription": "Zadejte informace o své společnosti, přidejte odkazy na externí zdroje a e-mailové adresy zobrazené v rozhraní DocSpace.", "BrandingSubtitle": "Tuto možnost použijte, abyste uživatelům poskytli zážitek na úrovni značky.", diff --git a/packages/client/public/locales/de/Errors.json b/packages/client/public/locales/de/Errors.json index 9e5e5549e4..26443f6510 100644 --- a/packages/client/public/locales/de/Errors.json +++ b/packages/client/public/locales/de/Errors.json @@ -2,6 +2,7 @@ "Error401Text": "Die Ressource kann zurzeit nicht zugegriffen werden.", "Error403Text": "Zugriff verweigert.", "Error404Text": "Die Ressource kann nicht gefunden werden.", + "ErrorDeactivatedText": "Dieser DocSpace ist deaktiviert", "ErrorEmptyResponse": "Leere Antwort", "ErrorOfflineText": "Keine Internetverbindung gefunden", "ErrorUnavailableText": "DocSpace nicht verfügbar" diff --git a/packages/client/public/locales/de/JavascriptSdk.json b/packages/client/public/locales/de/JavascriptSdk.json index 510c299d2d..b3c4fb237a 100644 --- a/packages/client/public/locales/de/JavascriptSdk.json +++ b/packages/client/public/locales/de/JavascriptSdk.json @@ -5,6 +5,10 @@ "Code": "Code zum Einfügen", "CopyWindowCode": "Fenster-Einbettungscode kopieren", "CreateSampleHeader": "Beispiel DocSpace-Einbettung erstellen", + "CSPDescription": "Um DocSpace sicher als iFrame in eine Website einzubetten, fügen Sie die URL zu Ihrer Zulassungsliste hinzu.", + "CSPHeader": "DocSpace als iFrame einbetten", + "CSPHelp": "Diese Einstellung ist ein Sicherheitsmechanismus, der zum Schutz vor Content-Injection-Angriffen verwendet werden kann. CSP beschreibt sichere Quellen für das Herunterladen von Ressourcen. Das Herunterladen von Ressourcen, die nicht in der `Weißliste` enthalten sind, wird blockiert. Geben Sie die Domänen (zusammen mit dem Protokoll) an, mit denen es arbeiten soll.", + "CSPInputPlaceholder": "Geben Sie eine URL wie folgt ein: https://example.com", "CustomizingDisplay": "Anpassen der Anzeige", "DataDisplay": "Einstellungen der Datenanzeige", "Descending": "Absteigend", diff --git a/packages/client/public/locales/de/Settings.json b/packages/client/public/locales/de/Settings.json index f5830a5492..50b6179140 100644 --- a/packages/client/public/locales/de/Settings.json +++ b/packages/client/public/locales/de/Settings.json @@ -39,6 +39,7 @@ "BackupCreatedSuccess": "Die Sicherungskopie wurde erfolgreich erstellt.", "BackupList": "Backup-Liste", "BackupListWarningText": "Falls Sie einige Elemente aus der Liste löschen, werden die entsprechende Dateien auch gelöscht. Dieser Vorgang nicht rückgängig gemacht werden kann. Um alle Dateien zu löschen, verwenden Sie den Link:", + "BetaLabel": "BETA", "Branding": "Branding", "BrandingSectionDescription": "Geben Sie Ihre Unternehmensinformationen an, fügen Sie Links zu externen Ressourcen und E-Mail-Adressen hinzu, die auf der DocSpace-Oberfläche angezeigt werden.", "BrandingSubtitle": "Verwenden Sie diese Option, um den Nutzern ein markengerechtes Erlebnis zu bieten.", diff --git a/packages/client/public/locales/el-GR/JavascriptSdk.json b/packages/client/public/locales/el-GR/JavascriptSdk.json index 741bdf08cb..df95e92a0d 100644 --- a/packages/client/public/locales/el-GR/JavascriptSdk.json +++ b/packages/client/public/locales/el-GR/JavascriptSdk.json @@ -5,6 +5,10 @@ "Code": "Κώδικας για εισαγωγή", "CopyWindowCode": "Αντιγραφή του κώδικα ενσωμάτωσης του παραθύρου", "CreateSampleHeader": "Δημιουργία δείγματος ενσωμάτωσης DocSpace", + "CSPDescription": "Για να ενσωματώσετε με ασφάλεια το DocSpace ως iframe σε έναν ιστότοπο, προσθέστε τη διεύθυνση URL του στη λίστα αδειών σας.", + "CSPHeader": "Ενσωμάτωση του DocSpace ως iframe", + "CSPHelp": "Αυτή η ρύθμιση είναι ένας μηχανισμός ασφαλείας που μπορεί να χρησιμοποιηθεί για την προστασία από επιθέσεις έγχυσης περιεχομένου. Το CSP περιγράφει ασφαλείς πηγές λήψης πόρων. Η λήψη από πόρους που δεν περιλαμβάνονται στη «λευκή λίστα» αποκλείεται. Καθορίστε τους τομείς (μαζί με το πρωτόκολλο) με τους οποίους θα λειτουργεί.", + "CSPInputPlaceholder": "Εισάγετε τη διεύθυνση URL ως εξής: https://example.com", "CustomizingDisplay": "Προσαρμογή της εμφάνισης", "DataDisplay": "Ρυθμίσεις εμφάνισης δεδομένων", "Descending": "Φθίνουσα", diff --git a/packages/client/public/locales/el-GR/Settings.json b/packages/client/public/locales/el-GR/Settings.json index e0c91fa7f6..ccd49a7bfb 100644 --- a/packages/client/public/locales/el-GR/Settings.json +++ b/packages/client/public/locales/el-GR/Settings.json @@ -39,6 +39,7 @@ "BackupCreatedSuccess": "Το εφεδρικό αντίγραφο έχει δημιουργηθεί επιτυχώς.", "BackupList": "Εφεδρική λίστα", "BackupListWarningText": "Εάν διαγράψετε στοιχεία από τη λίστα, θα διαγραφούν και τα αντίστοιχα αρχεία τους. Αυτή η ενέργεια δεν μπορεί να αναιρεθεί. Για να διαγράψετε όλα τα αρχεία, χρησιμοποιήστε τον σύνδεσμο:", + "BetaLabel": "BETA", "Branding": "Επωνυμία", "BrandingSectionDescription": "Καθορίστε τα στοιχεία της εταιρείας σας, προσθέστε συνδέσμους προς εξωτερικούς πόρους και διευθύνσεις ηλεκτρονικού ταχυδρομείου που εμφανίζονται μέσα στο περιβάλλον εργασίας του DocSpace.", "BrandingSubtitle": "Χρησιμοποιήστε αυτήν την επιλογή για να παρέχετε στους χρήστες εμπειρία που ταιριάζει στην επωνυμία.", diff --git a/packages/client/public/locales/en/Errors.json b/packages/client/public/locales/en/Errors.json index b34a9cc95f..01921d5db0 100644 --- a/packages/client/public/locales/en/Errors.json +++ b/packages/client/public/locales/en/Errors.json @@ -2,6 +2,7 @@ "Error401Text": "Sorry, the resource is not currently accessible.", "Error403Text": "Sorry, access denied.", "Error404Text": "Sorry, the resource cannot be found.", + "ErrorDeactivatedText": "This DocSpace is deactivated", "ErrorEmptyResponse": "Empty response", "ErrorOfflineText": "No internet connection", "ErrorUnavailableText": "DocSpace unavailable", diff --git a/packages/client/public/locales/en/Files.json b/packages/client/public/locales/en/Files.json index 5c8bcd4beb..0cd77fcc37 100644 --- a/packages/client/public/locales/en/Files.json +++ b/packages/client/public/locales/en/Files.json @@ -33,7 +33,7 @@ "EmptyFilterDescriptionText": "No files or folders match this filter. Try a different one or clear filter to view all files. ", "EmptyFilterSubheadingText": "No files to be displayed for this filter here", "EmptyFolderDecription": "Drop files here or create new ones", - "EmptyFolderDescriptionUser": "Files and folders uploaded by admins will appeared here.", + "EmptyFolderDescriptionUser": "Files and folders uploaded by admins will appear here.", "EmptyFolderHeader": "No files in this folder", "EmptyRecycleBin": "Empty Trash", "EmptyRootRoomHeader": "Welcome to DocSpace", diff --git a/packages/client/public/locales/es/Errors.json b/packages/client/public/locales/es/Errors.json index b8ebd9f008..37e10a1461 100644 --- a/packages/client/public/locales/es/Errors.json +++ b/packages/client/public/locales/es/Errors.json @@ -2,6 +2,7 @@ "Error401Text": "Perdón, el recurso no es accesible actualmente.", "Error403Text": "Perdón, acceso denegado.", "Error404Text": "Perdón, no se puede encontrar el recurso.", + "ErrorDeactivatedText": "Este DocSpace está desactivado", "ErrorEmptyResponse": "Respuesta vacía", "ErrorOfflineText": "No se ha encontrado ninguna conexión a Internet", "ErrorUnavailableText": "DocSpace no está disponible" diff --git a/packages/client/public/locales/fi/JavascriptSdk.json b/packages/client/public/locales/fi/JavascriptSdk.json index a3f3f56215..534a91195f 100644 --- a/packages/client/public/locales/fi/JavascriptSdk.json +++ b/packages/client/public/locales/fi/JavascriptSdk.json @@ -5,6 +5,10 @@ "Code": "Lisättävä koodi", "CopyWindowCode": "Kopioi ikkunan upotuskoodi", "CreateSampleHeader": "Luo esimerkki DocSpace-upotuksesta", + "CSPDescription": "Upottaaksesi DocSpacen iframeksi verkkosivulle, lisää sen URL sallittujen luetteloon.", + "CSPHeader": "Upota DocSpace iframeksi", + "CSPHelp": "Tämä asetus on suojausmekanismi, jota voidaan käyttää suojelemaan sisällön lisäyshyökkäyksiltä. CSP kuvaa suojatut resurssien latauslähteet. Lataaminen resursseista, jotka eivät sisälly \"valkoiseen listaan\", on estetty. Määritä toimialueet (yhdessä protokollan kanssa) joiden kanssa se toimii.", + "CSPInputPlaceholder": "Syötä URL näin: https://example.com", "CustomizingDisplay": "Näytön mukauttaminen", "DataDisplay": "Tietojen näyttöasetukset", "Descending": "Laskeva", diff --git a/packages/client/public/locales/fi/Settings.json b/packages/client/public/locales/fi/Settings.json index d554b1a271..874a639e23 100644 --- a/packages/client/public/locales/fi/Settings.json +++ b/packages/client/public/locales/fi/Settings.json @@ -39,6 +39,7 @@ "BackupCreatedSuccess": "Turvatallenteen kopio on luotu onnistuneesti.", "BackupList": "Varmuuskopiolista", "BackupListWarningText": "Jos poistat luettelosta kohteita, myös vastaavat tiedostot poistetaan. Tätä toimintoa ei voi kumota. Jos haluat poistaa kaikki tiedostot, käytä linkkiä:", + "BetaLabel": "BETA", "Branding": "Brändäys", "BrandingSectionDescription": "Tarkenna yrityksesi tiedot, lisää linkit Docspace-käyttöliittymässä näkyvät ulkoiset resurssit ja sähköpostiosoitteet.", "BrandingSubtitle": "Käytä tätä vaihtoehtoa tarjotaksesi käyttäjille brändikokemusta.", diff --git a/packages/client/public/locales/fr/Errors.json b/packages/client/public/locales/fr/Errors.json index cd4d79dad0..1dca727cb2 100644 --- a/packages/client/public/locales/fr/Errors.json +++ b/packages/client/public/locales/fr/Errors.json @@ -2,6 +2,7 @@ "Error401Text": "Désolé, la ressource n'est pas disponible actuellement.", "Error403Text": "Désolé, accès refusé.", "Error404Text": "Désolé, la ressource n'a pu être trouvée.", + "ErrorDeactivatedText": "Ce DocSpace est désactivé", "ErrorEmptyResponse": "Réponse vide", "ErrorOfflineText": "Aucune connexion Internet trouvée", "ErrorUnavailableText": "DocSpace non disponible" diff --git a/packages/client/public/locales/hy-AM/Errors.json b/packages/client/public/locales/hy-AM/Errors.json index 031201f4f0..7dd972ecc5 100644 --- a/packages/client/public/locales/hy-AM/Errors.json +++ b/packages/client/public/locales/hy-AM/Errors.json @@ -2,6 +2,7 @@ "Error401Text": "Ներողություն, ռեսուրսը ներկայումս հասանելի չէ.", "Error403Text": "Ներողություն, մատչումն արգելված է.", "Error404Text": "Ներողություն, ռեսուրսը հնարավոր չէ գտնել:", + "ErrorDeactivatedText": "Այս DocSpace-ն ապաակտիվացված է", "ErrorEmptyResponse": "Դատարկ պատասխան", "ErrorOfflineText": "Ինտերնետ կապ չի գտնվել", "ErrorUnavailableText": "DocSpace-ը առկա չէ" diff --git a/packages/client/public/locales/it/Errors.json b/packages/client/public/locales/it/Errors.json index a54503a667..e0925ff0e1 100644 --- a/packages/client/public/locales/it/Errors.json +++ b/packages/client/public/locales/it/Errors.json @@ -2,6 +2,7 @@ "Error401Text": "Spiacente, la risorsa non è attualmente accessibile.", "Error403Text": "Spiacente, accesso negato.", "Error404Text": "Spiacente, impossibile trovare la risorsa.", + "ErrorDeactivatedText": "Questo DocSpace è disattivato", "ErrorEmptyResponse": "Risposta vuota", "ErrorOfflineText": "Nessuna connessione a internet trovata", "ErrorUnavailableText": "DocSpace non disponibile" diff --git a/packages/client/public/locales/ja-JP/JavascriptSdk.json b/packages/client/public/locales/ja-JP/JavascriptSdk.json index 1a3ac505b3..2349140e45 100644 --- a/packages/client/public/locales/ja-JP/JavascriptSdk.json +++ b/packages/client/public/locales/ja-JP/JavascriptSdk.json @@ -5,6 +5,10 @@ "Code": "挿入するコード", "CopyWindowCode": " ウィンドウの埋め込みコードをコピーする", "CreateSampleHeader": "サンプルDocSpaceエンベッドの作成", + "CSPDescription": "DocSpaceをiframeとして安全にウェブサイトに埋め込むには、そのURLを許可リストに追加してください。", + "CSPHeader": "DocSpaceをiframeとして埋め込む", + "CSPHelp": "この設定は、コンテンツ・インジェクション攻撃から保護するために使用できるセキュリティ・メカニズムです。CSP には安全なリソースのダウンロード・ソースが記述されています。ホワイトリストに含まれていないリソースからのダウンロードはブロックされます。動作するドメインを(プロトコルと共に)指定します。", + "CSPInputPlaceholder": "URLを次のように入力: https://example.com", "CustomizingDisplay": "表示のカスタマイズ", "DataDisplay": "データ表示設定", "Descending": "下降", diff --git a/packages/client/public/locales/ja-JP/Settings.json b/packages/client/public/locales/ja-JP/Settings.json index 5d9a725fe3..e24e886a49 100644 --- a/packages/client/public/locales/ja-JP/Settings.json +++ b/packages/client/public/locales/ja-JP/Settings.json @@ -39,6 +39,7 @@ "BackupCreatedSuccess": "バックアップ・コピーは正常に作成されました。", "BackupList": "バックアップリスト", "BackupListWarningText": "リストからアイテムを削除すると、対応するファイルも削除されます。この操作を元に戻すことができません。すべてのファイルを削除するために次のリンクをクリックしてください:", + "BetaLabel": "BETA", "Branding": "ブランディング", "BrandingSectionDescription": "DocSpaceのインターフェイス内に表示される企業情報、外部リソースへのリンク、メールアドレスの追加を指定してください。", "BrandingSubtitle": "このオプションを使用すると、ユーザーにオンブランドのエクスペリエンスを提供することができます。", diff --git a/packages/client/public/locales/nl/JavascriptSdk.json b/packages/client/public/locales/nl/JavascriptSdk.json index 5f1f7544d5..66b2c6ae1f 100644 --- a/packages/client/public/locales/nl/JavascriptSdk.json +++ b/packages/client/public/locales/nl/JavascriptSdk.json @@ -5,6 +5,10 @@ "Code": "Code om in te voegen", "CopyWindowCode": "Kopieer venster insluitcode", "CreateSampleHeader": "Voorbeeld DocSpace insluiten maken", + "CSPDescription": "Om DocSpace veilig in te sluiten als een iframe in een website, voegt u de URL toe aan uw toestaan-lijst.", + "CSPHeader": "DocSpace insluiten als iframe", + "CSPHelp": "Deze instelling is een beveiligingsmechanisme dat kan worden gebruikt om bescherming te bieden tegen aanvallen waarbij materiaal wordt geïnjecteerd. Het CSP beschrijft veilige bronnen voor het downloaden. Downloaden van bronnen die niet op de `witte lijst` staan, wordt vervolgens geblokkeerd. Geef de domeinen aan (samen met het protocol) waar het mee gaat werken.", + "CSPInputPlaceholder": "Voer de URL als volgt in: https://example.com", "CustomizingDisplay": "De weergave aanpassen", "DataDisplay": "Instellingen weergave gegevens", "Descending": "Aflopend", diff --git a/packages/client/public/locales/nl/Settings.json b/packages/client/public/locales/nl/Settings.json index 8af1f29fc3..f17e2e4ddd 100644 --- a/packages/client/public/locales/nl/Settings.json +++ b/packages/client/public/locales/nl/Settings.json @@ -39,6 +39,7 @@ "BackupCreatedSuccess": "De back-up kopie is succesvol aangemaakt.", "BackupList": "Back-up lijst", "BackupListWarningText": "Als u items uit de lijst verwijdert, worden hun bijbehorende bestanden ook verwijderd. Deze actie kan niet ongedaan gemaakt worden. Om alle bestanden te verwijderen, gebruik de link:", + "BetaLabel": "BETA", "Branding": "Branding", "BrandingSectionDescription": "Specificeer uw bedrijfsinformatie, voeg links toe naar externe bronnen en e-mailadressen die in de DocSpace interface worden weergegeven.", "BrandingSubtitle": "Gebruik deze optie om gebruikers een on-brand ervaring te bieden.", diff --git a/packages/client/public/locales/pl/JavascriptSdk.json b/packages/client/public/locales/pl/JavascriptSdk.json index 070217500f..8f8d03e20e 100644 --- a/packages/client/public/locales/pl/JavascriptSdk.json +++ b/packages/client/public/locales/pl/JavascriptSdk.json @@ -5,6 +5,10 @@ "Code": "Kod do wstawienia", "CopyWindowCode": "Skopiuj kod osadzania dla okna", "CreateSampleHeader": "Utwórz szablon osadzania DocSpace", + "CSPDescription": "Aby bezpiecznie osadzić DocSpace jako element iframe na swojej stronie internetowej, dodaj jego adres URL do swojej listy dozwolonych.", + "CSPHeader": "Osadź DocSpace jako iframe", + "CSPHelp": "Dane ustawienie to mechanizm zabezpieczający przed atakami polegającymi na wstrzykiwaniu zawartości. Zasady zabezpieczeń zawartości (CSP) opisują bezpieczne źródła pobierania zasobów. Pobieranie z zasobów, które nie znajdują się na Białej Liście, jest zablokowane. Określ domeny (wraz z protokołem), z którymi będzie to działać.", + "CSPInputPlaceholder": "Wpisz URL w następujący sposób: https://example.com", "CustomizingDisplay": "Personalizacja wyświetlania", "DataDisplay": "Ustawienia wyświetlania danych", "Descending": "Malejąco", diff --git a/packages/client/public/locales/pl/Settings.json b/packages/client/public/locales/pl/Settings.json index a22609f305..a0acd071d2 100644 --- a/packages/client/public/locales/pl/Settings.json +++ b/packages/client/public/locales/pl/Settings.json @@ -39,6 +39,7 @@ "BackupCreatedSuccess": "Kopia zapasowa została pomyślnie utworzona.", "BackupList": "Lista kopii zapasowych", "BackupListWarningText": "Jeśli usuniesz wszystkie elementy z listy, odpowiadające im pliki zostaną również usunięte. Ta czynność nie może zostać cofnięta. Aby usunąć wszystkie pliki, użyj linku:", + "BetaLabel": "BETA", "Branding": "Branding", "BrandingSectionDescription": "Dodaj informacje o firmie, linki do zasobów zewnętrznych i adresy e-mail widoczne w interfejsie DocSpace.", "BrandingSubtitle": "Użyj tej opcji, aby zapewnić użytkownikom doświadczenie marki.", diff --git a/packages/client/public/locales/pt-BR/Errors.json b/packages/client/public/locales/pt-BR/Errors.json index 4d20470b45..307f02e867 100644 --- a/packages/client/public/locales/pt-BR/Errors.json +++ b/packages/client/public/locales/pt-BR/Errors.json @@ -2,6 +2,7 @@ "Error401Text": "Desculpe, o recurso não está atualmente acessível.", "Error403Text": "Desculpe, acesso negado.", "Error404Text": "Desculpe, o recurso não pode ser encontrado.", + "ErrorDeactivatedText": "Este DocSpace está desativado", "ErrorEmptyResponse": "Resposta vazia", "ErrorOfflineText": "Nenhuma conexão com a Internet foi encontrada", "ErrorUnavailableText": "DocSpace indisponível" diff --git a/packages/client/public/locales/pt/JavascriptSdk.json b/packages/client/public/locales/pt/JavascriptSdk.json index 40a0b60292..bb46fa8c5a 100644 --- a/packages/client/public/locales/pt/JavascriptSdk.json +++ b/packages/client/public/locales/pt/JavascriptSdk.json @@ -5,6 +5,10 @@ "Code": "Código a inserir", "CopyWindowCode": "Copiar código de incorporação da janela", "CreateSampleHeader": "Criar um exemplo de incorporação do DocSpace", + "CSPDescription": "Para incorporar com segurança o DocSpace como um iframe num Website, adicione o seu URL à sua lista de permissões.", + "CSPHeader": "Incorporar o DocSpace como iframe", + "CSPHelp": "Esta definição é um mecanismo de segurança que pode ser utilizado para proteger contra ataques de injeção de conteúdos. O CSP descreve fontes seguras de download de recursos. O download de recursos não incluídos na \"lista branca\" está bloqueado. Especifique os domínios (juntamente com o protocolo) com os quais irá trabalhar.", + "CSPInputPlaceholder": "Introduzir um URL como este: https://example.com", "CustomizingDisplay": "A personalizar a visualização", "DataDisplay": "Definições de visualização de dados", "Descending": "Descendente", diff --git a/packages/client/public/locales/pt/Settings.json b/packages/client/public/locales/pt/Settings.json index e5976c8aa1..707e8bda9b 100644 --- a/packages/client/public/locales/pt/Settings.json +++ b/packages/client/public/locales/pt/Settings.json @@ -39,6 +39,7 @@ "BackupCreatedSuccess": "A cópia de segurança foi criada com sucesso.", "BackupList": "Lista de Cópias de Segurança", "BackupListWarningText": "Se eliminar qualquer item desta lista, os ficheiros que lhes correspondem serão também eliminados. Esta ação não pode ser anulada. Para eliminar todos os ficheiros utilize o link:", + "BetaLabel": "BETA", "Branding": "Imagem de Marca", "BrandingSectionDescription": "Especifique a informação da sua empresa, adicione ligações a recursos externos e endereços de correio eletrónico exibidos dentro da interface do DocSpace.", "BrandingSubtitle": "Utilize esta opção para fornecer uma experiência de marca aos utilizadores.", diff --git a/packages/client/public/locales/ru/Errors.json b/packages/client/public/locales/ru/Errors.json index b4563fa059..3d6f246c7e 100644 --- a/packages/client/public/locales/ru/Errors.json +++ b/packages/client/public/locales/ru/Errors.json @@ -2,6 +2,7 @@ "Error401Text": "Извините, страница недоступна.", "Error403Text": "Извините, доступ закрыт.", "Error404Text": "Извините, страница не найдена.", + "ErrorDeactivatedText": "Этот DocSpace деактивирован", "ErrorEmptyResponse": "Пустой ответ", "ErrorOfflineText": "Нет подключения к интернету", "ErrorUnavailableText": "DocSpace недоступен" diff --git a/packages/client/public/locales/ru/JavascriptSdk.json b/packages/client/public/locales/ru/JavascriptSdk.json index 97c53d790c..300b98ce5e 100644 --- a/packages/client/public/locales/ru/JavascriptSdk.json +++ b/packages/client/public/locales/ru/JavascriptSdk.json @@ -7,7 +7,7 @@ "CreateSampleHeader": "Создать образец встраивания DocSpace", "CSPDescription": "Чтобы безопасно встроить DocSpace в качестве iframe в веб-сайт, добавьте его URL-адрес в список разрешенных.", "CSPHeader": "Встроить DocSpace в качестве iframe", - "CSPHelp": "Данный параметр является механизмом безопасности, который можно использовать для защиты от атак путем внедрения контента. CSP описывает безопасные источники для загрузки. Скачивание с ресурсов, не включенных в «белый список», блокируется. Укажите домены (вместе с протоколом), с которыми он будет работать.", + "CSPHelp": "Данный параметр является механизмом безопасности, который можно использовать для защиты от атак путем внедрения контента. CSP описывает безопасные источники для загрузки. Скачивание с ресурсов, не включенных в «белый список», блокируется. Укажите домены (вместе с протоколом), с которыми он будет работать.", "CSPInputPlaceholder": "Введите URL-адрес в формате: https://example.com", "CustomizingDisplay": "Настройка отображения", "DataDisplay": "Настройки отображения данных", diff --git a/packages/client/public/locales/sk/JavascriptSdk.json b/packages/client/public/locales/sk/JavascriptSdk.json index 0c0892e3f3..8922572284 100644 --- a/packages/client/public/locales/sk/JavascriptSdk.json +++ b/packages/client/public/locales/sk/JavascriptSdk.json @@ -5,6 +5,10 @@ "Code": "Kód na vloženie", "CopyWindowCode": "Kopírovať kód na vloženie okna", "CreateSampleHeader": "Vytvoriť vzor vloženia DocSpace", + "CSPDescription": "Pokiaľ chcete bezpečne umiestniť DocSpace na webovú stránku ako iframe, pridajte jeho URL do zoznamu povolených adries.", + "CSPHeader": "Vložiť DocSpace ako iframe", + "CSPHelp": "Toto nastavenie je bezpečnostný mechanizmus, ktorý sa môže použiť na ochranu pred útokmi formou vstrekovania obsahu. CSP popisuje bezpečné zdroje na sťahovanie obsahu. Sťahovanie zo zdrojov, ktoré nie sú na zozname povolených, je zablokované. Zadajte domény (spolu s protokolom), s ktorými bude pracovať.", + "CSPInputPlaceholder": "URL zadávajte nasledovne: https://example.com", "CustomizingDisplay": "Prispôsobenie zobrazovania", "DataDisplay": "Nastavenia zobrazovania údajov", "Descending": "Zostupne", diff --git a/packages/client/public/locales/sk/Settings.json b/packages/client/public/locales/sk/Settings.json index 3a486689c8..f0087a73d8 100644 --- a/packages/client/public/locales/sk/Settings.json +++ b/packages/client/public/locales/sk/Settings.json @@ -39,6 +39,7 @@ "BackupCreatedSuccess": "Kópia zálohy bola úspešne vytvorená.", "BackupList": "Zoznam záloh", "BackupListWarningText": "Ak odstránite niektoré položky zo zoznamu, odstránia sa aj ich príslušné súbory. Táto akcia sa nedá vrátiť späť. Ak chcete odstrániť všetky súbory, použite odkaz:", + "BetaLabel": "BETA", "Branding": "Branding", "BrandingSectionDescription": "Zadajte informácie o vašej spoločnosti, pridajte odkazy na externé zdroje a e-mailové adresy zobrazené v rozhraní DocSpace.", "BrandingSubtitle": "Toto nastavenie použite, ak chcete používateľom poskytnúť zážitok zo značky.", diff --git a/packages/client/public/locales/sl/JavascriptSdk.json b/packages/client/public/locales/sl/JavascriptSdk.json index dc5463e580..c35c023c45 100644 --- a/packages/client/public/locales/sl/JavascriptSdk.json +++ b/packages/client/public/locales/sl/JavascriptSdk.json @@ -5,6 +5,10 @@ "Code": "Koda za vstavitev", "CopyWindowCode": "Kopiraj kodo za vdelavo okna", "CreateSampleHeader": "Ustvarite vzorec vdelave DocSpace", + "CSPDescription": "Če želite varno vdelati DocSpace kot iframe na spletno mesto, dodajte njegov URL na seznam dovoljenih.", + "CSPHeader": "Vdelajte DocSpace kot iframe", + "CSPHelp": "Ta nastavitev je varnostni mehanizem, ki se lahko uporablja za zaščito pred napadi z vnašanjem vsebine. CSP opisuje varne vire za prenos prenos. Prenos iz virov, ki niso na `belem seznamu`, je blokiran. Določite domene (skupaj s protokolom), s katerimi bo delovalo.", + "CSPInputPlaceholder": "Vnesite URL kot v primeru: https://example.com", "CustomizingDisplay": "Prilagajanje zaslona", "DataDisplay": "Nastavitve prikaza podatkov", "Descending": "Padajoče", diff --git a/packages/client/public/locales/sl/Settings.json b/packages/client/public/locales/sl/Settings.json index aa82bbcc45..abd27759b8 100644 --- a/packages/client/public/locales/sl/Settings.json +++ b/packages/client/public/locales/sl/Settings.json @@ -39,6 +39,7 @@ "BackupCreatedSuccess": "Varnostna kopija je bila uspešno ustvarjena.", "BackupList": "Seznam varnostnih kopij", "BackupListWarningText": "Če izbrišete kateri koli predmet iz seznama, bodo izbrisane tudi ustrezne datoteke. Tega dejanja ni mogoče razveljaviti. Če želite izbrisati vse datoteke, uporabite povezavo:", + "BetaLabel": "BETA", "Branding": "Blagovna znamka", "BrandingSectionDescription": "Specificiraj podatke o svojem podjetju, dodaj povezave do zunanjih virov in e-mail naslove, prikazane v vmesniku DocSpace.", "BrandingSubtitle": "Uporabite to možnost, da uporabnikom zagotovite izkušnjo blagovne znamke.", diff --git a/packages/client/public/locales/tr/JavascriptSdk.json b/packages/client/public/locales/tr/JavascriptSdk.json index eed43cd569..c73a1013b6 100644 --- a/packages/client/public/locales/tr/JavascriptSdk.json +++ b/packages/client/public/locales/tr/JavascriptSdk.json @@ -5,6 +5,10 @@ "Code": "Girilecek kod", "CopyWindowCode": "Pencere gömülü kodunu kopyala", "CreateSampleHeader": "Örnek DocSpace yerleştirmesi oluştur", + "CSPDescription": "DocSpace'i bir web sitesine iframe olarak güvenli bir şekilde gömmek için URL bağlantısını izin verilenler listenize ekleyin.", + "CSPHeader": "DocSpace'i iframe olarak gömün", + "CSPHelp": "Bu ayar, içerik yerleştirme saldırılarına karşı koruma sağlamak adına kullanılabilecek bir güvenlik mekanizmasıdır. CSP, güvenli kaynak indirme kaynaklarını niteler. 'Beyaz listede' yer almayan kaynaklardan indirme engellenmiştir. Çalışacağı etki alanlarını (protokol ile) belirtin.", + "CSPInputPlaceholder": "URL'yi bu şekilde girin: https://example.com", "CustomizingDisplay": "Ekranı özelleştirme", "DataDisplay": "Veri görüntüleme ayarları", "Descending": "Azalan", diff --git a/packages/client/public/locales/tr/Settings.json b/packages/client/public/locales/tr/Settings.json index bae798cf2f..7abc563a9c 100644 --- a/packages/client/public/locales/tr/Settings.json +++ b/packages/client/public/locales/tr/Settings.json @@ -39,6 +39,7 @@ "BackupCreatedSuccess": "Yedekleme kopyası başarıyla oluşturuldu.", "BackupList": "Yedekleme listesi", "BackupListWarningText": "Listeden herhangi bir öğe silerseniz bu öğe ile ilgili dosyalar da silinir. Bu işlem geri alınamaz. Tüm dosyaları silmek için linke tıklayın:", + "BetaLabel": "BETA", "Branding": "Markalaşma", "BrandingSectionDescription": "Şirket bilgilerinizi belirtin, DocSpace arayüzünde görüntülenen harici kaynaklara ve e-posta adreslerine bağlantılar ekleyin.", "BrandingSubtitle": "Kullanıcılara markayla ilgili deneyim sağlamak için bu seçeneği kullanın.", diff --git a/packages/client/public/locales/uk-UA/JavascriptSdk.json b/packages/client/public/locales/uk-UA/JavascriptSdk.json index f80ba3ff09..3d1cb665af 100644 --- a/packages/client/public/locales/uk-UA/JavascriptSdk.json +++ b/packages/client/public/locales/uk-UA/JavascriptSdk.json @@ -5,6 +5,10 @@ "Code": "Код для вставлення", "CopyWindowCode": "Скопіювати код вбудовування вікна", "CreateSampleHeader": "Створити зразок вбудовування DocSpace", + "CSPDescription": "Щоб безпечно впровадити DocSpace на вебсайті як вбудований фрейм, додайте його URL-адресу до списку дозволених.", + "CSPHeader": "Впровадити DocSpace як вбудований фрейм", + "CSPHelp": "Цей параметр є механізмом безпеки, який можна використовувати для захисту від ін’єкційних атак. CSP описує безпечні джерела завантаження ресурсів. Завантаження з ресурсів, які не входять до «білого списку», заблоковано. Вкажіть домени (разом із протоколом), з якими він працюватиме.", + "CSPInputPlaceholder": "Введіть URL-адресу в такому форматі: https://example.com", "CustomizingDisplay": "Настроювання показу", "DataDisplay": "Параметри відображення даних", "Descending": "За спаданням", diff --git a/packages/client/public/locales/uk-UA/Settings.json b/packages/client/public/locales/uk-UA/Settings.json index 8edc82318a..ac35923e83 100644 --- a/packages/client/public/locales/uk-UA/Settings.json +++ b/packages/client/public/locales/uk-UA/Settings.json @@ -39,6 +39,7 @@ "BackupCreatedSuccess": "Резервна копія успішно створена.", "BackupList": "Список резервних копій", "BackupListWarningText": "Якщо ви видалите будь-які елементи зі списку, їх відповідні файли також будуть видалені. Цю дію не можна скасувати. Для видалення всіх файлів використовуйте посилання:", + "BetaLabel": "BETA", "Branding": "Брендинг", "BrandingSectionDescription": "Укажіть інформацію про свою компанію, додайте адреси електронної пошти та посилання на зовнішні ресурси, що будуть показані в інтерфейсі DocSpace.", "BrandingSubtitle": "Використовуйте цей параметр, щоб продемонструвати користувачам ваш бренд.", diff --git a/packages/client/public/locales/vi/JavascriptSdk.json b/packages/client/public/locales/vi/JavascriptSdk.json index 84917e74df..782eb7cc69 100644 --- a/packages/client/public/locales/vi/JavascriptSdk.json +++ b/packages/client/public/locales/vi/JavascriptSdk.json @@ -5,6 +5,10 @@ "Code": "Mã để chèn", "CopyWindowCode": "Sao chép mã nhúng cửa sổ", "CreateSampleHeader": "Tạo mẫu nhúng DocSpace", + "CSPDescription": "Để nhúng DocSpace một cách an toàn dưới dạng iframe trong một trang web, hãy thêm URL của nó vào danh sách cho phép của bạn.", + "CSPHeader": "Nhúng DocSpace dưới dạng iframe", + "CSPHelp": "Cài đặt này là một cơ chế bảo mật có thể được sử dụng để bảo vệ chống lại các cuộc tấn công injection. CSP mô tả các nguồn tài nguyên tải xuống an toàn. Việc tải xuống từ các nguồn tài nguyên không có trong “danh sách trắng” sẽ bị chặn. Chỉ định các miền (cùng với giao thức) mà nó sẽ hoạt động.", + "CSPInputPlaceholder": "Nhập URL như thế này: https://example.com", "CustomizingDisplay": "Tùy chỉnh hiển thị", "DataDisplay": "Cài đặt hiển thị dữ liệu", "Descending": "Giảm dần", diff --git a/packages/client/public/locales/vi/Settings.json b/packages/client/public/locales/vi/Settings.json index da71f3bafd..d1521d7e7c 100644 --- a/packages/client/public/locales/vi/Settings.json +++ b/packages/client/public/locales/vi/Settings.json @@ -39,6 +39,7 @@ "BackupCreatedSuccess": "Bản sao lưu đã được tạo thành công.", "BackupList": "Danh sách sao lưu", "BackupListWarningText": "Nếu bạn xóa bất kỳ mục nào trong danh sách, các file tương ứng của chúng cũng sẽ bị xóa. Tác vụ này không thể được hoàn tác. Để xóa tất cả các file này sử dụng liên kết:", + "BetaLabel": "BETA", "Branding": "Thương hiệu", "BrandingSectionDescription": "Nêu rõ thông tin công ty của bạn, thêm liên kết đến tài nguyên bên ngoài và địa chỉ email được hiển thị trong giao diện DocSpace.", "BrandingSubtitle": "Sử dụng tùy chọn này để cung cấp trải nghiệm thương hiệu cho người dùng.", diff --git a/packages/client/public/locales/zh-CN/Errors.json b/packages/client/public/locales/zh-CN/Errors.json index fada338c9c..bb1dd2335f 100644 --- a/packages/client/public/locales/zh-CN/Errors.json +++ b/packages/client/public/locales/zh-CN/Errors.json @@ -2,6 +2,7 @@ "Error401Text": "抱歉,资源目前无法访问。", "Error403Text": "对不起,拒绝访问。", "Error404Text": "对不起,找不到资源。", + "ErrorDeactivatedText": "该协作空间已停用", "ErrorEmptyResponse": "空响应", "ErrorOfflineText": "未找到网络连接。", "ErrorUnavailableText": "协作空间不可用" diff --git a/packages/client/src/pages/Errors/520/index.js b/packages/client/src/pages/Errors/520/index.js index 824fa38c63..6025966275 100644 --- a/packages/client/src/pages/Errors/520/index.js +++ b/packages/client/src/pages/Errors/520/index.js @@ -1,4 +1,4 @@ -import React, { useState } from "react"; +import React, { useState, useEffect } from "react"; import styled from "styled-components"; import { inject, observer } from "mobx-react"; import { I18nextProvider, useTranslation } from "react-i18next"; @@ -9,6 +9,11 @@ import { ZendeskAPI } from "@docspace/common/components/Zendesk"; import { ReportDialog } from "SRC_DIR/components/dialogs"; import DocspaceLogo from "SRC_DIR/DocspaceLogo"; +import { + getCrashReport, + downloadJson, + getCurrentDate, +} from "SRC_DIR/helpers/crashReport"; import i18n from "./i18n"; @@ -34,12 +39,30 @@ const StyledWrapper = styled.div` } `; -const Error520 = ({ errorLog, currentColorScheme, FirebaseHelper }) => { +const Error520 = ({ + errorLog, + currentColorScheme, + FirebaseHelper, + user, + version, +}) => { const { t } = useTranslation(["Common"]); const { error } = useParams(); const [reportDialogVisible, setReportDialogVisible] = useState(false); + const autoSendReport = async () => { + const report = getCrashReport(user.id, version, user.cultureName, errorLog); + const reportWithDescription = Object.assign(report, { + description: "AUTO SEND", + }); + await FirebaseHelper.sendCrashReport(reportWithDescription); + }; + + useEffect(() => { + FirebaseHelper.isEnabledDB && autoSendReport(); + }, []); + const showDialog = () => { setReportDialogVisible(true); }; @@ -63,9 +86,9 @@ const Error520 = ({ errorLog, currentColorScheme, FirebaseHelper }) => { { const Error520Wrapper = inject(({ auth }) => { const { currentColorScheme, firebaseHelper } = auth.settingsStore; + const { user } = auth.userStore; return { currentColorScheme, FirebaseHelper: firebaseHelper, + user, + version: auth.version, }; })(observer(Error520)); diff --git a/packages/client/src/pages/Errors/Unavailable/index.js b/packages/client/src/pages/Errors/Unavailable/index.js index 1499f57303..b29ee6f40c 100644 --- a/packages/client/src/pages/Errors/Unavailable/index.js +++ b/packages/client/src/pages/Errors/Unavailable/index.js @@ -20,7 +20,7 @@ const ErrorUnavailable = ({ logoUrl }) => { return ready ? ( - + ) : ( <> diff --git a/packages/client/src/pages/PortalSettings/Layout/Section/Header/index.js b/packages/client/src/pages/PortalSettings/Layout/Section/Header/index.js index b7cb89ac2f..7c91848b4b 100644 --- a/packages/client/src/pages/PortalSettings/Layout/Section/Header/index.js +++ b/packages/client/src/pages/PortalSettings/Layout/Section/Header/index.js @@ -79,10 +79,6 @@ const HeaderContainer = styled.div` font-size: 18px; line-height: 59px !important; } - - .settings-section_header { - padding-top: 6px; - } } `; diff --git a/packages/client/src/pages/PortalSettings/categories/data-management/backup/restore-backup/sub-components/ButtonComponent.js b/packages/client/src/pages/PortalSettings/categories/data-management/backup/restore-backup/sub-components/ButtonComponent.js index a3f0221e03..ead02130b0 100644 --- a/packages/client/src/pages/PortalSettings/categories/data-management/backup/restore-backup/sub-components/ButtonComponent.js +++ b/packages/client/src/pages/PortalSettings/categories/data-management/backup/restore-backup/sub-components/ButtonComponent.js @@ -8,7 +8,6 @@ import { TenantStatus } from "@docspace/common/constants"; import { startRestore } from "@docspace/common/api/portal"; import { combineUrl } from "@docspace/common/utils"; import toastr from "@docspace/components/toast/toastr"; -import { request } from "@docspace/common/api/client"; const ButtonContainer = (props) => { const { @@ -28,31 +27,13 @@ const ButtonContainer = (props) => { setTenantStatus, isFormReady, getStorageParams, + uploadLocalFile, } = props; const navigate = useNavigate(); - const [isUploadingLocalFile, setIsUploadingLocalFile] = useState(false); const [isLoading, setIsLoading] = useState(false); - const localFileUploading = async () => { - try { - const checkedFile = await request({ - baseURL: combineUrl(window.DocSpaceConfig?.proxy?.url, config.homepage), - method: "post", - url: `/backupFileUpload.ashx`, - responseType: "text", - data: restoreResource, - }); - - return checkedFile; - } catch (e) { - toastr.error(e); - setIsUploadingLocalFile(false); - return null; - } - }; - const onRestoreClick = async () => { if (isCheckedThirdPartyStorage) { const requiredFieldsFilled = isFormReady(); @@ -76,16 +57,16 @@ const ButtonContainer = (props) => { } if (isCheckedLocalFile) { - const isUploadedFile = await localFileUploading(); + const uploadedFile = await uploadLocalFile(); - if (!isUploadedFile) { + if (!uploadedFile) { + toastr.error(t("BackupCreatedError")); setIsLoading(false); return; } - if (isUploadedFile?.Message) { - toastr.error(isUploadedFile.Message); - setIsUploadingLocalFile(false); + if (!uploadedFile.data.EndUpload) { + toastr.error(uploadedFile.data.Message ?? t("BackupCreatedError")); setIsLoading(false); return; } @@ -109,19 +90,17 @@ const ButtonContainer = (props) => { } catch (e) { toastr.error(e); - setIsUploadingLocalFile(false); setIsLoading(false); } }; const isButtonDisabled = isLoading || - isUploadingLocalFile || !isMaxProgress || !isConfirmed || !isEnableRestore || !restoreResource; - const isLoadingButton = isUploadingLocalFile || isLoading; + const isLoadingButton = isLoading; return ( <> @@ -156,11 +135,13 @@ export default inject(({ auth, backup }) => { isFormReady, getStorageParams, restoreResource, + uploadLocalFile, } = backup; const { isRestoreAndAutoBackupAvailable } = currentQuotaStore; const isMaxProgress = downloadingProgress === 100; return { + uploadLocalFile, isMaxProgress, setTenantStatus, isEnableRestore: isRestoreAndAutoBackupAvailable, diff --git a/packages/client/src/pages/PortalSettings/categories/data-management/backup/restore-backup/sub-components/LocalFileModule.js b/packages/client/src/pages/PortalSettings/categories/data-management/backup/restore-backup/sub-components/LocalFileModule.js index 18d689282c..155e5aa8f0 100644 --- a/packages/client/src/pages/PortalSettings/categories/data-management/backup/restore-backup/sub-components/LocalFileModule.js +++ b/packages/client/src/pages/PortalSettings/categories/data-management/backup/restore-backup/sub-components/LocalFileModule.js @@ -5,10 +5,7 @@ import FileInput from "@docspace/components/file-input"; const LocalFile = ({ setRestoreResource, isEnableRestore, t }) => { const onClickInput = (file) => { - let data = new FormData(); - data.append("file", file); - - setRestoreResource(data); + setRestoreResource(file); }; return ( diff --git a/packages/client/src/pages/PortalSettings/categories/integration/ThirdPartyServicesSettings/index.js b/packages/client/src/pages/PortalSettings/categories/integration/ThirdPartyServicesSettings/index.js index debba32de7..c36821d038 100644 --- a/packages/client/src/pages/PortalSettings/categories/integration/ThirdPartyServicesSettings/index.js +++ b/packages/client/src/pages/PortalSettings/categories/integration/ThirdPartyServicesSettings/index.js @@ -164,7 +164,9 @@ class ThirdPartyServices extends React.Component { (consumer) => consumer.title !== "Bitly" && consumer.title !== "WordPress" && - consumer.title !== "DocuSign" + consumer.title !== "DocuSign" && + consumer.name !== "clickatell" && //TODO: hide while 2fa by sms is not working + consumer.name !== "twilio" ); const imgSrc = theme.isBase ? IntegrationSvgUrl : IntegrationDarkSvgUrl; diff --git a/packages/client/src/pages/PortalSettings/categories/security/access-portal/tfa.js b/packages/client/src/pages/PortalSettings/categories/security/access-portal/tfa.js index 616e2c0cdd..122f5975e2 100644 --- a/packages/client/src/pages/PortalSettings/categories/security/access-portal/tfa.js +++ b/packages/client/src/pages/PortalSettings/categories/security/access-portal/tfa.js @@ -163,12 +163,13 @@ const TwoFactorAuth = (props) => { label: t("Disabled"), value: "none", }, - { + //TODO: hide while 2fa by sms is not working + /*{ id: "by-sms", label: t("BySms"), value: "sms", disabled: !smsDisabled, - }, + },*/ { id: "by-app", label: t("ByApp"), diff --git a/packages/client/src/pages/Profile/Section/Body/sub-components/main-profile/index.js b/packages/client/src/pages/Profile/Section/Body/sub-components/main-profile/index.js index 8837b7d03e..878b86eb05 100644 --- a/packages/client/src/pages/Profile/Section/Body/sub-components/main-profile/index.js +++ b/packages/client/src/pages/Profile/Section/Body/sub-components/main-profile/index.js @@ -92,7 +92,7 @@ const MainProfile = (props) => { : DefaultUserAvatarMax; const tooltipLanguage = ( - + "In case you cannot find your language in the list of the available ones, feel free to write to us at @@ -447,13 +447,8 @@ const MainProfile = (props) => { export default inject(({ auth, peopleStore }) => { const { withActivationBar, sendActivationLink } = auth.userStore; - const { - theme, - helpLink, - culture, - currentColorScheme, - documentationEmail, - } = auth.settingsStore; + const { theme, helpLink, culture, currentColorScheme, documentationEmail } = + auth.settingsStore; const { targetUser: profile, diff --git a/packages/client/src/pages/Sdk/index.js b/packages/client/src/pages/Sdk/index.js index 2c251786b0..010bd5c89e 100644 --- a/packages/client/src/pages/Sdk/index.js +++ b/packages/client/src/pages/Sdk/index.js @@ -159,6 +159,7 @@ const Sdk = ({ component = ( { this.restoreResource = value; }; + + setChunkUploadSize = (chunkUploadSize) => { + this.chunkUploadSize = chunkUploadSize; + }; + + uploadFileChunks = async (requestsDataArray, url) => { + const length = requestsDataArray.length; + let res; + + for (let index = 0; index < length; index++) { + res = await uploadBackup( + combineUrl(window.DocSpaceConfig?.proxy?.url, config.homepage, url), + requestsDataArray[index] + ); + + if (!res) return false; + + if (res.data.Message || !res.data.Success) return res; + } + + return res; + }; + uploadLocalFile = async () => { + try { + const url = "/backupFileUpload.ashx"; + + const res = await uploadBackup( + combineUrl( + window.DocSpaceConfig?.proxy?.url, + config.homepage, + `${url}?init=true&totalSize=${this.restoreResource.size}` + ) + ); + + if (!res) return false; + + if (res.data.Message || !res.data.Success) return res; + + const chunkUploadSize = res.data.ChunkSize; + + const chunks = Math.ceil( + this.restoreResource.size / chunkUploadSize, + chunkUploadSize + ); + + const requestsDataArray = []; + + let chunk = 0; + + while (chunk < chunks) { + const offset = chunk * chunkUploadSize; + const formData = new FormData(); + formData.append( + "file", + this.restoreResource.slice(offset, offset + chunkUploadSize) + ); + + requestsDataArray.push(formData); + chunk++; + } + + return await this.uploadFileChunks(requestsDataArray, url); + } catch (e) { + toastr.error(e); + return null; + } + }; } export default BackupStore; diff --git a/packages/client/src/store/FilesActionsStore.js b/packages/client/src/store/FilesActionsStore.js index a670166ce9..42959dbbfe 100644 --- a/packages/client/src/store/FilesActionsStore.js +++ b/packages/client/src/store/FilesActionsStore.js @@ -824,7 +824,7 @@ class FilesActionStore { return removeFiles(items, [], false, true) .then(async (res) => { if (res[0]?.error) return Promise.reject(res[0].error); - const data = res ? res : null; + const data = res[0] ? res[0] : null; await this.uploadDataStore.loopFilesOperations(data, pbData); this.updateCurrentFolder(null, [itemId], null, operationId); }) diff --git a/packages/client/src/store/ProfileActionsStore.js b/packages/client/src/store/ProfileActionsStore.js index 2806aa154c..ff35d86f26 100644 --- a/packages/client/src/store/ProfileActionsStore.js +++ b/packages/client/src/store/ProfileActionsStore.js @@ -170,9 +170,17 @@ class ProfileActionsStore { }; onLogoutClick = () => { - this.authStore.logout().then(() => { + this.authStore.logout().then((ssoLogoutUrl) => { this.filesStore.reset(); this.peopleStore.reset(); + setTimeout(() => { + window.location.replace( + combineUrl( + window.DocSpaceConfig?.proxy?.url, + ssoLogoutUrl || "/login" + ) + ); + }, 300); }); }; diff --git a/packages/client/src/store/SsoFormStore.js b/packages/client/src/store/SsoFormStore.js index 1df38b3c7c..19b30abcb3 100644 --- a/packages/client/src/store/SsoFormStore.js +++ b/packages/client/src/store/SsoFormStore.js @@ -279,8 +279,8 @@ class SsoFormStore { try { return await validateCerts(data); } catch (err) { - toastr.error(err); - console.error(err); + toastr.error(err?.response?.data || err); + console.error("validateCertificate failed", { err }); } }; diff --git a/packages/common/api/files/index.js b/packages/common/api/files/index.js index 1ac8011256..fb7970434d 100644 --- a/packages/common/api/files/index.js +++ b/packages/common/api/files/index.js @@ -567,6 +567,10 @@ export function uploadFile(url, data) { return axios.post(url, data); } +export function uploadBackup(url, data) { + return axios.post(url, data); +} + export function downloadFiles(fileIds, folderIds, shareKey) { const data = { fileIds, folderIds }; const share = shareKey ? `?share=${shareKey}` : ""; diff --git a/packages/common/constants/index.js b/packages/common/constants/index.js index f70a5a51f2..61e1f75ac8 100644 --- a/packages/common/constants/index.js +++ b/packages/common/constants/index.js @@ -2,6 +2,7 @@ import ShareGoogleReactSvgUrl from "PUBLIC_DIR/images/share.google.react.svg?url import ShareFacebookReactSvgUrl from "PUBLIC_DIR/images/share.facebook.react.svg?url"; import ShareTwitterReactSvgUrl from "PUBLIC_DIR/images/share.twitter.react.svg?url"; import ShareLinkedinReactSvgUrl from "PUBLIC_DIR/images/share.linkedin.react.svg?url"; +import ShareMicrosoftReactSvgUrl from "PUBLIC_DIR/images/share.microsoft.react.svg?url"; export const LANGUAGE = "asc_language"; export const COOKIE_EXPIRATION_YEAR = 31536000000; @@ -266,6 +267,10 @@ export const providersData = Object.freeze({ label: "linkedin", icon: ShareLinkedinReactSvgUrl, }, + microsoft: { + label: "microsoft", + icon: ShareMicrosoftReactSvgUrl, + }, }); export const LoaderStyle = { title: "", diff --git a/packages/common/store/AuthStore.js b/packages/common/store/AuthStore.js index 3b5e4a47c4..43d3920f4b 100644 --- a/packages/common/store/AuthStore.js +++ b/packages/common/store/AuthStore.js @@ -93,31 +93,35 @@ class AuthStore { const requests = []; + const isPortalDeactivated = this.settingsStore.isPortalDeactivate; + + const isPortalRestore = + this.settingsStore.tenantStatus === TenantStatus.PortalRestore; + if ( this.settingsStore.isLoaded && this.settingsStore.socketUrl && !this.settingsStore.isPublicRoom ) { - requests.push( - this.userStore.init().then(() => { - if ( - this.isQuotaAvailable && - this.settingsStore.tenantStatus !== TenantStatus.PortalRestore - ) { - this.getTenantExtra(); - } - }) - ); + !isPortalDeactivated && + requests.push( + this.userStore.init().then(() => { + if (this.isQuotaAvailable && !isPortalRestore) { + this.getTenantExtra(); + } + }) + ); } else { this.userStore.setIsLoaded(true); } if (this.isAuthenticated && !skipRequest) { - this.settingsStore.tenantStatus !== TenantStatus.PortalRestore && + !isPortalRestore && + !isPortalDeactivated && requests.push(this.settingsStore.getAdditionalResources()); if (!this.settingsStore.passwordSettings) { - if (this.settingsStore.tenantStatus !== TenantStatus.PortalRestore) { + if (!isPortalRestore && !isPortalDeactivated) { requests.push( this.settingsStore.getPortalPasswordSettings(), this.settingsStore.getCompanyInfoSettings() @@ -320,10 +324,9 @@ class AuthStore { }; logout = async () => { - await api.user.logout(); + const ssoLogoutUrl = await api.user.logout(); this.isLogout = true; - //console.log("Logout response ", response); setWithCredentialsStatus(false); @@ -331,6 +334,8 @@ class AuthStore { isDesktop && logoutDesktop(); + if (ssoLogoutUrl) return ssoLogoutUrl; + this.reset(true); this.userStore.setUser(null); this.init(); diff --git a/packages/common/store/SettingsStore.js b/packages/common/store/SettingsStore.js index 5d3f3718f6..72890e409c 100644 --- a/packages/common/store/SettingsStore.js +++ b/packages/common/store/SettingsStore.js @@ -441,6 +441,10 @@ class SettingsStore { } }; + get isPortalDeactivate() { + return this.tenantStatus === TenantStatus.PortalDeactivate; + } + init = async () => { this.setIsLoading(true); const requests = []; @@ -448,12 +452,15 @@ class SettingsStore { requests.push( this.getPortalSettings(), this.getAppearanceTheme(), - this.getWhiteLabelLogoUrls(), - this.getBuildVersionInfo() + this.getWhiteLabelLogoUrls() ); await Promise.all(requests); + if (!this.isPortalDeactivate) { + await this.getBuildVersionInfo(); + } + this.setIsLoading(false); this.setIsLoaded(true); }; diff --git a/packages/common/utils/index.ts b/packages/common/utils/index.ts index 5593e59998..4a21299f6e 100644 --- a/packages/common/utils/index.ts +++ b/packages/common/utils/index.ts @@ -283,6 +283,8 @@ export function getProviderTranslation(provider, t, linked = false) { return t("Common:SignInWithTwitter"); case "linkedin": return t("Common:SignInWithLinkedIn"); + case "microsoft": + return t("Common:SignInWithMicrosoft"); case "sso": return t("Common:SignInWithSso"); } diff --git a/products/ASC.Files/Core/Core/Thirdparty/Dropbox/DropboxStorage.cs b/products/ASC.Files/Core/Core/Thirdparty/Dropbox/DropboxStorage.cs index f4eaa9d709..d328479b4d 100644 --- a/products/ASC.Files/Core/Core/Thirdparty/Dropbox/DropboxStorage.cs +++ b/products/ASC.Files/Core/Core/Thirdparty/Dropbox/DropboxStorage.cs @@ -283,9 +283,11 @@ internal class DropboxStorage : IThirdPartyStorage FinishResumableSessionAsync(string dropboxSession, string dropboxFilePath, long offset) { + using var tempBody = new MemoryStream(); return await _dropboxClient.Files.UploadSessionFinishAsync( new UploadSessionCursor(dropboxSession, (ulong)offset), - new CommitInfo(dropboxFilePath, WriteMode.Overwrite.Instance)); + new CommitInfo(dropboxFilePath, WriteMode.Overwrite.Instance), + body: tempBody); } public string MakeId(Metadata dropboxItem) diff --git a/products/ASC.Files/Core/Utils/EntryManager.cs b/products/ASC.Files/Core/Utils/EntryManager.cs index bf61315b3b..03611b638b 100644 --- a/products/ASC.Files/Core/Utils/EntryManager.cs +++ b/products/ASC.Files/Core/Utils/EntryManager.cs @@ -479,7 +479,7 @@ public class EntryManager .ToListAsync(); var filesCount = count - folders.Count; - var filesOffset = folders.Count > 0 ? 0 : from - await allFoldersCountTask; + var filesOffset = Math.Max(folders.Count > 0 ? 0 : from - await allFoldersCountTask, 0); var files = await fileDao.GetFilesAsync(parent.Id, orderBy, filesFilterType, subjectGroup, subjectId, filesSearchText, searchInContent, withSubfolders, excludeSubject, filesOffset, filesCount) .ToListAsync(); diff --git a/public/images/share.microsoft.react.svg b/public/images/share.microsoft.react.svg new file mode 100644 index 0000000000..d8c4047e45 --- /dev/null +++ b/public/images/share.microsoft.react.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/public/locales/az/Common.json b/public/locales/az/Common.json index faea931521..600d9e54f8 100644 --- a/public/locales/az/Common.json +++ b/public/locales/az/Common.json @@ -104,6 +104,7 @@ "EncryptionKeysReload": "Şifrələmə düymələri yenidən daxil edilməlidir", "EnterName": "Adı daxil edin", "Error": "Səhv", + "ErrorEmptyList": "Aktivlərin siyahısı dəyişdirilib. Zəhmət olmasa, məzmunu yoxlayın və yenidən cəhd edin.", "ErrorInternalServer": "Daxili server xətası. Daha sonra yenidən cəhd edin.", "ErrorReport": "Xəta hesabatı", "ErrorReportDescription": "Hansı məlumatın daxil olduğunu görmək üçün aşağıdakı hesabatı açın. Xəta hesabatlarında istifadəçilərin şəxsi məlumatları əks olunmur. Komandamızın problemi daha yaxşı başa düşməsi üçün şərh sahəsindən istifadə edərək məsələni aydın şəkildə təsvir edin.", @@ -239,6 +240,7 @@ "SignInWithFacebook": "Facebook ilə giriş edin", "SignInWithGoogle": "Google ilə giriş edin", "SignInWithLinkedIn": "LinkedIn ilə giriş edin", + "SignInWithMicrosoft": "Microsoft ilə giriş edin", "SignInWithSso": "SSO ilə daxil olun", "SignInWithTwitter": "Twitter ilə giriş edin", "Size": "Ölçü", diff --git a/public/locales/bg/Common.json b/public/locales/bg/Common.json index 2a450d2aef..a698a556a9 100644 --- a/public/locales/bg/Common.json +++ b/public/locales/bg/Common.json @@ -104,6 +104,7 @@ "EncryptionKeysReload": "Криптиращите ключове трябва да се въведат отново", "EnterName": "Въведи име", "Error": "Грешка", + "ErrorEmptyList": "Списъкът с обекти бе променен. Моля, проверете съдържанието и опитайте отново.", "ErrorInternalServer": "Вътрешна грешка на сървъра. Опитайте отново по-късно.", "ErrorReport": "Доклад за грешки", "ErrorReportDescription": "Отворете доклада по-долу, за да видите какви данни са включени. Докладите за грешки не съдържат лични данни на потребителите. За да помогнете на нашия екип да разбере по-добре проблема, опишете го в свободна форма, като използвате полето за коментар.", @@ -239,6 +240,7 @@ "SignInWithFacebook": "Влез с Facebook", "SignInWithGoogle": "Влез с Google", "SignInWithLinkedIn": "Влез с LinkedIn", + "SignInWithMicrosoft": "Влез с Microsoft", "SignInWithSso": "Вход със SSO", "SignInWithTwitter": "Влез с Twitter", "Size": "Размер", diff --git a/public/locales/cs/Common.json b/public/locales/cs/Common.json index 984ae59f3d..9630742ea8 100644 --- a/public/locales/cs/Common.json +++ b/public/locales/cs/Common.json @@ -104,6 +104,7 @@ "EncryptionKeysReload": "Šifrovací klíče musí být zadány znovu", "EnterName": "Zadejte název", "Error": "Chyba", + "ErrorEmptyList": "Seznam entit byl změněn. Zkontrolujte prosím jeho obsah a zkuste to znovu.", "ErrorInternalServer": "Interní chyba serveru. Zkuste to později.", "ErrorReport": "Chybové hlášení", "ErrorReportDescription": "Otevřete níže uvedenou zprávu a podívejte se, jaké údaje obsahuje. Chybová hlášení neobsahují žádné osobní údaje uživatelů. Abyste našemu týmu pomohli lépe porozumět problému, popište jej ve volném formuláři pomocí pole pro komentář.", @@ -239,6 +240,7 @@ "SignInWithFacebook": "Přihlásit se pomocí Facebooku", "SignInWithGoogle": "Přihlásit se pomocí Google", "SignInWithLinkedIn": "Přihlásit se pomocí LinkedIn", + "SignInWithMicrosoft": "Přihlásit se pomocí Microsoft", "SignInWithSso": "Přihlásit se pomocí SSO", "SignInWithTwitter": "Přihlásit se pomocí Twitteru", "Size": "Velikost", diff --git a/public/locales/de/Common.json b/public/locales/de/Common.json index f3ba98b879..6d0dabccd7 100644 --- a/public/locales/de/Common.json +++ b/public/locales/de/Common.json @@ -104,6 +104,7 @@ "EncryptionKeysReload": "Verschlüsselungsschlüssel müssen erneut eingegeben werden", "EnterName": "Namen eingeben", "Error": "Fehler", + "ErrorEmptyList": "Die Liste der Entitäten wurde geändert. Bitte überprüfen Sie den Inhalt und versuchen Sie es erneut.", "ErrorInternalServer": "Interner Serverfehler. Versuchen Sie nochmals später.", "ErrorReport": "Fehlerbericht ", "ErrorReportDescription": "Öffnen Sie den unten stehenden Bericht, um zu sehen, welche Daten enthalten sind. Die Fehlerberichte enthalten keine persönlichen Benutzerdaten. Um unserem Team zu helfen, das Problem besser zu verstehen, beschreiben Sie es im freien Formular im Kommentarfeld.", @@ -239,6 +240,7 @@ "SignInWithFacebook": "Login über Facebook", "SignInWithGoogle": "Login über Google", "SignInWithLinkedIn": "Login über LinkedIn", + "SignInWithMicrosoft": "Login über Microsoft", "SignInWithSso": "Mit SSO anmelden", "SignInWithTwitter": "Login über Twitter", "Size": "Größe", diff --git a/public/locales/el-GR/Common.json b/public/locales/el-GR/Common.json index e279ac05ab..95ddb5a35f 100644 --- a/public/locales/el-GR/Common.json +++ b/public/locales/el-GR/Common.json @@ -104,6 +104,7 @@ "EncryptionKeysReload": "Τα κλειδιά κρυπτογράφησης πρέπει να εισαχθούν εκ νέου", "EnterName": "Εισαγωγή ονόματος", "Error": "Σφάλμα", + "ErrorEmptyList": "Ο κατάλογος των οντοτήτων έχει αλλάξει. Ελέγξτε τα περιεχόμενα και προσπαθήστε ξανά.", "ErrorInternalServer": "Σφάλμα εσωτερικού διακομιστή. Δοκιμάστε ξανά αργότερα.", "ErrorReport": "Αναφορά σφάλματος", "ErrorReportDescription": "Ανοίξτε την παρακάτω αναφορά για να δείτε ποια δεδομένα περιλαμβάνονται. Οι αναφορές σφαλμάτων δεν περιέχουν προσωπικά δεδομένα των χρηστών. Για να βοηθήσετε την ομάδα μας να κατανοήσει καλύτερα το πρόβλημα, περιγράψτε το στη φόρμα χρησιμοποιώντας το πεδίο σχολίων.", @@ -239,6 +240,7 @@ "SignInWithFacebook": "Συνδεθείτε με το Facebook", "SignInWithGoogle": "Συνδεθείτε με την Google", "SignInWithLinkedIn": "Συνδεθείτε με το LinkedIn", + "SignInWithMicrosoft": "Συνδεθείτε με το Microsoft", "SignInWithSso": "Σύνδεση με SSO", "SignInWithTwitter": "Συνδεθείτε με το Twitter", "Size": "Μέγεθος", diff --git a/public/locales/en/Common.json b/public/locales/en/Common.json index 16d8f34118..0e0a57d848 100644 --- a/public/locales/en/Common.json +++ b/public/locales/en/Common.json @@ -242,6 +242,7 @@ "SignInWithFacebook": "Sign in with Facebook", "SignInWithGoogle": "Sign in with Google", "SignInWithLinkedIn": "Sign in with LinkedIn", + "SignInWithMicrosoft": "Sign in with Microsoft", "SignInWithSso": "Sign in with SSO", "SignInWithTwitter": "Sign in with Twitter", "Size": "Size", diff --git a/public/locales/es/Common.json b/public/locales/es/Common.json index fcba2afa0b..4b40cdbb42 100644 --- a/public/locales/es/Common.json +++ b/public/locales/es/Common.json @@ -240,6 +240,7 @@ "SignInWithFacebook": "Iniciar sesión con Facebook", "SignInWithGoogle": "Iniciar sesión con Google", "SignInWithLinkedIn": "Iniciar sesión con LinkedIn", + "SignInWithMicrosoft": "Iniciar sesión con Microsoft", "SignInWithSso": "Iniciar sesión con SSO", "SignInWithTwitter": "Iniciar sesión con Twitter", "Size": "Tamaño", diff --git a/public/locales/fi/Common.json b/public/locales/fi/Common.json index 7a17030253..e8be50312b 100644 --- a/public/locales/fi/Common.json +++ b/public/locales/fi/Common.json @@ -104,6 +104,7 @@ "EncryptionKeysReload": "Salausavaimet on syötettävä uudelleen", "EnterName": "Syötä nimi", "Error": "Virhe", + "ErrorEmptyList": "Kohteiden luetteloa on muutettu. Ole hyvä, tarkista sisältö ja yritä uudelleen.", "ErrorInternalServer": "Palvelimen sisäinen virhe. Yritä myöhemmin uudelleen.", "ErrorReport": "Vikaraportti", "ErrorReportDescription": "Avaan alla oleva raportti nähdäksesi sisällön. Vikaraportit eivät sisällä käyttäjien henkilökohtaisia tietoja. Auttaaksesi tiimiämme ymmärtämään paremmin, kuvaile ongelma vapaassa muodossa käyttäen kommenttikenttää.", @@ -239,6 +240,7 @@ "SignInWithFacebook": "Kirjaudu sisään Facebookilla", "SignInWithGoogle": "Kirjaudu sisään Googlella", "SignInWithLinkedIn": "Kirjaudu sisään LinkedInillä", + "SignInWithMicrosoft": "Kirjaudu sisään Microsoftilla", "SignInWithSso": "Kirjaudu sisään kertakirjautumisella", "SignInWithTwitter": "Kirjaudu sisään Twitterillä", "Size": "Koko", diff --git a/public/locales/fr/Common.json b/public/locales/fr/Common.json index a1ca701c45..f44ed2c312 100644 --- a/public/locales/fr/Common.json +++ b/public/locales/fr/Common.json @@ -240,6 +240,7 @@ "SignInWithFacebook": "Se connecter via Facebook", "SignInWithGoogle": "Se connecter avec Google", "SignInWithLinkedIn": "Se connecter avec LinkedIn", + "SignInWithMicrosoft": "Se connecter avec Microsoft", "SignInWithSso": "Se connecter avec SSO", "SignInWithTwitter": "Se connecter avec Twitter", "Size": "Taille", diff --git a/public/locales/hy-AM/Common.json b/public/locales/hy-AM/Common.json index 2be9fd6b6a..db7020f511 100644 --- a/public/locales/hy-AM/Common.json +++ b/public/locales/hy-AM/Common.json @@ -240,6 +240,7 @@ "SignInWithFacebook": "Մուտք գործեք Facebook-ով", "SignInWithGoogle": "Մուտք գործեք Google-ով", "SignInWithLinkedIn": "Մուտք գործեք LinkedIn-ով", + "SignInWithMicrosoft": "Մուտք գործեք Microsoft-ով", "SignInWithSso": "Մուտք գործեք SSO-ով", "SignInWithTwitter": "Մուտք գործեք Twitter-ով", "Size": "Չափ", diff --git a/public/locales/it/Common.json b/public/locales/it/Common.json index 5f5e995543..3bba1a34f8 100644 --- a/public/locales/it/Common.json +++ b/public/locales/it/Common.json @@ -240,6 +240,7 @@ "SignInWithFacebook": "Accedere con Facebook", "SignInWithGoogle": "Accedere con Google", "SignInWithLinkedIn": "Accedere con LinkedIn", + "SignInWithMicrosoft": "Accedere con Microsoft", "SignInWithSso": "Accedere con SSO", "SignInWithTwitter": "Accedere con Twitter", "Size": "Dimensione", diff --git a/public/locales/ja-JP/Common.json b/public/locales/ja-JP/Common.json index f76388fc1b..6f7e5e8173 100644 --- a/public/locales/ja-JP/Common.json +++ b/public/locales/ja-JP/Common.json @@ -104,6 +104,7 @@ "EncryptionKeysReload": "暗号化キーの再入力が必要", "EnterName": "名前を入力してください", "Error": "エラー", + "ErrorEmptyList": "エンティティのリストが変更されました。内容をご確認の上、再度お試しください。", "ErrorInternalServer": "内部サーバーエラーです。後でもう一度お試しください。", "ErrorReport": "エラーレポート", "ErrorReportDescription": "以下のレポートを開き、そのデータをご確認ください。エラーレポートには、ユーザーの個人情報は一切含まれていません。私たちのチームが問題をよりよく理解するために、コメント欄を使ってフリーフォームで問題を記述して頂ければ幸いです。", @@ -239,6 +240,7 @@ "SignInWithFacebook": "Facebookでサインイン", "SignInWithGoogle": "Googleでサインイン", "SignInWithLinkedIn": "LinkedInでサインイン", + "SignInWithMicrosoft": "Microsoftでサインイン", "SignInWithSso": "SSOでサインイン", "SignInWithTwitter": "Twitterでサインイン", "Size": "サイズ", diff --git a/public/locales/ko-KR/Common.json b/public/locales/ko-KR/Common.json index c3c9f555ef..b51a735df2 100644 --- a/public/locales/ko-KR/Common.json +++ b/public/locales/ko-KR/Common.json @@ -239,6 +239,7 @@ "SignInWithFacebook": "Facebook으로 로그인", "SignInWithGoogle": "Google로 로그인", "SignInWithLinkedIn": "LinkedIn으로 로그인", + "SignInWithMicrosoft": "Microsoft으로 로그인", "SignInWithSso": "SSO로 로그인", "SignInWithTwitter": "Twitter로 로그인", "Size": "크기", diff --git a/public/locales/lo-LA/Common.json b/public/locales/lo-LA/Common.json index cd5cf7c463..dda8c39b29 100644 --- a/public/locales/lo-LA/Common.json +++ b/public/locales/lo-LA/Common.json @@ -239,6 +239,7 @@ "SignInWithFacebook": "ເຂົ້າລະບົບດ້ວຍ Facebook", "SignInWithGoogle": "ເຂົ້າລະບົບດ້ວຍ Google", "SignInWithLinkedIn": "ເຂົ້າລະບົບດ້ວຍ LinkedIn", + "SignInWithMicrosoft": "ເຂົ້າລະບົບດ້ວຍ Microsoft", "SignInWithSso": "ເຂົ້າສູ່ລະບົບດ້ວຍ SSO", "SignInWithTwitter": "ເຂົ້າລະບົບດ້ວຍ Twitter", "Size": "ຂະໜາດ", diff --git a/public/locales/lv/Common.json b/public/locales/lv/Common.json index de8c2c8419..f8101a5a26 100644 --- a/public/locales/lv/Common.json +++ b/public/locales/lv/Common.json @@ -239,6 +239,7 @@ "SignInWithFacebook": "Pierakstīties ar Facebook", "SignInWithGoogle": "Pierakstīties ar Google", "SignInWithLinkedIn": "Pierakstīties ar LinkedIn", + "SignInWithMicrosoft": "Pierakstīties ar Microsoft", "SignInWithSso": "Pierakstīties, izmantojot SSO", "SignInWithTwitter": "Pierakstīties ar Twitter", "Size": "Izmērs", diff --git a/public/locales/nl/Common.json b/public/locales/nl/Common.json index f25b9e8f69..3869245a1a 100644 --- a/public/locales/nl/Common.json +++ b/public/locales/nl/Common.json @@ -104,6 +104,7 @@ "EncryptionKeysReload": "Encryptiesleutels moeten opnieuw worden ingevoerd", "EnterName": "Voer naam in", "Error": "Fout", + "ErrorEmptyList": "De lijst met entiteiten is gewijzigd. Controleer de inhoud en probeer het opnieuw.", "ErrorInternalServer": "Interne serverfout. Probeer het later opnieuw.", "ErrorReport": "Foutverslag", "ErrorReportDescription": "Open het verslag hieronder om te zien welke gegevens erin staan. Foutverslagen bevatten geen persoonlijke gegevens van de gebruikers. Om ons team te helpen het probleem beter te begrijpen, kunt u het beschrijven in het vrije formulier in het opmerkingenveld.", @@ -239,6 +240,7 @@ "SignInWithFacebook": "Aanmelden met Facebook", "SignInWithGoogle": "Aanmelden met Google", "SignInWithLinkedIn": "Aanmelden met LinkedIn", + "SignInWithMicrosoft": "Aanmelden met Microsoft", "SignInWithSso": "Aanmelden met SSO", "SignInWithTwitter": "Aanmelden met Twitter", "Size": "Formaat", diff --git a/public/locales/pl/Common.json b/public/locales/pl/Common.json index 63600c3e8f..1858aff8e5 100644 --- a/public/locales/pl/Common.json +++ b/public/locales/pl/Common.json @@ -104,6 +104,7 @@ "EncryptionKeysReload": "Klucze szyfrowania muszą zostać wpisane ponownie", "EnterName": "Wpisz nazwę", "Error": "Błąd", + "ErrorEmptyList": "Lista podmiotów została zmieniona. Sprawdź zawartość i spróbuj ponownie.", "ErrorInternalServer": "Wewnętrzny błąd serwera. Spróbuj ponownie później.", "ErrorReport": "Raport o błędzie", "ErrorReportDescription": "Otwórz poniższy raport, aby zobaczyć, jakie dane obejmuje. Raporty o błędach nie zawierają żadnych danych osobowych użytkowników. Aby pomóc naszemu zespołowi lepiej zrozumieć problem, opisz go w polu komentarza.", @@ -239,6 +240,7 @@ "SignInWithFacebook": "Zaloguj się przez Facebook", "SignInWithGoogle": "Zaloguj się przez Google", "SignInWithLinkedIn": "Zaloguj się przez LinkedIn", + "SignInWithMicrosoft": "Zaloguj się przez Microsoft", "SignInWithSso": "Zaloguj się za pomocą logowania jednokrotnego", "SignInWithTwitter": "Zaloguj się przez Twitter", "Size": "Rozmiar", diff --git a/public/locales/pt-BR/Common.json b/public/locales/pt-BR/Common.json index 4d194eda91..6a3bb4de26 100644 --- a/public/locales/pt-BR/Common.json +++ b/public/locales/pt-BR/Common.json @@ -240,6 +240,7 @@ "SignInWithFacebook": "Entrar com Facebook", "SignInWithGoogle": "Entrar com Google", "SignInWithLinkedIn": "Entrar com LinkedIn", + "SignInWithMicrosoft": "Entrar com Microsoft", "SignInWithSso": "Fazer login com SSO", "SignInWithTwitter": "Entrar com Twitter", "Size": "Tamanho", diff --git a/public/locales/pt/Common.json b/public/locales/pt/Common.json index 11d8eb33af..e7112e02b4 100644 --- a/public/locales/pt/Common.json +++ b/public/locales/pt/Common.json @@ -104,6 +104,7 @@ "EncryptionKeysReload": "As chaves de Encriptação têm de ser reinseridas", "EnterName": "Introduza o nome", "Error": "Erro", + "ErrorEmptyList": "A lista de entidades foi alterada. Verifique o conteúdo e tente novamente.", "ErrorInternalServer": "Erro interno do servidor. Tente novamente mais tarde.", "ErrorReport": "Relatório do erro", "ErrorReportDescription": "Abra o relatório abaixo para ver que dados estão incluídos. Os relatórios de erros não contêm quaisquer dados pessoais dos utilizadores. Para ajudar a nossa equipa a compreender melhor o problema, descreva-o no formulário livre utilizando o campo de comentários.", @@ -239,6 +240,7 @@ "SignInWithFacebook": "Iniciar sessão com o Facebook", "SignInWithGoogle": "Iniciar sessão com a Google", "SignInWithLinkedIn": "Iniciar sessão com o LinkedIn", + "SignInWithMicrosoft": "Iniciar sessão com a Microsoft", "SignInWithSso": "Entrar com SSO", "SignInWithTwitter": "Iniciar sessão com o Twitter", "Size": "Tamanho", diff --git a/public/locales/ro/Common.json b/public/locales/ro/Common.json index e4bcb5f8fa..5ed0291274 100644 --- a/public/locales/ro/Common.json +++ b/public/locales/ro/Common.json @@ -240,6 +240,7 @@ "SignInWithFacebook": "Conectare cu Facebook", "SignInWithGoogle": "Conectare cu Google", "SignInWithLinkedIn": "Conectare cu LinkedIn", + "SignInWithMicrosoft": "Conectare cu Microsoft", "SignInWithSso": "Conectare cu SSO", "SignInWithTwitter": "Conectare cu Twitter", "Size": "Dimensiune", diff --git a/public/locales/ru/Common.json b/public/locales/ru/Common.json index a31004f091..5314203e9d 100644 --- a/public/locales/ru/Common.json +++ b/public/locales/ru/Common.json @@ -240,6 +240,7 @@ "SignInWithFacebook": "Вход через Facebook", "SignInWithGoogle": "Вход через Google", "SignInWithLinkedIn": "Вход через LinkedIn", + "SignInWithMicrosoft": "Вход через Microsoft", "SignInWithSso": "Вход через SSO", "SignInWithTwitter": "Вход через Twitter", "Size": "Размер", diff --git a/public/locales/sk/Common.json b/public/locales/sk/Common.json index d1a7b979ab..3c8882a3a4 100644 --- a/public/locales/sk/Common.json +++ b/public/locales/sk/Common.json @@ -104,6 +104,7 @@ "EncryptionKeysReload": "Šifrovacie kľúče je potrebné zadať znova", "EnterName": "Zadajte meno", "Error": "Chyba", + "ErrorEmptyList": "Zoznam subjektov bol zmenený. Skontrolujte obsah a skúste znova.", "ErrorInternalServer": "Interná chyba servera. Skúste to znova neskôr.", "ErrorReport": "Hlásenie chyby", "ErrorReportDescription": "Otvorte hlásenie nižšie, aby ste zistili, aké údaje obsahuje. Hlásenie chyby neobsahuje žiadne osobné údaje používateľov. Ak chcete pomôcť nášmu tímu lepšie pochopiť problém, popíšte ho vo voľnej forme v poličke Komentár.", @@ -239,6 +240,7 @@ "SignInWithFacebook": "Prihlásiť sa pomocou Facebook", "SignInWithGoogle": "Prihlásiť sa pomocou Google", "SignInWithLinkedIn": "Prihlásiť sa pomocou LinkedIn", + "SignInWithMicrosoft": "Prihlásiť sa pomocou Microsoft", "SignInWithSso": "Prihlásiť sa pomocou SSO", "SignInWithTwitter": "Prihlásiť sa pomocou Twitteru", "Size": "Veľkosť", diff --git a/public/locales/sl/Common.json b/public/locales/sl/Common.json index 3e1d5c4b35..cea8e1cb85 100644 --- a/public/locales/sl/Common.json +++ b/public/locales/sl/Common.json @@ -104,6 +104,7 @@ "EncryptionKeysReload": "Ključe za šifriranje je potrebno znova vnesti", "EnterName": "Vnesite ime", "Error": "Napaka", + "ErrorEmptyList": "Seznam entitet je spremenjen. Preverite vsebino in poskusite znova.", "ErrorInternalServer": "Notranja napaka strežnika. Ponovno poskusite kasneje.", "ErrorReport": "Poročilo o napaki", "ErrorReportDescription": "Odprite spodnje poročilo, da vidite, kateri podatki so vključeni. Poročila o napakah ne vsebujejo osebnih podatkov uporabnikov. Da bi naši ekipi pomagali bolje razumeti težavo, jo prosto opišite v polju za komentar.", @@ -239,6 +240,7 @@ "SignInWithFacebook": "Prijavi se s Facebook", "SignInWithGoogle": "Prijavi se z Google", "SignInWithLinkedIn": "Prijavi se z LinkedIn", + "SignInWithMicrosoft": "Prijavi se z Microsoft", "SignInWithSso": "Vpiši se s SSO", "SignInWithTwitter": "Prijavi se s Twitter", "Size": "Velikost", diff --git a/public/locales/tr/Common.json b/public/locales/tr/Common.json index 950fa5f1a5..5a24e15ec1 100644 --- a/public/locales/tr/Common.json +++ b/public/locales/tr/Common.json @@ -104,6 +104,7 @@ "EncryptionKeysReload": "Şifreleme anahtarları yeniden girilmelidir", "EnterName": "İsim girin", "Error": "Hata", + "ErrorEmptyList": "Varlıkların listesi değiştirildi. Lütfen içeriği kontrol edip tekrar deneyin.", "ErrorInternalServer": "İç sunucu hatası. Daha sonra tekrar deneyin.", "ErrorReport": "Hata raporu", "ErrorReportDescription": "Hangi verilerin dahil edildiğini görmek için aşağıdaki raporu açın. Hata raporları, kullanıcıların herhangi bir kişisel verisini içermez. Ekibimizin sorunu daha iyi anlamasına yardımcı olmak için, yorum alanını kullanarak düz yazı olarak sorunu açıklayın.", @@ -239,6 +240,7 @@ "SignInWithFacebook": "Facebook hesabınız ile giriş yapın", "SignInWithGoogle": "Google hesabınız ile giriş yapın", "SignInWithLinkedIn": "LinkedIn hesabınız ile giriş yapın", + "SignInWithMicrosoft": "Microsoft hesabınız ile giriş yapın", "SignInWithSso": "SSO ile giriş yap", "SignInWithTwitter": "Twitter hesabınız ile giriş yapın", "Size": "Boyut", diff --git a/public/locales/uk-UA/Common.json b/public/locales/uk-UA/Common.json index 3806f7dd1e..618a2427df 100644 --- a/public/locales/uk-UA/Common.json +++ b/public/locales/uk-UA/Common.json @@ -104,6 +104,7 @@ "EncryptionKeysReload": "Потрібно повторно ввести ключі шифрування", "EnterName": "Введіть ім'я", "Error": "Помилка", + "ErrorEmptyList": "Список об’єктів змінено. Перевірте вміст і спробуйте ще раз.", "ErrorInternalServer": "Внутрішня помилка сервера. Спробуйте ще раз пізніше.", "ErrorReport": "Звіт про помилки", "ErrorReportDescription": "Відкрийте звіт нижче, щоб побачити, які дані він містить. Звіти про помилки не містять персональних даних користувачів. Щоб допомогти нашій команді краще зрозуміти проблему, опишіть її у вільній формі в полі для коментарів.", @@ -239,6 +240,7 @@ "SignInWithFacebook": "Увійти за допомогою Facebook", "SignInWithGoogle": "Увійти за допомогою Google", "SignInWithLinkedIn": "Увійти за допомогою LinkedIn", + "SignInWithMicrosoft": "Увійти за допомогою Microsoft", "SignInWithSso": "Увійти за допомогою єдиного входу", "SignInWithTwitter": "Увійти за допомогою Twitter", "Size": "Розмір", diff --git a/public/locales/vi/Common.json b/public/locales/vi/Common.json index 454579c1a5..1c79024256 100644 --- a/public/locales/vi/Common.json +++ b/public/locales/vi/Common.json @@ -104,6 +104,7 @@ "EncryptionKeysReload": "Phải nhập lại các khóa mã hóa", "EnterName": "Nhập tên", "Error": "Lỗi", + "ErrorEmptyList": "Danh sách các thực thể đã được thay đổi. Vui lòng kiểm tra nội dung và thử lại.", "ErrorInternalServer": "Lỗi server nội bộ. Thử lại sau.", "ErrorReport": "Báo cáo lỗi", "ErrorReportDescription": "Mở báo cáo bên dưới để xem dữ liệu nào được bao gồm. Báo cáo lỗi không chứa bất kỳ dữ liệu cá nhân nào của người dùng. Để giúp nhóm của chúng tôi hiểu rõ hơn về vấn đề, xin hãy mô tả nó trong biểu mẫu tự do bằng cách sử dụng trường nhận xét.", @@ -239,6 +240,7 @@ "SignInWithFacebook": "Đăng nhập bằng Facebook", "SignInWithGoogle": "Đăng nhập bằng Google", "SignInWithLinkedIn": "Đăng nhập bằng LinkedIn", + "SignInWithMicrosoft": "Đăng nhập bằng Microsoft", "SignInWithSso": "Đăng nhập bằng SSO", "SignInWithTwitter": "Đăng nhập bằng Twitter", "Size": "Kích cỡ", diff --git a/public/locales/zh-CN/Common.json b/public/locales/zh-CN/Common.json index e705a988f2..931d47ce36 100644 --- a/public/locales/zh-CN/Common.json +++ b/public/locales/zh-CN/Common.json @@ -240,6 +240,7 @@ "SignInWithFacebook": "使用Facebook登录", "SignInWithGoogle": "使用Google登录", "SignInWithLinkedIn": "使用LinkedIn登录", + "SignInWithMicrosoft": "使用Microsoft登录", "SignInWithSso": "用SSO登录", "SignInWithTwitter": "使用Twitter登录", "Size": "大小", diff --git a/web/ASC.Web.Api/Api/AuthenticationController.cs b/web/ASC.Web.Api/Api/AuthenticationController.cs index bf719d0e78..7e1c793ec3 100644 --- a/web/ASC.Web.Api/Api/AuthenticationController.cs +++ b/web/ASC.Web.Api/Api/AuthenticationController.cs @@ -75,6 +75,7 @@ public class AuthenticationController : ControllerBase private readonly BruteForceLoginManager _bruteForceLoginManager; private readonly ILogger _logger; private readonly InvitationLinkService _invitationLinkService; + private readonly IHttpContextAccessor _httpContextAccessor; public AuthenticationController( UserManager userManager, @@ -112,7 +113,8 @@ public class AuthenticationController : ControllerBase TfaAppAuthSettingsHelper tfaAppAuthSettingsHelper, EmailValidationKeyProvider emailValidationKeyProvider, ILogger logger, - InvitationLinkService invitationLinkService) + InvitationLinkService invitationLinkService, + IHttpContextAccessor httpContextAccessor) { _userManager = userManager; _tenantManager = tenantManager; @@ -150,6 +152,7 @@ public class AuthenticationController : ControllerBase _emailValidationKeyProvider = emailValidationKeyProvider; _logger = logger; _invitationLinkService = invitationLinkService; + _httpContextAccessor = httpContextAccessor; } /// @@ -348,7 +351,7 @@ public class AuthenticationController : ControllerBase [AllowNotPayment] [HttpPost("logout")] [HttpGet("logout")]// temp fix - public async Task LogoutAsync() + public async Task LogoutAsync() { var cookie = _cookiesManager.GetCookies(CookiesType.AuthKey); var loginEventId = _cookieStorage.GetLoginEventIdFromCookie(cookie); @@ -362,6 +365,25 @@ public class AuthenticationController : ControllerBase _cookiesManager.ClearCookies(CookiesType.SocketIO); _securityContext.Logout(); + + + if (!string.IsNullOrEmpty(user.SsoNameId)) + { + var settings = _settingsManager.Load(); + + if (settings.EnableSso && !string.IsNullOrEmpty(settings.IdpSettings.SloUrl)) + { + var logoutSsoUserData = _signature.Create(new LogoutSsoUserData + { + NameId = user.SsoNameId, + SessionId = user.SsoSessionId + }); + + return _setupInfo.SsoSamlLogoutUrl + "?data=" + HttpUtility.UrlEncode(logoutSsoUserData); + } + } + + return null; } /// diff --git a/web/ASC.Web.Api/Api/Settings/BaseSettingsController.cs b/web/ASC.Web.Api/Api/Settings/BaseSettingsController.cs index 258182ed20..22ae60f170 100644 --- a/web/ASC.Web.Api/Api/Settings/BaseSettingsController.cs +++ b/web/ASC.Web.Api/Api/Settings/BaseSettingsController.cs @@ -45,7 +45,7 @@ public partial class BaseSettingsController : ControllerBase internal readonly ApiContext ApiContext; internal readonly IMemoryCache MemoryCache; internal readonly WebItemManager WebItemManager; - private readonly IHttpContextAccessor _httpContextAccessor; + protected readonly IHttpContextAccessor _httpContextAccessor; private readonly int _maxCount = 10; private readonly int _expirationMinutes = 2; diff --git a/web/ASC.Web.Api/Api/Settings/SettingsController.cs b/web/ASC.Web.Api/Api/Settings/SettingsController.cs index a480488dbc..cc3c35aa4e 100644 --- a/web/ASC.Web.Api/Api/Settings/SettingsController.cs +++ b/web/ASC.Web.Api/Api/Settings/SettingsController.cs @@ -407,7 +407,7 @@ public class SettingsController : BaseSettingsController [AllowNotPayment] public object GetMachineName() { - return Dns.GetHostName().ToLowerInvariant(); + return _httpContextAccessor.HttpContext.Request.Host.Value; } /// diff --git a/web/ASC.Web.Api/Core/CspSettings.cs b/web/ASC.Web.Api/Core/CspSettings.cs index fcf4a6a025..2a2e293717 100644 --- a/web/ASC.Web.Api/Core/CspSettings.cs +++ b/web/ASC.Web.Api/Core/CspSettings.cs @@ -51,6 +51,7 @@ public class CspSettingsHelper private readonly TenantManager _tenantManager; private readonly CoreSettings _coreSettings; private readonly GlobalStore _globalStore; + private readonly CoreBaseSettings _coreBaseSettings; private readonly IDistributedCache _distributedCache; private readonly IHttpContextAccessor _httpContextAccessor; private readonly IConfiguration _configuration; @@ -61,6 +62,7 @@ public class CspSettingsHelper TenantManager tenantManager, CoreSettings coreSettings, GlobalStore globalStore, + CoreBaseSettings coreBaseSettings, IDistributedCache distributedCache, IHttpContextAccessor httpContextAccessor, IConfiguration configuration) @@ -70,6 +72,7 @@ public class CspSettingsHelper _tenantManager = tenantManager; _coreSettings = coreSettings; _globalStore = globalStore; + _coreBaseSettings = coreBaseSettings; _distributedCache = distributedCache; _httpContextAccessor = httpContextAccessor; _configuration = configuration; @@ -87,6 +90,13 @@ public class CspSettingsHelper if (domain == Tenant.LocalHost && tenant.Alias == Tenant.LocalHost) { headerKeys.Add(GetKey(Tenant.HostName)); + var ips = Dns.GetHostAddresses(Dns.GetHostName(), AddressFamily.InterNetwork); + + foreach (var ip in ips) + { + headerKeys.Add(GetKey(ip.ToString())); + } + headerKeys.Add(GetKey(_httpContextAccessor.HttpContext.Connection.RemoteIpAddress.ToString())); } @@ -170,6 +180,11 @@ public class CspSettingsHelper var frameBuilder = csp.AllowFraming .FromSelf(); + if (!_coreBaseSettings.Standalone && !string.IsNullOrEmpty(_coreBaseSettings.Basedomain)) + { + def.From($"*.{_coreBaseSettings.Basedomain}"); + } + if (!string.IsNullOrEmpty(_configuration["web:zendesk-key"])) { def.From("*.zdassets.com"); diff --git a/web/ASC.Web.Core/SetupInfo.cs b/web/ASC.Web.Core/SetupInfo.cs index e49bf166be..5667ab0f69 100644 --- a/web/ASC.Web.Core/SetupInfo.cs +++ b/web/ASC.Web.Core/SetupInfo.cs @@ -179,8 +179,8 @@ public class SetupInfo ControlPanelUrl = GetAppSettings("web:controlpanel:url", ""); FontOpenSansUrl = GetAppSettings("web.font.opensans.url", ""); StartProductList = GetAppSettings("web.start.product.list", ""); - SsoSamlLoginUrl = GetAppSettings("web.sso.saml.login.url", ""); - SsoSamlLogoutUrl = GetAppSettings("web.sso.saml.logout.url", ""); + SsoSamlLoginUrl = GetAppSettings("web:sso:saml:login:url", ""); + SsoSamlLogoutUrl = GetAppSettings("web:sso:saml:logout:url", ""); _hideSettings = GetAppSettings("web.hide-settings", string.Empty).Split(new[] { ',', ';', ' ' }, StringSplitOptions.RemoveEmptyEntries); diff --git a/web/ASC.Web.Core/WhiteLabel/AdditionalWhiteLabelSettings.cs b/web/ASC.Web.Core/WhiteLabel/AdditionalWhiteLabelSettings.cs index 0f853bca3c..1a92f2ccf7 100644 --- a/web/ASC.Web.Core/WhiteLabel/AdditionalWhiteLabelSettings.cs +++ b/web/ASC.Web.Core/WhiteLabel/AdditionalWhiteLabelSettings.cs @@ -240,7 +240,7 @@ public class AdditionalWhiteLabelSettingsHelperInit get { var site = _configuration["web:teamlab-site"]; - return !string.IsNullOrEmpty(site) ? site + "/post.ashx?type=buyenterprise" : ""; + return !string.IsNullOrEmpty(site) ? site + "/post.ashx?type=buydocspaceenterprise" : ""; } } }