summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorthomascube <thomas@roundcube.net>2006-08-06 15:55:11 +0000
committerthomascube <thomas@roundcube.net>2006-08-06 15:55:11 +0000
commitaade7b98044ad4abb9021452688ec3af57f36acb (patch)
tree10e255b2eb423490fa70781897277849f5ffc6df
parent27a398c18aec787b836ef12066f20d55065045d3 (diff)
Finalized 0.1beta2 releasev0.1-beta2
-rw-r--r--INSTALL16
-rw-r--r--SQL/mysql.initial.sql2
-rw-r--r--SQL/mysql5.initial.sql126
-rw-r--r--UPGRADING2
-rw-r--r--index.php15
-rw-r--r--program/include/main.inc6
-rw-r--r--program/js/app.js13
-rw-r--r--program/steps/mail/compose.inc37
-rw-r--r--program/steps/mail/upload.inc22
9 files changed, 199 insertions, 40 deletions
diff --git a/INSTALL b/INSTALL
index efe060499..0c7e7cbbf 100644
--- a/INSTALL
+++ b/INSTALL
@@ -33,8 +33,8 @@ INSTALLATION
DATABASE SETUP
==============
-* MySQL
--------
+* MySQL 4.0.x
+-------------
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:
@@ -46,9 +46,19 @@ roundcube user. Here is an example of that procedure:
> quit
# mysql roundcubemail < SQL/mysql.initial.sql
+
+* MySQL 4.1.x/5.x
+-----------------
For MySQL version 4.1 and up, it's recommended to create the database for
-RoundCube with the following command:
+RoundCube with utf-8 charset. Here's an example of the init procedure:
+
+# mysql
> CREATE DATABASE 'roundcubemail' DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
+> GRANT ALL PRIVILEGES ON roundcubemail.* TO roundcube@localhost
+ IDENTIFIED BY 'password';
+> quit
+
+# mysql roundcubemail < SQL/mysql5.initial.sql
* SQLite
diff --git a/SQL/mysql.initial.sql b/SQL/mysql.initial.sql
index 9e3ee2758..7546e52da 100644
--- a/SQL/mysql.initial.sql
+++ b/SQL/mysql.initial.sql
@@ -1,5 +1,5 @@
-- RoundCube Webmail initial database structure
--- Version 0.1b
+-- Version 0.1beta2
--
-- --------------------------------------------------------
diff --git a/SQL/mysql5.initial.sql b/SQL/mysql5.initial.sql
new file mode 100644
index 000000000..0116468ee
--- /dev/null
+++ b/SQL/mysql5.initial.sql
@@ -0,0 +1,126 @@
+-- RoundCube Webmail initial database structure
+-- Version 0.1beta2
+--
+
+-- --------------------------------------------------------
+
+SET FOREIGN_KEY_CHECKS=0;
+
+
+-- Table structure for table `session`
+
+CREATE TABLE `session` (
+ `sess_id` varchar(40) NOT NULL,
+ `created` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
+ `changed` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
+ `ip` varchar(15) NOT NULL,
+ `vars` text NOT NULL,
+ PRIMARY KEY(`sess_id`)
+) TYPE=MYISAM 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) NOT NULL,
+ `mail_host` varchar(128) NOT NULL,
+ `alias` varchar(128) NOT NULL,
+ `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) NOT NULL DEFAULT 'en',
+ `preferences` text NOT NULL,
+ PRIMARY KEY(`user_id`)
+) TYPE=MYISAM CHARACTER SET utf8 COLLATE utf8_general_ci;
+
+
+-- Table structure for table `messages`
+
+CREATE TABLE `messages` (
+ `message_id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
+ `del` tinyint(1) NOT NULL DEFAULT '0',
+ `cache_key` varchar(128) NOT NULL,
+ `created` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
+ `idx` int(11) UNSIGNED NOT NULL DEFAULT '0',
+ `uid` int(11) UNSIGNED NOT NULL DEFAULT '0',
+ `subject` varchar(255) NOT NULL,
+ `from` varchar(255) NOT NULL,
+ `to` varchar(255) NOT NULL,
+ `cc` varchar(255) NOT NULL,
+ `date` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
+ `size` int(11) UNSIGNED NOT NULL DEFAULT '0',
+ `headers` text NOT NULL,
+ `body` longtext,
+ `user_id` int(10) UNSIGNED NOT NULL DEFAULT '0',
+ PRIMARY KEY(`message_id`),
+ INDEX `cache_key`(`cache_key`),
+ INDEX `idx`(`idx`),
+ INDEX `uid`(`uid`),
+ CONSTRAINT `User_ID_FK_messages` FOREIGN KEY (`user_id`)
+ REFERENCES `users`(`user_id`)
+ ON DELETE CASCADE
+ ON UPDATE CASCADE
+) TYPE=MYISAM CHARACTER SET utf8 COLLATE utf8_general_ci;
+
+
+-- Table structure for table `cache`
+
+CREATE TABLE `cache` (
+ `cache_id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
+ `session_id` varchar(40),
+ `cache_key` varchar(128) NOT NULL,
+ `created` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
+ `data` longtext NOT NULL,
+ `user_id` int(10) UNSIGNED NOT NULL DEFAULT '0',
+ PRIMARY KEY(`cache_id`),
+ INDEX `cache_key`(`cache_key`),
+ INDEX `session_id`(`session_id`),
+ CONSTRAINT `User_ID_FK_cache` FOREIGN KEY (`user_id`)
+ REFERENCES `users`(`user_id`)
+ ON DELETE CASCADE
+ ON UPDATE CASCADE
+) TYPE=MYISAM 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 '0000-00-00 00:00:00',
+ `del` tinyint(1) NOT NULL DEFAULT '0',
+ `name` varchar(128) NOT NULL,
+ `email` varchar(128) NOT NULL,
+ `firstname` varchar(128) NOT NULL,
+ `surname` varchar(128) NOT NULL,
+ `vcard` text NOT NULL,
+ `user_id` int(10) UNSIGNED NOT NULL DEFAULT '0',
+ PRIMARY KEY(`contact_id`),
+ CONSTRAINT `User_ID_FK_contacts` FOREIGN KEY (`user_id`)
+ REFERENCES `users`(`user_id`)
+ ON DELETE CASCADE
+ ON UPDATE CASCADE
+) TYPE=MYISAM CHARACTER SET utf8 COLLATE utf8_general_ci;
+
+
+-- Table structure for table `identities`
+
+CREATE TABLE `identities` (
+ `identity_id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
+ `del` tinyint(1) NOT NULL DEFAULT '0',
+ `standard` tinyint(1) NOT NULL DEFAULT '0',
+ `name` varchar(128) NOT NULL,
+ `organization` varchar(128) NOT NULL,
+ `email` varchar(128) NOT NULL,
+ `reply-to` varchar(128) NOT NULL,
+ `bcc` varchar(128) NOT NULL,
+ `signature` text NOT NULL,
+ `user_id` int(10) UNSIGNED 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
+) TYPE=MYISAM CHARACTER SET utf8 COLLATE utf8_general_ci;
+
+
+SET FOREIGN_KEY_CHECKS=1; \ No newline at end of file
diff --git a/UPGRADING b/UPGRADING
index fd0a857b4..bb8b36bab 100644
--- a/UPGRADING
+++ b/UPGRADING
@@ -116,7 +116,7 @@ form version 0.1-beta
- replace index.php
- replace all files in folder /program/
- replace all files in folder /skins/default/
-- add these lines to /config/db.inc.php
+- add these line to /config/db.inc.php
$rcmail_config['db_persistent'] = TRUE;
- add these lines to /config/main.inc.php
$rcmail_config['drafts_mbox'] = 'Drafts';
diff --git a/index.php b/index.php
index c496b4dc9..313ca0bfd 100644
--- a/index.php
+++ b/index.php
@@ -2,9 +2,9 @@
/*
+-----------------------------------------------------------------------+
| RoundCube Webmail IMAP Client |
- | Version 0.1-20060718 |
+ | Version 0.1-beta2 |
| |
- | Copyright (C) 2005, RoundCube Dev. - Switzerland |
+ | Copyright (C) 2005-2006, RoundCube Dev. - Switzerland |
| Licensed under the GNU GPL |
| |
| Redistribution and use in source and binary forms, with or without |
@@ -40,7 +40,7 @@
*/
-define('RCMAIL_VERSION', '0.1-20060718');
+define('RCMAIL_VERSION', '0.1-beta2');
// define global vars
$CHARSET = 'UTF-8';
@@ -95,7 +95,6 @@ else
// catch some url/post parameters
-//$_auth = get_input_value('_auth', RCUBE_INPUT_GPC);
$_task = get_input_value('_task', RCUBE_INPUT_GPC);
$_action = get_input_value('_action', RCUBE_INPUT_GPC);
$_framed = (!empty($_GET['_framed']) || !empty($_POST['_framed']));
@@ -290,10 +289,7 @@ if ($_task=='mail')
if ($_action=='rss')
include('program/steps/mail/rss.inc');
- // kill compose entry from session
-// if (isset($_SESSION['compose']))
-// rcmail_compose_cleanup();
-
+
// make sure the message count is refreshed
$IMAP->messagecount($_SESSION['mbox'], 'ALL', TRUE);
}
@@ -344,7 +340,8 @@ if ($_task=='settings')
if ($_action=='save-prefs')
include('program/steps/settings/save_prefs.inc');
- if ($_action=='folders' || $_action=='subscribe' || $_action=='unsubscribe' || $_action=='create-folder' || $_action=='rename-folder' || $_action=='delete-folder')
+ if ($_action=='folders' || $_action=='subscribe' || $_action=='unsubscribe' ||
+ $_action=='create-folder' || $_action=='rename-folder' || $_action=='delete-folder')
include('program/steps/settings/manage_folders.inc');
}
diff --git a/program/include/main.inc b/program/include/main.inc
index efac8b2d2..b7f28c4e4 100644
--- a/program/include/main.inc
+++ b/program/include/main.inc
@@ -170,9 +170,9 @@ function rcmail_authenticate_session()
{
$now = mktime();
$valid = ($_COOKIE['sessauth'] == rcmail_auth_hash(session_id(), $_SESSION['auth_time']));
-
- // renew auth cookie every 5 minutes
- if (!$valid || ($now-$_SESSION['auth_time'] > 300))
+
+ // renew auth cookie every 5 minutes (only for GET requests)
+ if (!$valid || ($_SERVER['REQUEST_METHOD']!='POST' && $now-$_SESSION['auth_time'] > 300))
{
$_SESSION['auth_time'] = $now;
setcookie('sessauth', rcmail_auth_hash(session_id(), $now));
diff --git a/program/js/app.js b/program/js/app.js
index 83a50a0e9..f8c5aaf54 100644
--- a/program/js/app.js
+++ b/program/js/app.js
@@ -878,8 +878,9 @@ function rcube_webmail()
if (this.task=='mail' && this.env.mailbox==this.env.drafts_mailbox)
{
- var uid = this.get_single_uid();
- url += '&_draft_uid='+uid+'&_mbox='+escape(this.env.mailbox);
+ var uid;
+ if (uid = this.get_single_uid())
+ url += '&_draft_uid='+uid+'&_mbox='+escape(this.env.mailbox);
}
// modify url if we're in addressbook
else if (this.task=='addressbook')
@@ -2185,6 +2186,8 @@ function rcube_webmail()
if (!this.gui_objects.attachmentlist)
return false;
+ alert(content);
+
var li = document.createElement('LI');
li.id = name;
li.innerHTML = content;
@@ -3598,6 +3601,12 @@ function rcube_webmail()
// send periodic request to check for recent messages
this.check_for_recent = function()
{
+ if (this.busy)
+ {
+ this.send_keep_alive();
+ return;
+ }
+
this.set_busy(true, 'checkingmail');
var d = new Date();
this.http_request('check-recent', '_t='+d.getTime());
diff --git a/program/steps/mail/compose.inc b/program/steps/mail/compose.inc
index 32378f59c..639ea684e 100644
--- a/program/steps/mail/compose.inc
+++ b/program/steps/mail/compose.inc
@@ -23,20 +23,20 @@
require_once('Mail/mimeDecode.php');
// remove an attachment
-if ($_action=='remove-attachment' && !empty($_GET['_filename']))
+if ($_action=='remove-attachment' && preg_match('/^rcmfile([0-9]+)$/', $_GET['_file'], $regs))
{
- if (is_array($_SESSION['compose']['attachments']))
- foreach ($_SESSION['compose']['attachments'] as $i => $attachment)
- if ($attachment['name'] == $_GET['_filename'])
- {
- @unlink($attachment['path']);
- unset($_SESSION['compose']['attachments'][$i]);
- $commands = sprintf("parent.%s.remove_from_attachment_list('%s');\n", $JS_OBJECT_NAME, $_GET['_filename']);
- rcube_remote_response($commands);
- exit;
- }
+ $id = $regs[1];
+ if (is_array($_SESSION['compose']['attachments'][$id]))
+ {
+ @unlink($_SESSION['compose']['attachments'][$id]['path']);
+ $_SESSION['compose']['attachments'][$id] = NULL;
+ $commands = sprintf("parent.%s.remove_from_attachment_list('rcmfile%d');\n", $JS_OBJECT_NAME, $id);
+ rcube_remote_response($commands);
+ exit;
+ }
}
+
$MESSAGE_FORM = NULL;
$REPLY_MESSAGE = NULL;
$FORWARD_MESSAGE = NULL;
@@ -480,7 +480,7 @@ function rcmail_create_forward_body($body)
{
if ($part->disposition=='attachment' || $part->disposition=='inline' || $part->headers['content-id'] ||
(empty($part->disposition) && ($part->d_parameters['filename'] || $part->ctype_parameters['name'])))
- {
+ {
$tmp_path = tempnam($temp_dir, 'rcmAttmnt');
if ($fp = fopen($tmp_path, 'w'))
{
@@ -621,20 +621,21 @@ function rcmail_compose_attachment_list($attrib)
if (is_array($_SESSION['compose']['attachments']))
{
if ($attrib['deleteicon'])
- $button = sprintf('<img src="%s%s" alt="%s" border="0" / style="padding-right:2px;vertical-align:middle">',
+ $button = sprintf('<img src="%s%s" alt="%s" border="0" style="padding-right:2px;vertical-align:middle" />',
$CONFIG['skin_path'],
$attrib['deleteicon'],
rcube_label('delete'));
else
$button = rcube_label('delete');
- foreach ($_SESSION['compose']['attachments'] as $i => $a_prop)
- $out .= sprintf('<li id="%s"><a href="#" onclick="%s.command(\'remove-attachment\',\'%s\')" title="%s">%s</a>%s</li>',
- $a_prop['name'],
+ foreach ($_SESSION['compose']['attachments'] as $id => $a_prop)
+ $out .= sprintf('<li id="rcmfile%d"><a href="#delete" onclick="return %s.command(\'remove-attachment\',\'rcmfile%d\', this)" title="%s">%s</a>%s</li>',
+ $id,
$JS_OBJECT_NAME,
- $a_prop['name'],
+ $id,
rcube_label('delete'),
- $button, $a_prop['name']);
+ $button,
+ rep_specialchars_output($a_prop['name']));
}
$OUTPUT->add_script(sprintf("%s.gui_object('attachmentlist', '%s');", $JS_OBJECT_NAME, $attrib['id']));
diff --git a/program/steps/mail/upload.inc b/program/steps/mail/upload.inc
index abab3891b..850ccd01d 100644
--- a/program/steps/mail/upload.inc
+++ b/program/steps/mail/upload.inc
@@ -41,13 +41,29 @@ foreach ($_FILES['_attachments']['tmp_name'] as $i => $filepath)
$tmpfname = tempnam($temp_dir, 'rcmAttmnt');
if (move_uploaded_file($filepath, $tmpfname))
{
+ $id = count($_SESSION['compose']['attachments']);
$_SESSION['compose']['attachments'][] = array('name' => $_FILES['_attachments']['name'][$i],
'mimetype' => $_FILES['_attachments']['type'][$i],
'path' => $tmpfname);
- $button = sprintf('<img src="%s/images/icons/remove-attachment.png" alt="%s" border="0" style="padding-right:2px;vertical-align:middle">', $CONFIG['skin_path'], rcube_label('delete'));
- $content = sprintf('<a href="#" onclick="%s.command(\\\'remove-attachment\\\',\\\'%s\\\')" title="%s">%s</a>%s',$JS_OBJECT_NAME, $_FILES['_attachments']['name'][$i], rcube_label('delete'), $button, $_FILES['_attachments']['name'][$i]);
- $response .= sprintf('parent.%s.add2attachment_list(\'%s\',\'%s\');',$JS_OBJECT_NAME, $_FILES['_attachments']['name'][$i], $content);
+ if (is_file($CONFIG['skin_path'] . '/images/icons/remove-attachment.png'))
+ $button = sprintf('<img src="%s/images/icons/remove-attachment.png" alt="%s" border="0" style="padding-right:2px;vertical-align:middle" />',
+ $CONFIG['skin_path'],
+ rcube_label('delete'));
+ else
+ $button = rcube_label('delete');
+
+ $content = sprintf('<a href="#delete" onclick="return %s.command(\\\'remove-attachment\\\', \\\'rcmfile%d\\\', this)" title="%s">%s</a>%s',
+ $JS_OBJECT_NAME,
+ $id,
+ rcube_label('delete'),
+ $button,
+ rep_specialchars_output($_FILES['_attachments']['name'][$i], 'js'));
+
+ $response .= sprintf('parent.%s.add2attachment_list(\'rcmfile%d\',\'%s\');',
+ $JS_OBJECT_NAME,
+ $id,
+ $content);
}
}