PageRenderTime 41ms CodeModel.GetById 12ms RepoModel.GetById 0ms app.codeStats 0ms

/code/classes/Daemon/PMaild/MTA/Storage.class.php

https://github.com/blekkzor/pinetd2
PHP | 182 lines | 174 code | 7 blank | 1 comment | 2 complexity | 9f9ea35a3dca0a89941b383887617a35 MD5 | raw file
Possible License(s): GPL-2.0
  1. <?php
  2. namespace Daemon\PMaild\MTA;
  3. class Storage {
  4. static private $global_tables = array(
  5. 'dnsbl_cache' => array(
  6. 'ip' => array('type' => 'VARCHAR', 'size' => 15, 'null' => false, 'key' => 'PRIMARY'),
  7. 'list' => array('type' => 'VARCHAR', 'size' => 30, 'null' => false, 'key' => 'PRIMARY'),
  8. 'regdate' => array('type' => 'DATETIME', 'null' => false),
  9. 'clear' => array('type' => 'ENUM', 'values' => array('Y', 'N'), 'default' => 'Y', 'null' => false),
  10. 'answer' => array('type' => 'VARCHAR', 'size' => 15, 'null' => false),
  11. ),
  12. 'domainaliases' => array(
  13. 'domain' => array('type' => 'VARCHAR', 'size' => 128, 'null' => false, 'key' => 'PRIMARY'),
  14. 'domainid' => array('type' => 'INT', 'size' => 10, 'null' => false, 'unsigned' => true),
  15. 'last_recv' => array('type' => 'DATETIME', 'null' => true, 'default' => null),
  16. ),
  17. 'domains' => array(
  18. 'domainid' => array('type' => 'INT', 'size' => 10, 'null' => false, 'unsigned' => true, 'auto_increment' => true, 'key' => 'PRIMARY'),
  19. 'domain' => array('type' => 'VARCHAR', 'size' => 128, 'null' => false, 'default' => '', 'key' => 'UNIQUE:domain'),
  20. 'flags' => array('type'=>'SET', 'values'=>array('create_account_on_mail', 'fake_domain', 'drop_email_on_spam', 'account_without_plus_symbol'), 'default'=>'', 'null'=>false),
  21. 'antispam' => array('type'=>'SET', 'values'=>array('spamassassin'), 'default'=>'', 'null'=>false),
  22. 'dnsbl' => array('type'=>'SET', 'values'=>array('spews1', 'spews2', 'spamcop', 'spamhaus'), 'default'=>'', 'null'=>false),
  23. 'antivirus' => array('type' => 'SET', 'values' => array('clam'), 'default' => '', 'null' => false),
  24. 'protocol' => array('type' => 'SET', 'values' => array('smtp', 'pop3', 'imap4'), 'default' => 'pop3,imap4,smtp', 'null' => false),
  25. 'created' => array('type'=>'DATETIME', 'null'=>false, 'default'=>'0000-00-00 00:00:00'),
  26. 'last_recv' => array('type' => 'DATETIME', 'null' => true, 'default'=>NULL),
  27. ),
  28. 'hosts' => array(
  29. 'ip' => array('type' => 'VARCHAR', 'size' => 15, 'null' => false, 'default' => '', 'key' => 'PRIMARY'),
  30. 'type' => array('type' => 'ENUM', 'values' => array('trust', 'spam'), 'null' => false, 'default' => 'trust'),
  31. 'regdate' => array('type' => 'DATETIME', 'null' => false, 'default' => '0000-00-00 00:00:00'),
  32. 'expires' => array('type' => 'DATETIME', 'null' => true, 'default' => null),
  33. 'spampoints' => array('type' => 'INT', 'size' => 11, 'null' => false, 'default' => 0),
  34. 'spamupdate' => array('type' => 'DATETIME', 'null' => true, 'default' => null),
  35. ),
  36. 'mailqueue' => array(
  37. 'mlid' => array('type' => 'VARCHAR', 'size' => 128, 'null' => false, 'key' => 'PRIMARY'),
  38. 'to' => array('type' => 'VARCHAR', 'size' => 128, 'null' => false, 'default' => '', 'key' => 'PRIMARY'),
  39. 'from' => array('type' => 'VARCHAR', 'size' => 255, 'null' => true, 'default' => null),
  40. 'queued' => array('type' => 'DATETIME', 'null' => false),
  41. 'tracker' => array('type' => 'VARCHAR', 'size' => 128, 'null' => true),
  42. 'pid' => array('type' => 'INT', 'size' => 10, 'unsigned' => true, 'null' => true, 'default' => null),
  43. 'attempt_count' => array('type' => 'INT', 'unsigned' => true, 'size' => 10, 'null' => false, 'default' => 0),
  44. 'last_attempt' => array('type' => 'DATETIME', 'default' => null, 'null' => true),
  45. 'last_error' => array('type' => 'TEXT', 'default' => null, 'null' => true),
  46. 'next_attempt' => array('type' => 'DATETIME', 'default' => null, 'null' => true),
  47. ),
  48. );
  49. static private $tables_struct = array(
  50. 'z%s_accounts' => array(
  51. 'id' => array('type'=>'BIGINT', 'size'=>20, 'null'=>false, 'unsigned'=>true, 'auto_increment'=>true, 'key'=>'PRIMARY'),
  52. 'user' => array('type'=>'VARCHAR', 'size'=>64, 'null'=>false, 'default'=>'', 'key'=>'UNIQUE:user'),
  53. 'password' => array('type'=>'VARCHAR', 'size'=>40, 'null'=>true, 'default'=>''),
  54. 'last_login' => array('type'=>'DATETIME', 'null'=>true, 'default'=>NULL),
  55. 'mail_count' => array('type'=>'BIGINT', 'size'=>20, 'null'=>true, 'unsigned'=>true),
  56. 'mail_quota' => array('type'=>'BIGINT', 'size'=>20, 'null'=>true, 'unsigned'=>true),
  57. 'redirect'=>array('type'=>'VARCHAR', 'size'=>255, 'null'=>true, 'default'=>NULL),
  58. ),
  59. 'z%s_alias' => array(
  60. 'id' => array('type'=>'BIGINT', 'size'=>20, 'null'=>false, 'unsigned'=>true, 'auto_increment'=>true, 'key'=>'PRIMARY'),
  61. 'user' => array('type'=>'VARCHAR', 'size'=>64, 'null'=>false, 'default'=>'', 'key'=>'UNIQUE:user'),
  62. 'last_transit' => array('type'=>'DATETIME', 'null'=>true, 'default'=>NULL),
  63. 'real_target' => array('type'=>'BIGINT', 'size'=>20, 'null'=>false, 'unsigned'=>true),
  64. 'mail_target' => array('type'=>'VARCHAR', 'size'=>255, 'null'=>true, 'default'=>NULL),
  65. 'http_target' => array('type'=>'VARCHAR', 'size'=>255, 'null'=>true, 'default'=>NULL),
  66. ),
  67. 'z%s_lists' => array(
  68. 'id' => array('type'=>'BIGINT', 'size'=>20, 'null'=>false, 'unsigned'=>true, 'auto_increment'=>true, 'key'=>'PRIMARY'),
  69. 'user' => array('type'=>'VARCHAR', 'size'=>64, 'null'=>false, 'default'=>'', 'key'=>'UNIQUE:user'),
  70. 'reply_to' => array('type'=>'VARCHAR', 'size'=>128, 'null'=>true),
  71. 'subject_prefix' => array('type'=>'VARCHAR', 'size'=>128, 'null'=>true),
  72. 'allow_subscribe' => array('type' => 'ENUM', 'values' => array('Y','N'), 'default' => 'N'),
  73. 'mail_footer' => array('type'=>'VARCHAR', 'size'=>128, 'null'=>true),
  74. 'restrict_publish' => array('type' => 'ENUM', 'values' => array('Y','N'), 'default' => 'N'),
  75. 'last_transit' => array('type'=>'DATETIME', 'null'=>true, 'default'=>NULL),
  76. ),
  77. 'z%s_lists_members' => array(
  78. 'id' => array('type'=>'BIGINT', 'size'=>20, 'null'=>false, 'unsigned'=>true, 'auto_increment'=>true, 'key'=>'PRIMARY'),
  79. 'list_id' => array('type'=>'BIGINT', 'size'=>20, 'null'=>false, 'unsigned'=>true, 'key' => 'UNIQUE:member'),
  80. 'email' => array('type' => 'VARCHAR', 'size' => 128, 'null' => false, 'key' => 'UNIQUE:member'),
  81. 'status' => array('type' => 'ENUM', 'values' => array('valid','validating','blacklist'), 'default' => 'valid'),
  82. ),
  83. 'z%s_folders' => array('id' => array('type'=>'BIGINT', 'size'=>20, 'null'=>false, 'unsigned'=>true, 'auto_increment'=>true, 'key'=>'PRIMARY'),
  84. 'account' => array('type'=>'BIGINT', 'size'=>20, 'unsigned'=>true, 'null'=>false, 'key'=>'UNIQUE:folder'),
  85. 'name' => array('type'=>'VARCHAR', 'size'=>32, 'null'=>false, 'key'=>'UNIQUE:folder'),
  86. 'parent'=>array('type'=>'BIGINT', 'size'=>20, 'unsigned'=>true, 'null'=>true, 'default'=>null, 'key'=>'UNIQUE:folder'),
  87. 'flags' => array('type' => 'SET', 'values'=>array('noselect'), 'default'=>'', 'null'=>false),
  88. 'subscribed' => array('type' => 'INT', 'size' => 10, 'unsigned' => true, 'null' => false, 'default' => 0),
  89. ),
  90. 'z%s_mails' => array(
  91. 'mailid' => array('type'=>'BIGINT', 'size'=>20, 'null'=>false, 'unsigned'=>true, 'auto_increment'=>true,'key'=>'PRIMARY'),
  92. 'folder'=> array('type'=>'BIGINT', 'size'=>20, 'null'=>false, 'unsigned'=>true, 'key'=>'folder'),
  93. 'userid' => array('type'=>'BIGINT', 'size'=>20, 'null'=>false, 'unsigned'=>true, 'key'=>'UNIQUE:userid'),
  94. 'size' => array('type'=>'BIGINT', 'size'=>20, 'null'=>false, 'unsigned'=>true),
  95. 'mime_cache' => array('type' => 'INT', 'size' => 10, 'null' => false, 'unsigned' => true),
  96. 'uniqname' => array('type'=>'VARCHAR', 'size'=>128, 'null'=>false, 'key'=>'UNIQUE:userid'),
  97. 'flags' => array('type'=>'SET', 'values'=>array('seen','answered','flagged','deleted','draft','recent'), 'default'=>'recent', 'null'=>false),
  98. 'keywords' => array('type' => 'VARCHAR', 'size' => 128, 'null' => false, 'default' => ''),
  99. ),
  100. 'z%s_mime' => array(
  101. 'mimeid' => array('type'=>'BIGINT', 'size'=>20, 'null'=>false, 'unsigned'=>true, 'auto_increment'=>true,'key'=>'PRIMARY'),
  102. 'userid' => array('type'=>'BIGINT', 'size'=>20, 'null'=>false, 'unsigned'=>true, 'key'=>'userid'), // fast deletion
  103. 'mailid' => array('type'=>'BIGINT', 'size'=>20, 'unsigned'=>true, 'null'=>false, 'key' => 'UNIQUE:mime_part'),
  104. 'part' => array('type'=>'VARCHAR', 'size'=>64, 'null'=>false, 'key' => 'UNIQUE:mime_part'), // ie. "1.2"
  105. 'imap_part' => array('type'=>'VARCHAR', 'size'=>64, 'null'=>true, 'key' => 'imap_part'), // ie. "1.2"
  106. 'charset' => array('type' => 'VARCHAR', 'size' => 128, 'null' => false),
  107. 'content_charset' => array('type' => 'VARCHAR', 'size' => 128, 'null' => true),
  108. 'transfer_encoding' => array('type' => 'VARCHAR', 'size' => 64, 'null' => false),
  109. 'content_name' => array('type' => 'VARCHAR', 'size' => 128, 'null' => true),
  110. 'content_type' => array('type' => 'VARCHAR', 'size' => 128, 'null' => false),
  111. 'content_disposition' => array('type' => 'VARCHAR', 'size' => 128, 'null' => true),
  112. 'content_base' => array('type' => 'VARCHAR', 'size' => 128, 'null' => false),
  113. 'content_id' => array('type' => 'VARCHAR', 'size' => 128, 'null' => true),
  114. 'content_description' => array('type' => 'VARCHAR', 'size' => 128, 'null' => true),
  115. 'content_boundary' => array('type' => 'VARCHAR', 'size' => 128, 'null' => true),
  116. 'content_language' => array('type' => 'VARCHAR', 'size' => 32, 'null' => true),
  117. 'disposition_filename' => array('type' => 'VARCHAR', 'size' => 128, 'null' => true),
  118. 'starting_pos' => array('type'=>'BIGINT', 'size'=>20, 'null'=>false, 'unsigned'=>true),
  119. 'starting_pos_body' => array('type'=>'BIGINT', 'size'=>20, 'null'=>false, 'unsigned'=>true),
  120. 'ending_pos' => array('type'=>'BIGINT', 'size'=>20, 'null'=>false, 'unsigned'=>true),
  121. 'ending_pos_body' => array('type'=>'BIGINT', 'size'=>20, 'null'=>false, 'unsigned'=>true),
  122. 'line_count' => array('type'=>'BIGINT', 'size'=>20, 'null'=>false, 'unsigned'=>true),
  123. 'body_line_count' => array('type'=>'BIGINT', 'size'=>20, 'null'=>false, 'unsigned'=>true),
  124. ),
  125. 'z%s_mime_header' => array(
  126. 'headerid' => array('type'=>'BIGINT', 'size'=>20, 'null'=>false, 'unsigned'=>true, 'auto_increment'=>true,'key'=>'PRIMARY'),
  127. 'mimeid' => array('type'=>'BIGINT', 'size'=>20, 'null'=>false, 'unsigned'=>true, 'key'=>'mimeid'),
  128. 'userid' => array('type'=>'BIGINT', 'size'=>20, 'null'=>false, 'unsigned'=>true, 'key'=>'userid'), // fast deletion
  129. 'mailid' => array('type'=>'BIGINT', 'size'=>20, 'unsigned'=>true, 'null'=>false, 'key' => 'mailid'), // fast deletion
  130. 'header' => array('type'=>'VARCHAR', 'size'=>64, 'null'=>false, 'key'=>'header'),
  131. 'content' => array('type'=>'LONGTEXT', 'null'=>false, 'key'=>'FULLTEXT:content'),
  132. ),
  133. 'z%s_filter' => array(
  134. 'id' => array('type'=>'BIGINT', 'size'=>20, 'null'=>false, 'unsigned'=>true, 'auto_increment'=>true, 'key'=>'PRIMARY'),
  135. 'userid' => array('type'=>'BIGINT', 'size'=>20, 'unsigned'=>true, 'null'=>false, 'key'=>'usermail'),
  136. 'name' => array('type' => 'VARCHAR', 'size' => 128, 'null' => false),
  137. ),
  138. 'z%s_filter_cond' => array(
  139. 'id' => array('type'=>'BIGINT', 'size'=>20, 'null'=>false, 'unsigned'=>true, 'auto_increment'=>true, 'key'=>'PRIMARY'),
  140. 'filterid' => array('type'=>'BIGINT', 'size'=>20, 'null'=>false, 'unsigned'=>true, 'key' => 'filterid'),
  141. 'priority' => array('type' => 'INT', 'size' => 10, 'default' => 0),
  142. 'source' => array('type' => 'ENUM', 'values' => array('header'), 'default' => 'header'),
  143. 'type' => array('type' => 'ENUM', 'values' => array('exact', 'contains', 'preg'), 'default' => 'contains'),
  144. 'arg1' => array('type' => 'VARCHAR', 'size' => 255),
  145. 'arg2' => array('type' => 'VARCHAR', 'size' => 255),
  146. ),
  147. 'z%s_filter_act' => array(
  148. 'id' => array('type'=>'BIGINT', 'size'=>20, 'null'=>false, 'unsigned'=>true, 'auto_increment'=>true, 'key'=>'PRIMARY'),
  149. 'filterid' => array('type'=>'BIGINT', 'size'=>20, 'null'=>false, 'unsigned'=>true, 'key' => 'filterid'),
  150. 'action' => array('type' => 'ENUM', 'values' => array('move', 'copy', 'drop', 'flags'), 'default' => 'move'),
  151. 'arg1' => array('type' => 'VARCHAR', 'size' => 255),
  152. ),
  153. );
  154. function validateTables($SQL, $id = null) {
  155. $t = &self::$global_tables;
  156. if (!is_null($id)) {
  157. $id = (int)$id; // force cast to int
  158. $option = str_pad($id, 10, '0', STR_PAD_LEFT);
  159. foreach(self::$tables_struct as $name => $struct) {
  160. $old_name = sprintf($name, $option);
  161. $name = sprintf($name, $id);
  162. // check for legacy table
  163. if ($SQL->query('SELECT 1 FROM `'.$old_name.'` LIMIT 1')) {
  164. $SQL->query('DROP TABLE `'.$name.'`');
  165. $SQL->query('RENAME TABLE `'.$old_name.'` TO `'.$name.'`');
  166. }
  167. $SQL->validateStruct($name, $struct);
  168. }
  169. return; // o rly?
  170. }
  171. foreach(self::$global_tables as $name => $struct) {
  172. $SQL->validateStruct($name, $struct);
  173. }
  174. }
  175. }