functions.customize.inc.php 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341
  1. <?php
  2. function customize($_action, $_item, $_data = null) {
  3. global $redis;
  4. global $lang;
  5. global $LOGO_LIMITS;
  6. switch ($_action) {
  7. case 'add':
  8. // disable functionality when demo mode is enabled
  9. if ($GLOBALS["DEMO_MODE"]) {
  10. $_SESSION['return'][] = array(
  11. 'type' => 'danger',
  12. 'log' => array(__FUNCTION__, $_action, $_item, $_data),
  13. 'msg' => 'demo_mode_enabled'
  14. );
  15. return false;
  16. }
  17. if ($_SESSION['mailcow_cc_role'] != "admin") {
  18. $_SESSION['return'][] = array(
  19. 'type' => 'danger',
  20. 'log' => array(__FUNCTION__, $_action, $_item, $_data),
  21. 'msg' => 'access_denied'
  22. );
  23. return false;
  24. }
  25. switch ($_item) {
  26. case 'main_logo':
  27. case 'main_logo_dark':
  28. if (in_array($_data[$_item]['type'], array('image/gif', 'image/jpeg', 'image/pjpeg', 'image/x-png', 'image/png', 'image/svg+xml'))) {
  29. try {
  30. if (file_exists($_data[$_item]['tmp_name']) !== true) {
  31. $_SESSION['return'][] = array(
  32. 'type' => 'danger',
  33. 'log' => array(__FUNCTION__, $_action, $_item, $_data),
  34. 'msg' => 'img_tmp_missing'
  35. );
  36. return false;
  37. }
  38. if ($_data[$_item]['size'] > $LOGO_LIMITS['max_size']) {
  39. $_SESSION['return'][] = array(
  40. 'type' => 'danger',
  41. 'log' => array(__FUNCTION__, $_action, $_item, $_data),
  42. 'msg' => 'img_size_exceeded'
  43. );
  44. return false;
  45. }
  46. list($width, $height) = getimagesize($_data[$_item]['tmp_name']);
  47. if ($width > $LOGO_LIMITS['max_width'] || $height > $LOGO_LIMITS['max_height']) {
  48. $_SESSION['return'][] = array(
  49. 'type' => 'danger',
  50. 'log' => array(__FUNCTION__, $_action, $_item, $_data),
  51. 'msg' => 'img_dimensions_exceeded'
  52. );
  53. return false;
  54. }
  55. $image = new Imagick($_data[$_item]['tmp_name']);
  56. if ($image->valid() !== true) {
  57. $_SESSION['return'][] = array(
  58. 'type' => 'danger',
  59. 'log' => array(__FUNCTION__, $_action, $_item, $_data),
  60. 'msg' => 'img_invalid'
  61. );
  62. return false;
  63. }
  64. $image->destroy();
  65. }
  66. catch (ImagickException $e) {
  67. $_SESSION['return'][] = array(
  68. 'type' => 'danger',
  69. 'log' => array(__FUNCTION__, $_action, $_item, $_data),
  70. 'msg' => 'img_invalid'
  71. );
  72. return false;
  73. }
  74. }
  75. else {
  76. $_SESSION['return'][] = array(
  77. 'type' => 'danger',
  78. 'log' => array(__FUNCTION__, $_action, $_item, $_data),
  79. 'msg' => 'invalid_mime_type'
  80. );
  81. return false;
  82. }
  83. try {
  84. $redis->Set(strtoupper($_item), 'data:' . $_data[$_item]['type'] . ';base64,' . base64_encode(file_get_contents($_data[$_item]['tmp_name'])));
  85. }
  86. catch (RedisException $e) {
  87. $_SESSION['return'][] = array(
  88. 'type' => 'danger',
  89. 'log' => array(__FUNCTION__, $_action, $_item, $_data),
  90. 'msg' => array('redis_error', $e)
  91. );
  92. return false;
  93. }
  94. $_SESSION['return'][] = array(
  95. 'type' => 'success',
  96. 'log' => array(__FUNCTION__, $_action, $_item, $_data),
  97. 'msg' => 'upload_success'
  98. );
  99. break;
  100. }
  101. break;
  102. case 'edit':
  103. // disable functionality when demo mode is enabled
  104. if ($GLOBALS["DEMO_MODE"]) {
  105. $_SESSION['return'][] = array(
  106. 'type' => 'danger',
  107. 'log' => array(__FUNCTION__, $_action, $_item, $_data),
  108. 'msg' => 'demo_mode_enabled'
  109. );
  110. return false;
  111. }
  112. if ($_SESSION['mailcow_cc_role'] != "admin") {
  113. $_SESSION['return'][] = array(
  114. 'type' => 'danger',
  115. 'log' => array(__FUNCTION__, $_action, $_item, $_data),
  116. 'msg' => 'access_denied'
  117. );
  118. return false;
  119. }
  120. switch ($_item) {
  121. case 'app_links':
  122. $apps = (array)$_data['app'];
  123. $links = (array)$_data['href'];
  124. $out = array();
  125. if (count($apps) == count($links)) {
  126. for ($i = 0; $i < count($apps); $i++) {
  127. $out[] = array($apps[$i] => $links[$i]);
  128. }
  129. try {
  130. $redis->set('APP_LINKS', json_encode($out));
  131. }
  132. catch (RedisException $e) {
  133. $_SESSION['return'][] = array(
  134. 'type' => 'danger',
  135. 'log' => array(__FUNCTION__, $_action, $_item, $_data),
  136. 'msg' => array('redis_error', $e)
  137. );
  138. return false;
  139. }
  140. }
  141. $_SESSION['return'][] = array(
  142. 'type' => 'success',
  143. 'log' => array(__FUNCTION__, $_action, $_item, $_data),
  144. 'msg' => 'app_links'
  145. );
  146. break;
  147. case 'ui_texts':
  148. $title_name = $_data['title_name'];
  149. $main_name = $_data['main_name'];
  150. $apps_name = $_data['apps_name'];
  151. $help_text = $_data['help_text'];
  152. $ui_footer = $_data['ui_footer'];
  153. $ui_announcement_text = $_data['ui_announcement_text'];
  154. $ui_announcement_type = (in_array($_data['ui_announcement_type'], array('info', 'warning', 'danger'))) ? $_data['ui_announcement_type'] : false;
  155. $ui_announcement_active = (!empty($_data['ui_announcement_active']) ? 1 : 0);
  156. try {
  157. $redis->set('TITLE_NAME', htmlspecialchars($title_name));
  158. $redis->set('MAIN_NAME', htmlspecialchars($main_name));
  159. $redis->set('APPS_NAME', htmlspecialchars($apps_name));
  160. $redis->set('HELP_TEXT', $help_text);
  161. $redis->set('UI_FOOTER', $ui_footer);
  162. $redis->set('UI_ANNOUNCEMENT_TEXT', $ui_announcement_text);
  163. $redis->set('UI_ANNOUNCEMENT_TYPE', $ui_announcement_type);
  164. $redis->set('UI_ANNOUNCEMENT_ACTIVE', $ui_announcement_active);
  165. }
  166. catch (RedisException $e) {
  167. $_SESSION['return'][] = array(
  168. 'type' => 'danger',
  169. 'log' => array(__FUNCTION__, $_action, $_item, $_data),
  170. 'msg' => array('redis_error', $e)
  171. );
  172. return false;
  173. }
  174. $_SESSION['return'][] = array(
  175. 'type' => 'success',
  176. 'log' => array(__FUNCTION__, $_action, $_item, $_data),
  177. 'msg' => 'ui_texts'
  178. );
  179. break;
  180. case 'ip_check':
  181. $ip_check = ($_data['ip_check_opt_in'] == "1") ? 1 : 0;
  182. try {
  183. $redis->set('IP_CHECK', $ip_check);
  184. }
  185. catch (RedisException $e) {
  186. $_SESSION['return'][] = array(
  187. 'type' => 'danger',
  188. 'log' => array(__FUNCTION__, $_action, $_item, $_data),
  189. 'msg' => array('redis_error', $e)
  190. );
  191. return false;
  192. }
  193. $_SESSION['return'][] = array(
  194. 'type' => 'success',
  195. 'log' => array(__FUNCTION__, $_action, $_item, $_data),
  196. 'msg' => 'ip_check_opt_in_modified'
  197. );
  198. break;
  199. }
  200. break;
  201. case 'delete':
  202. // disable functionality when demo mode is enabled
  203. if ($GLOBALS["DEMO_MODE"]) {
  204. $_SESSION['return'][] = array(
  205. 'type' => 'danger',
  206. 'log' => array(__FUNCTION__, $_action, $_item, $_data),
  207. 'msg' => 'demo_mode_enabled'
  208. );
  209. return false;
  210. }
  211. if ($_SESSION['mailcow_cc_role'] != "admin") {
  212. $_SESSION['return'][] = array(
  213. 'type' => 'danger',
  214. 'log' => array(__FUNCTION__, $_action, $_item, $_data),
  215. 'msg' => 'access_denied'
  216. );
  217. return false;
  218. }
  219. switch ($_item) {
  220. case 'main_logo':
  221. case 'main_logo_dark':
  222. try {
  223. if ($redis->del(strtoupper($_item))) {
  224. $_SESSION['return'][] = array(
  225. 'type' => 'success',
  226. 'log' => array(__FUNCTION__, $_action, $_item, $_data),
  227. 'msg' => 'reset_main_logo'
  228. );
  229. return true;
  230. }
  231. }
  232. catch (RedisException $e) {
  233. $_SESSION['return'][] = array(
  234. 'type' => 'danger',
  235. 'log' => array(__FUNCTION__, $_action, $_item, $_data),
  236. 'msg' => array('redis_error', $e)
  237. );
  238. return false;
  239. }
  240. break;
  241. }
  242. break;
  243. case 'get':
  244. switch ($_item) {
  245. case 'app_links':
  246. try {
  247. $app_links = json_decode($redis->get('APP_LINKS'), true);
  248. }
  249. catch (RedisException $e) {
  250. $_SESSION['return'][] = array(
  251. 'type' => 'danger',
  252. 'log' => array(__FUNCTION__, $_action, $_item, $_data),
  253. 'msg' => array('redis_error', $e)
  254. );
  255. return false;
  256. }
  257. return ($app_links) ? $app_links : false;
  258. break;
  259. case 'main_logo':
  260. case 'main_logo_dark':
  261. try {
  262. return $redis->get(strtoupper($_item));
  263. }
  264. catch (RedisException $e) {
  265. $_SESSION['return'][] = array(
  266. 'type' => 'danger',
  267. 'log' => array(__FUNCTION__, $_action, $_item, $_data),
  268. 'msg' => array('redis_error', $e)
  269. );
  270. return false;
  271. }
  272. break;
  273. case 'ui_texts':
  274. try {
  275. $data['title_name'] = ($title_name = $redis->get('TITLE_NAME')) ? $title_name : 'mailcow UI';
  276. $data['main_name'] = ($main_name = $redis->get('MAIN_NAME')) ? $main_name : 'mailcow UI';
  277. $data['apps_name'] = ($apps_name = $redis->get('APPS_NAME')) ? $apps_name : $lang['header']['apps'];
  278. $data['help_text'] = ($help_text = $redis->get('HELP_TEXT')) ? $help_text : false;
  279. if (!empty($redis->get('UI_IMPRESS'))) {
  280. $redis->set('UI_FOOTER', $redis->get('UI_IMPRESS'));
  281. $redis->del('UI_IMPRESS');
  282. }
  283. $data['ui_footer'] = ($ui_footer = $redis->get('UI_FOOTER')) ? $ui_footer : false;
  284. $data['ui_announcement_text'] = ($ui_announcement_text = $redis->get('UI_ANNOUNCEMENT_TEXT')) ? $ui_announcement_text : false;
  285. $data['ui_announcement_type'] = ($ui_announcement_type = $redis->get('UI_ANNOUNCEMENT_TYPE')) ? $ui_announcement_type : false;
  286. $data['ui_announcement_active'] = ($redis->get('UI_ANNOUNCEMENT_ACTIVE') == 1) ? 1 : 0;
  287. return $data;
  288. }
  289. catch (RedisException $e) {
  290. $_SESSION['return'][] = array(
  291. 'type' => 'danger',
  292. 'log' => array(__FUNCTION__, $_action, $_item, $_data),
  293. 'msg' => array('redis_error', $e)
  294. );
  295. return false;
  296. }
  297. break;
  298. case 'main_logo_specs':
  299. case 'main_logo_dark_specs':
  300. try {
  301. $image = new Imagick();
  302. if($_item == 'main_logo_specs') {
  303. $img_data = explode('base64,', customize('get', 'main_logo'));
  304. } else {
  305. $img_data = explode('base64,', customize('get', 'main_logo_dark'));
  306. }
  307. if ($img_data[1]) {
  308. $image->readImageBlob(base64_decode($img_data[1]));
  309. return $image->identifyImage();
  310. }
  311. return false;
  312. }
  313. catch (ImagickException $e) {
  314. $_SESSION['return'][] = array(
  315. 'type' => 'danger',
  316. 'log' => array(__FUNCTION__, $_action, $_item, $_data),
  317. 'msg' => 'imagick_exception'
  318. );
  319. return false;
  320. }
  321. break;
  322. case 'ip_check':
  323. try {
  324. $ip_check = ($ip_check = $redis->get('IP_CHECK')) ? $ip_check : 0;
  325. return $ip_check;
  326. }
  327. catch (RedisException $e) {
  328. $_SESSION['return'][] = array(
  329. 'type' => 'danger',
  330. 'log' => array(__FUNCTION__, $_action, $_item, $_data),
  331. 'msg' => array('redis_error', $e)
  332. );
  333. return false;
  334. }
  335. break;
  336. }
  337. break;
  338. }
  339. }