diff --git a/CHANGELOG.md b/CHANGELOG.md index 7b2cd6d25..09b75b540 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,155 @@ # Change log +## Version 12.6.0 + +### General portal changes + +* Edited sources build. +* Removed mail services transferred to a separate repository (#1378). +* Hidden tariff for 1 and 3 years in SaaS. +* Fixed issue when the ‘With opportunities’ filter does not display contacts that are specified as primary ones in Opportunities but are not specified on the Participants tab (Bug 61833). +* Fixed issue when the drop-down menu in the counter of the space occupied by a user goes out of the browser frame (Bug 61911). +* Added the ‘Copy email’ button for actions with user’s email (Bug 60814). +* Fixed issue when some GUI elements are displayed incorrectly when increasing the font in the browser settings (Bug 62342). +* Fixed issue when the ‘Color’ caption in the calendar editing window from the ‘Other Calendars’ list is formatted in bold (Bug 58850). +* Fixed issue when the uploaded contact logo does not displayed in the contact list (Bug 62378). +* Fixed issue with using the system theme by default for new users (Bug 62067). +* Fixed issue when the filter by group does not work (Bug 58230). +* Fixed issue when the request to upload an image to the server can be performed without cookie (Bug 62933). +* Fixed issue when the ‘Folder title’ field is missing in the ‘Change connection settings’ window for some third-party storages (Bug 62617). +* Fixed issue with an excess dividing line in the menu for a deactivated external link (Bug 62620). +* Fixed issue when the ‘Advanced settings’ menu differs in the Sharing Settings window of the manager and in the editor in the Common documents (Bug 62666). +* Added the ability to restrict access rights to the application files for the Others group (Bug 61602). +* Fixed issue with redirect to the portal main page when opening Control Panel after a day on Ubuntu 22.10 (Bug 62076). +* Fixed the Server-Side Request Forgery (SSRF) vulnerability (Bug 55994). +* Fixed the 'Could not resolve current tenant' error when exporting a large number of contacts (Bug 62984). +* Fixed issue when the password recovery link does not work in EU and SG regions (Bug 62126). +* Replaced the mysql_native_password authorization plugin with a modern one (Bug 62854). +* Fixed issue with the ability to send requests to ApiSystem when expanding the default machinekey (Bug 62489) +* Implemented the recalculation progress bar (Bug 60900). +* Fixed issue when the “To” time is set incorrectly when selecting an area for an event in the Day, Week viewing mode (Bug 62118). +* Fixed issue with the direct link to connect Gmail Gmail via oauth (addons/mail/oauth.aspx) (Bug 62813). +* Fixed issue with the XSS in the “Your subscription has expired” banner (Bug 63457). +* Fixed issue with the XSS sent in the attachment file is triggered (Bug 62497). +* Fixed issue when the page scrolls down when clicking Home/End in the search field (toolbar) (Bug 63526). +* Fixed issue when Open Redirect is possible for an authentication link (refererurl) on the portal (Bug 63328). +* Fixed issue when the quick external link is available for administrators only (Bug 63550). +* Fixed issue with the 'Account' error when trying to log in as a blocked user (Bug 63629). +* Fixed issue when there is an ability to send the Change Email message to any participant under the user (Bug 63538). +* Fixed issue when logout from the portal occurs for the administrator logged in as a user when performing the ‘Log out from all active connections’ action (Bug 63630). +* Fixed issue when old indexes are not removed when upgrading the Elasticsearch version (Bug 63584). +* Fixed issue when the onlyofficeAutoCleanUp service is not removed after updating to v.12.5 (Bug 63684) +* Fixed the "/uploadComplete 500" error when uploading an archive (Bug 64024). +* Fixed issue when the large backup file is not removed from S3 (Bug 63838). +* Fixed issue when the PUT /api/2.0/settings/modetheme.json 401 (Unauthorized) error appears in the console when opening a folder via the external link if the dark theme is set in the system (Bug 64285). +* Fixed issue when the size of the created file is added to the statistics of the administrator who performed the backup after performing backup (Bug 63783). +* Fixed issue when the XSS is triggered by a direct link to a malicious SVG file (Bug 64203). +* Updated versions of all related components to the actual ones (nodejs, python, PostgreSQL) (Bug 62063) +* Fixed issue when the VC++ 2015 additional packages are not updated for older versions (Windows) (Bug 63771). +* Fixed issue with the HTML injection in the Recover Access message (Administrator Message Settings) (Bug 64685). +* Reduced the number of characters displayed in the action button title for the parent folder (Bug 64462). +* Fixed the "undefined (reading 'response')" error in the console when opening the Controls section (Bug 64592). +* Fixed issue when the page title does not return to the default value from Common Settings (Bug 64641). +* Fixed issue when the text in the URL bar blends into the background if the portal dark theme is set (Bug 64589). +* Fixed the "/imagescss/quotebord-b.gif 404 (Not Found)" error when quoting a message (Bug 64577). +* Fixed issue when closing / opening a task fails with the following error "Uncaught TypeError: Cannot read properties of null (reading 'unselectable')" onChrome (Bug 64562). +* Fixed the "ASC.Api.Exceptions.ItemNotFoundException (0x80004005): Item not found" error in logs after removing a project (Bug 64569). +* Fixed issue with the XSS via a direct link to the uploaded malicious file on the Wiki page (Bug 64580). +* Fixed issue with the XSS uploaded files in the forum topic (Bug 64571). +* Fixed the "/Images/volume.svg 404 (Not Found" error when opening an audio file (Bug 64551). +* Fixed issue when the Actions button for the parent folder no longer appears after deleting a subfolder via the Actions menu for the parent folder in the ‘Shared with me’ section (Bug 64465). +* Fixed issue with the ‘Sharing settings’ option in the drop-down menu for the parent folder with external access (Bug 64434). +* Fixed issue with the ‘Sharing settings’ option in the drop-down menu for the parent folder for a Guest in the ‘Shared with me’ section (Bug 64468). +* Fixed issue when the Actions menu button on the Participants tab of the main contact disappears after clicking (Bug 63888). +* Fixed issue when the function to reset the application is not displayed in the user profile if his IP address is listed in exceptions (Bug 64487). +* Fixed issue when the .sxc, .et, .ett, .sxi, .dps, .dpt, .sxw, .stw, .wps, .wpt formats are not converted via the manager (Bug 64705). +* Fixed issue when the .sxi format is not supported (Bug 64708). +* Fixed issue when there are no icons for the .sxc, .et, .ett, .sxi, .dps, .dpt, .sxw, .stw, .wps, .wpt formats (Bug 64706). +* Fixed issue when search by folder contents cannot be performed in the ‘Create form template from file’ window (Bug 64687). +* Fixed issue when the ‘Create form template from file’ window does not correspond to layouts (Bug 64647). +* Fixed issue when the authorization page uses the system theme, regardless of the one selected in the profile (Bug 64588). +* Fixed issue with the ‘Delete’ button in the menu of the parent folder for a third-party storage folder (Bug 64758). +* Fixed issue when the files moved from ‘My Documents’ to Google Drive are displayed in the ‘Common’ section in the statistics (Bug 64393). +* Fixed issue when the ‘No files in this folder’ placeholder does not appear after moving all files from a subfolder with external access (Bug 64644). +* Fixed issue when the folder deleted via the parent folder menu appears again on the ‘Shared with me’ page (Bug 64620). +* Fixed issue with the ‘Back’ button in a subfolder with external access via an inherited link (Bug 64643). +* Edited the Twitter functionality description (Bug 64858). +* Fixed the ‘An item with the same key has already been added.’ error when clicking the ‘Common’ folder counter on the user’s portal (Bug 64862). +* Fixed issue when an empty folder with the same name is duplicated when uploading from the local disk using the drag’n’drop method (Bug 62858). +* Fixed the "Index was out of range. Must be non-negative and less than the size of the collection." error in svcIndexer.data.log (Bug 64630). +* Fixed issue when all sessions are not logged out when changing an email by the portal administrator (Bug 61574). +* Fixed issue when the Mail Server data (connected domains and mailboxes) is not saved in the backup (Bug 33720). +* Fixed issue when the disk space quota is displayed in the profile under the user without rights (Bug 64909). +* Fixed issue when it’s possible to create a user on a custom mail domain without setting a password (Bug 65083). +* Fixed issue when the Imap Sync icon wraps to a new line when reducing the browser window (or setting Zoom to 200%) (Bug 65266). +* Fixed issue with an incoming event less than 30 minutes long from Google or Outlook comes with the wrong time (-1 hour) (Bug 65387). +* Fixed issue when emails from the custom domain are not sent after restoring the portal from SaaS to the server version (Bug 65462). +* Fixed issue when the MX record is not updated after restoring the portal (Bug 65460). +* Updated incorrect links (Bug 65278) +* Fixed issue when the date in the CRM filter is limited to December 2023 (Bug 65683). +* Fixed issue when creating a document in a task is performed with the following error: "Uncaught TypeError: Cannot read properties of null (reading 'document')" (Bug 65737). +* Fixed issue when the ICS file contains an incorrect PRODID attribute (Bug 65571). +* Fixed issue when backup to Google Cloud fails when enabling Public Access Prevention (Bug 65678). +* Fixed issue with endless loading Portal memory quota (Bug 66134). +* Fixed issue when the user who does not have access to the Community module can download any file from the Wiki (Bug 66298). +* Fixed issue with the black portal logo in the PDF Editor with the light theme (Bug 66304). +* Fixed issue when the /api/2.0/portal/startbackup method allows creating backup in My Documents (Bug 66307). +* Fixed issue when the POST /ajaxpro/ASC.Web.UserControls.Bookmarking.BookmarkingUserControl,ASC.Web.Community.ashx method allows a user who does not have access to the Community module to create a bookmark (Bug 66347). +* Fixed issue when the /api/2.0/security/activeconnections/logout/{loginEventId} method is available to users who do not have administrator rights (Bug 66390). +* Removed/replaced ONLYOFFICE Sample Form (.oform) on the portal (Bug 66407). +* Fixed error when converting XML (Bug 66491). +* Fixed issue with the loader when hovering over the Actions button of the parent folder again after deleting a subfolder via the same menu (Bug 66436). +* Added a new icon for the PDF Editor. +* Filling out PDF instead of OFORM is now used. +* Conversion DOCXF to OFORM is no longer supported. +* Added templates for empty files in ar-SA and sr-Latn-RS. +* The history when sharing for external users is now available only to authorized users. +* Closed the functionality for copying text from the editor when the DenyDownload option is set for a file. +* Fixed the ability to enable recaptcha for the login page. Added the description to the Help Center. +* Added display of an error in the title of the landing page for an external link to a file when access to it is closed. +* Edited the birthday page for several birthdays on the same day with long titles. +* Fixed bugs related to the dark theme (#1324, #1336, #1364, #1381, #1383, #1387, #1394, #1409) +* Fixed the bug with the ability to select several answers when voting in a poll with only one choice. +* Completely removed Twitter from CRM (#1371) +* Fixed the GetByFilter method (the target parameter was not passed into the request). +* Fixes for compatibility with DocSpace (#1358 ,#1359 ,#1363) +* Fixed the “ArgumentOutOfRangeException: The absolute expiration value must be in the future” error when specified zero blocking time. +* Added the .mhtml format icon. +* Added setting focus to the password field. + +### Documents module + +* File formats of the OOXML group (docm dotm dotx potm potx ppsm pptm xlsm xltm xltx) are opened for editing without conversion to docx, xlsx, pptx. They will be available for encryption in Private rooms (#1301). Now it’s also possible to share files for commenting – docm dotm dotx potm potx ppsm pptm xlsm xltm xltx, for reviewing – docm dotm dotx, for a custom filter – xlsm xltm xltx. (#1302) +* Added opening for new formats: sxc, et, ett, sxi, dps, dpt, sxw, stw, wps, wpt (Docs v7.4 required). (#1305) +* Conversion when loading and before opening a non-OOXML format is now performed to the ooxml format (not to docx, xlsx, pptx depending on the type). This way the files will be converted to the format selected by DS. For example, if the doc file contains a macros, it will be converted to docm, not to docx. (#1304) +* Users with access for reading are transferred to the editor to be able to specify full access to the protected region in the spreadsheet (Docs v7.4 required). (#1354) +* When adding data to a spreadsheet via an external link to another spreadsheet, the update is available from the edited file (Docs v7.5 required). +* Added the ability to open the editor for an external data source spreadsheet in a new tab if the data is inserted to the spreadsheet via an external link (Docs v7.5 required). +* Added templates for empty files for si-LK, ar-SA and sr-Latn-RS cultures. +* Added new formats for generating thumbnails (#1366) +* Added uiTheme in Desktop v7.5 when portal:login (For Bug 57821 - The color of the connected portal tab does not correspond to the interface theme). +* Generating a form template from a local DOCX file (#1362) +* Added a drop-down list with actions for a parent folder (#1367) +* Added a filter to the fileselector (#1385) +* The pdf format is now considered as fillable one instead of oform. +* Removed docxf to oform conversion. + +### Mail module + +* Fixed an error in recording auto-reply parameters in email services. Due to this error, a user accidentally did not receive emails if there was an overdue auto-reply. +* Fixed SQL requests for calculating counters of read messages in folders. +* Fixed SQL requests for working with emails in custom folders (moving/removing/adding tags). +* Fixed issue when the Mail Server data (connected domains and mailboxes) is not saved in the backup (Bug 33720). + +### Control Panel + +* Added the ability to restrict access rights to the application files for the Others group (Bug 61602). +* Fixed issue with redirect to the portal main page when opening Control Panel after a day on Ubuntu 22.10 (Bug 62076). +* Fixed retrieving data error when opening the backup page (Bug 63163). +* Fixed issue when backup with Mail is not performed after disabling and enabling encryption (added text about stopping services and the instruction to the Help Center) (Bug 64223). +* Fixed issue when features are not saved to the new tariff when setting a quota for the portal (Bug 65324). +* Edited sources build. + ## Version 12.5.2 ### General portal changes diff --git a/build/WinSW3.0.0.exe b/build/WinSW3.0.0.exe new file mode 100644 index 000000000..de3014513 Binary files /dev/null and b/build/WinSW3.0.0.exe differ diff --git a/build/install/deb/debian/compat b/build/install/deb/debian/compat index ec635144f..f599e28b8 100644 --- a/build/install/deb/debian/compat +++ b/build/install/deb/debian/compat @@ -1 +1 @@ -9 +10 diff --git a/build/install/deb/debian/onlyofficeSocketIO.service b/build/install/deb/debian/onlyofficeSocketIO.service index d30112016..04f3ec0ca 100644 --- a/build/install/deb/debian/onlyofficeSocketIO.service +++ b/build/install/deb/debian/onlyofficeSocketIO.service @@ -8,6 +8,7 @@ Type=simple WorkingDirectory=/var/www/onlyoffice/Services/ASC.Socket.IO/ ExecStartPre=/bin/bash -c 'rm -f /tmp/onlyofficeSocketIO' ExecStart=/usr/bin/node /var/www/onlyoffice/Services/ASC.Socket.IO/app.js UNIX.SERVER +Environment=NODE_OPTIONS=--dns-result-order=ipv4first User=onlyoffice Group=onlyoffice # Give up if ping don't get an answer diff --git a/build/install/deb/debian/onlyofficeSsoAuth.service b/build/install/deb/debian/onlyofficeSsoAuth.service index fa85d0426..ecc667fb9 100644 --- a/build/install/deb/debian/onlyofficeSsoAuth.service +++ b/build/install/deb/debian/onlyofficeSsoAuth.service @@ -7,6 +7,7 @@ Type=simple WorkingDirectory=/var/www/onlyoffice/Services/ASC.SsoAuth ExecStartPre=/bin/bash -c 'rm -f /tmp/onlyofficeSsoAuth' ExecStart=/usr/bin/node /var/www/onlyoffice/Services/ASC.SsoAuth/app.js UNIX.SERVER +Environment=NODE_OPTIONS=--dns-result-order=ipv4first User=onlyoffice Group=onlyoffice # Give up if ping don't get an answer diff --git a/build/install/deb/debian/onlyofficeThumb.service b/build/install/deb/debian/onlyofficeThumb.service index 530d92a60..b6e00e68b 100644 --- a/build/install/deb/debian/onlyofficeThumb.service +++ b/build/install/deb/debian/onlyofficeThumb.service @@ -7,6 +7,7 @@ Type=simple WorkingDirectory=/var/www/onlyoffice/Services/ASC.Thumbnails ExecStartPre=/bin/bash -c 'rm -f /tmp/onlyofficeThumb' ExecStart=/usr/bin/node /var/www/onlyoffice/Services/ASC.Thumbnails/index.js UNIX.SERVER +Environment=NODE_OPTIONS=--dns-result-order=ipv4first User=onlyoffice Group=onlyoffice # Give up if ping don't get an answer diff --git a/build/install/deb/debian/onlyofficeUrlShortener.service b/build/install/deb/debian/onlyofficeUrlShortener.service index 5ef15761d..71e8c9079 100644 --- a/build/install/deb/debian/onlyofficeUrlShortener.service +++ b/build/install/deb/debian/onlyofficeUrlShortener.service @@ -8,6 +8,7 @@ Type=simple WorkingDirectory=/var/www/onlyoffice/Services/ASC.UrlShortener/ ExecStartPre=/bin/bash -c 'rm -f /tmp/onlyofficeUrlShortener' ExecStart=/usr/bin/node /var/www/onlyoffice/Services/ASC.UrlShortener/index.js UNIX.SERVER +Environment=NODE_OPTIONS=--dns-result-order=ipv4first User=onlyoffice Group=onlyoffice # Give up if ping don't get an answer diff --git a/build/install/deb/debian/onlyofficeWebDav.service b/build/install/deb/debian/onlyofficeWebDav.service index 2f8b2f7b8..ef20140b2 100644 --- a/build/install/deb/debian/onlyofficeWebDav.service +++ b/build/install/deb/debian/onlyofficeWebDav.service @@ -8,6 +8,7 @@ Type=simple WorkingDirectory=/var/www/onlyoffice/Services/ASC.WebDav/server ExecStartPre=/bin/bash -c 'rm -f /tmp/onlyofficeWebDav' ExecStart=/usr/bin/node /var/www/onlyoffice/Services/ASC.WebDav/server/webDavServer.js UNIX.SERVER +Environment=NODE_OPTIONS=--dns-result-order=ipv4first User=onlyoffice Group=onlyoffice # Give up if ping don't get an answer diff --git a/build/install/deb/debian/postinst b/build/install/deb/debian/postinst index 887d74100..e0c666868 100644 --- a/build/install/deb/debian/postinst +++ b/build/install/deb/debian/postinst @@ -27,6 +27,7 @@ APP_INDEX_DIR="${APP_DATA_DIR}/Index/v${ELASTIC_SEARCH_VERSION}" APP_SERVICES_DIR="$DIR/Services"; OLD_VERSION="$2" NGINX_ROOT_DIR="/etc/nginx" +CONFIG_DIR="/etc/{{package_sysname}}/communityserver" DB_HOST="" DB_USER="" @@ -51,17 +52,20 @@ apply_connection_string(){ -e "s!\(\"database\":\).*!\1 \"${DB_NAME}\"!" {} \; fi - sed -i "s/Server=.*/Server=$DB_HOST;Port=3306;Database=$DB_NAME;User ID=$DB_USER;Password=$DB_PWD;Pooling=true;Character Set=utf8;AutoEnlist=false;SSL Mode=none;AllowPublicKeyRetrieval=True;ConnectionReset=false\",/g" /etc/{{package_sysname}}/communityserver/appsettings.production.json + sed -i "s/Server=.*/Server=$DB_HOST;Port=3306;Database=$DB_NAME;User ID=$DB_USER;Password=$DB_PWD;Pooling=true;Character Set=utf8;AutoEnlist=false;SSL Mode=none;AllowPublicKeyRetrieval=True;ConnectionReset=false\",/g" $CONFIG_DIR/appsettings.production.json } apply_core_machinekey(){ db_get {{package_sysname}}-communityserver/machinekey || true - CORE_MACHINEKEY="${RET:-$(sed -n '/"core.machinekey"/s!.*value\s*=\s*"\([^"]*\)".*!\1!p' ${DIR}/WebStudio/web.appsettings.config)}"; + + [ ! -z "${OLDER_PACKAGE_VERSION}" ] && CORE_MACHINEKEY="${RET:-$(sed -n '/"core.machinekey"/s!.*value\s*=\s*"\([^"]*\)".*!\1!p' ${DIR}/WebStudio/web.appsettings.config)}" || \ + CORE_MACHINEKEY="${RET:-$(cat /dev/urandom | tr -dc A-Za-z0-9 | head -c 12)}" + [ -z "$RET" ] && db_set {{package_sysname}}-communityserver/machinekey "${CORE_MACHINEKEY}" || true sed "s^\(machine_key\)\s*=.*^\1 = ${CORE_MACHINEKEY}^g" -i ${APP_SERVICES_DIR}/TeamLabSvc/radicale.config - binDirs=("$DIR/ApiSystem/" "$DIR/WebStudio" "$DIR/controlpanel/www/config" "$APP_SERVICES_DIR" "/etc/{{package_sysname}}/communityserver") + binDirs=("$DIR/ApiSystem/" "$DIR/WebStudio" "$DIR/controlpanel/www/config" "$APP_SERVICES_DIR" "$CONFIG_DIR") for i in "${!binDirs[@]}"; do if [ -d "${binDirs[$i]}" ]; then @@ -133,12 +137,6 @@ install_db(){ else sed "s/collation_server.*/collation_server = utf8_general_ci/" -i ${CNF_PATH} || true # ignore errors fi - - if ! grep -q "^default-authentication-plugin" ${CNF_PATH}; then - sed '/\[mysqld\]/a default-authentication-plugin = mysql_native_password' -i ${CNF_PATH} - else - sed "s/default-authentication-plugin.*/default-authentication-plugin = mysql_native_password/" -i ${CNF_PATH} || true # ignore errors - fi if ! grep -q "^interactive_timeout" ${CNF_PATH}; then sed '/\[mysqld\]/a interactive_timeout = 900' -i ${CNF_PATH} @@ -172,10 +170,19 @@ install_db(){ $MYSQL -e ";" >/dev/null 2>&1 || ( service mysql start >/dev/null 2>&1 && $MYSQL -e ";" >/dev/null ) + MYSQL_AUTHENTICATION_PLUGIN=$($MYSQL -e "SHOW VARIABLES LIKE 'default_authentication_plugin';" -s | awk '{print $2}') + MYSQL_AUTHENTICATION_PLUGIN=${MYSQL_AUTHENTICATION_PLUGIN:-caching_sha2_password} + + if ! grep -q "^default-authentication-plugin" ${CNF_PATH}; then + sed "/\[mysqld\]/a default-authentication-plugin = ${MYSQL_AUTHENTICATION_PLUGIN}" -i ${CNF_PATH} + else + sed "s/default-authentication-plugin.*/default-authentication-plugin = ${MYSQL_AUTHENTICATION_PLUGIN}/" -i ${CNF_PATH} || true # ignore errors + fi + if [ "${DB_USER}" = "root" ]; then - # allow MySql.Data.dll connect via mysql_native_password with root and empty password - $MYSQL -D "mysql" -e "ALTER USER '${DB_USER}'@'localhost' IDENTIFIED WITH mysql_native_password BY '${DB_PWD}'" >/dev/null 2>&1 \ - || $MYSQL -D "mysql" -e "UPDATE user SET plugin='mysql_native_password', Password = PASSWORD('${DB_PWD}') WHERE user='${DB_USER}' and host='localhost';" + # allow MySql.Data.dll connect via $MYSQL_AUTHENTICATION_PLUGIN with root and empty password + $MYSQL -D "mysql" -e "ALTER USER '${DB_USER}'@'localhost' IDENTIFIED WITH ${MYSQL_AUTHENTICATION_PLUGIN} BY '${DB_PWD}'" >/dev/null 2>&1 \ + || $MYSQL -D "mysql" -e "UPDATE user SET plugin='${MYSQL_AUTHENTICATION_PLUGIN}', Password = PASSWORD('${DB_PWD}') WHERE user='${DB_USER}' and host='localhost';" fi service mysql restart @@ -225,6 +232,8 @@ case "$1" in usermod -aG {{package_sysname}},nginx {{package_sysname}} + [ ! -z "$2" ] && OLDER_PACKAGE_VERSION=$(awk -F. '{ printf("%d%03d%03d%03d", $1,$2,$3,$4); }' <<< $2) + install_db apply_connection_string apply_core_machinekey @@ -244,16 +253,6 @@ case "$1" in # needed for signalr service mkdir -p -m 700 "$DIR/.config/.mono/keypairs" - - chown {{package_sysname}}:{{package_sysname}} $DIR - chown {{package_sysname}}:{{package_sysname}} $APP_DATA_DIR - chown {{package_sysname}}:{{package_sysname}} -R $DIR/Services/ - chown {{package_sysname}}:{{package_sysname}} -R $DIR/WebStudio/ - chown {{package_sysname}}:{{package_sysname}} -R $DIR/Sql/ - chown {{package_sysname}}:{{package_sysname}} -R $DIR/Tools/ - chown {{package_sysname}}:{{package_sysname}} -R $DIR/ApiSystem/ - chown {{package_sysname}}:{{package_sysname}} -R $DIR/.config/ - chown {{package_sysname}}:{{package_sysname}} $LOG_DIR chown nginx:nginx -R /var/cache/nginx/{{package_sysname}} chown {{package_sysname}}:nginx -R /var/run/{{package_sysname}} @@ -305,6 +304,10 @@ END $MYSQL "$DB_NAME" -e "TRUNCATE webstudio_index"; fi + if [ -d "${APP_DATA_DIR}/Index" ]; then + find ${APP_DATA_DIR}/Index -maxdepth 1 \! -name "v${ELASTIC_SEARCH_VERSION}" -type d -regex '.*/v[0-9]+\.[0-9]+\.[0-9]+.*' -exec rm -rf {} \; + fi + mkdir -p "$LOG_DIR/Index" mkdir -p "$APP_INDEX_DIR" chown -R elasticsearch:elasticsearch "$APP_INDEX_DIR" @@ -345,17 +348,21 @@ END MEMORY_REQUIREMENTS=12228; #RAM ~4*3Gb if [ ${TOTAL_MEMORY} -gt ${MEMORY_REQUIREMENTS} ]; then - if ! grep -q "[-]Xms1g" /etc/elasticsearch/jvm.options; then - echo "-Xms4g" >> /etc/elasticsearch/jvm.options - else - sed -i "s/-Xms1g/-Xms4g/" /etc/elasticsearch/jvm.options - fi + ELASTICSEATCH_MEMORY="4g" + else + ELASTICSEATCH_MEMORY="1g" + fi - if ! grep -q "[-]Xmx1g" /etc/elasticsearch/jvm.options; then - echo "-Xmx4g" >> /etc/elasticsearch/jvm.options - else - sed -i "s/-Xmx1g/-Xmx4g/" /etc/elasticsearch/jvm.options - fi + if grep -qE "^[^#]*-Xms[0-9]g" /etc/elasticsearch/jvm.options; then + sed -i "s/-Xms[0-9]g/-Xms${ELASTICSEATCH_MEMORY}/" /etc/elasticsearch/jvm.options + else + echo "-Xms${ELASTICSEATCH_MEMORY}" >> /etc/elasticsearch/jvm.options + fi + + if grep -qE "^[^#]*-Xmx[0-9]g" /etc/elasticsearch/jvm.options; then + sed -i "s/-Xmx[0-9]g/-Xmx${ELASTICSEATCH_MEMORY}/" /etc/elasticsearch/jvm.options + else + echo "-Xmx${ELASTICSEATCH_MEMORY}" >> /etc/elasticsearch/jvm.options fi if [ -d /etc/elasticsearch/ ]; then @@ -444,6 +451,10 @@ EOF sed 's,{{SERVICE_SSO_AUTH_HOST_ADDR}},'"${SERVICE_SSO_AUTH_HOST_ADDR}"',' -i ${NGINX_ROOT_DIR}/includes/{{package_sysname}}-communityserver-proxy-to-controlpanel.conf; sed '/web\.controlpanel\.url/s/\(value\s*=\s*\"\)[^\"]*\"/\1\/controlpanel\/\"/' -i ${APP_ROOT_DIR}/web.appsettings.config; sed '/web\.controlpanel\.url/s/\(value\s*=\s*\"\)[^\"]*\"/\1\/controlpanel\/\"/' -i ${APP_SERVICES_DIR}/TeamLabSvc/TeamLabSvc.exe.config; + + if systemctl is-active {{package_sysname}}ControlPanel | grep -q ^active; then + service {{package_sysname}}ControlPanel restart >/dev/null 2>&1 + fi fi # end @@ -451,13 +462,13 @@ EOF db_get {{package_sysname}}-communityserver/imapsync-start-date || true MAIL_IMAPSYNC_START_DATE="${RET:-$(date +"%Y-%m-%dT%H:%M:%S")}"; [ -z "$RET" ] && db_set {{package_sysname}}-communityserver/imapsync-start-date ${MAIL_IMAPSYNC_START_DATE} || true - sed 's_\(\"ImapSyncStartDate":\).*,_\1 "'${MAIL_IMAPSYNC_START_DATE}'",_' -i /etc/{{package_sysname}}/communityserver/mail.production.json + sed 's_\(\"ImapSyncStartDate":\).*,_\1 "'${MAIL_IMAPSYNC_START_DATE}'",_' -i $CONFIG_DIR/mail.production.json sed "/mail\.imap-sync-start-date/s/value=\"\S*\"/value=\"${MAIL_IMAPSYNC_START_DATE}\"/g" -i ${APP_ROOT_DIR}/web.appsettings.config - sed "s!\"value\":.*!\"value\":\ \"${APP_DATA_DIR}\"!" -i /etc/{{package_sysname}}/communityserver/storage.production.json - sed "s!\"folder\":.*,!\"folder\":\ \"${APP_SERVICES_DIR}\",!" -i /etc/{{package_sysname}}/communityserver/appsettings.production.json + sed "s!\"value\":.*!\"value\":\ \"${APP_DATA_DIR}\"!" -i $CONFIG_DIR/storage.production.json + sed "s!\"folder\":.*,!\"folder\":\ \"${APP_SERVICES_DIR}\",!" -i $CONFIG_DIR/appsettings.production.json - OPENSSL_CONF="/etc/{{package_sysname}}/communityserver/openssl.cnf" + OPENSSL_CONF="$CONFIG_DIR/openssl.cnf" if [ ! -f $OPENSSL_CONF ]; then cp /etc/ssl/openssl.cnf $OPENSSL_CONF; sed '/new_oids$/a openssl_conf = default_conf' -i $OPENSSL_CONF @@ -514,6 +525,17 @@ CipherString = $CIPHERSTRING \n" >> $OPENSSL_CONF if systemctl is-active monoserve | grep -q "active"; then curl --silent --output /dev/null http://127.0.0.1/api/2.0/warmup/restart.json || true fi + + chown {{package_sysname}}:{{package_sysname}} $DIR + chown {{package_sysname}}:{{package_sysname}} $APP_DATA_DIR + chown {{package_sysname}}:{{package_sysname}} -R $DIR/Services/ + chown {{package_sysname}}:{{package_sysname}} -R $DIR/WebStudio/ + chown {{package_sysname}}:{{package_sysname}} -R $DIR/Sql/ + chown {{package_sysname}}:{{package_sysname}} -R $DIR/Tools/ + chown {{package_sysname}}:{{package_sysname}} -R $DIR/ApiSystem/ + chown {{package_sysname}}:{{package_sysname}} -R $DIR/.config/ + chown {{package_sysname}}:{{package_sysname}} -R $CONFIG_DIR + chown {{package_sysname}}:{{package_sysname}} $LOG_DIR ;; abort-upgrade|abort-remove|abort-deconfigure) diff --git a/build/install/deb/debian/rules b/build/install/deb/debian/rules index 7ac01e1ff..5bd7ef13a 100644 --- a/build/install/deb/debian/rules +++ b/build/install/deb/debian/rules @@ -7,74 +7,33 @@ %: dh $@ --with=systemd -override_dh_systemd_enable: - dh_systemd_enable --name=monoserve - dh_systemd_enable --name=monoserveApiSystem - dh_systemd_enable --name={{package_sysname}}Feed - dh_systemd_enable --name={{package_sysname}}SocketIO - dh_systemd_enable --name={{package_sysname}}Telegram - dh_systemd_enable --name={{package_sysname}}Thumb - dh_systemd_enable --name={{package_sysname}}UrlShortener - dh_systemd_enable --name={{package_sysname}}FilesTrashCleaner - dh_systemd_enable --name={{package_sysname}}WebDav - dh_systemd_enable --name={{package_sysname}}Radicale - dh_systemd_enable --name={{package_sysname}}Index - dh_systemd_enable --name={{package_sysname}}Notify - dh_systemd_enable --name={{package_sysname}}Backup - dh_systemd_enable --name={{package_sysname}}StorageMigrate - dh_systemd_enable --name={{package_sysname}}StorageEncryption - dh_systemd_enable --name={{package_sysname}}MailAggregator - dh_systemd_enable --name={{package_sysname}}MailWatchdog - dh_systemd_enable --name={{package_sysname}}MailCleaner - dh_systemd_enable --name={{package_sysname}}MailImap - dh_systemd_enable --name={{package_sysname}}ThumbnailBuilder - dh_systemd_enable --name={{package_sysname}}SsoAuth - dh_systemd_enable --name=god +override_dh_auto_install: + dh_auto_install + dh_installsystemd --name=monoserve + dh_installsystemd --name=monoserveApiSystem + dh_installsystemd --name={{package_sysname}}Feed + dh_installsystemd --name={{package_sysname}}SocketIO + dh_installsystemd --name={{package_sysname}}Telegram + dh_installsystemd --name={{package_sysname}}Thumb + dh_installsystemd --name={{package_sysname}}UrlShortener + dh_installsystemd --name={{package_sysname}}FilesTrashCleaner + dh_installsystemd --name={{package_sysname}}WebDav + dh_installsystemd --name={{package_sysname}}Radicale + dh_installsystemd --name={{package_sysname}}Index + dh_installsystemd --name={{package_sysname}}Notify + dh_installsystemd --name={{package_sysname}}Backup + dh_installsystemd --name={{package_sysname}}StorageMigrate + dh_installsystemd --name={{package_sysname}}StorageEncryption + dh_installsystemd --name={{package_sysname}}MailAggregator + dh_installsystemd --name={{package_sysname}}MailWatchdog + dh_installsystemd --name={{package_sysname}}MailCleaner + dh_installsystemd --name={{package_sysname}}MailImap + dh_installsystemd --name={{package_sysname}}ThumbnailBuilder + dh_installsystemd --name={{package_sysname}}SsoAuth + dh_installsystemd --name=god -override_dh_installinit: - dh_installinit --name=monoserve - dh_installinit --name=monoserveApiSystem - dh_installinit --name={{package_sysname}}Feed - dh_installinit --name={{package_sysname}}SocketIO - dh_installinit --name={{package_sysname}}Telegram - dh_installinit --name={{package_sysname}}Thumb - dh_installinit --name={{package_sysname}}UrlShortener - dh_installinit --name={{package_sysname}}FilesTrashCleaner - dh_installinit --name={{package_sysname}}WebDav - dh_installinit --name={{package_sysname}}Radicale - dh_installinit --name={{package_sysname}}Index - dh_installinit --name={{package_sysname}}Notify - dh_installinit --name={{package_sysname}}Backup - dh_installinit --name={{package_sysname}}StorageMigrate - dh_installinit --name={{package_sysname}}StorageEncryption - dh_installinit --name={{package_sysname}}MailAggregator - dh_installinit --name={{package_sysname}}MailWatchdog - dh_installinit --name={{package_sysname}}MailCleaner - dh_installinit --name={{package_sysname}}MailImap - dh_installinit --name={{package_sysname}}ThumbnailBuilder - dh_installinit --name={{package_sysname}}SsoAuth - dh_installinit --name=god - -override_dh_systemd_start: - dh_systemd_start --name=monoserve - dh_systemd_start --name=monoserveApiSystem - dh_systemd_start --name={{package_sysname}}Feed - dh_systemd_start --name={{package_sysname}}SocketIO - dh_systemd_start --name={{package_sysname}}Telegram - dh_systemd_start --name={{package_sysname}}Thumb - dh_systemd_start --name={{package_sysname}}UrlShortener - dh_systemd_start --name={{package_sysname}}FilesTrashCleaner - dh_systemd_start --name={{package_sysname}}WebDav - dh_systemd_start --name={{package_sysname}}Radicale - dh_systemd_start --name={{package_sysname}}Index - dh_systemd_start --name={{package_sysname}}Notify - dh_systemd_start --name={{package_sysname}}Backup - dh_systemd_start --name={{package_sysname}}StorageMigrate - dh_systemd_start --name={{package_sysname}}StorageEncryption - dh_systemd_start --name={{package_sysname}}MailAggregator - dh_systemd_start --name={{package_sysname}}MailWatchdog - dh_systemd_start --name={{package_sysname}}MailCleaner - dh_systemd_start --name={{package_sysname}}MailImap - dh_systemd_start --name={{package_sysname}}ThumbnailBuilder - dh_systemd_start --name={{package_sysname}}SsoAuth - dh_systemd_start --name=god \ No newline at end of file +execute_after_dh_fixperms: + find \ + "debian/{{package_sysname}}-communityserver/etc/{{package_sysname}}/communityserver/" \ + "debian/{{package_sysname}}-communityserver/var/www/{{package_sysname}}/" \ + -type f -regex '.*\(json\|config\)' ! -path '*node_modules*' -exec chmod o-rwx {} \; diff --git a/build/install/install.bat b/build/install/install.bat new file mode 100644 index 000000000..e07ad4495 --- /dev/null +++ b/build/install/install.bat @@ -0,0 +1,12 @@ +@echo off + +PUSHD %~dp0.. + +if %errorlevel% == 0 ( + for /R "run\" %%f in (*.xml) do ( + call TeamLabSvc\WinSW3.0.0.exe install %%f + ) +) + +echo. +pause \ No newline at end of file diff --git a/build/install/rpm/common.spec b/build/install/rpm/common.spec index 90ac68abb..13881fd0b 100644 --- a/build/install/rpm/common.spec +++ b/build/install/rpm/common.spec @@ -76,6 +76,11 @@ find "$RPM_BUILD_ROOT/usr/bin/" \ find "$RPM_BUILD_ROOT/var/www/%{package_sysname}/Sql" -depth -type f -exec rename -f -v 's/onlyoffice([^\/]*)$/%{package_sysname}$1/g' {} \; +find \ +"$RPM_BUILD_ROOT/var/www/%{package_sysname}/" \ +"$RPM_BUILD_ROOT/etc/%{package_sysname}/communityserver/" \ +-type f -regex '.*\(json\|config\)' ! -path '*node_modules*' -exec chmod o-rwx {} \; + #list files OLD_IFS="$IFS" IFS=" @@ -90,7 +95,7 @@ for FILE in `find "$RPM_BUILD_ROOT/var/www/%{package_sysname}/"`; do echo "%%attr(-, %{package_sysname}, %{package_sysname}) %%config(noreplace) \"$RELFILE\"" >>onlyoffice.list ;; - */WebStudio/[Ww]eb*.config | */ApiSystem/[Ww]eb*.config | */TeamLabSvc.exe.config | */ASC.Mail.EmlDownloader.exe.config ) + */WebStudio/[Ww]eb*.config | */ApiSystem/[Ww]eb*.config | */TeamLabSvc.exe.config ) echo "%%attr(-, %{package_sysname}, %{package_sysname}) %%config \"$RELFILE\"" >>onlyoffice.list ;; @@ -116,6 +121,13 @@ rm -rf "$RPM_BUILD_ROOT" %attr(-, %{package_sysname}, %{package_sysname}) %config /etc/%{package_sysname}/communityserver/* %pre + +node_version=$(rpm -q --qf '%%{version}' nodejs | awk -F. '{ printf("%%d%%03d%%03d%%03d", $1,$2,$3,$4); }';) +if [[ "$node_version" -lt "14018000000" ]]; then + echo -e "\033[31mFor the %{package_sysname}-communityserver package to work properly, you need to install nodejs version 14.18.0 or higher\033[0m" + exit 1 +fi + getent group %{package_sysname} >/dev/null || groupadd -r %{package_sysname} getent passwd %{package_sysname} >/dev/null || useradd -r -g %{package_sysname} -d /var/www/%{package_sysname}/ -s /sbin/nologin %{package_sysname} @@ -145,9 +157,13 @@ sed '/web\.controlpanel\.url/s/\(value\s*=\s*\"\)[^\"]*\"/\1\/controlpanel\/\"/' CORE_MACHINEKEY="$(sed -n '/"core.machinekey"/s!.*value\s*=\s*"\([^"]*\)".*!\1!p' ${DIR}/WebStudio/web.appsettings.config)"; find "$DIR/controlpanel/www/config" -type f -name "*.json" -exec sed -i "s_\(\"core.machinekey\":\).*,_\1 \"${CORE_MACHINEKEY}\",_" {} \; -if systemctl is-active monoserve | grep -q "active"; then - systemctl restart monoserve -fi +package_services=("monoserve" "%{package_sysname}ControlPanel") + +for SVC in "${package_services[@]}"; do + if systemctl is-active "$SVC" | grep -q ^active; then + systemctl restart "$SVC" + fi +done %triggerin -- python3, python36 @@ -259,7 +275,7 @@ binDirs=("$DIR/ApiSystem/" "$DIR/WebStudio" "$DIR/controlpanel/www/config" "$SER if [ -f $DIR/WebStudio/web.appsettings.config.rpmsave ]; then CORE_MACHINEKEY="$(sed -n '/"core.machinekey"/s!.*value\s*=\s*"\([^"]*\)".*!\1!p' ${DIR}/WebStudio/web.appsettings.config.rpmsave)"; else - CORE_MACHINEKEY="$(sed -n '/"core.machinekey"/s!.*value\s*=\s*"\([^"]*\)".*!\1!p' ${DIR}/WebStudio/web.appsettings.config)"; + CORE_MACHINEKEY="$(cat /dev/urandom | tr -dc A-Za-z0-9 | head -c 12)"; fi sed "s^\(machine_key\)\s*=.*^\1 = ${CORE_MACHINEKEY}^g" -i ${SERVICES_DIR}/TeamLabSvc/radicale.config @@ -369,6 +385,10 @@ if [ -f ${ELASTIC_SEARCH_JAVA_CONF_PATH}.rpmnew ]; then cp -rf ${ELASTIC_SEARCH_JAVA_CONF_PATH}.rpmnew ${ELASTIC_SEARCH_JAVA_CONF_PATH}; fi +if [ -d "${APP_DATA_DIR}/Index" ]; then + find ${APP_DATA_DIR}/Index -maxdepth 1 \! -name "v${ELASTIC_SEARCH_VERSION}" -type d -regex '.*/v[0-9]+\.[0-9]+\.[0-9]+.*' -exec rm -rf {} \; +fi + mkdir -p "$LOG_DIR/Index" mkdir -p "$APP_INDEX_DIR" @@ -413,17 +433,21 @@ TOTAL_MEMORY=$(free -m | grep -oP '\d+' | head -n 1); MEMORY_REQUIREMENTS=12228; #RAM ~4*3Gb if [ ${TOTAL_MEMORY} -gt ${MEMORY_REQUIREMENTS} ]; then - if ! grep -q "[-]Xms1g" ${ELASTIC_SEARCH_JAVA_CONF_PATH}; then - echo "-Xms4g" >> ${ELASTIC_SEARCH_JAVA_CONF_PATH} - else - sed -i "s/-Xms1g/-Xms4g/" ${ELASTIC_SEARCH_JAVA_CONF_PATH} - fi + ELASTICSEATCH_MEMORY="4g" +else + ELASTICSEATCH_MEMORY="1g" +fi - if ! grep -q "[-]Xmx1g" ${ELASTIC_SEARCH_JAVA_CONF_PATH}; then - echo "-Xmx4g" >> ${ELASTIC_SEARCH_JAVA_CONF_PATH} - else - sed -i "s/-Xmx1g/-Xmx4g/" ${ELASTIC_SEARCH_JAVA_CONF_PATH} - fi +if grep -qE "^[^#]*-Xms[0-9]g" "${ELASTIC_SEARCH_JAVA_CONF_PATH}"; then + sed -i "s/-Xms[0-9]g/-Xms${ELASTICSEATCH_MEMORY}/" "${ELASTIC_SEARCH_JAVA_CONF_PATH}" +else + echo "-Xms${ELASTICSEATCH_MEMORY}" >> "${ELASTIC_SEARCH_JAVA_CONF_PATH}" +fi + +if grep -qE "^[^#]*-Xmx[0-9]g" "${ELASTIC_SEARCH_JAVA_CONF_PATH}"; then + sed -i "s/-Xmx[0-9]g/-Xmx${ELASTICSEATCH_MEMORY}/" "${ELASTIC_SEARCH_JAVA_CONF_PATH}" +else + echo "-Xmx${ELASTICSEATCH_MEMORY}" >> "${ELASTIC_SEARCH_JAVA_CONF_PATH}" fi if [ -d /etc/elasticsearch/ ]; then @@ -482,6 +506,10 @@ if [ $1 -ge 2 ]; then systemctl restart $SVC fi done + if systemctl is-active %{package_sysname}AutoCleanUp | grep -q "active"; then + systemctl disable %{package_sysname}AutoCleanUp + systemctl stop %{package_sysname}AutoCleanUp + fi fi if systemctl is-active monoserve | grep -q "active"; then diff --git a/build/install/rpm/onlyoffice-communityserver.spec b/build/install/rpm/onlyoffice-communityserver.spec index 9f275d4bd..9e3035a2f 100644 --- a/build/install/rpm/onlyoffice-communityserver.spec +++ b/build/install/rpm/onlyoffice-communityserver.spec @@ -3,7 +3,7 @@ %global package_header_tag_url http://onlyoffice.com/ %global package_header_tag_vendor Ascensio System SIA %global package_header_tag_packager Ascensio System SIA -%global package_header_tag_requires mono-complete >= 6.8.0, nginx >= 1.9.5, mysql-server >= 5.7.0, wget, mono-webserver-hyperfastcgi, nodejs >= 12.0.0, redis >= 3.0.0, elasticsearch = 7.16.3-1, python3 >= 3.6, ffmpeg, jq, dotnet-sdk-7.0 +%global package_header_tag_requires mono-complete >= 6.8.0, nginx >= 1.9.5, mysql-server >= 5.7.0, wget, mono-webserver-hyperfastcgi, nodejs >= 14.18.0, redis >= 3.0.0, elasticsearch = 7.16.3-1, python3 >= 3.6, ffmpeg, jq, dotnet-sdk-7.0 %global package_section_description "Community Server is a free open-source collaborative system developed to manage documents, projects, customer relationship and emails, all in one place." %global package_services god monoserve monoserveApiSystem onlyofficeSocketIO onlyofficeThumb onlyofficeTelegram onlyofficeBackup onlyofficeFeed onlyofficeIndex onlyofficeNotify onlyofficeMailAggregator onlyofficeMailWatchdog onlyofficeMailCleaner onlyofficeMailImap onlyofficeStorageMigrate onlyofficeStorageEncryption onlyofficeUrlShortener onlyofficeWebDav onlyofficeFilesTrashCleaner onlyofficeRadicale onlyofficeThumbnailBuilder onlyofficeSsoAuth diff --git a/build/install/uninstall.bat b/build/install/uninstall.bat new file mode 100644 index 000000000..65dc10a17 --- /dev/null +++ b/build/install/uninstall.bat @@ -0,0 +1,13 @@ +@echo off + +PUSHD %~dp0.. + +if %errorlevel% == 0 ( + for /R "run\" %%f in (*.xml) do ( + call TeamLabSvc\WinSW3.0.0.exe stop %%f + call TeamLabSvc\WinSW3.0.0.exe uninstall %%f + ) +) + +echo. +pause \ No newline at end of file diff --git a/build/msbuild/ASC.Web.Core.BuildTask.dll b/build/msbuild/ASC.Web.Core.BuildTask.dll index 1966e5e8b..1a297ec95 100644 Binary files a/build/msbuild/ASC.Web.Core.BuildTask.dll and b/build/msbuild/ASC.Web.Core.BuildTask.dll differ diff --git a/build/msbuild/deploy.proj b/build/msbuild/deploy.proj index b80e7c7a0..0ae82fd8a 100644 --- a/build/msbuild/deploy.proj +++ b/build/msbuild/deploy.proj @@ -25,7 +25,6 @@ 0 0 1 - 1 1 $(RootDir).nuget\NuGet.exe mono $(RootDir).nuget\NuGet.exe @@ -34,24 +33,6 @@ $(RootDir)packages\dotless.1.5.2\tool\dotless.compiler.exe mono $(RootDir)packages\dotless.1.5.2\tool\dotless.compiler.exe - - - module\ASC.Mail\Services\ASC.Mail.Aggregator.CollectionService\ASC.Mail.Aggregator.CollectionService.csproj - $(OutDir)Services\MailAggregator\ - - - module\ASC.Mail\Services\ASC.Mail.EmlDownloader\ASC.Mail.EmlDownloader.csproj - $(OutDir)Services\MailAggregator\ - - - module\ASC.Mail\Services\ASC.Mail.Watchdog.Service\ASC.Mail.Watchdog.Service.csproj - $(OutDir)Services\MailWatchdog\ - - - module\ASC.Mail\Services\ASC.Mail.StorageCleaner\ASC.Mail.StorageCleaner.Service.csproj - $(OutDir)Services\MailCleaner\ - - ASC.Socket.IO.Svc.Launcher, ASC.Socket.IO.Svc @@ -173,9 +154,6 @@ TargetToInvoke=DeployService - - TargetToInvoke=DeployMail - TargetToInvoke=DeployWeb @@ -204,23 +182,17 @@ - + - + - - - + + + - - - - - - @@ -298,11 +270,6 @@ - - - - - @@ -400,39 +367,6 @@ ..\config\private\UrlShortener.Substitutions.xml - - ..\config\private\Mail.Agg.Substitutions.xml - - - ..\config\private\Mail.Agg.Substitutions.xml - - - ..\config\private\Mail.Agg.Log4net.Substitutions.xml - - - ..\config\private\Mail.Agg.NLog.Substitutions.xml - - - ..\config\private\Mail.Dog.Substitutions.xml - - - ..\config\private\Mail.Dog.NLog.Substitutions.xml - - - ..\config\private\Mail.Dog.Log4net.Substitutions.xml - - - ..\config\private\Mail.Dog.NLog.Substitutions.xml - - - ..\config\private\Mail.Cln.Substitutions.xml - - - ..\config\private\Mail.Cln.Log4net.Substitutions.xml - - - ..\config\private\Mail.Cln.NLog.Substitutions.xml - diff --git a/build/run/Radicale.xml b/build/run/Radicale.xml new file mode 100644 index 000000000..b131b0a4d --- /dev/null +++ b/build/run/Radicale.xml @@ -0,0 +1,11 @@ + + OnlyofficeRadicale + OnlyofficeRadicale + Automatic + %BASE%\..\TeamLabSvc + python + -m radicale --config radicale.config + + true + + \ No newline at end of file diff --git a/build/run/SocketIO.xml b/build/run/SocketIO.xml new file mode 100644 index 000000000..47ee3a7f5 --- /dev/null +++ b/build/run/SocketIO.xml @@ -0,0 +1,10 @@ + + OnlyofficeSocketIO + OnlyofficeSocketIO + Automatic + node + ../ASC.Socket.IO/app.js + + true + + \ No newline at end of file diff --git a/build/run/SsoAuth.xml b/build/run/SsoAuth.xml new file mode 100644 index 000000000..fcfe4e18c --- /dev/null +++ b/build/run/SsoAuth.xml @@ -0,0 +1,10 @@ + + OnlyofficeSsoAuth + OnlyOfficeSsoAuth + Automatic + node + ../ASC.SSoAuth/app.js + + true + + \ No newline at end of file diff --git a/build/run/Thumb.xml b/build/run/Thumb.xml new file mode 100644 index 000000000..987147f76 --- /dev/null +++ b/build/run/Thumb.xml @@ -0,0 +1,10 @@ + + OnlyOfficeThumb + OnlyOfficeThumb + Automatic + node + ../ASC.Thumbnails/index.js + + true + + \ No newline at end of file diff --git a/build/run/UrlShortener.xml b/build/run/UrlShortener.xml new file mode 100644 index 000000000..9442a6c1c --- /dev/null +++ b/build/run/UrlShortener.xml @@ -0,0 +1,10 @@ + + OnlyofficeUrlShortener + OnlyOfficeUrlShortener + Automatic + node + ../ASC.UrlShortener/index.js + + true + + \ No newline at end of file diff --git a/build/run/WebDav.xml b/build/run/WebDav.xml new file mode 100644 index 000000000..839ee16db --- /dev/null +++ b/build/run/WebDav.xml @@ -0,0 +1,10 @@ + + OnlyofficeWebDav + OnlyOfficeWebDav + Automatic + node + ../ASC.WebDav/server/webDavServer.js + + true + + \ No newline at end of file diff --git a/build/sql/onlyoffice.data.sql b/build/sql/onlyoffice.data.sql index 0c6a92b6e..25eaf5876 100644 --- a/build/sql/onlyoffice.data.sql +++ b/build/sql/onlyoffice.data.sql @@ -283,7 +283,6 @@ BEGIN insert into files_converts (input, output) values ('.docxf', '.fb2'); insert into files_converts (input, output) values ('.docxf', '.html'); insert into files_converts (input, output) values ('.docxf', '.odt'); - insert into files_converts (input, output) values ('.docxf', '.oform'); insert into files_converts (input, output) values ('.docxf', '.ott'); insert into files_converts (input, output) values ('.docxf', '.pdf'); insert into files_converts (input, output) values ('.docxf', '.rtf'); diff --git a/build/sql/onlyoffice.upgradev126.sql b/build/sql/onlyoffice.upgradev126.sql new file mode 100644 index 000000000..f31559051 --- /dev/null +++ b/build/sql/onlyoffice.upgradev126.sql @@ -0,0 +1,14 @@ +DELIMITER DLM00 + +DROP PROCEDURE IF EXISTS upgrade126 DLM00 + +CREATE PROCEDURE upgrade126() +BEGIN + + DELETE FROM `files_converts` WHERE `output`='.oform'; + +END DLM00 + +CALL upgrade126() DLM00 + +DELIMITER ; diff --git a/build/start/command.ps1 b/build/start/command.ps1 new file mode 100644 index 000000000..a4651cece --- /dev/null +++ b/build/start/command.ps1 @@ -0,0 +1,48 @@ +$PSversionMajor = $PSVersionTable.PSVersion | sort-object major | ForEach-Object {$_.major} +$PSversionMinor = $PSVersionTable.PSVersion | sort-object minor | ForEach-Object {$_.minor} + +if ($PSversionMajor -lt 7 -or $PSversionMinor -lt 2) { + Write-Error "Powershell version must be greater than or equal to 7.2." + exit +} + +$WorkDir = "$(Split-Path -Parent $PSScriptRoot)\run"; +$CommandName = "$($args[0])"; + +if ( $CommandName -eq "increase-service-timeout" ) { + $RegistryPath = 'HKLM:\SYSTEM\CurrentControlSet\Control' + $Name = 'ServicesPipeTimeout' + $Value = '90000' + + Write-Output "Changing service start timeout from default value (30000 ms ) to $($Value) ms" + + New-ItemProperty -Path $RegistryPath -Name $Name -Value $Value -PropertyType DWORD -Force + + + Write-Warning "Please, restart the computer for the changes to take effect." + exit +} + + + +#Write-Output "Starting $($CommandName) services at time: $(Get-Date -Format HH:mm:ss)" +#Write-Output "" + +Get-ChildItem -Path $WorkDir -File | ForEach-Object -ThrottleLimit 20 -Parallel { + $ServiceName = "Onlyoffice$([System.IO.Path]::GetFileNameWithoutExtension($_))"; + + switch ( $Using:CommandName ) + { + "start" { Start-Service -InputObject $(Get-Service -Name "$ServiceName") } + "stop" { Stop-Service -InputObject $(Get-Service -Name "$ServiceName") } + "restart" { Restart-Service -InputObject $(Get-Service -Name "$ServiceName") } + } + + if( $? ) + { + Write-Output "$ServiceName $($Using:CommandName) service has been done" + } +} + +#Write-Output "" +#Write-Output "End $($CommandName) services at time: $(Get-Date -Format HH:mm:ss)" \ No newline at end of file diff --git a/build/start/start.bat b/build/start/start.bat new file mode 100644 index 000000000..697420556 --- /dev/null +++ b/build/start/start.bat @@ -0,0 +1,15 @@ +@echo off + +PUSHD %~dp0.. + +POPD + +if %errorlevel% == 0 ( + pwsh %~dp0/command.ps1 "start" +) + +echo. + +if "%1"=="nopause" goto start +pause +:start \ No newline at end of file diff --git a/build/start/stop.bat b/build/start/stop.bat new file mode 100644 index 000000000..9d326a731 --- /dev/null +++ b/build/start/stop.bat @@ -0,0 +1,15 @@ +@echo off + +PUSHD %~dp0.. + +POPD + +if %errorlevel% == 0 ( + pwsh %~dp0/command.ps1 "stop" +) + +echo. + +if "%1"=="nopause" goto start +pause +:start \ No newline at end of file diff --git a/common/ASC.Common/Data/MultiRegionalDbManager.cs b/common/ASC.Common/Data/MultiRegionalDbManager.cs index 0998be50d..a1f27da61 100644 --- a/common/ASC.Common/Data/MultiRegionalDbManager.cs +++ b/common/ASC.Common/Data/MultiRegionalDbManager.cs @@ -51,17 +51,27 @@ public DbCommand Command } - public MultiRegionalDbManager(string dbId) + public MultiRegionalDbManager(string dbId, bool? docspace) { const StringComparison cmp = StringComparison.InvariantCultureIgnoreCase; DatabaseId = dbId; databases = ConfigurationManager.ConnectionStrings.OfType() .Where(c => c.Name.Equals(dbId, cmp) || c.Name.StartsWith(dbId + ".", cmp)) + .Where(c => FilterDocspace(c, docspace)) .Select(c => new DbManager(c.Name)) .ToList(); localDb = databases.SingleOrDefault(db => db.DatabaseId.Equals(dbId, cmp)); } + private bool FilterDocspace(ConnectionStringSettings connectionString, bool? docspace) + { + if (!docspace.HasValue) return true; + + var isDocspace = connectionString.ConnectionString.Contains("docspace"); + + return docspace.Value ? isDocspace : !isDocspace; + } + public MultiRegionalDbManager(IEnumerable databases) { this.databases = databases.ToList(); @@ -78,11 +88,6 @@ public void Dispose() } } - public static MultiRegionalDbManager FromHttpContext(string databaseId) - { - return new MultiRegionalDbManager(databaseId); - } - public IDbTransaction BeginTransaction(IsolationLevel isolationLevel) { return localDb.BeginTransaction(isolationLevel); diff --git a/common/ASC.Common/Web/MimeMapping.cs b/common/ASC.Common/Web/MimeMapping.cs index 4ce7789e3..2e52b15cf 100644 --- a/common/ASC.Common/Web/MimeMapping.cs +++ b/common/ASC.Common/Web/MimeMapping.cs @@ -156,6 +156,8 @@ static MimeMapping() AddMimeMapping(".dotm", "application/vnd.ms-word.template.macroEnabled.12"); AddMimeMapping(".dotx", "application/vnd.openxmlformats-officedocument.wordprocessingml.template"); AddMimeMapping(".dp", "application/commonground"); + AddMimeMapping(".dps", "application/presentation"); + AddMimeMapping(".dpt", "application/presentation"); AddMimeMapping(".drw", "application/drafting"); AddMimeMapping(".dump", "application/octet-stream"); AddMimeMapping(".dv", "video/x-dv"); @@ -177,6 +179,8 @@ static MimeMapping() AddMimeMapping(".eps", "application/postscript"); AddMimeMapping(".epub", "application/epub+zip"); AddMimeMapping(".es", "application/x-esrehber"); + AddMimeMapping(".et", "application/spreadsheet"); + AddMimeMapping(".ett", "application/spreadsheet"); AddMimeMapping(".etx", "text/x-setext"); AddMimeMapping(".evy", "application/envoy"); AddMimeMapping(".evy", "application/x-envoy"); @@ -612,6 +616,7 @@ static MimeMapping() AddMimeMapping(".stl", "application/vndms-pkistl"); AddMimeMapping(".stm", "text/html"); AddMimeMapping(".stp", "application/step"); + AddMimeMapping(".stw", "application/vnd.sun.xml.writer.template"); AddMimeMapping(".sv4cpio", "application/x-sv4cpio"); AddMimeMapping(".sv4crc", "application/x-sv4crc"); AddMimeMapping(".svf", "image/vnd.dwg"); @@ -621,6 +626,9 @@ static MimeMapping() AddMimeMapping(".svg", "image/svg+xml"); AddMimeMapping(".svgt", "image/svg+xml"); AddMimeMapping(".swf", "application/x-shockwave-flash"); + AddMimeMapping(".sxi", "application/presentation"); + AddMimeMapping(".sxc", "application/vnd.sun.xml.calc"); + AddMimeMapping(".sxw", "application/vnd.sun.xml.writer"); AddMimeMapping(".t", "application/x-troff"); AddMimeMapping(".talk", "text/x-speech"); AddMimeMapping(".tar", "application/x-tar"); @@ -715,7 +723,8 @@ static MimeMapping() AddMimeMapping(".wp6", "application/wordperfect"); AddMimeMapping(".wpd", "application/wordperfect"); AddMimeMapping(".wpd", "application/x-wpwin"); - AddMimeMapping(".wps", "application/vnd.ms-works"); + AddMimeMapping(".wps", "application/document"); + AddMimeMapping(".wpt", "application/document"); AddMimeMapping(".wq1", "application/x-lotus"); AddMimeMapping(".wri", "application/mswrite"); AddMimeMapping(".wri", "application/x-wri"); diff --git a/common/ASC.Core.Common/Billing/ITariffService.cs b/common/ASC.Core.Common/Billing/ITariffService.cs index 0f881f820..8e7f85e29 100644 --- a/common/ASC.Core.Common/Billing/ITariffService.cs +++ b/common/ASC.Core.Common/Billing/ITariffService.cs @@ -24,6 +24,8 @@ public interface ITariffService { Tariff GetTariff(int tenantId, bool withRequestToPaymentSystem = true); + IEnumerable GetAdditionalTariffs(int tenantId); + void SetTariff(int tenantId, Tariff tariff); void DeleteDefaultBillingInfo(); diff --git a/common/ASC.Core.Common/Billing/TariffService.cs b/common/ASC.Core.Common/Billing/TariffService.cs index 6e5166bb2..7e391b1b8 100644 --- a/common/ASC.Core.Common/Billing/TariffService.cs +++ b/common/ASC.Core.Common/Billing/TariffService.cs @@ -107,7 +107,7 @@ public Tariff GetTariff(int tenantId, bool withRequestToPaymentSystem = true) tariff = CalculateTariff(tenantId, tariff); cache.Insert(key, tariff, DateTime.UtcNow.Add(GetCacheExpiration())); - if (BillingClient.Configured && withRequestToPaymentSystem) + if (BillingClient.Configured && withRequestToPaymentSystem && !IsDocspace) { Task.Run(() => { @@ -177,6 +177,22 @@ public Tariff GetTariff(int tenantId, bool withRequestToPaymentSystem = true) return tariff; } + public IEnumerable GetAdditionalTariffs(int tenantId) + { + if (CoreContext.Configuration.Standalone || !IsDocspace) + return null; + + var key = GetAdditionalTariffsCacheKey(tenantId); + var tariffs = cache.Get>(key); + if (tariffs == null) + { + tariffs = GetDocspaceTariffs(tenantId, true); + cache.Insert(key, tariffs, DateTime.UtcNow.Add(GetCacheExpiration())); + } + + return tariffs; + } + public void SetTariff(int tenantId, Tariff tariff) { if (tariff == null) @@ -208,6 +224,11 @@ private static string GetTariffCacheKey(int tenantId) return string.Format("{0}:{1}", tenantId, "tariff"); } + private static string GetAdditionalTariffsCacheKey(int tenantId) + { + return string.Format("{0}:{1}", tenantId, "tariff:additional"); + } + private static string GetBillingUrlCacheKey(int tenantId) { return string.Format("{0}:{1}", tenantId, "billing:urls"); @@ -420,11 +441,16 @@ public void SaveButton(int tariffId, string partnerId, string buttonUrl) private Tariff GetBillingInfo(int tenant) { + if (IsDocspace) + { + return GetDocspaceTariffs(tenant, false).FirstOrDefault() ?? Tariff.CreateDefault(); + } + var q = new SqlQuery("tenants_tariff") - .Select("tariff", "stamp", "quantity") - .Where("tenant", tenant) - .OrderBy("id", false) - .SetMaxResults(1); + .Select("tariff", "stamp", "quantity") + .Where("tenant", tenant) + .OrderBy("id", false) + .SetMaxResults(1); return ExecList(q) .ConvertAll(r => @@ -439,8 +465,44 @@ private Tariff GetBillingInfo(int tenant) ?? Tariff.CreateDefault(); } + private List GetDocspaceTariffs(int tenant, bool? additional) + { + var q = new SqlQuery("tenants_tariff tt") + .InnerJoin("tenants_tariffrow ttr", Exp.EqColumns("tt.id", "ttr.tariff_id")) + .Select("ttr.quota", "tt.stamp", "ttr.quantity") + .Where(string.Format("tt.id = (SELECT max(id) FROM tenants_tariff WHERE tenant={0})", tenant)); + + //additional tariffs: disk, admin1 + if (additional.HasValue) + { + if (additional.Value) + { + q.Where(Exp.In("ttr.quota", new[] { -4, -5 })); + } + else + { + q.Where(!Exp.In("ttr.quota", new[] { -4, -5 })); + } + } + + return ExecList(q) + .ConvertAll(r => + { + var tariff = Tariff.CreateDefault(); + tariff.QuotaId = Convert.ToInt32(r[0]); + tariff.DueDate = ((DateTime)r[1]).Year < 9999 ? (DateTime)r[1] : DateTime.MaxValue; + tariff.Quantity = Convert.ToInt32(r[2]); + return tariff; + }); + } + private bool SaveBillingInfo(int tenant, Tariff tariffInfo, bool renewal = true) { + if (IsDocspace) + { + return SaveDocspaceBillingInfo(tenant, tariffInfo); + } + var inserted = false; var currentTariff = GetBillingInfo(tenant); if (!tariffInfo.EqualsByParams(currentTariff)) @@ -483,6 +545,70 @@ private bool SaveBillingInfo(int tenant, Tariff tariffInfo, bool renewal = true) return inserted; } + private bool SaveDocspaceBillingInfo(int tenant, Tariff tariffInfo) + { + var inserted = false; + var currentTariff = GetBillingInfo(tenant); + if (!tariffInfo.EqualsByParams(currentTariff)) + { + var additionalTariffs = GetAdditionalTariffs(tenant); + + using (var db = GetDb()) + using (var tx = db.BeginTransaction()) + { + var q = new SqlInsert("tenants_tariff") + .InColumnValue("id", 0) + .InColumnValue("tenant", tenant) + .InColumnValue("stamp", tariffInfo.DueDate) + .InColumnValue("customer_id", string.Empty) + .InColumnValue("create_on", DateTime.UtcNow) + .Identity(0, 0, true); + + var id = db.ExecuteScalar(q); + + q = new SqlInsert("tenants_tariffrow") + .InColumnValue("tariff_id", id) + .InColumnValue("quota", tariffInfo.QuotaId) + .InColumnValue("tenant", tenant) + .InColumnValue("quantity", tariffInfo.Quantity); + + db.ExecuteNonQuery(q); + + if (additionalTariffs != null) + { + foreach (var additionalTariff in additionalTariffs) + { + q = new SqlInsert("tenants_tariffrow") + .InColumnValue("tariff_id", id) + .InColumnValue("quota", additionalTariff.QuotaId) + .InColumnValue("tenant", tenant) + .InColumnValue("quantity", additionalTariff.Quantity); + + db.ExecuteNonQuery(q); + } + } + + cache.Remove(GetTariffCacheKey(tenant)); + cache.Remove(GetAdditionalTariffsCacheKey(tenant)); + inserted = true; + + tx.Commit(); + } + } + + if (inserted) + { + var t = tenantService.GetTenant(tenant); + if (t != null) + { + // update tenant.LastModified to flush cache in documents + tenantService.SaveTenant(t); + } + } + + return inserted; + } + public void DeleteDefaultBillingInfo() { const int tenant = Tenant.DEFAULT_TENANT; diff --git a/common/ASC.Core.Common/Caching/CachedTenantService.cs b/common/ASC.Core.Common/Caching/CachedTenantService.cs index b63fde1c3..b677a5fee 100644 --- a/common/ASC.Core.Common/Caching/CachedTenantService.cs +++ b/common/ASC.Core.Common/Caching/CachedTenantService.cs @@ -43,6 +43,13 @@ public TimeSpan SettingsExpiration set; } + public bool IsDocspace + { + get + { + return service.IsDocspace; + } + } public CachedTenantService(ITenantService service) { diff --git a/common/ASC.Core.Common/Context/Impl/TenantManager.cs b/common/ASC.Core.Common/Context/Impl/TenantManager.cs index 75f87bb8b..6d44e5b9a 100644 --- a/common/ASC.Core.Common/Context/Impl/TenantManager.cs +++ b/common/ASC.Core.Common/Context/Impl/TenantManager.cs @@ -24,6 +24,7 @@ using System.Web; using ASC.Core.Billing; +using ASC.Core.Data; using ASC.Core.Tenants; @@ -217,11 +218,35 @@ public TenantQuota GetTenantQuota(int tenant, bool useCache = true) { currentQuota = (TenantQuota)currentQuota.Clone(); - if (currentQuota.ActiveUsers == -1) + if (tenantService.IsDocspace) { - currentQuota.ActiveUsers = tariff.Quantity; - currentQuota.MaxTotalSize *= currentQuota.ActiveUsers; - currentQuota.Price *= currentQuota.ActiveUsers; + currentQuota.ActiveUsers *= tariff.Quantity; + currentQuota.MaxTotalSize *= tariff.Quantity; + currentQuota.Price *= tariff.Quantity; + + var additionalTariffs = tariffService.GetAdditionalTariffs(tenant); + if (additionalTariffs != null) + { + foreach (var additionalTariff in additionalTariffs) + { + var additionalQuota = quotaService.GetTenantQuota(additionalTariff.QuotaId); + if (additionalQuota != null) + { + currentQuota.ActiveUsers += additionalQuota.ActiveUsers * additionalTariff.Quantity; + currentQuota.MaxTotalSize += additionalQuota.MaxTotalSize * additionalTariff.Quantity; + currentQuota.Price += additionalQuota.Price * additionalTariff.Quantity; + } + } + } + } + else + { + if (currentQuota.ActiveUsers == -1) + { + currentQuota.ActiveUsers = tariff.Quantity; + currentQuota.MaxTotalSize *= currentQuota.ActiveUsers; + currentQuota.Price *= currentQuota.ActiveUsers; + } } return currentQuota; diff --git a/common/ASC.Core.Common/Core/ITenantService.cs b/common/ASC.Core.Common/Core/ITenantService.cs index 2ec6774ae..f8616745f 100644 --- a/common/ASC.Core.Common/Core/ITenantService.cs +++ b/common/ASC.Core.Common/Core/ITenantService.cs @@ -47,5 +47,7 @@ public interface ITenantService void SetTenantSettings(int tenant, string key, byte[] data); IEnumerable GetTenantVersions(); + + bool IsDocspace { get; } } } diff --git a/common/ASC.Core.Common/Data/DbBaseService.cs b/common/ASC.Core.Common/Data/DbBaseService.cs index 292a8edf4..641d34b7d 100644 --- a/common/ASC.Core.Common/Data/DbBaseService.cs +++ b/common/ASC.Core.Common/Data/DbBaseService.cs @@ -28,6 +28,8 @@ namespace ASC.Core.Data { public abstract class DbBaseService { + public readonly bool IsDocspace; + private readonly string dbid; protected string TenantColumn @@ -40,6 +42,7 @@ protected DbBaseService(ConnectionStringSettings connectionString, string tenant { dbid = connectionString.Name; TenantColumn = tenantColumn; + IsDocspace = connectionString.ConnectionString.Contains("docspace"); } protected T ExecScalar(ISqlInstruction sql) diff --git a/common/ASC.Core.Common/Data/DbLoginEventsManager.cs b/common/ASC.Core.Common/Data/DbLoginEventsManager.cs index 86b878d8f..5b17b2b67 100644 --- a/common/ASC.Core.Common/Data/DbLoginEventsManager.cs +++ b/common/ASC.Core.Common/Data/DbLoginEventsManager.cs @@ -85,6 +85,31 @@ public static bool IsActiveLoginEvent(int tenantId, Guid userId, int loginEventI return isActive; } } + + public static BaseEvent GetLoginEvent(int tenantId, int loginEventId) + { + using (var db = GetDbManager()) + { + var query = new SqlQuery("login_events") + .Select("id", "substring_index(ip, ':', 1) ip", "platform", "browser", "date", "user_id") + .Where("tenant_id", tenantId) + .Where("id", loginEventId) + .Where("active", true); + + var loginEvent = db.ExecuteList(query).Select(row => new BaseEvent + { + TenantId = tenantId, + Id = (int)row[0], + IP = (string)row[1], + Platform = (string)row[2], + Browser = (string)row[3], + Date = TenantUtil.DateTimeFromUtc((DateTime)row[4]), + UserId = Guid.Parse((string)row[5]) + }).FirstOrDefault(); + + return loginEvent; + } + } public static List GetLoginEvents(int tenantId, Guid userId) { diff --git a/common/ASC.Core.Common/Data/DbQuotaService.cs b/common/ASC.Core.Common/Data/DbQuotaService.cs index ec6ce1463..fe2dc0ca3 100644 --- a/common/ASC.Core.Common/Data/DbQuotaService.cs +++ b/common/ASC.Core.Common/Data/DbQuotaService.cs @@ -19,6 +19,7 @@ using System.Collections.Generic; using System.Configuration; using System.Linq; +using System.Text.RegularExpressions; using ASC.Common.Data.Sql; using ASC.Common.Data.Sql.Expressions; @@ -31,7 +32,6 @@ public class DbQuotaService : DbBaseService, IQuotaService private const string tenants_quota = "tenants_quota"; public const string tenants_quotarow = "tenants_quotarow"; - public DbQuotaService(ConnectionStringSettings connectionString) : base(connectionString, "tenant") { @@ -51,6 +51,8 @@ public TenantQuota GetTenantQuota(int id, bool useCache = false) private IEnumerable GetTenantQuotas(Exp where) { + if (IsDocspace) return GetDocspaceTenantQuotas(where); + var q = new SqlQuery(tenants_quota) .Select("tenant", "name", "max_file_size", "max_total_size", "active_users", "features", "price", "avangate_id", "visible") .Where(where); @@ -69,9 +71,45 @@ private IEnumerable GetTenantQuotas(Exp where) }); } + private IEnumerable GetDocspaceTenantQuotas(Exp where) + { + var q = new SqlQuery(tenants_quota) + .Select("tenant", "name", "features", "price", "product_id", "visible") + .Where(where); + + return ExecList(q) + .ConvertAll(r => + { + var features = (string)r[2]; + var featuresArray = features.Split(','); + var fileSize = GetQuotaFeatureValue(featuresArray, "file_size"); + var totalSize = GetQuotaFeatureValue(featuresArray, "total_size"); + var managers = GetQuotaFeatureValue(featuresArray, "manager"); + + return new TenantQuota(Convert.ToInt32(r[0])) + { + Name = (string)r[1], + MaxFileSize = fileSize == null ? 0 : GetInBytes(Convert.ToInt64(fileSize)), + MaxTotalSize = totalSize == null ? 0 : GetInBytes(Convert.ToInt64(totalSize)), + ActiveUsers = managers == null ? 0 : Convert.ToInt32(managers), + Features = features, + Price = Convert.ToDecimal(r[3]), + AvangateId = (string)r[4], + Visible = Convert.ToBoolean(r[5]), + }; + }); + } + + private string GetQuotaFeatureValue(string[] featuresArray, string featureName) + { + var featureStr = featuresArray.FirstOrDefault(f => f.StartsWith(featureName + ":")); + return featureStr == null ? null : Regex.Match(featureStr, @"\d+").Value; + } public TenantQuota SaveTenantQuota(TenantQuota quota) { + if (IsDocspace) throw new NotImplementedException(); + if (quota == null) throw new ArgumentNullException("quota"); var i = Insert(tenants_quota, quota.Id) @@ -90,6 +128,8 @@ public TenantQuota SaveTenantQuota(TenantQuota quota) public void RemoveTenantQuota(int id) { + if (IsDocspace) throw new NotImplementedException(); + var d = Delete(tenants_quota, id); ExecNonQuery(d); } diff --git a/common/ASC.Core.Common/Data/DbTenantService.cs b/common/ASC.Core.Common/Data/DbTenantService.cs index 8b921e527..cba4552ce 100644 --- a/common/ASC.Core.Common/Data/DbTenantService.cs +++ b/common/ASC.Core.Common/Data/DbTenantService.cs @@ -28,7 +28,6 @@ using ASC.Common.Utils; using ASC.Core.Tenants; using ASC.Core.Users; -using ASC.Security.Cryptography; namespace ASC.Core.Data { @@ -37,6 +36,13 @@ public class DbTenantService : DbBaseService, ITenantService private static TimeZoneInfo defaultTimeZone; private List forbiddenDomains; + public new bool IsDocspace + { + get + { + return base.IsDocspace; + } + } public DbTenantService(ConnectionStringSettings connectionString) : base(connectionString, null) @@ -227,19 +233,22 @@ public Tenant SaveTenant(Tenant t) db.ExecuteNonQuery(u); } - if (string.IsNullOrEmpty(t.PartnerId) && string.IsNullOrEmpty(t.AffiliateId) && string.IsNullOrEmpty(t.Campaign)) - { - var d = new SqlDelete("tenants_partners").Where("tenant_id", t.TenantId); - db.ExecuteNonQuery(d); - } - else + if (!IsDocspace) { - var i = new SqlInsert("tenants_partners", true) - .InColumnValue("tenant_id", t.TenantId) - .InColumnValue("partner_id", t.PartnerId) - .InColumnValue("affiliate_id", t.AffiliateId) - .InColumnValue("campaign", t.Campaign); - db.ExecuteNonQuery(i); + if (string.IsNullOrEmpty(t.PartnerId) && string.IsNullOrEmpty(t.AffiliateId) && string.IsNullOrEmpty(t.Campaign)) + { + var d = new SqlDelete("tenants_partners").Where("tenant_id", t.TenantId); + db.ExecuteNonQuery(d); + } + else + { + var i = new SqlInsert("tenants_partners", true) + .InColumnValue("tenant_id", t.TenantId) + .InColumnValue("partner_id", t.PartnerId) + .InColumnValue("affiliate_id", t.AffiliateId) + .InColumnValue("campaign", t.Campaign); + db.ExecuteNonQuery(i); + } } tx.Commit(); @@ -278,7 +287,6 @@ public IEnumerable GetTenantVersions() .ConvertAll(r => new TenantVersion(Convert.ToInt32(r[0]), (string)r[1])); } - public byte[] GetTenantSettings(int tenant, string key) { return ExecScalar(new SqlQuery("core_settings").Select("value").Where("tenant", tenant).Where("id", key)); @@ -298,8 +306,18 @@ private IEnumerable GetTenants(Exp where) return ExecList(q).ConvertAll(ToTenant); } - private static SqlQuery TenantsQuery(Exp where) + private SqlQuery TenantsQuery(Exp where) { + if (IsDocspace) + { + return new SqlQuery("tenants_tenants t") + .Select("t.id", "t.alias", "t.mappeddomain", "t.version", "t.version_changed", "t.name", "t.language", "t.timezone", "t.owner_id") + .Select("t.trusteddomains", "t.trusteddomainsenabled", "t.creationdatetime", "t.status", "t.statuschanged", "t.payment_id", "t.last_modified") + .Select("NULL", "NULL", "NULL") + .Select("t.industry", "t.spam", "t.calls") + .Where(where); + } + return new SqlQuery("tenants_tenants t") .Select("t.id", "t.alias", "t.mappeddomain", "t.version", "t.version_changed", "t.name", "t.language", "t.timezone", "t.owner_id") .Select("t.trusteddomains", "t.trusteddomainsenabled", "t.creationdatetime", "t.status", "t.statuschanged", "t.payment_id", "t.last_modified") diff --git a/common/ASC.Core.Common/Data/DbUserService.cs b/common/ASC.Core.Common/Data/DbUserService.cs index a9691d9fb..8c50deac3 100644 --- a/common/ASC.Core.Common/Data/DbUserService.cs +++ b/common/ASC.Core.Common/Data/DbUserService.cs @@ -24,6 +24,7 @@ using ASC.Common.Data.Sql.Expressions; using ASC.Core.Tenants; using ASC.Core.Users; +using ASC.MessagingSystem; namespace ASC.Core.Data { @@ -168,8 +169,11 @@ public UserInfo SaveUser(int tenant, UserInfo user) .InColumnValue("sid", user.Sid) .InColumnValue("sso_name_id", user.SsoNameId) .InColumnValue("sso_session_id", user.SsoSessionId) - .InColumnValue("create_on", user.CreateDate) - .InColumnValue("user_lead", user.Lead); + .InColumnValue("create_on", user.CreateDate); + + if (!IsDocspace) { + i.InColumnValue("user_lead", user.Lead); + } db.ExecuteNonQuery(i); @@ -231,9 +235,26 @@ public byte[] GetUserPhoto(int tenant, Guid id) public DateTime GetUserPasswordStamp(int tenant, Guid id) { - var q = Query("core_usersecurity", tenant).Select("LastModified").Where("userid", id.ToString()); - var stamp = ExecScalar(q); - return !string.IsNullOrEmpty(stamp) ? Convert.ToDateTime(stamp) : DateTime.MinValue; + var userId = id.ToString(); + var auditQuery = new SqlQuery("audit_events") + .Select("date") + .Where("tenant_id", tenant) + .Where("action", (int)MessageAction.UserSentPasswordChangeInstructions) + .Where("target", userId) + .OrderBy("id", false) + .SetMaxResults(1); + + var auditValue = ExecScalar(auditQuery); + var auditDate = string.IsNullOrEmpty(auditValue) ? DateTime.MinValue : Convert.ToDateTime(auditValue); + + var securityQuery = Query("core_usersecurity", tenant) + .Select("LastModified") + .Where("userid", userId); + + var securityValue = ExecScalar(securityQuery); + var securityDate = string.IsNullOrEmpty(securityValue) ? DateTime.MinValue : Convert.ToDateTime(securityValue); + + return auditDate.CompareTo(securityDate) > 0 ? auditDate : securityDate; } public void SetUserPasswordHash(int tenant, Guid id, string passwordHash) @@ -350,15 +371,16 @@ public void RemoveUserGroupRef(int tenant, Guid userId, Guid groupId, UserGroupR ExecBatch(i, u); } - private static SqlQuery GetUserQuery() + private SqlQuery GetUserQuery() { return new SqlQuery("core_user u") .Select("u.id", "u.username", "u.firstname", "u.lastname", "u.sex", "u.bithdate", "u.status", "u.title") .Select("u.workfromdate", "u.terminateddate", "u.contacts", "u.email", "u.location", "u.notes", "u.removed") - .Select("u.last_modified", "u.tenant", "u.activation_status", "u.culture", "u.phone", "u.phone_activation", "u.sid", "u.sso_name_id", "u.sso_session_id", "u.create_on", "u.user_lead"); + .Select("u.last_modified", "u.tenant", "u.activation_status", "u.culture", "u.phone", "u.phone_activation", "u.sid", "u.sso_name_id", "u.sso_session_id", "u.create_on") + .Select(IsDocspace ? "NULL" : "u.user_lead"); } - private static SqlQuery GetUserQuery(int tenant, DateTime from) + private SqlQuery GetUserQuery(int tenant, DateTime from) { var q = GetUserQuery(); var where = Exp.Empty; diff --git a/common/ASC.Core.Common/HostedSolution.cs b/common/ASC.Core.Common/HostedSolution.cs index 5362ae703..03687420f 100644 --- a/common/ASC.Core.Common/HostedSolution.cs +++ b/common/ASC.Core.Common/HostedSolution.cs @@ -50,6 +50,10 @@ public string DbId private set; } + public bool IsDocspace + { + get { return tenantService.IsDocspace; } + } public HostedSolution(ConnectionStringSettings connectionString) : this(connectionString, null) @@ -216,7 +220,7 @@ public void SetTariff(int tenant, bool paid) var quota = quotaService.GetTenantQuotas().FirstOrDefault(q => paid ? q.NonProfit : q.Trial); if (quota != null) { - tariffService.SetTariff(tenant, new Tariff { QuotaId = quota.Id, DueDate = DateTime.MaxValue, }); + tariffService.SetTariff(tenant, new Tariff { QuotaId = quota.Id, DueDate = DateTime.MaxValue, Quantity = 1 }); } } @@ -235,6 +239,16 @@ public IEnumerable FindUsers(IEnumerable userIds) return userService.GetUsersAllTenants(userIds); } + public UserInfo GetUser(int tenant, string email) + { + return userService.GetUser(tenant, email); + } + + public DateTime GetUserPasswordStamp(int tenant, Guid userId) + { + return userService.GetUserPasswordStamp(tenant, userId); + } + private Tenant AddRegion(Tenant tenant) { if (tenant != null) diff --git a/common/ASC.Core.Common/MultiRegionHostedSolution.cs b/common/ASC.Core.Common/MultiRegionHostedSolution.cs index 975802d41..a343d5eff 100644 --- a/common/ASC.Core.Common/MultiRegionHostedSolution.cs +++ b/common/ASC.Core.Common/MultiRegionHostedSolution.cs @@ -43,24 +43,24 @@ public MultiRegionHostedSolution(string dbid) this.dbid = dbid; } - public List GetTenants(DateTime from) + public List GetTenants(DateTime from, bool? docspace = null) { - return GetRegionServices() + return GetRegionServices(docspace) .SelectMany(r => r.GetTenants(from)) .ToList(); } - public List FindTenants(string login) + public List FindTenants(string login, bool? docspace = null) { - return FindTenants(login, null); + return FindTenants(login, null, null, docspace); } - public List FindTenants(string login, string password, string passwordHash = null) + public List FindTenants(string login, string password, string passwordHash = null, bool? docspace = null) { var result = new List(); Exception error = null; - foreach (var service in GetRegionServices()) + foreach (var service in GetRegionServices(docspace)) { try { @@ -88,9 +88,9 @@ public void RegisterTenant(string region, TenantRegistrationInfo ri, out Tenant GetRegionService(region).RegisterTenant(ri, out tenant); } - public Tenant GetTenant(string domain) + public Tenant GetTenant(string domain, bool? docspace = null) { - foreach (var service in GetRegionServices()) + foreach (var service in GetRegionServices(docspace)) { var tenant = service.GetTenant(domain); if (tenant != null) @@ -143,41 +143,46 @@ public TenantQuota GetTenantQuota(string region, int tenant) return GetRegionService(region).GetTenantQuota(tenant); } - public void CheckTenantAddress(string address) + public void CheckTenantAddress(string address, bool? docspace = null) { - foreach (var service in GetRegionServices()) + foreach (var service in GetRegionServices(docspace)) { service.CheckTenantAddress(address); } } - public IEnumerable GetRegions() + public IEnumerable GetRegions(bool? docspace = null) { - return GetRegionServices().Select(s => s.Region).ToList(); + return GetRegionServices(docspace).Select(s => s.Region).ToList(); } - public IDbManager GetRegionDb(string region) + public IDbManager GetRegionDb(string region, out bool docspace) { - return new DbManager(GetRegionService(region).DbId); + var hostedSolution = GetRegionService(region); + docspace = hostedSolution.IsDocspace; + return new DbManager(hostedSolution.DbId); } - public IDbManager GetMultiRegionDb() + public IDbManager GetMultiRegionDb(bool? docspace = null) { - return new MultiRegionalDbManager(GetRegions().Select(r => new DbManager(GetRegionService(r).DbId))); + return new MultiRegionalDbManager(GetRegions(docspace).Select(r => new DbManager(GetRegionService(r).DbId))); } - public ConnectionStringSettings GetRegionConnectionString(string region) + public ConnectionStringSettings GetRegionConnectionString(string region, out bool docspace) { - return DbRegistry.GetConnectionString(GetRegionService(region).DbId); + var hostedSolution = GetRegionService(region); + docspace = hostedSolution.IsDocspace; + return DbRegistry.GetConnectionString(hostedSolution.DbId); } - private IEnumerable GetRegionServices() + private IEnumerable GetRegionServices(bool? docspace = null) { Initialize(); return regions.Where(x => !String.IsNullOrEmpty(x.Key)) - .Select(x => x.Value); + .Select(x => x.Value) + .Where(r => docspace.HasValue ? r.IsDocspace == docspace : true); } private HostedSolution GetRegionService(string region) diff --git a/common/ASC.Core.Common/Notify/Senders/SmtpSender.cs b/common/ASC.Core.Common/Notify/Senders/SmtpSender.cs index 29d1e3caa..f1b65bcde 100644 --- a/common/ASC.Core.Common/Notify/Senders/SmtpSender.cs +++ b/common/ASC.Core.Common/Notify/Senders/SmtpSender.cs @@ -39,8 +39,19 @@ internal class SmtpSender : INotifySender + + + -{0} +{0} "; protected ILog Log { get; private set; } @@ -279,6 +290,10 @@ private MimeMessage BuildMailMessage(NotifyMessage m) protected string GetHtmlView(string body) { + body = body.StartsWith("{0}", body); + return string.Format(HTML_FORMAT, body); } diff --git a/common/ASC.Core.Common/Tenants/TenantUtil.cs b/common/ASC.Core.Common/Tenants/TenantUtil.cs index 771524478..4a917a012 100644 --- a/common/ASC.Core.Common/Tenants/TenantUtil.cs +++ b/common/ASC.Core.Common/Tenants/TenantUtil.cs @@ -16,6 +16,7 @@ using System; +using System.Text.RegularExpressions; namespace ASC.Core.Tenants { @@ -30,7 +31,7 @@ public static String GetBaseDomain(string hostedRegion) return baseHost; } var subdomain = baseHost.Remove(baseHost.IndexOf('.') + 1); - return hostedRegion.StartsWith(subdomain) ? hostedRegion : (subdomain + hostedRegion.TrimStart('.')); + return hostedRegion.StartsWith(subdomain) ? hostedRegion : (subdomain + Regex.Replace(hostedRegion.TrimStart('.'), @"\d", "")); } diff --git a/common/ASC.Data.Backup/ASC.Data.Backup.csproj b/common/ASC.Data.Backup/ASC.Data.Backup.csproj index 2b14b4548..7730dcfc5 100644 --- a/common/ASC.Data.Backup/ASC.Data.Backup.csproj +++ b/common/ASC.Data.Backup/ASC.Data.Backup.csproj @@ -75,6 +75,7 @@ + @@ -98,6 +99,7 @@ + Code @@ -108,6 +110,7 @@ Code + @@ -197,6 +200,9 @@ 8.0.32.1 + + 2020.0.2 + diff --git a/common/ASC.Data.Backup/Service/BackupConfiguration.cs b/common/ASC.Data.Backup/Service/BackupConfiguration.cs index 488c2ddf8..693855124 100644 --- a/common/ASC.Data.Backup/Service/BackupConfiguration.cs +++ b/common/ASC.Data.Backup/Service/BackupConfiguration.cs @@ -44,16 +44,6 @@ public int Limit set { this["limit"] = value; } } - [ConfigurationProperty("chunkSize", DefaultValue = 20971520L)] - public long ChunkSize - { - get - { - return long.Parse(this["chunkSize"].ToString()); - } - set { this["chunkSize"] = value; } - } - [ConfigurationProperty("service")] public ServiceConfigurationElement Service { @@ -82,6 +72,13 @@ public WebConfigCollection WebConfigs set { this["webConfigs"] = value; } } + [ConfigurationProperty("mailServer")] + public MailServerConfigurationElement MailServer + { + get { return (MailServerConfigurationElement)this["mailServer"]; } + set { this["mailServer"] = value; } + } + public static BackupConfigurationSection GetSection() { return (BackupConfigurationSection)ConfigurationManagerExtension.GetSection("backup"); @@ -125,6 +122,44 @@ public int WorkerCount } } + public class MailServerConfigurationElement : ConfigurationElement + { + [ConfigurationProperty("pathToMailFilesOnHost", DefaultValue = "")] + public string PathToMailFilesOnHost + { + get { return (string)this["pathToMailFilesOnHost"]; } + set { this["pathToMailFilesOnHost"] = value; } + } + + [ConfigurationProperty("hostAddress", DefaultValue = "")] + public string HostAddress + { + get { return (string)this["hostAddress"]; } + set { this["hostAddress"] = value; } + } + + [ConfigurationProperty("hostUsername", DefaultValue = "")] + public string HostUsername + { + get { return (string)this["hostUsername"]; } + set { this["hostUsername"] = value; } + } + + [ConfigurationProperty("hostPassword", DefaultValue = "")] + public string HostPassword + { + get { return (string)this["hostPassword"]; } + set { this["hostPassword"] = value; } + } + + [ConfigurationProperty("hostKey", DefaultValue = "")] + public string HostKey + { + get { return (string)this["hostKey"]; } + set { this["hostKey"] = value; } + } + } + public class WebConfigCollection : ConfigurationElementCollection { [ConfigurationProperty("current", DefaultValue = "localhost")] diff --git a/common/ASC.Data.Backup/Service/BackupMailServerFilesService.cs b/common/ASC.Data.Backup/Service/BackupMailServerFilesService.cs new file mode 100644 index 000000000..294926745 --- /dev/null +++ b/common/ASC.Data.Backup/Service/BackupMailServerFilesService.cs @@ -0,0 +1,319 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; + +using ASC.Common.Logging; +using ASC.Data.Backup.Exceptions; +using ASC.Data.Storage.ZipOperators; + +using Renci.SshNet; + +namespace ASC.Data.Backup.Service +{ + public class BackupMailServerFilesService + { + /// + /// State of the mail server connection + /// + public bool IsConnected { get; private set; } + + private SftpClient _sftpClient; + + public static string mailFilesDirectoryInArchiv = "mailServerFiles"; + + private ILog _logger; + + public string pathToMailFilesOnHost; + + private string host; + private string userName; + private string pathToKey; + private string password; + + public BackupMailServerFilesService(ILog Logger) + { + var config = BackupConfigurationSection.GetSection(); + + _logger = Logger; + + host = config.MailServer.HostAddress; + userName = config.MailServer.HostUsername; + pathToKey = config.MailServer.HostKey; + password = config.MailServer.HostPassword; + pathToMailFilesOnHost = config.MailServer.PathToMailFilesOnHost; + + _logger.Debug($"BackupMailServerFilesService: Host = {host}, UserName={userName}, password={password}, pathToKey={pathToKey}, pathToMailFilesOnHost={pathToMailFilesOnHost}."); + + if (string.IsNullOrEmpty(host) + || string.IsNullOrEmpty(userName)) + { + _logger.Debug("MailServerHostAddress and MailServerHostUsername don't have values."); + + IsConnected = false; + + return; + } + + IsConnected = Connect(); + } + + /// + /// Connect to Mail Server + /// + /// True if connect establish, False if not. + public bool Connect() + { + try + { + var methods = new List(); + + if (!string.IsNullOrEmpty(pathToKey)) + { + PrivateKeyFile keyFile = new PrivateKeyFile(pathToKey); + var keyFiles = new[] { keyFile }; + + methods.Add(new PrivateKeyAuthenticationMethod(userName, keyFiles)); + } + + if (!string.IsNullOrEmpty(password)) + { + methods.Add(new PasswordAuthenticationMethod(userName, password)); + }; + + if (methods.Count == 0) + { + _logger.Debug($"BackupMailServerFilesService didn`t connect, becouse pathToKey and password are empty."); + } + + ConnectionInfo con = new ConnectionInfo(host, 22, userName, methods.ToArray()); + + _sftpClient = new SftpClient(con); + _sftpClient.Connect(); + } + catch (Exception ex) + { + _logger.Debug($"BackupMailServerFilesService didn`t connect, becouse: {ex}"); + } + + return _sftpClient.IsConnected; + } + + /// + /// Download single file from the mail server and return the path to file on the local temp directory + /// + /// + /// + public string GetSingleFile(string pathRemoteFile) + { + if (!IsConnected) return ""; + + string result = TempPath.GetTempFileName(); + + using (Stream fileStream = System.IO.File.OpenWrite(result)) + { + _sftpClient.DownloadFile(pathRemoteFile, fileStream); + } + + return result; + } + + /// + /// Get List of files pathes on the mail server directory, if connection establish + /// + /// + /// + public string[] GetFilesList(string remoteDirectory) + { + if (!IsConnected) return new string[0]; + + var files = _sftpClient.ListDirectory(remoteDirectory); + + return files.Where(x => !x.IsDirectory).Select(f => f.Name).ToArray(); + } + + /// + /// Get List of directories on the mail server directory, if connection establish + /// + /// + /// + /// + public string[] GetDirectoryList(string remoteDirectory) + { + string[] result = new string[0]; + + if (!IsConnected) return result; + + try + { + var files = _sftpClient.ListDirectory(remoteDirectory); + + result = files.Where(x => x.IsDirectory) + .Select(f => f.Name) + .ToArray(); + } + catch (Exception ex) + { + _logger.Debug($"Get Directory List error. Path={remoteDirectory}.{ex.Message}"); + } + + return result; + } + + /// + /// Recursively download and save by fileSaver action the directory from the mail server + /// + /// Directory on the mail server + /// Action for save file + /// Count of saved files + public int SaveDirectory(string path, Action fileSaver) + { + var result = 0; + + if (!IsConnected) return result; + + _logger.Debug($"Save Directory {path} start."); + + var files = GetFilesList(path); + + foreach (var file in files) + { + var filePath = path + '/' + file; + + try + { + _logger.Debug($"Try save file {filePath}."); + + using (Stream fileStream = new MemoryStream()) + { + _sftpClient.DownloadFile(filePath, fileStream); + + fileSaver(mailFilesDirectoryInArchiv + filePath, fileStream); + + result++; + } + + } + catch (Exception ex) + { + _logger.Error($"Save file {filePath} error. {ex.Message}"); + } + } + + var directorys = GetDirectoryList(path); + + foreach (var directory in directorys) + { + if (directory == ".." || directory == ".") continue; + + result += SaveDirectory(path + '/' + directory, fileSaver); + } + + _logger.Debug($"Upload Directory {path} ended. {result} files was saved."); + + return result; + } + + /// + /// Upload the directory to the mail server + /// + /// + /// Count of uploaded files + public int UploadMailDirectory(IDataReadOperator dataReader) + { + _logger.Debug($"Upload Mail Directory started."); + + return UploadDirectory(mailFilesDirectoryInArchiv + pathToMailFilesOnHost, dataReader); + } + /// + /// Upload the directory to the mail server + /// + /// + /// + /// Count of uploaded files + public int UploadDirectory(string path, IDataReadOperator dataReader) + { + var result = 0; + + if (!IsConnected) return result; + + _logger.Debug($"Upload Directory {path} start."); + + try + { + var abloluteFolderName = path.Substring(path.IndexOf(pathToMailFilesOnHost)); + + if(_sftpClient.Exists(abloluteFolderName)) + { + _logger.Debug($"UploadDirectory: directory {abloluteFolderName} existed."); + } + else + { + _sftpClient.CreateDirectory(abloluteFolderName); + _sftpClient.ChangePermissions(abloluteFolderName, 777); + + _logger.Debug($"UploadDirectory: directory {abloluteFolderName} created."); + } + + var directories = dataReader.GetDirectories(path); + + foreach (var directory in directories) + { + try + { + result += UploadDirectory(directory, dataReader); + } + catch (Exception ex) + { + _logger.Error($"Upload Directory: upload directory {directory} exception: {ex.Message}"); + } + } + + var files = dataReader.GetEntries(path); + + foreach (var file in files) + { + try + { + var destinationName = file.Substring(file.IndexOf(pathToMailFilesOnHost)); + + _logger.Debug($"Upload Directory: Begin start copy file {mailFilesDirectoryInArchiv + destinationName}"); + + using (var streamData = dataReader.GetEntry(mailFilesDirectoryInArchiv + destinationName)) + { + if (streamData == null) + { + _logger.Debug($"Upload Directory: File didn't found: {file}"); + + continue; + } + + _logger.Debug($"Upload Directory: place {streamData.Length} bytes file to {destinationName}"); + + using (var remoteFile = _sftpClient.Create(destinationName)) + { + streamData.CopyTo(remoteFile); + } + + _sftpClient.ChangePermissions(destinationName, 777); + } + + result++; + } + catch (Exception ex) + { + _logger.Error($"UploadDirectory: upload file {file} exception: {ex.Message}"); + } + } + } + catch (Exception ex) + { + _logger.Error($"UploadDirectory exception: {ex.Message}"); + } + + _logger.Debug($"Upload Directory {path} stop. {result} files upload."); + + return result; + } + } +} diff --git a/common/ASC.Data.Backup/Service/BackupService.cs b/common/ASC.Data.Backup/Service/BackupService.cs index 0c1da9d43..365d7eddf 100644 --- a/common/ASC.Data.Backup/Service/BackupService.cs +++ b/common/ASC.Data.Backup/Service/BackupService.cs @@ -34,6 +34,8 @@ internal class BackupService : IBackupService, IHealthCheckService public BackupProgress StartBackup(StartBackupRequest request) { + BackupStorageFactory.CheckBackupStorage(request); + var progress = BackupWorker.StartBackup(request); if (!string.IsNullOrEmpty(progress.Error)) { @@ -199,6 +201,8 @@ public List GetTransferRegions() public void CreateSchedule(CreateScheduleRequest request) { + BackupStorageFactory.CheckBackupStorage(request); + BackupStorageFactory.GetBackupRepository().SaveBackupSchedule( new Schedule(request.TenantId) { diff --git a/common/ASC.Data.Backup/Service/BackupWorker.cs b/common/ASC.Data.Backup/Service/BackupWorker.cs index ed816622a..6aa986bd9 100644 --- a/common/ASC.Data.Backup/Service/BackupWorker.cs +++ b/common/ASC.Data.Backup/Service/BackupWorker.cs @@ -66,8 +66,6 @@ public static void Start(BackupConfigurationSection config) configPaths = config.WebConfigs.Cast().ToDictionary(el => el.Region, el => PathHelper.ToRootedConfigPath(el.Path)); configPaths[currentRegion] = PathHelper.ToRootedConfigPath(config.WebConfigs.CurrentPath); - SetupInfo.ChunkUploadSize = config.ChunkSize; - var invalidConfigPath = configPaths.Values.FirstOrDefault(path => !File.Exists(path)); if (invalidConfigPath != null) { @@ -431,6 +429,9 @@ public void RunJob() Percentage = 10; tenant = CoreContext.TenantManager.GetTenant(TenantId); + + Log.Debug($"RestoreProgressItem, RunJob for Tenant={tenant?.TenantId} "); + tenant.SetStatus(TenantStatus.Restoring); CoreContext.TenantManager.SaveTenant(tenant); @@ -484,7 +485,7 @@ public void RunJob() } catch (Exception error) { - Log.Error(error); + Log.Error(error.Message); Error = error; if (tenant != null) diff --git a/common/ASC.Data.Backup/Storage/BackupStorageFactory.cs b/common/ASC.Data.Backup/Storage/BackupStorageFactory.cs index a203f6e92..641a21ac4 100644 --- a/common/ASC.Data.Backup/Storage/BackupStorageFactory.cs +++ b/common/ASC.Data.Backup/Storage/BackupStorageFactory.cs @@ -63,6 +63,37 @@ public static IBackupStorage GetBackupStorage(BackupStorageType type, int tenant } } + public static void CheckBackupStorage(StartBackupRequest backupRequest) + { + if (backupRequest == null) + { + throw new ArgumentNullException("backupRequest"); + } + + if (backupRequest.StorageType != BackupStorageType.Documents && + backupRequest.StorageType != BackupStorageType.ThridpartyDocuments) + { + return; + } + + CoreContext.TenantManager.SetCurrentTenant(backupRequest.TenantId); + + using (var folderDao = Web.Files.Classes.Global.DaoFactory.GetFolderDao()) + { + var folder = folderDao.GetFolder(backupRequest.StorageBasePath); + + if (folder == null) + { + throw new System.IO.DirectoryNotFoundException("Folder not found."); + } + + if (folder.RootFolderType != Files.Core.FolderType.COMMON) + { + throw new NotSupportedException("Root folder type is not supported."); + } + } + } + public static IBackupRepository GetBackupRepository() { return new BackupRepository(); diff --git a/common/ASC.Data.Backup/Tasks/BackupPortalTask.cs b/common/ASC.Data.Backup/Tasks/BackupPortalTask.cs index 0d69b0b8a..ba3673839 100644 --- a/common/ASC.Data.Backup/Tasks/BackupPortalTask.cs +++ b/common/ASC.Data.Backup/Tasks/BackupPortalTask.cs @@ -34,6 +34,7 @@ using ASC.Core; using ASC.Data.Backup.Exceptions; using ASC.Data.Backup.Extensions; +using ASC.Data.Backup.Service; using ASC.Data.Backup.Tasks.Data; using ASC.Data.Backup.Tasks.Modules; using ASC.Data.Storage; @@ -47,6 +48,7 @@ public class BackupPortalTask : PortalTaskBase { private const int MaxLength = 250; private const int BatchLimit = 5000; + private readonly BackupMailServerFilesService backupMailServerFilesService; public string BackupFilePath { get; private set; } public int Limit { get; private set; } private bool Dump { get; set; } @@ -60,6 +62,8 @@ public BackupPortalTask(ILog logger, int tenantId, string fromConfigPath, string BackupFilePath = toFilePath; Limit = limit; Dump = CoreContext.Configuration.Standalone; + + backupMailServerFilesService = new BackupMailServerFilesService(Logger); } public override void RunJob() @@ -84,6 +88,15 @@ public override void RunJob() { DoBackupModule(WriteOperator, dbFactory, module); } + if (!IgnoredModules.Contains(ModuleName.Mail)) + { + var paths = DoBackupMailTable(WriteOperator); + + if (paths.Count != 0) + { + DoBackupMailFiles(WriteOperator, paths); + } + } if (ProcessStorage) { DoBackupStorage(WriteOperator, fileGroups); @@ -96,27 +109,29 @@ public override void RunJob() private void DoDump(IDataWriteOperator writer) { Dictionary> databases = new Dictionary>(); - using (var dbManager = new DbManager("default", 100000)) + if (!IgnoredModules.Contains(ModuleName.Mail)) { - dbManager.ExecuteList("select id, connection_string from mail_server_server").ForEach(r => + using (var dbManager = new DbManager("default", 100000)) { - var dbName = GetDbName((int)r[0], JsonConvert.DeserializeObject>(Convert.ToString(r[1]))["DbConnection"].ToString()); - using (var dbManager1 = new DbManager(dbName, 100000)) + dbManager.ExecuteList("select id, connection_string from mail_server_server").ForEach(r => { - try + var dbName = GetDbName((int)r[0], JsonConvert.DeserializeObject>(Convert.ToString(r[1]))["DbConnection"].ToString()); + using (var dbManager1 = new DbManager(dbName, 100000)) { - var tables = dbManager1.ExecuteList("show tables;").Select(res => Convert.ToString(res[0])).ToList(); - databases.Add(dbName, tables); - } - catch (Exception e) - { - Logger.Error(e); - DbRegistry.UnRegisterDatabase(dbName); + try + { + var tables = dbManager1.ExecuteList("show tables;").Select(res => Convert.ToString(res[0])).ToList(); + databases.Add(dbName, tables); + } + catch (Exception e) + { + Logger.Error(e); + DbRegistry.UnRegisterDatabase(dbName); + } } - } - }); + }); + } } - using (var dbManager = new DbManager("default", 100000)) { var tables = dbManager.ExecuteList("show tables;").Select(res => Convert.ToString(res[0])).ToList(); @@ -684,6 +699,164 @@ private void DoBackupModule(IDataWriteOperator writer, DbFactory dbFactory, IMod Logger.DebugFormat("end saving data for module {0}", module.ModuleName); } + private List DoBackupMailTable(IDataWriteOperator writer) + { + Logger.DebugFormat("begin saving data for MailTable"); + + List result = new List(); + + string dbconnection = null; + var module = new MailTableSpecifics(); + + using (var dbManager = new DbManager("default", 100000)) + { + dbManager.ExecuteList("select connection_string from mail_server_server").ForEach(r => + { + dbconnection = JsonConvert.DeserializeObject>(Convert.ToString(r[0]))["DbConnection"].ToString() + "; convert zero datetime=True"; + + Logger.Debug($"DoBackupMailTable: dbconnection: {dbconnection}."); + }); + + dbManager.ExecuteList($"SELECT name FROM mail_server_domain WHERE tenant={TenantId} AND is_verified=1").ForEach(r => + { + var findedDomain = Convert.ToString(r[0]); + + var findedReverseDomain = string.Join(".", findedDomain.Split('.').Reverse().ToArray()); + + module.findValues["domain"].Add($"'{findedDomain}'"); + + module.findValues["reversedomain"].Add($"'{findedReverseDomain}'"); + + Logger.Debug($"DoBackupMailTable: find domain: {findedDomain}, findedReverseDomain: {findedReverseDomain}."); + }); + } + + if (dbconnection == null) + { + Logger.Debug("DoBackupMailTable: mail_server_server have not connection_string."); + return result; + } + + if (module.findValues["domain"].Count == 0) + { + Logger.Debug($"DoBackupMailTable: TenantId {TenantId} hasn`t any custom domain."); + return result; + } + + var dbFactory = new DbFactory(ConfigPath) { ConnectionStringSettings = new ConnectionStringSettings("mailTable", dbconnection, "MySql.Data.MySqlClient") }; + + using (var connection = dbFactory.OpenConnection()) + { + foreach (var table in module.Tables) + { + Logger.DebugFormat("begin load table {0}", table.Name); + using (var data = new DataTable(table.Name)) + { + ActionInvoker.Try( + state => + { + data.Clear(); + int counts; + var offset = 0; + do + { + var t = (MailTableInfo)state; + var dataAdapter = dbFactory.CreateDataAdapter(); + dataAdapter.SelectCommand = module.CreateSelectCommand(connection.Fix(), t, Limit, offset).WithTimeout(600); + Logger.Debug($"DoBackupMailTable SelectCommand is {dataAdapter.SelectCommand.CommandText}"); + counts = ((DbDataAdapter)dataAdapter).Fill(data); + offset += Limit; + } while (counts == Limit); + + }, + table, + maxAttempts: 5, + onFailure: error => { throw ThrowHelper.CantBackupTable(table.Name, error); }, + onAttemptFailure: error => Logger.Warn("backup attempt failure: {0}", error)); + + foreach (var col in data.Columns.Cast().Where(col => col.DataType == typeof(DateTime))) + { + col.DateTimeMode = DataSetDateTime.Unspecified; + } + + Logger.DebugFormat("end load table {0}", table.Name); + + Logger.DebugFormat("begin saving table {0}", table.Name); + + if (data.TableName == "maddr") + { + foreach (DataRow row in data.Rows) + { + module.findValues["id"].Add(row["id"]); + + var bytes = row["email"] as byte[]; + + var sb = new StringBuilder(); + sb.Append("0x"); + foreach (var b in bytes) + sb.AppendFormat("{0:x2}", b); + + module.findValues["email"].Add(sb.ToString()); + + Logger.Debug($"DoBackupMailTable: In maddr finded email: {sb}."); + } + } + + if (data.TableName == "mailbox") + { + foreach (DataRow row in data.Rows) + { + var storagenode = Convert.ToString(row["storagenode"]); + var maildir = Convert.ToString(row["maildir"]); + + var sb = new StringBuilder(); + sb.Append(backupMailServerFilesService.pathToMailFilesOnHost); + + sb.Append('/'); + + sb.AppendFormat(storagenode); + + sb.Append('/'); + + sb.AppendFormat(maildir); + + result.Add(sb.ToString()); + + Logger.Debug($"DoBackupMailTable: In mailbox finded path: {sb}."); + } + } + + using (var file = TempStream.Create()) + { + data.WriteXml(file, XmlWriteMode.WriteSchema); + data.Clear(); + + writer.WriteEntry(KeyHelper.GetMailTableZipKey(data.TableName), file); + } + + Logger.DebugFormat("end saving table {0}", table.Name); + } + } + } + Logger.DebugFormat("end saving data for MailTable"); + + return result; + } + + private void DoBackupMailFiles(IDataWriteOperator writer, List paths) + { + Logger.DebugFormat("begin saving files for Mail Server"); + + int filesCount = 0; + + foreach (string path in paths) + { + filesCount += backupMailServerFilesService.SaveDirectory(path, writer.WriteEntry); + } + + Logger.DebugFormat($"end saving {filesCount} files for Mail Server"); + } + private void DoBackupStorage(IDataWriteOperator writer, List> fileGroups) { Logger.Debug("begin backup storage"); @@ -703,7 +876,7 @@ private void DoBackupStorage(IDataWriteOperator writer, List Logger.WarnFormat("can't backup file ({0}:{1}): {2}", file1.Module, file1.Path, error)); - if (fileStream != null) + if (fileStream != null) { writer.WriteEntry(file1.GetZipKey(), fileStream); fileStream.Dispose(); diff --git a/common/ASC.Data.Backup/Tasks/DbFactory.cs b/common/ASC.Data.Backup/Tasks/DbFactory.cs index f942af26e..65252a4cc 100644 --- a/common/ASC.Data.Backup/Tasks/DbFactory.cs +++ b/common/ASC.Data.Backup/Tasks/DbFactory.cs @@ -38,7 +38,7 @@ public class DbFactory private ConnectionStringSettings connectionStringSettings; private DbProviderFactory dbProviderFactory; - internal ConnectionStringSettings ConnectionStringSettings + public ConnectionStringSettings ConnectionStringSettings { get { @@ -49,6 +49,10 @@ internal ConnectionStringSettings ConnectionStringSettings } return connectionStringSettings; } + set + { + connectionStringSettings = value; + } } private DbProviderFactory DbProviderFactory diff --git a/common/ASC.Data.Backup/Tasks/KeyHelper.cs b/common/ASC.Data.Backup/Tasks/KeyHelper.cs index fd3c1a703..62c3d1334 100644 --- a/common/ASC.Data.Backup/Tasks/KeyHelper.cs +++ b/common/ASC.Data.Backup/Tasks/KeyHelper.cs @@ -68,5 +68,10 @@ public static string GetStorageRestoreInfoZipKey() { return string.Format("{0}/restore_info", GetStorage()); } + + public static string GetMailTableZipKey(string tableName) + { + return string.Format("mailtable/{0}", tableName); + } } } diff --git a/common/ASC.Data.Backup/Tasks/Modules/MailModuleSpecifics.cs b/common/ASC.Data.Backup/Tasks/Modules/MailModuleSpecifics.cs index cad4834c8..c2db020fd 100644 --- a/common/ASC.Data.Backup/Tasks/Modules/MailModuleSpecifics.cs +++ b/common/ASC.Data.Backup/Tasks/Modules/MailModuleSpecifics.cs @@ -50,44 +50,74 @@ internal class MailModuleSpecifics : ModuleSpecificsBase UserIDColumns = new[] {"id_user"}, DateColumns = new Dictionary {{"begin_date", false}} }, + new TableInfo("mail_mailbox_server", idColumn: "id"), + new TableInfo("mail_mailbox_provider", idColumn: "id"), + new TableInfo("mail_mailbox_domain", idColumn: "id"), + + new TableInfo("mail_server_dns", "tenant", "id") {UserIDColumns = new[] {"id_user"}}, + new TableInfo("mail_server_domain", "tenant", "id"), + new TableInfo("mail_server_address", "tenant", "id"), + new TableInfo("mail_server_mail_group", "id_tenant"), + new TableInfo("mail_tag", "tenant", "id") {UserIDColumns = new[] {"id_user"}}, new TableInfo("mail_tag_addresses", "tenant"), new TableInfo("mail_tag_mail", "tenant") {UserIDColumns = new[] {"id_user"}}, new TableInfo("mail_chain_x_crm_entity", "id_tenant"), new TableInfo("mail_mailbox_signature", "tenant"), - new TableInfo("mail_mailbox_autoreply", "tenant"), + new TableInfo("mail_mailbox_autoreply", "tenant") {InsertMethod = InsertMethod.Ignore}, new TableInfo("mail_mailbox_autoreply_history", "tenant"), new TableInfo("mail_contact_info", "tenant", "id") {UserIDColumns = new[] {"id_user"}}, - new TableInfo("mail_mailbox_provider", idColumn: "id"), - new TableInfo("mail_mailbox_domain", idColumn: "id"), - new TableInfo("mail_mailbox_server", idColumn: "id") + + new TableInfo("mail_filter", "tenant", "id") {UserIDColumns = new[] {"id_user"}}, + new TableInfo("mail_folder", "tenant", "id") {UserIDColumns = new[] {"id_user"}}, + new TableInfo("mail_user_folder", "tenant", "id") {UserIDColumns = new[] {"id_user"}}, + new TableInfo("mail_user_folder_x_mail", "tenant") {UserIDColumns = new[] {"id_user"}} }; private readonly RelationInfo[] _tableRelations = new[] { + new RelationInfo("mail_user_folder", "id", "mail_user_folder", "parent_id"), new RelationInfo("mail_mail", "id", "mail_attachment", "id_mail"), + new RelationInfo("mail_mail", "id", "mail_user_folder_x_mail", "id_mail"), + new RelationInfo("mail_mail", "id", "mail_tag_mail", "id_mail"), + new RelationInfo("mail_mailbox", "id", "mail_mail", "id_mailbox"), new RelationInfo("mail_mailbox", "id", "mail_chain", "id_mailbox"), + new RelationInfo("mail_mailbox", "id", "mail_chain_x_crm_entity", "id_mailbox"), + new RelationInfo("mail_mailbox", "id", "mail_mailbox_autoreply", "id_mailbox"), + new RelationInfo("mail_mailbox", "id", "mail_mailbox_autoreply_history", "id_mailbox"), + new RelationInfo("mail_mailbox", "id", "mail_server_address", "id_mailbox"), + new RelationInfo("mail_mailbox", "id", "mail_mailbox_signature", "id_mailbox"), + + new RelationInfo("mail_mailbox_server", "id", "mail_mailbox", "id_smtp_server"), + new RelationInfo("mail_mailbox_server", "id", "mail_mailbox", "id_in_server"), + + new RelationInfo("mail_mailbox_provider", "id", "mail_mailbox_server", "id_provider"), + new RelationInfo("mail_mailbox_provider", "id", "mail_mailbox_domain", "id_provider"), + + new RelationInfo("mail_server_domain", "id", "mail_server_dns", "id_domain"), + new RelationInfo("mail_server_domain", "id", "mail_server_address", "id_domain"), + new RelationInfo("mail_server_address", "id", "mail_server_mail_group", "id_address"), + + //new RelationInfo("mail_user_folder", "id", "mail_user_folder_tree", "folder_id"), + //new RelationInfo("mail_user_folder", "id", "mail_user_folder_tree", "parent_id"), + new RelationInfo("mail_tag", "id", "mail_chain", "tags"), new RelationInfo("crm_tag", "id", "mail_chain", "tags", typeof(CrmModuleSpecifics)), - new RelationInfo("mail_mailbox", "id", "mail_mail", "id_mailbox"), + new RelationInfo("crm_tag", "id", "mail_tag", "crm_id", typeof(CrmModuleSpecifics)), new RelationInfo("mail_tag", "id", "mail_tag_addresses", "id_tag", x => Convert.ToInt32(x["id_tag"]) > 0), new RelationInfo("crm_tag", "id", "mail_tag_addresses", "id_tag", typeof(CrmModuleSpecifics), x => Convert.ToInt32(x["id_tag"]) < 0), - new RelationInfo("mail_mail", "id", "mail_tag_mail", "id_mail"), new RelationInfo("mail_tag", "id", "mail_tag_mail", "id_tag", x => Convert.ToInt32(x["id_tag"]) > 0), new RelationInfo("crm_tag", "id", "mail_tag_mail", "id_tag", typeof(CrmModuleSpecifics), x => Convert.ToInt32(x["id_tag"]) < 0), - new RelationInfo("mail_mailbox", "id", "mail_chain_x_crm_entity", "id_mailbox"), new RelationInfo("crm_contact", "id", "mail_chain_x_crm_entity", "entity_id", typeof(CrmModuleSpecifics), x => Convert.ToInt32(x["entity_type"]) == 1), new RelationInfo("crm_case", "id", "mail_chain_x_crm_entity", "entity_id", typeof(CrmModuleSpecifics), x => Convert.ToInt32(x["entity_type"]) == 2), new RelationInfo("crm_deal", "id", "mail_chain_x_crm_entity", "entity_id", typeof(CrmModuleSpecifics), x => Convert.ToInt32(x["entity_type"]) == 3), - new RelationInfo("mail_mailbox", "id", "mail_mailbox_signature", "id_mailbox"), + new RelationInfo("files_folder", "id", "mail_mailbox", "email_in_folder", typeof(FilesModuleSpecifics)), - new RelationInfo("mail_mailbox", "id", "mail_mailbox_autoreply", "id_mailbox"), - new RelationInfo("mail_mailbox", "id", "mail_mailbox_autoreply_history", "id_mailbox"), + new RelationInfo("mail_contacts", "id", "mail_contact_info", "id_contact"), - new RelationInfo("mail_mailbox_provider", "id", "mail_mailbox_domain", "id_provider"), - new RelationInfo("mail_mailbox_server", "id", "mail_mailbox", "id_smtp_server"), - new RelationInfo("mail_mailbox_server", "id", "mail_mailbox", "id_in_server") + + new RelationInfo("mail_user_folder", "id", "mail_user_folder_x_mail", "id_folder") }; public override ModuleName ModuleName @@ -113,20 +143,20 @@ protected override string GetSelectCommandConditionText(int tenantId, TableInfo case "mail_mailbox_provider": return string.Format("where t.id in " + "(select distinct t2.id_provider from mail_mailbox t1 " + - "inner join mail_mailbox_server t2 on t2.id in (t1.id_in_server, t1.id_smtp_server) and t2.is_user_data = 1 " + + "inner join mail_mailbox_server t2 on t2.id in (t1.id_in_server, t1.id_smtp_server) " + "where t1.tenant = {0} and t1.is_removed = 0)", tenantId); // mail_mailbox_domain.id_provider not in index case "mail_mailbox_domain": return string.Format("where t.id_provider in " + "(select distinct t2.id_provider from mail_mailbox t1 " + - "inner join mail_mailbox_server t2 on t2.id in (t1.id_in_server, t1.id_smtp_server) and t2.is_user_data = 1 " + + "inner join mail_mailbox_server t2 on t2.id in (t1.id_in_server, t1.id_smtp_server) " + "where t1.tenant = {0} and t1.is_removed = 0)", tenantId); case "mail_mailbox_server": return string.Format("where t.id in " + "(select distinct t2.id from mail_mailbox t1 " + - "inner join mail_mailbox_server t2 on t2.id in (t1.id_in_server, t1.id_smtp_server) and t2.is_user_data = 1 " + + "inner join mail_mailbox_server t2 on t2.id in (t1.id_in_server, t1.id_smtp_server) " + "where t1.tenant = {0} and t1.is_removed = 0)", tenantId); case "mail_mailbox": @@ -172,15 +202,15 @@ public override bool TryAdjustFilePath(bool dump, ColumnMapper columnMapper, ref protected override bool TryPrepareRow(bool dump, DbConnection connection, ColumnMapper columnMapper, TableInfo table, DataRowInfo row, out Dictionary preparedRow) { - if (table.Name == "mail_mailbox") - { - var boxType = row["is_server_mailbox"]; - if (boxType != null && Convert.ToBoolean(int.Parse(boxType.ToString()))) - { - preparedRow = null; - return false; - } - } + //if (table.Name == "mail_mailbox") + //{ + // var boxType = row["is_server_mailbox"]; + // if (boxType != null && !Convert.ToBoolean(int.Parse(boxType.ToString()))) + // { + // preparedRow = null; + // return false; + // } + //} return base.TryPrepareRow(dump, connection, columnMapper, table, row, out preparedRow); } diff --git a/common/ASC.Data.Backup/Tasks/Modules/MailTableSpecifics.cs b/common/ASC.Data.Backup/Tasks/Modules/MailTableSpecifics.cs new file mode 100644 index 000000000..881171ed6 --- /dev/null +++ b/common/ASC.Data.Backup/Tasks/Modules/MailTableSpecifics.cs @@ -0,0 +1,115 @@ +using System.Collections.Generic; +using System.Data.Common; +using System.Linq; + +using ASC.Common.Data; +using ASC.Data.Backup.Tasks.Data; + +namespace ASC.Data.Backup.Tasks.Modules +{ + internal class MailTableSpecifics + { + public Dictionary> findValues = new Dictionary>() + { + { + "domain", new List() + }, + { + "id", new List() + }, + { + "email", new List() + }, + { + "reversedomain", new List() + }, + }; + + private readonly MailTableInfo[] _tables = new[] + { + new MailTableInfo("maddr", "domain", "reversedomain"), + new MailTableInfo("dkim", "domain_name", "domain"), + new MailTableInfo("domain", "domain"), + + new MailTableInfo("mailbox", "username", "email"), + new MailTableInfo("alias", "address", "email"), + new MailTableInfo("used_quota", "username", "email"), + + new MailTableInfo("msgs", "sid", "id"), + new MailTableInfo("msgrcpt", "rid", "id"), + + new MailTableInfo("bayes_seen"), + new MailTableInfo("bayes_token") + }; + + public IEnumerable Tables => _tables; + + public DbCommand CreateSelectCommand(DbConnection connection, MailTableInfo table, int limit, int offset) + { + return connection.CreateCommand(string.Format("select t.* from {0} as t {1} limit {2},{3};", table.Name, GetSelectCommandConditionText(table), offset, limit)); + } + + protected string GetSelectCommandConditionText(MailTableInfo table) + { + return table.existFindColumn ? string.Format("where t.{0} in ({1})", table.FindColumn, string.Join(",", findValues[table.FindColumnKey])) : string.Empty; + } + + + public DbCommand CreateInsertCommand(DbConnection connection, MailTableInfo table, DataRowInfo row) + { + Dictionary valuesForInsert; + if (!TryPrepareRow(connection, table, row, out valuesForInsert)) + return null; + + var columns = valuesForInsert.Keys.Intersect(table.Columns).ToArray(); + + var insertCommantText = string.Format("{0} into {1}({2}) values({3});", + "insert ignore", + table.Name, + string.Join(",", columns.Select(c =>$"`{c}`")), + string.Join(",", columns.Select(c =>$"@{c}".Replace('-','_')))); + + var command = connection.CreateCommand(insertCommantText); + foreach (var parameter in valuesForInsert) + { + command.AddParameter(parameter.Key.Replace('-', '_'), parameter.Value); + } + return command; + } + + protected virtual bool TryPrepareRow(DbConnection connection, MailTableInfo table, DataRowInfo row, out Dictionary preparedRow) + { + preparedRow = new Dictionary(); + + foreach (var columnName in row.ColumnNames) + { + preparedRow.Add(columnName, row[columnName]); + } + + return true; + } + } + + internal class MailTableInfo + { + public string Name { get; private set; } + public string[] Columns { get; set; } + public string FindColumn { get; private set; } + public string FindColumnKey { get; private set; } + public bool existFindColumn { get; private set; } + + public MailTableInfo(string name) + { + Name = name; + existFindColumn = false; + } + + public MailTableInfo(string name, string findColumn, string findColumnKey = null) + { + Name = name; + FindColumn = findColumn; + FindColumnKey = findColumnKey ?? findColumn; + existFindColumn = true; + } + } +} diff --git a/common/ASC.Data.Backup/Tasks/RestoreMailTableTask.cs b/common/ASC.Data.Backup/Tasks/RestoreMailTableTask.cs new file mode 100644 index 000000000..4a095753c --- /dev/null +++ b/common/ASC.Data.Backup/Tasks/RestoreMailTableTask.cs @@ -0,0 +1,166 @@ +using System; +using System.Collections.Generic; +using System.Configuration; +using System.Data.Common; +using System.IO; +using System.Linq; + +using ASC.Common.Data; +using ASC.Common.Logging; +using ASC.Data.Backup.Exceptions; +using ASC.Data.Backup.Extensions; +using ASC.Data.Backup.Service; +using ASC.Data.Backup.Tasks.Data; +using ASC.Data.Backup.Tasks.Modules; +using ASC.Data.Storage.ZipOperators; + +namespace ASC.Data.Backup.Tasks +{ + internal class RestoreMailTableTask + { + private const int TransactionLength = 10000; + + private readonly ILog _logger; + private readonly IDataReadOperator _dataReader; + private readonly MailTableSpecifics _module; + private readonly DbFactory _factory; + + private readonly string[] tableCreateScripts = new string[] { "CREATE TABLE IF NOT EXISTS `dkim` (`id` int unsigned NOT NULL AUTO_INCREMENT, `domain_name` varchar(255) CHARACTER SET latin1 NOT NULL, `selector` varchar(63) NOT NULL, `private_key` text CHARACTER SET latin1, `public_key` text CHARACTER SET latin1, PRIMARY KEY (`id`), KEY `domain_name` (`domain_name`)) ENGINE=InnoDB AUTO_INCREMENT=169 DEFAULT CHARSET=utf8mb3;", + "CREATE TABLE `bayes_seen` ( `id` int NOT NULL DEFAULT '0', `msgid` varchar(200) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '', `flag` char(1) NOT NULL DEFAULT '', PRIMARY KEY (`id`,`msgid`)) ENGINE=MyISAM DEFAULT CHARSET=latin1;", + "CREATE TABLE `bayes_token` ( `id` int NOT NULL DEFAULT '0', `token` char(5) NOT NULL DEFAULT '', `spam_count` int NOT NULL DEFAULT '0', `ham_count` int NOT NULL DEFAULT '0', `atime` int NOT NULL DEFAULT '0', PRIMARY KEY (`id`,`token`), KEY `bayes_token_idx1` (`id`,`atime`)) ENGINE=MyISAM DEFAULT CHARSET=latin1;", + "CREATE TABLE `maddr` ( `partition_tag` int DEFAULT '0', `id` bigint unsigned NOT NULL AUTO_INCREMENT, `email` varbinary(255) NOT NULL, `domain` varchar(255) NOT NULL, PRIMARY KEY (`id`), UNIQUE KEY `part_email` (`partition_tag`,`email`), KEY `maddr_idx_email` (`email`), KEY `maddr_idx_domain` (`domain`)) ENGINE=InnoDB AUTO_INCREMENT=11498 DEFAULT CHARSET=utf8mb3;", + "CREATE TABLE `msgrcpt` ( `partition_tag` int NOT NULL DEFAULT '0', `mail_id` varbinary(16) NOT NULL, `rseqnum` int NOT NULL DEFAULT '0', `rid` bigint unsigned NOT NULL, `is_local` char(1) NOT NULL DEFAULT '', `content` char(1) NOT NULL DEFAULT '', `ds` char(1) NOT NULL, `rs` char(1) NOT NULL, `bl` char(1) DEFAULT '', `wl` char(1) DEFAULT '', `bspam_level` float DEFAULT NULL, `smtp_resp` varchar(255) DEFAULT '', PRIMARY KEY (`partition_tag`,`mail_id`,`rseqnum`), KEY `msgrcpt_idx_mail_id` (`mail_id`), KEY `msgrcpt_idx_rid` (`rid`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;", + "CREATE TABLE `msgs` ( `partition_tag` int NOT NULL DEFAULT '0', `mail_id` varbinary(16) NOT NULL, `secret_id` varbinary(16) DEFAULT '', `am_id` varchar(20) NOT NULL, `time_num` int unsigned NOT NULL, `time_iso` char(16) NOT NULL, `sid` bigint unsigned NOT NULL, `policy` varchar(255) DEFAULT '', `client_addr` varchar(255) DEFAULT '', `size` int unsigned NOT NULL, `originating` char(1) NOT NULL DEFAULT '', `content` char(1) DEFAULT NULL, `quar_type` char(1) DEFAULT NULL, `quar_loc` varbinary(255) DEFAULT '', `dsn_sent` char(1) DEFAULT NULL, `spam_level` float DEFAULT NULL, `message_id` varchar(255) DEFAULT '', `from_addr` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin DEFAULT '', `subject` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin DEFAULT '', `host` varchar(255) NOT NULL, PRIMARY KEY (`partition_tag`,`mail_id`), KEY `msgs_idx_sid` (`sid`), KEY `msgs_idx_mess_id` (`message_id`), KEY `msgs_idx_time_num` (`time_num`), KEY `msgs_idx_mail_id` (`mail_id`), KEY `msgs_idx_content` (`content`), KEY `msgs_idx_quar_type` (`quar_type`), KEY `msgs_idx_content_time_num` (`content`,`time_num`), KEY `msgs_idx_spam_level` (`spam_level`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;" + }; + + public RestoreMailTableTask(ILog logger, IDataReadOperator dataReader, string configPath, string dbconnection) + { + _logger = logger; + _dataReader = dataReader; + _module = new MailTableSpecifics(); + _factory = new DbFactory(configPath) { ConnectionStringSettings = new ConnectionStringSettings("mailTable", dbconnection, "MySql.Data.MySqlClient") }; + } + + internal void RunJob() + { + _logger.DebugFormat("begin restore data for mail table"); + + using (var connection = _factory.OpenConnection()) + { + RestoreMailServerTables(connection); + + foreach (var table in _module.Tables) + { + _logger.DebugFormat("begin restore table {0}", table.Name); + + var transactionsCommited = 0; + var rowsInserted = 0; + ActionInvoker.Try( + state => + RestoreTable(connection.Fix(), (MailTableInfo)state, ref transactionsCommited, + ref rowsInserted), table, 5, + onFailure: error => { throw ThrowHelper.CantRestoreTable(table.Name, error); }); + + _logger.DebugFormat("{0} rows inserted for table {1}", rowsInserted, table.Name); + } + } + + _logger.DebugFormat("end restore data for mail table"); + + RestoreMailServerFiles(); + } + + private void RestoreMailServerFiles() + { + try + { + var backupMailServerFilesService = new BackupMailServerFilesService(_logger); + backupMailServerFilesService.UploadMailDirectory(_dataReader); + } + catch (Exception ex) + { + _logger.DebugFormat($"RestoreMailServerFiles exception: {ex.Message}"); + } + } + + private void RestoreTable(DbConnection connection, MailTableInfo tableInfo, ref int transactionsCommited, ref int rowsInserted) + { + SetColumns(connection, tableInfo); + + using (var stream = _dataReader.GetEntry(KeyHelper.GetMailTableZipKey(tableInfo.Name))) + { + foreach ( + IEnumerable rows in + GetRows(stream) + .Skip(transactionsCommited * TransactionLength) + .MakeParts(TransactionLength)) + { + using (var transaction = connection.BeginTransaction()) + { + int rowsSuccess = 0; + foreach (DataRowInfo row in rows) + { + var insertCommand = _module.CreateInsertCommand(connection, tableInfo, + row); + if (insertCommand == null) + { + _logger.WarnFormat("Can't create command to insert row to {0} with values [{1}]", tableInfo, + row); + continue; + } + insertCommand.WithTimeout(120).ExecuteNonQuery(); + rowsSuccess++; + } + + transaction.Commit(); + transactionsCommited++; + rowsInserted += rowsSuccess; + } + } + } + } + + private void SetColumns(DbConnection connection, MailTableInfo table) + { + var showColumnsCommand = _factory.CreateShowColumnsCommand(table.Name); + showColumnsCommand.Connection = connection; + table.Columns = showColumnsCommand.ExecuteList().Select(x => Convert.ToString(x[0])).ToArray(); + } + + private IEnumerable GetRows(Stream xmlStream) + { + if (xmlStream == null) + return Enumerable.Empty(); + + var rows = DataRowInfoReader.ReadFromStream(xmlStream); + + return rows; + } + + private int RestoreMailServerTables(DbConnection connection) + { + int result = 0; + + using (var transaction = connection.BeginTransaction()) + { + foreach (var script in tableCreateScripts) + { + var insertCommand = connection.CreateCommand(script); + + try + { + result += insertCommand.ExecuteNonQuery(); + } + catch (Exception ex) + { + _logger.Error($"RestoreMailServerTables error: {ex.Message}"); + } + } + + transaction.Commit(); + } + + return result; + } + } +} diff --git a/common/ASC.Data.Backup/Tasks/RestorePortalTask.cs b/common/ASC.Data.Backup/Tasks/RestorePortalTask.cs index 74a4b4e26..e313876a4 100644 --- a/common/ASC.Data.Backup/Tasks/RestorePortalTask.cs +++ b/common/ASC.Data.Backup/Tasks/RestorePortalTask.cs @@ -73,7 +73,7 @@ public override void RunJob() { Logger.Debug("begin restore portal"); - Logger.Debug("begin restore data"); + Logger.Debug($"begin restore data from {BackupFilePath}"); using (var dataReader = new ZipReadOperator(BackupFilePath)) { @@ -82,13 +82,19 @@ public override void RunJob() Dump = entry != null && CoreContext.Configuration.Standalone; } + Logger.Debug($"restore data dbFactory: {ConfigPath}"); + var dbFactory = new DbFactory(ConfigPath); if (Dump) { + Logger.Debug("begin restore from dump."); + RestoreFromDump(dataReader); } else { + Logger.Debug("begin restore not from dump."); + var modulesToProcess = GetModulesToProcess().ToList(); SetStepsCount(ProcessStorage ? modulesToProcess.Count + 1 : modulesToProcess.Count); @@ -102,7 +108,25 @@ public override void RunJob() } restoreTask.RunJob(); } - var backupRepository = BackupStorageFactory.GetBackupRepository(); + RestoreMailTable(dataReader); + + try + { + using (var dbManager = new DbManager("default", 100000)) + { + //set new domain name in dns record + dbManager.ExecuteNonQuery("update mail_server_dns set mx=(select hostname from mail_mailbox_server where id_provider=-1 limit 1)"); + + dbManager.ExecuteNonQuery("update mail_mailbox set id_smtp_server = (select id from mail_mailbox_server where id_provider = -1 and type = 'smtp' limit 1), id_in_server = (select id from mail_mailbox_server where id_provider = -1 and type = 'imap' limit 1) where is_server_mailbox=1"); + } + + } + catch (Exception ex) + { + Logger.Error(ex); + } + + var backupRepository = BackupStorageFactory.GetBackupRepository(); backupRepository.MigrationBackupRecords(TenantId, _columnMapper.GetTenantMapping(), ConfigPath); } @@ -142,7 +166,44 @@ public override void RunJob() Logger.Debug("end restore portal"); } - private void RestoreFromDump(IDataReadOperator dataReader) + private void RestoreMailTable(IDataReadOperator dataReader) + { + if (!CoreContext.Configuration.Standalone || !dataReader.GetDirectories("").Any(r => r.EndsWith("mailtable"))) + { + Logger.Debug($"RestoreMailTable: Not Standalone, skip restore."); + + return; + } + + try + { + string dbconnection = null; + using (var dbManager = new DbManager("default", 100000)) + { + dbManager.ExecuteList("select connection_string from mail_server_server").ForEach(r => + { + dbconnection = JsonConvert.DeserializeObject>(Convert.ToString(r[0]))["DbConnection"].ToString(); + }); + } + Logger.Debug($"RestoreMailTable connection string: {dbconnection}"); + + if (string.IsNullOrEmpty(dbconnection)) dbconnection = "Server=onlyoffice-mysql-server;Database=onlyoffice_mailserver;User ID=root;Password=my-secret-pw;Pooling=True;Character Set=utf8;AutoEnlist=false;SSL Mode=None;Connection Timeout=30;Maximum Pool Size=300;"; + + Logger.Debug($"RestoreMailTable connection string: {dbconnection}"); + + if (dbconnection != null) + { + var restoreTask = new RestoreMailTableTask(Logger, dataReader, ConfigPath, dbconnection); + restoreTask.RunJob(); + } + } + catch (Exception ex) + { + Logger.Error($"RestoreMailTable error: {ex}"); + } + } + + private void RestoreFromDump(IDataReadOperator dataReader) { var keyBase = KeyHelper.GetDatabaseSchema(); var keys = dataReader.GetEntries(keyBase).Select(r => Path.GetFileName(r)).ToList(); diff --git a/common/ASC.Data.Storage/BaseStorage.cs b/common/ASC.Data.Storage/BaseStorage.cs index 119fb51b8..447253442 100644 --- a/common/ASC.Data.Storage/BaseStorage.cs +++ b/common/ASC.Data.Storage/BaseStorage.cs @@ -37,6 +37,7 @@ public abstract class BaseStorage : IDataStore internal string _modulename; internal bool _cache; + internal bool _attachment; internal DataList _dataList; internal string _tenant; internal Dictionary _domainsExpires = new Dictionary(); @@ -132,6 +133,11 @@ public virtual bool IsSupportInternalUri get { return true; } } + public virtual bool IsContentDispositionAsAttachment + { + get { return _attachment; } + } + public virtual Uri GetInternalUri(string domain, string path, TimeSpan expire, IEnumerable headers) { return null; @@ -221,6 +227,7 @@ public virtual IDataWriteOperator CreateDataWriteOperator( public abstract void DeleteFiles(string domain, string folderPath, DateTime fromDate, DateTime toDate); public abstract void MoveDirectory(string srcdomain, string srcdir, string newdomain, string newdir); public abstract Uri Move(string srcdomain, string srcpath, string newdomain, string newpath, bool quotaCheckFileSize = true); + public abstract Uri Move(string srcdomain, string srcpath, string newdomain, string newpath, Guid ownerId, bool quotaCheckFileSize = true); public abstract Uri SaveTemp(string domain, out string assignedPath, Stream stream); public abstract string[] ListDirectoriesRelative(string domain, string path, bool recursive); public abstract string[] ListFilesRelative(string domain, string path, string pattern, bool recursive); diff --git a/common/ASC.Data.Storage/ChunkedUploader/CommonChunkedUploadSessionHolder.cs b/common/ASC.Data.Storage/ChunkedUploader/CommonChunkedUploadSessionHolder.cs index 3e3895104..207d025b3 100644 --- a/common/ASC.Data.Storage/ChunkedUploader/CommonChunkedUploadSessionHolder.cs +++ b/common/ASC.Data.Storage/ChunkedUploader/CommonChunkedUploadSessionHolder.cs @@ -101,11 +101,15 @@ public virtual string Finalize(CommonChunkedUploadSession uploadSession) DataStore.FinalizeChunkedUpload(Domain, tempPath, uploadId, eTags); return Path.GetFileName(tempPath); - } + } - public void Move(CommonChunkedUploadSession chunkedUploadSession, string newPath, bool quotaCheckFileSize = true) + public void Move(CommonChunkedUploadSession chunkedUploadSession, string newPath, bool quotaCheckFileSize = true) + { + Move(chunkedUploadSession, newPath, Guid.Empty, quotaCheckFileSize); + } + public void Move(CommonChunkedUploadSession chunkedUploadSession, string newPath, Guid ownerId, bool quotaCheckFileSize = true) { - DataStore.Move(Domain, chunkedUploadSession.TempPath, string.Empty, newPath, quotaCheckFileSize); + DataStore.Move(Domain, chunkedUploadSession.TempPath, string.Empty, newPath, ownerId, quotaCheckFileSize); } public void Abort(CommonChunkedUploadSession uploadSession) diff --git a/common/ASC.Data.Storage/Configuration/ModuleConfigurationElement.cs b/common/ASC.Data.Storage/Configuration/ModuleConfigurationElement.cs index 73152c666..514d4f288 100644 --- a/common/ASC.Data.Storage/Configuration/ModuleConfigurationElement.cs +++ b/common/ASC.Data.Storage/Configuration/ModuleConfigurationElement.cs @@ -129,5 +129,12 @@ public bool Cache get { return (bool)this[Schema.CACHE]; } set { this[Schema.CACHE] = value; } } + + [ConfigurationProperty(Schema.ATTACHMENT)] + public bool Attachment + { + get { return (bool)this[Schema.ATTACHMENT]; } + set { this[Schema.ATTACHMENT] = value; } + } } } \ No newline at end of file diff --git a/common/ASC.Data.Storage/Configuration/Schema.cs b/common/ASC.Data.Storage/Configuration/Schema.cs index 393e0f608..7126cc6fe 100644 --- a/common/ASC.Data.Storage/Configuration/Schema.cs +++ b/common/ASC.Data.Storage/Configuration/Schema.cs @@ -48,5 +48,6 @@ static class Schema public const string DISABLEDMIGRATE = "disableMigrate"; public const string DISABLEDENCRYPTION = "disableEncryption"; public const string CACHE = "cache"; + public const string ATTACHMENT = "attachment"; } } \ No newline at end of file diff --git a/common/ASC.Data.Storage/DiscStorage/DiscDataStore.cs b/common/ASC.Data.Storage/DiscStorage/DiscDataStore.cs index 0b2550172..7f4383eeb 100644 --- a/common/ASC.Data.Storage/DiscStorage/DiscDataStore.cs +++ b/common/ASC.Data.Storage/DiscStorage/DiscDataStore.cs @@ -46,6 +46,7 @@ public DiscDataStore(string tenant, HandlerConfigurationElement handlerConfig, M _modulename = moduleConfig.Name; _cache = moduleConfig.Cache; _dataList = new DataList(moduleConfig); + _attachment = moduleConfig.Attachment; foreach (DomainConfigurationElement domain in moduleConfig.Domains) { _mappedPaths.Add(domain.Name, new MappedPath(tenant, moduleConfig.AppendTenant, domain.Path, handlerConfig.GetProperties())); @@ -380,6 +381,10 @@ public override void MoveDirectory(string srcdomain, string srcdir, string newdo } public override Uri Move(string srcdomain, string srcpath, string newdomain, string newpath, bool quotaCheckFileSize = true) + { + return Move(srcdomain, srcpath, newdomain, newpath, Guid.Empty, quotaCheckFileSize); + } + public override Uri Move(string srcdomain, string srcpath, string newdomain, string newpath, Guid ownerId, bool quotaCheckFileSize = true) { if (srcpath == null) throw new ArgumentNullException("srcpath"); if (newpath == null) throw new ArgumentNullException("srcpath"); @@ -403,7 +408,7 @@ public override Uri Move(string srcdomain, string srcpath, string newdomain, str File.Move(target, newtarget); QuotaUsedDelete(srcdomain, flength); - QuotaUsedAdd(newdomain, flength, quotaCheckFileSize); + QuotaUsedAdd(newdomain, flength, ownerId, quotaCheckFileSize); } else { diff --git a/common/ASC.Data.Storage/GoogleCloud/GoogleCloudStorage.cs b/common/ASC.Data.Storage/GoogleCloud/GoogleCloudStorage.cs index e9fd4a308..25226d496 100644 --- a/common/ASC.Data.Storage/GoogleCloud/GoogleCloudStorage.cs +++ b/common/ASC.Data.Storage/GoogleCloud/GoogleCloudStorage.cs @@ -63,10 +63,11 @@ public GoogleCloudStorage(string tenant) _modulename = string.Empty; _cache = false; _dataList = null; + _attachment = false; _domainsExpires = new Dictionary { { string.Empty, TimeSpan.Zero } }; _domainsAcl = new Dictionary(); - _moduleAcl = PredefinedObjectAcl.PublicRead; + _moduleAcl = PredefinedObjectAcl.BucketOwnerFullControl; } @@ -77,7 +78,7 @@ public GoogleCloudStorage(string tenant, HandlerConfigurationElement handlerConf _modulename = moduleConfig.Name; _cache = moduleConfig.Cache; _dataList = new DataList(moduleConfig); - + _attachment = moduleConfig.Attachment; _domainsExpires = moduleConfig.Domains.Cast().Where(x => x.Expires != TimeSpan.Zero). ToDictionary(x => x.Name, @@ -346,9 +347,9 @@ private PredefinedObjectAcl GetGoogleCloudAcl(ACL acl) switch (acl) { case ACL.Read: - return PredefinedObjectAcl.PublicRead; + return PredefinedObjectAcl.BucketOwnerFullControl; default: - return PredefinedObjectAcl.PublicRead; + return PredefinedObjectAcl.BucketOwnerFullControl; } } @@ -477,8 +478,11 @@ public override void MoveDirectory(string srcdomain, string srcdir, string newdo } } + public override Uri Move(string srcdomain, string srcpath, string newdomain, string newpath, bool quotaCheckFileSize = true) { + return Move(srcdomain, srcpath, newdomain, newpath, Guid.Empty, quotaCheckFileSize); + } - public override Uri Move(string srcdomain, string srcpath, string newdomain, string newpath, bool quotaCheckFileSize = true) + public override Uri Move(string srcdomain, string srcpath, string newdomain, string newpath, Guid ownerId, bool quotaCheckFileSize = true) { var storage = GetStorage(); @@ -494,7 +498,7 @@ public override Uri Move(string srcdomain, string srcpath, string newdomain, str Delete(srcdomain, srcpath); QuotaUsedDelete(srcdomain, size); - QuotaUsedAdd(newdomain, size, quotaCheckFileSize); + QuotaUsedAdd(newdomain, size, ownerId, quotaCheckFileSize); return GetUri(newdomain, newpath); diff --git a/common/ASC.Data.Storage/IDataStore.cs b/common/ASC.Data.Storage/IDataStore.cs index 79e1630b9..98de5cf49 100644 --- a/common/ASC.Data.Storage/IDataStore.cs +++ b/common/ASC.Data.Storage/IDataStore.cs @@ -177,6 +177,8 @@ IDataWriteOperator CreateDataWriteOperator( bool IsSupportedPreSignedUri { get; } + bool IsContentDispositionAsAttachment { get; } + /// /// Deletes file /// @@ -229,6 +231,18 @@ IDataWriteOperator CreateDataWriteOperator( /// Uri Move(string srcdomain, string srcpath, string newdomain, string newpath, bool quotaCheckFileSize = true); + /// + /// Moves file + /// + /// + /// + /// + /// + /// + /// + /// + Uri Move(string srcdomain, string srcpath, string newdomain, string newpath, Guid ownerId, bool quotaCheckFileSize = true); + /// /// Saves the file in the temp. In fact, almost no different from the usual Save except that generates the file name itself. An inconvenient thing. /// diff --git a/common/ASC.Data.Storage/RackspaceCloud/RackspaceCloudStorage.cs b/common/ASC.Data.Storage/RackspaceCloud/RackspaceCloudStorage.cs index 211335424..e8ab4f24f 100644 --- a/common/ASC.Data.Storage/RackspaceCloud/RackspaceCloudStorage.cs +++ b/common/ASC.Data.Storage/RackspaceCloud/RackspaceCloudStorage.cs @@ -57,7 +57,7 @@ public RackspaceCloudStorage(string tenant) _modulename = string.Empty; _cache = false; _dataList = null; - + _attachment = false; _domainsExpires = new Dictionary { { string.Empty, TimeSpan.Zero } }; _domainsAcl = new Dictionary(); _moduleAcl = ACL.Auto; @@ -70,7 +70,7 @@ public RackspaceCloudStorage(string tenant, HandlerConfigurationElement handlerC _modulename = moduleConfig.Name; _cache = moduleConfig.Cache; _dataList = new DataList(moduleConfig); - + _attachment = moduleConfig.Attachment; _domains.AddRange( moduleConfig.Domains.Cast().Select(x => string.Format("{0}/", x.Name))); @@ -498,6 +498,10 @@ public override void MoveDirectory(string srcdomain, string srcdir, string newdo } public override Uri Move(string srcdomain, string srcpath, string newdomain, string newpath, bool quotaCheckFileSize = true) + { + return Move(srcdomain, srcpath, newdomain, newpath, Guid.Empty, quotaCheckFileSize); + } + public override Uri Move(string srcdomain, string srcpath, string newdomain, string newpath, Guid ownerId, bool quotaCheckFileSize = true) { var srcKey = MakePath(srcdomain, srcpath); var dstKey = MakePath(newdomain, newpath); @@ -510,7 +514,7 @@ public override Uri Move(string srcdomain, string srcpath, string newdomain, str Delete(srcdomain, srcpath); QuotaUsedDelete(srcdomain, size); - QuotaUsedAdd(newdomain, size, quotaCheckFileSize); + QuotaUsedAdd(newdomain, size, ownerId, quotaCheckFileSize); return GetUri(newdomain, newpath); } diff --git a/common/ASC.Data.Storage/S3/S3Storage.cs b/common/ASC.Data.Storage/S3/S3Storage.cs index a7cc0fd11..fb01786c9 100644 --- a/common/ASC.Data.Storage/S3/S3Storage.cs +++ b/common/ASC.Data.Storage/S3/S3Storage.cs @@ -77,7 +77,7 @@ public S3Storage(string tenant) _modulename = string.Empty; _cache = false; _dataList = null; - + _attachment = false; //Make expires _domainsExpires = new Dictionary { { string.Empty, TimeSpan.Zero } }; @@ -91,6 +91,7 @@ public S3Storage(string tenant, HandlerConfigurationElement handlerConfig, Modul _modulename = moduleConfig.Name; _cache = moduleConfig.Cache; _dataList = new DataList(moduleConfig); + _attachment = moduleConfig.Attachment; _domains.AddRange( moduleConfig.Domains.Cast().Select(x => string.Format("{0}/", x.Name))); @@ -717,6 +718,10 @@ public override void MoveDirectory(string srcdomain, string srcdir, string newdo } public override Uri Move(string srcdomain, string srcpath, string newdomain, string newpath, bool quotaCheckFileSize = true) + { + return Move(srcdomain, srcpath, newdomain, newpath, Guid.Empty, quotaCheckFileSize); + } + public override Uri Move(string srcdomain, string srcpath, string newdomain, string newpath, Guid ownerId, bool quotaCheckFileSize = true) { var srcKey = MakePath(srcdomain, srcpath); var dstKey = MakePath(newdomain, newpath); @@ -726,7 +731,7 @@ public override Uri Move(string srcdomain, string srcpath, string newdomain, str Delete(srcdomain, srcpath); QuotaUsedDelete(srcdomain, size); - QuotaUsedAdd(newdomain, size, quotaCheckFileSize); + QuotaUsedAdd(newdomain, size, ownerId, quotaCheckFileSize); return GetUri(newdomain, newpath); } @@ -1278,7 +1283,7 @@ private void CopyFile(string sourceKey, string destinationKey, string newdomain, var metadataResponse = client.GetObjectMetadata(metadataRequest); var objectSize = metadataResponse.ContentLength; - if (objectSize >= 100 * 1024 * 1024L) //100 megabytes + if (objectSize >= 1000 * 1024 * 1024L) //1000 megabytes { var copyResponses = new List(); @@ -1306,7 +1311,7 @@ private void CopyFile(string sourceKey, string destinationKey, string newdomain, var uploadId = initResponse.UploadId; - var partSize = GetChunkSize(); + var partSize = 500 * 1024 * 1024L; //500 megabytes long bytePosition = 0; for (int i = 1; bytePosition < objectSize; i++) @@ -1565,18 +1570,6 @@ protected override DateTime GetLastModificationDate(string domain, string path) throw new FileNotFoundException("file not found", path); } - private long GetChunkSize() - { - var configSetting = ConfigurationManagerExtension.AppSettings["files.uploader.chunk-size"]; - if (!string.IsNullOrEmpty(configSetting)) - { - configSetting = configSetting.Trim(); - return long.Parse(configSetting); - } - long defaultValue = 10 * 1024 * 1024; - return defaultValue; - } - private enum EncryptionMethod { None, diff --git a/common/ASC.Data.Storage/Selectel/SelectelStorage.cs b/common/ASC.Data.Storage/Selectel/SelectelStorage.cs index d0a1dbdf9..fd7a2d63e 100644 --- a/common/ASC.Data.Storage/Selectel/SelectelStorage.cs +++ b/common/ASC.Data.Storage/Selectel/SelectelStorage.cs @@ -57,7 +57,7 @@ public SelectelStorage(String tenant) _modulename = string.Empty; _cache = false; _dataList = null; - + _attachment = false; _domainsExpires = new Dictionary { { string.Empty, TimeSpan.Zero } }; _domainsAcl = new Dictionary(); _moduleAcl = ACL.Auto; @@ -70,7 +70,7 @@ public SelectelStorage(String tenant, HandlerConfigurationElement handlerConfig, _modulename = moduleConfig.Name; _cache = moduleConfig.Cache; _dataList = new DataList(moduleConfig); - + _attachment = moduleConfig.Attachment; _domainsExpires = moduleConfig.Domains.Cast() .Where(x => x.Expires != TimeSpan.Zero) .ToDictionary(x => x.Name, y => y.Expires); @@ -471,6 +471,10 @@ public override void MoveDirectory(string srcdomain, string srcdir, string newdo } public override Uri Move(string srcdomain, string srcpath, string newdomain, string newpath, bool quotaCheckFileSize = true) + { + return Move(srcdomain, srcpath, newdomain, newpath, Guid.Empty, quotaCheckFileSize); + } + public override Uri Move(string srcdomain, string srcpath, string newdomain, string newpath, Guid ownerId, bool quotaCheckFileSize = true) { var srcKey = MakePath(srcdomain, srcpath); var dstKey = MakePath(newdomain, newpath); @@ -481,7 +485,7 @@ public override Uri Move(string srcdomain, string srcpath, string newdomain, str Delete(srcdomain, srcpath); QuotaUsedDelete(srcdomain, size); - QuotaUsedAdd(newdomain, size, quotaCheckFileSize); + QuotaUsedAdd(newdomain, size, ownerId, quotaCheckFileSize); return GetUri(newdomain, newpath); } diff --git a/common/ASC.Data.Storage/StorageHandler.cs b/common/ASC.Data.Storage/StorageHandler.cs index f5a861465..52095646a 100644 --- a/common/ASC.Data.Storage/StorageHandler.cs +++ b/common/ASC.Data.Storage/StorageHandler.cs @@ -91,7 +91,7 @@ public void ProcessRequest(HttpContext context) { var path = _path; var header = context.Request[Constants.QUERY_HEADER] ?? ""; - var headers = header.Length > 0 ? header.Split('&').Select(HttpUtility.UrlDecode) : new string[] { }; + var headers = header.Length > 0 ? header.Split('&').Select(HttpUtility.UrlDecode).ToList() : new List(); if (_checkAuth && !SecurityContext.IsAuthenticated) { @@ -127,6 +127,14 @@ public void ProcessRequest(HttpContext context) return; } + if (storage.IsContentDispositionAsAttachment) + { + if (!headers.Any(h => h.StartsWith("Content-Disposition"))) + { + headers.Add("Content-Disposition:attachment"); + } + } + const int bigSize = 5 * 1024 * 1024; var fileSize = storage.GetFileSize(_domain, path); diff --git a/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.Designer.cs b/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.Designer.cs index ad710597b..905823c0a 100644 --- a/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.Designer.cs +++ b/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.Designer.cs @@ -85,11 +85,9 @@ public static string FooterOpensourceV121 { } /// - /// Looks up a localized string similar to <body style="margin: 0; padding: 0; text-align: center; width: 100%; font-family: Arial, sans-serif; font-size: 14px; color: #333;"> + /// Looks up a localized string similar to <body style="background: linear-gradient(#ffffff, #ffffff); background-color: #ffffff; margin: 0; padding: 0; text-align: center; width: 100%; font-family: Arial, sans-serif; font-size: 14px; color: #333;"> ///<div style="background-color: #fff; width: 600px; margin: 0 auto; text-align: left;"> - /// <table cellspacing="0" cellpadding="0" style="font-family: Arial; font-size: 14px; color: #333; background: #fff; text-align: center; width: 600px; margin: 0; padding: 0; border: 0 none; border-collapse: collapse; empty-cells: show; border-spacing: 0;"> - /// <tbody> - /// <tr border="0 [rest of string was truncated]";. + /// <table cellspacing="0" cellpadding="0" style="font-family: Arial; font-size: 14px; color: #333; background: #fff; text-align: center; width: 600px; margin: 0; padding: 0; border: 0 none; border-collapse: collapse; e [rest of string was truncated]";. /// public static string HtmlMaster { get { diff --git a/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.az-Latn-AZ.resx b/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.az-Latn-AZ.resx index 203c82d30..d899a53b0 100644 --- a/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.az-Latn-AZ.resx +++ b/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.az-Latn-AZ.resx @@ -59,7 +59,7 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=5.0.6.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - <body style="margin: 0; padding: 0; text-align: center; width: 100%; font-family: Arial, sans-serif; font-size: 14px; color: #333;"> + <body style="background: linear-gradient(#ffffff, #ffffff); background-color: #ffffff; margin: 0; padding: 0; text-align: center; width: 100%; font-family: Arial, sans-serif; font-size: 14px; color: #333;"> <div style="background-color: #fff; width: 600px; margin: 0 auto; text-align: left;"> <table cellspacing="0" cellpadding="0" style="font-family: Arial; font-size: 14px; color: #333; background: #fff; text-align: center; width: 600px; margin: 0; padding: 0; border: 0 none; border-collapse: collapse; empty-cells: show; border-spacing: 0;"> <tbody> diff --git a/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.bg.resx b/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.bg.resx index c8ecf4c42..a3dee74b6 100644 --- a/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.bg.resx +++ b/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.bg.resx @@ -59,7 +59,7 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=5.0.6.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - <body style="margin: 0; padding: 0; text-align: center; width: 100%; font-family: Arial, sans-serif; font-size: 14px; color: #333;"> + <body style="background: linear-gradient(#ffffff, #ffffff); background-color: #ffffff; margin: 0; padding: 0; text-align: center; width: 100%; font-family: Arial, sans-serif; font-size: 14px; color: #333;"> <div style="background-color: #fff; width: 600px; margin: 0 auto; text-align: left;"> <table cellspacing="0" cellpadding="0" style="font-family: Arial; font-size: 14px; color: #333; background: #fff; text-align: center; width: 600px; margin: 0; padding: 0; border: 0 none; border-collapse: collapse; empty-cells: show; border-spacing: 0;"> <tbody> diff --git a/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.cs.resx b/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.cs.resx index 6d66db2b1..b8f93b967 100644 --- a/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.cs.resx +++ b/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.cs.resx @@ -59,7 +59,7 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=5.0.6.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - <body style="margin: 0; padding: 0; text-align: center; width: 100%; font-family: Arial, sans-serif; font-size: 14px; color: #333;"> + <body style="background: linear-gradient(#ffffff, #ffffff); background-color: #ffffff; margin: 0; padding: 0; text-align: center; width: 100%; font-family: Arial, sans-serif; font-size: 14px; color: #333;"> <div style="background-color: #fff; width: 600px; margin: 0 auto; text-align: left;"> <table cellspacing="0" cellpadding="0" style="font-family: Arial; font-size: 14px; color: #333; background: #fff; text-align: center; width: 600px; margin: 0; padding: 0; border: 0 none; border-collapse: collapse; empty-cells: show; border-spacing: 0;"> <tbody> diff --git a/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.de.resx b/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.de.resx index 72a61ddbe..657b2a438 100644 --- a/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.de.resx +++ b/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.de.resx @@ -59,7 +59,7 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=5.0.6.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - <body style="margin: 0; padding: 0; text-align: center; width: 100%; font-family: Arial, sans-serif; font-size: 14px; color: #333;"> + <body style="background: linear-gradient(#ffffff, #ffffff); background-color: #ffffff; margin: 0; padding: 0; text-align: center; width: 100%; font-family: Arial, sans-serif; font-size: 14px; color: #333;"> <div style="background-color: #fff; width: 600px; margin: 0 auto; text-align: left;"> <table cellspacing="0" cellpadding="0" style="font-family: Arial; font-size: 14px; color: #333; background: #fff; text-align: center; width: 600px; margin: 0; padding: 0; border: 0 none; border-collapse: collapse; empty-cells: show; border-spacing: 0;"> <tbody> diff --git a/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.es.resx b/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.es.resx index 25281d0c5..946fd6cf0 100644 --- a/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.es.resx +++ b/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.es.resx @@ -59,7 +59,7 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=5.0.6.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - <body style="margin: 0; padding: 0; text-align: center; width: 100%; font-family: Arial, sans-serif; font-size: 14px; color: #333;"> + <body style="background: linear-gradient(#ffffff, #ffffff); background-color: #ffffff; margin: 0; padding: 0; text-align: center; width: 100%; font-family: Arial, sans-serif; font-size: 14px; color: #333;"> <div style="background-color: #fff; width: 600px; margin: 0 auto; text-align: left;"> <table cellspacing="0" cellpadding="0" style="font-family: Arial; font-size: 14px; color: #333; background: #fff; text-align: center; width: 600px; margin: 0; padding: 0; border: 0 none; border-collapse: collapse; empty-cells: show; border-spacing: 0;"> <tbody> diff --git a/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.fr.resx b/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.fr.resx index 8e39ee997..d3d0a7d58 100644 --- a/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.fr.resx +++ b/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.fr.resx @@ -59,7 +59,7 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=5.0.6.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - <body style="margin: 0; padding: 0; text-align: center; width: 100%; font-family: Arial, sans-serif; font-size: 14px; color: #333;"> + <body style="background: linear-gradient(#ffffff, #ffffff); background-color: #ffffff; margin: 0; padding: 0; text-align: center; width: 100%; font-family: Arial, sans-serif; font-size: 14px; color: #333;"> <div style="background-color: #fff; width: 600px; margin: 0 auto; text-align: left;"> <table cellspacing="0" cellpadding="0" style="font-family: Arial; font-size: 14px; color: #333; background: #fff; text-align: center; width: 600px; margin: 0; padding: 0; border: 0 none; border-collapse: collapse; empty-cells: show; border-spacing: 0;"> <tbody> diff --git a/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.it.resx b/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.it.resx index 0391694f2..b7da305b6 100644 --- a/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.it.resx +++ b/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.it.resx @@ -59,7 +59,7 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=5.0.6.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - <body style="margin: 0; padding: 0; text-align: center; width: 100%; font-family: Arial, sans-serif; font-size: 14px; color: #333;"> + <body style="background: linear-gradient(#ffffff, #ffffff); background-color: #ffffff; margin: 0; padding: 0; text-align: center; width: 100%; font-family: Arial, sans-serif; font-size: 14px; color: #333;"> <div style="background-color: #fff; width: 600px; margin: 0 auto; text-align: left;"> <table cellspacing="0" cellpadding="0" style="font-family: Arial; font-size: 14px; color: #333; background: #fff; text-align: center; width: 600px; margin: 0; padding: 0; border: 0 none; border-collapse: collapse; empty-cells: show; border-spacing: 0;"> <tbody> diff --git a/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.lv.resx b/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.lv.resx index 780bbe716..f13937166 100644 --- a/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.lv.resx +++ b/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.lv.resx @@ -59,7 +59,7 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=5.0.6.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - <body style="margin: 0; padding: 0; text-align: center; width: 100%; font-family: Arial, sans-serif; font-size: 14px; color: #333;"> + <body style="background: linear-gradient(#ffffff, #ffffff); background-color: #ffffff; margin: 0; padding: 0; text-align: center; width: 100%; font-family: Arial, sans-serif; font-size: 14px; color: #333;"> <div style="background-color: #fff; width: 600px; margin: 0 auto; text-align: left;"> <table cellspacing="0" cellpadding="0" style="font-family: Arial; font-size: 14px; color: #333; background: #fff; text-align: center; width: 600px; margin: 0; padding: 0; border: 0 none; border-collapse: collapse; empty-cells: show; border-spacing: 0;"> <tbody> diff --git a/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.nl.resx b/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.nl.resx index 5cdbffba9..373e8ba44 100644 --- a/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.nl.resx +++ b/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.nl.resx @@ -59,7 +59,7 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=5.0.6.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - <body style="margin: 0; padding: 0; text-align: center; width: 100%; font-family: Arial, sans-serif; font-size: 14px; color: #333;"> + <body style="background: linear-gradient(#ffffff, #ffffff); background-color: #ffffff; margin: 0; padding: 0; text-align: center; width: 100%; font-family: Arial, sans-serif; font-size: 14px; color: #333;"> <div style="background-color: #fff; width: 600px; margin: 0 auto; text-align: left;"> <table cellspacing="0" cellpadding="0" style="font-family: Arial; font-size: 14px; color: #333; background: #fff; text-align: center; width: 600px; margin: 0; padding: 0; border: 0 none; border-collapse: collapse; empty-cells: show; border-spacing: 0;"> <tbody> diff --git a/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.pl.resx b/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.pl.resx index 6cdefff96..5034ab7e7 100644 --- a/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.pl.resx +++ b/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.pl.resx @@ -59,7 +59,7 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=5.0.6.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - <body style="margin: 0; padding: 0; text-align: center; width: 100%; font-family: Arial, sans-serif; font-size: 14px; color: #333;"> + <body style="background: linear-gradient(#ffffff, #ffffff); background-color: #ffffff; margin: 0; padding: 0; text-align: center; width: 100%; font-family: Arial, sans-serif; font-size: 14px; color: #333;"> <div style="background-color: #fff; width: 600px; margin: 0 auto; text-align: left;"> <table cellspacing="0" cellpadding="0" style="font-family: Arial; font-size: 14px; color: #333; background: #fff; text-align: center; width: 600px; margin: 0; padding: 0; border: 0 none; border-collapse: collapse; empty-cells: show; border-spacing: 0;"> <tbody> diff --git a/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.pt-BR.resx b/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.pt-BR.resx index 8e1959f5a..95dddb8ba 100644 --- a/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.pt-BR.resx +++ b/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.pt-BR.resx @@ -59,7 +59,7 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=5.0.6.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - <body style="margin: 0; padding: 0; text-align: center; width: 100%; font-family: Arial, sans-serif; font-size: 14px; color: #333;"> + <body style="background: linear-gradient(#ffffff, #ffffff); background-color: #ffffff; margin: 0; padding: 0; text-align: center; width: 100%; font-family: Arial, sans-serif; font-size: 14px; color: #333;"> <div style="background-color: #fff; width: 600px; margin: 0 auto; text-align: left;"> <table cellspacing="0" cellpadding="0" style="font-family: Arial; font-size: 14px; color: #333; background: #fff; text-align: center; width: 600px; margin: 0; padding: 0; border: 0 none; border-collapse: collapse; empty-cells: show; border-spacing: 0;"> <tbody> diff --git a/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.resx b/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.resx index a3a8e9c77..e1c647704 100644 --- a/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.resx +++ b/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.resx @@ -119,7 +119,7 @@ </tr> - <body style="margin: 0; padding: 0; text-align: center; width: 100%; font-family: Arial, sans-serif; font-size: 14px; color: #333;"> + <body style="background: linear-gradient(#ffffff, #ffffff); background-color: #ffffff; margin: 0; padding: 0; text-align: center; width: 100%; font-family: Arial, sans-serif; font-size: 14px; color: #333;"> <div style="background-color: #fff; width: 600px; margin: 0 auto; text-align: left;"> <table cellspacing="0" cellpadding="0" style="font-family: Arial; font-size: 14px; color: #333; background: #fff; text-align: center; width: 600px; margin: 0; padding: 0; border: 0 none; border-collapse: collapse; empty-cells: show; border-spacing: 0;"> <tbody> diff --git a/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.ru.resx b/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.ru.resx index b867f6563..81df49c53 100644 --- a/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.ru.resx +++ b/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.ru.resx @@ -59,7 +59,7 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=5.0.6.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - <body style="margin: 0; padding: 0; text-align: center; width: 100%; font-family: Arial, sans-serif; font-size: 14px; color: #333;"> + <body style="background: linear-gradient(#ffffff, #ffffff); background-color: #ffffff; margin: 0; padding: 0; text-align: center; width: 100%; font-family: Arial, sans-serif; font-size: 14px; color: #333;"> <div style="background-color: #fff; width: 600px; margin: 0 auto; text-align: left;"> <table cellspacing="0" cellpadding="0" style="font-family: Arial; font-size: 14px; color: #333; background: #fff; text-align: center; width: 600px; margin: 0; padding: 0; border: 0 none; border-collapse: collapse; empty-cells: show; border-spacing: 0;"> <tbody> diff --git a/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.sk.resx b/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.sk.resx index 8f7353258..1b6219f2a 100644 --- a/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.sk.resx +++ b/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.sk.resx @@ -59,7 +59,7 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=5.0.6.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - <body style="margin: 0; padding: 0; text-align: center; width: 100%; font-family: Arial, sans-serif; font-size: 14px; color: #333;"> + <body style="background: linear-gradient(#ffffff, #ffffff); background-color: #ffffff; margin: 0; padding: 0; text-align: center; width: 100%; font-family: Arial, sans-serif; font-size: 14px; color: #333;"> <div style="background-color: #fff; width: 600px; margin: 0 auto; text-align: left;"> <table cellspacing="0" cellpadding="0" style="font-family: Arial; font-size: 14px; color: #333; background: #fff; text-align: center; width: 600px; margin: 0; padding: 0; border: 0 none; border-collapse: collapse; empty-cells: show; border-spacing: 0;"> <tbody> diff --git a/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.tr.resx b/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.tr.resx index 208c94a0a..faee19648 100644 --- a/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.tr.resx +++ b/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.tr.resx @@ -59,7 +59,7 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=5.0.6.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - <body style="margin: 0; padding: 0; text-align: center; width: 100%; font-family: Arial, sans-serif; font-size: 14px; color: #333;"> + <body style="background: linear-gradient(#ffffff, #ffffff); background-color: #ffffff; margin: 0; padding: 0; text-align: center; width: 100%; font-family: Arial, sans-serif; font-size: 14px; color: #333;"> <div style="background-color: #fff; width: 600px; margin: 0 auto; text-align: left;"> <table cellspacing="0" cellpadding="0" style="font-family: Arial; font-size: 14px; color: #333; background: #fff; text-align: center; width: 600px; margin: 0; padding: 0; border: 0 none; border-collapse: collapse; empty-cells: show; border-spacing: 0;"> <tbody> diff --git a/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.uk.resx b/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.uk.resx index aec4ce981..d626ea72c 100644 --- a/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.uk.resx +++ b/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.uk.resx @@ -59,7 +59,7 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=5.0.6.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - <body style="margin: 0; padding: 0; text-align: center; width: 100%; font-family: Arial, sans-serif; font-size: 14px; color: #333;"> + <body style="background: linear-gradient(#ffffff, #ffffff); background-color: #ffffff; margin: 0; padding: 0; text-align: center; width: 100%; font-family: Arial, sans-serif; font-size: 14px; color: #333;"> <div style="background-color: #fff; width: 600px; margin: 0 auto; text-align: left;"> <table cellspacing="0" cellpadding="0" style="font-family: Arial; font-size: 14px; color: #333; background: #fff; text-align: center; width: 600px; margin: 0; padding: 0; border: 0 none; border-collapse: collapse; empty-cells: show; border-spacing: 0;"> <tbody> diff --git a/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.vi.resx b/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.vi.resx index 52159d7c3..bafa530cc 100644 --- a/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.vi.resx +++ b/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.vi.resx @@ -59,7 +59,7 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=5.0.6.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - <body style="margin: 0; padding: 0; text-align: center; width: 100%; font-family: Arial, sans-serif; font-size: 14px; color: #333;"> + <body style="background: linear-gradient(#ffffff, #ffffff); background-color: #ffffff; margin: 0; padding: 0; text-align: center; width: 100%; font-family: Arial, sans-serif; font-size: 14px; color: #333;"> <div style="background-color: #fff; width: 600px; margin: 0 auto; text-align: left;"> <table cellspacing="0" cellpadding="0" style="font-family: Arial; font-size: 14px; color: #333; background: #fff; text-align: center; width: 600px; margin: 0; padding: 0; border: 0 none; border-collapse: collapse; empty-cells: show; border-spacing: 0;"> <tbody> diff --git a/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.zh-CN.resx b/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.zh-CN.resx index fc24e84d3..e1b38827b 100644 --- a/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.zh-CN.resx +++ b/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.zh-CN.resx @@ -59,7 +59,7 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=5.0.6.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - <body style="margin: 0; padding: 0; text-align: center; width: 100%; font-family: Arial, sans-serif; font-size: 14px; color: #333;"> + <body style="background: linear-gradient(#ffffff, #ffffff); background-color: #ffffff; margin: 0; padding: 0; text-align: center; width: 100%; font-family: Arial, sans-serif; font-size: 14px; color: #333;"> <div style="background-color: #fff; width: 600px; margin: 0 auto; text-align: left;"> <table cellspacing="0" cellpadding="0" style="font-family: Arial; font-size: 14px; color: #333; background: #fff; text-align: center; width: 600px; margin: 0; padding: 0; border: 0 none; border-collapse: collapse; empty-cells: show; border-spacing: 0;"> <tbody> diff --git a/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.zh-TW.resx b/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.zh-TW.resx index 0cf2d66ca..d34b93a1f 100644 --- a/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.zh-TW.resx +++ b/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.zh-TW.resx @@ -59,7 +59,7 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=5.0.6.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - <body style="margin: 0; padding: 0; text-align: center; width: 100%; font-family: Arial, sans-serif; font-size: 14px; color: #333;"> + <body style="background: linear-gradient(#ffffff, #ffffff); background-color: #ffffff; margin: 0; padding: 0; text-align: center; width: 100%; font-family: Arial, sans-serif; font-size: 14px; color: #333;"> <div style="background-color: #fff; width: 600px; margin: 0 auto; text-align: left;"> <table cellspacing="0" cellpadding="0" style="font-family: Arial; font-size: 14px; color: #333; background: #fff; text-align: center; width: 600px; margin: 0; padding: 0; border: 0 none; border-collapse: collapse; empty-cells: show; border-spacing: 0;"> <tbody> diff --git a/module/ASC.Api/ASC.Api.CRM/ASC.Api.CRM.csproj b/module/ASC.Api/ASC.Api.CRM/ASC.Api.CRM.csproj index 48adebcf1..0a946a756 100644 --- a/module/ASC.Api/ASC.Api.CRM/ASC.Api.CRM.csproj +++ b/module/ASC.Api/ASC.Api.CRM/ASC.Api.CRM.csproj @@ -150,10 +150,6 @@ {481B0D9C-B2F8-4DE9-8597-BA8D24585099} ASC.FederatedLogin - - {592eac85-6cfc-4ad7-b653-3eadaa18327e} - ASC.Thrdparty - {988536c1-4b89-4649-8f77-5c16f55d95d1} ASC.VoipService diff --git a/module/ASC.Api/ASC.Api.CRM/CRMApi.Contacts.cs b/module/ASC.Api/ASC.Api.CRM/CRMApi.Contacts.cs index 11a2cd22b..91bd13d04 100644 --- a/module/ASC.Api/ASC.Api.CRM/CRMApi.Contacts.cs +++ b/module/ASC.Api/ASC.Api.CRM/CRMApi.Contacts.cs @@ -32,13 +32,9 @@ using ASC.MessagingSystem; using ASC.Projects.Engine; using ASC.Specific; -using ASC.Thrdparty; -using ASC.Thrdparty.Twitter; using ASC.Web.CRM.Classes; -using ASC.Web.CRM.Classes.SocialMedia; using ASC.Web.CRM.Core.Enums; using ASC.Web.CRM.Resources; -using ASC.Web.CRM.SocialMedia; using ASC.Web.Projects.Core; using ASC.Web.Studio.Core; @@ -272,6 +268,7 @@ public OpportunityWrapper DeleteDealFromContact(int contactid, int opportunityid var opportunity = DaoFactory.DealDao.GetByID(opportunityid); if (opportunity == null || !CRMSecurity.CanAccessTo(opportunity)) throw new ItemNotFoundException(); + if(opportunity.ContactID == contactid) throw new SecurityException("Can't unlink base contact"); DaoFactory.DealDao.RemoveMember(opportunityid, contactid); @@ -1694,106 +1691,6 @@ public IEnumerable GetContactsByContactInfo(ContactInfoType? inf return result; } - /// - /// Returns a certain number of tweets created by a user with the ID specified in the request. - /// - /// Contact ID - /// Number of tweets - /// Get user tweets - /// Contacts - /// List of tweets - /// api/2.0/crm/contact/{contactid}/tweets - /// GET - /// list - [Read(@"contact/{contactid:[0-9]+}/tweets")] - public List GetUserTweets(int contactid, int count) - { - var MessageCount = 10; - var twitterAccounts = DaoFactory.ContactInfoDao.GetList(contactid, ContactInfoType.Twitter, null, null); - - if (twitterAccounts.Count == 0) - throw new ResourceNotFoundException( - Newtonsoft.Json.JsonConvert.SerializeObject( - new - { - message = "", - description = CRMSocialMediaResource.SocialMediaAccountNotFoundTwitter - } - )); - - var apiInfo = TwitterApiHelper.GetTwitterApiInfoForCurrentUser(); - TwitterDataProvider twitterProvider = new TwitterDataProvider(apiInfo); - - List messages = new List(); - - foreach (var twitterAccount in twitterAccounts) - { - try - { - messages.AddRange(twitterProvider.GetUserTweets(twitterAccount.Data, MessageCount)); - } - catch (ResourceNotFoundException ex) - { - throw new ResourceNotFoundException( - Newtonsoft.Json.JsonConvert.SerializeObject( - new - { - message = ex.Message, - description = String.Format("{0}: {1}", CRMSocialMediaResource.ErrorUnknownTwitterAccount, twitterAccount.Data) - } - )); - } - catch (Exception ex) - { - throw new Exception( - Newtonsoft.Json.JsonConvert.SerializeObject( - new - { - message = ex.Message, - description = String.Format("{0}: {1}", CRMSocialMediaResource.ErrorUnknownTwitterAccount, twitterAccount.Data) - } - )); - } - } - - - return messages.OrderByDescending(m => m.PostedOn).Take(MessageCount).ToList(); - - } - - - /// - /// Returns a list of twitter profiles by the search text specified in the request. - /// - /// Search text - /// Get twitter profiles - /// Contacts - /// List of twitter profiles - /// api/2.0/crm/contact/twitterprofile - /// GET - /// list - [Read(@"contact/twitterprofile")] - public List FindTwitterProfiles(string searchText) - { - try - { - TwitterApiInfo apiInfo = TwitterApiHelper.GetTwitterApiInfoForCurrentUser(); - if (apiInfo == null) - throw new SocialMediaAccountNotFound(CRMSocialMediaResource.SocialMediaAccountNotFoundTwitter); - - TwitterDataProvider provider = new TwitterDataProvider(apiInfo); - List users = provider.FindUsers(searchText); - /*List users = new List(); - users.Add(new TwitterUserInfo { Description = "I'm a cool user", SmallImageUrl = "http://localhost/TeamLab/products/crm/data/0/photos/00/00/10/contact_10_50_50.jpg", UserName = "User", ScreenName = "user", UserID = 1 }); - users.Add(new TwitterUserInfo { Description = "I'm a cool user", SmallImageUrl = "http://localhost/TeamLab/products/crm/data/0/photos/00/00/10/contact_10_50_50.jpg", UserName = "User", ScreenName = "user", UserID = 1 }); - users.Add(new TwitterUserInfo { Description = "I'm a cool user", SmallImageUrl = "http://localhost/TeamLab/products/crm/data/0/photos/00/00/10/contact_10_50_50.jpg", UserName = "User", ScreenName = "user", UserID = 1 });*/ - return users; - } - catch (Exception ex) - { - throw new SocialMediaUI(DaoFactory).ProcessError(ex, "ASC.Api.CRM.CRMApi.FindTwitterProfiles"); - } - } /// /// Deletes an avatar of the contact with the ID specified in the request. @@ -1833,85 +1730,6 @@ public string DeleteContactAvatar(int contactId, string contactType, bool upload return ""; } - /// - /// Returns a list of the social media images for the contact with the ID specified in the request. - /// - /// Contact ID - /// Get contact social media images by contact ID - /// Contacts - /// List of social media images - /// api/2.0/crm/contact/{contactid}/socialmediaavatar - /// GET - /// list - [Read(@"contact/{contactid:[0-9]+}/socialmediaavatar")] - public List GetContactSMImages(int contactId) - { - return new SocialMediaUI(DaoFactory).GetContactSMImages(contactId); - } - - /// - /// Returns a list of the contact social media images from the social networks specified in the request. - /// - /// List of contact social networks - /// Get contact social media images by networks - /// Contacts - /// List of social media images - /// api/2.0/crm/contact/socialmediaavatar - /// POST - /// list - [Create(@"contact/socialmediaavatar")] - public List GetContactSMImagesByNetworks(List socialNetworks) - { - if (socialNetworks == null || socialNetworks.Count == 0) - { - return new List(); - } - var twitter = new List(); - - foreach (var sn in socialNetworks) - { - if (sn.InfoType == ContactInfoType.Twitter) twitter.Add(sn.Data); - } - - return new SocialMediaUI(DaoFactory).GetContactSMImages(twitter); - } - - /// - /// Uploads an avatar of the contact with the ID specified in the request from the social network. - /// - /// Contact ID - /// Contact social network - /// User identity - /// Defines whether to upload an avatar only or also save it to a folder - /// Temporary directory name - /// Upload an avatar from social network - /// Contacts - /// Avatar - /// api/2.0/crm/contact/{contactid}/avatar - /// PUT - [Update(@"contact/{contactid:[0-9]+}/avatar")] - public ContactPhotoManager.PhotoData UploadUserAvatarFromSocialNetwork(int contactId, SocialNetworks socialNetwork, string userIdentity, bool uploadOnly, string tmpDirName) - { - if (socialNetwork != SocialNetworks.Twitter) - throw new ArgumentException(); - - if (contactId != 0) - { - var contact = DaoFactory.ContactDao.GetByID(contactId); - if (contact == null || !CRMSecurity.CanAccessTo(contact)) throw new ItemNotFoundException(); - - if (!CRMSecurity.CanEdit(contact)) throw CRMSecurity.CreateSecurityException(); - } - - if (socialNetwork == SocialNetworks.Twitter) - { - var provider = new TwitterDataProvider(TwitterApiHelper.GetTwitterApiInfoForCurrentUser()); - var imageUrl = provider.GetUrlOfUserImage(userIdentity, TwitterDataProvider.ImageSize.Original); - return UploadAvatar(contactId, imageUrl, uploadOnly, tmpDirName, false); - } - - return null; - } /// /// Sends a mail through SMTP to the contacts with the IDs specified in the request. @@ -2036,17 +1854,6 @@ public void SetContactLastModifedDate(int contactId, ApiDateTime lastModifedDate } - private static ContactPhotoManager.PhotoData UploadAvatar(int contactID, string imageUrl, bool uploadOnly, string tmpDirName, bool checkFormat = true) - { - if (contactID != 0) - { - return ContactPhotoManager.UploadPhoto(imageUrl, contactID, uploadOnly, checkFormat); - } - - if (string.IsNullOrEmpty(tmpDirName) || tmpDirName == "null") tmpDirName = null; - return ContactPhotoManager.UploadPhotoToTemp(imageUrl, tmpDirName, checkFormat); - } - private IEnumerable ToSimpleListContactWrapper(IReadOnlyList itemList) { if (itemList.Count == 0) return new List(); diff --git a/module/ASC.Api/ASC.Api.Calendar/ASC.Api.Calendar.csproj b/module/ASC.Api/ASC.Api.Calendar/ASC.Api.Calendar.csproj index 6c241ff55..c45b01b13 100644 --- a/module/ASC.Api/ASC.Api.Calendar/ASC.Api.Calendar.csproj +++ b/module/ASC.Api/ASC.Api.Calendar/ASC.Api.Calendar.csproj @@ -343,11 +343,14 @@ - 4.1.11 + 4.2.0 13.0.1 + + 4.3.0 + diff --git a/module/ASC.Api/ASC.Api.Calendar/iCalParser/DDayICalParser.cs b/module/ASC.Api/ASC.Api.Calendar/iCalParser/DDayICalParser.cs index 08971c358..b9c2e19e4 100644 --- a/module/ASC.Api/ASC.Api.Calendar/iCalParser/DDayICalParser.cs +++ b/module/ASC.Api/ASC.Api.Calendar/iCalParser/DDayICalParser.cs @@ -66,7 +66,7 @@ public static string SerializeCalendar(Ical.Net.Calendar calendar) { try { - var serializer = new Ical.Net.Serialization.CalendarSerializer(); + var serializer = new Ical.Net.Serialization.ComponentSerializer(); return StringUtils.NormalizeStringForMySql(serializer.SerializeToString(calendar)); } @@ -214,7 +214,7 @@ public static Ical.Net.Calendar ConvertCalendar(BaseCalendar calandarObj) result.Method = Ical.Net.CalendarMethods.Publish; result.Scale = Ical.Net.CalendarScales.Gregorian; result.Version = Ical.Net.LibraryMetadata.Version; - result.ProductId = "-//Ascensio System//OnlyOffice Calendar//EN"; + result.ProductId = "-//Ascensio System//ONLYOFFICE Calendar//EN"; if (!string.IsNullOrEmpty(calandarObj.Name)) { diff --git a/module/ASC.Api/ASC.Api.Community/Events/EventApi.cs b/module/ASC.Api/ASC.Api.Community/Events/EventApi.cs index 70657deba..3e9d3a5dc 100644 --- a/module/ASC.Api/ASC.Api.Community/Events/EventApi.cs +++ b/module/ASC.Api/ASC.Api.Community/Events/EventApi.cs @@ -336,14 +336,11 @@ public EventCommentWrapper AddEventComments(int feedid, string content, long par [Create("event/{feedid}/vote")] public EventWrapperFull VoteForEvent(int feedid, long[] variants) { - var feed = FeedStorage.GetFeed(feedid).NotFoundIfNull(); - - if (feed.FeedType != FeedType.Poll) throw new ArgumentException("Feed is not a poll"); - if (((FeedPoll)feed).IsUserVote(SecurityContext.CurrentAccount.ID.ToString())) throw new ArgumentException("User already voted"); + var feed = FeedStorage.GetFeed(feedid); //Voting string error; - PollVoteHandler.VoteForPoll(variants.ToList(), FeedStorage, feedid, out error);//this method is from + PollVoteHandler.VoteForPoll(variants.ToList(), FeedStorage, feed, out error);//this method is from if (!string.IsNullOrEmpty(error)) throw new Exception(error); diff --git a/module/ASC.Api/ASC.Api.Documents/DocumentsApi.cs b/module/ASC.Api/ASC.Api.Documents/DocumentsApi.cs index b83e64af6..78cf6700d 100644 --- a/module/ASC.Api/ASC.Api.Documents/DocumentsApi.cs +++ b/module/ASC.Api/ASC.Api.Documents/DocumentsApi.cs @@ -26,6 +26,7 @@ using System.Text; using System.Text.RegularExpressions; using System.Web; +using System.Windows.Controls; using ASC.Api.Attributes; using ASC.Api.Collections; @@ -102,6 +103,7 @@ public DocumentsApi(ApiContext context, IFileStorageService fileStorageService) /// User or group ID /// Filter type /// Specifies whether to search within the section contents or not + /// File extension by which files will be searched for if the FilterType.ByExtension parameter is passed /// Specifies whether to return sections with or without subfolders /// Specifies whether to return sections with or without trash folder /// Specifies whether to return sections with or without additional folders @@ -111,7 +113,7 @@ public DocumentsApi(ApiContext context, IFileStorageService fileStorageService) /// GET /// list [Read("@root")] - public IEnumerable GetRootFolders(Guid userIdOrGroupId, FilterType filterType, bool searchInContent, bool withSubfolders, bool withoutTrash, bool withoutAdditionalFolder) + public IEnumerable GetRootFolders(Guid userIdOrGroupId, FilterType filterType, bool searchInContent, string extension, bool withSubfolders, bool withoutTrash, bool withoutAdditionalFolder) { var IsVisitor = CoreContext.UserManager.GetUsers(SecurityContext.CurrentAccount.ID).IsVisitor(); var IsOutsider = CoreContext.UserManager.GetUsers(SecurityContext.CurrentAccount.ID).IsOutsider(); @@ -174,7 +176,7 @@ public IEnumerable GetRootFolders(Guid userIdOrGroupId, Fi result.Add((int)Global.FolderTrash); } - return result.Select(r => ToFolderContentWrapper(r, userIdOrGroupId, filterType, searchInContent, withSubfolders)); + return result.Select(r => ToFolderContentWrapper(r, userIdOrGroupId, filterType, searchInContent, extension, withSubfolders)); } /// @@ -185,14 +187,15 @@ public IEnumerable GetRootFolders(Guid userIdOrGroupId, Fi /// User or group ID /// Filter type /// Specifies whether to search within the section contents or not + /// File extension by which files will be searched for if the FilterType.ByExtension parameter is passed /// Specifies whether to return sections with or without subfolders /// The "My documents" section contents /// api/2.0/files/@my /// GET [Read("@my")] - public FolderContentWrapper GetMyFolder(Guid userIdOrGroupId, FilterType filterType, bool searchInContent, bool withSubfolders) + public FolderContentWrapper GetMyFolder(Guid userIdOrGroupId, FilterType filterType, bool searchInContent, string extension, bool withSubfolders) { - return ToFolderContentWrapper(Global.FolderMy, userIdOrGroupId, filterType, searchInContent, withSubfolders); + return ToFolderContentWrapper(Global.FolderMy, userIdOrGroupId, filterType, searchInContent, extension, withSubfolders); } /// @@ -203,14 +206,15 @@ public FolderContentWrapper GetMyFolder(Guid userIdOrGroupId, FilterType filterT /// User or group ID /// Filter type /// Specifies whether to search within the section contents or not + /// File extension by which files will be searched for if the FilterType.ByExtension parameter is passed /// Specifies whether to return sections with or without subfolders /// The "In projects" section contents /// api/2.0/files/@projects /// GET [Read("@projects")] - public FolderContentWrapper GetProjectsFolder(Guid userIdOrGroupId, FilterType filterType, bool searchInContent, bool withSubfolders) + public FolderContentWrapper GetProjectsFolder(Guid userIdOrGroupId, FilterType filterType, bool searchInContent, string extension, bool withSubfolders) { - return ToFolderContentWrapper(Global.FolderProjects, userIdOrGroupId, filterType, searchInContent, withSubfolders); + return ToFolderContentWrapper(Global.FolderProjects, userIdOrGroupId, filterType, searchInContent, extension, withSubfolders); } @@ -222,14 +226,15 @@ public FolderContentWrapper GetProjectsFolder(Guid userIdOrGroupId, FilterType f /// User or group ID /// Filter type /// Specifies whether to search within the section contents or not + /// File extension by which files will be searched for if the FilterType.ByExtension parameter is passed /// Specifies whether to return sections with or without subfolders /// The "Common" section contents /// api/2.0/files/@common /// GET [Read("@common")] - public FolderContentWrapper GetCommonFolder(Guid userIdOrGroupId, FilterType filterType, bool searchInContent, bool withSubfolders) + public FolderContentWrapper GetCommonFolder(Guid userIdOrGroupId, FilterType filterType, bool searchInContent, string extension, bool withSubfolders) { - return ToFolderContentWrapper(Global.FolderCommon, userIdOrGroupId, filterType, searchInContent, withSubfolders); + return ToFolderContentWrapper(Global.FolderCommon, userIdOrGroupId, filterType, searchInContent, extension, withSubfolders); } /// @@ -240,14 +245,15 @@ public FolderContentWrapper GetCommonFolder(Guid userIdOrGroupId, FilterType fil /// User or group ID /// Filter type /// Specifies whether to search within the section contents or not + /// File extension by which files will be searched for if the FilterType.ByExtension parameter is passed /// Specifies whether to return sections with or without subfolders /// The "Shared with me" section contents /// api/2.0/files/@share /// GET [Read("@share")] - public FolderContentWrapper GetShareFolder(Guid userIdOrGroupId, FilterType filterType, bool searchInContent, bool withSubfolders) + public FolderContentWrapper GetShareFolder(Guid userIdOrGroupId, FilterType filterType, bool searchInContent, string extension, bool withSubfolders) { - return ToFolderContentWrapper(Global.FolderShare, userIdOrGroupId, filterType, searchInContent, withSubfolders); + return ToFolderContentWrapper(Global.FolderShare, userIdOrGroupId, filterType, searchInContent, extension, withSubfolders); } /// @@ -258,14 +264,15 @@ public FolderContentWrapper GetShareFolder(Guid userIdOrGroupId, FilterType filt /// User or group ID /// Filter type /// Specifies whether to search within the section contents or not + /// File extension by which files will be searched for if the FilterType.ByExtension parameter is passed /// Specifies whether to return sections with or without subfolders /// The "Recent" section contents /// api/2.0/files/@recent /// GET [Read("@recent")] - public FolderContentWrapper GetRecentFolder(Guid userIdOrGroupId, FilterType filterType, bool searchInContent, bool withSubfolders) + public FolderContentWrapper GetRecentFolder(Guid userIdOrGroupId, FilterType filterType, bool searchInContent, string extension, bool withSubfolders) { - return ToFolderContentWrapper(Global.FolderRecent, userIdOrGroupId, filterType, searchInContent, withSubfolders); + return ToFolderContentWrapper(Global.FolderRecent, userIdOrGroupId, filterType, searchInContent, extension, withSubfolders); } /// @@ -276,14 +283,15 @@ public FolderContentWrapper GetRecentFolder(Guid userIdOrGroupId, FilterType fil /// User or group ID /// Filter type /// Specifies whether to search within the section contents or not + /// File extension by which files will be searched for if the FilterType.ByExtension parameter is passed /// Specifies whether to return sections with or without subfolders /// The "Favorites" section contents /// api/2.0/files/@favorites /// GET [Read("@favorites")] - public FolderContentWrapper GetFavoritesFolder(Guid userIdOrGroupId, FilterType filterType, bool searchInContent, bool withSubfolders) + public FolderContentWrapper GetFavoritesFolder(Guid userIdOrGroupId, FilterType filterType, bool searchInContent, string extension, bool withSubfolders) { - return ToFolderContentWrapper(Global.FolderFavorites, userIdOrGroupId, filterType, searchInContent, withSubfolders); + return ToFolderContentWrapper(Global.FolderFavorites, userIdOrGroupId, filterType, searchInContent, extension, withSubfolders); } /// @@ -294,14 +302,15 @@ public FolderContentWrapper GetFavoritesFolder(Guid userIdOrGroupId, FilterType /// User or group ID /// Filter type /// Specifies whether to search within the section contents or not + /// File extension by which files will be searched for if the FilterType.ByExtension parameter is passed /// Specifies whether to return sections with or without subfolders /// The "Templates" section contents /// api/2.0/files/@templates /// GET [Read("@templates")] - public FolderContentWrapper GetTemplatesFolder(Guid userIdOrGroupId, FilterType filterType, bool searchInContent, bool withSubfolders) + public FolderContentWrapper GetTemplatesFolder(Guid userIdOrGroupId, FilterType filterType, bool searchInContent, string extension, bool withSubfolders) { - return ToFolderContentWrapper(Global.FolderTemplates, userIdOrGroupId, filterType, searchInContent, withSubfolders); + return ToFolderContentWrapper(Global.FolderTemplates, userIdOrGroupId, filterType, searchInContent, extension, withSubfolders); } /// @@ -312,14 +321,15 @@ public FolderContentWrapper GetTemplatesFolder(Guid userIdOrGroupId, FilterType /// User or group ID /// Filter type /// Specifies whether to search within the section contents or not + /// File extension by which files will be searched for if the FilterType.ByExtension parameter is passed /// Specifies whether to return sections with or without subfolders /// The "Trash" section contents /// api/2.0/files/@trash /// GET [Read("@trash")] - public FolderContentWrapper GetTrashFolder(Guid userIdOrGroupId, FilterType filterType, bool searchInContent, bool withSubfolders) + public FolderContentWrapper GetTrashFolder(Guid userIdOrGroupId, FilterType filterType, bool searchInContent, string extension, bool withSubfolders) { - return ToFolderContentWrapper(Global.FolderTrash, userIdOrGroupId, filterType, searchInContent, withSubfolders); + return ToFolderContentWrapper(Global.FolderTrash, userIdOrGroupId, filterType, searchInContent, extension, withSubfolders); } /// @@ -333,14 +343,15 @@ public FolderContentWrapper GetTrashFolder(Guid userIdOrGroupId, FilterType filt /// User or group ID /// Filter type /// Specifies whether to search within the section contents or not + /// File extension by which files will be searched for if the FilterType.ByExtension parameter is passed /// Specifies whether to return sections with or without subfolders /// Folder contents /// api/2.0/files/{folderId} /// GET [Read("{folderId}")] - public FolderContentWrapper GetFolder(String folderId, Guid userIdOrGroupId, FilterType filterType, bool searchInContent, bool withSubfolders) + public FolderContentWrapper GetFolder(String folderId, Guid userIdOrGroupId, FilterType filterType, bool searchInContent, string extension, bool withSubfolders) { - return ToFolderContentWrapper(folderId, userIdOrGroupId, filterType, searchInContent, withSubfolders).NotFoundIfNull(); + return ToFolderContentWrapper(folderId, userIdOrGroupId, filterType, searchInContent, extension, withSubfolders).NotFoundIfNull(); } @@ -1228,7 +1239,7 @@ public IEnumerable MoveOrCopyBatchCheck(String destFolderId, IEnume var ids = _fileStorageService.MoveOrCopyFilesCheck(itemList, destFolderId).Keys.Select(id => "file_" + id); - var entries = _fileStorageService.GetItems(new Web.Files.Services.WCFService.ItemList(ids), FilterType.FilesOnly, false, "", ""); + var entries = _fileStorageService.GetItems(new Web.Files.Services.WCFService.ItemList(ids), FilterType.FilesOnly, false, "", "", null); return entries.Select(x => new FileWrapper((Files.Core.File)x)).ToSmartList(); } @@ -2326,13 +2337,19 @@ public IEnumerable CreateThumbnails(IEnumerable fileIds) } - private FolderContentWrapper ToFolderContentWrapper(object folderId, Guid userIdOrGroupId, FilterType filterType, bool searchInContent, bool withSubfolders) + private FolderContentWrapper ToFolderContentWrapper(object folderId, Guid userIdOrGroupId, FilterType filterType, bool searchInContent, string extension, bool withSubfolders) { if (folderId == null) { throw new ItemNotFoundException(Web.Files.Resources.FilesCommonResource.ErrorMassage_FolderNotFound); } + var subjectGroup = false; + var groupInfo = CoreContext.UserManager.GetGroupInfo(userIdOrGroupId); + if(groupInfo.ID != Core.Users.Constants.LostGroupInfo.ID) + { + subjectGroup = true; + } OrderBy orderBy = null; SortedByType sortBy; if (Enum.TryParse(_context.SortBy, true, out sortBy)) @@ -2344,10 +2361,11 @@ private FolderContentWrapper ToFolderContentWrapper(object folderId, Guid userId startIndex, Convert.ToInt32(_context.Count) - 1, //NOTE: in ApiContext +1 filterType, - filterType == FilterType.ByDepartment, + subjectGroup, userIdOrGroupId.ToString(), _context.FilterValue, searchInContent, + extension, withSubfolders, orderBy), startIndex); diff --git a/module/ASC.Api/ASC.Api.Mail/ASC.Api.Mail.csproj b/module/ASC.Api/ASC.Api.Mail/ASC.Api.Mail.csproj index fd39a7cc0..63f938d85 100644 --- a/module/ASC.Api/ASC.Api.Mail/ASC.Api.Mail.csproj +++ b/module/ASC.Api/ASC.Api.Mail/ASC.Api.Mail.csproj @@ -147,7 +147,7 @@ - 4.1.11 + 4.2.0 diff --git a/module/ASC.Api/ASC.Api.Migration/MigrationApi.cs b/module/ASC.Api/ASC.Api.Migration/MigrationApi.cs index eeb5619e4..a489f1019 100644 --- a/module/ASC.Api/ASC.Api.Migration/MigrationApi.cs +++ b/module/ASC.Api/ASC.Api.Migration/MigrationApi.cs @@ -57,15 +57,15 @@ public MigrationApi(ApiContext context) } /// - /// Returns the temporary folder where all the created backups are stored. + /// Returns the temporary folder where all the migration files are stored. /// /// - /// Get backup folder + /// Get migration temporary folder /// - /// Path to the backup folder - /// api/2.0/migration/backuptmp + /// Path to the migration temporary folder + /// api/2.0/migration/tmp /// GET - [Read("backuptmp")] + [Read("tmp")] public string GetTmpFolder() { if (!CoreContext.Configuration.Standalone || !CoreContext.UserManager.GetUsers(SecurityContext.CurrentAccount.ID).IsAdmin()) throw new System.Security.SecurityException(); diff --git a/module/ASC.Api/ASC.Api.Projects/ProjectApi.Projects.cs b/module/ASC.Api/ASC.Api.Projects/ProjectApi.Projects.cs index 185fad681..403ed74d5 100644 --- a/module/ASC.Api/ASC.Api.Projects/ProjectApi.Projects.cs +++ b/module/ASC.Api/ASC.Api.Projects/ProjectApi.Projects.cs @@ -574,6 +574,8 @@ public ProjectWrapperFull DeleteProject(int id) [Delete(@"")] public IEnumerable DeleteProjects(int[] projectids) { + projectids = projectids.Distinct().ToArray(); + var result = new List(projectids.Length); foreach (var id in projectids) @@ -1259,7 +1261,7 @@ public FolderContentWrapper GetProjectFiles(int id) var project = EngineFactory.ProjectEngine.GetByID(id).NotFoundIfNull(); if (ProjectSecurity.CanReadFiles(project)) - return documentsApi.GetFolder(EngineFactory.FileEngine.GetRoot(id).ToString(), Guid.Empty, FilterType.None, false, false); + return documentsApi.GetFolder(EngineFactory.FileEngine.GetRoot(id).ToString(), Guid.Empty, FilterType.None, false, null, false); throw new SecurityException("Access to files is denied"); } diff --git a/module/ASC.Api/ASC.Api.Security/SecurityApi.cs b/module/ASC.Api/ASC.Api.Security/SecurityApi.cs index da2087ab7..668accfe6 100644 --- a/module/ASC.Api/ASC.Api.Security/SecurityApi.cs +++ b/module/ASC.Api/ASC.Api.Security/SecurityApi.cs @@ -511,8 +511,7 @@ public string LogOutAllActiveConnectionsChangePassword() [Update("/activeconnections/logoutall/{userId}")] public void LogOutAllActiveConnectionsForUser(Guid userId) { - if (!CoreContext.UserManager.GetUsers(SecurityContext.CurrentAccount.ID).IsAdmin() - && !WebItemSecurity.IsProductAdministrator(WebItemManager.PeopleProductID, SecurityContext.CurrentAccount.ID)) + if (!WebItemSecurity.IsProductAdministrator(WebItemManager.PeopleProductID, SecurityContext.CurrentAccount.ID)) throw new SecurityException("Method not available"); LogOutAllActiveConnections(userId); @@ -566,6 +565,19 @@ public bool LogOutActiveConnection(int loginEventId) try { var user = CoreContext.UserManager.GetUsers(SecurityContext.CurrentAccount.ID); + + var loginEvent = DbLoginEventsManager.GetLoginEvent(user.Tenant, loginEventId); + + if (loginEvent == null) + { + return false; + } + + if (loginEvent.UserId != user.ID && !WebItemSecurity.IsProductAdministrator(WebItemManager.PeopleProductID, user.ID)) + { + throw new SecurityException("Method not available"); + } + var userName = user.DisplayUserName(false); DbLoginEventsManager.LogOutEvent(loginEventId); @@ -606,7 +618,7 @@ public LoginSettings UpdateLoginSettings(int attemptsCount, int blockTime, int c { throw new ArgumentOutOfRangeException("checkPeriod"); } - if (blockTime < 0) + if (blockTime < 1) { throw new ArgumentOutOfRangeException("blockTime"); } diff --git a/module/ASC.Api/ASC.Api.Settings/SettingsApi.cs b/module/ASC.Api/ASC.Api.Settings/SettingsApi.cs index 13a939452..b4f8b0567 100644 --- a/module/ASC.Api/ASC.Api.Settings/SettingsApi.cs +++ b/module/ASC.Api/ASC.Api.Settings/SettingsApi.cs @@ -1109,6 +1109,7 @@ private void RestoreWhiteLabelLogosForDefaultTenant(List if (restoreLogoText) { settings.LogoText = null; + settings.ClearAppliedTenants(); } RestoreWhiteLabelLogosForTenant(settings, storage, Tenant.DEFAULT_TENANT, logoTypes); @@ -1412,8 +1413,8 @@ public IEnumerable TfaAppRequestNewCodes() [Update("tfaappnewapp")] public string TfaAppNewApp(Guid id) { - var isMe = id.Equals(Guid.Empty); - var user = CoreContext.UserManager.GetUsers(isMe ? SecurityContext.CurrentAccount.ID : id); + var user = CoreContext.UserManager.GetUsers(id.Equals(Guid.Empty) ? SecurityContext.CurrentAccount.ID : id); + var isMe = user.IsMe(); if (!isMe && !SecurityContext.CheckPermissions(new UserSecurityProvider(user.ID), Core.Users.Constants.Action_EditUser)) throw new SecurityAccessDeniedException(Resource.ErrorAccessDenied); diff --git a/module/ASC.Api/ASC.Employee/EmployeeApi.cs b/module/ASC.Api/ASC.Employee/EmployeeApi.cs index 7e015859d..bfc90dda4 100644 --- a/module/ASC.Api/ASC.Employee/EmployeeApi.cs +++ b/module/ASC.Api/ASC.Employee/EmployeeApi.cs @@ -1131,6 +1131,8 @@ public EmployeeWraperFull ChangeUserEmail(Guid userid, string email) CoreContext.UserManager.SaveUserInfo(user, syncCardDav: true); MessageService.Send(Request, MessageAction.UserUpdatedEmail, messageTarget, messageDescription); + CookiesManager.ResetUserCookie(user.ID); + StudioNotifyService.Instance.SendEmailActivationInstructions(user, email); MessageService.Send(HttpContext.Current.Request, MessageAction.UserSentActivationInstructions, messageTarget, messageDescription); } diff --git a/module/ASC.Api/ASC.Specific/ASC.Specific.csproj b/module/ASC.Api/ASC.Specific/ASC.Specific.csproj index 5f35e47d8..73b26d492 100644 --- a/module/ASC.Api/ASC.Specific/ASC.Specific.csproj +++ b/module/ASC.Api/ASC.Specific/ASC.Specific.csproj @@ -96,11 +96,6 @@ ASC.FederatedLogin False - - {592eac85-6cfc-4ad7-b653-3eadaa18327e} - ASC.Thrdparty - False - {49f07fff-98a5-47d2-a9e9-a46b98c41245} ASC.Api.Core diff --git a/module/ASC.AuditTrail/AuditEventsRepository.cs b/module/ASC.AuditTrail/AuditEventsRepository.cs index 0947523e6..cd6a922e7 100644 --- a/module/ASC.AuditTrail/AuditEventsRepository.cs +++ b/module/ASC.AuditTrail/AuditEventsRepository.cs @@ -89,15 +89,26 @@ public static IEnumerable GetByFilter( var isNeedFindEntry = entry.HasValue && entry.Value != EntryType.None && target != null; + IEnumerable> actions = new List>(); if (action.HasValue && action.Value != MessageAction.None) { - q.Where("a.action", (int)action); + if (isNeedFindEntry) + { + actions = AuditActionMapper.Mappers + .SelectMany(r => r.Mappers) + .SelectMany(r => r.Actions) + .Where(r => r.Key == action); + + FindByEntry(q, entry.Value, target, actions); + } + else + { + q.Where("a.action", (int)action); + } } else { - IEnumerable> actions = new List>(); - var isFindActionType = actionType.HasValue && actionType.Value != ActionType.None; if (productType.HasValue && productType.Value != ProductType.None) @@ -185,11 +196,11 @@ private static void FindByEntry(SqlQuery q, EntryType entry, string target, IEnu { if (action.Value.EntryType1 == entry) { - sb.Append(string.Format("(a.action = {0} AND SUBSTRING_INDEX(SUBSTRING_INDEX(a.target,',',{1}),',',1) = {2}) OR ", (int)action.Key, -2, target)); + sb.Append(string.Format("(a.action = {0} AND SUBSTRING_INDEX(SUBSTRING_INDEX(a.target,',',{1}),',',1) = '{2}') OR ", (int)action.Key, -2, target)); } if (action.Value.EntryType2 == entry) { - sb.Append(string.Format("(a.action = {0} AND SUBSTRING_INDEX(SUBSTRING_INDEX(a.target,',',{1}),',',1) = {2}) OR ", (int)action.Key, -1, target)); + sb.Append(string.Format("(a.action = {0} AND SUBSTRING_INDEX(SUBSTRING_INDEX(a.target,',',{1}),',',1) = '{2}') OR ", (int)action.Key, -1, target)); } } diff --git a/module/ASC.ElasticSearch/Engine/BaseIndexer.cs b/module/ASC.ElasticSearch/Engine/BaseIndexer.cs index 7f5491717..018be079c 100644 --- a/module/ASC.ElasticSearch/Engine/BaseIndexer.cs +++ b/module/ASC.ElasticSearch/Engine/BaseIndexer.cs @@ -411,7 +411,7 @@ void IIndexer.Check() async Task IIndexer.ReIndex() { - while (Launcher.IsStarted && Launcher.Indexing.Contains(Wrapper.IndexName)) + while (Launcher.IsStarted && Launcher.Indexing.ContainsKey(Wrapper.IndexName)) { await Task.Delay(10000); } diff --git a/module/ASC.ElasticSearch/Service/Launcher.cs b/module/ASC.ElasticSearch/Service/Launcher.cs index dde3c76ff..950265a02 100644 --- a/module/ASC.ElasticSearch/Service/Launcher.cs +++ b/module/ASC.ElasticSearch/Service/Launcher.cs @@ -16,6 +16,7 @@ using System; +using System.Collections.Concurrent; using System.Collections.Generic; using System.Linq; using System.ServiceModel; @@ -41,12 +42,12 @@ public class Launcher : IServiceController internal static ServiceHost Searcher { get; private set; } internal static bool IsStarted { get; private set; } - internal static List Indexing { get; private set; } + internal static ConcurrentDictionary Indexing { get; private set; } internal static DateTime? LastIndexed { get; private set; } static Launcher() { - Indexing = new List(); + Indexing = new ConcurrentDictionary(); } public void Start() @@ -106,9 +107,9 @@ private static void CheckIfChange() if (!IsStarted) return; logger.DebugFormat("Product check {0}", product.IndexName); - Indexing.Add(product.IndexName); + Indexing.TryAdd(product.IndexName, null); product.Check(); - Indexing.Remove(product.IndexName); + Indexing.TryRemove(product.IndexName, out _); } catch (Exception e) { @@ -161,9 +162,9 @@ private static void IndexAll(bool reindex = false) if (!IsStarted) return; logger.DebugFormat("Product {0}", product.IndexName); - Indexing.Add(product.IndexName); + Indexing.TryAdd(product.IndexName, null); product.IndexAll(); - Indexing.Remove(product.IndexName); + Indexing.TryRemove(product.IndexName, out _); } catch (Exception e) { diff --git a/module/ASC.ElasticSearch/Service/Service.cs b/module/ASC.ElasticSearch/Service/Service.cs index 67a287ec8..7836c967a 100644 --- a/module/ASC.ElasticSearch/Service/Service.cs +++ b/module/ASC.ElasticSearch/Service/Service.cs @@ -61,7 +61,7 @@ public State GetState() { return new State { - Indexing = Launcher.Indexing, + Indexing = Launcher.Indexing.Keys.ToList(), LastIndexed = Launcher.LastIndexed }; } diff --git a/module/ASC.Files.AutoCleanUp/Worker.cs b/module/ASC.Files.AutoCleanUp/Worker.cs index c97407b84..8c6d2dfe7 100644 --- a/module/ASC.Files.AutoCleanUp/Worker.cs +++ b/module/ASC.Files.AutoCleanUp/Worker.cs @@ -140,7 +140,7 @@ private void DeleteFilesAndFolders(TenantUserSettings tenantUser) itemList.AddRange(folderDao.GetFolders(trashId) .Where(x => FileDateTime.GetModifiedOnWithAutoCleanUp(x.ModifiedOn, tenantUser.Setting, true) < now) .Select(f => "folder_" + f.ID)); - itemList.AddRange(fileDao.GetFiles(trashId, null, default(FilterType), false, Guid.Empty, string.Empty, false) + itemList.AddRange(fileDao.GetFiles(trashId, null, default(FilterType), false, Guid.Empty, string.Empty, false, null) .Where(x => FileDateTime.GetModifiedOnWithAutoCleanUp(x.ModifiedOn, tenantUser.Setting, true) < now) .Select(y => "file_" + y.ID)); diff --git a/module/ASC.Files.Thirdparty/Box/BoxFileDao.cs b/module/ASC.Files.Thirdparty/Box/BoxFileDao.cs index e46618c7f..d705440bb 100644 --- a/module/ASC.Files.Thirdparty/Box/BoxFileDao.cs +++ b/module/ASC.Files.Thirdparty/Box/BoxFileDao.cs @@ -82,7 +82,7 @@ public List GetFiles(IEnumerable fileIds) return fileIds.Select(GetBoxFile).Select(ToFile).ToList(); } - public List GetFilesFiltered(IEnumerable fileIds, FilterType filterType, bool subjectGroup, Guid subjectID, string searchText, bool searchInContent) + public List GetFilesFiltered(IEnumerable fileIds, FilterType filterType, bool subjectGroup, Guid subjectID, string searchText, bool searchInContent, string extension) { if (fileIds == null || !fileIds.Any() || filterType == FilterType.FoldersOnly) return new List(); @@ -123,10 +123,11 @@ public List GetFilesFiltered(IEnumerable fileIds, FilterType filte }); break; case FilterType.ByExtension: - if (!string.IsNullOrEmpty(searchText)) + case FilterType.ByExtensionIncludeFolders: + if (!string.IsNullOrEmpty(extension)) { - searchText = searchText.Trim().ToLower(); - files = files.Where(x => FileUtility.GetFileExtension(x.Title).Equals(searchText)); + extension = extension.Trim().ToLower(); + files = files.Where(x => FileUtility.GetFileExtension(x.Title).Equals(extension)); } break; } @@ -142,7 +143,7 @@ public List GetFiles(object parentId) return GetBoxItems(parentId, false).Select(entry => (object)MakeId(entry.Id)).ToList(); } - public List GetFiles(object parentId, OrderBy orderBy, FilterType filterType, bool subjectGroup, Guid subjectID, string searchText, bool searchInContent, bool withSubfolders = false) + public List GetFiles(object parentId, OrderBy orderBy, FilterType filterType, bool subjectGroup, Guid subjectID, string searchText, bool searchInContent, string extension, bool withSubfolders = false) { if (filterType == FilterType.FoldersOnly) return new List(); @@ -184,10 +185,11 @@ public List GetFiles(object parentId, OrderBy orderBy, FilterType filterTy }); break; case FilterType.ByExtension: - if (!string.IsNullOrEmpty(searchText)) + case FilterType.ByExtensionIncludeFolders: + if (!string.IsNullOrEmpty(extension)) { - searchText = searchText.Trim().ToLower(); - files = files.Where(x => FileUtility.GetFileExtension(x.Title).Equals(searchText)); + extension = extension.Trim().ToLower(); + files = files.Where(x => FileUtility.GetFileExtension(x.Title).Equals(extension)); } break; } @@ -487,7 +489,7 @@ public void ReassignFiles(IEnumerable fileIds, Guid newOwnerId) { } - public List GetFiles(IEnumerable parentIds, FilterType filterType, bool subjectGroup, Guid subjectID, string searchText, bool searchInContent) + public List GetFiles(IEnumerable parentIds, FilterType filterType, bool subjectGroup, Guid subjectID, string searchText, bool searchInContent, string extension) { return new List(); } diff --git a/module/ASC.Files.Thirdparty/Dropbox/DropboxFileDao.cs b/module/ASC.Files.Thirdparty/Dropbox/DropboxFileDao.cs index 61a57d1b8..0ed858c45 100644 --- a/module/ASC.Files.Thirdparty/Dropbox/DropboxFileDao.cs +++ b/module/ASC.Files.Thirdparty/Dropbox/DropboxFileDao.cs @@ -85,7 +85,7 @@ public List GetFiles(IEnumerable fileIds) return fileIds.Select(GetDropboxFile).Select(ToFile).ToList(); } - public List GetFilesFiltered(IEnumerable fileIds, FilterType filterType, bool subjectGroup, Guid subjectID, string searchText, bool searchInContent) + public List GetFilesFiltered(IEnumerable fileIds, FilterType filterType, bool subjectGroup, Guid subjectID, string searchText, bool searchInContent, string extension) { if (fileIds == null || !fileIds.Any() || filterType == FilterType.FoldersOnly) return new List(); @@ -126,10 +126,11 @@ public List GetFilesFiltered(IEnumerable fileIds, FilterType filte }); break; case FilterType.ByExtension: - if (!string.IsNullOrEmpty(searchText)) + case FilterType.ByExtensionIncludeFolders: + if (!string.IsNullOrEmpty(extension)) { - searchText = searchText.Trim().ToLower(); - files = files.Where(x => FileUtility.GetFileExtension(x.Title).Equals(searchText)); + extension = extension.Trim().ToLower(); + files = files.Where(x => FileUtility.GetFileExtension(x.Title).Equals(extension)); } break; } @@ -145,7 +146,7 @@ public List GetFiles(object parentId) return GetDropboxItems(parentId, false).Select(entry => (object)MakeId(entry)).ToList(); } - public List GetFiles(object parentId, OrderBy orderBy, FilterType filterType, bool subjectGroup, Guid subjectID, string searchText, bool searchInContent, bool withSubfolders = false) + public List GetFiles(object parentId, OrderBy orderBy, FilterType filterType, bool subjectGroup, Guid subjectID, string searchText, bool searchInContent, string extension, bool withSubfolders = false) { if (filterType == FilterType.FoldersOnly) return new List(); @@ -187,10 +188,11 @@ public List GetFiles(object parentId, OrderBy orderBy, FilterType filterTy }); break; case FilterType.ByExtension: - if (!string.IsNullOrEmpty(searchText)) + case FilterType.ByExtensionIncludeFolders: + if (!string.IsNullOrEmpty(extension)) { - searchText = searchText.Trim().ToLower(); - files = files.Where(x => FileUtility.GetFileExtension(x.Title).Equals(searchText)); + extension = extension.Trim().ToLower(); + files = files.Where(x => FileUtility.GetFileExtension(x.Title).Equals(extension)); } break; } @@ -534,7 +536,7 @@ public void ReassignFiles(IEnumerable fileIds, Guid newOwnerId) { } - public List GetFiles(IEnumerable parentIds, FilterType filterType, bool subjectGroup, Guid subjectID, string searchText, bool searchInContent) + public List GetFiles(IEnumerable parentIds, FilterType filterType, bool subjectGroup, Guid subjectID, string searchText, bool searchInContent, string extension) { return new List(); } diff --git a/module/ASC.Files.Thirdparty/GoogleDrive/GoogleDriveFileDao.cs b/module/ASC.Files.Thirdparty/GoogleDrive/GoogleDriveFileDao.cs index 65e622cd8..921b3e727 100644 --- a/module/ASC.Files.Thirdparty/GoogleDrive/GoogleDriveFileDao.cs +++ b/module/ASC.Files.Thirdparty/GoogleDrive/GoogleDriveFileDao.cs @@ -81,7 +81,7 @@ public List GetFiles(IEnumerable fileIds) return fileIds.Select(GetDriveEntry).Select(ToFile).ToList(); } - public List GetFilesFiltered(IEnumerable fileIds, FilterType filterType, bool subjectGroup, Guid subjectID, string searchText, bool searchInContent) + public List GetFilesFiltered(IEnumerable fileIds, FilterType filterType, bool subjectGroup, Guid subjectID, string searchText, bool searchInContent, string extension) { if (fileIds == null || !fileIds.Any() || filterType == FilterType.FoldersOnly) return new List(); @@ -122,10 +122,11 @@ public List GetFilesFiltered(IEnumerable fileIds, FilterType filte }); break; case FilterType.ByExtension: - if (!string.IsNullOrEmpty(searchText)) + case FilterType.ByExtensionIncludeFolders: + if (!string.IsNullOrEmpty(extension)) { - searchText = searchText.Trim().ToLower(); - files = files.Where(x => FileUtility.GetFileExtension(x.Title).Equals(searchText)); + extension = extension.Trim().ToLower(); + files = files.Where(x => FileUtility.GetFileExtension(x.Title).Equals(extension)); } break; } @@ -141,7 +142,7 @@ public List GetFiles(object parentId) return GetDriveEntries(parentId, false).Select(entry => (object)MakeId(entry.Id)).ToList(); } - public List GetFiles(object parentId, OrderBy orderBy, FilterType filterType, bool subjectGroup, Guid subjectID, string searchText, bool searchInContent, bool withSubfolders = false) + public List GetFiles(object parentId, OrderBy orderBy, FilterType filterType, bool subjectGroup, Guid subjectID, string searchText, bool searchInContent, string extension, bool withSubfolders = false) { if (filterType == FilterType.FoldersOnly) return new List(); @@ -183,10 +184,11 @@ public List GetFiles(object parentId, OrderBy orderBy, FilterType filterTy }); break; case FilterType.ByExtension: - if (!string.IsNullOrEmpty(searchText)) + case FilterType.ByExtensionIncludeFolders: + if (!string.IsNullOrEmpty(extension)) { - searchText = searchText.Trim().ToLower(); - files = files.Where(x => FileUtility.GetFileExtension(x.Title).Equals(searchText)); + extension = extension.Trim().ToLower(); + files = files.Where(x => FileUtility.GetFileExtension(x.Title).Equals(extension)); } break; } @@ -535,7 +537,7 @@ public void ReassignFiles(IEnumerable fileIds, Guid newOwnerId) { } - public List GetFiles(IEnumerable parentIds, FilterType filterType, bool subjectGroup, Guid subjectID, string searchText, bool searchInContent) + public List GetFiles(IEnumerable parentIds, FilterType filterType, bool subjectGroup, Guid subjectID, string searchText, bool searchInContent, string extension) { return new List(); } diff --git a/module/ASC.Files.Thirdparty/OneDrive/OneDriveFileDao.cs b/module/ASC.Files.Thirdparty/OneDrive/OneDriveFileDao.cs index 32228017d..ae8a79699 100644 --- a/module/ASC.Files.Thirdparty/OneDrive/OneDriveFileDao.cs +++ b/module/ASC.Files.Thirdparty/OneDrive/OneDriveFileDao.cs @@ -82,7 +82,7 @@ public List GetFiles(IEnumerable fileIds) return fileIds.Select(GetOneDriveItem).Select(ToFile).ToList(); } - public List GetFilesFiltered(IEnumerable fileIds, FilterType filterType, bool subjectGroup, Guid subjectID, string searchText, bool searchInContent) + public List GetFilesFiltered(IEnumerable fileIds, FilterType filterType, bool subjectGroup, Guid subjectID, string searchText, bool searchInContent, string extension) { if (fileIds == null || !fileIds.Any() || filterType == FilterType.FoldersOnly) return new List(); @@ -123,10 +123,11 @@ public List GetFilesFiltered(IEnumerable fileIds, FilterType filte }); break; case FilterType.ByExtension: - if (!string.IsNullOrEmpty(searchText)) + case FilterType.ByExtensionIncludeFolders: + if (!string.IsNullOrEmpty(extension)) { - searchText = searchText.Trim().ToLower(); - files = files.Where(x => FileUtility.GetFileExtension(x.Title).Equals(searchText)); + extension = extension.Trim().ToLower(); + files = files.Where(x => FileUtility.GetFileExtension(x.Title).Equals(extension)); } break; } @@ -142,7 +143,7 @@ public List GetFiles(object parentId) return GetOneDriveItems(parentId, false).Select(entry => (object)MakeId(entry.Id)).ToList(); } - public List GetFiles(object parentId, OrderBy orderBy, FilterType filterType, bool subjectGroup, Guid subjectID, string searchText, bool searchInContent, bool withSubfolders = false) + public List GetFiles(object parentId, OrderBy orderBy, FilterType filterType, bool subjectGroup, Guid subjectID, string searchText, bool searchInContent, string extension, bool withSubfolders = false) { if (filterType == FilterType.FoldersOnly) return new List(); @@ -184,10 +185,11 @@ public List GetFiles(object parentId, OrderBy orderBy, FilterType filterTy }); break; case FilterType.ByExtension: - if (!string.IsNullOrEmpty(searchText)) + case FilterType.ByExtensionIncludeFolders: + if (!string.IsNullOrEmpty(extension)) { - searchText = searchText.Trim().ToLower(); - files = files.Where(x => FileUtility.GetFileExtension(x.Title).Equals(searchText)); + extension = extension.Trim().ToLower(); + files = files.Where(x => FileUtility.GetFileExtension(x.Title).Equals(extension)); } break; } @@ -539,7 +541,7 @@ public void ReassignFiles(IEnumerable fileIds, Guid newOwnerId) { } - public List GetFiles(IEnumerable parentIds, FilterType filterType, bool subjectGroup, Guid subjectID, string searchText, bool searchInContent) + public List GetFiles(IEnumerable parentIds, FilterType filterType, bool subjectGroup, Guid subjectID, string searchText, bool searchInContent, string extension) { return new List(); } diff --git a/module/ASC.Files.Thirdparty/ProviderDao/ProviderDaoBase.cs b/module/ASC.Files.Thirdparty/ProviderDao/ProviderDaoBase.cs index eaf9dece3..89f42daa9 100644 --- a/module/ASC.Files.Thirdparty/ProviderDao/ProviderDaoBase.cs +++ b/module/ASC.Files.Thirdparty/ProviderDao/ProviderDaoBase.cs @@ -236,7 +236,7 @@ protected File PerformCrossDaoFileCopy(object fromFileId, object toFolderId, boo } //Delete source file if needed - fromFileDao.DeleteFile(fromSelector.ConvertId(fromFileId)); + fromFileDao.DeleteFile(fromSelector.ConvertId(fromFileId), fromFile.GetFileQuotaOwner()); } return toFile; } diff --git a/module/ASC.Files.Thirdparty/ProviderDao/ProviderFileDao.cs b/module/ASC.Files.Thirdparty/ProviderDao/ProviderFileDao.cs index 8e640a961..837416b08 100644 --- a/module/ASC.Files.Thirdparty/ProviderDao/ProviderFileDao.cs +++ b/module/ASC.Files.Thirdparty/ProviderDao/ProviderFileDao.cs @@ -136,7 +136,7 @@ public List GetFiles(IEnumerable fileIds) return result.ToList(); } - public List GetFilesFiltered(IEnumerable fileIds, FilterType filterType, bool subjectGroup, Guid subjectID, string searchText, bool searchInContent) + public List GetFilesFiltered(IEnumerable fileIds, FilterType filterType, bool subjectGroup, Guid subjectID, string searchText, bool searchInContent, string extension) { var result = Enumerable.Empty(); @@ -153,7 +153,7 @@ public List GetFilesFiltered(IEnumerable fileIds, FilterType filte using (var fileDao = selectorLocal.GetFileDao(matchedId.FirstOrDefault())) { return fileDao.GetFilesFiltered(matchedId.Select(selectorLocal.ConvertId).ToList(), - filterType, subjectGroup, subjectID, searchText, searchInContent); + filterType, subjectGroup, subjectID, searchText, searchInContent, extension); } }) .Where(r => r != null)); @@ -171,13 +171,13 @@ public List GetFiles(object parentId) } } - public List GetFiles(object parentId, OrderBy orderBy, FilterType filterType, bool subjectGroup, Guid subjectID, string searchText, bool searchInContent, bool withSubfolders = false) + public List GetFiles(object parentId, OrderBy orderBy, FilterType filterType, bool subjectGroup, Guid subjectID, string searchText, bool searchInContent, string extension, bool withSubfolders = false) { var selector = GetSelector(parentId); using (var fileDao = selector.GetFileDao(parentId)) { - var result = fileDao.GetFiles(selector.ConvertId(parentId), orderBy, filterType, subjectGroup, subjectID, searchText, searchInContent, withSubfolders) + var result = fileDao.GetFiles(selector.ConvertId(parentId), orderBy, filterType, subjectGroup, subjectID, searchText, searchInContent, extension, withSubfolders) .Where(r => r != null).ToList(); if (!result.Any()) return new List(); @@ -479,7 +479,7 @@ public void ReassignFiles(IEnumerable fileIds, Guid newOwnerId) } } - public List GetFiles(IEnumerable parentIds, FilterType filterType, bool subjectGroup, Guid subjectID, string searchText, bool searchInContent) + public List GetFiles(IEnumerable parentIds, FilterType filterType, bool subjectGroup, Guid subjectID, string searchText, bool searchInContent, string extension) { var result = Enumerable.Empty(); @@ -496,7 +496,7 @@ public List GetFiles(IEnumerable parentIds, FilterType filterType, using (var fileDao = selectorLocal.GetFileDao(matchedId.FirstOrDefault())) { return fileDao.GetFiles(matchedId.Select(selectorLocal.ConvertId).ToList(), - filterType, subjectGroup, subjectID, searchText, searchInContent); + filterType, subjectGroup, subjectID, searchText, searchInContent, extension); } })); } diff --git a/module/ASC.Files.Thirdparty/SharePoint/SharePointFileDao.cs b/module/ASC.Files.Thirdparty/SharePoint/SharePointFileDao.cs index e15253ca1..d1fe65e0b 100644 --- a/module/ASC.Files.Thirdparty/SharePoint/SharePointFileDao.cs +++ b/module/ASC.Files.Thirdparty/SharePoint/SharePointFileDao.cs @@ -76,7 +76,7 @@ public List GetFiles(IEnumerable fileIds) return fileIds.Select(fileId => ProviderInfo.ToFile(ProviderInfo.GetFileById(fileId))).ToList(); } - public List GetFilesFiltered(IEnumerable fileIds, FilterType filterType, bool subjectGroup, Guid subjectID, string searchText, bool searchInContent) + public List GetFilesFiltered(IEnumerable fileIds, FilterType filterType, bool subjectGroup, Guid subjectID, string searchText, bool searchInContent, string extension) { if (fileIds == null || !fileIds.Any() || filterType == FilterType.FoldersOnly) return new List(); @@ -117,10 +117,11 @@ public List GetFilesFiltered(IEnumerable fileIds, FilterType filte }); break; case FilterType.ByExtension: - if (!string.IsNullOrEmpty(searchText)) + case FilterType.ByExtensionIncludeFolders: + if (!string.IsNullOrEmpty(extension)) { - searchText = searchText.Trim().ToLower(); - files = files.Where(x => FileUtility.GetFileExtension(x.Title).Equals(searchText)); + extension = extension.Trim().ToLower(); + files = files.Where(x => FileUtility.GetFileExtension(x.Title).Equals(extension)); } break; } @@ -136,7 +137,7 @@ public List GetFiles(object parentId) return ProviderInfo.GetFolderFiles(parentId).Select(r => ProviderInfo.ToFile(r).ID).ToList(); } - public List GetFiles(object parentId, OrderBy orderBy, FilterType filterType, bool subjectGroup, Guid subjectID, string searchText, bool searchInContent, bool withSubfolders = false) + public List GetFiles(object parentId, OrderBy orderBy, FilterType filterType, bool subjectGroup, Guid subjectID, string searchText, bool searchInContent, string extension, bool withSubfolders = false) { if (filterType == FilterType.FoldersOnly) return new List(); @@ -178,10 +179,11 @@ public List GetFiles(object parentId, OrderBy orderBy, FilterType filterTy }); break; case FilterType.ByExtension: - if (!string.IsNullOrEmpty(searchText)) + case FilterType.ByExtensionIncludeFolders: + if (!string.IsNullOrEmpty(extension)) { - searchText = searchText.Trim().ToLower(); - files = files.Where(x => FileUtility.GetFileExtension(x.Title).Equals(searchText)); + extension = extension.Trim().ToLower(); + files = files.Where(x => FileUtility.GetFileExtension(x.Title).Equals(extension)); } break; } @@ -373,7 +375,7 @@ public void ReassignFiles(IEnumerable fileIds, Guid newOwnerId) { } - public List GetFiles(IEnumerable parentIds, FilterType filterType, bool subjectGroup, Guid subjectID, string searchText, bool searchInContent) + public List GetFiles(IEnumerable parentIds, FilterType filterType, bool subjectGroup, Guid subjectID, string searchText, bool searchInContent, string extension) { return new List(); } diff --git a/module/ASC.Files.Thirdparty/Sharpbox/SharpBoxFileDao.cs b/module/ASC.Files.Thirdparty/Sharpbox/SharpBoxFileDao.cs index 9c859bba1..3872c3bc7 100644 --- a/module/ASC.Files.Thirdparty/Sharpbox/SharpBoxFileDao.cs +++ b/module/ASC.Files.Thirdparty/Sharpbox/SharpBoxFileDao.cs @@ -80,7 +80,7 @@ public List GetFiles(IEnumerable fileIds) return fileIds.Select(fileId => ToFile(GetFileById(fileId))).ToList(); } - public List GetFilesFiltered(IEnumerable fileIds, FilterType filterType, bool subjectGroup, Guid subjectID, string searchText, bool searchInContent) + public List GetFilesFiltered(IEnumerable fileIds, FilterType filterType, bool subjectGroup, Guid subjectID, string searchText, bool searchInContent, string extension) { if (fileIds == null || !fileIds.Any() || filterType == FilterType.FoldersOnly) return new List(); @@ -121,10 +121,11 @@ public List GetFilesFiltered(IEnumerable fileIds, FilterType filte }); break; case FilterType.ByExtension: - if (!string.IsNullOrEmpty(searchText)) + case FilterType.ByExtensionIncludeFolders: + if (!string.IsNullOrEmpty(extension)) { - searchText = searchText.Trim().ToLower(); - files = files.Where(x => FileUtility.GetFileExtension(x.Title).Equals(searchText)); + extension = extension.Trim().ToLower(); + files = files.Where(x => FileUtility.GetFileExtension(x.Title).Equals(extension)); } break; } @@ -144,7 +145,7 @@ public List GetFiles(object parentId) .Select(x => (object)MakeId(x)).ToList(); } - public List GetFiles(object parentId, OrderBy orderBy, FilterType filterType, bool subjectGroup, Guid subjectID, string searchText, bool searchInContent, bool withSubfolders = false) + public List GetFiles(object parentId, OrderBy orderBy, FilterType filterType, bool subjectGroup, Guid subjectID, string searchText, bool searchInContent, string extension, bool withSubfolders = false) { if (filterType == FilterType.FoldersOnly) return new List(); @@ -186,10 +187,11 @@ public List GetFiles(object parentId, OrderBy orderBy, FilterType filterTy }); break; case FilterType.ByExtension: - if (!string.IsNullOrEmpty(searchText)) + case FilterType.ByExtensionIncludeFolders: + if (!string.IsNullOrEmpty(extension)) { - searchText = searchText.Trim().ToLower(); - files = files.Where(x => FileUtility.GetFileExtension(x.Title).Equals(searchText)); + extension = extension.Trim().ToLower(); + files = files.Where(x => FileUtility.GetFileExtension(x.Title).Equals(extension)); } break; } @@ -595,7 +597,7 @@ public void ReassignFiles(IEnumerable fileIds, Guid newOwnerId) { } - public List GetFiles(IEnumerable parentIds, FilterType filterType, bool subjectGroup, Guid subjectID, string searchText, bool searchInContent) + public List GetFiles(IEnumerable parentIds, FilterType filterType, bool subjectGroup, Guid subjectID, string searchText, bool searchInContent, string extension) { return new List(); } diff --git a/module/ASC.Files.ThumbnailBuilder/Builder.cs b/module/ASC.Files.ThumbnailBuilder/Builder.cs index 4d3f52d38..1a8a20072 100644 --- a/module/ASC.Files.ThumbnailBuilder/Builder.cs +++ b/module/ASC.Files.ThumbnailBuilder/Builder.cs @@ -204,8 +204,7 @@ private bool GetThumbnailUrl(File file, string toExtension, out string url) var thumbnailAspect = config.ThumbnailAspect; var thumbnail = GetThumbnailData(thumbnailAspect); var spreadsheetLayout = GetSpreadsheetLayout(thumbnailAspect); - - var operationResultProgress = DocumentServiceConnector.GetConvertedUri(fileUri, fileExtension, toExtension, docKey, null, null, thumbnail, spreadsheetLayout, false, out url); + var operationResultProgress = DocumentServiceConnector.GetConvertedUri(fileUri, fileExtension, toExtension, docKey, null, null, thumbnail, spreadsheetLayout, false, out url, out _); operationResultProgress = Math.Min(operationResultProgress, 100); return operationResultProgress == 100; diff --git a/module/ASC.Files.ThumbnailBuilder/ConfigSection.cs b/module/ASC.Files.ThumbnailBuilder/ConfigSection.cs index fa9b30617..9fa32f3c5 100644 --- a/module/ASC.Files.ThumbnailBuilder/ConfigSection.cs +++ b/module/ASC.Files.ThumbnailBuilder/ConfigSection.cs @@ -47,7 +47,7 @@ public string ConnectionStringName get { return (string)this["connectionStringName"]; } } - [ConfigurationProperty("formats", DefaultValue = ".pptx|.pptm|.ppt|.ppsx|.ppsm|.pps|.potx|.potm|.pot|.odp|.fodp|.otp|.gslides|.xlsx|.xlsm|.xls|.xltx|.xltm|.xlt|.ods|.fods|.ots|.gsheet|.csv|.docx|.docxf|.oform|.docm|.doc|.dotx|.dotm|.dot|.odt|.fodt|.ott|.gdoc|.txt|.rtf|.mht|.html|.htm|.fb2|.epub|.pdf|.djvu|.xps|.oxps|.bmp|.jpeg|.jpg|.png|.gif|.tiff|.tif|.ico")] + [ConfigurationProperty("formats", DefaultValue = ".dps|.dpt|.fodp|.odp|.otp|.pot|.potm|.potx|.pps|.ppsm|.ppsx|.ppt|.pptm|.pptx|.sxi|.csv|.et|.ett|.fods|.ods|.ots|.sxc|.xls|.xlsb|.xlsm|.xlsx|.xlt|.xltm|.xltx|.xml|.djvu|.doc|.docm|.docx|.docxf|.oform|.dot|.dotm|.dotx|.epub|.fb2|.fodt|.htm|.html|.mht|.mhtml|.odt|.ott|.oxps|.pdf|.rtf|.stw|.sxw|.txt|.wps|.wpt|.xml|.xps|.bmp|.jpeg|.jpg|.png|.gif|.tiff|.tif|.ico")] public string Formats { get { return (string)this["formats"]; } diff --git a/module/ASC.Mail/ASC.Mail/ASC.Mail.csproj b/module/ASC.Mail/ASC.Mail/ASC.Mail.csproj index 16eb2a74c..077dd312c 100644 --- a/module/ASC.Mail/ASC.Mail/ASC.Mail.csproj +++ b/module/ASC.Mail/ASC.Mail/ASC.Mail.csproj @@ -558,7 +558,7 @@ 1.6.0.1 - 4.1.11 + 4.2.0 2.15.0 @@ -575,6 +575,9 @@ 106.12.0 + + 4.3.0 + 1.1.0 diff --git a/module/ASC.Mail/ASC.Mail/Utils/MailUtil.cs b/module/ASC.Mail/ASC.Mail/Utils/MailUtil.cs index 48330f0fd..1fe575281 100644 --- a/module/ASC.Mail/ASC.Mail/Utils/MailUtil.cs +++ b/module/ASC.Mail/ASC.Mail/Utils/MailUtil.cs @@ -225,7 +225,7 @@ public static string SerializeCalendar(Ical.Net.Calendar calendar) { try { - var serializer = new Ical.Net.Serialization.CalendarSerializer(calendar); + var serializer = new Ical.Net.Serialization.ComponentSerializer(); return serializer.SerializeToString(calendar); } catch (Exception) diff --git a/module/ASC.Mail/Services/ASC.Mail.Aggregator.CollectionService/ASC.Mail.Aggregator.CollectionService.csproj b/module/ASC.Mail/Services/ASC.Mail.Aggregator.CollectionService/ASC.Mail.Aggregator.CollectionService.csproj deleted file mode 100644 index b9be43196..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.Aggregator.CollectionService/ASC.Mail.Aggregator.CollectionService.csproj +++ /dev/null @@ -1,147 +0,0 @@ - - - - Debug - AnyCPU - 9.0.30729 - 2.0 - {2EBFAA3E-AF1D-4A30-B16A-4E8AE053E063} - Exe - Properties - ASC.Mail.Aggregator.CollectionService - ASC.Mail.Aggregator.CollectionService - v4.8 - 512 - - - - - 3.5 - - publish\ - true - Disk - false - Foreground - 7 - Days - false - false - true - 0 - 1.0.0.%2a - false - false - true - bin\$(Configuration)\ - - - true - full - false - DEBUG;TRACE - prompt - 4 - false - false - bin\Debug\ASC.Mail.Aggregator.CollectionService.xml - CS1591 - - - none - true - TRACE - prompt - 4 - false - false - - - - Component - - - - - - - - - - - - - - - - web.consumers.config - PreserveNewest - Designer - - - web.autofac.config - PreserveNewest - - - Designer - Always - - - PreserveNewest - Designer - - - PreserveNewest - Designer - - - - - {76de7717-3d4b-4a5b-b740-15b8913df0cb} - ASC.Common - - - {a51d0454-4afa-46de-89d4-b03d37e1816c} - ASC.Core.Common - - - {448851d4-e525-4acc-9ae4-7aec289445bc} - ASC.Data.Encryption - - - {3f6b420f-abd3-4b5a-9f4c-5d61ffbb01de} - ASC.Data.Storage - - - {ae1a0e06-6cd4-4e1d-8209-22bbbd6d5652} - ASC.ElasticSearch - - - {7080343d-fbe7-423a-9405-4f883f6e235b} - ASC.Mail - - - - - 2.8.0 - - - 5.0.11 - - - 2.0.9 - - - 2.15.0 - - - 0.8.5 - - - - - - - - - \ No newline at end of file diff --git a/module/ASC.Mail/Services/ASC.Mail.Aggregator.CollectionService/AggregatorService.cs b/module/ASC.Mail/Services/ASC.Mail.Aggregator.CollectionService/AggregatorService.cs deleted file mode 100644 index 6938acc7f..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.Aggregator.CollectionService/AggregatorService.cs +++ /dev/null @@ -1,1119 +0,0 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2023 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - -using System; -using System.Collections.Concurrent; -using System.Collections.Generic; -using System.Configuration; -using System.Diagnostics; -using System.Globalization; -using System.IO; -using System.Linq; -using System.Net; -using System.ServiceModel; -using System.ServiceProcess; -using System.Threading; -using System.Threading.Tasks; - -using ASC.Core; -using ASC.Mail.Aggregator.CollectionService.Queue; -using ASC.Mail.Aggregator.CollectionService.Queue.Data; -using ASC.Mail.Clients; -using ASC.Mail.Core; -using ASC.Mail.Core.Dao.Expressions.Mailbox; -using ASC.Mail.Core.Engine; -using ASC.Mail.Data.Contracts; -using ASC.Mail.Data.Storage; -using ASC.Mail.Extensions; -using ASC.Mail.Utils; - -using MailKit.Net.Imap; -using MailKit.Net.Pop3; -using MailKit.Security; - -using MimeKit; - -using ILog = ASC.Common.Logging.ILog; -using LogManager = ASC.Common.Logging.LogManager; - -namespace ASC.Mail.Aggregator.CollectionService -{ - public sealed class AggregatorService : ServiceBase - { - public const string ASC_MAIL_COLLECTION_SERVICE_NAME = "ASC Mail Collection Service"; - - private const string S_FAIL = "error"; - private const string S_OK = "success"; - - private const string PROCESS_MESSAGE = "process message"; - private const string PROCESS_MAILBOX = "process mailbox"; - private const string CONNECT_MAILBOX = "connect mailbox"; - - private readonly ILog _log; - private readonly ILog _logStat; - private readonly CancellationTokenSource _cancelTokenSource; - private ManualResetEvent _resetEvent; - private Timer _workTimer; - private readonly TasksConfig _tasksConfig; - private readonly QueueManager _queueManager; - readonly TaskFactory _taskFactory; - private readonly TimeSpan _tsTaskStateCheckInterval; - private bool _isFirstTime = true; - private static SignalrWorker _signalrWorker; - private const int SIGNALR_WAIT_SECONDS = 30; - private readonly TimeSpan _taskSecondsLifetime; - private ServiceHost _healthCheckServiceHost; - - public ConcurrentDictionary> Filters { get; set; } - - public AggregatorService(Options options) - { - ServiceName = ASC_MAIL_COLLECTION_SERVICE_NAME; - EventLog.Log = "Application"; - - // These Flags set whether or not to handle that specific - // type of event. Set to true if you need it, false otherwise. - CanHandlePowerEvent = false; - CanHandleSessionChangeEvent = false; - CanPauseAndContinue = false; - CanShutdown = true; - CanStop = true; - try - { - _log = LogManager.GetLogger("ASC.Mail.MainThread"); - - _logStat = LogManager.GetLogger("ASC.Mail.Stat"); - - _tasksConfig = TasksConfig.FromConfig; - - var mailSettings = new MailQueueItemSettings(); - - _tasksConfig.DefaultFolders = mailSettings.DefaultFolders; - - _tasksConfig.ImapFlags = mailSettings.ImapFlags; - - _tasksConfig.SkipImapFlags = mailSettings.SkipImapFlags; - - _tasksConfig.SpecialDomainFolders = mailSettings.SpecialDomainFolders; - - if (options.OnlyUsers != null) - _tasksConfig.WorkOnUsersOnly.AddRange(options.OnlyUsers.ToList()); - - if (options.NoMessagesLimit) - _tasksConfig.MaxMessagesPerSession = -1; - - _taskSecondsLifetime = - TimeSpan.FromSeconds(ConfigurationManagerExtension.AppSettings["mail.task-process-lifetime-seconds"] != null - ? Convert.ToInt32(ConfigurationManagerExtension.AppSettings["mail.task-process-lifetime-seconds"]) - : 300); - - _queueManager = new QueueManager(_tasksConfig, _log); - - _cancelTokenSource = new CancellationTokenSource(); - - _taskFactory = new TaskFactory(); - - _tsTaskStateCheckInterval = ConfigurationManagerExtension.AppSettings["mail.task-check-state-seconds"] != null - ? TimeSpan.FromSeconds( - Convert.ToInt32(ConfigurationManagerExtension.AppSettings["mail.task-check-state-seconds"])) - : TimeSpan.FromSeconds(30); - - if (_tasksConfig.EnableSignalr) - _signalrWorker = new SignalrWorker(); - - _workTimer = new Timer(workTimer_Elapsed, _cancelTokenSource.Token, Timeout.Infinite, Timeout.Infinite); - - Filters = new ConcurrentDictionary>(); - - _log.Info("Service is ready."); - } - catch (Exception ex) - { - _log.FatalFormat("CollectorService error under construct: {0}", ex.ToString()); - - throw ex; - } - } - - #region - Overrides base - - - /// - /// OnStart(): Put startup code here - /// - Start threads, get inital data, etc. - /// - /// - protected override void OnStart(string[] args) - { - try - { - _log.Info("Start service\r\n"); - - base.OnStart(args); - - _healthCheckServiceHost = new ServiceHost(typeof(HealthCheckService)); - _healthCheckServiceHost.Open(); - - StartTimer(true); - } - catch (Exception ex) - { - _log.Fatal("OnStart", ex); - OnStop(); - } - } - - /// - /// OnStop(): Put your stop code here - /// - Stop threads, set final data, etc. - /// - protected override void OnStop() - { - try - { - _log.Info("Stoping service\r\n"); - - if (_cancelTokenSource != null) - _cancelTokenSource.Cancel(); - - if (_queueManager != null) - _queueManager.CancelHandler.WaitOne(); - - StopTimer(); - - if (_workTimer != null) - { - _workTimer.Dispose(); - _workTimer = null; - } - - if (_queueManager != null) - _queueManager.Dispose(); - - if (_signalrWorker != null) - _signalrWorker.Dispose(); - } - catch (Exception ex) - { - _log.ErrorFormat("Stop service Error: {0}\r\n", ex.ToString()); - } - finally - { - _log.Info("Stop service\r\n"); - - base.OnStop(); - - if (_resetEvent != null) - _resetEvent.Set(); - - if (_healthCheckServiceHost != null) - { - _healthCheckServiceHost.Close(); - _healthCheckServiceHost = null; - } - - } - } - - /// - /// OnShutdown(): Called when the System is shutting down - /// - Put code here when you need special handling - /// of code that deals with a system shutdown, such - /// as saving special data before shutdown. - /// - protected override void OnShutdown() - { - _log.Info("Service shutdown."); - OnStop(); - base.OnShutdown(); - } - - /// - /// OnPowerEvent(): Useful for detecting power status changes, - /// such as going into Suspend mode or Low Battery for laptops. - /// - /// The Power Broadcast Status - /// (BatteryLow, Suspend, etc.) - protected override bool OnPowerEvent(PowerBroadcastStatus powerStatus) - { - _log.InfoFormat("Service power event detected = {0}.", powerStatus.ToString()); - - if (powerStatus == PowerBroadcastStatus.Suspend) - { - OnStop(); - } - return base.OnPowerEvent(powerStatus); - } - - /// - /// Start service in console mode. - /// - public void StartConsole() - { - _log.Info("Service Start in console-daemon mode"); - OnStart(null); - _resetEvent = new ManualResetEvent(false); - Console.CancelKeyPress += (sender, e) => OnStop(); - _resetEvent.WaitOne(); - } - - #endregion - - #region - Timer_Elapsed - - - private void workTimer_Elapsed(object state) - { - _log.Debug("Timer->workTimer_Elapsed"); - - var cancelToken = state as CancellationToken? ?? new CancellationToken(); - - try - { - if (_isFirstTime) - { - _queueManager.LoadMailboxesFromDump(); - - if (_queueManager.ProcessingCount > 0) - { - _log.InfoFormat("Found {0} tasks to release", _queueManager.ProcessingCount); - - _queueManager.ReleaseAllProcessingMailboxes(); - } - - _queueManager.LoadTenantsFromDump(); - - _isFirstTime = false; - } - - if (cancelToken.IsCancellationRequested) - { - _log.Debug("Timer->workTimer_Elapsed: IsCancellationRequested. Quit."); - return; - } - - if (_workTimer == null) - { - _log.Debug("Timer->workTimer_Elapsed: _workTimer == null. Quit."); - OnStop(); - return; - } - - StopTimer(); - - var tasks = CreateTasks(_tasksConfig.MaxTasksAtOnce, cancelToken); - - // ***Add a loop to process the tasks one at a time until none remain. - while (tasks.Any()) - { - // Identify the first task that completes. - var indexTask = Task.WaitAny(tasks.Select(t => t.Task).ToArray(), (int)_tsTaskStateCheckInterval.TotalMilliseconds, cancelToken); - if (indexTask > -1) - { - // ***Remove the selected task from the list so that you don't - // process it more than once. - var outTask = tasks[indexTask]; - - FreeTask(outTask, tasks); - } - else - { - _log.InfoFormat("Task.WaitAny timeout. Tasks count = {0}\r\nTasks:\r\n{1}", tasks.Count, - string.Join("\r\n", - tasks.Select( - t => - string.Format("Id: {0} Status: {1}, MailboxId: {2} Address: '{3}'", - t.Task.Id, t.Task.Status, t.Mailbox.MailBoxId, t.Mailbox.EMail)))); - } - - var tasks2Free = - tasks.Where( - t => - t.Task.Status == TaskStatus.Canceled || t.Task.Status == TaskStatus.Faulted || - t.Task.Status == TaskStatus.RanToCompletion).ToList(); - - if (tasks2Free.Any()) - { - _log.InfoFormat("Need free next tasks = {0}: ({1})", tasks2Free.Count, - string.Join(",", - tasks2Free.Select(t => t.Task.Id.ToString(CultureInfo.InvariantCulture)))); - - tasks2Free.ForEach(task => FreeTask(task, tasks)); - } - - var difference = _tasksConfig.MaxTasksAtOnce - tasks.Count; - - if (difference <= 0) continue; - - var newTasks = CreateTasks(difference, cancelToken); - - tasks.AddRange(newTasks); - - _log.InfoFormat("Total tasks count = {0} ({1}).", tasks.Count, - string.Join(",", tasks.Select(t => t.Task.Id))); - } - - _log.Info("All mailboxes were processed. Go back to timer."); - } - catch (Exception ex) - { - if (ex is AggregateException) - { - ex = ((AggregateException)ex).GetBaseException(); - } - - if (ex is TaskCanceledException || ex is OperationCanceledException) - { - _log.Info("Execution was canceled."); - - _queueManager.ReleaseAllProcessingMailboxes(); - - _queueManager.CancelHandler.Set(); - - return; - } - - _log.ErrorFormat("Timer->workTimer_Elapsed. Exception:\r\n{0}\r\n", ex.ToString()); - - if (_queueManager.ProcessingCount != 0) - { - _queueManager.ReleaseAllProcessingMailboxes(); - } - } - - _queueManager.CancelHandler.Set(); - - StartTimer(); - } - - private void StartTimer(bool immediately = false) - { - if (_workTimer == null) - return; - - _log.DebugFormat("Setup _workTimer to {0} seconds", _tasksConfig.CheckTimerInterval.TotalSeconds); - if (immediately) - { - _workTimer.Change(0, Timeout.Infinite); - } - else - { - _workTimer.Change(_tasksConfig.CheckTimerInterval, _tasksConfig.CheckTimerInterval); - } - } - - private void StopTimer() - { - if (_workTimer == null) - return; - - _log.Debug("Setup _workTimer to Timeout.Infinite"); - _workTimer.Change(Timeout.Infinite, Timeout.Infinite); - } - - private void NotifySignalrIfNeed(MailBoxData mailbox, ILog log) - { - if (!_tasksConfig.EnableSignalr) - { - log.Debug("Skip NotifySignalrIfNeed: EnableSignalr == false"); - - return; - } - - var now = DateTime.UtcNow; - - try - { - if (mailbox.LastSignalrNotify.HasValue && - !((now - mailbox.LastSignalrNotify.Value).TotalSeconds > SIGNALR_WAIT_SECONDS)) - { - mailbox.LastSignalrNotifySkipped = true; - - log.InfoFormat( - "Skip NotifySignalrIfNeed: last notification has occurend less then {0} seconds ago", - SIGNALR_WAIT_SECONDS); - - return; - } - - if (_signalrWorker == null) - throw new NullReferenceException("_signalrWorker"); - - _signalrWorker.AddMailbox(mailbox); - - log.InfoFormat("NotifySignalrIfNeed(UserId = {0} TenantId = {1}) has been succeeded", - mailbox.UserId, mailbox.TenantId); - } - catch (Exception ex) - { - log.ErrorFormat("NotifySignalrIfNeed(UserId = {0} TenantId = {1}) Exception: {2}", mailbox.UserId, - mailbox.TenantId, ex.ToString()); - } - - mailbox.LastSignalrNotify = now; - mailbox.LastSignalrNotifySkipped = false; - } - - private List CreateTasks(int needCount, CancellationToken cancelToken) - { - _log.InfoFormat("CreateTasks(need {0} tasks).", needCount); - - var mailboxes = _queueManager.GetLockedMailboxes(needCount); - - var tasks = new List(); - - foreach (var mailbox in mailboxes) - { - var timeoutCancel = new CancellationTokenSource(_taskSecondsLifetime); - - var commonCancelToken = - CancellationTokenSource.CreateLinkedTokenSource(cancelToken, timeoutCancel.Token).Token; - - var taskLogger = LogManager.GetLogger(string.Format("ASC.Mail Mbox_{0}", mailbox.MailBoxId)); - - taskLogger.InfoFormat("CreateMailClient(Tenant = {0} MailboxId = {1}, Address = '{2}')", - mailbox.TenantId, mailbox.MailBoxId, mailbox.EMail); - - var client = CreateMailClient(mailbox, taskLogger, commonCancelToken); - - if (client == null || !client.IsConnected || !client.IsAuthenticated) - { - if (client != null) - taskLogger.InfoFormat("Client -> Could not connect: {0} | Not authenticated: {1}.", - !client.IsConnected ? "Yes" : "No", - !client.IsAuthenticated ? "Yes" : "No"); - else taskLogger.InfoFormat("Client was null"); - - taskLogger.InfoFormat("ReleaseMailbox(Tenant = {0} MailboxId = {1}, Address = '{2}')", - mailbox.TenantId, mailbox.MailBoxId, mailbox.EMail); - ReleaseMailbox(mailbox); - continue; - } - - var task = _taskFactory.StartNew(() => ProcessMailbox(client, _tasksConfig), - commonCancelToken); - - tasks.Add(new TaskData(mailbox, task)); - } - - if (tasks.Any()) - _log.InfoFormat("Created {0} tasks.", tasks.Count); - else - _log.Info("No more mailboxes for processing."); - - return tasks; - } - - private MailClient CreateMailClient(MailBoxData mailbox, ILog log, CancellationToken cancelToken) - { - MailClient client = null; - - var connectError = false; - var stopClient = false; - - Stopwatch watch = null; - - if (_tasksConfig.CollectStatistics) - { - watch = new Stopwatch(); - watch.Start(); - } - - try - { - client = new MailClient(mailbox, cancelToken, _tasksConfig.TcpTimeout, - mailbox.IsTeamlab || _tasksConfig.SslCertificateErrorsPermit, _tasksConfig.ProtocolLogPath, log, true); - - log.DebugFormat("MailClient.LoginImapPop(Tenant = {0}, MailboxId = {1} Address = '{2}')", - mailbox.TenantId, mailbox.MailBoxId, mailbox.EMail); - - if (!mailbox.Imap) - { - client.FuncGetPop3NewMessagesIDs = - uidls => MessageEngine.GetPop3NewMessagesIDs(mailbox, uidls, _tasksConfig.ChunkOfPop3Uidl); - } - - client.Authenticated += ClientOnAuthenticated; - - client.LoginImapPop(); - } - catch (System.TimeoutException exTimeout) - { - log.WarnFormat( - "[TIMEOUT] CreateTasks->client.LoginImapPop(Tenant = {0}, MailboxId = {1}, Address = '{2}') Exception: {3}", - mailbox.TenantId, mailbox.MailBoxId, mailbox.EMail, exTimeout.ToString()); - - connectError = true; - stopClient = true; - } - catch (OperationCanceledException) - { - log.InfoFormat( - "[CANCEL] CreateTasks->client.LoginImapPop(Tenant = {0}, MailboxId = {1}, Address = '{2}')", - mailbox.TenantId, mailbox.MailBoxId, mailbox.EMail); - stopClient = true; - } - catch (AuthenticationException authEx) - { - log.ErrorFormat( - "CreateTasks->client.LoginImapPop(Tenant = {0}, MailboxId = {1}, Address = '{2}')\r\nException: {3}\r\n", - mailbox.TenantId, mailbox.MailBoxId, mailbox.EMail, authEx.ToString()); - - connectError = true; - stopClient = true; - } - catch (WebException webEx) - { - log.ErrorFormat( - "CreateTasks->client.LoginImapPop(Tenant = {0}, MailboxId = {1}, Address = '{2}')\r\nException: {3}\r\n", - mailbox.TenantId, mailbox.MailBoxId, mailbox.EMail, webEx.ToString()); - - connectError = true; - stopClient = true; - } - catch (ImapProtocolException protocolEx) - { - log.ErrorFormat( - $"CreateTasks() -> MailClient.LoginImap(Tenant = {mailbox.TenantId}, MailboxId = {mailbox.MailBoxId}, Address = \"{mailbox.EMail}\")\r\nThe box will be disabled.\r\nImap Protocol Exception: {protocolEx}\r\n"); - - connectError = true; - stopClient = true; - } - catch (Exception ex) - { - log.ErrorFormat( - "CreateTasks->client.LoginImapPop(Tenant = {0}, MailboxId = {1}, Address = '{2}')\r\nException: {3}\r\n", - mailbox.TenantId, mailbox.MailBoxId, mailbox.EMail, - ex is ImapProtocolException || ex is Pop3ProtocolException ? ex.Message : ex.ToString()); - - stopClient = true; - } - finally - { - if (connectError) - { - SetMailboxAuthError(mailbox, log); - } - - if (stopClient) - { - CloseMailClient(client, mailbox, log); - } - - if (_tasksConfig.CollectStatistics && watch != null) - { - watch.Stop(); - - LogStat(CONNECT_MAILBOX, mailbox, watch.Elapsed, connectError); - } - } - - return client; - } - - private static void SetMailboxAuthError(MailBoxData mailbox, ILog log) - { - try - { - if (mailbox.AuthErrorDate.HasValue) - return; - - mailbox.AuthErrorDate = DateTime.UtcNow; - - var engine = new EngineFactory(mailbox.TenantId); - engine.MailboxEngine.SetMaiboxAuthError(mailbox.MailBoxId, mailbox.AuthErrorDate.Value); - } - catch (Exception ex) - { - log.ErrorFormat( - "CreateTasks->SetMailboxAuthError(Tenant = {0}, MailboxId = {1}, Address = '{2}') Exception: {3}", - mailbox.TenantId, mailbox.MailBoxId, mailbox.EMail, ex.Message); - } - } - - private void CloseMailClient(MailClient client, MailBoxData mailbox, ILog log) - { - if (client == null) - return; - - try - { - client.Authenticated -= ClientOnAuthenticated; - client.GetMessage -= ClientOnGetMessage; - - client.Cancel(); - client.Dispose(); - } - catch (Exception ex) - { - log.ErrorFormat( - "CloseMailClient(Tenant = {0}, MailboxId = {1}, Address = '{2}') Exception: {3}", - mailbox.TenantId, mailbox.MailBoxId, mailbox.EMail, ex.Message); - } - } - - private void ProcessMailbox(MailClient client, TasksConfig tasksConfig) - { - var mailbox = client.Account; - - Stopwatch watch = null; - - if (_tasksConfig.CollectStatistics) - { - watch = new Stopwatch(); - watch.Start(); - } - - var failed = false; - - var taskLogger = LogManager.GetLogger(string.Format("ASC.Mail Mbox_{0}", mailbox.MailBoxId)); - - taskLogger.InfoFormat( - "ProcessMailbox(Tenant = {0}, MailboxId = {1} Address = '{2}') Is {3}", - mailbox.TenantId, mailbox.MailBoxId, - mailbox.EMail, mailbox.Active ? "Active" : "Inactive"); - - try - { - client.Log = taskLogger; - - client.GetMessage += ClientOnGetMessage; - - client.Aggregate(tasksConfig, tasksConfig.MaxMessagesPerSession); - } - catch (OperationCanceledException) - { - taskLogger.InfoFormat( - "[CANCEL] ProcessMailbox(Tenant = {0}, MailboxId = {1}, Address = '{2}')", - mailbox.TenantId, mailbox.MailBoxId, mailbox.EMail); - - NotifySignalrIfNeed(mailbox, taskLogger); - } - catch (Exception ex) - { - taskLogger.ErrorFormat( - "ProcessMailbox(Tenant = {0}, MailboxId = {1}, Address = '{2}')\r\nException: {3}\r\n", - mailbox.TenantId, mailbox.MailBoxId, mailbox.EMail, - ex is ImapProtocolException || ex is Pop3ProtocolException ? ex.Message : ex.ToString()); - - failed = true; - } - finally - { - CloseMailClient(client, mailbox, _log); - - if (_tasksConfig.CollectStatistics && watch != null) - { - watch.Stop(); - - LogStat(PROCESS_MAILBOX, mailbox, watch.Elapsed, failed); - } - } - - var state = GetMailboxState(mailbox, taskLogger); - - switch (state) - { - case MailboxState.NoChanges: - taskLogger.InfoFormat("MailBox with id={0} not changed.", mailbox.MailBoxId); - break; - case MailboxState.Disabled: - taskLogger.InfoFormat("MailBox with id={0} is deactivated.", mailbox.MailBoxId); - break; - case MailboxState.Deleted: - taskLogger.InfoFormat("MailBox with id={0} is removed.", mailbox.MailBoxId); - - try - { - taskLogger.InfoFormat("RemoveMailBox(id={0}) >> Try clear new data from removed mailbox", mailbox.MailBoxId); - - var engine = new EngineFactory(mailbox.TenantId, mailbox.UserId); - engine.MailboxEngine.RemoveMailBox(mailbox); - } - catch (Exception exRem) - { - taskLogger.InfoFormat( - "[REMOVE] ProcessMailbox->RemoveMailBox(Tenant = {0}, MailboxId = {1}, Address = '{2}') Exception: {3}", - mailbox.TenantId, mailbox.MailBoxId, mailbox.EMail, exRem.Message); - } - break; - case MailboxState.DateChanged: - taskLogger.InfoFormat("MailBox with id={0}: beginDate was changed.", mailbox.MailBoxId); - break; - default: - throw new ArgumentOutOfRangeException(); - } - - taskLogger.InfoFormat("Mailbox '{0}' has been processed.", mailbox.EMail); - } - - private static void ClientOnAuthenticated(object sender, MailClientEventArgs mailClientEventArgs) - { - if (!mailClientEventArgs.Mailbox.AuthErrorDate.HasValue) - return; - - mailClientEventArgs.Mailbox.AuthErrorDate = null; - - var engine = new EngineFactory(mailClientEventArgs.Mailbox.TenantId); - engine.MailboxEngine.SetMaiboxAuthError(mailClientEventArgs.Mailbox.MailBoxId, mailClientEventArgs.Mailbox.AuthErrorDate); - } - - private void ClientOnGetMessage(object sender, MailClientMessageEventArgs mailClientMessageEventArgs) - { - var log = _log; - - Stopwatch watch = null; - - if (_tasksConfig.CollectStatistics) - { - watch = new Stopwatch(); - watch.Start(); - } - - var failed = false; - - var mailbox = mailClientMessageEventArgs.Mailbox; - - try - { - var mimeMessage = mailClientMessageEventArgs.Message; - var uid = mailClientMessageEventArgs.MessageUid; - var folder = mailClientMessageEventArgs.Folder; - var unread = mailClientMessageEventArgs.Unread; - log = mailClientMessageEventArgs.Logger; - - var uidl = mailbox.Imap ? string.Format("{0}-{1}", uid, (int)folder.Folder) : uid; - - log.InfoFormat("Found message (UIDL: '{0}', MailboxId = {1}, Address = '{2}')", - uidl, mailbox.MailBoxId, mailbox.EMail); - - CoreContext.TenantManager.SetCurrentTenant(mailbox.TenantId); - SecurityContext.CurrentUser = new Guid(mailbox.UserId); - - var message = MessageEngine.Save(mailbox, mimeMessage, uidl, folder, null, unread, log); - - if (message == null || message.Id <= 0) - { - return; - } - - log.InfoFormat("Message saved (id: {0}, From: '{1}', Subject: '{2}', Unread: {3})", - message.Id, message.From, message.Subject, message.IsNew); - - log.Info("DoOptionalOperations->START"); - - DoOptionalOperations(message, mimeMessage, mailbox, folder, log); - - log.Info("DoOptionalOperations->END"); - } - catch (Exception ex) - { - log.ErrorFormat("[ClientOnGetMessage] Exception:\r\n{0}\r\n", ex.ToString()); - - failed = true; - - throw ex; - } - finally - { - if (_tasksConfig.CollectStatistics && watch != null) - { - watch.Stop(); - - LogStat(PROCESS_MESSAGE, mailbox, watch.Elapsed, failed); - } - } - } - - enum MailboxState - { - NoChanges, - Disabled, - Deleted, - DateChanged - } - - private static MailboxState GetMailboxState(MailBoxData mailbox, ILog log) - { - try - { - log.Debug("GetMailBoxState()"); - - var engine = new EngineFactory(-1); - var status = engine.MailboxEngine.GetMailboxStatus(new СoncreteUserMailboxExp(mailbox.MailBoxId, mailbox.TenantId, mailbox.UserId, null)); - - if (mailbox.BeginDate != status.BeginDate) - { - mailbox.BeginDateChanged = true; - mailbox.BeginDate = status.BeginDate; - - return MailboxState.DateChanged; - } - - if (status.IsRemoved) - return MailboxState.Deleted; - - if (!status.Enabled) - return MailboxState.Disabled; - } - catch (Exception exGetMbInfo) - { - log.InfoFormat("GetMailBoxState(Tenant = {0}, MailboxId = {1}, Address = '{2}') Exception: {3}", - mailbox.TenantId, mailbox.MailBoxId, mailbox.EMail, exGetMbInfo.Message); - } - - return MailboxState.NoChanges; - } - - private readonly ConcurrentDictionary _userCrmAvailabeDictionary = new ConcurrentDictionary(); - private readonly object _locker = new object(); - - private bool IsCrmAvailable(MailBoxData mailbox, ILog log) - { - bool crmAvailable; - - lock (_locker) - { - if (_userCrmAvailabeDictionary.TryGetValue(mailbox.UserId, out crmAvailable)) - return crmAvailable; - - crmAvailable = mailbox.IsCrmAvailable(_tasksConfig.DefaultApiSchema, log); - _userCrmAvailabeDictionary.GetOrAdd(mailbox.UserId, crmAvailable); - } - - return crmAvailable; - } - - private List GetFilters(EngineFactory factory, ILog log) - { - var user = factory.UserId; - - if (string.IsNullOrEmpty(user)) - return new List(); - - try - { - if (Filters.ContainsKey(user)) return Filters[user]; - - var filters = factory.FilterEngine.GetList(); - - Filters.TryAdd(user, filters); - - return filters; - } - catch (Exception ex) - { - log.Error("GetFilters failed", ex); - } - - return new List(); - } - - private void DoOptionalOperations(MailMessageData message, MimeMessage mimeMessage, MailBoxData mailbox, MailFolder folder, ILog log) - { - try - { - var factory = new EngineFactory(mailbox.TenantId, mailbox.UserId, log); - - var tagIds = new List(); - - if (folder.Tags.Any()) - { - log.Debug("DoOptionalOperations->GetOrCreateTags()"); - - tagIds = factory.TagEngine.GetOrCreateTags(mailbox.TenantId, mailbox.UserId, folder.Tags); - } - - log.Debug("DoOptionalOperations->IsCrmAvailable()"); - - if (IsCrmAvailable(mailbox, log)) - { - log.Debug("DoOptionalOperations->GetCrmTags()"); - - var crmTagIds = factory.TagEngine.GetCrmTags(message.FromEmail); - - if (crmTagIds.Any()) - { - if (tagIds == null) - tagIds = new List(); - - tagIds.AddRange(crmTagIds.Select(t => t.Id)); - } - } - - if (tagIds.Any()) - { - if (message.TagIds == null || !message.TagIds.Any()) - message.TagIds = tagIds; - else - message.TagIds.AddRange(tagIds); - - message.TagIds = message.TagIds.Distinct().ToList(); - } - - log.Debug("DoOptionalOperations->AddMessageToIndex()"); - - var wrapper = message.ToMailWrapper(mailbox.TenantId, new Guid(mailbox.UserId)); - - factory.IndexEngine.Add(wrapper); - - foreach (var tagId in tagIds) - { - try - { - log.DebugFormat("DoOptionalOperations->SetMessagesTag(tagId: {0})", tagId); - - factory.TagEngine.SetMessagesTag(new List { message.Id }, tagId); - } - catch (Exception e) - { - log.ErrorFormat( - "SetMessagesTag(tenant={0}, userId='{1}', messageId={2}, tagid = {3}) Exception:\r\n{4}\r\n", - mailbox.TenantId, mailbox.UserId, message.Id, e.ToString(), - tagIds != null ? string.Join(",", tagIds) : "null"); - } - } - - log.Debug("DoOptionalOperations->AddRelationshipEventForLinkedAccounts()"); - - factory.CrmLinkEngine.AddRelationshipEventForLinkedAccounts(mailbox, message, _tasksConfig.DefaultApiSchema); - - log.Debug("DoOptionalOperations->SaveEmailInData()"); - - factory.EmailInEngine.SaveEmailInData(mailbox, message, _tasksConfig.DefaultApiSchema); - - log.Debug("DoOptionalOperations->SendAutoreply()"); - - factory.AutoreplyEngine.SendAutoreply(mailbox, message, _tasksConfig.DefaultApiSchema, log); - - log.Debug("DoOptionalOperations->UploadIcsToCalendar()"); - - if (folder.Folder != Enums.FolderType.Spam) - { - factory - .CalendarEngine - .UploadIcsToCalendar(mailbox, message.CalendarId, message.CalendarUid, message.CalendarEventIcs, - message.CalendarEventCharset, message.CalendarEventMimeType, message.Attachments, mimeMessage.Attachments, mailbox.EMail.Address, - _tasksConfig.DefaultApiSchema); - } - - if (_tasksConfig.SaveOriginalMessage) - { - log.Debug("DoOptionalOperations->StoreMailEml()"); - StoreMailEml(mailbox.TenantId, mailbox.UserId, message.StreamId, mimeMessage, log); - } - - log.Debug("DoOptionalOperations->ApplyFilters()"); - - var filters = GetFilters(factory, log); - - factory.FilterEngine.ApplyFilters(message, mailbox, folder, filters); - - log.Debug("DoOptionalOperations->NotifySignalrIfNeed()"); - - NotifySignalrIfNeed(mailbox, log); - } - catch (Exception ex) - { - log.ErrorFormat("DoOptionalOperations() Exception:\r\n{0}\r\n", ex.ToString()); - } - } - - public string StoreMailEml(int tenant, string user, string streamId, MimeMessage message, ILog log) - { - if (message == null) - return string.Empty; - - // Using id_user as domain in S3 Storage - allows not to add quota to tenant. - var savePath = MailStoragePathCombiner.GetEmlKey(user, streamId); - var storage = MailDataStore.GetDataStore(tenant); - - try - { - using (var stream = new MemoryStream()) - { - message.WriteTo(stream); - - var res = storage.Save(savePath, stream, MailStoragePathCombiner.EML_FILE_NAME).ToString(); - - log.InfoFormat("StoreMailEml() tenant='{0}', user_id='{1}', save_eml_path='{2}' Result: {3}", tenant, user, savePath, res); - - return res; - } - } - catch (Exception ex) - { - log.ErrorFormat("StoreMailEml Exception: {0}", ex.ToString()); - } - - return string.Empty; - } - - private void FreeTask(TaskData taskData, ICollection tasks) - { - try - { - _log.DebugFormat("End Task {0} with status = '{1}'.", taskData.Task.Id, taskData.Task.Status); - - if (!tasks.Remove(taskData)) - _log.Error("Task not exists in tasks array."); - - var mailbox = taskData.Mailbox; - - ReleaseMailbox(mailbox); - - taskData.Task.Dispose(); - } - catch (Exception ex) - { - _log.ErrorFormat("FreeTask(id:'{0}', email:'{1}'): Exception:\r\n{2}\r\n", taskData.Mailbox.MailBoxId, taskData.Mailbox.EMail, ex.ToString()); - } - } - - private void ReleaseMailbox(MailBoxData mailbox) - { - if (mailbox == null) - return; - - if (mailbox.LastSignalrNotifySkipped) - NotifySignalrIfNeed(mailbox, _log); - - _queueManager.ReleaseMailbox(mailbox); - - if (!Filters.ContainsKey(mailbox.UserId)) - return; - - List filters; - if (!Filters.TryRemove(mailbox.UserId, out filters)) - { - _log.Error("Try forget Filters for user failed"); - } - } - - private void LogStat(string method, MailBoxData mailBoxData, TimeSpan duration, bool failed) - { - if (!_tasksConfig.CollectStatistics) - return; - - _logStat.DebugWithProps(method, - new KeyValuePair("duration", duration.TotalMilliseconds), - new KeyValuePair("mailboxId", mailBoxData.MailBoxId), - new KeyValuePair("address", mailBoxData.EMail.ToString()), - new KeyValuePair("status", failed ? S_FAIL : S_OK)); - } - - #endregion - } -} \ No newline at end of file diff --git a/module/ASC.Mail/Services/ASC.Mail.Aggregator.CollectionService/App.config b/module/ASC.Mail/Services/ASC.Mail.Aggregator.CollectionService/App.config deleted file mode 100644 index 1a5cdd77d..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.Aggregator.CollectionService/App.config +++ /dev/null @@ -1,111 +0,0 @@ - - - -
-
-
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/module/ASC.Mail/Services/ASC.Mail.Aggregator.CollectionService/HealthCheckService.cs b/module/ASC.Mail/Services/ASC.Mail.Aggregator.CollectionService/HealthCheckService.cs deleted file mode 100644 index 4961d7652..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.Aggregator.CollectionService/HealthCheckService.cs +++ /dev/null @@ -1,37 +0,0 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2023 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - -using ASC.Core.Common.Contracts; - -namespace ASC.Mail.Aggregator.CollectionService -{ - public class HealthCheckService : IHealthCheckService - { - #region - HealthCheck - - - public HealthCheckResponse CheckHealth() - { - return HealthCheckResult.ToResponse(new HealthCheckResult - { - Message = "Service MailAggregator is OK! Warning: Method is not implement. Always return the Healthy status", - Status = HealthStatus.Healthy - }); - } - - #endregion - } -} diff --git a/module/ASC.Mail/Services/ASC.Mail.Aggregator.CollectionService/Program.Options.cs b/module/ASC.Mail/Services/ASC.Mail.Aggregator.CollectionService/Program.Options.cs deleted file mode 100644 index d0abbe4a7..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.Aggregator.CollectionService/Program.Options.cs +++ /dev/null @@ -1,38 +0,0 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2023 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - -using System.Collections.Generic; - -using CommandLine; -using CommandLine.Text; - -namespace ASC.Mail.Aggregator.CollectionService -{ - public class Options - { - [Option('u', "users", MetaValue = "STRING ARRAY", Required = false, HelpText = "An array of users for which the aggregator will take tasks. " + - "Separator = ';' " + - "Example: -u\"{tl_userId_1}\";\"{tl_userId_2}\";\"{tl_userId_3}\"", Separator = ';')] - public IList OnlyUsers { get; set; } - - [Option("console", Required = false, HelpText = "Console state")] - public bool IsConsole { get; set; } - - [Option("unlimit", Required = false, HelpText = "Unlimit messages per mailbox session")] - public bool NoMessagesLimit { get; set; } - } -} diff --git a/module/ASC.Mail/Services/ASC.Mail.Aggregator.CollectionService/Program.cs b/module/ASC.Mail/Services/ASC.Mail.Aggregator.CollectionService/Program.cs deleted file mode 100644 index 8635108bb..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.Aggregator.CollectionService/Program.cs +++ /dev/null @@ -1,62 +0,0 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2023 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - -using System; -using System.Linq; -using System.ServiceProcess; - -using ASC.Common.Logging; - -using CommandLine; - -namespace ASC.Mail.Aggregator.CollectionService -{ - internal class Program - { - private static void Main(string[] args) - { - AppDomain.CurrentDomain.UnhandledException += OnUnhandledException; - - var options = new Options(); - - if (args.Any()) - { - - Parser.Default.ParseArguments(args) - .WithNotParsed(x => Console.WriteLine(@"Bad command line parameters.")) - .WithParsed(x => options = x); - } - - if (Environment.UserInteractive || options.IsConsole) - { - var service = new AggregatorService(options); - service.StartConsole(); - } - else - { - ServiceBase.Run(new AggregatorService(options)); - } - } - - - private static void OnUnhandledException(object sender, UnhandledExceptionEventArgs e) - { - var log = LogManager.GetLogger("ASC.Mail.Aggregator"); - log.FatalFormat("Unhandled exception: {0}", e.ExceptionObject.ToString()); - } - } -} \ No newline at end of file diff --git a/module/ASC.Mail/Services/ASC.Mail.Aggregator.CollectionService/Properties/AssemblyInfo.cs b/module/ASC.Mail/Services/ASC.Mail.Aggregator.CollectionService/Properties/AssemblyInfo.cs deleted file mode 100644 index 7a068e63d..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.Aggregator.CollectionService/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,35 +0,0 @@ -using System.Reflection; -using System.Runtime.InteropServices; - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyTitle("ASC.Mail.Aggregator.CollectionService")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("Ascensio System SIA")] -[assembly: AssemblyProduct("ASC.Mail.Aggregator.CollectionService")] -[assembly: AssemblyCopyright("(c) Ascensio System SIA. All rights reserved")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("7d2be6c9-b628-4705-bdd1-1d58719b1c1e")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Build and Revision Numbers -// by using the '*' as shown below: -// [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("2.0.*")] -[assembly: AssemblyFileVersion("2.0.0.1")] diff --git a/module/ASC.Mail/Services/ASC.Mail.Aggregator.CollectionService/Queue/Data/Extensions.cs b/module/ASC.Mail/Services/ASC.Mail.Aggregator.CollectionService/Queue/Data/Extensions.cs deleted file mode 100644 index 5dddff673..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.Aggregator.CollectionService/Queue/Data/Extensions.cs +++ /dev/null @@ -1,56 +0,0 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2023 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - -using System.Net.Mail; - -using ASC.Mail.Data.Contracts; - -namespace ASC.Mail.Aggregator.CollectionService.Queue.Data -{ - public static class Extensions - { - public static MailBoxData ToMailbox(this MailboxData mailboxData) - { - return new MailBoxData - { - TenantId = mailboxData.TenantId, - UserId = mailboxData.UserId, - MailBoxId = mailboxData.MailboxId, - EMail = new MailAddress(mailboxData.EMail), - Imap = mailboxData.Imap, - IsTeamlab = mailboxData.IsTeamlab, - Size = mailboxData.Size, - MessagesCount = mailboxData.MessagesCount - }; - } - - public static MailboxData ToMailboxData(this MailBoxData mailbox) - { - return new MailboxData - { - MailboxId = mailbox.MailBoxId, - TenantId = mailbox.TenantId, - UserId = mailbox.UserId, - EMail = mailbox.EMail.Address, - Imap = mailbox.Imap, - IsTeamlab = mailbox.IsTeamlab, - MessagesCount = mailbox.MessagesCount, - Size = mailbox.Size - }; - } - } -} diff --git a/module/ASC.Mail/Services/ASC.Mail.Aggregator.CollectionService/Queue/Data/MailboxData.cs b/module/ASC.Mail/Services/ASC.Mail.Aggregator.CollectionService/Queue/Data/MailboxData.cs deleted file mode 100644 index ead907faa..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.Aggregator.CollectionService/Queue/Data/MailboxData.cs +++ /dev/null @@ -1,49 +0,0 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2023 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - -using System.Runtime.Serialization; - -namespace ASC.Mail.Aggregator.CollectionService.Queue.Data -{ - [DataContract] - public class MailboxData - { - [DataMember(Name = "tenant")] - public int TenantId { get; set; } - - [DataMember(Name = "user")] - public string UserId { get; set; } - - [DataMember(Name = "id")] - public int MailboxId { get; set; } - - [DataMember] - public string EMail { get; set; } - - [DataMember(Name = "imap")] - public bool Imap { get; set; } - - [DataMember(Name = "is_teamlab")] - public bool IsTeamlab { get; set; } - - [DataMember(Name = "size")] - public long Size { get; set; } - - [DataMember(Name = "messages_count")] - public int MessagesCount { get; set; } - } -} diff --git a/module/ASC.Mail/Services/ASC.Mail.Aggregator.CollectionService/Queue/Data/TaskData.cs b/module/ASC.Mail/Services/ASC.Mail.Aggregator.CollectionService/Queue/Data/TaskData.cs deleted file mode 100644 index 18344e247..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.Aggregator.CollectionService/Queue/Data/TaskData.cs +++ /dev/null @@ -1,36 +0,0 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2023 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - -using System.Threading.Tasks; - -using ASC.Mail.Data.Contracts; - -namespace ASC.Mail.Aggregator.CollectionService.Queue.Data -{ - public class TaskData - { - public TaskData(MailBoxData mailBoxData, Task task) - { - Mailbox = mailBoxData; - Task = task; - } - - public MailBoxData Mailbox { get; private set; } - - public Task Task { get; private set; } - } -} diff --git a/module/ASC.Mail/Services/ASC.Mail.Aggregator.CollectionService/Queue/Data/TenantData.cs b/module/ASC.Mail/Services/ASC.Mail.Aggregator.CollectionService/Queue/Data/TenantData.cs deleted file mode 100644 index 395244393..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.Aggregator.CollectionService/Queue/Data/TenantData.cs +++ /dev/null @@ -1,35 +0,0 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2023 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - -using System; -using System.Runtime.Serialization; - -namespace ASC.Mail.Aggregator.CollectionService.Queue.Data -{ - [DataContract] - public class TenantData - { - [DataMember(Name = "tenant")] - public int Tenant { get; set; } - - [DataMember(Name = "tariff_type")] - public Defines.TariffType TariffType { get; set; } - - [DataMember(Name = "expired")] - public DateTime Expired { get; set; } - } -} diff --git a/module/ASC.Mail/Services/ASC.Mail.Aggregator.CollectionService/Queue/MailQueueItemSettings.cs b/module/ASC.Mail/Services/ASC.Mail.Aggregator.CollectionService/Queue/MailQueueItemSettings.cs deleted file mode 100644 index 6bcbefff3..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.Aggregator.CollectionService/Queue/MailQueueItemSettings.cs +++ /dev/null @@ -1,104 +0,0 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2023 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - -using System; -using System.Collections.Generic; -using System.Configuration; -using System.Linq; - -using ASC.Mail.Core; -using ASC.Mail.Data.Contracts; - -namespace ASC.Mail.Aggregator.CollectionService.Queue -{ - public class MailQueueItemSettings - { - public Dictionary ImapFlags { get; private set; } - - public string[] SkipImapFlags { get; private set; } - - public Dictionary> SpecialDomainFolders { get; private set; } - - public Dictionary DefaultFolders { get; private set; } - - public MailQueueItemSettings() - { - using (var daoFactory = new DaoFactory()) - { - var imapFlags = daoFactory.CreateImapFlagsDao().GetImapFlags(); - - SkipImapFlags = imapFlags.FindAll(i => i.Skip).ConvertAll(i => i.Name).ToArray(); - - ImapFlags = new Dictionary(); - imapFlags.FindAll(i => !i.Skip).ForEach(i => { ImapFlags[i.Name] = i.FolderId; }); - - var imapSpecialMailboxes = daoFactory.CreateImapSpecialMailboxDao().GetImapSpecialMailboxes(); - - SpecialDomainFolders = new Dictionary>(); - imapSpecialMailboxes.ForEach(r => - { - var mb = new MailBoxData.MailboxInfo - { - folder_id = r.FolderId, - skip = r.Skip - }; - if (SpecialDomainFolders.Keys.Contains(r.Server)) - SpecialDomainFolders[r.Server][r.MailboxName] = mb; - else - SpecialDomainFolders[r.Server] = new Dictionary - { - {r.MailboxName, mb} - }; - }); - } - - DefaultFolders = GetDefaultFolders(); - } - - private static Dictionary GetDefaultFolders() - { - var list = new Dictionary - { - {"inbox", 1}, - {"sent", 2}, - {"sent items", 2}, - {"drafts", 3}, - {"trash", 4}, - {"spam", 5}, - {"junk", 5}, - {"bulk", 5} - }; - - try - { - if (!string.IsNullOrEmpty(ConfigurationManagerExtension.AppSettings["mail.folders-mapping"])) - // "sent:2|"drafts:3|trash:4|spam:5|junk:5" - { - list = ConfigurationManagerExtension.AppSettings["mail.folders-mapping"] - .Split('|') - .Select(s => s.Split(':')) - .ToDictionary(s => s[0].ToLower(), s => Convert.ToInt32(s[1])); - } - } - catch - { - //ignore - } - return list; - } - } -} diff --git a/module/ASC.Mail/Services/ASC.Mail.Aggregator.CollectionService/Queue/QueueManager.cs b/module/ASC.Mail/Services/ASC.Mail.Aggregator.CollectionService/Queue/QueueManager.cs deleted file mode 100644 index c4eeb84cf..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.Aggregator.CollectionService/Queue/QueueManager.cs +++ /dev/null @@ -1,633 +0,0 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2023 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - -using System; -using System.Collections.Generic; -using System.Globalization; -using System.IO; -using System.Linq; -using System.Runtime.Caching; -using System.Threading; - -using ASC.Common.Logging; -using ASC.Core; -using ASC.Mail.Aggregator.CollectionService.Queue.Data; -using ASC.Mail.Core; -using ASC.Mail.Core.Dao.Expressions.Mailbox; -using ASC.Mail.Data.Contracts; -using ASC.Mail.Extensions; - -using LiteDB; - -namespace ASC.Mail.Aggregator.CollectionService.Queue -{ - public class QueueManager : IDisposable - { - private readonly EngineFactory _engineFactory; - - private readonly int _maxItemsLimit; - private readonly Queue _mailBoxQueue; - private List _lockedMailBoxList; - private readonly TasksConfig _tasksConfig; - private readonly ILog _log; - private DateTime _loadQueueTime; - private MemoryCache _tenantMemCache; - - private const string DBC_MAILBOXES = "mailboxes"; - private const string DBC_TENANTS = "tenants"; - private static string _dbcFile; - private static string _dbcJournalFile; - - private readonly object _locker = new object(); - - private LiteDatabase _db; - private ILiteCollection _mailboxes; - private ILiteCollection _tenants; - - public ManualResetEvent CancelHandler { get; set; } - - public QueueManager(TasksConfig tasksConfig, ILog log) - { - _maxItemsLimit = tasksConfig.MaxTasksAtOnce; - _mailBoxQueue = new Queue(); - _lockedMailBoxList = new List(); - _tasksConfig = tasksConfig; - _log = log; - _loadQueueTime = DateTime.UtcNow; - _tenantMemCache = new MemoryCache("QueueManagerTenantCache"); - - CancelHandler = new ManualResetEvent(false); - - _engineFactory = new EngineFactory(-1); - - if (_tasksConfig.UseDump) - { - _dbcFile = Path.Combine(Environment.CurrentDirectory, "dump.db"); - _dbcJournalFile = Path.Combine(Environment.CurrentDirectory, "dump-journal.db"); - - _log.DebugFormat("Dump file path: {0}", _dbcFile); - - LoadDump(); - } - } - - #region - public methods - - - public IEnumerable GetLockedMailboxes(int needTasks) - { - var mbList = new List(); - do - { - var mailBox = GetLockedMailbox(); - if (mailBox == null) - break; - - mbList.Add(mailBox); - - } while (mbList.Count < needTasks); - - return mbList; - } - - public MailBoxData GetLockedMailbox() - { - MailBoxData mailBoxData; - - do - { - mailBoxData = GetQueuedMailbox(); - - } while (mailBoxData != null && !TryLockMailbox(mailBoxData)); - - if (mailBoxData == null) - return null; - - _lockedMailBoxList.Add(mailBoxData); - - CancelHandler.Reset(); - - AddMailboxToDumpDb(mailBoxData.ToMailboxData()); - - return mailBoxData; - } - - public void ReleaseAllProcessingMailboxes() - { - if (!_lockedMailBoxList.Any()) - return; - - var cloneCollection = new List(_lockedMailBoxList); - - _log.Info("QueueManager->ReleaseAllProcessingMailboxes()"); - - foreach (var mailbox in cloneCollection) - { - ReleaseMailbox(mailbox); - } - } - - public void ReleaseMailbox(MailBoxData mailBoxData) - { - try - { - if (!_lockedMailBoxList.Contains(mailBoxData)) - { - _log.WarnFormat("QueueManager->ReleaseMailbox(Tenant = {0} MailboxId = {1}, Address = '{2}') mailbox not found", - mailBoxData.TenantId, mailBoxData.MailBoxId, mailBoxData.EMail); - return; - } - - _log.InfoFormat("QueueManager->ReleaseMailbox(MailboxId = {0} Address '{1}')", mailBoxData.MailBoxId, mailBoxData.EMail); - - CoreContext.TenantManager.SetCurrentTenant(mailBoxData.TenantId); - - _engineFactory.MailboxEngine.ReleaseMaibox(mailBoxData, _tasksConfig); - - _lockedMailBoxList.Remove(mailBoxData); - - DeleteMailboxFromDumpDb(mailBoxData.MailBoxId); - } - catch (Exception ex) - { - _log.ErrorFormat("QueueManager->ReleaseMailbox(Tenant = {0} MailboxId = {1}, Address = '{2}')\r\nException: {3} \r\n", - mailBoxData.TenantId, mailBoxData.MailBoxId, mailBoxData.Account, ex.ToString()); - } - } - - public int ProcessingCount - { - get { return _lockedMailBoxList.Count; } - } - - public void LoadMailboxesFromDump() - { - if (!_tasksConfig.UseDump) - return; - - if (_lockedMailBoxList.Any()) - return; - - try - { - _log.Debug("LoadMailboxesFromDump()"); - - lock (_locker) - { - var list = _mailboxes.FindAll().ToList(); - - _lockedMailBoxList = list.ConvertAll(m => m.ToMailbox()).ToList(); - } - } - catch (Exception ex) - { - _log.ErrorFormat("LoadMailboxesFromDump: {0}", ex.ToString()); - - ReCreateDump(); - } - } - - public void LoadTenantsFromDump() - { - if (!_tasksConfig.UseDump) - return; - - try - { - _log.Debug("LoadTenantsFromDump()"); - - lock (_locker) - { - var list = _tenants.FindAll().ToList(); - - foreach (var tenantData in list) - { - AddTenantToCache(tenantData, false); - } - } - - } - catch (Exception ex) - { - _log.ErrorFormat("LoadTenantsFromDump: {0}", ex.ToString()); - - ReCreateDump(); - } - } - - #endregion - - #region - private methods - - - private void ReCreateDump() - { - if (!_tasksConfig.UseDump) - return; - - try - { - if (File.Exists(_dbcFile)) - { - _log.DebugFormat("Dump file '{0}' exists, trying delete", _dbcFile); - - File.Delete(_dbcFile); - - _log.DebugFormat("Dump file '{0}' deleted", _dbcFile); - } - - if (File.Exists(_dbcJournalFile)) - { - _log.DebugFormat("Dump journal file '{0}' exists, trying delete", _dbcJournalFile); - - File.Delete(_dbcJournalFile); - - _log.DebugFormat("Dump journal file '{0}' deleted", _dbcJournalFile); - } - - _db = new LiteDatabase(_dbcFile); - - lock (_locker) - { - _mailboxes = _db.GetCollection(DBC_MAILBOXES); - _tenants = _db.GetCollection(DBC_TENANTS); - } - } - catch (Exception ex) - { - _log.ErrorFormat("ReCreateDump() failed Exception: {0}", ex.ToString()); - } - } - - private void AddMailboxToDumpDb(MailboxData mailboxData) - { - if (!_tasksConfig.UseDump) - return; - - try - { - lock (_locker) - { - var mailbox = _mailboxes.FindOne(Query.EQ("MailboxId", mailboxData.MailboxId)); - - if (mailbox != null) - return; - - _mailboxes.Insert(mailboxData); - - // Create, if not exists, new index on Name field - _mailboxes.EnsureIndex(x => x.MailboxId); - } - } - catch (Exception ex) - { - _log.ErrorFormat("AddMailboxToDumpDb(id={0}) Exception: {1}", mailboxData.MailboxId, ex.ToString()); - - ReCreateDump(); - } - } - - private void DeleteMailboxFromDumpDb(int mailBoxId) - { - if (!_tasksConfig.UseDump) - return; - - try - { - lock (_locker) - { - var mailbox = _mailboxes.FindOne(Query.EQ("MailboxId", mailBoxId)); - - if (mailbox == null) - return; - - _mailboxes.DeleteMany(Query.EQ("MailboxId", mailBoxId)); - } - } - catch (Exception ex) - { - _log.ErrorFormat("DeleteMailboxFromDumpDb(mailboxId={0}) Exception: {1}", mailBoxId, ex.ToString()); - - ReCreateDump(); - } - } - - private void LoadDump() - { - if (!_tasksConfig.UseDump) - return; - - try - { - if (File.Exists(_dbcJournalFile)) - throw new Exception(string.Format("temp dump journal file exists in {0}", _dbcJournalFile)); - - _db = new LiteDatabase(_dbcFile); - - lock (_locker) - { - _tenants = _db.GetCollection(DBC_TENANTS); - _mailboxes = _db.GetCollection(DBC_MAILBOXES); - } - } - catch (Exception ex) - { - _log.ErrorFormat("LoadDump() failed Exception: {0}", ex.ToString()); - - ReCreateDump(); - } - } - - private void AddTenantToDumpDb(TenantData tenantData) - { - if (!_tasksConfig.UseDump) - return; - - try - { - lock (_locker) - { - var tenant = _tenants.FindOne(Query.EQ("Tenant", tenantData.Tenant)); - - if (tenant != null) - return; - - _tenants.Insert(tenantData); - - // Create, if not exists, new index on Name field - _tenants.EnsureIndex(x => x.Tenant); - } - } - catch (Exception ex) - { - _log.ErrorFormat("AddTenantToDumpDb(tenantId={0}) Exception: {1}", tenantData.Tenant, ex.ToString()); - - ReCreateDump(); - } - } - - private void DeleteTenantFromDumpDb(int tenantId) - { - if (!_tasksConfig.UseDump) - return; - - try - { - lock (_locker) - { - var tenant = _tenants.FindOne(Query.EQ("Tenant", tenantId)); - - if (tenant == null) - return; - - _tenants.DeleteMany(Query.EQ("Tenant", tenantId)); - } - } - catch (Exception ex) - { - _log.ErrorFormat("DeleteTenantFromDumpDb(tenant={0}) Exception: {1}", tenantId, ex.ToString()); - - ReCreateDump(); - } - } - - private void AddTenantToCache(TenantData tenantData, bool needDump = true) - { - var now = DateTime.UtcNow; - - if (tenantData.Expired < now) - { - DeleteTenantFromDumpDb(tenantData.Tenant); - return; // Skip Expired tenant - } - - var cacheItem = new CacheItem(tenantData.Tenant.ToString(CultureInfo.InvariantCulture), tenantData); - - var nowOffset = tenantData.Expired - now; - - var absoluteExpiration = DateTime.UtcNow.Add(nowOffset); - - var cacheItemPolicy = new CacheItemPolicy - { - RemovedCallback = CacheEntryRemove, - AbsoluteExpiration = absoluteExpiration - }; - - _tenantMemCache.Add(cacheItem, cacheItemPolicy); - - if (!needDump) - return; - - AddTenantToDumpDb(tenantData); - } - - private bool QueueIsEmpty - { - get { return !_mailBoxQueue.Any(); } - } - - private bool QueueLifetimeExpired - { - get { return DateTime.UtcNow - _loadQueueTime >= _tasksConfig.QueueLifetime; } - } - - private void LoadQueue() - { - try - { - var mbList = _engineFactory.MailboxEngine.GetMailboxesForProcessing(_tasksConfig, _maxItemsLimit); - - ReloadQueue(mbList); - } - catch (Exception ex) - { - _log.ErrorFormat("QueueManager->LoadQueue()\r\nException: \r\n {0}", ex.ToString()); - } - } - - private MailBoxData GetQueuedMailbox() - { - if (QueueIsEmpty || QueueLifetimeExpired) - { - _log.DebugFormat("Queue is {0}. Load new queue.", QueueIsEmpty ? "EMPTY" : "EXPIRED"); - - LoadQueue(); - } - - return !QueueIsEmpty ? _mailBoxQueue.Dequeue() : null; - } - - private void RemoveFromQueue(int tenant) - { - var mbList = _mailBoxQueue.Where(mb => mb.TenantId != tenant).Select(mb => mb).ToList(); - ReloadQueue(mbList); - } - - private void RemoveFromQueue(int tenant, string user) - { - var mbList = _mailBoxQueue.Where(mb => mb.TenantId != tenant && mb.UserId != user).Select(mb => mb).ToList(); - ReloadQueue(mbList); - } - - private void ReloadQueue(IEnumerable mbList) - { - _mailBoxQueue.Clear(); - _mailBoxQueue.PushRange(mbList); - _loadQueueTime = DateTime.UtcNow; - } - - private bool TryLockMailbox(MailBoxData mailbox) - { - _log.DebugFormat("TryLockMailbox(MailboxId={0} is {1})", mailbox.MailBoxId, mailbox.Active ? "active" : "inactive"); - - try - { - var contains = _tenantMemCache.Contains(mailbox.TenantId.ToString(CultureInfo.InvariantCulture)); - - if (!contains) - { - _log.DebugFormat("Tenant {0} isn't in cache", mailbox.TenantId); - try - { - var type = mailbox.GetTenantStatus(_tasksConfig.TenantOverdueDays, _tasksConfig.DefaultApiSchema, _log); - - switch (type) - { - case Defines.TariffType.LongDead: - _log.InfoFormat("Tenant {0} is not paid. Disable mailboxes.", mailbox.TenantId); - - _engineFactory.MailboxEngine.DisableMailboxes( - new TenantMailboxExp(mailbox.TenantId)); - - var userIds = - _engineFactory.MailboxEngine.GetMailUsers(new TenantMailboxExp(mailbox.TenantId)) - .ConvertAll(t => t.Item2); - - _engineFactory.AlertEngine.CreateDisableAllMailboxesAlert(mailbox.TenantId, userIds); - - RemoveFromQueue(mailbox.TenantId); - - return false; - - case Defines.TariffType.Overdue: - _log.InfoFormat("Tenant {0} is not paid. Stop processing mailboxes.", mailbox.TenantId); - - _engineFactory.MailboxEngine.SetNextLoginDelay(new TenantMailboxExp(mailbox.TenantId), - _tasksConfig.OverdueAccountDelay); - - RemoveFromQueue(mailbox.TenantId); - - return false; - - default: - _log.InfoFormat("Tenant {0} is paid.", mailbox.TenantId); - - var expired = DateTime.UtcNow.Add(_tasksConfig.TenantCachingPeriod); - - var tenantData = new TenantData - { - Tenant = mailbox.TenantId, - TariffType = type, - Expired = expired - }; - - AddTenantToCache(tenantData); - - break; - } - } - catch (Exception e) - { - _log.ErrorFormat("TryLockMailbox() -> GetTariffType Exception:\r\n{0}\r\n", e.ToString()); - } - } - else - { - _log.DebugFormat("Tenant {0} is in cache", mailbox.TenantId); - } - - if (mailbox.IsUserTerminated() || mailbox.IsUserRemoved()) - { - _log.InfoFormat("User '{0}' was terminated. Tenant = {1}. Disable mailboxes for user.", - mailbox.UserId, - mailbox.TenantId); - - _engineFactory.MailboxEngine.DisableMailboxes( - new UserMailboxExp(mailbox.TenantId, mailbox.UserId)); - - _engineFactory.AlertEngine.CreateDisableAllMailboxesAlert(mailbox.TenantId, - new List { mailbox.UserId }); - - RemoveFromQueue(mailbox.TenantId, mailbox.UserId); - - return false; - } - - if (mailbox.IsTenantQuotaEnded(_tasksConfig.TenantMinQuotaBalance, _log)) - { - _log.InfoFormat("Tenant = {0} User = {1}. Quota is ended.", mailbox.TenantId, mailbox.UserId); - - if (!mailbox.QuotaError) - _engineFactory.AlertEngine.CreateQuotaErrorWarningAlert(mailbox.TenantId, mailbox.UserId); - - _engineFactory.MailboxEngine.SetNextLoginDelay(new UserMailboxExp(mailbox.TenantId, mailbox.UserId), - _tasksConfig.QuotaEndedDelay); - - RemoveFromQueue(mailbox.TenantId, mailbox.UserId); - - return false; - } - - return _engineFactory.MailboxEngine.LockMaibox(mailbox.MailBoxId); - - } - catch (Exception ex) - { - _log.ErrorFormat("TryLockMailbox(MailboxId={0} is {1}) Exception:\r\n{2}\r\n", mailbox.MailBoxId, - mailbox.Active ? "active" : "inactive", ex.ToString()); - - return false; - } - - } - - private void CacheEntryRemove(CacheEntryRemovedArguments arguments) - { - if (arguments.RemovedReason == CacheEntryRemovedReason.CacheSpecificEviction) - return; - - var tenantId = Convert.ToInt32(arguments.CacheItem.Key); - - _log.InfoFormat("Tenant {0} payment cache is expired.", tenantId); - - DeleteTenantFromDumpDb(tenantId); - } - - #endregion - - public void Dispose() - { - _tenantMemCache.Dispose(); - _tenantMemCache = null; - - if (_tasksConfig.UseDump) - { - _db.Dispose(); - _db = null; - } - } - } - -} diff --git a/module/ASC.Mail/Services/ASC.Mail.Aggregator.CollectionService/Queue/SignalrWorker.cs b/module/ASC.Mail/Services/ASC.Mail.Aggregator.CollectionService/Queue/SignalrWorker.cs deleted file mode 100644 index 6c08e0df1..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.Aggregator.CollectionService/Queue/SignalrWorker.cs +++ /dev/null @@ -1,193 +0,0 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2023 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading; - -using ASC.Common.Logging; -using ASC.Core; -using ASC.Core.Notify.Signalr; -using ASC.Core.Users; -using ASC.Mail.Core; -using ASC.Mail.Data.Contracts; -using ASC.Mail.Enums; - -namespace ASC.Mail.Aggregator.CollectionService.Queue -{ - public class SignalrWorker : IDisposable - { - private readonly Queue _processingQueue; - private Thread _worker; - private volatile bool _workerTerminateSignal; - private readonly EventWaitHandle _waitHandle; - private readonly ILog _log; - private static SignalrServiceClient _signalrServiceClient; - private readonly TimeSpan _timeSpan; - - public SignalrWorker(bool startImmediately = true) - { - _log = LogManager.GetLogger("ASC.Mail.SignalrWorker"); - _workerTerminateSignal = false; - _signalrServiceClient = new SignalrServiceClient("mail"); - _processingQueue = new Queue(); - _waitHandle = new EventWaitHandle(false, EventResetMode.AutoReset); - _timeSpan = TimeSpan.FromSeconds(10); - - _worker = new Thread(ProcessQueue); - - if (startImmediately) - _worker.Start(); - } - - private void ProcessQueue() - { - while (!_workerTerminateSignal) - { - if (!HasQueuedMailbox) - { - _log.Debug("No items, waiting."); - _waitHandle.WaitOne(); - _log.Debug("Waking up..."); - } - - var mailbox = NextQueuedMailBoxData; - if (mailbox == null) - continue; - - try - { - _log.DebugFormat("signalrServiceClient.SendUnreadUser(UserId = {0} TenantId = {1})", mailbox.UserId, - mailbox.TenantId); - - SendUnreadUser(mailbox.TenantId, mailbox.UserId); - } - catch (Exception ex) - { - _log.ErrorFormat("signalrServiceClient.SendUnreadUser(UserId = {0} TenantId = {1}) Exception: {2}", mailbox.UserId, - mailbox.TenantId, ex.ToString()); - } - - _waitHandle.Reset(); - } - } - - public int QueueCount - { - get - { - lock (_processingQueue) - { - return _processingQueue.Count; - } - } - } - - public bool HasQueuedMailbox - { - get - { - lock (_processingQueue) - { - return _processingQueue.Any(); - } - } - } - - public MailBoxData NextQueuedMailBoxData - { - get - { - if (!HasQueuedMailbox) - return null; - - lock (_processingQueue) - { - return _processingQueue.Dequeue(); - } - } - } - - public void Start() - { - if (!_worker.IsAlive) - _worker.Start(); - } - - public void AddMailbox(MailBoxData item) - { - lock (_processingQueue) - { - if (!_processingQueue.Contains(item)) - _processingQueue.Enqueue(item); - } - _waitHandle.Set(); - } - - public void Dispose() - { - if (_worker == null) - return; - - _workerTerminateSignal = true; - _waitHandle.Set(); - - if (_worker.IsAlive) - { - _log.Info("Stop SignalrWorker."); - - if (!_worker.Join(_timeSpan)) - { - _log.Info("SignalrWorker busy, aborting the thread."); - _worker.Abort(); - } - } - - _worker = null; - } - - private static void SendUnreadUser(int tenant, string userId) - { - var log = LogManager.GetLogger("ASC.Mail.SignalrWorker"); - try - { - var engineFactory = new EngineFactory(tenant, userId); - - var mailFolderInfos = engineFactory.FolderEngine.GetFolders(); - - var count = (from mailFolderInfo in mailFolderInfos - where mailFolderInfo.id == FolderType.Inbox - select mailFolderInfo.unreadMessages) - .FirstOrDefault(); - - CoreContext.TenantManager.SetCurrentTenant(tenant); - var userInfo = CoreContext.UserManager.GetUsers(Guid.Parse(userId)); - if (userInfo.ID != Constants.LostUser.ID) - { - // sendMailsCount - _signalrServiceClient.SendUnreadUser(tenant, userId, count); - } - } - catch (Exception e) - { - log.ErrorFormat("Unknown Error. {0}, {1}", e.ToString(), - e.InnerException != null ? e.InnerException.Message : string.Empty); - } - } - } -} diff --git a/module/ASC.Mail/Services/ASC.Mail.Aggregator.CollectionService/mail.agg.log4net.config b/module/ASC.Mail/Services/ASC.Mail.Aggregator.CollectionService/mail.agg.log4net.config deleted file mode 100644 index f13c586c6..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.Aggregator.CollectionService/mail.agg.log4net.config +++ /dev/null @@ -1,137 +0,0 @@ - - - - WINDOWS:LogDirectory - ..\..\..\..\..\..\web\studio\Logs\ - - - UNIX:LogDirectory - /var/log/onlyoffice/ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/module/ASC.Mail/Services/ASC.Mail.Aggregator.CollectionService/mail.agg.nlog.config b/module/ASC.Mail/Services/ASC.Mail.Aggregator.CollectionService/mail.agg.nlog.config deleted file mode 100644 index 151899312..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.Aggregator.CollectionService/mail.agg.nlog.config +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/ASC.Mail.DomainParser.csproj b/module/ASC.Mail/Services/ASC.Mail.DomainParser/ASC.Mail.DomainParser.csproj deleted file mode 100644 index d96f91787..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/ASC.Mail.DomainParser.csproj +++ /dev/null @@ -1,341 +0,0 @@ - - - - Debug - AnyCPU - 9.0.30729 - 2.0 - {9B218E58-4967-4DAC-B427-C2FD2AC50634} - Exe - Properties - ASC.Mail.DomainParser - ASC.Mail.DomainParser - v4.8 - 512 - - - 3.5 - - publish\ - true - Disk - false - Foreground - 7 - Days - false - false - true - 0 - 1.0.0.%2a - false - false - true - - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - false - - - none - true - bin\Release\ - TRACE - prompt - 4 - false - - - - ..\..\..\..\packages\log4net.2.0.8\lib\net45-full\log4net.dll - - - ..\..\..\..\packages\MySql.Data.8.0.18\lib\net452\MySql.Data.dll - - - False - ..\..\..\..\packages\NLog.4.5.8\lib\net45\NLog.dll - - - - - 3.5 - - - 3.5 - - - 3.5 - - - - - ..\..\..\..\packages\Google.Protobuf.3.5.1\lib\net45\Google.Protobuf.dll - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - False - .NET Framework 3.5 SP1 Client Profile - false - - - False - .NET Framework 3.5 SP1 - true - - - - - {76de7717-3d4b-4a5b-b740-15b8913df0cb} - ASC.Common - - - {a51d0454-4afa-46de-89d4-b03d37e1816c} - ASC.Core.Common - - - {7080343d-fbe7-423a-9405-4f883f6e235b} - ASC.Mail - - - - - \ No newline at end of file diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/App.config b/module/ASC.Mail/Services/ASC.Mail.DomainParser/App.config deleted file mode 100644 index 74768ca9d..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/App.config +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/Program.cs b/module/ASC.Mail/Services/ASC.Mail.DomainParser/Program.cs deleted file mode 100644 index ae08fa230..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/Program.cs +++ /dev/null @@ -1,149 +0,0 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2023 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - -using System; -using System.Collections.Generic; -using System.Linq; -using System.IO; -using ASC.Mail.Core; -using ASC.Mail.Data.Contracts; - -namespace ASC.Mail.DomainParser -{ - internal class Program - { - private static void Main(string[] args) - { - Console.WriteLine(".Begin"); - - var parsePath = @"../../XmlData"; - - try - { - var listOfConfig = new List(); - - if (args != null && args.Any()) - { - parsePath = args[0]; - } - - Console.WriteLine("\r\nParser path: '{0}'", parsePath); - - if (File.GetAttributes(parsePath) == FileAttributes.Directory) - { - var parsePathInfo = new DirectoryInfo(parsePath); - - var files = parsePathInfo.GetFiles(); - - Console.WriteLine("\r\n{0} file(s) found!", files.Count()); - Console.WriteLine(""); - - var index = 0; - var count = files.Count(); - - files - .ToList() - .ForEach(f => - { - if (f.Attributes == FileAttributes.Directory) return; - ClientConfig obj; - if (!ParseXml(f.FullName, out obj)) return; - Console.SetCursorPosition(0, Console.CursorTop); - Console.Write(" "); - Console.SetCursorPosition(0, Console.CursorTop); - Console.Write("{0} from {1}", ++index, count); - listOfConfig.Add(obj); - }); - Console.WriteLine(""); - } - else - { - Console.WriteLine("\r\n1 file found!"); - - ClientConfig obj; - if (ParseXml(parsePath, out obj)) - { - listOfConfig.Add(obj); - } - } - - Console.WriteLine("\r\n{0} config(s) parsed!", listOfConfig.Count); - - var engine = new EngineFactory(-1, ASC.Core.Configuration.Constants.CoreSystem.ToString()); - - if (listOfConfig.Any()) - { - do - { - Console.Write("\r\nDo you want add configs to DB? [y, n]: "); - var info = Console.ReadKey(); - if (info.Key == ConsoleKey.Y) - { - var index = 0; - var count = listOfConfig.Count; - - Console.WriteLine("\r\n"); - - listOfConfig.ForEach(c => - { - Console.Write("{0} from {1}", ++index, count); - - if (!engine.MailBoxSettingEngine.SetMailBoxSettings(c, false)) return; - if (index >= count) return; - Console.SetCursorPosition(0, Console.CursorTop); - Console.Write(" "); - Console.SetCursorPosition(0, Console.CursorTop); - }); - - Console.WriteLine("\r\n"); - Console.WriteLine("{0} config(s) added to DB!", listOfConfig.Count); - Console.WriteLine(""); - break; - } - if (info.Key != ConsoleKey.N) continue; - Console.WriteLine("\r\n"); - break; - } while (true); - } - - } - catch (Exception ex) - { - Console.WriteLine(ex.Message); - } - - Console.WriteLine(".End"); - Console.ReadKey(); - } - - private static bool ParseXml(string filepath, out ClientConfig obj) - { - obj = null; - - try - { - obj = ClientConfig.LoadFromFile(filepath); - } - catch (Exception) - { - return false; - } - - return true; - } - } -} diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/Properties/AssemblyInfo.cs b/module/ASC.Mail/Services/ASC.Mail.DomainParser/Properties/AssemblyInfo.cs deleted file mode 100644 index 05e605da6..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,35 +0,0 @@ -using System.Reflection; -using System.Runtime.InteropServices; - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyTitle("ASC.Mail.DomainParser")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("Ascensio System SIA")] -[assembly: AssemblyProduct("ASC.Mail.DomainParser")] -[assembly: AssemblyCopyright("(c) Ascensio System SIA. All rights reserved")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("4c868901-7e6a-4254-a788-41bdc5d0e401")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Build and Revision Numbers -// by using the '*' as shown below: -// [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/1und1.de.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/1und1.de.xml deleted file mode 100644 index b669e33de..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/1und1.de.xml +++ /dev/null @@ -1,65 +0,0 @@ - - - - - 1and1.de - - online.de - onlinehome.de - sofortstart.de - sofort-start.de - sofortsurf.de - sofort-surf.de - go4more.de - - kundenserver.de - schlund.de - 1and1.com - 1and1.fr - 1and1.co.uk - 1and1.es - - 1&1 - 1&1 - - imap.1und1.de - 993 - SSL - password-cleartext - %EMAILADDRESS% - - - imap.1und1.de - 143 - STARTTLS - password-cleartext - %EMAILADDRESS% - - - pop.1und1.de - 995 - SSL - password-cleartext - %EMAILADDRESS% - - - pop.1und1.de - 110 - STARTTLS - password-cleartext - %EMAILADDRESS% - - - smtp.1und1.de - 587 - STARTTLS - password-cleartext - %EMAILADDRESS% - - - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/abc.plala.or.jp.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/abc.plala.or.jp.xml deleted file mode 100644 index 549bed6cb..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/abc.plala.or.jp.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - abc.plala.or.jp - ぷらら - ぷらら - - abc.mail.plala.or.jp - 110 - plain - %EMAILLOCALPART% - plain - - - abc.mail.plala.or.jp - 587 - plain - %EMAILLOCALPART% - plain - true - false - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/agate.plala.or.jp.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/agate.plala.or.jp.xml deleted file mode 100644 index 6195f5851..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/agate.plala.or.jp.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - agate.plala.or.jp - ぷらら - ぷらら - - agate.mail.plala.or.jp - 110 - plain - %EMAILLOCALPART% - plain - - - agate.mail.plala.or.jp - 587 - plain - %EMAILLOCALPART% - plain - true - false - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/alice.it.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/alice.it.xml deleted file mode 100644 index 6bf811d02..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/alice.it.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - - alice.it - Alice Italy - Alice - - in.alice.it - 143 - plain - %EMAILADDRESS% - password-cleartext - - - in.alice.it - 110 - plain - %EMAILADDRESS% - password-cleartext - - - out.alice.it - 587 - plain - %EMAILADDRESS% - password-cleartext - - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/amail.plala.or.jp.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/amail.plala.or.jp.xml deleted file mode 100644 index b4bd8af5f..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/amail.plala.or.jp.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - amail.plala.or.jp - ぷらら - ぷらら - - amail.mail.plala.or.jp - 110 - plain - %EMAILLOCALPART% - plain - - - amail.mail.plala.or.jp - 587 - plain - %EMAILLOCALPART% - plain - true - false - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/amber.plala.or.jp.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/amber.plala.or.jp.xml deleted file mode 100644 index ae682933e..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/amber.plala.or.jp.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - amber.plala.or.jp - ぷらら - ぷらら - - amber.mail.plala.or.jp - 110 - plain - %EMAILLOCALPART% - plain - - - amber.mail.plala.or.jp - 587 - plain - %EMAILLOCALPART% - plain - true - false - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/aol.com.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/aol.com.xml deleted file mode 100644 index a967363bf..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/aol.com.xml +++ /dev/null @@ -1,45 +0,0 @@ - - - - aol.com - aim.com - netscape.net - AOL Mail - AOL - - imap.aol.com - 993 - SSL - %EMAILLOCALPART% - password-cleartext - - - imap.aol.com - 143 - STARTTLS - %EMAILLOCALPART% - password-cleartext - - - pop.aol.com - 995 - SSL - %EMAILLOCALPART% - password-cleartext - - - pop.aol.com - 110 - STARTTLS - %EMAILLOCALPART% - password-cleartext - - - smtp.aol.com - 587 - STARTTLS - %EMAILLOCALPART% - password-cleartext - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/apost.plala.or.jp.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/apost.plala.or.jp.xml deleted file mode 100644 index c4f936a7c..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/apost.plala.or.jp.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - apost.plala.or.jp - ぷらら - ぷらら - - apost.mail.plala.or.jp - 110 - plain - %EMAILLOCALPART% - plain - - - apost.mail.plala.or.jp - 587 - plain - %EMAILLOCALPART% - plain - true - false - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/aqua.plala.or.jp.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/aqua.plala.or.jp.xml deleted file mode 100644 index 0c78abc61..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/aqua.plala.or.jp.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - aqua.plala.or.jp - ぷらら - ぷらら - - aqua.mail.plala.or.jp - 110 - plain - %EMAILLOCALPART% - plain - - - aqua.mail.plala.or.jp - 587 - plain - %EMAILLOCALPART% - plain - true - false - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/arcor.de.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/arcor.de.xml deleted file mode 100644 index 81ebcdccc..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/arcor.de.xml +++ /dev/null @@ -1,57 +0,0 @@ - - - - arcor.de - Arcor - Arcor - - imap.arcor.de - 993 - SSL - - password-cleartext - %EMAILLOCALPART% - - - imap.arcor.de - 143 - STARTTLS - password-cleartext - %EMAILLOCALPART% - - - pop3.arcor.de - 995 - SSL - - password-cleartext - %EMAILLOCALPART% - - - mail.arcor.de - 465 - SSL - password-cleartext - %EMAILLOCALPART% - - - mail.arcor.de - 587 - STARTTLS - password-cleartext - %EMAILLOCALPART% - - - Generic settings - - - TB 2.0 settings - - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/arubapec.it.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/arubapec.it.xml deleted file mode 100644 index 8196ee84b..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/arubapec.it.xml +++ /dev/null @@ -1,34 +0,0 @@ - - - - pec.it - arubapec.it - mypec.eu - gigapec.it - ingpec.eu - Aruba PEC - Aruba - - imaps.pec.aruba.it - 993 - SSL - %EMAILADDRESS% - password-cleartext - - - pop3s.pec.aruba.it - 993 - SSL - %EMAILADDRESS% - password-cleartext - - - smtps.pec.aruba.it - 465 - SSL - %EMAILADDRESS% - password-cleartext - - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/att.net.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/att.net.xml deleted file mode 100644 index 0e839a1c1..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/att.net.xml +++ /dev/null @@ -1,35 +0,0 @@ - - - - att.net - bellsouth.net - sbcglobal.net - prodigy.net - pacbell.net - swbell.net - nvbell.net - ameritech.net - snet.net - flash.net - wans.net - AT&T - AT&T - - pop.att.yahoo.com - 995 - SSL - %EMAILADDRESS% - password-cleartext - - - smtp.att.yahoo.com - 465 - SSL - %EMAILADDRESS% - password-cleartext - - - Configure POP3 for att, sbcglobal, swbell, prodigy etc. - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/avsmedia.com.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/avsmedia.com.xml deleted file mode 100644 index 2b23f7628..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/avsmedia.com.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - avsmedia.com - avsmedia.com - avsmedia - - mail.avsmedia.com - 110 - plain - %EMAILLOCALPART%@%EMAILHOSTNAME% - password-cleartext - - - mail.avsmedia.com - 25 - plain - %EMAILLOCALPART%@%EMAILHOSTNAME% - password-cleartext - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/avsmedia.net.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/avsmedia.net.xml deleted file mode 100644 index ba10084a1..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/avsmedia.net.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - avsmedia.net - avsmedia.net - avsmedia - - 78.40.187.62 - 110 - plain - %EMAILLOCALPART% - password-cleartext - - - 78.40.187.62 - 25 - plain - none - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/ballade.plala.or.jp.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/ballade.plala.or.jp.xml deleted file mode 100644 index 913390f9e..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/ballade.plala.or.jp.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - ballade.plala.or.jp - ぷらら - ぷらら - - ballade.mail.plala.or.jp - 110 - plain - %EMAILLOCALPART% - plain - - - ballade.mail.plala.or.jp - 587 - plain - %EMAILLOCALPART% - plain - true - false - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/bay.wind.ne.jp.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/bay.wind.ne.jp.xml deleted file mode 100644 index 930cf3ab0..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/bay.wind.ne.jp.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - bay.wind.ne.jp - bay.wind.jp - bay.wind.co.jp - bay.gunmanet.or.jp - bay.gunmanet.ne.jp - 群馬インターネット - wind - - bay.wind.ne.jp - 110 - plain - %EMAILLOCALPART% - plain - - - bay.wind.ne.jp - 587 - plain - %EMAILLOCALPART% - plain - true - false - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/bb-niigata.jp.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/bb-niigata.jp.xml deleted file mode 100644 index 96f4fb7ba..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/bb-niigata.jp.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - bb-niigata.jp - BBにいがた - BB-NIIGATA - - pop.bb-niigata.jp - 110 - plain - %EMAILLOCALPART% - password-cleartext - - - pop.bb-niigata.jp - 25 - plain - %EMAILLOCALPART% - password-cleartext - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/beige.plala.or.jp.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/beige.plala.or.jp.xml deleted file mode 100644 index 1da18eb67..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/beige.plala.or.jp.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - beige.plala.or.jp - ぷらら - ぷらら - - beige.mail.plala.or.jp - 110 - plain - %EMAILLOCALPART% - plain - - - beige.mail.plala.or.jp - 587 - plain - %EMAILLOCALPART% - plain - true - false - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/biglobe.ne.jp.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/biglobe.ne.jp.xml deleted file mode 100644 index a55728a11..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/biglobe.ne.jp.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - biglobe.ne.jp - Biglobe - Biglobe - - mail.biglobe.ne.jp - 110 - plain - %EMAILADDRESS% - password-cleartext - - - mail.biglobe.ne.jp - 587 - plain - %EMAILADDRESS% - password-encrypted - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/bigpond.com.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/bigpond.com.xml deleted file mode 100644 index b3bb49836..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/bigpond.com.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - bigpond.com - bigpond.net.au - telstra.com - bigpond.net - Telstra Bigpond - Bigpond - - mail.bigpond.com - 995 - SSL - %EMAILADDRESS% - plain - - - mail.bigpond.com - 25 - plain - %EMAILADDRESS% - plain - - - - Generic email settings - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/blue.plala.or.jp.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/blue.plala.or.jp.xml deleted file mode 100644 index 510042ee9..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/blue.plala.or.jp.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - blue.plala.or.jp - ぷらら - ぷらら - - blue.mail.plala.or.jp - 110 - plain - %EMAILLOCALPART% - plain - - - blue.mail.plala.or.jp - 587 - plain - %EMAILLOCALPART% - plain - true - false - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/bluemail.ch.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/bluemail.ch.xml deleted file mode 100644 index 8a4062a5f..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/bluemail.ch.xml +++ /dev/null @@ -1,31 +0,0 @@ - - - - bluemail.ch - - bluewin.ch - bluewin.ch - - imaps.bluewin.ch - 993 - SSL - %EMAILADDRESS% - password-cleartext - - - pop3s.bluewin.ch - 995 - SSL - %EMAILADDRESS% - password-cleartext - - - smtpauths.bluewin.ch - 465 - SSL - %EMAILADDRESS% - password-encrypted - - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/bluewin.ch.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/bluewin.ch.xml deleted file mode 100644 index 64488a04b..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/bluewin.ch.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - - bluewin.ch - bluewin.ch - bluewin.ch - - imaps.bluewin.ch - 993 - SSL - %EMAILLOCALPART% - password-cleartext - - - pop3s.bluewin.ch - 995 - SSL - %EMAILLOCALPART% - password-cleartext - - - smtpauths.bluewin.ch - 465 - SSL - %EMAILLOCALPART% - password-encrypted - - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/bmail.plala.or.jp.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/bmail.plala.or.jp.xml deleted file mode 100644 index f849e6e4b..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/bmail.plala.or.jp.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - bmail.plala.or.jp - ぷらら - ぷらら - - bmail.mail.plala.or.jp - 110 - plain - %EMAILLOCALPART% - plain - - - bmail.mail.plala.or.jp - 587 - plain - %EMAILLOCALPART% - plain - true - false - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/bolero.plala.or.jp.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/bolero.plala.or.jp.xml deleted file mode 100644 index 171776a28..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/bolero.plala.or.jp.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - bolero.plala.or.jp - ぷらら - ぷらら - - bolero.mail.plala.or.jp - 110 - plain - %EMAILLOCALPART% - plain - - - bolero.mail.plala.or.jp - 587 - plain - %EMAILLOCALPART% - plain - true - false - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/bpost.plala.or.jp.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/bpost.plala.or.jp.xml deleted file mode 100644 index 24c8ebd84..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/bpost.plala.or.jp.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - bpost.plala.or.jp - ぷらら - ぷらら - - bpost.mail.plala.or.jp - 110 - plain - %EMAILLOCALPART% - plain - - - bpost.mail.plala.or.jp - 587 - plain - %EMAILLOCALPART% - plain - true - false - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/broba.cc.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/broba.cc.xml deleted file mode 100644 index 75e6ebcf7..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/broba.cc.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - garnet.broba.cc - amethyst.broba.cc - coral.broba.ccv - diamond.broba.cc - ぷらら - ぷらら - - mail.broba.cc - 110 - plain - %EMAILADDRESS% - password-cleartext - - - mail.broba.cc - 587 - plain - %EMAILADDRESS% - password-cleartext - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/brown.plala.or.jp.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/brown.plala.or.jp.xml deleted file mode 100644 index 3bd4be216..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/brown.plala.or.jp.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - brown.plala.or.jp - ぷらら - ぷらら - - brown.mail.plala.or.jp - 110 - plain - %EMAILLOCALPART% - plain - - - brown.mail.plala.or.jp - 587 - plain - %EMAILLOCALPART% - plain - true - false - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/camel.plala.or.jp.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/camel.plala.or.jp.xml deleted file mode 100644 index c55faa827..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/camel.plala.or.jp.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - camel.plala.or.jp - ぷらら - ぷらら - - camel.mail.plala.or.jp - 110 - plain - %EMAILLOCALPART% - plain - - - camel.mail.plala.or.jp - 587 - plain - %EMAILLOCALPART% - plain - true - false - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/cameo.plala.or.jp.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/cameo.plala.or.jp.xml deleted file mode 100644 index 7376c1fff..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/cameo.plala.or.jp.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - cameo.plala.or.jp - ぷらら - ぷらら - - cameo.mail.plala.or.jp - 110 - plain - %EMAILLOCALPART% - plain - - - cameo.mail.plala.or.jp - 587 - plain - %EMAILLOCALPART% - plain - true - false - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/cc9.ne.jp.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/cc9.ne.jp.xml deleted file mode 100644 index 9f6c11e51..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/cc9.ne.jp.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - cc9.ne.jp - CC9インターネットサービス - CC9 - - pop.cc9.ne.jp - 110 - plain - %EMAILLOCALPART% - password-cleartext - - - smtp.cc9.ne.jp - 25 - plain - none - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/cek.ne.jp.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/cek.ne.jp.xml deleted file mode 100644 index a1bce9e13..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/cek.ne.jp.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - cek.ne.jp - エコーシティー・駒ケ岳 - CEK-Net - - mail.cek.ne.jp - 110 - plain - %EMAILLOCALPART% - password-cleartext - - - smtp.cek.ne.jp - 25 - plain - none - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/cgl.ucsf.edu.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/cgl.ucsf.edu.xml deleted file mode 100644 index ca545ebf5..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/cgl.ucsf.edu.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - cgl.ucsf.edu - UCSF CGL email - CGL email - - plato.cgl.ucsf.edu - 993 - SSL - %EMAILLOCALPART% - password-cleartext - - - plato.cgl.ucsf.edu - 587 - STARTTLS - %EMAILLOCALPART% - password-cleartext - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/charter.com.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/charter.com.xml deleted file mode 100644 index ee5dd0285..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/charter.com.xml +++ /dev/null @@ -1,52 +0,0 @@ - - - charter.net - charter.com - Charter Commuications - Charter - - mobile.charter.net - 993 - SSL - %EMAILADDRESS% - password-cleartext - - - imap.charter.net - 143 - plain - %EMAILADDRESS% - password-cleartext - - - - - mobile.charter.net - - 587 - SSL - %EMAILADDRESS% - password-cleartext - - - smtp.charter.net - 25 - plain - %EMAILADDRESS% - password-cleartext - client-IP-address - - - POP/IMAP and SMTP settings for Charter, including mobile - - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/clio.ne.jp.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/clio.ne.jp.xml deleted file mode 100644 index e1cb7552e..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/clio.ne.jp.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - clio.ne.jp - CLIO-Net移管サービス - CLIO-Net - - mail.clio.ne.jp - 110 - plain - %EMAILLOCALPART% - password-cleartext - - - mail.clio.ne.jp - 587 - plain - %EMAILLOCALPART% - password-encrypted - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/cmail.plala.or.jp.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/cmail.plala.or.jp.xml deleted file mode 100644 index eb2558272..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/cmail.plala.or.jp.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - cmail.plala.or.jp - ぷらら - ぷらら - - cmail.mail.plala.or.jp - 110 - plain - %EMAILLOCALPART% - plain - - - cmail.mail.plala.or.jp - 587 - plain - %EMAILLOCALPART% - plain - true - false - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/co1.wind.ne.jp.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/co1.wind.ne.jp.xml deleted file mode 100644 index e086cd778..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/co1.wind.ne.jp.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - co1.wind.ne.jp - co1.wind.jp - 群馬インターネット - wind - - co1.wind.ne.jp - 110 - plain - %EMAILLOCALPART% - plain - - - co1.wind.ne.jp - 587 - plain - %EMAILLOCALPART% - plain - true - false - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/co2.wind.ne.jp.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/co2.wind.ne.jp.xml deleted file mode 100644 index 010477274..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/co2.wind.ne.jp.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - co2.wind.ne.jp - co2.wind.jp - 群馬インターネット - wind - - co2.wind.ne.jp - 110 - plain - %EMAILLOCALPART% - plain - - - co2.wind.ne.jp - 587 - plain - %EMAILLOCALPART% - plain - true - false - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/co3.wind.ne.jp.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/co3.wind.ne.jp.xml deleted file mode 100644 index 498384cb0..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/co3.wind.ne.jp.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - co3.wind.ne.jp - co3.wind.jp - 群馬インターネット - wind - - co3.wind.ne.jp - 110 - plain - %EMAILLOCALPART% - plain - - - co3.wind.ne.jp - 587 - plain - %EMAILLOCALPART% - plain - true - false - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/cocoa.plala.or.jp.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/cocoa.plala.or.jp.xml deleted file mode 100644 index 5387cd368..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/cocoa.plala.or.jp.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - cocoa.plala.or.jp - ぷらら - ぷらら - - cocoa.mail.plala.or.jp - 110 - plain - %EMAILLOCALPART% - plain - - - cocoa.mail.plala.or.jp - 587 - plain - %EMAILLOCALPART% - plain - true - false - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/coda.plala.or.jp.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/coda.plala.or.jp.xml deleted file mode 100644 index f668775d8..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/coda.plala.or.jp.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - coda.plala.or.jp - ぷらら - ぷらら - - coda.mail.plala.or.jp - 110 - plain - %EMAILLOCALPART% - plain - - - coda.mail.plala.or.jp - 587 - plain - %EMAILLOCALPART% - plain - true - false - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/comcast.net.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/comcast.net.xml deleted file mode 100644 index a78656b58..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/comcast.net.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - comcast.net - Comcast - Comcast - - mail.comcast.net - 110 - STARTTLS - %EMAILLOCALPART% - password-cleartext - - - smtp.comcast.net - 587 - STARTTLS - %EMAILLOCALPART% - password-cleartext - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/concerto.plala.or.jp.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/concerto.plala.or.jp.xml deleted file mode 100644 index 1c190b5d7..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/concerto.plala.or.jp.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - concerto.plala.or.jp - ぷらら - ぷらら - - concerto.mail.plala.or.jp - 110 - plain - %EMAILLOCALPART% - plain - - - concerto.mail.plala.or.jp - 587 - plain - %EMAILLOCALPART% - plain - true - false - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/coral.plala.or.jp.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/coral.plala.or.jp.xml deleted file mode 100644 index 1c52fcee3..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/coral.plala.or.jp.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - coral.plala.or.jp - ぷらら - ぷらら - - coral.mail.plala.or.jp - 110 - plain - %EMAILLOCALPART% - plain - - - coral.mail.plala.or.jp - 587 - plain - %EMAILLOCALPART% - plain - true - false - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/courante.plala.or.jp.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/courante.plala.or.jp.xml deleted file mode 100644 index 05976ef0b..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/courante.plala.or.jp.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - courante.plala.or.jp - ぷらら - ぷらら - - courante.mail.plala.or.jp - 110 - plain - %EMAILLOCALPART% - plain - - - courante.mail.plala.or.jp - 587 - plain - %EMAILLOCALPART% - plain - true - false - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/cpost.plala.or.jp.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/cpost.plala.or.jp.xml deleted file mode 100644 index 613d3774b..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/cpost.plala.or.jp.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - cpost.plala.or.jp - ぷらら - ぷらら - - cpost.mail.plala.or.jp - 110 - plain - %EMAILLOCALPART% - plain - - - cpost.mail.plala.or.jp - 587 - plain - %EMAILLOCALPART% - plain - true - false - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/cream.plala.or.jp.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/cream.plala.or.jp.xml deleted file mode 100644 index 16e232591..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/cream.plala.or.jp.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - cream.plala.or.jp - ぷらら - ぷらら - - cream.mail.plala.or.jp - 110 - plain - %EMAILLOCALPART% - plain - - - cream.mail.plala.or.jp - 587 - plain - %EMAILLOCALPART% - plain - true - false - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/dan.wind.ne.jp.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/dan.wind.ne.jp.xml deleted file mode 100644 index b027d98d0..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/dan.wind.ne.jp.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - dan.wind.ne.jp - dan.wind.jp - dan.wind.co.jp - dan.gunmanet.or.jp - dan.gunmanet.ne.jp - 群馬インターネット - wind - - dan.wind.ne.jp - 110 - plain - %EMAILLOCALPART% - plain - - - dan.wind.ne.jp - 587 - plain - %EMAILLOCALPART% - plain - true - false - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/dance.plala.or.jp.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/dance.plala.or.jp.xml deleted file mode 100644 index 74f90c8fb..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/dance.plala.or.jp.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - dance.plala.or.jp - ぷらら - ぷらら - - dance.mail.plala.or.jp - 110 - plain - %EMAILLOCALPART% - plain - - - dance.mail.plala.or.jp - 587 - plain - %EMAILLOCALPART% - plain - true - false - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/dd.iij4u.or.jp.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/dd.iij4u.or.jp.xml deleted file mode 100644 index 5d4221816..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/dd.iij4u.or.jp.xml +++ /dev/null @@ -1,33 +0,0 @@ - - - - dd.iij4u.or.jp - ff.iij4u.or.jp - hh.iij4u.or.jp - kk.iij4u.or.jp - nn.iij4u.or.jp - pp.iij4u.or.jp - rr.iij4u.or.jp - ss.iij4u.or.jp - bc.iij4u.or.jp - bk.iij4u.or.jp - bp.iij4u.or.jp - bu.iij4u.or.jp - IIJ4U - IIJ4U - - mbox.iij4u.or.jp - 110 - STARTTLS - %EMAILLOCALPART%.%EMAILDOMAIN% - password-encrypted - - - mbox.iij4u.or.jp - 587 - STARTTLS - %EMAILLOCALPART%.%EMAILDOMAIN% - password-encrypted - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/df.eu.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/df.eu.xml deleted file mode 100644 index 9d54fd2d5..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/df.eu.xml +++ /dev/null @@ -1,33 +0,0 @@ - - - - - ispgateway.de - domainFACTORY - domainFACTORY - - sslmailpool.ispgateway.de - 993 - SSL - %EMAILADDRESS% - password-cleartext - - - sslmailpool.ispgateway.de - 995 - SSL - %EMAILADDRESS% - password-cleartext - - - smtprelaypool.ispgateway.de - 465 - SSL - %EMAILADDRESS% - password-cleartext - - - Configuration of Thunderbird (2, 3, 3.1) and others - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/dmail.plala.or.jp.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/dmail.plala.or.jp.xml deleted file mode 100644 index f742605b4..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/dmail.plala.or.jp.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - dmail.plala.or.jp - ぷらら - ぷらら - - dmail.mail.plala.or.jp - 110 - plain - %EMAILLOCALPART% - plain - - - dmail.mail.plala.or.jp - 587 - plain - %EMAILLOCALPART% - plain - true - false - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/earthlink.net.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/earthlink.net.xml deleted file mode 100644 index 6807e32cc..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/earthlink.net.xml +++ /dev/null @@ -1,35 +0,0 @@ - - - - earthlink.net - mindspring.com - ix.netcom.com - - EarthLink - EarthLink - - imap.earthlink.net - 143 - plain - %EMAILADDRESS% - password-encrypted - - - pop.earthlink.net - 110 - plain - %EMAILADDRESS% - password-encrypted - - - smtpauth.earthlink.net - 587 - STARTTLS - %EMAILADDRESS% - password-encrypted - - - POP settings, domains - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/ebony.plala.or.jp.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/ebony.plala.or.jp.xml deleted file mode 100644 index 11a275e99..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/ebony.plala.or.jp.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - ebony.plala.or.jp - ぷらら - ぷらら - - ebony.mail.plala.or.jp - 110 - plain - %EMAILLOCALPART% - plain - - - ebony.mail.plala.or.jp - 587 - plain - %EMAILLOCALPART% - plain - true - false - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/email.it.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/email.it.xml deleted file mode 100644 index 22ec45629..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/email.it.xml +++ /dev/null @@ -1,33 +0,0 @@ - - - - email.it - email.it - email.it - - imapmail.email.it - 993 - SSL - %EMAILADDRESS% - password-encrypted - - - popmail.email.it - 995 - SSL - %EMAILADDRESS% - password-encrypted - - - smtp.email.it - 587 - STARTTLS - %EMAILADDRESS% - password-cleartext - - - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/email.plala.or.jp.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/email.plala.or.jp.xml deleted file mode 100644 index 45a8e0d50..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/email.plala.or.jp.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - email.plala.or.jp - ぷらら - ぷらら - - email.mail.plala.or.jp - 110 - plain - %EMAILLOCALPART% - plain - - - email.mail.plala.or.jp - 587 - plain - %EMAILLOCALPART% - plain - true - false - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/ewetel.de.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/ewetel.de.xml deleted file mode 100644 index b61ac4c6d..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/ewetel.de.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - ewetel.de - ewetel.net - EWE Tel - EWE Tel - - pop3s-1.ewetel.net - 995 - SSL - password-cleartext - %EMAILLOCALPART% - - - smtps-1.ewetel.net - 25 - STARTTLS - password-cleartext - %EMAILLOCALPART% - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/fantasy.plala.or.jp.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/fantasy.plala.or.jp.xml deleted file mode 100644 index 5774cc239..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/fantasy.plala.or.jp.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - fantasy.plala.or.jp - ぷらら - ぷらら - - fantasy.mail.plala.or.jp - 110 - plain - %EMAILLOCALPART% - plain - - - fantasy.mail.plala.or.jp - 587 - plain - %EMAILLOCALPART% - plain - true - false - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/flamenco.plala.or.jp.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/flamenco.plala.or.jp.xml deleted file mode 100644 index 3a8ade748..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/flamenco.plala.or.jp.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - flamenco.plala.or.jp - ぷらら - ぷらら - - flamenco.mail.plala.or.jp - 110 - plain - %EMAILLOCALPART% - plain - - - flamenco.mail.plala.or.jp - 587 - plain - %EMAILLOCALPART% - plain - true - false - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/fmail.plala.or.jp.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/fmail.plala.or.jp.xml deleted file mode 100644 index c4a4dbc14..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/fmail.plala.or.jp.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - fmail.plala.or.jp - ぷらら - ぷらら - - fmail.mail.plala.or.jp - 110 - plain - %EMAILLOCALPART% - plain - - - fmail.mail.plala.or.jp - 587 - plain - %EMAILLOCALPART% - plain - true - false - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/francetelecom.fr.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/francetelecom.fr.xml deleted file mode 100644 index 32d67bfc0..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/francetelecom.fr.xml +++ /dev/null @@ -1,31 +0,0 @@ - - - - wanadoo.fr - orange.fr - France Telecom / Orange - Orange - - pop.orange.fr - 110 - plain - %EMAILLOCALPART% - password-cleartext - - - imap.orange.fr - 143 - plain - %EMAILLOCALPART% - password-cleartext - - - smtp.orange.fr - 587 - plain - %EMAILLOCALPART% - password-cleartext - - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/free.fr.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/free.fr.xml deleted file mode 100644 index a3fac4d29..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/free.fr.xml +++ /dev/null @@ -1,62 +0,0 @@ - - - - free.fr - Free Telecom - free.fr - - - imap.free.fr - 993 - SSL - %EMAILLOCALPART% - password-cleartext - - - - pop.free.fr - 995 - SSL - %EMAILLOCALPART% - password-cleartext - - - - smtp.free.fr - 25 - plain - %EMAILLOCALPART% - password-cleartext - client-IP-address - - - - - How to set up Thunderbird with Free.fr - Configurer Thunderbird avec Free - - - How to setup a secure IMAP account - Serveur de réception IMAP sécurisé SSL - - - How to enable authenticated SMTP - Comment activer le serveur d'envoi SMTP authentifié - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/freenet.de.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/freenet.de.xml deleted file mode 100644 index e2cb78872..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/freenet.de.xml +++ /dev/null @@ -1,56 +0,0 @@ - - - - freenet.de - Freenet Mail - Freenet - - mx.freenet.de - 993 - SSL - password-encrypted - %EMAILADDRESS% - - - mx.freenet.de - 143 - STARTTLS - password-encrypted - %EMAILADDRESS% - - - mx.freenet.de - 995 - SSL - password-cleartext - %EMAILADDRESS% - - - mx.freenet.de - 110 - STARTTLS - password-cleartext - %EMAILADDRESS% - - - mx.freenet.de - 465 - SSL - password-encrypted - %EMAILADDRESS% - - - mx.freenet.de - 587 - STARTTLS - password-encrypted - %EMAILADDRESS% - - - Generic settings page - - - TB 2.0 IMAP settings - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/fuga.plala.or.jp.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/fuga.plala.or.jp.xml deleted file mode 100644 index f41116add..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/fuga.plala.or.jp.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - fuga.plala.or.jp - ぷらら - ぷらら - - fuga.mail.plala.or.jp - 110 - plain - %EMAILLOCALPART% - plain - - - fuga.mail.plala.or.jp - 587 - plain - %EMAILLOCALPART% - plain - true - false - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/gandi.net.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/gandi.net.xml deleted file mode 100644 index b71cdbb18..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/gandi.net.xml +++ /dev/null @@ -1,58 +0,0 @@ - - - - - - gandi.net - Gandi Mail - Gandi - - mail.gandi.net - 993 - SSL - password-cleartext - %EMAILADDRESS% - - - mail.gandi.net - 143 - STARTTLS - password-cleartext - %EMAILADDRESS% - - - mail.gandi.net - 995 - SSL - password-cleartext - %EMAILADDRESS% - - - mail.gandi.net - 110 - STARTTLS - password-cleartext - %EMAILADDRESS% - - - mail.gandi.net - 465 - SSL - password-cleartext - %EMAILADDRESS% - - - mail.gandi.net - 587 - STARTTLS - password-cleartext - %EMAILADDRESS% - - - Generic settings page - - - Create new mailbox, including MX servers to use in DNS - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/gmail.plala.or.jp.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/gmail.plala.or.jp.xml deleted file mode 100644 index d369859a4..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/gmail.plala.or.jp.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - gmail.plala.or.jp - ぷらら - ぷらら - - gmail.mail.plala.or.jp - 110 - plain - %EMAILLOCALPART% - plain - - - gmail.mail.plala.or.jp - 587 - plain - %EMAILLOCALPART% - plain - true - false - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/gmx.com.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/gmx.com.xml deleted file mode 100644 index 6c2809feb..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/gmx.com.xml +++ /dev/null @@ -1,72 +0,0 @@ - - - - gmx.com - gmx.tm - gmx.us - gmx.co.uk - gmx.es - gmx.fr - gmx.ca - gmx.cn - gmx.co.in - gmx.com.br - gmx.com.my - gmx.hk - gmx.ie - gmx.ph - gmx.pt - gmx.ru - gmx.se - gmx.sg - gmx.tw - gmx.com.tr - gmx.it - gmx.li - - GMX Freemail - GMX - - imap.gmx.com - 993 - SSL - %EMAILADDRESS% - password-cleartext - - - imap.gmx.com - 143 - STARTTLS - %EMAILADDRESS% - password-cleartext - - - pop.gmx.com - 995 - SSL - %EMAILADDRESS% - password-cleartext - - - pop.gmx.com - 110 - STARTTLS - %EMAILADDRESS% - password-cleartext - - - mail.gmx.com - 465 - SSL - %EMAILADDRESS% - password-cleartext - - - mail.gmx.com - 587 - STARTTLS - %EMAILADDRESS% - password-cleartext - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/gmx.net.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/gmx.net.xml deleted file mode 100644 index 5a33fb045..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/gmx.net.xml +++ /dev/null @@ -1,66 +0,0 @@ - - - - gmx.net - gmx.de - gmx.at - gmx.ch - gmx.eu - gmx.biz - gmx.org - gmx.info - - - GMX Freemail - GMX - - - imap.gmx.net - 993 - SSL - - %EMAILADDRESS% - password-cleartext - - - imap.gmx.net - 143 - STARTTLS - %EMAILADDRESS% - password-cleartext - - - pop.gmx.net - 995 - SSL - - %EMAILADDRESS% - password-cleartext - - - pop.gmx.net - 110 - STARTTLS - %EMAILADDRESS% - password-cleartext - - - mail.gmx.net - 465 - SSL - - %EMAILADDRESS% - password-cleartext - - - mail.gmx.net - 587 - STARTTLS - %EMAILADDRESS% - password-cleartext - - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/go.tvm.ne.jp.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/go.tvm.ne.jp.xml deleted file mode 100644 index e8e5570c4..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/go.tvm.ne.jp.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - go.tvm.ne.jp - テレビ松本ケーブルインターネットサービス - TVM-Net - - go.tvm.ne.jp - 110 - plain - %EMAILLOCALPART% - password-cleartext - - - go.tvm.ne.jp - 25 - plain - %EMAILLOCALPART% - password-cleartext - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/goo.jp.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/goo.jp.xml deleted file mode 100644 index ef4d5f78e..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/goo.jp.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - goo.jp - goo メールアドバンス - goo - - pop.mail.goo.ne.jp - 110 - plain - %EMAILLOCALPART% - password-cleartext - - - smtp.mail.goo.ne.jp - 587 - plain - %EMAILLOCALPART% - password-cleartext - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/googlemail.com.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/googlemail.com.xml deleted file mode 100644 index ea2a63e25..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/googlemail.com.xml +++ /dev/null @@ -1,52 +0,0 @@ - - - - gmail.com - googlemail.com - - google.com - - jazztel.es - Google Mail - GMail - - imap.googlemail.com - 993 - SSL - %EMAILADDRESS% - password-cleartext - - - pop.googlemail.com - 995 - SSL - %EMAILADDRESS% - password-cleartext - - true - - - - smtp.googlemail.com - 465 - SSL - %EMAILADDRESS% - password-cleartext - - - You need to enable IMAP access - - - How to enable IMAP/POP3 in GMail - - - How to configure email clients for IMAP - - - How to configure email clients for POP3 - - - How to configure TB 2.0 for POP3 - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/grape.plala.or.jp.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/grape.plala.or.jp.xml deleted file mode 100644 index 09fb37850..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/grape.plala.or.jp.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - grape.plala.or.jp - ぷらら - ぷらら - - grape.mail.plala.or.jp - 110 - plain - %EMAILLOCALPART% - plain - - - grape.mail.plala.or.jp - 587 - plain - %EMAILLOCALPART% - plain - true - false - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/gray.plala.or.jp.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/gray.plala.or.jp.xml deleted file mode 100644 index efeb3547f..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/gray.plala.or.jp.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - gray.plala.or.jp - ぷらら - ぷらら - - gray.mail.plala.or.jp - 110 - plain - %EMAILLOCALPART% - plain - - - gray.mail.plala.or.jp - 587 - plain - %EMAILLOCALPART% - plain - true - false - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/hal.ne.jp.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/hal.ne.jp.xml deleted file mode 100644 index 065387710..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/hal.ne.jp.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - hal.ne.jp - ハルインターネット - HAL - - mail.hal.ne.jp - 110 - plain - %EMAILADDRESS% - password-cleartext - - - mail.hal.ne.jp - 587 - plain - %EMAILLOCALPART% - password-encrypted - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/hana.or.jp.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/hana.or.jp.xml deleted file mode 100644 index e2e7d7fe9..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/hana.or.jp.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - hana.or.jp - きたうら花ねっと - 花ねっと - - mail.hana.or.jp - 110 - plain - %EMAILLOCALPART% - password-cleartext - - - mail.hana.or.jp - 587 - plain - %EMAILLOCALPART% - password-cleartext - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/hotmail.com.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/hotmail.com.xml deleted file mode 100644 index 1474ece5f..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/hotmail.com.xml +++ /dev/null @@ -1,37 +0,0 @@ - - - - hotmail.com - hotmail.co.uk - hotmail.co.jp - hotmail.com.br - hotmail.de - hotmail.fr - hotmail.it - hotmail.es - live.com - live.co.uk - live.co.jp - live.de - live.fr - live.it - live.jp - msn.com - Microsoft Live Hotmail - Hotmail - - pop3.live.com - 995 - SSL - %EMAILADDRESS% - password-cleartext - - - smtp.live.com - 587 - STARTTLS - %EMAILADDRESS% - password-cleartext - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/i.softbank.jp.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/i.softbank.jp.xml deleted file mode 100644 index 965d5e834..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/i.softbank.jp.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - i.softbank.jp - SoftBank - SoftBank - - imap.softbank.jp - 993 - SSL - password-cleartext - %EMAILLOCALPART% - - - smtp.softbank.jp - 465 - SSL - password-cleartext - %EMAILLOCALPART% - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/ic-net.or.jp.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/ic-net.or.jp.xml deleted file mode 100644 index 8a8e99502..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/ic-net.or.jp.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - ic-net.or.jp - IC-NET - IC-NET - - mail.ic-net.or.jp - 110 - plain - %EMAILLOCALPART% - password-cleartext - - - smtp.ic-net.or.jp - 587 - plain - %EMAILLOCALPART% - password-cleartext - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/iijmio-mail.jp.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/iijmio-mail.jp.xml deleted file mode 100644 index 00a385ed2..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/iijmio-mail.jp.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - iijmio-mail.jp - miomio.jp - miobox.jp - e23.jp - x-il.jp - IIJmio セーフティメール - IIJmio - - mbox.iijmio-mail.jp - 110 - STARTTLS - %EMAILLOCALPART%.%EMAILDOMAIN% - password-encrypted - - - mbox.iijmio-mail.jp - 587 - STARTTLS - %EMAILLOCALPART%.%EMAILDOMAIN% - password-encrypted - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/iiyama-catv.ne.jp.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/iiyama-catv.ne.jp.xml deleted file mode 100644 index 96477d0a0..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/iiyama-catv.ne.jp.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - iiyama-catv.ne.jp - ケーブルテレビiネット飯山 - iネット飯山 - - mail.iiyama-catv.ne.jp - 110 - plain - %EMAILLOCALPART% - password-cleartext - - - smtp.iiyama-catv.ne.jp - 25 - plain - none - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/imail.plala.or.jp.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/imail.plala.or.jp.xml deleted file mode 100644 index d4c8897d2..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/imail.plala.or.jp.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - imail.plala.or.jp - ぷらら - ぷらら - - imail.mail.plala.or.jp - 110 - plain - %EMAILLOCALPART% - plain - - - imail.mail.plala.or.jp - 587 - plain - %EMAILLOCALPART% - plain - true - false - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/inbox.lt.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/inbox.lt.xml deleted file mode 100644 index 336c81724..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/inbox.lt.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - inbox.lt - - Inbox.lt - Inbox.lt - - mail.inbox.lt - 995 - SSL - %EMAILLOCALPART% - password-cleartext - - true - - - - mail.inbox.lt - 587 - STARTTLS - %EMAILLOCALPART% - password-cleartext - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/inbox.lv.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/inbox.lv.xml deleted file mode 100644 index 13786265a..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/inbox.lv.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - inbox.lv - - Inbox.lv - Inbox.lv - - mail.inbox.lv - 995 - SSL - %EMAILLOCALPART% - password-cleartext - - true - - - - mail.inbox.lv - 587 - STARTTLS - %EMAILLOCALPART% - password-cleartext - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/indigo.plala.or.jp.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/indigo.plala.or.jp.xml deleted file mode 100644 index 2d21e2d69..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/indigo.plala.or.jp.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - indigo.plala.or.jp - ぷらら - ぷらら - - indigo.mail.plala.or.jp - 110 - plain - %EMAILLOCALPART% - plain - - - indigo.mail.plala.or.jp - 587 - plain - %EMAILLOCALPART% - plain - true - false - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/inet-shibata.or.jp.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/inet-shibata.or.jp.xml deleted file mode 100644 index f12c85bc3..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/inet-shibata.or.jp.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - inet-shibata.or.jp - インターネット新発田 - INET-SHIBATA - - po.inet-shibata.or.jp - 110 - plain - %EMAILLOCALPART% - password-cleartext - - - po.inet-shibata.or.jp - 25 - plain - %EMAILLOCALPART% - password-cleartext - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/internode.on.net.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/internode.on.net.xml deleted file mode 100644 index ee7dab103..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/internode.on.net.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - - internode.on.net - Internode - Internode - - mail.internode.on.net - 993 - SSL - password-cleartext - %EMAILADDRESS% - - - mail.internode.on.net - 995 - SSL - password-cleartext - %EMAILADDRESS% - - - mail.internode.on.net - 465 - SSL - password-cleartext - %EMAILADDRESS% - - - Secure settings, generic - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/ipax.at.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/ipax.at.xml deleted file mode 100644 index 3d6d3b445..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/ipax.at.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - ipax.at - IPAX Internet Services - IPAX - - mail.ipax.at - 993 - SSL - %EMAILADDRESS% - password-cleartext - - - - mail.ipax.at - 465 - SSL - %EMAILADDRESS% - password-cleartext - - - - Configure Thunderbird 3 for IMAP - Thunderbird 3 mit IMAP konfigurieren - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/ivory.plala.or.jp.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/ivory.plala.or.jp.xml deleted file mode 100644 index a3a0b40c7..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/ivory.plala.or.jp.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - ivory.plala.or.jp - ぷらら - ぷらら - - ivory.mail.plala.or.jp - 110 - plain - %EMAILLOCALPART% - plain - - - ivory.mail.plala.or.jp - 587 - plain - %EMAILLOCALPART% - plain - true - false - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/iwafune.ne.jp.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/iwafune.ne.jp.xml deleted file mode 100644 index f7cf4cd70..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/iwafune.ne.jp.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - iwafune.ne.jp - インターネットいわふね - IWAFUNE - - po.iwafune.ne.jp - 110 - plain - %EMAILLOCALPART% - password-cleartext - - - po.iwafune.ne.jp - 25 - plain - %EMAILLOCALPART% - password-cleartext - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/jade.plala.or.jp.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/jade.plala.or.jp.xml deleted file mode 100644 index 998ff0ce4..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/jade.plala.or.jp.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - jade.plala.or.jp - ぷらら - ぷらら - - jade.mail.plala.or.jp - 110 - plain - %EMAILLOCALPART% - plain - - - jade.mail.plala.or.jp - 587 - plain - %EMAILLOCALPART% - plain - true - false - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/janis.or.jp.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/janis.or.jp.xml deleted file mode 100644 index d23012b01..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/janis.or.jp.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - janis.or.jp - Janis - Janis - - mail.%EMAILDOMAIN% - 110 - plain - %EMAILLOCALPART% - password-cleartext - - - smtp.%EMAILDOMAIN% - 25 - plain - none - client-IP-address - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/jet.ne.jp.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/jet.ne.jp.xml deleted file mode 100644 index 13e49f02a..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/jet.ne.jp.xml +++ /dev/null @@ -1,29 +0,0 @@ - - - - jet.ne.jp - JETINTERNET - JET - - pop.jet.ne.jp - 110 - plain - %EMAILLOCALPART% - password-encrypted - - - imap.jet.ne.jp - 993 - SSL - %EMAILLOCALPART% - password-encrypted - - - smtp.jet.ne.jp - 587 - plain - %EMAILLOCALPART% - password-encrypted - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/ji.jet.ne.jp.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/ji.jet.ne.jp.xml deleted file mode 100644 index ecc22eb8d..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/ji.jet.ne.jp.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - ji.jet.ne.jp - JETINTERNET - JET - - pop02.jet.ne.jp - 110 - plain - %EMAILLOCALPART% - password-encrypted - - - smtp02.jet.ne.jp - 587 - plain - %EMAILLOCALPART% - password-encrypted - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/jmail.plala.or.jp.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/jmail.plala.or.jp.xml deleted file mode 100644 index a8c80b202..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/jmail.plala.or.jp.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - jmail.plala.or.jp - ぷらら - ぷらら - - jmail.mail.plala.or.jp - 110 - plain - %EMAILLOCALPART% - plain - - - jmail.mail.plala.or.jp - 587 - plain - %EMAILLOCALPART% - plain - true - false - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/kabelmail.de.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/kabelmail.de.xml deleted file mode 100644 index 6f58d3e1a..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/kabelmail.de.xml +++ /dev/null @@ -1,31 +0,0 @@ - - - - kabelmail.de - Kabel Deutschland - Kabel D - - pop3.kabelmail.de - 995 - SSL - %EMAILADDRESS% - password-cleartext - - - smtp.kabelmail.de - 465 - SSL - %EMAILADDRESS% - password-cleartext - - - smtp.kabelmail.de - 25 - STARTTLS - %EMAILADDRESS% - password-cleartext - - - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/kelcom.net.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/kelcom.net.xml deleted file mode 100644 index a3e211afc..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/kelcom.net.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - kelcom.net - KELCOM Internet - KELCOM - - pop1.kelcom.net - 110 - plain - %EMAILADDRESS% - password-cleartext - - - smtp.kelcom.net - 25 - plain - %EMAILADDRESS% - password-cleartext - - - \ No newline at end of file diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/khaki.plala.or.jp.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/khaki.plala.or.jp.xml deleted file mode 100644 index 09b562ce6..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/khaki.plala.or.jp.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - khaki.plala.or.jp - ぷらら - ぷらら - - khaki.mail.plala.or.jp - 110 - plain - %EMAILLOCALPART% - plain - - - khaki.mail.plala.or.jp - 587 - plain - %EMAILLOCALPART% - plain - true - false - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/kl.wind.ne.jp.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/kl.wind.ne.jp.xml deleted file mode 100644 index 80bd91ee8..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/kl.wind.ne.jp.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - - kl.wind.ne.jp - kl.wind.jp - kl.wind.co.jp - kl.gunmanet.or.jp - kl.gunmanet.ne.jp - k1.wind.ne.jp - k1.wind.jp - k1.gunmanet.or.jp - k1.gunmanet.ne.jp - 群馬インターネット - wind - - kl.wind.ne.jp - 110 - plain - %EMAILLOCALPART% - plain - - - kl.wind.ne.jp - 587 - plain - %EMAILLOCALPART% - plain - true - false - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/kmail.plala.or.jp.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/kmail.plala.or.jp.xml deleted file mode 100644 index 7e88d5f88..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/kmail.plala.or.jp.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - kmail.plala.or.jp - ぷらら - ぷらら - - kmail.mail.plala.or.jp - 110 - plain - %EMAILLOCALPART% - plain - - - kmail.mail.plala.or.jp - 587 - plain - %EMAILLOCALPART% - plain - true - false - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/kokuyou.ne.jp.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/kokuyou.ne.jp.xml deleted file mode 100644 index 5e6d65702..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/kokuyou.ne.jp.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - kokuyou.ne.jp - 長和町黒耀の里ゆいねっと - ゆいねっと - - mail.kokuyou.ne.jp - 110 - plain - %EMAILLOCALPART% - password-cleartext - - - smtp.kokuyou.ne.jp - 25 - plain - none - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/lapis.plala.or.jp.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/lapis.plala.or.jp.xml deleted file mode 100644 index eb54651cb..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/lapis.plala.or.jp.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - lapis.plala.or.jp - ぷらら - ぷらら - - lapis.mail.plala.or.jp - 110 - plain - %EMAILLOCALPART% - plain - - - lapis.mail.plala.or.jp - 587 - plain - %EMAILLOCALPART% - plain - true - false - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/laposte.net.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/laposte.net.xml deleted file mode 100644 index 18a7257cf..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/laposte.net.xml +++ /dev/null @@ -1,37 +0,0 @@ - - - - laposte.net - LaPoste - LaPoste - - imap.laposte.net - 993 - SSL - %EMAILLOCALPART% - password-cleartext - - - pop.laposte.net - 995 - SSL - %EMAILLOCALPART% - password-cleartext - - - smtp.laposte.net - 465 - SSL - %EMAILLOCALPART% - password-cleartext - - - Annonce sur le site de Geckozone (non-officiel) - News on the Geckozone website (unofficial) - - - Aide officielle (non-SSL) - Official support (no SSL) - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/lemon.plala.or.jp.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/lemon.plala.or.jp.xml deleted file mode 100644 index 26846d8f5..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/lemon.plala.or.jp.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - lemon.plala.or.jp - ぷらら - ぷらら - - lemon.mail.plala.or.jp - 110 - plain - %EMAILLOCALPART% - plain - - - lemon.mail.plala.or.jp - 587 - plain - %EMAILLOCALPART% - plain - true - false - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/libero.it.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/libero.it.xml deleted file mode 100644 index 172e2a00a..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/libero.it.xml +++ /dev/null @@ -1,34 +0,0 @@ - - - - libero.it - iol.it - blu.it - inwind.it - Libero Mail - Libero - - imapmail.libero.it - 143 - plain - %EMAILADDRESS% - password-encrypted - - - popmail.libero.it - 110 - plain - %EMAILADDRESS% - password-encrypted - - - smtp.libero.it - 25 - plain - %EMAILADDRESS% - password-encrypted - - - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/lilac.plala.or.jp.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/lilac.plala.or.jp.xml deleted file mode 100644 index 1283c0246..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/lilac.plala.or.jp.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - lilac.plala.or.jp - ぷらら - ぷらら - - lilac.mail.plala.or.jp - 110 - plain - %EMAILLOCALPART% - plain - - - lilac.mail.plala.or.jp - 587 - plain - %EMAILLOCALPART% - plain - true - false - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/lime.plala.or.jp.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/lime.plala.or.jp.xml deleted file mode 100644 index 94e092548..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/lime.plala.or.jp.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - lime.plala.or.jp - ぷらら - ぷらら - - lime.mail.plala.or.jp - 110 - plain - %EMAILLOCALPART% - plain - - - lime.mail.plala.or.jp - 587 - plain - %EMAILLOCALPART% - plain - true - false - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/mahoroba.ne.jp.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/mahoroba.ne.jp.xml deleted file mode 100644 index 7365039ff..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/mahoroba.ne.jp.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - mahoroba.ne.jp - インターネットまほろば - まほろば - - mail.mahoroba.ne.jp - 110 - plain - %EMAILLOCALPART% - password-cleartext - - - mail.mahoroba.ne.jp - 587 - plain - %EMAILLOCALPART% - password-cleartext - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/mail.com.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/mail.com.xml deleted file mode 100644 index de1c34691..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/mail.com.xml +++ /dev/null @@ -1,248 +0,0 @@ - - - - - - mail.com - mail.org - email.com - post.com - usa.com - accountant.com - consultant.com - dr.com - engineer.com - cheerful.com - techie.com - linuxmail.org - europe.com - london.com - uymail.com - myself.com - iname.com - writeme.com - - 2die4.com - activist.com - adexec.com - africamail.com - aircraftmail.com - alabama.usa.com - alaska.usa.com - allergist.com - alumni.com - alumnidirector.com - americamail.com - amorous.com - angelic.com - archaeologist.com - arizona.usa.com - artlover.com - asia-mail.com - atheist.com - australiamail.com - bartender.net - berlin.com - bigger.com - bikerider.com - birdlover.com - blader.com - boardermail.com - brazilmail.com - brew-master.com - california.usa.com - californiamail.com - caress.com - catlover.com - chef.net - chemist.com - chinamail.com - clerk.com - cliffhanger.com - collector.org - columnist.com - comic.com - computer4u.com - contractor.net - coolsite.net - counsellor.com - count.com - couple.com - cutey.com - cyberdude.com - cybergal.com - cyber-wizard.com - dallasmail.com - dbzmail.com - deliveryman.com - diplomats.com - disciples.com - doctor.com - doglover.com - doramail.com - dublin.com - earthling.net - elvisfan.com - englandmail.com - europemail.com - execs.com - fan.com - feelings.com - financier.com - fireman.net - florida.usa.com - footballer.com - gardener.com - geologist.com - germanymail.com - graduate.org - graphic-designer.com - hackermail.com - hairdresser.net - hilarious.com - hockeymail.com - homemail.com - hot-shot.com - hour.com - humanoid.net - illinois.usa.com - innocent.com - inorbit.com - instruction.com - instructor.net - insurer.com - irelandmail.com - italymail.com - japan.com - journalist.com - keromail.com - kittymail.com - koreamail.com - lawyer.com - legislator.com - loveable.com - lovecat.com - mad.scientist.com - madonnafan.com - madrid.com - marchmail.com - mexicomail.com - mindless.com - minister.com - mobsters.com - monarchy.com - moscowmail.com - munich.com - musician.org - muslim.com - newyork.usa.com - null.net - nycmail.com - oath.com - optician.com - pacificwest.com - petlover.com - photographer.net - playful.com - poetic.com - politician.com - popstar.com - presidency.com - priest.com - programmer.net - publicist.com - realtyagent.com - reborn.com - reggaefan.com - religious.com - repairman.com - representative.com - rescueteam.com - revenue.com - rocketship.com - rockfan.com - rome.com - royal.net - saintly.com - salesperson.net - sanfranmail.com - scientist.com - scotlandmail.com - secretary.net - seductive.com - singapore.com - snakebite.com - songwriter.net - soon.com - spainmail.com - teachers.org - technologist.com - texas.usa.com - thegame.com - therapist.net - toke.com - tokyo.com - toothfairy.com - tvstar.com - umpire.com - wallet.com - webname.com - weirdness.com - who.net - whoever.com - winning.com - witty.com - worker.com - workmail.com - yours.com - - mail.com - mail.com - - imap.mail.com - 993 - SSL - %EMAILADDRESS% - password-cleartext - - - imap.mail.com - 143 - STARTTLS - %EMAILADDRESS% - password-cleartext - - - pop.mail.com - 995 - SSL - %EMAILADDRESS% - password-cleartext - - - pop.mail.com - 110 - STARTTLS - %EMAILADDRESS% - password-cleartext - - - smtp.mail.com - 465 - SSL - %EMAILADDRESS% - password-cleartext - - - smtp.mail.com - 587 - STARTTLS - %EMAILADDRESS% - password-cleartext - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/mail.dk.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/mail.dk.xml deleted file mode 100644 index 2a16f8995..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/mail.dk.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - mail.dk - TDC (DK) - TDC - - pop3.mail.dk - 110 - plain - %EMAILADDRESS% - password-cleartext - - - asmtp.mail.dk - 587 - plain - %EMAILADDRESS% - password-cleartext - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/mail.iwafune.ne.jp.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/mail.iwafune.ne.jp.xml deleted file mode 100644 index 38123dc5c..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/mail.iwafune.ne.jp.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - mail.iwafune.ne.jp - インターネットいわふね - IWAFUNE - - mail.iwafune.ne.jp - 110 - plain - %EMAILLOCALPART% - password-cleartext - - - mail.iwafune.ne.jp - 25 - plain - %EMAILLOCALPART% - password-cleartext - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/mail.ru.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/mail.ru.xml deleted file mode 100644 index bc86f1fcc..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/mail.ru.xml +++ /dev/null @@ -1,42 +0,0 @@ - - - - mail.ru - inbox.ru - list.ru - bk.ru - mail.ru - mail.ru - - pop.mail.ru - 995 - SSL - %EMAILADDRESS% - password-cleartext - - - pop.mail.ru - 110 - STARTTLS - %EMAILADDRESS% - password-cleartext - - - smtp.mail.ru - 465 - SSL - %EMAILADDRESS% - password-cleartext - - - smtp.mail.ru - 587 - STARTTLS - %EMAILADDRESS% - password-cleartext - - - - POP, Thunderbird, with screenshots - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/mail.telenor.dk.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/mail.telenor.dk.xml deleted file mode 100644 index 74dc63dcc..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/mail.telenor.dk.xml +++ /dev/null @@ -1,121 +0,0 @@ - - - - - mail.telenor.dk - vip.cybercity.dk - post.cybercity.dk - - email.dk - mobil.dk - privatmail.dk - info.dk - io.dk - it.dk - film.dk - worldonline.dk - wol.dk - - 1031.inord.dk - 123mail.dk - 12fuel.dk - 12mail.dk - 12move.dk - 2senior.dk - anarki.dk - anderledes.dk - begavet.dk - bitnisse.dk - city.dk - cool.dk - cyberdude.dk - cyberjunkie.dk - dk2net.dk - dk-online.dk - elinstallatoer.dk - elsker.dk - elvis.dk - fald.dk - fedt.dk - feminin.dk - forening.dk - gadefejer.dk - gason.dk - grin.dk - grov.dk - hardworking.dk - heaven.dk - hemmelig.dk - huleboer.dk - image.dk - inbound.dk - indbakke.dk - infile.dk - jyde.dk - klog.dk - knus.dk - krudt.dk - kulturel.dk - larsen.dk - lazy.dk - lystig.dk - mail.dia.dk - maskulin.dk - min-postkasse.dk - musling.dk - natteliv.dk - netbruger.dk - pedal.dk - pengemand.dk - pokerface.dk - post.dia.dk - postman.dk - privat.dia.dk - quake.dk - ready.dk - secret.dk - sleepy.dk - sporty.dk - superbruger.dk - talent.dk - tanke.dk - taxidriver.dk - teens.dk - teknik.dk - tjekket.dk - traceroute.dk - tv.dk - ugenstilbud.dk - ungdom.dk - video.dk - vittig.dk - Telenor Danmark - Telenor - - mail.telenor.dk - 143 - STARTTLS - %EMAILADDRESS% - password-cleartext - - - mail.telenor.dk - 110 - STARTTLS - %EMAILADDRESS% - password-cleartext - - - mail.telenor.dk - 587 - STARTTLS - %EMAILADDRESS% - password-cleartext - - - - - - Domain list source (requires login) - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/mail.wind.ne.jp.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/mail.wind.ne.jp.xml deleted file mode 100644 index 90bdf8ecf..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/mail.wind.ne.jp.xml +++ /dev/null @@ -1,29 +0,0 @@ - - - - mail.wind.ne.jp - mail.wind.jp - mail.wind.co.jp - mail.gunmanet.or.jp - mail.gunmanet.ne.jp - mail.gunmanet.jp - 群馬インターネット - wind - - mail.wind.ne.jp - 110 - plain - %EMAILLOCALPART% - plain - - - mail.wind.ne.jp - 587 - plain - %EMAILLOCALPART% - plain - true - false - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/maroon.plala.or.jp.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/maroon.plala.or.jp.xml deleted file mode 100644 index d2e00e2d0..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/maroon.plala.or.jp.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - maroon.plala.or.jp - ぷらら - ぷらら - - maroon.mail.plala.or.jp - 110 - plain - %EMAILLOCALPART% - plain - - - maroon.mail.plala.or.jp - 587 - plain - %EMAILLOCALPART% - plain - true - false - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/me.com.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/me.com.xml deleted file mode 100644 index 9c7d7311d..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/me.com.xml +++ /dev/null @@ -1,31 +0,0 @@ - - - mac.com - me.com - Apple iCloud - Apple - - imap.mail.me.com - 993 - SSL - %EMAILLOCALPART% - plain - - - - smtp.mail.me.com - 587 - STARTTLS - %EMAILLOCALPART% - plain - - - \ No newline at end of file diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/minuet.plala.or.jp.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/minuet.plala.or.jp.xml deleted file mode 100644 index af72bf264..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/minuet.plala.or.jp.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - minuet.plala.or.jp - ぷらら - ぷらら - - minuet.mail.plala.or.jp - 110 - plain - %EMAILLOCALPART% - plain - - - minuet.mail.plala.or.jp - 587 - plain - %EMAILLOCALPART% - plain - true - false - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/ml.murakami.ne.jp.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/ml.murakami.ne.jp.xml deleted file mode 100644 index c563dba3d..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/ml.murakami.ne.jp.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - ml.murakami.ne.jp - インターネットいわふね - IWAFUNE - - ml.murakami.ne.jp - 110 - plain - %EMAILLOCALPART% - password-cleartext - - - ml.murakami.ne.jp - 25 - plain - %EMAILLOCALPART% - password-cleartext - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/mnet.ne.jp.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/mnet.ne.jp.xml deleted file mode 100644 index 0965552fb..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/mnet.ne.jp.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - mnet.ne.jp - Mnet メール サービス - Mnetメール - - mail.mnet.ne.jp - 110 - plain - %EMAILADDRESS% - password-encrypted - - - mail.mnet.ne.jp - 587 - plain - %EMAILADDRESS% - password-encrypted - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/mopera.net.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/mopera.net.xml deleted file mode 100644 index 26f6037f9..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/mopera.net.xml +++ /dev/null @@ -1,50 +0,0 @@ - - - - mopera.net - mopera U - mopera U - - mail.mopera.net - 993 - SSL - %EMAILLOCALPART% - password-cleartext - - - mail.mopera.net - 143 - STARTTLS - %EMAILLOCALPART% - password-cleartext - - - mail.mopera.net - 995 - SSL - %EMAILLOCALPART% - password-cleartext - - - mail.mopera.net - 110 - STARTTLS - %EMAILLOCALPART% - password-cleartext - - - mail.mopera.net - 465 - SSL - %EMAILLOCALPART% - password-encrypted - - - mail.mopera.net - 587 - STARTTLS - %EMAILLOCALPART% - password-encrypted - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/mozilla.com.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/mozilla.com.xml deleted file mode 100644 index 3275fcf8d..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/mozilla.com.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - mozilla.com - mozillafoundation.org - Mozilla Corporation and Mozilla Foundation internal email addresses - mozilla.com - - mail.mozilla.com - 993 - SSL - %EMAILADDRESS% - password-cleartext - - - smtp.mozilla.org - 465 - SSL - %EMAILADDRESS% - password-cleartext - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/mx1.tiki.ne.jp.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/mx1.tiki.ne.jp.xml deleted file mode 100644 index d87f89eda..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/mx1.tiki.ne.jp.xml +++ /dev/null @@ -1,54 +0,0 @@ - - - - mx1.tiki.ne.jp - mx2.et.tiki.ne.jp - mx2.tiki.ne.jp - mx2.wt.tiki.ne.jp - mx3.et.tiki.ne.jp - mx3.tiki.ne.jp - mx4.et.tiki.ne.jp - mx4.tiki.ne.jp - mx5.et.tiki.ne.jp - mx5.tiki.ne.jp - mx6.et.tiki.ne.jp - mx6.tiki.ne.jp - mx7.tiki.ne.jp - mx8.tiki.ne.jp - mx9.tiki.ne.jp - mx21.tiki.ne.jp - mx22.tiki.ne.jp - mx31.tiki.ne.jp - mx32.tiki.ne.jp - mx35.tiki.ne.jp - mx36.tiki.ne.jp - mx41.tiki.ne.jp - mx51.et.tiki.ne.jp - mx51.tiki.ne.jp - mx52.tiki.ne.jp - mx61.tiki.ne.jp - mx71.tiki.ne.jp - mx81.tiki.ne.jp - mx82.tiki.ne.jp - mx91.tiki.ne.jp - ma100.tiki.ne.jp - TikiTikiインターネット - TikiTiki - - %EMAILDOMAIN% - 110 - plain - %EMAILLOCALPART% - plain - - - smtp-auth.tiki.ne.jp - 587 - plain - %EMAILADDRESS% - plain - true - false - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/navy.plala.or.jp.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/navy.plala.or.jp.xml deleted file mode 100644 index 393521665..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/navy.plala.or.jp.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - navy.plala.or.jp - ぷらら - ぷらら - - navy.mail.plala.or.jp - 110 - plain - %EMAILLOCALPART% - plain - - - navy.mail.plala.or.jp - 587 - plain - %EMAILLOCALPART% - plain - true - false - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/nctsoft.com.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/nctsoft.com.xml deleted file mode 100644 index 029906524..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/nctsoft.com.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - nctsoft.com - nctsoft - nct - - mail.nctsoft.com - 110 - plain - %EMAILLOCALPART%@%EMAILHOSTNAME% - password-cleartext - - - mail.nctsoft.com - 25 - plain - %EMAILLOCALPART%@%EMAILHOSTNAME% - password-cleartext - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/nifty.com.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/nifty.com.xml deleted file mode 100644 index 12217d4d7..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/nifty.com.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - nifty.com - @nifty - @nifty - - pop.nifty.com - 110 - plain - %EMAILLOCALPART% - password-encrypted - - - smtp.nifty.com - 587 - plain - %EMAILLOCALPART% - password-encrypted - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/nsat.jp.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/nsat.jp.xml deleted file mode 100644 index a8a32062a..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/nsat.jp.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - nsat.jp - BBにいがた - NSAT - - mail.nsat.jp - 110 - plain - %EMAILADDRESS% - password-encrypted - - - mail.nsat.jp - 587 - plain - %EMAILADDRESS% - password-encrypted - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/o2.pl.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/o2.pl.xml deleted file mode 100644 index 7a9671f85..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/o2.pl.xml +++ /dev/null @@ -1,35 +0,0 @@ - - - - o2.pl - go2.pl - tlen.pl - prokonto.pl - o2 Poczta - o2 - - poczta.o2.pl - 995 - SSL - password-cleartext - %EMAILLOCALPART% - - - poczta.o2.pl - 465 - SSL - password-cleartext - %EMAILLOCALPART% - client-IP-address - - - poczta.o2.pl - 587 - STARTTLS - password-cleartext - %EMAILLOCALPART% - client-IP-address - - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/olive.plala.or.jp.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/olive.plala.or.jp.xml deleted file mode 100644 index f85b0232e..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/olive.plala.or.jp.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - olive.plala.or.jp - ぷらら - ぷらら - - olive.mail.plala.or.jp - 110 - plain - %EMAILLOCALPART% - plain - - - olive.mail.plala.or.jp - 587 - plain - %EMAILLOCALPART% - plain - true - false - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/onet.pl.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/onet.pl.xml deleted file mode 100644 index 8a25934cf..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/onet.pl.xml +++ /dev/null @@ -1,38 +0,0 @@ - - - - onet.pl - onet.eu - poczta.onet.pl - poczta.onet.eu - op.pl - vp.pl - autograf.pl - buziaczek.pl - amorki.pl - republika.pl - Poczta Onet - Onet - - pop3.poczta.onet.pl - 995 - SSL - %EMAILADDRESS% - password-cleartext - - - smtp.poczta.onet.pl - 465 - SSL - %EMAILADDRESS% - password-cleartext - - - smtp.poczta.onet.pl - 587 - STARTTLS - %EMAILADDRESS% - password-cleartext - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/opal.plala.or.jp.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/opal.plala.or.jp.xml deleted file mode 100644 index 168f59fd0..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/opal.plala.or.jp.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - opal.plala.or.jp - ぷらら - ぷらら - - opal.mail.plala.or.jp - 110 - plain - %EMAILLOCALPART% - plain - - - opal.mail.plala.or.jp - 587 - plain - %EMAILLOCALPART% - plain - true - false - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/orange.plala.or.jp.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/orange.plala.or.jp.xml deleted file mode 100644 index 7baa80314..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/orange.plala.or.jp.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - orange.plala.or.jp - ぷらら - ぷらら - - orange.mail.plala.or.jp - 110 - plain - %EMAILLOCALPART% - plain - - - orange.mail.plala.or.jp - 587 - plain - %EMAILLOCALPART% - plain - true - false - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/orchid.plala.or.jp.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/orchid.plala.or.jp.xml deleted file mode 100644 index b5c8bc213..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/orchid.plala.or.jp.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - orchid.plala.or.jp - ぷらら - ぷらら - - orchid.mail.plala.or.jp - 110 - plain - %EMAILLOCALPART% - plain - - - orchid.mail.plala.or.jp - 587 - plain - %EMAILLOCALPART% - plain - true - false - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/ovh.net.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/ovh.net.xml deleted file mode 100644 index f469126cb..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/ovh.net.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - - - ovh.net - - OVH - OVH - - ssl0.ovh.net - 993 - SSL - password-cleartext - %EMAILADDRESS% - - - ssl0.ovh.net - 995 - SSL - password-cleartext - %EMAILADDRESS% - - - ssl0.ovh.net - 465 - SSL - password-cleartext - %EMAILADDRESS% - - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/pal.kijimadaira.jp.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/pal.kijimadaira.jp.xml deleted file mode 100644 index 5652a2c7e..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/pal.kijimadaira.jp.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - pal.kijimadaira.jp - 木島平村FTTH - 木島平村FTTH - - mail.pal.kijimadaira.jp - 110 - plain - %EMAILLOCALPART% - password-cleartext - - - smtp.pal.kijimadaira.jp - 25 - plain - none - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/palette.plala.or.jp.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/palette.plala.or.jp.xml deleted file mode 100644 index 1a64ad664..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/palette.plala.or.jp.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - palette.plala.or.jp - ぷらら - ぷらら - - palette.mail.plala.or.jp - 110 - plain - %EMAILLOCALPART% - plain - - - palette.mail.plala.or.jp - 587 - plain - %EMAILLOCALPART% - plain - true - false - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/parabox.or.jp.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/parabox.or.jp.xml deleted file mode 100644 index bda1e2246..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/parabox.or.jp.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - parabox.or.jp - パラボックス - PARABOX - - pop3.parabox.or.jp - 110 - plain - %EMAILLOCALPART% - password-cleartext - - - smtp.parabox.or.jp - 25 - plain - %EMAILLOCALPART% - password-cleartext - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/pdx.edu.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/pdx.edu.xml deleted file mode 100644 index e0370caea..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/pdx.edu.xml +++ /dev/null @@ -1,41 +0,0 @@ - - - - - pdx.edu - Portland State University Mail - PSU Mail - - psumail.pdx.edu - 993 - SSL - password-encrypted - %EMAILADDRESS% - - - psumail.pdx.edu - 587 - STARTTLS - password-encrypted - %EMAILADDRESS% - - - mailhost.pdx.edu - 465 - SSL - password-encrypted - %EMAILADDRESS% - - - mailhost.pdx.edu - 587 - STARTTLS - password-encrypted - %EMAILADDRESS% - - - Portland State University Email Settings for Advanced Users - - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/peach.plala.or.jp.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/peach.plala.or.jp.xml deleted file mode 100644 index 34c7a3df4..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/peach.plala.or.jp.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - peach.plala.or.jp - ぷらら - ぷらら - - peach.mail.plala.or.jp - 110 - plain - %EMAILLOCALPART% - plain - - - peach.mail.plala.or.jp - 587 - plain - %EMAILLOCALPART% - plain - true - false - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/peoplepc.com.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/peoplepc.com.xml deleted file mode 100644 index 01429db95..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/peoplepc.com.xml +++ /dev/null @@ -1,29 +0,0 @@ - - - - peoplepc.com - PeoplePC - PeoplePC - - imap.peoplepc.com - 143 - plain - %EMAILADDRESS% - password-encrypted - - - pop.peoplepc.com - 110 - plain - %EMAILADDRESS% - password-encrypted - - - smtpauth.peoplepc.com - 587 - STARTTLS - %EMAILADDRESS% - password-encrypted - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/plum.plala.or.jp.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/plum.plala.or.jp.xml deleted file mode 100644 index 5696afd5b..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/plum.plala.or.jp.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - plum.plala.or.jp - ぷらら - ぷらら - - plum.mail.plala.or.jp - 110 - plain - %EMAILLOCALPART% - plain - - - plum.mail.plala.or.jp - 587 - plain - %EMAILLOCALPART% - plain - true - false - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/po.dcn.ne.jp.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/po.dcn.ne.jp.xml deleted file mode 100644 index efa044e03..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/po.dcn.ne.jp.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - po.dcn.ne.jp - DCNインターネットサービス - DCN - - po.dcn.ne.jp - 110 - plain - %EMAILLOCALPART% - password-cleartext - - - po.dcn.ne.jp - 25 - plain - none - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/po.wind.ne.jp.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/po.wind.ne.jp.xml deleted file mode 100644 index 96b2d0f81..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/po.wind.ne.jp.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - po.wind.ne.jp - po.wind.jp - po.wind.co.jp - po.gunmanet.or.jp - po.gunmanet.ne.jp - 群馬インターネット - wind - - po.wind.ne.jp - 110 - plain - %EMAILLOCALPART% - plain - - - po.wind.ne.jp - 587 - plain - %EMAILLOCALPART% - plain - true - false - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/polka.plala.or.jp.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/polka.plala.or.jp.xml deleted file mode 100644 index 087065eb7..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/polka.plala.or.jp.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - polka.plala.or.jp - ぷらら - ぷらら - - polka.mail.plala.or.jp - 110 - plain - %EMAILLOCALPART% - plain - - - polka.mail.plala.or.jp - 587 - plain - %EMAILLOCALPART% - plain - true - false - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/pop.shibata.ne.jp.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/pop.shibata.ne.jp.xml deleted file mode 100644 index 6f2e8df7b..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/pop.shibata.ne.jp.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - pop.shibata.ne.jp - ml.shibata.ne.jp - インターネット新発田 - INET-SHIBATA - - %EMAILDOMAIN% - 110 - plain - %EMAILLOCALPART% - password-cleartext - - - %EMAILDOMAIN% - 25 - plain - %EMAILLOCALPART% - password-cleartext - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/posteo.de.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/posteo.de.xml deleted file mode 100644 index 3720753d6..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/posteo.de.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - posteo.de - posteo.at - posteo.ch - posteo.org - posteo.eu - Posteo - Posteo - - posteo.de - 143 - STARTTLS - %EMAILADDRESS% - password-cleartext - - - posteo.de - 587 - STARTTLS - %EMAILADDRESS% - password-cleartext - - - \ No newline at end of file diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/purple.plala.or.jp.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/purple.plala.or.jp.xml deleted file mode 100644 index 393d2ac84..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/purple.plala.or.jp.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - purple.plala.or.jp - ぷらら - ぷらら - - purple.mail.plala.or.jp - 110 - plain - %EMAILLOCALPART% - plain - - - purple.mail.plala.or.jp - 587 - plain - %EMAILLOCALPART% - plain - true - false - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/qip.ru.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/qip.ru.xml deleted file mode 100644 index 01cfd5ee8..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/qip.ru.xml +++ /dev/null @@ -1,52 +0,0 @@ - - - - qip.ru - pochta.ru - fromru.com - front.ru - hotbox.ru - hotmail.ru - krovatka.su - land.ru - mail15.com - mail333.com - newmail.ru - nightmail.ru - nm.ru - pisem.net - pochtamt.ru - pop3.ru - rbcmail.ru - smtp.ru - 5ballov.ru - aeterna.ru - ziza.ru - memori.ru - photofile.ru - fotoplenka.ru - qip.ru - qip.ru - - pop.qip.ru - 110 - plain - %EMAILADDRESS% - password-cleartext - - - imap.qip.ru - 143 - plain - %EMAILADDRESS% - password-cleartext - - - smtp.qip.ru - 25 - plain - %EMAILADDRESS% - password-cleartext - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/rainbow.plala.or.jp.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/rainbow.plala.or.jp.xml deleted file mode 100644 index 3718ed486..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/rainbow.plala.or.jp.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - rainbow.plala.or.jp - ぷらら - ぷらら - - rainbow.mail.plala.or.jp - 110 - plain - %EMAILLOCALPART% - plain - - - rainbow.mail.plala.or.jp - 587 - plain - %EMAILLOCALPART% - plain - true - false - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/rambler.ru.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/rambler.ru.xml deleted file mode 100644 index 10a92c3d0..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/rambler.ru.xml +++ /dev/null @@ -1,40 +0,0 @@ - - - - rambler.ru - lenta.ru - myrambler.ru - autorambler.ru - ro.ru - r0.ru - Rambler Mail - Rambler - - mail.rambler.ru - 993 - SSL - %EMAILADDRESS% - password-cleartext - - - mail.rambler.ru - 995 - SSL - %EMAILADDRESS% - password-encrypted - - - mail.rambler.ru - 465 - SSL - %EMAILADDRESS% - password-encrypted - - - - POP, Thunderbird, with screenshots - - - IMAP, all clients - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/red.plala.or.jp.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/red.plala.or.jp.xml deleted file mode 100644 index a42e8893f..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/red.plala.or.jp.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - red.plala.or.jp - ぷらら - ぷらら - - red.mail.plala.or.jp - 110 - plain - %EMAILLOCALPART% - plain - - - red.mail.plala.or.jp - 587 - plain - %EMAILLOCALPART% - plain - true - false - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/rmail.plala.or.jp.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/rmail.plala.or.jp.xml deleted file mode 100644 index 7ecc703e0..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/rmail.plala.or.jp.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - rmail.plala.or.jp - ぷらら - ぷらら - - rmail.mail.plala.or.jp - 110 - plain - %EMAILLOCALPART% - plain - - - rmail.mail.plala.or.jp - 587 - plain - %EMAILLOCALPART% - plain - true - false - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/rondo.plala.or.jp.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/rondo.plala.or.jp.xml deleted file mode 100644 index 13616d3e4..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/rondo.plala.or.jp.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - rondo.plala.or.jp - ぷらら - ぷらら - - rondo.mail.plala.or.jp - 110 - plain - %EMAILLOCALPART% - plain - - - rondo.mail.plala.or.jp - 587 - plain - %EMAILLOCALPART% - plain - true - false - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/rose.plala.or.jp.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/rose.plala.or.jp.xml deleted file mode 100644 index 034f32cab..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/rose.plala.or.jp.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - rose.plala.or.jp - ぷらら - ぷらら - - rose.mail.plala.or.jp - 110 - plain - %EMAILLOCALPART% - plain - - - rose.mail.plala.or.jp - 587 - plain - %EMAILLOCALPART% - plain - true - false - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/rouge.plala.or.jp.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/rouge.plala.or.jp.xml deleted file mode 100644 index cbbb43ce4..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/rouge.plala.or.jp.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - rouge.plala.or.jp - ぷらら - ぷらら - - rouge.mail.plala.or.jp - 110 - plain - %EMAILLOCALPART% - plain - - - rouge.mail.plala.or.jp - 587 - plain - %EMAILLOCALPART% - plain - true - false - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/rr.com.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/rr.com.xml deleted file mode 100644 index 93346f956..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/rr.com.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - rr.com - RoadRunner - RR - - pop-server.%EMAILDOMAIN% - 110 - plain - %EMAILADDRESS% - password-cleartext - - - smtp-server.%EMAILDOMAIN% - 25 - plain - %EMAILADDRESS% - password-cleartext - - - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/ruby.plala.or.jp.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/ruby.plala.or.jp.xml deleted file mode 100644 index 427be4b3c..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/ruby.plala.or.jp.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - ruby.plala.or.jp - ぷらら - ぷらら - - ruby.mail.plala.or.jp - 110 - plain - %EMAILLOCALPART% - plain - - - ruby.mail.plala.or.jp - 587 - plain - %EMAILLOCALPART% - plain - true - false - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/sakunet.ne.jp.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/sakunet.ne.jp.xml deleted file mode 100644 index 80d5f24d9..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/sakunet.ne.jp.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - sakunet.ne.jp - 佐久ケーブルテレビ - Saku-Net - - mail.sakunet.ne.jp - 110 - plain - %EMAILLOCALPART% - password-cleartext - - - smtp.sakunet.ne.jp - 25 - plain - none - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/sea.plala.or.jp.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/sea.plala.or.jp.xml deleted file mode 100644 index ddde2c176..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/sea.plala.or.jp.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - sea.plala.or.jp - ぷらら - ぷらら - - sea.mail.plala.or.jp - 110 - plain - %EMAILLOCALPART% - plain - - - sea.mail.plala.or.jp - 587 - plain - %EMAILLOCALPART% - plain - true - false - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/sepia.plala.or.jp.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/sepia.plala.or.jp.xml deleted file mode 100644 index 1dce9e1cf..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/sepia.plala.or.jp.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - sepia.plala.or.jp - ぷらら - ぷらら - - sepia.mail.plala.or.jp - 110 - plain - %EMAILLOCALPART% - plain - - - sepia.mail.plala.or.jp - 587 - plain - %EMAILLOCALPART% - plain - true - false - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/serenade.plala.or.jp.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/serenade.plala.or.jp.xml deleted file mode 100644 index 83bf35b7b..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/serenade.plala.or.jp.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - serenade.plala.or.jp - ぷらら - ぷらら - - serenade.mail.plala.or.jp - 110 - plain - %EMAILLOCALPART% - plain - - - serenade.mail.plala.or.jp - 587 - plain - %EMAILLOCALPART% - plain - true - false - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/seznam.cz.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/seznam.cz.xml deleted file mode 100644 index 7dacb0cba..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/seznam.cz.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - seznam.cz - email.cz - post.cz - spoluzaci.cz - Seznam - Seznam - - pop3.seznam.cz - 995 - SSL - %EMAILADDRESS% - password-cleartext - - - smtp.seznam.cz - 25 - plain - %EMAILADDRESS% - password-cleartext - - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/sfr.fr.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/sfr.fr.xml deleted file mode 100644 index 845c27cce..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/sfr.fr.xml +++ /dev/null @@ -1,36 +0,0 @@ - - - - sfr.fr - neuf.fr - SFR / Neuf - SFR - - imap.sfr.fr - 143 - plain - %EMAILADDRESS% - password-cleartext - - - pop.sfr.fr - 110 - plain - %EMAILADDRESS% - password-cleartext - - - smtp.sfr.fr - 587 - plain - %EMAILADDRESS% - password-cleartext - - - TB2, unclear - - - Apple Mail - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/silk.plala.or.jp.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/silk.plala.or.jp.xml deleted file mode 100644 index 1aa4b8196..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/silk.plala.or.jp.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - silk.plala.or.jp - ぷらら - ぷらら - - silk.mail.plala.or.jp - 110 - plain - %EMAILLOCALPART% - plain - - - silk.mail.plala.or.jp - 587 - plain - %EMAILLOCALPART% - plain - true - false - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/silver.plala.or.jp.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/silver.plala.or.jp.xml deleted file mode 100644 index 8ff9fd9ec..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/silver.plala.or.jp.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - silver.plala.or.jp - ぷらら - ぷらら - - silver.mail.plala.or.jp - 110 - plain - %EMAILLOCALPART% - plain - - - silver.mail.plala.or.jp - 587 - plain - %EMAILLOCALPART% - plain - true - false - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/sky.plala.or.jp.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/sky.plala.or.jp.xml deleted file mode 100644 index 9da6383b8..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/sky.plala.or.jp.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - sky.plala.or.jp - ぷらら - ぷらら - - sky.mail.plala.or.jp - 110 - plain - %EMAILLOCALPART% - plain - - - sky.mail.plala.or.jp - 587 - plain - %EMAILLOCALPART% - plain - true - false - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/skynet.be.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/skynet.be.xml deleted file mode 100644 index 66442b02b..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/skynet.be.xml +++ /dev/null @@ -1,35 +0,0 @@ - - - - skynet.be - skynet - skynet - - imap.skynet.be - 993 - SSL - password-cleartext - %EMAILADDRESS% - - - pop.skynet.be - 110 - plain - password-encrypted - %EMAILADDRESS% - - - relay.skynet.be - 587 - STARTTLS - password-cleartext - %EMAILADDRESS% - - - Thunderbird settings - - - SMTP works outside their network - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/smail.plala.or.jp.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/smail.plala.or.jp.xml deleted file mode 100644 index 1768bfd9b..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/smail.plala.or.jp.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - smail.plala.or.jp - ぷらら - ぷらら - - smail.mail.plala.or.jp - 110 - plain - %EMAILLOCALPART% - plain - - - smail.mail.plala.or.jp - 587 - plain - %EMAILLOCALPART% - plain - true - false - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/snow.plala.or.jp.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/snow.plala.or.jp.xml deleted file mode 100644 index 44267b99b..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/snow.plala.or.jp.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - snow.plala.or.jp - ぷらら - ぷらら - - snow.mail.plala.or.jp - 110 - plain - %EMAILLOCALPART% - plain - - - snow.mail.plala.or.jp - 587 - plain - %EMAILLOCALPART% - plain - true - false - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/so.wind.ne.jp.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/so.wind.ne.jp.xml deleted file mode 100644 index 50fd47ef1..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/so.wind.ne.jp.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - so.wind.ne.jp - so.wind.jp - 群馬インターネット - wind - - so.wind.ne.jp - 143 - plain - %EMAILLOCALPART% - plain - - - so.wind.ne.jp - 587 - plain - %EMAILLOCALPART% - plain - true - false - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/sonata.plala.or.jp.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/sonata.plala.or.jp.xml deleted file mode 100644 index 3834428fb..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/sonata.plala.or.jp.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - sonata.plala.or.jp - ぷらら - ぷらら - - sonata.mail.plala.or.jp - 110 - plain - %EMAILLOCALPART% - plain - - - sonata.mail.plala.or.jp - 587 - plain - %EMAILLOCALPART% - plain - true - false - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/strato.de.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/strato.de.xml deleted file mode 100644 index a143e6f90..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/strato.de.xml +++ /dev/null @@ -1,43 +0,0 @@ - - - - strato.de - - rzone.de - - Strato - Strato - - - imap.strato.de - 993 - SSL - password-encrypted - %EMAILADDRESS% - - - pop3.strato.de - 995 - SSL - password-encrypted - %EMAILADDRESS% - - - smtp.strato.de - 465 - SSL - password-encrypted - %EMAILADDRESS% - - - smtp.strato.de - 587 - STARTTLS - password-encrypted - %EMAILADDRESS% - - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/studenti.univr.it.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/studenti.univr.it.xml deleted file mode 100644 index 6eb5bf9fa..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/studenti.univr.it.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - studenti.univr.it - Università degli Studi di Verona - UniVR - - mail.studenti.univr.it - 995 - SSL - %EMAILLOCALPART% - password-cleartext - - - mail.studenti.univr.it - 465 - SSL - %EMAILLOCALPART% - password-cleartext - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/suite.plala.or.jp.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/suite.plala.or.jp.xml deleted file mode 100644 index c8beac6b9..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/suite.plala.or.jp.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - suite.plala.or.jp - ぷらら - ぷらら - - suite.mail.plala.or.jp - 110 - plain - %EMAILLOCALPART% - plain - - - suite.mail.plala.or.jp - 587 - plain - %EMAILLOCALPART% - plain - true - false - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/sympatico.ca.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/sympatico.ca.xml deleted file mode 100644 index 2830faf07..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/sympatico.ca.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - - sympatico.ca - - Sympatico Email - Sympatico - - - pophm.sympatico.ca - 995 - SSL - %EMAILADDRESS% - plain - - - - smtphm.sympatico.ca - 587 - STARTTLS - %EMAILADDRESS% - plain - true - false - - - POP settings, domains - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/symphony.plala.or.jp.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/symphony.plala.or.jp.xml deleted file mode 100644 index 311aa184a..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/symphony.plala.or.jp.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - symphony.plala.or.jp - ぷらら - ぷらら - - symphony.mail.plala.or.jp - 110 - plain - %EMAILLOCALPART% - plain - - - symphony.mail.plala.or.jp - 587 - plain - %EMAILLOCALPART% - plain - true - false - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/t-online.de.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/t-online.de.xml deleted file mode 100644 index 0d3014b02..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/t-online.de.xml +++ /dev/null @@ -1,37 +0,0 @@ - - - - t-online.de - T-Online - T-Online - - secureimap.t-online.de - 993 - SSL - %EMAILADDRESS% - password-cleartext - - - securepop.t-online.de - 995 - SSL - %EMAILADDRESS% - password-cleartext - - - securesmtp.t-online.de - 587 - STARTTLS - %EMAILADDRESS% - password-cleartext - - - You need to set up an E-Mail-Password. Attention: The normal password for the T-Online-Website and Webmail does *not* work for email aplications. - Sie müssen ein E-Mail-Passwort einrichten. Achtung: Das Passwort für die T-Online-Website und Webmail funktioniert *nicht* für E-Mail-Programme! - - - Set up your email address - Richten Sie Ihre Email-Adresse ein - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/taupe.plala.or.jp.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/taupe.plala.or.jp.xml deleted file mode 100644 index cec35b2df..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/taupe.plala.or.jp.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - taupe.plala.or.jp - ぷらら - ぷらら - - taupe.mail.plala.or.jp - 110 - plain - %EMAILLOCALPART% - plain - - - taupe.mail.plala.or.jp - 587 - plain - %EMAILLOCALPART% - plain - true - false - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/terra.es.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/terra.es.xml deleted file mode 100644 index f6e8a33bc..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/terra.es.xml +++ /dev/null @@ -1,29 +0,0 @@ - - - - terra.es - Correo Terra - Terra - - imap4.terra.es - 143 - plain - %EMAILADDRESS% - password-cleartext - - - pop3.terra.es - 110 - plain - %EMAILADDRESS% - password-cleartext - - - mailhost.terra.es - 25 - plain - %EMAILADDRESS% - password-cleartext - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/tiki.ne.jp.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/tiki.ne.jp.xml deleted file mode 100644 index 9e54488ea..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/tiki.ne.jp.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - tiki.ne.jp - TikiTikiインターネット - TikiTiki - - mx.tiki.ne.jp - 110 - plain - %EMAILLOCALPART% - plain - - - smtp-auth.tiki.ne.jp - 587 - plain - %EMAILADDRESS% - plain - true - false - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/tiscali.cz.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/tiscali.cz.xml deleted file mode 100644 index 552eb8a43..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/tiscali.cz.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - tiscali.cz - wo.cz - worldonline.cz - worldmail.cz - Tiscali - Tiscali - - pop3.mail.tiscali.cz - 110 - plain - %EMAILADDRESS% - password-cleartext - - - smtp.mail.tiscali.cz - 25 - plain - %EMAILADDRESS% - password-cleartext - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/tiscali.it.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/tiscali.it.xml deleted file mode 100644 index 98f22a757..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/tiscali.it.xml +++ /dev/null @@ -1,31 +0,0 @@ - - - - tiscali.it - Tiscali Italy - Tiscali - - imap.tiscali.it - 993 - SSL - %EMAILADDRESS% - password-encrypted - - - pop.tiscali.it - 995 - SSL - %EMAILADDRESS% - password-encrypted - - - smtp.tiscali.it - 465 - SSL - %EMAILADDRESS% - password-encrypted - client-IP-address - - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/tmail.plala.or.jp.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/tmail.plala.or.jp.xml deleted file mode 100644 index d138304dc..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/tmail.plala.or.jp.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - tmail.plala.or.jp - ぷらら - ぷらら - - tmail.mail.plala.or.jp - 110 - plain - %EMAILLOCALPART% - plain - - - tmail.mail.plala.or.jp - 587 - plain - %EMAILLOCALPART% - plain - true - false - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/toccata.plala.or.jp.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/toccata.plala.or.jp.xml deleted file mode 100644 index 41281a7d6..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/toccata.plala.or.jp.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - toccata.plala.or.jp - ぷらら - ぷらら - - toccata.mail.plala.or.jp - 110 - plain - %EMAILLOCALPART% - plain - - - toccata.mail.plala.or.jp - 587 - plain - %EMAILLOCALPART% - plain - true - false - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/topaz.plala.or.jp.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/topaz.plala.or.jp.xml deleted file mode 100644 index 185f1796d..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/topaz.plala.or.jp.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - topaz.plala.or.jp - ぷらら - ぷらら - - topaz.mail.plala.or.jp - 110 - plain - %EMAILLOCALPART% - plain - - - topaz.mail.plala.or.jp - 587 - plain - %EMAILLOCALPART% - plain - true - false - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/trio.plala.or.jp.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/trio.plala.or.jp.xml deleted file mode 100644 index 6d15fc17b..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/trio.plala.or.jp.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - trio.plala.or.jp - ぷらら - ぷらら - - trio.mail.plala.or.jp - 110 - plain - %EMAILLOCALPART% - plain - - - trio.mail.plala.or.jp - 587 - plain - %EMAILLOCALPART% - plain - true - false - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/umail.plala.or.jp.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/umail.plala.or.jp.xml deleted file mode 100644 index 2b4a0694a..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/umail.plala.or.jp.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - umail.plala.or.jp - ぷらら - ぷらら - - umail.mail.plala.or.jp - 110 - plain - %EMAILLOCALPART% - plain - - - umail.mail.plala.or.jp - 587 - plain - %EMAILLOCALPART% - plain - true - false - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/umich.edu.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/umich.edu.xml deleted file mode 100644 index c19dd74c8..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/umich.edu.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - umich.edu - UM ITCS Email - UM ITCS - - mail.umich.edu - 993 - SSL - %EMAILLOCALPART% - password-cleartext - - - smtp.mail.umich.edu - 587 - STARTTLS - %EMAILLOCALPART% - password-cleartext - - - \ No newline at end of file diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/upcmail.nl.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/upcmail.nl.xml deleted file mode 100644 index 48db41aaf..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/upcmail.nl.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - upcmail.nl - chello.nl - UPC Nederland - UPC - - pop3.upcmail.nl - 110 - plain - %EMAILADDRESS% - password-cleartext - - - smtp.upcmail.nl - 25 - plain - %EMAILADDRESS% - client-IP-address - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/verizon.net.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/verizon.net.xml deleted file mode 100644 index a72d5d57c..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/verizon.net.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - verizon.net - Verizon Online - Verizon - - incoming.verizon.net - 995 - SSL - %EMAILLOCALPART% - password-encrypted - - - outgoing.verizon.net - 465 - SSL - %EMAILLOCALPART% - password-cleartext - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/versatel.de.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/versatel.de.xml deleted file mode 100644 index 1945a19db..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/versatel.de.xml +++ /dev/null @@ -1,43 +0,0 @@ - - - - versatel.de - versanet.de - foni.net - gelsennet.de - - telebel.de - telelev.de - cneweb.de - ruhrnet-online.de - Versatel - Versatel - - mx.versatel.de - 143 - plain - password-cleartext - %EMAILADDRESS% - - - mx.versatel.de - 143 - plain - password-cleartext - %EMAILADDRESS% - - - smtp.versatel.de - 25 - plain - password-cleartext - %EMAILADDRESS% - - - Email settings - - - IMAP server - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/violet.plala.or.jp.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/violet.plala.or.jp.xml deleted file mode 100644 index a1ce58b32..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/violet.plala.or.jp.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - violet.plala.or.jp - ぷらら - ぷらら - - violet.mail.plala.or.jp - 110 - plain - %EMAILLOCALPART% - plain - - - violet.mail.plala.or.jp - 587 - plain - %EMAILLOCALPART% - plain - true - false - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/vm.aikis.or.jp.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/vm.aikis.or.jp.xml deleted file mode 100644 index f650476be..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/vm.aikis.or.jp.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - vm.aikis.or.jp - aikis - aikis - - mail.aikis.or.jp - 995 - SSL - %EMAILLOCALPART% - password-cleartext - - - mail.aikis.or.jp - 587 - STARTTLS - %EMAILLOCALPART% - password-cleartext - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/vmail.plala.or.jp.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/vmail.plala.or.jp.xml deleted file mode 100644 index 66358ef6a..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/vmail.plala.or.jp.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - vmail.plala.or.jp - ぷらら - ぷらら - - vmail.mail.plala.or.jp - 110 - plain - %EMAILLOCALPART% - plain - - - vmail.mail.plala.or.jp - 587 - plain - %EMAILLOCALPART% - plain - true - false - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/vp.tiki.ne.jp.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/vp.tiki.ne.jp.xml deleted file mode 100644 index 378a9d3b2..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/vp.tiki.ne.jp.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - vp.tiki.ne.jp - TikiTikiインターネット - TikiTiki - - vp.tiki.ne.jp - 110 - plain - %EMAILLOCALPART% - plain - - - vs.tiki.ne.jp - 587 - plain - %EMAILADDRESS% - plain - true - false - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/waltz.plala.or.jp.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/waltz.plala.or.jp.xml deleted file mode 100644 index e7814cd23..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/waltz.plala.or.jp.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - waltz.plala.or.jp - ぷらら - ぷらら - - waltz.mail.plala.or.jp - 110 - plain - %EMAILLOCALPART% - plain - - - waltz.mail.plala.or.jp - 587 - plain - %EMAILLOCALPART% - plain - true - false - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/wave.plala.or.jp.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/wave.plala.or.jp.xml deleted file mode 100644 index 611ab2a6b..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/wave.plala.or.jp.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - wave.plala.or.jp - ぷらら - ぷらら - - wave.mail.plala.or.jp - 110 - plain - %EMAILLOCALPART% - plain - - - wave.mail.plala.or.jp - 587 - plain - %EMAILLOCALPART% - plain - true - false - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/web.de.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/web.de.xml deleted file mode 100644 index 606848a39..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/web.de.xml +++ /dev/null @@ -1,55 +0,0 @@ - - - - web.de - WEB.DE Freemail - Web.de - - - imap.web.de - 993 - SSL - %EMAILLOCALPART% - password-cleartext - - - imap.web.de - 143 - STARTTLS - %EMAILLOCALPART% - password-cleartext - - - pop3.web.de - 995 - SSL - %EMAILLOCALPART% - password-cleartext - - - - - - - pop3.web.de - 110 - STARTTLS - %EMAILLOCALPART% - password-cleartext - - - - - - - smtp.web.de - 587 - STARTTLS - %EMAILLOCALPART% - password-cleartext - - - Configure POP3 in Thunderbird (currently describing TB 3.0) - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/white.plala.or.jp.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/white.plala.or.jp.xml deleted file mode 100644 index 34f9a8af3..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/white.plala.or.jp.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - white.plala.or.jp - ぷらら - ぷらら - - white.mail.plala.or.jp - 110 - plain - %EMAILLOCALPART% - plain - - - white.mail.plala.or.jp - 587 - plain - %EMAILLOCALPART% - plain - true - false - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/wildwestdomains.com.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/wildwestdomains.com.xml deleted file mode 100644 index 2f47caa26..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/wildwestdomains.com.xml +++ /dev/null @@ -1,37 +0,0 @@ - - - - - secureserver.net - - Your WildWest domain - WildWest - - pop.secureserver.net - 995 - SSL - password-cleartext - %EMAILADDRESS% - - - - imap.secureserver.net - 993 - SSL - password-cleartext - %EMAILADDRESS% - - - smtpout.secureserver.net - 465 - SSL - password-cleartext - %EMAILADDRESS% - - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/wine.plala.or.jp.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/wine.plala.or.jp.xml deleted file mode 100644 index 62f66db87..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/wine.plala.or.jp.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - wine.plala.or.jp - ぷらら - ぷらら - - wine.mail.plala.or.jp - 110 - plain - %EMAILLOCALPART% - plain - - - wine.mail.plala.or.jp - 587 - plain - %EMAILLOCALPART% - plain - true - false - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/wmail.plala.or.jp.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/wmail.plala.or.jp.xml deleted file mode 100644 index 375c3010e..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/wmail.plala.or.jp.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - wmail.plala.or.jp - ぷらら - ぷらら - - wmail.mail.plala.or.jp - 110 - plain - %EMAILLOCALPART% - plain - - - wmail.mail.plala.or.jp - 587 - plain - %EMAILLOCALPART% - plain - true - false - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/wp.pl.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/wp.pl.xml deleted file mode 100644 index 0d801c0b1..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/wp.pl.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - wp.pl - Poczta Wirtualna Polska - Poczta WP - - pop3.wp.pl - 995 - SSL - %EMAILLOCALPART% - password-cleartext - - - smtp.wp.pl - 587 - STARTTLS - %EMAILLOCALPART% - password-cleartext - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/xmail.plala.or.jp.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/xmail.plala.or.jp.xml deleted file mode 100644 index b8d7187ff..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/xmail.plala.or.jp.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - xmail.plala.or.jp - ぷらら - ぷらら - - xmail.mail.plala.or.jp - 110 - plain - %EMAILLOCALPART% - plain - - - xmail.mail.plala.or.jp - 587 - plain - %EMAILLOCALPART% - plain - true - false - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/xp.wind.jp.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/xp.wind.jp.xml deleted file mode 100644 index bed756930..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/xp.wind.jp.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - xp.wind.jp - 群馬インターネット - wind - - xp.wind.jp - 110 - plain - %EMAILLOCALPART% - plain - - - xp.wind.jp - 587 - plain - %EMAILLOCALPART% - plain - true - false - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/xpost.plala.or.jp.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/xpost.plala.or.jp.xml deleted file mode 100644 index 7d175fd75..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/xpost.plala.or.jp.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - xpost.plala.or.jp - ぷらら - ぷらら - - xpost.mail.plala.or.jp - 110 - plain - %EMAILLOCALPART% - plain - - - xpost.mail.plala.or.jp - 587 - plain - %EMAILLOCALPART% - plain - true - false - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/xs4all.nl.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/xs4all.nl.xml deleted file mode 100644 index 60c19131c..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/xs4all.nl.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - xs4all.nl - XS4All - XS4All - - pops.xs4all.nl - 995 - SSL - %EMAILLOCALPART% - password-cleartext - - - smtps.xs4all.nl - 465 - SSL - %EMAILLOCALPART% - password-cleartext - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/xtra.co.nz.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/xtra.co.nz.xml deleted file mode 100644 index 3fe9e7b90..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/xtra.co.nz.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - xtra.co.nz - Yahoo! Mail - Yahoo - - pop3.xtra.co.nz - 995 - SSL - %EMAILLOCALPART% - password-cleartext - - - send.xtra.co.nz - 465 - SSL - %EMAILLOCALPART% - password-cleartext - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/yahoo.co.jp.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/yahoo.co.jp.xml deleted file mode 100644 index f8fadde8f..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/yahoo.co.jp.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - yahoo.co.jp - Yahoo! メール - Yahoo! メール - - pop.mail.yahoo.co.jp - 995 - SSL - %EMAILLOCALPART% - password-cleartext - - - smtp.mail.yahoo.co.jp - 465 - SSL - %EMAILLOCALPART% - password-cleartext - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/yahoo.com.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/yahoo.com.xml deleted file mode 100644 index cb818a946..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/yahoo.com.xml +++ /dev/null @@ -1,41 +0,0 @@ - - - - yahoo.com - yahoo.de - yahoo.it - yahoo.fr - yahoo.es - yahoo.co.uk - yahoo.co.nz - yahoo.com.au - yahoo.com.ar - yahoo.com.br - yahoo.com.mx - ymail.com - rocketmail.com - Yahoo! Mail - Yahoo - - pop.mail.yahoo.com - 995 - SSL - %EMAILADDRESS% - password-cleartext - - - imap.mail.yahoo.com - 993 - SSL - %EMAILADDRESS% - password-cleartext - - - smtp.mail.yahoo.com - 465 - SSL - %EMAILADDRESS% - password-cleartext - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/yandex.ru.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/yandex.ru.xml deleted file mode 100644 index b9b453847..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/yandex.ru.xml +++ /dev/null @@ -1,39 +0,0 @@ - - - - yandex.ru - yandex.com - yandex.net - yandex.by - yandex.kz - yandex.ua - ya.ru - narod.ru - Yandex Mail - Yandex - - imap.yandex.ru - 993 - SSL - %EMAILADDRESS% - password-cleartext - - - pop.yandex.ru - 995 - SSL - %EMAILADDRESS% - password-cleartext - - - smtp.yandex.ru - 465 - SSL - %EMAILADDRESS% - password-cleartext - - - Check 'Enable IMAP' on Yandex.Mail setup page - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/ybb.ne.jp.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/ybb.ne.jp.xml deleted file mode 100644 index ab91e9426..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/ybb.ne.jp.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - ybb.ne.jp - Yahoo! BB - Yahoo! BB - - ybbpop.mail.yahoo.co.jp - 995 - SSL - %EMAILLOCALPART% - password-cleartext - - - ybbsmtp.mail.yahoo.co.jp - 465 - SSL - %EMAILLOCALPART% - password-cleartext - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/yellow.plala.or.jp.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/yellow.plala.or.jp.xml deleted file mode 100644 index 4b71b37f7..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/yellow.plala.or.jp.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - yellow.plala.or.jp - ぷらら - ぷらら - - yellow.mail.plala.or.jp - 110 - plain - %EMAILLOCALPART% - plain - - - yellow.mail.plala.or.jp - 587 - plain - %EMAILLOCALPART% - plain - true - false - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/ymail.plala.or.jp.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/ymail.plala.or.jp.xml deleted file mode 100644 index 0f367d6b4..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/ymail.plala.or.jp.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - ymail.plala.or.jp - ぷらら - ぷらら - - ymail.mail.plala.or.jp - 110 - plain - %EMAILLOCALPART% - plain - - - ymail.mail.plala.or.jp - 587 - plain - %EMAILLOCALPART% - plain - true - false - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/ypost.plala.or.jp.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/ypost.plala.or.jp.xml deleted file mode 100644 index 9149c8d49..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/ypost.plala.or.jp.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - ypost.plala.or.jp - ぷらら - ぷらら - - ypost.mail.plala.or.jp - 110 - plain - %EMAILLOCALPART% - plain - - - ypost.mail.plala.or.jp - 587 - plain - %EMAILLOCALPART% - plain - true - false - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/ziggo.nl.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/ziggo.nl.xml deleted file mode 100644 index 5827ab56b..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/ziggo.nl.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - ziggo.nl - casema.nl - quicknet.nl - home.nl - Ziggo - Ziggo - - pop.ziggo.nl - 110 - plain - %EMAILADDRESS% - password-cleartext - - - smtp.ziggo.nl - 587 - STARTTLS - %EMAILADDRESS% - password-cleartext - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/zmail.plala.or.jp.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/zmail.plala.or.jp.xml deleted file mode 100644 index 02e73a984..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/zmail.plala.or.jp.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - zmail.plala.or.jp - ぷらら - ぷらら - - zmail.mail.plala.or.jp - 110 - plain - %EMAILLOCALPART% - plain - - - zmail.mail.plala.or.jp - 587 - plain - %EMAILLOCALPART% - plain - true - false - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/zpost.plala.or.jp.xml b/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/zpost.plala.or.jp.xml deleted file mode 100644 index 9844a443e..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.DomainParser/XmlData/zpost.plala.or.jp.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - zpost.plala.or.jp - ぷらら - ぷらら - - zpost.mail.plala.or.jp - 110 - plain - %EMAILLOCALPART% - plain - - - zpost.mail.plala.or.jp - 587 - plain - %EMAILLOCALPART% - plain - true - false - - - diff --git a/module/ASC.Mail/Services/ASC.Mail.EmlDownloader/ASC.Mail.EmlDownloader.csproj b/module/ASC.Mail/Services/ASC.Mail.EmlDownloader/ASC.Mail.EmlDownloader.csproj deleted file mode 100644 index 986b038ae..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.EmlDownloader/ASC.Mail.EmlDownloader.csproj +++ /dev/null @@ -1,103 +0,0 @@ - - - - - Debug - AnyCPU - {0C0B3474-9991-4ADC-BF4B-7A4F35EB5A7C} - Exe - Properties - ASC.Mail.EmlDownloader - ASC.Mail.EmlDownloader - v4.8 - 512 - - - AnyCPU - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - false - bin\Debug\ASC.Mail.EmlDownloader.xml - CS1591 - - - AnyCPU - none - true - bin\Release\ - TRACE - prompt - 4 - false - - - - - - - - - Designer - - - web.consumers.config - PreserveNewest - - - web.autofac.config - PreserveNewest - - - mail.agg.nlog.config - PreserveNewest - - - mail.agg.log4net.config - PreserveNewest - - - - - {76de7717-3d4b-4a5b-b740-15b8913df0cb} - ASC.Common - - - {a51d0454-4afa-46de-89d4-b03d37e1816c} - ASC.Core.Common - - - {7080343d-fbe7-423a-9405-4f883f6e235b} - ASC.Mail - - - - - 2.8.0 - - - 2.0.9 - - - 2.15.0 - - - 8.0.32.1 - - - 5.1.2 - - - - - \ No newline at end of file diff --git a/module/ASC.Mail/Services/ASC.Mail.EmlDownloader/App.config b/module/ASC.Mail/Services/ASC.Mail.EmlDownloader/App.config deleted file mode 100644 index 9c798d54a..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.EmlDownloader/App.config +++ /dev/null @@ -1,58 +0,0 @@ - - - -
-
-
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/module/ASC.Mail/Services/ASC.Mail.EmlDownloader/Program.Options.cs b/module/ASC.Mail/Services/ASC.Mail.EmlDownloader/Program.Options.cs deleted file mode 100644 index 7f84e6121..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.EmlDownloader/Program.Options.cs +++ /dev/null @@ -1,34 +0,0 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2023 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - -using CommandLine; -using CommandLine.Text; - -namespace ASC.Mail.EmlDownloader -{ - partial class Program - { - private sealed class Options - { - [Option('i', "id", Required = true, HelpText = "Id mailbox from MySQL DB.")] - public int MailboxId { get; set; } - - [Option('u', "uid", Required = false, HelpText = "Message uid for download.")] - public string MessageUid { get; set; } - } - } -} diff --git a/module/ASC.Mail/Services/ASC.Mail.EmlDownloader/Program.cs b/module/ASC.Mail/Services/ASC.Mail.EmlDownloader/Program.cs deleted file mode 100644 index 6dfd110c8..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.EmlDownloader/Program.cs +++ /dev/null @@ -1,168 +0,0 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2023 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - -using System; -using System.Configuration; -using System.IO; -using System.Reflection; -using System.Threading; - -using ASC.Mail.Clients; -using ASC.Mail.Core; -using ASC.Mail.Core.Dao.Expressions.Mailbox; -using ASC.Mail.Data.Contracts; -using ASC.Mail.Enums; - -using CommandLine; - -namespace ASC.Mail.EmlDownloader -{ - internal partial class Program - { - private static void Main(string[] args) - { - CommandLine.Parser.Default.ParseArguments(args) - .WithNotParsed(options => Console.WriteLine(@"Bad command line parameters.")) - .WithParsed(options => { - try - { - Console.WriteLine(@"Searching account with id {0}", options.MailboxId); - - if (string.IsNullOrEmpty(options.MessageUid)) - { - Console.WriteLine(@"MessageUid not setup."); - ShowAnyKey(); - return; - } - - var mailbox = GetMailBox(options.MailboxId); - - if (mailbox == null) - { - Console.WriteLine(@"Account not found."); - ShowAnyKey(); - return; - } - - if (mailbox.Imap) - { - var uidlStucture = ParserImapUidl(options.MessageUid); - if (uidlStucture.folderId != FolderType.Inbox) - throw new FormatException("Only inbox messages are supported for downloading."); - - } - - var certificatePermit = ConfigurationManagerExtension.AppSettings["mail.certificate-permit"] != null && - Convert.ToBoolean( - ConfigurationManagerExtension.AppSettings["mail.certificate-permit"]); - - string messageEml; - using (var client = new MailClient(mailbox, CancellationToken.None, certificatePermit: mailbox.IsTeamlab || certificatePermit)) - { - var message = client.GetInboxMessage(options.MessageUid); - messageEml = message.ToString(); - } - - Console.WriteLine(@"Try StoreToFile"); - - var now = DateTime.UtcNow; - - var path = Path.Combine(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Downloads"), - string.Format("uid_{0}_{1}.eml", options.MessageUid, - now.ToString("dd_MM_yyyy_hh_mm"))); - - - var pathFile = StoreToFile(messageEml, path, true); - - Console.WriteLine(@"[SUCCESS] File was stored into path ""{0}""", pathFile); - - } - catch (Exception ex) - { - Console.WriteLine(ex.ToString()); - } - - - }); - } - - private static void ShowAnyKey() - { - Console.WriteLine(); - Console.WriteLine(@"Any key to exit..."); - Console.ReadKey(); - } - - static string StoreToFile(string emlString, string fileName, bool useTemp) - { - var tempPath = useTemp ? TempPath.GetTempFileName() : fileName; - var sw = File.CreateText(tempPath); - sw.Write(emlString); - sw.Close(); - - if (useTemp) - { - if (!string.IsNullOrEmpty(fileName)) - { - var directory = Path.GetDirectoryName(fileName); - // Create the traget path iof it does not exist - if (directory != null && !Directory.Exists(directory)) - Directory.CreateDirectory(directory); - - if (string.IsNullOrEmpty(Path.GetFileName(fileName))) - { - string savePath = Path.Combine(fileName, Path.GetFileNameWithoutExtension(tempPath) + ".eml"); - File.Move(tempPath, savePath); - File.Delete(tempPath); - return savePath; - } - - File.Move(tempPath, fileName); - File.Delete(tempPath); - - return fileName; - } - - return tempPath; - } - return tempPath; - } - - private struct ImapUidl - { - public FolderType folderId; - public int uid; - } - - private static ImapUidl ParserImapUidl(string uidl) - { - var elements = uidl.Split('-'); - - return new ImapUidl - { - uid = Convert.ToInt32(elements[0]), - folderId = (FolderType)Convert.ToInt32(elements[1]) - }; - } - - private static MailBoxData GetMailBox(int mailboxId) - { - var engine = new EngineFactory(-1); - return engine.MailboxEngine.GetMailboxData(new ConcreteSimpleMailboxExp(mailboxId)); - } - } -} diff --git a/module/ASC.Mail/Services/ASC.Mail.EmlDownloader/Properties/AssemblyInfo.cs b/module/ASC.Mail/Services/ASC.Mail.EmlDownloader/Properties/AssemblyInfo.cs deleted file mode 100644 index e3c63e133..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.EmlDownloader/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,35 +0,0 @@ -using System.Reflection; -using System.Runtime.InteropServices; - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyTitle("ASC.Mail.EmlDownloader")] -[assembly: AssemblyDescription("Download message from mailbox.")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("Ascensio System SIA")] -[assembly: AssemblyProduct("ASC.Mail.EmlDownloader")] -[assembly: AssemblyCopyright("(c) Ascensio System SIA. All rights reserved")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("7a6f0fc6-c562-4bf8-a3a5-737f9a79b1e2")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Build and Revision Numbers -// by using the '*' as shown below: -// [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyFileVersion("1.0.0.1")] diff --git a/module/ASC.Mail/Services/ASC.Mail.PasswordFinder/ASC.Mail.PasswordFinder.csproj b/module/ASC.Mail/Services/ASC.Mail.PasswordFinder/ASC.Mail.PasswordFinder.csproj deleted file mode 100644 index 643148ff4..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.PasswordFinder/ASC.Mail.PasswordFinder.csproj +++ /dev/null @@ -1,119 +0,0 @@ - - - - - Debug - AnyCPU - {10F8632E-A59F-4009-A211-5AE043622538} - Exe - Properties - ASC.Mail.PasswordFinder - ASC.Mail.PasswordFinder - v4.8 - 512 - - - AnyCPU - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - false - - - AnyCPU - none - true - bin\Release\ - TRACE - prompt - 4 - false - - - - ..\..\..\..\packages\CommandLineParser.1.9.71\lib\net45\CommandLine.dll - - - False - ..\..\..\..\packages\DotNetOpenAuth.Ultimate.4.1.0.12182\lib\net45-full\DotNetOpenAuth.dll - - - False - ..\..\..\..\packages\log4net.2.0.8\lib\net45-full\log4net.dll - - - False - ..\..\..\..\packages\MySql.Data.8.0.18\lib\net452\MySql.Data.dll - - - ..\..\..\..\packages\Newtonsoft.Json.11.0.2\lib\net45\Newtonsoft.Json.dll - - - False - ..\..\..\..\packages\NLog.4.5.8\lib\net45\NLog.dll - - - - - - - - - - - ..\..\..\..\packages\Google.Protobuf.3.5.1\lib\net45\Google.Protobuf.dll - - - - - - - - - - Designer - - - web.consumers.config - PreserveNewest - - - web.autofac.config - PreserveNewest - - - mail.agg.nlog.config - PreserveNewest - - - mail.agg.log4net.config - PreserveNewest - - - - - {76de7717-3d4b-4a5b-b740-15b8913df0cb} - ASC.Common - - - {a51d0454-4afa-46de-89d4-b03d37e1816c} - ASC.Core.Common - - - {7080343d-fbe7-423a-9405-4f883f6e235b} - ASC.Mail - - - - - \ No newline at end of file diff --git a/module/ASC.Mail/Services/ASC.Mail.PasswordFinder/App.config b/module/ASC.Mail/Services/ASC.Mail.PasswordFinder/App.config deleted file mode 100644 index 03d39ea88..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.PasswordFinder/App.config +++ /dev/null @@ -1,64 +0,0 @@ - - - -
-
-
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/module/ASC.Mail/Services/ASC.Mail.PasswordFinder/Program.Options.cs b/module/ASC.Mail/Services/ASC.Mail.PasswordFinder/Program.Options.cs deleted file mode 100644 index 74ed54eee..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.PasswordFinder/Program.Options.cs +++ /dev/null @@ -1,43 +0,0 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2023 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - -using CommandLine; -using CommandLine.Text; - -namespace ASC.Mail.PasswordFinder -{ - partial class Program - { - private sealed class Options - { - [Option('j', "json", Required = false, HelpText = "Save settings to mailbox.json")] - public bool NeedJson { get; set; } - - [Option('e', "exit", Required = false, HelpText = "Exit on end of any operations")] - public bool ExitOnEnd { get; set; } - - [ParserState] - public IParserState LastParserState { get; set; } - - [HelpOption] - public string GetUsage() - { - return HelpText.AutoBuild(this, current => HelpText.DefaultParsingErrorsHandler(this, current)); - } - } - } -} diff --git a/module/ASC.Mail/Services/ASC.Mail.PasswordFinder/Program.cs b/module/ASC.Mail/Services/ASC.Mail.PasswordFinder/Program.cs deleted file mode 100644 index e3439a6f3..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.PasswordFinder/Program.cs +++ /dev/null @@ -1,314 +0,0 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2023 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - -using System; -using System.Collections.Generic; -using System.IO; -using System.Text; -using ASC.Core.Users; -using ASC.Mail.Enums; -using ASC.Mail.Extensions; -using ASC.Mail.Iterators; -using Newtonsoft.Json; - -namespace ASC.Mail.PasswordFinder -{ - internal partial class Program - { - const string IMAP = "IMAP"; - const string POP3 = "POP3"; - const string SMTP = "SMTP"; - - private static void Main(string[] args) - { - var options = new Options(); - - if (!CommandLine.Parser.Default.ParseArgumentsStrict(args, options, - () => Console.WriteLine(@"Bad command line parameters."))) - { - return; - } - - try - { - var mailboxIterator = new MailboxIterator(); - - var mailbox = mailboxIterator.First(); - - if (mailbox == null) - { - Console.WriteLine(@"Accounts not found."); - ShowAnyKey(options); - return; - } - - StringBuilder sbuilder = null; - List accounts = null; - - if (!options.NeedJson) - { - sbuilder = new StringBuilder(); - } - else - { - accounts = new List(); - } - - var i = 0; - - while (!mailboxIterator.IsDone) - { - if (mailbox.IsRemoved || !mailbox.IsTeamlab) - { - mailbox = mailboxIterator.Next(); - continue; - } - - var current = new StringBuilder(); - - var userInfo = mailbox.GetUserInfo(); - - var isUserRemoved = userInfo == null || userInfo.Equals(Constants.LostUser); - - var user = isUserRemoved ? "user is removed" : userInfo.UserName; - - current.AppendFormat("#{0}. Id: {1} MailBox: {2}, Tenant: {3}, User: '{4}' ID: {5}\r\n", - ++i, mailbox.MailBoxId, mailbox.EMail, mailbox.TenantId, user, - mailbox.UserId); - - current.AppendLine(); - - var inType = mailbox.Imap ? IMAP : POP3; - - current.AppendFormat("\t\t{0} settings:\r\n", inType); - current.AppendFormat("\t\tLogin:\t\t{0}\r\n", mailbox.Account); - - string inPassword; - - if (!mailbox.IsOAuth) - { - inPassword = - string.IsNullOrEmpty(mailbox.Password) - ? "[-=! ERROR: Invalid Decription !=-]" - : mailbox.Password; - } - else - { - inPassword = "[-=! OAuth: no password stored !=-]"; - } - - current.AppendFormat("\t\tPassword:\t{0}\r\n", inPassword); - - current.AppendFormat("\t\tHost:\t\t{0}\r\n", mailbox.Server); - current.AppendFormat("\t\tPort:\t\t{0}\r\n", mailbox.Port); - - var inAuthentication = Enum.GetName(typeof(SaslMechanism), mailbox.Authentication); - - current.AppendFormat("\t\tAuthType:\t{0}\r\n", inAuthentication); - - var inEncryption = Enum.GetName(typeof(EncryptionType), mailbox.Encryption); - - current.AppendFormat("\t\tEncryptType:\t{0}\r\n", inEncryption); - - current.AppendLine(); - - current.AppendFormat("\t\t{0} settings:\r\n", SMTP); - current.AppendFormat("\t\tSmtpAuth:\t{0}\r\n", mailbox.SmtpAuth); - if (mailbox.SmtpAuth) - { - current.AppendFormat("\t\tSmtpLogin:\t{0}\r\n", mailbox.SmtpAccount); - if (!mailbox.IsOAuth) - { - current.AppendFormat("\t\tSmtPassword:\t{0}\r\n", - string.IsNullOrEmpty(mailbox.SmtpPassword) - ? "[-=! ERROR: Invalid Decription !=-]" - : mailbox.SmtpPassword); - } - else - { - current.AppendFormat("\t\tSmtPassword:\t[-=! OAuth: no password stored !=-]\r\n"); - } - } - current.AppendFormat("\t\tHost:\t\t{0}\r\n", mailbox.SmtpServer); - current.AppendFormat("\t\tPort:\t\t{0}\r\n", mailbox.SmtpPort); - - var outAuthentication = Enum.GetName(typeof(SaslMechanism), mailbox.SmtpAuthentication); - - current.AppendFormat("\t\tAuthType:\t{0}\r\n", outAuthentication); - - var outEncryption = Enum.GetName(typeof(EncryptionType), mailbox.SmtpEncryption); - - current.AppendFormat("\t\tEncryptType:\t{0}\r\n", outEncryption); - - current.AppendLine(); - - Console.WriteLine(current.ToString()); - - if (!options.NeedJson) - { - if (sbuilder != null) - sbuilder.Append(current); - } - else - { - if (accounts != null) - { - accounts.Add(new MailAccount - { - email = mailbox.EMail.Address, - tenantId = mailbox.TenantId, - user = user, - userId = mailbox.UserId, - settings = new List - { - new MailAccountSetting - { - type = inType, - host = mailbox.Server, - port = mailbox.Port.ToString(), - authentication = inAuthentication, - encryption = inEncryption, - login = mailbox.Account, - password = inPassword - }, - new MailAccountSetting - { - type = SMTP, - host = mailbox.SmtpServer, - port = mailbox.SmtpPort.ToString(), - authentication = outAuthentication, - encryption = outEncryption, - login = mailbox.SmtpAccount, - password = inPassword - } - } - }); - } - } - - mailbox = mailboxIterator.Next(); - } - - string text = null; - - if (!options.NeedJson) - { - if (sbuilder != null) - { - text = sbuilder.ToString(); - } - } - else - { - text = JsonConvert.SerializeObject(accounts, Formatting.Indented); - } - - if (!string.IsNullOrEmpty(text)) - { - Console.WriteLine(@"Try StoreToFile"); - - var path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, - options.NeedJson ? "mailboxes.json" : "mailboxes.txt"); - - var pathFile = StoreToFile(text, path, true); - - Console.WriteLine(@"[SUCCESS] File was stored into path ""{0}""", pathFile); - } - } - catch (Exception ex) - { - Console.WriteLine(ex.ToString()); - } - - ShowAnyKey(options); - } - - private static void ShowAnyKey(Options options) - { - Console.WriteLine(); - - if (options.ExitOnEnd) - return; - - Console.WriteLine(@"Any key to exit..."); - Console.Read(); - } - - private static string StoreToFile(string text, string fileName, bool useTemp) - { - var tempPath = useTemp ? Path.GetTempFileName() : fileName; - var sw = File.CreateText(tempPath); - sw.Write(text); - sw.Close(); - - if (!useTemp) - return tempPath; - - if (string.IsNullOrEmpty(fileName)) - return tempPath; - - var directory = Path.GetDirectoryName(fileName); - // Create the traget path iof it does not exist - if (directory != null && !Directory.Exists(directory)) - Directory.CreateDirectory(directory); - - if (string.IsNullOrEmpty(Path.GetFileName(fileName))) - { - var savePath = Path.Combine(fileName, Path.GetFileNameWithoutExtension(tempPath) + ".txt"); - File.Move(tempPath, savePath); - File.Delete(tempPath); - return savePath; - } - - File.Delete(fileName); - File.Move(tempPath, fileName); - File.Delete(tempPath); - - return fileName; - } - } - - internal class MailAccount - { - public string email; - - public string user; - - public int tenantId; - - public string userId; - - public List settings; - } - - internal class MailAccountSetting - { - public string type; - - public string host; - - public string port; - - public string authentication; - - public string encryption; - - public string login; - - public string password; - } -} diff --git a/module/ASC.Mail/Services/ASC.Mail.PasswordFinder/Properties/AssemblyInfo.cs b/module/ASC.Mail/Services/ASC.Mail.PasswordFinder/Properties/AssemblyInfo.cs deleted file mode 100644 index 1dd61200e..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.PasswordFinder/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyTitle("ASC.Mail.PasswordFinder")] -[assembly: AssemblyDescription("Get connection settings for mailboxes on Onlyoffice MailServer.")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("Ascensio System SIA")] -[assembly: AssemblyProduct("OnlyOffice")] -[assembly: AssemblyCopyright("(c) Ascensio System SIA. All rights reserved")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("7a6f0fc6-c562-4bf8-a3a5-737f9a79b1e2")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Build and Revision Numbers -// by using the '*' as shown below: -// [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyFileVersion("1.0.0.2")] diff --git a/module/ASC.Mail/Services/ASC.Mail.Reloader/ASC.Mail.Reloader.csproj b/module/ASC.Mail/Services/ASC.Mail.Reloader/ASC.Mail.Reloader.csproj deleted file mode 100644 index f56068b68..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.Reloader/ASC.Mail.Reloader.csproj +++ /dev/null @@ -1,132 +0,0 @@ - - - - - Debug - AnyCPU - {594BF643-0EBA-49E8-BAA5-BC433DD7601F} - Exe - Properties - ASC.Mail.Reloader - ASC.Mail.Reloader - v4.8 - 512 - - - AnyCPU - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - false - - - AnyCPU - none - true - bin\Release\ - TRACE - prompt - 4 - false - - - ASC.Mail.Reloader.Program - - - - ..\..\..\..\packages\BouncyCastle.1.8.2\lib\BouncyCastle.Crypto.dll - - - False - ..\..\..\..\packages\CommandLineParser.1.9.71\lib\net45\CommandLine.dll - - - False - ..\..\..\..\packages\DotNetOpenAuth.Ultimate.4.1.0.12182\lib\net45-full\DotNetOpenAuth.dll - - - False - ..\..\..\..\packages\log4net.2.0.8\lib\net45-full\log4net.dll - - - ..\..\..\..\packages\MailKit.2.0.4\lib\net45\MailKit.dll - - - ..\..\..\..\packages\MimeKit.2.0.4\lib\net45\MimeKit.dll - - - False - ..\..\..\..\packages\MySql.Data.8.0.18\lib\net452\MySql.Data.dll - - - ..\..\..\..\packages\Newtonsoft.Json.11.0.2\lib\net45\Newtonsoft.Json.dll - - - False - ..\..\..\..\packages\NLog.4.5.8\lib\net45\NLog.dll - - - - - - - - - - - ..\..\..\..\packages\Google.Protobuf.3.5.1\lib\net45\Google.Protobuf.dll - - - - - - - - - - Designer - - - web.consumers.config - PreserveNewest - - - web.autofac.config - PreserveNewest - - - mail.agg.nlog.config - PreserveNewest - - - mail.agg.log4net.config - PreserveNewest - - - - - {76de7717-3d4b-4a5b-b740-15b8913df0cb} - ASC.Common - - - {a51d0454-4afa-46de-89d4-b03d37e1816c} - ASC.Core.Common - - - {7080343d-fbe7-423a-9405-4f883f6e235b} - ASC.Mail - - - - - \ No newline at end of file diff --git a/module/ASC.Mail/Services/ASC.Mail.Reloader/App.config b/module/ASC.Mail/Services/ASC.Mail.Reloader/App.config deleted file mode 100644 index 6017e1268..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.Reloader/App.config +++ /dev/null @@ -1,73 +0,0 @@ - - - -
-
-
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/module/ASC.Mail/Services/ASC.Mail.Reloader/Program.Options.cs b/module/ASC.Mail/Services/ASC.Mail.Reloader/Program.Options.cs deleted file mode 100644 index b09113445..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.Reloader/Program.Options.cs +++ /dev/null @@ -1,46 +0,0 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2023 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - -using CommandLine; -using CommandLine.Text; - -namespace ASC.Mail.Reloader -{ - internal partial class Program - { - private sealed class Options - { - [Option('i', "id", Required = false, DefaultValue = -1, HelpText = "Id mailbox from MySQL DB.")] - public int MailboxId { get; set; } - - [Option('m', "mid", Required = false, DefaultValue = -1, HelpText = "Message id for reload.")] - public int MessageId { get; set; } - - [Option('j', "json_path", Required = false, DefaultValue = null, HelpText = "Path to json file (ex. { \"data\": [ { \"id_mailbox\": 2649,\"id\": 27325207 } ] } ).")] - public string PathToJson { get; set; } - - [ParserState] - public IParserState LastParserState { get; set; } - - [HelpOption] - public string GetUsage() - { - return HelpText.AutoBuild(this, current => HelpText.DefaultParsingErrorsHandler(this, current)); - } - } - } -} diff --git a/module/ASC.Mail/Services/ASC.Mail.Reloader/Program.cs b/module/ASC.Mail/Services/ASC.Mail.Reloader/Program.cs deleted file mode 100644 index 607950f06..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.Reloader/Program.cs +++ /dev/null @@ -1,332 +0,0 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2023 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - -using System; -using System.Collections.Generic; -using System.Configuration; -using System.IO; -using System.Linq; -using System.Threading; - -using ASC.Common.Logging; -using ASC.Common.Utils; -using ASC.Mail.Clients; -using ASC.Mail.Core; -using ASC.Mail.Core.Dao.Expressions.Mailbox; -using ASC.Mail.Core.Engine; -using ASC.Mail.Data.Contracts; -using ASC.Mail.Enums; -using ASC.Mail.Utils; -using MimeKit; -using Newtonsoft.Json; -using Newtonsoft.Json.Linq; - -namespace ASC.Mail.Reloader -{ - internal partial class Program - { - private static void Main(string[] args) - { - var options = new Options(); - - if (!CommandLine.Parser.Default.ParseArgumentsStrict(args, options, - () => Console.WriteLine(@"Bad command line parameters."))) - { - ShowAnyKey(); - return; - } - - try - { - var reloadList = new Dictionary>(); - - if (!string.IsNullOrEmpty(options.PathToJson) && File.Exists(options.PathToJson)) - { - using (var streamReader = new StreamReader(options.PathToJson)) - { - using (var reader = new JsonTextReader(streamReader)) - { - var jObject = JObject.Load(reader); - - if (jObject["data"] == null || !jObject["data"].Any()) - { - Console.WriteLine(@"[ERROR] json tasks not found. Array is empty."); - - ShowAnyKey(); - return; - } - - var results = jObject["data"].ToList().GroupBy( - p => Convert.ToInt32(p["id_mailbox"]), - p => Convert.ToInt32(p["id"]), - (key, g) => new {MailboxId = key, Ids = g.ToList()}); - - foreach (var result in results) - { - if(reloadList.ContainsKey(result.MailboxId)) - continue; - - reloadList.Add(result.MailboxId, result.Ids); - } - } - } - } - else - { - if (options.MailboxId < 0) - { - Console.WriteLine(@"[ERROR] MailboxId invalid."); - - ShowAnyKey(); - return; - } - - if (options.MessageId < 0) - { - Console.WriteLine(@"[ERROR] MailboxId invalid."); - - ShowAnyKey(); - return; - } - - - reloadList.Add(options.MailboxId, new List {options.MessageId}); - } - - foreach (var reloadItem in reloadList) - { - MailClient client = null; - - try - { - var mailboxId = reloadItem.Key; - - Console.WriteLine(@"Searching account with id {0}", mailboxId); - - var mailbox = GetMailBox(mailboxId); - - if (mailbox == null) - { - Console.WriteLine(@"[ERROR] Account not found."); - ShowAnyKey(); - return; - } - - var messageIds = reloadItem.Value; - - foreach (var messageId in messageIds) - { - Console.WriteLine(@"Searching message with id {0}", messageId); - - if (messageId < 0) - { - Console.WriteLine(@"[ERROR] MessageId not setup."); - continue; - } - - var storedMessage = GetMail(mailbox, messageId); - - if (storedMessage == null) - { - Console.WriteLine(@"[ERROR] Message not found."); - continue; - } - - var messageUid = storedMessage.Uidl; - - if (mailbox.Imap) - { - var uidlStucture = ParserImapUidl(messageUid); - if (uidlStucture.folderId != FolderType.Inbox) - { - Console.WriteLine(@"Only inbox messages are supported for downloading."); - continue; - } - } - - var certificatePermit = ConfigurationManager.AppSettings["mail.certificate-permit"] != - null && - Convert.ToBoolean( - ConfigurationManager.AppSettings["mail.certificate-permit"]); - - var log = new NullLog(); - - if (client == null) - client = new MailClient(mailbox, CancellationToken.None, - certificatePermit: certificatePermit); - - MimeMessage mimeMessage; - - try - { - mimeMessage = client.GetInboxMessage(messageUid); - } - catch (Exception e) - { - Console.WriteLine(@"[ERROR] Failed GetInboxMessage(""{0}"") Exception: {1}", messageUid, e); - continue; - } - - MailMessageData message; - - try - { - message = mimeMessage.ConvertToMailMessage(new MailFolder(FolderType.Inbox, ""), - storedMessage.IsNew, storedMessage.ChainId, storedMessage.ChainDate, - storedMessage.StreamId, mailboxId, false, log); - } - catch (Exception ex) - { - Console.WriteLine(@"[ERROR] Failed ConvertToMailMessage(""{0}"") Exception: {1}", - messageUid, ex); - continue; - } - - if (!storedMessage.From.Equals(StringUtils.NormalizeStringForMySql(message.From)) || - !storedMessage.To.Equals(StringUtils.NormalizeStringForMySql(message.To)) || - !storedMessage.Subject.Equals(StringUtils.NormalizeStringForMySql(message.Subject))) - { - Console.WriteLine(@"storedMessage.From = '{0}'", storedMessage.From); - Console.WriteLine(@"message.From = '{0}'", - StringUtils.NormalizeStringForMySql(message.From)); - - Console.WriteLine(@"storedMessage.To = '{0}'", storedMessage.To); - Console.WriteLine(@"message.To = '{0}'", - StringUtils.NormalizeStringForMySql(message.To)); - - Console.WriteLine(@"storedMessage.Subject = '{0}'", storedMessage.Subject); - Console.WriteLine(@"message.Subject = '{0}'", - StringUtils.NormalizeStringForMySql(message.Subject)); - - Console.WriteLine(@"[ERROR] Stored message not equals to server message"); - continue; - } - - if (storedMessage.Attachments.Any() && message.Attachments.Any()) - { - var newAttachments = new List(); - - foreach (var attachment in message.Attachments) - { - var storedAttachment = - storedMessage.Attachments.FirstOrDefault( - a => - (!string.IsNullOrEmpty(a.fileName) && - a.fileName.Equals(attachment.fileName, - StringComparison.InvariantCultureIgnoreCase)) || - !string.IsNullOrEmpty(a.contentId) && - a.contentId.Equals(attachment.contentId, - StringComparison.InvariantCultureIgnoreCase) || - !string.IsNullOrEmpty(a.contentLocation) && - a.contentLocation.Equals(attachment.contentLocation, - StringComparison.InvariantCultureIgnoreCase)); - - if (storedAttachment == null) - continue; - - attachment.fileName = storedAttachment.fileName; - attachment.storedName = storedAttachment.storedName; - attachment.fileNumber = storedAttachment.fileNumber; - attachment.streamId = storedAttachment.streamId; - attachment.mailboxId = storedAttachment.mailboxId; - attachment.tenant = storedAttachment.tenant; - attachment.user = storedAttachment.user; - - newAttachments.Add(attachment); - } - - message.Attachments = newAttachments; - } - - if (!MessageEngine.TryStoreMailData(message, mailbox, log)) - { - Console.WriteLine(@"[ERROR] Failed to store mail data"); - continue; - } - - Console.WriteLine(@"[SUCCESS] Mail ""{0}"" data was reloaded", messageId); - } - } - catch (Exception ex) - { - Console.WriteLine(ex.ToString()); - } - finally - { - if (client != null) - { - client.Dispose(); - } - } - } - } - catch (Exception ex) - { - Console.WriteLine(ex.ToString()); - } - - ShowAnyKey(); - } - - private static void ShowAnyKey() - { - Console.WriteLine(); - Console.WriteLine(@"Any key to exit..."); - Console.ReadKey(); - } - - private struct ImapUidl - { - public FolderType folderId; -#pragma warning disable 414 - public int uid; -#pragma warning restore 414 - } - - private static ImapUidl ParserImapUidl(string uidl) - { - var elements = uidl.Split('-'); - - return new ImapUidl - { - uid = Convert.ToInt32(elements[0]), - folderId = (FolderType) Convert.ToInt32(elements[1]) - }; - } - - private static MailMessageData GetMail(MailBoxData mailbox, int mailId) - { - var engine = new EngineFactory(mailbox.TenantId, mailbox.UserId); - - return engine.MessageEngine.GetMessage(mailId, new MailMessageData.Options - { - LoadBody = false, - LoadImages = false, - NeedProxyHttp = false, - NeedSanitizer = false, - OnlyUnremoved = true, - LoadEmebbedAttachements = true - }); - } - - private static MailBoxData GetMailBox(int mailboxId) - { - var engine = new EngineFactory(-1); - return engine.MailboxEngine.GetMailboxData(new ConcreteSimpleMailboxExp(mailboxId)); - } - } -} diff --git a/module/ASC.Mail/Services/ASC.Mail.Reloader/Properties/AssemblyInfo.cs b/module/ASC.Mail/Services/ASC.Mail.Reloader/Properties/AssemblyInfo.cs deleted file mode 100644 index 0a8b39a2a..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.Reloader/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyTitle("Restore message data in storage.")] -[assembly: AssemblyDescription("Restore message data in storage.")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("Ascensio System SIA")] -[assembly: AssemblyProduct("ASC.Mail.Reloader")] -[assembly: AssemblyCopyright("(c) Ascensio System SIA. All rights reserved")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("7a6f0fc6-c562-4bf8-a3a5-737f9a79b1e5")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Build and Revision Numbers -// by using the '*' as shown below: -// [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyFileVersion("1.0.0.1")] diff --git a/module/ASC.Mail/Services/ASC.Mail.StorageCleaner/ASC.Mail.StorageCleaner.Service.csproj b/module/ASC.Mail/Services/ASC.Mail.StorageCleaner/ASC.Mail.StorageCleaner.Service.csproj deleted file mode 100644 index eedbefd5b..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.StorageCleaner/ASC.Mail.StorageCleaner.Service.csproj +++ /dev/null @@ -1,140 +0,0 @@ - - - - Debug - AnyCPU - 9.0.30729 - 2.0 - {2559E5C4-4803-4A11-B9EC-33ECAD06C935} - Exe - Properties - ASC.Mail.StorageCleaner - ASC.Mail.StorageCleaner - v4.8 - 512 - - - - - 3.5 - - publish\ - true - Disk - false - Foreground - 7 - Days - false - false - true - 0 - 1.0.0.%2a - false - false - true - - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - false - false - bin\Debug\ASC.Mail.StorageCleaner.xml - CS1591 - - - none - true - bin\Release\ - TRACE - prompt - 4 - false - - - - - - - Component - - - - - web.autofac.config - PreserveNewest - - - Designer - - - Designer - PreserveNewest - - - Designer - PreserveNewest - - - - - False - .NET Framework 3.5 SP1 Client Profile - false - - - False - .NET Framework 3.5 SP1 - true - - - - - {76de7717-3d4b-4a5b-b740-15b8913df0cb} - ASC.Common - - - {a51d0454-4afa-46de-89d4-b03d37e1816c} - ASC.Core.Common - - - {3f6b420f-abd3-4b5a-9f4c-5d61ffbb01de} - ASC.Data.Storage - - - {7080343d-fbe7-423a-9405-4f883f6e235b} - ASC.Mail - - - - - 2.0.9 - - - 8.0.32.1 - - - 5.1.2 - - - 0.8.5 - - - - - - - - - \ No newline at end of file diff --git a/module/ASC.Mail/Services/ASC.Mail.StorageCleaner/App.config b/module/ASC.Mail/Services/ASC.Mail.StorageCleaner/App.config deleted file mode 100644 index ac67345d9..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.StorageCleaner/App.config +++ /dev/null @@ -1,85 +0,0 @@ - - - -
-
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/module/ASC.Mail/Services/ASC.Mail.StorageCleaner/HealthCheckService.cs b/module/ASC.Mail/Services/ASC.Mail.StorageCleaner/HealthCheckService.cs deleted file mode 100644 index df7bbdbf8..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.StorageCleaner/HealthCheckService.cs +++ /dev/null @@ -1,33 +0,0 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2023 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - -using ASC.Core.Common.Contracts; - -namespace ASC.Mail.StorageCleaner -{ - public class HealthCheckService : IHealthCheckService - { - public HealthCheckResponse CheckHealth() - { - return HealthCheckResult.ToResponse(new HealthCheckResult - { - Message = "Service MailCleaner is OK! Warning: Method is not implement. Always return the Healthy status", - Status = HealthStatus.Healthy - }); - } - } -} diff --git a/module/ASC.Mail/Services/ASC.Mail.StorageCleaner/Program.cs b/module/ASC.Mail/Services/ASC.Mail.StorageCleaner/Program.cs deleted file mode 100644 index dda1f7c7d..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.StorageCleaner/Program.cs +++ /dev/null @@ -1,53 +0,0 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2023 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - -using System; -using System.Linq; -using System.ServiceProcess; - -using ASC.Common.Logging; - -namespace ASC.Mail.StorageCleaner -{ - class Program - { - /// - /// The main entry point for the application. - /// - [STAThread] - private static void Main(params string[] args) - { - AppDomain.CurrentDomain.UnhandledException += OnUnhandledException; - - if (Environment.UserInteractive || (args.Any() && args[0].Equals("-console"))) - { - var service = new StorageCleanerService(); - service.StartConsole(); - } - else - { - ServiceBase.Run(new StorageCleanerService()); - } - } - - private static void OnUnhandledException(object sender, UnhandledExceptionEventArgs e) - { - var log = LogManager.GetLogger("ASC.Mail.StorageCleaner"); - log.FatalFormat("Unhandled exception: {0}", e.ExceptionObject.ToString()); - } - } -} diff --git a/module/ASC.Mail/Services/ASC.Mail.StorageCleaner/Properties/AssemblyInfo.cs b/module/ASC.Mail/Services/ASC.Mail.StorageCleaner/Properties/AssemblyInfo.cs deleted file mode 100644 index 9dcd43c22..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.StorageCleaner/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,35 +0,0 @@ -using System.Reflection; -using System.Runtime.InteropServices; - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyTitle("ASC.Mail.StorageCleaner")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("Ascensio System SIA")] -[assembly: AssemblyProduct("ASC.Mail.StorageCleaner")] -[assembly: AssemblyCopyright("(c) Ascensio System SIA. All rights reserved")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("771bfbb8-de8a-47ba-9fcf-af85bf79c2fc")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Build and Revision Numbers -// by using the '*' as shown below: -// [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyFileVersion("1.0.0.5")] diff --git a/module/ASC.Mail/Services/ASC.Mail.StorageCleaner/StorageCleanerService.cs b/module/ASC.Mail/Services/ASC.Mail.StorageCleaner/StorageCleanerService.cs deleted file mode 100644 index 7c01a38f5..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.StorageCleaner/StorageCleanerService.cs +++ /dev/null @@ -1,257 +0,0 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2023 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - -using System; -using System.Configuration; -using System.ServiceModel; -using System.ServiceProcess; -using System.Threading; -using System.Threading.Tasks; - -using ASC.Common.Logging; -using ASC.Mail.Core.Engine; - -namespace ASC.Mail.StorageCleaner -{ - internal class StorageCleanerService : ServiceBase - { - #region - Declaration - - - private readonly ILog _log; - private Timer _intervalTimer; - private readonly ManualResetEvent _resetEvent; - private MailGarbageEngine _eraser; - private readonly TimeSpan _tsInterval; - private readonly CancellationTokenSource _cancelTokenSource; - private ServiceHost _healthCheckServiceHost; - - #endregion - - #region - Constructor - - - public StorageCleanerService() - { - CanStop = true; - - AutoLog = true; - - _log = LogManager.GetLogger("ASC.Mail.Cleaner"); - - _resetEvent = new ManualResetEvent(false); - - _cancelTokenSource = new CancellationTokenSource(); - - _tsInterval = TimeSpan.FromMinutes(Convert.ToInt32(ConfigurationManagerExtension.AppSettings["cleaner.timer-wait-minutes"])); - - _log.InfoFormat("Service will clear mail storage every {0} minutes\r\n", _tsInterval.TotalMinutes); - - _eraser = new MailGarbageEngine(_log); - - _intervalTimer = new Timer(IntervalTimer_Elapsed, _cancelTokenSource.Token, Timeout.Infinite, Timeout.Infinite); - } - - #endregion - - #region - Start / Stop - - - /// - /// OnStart(): Put startup code here - /// - Start threads, get inital data, etc. - /// - /// - protected override void OnStart(string[] args) - { - try - { - _log.Info("Start service\r\n"); - - base.OnStart(args); - - _healthCheckServiceHost = new ServiceHost(typeof(HealthCheckService)); - _healthCheckServiceHost.Open(); - - StartTimer(true); - } - catch (Exception) - { - OnStop(); - } - } - - /// - /// OnStop(): Put your stop code here - /// - Stop threads, set final data, etc. - /// - protected override void OnStop() - { - try - { - _log.Info("Stoping service\r\n"); - - if (_cancelTokenSource != null) - _cancelTokenSource.Cancel(); - - StopTimer(); - - if (_intervalTimer != null) - { - _intervalTimer.Dispose(); - _intervalTimer = null; - } - - if (_resetEvent != null) - _resetEvent.Set(); - - if (_eraser != null) - { - _eraser.Dispose(); - _eraser = null; - } - - } - catch (Exception ex) - { - _log.ErrorFormat("Stop service Error: {0}\r\n", ex.ToString()); - } - finally - { - base.OnStop(); - - if (_healthCheckServiceHost != null) - { - _healthCheckServiceHost.Close(); - _healthCheckServiceHost = null; - } - } - - _log.Info("Stop service\r\n"); - } - - /// - /// OnShutdown(): Called when the System is shutting down - /// - Put code here when you need special handling - /// of code that deals with a system shutdown, such - /// as saving special data before shutdown. - /// - protected override void OnShutdown() - { - _log.Info("Service shutdown."); - OnStop(); - base.OnShutdown(); - } - - /// - /// OnPowerEvent(): Useful for detecting power status changes, - /// such as going into Suspend mode or Low Battery for laptops. - /// - /// The Power Broadcast Status - /// (BatteryLow, Suspend, etc.) - protected override bool OnPowerEvent(PowerBroadcastStatus powerStatus) - { - _log.InfoFormat("Service power event detected = {0}.", powerStatus.ToString()); - - if (powerStatus == PowerBroadcastStatus.Suspend) - { - OnStop(); - } - return base.OnPowerEvent(powerStatus); - } - - /// - /// Start service in console mode. - /// - public void StartConsole() - { - _log.Info("Service Start in console-daemon mode"); - - OnStart(null); - - Console.CancelKeyPress += (sender, e) => OnStop(); - - _resetEvent.WaitOne(); - } - - private void StartTimer(bool immediately = false) - { - if (_intervalTimer == null) - return; - - if (immediately) - { - _log.Debug("Setup _workTimer to start immediately"); - - _intervalTimer.Change(0, Timeout.Infinite); - } - else - { - _log.DebugFormat("Setup _workTimer to {0} minutes", _tsInterval.TotalMinutes); - - _intervalTimer.Change(_tsInterval, _tsInterval); - } - } - - private void StopTimer() - { - if (_intervalTimer == null) - return; - - _log.Debug("Setup _workTimer to Timeout.Infinite"); - - _intervalTimer.Change(Timeout.Infinite, Timeout.Infinite); - } - - #endregion - - #region - Timer_Elapsed - - - private void IntervalTimer_Elapsed(object state) - { - _log.Debug("Timer->workTimer_Elapsed"); - - var cancelToken = state as CancellationToken? ?? new CancellationToken(); - - try - { - _eraser.ClearMailGarbage(cancelToken); - - _log.InfoFormat("All mailboxes were processed. Go back to timer. Next start after {0} minutes.\r\n", - _tsInterval.TotalMinutes); - - } - catch (Exception ex) - { - if (ex is AggregateException) - { - ex = ((AggregateException)ex).GetBaseException(); - } - - if (ex is TaskCanceledException || ex is OperationCanceledException) - { - _log.Info("Execution was canceled."); - - return; - } - - _log.ErrorFormat("Timer->workTimer_Elapsed. Exception:\r\n{0}\r\n", ex.ToString()); - } - - StartTimer(); - } - - #endregion - } -} diff --git a/module/ASC.Mail/Services/ASC.Mail.StorageCleaner/mail.cln.log4net.config b/module/ASC.Mail/Services/ASC.Mail.StorageCleaner/mail.cln.log4net.config deleted file mode 100644 index 8ad021be5..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.StorageCleaner/mail.cln.log4net.config +++ /dev/null @@ -1,113 +0,0 @@ - - - - WINDOWS:LogDirectory - ..\..\..\..\..\..\web\studio\Logs\ - - - UNIX:LogDirectory - /var/log/onlyoffice/ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/module/ASC.Mail/Services/ASC.Mail.StorageCleaner/mail.cln.nlog.config b/module/ASC.Mail/Services/ASC.Mail.StorageCleaner/mail.cln.nlog.config deleted file mode 100644 index 5c0949462..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.StorageCleaner/mail.cln.nlog.config +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/module/ASC.Mail/Services/ASC.Mail.Watchdog.Service/ASC.Mail.Watchdog.Service.csproj b/module/ASC.Mail/Services/ASC.Mail.Watchdog.Service/ASC.Mail.Watchdog.Service.csproj deleted file mode 100644 index ebf73ca90..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.Watchdog.Service/ASC.Mail.Watchdog.Service.csproj +++ /dev/null @@ -1,148 +0,0 @@ - - - - Debug - AnyCPU - 9.0.30729 - 2.0 - {F72B7F19-9A9B-41F1-AEA9-ADE70D3D8D19} - Exe - Properties - ASC.Mail.Watchdog.Service - ASC.Mail.Watchdog.Service - v4.8 - 512 - - - - - 3.5 - - false - publish\ - true - Disk - false - Foreground - 7 - Days - false - false - true - 0 - 1.0.0.%2a - false - true - bin\$(Configuration)\ - - - true - full - false - DEBUG;TRACE - prompt - 4 - false - false - bin\Debug\ASC.Mail.Watchdog.Service.xml - CS1591 - - - none - true - TRACE - prompt - 4 - false - false - - - - - - Component - - - WatchdogService.cs - - - - - ResXFileCodeGenerator - Resources.Designer.cs - Designer - - - True - Resources.resx - True - - - Designer - - - web.autofac.config - PreserveNewest - - - Designer - PreserveNewest - - - Designer - PreserveNewest - - - SettingsSingleFileGenerator - Settings.Designer.cs - - - True - Settings.settings - True - - - - - False - .NET Framework 3.5 SP1 Client Profile - false - - - False - .NET Framework 3.5 SP1 - true - - - - - {76de7717-3d4b-4a5b-b740-15b8913df0cb} - ASC.Common - - - {a51d0454-4afa-46de-89d4-b03d37e1816c} - ASC.Core.Common - - - {7080343d-fbe7-423a-9405-4f883f6e235b} - ASC.Mail - - - - - 2.8.0 - - - 2.0.9 - - - 8.0.32.1 - - - - - - - - - \ No newline at end of file diff --git a/module/ASC.Mail/Services/ASC.Mail.Watchdog.Service/App.config b/module/ASC.Mail/Services/ASC.Mail.Watchdog.Service/App.config deleted file mode 100644 index 5e1d2ab53..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.Watchdog.Service/App.config +++ /dev/null @@ -1,59 +0,0 @@ - - - -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/module/ASC.Mail/Services/ASC.Mail.Watchdog.Service/HealthCheckService.cs b/module/ASC.Mail/Services/ASC.Mail.Watchdog.Service/HealthCheckService.cs deleted file mode 100644 index c9004cab6..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.Watchdog.Service/HealthCheckService.cs +++ /dev/null @@ -1,33 +0,0 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2023 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - -using ASC.Core.Common.Contracts; - -namespace ASC.Mail.Watchdog -{ - public class HealthCheckService : IHealthCheckService - { - public HealthCheckResponse CheckHealth() - { - return HealthCheckResult.ToResponse(new HealthCheckResult - { - Message = "Service MailWatchdog is OK! Warning: Method is not implement. Always return the Healthy status", - Status = HealthStatus.Healthy - }); - } - } -} diff --git a/module/ASC.Mail/Services/ASC.Mail.Watchdog.Service/Program.Options.cs b/module/ASC.Mail/Services/ASC.Mail.Watchdog.Service/Program.Options.cs deleted file mode 100644 index 67e92a6ed..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.Watchdog.Service/Program.Options.cs +++ /dev/null @@ -1,31 +0,0 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2023 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - -using CommandLine; -using CommandLine.Text; - -namespace ASC.Mail.Watchdog.Service -{ - partial class Program - { - private class Options - { - [Option("console", Required = false, HelpText = "Console state")] - public bool IsConsole { get; set; } - } - } -} diff --git a/module/ASC.Mail/Services/ASC.Mail.Watchdog.Service/Program.cs b/module/ASC.Mail/Services/ASC.Mail.Watchdog.Service/Program.cs deleted file mode 100644 index 95b02e48b..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.Watchdog.Service/Program.cs +++ /dev/null @@ -1,53 +0,0 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2023 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - -using System; -using System.Linq; -using System.ServiceProcess; - -using ASC.Common.Logging; - -namespace ASC.Mail.Watchdog.Service -{ - partial class Program - { - /// - /// The main entry point for the application. - /// - [STAThread] - private static void Main(params string[] args) - { - AppDomain.CurrentDomain.UnhandledException += OnUnhandledException; - - if (Environment.UserInteractive || (args.Any())) - { - var service = new Watchdog(); - service.StartConsole(); - } - else - { - ServiceBase.Run(new Watchdog()); - } - } - - private static void OnUnhandledException(object sender, UnhandledExceptionEventArgs e) - { - var log = LogManager.GetLogger("ASC.Mail.Watchdog"); - log.FatalFormat("Unhandled exception: {0}", e.ExceptionObject.ToString()); - } - } -} diff --git a/module/ASC.Mail/Services/ASC.Mail.Watchdog.Service/Properties/AssemblyInfo.cs b/module/ASC.Mail/Services/ASC.Mail.Watchdog.Service/Properties/AssemblyInfo.cs deleted file mode 100644 index e63805d36..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.Watchdog.Service/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,35 +0,0 @@ -using System.Reflection; -using System.Runtime.InteropServices; - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyTitle("WindowsService")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("Ascensio System SIA")] -[assembly: AssemblyProduct("WindowsService")] -[assembly: AssemblyCopyright("(c) Ascensio System SIA. All rights reserved")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("a412ce2e-067e-4c2a-83b6-a90fead0762d")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Build and Revision Numbers -// by using the '*' as shown below: -// [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyFileVersion("1.0.0.1")] diff --git a/module/ASC.Mail/Services/ASC.Mail.Watchdog.Service/Properties/Resources.Designer.cs b/module/ASC.Mail/Services/ASC.Mail.Watchdog.Service/Properties/Resources.Designer.cs deleted file mode 100644 index deb7aa5fe..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.Watchdog.Service/Properties/Resources.Designer.cs +++ /dev/null @@ -1,63 +0,0 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// Runtime Version:4.0.30319.17929 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace ASC.Mail.Watchdog.Service.Properties { - using System; - - - /// - /// A strongly-typed resource class, for looking up localized strings, etc. - /// - // This class was auto-generated by the StronglyTypedResourceBuilder - // class via a tool like ResGen or Visual Studio. - // To add or remove a member, edit your .ResX file then rerun ResGen - // with the /str option, or rebuild your VS project. - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - internal class Resources { - - private static global::System.Resources.ResourceManager resourceMan; - - private static global::System.Globalization.CultureInfo resourceCulture; - - [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] - internal Resources() { - } - - /// - /// Returns the cached ResourceManager instance used by this class. - /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Resources.ResourceManager ResourceManager { - get { - if (object.ReferenceEquals(resourceMan, null)) { - global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("ASC.Mail.Watchdog.Service.Properties.Resources", typeof(Resources).Assembly); - resourceMan = temp; - } - return resourceMan; - } - } - - /// - /// Overrides the current thread's CurrentUICulture property for all - /// resource lookups using this strongly typed resource class. - /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Globalization.CultureInfo Culture { - get { - return resourceCulture; - } - set { - resourceCulture = value; - } - } - } -} diff --git a/module/ASC.Mail/Services/ASC.Mail.Watchdog.Service/Properties/Resources.resx b/module/ASC.Mail/Services/ASC.Mail.Watchdog.Service/Properties/Resources.resx deleted file mode 100644 index ffecec851..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.Watchdog.Service/Properties/Resources.resx +++ /dev/null @@ -1,117 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - \ No newline at end of file diff --git a/module/ASC.Mail/Services/ASC.Mail.Watchdog.Service/Properties/Settings.Designer.cs b/module/ASC.Mail/Services/ASC.Mail.Watchdog.Service/Properties/Settings.Designer.cs deleted file mode 100644 index b40200bf4..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.Watchdog.Service/Properties/Settings.Designer.cs +++ /dev/null @@ -1,26 +0,0 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// Runtime Version:4.0.30319.17929 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace ASC.Mail.Watchdog.Service.Properties { - - - [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")] - internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { - - private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); - - public static Settings Default { - get { - return defaultInstance; - } - } - } -} diff --git a/module/ASC.Mail/Services/ASC.Mail.Watchdog.Service/Properties/Settings.settings b/module/ASC.Mail/Services/ASC.Mail.Watchdog.Service/Properties/Settings.settings deleted file mode 100644 index 2bd17f050..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.Watchdog.Service/Properties/Settings.settings +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/module/ASC.Mail/Services/ASC.Mail.Watchdog.Service/WatchdogService.Designer.cs b/module/ASC.Mail/Services/ASC.Mail.Watchdog.Service/WatchdogService.Designer.cs deleted file mode 100644 index e8d09ebe1..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.Watchdog.Service/WatchdogService.Designer.cs +++ /dev/null @@ -1,37 +0,0 @@ -namespace ASC.Mail.Watchdog.Service -{ - partial class Watchdog - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Component Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - components = new System.ComponentModel.Container(); - this.ServiceName = "ASC.Mail.Watchdog.Service"; - } - - #endregion - } -} diff --git a/module/ASC.Mail/Services/ASC.Mail.Watchdog.Service/WatchdogService.cs b/module/ASC.Mail/Services/ASC.Mail.Watchdog.Service/WatchdogService.cs deleted file mode 100644 index 005759c5d..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.Watchdog.Service/WatchdogService.cs +++ /dev/null @@ -1,158 +0,0 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2023 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - -using System; -using System.Configuration; -using System.Linq; -using System.ServiceModel; -using System.ServiceProcess; -using System.Threading; - -using ASC.Common.Logging; -using ASC.Mail.Core; - -namespace ASC.Mail.Watchdog.Service -{ - partial class Watchdog : ServiceBase - { - #region - Declaration - - - private readonly ILog _log; - private readonly EngineFactory _engineFactory; - - private Timer _intervalTimer; - readonly TimeSpan _tsInterval; - readonly TimeSpan _tsTasksTimeoutInterval; - - private readonly ManualResetEvent _mreStop; - - private ServiceHost _healthCheckServiceHost; - - #endregion - - #region - Constructor - - - public Watchdog() - { - InitializeComponent(); - CanStop = true; - AutoLog = true; - - _log = LogManager.GetLogger("ASC.Mail.Watchdog"); - _mreStop = new ManualResetEvent(false); - _tsInterval = - TimeSpan.FromMinutes( - Convert.ToInt32(ConfigurationManagerExtension.AppSettings["mailwatchdog.timer-interval-in-minutes"])); - _tsTasksTimeoutInterval = - TimeSpan.FromMinutes( - Convert.ToInt32(ConfigurationManagerExtension.AppSettings["mailwatchdog.tasks-timeout-in-minutes"])); - - _log.InfoFormat("\r\nConfiguration:\r\n" + - "\t- check locked mailboxes in every {0} minutes;\r\n" + - "\t- locked mailboxes timeout {1} minutes;\r\n", - _tsInterval.TotalMinutes, - _tsTasksTimeoutInterval.TotalMinutes); - - _engineFactory = new EngineFactory(-1, log: _log); - } - - #endregion - - #region - Start / Stop - - - public void StartConsole() - { - OnStart(null); - Console.CancelKeyPress += (sender, e) => OnStop(); - _mreStop.WaitOne(); - } - - protected override void OnStart(string[] args) - { - try - { - _log.Info("Start service\r\n"); - _intervalTimer = new Timer(IntervalTimer_Elapsed, _mreStop, 0, Timeout.Infinite); - - _healthCheckServiceHost = new ServiceHost(typeof(HealthCheckService)); - _healthCheckServiceHost.Open(); - } - catch (Exception) - { - OnStop(); - } - } - - protected override void OnStop() - { - //Service will be stoped in future 30 seconds! - // signal to tell the worker process to stop - _mreStop.Set(); - - _log.Info("Stop service\r\n"); - - if (_intervalTimer == null) return; - - _intervalTimer.Change(Timeout.Infinite, Timeout.Infinite); - _intervalTimer.Dispose(); - _intervalTimer = null; - - if (_healthCheckServiceHost != null) - { - _healthCheckServiceHost.Close(); - _healthCheckServiceHost = null; - } - } - - #endregion - - #region - OnTimer - - - private void IntervalTimer_Elapsed(object state) - { - try - { - _intervalTimer.Change(Timeout.Infinite, Timeout.Infinite); - - _log.InfoFormat("ReleaseLockedMailboxes(timeout is {0} minutes)", _tsTasksTimeoutInterval.TotalMinutes); - - var freeMailboxIds = _engineFactory.MailboxEngine.ReleaseMailboxes((int)_tsTasksTimeoutInterval.TotalMinutes); - - if (freeMailboxIds.Any()) - { - _log.InfoFormat("Released next locked mailbox's ids: {0}", string.Join(",", freeMailboxIds)); - } - else - { - _log.Info("Nothing to do!"); - } - - } - catch (Exception ex) - { - _log.ErrorFormat("IntervalTimer_Elapsed() Exception:\r\n{0}", ex.ToString()); - } - finally - { - _log.InfoFormat("Waiting for {0} minutes for next check...", _tsInterval.TotalMinutes); - _intervalTimer.Change(_tsInterval, _tsInterval); - } - } - - #endregion - } -} diff --git a/module/ASC.Mail/Services/ASC.Mail.Watchdog.Service/mail.dog.log4net.config b/module/ASC.Mail/Services/ASC.Mail.Watchdog.Service/mail.dog.log4net.config deleted file mode 100644 index b50115040..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.Watchdog.Service/mail.dog.log4net.config +++ /dev/null @@ -1,112 +0,0 @@ - - - - WINDOWS:LogDirectory - ..\..\..\..\..\..\web\studio\Logs\ - - - UNIX:LogDirectory - /var/log/onlyoffice/ - - - CleanPeriod - 5 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/module/ASC.Mail/Services/ASC.Mail.Watchdog.Service/mail.dog.nlog.config b/module/ASC.Mail/Services/ASC.Mail.Watchdog.Service/mail.dog.nlog.config deleted file mode 100644 index 10be53f09..000000000 --- a/module/ASC.Mail/Services/ASC.Mail.Watchdog.Service/mail.dog.nlog.config +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/module/ASC.Thrdparty/ASC.FederatedLogin/LoginProviders/TwitterLoginProvider.cs b/module/ASC.Thrdparty/ASC.FederatedLogin/LoginProviders/TwitterLoginProvider.cs index ab55a3bed..30a5dfe09 100644 --- a/module/ASC.Thrdparty/ASC.FederatedLogin/LoginProviders/TwitterLoginProvider.cs +++ b/module/ASC.Thrdparty/ASC.FederatedLogin/LoginProviders/TwitterLoginProvider.cs @@ -35,8 +35,6 @@ public class TwitterLoginProvider : BaseLoginProvider { public static string TwitterKey { get { return Instance.ClientID; } } public static string TwitterSecret { get { return Instance.ClientSecret; } } - public static string TwitterDefaultAccessToken { get { return Instance["twitterAccessToken_Default"]; } } - public static string TwitterAccessTokenSecret { get { return Instance["twitterAccessTokenSecret_Default"]; } } public override string AccessTokenUrl { get { return "https://api.twitter.com/oauth/access_token"; } } public override string RedirectUri { get { return this["twitterRedirectUrl"]; } } diff --git a/module/ASC.Thrdparty/ASC.Thrdparty/ASC.Thrdparty.csproj b/module/ASC.Thrdparty/ASC.Thrdparty/ASC.Thrdparty.csproj deleted file mode 100644 index e57fc0641..000000000 --- a/module/ASC.Thrdparty/ASC.Thrdparty/ASC.Thrdparty.csproj +++ /dev/null @@ -1,93 +0,0 @@ - - - - Debug - AnyCPU - 9.0.30729 - 2.0 - {592EAC85-6CFC-4AD7-B653-3EADAA18327E} - Library - Properties - ASC.Thrdparty - ASC.Thrdparty - v4.8 - 512 - - - - - 3.5 - - publish\ - true - Disk - false - Foreground - 7 - Days - false - false - true - 0 - 1.0.0.%2a - false - false - true - ..\..\..\web\studio\ASC.Web.Studio\bin\ - - - true - full - false - DEBUG;TRACE - prompt - 4 - false - ..\..\..\web\studio\ASC.Web.Studio\bin\ASC.Thrdparty.xml - CS1591 - - - none - true - TRACE - prompt - 4 - false - - - - - - - - - - - - - - - - - - 13.0.1 - - - 5.0.4 - - - - - {76de7717-3d4b-4a5b-b740-15b8913df0cb} - ASC.Common - - - {a51d0454-4afa-46de-89d4-b03d37e1816c} - ASC.Core.Common - - - - - - - \ No newline at end of file diff --git a/module/ASC.Thrdparty/ASC.Thrdparty/Message.cs b/module/ASC.Thrdparty/ASC.Thrdparty/Message.cs deleted file mode 100644 index 7ee2656ed..000000000 --- a/module/ASC.Thrdparty/ASC.Thrdparty/Message.cs +++ /dev/null @@ -1,51 +0,0 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2023 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - -using System; - -namespace ASC.Thrdparty -{ - /// - /// Represents an user activity message - /// - public class Message - { - /// - /// User name - /// - /// Name user - public string UserName { get; set; } - - /// - /// Message text - /// - /// text - public string Text { get; set; } - - /// - /// The date of message post - /// - /// 2008-04-10T06-30-00.000Z - public DateTime PostedOn { get; set; } - - /// - /// Social network - /// - /// 0 - public SocialNetworks Source { get; set; } - } -} diff --git a/module/ASC.Thrdparty/ASC.Thrdparty/Properties/AssemblyInfo.cs b/module/ASC.Thrdparty/ASC.Thrdparty/Properties/AssemblyInfo.cs deleted file mode 100644 index 6f57c8ac0..000000000 --- a/module/ASC.Thrdparty/ASC.Thrdparty/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,34 +0,0 @@ -using System.Reflection; -using System.Runtime.InteropServices; - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyTitle("ASC.Thrdparty")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("Ascensio System SIA")] -[assembly: AssemblyProduct("ASC.Thrdparty")] -[assembly: AssemblyCopyright("(c) Ascensio System SIA. All rights reserved")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("c17fa4af-6a20-4de1-a9d7-f5a43f128687")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Build and Revision Numbers -// by using the '*' as shown below: -// [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.0.0.0")] diff --git a/module/ASC.Thrdparty/ASC.Thrdparty/SocialMediaException.cs b/module/ASC.Thrdparty/ASC.Thrdparty/SocialMediaException.cs deleted file mode 100644 index abdc8e855..000000000 --- a/module/ASC.Thrdparty/ASC.Thrdparty/SocialMediaException.cs +++ /dev/null @@ -1,44 +0,0 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2023 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - -using System; -using System.Runtime.Serialization; - -namespace ASC.Thrdparty -{ - public class SocialMediaException : Exception - { - public SocialMediaException() - { - } - - public SocialMediaException(string message) - : base(message) - { - } - - public SocialMediaException(string message, Exception innerException) - : base(message, innerException) - { - } - - protected SocialMediaException(SerializationInfo info, StreamingContext context) - : base(info, context) - { - } - } -} \ No newline at end of file diff --git a/module/ASC.Thrdparty/ASC.Thrdparty/Twitter/Exceptions.cs b/module/ASC.Thrdparty/ASC.Thrdparty/Twitter/Exceptions.cs deleted file mode 100644 index d938df373..000000000 --- a/module/ASC.Thrdparty/ASC.Thrdparty/Twitter/Exceptions.cs +++ /dev/null @@ -1,59 +0,0 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2023 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - -namespace ASC.Thrdparty.Twitter -{ - public class TwitterException : SocialMediaException - { - public TwitterException(string message) - : base(message) - { - } - } - - public class ConnectionFailureException : TwitterException - { - public ConnectionFailureException(string message) - : base(message) - { - } - } - - public class RateLimitException : TwitterException - { - public RateLimitException(string message) - : base(message) - { - } - } - - public class ResourceNotFoundException : TwitterException - { - public ResourceNotFoundException(string message) - : base(message) - { - } - } - - public class UnauthorizedException : TwitterException - { - public UnauthorizedException(string message) - : base(message) - { - } - } -} diff --git a/module/ASC.Thrdparty/ASC.Thrdparty/Twitter/TwitterApiInfo.cs b/module/ASC.Thrdparty/ASC.Thrdparty/Twitter/TwitterApiInfo.cs deleted file mode 100644 index bd6cd250f..000000000 --- a/module/ASC.Thrdparty/ASC.Thrdparty/Twitter/TwitterApiInfo.cs +++ /dev/null @@ -1,27 +0,0 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2023 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - -namespace ASC.Thrdparty.Twitter -{ - public class TwitterApiInfo - { - public string AccessToken { get; set; } - public string AccessTokenSecret { get; set; } - public string ConsumerKey { get; set; } - public string ConsumerSecret { get; set; } - } -} diff --git a/module/ASC.Thrdparty/ASC.Thrdparty/Twitter/TwitterDataProvider.cs b/module/ASC.Thrdparty/ASC.Thrdparty/Twitter/TwitterDataProvider.cs deleted file mode 100644 index b2301acd1..000000000 --- a/module/ASC.Thrdparty/ASC.Thrdparty/Twitter/TwitterDataProvider.cs +++ /dev/null @@ -1,139 +0,0 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2023 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - -using System; -using System.Collections.Generic; -using System.Globalization; -using System.Linq; -using System.Text.RegularExpressions; - -using Tweetinvi; -using Tweetinvi.Models; -using Tweetinvi.Parameters; - -namespace ASC.Thrdparty.Twitter -{ - /// - /// Contains methods for getting data from Twitter - /// - public class TwitterDataProvider - { - public enum ImageSize - { - Small, - Original - } - - private TwitterClient _twitterClient; - - - /// - /// Costructor - /// - /// TwitterApiInfo object - public TwitterDataProvider(TwitterApiInfo apiInfo) - { - if (apiInfo == null) - throw new ArgumentNullException("apiInfo"); - - _twitterClient = new TwitterClient(apiInfo.ConsumerKey, apiInfo.ConsumerSecret, apiInfo.AccessToken, apiInfo.AccessTokenSecret); - } - - private static String ParseTweetTextIntoHtml(String text) - { - text = Regex.Replace(text, "(https?://([-\\w\\.]+)+(/([\\w/_\\.]*(\\?\\S+)?(#\\S+)?)?)?)", "$1"); - text = Regex.Replace(text, "@(\\w+)", "@$1"); - text = Regex.Replace(text, "\\s#(\\w+)", "#$1"); - - return text; - } - - /// - /// Gets tweets posted by specified user - /// - /// Message list - public List GetUserTweets(string screenName, int messageCount) - { - - var tweets = _twitterClient.Timelines.GetUserTimelineAsync(new GetUserTimelineParameters(screenName) - { - PageSize = messageCount - }).Result; - - return tweets.Select(x => (Message)new TwitterMessage - { - UserName = x.CreatedBy.Name, - PostedOn = x.CreatedAt.DateTime, - Source = SocialNetworks.Twitter, - Text = ParseTweetTextIntoHtml(x.Text), - UserImageUrl = x.CreatedBy.ProfileImageUrl, - UserId = x.Id.ToString() - }).Take(20).ToList(); - } - - /// - /// Gets last 20 users - /// - /// Search string - /// TwitterUserInfo list - public List FindUsers(string search) - { - var findedUsers = _twitterClient.Search.SearchUsersAsync(search).Result; - - return findedUsers.Select(x => new TwitterUserInfo - { - UserID = x.Id, - Description = x.Description, - ScreenName = x.ScreenName, - SmallImageUrl = x.ProfileImageUrl, - UserName = x.Name - }).Take(20).ToList(); - } - - /// - /// Gets url of User image - /// - /// Url of image or null if resource does not exist - public string GetUrlOfUserImage(string userScreenName, ImageSize imageSize) - { - var userInfo = _twitterClient.Users.GetUserAsync(userScreenName).Result; - - if (userInfo == null) return null; - - var profileImageUrl = userInfo.ProfileImageUrl; - - var size = GetTwitterImageSizeText(imageSize); - - if (size == "original") - profileImageUrl = profileImageUrl.Replace("_normal", String.Empty); - - return profileImageUrl; - } - - private static string GetTwitterImageSizeText(ImageSize imageSize) - { - var result = "original"; - - if (imageSize == ImageSize.Small) - { - result = "normal"; - } - - return result; - } - } -} \ No newline at end of file diff --git a/module/ASC.Thrdparty/ASC.Thrdparty/Twitter/TwitterUserInfo.cs b/module/ASC.Thrdparty/ASC.Thrdparty/Twitter/TwitterUserInfo.cs deleted file mode 100644 index 333442ec0..000000000 --- a/module/ASC.Thrdparty/ASC.Thrdparty/Twitter/TwitterUserInfo.cs +++ /dev/null @@ -1,37 +0,0 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2023 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - -namespace ASC.Thrdparty.Twitter -{ - public class TwitterUserInfo - { - ///1,1 - public decimal UserID { get; set; } - - ///Screen name - public string ScreenName { get; set; } - - ///User Name - public string UserName { get; set; } - - ///url to img - public string SmallImageUrl { get; set; } - - ///Description - public string Description { get; set; } - } -} diff --git a/module/ASC.Thrdparty/ASC.Thrdparty/app.config b/module/ASC.Thrdparty/ASC.Thrdparty/app.config deleted file mode 100644 index dc12e2573..000000000 --- a/module/ASC.Thrdparty/ASC.Thrdparty/app.config +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/module/ASC.WebDav/helper/logger.js b/module/ASC.WebDav/helper/logger.js index be55c5a9c..2f061763d 100644 --- a/module/ASC.WebDav/helper/logger.js +++ b/module/ASC.WebDav/helper/logger.js @@ -20,7 +20,7 @@ const { format } = require("winston"); require("winston-daily-rotate-file"); const path = require("path"); -const config = require(`../server/config.${process.argv[2]}.js`); +const config = require(`../server/config.js`); const fs = require("fs"); const logLevel = process.env.logLevel || config.logLevel || "info"; const fileName = config.logPath || path.join(__dirname, "..", "logs", "web.webdav.%DATE%.log"); diff --git a/module/ASC.WebDav/resource/customVirtualResource.js b/module/ASC.WebDav/resource/customVirtualResource.js index 047480a0d..54aaf9096 100644 --- a/module/ASC.WebDav/resource/customVirtualResource.js +++ b/module/ASC.WebDav/resource/customVirtualResource.js @@ -38,15 +38,13 @@ const { } = require('../server/requestAPI.js'); const { method, - maxChunkSize, + maxChunkSize, + maxExecutionTime, virtualPath } = require('../server/config.js'); const streamWrite = require('../helper/writable.js'); const SimpleStruct = require('./simpleStruct.js'); const parse = require('../helper/propertyParser.js'); -const { - maxExecutionTime -} = require('../server/config'); const { logMessage } = require('../helper/helper.js'); class CustomVirtualResources { diff --git a/module/ASC.WebDav/server/config.js b/module/ASC.WebDav/server/config.js index 83ae1f0d9..19802aaf9 100644 --- a/module/ASC.WebDav/server/config.js +++ b/module/ASC.WebDav/server/config.js @@ -17,7 +17,12 @@ /* Config */ -module.exports = { +const fs = require("fs"); +const path = require("path"); +const fileName = `config.${process.argv[2]}.js`; +const config = fs.existsSync(path.join(__dirname, fileName)) + ? require(`./${fileName}`) + : { // Port listener WebDav Server port: 1900, // Path to pfx key @@ -81,4 +86,6 @@ module.exports = { // Method to create session to edit existing file with multiple chunks editSession: "/edit_session" } -}; \ No newline at end of file +}; + +module.exports = config; \ No newline at end of file diff --git a/module/ASC.WebDav/server/webDavServer.js b/module/ASC.WebDav/server/webDavServer.js index c34fae2d7..898ec4be3 100644 --- a/module/ASC.WebDav/server/webDavServer.js +++ b/module/ASC.WebDav/server/webDavServer.js @@ -31,7 +31,7 @@ const { keyPath, isHttps, virtualPath -} = require(`./config.${process.argv[2]}.js`); +} = require(`./config.js`); const { logContext, logMessage } = require('../helper/helper.js'); diff --git a/web/core/ASC.Web.Core/Client/Bundling/GoogleCloudStorageTransform.cs b/web/core/ASC.Web.Core/Client/Bundling/GoogleCloudStorageTransform.cs index adabc2f50..5000d8ca1 100644 --- a/web/core/ASC.Web.Core/Client/Bundling/GoogleCloudStorageTransform.cs +++ b/web/core/ASC.Web.Core/Client/Bundling/GoogleCloudStorageTransform.cs @@ -206,7 +206,7 @@ private void UploadToCdn() UploadObjectOptions uploadObjectOptions = new UploadObjectOptions { - PredefinedAcl = PredefinedObjectAcl.PublicRead + PredefinedAcl = PredefinedObjectAcl.BucketOwnerFullControl }; inputStream.Position = 0; diff --git a/web/core/ASC.Web.Core/CookiesManager.cs b/web/core/ASC.Web.Core/CookiesManager.cs index 187a785ee..7361e2eef 100644 --- a/web/core/ASC.Web.Core/CookiesManager.cs +++ b/web/core/ASC.Web.Core/CookiesManager.cs @@ -123,11 +123,21 @@ public static void SetCookies(CookiesType type, string itemId, string value, str if (ClientSettings.SameSiteCookieEnabled) { + // SameSite is not support by Mono yet (https://github.com/mono/mono/issues/18711) + // HttpContext.Current.Response.Cookies[cookieName].SameSite = SameSiteMode.None; + var cookies = HttpContext.Current.Response.Cookies[cookieName]; - cookies.GetType() - .GetProperty("SameSite") - .SetValue(cookies, 0); + var property = cookies.GetType().GetProperty("SameSite"); + + if (property != null) + { + property.SetValue(cookies, 0); + } + else + { + cookies.Path = "/; SameSite=None"; + } } } } @@ -236,17 +246,17 @@ public static int GetLifeTime() public static void ResetUserCookie(Guid? userId = null) { - var currentUserId = SecurityContext.CurrentAccount.ID; + var targetUserId = userId ?? SecurityContext.CurrentAccount.ID; var tenant = TenantProvider.CurrentTenantID; - var settings = TenantCookieSettings.GetForUser(userId ?? currentUserId); + var settings = TenantCookieSettings.GetForUser(targetUserId); settings.Index = settings.Index + 1; - TenantCookieSettings.SetForUser(userId ?? currentUserId, settings); + TenantCookieSettings.SetForUser(targetUserId, settings); - DbLoginEventsManager.LogOutAllActiveConnections(tenant, userId ?? currentUserId); + DbLoginEventsManager.LogOutAllActiveConnections(tenant, targetUserId); - if (!userId.HasValue) + if (targetUserId == SecurityContext.CurrentAccount.ID) { - AuthenticateMeAndSetCookies(tenant, currentUserId, MessageAction.LoginSuccess); + AuthenticateMeAndSetCookies(tenant, targetUserId, MessageAction.LoginSuccess); } } diff --git a/web/core/ASC.Web.Core/Extensions/WebItemExtension.cs b/web/core/ASC.Web.Core/Extensions/WebItemExtension.cs index 7479b8ba9..c058caed4 100644 --- a/web/core/ASC.Web.Core/Extensions/WebItemExtension.cs +++ b/web/core/ASC.Web.Core/Extensions/WebItemExtension.cs @@ -20,6 +20,7 @@ using System.Linq; using ASC.Core; +using ASC.Web.Core.Utility; using ASC.Web.Core.Utility.Skins; namespace ASC.Web.Core @@ -78,8 +79,12 @@ public static string GetIconAbsoluteURL(this IWebItem item) public static string GetLargeIconAbsoluteURL(this IWebItem item) { - if (item == null || item.Context == null || String.IsNullOrEmpty(item.Context.LargeIconFileName)) return string.Empty; - return WebImageSupplier.GetAbsoluteWebPath(item.Context.LargeIconFileName, item.ID); + var theme = ModeThemeSettings.GetModeThemesSettings().ModeThemeName; + var fileName = theme == ModeTheme.dark ? item.Context.LargeIconFileNameDark : item.Context.LargeIconFileName; + + if (item == null || item.Context == null || string.IsNullOrEmpty(fileName)) return string.Empty; + + return WebImageSupplier.GetAbsoluteWebPath(fileName, item.ID); } public static List GetUserOpportunities(this IWebItem item) diff --git a/web/core/ASC.Web.Core/Files/DocumentService.cs b/web/core/ASC.Web.Core/Files/DocumentService.cs index 7f6044afa..a24efcfc5 100644 --- a/web/core/ASC.Web.Core/Files/DocumentService.cs +++ b/web/core/ASC.Web.Core/Files/DocumentService.cs @@ -88,6 +88,7 @@ public static string GenerateRevisionId(string expectedKey) /// Perform conversions asynchronously /// Secret key to generate the token /// Uri to the converted document + /// Extension of the converted file /// The percentage of completion of conversion /// /// string convertedDocumentUri; @@ -107,7 +108,8 @@ public static int GetConvertedUri( SpreadsheetLayout spreadsheetLayout, bool isAsync, string signatureSecret, - out string convertedDocumentUri) + out string convertedDocumentUri, + out string convertedFileType) { fromExtension = string.IsNullOrEmpty(fromExtension) ? Path.GetExtension(documentUri) : fromExtension; if (string.IsNullOrEmpty(fromExtension)) throw new ArgumentNullException("fromExtension", "Document's extension for conversion is not known"); @@ -222,7 +224,7 @@ public static int GetConvertedUri( response.Dispose(); } - return GetResponseUri(dataResponse, out convertedDocumentUri); + return GetResponseUri(dataResponse, out convertedDocumentUri, out convertedFileType); } /// @@ -858,8 +860,9 @@ public enum ErrorCode /// /// The resulting json from editing service /// Uri to the converted document + /// Extension of the converted file /// The percentage of completion of conversion - private static int GetResponseUri(string jsonDocumentResponse, out string responseUri) + private static int GetResponseUri(string jsonDocumentResponse, out string responseUri, out string responseType) { if (string.IsNullOrEmpty(jsonDocumentResponse)) throw new ArgumentException("Invalid param", "jsonDocumentResponse"); @@ -873,9 +876,11 @@ private static int GetResponseUri(string jsonDocumentResponse, out string respon int resultPercent; responseUri = string.Empty; + responseType = string.Empty; if (isEndConvert) { responseUri = responseFromService.Value("fileUrl"); + responseType = responseFromService.Value("fileType"); resultPercent = 100; } else diff --git a/web/core/ASC.Web.Core/Files/FileUtility.cs b/web/core/ASC.Web.Core/Files/FileUtility.cs index b65332dc6..ea8336080 100644 --- a/web/core/ASC.Web.Core/Files/FileUtility.cs +++ b/web/core/ASC.Web.Core/Files/FileUtility.cs @@ -57,6 +57,11 @@ public static string GetInternalExtension(string fileName) : extension; } + public static string GetInternalConvertExtension(string fileName) + { + return "ooxml"; + } + public static string GetGoogleDownloadableExtension(string googleExtension) { googleExtension = GetFileExtension(googleExtension); @@ -67,7 +72,8 @@ public static string GetGoogleDownloadableExtension(string googleExtension) public static string ReplaceFileExtension(string fileName, string newExtension) { newExtension = string.IsNullOrEmpty(newExtension) ? string.Empty : newExtension; - return Path.GetFileNameWithoutExtension(fileName) + newExtension; + return Path.GetFileNameWithoutExtension(fileName) + + "." + newExtension.TrimStart('.'); } public static FileType GetFileTypeByFileName(string fileName) @@ -315,6 +321,7 @@ public static List ExtsCoAuthoring ".xls", ".xlsx", ".xlsm", ".xlt", ".xltx", ".xltm", ".ods", ".fods", ".ots", ".csv", + ".sxc", ".et", ".ett", ".xlst", ".xlsy", ".xlsb", ".gsheet" }; @@ -325,6 +332,7 @@ public static List ExtsCoAuthoring ".ppt", ".pptx", ".pptm", ".pot", ".potx", ".potm", ".odp", ".fodp", ".otp", + ".dps", ".dpt", ".sxi", ".pptt", ".ppty", ".gslides" }; @@ -334,8 +342,9 @@ public static List ExtsCoAuthoring ".doc", ".docx", ".docm", ".dot", ".dotx", ".dotm", ".odt", ".fodt", ".ott", ".rtf", ".txt", - ".html", ".htm", ".mht", ".xml", + ".html", ".htm", ".mht", ".mhtml", ".xml", ".pdf", ".djvu", ".fb2", ".epub", ".xps", ".oxps", + ".sxw", ".stw", ".wps", ".wpt", ".doct", ".docy", ".gdoc", ".docxf", ".oform" diff --git a/web/core/ASC.Web.Core/Utility/ModeThemeSettings.cs b/web/core/ASC.Web.Core/Utility/ModeThemeSettings.cs index b6fd0daa1..712ecbd17 100644 --- a/web/core/ASC.Web.Core/Utility/ModeThemeSettings.cs +++ b/web/core/ASC.Web.Core/Utility/ModeThemeSettings.cs @@ -44,7 +44,7 @@ public override ISettings GetDefault() return new ModeThemeSettings { ModeThemeName = ModeTheme.light, - AutoDetect = false + AutoDetect = true }; } diff --git a/web/core/ASC.Web.Core/WebItemContext.cs b/web/core/ASC.Web.Core/WebItemContext.cs index 79b5a4f13..6cb183121 100644 --- a/web/core/ASC.Web.Core/WebItemContext.cs +++ b/web/core/ASC.Web.Core/WebItemContext.cs @@ -41,6 +41,7 @@ public class WebItemContext public string IconFileName { get; set; } public string LargeIconFileName { get; set; } + public string LargeIconFileNameDark { get; set; } public int DefaultSortOrder { get; set; } diff --git a/web/core/ASC.Web.Core/WhiteLabel/TenantWhiteLabelSettings.cs b/web/core/ASC.Web.Core/WhiteLabel/TenantWhiteLabelSettings.cs index bc844e069..49b2895b6 100644 --- a/web/core/ASC.Web.Core/WhiteLabel/TenantWhiteLabelSettings.cs +++ b/web/core/ASC.Web.Core/WhiteLabel/TenantWhiteLabelSettings.cs @@ -663,13 +663,18 @@ public static void Apply(int tenantId) if (!AppliedTenants.Contains(tenantId)) AppliedTenants.Add(tenantId); } + public void ClearAppliedTenants() + { + AppliedTenants.Clear(); + } + public void Save(int tenantId, bool restore = false) { SaveForTenant(tenantId); if (tenantId == Tenant.DEFAULT_TENANT) { - AppliedTenants.Clear(); + ClearAppliedTenants(); } else { diff --git a/web/studio/ASC.Web.Studio/ASC.Web.Studio.csproj b/web/studio/ASC.Web.Studio/ASC.Web.Studio.csproj index 900bcd641..8eccb1721 100644 --- a/web/studio/ASC.Web.Studio/ASC.Web.Studio.csproj +++ b/web/studio/ASC.Web.Studio/ASC.Web.Studio.csproj @@ -1283,8 +1283,13 @@ + + + + + @@ -1293,18 +1298,31 @@ + + + + + + + + + + + + + @@ -1316,14 +1334,22 @@ + + + + + + + + @@ -1335,12 +1361,17 @@ + + + + + @@ -1356,6 +1387,7 @@ + @@ -1363,6 +1395,7 @@ + @@ -1380,10 +1413,16 @@ + + + + + + @@ -1394,6 +1433,7 @@ + @@ -1531,12 +1571,25 @@ + + + + + + + + + + + + + @@ -1544,20 +1597,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + @@ -1917,6 +1995,7 @@ + @@ -2214,6 +2293,8 @@ + + @@ -2221,6 +2302,7 @@ + @@ -2641,7 +2723,6 @@ - @@ -2678,6 +2759,7 @@ + Designer @@ -4169,7 +4251,6 @@ - @@ -4401,10 +4482,6 @@ {481b0d9c-b2f8-4de9-8597-ba8d24585099} ASC.FederatedLogin - - {592eac85-6cfc-4ad7-b653-3eadaa18327e} - ASC.Thrdparty - {988536c1-4b89-4649-8f77-5c16f55d95d1} ASC.VoipService diff --git a/web/studio/ASC.Web.Studio/Core/EmailOperationService.cs b/web/studio/ASC.Web.Studio/Core/EmailOperationService.cs index c740cd613..5766333a8 100644 --- a/web/studio/ASC.Web.Studio/Core/EmailOperationService.cs +++ b/web/studio/ASC.Web.Studio/Core/EmailOperationService.cs @@ -23,6 +23,7 @@ using ASC.Core; using ASC.Core.Users; using ASC.MessagingSystem; +using ASC.Web.Core; using ASC.Web.Studio.Core.Notify; using ASC.Web.Studio.Core.Users; using ASC.Web.Studio.PublicResources; @@ -87,38 +88,45 @@ public string SendEmailActivationInstructions(Guid userID, string email) if (userID == Guid.Empty) throw new ArgumentNullException("userID"); email = (email ?? "").Trim(); - if (String.IsNullOrEmpty(email)) throw new ArgumentNullException(Resource.ErrorEmailEmpty); + if (string.IsNullOrEmpty(email)) throw new ArgumentNullException(Resource.ErrorEmailEmpty); if (!email.TestEmailRegex()) throw new InvalidEmailException(Resource.ErrorNotCorrectEmail); try { var viewer = CoreContext.UserManager.GetUsers(SecurityContext.CurrentAccount.ID); + var viewerIsAdmin = WebItemSecurity.IsProductAdministrator(WebItemManager.PeopleProductID, SecurityContext.CurrentAccount.ID); + var user = CoreContext.UserManager.GetUsers(userID); - if (user == null) throw new UserNotFoundException(Resource.ErrorUserNotFound); + if (CoreContext.UserManager.IsSystemUser(user.ID)) + throw new UserNotFoundException(Resource.ErrorUserNotFound); - if (viewer == null) throw new AccessDeniedException(Resource.ErrorAccessDenied); + if (!viewerIsAdmin && viewer.ID != user.ID) + throw new AccessDeniedException(Resource.ErrorAccessDenied); - if (viewer.IsAdmin() || viewer.ID == user.ID) - { - var existentUser = CoreContext.UserManager.GetUserByEmail(email); - if (existentUser.ID != ASC.Core.Users.Constants.LostUser.ID && existentUser.ID != userID) - throw new InputException(CustomNamingPeople.Substitute("ErrorEmailAlreadyExists")); + if (user.IsOwner() && viewer.ID != user.ID && email != user.Email) + throw new AccessDeniedException(Resource.ErrorAccessDenied); - user.Email = email; - if (user.ActivationStatus == EmployeeActivationStatus.Activated) - { - user.ActivationStatus = EmployeeActivationStatus.NotActivated; - } - if (user.ActivationStatus == (EmployeeActivationStatus.AutoGenerated | EmployeeActivationStatus.Activated)) - { - user.ActivationStatus = EmployeeActivationStatus.AutoGenerated; - } - CoreContext.UserManager.SaveUserInfo(user, syncCardDav: true); + var existentUser = CoreContext.UserManager.GetUserByEmail(email); + if (existentUser.ID != Constants.LostUser.ID && existentUser.ID != user.ID) + throw new InputException(CustomNamingPeople.Substitute("ErrorEmailAlreadyExists")); + + var emailChanged = email != user.Email; + + user.Email = email; + if (user.ActivationStatus == EmployeeActivationStatus.Activated) + { + user.ActivationStatus = EmployeeActivationStatus.NotActivated; } - else + if (user.ActivationStatus == (EmployeeActivationStatus.AutoGenerated | EmployeeActivationStatus.Activated)) { - email = user.Email; + user.ActivationStatus = EmployeeActivationStatus.AutoGenerated; + } + CoreContext.UserManager.SaveUserInfo(user, syncCardDav: true); + + if (emailChanged) + { + CookiesManager.ResetUserCookie(user.ID); } if (user.ActivationStatus == EmployeeActivationStatus.Pending && !user.IsLDAP()) @@ -176,19 +184,24 @@ public string SendEmailChangeInstructions(Guid userID, string email) try { var viewer = CoreContext.UserManager.GetUsers(SecurityContext.CurrentAccount.ID); + var viewerIsAdmin = WebItemSecurity.IsProductAdministrator(WebItemManager.PeopleProductID, SecurityContext.CurrentAccount.ID); + var user = CoreContext.UserManager.GetUsers(userID); - if (user == null) + if (CoreContext.UserManager.IsSystemUser(user.ID)) throw new UserNotFoundException(Resource.ErrorUserNotFound); - if (viewer == null || (user.IsOwner() && viewer.ID != user.ID)) + if (!viewerIsAdmin && viewer.ID != user.ID) + throw new AccessDeniedException(Resource.ErrorAccessDenied); + + if (user.IsOwner() && viewer.ID != user.ID) throw new AccessDeniedException(Resource.ErrorAccessDenied); var existentUser = CoreContext.UserManager.GetUserByEmail(email); - if (existentUser.ID != ASC.Core.Users.Constants.LostUser.ID) + if (existentUser.ID != Constants.LostUser.ID) throw new InputException(CustomNamingPeople.Substitute("ErrorEmailAlreadyExists")); - if (!viewer.IsAdmin()) + if (!viewerIsAdmin) { StudioNotifyService.Instance.SendEmailChangeInstructions(user, email); MessageService.Send(HttpContext.Current.Request, MessageAction.UserSentEmailChangeInstructions, user.DisplayUserName(false)); @@ -209,6 +222,9 @@ public string SendEmailChangeInstructions(Guid userID, string email) } CoreContext.UserManager.SaveUserInfo(user, syncCardDav: true); + + CookiesManager.ResetUserCookie(user.ID); + StudioNotifyService.Instance.SendEmailActivationInstructions(user, email); MessageService.Send(HttpContext.Current.Request, MessageAction.UserSentActivationInstructions, user.DisplayUserName(false)); } diff --git a/web/studio/ASC.Web.Studio/Default.aspx b/web/studio/ASC.Web.Studio/Default.aspx index d5e5daa3b..cf8f6ac43 100644 --- a/web/studio/ASC.Web.Studio/Default.aspx +++ b/web/studio/ASC.Web.Studio/Default.aspx @@ -39,7 +39,7 @@ <% if (TenantExtra.EnableControlPanel) { %> - <%= Resource.ControlPanelLabel %>" /> + <%= Resource.ControlPanelLabel %>" /> <%= Resource.ControlPanelLabel %> diff --git a/web/studio/ASC.Web.Studio/Default.aspx.cs b/web/studio/ASC.Web.Studio/Default.aspx.cs index b29a95525..3b54ff694 100644 --- a/web/studio/ASC.Web.Studio/Default.aspx.cs +++ b/web/studio/ASC.Web.Studio/Default.aspx.cs @@ -25,6 +25,8 @@ using ASC.Core.Users; using ASC.Web.Core; using ASC.Web.Core.Files; +using ASC.Web.Core.Utility; +using ASC.Web.Core.Utility.Skins; using ASC.Web.Studio.Core; using ASC.Web.Studio.PublicResources; using ASC.Web.Studio.UserControls.EmptyScreens; @@ -56,13 +58,23 @@ protected override void OnPreInit(EventArgs e) protected int ProductsCount { get; set; } protected string ResetCacheKey; + protected string ControlPanelImg; protected void Page_Load(object sender, EventArgs e) { CurrentUser = CoreContext.UserManager.GetUsers(SecurityContext.CurrentAccount.ID); - Page.RegisterStyle("~/skins/page_default.less"); - + if (ModeThemeSettings.GetModeThemesSettings().ModeThemeName == ModeTheme.dark) + { + Page.RegisterStyle("~/skins/page_default_dark.less"); + ControlPanelImg = WebImageSupplier.GetAbsoluteWebPath("icon-controlpanel-dark.svg"); + } + else + { + Page.RegisterStyle("~/skins/page_default.less"); + ControlPanelImg = WebImageSupplier.GetAbsoluteWebPath("icon-controlpanel.svg"); + } + var defaultPageSettings = StudioDefaultPageSettings.Load() ?? (StudioDefaultPageSettings)new StudioDefaultPageSettings().GetDefault(); var isDesktop = Request.DesktopApp(); var defaultProductID = isDesktop ? WebItemManager.DocumentsProductID : defaultPageSettings.DefaultProductID; diff --git a/web/studio/ASC.Web.Studio/Global.asax.cs b/web/studio/ASC.Web.Studio/Global.asax.cs index f91a0832b..fd0417a57 100644 --- a/web/studio/ASC.Web.Studio/Global.asax.cs +++ b/web/studio/ASC.Web.Studio/Global.asax.cs @@ -191,8 +191,19 @@ public static bool Authenticate() if (!authenticated) { - Auth.ProcessLogout(); - return false; + var comebackAuthCookies = CookiesManager.GetCookies(CookiesType.ComebackAuthKey); + + if (!string.IsNullOrEmpty(comebackAuthCookies) && SecurityContext.AuthenticateMe(comebackAuthCookies)) + { + CookiesManager.SetCookies(CookiesType.AuthKey, comebackAuthCookies); + CookiesManager.ClearCookies(CookiesType.ComebackAuthKey); + authenticated = true; + } + else + { + Auth.ProcessLogout(); + return false; + } } } } diff --git a/web/studio/ASC.Web.Studio/HttpHandlers/FCKEditorFileUploadHandler.cs b/web/studio/ASC.Web.Studio/HttpHandlers/FCKEditorFileUploadHandler.cs index 050109ae7..3d8367281 100644 --- a/web/studio/ASC.Web.Studio/HttpHandlers/FCKEditorFileUploadHandler.cs +++ b/web/studio/ASC.Web.Studio/HttpHandlers/FCKEditorFileUploadHandler.cs @@ -16,10 +16,10 @@ using System; -using System.Text.RegularExpressions; using System.Web; using ASC.Common.Web; +using ASC.Core; using ASC.Data.Storage; using ASC.Web.Core.Files; using ASC.Web.Studio.Core; @@ -34,6 +34,11 @@ public override void OnProcessRequest(HttpContext context) { try { + if (!SecurityContext.IsAuthenticated) + { + throw new HttpException(403, "Access denied."); + } + var storeDomain = context.Request["esid"]; var itemID = context.Request["iid"] ?? ""; var file = context.Request.Files["upload"]; diff --git a/web/studio/ASC.Web.Studio/HttpHandlers/UrlProxyHandler.cs b/web/studio/ASC.Web.Studio/HttpHandlers/UrlProxyHandler.cs index 86b50d1a3..d690b42f6 100644 --- a/web/studio/ASC.Web.Studio/HttpHandlers/UrlProxyHandler.cs +++ b/web/studio/ASC.Web.Studio/HttpHandlers/UrlProxyHandler.cs @@ -23,7 +23,8 @@ using ASC.Common.Logging; using ASC.Core; - +using ASC.Web.Studio.Core; + namespace ASC.Web.Studio.HttpHandlers { public class UrlProxyHandler : IHttpHandler @@ -42,7 +43,7 @@ public void ProcessRequest(HttpContext context) try { - if (!SecurityContext.IsAuthenticated) + if (!SecurityContext.IsAuthenticated || !SetupInfo.IsVisibleSettings("ProxyHttpContent")) throw new HttpException(403, "Access denied."); var url = context.Request.QueryString["url"]; diff --git a/web/studio/ASC.Web.Studio/Products/CRM/ASC.Web.CRM.csproj b/web/studio/ASC.Web.Studio/Products/CRM/ASC.Web.CRM.csproj index 3e3ff72f7..2e671d1f4 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/ASC.Web.CRM.csproj +++ b/web/studio/ASC.Web.Studio/Products/CRM/ASC.Web.CRM.csproj @@ -64,7 +64,6 @@ - @@ -369,9 +368,6 @@ - - - @@ -597,17 +593,18 @@ + - + @@ -623,9 +620,10 @@ + + - @@ -1232,85 +1230,6 @@ True CRMSettingResource.resx - - CRMSocialMediaResource.resx - - - CRMSocialMediaResource.resx - - - CRMSocialMediaResource.resx - - - CRMSocialMediaResource.resx - - - CRMSocialMediaResource.resx - - - CRMSocialMediaResource.resx - - - CRMSocialMediaResource.resx - - - CRMSocialMediaResource.resx - - - CRMSocialMediaResource.resx - - - CRMSocialMediaResource.resx - - - CRMSocialMediaResource.resx - - - CRMSocialMediaResource.resx - - - CRMSocialMediaResource.resx - - - CRMSocialMediaResource.resx - - - CRMSocialMediaResource.resx - - - CRMSocialMediaResource.resx - - - Designer - PublicResXFileCodeGenerator - CRMSocialMediaResource.Designer.cs - - - CRMSocialMediaResource.resx - - - CRMSocialMediaResource.resx - - - CRMSocialMediaResource.resx - - - CRMSocialMediaResource.resx - - - CRMSocialMediaResource.resx - - - CRMSocialMediaResource.resx - - - CRMSocialMediaResource.resx - - - True - True - CRMSocialMediaResource.resx - CRMTaskResource.resx @@ -1668,48 +1587,6 @@ CRMDealResource.resx - - CRMSocialMediaResource.resx - - - CRMSocialMediaResource.resx - - - CRMSocialMediaResource.resx - - - CRMSocialMediaResource.resx - - - CRMSocialMediaResource.resx - - - CRMSocialMediaResource.resx - - - CRMSocialMediaResource.resx - - - CRMSocialMediaResource.resx - - - CRMSocialMediaResource.resx - - - CRMSocialMediaResource.resx - - - CRMSocialMediaResource.resx - - - CRMSocialMediaResource.resx - - - CRMSocialMediaResource.resx - - - CRMSocialMediaResource.resx - CRMSettingResource.resx @@ -2245,7 +2122,6 @@ - @@ -2272,9 +2148,6 @@ - - - @@ -2322,10 +2195,6 @@ {481B0D9C-B2F8-4DE9-8597-BA8D24585099} ASC.FederatedLogin - - {592eac85-6cfc-4ad7-b653-3eadaa18327e} - ASC.Thrdparty - {988536c1-4b89-4649-8f77-5c16f55d95d1} ASC.VoipService diff --git a/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/dark/dark-params.less b/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/dark/dark-params.less index 4c211ff63..b5ac7dd22 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/dark/dark-params.less +++ b/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/dark/dark-params.less @@ -53,6 +53,7 @@ @ui-autocomplete-a-col: rgba(255, 255, 255, 0.92); @invoice-icon-search-bg: #292929; @option-button-col: #BDBDBD; -@option-button-bor: #BDBDBD; -@contact-photo-bor: #474747; -@change-status-button-bg: #474747; \ No newline at end of file +@option-button-bor: #BDBDBD; +@contact-photo-bor: #474747; +@change-status-button-bg: #474747; +@icons-png: "icons-dark.svg"; \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/css/common.less b/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/css/common.less index 6d2e0cec8..f1260f8fe 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/css/common.less +++ b/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/css/common.less @@ -76,12 +76,12 @@ textarea { } -.crm-deleteLink{ - background: url("../images/icons.png") 0 -263px no-repeat transparent; +.crm-deleteLink { + background: url("../images/@{icons-png}") 0 -263px no-repeat transparent; .crm-actionLinkBase; } .crm-editLink{ - background: url("../images/icons.png") 0 -240px no-repeat transparent; + background: url("../images/@{icons-png}") 0 -240px no-repeat transparent; .crm-actionLinkBase; } .crm-addNewLink { @@ -105,13 +105,13 @@ textarea { } } -.crm-acceptLink{ - background: url("../images/icons.png") 0 -43px no-repeat transparent; +.crm-acceptLink { + background: url("../images/@{icons-png}") 0 -43px no-repeat transparent; .crm-actionLinkBase; } -.crm-rejectLink{ - background: url("../images/icons.png") 0 -21px no-repeat transparent; +.crm-rejectLink { + background: url("../images/@{icons-png}") 0 -21px no-repeat transparent; .crm-actionLinkBase; } .crm-removeLink{ @@ -141,15 +141,15 @@ textarea { position: relative; } .crm-email:after { - background: url("../images/icons.png") 0 -476px no-repeat transparent; + background: url("../images/@{icons-png}") 0 -476px no-repeat transparent; .crm-img-pseudo-base(2px); } .crm-phone:after { - background: url("../images/icons.png") 0 -458px no-repeat transparent; + background: url("../images/@{icons-png}") 0 -458px no-repeat transparent; .crm-img-pseudo-base(2px); } .crm-address:after { - background: url("../images/icons.png") 0 -438px no-repeat transparent; + background: url("../images/@{icons-png}") 0 -438px no-repeat transparent; .crm-img-pseudo-base; } .crm-email a { @@ -209,8 +209,8 @@ select.disabled { background-color: #EFEFEF; color: #666562; } -.crm-private-lock{ - background: url("../images/icons.png") 1px -159px no-repeat transparent; +.crm-private-lock { + background: url("../images/@{icons-png}") 1px -159px no-repeat transparent; display: inline-block; height: 16px; margin-top: -4px; @@ -362,7 +362,7 @@ a.attachLink, a.attachLink:active, a.attachLink:hover, a.attachLink:visited{ position: relative; margin: 3px 4px 3px 20px; &:after { - background: url( "../images/icons.png" ) 0 -415px no-repeat; + background: url( "../images/@{icons-png}" ) 0 -415px no-repeat; margin-top: -8px; margin-left: -30px; .crm-img-pseudo-base(50%, 10px); @@ -412,7 +412,7 @@ a.attachLink, a.attachLink:active, a.attachLink:hover, a.attachLink:visited{ float:left; } .mainContainerClass .containerHeaderBlock .privateMark { - background: url("../images/icons.png") 0 -183px no-repeat transparent; + background: url("../images/@{icons-png}") 0 -183px no-repeat transparent; width: 24px; height: 24px; } @@ -645,7 +645,7 @@ Navigation panel with page navigator File Uploader css style *******************************************************************************/ .pm_deleteLinkCSSClass { - background:url("../images/icons.png") 0 -603px no-repeat transparent; + background:url("../images/@{icons-png}") 0 -603px no-repeat transparent; .crm-actionLinkBase; text-decoration:none !important; } @@ -656,7 +656,7 @@ File Uploader css style text-decoration:none !important; } .pm_completeCSSClass { - background:url("../images/icons.png") 0 -63px no-repeat transparent; + background:url("../images/@{icons-png}") 0 -63px no-repeat transparent; .crm-actionLinkBase(16px); cursor:default; margin-top:2px; @@ -671,10 +671,10 @@ File Uploader css style } .pm_overAllProcessBarCssClass div { height:8px; - background:url("../images/icons.png") 0 -698px repeat-x !important; + background:url("../images/@{icons-png}") 0 -698px repeat-x !important; } .pm_uploadIcon { - background: url(../images/icons.png) 0 -653px no-repeat transparent; + background: url("../images/@{icons-png}") 0 -653px no-repeat transparent; height: 32px; width: 32px; } @@ -863,7 +863,7 @@ label.event_category { } label.event_attached_file { - background: url("../images/icons.png") no-repeat scroll 0 -415px rgba(0, 0, 0, 0); + background: url("../images/@{icons-png}") no-repeat scroll 0 -415px rgba(0, 0, 0, 0); content: " "; display: inline-block; height: 16px; @@ -1020,7 +1020,7 @@ ContactSelector.ascx } label.crossButton { - background: url("../images/icons.png") 0 -718px no-repeat transparent; + background: url("../images/@{icons-png}") 0 -718px no-repeat transparent; .crm-actionLinkBase; } @@ -1351,7 +1351,7 @@ Import From CSV position: relative; &:after { - background: url("../images/icons.png") 0 -288px no-repeat transparent; + background: url("../images/@{icons-png}") 0 -288px no-repeat transparent; .crm-img-pseudo-base(50%, -16px, 14px, 14px); margin-top: -7px; } diff --git a/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/css/contacts.less b/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/css/contacts.less index 022f48646..eb78ac79b 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/css/contacts.less +++ b/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/css/contacts.less @@ -45,7 +45,7 @@ sliders } .ui-slider .ui-slider-handle{ background-color: #dedede; - background: url( "../images/icons.png" ) -1px -500px no-repeat transparent; + background: url( "../images/@{icons-png}" ) -1px -500px no-repeat transparent; border: 1px solid #aaaaaa; cursor: pointer; margin-left: -0.4em; @@ -218,7 +218,7 @@ ListContactView.ascx margin-left: 4px; &.sharedContact:after { - background: url( "../images/icons.png") 0 -768px no-repeat transparent; + background: url( "../images/@{icons-png}") 0 -768px no-repeat transparent; .crm-img-pseudo-base(auto, -2px, 12px, 12px); bottom: -2px; } @@ -284,7 +284,7 @@ body.media-width-min { } } #previewAttachments label.previewAttachment{ - background: url( "../images/icons.png" ) 0 -415px no-repeat; + background: url( "../images/@{icons-png}" ) 0 -415px no-repeat; display: inline-block; height: 16px; width: 16px; @@ -510,7 +510,7 @@ ContactActionView.ascx } .is_primary { - background-image: url( "../images/icons.png"); + background-image: url( "../images/@{icons-png}"); background-repeat: no-repeat; background-color: transparent; cursor: pointer; @@ -600,7 +600,7 @@ ContactActionView.ascx position: relative; &.sharedContact:after { - background: url( "../images/icons.png") 0 -783px no-repeat transparent; + background: url( "../images/@{icons-png}") 0 -783px no-repeat transparent; .crm-img-pseudo-base(auto, 8px, 22px, 22px); bottom: 8px; } @@ -656,7 +656,7 @@ body.media-width-min { #companySelectorsContainer { .delete_company_for_person { - background: url("../images/icons.png") 0 -263px no-repeat transparent; + background: url("../images/@{icons-png}") 0 -263px no-repeat transparent; cursor: pointer; display: inline-block; height: 16px; @@ -820,25 +820,57 @@ HistoryView.ascx } /******************************************************************************** -SocialMedia +Page Navigation +********************************************************************************/ +#contactsFilterContainer, #tableForContactNavigation { + display: none; +} + +/******************************************************************************** +Contact Photo (ContactDetailsView, ContactActionView) ********************************************************************************/ +#divLoadPhotoWindow h4 { + margin-bottom: 5px; +} + +#divLoadPhotoFromPC { + .fileUploadDscr { + margin-left: 12px; + } -.sm_UserSearchView_ErrorDescription{ - margin-left: 0px !important; - margin-right: 0px !important; + .fileUploadError { + color: #CC0000; + display: none; + font: 12px Tahoma; + margin-left: 12px; + } } -.select-container{ - position:relative; + +#divLoadPhotoDefault { + margin-top: 10px; } -.select-container.type-select-container{ - min-width:180px; + +.ImageHolderOuter { + display: inline-block; + width: 54px; + height: 54px; + margin-right: 10px; + margin-bottom: 10px; + vertical-align: top; + cursor: pointer; + border: 1px solid @text-color; + + img { + padding: 2px; + + &:hover { + border: 2px solid #1A6DB3 !important; + padding: 0px; + } + } } -.select-container.tags-select-container{ - min-width:160px; + +.AvatarImage { + width: 50px; + height: 50px; } -/******************************************************************************** -Page Navigation -********************************************************************************/ -#contactsFilterContainer, #tableForContactNavigation { - display: none; -} \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/css/crm.less b/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/css/crm.less index 024e5c35a..58a25d053 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/css/crm.less +++ b/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/css/crm.less @@ -22,7 +22,6 @@ @import "contacts.less"; @import "deals.less"; @import "invoices.less"; -@import "socialmedia.less"; @import "settings.less"; @import "voip.common.less"; @import "voip.quick.less"; diff --git a/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/css/invoices.less b/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/css/invoices.less index b41666c33..f0332d13a 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/css/invoices.less +++ b/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/css/invoices.less @@ -620,7 +620,7 @@ ListActionView.ascx } &.serch { - background: url("../images/icons.png") no-repeat scroll -1px -390px @invoice-icon-search-bg; + background: url("../images/@{icons-png}") no-repeat scroll -1px -390px @invoice-icon-search-bg; } } } diff --git a/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/css/params.less b/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/css/params.less index 0768caf5e..0960d8346 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/css/params.less +++ b/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/css/params.less @@ -53,6 +53,7 @@ @ui-autocomplete-a-col: black; @invoice-icon-search-bg: #FFFFFF; @option-button-col: #272727; -@option-button-bor: #8E908F; -@contact-photo-bor: #BFBFBF; -@change-status-button-bg: #eaeaea; \ No newline at end of file +@option-button-bor: #8E908F; +@contact-photo-bor: #BFBFBF; +@change-status-button-bg: #eaeaea; +@icons-png: "icons.png"; \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/css/settings.less b/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/css/settings.less index a2ac5aade..efdf1816b 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/css/settings.less +++ b/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/css/settings.less @@ -243,7 +243,7 @@ margin: 10px 0 0 0; label.deleteBtn { - background: url("../images/icons.png") 0 -263px no-repeat transparent; + background: url("../images/@{icons-png}") 0 -263px no-repeat transparent; cursor: pointer; display: inline-block; height: 16px; @@ -415,11 +415,11 @@ } .headerCollapse { - background: url("../images/icons.png") 0 -103px no-repeat transparent; + background: url("../images/@{icons-png}") 0 -103px no-repeat transparent; } .headerExpand { - background: url("../images/icons.png") 0 -131px no-repeat transparent; + background: url("../images/@{icons-png}") 0 -131px no-repeat transparent; } li, li:hover { @@ -523,7 +523,7 @@ td.digits { background-color: #FEECD6; } #properties_webFormKey .refreshBtn { - background: url("../images/icons.png") 0 -743px no-repeat transparent; + background: url("../images/@{icons-png}") 0 -743px no-repeat transparent; cursor: pointer; display: inline-block; margin-left: 5px; diff --git a/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/css/socialmedia.less b/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/css/socialmedia.less deleted file mode 100644 index 7712f000e..000000000 --- a/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/css/socialmedia.less +++ /dev/null @@ -1,193 +0,0 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2023 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - -@import "params.less"; -@import "base.less"; -/* List Facebook UserInfo, List Twitter UserInfo */ -#sm_tbl_UserList { - border-collapse: collapse; - padding: 0px; - width: 100%; - - .sm_tbl_UserList_clmnAvatar { - width: 50px; - text-align: center; - padding: 5px 0; - } - - .sm_tbl_UserList_clmnUserName { - padding: 5px 0 5px 10px; - } - - .sm_tbl_UserList_clmnBtRelate { - width: 80px; - padding: 5px 5px 5px 10px; - } - - .sm_tbl_UserList_NotFound { - text-align: center; - margin: 10px; - } -} - - - - - -.sm_message_line { - border-top: 1px solid @border-color; - padding: 5px 0; -} -.sn_userName { - color: Black !important; -} -.sn_user_icon { - float: left; - margin: 0 15px; - width: 34px; -} -.sn_message_icon { - float: left; - text-align: center; - width: 30px; -} -.sn_message_block { - float: left; - width: 90%; -} -.sn_message_text { - margin: 2px 0; -} -.sn_small_img { - float: left; - margin-right: 10px; -} -.sm_messagesList_ErrorDescription { - margin-left: 0 !important; - margin-right: 0 !important; -} - - -/* ContactDetailsView - Window with user avatars*/ -#divLoadPhotoFromSocialMedia { - width: 100%; - height: 50px; - margin-top: -16px; -} -#divLoadPhotoWindow h4 { - margin-bottom: 5px; -} - -#divLoadPhotoFromPC { - .fileUploadDscr { - margin-left: 12px; - } - - .fileUploadError { - color: #CC0000; - display: none; - font: 12px Tahoma; - margin-left: 12px; - } -} - -#divImagesHolder { - width: 100%; - height: 70px; - overflow: auto; - display: none; - - > div.describe-text { - margin-top: 4px; - } -} - -#divLoadPhotoDefault { - margin-top: 10px; -} - -#divAjaxImageContainerPhotoLoad { - margin-left: 220px; - display: none; - position: absolute; - top: 185px; -} - -.ImageHolderOuter { - display: inline-block; - width: 54px; - height: 54px; - margin-right: 10px; - margin-bottom: 10px; - vertical-align: top; - cursor: pointer; - border: 1px solid @text-color; - - img { - padding: 2px; - - &:hover { - border: 2px solid #1A6DB3 !important; - padding: 0px; - } - } -} - -.AvatarImage { - width: 50px; - height: 50px; -} -/* ContactActionView */ - -#divSMProfilesWindow { - display: none; - width: 420px; - background-color: @defaultBgColor; - .borderRadius(10px); - - .cancel_cross { - background: url("../images/icons.png") 0 -718px no-repeat transparent; - cursor: pointer; - display: inline-block; - height: 16px; - right: -5px; - top: -5px; - width: 16px; - position: absolute; - } - .divNoProfiles { - display: none; - text-align: center; - vertical-align: middle; - } - .divWait { - text-align: center; - display: none; - } - .divHeader { - margin: 15px; - text-align: center; - position: relative; - } - - .divSMProfilesWindowBody { - margin: 10px; - max-height: 200px; - min-height: 30px; - overflow: auto; - } -} \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/css/tasks.less b/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/css/tasks.less index 7defae4fa..138288e65 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/css/tasks.less +++ b/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/css/tasks.less @@ -90,7 +90,7 @@ taskStatusesMenu *******************************************************************************/ #taskStatusListContainer li .dropdown-item { - background-image: url("../images/icons.png"); + background-image: url("../images/@{icons-png}"); background-repeat: no-repeat; padding-left: 30px; } @@ -102,10 +102,10 @@ taskStatusesMenu } #taskTable .changeStatusCombobox .open, #taskTable .changeStatusCombobox .overdue { - background: url("../images/icons.png") 0 -518px no-repeat transparent; + background: url("../images/@{icons-png}") 0 -518px no-repeat transparent; } #taskTable .changeStatusCombobox .closed { - background: url("../images/icons.png") 0 -536px no-repeat transparent; + background: url("../images/@{icons-png}") 0 -536px no-repeat transparent; } #taskTable { diff --git a/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/empty_screen_twitter.svg b/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/empty_screen_twitter.svg deleted file mode 100644 index c747c24e3..000000000 --- a/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/empty_screen_twitter.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/icons-dark.svg b/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/icons-dark.svg new file mode 100644 index 000000000..a454d78c6 --- /dev/null +++ b/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/icons-dark.svg @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/product_logolarge_dark.svg b/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/product_logolarge_dark.svg new file mode 100644 index 000000000..a07acefc5 --- /dev/null +++ b/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/product_logolarge_dark.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/twitter.png b/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/twitter.png deleted file mode 100644 index 0fb7f615e..000000000 Binary files a/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/twitter.png and /dev/null differ diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Classes/ContactPhotoManager.cs b/web/studio/ASC.Web.Studio/Products/CRM/Classes/ContactPhotoManager.cs index 3dbf39291..0a3cb5d60 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Classes/ContactPhotoManager.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Classes/ContactPhotoManager.cs @@ -27,16 +27,20 @@ using ASC.Common.Caching; using ASC.Common.Logging; using ASC.Common.Threading.Workers; +using ASC.Core; using ASC.Data.Storage; using ASC.Web.Core; using ASC.Web.Core.Utility.Skins; using ASC.Web.CRM.Configuration; using ASC.Web.CRM.Resources; +using ASC.Web.Studio.Utility; namespace ASC.Web.CRM.Classes { public class ResizeWorkerItem { + public int TenantId { get; set; } + public int ContactID { get; set; } public bool UploadOnly { get; set; } @@ -281,6 +285,8 @@ private static String BuildFileTmpPath(int contactID, Size photoSize, String ima private static void ExecResizeImage(ResizeWorkerItem resizeWorkerItem) { + CoreContext.TenantManager.SetCurrentTenant(resizeWorkerItem.TenantId); + foreach (var fotoSize in resizeWorkerItem.RequireFotoSize) { var data = resizeWorkerItem.ImageData; @@ -417,7 +423,7 @@ public static void TryUploadPhotoFromTmp(int contactID, bool isNewContact, strin foreach (var photoSize in new[] { _bigSize, _mediumSize, _smallSize }) { var photoTmpPath = FromDataStoreRelative(isNewContact ? 0 : contactID, photoSize, true, tmpDirName); - if (string.IsNullOrEmpty(photoTmpPath)) throw new Exception("Temp phono not found"); + if (string.IsNullOrEmpty(photoTmpPath)) throw new Exception("Temp photo not found"); var imageExtension = Path.GetExtension(photoTmpPath); @@ -481,6 +487,7 @@ private static PhotoData ResizeToBigSize(byte[] imageData, int contactID, bool u { var resizeWorkerItem = new ResizeWorkerItem { + TenantId = TenantProvider.CurrentTenantID, ContactID = contactID, UploadOnly = uploadOnly, RequireFotoSize = new[] { _bigSize }, @@ -520,6 +527,7 @@ private static void ExecGenerateThumbnail(byte[] imageData, int contactID, bool { var resizeWorkerItem = new ResizeWorkerItem { + TenantId = TenantProvider.CurrentTenantID, ContactID = contactID, UploadOnly = uploadOnly, RequireFotoSize = new[] { _mediumSize, _smallSize }, diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Classes/RegisterClientScriptHelper.cs b/web/studio/ASC.Web.Studio/Products/CRM/Classes/RegisterClientScriptHelper.cs index da64ee88b..4abfbf809 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Classes/RegisterClientScriptHelper.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Classes/RegisterClientScriptHelper.cs @@ -46,21 +46,6 @@ namespace ASC.Web.CRM.Classes { public static class RegisterClientScriptHelper { - private static bool IsTwitterSearchEnabled - { - get - { - return TwitterLoginProvider.Instance.IsEnabled - && !string.IsNullOrEmpty(TwitterLoginProvider.TwitterDefaultAccessToken) - && !string.IsNullOrEmpty(TwitterLoginProvider.TwitterAccessTokenSecret); - } - } - - - public static void DataCommon(Page page) - { - } - public static void DataUserSelectorListView(BasePage page, String ObjId, Dictionary SelectedUsers) { var ids = SelectedUsers != null && SelectedUsers.Count > 0 ? SelectedUsers.Select(i => i.Key).ToArray() : new List().ToArray(); @@ -233,8 +218,7 @@ public static void DataContactActionView(BasePage page, Contact targetContact, L var contactAvailableTypes = {4}; var presetCompanyForPersonJson = '{5}'; var presetPersonsForCompanyJson = '{6}'; - var twitterSearchEnabled = {7}; - var contactActionCurrencies = {8};", + var contactActionCurrencies = {7};", json, JsonConvert.SerializeObject(networks), JsonConvert.SerializeObject(tags.ToList().ConvertAll(t => t.HtmlEncode())), @@ -247,7 +231,6 @@ public static void DataContactActionView(BasePage page, Contact targetContact, L })), presetCompanyForPersonJson, presetPersonsForCompanyJson, - IsTwitterSearchEnabled.ToString().ToLower(), JsonConvert.SerializeObject(CurrencyProvider.GetAll()) ); diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Classes/SocialMedia/SocialMediaAccountNotFound.cs b/web/studio/ASC.Web.Studio/Products/CRM/Classes/SocialMedia/SocialMediaAccountNotFound.cs deleted file mode 100644 index 5a65f449d..000000000 --- a/web/studio/ASC.Web.Studio/Products/CRM/Classes/SocialMedia/SocialMediaAccountNotFound.cs +++ /dev/null @@ -1,26 +0,0 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2023 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - -using System; - -namespace ASC.Web.CRM.SocialMedia -{ - public class SocialMediaAccountNotFound : Exception - { - public SocialMediaAccountNotFound(string message) : base(message) { } - } -} diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Classes/SocialMedia/SocialMediaImageDescription.cs b/web/studio/ASC.Web.Studio/Products/CRM/Classes/SocialMedia/SocialMediaImageDescription.cs deleted file mode 100644 index d72c78bba..000000000 --- a/web/studio/ASC.Web.Studio/Products/CRM/Classes/SocialMedia/SocialMediaImageDescription.cs +++ /dev/null @@ -1,33 +0,0 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2023 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - -using ASC.Thrdparty; - -namespace ASC.Web.CRM.Classes.SocialMedia -{ - public class SocialMediaImageDescription - { - ///0 - public SocialNetworks SocialNetwork { get; set; } - - ///url to img - public string ImageUrl { get; set; } - - ///Identity - public string Identity { get; set; } - } -} diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Classes/SocialMedia/SocialMediaUI.cs b/web/studio/ASC.Web.Studio/Products/CRM/Classes/SocialMedia/SocialMediaUI.cs deleted file mode 100644 index b3147a871..000000000 --- a/web/studio/ASC.Web.Studio/Products/CRM/Classes/SocialMedia/SocialMediaUI.cs +++ /dev/null @@ -1,154 +0,0 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2023 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading; - -using ASC.Common.Logging; -using ASC.Core; -using ASC.Core.Tenants; -using ASC.CRM.Core; -using ASC.CRM.Core.Dao; -using ASC.Thrdparty; -using ASC.Thrdparty.Twitter; -using ASC.Web.CRM.Classes.SocialMedia; -using ASC.Web.CRM.Resources; - - -namespace ASC.Web.CRM.SocialMedia -{ - public class SocialMediaUI - { - private readonly ILog _logger = LogManager.GetLogger("ASC"); - private DaoFactory DaoFactory { get; set; } - - public SocialMediaUI(DaoFactory factory) - { - DaoFactory = factory; - } - - public List GetContactSMImages(int contactID) - { - var contact = DaoFactory.ContactDao.GetByID(contactID); - - var images = new List(); - - - var socialNetworks = DaoFactory.ContactInfoDao.GetList(contact.ID, null, null, null); - - var twitterAccounts = socialNetworks.Where(sn => sn.InfoType == ContactInfoType.Twitter).Select(sn => sn.Data.Trim()).ToList(); - - Func, Tenant, List> dlgGetTwitterImageDescriptionList = GetTwitterImageDescriptionList; - - // Parallelizing - - var waitHandles = new List(); - - var currentTenant = CoreContext.TenantManager.GetCurrentTenant(); - - var arGetAvatarsFromTwitter = dlgGetTwitterImageDescriptionList.BeginInvoke(twitterAccounts, currentTenant, null, null); - waitHandles.Add(arGetAvatarsFromTwitter.AsyncWaitHandle); - - WaitHandle.WaitAll(waitHandles.ToArray()); - - images.AddRange(dlgGetTwitterImageDescriptionList.EndInvoke(arGetAvatarsFromTwitter)); - - return images; - } - - public List GetContactSMImages(List twitter) - { - var images = new List(); - - Func, Tenant, List> dlgGetTwitterImageDescriptionList = GetTwitterImageDescriptionList; - - // Parallelizing - - var waitHandles = new List(); - - var currentTenant = CoreContext.TenantManager.GetCurrentTenant(); - - var arGetAvatarsFromTwitter = dlgGetTwitterImageDescriptionList.BeginInvoke(twitter, currentTenant, null, null); - waitHandles.Add(arGetAvatarsFromTwitter.AsyncWaitHandle); - - WaitHandle.WaitAll(waitHandles.ToArray()); - - images.AddRange(dlgGetTwitterImageDescriptionList.EndInvoke(arGetAvatarsFromTwitter)); - - return images; - } - - private List GetTwitterImageDescriptionList(List twitterAccounts, Tenant tenant) - { - var images = new List(); - - if (twitterAccounts.Count == 0) - return images; - - try - { - CoreContext.TenantManager.SetCurrentTenant(tenant); - - var provider = new TwitterDataProvider(TwitterApiHelper.GetTwitterApiInfoForCurrentUser()); - - twitterAccounts = twitterAccounts.Distinct().ToList(); - images.AddRange(from twitterAccount in twitterAccounts - let imageUrl = provider.GetUrlOfUserImage(twitterAccount, TwitterDataProvider.ImageSize.Small) - where imageUrl != null - select new SocialMediaImageDescription - { - Identity = twitterAccount, - ImageUrl = imageUrl, - SocialNetwork = SocialNetworks.Twitter - }); - } - catch (Exception ex) - { - _logger.Error(ex); - } - - return images; - } - - public Exception ProcessError(Exception exception, string methodName) - { - if (exception is ConnectionFailureException) - return new Exception(CRMSocialMediaResource.ErrorTwitterConnectionFailure); - - if (exception is RateLimitException) - return new Exception(CRMSocialMediaResource.ErrorTwitterRateLimit); - - if (exception is ResourceNotFoundException) - return new Exception(CRMSocialMediaResource.ErrorTwitterAccountNotFound); - - if (exception is UnauthorizedException) - return new Exception(CRMSocialMediaResource.ErrorTwitterUnauthorized); - - if (exception is SocialMediaException) - return new Exception(CRMSocialMediaResource.ErrorInternalServer); - - if (exception is SocialMediaAccountNotFound) - return exception; - - var unknownErrorText = String.Format("{0} error: Unknown exception:", methodName); - _logger.Error(unknownErrorText, exception); - return new Exception(CRMSocialMediaResource.ErrorInternalServer); - } - } -} \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Classes/SocialMedia/TwitterApiHelper.cs b/web/studio/ASC.Web.Studio/Products/CRM/Classes/SocialMedia/TwitterApiHelper.cs deleted file mode 100644 index 410f6cb5d..000000000 --- a/web/studio/ASC.Web.Studio/Products/CRM/Classes/SocialMedia/TwitterApiHelper.cs +++ /dev/null @@ -1,44 +0,0 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2023 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - -using ASC.FederatedLogin.LoginProviders; -using ASC.Thrdparty.Twitter; - -namespace ASC.Web.CRM.Classes.SocialMedia -{ - public static class TwitterApiHelper - { - public static TwitterApiInfo GetTwitterApiInfoForCurrentUser() - { - TwitterApiInfo apiInfo = new TwitterApiInfo - { - ConsumerKey = TwitterLoginProvider.TwitterKey, - ConsumerSecret = TwitterLoginProvider.TwitterSecret - }; - - SetDefaultTokens(apiInfo); - - return apiInfo; - } - - private static void SetDefaultTokens(TwitterApiInfo apiInfo) - { - apiInfo.AccessToken = TwitterLoginProvider.TwitterDefaultAccessToken; - apiInfo.AccessTokenSecret = TwitterLoginProvider.TwitterAccessTokenSecret; - } - } -} diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Configuration/ProductEntryPoint.cs b/web/studio/ASC.Web.Studio/Products/CRM/Configuration/ProductEntryPoint.cs index ae3a88c94..96d102101 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Configuration/ProductEntryPoint.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Configuration/ProductEntryPoint.cs @@ -87,6 +87,7 @@ public override void Init() DisabledIconFileName = "product_disabled_logo.png", IconFileName = "product_logo.png", LargeIconFileName = "product_logolarge.svg", + LargeIconFileNameDark = "product_logolarge_dark.svg", DefaultSortOrder = 30, SubscriptionManager = new ProductSubscriptionManager(), SpaceUsageStatManager = new CRMSpaceUsageStatManager(), diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Controls/Contacts/ContactActionView.ascx b/web/studio/ASC.Web.Studio/Products/CRM/Controls/Contacts/ContactActionView.ascx index d19bd86ef..dca7c43df 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Controls/Contacts/ContactActionView.ascx +++ b/web/studio/ASC.Web.Studio/Products/CRM/Controls/Contacts/ContactActionView.ascx @@ -329,7 +329,7 @@ @@ -394,21 +394,4 @@ <% } %> - - -
-
- - -
-
- -
-
- <%= CRMSocialMediaResource.PleaseWait%> -
-
- <%= UrlParameters.Type == "people" ? CRMSocialMediaResource.NoAccountsHasBeenFound : CRMSocialMediaResource.NoCompaniesHasBeenFound%> -
-
\ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Controls/Contacts/ContactDetailsView.ascx b/web/studio/ASC.Web.Studio/Products/CRM/Controls/Contacts/ContactDetailsView.ascx index 271d183af..d1325cd9e 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Controls/Contacts/ContactDetailsView.ascx +++ b/web/studio/ASC.Web.Studio/Products/CRM/Controls/Contacts/ContactDetailsView.ascx @@ -109,32 +109,6 @@ - - <% if (CRMSecurity.CanEdit(TargetContact)) %> <% { %>
diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Controls/Contacts/ContactDetailsView.ascx.cs b/web/studio/ASC.Web.Studio/Products/CRM/Controls/Contacts/ContactDetailsView.ascx.cs index 6bc92d6b4..c7afa0838 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Controls/Contacts/ContactDetailsView.ascx.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Controls/Contacts/ContactDetailsView.ascx.cs @@ -126,13 +126,12 @@ private void RegisterScript() var sb = new StringBuilder(); sb.AppendFormat(@" - ASC.CRM.ContactDetailsView.init({0},{1},{2},{3},{4},{5}); - {6}", + ASC.CRM.ContactDetailsView.init({0},{1},{2},{3},{4}); + {5}", TargetContact.ID, (TargetContact is Company).ToString().ToLower(), WebItemSecurity.IsAvailableForMe(WebItemManager.ProjectsProductID).ToString().ToLower(), - (!string.IsNullOrEmpty(TwitterLoginProvider.TwitterDefaultAccessToken)).ToString().ToLower(), (int)TargetContact.ShareType, CRMSecurity.CanEdit(TargetContact).ToString().ToLower(), ShowEventLinkToPanel ? "" : "jq('#eventLinkToPanel').hide();" diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Controls/Contacts/ContactFullCardView.ascx b/web/studio/ASC.Web.Studio/Products/CRM/Controls/Contacts/ContactFullCardView.ascx index 9c86b5ade..2dda4093d 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Controls/Contacts/ContactFullCardView.ascx +++ b/web/studio/ASC.Web.Studio/Products/CRM/Controls/Contacts/ContactFullCardView.ascx @@ -28,7 +28,7 @@ <% if (CRMSecurity.CanEdit(TargetContact)) %> <% { %> diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Masters/BasicTemplate.Master.cs b/web/studio/ASC.Web.Studio/Products/CRM/Masters/BasicTemplate.Master.cs index e2db4d430..cfc17997e 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Masters/BasicTemplate.Master.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Masters/BasicTemplate.Master.cs @@ -83,7 +83,6 @@ public ScriptBundleData GetStaticJavaScript() "cases.js", "deals.js", "invoices.js", - "socialmedia.js", "sender.js", "reports.js") .AddSource(ResolveUrl, diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Masters/ClientScripts/CRMSettingsResources.cs b/web/studio/ASC.Web.Studio/Products/CRM/Masters/ClientScripts/CRMSettingsResources.cs index e4b64f11b..8595f85bf 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Masters/ClientScripts/CRMSettingsResources.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Masters/ClientScripts/CRMSettingsResources.cs @@ -56,8 +56,7 @@ protected override IEnumerable> GetClientVariables( {"empty_screen_case_participants", WebImageSupplier.GetAbsoluteWebPath("empty_screen_case_participants.svg", ProductEntryPoint.ID)}, {"empty_screen_projects", WebImageSupplier.GetAbsoluteWebPath("empty_screen_projects.svg", ProductEntryPoint.ID)}, {"empty_screen_userfields", WebImageSupplier.GetAbsoluteWebPath("empty_screen_userfields.svg", ProductEntryPoint.ID)}, - {"empty_screen_tags", WebImageSupplier.GetAbsoluteWebPath("empty_screen_tags.svg", ProductEntryPoint.ID)}, - {"empty_screen_twitter", WebImageSupplier.GetAbsoluteWebPath("empty_screen_twitter.svg", ProductEntryPoint.ID)} + {"empty_screen_tags", WebImageSupplier.GetAbsoluteWebPath("empty_screen_tags.svg", ProductEntryPoint.ID)} }; return new List>(1) diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Masters/ClientScripts/ClientLocalizationResources.cs b/web/studio/ASC.Web.Studio/Products/CRM/Masters/ClientScripts/ClientLocalizationResources.cs index 213de6705..355c7e03d 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Masters/ClientScripts/ClientLocalizationResources.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Masters/ClientScripts/ClientLocalizationResources.cs @@ -47,7 +47,6 @@ protected override IEnumerable> GetClientVariables( RegisterResourceSet("CRMCasesResource", CRMCasesResource.ResourceManager), RegisterResourceSet("CRMEnumResource", CRMEnumResource.ResourceManager), RegisterResourceSet("CRMSettingResource", CRMSettingResource.ResourceManager), - RegisterResourceSet("CRMSocialMediaResource", CRMSocialMediaResource.ResourceManager), RegisterResourceSet("CRMVoipResource", CRMVoipResource.ResourceManager), RegisterResourceSet("CRMReportResource", CRMReportResource.ResourceManager), RegisterObject(new @@ -95,7 +94,6 @@ protected override IEnumerable> GetClientVariables( CurrentUser = CustomNamingPeople.Substitute("CurrentUser").HtmlEncode(), PrivatePanelAccessListLable = CustomNamingPeople.Substitute("PrivatePanelAccessListLable").HtmlEncode(), PrivatePanelDescription = CustomNamingPeople.Substitute("PrivatePanelDescription").HtmlEncode(), - SocialMediaAccountNotFoundTwitter = CRMSocialMediaResource.SocialMediaAccountNotFoundTwitter.HtmlEncode(), DisabledEmployeeTitle = Resource.DisabledEmployeeTitle.HtmlEncode() }) }; diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMCommonResource.Designer.cs b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMCommonResource.Designer.cs index 81a4825e5..d79028cf1 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMCommonResource.Designer.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMCommonResource.Designer.cs @@ -2130,15 +2130,6 @@ public static string NextSample { } } - /// - /// Looks up a localized string similar to No records. - /// - public static string NoLoadedMessages { - get { - return ResourceManager.GetString("NoLoadedMessages", resourceCulture); - } - } - /// /// Looks up a localized string similar to No mail accounts available. /// diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMCommonResource.ar-AE.resx b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMCommonResource.ar-AE.resx index 6ae50f4af..9f69a5378 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMCommonResource.ar-AE.resx +++ b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMCommonResource.ar-AE.resx @@ -370,9 +370,6 @@ السجل التالي - - لا توجد سجلات - لا يوجد تطابق diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMCommonResource.az-Latn-AZ.resx b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMCommonResource.az-Latn-AZ.resx index 7aa0f397a..16bbe75a9 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMCommonResource.az-Latn-AZ.resx +++ b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMCommonResource.az-Latn-AZ.resx @@ -742,9 +742,6 @@ Sonrakı qeyd - - Qeyd yoxdur - Poçt hesabı mövcud deyil diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMCommonResource.bg.resx b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMCommonResource.bg.resx index 54c925248..24bc326dc 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMCommonResource.bg.resx +++ b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMCommonResource.bg.resx @@ -478,9 +478,6 @@ Следващ запис - - Няма записи - Няма налични пощенски акаунти diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMCommonResource.bs-BA.resx b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMCommonResource.bs-BA.resx index d02703caa..c4dca14af 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMCommonResource.bs-BA.resx +++ b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMCommonResource.bs-BA.resx @@ -478,9 +478,6 @@ Slijedeći zapis - - Nema zapisa - Nisu dostupni računi pošte diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMCommonResource.ca.resx b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMCommonResource.ca.resx index da728930e..f83d39881 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMCommonResource.ca.resx +++ b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMCommonResource.ca.resx @@ -373,9 +373,6 @@ Següent - - No hi ha registres - No hi ha cap coincidència diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMCommonResource.cs.resx b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMCommonResource.cs.resx index f161887e5..8d8a3824a 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMCommonResource.cs.resx +++ b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMCommonResource.cs.resx @@ -469,9 +469,6 @@ Další záznam - - Žádné záznamy - Žádné poštovní účty nejsou k dispozici diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMCommonResource.de.resx b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMCommonResource.de.resx index 1084e8012..0525c67c8 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMCommonResource.de.resx +++ b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMCommonResource.de.resx @@ -526,9 +526,6 @@ Nächster Eintrag - - Keine Einträge - Keine verfügbaren Konten diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMCommonResource.el.resx b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMCommonResource.el.resx index 10364d892..49c1f0e87 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMCommonResource.el.resx +++ b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMCommonResource.el.resx @@ -283,9 +283,6 @@ Τα συμβάντα μου - - Καμία εγγραφή - Ειδοποίηση diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMCommonResource.es.resx b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMCommonResource.es.resx index 885965c8e..ff879e513 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMCommonResource.es.resx +++ b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMCommonResource.es.resx @@ -526,9 +526,6 @@ Apunte próximo - - No hay apuntes - No hay cuentas disponibles diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMCommonResource.et.resx b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMCommonResource.et.resx index 51e3a0f54..3e7b044f9 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMCommonResource.et.resx +++ b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMCommonResource.et.resx @@ -289,9 +289,6 @@ Järgmine kirje - - Kirjeid pole - vastet ei leitud diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMCommonResource.fi.resx b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMCommonResource.fi.resx index beea66ff6..8e5118863 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMCommonResource.fi.resx +++ b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMCommonResource.fi.resx @@ -457,9 +457,6 @@ Seuraava tietue - - Ei tietueita - Ei sähköpostitilejä. diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMCommonResource.fr.resx b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMCommonResource.fr.resx index 465c55307..0f8d84c98 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMCommonResource.fr.resx +++ b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMCommonResource.fr.resx @@ -526,9 +526,6 @@ Suivant - - Aucun enregistrement - Pas de comptes disponibles diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMCommonResource.hr.resx b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMCommonResource.hr.resx index 6e1cf21e1..6cecc4d83 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMCommonResource.hr.resx +++ b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMCommonResource.hr.resx @@ -328,9 +328,6 @@ Sljedeći zapis - - Nema zapisa - Nema podudaranja diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMCommonResource.id.resx b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMCommonResource.id.resx index 85061c2d9..cd9a5d825 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMCommonResource.id.resx +++ b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMCommonResource.id.resx @@ -448,9 +448,6 @@ Rekaman berikutnya - - Tidak ada rekaman - Tidak tersedia akun surat diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMCommonResource.it.resx b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMCommonResource.it.resx index 5f7ea30af..359d6768b 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMCommonResource.it.resx +++ b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMCommonResource.it.resx @@ -526,9 +526,6 @@ Registrazione successiva - - Nessuna registrazione - Nessun account disponibile diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMCommonResource.ja.resx b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMCommonResource.ja.resx index e29a626bc..55472e71e 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMCommonResource.ja.resx +++ b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMCommonResource.ja.resx @@ -449,9 +449,6 @@ 次のレコード - - レコードなしません - 利用可能なメールアカウントはありません diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMCommonResource.ka.resx b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMCommonResource.ka.resx index 95a3c76d6..d604911b9 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMCommonResource.ka.resx +++ b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMCommonResource.ka.resx @@ -199,9 +199,6 @@ შემდეგი ჩანაწერი - - ჩანაწერები არ არის - დამთხვევები არ არის diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMCommonResource.ko.resx b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMCommonResource.ko.resx index ec9a3be30..51cc7f3c2 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMCommonResource.ko.resx +++ b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMCommonResource.ko.resx @@ -370,9 +370,6 @@ 다음 레코드 - - 레코드 없음 - 일치 하는 항목 없음 diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMCommonResource.lt.resx b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMCommonResource.lt.resx index 4de7782b9..f8547a724 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMCommonResource.lt.resx +++ b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMCommonResource.lt.resx @@ -460,9 +460,6 @@ Kitas įrašas - - Nėra įrašų - Nėra elektroninio pašto paskyrų diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMCommonResource.lv.resx b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMCommonResource.lv.resx index 7decdd895..5541353dc 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMCommonResource.lv.resx +++ b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMCommonResource.lv.resx @@ -469,9 +469,6 @@ Nākamais ieraksts - - Nav ierakstu - Nav pieejami pasta konti diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMCommonResource.nb-NO.resx b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMCommonResource.nb-NO.resx index 0549434eb..8d92cc3a6 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMCommonResource.nb-NO.resx +++ b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMCommonResource.nb-NO.resx @@ -325,9 +325,6 @@ Neste - - Ingen elementer - Ingen treff diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMCommonResource.nl.resx b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMCommonResource.nl.resx index 09b0bb908..33228687d 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMCommonResource.nl.resx +++ b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMCommonResource.nl.resx @@ -460,9 +460,6 @@ Volgende record - - Geen records - Geen mailaccounts beschikbaar diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMCommonResource.pl.resx b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMCommonResource.pl.resx index ea89a97c5..f0595d984 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMCommonResource.pl.resx +++ b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMCommonResource.pl.resx @@ -471,9 +471,6 @@ Następny wpis - - Wpisów nie ma - Brak dostępnych kont pocztowych diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMCommonResource.pt-BR.resx b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMCommonResource.pt-BR.resx index 44aa35343..7590916ed 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMCommonResource.pt-BR.resx +++ b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMCommonResource.pt-BR.resx @@ -528,9 +528,6 @@ Próximo regristro - - Nenum registro - Nenhuma conta de e-mail disponível diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMCommonResource.pt.resx b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMCommonResource.pt.resx index 3c5d5f5ca..88e875653 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMCommonResource.pt.resx +++ b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMCommonResource.pt.resx @@ -361,9 +361,6 @@ Próximo registo - - Não há registos - Sem correspondência diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMCommonResource.resx b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMCommonResource.resx index 149c82bc1..4352fbce8 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMCommonResource.resx +++ b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMCommonResource.resx @@ -739,9 +739,6 @@ Next record - - No records - No mail accounts available diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMCommonResource.ru.resx b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMCommonResource.ru.resx index 0ebde378e..3c46540b6 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMCommonResource.ru.resx +++ b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMCommonResource.ru.resx @@ -526,9 +526,6 @@ Следующая запись - - Записей нет - Нет доступных учетных записей diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMCommonResource.sk.resx b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMCommonResource.sk.resx index 6988e7478..4b9aa46fd 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMCommonResource.sk.resx +++ b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMCommonResource.sk.resx @@ -548,9 +548,6 @@ Ďalší záznam - - Žiadne záznamy - Nie sú k dispozícii žiadne poštové účty diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMCommonResource.sl.resx b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMCommonResource.sl.resx index 0881f19ef..cd987dd54 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMCommonResource.sl.resx +++ b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMCommonResource.sl.resx @@ -448,9 +448,6 @@ Naslednji zapis - - Ni zapisov - Na voljo ni noben mail račun diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMCommonResource.sr-Latn-CS.resx b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMCommonResource.sr-Latn-CS.resx index e1fc76b23..a0dcb24fd 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMCommonResource.sr-Latn-CS.resx +++ b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMCommonResource.sr-Latn-CS.resx @@ -313,9 +313,6 @@ Sledeći zapis - - Nema zapisa - Nema podudaranja diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMCommonResource.sv.resx b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMCommonResource.sv.resx index b67f18768..30e5d55d4 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMCommonResource.sv.resx +++ b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMCommonResource.sv.resx @@ -478,9 +478,6 @@ Nästa register - - Inga register - Inga mejlkonto tillgängliga diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMCommonResource.tr.resx b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMCommonResource.tr.resx index 4ee5d64a5..bb6f93d8f 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMCommonResource.tr.resx +++ b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMCommonResource.tr.resx @@ -469,9 +469,6 @@ Sonraki kayıt - - Kayıt yok - Mevcut posta hesabı yok diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMCommonResource.uk.resx b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMCommonResource.uk.resx index d3e194b97..ed9c4cae3 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMCommonResource.uk.resx +++ b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMCommonResource.uk.resx @@ -461,9 +461,6 @@ Наступний запис - - Записів немає - Немає доступних облікових записів електронної пошти diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMCommonResource.vi.resx b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMCommonResource.vi.resx index ba40419bb..7bfed841b 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMCommonResource.vi.resx +++ b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMCommonResource.vi.resx @@ -470,9 +470,6 @@ Hồ sơ tiếp theo - - Không có hồ sơ - Không có tài khoản mail khả dụng diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMCommonResource.zh-CN.resx b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMCommonResource.zh-CN.resx index 6723f9e29..1b943641d 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMCommonResource.zh-CN.resx +++ b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMCommonResource.zh-CN.resx @@ -478,9 +478,6 @@ 下一条纪录 - - 暂无纪录 - 无可用邮件账户 diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMCommonResource.zh-TW.resx b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMCommonResource.zh-TW.resx index 3ead28070..09d35b9d6 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMCommonResource.zh-TW.resx +++ b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMCommonResource.zh-TW.resx @@ -527,9 +527,6 @@ 下一則紀錄 - - 沒有記錄 - 沒有可用的郵件帳戶 diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMContactResource.Designer.cs b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMContactResource.Designer.cs index 5a6cef105..d75339de4 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMContactResource.Designer.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMContactResource.Designer.cs @@ -1171,15 +1171,6 @@ public static string LoadPhotoFromPC { } } - /// - /// Looks up a localized string similar to Select from social networks. - /// - public static string LoadPhotoFromSocialMedia { - get { - return ResourceManager.GetString("LoadPhotoFromSocialMedia", resourceCulture); - } - } - /// /// Looks up a localized string similar to Allow access to the company for all CRM users. /// @@ -1342,15 +1333,6 @@ public static string NoMatchSelect { } } - /// - /// Looks up a localized string similar to There are no available photos corresponding to the profile. - /// - public static string NoPhotoFromSocialMedia { - get { - return ResourceManager.GetString("NoPhotoFromSocialMedia", resourceCulture); - } - } - /// /// Looks up a localized string similar to Notify contact manager by email. /// diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMContactResource.az-Latn-AZ.resx b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMContactResource.az-Latn-AZ.resx index 7cd8cd3b8..7075948c6 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMContactResource.az-Latn-AZ.resx +++ b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMContactResource.az-Latn-AZ.resx @@ -431,9 +431,6 @@ Siz etiketi bu şirkətdən və onunla əlaqəli bütün şəxslərdən silmək Kompüterdən fotoşəkil yüklə - - və ya sosial şəbəkələrdən seçin: - Bütün CRM istifadəçiləri üçün şirkətə giriş icazəsi verin @@ -488,9 +485,6 @@ Siz etiketi bu şirkətdən və onunla əlaqəli bütün şəxslərdən silmək ONLYOFFICE™ CRM ilə üst-üstə düşən heç nə yoxdur, siyahıdan seçim edin - - Bu profilə uyğun fotolar yoxdur. - Kontakt menecerini e-poçt vasitəsilə xəbərdar edin diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMContactResource.bg.resx b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMContactResource.bg.resx index fe28b3796..b97dd1a7e 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMContactResource.bg.resx +++ b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMContactResource.bg.resx @@ -427,9 +427,6 @@ Качване на снимка от компютър - - Изберете от социалните мрежи - Разрешаване на достъпа до компанията за всички CRM потребители @@ -484,9 +481,6 @@ Няма съвпадения в ONLYOFFICE™ CRM, изберете от списъка - - Няма налични снимки, съответстващи на профила - Уведомете мениджъра на контактите по имейл diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMContactResource.bs-BA.resx b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMContactResource.bs-BA.resx index 676a26529..3b25971cc 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMContactResource.bs-BA.resx +++ b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMContactResource.bs-BA.resx @@ -431,9 +431,6 @@ Pošaljite fotografiju sa računara - - Odaberite s društvenih mreža - Omogućite pristup kompaniji svim CRM korisnicima @@ -488,9 +485,6 @@ Nema podudaranja u CRM, odaberite s popisa - - Nema dostupnih fotografija koje odgovaraju profilu - Obavijestite menadžera kontakata putem e-pošte diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMContactResource.cs.resx b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMContactResource.cs.resx index 9ca492d8e..bc95ac89b 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMContactResource.cs.resx +++ b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMContactResource.cs.resx @@ -434,9 +434,6 @@ Chcete tuto značku smazat také od společnosti a od všech jejích osob? Nahrát foto z Počítače - - Vyberte ze sociálních sítí - Povolit přístup ke společnosti pro všechny uživatele CRM @@ -492,9 +489,6 @@ Chcete tuto značku smazat také od společnosti a od všech jejích osob? V ONLYOFFICE™ CRM nejsou žádné shody, vyberte ze seznamu - - Nejsou k dispozici žádné fotky odpovídající profilu - Upozorněte správce kontaktů e-mailem diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMContactResource.de.resx b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMContactResource.de.resx index a63df509c..e45cad98f 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMContactResource.de.resx +++ b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMContactResource.de.resx @@ -429,9 +429,6 @@ Möchten Sie dieses Tag auch aus dem Unternehmen und allen darauf bezogenen Pers Foto vom PC hochladen - - Aus den sozialen Netzwerken wählen - Den Zugriff auf das Unternehmen für alle CRM-Benutzer erteilen @@ -486,9 +483,6 @@ Möchten Sie dieses Tag auch aus dem Unternehmen und allen darauf bezogenen Pers Keine Treffer in ONLYOFFICE™-CRM. Wählen Sie aus der Liste - - Keine verfügbaren Bilder, die diesem Profil entsprechen - den Kontaktleiter per E-Mail benachrichtigen diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMContactResource.es.resx b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMContactResource.es.resx index cf956117f..59ac968ce 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMContactResource.es.resx +++ b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMContactResource.es.resx @@ -431,9 +431,6 @@ Subir fotos de la PC - - Seleccione de las redes sociales - Permitir a todos los usuarios de CRM el acceso a la empresa @@ -488,9 +485,6 @@ No hay coincidencias en ONLYOFFICE™ CRM, seleccione de la lista - - No hay fotos disponibles que corresponden al perfil - Notificar gerente de contacto por correo electrónico diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMContactResource.fi.resx b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMContactResource.fi.resx index d187a2e7f..5ee5fe307 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMContactResource.fi.resx +++ b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMContactResource.fi.resx @@ -427,9 +427,6 @@ Lisää valokuva tietokoneelta - - Valitse sosiaalisista palveluista - Salli Pääsyoikeudet yritykseen kaikille Asiakkuudenhallinnan käyttäjille @@ -484,9 +481,6 @@ Ei vastaavia tuloksia ONLYOFFICE™ Asiakkuudenhallinnassa, valitse luettelosta - - Ei käytettävissä olevia valokuvia tälle profiilille. - Ilmoita kontaktin hallintaan sähköpostilla. diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMContactResource.fr.resx b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMContactResource.fr.resx index cdadefec8..2e6abfad3 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMContactResource.fr.resx +++ b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMContactResource.fr.resx @@ -431,9 +431,6 @@ Voulez-vous aussi supprimer ce tag de cette entreprise et toutes ses personnes l Chargez la photo à partir de l'ordinateur - - Choisissez parmi les réseaux sociaux - Autoriser l'accès à l'entreprise à tous les utilisateurs @@ -488,9 +485,6 @@ Voulez-vous aussi supprimer ce tag de cette entreprise et toutes ses personnes l Rien n'a été trouvé pour CRM ONLYOFFICE™, sélectionnez dans la liste - - Pas de photos disponibles qui correspondent à ce profil - Informer le responsable du contact par courrier électronique diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMContactResource.id.resx b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMContactResource.id.resx index 20182c310..88d3e1972 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMContactResource.id.resx +++ b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMContactResource.id.resx @@ -425,9 +425,6 @@ Apakah Anda juga ingin menghapus tag ini dari perusahaan tersebut dan semua oran Unggah foto dari komputer PC - - Pilih dari jejaring sosial - Ijinkan akses ke perusahaan untuk semua pengguna CRM @@ -482,9 +479,6 @@ Apakah Anda juga ingin menghapus tag ini dari perusahaan tersebut dan semua oran Tidak ditemukan dalam ONLYOFFICE™ CRM, pilihlah dari daftar - - Tidak ada foto yang sesuai dengan profil - Beritahukan pengelola kontak melalui email diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMContactResource.it.resx b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMContactResource.it.resx index 0bdc5be46..86315c32e 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMContactResource.it.resx +++ b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMContactResource.it.resx @@ -431,9 +431,6 @@ Desideri eliminare questa etichetta anche dall'azienda e dalle sue persone? Carica foto dal PC - - Seleziona una dalle reti sociali: - Consenti l'accesso a questa azienda a tutti gli utenti di CRM @@ -488,9 +485,6 @@ Desideri eliminare questa etichetta anche dall'azienda e dalle sue persone? Nessuna corrispondenza con ONLYOFFICE™ CRM, seleziona dall'elenco - - Nessuna foto disponibile corrispondente a questo profilo - Notifica il responsabile per email diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMContactResource.ja.resx b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMContactResource.ja.resx index 965cab219..d1e743982 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMContactResource.ja.resx +++ b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMContactResource.ja.resx @@ -345,9 +345,6 @@ PCから写真をアップロード - - またはソーシャルネットワークから選択します。 - すでに送信 diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMContactResource.ka.resx b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMContactResource.ka.resx index 126baeb01..abfbbc3b9 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMContactResource.ka.resx +++ b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMContactResource.ka.resx @@ -235,9 +235,6 @@ სურათის კომპიუტერიდან ატვირთვა - - ან აირჩიეთ სოციალური ქსელიდან - ეს ასლია diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMContactResource.ko.resx b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMContactResource.ko.resx index 2b09a431c..aa753102c 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMContactResource.ko.resx +++ b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMContactResource.ko.resx @@ -334,9 +334,6 @@ PC에서 사진을 업로드 - - 또는 소셜 네트워크에서 선택 : - 이미 전송 diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMContactResource.lt.resx b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMContactResource.lt.resx index 3b709a350..3a07bcdd8 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMContactResource.lt.resx +++ b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMContactResource.lt.resx @@ -431,9 +431,6 @@ Ar norite šią žymą taip pat panaikinti nuo bendrovės ir kitų jos asmenų?< Įkelti nuotrauką iš kompiuterio - - Pasirinkite iš socialinių tinklų: - Suteikti prieigą prie bendrovės visiems CRM naudotojams @@ -488,9 +485,6 @@ Ar norite šią žymą taip pat panaikinti nuo bendrovės ir kitų jos asmenų?< Nėra atitikmenų ONLYOFFICE™ CRM. Pasirinkite iš sąrašo. - - Nėra šiam profiliui nurodytų paveikslėlių - Informuoti kontakto vadovą el.paštu diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMContactResource.lv.resx b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMContactResource.lv.resx index 8b3c358ea..50bd5c5d7 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMContactResource.lv.resx +++ b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMContactResource.lv.resx @@ -431,9 +431,6 @@ Vai vēlaties dzēst šo birku arī no uzņēmuma un visām tā personām? Augšupielādēt foto no datora - - Izvēlēties no sociālajiem tīkliem - Atļaut piekļuvi uzņēmumam visiem CRM lietotājiem @@ -488,9 +485,6 @@ Vai vēlaties dzēst šo birku arī no uzņēmuma un visām tā personām? Nav atbilstības ONLYOFFICE™ CRM, izvēlieties no saraksta - - Nav pieejamu foto, kas atbilstu profilam - Paziņot kontaktu pārvaldniekam pa e-pastu diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMContactResource.nl.resx b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMContactResource.nl.resx index 13ac069e4..dcb15892f 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMContactResource.nl.resx +++ b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMContactResource.nl.resx @@ -431,9 +431,6 @@ Wilt u deze tag ook van het bedrijf en al zijn personen verwijderen? Foto van PC uploaden - - Selecteer uit sociale netwerken - Toegang toestaan tot het bedrijf voor alle CRM-gebruikers @@ -488,9 +485,6 @@ Wilt u deze tag ook van het bedrijf en al zijn personen verwijderen? Geen overeenkomsten in ONLYOFFICE™ CRM, selecteer uit lijst - - Er zijn geen beschikbare foto's die overeenkomen met het profiel - Contactmanager informeren per e-mail diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMContactResource.pl.resx b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMContactResource.pl.resx index 0da7b7e82..9798c57d2 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMContactResource.pl.resx +++ b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMContactResource.pl.resx @@ -432,9 +432,6 @@ Czy chcesz usunąć ten tag również ze spółki i ze wszystkich jej osób? Załaduj zdjęcie z komputera - - Wybierz z sieci społecznościowych - Zezwalaj na dostęp do firmy wszystkim użytkownikom CRM @@ -489,9 +486,6 @@ Czy chcesz usunąć ten tag również ze spółki i ze wszystkich jej osób? Brak dopasowań z ONLYOFFICE™ CRM, wybierz z listy - - Brak zdjęć odpowiadających profilowi - Powiadom menedżera kontaktów e-mailem diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMContactResource.pt-BR.resx b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMContactResource.pt-BR.resx index cbb8a88fc..21421c54b 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMContactResource.pt-BR.resx +++ b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMContactResource.pt-BR.resx @@ -432,9 +432,6 @@ Você deseja excluir esta etiqueta também da empresa e de todas as suas pessoas Carregar foto do PC - - Selecionar a partir das redes sociais - Permitir acesso à empresa para todos os usuários do CRM @@ -489,9 +486,6 @@ Você deseja excluir esta etiqueta também da empresa e de todas as suas pessoas Nenhuma correspondência no CRM do ONLYOFFICE™, selecione da lista - - Não há fotos disponíveis correspondentes ao perfil - Notificar gerente de contato por e-mail diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMContactResource.pt.resx b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMContactResource.pt.resx index e600ad18a..abc14ded0 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMContactResource.pt.resx +++ b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMContactResource.pt.resx @@ -334,9 +334,6 @@ Carregar foto do PC - - ou selecione das redes sociais: - Já enviado diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMContactResource.resx b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMContactResource.resx index 7e27ee569..e00508d63 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMContactResource.resx +++ b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMContactResource.resx @@ -431,9 +431,6 @@ Do you want to delete this tag also from the company and from all its persons? Upload photo from PC - - Select from social networks - Allow access to the company for all CRM users @@ -488,9 +485,6 @@ Do you want to delete this tag also from the company and from all its persons? No matches in ONLYOFFICE™ CRM, select from list - - There are no available photos corresponding to the profile - Notify contact manager by email diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMContactResource.ru.resx b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMContactResource.ru.resx index d18934d9c..6d12eb69c 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMContactResource.ru.resx +++ b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMContactResource.ru.resx @@ -431,9 +431,6 @@ Загрузить фото с компьютера - - Выбрать из социальных сетей - Разрешить доступ к компании для всех пользователей CRM @@ -488,9 +485,6 @@ Совпадений с ONLYOFFICE™ CRM нет, выберите из списка - - Нет доступных фотографий, соответствующих этому профилю - Оповестить менеджера контакта по email diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMContactResource.sk.resx b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMContactResource.sk.resx index 35d295f64..e776679b9 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMContactResource.sk.resx +++ b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMContactResource.sk.resx @@ -562,11 +562,6 @@ Nahrať fotografiu z počítača - - Vybrať zo sociálnych sietí - - - Umožniť prístup k spoločnosti všetkým používateľom CRM @@ -650,11 +645,6 @@ Žiadne zhody v ONLYOFFICE™ CRM, vyberte zo zoznamu - - - - Nie sú k dispozícii žiadne fotografie zodpovedajúce profilu - diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMContactResource.sl.resx b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMContactResource.sl.resx index 6517cf586..4cb3125cb 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMContactResource.sl.resx +++ b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMContactResource.sl.resx @@ -425,9 +425,6 @@ Ali želite izbrisati to oznako tudi pri podjetju in vseh osebah? Naloži sliko iz PC-ja - - Izberi iz družbenih omrežij - Dovoli dostop k podjetju za vse CRM uporabnike @@ -482,9 +479,6 @@ Ali želite izbrisati to oznako tudi pri podjetju in vseh osebah? Ni ujemanj v ONLYOFFICE™ CRM, izberite s seznama - - Slik, ki ustrezajo tem profilu, ni na voljo - Vodjo kontakta obvesti preko emaila diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMContactResource.sv.resx b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMContactResource.sv.resx index b46d38f92..6d8c6685e 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMContactResource.sv.resx +++ b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMContactResource.sv.resx @@ -431,9 +431,6 @@ Vill du radera denna etikett även från företaget och från alla dess personer Ladda upp bild från PC - - Välj från sociala nätverk - Tillåta tillgång till företaget för alla CRM-användare @@ -488,9 +485,6 @@ Vill du radera denna etikett även från företaget och från alla dess personer Inga matchningar i ONLYOFFICE™ CRM, välj från listan - - Inga tillgängliga bilder matchar profilen - Avisera kontaktansvarig via mejl diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMContactResource.tr.resx b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMContactResource.tr.resx index ce3e7aea7..dcce2a99c 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMContactResource.tr.resx +++ b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMContactResource.tr.resx @@ -431,9 +431,6 @@ Bu etiketi şirketten ve tüm kişilerinden silmek istiyor musunuz? PC'den fotoğraf yükle - - Sosyal ağlardan seç - Tüm CRM kullanıcıları için şirkete erişime izin ver @@ -488,9 +485,6 @@ Bu etiketi şirketten ve tüm kişilerinden silmek istiyor musunuz? ONLYOFFICE™ CRM'de eşleşme yok, listeden seçiniz - - Profille eşleşen mevcut resim yok - Kontak yöneticisini epostayla haberdar et diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMContactResource.uk.resx b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMContactResource.uk.resx index 719c037f6..54937e6a2 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMContactResource.uk.resx +++ b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMContactResource.uk.resx @@ -467,9 +467,6 @@ Завантажити фото з ​​комп'ютера - - Виберіть з соціальних мереж: - Дозволити доступ до компанії для всіх користувачів CRM @@ -531,9 +528,6 @@ Співпадінь з ONLYOFFICE™ CRM немає, виберіть зі списку - - Немає доступних фотографій, що відповідають профілю - Повідомити диспетчера контактів електронною поштою diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMContactResource.vi.resx b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMContactResource.vi.resx index 8a19c2129..353a86847 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMContactResource.vi.resx +++ b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMContactResource.vi.resx @@ -427,9 +427,6 @@ Tải ảnh từ PC - - Chọn từ mạng xã hội - Cho phép tất cả người dùng CRM truy cập vào công ty này @@ -484,9 +481,6 @@ Không khớp trong ONLYOFFICE™ CRM, chọn từ danh sách - - Không có ảnh tương ứng với hồ sơ này - Thông báo cho quản lý liên hệ qua email diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMContactResource.zh-CN.resx b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMContactResource.zh-CN.resx index dec699432..d54e7dca9 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMContactResource.zh-CN.resx +++ b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMContactResource.zh-CN.resx @@ -434,9 +434,6 @@ 从电脑上传图片 - - 或从社交网中选择: - 允许所有CRM用户访问公司 @@ -491,9 +488,6 @@ 在ONLYOFFICE™中找不到与此项对应的联系人格式,请从列表中选择 - - 没有与档案对应的可用照片 - 通过电子邮件通知联系人经理 diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMContactResource.zh-TW.resx b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMContactResource.zh-TW.resx index a21036a9c..c81308fab 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMContactResource.zh-TW.resx +++ b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMContactResource.zh-TW.resx @@ -433,9 +433,6 @@ 從PC上傳照片 - - 從社交網絡中選擇 - 允許所有CRM用戶存取公司 @@ -490,9 +487,6 @@ 在ONLYOFFICE™CRM中沒有匹配項,請從列表中選擇 - - 沒有與該個人資料相對應的照片 - 通過電子郵件通知聯繫人經理 diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMJSResource.Designer.cs b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMJSResource.Designer.cs index 7f460a749..37637464a 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMJSResource.Designer.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMJSResource.Designer.cs @@ -331,15 +331,6 @@ public static string ConfirmGoToCustomFieldPage { } } - /// - /// Looks up a localized string similar to Please enter the name of your Twitter account. For example, teamlabdotcom. - /// - public static string ContactTwitterDescription { - get { - return ResourceManager.GetString("ContactTwitterDescription", resourceCulture); - } - } - /// /// Looks up a localized string similar to Country. /// @@ -736,15 +727,6 @@ public static string ExpectedCloseDate { } } - /// - /// Looks up a localized string similar to Find account in Twitter. - /// - public static string FindTwitter { - get { - return ResourceManager.GetString("FindTwitter", resourceCulture); - } - } - /// /// Looks up a localized string similar to Your recipient list has been generated. {0} Click the links below to pass your email addresses over to the email program.. /// @@ -1087,15 +1069,6 @@ public static string PleaseWait { } } - /// - /// Looks up a localized string similar to Possible profiles for {0}. - /// - public static string PossibleSocialMediaAccounts { - get { - return ResourceManager.GetString("PossibleSocialMediaAccounts", resourceCulture); - } - } - /// /// Looks up a localized string similar to Previous. /// diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMJSResource.ar-AE.resx b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMJSResource.ar-AE.resx index e269d939c..9cdf8b821 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMJSResource.ar-AE.resx +++ b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMJSResource.ar-AE.resx @@ -140,9 +140,6 @@ جميع البيانات المدخله سيتم فقدها. هل انت متأكد من انك تريد الإكمال على ايه حال؟ - - الرجاء ادخال اسم المستخدم الخاص بك على تويتر - فرصه @@ -248,9 +245,6 @@ الموعد النهائي المتوقع لإتمام الصفقه - - ابحث عن الحساب في تويتر - تم انشاء قائمه المستلمين. {0} اضغط الرابط ادناه لترحيل عناوين المستلمين الى برنامج البريد. @@ -353,9 +347,6 @@ الرجاء اعاده تحميل هذه الصفحه - - ملفات شخصيه متوقعه لـ {0} - رئيسي diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMJSResource.az-Latn-AZ.resx b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMJSResource.az-Latn-AZ.resx index d8f24ce48..ece0d0970 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMJSResource.az-Latn-AZ.resx +++ b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMJSResource.az-Latn-AZ.resx @@ -149,9 +149,6 @@ Bütün daxil edilmiş məlumat itiriləcək. Siz istənilən halda davam etmək istədiyinizə əminsiniz mi? - - Twitter hesabınızın adını daxil edin. Örnək olaraq, teamlabdotcom - Ölkə @@ -281,9 +278,6 @@ Siz istənilən halda davam etmək istədiyinizə əminsiniz mi? Təxmini qapadılma tarixi - - Twitter'də hesabı tap - Alıcıların siyahısı yaradıldı.{0}Aşağıdakı keçidlərə basın ki, elektron poçt ünvanlarını elektron poçt proqramına keçirəsiniz. @@ -398,9 +392,6 @@ Siz istənilən halda davam etmək istədiyinizə əminsiniz mi? Gözləyin... - - {0} üçün mümkün profillər - Əvvəlki diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMJSResource.bg.resx b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMJSResource.bg.resx index dc4f0fc75..274fd987b 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMJSResource.bg.resx +++ b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMJSResource.bg.resx @@ -148,9 +148,6 @@ Всички въведени данни ще бъдат загубени. Наистина ли искате да продължите? - - Моля, въведете името на профила си в Twitter. Например, teamlabdotcom - Държава @@ -280,9 +277,6 @@ Приблизителна дата на сделката - - Намерете профил в Twitter - Списъкът с получатели е генериран. {0} Кликнете върху връзките по-долу, за да препратите имейл адресите си към програмата за електронна поща. @@ -394,9 +388,6 @@ Моля Изчакай... - - Възможни профили за {0} - Предишен diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMJSResource.bs-BA.resx b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMJSResource.bs-BA.resx index 43ebb313e..6e77feb72 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMJSResource.bs-BA.resx +++ b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMJSResource.bs-BA.resx @@ -149,9 +149,6 @@ Sve unesene informacije će biti izgubljene. Jeste li sigurni da ionako želite nastaviti? - - Unesite ime svog Twitter naloga. Na primjer, teamlabdotcom - Država @@ -281,9 +278,6 @@ Jeste li sigurni da ionako želite nastaviti? Procenjeni rok dospijeća posla - - Pronađi račun na Twitteru - Lista primatelja je generirana. {0} Kliknite dole navedene veze kako biste proslijedili adrese e-pošte programu e-pošte. @@ -395,9 +389,6 @@ Jeste li sigurni da ionako želite nastaviti? Molimo sačekajte... - - Mogući profili za {0} - Prethodno diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMJSResource.cs.resx b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMJSResource.cs.resx index 258347d88..68bba5bcf 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMJSResource.cs.resx +++ b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMJSResource.cs.resx @@ -149,9 +149,6 @@ Všechny zadané informace budou ztraceny. Opravdu chcete pokračovat? - - Zadejte název účtu Twitter. Například teamlabdotcom - země @@ -282,9 +279,6 @@ Opravdu chcete pokračovat? Předpokládaný termín realizace - - Najít účet na Twitteru - Seznam příjemců byl vygenerován. {0} Klepnutím na níže uvedené odkazy předáte e-mailové adresy do e-mailového programu. @@ -398,9 +392,6 @@ Opravdu chcete pokračovat? Čekejte prosím ... - - Možné profily pro {0} - Předchozí diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMJSResource.de.resx b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMJSResource.de.resx index d277288ee..6296463fa 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMJSResource.de.resx +++ b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMJSResource.de.resx @@ -149,9 +149,6 @@ Alle eingegebenen Daten werden verloren gehen. Möchten Sie wirklich trotzdem fortsetzen? - - Bitte geben Sie den Namen Ihres Twitter-Kontos ein. Zum Beispiel, teamlabdotcom - Land @@ -281,9 +278,6 @@ Möchten Sie wirklich trotzdem fortsetzen? Geschätzte Fälligkeit der Verkaufschance - - Twitter-Konto finden - Ihre Empfängerliste wurde erstellt. {0}Klicken Sie auf die Links unten, um Ihre E-Mail-Adressen ins E-Mail-Programm zu richten. @@ -398,9 +392,6 @@ Möchten Sie wirklich trotzdem fortsetzen? Bitte warten... - - Mögliche Profile für {0} - Zurück diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMJSResource.es.resx b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMJSResource.es.resx index bb04f83c3..f6b5c2df7 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMJSResource.es.resx +++ b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMJSResource.es.resx @@ -149,9 +149,6 @@ Toda la información introducida se perderá. ¿Está seguro(a) de que quiere continuar? - - Por favor, introduzca el nombre de su cuenta de Twitter. Por ejemplo, teamlabdotcom - País @@ -283,9 +280,6 @@ Fecha limite de acuerdo estimada - - Buscar cuenta de Twitter - La lista de destinatarios se ha generado. {0} Haga clic en los enlaces siguientes para pasar las direcciones de email para al programa de correo electrónico. @@ -400,9 +394,6 @@ Espere, por favor... - - Perfiles posibles para{0} - Anterior diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMJSResource.fi.resx b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMJSResource.fi.resx index 12bb1c700..462059a8b 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMJSResource.fi.resx +++ b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMJSResource.fi.resx @@ -149,9 +149,6 @@ Kaikki syötetyt tiedot menetetään. Oletko varma että haluat jatkaa? - - Anna Twitter tilisi nimi. - Nykyinen kuukausi @@ -278,9 +275,6 @@ Oletko varma että haluat jatkaa? Arvioitu sopimuksen määräpäivä - - Etsi Twitter-tili - Vastaanottajaluettelo on luotu. {0}Klikkaa allaolevia linkkejä siirtääksesi osoitteet sähköpostiohjelmaan. @@ -392,9 +386,6 @@ Oletko varma että haluat jatkaa? Ole hyvä ja odota... - - Mahdolliset profiilit - Edellinen diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMJSResource.fr.resx b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMJSResource.fr.resx index 33d3d5831..6b878fe91 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMJSResource.fr.resx +++ b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMJSResource.fr.resx @@ -149,9 +149,6 @@ Toute information saisie sera perdue. Continuer ? - - Veuillez entrer le nom de votre compte Twitter. Par exemple, teamlabdotcom - pays @@ -281,9 +278,6 @@ Continuer ? Date limite supposée - - Trouver le compte dans Twitter - Votre liste des destinataires a été générée. {0} Cliquez sur les liens ci-dessous pour passer vos adresses email dans le programme de messagerie. @@ -398,9 +392,6 @@ Continuer ? Veuillez patienter... - - Les profils possibles pour {0} - Précédent diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMJSResource.id.resx b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMJSResource.id.resx index 5ff10b7a9..ffa480b2e 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMJSResource.id.resx +++ b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMJSResource.id.resx @@ -145,9 +145,6 @@ Semua informasi yang dimasukkan akan hilang. Apakah Anda yakin ingin melanjutkan? - - Silakan masukkan nama akun Twitter Anda. Sebagai contoh, teamlabdotcom - Kesempatan @@ -262,9 +259,6 @@ Perkiraan kesepakatan tanggal jatuh tempo - - Temukan akun di Twitter - Daftar penerima Anda telah dihasilkan. {0} Klik tautan di bawah untuk melewati alamat email Anda ke program email. @@ -376,9 +370,6 @@ Silakan tunggu... - - Kemungkinan profil untuk {0} - Sebelumnya diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMJSResource.it.resx b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMJSResource.it.resx index 5f9b376e0..23d834d09 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMJSResource.it.resx +++ b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMJSResource.it.resx @@ -149,9 +149,6 @@ Tutte le informazioni inserite saranno perse. Continuare comunque? - - Inserisci il nome del tuo account Twitter. Per esempio, teamlabdotcom - Paese @@ -281,9 +278,6 @@ Continuare comunque? Scadenza stimata - - Cerca account in Twitter - E' stato generato l'elenco dei destinatari.{0}Clicca sui collegamenti qui sotto per far passare gl indirizzi email nel programa di posta elettronica. @@ -398,9 +392,6 @@ Continuare comunque? Per favore, attendi... - - Profili possibili per {0} - Precedente diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMJSResource.ja.resx b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMJSResource.ja.resx index 81cda4370..04d6701b1 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMJSResource.ja.resx +++ b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMJSResource.ja.resx @@ -140,9 +140,6 @@ 入力したすべての情報は失われます。 あなたは、このまま続行してもよろしいですか? - - あなたのTwitterアカウントの名前を入力してください。たとえば、teamlabdotcom - 機会 @@ -248,9 +245,6 @@ 推定契約期日 - - Twitterでアカウントを検索 - あなたの受信者リストが生成されました。 {0}はあなたの電子メールは電子メールプログラムに引き継がアドレス渡すには、以下のリンクをクリックしてください。 @@ -353,9 +347,6 @@ ページを再読み込みしてください - - のための可能なプロファイル{0} - プライマリー diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMJSResource.ka.resx b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMJSResource.ka.resx index 8ea4fa66e..8890a4919 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMJSResource.ka.resx +++ b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMJSResource.ka.resx @@ -91,9 +91,6 @@ დარწმუნებული ხართ, რომ გსურთ ამ დავალების წაშლა? - - შეიყვანეთ თქვენი Twitter ანგარიში. მაგალითად, teamlabdotcom - დარწმუნებული ხართ, რომ გსურთ '{0}' კომპანიის წაშლა? @@ -160,9 +157,6 @@ გარიგების დასრულების სავარაუდი თარიღი - - მოძებნე ანგარიში Twitter ზე - კონტაქტები @@ -211,9 +205,6 @@ გთხოვთ განაახლოთ გვერდი. - - შესაძლებელი პროფილები {0} -თვის - ძირითადი diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMJSResource.ko.resx b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMJSResource.ko.resx index 702361d0d..22b1ee4ff 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMJSResource.ko.resx +++ b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMJSResource.ko.resx @@ -139,9 +139,6 @@ 모든 입력 된 정보가 손실됩니다. 당신은 어쨌든 계속 하시겠습니까? - - 귀하의 트위터 계정의 이름을 입력하십시오. 예를 들어, teamlabdotcom - 영업기회 @@ -247,9 +244,6 @@ 예상 거래 기한 - - 트위터에 계정을 찾기 - 받는 사람 목록이 생성되었습니다. {0} 이메일 이메일 프로그램으로 주소를 전달하려면 아래의 링크를 클릭하십시오. @@ -352,9 +346,6 @@ 페이지를 새로 고침하세요 - - 에 대한 가능성이 프로필 {0} - 예비 선거 diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMJSResource.lt.resx b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMJSResource.lt.resx index 6602590c9..2a95e573f 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMJSResource.lt.resx +++ b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMJSResource.lt.resx @@ -149,9 +149,6 @@ Visa įvesta informacija bus prarasta. Ar tikrai norite tęsti? - - Nurodykite savo Twitter paskyros pavadinimą. Pavyzdžiui, teamlabdotcom - Einamasis mėnuo @@ -278,9 +275,6 @@ Ar tikrai norite tęsti? Numatoma sandorio užbaigimo data - - Rasti Twitter paskyrą - Adresatų sąrašas sugeneruotas. {0} Spauskite žemiau esančias nuorodas adresų persiuntimui į el. pašto programą. @@ -392,9 +386,6 @@ Ar tikrai norite tęsti? Prašome palaukti - - galimi profiliai {0} - Ankstesnis diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMJSResource.lv.resx b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMJSResource.lv.resx index 38f127616..2e22b6b12 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMJSResource.lv.resx +++ b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMJSResource.lv.resx @@ -149,9 +149,6 @@ Ievadītā informācija būs zaudēta. Vai tiešām vēlaties turpināt? - - Lūdzu, ievadiet jūsu Twitter konta nosaukumu. Piemēram, teamlabdotcom - Valsts @@ -281,9 +278,6 @@ Vai tiešām vēlaties turpināt? Paredzams darījuma izpildes datums - - Atrast Twitter kontu - Jūsu adresātu saraksts ir ģenerēts. {0}Noklikšķiniet uz saites zemāk, lai pāriet jūsu e-pasta adreses e-pasta programmu. @@ -395,9 +389,6 @@ Vai tiešām vēlaties turpināt? Lūdzu, uzgaidiet... - - Iespējamie profili {0} - Atpakaļ diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMJSResource.nl.resx b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMJSResource.nl.resx index 34f9642df..2d8b61918 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMJSResource.nl.resx +++ b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMJSResource.nl.resx @@ -149,9 +149,6 @@ Alle ingevoerde informatie zal verloren gaan. Weet u zeker dat u toch wilt doorgaan? - - Geef de naam van je Twitter-account. Bijvoorbeeld, teamlabdotcom - Land @@ -281,9 +278,6 @@ Weet u zeker dat u toch wilt doorgaan? Geschatte vervaldatum deal - - Account zoeken in Twitter - Uw ontvangerslijst is gegenereerd. {0} Klik op de links hieronder om uw e-mailadres in het e-mailprogramma te zetten. @@ -395,9 +389,6 @@ Weet u zeker dat u toch wilt doorgaan? Een ogenblik geduld... - - Mogelijke profielen voor {0} - Vorige diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMJSResource.pl.resx b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMJSResource.pl.resx index 9cea7687e..44c2db25e 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMJSResource.pl.resx +++ b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMJSResource.pl.resx @@ -149,9 +149,6 @@ Wszystkie wprowadzone informacje zostaną utracone. Czy na pewno chcesz dalej? - - Podaj nazwę Twojego konta w Twitter. Na przykład teamlabdotcom - Kraj @@ -281,9 +278,6 @@ Czy na pewno chcesz dalej? Prawdopodobna data finalizacji umowy - - Znajdź konto na Twitter - Twoja lista odbiorców została wygenerowana. {0} Kliknij poniższe linki, aby przesłać adresy e-mail do programu pocztowego. @@ -397,9 +391,6 @@ Czy na pewno chcesz dalej? Proszę czekać... - - Możliwe profile dla {0} - Poprzedni diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMJSResource.pt-BR.resx b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMJSResource.pt-BR.resx index 5f1c5f70f..f08f39c8c 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMJSResource.pt-BR.resx +++ b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMJSResource.pt-BR.resx @@ -149,9 +149,6 @@ Todas as informações inseridas serão perdidas. Você tem certeza de que deseja continuar de qualquer forma? - - Por favor, insira o nome da sua conta no Twitter. Por exemplo, teamlabdotcom - País @@ -281,9 +278,6 @@ Você tem certeza de que deseja continuar de qualquer forma? Data de conclusão de negócio estimada - - Encontrar conta no Twitter - Sua lista de destinatários foi gerada. {0} Clique nos links abaixo para enviar o seu endereço de e-mail para o programa de e-mail. @@ -398,9 +392,6 @@ Você tem certeza de que deseja continuar de qualquer forma? Aguarde... - - Perfis possíveis para {0} - Anterior diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMJSResource.pt.resx b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMJSResource.pt.resx index 1f1998f71..b5a19270c 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMJSResource.pt.resx +++ b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMJSResource.pt.resx @@ -140,9 +140,6 @@ Todas as informações inseridas serão perdidas. Continuar mesmo assim? - - Por favor, digite o nome da sua conta do Twitter. Por exemplo, teamlabdotcom - Oportunidade @@ -248,9 +245,6 @@ Continuar mesmo assim? Data de vencimento estimada do negócio - - Localizar conta no Twitter - A sua lista de destinatários foi gerada. {0} Clique nos links abaixo para passar o seu endereço de email para o programa de e-mail. @@ -353,9 +347,6 @@ Continuar mesmo assim? Por favor carregue a página - - Perfis possíveis para {0} - Primário diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMJSResource.resx b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMJSResource.resx index da9c0b9ce..011a8bc74 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMJSResource.resx +++ b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMJSResource.resx @@ -149,9 +149,6 @@ All the entered information will be lost. Are you sure you want to continue anyway? - - Please enter the name of your Twitter account. For example, teamlabdotcom - Country @@ -284,9 +281,6 @@ Are you sure you want to continue anyway? Estimated deal due date - - Find account in Twitter - Your recipient list has been generated. {0} Click the links below to pass your email addresses over to the email program. @@ -401,9 +395,6 @@ Are you sure you want to continue anyway? Please wait... - - Possible profiles for {0} - Previous diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMJSResource.ru.resx b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMJSResource.ru.resx index a2aa5187c..e9aa55880 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMJSResource.ru.resx +++ b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMJSResource.ru.resx @@ -149,9 +149,6 @@ Вся введенная информация будет потеряна. Вы уверены, что хотите продолжить? - - Введите название вашего Twitter аккаунта. Например, teamlabdotcom - Страна @@ -281,9 +278,6 @@ Предполагаемая дата закрытия - - Найти аккаунт в Twitter - Список получателей был сгенерирован. {0} Щелкните по ссылкам ниже, чтобы перенести адреса email в почтовую программу. @@ -398,9 +392,6 @@ Пожалуйста, подождите... - - Возможные профили для {0} - Назад diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMJSResource.sk.resx b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMJSResource.sk.resx index 9aeaba822..88b6f85bc 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMJSResource.sk.resx +++ b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMJSResource.sk.resx @@ -160,11 +160,6 @@ Všetky zadané informácie sa stratia. Určite chcete pokračovať? - - - - Zadajte prosím názov svojho Twitter účtu. Napríklad teamlabdotcom - @@ -343,11 +338,6 @@ Odhadované dátumy splatnosti obchodu - - - - Nájsť účet na Twitteri - @@ -490,11 +480,6 @@ Čakajte prosím... - - Možné profily pre {0} - - - Predchádzajúce diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMJSResource.sl.resx b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMJSResource.sl.resx index e5b15baac..a69fc9aee 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMJSResource.sl.resx +++ b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMJSResource.sl.resx @@ -146,9 +146,6 @@ Vse vnešene informacije bodo izgubljene. Ali ste prepričani, da želite vseeno nadaljevati? - - Prosim vnesi ime svojega Twitter računa. Na primer teamlabdotcom - Priložnost @@ -263,9 +260,6 @@ Ali ste prepričani, da želite vseeno nadaljevati? Ocenjen datum zapadlosti ponudbe - - Poišči račun v Twitteju - Vaš seznam prejemnikov je bil ustvarjen. {0} Pritisnite spodnje povezave in svoj e-poštni naslov predajte na email program. @@ -377,9 +371,6 @@ Ali ste prepričani, da želite vseeno nadaljevati? Prosim počakajte... - - Možni profili za {0} - Prejšnji diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMJSResource.sv.resx b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMJSResource.sv.resx index db76dbd58..ac73623ad 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMJSResource.sv.resx +++ b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMJSResource.sv.resx @@ -149,9 +149,6 @@ All angett data kommer förloras. Är du säker på att du vill fortsätta ändå? - - Vänligen ange namen på ditt TWitter-konto. Till exempel, teamlabdotcom - Land @@ -281,9 +278,6 @@ Beräknad förfallodatum för avtalet - - Hitta konto på Twitter - Din mottagareslista har genereras. {0} Klicka länkarna nedan för att skicka dina mejladresser över till mejlprogrammet. @@ -395,9 +389,6 @@ Vänligen vänta... - - Möjliga profiler för {0} - Föregående diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMJSResource.tr.resx b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMJSResource.tr.resx index ada5147d3..5ccc2774e 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMJSResource.tr.resx +++ b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMJSResource.tr.resx @@ -149,9 +149,6 @@ Tüm girilen bilgiler kaybolacaktır. Devam etmek istediğinizden emin misiniz? - - Lütfen Twitter hesabınızın ismini girin. Ör. teamlabdotcom - Ülke @@ -281,9 +278,6 @@ Devam etmek istediğinizden emin misiniz? Öngörülen anlaşma bitiş tarihi - - Twitter'dan hesap bul - Alıcı listeniz oluşturuldu. {0} Aşağıdaki bağlantılara tıklayarak eposta programına eposta adreslerini geçirebilirsiniz. @@ -395,9 +389,6 @@ Devam etmek istediğinizden emin misiniz? Lütfen bekleyin... - - {0} için olası profiller - Önceki diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMJSResource.uk.resx b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMJSResource.uk.resx index 8a01d4eff..3d67383b3 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMJSResource.uk.resx +++ b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMJSResource.uk.resx @@ -148,9 +148,6 @@ Уся введена інформація буде загублена. Ви упевнені, що хочете продовжити? - - Введіть назву вашого Twitter аккаунта. Наприклад, teamlabdotcom - Країна @@ -280,9 +277,6 @@ Передбачувана дата закриття угоди - - Знайти акаунт на Twitter - Ваш список одержувачів був створений. {0} Клацніть на посилання нижче, щоб передати свої електронні адреси в програму електронної пошти. @@ -394,9 +388,6 @@ Будь ласка, зачекайте.... - - Можливі профілі для {0} - Попередній diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMJSResource.vi.resx b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMJSResource.vi.resx index a4900c9d6..6dcaf93cf 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMJSResource.vi.resx +++ b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMJSResource.vi.resx @@ -148,9 +148,6 @@ Tất cả các thông tin đã nhập sẽ bị mất. Bạn có chắc là muốn tiếp tục? - - Vui lòng nhập tên tài khoản Twitter của bạn. Ví dụ, teamlabdotcom - Quốc gia @@ -280,9 +277,6 @@ Ngày kết thúc dự kiến - - Tìm tài khoản trong Twitter - Danh sách người nhận đã được tạo. {0} Nhấp vào liên kết dưới đây để chuyển các địa chỉ email của bạn qua chương trình email. @@ -394,9 +388,6 @@ Vui lòng chờ... - - Hồ sơ có thể có cho {0} - Trước diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMJSResource.zh-CN.resx b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMJSResource.zh-CN.resx index 90c1e4604..fcdb50ee6 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMJSResource.zh-CN.resx +++ b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMJSResource.zh-CN.resx @@ -149,9 +149,6 @@ 所有已输入的信息将会丢失。 您确定要继续吗? - - 请输入你的Twitter帐户。例如“teamlabdotcom” - 国家 @@ -281,9 +278,6 @@ 预计成交日期 - - 在Twitter上搜索帐户 - 已为您的收件人列表。{0}请单击下面的链接以传送到您的电邮软件。 @@ -395,9 +389,6 @@ 请稍候... - - 最接近 {0} 的账户 - 上一个 diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMJSResource.zh-TW.resx b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMJSResource.zh-TW.resx index 3b6fd23ca..b518764a9 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMJSResource.zh-TW.resx +++ b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMJSResource.zh-TW.resx @@ -150,9 +150,6 @@ 所有輸入的信息將丟失。 您確定要繼續嗎? - - 請輸入您的Twitter帳戶的名稱。例如,teamlabdotcom - 國家 @@ -282,9 +279,6 @@ 預計交易截止日期 - - 在Twitter中查找帳戶 - 您的收件人列表已生成。 {0}單擊下面的連結將您的電子郵件地址傳遞到電子郵件程序。 @@ -399,9 +393,6 @@ 請稍候... - - {0}的可能配置總則 - 前一個 diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMSocialMediaResource.Designer.cs b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMSocialMediaResource.Designer.cs deleted file mode 100644 index 4ac0e664e..000000000 --- a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMSocialMediaResource.Designer.cs +++ /dev/null @@ -1,180 +0,0 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// Runtime Version:4.0.30319.42000 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace ASC.Web.CRM.Resources { - using System; - - - /// - /// A strongly-typed resource class, for looking up localized strings, etc. - /// - // This class was auto-generated by the StronglyTypedResourceBuilder - // class via a tool like ResGen or Visual Studio. - // To add or remove a member, edit your .ResX file then rerun ResGen - // with the /str option, or rebuild your VS project. - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - public class CRMSocialMediaResource { - - private static global::System.Resources.ResourceManager resourceMan; - - private static global::System.Globalization.CultureInfo resourceCulture; - - [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] - internal CRMSocialMediaResource() { - } - - /// - /// Returns the cached ResourceManager instance used by this class. - /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - public static global::System.Resources.ResourceManager ResourceManager { - get { - if (object.ReferenceEquals(resourceMan, null)) { - global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("ASC.Web.CRM.Resources.CRMSocialMediaResource", typeof(CRMSocialMediaResource).Assembly); - resourceMan = temp; - } - return resourceMan; - } - } - - /// - /// Overrides the current thread's CurrentUICulture property for all - /// resource lookups using this strongly typed resource class. - /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - public static global::System.Globalization.CultureInfo Culture { - get { - return resourceCulture; - } - set { - resourceCulture = value; - } - } - - /// - /// Looks up a localized string similar to Be aware of what your clients think about your produce and brand in the social network. Simply link the twitter account with the contact and follow the tweet news feed right on your portal.. - /// - public static string EmptyContentTwitterAccountsDescribe { - get { - return ResourceManager.GetString("EmptyContentTwitterAccountsDescribe", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to No linked Twitter accounts. - /// - public static string EmptyContentTwitterAccountsHeader { - get { - return ResourceManager.GetString("EmptyContentTwitterAccountsHeader", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Internal error. - /// - public static string ErrorInternalServer { - get { - return ResourceManager.GetString("ErrorInternalServer", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Twitter account could not be found. - /// - public static string ErrorTwitterAccountNotFound { - get { - return ResourceManager.GetString("ErrorTwitterAccountNotFound", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Could not connect to Twitter. - /// - public static string ErrorTwitterConnectionFailure { - get { - return ResourceManager.GetString("ErrorTwitterConnectionFailure", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Maximal allowed number of requests to Twitter is exceeded. Try again later.. - /// - public static string ErrorTwitterRateLimit { - get { - return ResourceManager.GetString("ErrorTwitterRateLimit", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to The application has no Twitter access. Please reconnect the Twitter account.. - /// - public static string ErrorTwitterUnauthorized { - get { - return ResourceManager.GetString("ErrorTwitterUnauthorized", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Unknown Twitter account. - /// - public static string ErrorUnknownTwitterAccount { - get { - return ResourceManager.GetString("ErrorUnknownTwitterAccount", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Link Twitter account. - /// - public static string LinkTwitterAccount { - get { - return ResourceManager.GetString("LinkTwitterAccount", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to No accounts could be found. - /// - public static string NoAccountsHasBeenFound { - get { - return ResourceManager.GetString("NoAccountsHasBeenFound", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to No companies could be found. - /// - public static string NoCompaniesHasBeenFound { - get { - return ResourceManager.GetString("NoCompaniesHasBeenFound", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Please wait.... - /// - public static string PleaseWait { - get { - return ResourceManager.GetString("PleaseWait", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Twitter account is not connected. - /// - public static string SocialMediaAccountNotFoundTwitter { - get { - return ResourceManager.GetString("SocialMediaAccountNotFoundTwitter", resourceCulture); - } - } - } -} diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMSocialMediaResource.ar-AE.resx b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMSocialMediaResource.ar-AE.resx deleted file mode 100644 index 9800c8bed..000000000 --- a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMSocialMediaResource.ar-AE.resx +++ /dev/null @@ -1,79 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=5.0.6.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=5.0.6.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - كل على اطلاع بما يعتقدة عملائك عن منتجاتك او اسمك التجاري فقط قم بربط حسابات تويتر مع جهة الاتصال وتابع الاخبار والاحداث التي يتحدث عنها العميل - - - لا يوجد اي حساب تويتر مرتبط - - - اربط حساب تويتر - - - لا يمكن ايجاد اي حساب - - - لا يوجد اي شركات - - - الرجاء الانتظار ... - - \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMSocialMediaResource.az-Latn-AZ.resx b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMSocialMediaResource.az-Latn-AZ.resx deleted file mode 100644 index e6bbfd1c7..000000000 --- a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMSocialMediaResource.az-Latn-AZ.resx +++ /dev/null @@ -1,100 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=5.0.6.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=5.0.6.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Müştərilərinizin məhsul və brendiniz haqqında düşüncələrindən xəbərdar olun. Sadəcə müştərinizin Twitter hesabı ilə bağlantı qurun və sağ portalınızda lent xəbərlərini izləyin. - - - Bağlantılı Twitter hesabı yoxdur - - - Daxili xəta - - - Twitter hesabı tapılmadı - - - Twitter'ə qoşulmaq mümkün olmadı - - - Twitter-ə edilən sorğuların maksimum sayı keçilib. Biraz sonra yenidən cəhd edin. - - - Proqramın Twitter-ə girişi yoxdur. Twitter hesabını yenidən əlaqələndirin. - - - Naməlum Twitter hesabı - - - Twitter hesabına bağla - - - Heç bir hesab tapılmadı - - - Heç bir şirkət tapılmadı - - - Lütfən gözləyin... - - - Twitter hesabı əlaqələndirilməyib - - diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMSocialMediaResource.bg.resx b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMSocialMediaResource.bg.resx deleted file mode 100644 index ef79289b0..000000000 --- a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMSocialMediaResource.bg.resx +++ /dev/null @@ -1,100 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=5.0.6.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=5.0.6.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Бъдете наясно с това, което вашите клиенти мислят за вашата продукция и марка в социалната мрежа. Просто свържете профила в Twitter с контакта и следвайте подаването на чужди новини направо на портала си. - - - Няма свързани профили в Twitter - - - Вътрешна грешка - - - Профилът в Twitter не може да бъде намерен - - - Не може да се свърже с Twitter - - - Превишен е максималният допустим брой заявки за Twitter. Опитайте отново по-късно. - - - Приложението няма достъп до Twitter. Моля, свържете отново профила в Twitter. - - - Неизвестен профил в Twitter - - - Линк към профила в Twitter - - - Не бяха намерени профили - - - Не могат да бъдат намерени фирми - - - Моля Изчакай... - - - Профилът в Twitter не е свързан - - \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMSocialMediaResource.bs-BA.resx b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMSocialMediaResource.bs-BA.resx deleted file mode 100644 index 427bac21b..000000000 --- a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMSocialMediaResource.bs-BA.resx +++ /dev/null @@ -1,100 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=5.0.6.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=5.0.6.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Budite svjesni što vaši klijenti misle o vašem proizvodu i brendu na društvenoj mreži. Jednostavno povežite twitter račun sa kontaktom i pratite tweet news feed pravo na svom portalu. - - - Nema povezanih Twitter računa - - - Interna greška - - - Nije bilo moguće pronaći račun na Twitteru - - - Nije moguće povezivanje s Twitterom - - - Premašen je maksimalno dozvoljeni broj zahtjeva za Twitter. Pokušajte ponovo kasnije. - - - Aplikacija nema pristup Twitteru. Ponovo povežite Twitter račun. - - - Nepoznati Twitter račun - - - Povežite Twitter račun - - - Nije moguće pronaći nijedan račun - - - Nijedna kompanija nije moguća - - - Molimo pričekajte... - - - Twitter račun nije povezan - - \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMSocialMediaResource.ca.resx b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMSocialMediaResource.ca.resx deleted file mode 100644 index c9b84f36f..000000000 --- a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMSocialMediaResource.ca.resx +++ /dev/null @@ -1,79 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=5.0.6.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=5.0.6.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Estigueu al corrent del que pensen els vostres clients sobre els vostres productes i la vostra marca a les xarxes socials. Simplement, vinculeu el vostre compte de twitter amb el contacte i seguiu els tuits directament des del vostre portal. - - - No hi ha cap compte de Twitter vinculat - - - Vincular el compte de twitter - - - No s'han trobat comptes - - - No s'han trobat empreses - - - Espereu, si us plau... - - \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMSocialMediaResource.cs.resx b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMSocialMediaResource.cs.resx deleted file mode 100644 index 0ce680709..000000000 --- a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMSocialMediaResource.cs.resx +++ /dev/null @@ -1,100 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=5.0.6.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=5.0.6.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Uvědomte si, co si zákazníci myslí o vaší produkci a značce na sociální síti. Jednoduše propojte účet twitter s kontaktem a postupujte podle tweet news feed přímo na váš portál. - - - Bez propojení s Twitter účty - - - Interní chyba - - - Twitter účet nebyl nalezen - - - Nelze se připojit ke službě Twitter - - - Maximální povolený počet požadavků na službu Twitter je překročen. Zkuste to později. - - - Aplikace nemá přístup ke službě Twitter. Znovu připojte účet Twitter. - - - Neznámý účet Twitter - - - Link Twitter účet - - - Žádné účty lze nalézt - - - Nepodařilo se najít firmu - - - Čekejte prosím ... - - - Twitter účet není připojen - - \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMSocialMediaResource.da.resx b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMSocialMediaResource.da.resx deleted file mode 100644 index 1a16d8770..000000000 --- a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMSocialMediaResource.da.resx +++ /dev/null @@ -1,79 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=5.0.6.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=5.0.6.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Vær opmærksom på hvad dine klienter tænker om dine produkter og dit varemærke i de sociale netværk. Link din twitter konto til kontakten og følg tweet nyheds strømmen direkte her i din portal. - - - Ingen linkede twitter konti - - - Link med twitter konto - - - Kunne ikke finde nogen konti - - - Kunne ikke finde nogen firmaer - - - Vent venligst... - - \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMSocialMediaResource.de.resx b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMSocialMediaResource.de.resx deleted file mode 100644 index d3026e5cb..000000000 --- a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMSocialMediaResource.de.resx +++ /dev/null @@ -1,100 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=5.0.6.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=5.0.6.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Erfahren Sie, was Ihre Kunden zu Ihren Produkten und der Marke in den sozialen Netzwerken meinen. Verknüpfen Sie einfach das Twitter-Konto mit dem Kontakt und verfolgen Sie den Newsfeed direkt auf Ihrem Portal. - - - Keine verknüpften Twitter-Konten - - - Interner Fehler - - - Twitter-Konto ist nicht gefunden - - - Es konnte keine Verbindung zu Twitter hergestellt werden. - - - Die maximal zulässige Anzahl der Anfragen an Twitter wurde überschritten. Versuchen Sie es später noch einmal. - - - Die Anwendung hat keinen Zugriff auf Twitter. Bitte verknüpfen Sie das Twitter-Konto erneut. - - - Unbekanntes Twitter-Konto - - - Twitter-Konto verknüpfen - - - Keine Konten gefunden - - - Keine Unternehmen gefunden - - - Bitte warten... - - - Twitter-Konto ist nicht verknüpft. - - \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMSocialMediaResource.el.resx b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMSocialMediaResource.el.resx deleted file mode 100644 index 0e8f38701..000000000 --- a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMSocialMediaResource.el.resx +++ /dev/null @@ -1,100 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=5.0.6.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=5.0.6.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Να γνωρίζετε τι σκέφτονται οι πελάτες σας για τα προϊόντα και την επωνυμία σας στα κοινωνικά δίκτυα. Απλώς συνδέστε το λογαριασμό twitter με την επαφή και ακολουθήστε τη ροή ειδήσεων tweet απευθείας στο πόρταλ σας. - - - Δεν υπάρχουν συνδεδεμένοι λογαριασμοί Twitter - - - Εσωτερικό σφάλμα - - - Δεν ήταν δυνατή η εύρεση λογαριασμού Twitter - - - Αδυναμία σύνδεσης στο Twitter - - - Υπέρβαση του μέγιστου επιτρεπόμενου αριθμού αιτημάτων στο Twitter. Προσπαθήστε ξανά αργότερα. - - - Η εφαρμογή δεν έχει πρόσβαση στο Twitter. Παρακαλούμε συνδέστε ξανά το λογαριασμό Twitter. - - - Άγνωστος λογαριασμός Twitter - - - Σύνδεση λογαριασμού Twitter - - - Δεν βρέθηκαν λογαριασμοί - - - Δεν βρέθηκαν εταιρείες - - - Παρακαλούμε περιμένετε... - - - Ο λογαριασμός Twitter δεν είναι συνδεδεμένος - - \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMSocialMediaResource.es.resx b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMSocialMediaResource.es.resx deleted file mode 100644 index f61145fb1..000000000 --- a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMSocialMediaResource.es.resx +++ /dev/null @@ -1,100 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=5.0.6.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=5.0.6.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Sea consciente de lo que opinan sus clientes sobre sus productos y marca en la red social. Simplemente vincule la cuenta de Twitter con el contacto y siga las noticias Tweet directo en su portal. - - - Ningunas cuentas de Twitter vinculadas - - - Error interno - - - No puedo encontrarse la cuenta de Twitter - - - No pudo conectar a Twitter - - - Máximo número de peticiones a Twitter excedido. Por favor intente más tarde. - - - La aplicación no tiene acceso a Twitter. Por favor vuelva a conectar la cuenta de Twitter. - - - Cuenta de Twitter desconocida - - - Vincular cuenta de twitter - - - No se puede encontrar ningunas cuentas - - - No se puede encontrar ningunas empresas - - - Por favor espere... - - - La cuenta de Twitter no está conectada - - \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMSocialMediaResource.et.resx b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMSocialMediaResource.et.resx deleted file mode 100644 index 36f7c92db..000000000 --- a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMSocialMediaResource.et.resx +++ /dev/null @@ -1,76 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=5.0.6.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=5.0.6.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Seotud twitter'i konto puudub - - - Seo twitter'i konto - - - Kontot ei leitud - - - Ettevõttet ei leitud - - - Palun oota... - - \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMSocialMediaResource.fa.resx b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMSocialMediaResource.fa.resx deleted file mode 100644 index d0875c00e..000000000 --- a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMSocialMediaResource.fa.resx +++ /dev/null @@ -1,76 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=5.0.6.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=5.0.6.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - هیچ حساب Twitter ای لینک نشده است - - - لینک کردن حساب تویتر - - - هیچ حسابی یافت نشد - - - هیچ شرکتی یافت نشد - - - لطفاً منتظر بمانید... - - \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMSocialMediaResource.fi.resx b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMSocialMediaResource.fi.resx deleted file mode 100644 index b28bf5907..000000000 --- a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMSocialMediaResource.fi.resx +++ /dev/null @@ -1,79 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=5.0.6.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=5.0.6.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Pysy ajan tasalla siitä, mitä kontaktisi ajattelevat tuotteistasi ja yrityskuvastasi sosiaalisessa mediassa. Linkitä kontakti Twitter-tiliin ja seuraa tweet uutissyötettä suoraan portaalissasi. - - - Ei linkitettyjä Twitter-tilejä - - - Linkitä Twitter-tiliin - - - Tilejä ei löytynyt - - - Yrityksiä ei löytynyt - - - Ole hyvä ja odota... - - \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMSocialMediaResource.fr.resx b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMSocialMediaResource.fr.resx deleted file mode 100644 index de01848c0..000000000 --- a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMSocialMediaResource.fr.resx +++ /dev/null @@ -1,100 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=5.0.6.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=5.0.6.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Soyez au courant de ce que vos clients disent au sujet de vos produits et votre marque dans le réseau social. Tout simplement liez le compte Twitter avec le contact et suivez le fil de nouvelles directement sur le portail. - - - Aucun compte Twitter lié - - - Erreur interne - - - Le compte Twitter ne peut pas être trouvé - - - Impossible de se connecter à Twitter - - - Le nombre maximal de demandes à Twitter est dépassé. Essayez encore une fois plus tard. - - - L'application n'a pas d'accès à Twitter. Reconnectez le compte Twitter. - - - Un compte Twitter inconnu - - - Lier le compte Twitter - - - Aucun compte trouvé - - - Aucune entreprise trouvé - - - Veuillez patienter... - - - Le compte Twitter n'est pas connecté - - \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMSocialMediaResource.hr.resx b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMSocialMediaResource.hr.resx deleted file mode 100644 index 1ecf11656..000000000 --- a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMSocialMediaResource.hr.resx +++ /dev/null @@ -1,70 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=5.0.6.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=5.0.6.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Korisnički račun nije pronađen - - - Tražena tvrtka nije pronađena - - - Molimo pričekajte... - - \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMSocialMediaResource.hu.resx b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMSocialMediaResource.hu.resx deleted file mode 100644 index 2c66f95b5..000000000 --- a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMSocialMediaResource.hu.resx +++ /dev/null @@ -1,61 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMSocialMediaResource.id.resx b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMSocialMediaResource.id.resx deleted file mode 100644 index 85e57906c..000000000 --- a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMSocialMediaResource.id.resx +++ /dev/null @@ -1,79 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=5.0.6.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=5.0.6.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - waspasda apa yang klien Anda pikirkan tentang produk dan merek di jaringan sosial. Cukup menghubungkan akun twitter dengan kontak dan mengikuti berita langsung di portal Anda. - - - tidak ada akun twitter terkait - - - tautkan akun Twitter - - - tidak ada akun dapat ditemukan - - - tidak ada perusahaan dapat ditemukan - - - Silakan tunggu... - - \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMSocialMediaResource.it.resx b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMSocialMediaResource.it.resx deleted file mode 100644 index 6cfd6ba55..000000000 --- a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMSocialMediaResource.it.resx +++ /dev/null @@ -1,100 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=5.0.6.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=5.0.6.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Scopri cosa pensano i tuoi clienti dei tuoi prodotti e della tua marca nelle reti sociali. Basta collegare l'account Twitter al contatto e seguire le ultime notizie twittate direttamente nel tuo portale. - - - Nessun account Twitter collegato - - - Errore interno - - - Nessun account Twitter trovato - - - Impossibile connettersi a Twitter - - - E stato superato il numero di richieste a Twitter massimo autorizzato. Riprova più tardi. - - - L'applicazione non ha accesso a Twitter. Connetti l'account Twitter di nuovo. - - - Account Twitter sconosciuto - - - Collega account Twitter - - - Nessun account trovato - - - Nessun azienda trovata - - - Per favore, aspetta... - - - L'account Twitter non è connesso - - \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMSocialMediaResource.ja.resx b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMSocialMediaResource.ja.resx deleted file mode 100644 index 7afbacf8e..000000000 --- a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMSocialMediaResource.ja.resx +++ /dev/null @@ -1,79 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=5.0.6.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=5.0.6.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - あなたのクライアントはソーシャルネットワークでの食材やブランドについてどう思っているかに注意する必要があります。単に連絡先とTwitterのアカウントをリンクして、右のポータルにつぶやきニュースフィードに従ってください。 - - - リンクされたTwitterアカウントません - - - リンクtwitterアカウント - - - 該当するアカウントが見つかりませんでした - - - いいえ会社が見つかりませんでした - - - しばらくお待ちください... - - \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMSocialMediaResource.ka.resx b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMSocialMediaResource.ka.resx deleted file mode 100644 index 8abb75b3a..000000000 --- a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMSocialMediaResource.ka.resx +++ /dev/null @@ -1,70 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=5.0.6.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=5.0.6.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - ანგარიში არ მოიძებნა - - - კომპანიები არ მოიძებნა - - - გტხოვთ დაიცადოთ... - - \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMSocialMediaResource.ko.resx b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMSocialMediaResource.ko.resx deleted file mode 100644 index 2ecc0497f..000000000 --- a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMSocialMediaResource.ko.resx +++ /dev/null @@ -1,79 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=5.0.6.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=5.0.6.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 고객이 제품과 브랜드에 대하여 소셜네트웨그에서 어떻게 생각하는지 알고자 한다면, 트위터 계정을 연락처와 연결하고 팔로우하여 포털에서 트윗 뉴스를 구독합니다. - - - 연결 된 twitter 계정이 없습니다. - - - twitter 계정 연결 - - - 계정을 찾을 수 없습니다. - - - 회사를 찾을 수 없습니다. - - - 잠시만 기다려 주십시오... - - \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMSocialMediaResource.lt.resx b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMSocialMediaResource.lt.resx deleted file mode 100644 index 83a912505..000000000 --- a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMSocialMediaResource.lt.resx +++ /dev/null @@ -1,79 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=5.0.6.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=5.0.6.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Sužinokite, ką Jūsų klientai galvoja apie Jūsų produkciją ir prekinį ženklą socialiniuose tinkluose. Tiesiog susiekite twitter paskyrą su kontaktu ir sekite įrašų srautą savo portale. - - - Nėra susietų twitter paskyrų - - - Susieti su twitter paskyra - - - Nerasta jokių paskirų - - - Nerasta jokių kompanijų - - - Prašome palaukti... - - \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMSocialMediaResource.lv.resx b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMSocialMediaResource.lv.resx deleted file mode 100644 index f50f13f7c..000000000 --- a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMSocialMediaResource.lv.resx +++ /dev/null @@ -1,100 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=5.0.6.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=5.0.6.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Esi informēts par to ko jūsu klienti doma par produkcijam un zīmolu sociālos tīklos. Vienkārši saistiet twitter kontu ar kontaktpersonu un sekojiet ziņam no twittera tieši jūsu portālā. - - - Nav saistīta twitter konta - - - Iekšējā kļūda - - - Nav atrasts Twitter konts - - - Neizdevās pieslēgties Twitter - - - Ir pārsniegts maksimālais atļautais Twitter pieprasījumu skaits. Mēģiniet vēlāk vēlreiz. - - - Lietotnei nav piekļuves Twitter. Lūdzu, atkārtoti pieslēdzieties Twitter kontam. - - - Nezināms Twitter konts - - - Saistīt twitter kontu - - - Nevar atrast nevienu kontu - - - Nevar atrast nevienu uzņēmumu - - - Lūdzu, uzgaidiet ... - - - Twitter konts nav pieslēgts - - \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMSocialMediaResource.nl.resx b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMSocialMediaResource.nl.resx deleted file mode 100644 index 12a4543b1..000000000 --- a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMSocialMediaResource.nl.resx +++ /dev/null @@ -1,100 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=5.0.6.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=5.0.6.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Ben je bewust van de mening van je klanten over je producten en merken in de sociale netwerken! Koppel het twitter account aan de contactpersoon en volg de tweets direct in je portal. - - - Geen gekoppelde twitter accounts - - - Interne fout - - - Twitter-account kon niet worden gevonden - - - Kon geen verbinding maken met Twitter - - - Maximaal aantal toegestane verzoeken voor Twitter is overschreden. Probeer het later nog eens. - - - De applicatie heeft geen toegang tot Twitter. Maak alstublieft opnieuw verbinding met het Twitter-account. - - - Onbekend Twitter-account - - - Link twitter-account - - - Geen accounts gevonden - - - Geen bedrijven gevonden - - - Een ogenblik geduld... - - - Twitter-account is niet verbonden - - \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMSocialMediaResource.pl.resx b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMSocialMediaResource.pl.resx deleted file mode 100644 index ad8b52b85..000000000 --- a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMSocialMediaResource.pl.resx +++ /dev/null @@ -1,100 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=5.0.6.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=5.0.6.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Pamiętaj, co Twoi klienci myślą o swoich produktach i marce w sieci społecznościowej. Wystarczy połączyć konto Twitter z kontaktem i śledzić za tweet wiadomościami bezpośrednio na portalu. - - - Brak powiązanych kont Twitter - - - Błąd wewnętrzny - - - Nie można znaleźć konta Twitter - - - Nie można połączyć się z Twitterem - - - Maksymalna dozwolona liczba zgłoszeń do serwisu Twitter jest przekroczona. Spróbuj ponownie później. - - - Aplikacja nie ma dostępu do serwisu Twitter. Proszę ponownie podłączyć konto Twitter. - - - Nieznane konto Twitter - - - Połącz konto Twitter - - - Nie można znaleźć konta - - - Nie można znaleźć firmy - - - Proszę czekać... - - - Konto Twitter nie jest połączone - - \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMSocialMediaResource.pt-BR.resx b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMSocialMediaResource.pt-BR.resx deleted file mode 100644 index bfee85d26..000000000 --- a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMSocialMediaResource.pt-BR.resx +++ /dev/null @@ -1,100 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=5.0.6.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=5.0.6.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Fique ciente do que seus clientes pensam sobre seu produto e marca na rede social. Basta vincular a conta do twitter com o contato e seguir os feed de notícia tweet diretamente em seu portal. - - - Não há contas de Twitter vinculadas - - - Erro interno - - - Conta do Twitter não foi encontrada - - - Não foi possível conectar com Twitter - - - Número máximo de solicitações para Twitter permitido foi excedido. Tente novamente depois. - - - O aplicativo não tem acesso ao Twitter. Reconecte a conta do Twitter. - - - Conta do Twitter desconhecida - - - Vincule uma conta do Twitter - - - Nenhuma conta foi encontrada - - - Nenhuma empresa foi encontrada - - - Aguarde... - - - A conta do Twitter não está conectada - - \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMSocialMediaResource.pt.resx b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMSocialMediaResource.pt.resx deleted file mode 100644 index d7a57de99..000000000 --- a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMSocialMediaResource.pt.resx +++ /dev/null @@ -1,79 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=5.0.6.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=5.0.6.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Informe-se do que seus clientes pensam sobre o seu produto e marca na rede social. Ligue simplesmente a conta do twitter com o contato e siga as notícias no seu portal. - - - Não há contas de twitter associadas - - - Ligar conta do twitter - - - Não foi encontrada nenhuma conta - - - Não foi encontrada nenhuma empresa - - - Por favor aguarde ... - - \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMSocialMediaResource.resx b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMSocialMediaResource.resx deleted file mode 100644 index b3dc130d0..000000000 --- a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMSocialMediaResource.resx +++ /dev/null @@ -1,100 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=5.0.6.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=5.0.6.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Be aware of what your clients think about your produce and brand in the social network. Simply link the twitter account with the contact and follow the tweet news feed right on your portal. - - - No linked Twitter accounts - - - Internal error - - - Twitter account could not be found - - - Could not connect to Twitter - - - Maximal allowed number of requests to Twitter is exceeded. Try again later. - - - The application has no Twitter access. Please reconnect the Twitter account. - - - Unknown Twitter account - - - Link Twitter account - - - No accounts could be found - - - No companies could be found - - - Please wait... - - - Twitter account is not connected - - \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMSocialMediaResource.ro.resx b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMSocialMediaResource.ro.resx deleted file mode 100644 index 40f52a4dd..000000000 --- a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMSocialMediaResource.ro.resx +++ /dev/null @@ -1,100 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=5.0.6.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=5.0.6.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Fiți conștienți de ce cred clienții dvs. despre produsele și marca dvs. pe rețeaua de socializare. Pur și simplu conectați contul de twitter cu contactul și urmați fluxul de știri de pe tweet chiar pe portalul dvs. - - - Nu există conturi Twitter atașate - - - Eroare internă - - - Contul Twitter nu a fost găsit - - - Nu s-a putut conecta la Twitter - - - Numărul maxim de solicitări către Twitter este depășit. Încercați mai târziu. - - - Aplicația nu are acces pe Twitter. Vă rugăm să reconectați contul de Twitter. - - - Cont Twitter necunoscut - - - Atașează contul de Twitter - - - Nu s-au găsit conturi - - - Nu a fost găsită nicio companie - - - Vă rugăm așteptați... - - - Contul Twitter nu este conectat - - \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMSocialMediaResource.ru.resx b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMSocialMediaResource.ru.resx deleted file mode 100644 index da3c4411c..000000000 --- a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMSocialMediaResource.ru.resx +++ /dev/null @@ -1,100 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=5.0.6.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=5.0.6.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Будьте в курсе того, что думают о вашей продукции и бренде ваши клиенты в социальной сети. Просто привяжите к контакту аккаунт Twitter и следите за лентой новостей прямо на своем портале. - - - Нет связанных аккаунтов Twitter - - - Внутренняя ошибка - - - Аккаунт Twitter не найден - - - Не удалось подключиться к Twitter - - - Превышено максимально допустимое количество запросов к Twitter. Повторите попытку позже. - - - У приложения нет доступа к Twitter. Пожалуйста, подключите аккаунт Twitter повторно. - - - Неизвестный аккаунт Twitter - - - Привязать аккаунт Twitter - - - Аккаунты не найдены - - - Компании не найдены - - - Пожалуйста, подождите... - - - Аккаунт Twitter не подключен - - \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMSocialMediaResource.sk.resx b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMSocialMediaResource.sk.resx deleted file mode 100644 index 0f88aadd4..000000000 --- a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMSocialMediaResource.sk.resx +++ /dev/null @@ -1,114 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=5.0.6.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=5.0.6.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Buďte si vedomí toho, čo si klienti myslia o vašej produkcii a značke na sociálnej sieti. Jednoducho prepojte účet twitter s kontaktom a postupujte podľa tweet news feed priamo na vašom portáli. - - - - Bez prepojenia s twitter účtami - - - Interná chyba - - - Účet Twitter nebol nájdený - - - - - Nepodarilo sa pripojiť k službe Twitter - - - - - Maximálny povolený počet žiadostí na Twitter je prekročený. Skúste to neskôr. - - - - Aplikácia nemá prístup k službe Twitter. Znova pripojte účet služby Twitter. - - - - - Neznámy Twitter účet - - - Prepojiť účet Twitter - - - - - Neboli nájdené žiadne účty - - - - - Neboli nájdené žiadne spoločnosti - - - - - Čakajte prosím - - - Účet Twitter nie je pripojený - - \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMSocialMediaResource.sl.resx b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMSocialMediaResource.sl.resx deleted file mode 100644 index a9f741a97..000000000 --- a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMSocialMediaResource.sl.resx +++ /dev/null @@ -1,79 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=5.0.6.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=5.0.6.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Zavedajte se kaj vaše stranke menijo o postopku in znamki na družbenih omrežjih. Preprosto povežite twitter račun z kontaktom in sledite tweetom neposredno na svojem portalu. - - - ni povezanih twitter računov - - - Poveži Twitter račun - - - Nobenega računa ni bilo mogoče najti - - - Nobenega podjetja ni bilo mogoče najti - - - Prosim počakajte... - - \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMSocialMediaResource.sv.resx b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMSocialMediaResource.sv.resx deleted file mode 100644 index 791b724fa..000000000 --- a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMSocialMediaResource.sv.resx +++ /dev/null @@ -1,100 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=5.0.6.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=5.0.6.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Få kännedom om vad dina kunder säger om din produkt och ditt märke i sociala nätverk. Bara länka twitter-kontot med kontakten och följ tweet nyhetsflödets direkt på din portal. - - - Inga länkade Twitter-konton - - - Intern fel - - - Twitter-kontot hittades ej - - - Kunde inte ansluta till Twitter - - - Det maximala antalet förfrågningar till Twitter har överskridits. Försök igen senare. - - - Applikationen kan inte nå Twitter. Vänligen återansluta Twitter-kontot. - - - Okänt Twitter-konto - - - Länka Twitter konto - - - Inga konton hittades - - - Inga företag hittades - - - Vänligen vänta... - - - Twitter-kontot är inte anslutet - - \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMSocialMediaResource.tr.resx b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMSocialMediaResource.tr.resx deleted file mode 100644 index 05cf7b595..000000000 --- a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMSocialMediaResource.tr.resx +++ /dev/null @@ -1,100 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=5.0.6.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=5.0.6.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Müşterilerinizin ürün ve markanız hakkında düşüncelerinin farkında olun. Basitçe, müşterinizin Twitter hesabı ile bağlantı kurun ve sağ portalınızda besleme haberleri izleyin. - - - Bağlantılı Twitter hesabı yok - - - İçsel bir hata - - - Twitter hesabı bulunamadı - - - Twitter'a bağlanılamıyor - - - İzin verilen maksimum Twitter talep sayısı aşıldı. Daha sonra tekrar deneyin. - - - Uygulamanın Twitter erişimi yok. Lütfen Twitter hesabını tekrar bağlayın. - - - Bilinmeyen Twitter hesabı - - - Twitter hesabı ile bağla - - - Hiçbir hesap bulunamadı - - - Hiçbir şirket bulunamadı - - - Lütfen bekleyin... - - - Twitter hesabı bağlı değil - - \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMSocialMediaResource.uk.resx b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMSocialMediaResource.uk.resx deleted file mode 100644 index 8d9fe7de8..000000000 --- a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMSocialMediaResource.uk.resx +++ /dev/null @@ -1,101 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=5.0.6.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=5.0.6.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Дізнайтеся думку ваших клієнтів про ваші продукти та бренд у соціальній мережі. Просто зв'яжіть обліковий запис Twitter із контактом і слідуйте за каналом новин Twitter безпосередньо на порталі. - - - - Немає підключених акаунтів Twitter - - - Внутрішня помилка - - - Акаунт Twitter не знайдено - - - Неможливо підключитися до Twitter - - - Максимально дозволене число запитів до Twitter перевищено. Спробуйте ще раз пізніше. - - - Додаток не має доступу до Twitter. Будь ласка, знову підключіть обліковий запис Twitter. - - - Невідомий акаунт Twitter - - - Прив'язати аккаунт Twitter - - - Акаунти не знайдені - - - Компанії не знайдені - - - Будь ласка, зачекайте... - - - Акаунт Twitter не підключено - - \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMSocialMediaResource.vi.resx b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMSocialMediaResource.vi.resx deleted file mode 100644 index 327c011ef..000000000 --- a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMSocialMediaResource.vi.resx +++ /dev/null @@ -1,100 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=5.0.6.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=5.0.6.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Để khách hàng nhận biết sản phẩm và thương hiệu của bạn trên mạng xã hội. Đơn giản chỉ cần liên kết tài khoản twitter với địa chỉ liên hệ và theo dõi các tweet ngay trên cổng thông tin của bạn. - - - Không có tài khoản Twitter được liên kết - - - Lỗi máy chủ nội bộ - - - Không thể tìm thấy tài khoản Twitter - - - Không thể kết nối Twitter - - - Vượt quá số lượng tối đa yêu cầu cho phép của Twitter. Thử lại sau. - - - Ứng dụng không có quyền truy cập Twitter. Vui lòng kết nối lại tài khoản Twitter. - - - Tài khoản Twitter không xác định - - - Liên kết với tài khoản Twitter - - - Không tìm thấy tài khoản nào - - - Không tìm thấy công ty nào - - - Vui lòng chờ... - - - Tài khoản Twitter không được kết nối - - \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMSocialMediaResource.zh-CN.resx b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMSocialMediaResource.zh-CN.resx deleted file mode 100644 index 728a4fc4f..000000000 --- a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMSocialMediaResource.zh-CN.resx +++ /dev/null @@ -1,100 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=5.0.6.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=5.0.6.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 将客户的Twitter账户加入联系信息后,系统就会自动为您读取TA的最新动态并实时显示在联系页中。 - - - 没有链接Twitter帐号 - - - 内部错误 - - - 找不到Twitter账户 - - - 无法连接到Twitter - - - 超出允许的Twitter请求的最大数量。请稍后再试。 - - - 该应用程序无Twitter访问权限。请重新连接Twitter账户。 - - - 未知的Twitter账户 - - - 链接Twitter账号 - - - 找不到符合条件的账户 - - - 找不到符合条件的企业 - - - 请稍候…… - - - Twitter账户未连接 - - \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMSocialMediaResource.zh-TW.resx b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMSocialMediaResource.zh-TW.resx deleted file mode 100644 index 5584d8dc3..000000000 --- a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMSocialMediaResource.zh-TW.resx +++ /dev/null @@ -1,100 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=5.0.6.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=5.0.6.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 注意您的客戶在社交網絡中對您的產品和品牌的看法。只需將Twitter帳戶與聯繫人連接,然後按照門戶網站上的tweet新聞提要。 - - - 沒有關聯的Twitter 帳戶 - - - 內部錯誤 - - - 找不到Twitter帳戶 - - - 無法連接到Twitter - - - 超過了允許的最大Twitter請求數。稍後再試。 - - - 該應用程序沒有Twitter存取權限。請重新連接Twitter帳戶。 - - - 未知的Twitter帳戶 - - - 連結Twitter帳戶 - - - 找不到帳戶 - - - 找不到公司 - - - 請稍候... - - - Twitter帳戶未連接 - - \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Templates/ContactsTemplates.html b/web/studio/ASC.Web.Studio/Products/CRM/Templates/ContactsTemplates.html index 6b5aa9c4a..9618cf21c 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Templates/ContactsTemplates.html +++ b/web/studio/ASC.Web.Studio/Products/CRM/Templates/ContactsTemplates.html @@ -224,54 +224,6 @@ - - - - -F - - - - - \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Utils/ExportToCSV.cs b/web/studio/ASC.Web.Studio/Products/CRM/Utils/ExportToCSV.cs index 11a01c33f..0880273fa 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Utils/ExportToCSV.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Utils/ExportToCSV.cs @@ -115,8 +115,10 @@ public ExportDataOperation(FilterObject filterObject, string fileName) FileUrl = null; } + /// + /// Constructor for serialization/deserialization public properties (redis cache) + /// public ExportDataOperation() - : this(null, null) { } diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Utils/Import/CSV/ImportDataOperation.cs b/web/studio/ASC.Web.Studio/Products/CRM/Utils/Import/CSV/ImportDataOperation.cs index ff6cdee04..0e79df9d8 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Utils/Import/CSV/ImportDataOperation.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Utils/Import/CSV/ImportDataOperation.cs @@ -97,8 +97,10 @@ public partial class ImportDataOperation : IProgressItem { #region Constructor + /// + /// Constructor for serialization/deserialization public properties (redis cache) + /// public ImportDataOperation() - : this(EntityType.Contact, String.Empty, String.Empty) { } diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Utils/MailSender.cs b/web/studio/ASC.Web.Studio/Products/CRM/Utils/MailSender.cs index 9992d648e..5bfa427ab 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Utils/MailSender.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Utils/MailSender.cs @@ -79,8 +79,10 @@ class SendBatchEmailsOperation : IProgressItem, IDisposable public bool IsCompleted { get; set; } + /// + /// Constructor for serialization/deserialization public properties (redis cache) + /// private SendBatchEmailsOperation() - : this(new List(), new List(), String.Empty, String.Empty, false) { } diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Utils/PdfCreator.cs b/web/studio/ASC.Web.Studio/Products/CRM/Utils/PdfCreator.cs index 574b4472c..22d147827 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Utils/PdfCreator.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Utils/PdfCreator.cs @@ -144,7 +144,7 @@ private static string GetUrlToFile(Stream docxStream) var revisionId = DocumentServiceConnector.GenerateRevisionId(Guid.NewGuid().ToString()); string urlToFile; - DocumentServiceConnector.GetConvertedUri(externalUri, FormatDocx, FormatPdf, revisionId, null, null, null, null, false, out urlToFile); + DocumentServiceConnector.GetConvertedUri(externalUri, FormatDocx, FormatPdf, revisionId, null, null, null, null, false, out urlToFile, out _); Log.DebugFormat("PdfCreator. GetUrlToFile. urlToFile = {0}", urlToFile); return urlToFile; @@ -159,7 +159,7 @@ public static ConverterData StartCreationFileAsync(Invoice data) var revisionId = DocumentServiceConnector.GenerateRevisionId(Guid.NewGuid().ToString()); string urlToFile; - DocumentServiceConnector.GetConvertedUri(externalUri, FormatDocx, FormatPdf, revisionId, null, null, null, null, true, out urlToFile); + DocumentServiceConnector.GetConvertedUri(externalUri, FormatDocx, FormatPdf, revisionId, null, null, null, null, true, out urlToFile, out _); return new ConverterData { @@ -178,7 +178,7 @@ public static File GetConvertedFile(ConverterData data, DaoFactory daoFactory) } string urlToFile; - DocumentServiceConnector.GetConvertedUri(data.StorageUrl, FormatDocx, FormatPdf, data.RevisionId, null, null, null, null, true, out urlToFile); + DocumentServiceConnector.GetConvertedUri(data.StorageUrl, FormatDocx, FormatPdf, data.RevisionId, null, null, null, null, true, out urlToFile, out _); if (string.IsNullOrEmpty(urlToFile)) { diff --git a/web/studio/ASC.Web.Studio/Products/CRM/js/contacts.js b/web/studio/ASC.Web.Studio/Products/CRM/js/contacts.js index 228adc9f2..c7fad8dda 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/js/contacts.js +++ b/web/studio/ASC.Web.Studio/Products/CRM/js/contacts.js @@ -1009,7 +1009,19 @@ ASC.CRM.ListContactView = (function() { if (typeof (ASC.CRM.ListContactView.basePathMail) == "undefined") { ASC.CRM.ListContactView.basePathMail = ASC.CRM.Common.getMailModuleBasePath(); } - + if (window.contactForInitTaskActionPanel != null && contactID == window.contactForInitTaskActionPanel.id) { + if (email == "") { + jq("#simpleContactActionMenu").addClass("display-none"); + jq("#simpleContactMenu_" + contactID).hide(); + } + else { + jq("#simpleContactActionMenu .unlinkContact").addClass("display-none"); + } + } + else { + jq("#simpleContactActionMenu").removeClass("display-none"); + jq("#simpleContactActionMenu .unlinkContact").removeClass("display-none"); + } if (email != "") { var pathCreateEmail = [ ASC.CRM.ListContactView.basePathMail, @@ -1025,7 +1037,7 @@ ASC.CRM.ListContactView = (function() { "/sortorder=descending/" ].join(''); - jq("#simpleContactActionMenu .writeEmail").attr("href", pathCreateEmail); + jq("#simpleContactActionMenu .writeEmail").attr("href", pathCreateEmail).removeClass("display-none"); jq("#simpleContactActionMenu .viewMailingHistory").attr("href", pathSortEmails).removeClass("display-none"); } else { jq("#simpleContactActionMenu .writeEmail").addClass("display-none"); @@ -1640,8 +1652,10 @@ ASC.CRM.ListContactView = (function() { }, render_simple_content: function(params, contacts) { + var parentContactId = window.contactForInitTaskActionPanel && window.contactForInitTaskActionPanel.id; for (var i = 0, n = contacts.length; i < n; i++) { ASC.CRM.Common.contactItemFactory(contacts[i], params); + contacts[i].showActionMenu = contacts[i].showActionMenu && (contacts[i].primaryEmail != null || contacts[i].id != parentContactId) } jq(window).trigger("getContactsFromApi", [contacts]); jq.tmpl("simpleContactTmpl", contacts).prependTo("#contactTable tbody"); @@ -2350,6 +2364,10 @@ ASC.CRM.ListContactView = (function() { ASC.CRM.ContactPhotoUploader = (function() { return { + init: function (defaultAvatarSrc) { + ASC.CRM.ContactPhotoUploader.defaultAvatarSrc = defaultAvatarSrc; + }, + initPhotoUploader: function(parentDialog, photoImg, data) { var a = new AjaxUpload('changeLogo', { action: 'ajaxupload.ashx?type=ASC.Web.CRM.Classes.ContactPhotoHandler,ASC.Web.CRM', @@ -2401,6 +2419,63 @@ ASC.CRM.ContactPhotoUploader = (function() { isInPopup: true, name: "changeLogo" }); + }, + + openLoadPhotoWindow: function () { + + var $link = jq(".linkChangePhoto"); + + if (!$link.length || $link.hasClass("disable")) { + return; + } + + var curAvatarSrc = jq("img.contact_photo").attr("src"); + + var isDefaultAvatar = curAvatarSrc.indexOf(ASC.CRM.ContactPhotoUploader.defaultAvatarSrc + '?') == 0; + + jq("#divLoadPhotoDefault").toggleClass("display-none", isDefaultAvatar); + + PopupKeyUpActionProvider.EnableEsc = false; + + StudioBlockUIManager.blockUI("#divLoadPhotoWindow", 520); + }, + + deleteContactAvatar: function () { + LoadingBanner.displayLoading(); + jq(".under_logo .linkChangePhoto").addClass("disable"); + var contactId = jq("[id$='_ctrlContactID']").val(); + if (contactId == "") { + contactId = 0; + } + var contactType = jq.getURLParam("type"), + uploadOnly = jq("#divDefaultImagesHolder").attr("data-uploadOnly") == "true", + data = { contactId: contactId, uploadOnly: uploadOnly, contactType: contactType }; + + Teamlab.removeCrmContactAvatar({}, contactId, data, { + success: function (params, response) { + PopupKeyUpActionProvider.CloseDialog(); + jq(".under_logo .linkChangePhoto").removeClass("disable"); + LoadingBanner.hideLoading(); + + var now = new Date(); + jq("img.contact_photo").attr("src", + [ + ASC.CRM.ContactPhotoUploader.defaultAvatarSrc, + '?', + now.getTime()] + .join('')); + if (jq("#uploadPhotoPath").length == 1) { + jq("#uploadPhotoPath").val(""); + } + }, + error: function (params, errors) { + PopupKeyUpActionProvider.CloseDialog(); + jq(".under_logo .linkChangePhoto").removeClass("disable"); + LoadingBanner.hideLoading(); + + toastr.error(ASC.CRM.Resources.CRMJSResource.ErrorMessage_SaveImageError); + } + }); } }; })(); @@ -2758,23 +2833,12 @@ ASC.CRM.ContactFullCardView = (function () { ASC.CRM.Resources.CRMContactResource.ChangePhotoToDefault, "", "
", - "
", + "
", "\"\"", "
", "
", - "
", - "
", - "

", - ASC.CRM.Resources.CRMContactResource.LoadPhotoFromSocialMedia, - "

", - "
", - "
", - "
", - "
", - "
", - "
", "
"].join(''), OKBtn: "", CancelBtn: "", @@ -2846,7 +2910,6 @@ ASC.CRM.ContactFullCardView = (function () { } else { item.href = item.data; } - ASC.CRM.SocialMedia.socialNetworks.push(item); } if (item.infoType == 5) { //LinkedIn if (item.data.indexOf("://") == -1) { @@ -2854,13 +2917,11 @@ ASC.CRM.ContactFullCardView = (function () { } else { item.href = item.data; } - ASC.CRM.SocialMedia.socialNetworks.push(item); } if (item.infoType == 6) { //Facebook if (item.data.indexOf("://") == -1) { item.href = "http://facebook.com/" + item.data; } - ASC.CRM.SocialMedia.socialNetworks.push(item); } if (item.infoType == 8) { //LiveJournal if (item.data.indexOf("://") == -1) { @@ -3402,7 +3463,7 @@ ASC.CRM.ContactDetailsView = (function() { return anch; }; - var _initTabs = function (contactID, contactsTabVisible, currentTabAnch, projectsTabVisible, socialMediaTabVisible) { + var _initTabs = function (contactID, contactsTabVisible, currentTabAnch, projectsTabVisible) { window.ASC.Controls.ClientTabsNavigator.init("ContactTabs", { tabs: [ { @@ -3455,14 +3516,6 @@ ASC.CRM.ContactDetailsView = (function() { divID: "projectsTab", visible: projectsTabVisible, onclick: "ASC.CRM.ContactDetailsView.activateCurrentTab('" + contactID + "','projects');" - }, - { - title: "Twitter", - selected: currentTabAnch == "twitter", - anchor: "twitter", - divID: "socialMediaTab", - visible: socialMediaTabVisible, - onclick: "ASC.CRM.ContactDetailsView.activateCurrentTab('" + contactID + "','twitter');" } ] }); @@ -3809,7 +3862,6 @@ ASC.CRM.ContactDetailsView = (function() { init: function (contactID, isCompany, projectsTabVisible, - socialMediaTabVisible, shareType, canEdit) { _canCreateProjects = ASC.CRM.Data.CanCreateProjects; @@ -3817,16 +3869,14 @@ ASC.CRM.ContactDetailsView = (function() { _availableTabs = ["profile", "tasks", "deals", "invoices", "files"]; if (isCompany === true) { _availableTabs.push("contacts"); } if (projectsTabVisible) { _availableTabs.push("projects"); } - if (socialMediaTabVisible) { _availableTabs.push("twitter"); } var currentTabAnch = _getCurrentTabAnch(); - _initTabs(contactID, isCompany === true, currentTabAnch, projectsTabVisible, socialMediaTabVisible); + _initTabs(contactID, isCompany === true, currentTabAnch, projectsTabVisible); ASC.CRM.HistoryView.init(contactID, "contact", 0); ASC.CRM.DealTabView.initTab(contactID); ASC.CRM.ListTaskView.initTab(contactID, "contact", 0); ASC.CRM.ListInvoiceView.initTab(contactID, "contact"); - ASC.CRM.SocialMedia.initTab(isCompany, canEdit); ASC.CRM.ListContactView.isContentRendered = false; ASC.CRM.ListInvoiceView.isContentRendered = false; @@ -3842,8 +3892,7 @@ ASC.CRM.ContactDetailsView = (function() { initContactDetailsMenuPanel(); initOtherActionMenu(shareType); - ASC.CRM.SocialMedia.init(ASC.CRM.Data.DefaultContactPhoto[isCompany === true ? "CompanyBigSizePhoto" : "PersonBigSizePhoto"]); - ASC.CRM.ContactDetailsView.checkSocialMediaError(); + ASC.CRM.ContactPhotoUploader.init(ASC.CRM.Data.DefaultContactPhoto[isCompany === true ? "CompanyBigSizePhoto" : "PersonBigSizePhoto"]); ASC.CRM.ContactDetailsView.activateCurrentTab(contactID, currentTabAnch); }, @@ -3859,18 +3908,6 @@ ASC.CRM.ContactDetailsView = (function() { ASC.CRM.ListContactView.renderSimpleContent(false, true); } } - if (anchor == "twitter") { - var hasTwitter = false - if (typeof (window.contactNetworks) !== "undefined" && window.contactNetworks.length != 0) { - for (var i = 0, n = window.contactNetworks.length; i < n; i++) { - if (window.contactNetworks[i].infoType == 4) { - hasTwitter = true; - break; - } - } - } - ASC.CRM.SocialMedia.activate(hasTwitter); - } if (anchor == "deals") { ASC.CRM.DealTabView.activate(); } @@ -3949,13 +3986,6 @@ ASC.CRM.ContactDetailsView = (function() { ASC.CRM.HistoryView.isTabActive = false; } }); - }, - - checkSocialMediaError: function () { - var smErrorMessage = jq("input[id$='_ctrlSMErrorMessage']").val(); - if (smErrorMessage != "" && smErrorMessage !== undefined) { - ASC.CRM.SocialMedia.ShowErrorMessage(smErrorMessage); - } } }; })(); @@ -4226,28 +4256,17 @@ ASC.CRM.ContactActionView = (function () { ASC.CRM.Resources.CRMContactResource.ChangePhotoToDefault, "", "
", - "
", + "
", "\"\"", "
", "
", - "
", - "
", - "

", - ASC.CRM.Resources.CRMContactResource.LoadPhotoFromSocialMedia, - "

", - "
", - "
", - "
", - "
", - "
", - "
", "
"].join(''), OKBtn: "", CancelBtn: "", progressText: "" - }).insertAfter("#divSMProfilesWindow"); + }).insertAfter("#socialProfileCategoriesPanel"); }; var createNewAddress = function($contact, is_primary, category, street, city, state, zip, country) { @@ -4370,9 +4389,9 @@ ASC.CRM.ContactActionView = (function () { } ASC.CRM.ContactSelector.Cache = {}; } else { - for (var i = 0, n = ASC.CRM.SocialMedia.selectedPersons.length; i < n; i++) { - if (ASC.CRM.SocialMedia.selectedPersons[i].id == id) { - ASC.CRM.SocialMedia.selectedPersons.splice(i, 1); + for (var i = 0, n = ASC.CRM.ContactActionView.selectedPersons.length; i < n; i++) { + if (ASC.CRM.ContactActionView.selectedPersons[i].id == id) { + ASC.CRM.ContactActionView.selectedPersons.splice(i, 1); break; } } @@ -4409,7 +4428,7 @@ ASC.CRM.ContactActionView = (function () { jq("#contactListBox").parent().removeClass('hiddenFields'); ASC.CRM.Common.RegisterContactInfoCard(); - ASC.CRM.SocialMedia.selectedPersons.push(person); + ASC.CRM.ContactActionView.selectedPersons.push(person); } else { Teamlab.getCrmContact({}, obj.id, { @@ -4765,7 +4784,9 @@ ASC.CRM.ContactActionView = (function () { }); } - ASC.CRM.SocialMedia.init(ASC.CRM.Data.DefaultContactPhoto[isCompany === true ? "CompanyBigSizePhoto" : "PersonBigSizePhoto"]); + ASC.CRM.ContactPhotoUploader.init(ASC.CRM.Data.DefaultContactPhoto[isCompany === true ? "CompanyBigSizePhoto" : "PersonBigSizePhoto"]); + + ASC.CRM.ContactActionView.selectedPersons = new Array(); jq(".cancelSbmtFormBtn:first").on("click", function () { ASC.CRM.Common.unbindOnbeforeUnloadEvent(); @@ -4883,35 +4904,12 @@ ASC.CRM.ContactActionView = (function () { }, changeSocialProfileCategory: function(Obj, category, text, categoryName) { - var $divObj = jq(Obj).parents('table:first').parent(); - jq(Obj).text(text); - $inputObj = jq(Obj).parents('tr:first').find('input'); + var $divObj = jq(Obj).text(text).parents('table:first').parent(); + var $inputObj = jq(Obj).parents('tr:first').find('input'); var parts = $inputObj.attr('name').split('_'); parts[1] = categoryName; $inputObj.attr('name', parts.join('_')); - - var $findProfileObj = $divObj.find('.find_profile'), - isShown = false, - func = "", - title = "", - description = " "; - switch (category) { // Enum ContactInfoType - case 4: // twitter - isShown = window.twitterSearchEnabled; - title = ASC.CRM.Resources.CRMJSResource.FindTwitter; - description = ASC.CRM.Resources.CRMJSResource.ContactTwitterDescription; - func = (function(p1, p2) { return function() { ASC.CRM.SocialMedia.FindTwitterProfiles(jq(this), jq("#typeAddedContact").val(), p1, p2); } })(-3, 5) - break; - } - - if (isShown) { - $findProfileObj.off('click').on("click", func); - $findProfileObj.attr('title', title).show(); - } else { - $findProfileObj.hide(); - } - - $divObj.children(".text-medium-describe").text(description); + $divObj.find('.find_profile').hide(); jq("#socialProfileCategoriesPanel").hide(); }, @@ -4986,16 +4984,16 @@ ASC.CRM.ContactActionView = (function () { if (jq("#typeAddedContact").val() == "people") { ASC.CRM.Common.unbindOnbeforeUnloadEvent(); return true; - } else if (ASC.CRM.SocialMedia.selectedPersons.length == 0) { + } else if (ASC.CRM.ContactActionView.selectedPersons.length == 0) { jq("#assignedContactsListEdit input[name='baseInfo_assignedContactsIDs']").val(window.assignedContactSelector.SelectedContacts); ASC.CRM.Common.unbindOnbeforeUnloadEvent(); return true; } else { var data = []; - for (var i = 0, n = ASC.CRM.SocialMedia.selectedPersons.length; i < n; i++) { + for (var i = 0, n = ASC.CRM.ContactActionView.selectedPersons.length; i < n; i++) { data.push({ - FirstName: ASC.CRM.SocialMedia.selectedPersons[i].Key, - LastName: ASC.CRM.SocialMedia.selectedPersons[i].Value + FirstName: ASC.CRM.ContactActionView.selectedPersons[i].Key, + LastName: ASC.CRM.ContactActionView.selectedPersons[i].Value }); } @@ -5053,37 +5051,6 @@ ASC.CRM.ContactActionView = (function () { PopupKeyUpActionProvider.EnableEsc = false; StudioBlockUIManager.blockUI("#confirmationGotoSettingsPanel", 500); } - }, - - prepareSocialNetworks: function () { - - jq("#divImagesHolder").html(""); - var $networks = jq("#websiteAndSocialProfilesContainer").find("input"); - - ASC.CRM.SocialMedia.socialNetworks = []; - for (var i = 0, n = $networks.length; i < n; i++) { - var $el = jq($networks[i]), - text = $el.val().trim(); - - if (text == "") continue; - if ($el.attr("name").indexOf("contactInfo_Twitter_") == 0) { - ASC.CRM.SocialMedia.socialNetworks.push({ - data: text, - infoType: 4 - }); - } else if ($el.attr("name").indexOf("contactInfo_LinkedIn_") == 0) { - ASC.CRM.SocialMedia.socialNetworks.push({ - data: text, - infoType: 5 - }); - } else if ($el.attr("name").indexOf("contactInfo_Facebook_") == 0) { - ASC.CRM.SocialMedia.socialNetworks.push({ - data: text, - infoType: 6 - }); - } - } - ASC.CRM.SocialMedia.ContactImageListLoaded = false; } }; })(); diff --git a/web/studio/ASC.Web.Studio/Products/CRM/js/socialmedia.js b/web/studio/ASC.Web.Studio/Products/CRM/js/socialmedia.js deleted file mode 100644 index a43ead859..000000000 --- a/web/studio/ASC.Web.Studio/Products/CRM/js/socialmedia.js +++ /dev/null @@ -1,448 +0,0 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2023 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - -if (typeof ASC === "undefined") { - ASC = {}; -} -if (typeof ASC.CRM === "undefined") { - ASC.CRM = function() { return {} }; -} - - -ASC.CRM.SocialMedia = (function() { - var CallbackMethods = { - addAndSaveTwitter: function(params, twitter) { - ASC.CRM.SocialMedia.LoadContactActivity(); - - var tagsContainer = jq("#contactTagsTR"); - - if (tagsContainer.length) { - $currentPrimaryContainer = jq.tmpl("collectionContainerTmpl", - { Type: twitter.infoTypeName }) - .insertBefore("#contactTagsTR") - .children(".collectionItemsTD"); - - jq.tmpl("collectionTmpl", twitter).appendTo($currentPrimaryContainer); - } - }, - - getContactTweets: function (params, response) { - LoadingBanner.hideLoading(); - if (response.length != 0) { - jq("#tweetsEmptyScreen:not(.display-none)").addClass("display-none"); - jq.tmpl("twitterMessageListTmpl", response).appendTo("#divSocialMediaContent"); - } else { - ASC.CRM.SocialMedia.ShowErrorMessage(ASC.CRM.Resources.CRMCommonResource.NoLoadedMessages); - } - } - }; - - _GetContactSMImagesResponse = function (response) { - var imageCount = response.length; - if (imageCount > 0) { - for (var i = 0; i < imageCount; i++) { - jq.tmpl("socialMediaAvatarTmpl", response[i]).appendTo("#divImagesHolder"); - jq("#linkSaveAvatar").css("display", "inline"); - } - _FinishGettingContactImages(true); - } else { - jq("#divImagesHolder").html( - ["
", - ASC.CRM.Resources.CRMContactResource.NoPhotoFromSocialMedia, - "
"].join('')); - _FinishGettingContactImages(false); - } - }; - - _FinishGettingContactImages = function(hasPhotos) { - ASC.CRM.SocialMedia.ContactImageListLoaded = true; - jq("#divAjaxImageContainerPhotoLoad [id$='_ctrlImgAjaxLoader']").remove(); - if (hasPhotos) { - jq("#divLoadPhotoFromSocialMedia").css("height", "100px"); - } - jq("#divImagesHolder").css("display", "block"); - - LoadingBanner.hideLoading(); - PopupKeyUpActionProvider.EnableEsc = false; - StudioBlockUIManager.blockUI("#divLoadPhotoWindow", 520); - }; - - _FindTwitterProfilesResponse = function (target, addTop, addLeft, response) { - var tmplID = "TwitterProfileTmpl"; - if (target.parent().is(".emptyScrBttnPnl")) { - tmplID = "TwitterProfileTabTmpl"; - } - - _RenderSMProfiles(response, tmplID); - - jq("#divSMProfilesWindow .divWait").hide(); - _CalculateProfilesWindowHeight(); - - ASC.CRM.SocialMedia.TwitterTargetTextbox = jq(target).parent().parent().children('table').find('input'); - _ShowProfilesWindow(); - }; - - _CalculateProfilesWindowHeight = function() { - var height = jq("#sm_tbl_UserList").outerHeight(); - if (height > 200) { - return 270; - } - if (height == 0) { - return 100; - } - return height + 65; - }; - - _CalculateProfilesWindowPosition = function(targetElement, addTop, addLeft) { - var top = addTop == null ? 0 : addTop, - left = addLeft == null ? 0 : addLeft, - dropdownItem = jq("#divSMProfilesWindow"), - targetPos = targetElement.offset(); - elemPosTop = targetPos.top - 23 + top; - elemPosLeft = targetPos.left + targetElement.outerWidth() + 3 + left; - - dropdownItem.css( - { - 'position': 'absolute', - 'top': elemPosTop, - 'left': elemPosLeft - }); - }; - - _RenderSMProfiles = function(profiles, templateID) { - var profileCount = profiles.length; - if (profileCount > 0) { - for (var i = 0; i < profileCount; i++) { - jq.tmpl(templateID, profiles[i]).appendTo("#sm_tbl_UserList"); - } - } else { - jq("#divSMProfilesWindow .divNoProfiles").css("display", "block"); - } - }; - - _AddTwitterProfileToContactResponse = function(response) { - if (response.error != null) toastr.error("Error"); - _HideProfilesWindow(); - }; - - _ShowProfilesWindow = function() { - jq("#divSMProfilesWindow").show(); - var windowHeight = _CalculateProfilesWindowHeight(); - jq("#divSMProfilesWindow").css("height", windowHeight); - - jq("#divSMProfilesWindow").off("mouseenter").on("mouseenter", function() { - ASC.CRM.SocialMedia.MouseInProfilesWindow = true; - }); - jq("#divSMProfilesWindow").off("mouseleave").on("mouseleave", function() { - ASC.CRM.SocialMedia.MouseInProfilesWindow = false; - }); - jq(document).on("click", _CheckProfilesWindow); - }; - - _ShowWaitProfilesWindow = function(name) { - jq("#divSMProfilesWindow .divWait").show(); - jq("#divSMProfilesWindow .divHeader span").text(jq.format(ASC.CRM.Resources.CRMJSResource.PossibleSocialMediaAccounts, name)); - - var windowHeight = _CalculateProfilesWindowHeight(); - jq("#divSMProfilesWindow").css("height", windowHeight); - jq("#divSMProfilesWindow").show(); - }; - - _CheckProfilesWindow = function() { - if (ASC.CRM.SocialMedia.MouseInProfilesWindow == false) { - _HideProfilesWindow(); - } - }; - - _HideProfilesWindow = function() { - jq("#divSMProfilesWindow").hide(); - jq(document).off("click", _CheckProfilesWindow); - }; - - - return { - init: function (defaultAvatarSrc) { - ASC.CRM.SocialMedia.SocialMediaLoaded = false; - ASC.CRM.SocialMedia.ContactImageListLoaded = false; - ASC.CRM.SocialMedia.MouseInProfilesWindow = false; - ASC.CRM.SocialMedia.selectedPersons = new Array(); - ASC.CRM.SocialMedia.defaultAvatarSrc = defaultAvatarSrc; - - ASC.CRM.SocialMedia.socialNetworks = new Array(); - }, - - initTab: function (isCompany, canEdit) { - - jq.tmpl("twitterMessageListPanelTmpl").appendTo("#divSocialMediaContent"); - - jq.tmpl("template-emptyScreen", - { - ID: "tweetsEmptyScreen", - ImgSrc: ASC.CRM.Data.EmptyScrImgs["empty_screen_twitter"], - Header: ASC.CRM.Resources.CRMSocialMediaResource.EmptyContentTwitterAccountsHeader, - Describe: ASC.CRM.Resources.CRMSocialMediaResource.EmptyContentTwitterAccountsDescribe, - ButtonHTML: canEdit ? ["", - ASC.CRM.Resources.CRMSocialMediaResource.LinkTwitterAccount, - ""] - .join('') : "", - CssClass: "display-none" - }).appendTo("#divSocialMediaContent"); - }, - - activate: function (hasTwitter) { - if (ASC.CRM.SocialMedia.SocialMediaLoaded == false) { - ASC.CRM.SocialMedia.SocialMediaLoaded = true; - if (hasTwitter) { - ASC.CRM.SocialMedia.LoadContactActivity(); - } else { - jq("#tweetsEmptyScreen.display-none").removeClass("display-none"); - } - } - }, - - switchCheckedPersonsInCompany: function(checked) { - jq("#chbPersonsRelationship input[type='checkbox']").prop("checked", checked); - }, - - ShowErrorMessage: function(text) { - jq("#smErrorDescriptionContainer").css("display", "block"); - jq("#smErrorDescription").text(text); - }, - - LoadContactActivity: function() { - jq("#smErrorDescriptionContainer").css("display", "none"); - jq("#smErrorDescription").text(""); - - LoadingBanner.displayLoading(); - var contactID = jq("[id$='_ctrlContactID']").val(), - number = jq.cookies.get("sm_msg_count"); - if (number == null || number === undefined || isNaN(number)) { - number = 10; - } - - Teamlab.getCrmContactTweets({}, contactID, number, - { - max_request_attempts: 1, - success: CallbackMethods.getContactTweets, - error: function (params, errors) { - var err = errors[0]; - LoadingBanner.hideLoading(); - try { - var json = JSON.parse(err); - err = json.description; - } catch (e) { } - - if (err === ASC.CRM.Resources.SocialMediaAccountNotFoundTwitter) { - jq("#tweetsEmptyScreen.display-none").removeClass("display-none"); - } else { - ASC.CRM.SocialMedia.ShowErrorMessage(err); - } - } - }); - }, - - GetContactImageList: function() { - if (ASC.CRM.SocialMedia.socialNetworks != null && ASC.CRM.SocialMedia.socialNetworks.length != 0) { - Teamlab.getCrmContactSocialMediaAvatar({}, ASC.CRM.SocialMedia.socialNetworks, - { - max_request_attempts: 1, - success: function (params, response) { - _GetContactSMImagesResponse(response); - }, - error: function (params, errors) { - _GetContactSMImagesResponse([]); - } - }); - - } else { - _GetContactSMImagesResponse([]); - } - }, - - OpenLoadPhotoWindow: function () { - var $link = jq(".linkChangePhoto"); - if (!$link || ($link && !$link.hasClass("disable"))) { - - jq("[name='chbSocialNetwork']").prop("checked", false); - - var curAvatarSrc = jq("img.contact_photo").attr("src"); - if (curAvatarSrc.indexOf(ASC.CRM.SocialMedia.defaultAvatarSrc + '?') == 0) { - jq("#divLoadPhotoDefault").addClass("display-none"); - jq("#divLoadPhotoFromSocialMedia").css("margin-top", "10px"); - } else { - jq("#divLoadPhotoDefault").removeClass("display-none"); - jq("#divLoadPhotoFromSocialMedia").css("margin-top", "-16px"); - } - - if (ASC.CRM.SocialMedia.ContactImageListLoaded == false) { - LoadingBanner.displayLoading(); - ASC.CRM.SocialMedia.GetContactImageList(); - } else { - PopupKeyUpActionProvider.EnableEsc = false; - StudioBlockUIManager.blockUI("#divLoadPhotoWindow", 520); - } - } - }, - - SelectUserAvatar: function(event, socialNetwork, identity) { - if (!event.target) { - event.target = event.srcElement; - } - var imageChecked = jq(event.target).is(":checked"); - if (imageChecked == false) { return; } - jq("[name='chbSocialNetwork']").not(jq(event.target)).prop("checked", false); - }, - - UploadUserAvatar: function (event, socialNetwork, userIdentity) { - LoadingBanner.displayLoading(); - jq(".under_logo .linkChangePhoto").addClass("disable"); - var contactId = jq("[id$='_ctrlContactID']").val(); - if (contactId == "") { - contactId = 0; - } - var uploadOnly = jq("#divImagesHolder").attr("data-uploadOnly") == "true", - data = { contactId: contactId, socialNetwork: socialNetwork, userIdentity: userIdentity, uploadOnly: uploadOnly }; - - if (jq("#uploadPhotoPath").length == 1) { - data.tmpDirName = jq("#uploadPhotoPath").val(); - } - - Teamlab.updateCrmContactAvatar({}, contactId, data, { - success: function (params, response) { - PopupKeyUpActionProvider.CloseDialog(); - jq(".under_logo .linkChangePhoto").removeClass("disable"); - LoadingBanner.hideLoading(); - - var now = new Date(); - jq("img.contact_photo").attr("src", response.url + '?' + now.getTime()); - if (jq("#uploadPhotoPath").length == 1) { - jq("#uploadPhotoPath").val(response.path); - } - }, - error: function (params, errors) { - PopupKeyUpActionProvider.CloseDialog(); - jq(".under_logo .linkChangePhoto").removeClass("disable"); - LoadingBanner.hideLoading(); - - toastr.error(ASC.CRM.Resources.CRMJSResource.ErrorMessage_SaveImageError); - } - }); - }, - - DeleteContactAvatar: function () { - LoadingBanner.displayLoading(); - jq(".under_logo .linkChangePhoto").addClass("disable"); - var contactId = jq("[id$='_ctrlContactID']").val(); - if (contactId == "") { - contactId = 0; - } - var contactType = jq.getURLParam("type"), - uploadOnly = jq("#divImagesHolder").attr("data-uploadOnly") == "true", - data = { contactId: contactId, uploadOnly: uploadOnly, contactType: contactType }; - - Teamlab.removeCrmContactAvatar({}, contactId, data, { - success: function (params, response) { - PopupKeyUpActionProvider.CloseDialog(); - jq(".under_logo .linkChangePhoto").removeClass("disable"); - LoadingBanner.hideLoading(); - - var now = new Date(); - jq("img.contact_photo").attr("src", - [ - ASC.CRM.SocialMedia.defaultAvatarSrc, - '?', - now.getTime()] - .join('')); - if (jq("#uploadPhotoPath").length == 1) { - jq("#uploadPhotoPath").val(""); - } - }, - error: function (params, errors) { - PopupKeyUpActionProvider.CloseDialog(); - jq(".under_logo .linkChangePhoto").removeClass("disable"); - LoadingBanner.hideLoading(); - - toastr.error(ASC.CRM.Resources.CRMJSResource.ErrorMessage_SaveImageError); - } - }); - }, - - FindTwitterProfiles: function(target, contactType, addTop, addLeft) { - _HideProfilesWindow(); - jq("#divSMProfilesWindow .divNoProfiles").css("display", "none"); - jq("#sm_tbl_UserList").html(""); - jq("#divSMProfilesWindow .divSMProfilesWindowBody .errorBox").remove(); - - var searchText; - - //contact type can be "company" or "people" - if (jq("#baseInfo_Title").length == 1) { - searchText = jq("#baseInfo_Title").val().trim(); - } else { - if (contactType == "company") { - searchText = jq("[name='baseInfo_companyName']").val(); - } - if (contactType == "people") { - searchText = jq("[name='baseInfo_firstName']").val() + " " + jq("[name='baseInfo_lastName']").val(); - } - } - - if (searchText === undefined || searchText.trim().length == 0) { - return; - } - - _CalculateProfilesWindowPosition(jq(target), addTop, addLeft); - _ShowWaitProfilesWindow(searchText); - - Teamlab.getCrmContactTwitterProfiles({}, searchText, { - max_request_attempts: 1, - success: function (params, response) { - _FindTwitterProfilesResponse(target, addTop, addLeft, response); - }, - error: function (params, errors) { - var err = errors[0]; - jq("#divSMProfilesWindow .divWait").hide(); - jq("#divSMProfilesWindow .divSMProfilesWindowBody").prepend(jq("
").addClass("errorBox").text(err)); - } - }); - }, - - AddAndSaveTwitterProfileToContact: function(twitterScreenName, contactID) { - var params = {}, - data = { - data: twitterScreenName, - isPrimary: true, - infoType: "Twitter", - category: "Work" - }; - Teamlab.addCrmContactTwitter(params, contactID, data, - { - success: CallbackMethods.addAndSaveTwitter, - before: function(params) { }, - after: function(params) { _HideProfilesWindow(); } - }); - }, - - AddTwitterProfileToContact: function(twitterScreenName) { - jq(ASC.CRM.SocialMedia.TwitterTargetTextbox).val(twitterScreenName); - _HideProfilesWindow(); - } - }; -})(); \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/Products/Community/ASC.Web.Community.csproj b/web/studio/ASC.Web.Studio/Products/Community/ASC.Web.Community.csproj index 3b6c39419..17bde4739 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/ASC.Web.Community.csproj +++ b/web/studio/ASC.Web.Studio/Products/Community/ASC.Web.Community.csproj @@ -2380,6 +2380,8 @@ + + ASPXCodeBehind diff --git a/web/studio/ASC.Web.Studio/Products/Community/App_Themes/dark/dark-params.less b/web/studio/ASC.Web.Studio/Products/Community/App_Themes/dark/dark-params.less index 4a645a32d..417ad8a7a 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/App_Themes/dark/dark-params.less +++ b/web/studio/ASC.Web.Studio/Products/Community/App_Themes/dark/dark-params.less @@ -23,4 +23,11 @@ @body-color-hover: #474747; @dark-text-color: #fff; @dark-middle-text-color: #555555; -@body-color-bg: #333; \ No newline at end of file +@body-color-bg: #333; +@wiki-link-color: #3DB8EC; +@wiki-example-bc: #292929; +@wiki-example-bor: #666666; +@wiki-h2-bor: #505050; +@wiki-pre-bc: #292929; +@wiki-pre-bor: #666666; +@wiki-pre-col: rgba(255, 255, 255, 0.92); \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/Products/Community/App_Themes/default/images/product_logolarge_dark.svg b/web/studio/ASC.Web.Studio/Products/Community/App_Themes/default/images/product_logolarge_dark.svg new file mode 100644 index 000000000..3f8098495 --- /dev/null +++ b/web/studio/ASC.Web.Studio/Products/Community/App_Themes/default/images/product_logolarge_dark.svg @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/web/studio/ASC.Web.Studio/Products/Community/App_Themes/default/params.less b/web/studio/ASC.Web.Studio/Products/Community/App_Themes/default/params.less index 11cf02177..ea8f36e03 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/App_Themes/default/params.less +++ b/web/studio/ASC.Web.Studio/Products/Community/App_Themes/default/params.less @@ -23,4 +23,11 @@ @body-color-hover: #E6E6E6; @dark-text-color: #000000; @dark-middle-text-color: #555555; -@body-color-bg: white; \ No newline at end of file +@body-color-bg: white; +@wiki-link-color: #002bb8; +@wiki-example-bc: #EEEEEE; +@wiki-example-bor: #CCCCCC; +@wiki-h2-bor: #000000; +@wiki-pre-bc:#F9F9F9; +@wiki-pre-bor: #2F6FAB; +@wiki-pre-col: black; \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/UserControls/BookmarkingUserControl.ascx.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/UserControls/BookmarkingUserControl.ascx.cs index 76a89fad3..48f7a09bd 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/UserControls/BookmarkingUserControl.ascx.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/UserControls/BookmarkingUserControl.ascx.cs @@ -34,6 +34,7 @@ using ASC.Core; using ASC.Core.Users; using ASC.Web.Community.Modules.Bookmarking.UserControls.Resources; +using ASC.Web.Core; using ASC.Web.Core.Utility.Skins; using ASC.Web.Studio.Controls.Common; using ASC.Web.Studio.UserControls.Common.ViewSwitcher; @@ -188,6 +189,8 @@ private void AddBookmarksListToPlaceHolder(IList bookmarks, HtmlGeneri [AjaxMethod(HttpSessionStateRequirement.ReadWrite)] public object RemoveBookmarkFromFavouriteInFavouriteMode(int userBookmarkID) { + CheckPermission(); + _serviceHelper.RemoveBookmarkFromFavourite(userBookmarkID); return null; } @@ -205,6 +208,8 @@ public object RemoveBookmarkFromFavouriteInFavouriteMode(int userBookmarkID) [AjaxMethod(HttpSessionStateRequirement.ReadWrite)] public object RemoveBookmarkFromFavourite(int userBookmarkID, string uniqueID) { + CheckPermission(); + var b = _serviceHelper.RemoveBookmarkFromFavourite(userBookmarkID); var displayMode = BookmarkingBusinessFactory.GetDisplayMode(); @@ -252,6 +257,8 @@ private object GetBookmarkAsString(Bookmark b, Guid uniqueID) [AjaxMethod(HttpSessionStateRequirement.ReadWrite)] public object SaveBookmark(string BookmarkUrl, string BookmarkName, string BookmarkDescription, string BookmarkTags) { + CheckPermission(); + var url = UpdateURL(BookmarkUrl); var b = _serviceHelper.AddBookmark(url, BookmarkName, BookmarkDescription, BookmarkTags); return GetBookmarkAsString(b, Guid.NewGuid()); @@ -260,6 +267,8 @@ public object SaveBookmark(string BookmarkUrl, string BookmarkName, string Bookm [AjaxMethod(HttpSessionStateRequirement.ReadWrite)] public object SaveBookmarkAjax(string BookmarkUrl, string BookmarkName, string BookmarkDescription, string BookmarkTags, string uniqueID) { + CheckPermission(); + var url = UpdateURL(BookmarkUrl); var b = _serviceHelper.AddBookmark(url, BookmarkName, BookmarkDescription, BookmarkTags); @@ -288,6 +297,8 @@ public object SaveBookmarkAjax(string BookmarkUrl, string BookmarkName, string B [AjaxMethod(HttpSessionStateRequirement.ReadWrite)] public void RemoveBookmark(int userBookmarkID) { + CheckPermission(); + _serviceHelper.RemoveBookmark(userBookmarkID); } @@ -353,6 +364,8 @@ public AjaxResponse GetSuggest(string text, string varName, int limit) [AjaxMethod(HttpSessionStateRequirement.ReadWrite)] public object GetBookmarkByUrl(string url) { + CheckPermission(); + //Create thumbnail if it doesn't exists ThumbnailHelper.Instance.MakeThumbnail(url, true, true, HttpContext.Current, TenantProvider.CurrentTenantID); @@ -376,6 +389,8 @@ private static object GetBookmarkByUrl(Bookmark b, string url) [AjaxMethod(HttpSessionStateRequirement.ReadWrite)] public object GetUserBookmarkByUrl(string url) { + CheckPermission(); + //Create bookmark thumbnail ThumbnailHelper.Instance.MakeThumbnail(url, true, true, HttpContext.Current, TenantProvider.CurrentTenantID); @@ -522,6 +537,8 @@ private static string GetXpathArgumentIgnoreCase(string argName) [AjaxMethod(HttpSessionStateRequirement.ReadWrite)] public object UpdateThumbnailImageSrc() { + CheckPermission(); + try { var displayMode = BookmarkingBusinessFactory.GetDisplayMode(); @@ -556,18 +573,24 @@ public object UpdateThumbnailImageSrc() [AjaxMethod(HttpSessionStateRequirement.ReadWrite)] public void MakeThumbnail(string url) { + CheckPermission(); + ThumbnailHelper.Instance.MakeThumbnail(url, true, true, HttpContext.Current, TenantProvider.CurrentTenantID); } [AjaxMethod(HttpSessionStateRequirement.ReadWrite)] public void GenerateAllThumbnails(bool overrideFlag) { + CheckPermission(); + BookmarkingServiceHelper.GenerateAllThumbnails(overrideFlag); } [AjaxMethod(HttpSessionStateRequirement.ReadWrite)] public void UpdateBookmarkThumbnail(int bookmarkID) { + CheckPermission(); + BookmarkingServiceHelper.UpdateBookmarkThumbnail(bookmarkID); } @@ -653,5 +676,20 @@ private void InitScripts() jsResource.Append("jq('#tableForNavigation select').val(" + BookmarkPageCounter + ").on('change', function(evt) {changeBookmarksCountOfRows(this.value);}).tlCombobox();"); Page.RegisterInlineScript(jsResource.ToString(), true); } + + private void CheckPermission() + { + var product = WebItemManager.Instance[WebItemManager.CommunityProductID]; + if (product == null || product.IsDisabled()) + { + throw new System.Security.SecurityException(); + } + + var module = WebItemManager.Instance[BookmarkingSettings.ModuleId]; + if (module == null || module.IsDisabled()) + { + throw new System.Security.SecurityException(); + } + } } } \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/UserControls/CreateBookmarkUserControl.ascx b/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/UserControls/CreateBookmarkUserControl.ascx index f639402f2..615cd415e 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/UserControls/CreateBookmarkUserControl.ascx +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/UserControls/CreateBookmarkUserControl.ascx @@ -37,7 +37,7 @@
<% } %>
diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/UserControls/PostListControl.ascx.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/UserControls/PostListControl.ascx.cs index 86c6e6448..90d0c9604 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/UserControls/PostListControl.ascx.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/UserControls/PostListControl.ascx.cs @@ -56,7 +56,8 @@ public bool VoteCallback(string pollID, List selectedVariantIDs, string var q = ForumDataProvider.GetPollByID(TenantProvider.CurrentTenantID, idQuestion); if (q == null || !_forumManager.ValidateAccessSecurityAction(ForumAction.PollVote, q) - || ForumDataProvider.IsUserVote(TenantProvider.CurrentTenantID, idQuestion, SecurityContext.CurrentAccount.ID)) + || ForumDataProvider.IsUserVote(TenantProvider.CurrentTenantID, idQuestion, SecurityContext.CurrentAccount.ID) + || (q.Type == QuestionType.OneAnswer && variantIDs.Count > 1)) { errorMessage = ForumUCResource.ErrorAccessDenied; return false; diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/News/Code/PollVoteHandler.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/News/Code/PollVoteHandler.cs index 2e970375d..fb5831f97 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/News/Code/PollVoteHandler.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/News/Code/PollVoteHandler.cs @@ -17,6 +17,7 @@ using System; using System.Collections.Generic; +using System.Linq; using ASC.Core; using ASC.Web.Community.Modules.News.Resources; @@ -36,20 +37,43 @@ public bool VoteCallback(string pollID, List selectedVariantIDs, string selectedVariantIDs.ForEach(strId => { if (!string.IsNullOrEmpty(strId)) userAnswersIDs.Add(Convert.ToInt64(strId)); }); long pollId = Convert.ToInt64(additionalParams); var storage = FeedStorageFactory.Create(); + var feed = storage.GetFeed(pollId); - return VoteForPoll(userAnswersIDs, storage, pollId, out errorMessage); + return VoteForPoll(userAnswersIDs, storage, feed, out errorMessage); } - public static bool VoteForPoll(List userAnswersIDs, IFeedStorage storage, long pollId, out string errorMessage) + public static bool VoteForPoll(List userAnswersIDs, IFeedStorage storage, Feed feed, out string errorMessage) { errorMessage = string.Empty; - storage.PollVote(SecurityContext.CurrentAccount.ID.ToString(), userAnswersIDs); - var pollFeed = storage.GetFeed(pollId); - if (pollFeed == null) + + if (feed == null) + { + errorMessage = "Item not found"; + return false; + } + + if (feed.FeedType != FeedType.Poll) { - errorMessage = NewsResource.ErrorAccessDenied; + errorMessage = "Feed is not a poll"; return false; } + + var poll = feed as FeedPoll; + var currentAccountId = SecurityContext.CurrentAccount.ID.ToString(); + + if (poll.IsUserVote(currentAccountId)) + { + errorMessage = "User already voted"; + return false; + } + + if (!userAnswersIDs.Any() || (poll.PollType == FeedPollType.SimpleAnswer && userAnswersIDs.Count > 1)) + { + errorMessage = "Invalid number of answers"; + return false; + } + + storage.PollVote(currentAccountId, userAnswersIDs); return true; } diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/Handlers/WikiFileHandler.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/Handlers/WikiFileHandler.cs index a9b776022..867b11e3b 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/Handlers/WikiFileHandler.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/Handlers/WikiFileHandler.cs @@ -41,12 +41,28 @@ public void ProcessRequest(HttpContext context) { if (!SecurityContext.AuthenticateMe(CookiesManager.GetCookies(CookiesType.AuthKey))) { - context.Response.StatusCode = (int)HttpStatusCode.Forbidden; + context.Response.StatusCode = (int)HttpStatusCode.Unauthorized; context.Response.End(); return; } } + var product = WebItemManager.Instance[WebItemManager.CommunityProductID]; + if (product == null || product.IsDisabled()) + { + context.Response.StatusCode = (int)HttpStatusCode.Forbidden; + context.Response.End(); + return; + } + + var module = WebItemManager.Instance[WikiManager.ModuleId]; + if (module == null || module.IsDisabled()) + { + context.Response.StatusCode = (int)HttpStatusCode.Forbidden; + context.Response.End(); + return; + } + context.Response.Clear(); if (string.IsNullOrEmpty(context.Request["file"])) { diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/ListFiles.aspx b/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/ListFiles.aspx index 92ab0ef74..68964ee9d 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/ListFiles.aspx +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/ListFiles.aspx @@ -72,7 +72,7 @@ + NavigateUrl='<%#GetFileViewLink(Container.DataItem as File)%>' Target="_blank" /> <%#GetAuthor(Container.DataItem as File)%> diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/content/main.less b/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/content/main.less index f12f0eb9f..659049368 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/content/main.less +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/content/main.less @@ -41,14 +41,14 @@ div.wiki { font-size: 12px; color: @dark-text-color; background-color: @body-color; -} -.wiki h1 { - font-size: 24px; - border-bottom: solid 1px @dark-text-color; -} -.wiki h2 { - font-size: 21px; - border-bottom: solid 1px @dark-text-color; +} +.wiki h1 { + font-size: 24px; + border-bottom: solid 1px @wiki-h2-bor; +} +.wiki h2 { + font-size: 21px; + border-bottom: solid 1px @wiki-h2-bor; } .wiki h3 { font-size: 18px; } .wiki h4 { font-size: 14px; font-weight:bold; } @@ -124,7 +124,7 @@ div.wiki { .wiki a.mail { background: url(mail_icon.gif) center right no-repeat; padding-right: 18px; padding-bottom: 2px; } .wiki a.internalNotExists { color:Red !important; } .wiki a.ftp { background: url(file_icon.gif) center right no-repeat; padding-right: 16px; } -.wiki a:link { color: #002bb8; text-decoration: none; } +.wiki a:link { color: @wiki-link-color; text-decoration: none; } .wiki a:visited { color: #5a3696; text-decoration: none; } .wiki a:active { text-decoration: none; } .wiki a:hover { text-decoration: underline; } @@ -132,9 +132,9 @@ div.wiki { .wiki dt { font-weight: bold; margin-top: 1pt; margin-bottom: 1pt; } .wiki pre { - background-color:#F9F9F9; - border:1px dashed #2F6FAB; - color:black; + background-color:@wiki-pre-bc; + border:1px dashed @wiki-pre-bor; + color:@wiki-pre-col; line-height:1.1em; padding:1em; margin:1em; @@ -164,7 +164,7 @@ div.wiki { .wiki ol li li li { list-style-type: lower-roman } .wiki ol li li li li { list-style-type: none } -div.TOC { background-color:#EEEEEE; border:1px solid #CCCCCC; margin-bottom:15px; padding:15px 10px 20px 0; width:266px; overflow:hidden;} +div.TOC { background-color:@wiki-example-bc; border:1px solid @wiki-example-bor; margin-bottom:15px; padding:15px 10px 20px 0; width:266px; overflow:hidden;} div.TOC div.TOC1 { } div.TOC div.TOC2 { margin-left: 20px; } div.TOC div.TOC3 { margin-left: 40px; } diff --git a/web/studio/ASC.Web.Studio/Products/Community/Product/CommunityProduct.cs b/web/studio/ASC.Web.Studio/Products/Community/Product/CommunityProduct.cs index e87c85fac..43f38be8b 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Product/CommunityProduct.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Product/CommunityProduct.cs @@ -91,6 +91,7 @@ public override void Init() DisabledIconFileName = "product_disabled_logo.png", IconFileName = "product_logo.png", LargeIconFileName = "product_logolarge.svg", + LargeIconFileNameDark = "product_logolarge_dark.svg", DefaultSortOrder = 40, SubscriptionManager = new CommunitySubscriptionManager(), diff --git a/web/studio/ASC.Web.Studio/Products/Files/ASC.Web.Files.csproj b/web/studio/ASC.Web.Studio/Products/Files/ASC.Web.Files.csproj index 955b36cc0..4cb1767f7 100644 --- a/web/studio/ASC.Web.Studio/Products/Files/ASC.Web.Files.csproj +++ b/web/studio/ASC.Web.Studio/Products/Files/ASC.Web.Files.csproj @@ -291,6 +291,7 @@ + @@ -298,6 +299,8 @@ + + @@ -348,7 +351,7 @@ - + @@ -373,9 +376,13 @@ + + + + diff --git a/web/studio/ASC.Web.Studio/Products/Files/App_Themes/bright-blue/params.less b/web/studio/ASC.Web.Studio/Products/Files/App_Themes/bright-blue/params.less index ab14dd44d..6c62d3df0 100644 --- a/web/studio/ASC.Web.Studio/Products/Files/App_Themes/bright-blue/params.less +++ b/web/studio/ASC.Web.Studio/Products/Files/App_Themes/bright-blue/params.less @@ -34,4 +34,5 @@ @textColor: #333; @borderColor: #D1D1D1; @filesHover: #f2f2f2; -@hover: #e5e5e5; \ No newline at end of file +@hover: #e5e5e5; +@thumbnails-bc-selected: #e5e5e5; \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/Products/Files/App_Themes/dark-bright-blue/params.less b/web/studio/ASC.Web.Studio/Products/Files/App_Themes/dark-bright-blue/params.less index 77158f3be..c615dbd07 100644 --- a/web/studio/ASC.Web.Studio/Products/Files/App_Themes/dark-bright-blue/params.less +++ b/web/studio/ASC.Web.Studio/Products/Files/App_Themes/dark-bright-blue/params.less @@ -37,4 +37,5 @@ @textColor: #fff; @borderColor: #474747; @filesHover: #505050; -@hover: #555555; +@hover: #555555; +@thumbnails-bc-selected: #3d3d3d; \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/Products/Files/App_Themes/dark-dark-green/params.less b/web/studio/ASC.Web.Studio/Products/Files/App_Themes/dark-dark-green/params.less index 189cdcb1f..c615dbd07 100644 --- a/web/studio/ASC.Web.Studio/Products/Files/App_Themes/dark-dark-green/params.less +++ b/web/studio/ASC.Web.Studio/Products/Files/App_Themes/dark-dark-green/params.less @@ -37,4 +37,5 @@ @textColor: #fff; @borderColor: #474747; @filesHover: #505050; -@hover: #555555; \ No newline at end of file +@hover: #555555; +@thumbnails-bc-selected: #3d3d3d; \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/Products/Files/App_Themes/dark-deep-blue/params.less b/web/studio/ASC.Web.Studio/Products/Files/App_Themes/dark-deep-blue/params.less index 189cdcb1f..c615dbd07 100644 --- a/web/studio/ASC.Web.Studio/Products/Files/App_Themes/dark-deep-blue/params.less +++ b/web/studio/ASC.Web.Studio/Products/Files/App_Themes/dark-deep-blue/params.less @@ -37,4 +37,5 @@ @textColor: #fff; @borderColor: #474747; @filesHover: #505050; -@hover: #555555; \ No newline at end of file +@hover: #555555; +@thumbnails-bc-selected: #3d3d3d; \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/Products/Files/App_Themes/dark-default/params.less b/web/studio/ASC.Web.Studio/Products/Files/App_Themes/dark-default/params.less index 8b4843274..5b80f4822 100644 --- a/web/studio/ASC.Web.Studio/Products/Files/App_Themes/dark-default/params.less +++ b/web/studio/ASC.Web.Studio/Products/Files/App_Themes/dark-default/params.less @@ -59,4 +59,16 @@ @sharing-dialog-bor: #474747; @uploadsvg: "uploadlight.svg"; @loader-12-gif: "loader-dark-12.svg"; -@loader-12-gray-gif: "loader-dark-12.svg"; \ No newline at end of file +@loader-12-gray-gif: "loader-dark-12.svg"; +@jstree-expander: #D6D6D6; +@thumbnails-row-selected-bor: #EEEEEE; +@thumbnails-bc-not-selected: #292929; +@thumbnails-bc-selected: #3d3d3d; +@user-svg: "user-dark.svg"; +@link-svg: "link-dark.svg"; +@settings-svg: "settings-dark.svg"; +@version-operations-col: #bdbdbd; +@version-operations-col-close: #bdbdbd; +@dropdown-folder-parent: #bdbdbd; +@dropdown-folder-parent-col: #fff; +@sharingDialogButtonArrowPart: #333; \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/Products/Files/App_Themes/dark-green/params.less b/web/studio/ASC.Web.Studio/Products/Files/App_Themes/dark-green/params.less index e570ba934..93db681ee 100644 --- a/web/studio/ASC.Web.Studio/Products/Files/App_Themes/dark-green/params.less +++ b/web/studio/ASC.Web.Studio/Products/Files/App_Themes/dark-green/params.less @@ -36,4 +36,5 @@ @hover: #e5e5e5; @item-menu-selected: #333; -@item-menu-style: bold; +@item-menu-style: bold; +@thumbnails-bc-selected: #e5e5e5; \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/Products/Files/App_Themes/dark-pure-orange/params.less b/web/studio/ASC.Web.Studio/Products/Files/App_Themes/dark-pure-orange/params.less index 189cdcb1f..c615dbd07 100644 --- a/web/studio/ASC.Web.Studio/Products/Files/App_Themes/dark-pure-orange/params.less +++ b/web/studio/ASC.Web.Studio/Products/Files/App_Themes/dark-pure-orange/params.less @@ -37,4 +37,5 @@ @textColor: #fff; @borderColor: #474747; @filesHover: #505050; -@hover: #555555; \ No newline at end of file +@hover: #555555; +@thumbnails-bc-selected: #3d3d3d; \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/Products/Files/App_Themes/dark-wild-pink/params.less b/web/studio/ASC.Web.Studio/Products/Files/App_Themes/dark-wild-pink/params.less index 189cdcb1f..c615dbd07 100644 --- a/web/studio/ASC.Web.Studio/Products/Files/App_Themes/dark-wild-pink/params.less +++ b/web/studio/ASC.Web.Studio/Products/Files/App_Themes/dark-wild-pink/params.less @@ -37,4 +37,5 @@ @textColor: #fff; @borderColor: #474747; @filesHover: #505050; -@hover: #555555; \ No newline at end of file +@hover: #555555; +@thumbnails-bc-selected: #3d3d3d; \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/Products/Files/App_Themes/deep-blue/params.less b/web/studio/ASC.Web.Studio/Products/Files/App_Themes/deep-blue/params.less index 5efcf655b..1883686a7 100644 --- a/web/studio/ASC.Web.Studio/Products/Files/App_Themes/deep-blue/params.less +++ b/web/studio/ASC.Web.Studio/Products/Files/App_Themes/deep-blue/params.less @@ -35,4 +35,5 @@ @textColor: #333; @borderColor: #D1D1D1; @filesHover: #f2f2f2; -@hover: #e5e5e5; \ No newline at end of file +@hover: #e5e5e5; +@thumbnails-bc-selected: #e5e5e5; \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/Products/Files/App_Themes/default/common.less b/web/studio/ASC.Web.Studio/Products/Files/App_Themes/default/common.less index c52315a7b..4246e7c88 100644 --- a/web/studio/ASC.Web.Studio/Products/Files/App_Themes/default/common.less +++ b/web/studio/ASC.Web.Studio/Products/Files/App_Themes/default/common.less @@ -32,11 +32,11 @@ label .checkbox { } body .may-row-to, body .may-drop-to { - background-color: @drag-and-drop; + background: @drag-and-drop !important; } .may-row-to.row-to, .may-drop-to.drop-to { - background-color: @drag-and-drop-hover; + background: @drag-and-drop-hover !important; } .stick-panel { position: fixed; diff --git a/web/studio/ASC.Web.Studio/Products/Files/App_Themes/default/images/product_logolarge.svg b/web/studio/ASC.Web.Studio/Products/Files/App_Themes/default/images/product_logolarge.svg index 4a115a3eb..4f084f240 100644 --- a/web/studio/ASC.Web.Studio/Products/Files/App_Themes/default/images/product_logolarge.svg +++ b/web/studio/ASC.Web.Studio/Products/Files/App_Themes/default/images/product_logolarge.svg @@ -1,35 +1,35 @@ - - - - - + + + + + - + - + - + - - + + - - + + - + - + - + diff --git a/web/studio/ASC.Web.Studio/Products/Files/App_Themes/default/images/product_logolarge_dark.svg b/web/studio/ASC.Web.Studio/Products/Files/App_Themes/default/images/product_logolarge_dark.svg new file mode 100644 index 000000000..b08298acf --- /dev/null +++ b/web/studio/ASC.Web.Studio/Products/Files/App_Themes/default/images/product_logolarge_dark.svg @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/web/studio/ASC.Web.Studio/Products/Files/App_Themes/default/params.less b/web/studio/ASC.Web.Studio/Products/Files/App_Themes/default/params.less index 7007fb911..94f31c354 100644 --- a/web/studio/ASC.Web.Studio/Products/Files/App_Themes/default/params.less +++ b/web/studio/ASC.Web.Studio/Products/Files/App_Themes/default/params.less @@ -75,4 +75,16 @@ @sharing-dialog-bor: #ECECEC; @uploadsvg: "uploadblack.svg"; @loader-12-gif: "loader_12.gif"; -@loader-12-gray-gif: "loader_12_gray.gif"; \ No newline at end of file +@loader-12-gray-gif: "loader_12_gray.gif"; +@jstree-expander: #696969; +@thumbnails-row-selected-bor: #0075ff; +@thumbnails-bc-not-selected: #fff; +@thumbnails-bc-selected: #e5e5e5; +@user-svg: "user.svg"; +@link-svg: "link.svg"; +@settings-svg: "settings.svg"; +@version-operations-col: #83888d; +@version-operations-col-close: #cecece; +@dropdown-folder-parent: #92979B; +@dropdown-folder-parent-col: #83888D; +@sharingDialogButtonArrowPart: rgba(255, 255, 255, 0.3); \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/Products/Files/App_Themes/pure-orange/params.less b/web/studio/ASC.Web.Studio/Products/Files/App_Themes/pure-orange/params.less index 12fc59599..c76e23e0f 100644 --- a/web/studio/ASC.Web.Studio/Products/Files/App_Themes/pure-orange/params.less +++ b/web/studio/ASC.Web.Studio/Products/Files/App_Themes/pure-orange/params.less @@ -37,4 +37,5 @@ @textColor: #333; @borderColor: #D1D1D1; @filesHover: #f2f2f2; -@hover: #e5e5e5; \ No newline at end of file +@hover: #e5e5e5; +@thumbnails-bc-selected: #e5e5e5; \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/Products/Files/App_Themes/wild-pink/params.less b/web/studio/ASC.Web.Studio/Products/Files/App_Themes/wild-pink/params.less index 40c77dc58..afbb31dd5 100644 --- a/web/studio/ASC.Web.Studio/Products/Files/App_Themes/wild-pink/params.less +++ b/web/studio/ASC.Web.Studio/Products/Files/App_Themes/wild-pink/params.less @@ -34,4 +34,5 @@ @filesHover: #f2f2f2; @hover: #e5e5e5; @item-menu-selected: #e1007a; -@item-menu-style: normal; \ No newline at end of file +@item-menu-style: normal; +@thumbnails-bc-selected: #e5e5e5; \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/Products/Files/Configuration/ProductEntryPoint.cs b/web/studio/ASC.Web.Studio/Products/Files/Configuration/ProductEntryPoint.cs index 760e4bb34..9ef05caed 100644 --- a/web/studio/ASC.Web.Studio/Products/Files/Configuration/ProductEntryPoint.cs +++ b/web/studio/ASC.Web.Studio/Products/Files/Configuration/ProductEntryPoint.cs @@ -68,6 +68,7 @@ public override void Init() DisabledIconFileName = "product_disabled_logo.png", IconFileName = "product_logo.png", LargeIconFileName = "product_logolarge.svg", + LargeIconFileNameDark = "product_logolarge_dark.svg", DefaultSortOrder = 10, SubscriptionManager = new SubscriptionManager(), SpaceUsageStatManager = new FilesSpaceUsageStatManager(), diff --git a/web/studio/ASC.Web.Studio/Products/Files/Controls/ChunkUploadDialog/chunkuploaddialog.less b/web/studio/ASC.Web.Studio/Products/Files/Controls/ChunkUploadDialog/chunkuploaddialog.less index 203f96bcb..430e42c8e 100644 --- a/web/studio/ASC.Web.Studio/Products/Files/Controls/ChunkUploadDialog/chunkuploaddialog.less +++ b/web/studio/ASC.Web.Studio/Products/Files/Controls/ChunkUploadDialog/chunkuploaddialog.less @@ -100,7 +100,7 @@ body.bright-blue .upload-svg { background: url("images/uploader_progress.gif") no-repeat scroll 0 0 @border-color; } .fu-row .progress-label { - color: @body-color; + color: #fff; float: left; font-size: 10px; margin-left: -100px; diff --git a/web/studio/ASC.Web.Studio/Products/Files/Controls/ChunkUploadDialog/chunkuploadmanager.js b/web/studio/ASC.Web.Studio/Products/Files/Controls/ChunkUploadDialog/chunkuploadmanager.js index bd3d0993e..ab35cc0ee 100644 --- a/web/studio/ASC.Web.Studio/Products/Files/Controls/ChunkUploadDialog/chunkuploadmanager.js +++ b/web/studio/ASC.Web.Studio/Products/Files/Controls/ChunkUploadDialog/chunkuploadmanager.js @@ -50,7 +50,6 @@ window.ASC.Files.ChunkUploads = (function () { WAITCONFIRM: 5 }; - //init chunk upload dialog var init = function (quota) { if (isInit === false) { @@ -146,12 +145,18 @@ window.ASC.Files.ChunkUploads = (function () { inputObj.appendTo(jq("#buttonUpload").parent()); - jq("#buttonUpload").on("click", function (e) { + jq("#buttonUpload, #createMesterFormFromLocalFile").on("click", function (e) { e.preventDefault(); - jq("#" + id) + var input = jq("#" + id) .removeAttr("webkitdirectory") .removeAttr("mozdirectory") - .removeAttr("directory"); + .removeAttr("directory") + .removeAttr("accept") + .removeAttr("createform"); + + if (e.target.id == "createMesterFormFromLocalFile") { + input.attr("accept", ASC.Files.Utility.Resource.InternalFormats.Document).attr("createform", true); + } if (ASC.Files.Folders.folderContainer == "privacy" && ASC.Desktop && ASC.Desktop.encryptionUploadDialog) { @@ -162,7 +167,7 @@ window.ASC.Files.ChunkUploads = (function () { ASC.Desktop.encryptionUploadDialog(uploadEncryptedFile); } else { - jq("#" + id).trigger("click"); + input.trigger("click"); } }); @@ -171,8 +176,10 @@ window.ASC.Files.ChunkUploads = (function () { jq("#" + id) .attr("webkitdirectory", true) .attr("mozdirectory", true) - .attr("directory", true); - jq("#" + id).trigger("click"); + .attr("directory", true) + .removeAttr("accept") + .removeAttr("createform") + .trigger("click"); }); }; @@ -290,6 +297,7 @@ window.ASC.Files.ChunkUploads = (function () { file.id = createNewGuid(); file.percent = 0; file.loaded = 0; + file.createform = e.target.hasAttribute("createform"); var errorMessage; if ((errorMessage = correctFile(file, folderId)) === true) { @@ -434,6 +442,9 @@ window.ASC.Files.ChunkUploads = (function () { } } else { updateFileRow(file); + if (file.createform) { + checkConvertToDocxf(file); + } } } else { @@ -534,24 +545,25 @@ window.ASC.Files.ChunkUploads = (function () { function createFolders(relativePaths) { if (relativePaths && relativePaths.length) { - var folderId = ASC.Files.Folders.currentFolder.id; + var folderId = uploadFolderId == null ? ASC.Files.Folders.currentFolder.id : uploadFolderId; window.Teamlab.createFolders({}, folderId, relativePaths, { success: function (params, data) { - var folderJsonData = { folder: data }; - var stringData = ASC.Files.Common.jsonToXml(folderJsonData); - var htmlXML = ASC.Files.TemplateManager.translateFromString(stringData); + if (folderId == ASC.Files.Folders.currentFolder.id) { + var folderJsonData = { folder: data }; + var stringData = ASC.Files.Common.jsonToXml(folderJsonData); + var htmlXML = ASC.Files.TemplateManager.translateFromString(stringData); - var folderNewObj = ASC.Files.UI.getEntryObject("folder", "0"); - var folderObj = ASC.Files.EventHandler.insertFolderItems(htmlXML, folderNewObj); + var folderNewObj = ASC.Files.UI.getEntryObject("folder", "0"); + var folderObj = ASC.Files.EventHandler.insertFolderItems(htmlXML, folderNewObj); - folderObj.yellowFade().removeClass("new-folder"); + folderObj.yellowFade().removeClass("new-folder"); - if (ASC.Files.Tree) { - ASC.Files.Tree.reloadFolder(folderId); + if (ASC.Files.Tree) { + ASC.Files.Tree.reloadFolder(folderId); + } } - - var folderTitle = ASC.Files.UI.getObjectData(folderObj).title; + var folderTitle = data.title; ASC.Files.UI.displayInfoPanel(ASC.Files.FilesJSResource.InfoCrateFolder.format(folderTitle)); }, processUrl: function (url) { @@ -583,6 +595,11 @@ window.ASC.Files.ChunkUploads = (function () { var posExt = ASC.Files.Utility.GetFileExtension(file.name); var errorMessage; + if (file.createform && posExt != ASC.Files.Utility.Resource.InternalFormats.Document) { + errorMessage = ASC.Files.FilesJSResource.ErrorMessage_WrongExtension; + ASC.Files.UI.displayInfoPanel(errorMessage, true); + return errorMessage; + } if (ASC.Files.Constants.UPLOAD_FILTER && jq.inArray(posExt, ASC.Files.Utility.Resource.ExtsUploadable) == -1) { errorMessage = ASC.Files.FilesJSResource.ErrorMassage_NotSupportedFormat; ASC.Files.UI.displayInfoPanel(errorMessage, true); @@ -1194,6 +1211,53 @@ window.ASC.Files.ChunkUploads = (function () { } }; + var checkConvertToDocxf = function (file) { + var title = file.name; + var lenExt = ASC.Files.Utility.GetFileExtension(title).length; + title = title.substring(0, title.length - lenExt); + + ASC.Files.Folders.createNewDoc({ + title: title + ASC.Files.Utility.Resource.MasterFormExtension, + entryId: file.data.id + }, false, copyFileAs); + } + var copyFileAs = function (params) { + Teamlab.copyDocFileAs(null, params.templateId, + { + destFolderId: params.folderID, + destTitle: params.fileTitle + }, + { + success: function (_, data) { + ASC.Files.ServiceManager.getFile(ASC.Files.ServiceManager.events.CreateNewFile, + { + fileId: data.id, + show: true, + isStringXml: false, + folderID: params.folderID, + winEditor: params.winEditor + }); + }, + error: function (_, error) { + var fileNewObj = ASC.Files.UI.getEntryObject("file", "0"); + ASC.Files.UI.blockObject(fileNewObj); + ASC.Files.UI.removeEntryObject(fileNewObj); + if (jq("#filesMainContent .file-row").length == 0) { + ASC.Files.EmptyScreen.displayEmptyScreen(); + } + + if (params.winEditor) { + params.winEditor.close(); + } + + ASC.Files.UI.displayInfoPanel(error[0], true); + }, + processUrl: function (url) { + return ASC.Files.Utility.AddExternalShareKey(url); + } + }); + }; + var onCheckConvertStatus = function (obj, params, errorMessage) { if (typeof obj !== "object" && typeof errorMessage != "undefined" || obj == null) { errorMessage = errorMessage || ASC.Files.FilesJSResource.ErrorMassage_ErrorConvert; diff --git a/web/studio/ASC.Web.Studio/Products/Files/Controls/ContentList/ContentList.ascx b/web/studio/ASC.Web.Studio/Products/Files/Controls/ContentList/ContentList.ascx index 64963397f..9d141abc0 100644 --- a/web/studio/ASC.Web.Studio/Products/Files/Controls/ContentList/ContentList.ascx +++ b/web/studio/ASC.Web.Studio/Products/Files/Controls/ContentList/ContentList.ascx @@ -7,9 +7,14 @@ <%-- Link To Parent --%>
-   - ... +   + + + + + + <%= FilesUCResource.TitleSearchIn %> @@ -21,6 +26,9 @@ <%-- Main Content --%>
+ <% if (AddFilterContainer) { %> +
+ <% } %>
    +