Customize SOGo theme from Web UI

This commit is contained in:
FreddleSpl0it
2023-04-24 12:54:56 +02:00
parent 73570cc8b5
commit 4c495200c8
19 changed files with 831 additions and 57 deletions

View File

@@ -73,6 +73,81 @@ function customize($_action, $_item, $_data = null) {
);
return false;
}
$docker_return = docker('post', 'sogo-mailcow', 'exec', array('cmd' => 'sogo', 'task' => 'set_logo'));
$_SESSION['return'][] = array(
'type' => 'success',
'log' => array(__FUNCTION__, $_action, $_item, $_data),
'msg' => 'upload_success'
);
break;
case 'favicon':
if (in_array($_data['favicon']['type'], array('image/png', 'image/x-icon'))) {
try {
if (file_exists($_data['favicon']['tmp_name']) !== true) {
$_SESSION['return'][] = array(
'type' => 'danger',
'log' => array(__FUNCTION__, $_action, $_item, $_data),
'msg' => 'img_tmp_missing'
);
return false;
}
$image = new Imagick($_data['favicon']['tmp_name']);
if ($image->valid() !== true) {
$_SESSION['return'][] = array(
'type' => 'danger',
'log' => array(__FUNCTION__, $_action, $_item, $_data),
'msg' => 'img_invalid'
);
return false;
}
$available_sizes = array(32, 128, 180, 192, 256);
if ($image->getImageWidth() != $image->getImageHeight()) {
$_SESSION['return'][] = array(
'type' => 'danger',
'log' => array(__FUNCTION__, $_action, $_item, $_data),
'msg' => 'img_invalid'
);
return false;
}
if (!in_array($image->getImageWidth(), $available_sizes)) {
$_SESSION['return'][] = array(
'type' => 'danger',
'log' => array(__FUNCTION__, $_action, $_item, $_data),
'msg' => 'img_invalid'
);
return false;
}
$image->destroy();
}
catch (ImagickException $e) {
$_SESSION['return'][] = array(
'type' => 'danger',
'log' => array(__FUNCTION__, $_action, $_item, $_data),
'msg' => 'img_invalid'
);
return false;
}
}
else {
$_SESSION['return'][] = array(
'type' => 'danger',
'log' => array(__FUNCTION__, $_action, $_item, $_data),
'msg' => 'invalid_mime_type'
);
return false;
}
try {
$redis->Set('FAVICON', 'data:' . $_data['favicon']['type'] . ';base64,' . base64_encode(file_get_contents($_data['favicon']['tmp_name'])));
}
catch (RedisException $e) {
$_SESSION['return'][] = array(
'type' => 'danger',
'log' => array(__FUNCTION__, $_action, $_item, $_data),
'msg' => array('redis_error', $e)
);
return false;
}
$docker_return = docker('post', 'sogo-mailcow', 'exec', array('cmd' => 'sogo', 'task' => 'set_favicon'));
$_SESSION['return'][] = array(
'type' => 'success',
'log' => array(__FUNCTION__, $_action, $_item, $_data),
@@ -179,6 +254,34 @@ function customize($_action, $_item, $_data = null) {
'msg' => 'ip_check_opt_in_modified'
);
break;
case 'sogo_theme':
$_data['primary'] = (isset($_data['primary']) && in_array($_data['primary'], $GLOBALS['SOGO_PALETTES'])) ? $_data['primary'] : 'green';
$_data['accent'] = (isset($_data['accent']) && in_array($_data['accent'], $GLOBALS['SOGO_PALETTES'])) ? $_data['accent'] : 'green';
$_data['background'] = (isset($_data['background']) && in_array($_data['background'], $GLOBALS['SOGO_PALETTES'])) ? $_data['background'] : 'grey';
try {
$redis->hSet('SOGO_THEME', 'primary', $_data['primary']);
$redis->hSet('SOGO_THEME', 'accent', $_data['accent']);
$redis->hSet('SOGO_THEME', 'background', $_data['background']);
}
catch (RedisException $e) {
$_SESSION['return'][] = array(
'type' => 'danger',
'log' => array(__FUNCTION__, $_action, $_item, $_data),
'msg' => array('redis_error', $e)
);
return false;
}
$docker_return = docker('post', 'sogo-mailcow', 'exec', array('cmd' => 'sogo', 'task' => 'customize_enable'));
$docker_return = docker('post', 'sogo-mailcow', 'exec', array('cmd' => 'sogo', 'task' => 'set_theme'));
$_SESSION['return'][] = array(
'type' => 'success',
'log' => array(__FUNCTION__, $_action, $_item, $_data),
'msg' => 'sogo_theme_modified'
);
return true;
break;
}
break;
case 'delete':
@@ -203,6 +306,7 @@ function customize($_action, $_item, $_data = null) {
case 'main_logo':
try {
if ($redis->del('MAIN_LOGO')) {
$docker_return = docker('post', 'sogo-mailcow', 'exec', array('cmd' => 'sogo', 'task' => 'remove_logo'));
$_SESSION['return'][] = array(
'type' => 'success',
'log' => array(__FUNCTION__, $_action, $_item, $_data),
@@ -219,6 +323,51 @@ function customize($_action, $_item, $_data = null) {
);
return false;
}
break;
case 'favicon':
try {
if ($redis->del('FAVICON')) {
$docker_return = docker('post', 'sogo-mailcow', 'exec', array('cmd' => 'sogo', 'task' => 'remove_favicon'));
$_SESSION['return'][] = array(
'type' => 'success',
'log' => array(__FUNCTION__, $_action, $_item, $_data),
'msg' => 'reset_favicon'
);
return true;
}
}
catch (RedisException $e) {
$_SESSION['return'][] = array(
'type' => 'danger',
'log' => array(__FUNCTION__, $_action, $_item, $_data),
'msg' => array('redis_error', $e)
);
return false;
}
break;
case 'sogo_theme':
try {
$redis->hSet('SOGO_THEME', 'primary', 'sogo-blue');
$redis->hSet('SOGO_THEME', 'accent', 'sogo-green');
$redis->hSet('SOGO_THEME', 'background', 'sogo-grey');
}
catch (RedisException $e) {
$_SESSION['return'][] = array(
'type' => 'danger',
'log' => array(__FUNCTION__, $_action, $_item, $_data),
'msg' => array('redis_error', $e)
);
return false;
}
$docker_return = docker('post', 'sogo-mailcow', 'exec', array('cmd' => 'sogo', 'task' => 'set_theme'));
$docker_return = docker('post', 'sogo-mailcow', 'exec', array('cmd' => 'sogo', 'task' => 'customize_disable'));
$_SESSION['return'][] = array(
'type' => 'success',
'log' => array(__FUNCTION__, $_action, $_item, $_data),
'msg' => 'sogo_theme_removed'
);
return true;
break;
}
break;
@@ -251,6 +400,19 @@ function customize($_action, $_item, $_data = null) {
return false;
}
break;
case 'favicon':
try {
return $redis->get('FAVICON');
}
catch (RedisException $e) {
$_SESSION['return'][] = array(
'type' => 'danger',
'log' => array(__FUNCTION__, $_action, $_item, $_data),
'msg' => array('redis_error', $e)
);
return false;
}
break;
case 'ui_texts':
try {
$data['title_name'] = ($title_name = $redis->get('TITLE_NAME')) ? $title_name : 'mailcow UI';
@@ -295,6 +457,25 @@ function customize($_action, $_item, $_data = null) {
return false;
}
break;
case 'favicon_specs':
try {
$image = new Imagick();
$img_data = explode('base64,', customize('get', 'favicon'));
if ($img_data[1]) {
$image->readImageBlob(base64_decode($img_data[1]));
return $image->identifyImage();
}
return false;
}
catch (ImagickException $e) {
$_SESSION['return'][] = array(
'type' => 'danger',
'log' => array(__FUNCTION__, $_action, $_item, $_data),
'msg' => 'imagick_exception'
);
return false;
}
break;
case 'ip_check':
try {
$ip_check = ($ip_check = $redis->get('IP_CHECK')) ? $ip_check : 0;
@@ -309,6 +490,28 @@ function customize($_action, $_item, $_data = null) {
return false;
}
break;
case 'sogo_theme':
$data = array();
try {
$data['primary'] = $redis->hGet('SOGO_THEME', 'primary');
$data['accent'] = $redis->hGet('SOGO_THEME', 'accent');
$data['background'] = $redis->hGet('SOGO_THEME', 'background');
}
catch (RedisException $e) {
$_SESSION['return'][] = array(
'type' => 'danger',
'log' => array(__FUNCTION__, $_action, $_item, $_data),
'msg' => array('redis_error', $e)
);
return false;
}
$data['primary'] = empty($data['primary']) ? 'sogo-blue' : $data['primary'];
$data['accent'] = empty($data['accent']) ? 'sogo-green' : $data['accent'];
$data['background'] = empty($data['background']) ? 'sogo-grey' : $data['background'];
return $data;
break;
}
break;
}

View File

@@ -40,6 +40,7 @@ $globalVariables = [
'ui_texts' => $UI_TEXTS,
'css_path' => '/cache/'.basename($CSSPath),
'logo' => customize('get', 'main_logo'),
'favicon' => customize('get', 'favicon'),
'available_languages' => $AVAILABLE_LANGUAGES,
'lang' => $lang,
'skip_sogo' => (getenv('SKIP_SOGO') == 'y'),

View File

@@ -125,6 +125,14 @@ if (isset($_SESSION['mailcow_cc_role']) && $_SESSION['mailcow_cc_role'] == "admi
if (isset($_POST["reset_main_logo"])) {
customize('delete', 'main_logo');
}
if (isset($_POST["submit_favicon"])) {
if ($_FILES['favicon']['error'] == 0) {
customize('add', 'favicon', $_FILES);
}
}
if (isset($_POST["reset_favicon"])) {
customize('delete', 'favicon');
}
// Some actions will not be available via API
if (isset($_POST["license_validate_now"])) {
license('verify');

View File

@@ -210,6 +210,30 @@ $FIDO2_USER_PRESENT_FLAG = true;
$FIDO2_FORMATS = array('apple', 'android-key', 'android-safetynet', 'fido-u2f', 'none', 'packed', 'tpm');
$SOGO_PALETTES = array(
'sogo-green',
'sogo-blue',
'sogo-grey',
'red',
'pink',
'purple',
'deep-purple',
'indigo',
'blue',
'light-blue',
'cyan',
'teal',
'green',
'light-green',
'lime',
'yellow',
'amber',
'orange',
'deep-orange',
'brown',
'grey',
'blue-grey'
);
// Set visible Rspamd maps in mailcow UI, do not change unless you know what you are doing
$RSPAMD_MAPS = array(