- fix save/delete draft message with enabled threading (#1486596)
- performance improvement using UID SEARCH intead of SEARCH + FETCH
- re-fix r3445
| | |
| | | return $a_messages; |
| | | } |
| | | |
| | | |
| | | /** |
| | | * Direct (real and simple) SEARCH request to IMAP server, |
| | | * without result sorting and caching |
| | | * |
| | | * @param string Mailbox name to search in |
| | | * @param string Search string |
| | | * @param boolean True if UIDs should be returned |
| | | * @return array Search results as list of message IDs or UIDs |
| | | * @access public |
| | | */ |
| | | function search_once($mbox_name='', $str=NULL, $ret_uid=false) |
| | | { |
| | | if (!$str) |
| | | return false; |
| | | |
| | | $mailbox = $mbox_name ? $this->mod_mailbox($mbox_name) : $this->mailbox; |
| | | |
| | | return $this->conn->search($mailbox, $str, $ret_uid); |
| | | } |
| | | |
| | | |
| | | /** |
| | | * Sort thread |
| | |
| | | } |
| | | |
| | | // generate hash |
| | | $hash = md5($this->xor($pass,$opad) . pack("H*", md5($this->xor($pass, $ipad) . base64_decode($encChallenge)))); |
| | | $hash = md5($this->_xor($pass,$opad) . pack("H*", md5($this->_xor($pass, $ipad) . base64_decode($encChallenge)))); |
| | | |
| | | // generate reply |
| | | $reply = base64_encode($user . ' ' . $hash); |
| | |
| | | return false; |
| | | } |
| | | |
| | | function search($folder, $criteria) |
| | | function search($folder, $criteria, $return_uid=false) |
| | | { |
| | | if (!$this->select($folder)) { |
| | | return false; |
| | | } |
| | | |
| | | $data = ''; |
| | | $query = "srch1 SEARCH " . chop($criteria); |
| | | $query = 'srch1 ' . ($return_uid ? 'UID ' : '') . 'SEARCH ' . chop($criteria); |
| | | |
| | | if (!$this->putLineC($query)) { |
| | | return false; |
| | | } |
| | | |
| | | do { |
| | | $line = trim($this->readLine()); |
| | | if ($this->startsWith($line, '* SEARCH')) { |
| | |
| | | return $result; |
| | | } |
| | | |
| | | private function xor($string, $string2) |
| | | private function _xor($string, $string2) |
| | | { |
| | | $result = ''; |
| | | $size = strlen($string); |
| | |
| | | if ($olddraftmessageid) |
| | | { |
| | | // delete previous saved draft |
| | | $a_deleteid = $IMAP->search($CONFIG['drafts_mbox'], 'HEADER Message-ID '.$olddraftmessageid); |
| | | |
| | | $deleted = $IMAP->delete_message($IMAP->get_uid($a_deleteid[0], $CONFIG['drafts_mbox']), $CONFIG['drafts_mbox']); |
| | | $a_deleteid = $IMAP->search_once($CONFIG['drafts_mbox'], |
| | | 'HEADER Message-ID '.$olddraftmessageid, true); |
| | | $deleted = $IMAP->delete_message($a_deleteid, $CONFIG['drafts_mbox']); |
| | | |
| | | // raise error if deletion of old draft failed |
| | | if (!$deleted) |
| | |
| | | $msgid = strtr($message_id, array('>' => '', '<' => '')); |
| | | |
| | | // remember new draft-uid |
| | | $draftids = $IMAP->search($CONFIG['drafts_mbox'], 'HEADER Message-ID '.$msgid); |
| | | $_SESSION['compose']['param']['_draft_uid'] = $IMAP->get_uid($draftids[0], $CONFIG['drafts_mbox']); |
| | | $draftuids = $IMAP->search_once($CONFIG['drafts_mbox'], 'HEADER Message-ID '.$msgid, true); |
| | | $_SESSION['compose']['param']['_draft_uid'] = $draftuids[0]; |
| | | |
| | | // display success |
| | | $OUTPUT->show_message('messagesaved', 'confirmation'); |