Merge branch 'release-0.8' of github.com:roundcube/roundcubemail into release-0.8

pull/17/head
Thomas Bruederli 12 years ago
commit 3f9518f0a7

@ -1,6 +1,8 @@
CHANGELOG Roundcube Webmail
===========================
- Don't add attachments content into reply/forward/draft message body (#1488557)
- Fix 'no connection' errors on page unloads (#1488547)
- Plugin API: Add 'unauthenticated' hook (#1488138)
- Show explicit error message when provided hostname is invalid (#1488550)
- Fix wrong compose screen elements focus in IE9 (#1488541)

@ -277,6 +277,32 @@ class rcube_message
}
/**
* Checks if part of the message is an attachment (or part of it)
*
* @param rcube_message_part $part Message part
*
* @return bool True if the part is an attachment part
*/
public function is_attachment($part)
{
foreach ($this->attachments as $att_part) {
if ($att_part->mime_id == $part->mime_id) {
return true;
}
// check if the part is a subpart of another attachment part (message/rfc822)
if ($att_part->mimetype == 'message/rfc822') {
if (in_array($part, (array)$att_part->parts)) {
return true;
}
}
}
return false;
}
/**
* Read the message structure returend by the IMAP server
* and build flat lists of content parts and attachments

@ -221,13 +221,14 @@ class rcube_session
* Handler for session_destroy()
*
* @param string Session ID
*
* @return boolean True on success
*/
public function db_destroy($key)
{
$this->db->query(
sprintf("DELETE FROM %s WHERE sess_id = ?", get_table_name('session')),
$key);
if ($key) {
$this->db->query(sprintf("DELETE FROM %s WHERE sess_id = ?", get_table_name('session')), $key);
}
return true;
}
@ -308,11 +309,16 @@ class rcube_session
* Handler for session_destroy() with memcache backend
*
* @param string Session ID
*
* @return boolean True on success
*/
public function mc_destroy($key)
{
return $this->memcache->delete($key);
if ($key) {
$this->memcache->delete($key);
}
return true;
}

@ -60,6 +60,8 @@ function rcube_webmail()
beforeSend: function(xmlhttp){ xmlhttp.setRequestHeader('X-Roundcube-Request', ref.env.request_token); }
});
$(window).bind('beforeunload', function() { rcmail.unload = true; });
// set environment variable(s)
this.set_env = function(p, value)
{
@ -6129,6 +6131,10 @@ function rcube_webmail()
this.set_busy(false, null, lock);
request.abort();
// don't display error message on page unload (#1488547)
if (this.unload)
return;
if (request.status && errmsg)
this.display_message(this.get_label('servererror') + ' (' + errmsg + ')', 'error');
else if (status == 'timeout')

@ -632,7 +632,8 @@ function rcmail_prepare_message_body()
if (!empty($MESSAGE->parts)) {
foreach ($MESSAGE->parts as $part) {
if ($part->type != 'content' || !$part->size) {
// skip no-content and attachment parts (#1488557)
if ($part->type != 'content' || !$part->size || $MESSAGE->is_attachment($part)) {
continue;
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

@ -1,15 +1,11 @@
<div id="mailtoolbar" class="toolbar">
<roundcube:if condition="template:name == 'message'" />
<roundcube:button command="list" type="link" class="button back disabled" classAct="button back" classSel="button back pressed" label="back" />
<roundcube:endif />
<roundcube:button command="reply" type="link" class="button reply disabled" classAct="button reply" classSel="button reply pressed" label="reply" title="replytomessage" />
<span class="dropbutton">
<roundcube:button command="reply-all" type="link" class="button reply-all disabled" classAct="button reply-all" classSel="button reply-all pressed" label="replyall" title="replytoallmessage" />
<span class="dropbuttontip" id="replyallmenulink" onclick="UI.show_popup('replyallmenu');return false"></span>
<roundcube:button command="reply-all" type="link" class="button reply-all disabled" classAct="button reply-all" classSel="button reply-all pressed" label="replyall" title="replytoallmessage" />
<span class="dropbuttontip" id="replyallmenulink" onclick="UI.show_popup('replyallmenu');return false"></span>
</span>
<span class="dropbutton">
<roundcube:button command="forward" type="link" class="button forward disabled" classAct="button forward" classSel="button forward pressed" label="forward" title="forwardmessage" />
<span class="dropbuttontip" id="forwardmenulink" onclick="UI.show_popup('forwardmenu');return false"></span>
<roundcube:button command="forward" type="link" class="button forward disabled" classAct="button forward" classSel="button forward pressed" label="forward" title="forwardmessage" />
<span class="dropbuttontip" id="forwardmenulink" onclick="UI.show_popup('forwardmenu');return false"></span>
</span>
<roundcube:button command="delete" type="link" class="button delete disabled" classAct="button delete" classSel="button delete pressed" label="delete" title="deletemessage" />
<roundcube:if condition="template:name == 'message'" />
@ -20,7 +16,6 @@
<roundcube:button name="markmenulink" id="markmessagemenulink" type="link" class="button markmessage" label="mark" title="markmessages" onclick="UI.show_popup('markmessagemenu');return false" />
<roundcube:endif />
<roundcube:button name="messagemenulink" id="messagemenulink" type="link" class="button more" label="more" title="moreactions" onclick="UI.show_popup('messagemenu');return false" />
</div>
<div id="forwardmenu" class="popupmenu">
<ul class="toolbarmenu">

@ -18,6 +18,7 @@
left: 0;
width: 220px;
bottom: 0;
z-index: 2;
}
#mailview-right {
@ -26,6 +27,7 @@
left: 232px;
right: 0;
bottom: 0;
z-index: 3;
}
#mailview-top {
@ -332,7 +334,6 @@ a.iconbutton.threadmode.selected {
width: 100%;
}
#mailboxtoolbar,
#messagetoolbar {
position: absolute;
top: -6px;
@ -340,14 +341,17 @@ a.iconbutton.threadmode.selected {
left: 0;
height: 40px;
white-space: nowrap;
z-index: 10;
}
#messagetoolbar.fullwidth {
right: 0;
}
#mailboxtoolbar {
right: 0;
#messagetoolbar .toolbarselect {
position: absolute;
bottom: 6px;
right: 3px;
}
#messagesearchtools {

@ -654,6 +654,15 @@ a.iconlink.upload {
background: #fff;
}
.minwidth {
position: absolute;
top: 0;
left: 0;
bottom: 0;
width: 100%;
min-width: 1150px;
}
.scroller {
overflow: auto;
}
@ -1036,8 +1045,8 @@ body.iframe {
margin: 38px 0 10px 0;
}
body.iframe.footerbuttons {
margin-bottom: 42px;
body.iframe.floatingbuttons {
margin-bottom: 40px;
}
body.iframe.fullheight {
@ -1064,14 +1073,25 @@ body.iframe .boxtitle {
z-index: 100;
}
body.iframe .footerbuttons {
body.iframe .footerleft.floating {
position: fixed;
left: 0;
bottom: 0;
width: 100%;
z-index: 110;
background: #fff;
padding: 8px;
padding-top: 8px;
padding-bottom: 12px;
}
body.iframe .footerleft.floating:before {
content: " ";
position: absolute;
top: -6px;
left: 0;
width: 100%;
height: 6px;
background: url(images/overflowshadow.png) top center no-repeat;
}
.boxcontent {
@ -1087,8 +1107,16 @@ body.iframe .footerbuttons {
overflow: auto;
}
.iframebox {
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 28px;
}
.footerleft {
padding: 0 12px 10px 12px;
padding: 0 12px 4px 12px;
}
.propform fieldset {
@ -1309,6 +1337,13 @@ ul.proplist li {
/*** toolbar ***/
.toolbar .spacer {
display: inline-block;
width: 24px;
height: 40px;
padding: 0;
}
.toolbar a.button {
text-align: center;
font-size: 10px;
@ -1952,6 +1987,7 @@ ul.toolbarmenu li span.conversation {
margin-bottom: 12px;
padding-top: 15px;
height: 27px;
white-space: nowrap;
}
.tabsbar .tablink {

@ -67,7 +67,9 @@
<div id="contacts-box" class="uibox">
<roundcube:object name="addressframe" id="contact-frame" style="width:100%; height:96%" frameborder="0" src="/watermark.html" />
<div class="iframebox">
<roundcube:object name="addressframe" id="contact-frame" style="width:100%; height:100%" frameborder="0" src="/watermark.html" />
</div>
<roundcube:object name="message" id="message" class="statusbar" />
</div>

@ -7,8 +7,9 @@
<link rel="stylesheet" type="text/css" href="/googiespell.css" />
<roundcube:endif />
</head>
<body class="noscroll">
<body>
<div class="minwidth">
<roundcube:include file="/includes/header.html" />
<div id="mainscreen">
@ -169,6 +170,8 @@
</div><!-- end mainscreen -->
</div><!-- end minwidth -->
<div id="upload-dialog" class="propform popupdialog" title="<roundcube:label name='addattachment' />">
<roundcube:object name="composeAttachmentForm" id="uploadform" attachmentFieldSize="40" buttons="no" />
<div class="formbuttons">

@ -4,7 +4,7 @@
<title><roundcube:object name="pagetitle" /></title>
<roundcube:include file="/includes/links.html" />
</head>
<body class="iframe footerbuttons">
<body class="iframe">
<h1 class="boxtitle">
<roundcube:if condition="env:action=='add'" /><roundcube:label name="addcontact" />
@ -35,7 +35,7 @@
</form>
<div class="footerbuttons formbuttons">
<div class="footerleft formbuttons">
<roundcube:button command="save" type="input" class="button mainaction" label="save" />
<roundcube:button command="show" type="input" class="button" label="cancel" condition="env:action=='edit'" />
<roundcube:button name="cancel" type="input" class="button" label="cancel" onclick="history.back()" condition="env:action=='add'" />

@ -12,14 +12,12 @@
<roundcube:object name="folderdetails" class="propform" />
</div>
<div id="formfooter">
<div class="footerleft formbuttons">
<roundcube:button command="save" type="input" class="button mainaction" label="save" />
<roundcube:if condition="!strlen(request:_mbox)" />
<input type="button" value="<roundcube:label name="cancel" />" class="button" onclick="history.back()" />&nbsp;
<roundcube:endif />
</div>
</div>
<roundcube:include file="/includes/footer.html" />

@ -28,7 +28,9 @@
</div>
<div id="folder-details" class="uibox contentbox">
<roundcube:object name="folderframe" id="preferences-frame" style="width:100%; height:96%" frameborder="0" src="/watermark.html" />
<div class="iframebox">
<roundcube:object name="folderframe" id="preferences-frame" style="width:100%; height:100%" frameborder="0" src="/watermark.html" />
</div>
<roundcube:object name="message" id="message" class="statusbar" />
</div>

@ -25,7 +25,9 @@
</div>
<div id="identity-details" class="uibox contentbox">
<roundcube:object name="identityframe" id="preferences-frame" style="width:100%; height:96%" frameborder="0" src="/watermark.html" />
<div class="iframebox">
<roundcube:object name="identityframe" id="preferences-frame" style="width:100%; height:100%" frameborder="0" src="/watermark.html" />
</div>
<roundcube:object name="message" id="message" class="statusbar" />
</div>

@ -12,11 +12,9 @@
<roundcube:object name="identityform" class="propform" size="40" textareacols="40" textarearows="6" />
</div>
<div id="formfooter">
<div class="footerleft formbuttons">
<roundcube:button command="save" type="input" class="button mainaction" label="save" />
</div>
</div>
<roundcube:include file="/includes/footer.html" />

@ -11,20 +11,23 @@
<roundcube:endif />
</style>
</head>
<body class="noscroll">
<body>
<div class="minwidth">
<roundcube:include file="/includes/header.html" />
<div id="mainscreen">
<div id="mailview-left">
<!-- toolbar -->
<div id="mailboxtoolbar" class="toolbar">
<div id="messagetoolbar" class="toolbar">
<roundcube:button command="checkmail" type="link" class="button checkmail disabled" classAct="button checkmail" classSel="button checkmail pressed" label="refresh" title="checkmail" />
<roundcube:button command="compose" type="link" class="button compose disabled" classAct="button compose" classSel="button compose pressed" label="compose" title="writenewmessage" />
<span class="spacer"></span>
<roundcube:include file="/includes/mailtoolbar.html" />
</div>
<div id="mailview-left">
<!-- folders list -->
<div id="folderlist-header"></div>
<div id="mailboxcontainer" class="uibox listbox">
@ -45,7 +48,6 @@
<!-- toolbar -->
<div id="messagetoolbar">
<roundcube:include file="/includes/mailtoolbar.html" />
</div>
<div id="messagesearchtools">
@ -128,6 +130,8 @@
</div><!-- end mainscreen -->
<div><!-- end minwidth -->
<div id="searchmenu" class="popupmenu">
<ul class="toolbarmenu">
<li><label><input type="checkbox" name="s_mods[]" value="subject" id="s_mod_subject" onclick="UI.set_searchmod(this)" /> <roundcube:label name="subject" /></label></li>

@ -10,8 +10,17 @@
<div id="mainscreen">
<!-- toolbar -->
<div id="messagetoolbar" class="toolbar fullwidth">
<roundcube:button command="list" type="link" class="button back disabled" classAct="button back" classSel="button back pressed" label="back" />
<span class="spacer"></span>
<roundcube:include file="/includes/mailtoolbar.html" />
<div class="toolbarselect">
<roundcube:object name="mailboxlist" type="select" noSelection="moveto" maxlength="25" onchange="rcmail.command('moveto', this.options[this.selectedIndex].value)" class="mailboxlist decorated" folder_filter="mail" />
</div>
</div>
<div id="mailview-left">
<roundcube:object name="mailboxlist" type="select" noSelection="moveto" maxlength="25" onchange="rcmail.command('moveto', this.options[this.selectedIndex].value)" class="mailboxlist" folder_filter="mail" />
<!-- folders list -->
<div id="mailboxcontainer" class="uibox listbox">
@ -24,11 +33,6 @@
<div id="mailview-right">
<!-- toolbar -->
<div id="messagetoolbar" class="fullwidth">
<roundcube:include file="/includes/mailtoolbar.html" />
</div>
<div id="mailview-top">
<div id="messageheader" class="uibox">
<h2 class="subject"><roundcube:object name="messageHeaders" valueOf="subject" /></h2>

@ -21,8 +21,10 @@
</div>
<div id="preferences-box" class="uibox contentbox">
<roundcube:object name="prefsframe" id="preferences-frame" style="width:100%; height:96%" frameborder="0" src="/watermark.html" />
<roundcube:object name="message" id="message" class="statusbar" />
<div class="iframebox">
<roundcube:object name="prefsframe" id="preferences-frame" style="width:100%; height:100%" frameborder="0" src="/watermark.html" />
</div>
<roundcube:object name="message" id="message" class="statusbar" />
</div>
</div>

@ -12,10 +12,8 @@
<roundcube:object name="userprefs" form="form" class="propform" />
</div>
<div id="formfooter">
<div class="footerleft formbuttons">
<roundcube:button command="save" type="input" class="button mainaction" label="save" />
</div>
<roundcube:button command="save" type="input" class="button mainaction" label="save" />
</div>
<roundcube:include file="/includes/footer.html" />

@ -220,6 +220,7 @@ function rcube_mail_ui()
// don't use $(window).resize() due to some unwanted side-effects
window.onresize = resize;
resize();
}
/**
@ -257,6 +258,20 @@ function rcube_mail_ui()
if (rcmail.env.task == 'mail' && rcmail.env.action == 'compose') {
layout_composeview();
}
// make iframe footer buttons float if scrolling is active
$('body.iframe .footerleft').each(function(){
var footer = $(this),
body = $(document.body),
floating = footer.hasClass('floating'),
overflow = body.outerHeight(true) > $(window).height();
if (overflow != floating) {
var action = overflow ? 'addClass' : 'removeClass';
footer[action]('floating');
body[action]('floatingbuttons');
}
})
}
/**
@ -265,7 +280,7 @@ function rcube_mail_ui()
function message_displayed(p)
{
// show a popup dialog on errors
if (p.type == 'error') {
if (p.type == 'error' && rcmail.env.task != 'login') {
if (!me.messagedialog) {
me.messagedialog = $('<div>').addClass('popupdialog');
}

Loading…
Cancel
Save