AliasHandlerTest.php 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388
  1. <?php
  2. class AliasHandlerTest extends \PHPUnit\Framework\TestCase {
  3. protected function setUp(): void {
  4. // Fake being an admin.
  5. $_SESSION = [
  6. 'sessid' => [
  7. 'roles' => ['global-admin']
  8. ]
  9. ];
  10. parent::setUp();
  11. }
  12. protected function tearDown(): void {
  13. $_SESSION = [];
  14. db_query('DELETE FROM alias');
  15. db_query('DELETE FROM domain_admins');
  16. db_query('DELETE FROM domain');
  17. parent::tearDown();
  18. }
  19. public function testBasic() {
  20. $x = new AliasHandler();
  21. $list = $x->getList("");
  22. $this->assertTrue($list);
  23. $results = $x->result();
  24. $this->assertEmpty($results);
  25. }
  26. public function testCannotAddAliasUntilDomainIsThere() {
  27. // Fake us being an admin.
  28. $_SESSION = [
  29. 'sessid' => [
  30. 'roles' => ['global-admin']
  31. ]
  32. ];
  33. // Trying to add an alias when the domain doesn't exist fails.
  34. $x = new AliasHandler(1, 'admin', true);
  35. $values = [
  36. 'localpart' => 'david.test',
  37. 'domain' => 'example.com',
  38. 'active' => 1,
  39. 'address' => 'david.test@example.com',
  40. 'goto' => ['dest@example.com']
  41. ];
  42. try {
  43. $r = $x->init('david.test@example.com');
  44. $this->fail("Should not see this - example.com is not present");
  45. } catch (\Exception $e) {
  46. $this->assertEquals('Error: This domain does not exist!', $e->getMessage());
  47. }
  48. }
  49. /**
  50. * @see https://github.com/postfixadmin/postfixadmin/pull/375 and https://github.com/postfixadmin/postfixadmin/issues/358
  51. */
  52. public function testCannotAddAliasThatPointsToItself() {
  53. // Fake being an admin.
  54. $_SESSION = [
  55. 'sessid' => [
  56. 'roles' => ['global-admin']
  57. ]
  58. ];
  59. // Add example.com
  60. $dh = new DomainHandler(1, 'admin', true);
  61. $dh->init('example.com');
  62. $ret = $dh->set(
  63. [
  64. 'domain' => 'example.com',
  65. 'description' => 'test domain',
  66. 'aliases' => 11,
  67. 'mailboxes' => 12,
  68. 'active' => 1,
  69. 'backupmx' => 0,
  70. 'default_aliases' => 1
  71. ]
  72. );
  73. $this->assertEmpty($dh->errormsg);
  74. $this->assertEmpty($dh->infomsg);
  75. $this->assertTrue($ret);
  76. $ret = $dh->save();
  77. $this->assertTrue($ret);
  78. // Need to add 'admin' as a domain_admin
  79. db_insert('domain_admins', ['username' => 'admin', 'domain' => 'example.com', 'created' => '2020-01-01', 'active' => 1], ['created'], true);
  80. $dh = new DomainHandler(0, 'admin', true);
  81. $dh->getList('');
  82. $result = $dh->result();
  83. $this->assertEmpty($dh->infomsg);
  84. $this->assertEmpty($dh->errormsg);
  85. $this->assertNotEmpty($result);
  86. $this->assertEquals('example.com', $result['example.com']['domain']);
  87. $this->assertEquals('test domain', $result['example.com']['description']);
  88. $this->assertEquals(11, $result['example.com']['aliases']);
  89. $this->assertEquals(12, $result['example.com']['mailboxes']); // default aliases.
  90. $this->assertEquals(4, $result['example.com']['alias_count']); // default aliases.
  91. $this->assertEquals(0, $result['example.com']['mailbox_count']);
  92. $this->assertEquals(1, $result['example.com']['active']);
  93. $x = new AliasHandler(1, 'admin', true);
  94. $values = [
  95. 'localpart' => 'david.test',
  96. 'domain' => 'example.com',
  97. 'active' => 1,
  98. 'address' => 'david.test@example.com',
  99. 'goto' => ['david.test@example.com']
  100. ];
  101. $r = $x->init('david.test@example.com');
  102. $this->assertTrue($r);
  103. $x->getList('');
  104. $list = $x->result();
  105. $this->assertEquals(4, count($list)); // default aliases.
  106. $x->set($values);
  107. $x->save();
  108. $this->assertNotEmpty($x->errormsg);
  109. $this->assertEquals(
  110. [
  111. 'goto' => "david.test@example.com: Alias may not point to itself",
  112. 0 => "one or more values are invalid!"
  113. ], $x->errormsg);
  114. }
  115. public function testAddingDataEtc() {
  116. // Fake being an admin.
  117. $_SESSION = [
  118. 'sessid' => [
  119. 'roles' => ['global-admin']
  120. ]
  121. ];
  122. $this->addDomain('example.com', 'admin');
  123. $x = new AliasHandler(1, 'admin', true);
  124. $values = [
  125. 'localpart' => 'david.test',
  126. 'domain' => 'example.com',
  127. 'active' => 1,
  128. 'address' => 'david.test@example.com',
  129. 'goto' => ['dest@example.com']
  130. ];
  131. $r = $x->init('david.test@example.com');
  132. $this->assertTrue($r);
  133. $x->getList('');
  134. $list = $x->result();
  135. $this->assertEquals(4, count($list)); // default aliases.
  136. $x->set($values);
  137. $x->save();
  138. $x->getList('');
  139. $list = $x->result();
  140. $this->assertEquals(5, count($list));
  141. $found = false;
  142. foreach ($list as $alias => $details) {
  143. if ($alias == 'david.test@example.com') {
  144. // Found!
  145. $this->assertEquals('example.com', $details['domain']);
  146. $this->assertEquals('david.test@example.com', $details['address']);
  147. $this->assertEquals(['dest@example.com'], $details['goto']);
  148. $found = true;
  149. break;
  150. }
  151. }
  152. $this->assertTrue($found, "check output : " . json_encode($list));
  153. }
  154. private function addDomain(string $domain, string $username): void {
  155. // Fake being an admin.
  156. $_SESSION = [
  157. 'sessid' => [
  158. 'roles' => ['global-admin']
  159. ]
  160. ];
  161. // Add example.com
  162. $dh = new DomainHandler(1, $username, true);
  163. $dh->init('example.com');
  164. $ret = $dh->set(
  165. [
  166. 'domain' => $domain,
  167. 'description' => 'test domain',
  168. 'aliases' => 11,
  169. 'mailboxes' => 12,
  170. 'active' => 1,
  171. 'backupmx' => 0,
  172. 'default_aliases' => 1
  173. ]
  174. );
  175. $this->assertEmpty($dh->errormsg);
  176. $this->assertEmpty($dh->infomsg);
  177. $this->assertTrue($ret);
  178. $ret = $dh->save();
  179. $this->assertTrue($ret);
  180. // Need to add 'admin' as a domain_admin
  181. db_insert('domain_admins', ['username' => $username, 'domain' => $domain, 'created' => '2020-01-01', 'active' => 1], ['created'], true);
  182. $dh = new DomainHandler(0, $username, true);
  183. $dh->getList('');
  184. $result = $dh->result();
  185. $this->assertEmpty($dh->infomsg);
  186. $this->assertEmpty($dh->errormsg);
  187. $this->assertNotEmpty($result);
  188. $expected = [
  189. 'domain' => 'example.com',
  190. 'description' => 'test domain',
  191. 'aliases' => 11,
  192. 'alias_count' => 4,
  193. 'mailboxes' => 12,
  194. 'mailbox_count' => 0,
  195. 'backupmx' => 0,
  196. 'active' => 1,
  197. ];
  198. foreach ($expected as $k => $v) {
  199. $this->assertEquals($v, $result[$domain][$k]);
  200. }
  201. }
  202. public function testYouCannotAddMoreAliasesThanTheDomainLimit() {
  203. $this->addDomain('example.com', 'admin');
  204. // default limit is 11 aliases.... so it should exit once we get past that.
  205. $dh = new DomainHandler(0, 'admin', true);
  206. $this->assertTrue($dh->getList(''));
  207. $result = $dh->result();
  208. // alias count limit is 11.
  209. $this->assertEquals(11, $result['example.com']['aliases']);
  210. // 4 default aliases were added.
  211. $this->assertEquals(4, $result['example.com']['alias_count']);
  212. foreach (range(1, 7) as $char) {
  213. $newAlias = $char . '-test@example.com';
  214. $x = new AliasHandler(1, 'admin', true);
  215. $values = [
  216. 'localpart' => explode('@', $newAlias)[0],
  217. 'domain' => 'example.com',
  218. 'active' => 1,
  219. 'address' => $newAlias,
  220. 'goto' => ['dest@example.com']
  221. ];
  222. $r = $x->init($newAlias);
  223. $this->assertTrue($r);
  224. $x->set($values);
  225. $this->assertTrue($x->save());
  226. $this->assertTrue($x->getList(''));
  227. $list = $x->result();
  228. $this->assertArrayHasKey($newAlias, $list);
  229. $this->assertEquals(1, $list[$newAlias]['active']);
  230. }
  231. // try and add one more - it should fail.
  232. $x = new AliasHandler(1, 'admin', true);
  233. $values = [
  234. 'localpart' => 'z-david.test',
  235. 'domain' => 'example.com',
  236. 'active' => 1,
  237. 'address' => 'z-david.test@example.com',
  238. 'goto' => ['dest@example.com']
  239. ];
  240. $r = $x->init('z-david.test@example.com');
  241. // doesn't already exist.
  242. $this->assertFalse($r);
  243. // try saving ....
  244. $x->set($values);
  245. $this->assertFalse($x->save());
  246. $this->assertEquals([
  247. 'address' => "You have reached your limit to create aliases!",
  248. 0 => "one or more values are invalid!"
  249. ], $x->errormsg);
  250. }
  251. public function testLoadsOfAliasesGetHandledByPager() {
  252. $this->addDomain('example.com', 'admin');
  253. // default limit is 11 aliases.... so it should exit once we get past that.
  254. $dh = new DomainHandler(0, 'admin', true);
  255. $dh->init('example.com');
  256. $this->assertTrue($dh->set(
  257. [
  258. //'domain' => 'example.com',
  259. 'aliases' => 99,
  260. 'mailboxes' => 88,
  261. 'backupmx' => 0,
  262. 'active' => 1,
  263. ]
  264. ));
  265. $this->assertTrue($dh->save());
  266. $dh->getList('');
  267. $domain = $dh->result()['example.com'];
  268. $this->assertEquals(99, $domain['aliases']);
  269. $this->assertEquals(88, $domain['mailboxes']);
  270. foreach (range(1, 80) as $char) {
  271. $newAlias = $char . '-test@example.com';
  272. $x = new AliasHandler(1, 'admin', true);
  273. $values = [
  274. 'localpart' => explode('@', $newAlias)[0],
  275. 'domain' => 'example.com',
  276. 'active' => 1,
  277. 'address' => $newAlias,
  278. 'goto' => ['dest@example.com']
  279. ];
  280. $r = $x->init($newAlias);
  281. $this->assertTrue($r);
  282. $x->set($values);
  283. $this->assertTrue($x->save());
  284. $this->assertTrue($x->getList(''));
  285. $list = $x->result();
  286. $this->assertArrayHasKey($newAlias, $list);
  287. $this->assertEquals(1, $list[$newAlias]['active']);
  288. }
  289. // try and add one more - it should fail.
  290. $x = new AliasHandler(0, 'admin', true);
  291. $x->getList('', [], 5, 20);
  292. $results = $x->result();
  293. $this->assertEquals(5, count($results));
  294. $this->assertTrue(isset($results['31-test@example.com']));
  295. }
  296. }