Skip to content

Commit

Permalink
Unify the interface/data scheme for both IMAP and JSON
Browse files Browse the repository at this point in the history
  • Loading branch information
Shadow243 committed Nov 25, 2024
1 parent c0c512a commit f48362c
Show file tree
Hide file tree
Showing 2 changed files with 80 additions and 27 deletions.
34 changes: 8 additions & 26 deletions modules/imap/handler_modules.php
Original file line number Diff line number Diff line change
Expand Up @@ -750,32 +750,14 @@ public function process() {
$this->out('can_share_folders', stripos($imap->get_capability(), 'ACL') !== false);
if (imap_authed($imap)) {
$quota_root = $imap->get_quota_root($folder ? $folder : 'INBOX');
if($imap instanceof Hm_JMAP) {
if (!empty($quota_root["methodResponses"][0][1]["list"])) {
$quota = $quota_root["methodResponses"][0][1]["list"][0];

if ($quota) {
$used = floatval($quota['used']);
$max = floatval($quota['hardLimit']);
if ($max > 0) {
$quotaPercentage = ceil(($used / $max) * 100);
$quotaMaxInMB = $max / (1024 * 1024);

$this->out('quota', $quotaPercentage);
$this->out('quota_max', $quotaMaxInMB);
}
}
}
}else {
if ($quota_root && isset($quota_root[0]['name'])) {
$quota = $imap->get_quota($quota_root[0]['name']);
if ($quota) {
$current = floatval($quota[0]['current']);
$max = floatval($quota[0]['max']);
if ($max > 0) {
$this->out('quota', ceil(($current / $max) * 100));
$this->out('quota_max', $max / 1024);
}
if ($quota_root && isset($quota_root[0]['name'])) {
$quota = $imap->get_quota($quota_root[0]['name']);
if ($quota) {
$current = floatval($quota[0]['current']);
$max = floatval($quota[0]['max']);
if ($max > 0) {
$this->out('quota', ceil(($current / $max) * 100));
$this->out('quota_max', $max / 1024);
}
}
}
Expand Down
73 changes: 72 additions & 1 deletion modules/imap/hm-jmap.php
Original file line number Diff line number Diff line change
Expand Up @@ -377,25 +377,96 @@ 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');
return $response;
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
}
Expand Down

0 comments on commit f48362c

Please sign in to comment.