function imapSetQuota($_username, $_quotaLimit)
 {
     if (is_numeric($_quotaLimit) && $_quotaLimit >= 0) {
         // enable quota
         $quota_value = @imap_set_quota($this->mbox, "user." . $_username, $_quotaLimit * 1024);
     } else {
         // disable quota
         $quota_value = @imap_set_quota($this->mbox, "user." . $_username, -1);
     }
 }
 function move_messages($params)
 {
     $folder = $params['folder'];
     $newmailbox = mb_convert_encoding($params['new_folder'], "UTF7-IMAP", (isset($params['decoded']) ? "" : "ISO-8859-1, ") . "UTF-8, UTF7-IMAP");
     $new_folder_name = isset($params['decoded']) ? mb_convert_encoding($params['new_folder_name'], "ISO-8859-1", "UTF-8") : $params['new_folder_name'];
     $msgs_number = $params['msgs_number'];
     // Precisamos gravar o nome das mensagens movidas.
     $moveds = split(',', $msgs_number);
     $log_msgs = '';
     foreach ($moveds as $msg_number) {
         if (!$this->mbox || !is_resource($this->mbox)) {
             $this->mbox = $this->open_mbox($folder);
         }
         $header = $this->get_header($msg_number);
         $message_id = $header->message_id;
         $subj = isset($header->fetchsubject) ? $this->decode_string($header->fetchsubject) : '';
         $log_msgs .= '#[' . $subj . '|' . $message_id . ']';
     }
     $log_msgs .= " FROM " . $folder . " TO " . $newmailbox;
     $return = array('msgs_number' => $msgs_number, 'folder' => $folder, 'new_folder_name' => $new_folder_name, 'border_ID' => $params['border_ID'], 'status' => true);
     //Status foi adicionado para validar as permissoes ACL
     //Este bloco tem a finalidade de averiguar as permissoes para pastas compartilhadas
     if (substr($folder, 0, 4) == 'user') {
         $acl = $this->getacltouser($folder, isset($params['decoded']));
         /*
          * l - lookup (mailbox is visible to LIST/LSUB commands, SUBSCRIBE mailbox)
          * r - read (SELECT the mailbox, perform STATUS)
          * s - keep seen/unseen information across sessions (set or clear \SEEN flag via STORE, also set \SEEN during APPEND/COPY/        FETCH BODY[...])
          * w - write (set or clear flags other than \SEEN and \DELETED via STORE, also set them during APPEND/COPY)
          * i - insert (perform APPEND, COPY into mailbox)
          * p - post (send mail to submission address for mailbox, not enforced by IMAP4 itself)
          * k - create mailboxes (CREATE new sub-mailboxes in any implementation-defined hierarchy, parent mailbox for the new mailbox name in RENAME)
          * x - delete mailbox (DELETE mailbox, old mailbox name in RENAME)
          * t - delete messages (set or clear \DELETED flag via STORE, set \DELETED flag during APPEND/COPY)
          * e - perform EXPUNGE and expunge as a part of CLOSE
          * a - administer (perform SETACL/DELETEACL/GETACL/LISTRIGHTS)
          * Os Atributos da ACL para pastas compartilhadas são definidos no arquivo sharemailbox.js, na função setaclfromuser
          * Os Atributos da ACL para contas compartilhadas são definidos no arquivo shared_accounts.js, na função setaclfromuser
          */
         $acl_share_delete = stripos($acl, 't') !== false && stripos($acl, 'e') !== false;
         if (!$acl_share_delete) {
             $return['status'] = false;
             return $return;
         }
     }
     //Este bloco tem a finalidade de transformar o CPF das pastas compartilhadas em common name
     if (array_key_exists('uid2cn', $_SESSION['phpgw_info']['user']['preferences']['expressoMail'])) {
         if ($_SESSION['phpgw_info']['user']['preferences']['expressoMail']['uid2cn']) {
             if (substr($new_folder_name, 0, 4) == 'user') {
                 $this->ldap = new ldap_functions();
                 $tmp_folder_name = explode($this->imap_delimiter, $new_folder_name);
                 $return['new_folder_name'] = array_pop($tmp_folder_name);
                 if ($cn = $this->ldap->uid2cn($return['new_folder_name'])) {
                     $return['new_folder_name'] = $cn;
                 }
             }
         }
     }
     // Caso estejamos no box principal, nao eh necessario pegar a informacao da mensagem anterior.
     if ($params['get_previous_msg'] && $params['border_ID'] != 'null' && $params['border_ID'] != '') {
         $return['previous_msg'] = $this->get_info_previous_msg($params);
         // Fix problem in unserialize function JS.
         if (array_key_exists('body', $return['previous_msg'])) {
             $return['previous_msg']['body'] = str_replace(array('{', '}'), array('{', '}'), $return['previous_msg']['body']);
         }
     }
     $mbox_stream = $this->open_mbox($folder);
     if (imap_mail_move($mbox_stream, $msgs_number, $newmailbox, CP_UID)) {
         imap_expunge($mbox_stream);
         if ($mbox_stream) {
             imap_close($mbox_stream);
         }
         Logger::info('expressomail', 'movemsg', $log_msgs);
         return $return;
     } else {
         if (strstr(imap_last_error(), 'Over quota')) {
             $accountID = $_SESSION['phpgw_info']['expressomail']['email_server']['imapAdminUsername'];
             $pass = $_SESSION['phpgw_info']['expressomail']['email_server']['imapAdminPW'];
             $userID = $_SESSION['phpgw_info']['expressomail']['user']['userid'];
             $server = $_SESSION['phpgw_info']['expressomail']['email_server']['imapServer'];
             $mbox = @imap_open("{" . $this->imap_server . ":" . $this->imap_port . $this->imap_options . "}INBOX", $accountID, $pass) or die(serialize(array('imap_error' => $this->parse_error(imap_last_error()))));
             if (!$mbox) {
                 return imap_last_error();
             }
             $quota = imap_get_quotaroot($mbox_stream, "INBOX");
             if (!imap_set_quota($mbox, "user" . $this->imap_delimiter . $userID, 2.1 * $quota['usage'])) {
                 if ($mbox_stream) {
                     imap_close($mbox_stream);
                 }
                 if ($mbox) {
                     imap_close($mbox);
                 }
                 return "move_messages(): Error setting quota for MOVE or DELETE!! " . "user" . $this->imap_delimiter . $userID . " line " . __LINE__ . "\n";
             }
             if (imap_mail_move($mbox_stream, $msgs_number, $newmailbox, CP_UID)) {
                 imap_expunge($mbox_stream);
                 if ($mbox_stream) {
                     imap_close($mbox_stream);
                 }
                 // return to original quota limit.
                 if (!imap_set_quota($mbox, "user" . $this->imap_delimiter . $userID, $quota['limit'])) {
                     if ($mbox) {
                         imap_close($mbox);
                     }
                     return "move_messages(): Error setting quota for MOVE or DELETE!! line " . __LINE__ . "\n";
                 }
                 Logger::info('expressomail', 'movemsg', $log_msgs);
                 return $return;
             } else {
                 if ($mbox_stream) {
                     imap_close($mbox_stream);
                 }
                 if (!imap_set_quota($mbox, "user" . $this->imap_delimiter . $userID, $quota['limit'])) {
                     if ($mbox) {
                         imap_close($mbox);
                     }
                     return "move_messages(): Error setting quota for MOVE or DELETE!! line " . __LINE__ . "\n";
                 }
                 return imap_last_error();
             }
         } else {
             if ($mbox_stream) {
                 imap_close($mbox_stream);
             }
             $msg_error = "move_messages() line " . __LINE__ . ": " . imap_last_error() . " folder:" . $newmailbox;
             trigger_error($msg_error);
             return $msg_error;
         }
     }
 }