functions.customize.inc.php 12 KB

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