functions.customize.inc.php 12 KB

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