dkim.inc.php 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. <?php
  2. function dkim_add_key($postarray) {
  3. global $lang;
  4. global $pdo;
  5. if ($_SESSION['mailcow_cc_role'] != "admin") {
  6. $_SESSION['return'] = array(
  7. 'type' => 'danger',
  8. 'msg' => sprintf($lang['danger']['access_denied'])
  9. );
  10. return false;
  11. }
  12. // if (!hasDomainAccess($_SESSION['mailcow_cc_username'], $_SESSION['mailcow_cc_role'], $domain)) {
  13. // $_SESSION['return'] = array(
  14. // 'type' => 'danger',
  15. // 'msg' => sprintf($lang['danger']['access_denied'])
  16. // );
  17. // return false;
  18. // }
  19. $key_length = intval($postarray['key_size']);
  20. $domain = $postarray['domain'];
  21. if (!is_valid_domain_name($domain) || !is_numeric($key_length)) {
  22. $_SESSION['return'] = array(
  23. 'type' => 'danger',
  24. 'msg' => sprintf($lang['danger']['dkim_domain_or_sel_invalid'])
  25. );
  26. return false;
  27. }
  28. if (!empty(glob($GLOBALS['MC_DKIM_TXTS'] . '/' . $domain . '.dkim'))) {
  29. $_SESSION['return'] = array(
  30. 'type' => 'danger',
  31. 'msg' => sprintf($lang['danger']['dkim_domain_or_sel_invalid'])
  32. );
  33. return false;
  34. }
  35. $config = array(
  36. "digest_alg" => "sha256",
  37. "private_key_bits" => $key_length,
  38. "private_key_type" => OPENSSL_KEYTYPE_RSA,
  39. );
  40. if ($keypair_ressource = openssl_pkey_new($config)) {
  41. $key_details = openssl_pkey_get_details($keypair_ressource);
  42. $pubKey = implode(array_slice(
  43. array_filter(
  44. explode(PHP_EOL, $key_details['key'])
  45. ), 1, -1)
  46. );
  47. // Save public key to file
  48. file_put_contents($GLOBALS['MC_DKIM_TXTS'] . '/' . $domain . '.dkim', $pubKey);
  49. // Save private key to file
  50. openssl_pkey_export_to_file($keypair_ressource, $GLOBALS['MC_DKIM_KEYS'] . '/' . $domain . '.dkim');
  51. $_SESSION['return'] = array(
  52. 'type' => 'success',
  53. 'msg' => sprintf($lang['success']['dkim_added'])
  54. );
  55. return true;
  56. }
  57. else {
  58. $_SESSION['return'] = array(
  59. 'type' => 'danger',
  60. 'msg' => sprintf($lang['danger']['dkim_domain_or_sel_invalid'])
  61. );
  62. return false;
  63. }
  64. }
  65. function dkim_get_key_details($domain) {
  66. $data = array();
  67. if (hasDomainAccess($_SESSION['mailcow_cc_username'], $_SESSION['mailcow_cc_role'], $domain)) {
  68. $dkim_pubkey_file = escapeshellarg($GLOBALS["MC_DKIM_TXTS"]. "/" . $domain . "." . "dkim");
  69. if (file_exists(substr($dkim_pubkey_file, 1, -1))) {
  70. $data['pubkey'] = file_get_contents($GLOBALS["MC_DKIM_TXTS"]. "/" . $domain . "." . "dkim");
  71. $data['length'] = (strlen($data['pubkey']) < 391) ? 1024 : 2048;
  72. $data['dkim_txt'] = 'v=DKIM1;k=rsa;t=s;s=email;p=' . file_get_contents($GLOBALS["MC_DKIM_TXTS"]. "/" . $domain . "." . "dkim");
  73. }
  74. }
  75. return $data;
  76. }
  77. function dkim_get_blind_keys() {
  78. global $lang;
  79. if ($_SESSION['mailcow_cc_role'] != "admin") {
  80. $_SESSION['return'] = array(
  81. 'type' => 'danger',
  82. 'msg' => sprintf($lang['danger']['access_denied'])
  83. );
  84. return false;
  85. }
  86. $domains = array();
  87. $dnstxt_folder = scandir($GLOBALS["MC_DKIM_TXTS"]);
  88. $dnstxt_files = array_diff($dnstxt_folder, array('.', '..'));
  89. foreach($dnstxt_files as $file) {
  90. $domains[] = substr($file, 0, -5);
  91. }
  92. return array_diff($domains, array_merge(mailbox_get_domains(), mailbox_get_alias_domains()));
  93. }
  94. function dkim_delete_key($postarray) {
  95. global $lang;
  96. $domain = $postarray['domain'];
  97. if ($_SESSION['mailcow_cc_role'] != "admin") {
  98. $_SESSION['return'] = array(
  99. 'type' => 'danger',
  100. 'msg' => sprintf($lang['danger']['access_denied'])
  101. );
  102. return false;
  103. }
  104. // if (!hasDomainAccess($_SESSION['mailcow_cc_username'], $_SESSION['mailcow_cc_role'], $domain)) {
  105. // $_SESSION['return'] = array(
  106. // 'type' => 'danger',
  107. // 'msg' => sprintf($lang['danger']['access_denied'])
  108. // );
  109. // return false;
  110. // }
  111. if (!is_valid_domain_name($domain)) {
  112. $_SESSION['return'] = array(
  113. 'type' => 'danger',
  114. 'msg' => sprintf($lang['danger']['dkim_domain_or_sel_invalid'])
  115. );
  116. return false;
  117. }
  118. exec('rm ' . escapeshellarg($GLOBALS['MC_DKIM_TXTS'] . '/' . $domain . '.dkim'), $out, $return);
  119. if ($return != "0") {
  120. $_SESSION['return'] = array(
  121. 'type' => 'danger',
  122. 'msg' => sprintf($lang['danger']['dkim_remove_failed'])
  123. );
  124. return false;
  125. }
  126. exec('rm ' . escapeshellarg($GLOBALS['MC_DKIM_KEYS'] . '/' . $domain . '.dkim'), $out, $return);
  127. if ($return != "0") {
  128. $_SESSION['return'] = array(
  129. 'type' => 'danger',
  130. 'msg' => sprintf($lang['danger']['dkim_remove_failed'])
  131. );
  132. return false;
  133. }
  134. $_SESSION['return'] = array(
  135. 'type' => 'success',
  136. 'msg' => sprintf($lang['success']['dkim_removed'])
  137. );
  138. return true;
  139. }