functions.customize.inc.php 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282
  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. }
  162. break;
  163. case 'delete':
  164. // disable functionality when demo mode is enabled
  165. if ($GLOBALS["DEMO_MODE"]) {
  166. $_SESSION['return'][] = array(
  167. 'type' => 'danger',
  168. 'log' => array(__FUNCTION__, $_action, $_item, $_data),
  169. 'msg' => 'demo_mode_enabled'
  170. );
  171. return false;
  172. }
  173. if ($_SESSION['mailcow_cc_role'] != "admin") {
  174. $_SESSION['return'][] = array(
  175. 'type' => 'danger',
  176. 'log' => array(__FUNCTION__, $_action, $_item, $_data),
  177. 'msg' => 'access_denied'
  178. );
  179. return false;
  180. }
  181. switch ($_item) {
  182. case 'main_logo':
  183. try {
  184. if ($redis->del('MAIN_LOGO')) {
  185. $_SESSION['return'][] = array(
  186. 'type' => 'success',
  187. 'log' => array(__FUNCTION__, $_action, $_item, $_data),
  188. 'msg' => 'reset_main_logo'
  189. );
  190. return true;
  191. }
  192. }
  193. catch (RedisException $e) {
  194. $_SESSION['return'][] = array(
  195. 'type' => 'danger',
  196. 'log' => array(__FUNCTION__, $_action, $_item, $_data),
  197. 'msg' => array('redis_error', $e)
  198. );
  199. return false;
  200. }
  201. break;
  202. }
  203. break;
  204. case 'get':
  205. switch ($_item) {
  206. case 'app_links':
  207. try {
  208. $app_links = json_decode($redis->get('APP_LINKS'), true);
  209. }
  210. catch (RedisException $e) {
  211. $_SESSION['return'][] = array(
  212. 'type' => 'danger',
  213. 'log' => array(__FUNCTION__, $_action, $_item, $_data),
  214. 'msg' => array('redis_error', $e)
  215. );
  216. return false;
  217. }
  218. return ($app_links) ? $app_links : false;
  219. break;
  220. case 'main_logo':
  221. try {
  222. return $redis->get('MAIN_LOGO');
  223. }
  224. catch (RedisException $e) {
  225. $_SESSION['return'][] = array(
  226. 'type' => 'danger',
  227. 'log' => array(__FUNCTION__, $_action, $_item, $_data),
  228. 'msg' => array('redis_error', $e)
  229. );
  230. return false;
  231. }
  232. break;
  233. case 'ui_texts':
  234. try {
  235. $data['title_name'] = ($title_name = $redis->get('TITLE_NAME')) ? $title_name : 'mailcow UI';
  236. $data['main_name'] = ($main_name = $redis->get('MAIN_NAME')) ? $main_name : 'mailcow UI';
  237. $data['apps_name'] = ($apps_name = $redis->get('APPS_NAME')) ? $apps_name : $lang['header']['apps'];
  238. $data['help_text'] = ($help_text = $redis->get('HELP_TEXT')) ? $help_text : false;
  239. if (!empty($redis->get('UI_IMPRESS'))) {
  240. $redis->set('UI_FOOTER', $redis->get('UI_IMPRESS'));
  241. $redis->del('UI_IMPRESS');
  242. }
  243. $data['ui_footer'] = ($ui_footer = $redis->get('UI_FOOTER')) ? $ui_footer : false;
  244. $data['ui_announcement_text'] = ($ui_announcement_text = $redis->get('UI_ANNOUNCEMENT_TEXT')) ? $ui_announcement_text : false;
  245. $data['ui_announcement_type'] = ($ui_announcement_type = $redis->get('UI_ANNOUNCEMENT_TYPE')) ? $ui_announcement_type : false;
  246. $data['ui_announcement_active'] = ($redis->get('UI_ANNOUNCEMENT_ACTIVE') == 1) ? 1 : 0;
  247. return $data;
  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. break;
  258. case 'main_logo_specs':
  259. try {
  260. $image = new Imagick();
  261. $img_data = explode('base64,', customize('get', 'main_logo'));
  262. if ($img_data[1]) {
  263. $image->readImageBlob(base64_decode($img_data[1]));
  264. return $image->identifyImage();
  265. }
  266. return false;
  267. }
  268. catch (ImagickException $e) {
  269. $_SESSION['return'][] = array(
  270. 'type' => 'danger',
  271. 'log' => array(__FUNCTION__, $_action, $_item, $_data),
  272. 'msg' => 'imagick_exception'
  273. );
  274. return false;
  275. }
  276. break;
  277. }
  278. break;
  279. }
  280. }