<?php
function rsettings($_action, $_data = null) {
	global $pdo;
	global $lang;
  $_data_log = $_data;
  switch ($_action) {
    case 'add':
      if ($_SESSION['mailcow_cc_role'] != "admin") {
        $_SESSION['return'][] = array(
          'type' => 'danger',
          'log' => array(__FUNCTION__, $_action, $_data_log),
          'msg' => 'access_denied'
        );
        return false;
      }
      $content = $_data['content'];
      $desc = $_data['desc'];
      $active = intval($_data['active']);
      if (empty($content)) {
        $_SESSION['return'][] = array(
          'type' => 'danger',
          'log' => array(__FUNCTION__, $_action, $_data_log),
          'msg' => 'map_content_empty'
        );
        return false;
      }
      $stmt = $pdo->prepare("INSERT INTO `settingsmap` (`content`, `desc`, `active`)
        VALUES (:content, :desc, :active)");
      $stmt->execute(array(
        ':content' => $content,
        ':desc' => $desc,
        ':active' => $active
      ));
      $_SESSION['return'][] = array(
        'type' => 'success',
        'log' => array(__FUNCTION__, $_action, $_data_log),
        'msg' => 'settings_map_added'
      );
    break;
    case 'edit':
      if ($_SESSION['mailcow_cc_role'] != "admin") {
        $_SESSION['return'][] = array(
          'type' => 'danger',
          'log' => array(__FUNCTION__, $_action, $_data_log),
          'msg' => 'access_denied'
        );
        return false;
      }
      $ids = (array)$_data['id'];
      foreach ($ids as $id) {
        $is_now = rsettings('details', $id);
        if (!empty($is_now)) {
          $content = (!empty($_data['content'])) ? $_data['content'] : $is_now['content'];
          $desc = (!empty($_data['desc'])) ? $_data['desc'] : $is_now['desc'];
          $active = (isset($_data['active'])) ? intval($_data['active']) : $is_now['active'];
        }
        else {
          $_SESSION['return'][] = array(
            'type' => 'danger',
            'log' => array(__FUNCTION__, $_action, $_data_log),
            'msg' => array('settings_map_invalid', $id)
          );
          continue;
        }
        $content = trim($content);
        $stmt = $pdo->prepare("UPDATE `settingsmap` SET
          `content` = :content,
          `desc` = :desc,
          `active` = :active
            WHERE `id` = :id");
        $stmt->execute(array(
          ':content' => $content,
          ':desc' => $desc,
          ':active' => $active,
          ':id' => $id
        ));
        $_SESSION['return'][] = array(
          'type' => 'success',
          'log' => array(__FUNCTION__, $_action, $_data_log),
          'msg' => array('object_modified', htmlspecialchars($ids))
        );
      }
    break;
    case 'delete':
      if ($_SESSION['mailcow_cc_role'] != "admin") {
        $_SESSION['return'][] = array(
          'type' => 'danger',
          'log' => array(__FUNCTION__, $_action, $_data_log),
          'msg' => 'access_denied'
        );
        return false;
      }
      $ids = (array)$_data['id'];
      foreach ($ids as $id) {
        $stmt = $pdo->prepare("DELETE FROM `settingsmap` WHERE `id`= :id");
        $stmt->execute(array(':id' => $id));
        $_SESSION['return'][] = array(
          'type' => 'success',
          'log' => array(__FUNCTION__, $_action, $_data_log),
          'msg' => array('settings_map_removed', htmlspecialchars($id))
        );
      }
    break;
    case 'get':
      if ($_SESSION['mailcow_cc_role'] != "admin") {
        return false;
      }
      $settingsmaps = array();
      $stmt = $pdo->query("SELECT `id`, `desc`, `active` FROM `settingsmap`");
      $settingsmaps = $stmt->fetchAll(PDO::FETCH_ASSOC);
      return $settingsmaps;
    break;
    case 'details':
      if ($_SESSION['mailcow_cc_role'] != "admin" || !isset($_data)) {
        return false;
      }
      $settingsmapdata = array();
      $stmt = $pdo->prepare("SELECT `id`,
        `desc`,
        `content`,
        `active`
          FROM `settingsmap`
            WHERE `id` = :id");
      $stmt->execute(array(':id' => $_data));
      $settingsmapdata = $stmt->fetch(PDO::FETCH_ASSOC);
      return $settingsmapdata;
    break;
  }
}
function rspamd_maps($_action, $_data = null) {
	global $pdo;
	global $lang;
	global $RSPAMD_MAPS;
  $_data_log = $_data;
  switch ($_action) {
    case 'edit':
      if ($_SESSION['mailcow_cc_role'] != "admin") {
        $_SESSION['return'][] = array(
          'type' => 'danger',
          'log' => array(__FUNCTION__, $_action, $_data_log),
          'msg' => 'access_denied'
        );
        return false;
      }
      $maps = (array)$_data['map'];
      foreach ($maps as $map) {
        foreach ($RSPAMD_MAPS as $rspamd_map_type) {
          if (!in_array($map, $rspamd_map_type)) {
            $_SESSION['return'][] = array(
              'type' => 'danger',
              'log' => array(__FUNCTION__, $_action, $_data_log),
              'msg' => array('global_map_invalid', $map)
            );
            continue;
          }
        }
        try {
          if (file_exists('/rspamd_custom_maps/' . $map)) {
            $map_content = trim($_data['rspamd_map_data']);
            $map_handle = fopen('/rspamd_custom_maps/' . $map, 'w');
            if (!$map_handle) {
              throw new Exception($lang['danger']['file_open_error']);
            }
            fwrite($map_handle, $map_content . PHP_EOL);
            fclose($map_handle);
            sleep(1.5);
            touch('/rspamd_custom_maps/' . $map);
          }
        }
        catch (Exception $e) {
          $_SESSION['return'][] = array(
            'type' => 'danger',
            'log' => array(__FUNCTION__, $_action, $_data_log),
            'msg' => array('global_map_write_error', htmlspecialchars($map), htmlspecialchars($e->getMessage()))
          );
          continue;
        }
        $_SESSION['return'][] = array(
          'type' => 'success',
          'log' => array(__FUNCTION__, $_action, $_data_log),
          'msg' => array('object_modified', htmlspecialchars($map))
        );
      }
    break;
  }
}
function rspamd_actions() {
  if (isset($_SESSION["mailcow_cc_role"]) && $_SESSION["mailcow_cc_role"] == "admin") {
    $curl = curl_init();
    curl_setopt($curl, CURLOPT_UNIX_SOCKET_PATH, '/var/lib/rspamd/rspamd.sock');
    curl_setopt($curl, CURLOPT_URL,"http://rspamd/stat");
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
    $data = curl_exec($curl);
    if ($data) {
      $return = array();
      $stats_array = json_decode($data, true)['actions'];
      $stats_array['soft reject'] = $stats_array['soft reject'] + $stats_array['greylist'];
      unset($stats_array['greylist']);
      foreach ($stats_array as $action => $count) {
        $return[] = array($action, $count);
      }
      return $return;
    }
    else {
      return false;
    }
  }
  else {
    return false;
  }
}
