diff --git a/.docker/release/Dockerfile b/.docker/release/Dockerfile index d6675462e..0e6473191 100644 --- a/.docker/release/Dockerfile +++ b/.docker/release/Dockerfile @@ -1,7 +1,7 @@ # syntax=docker/dockerfile:1 -FROM alpine:3.18.5 AS builder -RUN apk add --no-cache php82 php82-json php-phar php-zip +FROM alpine:3.24.3 AS builder +RUN apk add --no-cache php85 php85-json php-phar php-zip RUN apk add --no-cache npm RUN npm install -g gulp yarn WORKDIR /source @@ -23,7 +23,7 @@ RUN set -eux; \ rm -v /snappymail/README.md /snappymail/_include.php # Inspired by the original Rainloop dockerfile from youtous on GitLab -FROM php:8.2-fpm-alpine AS final +FROM php:8.5-fpm-alpine AS final LABEL org.label-schema.description="SnappyMail webmail client image using nginx, php-fpm on Alpine" @@ -99,9 +99,6 @@ RUN set -eux; \ # mysql RUN docker-php-ext-install pdo_mysql -# opcache -RUN docker-php-ext-install opcache - # postgres RUN set -eux; \ apk add --no-cache postgresql-libs; \ @@ -122,6 +119,13 @@ RUN set -eux; \ apk del .build-dependencies; \ apk del .deps +# sqlite +RUN set -eux; \ + apk add --no-cache sqlite-libs; \ + apk add --no-cache --virtual .deps sqlite-dev; \ + docker-php-ext-install pdo_sqlite; \ + apk del .deps + # tidy RUN set -eux; \ apk add --no-cache tidyhtml; \ diff --git a/.docker/release/files/entrypoint.sh b/.docker/release/files/entrypoint.sh index 75e82d729..c0ed7df0c 100755 --- a/.docker/release/files/entrypoint.sh +++ b/.docker/release/files/entrypoint.sh @@ -9,6 +9,12 @@ UPLOAD_MAX_SIZE=${UPLOAD_MAX_SIZE:-25M} MEMORY_LIMIT=${MEMORY_LIMIT:-128M} SECURE_COOKIES=${SECURE_COOKIES:-true} +# Disable listening on ipv6 for ipv4-only environments, or nginx will fail to start +if ! ip a | grep 'inet6 ' > /dev/null; then + echo "[INFO] ipv6 is disabled. Configuring nginx to not listen on ipv6" + sed -i '/listen \[::\]:/d' /etc/nginx/nginx.conf +fi + # Set attachment size limit sed -i "s//$UPLOAD_MAX_SIZE/g" /usr/local/etc/php-fpm.d/php-fpm.conf /etc/nginx/nginx.conf sed -i "s//$MEMORY_LIMIT/g" /usr/local/etc/php-fpm.d/php-fpm.conf diff --git a/.docker/release/files/etc/nginx/nginx.conf b/.docker/release/files/etc/nginx/nginx.conf index ed87cb201..aff3829cf 100644 --- a/.docker/release/files/etc/nginx/nginx.conf +++ b/.docker/release/files/etc/nginx/nginx.conf @@ -52,6 +52,8 @@ http { server { listen 8888; + listen [::]:8888; + #listen [::]:8888 ipv6only=off; root /snappymail; index index.php; charset utf-8; diff --git a/.eslintrc.js b/.eslintrc.js index 5e2334f0a..e22cb986d 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -3,7 +3,7 @@ module.exports = { // extends: ['eslint:recommended', 'plugin:prettier/recommended'], extends: ['eslint:recommended'], parserOptions: { - ecmaVersion: 6, + ecmaVersion: 11, sourceType: 'module' }, env: { @@ -37,7 +37,11 @@ module.exports = { // Mailvelope 'mailvelope': "readonly", // Punycode - 'IDN': "readonly" + 'IDN': "readonly", + // Turndown + 'TurndownService': "readonly", + // Marked + 'marked': "readonly" }, // http://eslint.org/docs/rules/ rules: { diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index d53d388ed..998692964 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -30,8 +30,9 @@ If applicable, add screenshots to help explain your problem. - SnappyMail Version: - Mode: [e.g. standalone, nextcloud, cyberpanel, docker] -**[Debug/logging information](https://github.com/the-djmaze/snappymail/wiki/FAQ#how-do-i-enable-logging)** -Place them here (few lines) or as attachments (many lines) +**Debug/logging information** +[Read here how to log](https://github.com/the-djmaze/snappymail/wiki/FAQ#how-do-i-enable-logging) +- [ ] I've placed them here (few lines) or as attachments (many lines) **Additional context** Add any other context about the problem here. diff --git a/.gitignore b/.gitignore index b4e8f72e4..5f49d65d5 100644 --- a/.gitignore +++ b/.gitignore @@ -25,6 +25,8 @@ /vendors/knockout/spec /vendors/openpgp-5 !/vendors/openpgp-5/dist +/vendors/squire2 +!/vendors/squire2/dist /vendors/vanillaqr.js/ /integrations/nextcloud/rainloop /integrations/owncloud/rainloop diff --git a/.gitmodules b/.gitmodules index cfb771834..ccf1009a6 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,7 @@ [submodule "vendors/openpgp-5"] path = vendors/openpgp-5 url = git@github.com:the-djmaze/openpgpjs.git +[submodule "vendors/squire2"] + path = vendors/squire2 + url = git@github.com:the-djmaze/Squire.git + branch = snappymail diff --git a/.htaccess b/.htaccess index faa8201c8..71041371a 100644 --- a/.htaccess +++ b/.htaccess @@ -1,7 +1,15 @@ + + AcceptPathInfo On + + RewriteEngine On # Redirect cPanel RewriteRule cpsess.* https://%{HTTP_HOST}/ [L,R=301] + + RewriteCond %{REQUEST_FILENAME} !-f + RewriteCond %{REQUEST_FILENAME} !-d + RewriteRule ^(.+)$ index.php/$1 [L,QSA] diff --git a/CHANGELOG.md b/CHANGELOG.md index 08c855b4c..d31a1b771 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,380 @@ +## 2.38.2 – 2024-10-09 +### Fixed +- error '$index is not defined' in Settings > Accounts + [#1797](https://github.com/the-djmaze/snappymail/issues/1797) + + +## 2.38.1 – 2024-10-08 + +### Added +- Admin - Extensions search filter +- Options to unset current font family and size + [#1726](https://github.com/the-djmaze/snappymail/issues/1726) +- Option to allow insecure cryptkey + [#1746](https://github.com/the-djmaze/snappymail/issues/1746) +- Save vCard FN property + [#1761](https://github.com/the-djmaze/snappymail/issues/1761) +- Docker Nginx should listen on IPv6 addresses in addition to IPv4 + [#1770](https://github.com/the-djmaze/snappymail/issues/1770) +- Full-screen Message View on Double-Click + [#1787](https://github.com/the-djmaze/snappymail/issues/1787) + +### Changed +- Use the custom Squire as submodule vendors/squire2 +- Disallow noembed and noframes HTML elements +- Keep 1 space between HTML elements in compressed templates +- Squire: sanitizeToDOMFragment now uses cleanHTML() +- Squire: improved handling of BR elements + [#1389](https://github.com/the-djmaze/snappymail/issues/1389) +- Nextcloud border-radius by @gnilebein + [#1790](https://github.com/the-djmaze/snappymail/pull/1790) +- Compose window sentFolder handling for + [#1793](https://github.com/the-djmaze/snappymail/pull/1793) +- Update Portuguese by @ner00 +- Update Polish by @tinola +- Update French by @hguilbert +- Update Portuguese (Brazil) by @mstolf + +### Fixed +- Composer dialog scroll got broken in v2.28 +- Composer dialog "from" triangle button wrong position due to font changes +- Admin - Config `search` should be ko.observable() not ko.observableArray() +- Squire: paste images + [#1389](https://github.com/the-djmaze/snappymail/issues/1389) +- Domain whitelist failures on login + [#1706](https://github.com/the-djmaze/snappymail/issues/1706) +- Sieve parse errors +- Sieve support `index` was not optional for + [#1709](https://github.com/the-djmaze/snappymail/issues/1709) +- Pagination problem for large mailbox after 2.36.1 + [#1716](https://github.com/the-djmaze/snappymail/issues/1716) +- Undefined constant "LOG_ERROR" + [#1754](https://github.com/the-djmaze/snappymail/issues/1754) +- Search Filter Capital "B" not working + [#1780](https://github.com/the-djmaze/snappymail/issues/1780) +- PHP 8.4: Implicitly nullable parameter declarations deprecated + + +## 2.38.0 – 2024-09-16 + +### Added +- Remove `tel:` links when converting HTML to plain + [#1724](https://github.com/the-djmaze/snappymail/issues/1724) +- Convert HTML to Markdown instead of plain, by using [Turndown](https://github.com/mixmark-io/turndown) + [#1604](https://github.com/the-djmaze/snappymail/issues/1604) +- Check HTMLInputElement.validity() for + [#1733](https://github.com/the-djmaze/snappymail/issues/1733) + +### Changed +- Use a modified [Squire 2.3.2](https://github.com/the-djmaze/Squire/commits/snappymail/) +- cleanHtml use allowedTags instead of disallowedTags and improved CSS handling +- Update Portuguese by @ner00 + +### Fixed +- mXSS exploit found by SonarSource + [CVE-2024-45800](https://github.com/the-djmaze/snappymail/security/advisories/GHSA-2rq7-79vp-ffxm) +- Call to a member function Email() on null + [#1706](https://github.com/the-djmaze/snappymail/issues/1706) +- IMAP capabilities via IMAP Proxy + [#1725](https://github.com/the-djmaze/snappymail/issues/1725) +- Messages on page setting is not validated against 999 max + [#1733](https://github.com/the-djmaze/snappymail/issues/1733) + + +## 2.37.3 – 2024-08-27 + +### Added +- Mark images with width=1 as tracking pixel +- Show warning in Admin -> About when PHP runs in 32bit +- Edit ACL rules + [#157](https://github.com/the-djmaze/snappymail/issues/157) +- Show GnuPG version for + [#1560](https://github.com/the-djmaze/snappymail/issues/1560) +- Make sure only scalar values are allowed in $_ENV for + [#1560](https://github.com/the-djmaze/snappymail/issues/1560) +- Change minimum new mail check interval + [#1678](https://github.com/the-djmaze/snappymail/issues/1678) +- Sieve editor does not support "index" extension + [#1709](https://github.com/the-djmaze/snappymail/issues/1709) + +### Changed +- Improved domain autoconfig interaction +- MS autodiscover priorities DNS over subdomain +- Simplify sieve scripts list + [#1675](https://github.com/the-djmaze/snappymail/issues/1675) +- Handling of (token) errors due to + [#1706](https://github.com/the-djmaze/snappymail/issues/1706) +- Sabre/Xml to v4.0.5 +- Update Chinese by @Artoria2e5 +- Update French by @hguilbert + +### Fixed +- Thread sorting visible after disabling the imap capability + [#1574](https://github.com/the-djmaze/snappymail/issues/1574) +- Creating new message impossible as long as a draft exists? + [#1710](https://github.com/the-djmaze/snappymail/issues/1710) +- InvalidToken error at login + [#1706](https://github.com/the-djmaze/snappymail/issues/1706) + +### Nextcloud +- Force Nextcloud personal language by default + [#1428](https://github.com/the-djmaze/snappymail/issues/1428) + + +## 2.37.2 – 2024-08-13 + +### Added +- Validate Fetch JSON response + +### Fixed +- PATH_INFO bug due to Office365 OAuth login +- Prevent logout loop on error + +### Nextcloud +- Failed loading due to Office365 OAuth2 attempt + [#1703](https://github.com/the-djmaze/snappymail/issues/1703) + + +## 2.37.1 – 2024-08-12 + +### Fixed +- Gulp v5 broke the fonts + +### Nextcloud +- Support v30 + + +## 2.37.0 – 2024-08-12 + +### Added +- JavaScript event `rl-vm-visible` +- Detailed error message on account switch failure for + [#1594](https://github.com/the-djmaze/snappymail/issues/1594) +- Workarounds for Microsoft OAuth2 (currently requires Apache AcceptPathInfo) + [#1645](https://github.com/the-djmaze/snappymail/issues/1645) +- Support "mark for deletion" + [#1657](https://github.com/the-djmaze/snappymail/issues/1657) by @smsoft-ru +- Invoke "Update Identity" pop up right after login (when not initialized) + [#1689](https://github.com/the-djmaze/snappymail/issues/1689) +- Keyboard shortcut for "Swap default (background) color" + [#1690](https://github.com/the-djmaze/snappymail/issues/1690) + +### Changed +- Updated gulp to v5 +- Replaced vulnerable gulp-header with gulp-append-prepend +- Removed abandoned vulnerable rollup-plugin-html +- Align save button in admin security settings +- Made registerProtocolHandler('mailto') optional by activating at Settings -> General +- Improved InvalidToken handling for + [#1653](https://github.com/the-djmaze/snappymail/issues/1653) +- Cleanup localizations +- Update French by @hguilbert +- Update German by @tkasch +- Update Polish by @tinola +- Update Portuguese by @ner00 + +### Fixed +- prevent multiple afterShow() and afterHide() due to `transitionend` on multiple CSS properties +- Attempt to read property "smimeSigned" on null +- Refreshing mail list doesn't update current message + [#1654](https://github.com/the-djmaze/snappymail/issues/1654) +- Deletion of CACHE folder causing error + [#1660](https://github.com/the-djmaze/snappymail/issues/1660) +- Multiple line breaks are not displayed + [#1666](https://github.com/the-djmaze/snappymail/issues/1666) +- RainLoop\Exceptions\ClientException::__construct(): Argument #2 ($oPrevious) must be of type ?Throwable, string given + [#1686](https://github.com/the-djmaze/snappymail/issues/1686) +- SpamAssassin Division by zero + [#1694](https://github.com/the-djmaze/snappymail/issues/1694) +- Failed to parse RFC 2822 date '6 Jul 2024 16:42:09 +0200' + [#1694](https://github.com/the-djmaze/snappymail/issues/1694) +- Fix capabilities when THREAD is disabled + [#1698](https://github.com/the-djmaze/snappymail/pull/1698) by @akhil1508 + +### Nextcloud +- Failed loading due to incorrect `app_path` +- Bugfix language detection +- Allow multi-account in nc with oauth login + [#1699](https://github.com/the-djmaze/snappymail/pull/1699) by @akhil1508 + + +## 2.36.4 – 2024-06-25 + +### Added +- Customize private key passphrase expiration interval + [#1545](https://github.com/the-djmaze/snappymail/discussions/1545) +- AdvancedSearch support for filtering mails before a given date + [#1606](https://github.com/the-djmaze/snappymail/pull/1606) by @codiflow +- Control valid spam and virus headers + [#1607](https://github.com/the-djmaze/snappymail/issues/1607) +- Remember S/MIME private Key without function + [#1611](https://github.com/the-djmaze/snappymail/issues/1611) +- Resize compose dialog +- Magnetic theme + [#1637](https://github.com/the-djmaze/snappymail/pull/1637) by @TheCuteFoxxy + +### Changed +- Improved signing messages by allowing to choose between the options +- Improved language detection code +- More detailed Decrypt errors +- Update French by @hguilbert +- Update Polish by @tinola +- Update Portuguese by @ner00 +- Update Spanish by @huloza + +### Fixed +- Default language error +- Undefined $sEmail in DoAdminDomainMatch +- Handling Autocrypt header failed on `=` + [#1608](https://github.com/the-djmaze/snappymail/issues/1608) +- Blank lines are inserted when editing draft + [#1609](https://github.com/the-djmaze/snappymail/issues/1609) +- Workaround Cyrus MAILBOXID bug (disable OBJECTID capability by default due to impact) + [#1640](https://github.com/the-djmaze/snappymail/issues/1640) +- Workaround HTML with multiple body elements or MIME with multiple text/html + [#1641](https://github.com/the-djmaze/snappymail/issues/1641) + +### Nextcloud +- OIDC stay logged in + [#1620](https://github.com/the-djmaze/snappymail/pull/1620) by @avinash-0007 + + +## 2.36.3 – 2024-05-27 + +### Changed +- UserAuth prevent plugin errors (like the Nextcloud plugin did) + +### Fixed +- Undefined variable $aTokenData + [#1567](https://github.com/the-djmaze/snappymail/issues/1567) + + +## 2.36.2 – 2024-05-26 + +### Added +- "copy to" action in menu's for + [#1559](https://github.com/the-djmaze/snappymail/issues/1559) +- Log signal info for + [#1569](https://github.com/the-djmaze/snappymail/issues/1569) +- OpenPGP.js automatically import backup keys from server + +### Changed +- Improved "remember me" cookie handling +- Update Basque by @Thadah +- Update Portuguese by @ner00 + +### Fixed +- "Account already exists" + [#1561](https://github.com/the-djmaze/snappymail/issues/1561) +- Properly escape path separator in tar.php file list regex + [#1562](https://github.com/the-djmaze/snappymail/pull/1562) by @sevmonster +- Prevent mkdir() error + [#1565](https://github.com/the-djmaze/snappymail/issues/1565) +- SCRAM Exception when trying to log in to SMTP + [#1575](https://github.com/the-djmaze/snappymail/issues/1575) +- Error when redirected back to instance after Gmail OAuth + [#1580](https://github.com/the-djmaze/snappymail/issues/1580) +- Uncaught TypeError: hasPublicKeyForEmails(...).then is not a function + [#1589](https://github.com/the-djmaze/snappymail/issues/1589) +- Undefined variable $sFilename +- GPG/PGP exec() return false handling + +### Nextcloud +- OIDC login active again + [#1572](https://github.com/the-djmaze/snappymail/pull/1572) by @avinash-0007 + + +## 2.36.1 – 2024-04-23 + +### Added +- Autoconfig detect through DNS SRV (RFC 6186 & 8314) and disable MX +- Have I Been Pwned class to check breached passwords and email addresses +- Handle RFC 5987 in Content-Disposition header +- Ignore text/x-amp-html +- Show SMTP error to user + [#1521](https://github.com/the-djmaze/snappymail/issues/1521) +- OAuth2 for login using gmail (and others) + +### Changed +- logMask all AUTHENTICATE requests +- ErrorTip use white-space: pre +- Simplify LoginProcess handling +- ES2020 everywhere (require Safari 13.1) +- Modified Squire to be more in line with v2.2.8 +- CSS set min-width for .attachmentParent and .flagParent to line them up +- cPanel use extension login-cpanel instead of login-remote +- Improved login credentials handling +- Speedup Knockout a bit and removed `with($context)` scope +- Update Belarusian by @spoooyders +- Update Chinese by @mayswind +- Update French by @hguilbert +- Update Polish by @tinola +- Update Portuguese by @ner00 + +### Fixed +- Content encoding and type detection in JavaScript could fail due to case-sensitivity. +- Extensions set logger failed +- GnuPG check open_basedir and if shell_exec is disabled + [#1385](https://github.com/the-djmaze/snappymail/issues/1385) + [#1496](https://github.com/the-djmaze/snappymail/issues/1496) + [#1555](https://github.com/the-djmaze/snappymail/issues/1555) +- Hide pagination when search result has no messages +- Prevent mbstring error before setup.php +- Prevent MessagesPerPage Infinity + [#1540](https://github.com/the-djmaze/snappymail/issues/1540) +- Reseal CryptKey failed + [#1543](https://github.com/the-djmaze/snappymail/issues/1543) + +### Nextcloud +- Add an occ command to set up the login settings + [#1552](https://github.com/the-djmaze/snappymail/issues/1552) + + +## 2.36.0 – 2024-03-18 + +### Added +- Allow setting the supported THREAD algorithm +- Icon to system folders +- Remove remembered password after 15 minutes of inactivity + [#1142](https://github.com/the-djmaze/snappymail/issues/1142) +- Swap background and text color for unreadable text on dark background + [#1486](https://github.com/the-djmaze/snappymail/issues/1486) +- Generate TOTP code at ?Admin -> Security + [#1501](https://github.com/the-djmaze/snappymail/issues/1501) +- Button to change S/MIME private key passphrase + [#1505](https://github.com/the-djmaze/snappymail/issues/1505) +- Belarusian + [#1512](https://github.com/the-djmaze/snappymail/pull/1512) by @spoooyders +- Log some domain idn_to_ascii issues + [#1513](https://github.com/the-djmaze/snappymail/issues/1513) + +### Changed +- On folder/mailbox rename, also rename all children instead of reloading all +- Seal MainAccount CryptKey and on error ask old login passphrase to reseal key. +- Moved cache drivers outside core into extensions +- Sieve always allow fileinto INBOX + [#1510](https://github.com/the-djmaze/snappymail/issues/1510) +- Moved application.ini `sieve_auth_plain_initial` to per domain config +- Languages use rfc5646, by using the shortest ISO 639 code by default +- Update French by @hguilbert +- Update Portuguese by @ner00 + +### Fixed +- On folder/mailbox rename, the old fullName must be removed from cache +- On folder/mailbox rename, the checkable option was not renamed +- Sort accounts drag & drop +- S/MIME encrypted and opaque signed not visible + [#1450](https://github.com/the-djmaze/snappymail/issues/1450) +- Wrong last UID of thread + [#1507](https://github.com/the-djmaze/snappymail/issues/1507) +- Creation of dynamic property SnappyMail\DAV\Client::$HTTP + [#1509](https://github.com/the-djmaze/snappymail/issues/1509) +- "Download as ZIP" fails for messages + [#1514](https://github.com/the-djmaze/snappymail/issues/1514) +- SMTP "Authentication failed" when IMAP uses `shortLogin` and SMTP not + [#1517](https://github.com/the-djmaze/snappymail/issues/1517) + + ## 2.35.4 – 2024-03-16 ### Added @@ -6,7 +383,6 @@ ### Changed - OpenPGP.js to v5.11.1 - punycode.js lowercase domain names -- Nextcloud changed stored password handling - application.ini `login_lowercase` removed and now configurable per domain JSON `lowerLogin` - Update Portuguese by @ner00 @@ -21,6 +397,11 @@ [#1500](https://github.com/the-djmaze/snappymail/issues/1500) - VCard PHP Notice: Undefined index: ENCODING +### Nextcloud +- Changed stored password handling +- Can't login from nextcloud with 2.35.3 bug Nextcloud + [#1490](https://github.com/the-djmaze/snappymail/issues/1490) + ## 2.35.3 – 2024-03-12 @@ -68,8 +449,9 @@ - Crash on importing corrupt OpenPGP keys - Crash on old browsers instead of showing error - Ignore popups on logoutReload() + [#1467](https://github.com/the-djmaze/snappymail/issues/1467) - Custom SASLMechanisms fail in IMAP when the connection is secure - [#1484](https://github.com/the-djmaze/snappymail/pull/1484) + [#1484](https://github.com/the-djmaze/snappymail/pull/1484) by @botsarenthuman ## 2.35.2 – 2024-02-27 @@ -86,7 +468,9 @@ - Drop support for gnupg PECL extension as it fails with "no passphrase" issues - Error 352 when getting Filters [#1455](https://github.com/the-djmaze/snappymail/issues/1455) -- Nextcloud SetPassword(): Argument #1 must be of type SensitiveString, string given + +### Nextcloud +- SetPassword(): Argument #1 must be of type SensitiveString, string given [#1456](https://github.com/the-djmaze/snappymail/issues/1456) @@ -267,8 +651,8 @@ - Run full GetUids() in background when message_list_limit is set - MessageListThreadsMap as background task when message_list_limit is set - Properly set CACHEDIR.TAG -- Sending group email to all contact addresses by @rezaei92 - [#1286](https://github.com/the-djmaze/snappymail/pull/1286) +- Sending group email to all contact addresses + [#1286](https://github.com/the-djmaze/snappymail/pull/1286) by @rezaei92 ### Changed - Default IMAP message_list_limit to 10000 @@ -276,8 +660,8 @@ - Improved Squire WYSIWYG - Sort real attachments and inline attachments for [#1360](https://github.com/the-djmaze/snappymail/issues/1360) -- Nextcloud Theme fixes and improvements by @hampoelz - [#1363](https://github.com/the-djmaze/snappymail/pull/1363) +- Nextcloud Theme fixes and improvements + [#1363](https://github.com/the-djmaze/snappymail/pull/1363) by @hampoelz - Improve display of attachments [#1361](https://github.com/the-djmaze/snappymail/issues/1361) - Rename messageVisibility to messageVisible @@ -291,8 +675,8 @@ - Preview tooltip shows "null" when PREVIEW capability is disabled ### Nextcloud -- Improved language handling by @avinash-0007 - [#1362](https://github.com/the-djmaze/snappymail/pull/1362) +- Improved language handling + [#1362](https://github.com/the-djmaze/snappymail/pull/1362) by @avinash-0007 - FilterLanguage had wrong parameter order - Use NextcloudV25+ theme by default @@ -313,8 +697,8 @@ [#1344](https://github.com/the-djmaze/snappymail/issues/1344) - NO Mailbox does not exist, or must be subscribed to") [#1354](https://github.com/the-djmaze/snappymail/issues/1354) -- Flag indicators are added to wrong message by @SergeyMosin - [#1347](https://github.com/the-djmaze/snappymail/pull/1347) +- Flag indicators are added to wrong message + [#1347](https://github.com/the-djmaze/snappymail/pull/1347) by @SergeyMosin - Squire: issue when using the enter key in a reply window [#1296](https://github.com/the-djmaze/snappymail/issues/1296) - Squire: crash on cut/delete range @@ -428,8 +812,8 @@ [#1308](https://github.com/the-djmaze/snappymail/issues/1308) - With email open, "delete" doesn't delete #1274 [#1274](https://github.com/the-djmaze/snappymail/issues/1274) -- Fix threading view in Thunderbird (others?) by @tkasch - [#1304](https://github.com/the-djmaze/snappymail/pull/1304) +- Fix threading view in Thunderbird (others?) + [#1304](https://github.com/the-djmaze/snappymail/pull/1304) by @tkasch ## 2.29.1 – 2023-10-02 @@ -443,18 +827,18 @@ ### Added - Modern UI / Nextcloud Theme [#629](https://github.com/the-djmaze/snappymail/pull/629) by @hampoelz -- "Add/Edit signature" label to PopupsIdentity.html by @SergeyMosin - [#1248](https://github.com/the-djmaze/snappymail/pull/1248) +- "Add/Edit signature" label to PopupsIdentity.html + [#1248](https://github.com/the-djmaze/snappymail/pull/1248) by @SergeyMosin - use calendar icon in message list for messages with '.ics' or 'text/calendar' attachments by @SergeyMosin [#1248](https://github.com/the-djmaze/snappymail/pull/1248) -- Show unseen message count when the message list is threaded by @SergeyMosin - [#1248](https://github.com/the-djmaze/snappymail/pull/1248) -- in mobile mode hide folders(left) panel when a folder is clicked by @SergeyMosin - [#1248](https://github.com/the-djmaze/snappymail/pull/1248) -- spellcheck the subject when 'allowSpellcheck' setting is true by @SergeyMosin - [#1248](https://github.com/the-djmaze/snappymail/pull/1248) -- 'collapse_blockquotes', 'allow_spellcheck' and 'mail_list_grouped' to admin settings ('defaults' section) by @SergeyMosin - [#1248](https://github.com/the-djmaze/snappymail/pull/1248) +- Show unseen message count when the message list is threaded + [#1248](https://github.com/the-djmaze/snappymail/pull/1248) by @SergeyMosin +- in mobile mode hide folders(left) panel when a folder is clicked + [#1248](https://github.com/the-djmaze/snappymail/pull/1248) by @SergeyMosin +- spellcheck the subject when 'allowSpellcheck' setting is true + [#1248](https://github.com/the-djmaze/snappymail/pull/1248) by @SergeyMosin +- 'collapse_blockquotes', 'allow_spellcheck' and 'mail_list_grouped' to admin settings ('defaults' section) + [#1248](https://github.com/the-djmaze/snappymail/pull/1248) by @SergeyMosin - Browser support for autocompleting TOTP code [#1251](https://github.com/the-djmaze/snappymail/issues/1251) @@ -465,10 +849,10 @@ [#1199](https://github.com/the-djmaze/snappymail/issues/1199) - Draft code to improve mobile breakpoints [#1150](https://github.com/the-djmaze/snappymail/issues/1150) -- address input: space character can trigger '_parseValue' if the email address looks complete by @SergeyMosin - [#1248](https://github.com/the-djmaze/snappymail/pull/1248) -- if applicable set '\\answered' or '$forwarded' flag after a message is sent so the proper icon is shown in the message list view by @SergeyMosin - [#1248](https://github.com/the-djmaze/snappymail/pull/1248) +- address input: space character can trigger '_parseValue' if the email address looks complete + [#1248](https://github.com/the-djmaze/snappymail/pull/1248) by @SergeyMosin +- if applicable set '\\answered' or '$forwarded' flag after a message is sent so the proper icon is shown in the message list view + [#1248](https://github.com/the-djmaze/snappymail/pull/1248) by @SergeyMosin ### Fixed - CHARSET is not valid in UTF8 mode @@ -481,39 +865,39 @@ [#1220](https://github.com/the-djmaze/snappymail/issues/1220) - "Request failed" on message move [#1220](https://github.com/the-djmaze/snappymail/issues/1220) -- Unwrapped text nodes attached to squire._root by @SergeyMosin - [#1234](https://github.com/the-djmaze/snappymail/pull/1234) +- Unwrapped text nodes attached to squire._root + [#1234](https://github.com/the-djmaze/snappymail/pull/1234) by @SergeyMosin - Extra wrapper div is added in Squire every time a Draft is open (or closed) after save. [#1208](https://github.com/the-djmaze/snappymail/issues/1208) - foreach() argument must be of type array|object [#1237](https://github.com/the-djmaze/snappymail/issues/1237) -- `` tag 'style' is lost in replies by @SergeyMosin - [#1248](https://github.com/the-djmaze/snappymail/pull/1248) -- unseen indicator is not shown in thread view when 'listGrouped' settings is false by @SergeyMosin - [#1248](https://github.com/the-djmaze/snappymail/pull/1248) +- `` tag 'style' is lost in replies + [#1248](https://github.com/the-djmaze/snappymail/pull/1248) by @SergeyMosin +- unseen indicator is not shown in thread view when 'listGrouped' settings is false + [#1248](https://github.com/the-djmaze/snappymail/pull/1248) by @SergeyMosin - TOTP plugin is dependent on ctype [#1250](https://github.com/the-djmaze/snappymail/issues/1250) ### Nextcloud -- iFrame mode: click on unified search result opens inner iFrame by @SergeyMosin - [#1248](https://github.com/the-djmaze/snappymail/pull/1248) -- set 'smremember' cookie if 'sign_me_auto' is set to 'DefaultOn' when using 'snappymail-autologin*', otherwise nextcloud users need to re-login when the browser is re-opened. by @SergeyMosin - [#1248](https://github.com/the-djmaze/snappymail/pull/1248) -- Improve UX of "Put in Calendar" option in plugin by @theronakpatel - [#1259](https://github.com/the-djmaze/snappymail/pull/1259) +- iFrame mode: click on unified search result opens inner iFrame + [#1248](https://github.com/the-djmaze/snappymail/pull/1248) by @SergeyMosin +- set 'smremember' cookie if 'sign_me_auto' is set to 'DefaultOn' when using 'snappymail-autologin*', otherwise nextcloud users need to re-login when the browser is re-opened + [#1248](https://github.com/the-djmaze/snappymail/pull/1248) by @SergeyMosin +- Improve UX of "Put in Calendar" option in plugin + [#1259](https://github.com/the-djmaze/snappymail/pull/1259) by @theronakpatel ## 2.28.4 – 2023-07-10 ### Added -- application.ini msg_default_action by @SergeyMosin - [#1204](https://github.com/the-djmaze/snappymail/pull/1204) -- application.ini view_show_next_message by @SergeyMosin - [#1204](https://github.com/the-djmaze/snappymail/pull/1204) -- application.ini view_images by @SergeyMosin - [#1204](https://github.com/the-djmaze/snappymail/pull/1204) -- nextcloud add ability to include custom php file in InstallStep migration by @SergeyMosin - [#1197](https://github.com/the-djmaze/snappymail/pull/1197) +- application.ini msg_default_action + [#1204](https://github.com/the-djmaze/snappymail/pull/1204) by @SergeyMosin +- application.ini view_show_next_message + [#1204](https://github.com/the-djmaze/snappymail/pull/1204) by @SergeyMosin +- application.ini view_images + [#1204](https://github.com/the-djmaze/snappymail/pull/1204) by @SergeyMosin +- nextcloud add ability to include custom php file in InstallStep migration + [#1197](https://github.com/the-djmaze/snappymail/pull/1197) by @SergeyMosin - Support plugin for Squire editor [#1192](https://github.com/the-djmaze/snappymail/issues/1192) @@ -521,14 +905,14 @@ - only show 'Add "domain.tld" as an application for mailto links?' message after login (firefox shows the message on every reload otherwise). [#1204](https://github.com/the-djmaze/snappymail/issues/1204) - Convert getPdoAccessData() : array to a RainLoop\Pdo\Settings object instance -- New bidi buttons to Squire editor by @rezaei92 - [#1200](https://github.com/the-djmaze/snappymail/pull/1200) +- New bidi buttons to Squire editor + [#1200](https://github.com/the-djmaze/snappymail/pull/1200) by @rezaei92 ### Fixed - Undefined constant PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT [#1205](https://github.com/the-djmaze/snappymail/issues/1205) -- 'reloadTime' function result is passed into 'setInterval' instead of the function by @SergeyMosin - [#1204](https://github.com/the-djmaze/snappymail/pull/1204) +- 'reloadTime' function result is passed into 'setInterval' instead of the function + [#1204](https://github.com/the-djmaze/snappymail/pull/1204) by @SergeyMosin - UNKNOWN-CTE Invalid data in MIME part [#1186](https://github.com/the-djmaze/snappymail/issues/1186) @@ -591,10 +975,10 @@ ### Changed - Optical issue with input fields for mail and folder search [#1149](https://github.com/the-djmaze/snappymail/issues/1149) -- Update Chinese translation by @mayswind - [#1157](https://github.com/the-djmaze/snappymail/pull/1157) -- Update Polish translation by @tinola - [#1156](https://github.com/the-djmaze/snappymail/pull/1156) +- Update Chinese translation + [#1157](https://github.com/the-djmaze/snappymail/pull/1157) by @mayswind +- Update Polish translation + [#1156](https://github.com/the-djmaze/snappymail/pull/1156) by @tinola ### Fixed - Undefined SIG constants @@ -623,18 +1007,18 @@ - Allow empty message body when there are attachments [#1052](https://github.com/the-djmaze/snappymail/issues/1052) - PHP inherit logger as Trait -- Update Portuguese by @ner00 - [#1124](https://github.com/the-djmaze/snappymail/pull/1124) -- Update Traditional Chinese (Taiwan) by @chiyi4488 - [#1107](https://github.com/the-djmaze/snappymail/pull/1107) -- Update Russian by @konkere - [#1108](https://github.com/the-djmaze/snappymail/pull/1108) -- Update Italian by @cm-schl - [#1094](https://github.com/the-djmaze/snappymail/pull/1094) -- Update French by @hguilbert - [#1102](https://github.com/the-djmaze/snappymail/pull/1102) -- Update German by @cm-schl - [#1087](https://github.com/the-djmaze/snappymail/pull/1087) +- Update Portuguese + [#1124](https://github.com/the-djmaze/snappymail/pull/1124) by @ner00 +- Update Traditional Chinese (Taiwan) + [#1107](https://github.com/the-djmaze/snappymail/pull/1107) by @chiyi4488 +- Update Russian + [#1108](https://github.com/the-djmaze/snappymail/pull/1108) by @konkere +- Update Italian + [#1094](https://github.com/the-djmaze/snappymail/pull/1094) by @cm-schl +- Update French + [#1102](https://github.com/the-djmaze/snappymail/pull/1102) by @hguilbert +- Update German + [#1087](https://github.com/the-djmaze/snappymail/pull/1087) by @cm-schl ### Fixed - Show messagelist timeout/abort error for @@ -695,8 +1079,8 @@ - Workaround Upgrade with Nextcloud stuck in Maintenance mode [#1046](https://github.com/the-djmaze/snappymail/issues/1046) - Use Actions()->decodeRawKey() -- French language updated by @hguilbert - [#1045](https://github.com/the-djmaze/snappymail/pull/1045) +- French language updated + [#1045](https://github.com/the-djmaze/snappymail/pull/1045) by @hguilbert - Sorting in folders not working [#1022](https://github.com/the-djmaze/snappymail/issues/1022) - Allow saving draft with empty body @@ -760,15 +1144,15 @@ ### Changed - Improved FolderCollection handling - MODSEQ requires 64-bit int -- Update russian language by @Akrobs - [#994](https://github.com/the-djmaze/snappymail/pull/994) +- Update russian language + [#994](https://github.com/the-djmaze/snappymail/pull/994) by @Akrobs - Don't make font bigger when screen > 1400px - Put top menu "accountPlace" inside top-system-dropdown-id - Put attachment controls inside attachmentsPlace - Show message toolbar on screens > 1400px [#970](https://github.com/the-djmaze/snappymail/issues/970) -- Chinese updated by @mayswind - [#1011](https://github.com/the-djmaze/snappymail/pull/1011) +- Chinese updated + [#1011](https://github.com/the-djmaze/snappymail/pull/1011) by @mayswind - Prevent folder/messages flags conflict by using the right name `attributes` for Folders - FolderInformation() use jsonSerialize() - Squire space handling on paste use `\u00A0` instead of ` ` for @@ -811,16 +1195,16 @@ ### Changed - Reduce/simplify CSS footprint -- Use the System/Browser font by default by @HeySora - [#988](https://github.com/the-djmaze/snappymail/pull/988) +- Use the System/Browser font by default + [#988](https://github.com/the-djmaze/snappymail/pull/988) by @HeySora - Make layout fully responsive using matchMedia('(max-width: 799px)') - Move brotli and gzip compress option to application.ini - After page refreshes in background whilst editing a draft, the space bar stops working [#860](https://github.com/the-djmaze/snappymail/issues/860) -- Updated Portuguese by @ner00 - [#984](https://github.com/the-djmaze/snappymail/pull/984) -- Updated French by @hguilbert - [#985](https://github.com/the-djmaze/snappymail/pull/985) +- Updated Portuguese + [#984](https://github.com/the-djmaze/snappymail/pull/984) by @ner00 +- Updated French + [#985](https://github.com/the-djmaze/snappymail/pull/985) by @hguilbert ### Fixed - unset border-box for message body @@ -916,8 +1300,8 @@ - Workaround "server connection error" [#936](https://github.com/the-djmaze/snappymail/issues/936) - Cleanup AbstractViewPopup handling -- Italian translation by @lota - [#948](https://github.com/the-djmaze/snappymail/pull/948) +- Italian translation + [#948](https://github.com/the-djmaze/snappymail/pull/948) by @lota - Replace Element.fromHTML() with createElement() ### Fixed @@ -965,8 +1349,8 @@ ## 2.25.5 – 2023-02-09 ### Added -- New dark themes by @TheCuteFoxxy - [#925](https://github.com/the-djmaze/snappymail/pull/925) +- New dark themes + [#925](https://github.com/the-djmaze/snappymail/pull/925) by @TheCuteFoxxy - External images option 'Always when DKIM is valid' for [#201](https://github.com/the-djmaze/snappymail/issues/201) - Image whitelist menu on message for @@ -1006,8 +1390,8 @@ ### Added - message maximum quoted text level for speed. [#902](https://github.com/the-djmaze/snappymail/issues/902) -- LoveDark Theme by @TheCuteFoxxy - [#913](https://github.com/the-djmaze/snappymail/pull/913) +- LoveDark Theme + [#913](https://github.com/the-djmaze/snappymail/pull/913) by @TheCuteFoxxy ### Changed - Moved pluginEnable() to \SnappyMail\Repository::enablePackage() @@ -1089,8 +1473,8 @@ [#188](https://github.com/the-djmaze/snappymail/issues/188) - /static/.htaccess as mentioned by @dbiczo in [#895](https://github.com/the-djmaze/snappymail/issues/895) -- Update nb-NO language by @master3395 - [#896](https://github.com/the-djmaze/snappymail/pull/896) +- Update nb-NO language + [#896](https://github.com/the-djmaze/snappymail/pull/896) by @master3395 - \RainLoop\Utils::SetCookie() to \SnappyMail\Cookies::set() - Merge \MailSo\Base\Utils::RecRmDir() and \MailSo\Base\Utils::RecTimeDirRemove() @@ -1115,8 +1499,8 @@ - Support RFC 8689 - Nextcloud move themes outside of app folder [#875](https://github.com/the-djmaze/snappymail/issues/875) -- Add check to unregister system addressbook by @akhil1508 - [#879](https://github.com/the-djmaze/snappymail/pull/879) +- Add check to unregister system addressbook + [#879](https://github.com/the-djmaze/snappymail/pull/879) by @akhil1508 ### Changed - material-design checkbox use hidden input for accessibility @@ -1140,8 +1524,8 @@ ## 2.25.0 – 2023-01-26 ### Changed -- Right margin to folder search input wrapper by @codiflow - [#871](https://github.com/the-djmaze/snappymail/pull/871) +- Right margin to folder search input wrapper + [#871](https://github.com/the-djmaze/snappymail/pull/871) by @codiflow - Almost all request params now use JavaScript camelCase instead of CamelCase - #rl-content to use flex for better layout control - Decode some Copernica link tracking @@ -1170,8 +1554,8 @@ ### Added - Preparations for RFC 8689 - Add admin setting for the contacts suggestions limit -- A button to clear folder search input field by @codiflow - [#847](https://github.com/the-djmaze/snappymail/pull/847) +- A button to clear folder search input field + [#847](https://github.com/the-djmaze/snappymail/pull/847) by @codiflow - Preparations for custom SMTP credentials handling for [#859](https://github.com/the-djmaze/snappymail/issues/859) [#458](https://github.com/the-djmaze/snappymail/issues/458) @@ -1187,8 +1571,8 @@ [#849](https://github.com/the-djmaze/snappymail/issues/849) - 64-bit PHP was required [#852](https://github.com/the-djmaze/snappymail/issues/852) -- Update fr-FR translations by @dominiquefournier - [#854](https://github.com/the-djmaze/snappymail/pull/854) +- Update fr-FR translations + [#854](https://github.com/the-djmaze/snappymail/pull/854) by @dominiquefournier - Move createDomain & createDomainAlias buttons below table - Move some Nextcloud SnappyMailHelper code to new InstallStep - Cleanup messages cache handling @@ -1214,8 +1598,8 @@ ### Added - Support for search criterias ON, SENTON, SENTSINCE and SENTBEFORE - New 'forward as attachment' glyph -- NC integration app metadata: add links to admin and dev docs by @p-bo - [#820](https://github.com/the-djmaze/snappymail/pull/820) +- NC integration app metadata: add links to admin and dev docs + [#820](https://github.com/the-djmaze/snappymail/pull/820) by @p-bo - Clicking on messagelist grouped date/from searches on that date/from [#815](https://github.com/the-djmaze/snappymail/issues/815) - Nextcloud Improved file picker layout @@ -1229,16 +1613,16 @@ - Resolve layout issues by changing from `fixed` to `relative` [#686](https://github.com/the-djmaze/snappymail/issues/686) - Cache handling of messagelist changed due to etag issues -- Improve german and italian translation by @cm-schl - [#846](https://github.com/the-djmaze/snappymail/pull/846) +- Improve german and italian translation + [#846](https://github.com/the-djmaze/snappymail/pull/846) by @cm-schl ### Fixed - Searching on Nextcloud search [#787](https://github.com/the-djmaze/snappymail/issues/787) - Workaround another Nextcloud disallowed .htaccess [#790](https://github.com/the-djmaze/snappymail/issues/790) -- Compact display of folders in nextcloud by @makoehr - [#824](https://github.com/the-djmaze/snappymail/pull/824) +- Compact display of folders in nextcloud + [#824](https://github.com/the-djmaze/snappymail/pull/824) by @makoehr - Admin -> Contacts PDO test failed when using different AddressBookInterface - KolabAddressBook errors - Forgot debug js/css setting change in Nextcloud @@ -1290,8 +1674,8 @@ ### Changed - Disable sorting when viewing message thread [#445](https://github.com/the-djmaze/snappymail/issues/445) -- Update Chinese translation by @mayswind - [#794](https://github.com/the-djmaze/snappymail/pull/794) +- Update Chinese translation + [#794](https://github.com/the-djmaze/snappymail/pull/794) by @mayswind - No need to call IMAP EXAMINE when current folder already SELECT - Thread view now has tree indentation @@ -1404,8 +1788,8 @@ ### Fixed - Loosing HTML signature in account identity under settings [#750](https://github.com/the-djmaze/snappymail/issues/750) -- Plugin configuration did not load anymore when type was SELECTION by @cm-schl - [#753](https://github.com/the-djmaze/snappymail/pull/753) +- Plugin configuration did not load anymore when type was SELECTION + [#753](https://github.com/the-djmaze/snappymail/pull/753) by @cm-schl - Nextcloud Default theme shows gray text on gray background [#754](https://github.com/the-djmaze/snappymail/issues/754) - Only run JSON hooks when $sAction is set @@ -1669,8 +2053,8 @@ [#638](https://github.com/the-djmaze/snappymail/issues/638) ### Fixed -- ldap-identities-plugin by @cm-schl - [#647](https://github.com/the-djmaze/snappymail/pull/647) +- ldap-identities-plugin + [#647](https://github.com/the-djmaze/snappymail/pull/647) by @cm-schl - OpenSSL v3 ciphers issue [#641](https://github.com/the-djmaze/snappymail/issues/641) @@ -1769,8 +2153,8 @@ [#620](https://github.com/the-djmaze/snappymail/issues/620) - PutinICS does is not working for all calendar events [#622](https://github.com/the-djmaze/snappymail/issues/622) -- Update readme by @cm-schl - [#617](https://github.com/the-djmaze/snappymail/pull/617) +- Update readme + [#617](https://github.com/the-djmaze/snappymail/pull/617) by @cm-schl ## 2.20.0 – 2022-11-03 @@ -1864,8 +2248,8 @@ [#638](https://github.com/the-djmaze/snappymail/issues/638) ### Fixed -- ldap-identities-plugin by @cm-schl - [#647](https://github.com/the-djmaze/snappymail/pull/647) +- ldap-identities-plugin + [#647](https://github.com/the-djmaze/snappymail/pull/647) by @cm-schl - OpenSSL v3 ciphers issue [#641](https://github.com/the-djmaze/snappymail/issues/641) @@ -1964,8 +2348,8 @@ [#620](https://github.com/the-djmaze/snappymail/issues/620) - PutinICS does is not working for all calendar events [#622](https://github.com/the-djmaze/snappymail/issues/622) -- Update readme by @cm-schl - [#617](https://github.com/the-djmaze/snappymail/pull/617) +- Update readme + [#617](https://github.com/the-djmaze/snappymail/pull/617) by @cm-schl ## 2.20.0 – 2022-11-03 diff --git a/README.md b/README.md index e1f64010e..b9736d393 100644 --- a/README.md +++ b/README.md @@ -49,7 +49,7 @@ This fork of RainLoop has the following changes: * Admin uses password_hash/password_verify * Auth failed attempts written to syslog * Added Fail2ban instructions -* ES2018 +* ES2020 * PHP 7.4+ required * PHP mbstring extension required * PHP replaced pclZip with PharData and ZipArchive @@ -66,7 +66,7 @@ This fork of RainLoop has the following changes: * CRLF => LF line endings * Embed boot.js and boot.css into index.html * Removal of old JavaScript code (things are native these days) -* Added modified [Squire](https://github.com/neilj/Squire) HTML editor as replacement for CKEditor +* Added modified [Squire](https://github.com/the-djmaze/Squire/tree/snappymail) HTML editor as replacement for CKEditor * Updated [Sabre/VObject](https://github.com/sabre-io/vobject) * Split Admin specific JavaScript code from User code * Split Sieve specific JavaScript code from User code @@ -140,28 +140,28 @@ RainLoop 1.17 vs SnappyMail |js/* |RainLoop |Snappy | |--------------- |--------: |--------: | -|admin.js |2.170.153 | 82.845 | -|app.js |4.207.787 | 430.201 | -|boot.js | 868.735 | 4.147 | -|libs.js | 658.812 | 201.911 | -|sieve.js | 0 | 84.703 | +|admin.js |2.170.153 | 84.925 | +|app.js |4.207.787 | 447.263 | +|boot.js | 868.735 | 4.343 | +|libs.js | 658.812 | 233.728 | +|sieve.js | 0 | 91.418 | |polyfills.js | 334.608 | 0 | |serviceworker.js | 0 | 285 | -|TOTAL |8.240.095 | 804.092 | +|TOTAL |8.240.095 | 861.962 | |js/min/* |RainLoop |Snappy |RL gzip |SM gzip |RL brotli |SM brotli | |--------------- |--------: |--------: |------: |------: |--------: |--------: | -|admin.min.js | 256.831 | 40.733 | 73.606 | 13.649 | 60.877 | 12.228 | -|app.min.js | 515.367 | 195.260 |139.456 | 66.275 |110.485 | 56.682 | -|boot.min.js | 84.659 | 2.087 | 26.998 | 1.204 | 23.643 | 1.002 | -|libs.min.js | 584.772 | 92.482 |180.901 | 34.729 |155.182 | 31.017 | -|sieve.min.js | 0 | 41.164 | 0 | 10.365 | 0 | 9.359 | +|admin.min.js | 256.831 | 41.719 | 73.606 | 14.022 | 60.877 | 12.567 | +|app.min.js | 515.367 | 202.101 |139.456 | 68.505 |110.485 | 58.481 | +|boot.min.js | 84.659 | 2.231 | 26.998 | 1.271 | 23.643 | 1.067 | +|libs.min.js | 584.772 | 110.646 |180.901 | 39.518 |155.182 | 35.207 | +|sieve.min.js | 0 | 45.504 | 0 | 11.131 | 0 | 9.917 | |polyfills.min.js | 32.837 | 0 | 11.406 | 0 | 10.175 | 0 | -|TOTAL user |1.217.635 | 289.829 |358.761 |102.208 |299.485 | 88.701 | -|TOTAL user+sieve |1.217.635 | 330.993 |358.761 |112.573 |299.485 | 98.060 | -|TOTAL admin | 959.099 | 135.302 |292.911 | 49.582 |249.877 | 44.247 | +|TOTAL user |1.217.635 | 314.978 |358.761 |109.294 |299.485 | 94.755 | +|TOTAL user+sieve |1.217.635 | 360.482 |358.761 |120.425 |299.485 |104.672 | +|TOTAL admin | 959.099 | 154.596 |292.911 | 54.811 |249.877 | 48.841 | -For a user it is around 69% smaller and faster than traditional RainLoop. +For a user it is around 66% smaller and faster than traditional RainLoop. ### CSS changes @@ -188,12 +188,12 @@ For a user it is around 69% smaller and faster than traditional RainLoop. |css/* |RainLoop |Snappy |RL gzip |SM gzip |SM brotli | |------------ |-------: |------: |------: |------: |--------: | -|app.css | 340.331 | 84.531 | 46.946 | 17.627 | 15.111 | -|app.min.css | 274.947 | 67.906 | 39.647 | 15.544 | 13.567 | +|app.css | 340.331 | 85.073 | 46.946 | 17.792 | 15.210 | +|app.min.css | 274.947 | 68.272 | 39.647 | 15.615 | 13.636 | |boot.css | | 1.326 | | 664 | 545 | |boot.min.css | | 1.071 | | 590 | 474 | -|admin.css | | 30.573 | | 7.011 | 6.101 | -|admin.min.css | | 24.689 | | 6.334 | 5.575 | +|admin.css | | 30.880 | | 7.045 | 6.127 | +|admin.min.css | | 24.959 | | 6.368 | 5.615 | ### PGP RainLoop uses the old OpenPGP.js v2 @@ -207,7 +207,7 @@ See https://github.com/the-djmaze/openpgpjs for development |OpenPGP |RainLoop |Snappy |RL gzip |SM gzip |RL brotli |SM brotli | |--------------- |--------: |--------: |------: |-------: |--------: |--------: | -|openpgp.min.js | 330.742 | 546.309 |102.388 | 169.249 | 84.241 | 138.751 | +|openpgp.min.js | 330.742 | 546.165 |102.388 | 169.207 | 84.241 | 138.688 | |openpgp.worker | 1.499 | | 824 | | 695 | | diff --git a/SECURITY.md b/SECURITY.md index 1b43a988f..11d1ddada 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -6,8 +6,8 @@ Currently due to the fast development only the latest version receives security | Version | Supported | | -------- | --------- | -| 2.30.x | ✔ | -| < 2.30.0 | ❌ | +| 2.34.x | ✔ | +| < 2.34.0 | ❌ | ## Reporting a Vulnerability @@ -36,5 +36,5 @@ YMXQVq4SJt7UpWABAORudfJxsBqCRKtPlZMgGTJLjcOkyFJ9C2Fx7DeN0J4I ## Publishing and Credits I will analyze and fix the reported issue as fast as possible. -Together with the reporter I plan the disclosure of the found and fixed vulnerability. +Together with the reporter, I plan the disclosure of the found and fixed vulnerability. Credits to the reporter are granted and can be included in all public communication if desired. diff --git a/cli/release.php b/cli/release.php index aac915b02..fe406f7f3 100755 --- a/cli/release.php +++ b/cli/release.php @@ -9,7 +9,7 @@ if (isset($options['plugins'])) { require(ROOT_DIR . '/build/plugins.php'); } -$gulp = trim(`which gulp`); +$gulp = trim(shell_exec('which gulp')); if (!$gulp) { exit('gulp not installed, run as root: npm install --global gulp-cli'); } @@ -34,7 +34,7 @@ $options['aur'] = isset($options['aur']); // Docker build $options['docker'] = isset($options['docker']); -if ($options['docker'] && !($docker = trim(`which docker`))) { +if ($options['docker'] && !($docker = trim(shell_exec('which docker')))) { exit('docker not found'); } if ($options['docker'] && $options['aur']) { @@ -60,7 +60,7 @@ if (!isset($options['skip-gulp'])) { $cmddir = escapeshellcmd(ROOT_DIR) . '/snappymail/v/0.0.0/static'; - if ($gzip = trim(`which gzip`)) { + if ($gzip = trim(shell_exec('which gzip'))) { echo "\x1b[33;1m === Gzip *.js and *.css === \x1b[0m\n"; passthru("{$gzip} -k --best {$cmddir}/js/*.js"); passthru("{$gzip} -k --best {$cmddir}/js/min/*.js"); @@ -70,7 +70,7 @@ if (!isset($options['skip-gulp'])) { unlink(ROOT_DIR . '/snappymail/v/0.0.0/static/js/min/boot.min.js.gz'); } - if ($brotli = trim(`which brotli`)) { + if ($brotli = trim(shell_exec('which brotli'))) { echo "\x1b[33;1m === Brotli *.js and *.css === \x1b[0m\n"; passthru("{$brotli} -k --best {$cmddir}/js/*.js"); passthru("{$brotli} -k --best {$cmddir}/js/min/*.js"); @@ -188,7 +188,7 @@ file_put_contents("{$destPath}core.json", '{ // Arch User Repository if ($options['aur']) { // extension_loaded('blake2') - if (!function_exists('b2sum') && $b2sum = trim(`which b2sum`)) { + if (!function_exists('b2sum') && $b2sum = trim(shell_exec('which b2sum'))) { function b2sum($file) { $file = escapeshellarg($file); exec("b2sum --binary {$file} 2>&1", $output, $exitcode); diff --git a/dev/App/User.js b/dev/App/User.js index 5e8d94e3b..5e28164ac 100644 --- a/dev/App/User.js +++ b/dev/App/User.js @@ -1,7 +1,7 @@ import 'External/User/ko'; import { SMAudio } from 'Common/Audio'; -import { pInt } from 'Common/Utils'; +import { arrayLength } from 'Common/Utils'; import { mailToHelper, setLayoutResizer, dropdownsDetectVisibility, loadAccountsAndIdentities } from 'Common/UtilsUser'; import { @@ -27,7 +27,7 @@ import { getFolderFromCacheList } from 'Common/Cache'; -import { i18n, reloadTime } from 'Common/Translator'; +import { i18n, reloadTime, getErrorMessage } from 'Common/Translator'; import { SettingsUserStore } from 'Stores/User/Settings'; import { NotificationUserStore } from 'Stores/User/Notification'; @@ -88,6 +88,8 @@ export class AppUser extends AbstractApp { this.messageList = MessagelistUserStore; this.ask = AskPopupView; + + this.loadAccountsAndIdentities = loadAccountsAndIdentities; } /** @@ -112,7 +114,7 @@ export class AppUser extends AbstractApp { case FolderType.Trash: oMoveFolder = getFolderFromCacheList(FolderUserStore.trashFolder()); nSetSystemFoldersNotification = iFolderType; - bDelete = bDelete || UNUSED_OPTION_VALUE === FolderUserStore.trashFolder() + bDelete = bDelete/* || UNUSED_OPTION_VALUE === FolderUserStore.trashFolder()*/ || sFromFolderFullName === FolderUserStore.spamFolder() || sFromFolderFullName === FolderUserStore.trashFolder(); break; @@ -147,8 +149,10 @@ export class AppUser extends AbstractApp { } logout() { - localStorage.removeItem('register_protocol_offered'); - Remote.request('Logout', () => rl.logoutReload(Settings.app('customLogoutLink'))); + Remote.request('Logout', (iError, data) => + iError ? alert('Logout error: ' + getErrorMessage(iError, data)) + : rl.logoutReload(Settings.app('customLogoutLink')) + ); } bootstart() { @@ -180,15 +184,15 @@ export class AppUser extends AbstractApp { SettingsUserStore.init(); ContactUserStore.init(); - loadFolders(value => { + loadFolders((success, error) => { try { - if (value) { + if (success) { startScreens([ MailBoxUserScreen, SettingsUserScreen ]); - setRefreshFoldersInterval(pInt(SettingsGet('CheckMailInterval'))); + setRefreshFoldersInterval(SettingsGet('CheckMailInterval')); loadAccountsAndIdentities(); @@ -222,19 +226,9 @@ export class AppUser extends AbstractApp { SMimeUserStore.loadCertificates(); setTimeout(() => mailToHelper(SettingsGet('mailToEmail')), 500); - - if (!localStorage.getItem('register_protocol_offered')) { - // When auto-login is active - navigator.registerProtocolHandler?.( - 'mailto', - location.protocol + '//' + location.host + location.pathname + '?mailto&to=%s', - (SettingsGet('title') || 'SnappyMail') - ); - localStorage.setItem('register_protocol_offered', '1'); - } - } else { this.logout(); + alert('Folders error: ' + getErrorMessage(0, error)) } } catch (e) { console.error(e); @@ -247,18 +241,31 @@ export class AppUser extends AbstractApp { showMessageComposer(params = []) { - showScreenPopup(ComposePopupView, params); + let msg = params[1]; + if (1 == arrayLength(msg)) { + msg = msg[0]; + } + if (msg) { + msg.decrypt().then((/*success*/)=>showScreenPopup(ComposePopupView, params)); + } else { + showScreenPopup(ComposePopupView, params); + } } } -AskPopupView.password = function(sAskDesc, btnText) { +AskPopupView.password = function(sAskDesc, btnText, ask) { return new Promise(resolve => { this.showModal([ sAskDesc, - view => resolve({password:view.passphrase(), remember:view.remember()}), + view => resolve({ + password:view.passphrase(), + username:/*ask & 2 ? */view.username(), + remember:/*ask & 4 ? */view.remember(), + rememberPermanent: view.rememberPermanent(), + }), () => resolve(null), true, - 5, + ask || 1, btnText ]); }); diff --git a/dev/Common/EnumsUser.js b/dev/Common/EnumsUser.js index bc3c873ba..a8948e5a7 100644 --- a/dev/Common/EnumsUser.js +++ b/dev/Common/EnumsUser.js @@ -71,7 +71,9 @@ MessageSetAction = { SetSeen: 0, UnsetSeen: 1, SetFlag: 2, - UnsetFlag: 3 + UnsetFlag: 3, + SetDeleted: 4, + UnsetDeleted: 5 }, /** diff --git a/dev/Common/File.js b/dev/Common/File.js index 841554056..38b1f917b 100644 --- a/dev/Common/File.js +++ b/dev/Common/File.js @@ -1,7 +1,7 @@ /* eslint key-spacing: 0 */ /* eslint quote-props: 0 */ -import { arrayLength } from 'Common/Utils'; +import { arrayLength, pInt } from 'Common/Utils'; export const RFC822 = 'message/rfc822'; @@ -274,8 +274,7 @@ export const FileInfo = { }, friendlySize: bytes => { - bytes = parseInt(bytes, 10); - bytes = isFinite(bytes) ? bytes : 0; + bytes = pInt(bytes); let i = bytes ? Math.floor(Math.log(bytes) / Math.log(1024)) : 0; return (bytes / Math.pow(1024, i)).toFixed(2>i ? 0 : 1) + ' ' + sizes[i]; } diff --git a/dev/Common/Folders.js b/dev/Common/Folders.js index cbba0390d..a6278201c 100644 --- a/dev/Common/Folders.js +++ b/dev/Common/Folders.js @@ -1,6 +1,8 @@ import { RFC822 } from 'Common/File'; import { getFolderInboxName, getFolderFromCacheList } from 'Common/Cache'; -import { isArray, arrayLength } from 'Common/Utils'; +import { baseCollator } from 'Common/Translator'; +import { SettingsGet } from 'Common/Globals'; +import { isArray, arrayLength, pInt } from 'Common/Utils'; import { SettingsUserStore } from 'Stores/User/Settings'; import { FolderUserStore } from 'Stores/User/Folder'; import { MessagelistUserStore } from 'Stores/User/Messagelist'; @@ -8,13 +10,13 @@ import { MessagelistUserStore } from 'Stores/User/Messagelist'; import Remote from 'Remote/User/Fetch'; let refreshInterval, - // Default every 5 minutes - refreshFoldersInterval = 300000; + // Default every 15 minutes + refreshFoldersInterval = 900000; export const setRefreshFoldersInterval = minutes => { - refreshFoldersInterval = Math.max(5, minutes) * 60000; + refreshFoldersInterval = Math.max(1, pInt(SettingsGet('minRefreshInterval')), pInt(minutes)) * 60000; clearInterval(refreshInterval); refreshInterval = setInterval(() => { const cF = FolderUserStore.currentFolderFullName(), @@ -27,7 +29,7 @@ setRefreshFoldersInterval = minutes => { sortFolders = folders => { try { - let collator = new Intl.Collator(undefined, {numeric: true, sensitivity: 'base'}); + let collator = baseCollator(true); folders.sort((a, b) => a.isInbox() ? -1 : (b.isInbox() ? 1 : collator.compare(a.fullName, b.fullName)) ); @@ -197,7 +199,7 @@ dropFilesInFolder = (sFolderFullName, files) => { data.append('folder', sFolderFullName); data.append('appendFile', file); Remote.request('FolderAppend', (iError, data)=>{ - iError && console.error(data.ErrorMessage); + iError && console.error(data.message); 0 == --count && FolderUserStore.currentFolderFullName() == sFolderFullName && MessagelistUserStore.reload(true, true); diff --git a/dev/Common/Html.js b/dev/Common/Html.js index 27e59a2e1..072045f9a 100644 --- a/dev/Common/Html.js +++ b/dev/Common/Html.js @@ -4,6 +4,9 @@ import { SettingsUserStore } from 'Stores/User/Settings'; const tmpl = createElement('template'), + + turndown = new TurndownService(), + htmlre = /[&<>"']/g, httpre = /^(https?:)?\/\//i, htmlmap = { @@ -14,14 +17,34 @@ const "'": ''' }, - disallowedTags = [ - 'svg','script','title','link','base','meta', - 'input','output','select','button','textarea', - 'bgsound','keygen','source','object','embed','applet','iframe','frame','frameset','video','audio','area','map' - // not supported by