Merge branch 'release-0.8' of github.com:roundcube/roundcubemail into release-0.8
1 files added
20 files modified
| | |
| | | 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) |
| | |
| | | |
| | | |
| | | /** |
| | | * 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 |
| | | * |
| | |
| | | * 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; |
| | | } |
| | |
| | | * 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; |
| | | } |
| | | |
| | | |
| | |
| | | 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) |
| | | { |
| | |
| | | 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') |
| | |
| | | |
| | | 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; |
| | | } |
| | | |
| | |
| | | <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" /> |
| | |
| | | <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"> |
| | |
| | | left: 0; |
| | | width: 220px; |
| | | bottom: 0; |
| | | z-index: 2; |
| | | } |
| | | |
| | | #mailview-right { |
| | |
| | | left: 232px; |
| | | right: 0; |
| | | bottom: 0; |
| | | z-index: 3; |
| | | } |
| | | |
| | | #mailview-top { |
| | |
| | | width: 100%; |
| | | } |
| | | |
| | | #mailboxtoolbar, |
| | | #messagetoolbar { |
| | | position: absolute; |
| | | top: -6px; |
| | |
| | | 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 { |
| | |
| | | background: #fff; |
| | | } |
| | | |
| | | .minwidth { |
| | | position: absolute; |
| | | top: 0; |
| | | left: 0; |
| | | bottom: 0; |
| | | width: 100%; |
| | | min-width: 1150px; |
| | | } |
| | | |
| | | .scroller { |
| | | overflow: auto; |
| | | } |
| | |
| | | margin: 38px 0 10px 0; |
| | | } |
| | | |
| | | body.iframe.footerbuttons { |
| | | margin-bottom: 42px; |
| | | body.iframe.floatingbuttons { |
| | | margin-bottom: 40px; |
| | | } |
| | | |
| | | body.iframe.fullheight { |
| | |
| | | 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 { |
| | |
| | | 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 { |
| | |
| | | |
| | | |
| | | /*** toolbar ***/ |
| | | |
| | | .toolbar .spacer { |
| | | display: inline-block; |
| | | width: 24px; |
| | | height: 40px; |
| | | padding: 0; |
| | | } |
| | | |
| | | .toolbar a.button { |
| | | text-align: center; |
| | |
| | | margin-bottom: 12px; |
| | | padding-top: 15px; |
| | | height: 27px; |
| | | white-space: nowrap; |
| | | } |
| | | |
| | | .tabsbar .tablink { |
| | |
| | | |
| | | |
| | | <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> |
| | | |
| | |
| | | <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"> |
| | |
| | | |
| | | </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"> |
| | |
| | | <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" /> |
| | |
| | | |
| | | </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'" /> |
| | |
| | | <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()" /> |
| | | <roundcube:endif /> |
| | | </div> |
| | | </div> |
| | | |
| | | <roundcube:include file="/includes/footer.html" /> |
| | |
| | | </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> |
| | | |
| | |
| | | </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> |
| | | |
| | |
| | | <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" /> |
| | |
| | | <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> |
| | |
| | | |
| | | <!-- toolbar --> |
| | | <div id="messagetoolbar"> |
| | | <roundcube:include file="/includes/mailtoolbar.html" /> |
| | | </div> |
| | | |
| | | <div id="messagesearchtools"> |
| | |
| | | |
| | | </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> |
| | |
| | | |
| | | <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"> |
| | |
| | | </div> |
| | | |
| | | <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"> |
| | |
| | | </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" /> |
| | | <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> |
| | | |
| | |
| | | <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> |
| | | </div> |
| | | |
| | | <roundcube:include file="/includes/footer.html" /> |
| | |
| | | |
| | | // don't use $(window).resize() due to some unwanted side-effects |
| | | window.onresize = resize; |
| | | resize(); |
| | | } |
| | | |
| | | /** |
| | |
| | | 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'); |
| | | } |
| | | }) |
| | | |
| | | } |
| | | |
| | | /** |
| | |
| | | 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'); |
| | | } |