Compare commits

...

795 Commits

Author SHA1 Message Date
johndoh 279ae66120
Move all message list entry generation to client side (#7287)
Always return cols required for widescreen message list and control layout only on JS side
4 years ago
johndoh 13a066b24f
Elastic: small improvement to splitter code (#7435) 4 years ago
William Rankin 40250563e3
Specify 13px font-size for .html-editor > textarea (#7447)
This is a followup to PR #7375 which set the plaintext message area from 14px to 13px for greater consistency with Classic and Larry skins. With that PR I neglected to consider the font size in the compose screen, which should probably match the 13px of the message area, but currently inherits 14px from the html element which causes an odd jump in font size when replying to a message.

Reference #7375
4 years ago
Aleksander Machniak b22f1c9a1b Add skip-empty option to get_edit_field() (#7444) 4 years ago
Aleksander Machniak ec2e713ecb Fix problem with forwarding inline images attached to messages with no HTML part (#7414) 4 years ago
Gianluca Giacometti 4ada2c3f13
Use more strict selector (#7452) 4 years ago
Aleksander Machniak 98881a0cbd Small code simplification 4 years ago
Aleksander Machniak 1c76c8440f Elastic: Remove unused color variables 4 years ago
Aleksander Machniak 731be15d46 Elastic: Fix context menu (paste) on the recipient input (#7431) 4 years ago
Aleksander Machniak 9ee1f4b636 Merge branch 'master' of github.com:roundcube/roundcubemail 4 years ago
Aleksander Machniak 51eb8a6a68 Update changelog
[skip ci]
4 years ago
Aleksander Machniak 9508acf249 Update changelog
[skip ci]
4 years ago
Aleksander Machniak 30610e867e Merge branch 'fix_encode' of https://github.com/shirosaki/roundcubemail into shirosaki-fix_encode
Refactor the new code
4 years ago
johndoh 9dbe666d4c
Allow skins to define which layout options they support (#7235) 4 years ago
Aleksander Machniak 86d34960c8 Optimize image size 4 years ago
Théo 61185b9362
Update roundcube_logo.png (#7357) 4 years ago
William Rankin 13b03c3953
Specify 13px font-size for .message-part div.pre (#7375)
Default monospace fonts are larger than proportional fonts and so make the plain text message look oddly large, upsetting the aesthetics of the page.
4 years ago
Kent Varmedal b4dabff26c
Add newline when writing logs to stdout (#7418)
Add newline on the end of the line when printing to stdout.
4 years ago
Aleksander Machniak 278cf3c18e Increase maximum size of contact jobtitle and department fields to 128 characters
[skip ci]
4 years ago
Aleksander Machniak e9c592a6e8 Fix bug where subfolders of special folders could have been duplicated on folder list 4 years ago
Aleksander Machniak bb06645b8f Update changelog
[skip ci]
4 years ago
Aleksander Machniak 9b8ed0dfeb Update changelog
[skip ci]
4 years ago
Aleksander Machniak 218cd2ab4a Elastic: Support space-separated email addresses in recipient input (#6529) 4 years ago
Aleksander Machniak 4e00237cc4 Allow opening application/octet-stream attachments according to filename extension (#6821) 4 years ago
Aleksander Machniak eaebae1e54 Fix bug where activation of forward/vacation rule could activate a wrong script (#7423)
Also should fix bug where forward/vacation rule could end up being duplicated (#7349)
4 years ago
Aleksander Machniak 77174ff9ff Fix test after change for #7413 4 years ago
Aleksander Machniak 25772702ac Fix so anchor tags without href attribute are not modified (#7413) 4 years ago
Aleksander Machniak af0e98759d Installer: Fix regression in SMTP test section (#7417) 4 years ago
Aleksander Machniak cd76046237 Update changelog
[skip ci]
4 years ago
Aleksander Machniak 46d3cae2ff Security: Fix cross-site scripting (XSS) via malicious XML attachment 4 years ago
Aleksander Machniak bda02002de Security: Better fix for CVE-2020-12641 4 years ago
Aleksander Machniak ecabb1e667 Security: Fix XSS issue in template object 'username' (#7406) 4 years ago
Aleksander Machniak 31249d932d Security: Fix couple of XSS issues in Installer (#7406) 4 years ago
Aleksander Machniak e05c69afab Fix bug where PDF attachments marked as inline could have not been attached on mail forward (#7382) 4 years ago
Aleksander Machniak 6436c22d2d Elastic: Fix aspect ratio of a contact photo in mail preview (#7339) 4 years ago
Aleksander Machniak da2bb8af6d Fix error when user-configured skin does not exist anymore (#7271)
We fallback to the system skin not the default one.
4 years ago
Aleksander Machniak f6586c7cf7 Fix PHP warning: count(): Parameter must be an array or an object... in ID command handler (#7392) 4 years ago
Aleksander Machniak 82ee69df15 Update changelog
[ci skip]
4 years ago
johndoh 34a0af8964
Allow array in smtp_host config (#7296) 4 years ago
Aleksander Machniak 30d31c323b Improve UX on custom header input (#7207) 4 years ago
Aleksander Machniak a47c558df4 Fix typo 4 years ago
Aleksander Machniak 14a8a99ee2 Update changelog
[ci skip]
4 years ago
Christopher Gurnee 40ecd47f90 Show Encrypt button w/Mailvelope, even if disabled
Before the Elastic skin would keep it hidden until enabled, closes #7353
4 years ago
Aleksander Machniak 06a1964ef6 Fix changelog
[ci skip]
4 years ago
Christopher Gurnee 24d0cf5d34 Let Mailvelope use sender's address to find pubkeys to check signatures 4 years ago
Christopher Gurnee c3d4598985 Add missing \'s to regexes in rcube_check_email() 4 years ago
Aleksander Machniak 7dcba95605 Update changelog
[ci skip]
4 years ago
vaaguirre 9bec8dd506
Fix issue with Modoboa driver for password plugin (#7372)
Was having trouble with updating a password with the Modoboa API (1.9.1). API responded with an error message but 200 HTTP status code, so roundcube displayed a success message even though the password wasn't being updated. Added a line to include a required field in the update request.
4 years ago
Aleksander Machniak 663f7a8c58 Fix default keyservers (use keys.openpgp.org), add note about CORS (#7373, #7367) 4 years ago
johndoh 3af6303ad7
Remove depreciated jquery.trim function (#7371) 4 years ago
Aleksander Machniak 35c29be9b2 Remove use of ext-iconv 4 years ago
Aleksander Machniak 87f42677c2 Don't resize alert and confirm dialogs 4 years ago
Aleksander Machniak 7ead0bb227 Fix empty attachment size handling (#7370) 4 years ago
Aleksander Machniak 014659b600 CS fixes, mostly around undefined variables 4 years ago
Aleksander Machniak f0f6234a1a Use merge instead of append (#7341) 4 years ago
Aleksander Machniak 87ca7a09dc Fix missing flag indication on collapsed thread in Larry and Elastic (#7366) 4 years ago
Aleksander Machniak 377239fa8e Display a warning and do not try to open empty attachments (#7332) 4 years ago
Aleksander Machniak a2ee9f7eab Merge branch 'master' of github.com:roundcube/roundcubemail 4 years ago
Aleksander Machniak 1aebb1985c Fix recipient rename/delete after drag'n'drop, also keep the order 4 years ago
Aleksander Machniak 09848515fe Merge branch 'master' of https://github.com/chilek/roundcubemail into chilek-master 4 years ago
Sander Nilsen 0efa899d6c
Grammar correction (#7346) 4 years ago
Aleksander Machniak 55343ffd7d Update changelog
[ci skip]
4 years ago
johndoh ec86e3cb7f
Markasjunk: Fix regression in jsevent driver #7361 (#7365) 4 years ago
Aleksander Machniak 8fac36e2c2 Fix so the database setup description is compatible with MySQL 8 (#7340)
[ci skip]
4 years ago
Aleksander Machniak 3d2bb47f8d Clarify des_key length requirement (#7350)
[ci skip]
4 years ago
Aleksander Machniak c39081b6a1 Fix bug in extracting required plugins from composer.json that led to spurious error in log (#7364) 4 years ago
Aleksander Machniak 12d4705935 Update changelog
[ci skip]
4 years ago
Tomasz Chiliński 0b09b24a55
enhancement: elastic skin: allow to drag & drop addresses between address input fields during compose message (code simplification) 4 years ago
Aleksander Machniak 8344f07d7f Fix CSRF bypass that could be used to log out an authenticated user (#7302) 4 years ago
Aleksander Machniak 219e353ac1 Fix local file inclusion (and code execution) via crafted 'plugins' option 4 years ago
Aleksander Machniak 4951d6603a Fix remote code execution via crafted 'im_convert_path' or 'im_identify_path' settings 4 years ago
Aleksander Machniak 87e4cd0cf2 Fix XSS issue in handling of CDATA in HTML messages 4 years ago
Tomasz Chiliński 8db9b8b6e2
enhancement: elastic skin: allow to drag & drop addresses between address input fields during compose message (code simplification) 4 years ago
Tomasz Chiliński 682cea5cc5
enhancement: elastic skin: allow to drag & drop addresses between address input fields during compose message (code simplification) 4 years ago
Tomasz Chiliński aae1189dbf
enhancement: elastic skin: allow to drag & drop addresses between address input fields during compose message (update source list address input field to) 4 years ago
Tomasz Chiliński 6f8663f7ef
enhancement: elastic skin: allow to drag & drop addresses between address input fields during compose message 4 years ago
Aleksander Machniak 6b5fc8db95 Fix so Print button for PDF attachments works on Firefox >= 75 (#5125) 4 years ago
Aleksander Machniak b35b5a1a26 Fix typo 4 years ago
Aleksander Machniak bf34e8cf9c Fix performance issue of parsing big HTML messages by disabling HTML5 parser for these (#7331) 4 years ago
Aleksander Machniak 36532345df Make install-jsdeps.sh script working without the 'file' program installed (#7325) 4 years ago
Aleksander Machniak 30b5803ee4 Fix bug where some message/rfc822 parts could not be attached on forward (#7323) 4 years ago
Aleksander Machniak cb9b22dcc1 Fix characters encoding in group rename input after group creation/rename (#7330) 4 years ago
Aleksander Machniak 3e9aefceef Mailvelope: Fix bug where recipients with name were not handled properly in mail compose (#7312) 4 years ago
Aleksander Machniak 15ee34a438 Revert "Fix bug where session was destoryed with window close (#7251)"
This reverts commit 32fac136db.
4 years ago
Aleksander Machniak 4a5efe09f9 Fix bug where a special folder couldn't be created if a special-use flag is not supported (#7147) 4 years ago
Aleksander Machniak 43456db922 Fix so imap error message is displayed to the user on folder create/update (#7245) 4 years ago
Aleksander Machniak 32fac136db Fix bug where session was destoryed with window close (#7251) 4 years ago
Aleksander Machniak 9ddb57f5bb Elastic: Restrict logo size in print view (#7275) 4 years ago
Aleksander Machniak 679cb1833c Merge branch 'zipdownload' of https://github.com/johndoh/roundcubemail into johndoh-zipdownload 4 years ago
Aleksander Machniak ae687d7a7a Update changelog 4 years ago
Aleksander Machniak cb8c07843b Fix marking as spam/ham on moving messages with Move menu (#7189) 4 years ago
PhilW ace991946f zipdownload: enable menu options when menu is opened 4 years ago
Aleksander Machniak e0b56aeb4d Fix PHP warning for real (#7206) 4 years ago
Aleksander Machniak 7d97c5b215 Merge branch 'markasjunk-select' of https://github.com/johndoh/roundcubemail into johndoh-markasjunk-select 4 years ago
johndoh 77e2ee9c9e
Add some public methods to elastic ui.js (#7240) 4 years ago
Aleksander Machniak c2b12d2b2b Elastic: Fix color of a folder with recent messages (#7281) 4 years ago
Aleksander Machniak e84dc4c385 Fix literals handling again 4 years ago
Aleksander Machniak b771cccbaa Update changelog
[skip ci]
4 years ago
dessert1 e66ffae856
Fix handling keyservers configured with protocol prefix (#7295)
`|^[a-z]://|` matches only single-character protocol shortnames, to correctly exclude e.g. `hkps://` the expression should be `|^[a-z]+://|` instead.
4 years ago
Aleksander Machniak 3d4a02a3a6 Fix bug where multiple images in a message were replaced by the first one on forward/reply/edit (#7293) 4 years ago
Aleksander Machniak 2965e60c1f Support many string literals in a "line response", deduplicate code 4 years ago
Aleksander Machniak f9c84e2646 Fix string literals handling in IMAP STATUS (and various other) responses (#7290) 4 years ago
Aleksander Machniak 7df358d64e Fix internal cache use in rcube_imap::get_message()
Two folders, personal and shared, can contain the same UIDs, so
we should check UID and folder name when dealing with internally
cached message.
4 years ago
Aleksander Machniak f0ec65ee70 Fix labels again 4 years ago
Christoph Langguth 81839093bb
Bugfix in password/pwned driver result parsing (#7288) 4 years ago
Aleksander Machniak 005da225f6 Merge branch 'master' of github.com:roundcube/roundcubemail 4 years ago
Aleksander Machniak c26ba1ee5d Improve some labels 4 years ago
johndoh 81dcf4a7de
Allow possibility to define the container of a table with a fixed header (#7239) 4 years ago
Aleksander Machniak 84505edac5 Update changelog
[ci skip]
4 years ago
johndoh 11aa9633b1
Improvements to options menu link template object (#7237) 4 years ago
Aleksander Machniak 623a642457 Update changelog, fix some localization labels 4 years ago
Aleksander Machniak 68350bd385 Merge branch 'master' of https://github.com/mildred/roundcubemail into mildred-master 4 years ago
Aleksander Machniak 3c8b270d8d Small code improvements, update changelog 4 years ago
Aleksander Machniak be7770b5a9 Merge branch 'password_pwned' of https://github.com/clangguth/roundcubemail into clangguth-password_pwned 4 years ago
Christoph Langguth a70baca3ae Refactoring of pwned passwords plugin, taking into account alecpl's comment. 4 years ago
johndoh 97732d5de7
Add selection element to theads as well as tbodies (#7238) 4 years ago
Aleksander Machniak dc1ce546b9 Fix sql syntax error introduced in last commit 4 years ago
Aleksander Machniak 2c1a22d283 Bring back BINARY for some columns after switch to utf8mb4 charset (#7277) 4 years ago
Aleksander Machniak 0fbd184294 Fix cursor position after inserting a group to a recipient input using autocompletion (#7267)
... for larry and classic skins.
4 years ago
Aleksander Machniak b3b5b9665d Fix regression in testing database schema on MSSQL (#7227) 4 years ago
Aleksander Machniak a748214595 Fix so button label in Select image/media dialogs is "Close" not "Cancel" (#7246) 4 years ago
Aleksander Machniak e5247e855e Fix missing contact display name in QR Code data (#7257) 4 years ago
Aleksander Machniak d194b238c7 Support RFC8438: IMAP STATUS=SIZE - for faster folder size calculation (#7269) 4 years ago
Christoph Langguth 370789c8c9 password plugin: add pwned passwords strength driver 4 years ago
Mildred Ki'Lya 88577119d7 Add new archival types to keep the folder structure
Add archival type folderyear and foldermonth to keep the original folder
structure after a YYYY or a YYYY/MM prefix.
4 years ago
Aleksander Machniak 088714619e Fix scroll-jump in MS Edge when using autoresizeable textarea (#7230) 4 years ago
Aleksander Machniak f452d33d44 Update changelog for #7261 4 years ago
Aleksander Machniak b2391417b3 Tests: Add browser test for #7231 4 years ago
Aleksander Machniak 68c8ee0a2b Elastic: Fix recipient input bug when using click to select a contact from autocomplete list (#7231) 4 years ago
Aleksander Machniak b7410ffe89 Use mySQL charset in connection string instead of SET NAMES (#7232)
And switch to utf8mb4 as it is what we're using right now in db schema.
4 years ago
Aleksander Machniak 80a244756d Tests: Add couple of HTML editor tests (including bug #7230) 4 years ago
Aleksander Machniak 38d6659384 Elastic: Fix text selection with Shift+PageUp and Shift+PageDown in plain text editor when using Chrome (#7230) 4 years ago
Aleksander Machniak e58c6547ca Add release mark
[skip ci]
4 years ago
Aleksander Machniak 770d818dd9 Fix undefined variable 4 years ago
Aleksander Machniak 4b219792a7 Tests: Add browser tests for attachment_reminder plugin 4 years ago
Aleksander Machniak f94b871aa6 Tests: Add browser tests for Markasjunk plugin 4 years ago
Aleksander Machniak db5ab6d3f6 Fix identity selection on reply when both sender and recipient addresses are included in identities (#7211) 4 years ago
PhilW 65a6a511a6 markasjunk: handle select all case (#7206) 4 years ago
Aleksander Machniak f2328bbe6b Add note about innodb_large_prefix=true requirement (#7212)
[skip ci]
4 years ago
Aleksander Machniak b80171f37b Fix bug where original attachments with Content-Id were attached to the message on reply (#7122)
All Content-Disposition:inline parts that aren't used in the body are ignored on reply/forward/edit.
4 years ago
Aleksander Machniak 4e2e876101 Update changelog 4 years ago
Paul J. Dorn 305c9355ee
Fix using unix:///path/to/socket.file in memcached driver (#7210)
off by one when stripping the memcache (sans d) compatible AF_UNIX prefix
4 years ago
Aleksander Machniak 32b37fba33 Update localization 4 years ago
Aleksander Machniak ea2d0ad458 Enigma: Fix bug where "Send unencrypted" button didn't work in Elastic skin (#7205) 4 years ago
Aleksander Machniak b606d81cdf MySQL: Use utf8mb4 charset and utf8mb4_unicode_ci collation (#6535, #7113)
Fixes support for utf8 emoji in html signature.
4 years ago
MrSorcus 706912e534
Fix typo (#7203) 4 years ago
Aleksander Machniak 50d6ea30e0 Support for language codes up to 16 chars long (e.g. es-419) in database schema (#6851) 4 years ago
Aleksander Machniak 60c8dd2e23 Fix regression where using an absolute path to SQLite database file on Windows didn't work (#7196) 4 years ago
Aleksander Machniak 0b02e87afe Fix some strict mode warnings 4 years ago
Aleksander Machniak fe796d4040 Remove useless pass-by-reference 4 years ago
Aleksander Machniak 3478b002f8 Enigma: Fix incorrect encrypted mail structure (boundary) with Mail_Mime >= 1.10.5 4 years ago
Aleksander Machniak 4114dc932d Fix bug where it wasn't possible to save flag actions (#7188)
Display proper error when no flag is selected.
4 years ago
Aleksander Machniak a075616fb2 Tests: Add browser tests for Zipdownload plugin 4 years ago
Aleksander Machniak d594ce2483 Tests: Add browser tests for Server Settings section 4 years ago
Aleksander Machniak d340f18295 Fix display issues with mail subject that contains line-breaks (#7191) 4 years ago
Aleksander Machniak 8080eb2c71 Tests: Fix database locking bug 4 years ago
Aleksander Machniak 84aa5d93f1 Tests: Added browser tests for Archive plugin 4 years ago
Aleksander Machniak c6392f2168 Markasjunk: Fix bug where marking as spam/ham didn't work on moving messages with drag-and-drop (#7137) 4 years ago
Aleksander Machniak 6c1e8e1efe Tests: Add Identities tests 4 years ago
Aleksander Machniak cbcebad9c1 Tests: Add Responses edit test 4 years ago
Eli Schiff b6db3e4ad7 Fixed incorrect typeof comparison (#7186) 4 years ago
Aleksander Machniak bdf0a6539e Relaxed domain name validation for extended TLDs support (#5588) 4 years ago
Aleksander Machniak 8793baa006 Update changelog
[skip ci]
4 years ago
Aleksander Machniak 97e6065897
Extract RFC2231 attachment name from message headers (#6729) (#6783)
* Extract RFC2231 attachment name from message headers (#6729)
* Workaround for attachments with invalid content type (e.g. PDF) (#6816)
4 years ago
Aleksander Machniak 1613f3ab4c
INSERT OR REPLACE implementation (#6771)
For now with support in postgres and mysql databases.
For now used in rcube_cache, rcube_imap_cache and enigma plugin
4 years ago
Aleksander Machniak e4281ae6d4 Tests: Try to fix timing issue 4 years ago
Aleksander Machniak d1b61410fc Tests: Add Dialog component 4 years ago
Aleksander Machniak d979aa0584 Tests: Add more browser tests for Responses 4 years ago
Aleksander Machniak 1376b5a647 Fix bug where message parts with no Content-Disposition header and no name were not listed on attachments list (#7117) 4 years ago
Aleksander Machniak b536e18d97 Tests: Add contacts print test 4 years ago
Aleksander Machniak 2f20f43cbb Tests: Change structure of tests 4 years ago
Aleksander Machniak 93519df826 Elastic: Fix disappearing sidebar in mail compose after clicking Mail button
Elastic: Fix incorrect aria-disabled attribute on Mail taskmenu button in mail compose
4 years ago
Aleksander Machniak 689c761026 Enigma: Simplify and fix handling of IDN with not all parts being punny-coded 4 years ago
Aleksander Machniak e89376709c Enigma: Display IDN domains of key users and identities in UTF8 4 years ago
Aleksander Machniak 6e63db6487 Merge branch 'enigma_idn_fix' of https://github.com/MaxBosse/roundcubemail into MaxBosse-enigma_idn_fix 4 years ago
Aleksander Machniak c2c85b0a76 Tests: Fix Print test on mobile, make GreenMail quiet on folder deletion 4 years ago
Aleksander Machniak 2037f2612b Tests: Fix testing with create_default_folders=true 4 years ago
Aleksander Machniak b6e75ebea7 Travis: Use bigger GreenMail startup timeout 4 years ago
Aleksander Machniak c138567ab5 Support 'greenmail' as an imap vendor label, don't call ID when not supported 4 years ago
Aleksander Machniak 4258acf57f Tests: Return proper exit code on error from bootstrap 4 years ago
Max Bosse 3faa976fc8 Fix creation of pgp-keys for IDN emails 4 years ago
Aleksander Machniak 5005c6c3e3 Travis: Fix/Update greenmail download location 4 years ago
Aleksander Machniak 5a6606a245 Tests: Add folder creation test 4 years ago
Aleksander Machniak 4f47ac0405 Fix bug where files in skins/ directory were listed on skins list (#7180) 4 years ago
Aleksander Machniak 700031b3b7 Elastic: Fix non-working folder subscription checkbox for newly added folders (#7174) 4 years ago
Aleksander Machniak 62fb938260 Tests: Add browser test for mail print and bug #7169 4 years ago
Aleksander Machniak 38116c1ae5 Merge branch 'master' of https://github.com/ssodk/roundcubemail into ssodk-master 4 years ago
Aleksander Machniak 5c73848499 Tests: Add Browser::assertElementsCount() helper 4 years ago
Aleksander Machniak c2e348067e Add browser tests for "more recipients" dialog 4 years ago
Aleksander Machniak 47089e9265 Elastic: Fix missing Close button in "more recipients" dialog 4 years ago
Aleksander Machniak f93857fbab Elastic: Fix text selection in recipient inputs (#7129) 4 years ago
ssodk 10ec313034
Update func.inc
Remove duplicates in print-view when the recipient list is expanded
4 years ago
Aleksander Machniak 9311c49cf4 Fix unexpected error message when mail refresh involves folder auto-unsubscribe (#6923) 4 years ago
Aleksander Machniak 470e91e615 Tests: Add forgotten data file 4 years ago
Aleksander Machniak c4f114fa84 Add browser tests for mail preview 4 years ago
Aleksander Machniak 7d2b4f8d15 Enigma: Add missing localization labels used in Larry skin 4 years ago
Aleksander Machniak d8ebf290b2 Add note about Windows and symlinks (#7151) 4 years ago
Aleksander Machniak b26340c271 Fix typo 4 years ago
Aleksander Machniak 646e0b99ea Enigma: Fix so using list checkbox selection does not load the key preview frame 4 years ago
Aleksander Machniak e3556986a1 Fix PHP Warning: array_filter() expects parameter 1 to be array, null given in subscription_options plugin (#7165)
.. when IMAP connection fails
4 years ago
Aleksander Machniak 355ff138fd Enigma: Fix so key list selection is reset when opening key creation form (#7154) 4 years ago
Aleksander Machniak 5d025609d3 Tests: Add browser tests for contact groups 4 years ago
Aleksander Machniak a646b13715 Try to fix flaky test 4 years ago
Aleksander Machniak 31b0275573 Add basic browser tests for message menu and open in new window feature 4 years ago
Aleksander Machniak a9abe62d58 Fix regression where "Open in new window" action didn't work (#7155) 4 years ago
Aleksander Machniak fded360d84 Fix so messages in threads with no root aren't displayed separately (#4999) 4 years ago
Aleksander Machniak 3cab0ad493 Update changelog
[skip ci]
4 years ago
Aleksander Machniak 0eb4674216
Managesieve: Allow display name with email address in vacation :from field (#6760) (#6763) 4 years ago
Aleksander Machniak 1b376517e8 Update changelog
[skip ci]
4 years ago
johndoh 51a9dd631f Add support for SameSite cookie attribute (req PHP >= 7.3.0) (#6772) 4 years ago
Aleksander Machniak 5236f40823 Update changelog
[skip ci]
4 years ago
Aleksander Machniak e8e8c31eb3
Improve namespace roots presentation (#5012) (#6789)
- Display a special icon for other users and shared namespace roots (Elastic)
- Change folders sorting so shared/other users namespaces are listed last

Fixes #5012.
4 years ago
Aleksander Machniak 245e1aa9f9 Update changelog
[skip ci]
4 years ago
johndoh d51352b9cb Add support for nested if conditions (#6829)
* add support for nested if conditions
* add tests for condition parsing in templates
* make [space][slash] ending of condition objects optional (#6954)
4 years ago
Aleksander Machniak 530b53d92f Update changelog 4 years ago
jelle van der Waa 11e5c1af4f Password: Make chpass-wrapper.py Python 3 compatible (#7135)
Remove the ", e" as the exception is never printed and this makes it
Python 3 compatible as well

Closes: #7118
4 years ago
Théo 5a1a33752e Updte copyright year in About (#7138) 4 years ago
Aleksander Machniak 094da1e653 Elastic: Fix bug where it was possible to switch editor mode when 'htmleditor' was in 'dont_override' (#7143) 4 years ago
Aleksander Machniak e2bd4548ed Tests: Move logon helpers to the App component 4 years ago
Aleksander Machniak 2c0dd762ed Update changelog
[skip ci]
4 years ago
Aleksander Machniak cf8277ea3e Tests: Try to fix test that fails on Travis, but not on my setup 4 years ago
Aleksander Machniak f72054e761 Tests: Create Browser and Components for better code structure 4 years ago
Aleksander Machniak 1edd7a4b3f Tests: Add functional tests for contacts export 4 years ago
Aleksander Machniak 57162ef481 Make install.php accept long Chrome version string
[skip ci]
4 years ago
Aleksander Machniak 421dbf5271 Tests: Mantion TESTS_MODE in README
[skip ci]
4 years ago
Aleksander Machniak 564287d6c8 Tests: Try to fix failing toolbar menu tests in phone mode 4 years ago
Aleksander Machniak accb5f63e2 Travis: Fix run.sh 4 years ago
Aleksander Machniak 9a0e71ddee Travis: Enable in-browser tests in phone and tablet mode 4 years ago
Aleksander Machniak 934382c91f Make testing in all phone/tablet/desktop modes of Elastic possible 4 years ago
Aleksander Machniak a32e2b4c6f Addressbook -> Contacts 4 years ago
Aleksander Machniak 59e1efb595 Add more in-browser tests 4 years ago
Aleksander Machniak 7abd4f2c15 Travis: Cleanup 4 years ago
Aleksander Machniak 5defccb919 Travis: Run browser tests on bionic with node-less 4 years ago
Aleksander Machniak 7911c75b1e Travis: Corrected paths 4 years ago
Aleksander Machniak ef0d23241a Travis: Run in-browser tests not in devel_mode 4 years ago
Aleksander Machniak f32b9ae51d Travis: Move install commands to .ci/install.sh 4 years ago
Aleksander Machniak 581bc6886b Travis: Install js deps for in-browser tests 4 years ago
Aleksander Machniak 724f5c740c Travis: Install proper version of WebDriver 4 years ago
Aleksander Machniak 31b33c0f39 Don't require config.inc.php when only config-<env>.inc.php exists 4 years ago
Aleksander Machniak 15885055ca Travis: Try to debug why in-browser tests do not work 4 years ago
Aleksander Machniak 9d1e4b4828 Travis: Fix syntax error 4 years ago
Aleksander Machniak 87304c29d1 Travis: Fix in-browser tests setup 4 years ago
Aleksander Machniak 53a111f8c3 Travis: Debugging setup.sh script 4 years ago
Aleksander Machniak 1f656e5a07 Travis: In-browser tests with GreenMail server 4 years ago
Aleksander Machniak 895b6f54f3 Add more in-browser tests 4 years ago
Aleksander Machniak a88798ab18 We don't need index-test.php anymore 4 years ago
Aleksander Machniak 7ebc159780 Travis: Remove in-browser tests
Yeah, we'd need to setup a test account on some IMAP server which
would be publicly available. I'm not sure we can do that.
Also, we'd need to add config-tests.inc.php file and maybe use sqlite database.
4 years ago
Aleksander Machniak 0ea8e9c289 Travis: Try in-browser tests on PHP 7.3
as PHP 7.4 does not yet have php-zip extension
4 years ago
Aleksander Machniak dd7b51bcd3 Travis: Fix syntax error 4 years ago
Aleksander Machniak d67b288cbc Travis: Fix syntax error 4 years ago
Aleksander Machniak eac409ac4a Travis: Enable in-browser tests 4 years ago
Aleksander Machniak 0b9ff6426e Rewrite Selenium tests with use of laravel/dusk 4 years ago
Aleksander Machniak 47d9ed6d0c Add support for PHPUnit 6 and 7 (#6870)
Fixes composer dependencies: Package phpunit/phpunit-mock-objects is abandoned

We cannot support v8 yet because of errors like:
Declaration of MailFunc::setUp() must be compatible with PHPUnit\Framework\TestCase::setUp(): void
It would require dropping PHP < 7.1 support.
4 years ago
Aleksander Machniak ad84b2df3f Update localization 5 years ago
Aleksander Machniak f610707554 Skip install-jsdeps.sh execution when using "complete" package to update "custom" installation (#7087) 5 years ago
Aleksander Machniak df2acc5eb8 Elastic: Fix hidden list widget on mobile/tablet when selecting folder while search menu is open (#7120) 5 years ago
Aleksander Machniak 9bb95471bf Merge branch 'master' of github.com:roundcube/roundcubemail 5 years ago
Aleksander Machniak 226097fc3f Markasjunk: Fix marking more than one message as spam/ham with email_learn driver (#7121) 5 years ago
Aleksander Machniak 52caed0d66 Remove optional argument leftover 5 years ago
Aleksander Machniak 37cfa0a43b Fix malformed characters in HTML message with charset meta tag not in head (#7116) 5 years ago
Aleksander Machniak 5f30dc68a3 Fix so number of contacts in a group is not limited to 200 when redirecting to mail composer from Contacts (#6972)
Use max_group_members with fallback to 999 if unset.
5 years ago
Aleksander Machniak eadbe91c92 Elastic: Simple search in pretty selects (#7072) 5 years ago
Aleksander Machniak 29defb82e9 Fix bug where next message wasn't displayed after delete in List mode (#7096) 5 years ago
Aleksander Machniak cf90c69ad7 Fix bug where 'text' attribute on body tag was ignored when displaying HTML message (#7109) 5 years ago
Aleksander Machniak 545ea62dfc Fix bug where listing tables in PostgreSQL database with db_prefix didn't work (#7093) 5 years ago
Aleksander Machniak 34e2507aac Fix so contact's organization field accepts up to 128 characters (it was 50)
Also assistant, manager, spouse, website and im
5 years ago
Aleksander Machniak 93c0e02f07 Plugin API: Make actionbefore, before<action>, actionafter and after<action> events working with plugin actions (#7106) 5 years ago
Aleksander Machniak d8d29241a6 Remove redundant spellcheck_langs env variable 5 years ago
Aleksander Machniak 0aa5eca1fd Fix bug where 'skins_allowed' option didn't enforce user skin preference (#7080) 5 years ago
Aleksander Machniak db4bf5573e Travis: Ignore endroid/qr-code in a try to make PHP 7.4 tests working
Travis' PHP 7.4 build does not have php-gd available yet.
5 years ago
Aleksander Machniak a5b15da155 Fix so displayed maximum attachment size depends also on 'max_message_size' (#7105) 5 years ago
Aleksander Machniak 0b45c3c6b0 Fix matching multiple X-Forwarded-For addresses with 'proxy_whitelist' (#7107) 5 years ago
Aleksander Machniak df7b76b023 Travis: Add PHP 7.4 5 years ago
Aleksander Machniak a51beef56c Travis: Remove ppc64le 5 years ago
Aleksander Machniak f3381f12d3 Travis: Move ppc64le arch to the matrix, test it only with the most recent PHP version 5 years ago
Aleksander Machniak 3fda927858 Try tests on different cpu architectures 5 years ago
Sebastiaan Lokhorst 259b7fa065 Explain difference between ssl:// and tls:// for default_host (#7099) 5 years ago
Hiroshi Shirosaki a335102e47 Fix email address name encoding with ISO-2022-JP
Convert to UTF-8 to split addresses correctly.
Base64 encode ISO-2022-JP name.
Add a unit test.
5 years ago
Hiroshi Shirosaki d9667295d8 Fix wordwrap with ISO-2022-JP
A message with ISO-2022-JP-MS characters currupts by wordwrap.
Use ISO-2022-JP-MS charset in wordwrap.
Add a unit test.
5 years ago
Hiroshi Shirosaki 869d1d1eaf Fix ISO-2022-JP-MS encoding convert
ISO-2022-JP-MS characters are removed by iconv on sending mail.
Use mbstring functions on sending.
Add a unit test.
5 years ago
Aleksander Machniak 8471930652 Add 'filter' to required extensions 5 years ago
Aleksander Machniak 5b253fb498 Elastic: Fix contrast of warning toasts (#7058)
Add some color variables and slightly make bg-color stronger on "box" messages.
5 years ago
Aleksander Machniak 90781bff3b Add aria-label to list navigation toolbars 5 years ago
Aleksander Machniak 58aea024b4 Improve style tag handling in TinyMCE (#7088) 5 years ago
Aleksander Machniak 94c795b539 Fix bug where HTML reply could add an empty line with extra indentation above the original message (#7088) 5 years ago
Aleksander Machniak e7cb9bf604 Password: Fix kpasswd and smb drivers' double-escaping bug (#7092) 5 years ago
Aleksander Machniak e3c6989494 Log X-Real-IP only when it's different than REMOTE_ADDR 5 years ago
Aleksander Machniak 3b3dd0cf7a Add note about URI format of hostnames in ldap config (#7082) 5 years ago
Aleksander Machniak 35101ca44a Fix filter selection after removing a first filter (#7079) 5 years ago
Aleksander Machniak 57476c09f9 Fix bug where cancelling switching from HTML to plain text didn't set the flag properly (#7077) 5 years ago
Aleksander Machniak 604e814898 Fix/remove useless keyup event handler on username input in logon form (#6970) 5 years ago
Aleksander Machniak 9219f4cd65 Fix so use of Ctrl+A does not scroll the list (#7020) 5 years ago
Christian Weiske 1c1a73e4d5 Set the content-type of JSON responses to application/json, not text/plain (#6573) 5 years ago
Sebastiaan Lokhorst 511e99ee1a Update SMTP TLS/STARTTLS explanation in config.php (#7066)
Implicit TLS (port 465) is no longer deprecated since RFC 8314.
5 years ago
Aleksander Machniak 2321bce469 Add notes about file ownership (#7009) 5 years ago
Aleksander Machniak 04aff2efa3 Fix so install-jsdeps.sh removes Bootstrap's sourceMappingURL (#7035) 5 years ago
Aleksander Machniak 2f928a516d Fix DB Write test on SQLite database ("database is locked" error) (#7064)
Also fix so SQLite DSN with a relative path to the database file works in Installer
5 years ago
Aleksander Machniak fa34e5ebcd Fix bug where a new saved search added after removing all searches wasn't added to the list (#7061) 5 years ago
Aleksander Machniak 006f7d1087 Fix so modifier type select wasn't hidden after hiding modifier select on header change 5 years ago
Aleksander Machniak ffeebff3f9 Fix bug where Ctype extension wasn't required in Installer and INSTALL file (#7049) 5 years ago
Aleksander Machniak 45546508d2 Replace "Filter disabled" with "Filter enabled" (#7028) 5 years ago
Aleksander Machniak 8d81df7dc3 Fix bug where a new contact group added after removing all groups from addressbook wasn't added to the list 5 years ago
Aleksander Machniak dbc2b5e11c Fix bug where deleting a saved search in addressbook caused display issue on sources/groups list (#7061)
also remove dead code.
5 years ago
Aleksander Machniak 4485940d0e Fix bug where Enter key didn't work on messages list in "List" layout (#7052)
with some code improvements and better checking if selected message is a draft.
5 years ago
Aleksander Machniak 4cf2363f43 Update changelog 5 years ago
johndoh b68c141e1d Always update folder count after purge command (#7051)
... not only when it is the current folder.
5 years ago
Aleksander Machniak e0574d909e Merge branch 'johndoh-html5' 5 years ago
Aleksander Machniak 8a25ddbf53 Update changelog, CS improvements 5 years ago
Aleksander Machniak feb4ecdf51 Elastic: Fix language icon (#6624) 5 years ago
Aleksander Machniak 022a1b683f Enigma: Add script to import keys from filesystem to the db storage (for multihost) 5 years ago
Aleksander Machniak d4a8642d5a Code simplification and style fixes 5 years ago
Aleksander Machniak d2738d1e8b Remove spaces from 'accept' attribute 5 years ago
Aleksander Machniak ba83042b1a Elastic: Remove redundant listmenulink elements 5 years ago
Aleksander Machniak ea3ad31ce0 Fix bug where the Installer would not warn about required schema upgrade (#7042) 5 years ago
Aleksander Machniak 47f72303ac Small correction 5 years ago
Aleksander Machniak 4b607e2ed3 Fix so Elastic is also a default in jqueryui plugin (#7039) 5 years ago
Aleksander Machniak fecff809fe Elastic: Fix data-fab-task handling (#7038)
Since the code is executed before rcmail init event, we have to use rcmail.env.task
instead of rcmail.task.
5 years ago
Aleksander Machniak 0113ea9602 Fix tables listing routine when DSN contained a database with unsupported suffix (#7034) 5 years ago
Aleksander Machniak 2e2028ae78 Elastic: Fix position of mobile floating action button (#7038) 5 years ago
Aleksander Machniak b6810cc163 Mention required min. version of lessc (#7031) 5 years ago
Aleksander Machniak f4722cb451 Fixed typo 5 years ago
Aleksander Machniak d0dd042b73 Fix so update.sh script warns about changed defaults (#7011) 5 years ago
Aleksander Machniak b63bc1ae22 Fix misleading comment 5 years ago
Aleksander Machniak 81bccd00ad Larry: Fix html editor toolbar background in Identities 5 years ago
Aleksander Machniak 22d629a0e9 Elastic: Fix regression in the new editor widget (#7021) 5 years ago
Aleksander Machniak 110eebdd1b Fix db_prefix handling in queries with `TRUNCATE TABLE <name>` and `UNIQUE <name>` (#7013) 5 years ago
Aleksander Machniak ee1f01a0df Fix so 401 error is returned only on failed logon requests (#7010) 5 years ago
Aleksander Machniak 157edd72bb Elastic: Fix Edit responses button state in Mailvelope mode 5 years ago
Aleksander Machniak b4b400c91d Fix invalid Signature button state after escaping Mailvelope mode (#7015) 5 years ago
Aleksander Machniak 1eb50c7cd3 Remove unused variables 5 years ago
Aleksander Machniak 71bcf2e245 Fix regexp for version input to accept rcX releases 5 years ago
Aleksander Machniak b63d549834 Elastic: Change HTML editor widget to improve form flow (#6992) 5 years ago
Aleksander Machniak 4b24ba1372 Fix bug where cache keys could exceed length limit specified in db schema (#7004) 5 years ago
Aleksander Machniak 4cf8952afa Fix PHP warning: "array_merge(): Expected parameter 2 to be an array, null given in sendmail.inc (#7003) 5 years ago
Aleksander Machniak 338b25dec9 Managesieve: Fix locked UI after opening filter frame (#7007) 5 years ago
Aleksander Machniak 03cee8f554 Add a release mark 5 years ago
Aleksander Machniak 8aaf7d35c1 Fix displaying version number for rcX versions 5 years ago
Aleksander Machniak 30af42be87 Remove a note about Larry being default 5 years ago
Aleksander Machniak 757d5fc1b1 Correct file permissions 5 years ago
Thomas Bruederli 9ebba7c2ce Set default skin to 'elastic' in sample config 5 years ago
Aleksander Machniak 6aab238773 Small code improvements 5 years ago
Aleksander Machniak c5c5a9325c Elastic: Fix regression where recipient input didn't update internal input state (#6988) 5 years ago
Aleksander Machniak 508e83470c Master is 1.5-git now 5 years ago
Aleksander Machniak f768ff1464 Update changelog and cleanup 5 years ago
PhilW 75125cbac1 add unit tests for rcmail_output_html::get_template_logo 5 years ago
PhilW 97001e9221 rewrite skin_logo config 5 years ago
Aleksander Machniak 727f8f04d8 Elastic: Fix regression where Encrypt button wasn't displayed in mail compose toolbar (#6982)
Also fix Reply-All button handling
5 years ago
Aleksander Machniak 52c755207d Enigma: Fix bug where signing option was set to disabled after saving a draft in Elastic skin (#6515) 5 years ago
Aleksander Machniak 3a097e6836 Fix bug where inline images could have been ignored if Content-Id header contained redundant spaces (#6980) 5 years ago
Aleksander Machniak df414aa30c Elastic: Fix unread filter icon and search state on folder change (#6978) 5 years ago
Aleksander Machniak 5543240e67 Elastic: Fix language icon (#6624) 5 years ago
Aleksander Machniak 5a0843de4b Enigma: Add script to import keys from filesystem to the db storage (for multihost) 5 years ago
Aleksander Machniak 5b6a50a4e4 Code simplification and style fixes 5 years ago
Aleksander Machniak 6f4c2cf231 Remove spaces from 'accept' attribute 5 years ago
Aleksander Machniak bdce0ba3f2 Elastic: Remove redundant listmenulink elements 5 years ago
Aleksander Machniak 3cd3d8eecb Fix bug where the Installer would not warn about required schema upgrade (#7042) 5 years ago
Aleksander Machniak bd21d43ac9 Small correction 5 years ago
Aleksander Machniak 90738d7a36 Fix so Elastic is also a default in jqueryui plugin (#7039) 5 years ago
Aleksander Machniak 40aef395bb Elastic: Fix data-fab-task handling (#7038)
Since the code is executed before rcmail init event, we have to use rcmail.env.task
instead of rcmail.task.
5 years ago
Aleksander Machniak 67898b23e4 Fix tables listing routine when DSN contained a database with unsupported suffix (#7034) 5 years ago
Aleksander Machniak 2e26aee2b6 Elastic: Fix position of mobile floating action button (#7038) 5 years ago
Aleksander Machniak f2c878c82b Mention required min. version of lessc (#7031) 5 years ago
Aleksander Machniak 814db5a33e Fixed typo 5 years ago
Aleksander Machniak 294683b390 Fix so update.sh script warns about changed defaults (#7011) 5 years ago
Aleksander Machniak a269e7c106 Fix misleading comment 5 years ago
Aleksander Machniak 4d54074ad2 Larry: Fix html editor toolbar background in Identities 5 years ago
Aleksander Machniak c2bd60f1aa Elastic: Fix regression in the new editor widget (#7021) 5 years ago
Aleksander Machniak a80d73602f Fix db_prefix handling in queries with `TRUNCATE TABLE <name>` and `UNIQUE <name>` (#7013) 5 years ago
Aleksander Machniak b8555ce4f3 Fix so 401 error is returned only on failed logon requests (#7010) 5 years ago
Aleksander Machniak 4e840c7669 Elastic: Fix Edit responses button state in Mailvelope mode 5 years ago
Aleksander Machniak 7f6dd16479 Fix invalid Signature button state after escaping Mailvelope mode (#7015) 5 years ago
Aleksander Machniak 98c71ee62e Remove unused variables 5 years ago
Aleksander Machniak c734f3e1ab Fix regexp for version input to accept rcX releases 5 years ago
Aleksander Machniak 3c01f472e0 Elastic: Change HTML editor widget to improve form flow (#6992) 5 years ago
Aleksander Machniak 4cc20eef72 Fix bug where cache keys could exceed length limit specified in db schema (#7004) 5 years ago
Aleksander Machniak 700cc5a055 Fix PHP warning: "array_merge(): Expected parameter 2 to be an array, null given in sendmail.inc (#7003) 5 years ago
Aleksander Machniak 58850f0b93 Managesieve: Fix locked UI after opening filter frame (#7007) 5 years ago
Aleksander Machniak 5677b2fc9d Add a release mark 5 years ago
Aleksander Machniak 8a726316bb Fix displaying version number for rcX versions 5 years ago
Aleksander Machniak 57aa69206a Remove a note about Larry being default 5 years ago
Aleksander Machniak 358f647273 Correct file permissions 5 years ago
Thomas Bruederli 8db933e440 Set default skin to 'elastic' in sample config 5 years ago
Aleksander Machniak 0e2d3789ce Small code improvements 5 years ago
Aleksander Machniak 959654c0c2 Elastic: Fix regression where recipient input didn't update internal input state (#6988) 5 years ago
Aleksander Machniak 9f1d185c44 Master is 1.5-git now 5 years ago
Aleksander Machniak 902d3cd0bb Merge branch 'johndoh-6981' 5 years ago
Aleksander Machniak 1656bbcfaa Update changelog and cleanup 5 years ago
Aleksander Machniak 95aac7c0b6 Elastic: Fix regression where Encrypt button wasn't displayed in mail compose toolbar (#6982)
Also fix Reply-All button handling
5 years ago
PhilW 714ea7b128 add unit tests for rcmail_output_html::get_template_logo 5 years ago
PhilW 0ae3823853 rewrite skin_logo config 5 years ago
Aleksander Machniak 12967485a3 Elastic: Fix regression where Encrypt button wasn't displayed in mail compose toolbar (#6982)
Also fix Reply-All button handling
5 years ago
Aleksander Machniak ad5a22b9c1 Enigma: Fix bug where signing option was set to disabled after saving a draft in Elastic skin (#6515) 5 years ago
Aleksander Machniak c1c534d67c Fix bug where inline images could have been ignored if Content-Id header contained redundant spaces (#6980) 5 years ago
Aleksander Machniak 30b5d4ef64 Elastic: Fix unread filter icon and search state on folder change (#6978) 5 years ago
PhilW 32775f0e43 remove redundant type attrib in script tag 5 years ago
Aleksander Machniak 8bcb1e801c Switch default skin to Elastic 5 years ago
Aleksander Machniak 92fbe4c3b8 Update localization 5 years ago
Aleksander Machniak 3527461d83 Elastic: Add cursor:pointer to a.toolbar-button 5 years ago
Aleksander Machniak da2ebb272a Add basic test for attachment_reminder plugin 5 years ago
Aleksander Machniak cc1a1d95fe Correct property name 5 years ago
Aleksander Machniak 1b8e01e324 Cleanup unused code 5 years ago
Aleksander Machniak ce70166d9e Elastic: Fix inserting responses at cursor position (#6971)
Don't check if the field has focus for text selection.
5 years ago
johndoh 57960b1cab add messages for in_array_nocase tests (#6957) 5 years ago
Aleksander Machniak 425724bb35 Fix testing rcube_sieve_vacation protected methods 5 years ago
Aleksander Machniak 2213efc850 Archive: Fix missing Archive icon in folder selector popup in Elastic 5 years ago
Aleksander Machniak 46ee823fd9 Archive: Fix bug where next email was not displayed after Archive button use (#6965) 5 years ago
Aleksander Machniak 199afedb96 Elastic: Improve splitter element identifier
so e.g. in Settings sidebar's width is constant for all Settings pages.
5 years ago
Aleksander Machniak 1d9ddf9d33 Fix PHP Fatal error: Uncaught Error: Using $this when not in object (#6959) 5 years ago
Aleksander Machniak a3c491d5cb Elastic: Fix initial focus on recipients input in mail compose screen
Also remove some redundant duplicated code
5 years ago
Aleksander Machniak 66fab8cdb2 CS fixes, Avoid usused variables, fixed minor bugs 5 years ago
Aleksander Machniak 20e25582e7 Fix so an error is loogged when encryption fails (#6948) 5 years ago
Aleksander Machniak ed085db9e0 Elastic: Fix position and style of auto-complete dropdown on small screens (#6951) 5 years ago
Aleksander Machniak e7ebff56df PHPDoc fixes 5 years ago
Aleksander Machniak 3841f63fbd Make cache keys case-sensitive on MySQL/MSSQL (#6942) 5 years ago
Aleksander Machniak 213a7cadc2 Enigma: Fix encryption menu width in larry and classic 5 years ago
Aleksander Machniak 54799b9b19 Elastic: Set height for pretty checkbox inside of .listing on touch screen 5 years ago
Aleksander Machniak d10c44c441 Elastic: Fix regression after column resizer was added 5 years ago
Aleksander Machniak 17296b39cb Fix infinite loading message on iframe loading errors
The loading message was not stopped on "hard" errors, i.e. when
the page was blank, e.g. on 500 error.
5 years ago
Aleksander Machniak c6de97c5a8 Redis: Improve error handling and phpredis 5.X support (#6888) 5 years ago
Aleksander Machniak 4d7ce46fc0 Elastic: Resizeable columns (#6929) 5 years ago
Thomas Bruederli 2d9b318c82 Add release 1.4-rc2 5 years ago
Aleksander Machniak b0aa130edf Fix wrong password requirement description with zxcvbn driver (#6922) 5 years ago
Aleksander Machniak 70d342a436 Fix language selection for spellchecker in html mode (#6915)
Also fix so the language is not reset when switching from html to plain
text and vice-versa.
5 years ago
Aleksander Machniak c60a30c780 Use "NOTICE:" instead of "NOTE:" for consistency 5 years ago
Aleksander Machniak 5040009f9c Fix array offset access syntax with curly braces 5 years ago
Aleksander Machniak de4a6068e6 Mention Masterminds/HTML5 in INSTALL/README 5 years ago
johndoh 4d66547034 Elastic: Fix border radius in popovers on small screens (#6911) 5 years ago
Aleksander Machniak b10a0dbb7e Reset internal $skins property is set_skin() 5 years ago
Aleksander Machniak 5373f1839d Fix googiespell popup in all skins 5 years ago
Aleksander Machniak bdd1b94d78 Fix PHP 7.4 warning: "Creating default object from empty value" 5 years ago
Aleksander Machniak 48f0f11807 Elastic: Fix color of input placeholder in Edge and some older browsers 5 years ago
Aleksander Machniak 707e070a77 Fix some popover menu regressions, simplify some styles 5 years ago
Aleksander Machniak 0d631491b4 Merge branch 'elastic_menus' of https://github.com/johndoh/roundcubemail into johndoh-elastic_menus 5 years ago
Aleksander Machniak fcf5a12e30 Password: Support INSERT ... ON DUPLICATE KEY UPDATE queries 5 years ago
PhilW 69e09b12d2 (Elasitc) also support no-icon class on entire menu 5 years ago
PhilW 538b124f13 a few tweaks to elastic popup menus 5 years ago
Aleksander Machniak 27bfd0884e Drop rcube_browser::$lang property
You should use Accept-Language header instead, as we do in other place
5 years ago
Aleksander Machniak 1a10074b85 Add Edge browser detection 5 years ago
Aleksander Machniak f5d6a242a8 Remove useless properties from rcube_browser 5 years ago
Aleksander Machniak 0786ab8187 Update localization 5 years ago
Aleksander Machniak 4096739322 Fix including assets that exist only in minified version 5 years ago
Aleksander Machniak bdd1b2054f Elastic: Add indicator for popover menu items that open a submenu (#6868) 5 years ago
Aleksander Machniak 21ebf3ff5a Fix bug where it was possible to bypass href URI check with data:application/xhtml+xml URIs (#6896) 5 years ago
Aleksander Machniak 63730cf842 Fix security issue where it was possible to bypass the CSS jail in HTML messages using :root pseudo-class (#6897) 5 years ago
Aleksander Machniak 057fb69bb9 Fix bug where some strict remote URIs in url() style were unintentionally blocked (#6899) 5 years ago
Aleksander Machniak 7bf868767e Fix security issue where it was possible to bypass the position:fixed CSS check in received messages (#6898) 5 years ago
Aleksander Machniak 14cb21c87e Elastic: Fix select/selection button in some places 5 years ago
Aleksander Machniak 3b4d9f3fb5 PHPDoc updates 5 years ago
Aleksander Machniak 1afa46d28d PHPDoc and CS fixes 5 years ago
Aleksander Machniak cc21eac9b9 Update changelog 5 years ago
Aleksander Machniak 0dacbc8e0f Merge branch 'thomascube-pr-elastic-icons' 5 years ago
Aleksander Machniak c5b844e235 Elastic: (Imho) better icon for Collapse All action 5 years ago
Aleksander Machniak 2691fe1cf0 Elastic: Slightly better icon for Invert action 5 years ago
Aleksander Machniak b07f7212be Elastic: Fix selection button icon in Enigma 5 years ago
Aleksander Machniak 53ccce4be9 Merge branch 'pr-elastic-icons' of https://github.com/thomascube/roundcubemail into thomascube-pr-elastic-icons 5 years ago
Aleksander Machniak 6ec3217f1e Use kolab/net_ldap3 1.1.x 5 years ago
Aleksander Machniak b35c9c1fdc Apply image preview centering styles only if there's an image
For cases when we display a security warning about the image attachment
the image centering styles would make the warning centered, which
we do not want.
5 years ago
Aleksander Machniak d36ea2aa86 Elastic: Fix bg color of .rcmail-inline-message warning 5 years ago
Aleksander Machniak f7832a1a26 Removed 'delete_always' option (#6782) 5 years ago
Thomas Bruederli 7661fa6711 Use the same icon for select/expand unread 5 years ago
Thomas Bruederli 65735a6f94 Add accept option (-y) to installto.sh script 5 years ago
Jack Cherng f5d4c80e71 Elastic: fix a undefined color (#6810)
It's referenced in the widgets/jqueryui.less.

Signed-off-by: Jack Cherng <jfcherng@gmail.com>
5 years ago
johndoh 3a40f6cd91 Add expand_all/collapse_all treelist methods (#6860)
* add expand_all()/collapse_all() treelist methods
* prevent possible race condition in rcmail.folder_collapsed()
5 years ago
Aleksander Machniak e88e0c16c9 Move rcmail (and future rcmail_*) class tests to tests/Rcmail directory 5 years ago
Aleksander Machniak 04ff1feec3 Improve wording: record -> list entry 5 years ago
Aleksander Machniak 5db4b3f5ea Fix '\n' visible when identity has multiple GPG keys (#6885) 5 years ago
Aleksander Machniak 4062c64acd Update changelog 5 years ago
Aleksander Machniak 902c264cf0 PHPRedis 5 compat. fix in session handler 5 years ago
Jack Cherng 198585d8a0 Fix implode() wrong parameter order (#6866)
It has been deprecated in PHP 7.4.

Such as PHP deprecated:  implode(): Passing glue string after array is deprecated. Swap the parameters in /var/www/roundcubemail/program/lib/Roundcube/rcube_db.php on line 917

Signed-off-by: Jack Cherng <jfcherng@gmail.com>
5 years ago
Sandor Takacs adcfa53532 Redis::delete() is deprecated in phpredis 5.0.0 (#6883)
Redis::delete() is deprecated in phpredis 5.0.0
5 years ago
Jack Cherng 17d8423299 Fix PHP 7.4 deprecation: array/string curly braces access (#6884)
Signed-off-by: Jack Cherng <jfcherng@gmail.com>
5 years ago
Aleksander Machniak 9a225bd3fe Use Left/Right Arrow keys to faster move over threaded messages list (#6399)
Fixed some inconsistencies in list widget expand/collapse code.

Made the arrow keys behavior like in Thunderbird, i.e.:
- Right Arrow expands thread or selects closest child if already expanded,
- Left Arrow collapses thread or jumps to closest parent,
- Left Arrow + Ctrl selects top-most parent,
- Up/Down Arrow keys behavior didn't change.
5 years ago
Aleksander Machniak dc5be05a5f Select all records on the current list page with CTRL + A (#6813) 5 years ago
Aleksander Machniak 7e8f9da64b Elastic: Add "Show unread messages" button to the search bar (#6587) 5 years ago
Aleksander Machniak 9b88e9e5c2 Correct vendor string for GMail is 'gimap' 5 years ago
Thomas B 53130c08ef Make propform column sizing variable (#6867)
Allow to specify the preferred column sizes with a propform table class.
5 years ago
Aleksander Machniak be4341663c Merge branch 'pr-elastic-icons' of https://github.com/thomascube/roundcubemail into thomascube-pr-elastic-icons 5 years ago
johndoh 91398c858a Add KOI8-R to charset_selector (#6861) 5 years ago
Aleksander Machniak b3b0c5efe2 Remove redundant rcmail_ prefix 5 years ago
johndoh 18a4d63be8 Fix deleting original message in some markasjunk drivers (#6862) 5 years ago
Thomas Bruederli 52f360a994 Fix export selected menu icon 5 years ago
Aleksander Machniak 900c6813e3 Merge branch 'pr-elastic-icons' of https://github.com/thomascube/roundcubemail into thomascube-pr-elastic-icons 5 years ago
Aleksander Machniak fbe36c7f5a Elastic: Fix bug where use of Tab key on autocomplete causes double insertion into a recipient input (#6850) 5 years ago
Aleksander Machniak 5baa8981ea Elastic: Fix bug in handling pasting text into a recipient input 5 years ago
Aleksander Machniak 7a854f1b56 Fix removing acl entries (regression) 5 years ago
Thomas Bruederli 07b67fe20e Elastic: icons cleanup
- Distinct icons for settings and options
- Distinct icons for expand actions (threads)
- Consistent icon to enable select checkboxes
5 years ago
Aleksander Machniak a80c5569ab Added flag to disable server certificate validation via Mysql DSN argument (#6848) 5 years ago
Aleksander Machniak 6daefc3d45 Elastic: Fix so search is not reset when returning from the message preview page (#6847) 5 years ago
Aleksander Machniak 786bde62f2 Fix wrong messages order after returning to a multi-folder search result (#6836) 5 years ago
Aleksander Machniak 0e4bf6fda8 Fix bug where unread count wasn't updated after moving multi-folder result (#6846) 5 years ago
Aleksander Machniak d9e3218025 Fix bug where handling multiple messages from multi-folder search result could not work (#6845) 5 years ago
Aleksander Machniak d39d49b7a6 Fix keyboard navigation (tabindex) on attachments list in compose 5 years ago
Aleksander Machniak 1e365b4d9d Elastic: Remove border from attachments list in upload widget 5 years ago
Aleksander Machniak 14849be400 Merge branch 'pr-elastic-attachments' of https://github.com/thomascube/roundcubemail into thomascube-pr-elastic-attachments 5 years ago
Aleksander Machniak 7fe99bdcb1 Elastic: Small fix and improvement for .sidebar-right 5 years ago
Aleksander Machniak e9ff423a94 Merge branch 'pr-elastic-compose' of https://github.com/thomascube/roundcubemail into thomascube-pr-elastic-compose 5 years ago
Thomas Bruederli 00a867a05f Make attachment list :empty selector work 5 years ago
Thomas Bruederli cf862fbd6f Elastic: draw box around attachments list 5 years ago
Thomas Bruederli 9717fde456 Elastic: small improvements to compose screen
- Move attachments panel to the right
- Use pen icon for floating compose button
5 years ago
Aleksander Machniak 44bdca4ab9 Enigma: Fix bug where signature verification could have been skipped for some message structures (#6838) 5 years ago
Aleksander Machniak c1344643a1 Fix bug in miemetype name comparator
The code was removing the first matching prefix (x- or x-ms-), which
caused 'x-ms-bmp' to end up as 'ms-bmp'. It should be 'bmp'. Fixed by
reverting the order of tokens in the regexp.
5 years ago
Aleksander Machniak bfe2bc17d7 Fix css styles leak from replied/forwarded message to the rest of the composed text (#6831)
Generally do the same with styles what we do on message preview.

This also fixes small bugs in handling styles:
- fix so <style> tag on the start of the HTML content is not ignored
- fix so body's background/bgcolor attributes are applied to the container (regression)
5 years ago
Aleksander Machniak 598cc5f42f Elastic: Add default icon on Settings/Preferences lists for external plugins (#6814) 5 years ago
Aleksander Machniak 8f895cb17f Replace function alias: getallheaders() -> apache_request_headers() 5 years ago
Aleksander Machniak 042b954fd0 Elastic: Roboto Font v19 5 years ago
Jack Cherng 20bf625733 Remove a unused variable in rcube_plugin::include_stylesheet() (#6832)
Signed-off-by: Jack Cherng <jfcherng@gmail.com>
5 years ago
Aleksander Machniak b7b2ce7b91 Small code improvement 5 years ago
Aleksander Machniak 446ff50c57 Merge branch 'dev/display_next' of https://github.com/alecpl/roundcubemail into alecpl-dev/display_next 5 years ago
Aleksander Machniak 6d17e58380 Add basic test for password drivers 5 years ago
Aleksander Machniak 9d5e2219f8 Make ldap_ppolicy to log debug into 'ldap.log' file 5 years ago
Aleksander Machniak 4e9aca2f27 Fix visibility of rcube_ldap_exop_password::$debug (#6828) 5 years ago
Aleksander Machniak 881c0ec0da Avoid empty entry in rule selector 5 years ago
Aleksander Machniak a991e3181c Put charset meta specification before a title tag, add page title automatically (#6811)
I.e. templates should not specify <title>
5 years ago
Aleksander Machniak 84c4d062c6 Unified and simplified keypress event handling on a list widget 5 years ago
Aleksander Machniak b25699d2ac Elastic: Improve show-content event handler 5 years ago
Aleksander Machniak 14d8ac3585 Elastic: Make @color-list-deleted the same as disabled buttons, etc.
i.e. semi-transparent @font-color
5 years ago
Jack Cherng e449f30eff Simplify jQuery DOM ready at the footer (#6825)
https://api.jquery.com/ready/#entry-longdesc

Signed-off-by: Jack Cherng <jfcherng@gmail.com>
5 years ago
Aleksander Machniak 0869f02b7c Fix bug in converting multi-page Tiff images into Jpeg (#6824)
When using 'convert' binary we have to use -flatten argument (the same
as we do with thumbnails) otherwise it will produce multiple output files
with -0, -1, etc. suffix. This way we make sure to generate only one image
until we support multi-page Tiff properly.
5 years ago
Aleksander Machniak ed8beee5ff Elastic: Unify margin on #compose-attachments 5 years ago
Aleksander Machniak d3b468d330 Elastic: Remove wrong min-height on .ui.alert on mobile 5 years ago
Aleksander Machniak f181cdfd39 Elastic: Remove height from .iframe-wrapper
It fixes some iframed dialogs by making the footer bar not hidden in Chrome.
5 years ago
Aleksander Machniak 404995ef95 Elastic: Execute screen_resize_headers() in framed mode 5 years ago
Jack Cherng 26fd266496 Fix variables defined in variable.less cannot be overwritten (#6819)
Signed-off-by: Jack Cherng <jfcherng@gmail.com>
5 years ago
Aleksander Machniak ae3eb57fe8 Update changelog 5 years ago
Johannes Prösl 4644e3404f Adding ssha512 password_algorithm (#6805)
* Added SSHA512 method to the hash_password function

Basically a copy of the ssha method this case is compatible with the dovecot ssha512 settings so there is no doveadm needed alongside with roundcube to update ssha512 passwords.
5 years ago
johndoh f99c16432a fix failing travis-ci checks (#6815) 5 years ago
Aleksander Machniak 2d8c396b6e Fix bug where selection of columns on messages list wasn't working 5 years ago
Aleksander Machniak 6196278869 Fix bug where title text on a treelist record (folder) could include unread count number
Add skip-content class to unreadcount elements
5 years ago
Aleksander Machniak be2e3f2154 Elastic: Fix handling new-line in text pasted to a recipient input 5 years ago
Aleksander Machniak 7fa5180fcc ACL: Display user/group names (from ldap) instead of acl identifier 5 years ago
Aleksander Machniak 7846505fa4 Don't expand groups without id
Skipping redundant request for cases like ACL plugin where we may deal
with groups that may have no mail, id nor source assigned in acl identifier
autocompletion.
5 years ago
Aleksander Machniak 0a0ad2c9b7 Switch to IDNA2008 variant (#6806)
After switching IDNA_NONTRANSITIONAL_TO_ASCII on, switch to
IDNA2008 variant in Net_LDAP2. Add test, update changelog.
5 years ago
Max Bosse f1d3f9ee44 Fix: Use IDNA_NONTRANSITIONAL_TO_UNICODE for idn_to_utf8 call 5 years ago
Max Boße 70c20740e7
Set 'IDNA_NONTRANSITIONAL_TO_ASCII' idn-option 5 years ago
Aleksander Machniak 89a342a03a Elastic: Fix visual issue with long buttons in .boxwarning (#6797) 5 years ago
Aleksander Machniak 037bc3c94f Fix code indentation 5 years ago
Aleksander Machniak a97822eb8b Remove importgettext.sh and exportgettext.sh scripts 5 years ago
Aleksander Machniak 8e63309203 CS fixes, tabs to spaces 5 years ago
Aleksander Machniak f7b4ce0412 Remove dumpschema.sh
Usefulness of this script is very low, and MDB2 is not our dependency anymore
5 years ago
Aleksander Machniak f6807bcc4c Added 'keyservers' option to define list of HKP servers for Enigma/Mailvelope (#6326) 5 years ago
Aleksander Machniak 1423536ce0 Plugin API: Add 'render_folder_selector' hook 5 years ago
Aleksander Machniak 1e5284d245 Elastic: Improve #contactpic color/size 5 years ago
Aleksander Machniak 22a47cced6 Changes in `display_next` setting (#6795)
- Move it to Preferences > User Interface > Main Options
- Make it apply to Contacts interface too
- Make it apply only if deleting/moving a previewed message/contact
5 years ago
Aleksander Machniak 940e500c1f Enigma: For verified signatures, display the user id associated with the sender address (#5958) 5 years ago
Aleksander Machniak 0e4156ea83 Fix bug where Next/Prev button in mail view didn't work with multi-folder search result (#6793) 5 years ago
Aleksander Machniak 4b415c356c Elastic: Better Spellcheck icon (#6792) 5 years ago
Aleksander Machniak da678873b7 Elastic: FontAwesome 5.9.0 5 years ago
Aleksander Machniak 7af72e82fc Elastic: Fix some jumping effect in Chrome (#6677) 5 years ago
Aleksander Machniak c8bec34f8f Properly apply assets_path to contact photo placeholder 5 years ago
Aleksander Machniak 8932abd2e7 CS fixes 5 years ago
Aleksander Machniak 24913e51d3 Mention Kolab/Net_LDAP3 as a dependency 5 years ago
Aleksander Machniak 2351fc13a6 Remove pear/net_ldap2
We don't have to suggest a dependency of kolab/net_ldap3.
5 years ago
Aleksander Machniak 40f38221af Elastic: Remove unused png images 5 years ago
Aleksander Machniak 7e2e92909e Elastic: Optimize svg images for size 5 years ago
Aleksander Machniak 204a2c2d5b Elastic: Fix missing delete button in image upload widget in some browsers 5 years ago
Aleksander Machniak d19377d276 Elastic: Fix image in #contactpic element on iOS 9
Looks like some svg in a flex container issue. Changed technique to center the image.
5 years ago
Aleksander Machniak 183c62451a Elastic: Fix iframe height on iOS 9 5 years ago
Aleksander Machniak ed9da6cb7f Memcached: Don't add the same server to the pool many times when using persistent connections 5 years ago
Aleksander Machniak 668ca02c3f Larry: Fix some TinyMCE buttons 5 years ago
Aleksander Machniak e0792c3287 Skip RSET after authentication failure and QUIT 5 years ago
Aleksander Machniak b39c5aaaec Exit immediately after http redirect
This is needed since we use 401 on logout
5 years ago
Aleksander Machniak fdac30e544 Support PECL memcached extension as a session and cache storage driver (experimental) 5 years ago
Aleksander Machniak 2a25f1778b Make sure managesieve_default is not a dir (#6773) 5 years ago
Aleksander Machniak 4ef87fe856 Support $HasAttachment/$HasNoAttachment keywords (#6201)
We use these only to display the attachment icon on the messages list.
5 years ago
Aleksander Machniak f8ca8d1b63 Fix invalid path to "add contact" icon when using assets_path setting
This and a few other icons
5 years ago
Aleksander Machniak 8cc0848d03 Elastic: Fix toolbar regressions in IE11 (#6765) 5 years ago
Aleksander Machniak 3194ca235b Update comment 5 years ago
Aleksander Machniak 9f11289e34 Fix toolbar on iOS (#6765) 5 years ago
Aleksander Machniak 6e5027ba24 Fix so userlogins and sendmail logs are never put into the per_user_logging folder 5 years ago
Aleksander Machniak d646a10217 Add in_selection() to rcube_treelist_widget
So code working on all lists doesn't have to check widget type
to work with selection.
5 years ago
Aleksander Machniak 4bce2c4389 Elastic: Small visual fix in vacation form 5 years ago
Aleksander Machniak 9a8f4cb13d Elastic: Fix border radius on messages (again) 5 years ago
Aleksander Machniak 7f999ab13f Bump version number 5 years ago
Aleksander Machniak 6cddb6c5d0 Bump version number, use pear/net_sieve 5 years ago
Aleksander Machniak 9022d427b1 Add emoticons plugin localization 5 years ago
Aleksander Machniak c6fc417fe9 Add emoticons plugin to transifex config 5 years ago
Aleksander Machniak c287dad54e Add dialog-open event (#6748) 5 years ago
Aleksander Machniak 2dccbf2879 Redis: Support connection to unix socket
Also handle exceptions thrown on connection and remove support for
specifying hosts with redis:// scheme.
5 years ago
Aleksander Machniak a8f3d46bb9 Merge branch 'master' of github.com:roundcube/roundcubemail 5 years ago
Aleksander Machniak ce52b04051 Update changelog, add some tests for rcube_utils::parse_host() 5 years ago
Amir Caspi 6b5fa52ec1 Update rcube_utils::parse_host, fixes #6746
Updated regexps used in parse_host to ensure that %t, %d, %z do not cut off domain and return only tld when underlying host has no subdomain (i.e., is just domain.tld rather than mail.domain.tld).  Update fixes #6746, now returns nothing shorter than domain.tld.

Also removed backslash from character class, period does not need to be escaped within character class.
5 years ago
Peter Dey 92602734b1 Elastic: Add infrastructure to apply CSS styles to specific action dialogs/screens (#6749)
Examples:
* action-headers - The headers popup
* action-plugin-managesieve-action - The managesieve filter creation screen
5 years ago
Aleksander Machniak 7c8ce07e8c Fix bug where bold/strong text was converted to upper-case on html-to-text conversion (6758) 5 years ago
Aleksander Machniak 5c131aff54 Elastic: Fix pretty select list height on mobile 5 years ago
Aleksander Machniak 14265248ce Elastic: Fix regression where on mobile scrollbar could have been missing in some pages 5 years ago
Aleksander Machniak 35b12620eb Elastic: Fix Firefox sub-pixel positioning issues
... by using size values rounded in less - in most prominent places.
There's still problem with form controls padding, but we'll work on this
when really needed.
5 years ago
Aleksander Machniak 0feb46574c Update languages list 5 years ago
Aleksander Machniak a1301a78d6 Localization update 5 years ago
Aleksander Machniak b24869b0cd Elastic: Fix bug where Enigma options in mail compose could sometimes be ignored (#6515) 5 years ago
Aleksander Machniak 910505a361 Fix regression where drafts were not deleted after sending the message (#6756) 5 years ago
Aleksander Machniak b8800c5b9a Elastic: Bring back border-radius for #messagestack objects 5 years ago
Aleksander Machniak 516a88e49d Elastic: Simplify some styles for .ui.alert 5 years ago
Aleksander Machniak 918c8859b6 Remove redundant rule
It actually broke some plugins after commit 5fb8e8cb86 (#6739).
5 years ago
Aleksander Machniak 0c4d78aa11 Remove language code from charset name as per the RFC2231.5 5 years ago
Aleksander Machniak 86a9788083 Fix invalid path to blocked.gif when using assets_path setting (#6752) 5 years ago
Aleksander Machniak 8db00c6265 Elastic: Fix handling mailto: URL parameters in contact menu (#6751)
Also fix keyboard navigation in some menus, e.g. contact menu
5 years ago
Aleksander Machniak 51c9bab005 Small cleanup and mention that Elastic requires IE 11+ 5 years ago
Aleksander Machniak 9391a531ff Fix regexp 5 years ago
Aleksander Machniak 8fe12e2fad Enigma: Fix "decryption oracle" bug [CVE-2019-10740] (#6638)
When composing mail (on reply/forward/edit) we decrypt content only
in the first "content part" of the message.
5 years ago
Aleksander Machniak 1ee7253ff2 Enigma: Fix error message when trying to encrypt with a revoked private key (#6607) 5 years ago
Aleksander Machniak 6efa88f049 Enigma: Fix bug where revoked users/keys were not greyed out in key info
The 'deleted' class was assigned to the wrong (next) row in a table.
It also didn't work in Elastic skin at all because of the missing style.
5 years ago
Aleksander Machniak b89031e335 Fix PHP Deprecated: idn_to_ascii(): INTL_IDNA_VARIANT_2003 is deprecated
Use rcube_utils::idn_to_ascii() instead of idn_to_ascii().
5 years ago
Aleksander Machniak fe90903fa1 Fix bug in parsing vCard data using PHP 7.3 due to an invalid regexp (#6744)
Looks like \R is not allowed in character class, but \r\n is fine.
On PHP 7.3.5 it throws warnings and empty result from preg_replace(),
though I couldn't reproduce.
5 years ago
Aleksander Machniak f3d16240f2 Fix bug where bmp images couldn't be displayed on some systems (#6728) 5 years ago
Aleksander Machniak e3014de2ce Simplify code around detected mimetype string 5 years ago
Aleksander Machniak 3f351697c3 Elastic: Fix non-working @color-taskmenu-button-selected-hover 5 years ago
Aleksander Machniak 232d4be561 Elastic: Add text aligning for toolbar items
For very short button text e.g. "Add" the text has to be centered.
5 years ago
Aleksander Machniak cf51aead63 Larry: Fix regression where menu actions didn't work with keyboard (#6740)
For Elastic remove Space/Enter key handler on menus, so we use
default browser behaviour. Triggering a onclick programatically
causes popup window warning sometimes.
5 years ago
Aleksander Machniak 3719ce0653 Don't use :has selector 5 years ago
Aleksander Machniak 2c38460b09 Make sure an event triggered by Enter key press on a link is treated as a keyboard event 5 years ago
Aleksander Machniak 5fb8e8cb86 Elastic: Fix issue with absolute positioned mail content (#6739) 5 years ago
Aleksander Machniak c42be24fd3 Update changelog 5 years ago
Aleksander Machniak 8c471478f7 Merge branch 'dev/elastic' 5 years ago
Aleksander Machniak f76d9e0c09 Small fix 5 years ago
Aleksander Machniak 67f9f504a3 key ring -> keyring
...for consistence with other places
5 years ago
Aleksander Machniak f3c9699817 Fix so advanced search dialog is not automatically displayed on searchonly addressbooks (#6679) 5 years ago
Aleksander Machniak 68256be600 Bump CodeMirror version to 5.46.0 5 years ago
Aleksander Machniak 487052cb5c jQuery-3.4.1 5 years ago
Aleksander Machniak 45a6ad1ba7 Fix so an error is logged when more than one attachment plugin has been enabled, initialize the first one (#6735) 5 years ago
Aleksander Machniak 593188559a Fix regression where non-terminating errors were sent to the browser 5 years ago
Aleksander Machniak e67765b863 Fix bug where flag change could have been passed to a preview frame when not expected 5 years ago
Aleksander Machniak 55cca61134 Workaround more invalid HTML cases parsed incorrectly by Mastermind/HTML5 (#6713) 5 years ago
Aleksander Machniak 00ef5d05ef Merge branch 'master' into dev/elastic 5 years ago
Peter Dey 07d4996825 Elastic: Make header title in message view slightly wider, so we can fit the string "X-Original-To" (#6731) 5 years ago
Aleksander Machniak 68f4566b0f Get rid of widgets/mail.less
Move .image-tools to widgets/common.less, and the rest to styles.less.
5 years ago
Aleksander Machniak ce9c52e65a Merge branch 'master' into dev/elastic 5 years ago
Aleksander Machniak 00f94a47bb Rephrase cookiesmismatch text 5 years ago
Aleksander Machniak 850d414443 Don't allow dragging .custom-control elements on folders list 5 years ago
Aleksander Machniak 7457829c49 Elastic: Don't use cursor:pointer on disabled switches 5 years ago
Aleksander Machniak 187b51fd82 Fix bug where parent entry could be selected when clicking on a virtual entry 5 years ago
Aleksander Machniak 70a0976be1 Remove redundant error message 5 years ago
Aleksander Machniak fbb5a5bc4f Small code simplification in raise_error() 5 years ago
Aleksander Machniak e3d3add48a installto.sh: Add possibility to run the update even on the up-to-date installation (#6533) 5 years ago
Aleksander Machniak 02dc6ce41c Don't init the session in CLI mode
This prevents from PHP warnings when using CLI scripts e.g. installto.sh.
5 years ago
Aleksander Machniak 72ad567db6 Add new line at the end of error message in CLI mode 5 years ago
Aleksander Machniak 00173a7622 Update some code documentation 5 years ago
Aleksander Machniak 521e0c048c Managesieve: Bump version number 5 years ago
Aleksander Machniak 3562d7ffa6 Fix so "Create filter" option does not show up when Filters menu is disabled (#6723) 5 years ago
Aleksander Machniak ccb70116f1 Managesieve: Use RFC-compliant line endings, CRLF instead of LF (#6686) 5 years ago
Aleksander Machniak d8470c6c2b Remove useless "..." suffix 5 years ago
Aleksander Machniak 9c4e2eacab Don't log full session identifiers in userlogins log (#6625)
Log only 16-char prefix.
5 years ago
Aleksander Machniak 32612f0b8f Log some more info with session_debug 5 years ago
Aleksander Machniak f3948a26b8 Use .log suffix in options descriptions as it's the default 5 years ago
Aleksander Machniak c87ac075ae Renamed 'log_session' option to 'session_debug' 5 years ago
Aleksander Machniak f1a83f923d Added cookie mismatch detection, display an error message informing the user to clear cookies 5 years ago
Aleksander Machniak 5218b0193a Clarified 'address_book_type' option behavior (#6680) 5 years ago
Aleksander Machniak 22694665d9 Fix code indentation 5 years ago
Aleksander Machniak 57c67db029 Remove year(s) from copyright headers + some cleanup 5 years ago
Aleksander Machniak 69080457b1 Code simplification 5 years ago
Aleksander Machniak 92ed0154d5 Followup fix on handling HTML content w/o html/head/body tag (#6713) 5 years ago
Aleksander Machniak 03d56926d8 Fix bug in HTML parser that could cause missing text fragments when there was no head/body tag (#6713) 5 years ago
Aleksander Machniak 1078d8df16 Fix cpanel_webmail driver 5 years ago
Aleksander Machniak 711e46a018 Force HIGHESTMODSEQ use on dovecot
This may fix some messages cache issues. Dovecot does not return
HIGHESTMODSEQ nor NOMODSEQ metadata on SELECT until it is "forced"
to switch to "permanent mod-seq mode". It can be done either by
ENABLE QRESYNC/CONDSTORE or by requesting the metadata explicitely
on SELECT/STATUS. We'll use STATUS for that.
5 years ago
Aleksander Machniak 3ec6a60ad1 Fix PHP Warning: in_array() expects parameter 2 to be array, null given 5 years ago
Aleksander Machniak f0811f6f50 DOn't use deprecated (and slow) selectors 5 years ago
Aleksander Machniak 0c419e4dd1 Elastic: .compact-table fixes 5 years ago
Aleksander Machniak 8b74fd73da Update to jQuery 3.4.0 5 years ago
Aleksander Machniak cd4c756322 CS fixes 5 years ago
Aleksander Machniak 4674ac59b8 Fix bug where global includes were requested for vacation (#6716) 5 years ago
Aleksander Machniak a78f91f5dc Small code de-duplication 5 years ago
Aleksander Machniak fd167152e1 jqueryui plugin is already required by core 5 years ago
Aleksander Machniak 8036bfafab Fix setting button state when registering it after onload
Also get rid of uibutton support, it's not used anymore.
5 years ago
Aleksander Machniak 9ab932d9ba Remove redundant "ERROR: " prefix 5 years ago
Aleksander Machniak 706313bdeb Elastic: Fix setting pretty select popup width
In some cases the min_width was set to value bigger than max_width.
5 years ago
Aleksander Machniak b8f27af8cb Elastic: Fix non-working pretty selects in Chrome browser (#6705) 5 years ago
Aleksander Machniak 23978006da Add note about IIS and woff fonts (#6710) 5 years ago
Aleksander Machniak 6fd2366a94 Merge branch 'dsoares-wash-xml-namespace' 5 years ago
Aleksander Machniak a07c44804a Update changelog 5 years ago
Aleksander Machniak 6f479096d5 Merge branch 'wash-xml-namespace' of https://github.com/dsoares/roundcubemail into dsoares-wash-xml-namespace 5 years ago
Aleksander Machniak fc44e4612f Merge branch 'nuxwin-#6704' 5 years ago
Aleksander Machniak 2f05533710 Small code improvements 5 years ago
Aleksander Machniak 0cc1ec0131 Merge branch '#6704' of https://github.com/nuxwin/roundcubemail into nuxwin-#6704 5 years ago
Aleksander Machniak f045812fcc Bump masterminds/html5 version up 5 years ago
Aleksander Machniak b304782cbc Elastic: Various cross-browser fixes and improvements 5 years ago
Laurent Declercq ae59269f27
Make use of rcube::raise_error() function for error handling in bin/install-jsdeps.sh (#6704) 5 years ago
Aleksander Machniak 4d1b3e263a Elastic: Fix folders list scrolling on touch devices (#6706) 5 years ago
Aleksander Machniak a35699637d Fix PHP error when using Net_LDAP3 from master
get_entry() method signature has changed. We don't really needed
that override in rcube_ldap_generic, so it's now removed.
5 years ago
Aleksander Machniak 347b92f8cf Update tinymce languages url 5 years ago
dsoares 00cc13a1b9 Fix bug where HTML messages with a xml:namespace tag were not rendered. 5 years ago
Aleksander Machniak b667f1ec02 Elastic: Better buttons alignment in .menu.footer .buttons 5 years ago
Aleksander Machniak c2a5ffeecb Elastic: Fix inactive options in #mailto-menu (regression) 5 years ago
Aleksander Machniak a75ad5e9b1 Elastic: Remove redundant styles 5 years ago
Aleksander Machniak b86472badf Elastic: Fix scrollbar issue in jQuery-UI dialogs
Bootstrap's box-sizing:border-box on everything does not work nice with jQuery-UI.
5 years ago
Aleksander Machniak 1a68fe25c0 Elastic: Fix padding in jQuery-UI dialogs 5 years ago
Aleksander Machniak 96df04b020 Elastic: Small spacing fix 5 years ago
Aleksander Machniak e8ff189627 Use simpler code 5 years ago
Aleksander Machniak 77439f9772 Add missing role=menuitem 5 years ago
Aleksander Machniak 79ca8bc40a Elastic: Small regression in .menu.footer 5 years ago
Aleksander Machniak ddef3926aa Fix TinyMCE download location (#6694) 5 years ago
Aleksander Machniak 4524156a3d Merge branch 'dev/elastic' of github.com:roundcube/roundcubemail into dev/elastic 5 years ago
Aleksander Machniak f1e911ec03 Elastic: Toolbar/menus/layout refactoring
Refactoring for better consistency and simplicity.

5KB less in size of (minified) styles.css file.

Layout changes:
- body > #layout > .menu       -> #layout-menu
- body > #layout > .list       -> #layout-list
- body > #layout > .sidebar    -> #layout-sidebar
- body > #layout > .content    -> #layout-content

Toolbar/menu changes:
- .toolbar           -> .toolbar.menu
- .toolbarmenu       -> .menu.listing
- .menu-button       -> .task-menu-button
- .pagenav.toolbar   -> .pagenav.menu
- #taskmenu          -> #taskmenu.menu.toolbar
- .image-tools .menu -> .image-tools .menu.toolbar
- required .disabled class to de-activate menu items
- .button class is not required on .menu children
- merge toolbar.less and taskmenu.less into menu.less
- @color-toolbarmenu-hover            -> @color-menu-hover
- @color-toolbarmenu-hover-background -> @color-menu-hover-background

Also cleaned/removed some code in spellchecker.js. Made .googie_list a list not table.
5 years ago
Aleksander Machniak e8a332e628 Elastic: Toolbar/menus/layout refactoring
Refactoring for better consistency and simplicity.

5KB less in size of (minified) styles.css file.

Layout changes:
- body > #layout > .menu       -> #layout-menu
- body > #layout > .list       -> #layout-list
- body > #layout > .sidebar    -> #layout-sidebar
- body > #layout > .content    -> #layout-content

Toolbar/menu changes:
- .toolbar           -> .toolbar.menu
- .toolbarmenu       -> .menu.listing
- .menu-button       -> .task-menu-button
- .pagenav.toolbar   -> .pagenav.menu
- #taskmenu          -> #taskmenu.menu.toolbar
- .image-tools .menu -> .image-tools .menu.toolbar
- required .disabled class to de-activate menu items
- .button class is not required on .menu children
- merge toolbar.less and taskmenu.less into menu.less
- @color-toolbarmenu-hover            -> @color-menu-hover
- @color-toolbarmenu-hover-background -> @color-menu-hover-background

Also cleaned/removed some code in spellchecker.js. Made .googie_list a list not table.
5 years ago
Aleksander Machniak dbf6e0a81d Improve display_message() for sophisticated 'loading' messages
So it's possible to display more than one message of type 'loading'
at a time and define custom timeout.
5 years ago
Aleksander Machniak fae26eab13 Elastic: Add Prev/Next buttons on message page toolbar (#6648) 5 years ago
Aleksander Machniak f1c40c8aa9 Fix bug where attachment preview didn't work with x_frame_options=deny (#6688) 5 years ago
Aleksander Machniak 27408182b9 Expect skin thumbnails to be in assets 5 years ago
Aleksander Machniak ab7eeb3daa CS fixes 5 years ago
Aleksander Machniak d8488aae32 Disable spellcheker (hide button) if the list of languages is empty
Better handling of uninitialized (not installed) spellchecker engine.
Also prevent from PHP fatal error if enchant ext is not installed.
5 years ago
Aleksander Machniak 844ec53612 Elastic: Fix bug where toolbar disappears on attachment menu use in Chrome (#6677) 5 years ago
Aleksander Machniak c827925051 Fix so "Open in new window" consistently displays "external window" interface (#6659)
Both 'show' and 'extwin' will use _extwin=1 argument.
5 years ago
Aleksander Machniak b15e61a17f Elastic: Remove incorrect .proplist padding 5 years ago
Aleksander Machniak 3eebe8da56 Elastic: Fix overflow issues in ACL form 5 years ago
Aleksander Machniak 3b4d07a055 Elastic: Close search options on Enter key press in quick-search input (#6660) 5 years ago
Cedric Girard c7677a5722 Follow redirection when downloading with curl (#6681) 5 years ago
Aleksander Machniak 982919582c Add zh_MO and zh_HK as aliases of zh_TW (#6666)
with CS fixes
5 years ago
Aleksander Machniak 53c37a1321 WS and CS fixes 5 years ago
Boris Rybalkin 2d85dad0cc Support ROUNDCUBE_CONFIG_DIR env variable (#6112) 5 years ago
Aleksander Machniak 2bd039c9b5 Merge branch 'master' of github.com:roundcube/roundcubemail 5 years ago
Aleksander Machniak ab28c4ae26 Fix bug where external content (e.g. mail body) was passed to templates parsing code (#6640)
It should have been part of "Fix so templating system does not mess with external (e.g. email)
content (#5499)" (d02e6ea45e), but it wasn't.
5 years ago
Peter Kubica b2ffe58f9d Fix for: Password: De-duplicate ldap drivers code (#6669) 5 years ago
Aleksander Machniak 9d19d5b5d5 Merge branch 'army1349-master' 5 years ago
Aleksander Machniak 0751c1c8eb Password: De-duplicate ldap drivers code 5 years ago
Aleksander Machniak 2ea9d4fe80 Merge branch 'master' of https://github.com/army1349/roundcubemail into army1349-master 5 years ago
Aleksander Machniak 0ac2747293 Elastic: Add missing filter drag-n-drop indicators 5 years ago
Aleksander Machniak d88fb7e4ff Elastic: Fix displaying (.invalid-feedback) error messages in forms 5 years ago
Aleksander Machniak 78070441de Elastic: Move Actions button from filters list footer to header 5 years ago
Aleksander Machniak 939ca63a59 Filters set -> Filter set, consistently 5 years ago
Aleksander Machniak 4fff3315d0 Elastic: Changed read/unread icons (#6636) 5 years ago
Aleksander Machniak 7387bfcd0c Elastic: Changed "Move to..." icon (#6637) 5 years ago
Aleksander Machniak 0f6f20c629 Elastic: Improve selector for table.propform content 5 years ago
Aleksander Machniak b232886488 Properly cleanup on drag end in treelist widget 5 years ago
Peter Kubica 07d7ec83a0 ldap_exop - move function exist check to the start 5 years ago
Aleksander Machniak 743794f1d8 Treelist: Add possibility to not reset selection on reset() 5 years ago
Peter Kubica 772dad8805 ldap_exop - add PHP version requirement 5 years ago
Peter Kubica 51abe31f1a ldap_exop - fix issue #4992 5 years ago
Aleksander Machniak 3c760092a0 Merge branch 'johndoh-less_cleanup' 5 years ago
Aleksander Machniak 43e540f72f Elastic: Fix edit icon regression 5 years ago
Aleksander Machniak 5fb08eeb3f Elastic: Fix next/prev icons in toolbar 5 years ago
Aleksander Machniak 34ee036efc Merge branch 'less_cleanup' of https://github.com/johndoh/roundcubemail into johndoh-less_cleanup 5 years ago
Aleksander Machniak 5058d36581 Fix bug where next row wasn't selected after deleting a collapsed thread (#6655) 5 years ago
PhilW 98f0abf9dd fix css selector 5 years ago
Aleksander Machniak ad4ea7e62e Merge branch 'master' of github.com:roundcube/roundcubemail 5 years ago
Aleksander Machniak 950512dce1 Update changelog 5 years ago
Aleksander Machniak 0acb53cde6 Merge branch 'johndoh-adv_options' 5 years ago
Aleksander Machniak c0b9c222fc Merge branch 'adv_options' of https://github.com/johndoh/roundcubemail into johndoh-adv_options 5 years ago
dchisolm b0f7e4207c Parse abook entries more reliably (#6646)
* Update the squirrelmail_user_copy plugin to use the same method of parsing abook entries
as squirrelmail uses. If a user has entered something that has been quoted such as double quotes or pipes, this will parse the address book entry better than exploding on the pipe alone
* Noticed undefined variable $sig in convert charset
5 years ago
Aleksander Machniak b313295e45 Merge branch 'less_cleanup' of https://github.com/johndoh/roundcubemail into johndoh-less_cleanup 5 years ago
johndoh 8957f496db fix tiny typo (#6654) 5 years ago
PhilW 9543e6af7e remove some duplicate code in toolbar.less 5 years ago
Aleksander Machniak e3e9573391 Fix small issue when quota object does not specify 'title' 5 years ago
Thomas Bruederli 0c01dad398 Add margin to buttons inside alert boxes 5 years ago
Aleksander Machniak cc20de329d Elastic: Use Bootstrap's custom file input
... with localization and some js logic to display selected file(s) in the input.
5 years ago
Aleksander Machniak ede90c1f8c Elastic: Fix adding Cc/Bcc fields in Bounce dialog 5 years ago
Aleksander Machniak bca1397927 Fix links to Identities/Responses 5 years ago
PhilW fbc052e5df (Elastic) hide advanced settings sections 5 years ago
Aleksander Machniak e7816ccd36 Elastic: Keep original line wrapping in Message headers dialog 5 years ago
Aleksander Machniak 9b553aa2e0 Elastic: Improve "Mark all as read" dialog style (use .proplist) 5 years ago
Aleksander Machniak 147a2c8611 Elastic: Use appropriate icon for Mark button in "Mark all as read" dialog 5 years ago
Aleksander Machniak 553f83618e Elastic: Custom switch improvements 5 years ago
Aleksander Machniak 88c5507f29 Elastic: Replace .icon-checkbox with Bootstrap's custom switch 5 years ago
Aleksander Machniak 26bce22bff Fix bug when aborting dragging with ESC key didn't stop the move action (#6623)
+ small code improvements
+ focus the list on drag start to make sure it's focused state is up-to-date
  which is needed for proper keypress handling (e.g. ESC key on drag action)
5 years ago
Aleksander Machniak b2b39ade23 Bootstrap 4.3.1 5 years ago
Aleksander Machniak 2373aea95c Elastic: Add style for .part-notice elements (like e.g. .boxwarning) 5 years ago
Aleksander Machniak 167c9aee6f Update changelog 5 years ago
Aleksander Machniak 04fef18459 Merge branch 'mharjac-master' 5 years ago
Aleksander Machniak 7a4aed8320 Move common code to a function 5 years ago
Aleksander Machniak 79c1135052 Merge branch 'master' of https://github.com/mharjac/roundcubemail into mharjac-master 5 years ago
Athanasios Douitsis 2427b0967b Add icon for language selection form (#6624)
Trying to fix the appearance of the login-language selector for the new elastic theme.

This is a small addition which makes the login-language plugin present an icon, like the rest of the login form fields. I have also issued a request for the login form selector to drop the custom styles attribute: https://github.com/hassansin/roundcube-login-language/issues/11. These two (small) enhancements make the login form appear perfectly when the login-language plugin is used.

Here is the corrected result with these changes applied: https://imgur.com/a/5clC67e
5 years ago
Mario Harjac 136175e445 Fix missing CSRF token in message download (#6621) 5 years ago
Aleksander Machniak 641a67fe75 Elastic: Fix unintentional layout preference overwrite (#6613)
This is actually skin-independent mechanism that prevents overwriting
of skin-specific preferences by ajax requests (that until now were
not aware of skin config).
5 years ago
Aleksander Machniak 77fc589974 Fix regression where operator/comparator were not reset on submit (#6614) 5 years ago
johndoh d0c7e8d7c3 Remove favicon template object from template files (#6612) 5 years ago
Aleksander Machniak 43499432a5 Elastic: Fix height of select elements inside of composite fields
also make them pretty when added programatically.
5 years ago
Aleksander Machniak 9a757aa688 Keep meta and links together 5 years ago
Aleksander Machniak 9d51e40f9e Code cleanup 5 years ago
Aleksander Machniak 0492b1f6e5
HTML5 Upload Progress (#6177) (#6583)
Replaced all old upload progress code in favour of ajax upload progress.
Instead of posting a hidden iframe, we now use AJAX (as we did for drag-n-drop).
Removed code for old browsers. Now we support IE >= 10, Firefox > 4.
Upload progress may not work in some more, but support is quite good.
5 years ago
johndoh 8f62aed866 Create new meta and links template objects, replace favicon (#6611) 5 years ago
Aleksander Machniak fbdaab714b Merge branch 'master' of github.com:roundcube/roundcubemail 5 years ago
Aleksander Machniak c66199ffd2 Add cache busters also to images used by templates (#6610) 5 years ago
Aleksander Machniak db61f39e89 Add note about possible SELINUX issue (#6601) 5 years ago
Aleksander Machniak 6e74498656 Fix so mime_content_type check in Installer uses files that should always be available (i.e. from program/resources) (#6599) 5 years ago
Aleksander Machniak 74fe74bf7d Make "0.9 or newer" a default selection for db schema update box 5 years ago
Aleksander Machniak 1473522928 Keep .diff instead of .orig files 5 years ago
Aleksander Machniak b6a3df2824 Update to jQuery-MiniColors 2.3.4
Fixes color picker issue when using Roundcube in an iframe.
5 years ago
johndoh fa754c4ebc Elastic: remove hover effect on dropbuttons when primary action is disabled (#6597) 5 years ago
Aleksander Machniak 9fe46a4a9a Update to OpenPGP.js 4.4.6 5 years ago
Aleksander Machniak 834266c469 Elastic: Close popups when switching tabs 5 years ago
Aleksander Machniak 82974289b9 Fix typo 5 years ago
Aleksander Machniak 6dce805221 Improve last fix so it also remove temp file if Mail_Mime returned an error 5 years ago
Aleksander Machniak 1767b256e4 Fix bug where big messages could not be saved to imap folder in low memory mode 5 years ago
Aleksander Machniak fe5b4fd81d fputs() -> fwrite() 5 years ago
Aleksander Machniak d392e2d72a Elastic: Fix too small height of mailvelope mail preview frame (#6600) 5 years ago
Aleksander Machniak 0cd1e9d01b Merge branch 'johndoh-contact_selection' 5 years ago
Aleksander Machniak 82c495e6b4 PR cleanup 5 years ago
PhilW e5f5e6576d add some selection options to contacts list 5 years ago
Aleksander Machniak 99ad249f6d Elastic: Add title with full folder name on folders list elements
if displayed folder name is truncated because of overflow.
5 years ago
Aleksander Machniak db780a2db5 Fix small regression after last commit 5 years ago
Aleksander Machniak fe35b38c28 Managesieve: Fix bug where custom header or variable could be lost on form submission (#6594) 5 years ago
Aleksander Machniak e876e7b861 Add no-bs class to search form inputs
... so they don't get form-control assigned by Elastic logic
5 years ago
Aleksander Machniak 61eb78ad64 Fix so ANY record is not used for email domain validation, use A, MX, CNAME, AAAA instead (#6581) 5 years ago
Thomas Bruederli 3c6998d94e Slightly increase task menu width to better fit labels in other languages 5 years ago
Aleksander Machniak 823dc2eaac Fix PHP 7.2 compatibility in debug_logger plugin (#6586) 5 years ago
Victor Benincasa 2bf75060e9
Update DirectAdmin socket communication class to v. 3.0.2
Socket communication class from the official repository: http://files.directadmin.com/services/all/httpsocket/
5 years ago
Aleksander Machniak e69d1e7f04 Fix so max_message_size limit is checked also when forwarding messages as attachments (#6580) 5 years ago
Aleksander Machniak d7b510978e Fix regressions in attachment rename and attachment title attribute setting 5 years ago

@ -0,0 +1,30 @@
<?php
$config = array();
// Database configuration
$config['db_dsnw'] = 'sqlite:////tmp/sqlite.db?mode=0646';
// Test user credentials
$config['tests_username'] = 'test';
$config['tests_password'] = 'test';
// GreenMail
$config['smtp_port'] = 25;
// Settings required by the tests
$config['create_default_folders'] = true;
$config['skin'] = 'elastic';
$config['support_url'] = 'http://support.url';
// Plugins with tests
$config['plugins'] = [
'archive',
'attachment_reminder',
'markasjunk',
'zipdownload'
];
$config['archive_mbox'] = 'Archive';

@ -0,0 +1,22 @@
#!/bin/bash
# The script is intended for use on Travis with Trusty distribution
DIR=$(dirname $0)
# Enable xdebug for code coverage
if [ "$CODE_COVERAGE" != 1 ]; then phpenv config-rm xdebug.ini || true; fi
cd $DIR/..
cp composer.json-dist composer.json
# Add laravel/dusk for Browser tests
if [ "$BROWSER_TESTS" = 1 ]; then composer require "laravel/dusk:~5.9.1" --no-update; fi
# Remove qr-code as it requires php-gd which is not always available on Travis
# and we don't really need it for tests
composer remove endroid/qr-code --no-update
# Install PHP dependencies
composer install --prefer-dist

@ -0,0 +1,25 @@
#!/bin/bash
# The script is intended for use on Travis with Trusty distribution
# It executes unit and functional tests
DIR=$(dirname $0)
cd $DIR/..
if [ "$CODE_COVERAGE" = 1 ]
then
CODE_COVERAGE_ARGS="--coverage-text"
fi
vendor/bin/phpunit -c tests/phpunit.xml $CODE_COVERAGE_ARGS
if [ "$BROWSER_TESTS" = 1 ] && [ $? = 0 ]
then
.ci/setup.sh \
&& echo "TESTS_MODE: DESKTOP" \
&& TESTS_MODE=desktop vendor/bin/phpunit -c tests/Browser/phpunit.xml \
&& echo "TESTS_MODE: PHONE" \
&& TESTS_MODE=phone vendor/bin/phpunit -c tests/Browser/phpunit.xml \
&& echo "TESTS_MODE: TABLET" \
&& TESTS_MODE=tablet vendor/bin/phpunit -c tests/Browser/phpunit.xml
fi

@ -0,0 +1,30 @@
#!/bin/bash
# The script is intended for use on Travis with Trusty distribution
# It installs in-browser tests dependencies and prepares Roundcube instance
GMV=1.5.11
CHROMEVERSION=$(google-chrome-stable --version | tr -cd [:digit:]. | cut -d . -f 1)
GMARGS="-Dgreenmail.setup.all -Dgreenmail.users=test:test -Dgreenmail.startup.timeout=3000"
# Roundcube tests and instance configuration
cp .ci/config-test.inc.php config/config-test.inc.php
# Make temp and logs writeable
sudo chmod 777 temp logs
# Install javascript dependencies
bin/install-jsdeps.sh
# Compile Elastic's styles
lessc skins/elastic/styles/styles.less > skins/elastic/styles/styles.css
lessc skins/elastic/styles/print.less > skins/elastic/styles/print.css
lessc skins/elastic/styles/embed.less > skins/elastic/styles/embed.css
# Install proper WebDriver version for installed Chrome browser
php tests/Browser/install.php $CHROMEVERSION
# GreenMail server download, setup and start
wget https://repo1.maven.org/maven2/com/icegreen/greenmail-standalone/$GMV/greenmail-standalone-$GMV.jar \
&& (sudo java $GMARGS -jar greenmail-standalone-$GMV.jar &) \
&& sleep 5

@ -34,8 +34,8 @@ Options -Indexes
# Disable page indexing
Header set X-Robots-Tag "noindex, nofollow"
# replace 'append' with 'merge' for Apache version 2.2.9 and later
#Header append Cache-Control public env=!NO_CACHE
# replace 'merge' with 'append' for Apache < 2.2.9
#Header merge Cache-Control public env=!NO_CACHE
# Optional security headers
# Only provides increased security if the browser supports those features

@ -1,5 +1,6 @@
language: php
dist: trusty #
sudo: false
matrix:
@ -13,18 +14,24 @@ matrix:
env: CODE_COVERAGE=1
- php: 7.2
- php: 7.3
dist: bionic # for proper node-less version
env: BROWSER_TESTS=1
addons:
chrome: stable
apt:
packages:
- node-less
- php: 7.4
cache:
directories:
- $HOME/.composer
install:
- if [ "$CODE_COVERAGE" != 1 ]; then phpenv config-rm xdebug.ini || true; fi
- cp composer.json-dist composer.json
- composer install --prefer-dist
- .ci/install.sh
script:
- if [ "$CODE_COVERAGE" = 1 ]; then CODE_COVERAGE_ARGS="--coverage-text"; fi; vendor/bin/phpunit -c tests/phpunit.xml $CODE_COVERAGE_ARGS
- .ci/run.sh
notifications:
email: false

@ -33,6 +33,11 @@ file_filter = plugins/attachment_reminder/localization/<lang>.inc
source_file = plugins/attachment_reminder/localization/en_US.inc
source_lang = en_US
[roundcube-webmail.plugin-emoticons]
file_filter = plugins/emoticons/localization/<lang>.inc
source_file = plugins/emoticons/localization/en_US.inc
source_lang = en_US
[roundcube-webmail.plugin-enigma]
file_filter = plugins/enigma/localization/<lang>.inc
source_file = plugins/enigma/localization/en_US.inc

@ -1,6 +1,281 @@
CHANGELOG Roundcube Webmail
===========================
- Allow array in smtp_host config (#7296)
- Remove use of ext-iconv
- Support RFC8438: IMAP STATUS=SIZE - for faster folder size calculation (#7269)
- MySQL: Use utf8mb4 charset and utf8mb4_unicode_ci collation (#6535, #7113)
- Support for language codes up to 16 chars long (e.g. es-419) in database schema (#6851)
- Relaxed domain name validation for extended TLDs support (#5588)
- Allow opening application/octet-stream attachments according to filename extension (#6821)
- Added support for INSERT OR REPLACE queries (#6771)
- Allow skins to define which layout options they support (#7235)
- Extract RFC2231 attachment name from message headers (#6729, #6783)
- Archive: Added options to split archive by year or year+month and folder (#7216)
- Managesieve: Allow display name with email address in vacation :from field (#6760)
- Managesieve: Improve UX on custom header input (#7207)
- Managesieve: Fix bug where activation of forward/vacation rule could activate a wrong script (#7423)
- Managesieve: Fix bug where forward/vacation rule could end up being duplicated (#7349)
- Password: Added 'pwned' password strength driver (#7274)
- Add support for SameSite cookie attribute via session_samesite option (req PHP >= 7.3.0) (#6772)
- Elastic: Moving single recipients between recipient inputs with drag-n-drop (#5069)
- Elastic: Display a special icon for other users and shared namespace roots (#5012)
- Elastic: Support space-separated email addresses in recipient input (#6529, #6457)
- Change folders sorting so shared/other users namespaces are listed last (#5012)
- Display a warning and do not try to open empty attachments (#7332)
- Templates: Add support for expressions in object attributes (#7237)
- Templates: Add support for nested if conditions (#6818)
- Templates: Make [space][slash] ending of condition objects optional (#6954)
- Fix ISO-2022-JP-MS encoding issues (#7091)
- Fix so messages in threads with no root aren't displayed separately (#4999)
- Fix so anchor tags without href attribute are not modified (#7413)
- Fix bug where subfolders of special folders could have been duplicated on folder list
- Increase maximum size of contact jobtitle and department fields to 128 characters
- Fix missing newline after the logged line when writing to stdout (#7418)
- Elastic: Fix context menu (paste) on the recipient input (#7431)
- Fix problem with forwarding inline images attached to messages with no HTML part (#7414)
RELEASE 1.4.6
-------------
- Installer: Fix regression in SMTP test section (#7417)
RELEASE 1.4.5
-------------
- Fix bug in extracting required plugins from composer.json that led to spurious error in log (#7364)
- Fix so the database setup description is compatible with MySQL 8 (#7340)
- Markasjunk: Fix regression in jsevent driver (#7361)
- Fix missing flag indication on collapsed thread in Larry and Elastic (#7366)
- Fix default keyservers (use keys.openpgp.org), add note about CORS (#7373, #7367)
- Password: Fix issue with Modoboa driver (#7372)
- Mailvelope: Use sender's address to find pubkeys to check signatures (#7348)
- Mailvelope: Fix Encrypt button hidden in Elastic (#7353)
- Fix PHP warning: count(): Parameter must be an array or an object... in ID command handler (#7392)
- Fix error when user-configured skin does not exist anymore (#7271)
- Elastic: Fix aspect ratio of a contact photo in mail preview (#7339)
- Fix bug where PDF attachments marked as inline could have not been attached on mail forward (#7382)
- Security: Fix a couple of XSS issues in Installer (#7406)
- Security: Fix XSS issue in template object 'username' (#7406)
- Security: Better fix for CVE-2020-12641
- Security: Fix cross-site scripting (XSS) via malicious XML attachment
RELEASE 1.4.4
-------------
- Fix bug where attachments with Content-Id were attached to the message on reply (#7122)
- Fix identity selection on reply when both sender and recipient addresses are included in identities (#7211)
- Elastic: Fix text selection with Shift+PageUp and Shift+PageDown in plain text editor when using Chrome (#7230)
- Elastic: Fix recipient input bug when using click to select a contact from autocomplete list (#7231)
- Elastic: Fix color of a folder with recent messages (#7281)
- Elastic: Restrict logo size in print view (#7275)
- Fix invalid Content-Type for messages with only html part and inline images - Mail_Mime-1.10.7 (#7261)
- Fix missing contact display name in QR Code data (#7257)
- Fix so button label in Select image/media dialogs is "Close" not "Cancel" (#7246)
- Fix regression in testing database schema on MSSQL (#7227)
- Fix cursor position after inserting a group to a recipient input using autocompletion (#7267)
- Fix string literals handling in IMAP STATUS (and various other) responses (#7290)
- Fix bug where multiple images in a message were replaced by the first one on forward/reply/edit (#7293)
- Fix handling keyservers configured with protocol prefix (#7295)
- Markasjunk: Fix marking as spam/ham on moving messages with Move menu (#7189)
- Markasjunk: Fix bug where moving to Junk was failing on messages selected with Select > All (#7206)
- Fix so imap error message is displayed to the user on folder create/update (#7245)
- Fix bug where a special folder couldn't be created if a special-use flag is not supported (#7147)
- Mailvelope: Fix bug where recipients with name were not handled properly in mail compose (#7312)
- Fix characters encoding in group rename input after group creation/rename (#7330)
- Fix bug where some message/rfc822 parts could not be attached on forward (#7323)
- Make install-jsdeps.sh script working without the 'file' program installed (#7325)
- Fix performance issue of parsing big HTML messages by disabling HTML5 parser for these (#7331)
- Fix so Print button for PDF attachments works on Firefox >= 75 (#5125)
- Security: Fix XSS issue in handling of CDATA in HTML messages [CVE-2020-12625]
- Security: Fix remote code execution via crafted 'im_convert_path' or 'im_identify_path' settings [CVE-2020-12641]
- Security: Fix local file inclusion (and code execution) via crafted 'plugins' option [CVE-2020-12640]
- Security: Fix CSRF bypass that could be used to log out an authenticated user [CVE-2020-12626] (#7302)
RELEASE 1.4.3
-------------
- Enigma: Fix so key list selection is reset when opening key creation form (#7154)
- Enigma: Fix so using list checkbox selection does not load the key preview frame
- Enigma: Fix generation of key pairs for identities with IDN domains (#7181)
- Enigma: Display IDN domains of key users and identities in UTF8
- Enigma: Fix bug where "Send unencrypted" button didn't work in Elastic skin (#7205)
- Managesieve: Fix bug where it wasn't possible to save flag actions (#7188)
- Markasjunk: Fix bug where marking as spam/ham didn't work on moving messages with drag-and-drop (#7137)
- Password: Make chpass-wrapper.py Python 3 compatible (#7135)
- Elastic: Fix disappearing sidebar in mail compose after clicking Mail button
- Elastic: Fix incorrect aria-disabled attribute on Mail taskmenu button in mail compose
- Elastic: Fix bug where it was possible to switch editor mode when 'htmleditor' was in 'dont_override' (#7143)
- Elastic: Fix text selection in recipient inputs (#7129)
- Elastic: Fix missing Close button in "more recipients" dialog
- Elastic: Fix non-working folder subscription checkbox for newly added folders (#7174)
- Fix regression where "Open in new window" action didn't work (#7155)
- Fix PHP Warning: array_filter() expects parameter 1 to be array, null given in subscriptions_option plugin (#7165)
- Fix unexpected error message when mail refresh involves folder auto-unsubscribe (#6923)
- Fix recipient duplicates in print-view when the recipient list has been expanded (#7169)
- Fix bug where files in skins/ directory were listed on skins list (#7180)
- Fix bug where message parts with no Content-Disposition header and no name were not listed on attachments list (#7117)
- Fix display issues with mail subject that contains line-breaks (#7191)
- Fix invalid Content-Transfer-Encoding on multipart messages - Mail_Mime fix (#7170)
- Fix regression where using an absolute path to SQLite database file on Windows didn't work (#7196)
- Fix using unix:///path/to/socket.file in memcached driver (#7210)
RELEASE 1.4.2
-------------
- Add support for PHPUnit 6 and 7 (#6870)
- Plugin API: Make actionbefore, before<action>, actionafter and after<action> events working with plugin actions (#7106)
- Managesieve: Replace "Filter disabled" with "Filter enabled" (#7028)
- Managesieve: Fix so modifier type select wasn't hidden after hiding modifier select on header change
- Managesieve: Fix filter selection after removing a first filter (#7079)
- Markasjunk: Fix marking more than one message as spam/ham with email_learn driver (#7121)
- Password: Fix kpasswd and smb drivers' double-escaping bug (#7092)
- Enigma: Add script to import keys from filesystem to the db storage (for multihost)
- Installer: Fix DB Write test on SQLite database ("database is locked" error) (#7064)
- Installer: Fix so SQLite DSN with a relative path to the database file works in Installer
- Elastic: Fix contrast of warning toasts (#7058)
- Elastic: Simple search in pretty selects (#7072)
- Elastic: Fix hidden list widget on mobile/tablet when selecting folder while search menu is open (#7120)
- Fix so type attribute on script tags is not used on HTML5 pages (#6975)
- Fix unread count after purge on a folder that is not currently selected (#7051)
- Fix bug where Enter key didn't work on messages list in "List" layout (#7052)
- Fix bug where deleting a saved search in addressbook caused display issue on sources/groups list (#7061)
- Fix bug where a new saved search added after removing all searches wasn't added to the list (#7061)
- Fix bug where a new contact group added after removing all groups from addressbook wasn't added to the list
- Fix bug where Ctype extension wasn't required in Installer and INSTALL file (#7049)
- Fix so install-jsdeps.sh removes Bootstrap's sourceMappingURL (#7035)
- Fix so use of Ctrl+A does not scroll the list (#7020)
- Fix/remove useless keyup event handler on username input in logon form (#6970)
- Fix bug where cancelling switching from HTML to plain text didn't set the flag properly (#7077)
- Fix bug where HTML reply could add an empty line with extra indentation above the original message (#7088)
- Fix matching multiple X-Forwarded-For addresses with 'proxy_whitelist' (#7107)
- Fix so displayed maximum attachment size depends also on 'max_message_size' (#7105)
- Fix bug where 'skins_allowed' option didn't enforce user skin preference (#7080)
- Fix so contact's organization field accepts up to 128 characters (it was 50)
- Fix bug where listing tables in PostgreSQL database with db_prefix didn't work (#7093)
- Fix bug where 'text' attribute on body tag was ignored when displaying HTML message (#7109)
- Fix bug where next message wasn't displayed after delete in List mode (#7096)
- Fix so number of contacts in a group is not limited to 200 when redirecting to mail composer from Contacts (#6972)
- Fix malformed characters in HTML message with charset meta tag not in head (#7116)
RELEASE 1.4.1
-------------
- Elastic: Change HTML editor widget to improve form flow (#6992)
- Elastic: Fix position of mobile floating action button (#7038)
- Managesieve: Fix locked UI after opening filter frame (#7007)
- Fix PHP warning: "array_merge(): Expected parameter 2 to be an array, null given in sendmail.inc (#7003)
- Fix bug where cache keys could exceed length limit specified in db schema (#7004)
- Fix invalid Signature button state after escaping Mailvelope mode (#7015)
- Fix so 401 error is returned only on failed logon requests (#7010)
- Fix db_prefix handling in queries with `TRUNCATE TABLE <name>` and `UNIQUE <name>` (#7013)
- Fix so update.sh script warns about changed defaults (#7011)
- Fix tables listing routine when DSN contained a database with unsupported suffix (#7034)
- Fix so Elastic is also a default in jqueryui plugin (#7039)
- Fix bug where the Installer would not warn about required schema upgrade (#7042)
RELEASE 1.4.0
-------------
- Elastic: Resizeable columns (#6929)
- Elastic: Fix position and style of auto-complete dropdown on small screens (#6951)
- Elastic: Fix initial focus on recipients input in mail compose screen
- Elastic: Fix inserting responses at cursor position (#6971)
- Elastic: Fix unread filter icon and search state on folder change (#6978)
- Elastic: Fix regression where Encrypt button wasn't displayed in mail compose toolbar (#6982)
- Elastic: Fix regression where recipient input didn't update internal input state (#6988)
- Enigma: Fix bug where signing option was set to disabled after saving a draft in Elastic skin (#6515)
- Redis: Improve error handling and phpredis 5.X support (#6888)
- Archive: Fix bug where next email was not displayed after Archive button use (#6965)
- Archive: Fix missing Archive icon in folder selector popup in Elastic
- Fix bug where cache keys were not case-sensitive on MySQL/MSSQL (#6942)
- Fix so an error is logged when encryption fails (#6948)
- Fix bug where inline images could have been ignored if Content-Id header contained redundant spaces (#6980)
- Fix and document skin_logo setup (#6981)
RELEASE 1.4-rc2
---------------
- Update to jQuery 3.4.1
- Clarified 'address_book_type' option behavior (#6680)
- Added cookie mismatch detection, display an error message informing the user to clear cookies
- Renamed 'log_session' option to 'session_debug'
- Removed 'delete_always' option (#6782)
- Don't log full session identifiers in userlogins log (#6625)
- Support $HasAttachment/$HasNoAttachment keywords (#6201)
- Support PECL memcached extension as a session and cache storage driver (experimental)
- Switch to IDNA2008 variant (#6806)
- installto.sh: Add possibility to run the update even on the up-to-date installation (#6533)
- Plugin API: Add 'render_folder_selector' hook
- Added 'keyservers' option to define list of HKP servers for Enigma/Mailvelope (#6326)
- Added flag to disable server certificate validation via Mysql DSN argument (#6848)
- Select all records on the current list page with CTRL + A (#6813)
- Use Left/Right Arrow keys to faster move over threaded messages list (#6399)
- Changes in `display_next` setting (#6795):
- Move it to Preferences > User Interface > Main Options
- Make it apply to Contacts interface too
- Make it apply only if deleting/moving a previewed message/contact
- Redis: Support connection to unix socket
- Put charset meta specification before a title tag, add page title automatically (#6811)
- Elastic: Various internal refactorings
- Elastic: Add Prev/Next buttons on message page toolbar (#6648)
- Elastic: Close search options on Enter key press in quick-search input (#6660)
- Elastic: Changed some icons (#6852)
- Elastic: Changed read/unread icons (#6636)
- Elastic: Changed "Move to..." icon (#6637)
- Elastic: Add hide/show for advanced preferences (#6632)
- Elastic: Add default icon on Settings/Preferences lists for external plugins (#6814)
- Elastic: Add indicator for popover menu items that open a submenu (#6868)
- Elastic: Move compose attachments/options to the right side (#6839)
- Elastic: Add border/background to attachments list widget (#6842)
- Elastic: Add "Show unread messages" button to the search bar (#6587)
- Elastic: Fix bug where toolbar disappears on attachment menu use in Chrome (#6677)
- Elastic: Fix folders list scrolling on touch devices (#6706)
- Elastic: Fix non-working pretty selects in Chrome browser (#6705)
- Elastic: Fix issue with absolute positioned mail content (#6739)
- Elastic: Fix bug where some menu actions could cause a browser popup warning
- Elastic: Fix handling mailto: URL parameters in contact menu (#6751)
- Elastic: Fix keyboard navigation in some menus, e.g. the contact menu
- Elastic: Fix visual issue with long buttons in .boxwarning (#6797)
- Elastic: Fix handling new-line in text pasted to a recipient input
- Elastic: Fix so search is not reset when returning from the message preview page (#6847)
- Larry: Fix regression where menu actions didn't work with keyboard (#6740)
- ACL: Display user/group names (from ldap) instead of acl identifier
- Password: Added ldap_exop driver (#4992)
- Password: Added support for SSHA512 password algorithm (#6805)
- Managesieve: Fix bug where global includes were requested for vacation (#6716)
- Managesieve: Use RFC-compliant line endings, CRLF instead of LF (#6686)
- Managesieve: Fix so "Create filter" option does not show up when Filters menu is disabled (#6723)
- Enigma: For verified signatures, display the user id associated with the sender address (#5958)
- Enigma: Fix bug where revoked users/keys were not greyed out in key info
- Enigma: Fix error message when trying to encrypt with a revoked key (#6607)
- Enigma: Fix "decryption oracle" bug [CVE-2019-10740] (#6638)
- Enigma: Fix bug where signature verification could have been skipped for some message structures (#6838)
- Fix language selection for spellchecker in html mode (#6915)
- Fix css styles leak from replied/forwarded message to the rest of the composed text (#6831)
- Fix invalid path to "add contact" icon when using assets_path setting
- Fix invalid path to blocked.gif when using assets_path setting (#6752)
- Fix so advanced search dialog is not automatically displayed on searchonly addressbooks (#6679)
- Fix so an error is logged when more than one attachment plugin has been enabled, initialize the first one (#6735)
- Fix bug where flag change could have been passed to a preview frame when not expected
- Fix bug in HTML parser that could cause missing text fragments when there was no head/body tag (#6713)
- Fix bug where HTML messages with a xml:namespace tag were not rendered (#6697)
- Fix TinyMCE download location (#6694)
- Fix so "Open in new window" consistently displays "external window" interface (#6659)
- Fix bug where next row wasn't selected after deleting a collapsed thread (#6655)
- Fix bug where external content (e.g. mail body) was passed to templates parsing code (#6640)
- Fix bug where attachment preview didn't work with x_frame_options=deny (#6688)
- Fix so bin/install-jsdeps.sh returns error code on error (#6704)
- Fix bug where bmp images couldn't be displayed on some systems (#6728)
- Fix bug in parsing vCard data using PHP 7.3 due to an invalid regexp (#6744)
- Fix bug where bold/strong text was converted to upper-case on html-to-text conversion (6758)
- Fix bug in rcube_utils::parse_hosts() where %t, %d, %z could return only tld (#6746)
- Fix bug where Next/Prev button in mail view didn't work with multi-folder search result (#6793)
- Fix bug where selection of columns on messages list wasn't working
- Fix bug in converting multi-page Tiff images to Jpeg (#6824)
- Fix bug where handling multiple messages from multi-folder search result could not work (#6845)
- Fix bug where unread count wasn't updated after moving multi-folder result (#6846)
- Fix wrong messages order after returning to a multi-folder search result (#6836)
- Fix some PHP 7.4 compat. issues (#6884, #6866)
- Fix bug where it was possible to bypass the position:fixed CSS check in received messages (#6898)
- Fix bug where some strict remote URIs in url() style were unintentionally blocked (#6899)
- Fix bug where it was possible to bypass the CSS jail in HTML messages using :root pseudo-class (#6897)
- Fix bug where it was possible to bypass href URI check with data:application/xhtml+xml URIs (#6896)
RELEASE 1.4-rc1
---------------
- Changed 'password_charset' default to 'UTF-8' (#6522)
- Add skins_allowed option (#6483)
- SMTP GSSAPI support via krb_authentication plugin (#6417)
@ -9,16 +284,20 @@ CHANGELOG Roundcube Webmail
- Use constant prefix for temp file names, don't remove temp files from other apps (#6511)
- Ignore 'Sender' header on Reply-All action (#6506)
- deluser.sh: Add option to delete users who have not logged in for more than X days (#6340)
- HTML5 Upload Progress - as a replacement for the old server-side solution (#6177)
- Update to TinyMCE 4.8.2
- Update to jQuery-MiniColors 2.3.4
- Prevent from using deprecated timezone names from jsTimezoneDetect
- Force session.gc_probability=1 when using custom session handlers (#6560)
- Support simple field labels (e.g. LetterHub examples) in csv imports (#6541)
- Add cache busters also to images used by templates (#6610)
- Plugin API: Added 'raise_error' hook (#6199)
- Plugin API: Added 'common_headers' hook (#6385)
- Plugin API: Added 'ldap_connected' hook
- Enigma: Update to OpenPGPjs 4.2.1 - fixes user name encoding issues in key generation (#6524)
- Enigma: Fixed multi-host synchronization of private and deleted keys and pubring.kbx file
- Managesieve: Added support for 'editheader' extension - RFC5293 (#5954)
- Managesieve: Fix bug where custom header or variable could be lost on form submission (#6594)
- Markasjunk: Integrate markasjunk2 features into markasjunk - marking as non-junk + learning engine (#6504)
- Password: Added 'modoboa' driver (#6361)
- Password: Fix bug where password_dovecotpw_with_method setting could be ignored (#6436)
@ -38,8 +317,14 @@ CHANGELOG Roundcube Webmail
- Elastic: Support new-line char as a separator for pasted recipients (#6460)
- Elastic: Improved UX of search dialogs (#6416)
- Elastic: Fix unwanted thread expanding when selecting a collapsed thread in non-mobile mode (#6445)
- Elastic: Fix too small height of mailvelope mail preview frame (#6600)
- Elastic: Add "status bar" for mobile in mail composer
- Elastic: Add selection options on contacts list (#6595)
- Elastic: Fix unintentional layout preference overwrite (#6613)
- Elastic: Fix bug where Enigma options in mail compose could sometimes be ignored (#6515)
- Log errors caused by low pcre.backtrack_limit when sending a mail message (#6433)
- Fix regression where drafts were not deleted after sending the message (#6756)
- Fix so max_message_size limit is checked also when forwarding messages as attachments (#6580)
- Fix so performance stats are logged to the main console log also when per_user_logging=true
- Fix malformed message saved into Sent folder when using big attachments and low memory limit (#6498)
- Fix incorrect IMAP SASL GSSAPI negotiation (#6308)
@ -54,6 +339,11 @@ CHANGELOG Roundcube Webmail
- Fix dummy Message-Id when resuming a draft without Message-Id header (#6548)
- Fix handling of empty entries in vCard import (#6564)
- Fix bug in parsing some IMAP command responses that include unsolicited replies (#6577)
- Fix PHP 7.2 compatibility in debug_logger plugin (#6586)
- Fix so ANY record is not used for email domain validation, use A, MX, CNAME, AAAA instead (#6581)
- Fix so mime_content_type check in Installer uses files that should always be available (i.e. from program/resources) (#6599)
- Fix missing CSRF token on a link to download too-big message part (#6621)
- Fix bug when aborting dragging with ESC key didn't stop the move action (#6623)
RELEASE 1.4-beta
----------------

@ -12,9 +12,9 @@ REQUIREMENTS
* An IMAP, HTTP and SMTP server
* .htaccess support allowing overrides for DirectoryIndex
* PHP Version 5.4 or greater including:
- PCRE, DOM, JSON, Session, Sockets, OpenSSL, Mbstring (required)
- PCRE, DOM, JSON, Session, Sockets, OpenSSL, Mbstring, Filter, Ctype (required)
- PHP PDO with driver for either MySQL, PostgreSQL, SQL Server, Oracle or SQLite (required)
- Iconv, Zip, Fileinfo, Intl, Exif (recommended)
- Zip, Fileinfo, Intl, Exif (recommended)
- LDAP for LDAP addressbook support (optional)
- GD, Imagick (optional thumbnails generation, QR-code)
* PEAR and PEAR packages distributed with Roundcube or external:
@ -26,6 +26,8 @@ REQUIREMENTS
- Net_Sieve 1.4.3 or newer (for managesieve plugin)
- Crypt_GPG 1.6.3 or newer (for enigma plugin)
- Endroid/QrCode 1.6.0 or newer (https://github.com/endroid/QrCode)
- Kolab/Net_LDAP3 1.0.6 or newer (for LDAP addressbook)
- Masterminds/HTML5 2.5.x (optional HTML parser)
* php.ini options:
- error_reporting E_ALL & ~E_NOTICE & ~E_STRICT
- memory_limit > 16MB
@ -42,7 +44,9 @@ REQUIREMENTS
INSTALLATION
============
1. Decompress and put this folder somewhere inside your document root
1. Decompress and put this folder somewhere inside your document root.
Note: Make sure files have proper owner/group for your setup. If you use
tar command `--no-same-owner` option might be helpful.
2. In case you don't use the so-called "complete" release package,
you have to install PHP and javascript dependencies.
2.1. Install PHP dependencies using composer:
@ -61,7 +65,11 @@ INSTALLATION
5. Point your browser to http://url-to-roundcube/installer/
6. Follow the instructions of the install script (or see MANUAL CONFIGURATION)
7. After creating and testing the configuration, remove the installer directory
8. If you use git sources compile css files for the Elastic skin:
------------------------------------------
IMPORTANT: REMOVE THE INSTALLER DIRECTORY!
------------------------------------------
8. If you use git sources compile css files for the Elastic skin (required
lessc >= 1.5.0):
$ cd skins/elastic
$ lessc -x styles/styles.less > styles/styles.css
$ lessc -x styles/print.less > styles/print.css
@ -75,7 +83,7 @@ CONFIGURATION HINTS
IMPORTANT! Read all comments in defaults.inc.php, understand them
and configure your installation to be not surprised by default behaviour.
Roundcube writes internal errors to the 'errors' log file located in the logs
Roundcube writes internal errors to the 'errors.log' log file located in the logs
directory which can be configured in config/config.inc.php. If you want ordinary
PHP errors to be logged there as well, set error_log in php.ini or .htaccess file.
@ -101,9 +109,9 @@ importing the table layout and granting the proper permissions to the
roundcube user. Here is an example of that procedure:
# mysql
> CREATE DATABASE roundcubemail /*!40101 CHARACTER SET utf8 COLLATE utf8_general_ci */;
> GRANT ALL PRIVILEGES ON roundcubemail.* TO roundcube@localhost
IDENTIFIED BY 'password';
> CREATE DATABASE roundcubemail CHARACTER SET utf8 COLLATE utf8_general_ci;
> CREATE USER roundcube@localhost IDENTIFIED BY 'password';
> GRANT ALL PRIVILEGES ON roundcubemail.* TO roundcube@localhost;
> quit
# mysql roundcubemail < SQL/mysql.initial.sql
@ -112,6 +120,11 @@ Note 1: 'password' is the master password for the roundcube user. It is strongly
recommended you replace this with a more secure password. Please keep in
mind: You need to specify this password later in 'config/db.inc.php'.
Note 2: When using MySQL < 5.7.7 or MariaDB < 10.2.2 it is required to configure
the database engine with:
innodb_large_prefix=true
innodb_file_format=Barracuda
* SQLite
--------
@ -242,11 +255,6 @@ To enable these features in apache the following modules need to be enabled:
The optimisation is already included in the .htaccess file in the top
directory of your installation.
If you are using Apache version 2.2.9 and later, in the .htaccess file
change the 'append' word to 'merge' for a more correct response. Keeping
as 'append' shouldn't cause any problems though changing to merge will
eliminate the possibility of duplicate 'public' headers in Cache-control.
Lighttpd:
---------
With Lightty the addition of Expire: tags by mod_expire is incompatible with
@ -288,3 +296,20 @@ PHP >= 5.6 validates the ssl certificates by default. It means that
if IMAP/SMTP certificates are self-signed or use wrong host name you'll get
connection errors. A solution in such cases is to set imap_conn_options,
smtp_conn_options and managesieve_conn_options in a way described in config/defaults.inc.php.
If you have problems with temp files or non-working logs make sure temp and logs folders
are writeable to the user used by http server. Access to them may also be blocked by
SELINUX. Here's some sample commands for SELINUX:
$ semanage fcontext -a -t httpd_sys_rw_content_t "/path_to_roundcube/logs(/.*)?"
$ semanage fcontext -a -t httpd_sys_rw_content_t "/path_to_roundcube/temp(/.*)?"
$ restorecon -Rv /path_to_roundcube/
Microsoft IIS Server by default does not support WOFF fonts used in Elastic skin. It might be
needed to add following MIME Types definitions (via web.config or IIS Manager):
.woff application/font-woff
.woff2 application/font-woff2
When installing on Windows be aware we're using symbolic links which may need an additional
attention. See https://github.com/roundcube/roundcubemail/issues/7151.

@ -19,17 +19,11 @@ application-like user interface. It provides full functionality you expect
from an email client, including MIME support, address book, folder management,
message searching and spell checking. Roundcube Webmail is written in PHP and
requires the MySQL, PostgreSQL or SQLite database. With its plugin API it is
easily extendable and the user interface is fully customizable using skins
which are pure XHTML and CSS 2.
easily extendable and the user interface is fully customizable using skins.
The code is mainly written in PHP and is designed to run on a webserver.
It includes other open-source classes/libraries from [PEAR][pear],
an IMAP library derived from [IlohaMail][iloha] the [TinyMCE][tinymce] rich
text editor, [Googiespell][googiespell] (archive) library for spell checking or
the [HTML5-PHP][html5-php] sanitizer by Masterminds.
The current default skin 'Larry' was kindly created by FLINT / Büro für
Gestaltung, Berne, Switzerland.
The code designed to run on a webserver is mainly written in PHP and Javascript.
It includes a custom framework with an IMAP library derived from [IlohaMail][iloha]
and requires a set of external libraries (see composer.json and jsdeps.json files).
INSTALLATION
@ -49,7 +43,7 @@ support from there. This currently includes:
- Chrome: (Current - 1) and Current
- Edge: (Current - 1) and Current
- Firefox: (Current - 1) and Current, ESR
- Internet Explorer: 9+
- Internet Explorer: 9+ (11+ for the Elastic skin)
- Safari: (Current - 1) and Current
- Opera: Current
@ -102,11 +96,7 @@ You're always welcome to send a message to the project admin:
hello(at)roundcube(dot)net
[pear]: https://pear.php.net/
[iloha]: https://sourceforge.net/projects/ilohamail/
[tinymce]: https://www.tiny.cloud/
[googiespell]: https://web.archive.org/web/20170314162746/orangoo.com/labs/GoogieSpell/
[html5-php]: https://github.com/Masterminds/html5-php
[gpl]: https://www.gnu.org/licenses/
[license]: https://roundcube.net/license
[contrib]: https://roundcube.net/contribute

@ -1,13 +1,13 @@
CREATE TABLE [dbo].[cache] (
[user_id] [int] NOT NULL ,
[cache_key] [varchar] (128) COLLATE Latin1_General_CI_AI NOT NULL ,
[cache_key] [varchar] (128) COLLATE Latin1_General_CS_AS NOT NULL ,
[expires] [datetime] NULL ,
[data] [text] COLLATE Latin1_General_CI_AI NOT NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO
CREATE TABLE [dbo].[cache_shared] (
[cache_key] [varchar] (255) COLLATE Latin1_General_CI_AI NOT NULL ,
[cache_key] [varchar] (255) COLLATE Latin1_General_CS_AS NOT NULL ,
[expires] [datetime] NULL ,
[data] [text] COLLATE Latin1_General_CI_AI NOT NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
@ -15,7 +15,7 @@ GO
CREATE TABLE [dbo].[cache_index] (
[user_id] [int] NOT NULL ,
[mailbox] [varchar] (128) COLLATE Latin1_General_CI_AI NOT NULL ,
[mailbox] [varchar] (128) COLLATE Latin1_General_CS_AS NOT NULL ,
[expires] [datetime] NULL ,
[valid] [char] (1) COLLATE Latin1_General_CI_AI NOT NULL ,
[data] [text] COLLATE Latin1_General_CI_AI NOT NULL
@ -24,7 +24,7 @@ GO
CREATE TABLE [dbo].[cache_thread] (
[user_id] [int] NOT NULL ,
[mailbox] [varchar] (128) COLLATE Latin1_General_CI_AI NOT NULL ,
[mailbox] [varchar] (128) COLLATE Latin1_General_CS_AS NOT NULL ,
[expires] [datetime] NULL ,
[data] [text] COLLATE Latin1_General_CI_AI NOT NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
@ -32,7 +32,7 @@ GO
CREATE TABLE [dbo].[cache_messages] (
[user_id] [int] NOT NULL ,
[mailbox] [varchar] (128) COLLATE Latin1_General_CI_AI NOT NULL ,
[mailbox] [varchar] (128) COLLATE Latin1_General_CS_AS NOT NULL ,
[uid] [int] NOT NULL ,
[expires] [datetime] NULL ,
[data] [text] COLLATE Latin1_General_CI_AI NOT NULL ,
@ -96,20 +96,20 @@ GO
CREATE TABLE [dbo].[users] (
[user_id] [int] IDENTITY (1, 1) NOT NULL ,
[username] [varchar] (128) COLLATE Latin1_General_CI_AI NOT NULL ,
[username] [varchar] (128) COLLATE Latin1_General_CS_AS NOT NULL ,
[mail_host] [varchar] (128) COLLATE Latin1_General_CI_AI NOT NULL ,
[created] [datetime] NOT NULL ,
[last_login] [datetime] NULL ,
[failed_login] [datetime] NULL ,
[failed_login_counter] [int] NULL ,
[language] [varchar] (5) COLLATE Latin1_General_CI_AI NULL ,
[language] [varchar] (16) COLLATE Latin1_General_CI_AI NULL ,
[preferences] [text] COLLATE Latin1_General_CI_AI NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO
CREATE TABLE [dbo].[dictionary] (
[user_id] [int] ,
[language] [varchar] (5) COLLATE Latin1_General_CI_AI NOT NULL ,
[language] [varchar] (16) COLLATE Latin1_General_CI_AI NOT NULL ,
[data] [text] COLLATE Latin1_General_CI_AI NOT NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO
@ -422,6 +422,6 @@ CREATE TRIGGER [contact_delete_member] ON [dbo].[contacts]
WHERE [contact_id] IN (SELECT [contact_id] FROM deleted)
GO
INSERT INTO [dbo].[system] ([name], [value]) VALUES ('roundcube-version', '2018122300')
INSERT INTO [dbo].[system] ([name], [value]) VALUES ('roundcube-version', '2020020101')
GO

@ -0,0 +1,18 @@
ALTER TABLE [dbo].[cache] ALTER COLUMN
[cache_key] [varchar] (128) COLLATE Latin1_General_CS_AS NOT NULL
GO
ALTER TABLE [dbo].[cache_shared] ALTER COLUMN
[cache_key] [varchar] (255) COLLATE Latin1_General_CS_AS NOT NULL
GO
ALTER TABLE [dbo].[cache_index] ALTER COLUMN
[mailbox] [varchar] (128) COLLATE Latin1_General_CS_AS NOT NULL
GO
ALTER TABLE [dbo].[cache_messages] ALTER COLUMN
[mailbox] [varchar] (128) COLLATE Latin1_General_CS_AS NOT NULL
GO
ALTER TABLE [dbo].[cache_thread] ALTER COLUMN
[mailbox] [varchar] (128) COLLATE Latin1_General_CS_AS NOT NULL
GO
ALTER TABLE [dbo].[users] ALTER COLUMN
[username] [varchar] (128) COLLATE Latin1_General_CS_AS NOT NULL
GO

@ -0,0 +1,4 @@
ALTER TABLE [dbo].[users] ALTER COLUMN [language] [varchar] (16) COLLATE Latin1_General_CI_AI NULL
GO
ALTER TABLE [dbo].[dictionary] ALTER COLUMN [language] [varchar] (16) COLLATE Latin1_General_CI_AI NOT NULL
GO

@ -12,7 +12,7 @@ CREATE TABLE `session` (
`vars` mediumtext NOT NULL,
PRIMARY KEY(`sess_id`),
INDEX `changed_index` (`changed`)
) /*!40000 ENGINE=INNODB */ /*!40101 CHARACTER SET utf8 COLLATE utf8_general_ci */;
) /*!40000 ENGINE=INNODB */ /*!40101 CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci */;
-- Table structure for table `users`
@ -25,36 +25,36 @@ CREATE TABLE `users` (
`last_login` datetime DEFAULT NULL,
`failed_login` datetime DEFAULT NULL,
`failed_login_counter` int(10) UNSIGNED DEFAULT NULL,
`language` varchar(5),
`language` varchar(16),
`preferences` longtext,
PRIMARY KEY(`user_id`),
UNIQUE `username` (`username`, `mail_host`)
) /*!40000 ENGINE=INNODB */ /*!40101 CHARACTER SET utf8 COLLATE utf8_general_ci */;
) /*!40000 ENGINE=INNODB */ /*!40101 CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci */;
-- Table structure for table `cache`
CREATE TABLE `cache` (
`user_id` int(10) UNSIGNED NOT NULL,
`cache_key` varchar(128) /*!40101 CHARACTER SET ascii COLLATE ascii_general_ci */ NOT NULL,
`cache_key` varchar(128) BINARY NOT NULL,
`expires` datetime DEFAULT NULL,
`data` longtext NOT NULL,
PRIMARY KEY (`user_id`, `cache_key`),
CONSTRAINT `user_id_fk_cache` FOREIGN KEY (`user_id`)
REFERENCES `users`(`user_id`) ON DELETE CASCADE ON UPDATE CASCADE,
INDEX `expires_index` (`expires`)
) /*!40000 ENGINE=INNODB */ /*!40101 CHARACTER SET utf8 COLLATE utf8_general_ci */;
) /*!40000 ENGINE=INNODB */ /*!40101 CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci */;
-- Table structure for table `cache_shared`
CREATE TABLE `cache_shared` (
`cache_key` varchar(255) /*!40101 CHARACTER SET ascii COLLATE ascii_general_ci */ NOT NULL,
`cache_key` varchar(255) BINARY NOT NULL,
`expires` datetime DEFAULT NULL,
`data` longtext NOT NULL,
PRIMARY KEY (`cache_key`),
INDEX `expires_index` (`expires`)
) /*!40000 ENGINE=INNODB */ /*!40101 CHARACTER SET utf8 COLLATE utf8_general_ci */;
) /*!40000 ENGINE=INNODB */ /*!40101 CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci */;
-- Table structure for table `cache_index`
@ -69,7 +69,7 @@ CREATE TABLE `cache_index` (
REFERENCES `users`(`user_id`) ON DELETE CASCADE ON UPDATE CASCADE,
INDEX `expires_index` (`expires`),
PRIMARY KEY (`user_id`, `mailbox`)
) /*!40000 ENGINE=INNODB */ /*!40101 CHARACTER SET utf8 COLLATE utf8_general_ci */;
) /*!40000 ENGINE=INNODB */ /*!40101 CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci */;
-- Table structure for table `cache_thread`
@ -83,7 +83,7 @@ CREATE TABLE `cache_thread` (
REFERENCES `users`(`user_id`) ON DELETE CASCADE ON UPDATE CASCADE,
INDEX `expires_index` (`expires`),
PRIMARY KEY (`user_id`, `mailbox`)
) /*!40000 ENGINE=INNODB */ /*!40101 CHARACTER SET utf8 COLLATE utf8_general_ci */;
) /*!40000 ENGINE=INNODB */ /*!40101 CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci */;
-- Table structure for table `cache_messages`
@ -99,7 +99,7 @@ CREATE TABLE `cache_messages` (
REFERENCES `users`(`user_id`) ON DELETE CASCADE ON UPDATE CASCADE,
INDEX `expires_index` (`expires`),
PRIMARY KEY (`user_id`, `mailbox`, `uid`)
) /*!40000 ENGINE=INNODB */ /*!40101 CHARACTER SET utf8 COLLATE utf8_general_ci */;
) /*!40000 ENGINE=INNODB */ /*!40101 CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci */;
-- Table structure for table `contacts`
@ -119,7 +119,7 @@ CREATE TABLE `contacts` (
CONSTRAINT `user_id_fk_contacts` FOREIGN KEY (`user_id`)
REFERENCES `users`(`user_id`) ON DELETE CASCADE ON UPDATE CASCADE,
INDEX `user_contacts_index` (`user_id`,`del`)
) /*!40000 ENGINE=INNODB */ /*!40101 CHARACTER SET utf8 COLLATE utf8_general_ci */;
) /*!40000 ENGINE=INNODB */ /*!40101 CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci */;
-- Table structure for table `contactgroups`
@ -133,7 +133,7 @@ CREATE TABLE `contactgroups` (
CONSTRAINT `user_id_fk_contactgroups` FOREIGN KEY (`user_id`)
REFERENCES `users`(`user_id`) ON DELETE CASCADE ON UPDATE CASCADE,
INDEX `contactgroups_user_index` (`user_id`,`del`)
) /*!40000 ENGINE=INNODB */ /*!40101 CHARACTER SET utf8 COLLATE utf8_general_ci */;
) /*!40000 ENGINE=INNODB */ /*!40101 CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci */;
CREATE TABLE `contactgroupmembers` (
`contactgroup_id` int(10) UNSIGNED NOT NULL,
@ -168,7 +168,7 @@ CREATE TABLE `identities` (
REFERENCES `users`(`user_id`) ON DELETE CASCADE ON UPDATE CASCADE,
INDEX `user_identities_index` (`user_id`, `del`),
INDEX `email_identities_index` (`email`, `del`)
) /*!40000 ENGINE=INNODB */ /*!40101 CHARACTER SET utf8 COLLATE utf8_general_ci */;
) /*!40000 ENGINE=INNODB */ /*!40101 CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci */;
-- Table structure for table `dictionary`
@ -176,12 +176,12 @@ CREATE TABLE `identities` (
CREATE TABLE `dictionary` (
`id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, -- redundant, for compat. with Galera Cluster
`user_id` int(10) UNSIGNED DEFAULT NULL, -- NULL here is for "shared dictionaries"
`language` varchar(5) NOT NULL,
`language` varchar(16) NOT NULL,
`data` longtext NOT NULL,
CONSTRAINT `user_id_fk_dictionary` FOREIGN KEY (`user_id`)
REFERENCES `users`(`user_id`) ON DELETE CASCADE ON UPDATE CASCADE,
UNIQUE `uniqueness` (`user_id`, `language`)
) /*!40000 ENGINE=INNODB */ /*!40101 CHARACTER SET utf8 COLLATE utf8_general_ci */;
) /*!40000 ENGINE=INNODB */ /*!40101 CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci */;
-- Table structure for table `searches`
@ -196,7 +196,7 @@ CREATE TABLE `searches` (
CONSTRAINT `user_id_fk_searches` FOREIGN KEY (`user_id`)
REFERENCES `users`(`user_id`) ON DELETE CASCADE ON UPDATE CASCADE,
UNIQUE `uniqueness` (`user_id`, `type`, `name`)
) /*!40000 ENGINE=INNODB */ /*!40101 CHARACTER SET utf8 COLLATE utf8_general_ci */;
) /*!40000 ENGINE=INNODB */ /*!40101 CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci */;
-- Table structure for table `filestore`
@ -211,7 +211,7 @@ CREATE TABLE `filestore` (
CONSTRAINT `user_id_fk_filestore` FOREIGN KEY (`user_id`)
REFERENCES `users` (`user_id`) ON DELETE CASCADE ON UPDATE CASCADE,
UNIQUE `uniqueness` (`user_id`, `context`, `filename`)
);
) /*!40000 ENGINE=INNODB */ /*!40101 CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci */;
-- Table structure for table `system`
@ -219,8 +219,8 @@ CREATE TABLE `system` (
`name` varchar(64) NOT NULL,
`value` mediumtext,
PRIMARY KEY(`name`)
) /*!40000 ENGINE=INNODB */ /*!40101 CHARACTER SET utf8 COLLATE utf8_general_ci */;
) /*!40000 ENGINE=INNODB */ /*!40101 CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci */;
/*!40014 SET FOREIGN_KEY_CHECKS=1 */;
INSERT INTO `system` (`name`, `value`) VALUES ('roundcube-version', '2018122300');
INSERT INTO `system` (`name`, `value`) VALUES ('roundcube-version', '2020020101');

@ -8,4 +8,4 @@ CREATE TABLE `filestore` (
CONSTRAINT `user_id_fk_filestore` FOREIGN KEY (`user_id`)
REFERENCES `users` (`user_id`) ON DELETE CASCADE ON UPDATE CASCADE,
UNIQUE `uniqueness` (`user_id`, `filename`)
);
) /*!40000 ENGINE=INNODB */ /*!40101 CHARACTER SET utf8 COLLATE utf8_general_ci */;

@ -0,0 +1,2 @@
ALTER TABLE `cache` CHANGE `cache_key` `cache_key` varchar(128) BINARY NOT NULL;
ALTER TABLE `cache_shared` CHANGE `cache_key` `cache_key` varchar(255) BINARY NOT NULL;

@ -0,0 +1,2 @@
ALTER TABLE `users` MODIFY `language` varchar(16);
ALTER TABLE `dictionary` MODIFY `language` varchar(16) NOT NULL;

@ -0,0 +1,21 @@
ALTER TABLE `session` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE `users` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE `cache` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE `cache_shared` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE `cache_index` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE `cache_thread` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE `cache_messages` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE `contacts` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE `contactgroups` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE `identities` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE `dictionary` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE `searches` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE `filestore` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE `system` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE `users` CHANGE `username` `username` varchar(128) BINARY NOT NULL;
ALTER TABLE `cache` CHANGE `cache_key` `cache_key` varchar(128) BINARY NOT NULL;
ALTER TABLE `cache_shared` CHANGE `cache_key` `cache_key` varchar(255) BINARY NOT NULL;
ALTER TABLE `cache_index` CHANGE `mailbox` `mailbox` varchar(255) BINARY NOT NULL;
ALTER TABLE `cache_thread` CHANGE `mailbox` `mailbox` varchar(255) BINARY NOT NULL;
ALTER TABLE `cache_messages` CHANGE `mailbox` `mailbox` varchar(255) BINARY NOT NULL;

@ -9,7 +9,7 @@ CREATE TABLE "users" (
"last_login" timestamp with time zone DEFAULT NULL,
"failed_login" timestamp with time zone DEFAULT NULL,
"failed_login_counter" integer DEFAULT NULL,
"language" varchar(5),
"language" varchar(16),
"preferences" long DEFAULT NULL,
CONSTRAINT "users_username_key" UNIQUE ("username", "mail_host")
);
@ -186,7 +186,7 @@ CREATE INDEX "cache_messages_expires_idx" ON "cache_messages" ("expires");
CREATE TABLE "dictionary" (
"user_id" integer DEFAULT NULL
REFERENCES "users" ("user_id") ON DELETE CASCADE,
"language" varchar(5) NOT NULL,
"language" varchar(16) NOT NULL,
"data" long DEFAULT NULL,
CONSTRAINT "dictionary_user_id_lang_key" UNIQUE ("user_id", "language")
);
@ -238,4 +238,4 @@ CREATE TABLE "system" (
"value" long
);
INSERT INTO "system" ("name", "value") VALUES ('roundcube-version', '2018122300');
INSERT INTO "system" ("name", "value") VALUES ('roundcube-version', '2020020101');

@ -0,0 +1,2 @@
ALTER TABLE "users" MODIFY "language" varchar(16) NOT NULL;
ALTER TABLE "dictionary" MODIFY "language" varchar(16);

@ -24,7 +24,7 @@ CREATE TABLE users (
last_login timestamp with time zone DEFAULT NULL,
failed_login timestamp with time zone DEFAULT NULL,
failed_login_counter integer DEFAULT NULL,
"language" varchar(5),
"language" varchar(16),
preferences text DEFAULT ''::text NOT NULL,
CONSTRAINT users_username_key UNIQUE (username, mail_host)
);
@ -246,7 +246,7 @@ CREATE INDEX cache_messages_expires_idx ON cache_messages (expires);
CREATE TABLE dictionary (
user_id integer DEFAULT NULL
REFERENCES users (user_id) ON DELETE CASCADE ON UPDATE CASCADE,
"language" varchar(5) NOT NULL,
"language" varchar(16) NOT NULL,
data text NOT NULL,
CONSTRAINT dictionary_user_id_language_key UNIQUE (user_id, "language")
);
@ -314,4 +314,4 @@ CREATE TABLE "system" (
value text
);
INSERT INTO "system" (name, value) VALUES ('roundcube-version', '2018122300');
INSERT INTO "system" (name, value) VALUES ('roundcube-version', '2020020101');

@ -0,0 +1,2 @@
ALTER TABLE "dictionary" ALTER COLUMN "language" TYPE varchar(16);
ALTER TABLE "users" ALTER COLUMN "language" TYPE varchar(16);

@ -74,7 +74,7 @@ CREATE TABLE users (
last_login datetime DEFAULT NULL,
failed_login datetime DEFAULT NULL,
failed_login_counter integer DEFAULT NULL,
language varchar(5),
language varchar(16),
preferences text NOT NULL default ''
);
@ -99,11 +99,11 @@ CREATE INDEX ix_session_changed ON session (changed);
CREATE TABLE dictionary (
user_id integer DEFAULT NULL,
"language" varchar(5) NOT NULL,
language varchar(16) NOT NULL,
data text NOT NULL
);
CREATE UNIQUE INDEX ix_dictionary_user_language ON dictionary (user_id, "language");
CREATE UNIQUE INDEX ix_dictionary_user_language ON dictionary (user_id, language);
--
-- Table structure for table searches
@ -215,4 +215,4 @@ CREATE TABLE system (
value text NOT NULL
);
INSERT INTO system (name, value) VALUES ('roundcube-version', '2018122300');
INSERT INTO system (name, value) VALUES ('roundcube-version', '2020020101');

@ -0,0 +1,57 @@
CREATE TABLE tmp_users (
user_id integer NOT NULL PRIMARY KEY,
username varchar(128) NOT NULL default '',
mail_host varchar(128) NOT NULL default '',
created datetime NOT NULL default '0000-00-00 00:00:00',
last_login datetime DEFAULT NULL,
failed_login datetime DEFAULT NULL,
failed_login_counter integer DEFAULT NULL,
language varchar(16),
preferences text NOT NULL default ''
);
INSERT INTO tmp_users (user_id, username, mail_host, created, last_login, failed_login, failed_login_counter, language, preferences)
SELECT user_id, username, mail_host, created, last_login, failed_login, failed_login_counter, language, preferences FROM users;
DROP TABLE users;
CREATE TABLE users (
user_id integer NOT NULL PRIMARY KEY,
username varchar(128) NOT NULL default '',
mail_host varchar(128) NOT NULL default '',
created datetime NOT NULL default '0000-00-00 00:00:00',
last_login datetime DEFAULT NULL,
failed_login datetime DEFAULT NULL,
failed_login_counter integer DEFAULT NULL,
language varchar(16),
preferences text NOT NULL default ''
);
INSERT INTO users (user_id, username, mail_host, created, last_login, failed_login, failed_login_counter, language, preferences)
SELECT user_id, username, mail_host, created, last_login, failed_login, failed_login_counter, language, preferences FROM tmp_users;
CREATE UNIQUE INDEX ix_users_username ON users(username, mail_host);
DROP TABLE tmp_users;
DROP TABLE users;
CREATE TABLE tmp_dictionary (
user_id integer DEFAULT NULL,
language varchar(16) NOT NULL,
data text NOT NULL
);
INSERT INTO tmp_dictionary (user_id, language, data) SELECT user_id, language, data FROM dictionary;
CREATE TABLE dictionary (
user_id integer DEFAULT NULL,
language varchar(16) NOT NULL,
data text NOT NULL
);
INSERT INTO dictionary (user_id, language, data) SELECT user_id, language, data FROM tmp_dictionary;
CREATE UNIQUE INDEX ix_dictionary_user_language ON dictionary (user_id, language);
DROP TABLE tmp_dictionary;

@ -14,18 +14,23 @@ and cd into that directory. From there, run the following command in a shell:
./bin/installto.sh <TARGET-FOLDER>
For <TARGET-FOLDER> you specify the path to the Roundcube installation
which should be updated. The update script will then copy all new files to the
For <TARGET-FOLDER> you specify the path to the Roundcube installation
which should be updated. The update script will then copy all new files to the
target location and check and update the configuration and database schema.
After all is done, the temporary folder with the new Roundcube files can be
After all is done, the temporary folder with the new Roundcube files can be
removed again.
WARNING: Make sure files have proper owner/group for your setup. If you use
tar to extract the package, `--no-same-owner` option might be helpful.
WARNING: See Post-Upgrade Activities section below.
WARNING: If you use MySQL < 5.7.7 or MariaDB < 10.2.2 make sure to configure it with:
innodb_large_prefix=true
innodb_file_format=Barracuda
Updating manually
-----------------
If you don't have shell access to the Roundcube installation or if not running
If you don't have shell access to the Roundcube installation or if not running
it on a unix system, you need to do the following operations by hand:
1. Replace index.php and all files in
@ -53,7 +58,8 @@ it on a unix system, you need to do the following operations by hand:
- run `php composer.phar install --no-dev`.
4c. If you use git sources or the release package without dependencies
update javascript dependencies by executing `bin/install-jsdeps.sh` script.
4d. If you use git sources compile css files for the Elastic skin:
4d. If you use git sources compile css files for the Elastic skin (required
lessc >= 1.5.0):
$ cd skins/elastic
$ lessc -x styles/styles.less > styles/styles.css
$ lessc -x styles/print.less > styles/print.css

@ -2,10 +2,9 @@
<?php
/*
+-----------------------------------------------------------------------+
| bin/cleandb.sh |
| |
| This file is part of the Roundcube Webmail client |
| Copyright (C) 2010-2015, The Roundcube Dev Team |
| |
| Copyright (C) The Roundcube Dev Team |
| |
| Licensed under the GNU General Public License version 3 or |
| any later version with exceptions for skins & plugins. |
@ -13,7 +12,6 @@
| |
| PURPOSE: |
| Finally remove all db records marked as deleted some time ago |
| |
+-----------------------------------------------------------------------+
| Author: Thomas Bruederli <roundcube@gmail.com> |
+-----------------------------------------------------------------------+
@ -29,5 +27,3 @@ else
$days = 7;
rcmail_utils::db_clean($days);
?>

@ -5,42 +5,42 @@ VERSION='2.4.8'
COMPILER_URL="https://github.com/yui/yuicompressor/releases/download/v${VERSION}/yuicompressor-${VERSION}.zip"
do_shrink() {
rm -f "$2"
java -jar $JAR_DIR/yuicompressor.jar -v -o "$2" "$1"
rm -f "$2"
java -jar $JAR_DIR/yuicompressor.jar -v -o "$2" "$1"
}
if [ ! -w "$JAR_DIR" ]; then
JAR_DIR=$PWD
JAR_DIR=$PWD
fi
if java -version >/dev/null 2>&1; then
:
:
else
echo "Java not found. Please ensure that the 'java' program is in your PATH."
exit 1
echo "Java not found. Please ensure that the 'java' program is in your PATH."
exit 1
fi
if [ ! -r "$JAR_DIR/yuicompressor.jar" ]; then
if which wget >/dev/null 2>&1 && which unzip >/dev/null 2>&1; then
wget "$COMPILER_URL" -O "/tmp/$$.zip"
elif which curl >/dev/null 2>&1 && which unzip >/dev/null 2>&1; then
curl "$COMPILER_URL" -o "/tmp/$$.zip"
else
echo "Please download $COMPILER_URL and extract compiler.jar to $JAR_DIR/."
exit 1
fi
(cd $JAR_DIR && unzip "/tmp/$$.zip" && mv "yuicompressor-${VERSION}.jar" "yuicompressor.jar")
rm -f "/tmp/$$.zip"
if which wget >/dev/null 2>&1 && which unzip >/dev/null 2>&1; then
wget "$COMPILER_URL" -O "/tmp/$$.zip"
elif which curl >/dev/null 2>&1 && which unzip >/dev/null 2>&1; then
curl -L "$COMPILER_URL" -o "/tmp/$$.zip"
else
echo "Please download $COMPILER_URL and extract compiler.jar to $JAR_DIR/."
exit 1
fi
(cd $JAR_DIR && unzip "/tmp/$$.zip" && mv "yuicompressor-${VERSION}.jar" "yuicompressor.jar")
rm -f "/tmp/$$.zip"
fi
# compress single file from argument
if [ $# -gt 0 ]; then
CSS_FILE="$1"
CSS_FILE="$1"
echo "Shrinking $CSS_FILE"
echo "Shrinking $CSS_FILE"
minfile=`echo $CSS_FILE | sed -e 's/\.css$/\.min\.css/'`
do_shrink "$CSS_FILE" "$minfile"
exit
do_shrink "$CSS_FILE" "$minfile"
exit
fi
DIRS="$PWD/../skins/* $PWD/../plugins/* $PWD/../plugins/*/skins/*"

@ -2,10 +2,9 @@
<?php
/*
+-----------------------------------------------------------------------+
| bin/decrypt.sh |
| |
| This file is part of the Roundcube Webmail client |
| Copyright (C) 2005-2009, The Roundcube Dev Team |
| |
| Copyright (C) The Roundcube Dev Team |
| |
| Licensed under the GNU General Public License version 3 or |
| any later version with exceptions for skins & plugins. |
@ -13,7 +12,6 @@
| |
| PURPOSE: |
| Decrypt the encrypted parts of the HTTP Received: headers |
| |
+-----------------------------------------------------------------------+
| Author: Tomas Tevesz <ice@extreme.hu> |
+-----------------------------------------------------------------------+
@ -57,11 +55,11 @@ define('INSTALL_PATH', realpath(__DIR__ .'/..') . '/');
require INSTALL_PATH . 'program/include/clisetup.php';
if ($argc < 2) {
die("Usage: " . basename($argv[0]) . " encrypted-hdr-part [encrypted-hdr-part ...]\n");
die("Usage: " . basename($argv[0]) . " encrypted-hdr-part [encrypted-hdr-part ...]\n");
}
$RCMAIL = rcube::get_instance();
for ($i = 1; $i < $argc; $i++) {
printf("%s\n", $RCMAIL->decrypt($argv[$i]));
printf("%s\n", $RCMAIL->decrypt($argv[$i]));
};

@ -3,10 +3,9 @@
/*
+-----------------------------------------------------------------------+
| bin/deluser.sh |
| |
| This file is part of the Roundcube Webmail client |
| Copyright (C) 2014, The Roundcube Dev Team |
| |
| Copyright (C) The Roundcube Dev Team |
| |
| Licensed under the GNU General Public License version 3 or |
| any later version with exceptions for skins & plugins. |
@ -34,7 +33,7 @@ function print_usage()
function _die($msg, $usage=false)
{
fputs(STDERR, $msg . "\n");
fwrite(STDERR, $msg . "\n");
if ($usage) print_usage();
exit(1);
}

@ -1,97 +0,0 @@
#!/usr/bin/env php
<?php
/*
+-----------------------------------------------------------------------+
| bin/dumpschema.sh |
| |
| This file is part of the Roundcube Webmail client |
| Copyright (C) 2005-2009, The Roundcube Dev Team |
| |
| Licensed under the GNU General Public License version 3 or |
| any later version with exceptions for skins & plugins. |
| See the README file for a full license statement. |
| |
| PURPOSE: |
| Dumps database schema in XML format using MDB2_Schema |
| |
+-----------------------------------------------------------------------+
| Author: Thomas Bruederli <roundcube@gmail.com> |
+-----------------------------------------------------------------------+
*/
define('INSTALL_PATH', realpath(__DIR__ . '/..') . '/' );
require INSTALL_PATH.'program/include/clisetup.php';
/** callback function for schema dump **/
function print_schema($dump)
{
foreach ((array)$dump as $part)
echo $dump . "\n";
}
$config = new rcube_config();
// don't allow public access if not in devel_mode
if (!$config->get('devel_mode') && $_SERVER['REMOTE_ADDR']) {
header("HTTP/1.0 401 Access denied");
die("Access denied!");
}
$options = array(
'use_transactions' => false,
'log_line_break' => "\n",
'idxname_format' => '%s',
'debug' => false,
'quote_identifier' => true,
'force_defaults' => false,
'portability' => false,
);
$dsnw = $config->get('db_dsnw');
$dsn_array = MDB2::parseDSN($dsnw);
// set options for postgres databases
if ($dsn_array['phptype'] == 'pgsql') {
$options['disable_smart_seqname'] = true;
$options['seqname_format'] = '%s';
}
$schema =& MDB2_Schema::factory($dsnw, $options);
$schema->db->supported['transactions'] = false;
// send as text/xml when opened in browser
if ($_SERVER['REMOTE_ADDR'])
header('Content-Type: text/xml');
if (PEAR::isError($schema)) {
$error = $schema->getMessage() . ' ' . $schema->getUserInfo();
}
else {
$dump_config = array(
// 'output_mode' => 'file',
'output' => 'print_schema',
);
$definition = $schema->getDefinitionFromDatabase();
$definition['charset'] = 'utf8';
if (PEAR::isError($definition)) {
$error = $definition->getMessage() . ' ' . $definition->getUserInfo();
}
else {
$operation = $schema->dumpDatabase($definition, $dump_config, MDB2_SCHEMA_DUMP_STRUCTURE);
if (PEAR::isError($operation)) {
$error = $operation->getMessage() . ' ' . $operation->getUserInfo();
}
}
}
$schema->disconnect();
if ($error && !$_SERVER['REMOTE_ADDR'])
fputs(STDERR, $error);
?>

@ -1,233 +0,0 @@
#!/usr/bin/env php
<?php
/*
+-----------------------------------------------------------------------+
| bin/exportgettext.sh |
| |
| This file is part of the Roundcube Webmail client |
| Copyright (C) 2011, The Roundcube Dev Team |
| Licensed under the GNU General Public License |
| |
| PURPOSE: |
| Export PHP-based localization files to PO files for gettext |
+-----------------------------------------------------------------------+
| Author: Thomas Bruederli <roundcube@gmail.com> |
+-----------------------------------------------------------------------+
*/
define('INSTALL_PATH', realpath(__DIR__ . '/..') . '/' );
require INSTALL_PATH.'program/include/clisetup.php';
if ($argc < 2) {
die("Usage: " . basename($argv[0]) . " SRCDIR DESTDIR\n");
}
$srcdir = unslashify(realpath($argv[1]));
$destdir = unslashify($argv[2]);
$layout = 'launchpad'; # or 'narro';
$langcode_map = array(
'hy_AM' => 'hy',
'ar_SA' => 'ar',
'az_AZ' => 'az',
'bg_BG' => 'bg',
'bs_BA' => 'bs',
'ca_ES' => 'ca',
'cs_CZ' => 'cs',
'cy_GB' => 'cy',
'da_DK' => 'da',
'et_EE' => 'et',
'el_GR' => 'el',
'eu_ES' => 'eu',
'fa_IR' => 'fa',
'ga_IE' => 'ga',
'ka_GE' => 'ka',
'gl_ES' => 'gl',
'he_IL' => 'he',
'hi_IN' => 'hi',
'hr_HR' => 'hr',
'ja_JP' => 'ja',
'ko_KR' => 'ko',
'km_KH' => 'km',
'ms_MY' => 'ms',
'mr_IN' => 'mr',
'ml_IN' => 'ml',
'pl_PL' => 'pl',
'si_LK' => 'si',
'sl_SI' => 'sl',
'sq_AL' => 'sq',
'sr_CS' => 'sr',
'sv_SE' => 'sv',
'uk_UA' => 'uk',
'vi_VN' => 'vi',
);
// converting roundcube localization dir
if (is_dir($srcdir.'/en_US')) {
load_en_US($srcdir.'/en_US');
foreach (glob($srcdir.'/*') as $locdir) {
if (is_dir($locdir)) {
$lang = basename($locdir);
//echo "$locdir => $destdir$lang\n";
convert_dir($locdir, $destdir . ($layout != 'launchpad' ? $lang : ''));
}
}
}
// converting single localization directory
else if (is_dir($srcdir)) {
if (is_file($srcdir.'/en_US.inc')) // plugin localization
load_en_US($srcdir.'/en_US.inc');
else
load_en_US(realpath($srcdir.'/../en_US')); // single language
convert_dir($srcdir, $destdir);
}
// converting a single file
else if (is_file($srcdir)) {
//load_en_US();
convert_file($srcdir, $destdir);
}
/**
* Load en_US localization which is used to build msgids
*/
function load_en_US($fn)
{
$texts = array();
if (is_dir($fn)) {
foreach (glob($fn.'/*.inc') as $ifn) {
include($ifn);
$texts = array_merge($texts, (array)$labels, (array)$messages);
}
}
else if (is_file($fn)) {
include($fn);
$texts = array_merge($texts, (array)$labels, (array)$messages);
}
$GLOBALS['en_US'] = $texts;
}
/**
* Convert all .inc files in the given src directory
*/
function convert_dir($indir, $outdir)
{
global $layout;
if (!is_dir($outdir)) // attempt to create destination dir
mkdir($outdir, 0777, true);
foreach (glob($indir.'/*.inc') as $fn) {
$filename = basename($fn);
// create subdir for each template (launchpad rules)
if ($layout == 'launchpad' && preg_match('/^(labels|messages)/', $filename, $m)) {
$lang = end(explode('/', $indir));
$destdir = $outdir . '/' . $m[1];
if (!is_dir($destdir))
mkdir($destdir, 0777, true);
$outfn = $destdir . '/' . $lang . '.po';
}
else {
$outfn = $outdir . '/' . preg_replace('/\.[a-z0-9]+$/i', '', basename($fn)) . '.po';
}
convert_file($fn, $outfn);
}
}
/**
* Convert the given Roundcube localization file into a gettext .po file
*/
function convert_file($fn, $outfn)
{
global $layout, $langcode_map;
$basename = basename($fn);
$srcname = str_replace(INSTALL_PATH, '', $fn);
$product = preg_match('!plugins/(\w+)!', $srcname, $m) ? 'roundcube-plugin-' . $m[1] : 'roundcubemail';
$lang = preg_match('!/([a-z]{2}(_[A-Z]{2})?)[./]!', $outfn, $m) ? $m[1] : '';
$labels = $messages = $seen = array();
if (is_dir($outfn))
$outfn .= '/' . $basename . '.po';
// launchpad requires the template file to have the same name as the directory
if (strstr($outfn, '/en_US') && $layout == 'launchpad') {
$a = explode('/', $outfn);
array_pop($a);
$templ = end($a);
$a[] = $templ . '.pot';
$outfn = join('/', $a);
$is_pot = true;
}
// launchpad is very picky about file names
else if ($layout == 'launchpad' && preg_match($regex = '!/([a-z]{2})_([A-Z]{2})!', $outfn, $m)) {
if ($shortlang = $langcode_map[$lang])
$outfn = preg_replace($regex, '/'.$shortlang, $outfn);
else if ($m[1] == strtolower($m[2]))
$outfn = preg_replace($regex, '/\1', $outfn);
}
include($fn);
$texts = array_merge($labels, $messages);
// write header
$header = <<<EOF
# Converted from Roundcube PHP localization files
# Copyright (C) 2011 The Roundcube Dev Team
# This file is distributed under the same license as the Roundcube package.
#
#: %s
msgid ""
msgstr ""
"Project-Id-Version: %s\\n"
"Report-Msgid-Bugs-To: \\n"
"%s: %s\\n"
"Last-Translator: \\n"
"Language-Team: Translations <hello@roundcube.net>\\n"
"Language: %s\\n"
"Content-Type: text/plain; charset=UTF-8\\n"
"Content-Transfer-Encoding: 8bit\\n"
EOF;
$out = sprintf($header, $srcname, $product, $is_pot ? "POT-Creation-Date" : "PO-Revision-Date", date('c'), $shortlang ? $shortlang : $lang);
$out .= "\n";
$messages = array();
foreach ((array)$texts as $label => $msgstr) {
$msgid = $is_pot ? $msgstr : ($GLOBALS['en_US'][$label] ?: $label);
$messages[$msgid][] = $label;
}
foreach ($messages as $msgid => $labels) {
$out .= "\n";
foreach ($labels as $label)
$out .= "#: $srcname:$label\n";
$msgstr = $texts[$label];
$out .= 'msgid ' . gettext_quote($msgid) . "\n";
$out .= 'msgstr ' . gettext_quote(!$is_pot ? $msgstr : '') . "\n";
}
if ($outfn == '-')
echo $out;
else {
echo "$fn\t=>\t$outfn\n";
file_put_contents($outfn, $out);
}
}
function gettext_quote($str)
{
$out = "";
$lines = explode("\n", wordwrap(stripslashes($str)));
$last = count($lines) - 1;
foreach ($lines as $i => $line)
$out .= '"' . addcslashes($line, '"') . ($i < $last ? ' ' : '') . "\"\n";
return rtrim($out);
}
?>

@ -2,10 +2,9 @@
<?php
/*
+-----------------------------------------------------------------------+
| bin/gc.sh |
| |
| This file is part of the Roundcube Webmail client |
| Copyright (C) 2013, The Roundcube Dev Team |
| |
| Copyright (C) The Roundcube Dev Team |
| |
| Licensed under the GNU General Public License version 3 or |
| any later version with exceptions for skins & plugins. |
@ -13,7 +12,6 @@
| |
| PURPOSE: |
| Trigger garbage collecting routines manually (e.g. via cronjob) |
| |
+-----------------------------------------------------------------------+
| Author: Thomas Bruederli <roundcube@gmail.com> |
+-----------------------------------------------------------------------+

@ -1,196 +0,0 @@
#!/usr/bin/env php
<?php
/*
+-----------------------------------------------------------------------+
| bin/importgettext.sh |
| |
| This file is part of the Roundcube Webmail client |
| Copyright (C) 2011, The Roundcube Dev Team |
| Licensed under the GNU General Public License |
| |
| PURPOSE: |
| Import localizations from gettext PO format |
+-----------------------------------------------------------------------+
| Author: Thomas Bruederli <roundcube@gmail.com> |
+-----------------------------------------------------------------------+
*/
define('INSTALL_PATH', realpath(__DIR__ . '/..') . '/' );
require INSTALL_PATH.'program/include/clisetup.php';
if ($argc < 2) {
die("Usage: " . basename($argv[0]) . " SRCDIR\n");
}
$srcdir = unslashify(realpath($argv[1]));
if (is_dir($srcdir)) {
$out = import_dir($srcdir);
}
else if (is_file($srcdir)) {
$out = import_file($srcdir);
}
// write output files
foreach ($out as $outfn => $texts) {
$lang = preg_match('!/([a-z]{2}(_[A-Z]{2})?)[./]!', $outfn, $m) ? $m[1] : '';
$varname = strpos($outfn, 'messages.inc') !== false ? 'messages' : 'labels';
$header = <<<EOF
<?php
/*
+-----------------------------------------------------------------------+
| localization/%s/%-51s|
| |
| Language file of the Roundcube Webmail client |
| Copyright (C) %s, The Roundcube Dev Team |
| Licensed under the GNU General Public License |
| |
+-----------------------------------------------------------------------+
| Author: %-62s|
+-----------------------------------------------------------------------+
*/
$%s = array();
EOF;
$author = preg_replace('/\s*<Unknown>/i', '', $texts['_translator']);
$output = sprintf($header, $lang, $varname.'.inc', date('Y'), $author, $varname);
foreach ($texts as $label => $value) {
if (is_array($value)) { var_dump($outfn, $label, $value); exit; }
if ($label[0] != '_' && strlen($value))
$output .= sprintf("\$%s['%s'] = '%s';\n", $varname, $label, strtr(addcslashes($value, "'"), array("\r" => '', "\n" => '\n')));
}
$output .= "\n";
$dir = dirname($outfn);
@mkdir($dir, 0755, true);
if (file_put_contents($outfn, $output))
echo "-> $outfn\n";
}
/**
* Convert all .po files in the given src directory
*/
function import_dir($indir)
{
$out = array();
foreach (glob($indir.'/*.po') as $fn) {
$out = array_merge_recursive($out, import_file($fn));
}
return $out;
}
/**
* Convert the given .po file into a Roundcube localization array
*/
function import_file($fn)
{
$out = array();
$lines = file($fn);
$language = '';
$translator = '';
// get language code from file name
if (preg_match('/-([a-z_]+).po$/i', $fn, $m))
$language = expand_langcode($m[1]);
$is_header = true;
$msgid = null;
$msgstr = '';
$dests = array();
foreach ($lines as $i => $line) {
$line = trim($line);
// parse header
if ($is_header && $line[0] == '"') {
list($key, $val) = explode(": ", preg_replace('/\\\n$/', '', trim($line, '"')), 2);
switch (strtolower($key)) {
case 'language':
$language = expand_langcode($val);
break;
case 'last-translator':
$translator = $val;
break;
}
}
// empty line
if ($line == '') {
if ($msgid && $dests) {
foreach ($dests as $dest) {
list($file, $label) = explode(':', $dest);
$out[$file][$label] = $msgstr;
$out[$file]['_translator'] = $translator;
}
}
$msgid = null;
$msgstr = '';
$dests = array();
}
// meta line
if ($line[0] == '#') {
$value = trim(substr($line, 2));
if ($line[1] == ':')
$dests[] = str_replace('en_US', $language, $value);
}
else if (strpos($line, 'msgid') === 0) {
$msgid = gettext_decode(substr($line, 6));
if (!empty($msgid))
$is_header = false;
}
else if (strpos($line, 'msgstr') === 0) {
$msgstr = gettext_decode(substr($line, 7));
}
else if ($msgid && $line[0] == '"') {
$msgstr .= gettext_decode($line);
}
else if ($msgid !== null && $line[0] == '"') {
$msgid .= gettext_decode($line);
}
}
if ($msgid && $dests) {
foreach ($dests as $dest) {
list($file, $label) = explode(':', $dest);
$out[$file][$label] = $msgstr;
$out[$file]['_translator'] = $translator;
}
}
return $language ? $out : array();
}
function gettext_decode($str)
{
return stripslashes(trim($str, '"'));
}
/**
* Translate two-chars language codes to our internally used language identifiers
*/
function expand_langcode($lang)
{
static $rcube_language_aliases, $rcube_languages;
if (!$rcube_language_aliases)
include(INSTALL_PATH . 'program/localization/index.inc');
if ($rcube_language_aliases[$lang])
return $rcube_language_aliases[$lang];
else if (strlen($lang) == 2 && !isset($rcube_languages[$lang]))
return strtolower($lang) . '_' . strtoupper($lang);
else
return $lang;
}
?>

@ -2,10 +2,9 @@
<?php
/*
+-----------------------------------------------------------------------+
| bin/indexcontacts.sh |
| |
| This file is part of the Roundcube Webmail client |
| Copyright (C) 2011, The Roundcube Dev Team |
| |
| Copyright (C) The Roundcube Dev Team |
| |
| Licensed under the GNU General Public License version 3 or |
| any later version with exceptions for skins & plugins. |
@ -25,5 +24,3 @@ require_once INSTALL_PATH.'program/include/clisetup.php';
ini_set('memory_limit', -1);
rcmail_utils::indexcontacts();
?>

@ -2,11 +2,10 @@
<?php
/*
+-----------------------------------------------------------------------+
| bin/initdb.sh |
| |
| This file is part of the Roundcube Webmail client |
| Copyright (C) 2010-2015, The Roundcube Dev Team |
| Copyright (C) 2010-2015, Kolab Systems AG |
| |
| Copyright (C) The Roundcube Dev Team |
| Copyright (C) Kolab Systems AG |
| |
| Licensed under the GNU General Public License version 3 or |
| any later version with exceptions for skins & plugins. |
@ -38,5 +37,3 @@ if (!file_exists($opts['dir'])) {
}
rcmail_utils::db_init($opts['dir']);
?>

@ -2,10 +2,9 @@
<?php
/*
+-----------------------------------------------------------------------+
| bin/install-jsdeps.sh |
| |
| This file is part of the Roundcube Webmail client |
| Copyright (C) 2016, The Roundcube Dev Team |
| |
| Copyright (C) The Roundcube Dev Team |
| |
| Licensed under the GNU General Public License version 3 or |
| any later version with exceptions for skins & plugins. |
@ -13,7 +12,7 @@
| |
| PURPOSE: |
| Utility script to fetch and install all 3rd party javascript |
| libraries unsed in Roundcube from source. |
| libraries used in Roundcube from source. |
+-----------------------------------------------------------------------+
| Author: Thomas Bruederli <thomas@roundcube.net> |
+-----------------------------------------------------------------------+
@ -24,28 +23,28 @@ define('INSTALL_PATH', realpath(__DIR__ . '/..') . '/' );
require_once INSTALL_PATH . 'program/include/clisetup.php';
if (!function_exists('exec')) {
die("PHP exec() function is required. Check disable_functions in php.ini\n");
rcube::raise_error("PHP exec() function is required. Check disable_functions in php.ini.", false, true);
}
$SOURCES = json_decode(file_get_contents(INSTALL_PATH . 'jsdeps.json'), true);
$cfgfile = INSTALL_PATH . 'jsdeps.json';
$SOURCES = json_decode(file_get_contents($cfgfile), true);
if (empty($SOURCES['dependencies'])) {
die("ERROR: Failed to read sources from " . INSTALL_PATH . "jsdeps.json\n");
rcube::raise_error("Failed to read dependencies list from $cfgfile", false, true);
}
$CURL = trim(`which curl`);
$WGET = trim(`which wget`);
$UNZIP = trim(`which unzip`);
$FILEINFO = trim(`which file`);
if (($CACHEDIR = getenv("CACHEDIR")) && is_writeable($CACHEDIR)) {
// use $CACHEDIR
// use $CACHEDIR
}
else if (is_writeable(INSTALL_PATH . 'temp/js_cache') || @mkdir(INSTALL_PATH . 'temp/js_cache', 0774, true)) {
$CACHEDIR = INSTALL_PATH . 'temp/js_cache';
$CACHEDIR = INSTALL_PATH . 'temp/js_cache';
}
else {
$CACHEDIR = sys_get_temp_dir();
$CACHEDIR = sys_get_temp_dir();
}
@ -110,43 +109,43 @@ EOL;
*/
function fetch_from_source($package, $useCache = true, &$filetype = null)
{
global $CURL, $WGET;
global $CURL, $WGET;
$cache_file = extract_filetype($package, $filetype);
$cache_file = extract_filetype($package, $filetype);
if (!is_readable($cache_file) || !$useCache) {
if (empty($CURL) && empty($WGET)) {
die("ERROR: Required program 'wget' or 'curl' not found\n");
}
if (!is_readable($cache_file) || !$useCache) {
if (empty($CURL) && empty($WGET)) {
rcube::raise_error("Required 'wget' or 'curl' program not found.", false, true);
}
$url = str_replace('$v', $package['version'], $package['url']);
$url = str_replace('$v', $package['version'], $package['url']);
echo "Fetching $url\n";
echo "Fetching $url\n";
if ($CURL)
exec(sprintf('%s -L -s %s -o %s', $CURL, escapeshellarg($url), $cache_file), $out, $retval);
else
exec(sprintf('%s -q %s -O %s', $WGET, escapeshellarg($url), $cache_file), $out, $retval);
if ($CURL)
exec(sprintf('%s -L -s %s -o %s', $CURL, escapeshellarg($url), $cache_file), $out, $retval);
else
exec(sprintf('%s -q %s -O %s', $WGET, escapeshellarg($url), $cache_file), $out, $retval);
// Try Github API as a fallback (#6248)
if ($retval !== 0 && $package['api_url']) {
$url = str_replace('$v', $package['version'], $package['api_url']);
$header = 'Accept:application/vnd.github.v3.raw';
// Try Github API as a fallback (#6248)
if ($retval !== 0 && $package['api_url']) {
$url = str_replace('$v', $package['version'], $package['api_url']);
$header = 'Accept:application/vnd.github.v3.raw';
echo "Fetching failed. Using Github API on $url\n";
rcube::raise_error("Fetching failed. Using Github API on $url");
if ($CURL)
exec(sprintf('%s -L -H %s -s %s -o %s', $CURL, escapeshellarg($header), escapeshellarg($url), $cache_file), $out, $retval);
else
exec(sprintf('%s --header %s -q %s -O %s', $WGET, escapeshellarg($header), escapeshellarg($url), $cache_file), $out, $retval);
}
if ($CURL)
exec(sprintf('%s -L -H %s -s %s -o %s', $CURL, escapeshellarg($header), escapeshellarg($url), $cache_file), $out, $retval);
else
exec(sprintf('%s --header %s -q %s -O %s', $WGET, escapeshellarg($header), escapeshellarg($url), $cache_file), $out, $retval);
}
if ($retval !== 0) {
die("ERROR: Failed to download source file from " . $url . "\n");
if ($retval !== 0) {
rcube::raise_error("Failed to download source file from $url", false, true);
}
}
}
return $cache_file;
return $cache_file;
}
/**
@ -154,22 +153,20 @@ function fetch_from_source($package, $useCache = true, &$filetype = null)
*/
function extract_filetype($package, &$filetype = null)
{
global $FILEINFO, $CACHEDIR;
global $CACHEDIR;
$filetype = pathinfo($package['url'], PATHINFO_EXTENSION) ?: 'tmp';
$cache_file = $CACHEDIR . '/' . $package['lib'] . '-' . $package['version'] . '.' . $filetype;
$filetype = pathinfo($package['url'], PATHINFO_EXTENSION) ?: 'tmp';
$cache_file = $CACHEDIR . '/' . $package['lib'] . '-' . $package['version'] . '.' . $filetype;
if (empty($FILEINFO)) {
die("ERROR: Required program 'file' not found\n");
}
// detect downloaded/cached file type
exec(sprintf('%s -b %s', $FILEINFO, $cache_file), $out);
if (stripos($out[0], 'zip') === 0) {
$filetype = 'zip';
}
// Make sure it is a zip file
if (file_exists($cache_file)) {
$magic = file_get_contents($cache_file, false, null, 0, 4);
if ($magic === "PK\003\004") {
$filetype = 'zip';
}
}
return $cache_file;
return $cache_file;
}
/**
@ -177,38 +174,38 @@ function extract_filetype($package, &$filetype = null)
*/
function compose_destfile($package, $srcfile)
{
global $LICENSES;
$header = sprintf("/**\n * %s - v%s\n *\n", $package['name'], $package['version']);
if (!empty($package['source'])) {
$header .= " * @source " . str_replace('$v', $package['version'], $package['source']) . "\n";
$header .= " *\n";
}
if (!empty($package['license']) && isset($LICENSES[$package['license']])) {
$header .= " * @licstart The following is the entire license notice for the\n";
$header .= " * JavaScript code in this file.\n";
$header .= " *\n";
if (!empty($package['copyright'])) {
$header .= " * " . $package['copyright'] . "\n";
$header .= " *\n";
global $LICENSES;
$header = sprintf("/**\n * %s - v%s\n *\n", $package['name'], $package['version']);
if (!empty($package['source'])) {
$header .= " * @source " . str_replace('$v', $package['version'], $package['source']) . "\n";
$header .= " *\n";
}
$header .= $LICENSES[$package['license']];
$header .= " *\n";
$header .= " * @licend The above is the entire license notice\n";
$header .= " * for the JavaScript code in this file.\n";
}
if (!empty($package['license']) && isset($LICENSES[$package['license']])) {
$header .= " * @licstart The following is the entire license notice for the\n";
$header .= " * JavaScript code in this file.\n";
$header .= " *\n";
if (!empty($package['copyright'])) {
$header .= " * " . $package['copyright'] . "\n";
$header .= " *\n";
}
$header .= " */\n";
$header .= $LICENSES[$package['license']];
$header .= " *\n";
$header .= " * @licend The above is the entire license notice\n";
$header .= " * for the JavaScript code in this file.\n";
}
$header .= " */\n";
if (file_put_contents(INSTALL_PATH . $package['dest'], $header . file_get_contents($srcfile))) {
echo "Wrote file " . INSTALL_PATH . $package['dest'] . "\n";
}
else {
die("ERROR: Failed to write destination file " . INSTALL_PATH . $package['dest'] . "\n");
}
if (file_put_contents(INSTALL_PATH . $package['dest'], $header . file_get_contents($srcfile))) {
echo "Wrote file " . INSTALL_PATH . $package['dest'] . "\n";
}
else {
rcube::raise_error("Failed to write destination file " . INSTALL_PATH . $package['dest'], false, true);
}
}
/**
@ -216,94 +213,107 @@ function compose_destfile($package, $srcfile)
*/
function extract_zipfile($package, $srcfile)
{
global $UNZIP, $CACHEDIR;
if (empty($UNZIP)) {
die("ERROR: Required program 'unzip' not found\n");
}
$destdir = INSTALL_PATH . $package['dest'];
if (!is_dir($destdir)) {
mkdir($destdir, 0775, true);
}
if (!is_writeable($destdir)) {
die("ERROR: Cannot write to destination directory $destdir\n");
}
// pick files from zip archive
if (!empty($package['pick'])) {
foreach ($package['pick'] as $pattern) {
echo "Extracting files $pattern into $destdir\n";
exec(sprintf('%s -o %s %s -d %s', $UNZIP, escapeshellarg($srcfile), escapeshellarg($pattern), $destdir), $out, $retval);
if ($retval !== 0) {
echo "ERROR: Failed to unpack $pattern; " . join('; ' . $out) . "\n";
}
}
}
// unzip the archive and map source to dest files/directories
else if (!empty($package['map'])) {
$extract = $CACHEDIR . '/' . $package['lib'] . '-extract';
if (!is_dir($extract)) {
mkdir($extract, 0774, true);
}
global $UNZIP, $CACHEDIR;
$zip_command = '%s -' . ($package['flat'] ? 'j' : 'o') . ' %s -d %s';
exec(sprintf($zip_command, $UNZIP, escapeshellarg($srcfile), $extract), $out, $retval);
if (empty($UNZIP)) {
rcube::raise_error("Required 'unzip' program not found.", false, true);
}
// get the root folder of the extracted package
$extract_tree = glob("$extract/*", GLOB_ONLYDIR);
$sourcedir = count($extract_tree) ? $extract_tree[0] : $extract;
$destdir = INSTALL_PATH . $package['dest'];
if (!is_dir($destdir)) {
mkdir($destdir, 0775, true);
}
foreach ($package['map'] as $src => $dest) {
echo "Installing $sourcedir/$src into $destdir/$dest\n";
if (!is_writeable($destdir)) {
rcube::raise_error("Cannot write to destination directory: $destdir", false, true);
}
// make sure the destination's parent directory exists
if (strpos($dest, '/') !== false) {
$parentdir = dirname($destdir . '/' . $dest);
if (!is_dir($parentdir)) {
mkdir($parentdir, 0775, true);
// pick files from zip archive
if (!empty($package['pick'])) {
foreach ($package['pick'] as $pattern) {
echo "Extracting files $pattern into $destdir\n";
exec(sprintf('%s -o %s %s -d %s', $UNZIP, escapeshellarg($srcfile), escapeshellarg($pattern), $destdir), $out, $retval);
if ($retval !== 0) {
rcube::raise_error("Failed to unpack $pattern; " . implode('; ' . $out));
}
}
}
// unzip the archive and map source to dest files/directories
else if (!empty($package['map'])) {
$extract = $CACHEDIR . '/' . $package['lib'] . '-extract';
if (!is_dir($extract)) {
mkdir($extract, 0774, true);
}
}
// avoid copying source directory as a child into destination
if (is_dir($sourcedir . '/' . $src) && is_dir($destdir . '/' . $dest)) {
exec(sprintf('rm -rf %s/%s', $destdir, $dest));
}
$zip_command = '%s -' . ($package['flat'] ? 'j' : 'o') . ' %s -d %s';
exec(sprintf($zip_command, $UNZIP, escapeshellarg($srcfile), $extract), $out, $retval);
// get the root folder of the extracted package
$extract_tree = glob("$extract/*", GLOB_ONLYDIR);
$sourcedir = count($extract_tree) ? $extract_tree[0] : $extract;
foreach ($package['map'] as $src => $dest) {
echo "Installing $sourcedir/$src into $destdir/$dest\n";
$dest_file = $destdir . '/' . $dest;
$src_file = $sourcedir . '/' . $src;
// make sure the destination's parent directory exists
if (strpos($dest, '/') !== false) {
$parentdir = dirname($dest_file);
if (!is_dir($parentdir)) {
mkdir($parentdir, 0775, true);
}
}
// avoid copying source directory as a child into destination
if (is_dir($src_file) && is_dir($dest_file)) {
exec(sprintf('rm -rf %s', $dest_file));
}
exec(sprintf('mv -f %s %s', $src_file, $dest_file), $out, $retval);
if ($retval !== 0) {
rcube::raise_error("Failed to move $src into $dest_file; " . implode('; ' . $out));
}
// Remove sourceMappingURL
else if (isset($package['sourcemap']) && $package['sourcemap'] === false) {
if ($content = file($dest_file)) {
$index = count($content);
if (preg_match('|sourceMappingURL=|', $content[$index-1])) {
array_pop($content);
file_put_contents($dest_file, implode('', $content));
}
}
}
}
exec(sprintf('mv -f %s/%s %s/%s', $sourcedir, $src, $destdir, $dest), $out, $retval);
if ($retval !== 0) {
echo "ERROR: Failed to move $src into $destdir/$dest; " . join('; ' . $out) . "\n";
}
// remove temp extraction dir
exec('rm -rf ' . $extract);
}
// remove temp extraction dir
exec('rm -rf ' . $extract);
}
// extract the archive into the destination directory
else {
echo "Extracting zip archive into $destdir\n";
exec(sprintf('%s -o %s -d %s', $UNZIP, escapeshellarg($srcfile), $destdir), $out, $retval);
if ($retval !== 0) {
echo "ERROR: Failed to unzip $srcfile; " . join('; ' . $out) . "\n";
// extract the archive into the destination directory
else {
echo "Extracting zip archive into $destdir\n";
exec(sprintf('%s -o %s -d %s', $UNZIP, escapeshellarg($srcfile), $destdir), $out, $retval);
if ($retval !== 0) {
rcube::raise_error("Failed to unzip $srcfile; " . implode('; ' . $out));
}
}
}
// remove some files from the destination
if (!empty($package['omit'])) {
foreach ((array)$package['omit'] as $glob) {
exec(sprintf('rm -rf %s/%s', $destdir, escapeshellarg($glob)));
// remove some files from the destination
if (!empty($package['omit'])) {
foreach ((array)$package['omit'] as $glob) {
exec(sprintf('rm -rf %s/%s', $destdir, escapeshellarg($glob)));
}
}
}
// prepend license header to extracted files
if (!empty($package['addlicense'])) {
foreach ((array)$package['addlicense'] as $filename) {
$pkg = $package;
$pkg['dest'] = $package['dest'] . '/' . $filename;
compose_destfile($pkg, $destdir . '/' . $filename);
// prepend license header to extracted files
if (!empty($package['addlicense'])) {
foreach ((array)$package['addlicense'] as $filename) {
$pkg = $package;
$pkg['dest'] = $package['dest'] . '/' . $filename;
compose_destfile($pkg, $destdir . '/' . $filename);
}
}
}
}
/**
@ -311,16 +321,16 @@ function extract_zipfile($package, $srcfile)
*/
function delete_destfile($package)
{
$destdir = INSTALL_PATH . ($package['rm'] ?: $package['dest']);
$destdir = INSTALL_PATH . ($package['rm'] ?: $package['dest']);
if (file_exists($destdir)) {
if (PHP_OS === 'Windows') {
exec(sprintf("rd /s /q %s", escapeshellarg($destdir)));
}
else {
exec(sprintf("rm -rf %s", escapeshellarg($destdir)));
if (file_exists($destdir)) {
if (PHP_OS === 'Windows') {
exec(sprintf("rd /s /q %s", escapeshellarg($destdir)));
}
else {
exec(sprintf("rm -rf %s", escapeshellarg($destdir)));
}
}
}
}
@ -332,44 +342,44 @@ $WHAT = $args[0];
$useCache = !$args['force'] && !$args['get'];
if (!$args['get'] && !$args['extract'] && !$args['delete']) {
$args['get'] = $args['extract'] = 1;
$args['get'] = $args['extract'] = 1;
}
foreach ($SOURCES['dependencies'] as $package) {
if (!isset($package['name'])) {
$package['name'] = $package['lib'];
}
if ($WHAT && $package['lib'] !== $WHAT) {
continue;
}
if ($args['delete']) {
delete_destfile($package);
continue;
}
if ($args['get']) {
$srcfile = fetch_from_source($package, $useCache, $filetype);
}
else {
$srcfile = extract_filetype($package, $filetype);
}
if (!empty($package['sha1']) && ($sum = sha1_file($srcfile)) !== $package['sha1']) {
die("ERROR: Incorrect sha1 sum of $srcfile. Expected: {$package['sha1']}, got: $sum\n");
}
if ($args['extract']) {
echo "Installing {$package['name']}...\n";
if ($filetype === 'zip') {
extract_zipfile($package, $srcfile);
if (!isset($package['name'])) {
$package['name'] = $package['lib'];
}
if ($WHAT && $package['lib'] !== $WHAT) {
continue;
}
if ($args['delete']) {
delete_destfile($package);
continue;
}
if ($args['get']) {
$srcfile = fetch_from_source($package, $useCache, $filetype);
}
else {
compose_destfile($package, $srcfile);
$srcfile = extract_filetype($package, $filetype);
}
if (!empty($package['sha1']) && ($sum = sha1_file($srcfile)) !== $package['sha1']) {
rcube::raise_error("Incorrect sha1 sum of $srcfile. Expected: {$package['sha1']}, got: $sum", false, true);
}
echo "Done.\n";
}
if ($args['extract']) {
echo "Installing {$package['name']}...\n";
if ($filetype === 'zip') {
extract_zipfile($package, $srcfile);
}
else {
compose_destfile($package, $srcfile);
}
echo "Done.\n";
}
}

@ -2,10 +2,9 @@
<?php
/*
+-----------------------------------------------------------------------+
| bin/installto.sh |
| |
| This file is part of the Roundcube Webmail client |
| Copyright (C) 2014-2016, The Roundcube Dev Team |
| |
| Copyright (C) The Roundcube Dev Team |
| |
| Licensed under the GNU General Public License version 3 or |
| any later version with exceptions for skins & plugins. |
@ -24,112 +23,126 @@ define('INSTALL_PATH', realpath(__DIR__ . '/..') . '/' );
require_once INSTALL_PATH . 'program/include/clisetup.php';
if (!function_exists('system')) {
rcube::raise_error("PHP system() function is required. Check disable_functions in php.ini.", false, true);
rcube::raise_error("PHP system() function is required. Check disable_functions in php.ini.", false, true);
}
$target_dir = unslashify($_SERVER['argv'][1]);
$target_dir = unslashify(end($_SERVER['argv']));
$accept = in_array('-y', $_SERVER['argv']) ? 'y' : null;
if (empty($target_dir) || !is_dir(realpath($target_dir)))
rcube::raise_error("Invalid target: not a directory\nUsage: installto.sh <TARGET>", false, true);
rcube::raise_error("Invalid target: not a directory\nUsage: installto.sh [-y] <TARGET>", false, true);
// read version from iniset.php
$iniset = @file_get_contents($target_dir . '/program/include/iniset.php');
if (!preg_match('/define\(.RCMAIL_VERSION.,\s*.([0-9.]+[a-z-]*)/', $iniset, $m))
rcube::raise_error("No valid Roundcube installation found at $target_dir", false, true);
if (!preg_match('/define\(.RCMAIL_VERSION.,\s*.([0-9.]+[a-z0-9-]*)/', $iniset, $m))
rcube::raise_error("No valid Roundcube installation found at $target_dir", false, true);
$oldversion = $m[1];
if (version_compare(version_parse($oldversion), version_parse(RCMAIL_VERSION), '>='))
rcube::raise_error("Installation at target location is up-to-date!", false, true);
if (version_compare(version_parse($oldversion), version_parse(RCMAIL_VERSION), '>'))
rcube::raise_error("Target installation already in version $oldversion.", false, true);
if (version_compare(version_parse($oldversion), version_parse(RCMAIL_VERSION), '==')) {
echo "Target installation already in version $oldversion. Do you want to update again? (y/N)\n";
}
else {
echo "Upgrading from $oldversion. Do you want to continue? (y/N)\n";
}
echo "Upgrading from $oldversion. Do you want to continue? (y/N)\n";
$input = trim(fgets(STDIN));
$input = $accept ?: trim(fgets(STDIN));
if (strtolower($input) == 'y') {
echo "Copying files to target location...";
$adds = array();
$dirs = array('program','bin','SQL','plugins','skins');
if (is_dir(INSTALL_PATH . 'vendor') && !is_file("$target_dir/composer.json")) {
$dirs[] = 'vendor';
}
if (file_exists("$target_dir/installer")) {
$dirs[] = 'installer';
}
foreach ($dirs as $dir) {
// @FIXME: should we use --delete for all directories?
$delete = in_array($dir, array('program', 'vendor', 'installer')) ? '--delete ' : '';
$command = "rsync -aC --out-format=%n " . $delete . INSTALL_PATH . "$dir/ $target_dir/$dir/";
if (system($command, $ret) === false || $ret > 0) {
rcube::raise_error("Failed to execute command: $command", false, true);
echo "Copying files to target location...";
$adds = array();
$dirs = array('bin','SQL','plugins','skins','program');
if (is_dir(INSTALL_PATH . 'vendor') && !is_file("$target_dir/composer.json")) {
$dirs[] = 'vendor';
}
}
if (file_exists("$target_dir/installer")) {
$dirs[] = 'installer';
}
foreach ($dirs as $dir) {
// @FIXME: should we use --delete for all directories?
$delete = in_array($dir, array('program', 'vendor', 'installer')) ? '--delete ' : '';
$command = "rsync -aC --out-format=%n " . $delete . INSTALL_PATH . "$dir/ $target_dir/$dir/";
foreach (array('index.php','config/defaults.inc.php','composer.json-dist','jsdeps.json','CHANGELOG','README.md','UPGRADING','LICENSE','INSTALL') as $file) {
$command = "rsync -a --out-format=%n " . INSTALL_PATH . "$file $target_dir/$file";
if (file_exists(INSTALL_PATH . $file) && (system($command, $ret) === false || $ret > 0)) {
rcube::raise_error("Failed to execute command: $command", false, true);
if (system($command, $ret) === false || $ret > 0) {
rcube::raise_error("Failed to execute command: $command", false, true);
}
}
}
// Copy .htaccess or .user.ini if needed
foreach (array('.htaccess','.user.ini') as $file) {
if (file_exists(INSTALL_PATH . $file)) {
if (!file_exists("$target_dir/$file") || file_get_contents(INSTALL_PATH . $file) != file_get_contents("$target_dir/$file")) {
if (copy(INSTALL_PATH . $file, "$target_dir/$file.new")) {
echo "$file.new\n";
$adds[] = "NOTICE: New $file file saved as $file.new.";
foreach (array('index.php','config/defaults.inc.php','composer.json-dist','jsdeps.json','CHANGELOG','README.md','UPGRADING','LICENSE','INSTALL') as $file) {
$command = "rsync -a --out-format=%n " . INSTALL_PATH . "$file $target_dir/$file";
if (file_exists(INSTALL_PATH . $file) && (system($command, $ret) === false || $ret > 0)) {
rcube::raise_error("Failed to execute command: $command", false, true);
}
}
}
}
// remove old (<1.0) .htaccess file
@unlink("$target_dir/program/.htaccess");
echo "done.\n\n";
if (is_dir("$target_dir/skins/default")) {
echo "Removing old default skin...";
system("rm -rf $target_dir/skins/default $target_dir/plugins/jqueryui/themes/default");
foreach (glob(INSTALL_PATH . "plugins/*/skins") as $plugin_skin_dir) {
$plugin_skin_dir = preg_replace('!^.*' . INSTALL_PATH . '!', '', $plugin_skin_dir);
if (is_dir("$target_dir/$plugin_skin_dir/classic"))
system("rm -rf $target_dir/$plugin_skin_dir/default");
}
echo "done.\n\n";
}
// check if js-deps are up-to-date
if (file_exists("$target_dir/jsdeps.json") && file_exists("$target_dir/bin/install-jsdeps.sh")) {
$jsdeps = json_decode(file_get_contents("$target_dir/jsdeps.json"));
$package = $jsdeps->dependencies[0];
$dest_file = $target_dir . '/' . $package->dest;
if (!file_exists($dest_file) || sha1_file($dest_file) !== $package->sha1) {
echo "Installing JavaScript dependencies...";
system("cd $target_dir && bin/install-jsdeps.sh");
// Copy .htaccess or .user.ini if needed
foreach (array('.htaccess','.user.ini') as $file) {
if (file_exists(INSTALL_PATH . $file)) {
if (!file_exists("$target_dir/$file") || file_get_contents(INSTALL_PATH . $file) != file_get_contents("$target_dir/$file")) {
if (copy(INSTALL_PATH . $file, "$target_dir/$file.new")) {
echo "$file.new\n";
$adds[] = "NOTICE: New $file file saved as $file.new.";
}
}
}
}
// remove old (<1.0) .htaccess file
@unlink("$target_dir/program/.htaccess");
echo "done.\n\n";
if (is_dir("$target_dir/skins/default")) {
echo "Removing old default skin...";
system("rm -rf $target_dir/skins/default $target_dir/plugins/jqueryui/themes/default");
foreach (glob(INSTALL_PATH . "plugins/*/skins") as $plugin_skin_dir) {
$plugin_skin_dir = preg_replace('!^.*' . INSTALL_PATH . '!', '', $plugin_skin_dir);
if (is_dir("$target_dir/$plugin_skin_dir/classic")) {
system("rm -rf $target_dir/$plugin_skin_dir/default");
}
}
echo "done.\n\n";
}
}
else {
$adds[] = "NOTICE: JavaScript dependencies installation skipped...";
}
if (file_exists("$target_dir/installer")) {
$adds[] = "NOTICE: The 'installer' directory still exists. You should remove it after the upgrade.";
}
if (!empty($adds)) {
echo implode($adds, "\n") . "\n\n";
}
echo "Running update script at target...\n";
system("cd $target_dir && php bin/update.sh --version=$oldversion");
echo "All done.\n";
// Warn about situation when using "complete" package to update "custom" installation (#7087)
// Note: "Complete" package do not include jsdeps.json nor install-jsdeps.sh
if (file_exists("$target_dir/jsdeps.json") && !file_exists(INSTALL_PATH . "jsdeps.json")) {
$adds[] = "WARNING: JavaScript dependencies update skipped.";
}
// check if js-deps are up-to-date
else if (file_exists("$target_dir/jsdeps.json") && file_exists("$target_dir/bin/install-jsdeps.sh")) {
$jsdeps = json_decode(file_get_contents("$target_dir/jsdeps.json"));
$package = $jsdeps->dependencies[0];
$dest_file = $target_dir . '/' . $package->dest;
if (!file_exists($dest_file) || sha1_file($dest_file) !== $package->sha1) {
echo "Installing JavaScript dependencies...";
system("cd $target_dir && bin/install-jsdeps.sh");
echo "done.\n\n";
}
}
else {
$adds[] = "NOTICE: JavaScript dependencies installation skipped.";
}
if (file_exists("$target_dir/installer")) {
$adds[] = "NOTICE: The 'installer' directory still exists. You should remove it after the upgrade.";
}
if (!empty($adds)) {
echo implode("\n", $adds) . "\n\n";
}
echo "Running update script at target...\n";
system("cd $target_dir && php bin/update.sh --version=$oldversion" . ($accept ? ' -y' : ''));
echo "All done.\n";
}
else {
echo "Update cancelled. See ya!\n";
echo "Update cancelled. See ya!\n";
}
?>

@ -6,54 +6,54 @@ LANG_IN='ECMASCRIPT5'
CLOSURE_COMPILER_URL='http://dl.google.com/closure-compiler/compiler-latest.zip'
do_shrink() {
rm -f "$2"
# copy the first comment block with license information for LibreJS
grep -q '@lic' $1 && sed -n '/\/\*/,/\*\// { p; /\*\//q; }' $1 > $2
java -jar $JAR_DIR/compiler.jar --compilation_level=SIMPLE_OPTIMIZATIONS --js="$1" --language_in="$3" >> $2
rm -f "$2"
# copy the first comment block with license information for LibreJS
grep -q '@lic' $1 && sed -n '/\/\*/,/\*\// { p; /\*\//q; }' $1 > $2
java -jar $JAR_DIR/compiler.jar --compilation_level=SIMPLE_OPTIMIZATIONS --js="$1" --language_in="$3" >> $2
}
if [ ! -d "$JS_DIR" ]; then
echo "Directory $JS_DIR not found."
exit 1
echo "Directory $JS_DIR not found."
exit 1
fi
if [ ! -w "$JAR_DIR" ]; then
JAR_DIR=$PWD
JAR_DIR=$PWD
fi
if java -version >/dev/null 2>&1; then
:
:
else
echo "Java not found. Please ensure that the 'java' program is in your PATH."
exit 1
echo "Java not found. Please ensure that the 'java' program is in your PATH."
exit 1
fi
if [ ! -r "$JAR_DIR/compiler.jar" ]; then
if which wget >/dev/null 2>&1 && which unzip >/dev/null 2>&1; then
wget "$CLOSURE_COMPILER_URL" -O "/tmp/$$.zip"
elif which curl >/dev/null 2>&1 && which unzip >/dev/null 2>&1; then
curl "$CLOSURE_COMPILER_URL" -o "/tmp/$$.zip"
else
echo "Please download $CLOSURE_COMPILER_URL and extract compiler.jar to $JAR_DIR/."
exit 1
fi
unzip -p "/tmp/$$.zip" "*.jar" > "$JAR_DIR/compiler.jar"
rm -f "/tmp/$$.zip"
if which wget >/dev/null 2>&1 && which unzip >/dev/null 2>&1; then
wget "$CLOSURE_COMPILER_URL" -O "/tmp/$$.zip"
elif which curl >/dev/null 2>&1 && which unzip >/dev/null 2>&1; then
curl "$CLOSURE_COMPILER_URL" -o "/tmp/$$.zip"
else
echo "Please download $CLOSURE_COMPILER_URL and extract compiler.jar to $JAR_DIR/."
exit 1
fi
unzip -p "/tmp/$$.zip" "*.jar" > "$JAR_DIR/compiler.jar"
rm -f "/tmp/$$.zip"
fi
# compress single file from argument
if [ $# -gt 0 ]; then
JS_DIR=`dirname "$1"`
JS_FILE="$1"
JS_DIR=`dirname "$1"`
JS_FILE="$1"
if [ $# -gt 1 ]; then
LANG_IN="$2"
fi
if [ $# -gt 1 ]; then
LANG_IN="$2"
fi
echo "Shrinking $JS_FILE"
echo "Shrinking $JS_FILE"
minfile=`echo $JS_FILE | sed -e 's/\.js$/\.min\.js/'`
do_shrink "$JS_FILE" "$minfile" "$LANG_IN"
exit
do_shrink "$JS_FILE" "$minfile" "$LANG_IN"
exit
fi
DIRS="$PWD/../program/js $PWD/../skins/* $PWD/../plugins/* $PWD/../plugins/*/skins/* $PWD/../plugins/managesieve/codemirror/lib"

@ -19,6 +19,5 @@ OUTPUTFORMAT=HTML
TEMPLATE=responsive-twig
# make documentation
$BIN_PHPDOC -d $PATH_PROJECT,$PATH_FRAMEWORK -t $PATH_DOCS --title "$TITLE" --defaultpackagename $PACKAGES \
--template=$TEMPLATE
$BIN_PHPDOC -d $PATH_PROJECT,$PATH_FRAMEWORK -t $PATH_DOCS --title "$TITLE" \
--defaultpackagename $PACKAGES --template=$TEMPLATE

@ -2,10 +2,9 @@
<?php
/*
+-----------------------------------------------------------------------+
| bin/moduserprefs.sh |
| |
| This file is part of the Roundcube Webmail client |
| Copyright (C) 2012-2015, The Roundcube Dev Team |
| |
| Copyright (C) The Roundcube Dev Team |
| |
| Licensed under the GNU General Public License version 3 or |
| any later version with exceptions for skins & plugins. |
@ -64,5 +63,3 @@ if ($args['config']) {
}
rcmail_utils::mod_pref($pref_name, $pref_value, $args['user'], $args['type']);
?>

@ -1,5 +1,18 @@
#!/usr/bin/env php
<?php
/*
+-----------------------------------------------------------------------+
| This file is part of the Roundcube Webmail client |
| |
| Copyright (C) The Roundcube Dev Team |
| |
| Licensed under the GNU General Public License version 3 or |
| any later version with exceptions for skins & plugins. |
| See the README file for a full license statement. |
+-----------------------------------------------------------------------+
| Author: Thomas Bruederli <thomas@roundcube.net> |
+-----------------------------------------------------------------------+
*/
define('INSTALL_PATH', realpath(__DIR__ . '/..') . '/' );
ini_set('memory_limit', -1);
@ -8,89 +21,84 @@ require_once INSTALL_PATH.'program/include/clisetup.php';
function print_usage()
{
print "Usage: msgexport -h imap-host -u user-name -m mailbox name\n";
print "--host IMAP host\n";
print "--user IMAP user name\n";
print "--mbox Folder name, set to '*' for all\n";
print "--file Output file\n";
print "Usage: msgexport -h imap-host -u user-name -m mailbox name\n";
print "--host IMAP host\n";
print "--user IMAP user name\n";
print "--mbox Folder name, set to '*' for all\n";
print "--file Output file\n";
}
function vputs($str)
{
$out = $GLOBALS['args']['file'] ? STDOUT : STDERR;
fwrite($out, $str);
$out = $GLOBALS['args']['file'] ? STDOUT : STDERR;
fwrite($out, $str);
}
function progress_update($pos, $max)
{
$percent = round(100 * $pos / $max);
vputs(sprintf("%3d%% [%-51s] %d/%d\033[K\r", $percent, @str_repeat('=', $percent / 2) . '>', $pos, $max));
$percent = round(100 * $pos / $max);
vputs(sprintf("%3d%% [%-51s] %d/%d\033[K\r", $percent, @str_repeat('=', $percent / 2) . '>', $pos, $max));
}
function export_mailbox($mbox, $filename)
{
global $IMAP;
global $IMAP;
$IMAP->set_folder($mbox);
$IMAP->set_folder($mbox);
$index = $IMAP->index($mbox, null, 'ASC');
$count = $index->count();
$index = $index->get();
vputs("Getting message list of {$mbox}...");
vputs("$count messages\n");
if ($filename)
{
if (!($out = fopen($filename, 'w')))
{
vputs("Cannot write to output file\n");
return;
}
vputs("Writing to $filename\n");
}
else
$out = STDOUT;
for ($i = 0; $i < $count; $i++)
{
$headers = $IMAP->get_message_headers($index[$i]);
$from = current(rcube_mime::decode_address_list($headers->from, 1, false));
fwrite($out, sprintf("From %s %s UID %d\n", $from['mailto'], $headers->date, $headers->uid));
$IMAP->get_raw_body($headers->uid, $out);
fwrite($out, "\n\n\n");
progress_update($i+1, $count);
}
vputs("\ncomplete.\n");
if ($filename)
fclose($out);
vputs("Getting message list of {$mbox}...");
vputs("$count messages\n");
if ($filename) {
if (!($out = fopen($filename, 'w'))) {
vputs("Cannot write to output file\n");
return;
}
vputs("Writing to $filename\n");
}
else {
$out = STDOUT;
}
for ($i = 0; $i < $count; $i++) {
$headers = $IMAP->get_message_headers($index[$i]);
$from = current(rcube_mime::decode_address_list($headers->from, 1, false));
fwrite($out, sprintf("From %s %s UID %d\n", $from['mailto'], $headers->date, $headers->uid));
$IMAP->get_raw_body($headers->uid, $out);
fwrite($out, "\n\n\n");
progress_update($i+1, $count);
}
vputs("\ncomplete.\n");
if ($filename) {
fclose($out);
}
}
// get arguments
$opts = array('h' => 'host', 'u' => 'user', 'p' => 'pass', 'm' => 'mbox', 'f' => 'file');
$args = rcube_utils::get_opt($opts) + array('host' => 'localhost', 'mbox' => 'INBOX');
if ($_SERVER['argv'][1] == 'help')
{
print_usage();
exit;
if ($_SERVER['argv'][1] == 'help') {
print_usage();
exit;
}
else if (!$args['host'])
{
vputs("Missing required parameters.\n");
print_usage();
exit;
else if (!$args['host']) {
vputs("Missing required parameters.\n");
print_usage();
exit;
}
// prompt for username if not set
if (empty($args['user']))
{
vputs("IMAP user: ");
$args['user'] = trim(fgets(STDIN));
if (empty($args['user'])) {
vputs("IMAP user: ");
$args['user'] = trim(fgets(STDIN));
}
// prompt for password
@ -99,45 +107,39 @@ $args['pass'] = rcube_utils::prompt_silent("Password: ");
// parse $host URL
$a_host = parse_url($args['host']);
if ($a_host['host'])
{
$host = $a_host['host'];
$imap_ssl = (isset($a_host['scheme']) && in_array($a_host['scheme'], array('ssl','imaps','tls'))) ? TRUE : FALSE;
$imap_port = isset($a_host['port']) ? $a_host['port'] : ($imap_ssl ? 993 : 143);
if ($a_host['host']) {
$host = $a_host['host'];
$imap_ssl = (isset($a_host['scheme']) && in_array($a_host['scheme'], array('ssl','imaps','tls'))) ? TRUE : FALSE;
$imap_port = isset($a_host['port']) ? $a_host['port'] : ($imap_ssl ? 993 : 143);
}
else
{
$host = $args['host'];
$imap_port = 143;
else {
$host = $args['host'];
$imap_port = 143;
}
// instantiate IMAP class
$IMAP = new rcube_imap(null);
// try to connect to IMAP server
if ($IMAP->connect($host, $args['user'], $args['pass'], $imap_port, $imap_ssl))
{
vputs("IMAP login successful.\n");
if ($IMAP->connect($host, $args['user'], $args['pass'], $imap_port, $imap_ssl)) {
vputs("IMAP login successful.\n");
$filename = null;
$mailboxes = $args['mbox'] == '*' ? $IMAP->list_folders(null) : array($args['mbox']);
$filename = null;
$mailboxes = $args['mbox'] == '*' ? $IMAP->list_folders(null) : array($args['mbox']);
foreach ($mailboxes as $mbox)
{
if ($args['file'])
$filename = preg_replace('/\.[a-z0-9]{3,4}$/i', '', $args['file']) . asciiwords($mbox) . '.mbox';
else if ($args['mbox'] == '*')
$filename = asciiwords($mbox) . '.mbox';
foreach ($mailboxes as $mbox) {
if ($args['file'])
$filename = preg_replace('/\.[a-z0-9]{3,4}$/i', '', $args['file']) . asciiwords($mbox) . '.mbox';
else if ($args['mbox'] == '*')
$filename = asciiwords($mbox) . '.mbox';
if ($args['mbox'] == '*' && in_array(strtolower($mbox), array('junk','spam','trash')))
continue;
if ($args['mbox'] == '*' && in_array(strtolower($mbox), array('junk','spam','trash'))) {
continue;
}
export_mailbox($mbox, $filename);
}
export_mailbox($mbox, $filename);
}
}
else
{
vputs("IMAP login failed.\n");
else {
vputs("IMAP login failed.\n");
}
?>

@ -1,5 +1,18 @@
#!/usr/bin/env php
<?php
/*
+-----------------------------------------------------------------------+
| This file is part of the Roundcube Webmail client |
| |
| Copyright (C) The Roundcube Dev Team |
| |
| Licensed under the GNU General Public License version 3 or |
| any later version with exceptions for skins & plugins. |
| See the README file for a full license statement. |
+-----------------------------------------------------------------------+
| Author: Thomas Bruederli <thomas@roundcube.net> |
+-----------------------------------------------------------------------+
*/
define('INSTALL_PATH', realpath(__DIR__ . '/..') . '/' );
ini_set('memory_limit', -1);
@ -8,11 +21,11 @@ require_once INSTALL_PATH.'program/include/clisetup.php';
function print_usage()
{
print "Usage: msgimport -h imap-host -u user-name -m mailbox -f message-file\n";
print "--host IMAP host\n";
print "--user IMAP user name\n";
print "--mbox Target mailbox\n";
print "--file Message file to upload\n";
print "Usage: msgimport -h imap-host -u user-name -m mailbox -f message-file\n";
print "--host IMAP host\n";
print "--user IMAP user name\n";
print "--mbox Target mailbox\n";
print "--file Message file to upload\n";
}
@ -20,94 +33,80 @@ function print_usage()
$opts = array('h' => 'host', 'u' => 'user', 'p' => 'pass', 'm' => 'mbox', 'f' => 'file');
$args = rcube_utils::get_opt($opts) + array('host' => 'localhost', 'mbox' => 'INBOX');
if ($_SERVER['argv'][1] == 'help')
{
print_usage();
exit;
if ($_SERVER['argv'][1] == 'help') {
print_usage();
exit;
}
else if (!($args['host'] && $args['file']))
{
print "Missing required parameters.\n";
print_usage();
exit;
else if (!($args['host'] && $args['file'])) {
print "Missing required parameters.\n";
print_usage();
exit;
}
else if (!is_file($args['file']))
{
rcube::raise_error("Cannot read message file.", false, true);
else if (!is_file($args['file'])) {
rcube::raise_error("Cannot read message file.", false, true);
}
// prompt for username if not set
if (empty($args['user']))
{
//fwrite(STDOUT, "Please enter your name\n");
echo "IMAP user: ";
$args['user'] = trim(fgets(STDIN));
if (empty($args['user'])) {
//fwrite(STDOUT, "Please enter your name\n");
echo "IMAP user: ";
$args['user'] = trim(fgets(STDIN));
}
// prompt for password
if (empty($args['pass']))
{
$args['pass'] = rcube_utils::prompt_silent("Password: ");
if (empty($args['pass'])) {
$args['pass'] = rcube_utils::prompt_silent("Password: ");
}
// parse $host URL
$a_host = parse_url($args['host']);
if ($a_host['host'])
{
$host = $a_host['host'];
$imap_ssl = (isset($a_host['scheme']) && in_array($a_host['scheme'], array('ssl','imaps','tls'))) ? TRUE : FALSE;
$imap_port = isset($a_host['port']) ? $a_host['port'] : ($imap_ssl ? 993 : 143);
if ($a_host['host']) {
$host = $a_host['host'];
$imap_ssl = (isset($a_host['scheme']) && in_array($a_host['scheme'], array('ssl','imaps','tls'))) ? TRUE : FALSE;
$imap_port = isset($a_host['port']) ? $a_host['port'] : ($imap_ssl ? 993 : 143);
}
else
{
$host = $args['host'];
$imap_port = 143;
else {
$host = $args['host'];
$imap_port = 143;
}
// instantiate IMAP class
$IMAP = new rcube_imap(null);
// try to connect to IMAP server
if ($IMAP->connect($host, $args['user'], $args['pass'], $imap_port, $imap_ssl))
{
print "IMAP login successful.\n";
print "Uploading messages...\n";
$count = 0;
$message = $lastline = '';
$fp = fopen($args['file'], 'r');
while (($line = fgets($fp)) !== false)
{
if (preg_match('/^From\s+-/', $line) && $lastline == '')
{
if (!empty($message))
{
if ($IMAP->save_message($args['mbox'], rtrim($message)))
$count++;
else
rcube::raise_error("Failed to save message to {$args['mbox']}", false, true);
$message = '';
}
continue;
}
$message .= $line;
$lastline = rtrim($line);
}
if (!empty($message) && $IMAP->save_message($args['mbox'], rtrim($message)))
$count++;
// upload message from file
if ($count)
print "$count messages successfully added to {$args['mbox']}.\n";
else
print "Adding messages failed!\n";
if ($IMAP->connect($host, $args['user'], $args['pass'], $imap_port, $imap_ssl)) {
print "IMAP login successful.\n";
print "Uploading messages...\n";
$count = 0;
$message = $lastline = '';
$fp = fopen($args['file'], 'r');
while (($line = fgets($fp)) !== false) {
if (preg_match('/^From\s+-/', $line) && $lastline == '') {
if (!empty($message)) {
if ($IMAP->save_message($args['mbox'], rtrim($message)))
$count++;
else
rcube::raise_error("Failed to save message to {$args['mbox']}", false, true);
$message = '';
}
continue;
}
$message .= $line;
$lastline = rtrim($line);
}
if (!empty($message) && $IMAP->save_message($args['mbox'], rtrim($message)))
$count++;
// upload message from file
if ($count)
print "$count messages successfully added to {$args['mbox']}.\n";
else
print "Adding messages failed!\n";
}
else
{
rcube::raise_error("IMAP login failed.", false, true);
else {
rcube::raise_error("IMAP login failed.", false, true);
}
?>

@ -2,10 +2,9 @@
<?php
/*
+-----------------------------------------------------------------------+
| bin/package2composer.sh |
| |
| This file is part of the Roundcube Webmail client |
| Copyright (C) 2013, The Roundcube Dev Team |
| |
| Copyright (C) The Roundcube Dev Team |
| |
| Licensed under the GNU General Public License version 3 or |
| any later version with exceptions for skins & plugins. |
@ -13,7 +12,6 @@
| |
| PURPOSE: |
| Convert a plugin's package.xml file into a composer.json description |
| |
+-----------------------------------------------------------------------+
| Author: Thomas Bruederli <thomas@roundcube.net> |
+-----------------------------------------------------------------------+
@ -97,7 +95,7 @@ else if (defined('JSON_PRETTY_PRINT')) {
echo json_encode($data, $flags);
}
else {
fputs(STDERR,
fwrite(STDERR,
"FAILED! composer.phar not found in current directory.
Please download it from http://getcomposer.org/download/ or with
@ -106,4 +104,3 @@ Please download it from http://getcomposer.org/download/ or with
}
echo "\n";

@ -2,10 +2,9 @@
<?php
/*
+-----------------------------------------------------------------------+
| bin/update.sh |
| |
| This file is part of the Roundcube Webmail client |
| Copyright (C) 2010-2015, The Roundcube Dev Team |
| |
| Copyright (C) The Roundcube Dev Team |
| |
| Licensed under the GNU General Public License version 3 or |
| any later version with exceptions for skins & plugins. |
@ -28,249 +27,267 @@ $opts = rcube_utils::get_opt(array('v' => 'version', 'y' => 'accept:bool'));
// ask user if no version is specified
if (!$opts['version']) {
echo "What version are you upgrading from? Type '?' if you don't know.\n";
if (($input = trim(fgets(STDIN))) && preg_match('/^[0-9.]+[a-z-]*$/', $input))
$opts['version'] = $input;
else
$opts['version'] = RCMAIL_VERSION;
echo "What version are you upgrading from? Type '?' if you don't know.\n";
if (($input = trim(fgets(STDIN))) && preg_match('/^[0-9.]+[a-z0-9-]*$/', $input)) {
$opts['version'] = $input;
}
else {
$opts['version'] = RCMAIL_VERSION;
}
}
$RCI = rcmail_install::get_instance();
$RCI->load_config();
if ($RCI->configured) {
$success = true;
if (($messages = $RCI->check_config()) || $RCI->legacy_config) {
$success = false;
$err = 0;
// list old/replaced config options
if (is_array($messages['replaced'])) {
echo "WARNING: Replaced config options:\n";
echo "(These config options have been replaced or renamed)\n";
foreach ($messages['replaced'] as $msg) {
echo "- '" . $msg['prop'] . "' was replaced by '" . $msg['replacement'] . "'\n";
$err++;
}
echo "\n";
}
$success = true;
// list obsolete config options (just a notice)
if (is_array($messages['obsolete'])) {
echo "NOTICE: Obsolete config options:\n";
echo "(You still have some obsolete or inexistent properties set. This isn't a problem but should be noticed)\n";
if (($messages = $RCI->check_config($opts['version'])) || $RCI->legacy_config) {
$success = false;
$err = 0;
foreach ($messages['obsolete'] as $msg) {
echo "- '" . $msg['prop'] . ($msg['name'] ? "': " . $msg['name'] : "'") . "\n";
$err++;
}
echo "\n";
}
if (!$err && $RCI->legacy_config) {
echo "WARNING: Your configuration needs to be migrated!\n";
echo "We changed the configuration files structure and your two config files main.inc.php and db.inc.php have to be merged into one single file.\n";
$err++;
}
// list old/replaced config options
if (is_array($messages['replaced'])) {
echo "WARNING: Replaced config options:\n";
echo "(These config options have been replaced or renamed)\n";
// ask user to update config files
if ($err) {
if (!$opts['accept']) {
echo "Do you want me to fix your local configuration? (y/N)\n";
$input = trim(fgets(STDIN));
}
// positive: let's merge the local config with the defaults
if ($opts['accept'] || strtolower($input) == 'y') {
$error = $written = false;
foreach ($messages['replaced'] as $msg) {
echo "- '" . $msg['prop'] . "' was replaced by '" . $msg['replacement'] . "'\n";
$err++;
}
}
// backup current config
echo ". backing up the current config file(s)...\n";
// list obsolete config options (just a notice)
if (is_array($messages['obsolete'])) {
echo "NOTICE: Obsolete config options:\n";
echo "(You still have some obsolete or inexistent properties set."
. " This isn't a problem but should be noticed)\n";
foreach (array('config', 'main', 'db') as $file) {
if (file_exists(RCMAIL_CONFIG_DIR . '/' . $file . '.inc.php')) {
if (!copy(RCMAIL_CONFIG_DIR . '/' . $file . '.inc.php', RCMAIL_CONFIG_DIR . '/' . $file . '.old.php')) {
$error = true;
foreach ($messages['obsolete'] as $msg) {
echo "- '" . $msg['prop'] . ($msg['name'] ? "': " . $msg['name'] : "'") . "\n";
$err++;
}
}
}
if (!$error) {
$RCI->merge_config();
echo ". writing " . RCMAIL_CONFIG_DIR . "/config.inc.php...\n";
$written = $RCI->save_configfile($RCI->create_config());
if (!$err && $RCI->legacy_config) {
echo "WARNING: Your configuration needs to be migrated!\n";
echo "We changed the configuration files structure and your two config files "
. "main.inc.php and db.inc.php have to be merged into one single file.\n";
$err++;
}
// Success!
if ($written) {
echo "Done.\n";
echo "Your configuration files are now up-to-date!\n";
// ask user to update config files
if ($err) {
if (!$opts['accept']) {
echo "Do you want me to fix your local configuration? (y/N)\n";
$input = trim(fgets(STDIN));
}
if ($messages['missing']) {
echo "But you still need to add the following missing options:\n";
foreach ($messages['missing'] as $msg)
echo "- '" . $msg['prop'] . ($msg['name'] ? "': " . $msg['name'] : "'") . "\n";
}
// positive: merge the local config with the defaults
if ($opts['accept'] || strtolower($input) == 'y') {
$error = $written = false;
echo ". backing up the current config file(s)...\n";
foreach (array('config', 'main', 'db') as $file) {
if (file_exists(RCMAIL_CONFIG_DIR . '/' . $file . '.inc.php')) {
if (!copy(RCMAIL_CONFIG_DIR . '/' . $file . '.inc.php', RCMAIL_CONFIG_DIR . '/' . $file . '.old.php')) {
$error = true;
}
}
}
if (!$error) {
$RCI->merge_config();
echo ". writing " . RCMAIL_CONFIG_DIR . "/config.inc.php...\n";
$written = $RCI->save_configfile($RCI->create_config());
}
// Success!
if ($written) {
echo "Done.\n";
echo "Your configuration files are now up-to-date!\n";
if ($messages['missing']) {
echo "But you still need to add the following missing options:\n";
foreach ($messages['missing'] as $msg) {
echo "- '" . $msg['prop'] . ($msg['name'] ? "': " . $msg['name'] : "'") . "\n";
}
}
if ($RCI->legacy_config) {
foreach (array('main', 'db') as $file) {
@unlink(RCMAIL_CONFIG_DIR . '/' . $file . '.inc.php');
}
}
}
else {
echo "Failed to write config file(s)!\n";
echo "Grant write privileges to the current user or update the files manually "
. "according to the above messages.\n";
}
}
else {
echo "Please update your config files manually according to the above messages.\n";
}
}
if ($RCI->legacy_config) {
foreach (array('main', 'db') as $file) {
@unlink(RCMAIL_CONFIG_DIR . '/' . $file . '.inc.php');
// list of config options with changed default (just a notice)
if (!empty($messages['defaults'])) {
echo "WARNING: Changed defaults (These config options have new default values):\n";
foreach ($messages['defaults'] as $opt) {
echo "- '{$opt}'\n";
}
}
}
else {
echo "Failed to write config file(s)!\n";
echo "Grant write privileges to the current user or update the files manually according to the above messages.\n";
// check dependencies based on the current configuration
if (is_array($messages['dependencies'])) {
echo "WARNING: Dependency check failed!\n";
echo "(Some of your configuration settings require other options to be configured "
. "or additional PHP modules to be installed)\n";
foreach ($messages['dependencies'] as $msg) {
echo "- " . $msg['prop'] . ': ' . $msg['explain'] . "\n";
}
echo "Please fix your config files and run this script again!\n";
echo "See ya.\n";
}
}
else {
echo "Please update your config files manually according to the above messages.\n";
}
}
// check dependencies based on the current configuration
if (is_array($messages['dependencies'])) {
echo "WARNING: Dependency check failed!\n";
echo "(Some of your configuration settings require other options to be configured or additional PHP modules to be installed)\n";
foreach ($messages['dependencies'] as $msg) {
echo "- " . $msg['prop'] . ': ' . $msg['explain'] . "\n";
}
echo "Please fix your config files and run this script again!\n";
echo "See ya.\n";
// check file type detection
if ($RCI->check_mime_detection()) {
echo "WARNING: File type detection doesn't work properly!\n";
echo "Please check the 'mime_magic' config option or the finfo functions of PHP and run this script again.\n";
}
}
// check file type detection
if ($RCI->check_mime_detection()) {
echo "WARNING: File type detection doesn't work properly!\n";
echo "Please check the 'mime_magic' config option or the finfo functions of PHP and run this script again.\n";
}
if ($RCI->check_mime_extensions()) {
echo "WARNING: Mimetype to file extension mapping doesn't work properly!\n";
echo "Please check the 'mime_types' config option and run this script again.\n";
}
// check database schema
if ($RCI->config['db_dsnw']) {
echo "Executing database schema update.\n";
$success = rcmail_utils::db_update(INSTALL_PATH . 'SQL', 'roundcube', $opts['version'],
array('errors' => true));
}
// update composer dependencies
if (is_file(INSTALL_PATH . 'composer.json') && is_readable(INSTALL_PATH . 'composer.json-dist')) {
$composer_data = json_decode(file_get_contents(INSTALL_PATH . 'composer.json'), true);
$composer_template = json_decode(file_get_contents(INSTALL_PATH . 'composer.json-dist'), true);
$comsposer_json = null;
// update the require section with the new dependencies
if (is_array($composer_data['require']) && is_array($composer_template['require'])) {
$composer_data['require'] = array_merge($composer_data['require'], $composer_template['require']);
// remove obsolete packages
$old_packages = array(
'pear-pear.php.net/net_socket',
'pear-pear.php.net/auth_sasl',
'pear-pear.php.net/net_idna2',
'pear-pear.php.net/mail_mime',
'pear-pear.php.net/net_smtp',
'pear-pear.php.net/crypt_gpg',
'pear-pear.php.net/net_sieve',
'pear/mail_mime-decode',
'roundcube/net_sieve',
'endroid/qrcode',
);
foreach ($old_packages as $pkg) {
if (array_key_exists($pkg, $composer_data['require'])) {
unset($composer_data['require'][$pkg]);
}
}
if ($RCI->check_mime_extensions()) {
echo "WARNING: Mimetype to file extension mapping doesn't work properly!\n";
echo "Please check the 'mime_types' config option and run this script again.\n";
}
// check database schema
if ($RCI->config['db_dsnw']) {
echo "Executing database schema update.\n";
$success = rcmail_utils::db_update(INSTALL_PATH . 'SQL', 'roundcube', $opts['version'],
array('errors' => true));
}
// update the repositories section with the new dependencies
if (is_array($composer_template['repositories'])) {
if (!is_array($composer_data['repositories'])) {
$composer_data['repositories'] = array();
}
foreach ($composer_template['repositories'] as $repo) {
$rkey = $repo['type'] . preg_replace('/^https?:/', '', $repo['url']) . $repo['package']['name'];
$existing = false;
foreach ($composer_data['repositories'] as $k => $_repo) {
if ($rkey == $_repo['type'] . preg_replace('/^https?:/', '', $_repo['url']) . $_repo['package']['name']) {
// switch to https://
if (isset($_repo['url']) && strpos($_repo['url'], 'http://') === 0)
$composer_data['repositories'][$k]['url'] = 'https:' . substr($_repo['url'], 5);
$existing = true;
break;
}
// remove old repos
else if (strpos($_repo['url'], 'git://git.kolab.org') === 0) {
unset($composer_data['repositories'][$k]);
}
else if ($_repo['type'] == 'package' && $_repo['package']['name'] == 'Net_SMTP') {
unset($composer_data['repositories'][$k]);
}
// update composer dependencies
if (is_file(INSTALL_PATH . 'composer.json') && is_readable(INSTALL_PATH . 'composer.json-dist')) {
$composer_data = json_decode(file_get_contents(INSTALL_PATH . 'composer.json'), true);
$composer_template = json_decode(file_get_contents(INSTALL_PATH . 'composer.json-dist'), true);
$comsposer_json = null;
// update the require section with the new dependencies
if (is_array($composer_data['require']) && is_array($composer_template['require'])) {
$composer_data['require'] = array_merge($composer_data['require'], $composer_template['require']);
// remove obsolete packages
$old_packages = array(
'pear-pear.php.net/net_socket',
'pear-pear.php.net/auth_sasl',
'pear-pear.php.net/net_idna2',
'pear-pear.php.net/mail_mime',
'pear-pear.php.net/net_smtp',
'pear-pear.php.net/crypt_gpg',
'pear-pear.php.net/net_sieve',
'pear/mail_mime-decode',
'roundcube/net_sieve',
'endroid/qrcode',
);
foreach ($old_packages as $pkg) {
if (array_key_exists($pkg, $composer_data['require'])) {
unset($composer_data['require'][$pkg]);
}
}
}
if (!$existing) {
$composer_data['repositories'][] = $repo;
// update the repositories section with the new dependencies
if (is_array($composer_template['repositories'])) {
if (!is_array($composer_data['repositories'])) {
$composer_data['repositories'] = array();
}
foreach ($composer_template['repositories'] as $repo) {
$rkey = $repo['type'] . preg_replace('/^https?:/', '', $repo['url']) . $repo['package']['name'];
$existing = false;
foreach ($composer_data['repositories'] as $k => $_repo) {
if ($rkey == $_repo['type'] . preg_replace('/^https?:/', '', $_repo['url']) . $_repo['package']['name']) {
// switch to https://
if (isset($_repo['url']) && strpos($_repo['url'], 'http://') === 0) {
$composer_data['repositories'][$k]['url'] = 'https:' . substr($_repo['url'], 5);
}
$existing = true;
break;
}
// remove old repos
if (strpos($_repo['url'], 'git://git.kolab.org') === 0) {
unset($composer_data['repositories'][$k]);
}
else if ($_repo['type'] == 'package' && $_repo['package']['name'] == 'Net_SMTP') {
unset($composer_data['repositories'][$k]);
}
}
if (!$existing) {
$composer_data['repositories'][] = $repo;
}
}
$composer_data['repositories'] = array_values($composer_data['repositories']);
}
}
$composer_data['repositories'] = array_values($composer_data['repositories']);
}
// use the JSON encoder from the Composer package
if (is_file('composer.phar')) {
include 'phar://composer.phar/src/Composer/Json/JsonFile.php';
$comsposer_json = \Composer\Json\JsonFile::encode($composer_data);
}
// PHP 5.4's json_encode() does the job, too
else if (defined('JSON_PRETTY_PRINT')) {
$comsposer_json = json_encode($composer_data, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES);
}
else {
$success = false;
$comsposer_json = null;
}
// use the JSON encoder from the Composer package
if (is_file('composer.phar')) {
include 'phar://composer.phar/src/Composer/Json/JsonFile.php';
$comsposer_json = \Composer\Json\JsonFile::encode($composer_data);
}
// PHP 5.4's json_encode() does the job, too
else if (defined('JSON_PRETTY_PRINT')) {
$comsposer_json = json_encode($composer_data, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES);
}
else {
$success = false;
$comsposer_json = null;
}
// write updated composer.json back to disk
if ($comsposer_json && is_writeable(INSTALL_PATH . 'composer.json')) {
$success &= (bool)file_put_contents(INSTALL_PATH . 'composer.json', $comsposer_json);
}
else {
echo "WARNING: unable to update composer.json!\n";
echo "Please replace the 'require' section in your composer.json with the following:\n";
// write updated composer.json back to disk
if ($comsposer_json && is_writeable(INSTALL_PATH . 'composer.json')) {
$success &= (bool)file_put_contents(INSTALL_PATH . 'composer.json', $comsposer_json);
}
else {
echo "WARNING: unable to update composer.json!\n";
echo "Please replace the 'require' section in your composer.json with the following:\n";
$require_json = '';
foreach ($composer_data['require'] as $pkg => $ver) {
$require_json .= sprintf(' "%s": "%s",'."\n", $pkg, $ver);
}
$require_json = '';
foreach ($composer_data['require'] as $pkg => $ver) {
$require_json .= sprintf(' "%s": "%s",'."\n", $pkg, $ver);
}
echo ' "require": {'."\n";
echo rtrim($require_json, ",\n");
echo "\n }\n\n";
}
echo ' "require": {'."\n";
echo rtrim($require_json, ",\n");
echo "\n }\n\n";
echo "NOTICE: Update dependencies by running `php composer.phar update --no-dev`\n";
}
echo "NOTE: Update dependencies by running `php composer.phar update --no-dev`\n";
}
// index contacts for fulltext searching
if ($opts['version'] && version_compare(version_parse($opts['version']), '0.6.0', '<')) {
rcmail_utils::indexcontacts();
}
// index contacts for fulltext searching
if ($opts['version'] && version_compare(version_parse($opts['version']), '0.6.0', '<')) {
rcmail_utils::indexcontacts();
}
if ($success) {
echo "This instance of Roundcube is up-to-date.\n";
echo "Have fun!\n";
}
if ($success) {
echo "This instance of Roundcube is up-to-date.\n";
echo "Have fun!\n";
}
}
else {
echo "This instance of Roundcube is not yet configured!\n";
echo "Open http://url-to-roundcube/installer/ in your browser and follow the instuctions.\n";
echo "This instance of Roundcube is not yet configured!\n";
echo "Open http://url-to-roundcube/installer/ in your browser and follow the instuctions.\n";
}
?>

@ -2,10 +2,9 @@
<?php
/*
+-----------------------------------------------------------------------+
| bin/updatecss.sh |
| |
| This file is part of the Roundcube Webmail client |
| Copyright (C) 2010-2013, The Roundcube Dev Team |
| |
| Copyright (C) The Roundcube Dev Team |
| |
| Licensed under the GNU General Public License version 3 or |
| any later version with exceptions for skins & plugins. |
@ -118,5 +117,3 @@ function get_files($dir)
return $files;
}
?>

@ -2,11 +2,10 @@
<?php
/*
+-----------------------------------------------------------------------+
| bin/updatedb.sh |
| |
| This file is part of the Roundcube Webmail client |
| Copyright (C) 2010-2012, The Roundcube Dev Team |
| Copyright (C) 2010-2012, Kolab Systems AG |
| |
| Copyright (C) The Roundcube Dev Team |
| Copyright (C) Kolab Systems AG |
| |
| Licensed under the GNU General Public License version 3 or |
| any later version with exceptions for skins & plugins. |
@ -38,5 +37,3 @@ if (empty($opts['package'])) {
}
rcmail_utils::db_update($opts['dir'], $opts['package'], $opts['version'], array('errors' => true));
?>

@ -18,15 +18,14 @@
"pear/crypt_gpg": "~1.6.3",
"pear/net_sieve": "~1.4.3",
"roundcube/plugin-installer": "~0.1.6",
"masterminds/html5": "~2.3.0",
"masterminds/html5": "~2.5.0",
"endroid/qr-code": "~1.6.5"
},
"require-dev": {
"phpunit/phpunit": "^4.8.36 || ^5.7.21"
"phpunit/phpunit": "^4.8.36 || ^5.7.21 || ^6 || ^7"
},
"suggest": {
"pear/net_ldap2": "~2.2.0 required for connecting to LDAP",
"kolab/net_ldap3": "~1.0.6 required for connecting to LDAP",
"kolab/net_ldap3": "~1.1.1 required for connecting to LDAP",
"mkopinsky/zxcvbn-php": "^4.4.2 required for Zxcvbn password strength driver"
}
}

@ -9,7 +9,7 @@
| from defaults.inc.php to this file to override the defaults. |
| |
| This file is part of the Roundcube Webmail client |
| Copyright (C) 2005-2013, The Roundcube Dev Team |
| Copyright (C) The Roundcube Dev Team |
| |
| Licensed under the GNU General Public License version 3 or |
| any later version with exceptions for skins & plugins. |
@ -30,7 +30,8 @@ $config['db_dsnw'] = 'mysql://roundcube:pass@localhost/roundcubemail';
// The IMAP host chosen to perform the log-in.
// Leave blank to show a textbox at login, give a list of hosts
// to display a pulldown menu or set one host as string.
// To use SSL/TLS connection, enter hostname with prefix ssl:// or tls://
// Enter hostname with prefix ssl:// to use Implicit TLS, or use
// prefix tls:// to use STARTTLS.
// Supported replacement variables:
// %n - hostname ($_SERVER['SERVER_NAME'])
// %t - hostname without the first part
@ -40,8 +41,8 @@ $config['db_dsnw'] = 'mysql://roundcube:pass@localhost/roundcubemail';
$config['default_host'] = 'localhost';
// SMTP server host (for sending mails).
// Enter hostname with prefix tls:// to use STARTTLS, or use
// prefix ssl:// to use the deprecated SSL over SMTP (aka SMTPS)
// Enter hostname with prefix ssl:// to use Implicit TLS, or use
// prefix tls:// to use STARTTLS.
// Supported replacement variables:
// %h - user's IMAP hostname
// %n - hostname ($_SERVER['SERVER_NAME'])
@ -49,10 +50,11 @@ $config['default_host'] = 'localhost';
// %d - domain (http hostname $_SERVER['HTTP_HOST'] without the first part)
// %z - IMAP domain (IMAP hostname without the first part)
// For example %n = mail.domain.tld, %t = domain.tld
// To specify differnt SMTP servers for different IMAP hosts provide an array
// of IMAP host (no prefix or port) and SMTP server e.g. array('imap.example.com' => 'smtp.example.net')
$config['smtp_server'] = 'localhost';
// SMTP port (default is 25; use 587 for STARTTLS or 465 for the
// deprecated SSL over SMTP (aka SMTPS))
// SMTP port. Use 25 for cleartext, 465 for Implicit TLS, or 587 for STARTTLS (default)
$config['smtp_port'] = 587;
// SMTP username (if required) if you use %u as the username Roundcube
@ -70,9 +72,9 @@ $config['support_url'] = '';
// Name your service. This is displayed on the login screen and in the window title
$config['product_name'] = 'Roundcube Webmail';
// this key is used to encrypt the users imap password which is stored
// in the session record (and the client cookie if remember password is enabled).
// please provide a string of exactly 24 chars.
// This key is used to encrypt the users imap password which is stored
// in the session record. For the default cipher method it must be
// exactly 24 characters long.
// YOUR KEY MUST BE DIFFERENT THAN THE SAMPLE VALUE FOR SECURITY REASONS
$config['des_key'] = 'rcmail-!24ByteDESkey*Str';
@ -83,4 +85,4 @@ $config['plugins'] = array(
);
// skin name: folder from skins/
$config['skin'] = 'larry';
$config['skin'] = 'elastic';

@ -9,7 +9,7 @@
| Default settings for all configuration options |
| |
| This file is part of the Roundcube Webmail client |
| Copyright (C) 2005-2018, The Roundcube Dev Team |
| Copyright (C) The Roundcube Dev Team |
| |
| Licensed under the GNU General Public License version 3 or |
| any later version with exceptions for skins & plugins. |
@ -27,8 +27,12 @@ $config = array();
// Format (compatible with PEAR MDB2): db_provider://user:password@host/database
// Currently supported db_providers: mysql, pgsql, sqlite, mssql, sqlsrv, oracle
// For examples see http://pear.php.net/manual/en/package.database.mdb2.intro-dsn.php
// NOTE: for SQLite use absolute path (Linux): 'sqlite:////full/path/to/sqlite.db?mode=0646'
// Note: for SQLite use absolute path (Linux): 'sqlite:////full/path/to/sqlite.db?mode=0646'
// or (Windows): 'sqlite:///C:/full/path/to/sqlite.db'
// Note: Various drivers support various additional arguments for connection,
// for Mysql: key, cipher, cert, capath, ca, verify_server_cert,
// for Postgres: application_name, sslmode, sslcert, sslkey, sslrootcert, sslcrl, sslcompression, service.
// e.g. 'mysql://roundcube:@localhost/roundcubemail?verify_server_cert=false'
$config['db_dsnw'] = 'mysql://roundcube:@localhost/roundcubemail';
// Database DSN for read-only operations (if empty write database will be used)
@ -92,34 +96,34 @@ $config['syslog_facility'] = LOG_USER;
// Data will only be logged if a directory <log_dir>/<username>/ exists and is writable.
$config['per_user_logging'] = false;
// Log sent messages to <log_dir>/sendmail or to syslog
// Log sent messages to <log_dir>/sendmail.log or to syslog
$config['smtp_log'] = true;
// Log successful/failed logins to <log_dir>/userlogins or to syslog
// Log successful/failed logins to <log_dir>/userlogins.log or to syslog
$config['log_logins'] = false;
// Log session authentication errors to <log_dir>/session or to syslog
$config['log_session'] = false;
// Log session debug information/authentication errors to <log_dir>/session.log or to syslog
$config['session_debug'] = false;
// Log SQL queries to <log_dir>/sql or to syslog
// Log SQL queries to <log_dir>/sql.log or to syslog
$config['sql_debug'] = false;
// Log IMAP conversation to <log_dir>/imap or to syslog
// Log IMAP conversation to <log_dir>/imap.log or to syslog
$config['imap_debug'] = false;
// Log LDAP conversation to <log_dir>/ldap or to syslog
// Log LDAP conversation to <log_dir>/ldap.log or to syslog
$config['ldap_debug'] = false;
// Log SMTP conversation to <log_dir>/smtp or to syslog
// Log SMTP conversation to <log_dir>/smtp.log or to syslog
$config['smtp_debug'] = false;
// Log Memcache conversation to <log_dir>/memcache or to syslog
// Log Memcache conversation to <log_dir>/memcache.log or to syslog
$config['memcache_debug'] = false;
// Log APC conversation to <log_dir>/apc or to syslog
// Log APC conversation to <log_dir>/apc.log or to syslog
$config['apc_debug'] = false;
// Log Redis conversation to <log_dir>/redis or to syslog
// Log Redis conversation to <log_dir>/redis.log or to syslog
$config['redis_debug'] = false;
@ -130,7 +134,8 @@ $config['redis_debug'] = false;
// The IMAP host chosen to perform the log-in.
// Leave blank to show a textbox at login, give a list of hosts
// to display a pulldown menu or set one host as string.
// To use SSL/TLS connection, enter hostname with prefix ssl:// or tls://
// Enter hostname with prefix ssl:// to use Implicit TLS, or use
// prefix tls:// to use STARTTLS.
// Supported replacement variables:
// %n - hostname ($_SERVER['SERVER_NAME'])
// %t - hostname without the first part
@ -177,7 +182,7 @@ $config['imap_delimiter'] = null;
// If you know your imap's folder vendor, you can specify it here.
// Otherwise it will be determined automatically. Use lower-case
// identifiers, e.g. 'dovecot', 'cyrus', 'gmail', 'hmail', 'uw-imap'.
// identifiers, e.g. 'dovecot', 'cyrus', 'gimap', 'hmail', 'uw-imap'.
$config['imap_vendor'] = null;
// If IMAP server doesn't support NAMESPACE extension, but you're
@ -228,7 +233,7 @@ $config['imap_disabled_caps'] = array();
// This is used to relate IMAP session with Roundcube user sessions
$config['imap_log_session'] = false;
// Type of IMAP indexes cache. Supported values: 'db', 'apc' and 'memcache'.
// Type of IMAP indexes cache. Supported values: 'db', 'apc' and 'memcache' or 'memcached'.
$config['imap_cache'] = null;
// Enables messages cache. Only 'db' cache is supported.
@ -253,8 +258,8 @@ $config['messages_cache_threshold'] = 50;
// ----------------------------------
// SMTP server host (for sending mails).
// Enter hostname with prefix tls:// to use STARTTLS, or use
// prefix ssl:// to use the deprecated SSL over SMTP (aka SMTPS)
// Enter hostname with prefix ssl:// to use Implicit TLS, or use
// prefix tls:// to use STARTTLS.
// Supported replacement variables:
// %h - user's IMAP hostname
// %n - hostname ($_SERVER['SERVER_NAME'])
@ -262,9 +267,11 @@ $config['messages_cache_threshold'] = 50;
// %d - domain (http hostname $_SERVER['HTTP_HOST'] without the first part)
// %z - IMAP domain (IMAP hostname without the first part)
// For example %n = mail.domain.tld, %t = domain.tld
// To specify differnt SMTP servers for different IMAP hosts provide an array
// of IMAP host (no prefix or port) and SMTP server e.g. array('imap.example.com' => 'smtp.example.net')
$config['smtp_server'] = 'localhost';
// SMTP port (default is 587)
// SMTP port. Use 25 for cleartext, 465 for Implicit TLS, or 587 for STARTTLS (default)
$config['smtp_port'] = 587;
// SMTP username (if required) if you use %u as the username Roundcube
@ -315,7 +322,7 @@ $config['smtp_conn_options'] = null;
// LDAP
// ----------------------------------
// Type of LDAP cache. Supported values: 'db', 'apc' and 'memcache'.
// Type of LDAP cache. Supported values: 'db', 'apc' and 'memcache' or 'memcached'.
$config['ldap_cache'] = 'db';
// Lifetime of LDAP cache. Possible units: s, m, h, d, w
@ -328,7 +335,8 @@ $config['ldap_cache_ttl'] = '10m';
// Use these hosts for accessing memcached
// Define any number of hosts in the form of hostname:port or unix:///path/to/socket.file
$config['memcache_hosts'] = null; // e.g. array( 'localhost:11211', '192.168.1.12:11211', 'unix:///var/tmp/memcached.sock' );
// Example: array('localhost:11211', '192.168.1.12:11211', 'unix:///var/tmp/memcached.sock');
$config['memcache_hosts'] = null;
// Controls the use of a persistent connections to memcache servers
// See http://php.net/manual/en/memcache.addserver.php
@ -343,11 +351,15 @@ $config['memcache_timeout'] = 1;
// See http://php.net/manual/en/memcache.addserver.php
$config['memcache_retry_interval'] = 15;
// use these hosts for accessing Redis.
// Currently only one host is supported. cluster support may come in a future release.
// You can pass 4 fields, host, port, database and password.
// Unset fields will be set to the default values host=127.0.0.1, port=6379, database=0, password= (empty)
$config['redis_hosts'] = null; // e.g. array( 'localhost:6379' ); array( '192.168.1.1:6379:1:secret' );
// Use these hosts for accessing Redis.
// Currently only one host is supported. Cluster support may come in a future release.
// You can pass 4 fields, host, port (optional), database (optional) and password (optional).
// Unset fields will be set to the default values host=127.0.0.1, port=6379.
// Examples:
// array('localhost:6379');
// array('192.168.1.1:6379:1:secret');
// array('unix:///var/run/redis/redis-server.sock:1:secret');
$config['redis_hosts'] = null;
// Maximum size of an object in memcache (in bytes). Default: 2MB
$config['memcache_max_allowed_packet'] = '2M';
@ -381,16 +393,37 @@ $config['advanced_prefs'] = array();
// PLEASE DO NOT LINK TO THE ROUNDCUBE.NET WEBSITE HERE!
$config['support_url'] = '';
// replace Roundcube logo with this image
// specify an URL relative to the document root of this Roundcube installation
// an array can be used to specify different logos for specific template files
// '*' for default logo
// ':favicon' for favicon
// ':print' for logo on all print templates (e.g. messageprint, contactprint)
// ':small' for small screen logo in Elastic
// different logos can be specified for different skins by prefixing the skin name to the array key
// config applied in order: <skin>:<template>, <skin>:*, <template>, *
// for example array("*" => "/images/roundcube_logo.png", "messageprint" => "/images/roundcube_logo_print.png", "elastic:*" => "/images/logo.png")
// Logo image replacement. Specifies location of the image as:
// - URL relative to the document root of this Roundcube installation
// - full URL with http:// or https:// prefix
// - URL relative to the current skin folder (when starts with a '/')
//
// An array can be used to specify different logos for specific template files
// The array key specifies the place(s) the logo should be applied to and
// is made up of (up to) 3 parts:
// - skin name prefix (always with colon, can be replaced with *)
// - template name (or * for all templates)
// - logo type - it is used for logos used on multiple templates
// the available types include '[favicon]' for favicon, '[print]' for logo on all print
// templates (e.g. messageprint, contactprint) and '[small]' for small screen logo in supported skins
//
// Example config for skin_logo
/*
array(
// show the image /images/logo_login_small.png for the Login screen in the Elastic skin on small screens
"elastic:login[small]" => "/images/logo_login_small.png",
// show the image /images/logo_login.png for the Login screen in the Elastic skin
"elastic:login" => "/images/logo_login.png",
// show the image /images/logo_small.png in the Elastic skin
"elastic:*[small]" => "/images/logo_small.png",
// show the image /images/larry.png in the Larry skin
"larry:*" => "/images/larry.png",
// show the image /images/logo_login.png on the login template in all skins
"login" => "/images/logo_login.png",
// show the image /images/logo_print.png for all print type logos in all skins
"[print]" => "/images/logo_print.png",
);
*/
$config['skin_logo'] = null;
// automatically create a new Roundcube user when log-in the first time.
@ -471,13 +504,19 @@ $config['session_auth_name'] = null;
// Session path. Defaults to PHP session.cookie_path setting.
$config['session_path'] = null;
// Session samesite. Defaults to PHP session.cookie_samesite setting.
// Requires PHP >= 7.3.0, see https://wiki.php.net/rfc/same-site-cookie for more info
// Possible values: null (default), 'Lax', or 'Strict'
$config['session_samesite'] = null;
// Backend to use for session storage. Can either be 'db' (default), 'redis', 'memcache', or 'php'
//
// If set to 'memcache', a list of servers need to be specified in 'memcache_hosts'
// Make sure the Memcache extension (http://pecl.php.net/package/memcache) version >= 2.0.0 is installed
// If set to 'memcache' or 'memcached', a list of servers need to be specified in 'memcache_hosts'
// Make sure the Memcache extension (https://pecl.php.net/package/memcache) version >= 2.0.0
// or the Memcached extension (https://pecl.php.net/package/memcached) version >= 2.0.0 is installed.
//
// If set to 'redis', a server needs to be specified in 'redis_hosts'
// Make sure the Redis extension (http://pecl.php.net/package/redis) version >= 2.0.0 is installed
// Make sure the Redis extension (https://pecl.php.net/package/redis) version >= 2.0.0 is installed.
//
// Setting this value to 'php' will use the default session save handler configured in PHP
$config['session_storage'] = 'db';
@ -505,9 +544,10 @@ $config['x_frame_options'] = 'sameorigin';
// This key is used for encrypting purposes, like storing of imap password
// in the session. For historical reasons it's called DES_key, but it's used
// with any configured cipher_method (see below).
// For the default cipher_method a required key length is 24 characters.
$config['des_key'] = 'rcmail-!24ByteDESkey*Str';
// Encryption algorithm. You can use any method supported by openssl.
// Encryption algorithm. You can use any method supported by OpenSSL.
// Default is set for backward compatibility to DES-EDE3-CBC,
// but you can choose e.g. AES-256-CBC which we consider a better choice.
$config['cipher_method'] = 'DES-EDE3-CBC';
@ -615,9 +655,12 @@ $config['identities_level'] = 0;
$config['identity_image_size'] = 64;
// Mimetypes supported by the browser.
// attachments of these types will open in a preview window
// either a comma-separated list or an array: 'text/plain,text/html,text/xml,image/jpeg,image/gif,image/png,application/pdf'
$config['client_mimetypes'] = null; # null == default
// Attachments of these types will open in a preview window.
// Either a comma-separated list or an array. Default list includes:
// text/plain,text/html,
// image/jpeg,image/gif,image/png,image/bmp,image/tiff,image/webp,
// application/x-javascript,application/pdf,application/x-shockwave-flash
$config['client_mimetypes'] = null;
// Path to a local mime magic database file for PHPs finfo extension.
// Set to null if the default path should be used.
@ -796,11 +839,6 @@ $config['max_pagesize'] = 200;
// Minimal value of user's 'refresh_interval' setting (in seconds)
$config['min_refresh_interval'] = 60;
// Enables files upload indicator. Requires APC installed and enabled apc.rfc1867 option.
// By default refresh time is set to 1 second. You can set this value to true
// or any integer value indicating number of seconds.
$config['upload_progress'] = false;
// Specifies for how many seconds the Undo button will be available
// after object delete action. Currently used with supporting address book sources.
// Setting it to 0, disables the feature.
@ -812,17 +850,19 @@ $config['compose_responses_static'] = array(
// array('name' => 'Canned Response 2', 'text' => 'Static Response Two'),
);
// List of HKP key servers for PGP public key lookups in Enigma/Mailvelope
// Note: Lookup is client-side, so the server must support Cross-Origin Resource Sharing
$config['keyservers'] = array('keys.openpgp.org');
// ----------------------------------
// ADDRESSBOOK SETTINGS
// ----------------------------------
// This indicates which type of address book to use. Possible choises:
// 'sql' (default), 'ldap' and ''.
// If set to 'ldap' then it will look at using the first writable LDAP
// address book as the primary address book and it will not display the
// SQL address book in the 'Address Book' view.
// If set to '' then no address book will be displayed or only the
// addressbook which is created by a plugin (like CardDAV).
// 'sql' - built-in sql addressbook enabled (default),
// '' - built-in sql addressbook disabled.
// Still LDAP or plugin-added addressbooks will be available.
// BC Note: The value can actually be anything except 'sql', it does not matter.
$config['address_book_type'] = 'sql';
// In order to enable public ldap search, configure an array like the Verisign
@ -855,6 +895,7 @@ $config['ldap_public']['Verisign'] = array(
// %d - domain (http hostname $_SERVER['HTTP_HOST'] without the first part)
// %z - IMAP domain (IMAP hostname without the first part)
// For example %n = mail.domain.tld, %t = domain.tld
// Note: Host can also be a full URI e.g. ldaps://hostname.local:636 (for SSL)
'hosts' => array('directory.verisign.com'),
'port' => 389,
'use_tls' => false,
@ -1051,10 +1092,11 @@ $config['contact_search_name'] = '{name} <{email}>';
// Use this charset as fallback for message decoding
$config['default_charset'] = 'ISO-8859-1';
// skin name: folder from skins/
$config['skin'] = 'larry';
// Skin name: folder from skins/
$config['skin'] = 'elastic';
// limit skins available/shown in the settings section
// Limit skins available for the user.
// Note: When not empty, it should include the default skin set in 'skin' option.
$config['skins_allowed'] = array();
// Enables using standard browser windows (that can be handled as tabs)
@ -1160,7 +1202,7 @@ $config['refresh_interval'] = 60;
// If true all folders will be checked for recent messages
$config['check_all_folders'] = false;
// If true, after message delete/move, the next message will be displayed
// If true, after message/contact delete/move, the next message/contact will be displayed
$config['display_next'] = true;
// Default messages listing mode. One of 'threads' or 'list'.
@ -1208,12 +1250,6 @@ $config['search_mods'] = null; // Example: array('*' => array('subject'=>1, 'fr
// Defaults of the addressbook search field configuration.
$config['addressbook_search_mods'] = null; // Example: array('name'=>1, 'firstname'=>1, 'surname'=>1, 'email'=>1, '*'=>1);
// 'Delete always'
// This setting reflects if mail should be always deleted
// when moving to Trash fails. This is necessary in some setups
// when user is over quota and Trash is included in the quota.
$config['delete_always'] = false;
// Directly delete messages in Junk instead of moving to Trash
$config['delete_junk'] = false;

@ -1,27 +0,0 @@
<?php
/*
+-----------------------------------------------------------------------+
| Roundcube Webmail Selenium Tests Entry Point |
| |
| Copyright (C) 2005-2014, The Roundcube Dev Team |
| |
| Licensed under the GNU General Public License version 3 or |
| any later version with exceptions for skins & plugins. |
| See the README file for a full license statement. |
| |
| PURPOSE: |
| This is the public entry point for all HTTP requests to the |
| Roundcube webmail application loading the 'tests' environment. |
+-----------------------------------------------------------------------+
| Author: Thomas Bruederli <thomas@roundcube.net> |
+-----------------------------------------------------------------------+
*/
define('INSTALL_PATH', realpath(__DIR__) . '/');
$GLOBALS['env'] = 'test';
// include index.php from application root directory
include INSTALL_PATH . 'index.php';

@ -2,9 +2,9 @@
/**
+-------------------------------------------------------------------------+
| Roundcube Webmail IMAP Client |
| Version 1.4-git |
| Version 1.5-git |
| |
| Copyright (C) 2005-2018, The Roundcube Dev Team |
| Copyright (C) The Roundcube Dev Team |
| |
| This program is free software: you can redistribute it and/or modify |
| it under the terms of the GNU General Public License (with exceptions |
@ -106,7 +106,9 @@ if ($RCMAIL->task == 'login' && $RCMAIL->action == 'login') {
$pass_charset = $RCMAIL->config->get('password_charset', 'UTF-8');
// purge the session in case of new login when a session already exists
$RCMAIL->kill_session();
if ($request_valid) {
$RCMAIL->kill_session();
}
$auth = $RCMAIL->plugins->exec_hook('authenticate', array(
'host' => $RCMAIL->autoselect_host(),
@ -180,13 +182,15 @@ if ($RCMAIL->task == 'login' && $RCMAIL->action == 'login') {
$RCMAIL->plugins->exec_hook('login_failed', array(
'code' => $error_code, 'host' => $auth['host'], 'user' => $auth['user']));
$RCMAIL->kill_session();
if (!isset($_SESSION['user_id'])) {
$RCMAIL->kill_session();
}
}
}
// end session
else if ($RCMAIL->task == 'logout' && isset($_SESSION['user_id'])) {
$RCMAIL->request_security_check($mode = rcube_utils::INPUT_GET);
$RCMAIL->request_security_check(rcube_utils::INPUT_GET | rcube_utils::INPUT_POST);
$userdata = array(
'user' => $_SESSION['username'],
@ -205,24 +209,14 @@ else if ($RCMAIL->task == 'logout' && isset($_SESSION['user_id'])) {
else if ($RCMAIL->task != 'login' && $_SESSION['user_id']) {
if (!$RCMAIL->session->check_auth()) {
$RCMAIL->kill_session();
$session_error = true;
$session_error = 'sessionerror';
}
}
// not logged in -> show login page
if (empty($RCMAIL->user->ID)) {
// log session failures
$task = rcube_utils::get_input_value('_task', rcube_utils::INPUT_GPC);
if ($task && !in_array($task, array('login','logout'))
&& !$session_error && ($sess_id = $_COOKIE[ini_get('session.name')])
) {
$RCMAIL->session->log("Aborted session $sess_id; no valid session data found");
$session_error = true;
}
if ($session_error || $_REQUEST['_err'] == 'session') {
$OUTPUT->show_message('sessionerror', 'error', null, true, -1);
if ($session_error || $_REQUEST['_err'] === 'session' || ($session_error = $RCMAIL->session_error())) {
$OUTPUT->show_message($session_error ?: 'sessionerror', 'error', null, true, -1);
}
if ($OUTPUT->ajax_call || $OUTPUT->get_env('framed')) {
@ -244,7 +238,8 @@ if (empty($RCMAIL->user->ID)) {
$plugin = $RCMAIL->plugins->exec_hook('unauthenticated', array(
'task' => 'login',
'error' => $session_error,
'http_code' => !$session_error ? 401 : 200
// Return 401 only on failed logins (#7010)
'http_code' => empty($session_error) && !empty($error_message) ? 401 : 200
));
$RCMAIL->set_task($plugin['task']);

@ -1,5 +1,19 @@
<?php
/**
+-----------------------------------------------------------------------+
| This file is part of the Roundcube Webmail client |
| |
| Copyright (C) The Roundcube Dev Team |
| |
| Licensed under the GNU General Public License version 3 or |
| any later version with exceptions for skins & plugins. |
| See the README file for a full license statement. |
+-----------------------------------------------------------------------+
| Author: Thomas Bruederli <roundcube@gmail.com> |
+-----------------------------------------------------------------------+
*/
if (!class_exists('rcmail_install', false) || !is_object($RCI)) {
die("Not allowed! Please open installer/index.php instead.");
}
@ -17,11 +31,12 @@ $required_php_exts = array(
'PDO' => 'PDO',
'Multibyte' => 'mbstring',
'OpenSSL' => 'openssl',
'Filter' => 'filter',
'Ctype' => 'ctype',
);
$optional_php_exts = array(
'FileInfo' => 'fileinfo',
'Libiconv' => 'iconv',
'Intl' => 'intl',
'Exif' => 'exif',
'LDAP' => 'ldap',
@ -60,7 +75,6 @@ $source_urls = array(
'Session' => 'http://www.php.net/manual/en/book.session.php',
'PCRE' => 'http://www.php.net/manual/en/book.pcre.php',
'FileInfo' => 'http://www.php.net/manual/en/book.fileinfo.php',
'Libiconv' => 'http://www.php.net/manual/en/book.iconv.php',
'Multibyte' => 'http://www.php.net/manual/en/book.mbstring.php',
'OpenSSL' => 'http://www.php.net/manual/en/book.openssl.php',
'JSON' => 'http://www.php.net/manual/en/book.json.php',
@ -73,6 +87,8 @@ $source_urls = array(
'GD' => 'http://www.php.net/manual/en/book.image.php',
'Imagick' => 'http://www.php.net/manual/en/book.imagick.php',
'Zip' => 'http://www.php.net/manual/en/book.zip.php',
'Filter' => 'http://www.php.net/manual/en/book.filter.php',
'Ctype' => 'http://www.php.net/manual/en/book.ctype.php',
'pdo_mysql' => 'http://www.php.net/manual/en/ref.pdo-mysql.php',
'pdo_pgsql' => 'http://www.php.net/manual/en/ref.pdo-pgsql.php',
'pdo_sqlite' => 'http://www.php.net/manual/en/ref.pdo-sqlite.php',

@ -2,13 +2,12 @@
+-----------------------------------------------------------------------+
| Roundcube installer client function |
| |
| This file is part of the Roundcube web development suite |
| Copyright (C) 2009-2012, The Roundcube Dev Team |
| This file is part of the Roundcube Webmail client |
| Copyright (C) The Roundcube Dev Team |
| |
| Licensed under the GNU General Public License version 3 or |
| any later version with exceptions for skins & plugins. |
| See the README file for a full license statement. |
| |
+-----------------------------------------------------------------------+
| Author: Thomas Bruederli <roundcube@gmail.com> |
+-----------------------------------------------------------------------+
@ -17,7 +16,7 @@
function toggleblock(id, link)
{
var block = document.getElementById(id);
return false;
}
@ -28,14 +27,14 @@ function addhostfield()
var row = document.createElement('div');
var input = document.createElement('input');
var link = document.createElement('a');
input.name = '_default_host[]';
input.size = '30';
link.href = '#';
link.onclick = function() { removehostfield(this.parentNode); return false };
link.className = 'removelink';
link.innerHTML = 'remove';
row.appendChild(input);
row.appendChild(link);
container.appendChild(row);

@ -1,5 +1,19 @@
<?php
/**
+-----------------------------------------------------------------------+
| This file is part of the Roundcube Webmail client |
| |
| Copyright (C) The Roundcube Dev Team |
| |
| Licensed under the GNU General Public License version 3 or |
| any later version with exceptions for skins & plugins. |
| See the README file for a full license statement. |
+-----------------------------------------------------------------------+
| Author: Thomas Bruederli <roundcube@gmail.com> |
+-----------------------------------------------------------------------+
*/
if (!class_exists('rcmail_install', false) || !is_object($RCI)) {
die("Not allowed! Please open installer/index.php instead.");
}
@ -90,7 +104,7 @@ $input_support = new html_inputfield(array('name' => '_support_url', 'size' => 5
echo $input_support->show($RCI->getprop('support_url'));
?>
<div>Provide an URL where a user can get support for this Roundcube installation.<br/>PLEASE DO NOT LINK TO THE ROUNDCUBE.NET WEBSITE HERE!</div>
<div>Provide a URL where a user can get support for this Roundcube installation.<br/>PLEASE DO NOT LINK TO THE ROUNDCUBE.NET WEBSITE HERE!</div>
<p class="hint">Enter an absolute URL (including http://) to a support page/form or a mailto: link.</p>
</dd>

Before

Width:  |  Height:  |  Size: 653 B

After

Width:  |  Height:  |  Size: 653 B

Before

Width:  |  Height:  |  Size: 637 B

After

Width:  |  Height:  |  Size: 637 B

Before

Width:  |  Height:  |  Size: 565 B

After

Width:  |  Height:  |  Size: 565 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.3 KiB

After

Width:  |  Height:  |  Size: 3.7 KiB

@ -3,9 +3,9 @@
/**
+-------------------------------------------------------------------------+
| Roundcube Webmail setup tool |
| Version 1.4-git |
| Version 1.5-git |
| |
| Copyright (C) 2009-2017, The Roundcube Dev Team |
| Copyright (C) The Roundcube Dev Team |
| |
| This program is free software: you can redistribute it and/or modify |
| it under the terms of the GNU General Public License (with exceptions |

@ -1,4 +1,17 @@
<?php
/*
+-----------------------------------------------------------------------+
| This file is part of the Roundcube Webmail client |
| |
| Copyright (C) The Roundcube Dev Team |
| |
| Licensed under the GNU General Public License version 3 or |
| any later version with exceptions for skins & plugins. |
| See the README file for a full license statement. |
+-----------------------------------------------------------------------+
| Author: Thomas Bruederli <roundcube@gmail.com> |
+-----------------------------------------------------------------------+
*/
if (!class_exists('rcmail_install', false) || !is_object($RCI)) {
die("Not allowed! Please open installer/index.php instead.");
@ -126,7 +139,7 @@ if ($RCI->configured) {
else {
$RCI->fail('DSN (write)', $db_error_msg);
echo '<p class="hint">Make sure that the configured database exists and that the user has write privileges<br />';
echo 'DSN: ' . $RCI->config['db_dsnw'] . '</p>';
echo 'DSN: ' . rcube::Q($RCI->config['db_dsnw']) . '</p>';
}
}
else {
@ -139,15 +152,15 @@ else {
// initialize db with schema found in /SQL/*
if ($db_working && $_POST['initdb']) {
if (!($success = $RCI->init_db($DB))) {
if (!$RCI->init_db($DB)) {
$db_working = false;
echo '<p class="warning">Please try to inizialize the database manually as described in the INSTALL guide.
Make sure that the configured database extists and that the user as write privileges</p>';
Make sure that the configured database extists and that the user as write privileges</p>';
}
}
else if ($db_working && $_POST['updatedb']) {
if (!($success = $RCI->update_db($_POST['version']))) {
if (!$RCI->update_db($_POST['version'])) {
echo '<p class="warning">Database schema update failed.</p>';
}
}
@ -165,7 +178,7 @@ if ($db_working) {
echo '<ul style="margin:0"><li>' . join("</li>\n<li>", $err) . "</li></ul>";
$select = $RCI->versions_select(array('name' => 'version'));
$select->add('0.9 or newer', '');
echo '<p class="suggestion">You should run the update queries to get the schema fixed.<br/><br/>Version to update from: ' . $select->show() . '&nbsp;<input type="submit" name="updatedb" value="Update" /></p>';
echo '<p class="suggestion">You should run the update queries to get the schema fixed.<br/><br/>Version to update from: ' . $select->show('') . '&nbsp;<input type="submit" name="updatedb" value="Update" /></p>';
$db_working = false;
}
else {
@ -176,6 +189,11 @@ if ($db_working) {
// more database tests
if ($db_working) {
// Using transactions to workaround SQLite bug (#7064)
if ($DB->db_provider == 'sqlite') {
$DB->startTransaction();
}
// write test
$insert_id = md5(uniqid());
$db_write = $DB->query("INSERT INTO " . $DB->quote_identifier($RCI->config['db_prefix'] . 'session')
@ -191,6 +209,11 @@ if ($db_working) {
}
echo '<br />';
// Transaction end
if ($DB->db_provider == 'sqlite') {
$DB->rollbackTransaction();
}
// check timezone settings
$tz_db = 'SELECT ' . $DB->unixtimestamp($DB->now()) . ' AS tz_db';
$tz_db = $DB->query($tz_db);
@ -240,6 +263,15 @@ else {
echo "<br/>";
}
$smtp_hosts = $RCI->get_hostlist('smtp_server');
if (!empty($smtp_hosts)) {
$smtp_host_field = new html_select(array('name' => '_smtp_host', 'id' => 'smtp_server'));
$smtp_host_field->add($smtp_hosts);
}
else {
$smtp_host_field = new html_inputfield(array('name' => '_smtp_host', 'id' => 'smtp_server'));
}
$user = $RCI->getprop('smtp_user', '(none)');
$pass = $RCI->getprop('smtp_pass', '(none)');
@ -247,10 +279,16 @@ if ($user == '%u') {
$user_field = new html_inputfield(array('name' => '_smtp_user', 'id' => 'smtp_user'));
$user = $user_field->show($_POST['_smtp_user']);
}
else {
$user = html::quote($user);
}
if ($pass == '%p') {
$pass_field = new html_passwordfield(array('name' => '_smtp_pass', 'id' => 'smtp_pass'));
$pass = $pass_field->show();
}
else {
$pass = html::quote($pass);
}
?>
@ -261,11 +299,11 @@ if ($pass == '%p') {
<tbody>
<tr>
<td><label for="smtp_server">Server</label></td>
<td><?php echo rcube_utils::parse_host($RCI->getprop('smtp_server', 'localhost')); ?></td>
<td><?php echo $smtp_host_field->show($_POST['_smtp_host']); ?></td>
</tr>
<tr>
<td><label for="smtp_port">Port</label></td>
<td><?php echo $RCI->getprop('smtp_port'); ?></td>
<td><?php echo rcube::Q($RCI->getprop('smtp_port')); ?></td>
</tr>
<tr>
<td><label for="smtp_user">Username</label></td>
@ -288,8 +326,11 @@ if (isset($_POST['sendmail'])) {
echo '<p>Trying to send email...<br />';
$from = idn_to_ascii(trim($_POST['_from']));
$to = idn_to_ascii(trim($_POST['_to']));
$smtp_host = trim($_POST['_smtp_host']);
$smtp_port = $RCI->getprop('smtp_port');
$from = rcube_utils::idn_to_ascii(trim($_POST['_from']));
$to = rcube_utils::idn_to_ascii(trim($_POST['_to']));
if (preg_match('/^' . $RCI->email_pattern . '$/i', $from) &&
preg_match('/^' . $RCI->email_pattern . '$/i', $to)
@ -317,8 +358,7 @@ if (isset($_POST['sendmail'])) {
$head = $mail_object->txtHeaders($send_headers);
$SMTP = new rcube_smtp();
$SMTP->connect(rcube_utils::parse_host($RCI->getprop('smtp_server')),
$RCI->getprop('smtp_port'), $CONFIG['smtp_user'], $CONFIG['smtp_pass']);
$SMTP->connect($smtp_host, $smtp_port, $CONFIG['smtp_user'], $CONFIG['smtp_pass']);
$status = $SMTP->send_mail($headers['From'], $headers['To'], $head, $body);
$smtp_response = $SMTP->get_response();
@ -413,8 +453,8 @@ if (isset($_POST['imaptest']) && !empty($_POST['_host']) && !empty($_POST['_user
$imap_port = 993;
}
$imap_host = idn_to_ascii($imap_host);
$imap_user = idn_to_ascii($_POST['_user']);
$imap_host = rcube_utils::idn_to_ascii($imap_host);
$imap_user = rcube_utils::idn_to_ascii($_POST['_user']);
$imap = new rcube_imap(null);
$imap->set_options(array(

@ -3,10 +3,10 @@
{
"lib": "jquery",
"name": "jQuery",
"version": "3.3.1",
"version": "3.4.1",
"url": "https://code.jquery.com/jquery-$v.min.js",
"dest": "program/js/jquery.min.js",
"sha1": "0dc32db4aa9c5f03f3b38c47d883dbd4fed13aae",
"sha1": "88523924351bac0b5d560fe0c5781e2556e7693d",
"license": "MIT",
"copyright": "Copyright JS Foundation and other contributors",
"source": "https://github.com/jquery/jquery/tree/$v"
@ -37,7 +37,7 @@
{
"lib": "tinymce",
"version": "4.8.2",
"url": "http://download.ephox.com/tinymce/community/tinymce_$v.zip",
"url": "https://download.tiny.cloud/tinymce/community/tinymce_$v.zip",
"dest": "program/js",
"sha1": "d7fced05acdeeb78299585ea9909b0de2b3d759d",
"license": "LGPL",
@ -57,27 +57,27 @@
{
"lib": "tinymce-langs",
"version": "4.8.2",
"url": "https://tinymce-services.azurewebsites.net/1/i18n/download?langs=ar,hy,az,eu,be,bs,bg_BG,ca,zh_CN,zh_TW,hr,cs,cs_CZ,da,nl,en_CA,en_GB,eo,et,fo,fi,fr_FR,fr_CH,gd,gl,ka_GE,de,de_AT,el,he_IL,hi_IN,hu_HU,is_IS,id,ga,it,ja,kab,km_KH,ko_KR,ku,ku_IQ,lv,lt,lb,mk_MK,ml_IN,nb_NO,oc,fa,fa_IR,pl,pt_BR,pt_PT,ro,ru,sk,sl_SI,es,es_MX,sv_SE,tg,ta,ta_IN,tt,th_TH,tr,tr_TR,ug,uk,uk_UA,vi,vi_VN,cy&extension=.zip",
"url": "https://www.tiny.cloud/docs-4x/language/tinymce4x_languages.zip",
"dest": "program/js/tinymce"
},
{
"lib": "openpgp",
"name": "OpenPGP.js",
"version": "4.2.1",
"version": "4.4.6",
"url": "https://raw.githubusercontent.com/openpgpjs/openpgpjs/v$v/dist/openpgp.min.js",
"api_url": "https://api.github.com/repos/openpgpjs/openpgpjs/contents/dist/openpgp.min.js?ref=v$v",
"dest": "plugins/enigma/openpgp.min.js",
"sha1": "5f793a81236614f69d555545cb855c43521d2fa9",
"sha1": "e142168db8e666a40fcb4c48ef89c9d774134f8b",
"license": "LGPL",
"copyright": "Copyright (c) OpenPGP Development Team",
"source": "https://github.com/openpgpjs/openpgpjs/blob/v$v/dist/openpgp.js"
},
{
"lib": "codemirror",
"version": "5.34.0",
"version": "5.46.0",
"url": "https://codemirror.net/codemirror-$v.zip",
"dest": "plugins/managesieve/codemirror",
"sha1": "24d0834c6a5c4b89c4c82ca2ea31e574b0751b32",
"sha1": "c11fcb9b63cee2b276e3b9f24a8ad6d7c374c624",
"license": "MIT",
"map": {
"lib": "lib",
@ -88,12 +88,13 @@
{
"lib": "bootstrap",
"name": "Bootstrap",
"version": "4.2.1",
"version": "4.3.1",
"url": "https://github.com/twbs/bootstrap/releases/download/v$v/bootstrap-$v-dist.zip",
"dest": "skins/elastic/deps",
"sha1": "2c80550e423a2500a98d4efbc7d6374cf131495e",
"sha1": "ee9e9d6bbbb6181dc519778af2b38804a6aa62a4",
"license": "MIT",
"flat": true,
"sourcemap": false,
"map": {
"bootstrap.bundle.min.js": "bootstrap.bundle.min.js",
"bootstrap.min.css": "bootstrap.min.css"

@ -1,5 +1,18 @@
/**
* ACL plugin script
*
* @licstart The following is the entire license notice for the
* JavaScript code in this file.
*
* Copyright (c) The Roundcube Dev Team
*
* The JavaScript code in this page is free software: you can redistribute it
* and/or modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation, either version 3 of
* the License, or (at your option) any later version.
*
* @licend The above is the entire license notice
* for the JavaScript code in this file.
*/
if (window.rcmail) {
@ -189,7 +202,7 @@ rcube_webmail.prototype.acl_list_update = function(html)
// Returns names of users in selected rows
rcube_webmail.prototype.acl_get_usernames = function()
{
var users = [], n, len, cell, row,
var users = [], n, len, id, row,
list = this.acl_list,
selection = list.get_selection();
@ -197,10 +210,8 @@ rcube_webmail.prototype.acl_get_usernames = function()
if (this.env.acl_specials.length && $.inArray(selection[n], this.env.acl_specials) >= 0) {
users.push(selection[n]);
}
else if (row = list.rows[selection[n]]) {
cell = $('td.user', row.obj);
if (cell.length == 1)
users.push(cell.text());
else if ((row = list.rows[selection[n]]) && (id = $(row.obj).data('userid'))) {
users.push(id);
}
}
@ -244,15 +255,14 @@ rcube_webmail.prototype.acl_add_row = function(o, sel)
cl = items[cl];
if (cl == 'user')
td.addClass(cl).append($('<a>').text(o.username));
td.addClass(cl).attr('title', o.title).append($('<a>').text(o.display));
else
td.addClass(this.className + ' ' + rcmail.acl_class(o.acl, cl)).html('<span/>');
$(this).replaceWith(td);
});
row.attr('id', 'rcmrow'+id);
row = row.get(0);
row = row.attr({id: 'rcmrow' + id, 'data-userid': o.username}).get(0);
this.env.acl[id] = o.acl;
@ -326,7 +336,7 @@ rcube_webmail.prototype.acl_init_form = function(id)
});
if (!this.env.acl_specials.length || $.inArray(id, this.env.acl_specials) < 0)
val = $('td.user', row).text();
val = $(row).data('userid');
else
type = id;
}

@ -5,7 +5,7 @@
*
* @author Aleksander Machniak <alec@alec.pl>
*
* Copyright (C) 2011-2012, Kolab Systems AG
* Copyright (C) Kolab Systems AG
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@ -407,10 +407,10 @@ class acl extends rcube_plugin
}
else {
$items = array(
'read' => 'lrs',
'write' => 'wi',
'read' => 'lrs',
'write' => 'wi',
'delete' => $deleteright,
'other' => preg_replace('/[lrswi'.$deleteright.']/', '', implode($supported)),
'other' => preg_replace('/[lrswi'.$deleteright.']/', '', implode($supported)),
);
// give plugins the opportunity to adjust this list
@ -438,14 +438,19 @@ class acl extends rcube_plugin
// filter out virtual rights (c or d) the server may return
$userrights = array_intersect($rights, $supported);
$userid = rcube_utils::html_identifier($user);
$userid = rcube_utils::html_identifier($user);
$title = null;
if (!empty($this->specials) && in_array($user, $this->specials)) {
$user = $this->gettext($user);
$username = $this->gettext($user);
}
else {
$username = $this->resolve_acl_identifier($user, $title);
}
$table->add_row(array('id' => 'rcmrow'.$userid));
$table->add('user', html::a(array('id' => 'rcmlinkrow'.$userid), rcube::Q($user)));
$table->add_row(array('id' => 'rcmrow' . $userid, 'data-userid' => $user));
$table->add(array('class' => 'user text-nowrap', 'title' => $title),
html::a(array('id' => 'rcmlinkrow' . $userid), rcube::Q($username)));
foreach ($items as $key => $right) {
$in = $this->acl_compare($userrights, $right);
@ -515,9 +520,15 @@ class acl extends rcube_plugin
if ($user != $_SESSION['username'] && $username != $_SESSION['username']) {
if ($this->rc->storage->set_acl($mbox, $user, $acl)) {
$ret = array('id' => rcube_utils::html_identifier($user),
'username' => $username, 'acl' => implode($acl), 'old' => $oldid);
$this->rc->output->command('acl_update', $ret);
$display = $this->resolve_acl_identifier($username, $title);
$this->rc->output->command('acl_update', array(
'id' => rcube_utils::html_identifier($user),
'username' => $username,
'title' => $title,
'display' => $display,
'acl' => implode($acl),
'old' => $oldid
));
$result++;
}
}
@ -608,8 +619,9 @@ class acl extends rcube_plugin
}
}
if (count($list) == count($supported))
if (count($list) == count($supported)) {
return rcube::Q($this->gettext('aclfull'));
}
return html::tag('ul', $attrib, implode("\n", $list));
}
@ -636,12 +648,15 @@ class acl extends rcube_plugin
$cnt1 = count($res);
$cnt2 = count($acl2);
if ($cnt1 == $cnt2)
if ($cnt1 == $cnt2) {
return 2;
else if ($cnt1)
}
if ($cnt1) {
return 1;
else
return 0;
}
return 0;
}
/**
@ -787,4 +802,51 @@ class acl extends rcube_plugin
return $user;
}
/**
* Resolve acl identifier to user/group name
*/
protected function resolve_acl_identifier($id, &$title = null)
{
if ($this->init_ldap()) {
$groups = $this->rc->config->get('acl_groups');
$prefix = $this->rc->config->get('acl_group_prefix');
$group_field = $this->rc->config->get('acl_group_field', 'name');
// Unfortunately this works only if group_field=name,
// list_groups() allows searching by group name only
if ($groups && $prefix && $group_field === 'name' && strpos($id, $prefix) === 0) {
$gid = substr($id, strlen($prefix));
$result = $this->ldap->list_groups($gid, rcube_addressbook::SEARCH_STRICT);
if (count($result) === 1 && ($record = $result[0])) {
if ($record[$group_field] === $gid) {
$display = $record['name'];
if ($display != $gid) {
$title = sprintf('%s (%s)', $display, $gid);
}
return $display;
}
}
return $id;
}
$this->ldap->set_pagesize('2');
// Note: 'uid' works here because we overwrite fieldmap in init_ldap() above
$result = $this->ldap->search('uid', $id, rcube_addressbook::SEARCH_STRICT);
if ($result->count === 1 && ($record = $result->first())) {
if ($record['uid'] === $id) {
$title = rcube_addressbook::compose_search_name($record);
$display = rcube_addressbook::compose_list_name($record);
return $display;
}
}
}
return $id;
}
}

@ -3,7 +3,7 @@
"type": "roundcube-plugin",
"description": "IMAP Folders Access Control Lists Management (RFC4314, RFC2086).",
"license": "GPLv3+",
"version": "1.7",
"version": "1.8",
"authors": [
{
"name": "Aleksander Machniak",

@ -2,20 +2,20 @@
/*
+-----------------------------------------------------------------------+
| plugins/acl/localization/<lang>.inc |
| |
| Localization file of the Roundcube Webmail ACL plugin |
| Copyright (C) 2012-2013, The Roundcube Dev Team |
| |
| Copyright (C) The Roundcube Dev Team |
| |
| Licensed under the GNU General Public License version 3 or |
| any later version with exceptions for skins & plugins. |
| See the README file for a full license statement. |
| |
+-----------------------------------------------------------------------+
For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/plugin-acl/
*/
$labels['username'] = 'المستخدم :';
$labels['advanced'] = 'الوضع المتقدم';
$labels['add'] = 'إضافة';
$labels['acld'] = 'حذف الرسائل';
$labels['aclt'] = 'حذف الرسائل';

@ -2,19 +2,18 @@
/*
+-----------------------------------------------------------------------+
| plugins/acl/localization/<lang>.inc |
| |
| Localization file of the Roundcube Webmail ACL plugin |
| Copyright (C) 2012-2013, The Roundcube Dev Team |
| |
| Copyright (C) The Roundcube Dev Team |
| |
| Licensed under the GNU General Public License version 3 or |
| any later version with exceptions for skins & plugins. |
| See the README file for a full license statement. |
| |
+-----------------------------------------------------------------------+
For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/plugin-acl/
*/
$labels['sharing'] = 'مشاركة';
$labels['myrights'] = 'حقوق الوصول';
$labels['username'] = 'مستخدم:';
@ -39,6 +38,7 @@ $labels['aclt'] = 'حذف الرسائل';
$labels['acle'] = 'حُذف';
$labels['aclx'] = 'حذف المجلد';
$labels['acla'] = 'ادارة';
$labels['acln'] = 'التعليق على الرسائل';
$labels['aclfull'] = 'تحكم كامل';
$labels['aclother'] = 'اخرى';
$labels['aclread'] = 'قراءة ';
@ -57,6 +57,7 @@ $labels['shortaclt'] = 'حذف';
$labels['shortacle'] = 'حُذف';
$labels['shortaclx'] = 'حذف المجلد';
$labels['shortacla'] = 'ادارة';
$labels['shortacln'] = 'كتابة تعليق';
$labels['shortaclother'] = 'اخرى';
$labels['shortaclread'] = 'قراءة ';
$labels['shortaclwrite'] = 'كتابة';
@ -74,10 +75,14 @@ $labels['longaclt'] = 'حذف وسم الرسائل من الممكن تغيير
$labels['longacle'] = 'بالامكان شطب الرسائل';
$labels['longaclx'] = 'هذا المجلد بالامكان حذفة او اعادة تسميته';
$labels['longacla'] = 'حقوق الوصول لهذا المجلد بالامكان تغييره';
$labels['longacln'] = 'يمكن تغيير البيانات الوصفية (التعليقات) المشتركة بين الرسائل';
$labels['longaclfull'] = 'التحكم الكامل يتضمن ادارة المجلدات';
$labels['longaclread'] = 'من الممكن فتح المجلد للقراءة';
$labels['longaclwrite'] = 'لا يمكن وضع علامة على الرسائل, كتبت او نسخة الى هذا المجلد';
$labels['longacldelete'] = 'لا يمكن حذف الرسائل';
$labels['longaclother'] = 'حقوق الوصول الأخرى';
$labels['ariasummaryacltable'] = 'قائمة حقوق الوصول';
$labels['arialabelaclform'] = 'نموذج حقوق الوصول';
$messages['deleting'] = 'جاري حذف حقوق الوصول...';
$messages['saving'] = 'جاري حفظ حقوق الوصول...';
$messages['updatesuccess'] = 'تم تغيير حقوق الوصول بنجاح';

@ -2,19 +2,18 @@
/*
+-----------------------------------------------------------------------+
| plugins/acl/localization/<lang>.inc |
| |
| Localization file of the Roundcube Webmail ACL plugin |
| Copyright (C) 2012-2013, The Roundcube Dev Team |
| |
| Copyright (C) The Roundcube Dev Team |
| |
| Licensed under the GNU General Public License version 3 or |
| any later version with exceptions for skins & plugins. |
| See the README file for a full license statement. |
| |
+-----------------------------------------------------------------------+
For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/plugin-acl/
*/
$labels['sharing'] = 'Compartición';
$labels['myrights'] = 'Drechos d\'accesu';
$labels['username'] = 'Usuariu:';

@ -2,19 +2,18 @@
/*
+-----------------------------------------------------------------------+
| plugins/acl/localization/<lang>.inc |
| |
| Localization file of the Roundcube Webmail ACL plugin |
| Copyright (C) 2012-2013, The Roundcube Dev Team |
| |
| Copyright (C) The Roundcube Dev Team |
| |
| Licensed under the GNU General Public License version 3 or |
| any later version with exceptions for skins & plugins. |
| See the README file for a full license statement. |
| |
+-----------------------------------------------------------------------+
For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/plugin-acl/
*/
$labels['sharing'] = 'Paylaşma';
$labels['myrights'] = 'Giriş hüququ';
$labels['username'] = 'İstifadəçi:';

@ -2,19 +2,18 @@
/*
+-----------------------------------------------------------------------+
| plugins/acl/localization/<lang>.inc |
| |
| Localization file of the Roundcube Webmail ACL plugin |
| Copyright (C) 2012-2013, The Roundcube Dev Team |
| |
| Copyright (C) The Roundcube Dev Team |
| |
| Licensed under the GNU General Public License version 3 or |
| any later version with exceptions for skins & plugins. |
| See the README file for a full license statement. |
| |
+-----------------------------------------------------------------------+
For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/plugin-acl/
*/
$labels['sharing'] = 'Сумесны доступ';
$labels['myrights'] = 'Правы доступу';
$labels['username'] = 'Карыстальнік:';

@ -2,19 +2,18 @@
/*
+-----------------------------------------------------------------------+
| plugins/acl/localization/<lang>.inc |
| |
| Localization file of the Roundcube Webmail ACL plugin |
| Copyright (C) 2012-2013, The Roundcube Dev Team |
| |
| Copyright (C) The Roundcube Dev Team |
| |
| Licensed under the GNU General Public License version 3 or |
| any later version with exceptions for skins & plugins. |
| See the README file for a full license statement. |
| |
+-----------------------------------------------------------------------+
For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/plugin-acl/
*/
$labels['sharing'] = 'Споделяне';
$labels['myrights'] = 'Права за достъп';
$labels['username'] = 'Потребител:';

@ -2,19 +2,19 @@
/*
+-----------------------------------------------------------------------+
| plugins/acl/localization/<lang>.inc |
| |
| Localization file of the Roundcube Webmail ACL plugin |
| Copyright (C) 2012-2013, The Roundcube Dev Team |
| |
| Copyright (C) The Roundcube Dev Team |
| |
| Licensed under the GNU General Public License version 3 or |
| any later version with exceptions for skins & plugins. |
| See the README file for a full license statement. |
| |
+-----------------------------------------------------------------------+
For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/plugin-acl/
*/
$labels['aclread'] = 'পড়';
$labels['acldelete'] = 'ফেলে দিন';
$labels['shortaclr'] = 'পড়';

@ -2,19 +2,18 @@
/*
+-----------------------------------------------------------------------+
| plugins/acl/localization/<lang>.inc |
| |
| Localization file of the Roundcube Webmail ACL plugin |
| Copyright (C) 2012-2013, The Roundcube Dev Team |
| |
| Copyright (C) The Roundcube Dev Team |
| |
| Licensed under the GNU General Public License version 3 or |
| any later version with exceptions for skins & plugins. |
| See the README file for a full license statement. |
| |
+-----------------------------------------------------------------------+
For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/plugin-acl/
*/
$labels['sharing'] = 'Rannañ';
$labels['myrights'] = 'Aotreoù mont e-barzh';
$labels['username'] = 'Implijer:';

@ -2,19 +2,18 @@
/*
+-----------------------------------------------------------------------+
| plugins/acl/localization/<lang>.inc |
| |
| Localization file of the Roundcube Webmail ACL plugin |
| Copyright (C) 2012-2013, The Roundcube Dev Team |
| |
| Copyright (C) The Roundcube Dev Team |
| |
| Licensed under the GNU General Public License version 3 or |
| any later version with exceptions for skins & plugins. |
| See the README file for a full license statement. |
| |
+-----------------------------------------------------------------------+
For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/plugin-acl/
*/
$labels['sharing'] = 'Razmjena';
$labels['myrights'] = 'Prava pristupa';
$labels['username'] = 'Korisnik:';

@ -2,19 +2,18 @@
/*
+-----------------------------------------------------------------------+
| plugins/acl/localization/<lang>.inc |
| |
| Localization file of the Roundcube Webmail ACL plugin |
| Copyright (C) 2012-2013, The Roundcube Dev Team |
| |
| Copyright (C) The Roundcube Dev Team |
| |
| Licensed under the GNU General Public License version 3 or |
| any later version with exceptions for skins & plugins. |
| See the README file for a full license statement. |
| |
+-----------------------------------------------------------------------+
For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/plugin-acl/
*/
$labels['sharing'] = 'Comparteix';
$labels['myrights'] = 'Permisos d\'accés';
$labels['username'] = 'Usuari:';

@ -2,19 +2,18 @@
/*
+-----------------------------------------------------------------------+
| plugins/acl/localization/<lang>.inc |
| |
| Localization file of the Roundcube Webmail ACL plugin |
| Copyright (C) 2012-2013, The Roundcube Dev Team |
| |
| Copyright (C) The Roundcube Dev Team |
| |
| Licensed under the GNU General Public License version 3 or |
| any later version with exceptions for skins & plugins. |
| See the README file for a full license statement. |
| |
+-----------------------------------------------------------------------+
For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/plugin-acl/
*/
$labels['sharing'] = 'Sdílení';
$labels['myrights'] = 'Přístupová práva';
$labels['username'] = 'Uživatel:';

@ -2,19 +2,18 @@
/*
+-----------------------------------------------------------------------+
| plugins/acl/localization/<lang>.inc |
| |
| Localization file of the Roundcube Webmail ACL plugin |
| Copyright (C) 2012-2013, The Roundcube Dev Team |
| |
| Copyright (C) The Roundcube Dev Team |
| |
| Licensed under the GNU General Public License version 3 or |
| any later version with exceptions for skins & plugins. |
| See the README file for a full license statement. |
| |
+-----------------------------------------------------------------------+
For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/plugin-acl/
*/
$labels['sharing'] = 'Rhannu';
$labels['myrights'] = 'Hawliau Mynediad';
$labels['username'] = 'Defnyddiwr:';

@ -2,19 +2,18 @@
/*
+-----------------------------------------------------------------------+
| plugins/acl/localization/<lang>.inc |
| |
| Localization file of the Roundcube Webmail ACL plugin |
| Copyright (C) 2012-2013, The Roundcube Dev Team |
| |
| Copyright (C) The Roundcube Dev Team |
| |
| Licensed under the GNU General Public License version 3 or |
| any later version with exceptions for skins & plugins. |
| See the README file for a full license statement. |
| |
+-----------------------------------------------------------------------+
For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/plugin-acl/
*/
$labels['sharing'] = 'Deling';
$labels['myrights'] = 'Adgangrettigheder';
$labels['username'] = 'Bruger:';

@ -2,19 +2,18 @@
/*
+-----------------------------------------------------------------------+
| plugins/acl/localization/<lang>.inc |
| |
| Localization file of the Roundcube Webmail ACL plugin |
| Copyright (C) 2012-2013, The Roundcube Dev Team |
| |
| Copyright (C) The Roundcube Dev Team |
| |
| Licensed under the GNU General Public License version 3 or |
| any later version with exceptions for skins & plugins. |
| See the README file for a full license statement. |
| |
+-----------------------------------------------------------------------+
For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/plugin-acl/
*/
$labels['sharing'] = 'Freigabe';
$labels['myrights'] = 'Zugriffsrechte';
$labels['username'] = 'Benutzer:';

@ -2,19 +2,18 @@
/*
+-----------------------------------------------------------------------+
| plugins/acl/localization/<lang>.inc |
| |
| Localization file of the Roundcube Webmail ACL plugin |
| Copyright (C) 2012-2013, The Roundcube Dev Team |
| |
| Copyright (C) The Roundcube Dev Team |
| |
| Licensed under the GNU General Public License version 3 or |
| any later version with exceptions for skins & plugins. |
| See the README file for a full license statement. |
| |
+-----------------------------------------------------------------------+
For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/plugin-acl/
*/
$labels['sharing'] = 'Freigabe';
$labels['myrights'] = 'Zugriffsrechte';
$labels['username'] = 'Benutzer:';

@ -2,19 +2,18 @@
/*
+-----------------------------------------------------------------------+
| plugins/acl/localization/<lang>.inc |
| |
| Localization file of the Roundcube Webmail ACL plugin |
| Copyright (C) 2012-2013, The Roundcube Dev Team |
| |
| Copyright (C) The Roundcube Dev Team |
| |
| Licensed under the GNU General Public License version 3 or |
| any later version with exceptions for skins & plugins. |
| See the README file for a full license statement. |
| |
+-----------------------------------------------------------------------+
For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/plugin-acl/
*/
$labels['sharing'] = 'Κοινή χρήση';
$labels['myrights'] = 'Δικαιώματα Πρόσβασης ';
$labels['username'] = 'Χρήστης:';

@ -2,19 +2,18 @@
/*
+-----------------------------------------------------------------------+
| plugins/acl/localization/<lang>.inc |
| |
| Localization file of the Roundcube Webmail ACL plugin |
| Copyright (C) 2012-2013, The Roundcube Dev Team |
| |
| Copyright (C) The Roundcube Dev Team |
| |
| Licensed under the GNU General Public License version 3 or |
| any later version with exceptions for skins & plugins. |
| See the README file for a full license statement. |
| |
+-----------------------------------------------------------------------+
For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/plugin-acl/
*/
$labels['sharing'] = 'Sharing';
$labels['myrights'] = 'Access Rights';
$labels['username'] = 'User:';

@ -2,19 +2,18 @@
/*
+-----------------------------------------------------------------------+
| plugins/acl/localization/<lang>.inc |
| |
| Localization file of the Roundcube Webmail ACL plugin |
| Copyright (C) 2012-2013, The Roundcube Dev Team |
| |
| Copyright (C) The Roundcube Dev Team |
| |
| Licensed under the GNU General Public License version 3 or |
| any later version with exceptions for skins & plugins. |
| See the README file for a full license statement. |
| |
+-----------------------------------------------------------------------+
For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/plugin-acl/
*/
$labels['sharing'] = 'Sharing';
$labels['myrights'] = 'Access Rights';
$labels['username'] = 'User:';

@ -2,15 +2,13 @@
/*
+-----------------------------------------------------------------------+
| plugins/acl/localization/<lang>.inc |
| |
| Localization file of the Roundcube Webmail ACL plugin |
| Copyright (C) 2012-2013, The Roundcube Dev Team |
| |
| Copyright (C) The Roundcube Dev Team |
| |
| Licensed under the GNU General Public License version 3 or |
| any later version with exceptions for skins & plugins. |
| See the README file for a full license statement. |
| |
+-----------------------------------------------------------------------+
For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/plugin-acl/

@ -2,19 +2,18 @@
/*
+-----------------------------------------------------------------------+
| plugins/acl/localization/<lang>.inc |
| |
| Localization file of the Roundcube Webmail ACL plugin |
| Copyright (C) 2012-2013, The Roundcube Dev Team |
| |
| Copyright (C) The Roundcube Dev Team |
| |
| Licensed under the GNU General Public License version 3 or |
| any later version with exceptions for skins & plugins. |
| See the README file for a full license statement. |
| |
+-----------------------------------------------------------------------+
For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/plugin-acl/
*/
$labels['sharing'] = 'Kunhavigado';
$labels['myrights'] = 'Atingrajtoj';
$labels['username'] = 'Uzanto:';

@ -2,19 +2,18 @@
/*
+-----------------------------------------------------------------------+
| plugins/acl/localization/<lang>.inc |
| |
| Localization file of the Roundcube Webmail ACL plugin |
| Copyright (C) 2012-2013, The Roundcube Dev Team |
| |
| Copyright (C) The Roundcube Dev Team |
| |
| Licensed under the GNU General Public License version 3 or |
| any later version with exceptions for skins & plugins. |
| See the README file for a full license statement. |
| |
+-----------------------------------------------------------------------+
For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/plugin-acl/
*/
$labels['sharing'] = 'Compartiendo';
$labels['myrights'] = 'Permisos de acceso';
$labels['username'] = 'Usuario:';

@ -2,19 +2,18 @@
/*
+-----------------------------------------------------------------------+
| plugins/acl/localization/<lang>.inc |
| |
| Localization file of the Roundcube Webmail ACL plugin |
| Copyright (C) 2012-2013, The Roundcube Dev Team |
| |
| Copyright (C) The Roundcube Dev Team |
| |
| Licensed under the GNU General Public License version 3 or |
| any later version with exceptions for skins & plugins. |
| See the README file for a full license statement. |
| |
+-----------------------------------------------------------------------+
For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/plugin-acl/
*/
$labels['sharing'] = 'Compartiendo';
$labels['myrights'] = 'Permisos de acceso';
$labels['username'] = 'Usuario:';

@ -2,19 +2,18 @@
/*
+-----------------------------------------------------------------------+
| plugins/acl/localization/<lang>.inc |
| |
| Localization file of the Roundcube Webmail ACL plugin |
| Copyright (C) 2012-2013, The Roundcube Dev Team |
| |
| Copyright (C) The Roundcube Dev Team |
| |
| Licensed under the GNU General Public License version 3 or |
| any later version with exceptions for skins & plugins. |
| See the README file for a full license statement. |
| |
+-----------------------------------------------------------------------+
For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/plugin-acl/
*/
$labels['sharing'] = 'Compartir';
$labels['myrights'] = 'Permisos de acceso';
$labels['username'] = 'Usuario:';

@ -2,19 +2,18 @@
/*
+-----------------------------------------------------------------------+
| plugins/acl/localization/<lang>.inc |
| |
| Localization file of the Roundcube Webmail ACL plugin |
| Copyright (C) 2012-2013, The Roundcube Dev Team |
| |
| Copyright (C) The Roundcube Dev Team |
| |
| Licensed under the GNU General Public License version 3 or |
| any later version with exceptions for skins & plugins. |
| See the README file for a full license statement. |
| |
+-----------------------------------------------------------------------+
For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/plugin-acl/
*/
$labels['sharing'] = 'Jagamine';
$labels['myrights'] = 'Ligipääsuõigused';
$labels['username'] = 'Kasutaja:';

@ -2,19 +2,18 @@
/*
+-----------------------------------------------------------------------+
| plugins/acl/localization/<lang>.inc |
| |
| Localization file of the Roundcube Webmail ACL plugin |
| Copyright (C) 2012-2013, The Roundcube Dev Team |
| |
| Copyright (C) The Roundcube Dev Team |
| |
| Licensed under the GNU General Public License version 3 or |
| any later version with exceptions for skins & plugins. |
| See the README file for a full license statement. |
| |
+-----------------------------------------------------------------------+
For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/plugin-acl/
*/
$labels['sharing'] = 'Partekatzen';
$labels['myrights'] = 'Sarbide-eskubideak';
$labels['username'] = 'Erabiltzailea:';

@ -2,19 +2,18 @@
/*
+-----------------------------------------------------------------------+
| plugins/acl/localization/<lang>.inc |
| |
| Localization file of the Roundcube Webmail ACL plugin |
| Copyright (C) 2012-2013, The Roundcube Dev Team |
| |
| Copyright (C) The Roundcube Dev Team |
| |
| Licensed under the GNU General Public License version 3 or |
| any later version with exceptions for skins & plugins. |
| See the README file for a full license statement. |
| |
+-----------------------------------------------------------------------+
For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/plugin-acl/
*/
$labels['sharing'] = 'اشتراک گذاری';
$labels['username'] = 'کاربر:';
$labels['add'] = 'افزودن';

@ -2,19 +2,18 @@
/*
+-----------------------------------------------------------------------+
| plugins/acl/localization/<lang>.inc |
| |
| Localization file of the Roundcube Webmail ACL plugin |
| Copyright (C) 2012-2013, The Roundcube Dev Team |
| |
| Copyright (C) The Roundcube Dev Team |
| |
| Licensed under the GNU General Public License version 3 or |
| any later version with exceptions for skins & plugins. |
| See the README file for a full license statement. |
| |
+-----------------------------------------------------------------------+
For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/plugin-acl/
*/
$labels['sharing'] = 'اشتراک‌گذاری';
$labels['myrights'] = 'حقوق دسترسی';
$labels['username'] = 'کاربر:';

@ -2,19 +2,18 @@
/*
+-----------------------------------------------------------------------+
| plugins/acl/localization/<lang>.inc |
| |
| Localization file of the Roundcube Webmail ACL plugin |
| Copyright (C) 2012-2013, The Roundcube Dev Team |
| |
| Copyright (C) The Roundcube Dev Team |
| |
| Licensed under the GNU General Public License version 3 or |
| any later version with exceptions for skins & plugins. |
| See the README file for a full license statement. |
| |
+-----------------------------------------------------------------------+
For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/plugin-acl/
*/
$labels['sharing'] = 'Jakaminen';
$labels['myrights'] = 'Käyttöoikeudet';
$labels['username'] = 'Käyttäjä:';
@ -22,14 +21,18 @@ $labels['advanced'] = 'Edistynyt tila';
$labels['add'] = 'Lisää';
$labels['newuser'] = 'LIsää kohde';
$labels['editperms'] = 'Muokkaa oikeuksia';
$labels['actions'] = 'Käyttöoikeuksien toiminnot...';
$labels['anyone'] = 'Kaikki käyttäjät (kuka tahansa)';
$labels['anonymous'] = 'Vieraat (anonyymit)';
$labels['identifier'] = 'Tunniste';
$labels['aclr'] = 'Lue viestit';
$labels['aclc'] = 'Luo alikansioita';
$labels['aclk'] = 'Luo alikansioita';
$labels['acld'] = 'Poista viestejä';
$labels['aclt'] = 'Poista viestejä';
$labels['acle'] = 'Tiivistä';
$labels['aclx'] = 'Poista kansio';
$labels['acla'] = 'Hallitse';
$labels['aclfull'] = 'Täydet käyttöoikeudet';
$labels['aclother'] = 'Muu';
$labels['aclread'] = 'Luku';
@ -43,15 +46,24 @@ $labels['shortaclc'] = 'Luo';
$labels['shortaclk'] = 'Luo';
$labels['shortacld'] = 'Poista';
$labels['shortaclt'] = 'Poista';
$labels['shortacle'] = 'Tiivistä';
$labels['shortaclx'] = 'Kansion poisto';
$labels['shortacla'] = 'Hallitse';
$labels['shortaclother'] = 'Muu';
$labels['shortaclread'] = 'Luku';
$labels['shortaclwrite'] = 'Kirjoitus';
$labels['shortacldelete'] = 'Poisto';
$labels['longaclr'] = 'Kansion voi avata lukua varten';
$labels['longaclp'] = 'Viestejä voidaan lähettää tähän kansioon';
$labels['longaclc'] = 'Kansioita voidaan luoda (tai uudelleennimetä) suoraan tämän kansion alle';
$labels['longaclk'] = 'Kansioita voidaan luoda (tai uudelleennimetä) suoraan tämän kansion alle';
$labels['longacle'] = 'Viestit voidaan tiivistää';
$labels['longaclx'] = 'Kansio voidaan poistaa tai nimetä uudelleen';
$labels['longacla'] = 'Kansion käyttöoikeuksia voi muuttaa';
$labels['longaclread'] = 'Kansion voi avata lukua varten';
$labels['longacldelete'] = 'Viestit voidaan poistaa';
$labels['longaclother'] = 'Muut käyttöoikeudet';
$labels['ariasummaryacltable'] = 'Lista käyttöoikeuksista';
$labels['arialabelaclactions'] = 'Listatoiminnot';
$messages['deleting'] = 'Poistetaan käyttöoikeuksia...';
$messages['saving'] = 'Tallennetaan käyttöoikeuksia...';

@ -2,19 +2,18 @@
/*
+-----------------------------------------------------------------------+
| plugins/acl/localization/<lang>.inc |
| |
| Localization file of the Roundcube Webmail ACL plugin |
| Copyright (C) 2012-2013, The Roundcube Dev Team |
| |
| Copyright (C) The Roundcube Dev Team |
| |
| Licensed under the GNU General Public License version 3 or |
| any later version with exceptions for skins & plugins. |
| See the README file for a full license statement. |
| |
+-----------------------------------------------------------------------+
For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/plugin-acl/
*/
$labels['sharing'] = 'Deiling';
$labels['myrights'] = 'Atgongdar-rættindi';
$labels['username'] = 'Brúkari:';

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

Loading…
Cancel
Save