Compare commits

...

330 Commits

Author SHA1 Message Date
Mark Scarbrough d0a14ffc05 Fix SQL syntax error on MariaDB 10.2 (#5774) (#6833)
Backported from 1.3 release to the 1.1 LTS release.
5 years ago
Thomas Bruederli fe0dc4eef8 Bump version to 1.1.12 and copyright to 2018 6 years ago
Aleksander Machniak 0c9074f286 Fix regression where IMAP commands with '*' uidset argument wasn't working 6 years ago
Thomas Bruederli d4475e58db Bump version to 1.1.11 6 years ago
Thomas Bruederli aaafe8f917 Fix check_request() bypass in plugins using get_uids() (#6238)
[CVE-2018-9846]
6 years ago
Thomas Bruederli 498ff0a283 Fix possible IMAP command injection vulnerability (#6229)
[CVE-2018-9846]
6 years ago
Aleksander Machniak 5d889cca13 Fix bug in remote content blocking on HTML image and style tags (#6178) 6 years ago
Aleksander Machniak a5dac2e694 Small improvement in log_dir handling 6 years ago
Aleksander Machniak bb9db12a79 Fix parse error from last commit 6 years ago
Aleksander Machniak a5e4578482 Don't ignore (global) userlogins/sendmail logs in per_user_logging mode 6 years ago
Thomas Bruederli 7f992eac3d Bump version + add CVE ID 7 years ago
Aleksander Machniak b707e19f4b Update changelog 7 years ago
Aleksander Machniak e757cc4101 Fix file disclosure vulnerability caused by insuficient input validation in relation with attachment plugins (#6026) 7 years ago
Thomas Bruederli 4181f29608 Bump version to 1.1.9 7 years ago
Aleksander Machniak 24902b7fc3 Add CVE ident 7 years ago
Aleksander Machniak 10b227d70a Password: Fix security issue in virtualmin and sasl drivers 7 years ago
Aleksander Machniak bcdba37a82 Fix bug where base_dn setting was ignored inside group_filters (#5720) 7 years ago
Aleksander Machniak 6b16e0d593 Fix regression in LDAP fuzzy search where it always used prefix search instead (#5713) 7 years ago
Aleksander Machniak 2a2b04eb2a Remove redundant spaces from generated contact names 7 years ago
Thomas Bruederli f1483204c7 Bump version to 1.1.8 7 years ago
Thomas Bruederli d6ddd31a1b Better fix for XSS in style tags (9b5eee294) 7 years ago
Aleksander Machniak 9b5eee2946 Fix XSS issue in handling of a style tag inside of an svg element 7 years ago
Aleksander Machniak 11b65a905f Make sure date_create_from_format() exists
Only for Roundcube 1.1 (this function does not exist on PHP < 5.3)
7 years ago
Aleksander Machniak 7536739c7a Fix bug where microsecond format in logged date didn't work in some cases 7 years ago
Aleksander Machniak 6c6b299d2a Fix so microseconds macro (u) in log_date_format works (#1490446) 7 years ago
Aleksander Machniak b7a4257ffb Rename $sql_arr variable to $record as it's not about sql only 7 years ago
Aleksander Machniak 4cd090aa24 Fix regression where groups with email address were resolved to its members' addresses 7 years ago
Aleksander Machniak fca2bb7869 Fix visual glitch when using disabled_actions for items in Settings menu 7 years ago
Aleksander Machniak f8e0e1d4ed Fix bug where signature couldn't be added above the quote in Firefox 51 (#5628) 7 years ago
Aleksander Machniak 72975042a5 Fix bug where mail content frame couldn't be reset in some corner cases (#5608)
Conflicts:
	CHANGELOG
7 years ago
Aleksander Machniak e6132dda95 Fix so group/addressbook selection is retained on page refresh 7 years ago
Aleksander Machniak 28e3da2325 Disable Print button for pdf attachments in Firefox (#5125)
Mozilla's PDF.js viewer does not allow printing from host page.
We try to detect such situation and disable the button to minimize
user confusion.
8 years ago
Thomas Bruederli 4c1394cf2d Bump version to 1.1.7 8 years ago
Aleksander Machniak 45a3e81653 Fix vulnerability in handling of mail()'s 5th argument 8 years ago
Aleksander Machniak aa6bf38843 Fix _from argument validation 8 years ago
Aleksander Machniak 860a3b47e7 Fix recognizing Sent folder on search if current folder has been changed by plugins in meantime 8 years ago
Bostjan Skufca 9b8db4c9e0 Autocomplete refactoring: replace variable name '$id' with '$abook_id'
Reason:
Having genericly named variable $id in nested loops makes code unreadable.
Replacing generic name '$id' with '$ENTITIY_id' format removes all ambiguity.
8 years ago
Aleksander Machniak 1123f39cf4 Fix missing contact ID for contacts from non-sql addressbooks 8 years ago
Bostjan Skufca 6fb8da08f3 Autocomplete search: add id and source (addressbook) into resulting contact data array
Two reasons:
- provide it to plugin backend functions that use 'contacts_autocomplete_after' hook
- provide it to frontend

Why to frontend?
If plugin JS adds an 'autocomplete_insert' hook we need to provide it with exact
autocomplete data. Providing it with name and email address only, without pinpointing
exact origin of this autocomplete result, will severely limit learning capabilities of
potential future autocomplete implementations.
8 years ago
Thomas Bruederli 802d119153 Bump version to 1.1.6 8 years ago
Aleksander Machniak 008f310f3a de_DE: abboniert -> abonniert 8 years ago
Aleksander Machniak 32ddcfd3d0 Fix error causing empty INBOX listing in Firefox when using an URL with user:password specified (#5400) 8 years ago
Aleksander Machniak 8e2fdee671 Fix de_DE translation for 'open' action (T1456) 8 years ago
Aleksander Machniak 16b6c8a0ce Fix missing min-height on ui-autocomplete lists (T1428) 8 years ago
Aleksander Machniak 93cb7b1fea Support contact+group searches in all relevant places (T1360)
Before the search worked only in Addressbook, not also in Compose.
The point of the change is also to align group searches with contact searches
in that it now uses the same set of attributes. Previously groups
in Compose were searched by name only.

Conflicts:

	program/lib/Roundcube/rcube_addressbook.php
	program/lib/Roundcube/rcube_contacts.php
	program/steps/mail/search_contacts.inc
8 years ago
Aleksander Machniak 3f10f9a2e6 Fix regression where LDAP results could be counted incorrectly when using VLV
... broken by d08bd0a51f where we added searching in users+groups in one request
8 years ago
Aleksander Machniak a647f994d8 Fix typo in de_DE localization (T1398) 8 years ago
Aleksander Machniak 264dfbbf82 Update changelog 8 years ago
Aleksander Machniak 425e31dc27 Wash position:fixed style in HTML mail for better security (#5264) 8 years ago
Aleksander Machniak b2781e145e Fix German localization label 8 years ago
Aleksander Machniak 4fa70856b9 Fix handling of blockquote tags with mixed case on html2text conversion (#5363)
Conflicts:
	CHANGELOG
8 years ago
Aleksander Machniak d10c591a61 Merge pull request #5330 from urc/patch-1
Do not mask fatal error when unable to load PEAR class
8 years ago
Aleksander Machniak 25510199be Don't create multipart/alternative messages with empty text/plain part (#5283)
Conflicts:
	CHANGELOG
	program/steps/mail/sendmail.inc
8 years ago
Thomas Bruederli f1d80c649e Avoid sending completely empty text parts for multipart/alternative messages (#5283) 8 years ago
Aleksander Machniak fbf89913a3 Fix missing localization of HTML editor when assets_dir != INSTALL_PATH
Conflicts:
	CHANGELOG
8 years ago
Aleksander Machniak 72a09408e9 Use contact_search_name format in popup on results in compose contacts search
Conflicts:

	CHANGELOG
	program/steps/mail/search_contacts.inc
8 years ago
dsoares f85227358a Avoid PHP fatal error
After last change to file `rcube_ldap.php`, my roundcube instance was getting this error:
```
PHP Fatal error:  Cannot use object of type Net_LDAP3_Result as array in ...
```
In
```php
protected function extended_search($count = false)
```
`$result = $this->ldap->search()` returns a LDAP object (whatever package we use).
If the search returns no results (and if `$is_extended_search` is false), then it gets to line 971 trying to do a `usort()` and then a `count()` on an object, instead of an array.
8 years ago
Aleksander Machniak 194690f59b Add managesieve plugin documentation 8 years ago
Aleksander Machniak ac592fd169 Searching in both contacts and groups when LDAP addressbook with group_filters option is used
Conflicts:

	CHANGELOG
	program/steps/addressbook/search.inc
8 years ago
urc 3e508e9587 Do not mask fatal error
A failure to load PEAR consistutes a fatal PHP error, and @-loading it prevents that error from being logged, making debugging problems with loading the PEAR class really difficult. It should therefore be loaded without the @ sign, allowing the fatal error to end up in the logs, if it occurs.
8 years ago
Aleksander Machniak e48f8945b3 Fix bug where message list columns could be in wrong order after column drag-n-drop and list sorting
Conflicts:
	CHANGELOG
8 years ago
Aleksander Machniak 73f411db7d Add missing sigbelow label in german localizations 8 years ago
Aleksander Machniak 7d14065baa Fix XSS issue in href attribute on area tag (#5240, #5241)
Conflicts:

	CHANGELOG
8 years ago
Aleksander Machniak 877b911dc4 Fix bug where contact search menu fields where always unchecked in Larry skin
Conflicts:

	CHANGELOG
8 years ago
Aleksander Machniak 550143269a Fix message list multi-select/deselect issue (#5219)
Conflicts:

	CHANGELOG
8 years ago
Thomas Bruederli 25bc871ee7 Bump version to 1.1.5 8 years ago
Aleksander Machniak ead0846934 Plugin API: Add html2text hook (backport from master) 8 years ago
Aleksander Machniak 848410042c Fix converting mail addresses with @www. into mailto links (#5197) 8 years ago
Aleksander Machniak c91d4975ff Make sure an email address is valid when replacing it with mailto: link 8 years ago
Aleksander Machniak d54eb6c951 CS fixes 8 years ago
Bostjan Skufca 55d90b2f62 mailbox/listing: Make server response for large mailbox listing faster when using threaded view
Symptom
=======
When using roundcube with mailboxes with over 60k messages, list
view was way faster than viewing in threaded view.

Mailbox index view timing:    ~360 ms
Mailbox threaded view timing: ~800 ms

Resolution
==========
Use native PHP array manipulation functions instead of rolling custom
string data reversal implementation using strpos() and substr() in a
'while' loop.

This optimization is already present in index view handler, but was missing
from threaded view.

Results after optimization
==========================
Both average out around ~360 ms response time.
8 years ago
Thomas Bruederli e1ae200201 Transliterate ticket IDs after migration to Github issues 8 years ago
Aleksander Machniak 473dc0b86d Fix so SPECIAL-USE assignments are forced only until user sets special folders (#4782)
The old behaviour where SPECIAL-USE has always a prio can be bringed back
by setting lock_special_folders=false and adding it to dont_override.
8 years ago
Aleksander Machniak b99a1bce89 Use pear repository via secure channel 8 years ago
Aleksander Machniak 86bc1f95ea Require Net_Socket >= 1.0.12 (because of timeout=0 bugfix)
Conflicts:
	INSTALL
8 years ago
Aleksander Machniak 2bfce1ae20 Refer to Github issues instead of Trac 8 years ago
Thomas Bruederli 066b205c72 Refer to Github issues instead of Trac 8 years ago
Aleksander Machniak 7c04110698 Fix so contactlist_fields option can be set via config file 8 years ago
Aleksander Machniak 4d3f055ce0 Refactor desktop notifications
- Remove webkitNotifications support, clean up the code
- Unify look and behaviour of notifications in Mail and in Settings

Conflicts:

	plugins/newmail_notifier/newmail_notifier.js
8 years ago
Aleksander Machniak 126d099e83 Fix PHP warning when defaults.inc.php is not readable 8 years ago
Aleksander Machniak 160013555f Update changelog 8 years ago
Thomas Bruederli 699af1e520 Protect download urls against CSRF using unique request tokens (#1490642)
Send X-Frame-Options headers with every HTTP response

Conflicts:
	plugins/enigma/enigma.js
	plugins/enigma/lib/enigma_ui.php
	program/lib/Roundcube/rcube_message.php
8 years ago
Aleksander Machniak b01689caf8 Hide DSN option in Preferences when smtp_server is not used (#1490666) 8 years ago
Aleksander Machniak 7a73635214 Fix unicode-awareness of Base64 encoding implementation in javascript 8 years ago
Aleksander Machniak 58c03846e7 Fix list row selection when provided uid is number not a string 8 years ago
Aleksander Machniak d66793f0af Fix missing emoticons on html-to-text conversion 8 years ago
Aleksander Machniak f915d15c43 Bring back additional_message_headers compatibility with Mail_Mime < 1.9 8 years ago
Aleksander Machniak c8023ac6b1 Fix additional_message_headers plugin compatibility with Mail_Mime >= 1.9 (#1490657) 8 years ago
Aleksander Machniak 8d047c668f Plugin API: Added addressbook_export hook 8 years ago
Aleksander Machniak 3e55a2d9cb Fix bug in long recipients list parsing for cases where recipient name contained @-char (#1490653) 8 years ago
Aleksander Machniak a2d5db0a98 Fix bug where Archive/Junk buttons were not active after page jump with select=all mode (#1490647) 8 years ago
Aleksander Machniak d3b98eb4dc Fix (again) security issue in DBMail driver of password plugin [CVE-2015-2181] (#1490643)
Unify the C program code with the one used by other drivers.

Conflicts:
	CHANGELOG
8 years ago
Aleksander Machniak 4de4438340 Fix regression where xml mode could be used to parse xhtml messages causing empty result 8 years ago
Aleksander Machniak 768e3e1b09 Improved SVG cleanup code 8 years ago
Aleksander Machniak 847c771d9e Refactor wash_attribs() - fix regressions 8 years ago
Aleksander Machniak 3e4b7cd19d Extend rcube_washtml with SVG support 8 years ago
Aleksander Machniak 7bbefdb63b Fix XSS issue in SVG images handling (#1490625)
Conflicts:

	CHANGELOG
8 years ago
Aleksander Machniak 3f6fbdcc6d Fix random "access to this resource is secured against CSRF" message at logout (#1490641)
- this is when openssl module is not installed
8 years ago
Aleksander Machniak db76c50a7c Update ticket number 8 years ago
Francis Russell 8a53588940 Make TLS method for IMAP parameterisable. 8 years ago
Francis Russell f8911c2a7f Enable use of TLSv1.1 and TLSv1.2 for IMAP. 8 years ago
Aleksander Machniak fc5befff0f Fix missing language name in "Add to Dictionary" request in HTML mode (#1490634)
Conflicts:

	CHANGELOG
8 years ago
Thomas Bruederli 772e08fa2a Fix mail view scaling on iOS (#1490551) 9 years ago
Thomas Bruederli f2ff464002 Bump version to 1.1.4; update Changelog 9 years ago
Aleksander Machniak ded453cdc4 Fix .htaccess rewrite rules to not block .well-known URIs (#1490615)
Conflicts:

	.htaccess
	CHANGELOG
9 years ago
Aleksander Machniak 7d0099f28e Fix so drag-n-drop of text (e.g. recipient addresses) on compose page actually works (#1490619)
Conflicts:

	CHANGELOG
9 years ago
Aleksander Machniak 89a5dcb946 Fix path traversal vulnerability in setting a skin (#1490620)
Conflicts:

	CHANGELOG
9 years ago
Aleksander Machniak 9fbabc4668 Add INBOX to the list of folders only if no filter and no prefix was specified 9 years ago
Aleksander Machniak c67e7e8f85 Fix PDF support detection in Firefox > 19 (#1490610)
Conflicts:
	CHANGELOG
9 years ago
Aleksander Machniak c82d09a052 Fix handling of message/rfc822 attachments on replies and forwards (#1490607)
Conflicts:

	CHANGELOG
	program/lib/Roundcube/rcube_message.php
	program/steps/mail/compose.inc
9 years ago
Aleksander Machniak 6e71c958fc Fix also charset encoding of message/rfc822 part bodies (#1490606) 9 years ago
Aleksander Machniak 2382c6e822 Fix regression in displaying contents of message/rfc822 parts (#1490606)
Conflicts:

	CHANGELOG
9 years ago
Aleksander Machniak b6b92c0ddd Optionally throw 404 error when contact photo wasn't found 9 years ago
Aleksander Machniak 5143c47e0f Fix rcube_utils::words_match() to work with mixed/invalid/binary content (T844) 9 years ago
Aleksander Machniak 818b78a893 Fix invalid LDAP query in ACL user autocompletion (#1490591) 9 years ago
Aleksander Machniak 78a9870e00 Remove redundant .gitignore files 9 years ago
Thomas Bruederli 62ee427b7e Improve directory protection for Apache 2.4 9 years ago
Aleksander Machniak 9953d5c10c Add workaround for https://bugs.php.net/bug.php?id=70757 (#1490582) 9 years ago
Aleksander Machniak c7c09f85d9 Fix HTML sanitizer to skip <!-- node type X --> in output (#1490583) 9 years ago
Aleksander Machniak 2c3634df04 Update changelog 9 years ago
Aleksander Machniak 8e7f32fddc Small improvements in HTML to text conversion.
Better handling of <body> and trailing spaces, and </p><div> or <br><div>.
9 years ago
Aleksander Machniak 9e808942ba Update changelog 9 years ago
Aleksander Machniak a04a16c285 Make sure list page is never set to 0 (#1490458)
This should fix the issue where after message move wrong message was
added to the list and the list counter was invalid.
9 years ago
Aleksander Machniak 72be74508f Fix redundant blank lines when using HTML and top posting (#1490576) 9 years ago
Aleksander Machniak 6ee039e10e Bump Net_SMTP version in composer config (#1490569) 9 years ago
Aleksander Machniak 5de338e45e Update changelog 9 years ago
Aleksander Machniak 70942083ce After failed login wait a second to slow down brute-force attacks (#1490549) 9 years ago
Aleksander Machniak 280395a544 Fix bug where HTML messages with invalid/excessive css styles couldn't be displayed (#1490539)
Technically speaking we remove the whole CSS content when it has more than 5k lines.
9 years ago
Aleksander Machniak c5acbc6c94 Fix bug where message preview was unintentionally reset on check-recent action (#1490563) 9 years ago
Aleksander Machniak 5e6f6ac539 Fix responses list update issue after response name change (#1490555) 9 years ago
Aleksander Machniak ba48318e2c Fix so database_attachments::cleanup() does not remove attachments from other sessions (#1490542)
Conflicts:
	CHANGELOG
9 years ago
Aleksander Machniak 3d9798da1f Make brute force attacks harder by re-generating security token on every failed login (#1490549)
Or more precissely use the same we did in git-master, i.e. do not base the token on
session ID, but use random bytes instead.
9 years ago
Aleksander Machniak 7d9a29cbc0 Remove also old .htaccess file that is not used anymore (#1489980) 9 years ago
Aleksander Machniak c2269df436 Require PHP5 9 years ago
Aleksander Machniak 0596f79a18 Require PHP5 9 years ago
Aleksander Machniak 357cd5103d Fix issue where Content-Length of some attachments could be set to wrong value causing browser errors (#1490482) 9 years ago
Aleksander Machniak 6731d2116c Fix XSS issue in drag-n-drop file uploads (#1490530) 9 years ago
Aleksander Machniak 73d98c4766 Fix missing HTTP_X_FORWARDED_FOR address in generated Received header 9 years ago
Aleksander Machniak 9f98332240 Fix so In-Reply-To header is set also for MDN receipts (#1490523) 9 years ago
Aleksander Machniak bbef212b0e Fallback to C locale 9 years ago
Aleksander Machniak 7bfe676d53 Fix various issues with Turkish (and similar) locales (#1490519) 9 years ago
Aleksander Machniak ac3078fe93 Fix support for Mozilla-based browsers, e.g. Pale Moon (#1490517) 9 years ago
Aleksander Machniak 03be470538 Fix so gc.sh script removes also expired sessions from sql database (#1490512) 9 years ago
Aleksander Machniak 52b75f2506 Fix so adding CC/BCC recipients from the sidebar unhides compose form fields in Classic skin (#1490472) 9 years ago
Aleksander Machniak 8ef86f5253 Fix handling of plus character in mailto: links (#1490510) 9 years ago
Aleksander Machniak b9bbc69ddc Fix typo 9 years ago
Aleksander Machniak 5f10f13472 Fix so css of one html part does not apply to other text parts on message display (#1490505) 9 years ago
Thomas Bruederli 106d47992b Bump version and update changelog 9 years ago
Thomas Bruederli 27e02f0f3b Fix closing of nested menus (#1490443) 9 years ago
Aleksander Machniak 8a2d5561b6 Fix dependencies version numbers where ~ is used
Conflicts:

	composer.json-dist
9 years ago
Aleksander Machniak 1e15c50e87 Lock dependencies versions
Conflicts:

	composer.json-dist
9 years ago
Aleksander Machniak 6564cf8a4b Change code so versions of Mail_mime before and after 1.9.0 are supported
Conflicts:
	program/lib/Roundcube/rcube.php
9 years ago
Aleksander Machniak dddc985ce2 Make Mail_mime>=1.9.0 a requirement, fix compat. errors
Conflicts:
	composer.json-dist
9 years ago
Aleksander Machniak 495b5c3883 Don't display not-sent-warning in compose page on save-pref action 9 years ago
Aleksander Machniak b45b15e5a8 Fix selecting a folder on collapse when any subfolder is selected 9 years ago
Aleksander Machniak 794b2f1d46 Really make base64 encoding unicode-aware 9 years ago
Aleksander Machniak b44a6554bb Fix base64.encode/decode for unicode characters - use fallback if btoa/atob functions fail 9 years ago
Aleksander Machniak 14693832b2 Fix so input field (e.g. search box) does not loose focus on list load (#1490455) 9 years ago
Aleksander Machniak ca7fc75bec Fix "washing" of style elements wrapped into many lines 9 years ago
Thomas Bruederli 8b26f548b5 Add localization alias for tr => tr_TR 9 years ago
Aleksander Machniak f3c12bf7ef Get rid of Mail_mimeDecode package dependency (#1490416)
Conflicts:

	CHANGELOG
	composer.json-dist
9 years ago
Aleksander Machniak eddae8976d Disable links list generation on html-to-text conversion of identities or composed message (#1490437) 9 years ago
Aleksander Machniak b45e9b49b9 Fix removing signature when switching to identity with an empty sig in HTML mode (#1490470) 9 years ago
Aleksander Machniak 1172330b2a Fix error when using back button after sending an email (#1490009) 9 years ago
Aleksander Machniak 0e647e4aa0 Don't use private properties of Net_SMTP object 9 years ago
Aleksander Machniak 468e61b264 Fix some javascript errors in rare situations (#1490441) 9 years ago
Aleksander Machniak 9ca27756f1 Fix wrong positioning of message list header on page scroll in Webkit browsers (#1490035)
Conflicts:

	CHANGELOG
9 years ago
Aleksander Machniak fe82e213c3 Fix so E_DEPRECATED errors from PEAR libs are ignored by error_reporting change (#1490281) 9 years ago
Aleksander Machniak 424c25e5bc Fix bug where new messages weren't added to the list in search mode 9 years ago
Aleksander Machniak 844ee296a8 Revert create_folder() behaviour change where the method didn't fail if folder already existed.
This should not be the default behaviour. It could likely
become an optional functionality, however we should keep the method simple.
9 years ago
Aleksander Machniak f0feb7701e Use in_array_nocase() also for \\Noselect flag check (#1490466) 9 years ago
Aleksander Machniak 19a61851ae Fix so imap folder attribute comparisons are case-insensitive (#1490466)
+ make in_array_nocase() much faster for ASCII strings
9 years ago
Aleksander Machniak 71bfa5f207 Fix draft removal after a message is sent and storing sent message is disabled (#1490467) 9 years ago
Aleksander Machniak 612b04ac30 Reset internal cache index in close()
Conflicts:

	program/lib/Roundcube/rcube_cache.php
	program/lib/Roundcube/rcube_cache_shared.php
9 years ago
Aleksander Machniak 895efa1d42 Fix bug where some messages in multi-folder search couldn't be printed/downloaded (#1490426)
Conflicts:

	program/js/app.js
9 years ago
Aleksander Machniak 383749eeff Update to TinyMCE 4.1.10 (#1490405) 9 years ago
Aleksander Machniak a9035b1561 Fix so *-request@ addresses in Sender: header are also ignored on reply-all (#1490452)
Conflicts:
	program/steps/mail/compose.inc
9 years ago
Aleksander Machniak f7dd463174 Fix multi-folder search result sorting by arrival date (#1490450) 9 years ago
Aleksander Machniak 8cc6b18bcd Get rid of array_walk() when simple foreach() can be used 9 years ago
Aleksander Machniak 70422cd7a2 Fix Fatal error after last commit 9 years ago
Aleksander Machniak 947c4dc30b Fix issue when first search() argument is not an array 9 years ago
Thomas Bruederli c0087512aa Adapt washtml test to pass with different versions of iconv (i.e. on CentOS7) 9 years ago
Thomas Bruederli b91adb30a2 Adapt charset cleanup tests to pass with different versions of iconv propucing slightyl different output 9 years ago
Aleksander Machniak 0aadd71183 Fix self-reply detection issues (#1490439) 9 years ago
Aleksander Machniak 8e68430749 Fix handling of non-break spaces in html to text conversion (#1490436) 9 years ago
Aleksander Machniak 3a428d9571 Make has_(html|text)_part and first_(html|text)_part methods consistent in arguments and functionality 9 years ago
Aleksander Machniak 25c457dc68 Modify rcube_smtp::send_mail() so it is possible to send message by
specifying only the message stream no headers, it's for cases when
the stream already contains a complete message.
9 years ago
Aleksander Machniak fec877f038 Fix so links with href == content aren't added to links list on html to text conversion (#1490434) 9 years ago
Aleksander Machniak 3f4521bcf4 Fix so plain text signature field uses monospace font (#1490435) 9 years ago
Aleksander Machniak 92e36f6839 Fix race-condition in saving user preferences and loading plugin config (#1490431) 9 years ago
Aleksander Machniak 8cab554252 Fix unintentional messages list page change on page switch in compose addressbook (#1490427) 9 years ago
Aleksander Machniak e8028083b9 Fix bug where some messages in multi-folder search couldn't be opened (#1490426) 9 years ago
Aleksander Machniak 2ddd3b1a25 Update changelog 9 years ago
Aleksander Machniak cb0e0777ce Fix "PHP Fatal error: Using $this when not in object context" 9 years ago
Aleksander Machniak 30e71606a0 Fix Compose action in addressbook for results from multiple addressbooks (#1490413)
Conflicts:

	CHANGELOG
9 years ago
Aleksander Machniak 5eafc4b9d6 Update changelog 9 years ago
Aleksander Machniak ef07e9e546 Update to jQuery 2.1.4 (#1490406) 9 years ago
Aleksander Machniak d438147ddc Fix SQL error on logout when using session_storage=php (#1490421) 9 years ago
Aleksander Machniak 552854d738 Fix "Importing..." message does not hide on error (#1490422)
Conflicts:
	CHANGELOG
9 years ago
Daniel Hoffend 8fab64e594 remove debug test code 9 years ago
Thomas Bruederli a552b506da Fix composer.json update routine 9 years ago
Aleksander Machniak 15fd8f9dc7 Fix XSS vulnerability in _mbox argument handling (#1490417) 9 years ago
Aleksander Machniak 5529d94ed7 Installer: Use openssl_random_pseudo_bytes() (if available) to generate des_key (#1490402)
Conflicts:

	CHANGELOG
9 years ago
Aleksander Machniak 4312ac809c Fix blank image in html_signature when saving identity changes (#1490412) 9 years ago
Aleksander Machniak a76693ef4c Fix replacing :$, :-$, O:) and O:-) with emoticons (#1490408, #1490409) 9 years ago
Thomas Bruederli 245619e98d Update localizations from Transifex 9 years ago
Thomas Bruederli 024de499e5 Updated Changelog 9 years ago
Thomas Bruederli f1ae19dc6b Bump version 9 years ago
Thomas Bruederli d8ffedbd5e Add new plugin hook 'identity_create_after' (#1490358) 9 years ago
Aleksander Machniak d5694ef84f Fix issues when using moduserprefs.sh without --user argument (#1490399)
Conflicts:

	program/include/rcmail_utils.php
9 years ago
Aleksander Machniak 4d97838ed9 Fix font artifacts in text2html conversion (#1490353)
Use white-space:nowrap elements instead of unicode word-joiner character
9 years ago
Aleksander Machniak 1f61e55a33 Fix attached file path unsetting in database_attachments plugin (#1490393) 9 years ago
Aleksander Machniak 84af0db103 Fix bug where some files could have "executable" extension when stored in temp folder (#1490377) 9 years ago
Aleksander Machniak b33c076d8c Fix bug where imap_conn_options were ignored in IMAP connection test (#1490392) 9 years ago
Aleksander Machniak 942b82a418 Fix bug where database_attachments_cache setting was not working 9 years ago
Aleksander Machniak 244a46fdea Fix missing index update after write() call 9 years ago
Aleksander Machniak 92459da0e2 Fix possible memcache/apc cache data consistency issues (#1490390)
And removed unused code

Conflicts:

	program/lib/Roundcube/rcube_cache.php
	program/lib/Roundcube/rcube_cache_shared.php
9 years ago
Aleksander Machniak a7d269253f Workaround possible issue where some keys were ignored when deleting cached entries
by key name prefix and keys index is in inconsistent state (does not contain all keys)
9 years ago
Thomas Bruederli 16640c7fb0 Add .htaccess files to deny access to config, temp, logs + describe how to protect access to these directories in the INSTALL instructions (#1490378) 9 years ago
Aleksander Machniak 1d024f37cc Fix mb_substitute_character() use 9 years ago
Aleksander Machniak 884070db68 Skip some tests on PHP 5.3.3 9 years ago
Aleksander Machniak 100780d837 Add some more tests for rcube_charset::clean() 9 years ago
Aleksander Machniak c084a6ab8b Fix rcube_charset::clean() for case when mbstring and iconv are not installed 9 years ago
Aleksander Machniak 04e767613d Fix failing rcube_utils::strtotime() test if system timezone was different than expected 9 years ago
Aleksander Machniak 4471b2bffb Fix security issue in contact photo handling (#1490379) 9 years ago
Thomas Bruederli b765160fd5 Improve LDAP search by ignoring words order in fuzzy substring matching mode 9 years ago
Thomas Bruederli 15bcfbd55f Add utility function to compose a full-text-like LDAP search filter 9 years ago
Aleksander Machniak 7310a6d66c Fix bug where messages count was not updated after message move/delete with skip_deleted=false (#1490372) 9 years ago
Aleksander Machniak 6efad5325d Fix typo in aria attribute name (#1490370) 9 years ago
Thomas Bruederli 9c24e1963a Switch repository URLs to https: 9 years ago
Aleksander Machniak 322186014c Bump up version number 9 years ago
Aleksander Machniak d0a4f1152e Add option to prepopulate vacation addresses on form init (#1490030) 9 years ago
Aleksander Machniak 4d35a983cc Fix bug where preview_pane setting wasn't always saved into user preferences (#1490362) 9 years ago
Aleksander Machniak 84dde88680 Fix decoding array headers 9 years ago
Aleksander Machniak 3a46e7defc Fix message highligh regression from last commit (#1490363) 9 years ago
Aleksander Machniak d3333df32b Trigger 'listupdate' event also on response to check-recent request 9 years ago
Aleksander Machniak 4315619cfe Update changelog 9 years ago
Aleksander Machniak 35a32df940 Fix mouseup event handling when dragging a list record (#1490359)
This fixes drag-n-drop on managesieve filters list.
9 years ago
Aleksander Machniak 0f797eddd8 Fix incorrect filter data after filter delete (#1490356)
Fix missing position idicator in Larry skin when dragging a filter
9 years ago
Aleksander Machniak 9dd3559ee4 Fix bug where some unrelated attachments in multipart/related message were not listed (#1490355) 9 years ago
Aleksander Machniak ef595a10e0 Add option to place signature at bottom of the quoted text even in top-posting mode [sig_below]
Conflicts:

	CHANGELOG
9 years ago
Thomas Bruederli 306bbba353 Update git url for kolab/Net_LDAP3 package repository 9 years ago
Aleksander Machniak 6188233705 Fix Net_LDAP3 homepage location 9 years ago
Aleksander Machniak 3d87a667b1 Add option to define default vacation interval 9 years ago
Aleksander Machniak 24f046cf47 Fix bug where forced extwin page reload could exit from the extwin mode (#1490350)
With small improvements in rcube_webmail.url() method.
9 years ago
Aleksander Machniak 22c0b291f6 Fix font artifact in Google Chrome on Windows (#1490353) 9 years ago
Aleksander Machniak 72863836e5 Fix handling spaces after <br> on html2text conversion 9 years ago
Aleksander Machniak 61c35b4a2b Fix lack of signature separator for plain text signatures in html mode (#1490352)
Conflicts:
	CHANGELOG
9 years ago
Aleksander Machniak 3832e4507b Fix so text/calendar parts are listed as attachments even if not marked as such (#1490325) 9 years ago
Aleksander Machniak d671bed7eb Fix message list header in classic skin on window resize in Internet Explorer (#1490213) 9 years ago
Aleksander Machniak b41140ba37 Fix tables listing routine on mysql and postgres so it skips system or other database tables and views (#1490337) 9 years ago
Aleksander Machniak 998afb1725 Remove Kolab's hack for Cyrus Murder bug in SETANNOTATION - it's not needed anymore 9 years ago
Aleksander Machniak fdcef5ef7e Fix PHP warning: Non-static method PEAR::setErrorHandling() should not be called statically (#1490343) 9 years ago
Aleksander Machniak 88578e27d5 Fix vpopmaild driver of password plugin 9 years ago
Aleksander Machniak 91ac83e82f Fix zipped messages downloads after selecting all messages in a folder (#1490339) 9 years ago
Aleksander Machniak 68f76fddbe Fix handling of %-encoded entities in mailto: URLs (#1490346)
Conflicts:

	CHANGELOG
9 years ago
Thomas Bruederli 6066619818 Allow help plugin to append a link to the error page for more information about CSRF protection 9 years ago
Thomas Bruederli d5b4ef0de2 Wording 9 years ago
Thomas Bruederli c7a88ff0c2 Localize common error messages; improve explanation for CSRF check failures 9 years ago
Thomas Bruederli 91d3545193 Lock PEAR Mail_mimeDecode at version 1.5.5 9 years ago
Thomas Bruederli 4ba89c9f99 Backport new utility function for compatibility reasons 9 years ago
Thomas Bruederli 2c0861495b Bump version for next release 9 years ago
Thomas Bruederli ee9742c873 Avoid errors when message list doesn't have a header 9 years ago
Aleksander Machniak f62fe135bf Fix missing host:port in connection error message 9 years ago
Aleksander Machniak 979f08e4df Fix javascripts errors in IE8 - lack of Event.which, focusing a hidden element (#1490318) 9 years ago
Thomas Bruederli 791c66c5fb Do not re-append an existing node when re-rendering with childs 9 years ago
Thomas Bruederli d9e854ccfe Update Changelog 9 years ago
Thomas Bruederli bb345b4b4b Fix menu container references to point to the actual <ul> element (#1490313) 9 years ago
Thomas Bruederli b50ae45698 Update Changelog 9 years ago
Thomas Bruederli c14c21472e Fix redirct URL for attachments loaded in an iframe (#1490191) 9 years ago
Thomas Bruederli 70f47ffc0b Update Changelog 9 years ago
Thomas Bruederli 1aa49741b2 Give other plugins the opportunity to adjust the list of permissions and groups to edit 9 years ago
Thomas Bruederli edabce3091 Make ACL popups scale to the actual content and avoid scrolling if possible 9 years ago
Aleksander Machniak 00a1759129 Fix handling of header test with one-element array as header name 9 years ago
Thomas Bruederli 7ba82e0992 Update Changelog 9 years ago
Thomas Bruederli 3e09bcdef0 Generate random hash for the per-user local storage prefix (#1490279); only unserialize user prefs once 9 years ago
Aleksander Machniak 8f74b23dd2 Fix backtick character handling in sql queries (#1490312) 9 years ago
Thomas Bruederli 50e1ca2814 Fix submission of _reload parameter when switching address books 9 years ago
Aleksander Machniak b9f8bb3cab Fix bug where TinyMCE area height was too small on slow network connection (#1490310) 9 years ago
Aleksander Machniak 6855623cf5 Fix bug where spellchecking in HTML editor do not work after switching editor type more than once (#1490311) 9 years ago
Aleksander Machniak 5c74c978f8 Update TinyMCE cache_suffix (forgot to do this after last update) 9 years ago
Aleksander Machniak 2d5b35eb5b Upgrade TinymCE to version 4.1.9 9 years ago
Aleksander Machniak ef09b2751b Fix rows count when messages search fails (#1490266) 9 years ago
Aleksander Machniak 2ea55829be (Properly) reset search filter on reset-search action 9 years ago
Aleksander Machniak 1e7c877a66 Reset search filter on folder selection and search reset 9 years ago
Aleksander Machniak 100fea325e Unified request* event arguments handling, added support for _unlock and _action parameters 9 years ago
Aleksander Machniak 5bdd767a48 Fix so search filter, scope and fields are reset on folder change 9 years ago
Aleksander Machniak c13dd984e1 Fix Opera browser detection in javascript (#1490307) 9 years ago
Aleksander Machniak 6d876a3b54 Fix storing signatures with big images in MySQL database (#1490306) 9 years ago
Aleksander Machniak 26c9930103 get_part_content() -> get_part_body() 9 years ago
Aleksander Machniak d8efe06f4c Update to TinyMCE 4.1.8 9 years ago
Aleksander Machniak c861ba15fe Fix missing vcard_attachment icon on messages list (#1490303) 9 years ago
Aleksander Machniak e14e631947 Update changelog 9 years ago
Aleksander Machniak 14f4633b0b Remove redundant encoding of message subject with mb_encode_mimeheader() (#1490295) 9 years ago
Aleksander Machniak d093e96ec2 Fix javascript error after creating a folder which is a subfolder of another one (#1490297) 9 years ago
Aleksander Machniak 199446c16d Fix so localized folder name is displayed in multi-folder search result (#1490243) 9 years ago
Aleksander Machniak 9613687428 Fix "Add response" button title, remove wrong identities_level checks in Responses, fix cursor on some lists 9 years ago
Aleksander Machniak df4243b80a Fix duplicate entry on timezones list in rcube_config::timezone_name_from_abbr() (#1490293) 9 years ago
Aleksander Machniak c4104166e3 Update changelog 9 years ago
Aleksander Machniak 5bb2fe27a0 Fix parsing ldap URI for cases where hostname is non-empty 9 years ago
Aleksander Machniak b7048d8d2d Fix parsing invalid HTML messages with BOM after <!DOCTYPE> (#1490291) 9 years ago
Aleksander Machniak 2799f049bb Fix "Non-static method PEAR::isError() should not be called statically" errors (#1490281) 9 years ago
Aleksander Machniak ab84cc15e5 Reset default db_max_allowed_packet, fix max packet size detection 9 years ago
Aleksander Machniak f985cbedc6 Fix duplicate entries supression in autocomplete result (#1490290) 9 years ago
Aleksander Machniak f129972361 Improve compose_search_name() to not return "email@address <email@address>" entries
which may happen for contacts without name(s)
9 years ago
Aleksander Machniak b56a3b00f0 Don't sent the message again in saveonly mode 9 years ago
Aleksander Machniak 16c326380d Improved handling of storage errors after message is sent
After sending a message it is stored in Sent folder, this operation
may fail, e.g. because of "over quota" error. In such a case we'll
not close the compose window, but display the error and, if user clicks
Send/Save button, we'll display a dialog informing about the situation and
providing an option to try the save operation again.
9 years ago
Aleksander Machniak bbbd02bd6a Fix so "over quota" errors are displayed also in message compose page
This also fixes over quota responses on cyrus imap which uses "Over quota" string and no error identifier.
9 years ago
Thomas Bruederli 230ec1104f Update internal reference to treelist node contents after insert. Fixes some strange behavior in FF 3.6 9 years ago
Aleksander Machniak 44f58b0bcb Add possibility to configure max_allowed_packet value for all database engines (#1490283) 9 years ago
Aleksander Machniak cd8bcf3801 Fix "PHP Fatal error: Call to a member function getMessage() on a non-object" 9 years ago
Aleksander Machniak 1cb0b1481d Use also Organization field as a fallback if contact has no name(s) specified 9 years ago
Aleksander Machniak 366ffd7aa0 Fix typo 9 years ago
Aleksander Machniak ce08e08dad Fix cursor position on reply below the quote in HTML mode (#1490263)
Also other cursor position inconsistency. Additionally fixed
invisible cursor in HTML editor in older Firefox browser versions.
9 years ago
Thomas Bruederli 39434509cd Describe Composer installation when upgrading from a < 1.1 version 9 years ago
Aleksander Machniak 9e147a36ad Fix fatal errors on systems without mbstring extension or mb_regex_encoding() function (#1490280) 9 years ago
Aleksander Machniak 334eb48cfe Merge branch 'release-1.1' of github.com:roundcube/roundcubemail into release-1.1
Conflicts:
	CHANGELOG
9 years ago
Aleksander Machniak 99dafc41a3 Fix missing or not up-to-date CATEGORIES entry in vCard export (#1490277)
Conflicts:
	CHANGELOG
9 years ago
Aleksander Machniak bec8735d66 Display group icon on group entry in ACL autocomplete list 9 years ago
Aleksander Machniak c8468c2960 Really fix unwanted warning on BMP attachments (#1490269) 9 years ago
Aleksander Machniak 825b2b9ab9 Fix performance of rcube_db_mysql::get_variable()
As currently we're using this to find only max_allowed_packet value,
it is better to use "SHOW VARIABLES LIKE ?" instead of asking for all variables.
9 years ago
Aleksander Machniak ca85a8e32c Fix handling of some improper constructs in format=flowed text as per the RFC3676[4.5] (#1490284) 9 years ago
Aleksander Machniak afd5e4f8a9 Fix needless security warning on BMP attachments display (#1490282) 9 years ago
Aleksander Machniak dab95db19c Fix setting max packet size for DB caches and check packet size also in shared cache
Conflicts:

	CHANGELOG
9 years ago
Aleksander Machniak c8aa7a2048 Update changelog 9 years ago
Aleksander Machniak cd51e611ff Fix saving/sending emoticon images when assets_dir is set (Kolab #4608) 9 years ago
Aleksander Machniak 9a833f6faa Fix PHP fatal error when visiting Vacation interface and there's no sieve script yet 9 years ago
Aleksander Machniak 9920097bfc Add possibility to print contact information (of a single contact) 9 years ago
Aleksander Machniak 2839caa7e7 Fix regression where Help toolbar buttons have had incorrect title 9 years ago
Aleksander Machniak 9ed3c429eb Fix a regression where some contact data was missing in export and PHP warnings were logged (Kolab #4522) 9 years ago

@ -31,7 +31,7 @@ RewriteRule ^favicon\.ico$ skins/larry/images/favicon.ico
# security rules:
# - deny access to files not containing a dot or starting with a dot
# in all locations except installer directory
RewriteRule ^(?!installer|[a-f0-9]{16})(\.?[^\.]+)$ - [F]
RewriteRule ^(?!installer|\.well-known\/|[a-f0-9]{16})(\.?[^\.]+)$ - [F]
# - deny access to some locations
RewriteRule ^/?(\.git|\.tx|SQL|bin|config|logs|temp|tests|program\/(include|lib|localization|steps)) - [F]
# - deny access to some documentation files

File diff suppressed because it is too large Load Diff

@ -11,15 +11,15 @@ REQUIREMENTS
* The Apache, Lighttpd, Cherokee or Hiawatha web server
* .htaccess support allowing overrides for DirectoryIndex
* PHP Version 5.3.7 or greater including
* PHP Version 5.3.7 or greater (but not PHP 7) including
- PCRE, DOM, JSON, Session, Sockets (required)
- PHP Data Objects (PDO) with driver for either MySQL, PostgreSQL or SQLite (required)
- Libiconv, Zip (recommended)
- OpenSSL, Fileinfo, Mcrypt, mbstring (optional)
* PEAR packages distributed with Roundcube or external:
- Mail_Mime 1.8.1 or newer
- Mail_mimeDecode 1.5.5 or newer
- Net_SMTP (latest from https://github.com/pear/Net_SMTP/)
- Mail_Mime 1.9.0 or newer
- Net_SMTP 1.7.1 or newer
- Net_Socket 1.0.12 or newer
- Net_IDNA2 0.1.1 or newer
- Auth_SASL 1.0.6 or newer
- Net_Sieve 1.3.2 or newer (for managesieve plugin)
@ -153,6 +153,29 @@ increase the allowed size of file attachments, for example:
php_value upload_max_filesize 2M
SECURE YOUR INSTALLATION
========================
Access through the webserver to the following directories should be denied:
/config
/temp
/logs
Roundcube uses .htaccess files to protect these directories, so be sure to
allow override of the Limit directives to get them taken into account. The
package also ships a .htaccess file in the root directory which defines some
rewrite rules. In order to properly secure your installation, please enable
mod_rewrite for Apache webserver and double check access to the above listed
directories and their contents is denied.
NOTE: In Apache 2.4, support for .htaccess files has been disabled by
default. Therefore you first need to enable this in your Apache main or
virtual host config by with:
AllowOverride all
UPGRADING
=========

@ -80,8 +80,8 @@ For more information visit [roundcube.net/contribute][contrib]
CONTACT
-------
For any bug reports or feature requests please refer to the tracking system
at [trac.roundcube.net][tracreport] or subscribe to our mailing list.
For bug reports or feature requests please refer to the tracking system
at [Github][githubissues] or subscribe to our mailing list.
See [roundcube.net/support][support] for details.
You're always welcome to send a message to the project admin:
@ -98,4 +98,4 @@ hello(at)roundcube(dot)net
[license]: http://roundcube.net/license
[contrib]: http://roundcube.net/contribute
[support]: http://roundcube.net/support
[tracreport]: http://trac.roundcube.net/wiki/Howto_ReportIssues
[githubissues]: https://github.com/roundcube/roundcubemail/issues

@ -393,6 +393,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', '2014042900')
INSERT INTO [dbo].[system] ([name], [value]) VALUES ('roundcube-version', '2015030800')
GO

@ -162,7 +162,7 @@ CREATE TABLE `identities` (
`email` varchar(128) NOT NULL,
`reply-to` varchar(128) NOT NULL DEFAULT '',
`bcc` varchar(128) NOT NULL DEFAULT '',
`signature` text,
`signature` longtext,
`html_signature` tinyint(1) NOT NULL DEFAULT '0',
PRIMARY KEY(`identity_id`),
CONSTRAINT `user_id_fk_identities` FOREIGN KEY (`user_id`)
@ -209,4 +209,4 @@ CREATE TABLE `system` (
/*!40014 SET FOREIGN_KEY_CHECKS=1 */;
INSERT INTO system (name, value) VALUES ('roundcube-version', '2014042900');
INSERT INTO system (name, value) VALUES ('roundcube-version', '2015030800');

@ -0,0 +1 @@
ALTER TABLE `identities` CHANGE `signature` `signature` longtext;

@ -218,4 +218,4 @@ CREATE TABLE "system" (
"value" long
);
INSERT INTO "system" ("name", "value") VALUES ('roundcube-version', '2014042900');
INSERT INTO "system" ("name", "value") VALUES ('roundcube-version', '2015030800');

@ -290,4 +290,4 @@ CREATE TABLE "system" (
value text
);
INSERT INTO system (name, value) VALUES ('roundcube-version', '2014042900');
INSERT INTO system (name, value) VALUES ('roundcube-version', '2015030800');

@ -201,4 +201,4 @@ CREATE TABLE system (
value text NOT NULL
);
INSERT INTO system (name, value) VALUES ('roundcube-version', '2014042900');
INSERT INTO system (name, value) VALUES ('roundcube-version', '2015030800');

@ -41,15 +41,22 @@ it on a unix system, you need to do the following operations by hand:
./skins/
./plugins/
./vendor/
4. Run `./bin/update.sh` from the commandline OR
4a. If you previously installed plugins through composer, update dependencies
by running `php composer.phar update --no-dev`
4b. Install/update dependencies using composer:
- get composer from https://getcomposer.org/download/
- rename the composer.json-dist file into composer.json
- if you want to use LDAP address books, enable the LDAP libraries in your
composer.json file by moving the items from "suggest" to the "require"
section (remove the explanation texts after the version!).
- run `php composer.phar install --no-dev`
5. Run `./bin/update.sh` from the commandline OR
open http://url-to-roundcube/installer/ in a browser and choose "3 Test config".
To enable the latter one, you have to temporary set 'enable_installer'
to true in your local config/config.inc.php file.
WARNING: See SQLite database upgrade below.
5. Let the update script/installer check your configuration and
6. Let the update script/installer check your configuration and
update your config files and database schema as suggested by the updater.
5. If you previously installed plugins through composer, update dependencies
by running `php composer.phar update --no-dev`
7. Make sure 'enable_installer' is set to false again.
8. See Post-Upgrade Activities section.

@ -24,4 +24,16 @@ define('INSTALL_PATH', realpath(__DIR__ . '/..') . '/' );
require INSTALL_PATH.'program/include/clisetup.php';
$rcmail = rcube::get_instance();
$session_driver = $rcmail->config->get('session_storage', 'db');
$session_lifetime = $rcmail->config->get('session_lifetime', 0) * 60 * 2;
// Clean expired SQL sessions
if ($session_driver == 'db' && $session_lifetime) {
$db = $rcmail->get_dbh();
$db->query("DELETE FROM " . $db->table_name('session')
. " WHERE changed < " . $db->now(-$session_lifetime));
}
// Clean caches and temp directory
$rcmail->gc();

@ -60,6 +60,8 @@ if (strtolower($input) == 'y') {
break;
}
}
// remove old (<1.0) .htaccess file
@unlink("$target_dir/program/.htaccess");
echo "done.\n\n";
if (is_dir("$target_dir/skins/default")) {

@ -71,7 +71,7 @@ while ($sql_result && ($sql_arr = $db->fetch_assoc($sql_result))) {
$prefs[$pref_name] = $pref_value;
if ($prefs != $old_prefs) {
$user->save_prefs($prefs);
$user->save_prefs($prefs, true);
echo "saved.\n";
}
else {

@ -5,7 +5,7 @@
| bin/update.sh |
| |
| This file is part of the Roundcube Webmail client |
| Copyright (C) 2010-2014, The Roundcube Dev Team |
| Copyright (C) 2010-2015, The Roundcube Dev Team |
| |
| Licensed under the GNU General Public License version 3 or |
| any later version with exceptions for skins & plugins. |
@ -188,18 +188,24 @@ if ($RCI->configured) {
}
foreach ($composer_template['repositories'] as $repo) {
$rkey = $repo['type'] . $repo['url'] . $repo['package']['name'];
$rkey = $repo['type'] . preg_replace('/^https?:/', '', $repo['url']) . $repo['package']['name'];
$existing = false;
foreach ($composer_data['repositories'] as $_repo) {
if ($rkey == $_repo['type'] . $_repo['url'] . $_repo['package']['name']) {
foreach ($composer_data['repositories'] as $k => $_repo) {
if ($rkey == $_repo['type'] . preg_replace('/^https?:/', '', $_repo['url']) . $_repo['package']['name']) {
$existing = true;
break;
}
// remove old repos
else if (strpos($_repo['url'], 'git://git.kolab.org') === 0) {
unset($composer_data['repositories'][$k]);
}
}
if (!$existing) {
$composer_data['repositories'][] = $repo;
}
}
$composer_data['repositories'] = array_values($composer_data['repositories']);
}
// use the JSON encoder from the Composer package
@ -209,7 +215,7 @@ if ($RCI->configured) {
}
// 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);
$comsposer_json = json_encode($composer_data, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES);
}
else {
$success = false;

@ -5,46 +5,34 @@
"repositories": [
{
"type": "pear",
"url": "http://pear.php.net/"
"url": "https://pear.php.net/"
},
{
"type": "composer",
"url": "http://plugins.roundcube.net/"
"url": "https://plugins.roundcube.net/"
},
{
"type": "vcs",
"url": "git://git.kolab.org/git/pear/Net_LDAP3"
},
{
"type": "package",
"package": {
"name": "Net_SMTP",
"version": "dev-master",
"source": {
"url": "http://github.com/pear/Net_SMTP",
"type": "git",
"reference": "master"
}
}
"url": "https://git.kolab.org/diffusion/PNL/php-net_ldap.git"
}
],
"require": {
"php": ">=5.3.7",
"roundcube/plugin-installer": ">=0.1.5",
"pear/mail_mime": ">=1.8.9",
"pear/mail_mime-decode": ">=1.5.5",
"pear/net_smtp": "dev-master",
"pear-pear.php.net/auth_sasl": ">=1.0.6",
"pear-pear.php.net/net_idna2": ">=0.1.1",
"pear-pear.php.net/net_sieve": ">=1.3.2",
"patchwork/utf8": "1.2.x"
"roundcube/plugin-installer": "~0.1.6",
"pear-pear.php.net/net_socket": "~1.0.12",
"pear-pear.php.net/auth_sasl": "~1.0.6",
"pear-pear.php.net/net_idna2": "~0.1.1",
"pear-pear.php.net/net_sieve": "~1.3.4",
"pear-pear.php.net/mail_mime": "~1.9.0",
"pear-pear.php.net/net_smtp": "~1.7.1",
"patchwork/utf8": "~1.2.3"
},
"require-dev": {
"pear-pear.php.net/crypt_gpg": "*",
"phpunit/phpunit": "*"
},
"suggest": {
"pear-pear.php.net/net_ldap2": ">=2.0.12 required for connecting to LDAP address books",
"pear-pear.php.net/net_ldap2": "~2.1.0 required for connecting to LDAP address books",
"kolab/Net_LDAP3": "dev-master required for connecting to LDAP address books"
},
"minimum-stability": "dev"

@ -0,0 +1,7 @@
# deny webserver access to this directory
<ifModule mod_authz_core.c>
Require all denied
</ifModule>
<ifModule !mod_authz_core.c>
Deny from all
</ifModule>

@ -51,6 +51,12 @@ $config['db_table_dsn'] = array(
// 'cache_messages' => 'r',
);
// It is possible to specify database variable values e.g. some limits here.
// Use them if your server is not MySQL or for better performance.
// For example Roundcube uses max_allowed_packet value (in bytes)
// which limits query size for database cache operations.
$config['db_max_allowed_packet'] = null;
// ----------------------------------
// LOGGING/DEBUGGING
@ -930,6 +936,10 @@ $config['address_template'] = '{street}<br/>{locality} {zipcode}<br/>{country} {
// Note: For LDAP sources fuzzy_search must be enabled to use 'partial' or 'prefix' mode
$config['addressbook_search_mode'] = 0;
// List of fields used on contacts list and for autocompletion searches
// Warning: These are field names not LDAP attributes (see 'fieldmap' setting)!
$config['contactlist_fields'] = array('name', 'firstname', 'surname', 'email');
// Template of contact entry on the autocompletion list.
// You can use contact fields as: name, email, organization, department, etc.
// See program/steps/addressbook/func.inc for a list
@ -958,11 +968,11 @@ $config['addressbook_pagesize'] = 50;
// sort contacts by this col (preferably either one of name, firstname, surname)
$config['addressbook_sort_col'] = 'surname';
// the way how contact names are displayed in the list
// 0: display name
// 1: (prefix) firstname middlename surname (suffix)
// 2: (prefix) surname firstname middlename (suffix)
// 3: (prefix) surname, firstname middlename (suffix)
// The way how contact names are displayed in the list.
// 0: prefix firstname middlename surname suffix (only if display name is not set)
// 1: firstname middlename surname
// 2: surname firstname middlename
// 3: surname, firstname middlename
$config['addressbook_name_listing'] = 0;
// use this timezone to display date/time
@ -1068,6 +1078,11 @@ $config['strip_existing_sig'] = true;
// 3 - Forwards and Replies only
$config['show_sig'] = 1;
// By default the signature is placed depending on cursor position (reply_mode).
// Sometimes it might be convenient to start the reply on top but keep
// the signature below the quoted text (sig_below = true).
$config['sig_below'] = false;
// Use MIME encoding (quoted-printable) for 8bit characters in message body
$config['force_7bit'] = false;

@ -2,9 +2,9 @@
/*
+-------------------------------------------------------------------------+
| Roundcube Webmail IMAP Client |
| Version 1.1.0 |
| Version 1.1.12 |
| |
| Copyright (C) 2005-2015, The Roundcube Dev Team |
| Copyright (C) 2005-2016, 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 |
@ -131,7 +131,7 @@ if ($RCMAIL->task == 'login' && $RCMAIL->action == 'login') {
// prevent redirect to compose with specified ID (#1488226)
if ($query['_action'] == 'compose' && !empty($query['_id'])) {
$query = array();
$query = array('_action' => 'compose');
}
}

@ -34,7 +34,6 @@ $required_libs = array(
'Net_SMTP' => 'pear.php.net',
'Net_IDNA2' => 'pear.php.net',
'Mail_mime' => 'pear.php.net',
'Mail_mimeDecode' => 'pear.php.net',
);
$optional_libs = array(
@ -82,9 +81,8 @@ $source_urls = array(
'PEAR' => 'http://pear.php.net',
'Net_SMTP' => 'http://pear.php.net/package/Net_SMTP',
'Mail_mime' => 'http://pear.php.net/package/Mail_mime',
'Mail_mimeDecode' => 'http://pear.php.net/package/Mail_mimeDecode',
'Net_IDNA2' => 'http://pear.php.net/package/Net_IDNA2',
'Net_LDAP3' => 'http://git.kolab.org/pear/Net_LDAP3',
'Net_LDAP3' => 'https://git.kolab.org/diffusion/PNL',
);
echo '<input type="hidden" name="_step" value="' . ($RCI->configured ? 3 : 2) . '" />';
@ -95,8 +93,14 @@ echo '<input type="hidden" name="_step" value="' . ($RCI->configured ? 3 : 2) .
define('MIN_PHP_VERSION', '5.3.7');
if (version_compare(PHP_VERSION, MIN_PHP_VERSION, '>=')) {
$RCI->pass('Version', 'PHP ' . PHP_VERSION . ' detected');
} else {
if (PHP_MAJOR_VERSION != 5) {
$RCI->fail('Version', 'PHP5 is required, ' . PHP_VERSION . ' detected');
}
else {
$RCI->pass('Version', 'PHP ' . PHP_VERSION . ' detected');
}
}
else {
$RCI->fail('Version', 'PHP Version ' . MIN_PHP_VERSION . ' or greater is required ' . PHP_VERSION . ' detected');
}
?>

@ -85,7 +85,7 @@ 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>
<p class="hint">Enter an absolute URL (inculding http://) to a support page/form or a mailto: link.</p>
<p class="hint">Enter an absolute URL (including http://) to a support page/form or a mailto: link.</p>
</dd>
<dt class="propname">skin_logo</dt>

@ -3,9 +3,9 @@
/*
+-------------------------------------------------------------------------+
| Roundcube Webmail setup tool |
| Version 1.1.0 |
| Version 1.1.12 |
| |
| Copyright (C) 2009-2015, The Roundcube Dev Team |
| Copyright (C) 2009-2016, 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 |

@ -427,6 +427,7 @@ if (isset($_POST['imaptest']) && !empty($_POST['_host']) && !empty($_POST['_user
$imap->set_options(array(
'auth_type' => $RCI->getprop('imap_auth_type'),
'debug' => $RCI->getprop('imap_debug'),
'socket_options' => $RCI->getprop('imap_conn_options'),
));
if ($imap->connect($imap_host, $imap_user, $_POST['_pass'], $imap_port, $imap_ssl)) {

1
logs/.gitignore vendored

@ -1 +0,0 @@
*

@ -0,0 +1,7 @@
# deny webserver access to this directory
<ifModule mod_authz_core.c>
Require all denied
</ifModule>
<ifModule !mod_authz_core.c>
Deny from all
</ifModule>

@ -347,9 +347,12 @@ rcube_webmail.prototype.acl_init_form = function(id)
buttons[this.gettext('save')] = function(e) { me.command('acl-save'); };
buttons[this.gettext('cancel')] = function(e) { me.command('acl-cancel'); };
var popup_wrapper = $('<div style="width:480px; min-height:280px"></div>');
this.acl_form.appendTo(popup_wrapper).show();
// display it as popup
this.acl_popup = this.show_popup_dialog(
'<div style="width:480px;height:280px">&nbsp;</div>',
popup_wrapper,
id ? this.gettext('acl.editperms') : this.gettext('acl.newuser'),
buttons,
{
@ -365,8 +368,6 @@ rcube_webmail.prototype.acl_init_form = function(id)
}
);
this.acl_form.appendTo(this.acl_popup).show();
if (type == 'user')
name_input.focus();
else

@ -123,7 +123,7 @@ class acl extends rcube_plugin
$group_id = is_array($record[$group_field]) ? $record[$group_field][0] : $record[$group_field];
if ($group) {
$users[] = array('name' => ($prefix ? $prefix : '') . $group_id, 'display' => $group);
$users[] = array('name' => ($prefix ? $prefix : '') . $group_id, 'display' => $group, 'type' => 'group');
$keys[] = $group;
}
}
@ -251,6 +251,11 @@ class acl extends rcube_plugin
// Get supported rights
$supported = $this->rights_supported();
// give plugins the opportunity to adjust this list
$data = $this->rc->plugins->exec_hook('acl_rights_supported',
array('rights' => $supported, 'folder' => $this->mbox, 'labels' => array()));
$supported = $data['rights'];
// depending on server capability either use 'te' or 'd' for deleting msgs
$deleteright = implode(array_intersect(str_split('ted'), $supported));
@ -281,18 +286,22 @@ class acl extends rcube_plugin
'other' => preg_replace('/[lrswi'.$deleteright.']/', '', implode($supported)),
);
foreach ($items as $key => $val) {
// give plugins the opportunity to adjust this list
$data = $this->rc->plugins->exec_hook('acl_rights_simple',
array('rights' => $items, 'folder' => $this->mbox, 'labels' => array(), 'titles' => array()));
foreach ($data['rights'] as $key => $val) {
$id = "acl$key";
$ul .= html::tag('li', null,
$input->show('', array(
'name' => "acl[$val]", 'value' => $val, 'id' => $id))
. html::label(array('for' => $id, 'title' => $this->gettext('longacl'.$key)),
$this->gettext('acl'.$key)));
. html::label(array('for' => $id, 'title' => $data['titles'][$key] ?: $this->gettext('longacl'.$key)),
$data['labels'][$key] ?: $this->gettext('acl'.$key)));
}
$out .= "\n" . html::tag('ul', $attrib, $ul, html::$common_attrib);
$this->rc->output->set_env('acl_items', $items);
$this->rc->output->set_env('acl_items', $data['rights']);
return $out;
}
@ -379,6 +388,11 @@ class acl extends rcube_plugin
// Get supported rights and build column names
$supported = $this->rights_supported();
// give plugins the opportunity to adjust this list
$data = $this->rc->plugins->exec_hook('acl_rights_supported',
array('rights' => $supported, 'folder' => $this->mbox, 'labels' => array()));
$supported = $data['rights'];
// depending on server capability either use 'te' or 'd' for deleting msgs
$deleteright = implode(array_intersect(str_split('ted'), $supported));
@ -398,6 +412,11 @@ class acl extends rcube_plugin
'delete' => $deleteright,
'other' => preg_replace('/[lrswi'.$deleteright.']/', '', implode($supported)),
);
// give plugins the opportunity to adjust this list
$data = $this->rc->plugins->exec_hook('acl_rights_simple',
array('rights' => $items, 'folder' => $this->mbox, 'labels' => array()));
$items = $data['rights'];
}
// Create the table
@ -407,7 +426,7 @@ class acl extends rcube_plugin
// Create table header
$table->add_header('user', $this->gettext('identifier'));
foreach (array_keys($items) as $key) {
$label = $this->gettext('shortacl'.$key);
$label = $data['labels'][$key] ?: $this->gettext('shortacl'.$key);
$table->add_header(array('class' => 'acl'.$key, 'title' => $label), $label);
}
@ -720,7 +739,11 @@ class acl extends rcube_plugin
$config['fieldmap']['uid'] = $uid_field;
// search in UID and name fields
$config['search_fields'] = array_values($config['fieldmap']);
// $name_field can be in a form of <field>:<modifier> (#1490591)
$name_field = preg_replace('/:.*$/', '', $name_field);
$search = array_unique(array($name_field, $uid_field));
$config['search_fields'] = $search;
$config['required_fields'] = array($uid_field);
// set search filter

@ -80,6 +80,10 @@ $labels['longaclfull'] = 'Пълен контрол, включително и
$labels['longaclread'] = 'Папката може да бъде отворена за четене';
$labels['longaclwrite'] = 'Писмата могат да бъдат маркирани, записвани или копирани в папката';
$labels['longacldelete'] = 'Писмата могат да бъдат изтривани';
$labels['longaclother'] = 'Други права за достъп';
$labels['ariasummaryacltable'] = 'Списък с права за достъп';
$labels['arialabelaclactions'] = 'Списък с действия';
$labels['arialabelaclform'] = 'Форма с права за достъп';
$messages['deleting'] = 'Изтриване на права за достъп...';
$messages['saving'] = 'Запазване на права за достъп...';
$messages['updatesuccess'] = 'Правата за достъп са променени успешно';

@ -38,6 +38,7 @@ $labels['aclt'] = 'Smazat zprávy';
$labels['acle'] = 'Vyprázdnit';
$labels['aclx'] = 'Smazat složku';
$labels['acla'] = 'Spravovat';
$labels['acln'] = 'Označit zprávy poznámkou';
$labels['aclfull'] = 'Plný přístup';
$labels['aclother'] = 'Ostatní';
$labels['aclread'] = 'Číst';
@ -56,6 +57,7 @@ $labels['shortaclt'] = 'Smazat';
$labels['shortacle'] = 'Vyprázdnit';
$labels['shortaclx'] = 'Mazat složky';
$labels['shortacla'] = 'Spravovat';
$labels['shortacln'] = 'Označit poznámkou';
$labels['shortaclother'] = 'Ostatní';
$labels['shortaclread'] = 'Číst';
$labels['shortaclwrite'] = 'Zapsat';
@ -73,11 +75,15 @@ $labels['longaclt'] = 'Příznak smazané zprávy může být změněn';
$labels['longacle'] = 'Zpráva může být smazána';
$labels['longaclx'] = 'Složka může být smazána nebo přejmenována';
$labels['longacla'] = 'Přístupová práva složky mohou být změněna';
$labels['longacln'] = 'Zprávamy sdílené metadata (poznámky) mohou být změněny';
$labels['longaclfull'] = 'Plný přístup včetně správy složky';
$labels['longaclread'] = 'Složka může být otevřena pro čtení';
$labels['longaclwrite'] = 'Zpráva může být označena, napsána nebo zkopírována do složky';
$labels['longacldelete'] = 'Zprávy mohou být smazány';
$labels['longaclother'] = 'Jiná přístupová oprávnění';
$labels['ariasummaryacltable'] = 'Seznam oprávnění';
$labels['arialabelaclactions'] = 'Seznam akcí';
$labels['arialabelaclform'] = 'Formulář pro přístupová oprávnění';
$messages['deleting'] = 'Odstraňuji přístupová práva...';
$messages['saving'] = 'Ukládám přístupová práva...';
$messages['updatesuccess'] = 'Přístupová práva byla úspěšně změněna';

@ -19,7 +19,7 @@ $labels['sharing'] = 'Partage';
$labels['myrights'] = 'Droits d\'accès';
$labels['username'] = 'Utilisateur :';
$labels['advanced'] = 'Mode avancé';
$labels['newuser'] = 'Ajouter l\'entrée';
$labels['newuser'] = 'Ajouter une entrée';
$labels['editperms'] = 'Modifier les permissions';
$labels['actions'] = 'Actions des droits d\'accès...';
$labels['anyone'] = 'Tous les utilisateurs (n\'importe qui)';

@ -16,4 +16,8 @@
For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/plugin-acl/
*/
$labels['username'] = 'Brûker:';
$labels['acldelete'] = 'Fuortsmite';
$labels['shortacld'] = 'Fuortsmite';
$labels['shortaclt'] = 'Fuortsmite';
$labels['shortacldelete'] = 'Fuortsmite';
?>

@ -80,6 +80,10 @@ $labels['longaclfull'] = 'Teljes hozzáférés beleértve a mappák kezelését'
$labels['longaclread'] = 'A mappa olvasásra megnyitható';
$labels['longaclwrite'] = 'Az üzenetek megjelölhetök, irhatók és másolhatók ebbe a mappába';
$labels['longacldelete'] = 'Az üzenetek törölhetőek';
$labels['longaclother'] = 'Egyébb hozzáférési jogok';
$labels['ariasummaryacltable'] = 'Hozzáférési jogok listája';
$labels['arialabelaclactions'] = 'Listázási müveletek';
$labels['arialabelaclform'] = 'Hozzáférési jogok űrlap';
$messages['deleting'] = 'Hozzáférési jogok törlése...';
$messages['saving'] = 'Hozzáférési jogok mentése...';
$messages['updatesuccess'] = 'A hozzáférési jogok sikeresen módosultak.';

@ -47,7 +47,7 @@ $labels['acldelete'] = 'Elimina';
$labels['shortacll'] = 'Ricerca';
$labels['shortaclr'] = 'Lettura';
$labels['shortacls'] = 'Mantieni';
$labels['shortaclw'] = 'Scrittura';
$labels['shortaclw'] = 'Scrivi';
$labels['shortacli'] = 'Inserisci';
$labels['shortaclp'] = 'Invio';
$labels['shortaclc'] = 'Crea';

@ -28,6 +28,7 @@ $labels['identifier'] = 'Danasîner';
$labels['acll'] = 'Lê bigere';
$labels['aclr'] = 'Peyaman bixwîne';
$labels['aclw'] = 'Alayan binivîse';
$labels['acli'] = 'Têxe (Heman bike li)';
$labels['aclp'] = 'Şandî';
$labels['aclc'] = 'Bindosyeyan çêke';
$labels['aclk'] = 'Bindosyeyan çêke';
@ -62,6 +63,11 @@ $labels['shortaclwrite'] = 'Binivîse';
$labels['shortacldelete'] = 'Jê bibe';
$labels['longaclr'] = 'Dosye ji bo xwendinê dikare bê vekirin';
$labels['longacls'] = 'Alaya peyamên Dîtî dikare bête guhartin';
$labels['longaclc'] = 'Dosye dikarin bin vê dosyeyê bêne çêkirin (an jî binavkirin)';
$labels['longaclk'] = 'Dosye dikarin bin vê dosyeyê bêne çêkirin (an jî binavkirin)';
$labels['longaclx'] = 'Dosye dikare bê jêbirin an jî binavkirin';
$labels['longacla'] = 'Mafê gihîştina dosyeyê dikare bê guhartin';
$labels['longaclfull'] = 'Tam venêrîn bi birêvebirina dosyeyê';
$labels['longaclread'] = 'Dosye ji bo xwendinê dikare bê vekirin';
$labels['longaclwrite'] = 'Peyam dikarin kopiyî dosyeyê bên kirin, nîşankirin, nivîsandin.';
$labels['longacldelete'] = 'Hêmî peyam dikarin werin jêbirin';

@ -0,0 +1,49 @@
<?php
/*
+-----------------------------------------------------------------------+
| plugins/acl/localization/<lang>.inc |
| |
| Localization file of the Roundcube Webmail ACL plugin |
| Copyright (C) 2012-2013, 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'] = 'Хэрэглэгч:';
$labels['advanced'] = 'Дэлгэрэнгүй горим';
$labels['newuser'] = 'Нэмэх';
$labels['editperms'] = 'Зөвшөөрлүүдийг засах';
$labels['actions'] = 'Нэвтрэлтийн зөвшөөрлийн үйлдлүүд...';
$labels['anyone'] = 'Бүх хэрэглэгч (хүн бүр)';
$labels['anonymous'] = '(Үл таних) зочин';
$labels['identifier'] = 'Таних мэдээлэл';
$labels['acll'] = 'Хайх';
$labels['aclr'] = 'Зурвас унших';
$labels['acls'] = 'Харсан төлөвт хадгалах';
$labels['aclw'] = 'Тэмдэглэгээ хийх';
$labels['acli'] = 'Оруулах (хуулж)';
$labels['aclp'] = 'Бичлэг';
$labels['aclc'] = 'Дэд хавтас үүсгэх';
$labels['aclk'] = 'Дэд хавтас үүсгэх';
$labels['acld'] = 'Захиануудыг устгах';
$labels['aclt'] = 'Захиануудыг устгах';
$labels['acle'] = 'Устгах';
$labels['aclx'] = 'Хавтас устгах';
$labels['acla'] = 'Зохицуулагч';
$labels['acln'] = 'Тайлбар зурвас';
$labels['aclfull'] = 'Бүрэн удирдлага';
$labels['aclother'] = 'Бусад';
$labels['aclread'] = 'Уншсан';
$labels['aclwrite'] = 'Бичих';
$labels['acldelete'] = 'Устгах';
$labels['shortacll'] = 'Хайх';
$labels['shortaclr'] = 'Унших';
?>

@ -25,18 +25,18 @@ $labels['actions'] = 'Действия с правами доступа...';
$labels['anyone'] = 'Все пользователи (любые)';
$labels['anonymous'] = 'Гости (анонимные)';
$labels['identifier'] = 'Идентификатор';
$labels['acll'] = 'Поиск';
$labels['aclr'] = 'Прочитать сообщения';
$labels['acls'] = 'Оставить состояние Увидено';
$labels['aclw'] = 'Флаги записи';
$labels['acli'] = 'Вставить (копировать в...)';
$labels['acll'] = 'Просмотр';
$labels['aclr'] = 'Чтение сообщений';
$labels['acls'] = 'Сохранение состояния Прочитано';
$labels['aclw'] = 'Запись флагов';
$labels['acli'] = 'Вставка (копирование в...)';
$labels['aclp'] = 'Отправить';
$labels['aclc'] = 'Создать вложенные папки';
$labels['aclk'] = 'Создать вложенные папки';
$labels['acld'] = 'Удалить сообщения';
$labels['aclt'] = 'Удалить сообщения';
$labels['acle'] = 'Уничтожить сообщения';
$labels['aclx'] = 'Удалить папку';
$labels['aclc'] = 'Создание вложенных папок';
$labels['aclk'] = 'Создание вложенных папок';
$labels['acld'] = 'Удаление сообщений';
$labels['aclt'] = 'Удаление сообщений';
$labels['acle'] = 'Уничтожение сообщений';
$labels['aclx'] = 'Удаление папки';
$labels['acla'] = 'Администрировать';
$labels['acln'] = 'Комментировать сообщения';
$labels['aclfull'] = 'Полный доступ';
@ -46,7 +46,7 @@ $labels['aclwrite'] = 'Запись';
$labels['acldelete'] = 'Удаление';
$labels['shortacll'] = 'Поиск';
$labels['shortaclr'] = 'Чтение';
$labels['shortacls'] = 'Оставить';
$labels['shortacls'] = 'Прочитано';
$labels['shortaclw'] = 'Запись';
$labels['shortacli'] = 'Вставить';
$labels['shortaclp'] = 'Отправить';
@ -54,7 +54,7 @@ $labels['shortaclc'] = 'Создать';
$labels['shortaclk'] = 'Создать';
$labels['shortacld'] = 'Удаление';
$labels['shortaclt'] = 'Удаление';
$labels['shortacle'] = 'Уничтожить сообщения';
$labels['shortacle'] = 'Уничтожение';
$labels['shortaclx'] = 'Удаление папки';
$labels['shortacla'] = 'Администрировать';
$labels['shortacln'] = 'Комментировать';

@ -18,5 +18,35 @@
$labels['sharing'] = 'Дељење';
$labels['myrights'] = 'Права приступа';
$labels['username'] = 'Корисник:';
$labels['advanced'] = 'Напредни режим';
$labels['newuser'] = 'Додај унос';
$labels['editperms'] = 'Уреди дозволе';
$labels['actions'] = 'Радње права приступа...';
$labels['anyone'] = 'Сви корисници (било ко)';
$labels['anonymous'] = 'Гости (анонимно)';
$labels['identifier'] = 'Идентификатор';
$labels['acll'] = 'Потражи';
$labels['aclr'] = 'Прочитане поруке';
$labels['acls'] = 'Очувај стање прегледаности';
$labels['acli'] = 'Убаци (копирај у)';
$labels['aclc'] = 'Направи потфасцикле';
$labels['aclk'] = 'Направи потфасцикле';
$labels['acld'] = 'Обриши поруке';
$labels['aclt'] = 'Обриши поруке';
$labels['aclx'] = 'Обриши фасциклу';
$labels['acla'] = 'Администрирај';
$labels['aclfull'] = 'Пуна контрола';
$labels['aclother'] = 'Друго';
$labels['aclread'] = 'Читање';
$labels['aclwrite'] = 'Упис';
$labels['acldelete'] = 'Обриши';
$labels['shortacll'] = 'Потражи';
$labels['shortaclr'] = 'Прочитана';
$labels['shortacls'] = 'Задржи';
$labels['shortaclw'] = 'Пиши';
$labels['shortacli'] = 'Убаци';
$labels['shortaclother'] = 'Друго';
$labels['shortaclread'] = 'Читање';
$labels['shortaclwrite'] = 'Упис';
$labels['shortacldelete'] = 'Брисање';
?>

@ -71,7 +71,7 @@ $labels['longaclp'] = 'Mesajlar bu dizine gönderilebilir';
$labels['longaclc'] = 'Dizinler doğrudan bu klasör altında oluşturulabilir veya yeniden adlandırılabilir.';
$labels['longaclk'] = 'Dizinler doğrudan bu klasör altında oluşturulabilir veya yeniden adlandırılabilir.';
$labels['longacld'] = 'mesajları sil bayrakları değiştirilebilir';
$labels['longaclt'] = 'mesajları sil bayrakları değiştirilebilir';
$labels['longaclt'] = 'mesajları sil, bayraklar değiştirilebilir';
$labels['longacle'] = 'Mesajlar silinebilir';
$labels['longaclx'] = 'Klasörü silinebilir veya yeniden adlandırılabilir';
$labels['longacla'] = 'Dizin erişim hakları değiştirilebilir';
@ -85,10 +85,10 @@ $labels['ariasummaryacltable'] = 'Erişim hakları listesi';
$labels['arialabelaclactions'] = 'Aksiyon listesi';
$labels['arialabelaclform'] = 'Erişim hakları formu';
$messages['deleting'] = 'Erişim hakları siliniyor...';
$messages['saving'] = 'Erişim hakları saklanıyor...';
$messages['updatesuccess'] = 'Erişim hakları başarıyla değiştirildi';
$messages['deletesuccess'] = 'Erişim hakları başarıyla silindi';
$messages['createsuccess'] = 'Erişim hakları başarıyla eklendi';
$messages['saving'] = 'Erişim hakları kaydediliyor...';
$messages['updatesuccess'] = 'Erişim hakları değiştirildi';
$messages['deletesuccess'] = 'Erişim hakları silindi';
$messages['createsuccess'] = 'Erişim hakları eklendi';
$messages['updateerror'] = 'Erişim hakları güncellenemedi';
$messages['deleteerror'] = 'Erişim haklarını silinemedi';
$messages['createerror'] = 'Erişim hakları eklenemedi';

@ -19,7 +19,7 @@
</ul>
</div>
<div id="aclform" class="propform" style="position:absolute; width:480px; top:0; left:0; padding:8px" aria-labelledby="aria-label-aclform" aria-hidden="true" role="dialog">
<div id="aclform" class="propform" aria-labelledby="aria-label-aclform" aria-hidden="true" role="dialog">
<h3 id="aria-label-aclform" class="voice"><roundcube:label name="acl.arialabelaclform" /></h3>
<fieldset class="thinbordered"><legend><roundcube:label name="acl.identifier" /></legend>
<roundcube:object name="acluser" id="acluser" size="35" class="proplist" />

@ -24,23 +24,33 @@ class additional_message_headers extends rcube_plugin
{
$this->load_config();
$headers = $args['message']->headers();
$rcube = rcube::get_instance();
$rcube = rcube::get_instance();
// additional email headers
$additional_headers = $rcube->config->get('additional_message_headers', array());
foreach ((array)$additional_headers as $header => $value) {
if (null === $value) {
unset($headers[$header]);
if (!empty($additional_headers)) {
// Mail_mime >= 1.9.0
if (method_exists($message, 'isMultipart')) {
$args['message']->headers($additional_headers, true);
}
else {
$headers[$header] = $value;
$headers = $args['message']->headers();
foreach ((array) $additional_headers as $header => $value) {
if ($value === null) {
unset($headers[$header]);
}
else {
$headers[$header] = $value;
}
}
$args['message']->_headers = array();
$args['message']->headers($headers);
}
}
$args['message']->_headers = array();
$args['message']->headers($headers);
return $args;
}
}

@ -3,7 +3,7 @@
"type": "roundcube-plugin",
"description": "Very simple plugin which will add additional headers to or remove them from outgoing messages.",
"license": "GPLv2",
"version": "1.2.0",
"version": "1.2.1",
"authors": [
{
"name": "Ziba Scott",

@ -122,8 +122,10 @@ class archive extends rcube_plugin
$index = $storage->index(null, rcmail_sort_column(), rcmail_sort_order());
$messageset = array($current_mbox => $index->get());
}
else {
$messageset = rcmail::get_uids();
else if (!empty($uids)) {
$messageset = rcmail::get_uids($uids, $current_mbox);
} else {
$messageset = array();
}
foreach ($messageset as $mbox => $uids) {

@ -15,13 +15,13 @@
For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/plugin-archive/
*/
$labels['buttontext'] = 'Archive';
$labels['buttontext'] = 'Archiver';
$labels['buttontitle'] = 'Archiver ce courriel';
$labels['archived'] = 'Archivé avec succès';
$labels['archivedreload'] = 'Archivé avec succès. Recharger la page pour voir les nouveaux dossiers d\'archives.';
$labels['archiveerror'] = 'Certains courriels n\'ont pas pu être archivés.';
$labels['archivefolder'] = 'Archive';
$labels['settingstitle'] = 'Archive';
$labels['archivefolder'] = 'Archiver';
$labels['settingstitle'] = 'Archiver';
$labels['archivetype'] = 'Diviser l\'archive par';
$labels['archivetypeyear'] = 'Année (ex. Archives/2012)';
$labels['archivetypemonth'] = 'Mois (ex. Archives/2012/06)';

@ -25,7 +25,7 @@ $labels['settingstitle'] = 'Archivio';
$labels['archivetype'] = 'Dividi archivio per';
$labels['archivetypeyear'] = 'Anno (es. Archivio/2012)';
$labels['archivetypemonth'] = 'Mese (es. Archivio/2012/06)';
$labels['archivetypefolder'] = 'Cartella originale';
$labels['archivetypefolder'] = 'Cartella di origine';
$labels['archivetypesender'] = 'Mittente email';
$labels['unkownsender'] = 'sconosciuto';
?>

@ -16,7 +16,16 @@
For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/plugin-archive/
*/
$labels['buttontext'] = 'Arşîv';
$labels['buttontitle'] = 'am masaja bxa arşiv';
$labels['archived'] = 'ba gşti Arşiv kra';
$labels['buttontitle'] = 'vê peyamê arşîv bike';
$labels['archived'] = 'Bi serkeftin hat arşîvkirin';
$labels['archivedreload'] = 'Bi serkeftin hat arşîvkirin. Rûpelê dîsa bar bike da dosyeyên arşîvê yên nû bibînî.';
$labels['archiveerror'] = 'Hin peyam nehatin arşîvkirin.';
$labels['archivefolder'] = 'Arşîv';
$labels['settingstitle'] = 'Arşîv';
$labels['archivetype'] = 'Arşîvê dabeşîne';
$labels['archivetypeyear'] = 'Sal (wek Arşîv/2012)';
$labels['archivetypemonth'] = 'Meh (wek Arşîv/2012/06)';
$labels['archivetypefolder'] = 'Dosyeya resen';
$labels['archivetypesender'] = 'Emaila şandyar';
$labels['unkownsender'] = 'nenas';
?>

@ -0,0 +1,31 @@
<?php
/*
+-----------------------------------------------------------------------+
| plugins/archive/localization/<lang>.inc |
| |
| Localization file of the Roundcube Webmail Archive plugin |
| Copyright (C) 2013, 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-archive/
*/
$labels['buttontext'] = 'Архив';
$labels['buttontitle'] = 'Энэ зурвасыг архивлах';
$labels['archived'] = 'Амжилттай архивлагдлаа';
$labels['archivedreload'] = 'Амжилттай архивлагдлаа. Хуудсыг дахин дуудаж шинэ үүссэн архив хавтсыг харна уу.';
$labels['archiveerror'] = 'Зарим зурвас архивлагдаж чадахгүй';
$labels['archivefolder'] = 'Архив';
$labels['settingstitle'] = 'Архив';
$labels['archivetype'] = 'Архивыг дараахаар ялга: ';
$labels['archivetypeyear'] = 'Он (жиш: Архив/2012)';
$labels['archivetypemonth'] = 'Сар (жиш: Архив/2012/06)';
$labels['archivetypefolder'] = 'Жинхэнэ хавтас';
$labels['archivetypesender'] = 'Илгээгчийн мэйл хаяг';
$labels['unkownsender'] = 'мэдэгдэхгүй';
?>

@ -15,8 +15,17 @@
For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/plugin-archive/
*/
$labels['buttontext'] = 'Arhiva';
$labels['buttontitle'] = 'Arhivirati ovu poruku';
$labels['archived'] = 'Uspěšno arhivirano';
$labels['archivefolder'] = 'Arhiva';
$labels['buttontext'] = 'Архивирај';
$labels['buttontitle'] = 'Архивирај ову поруку';
$labels['archived'] = 'Успешно архивирано';
$labels['archivedreload'] = 'Успешно архивирано. Поново учитајте страну да видите нове архивиране фасцикле.';
$labels['archiveerror'] = 'Неке поруке се нису могле архивирати';
$labels['archivefolder'] = 'Архива';
$labels['settingstitle'] = 'Архивирање';
$labels['archivetype'] = 'Разврстај архиве по';
$labels['archivetypeyear'] = 'години (нпр. Архива/2015)';
$labels['archivetypemonth'] = 'месецу (нпр. Архива/2015/03)';
$labels['archivetypefolder'] = 'изворној фасцикли';
$labels['archivetypesender'] = 'адреси пошиљаоца';
$labels['unkownsender'] = 'непознат';
?>

@ -17,8 +17,8 @@
*/
$labels['buttontext'] = 'Arşiv';
$labels['buttontitle'] = 'Bu postayı arşivle';
$labels['archived'] = 'Başarıyla arşivlendi';
$labels['archivedreload'] = 'Başarıyla arşivlendi. Yeni arşiv dosyalarını görmek için sayfayı yenileyin.';
$labels['archived'] = 'Arşivleme başarılı.';
$labels['archivedreload'] = 'Arşivleme başarılı. Yeni arşiv dosyalarını görmek için sayfayı yenileyin.';
$labels['archiveerror'] = 'Bazı mesajlar arşivlenemedi.';
$labels['archivefolder'] = 'Arşiv';
$labels['settingstitle'] = 'Arşiv';

@ -16,5 +16,5 @@
For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/plugin-attachment_reminder/
*/
$messages['forgotattachment'] = "Haben Sie möglicherweise vergessen eine Datei anzuhängen?";
$messages['reminderoption'] = "Erinnern an vergessene Anhänge ";
$messages['keywords'] = "anbei,im anhang,angehängt,angefügt,beigefügt,beliegend";
$messages['reminderoption'] = "An vergessene Anhänge erinnern";
$messages['keywords'] = "anbei,im anhang,siehe anhang,angehängt,angefügt,beigefügt,beliegend";

@ -0,0 +1,20 @@
<?php
/*
+-----------------------------------------------------------------------+
| plugins/attachment_reminder/localization/<lang>.inc |
| |
| Localization file of the Roundcube Webmail Archive plugin |
| Copyright (C) 2013, 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-attachment_reminder/
*/
$messages['forgotattachment'] = "Та файл хавсаргахаа мартсан уу?";
$messages['reminderoption'] = "Мартсан хавсралтуудыг сануулах";
$messages['keywords'] = "хавсралт,файл,хавсралт,хавсаргагдсан,хавсаргаж байна,хасваргасан,анкет,танилцуулга";

@ -22,7 +22,7 @@ class database_attachments extends filesystem_attachments
protected $cache;
// A prefix for the cache key used in the session and in the key field of the cache table
protected $prefix = "db_attach";
const PREFIX = "ATTACH";
/**
* Save a newly uploaded attachment
@ -43,9 +43,9 @@ class database_attachments extends filesystem_attachments
$status = $cache->write($key, $data);
if ($status) {
$args['id'] = $key;
$args['id'] = $key;
$args['status'] = true;
unset($args['path']);
$args['path'] = null;
}
return $args;
@ -67,6 +67,8 @@ class database_attachments extends filesystem_attachments
if ($args['data'] === false) {
return $args;
}
$args['path'] = null;
}
$data = base64_encode($args['data']);
@ -113,10 +115,13 @@ class database_attachments extends filesystem_attachments
$cache = $this->get_cache();
$data = $cache->read($args['id']);
if ($data) {
if ($data !== null && $data !== false) {
$args['data'] = base64_decode($data);
$args['status'] = true;
}
else {
$args['status'] = false;
}
return $args;
}
@ -153,9 +158,16 @@ class database_attachments extends filesystem_attachments
$ttl = 12 * 60 * 60; // default: 12 hours
$ttl = $rcmail->config->get('database_attachments_cache_ttl', $ttl);
$type = $rcmail->config->get('database_attachments_cache', 'db');
$prefix = self::PREFIX;
// Add session identifier to the prefix to prevent from removing attachments
// in other sessions of the same user (#1490542)
if ($id = session_id()) {
$prefix .= $id;
}
// Init SQL cache (disable cache data serialization)
$this->cache = $rcmail->get_cache($this->prefix, 'db', $ttl, false);
$this->cache = $rcmail->get_cache($prefix, $type, $ttl, false);
}
return $this->cache;

@ -3,7 +3,7 @@
"type": "roundcube-plugin",
"description": "Sample plugin to replace emoticons in plain text message body with real icons.",
"license": "GPLv3+",
"version": "1.3",
"version": "1.4",
"authors": [
{
"name": "Thomas Bruederli",

@ -36,8 +36,6 @@ class emoticons extends rcube_plugin
// map of emoticon replacements
$map = array(
'/:\)/' => $this->img_tag('smiley-smile.gif', ':)' ),
'/:-\)/' => $this->img_tag('smiley-smile.gif', ':-)' ),
'/(?<!mailto):D/' => $this->img_tag('smiley-laughing.gif', ':D' ),
'/:-D/' => $this->img_tag('smiley-laughing.gif', ':-D' ),
'/:\(/' => $this->img_tag('smiley-frown.gif', ':(' ),
@ -54,8 +52,10 @@ class emoticons extends rcube_plugin
'/(?<!mailto):-@/i' => $this->img_tag('smiley-yell.gif', ':-@' ),
'/O:\)/i' => $this->img_tag('smiley-innocent.gif', 'O:)' ),
'/O:-\)/i' => $this->img_tag('smiley-innocent.gif', 'O:-)' ),
'/(?<!mailto):$/' => $this->img_tag('smiley-embarassed.gif', ':$' ),
'/(?<!mailto):-$/' => $this->img_tag('smiley-embarassed.gif', ':-$' ),
'/(?<!O):\)/' => $this->img_tag('smiley-smile.gif', ':)' ),
'/(?<!O):-\)/' => $this->img_tag('smiley-smile.gif', ':-)' ),
'/(?<!mailto):\$/' => $this->img_tag('smiley-embarassed.gif', ':$' ),
'/(?<!mailto):-\$/' => $this->img_tag('smiley-embarassed.gif', ':-$' ),
'/(?<!mailto):\*/i' => $this->img_tag('smiley-kiss.gif', ':*' ),
'/(?<!mailto):-\*/i' => $this->img_tag('smiley-kiss.gif', ':-*' ),
'/(?<!mailto):S/i' => $this->img_tag('smiley-undecided.gif', ':S' ),

@ -19,5 +19,45 @@ class Emoticons_Plugin extends PHPUnit_Framework_TestCase
$this->assertInstanceOf('emoticons', $plugin);
$this->assertInstanceOf('rcube_plugin', $plugin);
}
}
/**
* replace() method tests
*/
function test_replace()
{
$rcube = rcube::get_instance();
$plugin = new emoticons($rcube->api);
$map = array(
':D' => array('smiley-laughing.gif', ':D' ),
':-D' => array('smiley-laughing.gif', ':-D' ),
':(' => array('smiley-frown.gif', ':(' ),
':-(' => array('smiley-frown.gif', ':-(' ),
'8)' => array('smiley-cool.gif', '8)' ),
'8-)' => array('smiley-cool.gif', '8-)' ),
':O' => array('smiley-surprised.gif', ':O' ),
':-O' => array('smiley-surprised.gif', ':-O' ),
':P' => array('smiley-tongue-out.gif', ':P' ),
':-P' => array('smiley-tongue-out.gif', ':-P' ),
':@' => array('smiley-yell.gif', ':@' ),
':-@' => array('smiley-yell.gif', ':-@' ),
'O:)' => array('smiley-innocent.gif', 'O:)' ),
'O:-)' => array('smiley-innocent.gif', 'O:-)' ),
':)' => array('smiley-smile.gif', ':)' ),
':-)' => array('smiley-smile.gif', ':-)' ),
':$' => array('smiley-embarassed.gif', ':$' ),
':-$' => array('smiley-embarassed.gif', ':-$' ),
':*' => array('smiley-kiss.gif', ':*' ),
':-*' => array('smiley-kiss.gif', ':-*' ),
':S' => array('smiley-undecided.gif', ':S' ),
':-S' => array('smiley-undecided.gif', ':-S' ),
);
foreach ($map as $body => $expected) {
$args = array('type' => 'plain', 'body' => $body);
$args = $plugin->replace($args);
$this->assertRegExp('/' . preg_quote($expected[0], '/') . '/', $args['body']);
$this->assertRegExp('/title="' . preg_quote($expected[1], '/') . '"/', $args['body']);
}
}
}

@ -7,12 +7,19 @@
* attachments of messages currently being composed, writing attachments
* to disk when drafts with attachments are re-opened and writing
* attachments to disk for inline display in current html compositions.
* It also handles uploaded files for other uses, so not only attachments.
*
* Developers may wish to extend this class when creating attachment
* handler plugins:
* require_once('plugins/filesystem_attachments/filesystem_attachments.php');
* class myCustom_attachments extends filesystem_attachments
*
* Note for developers: It is plugin's responsibility to care about security.
* So, e.g. if the plugin is asked about some file path it should check
* if it's really the storage path of the plugin and not e.g. /etc/passwd.
* It is done by setting 'status' flag on every plugin hook it uses.
* Roundcube core will trust the returned path if status=true.
*
* @license GNU GPLv3+
* @author Ziba Scott <ziba@umich.edu>
* @author Thomas Bruederli <roundcube@gmail.com>
@ -107,7 +114,7 @@ class filesystem_attachments extends rcube_plugin
*/
function remove($args)
{
$args['status'] = @unlink($args['path']);
$args['status'] = $this->verify_path($args['path']) && @unlink($args['path']);
return $args;
}
@ -118,7 +125,7 @@ class filesystem_attachments extends rcube_plugin
*/
function display($args)
{
$args['status'] = file_exists($args['path']);
$args['status'] = $this->verify_path($args['path']) && file_exists($args['path']);
return $args;
}
@ -129,6 +136,10 @@ class filesystem_attachments extends rcube_plugin
*/
function get($args)
{
if (!$this->verify_path($args['path'])) {
$args['path'] = null;
}
return $args;
}
@ -147,7 +158,7 @@ class filesystem_attachments extends rcube_plugin
}
foreach ((array)$files as $filename) {
if(file_exists($filename)) {
if (file_exists($filename)) {
unlink($filename);
}
}
@ -182,4 +193,34 @@ class filesystem_attachments extends rcube_plugin
}
}
}
/**
* For security we'll always verify the file path stored in session,
* as session entries can be faked in various ways e.g. #6026.
* We allow only files in Roundcube temp dir
*/
protected function verify_path($path)
{
if (empty($path)) {
return false;
}
$rcmail = rcube::get_instance();
$temp_dir = $rcmail->config->get('temp_dir');
$file_path = pathinfo($path, PATHINFO_DIRNAME);
if ($temp_dir !== $file_path) {
rcube::raise_error(array(
'code' => 403,
'file' => __FILE__,
'line' => __LINE__,
'message' => sprintf("%s can't read %s (not in temp_dir)",
$rcmail->get_user_name(), substr($path, 0, 512))
), true, false);
return false;
}
return true;
}
}

@ -33,3 +33,5 @@ $config['help_license_url'] = null;
// Determine whether to open the help in a new window
$config['help_open_extwin'] = false;
// URL to additional information about CSRF protection
$config['help_csrf_info'] = null;

@ -34,6 +34,7 @@ class help extends rcube_plugin
$this->register_action('license', array($this, 'action'));
$this->add_hook('startup', array($this, 'startup'));
$this->add_hook('error_page', array($this, 'error_page'));
}
function startup($args)
@ -82,8 +83,14 @@ class help extends rcube_plugin
function tablink($attrib)
{
$rcmail = rcmail::get_instance();
$attrib['name'] = 'helplink' . $attrib['action'];
$attrib['href'] = $rcmail->url(array('_action' => $attrib['action'], '_extwin' => !empty($_REQUEST['_extwin']) ? 1 : null));
// title might be already translated here, so revert to it's initial value
// so button() will translate it correctly
$attrib['title'] = $attrib['label'];
return $rcmail->output->button($attrib);
}
@ -134,6 +141,16 @@ class help extends rcube_plugin
return $rcmail->output->frame($attrib);
}
function error_page($args)
{
$rcmail = rcmail::get_instance();
if ($args['code'] == 403 && $rcmail->request_status == rcube::REQUEST_ERROR_URL && ($url = $rcmail->config->get('help_csrf_info'))) {
$args['text'] .= '<p>' . html::a(array('href' => $url, 'target' => '_blank'), $this->gettext('csrfinfo')) . '</p>';
}
return $args;
}
private function resolve_language($path)
{

@ -18,4 +18,5 @@
$labels['help'] = 'Помощ';
$labels['about'] = 'Относно';
$labels['license'] = 'Лиценз';
$labels['csrfinfo'] = 'Прочети повече за CSRF и как си защитен';
?>

@ -18,4 +18,5 @@
$labels['help'] = 'Cymorth';
$labels['about'] = 'Amdan';
$labels['license'] = 'Trwydded';
$labels['csrfinfo'] = 'Darllenwch fwy am CSRF a sut rydyn ni\'n amddiffyn chi.';
?>

@ -16,6 +16,7 @@
For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/plugin-help/
*/
$labels['help'] = 'Hilfe';
$labels['about'] = 'Information';
$labels['about'] = 'Über';
$labels['license'] = 'Lizenz';
$labels['csrfinfo'] = 'Erfahren Sie mehr über CSRF und wie wir Sie davor schützen';
?>

@ -18,4 +18,5 @@
$labels['help'] = 'Hilfe';
$labels['about'] = 'Über';
$labels['license'] = 'Lizenz';
$labels['csrfinfo'] = 'Erfahren Sie mehr über CSRF und wie wir Sie schützen';
?>

@ -20,5 +20,6 @@ $labels = array();
$labels['help'] = 'Help';
$labels['about'] = 'About';
$labels['license'] = 'License';
$labels['csrfinfo'] = 'Read more about CSRF and how we protect you';
?>

@ -18,4 +18,5 @@
$labels['help'] = 'Ayuda';
$labels['about'] = 'Acerca de';
$labels['license'] = 'Licencia';
$labels['csrfinfo'] = 'Lea más sobre CSRF y cómo le protegemos';
?>

@ -18,4 +18,5 @@
$labels['help'] = 'Ohje';
$labels['about'] = 'Tietoja';
$labels['license'] = 'Lisenssi';
$labels['csrfinfo'] = 'Lue lisää CSRF:stä ja kuinka suojaamme sinua';
?>

@ -18,4 +18,5 @@
$labels['help'] = 'Help';
$labels['about'] = 'About';
$labels['license'] = 'License';
$labels['csrfinfo'] = 'Apprenez-en davantage sur les attaques CSRF et comment nous vous protégeons';
?>

@ -18,4 +18,5 @@
$labels['help'] = 'עזרה';
$labels['about'] = 'אודות';
$labels['license'] = 'רשיון';
$labels['csrfinfo'] = 'נא לקרוא כעת אודות CSRF וכיצד אנו מגינים עליך.';
?>

@ -18,4 +18,5 @@
$labels['help'] = 'Súgó';
$labels['about'] = 'Névjegy';
$labels['license'] = 'Licensz';
$labels['csrfinfo'] = 'Olvass többet a CSRF-ről és arról hogy védünk meg ettöl';
?>

@ -18,4 +18,5 @@
$labels['help'] = 'Aiuto';
$labels['about'] = 'Informazioni';
$labels['license'] = 'Licenza';
$labels['csrfinfo'] = 'Maggiori informazioni su CSRF e su come ti proteggiamo';
?>

@ -18,4 +18,5 @@
$labels['help'] = 'ヘルプ';
$labels['about'] = 'このプログラムについて';
$labels['license'] = 'ライセンス';
$labels['csrfinfo'] = 'CSRFと安全を保つ方法についてさらに読む';
?>

@ -18,4 +18,5 @@
$labels['help'] = 'Žinynas';
$labels['about'] = 'Apie';
$labels['license'] = 'Licencija';
$labels['csrfinfo'] = 'Išsamiau apie CSRF ir apie tai, kaip jie jus apsaugo.';
?>

@ -0,0 +1,22 @@
<?php
/*
+-----------------------------------------------------------------------+
| plugins/help/localization/<lang>.inc |
| |
| Localization file of the Roundcube Webmail Help plugin |
| Copyright (C) 2012-2013, 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-help/
*/
$labels['help'] = 'Тусламж';
$labels['about'] = 'Танилцуулга';
$labels['license'] = 'Лиценз';
$labels['csrfinfo'] = 'Бид таныг яаж хамгаалж байгаа буюу CSRF-ын тухай дэлгэрэнгүй унших';
?>

@ -18,4 +18,5 @@
$labels['help'] = 'Help';
$labels['about'] = 'Over';
$labels['license'] = 'Licentie';
$labels['csrfinfo'] = 'Lees meer over CSRF en hoe we u beschermen';
?>

@ -18,4 +18,5 @@
$labels['help'] = 'Ajuda';
$labels['about'] = 'Sobre';
$labels['license'] = 'Licença';
$labels['csrfinfo'] = 'Leia mais sobre CSRF e como nós protegemos você';
?>

@ -18,4 +18,5 @@
$labels['help'] = 'Ajuda';
$labels['about'] = 'Sobre...';
$labels['license'] = 'Licença';
$labels['csrfinfo'] = 'Leia mais sobre CSRF e como nós o protegemos';
?>

@ -18,4 +18,5 @@
$labels['help'] = 'Помощь';
$labels['about'] = 'О программе';
$labels['license'] = 'Лицензия';
$labels['csrfinfo'] = 'Узнайте больше о CSRF и о том как мы защищаем вас';
?>

@ -18,4 +18,5 @@
$labels['help'] = 'Pomocník';
$labels['about'] = 'O aplikácii';
$labels['license'] = 'Licencia';
$labels['csrfinfo'] = 'Prečítajte si viac o útokoch typu CSRF a o tom, ako vás môžeme pred nimi ochrániť';
?>

@ -16,6 +16,7 @@
For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/plugin-help/
*/
$labels['help'] = 'Помоћ';
$labels['about'] = 'Info';
$labels['license'] = 'Licenca';
$labels['about'] = 'О програму';
$labels['license'] = 'Лиценца';
$labels['csrfinfo'] = 'Прочитајте о ЦСРФ-у и како вас штитимо';
?>

@ -18,4 +18,5 @@
$labels['help'] = 'Hjälp';
$labels['about'] = 'Om';
$labels['license'] = 'Licens';
$labels['csrfinfo'] = 'Läs mer om CSRF och skyddet mot detta';
?>

@ -18,4 +18,5 @@
$labels['help'] = 'Yardım';
$labels['about'] = 'Hakkında';
$labels['license'] = 'Lisans';
$labels['csrfinfo'] = 'Sizi koruma ve CSRF hakkında daha fazla bilgi.';
?>

@ -0,0 +1,21 @@
<?php
/*
+-----------------------------------------------------------------------+
| plugins/hide_blockquote/localization/<lang>.inc |
| |
| Localization file of the Roundcube Webmail Hide-Blockquote plugin |
| Copyright (C) 2012-2013, 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-hide_blockquote/
*/
$labels['hide'] = 'Нуух';
$labels['show'] = 'Харах';
$labels['quotelimit'] = 'Хэрвээ мөрийн тоо дараахаас их бол ишлэлийг харуулахгүй:';
?>

@ -1,3 +1,16 @@
* version 8.4 [2015-04-20]
-----------------------------------------------------------
- Add option to prepopulate vacation addresses on form init (#1490030)
- Add option to define default vacation interval
- Fix missing position idicator in Larry skin when dragging a filter
- Fix incorrect filter data after filter delete (#1490356)
* version 8.3 [2015-03-12]
-----------------------------------------------------------
- Fix PHP fatal error when visiting Vacation interface and there's no sieve script yet
- Fix handling of header test with one-element array as header name
- Fix missing host:port in connection error message
* version 8.2 [2015-01-14]
-----------------------------------------------------------
- Fix bug where actions without if/elseif/else in sieve scripts were skipped

@ -3,7 +3,7 @@
"type": "roundcube-plugin",
"description": "Adds a possibility to manage Sieve scripts (incoming mail filters). It's clickable interface which operates on text scripts and communicates with server using managesieve protocol. Adds Filters tab in Settings.",
"license": "GPLv3+",
"version": "8.2",
"version": "8.3",
"authors": [
{
"name": "Aleksander Machniak",

@ -86,5 +86,15 @@ $config['managesieve_domains'] = array();
// 2 - add Vacation section, but hide Filters section
$config['managesieve_vacation'] = 0;
// Default vacation interval (in days).
// Note: If server supports vacation-seconds extension it is possible
// to define interval in seconds here (as a string), e.g. "3600s".
$config['managesieve_vacation_interval'] = 0;
// Some servers require vacation :addresses to be filled with all
// user addresses (aliases). This option enables automatic filling
// of these on initial vacation form creation.
$config['managesieve_vacation_addresses_init'] = false;
// Supported methods of notify extension. Default: 'mailto'
$config['managesieve_notify_methods'] = array('mailto');

@ -0,0 +1,55 @@
.. index:: Filters
.. _settings-managesieve-filters:
*******
Filters
*******
Incoming mail is automatically processed by the server and handled/organized
according to defined criteria. For example you can tell the server to move the message to
specified folder, redirect it to another account, send a reply, discard, delete, etc.
Filtering is based on `Sieve <https://www.rfc-editor.org/info/rfc5228>`_ language, which means that under the hood
all filters are stored as a Sieve script on the server. This interface allows you to
define rules in easy way without the need to know the language.
Each filter definition has a name and set of rules and actions. Usually
the number of definitions is unlimited and they can be grouped into sets
(scripts) for convenience.
Filter sets
-----------
Filter definitions can be grouped into sets. These can be activated or disactivated.
Depending on server configuration there can be none, one or more active sets
at the same time. They need to have a unique name.
New sets can be created as empty or as a copy of an existing set. It is also possible
to import them from a text file containing Sieve script. Sets in form of a script
can be also downloaded e.g. for backup or migration purposes.
Filter definition
-----------------
Every filter can be active or inactive, which is convenient if you want to
disable some actions temporarily.
Because filters are executed in specified order (from top to bottom as you see them on the list)
you can use drag-and-drop technique to rearange filters on the list.
Every filter definition contains at least one rule and one action. Depending on server
capabilities a rule can be based e.g. on message headers, body, date or size.
A set of actions also depends on server capabilities. Most servers support:
* moving/copying messages to specified folder
* redirecting/copying messages to another account
* discarding messages with specified error message
* replying (vacation)
* deleting (ignoring) messages
* setting flags (e.g. marking as Read)
Note: Some actions stop filtering process, some do not. Use *Stop evaluating rules*
and *Keep message in Inbox* actions to have more control on this.

@ -0,0 +1,58 @@
.. index:: Vacation
.. _settings-managesieve-vacation:
********
Vacation
********
The vacation autoresponder's purpose is to provide correspondents with
notification that the user is away for an extended period of time and that
they should not expect quick responses.
**Vacation** is used to respond to an incoming message with another message.
This interface is part of :ref:`settings-managesieve-filters` functionality
and provides a simple way to manage vacation responses.
Vacation message
----------------
To enable the autoresponder you have to set at least the response body and change
the status to *On*.
**Subject**
Response subject is optional. By default the reply subject will be set
to *Auto: <original subject>*
**Body**
Response body. Here you put the reason of your absence or any other text
that will be send to sender.
**Vacation start/end**
These fields define when the vacation rule is active and are optional.
**Status**
This field activates the rule. If you always use the same response body it is
convenient to disable the vacation rule when it's not needed and enable again
another time.
Advanced settings
-----------------
**Reply sender address**
This is an email address that will be used as sender of the vacation reply.
**My email addresses**
Normally the vacation response is send if recipient address of the incoming
message is one of your addresses known to the server. Here you can add
more addresses.
**Reply interval**
This parameter defines how often the reply to the same sender is generated.
When you receive a lot of messages from the same sender in short time,
usually you don't want to reply to all of them. By default reply is send once a day.
**Incoming message action**
This field defines an action taken on the incoming message. You can discard or keep
it or redirect/copy to another account (so it can be handled by another person).

@ -0,0 +1,113 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) 2015, roundcube.net
# This file is distributed under the same license as the Roundcube Webmail Help package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: Roundcube Webmail Help 1.1\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2016-06-07 16:59\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
#: ../../en_US/_plugins/managesieve/settings-filters.rst:9
# cdb4a7c71e5343edb8015510da83a0b8
msgid "Filters"
msgstr ""
#: ../../en_US/_plugins/managesieve/settings-filters.rst:11
# 94cde05fc3f049e8911dffacfb9af0e5
msgid "Incoming mail is automatically processed by the server and handled/organized according to defined criteria. For example you can tell the server to move the message to specified folder, redirect it to another account, send a reply, discard, delete, etc."
msgstr ""
#: ../../en_US/_plugins/managesieve/settings-filters.rst:15
# c33e9a7b05f24fe59464ff2f1c9e10a5
msgid "Filtering is based on `Sieve <https://www.rfc-editor.org/info/rfc5228>`_ language, which means that under the hood all filters are stored as a Sieve script on the server. This interface allows you to define rules in easy way without the need to know the language."
msgstr ""
#: ../../en_US/_plugins/managesieve/settings-filters.rst:19
# 95eb7e571ec44698a474407092b6b79c
msgid "Each filter definition has a name and set of rules and actions. Usually the number of definitions is unlimited and they can be grouped into sets (scripts) for convenience."
msgstr ""
#: ../../en_US/_plugins/managesieve/settings-filters.rst:25
# aa2da905741247b9971687cd4fdb6a21
msgid "Filter sets"
msgstr ""
#: ../../en_US/_plugins/managesieve/settings-filters.rst:27
# dc9dbc4144034676a720caaf4379e4e3
msgid "Filter definitions can be grouped into sets. These can be activated or disactivated. Depending on server configuration there can be none, one or more active sets at the same time. They need to have a unique name."
msgstr ""
#: ../../en_US/_plugins/managesieve/settings-filters.rst:31
# 03f58cdba04c4282b867c792572a55e6
msgid "New sets can be created as empty or as a copy of an existing set. It is also possible to import them from a text file containing Sieve script. Sets in form of a script can be also downloaded e.g. for backup or migration purposes."
msgstr ""
#: ../../en_US/_plugins/managesieve/settings-filters.rst:37
# 9144e63ba44b476dadfcc84e33e72b86
msgid "Filter definition"
msgstr ""
#: ../../en_US/_plugins/managesieve/settings-filters.rst:39
# 602e3696b4bd4db5960351b5af0e72fd
msgid "Every filter can be active or inactive, which is convenient if you want to disable some actions temporarily."
msgstr ""
#: ../../en_US/_plugins/managesieve/settings-filters.rst:42
# 0f01b114450f4439b210f3831d66c534
msgid "Because filters are executed in specified order (from top to bottom as you see them on the list) you can use drag-and-drop technique to rearange filters on the list."
msgstr ""
#: ../../en_US/_plugins/managesieve/settings-filters.rst:45
# 0a30f2aa835e430c9f9de2e446f4c311
msgid "Every filter definition contains at least one rule and one action. Depending on server capabilities a rule can be based e.g. on message headers, body, date or size."
msgstr ""
#: ../../en_US/_plugins/managesieve/settings-filters.rst:48
# d3b9c2df232c4cd891ec6ba4751e02cf
msgid "A set of actions also depends on server capabilities. Most servers support:"
msgstr ""
#: ../../en_US/_plugins/managesieve/settings-filters.rst:50
# 1ee77f36a88746e0809e903838314e5a
msgid "moving/copying messages to specified folder"
msgstr ""
#: ../../en_US/_plugins/managesieve/settings-filters.rst:51
# c2669d203d104753830a170af2ceffde
msgid "redirecting/copying messages to another account"
msgstr ""
#: ../../en_US/_plugins/managesieve/settings-filters.rst:52
# b04abf50eb1948518caff0c9f6d32ad4
msgid "discarding messages with specified error message"
msgstr ""
#: ../../en_US/_plugins/managesieve/settings-filters.rst:53
# 439873796de6457985088a206b449c5b
msgid "replying (vacation)"
msgstr ""
#: ../../en_US/_plugins/managesieve/settings-filters.rst:54
# 5b7bce17840647bdba48ffa944b30ec5
msgid "deleting (ignoring) messages"
msgstr ""
#: ../../en_US/_plugins/managesieve/settings-filters.rst:55
# a12f2f2bebe74c668b637be66352ddb7
msgid "setting flags (e.g. marking as Read)"
msgstr ""
#: ../../en_US/_plugins/managesieve/settings-filters.rst:57
# a19231cf44e64eeca67da4cd31b0303a
msgid "Note: Some actions stop filtering process, some do not. Use *Stop evaluating rules* and *Keep message in Inbox* actions to have more control on this."
msgstr ""

@ -0,0 +1,93 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) 2015, roundcube.net
# This file is distributed under the same license as the Roundcube Webmail Help package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: Roundcube Webmail Help 1.1\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2016-06-07 16:59\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
#: ../../en_US/_plugins/managesieve/settings-vacation.rst:9
# 6f1988e3ca10490f8b46fdf11ce3553a
msgid "Vacation"
msgstr ""
#: ../../en_US/_plugins/managesieve/settings-vacation.rst:11
# 628c07bf4b424a039800ef834f891841
msgid "The vacation autoresponder's purpose is to provide correspondents with notification that the user is away for an extended period of time and that they should not expect quick responses."
msgstr ""
#: ../../en_US/_plugins/managesieve/settings-vacation.rst:15
# 57607d8b841b42859d3bb4e6abc4d653
msgid "**Vacation** is used to respond to an incoming message with another message."
msgstr ""
#: ../../en_US/_plugins/managesieve/settings-vacation.rst:17
# 34f46a208d324588906b0d3d10a6176c
msgid "This interface is part of :ref:`settings-managesieve-filters` functionality and provides a simple way to manage vacation responses."
msgstr ""
#: ../../en_US/_plugins/managesieve/settings-vacation.rst:22
# 895cd4752ec649bc87850eb4bd149853
msgid "Vacation message"
msgstr ""
#: ../../en_US/_plugins/managesieve/settings-vacation.rst:24
# 5de6ddf9931a481e9d1c9953183b28d8
msgid "To enable the autoresponder you have to set at least the response body and change the status to *On*."
msgstr ""
#: ../../en_US/_plugins/managesieve/settings-vacation.rst:28
# c4790be6b0454aa190190c1e77087414
msgid "Response subject is optional. By default the reply subject will be set to *Auto: <original subject>*"
msgstr ""
#: ../../en_US/_plugins/managesieve/settings-vacation.rst:32
# 65eb9d5c2f8d4a8cb3077c824ecf597f
msgid "Response body. Here you put the reason of your absence or any other text that will be send to sender."
msgstr ""
#: ../../en_US/_plugins/managesieve/settings-vacation.rst:36
# 2b05975ad2ee40e9b64356eb39308a92
msgid "These fields define when the vacation rule is active and are optional."
msgstr ""
#: ../../en_US/_plugins/managesieve/settings-vacation.rst:39
# 575bd1430cdf4ea4bbcfb9d8556393bc
msgid "This field activates the rule. If you always use the same response body it is convenient to disable the vacation rule when it's not needed and enable again another time."
msgstr ""
#: ../../en_US/_plugins/managesieve/settings-vacation.rst:44
# 22d533b9cffd47d39c04cbca07d9513d
msgid "Advanced settings"
msgstr ""
#: ../../en_US/_plugins/managesieve/settings-vacation.rst:47
# d56d3eac661f41799e4538be4d2806cd
msgid "This is an email address that will be used as sender of the vacation reply."
msgstr ""
#: ../../en_US/_plugins/managesieve/settings-vacation.rst:50
# f2c3d5d2e05c4147bdca65d3b12acdf4
msgid "Normally the vacation response is send if recipient address of the incoming message is one of your addresses known to the server. Here you can add more addresses."
msgstr ""
#: ../../en_US/_plugins/managesieve/settings-vacation.rst:55
# 9b1ee71a799d43ebb8cef4a2555a7b83
msgid "This parameter defines how often the reply to the same sender is generated. When you receive a lot of messages from the same sender in short time, usually you don't want to reply to all of them. By default reply is send once a day."
msgstr ""
#: ../../en_US/_plugins/managesieve/settings-vacation.rst:60
# 8ce4de76e26543f1be25dedb372ce296
msgid "This field defines an action taken on the incoming message. You can discard or keep it or redirect/copy to another account (so it can be handled by another person)."
msgstr ""

@ -68,7 +68,9 @@ class rcube_sieve
$this->sieve->setDebug(true, array($this, 'debug_handler'));
}
if (PEAR::isError($this->sieve->connect($host, $port, $options, $usetls))) {
$result = $this->sieve->connect($host, $port, $options, $usetls);
if (is_a($result, 'PEAR_Error')) {
return $this->_set_error(self::ERROR_CONNECTION);
}
@ -78,9 +80,9 @@ class rcube_sieve
$password = $auth_pw;
}
if (PEAR::isError($this->sieve->login($username, $password,
$auth_type ? strtoupper($auth_type) : null, $authz))
) {
$result = $this->sieve->login($username, $password, $auth_type ? strtoupper($auth_type) : null, $authz);
if (is_a($result, 'PEAR_Error')) {
return $this->_set_error(self::ERROR_LOGIN);
}
@ -115,22 +117,28 @@ class rcube_sieve
*/
public function save($name = null)
{
if (!$this->sieve)
if (!$this->sieve) {
return $this->_set_error(self::ERROR_INTERNAL);
}
if (!$this->script)
if (!$this->script) {
return $this->_set_error(self::ERROR_INTERNAL);
}
if (!$name)
if (!$name) {
$name = $this->current;
}
$script = $this->script->as_text();
if (!$script)
if (!$script) {
$script = '/* empty script */';
}
if (PEAR::isError($this->sieve->installScript($name, $script)))
$result = $this->sieve->installScript($name, $script);
if (is_a($result, 'PEAR_Error')) {
return $this->_set_error(self::ERROR_INSTALL);
}
return true;
}
@ -140,14 +148,19 @@ class rcube_sieve
*/
public function save_script($name, $content = null)
{
if (!$this->sieve)
if (!$this->sieve) {
return $this->_set_error(self::ERROR_INTERNAL);
}
if (!$content)
if (!$content) {
$content = '/* empty script */';
}
$result = $this->sieve->installScript($name, $content);
if (PEAR::isError($this->sieve->installScript($name, $content)))
if (is_a($result, 'PEAR_Error')) {
return $this->_set_error(self::ERROR_INSTALL);
}
return true;
}
@ -157,14 +170,19 @@ class rcube_sieve
*/
public function activate($name = null)
{
if (!$this->sieve)
if (!$this->sieve) {
return $this->_set_error(self::ERROR_INTERNAL);
}
if (!$name)
if (!$name) {
$name = $this->current;
}
if (PEAR::isError($this->sieve->setActive($name)))
$result = $this->sieve->setActive($name);
if (is_a($result, 'PEAR_Error')) {
return $this->_set_error(self::ERROR_ACTIVATE);
}
return true;
}
@ -174,11 +192,15 @@ class rcube_sieve
*/
public function deactivate()
{
if (!$this->sieve)
if (!$this->sieve) {
return $this->_set_error(self::ERROR_INTERNAL);
}
$result = $this->sieve->setActive('');
if (PEAR::isError($this->sieve->setActive('')))
if (is_a($result, 'PEAR_Error')) {
return $this->_set_error(self::ERROR_DEACTIVATE);
}
return true;
}
@ -188,22 +210,32 @@ class rcube_sieve
*/
public function remove($name = null)
{
if (!$this->sieve)
if (!$this->sieve) {
return $this->_set_error(self::ERROR_INTERNAL);
}
if (!$name)
if (!$name) {
$name = $this->current;
}
// script must be deactivated first
if ($name == $this->sieve->getActive())
if (PEAR::isError($this->sieve->setActive('')))
if ($name == $this->sieve->getActive()) {
$result = $this->sieve->setActive('');
if (is_a($result, 'PEAR_Error')) {
return $this->_set_error(self::ERROR_DELETE);
}
}
$result = $this->sieve->removeScript($name);
if (PEAR::isError($this->sieve->removeScript($name)))
if (is_a($result, 'PEAR_Error')) {
return $this->_set_error(self::ERROR_DELETE);
}
if ($name == $this->current)
if ($name == $this->current) {
$this->current = null;
}
return true;
}
@ -221,7 +253,7 @@ class rcube_sieve
$ext = $this->sieve->getExtensions();
if (PEAR::isError($ext)) {
if (is_a($ext, 'PEAR_Error')) {
return array();
}
@ -250,8 +282,9 @@ class rcube_sieve
$list = $this->sieve->listScripts();
if (PEAR::isError($list))
if (is_a($list, 'PEAR_Error')) {
return $this->_set_error(self::ERROR_OTHER);
}
$this->list = $list;
}
@ -283,8 +316,9 @@ class rcube_sieve
$script = $this->sieve->getScript($name);
if (PEAR::isError($script))
if (is_a($script, 'PEAR_Error')) {
return $this->_set_error(self::ERROR_OTHER);
}
// try to parse from Roundcube format
$this->script = $this->_parse($script);
@ -349,8 +383,9 @@ class rcube_sieve
$content = $this->sieve->getScript($name);
if (PEAR::isError($content))
if (is_a($content, 'PEAR_Error')) {
return $this->_set_error(self::ERROR_OTHER);
}
return $content;
}
@ -366,10 +401,12 @@ class rcube_sieve
if ($copy) {
$content = $this->sieve->getScript($copy);
if (PEAR::isError($content))
if (is_a($content, 'PEAR_Error')) {
return $this->_set_error(self::ERROR_OTHER);
}
}
return $this->save_script($name, $content);
}

@ -63,7 +63,7 @@ class rcube_sieve_engine
1 => 'notifyimportancehigh'
);
const VERSION = '8.2';
const VERSION = '8.4';
const PROGNAME = 'Roundcube (Managesieve)';
const PORT = 4190;
@ -122,9 +122,6 @@ class rcube_sieve_engine
case rcube_sieve::ERROR_CONNECTION:
case rcube_sieve::ERROR_LOGIN:
$this->rc->output->show_message('managesieve.filterconnerror', 'error');
rcube::raise_error(array('code' => 403, 'type' => 'php',
'file' => __FILE__, 'line' => __LINE__,
'message' => "Unable to connect to managesieve on $host:$port"), true, false);
break;
default:
@ -210,7 +207,18 @@ class rcube_sieve_engine
$plugin['socket_options']
);
return $this->sieve->error();
$error = $this->sieve->error();
if ($error) {
rcube::raise_error(array(
'code' => 403,
'file' => __FILE__,
'line' => __LINE__,
'message' => "Unable to connect to managesieve on $host:$port"
), true, false);
}
return $error;
}
/**
@ -389,11 +397,14 @@ class rcube_sieve_engine
}
}
else if ($action == 'setget') {
$this->rc->request_security_check(rcube_utils::INPUT_GET);
$script_name = rcube_utils::get_input_value('_set', rcube_utils::INPUT_GPC, true);
$script = $this->sieve->get_script($script_name);
$script = $this->sieve->get_script($script_name);
if (PEAR::isError($script))
if (is_a($script, 'PEAR_Error')) {
exit;
}
$browser = new rcube_browser;
@ -432,6 +443,11 @@ class rcube_sieve_engine
$this->rc->output->command('managesieve_actionfill', $content, $id, $aid);
}
else if ($action == 'addresses') {
$aid = rcube_utils::get_input_value('_aid', rcube_utils::INPUT_POST);
$this->rc->output->command('managesieve_vacation_addresses_update', $aid, $this->user_emails());
}
$this->rc->output->send();
}
@ -1393,19 +1409,21 @@ class rcube_sieve_engine
}
if (isset($rule['test'])) {
if (in_array($rule['test'], array('header', 'address', 'envelope'))
&& !is_array($rule['arg1'])
&& ($header = strtolower($rule['arg1']))
&& isset($this->headers[$header])
) {
$test = $header;
if (in_array($rule['test'], array('header', 'address', 'envelope'))) {
if (is_array($rule['arg1']) && count($rule['arg1']) == 1) {
$rule['arg1'] = $rule['arg1'][0];
}
$matches = ($header = strtolower($rule['arg1'])) && isset($this->headers[$header]);
$test = $matches ? $header : '...';
}
else if ($rule['test'] == 'exists'
&& !is_array($rule['arg'])
&& ($header = strtolower($rule['arg']))
&& isset($this->headers[$header])
) {
$test = $header;
else if ($rule['test'] == 'exists') {
if (is_array($rule['arg']) && count($rule['arg']) == 1) {
$rule['arg'] = $rule['arg'][0];
}
$matches = ($header = strtolower($rule['arg'])) && isset($this->headers[$header]);
$test = $matches ? $header : '...';
}
else if (in_array($rule['test'], array('size', 'body', 'date', 'currentdate'))) {
$test = $rule['test'];
@ -1758,7 +1776,10 @@ class rcube_sieve_engine
. "</textarea>\n";
// vacation
$vsec = in_array('vacation-seconds', $this->exts);
$vsec = in_array('vacation-seconds', $this->exts);
$auto_addr = $this->rc->config->get('managesieve_vacation_addresses_init');
$addresses = isset($action['addresses']) || !$auto_addr ? (array) $action['addresses'] : $this->user_emails();
$out .= '<div id="action_vacation' .$id.'" style="display:' .($action['type']=='vacation' ? 'inline' : 'none') .'">';
$out .= '<span class="label">'. rcube::Q($this->plugin->gettext('vacationreason')) .'</span><br />'
.'<textarea name="_action_reason['.$id.']" id="action_reason' .$id. '" '
@ -1769,11 +1790,13 @@ class rcube_sieve_engine
.'value="' . (is_array($action['subject']) ? rcube::Q(implode(', ', $action['subject']), 'strict', false) : $action['subject']) . '" size="35" '
. $this->error_class($id, 'action', 'subject', 'action_subject') .' />';
$out .= '<br /><span class="label">' .rcube::Q($this->plugin->gettext('vacationaddr')) . '</span><br />'
. $this->list_input($id, 'action_addresses', $action['addresses'], true,
$this->error_class($id, 'action', 'addresses', 'action_addresses'), 30);
. $this->list_input($id, 'action_addresses', $addresses, true,
$this->error_class($id, 'action', 'addresses', 'action_addresses'), 30)
. html::a(array('href' => '#', 'onclick' => rcmail_output::JS_OBJECT_NAME . ".managesieve_vacation_addresses($id)"),
rcube::Q($this->plugin->gettext('filladdresses')));
$out .= '<br /><span class="label">' . rcube::Q($this->plugin->gettext($vsec ? 'vacationinterval' : 'vacationdays')) . '</span><br />'
.'<input type="text" name="_action_interval['.$id.']" id="action_interval'.$id.'" '
.'value="' .rcube::Q(isset($action['seconds']) ? $action['seconds'] : $action['days'], 'strict', false) . '" size="2" '
.'value="' .rcube::Q(rcube_sieve_vacation::vacation_interval($action), 'strict', false) . '" size="2" '
. $this->error_class($id, 'action', 'interval', 'action_interval') .' />';
if ($vsec) {
$out .= '&nbsp;<label><input type="radio" name="_action_interval_type['.$id.']" value="days"'
@ -2344,12 +2367,12 @@ class rcube_sieve_engine
*/
protected function init_script()
{
$this->script = $this->sieve->script->as_array();
if (!$this->script) {
if (!$this->sieve->script) {
return;
}
$this->script = $this->sieve->script->as_array();
$headers = array();
$exceptions = array('date', 'currentdate', 'size', 'body');
@ -2378,4 +2401,21 @@ class rcube_sieve_engine
$this->headers += $headers;
}
/**
* Get all e-mail addresses of the user
*/
protected function user_emails()
{
$addresses = $this->rc->user->list_emails();
foreach ($addresses as $idx => $email) {
$addresses[$idx] = $email['email'];
}
$addresses = array_unique($addresses);
sort($addresses);
return $addresses;
}
}

@ -329,14 +329,23 @@ class rcube_sieve_vacation extends rcube_sieve_engine
'noclose' => true
) + $attrib);
$auto_addr = $this->rc->config->get('managesieve_vacation_addresses_init');
$addresses = !$auto_addr || count($this->vacation) > 1 ? (array) $this->vacation['addresses'] : $this->user_emails();
// form elements
$subject = new html_inputfield(array('name' => 'vacation_subject', 'id' => 'vacation_subject', 'size' => 50));
$reason = new html_textarea(array('name' => 'vacation_reason', 'id' => 'vacation_reason', 'cols' => 60, 'rows' => 8));
$interval = new html_inputfield(array('name' => 'vacation_interval', 'id' => 'vacation_interval', 'size' => 5));
$addresses = '<textarea name="vacation_addresses" id="vacation_addresses" data-type="list" data-size="30" style="display: none">'
. rcube::Q(implode("\n", (array) $this->vacation['addresses']), 'strict', false) . '</textarea>';
. rcube::Q(implode("\n", $addresses), 'strict', false) . '</textarea>';
$status = new html_select(array('name' => 'vacation_status', 'id' => 'vacation_status'));
$action = new html_select(array('name' => 'vacation_action', 'id' => 'vacation_action', 'onchange' => 'vacation_action_select()'));
$addresses_link = new html_inputfield(array(
'type' => 'button',
'href' => '#',
'class' => 'button',
'onclick' => rcmail_output::JS_OBJECT_NAME . '.managesieve_vacation_addresses()'
));
$status->add($this->plugin->gettext('vacation.on'), 'on');
$status->add($this->plugin->gettext('vacation.off'), 'off');
@ -357,7 +366,7 @@ class rcube_sieve_vacation extends rcube_sieve_engine
}
}
$interval_txt = $interval->show(isset($this->vacation['seconds']) ? $this->vacation['seconds'] : $this->vacation['days']);
$interval_txt = $interval->show(self::vacation_interval($this->vacation));
if ($seconds_extension) {
$interval_select = new html_select(array('name' => 'vacation_interval_type'));
$interval_select->add($this->plugin->gettext('days'), 'days');
@ -461,7 +470,7 @@ class rcube_sieve_vacation extends rcube_sieve_engine
$table = new html_table(array('cols' => 2));
$table->add('title', html::label('vacation_addresses', $this->plugin->gettext('vacation.addresses')));
$table->add(null, $addresses);
$table->add(null, $addresses . $addresses_link->show($this->plugin->gettext('filladdresses')));
$table->add('title', html::label('vacation_interval', $this->plugin->gettext('vacation.interval')));
$table->add(null, $interval_txt);
@ -550,6 +559,36 @@ class rcube_sieve_vacation extends rcube_sieve_engine
return $result;
}
/**
* Get current vacation interval
*/
public static function vacation_interval(&$vacation)
{
$rcube = rcube::get_instance();
if (isset($vacation['seconds'])) {
$interval = $vacation['seconds'];
}
else if (isset($vacation['days'])) {
$interval = $vacation['days'];
}
else if ($interval_cfg = $rcube->config->get('managesieve_vacation_interval')) {
if (preg_match('/^([0-9]+)s$/', $interval_cfg, $m)) {
if ($seconds_extension) {
$vacation['seconds'] = ($interval = intval($m[1])) ? $interval : null;
}
else {
$vacation['days'] = $interval = ceil(intval($m[1])/86400);
}
}
else {
$vacation['days'] = $interval = intval($interval_cfg);
}
}
return $interval ? $interval : '';
}
/**
* Saves vacation script (adding some variables)
*/
@ -562,62 +601,74 @@ class rcube_sieve_vacation extends rcube_sieve_engine
$this->script_name = 'roundcube';
}
$this->script = array($rule);
$script_active = false;
// use default script contents
if (!$this->rc->config->get('managesieve_kolab_master')) {
$script_file = $this->rc->config->get('managesieve_default');
if ($script_file && is_readable($script_file)) {
$content = file_get_contents($script_file);
}
}
// create and load script
if ($this->sieve->save_script($this->script_name, $content)) {
$this->sieve->load($this->script_name);
}
}
// if script exists
else {
$script_active = in_array($this->script_name, $this->active);
// re-order rules if needed
if (isset($rule['after']) && $rule['after'] !== '') {
// reset original vacation rule
if (isset($this->vacation['idx'])) {
$this->script[$this->vacation['idx']] = null;
}
$script_active = in_array($this->script_name, $this->active);
// add at target position
if ($rule['after'] >= count($this->script) - 1) {
$this->script[] = $rule;
}
else {
$script = array();
// re-order rules if needed
if (isset($rule['after']) && $rule['after'] !== '') {
// reset original vacation rule
if (isset($this->vacation['idx'])) {
$this->script[$this->vacation['idx']] = null;
}
foreach ($this->script as $idx => $r) {
if ($r) {
$script[] = $r;
}
// add at target position
if ($rule['after'] >= count($this->script) - 1) {
$this->script[] = $rule;
}
else {
$script = array();
if ($idx == $rule['after']) {
$script[] = $rule;
}
foreach ($this->script as $idx => $r) {
if ($r) {
$script[] = $r;
}
$this->script = $script;
if ($idx == $rule['after']) {
$script[] = $rule;
}
}
$this->script = array_values(array_filter($this->script));
}
// update original vacation rule if it exists
else if (isset($this->vacation['idx'])) {
$this->script[$this->vacation['idx']] = $rule;
}
// otherwise put vacation rule on top
else {
array_unshift($this->script, $rule);
$this->script = $script;
}
// if the script was not active, we need to de-activate
// all rules except the vacation rule, but only if it is not disabled
if (!$script_active && !$rule['disabled']) {
foreach ($this->script as $idx => $r) {
if (empty($r['actions']) || $r['actions'][0]['type'] != 'vacation') {
$this->script[$idx]['disabled'] = true;
}
$this->script = array_values(array_filter($this->script));
}
// update original vacation rule if it exists
else if (isset($this->vacation['idx'])) {
$this->script[$this->vacation['idx']] = $rule;
}
// otherwise put vacation rule on top
else {
array_unshift($this->script, $rule);
}
// if the script was not active, we need to de-activate
// all rules except the vacation rule, but only if it is not disabled
if (!$script_active && !$rule['disabled']) {
foreach ($this->script as $idx => $r) {
if (empty($r['actions']) || $r['actions'][0]['type'] != 'vacation') {
$this->script[$idx]['disabled'] = true;
}
}
}
if (!$this->sieve->script) {
return false;
}
$this->sieve->script->content = $this->script;
// save the script

@ -54,7 +54,6 @@ $labels['add'] = 'إضافة';
$labels['del'] = 'حذف';
$labels['sender'] = 'المرسل';
$labels['recipient'] = 'مستلم';
$labels['vacationaddr'] = 'عناوين البريد الالكتروني(ـة) الاضافية:';
$labels['vacationdays'] = 'في الغالب كم رسالة ترسل (بالايام):';
$labels['vacationinterval'] = 'كم عدد الرسائل المرسلة عادةً:';
$labels['vacationreason'] = 'نص الرسالة (بسبب الاجازة):';
@ -150,7 +149,6 @@ $labels['vacation.body'] = 'محتوى ';
$labels['vacation.status'] = 'الحالة ';
$labels['vacation.on'] = 'تشغيل';
$labels['vacation.off'] = 'ايقاف';
$labels['vacation.addresses'] = 'عناوينني الاضافية';
$labels['vacation.saving'] = 'يتم حفظ البيانات...';
$messages['filterunknownerror'] = 'خطا غير معروف من الخادم.';
$messages['filterconnerror'] = 'لا يمكن الاتصال بالخادم.';

@ -54,7 +54,6 @@ $labels['add'] = 'Əlavə et';
$labels['del'] = 'Sil';
$labels['sender'] = 'Göndərən';
$labels['recipient'] = 'Qəbul edən';
$labels['vacationaddr'] = 'Mənim əlavə e-poçt ünvan(lar)ım: ';
$labels['vacationdays'] = 'Məktub neçə müddətdən bir göndərilsin (gündə):';
$labels['vacationinterval'] = 'Məktublar nə qədər sıx göndərilsin:';
$labels['vacationreason'] = 'Məktubun mətni (səbəb yoxdur):';

@ -54,7 +54,6 @@ $labels['add'] = 'Дадаць';
$labels['del'] = 'Выдаліць';
$labels['sender'] = 'Ад каго';
$labels['recipient'] = 'Каму';
$labels['vacationaddr'] = 'Дадатковы(я) адрасы эл. пошты:';
$labels['vacationdays'] = 'Як часта дасылаць паведамленні (у днях):';
$labels['vacationinterval'] = 'Як часта дасылаць паведамленні:';
$labels['vacationreason'] = 'Цела паведамлення (прычына вакацый):';

@ -54,10 +54,10 @@ $labels['add'] = 'Добави';
$labels['del'] = 'Изтрий';
$labels['sender'] = 'Подател';
$labels['recipient'] = 'Получател';
$labels['vacationaddr'] = 'Мои допълнителни e-mail адреси:';
$labels['vacationaddr'] = 'Мои допълнителни адреси:';
$labels['vacationdays'] = 'Колко често да праща писма (в дни):';
$labels['vacationinterval'] = 'Колко често да праща писма:';
$labels['vacationreason'] = 'Текст на писмото (причина за ваканцията)';
$labels['vacationreason'] = 'Текст на писмото (причина за отпуск)';
$labels['vacationsubject'] = 'Заглавие на писмото';
$labels['days'] = 'дни';
$labels['seconds'] = 'секунди';
@ -165,13 +165,28 @@ $labels['vacation.reply'] = 'Писмо отговор';
$labels['vacation.advanced'] = 'Разширени настройки';
$labels['vacation.subject'] = 'Относно';
$labels['vacation.body'] = 'Съдържание';
$labels['vacation.start'] = 'Начало на отпуск';
$labels['vacation.end'] = 'Край на отпуск';
$labels['vacation.status'] = 'Статус';
$labels['vacation.on'] = 'Вкл.';
$labels['vacation.off'] = 'Изкл.';
$labels['vacation.addresses'] = 'Моите допълнителни адреси';
$labels['vacation.addresses'] = 'Мои допълнителни адреси';
$labels['vacation.interval'] = 'Интервал на отговор';
$labels['vacation.after'] = 'Постави правило за отпуск след';
$labels['vacation.saving'] = 'Запис на данни...';
$labels['vacation.action'] = 'Действие при получаване на писмо';
$labels['vacation.keep'] = 'Задръж';
$labels['vacation.discard'] = 'Изхвърли';
$labels['vacation.redirect'] = 'Препрати на';
$labels['vacation.copy'] = 'Прати копие на';
$labels['filladdresses'] = 'Попълни с всички мои адреси';
$labels['arialabelfiltersetactions'] = 'Действия на набор от филтри';
$labels['arialabelfilteractions'] = 'Действия на филтър';
$labels['arialabelfilterform'] = 'Свойства на филтър';
$labels['ariasummaryfilterslist'] = 'Списък филтри';
$labels['ariasummaryfiltersetslist'] = 'Списък набори от филтри';
$labels['filterstitle'] = 'Редакция на филтри вх. поща';
$labels['vacationtitle'] = 'Редакция на правило за извън офиса';
$messages['filterunknownerror'] = 'Неизвестна сървърна грешка.';
$messages['filterconnerror'] = 'Неуспешно свързване с managesieve сървъра.';
$messages['filterdeleteerror'] = 'Невъзможно изтриване на филтъра. Възникна сървърна грешка.';
@ -206,4 +221,5 @@ $messages['nodata'] = 'Поне една позиция трябва да е и
$messages['invaliddateformat'] = 'невалидна дата или формат на част от дата';
$messages['saveerror'] = 'Невъзможен запис на данни. Грешка при достъп до сървър.';
$messages['vacationsaved'] = 'Данните за отпуск са записани успешно.';
$messages['emptyvacationbody'] = 'Липсва текст на писмо при отпуск!';
?>

@ -54,7 +54,6 @@ $labels['add'] = 'Dodaj';
$labels['del'] = 'Obriši';
$labels['sender'] = 'Pošiljaoc';
$labels['recipient'] = 'Primaoc';
$labels['vacationaddr'] = 'Moje dodatne email adrese:';
$labels['vacationdays'] = 'Frekvencija slanja poruka (u danima):';
$labels['vacationinterval'] = 'Frekvencija slanja poruka:';
$labels['vacationreason'] = 'Tijelo poruke (razlog za odmor):';
@ -170,7 +169,6 @@ $labels['vacation.end'] = 'Kraj odmora';
$labels['vacation.status'] = 'Status';
$labels['vacation.on'] = 'Uključeno';
$labels['vacation.off'] = 'Isključeno';
$labels['vacation.addresses'] = 'Moje dodatne adrese';
$labels['vacation.interval'] = 'Interval odgovora';
$labels['vacation.after'] = 'Pravilo za odmor stavi nakon';
$labels['vacation.saving'] = 'Snimam podatke...';

@ -54,7 +54,6 @@ $labels['add'] = 'Afegeix';
$labels['del'] = 'Suprimeix';
$labels['sender'] = 'Remitent';
$labels['recipient'] = 'Destinatari';
$labels['vacationaddr'] = 'Les meves adreces de correu addicionals:';
$labels['vacationdays'] = 'Cada quan enviar un missatge (en dies):';
$labels['vacationinterval'] = 'Amb quina freqüència s\'han d\'enviar els missatges:';
$labels['vacationreason'] = 'Cos del missatge (raó de l\'absència):';
@ -170,7 +169,6 @@ $labels['vacation.end'] = 'Finalització de vacances';
$labels['vacation.status'] = 'Estat';
$labels['vacation.on'] = 'Activat';
$labels['vacation.off'] = 'Desactivat';
$labels['vacation.addresses'] = 'Les meves adreces addicionals:';
$labels['vacation.interval'] = 'Interval de resposta';
$labels['vacation.after'] = 'Posa la regla de vacances després';
$labels['vacation.saving'] = 'S\'estan desant les dades...';

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

Loading…
Cancel
Save