diff --git a/modules/imap/hm-jmap.php b/modules/imap/hm-jmap.php index 46b28040e..776bb7a43 100644 --- a/modules/imap/hm-jmap.php +++ b/modules/imap/hm-jmap.php @@ -69,7 +69,8 @@ class Hm_JMAP { ); private $default_caps = array( 'urn:ietf:params:jmap:core', - 'urn:ietf:params:jmap:mail' + 'urn:ietf:params:jmap:mail', + 'urn:ietf:params:jmap:quota' ); public $selected_mailbox; @@ -376,6 +377,99 @@ public function get_folder_list_by_level($level=false) { return $this->parse_folder_list_by_level($level); } + /** + * Use the JMAP Quota/get method to fetch quota information for a specific quota root. + * + * This method sends a request to the JMAP server to retrieve quota information + * for a specified quota root (e.g., a specific folder like INBOX or Sent). + * The response is parsed to extract details about the quota, including the used space and hard limit. + * + * @param array $quota_root from get_quota_root + * @return array list of quota details + */ + public function get_quota($quota_root='') { + if (!is_array($this->session)) { + throw new Exception("Not authenticated. Please authenticate first."); + } + $quotas = array(); + $methods = [ + [ + "Quota/get", + [ + "accountId"=> (string)$this->account_id, + "name" => $this->session['username'], + "ids" => [$quota_root] + ], + "0" + ] + ]; + $response = $this->send_command($this->session['apiUrl'], $methods, 'POST'); + if (!empty($response["methodResponses"][0][1]["list"])) { + $quota = $response["methodResponses"][0][1]["list"][0]; + if (isset($quota['used']) && isset($quota['hardLimit'])) { + $quotas[] = [ + 'name' => $quota['id'], + 'max' => floatval($quota['hardLimit']), + 'current' => floatval($quota['used']), + ]; + } + } + + + foreach($quota_root as $key => $value) { + $quotas[$key] = $value; + } + return $quotas; + } + + /** + * Use the JMAP Quota/get method to fetch quota root information for all available quotas. + * + * This method sends a request to the JMAP server to retrieve quota information + * for all quotas associated with the account. The response is parsed to extract details about each quota, + * including the used space and hard limit. + * + * @param string $mailbox The mailbox identifier for which the quota information is being fetched. + * @return array An array of quota details + */ + public function get_quota_root($mailbox) { + if (!is_array($this->session)) { + throw new Exception("Not authenticated. Please authenticate first."); + } + $quotas = array(); + $methods = [ + [ + "Quota/get", + [ + "accountId"=> (string)$this->account_id, + "name" => $this->session['username'], + "ids" => null, + "scope" => "folder", + "folder" => $mailbox + ], + "0" + ] + ]; + $response = $this->send_command($this->session['apiUrl'], $methods, 'POST'); + if (!empty($response["methodResponses"][0][1]["list"])) { + $quotasRes = $response["methodResponses"][0][1]["list"]; + foreach($quotasRes as $quota) { + if (isset($quota['used']) && isset($quota['hardLimit'])) { + $quotas[] = [ + 'name' => $quota['id'], + 'max' => floatval($quota['hardLimit']), + 'current' => floatval($quota['used']), + ]; + } + } + } + + return $quotas; + } + + public function get_capability() { + //TODO: Implement + } /** * Return cached data * @return array @@ -452,7 +546,7 @@ public function get_folder_list() { $methods = array(array( 'Mailbox/get', array( - 'accountId' => $this->account_id, + 'accountId' => (string)$this->account_id, 'ids' => NULL ), 'fl'