git subrepo clone https://github.com/mailcow/mailcow-dockerized.git mailcow/src/mailcow-dockerized

subrepo: subdir:   "mailcow/src/mailcow-dockerized"
  merged:   "a832becb"
upstream: origin:   "https://github.com/mailcow/mailcow-dockerized.git"
  branch:   "master"
  commit:   "a832becb"
git-subrepo: version:  "0.4.3"
  origin:   "???"
  commit:   "???"
Change-Id: If5be2d621a211e164c9b6577adaa7884449f16b5
diff --git a/mailcow/src/mailcow-dockerized/data/web/inc/functions.mailq.inc.php b/mailcow/src/mailcow-dockerized/data/web/inc/functions.mailq.inc.php
new file mode 100644
index 0000000..f42ab7c
--- /dev/null
+++ b/mailcow/src/mailcow-dockerized/data/web/inc/functions.mailq.inc.php
@@ -0,0 +1,121 @@
+<?php

+function mailq($_action, $_data = null) {

+  if ($_SESSION['mailcow_cc_role'] != "admin") {

+    $_SESSION['return'][] = array(

+      'type' => 'danger',

+      'log' => array(__FUNCTION__, $_action, $_data),

+      'msg' => 'access_denied'

+    );

+    return false;

+  }

+  function process_mailq_output($returned_output, $_action, $_data) {

+    if ($returned_output !== NULL) {

+      if ($_action == 'cat') {

+        logger(array('return' => array(

+          array(

+            'type' => 'success',

+            'log' => array(__FUNCTION__, $_action, $_data),

+            'msg' => 'queue_cat_success'

+          )

+        )));

+        return $returned_output;

+      }

+      else {

+        if (isset($returned_output['type']) && $returned_output['type'] == 'danger') {

+          $_SESSION['return'][] = array(

+            'type' => 'danger',

+            'log' => array(__FUNCTION__, $_action, $_data),

+            'msg' => 'Error: ' . $returned_output['msg']

+          );

+        }

+        if (isset($returned_output['type']) && $returned_output['type'] == 'success') {

+          $_SESSION['return'][] = array(

+            'type' => 'success',

+            'log' => array(__FUNCTION__, $_action, $_data),

+            'msg' => 'queue_command_success'

+          );

+        }

+      }

+    }

+    else {

+      $_SESSION['return'][] = array(

+        'type' => 'danger',

+        'log' => array(__FUNCTION__, $_action, $_data),

+        'msg' => 'unknown'

+      );

+    }

+  }

+  if ($_action == 'get') {

+    $mailq_lines = docker('post', 'postfix-mailcow', 'exec', array('cmd' => 'mailq', 'task' => 'list'));

+    $lines = 0;

+    // Hard limit to 10000 items

+    foreach (preg_split("/((\r?\n)|(\r\n?))/", $mailq_lines) as $mailq_item) if ($lines++ < 10000) {

+      if (empty($mailq_item) || $mailq_item == '1') {

+        continue;

+      }

+      $mq_line = json_decode($mailq_item, true);

+      if ($mq_line !== NULL) {

+        $rcpts = array();

+        foreach ($mq_line['recipients'] as $rcpt) {

+          if (isset($rcpt['delay_reason'])) {

+            $rcpts[] = $rcpt['address'] . ' (' . $rcpt['delay_reason'] . ')';

+          }

+          else {

+            $rcpts[] = $rcpt['address'];

+          }

+        }

+        if (!empty($rcpts)) {

+          $mq_line['recipients'] = $rcpts;

+        }

+        $line[] = $mq_line;

+      }

+    }

+    if (!isset($line) || empty($line)) {

+      return '[]';

+    }

+    else {

+      return json_encode($line);

+    }

+  }

+  elseif ($_action == 'delete') {

+    if (!is_array($_data['qid'])) {

+      $qids = array();

+      $qids[] = $_data['qid'];

+    }

+    else {

+      $qids = $_data['qid'];

+    }

+    $docker_return = docker('post', 'postfix-mailcow', 'exec', array('cmd' => 'mailq', 'task' => 'delete', 'items' => $qids));

+    process_mailq_output(json_decode($docker_return, true), $_action, $_data);

+  }

+  elseif ($_action == 'cat') {

+    if (!is_array($_data['qid'])) {

+      $qids = array();

+      $qids[] = $_data['qid'];

+    }

+    else {

+      $qids = $_data['qid'];

+    }

+    $docker_return = docker('post', 'postfix-mailcow', 'exec', array('cmd' => 'mailq', 'task' => 'cat', 'items' => $qids));

+    return process_mailq_output($docker_return, $_action, $_data);

+  }

+  elseif ($_action == 'edit') {

+    if (in_array($_data['action'], array('hold', 'unhold', 'deliver'))) {

+      if (!is_array($_data['qid'])) {

+        $qids = array();

+        $qids[] = $_data['qid'];

+      }

+      else {

+        $qids = $_data['qid'];

+      }

+      if (!empty($qids)) {

+        $docker_return = docker('post', 'postfix-mailcow', 'exec', array('cmd' => 'mailq', 'task' => $_data['action'], 'items' => $qids));

+        process_mailq_output(json_decode($docker_return, true), $_action, $_data);

+      }

+    }

+    if (in_array($_data['action'], array('flush', 'super_delete'))) {

+      $docker_return = docker('post', 'postfix-mailcow', 'exec', array('cmd' => 'mailq', 'task' => $_data['action']));

+      process_mailq_output(json_decode($docker_return, true), $_action, $_data);

+    }

+  }

+}