瀏覽代碼

Show spam aliases #

andryyy 8 年之前
父節點
當前提交
0eb932b3ab
共有 100 個文件被更改,包括 6278 次插入22 次删除
  1. 54 16
      data/web/inc/functions.inc.php
  2. 2 0
      data/web/inc/vars.inc.php
  3. 4 4
      data/web/js/mailbox.js
  4. 2 1
      data/web/lang/lang.de.php
  5. 2 1
      data/web/lang/lang.en.php
  6. 2 0
      data/web/mailbox.php
  7. 87 0
      data/web/rc/.htaccess
  8. 2413 0
      data/web/rc/CHANGELOG
  9. 269 0
      data/web/rc/INSTALL
  10. 674 0
      data/web/rc/LICENSE
  11. 93 0
      data/web/rc/README.md
  12. 400 0
      data/web/rc/SQL/mssql.initial.sql
  13. 87 0
      data/web/rc/SQL/mssql/2009103100.sql
  14. 9 0
      data/web/rc/SQL/mssql/2010100600.sql
  15. 10 0
      data/web/rc/SQL/mssql/2011011200.sql
  16. 127 0
      data/web/rc/SQL/mssql/2011092800.sql
  17. 4 0
      data/web/rc/SQL/mssql/2011111600.sql
  18. 9 0
      data/web/rc/SQL/mssql/2011121400.sql
  19. 18 0
      data/web/rc/SQL/mssql/2012051800.sql
  20. 8 0
      data/web/rc/SQL/mssql/2012080700.sql
  21. 14 0
      data/web/rc/SQL/mssql/2013011000.sql
  22. 1 0
      data/web/rc/SQL/mssql/2013042700.sql
  23. 17 0
      data/web/rc/SQL/mssql/2013052500.sql
  24. 44 0
      data/web/rc/SQL/mssql/2013061000.sql
  25. 1 0
      data/web/rc/SQL/mssql/2014042900.sql
  26. 1 0
      data/web/rc/SQL/mssql/2015030800.sql
  27. 4 0
      data/web/rc/SQL/mssql/2015111100.sql
  28. 2 0
      data/web/rc/SQL/mssql/2016081200.sql
  29. 2 0
      data/web/rc/SQL/mssql/2016100900.sql
  30. 36 0
      data/web/rc/SQL/mssql/2016112200.sql
  31. 212 0
      data/web/rc/SQL/mysql.initial.sql
  32. 16 0
      data/web/rc/SQL/mysql/2008030300.sql
  33. 9 0
      data/web/rc/SQL/mysql/2008040500.sql
  34. 4 0
      data/web/rc/SQL/mysql/2008060900.sql
  35. 20 0
      data/web/rc/SQL/mysql/2008092100.sql
  36. 12 0
      data/web/rc/SQL/mysql/2009090400.sql
  37. 52 0
      data/web/rc/SQL/mysql/2009103100.sql
  38. 4 0
      data/web/rc/SQL/mysql/2010042300.sql
  39. 8 0
      data/web/rc/SQL/mysql/2010100600.sql
  40. 8 0
      data/web/rc/SQL/mysql/2011011200.sql
  41. 67 0
      data/web/rc/SQL/mysql/2011092800.sql
  42. 3 0
      data/web/rc/SQL/mysql/2011111600.sql
  43. 22 0
      data/web/rc/SQL/mysql/2011121400.sql
  44. 5 0
      data/web/rc/SQL/mysql/2012080700.sql
  45. 7 0
      data/web/rc/SQL/mysql/2013011000.sql
  46. 1 0
      data/web/rc/SQL/mysql/2013042700.sql
  47. 7 0
      data/web/rc/SQL/mysql/2013052500.sql
  48. 24 0
      data/web/rc/SQL/mysql/2013061000.sql
  49. 1 0
      data/web/rc/SQL/mysql/2014042900.sql
  50. 1 0
      data/web/rc/SQL/mysql/2015030800.sql
  51. 3 0
      data/web/rc/SQL/mysql/2015111100.sql
  52. 1 0
      data/web/rc/SQL/mysql/2016081200.sql
  53. 1 0
      data/web/rc/SQL/mysql/2016100900.sql
  54. 24 0
      data/web/rc/SQL/mysql/2016112200.sql
  55. 220 0
      data/web/rc/SQL/oracle.initial.sql
  56. 1 0
      data/web/rc/SQL/oracle/2015030800.sql
  57. 2 0
      data/web/rc/SQL/oracle/2015111100.sql
  58. 1 0
      data/web/rc/SQL/oracle/2016081200.sql
  59. 1 0
      data/web/rc/SQL/oracle/2016100900.sql
  60. 23 0
      data/web/rc/SQL/oracle/2016112200.sql
  61. 291 0
      data/web/rc/SQL/postgres.initial.sql
  62. 18 0
      data/web/rc/SQL/postgres/2008030300.sql
  63. 3 0
      data/web/rc/SQL/postgres/2008060900.sql
  64. 14 0
      data/web/rc/SQL/postgres/2008092100.sql
  65. 6 0
      data/web/rc/SQL/postgres/2009090400.sql
  66. 32 0
      data/web/rc/SQL/postgres/2009103100.sql
  67. 4 0
      data/web/rc/SQL/postgres/2010042300.sql
  68. 7 0
      data/web/rc/SQL/postgres/2010100600.sql
  69. 7 0
      data/web/rc/SQL/postgres/2011011200.sql
  70. 64 0
      data/web/rc/SQL/postgres/2011092800.sql
  71. 3 0
      data/web/rc/SQL/postgres/2011111600.sql
  72. 5 0
      data/web/rc/SQL/postgres/2011121400.sql
  73. 7 0
      data/web/rc/SQL/postgres/2012080700.sql
  74. 4 0
      data/web/rc/SQL/postgres/2013011000.sql
  75. 14 0
      data/web/rc/SQL/postgres/2013042700.sql
  76. 8 0
      data/web/rc/SQL/postgres/2013052500.sql
  77. 24 0
      data/web/rc/SQL/postgres/2013061000.sql
  78. 1 0
      data/web/rc/SQL/postgres/2014042900.sql
  79. 1 0
      data/web/rc/SQL/postgres/2015030800.sql
  80. 2 0
      data/web/rc/SQL/postgres/2015111100.sql
  81. 1 0
      data/web/rc/SQL/postgres/2016081200.sql
  82. 1 0
      data/web/rc/SQL/postgres/2016100900.sql
  83. 21 0
      data/web/rc/SQL/postgres/2016112200.sql
  84. 203 0
      data/web/rc/SQL/sqlite.initial.sql
  85. 25 0
      data/web/rc/SQL/sqlite/2008030300.sql
  86. 3 0
      data/web/rc/SQL/sqlite/2008060900.sql
  87. 4 0
      data/web/rc/SQL/sqlite/2008092100.sql
  88. 8 0
      data/web/rc/SQL/sqlite/2009090400.sql
  89. 61 0
      data/web/rc/SQL/sqlite/2009103100.sql
  90. 35 0
      data/web/rc/SQL/sqlite/2010042300.sql
  91. 40 0
      data/web/rc/SQL/sqlite/2010100600.sql
  92. 41 0
      data/web/rc/SQL/sqlite/2011011200.sql
  93. 54 0
      data/web/rc/SQL/sqlite/2011092800.sql
  94. 11 0
      data/web/rc/SQL/sqlite/2011111600.sql
  95. 38 0
      data/web/rc/SQL/sqlite/2011121400.sql
  96. 44 0
      data/web/rc/SQL/sqlite/2012080700.sql
  97. 6 0
      data/web/rc/SQL/sqlite/2013011000.sql
  98. 2 0
      data/web/rc/SQL/sqlite/2013011700.sql
  99. 1 0
      data/web/rc/SQL/sqlite/2013042700.sql
  100. 8 0
      data/web/rc/SQL/sqlite/2013052500.sql

+ 54 - 16
data/web/inc/functions.inc.php

@@ -253,6 +253,8 @@ function edit_admin_account($postarray) {
 	}
 	$username       = $postarray['admin_user'];
 	$username_now   = $_SESSION['mailcow_cc_username'];
+  $password       = $postarray['admin_pass'];
+  $password2      = $postarray['admin_pass2'];
 
 	if (!ctype_alnum(str_replace(array('_', '.', '-'), '', $username)) || empty ($username)) {
 		$_SESSION['return'] = array(
@@ -262,15 +264,22 @@ function edit_admin_account($postarray) {
 		return false;
 	}
 
-	if (!empty($postarray['admin_pass']) && !empty($postarray['admin_pass2'])) {
-		if ($postarray['admin_pass'] != $postarray['admin_pass2']) {
+	if (!empty($password) && !empty($password2)) {
+    if (!preg_match('/' . $GLOBALS['PASSWD_REGEP'] . '/', $password)) {
+      $_SESSION['return'] = array(
+        'type' => 'danger',
+        'msg' => sprintf($lang['danger']['password_complexity'])
+      );
+      return false;
+    }
+		if ($password != $password2) {
 			$_SESSION['return'] = array(
 				'type' => 'danger',
 				'msg' => sprintf($lang['danger']['password_mismatch'])
 			);
 			return false;
 		}
-		$password_hashed = hash_password($postarray['admin_pass']);
+		$password_hashed = hash_password($password);
 		try {
 			$stmt = $pdo->prepare("UPDATE `admin` SET 
 				`modified` = :modified,
@@ -585,9 +594,7 @@ function edit_user_account($postarray) {
 				);
 				return false;
 			}
-			if (strlen($password_new) < "6" ||
-				!preg_match('/[A-Za-z]/', $password_new) ||
-				!preg_match('/[0-9]/', $password_new)) {
+			if (!preg_match('/' . $GLOBALS['PASSWD_REGEP'] . '/', $password_new)) {
 					$_SESSION['return'] = array(
 						'type' => 'danger',
 						'msg' => sprintf($lang['danger']['password_complexity'])
@@ -1515,7 +1522,7 @@ function add_domain_admin($postarray) {
 	global $pdo;
 	$username		= strtolower(trim($postarray['username']));
 	$password		= $postarray['password'];
-	$password2		= $postarray['password2'];
+	$password2  = $postarray['password2'];
 	isset($postarray['active']) ? $active = '1' : $active = '0';
 	if ($_SESSION['mailcow_cc_role'] != "admin") {
 		$_SESSION['return'] = array(
@@ -1571,6 +1578,13 @@ function add_domain_admin($postarray) {
 		}
 	}
 	if (!empty($password) && !empty($password2)) {
+    if (!preg_match('/' . $GLOBALS['PASSWD_REGEP'] . '/', $password)) {
+      $_SESSION['return'] = array(
+        'type' => 'danger',
+        'msg' => sprintf($lang['danger']['password_complexity'])
+      );
+      return false;
+    }
 		if ($password != $password2) {
 			$_SESSION['return'] = array(
 				'type' => 'danger',
@@ -2169,6 +2183,13 @@ function edit_domain_admin($postarray) {
     }
 
     if (!empty($password) && !empty($password2)) {
+      if (!preg_match('/' . $GLOBALS['PASSWD_REGEP'] . '/', $password)) {
+        $_SESSION['return'] = array(
+          'type' => 'danger',
+          'msg' => sprintf($lang['danger']['password_complexity'])
+        );
+        return false;
+      }
       if ($password != $password2) {
         $_SESSION['return'] = array(
           'type' => 'danger',
@@ -2262,14 +2283,12 @@ function edit_domain_admin($postarray) {
         );
         return false;
       }
-      if (strlen($password_new) < "6" ||
-        !preg_match('/[A-Za-z]/', $password_new) ||
-        !preg_match('/[0-9]/', $password_new)) {
-          $_SESSION['return'] = array(
-            'type' => 'danger',
-            'msg' => sprintf($lang['danger']['password_complexity'])
-          );
-          return false;
+      if (!preg_match('/' . $GLOBALS['PASSWD_REGEP'] . '/', $password_new)) {
+        $_SESSION['return'] = array(
+          'type' => 'danger',
+          'msg' => sprintf($lang['danger']['password_complexity'])
+        );
+        return false;
       }
       $password_hashed = hash_password($password_new);
       try {
@@ -2991,6 +3010,13 @@ function mailbox_add_mailbox($postarray) {
 	}
 
 	if (!empty($password) && !empty($password2)) {
+    if (!preg_match('/' . $GLOBALS['PASSWD_REGEP'] . '/', $password)) {
+      $_SESSION['return'] = array(
+        'type' => 'danger',
+        'msg' => sprintf($lang['danger']['password_complexity'])
+      );
+      return false;
+    }
 		if ($password != $password2) {
 			$_SESSION['return'] = array(
 				'type' => 'danger',
@@ -3735,6 +3761,13 @@ function mailbox_edit_mailbox($postarray) {
     }
   }
 	if (!empty($password) && !empty($password2)) {
+    if (!preg_match('/' . $GLOBALS['PASSWD_REGEP'] . '/', $password)) {
+      $_SESSION['return'] = array(
+        'type' => 'danger',
+        'msg' => sprintf($lang['danger']['password_complexity'])
+      );
+      return false;
+    }
 		if ($password != $password2) {
 			$_SESSION['return'] = array(
 				'type' => 'danger',
@@ -4313,9 +4346,13 @@ function mailbox_get_mailbox_details($mailbox) {
     $DomainQuota  = $stmt->fetch(PDO::FETCH_ASSOC);
 
     $stmt = $pdo->prepare("SELECT COALESCE(SUM(`quota`), 0) as `in_use` FROM `mailbox` WHERE `kind` NOT REGEXP 'location|thing|group' AND `domain` = :domain AND `username` != :username");
-    $stmt->execute(array(':domain' => $row['domain'], ':username' => $row['username']));
+    $stmt->execute(array(':domain' => $row['domain'], ':username' => $mailbox));
     $MailboxUsage	= $stmt->fetch(PDO::FETCH_ASSOC);
 
+    $stmt = $pdo->prepare("SELECT IFNULL(COUNT(`address`), 0) AS `sa_count` FROM `spamalias` WHERE `address` = :address");
+    $stmt->execute(array(':address' => $mailbox));
+    $SpamaliasUsage	= $stmt->fetch(PDO::FETCH_ASSOC);
+
     $mailboxdata['max_new_quota'] = ($DomainQuota['quota'] * 1048576) - $MailboxUsage['in_use'];
     if ($mailboxdata['max_new_quota'] > ($DomainQuota['maxquota'] * 1048576)) {
       $mailboxdata['max_new_quota'] = ($DomainQuota['maxquota'] * 1048576);
@@ -4331,6 +4368,7 @@ function mailbox_get_mailbox_details($mailbox) {
     $mailboxdata['quota_used'] = intval($row['bytes']);
     $mailboxdata['percent_in_use'] = round((intval($row['bytes']) / intval($row['quota'])) * 100);
     $mailboxdata['messages'] = $row['messages'];
+    $mailboxdata['spam_aliases'] = $SpamaliasUsage['sa_count'];
     if ($mailboxdata['percent_in_use'] >= 90) {
       $mailboxdata['percent_class'] = "danger";
     }

+ 2 - 0
data/web/inc/vars.inc.php

@@ -35,4 +35,6 @@ $DEFAULT_LANG = "en";
 // See https://bootswatch.com/
 $DEFAULT_THEME = "lumen";
 
+// Password complexity as regular expression
+$PASSWD_REGEP = '.{4,}';
 ?>

+ 4 - 4
data/web/js/mailbox.js

@@ -18,10 +18,10 @@ $(document).ready(function() {
 			return this.each(function(){
 				$(this).on('keyup', function(e){
 					var $this = $(this),
-                        search = $this.val().toLowerCase(),
-                        target = $this.attr('data-filters'),
-                        $target = $(target),
-                        $rows = $target.find('tbody #data');
+            search = $this.val().toLowerCase(),
+            target = $this.attr('data-filters'),
+            $target = $(target),
+            $rows = $target.find('tbody #data');
 					$target.find('tbody .filterTable_no_results').remove();
 					if(search == '') {
 						$target.find('tbody #no-data').show();

+ 2 - 1
data/web/lang/lang.de.php

@@ -57,7 +57,7 @@ $lang['danger']['exit_code_not_null'] = 'Fehler: Exit-Code ist %d';
 $lang['danger']['mailbox_not_available'] = 'Mailbox nicht verfügbar';
 $lang['danger']['username_invalid'] = 'Benutzername kann nicht verwendet werden';
 $lang['danger']['password_mismatch'] = 'Passwort-Wiederholung stimmt nicht überein';
-$lang['danger']['password_complexity'] = 'Passwort entspricht nicht den Vorgaben (Klein- und Großschreibung und mindestens eine Ziffer, mindestens 6 Zeichen lang)';
+$lang['danger']['password_complexity'] = 'Passwort entspricht nicht den Richtlinien';
 $lang['danger']['password_empty'] = 'Passwort darf nicht leer sein';
 $lang['danger']['login_failed'] = 'Anmeldung fehlgeschlagen';
 $lang['danger']['mailbox_invalid'] = 'Mailboxname ist ungültig';
@@ -207,6 +207,7 @@ $lang['header']['logged_in_as_logout'] = 'Eingeloggt als <b>%s</b> (abmelden)';
 $lang['header']['logged_in_as_logout_dual'] = 'Eingeloggt als <b>%s <span class="text-info">[%s]</span></b>';
 $lang['header']['locale'] = 'Sprache';
 $lang['mailbox']['domain'] = 'Domain';
+$lang['mailbox']['spam_aliases'] = 'Temp. Alias';
 $lang['mailbox']['alias'] = 'Alias';
 $lang['mailbox']['aliases'] = 'Aliasse';
 $lang['mailbox']['multiple_bookings'] = 'Mehrfachbuchen';

+ 2 - 1
data/web/lang/lang.en.php

@@ -59,7 +59,7 @@ $lang['danger']['exit_code_not_null'] = "Error: Exit code was %d";
 $lang['danger']['mailbox_not_available'] = "Mailbox not available";
 $lang['danger']['username_invalid'] = "Username cannot be used";
 $lang['danger']['password_mismatch'] = "Confirmation password is not identical";
-$lang['danger']['password_complexity'] = "Password does not meet requirements (upper and lowercase letters and at least one number, min. 6 characters long)";
+$lang['danger']['password_complexity'] = "Password does not meet the policy";
 $lang['danger']['password_empty'] = "Password must not be empty";
 $lang['danger']['login_failed'] = "Login failed";
 $lang['danger']['mailbox_invalid'] = "Mailbox name is invalid";
@@ -209,6 +209,7 @@ $lang['header']['logged_in_as_logout'] = 'Logged in as <b>%s</b> (logout)';
 $lang['header']['logged_in_as_logout_dual'] = 'Logged in as <b>%s <span class="text-info">[%s]</span></b>';
 $lang['header']['locale'] = 'Language';
 $lang['mailbox']['domain'] = 'Domain';
+$lang['mailbox']['spam_aliases'] = 'Temp. alias';
 $lang['mailbox']['multiple_bookings'] = 'Multiple bookings';
 $lang['mailbox']['kind'] = 'Kind';
 $lang['mailbox']['description'] = 'Description';

+ 2 - 0
data/web/mailbox.php

@@ -137,6 +137,7 @@ $_SESSION['return_to'] = $_SERVER['REQUEST_URI'];
 							<th class="sort-table" style="min-width: 98px;"><?=$lang['mailbox']['fname'];?></th>
 							<th class="sort-table" style="min-width: 86px;"><?=$lang['mailbox']['domain'];?></th>
 							<th class="sort-table" style="min-width: 75px;"><?=$lang['mailbox']['quota'];?></th>
+							<th class="sort-table" style="min-width: 75px;"><?=$lang['mailbox']['spam_aliases'];?></th>
 							<th class="sort-table" style="min-width: 99px;"><?=$lang['mailbox']['in_use'];?></th>
 							<th class="sort-table" style="min-width: 100px;"><?=$lang['mailbox']['msg_num'];?></th>
 							<th class="sort-table" style="min-width: 76px;"><?=$lang['mailbox']['active'];?></th>
@@ -156,6 +157,7 @@ $_SESSION['return_to'] = $_SERVER['REQUEST_URI'];
 							<td><?=htmlspecialchars($mailboxdata['name'], ENT_QUOTES, 'UTF-8');?></td>
 							<td><?=htmlspecialchars($mailboxdata['domain']);?></td>
 							<td><?=formatBytes($mailboxdata['quota_used'], 2);?> / <?=formatBytes($mailboxdata['quota'], 2);?></td>
+							<td><?=$mailboxdata['spam_aliases'];?></td>
 							<td style="min-width:120px;">
 								<div class="progress">
 									<div class="progress-bar progress-bar-<?=$mailboxdata['percent_class'];?>" role="progressbar" aria-valuenow="<?=$mailboxdata['percent_in_use'];?>" aria-valuemin="0" aria-valuemax="100" style="min-width:2em;width: <?=$mailboxdata['percent_in_use'];?>%;">

+ 87 - 0
data/web/rc/.htaccess

@@ -0,0 +1,87 @@
+# WARNING: For PHP 7 the module name in the line below need to be modified!
+<IfModule mod_php5.c>
+php_flag    display_errors  Off
+php_flag    log_errors      On
+# php_value    error_log    logs/errors
+
+php_value   upload_max_filesize   5M
+php_value   post_max_size         6M
+php_value   memory_limit          64M
+
+php_flag    zlib.output_compression     Off
+php_flag    suhosin.session.encrypt     Off
+
+#php_value   session.cookie_path     /
+#php_value   session.hash_function   sha256
+php_flag    session.auto_start       Off
+php_value   session.gc_maxlifetime   21600
+php_value   session.gc_divisor       500
+php_value   session.gc_probability   1
+</IfModule>
+
+<IfModule mod_rewrite.c>
+Options +SymLinksIfOwnerMatch
+RewriteEngine On
+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|\.well-known\/|[a-zA-Z0-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
+RewriteRule /?(README\.md|composer\.json-dist|composer\.json|package\.xml|Dockerfile)$ - [F]
+</IfModule>
+
+<IfModule mod_deflate.c>
+SetOutputFilter DEFLATE
+</IfModule>
+
+<IfModule mod_expires.c>
+ExpiresActive On
+ExpiresDefault "access plus 1 month"
+</IfModule>
+
+FileETag MTime Size
+
+<IfModule mod_autoindex.c>
+Options -Indexes
+</ifModule>
+
+<IfModule mod_headers.c>
+# Disable page indexing
+Header set X-Robots-Tag "noindex, nofollow"
+
+# replace 'append' with 'merge' for Apache version 2.2.9 and later
+#Header append Cache-Control public env=!NO_CACHE
+
+# Optional security header
+# Only increased security if the browser support those features
+# Be careful! Testing is required! They should be adusted to your intallation / user environment
+
+# HSTS - HTTP Strict Transport Security
+#Header always set Strict-Transport-Security "max-age=31536000; preload" env=HTTPS
+
+# HPKP - HTTP Public Key Pinning
+# Only template - fill with your values
+#Header always set Public-Key-Pins "max-age=3600; report-uri=\"\"; pin-sha256=\"\"; pin-sha256=\"\"" env=HTTPS
+
+# X-Xss-Protection
+# This header is used to configure the built in reflective XSS protection found in Internet Explorer, Chrome and Safari (Webkit). 
+#Header set X-XSS-Protection "1; mode=block"
+
+# X-Frame-Options
+# The X-Frame-Options header (RFC), or XFO header, protects your visitors against clickjacking attacks
+# Already set by php code! Do not activate both options
+#Header set X-Frame-Options SAMEORIGIN
+
+# X-Content-Type-Options
+# It prevents Google Chrome and Internet Explorer from trying to mime-sniff the content-type of a response away from the one being declared by the server.
+#Header set X-Content-Type-Options: "nosniff"
+
+# CSP - Content Security Policy
+# for better privacy/security ask browsers to not set the Referer
+# more flags for script, stylesheets and images available, read RFC for more information
+#Header set Content-Security-Policy "referrer no-referrer"
+</IfModule>

+ 2413 - 0
data/web/rc/CHANGELOG

@@ -0,0 +1,2413 @@
+CHANGELOG Roundcube Webmail
+===========================
+
+RELEASE 1.3-beta
+----------------
+- Nicely handle contact deletion on contact edit (#5522)
+- vcard_attachments: Add possibility to attach contact vCard to composed message (#4997)
+- Preserve message internal/received date on import in mbox format (#5559)
+- Zipdownload: Fix date format in mbox "From line"
+- Possibility to display QR code for contacts data (#5030)
+- Added identicon plugin
+- Widescreen layout aka three column view (#5093)
+- Unify automatic marking as \Seen in preview pane, full-page and extwin views (#5071)
+- Disable double-click on the list when preview pane is on (#5199)
+- Support hostname and hostname:port in force_https option (#5511)
+- Support ALLOW-FROM in x_frame_options (#5122)
+- Allow to omit a subject when sending an email (#5068)
+- Warn about too many disclosed recipients in composed email [max_disclosed_recipients] (#5132)
+- identity_select: Support Received header (#5085)
+- Plugin API: Added get_compose_responses hook (#5457)
+- Display error when trying to upload more files than specified in max_file_uploads (#5483)
+- Add missing sql upgrade file for 'ip' column resize in session table (#5465)
+- Do not show inline images of unsupported mimetype (#5463)
+- Password: Added replacement variables support in password_pop_host (#5539)
+- Password: Don't store passwords in temp files when using dovecotpw (#5531)
+- Password: Added LDAP PPolicy driver (#5364)
+- Password: Added cpanel_webmail driver (#5549)
+- Password: Added possibility to nicely redirect from other plugins on password expiration (#5468)
+- Implement separate action to mark all messages in a folder as \Seen (#5006)
+- Implement marking as \Seen in all folders or in a folder and its subfolders (#5076)
+- Archive: Don't reload messages list when it's not needed (#5225)
+- Archive: Add option to automatically mark archived messages as \Seen (#5142)
+- Improve randomness of password salts and random hashes (#5266)
+- Password/cPanel: Add support for hash authentication and reseller accounts (#5252)
+- Support host-specific imap_conn_options/smtp_conn_options/managesieve_conn_options (#5136)
+- Center and scale images in attachment preview frame (#5421)
+- Added max_message_size option enforced when attaching files to a composed message (#4993)
+- Added Search button in quick search menus (#5312)
+- Implement "one click" attachment/messages/photo upload (#5024)
+- Squirrelmail_usercopy: Add option to define character set of data files
+- Removed useless 'created' column from 'session' table (#5389)
+- Dropped legacy browsers support (#5167)
+    - Removed legacy_browser plugin
+    - Removed hacks for IE < 10
+    - Update to jQuery 3.1.1 and jQuery-UI 1.12.0
+    - compile .min.js files with ECMASCRIPT5 option
+- Require PHP >= 5.4
+- Add possibility to preview and download attachments in mail compose (#5053)
+- Add possibility to rename attachments in mail compose (#4996)
+- Remove backward compatibility "layer" of bc.php (#4902)
+- Support WEBP images in mail messages (#5362)
+- Support MathML in HTML message preview (#5182)
+- Rename Addressbook to Contacts (#5233)
+- Remove PHP mail() support, smtp_server is required now (#5340)
+- Display full message subject in onmouseover on truncated subject in mail view (#5346)
+- Enigma: Support GnuPG 2.1 (#5313)
+- Enigma: Support key generation for multiple identities (#5383)
+- Enigma: Import keys from key-server(s) (#5286)
+- Enigma: Search missing public keys on a key-server in mail compose (#5286)
+- Enigma: Delete user keys when using deluser.sh script
+- Enigma: Fix redundant list-secret-keys/list-public-keys calls on signing/encryption
+- Enigma: Implement PGP encryption and signing in one go (#5302)
+- Enigma: Display signature verification status for encrypted+signed messages (#5302)
+- Display different attachment icon on encrypted messages
+- Display different confirmation text when moving messages to Trash (#5220)
+- Indicate that a collapsed thread has flagged children (#5013)
+- Implemented message/rfc822 attachment preview
+- Update to jsTimezoneDetect 1.0.6
+- Managesieve: Add (optional) RAW script editor (#5414)
+- Managesieve: Add option to automatically set vacation :from address (#5428)
+- Managesieve: Support 'string' test from variables extension [RFC 5229] (#5248)
+- Managesieve: Support 'duplicate' extension [RFC 7352]
+- Managesieve: Unhide advanced rule controls if there are inputs with errors
+- Managesieve: Display warning message when filter form contains errors
+- Control search engine crawlers via X-Robots-Tag header instead of <meta> and robots.txt (#5098)
+- Fixed redundancy in sql caching system and compatibility with Galera Cluster (#5439)
+    - Removed redundant 'created' column from cache and cache_shared tables
+    - Removed use of redundant data records
+    - Added missing primary keys (dictionary, cache, cache_shared tables)
+- Fix so templating system does not mess with external (e.g. email) content (#5499)
+- Fix redundant keep-alive/refresh after session error on compose page (#5500)
+- Managesieve: Fix handling of scripts with nested rules (#5540)
+- Fix variable substitution in ldap host for some use-cases, e.g. new_user_identity (#5544)
+- Enigma: Fix PHP fatal error when decrypting a message with invalid signature (#5555)
+- Fix adding images to new identity signatures
+- Fix rsync error handling in installto.sh script (#5562)
+- Fix some advanced search issues with multiple addressbooks (#5572)
+- Fix so group/addressbook selection is retained on page refresh
+
+RELEASE 1.2.3
+-------------
+- Searching in both contacts and groups when LDAP addressbook with group_filters option is used
+- Fix vulnerability in handling of mail()'s 5th argument
+- Fix To: header encoding in mail sent with mail() method (#5475)
+- Fix flickering of header topline in min-mode (#5426)
+- Fix bug where folders list would scroll to top when clicking on subscription checkbox (#5447)
+- Fix decoding of GB2312/GBK text when iconv is not installed (#5448)
+- Fix regression where creation of default folders wasn't functioning without prefix (#5460)
+- Enigma: Fix bug where last records on keys list were hidden (#5461)
+- Enigma: Fix key search with keyword containing non-ascii characters (#5459)
+- Fix bug where deleting folders with subfolders could fail in some cases (#5466)
+- Fix bug where IMAP password could be exposed via error message (#5472)
+- Fix bug where it wasn't possible to store more that 2MB objects in memcache/apc,
+  Added memcache_max_allowed_packet and apc_max_allowed_packet settings (#5452)
+- Fix "Illegal string offset" warning in rcube::log_bug() on PHP 7.1 (#5508)
+- Fix storing "empty" values in rcube_cache/rcube_cache_shared (#5519)
+- Fix missing content check when image resize fails on attachment thumbnail generation (#5485)
+- Fix displaying attached images with wrong Content-Type specified (#5527)
+
+RELEASE 1.2.2
+-------------
+- Enigma: Add possibility to configure gpg-agent binary location (enigma_pgp_agent)
+- Enigma: Fix signature verification with some IMAP servers, e.g. Gmail, DBMail (#5371)
+- Enigma: Make recipient key searches case-insensitive (#5434)
+- Fix regression in resizing JPEG images with Imagick (#5376)
+- Managesieve: Fix parsing of vacation date-time with non-default date_format (#5372)
+- Use SymLinksIfOwnerMatch in .htaccess instead of FollowSymLinks disabled on some hosts for security reasons (#5370)
+- Wash position:fixed style in HTML mail for better security (#5264)
+- Fix bug where memcache_debug didn't work for session operations
+- Fix bug where Message-ID domain part was tied to username instead of current identity (#5385)
+- Fix bug where blocked.gif couldn't be attached to reply/forward with insecure content
+- Fix E_DEPRECATED warning when using Auth_SASL::factory() (#5401)
+- Fix bug where names of downloaded files could be malformed when derived from the message subject (#5404)
+- Fix so "All" messages selection is resetted on search reset (#5413)
+- Fix bug where folder creation could fail if personal namespace contained more than one entry (#5403)
+- Fix error causing empty INBOX listing in Firefox when using an URL with user:password specified (#5400)
+- Fix PHP warning when handling shared namespace with empty prefix (#5420)
+- Fix so folders list is scrolled to the selected folder on page load (#5424)
+- Fix so when moving to Trash we make sure the folder exists (#5192)
+- Fix displaying size of attachments with zero size
+- Fix so "Action disabled" error uses more appropriate 404 code (#5440)
+
+RELEASE 1.2.1
+-------------
+- Update TinyMCE to version 4.3.13 (#5309)
+- Fix bug where errors could have been not logged when per_user_logging=true
+- Fix bug where message list columns could be in wrong order after column drag-n-drop and list sorting
+- Fix so minified publickey.js (with cache-buster) is used when available (#5254)
+- Fix (replace) application/x-tar file extension test as it might not exist in nginx config (#5253)
+- Fix PHP warning when password_hosts is set, but is not an array (#5260)
+- Fix redundant keep-alive requests when session_lifetime is greater than ~20000 (#5273)
+- Fix so subfolders of INBOX can be set as Archive (#5274)
+- Fix bug where multi-folder search could choose a wrong folder in "this and subfolders" scope (#5282)
+- Fix bug where multi-folder search didn't work for unsubscribed INBOX (#5259)
+- Fix bug where "no body" alert could be displayed when sending mailvelope email
+- Enigma: Fix keys import from inside of an encrypted message (#5285)
+- Enigma: Fix malformed signed messages with force_7bit=true (#5292)
+- Enigma: Add possibility to configure gpg binary location (enigma_pgp_binary)
+- Enigma: Add possibility to export private keys (#5321)
+- Fix searching by email address in contacts with multiple addresses (#5291)
+- Fix handling of --delete argument in moduserprefs.sh script (#5296)
+- Workaround PHP issue by calling closelog() on script shutdown when using log_driver=syslog (#5289)
+- Fix so upgrade script makes sure program/lib directory does not contain old libraries (#5287)
+- Fix subscription checkbox state on error in folder subscribe/unsubscribe action (#5243)
+- Fix bug where microsecond format in logged date didn't work in some cases
+- Fix conflict in new_user_dialog and password_force_new_user settings (#5275)
+- Don't create multipart/alternative messages with empty text/plain part (#5283)
+- Use contact_search_name format in popup on results in compose contacts search
+- Fix handling of 'mailto' and 'error' arguments in message_before_send hook (#5347)
+- Fix missing localization of HTML editor when assets_dir != INSTALL_PATH
+- Fix handling of blockquote tags with mixed case on html2text conversion (#5363)
+- Fix javascript errors in IE on page with iframe that points to another domain
+
+RELEASE 1.2.0
+-------------
+- Enigma: Added enigma_debug option
+- Fix message list multi-select/deselect issue (#5219)
+- Fix bug where getting HTML editor content could steal focus from other form controls (#5223)
+- Fix bug where contact search menu fields where always unchecked in Larry skin
+- Fix autoloading of 'html' class
+- Fix bug where Encrypt button appears when switching editor to HTML (#5235)
+- Fix XSS issue in href attribute on area tag (#5240)
+
+RELEASE 1.2-rc
+--------------
+- Managesieve: Refactored script parser to be 100x faster
+- Enigma: added option to force users to use signing/encryption
+- Enigma: Added option to attach public keys to sent mail (#5152)
+- Enigma: Handle messages with text before an encrypted block (#5149)
+- Enigma: Handle encrypted/signed content inside message/rfc822 attachments
+- Enigma: Fix missing html/plain switch on multipart/signed messages (#4963)
+- Enigma: Disable format=flowed for signed plain text messages (#4960)
+- Enigma: Fix handling of encrypted + signed messages (#4950)
+- Enigma: Fix invalid boundary use in signed messages structure
+- Enable use of TLSv1.1 and TLSv1.2 for IMAP (#4955)
+- Save copy of original .htaccess file when using installto.sh script (#4947)
+- Fix regression where some message attachments could be missing on edit/forward (#4939)
+- Fix regression in displaying contents of message/rfc822 parts (#4937)
+- Fix handling of message/rfc822 attachments on replies and forwards (#4938)
+- Fix PDF support detection in Firefox > 19 (#4941)
+- Fix path traversal vulnerability in setting a skin [CVE-2015-8770] (#4945)
+- Fix so drag-n-drop of text (e.g. recipient addresses) on compose page actually works (#4944)
+- Fix .htaccess rewrite rules to not block .well-known URIs (#4943)
+- Fix mail view scaling on iOS (#4915)
+- Fix PHP7 warning "session_start(): Session callback expects true/false return value" (#4948)
+- Fix XSS issue in SVG images handling [CVE-2015-8864, CVE-2016-4068] (#4949)
+- Fix missing language name in "Add to Dictionary" request in HTML mode (#4951)
+- Fix (again) security issue in DBMail driver of password plugin [CVE-2015-2181] (#4958)
+- Fix bug where Archive/Junk buttons were not active after page jump with select=all mode (#4961)
+- Fix bug in long recipients list parsing for cases where recipient name contained @-char (#4964)
+- Plugin API: Added addressbook_export hook
+- Fix additional_message_headers plugin compatibility with Mail_Mime >= 1.9 (#4966)
+- Hide DSN option in Preferences when smtp_server is not used (#4967)
+- Fix handling of body parameter in mail compose request
+- Protect download urls against CSRF using unique request tokens [CVE-2016-4069] (#4957)
+- newmail_notifier: Refactor desktop notifications
+- Fix so contactlist_fields option can be set via config file
+- Fix so SPECIAL-USE assignments are forced only until user sets special folders (#4782)
+- Fix performance in reverting order of THREAD result
+- Fix converting mail addresses with @www. into mailto links (#5197)
+
+RELEASE 1.2-beta
+----------------
+- Update TinyMCE to version 4.2
+- Added support for Redis session handler
+- Removed some deprecated methods: https://github.com/roundcube/roundcubemail/commit/454b0b1c
+- Remove backward compatibility "layer" of bc.php (#4902)
+- Add possibility to define date format in write operations for ldap attributes (#3956)
+- Display attachment size in compose (#1329)
+- Added possibility to drag-n-drop attachments from mail preview to compose window
+- Implemented mail messages searching with predefined date interval
+- PGP encryption support via Mailvelope integration
+- PGP encryption support via Enigma plugin
+- PHP7 compatibility fixes (#4836)
+- Security: Added brute-force attack prevention via login rate limit (#4922)
+- Security: Added options to validate username/password on logon (#4884)
+- Security: Improve randomness of security tokens (#4899)
+- Security: Use random security tokens instead of hashes based on encryption key (#4829)
+- Security: Improved encrypt/decrypt methods with option to choose the cipher_method (#4492)
+- Make optional adding of standard signature separator - sig_separator (#3276)
+- Optimize folder_size() on Cyrus IMAP by using special folder annotation (#4894)
+- Make optional hidding of folders with name starting with a dot - imap_skip_hidden_folders (#4870)
+- Add option to enable HTML editor always, except when replying to plain text messages (#4352)
+- Emoticons: Added option to switch on/off emoticons in compose editor (#2076)
+- Emoticons: Added option to switch on/off emoticons in plain text messages
+- Emoticons: All emoticons-related functionality is handled by the plugin now
+- Installer: Add button to save generated config file in system temp directory (#3553)
+- Remove common subject prefixes Re:, Re[x]:, Re-x: on reply (#4882)
+- Added GSSAPI/Kerberos authentication plugin - krb_authentication
+- Password: Allow temporarily disabling the plugin functionality with a notice
+- Require Mbstring and OpenSSL extensions (#5166)
+- Add --config and --type options to moduserprefs.sh script (#4651)
+- Implemented memcache_debug and apc_debug options
+- Installer: Remove system() function use (#4695)
+- Password plugin: Added 'kpasswd' driver by Peter Allgeyer
+- Add initdb.sh to create database from initial.sql script with prefix support (#4722)
+- Plugin API: Added disabled_plugins an disabled_buttons options in html_editor hook
+- Plugin API: Added html2text hook
+- Plugin API: Added message_part_body hook
+- Plugin API: Added message_ready hook
+- Plugin API: Add special onload() method to execute plugin actions before startup (session and GUI initialization)
+- Implemented UI element to jump to specified page of the messages list (#1677)
+- Fix searching of contacts to allow remote images for known senders (#4886)
+- Fix bug where clicking date column with 'arrival' sorting would switch to sorting by 'date' (#4690)
+- Fix bug where message content could overlap attachments list in Larry skin (#4876)
+- Fix so microseconds macro (u) in log_date_format works (#4855)
+- Fix so unrecognized TNEF attachments are displayed on the list of attachments (#5138)
+- Fix so database_attachments::cleanup() does not remove attachments from other sessions (#4907)
+- Fix responses list update issue after response name change (#4917)
+- Fix bug where message preview was unintentionally reset on check-recent action (#4921)
+- Fix bug where HTML messages with invalid/excessive css styles couldn't be displayed (#4905)
+- Fix redundant blank lines when using HTML and top posting (#4927)
+- Fix redundant blank lines on start of text after html to text conversion (#4928)
+- Fix HTML sanitizer to skip <!-- node type X --> in output (#4932)
+- Fix invalid LDAP query in ACL user autocompletion (#4934)
+
+RELEASE 1.1.3
+-------------
+- Fix closing of nested menus (#4854)
+- Fix so E_DEPRECATED errors from PEAR libs are ignored by error_reporting change (#4770)
+- Fix compatibility with PHP 5.3 in rcube_ldap class (#4842)
+- Get rid of Mail_mimeDecode package dependency (#4836)
+- Fix "Importing..." message does not hide on error (#4840)
+- Fix Compose action in addressbook for results from multiple addressbooks (#4834)
+- Fix bug where some messages in multi-folder search couldn't be viewed/printed/downloaded (#4843)
+- Fix unintentional messages list page change on page switch in compose addressbook (#4844)
+- Fix race-condition in saving user preferences and loading plugin config (#4845)
+- Fix so plain text signature field uses monospace font (#4848)
+- Fix so links with href == content aren't added to links list on html to text conversion (#4847)
+- Fix handling of non-break spaces in html to text conversion (#4849)
+- Fix self-reply detection issues (#4852)
+- Fix multi-folder search result sorting by arrival date (#4858)
+- Fix so *-request@ addresses in Sender: header are also ignored on reply-all (#4860)
+- Update to TinyMCE 4.1.10 (#5164)
+- Fix draft removal after a message is sent and storing sent message is disabled (#4869)
+- Fix so imap folder attribute comparisons are case-insensitive (#4868)
+- Fix bug where new messages weren't added to the list in search mode
+- Fix wrong positioning of message list header on page scroll in Webkit browsers (#4646)
+- Fix some javascript errors in rare situations (#4853)
+- Fix error when using back button after sending an email (#4628)
+- Fix removing signature when switching to identity with an empty sig in HTML mode (#4872)
+- Disable links list generation on html-to-text conversion of identities or composed message (#4850)
+- Fix "washing" of style elements wrapped into many lines
+- Fix so input field (e.g. search box) does not loose focus on list load (#4862)
+- Fix so css of one html part does not apply to other text parts on message display (#4887)
+- Fix XSS issue in drag-n-drop file uploads [CVE-2015-8105] (#4900)
+- Fix handling of plus character in mailto: links (#4891)
+- Fix so adding CC/BCC recipients from the sidebar unhides compose form fields in Classic skin (#4874)
+- Fix so gc.sh script removes also expired sessions from sql database (#4893)
+- Fix support for Mozilla-based browsers, e.g. Pale Moon (#4895)
+- Fix various issues with Turkish (and similar) locales (#4896)
+- Fix so In-Reply-To header is set also for MDN receipts (#4897)
+- Fix missing HTTP_X_FORWARDED_FOR address in generated Received header
+- Fix issue where Content-Length of some attachments could be set to wrong value causing browser errors (#4877)
+
+RELEASE 1.1.2
+-------------
+- Add new plugin hook 'identity_create_after' providing the ID of the inserted identity (#4807)
+- Add option to place signature at bottom of the quoted text even in top-posting mode [sig_below]
+- Fix handling of %-encoded entities in mailto: URLs (#4799)
+- Fix zipped messages downloads after selecting all messages in a folder (#4797)
+- Fix vpopmaild driver of password plugin
+- Fix PHP warning: Non-static method PEAR::setErrorHandling() should not be called statically (#4798)
+- Fix tables listing routine on mysql and postgres so it skips system or other database tables and views (#4796)
+- Fix message list header in classic skin on window resize in Internet Explorer (#4732)
+- Fix so text/calendar parts are listed as attachments even if not marked as such (#4795)
+- Fix lack of signature separator for plain text signatures in html mode (#4802)
+- Fix font artifact in Google Chrome on Windows (#4803)
+- Fix bug where forced extwin page reload could exit from the extwin mode (#4801)
+- Fix bug where some unrelated attachments in multipart/related message were not listed (#4805)
+- Fix mouseup event handling when dragging a list record (#4808)
+- Fix bug where preview_pane setting wasn't always saved into user preferences (#4809)
+- Fix bug where messages count was not updated after message move/delete with skip_deleted=false (#4814)
+- Fix security issue in contact photo handling (#4817)
+- Fix possible memcache/apc cache data consistency issues (#4820)
+- Fix bug where imap_conn_options were ignored in IMAP connection test (#4822)
+- Fix bug where some files could have "executable" extension when stored in temp folder (#4815)
+- Fix attached file path unsetting in database_attachments plugin (#4823)
+- Fix issues when using moduserprefs.sh without --user argument (#4825)
+- Fix potential info disclosure issue by protecting directory access (#4816)
+- Fix blank image in html_signature when saving identity changes (#4833)
+- Installer: Use openssl_random_pseudo_bytes() (if available) to generate des_key (#4827)
+- Fix XSS vulnerability in _mbox argument handling (#4837)
+
+RELEASE 1.1.1
+-------------
+- ACL: Allow other plugins to adjust the list of permissions and groups to edit
+- Add possibility to print contact information (of a single contact)
+- Add possibility to configure max_allowed_packet value for all database engines (#4772)
+- Improved handling of storage errors after message is sent
+- Update to TinyMCE 4.1.9
+- Unified request* event arguments handling, added support for _unlock and _action parameters
+- Security: Generate random hash for the per-user local storage prefix (#4768)
+- Fix refreshing of drafts list when sending a message which was saved in meantime (#4745)
+- Fix saving/sending emoticon images when assets_dir is set
+- Fix PHP fatal error when visiting Vacation interface and there's no sieve script yet (#4778)
+- Fix setting max packet size for DB caches and check packet size also in shared cache
+- Fix needless security warning on BMP attachments display (#4771)
+- Fix handling of some improper constructs in format=flowed text as per the RFC3676[4.5] (#4773)
+- Fix performance of rcube_db_mysql::get_variable()
+- Fix missing or not up-to-date CATEGORIES entry in vCard export (#4766)
+- Fix fatal errors on systems without mbstring extension or mb_regex_encoding() function (#4769)
+- Fix cursor position on reply below the quote in HTML mode (#4759)
+- Fix so "over quota" errors are displayed also in message compose page
+- Fix duplicate entries supression in autocomplete result (#4776)
+- Fix "Non-static method PEAR::isError() should not be called statically" errors (#4770)
+- Fix parsing invalid HTML messages with BOM after <!DOCTYPE> (#4777)
+- Fix duplicate entry on timezones list in rcube_config::timezone_name_from_abbr() (#4779)
+- Fix so localized folder name is displayed in multi-folder search result (#4750)
+- Fix javascript error after creating a folder which is a subfolder of another one (#4781)
+- Fix bug where subject of sent/saved message was removed if mbstring wasn't installed (#4780)
+- Fix missing vcard_attachment icon on messages list (#4783)
+- Fix storing signatures with big images in MySQL database (#4785)
+- Fix Opera browser detection in javascript (#4786)
+- Fix so search filter, scope and fields are reset on folder change
+- Fix rows count when messages search fails (#4760)
+- Fix bug where spellchecking in HTML editor do not work after switching editor type more than once (#4789)
+- Fix bug where TinyMCE area height was too small on slow network connection (#4788)
+- Fix backtick character handling in sql queries (#4790)
+- Fix redirect URL for attachments loaded in an iframe when behind a proxy (#4724)
+- Fix menu container references to point to the actual <ul> element (#4791)
+- Fix javascripts errors in IE8 - lack of Event.which, focusing a hidden element (#4793)
+
+RELEASE 1.1.0
+-------------
+- Make SMTP error log more verbose - include server response and error code
+- Fix download options menu (added by zipdownload plugin) in classic skin (#4740)
+- Fix blocked.gif image usage with assets_dir set
+- Fix bug where max_group_members was ignored when adding a new contact (#4733)
+- Hide MDN and DSN options in compose if disabled by admin (#4735)
+- Fix checks based on window.ActiveXObject in IE > 10
+- Fix XSS issue in style attribute handling [CVE-2015-1433] (#4739)
+- Fix bug where Drafts list wasn't updated on draft-save action in new window (#4737)
+- Fix so "set as default" option is hidden if identities_level > 1 (#4738)
+- Fix bug where search was reset after returning from compose visited for reply
+- Fix javascript error in "IE 8.0/Tablet PC" browser (#4730)
+- Fix bug where Reply-To address was ignored on reply to messages sent by self (#4742)
+- Fix bug where empty fieldmap config entries caused empty results of ldap search (#4741)
+- Fix bug where drafts list wasn't refreshed after draft message was sent from another window (#4745)
+- Fix keyboard navigation and css in datepicker widget across many Firefox versions
+- Fix false warning when opening attached text/plain files (#4748)
+- Fix bug where signature could have been inserted twice after plain-to-html switch (#4746)
+- Fix security issue in DBMail driver of password plugin (#4757)
+- Enable FollowSymLinks option in .htaccess file which is required by rewrite rules (#4754)
+- Fix so JSON.parse() errors on localStorage items are ignored (#4752)
+
+RELEASE 1.1-rc
+--------------
+- Update jQuery to version 2.1.3
+- Allow to override any config option through env variables
+- Improve system security by using optional special URL with security token - use_secure_urls
+- Allow to define separate server/path for image/js/css files - assets_url/assets_dir
+- Sync vendor folder if exists in source package (#4700)
+- Avoid useless reloading list when resetting search with active filter (#4654)
+- Fix invalid folder selection if clicked while busy (#4709)
+- Fix import of multiple contact email addresses from Outlook-csv format (#4714)
+- Fix drag-n-drop to folders expanded while dragging (#4708)
+- Fix import of multiple contact groups from Google-csv format (#4710)
+- Fix import of contacts with multiple email addresses from Google-csv format (#4719)
+- Fix bugs where CSRF attacks were still possible on some requests [CVE-2014-9587]
+- Fix some rcube_utils::anytodatetime() corner cases with timezone mismatches (#4712)
+- Improve move-to and contact-export button in classic skin (#4713)
+- Fix wrong icon for download button in classic skin
+- Fix bug where sent message was saved in Sent folder even if disabled by user (#4729)
+
+RELEASE 1.1-beta
+----------------
+- Fix skin path handling in plugin context (#4111)
+- Prevent memory exhaustion on image resizing with GD on Windows (#4580)
+- Add plugin hook for database table name lookups as requested in #4538
+- Added Oracle database support
+- Support contacts import in GMail CSV format
+- Added namespace filter in Folder Manager
+- Added folder searching in Folder Manager
+- Fix restoring draft messages from localStorage if editor mode differs (#4631)
+- Added config option/user preference to disable saving messages in localStorage (#4606)
+- Added config option 'imap_log_session' to enable Roundcube <-> IMAP session ID logging
+- Added config option 'log_session_id' to control the lengh of the session identifer in logs
+- Implemented 'storage_connected' API hook after successful IMAP login (#4638)
+- Intergrate Net_LDAP3 and rcube_ldap_generic classes
+- Add option (disabled_actions) to disable UI elements/actions (#4478)
+- Support password encryption using openssl extension (#4614)
+- Create/rename groups in UI dialogs (#4592)
+- Added 'contact_search_name' option to define autocompletion entry format
+- Display quota information for current folder not INBOX only (#3442)
+- Support images in HTML signatures (#3917)
+- Display full quota information in popup (#2103, #2746)
+- Mail compose: Selecting contact inserts recipient to previously focused input - to/cc/bcc accordingly (#4487)
+- Close "no subject" prompt with Enter key (#4463)
+- Password: Add option to force new users to change their password (#2963)
+- Improve support for screen readers and assistive technology using WCAG 2.0 and WAI ARIA standards
+- Enable basic keyboard navigation throughout the UI (#3333)
+- Select/scroll to previously selected message when returning from message page (#4146)
+- Display a warning if popup window was blocked (#4472)
+- Remove (was: ...) from message subject on reply (#4359)
+- Update to TinyMCE 4.1 (#4168)
+- Enable autolink plugin in TinyMCE (#4029)
+- Support image operations with Imagick extension (#4498)
+- Support upload progress with session.upload_progress and PECL uploadprogress module (#3934)
+- Make identity name field optional (#4435)
+- Utility script to remove user records from the local database
+- Plugin API: Added message_saved hook (#4503)
+- Plugin API: Added imap_search_before hook
+- Support messages import from zip archives
+- Zipdownload: Added mbox format support (#2354)
+- Drop support for IE6, move IE7/IE8 support to legacy_browser plugin
+- Update to jQuery-2.1.1
+- Search across multiple folders (#1676)
+- Improve UI integration of ACL settings
+- Drop support for PHP < 5.3.7
+- Set In-Reply-To and References for forwarded messages (#4465)
+- Removed redundant default_folders config option (#4500)
+- Implemented IMAP SPECIAL-USE extension support [RFC6154] (#3326)
+- Optimize some framed pages content for better performance (#4517)
+- Improve text messages display and conversion to HTML (#4091)
+- Don't remove links when html signature is converted to text (#4473)
+- Fix page title when using search filter (#4636)
+- Fix mbox files import
+- Fix some character sets detection (#4694)
+- Fix so attachment charset is set in headers of forward/draft message (#4676)
+- Fix bug where wrong charset could be used for text attachment preview page (#4674)
+
+RELEASE 1.0.5
+-------------
+- Fix wrong icon for download button in classic skin
+- Fix checks based on window.ActiveXObject in IE > 10
+- Fix XSS issue in style attribute handling (#4739)
+- Fix bug where Drafts list wasn't updated on draft-save action in new window (#4737)
+- Fix so "set as default" option is hidden if identities_level > 1 (#4738)
+- Fix javascript error in "IE 8.0/Tablet PC" browser (#4730)
+- Fix bug where empty fieldmap config entries caused empty results of ldap search (#4741)
+- Fix bug where sent message was saved in Sent folder even if disabled by user (#4729)
+
+RELEASE 1.0.4
+-------------
+- Disable TinyMCE contextmenu plugin as there are more cons than pros in using it (#4684)
+- Fix bug where show_real_foldernames setting wasn't honored on compose page (#4705)
+- Fix issue where Archive folder wasn't protected in Folder Manager (#4706)
+- Fix compatibility with PHP 5.2. in rcube_imap_generic (#4682)
+- Fix setting flags on servers with no PERMANENTFLAGS response (#4667)
+- Fix regression in SHAA password generation in ldap driver of password plugin (#4670)
+- Fix displaying of HTML messages with absolutely positioned elements in Larry skin (#4672)
+- Fix font style display issue in HTML messages with styled <span> elements (#4671)
+- Fix download of attachments that are part of TNEF message (#4668)
+- Fix handling of uuencoded messages if messages_cache is enabled (#4675)
+- Fix handling of base64-encoded attachments with extra spaces (#4678)
+- Fix handling of UNKNOWN-CTE response, try do decode content client-side (#4650)
+- Fix bug where creating subfolders in shared folders wasn't possible without ACL extension (#4680)
+- Fix reply scrolling issue with text mode and start message below the quote (#4681)
+- Fix possible issues in skin/skin_path config handling (#4689)
+- Fix lack of delimiter for recipient addresses in smtp_log (#4703)
+- Fix generation of Blowfish-based password hashes (#4721)
+- Fix bugs where CSRF attacks were still possible on some requests [CVE-2014-9587]
+
+RELEASE 1.0.3
+-------------
+- Initialize HTML editor before restoring a message from localStorage (#4631)
+- Add 'sig_max_lines' config option to default config file (#5162)
+- Add config option to specify IMAP connection socket parameters - imap_conn_options (#4589)
+- Add option to set default message list mode - default_list_mode (#3157)
+- Enable contextmenu plugin for TinyMCE editor (#3062)
+- Fix insert-signature command in external compose window if opened from inline compose screen (#4663)
+- Fix some mime-type to extension mapping checks in Installer (#4610)
+- Fix errors when using localStorage in Safari's private browsing mode (#4619)
+- Fix bug where $Forwarded flag was being set even if server didn't support it (#4621)
+- Fix various iCloud vCard issues, added fallback for external photos (#4617)
+- Fix invalid Content-Type header when send_format_flowed=false (#4616)
+- Fix errors when adding/updating contacts in active search (#4630)
+- Fix incorrect thumbnail rotation with GD and exif orientation data (#4641)
+- Fix contacts list update after adding/deleting/moving a contact (#4640, #4644)
+- Fix handling of email addresses with quoted domain part (#4647)
+- Fix comm_path update on task switch (#4648)
+- Fix error in MSSQL update script 2013061000.sql (#4658)
+- Fix validation of email addresses with IDNA domains (#4661)
+
+RELEASE 1.0.2
+-------------
+- Fix storing unsaved drafts in localStorage (#4529)
+- Add configurable LDAP_OPT_DEREF option (#4546)
+- Fix so when switching editor mode original version of signature is used (#4032)
+- Fix unintentional draft autosave request if autosave is disabled (#4550)
+- Fix malformed References: header in send/saved mail (#4552)
+- Fix handling unicode characters in links (#4555)
+- Fix incorrect handling of HTML comments in messages sanitization code (#4558)
+- Fix so current page is reset on list-mode change (#4561)
+- Fix so responses menu hides on click in classic skin (#4566)
+- Fix unintentional line-height style modification in HTML messages (#4567)
+- Fix broken normalize_string(), add support for ISO-8859-2 (#4568)
+- Support csv contacts import in German localization (#4570)
+- Fix so message list and counters are updated when a message is opened in new window (#4569)
+- Fix malformed recipient name when composing a message by clicking on mailto link (#4583)
+- Fix list reload after sending message in another window (#4576)
+- Fix so address format errors are ignored when saving a draft (#4594)
+- Fix incorrect label translation in return receipt (#4598)
+- Fix security issue in delete-response action - allow only ajax request
+- Fix Delete button state after deleting identity/response (#4603)
+- Fix bug where contacts with no email address were listed on compose addressbook (#4602)
+- Fix images import from various vCard formats (#4604)
+- Fix sorting messages by size on servers without SORT capability (#4608)
+
+RELEASE 1.0.1
+-------------
+- Support 'error' and 'body_file' return attribs in 'message_before_send' hook (#4467)
+- Apply user-specific replacements to group's base_dn property (#4512)
+- Fix missing email address when importing contacts from outlook csv (#4535)
+- Fix bug where "With attachment" option in search filter wasn't selected after return from mail view (#4508)
+- Fix "washing" of unicoded style attributes (#4510)
+- Fix unintentional redirect from compose page in Webkit browsers (#4516)
+- Fix messages index cache update under some conditions (e.g. proxy) (#4505)
+- Fix lack of translation of special folders in some configurations (#4520)
+- Fix XSS issue in plain text spellchecker (#4524)
+- Fix invalid page title for some folders (1489804)
+- Fix redundant alert message on over-size uploads (#4528)
+- Fix next message display after removing a message (#4521)
+- Fix missing Mail-Followup-To header in sent mail (#4534)
+- Fix error when spell-checking an empty text (#4536)
+- Avoid popupmenus being closed when scrollbar is clicked (#4537)
+- Add proxy_whitelist configuration option (#4496)
+- Fix identities_level=4 handling in new_user_dialog plugin (#4540)
+- Fix various db_prefix issues (#4539)
+- Fix too small length of users.preferences column data type on MySQL
+- Fix redundant warning when switching from html to text in empty editor (#4530)
+- Fix invalid host validation on login (#4541)
+- Fix IMAP connection test in installer so it is aware of imap_auth_type (#4502)
+
+RELEASE 1.0.0
+-------------
+- Added toolbar button to move message in message view
+- Fix style of disabled protocol handler link on IE (#4460)
+- Fix message import dialog when no file is selected (#4488)
+- Fix opening compose screen in new window after saving as draft (#4479)
+- Fix directories check in Installer on Windows (#4462)
+- Fix issue when default_addressbook option is set to integer value (#4379)
+- Fix Opera > 15 detection (#4455)
+- Fix security issue in DomainFactory driver of Password plugin
+- Fix invalid X-Draft-Info on forwarded message draft (#4464)
+- Fix regression in handling of 'attachments' result in message_compose hook (#4474)
+- Fix issue where msgexport.sh printed the message to STDOUT instead of a file (#4476)
+- Fix fatal error in database_attachments plugin under some conditions (#4495)
+
+RELEASE 1.0-rc
+--------------
+- Small CSS fix with message notice boxes in Larry skin (#4429)
+- Include groups in contacts search on mail compose (#4186)
+- Add mime-type mapping for .7z files (#4436)
+- Invoke update scripts with php to circumvent execution restrictions (#4330)
+- Fix drag & drop message/contact moving on touch device (#4395)
+- Fix canned responses in HTML mode (#4446)
+- Check/create default folders on every login not only the first (#4391)
+- Update to jQuery-1.11.0 and jQuery-UI-1.9.2
+- Support SMTP socket context options via new config option 'smtp_conn_options'
+- Fix compatibility with PHP 5.2 in html.php file (#4438)
+- Remove expand/collapse with plus/minus keys (on numeric keypad) (#4437)
+- Fix issue where filesystem path was added to all-attachments (zip) file (#4433)
+- Fix case-sensitivity of email addresses handling on compose (#1899)
+- Don't alter Message-ID of a draft when sending (#4381)
+- Fix issue where deprecated syntax for HTML lists was not handled properly (#3975)
+- Display different icons when Trash folder is empty or full (#2108)
+- Remember last position of more headers switch (#3660)
+- Fix so message flags modified by another client are applied on the list on refresh (#1639)
+- Fix broken text/* attachments when forwarding/editing a message (#4393)
+- Improved minified files handling, added css minification (#3041)
+- Fix handling of X-Forwarded-For header with multiple addresses (#4424)
+- Fix border issue on folders list in classic skin (#4419)
+- Implemented menu actions to copy/move messages, added folder-selector widget (#863)
+- Fix security rules in .htaccess preventing access to base URL without the ending slash (#4422)
+- Fix regression where only first new folder was placed in correct place on the list (#4418)
+- Fix issue where children of selected and collapsed thread were skipped on various actions (#4410)
+- Fix issue where groups were not deleted when "Replace entire addressbook" option on contacts import was used (#4388)
+- Fix unreliable mimetype tests in Installer (#4408)
+- Fix performance of listing writeable folders (#4406)
+
+RELEASE 1.0-beta
+----------------
+- Fix handling of invalid closing tags in HTML messages (#4403)
+- Set real content-type for file downloads (#4400)
+- Update TinyMCE to version 3.5.10 (#4401)
+- Fix keyboard navigation in list widgets (#4367)
+- Allow plugins to grab the reference of opened windows (#4383)
+- Larry skin: Improved status message display for better visibility (#4115)
+- Fix Internet Explorer 11 detection (#4397)
+- Fix date column width to fit the widest possible date format (#4354)
+- Move certain user preference options to a collapsed "advanced" block (#4015)
+- Add file type icons for Powerpoint and Open Office presentations (#4269)
+- Fix operations on folders with trailing spaces in name (#4387)
+- Improve identity selection based on From: header (#4360)
+- Fix issue where mails with inline images of the same name contained only the first image multiple times (#4378)
+- Use left/right arrow keys to collapse/expand thread and spacebar to select a row, change Ctrl key behavior (#4367)
+- Fix an issue where using arrow keys to go up a list can result in selected message being under headers (#4375)
+- Fix an issue where Home/End keys don't focus list row properly, don't scrollTo properly (#4370)
+- Add an option to disable smart Reply-List behaviour - reply_all_mode (#3953)
+- Fix an issue where pressing minus key on contacts list was hiding list records (#4368)
+- Fix an issue where shift + arrow-up key wasn't selecting all messages in collapsed thread (#4371)
+- Added icon for priority column in messages list header (#4275)
+- New feature "Canned Responses" to save and recall boilerplate text snippets
+- Fix HTML part detection when encapsulated inside multipart/signed (#4357)
+- Add spellchecker backend for the After the Deadline service
+- Replace markdown-style [1] link indexes in plain text email bodies
+- Improved mailto: link arguments handling (#4351)
+- Use DOMDocument LIBXML_PARSEHUGE and LIBXML_COMPACT options if possible (#4316)
+- Support HTTP_HOST, SERVER_NAME and SERVER_ADDR values in include_host_config feature
+- Make default font size for HTML messages configurable (request #118)
+- Fix XSS issue in addressbook group name field [CVE-2013-5646] (#4337)
+- After message is sent refresh messages list of replied message folder (#4282)
+- Add option force specified domain in user login - username_domain_forced (#4290)
+- Add option to import Vcards with group assignments
+- Save groups membership in Vcard export (#3801)
+- Workaround broken PHP function timezone_name_from_abbr (#4289)
+- Make cached message size limit configurable - messages_cache_threshold (#4326)
+- Log also failed logins to userlogins log
+- Add temp_dir_ttl configuration option (#4318)
+- Allow setting INBOX as Sent folder (#4264)
+- Fix replacement variables in user-specific base_dn in some LDAP requests (#4299)
+- Fix image scaling issues when image has only one dimension smaller than the limit (#4296)
+- Fix issue where uploaded photo was lost when contact form did not validate (#4296)
+- Move identity selection based on non-standard headers into (new) identity_select plugin (#3835)
+- Fix downloading binary files with (wrong) text/* content-type (#4292)
+- Respect HTTP_X_FORWARDED_FOR and HTTP_X_REAL_IP variables for session IP check
+- Simplified configuration by merging it into one file + defaults (#3156)
+- Make message list header stay on top when scrolling (#353)
+- Add support for 'enchant' spellcheck engine
+- Check filetype detection in installer and update script (#4252)
+- Fix folder names truncation in Classic skin (#4265)
+- Make possible to disable some (broken) IMAP extensions with imap_disable_caps option (#4245)
+- Contacts drag-n-drop default action is to move contacts (#3962)
+- Added possibility to choose to move or copy contacts from drag-n-drop menu (#3962)
+- Fix Close link and remove About link on error pages (#4201)
+- Improved/unified attachment preview screen, added print button
+- Fix lack of space between searchfiler and quicksearchbar in Larry skin (#4233)
+- Cache LDAP's user_specific search and use vlv for better performance (#4247)
+- LDAP: auto-detect and use VLV indices for all search operations
+- LDAP: additional group configuration options for  address books
+- LDAP: separated address book implementation from a generic LDAP wrapper class
+- Allow address books to browse a multi-level group hierarchy in the contacts list
+- Fix session issues when local and database time differs (#2401)
+- Fix thread cache syncronization/validation (#4150)
+- Added feature to import messages to the currently selected folder
+- Add option show_real_foldernames to disable localization of special folders
+- Fix database cache expunge issues (#4229)
+- Fix date format issues on MS SQL Server (#4078)
+- Add imap_cache_ttl option to configure TTL of imap_cache
+- Make LDAP cache engine configurable via ldap_cache and ldap_cache_ttl options
+- Fix "duplicate entry" errors on inserts to imap cache tables (#4228)
+- Improved handling of Reply-To/Bcc addresses of identity in compose form (#4142)
+- Added user preference to open all popups as standard windows
+- Implemented shared cache (rcube_cache_shared)
+- Change Reply-All button label/title when mailing list is detected (#4092)
+- Fix SMTP connection using IPv6 address in smtp_server option (#4147)
+- Added attachment_reminder plugin
+- Make PHP code eval() free, use create_function()
+- Add option to display email address together with a name in mail preview (#3952)
+- Support CSV import from Atmail (#4161)
+- Add db_prefix configuration option in place of db_table_*/db_sequence_* options
+- Make possible to use db_prefix for schema initialization in Installer (#4175)
+- Fix updatedb.sh script so it recognizes also table prefix for external DDL files
+- Fix parsing invalid date string (#4155)
+- Add "with attachment" option to messages list filter (#1795)
+- Call resize handler in intervals to prevent lags and double onresize calls in Chrome (#4137)
+- Add rel="noreferrer" for links in displayed messages (#4976)
+- Add ability to toggle between HTML and text while viewing a message (#3005)
+- Remove "HTML message" from attachments list while viewing a message in text mode (#3005)
+- Support IMAP MOVE extension [RFC 6851]
+- Add attachment menu with Open and Download options (#4116)
+- Display user-friendly message on IMAP "over quota" errors (#914)
+- Extended archive plugin with user-configurable options to store messages into subfolders
+- Fix export of selected contacts from search result (#4070)
+- Feature to export only selected contacts from addressbook (by Phil Weir)
+
+RELEASE 0.9.5
+-------------
+- Fix failing vCard import when email address field contains spaces (#4363)
+- Fix default spell-check configuration after Google suspended their spell service
+- Fix vulnerability in handling _session argument of utils/save-prefs [CVE-2013-6172] (#4362)
+- Fix iframe onload for upload errors handling (#4361)
+- Fix address matching in Return-Path header on identity selection (#4358)
+- Fix text wrapping issue with long unwrappable lines (#4356)
+- Fixed issues where HTML comments inside style tag would hang Internet Explorer
+- Hide Delivery Status Notification option when smtp_server is unset (#4339)
+- Display full attachment name using title attribute when name is too long to display (#4328)
+- Fix attachment icon issue when rare font/language is used (#4334)
+- Fix expanded thread root message styling after refreshing messages list (#4335)
+- Fix issue where From address was removed from Cc and Bcc fields when editing a draft (#4327)
+- Fix error_reporting directive check (#4331)
+- Fix de_DE localization of "About" label in Help plugin (#4333)
+
+RELEASE 0.9.4
+-------------
+- Make identities matching case insensitive (#1881)
+- Fix issue where too big message data was stored in cache causing sql errors (#4325)
+- Fix iframe scrollbars on webkit desktop browsers (#4319)
+- Fix issue where legacy config was overriden by default config (#4305)
+- Fix newmail_notifier issue where favicon wasn't changed back to default (#4324)
+- Fix setting of Junk and NonJunk flags by markasjunk plugin (#4303)
+- Fix lack of Reply-To address in header of forwarded message body (#4314)
+- Fix bugs when invoking contact creation form when read-only addressbook is selected (#4313)
+- Fix identity selection on reply (#4308)
+- Fix so additional headers are added to all messages sent (#4302)
+- Fix display issue after moving folder in Folder Manager (#4310)
+- Fix handling of non-default date formats (#4311)
+- Fix unquoted path in PREG expression on Windows (#4307)
+- Fix wrong close tag in /template/mail.html (#4312)
+
+RELEASE 0.9.3
+-------------
+- Fix setting refresh_interval to "Never" in Preferences (#4304)
+- Fixed iframe scrolling on touch devices
+- Optimized message list for touch devices
+- Fix purge action in folder manager (#4300)
+- Fix base URL resolving on attribute values with no quotes (#4297)
+- Fix wrong handling of links with '|' character (#4298)
+- Fix colorspace issue on image conversion using ImageMagick (#4294)
+- Fix XSS vulnerability when editing a message "as new" or draft [CVE-2013-5645] (#4283)
+- Fix XSS vulnerability when saving HTML signatures [CVE-2013-5645] (#4283)
+- Fix rewrite rule in .htaccess (#4278)
+- Fix detecting Turkish language in ISO-8859-9 encoding (#4284)
+- Fix identity-selection using Return-Path headers (#4279)
+- Fix parsing of links with ... in URL (#4251)
+- Fix compose priority selector when opening in new window (#4286)
+- Fix bug where signature wasn't changed on identity selection when editing a draft (#4272)
+- Fix IMAP SETMETADATA parameters quoting (#4274)
+- Fix "could not load message" error on valid empty message body (#4271)
+- Fix handling of message/rfc822 attachments on message forward and edit (#4262)
+- Fix parsing of square bracket characters in IMAP response strings (#4267)
+- Don't clear References and in-Reply-To when a message is "edited as new" (#4263)
+- Fix messages list sorting with THREAD=REFS
+- Remove deprecated (in PHP 5.5) PREG /e modifier usage (#4239)
+- Fix empty messages list when register_globals is enabled (#4232)
+- Fix so valid and set date.timezone is not required by installer checks (#4242)
+- Canonize boolean ini_get() results (#4249)
+- Fix so install do not fail when one of DB driver checks fails but other drivers exist (#4240)
+- Fix so exported vCard specifies encoding in v3-compatible format (#4244)
+
+RELEASE 0.9.2
+-------------
+- Fix image thumbnails display in print mode (#4220)
+- Fix height of message headers block (#4200)
+- Fix timeout issue on drag&drop uploads (#4238)
+- Fix default sorting of threaded list when THREAD=REFS isn't supported
+- Fix list mode switch to 'List' after saving list settings in Larry skin (#4236)
+- Fix error when there's no writeable addressbook source (#4235)
+- Fix zipdownload plugin issue with filenames charset (#4231)
+- Fix so non-inline images aren't skipped on forward (#4230)
+- Fix "null" instead of empty string on messages list in IE10 (#4227)
+- Fix legacy options handling
+- Fix so bounces addresses in Sender headers are skipped on Reply-All (#4140)
+- Fix bug where serialized strings were truncated in PDO::quote() (#4226)
+- Fix displaying messages with invalid self-closing HTML tags (#4223)
+- Fix PHP warning when responding to a message with many Return-Path headers (#4222)
+- Fix unintentional compose window resize (#4206)
+- Fix performance regression in text wrapping function (#4219)
+- Fix connection to posgtres db using unix socket (#4218)
+- Fix handling of comma when adding contact from contacts widget (#4199)
+- Fix bug where a message was opened in both preview pane and new window on double-click (#4212)
+- Fix fatal error when xdebug.max_nesting_level was exceeded in rcube_washtml (#4202)
+- Fix PHP warning in html_table::set_row_attribs() in PHP 5.4 (#4194)
+- Fix invalid option selected in default_font selector when font is unset (#4204)
+- Fix displaying contact with ID divisible by 100 in sql addressbook (#4211)
+- Fix browser warnings on PDF plugin detection (#4209)
+- Fix fatal error when parsing UUencoded messages (#4210)
+
+RELEASE 0.9.1
+-------------
+- Better German labels for from/to to avoid conflicts with 'sender' (#4188)
+- Fix problem where security warning was displayed for valid images with image/jpg type (#4196)
+- Fix handling of invalid email addresses in headers (#4193)
+- Fix IMAP connection issue with default_socket_timeout < 0 and imap_timeout < 0 (#4191)
+- Fix various PHP code bugs found using static analysis (#4190)
+- Fix backslash character handling on vCard import (#4189)
+- Fix csv import from Thunderbird with French localization (#4170)
+- Fix messages list focus issue in Opera and Webkit (#4169)
+- Fix Reply-To header handling in Reply-All action (#4157)
+- Fix so Sender: address is added to Cc: field on reply to all (#4140)
+- Fix so addressbook_search_mode works also for group search (#4183)
+- Fix removal of a contact from a group in LDAP addressbook (#4185)
+- Inlcude SQL query in the log on SQL error (#4172)
+- Fix handling untagged responses in IMAP FETCH - "could not load message" error (#4180)
+- Fix very small window size in Chrome (#4087)
+- Fix list page reset when viewing a message in Larry skin (#4182)
+- Fix min_refresh_interval handling on preferences save (#4179)
+- Fix PDF support detection for Firefox PDF.js (#4113)
+- Fix possible collision in generated thumbnail cache key (#4177)
+- Fix exit code on bootsrap errors in CLI mode (#4160)
+- Fix error handling in CLI mode, use STDERR and non-empty exit code (#5161)
+- Fix error when using check_referer=true
+- Fix incorrect handling of some specific links (#4171)
+- Fix incorrect handling of leading spaces in text wrapping
+- Fix unintentional messages list jumps on click in Internet Explorer (#4167)
+- Fix list of required configuration options (#4166)
+- Fix DB error when creating a new contact and a group is selected (#4164)
+- Fix handling of deprecated boolean value of reply_mode option (#4165)
+
+RELEASE 0.9.0
+-------------
+- Fix display of HTML entities in protected folder name (#4159)
+- Set minimal permissions to temp files (#4131)
+- Improve content check for embedded images without filename (#4151)
+- Fix handling of invalid characters in message headers and output (#4153)
+- Fix selecting collapsed rows on select-all (#4156)
+- Avoid race-conditions with concurrent attachment uploads (#3739)
+- Fix possible header duplicates when using additional headers (#4154)
+- Fix session issues with use_https=true (#4125)
+- Fix blockquote width in sent mail (#4152)
+- Fix keyboard events on list widgets in Internet Explorer (#4148)
+
+RELEASE 0.9-rc2
+---------------
+- Fix security issue in save-pref command
+- Remove sig_above configuration option, use reply_mode only (#4135)
+- Refresh current folder in opener window after draft save or message sent (#4132)
+- Fix saving draft just after entering compose window (#4141)
+- Fix javascript error in IE9 when loading form with placeholders into an iframe (#4138)
+- Fix handling of some conditional comment tags in HTML message (#4136)
+- Fix so forward as attachment works if additional attachment is added by message_compose hook (#4134)
+- Better handling of session errors in ajax requests (#4105)
+- Fix HTML part detection for some specific message structures (#4130)
+- Don't show fake address - phishing prevention (#4120)
+- Fix forward as attachment bug with editormode != 1 (#4129)
+- Fix LIMIT/OFFSET queries handling on MS SQL Server (#4123)
+- Fix so task name can really contain all from a-z0-9_- characters (#4095)
+- Fix javascript errors when working in a page opened with taget="_blank"
+- Mention SQLite database format change in UPGRADING file (#4122)
+- Increase maxlength to 254 chars for email input fields in addressbook (#4126)
+- Fix thumbnail size when GD extension is used for image resize (#4124)
+- Display notice that message is encrypted also for application/pkcs7-mime messages (#3815)
+
+RELEASE 0.9-rc
+--------------
+- Fix plain text spellchecker incorrect highlighting in non-ASCII text (#4114)
+- Add workaround for invalid message charset detection by IMAP servers (#4112)
+- Fix NUL characters in content-type of ms-tnef attachment (#4108)
+- Fix regression in handling LDAP contact identifiers (#4104)
+- Updated translations from Transifex
+- Fix buggy error template in a frame (#4092)
+- Add addressbook widget on compose page in classic skin
+- Add search box to compose address book widget (#3710)
+- Fix login in case when default_host is an array with one element (#4085)
+- Use LDAP fallback hosts on connect + bind instead of ldap_connect() only.
+- Add config option for LDAP bind timeout (sets LDAP_OPT_NETWORK_TIMEOUT option)
+- Submit Addressbook advanced search form with Enter key (#3843)
+- Also block remote images in HTML part view (#4013)
+- Improved database schema upgrade procedure, added updatedb.sh script
+- Force autocommit mode in mysql database driver (#4068)
+
+RELEASE 0.9-beta
+----------------
+- Fix searching by date in address book (#4058)
+- Improve charset detection by prioritizing charset according to user language (#2032)
+- Fix handling of escaped separator in vCard file (#4064)
+- Add option to use envelope From address for MDN responses (#4052)
+- Add possibility to search in message body only (#3977)
+- Support "multipart/relative" as an alias for "multipart/related" type (#4057)
+- Display PGP/MIME signature attachments as "Digital Signature" (#3845)
+- Workaround UW-IMAP bug where hierarchy separator is added to the shared folder name (#4051)
+- Fix version comparisons with -stable suffix (#4050)
+- Add unsupported alternative parts to attachments list (#4046)
+- Add Compose button on message view page (#3959)
+- Display 'Sender' header in message preview
+- Plugin API: Added message_before_send hook
+- Fix contact copy/add-to-group operations on search result (#4042)
+- Use matching identity in MDN response (#4043)
+- Fix handling of signatures on draft edit (#3996)
+- Fix so compacting of non-empty folder is possible also when messages list is empty (#4039)
+- Allow forwarding of multiple emails (#2941)
+- Fix big memory consumption of DB layer (#4037)
+- Fix broken message/part bodies when FETCH response contains more untagged lines (#4020)
+- Fix empty email on identities list after identity update (#4018)
+- Add new identities_level: (4) one identity with possibility to edit only signature
+- Use Delivered-To and Envelope-To headers for identity selection (#4024, #3835)
+- Fix XSS vulnerability using Flash files (#4014)
+- Always save drafts with format=flowed in order to keep original line wraps (#3997)
+- Select default_addressbook on the list in Address Book (#3624)
+- Fix so mobile phone has TYPE=CELL in exported vCard (#4004)
+- Support contacts import from CSV file (#2605)
+- Improved keep-alive action. Now the interval is based on session_lifetime (#3799)
+- Added cross-task 'refresh' request for system state updates (#3799)
+- Renamed config options: keep_alive to refresh_interval, min_keep_alive to min_refresh_interval
+- Fix handling of text/enriched content on message reply/forward/edit
+- Option to display attached images as thumbnails below message body
+- Upgraded to jQuery 1.8.3 and jQuery UI 1.9.1
+- Add config option to automatically generate LDAP attributes for new entries
+- Add user settings to open message view and compose form in new windows (#1886)
+- Better client-side timezone detection using the jsTimezoneDetect library (#3947)
+- Add option to disable saving sent mail in Sent folder - no_save_sent_messages (#3923)
+- Fix handling dont_override with message_sort_col and message_sort_order settings (#3970)
+- Fix handling of URLs with asterisk characters (#3969)
+- Remove automatic to-lowercase conversion of usernames (#3941)
+- Plugin API: Add 'email_list' argument for identities data in user_create hook
+- Integrated zipdownload plugin to download all attachments (#617)
+- Fix HTML special characters handling in message list/header display (#3812)
+- List related text/html part as attachment in plain text mode (#3918)
+- Use IMAP BINARY (RFC3516) extension to fetch message/part bodies
+- Fix folder creation under public namespace root (#3910)
+- Fix so "Edit as new" on draft creates a new message (#3924)
+- Fix invalid error message on deleting mail from read only folder (#3929)
+- Replace data URIs of images (pasted in HTML editor) with inline attachments (#3795)
+- Remove (too big) min-width on mail screen
+- Added template object 'frame'
+- Add option to enable HTML editor on forwarding (#3807)
+- Add option to not include original message on reply, rename option top_posting to reply_mode (#1615)
+- Added session_path config option and unified cookies settings in javascript
+- Added "Undeleted" option to messages list filter
+- Rewritten test scripts for PHPUnit
+- Add new DB abstraction layer based on PHP PDO, supporting SQLite3 (#3668)
+- Removed PEAR::MDB2 package
+- Removed users.alias column, added option ('user_aliases')
+  to use email address from identities as username (#3851)
+- Removed redundant cache.cache_id column (#3817)
+- Fix order of attachments in sent mail (#3740)
+- Fix Shift + delete button does not permanently delete messages (#3598)
+- Add Content-Length for attachments where possible (#1880)
+- Fix attachment sizes in message print page and attachment preview page (#3805)
+- Add mail attachments using drag & drop on HTML5 enabled browsers
+- Add workaround for invalid BODYSTRUCTURE response - parse message with Mail_mimeDecode package (#1966)
+- Display Tiff as Jpeg in browsers without Tiff support (#3757)
+- Don't display Pdf/Tiff/Flash attachments inline without browser support (#3757, #3394)
+- Add is_escaped attribute for html_select and html_textarea (#3782)
+- Fix issue where draft auto-save wasn't executed after some inactivity time
+- Add vCard import from multiple files at once (#3458)
+- Roundcube Framework:
+    Add possibility to replace IMAP driver with custom class
+    Add IMAP auto-connection feature, improving performance with caching enabled
+    Replace imap_init hook with storage_init (with additional 'driver' argument)
+    Improved performance by caching IMAP server's capabilities in session
+    Unified global functions naming (rcube_ prefix)
+    Better classes separation
+    Framework files moved to lib/Roundcube
+
+RELEASE 0.8.5
+-------------
+- Fix #countcontrols issue in IE<=8 when text is very long (#4060)
+- Fix unwanted horizontal scrollbar in message preview header (#4044)
+- Add workaround for IE<=8 bug where Content-Disposition:inline was ignored (#4028)
+- Fix XSS vulnerability in vbscript: and data:text links handling [CVE-2012-6121] (#4033)
+- Fix absolute positioning in HTML messages (#4007)
+- Fix cache (in)validation after setting \Deleted flag
+- Fix keybord events on messages list in opera browser (#4011)
+- Fix selection of collapsed thread rows (#3978)
+- Fix wrapping of quoted text with format=flowed (#3561)
+
+RELEASE 0.8.4
+-------------
+- Fix regression where unintentional page reload was done after request abort (#3999)
+- Fix XSS vulnerability in handling of text/enriched messages (#4000)
+- Fix handling of 'media' attribute on linked css (#3989)
+- Fix excessive LFs at the end of composed message with top_posting=true (#3995)
+- Fix bug where leading blanks were stripped from quoted lines (#3994)
+
+RELEASE 0.8.3
+-------------
+- Fix AREA links handling (#3992)
+- Fix possible HTTP DoS on error in keep-alive requests (#3983)
+- Fix compatybility with MDB2 2.5.0b4 (#3982)
+- Fix a bug where saving a message in INBOX wasn't possible
+- Fix HTML part detection in messages with attachments (#3976)
+- Fix bug where wrong words were highlighted on spell-before-send check
+- Fix scrolling quirk in email preview frame using Opera 12 (#3973)
+- Fix displaying of multipart/alternative messages with empty parts (#3961)
+- Fix threaded list sorting on PHP < 5.2.9 (#3960)
+- Fix Warning: htmlspecialchars(): charset `RCMAIL_CHARSET' not supported warning in Installer (#3958)
+
+RELEASE 0.8.2
+-------------
+- Fix XSS vulnerability from HTTP User-Agent header (#3954)
+- Force fonts in compose fields to be all the same (#3926)
+- Fix handling vCard entries with TEL;TYPE=CELL (#3949)
+- Fix error where session wasn't updated after folder rename/delete (#3928)
+- Fix PLAIN authentication for some IMAP servers (#3916)
+- Fix encoding vCard file when contains PHOTO;ENCODING=b (#3922)
+- Fix focus issue in IE when selecting message row (#3881)
+- Add full headers view in message preview window (#3823)
+- Fix message display page issues - unified with message preview (#3856, #3895)
+- Fix displaying all headers when they contain malformed characters (#3911)
+- Fix decoding of HTML messages with UTF-16 charset specified (#3902)
+- Fix quota capability detection so it can be overwritten by a plugin (#3903)
+- Fix identity selection on reply (#3516)
+- Fix Larry's messages list filter in IE (#3890)
+- Fix more IE issues by disabling Compat. mode with X-UA-Compatible meta tag (#3886)
+- Fix setting locales under Solaris - use additional .UTF-8 suffix (#3887)
+- Fix email address validation for addresses with IP address in domain part
+- Fix Larry skin issues in IE7 compat. mode (#3879)
+- Fix so subscribed non-existing/non-accessible shared folder can be unsubscribed
+
+RELEASE 0.8.1
+-------------
+- Fix bug where domain name was converted to lower-case even with login_lc=false (#3859)
+- Fix lower-casing email address on replies (#3863)
+- Fix line separator in exported messages (#3866)
+- Fix XSS issue where plain signatures wasn't secured in HTML mode [CVE-2012-4668] (#3875)
+- Fix XSS issue where href="javascript:" wasn't secured [CVE-2012-3508] (#3875)
+- Fix impossible to create message with empty plain text part (#3873)
+- Fix stripped apostrophes when replying in plain text to HTML message (#3869)
+- Fix inactive Save search option after advanced search (#3870)
+- Fix Remove from group option is active for contact search result (#3871)
+- Disable autocapitalization in login form on iPad/iPhone (#3872)
+- Fix focus on the list when list row is clicked (#3865)
+- Added separate From and To columns apart from smart From/To column (#2970)
+- Fix fallback to Larry skin when configured skin isn't available (#3857)
+- Fix (workaround) delete operations with some versions of memcache (#3858)
+- Fix (disable) request validation for spell and spell_html actions
+
+RELEASE 0.8.0
+-------------
+- Don't show product version on login screen (can be enabled by config)
+- Renamed old default skin to 'classic'. Larry is the new default skin.
+- Support connections to memcached socket file (#3848)
+- Enable TinyMCE inlinepopups plugin
+- Update to TinyMCE 3.5.6
+- Correctly escape localized labels in javascript variable (#3842)
+- Update Net_SMTP/Auth_SASL packages to fix Digest-MD5/Cram-MD5 authentication (#3846)
+- Don't add attachments content into reply/forward/draft message body (#3837)
+- Fix 'no connection' errors on page unloads (#3832)
+- Plugin API: Add 'unauthenticated' hook (#3545)
+- Show explicit error message when provided hostname is invalid (#3834)
+- Fix wrong compose screen elements focus in IE9 (#3826)
+- Fix fatal error when date.timezone isn't set (#3831)
+- Update to TinyMCE 3.5.4.1
+- Better icons with distinct shapes for priority columns (#3706)
+- Show dedicated icon for multipart/report messages (#3813)
+- Properly hide text of icon links/buttons (#3820)
+- Fix handling of unitless CSS size values in HTML message (#3821)
+- Fix removing contact photo using LDAP addressbook (#3737)
+- Fix storing X-ANNIVERSARY date in vCard format (#3816)
+- Update to Mail_Mime-1.8.5 (#3810)
+- Fix XSS vulnerability in message subject handling using Larry skin [CVE-2012-3507] (#3809)
+- Fix handling of links with various URI schemes e.g. "skype:" (#3521)
+- Fix handling of links inside PRE elements on html to text conversion
+- Fix indexing of links on html to text conversion
+- Decode header value in rcube_mime::get() by default (#3803)
+- Fix errors with enabled PHP magic_quotes_sybase option (#3798)
+- Fix SQL query for contacts listing on MS SQL Server (#3797)
+- Fix window.resize handler on IE8 and Opera (#3758)
+- Don't let error message popups cover the login form (#3794)
+- Update to TinyMCE 3.5.2
+- Don't show errors when moving contacts into groups they are already in (#3788)
+- Make folders with unread messages in subfolders bold again (#2892)
+- Abbreviate long attachment file names with ellipsis (#3793)
+- Fix html2text conversion of strong|b|a|th|h tags when used in upper case
+- Add listcontrols template container in Larry skin (#3792)
+- Fix host autoselection when default_host is an array (#3790)
+- Move messages forwarding mode setting into Preferences
+- Fix HTML entities handling in HTML editor (#3780)
+- Fix listing shared folders on Courier IMAP (#3767)
+
+RELEASE 0.8-rc
+--------------
+- Added new translations in Belarusian, Interlingua and Malayalam
+- Flipped compose options arrow (#3772)
+- Fix handling of large uuencode attachments (#3771)
+- Fix handling of "usemap" attribute (#3770)
+- Fix handling of some HTML tags e.g. IMG (#3769)
+- Use similar language as a fallback for plugin localization (#3726)
+- Fix issue where signature wasn't re-added on draft compose (#3659)
+- Update to TinyMCE 3.5 (#3762)
+- Fixed multi-threaded autocompletion when number of threads > number of sources
+- Allow to configure the number of values allowed for each LDAP attribute
+- Support for serialized LDAP address values (usually delimited with a $)
+- Less restrictive session auth checks, repeat keep-alive requests on failure (#3755)
+- Fix redirect to mail/compose on re-login (#3585)
+- Add IE8 hack for messages list issue (#3317)
+- Fix handling errors on draft auto-save
+- Fix importing vCard photo with ENCODING param specified (#3746)
+- Support mutliple name/email pairs for Bcc and Reply-To identity settings (#3752)
+- Set flexible width to login form fields (#3735)
+- Fix re-draw bug on list columns change in IE8 (#3318)
+- Allow mass-removal of addresses from a group (#3259)
+- Fix removing all contacts on import to LDAP addressbook
+- Fix so "Back" from compose/show doesn't reset search request (#3594)
+- Add option to delete messages instead of moving to Trash when in Junk folder (#2805)
+- Fix invisible cursor when replying to a html message (#3100)
+- Reset IP stored in session when destroying session data (#3485)
+- Fix bug where memory_limit = -1 wasn't handled properly
+- Support LDAP RFC2256's country object class read/write (#3535)
+- Upgraded to jQuery 1.7.2
+- Image resize with GD extension (#3712)
+- Fix lack of warning when switching task in compose window (#3725)
+- Fix bug where it wasn't possible to enter ( or & characters in autocomplete fields
+- Request all needed fields from address book backends (#3721)
+- Unified (single) spellchecker button
+- Scroll long lists on drag&drop (#2249)
+- Copy all skins in installto script (#3705)
+
+RELEASE 0.8-beta
+----------------
+- Upgraded to jQuery 1.7.1 (#3673) and jQuery UI 1.8.18
+- Add Russian to the spellchecker languages list (#3542)
+- Remember custom skin selection after logout (#3688)
+- Make sure About tab is always the last tab (#3609)
+- Fix issue with folder creation under INBOX. namespace (#3683)
+- Added mailto: protocol handler registration link in User Preferences (#2729)
+- Handle identity details box with an iframe (#3066)
+- Fix issue where some text from original message was missing on reply (#3675)
+- Fix autoselect_host() for login (#3639)
+- Changed license to GNU GPLv3+ with exceptions for skins & plugins
+- Added address book widget on compose screen
+- Use proper timezones from PHP's internal timezonedb (#1973)
+- Add separate pagesize setting for mail messages and contacts (#3617)
+- Deprecate $DB, $USER, $IMAP global variables, Use $RCMAIL instead
+- Add option to set default font for HTML message (#894)
+- Fix issues with big memory allocation of IMAP results
+- Prevent from memory_limit exceeding when trying to parse big messages bodies (#3164)
+- Add possibility to add SASL mechanisms for SMTP in smtp_connect hook (#3399)
+- Mark (with different color) folders with recent messages (#2479)
+- Added About tab in Settings
+- TinyMCE updated to 3.4.6
+
+RELEASE 0.7.2
+-------------
+- Fix encoding of attachment with comma in name (#3717)
+- Fix handling of % character in IMAP protocol (#3711)
+- Fix duplicate names handling in addressbook searches (#3704)
+- Fix displaying of HTML messages from Disqus (#3702)
+- Disable E_STRICT warnings on PHP 5.4
+- Prevent from folder selection on virtual folder collapsing (#3681)
+- Fix automatic unsubscribe of non-existent folders
+- Fix double-quotes handling in recipient names
+- User configurable setting how to display contact names in list
+- Make contacts list sorting configurable for the admin/user
+- Fix parse errors in DDL files for MS SQL Server
+- Revert SORT=DISPLAY support, removed by mistake (#3664)
+- Add lost translation label in de_DE (#3654)
+- Fix drafts update issues when edited from preview pane (#3653)
+- Fix wrong variable name in rcube_ldap.php (#3643)
+- Make mime type detection based on filename extension to be case-insensitive
+- Fix failure on MySQL database upgrade from 0.7 - text column can't have default value (#3642)
+
+
+RELEASE 0.7.1
+-------------
+- Fix bug in handling of base href and inline content (#3634)
+- Fix SQL Error when saving a contact with many email addresses (#3630)
+- Fix strict email address searching if contact has more than one address
+- Remove duplicated 'organization' label (#3631)
+- Fix so editor selector is hidden when 'htmleditor' is listed in 'dont_override'
+- Fix wrong (long) label usage (#3627)
+- Fix handling of INBOX's subfolders in special folders config (#3623)
+- Add ifModule statement for setting Options -Indexes in .htaccess file (#3620)
+- Fix crashes with eAccelerator (#3608)
+- Fix searching on IMAP servers without CHARSET specifier support (#3619)
+- Fix expanding folders during drag&drop (#3611)
+- Fix wrong postgres sequence name in upgrade from 0.6
+- Fix broken CREATE INDEX queries in SQLite DDL files (#3607)
+
+RELEASE 0.7
+-----------
+- Make Roundcube render the Email Standards Project Acid Test correctly
+- Replace prompt() with jQuery UI dialog (#1603)
+- Fix navigation in messages search results
+- Improved handling of some malformed values encoded with quoted-printable (#3590)
+- Add possibility to do LDAP bind before searching for bind DN
+- Fix handling of empty <U> tags in HTML messages (#3584)
+- Add content filter for embedded attachments to protect from XSS on IE [CVE-2012-1253] (#3372)
+- Use strpos() instead of strstr() when possible (#3581)
+- Fix handling HTML entities when converting HTML to text (#3582)
+- Fix fit_string_to_size() renders browser and ui unresponsive (#3577)
+- Fix handling of invalid characters in request (#3536)
+- Fix merging some configuration options in update.sh script (#2181)
+- Fix so TEXT key will remove all HEADER keys in IMAP SEARCH (#3578)
+- Fix handling contact photo url with https:// prefix (#3575)
+- Fix possible infinite redirect on attachment preview (#3572)
+- Improved clickjacking protection for browsers which don't support X-Frame-Options headers
+- Fixed bug where similar folder names were highlighted wrong (#3345)
+- Fixed bug in handling link with '!' character in it (#3569)
+- Fixed bug where session ID's length was limited to 40 characters (#3570)
+- TinyMCE security issue: removed moxieplayer (embedding flv and mp4 is not supported anymore)
+
+RELEASE 0.7-beta
+----------------
+- Fix handling of HTML form elements in messages (#1604)
+- Fix regression in setting recipient to self when replying to a Sent message (#3101)
+- Fix listing of folders in hidden namespaces (#2895)
+- Don't consider \Noselect flag when building folders tree (#3448)
+- Fix sorting autocomplete results (#3504)
+- Add option to set session name (#2630)
+- Add option to skip alternative email addresses in autocompletion
+- Fix inconsistent behaviour of Compose button in Drafts folder, add Edit button for drafts
+- Fix problem with parsing HTML message body with non-unicode characters (#3312)
+- Add option to define matching method for addressbook search (#2720, #3378)
+- Make email recipients separator configurable
+- Fix so folders with \Noinferiors attribute aren't listed in parent selector
+- Fix handling of curly brackets in URLs (#3555)
+- Fix handling of dates (birthday/anniversary) in contact data (#3552)
+- Fix error on opening searched LDAP contact (#3550)
+- Fix redundant line break in flowed format (#3551)
+- Fix IDN address validation issue (#3544)
+- Fix JS error when dst_active checkbox doesn't exist (#3540)
+- Autocomplete LDAP records when adding contacts from mail (#3498)
+- Plugin API: added 'ready' hook (#3492)
+- Ignore DSN request when it isn't supported by SMTP server (#3300)
+- Make sure LDAP name fields aren't arrays (#3523)
+- Fixed imap test to non-default port when using ssl (#3532)
+- Force all files to be overwritten when updating (#3531)
+- Fix issue where it wasn't possible to change list view mode in folder manager for INBOX (#3522)
+- Fix namespace handling in special folders settings (#3527)
+- Disable time limit for CLI scripts (#3524)
+- Fix misleading display when chaning editor type (#3519)
+- Add loading indicator on contact delete
+- Fix bug where after delete message rows can be added to the list of another folder (#3263)
+- Add notice on autocompletion that not all records were displayed
+- Add option 'searchonly' for LDAP address books
+- Add Priority filter to the messages list
+- Cache synchronization using QRESYNC/CONDSTORE
+- Trigger 'new_messages' hook for all checked folders (#3503)
+- Make date/time format user configurable; drop 'date_today' config option
+- Fix setting title for truncated subject in IE (#3141)
+- Fix displaying multipart/alternative messages with only one part (#3400)
+- Rewritten messages caching:
+  Indexes are stored in a separate table, so there's no need to store all messages in a folder
+  Added threads data caching
+  Flags are stored separately, so flag change doesn't cause DELETE+INSERT, just UPDATE
+- Improved FETCH response handling
+- Improvements in response tokenization method
+- Use 'From' and 'To' labels instead of 'Sender' and 'Recipient'
+- Fix username case-insensitivity issue in MySQL (#3462)
+- Addressbook Saved Searches
+- Added spellchecker exceptions dictionary (shared or per-user)
+- Added possibility to ignore words containing caps, numbers, symbols (spellcheck_ignore_* options)
+- Added 'priority' column on messages list (#2884)
+- Localize forwarded message header (#3487)
+
+RELEASE 0.6
+-----------
+- Fix bug where the last identity is used on reply (#3516)
+- Fix locked folder rename option on servers supporting RFC2086 only (#3508)
+- Fix session race conditions when composing new messages
+- Fix encoding of LDAP contacts identifiers (#3501)
+- jQuery 1.6.4
+- Fix handling of binary attachments encoded with quoted-printable (#3494)
+- Fix text-overflow:ellipsis issues on messages list in FF7 and Webkit (#3490)
+- Fix handling of links with IP address
+- Fix compacting folder resets message list filter (#3499)
+
+RELEASE 0.6-rc
+----------------
+- Send X-Frame-Options headers to protect from clickjacking (#3079)
+- Fallback to mail_domain in LDAP variable replacements; added 'host' to 'user_create' hook arguments (#3464)
+- Fixed wrong vCard type parameter mobile (#3496)
+- Fixed vCard WORKFAX issue (#3476)
+- Add vCard's Profile URL support (#3491)
+- jQuery 1.6.3
+- Fix imap_cache setting to values other than 'db' (#3489)
+- Fix handling of attachments inside message/rfc822 parts (#3466)
+- Make list of mimetypes that open in preview window configurable (#3175)
+- Added plugin hook 'message_part_get' for attachment downloads
+- Added unique connection identifier to IMAP debug messages
+- Fix image type check for contact photo uploads
+
+RELEASE 0.6-beta
+----------------
+- Fixed selecting identity on reply/forward (#3434)
+- Add option to hide selected LDAP addressbook on the list
+- Add client-side checking of uploaded files size
+- Add newlines between organization, department, jobtitle (#3468)
+- Recalculate date when replying to a message and localize the cite header (#3212)
+- Fix handling of email addresses with quoted local part (#3401)
+- Fix EOL character in vCard exports (#3357)
+- Added optional "multithreading" autocomplete feature
+- Plugin API: Added 'config_get' hook
+- Fixed new_user_identity plugin to work with updated rcube_ldap class (#3443)
+- Plugin API: added folder_delete and folder_rename hooks
+- Added possibility to undo last contact delete operation
+- Fix sorting of contact groups after group create (#3258)
+- Add optional textual upload progress indicator (#2330)
+- Fix parsing URLs containing commas (#3425)
+- Added vertical splitter for books/groups list in addressbook (#3389)
+- Improved namespace roots handling in folder manager
+- Added searching in all addressbook sources
+- Added addressbook source selection in contacts import
+- Implement LDAPv3 Virtual List View (VLV) for paged results listing
+- Use 'address_template' config option when adding a new address block (#3406)
+- Added addressbook advanced search
+- Add popup with basic fields selection for addressbook search
+- Case-insensitive matching in autocompletion (#3398)
+- Added option to force spellchecking before sending a message (#1862)
+- Fix handling of "<" character in contact data, search fields and folder names (#3349)
+- Fix saving "<" character in identity name and organization fields (#3349)
+- Added option to specify to which address book add new contacts
+- Added plugin hook for keep-alive requests
+- Store user preferences in session when write-master is not available and session is stored in memcache, write them later
+- Improve performence of folder manager operations
+- Fix default_port option handling in Installer when config.inc.php file exists (#3390)
+- Removed option focus_on_new_message, added newmail_notifier plugin
+- Added general rcube_cache class with Memcache and APC support
+- Improved caching performance by skipping writes of unchanged data
+- Option enable_caching replaced by imap_cache and messages_cache options
+- Fix WORKFAX saving in address book (#3380)
+- Add forward-as-attachment feature
+- jQuery-1.6.2 (#5158, #3154)
+- Improve display name composition when saving contacts (#3153)
+- Fix problems with subfolders of INBOX folder on some IMAP servers (#3247)
+- Fix handling of folders that doesn't belong to any namespace (#3184)
+- Enable multiselection for attachments uploading in capable browsers (#2266)
+- Add possibility to change HTML editor configuration by skin
+- Fix a bug where selecting too many contacts would produce too large URI request (#3369)
+- Improve performance by including files with absolute path (#3337)
+- Move folder name truncation to client/skin (#1822)
+- Added plugin hook for request token creation
+- Replace LDAP vars in group queries (#3329)
+- Fix vcard folding with uncode characters (#3353)
+- Keep all submitted data if contact form validation fails (#3350)
+- Handle uncode strings in rcube_addressbook::normalize_string() (#3351)
+- Fix handling of debug_level=4 in ajax requests (#3327)
+- Enable TinyMCE's contextmenu (#3062)
+- Allow multiple concurrent compose sessions
+- New config option for custom logo
+- Allow skins to define/override texts with <roundcube:label />
+- Add simple ACL rights/namespace handling in folder manager
+- Force IE to send referers (#3306)
+- Better display of vcard import results (#1861)
+- Improved vcard import
+- Interactive update script with improved DB schema check
+- Fix problem with contactgroupmembers table creation on MySQL 4.x, add index on contact_id column
+- Add LDAP SASL bind and proxy authentication (#2810)
+- Replying to a sent message puts the old recipient as the new recipient (#3101)
+- Fulltext search over (almost) all data for contacts
+- Extend address book with rich contact information
+
+RELEASE 0.5.4
+-------------
+- Fix XSS vulnerability in UI messages [CVE-2011-2937] (#3469)
+
+RELEASE 0.5.3
+-------------
+- Fix identities "reply-to" and "bcc" fields have a bogus value when left empty (#3405)
+- Fix issue which cases IMAP disconnection when encrypt() method was used (#3374)
+- Fix some CSS issues in Settings for Internet Explorer 
+- Fixed handling of folder with name "0" in folder selector
+- Fix bug where messages were deleted instead moved to trash folder after Shift key was used (#3376)
+- Fix relative URLs handling according to a <base> in HTML (#3368)
+- Fix handling of top-level domains with more than 5 chars or unicode chars (#3366)
+- Fix usage of non-standard HTTP error codes (#3297)
+- Fix PHP warning on mistaken in_array() usage (#3375)
+
+RELEASE 0.5.2
+-------------
+- TinyMCE 3.4.2 now compatible with IE9
+- PEAR::Net_SMTP 1.5.2, fixed timeout issue (#3332)
+- Fix bug where template name without plugin prefix was used in render_page hook
+- Support 'abort' and 'result' response in 'preferences_save' hook, add error handling
+- Fix bug where some content would cause hang on html2text conversion (#3348)
+- Improve space-stuffing handling in format=flowed messages (#3346)
+- Fix bug where some dates would produce SQL error in MySQL (#3342)
+- Added workaround for some IMAP server with broken STATUS response (#3344)
+- Fix bug where default_charset was not used for text messages (#3328)
+- Stateless request tokens. No keep-alive necessary on login page (#3325)
+- Force names of unique constraints in PostgreSQL DDL
+- Add code for prevention from IMAP connection hangs when server closes socket unexpectedly
+- Remove redundant DELETE query (for old session deletion) on login
+- Get around unreliable rand() and mt_rand() in session ID generation (#2516)
+- Fix some emails are not shown using Cyrus IMAP (#3316)
+- Fix handling of mime-encoded words with non-integral number of octets in a word (#3301)
+- Fix parsing links with non-printable characters inside (#3305)
+- Fixed de_CH Localization bugs (#3279)
+- Add variable for 'Today' label in date_today option (#2394)
+- Fix dont_override setting does not override existing user preferences (#3205)
+- Use only one from IMAP authentication methods to prevent login delays (1487784)
+- Support strftime format in date_today option
+- Fix SQL query in rcube_user::query() so it uses index on MySQL again
+- Removed redundant </form> tags from contact add/edit pages
+- Fix CSS error in contact details screen on IE7 (#3281)
+
+RELEASE 0.5.1
+-------------
+- Fix handling of attachments with invalid content type (#3275)
+- Add workaround for DBMail's bug http://www.dbmail.org/mantis/view.php?id=881 (#3274)
+- Use IMAP's ID extension (RFC2971) to print more info into debug log
+- Security: add optional referer check to prevent CSRF in GET requests
+- Fix email_dns_check setting not used for identities/contacts (#3251)
+- Fix ICANN example addresses doesn't validate (#3253)
+- Security: protect login form submission from CSRF [CVE-2011-1491]
+- Security: prevent from relaying malicious requests through modcss.inc [CVE-2011-1492]
+- Fix handling of non-image attachments in multipart/related messages (#3261)
+- Fix IDNA support when IDN/INTL modules are in use (#3253)
+- Fix handling of invalid HTML comments in messages (#3269)
+- Fix parsing FETCH response for very long headers (#3264)
+- Fix add/remove columns in message list when message_sort_order isn't set (#3262)
+- Check mime headers before attempt to parse them (#3256)
+- Quote header values in show_additional_headers plugin (#3255)
+- Fix settings UI on IE 6 (#3246)
+- Remove double borders in folder listing (#3236)
+- Separate full message headers UI element from headers table (#3238)
+- Add part MIME ID to message_part_* hooks (#3241) 
+- Improve parsing of MS Outlook vCards (#3239)
+- Updated PEAR::Net_Socket to 1.0.10
+- Updated PEAR::Net_IDNA2 to 0.1.1
+- Fix handling of comments inside an email address spec. (#3210)
+- Show full mail subject as title when hovering a cut subject link (#3141)
+- Fix randomly disappearing folders list in IE (#3231)
+- Fix list column add/removal in IE (#3230)
+- Fix login redirect issues (#3221)
+- Require PHP 5.2.1 or greater
+- Fix %h/%z variables in username_domain option (#3228)
+- Workaround for setting charset in case of malformed bodystructure response (#3227)
+- Fix impossible to subscribe to protected folders (#3199)
+- Fix setting timezone in Preferences (#3232)
+
+RELEASE 0.5
+-----------
+- Fix double-login/session issue (#3124)
+- Wrap HTML parts with <html><body> and add Doctype declaration (#3119)
+- Make rcube_autoload silently skip unknown classes (#3128)
+- Fix charset detection in vcards with encoded values (#1934)
+- Better CSS cursors for splitters (#2954)
+- Show the same message only once (#3186)
+- Fix namespaces handling (#3192)
+- Add handling of multifolder METADATA/ANNOTATION responses
+- Fix handling of INBOX when personal namespace prefix is non-empty (#3200)
+- Fix handling square brackets in links (#3209)
+- Add description of 'use_https' option in main.inc.php.dist file
+
+RELEASE 0.5-RC
+--------------
+- Plugin API: Add 'pass' argument in 'authenticate' hook (#3147)
+- Fix attachments of type message/rfc822 are not listed on attachments list
+- Add 'login_lc' config option for case-insensitive authentication (#3131)
+- Fix window is blur'ed in IE when selecting a message (#3161)
+- Fix cursor position on compose form in Webkit browsers (#2796)
+- Fix setting charset of attachment filenames (#3136)
+- Allow setting autocomplete attribute for all inputs separately (#3158)
+- New Folder Manager UI
+- Fix invalid Request when creating a folder (#3165)
+- Add folder size and quota indicator in folder manager (#2112)
+- Add possibility to move a subfolder into root folder (#2890)
+- Fix copying all messages in a folder copies only messages from current page
+- Improve performance of moving or copying of all messages in a folder
+- Fix plaintext versions of HTML messages don't contain placeholders for emotions (#1657)
+- Improve performance of folder rename and delete actions
+- Better support for READ-ONLY and NOPERM responses handling (#3108)
+- Add confirmation message on purge/expunge command response
+- Fix handling of untagged responses for AUTHENTICATE command (#3171)
+- Add username and IP address to log message on unsuccessful login (#3176)
+- Improved Mail-Followup-To and Mail-Reply-To headers handling
+- Fix charset conversion for text attachments without charset specification (#3181)
+
+RELEASE 0.5-BETA
+----------------
+- Make session data storage more robust against garbage session data (#3148)
+- Config option for autocomplete on login screen
+- Allow plugin templates to include local files (#3146)
+- List groups in address detail view and allow to subscribe/unsubscribe from there (#2862)
+- Messages caching: performance improvements, fixed syncing, fixes related with #2857
+- Add link to identities in compose window (#2843)
+- Add Internationalized Domain Name (IDNA) support (#729)
+- Add option to automatically send read notifications for known senders (#2199)
+- Add option to "Return receipt" will be always checked (#2571)
+- Fix HTML to plain text conversion doesn't handle citation blocks (#2992)
+- Use custom sorting when SORT is disabled by IMAP admin (#3020)
+- Allow setting some washtml options from plugin (#2727)
+- Add option do bind for an individual LDAP address book (#3048)
+- Change reply prefix to display email address only if sender name doesn't exist (#2709)
+- Plugin API: improved 'abort' flag handling, added 'result' item in some hooks (#2988)
+- Fix mailto optional params in plain text messages aren't handled (#3071)
+- Add Reply-to-List feature (#977)
+- Add Mail-Followup-To/Mail-Reply-To support (#1937)
+- Fix confirmation message isn't displayed after sending mail on Chrome (#2437)
+- Fix keyboard doesn't work with autocomplete list with Chrome (#3073)
+- Improve tabs to fixed width and add tabs in identities info (#3030)
+- Add unique index on users.username+users.mail_host
+- Make htmleditor option more consistent and add option to use HTML on reply to HTML message (#2164)
+- Use empty envelope sender address for message disposition notifications (RFC 2298.3)
+- Support SMTP Delivery Status Notifications - RFC 3461 (#2409)
+- Use css sprite image for messages list
+- Add (different) attachment icon for messages of type multipart/report (#2426)
+- Prevent from inserting empty link when composing HTML message (#3007)
+- Add caching support in id2uid and uid2id functions (#3065)
+- Add SASL proxy authentication for SMTP (#2811)
+- Improve displaying of UI messages (#3033)
+- Fix double e-mail filed in identity form (#3088)
+- Display IMAP errors for LIST/THREAD/SEARCH commands (#2981)
+- Add LITERAL+ (IMAP4 non-synchronizing literals) support (RFC 2088)
+- Add separate column for message status icon (#2788)
+- Add ACL extension support into IMAP classes (RFC 4314)
+- Add ANNOTATEMORE extension support into IMAP classes (draft-daboo-imap-annotatemore)
+- Add METADATA extension support into IMAP classes (RFC 5464)
+- Fix decoding of e-mail address strings in message headers (#3097)
+- Fix handling of attachments when Content-Disposition is not inline nor attachment (#3086)
+- Improve performance of unseen messages counting (#3090)
+- Improve performance of messages counting using ESEARCH extension (RFC4731)
+- Add LIST-STATUS support in rcube_imap_generic class (RFC 5819)
+- Add SASL-IR support in IMAP (RFC 4959)
+- Add LOGINDISABLED support (RFC 2595)
+- Add support for AUTH=PLAIN in IMAP authentication
+- Re-implemented SMTP proxy authentication support
+- Add support for IMAP proxy authentication (#2808)
+- Add support for AUTH=DIGEST-MD5 in IMAP (RFC 2831)
+- Fix parent folder with unread subfolder not bold when message is open (#3104)
+- Add basic IMAP LIST's \Noselect option support
+- Add support for selection options from LIST-EXTENDED extension (RFC 5258)
+- Don't list subscribed but non-existent folders (#2474)
+- Fix handling of URLs with tilde (~) or semicolon (;) character (#3110, #3111)
+- Plugin API: added 'contact_form' hook
+- Add SORT=DISPLAY support (RFC 5957)
+- Plugin API: add possibility to disable plugin in AJAX mode, 'noajax' property
+- Plugin API: add possibility to disable plugin in framed mode, 'noframe' property
+- Improve performance of setting IMAP flags using .SILENT suffix
+- Improve performance of message cache status checking with skip_disabled=true
+- Support contact's email addresses up to 255 characters long (#3116)
+- Add option to place replies in the folder of the message being replied to (#2248)
+- Add missing confirmation/error messages on contact/group/message actions (#2935)
+- Add 'loading' message on message move/copy/delete/mark actions
+- Improve responsiveness of messages displaying (#3039)
+- Add option for minimum length of autocomplete's string (#2625)
+- Fix operations on messages in unsubscribed folder (#3126)
+- Add support for shared folders (#525)
+- Fix handling of folders with name "0" (#3133)
+- Fix handling of folders with "<>" characters in name
+- jQuery 1.4.4
+- Fix handling of HTML entity strings in plain text messages
+- Fix focused elements aren't unfocused when clicking on the list (#3137)
+- Fix error in MSSQL DDL scripts (#3130)
+- Lock submit button in onsubmit event on login page (#3078)
+- Don't set attachment's charset in Content-type header (#3136)
+- Fix handling of message bodies (quoted-printable encoded) with NULL characters (#2448)
+- Add workaround for MSOE's multipart/related messages with non-related attachments
+
+RELEASE 0.4.2
+-------------
+- Fix handling of backslash as IMAP delimiter
+- Fix charset replacement in HTML message bodies (#3067)
+- Fix: contact group input is empty when using rename action more than once on the same group record
+- Fix "Server Error! (Not Found)" when using utils/save-pref action (#3069)
+- Fix handling of Thunderbird's vCards (#3070)
+
+RELEASE 0.4.1
+-------------
+- Fix space-stuffing in format=flowed messages (#3064)
+- Fix msgexport.sh now using the new imap wrapper
+- Avoid displaying password on shell (#3010)
+- Only lower-case user name if first login attempt failed (#2600)
+- Make alias setting in squirrelmail_usercopy plugin configurable (patch by pommi, #3056)
+- Prevent from saving a non-existing skin path in user prefs (#3004)
+- Improve handling of single-part messages with bogus BODYSTRUCTURE (#2976)
+- Fix path to SQL files when using pgsql/mysqli/sqlsrv drivers (#2979)
+- Fix upgrade script for SQLite (#2980)
+- Fixes in SQL init script + added update script for MSSQL database
+- Remove redundant date in syslog messages (#3008)
+- Fix contacts list page controls when a group is selected (#3009)
+- Fix SMTP test in Installer (#3014)
+- Fix "Select all" causes message to be opened in folder with exactly one message (#2987)
+- Fix Tab key doesn't work in HTML editor in Google Chrome (#2995)
+- Fix TinyMCE uses zh_CN when zh_TW locale is set (#2998)
+- Fix TinyMCE buttons are hidden in Opera (#2993)
+- Fix JS error on IE when trying to send HTML message with enabled spellchecker (#3006)
+- Display inline images with known extensions and non-image content-type (#3002)
+- Fix "Threaded" checkbox after subfolder creation (#2997)
+- Fix timezone string in sent mail (#3021)
+- Show disabled checkboxes for protected folders instead of dots (#1898)
+- Added fieldsets in Identity form, added 'identity_form' hook
+- Re-added 'Close' button in upload form (#2999, #2917)
+- Fix handling of charsets with LATIN-* label
+- Fix messages background image handling in some cases (#3043)
+- Fix format=flowed handling (#3042)
+- Fix when IMAP connection fails in 'get' action session shouldn't be destroyed (#3046)
+- Fix list_cols is not updated after column dragging (#3050)
+- Support %z variable in host configuration options (#3054)
+
+RELEASE 0.4
+-----------
+- Fix disapearing upload form disapears when user selects a file on Safari (#2917)
+- Don't replace error messages with loading info (#2534)
+- Fix JS errors on compose mode switch (#2952)
+- Fix message structure parsing when it lacks optional fields (#2960)
+- Include all recipients in sendmail log
+- Support HTTP_X_FORWARDED_PROTO header for HTTPS detecting (#2950)
+- Fix default IMAP port configuration (#2948)
+- Create Sent folder when starting to compose a new message (#2900)
+- Fix handling of messages with Content-Type: application/* and no filename (#840)
+- Improved compose screen: resizable body and attachments list, vertical splitter, options menu
+- Fix RC forgets search results (#722)
+- TinyMCE 3.3.7
+- Improve parsing of styled empty tags in HTML messages (#2908)
+- Add %dc variable support in base_dn/bind_dn config (#2881)
+- Add button to hide/unhide the preview pane (#955)
+- Fix no-cache headers on https to prevent content caching by proxies (#2897)
+- Fix attachment filenames broken with TNEF decoder using long filenames (#2894)
+- Use user's timezone in Date header, not server's timezone (#2393)
+- Add option to set separate footer for HTML messages (#2784)
+- Add real SMTP error description to displayed error messages (#2233)
+- Fix some IMAP errors handling when opening the message (#1848)
+- Fix related parts aren't displayed when got mimetype other than image/* (#2629)
+- Multiple identity and database support for squirrelmail_usercopy plugin (#2686)
+- Support dynamic hostname (%d/%n) variables in configuration options (#1843)
+- Add 'messages_list' hook (#2504)
+- Add request* event triggers in http_post/http_request (#2340)
+- Fix use RFC-compliant line-delimiter when saving messages on IMAP (#2828)
+- Add 'imap_timeout' option (#2869)
+- Fix forwarding of messages with winmail attachments
+- Fix handling of uuencoded attachments in message body (#2163)
+- Added list_mailboxes hook in rcube_imap::list_unsubscribed() (#2791)
+- Fix wrong message on file upload error (#2839)
+- Add support for data URI scheme [RFC2397] (#2851)
+- Added 'actionbefore', 'actionafter', 'responsebefore', 'responseafter' events
+- Fix double-addition of e-mail domain to content ID in HTML images
+- Read and send messages with format=flowed (#1052), fixes word wrapping issues (#2703)
+- Fix duplicated attachments when forwarding a message (#2670)
+- Fix message/rfc822 attachments containing only attachments are not parsed properly (#2854)
+- Fix %00 character in winmail.dat attachments names (#2850)
+- Fix handling errors of folder deletion (#2821)
+- Parse untagged CAPABILITY response for LOGIN command (#2853)
+- Renamed all php-cli scripts to use .sh extension
+- Some files from /bin + spellchecking actions moved to the new 'utils' task
+- Added thread tree icons
+- Extend contact groups support (#2802)
+- Fix check-recent action issues and performance (#2690)
+- Fix messages order after checking for recent (#1249)
+- Fix autocomplete shows entries without email (#2640)
+- Fix listupdate event doesn't trigger on search response (#2824)
+- Fix select_all_mode value after selecting a message (#2834)
+- Set focus to editor on reply in HTML mode (#2768)
+- Fix composing in HTML jumps cursor to body instead of recipients (#2796)
+- Allow columns order change per user - drag&drop (#2124)
+- Add References header in read receipt (#2801)
+- Fix database constraint violation when opening a message (#2814)
+- Add 'loading' message while login is in progress (#2790)
+- Fix quota_zero_as_unlimited (#2786)
+- Fix folder subscription checking (#2804)
+- Fix INBOX appears (sometimes) twice in mailbox list (#2794)
+- Fix listing of attachments of some types e.g. "x-epoc/x-sisx-app" (#2779)
+- Fix DB Schema checking when some db_table_* options are not set (#2780)
+
+RELEASE 0.4-beta
+----------------
+- Add sizelimit and timelimit variables in LDAP config (#2704)
+- Hide IMAP host dropdown when single host is defined (#2553)
+- Add images pre-loading on login page (#623)
+- Add HTTP_X_REAL_IP and HTTP_X_FORWARDED_FOR to successful logins log (#2634)
+- Fix setting spellcheck languages with extended codes (#2747)
+- Fix messages list scrolling in FF3.6 (#2657)
+- Fix quicksearch input focus (#2770)
+- Always set changed date when flagging a DB record as deleted + provide a cleanup script
+- Fix address book/group selection (#2760)
+- Assign newly created contacts to the active group (#2764)
+- Added option not to mark messages as read when viewed in preview pane (#1513)
+- Allow plugins modify the Sent folder when composing (#2708)
+- Added optional (max_recipients) support to restrict total number of recipients per message (#1167)
+- Re-organize editor buttons, add blockquote and search buttons
+- Make possible to write inside or after a quoted html message (#1878)
+- Fix bugs on unexpected IMAP connection close (#2449, #2507)
+- Iloha's imap.inc rewritten into rcube_imap_generic class
+- Added contact groups in address book (not finished yet)
+- Added PageUp/PageDown/Home/End keys support on lists (#2627)
+- Added possibility to select all messages in a folder (#1312)
+- Added 'imap_force_caps' option for after-login CAPABILITY checking (#2087)
+- Password: Support dovecotpw encryption
+- TinyMCE 3.3.1
+- Implemented messages copying using drag&drop + SHIFT (#863)
+- Improved performance of folders operations (#2689)
+- Fix blocked.gif attachment is not attached to the message (#2685)
+- Managesieve: import from Horde-INGO
+- Managesieve: support for more than one match (#2362)
+- Managesieve: support for selectively disabling rules within a single sieve script (#2198)
+- Threaded message listing now available
+- Added sorting by ARRIVAL and CC
+- Message list columns configurable by the user
+- Removed 'index_sort' option, now we're using empty 'message_sort_col' for this
+- virtuser_query: support other identity data (#2413)
+- Options virtuser_* replaced with virtuser_* plugins
+- Plugin API: Implemented 'email2user' and 'user2email' hooks
+- Fix forwarding message omits CC header (#2538)
+- Add 'default_charset' option to user preferences (#1855)
+- Add 'delete_always' option to user preferences
+- Support/Require tls:// prefix in 'smtp_server' option for TLS connections
+- Fix inconsistent behaviour of 'delete_always' option (#2533)
+- Fix deleting all messages from last list page (#2528)
+- Flag original messages when sending a draft (#2458)
+- Changed signature separator when top-posting (#2555)
+- Let the admin define defaults for search modifiers (#2211)
+- Fix long e-mail addresses validation (#2641)
+- Remember search modifiers in user prefs (#2411)
+- Added force_7bit option to force MIME encoding of plain/text messages (#2679)
+- Use case sensitive check when checking for default folders (#2567)
+- Fix checking for new mail: now checks unseen count of inbox (#2123)
+- Improve performance by avoiding unnecessary updates to the session table (#2552)
+- Fix invalid <font> tags which cause HTML message rendering problems (#2687)
+- Fix CVE-2010-0464: Disable DNS prefetching (#2639)
+- Fix Received headers to behave better with SpamAssassin (#2682)
+- Password: Make passwords encoding consistent with core, add 'password_charset' global option (#2658)
+- Fix adding contacts SQL error on mysql (#2645)
+- Squirrelmail_usercopy: support reply-to field (#2678)
+- Fix IE spellcheck suggestion popup issue (#2656)
+- Fix email address auto-completion shows regexp pattern (#2498)
+- Fix merging of configuration parameters: user prefs always survive (#2584) 
+- Fix quota indicator value after folder purge/expunge (#2671)
+- Fix external mailto links support for use as protocol handler (#2328)
+- Fix attachment excessive memory use, support messages of any size (#1245)
+- Fix setting task name according to auth state
+- Password: fix vpopmaild driver (#2662)
+- Add workaround for MySQL bug [http://bugs.mysql.com/bug.php?id=46293] (#2659)
+- Fix quoted text wrapping when replying to an HTML email in plain text (#897)
+- Fix handling of extended mailto links (with params) (#2573)
+- Fix sorting by date of messages without date header on servers without SORT (#2521)
+- Fix inconsistency when not using default table names (#2652)
+- Fix folder rename/delete buttons do not appear on creation of first folder (#2653)
+- Fix character set conversion fails on systems where iconv doesn't accept //IGNORE (#2590)
+- Log in performance: Create default folders on first login only
+- Import contacts into the selected address book (by Phil Weir)
+- Add support for MDB2's 'sqlsrv' driver (#2602)
+- Use jQuery-1.4
+- Removed problematic browser-caching of messages
+- Fix incompatybility with suhosin.executor.disable_emodifier (#2549)
+- Use PLAIN auth when CRAM fails and imap_auth_type='check' (#2587)
+- Fix removal of <title> tag from HTML messages (#2629)
+- Fix 'force_https' to specified port when URL contains a port number (#2612)
+- Fix to-text converting of HTML entities inside b/strong/th/hX tags (#2621)
+- Bug in spellchecker suggestions when server charset != UTF8 (#2607)
+- Managesieve: Fix requires generation for multiple actions (#2603)
+- Fix LDAP problem with special characters in RDN (#2548)
+- Improved handling of message parts of type message/rfc822
+- Plugin API: added 'quota' hook
+- Fix parsing conditional comments in HTML messages (#2569)
+- Use built-in json_encode() for proper JSON format in AJAX replies
+- Allow setting only selected params in 'message_compose' hook (#2543)
+- Plugin API: added 'message_compose_body' hook (#2520)
+- Fix counters of all folders are checked in 'getunread' action  with check_all_folders disabled (#2399)
+- Fix displaying alternative parts in messages of type message/rfc822 (#2488)
+- Fix possible messages exposure when using Roundcube behind a proxy (#2516)
+- Fix unicode para and line separators in javascript response (#2542)
+- Additional_message_headers: allow unsetting headers, support plugin's config file (#2505)
+- Fix displaying of hidden directories in skins list (#2535)
+- Fix open_basedir restriction error when reading skins list (#2537)
+- Fix pasting from Office apps into html editor (#2508)
+- Fix empty <a> tags parsing (#2509)
+- Don't cut off attachment names when using non-RFC2231 encoding (#1912)
+- Allow inserting signatures above replied message body (#991)
+- Managesieve 2.0: multi-script support
+- Fix imap_auth_type regression (#2502)
+
+RELEASE 0.3.1
+------------------
+- Specify toolbar container in compose template (#2489)
+- Fix $_SERVER['HTTPS'] check for SSL forcing on IIS (#2486)
+- Avoid unnecessary page loads for selected tab (#2324)
+- Fix quota indicator issues by content generation on client-size (#2454, #2470)
+- Don't display disabled sections in Settings (#2380)
+- Added server-side e-mail address validation with 'email_dns_check' option (#2175)
+- Fix login page loading into an iframe when session expires (#2253)
+- Allow setting port number in 'force_https' option (#2373)
+- Option 'force_https' replaced by 'force_https' plugin
+- Fix IE issue with non-UTF-8 characters in AJAX response (#2422)
+- Partially fixed "empty body" issue by showing raw body of malformed message (#2427)
+- Fix importing/sending to email address with whitespace (#2467)
+- Added XIMSS (CommuniGate) driver for Password plugin
+- Fix newly attached files are not saved in drafts w/o editing any text (#2457)
+- Added attachment upload indicator with parallel upload (#2344)
+- Use default_charset for bodies of messages without charset definition (#2446)
+- Password: added cPanel driver
+- Fix return to first page from e-mail screen (#2385)
+- Fix handling HTML comments in HTML messages (#2448)
+- Fix folder/messagelist controls alignment - icons used (#2356)
+- Fix LDAP addressbook shows 'Contact not found' error sometimes (#2438)
+- Fix cache status checking + improve cache operations performance (#2384)
+- Prevent from setting INBOX as any of special folders (#2390)
+- Fix regular expression for e-mail address (#2417)
+- Fix Received header format
+- Implemented sorting by message index - added 'index_sort' option (#2240)
+- Fix dl() use in installer (#2415)
+- Added 'ldap_debug' option
+- Fix "Empty startup greeting" bug (#2369)
+- Fix setting user name in 'new_user_identity' plugin (#2405)
+- Fix incorrect count of new messages in folder list when using multiple IMAP clients (#2289)
+- Fix all folders checking for new messages with disabled caching (#2399)
+- Support skins in 'archive' and 'markasjunk' plugins
+- Added 'html_editor' hook (#2353)
+- Fix DB constraint violation when populating messages cache (#2338)
+- Password: added password strength options (#2348)
+- Fix LDAP partial result warning (#1928)
+- Fix delete in message view deletes permanently with flag_for_deletion=true (#2382)
+- Use faster/secure mt_rand() (#2376)
+- Fix roundcube hangs on empty inbox with bincimapd (#2375)
+- Fix wrong headers for IE on servers without $_SERVER['HTTPS'] (#2232)
+- Force IE style headers for attachments in non-HTTPS session, 'use_https' option (#2023)
+- Check 'post_max_size' for upload max filesize (#2372) 
+- Password Plugin: Fix %d inserts username instead of domain (#2371)
+- Fix rcube_mdb2::affected_rows() (#2366)
+
+RELEASE 0.3-stable
+------------------
+- Fix gn and givenName should be synonymous in LDAP addressbook (#2208)
+- Add mail_domain to LDAP email entries without @ sign (#1652)
+- Fix saving empty values in LDAP contact data (#2113)
+- Fix LDAP contact update when RDN field is changed (#2119)
+- Fix LDAP attributes case senitivity problems (#2155)
+- Fix LDAP addressbook browsing when only one directory is used (#2314)
+- Fix endless loop on error response for APPEND command (#2346)
+- Don't require date.timezone setting in installer (#2284)
+- Fix date sorting problem with Courier IMAP server (#2351)
+- Unselect pressed buttons on mouse up (#2283)
+- Don't set php_value error_log in .htaccess but mention in INSTALL (#2230)
+- Fix too small status/flag/attachment columns in Safari 4 (#2349)
+- Fix selection disabling while dragging splitter in webkit browsers (#2342)
+- Added 'new_messages' plugin hook (#2298)
+- Added 'logout_after' plugin hook (#2333)
+- Added 'message_compose' hook
+- Added 'imap_connect' hook (#2256)
+- Fix vcard_attachments plugin (#2326)
+- Updated PEAR::Auth_SASL to 1.0.3 version
+- Use sequence names only with PostgreSQL (#2310)
+- Re-designed User Preferences interface 
+- Fix MS SQL DDL (#2312)
+- Fix rcube_mdb2.php: call to setCharset not implemented in mssql driver (#2311)
+- Added 'display_next' option
+- Fix rcube_mdb2::unixtimestamp for MS SQL (#2308)
+- Fix HTML washing to respect character encoding
+- Fix endless loop in iil_C_Login() with Courier IMAP (#2303)
+- Fix #messagemenu display on IE (#2299)
+- Speedup UI by using sprites for (toolbar) buttons
+- Fix charset names with X- prefix handling
+- Fix displaying of HTML messages with unknown/malformed tags (#2296)
+
+RELEASE 0.3-RC1
+---------------
+- Fix import of vCard entries with params (#1857)
+- Fix HTML messages output with empty block elements (#2271)
+- Use request tokens to protect POST requests from CSRF [CVE-2009-4076, CVE-2009-4077]
+- Added hook when killing a session
+- Added hook to write_log function (#2268)
+- Performance improvements by use UID commands (#2046)
+- Fix HTML editor tabIndex setting (#2269)
+- Added 'imap_debug' and 'smtp_debug' options
+- Support strftime's format modifiers in date_* options (#1354)
+- Support %h variable in 'smtp_server' option (#2101)
+- Show SMTP errors in browser (#2233)
+- Allow WBR tag in HTML message (#2259)
+- Use spl_autoload_register() instead of __autoload (#2250)
+- Add hook for identities listing (#2257)
+- Trigger hook 'smtp_connect' when opening an SMTP connection (#2255)
+- Added config option to enforce HTTPS connections
+- Fix non-unicode characters caching in unicode database (#1209)
+- Performance improvements of messages caching
+- Fix empty Date header issue (#2229)
+- Open collapsed folders during drag & drop (#2221)
+- Fixed link text replacements (#2120)
+- Also trigger 'insertrow' events on page load (#2151)
+- No link on subject in IE browsers (#1438)
+- Fixed filename encoding according to RFC2231 (#2192)
+- Added message Edit feature (#727, #1101)
+- Fix message Etag generation for counter issues (#1996)
+- Fix messages searching on MailEnable IMAP (#2097)
+- Fixed many 'skip_deleted' issues (#2006)
+- Fixed messages list sorting on servers without SORT capability
+- Colorized signatures in plain text messages
+- Reviewed/fixed skip_deleted/read_when_deleted/flag_for_deletion options handling in UI
+- Fix displaying of big maximum upload filesize (#2205)
+- Added possibility to invert messages selection
+- After move/delete from 'show' action display next message instead of messages list (#2203)
+- Fixed problem with double quote at the end of folder name (#2200)
+- Speedup UI by using CSS sprites and etags/expires/deflate in Apache config (#1397,#2128)
+- Support UID EXPUNGE: remove only moved/deleted messages
+- Add drag cancelling with ESC key (#1036)
+- Support initial identity name from virtuser_query (#807)
+- Added message menu, removed Print and Source buttons
+- Added possibility to save message as .eml file (#2178)
+- Added 1 minute interval in autosave options (#2173)
+- Support UTF-7 encoding in messages (#2156)
+- Better support for malformed character names (#2093)
+
+RELEASE 0.3-BETA
+----------------
+- Plugin API + jQuery engine
+- Added possibility to encrypt received header, option 'http_received_header_encrypt',
+  added some more logic in encrypt/decrypt functions for security
+- Fix Answered/Forwarded flag setting for messages in subfolders
+- Fix autocomplete problem with capital letters (#2122)
+- Support UUencode content encoding (#2163)
+- Minimize chance of race condition in session handling (#1260)
+- Fix session handling on non-session SQL query error (#2078)
+- Fix html editor mode setting when reopening draft message (#2158)
+- Added quick search box menu (#1010)
+- Fix wrong column sort order icons (#2149)
+- Updated TinyMCE to 3.2.3 version
+- Fix attachment names encoding when charset isn't specified in attachment part (#1483)
+- Fix message normal priority problem (#2146)
+- Fix autocomplete spinning wheel does not disappear (#2132)
+- Added log_date_format option (#2060)
+- Fix text wrapping in HTML editor after switching from plain text to HTML (#1917)
+- Fix auto-complete function hangs with plus sign (#2141)
+- Fix AJAX requests errors handler (#1503)
+- Speed up message list displaying on IE
+- Fix read/write database recognition (#2137)
+
+RELEASE 0.2.2
+-------------
+- Fix quicksearchbox look in Chrome and Konqueror (#1380)
+- Fix UTF-8 byte-order mark removing (#1911)
+- Fix folders subscribtions on Konqueror (#1380) 
+- Fix debug console on Konqueror and Safari
+- Fix messagelist focus issue when modifying status of selected messages (#2134)
+- Support STARTTLS in IMAP connection (#1714)
+- Fix DEL key problem in search boxes (#1923)
+- Support several e-mail addresses per user from virtuser_file (#2036)
+- Fix drag&drop with scrolling on IE (#2117)
+- Fix adding signature separator in html mode (#1768)
+- Fix opening attachment marks message as read (#2131)
+- Fix 'temp_dir' does not support relative path under Windows (#1157)
+- Fix "Initialize Database" button missing from installer (#2130)
+- Fix compose window doesn't fit 1024x768 window (#1807)
+- Fix service not available error when pressing back from compose dialog (#1942)
+- Fix using mail() on Windows (#2111)
+- Fix word wrapping in message-part's <PRE>s for printing (#2118)
+- Fix incorrect word wrapping in outgoing plaintext multibyte messages (#2062)
+- Fix double footer in HTML message with embedded images
+- Fix TNEF implementation bug (#2107)
+- Fix incorrect row id parsing for LDAP contacts list (#2116) 
+- Fix 'mode' parameter in sqlite DSN (#2106)
+
+RELEASE 0.2.1
+------------------
+- Use US-ASCII as failover when Unicode searching fails (#2097)
+- Fix errors handling in IMAP command continuations (#2097)
+- Fix FETCH result parsing for servers returning flags at the end of result (#2098)
+- Fix datetime columns defaults in mysql's DDL (#2012)
+- Fix attaching more than nine inline images (#2094)
+- Support 'UNICODE-1-1-UTF-7' alias for UTF-7 encoding (#2093)
+- Fix mime-type detection using a hard-coded map (#1735)
+- Don't return empty string if charset conversion failed (#2092)
+- Disable concurrent autocomplete query results display (#2082)
+- Fix new lines stripped from message footer (#2088)
+- Fix IE problem with mouse click autocomplete (#2080)
+- Fix html body washing on reply/forward + fix attachments handling (#2034)
+- Fix multiple recipients input parsing (#2077)
+- Fix replying to message with html attachment (#2034)
+- Use default_charset for messages without specified charset (#2027, #1484961)
+- Support non-standard "GMT-XXXX" literal in date header (#2074)
+- Added TNEF support to decode MS Outlook attachments (winmail.dat)
+- Fix "value continuation" MIME headers by adding required semicolon (#2073)
+- Fix pressing select all/unread multiple times (#2069)
+- Fix selecting all unread does not honor new messages (#2070)
+- Fix some base64 encoded attachments handling (#2071)
+- Support NGINX as IMAP backend: better BAD response handling (#2066)
+- Performance fix: don't fetch attachment parts headers twice to parse filename
+- Fix checking for recent messages on various IMAP servers (#2055)
+- Performance fix: Don't fetch quota and recent messages in "message view" mode
+- Fix displaying of alternative-inside-alternative messages (#2061)
+- Fix MDNSent flag checking, use arbitrary keywords (asterisk) flag (#2059)
+- Fix creation of folders with '&' sign in name
+- Fix parsing of email addresses without angle brackets (#2048)
+- Save spellcheck corrections when switching from plain to html editor (and spellchecking is on)
+- Fix large search results on server without SORT capability (#2031)
+- Get rid of preg_replace() with eval modifier and create_function usage (#2042)
+- Bring back <base> and <link> tags in HTML messages
+- Fix XSS vulnerability through background attributes [CVE-2009-0413]
+- Fix problems with backslash as IMAP hierarchy delimiter (#1116)
+- Secure vcard export by getting rid of preg's 'e' modifier use (#2045)
+- Fix authentication when submitting form with existing session (#2037)
+- Allow absolute URLs to images in HTML messages/sigs (#2029)
+- Fix message body which contains both inline attachments and emotions
+- Fix SQL query execution errors handling in rcube_mdb2 class (#1907)
+- Fix address names with '@' sign handling (#2022)
+- Improve messages display performance
+- Fix messages searching with 'to:' modifier
+
+RELEASE 0.2-STABLE
+------------------
+- Fix mark popup in IE 7 (#1785)
+- Fix line-break issue when copy & paste in Firefox (#1832)
+- Fix autocomplete "unknown server error" (#2008)
+- Fix STARTTLS before AUTH in SMTP connection (#1415)
+- Support multiple quota values in QUOTAROOT resonse (#1999)
+- Only abbreviate file name for IE < 7 browsers (#1548)
+- Performance: allow setting imap rootdir and delimiter before connect (#1628)
+- Fix sorting of folders with more than 2 levels (#1953)
+- Fix search results page jumps in LDAP addressbook (#1689)
+- Fix empty line before the signature in IE (#1769)
+- Fix horizontal scrollbar in preview pane on IE (#1228)
+- Add Robots meta tag in login page and installer (#1385)
+- Added 'show_images' option, removed 'addrbook_show_images' (#1977)
+- Option to check for new mails in all folders (#1053)
+- Don't set client busy when checking for new messages (#1706)
+- Allow UTF-8 folder names in config (#1960)
+- Add junk_mbox option configuration in installer (#1960)
+- Do serverside addressbook queries for autocompletion (#1925)
+- Allow setting attachment col position in 'list_cols' option
+- Allow override 'list_cols' via skin (#1958)
+- Fix 'cache' table cleanup on session destroy (#1913)
+- Increase speed of session destroy and garbage clean up
+- Fix session timeout when DB server got clock skew (#1890)
+- Fix handling of some malformed messages (#1099)
+- Speed up raw message body handling
+- Better HTML entities conversion in html2text (#1916)
+- Fix big memory consumption and speed up searching on servers without SORT capability
+- Fix setting locale to tr_TR, ku and az_AZ (#1872) 
+- Use SORT for searching on servers with SORT capability
+- Added message status filter
+- Fix empty file sending (#1801)
+- Improved searching with many criterias (calling one SEARCH command)
+- Fix HTML editor initialization on IE (#1731)
+- Add warning when switching editor mode from html to plain (#1888)
+- Make identities list scrollable (#1930)
+- Fix problem with numeric folder names (#1922)
+- Added BYE response simple support to prevent from endless loops in imap.inc (#777)
+- Fix unread message unintentionally marked as read if read_when_deleted=true (#1819)
+- Remove port number from SERVER_NAME in smtp_helo_host (#1915)
+- Don't send disposition notification receipts for messages marked as 'read' (#1918)
+- Added 'keep_alive' and 'min_keep_alive' options (#1777)
+- Added option 'identities_level', removed 'multiple_identities'
+- Allow deleting identities when multiple_identities=false (#1840)
+- Added option focus_on_new_message (#1789)
+- Fix html2text class autoloading on Windows (#1904)
+- Fix html signature formatting when identity save error occurred (#1833)
+- Add feedback and set busy when moving folder (#1897)
+- Fix 'Empty' link visibility for some languages e.g. Slovak (#1889)
+- Fix messages count bar overlapping (#1703)
+- Fix adding signature in drafts compose mode (#1884)
+- Fix iil_C_Sort() to support very long and/or divided responses (#1713)
+- Fix matching case sensitivity when setting identity on reply (#1881)
+- Prefer default identity on reply
+- Fix imap searching on ISMail server (#1870)
+- Add css class for flagged messages (#1868)
+- Write username instead of id in sendmail log (#1879)
+- Fix htmlspecialchars() use for PHP version < 5.2.3 (#1877)
+- Fix js keywords escaping in json_serialize() for IE/Opera (#1874)
+- Added bin/killcache.php script (#1839)
+- Add support for SJIS, GB2312, BIG5 in rc_detect_encoding()
+- Fix vCard file encoding detection for non-UTF-8 strings (#1820)
+- Add 'skip_deleted' option in User Preferences (#1850)
+- Minimize "inline" javascript scripts use (#1838)
+- Fix css class setting for folders with names matching defined classes names (#1772)
+- Fix race conditions when changing mailbox
+- Fix spellchecking when switching to html editor (#1779)
+- Fix compose window width/height (#1807)
+- Allow calling msgimport.sh/msgexport.sh from any directory (#1837)
+- Localized filesize units (#1760)
+- Better handling of "no identity" and "no email in identity" situations (#1592)
+- Added 'mime_param_folding' option with possibility to choose long/non-ascii attachment names encoding eg. to be readable in MS Outlook/OE (#1743)
+- Added "advanced options" feature in User Preferences
+- Fix unread counter when displaying cached massage in preview panel (#1720)
+- Fix htmleditor spellchecking on MS Windows (#1808)
+- Fix problem with non-ascii attachment names in Mail_mime (#1700, #1576)
+- Fix language autodetection (#1812)
+- Fix button label in folders management (#1816)
+- Fix collapsed folder not indicating unread msgs count of all subfolders (#1814)
+- Fix handling of apostrophes in filenames decoded according to rfc2231
+
+RELEASE 0.2-BETA
+----------------
+- Made config files location configurable (#1664)
+- Reduced memory footprint when forwarding attachments (#1764)
+- Allow and use spellcheck attribute for input/textarea fields (#1545)
+- Added icons for forwarded/forwarded+replied messages (#1691)
+- Added Reply-To to forwarded emails (#1739)
+- Display progress message for folders create/delete/rename (#1774)
+- Smart Tags and NOBR tag support in html messages (#1780, #1748)
+- Redesign of the identities settings (#836)
+- Add config option to disable creation/deletion of identities (#1139)
+- Added 'sendmail_delay' option to restrict messages sending interval (#1135)
+- Added vertical splitter for folders list resizing
+- Added possibility to view all headers in message view
+- Fixed splitter drag/resize on Opera (#1626)
+- Fixed quota img height/width setting from template (#1396)
+- Refactor drag & drop functionality. Don't rely on browser events anymore (#1108)
+- Insert "virtual" folders in subscription list (#1333)
+- Added link to open message in new window
+- Enable export of address book contacts as vCard
+- Add feature to import contacts from vcard files (#395)
+- Respect Content-Location headers in multipart/related messages according to RFC2110 (#1464)
+- Allowed max. attachment size now indicated in compose screen (#1523)
+- Also capture backspace key in list mode (#1186)
+- Allow application/pgp parts to be displayed (#1309)
+- Correctly handle options in mailto-links (#1671)
+- Immediately save sort_col/sort_order in user prefs (#1698)
+- Truncate very long (above 50 characters) attachment filenames when displaying
+- Allow to auto-detect client language if none set (#1095)
+- Auto-detect the client timezone (user configurable)
+- Add RFC2231 header value continuations support for attachment filenames + hack for servers that not support that feature
+- Fix Reply-To header displaying (#1738)
+- Mark form buttons that provide the most obvious operation (mainaction)
+- Added option 'quota_zero_as_unlimited' (#1206)
+- Added PRE handling in html2text class (#1301)
+- Added folder hierarchy collapsing
+- Added options to use syslog instead of log file (#1389)
+- Added Logging & Debugging section in Installer
+- Fix In-Reply-To and References headers when composing saved draft message (#1718)
+- Fix html message charset conversion for charsets with underline (#1717) 
+- Fix buttons status after contacts deletion (#1675)
+- Fix escaping of To: and From: fields when building message body for reply or forward in the HTML editor (#1432)
+- Use current mailbox name in template (#1690)
+- Better fix for skipping untagged responses (#1694)
+- Added pspell support patch by Kris Steinhoff (#781)
+- Enable spellchecker for HTML editor (#1589)
+- Respect spellcheck_uri in tinyMCE spellchecker (#941)
+- Case insensitive contacts searching using PostgreSQL (#1692)
+- Make default imap folders configurable for each user (#1558)
+- Save outgoing mail to selectable folder (#1324581)
+- Fix hiding of mark menu when clicking th button again (#1463)
+- Use long date format in print mode (#1643)
+- Updated TinyMCE to version 3.1.0.1
+- Re-enable autocomplete attribute for login form (#1661)
+- Check PERMANENTFLAGS before saving $MDNSent flag (#1478, #1485163)
+- Added flag column on messages list (#1220)
+- Patched Mail/MimePart.php (http://pear.php.net/bugs/bug.php?id=14232)
+- Allow trash/junk subfolders to be purged (#1568)
+- Store compose parameters in session and redirect to a unique URL
+- Fixed CRAM-MD5 authentication (#1364)
+- Fixed forwarding messages with one HTML attachment (#1103)
+- Fixed encoding of message/rfc822 attachments and image/pjpeg handling (#1439)
+- Added option to select skin in user preferences
+- Added option to configure displaying of attached images below the message body
+- Added option to display images in messages from known senders (#1204)
+- User preferences grouped in more fieldsets
+- Fix corrupted MIME headers of messages in Sent folder (#1587)
+- Fixed bug in MDB2 package: http://pear.php.net/bugs/bug.php?id=14124
+- Use keypress instead of keydown to select list's row (#1362)
+- Don't call expunge and don't remove message row after message move if flag_for_deletion is set to true (#1505)
+
+RELEASE 0.2-ALPHA
+-----------------
+- Added option to disable autocompletion from selected LDAP address books (#1445)
+- TLS support in LDAP connections: 'use_tls' property (#1581)
+- Fixed removing messages from search set after deleting them (#1583)
+- imap.inc: Fixed iil_C_FetchStructureString() to handle many 
+  literal strings in response (#1483)
+- Support for subfolders in default/protected folders (#1250)
+- Disallowed delimiter in folder name (#1351)
+- Support " and \ in folder names
+- Escape \ in login (#1214)
+- Better HTML sanitization with the DOM-based washtml script (#1276)
+- Fixed sorting of folders with non-ascii characters
+- Fixed Mysql DDL for default identities creation (#1554)
+- In Preferences added possibility to configure 'read_when_deleted',
+  'mdn_requests', 'flag_for_deletion' options
+- Made IMAP auth type configurable (#683)
+- Fixed empty values with FROM_UNIXTIME() in rcube_mdb2 (#1540)
+- Fixed attachment list on IE 6/7 (#1355)
+- Fixed JavaScript in compose.html that shows cc/bcc fields if populated
+- Make password input fields of type password in installer (#1417)
+- Don't attempt to delete cache entries if enable_caching is FALSE (#1537)
+- Optimized messages sorting on servers without sort capability (#1535)
+- Corrected message headers decoding when charset isn't specified and improved
+  support for native languages (#1536, #1534)
+- Expanded LDAP configuration options to support LDAP server writes.
+- Installer: encode special characters in DB username/password (#1529)
+- Fixed management of folders with national characters in names (#1526, #1504)
+- Fixed identities saving when using MDB2 pgsql driver (#1525)
+- Fixed BCC header reset (#1501)
+- Improved messages list performance - patch from Justin Heesemann
+- Append skin_path to images location only when it starts with '/' sign (#1398)
+- Fix IMAP response in message body when message has no body (#1479)
+- Fixed non-RFC dates formatting (#1429)
+- Fixed typo in set_charset() (#1498)
+- Decode entities when inserting HTML signature to plain text message (#1497)
+- HTML editing is now working with PHP5 updates and TinyMCE v3.0.6
+- Fixed signature loading on Windows (#1169)
+- Added language support to HTML editing (#1401)
+- Fixed remove signature when replying (#446)
+- Fixed problem with line with a space at the end (#1440)
+- Fixed <!DOCTYPE> tag filtering (#1066)
+- Fixed <?xml> tag filtering (#1075)
+- Added sections (fieldset+label) in Settings interface
+- Mark as read in one action with message preview (#1486)
+- Deleted redundant quota reads (#1486)
+- Added options for empty trash and expunge inbox on logout (#707)
+- Removed lines wrapping when displaying message
+- Fixed month localization
+- Changed codebase to PHP5 with autoloader
+
+RELEASE 0.1.1
+-------------
+- Clear selection when selecting single item (#1461)
+- Remove hard-coded image size in skin templates (#1423)
+- Database schema improvements (dropped unnecessary indexes)
+- Fixed creating a new folder with a comma in its name (#1263)
+- Fixed sorting of messages when default mailbox is empty (#1020)
+- Improve message previewpane - less loading (#1019)
+- Fixed login form autoompletion (#1378)
+- Fixed virtuser_query option for mdb2 backend (#1409)
+- Fixed attachment resoting from Drafts when message body was empty (#1144)
+- Fixed usage of ob_gzhandler (#1390)
+- Fixed message part window in IE6 (#1211)
+- Fixed decoding of mime-encoded strings (#938)
+- Fixed some iconv/mb_string problems (#1202)
+- Correctly quote mailbox name when using in URL (#1016)
+- Fixed "headers already sent" errors (#1399)
+
+RELEASE 0.1-STABLE
+------------------
+- Added interactive installer script
+- Fix folder adding/renaming inspired by #1349
+- Localize folder name in page title (#1338)
+- Fix code using wrong variable name (#818)
+- Allow to send mail with BCC recipients only
+- condense TinyMCE toolbar down to one line, removing table buttons (#1306)
+- Add function to mark the selected messages as read/unread (#641)
+- Also do charset decoding as suggested in RFC 2231 (fix #1022)
+- Show message count in folder list and hint when creating a subfolder
+- Distinguish ssl and tls for imap connections (#1252)
+- Added some charset aliases to fix typical mis-labelling (#1185)
+- Remember decision to display images for a certain message during session (#1310)
+- Truncate attachment filenames to 55 characters due to an IE bug (#1313)
+- Make sending of read receipts configurable
+- Respect config when localize folder names (#1280)
+- Also respect receipt and priority settings when re-opening a draft message
+- Remember search results (closes #722), patch by the_glu
+- Add Received header on outgoing mail
+- Upgrade to TinyMCE 2.1.3
+- Allow inserting image attachments into HTML messages while composing (#1179)
+- Implement Message-Disposition-Notification (Receipts)
+- Fix overriding of session vars when register_globals is on (#1255)
+- Fix bug with case-sensitive folder names (#973)
+- Don't create default folders by default
+- Fixed some potential security risks (audited by Andris)
+- Only show new messages if they match the current search (#925)
+- Switch to/from when searcing in Sent folder (#1177)
+- Correctly read the References header (#1236)
+- Unset old cookie before sending a new value (#1232)
+- Correctly decode attachments when downloading them (#1235 and #1484642)
+- Suppress IE errors when clearing attachments form (#1043)
+- Log error when login fails due to auto_create_user turned off
+- Filter linked/imported CSS files (closes #844)
+- Improve message compose screen (closes #1060)
+- Select next row after removing one from list (#1063)
+
+RELEASE 0.1-RC2
+---------------
+- Enable drag-&-dropping of folders to a new parent and allow to create subfolders (#637)
+- Suppress IE errors when clearing attachments form (#1043)
+- Set preferences field in user table to NULL (#1062)
+- Log error when login fails due to auto_create_user turned off
+- Filter linked/imported CSS files (closes #844)
+- Improve message compose screen (closes #1060)
+- Select next row after removing one from list (#1063)
+- Make smtp HELO/EHLO hostname configurable (#851)
+- IPv6 Compatability (#1023), Patch #1484373
+- Unlock interface when message sending fails (#1188)
+- Eval PHP code in template includes (if configured)
+- Show message when folder is empty. Mo more static text in table (#1068)
+- Only display unread count in page title when new messages arrived
+- Fixed wrong delete button tooltip (#785)
+- Fixed charset encoding bug (#1091)
+- Applied patch for LDAP version (#1175)
+- Improved XHTML validation
+- Fix message list selection (#1174)
+- Better fix lowercased usernames (#1120)
+- Update pngbehavior Script as suggested in #1134
+- Fixed moving/deleting messages when more than 1 is selected
+- Applied patch for LDAP contacts listing by Glen Ogilvie
+- Applied patch for more address fields in LDAP contacts (#1074)
+- Add alternative for getallheaders() (fix #1146)
+- Identify mailboxes case-sensitive
+- Sort mailbox list case-insensitive (closes #1032)
+- Fix display of multipart messages from Apple Mail (closes #823)
+- Protect AJAX request from being fetched by a foreign site (XSS)
+- Make autocomplete for loginform configurable by the skin template
+- Fix compose function from address book (closes #1089)
+- Added //IGNORE to iconv call (patch #1086, closes #821)
+- Check if mbstring supports charset (#1003 and #1004)
+- Prefer iconv over mbstring (as suggested in #1004)
+- Check filesize of template includes (#1079)
+- Fixed bug with buttons not dimming/enabling properly after switching folders
+- Fixed compose window becoming unresponsive after saving a draft (#1132)
+- Re-enabled "Back" button in compose window now that bug #1132 is fixed
+- Fixed unresponsive interface issue when downloading attachments (#1138)
+- Lowered status message time from 5 to 3 seconds to improve responsiveness
+- Raised .htaccess upload_max_filesize from 2M to 5M to differ from default php.ini
+- Increased "mailboxcontrols" mail.css width from 160 to 170px to fix non-english languages (#1140)
+- Fix status message bug #1114 with regard to #1041
+- Fix address adding bug reported by David Koblas
+- Applied socket error patch by Thomas Mangin
+- Pass-by-reference workarround for PHP5 in sendmail.inc
+- Fixed buggy imap_root settings (closes #1056)
+- Prevent default events on subject links (#1071)
+- Use HTTP-POST requests for actions that change state
+
+RELEASE 0.1-RC1
+---------------
+- Use global filters and bind username/ for Ldap searches (#909)
+- Hide quota display if imap server does not support it
+- Hide address groups if no LDAP servers configured
+- Add link to message subjects (closes #982)
+- Better SQL query for contact listing/search (closes #1051)
+- Fixed marking as read in preview pane (closes #1048)
+- CSS hack to display attachments correctly in IE6
+- Wrap message body text (closes #901)
+- LDAP access is back in address book (closes #864)
+- Added search function for contacts
+- New Template parsing and output encoding
+- Fixed bugs #884 and #793
+- Fixed message moving procedure (closes #1013)
+- Fixed display of multiple attachments (closes #647)
+- Fixed check for new messages (closes #1015)
+- List attachments without filename
+- New session authentication: Change sessid cookie when login, authentication with sessauth cookie is now configurable.
+  Should close bugs #774 and #1484299
+- Correctly translate mailbox names (closes #993)
+- Quote e-mail address links (closes #1007)
+- Updated PEAR::Mail_mime package
+- Accept single quotes for HTML attributes when modifying message body (thanks Jason)
+- Sanitize input for new users/identities (thanks Colin Alston)
+- Don't download HTML message parts
+- Convert HTML parts to plaintext if 'prefer_html' is off
+- Correctly parse message/rfc822 parts (closes #838)
+- Also use user_id for unique key in messages table (closes #857)
+- Hide contacts drop down on blur (closes #946)
+- Make entries in contacts drop down clickable
+- Turn off browser autocompletion on login page
+- Quote <? in text/html message parts
+- Hide border around radio buttons
+- Applied patch for attachment download by crichardson (closes #943)
+- Fixed bug in Postgres DB handling (closes #852)
+- Fixed bug of invalid calls to fetchRow() in rcube_db.inc (closes #996)
+- Fixed array_merge bug (closes #997)
+- Fixed flag for deletion in list view (closes #987)
+- Finally support semicolons as recipient separator (closes ##976)
+- Fixed message headers (subject) encoding
+- check if safe mode is on or not (closes #990)
+- Show "no subject" in message list if subject is missing (closes #971)
+- Solved page caching of message preview (closes #905)
+- Only use gzip compression if configured (closes #967)
+- Fixed priority selector issue (#903)
+- Fixed some CSS issues in default skin (closes #951 and #911)
+- Prevent from double quoting of numeric HTML character references (closes #978)
+- Fixed display of HTML message attachments (closes #927)
+- Applied patch for preview caching (closes #933)
+- Added error handling for attachment uploads
+- Use multibyte safe string functions where necessary (closes #798)
+- Applied security patch to validate the submitted host value (by Kees Cook)
+- Applied security patch to validate input values when deleting contacts (by Kees Cook)
+- Applied security patch that sanitizes emoticon paths when attaching them (by Kees Cook)
+- Applied a patch to more aggressively sanitize a HTML message
+- Visualize blocked images in HTML messages
+- Fixed wrong message listing when showing search results (closes #890)
+- Show remote images when opening HTML message part as attachment
+- Improve memory usage when sending mail (closes #871)
+- Mark messages as read once the preview is loaded (closes #1484132)
+- Include smtp final response in log (closes #862)
+- Corrected date string in sent message header (closes #887)
+- Correclty choose "To" column in sent and draft mailboxes (closes #769)
+- Changed srong tooltips for message browse buttons (closes #757)
+- Fixed signature delimeter character to be standard (Bug #830)
+- Fixed XSS vulnerability (Bug #877)
+- Remove newlines from mail headers (Bug #827)
+- Selection issues when moving/deleting (Bug #837)
+- Applied patch of Clement Moulin for imap host auto-selection
+- ISO-encode IMAP password for plaintext login (Bugs #792 & #723)
+- Fixed folder name encoding in subscription list (Bug #879)
+- Fixed JS errors in identity list (Bug #885)
+- Translate foldernames in folder form (closes #879)
+- Added first and last buttons to message list, address book
+  and message detail
+- Pressing Shift-Del bypasses Trash folder
+- Enable purge command for Junk folder
+- Fetch all aliases if virtuser_query is used instead
+- Re-enabled multi select of contacts (Bug #817)
+- Enable contact editing right after creation (Bug #644)
+- Correct UTF-7 to UTF-8 conversion if mbstring is not available
+- Fixed IMAP fetch of message body (Bug #819)
+- Fixed safe_mode problems (Bug #539)
+- Fixed wrong header encoding (Bug #1483976)
+- Made automatic draft saving configurable
+- Fixed JS bug when renaming folders (Bug #799)
+- Added quota display as image (by Brett Patterson)
+- Corrected creation of a message-id
+- New indentation for quoted message text
+- Improved HTML validity
+- Fixed URL character set (Ticket #616)
+- Fixed saving of contact into MySQL from LDAP query results (Ticket #681)
+- Fixed folder renaming: unsubscribe before rename (Bug #750)
+- Finalized new message parsing (+ chaching)
+- Fixed wrong usage of mbstring (Bug #645)
+- Set default spelling language (Ticket #764)
+- Added support for Nox Spell Server
+- Re-built message parsing (Bug #422)
+  Now based on the message structure delivered by the IMAP server.
+- Fixed some XSS and SQL injection issues
+- Fixed charset problems with folder renaming

+ 269 - 0
data/web/rc/INSTALL

@@ -0,0 +1,269 @@
+INTRODUCTION
+============
+
+This file describes the basic steps to install Roundcube Webmail on your
+web server. For additional information, please also consult the project's
+wiki page at https://github.com/roundcube/roundcubemail/wiki
+
+
+REQUIREMENTS
+============
+
+* An IMAP, HTTP and SMTP server
+* .htaccess support allowing overrides for DirectoryIndex
+* PHP Version 5.4 or greater including:
+   - PCRE, DOM, JSON, Session, Sockets, OpenSSL, Mbstring (required)
+   - PHP PDO with driver for either MySQL, PostgreSQL, SQL Server, Oracle or SQLite (required)
+   - Iconv, Zip, Fileinfo, Intl, Exif (recommended)
+   - LDAP for LDAP addressbook support (optional)
+* PEAR and PEAR packages distributed with Roundcube or external:
+   - Mail_Mime 1.10.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)
+   - Crypt_GPG 1.6.0 or newer (for enigma plugin)
+   - Endroid/QrCode 1.6.0 or newer (https://github.com/endroid/QrCode)
+* php.ini options (see .htaccess file):
+   - error_reporting E_ALL & ~E_NOTICE & ~E_STRICT
+   - memory_limit > 16MB (increase as suitable to support large attachments)
+   - file_uploads enabled (for attachment upload features)
+   - session.auto_start disabled
+   - suhosin.session.encrypt disabled
+   - mbstring.func_overload disabled
+* A MySQL, PostgreSQL, MS SQL Server (2005 or newer), Oracle database
+  or SQLite support in PHP - with permission to create tables
+* Composer installed either locally or globally (optional, for plugin installation)
+
+
+INSTALLATION
+============
+
+1. Decompress and put this folder somewhere inside your document root
+2. In case you don't use the so-called "complete" release package,
+  you have to install PHP and javascript dependencies.
+  2.1. Install PHP dependencies using composer:
+    - 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`
+  2.2. Install Javascript dependencies by executing `bin/install-jsdeps.sh` script.
+3. Make sure that the following directories (and the files within)
+   are writable by the webserver
+   - /temp
+   - /logs
+4. Create a new database and a database user for Roundcube (see DATABASE SETUP)
+5. Point your browser to http://url-to-roundcube/installer/
+6. Follow the instructions of the install script (or see MANUAL CONFIGURATION)
+7. After creating and testing the configuration, remove the installer directory
+8. Check Known Issues section of this file
+
+
+CONFIGURATION HINTS
+===================
+
+IMPORTANT! Read all comments in defaults.inc.php, understand them
+and configure your installation to be not surprised by default behaviour.
+
+Roundcube writes internal errors to the 'errors' log file located in the logs
+directory which can be configured in config/config.inc.php. If you want ordinary
+PHP errors to be logged there as well, enable the 'php_value error_log' line
+in the .htaccess file and set the path to the log file accordingly.
+
+By default the session_path settings of PHP are not modified by Roundcube.
+However if you want to limit the session cookies to the directory where
+Roundcube resides you can uncomment and configure the according line
+in the .htaccess file.
+
+
+DATABASE SETUP
+==============
+
+Note: Database for Roundcube must use UTF-8 character set.
+Note: See defaults.inc.php file for examples of DSN configuration.
+
+* MySQL
+-------
+Setting up the mysql database can be done by creating an empty database,
+importing the table layout and granting the proper permissions to the
+roundcube user. Here is an example of that procedure:
+
+# mysql
+> CREATE DATABASE roundcubemail /*!40101 CHARACTER SET utf8 COLLATE utf8_general_ci */;
+> GRANT ALL PRIVILEGES ON roundcubemail.* TO roundcube@localhost
+    IDENTIFIED BY 'password';
+> quit
+
+# mysql roundcubemail < SQL/mysql.initial.sql
+
+Note 1: 'password' is the master password for the roundcube user. It is strongly
+recommended you replace this with a more secure password. Please keep in
+mind: You need to specify this password later in 'config/db.inc.php'.
+
+
+* SQLite
+--------
+Versions of sqlite database engine older than 3 aren't supported.
+Database file and structure is created automatically by Roundcube.
+Make sure your configuration points to some file location and that the
+webserver can write to the file and the directory containing the file.
+
+
+* PostgreSQL
+------------
+To use Roundcube with PostgreSQL support you have to follow these
+simple steps, which have to be done as the postgres system user (or
+which ever is the database superuser):
+
+$ createuser -P roundcube
+$ createdb -O roundcube -E UNICODE roundcubemail
+$ psql -U roundcube -f SQL/postgres.initial.sql roundcubemail
+
+Note: in some system configurations you might need to add '-U postgres' to
+createuser and createdb commands.
+
+
+* Microsoft SQL Server
+----------------------
+Language/locale of the database must be set to us_english (1033). More info
+on this at https://github.com/roundcube/roundcubemail/issues/4078.
+
+
+Database cleaning
+-----------------
+To keep your database slick and clean we recommend to periodically execute
+bin/cleandb.sh which finally removes all records that are marked as deleted.
+Best solution is to install a cronjob running this script daily.
+
+
+MANUAL CONFIGURATION
+====================
+
+First of all, copy the sample configuration file config/config.inc.php.sample
+to config/config.inc.php and make the necessary adjustments according to your
+environment and your needs. More configuration options can be copied from the
+config/defaults.inc.php file into your local config.inc.php file as needed.
+Read the comments above the individual configuration options to find out what
+they do or read https://github.com/roundcube/roundcubemail/wiki/Installation
+for even more guidance.
+
+You can also modify the default .htaccess file. This is necessary to
+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
+=========
+
+If you already have a previous version of Roundcube installed,
+please refer to the instructions in UPGRADING guide.
+
+
+OPTIMISING
+==========
+
+There are two forms of optimisation here, compression and caching, both aimed
+at increasing an end user's experience using Roundcube Webmail. Compression
+allows the static web pages to be delivered with less bandwidth. The index.php
+of Roundcube Webmail already enables compression on its output. The settings
+below allow compression to occur for all static files. Caching sets HTTP 
+response headers that enable a user's web client to understand what is static
+and how to cache it.
+
+The caching directives used are:
+ * Etags - sets at tag so the client can request is the page has changed
+ * Cache-control - defines the age of the page and that the page is 'public'
+   This enables clients to cache javascript files that don't have private 
+   information between sessions even if using HTTPS. It also allows proxies
+   to share the same cached page between users.
+ * Expires - provides another hint to increase the lifetime of static pages.
+
+For more information refer to RFC 2616.
+
+Side effects:
+-------------
+These directives are designed for production use. If you are using this in
+a development environment you may get horribly confused if your webclient
+is caching stuff that you changed on the server. Disabling the expires 
+parts below should save you some grief.
+
+If you are changing the skins, it is recommended that you copy content to 
+a different directory apart from 'default'.
+
+Apache:
+-------
+To enable these features in apache the following modules need to be enabled:
+ * mod_deflate
+ * mod_expires
+ * mod_headers
+
+The optimisation is already included in the .htaccess file in the top 
+directory of your installation.
+
+If you are using Apache version 2.2.9 and later, in the .htaccess file
+change the 'append' word to 'merge' for a more correct response. Keeping
+as 'append' shouldn't cause any problems though changing to merge will 
+eliminate the possibility of duplicate 'public' headers in Cache-control.
+
+Lighttpd:
+---------
+With Lightty the addition of Expire: tags by mod_expire is incompatible with
+the addition of "Cache-control: public". Using Cache-control 'public' is 
+used below as it is assumed to give a better caching result.
+
+Enable modules in server.modules:
+    "mod_setenv"
+    "mod_compress"
+
+Mod_compress is a server side cache of compressed files to improve its performance.
+
+$HTTP["host"] == "www.example.com" {
+
+    static-file.etags = "enable"
+    # http://redmine.lighttpd.net/projects/lighttpd/wiki/Etag.use-mtimeDetails
+    etag.use-mtime = "enable"
+
+    # http://redmine.lighttpd.net/projects/lighttpd/wiki/Docs:ModSetEnv
+    $HTTP["url"] =~ "^/roundcubemail/(plugins|skins|program)" {
+        setenv.add-response-header  = ( "Cache-Control" => "public, max-age=2592000")
+    }
+
+    # http://redmine.lighttpd.net/projects/lighttpd/wiki/Docs:ModCompress
+    # set compress.cache-dir to somewhere outside the docroot.
+    compress.cache-dir   = var.statedir + "/cache/compress"
+
+    compress.filetype = ("text/plain", "text/html", "text/javascript", "text/css", "text/xml", "image/gif", "image/png")
+}
+
+
+KNOWN ISSUES
+============
+
+Installations with uw-imap server should set imap_disabled_caps = array('ESEARCH')
+in main configuration file. ESEARCH implementation in this server is broken (#1489184).

+ 674 - 0
data/web/rc/LICENSE

@@ -0,0 +1,674 @@
+                    GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+    <program>  Copyright (C) <year>  <name of author>
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+  The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.

+ 93 - 0
data/web/rc/README.md

@@ -0,0 +1,93 @@
+Roundcube Webmail 
+=================
+[roundcube.net](http://roundcube.net)
+
+
+INTRODUCTION
+------------
+Roundcube Webmail is a browser-based multilingual IMAP client with an
+application-like user interface. It provides full functionality you expect
+from an email client, including MIME support, address book, folder management,
+message searching and spell checking. Roundcube Webmail is written in PHP and
+requires the MySQL, PostgreSQL or SQLite database. With its plugin API it is
+easily extendable and the user interface is fully customizable using skins
+which are pure XHTML and CSS 2.
+
+The code is mainly written in PHP and is designed to run on a webserver.
+It includes other open-source classes/libraries from [PEAR][pear],
+an IMAP library derived from [IlohaMail][iloha] the [TinyMCE][tinymce] rich
+text editor, [Googiespell][googiespell] library for spell checking or
+the [WASHTML][washtml] sanitizer by Frederic Motte.
+
+The current default skin 'Larry' was kindly created by FLINT / Büro für
+Gestaltung, Berne, Switzerland.
+
+
+INSTALLATION
+------------
+For detailed instructions on how to install Roundcube webmail on your server,
+please refer to the INSTALL document in the same directory as this document.
+
+If you're updating an older version of Roundcube please follow the steps
+described in the UPGRADING file.
+
+
+LICENSE
+-------
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License (**with exceptions
+for skins & plugins**) as published by the Free Software Foundation,
+either version 3 of the License, or (at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see [www.gnu.org/licenses/][gpl].
+
+This file forms part of the Roundcube Webmail Software for which the
+following exception is added: Plugins and Skins which merely make
+function calls to the Roundcube Webmail Software, and for that purpose
+include it by reference shall not be considered modifications of
+the software.
+
+If you wish to use this file in another project or create a modified
+version that will not be part of the Roundcube Webmail Software, you
+may remove the exception above and use this source code under the
+original version of the license.
+
+For more details about licensing and the exceptions for skins and plugins
+see [roundcube.net/license][license]
+
+
+CONTRIBUTION
+------------
+Want to help make Roundcube the best webmail solution ever?
+Roundcube is open source software. Our developers and contributors all
+are volunteers and we're always looking for new additions and resources.
+For more information visit [roundcube.net/contribute][contrib]
+
+
+CONTACT
+-------
+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:
+hello(at)roundcube(dot)net
+
+
+[pear]:         http://pear.php.net
+[iloha]:        http://sourceforge.net/projects/ilohamail/
+[tinymce]:      http://www.tinymce.com/
+[googiespell]:  http://orangoo.com/labs/GoogieSpell/
+[washtml]:      http://www.ubixis.com/washtml/
+[kmgerich]:     http://kmgerich.com/
+[gpl]:          http://www.gnu.org/licenses/
+[license]:      http://roundcube.net/license
+[contrib]:      http://roundcube.net/contribute
+[support]:      http://roundcube.net/support
+[githubissues]: https://github.com/roundcube/roundcubemail/issues

+ 400 - 0
data/web/rc/SQL/mssql.initial.sql

@@ -0,0 +1,400 @@
+CREATE TABLE [dbo].[cache] (
+	[user_id] [int] NOT NULL ,
+	[cache_key] [varchar] (128) COLLATE Latin1_General_CI_AI NOT NULL ,
+	[expires] [datetime] NULL ,
+	[data] [text] COLLATE Latin1_General_CI_AI NOT NULL 
+) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
+GO
+
+CREATE TABLE [dbo].[cache_shared] (
+	[cache_key] [varchar] (255) COLLATE Latin1_General_CI_AI NOT NULL ,
+	[expires] [datetime] NULL ,
+	[data] [text] COLLATE Latin1_General_CI_AI NOT NULL 
+) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
+GO
+
+CREATE TABLE [dbo].[cache_index] (
+	[user_id] [int] NOT NULL ,
+	[mailbox] [varchar] (128) COLLATE Latin1_General_CI_AI NOT NULL ,
+	[expires] [datetime] NULL ,
+	[valid] [char] (1) COLLATE Latin1_General_CI_AI NOT NULL ,
+	[data] [text] COLLATE Latin1_General_CI_AI NOT NULL 
+) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
+GO
+
+CREATE TABLE [dbo].[cache_thread] (
+	[user_id] [int] NOT NULL ,
+	[mailbox] [varchar] (128) COLLATE Latin1_General_CI_AI NOT NULL ,
+	[expires] [datetime] NULL ,
+	[data] [text] COLLATE Latin1_General_CI_AI NOT NULL 
+) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
+GO
+
+CREATE TABLE [dbo].[cache_messages] (
+	[user_id] [int] NOT NULL ,
+	[mailbox] [varchar] (128) COLLATE Latin1_General_CI_AI NOT NULL ,
+	[uid] [int] NOT NULL ,
+	[expires] [datetime] NULL ,
+	[data] [text] COLLATE Latin1_General_CI_AI NOT NULL ,
+	[flags] [int] NOT NULL
+) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
+GO
+
+CREATE TABLE [dbo].[contacts] (
+	[contact_id] [int] IDENTITY (1, 1) NOT NULL ,
+	[user_id] [int] NOT NULL ,
+	[changed] [datetime] NOT NULL ,
+	[del] [char] (1) COLLATE Latin1_General_CI_AI NOT NULL ,
+	[name] [varchar] (128) COLLATE Latin1_General_CI_AI NOT NULL ,
+	[email] [varchar] (8000) COLLATE Latin1_General_CI_AI NOT NULL ,
+	[firstname] [varchar] (128) COLLATE Latin1_General_CI_AI NOT NULL ,
+	[surname] [varchar] (128) COLLATE Latin1_General_CI_AI NOT NULL ,
+	[vcard] [text] COLLATE Latin1_General_CI_AI NULL ,
+	[words] [text] COLLATE Latin1_General_CI_AI NULL 
+) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
+GO
+
+CREATE TABLE [dbo].[contactgroups] (
+	[contactgroup_id] [int] IDENTITY (1, 1) NOT NULL ,
+	[user_id] [int] NOT NULL ,
+	[changed] [datetime] NOT NULL ,
+	[del] [char] (1) COLLATE Latin1_General_CI_AI NOT NULL ,
+	[name] [varchar] (128) COLLATE Latin1_General_CI_AI NOT NULL
+) ON [PRIMARY] 
+GO
+
+CREATE TABLE [dbo].[contactgroupmembers] (
+	[contactgroup_id] [int] NOT NULL ,
+	[contact_id] [int] NOT NULL ,
+	[created] [datetime] NOT NULL
+) ON [PRIMARY] 
+GO
+
+CREATE TABLE [dbo].[identities] (
+	[identity_id] [int] IDENTITY (1, 1) NOT NULL ,
+	[user_id] [int] NOT NULL ,
+	[changed] [datetime] NOT NULL ,
+	[del] [char] (1) COLLATE Latin1_General_CI_AI NOT NULL ,
+	[standard] [char] (1) COLLATE Latin1_General_CI_AI NOT NULL ,
+	[name] [varchar] (128) COLLATE Latin1_General_CI_AI NOT NULL ,
+	[organization] [varchar] (128) COLLATE Latin1_General_CI_AI NOT NULL ,
+	[email] [varchar] (128) COLLATE Latin1_General_CI_AI NOT NULL ,
+	[reply-to] [varchar] (128) COLLATE Latin1_General_CI_AI NOT NULL ,
+	[bcc] [varchar] (128) COLLATE Latin1_General_CI_AI NOT NULL ,
+	[signature] [text] COLLATE Latin1_General_CI_AI NULL, 
+	[html_signature] [char] (1) COLLATE Latin1_General_CI_AI NOT NULL
+) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
+GO
+
+CREATE TABLE [dbo].[session] (
+	[sess_id] [varchar] (128) COLLATE Latin1_General_CI_AI NOT NULL ,
+	[created] [datetime] NOT NULL ,
+	[changed] [datetime] NULL ,
+	[ip] [varchar] (40) COLLATE Latin1_General_CI_AI NOT NULL ,
+	[vars] [text] COLLATE Latin1_General_CI_AI NOT NULL 
+) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
+GO
+
+CREATE TABLE [dbo].[users] (
+	[user_id] [int] IDENTITY (1, 1) NOT NULL ,
+	[username] [varchar] (128) COLLATE Latin1_General_CI_AI NOT NULL ,
+	[mail_host] [varchar] (128) COLLATE Latin1_General_CI_AI NOT NULL ,
+	[created] [datetime] NOT NULL ,
+	[last_login] [datetime] NULL ,
+	[failed_login] [datetime] NULL ,
+	[failed_login_counter] [int] NULL ,
+	[language] [varchar] (5) COLLATE Latin1_General_CI_AI NULL ,
+	[preferences] [text] COLLATE Latin1_General_CI_AI NULL 
+) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
+GO
+
+CREATE TABLE [dbo].[dictionary] (
+	[user_id] [int] ,
+	[language] [varchar] (5) COLLATE Latin1_General_CI_AI NOT NULL ,
+	[data] [text] COLLATE Latin1_General_CI_AI NOT NULL 
+) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
+GO
+
+CREATE TABLE [dbo].[searches] (
+	[search_id] [int] IDENTITY (1, 1) NOT NULL ,
+	[user_id] [int] NOT NULL ,
+	[type] [tinyint] NOT NULL ,
+	[name] [varchar] (128) COLLATE Latin1_General_CI_AI NOT NULL ,
+	[data] [text] COLLATE Latin1_General_CI_AI NOT NULL 
+) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
+GO
+
+CREATE TABLE [dbo].[system] (
+	[name] [varchar] (64) COLLATE Latin1_General_CI_AI NOT NULL ,
+	[value] [text] COLLATE Latin1_General_CI_AI NOT NULL 
+) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
+GO
+
+ALTER TABLE [dbo].[cache] WITH NOCHECK ADD 
+	 PRIMARY KEY CLUSTERED 
+	(
+		[user_id],[cache_key]
+	) ON [PRIMARY] 
+GO
+
+ALTER TABLE [dbo].[cache_shared] WITH NOCHECK ADD 
+	 PRIMARY KEY CLUSTERED 
+	(
+		[cache_key]
+	) ON [PRIMARY] 
+GO
+
+ALTER TABLE [dbo].[cache_index] WITH NOCHECK ADD 
+	 PRIMARY KEY CLUSTERED 
+	(
+		[user_id],[mailbox]
+	) ON [PRIMARY] 
+GO
+
+ALTER TABLE [dbo].[cache_thread] WITH NOCHECK ADD 
+	 PRIMARY KEY CLUSTERED 
+	(
+		[user_id],[mailbox]
+	) ON [PRIMARY] 
+GO
+
+ALTER TABLE [dbo].[cache_messages] WITH NOCHECK ADD 
+	 PRIMARY KEY CLUSTERED 
+	(
+		[user_id],[mailbox],[uid]
+	) ON [PRIMARY] 
+GO
+
+ALTER TABLE [dbo].[contacts] WITH NOCHECK ADD 
+	CONSTRAINT [PK_contacts_contact_id] PRIMARY KEY  CLUSTERED 
+	(
+		[contact_id]
+	) ON [PRIMARY] 
+GO
+
+ALTER TABLE [dbo].[contactgroups] WITH NOCHECK ADD 
+	CONSTRAINT [PK_contactgroups_contactgroup_id] PRIMARY KEY CLUSTERED 
+	(
+		[contactgroup_id]
+	) ON [PRIMARY] 
+GO
+
+ALTER TABLE [dbo].[contactgroupmembers] WITH NOCHECK ADD 
+	CONSTRAINT [PK_contactgroupmembers_id] PRIMARY KEY CLUSTERED 
+	(
+		[contactgroup_id], [contact_id]
+	) ON [PRIMARY] 
+GO
+
+ALTER TABLE [dbo].[identities] WITH NOCHECK ADD 
+	 PRIMARY KEY  CLUSTERED 
+	(
+		[identity_id]
+	) ON [PRIMARY] 
+GO
+
+ALTER TABLE [dbo].[session] WITH NOCHECK ADD 
+	CONSTRAINT [PK_session_sess_id] PRIMARY KEY  CLUSTERED 
+	(
+		[sess_id]
+	) ON [PRIMARY] 
+GO
+
+ALTER TABLE [dbo].[users] WITH NOCHECK ADD 
+	CONSTRAINT [PK_users_user_id] PRIMARY KEY  CLUSTERED 
+	(
+		[user_id]
+	) ON [PRIMARY] 
+GO
+
+ALTER TABLE [dbo].[searches] WITH NOCHECK ADD 
+	CONSTRAINT [PK_searches_search_id] PRIMARY KEY CLUSTERED 
+	(
+		[search_id]
+	) ON [PRIMARY] 
+GO
+
+ALTER TABLE [dbo].[system] WITH NOCHECK ADD 
+	CONSTRAINT [PK_system_name] PRIMARY KEY CLUSTERED 
+	(
+		[name]
+	) ON [PRIMARY] 
+GO
+
+ALTER TABLE [dbo].[cache] ADD 
+	CONSTRAINT [DF_cache_user_id] DEFAULT ('0') FOR [user_id],
+	CONSTRAINT [DF_cache_cache_key] DEFAULT ('') FOR [cache_key],
+GO
+
+ALTER TABLE [dbo].[cache_index] ADD 
+	CONSTRAINT [DF_cache_index_valid] DEFAULT ('0') FOR [valid]
+GO
+
+ALTER TABLE [dbo].[cache_messages] ADD 
+	CONSTRAINT [DF_cache_messages_flags] DEFAULT (0) FOR [flags]
+GO
+
+CREATE INDEX [IX_cache_shared_cache_key] ON [dbo].[cache_shared]([cache_key]) ON [PRIMARY]
+GO
+
+CREATE INDEX [IX_cache_index_user_id] ON [dbo].[cache_index]([user_id]) ON [PRIMARY]
+GO
+
+CREATE INDEX [IX_cache_thread_user_id] ON [dbo].[cache_thread]([user_id]) ON [PRIMARY]
+GO
+
+CREATE INDEX [IX_cache_messages_user_id] ON [dbo].[cache_messages]([user_id]) ON [PRIMARY]
+GO
+
+CREATE INDEX [IX_cache_expires] ON [dbo].[cache]([expires]) ON [PRIMARY]
+GO
+
+CREATE INDEX [IX_cache_shared_expires] ON [dbo].[cache_shared]([expires]) ON [PRIMARY]
+GO
+
+CREATE INDEX [IX_cache_index_expires] ON [dbo].[cache_index]([expires]) ON [PRIMARY]
+GO
+
+CREATE INDEX [IX_cache_thread_expires] ON [dbo].[cache_thread]([expires]) ON [PRIMARY]
+GO
+
+CREATE INDEX [IX_cache_messages_expires] ON [dbo].[cache_messages]([expires]) ON [PRIMARY]
+GO
+
+ALTER TABLE [dbo].[contacts] ADD 
+	CONSTRAINT [DF_contacts_user_id] DEFAULT (0) FOR [user_id],
+	CONSTRAINT [DF_contacts_changed] DEFAULT (getdate()) FOR [changed],
+	CONSTRAINT [DF_contacts_del] DEFAULT ('0') FOR [del],
+	CONSTRAINT [DF_contacts_name] DEFAULT ('') FOR [name],
+	CONSTRAINT [DF_contacts_email] DEFAULT ('') FOR [email],
+	CONSTRAINT [DF_contacts_firstname] DEFAULT ('') FOR [firstname],
+	CONSTRAINT [DF_contacts_surname] DEFAULT ('') FOR [surname],
+	CONSTRAINT [CK_contacts_del] CHECK ([del] = '1' or [del] = '0')
+GO
+
+CREATE INDEX [IX_contacts_user_id] ON [dbo].[contacts]([user_id]) ON [PRIMARY]
+GO
+
+ALTER TABLE [dbo].[contactgroups] ADD 
+	CONSTRAINT [DF_contactgroups_user_id] DEFAULT (0) FOR [user_id],
+	CONSTRAINT [DF_contactgroups_changed] DEFAULT (getdate()) FOR [changed],
+	CONSTRAINT [DF_contactgroups_del] DEFAULT ('0') FOR [del],
+	CONSTRAINT [DF_contactgroups_name] DEFAULT ('') FOR [name],
+	CONSTRAINT [CK_contactgroups_del] CHECK ([del] = '1' or [del] = '0')
+GO
+
+CREATE INDEX [IX_contactgroups_user_id] ON [dbo].[contactgroups]([user_id]) ON [PRIMARY]
+GO
+
+ALTER TABLE [dbo].[contactgroupmembers] ADD 
+	CONSTRAINT [DF_contactgroupmembers_contactgroup_id] DEFAULT (0) FOR [contactgroup_id],
+	CONSTRAINT [DF_contactgroupmembers_contact_id] DEFAULT (0) FOR [contact_id],
+	CONSTRAINT [DF_contactgroupmembers_created] DEFAULT (getdate()) FOR [created]
+GO
+
+CREATE INDEX [IX_contactgroupmembers_contact_id] ON [dbo].[contactgroupmembers]([contact_id]) ON [PRIMARY]
+GO
+
+ALTER TABLE [dbo].[identities] ADD 
+	CONSTRAINT [DF_identities_user] DEFAULT ('0') FOR [user_id],
+	CONSTRAINT [DF_identities_del] DEFAULT ('0') FOR [del],
+	CONSTRAINT [DF_identities_standard] DEFAULT ('0') FOR [standard],
+	CONSTRAINT [DF_identities_name] DEFAULT ('') FOR [name],
+	CONSTRAINT [DF_identities_organization] DEFAULT ('') FOR [organization],
+	CONSTRAINT [DF_identities_email] DEFAULT ('') FOR [email],
+	CONSTRAINT [DF_identities_reply] DEFAULT ('') FOR [reply-to],
+	CONSTRAINT [DF_identities_bcc] DEFAULT ('') FOR [bcc],
+	CONSTRAINT [DF_identities_html_signature] DEFAULT ('0') FOR [html_signature],
+	CHECK ([standard] = '1' or [standard] = '0'),
+	CHECK ([del] = '1' or [del] = '0')
+GO
+
+CREATE INDEX [IX_identities_user_id] ON [dbo].[identities]([user_id]) ON [PRIMARY]
+GO
+CREATE INDEX [IX_identities_email] ON [dbo].[identities]([email],[del]) ON [PRIMARY]
+GO
+
+ALTER TABLE [dbo].[session] ADD 
+	CONSTRAINT [DF_session_sess_id] DEFAULT ('') FOR [sess_id],
+	CONSTRAINT [DF_session_ip] DEFAULT ('') FOR [ip]
+GO
+
+CREATE INDEX [IX_session_changed] ON [dbo].[session]([changed]) ON [PRIMARY]
+GO
+
+ALTER TABLE [dbo].[users] ADD 
+	CONSTRAINT [DF_users_username] DEFAULT ('') FOR [username],
+	CONSTRAINT [DF_users_mail_host] DEFAULT ('') FOR [mail_host],
+	CONSTRAINT [DF_users_created] DEFAULT (getdate()) FOR [created]
+GO
+
+CREATE UNIQUE INDEX [IX_users_username] ON [dbo].[users]([username],[mail_host]) ON [PRIMARY]
+GO
+
+CREATE UNIQUE INDEX [IX_dictionary_user_language] ON [dbo].[dictionary]([user_id],[language]) ON [PRIMARY]
+GO
+
+ALTER TABLE [dbo].[searches] ADD 
+	CONSTRAINT [DF_searches_user] DEFAULT (0) FOR [user_id],
+	CONSTRAINT [DF_searches_type] DEFAULT (0) FOR [type]
+GO
+
+CREATE UNIQUE INDEX [IX_searches_user_type_name] ON [dbo].[searches]([user_id],[type],[name]) ON [PRIMARY]
+GO
+
+ALTER TABLE [dbo].[identities] ADD CONSTRAINT [FK_identities_user_id] 
+    FOREIGN KEY ([user_id]) REFERENCES [dbo].[users] ([user_id])
+    ON DELETE CASCADE ON UPDATE CASCADE
+GO
+
+ALTER TABLE [dbo].[contacts] ADD CONSTRAINT [FK_contacts_user_id]
+    FOREIGN KEY ([user_id]) REFERENCES [dbo].[users] ([user_id])
+    ON DELETE CASCADE ON UPDATE CASCADE
+GO
+
+ALTER TABLE [dbo].[contactgroups] ADD CONSTRAINT [FK_contactgroups_user_id]
+    FOREIGN KEY ([user_id]) REFERENCES [dbo].[users] ([user_id])
+    ON DELETE CASCADE ON UPDATE CASCADE
+GO
+
+ALTER TABLE [dbo].[cache] ADD CONSTRAINT [FK_cache_user_id]
+    FOREIGN KEY ([user_id]) REFERENCES [dbo].[users] ([user_id])
+    ON DELETE CASCADE ON UPDATE CASCADE
+GO
+
+ALTER TABLE [dbo].[cache_index] ADD CONSTRAINT [FK_cache_index_user_id]
+    FOREIGN KEY ([user_id]) REFERENCES [dbo].[users] ([user_id])
+    ON DELETE CASCADE ON UPDATE CASCADE
+GO
+
+ALTER TABLE [dbo].[cache_thread] ADD CONSTRAINT [FK_cache_thread_user_id]
+    FOREIGN KEY ([user_id]) REFERENCES [dbo].[users] ([user_id])
+    ON DELETE CASCADE ON UPDATE CASCADE
+GO
+
+ALTER TABLE [dbo].[cache_messages] ADD CONSTRAINT [FK_cache_messages_user_id]
+    FOREIGN KEY ([user_id]) REFERENCES [dbo].[users] ([user_id])
+    ON DELETE CASCADE ON UPDATE CASCADE
+GO
+
+ALTER TABLE [dbo].[contactgroupmembers] ADD CONSTRAINT [FK_contactgroupmembers_contactgroup_id]
+    FOREIGN KEY ([contactgroup_id]) REFERENCES [dbo].[contactgroups] ([contactgroup_id])
+    ON DELETE CASCADE ON UPDATE CASCADE
+GO
+
+ALTER TABLE [dbo].[searches] ADD CONSTRAINT [FK_searches_user_id]
+    FOREIGN KEY ([user_id]) REFERENCES [dbo].[users] ([user_id])
+    ON DELETE CASCADE ON UPDATE CASCADE
+GO
+
+-- Use trigger instead of foreign key (#1487112)
+-- "Introducing FOREIGN KEY constraint ... may cause cycles or multiple cascade paths."
+CREATE TRIGGER [contact_delete_member] ON [dbo].[contacts]
+    AFTER DELETE AS
+    DELETE FROM [dbo].[contactgroupmembers]
+    WHERE [contact_id] IN (SELECT [contact_id] FROM deleted)
+GO
+
+INSERT INTO [dbo].[system] ([name], [value]) VALUES ('roundcube-version', '2016112200')
+GO
+

+ 87 - 0
data/web/rc/SQL/mssql/2009103100.sql

@@ -0,0 +1,87 @@
+-- Updates from version 0.3.1
+
+ALTER TABLE [dbo].[messages] ADD CONSTRAINT [FK_messages_user_id]
+    FOREIGN KEY ([user_id]) REFERENCES [dbo].[users] ([user_id])
+    ON DELETE CASCADE ON UPDATE CASCADE
+GO
+
+ALTER TABLE [dbo].[cache] ADD CONSTRAINT [FK_cache_user_id]
+    FOREIGN KEY ([user_id]) REFERENCES [dbo].[users] ([user_id])
+    ON DELETE CASCADE ON UPDATE CASCADE
+GO
+
+ALTER TABLE [dbo].[contacts] ADD CONSTRAINT [FK_contacts_user_id]
+    FOREIGN KEY ([user_id]) REFERENCES [dbo].[users] ([user_id])
+    ON DELETE CASCADE ON UPDATE CASCADE
+GO
+
+ALTER TABLE [dbo].[identities] ADD CONSTRAINT [FK_identities_user_id] 
+    FOREIGN KEY ([user_id]) REFERENCES [dbo].[users] ([user_id])
+    ON DELETE CASCADE ON UPDATE CASCADE
+GO
+
+ALTER TABLE [dbo].[identities] ADD [changed] [datetime] NULL 
+GO
+
+CREATE TABLE [dbo].[contactgroups] (
+	[contactgroup_id] [int] IDENTITY (1, 1) NOT NULL ,
+	[user_id] [int] NOT NULL ,
+	[changed] [datetime] NOT NULL ,
+	[del] [char] (1) COLLATE Latin1_General_CI_AI NOT NULL ,
+	[name] [varchar] (128) COLLATE Latin1_General_CI_AI NOT NULL
+) ON [PRIMARY] 
+GO
+
+CREATE TABLE [dbo].[contactgroupmembers] (
+	[contactgroup_id] [int] NOT NULL ,
+	[contact_id] [int] NOT NULL ,
+	[created] [datetime] NOT NULL
+) ON [PRIMARY] 
+GO
+
+ALTER TABLE [dbo].[contactgroups] WITH NOCHECK ADD 
+	CONSTRAINT [PK_contactgroups_contactgroup_id] PRIMARY KEY CLUSTERED 
+	(
+		[contactgroup_id]
+	)  ON [PRIMARY] 
+GO
+
+ALTER TABLE [dbo].[contactgroupmembers] WITH NOCHECK ADD 
+	CONSTRAINT [PK_contactgroupmembers_id] PRIMARY KEY CLUSTERED 
+	(
+		[contactgroup_id], [contact_id]
+	)  ON [PRIMARY] 
+GO
+
+ALTER TABLE [dbo].[contactgroups] ADD 
+	CONSTRAINT [DF_contactgroups_user_id] DEFAULT (0) FOR [user_id],
+	CONSTRAINT [DF_contactgroups_changed] DEFAULT (getdate()) FOR [changed],
+	CONSTRAINT [DF_contactgroups_del] DEFAULT ('0') FOR [del],
+	CONSTRAINT [DF_contactgroups_name] DEFAULT ('') FOR [name],
+	CONSTRAINT [CK_contactgroups_del] CHECK ([del] = '1' or [del] = '0')
+GO
+
+CREATE  INDEX [IX_contactgroups_user_id] ON [dbo].[contacts]([user_id]) ON [PRIMARY]
+GO
+
+ALTER TABLE [dbo].[contactgroupmembers] ADD 
+	CONSTRAINT [DF_contactgroupmembers_contactgroup_id] DEFAULT (0) FOR [contactgroup_id],
+	CONSTRAINT [DF_contactgroupmembers_contact_id] DEFAULT (0) FOR [contact_id],
+	CONSTRAINT [DF_contactgroupmembers_created] DEFAULT (getdate()) FOR [created]
+GO
+
+ALTER TABLE [dbo].[contactgroupmembers] ADD CONSTRAINT [FK_contactgroupmembers_contactgroup_id]
+    FOREIGN KEY ([contactgroup_id]) REFERENCES [dbo].[contactgroups] ([contactgroup_id])
+    ON DELETE CASCADE ON UPDATE CASCADE
+GO
+
+CREATE TRIGGER [contact_delete_member] ON [dbo].[contacts]
+    AFTER DELETE AS
+    DELETE FROM [dbo].[contactgroupmembers]
+    WHERE [contact_id] IN (SELECT [contact_id] FROM deleted)
+GO
+
+ALTER TABLE [dbo].[contactgroups] ADD CONSTRAINT [FK_contactgroups_user_id]
+    FOREIGN KEY ([user_id]) REFERENCES [dbo].[users] ([user_id])
+    ON DELETE CASCADE ON UPDATE CASCADE
+GO

+ 9 - 0
data/web/rc/SQL/mssql/2010100600.sql

@@ -0,0 +1,9 @@
+-- Updates from version 0.4.2
+
+DROP INDEX [IX_users_username]
+GO
+CREATE UNIQUE INDEX [IX_users_username] ON [dbo].[users]([username],[mail_host]) ON [PRIMARY]
+GO
+ALTER TABLE [dbo].[contacts] ALTER COLUMN [email] [varchar] (255) COLLATE Latin1_General_CI_AI NOT NULL
+GO
+

+ 10 - 0
data/web/rc/SQL/mssql/2011011200.sql

@@ -0,0 +1,10 @@
+-- Updates from version 0.5.x
+
+ALTER TABLE [dbo].[contacts] ADD [words] [text] COLLATE Latin1_General_CI_AI NULL 
+GO
+CREATE INDEX [IX_contactgroupmembers_contact_id] ON [dbo].[contactgroupmembers]([contact_id]) ON [PRIMARY]
+GO
+DELETE FROM [dbo].[messages]
+GO
+DELETE FROM [dbo].[cache]
+GO

+ 127 - 0
data/web/rc/SQL/mssql/2011092800.sql

@@ -0,0 +1,127 @@
+-- Updates from version 0.6
+
+CREATE TABLE [dbo].[dictionary] (
+    [user_id] [int] ,
+    [language] [varchar] (5) COLLATE Latin1_General_CI_AI NOT NULL ,
+    [data] [text] COLLATE Latin1_General_CI_AI NOT NULL 
+) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
+GO
+CREATE  UNIQUE INDEX [IX_dictionary_user_language] ON [dbo].[dictionary]([user_id],[language]) ON [PRIMARY]
+GO
+
+CREATE TABLE [dbo].[searches] (
+	[search_id] [int] IDENTITY (1, 1) NOT NULL ,
+	[user_id] [int] NOT NULL ,
+	[type] [tinyint] NOT NULL ,
+	[name] [varchar] (128) COLLATE Latin1_General_CI_AI NOT NULL ,
+	[data] [text] COLLATE Latin1_General_CI_AI NOT NULL 
+) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
+GO
+
+ALTER TABLE [dbo].[searches] WITH NOCHECK ADD 
+	CONSTRAINT [PK_searches_search_id] PRIMARY KEY CLUSTERED 
+	(
+		[search_id]
+	) ON [PRIMARY] 
+GO
+
+ALTER TABLE [dbo].[searches] ADD 
+	CONSTRAINT [DF_searches_user] DEFAULT (0) FOR [user_id],
+	CONSTRAINT [DF_searches_type] DEFAULT (0) FOR [type],
+GO
+
+CREATE UNIQUE INDEX [IX_searches_user_type_name] ON [dbo].[searches]([user_id],[type],[name]) ON [PRIMARY]
+GO
+
+ALTER TABLE [dbo].[searches] ADD CONSTRAINT [FK_searches_user_id]
+    FOREIGN KEY ([user_id]) REFERENCES [dbo].[users] ([user_id])
+    ON DELETE CASCADE ON UPDATE CASCADE
+GO
+
+DROP TABLE [dbo].[messages]
+GO
+CREATE TABLE [dbo].[cache_index] (
+	[user_id] [int] NOT NULL ,
+	[mailbox] [varchar] (128) COLLATE Latin1_General_CI_AI NOT NULL ,
+	[changed] [datetime] NOT NULL ,
+	[valid] [char] (1) COLLATE Latin1_General_CI_AI NOT NULL ,
+	[data] [text] COLLATE Latin1_General_CI_AI NOT NULL 
+) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
+GO
+
+CREATE TABLE [dbo].[cache_thread] (
+	[user_id] [int] NOT NULL ,
+	[mailbox] [varchar] (128) COLLATE Latin1_General_CI_AI NOT NULL ,
+	[changed] [datetime] NOT NULL ,
+	[data] [text] COLLATE Latin1_General_CI_AI NOT NULL 
+) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
+GO
+
+CREATE TABLE [dbo].[cache_messages] (
+	[user_id] [int] NOT NULL ,
+	[mailbox] [varchar] (128) COLLATE Latin1_General_CI_AI NOT NULL ,
+	[uid] [int] NOT NULL ,
+	[changed] [datetime] NOT NULL ,
+	[data] [text] COLLATE Latin1_General_CI_AI NOT NULL ,
+	[flags] [int] NOT NULL
+) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
+GO
+
+ALTER TABLE [dbo].[cache_index] WITH NOCHECK ADD 
+	 PRIMARY KEY CLUSTERED 
+	(
+		[user_id],[mailbox]
+	) ON [PRIMARY] 
+GO
+
+ALTER TABLE [dbo].[cache_thread] WITH NOCHECK ADD 
+	 PRIMARY KEY CLUSTERED 
+	(
+		[user_id],[mailbox]
+	) ON [PRIMARY] 
+GO
+
+ALTER TABLE [dbo].[cache_messages] WITH NOCHECK ADD 
+	 PRIMARY KEY CLUSTERED 
+	(
+		[user_id],[mailbox],[uid]
+	) ON [PRIMARY] 
+GO
+
+ALTER TABLE [dbo].[cache_index] ADD 
+	CONSTRAINT [DF_cache_index_changed] DEFAULT (getdate()) FOR [changed],
+	CONSTRAINT [DF_cache_index_valid] DEFAULT ('0') FOR [valid]
+GO
+
+CREATE  INDEX [IX_cache_index_user_id] ON [dbo].[cache_index]([user_id]) ON [PRIMARY]
+GO
+
+ALTER TABLE [dbo].[cache_thread] ADD 
+	CONSTRAINT [DF_cache_thread_changed] DEFAULT (getdate()) FOR [changed]
+GO
+
+CREATE  INDEX [IX_cache_thread_user_id] ON [dbo].[cache_thread]([user_id]) ON [PRIMARY]
+GO
+
+ALTER TABLE [dbo].[cache_messages] ADD 
+	CONSTRAINT [DF_cache_messages_changed] DEFAULT (getdate()) FOR [changed],
+	CONSTRAINT [DF_cache_messages_flags] DEFAULT (0) FOR [flags]
+GO
+
+CREATE  INDEX [IX_cache_messages_user_id] ON [dbo].[cache_messages]([user_id]) ON [PRIMARY]
+GO
+
+ALTER TABLE [dbo].[cache_index] ADD CONSTRAINT [FK_cache_index_user_id]
+    FOREIGN KEY ([user_id]) REFERENCES [dbo].[users] ([user_id])
+    ON DELETE CASCADE ON UPDATE CASCADE
+GO
+
+ALTER TABLE [dbo].[cache_thread] ADD CONSTRAINT [FK_cache_thread_user_id]
+    FOREIGN KEY ([user_id]) REFERENCES [dbo].[users] ([user_id])
+    ON DELETE CASCADE ON UPDATE CASCADE
+GO
+
+ALTER TABLE [dbo].[cache_messages] ADD CONSTRAINT [FK_cache_messages_user_id]
+    FOREIGN KEY ([user_id]) REFERENCES [dbo].[users] ([user_id])
+    ON DELETE CASCADE ON UPDATE CASCADE
+GO

+ 4 - 0
data/web/rc/SQL/mssql/2011111600.sql

@@ -0,0 +1,4 @@
+-- Updates from version 0.7-beta
+
+ALTER TABLE [dbo].[session] ALTER COLUMN [sess_id] [varchar] (128) COLLATE Latin1_General_CI_AI NOT NULL
+GO

+ 9 - 0
data/web/rc/SQL/mssql/2011121400.sql

@@ -0,0 +1,9 @@
+-- Updates from version 0.7
+
+ALTER TABLE [dbo].[contacts] DROP CONSTRAINT [DF_contacts_email]
+GO
+ALTER TABLE [dbo].[contacts] ALTER COLUMN [email] [text] COLLATE Latin1_General_CI_AI NOT NULL
+GO
+ALTER TABLE [dbo].[contacts] ADD CONSTRAINT [DF_contacts_email] DEFAULT ('') FOR [email]
+GO
+

+ 18 - 0
data/web/rc/SQL/mssql/2012051800.sql

@@ -0,0 +1,18 @@
+-- Updates from version 0.8-rc
+
+ALTER TABLE [dbo].[contacts] DROP CONSTRAINT [DF_contacts_email]
+GO
+ALTER TABLE [dbo].[contacts] ALTER COLUMN [email] [varchar] (8000) COLLATE Latin1_General_CI_AI NOT NULL
+GO
+ALTER TABLE [dbo].[contacts] ADD CONSTRAINT [DF_contacts_email] DEFAULT ('') FOR [email]
+GO
+
+-- Updates from version 0.8
+
+ALTER TABLE [dbo].[cache] DROP COLUMN [cache_id]
+GO
+ALTER TABLE [dbo].[users] DROP COLUMN [alias]
+GO
+CREATE INDEX [IX_identities_email] ON [dbo].[identities]([email],[del]) ON [PRIMARY]
+GO
+

+ 8 - 0
data/web/rc/SQL/mssql/2012080700.sql

@@ -0,0 +1,8 @@
+-- Updates from version 0.8
+
+ALTER TABLE [dbo].[cache] DROP COLUMN [cache_id]
+GO
+ALTER TABLE [dbo].[users] DROP COLUMN [alias]
+GO
+CREATE INDEX [IX_identities_email] ON [dbo].[identities]([email],[del]) ON [PRIMARY]
+GO

+ 14 - 0
data/web/rc/SQL/mssql/2013011000.sql

@@ -0,0 +1,14 @@
+-- Upgrades from 0.9-beta
+
+CREATE TABLE [dbo].[system] (
+    [name] [varchar] (64) COLLATE Latin1_General_CI_AI NOT NULL ,
+    [value] [text] COLLATE Latin1_General_CI_AI 
+) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
+GO
+
+ALTER TABLE [dbo].[system] WITH NOCHECK ADD
+    CONSTRAINT [PK_system_name] PRIMARY KEY CLUSTERED
+    (
+        [name]
+    ) ON [PRIMARY]
+GO

+ 1 - 0
data/web/rc/SQL/mssql/2013042700.sql

@@ -0,0 +1 @@
+-- empty

+ 17 - 0
data/web/rc/SQL/mssql/2013052500.sql

@@ -0,0 +1,17 @@
+CREATE TABLE [dbo].[cache_shared] (
+	[cache_key] [varchar] (255) COLLATE Latin1_General_CI_AI NOT NULL ,
+	[created] [datetime] NOT NULL ,
+	[data] [text] COLLATE Latin1_General_CI_AI NOT NULL 
+) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
+GO
+
+ALTER TABLE [dbo].[cache_shared] ADD 
+	CONSTRAINT [DF_cache_shared_created] DEFAULT (getdate()) FOR [created]
+GO
+
+CREATE  INDEX [IX_cache_shared_cache_key] ON [dbo].[cache_shared]([cache_key]) ON [PRIMARY]
+GO
+
+CREATE  INDEX [IX_cache_shared_created] ON [dbo].[cache_shared]([created]) ON [PRIMARY]
+GO
+

+ 44 - 0
data/web/rc/SQL/mssql/2013061000.sql

@@ -0,0 +1,44 @@
+ALTER TABLE [dbo].[cache] ADD [expires] [datetime] NULL
+GO
+ALTER TABLE [dbo].[cache_shared] ADD [expires] [datetime] NULL
+GO
+ALTER TABLE [dbo].[cache_index] ADD [expires] [datetime] NULL
+GO
+ALTER TABLE [dbo].[cache_thread] ADD [expires] [datetime] NULL
+GO
+ALTER TABLE [dbo].[cache_messages] ADD [expires] [datetime] NULL
+GO
+
+UPDATE [dbo].[cache] SET [expires] = DATEADD(second, 604800, [created])
+GO
+UPDATE [dbo].[cache_shared] SET [expires] = DATEADD(second, 604800, [created])
+GO
+UPDATE [dbo].[cache_index] SET [expires] = DATEADD(second, 604800, [changed])
+GO
+UPDATE [dbo].[cache_thread] SET [expires] = DATEADD(second, 604800, [changed])
+GO
+UPDATE [dbo].[cache_messages] SET [expires] = DATEADD(second, 604800, [changed])
+GO
+
+DROP INDEX [IX_cache_created]
+GO
+DROP INDEX [IX_cache_shared_created]
+GO
+ALTER TABLE [dbo].[cache_index] DROP COLUMN [changed]
+GO
+ALTER TABLE [dbo].[cache_thread] DROP COLUMN [changed]
+GO
+ALTER TABLE [dbo].[cache_messages] DROP COLUMN [changed]
+GO
+
+CREATE INDEX [IX_cache_expires] ON [dbo].[cache]([expires]) ON [PRIMARY]
+GO
+CREATE INDEX [IX_cache_shared_expires] ON [dbo].[cache_shared]([expires]) ON [PRIMARY]
+GO
+CREATE INDEX [IX_cache_index_expires] ON [dbo].[cache_index]([expires]) ON [PRIMARY]
+GO
+CREATE INDEX [IX_cache_thread_expires] ON [dbo].[cache_thread]([expires]) ON [PRIMARY]
+GO
+CREATE INDEX [IX_cache_messages_expires] ON [dbo].[cache_messages]([expires]) ON [PRIMARY]
+GO
+

+ 1 - 0
data/web/rc/SQL/mssql/2014042900.sql

@@ -0,0 +1 @@
+-- empty

+ 1 - 0
data/web/rc/SQL/mssql/2015030800.sql

@@ -0,0 +1 @@
+-- empty

+ 4 - 0
data/web/rc/SQL/mssql/2015111100.sql

@@ -0,0 +1,4 @@
+ALTER TABLE [dbo].[users] ADD [failed_login] [datetime] NULL
+GO
+ALTER TABLE [dbo].[users] ADD [failed_login_counter] [int] NULL
+GO

+ 2 - 0
data/web/rc/SQL/mssql/2016081200.sql

@@ -0,0 +1,2 @@
+ALTER TABLE [dbo].[session] DROP COLUMN [created]
+GO

+ 2 - 0
data/web/rc/SQL/mssql/2016100900.sql

@@ -0,0 +1,2 @@
+ALTER TABLE [dbo].[session] ALTER COLUMN [ip] [varchar] (40) COLLATE Latin1_General_CI_AI NOT NULL
+GO

+ 36 - 0
data/web/rc/SQL/mssql/2016112200.sql

@@ -0,0 +1,36 @@
+DROP TABLE [dbo].[cache]
+GO
+DROP TABLE [dbo].[cache_shared]
+GO
+
+CREATE TABLE [dbo].[cache] (
+  [user_id] [int] NOT NULL ,
+  [cache_key] [varchar] (128) COLLATE Latin1_General_CI_AI NOT NULL ,
+  [expires] [datetime] NULL ,
+  [data] [text] COLLATE Latin1_General_CI_AI NOT NULL 
+) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
+GO
+CREATE TABLE [dbo].[cache_shared] (
+  [cache_key] [varchar] (255) COLLATE Latin1_General_CI_AI NOT NULL ,
+  [expires] [datetime] NULL ,
+  [data] [text] COLLATE Latin1_General_CI_AI NOT NULL
+) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
+GO
+ALTER TABLE [dbo].[cache] ADD
+  CONSTRAINT [DF_cache_user_id] DEFAULT ('0') FOR [user_id],
+  CONSTRAINT [DF_cache_cache_key] DEFAULT ('') FOR [cache_key],
+GO
+CREATE INDEX [IX_cache_expires] ON [dbo].[cache]([expires]) ON [PRIMARY]
+GO
+CREATE INDEX [IX_cache_shared_expires] ON [dbo].[cache_shared]([expires]) ON [PRIMARY]
+GO
+ALTER TABLE [dbo].[cache] WITH NOCHECK ADD
+  PRIMARY KEY CLUSTERED (
+    [user_id],[cache_key]
+  ) ON [PRIMARY]
+GO
+ALTER TABLE [dbo].[cache_shared] WITH NOCHECK ADD
+  PRIMARY KEY CLUSTERED (
+    [cache_key]
+  ) ON [PRIMARY]
+GO

+ 212 - 0
data/web/rc/SQL/mysql.initial.sql

@@ -0,0 +1,212 @@
+-- Roundcube Webmail initial database structure
+
+
+/*!40014  SET FOREIGN_KEY_CHECKS=0 */;
+
+-- Table structure for table `session`
+
+CREATE TABLE `session` (
+ `sess_id` varchar(128) NOT NULL,
+ `changed` datetime NOT NULL DEFAULT '1000-01-01 00:00:00',
+ `ip` varchar(40) NOT NULL,
+ `vars` mediumtext NOT NULL,
+ PRIMARY KEY(`sess_id`),
+ INDEX `changed_index` (`changed`)
+) /*!40000 ENGINE=INNODB */ /*!40101 CHARACTER SET utf8 COLLATE utf8_general_ci */;
+
+
+-- Table structure for table `users`
+
+CREATE TABLE `users` (
+ `user_id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
+ `username` varchar(128) BINARY NOT NULL,
+ `mail_host` varchar(128) NOT NULL,
+ `created` datetime NOT NULL DEFAULT '1000-01-01 00:00:00',
+ `last_login` datetime DEFAULT NULL,
+ `failed_login` datetime DEFAULT NULL,
+ `failed_login_counter` int(10) UNSIGNED DEFAULT NULL,
+ `language` varchar(5),
+ `preferences` longtext,
+ PRIMARY KEY(`user_id`),
+ UNIQUE `username` (`username`, `mail_host`)
+) /*!40000 ENGINE=INNODB */ /*!40101 CHARACTER SET utf8 COLLATE utf8_general_ci */;
+
+
+-- Table structure for table `cache`
+
+CREATE TABLE `cache` (
+ `user_id` int(10) UNSIGNED NOT NULL,
+ `cache_key` varchar(128) /*!40101 CHARACTER SET ascii COLLATE ascii_general_ci */ NOT NULL,
+ `expires` datetime DEFAULT NULL,
+ `data` longtext NOT NULL,
+ PRIMARY KEY (`user_id`, `cache_key`),
+ CONSTRAINT `user_id_fk_cache` FOREIGN KEY (`user_id`)
+   REFERENCES `users`(`user_id`) ON DELETE CASCADE ON UPDATE CASCADE,
+ INDEX `expires_index` (`expires`)
+) /*!40000 ENGINE=INNODB */ /*!40101 CHARACTER SET utf8 COLLATE utf8_general_ci */;
+
+
+-- Table structure for table `cache_shared`
+
+CREATE TABLE `cache_shared` (
+ `cache_key` varchar(255) /*!40101 CHARACTER SET ascii COLLATE ascii_general_ci */ NOT NULL,
+ `expires` datetime DEFAULT NULL,
+ `data` longtext NOT NULL,
+ PRIMARY KEY (`cache_key`),
+ INDEX `expires_index` (`expires`)
+) /*!40000 ENGINE=INNODB */ /*!40101 CHARACTER SET utf8 COLLATE utf8_general_ci */;
+
+
+-- Table structure for table `cache_index`
+
+CREATE TABLE `cache_index` (
+ `user_id` int(10) UNSIGNED NOT NULL,
+ `mailbox` varchar(255) BINARY NOT NULL,
+ `expires` datetime DEFAULT NULL,
+ `valid` tinyint(1) NOT NULL DEFAULT '0',
+ `data` longtext NOT NULL,
+ CONSTRAINT `user_id_fk_cache_index` FOREIGN KEY (`user_id`)
+   REFERENCES `users`(`user_id`) ON DELETE CASCADE ON UPDATE CASCADE,
+ INDEX `expires_index` (`expires`),
+ PRIMARY KEY (`user_id`, `mailbox`)
+) /*!40000 ENGINE=INNODB */ /*!40101 CHARACTER SET utf8 COLLATE utf8_general_ci */;
+
+
+-- Table structure for table `cache_thread`
+
+CREATE TABLE `cache_thread` (
+ `user_id` int(10) UNSIGNED NOT NULL,
+ `mailbox` varchar(255) BINARY NOT NULL,
+ `expires` datetime DEFAULT NULL,
+ `data` longtext NOT NULL,
+ CONSTRAINT `user_id_fk_cache_thread` FOREIGN KEY (`user_id`)
+   REFERENCES `users`(`user_id`) ON DELETE CASCADE ON UPDATE CASCADE,
+ INDEX `expires_index` (`expires`),
+ PRIMARY KEY (`user_id`, `mailbox`)
+) /*!40000 ENGINE=INNODB */ /*!40101 CHARACTER SET utf8 COLLATE utf8_general_ci */;
+
+
+-- Table structure for table `cache_messages`
+
+CREATE TABLE `cache_messages` (
+ `user_id` int(10) UNSIGNED NOT NULL,
+ `mailbox` varchar(255) BINARY NOT NULL,
+ `uid` int(11) UNSIGNED NOT NULL DEFAULT '0',
+ `expires` datetime DEFAULT NULL,
+ `data` longtext NOT NULL,
+ `flags` int(11) NOT NULL DEFAULT '0',
+ CONSTRAINT `user_id_fk_cache_messages` FOREIGN KEY (`user_id`)
+   REFERENCES `users`(`user_id`) ON DELETE CASCADE ON UPDATE CASCADE,
+ INDEX `expires_index` (`expires`),
+ PRIMARY KEY (`user_id`, `mailbox`, `uid`)
+) /*!40000 ENGINE=INNODB */ /*!40101 CHARACTER SET utf8 COLLATE utf8_general_ci */;
+
+
+-- Table structure for table `contacts`
+
+CREATE TABLE `contacts` (
+ `contact_id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
+ `changed` datetime NOT NULL DEFAULT '1000-01-01 00:00:00',
+ `del` tinyint(1) NOT NULL DEFAULT '0',
+ `name` varchar(128) NOT NULL DEFAULT '',
+ `email` text NOT NULL,
+ `firstname` varchar(128) NOT NULL DEFAULT '',
+ `surname` varchar(128) NOT NULL DEFAULT '',
+ `vcard` longtext NULL,
+ `words` text NULL,
+ `user_id` int(10) UNSIGNED NOT NULL,
+ PRIMARY KEY(`contact_id`),
+ CONSTRAINT `user_id_fk_contacts` FOREIGN KEY (`user_id`)
+   REFERENCES `users`(`user_id`) ON DELETE CASCADE ON UPDATE CASCADE,
+ INDEX `user_contacts_index` (`user_id`,`del`)
+) /*!40000 ENGINE=INNODB */ /*!40101 CHARACTER SET utf8 COLLATE utf8_general_ci */;
+
+-- Table structure for table `contactgroups`
+
+CREATE TABLE `contactgroups` (
+  `contactgroup_id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
+  `user_id` int(10) UNSIGNED NOT NULL,
+  `changed` datetime NOT NULL DEFAULT '1000-01-01 00:00:00',
+  `del` tinyint(1) NOT NULL DEFAULT '0',
+  `name` varchar(128) NOT NULL DEFAULT '',
+  PRIMARY KEY(`contactgroup_id`),
+  CONSTRAINT `user_id_fk_contactgroups` FOREIGN KEY (`user_id`)
+    REFERENCES `users`(`user_id`) ON DELETE CASCADE ON UPDATE CASCADE,
+  INDEX `contactgroups_user_index` (`user_id`,`del`)
+) /*!40000 ENGINE=INNODB */ /*!40101 CHARACTER SET utf8 COLLATE utf8_general_ci */;
+
+CREATE TABLE `contactgroupmembers` (
+  `contactgroup_id` int(10) UNSIGNED NOT NULL,
+  `contact_id` int(10) UNSIGNED NOT NULL,
+  `created` datetime NOT NULL DEFAULT '1000-01-01 00:00:00',
+  PRIMARY KEY (`contactgroup_id`, `contact_id`),
+  CONSTRAINT `contactgroup_id_fk_contactgroups` FOREIGN KEY (`contactgroup_id`)
+    REFERENCES `contactgroups`(`contactgroup_id`) ON DELETE CASCADE ON UPDATE CASCADE,
+  CONSTRAINT `contact_id_fk_contacts` FOREIGN KEY (`contact_id`)
+    REFERENCES `contacts`(`contact_id`) ON DELETE CASCADE ON UPDATE CASCADE,
+  INDEX `contactgroupmembers_contact_index` (`contact_id`)
+) /*!40000 ENGINE=INNODB */;
+
+
+-- Table structure for table `identities`
+
+CREATE TABLE `identities` (
+ `identity_id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
+ `user_id` int(10) UNSIGNED NOT NULL,
+ `changed` datetime NOT NULL DEFAULT '1000-01-01 00:00:00',
+ `del` tinyint(1) NOT NULL DEFAULT '0',
+ `standard` tinyint(1) NOT NULL DEFAULT '0',
+ `name` varchar(128) NOT NULL,
+ `organization` varchar(128) NOT NULL DEFAULT '',
+ `email` varchar(128) NOT NULL,
+ `reply-to` varchar(128) NOT NULL DEFAULT '',
+ `bcc` varchar(128) NOT NULL DEFAULT '',
+ `signature` longtext,
+ `html_signature` tinyint(1) NOT NULL DEFAULT '0',
+ PRIMARY KEY(`identity_id`),
+ CONSTRAINT `user_id_fk_identities` FOREIGN KEY (`user_id`)
+   REFERENCES `users`(`user_id`) ON DELETE CASCADE ON UPDATE CASCADE,
+ INDEX `user_identities_index` (`user_id`, `del`),
+ INDEX `email_identities_index` (`email`, `del`)
+) /*!40000 ENGINE=INNODB */ /*!40101 CHARACTER SET utf8 COLLATE utf8_general_ci */;
+
+
+-- Table structure for table `dictionary`
+
+CREATE TABLE `dictionary` (
+  `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, -- redundant, for compat. with Galera Cluster
+  `user_id` int(10) UNSIGNED DEFAULT NULL, -- NULL here is for "shared dictionaries"
+  `language` varchar(5) NOT NULL,
+  `data` longtext NOT NULL,
+  CONSTRAINT `user_id_fk_dictionary` FOREIGN KEY (`user_id`)
+    REFERENCES `users`(`user_id`) ON DELETE CASCADE ON UPDATE CASCADE,
+  UNIQUE `uniqueness` (`user_id`, `language`)
+) /*!40000 ENGINE=INNODB */ /*!40101 CHARACTER SET utf8 COLLATE utf8_general_ci */;
+
+
+-- Table structure for table `searches`
+
+CREATE TABLE `searches` (
+ `search_id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
+ `user_id` int(10) UNSIGNED NOT NULL,
+ `type` int(3) NOT NULL DEFAULT '0',
+ `name` varchar(128) NOT NULL,
+ `data` text,
+ PRIMARY KEY(`search_id`),
+ CONSTRAINT `user_id_fk_searches` FOREIGN KEY (`user_id`)
+   REFERENCES `users`(`user_id`) ON DELETE CASCADE ON UPDATE CASCADE,
+ UNIQUE `uniqueness` (`user_id`, `type`, `name`)
+) /*!40000 ENGINE=INNODB */ /*!40101 CHARACTER SET utf8 COLLATE utf8_general_ci */;
+
+
+-- Table structure for table `system`
+
+CREATE TABLE `system` (
+ `name` varchar(64) NOT NULL,
+ `value` mediumtext,
+ PRIMARY KEY(`name`)
+) /*!40000 ENGINE=INNODB */ /*!40101 CHARACTER SET utf8 COLLATE utf8_general_ci */;
+
+/*!40014 SET FOREIGN_KEY_CHECKS=1 */;
+
+INSERT INTO system (name, value) VALUES ('roundcube-version', '2016112200');

+ 16 - 0
data/web/rc/SQL/mysql/2008030300.sql

@@ -0,0 +1,16 @@
+-- Updates from version 0.1-stable
+
+TRUNCATE TABLE `messages`;
+
+ALTER TABLE `messages`
+  DROP INDEX `idx`,
+  DROP INDEX `uid`;
+
+ALTER TABLE `cache`
+  DROP INDEX `cache_key`,
+  DROP INDEX `session_id`,
+  ADD INDEX `user_cache_index` (`user_id`,`cache_key`);
+
+ALTER TABLE `users`
+    ADD INDEX `username_index` (`username`),
+    ADD INDEX `alias_index` (`alias`);

+ 9 - 0
data/web/rc/SQL/mysql/2008040500.sql

@@ -0,0 +1,9 @@
+-- Updates from version 0.1.1
+
+ALTER TABLE `identities`
+    MODIFY `signature` text, 
+    MODIFY `bcc` varchar(128) NOT NULL DEFAULT '', 
+    MODIFY `reply-to` varchar(128) NOT NULL DEFAULT '', 
+    MODIFY `organization` varchar(128) NOT NULL DEFAULT '',
+    MODIFY `name` varchar(128) NOT NULL, 
+    MODIFY `email` varchar(128) NOT NULL; 

+ 4 - 0
data/web/rc/SQL/mysql/2008060900.sql

@@ -0,0 +1,4 @@
+-- Updates from version 0.2-alpha
+
+ALTER TABLE `messages`
+    ADD INDEX `created_index` (`created`);

+ 20 - 0
data/web/rc/SQL/mysql/2008092100.sql

@@ -0,0 +1,20 @@
+-- Updates from version 0.2-beta (InnoDB required)
+
+ALTER TABLE `cache`
+    DROP `session_id`;
+
+ALTER TABLE `session`
+    ADD INDEX `changed_index` (`changed`);
+
+ALTER TABLE `cache`
+    ADD INDEX `created_index` (`created`);
+
+ALTER TABLE `users`
+    CHANGE `language` `language` varchar(5);
+
+ALTER TABLE `cache` ENGINE=InnoDB;
+ALTER TABLE `session` ENGINE=InnoDB;
+ALTER TABLE `messages` ENGINE=InnoDB;
+ALTER TABLE `users` ENGINE=InnoDB;
+ALTER TABLE `contacts` ENGINE=InnoDB;
+ALTER TABLE `identities` ENGINE=InnoDB;

+ 12 - 0
data/web/rc/SQL/mysql/2009090400.sql

@@ -0,0 +1,12 @@
+-- Updates from version 0.3-stable
+
+TRUNCATE `messages`;
+
+ALTER TABLE `messages`
+    ADD INDEX `index_index` (`user_id`, `cache_key`, `idx`);
+
+ALTER TABLE `session` 
+    CHANGE `vars` `vars` MEDIUMTEXT NOT NULL;
+
+ALTER TABLE `contacts`
+    ADD INDEX `user_contacts_index` (`user_id`,`email`);

+ 52 - 0
data/web/rc/SQL/mysql/2009103100.sql

@@ -0,0 +1,52 @@
+-- Updates from version 0.3.1
+-- WARNING: Make sure that all tables are using InnoDB engine!!!
+--          If not, use: ALTER TABLE xxx ENGINE=InnoDB;
+
+/* MySQL bug workaround: http://bugs.mysql.com/bug.php?id=46293 */
+/*!40014 SET FOREIGN_KEY_CHECKS=0 */;
+
+ALTER TABLE `messages` DROP FOREIGN KEY `user_id_fk_messages`;
+ALTER TABLE `cache` DROP FOREIGN KEY `user_id_fk_cache`;
+ALTER TABLE `contacts` DROP FOREIGN KEY `user_id_fk_contacts`;
+ALTER TABLE `identities` DROP FOREIGN KEY `user_id_fk_identities`;
+
+ALTER TABLE `messages` ADD CONSTRAINT `user_id_fk_messages` FOREIGN KEY (`user_id`)
+ REFERENCES `users`(`user_id`) ON DELETE CASCADE ON UPDATE CASCADE;
+ALTER TABLE `cache` ADD CONSTRAINT `user_id_fk_cache` FOREIGN KEY (`user_id`)
+ REFERENCES `users`(`user_id`) ON DELETE CASCADE ON UPDATE CASCADE;
+ALTER TABLE `contacts` ADD CONSTRAINT `user_id_fk_contacts` FOREIGN KEY (`user_id`)
+ REFERENCES `users`(`user_id`) ON DELETE CASCADE ON UPDATE CASCADE;
+ALTER TABLE `identities` ADD CONSTRAINT `user_id_fk_identities` FOREIGN KEY (`user_id`)
+ REFERENCES `users`(`user_id`) ON DELETE CASCADE ON UPDATE CASCADE;
+
+ALTER TABLE `contacts` ALTER `name` SET DEFAULT '';
+ALTER TABLE `contacts` ALTER `firstname` SET DEFAULT '';
+ALTER TABLE `contacts` ALTER `surname` SET DEFAULT '';
+
+ALTER TABLE `identities` ADD INDEX `user_identities_index` (`user_id`, `del`);
+ALTER TABLE `identities` ADD `changed` datetime NOT NULL DEFAULT '1000-01-01 00:00:00' AFTER `user_id`;
+
+CREATE TABLE `contactgroups` (
+  `contactgroup_id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
+  `user_id` int(10) UNSIGNED NOT NULL DEFAULT '0',
+  `changed` datetime NOT NULL DEFAULT '1000-01-01 00:00:00',
+  `del` tinyint(1) NOT NULL DEFAULT '0',
+  `name` varchar(128) NOT NULL DEFAULT '',
+  PRIMARY KEY(`contactgroup_id`),
+  CONSTRAINT `user_id_fk_contactgroups` FOREIGN KEY (`user_id`)
+    REFERENCES `users`(`user_id`) ON DELETE CASCADE ON UPDATE CASCADE,
+  INDEX `contactgroups_user_index` (`user_id`,`del`)
+) /*!40000 ENGINE=INNODB */ /*!40101 CHARACTER SET utf8 COLLATE utf8_general_ci */;
+
+CREATE TABLE `contactgroupmembers` (
+  `contactgroup_id` int(10) UNSIGNED NOT NULL,
+  `contact_id` int(10) UNSIGNED NOT NULL DEFAULT '0',
+  `created` datetime NOT NULL DEFAULT '1000-01-01 00:00:00',
+  PRIMARY KEY (`contactgroup_id`, `contact_id`),
+  CONSTRAINT `contactgroup_id_fk_contactgroups` FOREIGN KEY (`contactgroup_id`)
+    REFERENCES `contactgroups`(`contactgroup_id`) ON DELETE CASCADE ON UPDATE CASCADE,
+  CONSTRAINT `contact_id_fk_contacts` FOREIGN KEY (`contact_id`)
+    REFERENCES `contacts`(`contact_id`) ON DELETE CASCADE ON UPDATE CASCADE
+) /*!40000 ENGINE=INNODB */;
+
+/*!40014 SET FOREIGN_KEY_CHECKS=1 */;

+ 4 - 0
data/web/rc/SQL/mysql/2010042300.sql

@@ -0,0 +1,4 @@
+-- Updates from version 0.4-beta
+
+ALTER TABLE `users` CHANGE `last_login` `last_login` datetime DEFAULT NULL;
+UPDATE `users` SET `last_login` = NULL WHERE `last_login` = '1000-01-01 00:00:00';

+ 8 - 0
data/web/rc/SQL/mysql/2010100600.sql

@@ -0,0 +1,8 @@
+-- Updates from version 0.4.2
+
+ALTER TABLE `users` DROP INDEX `username_index`;
+ALTER TABLE `users` ADD UNIQUE `username` (`username`, `mail_host`);
+
+ALTER TABLE `contacts` MODIFY `email` varchar(255) NOT NULL;
+
+TRUNCATE TABLE `messages`;

+ 8 - 0
data/web/rc/SQL/mysql/2011011200.sql

@@ -0,0 +1,8 @@
+-- Updates from version 0.5.x
+
+ALTER TABLE `contacts` ADD `words` TEXT NULL AFTER `vcard`;
+ALTER TABLE `contacts` CHANGE `vcard` `vcard` LONGTEXT /*!40101 CHARACTER SET utf8 */ NULL DEFAULT NULL;
+ALTER TABLE `contactgroupmembers` ADD INDEX `contactgroupmembers_contact_index` (`contact_id`);
+
+TRUNCATE TABLE `messages`;
+TRUNCATE TABLE `cache`;

+ 67 - 0
data/web/rc/SQL/mysql/2011092800.sql

@@ -0,0 +1,67 @@
+-- Updates from version 0.6
+
+/*!40014 SET FOREIGN_KEY_CHECKS=0 */;
+
+ALTER TABLE `users` CHANGE `alias` `alias` varchar(128) BINARY NOT NULL;
+ALTER TABLE `users` CHANGE `username` `username` varchar(128) BINARY NOT NULL;
+
+CREATE TABLE `dictionary` (
+  `user_id` int(10) UNSIGNED DEFAULT NULL,
+  `language` varchar(5) NOT NULL,
+  `data` longtext NOT NULL,
+  CONSTRAINT `user_id_fk_dictionary` FOREIGN KEY (`user_id`)
+    REFERENCES `users`(`user_id`) ON DELETE CASCADE ON UPDATE CASCADE,
+  UNIQUE `uniqueness` (`user_id`, `language`)
+) /*!40000 ENGINE=INNODB */ /*!40101 CHARACTER SET utf8 COLLATE utf8_general_ci */;
+
+CREATE TABLE `searches` (
+  `search_id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
+  `user_id` int(10) UNSIGNED NOT NULL DEFAULT '0',
+  `type` int(3) NOT NULL DEFAULT '0',
+  `name` varchar(128) NOT NULL,
+  `data` text,
+  PRIMARY KEY(`search_id`),
+  CONSTRAINT `user_id_fk_searches` FOREIGN KEY (`user_id`)
+    REFERENCES `users`(`user_id`) ON DELETE CASCADE ON UPDATE CASCADE,
+  UNIQUE `uniqueness` (`user_id`, `type`, `name`)
+) /*!40000 ENGINE=INNODB */ /*!40101 CHARACTER SET utf8 COLLATE utf8_general_ci */;
+
+DROP TABLE `messages`;
+
+CREATE TABLE `cache_index` (
+ `user_id` int(10) UNSIGNED NOT NULL DEFAULT '0',
+ `mailbox` varchar(255) BINARY NOT NULL,
+ `changed` datetime NOT NULL DEFAULT '1000-01-01 00:00:00',
+ `valid` tinyint(1) NOT NULL DEFAULT '0',
+ `data` longtext NOT NULL,
+ CONSTRAINT `user_id_fk_cache_index` FOREIGN KEY (`user_id`)
+   REFERENCES `users`(`user_id`) ON DELETE CASCADE ON UPDATE CASCADE,
+ INDEX `changed_index` (`changed`),
+ PRIMARY KEY (`user_id`, `mailbox`)
+) /*!40000 ENGINE=INNODB */ /*!40101 CHARACTER SET utf8 COLLATE utf8_general_ci */;
+
+CREATE TABLE `cache_thread` (
+ `user_id` int(10) UNSIGNED NOT NULL DEFAULT '0',
+ `mailbox` varchar(255) BINARY NOT NULL,
+ `changed` datetime NOT NULL DEFAULT '1000-01-01 00:00:00',
+ `data` longtext NOT NULL,
+ CONSTRAINT `user_id_fk_cache_thread` FOREIGN KEY (`user_id`)
+   REFERENCES `users`(`user_id`) ON DELETE CASCADE ON UPDATE CASCADE,
+ INDEX `changed_index` (`changed`),
+ PRIMARY KEY (`user_id`, `mailbox`)
+) /*!40000 ENGINE=INNODB */ /*!40101 CHARACTER SET utf8 COLLATE utf8_general_ci */;
+
+CREATE TABLE `cache_messages` (
+ `user_id` int(10) UNSIGNED NOT NULL DEFAULT '0',
+ `mailbox` varchar(255) BINARY NOT NULL,
+ `uid` int(11) UNSIGNED NOT NULL DEFAULT '0',
+ `changed` datetime NOT NULL DEFAULT '1000-01-01 00:00:00',
+ `data` longtext NOT NULL,
+ `flags` int(11) NOT NULL DEFAULT '0',
+ CONSTRAINT `user_id_fk_cache_messages` FOREIGN KEY (`user_id`)
+   REFERENCES `users`(`user_id`) ON DELETE CASCADE ON UPDATE CASCADE,
+ INDEX `changed_index` (`changed`),
+ PRIMARY KEY (`user_id`, `mailbox`, `uid`)
+) /*!40000 ENGINE=INNODB */ /*!40101 CHARACTER SET utf8 COLLATE utf8_general_ci */;
+
+/*!40014 SET FOREIGN_KEY_CHECKS=1 */;

+ 3 - 0
data/web/rc/SQL/mysql/2011111600.sql

@@ -0,0 +1,3 @@
+-- Updates from version 0.7-beta
+
+ALTER TABLE `session` CHANGE `sess_id` `sess_id` varchar(128) NOT NULL;

+ 22 - 0
data/web/rc/SQL/mysql/2011121400.sql

@@ -0,0 +1,22 @@
+-- Updates from version 0.7
+
+/*!40014 SET FOREIGN_KEY_CHECKS=0 */;
+
+ALTER TABLE `contacts` DROP FOREIGN KEY `user_id_fk_contacts`;
+ALTER TABLE `contacts` DROP INDEX `user_contacts_index`;
+ALTER TABLE `contacts` MODIFY `email` text NOT NULL;
+ALTER TABLE `contacts` ADD INDEX `user_contacts_index` (`user_id`,`del`);
+ALTER TABLE `contacts` ADD CONSTRAINT `user_id_fk_contacts` FOREIGN KEY (`user_id`)
+   REFERENCES `users`(`user_id`) ON DELETE CASCADE ON UPDATE CASCADE;
+
+ALTER TABLE `cache` ALTER `user_id` DROP DEFAULT;
+ALTER TABLE `cache_index` ALTER `user_id` DROP DEFAULT;
+ALTER TABLE `cache_thread` ALTER `user_id` DROP DEFAULT;
+ALTER TABLE `cache_messages` ALTER `user_id` DROP DEFAULT;
+ALTER TABLE `contacts` ALTER `user_id` DROP DEFAULT;
+ALTER TABLE `contactgroups` ALTER `user_id` DROP DEFAULT;
+ALTER TABLE `contactgroupmembers` ALTER `contact_id` DROP DEFAULT;
+ALTER TABLE `identities` ALTER `user_id` DROP DEFAULT;
+ALTER TABLE `searches` ALTER `user_id` DROP DEFAULT;
+
+/*!40014 SET FOREIGN_KEY_CHECKS=1 */;

+ 5 - 0
data/web/rc/SQL/mysql/2012080700.sql

@@ -0,0 +1,5 @@
+-- Updates from version 0.8
+
+ALTER TABLE `cache` DROP COLUMN `cache_id`;
+ALTER TABLE `users` DROP COLUMN `alias`;
+ALTER TABLE `identities` ADD INDEX `email_identities_index` (`email`, `del`);

+ 7 - 0
data/web/rc/SQL/mysql/2013011000.sql

@@ -0,0 +1,7 @@
+-- Upgrade from 0.9-beta
+
+CREATE TABLE IF NOT EXISTS `system` (
+ `name` varchar(64) NOT NULL,
+ `value` mediumtext,
+ PRIMARY KEY(`name`)
+) /*!40000 ENGINE=INNODB */ /*!40101 CHARACTER SET utf8 COLLATE utf8_general_ci */;

+ 1 - 0
data/web/rc/SQL/mysql/2013042700.sql

@@ -0,0 +1 @@
+-- empty

+ 7 - 0
data/web/rc/SQL/mysql/2013052500.sql

@@ -0,0 +1,7 @@
+CREATE TABLE `cache_shared` (
+ `cache_key` varchar(255) /*!40101 CHARACTER SET ascii COLLATE ascii_general_ci */ NOT NULL,
+ `created` datetime NOT NULL DEFAULT '1000-01-01 00:00:00',
+ `data` longtext NOT NULL,
+ INDEX `created_index` (`created`),
+ INDEX `cache_key_index` (`cache_key`)
+) /*!40000 ENGINE=INNODB */ /*!40101 CHARACTER SET utf8 COLLATE utf8_general_ci */;

+ 24 - 0
data/web/rc/SQL/mysql/2013061000.sql

@@ -0,0 +1,24 @@
+ALTER TABLE `cache` ADD `expires` datetime DEFAULT NULL;
+ALTER TABLE `cache_shared` ADD `expires` datetime DEFAULT NULL;
+ALTER TABLE `cache_index` ADD `expires` datetime DEFAULT NULL;
+ALTER TABLE `cache_thread` ADD `expires` datetime DEFAULT NULL;
+ALTER TABLE `cache_messages` ADD `expires` datetime DEFAULT NULL;
+
+-- initialize expires column with created/changed date + 7days
+UPDATE `cache` SET `expires` = `created` + interval 604800 second;
+UPDATE `cache_shared` SET `expires` = `created` + interval 604800 second;
+UPDATE `cache_index` SET `expires` = `changed` + interval 604800 second;
+UPDATE `cache_thread` SET `expires` = `changed` + interval 604800 second;
+UPDATE `cache_messages` SET `expires` = `changed` + interval 604800 second;
+
+ALTER TABLE `cache` DROP INDEX `created_index`;
+ALTER TABLE `cache_shared` DROP INDEX `created_index`;
+ALTER TABLE `cache_index` DROP `changed`;
+ALTER TABLE `cache_thread` DROP `changed`;
+ALTER TABLE `cache_messages` DROP `changed`;
+
+ALTER TABLE `cache` ADD INDEX `expires_index` (`expires`);
+ALTER TABLE `cache_shared` ADD INDEX `expires_index` (`expires`);
+ALTER TABLE `cache_index` ADD INDEX `expires_index` (`expires`);
+ALTER TABLE `cache_thread` ADD INDEX `expires_index` (`expires`);
+ALTER TABLE `cache_messages` ADD INDEX `expires_index` (`expires`);

+ 1 - 0
data/web/rc/SQL/mysql/2014042900.sql

@@ -0,0 +1 @@
+ALTER TABLE `users` CHANGE `preferences` `preferences` longtext;

+ 1 - 0
data/web/rc/SQL/mysql/2015030800.sql

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

+ 3 - 0
data/web/rc/SQL/mysql/2015111100.sql

@@ -0,0 +1,3 @@
+ALTER TABLE `users`
+  ADD `failed_login` datetime DEFAULT NULL,
+  ADD `failed_login_counter` int(10) UNSIGNED DEFAULT NULL;

+ 1 - 0
data/web/rc/SQL/mysql/2016081200.sql

@@ -0,0 +1 @@
+ALTER TABLE `session` DROP COLUMN `created`;

+ 1 - 0
data/web/rc/SQL/mysql/2016100900.sql

@@ -0,0 +1 @@
+ALTER TABLE `session` MODIFY `ip` varchar(40) NOT NULL;

+ 24 - 0
data/web/rc/SQL/mysql/2016112200.sql

@@ -0,0 +1,24 @@
+ALTER TABLE `dictionary` ADD COLUMN `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY FIRST; -- redundant, for compat. with Galera Cluster
+
+DROP TABLE `cache`;
+DROP TABLE `cache_shared`;
+
+CREATE TABLE `cache` (
+ `user_id` int(10) UNSIGNED NOT NULL,
+ `cache_key` varchar(128) /*!40101 CHARACTER SET ascii COLLATE ascii_general_ci */ NOT NULL,
+ `expires` datetime DEFAULT NULL,
+ `data` longtext NOT NULL,
+ PRIMARY KEY (`user_id`, `cache_key`),
+ CONSTRAINT `user_id_fk_cache` FOREIGN KEY (`user_id`)
+   REFERENCES `users`(`user_id`) ON DELETE CASCADE ON UPDATE CASCADE,
+ INDEX `expires_index` (`expires`)
+) /*!40000 ENGINE=INNODB */ /*!40101 CHARACTER SET utf8 COLLATE utf8_general_ci */;
+
+
+CREATE TABLE `cache_shared` (
+ `cache_key` varchar(255) /*!40101 CHARACTER SET ascii COLLATE ascii_general_ci */ NOT NULL,
+ `expires` datetime DEFAULT NULL,
+ `data` longtext NOT NULL,
+ PRIMARY KEY (`cache_key`),
+ INDEX `expires_index` (`expires`)
+) /*!40000 ENGINE=INNODB */ /*!40101 CHARACTER SET utf8 COLLATE utf8_general_ci */;

+ 220 - 0
data/web/rc/SQL/oracle.initial.sql

@@ -0,0 +1,220 @@
+-- Roundcube Webmail initial database structure
+-- This was tested with Oracle 11g
+
+CREATE TABLE "users" (
+    "user_id" integer PRIMARY KEY,
+    "username" varchar(128) NOT NULL,
+    "mail_host" varchar(128) NOT NULL,
+    "created" timestamp with time zone DEFAULT current_timestamp NOT NULL,
+    "last_login" timestamp with time zone DEFAULT NULL,
+    "failed_login" timestamp with time zone DEFAULT NULL,
+    "failed_login_counter" integer DEFAULT NULL,
+    "language" varchar(5),
+    "preferences" long DEFAULT NULL,
+    CONSTRAINT "users_username_key" UNIQUE ("username", "mail_host")
+);
+
+CREATE SEQUENCE "users_seq"
+    START WITH 1 INCREMENT BY 1 NOMAXVALUE;
+
+CREATE TRIGGER "users_seq_trig"
+BEFORE INSERT ON "users" FOR EACH ROW
+BEGIN
+    :NEW."user_id" := "users_seq".nextval;
+END;
+/
+
+CREATE TABLE "session" (
+    "sess_id" varchar(128) NOT NULL PRIMARY KEY,
+    "changed" timestamp with time zone DEFAULT current_timestamp NOT NULL,
+    "ip" varchar(41) NOT NULL,
+    "vars" long NOT NULL
+);
+
+CREATE INDEX "session_changed_idx" ON "session" ("changed");
+
+
+CREATE TABLE "identities" (
+    "identity_id" integer PRIMARY KEY,
+    "user_id" integer NOT NULL
+        REFERENCES "users" ("user_id") ON DELETE CASCADE,
+    "changed" timestamp with time zone DEFAULT current_timestamp NOT NULL,
+    "del" smallint DEFAULT 0 NOT NULL,
+    "standard" smallint DEFAULT 0 NOT NULL,
+    "name" varchar(128) NOT NULL,
+    "organization" varchar(128),
+    "email" varchar(128) NOT NULL,
+    "reply-to" varchar(128),
+    "bcc" varchar(128),
+    "signature" long,
+    "html_signature" integer DEFAULT 0 NOT NULL
+);
+
+CREATE INDEX "identities_user_id_idx" ON "identities" ("user_id", "del");
+CREATE INDEX "identities_email_idx" ON "identities" ("email", "del");
+
+CREATE SEQUENCE "identities_seq"
+    START WITH 1 INCREMENT BY 1 NOMAXVALUE;
+
+CREATE TRIGGER "identities_seq_trig"
+BEFORE INSERT ON "identities" FOR EACH ROW
+BEGIN
+    :NEW."identity_id" := "identities_seq".nextval;
+END;
+/
+
+CREATE TABLE "contacts" (
+    "contact_id" integer PRIMARY KEY,
+    "user_id" integer NOT NULL
+        REFERENCES "users" ("user_id") ON DELETE CASCADE,
+    "changed" timestamp with time zone DEFAULT current_timestamp NOT NULL,
+    "del" smallint DEFAULT 0 NOT NULL,
+    "name" varchar(128) DEFAULT NULL,
+    "email" varchar(4000) DEFAULT NULL,
+    "firstname" varchar(128) DEFAULT NULL,
+    "surname" varchar(128) DEFAULT NULL,
+    "vcard" long,
+    "words" varchar(4000)
+);
+
+CREATE INDEX "contacts_user_id_idx" ON "contacts" ("user_id", "del");
+
+CREATE SEQUENCE "contacts_seq"
+    START WITH 1 INCREMENT BY 1 NOMAXVALUE;
+
+CREATE TRIGGER "contacts_seq_trig"
+BEFORE INSERT ON "contacts" FOR EACH ROW
+BEGIN
+    :NEW."contact_id" := "contacts_seq".nextval;
+END;
+/
+
+CREATE TABLE "contactgroups" (
+    "contactgroup_id" integer PRIMARY KEY,
+    "user_id" integer NOT NULL
+        REFERENCES "users" ("user_id") ON DELETE CASCADE,
+    "changed" timestamp with time zone DEFAULT current_timestamp NOT NULL,
+    "del" smallint DEFAULT 0 NOT NULL,
+    "name" varchar(128) NOT NULL
+);
+
+CREATE INDEX "contactgroups_user_id_idx" ON "contactgroups" ("user_id", "del");
+
+CREATE SEQUENCE "contactgroups_seq"
+    START WITH 1 INCREMENT BY 1 NOMAXVALUE;
+
+CREATE TRIGGER "contactgroups_seq_trig"
+BEFORE INSERT ON "contactgroups" FOR EACH ROW
+BEGIN
+    :NEW."contactgroup_id" := "contactgroups_seq".nextval;
+END;
+/
+
+CREATE TABLE "contactgroupmembers" (
+    "contactgroup_id" integer NOT NULL
+        REFERENCES "contactgroups" ("contactgroup_id") ON DELETE CASCADE,
+    "contact_id" integer NOT NULL
+        REFERENCES "contacts" ("contact_id") ON DELETE CASCADE,
+    "created" timestamp with time zone DEFAULT current_timestamp NOT NULL,
+    PRIMARY KEY ("contactgroup_id", "contact_id")
+);
+
+CREATE INDEX "contactgroupmembers_idx" ON "contactgroupmembers" ("contact_id");
+
+
+CREATE TABLE "cache" (
+    "user_id" integer NOT NULL
+        REFERENCES "users" ("user_id") ON DELETE CASCADE,
+    "cache_key" varchar(128) NOT NULL,
+    "expires" timestamp with time zone DEFAULT NULL,
+    "data" long NOT NULL,
+    PRIMARY KEY ("user_id", "cache_key")
+);
+
+CREATE INDEX "cache_expires_idx" ON "cache" ("expires");
+
+
+CREATE TABLE "cache_shared" (
+    "cache_key" varchar(255) NOT NULL,
+    "expires" timestamp with time zone DEFAULT NULL,
+    "data" long NOT NULL,
+    PRIMARY KEY ("cache_key")
+);
+
+CREATE INDEX "cache_shared_expires_idx" ON "cache_shared" ("expires");
+
+
+CREATE TABLE "cache_index" (
+    "user_id" integer NOT NULL
+        REFERENCES "users" ("user_id") ON DELETE CASCADE,
+    "mailbox" varchar(255) NOT NULL,
+    "expires" timestamp with time zone DEFAULT NULL,
+    "valid" smallint DEFAULT 0 NOT NULL,
+    "data" long NOT NULL,
+    PRIMARY KEY ("user_id", "mailbox")
+);
+
+CREATE INDEX "cache_index_expires_idx" ON "cache_index" ("expires");
+
+
+CREATE TABLE "cache_thread" (
+    "user_id" integer NOT NULL
+        REFERENCES "users" ("user_id") ON DELETE CASCADE,
+    "mailbox" varchar(255) NOT NULL,
+    "expires" timestamp with time zone DEFAULT NULL,
+    "data" long NOT NULL,
+    PRIMARY KEY ("user_id", "mailbox")
+);
+
+CREATE INDEX "cache_thread_expires_idx" ON "cache_thread" ("expires");
+
+
+CREATE TABLE "cache_messages" (
+    "user_id" integer NOT NULL
+        REFERENCES "users" ("user_id") ON DELETE CASCADE,
+    "mailbox" varchar(255) NOT NULL,
+    "uid" integer NOT NULL,
+    "expires" timestamp with time zone DEFAULT NULL,
+    "data" long NOT NULL,
+    "flags" integer DEFAULT 0 NOT NULL,
+    PRIMARY KEY ("user_id", "mailbox", "uid")
+);
+
+CREATE INDEX "cache_messages_expires_idx" ON "cache_messages" ("expires");
+
+
+CREATE TABLE "dictionary" (
+    "user_id" integer DEFAULT NULL
+        REFERENCES "users" ("user_id") ON DELETE CASCADE,
+    "language" varchar(5) NOT NULL,
+    "data" long DEFAULT NULL,
+    CONSTRAINT "dictionary_user_id_lang_key" UNIQUE ("user_id", "language")
+);
+
+
+CREATE TABLE "searches" (
+    "search_id" integer PRIMARY KEY,
+    "user_id" integer NOT NULL
+        REFERENCES "users" ("user_id") ON DELETE CASCADE,
+    "type" smallint DEFAULT 0 NOT NULL,
+    "name" varchar(128) NOT NULL,
+    "data" long NOT NULL,
+    CONSTRAINT "searches_user_id_key" UNIQUE ("user_id", "type", "name")
+);
+
+CREATE SEQUENCE "searches_seq"
+    START WITH 1 INCREMENT BY 1 NOMAXVALUE;
+
+CREATE TRIGGER "searches_seq_trig"
+BEFORE INSERT ON "searches" FOR EACH ROW
+BEGIN
+    :NEW."search_id" := "searches_seq".nextval;
+END;
+/
+
+CREATE TABLE "system" (
+    "name" varchar(64) NOT NULL PRIMARY KEY,
+    "value" long
+);
+
+INSERT INTO "system" ("name", "value") VALUES ('roundcube-version', '2016112200');

+ 1 - 0
data/web/rc/SQL/oracle/2015030800.sql

@@ -0,0 +1 @@
+-- empty

+ 2 - 0
data/web/rc/SQL/oracle/2015111100.sql

@@ -0,0 +1,2 @@
+ALTER TABLE "users" ADD "failed_login" timestamp with time zone DEFAULT NULL;
+ALTER TABLE "users" ADD "failed_login_counter" integer DEFAULT NULL;

+ 1 - 0
data/web/rc/SQL/oracle/2016081200.sql

@@ -0,0 +1 @@
+ALTER TABLE "session" DROP COLUMN "created";

+ 1 - 0
data/web/rc/SQL/oracle/2016100900.sql

@@ -0,0 +1 @@
+ALTER TABLE "session" MODIFY "ip" varchar(41) NOT NULL;

+ 23 - 0
data/web/rc/SQL/oracle/2016112200.sql

@@ -0,0 +1,23 @@
+DROP TABLE "cache";
+DROP TABLE "cache_shared";
+
+CREATE TABLE "cache" (
+    "user_id" integer NOT NULL
+        REFERENCES "users" ("user_id") ON DELETE CASCADE,
+    "cache_key" varchar(128) NOT NULL,
+    "expires" timestamp with time zone DEFAULT NULL,
+    "data" long NOT NULL,
+    PRIMARY KEY ("user_id", "cache_key")
+);
+
+CREATE INDEX "cache_expires_idx" ON "cache" ("expires");
+
+
+CREATE TABLE "cache_shared" (
+    "cache_key" varchar(255) NOT NULL,
+    "expires" timestamp with time zone DEFAULT NULL,
+    "data" long NOT NULL,
+    PRIMARY KEY ("cache_key")
+);
+
+CREATE INDEX "cache_shared_expires_idx" ON "cache_shared" ("expires");

+ 291 - 0
data/web/rc/SQL/postgres.initial.sql

@@ -0,0 +1,291 @@
+-- Roundcube Webmail initial database structure
+
+--
+-- Sequence "users_seq"
+-- Name: users_seq; Type: SEQUENCE; Schema: public; Owner: postgres
+--
+
+CREATE SEQUENCE users_seq
+    INCREMENT BY 1
+    NO MAXVALUE
+    NO MINVALUE
+    CACHE 1;
+
+--
+-- Table "users"
+-- Name: users; Type: TABLE; Schema: public; Owner: postgres
+--
+
+CREATE TABLE users (
+    user_id integer DEFAULT nextval('users_seq'::text) PRIMARY KEY,
+    username varchar(128) DEFAULT '' NOT NULL,
+    mail_host varchar(128) DEFAULT '' NOT NULL,
+    created timestamp with time zone DEFAULT now() NOT NULL,
+    last_login timestamp with time zone DEFAULT NULL,
+    failed_login timestamp with time zone DEFAULT NULL,
+    failed_login_counter integer DEFAULT NULL,
+    "language" varchar(5),
+    preferences text DEFAULT ''::text NOT NULL,
+    CONSTRAINT users_username_key UNIQUE (username, mail_host)
+);
+
+
+--
+-- Table "session"
+-- Name: session; Type: TABLE; Schema: public; Owner: postgres
+--
+
+CREATE TABLE "session" (
+    sess_id varchar(128) DEFAULT '' PRIMARY KEY,
+    changed timestamp with time zone DEFAULT now() NOT NULL,
+    ip varchar(41) NOT NULL,
+    vars text NOT NULL
+);
+
+CREATE INDEX session_changed_idx ON session (changed);
+
+
+--
+-- Sequence "identities_seq"
+-- Name: identities_seq; Type: SEQUENCE; Schema: public; Owner: postgres
+--
+
+CREATE SEQUENCE identities_seq
+    START WITH 1
+    INCREMENT BY 1
+    NO MAXVALUE
+    NO MINVALUE
+    CACHE 1;
+
+--
+-- Table "identities"
+-- Name: identities; Type: TABLE; Schema: public; Owner: postgres
+--
+
+CREATE TABLE identities (
+    identity_id integer DEFAULT nextval('identities_seq'::text) PRIMARY KEY,
+    user_id integer NOT NULL
+        REFERENCES users (user_id) ON DELETE CASCADE ON UPDATE CASCADE,
+    changed timestamp with time zone DEFAULT now() NOT NULL,
+    del smallint DEFAULT 0 NOT NULL,
+    standard smallint DEFAULT 0 NOT NULL,
+    name varchar(128) NOT NULL,
+    organization varchar(128),
+    email varchar(128) NOT NULL,
+    "reply-to" varchar(128),
+    bcc varchar(128),
+    signature text,
+    html_signature integer DEFAULT 0 NOT NULL
+);
+
+CREATE INDEX identities_user_id_idx ON identities (user_id, del);
+CREATE INDEX identities_email_idx ON identities (email, del);
+
+
+--
+-- Sequence "contacts_seq"
+-- Name: contacts_seq; Type: SEQUENCE; Schema: public; Owner: postgres
+--
+
+CREATE SEQUENCE contacts_seq
+    START WITH 1
+    INCREMENT BY 1
+    NO MAXVALUE
+    NO MINVALUE
+    CACHE 1;
+
+--
+-- Table "contacts"
+-- Name: contacts; Type: TABLE; Schema: public; Owner: postgres
+--
+
+CREATE TABLE contacts (
+    contact_id integer DEFAULT nextval('contacts_seq'::text) PRIMARY KEY,
+    user_id integer NOT NULL
+        REFERENCES users (user_id) ON DELETE CASCADE ON UPDATE CASCADE,
+    changed timestamp with time zone DEFAULT now() NOT NULL,
+    del smallint DEFAULT 0 NOT NULL,
+    name varchar(128) DEFAULT '' NOT NULL,
+    email text DEFAULT '' NOT NULL,
+    firstname varchar(128) DEFAULT '' NOT NULL,
+    surname varchar(128) DEFAULT '' NOT NULL,
+    vcard text,
+    words text
+);
+
+CREATE INDEX contacts_user_id_idx ON contacts (user_id, del);
+
+--
+-- Sequence "contactgroups_seq"
+-- Name: contactgroups_seq; Type: SEQUENCE; Schema: public; Owner: postgres
+--
+
+CREATE SEQUENCE contactgroups_seq
+    INCREMENT BY 1
+    NO MAXVALUE
+    NO MINVALUE
+    CACHE 1;
+
+--
+-- Table "contactgroups"
+-- Name: contactgroups; Type: TABLE; Schema: public; Owner: postgres
+--
+
+CREATE TABLE contactgroups (
+    contactgroup_id integer DEFAULT nextval('contactgroups_seq'::text) PRIMARY KEY,
+    user_id integer NOT NULL
+        REFERENCES users(user_id) ON DELETE CASCADE ON UPDATE CASCADE,
+    changed timestamp with time zone DEFAULT now() NOT NULL,
+    del smallint NOT NULL DEFAULT 0,
+    name varchar(128) NOT NULL DEFAULT ''
+);
+
+CREATE INDEX contactgroups_user_id_idx ON contactgroups (user_id, del);
+
+--
+-- Table "contactgroupmembers"
+-- Name: contactgroupmembers; Type: TABLE; Schema: public; Owner: postgres
+--
+
+CREATE TABLE contactgroupmembers (
+    contactgroup_id integer NOT NULL
+        REFERENCES contactgroups(contactgroup_id) ON DELETE CASCADE ON UPDATE CASCADE,
+    contact_id integer NOT NULL
+        REFERENCES contacts(contact_id) ON DELETE CASCADE ON UPDATE CASCADE,
+    created timestamp with time zone DEFAULT now() NOT NULL,
+    PRIMARY KEY (contactgroup_id, contact_id)
+);
+
+CREATE INDEX contactgroupmembers_contact_id_idx ON contactgroupmembers (contact_id);
+
+--
+-- Table "cache"
+-- Name: cache; Type: TABLE; Schema: public; Owner: postgres
+--
+
+CREATE TABLE "cache" (
+    user_id integer NOT NULL
+        REFERENCES users (user_id) ON DELETE CASCADE ON UPDATE CASCADE,
+    cache_key varchar(128) DEFAULT '' NOT NULL,
+    expires timestamp with time zone DEFAULT NULL,
+    data text NOT NULL,
+    PRIMARY KEY (user_id, cache_key)
+);
+
+CREATE INDEX cache_expires_idx ON "cache" (expires);
+
+--
+-- Table "cache_shared"
+-- Name: cache_shared; Type: TABLE; Schema: public; Owner: postgres
+--
+
+CREATE TABLE "cache_shared" (
+    cache_key varchar(255) NOT NULL PRIMARY KEY,
+    expires timestamp with time zone DEFAULT NULL,
+    data text NOT NULL
+);
+
+CREATE INDEX cache_shared_expires_idx ON "cache_shared" (expires);
+
+--
+-- Table "cache_index"
+-- Name: cache_index; Type: TABLE; Schema: public; Owner: postgres
+--
+
+CREATE TABLE cache_index (
+    user_id integer NOT NULL
+        REFERENCES users (user_id) ON DELETE CASCADE ON UPDATE CASCADE,
+    mailbox varchar(255) NOT NULL,
+    expires timestamp with time zone DEFAULT NULL,
+    valid smallint NOT NULL DEFAULT 0,
+    data text NOT NULL,
+    PRIMARY KEY (user_id, mailbox)
+);
+
+CREATE INDEX cache_index_expires_idx ON cache_index (expires);
+
+--
+-- Table "cache_thread"
+-- Name: cache_thread; Type: TABLE; Schema: public; Owner: postgres
+--
+
+CREATE TABLE cache_thread (
+    user_id integer NOT NULL
+        REFERENCES users (user_id) ON DELETE CASCADE ON UPDATE CASCADE,
+    mailbox varchar(255) NOT NULL,
+    expires timestamp with time zone DEFAULT NULL,
+    data text NOT NULL,
+    PRIMARY KEY (user_id, mailbox)
+);
+
+CREATE INDEX cache_thread_expires_idx ON cache_thread (expires);
+
+--
+-- Table "cache_messages"
+-- Name: cache_messages; Type: TABLE; Schema: public; Owner: postgres
+--
+
+CREATE TABLE cache_messages (
+    user_id integer NOT NULL
+        REFERENCES users (user_id) ON DELETE CASCADE ON UPDATE CASCADE,
+    mailbox varchar(255) NOT NULL,
+    uid integer NOT NULL,
+    expires timestamp with time zone DEFAULT NULL,
+    data text NOT NULL,
+    flags integer NOT NULL DEFAULT 0,
+    PRIMARY KEY (user_id, mailbox, uid)
+);
+
+CREATE INDEX cache_messages_expires_idx ON cache_messages (expires);
+
+--
+-- Table "dictionary"
+-- Name: dictionary; Type: TABLE; Schema: public; Owner: postgres
+--
+
+CREATE TABLE dictionary (
+    user_id integer DEFAULT NULL
+        REFERENCES users (user_id) ON DELETE CASCADE ON UPDATE CASCADE,
+   "language" varchar(5) NOT NULL,
+    data text NOT NULL,
+    CONSTRAINT dictionary_user_id_language_key UNIQUE (user_id, "language")
+);
+
+--
+-- Sequence "searches_seq"
+-- Name: searches_seq; Type: SEQUENCE; Schema: public; Owner: postgres
+--
+
+CREATE SEQUENCE searches_seq
+    INCREMENT BY 1
+    NO MAXVALUE
+    NO MINVALUE
+    CACHE 1;
+
+--
+-- Table "searches"
+-- Name: searches; Type: TABLE; Schema: public; Owner: postgres
+--
+
+CREATE TABLE searches (
+    search_id integer DEFAULT nextval('searches_seq'::text) PRIMARY KEY,
+    user_id integer NOT NULL
+        REFERENCES users (user_id) ON DELETE CASCADE ON UPDATE CASCADE,
+    "type" smallint DEFAULT 0 NOT NULL,
+    name varchar(128) NOT NULL,
+    data text NOT NULL,
+    CONSTRAINT searches_user_id_key UNIQUE (user_id, "type", name)
+);
+
+
+--
+-- Table "system"
+-- Name: system; Type: TABLE; Schema: public; Owner: postgres
+--
+
+CREATE TABLE "system" (
+    name varchar(64) NOT NULL PRIMARY KEY,
+    value text
+);
+
+INSERT INTO system (name, value) VALUES ('roundcube-version', '2016112200');

+ 18 - 0
data/web/rc/SQL/postgres/2008030300.sql

@@ -0,0 +1,18 @@
+-- Updates from version 0.1-stable to 0.1.1
+
+CREATE INDEX cache_user_id_idx ON cache (user_id, cache_key);
+CREATE INDEX contacts_user_id_idx ON contacts (user_id);
+CREATE INDEX identities_user_id_idx ON identities (user_id);
+
+CREATE INDEX users_username_id_idx ON users (username);
+CREATE INDEX users_alias_id_idx ON users (alias);
+
+-- added ON DELETE/UPDATE actions
+ALTER TABLE messages DROP CONSTRAINT messages_user_id_fkey;
+ALTER TABLE messages ADD FOREIGN KEY (user_id) REFERENCES users(user_id) ON DELETE CASCADE ON UPDATE CASCADE;
+ALTER TABLE identities DROP CONSTRAINT identities_user_id_fkey;
+ALTER TABLE identities ADD FOREIGN KEY (user_id) REFERENCES users(user_id) ON DELETE CASCADE ON UPDATE CASCADE;
+ALTER TABLE contacts DROP CONSTRAINT contacts_user_id_fkey;
+ALTER TABLE contacts ADD FOREIGN KEY (user_id) REFERENCES users(user_id) ON DELETE CASCADE ON UPDATE CASCADE;
+ALTER TABLE cache DROP CONSTRAINT cache_user_id_fkey;
+ALTER TABLE cache ADD FOREIGN KEY (user_id) REFERENCES users(user_id) ON DELETE CASCADE ON UPDATE CASCADE;

+ 3 - 0
data/web/rc/SQL/postgres/2008060900.sql

@@ -0,0 +1,3 @@
+-- Updates from version 0.2-alpha
+
+CREATE INDEX messages_created_idx ON messages (created);

+ 14 - 0
data/web/rc/SQL/postgres/2008092100.sql

@@ -0,0 +1,14 @@
+-- Updates from version 0.2-beta
+
+ALTER TABLE cache DROP session_id;
+
+CREATE INDEX session_changed_idx ON session (changed);
+CREATE INDEX cache_created_idx ON "cache" (created);
+
+ALTER TABLE users ALTER "language" DROP NOT NULL;
+ALTER TABLE users ALTER "language" DROP DEFAULT;
+
+ALTER TABLE identities ALTER del TYPE smallint;
+ALTER TABLE identities ALTER standard TYPE smallint;
+ALTER TABLE contacts ALTER del TYPE smallint;
+ALTER TABLE messages ALTER del TYPE smallint;

+ 6 - 0
data/web/rc/SQL/postgres/2009090400.sql

@@ -0,0 +1,6 @@
+-- Updates from version 0.3-stable
+
+TRUNCATE messages;
+CREATE INDEX messages_index_idx ON messages (user_id, cache_key, idx);
+DROP INDEX contacts_user_id_idx;
+CREATE INDEX contacts_user_id_idx ON contacts (user_id, email);

+ 32 - 0
data/web/rc/SQL/postgres/2009103100.sql

@@ -0,0 +1,32 @@
+-- Updates from version 0.3.1
+
+DROP INDEX identities_user_id_idx;
+CREATE INDEX identities_user_id_idx ON identities (user_id, del);
+
+ALTER TABLE identities ADD changed timestamp with time zone DEFAULT now() NOT NULL;
+
+CREATE SEQUENCE contactgroups_ids
+    INCREMENT BY 1
+    NO MAXVALUE
+    NO MINVALUE
+    CACHE 1;
+
+CREATE TABLE contactgroups (
+    contactgroup_id integer DEFAULT nextval('contactgroups_ids'::text) PRIMARY KEY,
+    user_id integer NOT NULL
+        REFERENCES users(user_id) ON DELETE CASCADE ON UPDATE CASCADE,
+    changed timestamp with time zone DEFAULT now() NOT NULL,
+    del smallint NOT NULL DEFAULT 0,
+    name varchar(128) NOT NULL DEFAULT ''
+);
+
+CREATE INDEX contactgroups_user_id_idx ON contactgroups (user_id, del);
+
+CREATE TABLE contactgroupmembers (
+    contactgroup_id integer NOT NULL
+        REFERENCES contactgroups(contactgroup_id) ON DELETE CASCADE ON UPDATE CASCADE,
+    contact_id integer NOT NULL
+        REFERENCES contacts(contact_id) ON DELETE CASCADE ON UPDATE CASCADE,
+    created timestamp with time zone DEFAULT now() NOT NULL,
+    PRIMARY KEY (contactgroup_id, contact_id)
+);

+ 4 - 0
data/web/rc/SQL/postgres/2010042300.sql

@@ -0,0 +1,4 @@
+-- Updates from version 0.4-beta
+
+ALTER TABLE users ALTER last_login DROP NOT NULL;
+ALTER TABLE users ALTER last_login SET DEFAULT NULL;

+ 7 - 0
data/web/rc/SQL/postgres/2010100600.sql

@@ -0,0 +1,7 @@
+-- Updates from version 0.4.2
+
+DROP INDEX users_username_id_idx;
+ALTER TABLE users ADD CONSTRAINT users_username_key UNIQUE (username, mail_host);
+ALTER TABLE contacts ALTER email TYPE varchar(255);
+
+TRUNCATE messages;

+ 7 - 0
data/web/rc/SQL/postgres/2011011200.sql

@@ -0,0 +1,7 @@
+-- Updates from version 0.5.x
+
+ALTER TABLE contacts ADD words TEXT NULL;
+CREATE INDEX contactgroupmembers_contact_id_idx ON contactgroupmembers (contact_id);
+
+TRUNCATE messages;
+TRUNCATE cache;

+ 64 - 0
data/web/rc/SQL/postgres/2011092800.sql

@@ -0,0 +1,64 @@
+-- Updates from version 0.6
+
+CREATE TABLE dictionary (
+    user_id integer DEFAULT NULL
+        REFERENCES users (user_id) ON DELETE CASCADE ON UPDATE CASCADE,
+   "language" varchar(5) NOT NULL,
+    data text NOT NULL,
+    CONSTRAINT dictionary_user_id_language_key UNIQUE (user_id, "language")
+);
+
+CREATE SEQUENCE search_ids
+    INCREMENT BY 1
+    NO MAXVALUE
+    NO MINVALUE
+    CACHE 1;
+
+CREATE TABLE searches (
+    search_id integer DEFAULT nextval('search_ids'::text) PRIMARY KEY,
+    user_id integer NOT NULL
+        REFERENCES users (user_id) ON DELETE CASCADE ON UPDATE CASCADE,
+    "type" smallint DEFAULT 0 NOT NULL,
+    name varchar(128) NOT NULL,
+    data text NOT NULL,
+    CONSTRAINT searches_user_id_key UNIQUE (user_id, "type", name)
+);
+
+DROP SEQUENCE message_ids;
+DROP TABLE messages;
+
+CREATE TABLE cache_index (
+    user_id integer NOT NULL
+        REFERENCES users (user_id) ON DELETE CASCADE ON UPDATE CASCADE,
+    mailbox varchar(255) NOT NULL,
+    changed timestamp with time zone DEFAULT now() NOT NULL,
+    valid smallint NOT NULL DEFAULT 0,
+    data text NOT NULL,
+    PRIMARY KEY (user_id, mailbox)
+);
+
+CREATE INDEX cache_index_changed_idx ON cache_index (changed);
+
+CREATE TABLE cache_thread (
+    user_id integer NOT NULL
+        REFERENCES users (user_id) ON DELETE CASCADE ON UPDATE CASCADE,
+    mailbox varchar(255) NOT NULL,
+    changed timestamp with time zone DEFAULT now() NOT NULL,
+    data text NOT NULL,
+    PRIMARY KEY (user_id, mailbox)
+);
+
+CREATE INDEX cache_thread_changed_idx ON cache_thread (changed);
+
+CREATE TABLE cache_messages (
+    user_id integer NOT NULL
+        REFERENCES users (user_id) ON DELETE CASCADE ON UPDATE CASCADE,
+    mailbox varchar(255) NOT NULL,
+    uid integer NOT NULL,
+    changed timestamp with time zone DEFAULT now() NOT NULL,
+    data text NOT NULL,
+    flags integer NOT NULL DEFAULT 0,
+    PRIMARY KEY (user_id, mailbox, uid)
+);
+
+CREATE INDEX cache_messages_changed_idx ON cache_messages (changed);

+ 3 - 0
data/web/rc/SQL/postgres/2011111600.sql

@@ -0,0 +1,3 @@
+-- Updates from version 0.7-beta
+
+ALTER TABLE "session" ALTER sess_id TYPE varchar(128);

+ 5 - 0
data/web/rc/SQL/postgres/2011121400.sql

@@ -0,0 +1,5 @@
+-- Updates from version 0.7
+
+DROP INDEX contacts_user_id_idx;
+CREATE INDEX contacts_user_id_idx ON contacts USING btree (user_id, del);
+ALTER TABLE contacts ALTER email TYPE text;

+ 7 - 0
data/web/rc/SQL/postgres/2012080700.sql

@@ -0,0 +1,7 @@
+-- Updates from version 0.8
+
+ALTER TABLE cache DROP COLUMN cache_id;
+DROP SEQUENCE cache_ids;
+
+ALTER TABLE users DROP COLUMN alias;
+CREATE INDEX identities_email_idx ON identities (email, del);

+ 4 - 0
data/web/rc/SQL/postgres/2013011000.sql

@@ -0,0 +1,4 @@
+CREATE TABLE "system" (
+    name varchar(64) NOT NULL PRIMARY KEY,
+    value text
+);

+ 14 - 0
data/web/rc/SQL/postgres/2013042700.sql

@@ -0,0 +1,14 @@
+ALTER SEQUENCE user_ids RENAME TO users_seq;
+ALTER TABLE users ALTER COLUMN user_id SET DEFAULT nextval('users_seq'::text);
+
+ALTER SEQUENCE identity_ids RENAME TO identities_seq;
+ALTER TABLE identities ALTER COLUMN identity_id SET DEFAULT nextval('identities_seq'::text);
+
+ALTER SEQUENCE contact_ids RENAME TO contacts_seq;
+ALTER TABLE contacts ALTER COLUMN contact_id SET DEFAULT nextval('contacts_seq'::text);
+
+ALTER SEQUENCE contactgroups_ids RENAME TO contactgroups_seq;
+ALTER TABLE contactgroups ALTER COLUMN contactgroup_id SET DEFAULT nextval('contactgroups_seq'::text);
+
+ALTER SEQUENCE search_ids RENAME TO searches_seq;
+ALTER TABLE searches ALTER COLUMN search_id SET DEFAULT nextval('searches_seq'::text);

+ 8 - 0
data/web/rc/SQL/postgres/2013052500.sql

@@ -0,0 +1,8 @@
+CREATE TABLE "cache_shared" (
+    cache_key varchar(255) NOT NULL,
+    created timestamp with time zone DEFAULT now() NOT NULL,
+    data text NOT NULL
+);
+
+CREATE INDEX cache_shared_cache_key_idx ON "cache_shared" (cache_key);
+CREATE INDEX cache_shared_created_idx ON "cache_shared" (created);

+ 24 - 0
data/web/rc/SQL/postgres/2013061000.sql

@@ -0,0 +1,24 @@
+ALTER TABLE "cache" ADD expires timestamp with time zone DEFAULT NULL;
+ALTER TABLE "cache_shared" ADD expires timestamp with time zone DEFAULT NULL;
+ALTER TABLE "cache_index" ADD expires timestamp with time zone DEFAULT NULL;
+ALTER TABLE "cache_thread" ADD expires timestamp with time zone DEFAULT NULL;
+ALTER TABLE "cache_messages" ADD expires timestamp with time zone DEFAULT NULL;
+
+-- initialize expires column with created/changed date + 7days
+UPDATE "cache" SET expires = created + interval '604800 seconds';
+UPDATE "cache_shared" SET expires = created + interval '604800 seconds';
+UPDATE "cache_index" SET expires = changed + interval '604800 seconds';
+UPDATE "cache_thread" SET expires = changed + interval '604800 seconds';
+UPDATE "cache_messages" SET expires = changed + interval '604800 seconds';
+
+DROP INDEX cache_created_idx;
+DROP INDEX cache_shared_created_idx;
+ALTER TABLE "cache_index" DROP "changed";
+ALTER TABLE "cache_thread" DROP "changed";
+ALTER TABLE "cache_messages" DROP "changed";
+
+CREATE INDEX cache_expires_idx ON "cache" (expires);
+CREATE INDEX cache_shared_expires_idx ON "cache_shared" (expires);
+CREATE INDEX cache_index_expires_idx ON "cache_index" (expires);
+CREATE INDEX cache_thread_expires_idx ON "cache_thread" (expires);
+CREATE INDEX cache_messages_expires_idx ON "cache_messages" (expires);

+ 1 - 0
data/web/rc/SQL/postgres/2014042900.sql

@@ -0,0 +1 @@
+-- empty

+ 1 - 0
data/web/rc/SQL/postgres/2015030800.sql

@@ -0,0 +1 @@
+-- empty

+ 2 - 0
data/web/rc/SQL/postgres/2015111100.sql

@@ -0,0 +1,2 @@
+ALTER TABLE "users" ADD failed_login timestamp with time zone DEFAULT NULL;
+ALTER TABLE "users" ADD failed_login_counter integer DEFAULT NULL;

+ 1 - 0
data/web/rc/SQL/postgres/2016081200.sql

@@ -0,0 +1 @@
+ALTER TABLE "session" DROP COLUMN created;

+ 1 - 0
data/web/rc/SQL/postgres/2016100900.sql

@@ -0,0 +1 @@
+ALTER TABLE session ALTER COLUMN ip TYPE character varying(41);

+ 21 - 0
data/web/rc/SQL/postgres/2016112200.sql

@@ -0,0 +1,21 @@
+DROP TABLE "cache";
+DROP TABLE "cache_shared";
+
+CREATE TABLE "cache" (
+    user_id integer NOT NULL
+        REFERENCES users (user_id) ON DELETE CASCADE ON UPDATE CASCADE,
+    cache_key varchar(128) DEFAULT '' NOT NULL,
+    expires timestamp with time zone DEFAULT NULL,
+    data text NOT NULL,
+    PRIMARY KEY (user_id, cache_key)
+);
+
+CREATE INDEX cache_expires_idx ON "cache" (expires);
+
+CREATE TABLE "cache_shared" (
+    cache_key varchar(255) NOT NULL PRIMARY KEY,
+    expires timestamp with time zone DEFAULT NULL,
+    data text NOT NULL
+);
+
+CREATE INDEX cache_shared_expires_idx ON "cache_shared" (expires);

+ 203 - 0
data/web/rc/SQL/sqlite.initial.sql

@@ -0,0 +1,203 @@
+-- Roundcube Webmail initial database structure
+
+-- 
+-- Table structure for table contacts and related
+-- 
+
+CREATE TABLE contacts (
+  contact_id integer NOT NULL PRIMARY KEY,
+  user_id integer NOT NULL,
+  changed datetime NOT NULL default '0000-00-00 00:00:00',
+  del tinyint NOT NULL default '0',
+  name varchar(128) NOT NULL default '',
+  email text NOT NULL default '',
+  firstname varchar(128) NOT NULL default '',
+  surname varchar(128) NOT NULL default '',
+  vcard text NOT NULL default '',
+  words text NOT NULL default ''
+);
+
+CREATE INDEX ix_contacts_user_id ON contacts(user_id, del);
+
+
+CREATE TABLE contactgroups (
+  contactgroup_id integer NOT NULL PRIMARY KEY,
+  user_id integer NOT NULL default '0',
+  changed datetime NOT NULL default '0000-00-00 00:00:00',
+  del tinyint NOT NULL default '0',
+  name varchar(128) NOT NULL default ''
+);
+
+CREATE INDEX ix_contactgroups_user_id ON contactgroups(user_id, del);
+
+
+CREATE TABLE contactgroupmembers (
+  contactgroup_id integer NOT NULL,
+  contact_id integer NOT NULL default '0',
+  created datetime NOT NULL default '0000-00-00 00:00:00',
+  PRIMARY KEY (contactgroup_id, contact_id)
+);
+
+CREATE INDEX ix_contactgroupmembers_contact_id ON contactgroupmembers (contact_id);
+
+-- 
+-- Table structure for table identities
+-- 
+
+CREATE TABLE identities (
+  identity_id integer NOT NULL PRIMARY KEY,
+  user_id integer NOT NULL default '0',
+  changed datetime NOT NULL default '0000-00-00 00:00:00',
+  del tinyint NOT NULL default '0',
+  standard tinyint NOT NULL default '0',
+  name varchar(128) NOT NULL default '',
+  organization varchar(128) default '',
+  email varchar(128) NOT NULL default '',
+  "reply-to" varchar(128) NOT NULL default '',
+  bcc varchar(128) NOT NULL default '',
+  signature text NOT NULL default '',
+  html_signature tinyint NOT NULL default '0'
+);
+
+CREATE INDEX ix_identities_user_id ON identities(user_id, del);
+CREATE INDEX ix_identities_email ON identities(email, del);
+
+-- 
+-- Table structure for table users
+-- 
+
+CREATE TABLE users (
+  user_id integer NOT NULL PRIMARY KEY,
+  username varchar(128) NOT NULL default '',
+  mail_host varchar(128) NOT NULL default '',
+  created datetime NOT NULL default '0000-00-00 00:00:00',
+  last_login datetime DEFAULT NULL,
+  failed_login datetime DEFAULT NULL,
+  failed_login_counter integer DEFAULT NULL,
+  language varchar(5),
+  preferences text NOT NULL default ''
+);
+
+CREATE UNIQUE INDEX ix_users_username ON users(username, mail_host);
+
+-- 
+-- Table structure for table session
+-- 
+
+CREATE TABLE session (
+  sess_id varchar(128) NOT NULL PRIMARY KEY,
+  changed datetime NOT NULL default '0000-00-00 00:00:00',
+  ip varchar(40) NOT NULL default '',
+  vars text NOT NULL
+);
+
+CREATE INDEX ix_session_changed ON session (changed);
+
+--
+-- Table structure for table dictionary
+--
+
+CREATE TABLE dictionary (
+    user_id integer DEFAULT NULL,
+   "language" varchar(5) NOT NULL,
+    data text NOT NULL
+);
+
+CREATE UNIQUE INDEX ix_dictionary_user_language ON dictionary (user_id, "language");
+
+--
+-- Table structure for table searches
+--
+
+CREATE TABLE searches (
+  search_id integer NOT NULL PRIMARY KEY,
+  user_id integer NOT NULL DEFAULT '0',
+  "type" smallint NOT NULL DEFAULT '0',
+  name varchar(128) NOT NULL,
+  data text NOT NULL
+);
+
+CREATE UNIQUE INDEX ix_searches_user_type_name ON searches (user_id, type, name);
+
+-- 
+-- Table structure for table cache
+-- 
+
+CREATE TABLE cache (
+  user_id integer NOT NULL default 0,
+  cache_key varchar(128) NOT NULL default '',
+  expires datetime DEFAULT NULL,
+  data text NOT NULL,
+  PRIMARY KEY (user_id, cache_key)
+);
+
+CREATE INDEX ix_cache_expires ON cache(expires);
+
+-- 
+-- Table structure for table cache_shared
+-- 
+
+CREATE TABLE cache_shared (
+  cache_key varchar(255) NOT NULL,
+  expires datetime DEFAULT NULL,
+  data text NOT NULL,
+  PRIMARY KEY (cache_key)
+);
+
+CREATE INDEX ix_cache_shared_expires ON cache_shared(expires);
+
+--
+-- Table structure for table cache_index
+--
+
+CREATE TABLE cache_index (
+    user_id integer NOT NULL,
+    mailbox varchar(255) NOT NULL,
+    expires datetime DEFAULT NULL,
+    valid smallint NOT NULL DEFAULT '0',
+    data text NOT NULL,
+    PRIMARY KEY (user_id, mailbox)
+);
+
+CREATE INDEX ix_cache_index_expires ON cache_index (expires);
+
+--
+-- Table structure for table cache_thread
+--
+
+CREATE TABLE cache_thread (
+    user_id integer NOT NULL,
+    mailbox varchar(255) NOT NULL,
+    expires datetime DEFAULT NULL,
+    data text NOT NULL,
+    PRIMARY KEY (user_id, mailbox)
+);
+
+CREATE INDEX ix_cache_thread_expires ON cache_thread (expires);
+
+--
+-- Table structure for table cache_messages
+--
+
+CREATE TABLE cache_messages (
+    user_id integer NOT NULL,
+    mailbox varchar(255) NOT NULL,
+    uid integer NOT NULL,
+    expires datetime DEFAULT NULL,
+    data text NOT NULL,
+    flags integer NOT NULL DEFAULT '0',
+    PRIMARY KEY (user_id, mailbox, uid)
+);
+
+CREATE INDEX ix_cache_messages_expires ON cache_messages (expires);
+
+--
+-- Table structure for table system
+--
+
+CREATE TABLE system (
+  name varchar(64) NOT NULL PRIMARY KEY,
+  value text NOT NULL
+);
+
+INSERT INTO system (name, value) VALUES ('roundcube-version', '2016112200');

+ 25 - 0
data/web/rc/SQL/sqlite/2008030300.sql

@@ -0,0 +1,25 @@
+-- Updates from version 0.1-stable to 0.1.1
+
+DROP TABLE messages;
+
+CREATE TABLE messages (
+  message_id integer NOT NULL PRIMARY KEY,
+  user_id integer NOT NULL default '0',
+  del tinyint NOT NULL default '0',
+  cache_key varchar(128) NOT NULL default '',
+  created datetime NOT NULL default '0000-00-00 00:00:00',
+  idx integer NOT NULL default '0',
+  uid integer NOT NULL default '0',
+  subject varchar(255) NOT NULL default '',
+  "from" varchar(255) NOT NULL default '',
+  "to" varchar(255) NOT NULL default '',
+  "cc" varchar(255) NOT NULL default '',
+  "date" datetime NOT NULL default '0000-00-00 00:00:00',
+  size integer NOT NULL default '0',
+  headers text NOT NULL,
+  structure text
+);
+
+CREATE INDEX ix_messages_user_cache_uid ON messages(user_id,cache_key,uid);
+CREATE INDEX ix_users_username ON users(username);
+CREATE INDEX ix_users_alias ON users(alias);

+ 3 - 0
data/web/rc/SQL/sqlite/2008060900.sql

@@ -0,0 +1,3 @@
+-- Updates from version 0.2-alpha
+
+CREATE INDEX ix_messages_created ON messages (created);

+ 4 - 0
data/web/rc/SQL/sqlite/2008092100.sql

@@ -0,0 +1,4 @@
+-- Updates from version 0.2-beta
+
+CREATE INDEX ix_session_changed ON session (changed);
+CREATE INDEX ix_cache_created ON cache (created);

+ 8 - 0
data/web/rc/SQL/sqlite/2009090400.sql

@@ -0,0 +1,8 @@
+-- Updates from version 0.3-stable
+
+DELETE FROM messages;
+DROP INDEX ix_messages_user_cache_uid;
+CREATE UNIQUE INDEX ix_messages_user_cache_uid ON messages (user_id,cache_key,uid);
+CREATE INDEX ix_messages_index ON messages (user_id,cache_key,idx);
+DROP INDEX ix_contacts_user_id;
+CREATE INDEX ix_contacts_user_id ON contacts(user_id, email);

+ 61 - 0
data/web/rc/SQL/sqlite/2009103100.sql

@@ -0,0 +1,61 @@
+-- Updates from version 0.3.1
+
+-- ALTER TABLE identities ADD COLUMN changed datetime NOT NULL default '0000-00-00 00:00:00'; --
+
+CREATE TABLE temp_identities (
+  identity_id integer NOT NULL PRIMARY KEY,
+  user_id integer NOT NULL default '0',
+  standard tinyint NOT NULL default '0',
+  name varchar(128) NOT NULL default '',
+  organization varchar(128) default '',
+  email varchar(128) NOT NULL default '',
+  "reply-to" varchar(128) NOT NULL default '',
+  bcc varchar(128) NOT NULL default '',
+  signature text NOT NULL default '',
+  html_signature tinyint NOT NULL default '0'
+);
+INSERT INTO temp_identities (identity_id, user_id, standard, name, organization, email, "reply-to", bcc, signature, html_signature)
+  SELECT identity_id, user_id, standard, name, organization, email, "reply-to", bcc, signature, html_signature
+  FROM identities WHERE del=0;
+
+DROP INDEX ix_identities_user_id;
+DROP TABLE identities;
+
+CREATE TABLE identities (
+  identity_id integer NOT NULL PRIMARY KEY,
+  user_id integer NOT NULL default '0',
+  changed datetime NOT NULL default '0000-00-00 00:00:00',
+  del tinyint NOT NULL default '0',
+  standard tinyint NOT NULL default '0',
+  name varchar(128) NOT NULL default '',
+  organization varchar(128) default '',
+  email varchar(128) NOT NULL default '',
+  "reply-to" varchar(128) NOT NULL default '',
+  bcc varchar(128) NOT NULL default '',
+  signature text NOT NULL default '',
+  html_signature tinyint NOT NULL default '0'
+);
+CREATE INDEX ix_identities_user_id ON identities(user_id, del);
+
+INSERT INTO identities (identity_id, user_id, standard, name, organization, email, "reply-to", bcc, signature, html_signature)
+  SELECT identity_id, user_id, standard, name, organization, email, "reply-to", bcc, signature, html_signature
+  FROM temp_identities;
+
+DROP TABLE temp_identities;
+
+CREATE TABLE contactgroups (
+  contactgroup_id integer NOT NULL PRIMARY KEY,
+  user_id integer NOT NULL default '0',
+  changed datetime NOT NULL default '0000-00-00 00:00:00',
+  del tinyint NOT NULL default '0',
+  name varchar(128) NOT NULL default ''
+);
+
+CREATE INDEX ix_contactgroups_user_id ON contactgroups(user_id, del);
+
+CREATE TABLE contactgroupmembers (
+  contactgroup_id integer NOT NULL,
+  contact_id integer NOT NULL default '0',
+  created datetime NOT NULL default '0000-00-00 00:00:00',
+  PRIMARY KEY (contactgroup_id, contact_id)
+);

+ 35 - 0
data/web/rc/SQL/sqlite/2010042300.sql

@@ -0,0 +1,35 @@
+-- Updates from version 0.4-beta
+
+CREATE TABLE tmp_users (
+  user_id integer NOT NULL PRIMARY KEY,
+  username varchar(128) NOT NULL default '',
+  mail_host varchar(128) NOT NULL default '',
+  alias varchar(128) NOT NULL default '',
+  created datetime NOT NULL default '0000-00-00 00:00:00',
+  last_login datetime NOT NULL default '0000-00-00 00:00:00',
+  language varchar(5),
+  preferences text NOT NULL default ''
+);
+
+INSERT INTO tmp_users (user_id, username, mail_host, alias, created, last_login, language, preferences)
+    SELECT user_id, username, mail_host, alias, created, last_login, language, preferences FROM users;
+
+DROP TABLE users;
+
+CREATE TABLE users (
+  user_id integer NOT NULL PRIMARY KEY,
+  username varchar(128) NOT NULL default '',
+  mail_host varchar(128) NOT NULL default '',
+  alias varchar(128) NOT NULL default '',
+  created datetime NOT NULL default '0000-00-00 00:00:00',
+  last_login datetime DEFAULT NULL,
+  language varchar(5),
+  preferences text NOT NULL default ''
+);
+
+INSERT INTO users (user_id, username, mail_host, alias, created, last_login, language, preferences)
+    SELECT user_id, username, mail_host, alias, created, last_login, language, preferences FROM tmp_users;
+
+CREATE INDEX ix_users_username ON users(username);
+CREATE INDEX ix_users_alias ON users(alias);
+DROP TABLE tmp_users;

+ 40 - 0
data/web/rc/SQL/sqlite/2010100600.sql

@@ -0,0 +1,40 @@
+-- Updates from version 0.4.2
+
+DROP INDEX ix_users_username;
+CREATE UNIQUE INDEX ix_users_username ON users(username, mail_host);
+
+CREATE TABLE contacts_tmp (
+    contact_id integer NOT NULL PRIMARY KEY,
+    user_id integer NOT NULL default '0',
+    changed datetime NOT NULL default '0000-00-00 00:00:00',
+    del tinyint NOT NULL default '0',
+    name varchar(128) NOT NULL default '',
+    email varchar(255) NOT NULL default '',
+    firstname varchar(128) NOT NULL default '',
+    surname varchar(128) NOT NULL default '',
+    vcard text NOT NULL default ''
+);
+
+INSERT INTO contacts_tmp (contact_id, user_id, changed, del, name, email, firstname, surname, vcard)
+    SELECT contact_id, user_id, changed, del, name, email, firstname, surname, vcard FROM contacts;
+
+DROP TABLE contacts;
+CREATE TABLE contacts (
+    contact_id integer NOT NULL PRIMARY KEY,
+    user_id integer NOT NULL default '0',
+    changed datetime NOT NULL default '0000-00-00 00:00:00',
+    del tinyint NOT NULL default '0',
+    name varchar(128) NOT NULL default '',
+    email varchar(255) NOT NULL default '',
+    firstname varchar(128) NOT NULL default '',
+    surname varchar(128) NOT NULL default '',
+    vcard text NOT NULL default ''
+);
+
+INSERT INTO contacts (contact_id, user_id, changed, del, name, email, firstname, surname, vcard)
+    SELECT contact_id, user_id, changed, del, name, email, firstname, surname, vcard FROM contacts_tmp;
+
+CREATE INDEX ix_contacts_user_id ON contacts(user_id, email);
+DROP TABLE contacts_tmp;
+
+DELETE FROM messages;

+ 41 - 0
data/web/rc/SQL/sqlite/2011011200.sql

@@ -0,0 +1,41 @@
+-- Updates from version 0.5.x
+
+CREATE TABLE contacts_tmp (
+    contact_id integer NOT NULL PRIMARY KEY,
+    user_id integer NOT NULL default '0',
+    changed datetime NOT NULL default '0000-00-00 00:00:00',
+    del tinyint NOT NULL default '0',
+    name varchar(128) NOT NULL default '',
+    email varchar(255) NOT NULL default '',
+    firstname varchar(128) NOT NULL default '',
+    surname varchar(128) NOT NULL default '',
+    vcard text NOT NULL default ''
+);
+
+INSERT INTO contacts_tmp (contact_id, user_id, changed, del, name, email, firstname, surname, vcard)
+    SELECT contact_id, user_id, changed, del, name, email, firstname, surname, vcard FROM contacts;
+
+DROP TABLE contacts;
+CREATE TABLE contacts (
+    contact_id integer NOT NULL PRIMARY KEY,
+    user_id integer NOT NULL default '0',
+    changed datetime NOT NULL default '0000-00-00 00:00:00',
+    del tinyint NOT NULL default '0',
+    name varchar(128) NOT NULL default '',
+    email varchar(255) NOT NULL default '',
+    firstname varchar(128) NOT NULL default '',
+    surname varchar(128) NOT NULL default '',
+    vcard text NOT NULL default '',
+    words text NOT NULL default ''
+);
+
+INSERT INTO contacts (contact_id, user_id, changed, del, name, email, firstname, surname, vcard)
+    SELECT contact_id, user_id, changed, del, name, email, firstname, surname, vcard FROM contacts_tmp;
+
+CREATE INDEX ix_contacts_user_id ON contacts(user_id, email);
+DROP TABLE contacts_tmp;
+
+
+DELETE FROM messages;
+DELETE FROM cache;
+CREATE INDEX ix_contactgroupmembers_contact_id ON contactgroupmembers (contact_id);

+ 54 - 0
data/web/rc/SQL/sqlite/2011092800.sql

@@ -0,0 +1,54 @@
+-- Updates from version 0.6
+
+CREATE TABLE dictionary (
+    user_id integer DEFAULT NULL,
+   "language" varchar(5) NOT NULL,
+    data text NOT NULL
+);
+
+CREATE UNIQUE INDEX ix_dictionary_user_language ON dictionary (user_id, "language");
+
+CREATE TABLE searches (
+  search_id integer NOT NULL PRIMARY KEY,
+  user_id integer NOT NULL DEFAULT '0',
+  "type" smallint NOT NULL DEFAULT '0',
+  name varchar(128) NOT NULL,
+  data text NOT NULL
+);
+
+CREATE UNIQUE INDEX ix_searches_user_type_name ON searches (user_id, type, name);
+
+DROP TABLE messages;
+
+CREATE TABLE cache_index (
+    user_id integer NOT NULL,
+    mailbox varchar(255) NOT NULL,
+    changed datetime NOT NULL default '0000-00-00 00:00:00',
+    valid smallint NOT NULL DEFAULT '0',
+    data text NOT NULL,
+    PRIMARY KEY (user_id, mailbox)
+);
+
+CREATE INDEX ix_cache_index_changed ON cache_index (changed);
+
+CREATE TABLE cache_thread (
+    user_id integer NOT NULL,
+    mailbox varchar(255) NOT NULL,
+    changed datetime NOT NULL default '0000-00-00 00:00:00',
+    data text NOT NULL,
+    PRIMARY KEY (user_id, mailbox)
+);
+
+CREATE INDEX ix_cache_thread_changed ON cache_thread (changed);
+
+CREATE TABLE cache_messages (
+    user_id integer NOT NULL,
+    mailbox varchar(255) NOT NULL,
+    uid integer NOT NULL,
+    changed datetime NOT NULL default '0000-00-00 00:00:00',
+    data text NOT NULL,
+    flags integer NOT NULL DEFAULT '0',
+    PRIMARY KEY (user_id, mailbox, uid)
+);
+
+CREATE INDEX ix_cache_messages_changed ON cache_messages (changed);

+ 11 - 0
data/web/rc/SQL/sqlite/2011111600.sql

@@ -0,0 +1,11 @@
+-- Updates from version 0.7-beta
+
+DROP TABLE session;
+CREATE TABLE session (
+  sess_id varchar(128) NOT NULL PRIMARY KEY,
+  created datetime NOT NULL default '0000-00-00 00:00:00',
+  changed datetime NOT NULL default '0000-00-00 00:00:00',
+  ip varchar(40) NOT NULL default '',
+  vars text NOT NULL
+);
+CREATE INDEX ix_session_changed ON session (changed);

+ 38 - 0
data/web/rc/SQL/sqlite/2011121400.sql

@@ -0,0 +1,38 @@
+-- Updates from version 0.7
+
+CREATE TABLE contacts_tmp (
+  contact_id integer NOT NULL PRIMARY KEY,
+  user_id integer NOT NULL,
+  changed datetime NOT NULL default '0000-00-00 00:00:00',
+  del tinyint NOT NULL default '0',
+  name varchar(128) NOT NULL default '',
+  email text NOT NULL default '',
+  firstname varchar(128) NOT NULL default '',
+  surname varchar(128) NOT NULL default '',
+  vcard text NOT NULL default '',
+  words text NOT NULL default ''
+);
+
+INSERT INTO contacts_tmp (contact_id, user_id, changed, del, name, email, firstname, surname, vcard, words)
+    SELECT contact_id, user_id, changed, del, name, email, firstname, surname, vcard, words FROM contacts;
+
+DROP TABLE contacts;
+
+CREATE TABLE contacts (
+  contact_id integer NOT NULL PRIMARY KEY,
+  user_id integer NOT NULL,
+  changed datetime NOT NULL default '0000-00-00 00:00:00',
+  del tinyint NOT NULL default '0',
+  name varchar(128) NOT NULL default '',
+  email text NOT NULL default '',
+  firstname varchar(128) NOT NULL default '',
+  surname varchar(128) NOT NULL default '',
+  vcard text NOT NULL default '',
+  words text NOT NULL default ''
+);
+
+INSERT INTO contacts (contact_id, user_id, changed, del, name, email, firstname, surname, vcard, words)
+    SELECT contact_id, user_id, changed, del, name, email, firstname, surname, vcard, words FROM contacts_tmp;
+
+CREATE INDEX ix_contacts_user_id ON contacts(user_id, del);
+DROP TABLE contacts_tmp;

+ 44 - 0
data/web/rc/SQL/sqlite/2012080700.sql

@@ -0,0 +1,44 @@
+-- Updates from version 0.8
+
+DROP TABLE cache;
+CREATE TABLE cache (
+  user_id integer NOT NULL default 0,
+  cache_key varchar(128) NOT NULL default '',
+  created datetime NOT NULL default '0000-00-00 00:00:00',
+  data text NOT NULL
+);
+
+CREATE INDEX ix_cache_user_cache_key ON cache(user_id, cache_key);
+CREATE INDEX ix_cache_created ON cache(created);
+
+CREATE TABLE tmp_users (
+  user_id integer NOT NULL PRIMARY KEY,
+  username varchar(128) NOT NULL default '',
+  mail_host varchar(128) NOT NULL default '',
+  created datetime NOT NULL default '0000-00-00 00:00:00',
+  last_login datetime DEFAULT NULL,
+  language varchar(5),
+  preferences text NOT NULL default ''
+);
+
+INSERT INTO tmp_users (user_id, username, mail_host, created, last_login, language, preferences)
+    SELECT user_id, username, mail_host, created, last_login, language, preferences FROM users;
+
+DROP TABLE users;
+
+CREATE TABLE users (
+  user_id integer NOT NULL PRIMARY KEY,
+  username varchar(128) NOT NULL default '',
+  mail_host varchar(128) NOT NULL default '',
+  created datetime NOT NULL default '0000-00-00 00:00:00',
+  last_login datetime DEFAULT NULL,
+  language varchar(5),
+  preferences text NOT NULL default ''
+);
+
+INSERT INTO users (user_id, username, mail_host, created, last_login, language, preferences)
+    SELECT user_id, username, mail_host, created, last_login, language, preferences FROM tmp_users;
+
+CREATE UNIQUE INDEX ix_users_username ON users(username, mail_host);
+
+CREATE INDEX ix_identities_email ON identities(email, del);

+ 6 - 0
data/web/rc/SQL/sqlite/2013011000.sql

@@ -0,0 +1,6 @@
+-- Updates from version 0.9-beta
+
+CREATE TABLE IF NOT EXISTS system (
+  name varchar(64) NOT NULL PRIMARY KEY,
+  value text NOT NULL
+);

+ 2 - 0
data/web/rc/SQL/sqlite/2013011700.sql

@@ -0,0 +1,2 @@
+-- drop temp table created in 2012080700.sql
+DROP TABLE IF EXISTS tmp_users;

+ 1 - 0
data/web/rc/SQL/sqlite/2013042700.sql

@@ -0,0 +1 @@
+-- empty

+ 8 - 0
data/web/rc/SQL/sqlite/2013052500.sql

@@ -0,0 +1,8 @@
+CREATE TABLE cache_shared (
+  cache_key varchar(255) NOT NULL,
+  created datetime NOT NULL default '0000-00-00 00:00:00',
+  data text NOT NULL
+);
+
+CREATE INDEX ix_cache_shared_cache_key ON cache_shared(cache_key);
+CREATE INDEX ix_cache_shared_created ON cache_shared(created);

部分文件因文件數量過多而無法顯示