| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023 | <?phpfunction hash_password($password) {	$salt_str = bin2hex(openssl_random_pseudo_bytes(8));	return "{SSHA256}".base64_encode(hash('sha256', $password . $salt_str, true) . $salt_str);}function hasDomainAccess($username, $role, $domain) {	global $pdo;	if (!filter_var($username, FILTER_VALIDATE_EMAIL) && !ctype_alnum(str_replace(array('_', '.', '-'), '', $username))) {		return false;	}	if (!is_valid_domain_name($domain)) {		return false;	}	if ($role != 'admin' && $role != 'domainadmin' && $role != 'user') {		return false;	}	try {		$stmt = $pdo->prepare("SELECT `domain` FROM `domain_admins`			WHERE (				`active`='1'				AND `username` = :username				AND `domain` = :domain			)			OR 'admin' = :role");		$stmt->execute(array(':username' => $username, ':domain' => $domain, ':role' => $role));		$num_results = count($stmt->fetchAll(PDO::FETCH_ASSOC));	} catch(PDOException $e) {		error_log($e);		return false;	}	if ($num_results != 0 && !empty($num_results)) {		return true;	}	return false;}function init_db_schema() {	global $pdo;	try {		$stmt = $pdo->prepare("SELECT `username` FROM `admin`");		$stmt->execute();	}	catch (Exception $e) {		$lines = file('/web/inc/init.sql');		$data = '';		foreach ($lines as $line) {			if (substr($line, 0, 2) == '--' || $line == '') {				continue;			}			$data .= $line;			if (substr(trim($line), -1, 1) == ';') {				$pdo->query($data);				$data = '';			}		}    // Create index if not exists		$stmt = $pdo->query("SHOW INDEX FROM sogo_acl WHERE KEY_NAME = 'sogo_acl_c_folder_id_idx'");		$num_results = count($stmt->fetchAll(PDO::FETCH_ASSOC));		if ($num_results == 0) {			$pdo->query("CREATE INDEX sogo_acl_c_folder_id_idx ON sogo_acl(c_folder_id)");		}		$stmt = $pdo->query("SHOW INDEX FROM sogo_acl WHERE KEY_NAME = 'sogo_acl_c_uid_idx'");		$num_results = count($stmt->fetchAll(PDO::FETCH_ASSOC));		if ($num_results == 0) {			$pdo->query("CREATE INDEX sogo_acl_c_uid_idx ON sogo_acl(c_uid)");		}		$_SESSION['return'] = array(			'type' => 'success',			'msg' => 'Database initialization completed.'		);	}  // Add newly added columns  $stmt = $pdo->query("SHOW COLUMNS FROM `mailbox` LIKE 'kind'");  $num_results = count($stmt->fetchAll(PDO::FETCH_ASSOC));  if ($num_results == 0) {    $pdo->query("ALTER TABLE `mailbox` ADD `kind` varchar(100) NOT NULL DEFAULT ''");  }  $stmt = $pdo->query("SHOW COLUMNS FROM `mailbox` LIKE 'multiple_bookings'");  $num_results = count($stmt->fetchAll(PDO::FETCH_ASSOC));  if ($num_results == 0) {    $pdo->query("ALTER TABLE `mailbox` ADD `multiple_bookings` tinyint(1) NOT NULL DEFAULT '0'");  }  $stmt = $pdo->query("SHOW COLUMNS FROM `mailbox` LIKE 'wants_tagged_subject'");  $num_results = count($stmt->fetchAll(PDO::FETCH_ASSOC));  if ($num_results == 0) {    $pdo->query("ALTER TABLE `mailbox` ADD `wants_tagged_subject` tinyint(1) NOT NULL DEFAULT '0'");  }  $stmt = $pdo->query("SELECT * FROM information_schema.TABLES WHERE TABLE_NAME = 'imapsync'");  $num_results = count($stmt->fetchAll(PDO::FETCH_ASSOC));  if ($num_results == 0) {    $pdo->query("CREATE TABLE IF NOT EXISTS `imapsync` (      `id` int NOT NULL AUTO_INCREMENT,      `user2` VARCHAR(255) NOT NULL,      `host1` VARCHAR(255) NOT NULL,      `authmech1` ENUM('PLAIN','LOGIN','CRAM-MD5') DEFAULT 'PLAIN',      `user1` VARCHAR(255) NOT NULL,      `exclude` VARCHAR(500) NOT NULL DEFAULT '',      `password1` VARCHAR(255) NOT NULL,      `mins_interval` VARCHAR(50) NOT NULL,      `port1` SMALLINT NOT NULL,      `enc1` ENUM('TLS','SSL','PLAIN') DEFAULT 'TLS',      `delete2duplicates` TINYINT(1) NOT NULL DEFAULT '1',      `returned_text` TEXT,      `last_run` TIMESTAMP NULL DEFAULT NULL,      `created` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,      `modified` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,      `active` TINYINT(1) NOT NULL DEFAULT '0',      PRIMARY KEY (`id`)    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC;");  }}function verify_ssha256($hash, $password) {	// Remove tag if any	$hash = ltrim($hash, '{SSHA256}');	// Decode hash	$dhash = base64_decode($hash);	// Get first 32 bytes of binary which equals a SHA256 hash	$ohash = substr($dhash, 0, 32);	// Remove SHA256 hash from decoded hash to get original salt string	$osalt = str_replace($ohash, '', $dhash);	// Check single salted SHA256 hash against extracted hash	if (hash('sha256', $password . $osalt, true) == $ohash) {		return true;	}	else {		return false;	}}function doveadm_authenticate($hash, $algorithm, $password) {	$descr = array(0 => array('pipe', 'r'), 1 => array('pipe', 'w'), 2 => array('pipe', 'w'));	$pipes = array();	$process = proc_open("/usr/bin/doveadm pw -s ".$algorithm." -t '".$hash."'", $descr, $pipes);	if (is_resource($process)) {		fputs($pipes[0], $password);		fclose($pipes[0]);		while ($f = fgets($pipes[1])) {			if (preg_match('/(verified)/', $f)) {				proc_close($process);				return true;			}			return false;		}		fclose($pipes[1]);		while ($f = fgets($pipes[2])) {			proc_close($process);			return false;		}		fclose($pipes[2]);		proc_close($process);	}	return false;}function check_login($user, $pass) {	global $pdo;	if (!filter_var($user, FILTER_VALIDATE_EMAIL) && !ctype_alnum(str_replace(array('_', '.', '-'), '', $user))) {		return false;	}	$user = strtolower(trim($user));	$stmt = $pdo->prepare("SELECT `password` FROM `admin`			WHERE `superadmin` = '1'			AND `username` = :user");	$stmt->execute(array(':user' => $user));	$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);	foreach ($rows as $row) {		if (verify_ssha256($row['password'], $pass) !== false) {			unset($_SESSION['ldelay']);			return "admin";		}	}	$stmt = $pdo->prepare("SELECT `password` FROM `admin`			WHERE `superadmin` = '0'			AND `active`='1'			AND `username` = :user");	$stmt->execute(array(':user' => $user));	$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);	foreach ($rows as $row) {		if (verify_ssha256($row['password'], $pass) !== false) {			unset($_SESSION['ldelay']);			return "domainadmin";		}	}	$stmt = $pdo->prepare("SELECT `password` FROM `mailbox`			WHERE `active`='1'			AND `username` = :user");	$stmt->execute(array(':user' => $user));	$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);	foreach ($rows as $row) {		if (verify_ssha256($row['password'], $pass) !== false) {			unset($_SESSION['ldelay']);			return "user";		}	}	if (!isset($_SESSION['ldelay'])) {		$_SESSION['ldelay'] = "0";	}	elseif (!isset($_SESSION['mailcow_cc_username'])) {		$_SESSION['ldelay'] = $_SESSION['ldelay']+0.5;	}	sleep($_SESSION['ldelay']);}function formatBytes($size, $precision = 2) {	if(!is_numeric($size)) {		return "0";	}	$base = log($size, 1024);	$suffixes = array(' Byte', ' KiB', ' MiB', ' GiB', ' TiB');	if ($size == "0") {		return "0";	}	return round(pow(1024, $base - floor($base)), $precision) . $suffixes[floor($base)];}function dkim_table($action, $item) {	global $lang;	switch ($action) {		case "delete":			$domain = preg_replace('/[^A-Za-z0-9._\-]/', '_', $item['dkim']['domain']);			if (!is_valid_domain_name($domain)) {				$_SESSION['return'] = array(					'type' => 'danger',					'msg' => sprintf($lang['danger']['dkim_domain_or_sel_invalid'])				);				break;			}			exec('rm ' . escapeshellarg($GLOBALS['MC_DKIM_TXTS'] . '/' . $domain . '.dkim'), $out, $return);			if ($return != "0") {				$_SESSION['return'] = array(					'type' => 'danger',					'msg' => sprintf($lang['danger']['dkim_remove_failed'])				);				break;			}			exec('rm ' . escapeshellarg($GLOBALS['MC_DKIM_KEYS'] . '/' . $domain . '.dkim'), $out, $return);            if ($return != "0") {                $_SESSION['return'] = array(                    'type' => 'danger',                    'msg' => sprintf($lang['danger']['dkim_remove_failed'])                );                break;            }			$_SESSION['return'] = array(				'type' => 'success',				'msg' => sprintf($lang['success']['dkim_removed'])			);			break;		case "add":			$domain = preg_replace('/[^A-Za-z0-9._\-]/', '_', $item['dkim']['domain']);			$key_length	= intval($item['dkim']['key_size']);            if (!is_valid_domain_name($domain) || !is_numeric($key_length)) {                $_SESSION['return'] = array(                    'type' => 'danger',                    'msg' => sprintf($lang['danger']['dkim_domain_or_sel_invalid'])                );                break;            }            if (!empty(glob($GLOBALS['MC_DKIM_TXTS'] . '/' . $domain . '.dkim'))) {                $_SESSION['return'] = array(                    'type' => 'danger',                    'msg' => sprintf($lang['danger']['dkim_domain_or_sel_invalid'])                );                break;            }			$config = array(				"digest_alg" => "sha256",				"private_key_bits" => $key_length,				"private_key_type" => OPENSSL_KEYTYPE_RSA,			);			$keypair_ressource = openssl_pkey_new($config);			$key_details = openssl_pkey_get_details($keypair_ressource);			$pubKey = implode(array_slice(					array_filter(						explode(PHP_EOL, $key_details['key'])					), 1, -1)				);			// Save public key to file			file_put_contents($GLOBALS['MC_DKIM_TXTS'] . '/' . $domain . '.dkim', $pubKey);			// Save private key to file			openssl_pkey_export_to_file($keypair_ressource, $GLOBALS['MC_DKIM_KEYS'] . '/' . $domain . '.dkim');			$_SESSION['return'] = array(				'type' => 'success',				'msg' => sprintf($lang['success']['dkim_added'])			);			break;	}}function mailbox_add_domain($postarray) {	global $pdo;	global $lang;	if ($_SESSION['mailcow_cc_role'] != "admin") {		$_SESSION['return'] = array(			'type' => 'danger',			'msg' => sprintf($lang['danger']['access_denied'])		);		return false;	}	$domain				= idn_to_ascii(strtolower(trim($postarray['domain'])));	$description		= $postarray['description'];	$aliases			= $postarray['aliases'];	$mailboxes			= $postarray['mailboxes'];	$maxquota			= $postarray['maxquota'];	$quota				= $postarray['quota'];	if ($maxquota > $quota) {		$_SESSION['return'] = array(			'type' => 'danger',			'msg' => sprintf($lang['danger']['mailbox_quota_exceeds_domain_quota'])		);		return false;	}	isset($postarray['active'])					? $active = '1' : $active = '0';	isset($postarray['relay_all_recipients'])	? $relay_all_recipients = '1' : $relay_all_recipients = '0';	isset($postarray['backupmx'])				? $backupmx = '1' : $backupmx = '0';	isset($postarray['relay_all_recipients'])	? $backupmx = '1' : true;	if (!is_valid_domain_name($domain)) {		$_SESSION['return'] = array(			'type' => 'danger',			'msg' => sprintf($lang['danger']['domain_invalid'])		);		return false;	}	foreach (array($quota, $maxquota, $mailboxes, $aliases) as $data) {		if (!is_numeric($data)) {			$_SESSION['return'] = array(				'type' => 'danger',				'msg' => sprintf($lang['danger']['object_is_not_numeric'], htmlspecialchars($data))			);			return false;		}	}	try {		$stmt = $pdo->prepare("SELECT `domain` FROM `domain`			WHERE `domain` = :domain");		$stmt->execute(array(':domain' => $domain));		$num_results = count($stmt->fetchAll(PDO::FETCH_ASSOC));		$stmt = $pdo->prepare("SELECT `alias_domain` FROM `alias_domain`			WHERE `alias_domain` = :domain");		$stmt->execute(array(':domain' => $domain));		$num_results = $num_results + count($stmt->fetchAll(PDO::FETCH_ASSOC));	}	catch(PDOException $e) {		$_SESSION['return'] = array(			'type' => 'danger',			'msg' => 'MySQL: '.$e		);		return false;	}	if ($num_results != 0) {		$_SESSION['return'] = array(			'type' => 'danger',			'msg' => sprintf($lang['danger']['domain_exists'], htmlspecialchars($domain))		);		return false;	}	try {		$stmt = $pdo->prepare("INSERT INTO `domain` (`domain`, `description`, `aliases`, `mailboxes`, `maxquota`, `quota`, `transport`, `backupmx`, `created`, `modified`, `active`, `relay_all_recipients`)			VALUES (:domain, :description, :aliases, :mailboxes, :maxquota, :quota, 'virtual', :backupmx, :created, :modified, :active, :relay_all_recipients)");		$stmt->execute(array(			':domain' => $domain,			':description' => $description,			':aliases' => $aliases,			':mailboxes' => $mailboxes,			':maxquota' => $maxquota,			':quota' => $quota,			':backupmx' => $backupmx,			':active' => $active,			':created' => date('Y-m-d H:i:s'),			':modified' => date('Y-m-d H:i:s'),			':relay_all_recipients' => $relay_all_recipients		));		//		// PoC for a restart with supervisord unix socket		// * $sock = stream_socket_client("unix:///var/run/controller/supervisord.sock", $errno, $errstr, 30);		// * fwrite($sock, "GET ?processname=sogo&action=restart HTTP/1.0\r\nAccept: */*\r\n\r\n");		// * fclose($sock);		//		$_SESSION['return'] = array(			'type' => 'success',			'msg' => sprintf($lang['success']['domain_added'], htmlspecialchars($domain))		);	}	catch (PDOException $e) {		$_SESSION['return'] = array(			'type' => 'danger',			'msg' => 'MySQL: '.$e		);		return false;	}}function mailbox_add_alias($postarray) {	global $lang;	global $pdo;	$addresses		= array_map('trim', preg_split( "/( |,|;|\n)/", $postarray['address']));	$gotos			= array_map('trim', preg_split( "/( |,|;|\n)/", $postarray['goto']));	isset($postarray['active']) ? $active = '1' : $active = '0';	if (empty($addresses[0])) {		$_SESSION['return'] = array(			'type' => 'danger',			'msg' => sprintf($lang['danger']['alias_empty'])		);		return false;	}	if (empty($gotos[0])) {		$_SESSION['return'] = array(			'type' => 'danger',			'msg' => sprintf($lang['danger']['goto_empty'])		);		return false;	}	foreach ($addresses as $address) {		if (empty($address)) {			continue;		}		$domain			= idn_to_ascii(substr(strstr($address, '@'), 1));		$local_part		= strstr($address, '@', true);		$address		= $local_part.'@'.$domain;		if ((!filter_var($address, FILTER_VALIDATE_EMAIL) === true) && !empty($local_part)) {			$_SESSION['return'] = array(				'type' => 'danger',				'msg' => sprintf($lang['danger']['alias_invalid'])			);			return false;		}		if (!hasDomainAccess($_SESSION['mailcow_cc_username'], $_SESSION['mailcow_cc_role'], $domain)) {			$_SESSION['return'] = array(				'type' => 'danger',				'msg' => sprintf($lang['danger']['access_denied'])			);			return false;		}		try {			$stmt = $pdo->prepare("SELECT `address` FROM `alias`				WHERE `address`= :address");			$stmt->execute(array(':address' => $address));			$num_results = count($stmt->fetchAll(PDO::FETCH_ASSOC));		}		catch(PDOException $e) {			$_SESSION['return'] = array(				'type' => 'danger',				'msg' => 'MySQL: '.$e			);			return false;		}		if ($num_results != 0) {			$_SESSION['return'] = array(				'type' => 'danger',				'msg' => sprintf($lang['danger']['is_alias_or_mailbox'], htmlspecialchars($address))			);			return false;		}		try {			$stmt = $pdo->prepare("SELECT `address` FROM `spamalias`				WHERE `address`= :address");			$stmt->execute(array(':address' => $address));			$num_results = count($stmt->fetchAll(PDO::FETCH_ASSOC));		}		catch(PDOException $e) {			$_SESSION['return'] = array(				'type' => 'danger',				'msg' => 'MySQL: '.$e			);			return false;		}		if ($num_results != 0) {			$_SESSION['return'] = array(				'type' => 'danger',				'msg' => sprintf($lang['danger']['is_spam_alias'], htmlspecialchars($address))			);			return false;		}		foreach ($gotos as &$goto) {			if (empty($goto)) {				continue;			}			$goto_domain		= idn_to_ascii(substr(strstr($goto, '@'), 1));			$goto_local_part	= strstr($goto, '@', true);			$goto				= $goto_local_part.'@'.$goto_domain;			if (!filter_var($goto, FILTER_VALIDATE_EMAIL) === true) {				$_SESSION['return'] = array(					'type' => 'danger',					'msg' => sprintf($lang['danger']['goto_invalid'])				);				return false;			}			if ($goto == $address) {				$_SESSION['return'] = array(					'type' => 'danger',					'msg' => sprintf($lang['danger']['alias_goto_identical'])				);				return false;			}		}		$gotos = array_filter($gotos);		$goto = implode(",", $gotos);		try {			$stmt = $pdo->prepare("INSERT INTO `alias` (`address`, `goto`, `domain`, `created`, `modified`, `active`)				VALUES (:address, :goto, :domain, :created, :modified, :active)");			if (!filter_var($address, FILTER_VALIDATE_EMAIL) === true) {				$stmt->execute(array(					':address' => '@'.$domain,					':goto' => $goto,					':domain' => $domain,					':created' => date('Y-m-d H:i:s'),					':modified' => date('Y-m-d H:i:s'),					':active' => $active				));			}			else {				$stmt->execute(array(					':address' => $address,					':goto' => $goto,					':domain' => $domain,					':created' => date('Y-m-d H:i:s'),					':modified' => date('Y-m-d H:i:s'),					':active' => $active				));			}			$_SESSION['return'] = array(				'type' => 'success',				'msg' => sprintf($lang['success']['alias_added'])			);		}		catch (PDOException $e) {			$_SESSION['return'] = array(				'type' => 'danger',				'msg' => 'MySQL: '.$e			);			return false;		}	}	$_SESSION['return'] = array(		'type' => 'success',		'msg' => sprintf($lang['success']['alias_added'])	);}function mailbox_add_alias_domain($postarray) {	global $lang;	global $pdo;	isset($postarray['active']) ? $active = '1' : $active = '0';	if (!is_valid_domain_name($postarray['alias_domain'])) {		$_SESSION['return'] = array(			'type' => 'danger',			'msg' => sprintf($lang['danger']['alias_domain_invalid'])		);		return false;	}	if (!is_valid_domain_name($postarray['target_domain'])) {		$_SESSION['return'] = array(			'type' => 'danger',			'msg' => sprintf($lang['danger']['target_domain_invalid'])		);		return false;	}	if (!hasDomainAccess($_SESSION['mailcow_cc_username'], $_SESSION['mailcow_cc_role'], $postarray['target_domain'])) {		$_SESSION['return'] = array(			'type' => 'danger',			'msg' => sprintf($lang['danger']['access_denied'])		);		return false;	}	if ($postarray['alias_domain'] == $postarray['target_domain']) {		$_SESSION['return'] = array(			'type' => 'danger',			'msg' => sprintf($lang['danger']['aliasd_targetd_identical'])		);		return false;	}	$alias_domain	= strtolower(trim($postarray['alias_domain']));	$target_domain	= strtolower(trim($postarray['target_domain']));	try {		$stmt = $pdo->prepare("SELECT `domain` FROM `domain`			WHERE `domain`= :target_domain");		$stmt->execute(array(':target_domain' => $target_domain));		$num_results = count($stmt->fetchAll(PDO::FETCH_ASSOC));	}	catch(PDOException $e) {		$_SESSION['return'] = array(			'type' => 'danger',			'msg' => 'MySQL: '.$e		);		return false;	}	if ($num_results == 0) {		$_SESSION['return'] = array(			'type' => 'danger',			'msg' => sprintf($lang['danger']['targetd_not_found'])		);		return false;	}	try {		$stmt = $pdo->prepare("SELECT `alias_domain` FROM `alias_domain` WHERE `alias_domain`= :alias_domain			UNION			SELECT `alias_domain` FROM `alias_domain` WHERE `alias_domain`= :alias_domain_in_domain");		$stmt->execute(array(':alias_domain' => $alias_domain, ':alias_domain_in_domain' => $alias_domain));		$num_results = count($stmt->fetchAll(PDO::FETCH_ASSOC));	}	catch(PDOException $e) {		$_SESSION['return'] = array(			'type' => 'danger',			'msg' => 'MySQL: '.$e		);		return false;	}	if ($num_results != 0) {		$_SESSION['return'] = array(			'type' => 'danger',			'msg' => sprintf($lang['danger']['aliasd_exists'])		);		return false;	}	try {		$stmt = $pdo->prepare("INSERT INTO `alias_domain` (`alias_domain`, `target_domain`, `created`, `modified`, `active`)			VALUES (:alias_domain, :target_domain, :created, :modified, :active)");		$stmt->execute(array(			':alias_domain' => $alias_domain,			':target_domain' => $target_domain,			':created' => date('Y-m-d H:i:s'),			':modified' => date('Y-m-d H:i:s'),			':active' => $active		));		$_SESSION['return'] = array(			'type' => 'success',			'msg' => sprintf($lang['success']['aliasd_added'], htmlspecialchars($alias_domain))		);	}	catch (PDOException $e) {		$_SESSION['return'] = array(			'type' => 'danger',			'msg' => 'MySQL: '.$e		);		return false;	}}function mailbox_edit_alias_domain($postarray) {	global $lang;	global $pdo;	isset($postarray['active']) ? $active = '1' : $active = '0';	$alias_domain		= idn_to_ascii($postarray['alias_domain']);	$alias_domain		= strtolower(trim($alias_domain));	$alias_domain_now	= strtolower(trim($postarray['alias_domain_now']));	if (!is_valid_domain_name($alias_domain)) {		$_SESSION['return'] = array(			'type' => 'danger',			'msg' => sprintf($lang['danger']['alias_domain_invalid'])		);		return false;	}	if (!is_valid_domain_name($alias_domain_now)) {		$_SESSION['return'] = array(			'type' => 'danger',			'msg' => sprintf($lang['danger']['alias_domain_invalid'])		);		return false;	}	try {		$stmt = $pdo->prepare("SELECT `target_domain` FROM `alias_domain`				WHERE `alias_domain`= :alias_domain_now");		$stmt->execute(array(':alias_domain_now' => $alias_domain_now));		$DomainData = $stmt->fetch(PDO::FETCH_ASSOC);	}	catch(PDOException $e) {		$_SESSION['return'] = array(			'type' => 'danger',			'msg' => 'MySQL: '.$e		);		return false;	}	if (!hasDomainAccess($_SESSION['mailcow_cc_username'], $_SESSION['mailcow_cc_role'], $DomainData['target_domain'])) {		$_SESSION['return'] = array(			'type' => 'danger',			'msg' => sprintf($lang['danger']['access_denied'])		);		return false;	}	try {		$stmt = $pdo->prepare("SELECT `target_domain` FROM `alias_domain`		WHERE `target_domain`= :alias_domain");		$stmt->execute(array(':alias_domain' => $alias_domain));		$num_results = count($stmt->fetchAll(PDO::FETCH_ASSOC));	}	catch(PDOException $e) {		$_SESSION['return'] = array(			'type' => 'danger',			'msg' => 'MySQL: '.$e		);		return false;	}	if ($num_results != 0) {		$_SESSION['return'] = array(			'type' => 'danger',			'msg' => sprintf($lang['danger']['aliasd_targetd_identical'])		);		return false;	}	try {		$stmt = $pdo->prepare("UPDATE `alias_domain` SET `alias_domain` = :alias_domain, `active` = :active WHERE `alias_domain` = :alias_domain_now");		$stmt->execute(array(			':alias_domain' => $alias_domain,			':alias_domain_now' => $alias_domain_now,			':active' => $active		));	}	catch (PDOException $e) {		$_SESSION['return'] = array(			'type' => 'danger',			'msg' => 'MySQL: '.$e		);		return false;	}	$_SESSION['return'] = array(		'type' => 'success',		'msg' => sprintf($lang['success']['aliasd_modified'], htmlspecialchars($alias_domain))	);}function mailbox_add_mailbox($postarray) {	global $pdo;	global $lang;	$username = strtolower(trim($postarray['local_part'])).'@'.strtolower(trim($postarray['domain']));	if (!filter_var($username, FILTER_VALIDATE_EMAIL)) {		$_SESSION['return'] = array(			'type' => 'danger',			'msg' => sprintf($lang['danger']['mailbox_invalid'])		);		return false;	}	if (empty($postarray['local_part'])) {		$_SESSION['return'] = array(			'type' => 'danger',			'msg' => sprintf($lang['danger']['mailbox_invalid'])		);		return false;	}	$domain			= strtolower(trim($postarray['domain']));	$password		= $postarray['password'];	$password2		= $postarray['password2'];	$local_part		= strtolower(trim($postarray['local_part']));	$name			= $postarray['name'];	$quota_m		= $postarray['quota'];	if (empty($name)) {		$name = $local_part;	}	isset($postarray['active']) ? $active = '1' : $active = '0';	$quota_b		= ($quota_m * 1048576);	$maildir		= $domain."/".$local_part."/";	if (!is_valid_domain_name($domain)) {		$_SESSION['return'] = array(			'type' => 'danger',			'msg' => sprintf($lang['danger']['domain_invalid'])		);		return false;	}	try {		$stmt = $pdo->prepare("SELECT `mailboxes`, `maxquota`, `quota` FROM `domain`			WHERE `domain` = :domain");		$stmt->execute(array(':domain' => $domain));		$DomainData = $stmt->fetch(PDO::FETCH_ASSOC);	}	catch(PDOException $e) {		$_SESSION['return'] = array(			'type' => 'danger',			'msg' => 'MySQL: '.$e		);		return false;	}	try {		$stmt = $pdo->prepare("SELECT 			COUNT(*) as count,			COALESCE(ROUND(SUM(`quota`)/1048576), 0) as `quota`				FROM `mailbox`					WHERE `domain` = :domain");		$stmt->execute(array(':domain' => $domain));		$MailboxData = $stmt->fetch(PDO::FETCH_ASSOC);	}	catch(PDOException $e) {		$_SESSION['return'] = array(			'type' => 'danger',			'msg' => 'MySQL: '.$e		);		return false;	}	if (!hasDomainAccess($_SESSION['mailcow_cc_username'], $_SESSION['mailcow_cc_role'], $domain)) {		$_SESSION['return'] = array(			'type' => 'danger',			'msg' => sprintf($lang['danger']['access_denied'])		);		return false;	}	try {		$stmt = $pdo->prepare("SELECT `local_part` FROM `mailbox` WHERE `local_part` = :local_part and `domain`= :domain");		$stmt->execute(array(':local_part' => $local_part, ':domain' => $domain));		$num_results = count($stmt->fetchAll(PDO::FETCH_ASSOC));	}	catch(PDOException $e) {		$_SESSION['return'] = array(			'type' => 'danger',			'msg' => 'MySQL: '.$e		);		return false;	}	if ($num_results != 0) {		$_SESSION['return'] = array(			'type' => 'danger',			'msg' => sprintf($lang['danger']['object_exists'], htmlspecialchars($username))		);		return false;	}	try {		$stmt = $pdo->prepare("SELECT `address` FROM `alias` WHERE address= :username");		$stmt->execute(array(':username' => $username));		$num_results = count($stmt->fetchAll(PDO::FETCH_ASSOC));	}	catch(PDOException $e) {		$_SESSION['return'] = array(			'type' => 'danger',			'msg' => 'MySQL: '.$e		);		return false;	}	if ($num_results != 0) {		$_SESSION['return'] = array(			'type' => 'danger',			'msg' => sprintf($lang['danger']['is_alias'], htmlspecialchars($username))		);		return false;	}	try {		$stmt = $pdo->prepare("SELECT `address` FROM `spamalias` WHERE `address`= :username");		$stmt->execute(array(':username' => $username));		$num_results = count($stmt->fetchAll(PDO::FETCH_ASSOC));	}	catch(PDOException $e) {		$_SESSION['return'] = array(			'type' => 'danger',			'msg' => 'MySQL: '.$e		);		return false;	}	if ($num_results != 0) {		$_SESSION['return'] = array(			'type' => 'danger',			'msg' => sprintf($lang['danger']['is_spam_alias'], htmlspecialchars($username))		);		return false;	}	if (!is_numeric($quota_m) || $quota_m == "0") {		$_SESSION['return'] = array(			'type' => 'danger',			'msg' => sprintf($lang['danger']['quota_not_0_not_numeric'])		);		return false;	}	if (!empty($password) && !empty($password2)) {		if ($password != $password2) {			$_SESSION['return'] = array(				'type' => 'danger',				'msg' => sprintf($lang['danger']['password_mismatch'])			);			return false;		}		$password_hashed = hash_password($password);	}	else {		$_SESSION['return'] = array(			'type' => 'danger',			'msg' => sprintf($lang['danger']['password_empty'])		);		return false;	}	if ($MailboxData['count'] >= $DomainData['mailboxes']) {		$_SESSION['return'] = array(			'type' => 'danger',			'msg' => sprintf($lang['danger']['max_mailbox_exceeded'], $MailboxData['count'], $DomainData['mailboxes'])		);		return false;	}	try {		$stmt = $pdo->prepare("SELECT `domain` FROM `domain` WHERE `domain`= :domain");		$stmt->execute(array(':domain' => $domain));		$num_results = count($stmt->fetchAll(PDO::FETCH_ASSOC));	}	catch(PDOException $e) {		$_SESSION['return'] = array(			'type' => 'danger',			'msg' => 'MySQL: '.$e		);		return false;	}	if ($num_results == 0) {		$_SESSION['return'] = array(			'type' => 'danger',			'msg' => $lang['danger']['domain_not_found']		);		return false;	}	if ($quota_m > $DomainData['maxquota']) {		$_SESSION['return'] = array(			'type' => 'danger',			'msg' => sprintf($lang['danger']['mailbox_quota_exceeded'], $DomainData['maxquota'])		);		return false;	}	if (($MailboxData['quota'] + $quota_m) > $DomainData['quota']) {		$quota_left_m = ($DomainData['quota'] - $MailboxData['quota']);		$_SESSION['return'] = array(			'type' => 'danger',			'msg' => sprintf($lang['danger']['mailbox_quota_left_exceeded'], $quota_left_m)		);		return false;	}	try {		$stmt = $pdo->prepare("INSERT INTO `mailbox` (`username`, `password`, `name`, `maildir`, `quota`, `local_part`, `domain`, `created`, `modified`, `active`) 			VALUES (:username, :password_hashed, :name, :maildir, :quota_b, :local_part, :domain, :created, :modified, :active)");		$stmt->execute(array(			':username' => $username,			':password_hashed' => $password_hashed,			':name' => $name,			':maildir' => $maildir,			':quota_b' => $quota_b,			':local_part' => $local_part,			':domain' => $domain,			':created' => date('Y-m-d H:i:s'),			':modified' => date('Y-m-d H:i:s'),			':active' => $active		));		$stmt = $pdo->prepare("INSERT INTO `quota2` (`username`, `bytes`, `messages`)			VALUES (:username, '0', '0')");		$stmt->execute(array(':username' => $username));		$stmt = $pdo->prepare("INSERT INTO `alias` (`address`, `goto`, `domain`, `created`, `modified`, `active`)			VALUES (:username1, :username2, :domain, :created, :modified, :active)");		$stmt->execute(array(			':username1' => $username,			':username2' => $username,			':domain' => $domain,			':created' => date('Y-m-d H:i:s'),			':modified' => date('Y-m-d H:i:s'),			':active' => $active		));		$_SESSION['return'] = array(			'type' => 'success',			'msg' => sprintf($lang['success']['mailbox_added'], htmlspecialchars($username))		);	}	catch (PDOException $e) {		$_SESSION['return'] = array(			'type' => 'danger',			'msg' => 'MySQL: '.$e		);		return false;	}}function mailbox_edit_alias($postarray) {	global $lang;	global $pdo;	$address	= $postarray['address'];	$domain		= idn_to_ascii(substr(strstr($address, '@'), 1));	$local_part	= strstr($address, '@', true);	if (!hasDomainAccess($_SESSION['mailcow_cc_username'], $_SESSION['mailcow_cc_role'], $domain)) {		$_SESSION['return'] = array(			'type' => 'danger',			'msg' => sprintf($lang['danger']['access_denied'])		);		return false;	}	if (empty($postarray['goto'])) {		$_SESSION['return'] = array(			'type' => 'danger',			'msg' => sprintf($lang['danger']['goto_empty'])		);		return false;	}	$gotos = array_map('trim', preg_split( "/( |,|;|\n)/", $postarray['goto']));	foreach ($gotos as &$goto) {		if (empty($goto)) {			continue;		}		if (!filter_var($goto, FILTER_VALIDATE_EMAIL)) {			$_SESSION['return'] = array(				'type' => 'danger',				'msg' =>sprintf($lang['danger']['goto_invalid'])			);			return false;		}		if ($goto == $address) {			$_SESSION['return'] = array(				'type' => 'danger',				'msg' => sprintf($lang['danger']['alias_goto_identical'])			);			return false;		}	}	$gotos = array_filter($gotos);	$goto = implode(",", $gotos);	isset($postarray['active']) ? $active = '1' : $active = '0';	if ((!filter_var($address, FILTER_VALIDATE_EMAIL) === true) && !empty($local_part)) {		$_SESSION['return'] = array(			'type' => 'danger',			'msg' => sprintf($lang['danger']['alias_invalid'])		);		return false;	}	try {		$stmt = $pdo->prepare("UPDATE `alias` SET `goto` = :goto, `active`= :active WHERE `address` = :address");		$stmt->execute(array(			':goto' => $goto,			':active' => $active,			':address' => $address		));		$_SESSION['return'] = array(			'type' => 'success',		'msg' => sprintf($lang['success']['alias_modified'], htmlspecialchars($address))		);	}	catch (PDOException $e) {		$_SESSION['return'] = array(			'type' => 'danger',			'msg' => 'MySQL: '.$e		);		return false;	}}function mailbox_edit_domain($postarray) {	global $lang;	global $pdo;	$domain			= $postarray['domain'];	$description	= $postarray['description'];	$aliases		= filter_var($postarray['aliases'], FILTER_SANITIZE_NUMBER_FLOAT);	$mailboxes		= filter_var($postarray['mailboxes'], FILTER_SANITIZE_NUMBER_FLOAT);	$maxquota		= filter_var($postarray['maxquota'], FILTER_SANITIZE_NUMBER_FLOAT);	$quota			= filter_var($postarray['quota'], FILTER_SANITIZE_NUMBER_FLOAT);	isset($postarray['relay_all_recipients']) ? $relay_all_recipients = '1' : $relay_all_recipients = '0';	isset($postarray['backupmx']) ? $backupmx = '1' : $backupmx = '0';	isset($postarray['relay_all_recipients']) ? $backupmx = '1' : true;	isset($postarray['active']) ? $active = '1' : $active = '0';	try {		$stmt = $pdo->prepare("SELECT 				COUNT(*) AS count,				MAX(COALESCE(ROUND(`quota`/1048576), 0)) AS `maxquota`,				COALESCE(ROUND(SUM(`quota`)/1048576), 0) AS `quota`					FROM `mailbox`						WHERE domain= :domain");		$stmt->execute(array(':domain' => $domain));		$MailboxData = $stmt->fetch(PDO::FETCH_ASSOC);	}	catch(PDOException $e) {		$_SESSION['return'] = array(			'type' => 'danger',			'msg' => 'MySQL: '.$e		);		return false;	}	try {		$stmt = $pdo->prepare("SELECT COUNT(*) AS `count` FROM `alias`				WHERE domain = :domain				AND address NOT IN (					SELECT `username` FROM `mailbox`				)");		$stmt->execute(array(':domain' => $domain));		$AliasData = $stmt->fetch(PDO::FETCH_ASSOC);	}	catch(PDOException $e) {		$_SESSION['return'] = array(			'type' => 'danger',			'msg' => 'MySQL: '.$e		);		return false;	}	if (!hasDomainAccess($_SESSION['mailcow_cc_username'], $_SESSION['mailcow_cc_role'], $domain)) {		$_SESSION['return'] = array(			'type' => 'danger',			'msg' => sprintf($lang['danger']['access_denied'])		);		return false;	}		if ($maxquota > $quota) {		$_SESSION['return'] = array(			'type' => 'danger',			'msg' => sprintf($lang['danger']['mailbox_quota_exceeds_domain_quota'])		);		return false;	}		if ($MailboxData['maxquota'] > $maxquota) {		$_SESSION['return'] = array(			'type' => 'danger',			'msg' => sprintf($lang['danger']['max_quota_in_use'], $MailboxData['maxquota'])		);		return false;	}		if ($MailboxData['quota'] > $quota) {		$_SESSION['return'] = array(			'type' => 'danger',			'msg' => sprintf($lang['danger']['domain_quota_m_in_use'], $MailboxData['quota'])		);		return false;	}		if ($MailboxData['count'] > $mailboxes) {		$_SESSION['return'] = array(			'type' => 'danger',			'msg' => sprintf($lang['danger']['mailboxes_in_use'], $MailboxData['count'])		);		return false;	}		if ($AliasData['count'] > $aliases) {		$_SESSION['return'] = array(			'type' => 'danger',			'msg' => sprintf($lang['danger']['aliases_in_use'], $AliasData['count'])		);		return false;	}	if (!is_valid_domain_name($domain)) {		$_SESSION['return'] = array(			'type' => 'danger',			'msg' => sprintf($lang['danger']['domain_invalid'])		);		return false;	}	try {		$stmt = $pdo->prepare("UPDATE `domain` SET 		`modified`= :modified,		`relay_all_recipients` = :relay_all_recipients,		`backupmx` = :backupmx,		`active` = :active,		`quota` = :quota,		`maxquota` = :maxquota,		`mailboxes` = :mailboxes,		`aliases` = :aliases,		`description` = :description			WHERE `domain` = :domain");		$stmt->execute(array(			':relay_all_recipients' => $relay_all_recipients,			':backupmx' => $backupmx,			':active' => $active,			':quota' => $quota,			':maxquota' => $maxquota,			':mailboxes' => $mailboxes,			':aliases' => $aliases,			':modified' => date('Y-m-d H:i:s'),			':description' => $description,			':domain' => $domain		));		$_SESSION['return'] = array(			'type' => 'success',			'msg' => sprintf($lang['success']['domain_modified'], htmlspecialchars($domain))		);	}	catch (PDOException $e) {		$_SESSION['return'] = array(			'type' => 'danger',			'msg' => 'MySQL: '.$e		);		return false;	}}function edit_domain_admin($postarray) {	global $lang;	global $pdo;	$username		= $postarray['username'];	$password		= $postarray['password'];	$password2		= $postarray['password2'];	isset($postarray['active']) ? $active = '1' : $active = '0';	if ($_SESSION['mailcow_cc_role'] != "admin") {		$_SESSION['return'] = array(			'type' => 'danger',			'msg' => sprintf($lang['danger']['access_denied'])		);		return false;	}		foreach ($postarray['domain'] as $domain) {		if (!is_valid_domain_name($domain)) {			$_SESSION['return'] = array(				'type' => 'danger',				'msg' => sprintf($lang['danger']['domain_invalid'])			);			return false;		}	}	if (!ctype_alnum(str_replace(array('_', '.', '-'), '', $username))) {		$_SESSION['return'] = array(			'type' => 'danger',			'msg' => sprintf($lang['danger']['username_invalid'])		);		return false;	}	try {		$stmt = $pdo->prepare("DELETE FROM `domain_admins` WHERE `username` = :username");		$stmt->execute(array(			':username' => $username,		));	}	catch (PDOException $e) {		$_SESSION['return'] = array(			'type' => 'danger',			'msg' => 'MySQL: '.$e		);		return false;	}	foreach ($postarray['domain'] as $domain) {		try {			$stmt = $pdo->prepare("INSERT INTO `domain_admins` (`username`, `domain`, `created`, `active`)				VALUES (:username, :domain, :created, :active)");			$stmt->execute(array(				':username' => $username,				':domain' => $domain,				':created' => date('Y-m-d H:i:s'),				':active' => $active			));		}		catch (PDOException $e) {			$_SESSION['return'] = array(				'type' => 'danger',				'msg' => 'MySQL: '.$e			);			return false;		}	}	if (!empty($password) && !empty($password2)) {		if ($password != $password2) {			$_SESSION['return'] = array(				'type' => 'danger',				'msg' => sprintf($lang['danger']['password_mismatch'])			);			return false;		}		$password_hashed = hash_password($password);		try {			$stmt = $pdo->prepare("UPDATE `admin` SET `modified` = :modified, `active` = :active, `password` = :password_hashed WHERE `username` = :username");			$stmt->execute(array(				':password_hashed' => $password_hashed,				':username' => $username,				':modified' => date('Y-m-d H:i:s'),				':active' => $active			));		}		catch (PDOException $e) {			$_SESSION['return'] = array(				'type' => 'danger',				'msg' => 'MySQL: '.$e			);			return false;		}	}	else {		try {			$stmt = $pdo->prepare("UPDATE `admin` SET `modified` = :modified, `active` = :active WHERE `username` = :username");			$stmt->execute(array(				':username' => $username,				':modified' => date('Y-m-d H:i:s'),				':active' => $active			));		}		catch (PDOException $e) {			$_SESSION['return'] = array(				'type' => 'danger',				'msg' => 'MySQL: '.$e			);			return false;		}	}	$_SESSION['return'] = array(		'type' => 'success',		'msg' => sprintf($lang['success']['domain_admin_modified'], htmlspecialchars($username))	);}function mailbox_edit_mailbox($postarray) {	global $lang;	global $pdo;	isset($postarray['active']) ? $active = '1' : $active = '0';	if (!filter_var($postarray['username'], FILTER_VALIDATE_EMAIL)) {		$_SESSION['return'] = array(			'type' => 'danger',			'msg' => sprintf($lang['danger']['username_invalid'])		);		return false;	}	$quota_m		= $postarray['quota'];	$quota_b		= $quota_m*1048576;	$username		= $postarray['username'];	$name			= $postarray['name'];	$password		= $postarray['password'];	$password2		= $postarray['password2'];	try {		$stmt = $pdo->prepare("SELECT `domain`			FROM `mailbox`				WHERE username = :username");		$stmt->execute(array(':username' => $username));		$MailboxData1 = $stmt->fetch(PDO::FETCH_ASSOC);		$stmt = $pdo->prepare("SELECT 			COALESCE(ROUND(SUM(`quota`)/1048576), 0) as `quota_m_now`				FROM `mailbox`					WHERE `username` = :username");		$stmt->execute(array(':username' => $username));		$MailboxData2 = $stmt->fetch(PDO::FETCH_ASSOC);		$stmt = $pdo->prepare("SELECT 			COALESCE(ROUND(SUM(`quota`)/1048576), 0) as `quota_m_in_use`				FROM `mailbox`					WHERE `domain` = :domain");		$stmt->execute(array(':domain' => $MailboxData1['domain']));		$MailboxData3 = $stmt->fetch(PDO::FETCH_ASSOC);		$stmt = $pdo->prepare("SELECT `quota`, `maxquota`			FROM `domain`				WHERE `domain` = :domain");		$stmt->execute(array(':domain' => $MailboxData1['domain']));		$DomainData = $stmt->fetch(PDO::FETCH_ASSOC);	}	catch(PDOException $e) {		$_SESSION['return'] = array(			'type' => 'danger',			'msg' => 'MySQL: '.$e		);		return false;	}	if (!hasDomainAccess($_SESSION['mailcow_cc_username'], $_SESSION['mailcow_cc_role'], $MailboxData1['domain'])) {		$_SESSION['return'] = array(			'type' => 'danger',			'msg' => sprintf($lang['danger']['access_denied'])		);		return false;	}	if (!is_numeric($quota_m) || $quota_m == "0") {		$_SESSION['return'] = array(			'type' => 'danger',			'msg' => sprintf($lang['danger']['quota_not_0_not_numeric'], htmlspecialchars($quota_m))		);		return false;	}	if ($quota_m > $DomainData['maxquota']) {		$_SESSION['return'] = array(			'type' => 'danger',			'msg' => sprintf($lang['danger']['mailbox_quota_exceeded'], $DomainData['maxquota'])		);		return false;	}	if (($MailboxData3['quota_m_in_use'] - $MailboxData2['quota_m_now'] + $quota_m) > $DomainData['quota']) {		$quota_left_m = ($DomainData['quota'] - $MailboxData3['quota_m_in_use'] + $MailboxData2['quota_m_now']);		$_SESSION['return'] = array(			'type' => 'danger',			'msg' => sprintf($lang['danger']['mailbox_quota_left_exceeded'], $quota_left_m)		);		return false;	}	try {		$stmt = $pdo->prepare("DELETE FROM `sender_acl` WHERE `logged_in_as` = :username");		$stmt->execute(array(			':username' => $username		));	}	catch (PDOException $e) {		$_SESSION['return'] = array(			'type' => 'danger',			'msg' => 'MySQL: '.$e		);		return false;	}	if (isset($postarray['sender_acl']) && is_array($postarray['sender_acl'])) {		foreach ($postarray['sender_acl'] as $sender_acl) {			if (!filter_var($sender_acl, FILTER_VALIDATE_EMAIL) && 				!is_valid_domain_name(str_replace('@', '', $sender_acl))) {					$_SESSION['return'] = array(						'type' => 'danger',						'msg' => sprintf($lang['danger']['sender_acl_invalid'])					);					return false;			}		}		foreach ($postarray['sender_acl'] as $sender_acl) {			try {				$stmt = $pdo->prepare("INSERT INTO `sender_acl` (`send_as`, `logged_in_as`)					VALUES (:sender_acl, :username)");				$stmt->execute(array(					':sender_acl' => $sender_acl,					':username' => $username				));			}			catch (PDOException $e) {				$_SESSION['return'] = array(					'type' => 'danger',					'msg' => 'MySQL: '.$e				);				return false;			}		}	}	if (!empty($password) && !empty($password2)) {		if ($password != $password2) {			$_SESSION['return'] = array(				'type' => 'danger',				'msg' => sprintf($lang['danger']['password_mismatch'])			);			return false;		}		$password_hashed = hash_password($password);		try {			$stmt = $pdo->prepare("UPDATE `alias` SET					`modified` = :modified,					`active` = :active						WHERE `address` = :address");			$stmt->execute(array(				':address' => $username,				':modified' => date('Y-m-d H:i:s'),				':active' => $active			));			$stmt = $pdo->prepare("UPDATE `mailbox` SET					`modified` = :modified,					`active` = :active,					`password` = :password_hashed,					`name`= :name,					`quota` = :quota_b						WHERE `username` = :username");			$stmt->execute(array(				':modified' => date('Y-m-d H:i:s'),				':password_hashed' => $password_hashed,				':active' => $active,				':name' => $name,				':quota_b' => $quota_b,				':username' => $username			));			$_SESSION['return'] = array(				'type' => 'success',				'msg' => sprintf($lang['success']['mailbox_modified'], $username)			);			return true;		}		catch (PDOException $e) {			$_SESSION['return'] = array(				'type' => 'danger',				'msg' => 'MySQL: '.$e			);			return false;		}	}	try {		$stmt = $pdo->prepare("UPDATE `alias` SET				`modified` = :modified,				`active` = :active					WHERE `address` = :address");		$stmt->execute(array(			':address' => $username,			':modified' => date('Y-m-d H:i:s'),			':active' => $active		));		$stmt = $pdo->prepare("UPDATE `mailbox` SET				`modified` = :modified,				`active` = :active,				`name`= :name,				`quota` = :quota_b					WHERE `username` = :username");		$stmt->execute(array(			':active' => $active,			':modified' => date('Y-m-d H:i:s'),			':name' => $name,			':quota_b' => $quota_b,			':username' => $username		));		$_SESSION['return'] = array(			'type' => 'success',			'msg' => sprintf($lang['success']['mailbox_modified'], $username)		);		return true;	}	catch (PDOException $e) {		$_SESSION['return'] = array(			'type' => 'danger',			'msg' => 'MySQL: '.$e		);		return false;	}}function mailbox_delete_domain($postarray) {	global $lang;	global $pdo;	$domain = $postarray['domain'];	if ($_SESSION['mailcow_cc_role'] != "admin") {		$_SESSION['return'] = array(			'type' => 'danger',			'msg' => sprintf($lang['danger']['access_denied'])		);		return false;	}	if (!is_valid_domain_name($domain)) {		$_SESSION['return'] = array(			'type' => 'danger',			'msg' => sprintf($lang['danger']['domain_invalid'])		);		return false;	}	$domain	= strtolower(trim($domain));	try {		$stmt = $pdo->prepare("SELECT `username` FROM `mailbox`			WHERE `domain` = :domain");		$stmt->execute(array(':domain' => $domain));		$num_results = count($stmt->fetchAll(PDO::FETCH_ASSOC));	}	catch(PDOException $e) {		$_SESSION['return'] = array(			'type' => 'danger',			'msg' => 'MySQL: '.$e		);		return false;	}	if ($num_results != 0 || !empty($num_results)) {		$_SESSION['return'] = array(			'type' => 'danger',			'msg' => sprintf($lang['danger']['domain_not_empty'])		);		return false;	}	try {		$stmt = $pdo->prepare("DELETE FROM `domain` WHERE `domain` = :domain");		$stmt->execute(array(			':domain' => $domain,		));		$stmt = $pdo->prepare("DELETE FROM `domain_admins` WHERE `domain` = :domain");		$stmt->execute(array(			':domain' => $domain,		));		$stmt = $pdo->prepare("DELETE FROM `alias` WHERE `domain` = :domain");		$stmt->execute(array(			':domain' => $domain,		));		$stmt = $pdo->prepare("DELETE FROM `alias_domain` WHERE `target_domain` = :domain");		$stmt->execute(array(			':domain' => $domain,		));		$stmt = $pdo->prepare("DELETE FROM `mailbox` WHERE `domain` = :domain");		$stmt->execute(array(			':domain' => $domain,		));		$stmt = $pdo->prepare("DELETE FROM `sender_acl` WHERE `logged_in_as` LIKE :domain");		$stmt->execute(array(			':domain' => '%@'.$domain,		));		$stmt = $pdo->prepare("DELETE FROM `quota2` WHERE `username` = :domain");		$stmt->execute(array(			':domain' => '%@'.$domain,		));		$stmt = $pdo->prepare("DELETE FROM `spamalias` WHERE `address` = :domain");		$stmt->execute(array(			':domain' => '%@'.$domain,		));		$stmt = $pdo->prepare("DELETE FROM `filterconf` WHERE `object` = :domain");		$stmt->execute(array(			':domain' => '%@'.$domain,		));	}	catch (PDOException $e) {		$_SESSION['return'] = array(			'type' => 'danger',			'msg' => 'MySQL: '.$e		);		return false;	}	$_SESSION['return'] = array(		'type' => 'success',		'msg' => sprintf($lang['success']['domain_removed'], htmlspecialchars($domain))	);	return true;}function mailbox_delete_alias($postarray) {	global $lang;	global $pdo;	$address		= $postarray['address'];	$local_part		= strstr($address, '@', true);	$domain			= substr(strrchr($address, "@"), 1);	try {		$stmt = $pdo->prepare("SELECT `goto` FROM `alias` WHERE `address` = :address");		$stmt->execute(array(':address' => $address));		$gotos = $stmt->fetch(PDO::FETCH_ASSOC);	}	catch(PDOException $e) {		$_SESSION['return'] = array(			'type' => 'danger',			'msg' => 'MySQL: '.$e		);		return false;	}	$goto_array = explode(',', $gotos['goto']);	if (!hasDomainAccess($_SESSION['mailcow_cc_username'], $_SESSION['mailcow_cc_role'], $domain)) {		$_SESSION['return'] = array(			'type' => 'danger',			'msg' => sprintf($lang['danger']['access_denied'])		);		return false;	}	try {		$stmt = $pdo->prepare("DELETE FROM `alias` WHERE `address` = :address AND `address` NOT IN (SELECT `username` FROM `mailbox`)");		$stmt->execute(array(			':address' => $address		));	}	catch (PDOException $e) {		$_SESSION['return'] = array(			'type' => 'danger',			'msg' => 'MySQL: '.$e		);		return false;	}	$_SESSION['return'] = array(		'type' => 'success',		'msg' => sprintf($lang['success']['alias_removed'], htmlspecialchars($address))	);}function mailbox_delete_alias_domain($postarray) {	global $lang;	global $pdo;	if (!is_valid_domain_name($postarray['alias_domain'])) {		$_SESSION['return'] = array(			'type' => 'danger',			'msg' => sprintf($lang['danger']['domain_invalid'])		);		return false;	}	$alias_domain = $postarray['alias_domain'];	try {		$stmt = $pdo->prepare("SELECT `target_domain` FROM `alias_domain`				WHERE `alias_domain`= :alias_domain");		$stmt->execute(array(':alias_domain' => $alias_domain));		$DomainData = $stmt->fetch(PDO::FETCH_ASSOC);	}	catch(PDOException $e) {		$_SESSION['return'] = array(			'type' => 'danger',			'msg' => 'MySQL: '.$e		);		return false;	}	if (!hasDomainAccess($_SESSION['mailcow_cc_username'], $_SESSION['mailcow_cc_role'], $DomainData['target_domain'])) {		$_SESSION['return'] = array(			'type' => 'danger',			'msg' => sprintf($lang['danger']['access_denied'])		);		return false;	}	try {		$stmt = $pdo->prepare("DELETE FROM `alias_domain` WHERE `alias_domain` = :alias_domain");		$stmt->execute(array(			':alias_domain' => $alias_domain,		));	}	catch (PDOException $e) {		$_SESSION['return'] = array(			'type' => 'danger',			'msg' => 'MySQL: '.$e		);		return false;	}	$_SESSION['return'] = array(		'type' => 'success',		'msg' => sprintf($lang['success']['alias_domain_removed'], htmlspecialchars($alias_domain))	);}function mailbox_delete_mailbox($postarray) {	global $lang;	global $pdo;	$domain		= substr(strrchr($postarray['username'], "@"), 1);	$username	= $postarray['username'];	if (!filter_var($postarray['username'], FILTER_VALIDATE_EMAIL)) {		$_SESSION['return'] = array(			'type' => 'danger',			'msg' => sprintf($lang['danger']['access_denied'])		);		return false;	}	if (!hasDomainAccess($_SESSION['mailcow_cc_username'], $_SESSION['mailcow_cc_role'], $domain)) {		$_SESSION['return'] = array(			'type' => 'danger',			'msg' => sprintf($lang['danger']['access_denied'])		);		return false;	}	try {		$stmt = $pdo->prepare("DELETE FROM `alias` WHERE `goto` = :username");		$stmt->execute(array(			':username' => $username		));		$stmt = $pdo->prepare("DELETE FROM `quota2` WHERE `username` = :username");		$stmt->execute(array(			':username' => $username		));		$stmt = $pdo->prepare("DELETE FROM `mailbox` WHERE `username` = :username");		$stmt->execute(array(			':username' => $username		));		$stmt = $pdo->prepare("DELETE FROM `sender_acl` WHERE `logged_in_as` = :username");		$stmt->execute(array(			':username' => $username		));		$stmt = $pdo->prepare("DELETE FROM `spamalias` WHERE `goto` = :username");		$stmt->execute(array(			':username' => $username		));		$stmt = $pdo->prepare("DELETE FROM `filterconf` WHERE `object` = :username");		$stmt->execute(array(			':username' => $username		));		$stmt = $pdo->prepare("SELECT `address`, `goto` FROM `alias`				WHERE `goto` LIKE :username");		$stmt->execute(array(':username' => '%'.$username.'%'));		$GotoData = $stmt->fetchAll(PDO::FETCH_ASSOC);		foreach ($GotoData as $gotos) {			$goto_exploded = explode(',', $gotos['goto']);			if (($key = array_search($username, $goto_exploded)) !== false) {				unset($goto_exploded[$key]);			}			$gotos_rebuild = implode(',', $goto_exploded);			$stmt = $pdo->prepare("UPDATE `alias` SET `goto` = :goto WHERE `address` = :address");			$stmt->execute(array(				':goto' => $gotos_rebuild,				':address' => $gotos['address']			));		}	}	catch (PDOException $e) {		$_SESSION['return'] = array(			'type' => 'danger',			'msg' => 'MySQL: '.$e		);		return false;	}	$_SESSION['return'] = array(		'type' => 'success',		'msg' => sprintf($lang['success']['mailbox_removed'], htmlspecialchars($username))	);}function set_admin_account($postarray) {	global $lang;	global $pdo;	if ($_SESSION['mailcow_cc_role'] != "admin") {		$_SESSION['return'] = array(			'type' => 'danger',			'msg' => sprintf($lang['danger']['access_denied'])		);		return false;	}	$name		= $postarray['admin_user'];	$name_now	= $postarray['admin_user_now'];	if (!ctype_alnum(str_replace(array('_', '.', '-'), '', $name)) || empty ($name)) {		$_SESSION['return'] = array(			'type' => 'danger',			'msg' => sprintf($lang['danger']['username_invalid'])		);		return false;	}	if (!ctype_alnum(str_replace(array('_', '.', '-'), '', $name_now)) || empty ($name_now)) {		$_SESSION['return'] = array(			'type' => 'danger',			'msg' => sprintf($lang['danger']['username_invalid'])		);		return false;	}	if (!empty($postarray['admin_pass']) && !empty($postarray['admin_pass2'])) {		if ($postarray['admin_pass'] != $postarray['admin_pass2']) {			$_SESSION['return'] = array(				'type' => 'danger',				'msg' => sprintf($lang['danger']['password_mismatch'])			);			return false;		}		$password_hashed = hash_password($postarray['admin_pass']);		try {			$stmt = $pdo->prepare("UPDATE `admin` SET 				`modified` = :modified,				`password` = :password_hashed,				`username` = :name					WHERE `username` = :username");			$stmt->execute(array(				':password_hashed' => $password_hashed,				':modified' => date('Y-m-d H:i:s'),				':name' => $name,				':username' => $name_now			));		}		catch (PDOException $e) {			$_SESSION['return'] = array(				'type' => 'danger',				'msg' => 'MySQL: '.$e			);			return false;		}	}	else {		try {			$stmt = $pdo->prepare("UPDATE `admin` SET 				`modified` = :modified,				`username` = :name					WHERE `username` = :name_now");			$stmt->execute(array(				':name' => $name,				':modified' => date('Y-m-d H:i:s'),				':name_now' => $name_now			));		}		catch (PDOException $e) {			$_SESSION['return'] = array(				'type' => 'danger',				'msg' => 'MySQL: '.$e			);			return false;		}	}	try {		$stmt = $pdo->prepare("UPDATE `domain_admins` SET 			`domain` = :domain,			`username` = :name				WHERE `username` = :name_now");		$stmt->execute(array(			':domain' => 'ALL',			':name' => $name,			':name_now' => $name_now		));	}	catch (PDOException $e) {		$_SESSION['return'] = array(			'type' => 'danger',			'msg' => 'MySQL: '.$e		);		return false;	}	$_SESSION['return'] = array(		'type' => 'success',		'msg' => sprintf($lang['success']['admin_modified'])	);}function set_time_limited_aliases($postarray) {	global $lang;	global $pdo;	$username	= $_SESSION['mailcow_cc_username'];	$domain		= substr($username, strpos($username, '@'));	if (($_SESSION['mailcow_cc_role'] != "user" &&		$_SESSION['mailcow_cc_role'] != "domainadmin") || 			empty($username) ||			empty($domain)) {				$_SESSION['return'] = array(					'type' => 'danger',					'msg' => sprintf($lang['danger']['access_denied'])				);				return false;	}	switch ($postarray["trigger_set_time_limited_aliases"]) {		case "generate":			if (!is_numeric($postarray["validity"]) || $postarray["validity"] > 672) {				$_SESSION['return'] = array(					'type' => 'danger',					'msg' => sprintf($lang['danger']['validity_missing'])				);				return false;			}			$validity = strtotime("+".$postarray["validity"]." hour"); 			$letters = 'abcefghijklmnopqrstuvwxyz1234567890';			$random_name = substr(str_shuffle($letters), 0, 24);			try {				$stmt = $pdo->prepare("INSERT INTO `spamalias` (`address`, `goto`, `validity`) VALUES					(:address, :goto, :validity)");				$stmt->execute(array(					':address' => $random_name.$domain,					':goto' => $username,					':validity' => $validity				));			}			catch (PDOException $e) {				$_SESSION['return'] = array(					'type' => 'danger',					'msg' => 'MySQL: '.$e				);				return false;			}			$_SESSION['return'] = array(				'type' => 'success',				'msg' => sprintf($lang['success']['mailbox_modified'], htmlspecialchars($username))			);		break;		case "delete":			try {				$stmt = $pdo->prepare("DELETE FROM `spamalias` WHERE `goto` = :username");				$stmt->execute(array(					':username' => $username				));			}			catch (PDOException $e) {				$_SESSION['return'] = array(					'type' => 'danger',					'msg' => 'MySQL: '.$e				);				return false;			}				$_SESSION['return'] = array(				'type' => 'success',				'msg' => sprintf($lang['success']['mailbox_modified'], htmlspecialchars($username))			);		break;		case "extend":			try {				$stmt = $pdo->prepare("UPDATE `spamalias` SET `validity` = (`validity` + 3600)					WHERE `goto` = :username 						AND `validity` >= :validity");				$stmt->execute(array(					':username' => $username,					':validity' => time(),				));			}			catch (PDOException $e) {				$_SESSION['return'] = array(					'type' => 'danger',					'msg' => 'MySQL: '.$e				);				return false;			}			$_SESSION['return'] = array(				'type' => 'success',				'msg' => sprintf($lang['success']['mailbox_modified'], htmlspecialchars($username))			);		break;	}}function set_user_account($postarray) {	global $lang;	global $pdo;	$username			= $_SESSION['mailcow_cc_username'];	$password_old		= $postarray['user_old_pass'];	isset($postarray['togglePwNew']) ? $pwnew_active = '1' : $pwnew_active = '0';	if (isset($pwnew_active) && $pwnew_active == "1") {		$password_new	= $postarray['user_new_pass'];		$password_new2	= $postarray['user_new_pass2'];	}	if (!check_login($username, $password_old) == "user") {		$_SESSION['return'] = array(			'type' => 'danger',			'msg' => sprintf($lang['danger']['access_denied'])		);		return false;	}	if ($_SESSION['mailcow_cc_role'] != "user" &&		$_SESSION['mailcow_cc_role'] != "domainadmin") {			$_SESSION['return'] = array(				'type' => 'danger',				'msg' => sprintf($lang['danger']['access_denied'])			);			return false;	}	if (isset($password_new) && isset($password_new2)) {		if (!empty($password_new2) && !empty($password_new)) {			if ($password_new2 != $password_new) {				$_SESSION['return'] = array(					'type' => 'danger',					'msg' => sprintf($lang['danger']['password_mismatch'])				);				return false;			}			if (strlen($password_new) < "6" ||				!preg_match('/[A-Za-z]/', $password_new) ||				!preg_match('/[0-9]/', $password_new)) {					$_SESSION['return'] = array(						'type' => 'danger',						'msg' => sprintf($lang['danger']['password_complexity'])					);					return false;			}			$password_hashed = hash_password($password_new);			try {				$stmt = $pdo->prepare("UPDATE `mailbox` SET `modified` = :modified, `password` = :password_hashed WHERE `username` = :username");				$stmt->execute(array(					':password_hashed' => $password_hashed,					':modified' => date('Y-m-d H:i:s'),					':username' => $username				));			}			catch (PDOException $e) {				$_SESSION['return'] = array(					'type' => 'danger',					'msg' => 'MySQL: '.$e				);				return false;			}		}	}	$_SESSION['return'] = array(		'type' => 'success',		'msg' => sprintf($lang['success']['mailbox_modified'], $username)	);}function add_domain_admin($postarray) {	global $lang;	global $pdo;	$username		= strtolower(trim($postarray['username']));	$password		= $postarray['password'];	$password2		= $postarray['password2'];	isset($postarray['active']) ? $active = '1' : $active = '0';	if ($_SESSION['mailcow_cc_role'] != "admin") {		$_SESSION['return'] = array(			'type' => 'danger',			'msg' => sprintf($lang['danger']['access_denied'])		);		return false;	}	if (empty($postarray['domain'])) {		$_SESSION['return'] = array(			'type' => 'danger',			'msg' => sprintf($lang['danger']['domain_invalid'])		);		return false;	}	if (!ctype_alnum(str_replace(array('_', '.', '-'), '', $username)) || empty ($username)) {		$_SESSION['return'] = array(			'type' => 'danger',			'msg' => sprintf($lang['danger']['username_invalid'])		);		return false;	}	try {		$stmt = $pdo->prepare("SELECT `username` FROM `mailbox`			WHERE `username` = :username");		$stmt->execute(array(':username' => $username));		$num_results[] = count($stmt->fetchAll(PDO::FETCH_ASSOC));				$stmt = $pdo->prepare("SELECT `username` FROM `admin`			WHERE `username` = :username");		$stmt->execute(array(':username' => $username));		$num_results[] = count($stmt->fetchAll(PDO::FETCH_ASSOC));				$stmt = $pdo->prepare("SELECT `username` FROM `domain_admins`			WHERE `username` = :username");		$stmt->execute(array(':username' => $username));		$num_results[] = count($stmt->fetchAll(PDO::FETCH_ASSOC));	}	catch(PDOException $e) {		$_SESSION['return'] = array(			'type' => 'danger',			'msg' => 'MySQL: '.$e		);		return false;	}	foreach ($num_results as $num_results_each) {		if ($num_results_each != 0) {			$_SESSION['return'] = array(				'type' => 'danger',				'msg' => sprintf($lang['danger']['object_exists'], htmlspecialchars($username))			);			return false;		}	}	if (!empty($password) && !empty($password2)) {		if ($password != $password2) {			$_SESSION['return'] = array(				'type' => 'danger',				'msg' => sprintf($lang['danger']['password_mismatch'])			);			return false;		}		$password_hashed = hash_password($password);		foreach ($postarray['domain'] as $domain) {			if (!is_valid_domain_name($domain)) {				$_SESSION['return'] = array(					'type' => 'danger',					'msg' => sprintf($lang['danger']['domain_invalid'])				);				return false;			}			try {				$stmt = $pdo->prepare("INSERT INTO `domain_admins` (`username`, `domain`, `created`, `active`)						VALUES (:username, :domain, :created, :active)");				$stmt->execute(array(					':username' => $username,					':domain' => $domain,					':created' => date('Y-m-d H:i:s'),					':active' => $active				));			}			catch (PDOException $e) {				$_SESSION['return'] = array(					'type' => 'danger',					'msg' => 'MySQL: '.$e				);				return false;			}		}		try {			$stmt = $pdo->prepare("INSERT INTO `admin` (`username`, `password`, `superadmin`, `created`, `modified`, `active`)				VALUES (:username, :password_hashed, '0', :created, :modified, :active)");			$stmt->execute(array(				':username' => $username,				':password_hashed' => $password_hashed,				':created' => date('Y-m-d H:i:s'),				':modified' => date('Y-m-d H:i:s'),				':active' => $active			));		}		catch (PDOException $e) {			$_SESSION['return'] = array(				'type' => 'danger',				'msg' => 'MySQL: '.$e			);			return false;		}	}	else {		$_SESSION['return'] = array(			'type' => 'danger',			'msg' => sprintf($lang['danger']['password_empty'])		);		return false;	}	$_SESSION['return'] = array(		'type' => 'success',		'msg' => sprintf($lang['success']['domain_admin_added'], htmlspecialchars($username))	);}function delete_domain_admin($postarray) {	global $pdo;	global $lang;	if ($_SESSION['mailcow_cc_role'] != "admin") {		$_SESSION['return'] = array(			'type' => 'danger',			'msg' => sprintf($lang['danger']['access_denied'])		);		return false;	}	$username = $postarray['username'];	if (!ctype_alnum(str_replace(array('_', '.', '-'), '', $username))) {		$_SESSION['return'] = array(			'type' => 'danger',			'msg' => sprintf($lang['danger']['username_invalid'])		);		return false;	}	try {		$stmt = $pdo->prepare("DELETE FROM `domain_admins` WHERE `username` = :username");		$stmt->execute(array(			':username' => $username,		));		$stmt = $pdo->prepare("DELETE FROM `admin` WHERE `username` = :username");		$stmt->execute(array(			':username' => $username,		));	}	catch (PDOException $e) {		$_SESSION['return'] = array(			'type' => 'danger',			'msg' => 'MySQL: '.$e		);		return false;	}	$_SESSION['return'] = array(		'type' => 'success',		'msg' => sprintf($lang['success']['domain_admin_removed'], htmlspecialchars($username))	);}function get_spam_score($username) {	global $pdo;	$default = "5, 15";	if ($_SESSION['mailcow_cc_role'] != "user") {		return false;	}	if (!filter_var($username, FILTER_VALIDATE_EMAIL)) {		return $default;	}	try {		$stmt = $pdo->prepare("SELECT `value` FROM `filterconf` WHERE `object` = :username AND			(`option` = 'lowspamlevel' OR `option` = 'highspamlevel')");		$stmt->execute(array(':username' => $username));		$num_results = count($stmt->fetchAll(PDO::FETCH_ASSOC));	}	catch(PDOException $e) {		$_SESSION['return'] = array(			'type' => 'danger',			'msg' => 'MySQL: '.$e		);		return false;	}	if ($num_results == 0 || empty ($num_results)) {		return $default;	}	else {		try {			$stmt = $pdo->prepare("SELECT `value` FROM `filterconf` WHERE `option` = 'highspamlevel' AND `object` = :username");			$stmt->execute(array(':username' => $username));			$highspamlevel = $stmt->fetch(PDO::FETCH_ASSOC);			$stmt = $pdo->prepare("SELECT `value` FROM `filterconf` WHERE `option` = 'lowspamlevel' AND `object` = :username");			$stmt->execute(array(':username' => $username));			$lowspamlevel = $stmt->fetch(PDO::FETCH_ASSOC);			return $lowspamlevel['value'].', '.$highspamlevel['value'];		}		catch(PDOException $e) {			$_SESSION['return'] = array(				'type' => 'danger',				'msg' => 'MySQL: '.$e			);			return false;		}	}}function set_spam_score($postarray) {	global $lang;	global $pdo;	if ($_SESSION['mailcow_cc_role'] != "user") {		$_SESSION['return'] = array(			'type' => 'danger',			'msg' => sprintf($lang['danger']['access_denied'])		);		return false;	}	$username		= $_SESSION['mailcow_cc_username'];	$lowspamlevel	= explode(',', $postarray['score'])[0];	$highspamlevel	= explode(',', $postarray['score'])[1];	if (!filter_var($username, FILTER_VALIDATE_EMAIL)) {		$_SESSION['return'] = array(			'type' => 'danger',			'msg' => sprintf($lang['danger']['username_invalid'])		);		return false;	}	if (!is_numeric($lowspamlevel) || !is_numeric($highspamlevel)) {		$_SESSION['return'] = array(			'type' => 'danger',			'msg' => sprintf($lang['danger']['access_denied'])		);		return false;	}	try {		$stmt = $pdo->prepare("DELETE FROM `filterconf` WHERE `object` = :username			AND (`option` = 'lowspamlevel' OR `option` = 'highspamlevel')");		$stmt->execute(array(			':username' => $username		));		$stmt = $pdo->prepare("INSERT INTO `filterconf` (`object`, `option`, `value`)			VALUES (:username, 'highspamlevel', :highspamlevel)");		$stmt->execute(array(			':username' => $username,			':highspamlevel' => $highspamlevel		));		$stmt = $pdo->prepare("INSERT INTO `filterconf` (`object`, `option`, `value`)			VALUES (:username, 'lowspamlevel', :lowspamlevel)");		$stmt->execute(array(			':username' => $username,			':lowspamlevel' => $lowspamlevel		));	}	catch (PDOException $e) {		$_SESSION['return'] = array(			'type' => 'danger',			'msg' => 'MySQL: '.$e		);		return false;	}	$_SESSION['return'] = array(		'type' => 'success',		'msg' => sprintf($lang['success']['mailbox_modified'], $username)	);}function set_policy_list($postarray) {	global $lang;	global $pdo;	if ($_SESSION['mailcow_cc_role'] != "admin" &&		$_SESSION['mailcow_cc_role'] != "domainadmin" &&		$_SESSION['mailcow_cc_role'] != "user") {		$_SESSION['return'] = array(			'type' => 'danger',			'msg' => sprintf($lang['danger']['access_denied'])		);		return false;	}	(isset($postarray['domain'])) ? $object = $postarray['domain'] : $object = $_SESSION['mailcow_cc_username'];	($postarray['object_list'] == "bl") ? $object_list = "blacklist_from" : $object_list = "whitelist_from";	$object_from = preg_replace('/\.+/', '.', rtrim(preg_replace("/\.\*/", "*", trim(strtolower($postarray['object_from']))), '.'));	if (!filter_var($object, FILTER_VALIDATE_EMAIL) && !is_valid_domain_name($object)) {		$_SESSION['return'] = array(			'type' => 'danger',			'msg' => sprintf($lang['danger']['username_invalid'])		);		return false;	}	if (is_valid_domain_name($object)) {		if (!hasDomainAccess($_SESSION['mailcow_cc_username'], $_SESSION['mailcow_cc_role'], $object)) {			$_SESSION['return'] = array(				'type' => 'danger',				'msg' => sprintf($lang['danger']['access_denied'])			);			return false;		}	}	if (isset($postarray['prefid'])) {		if (!is_numeric($postarray['prefid'])) {			$_SESSION['return'] = array(				'type' => 'danger',				'msg' => sprintf($lang['danger']['access_denied'])			);			return false;		}		try {			$stmt = $pdo->prepare("DELETE FROM `filterconf` WHERE `object` = :object AND `prefid` = :prefid");			$stmt->execute(array(				':object' => $object,				':prefid' => $postarray['prefid']			));		}		catch (PDOException $e) {			$_SESSION['return'] = array(				'type' => 'danger',				'msg' => 'MySQL: '.$e			);			return false;		}		$_SESSION['return'] = array(			'type' => 'success',			'msg' => sprintf($lang['success']['mailbox_modified'], $object)		);		return true;	}	if (!ctype_alnum(str_replace(array('@', '.', '-', '*'), '', $object_from))) {		$_SESSION['return'] = array(			'type' => 'danger',			'msg' => sprintf($lang['danger']['policy_list_from_invalid'])		);		return false;	}	try {		$stmt = $pdo->prepare("SELECT `object` FROM `filterconf`			WHERE (`option` = 'whitelist_from'  OR `option` = 'blacklist_from')				AND `object` = :object				AND `value` = :object_from");		$stmt->execute(array(':object' => $object, ':object_from' => $object_from));		$num_results = count($stmt->fetchAll(PDO::FETCH_ASSOC));	}	catch(PDOException $e) {		$_SESSION['return'] = array(			'type' => 'danger',			'msg' => 'MySQL: '.$e		);		return false;	}	if ($num_results != 0) {		$_SESSION['return'] = array(			'type' => 'danger',			'msg' => sprintf($lang['danger']['policy_list_from_exists'])		);		return false;	}	try {		$stmt = $pdo->prepare("INSERT INTO `filterconf` (`object`, `option` ,`value`)			VALUES (:object, :object_list, :object_from)");		$stmt->execute(array(			':object' => $object,			':object_list' => $object_list,			':object_from' => $object_from		));	}	catch (PDOException $e) {		$_SESSION['return'] = array(			'type' => 'danger',			'msg' => 'MySQL: '.$e		);		return false;	}	$_SESSION['return'] = array(		'type' => 'success',		'msg' => sprintf($lang['success']['mailbox_modified'], $object)	);}function set_tls_policy($postarray) {	global $lang;	global $pdo;	if ($_SESSION['mailcow_cc_role'] != "user") {		$_SESSION['return'] = array(			'type' => 'danger',			'msg' => sprintf($lang['danger']['access_denied'])		);		return false;	}	isset($postarray['tls_in']) ? $tls_in = '1' : $tls_in = '0';	isset($postarray['tls_out']) ? $tls_out = '1' : $tls_out = '0';	$username = $_SESSION['mailcow_cc_username'];	if (!filter_var($username, FILTER_VALIDATE_EMAIL)) {		$_SESSION['return'] = array(			'type' => 'danger',			'msg' => sprintf($lang['danger']['username_invalid'])		);		return false;	}	try {		$stmt = $pdo->prepare("UPDATE `mailbox` SET `tls_enforce_out` = :tls_out, `tls_enforce_in` = :tls_in WHERE `username` = :username");		$stmt->execute(array(			':tls_out' => $tls_out,			':tls_in' => $tls_in,			':username' => $username		));	}	catch (PDOException $e) {		$_SESSION['return'] = array(			'type' => 'danger',			'msg' => 'MySQL: '.$e		);		return false;	}	$_SESSION['return'] = array(		'type' => 'success',		'msg' => sprintf($lang['success']['mailbox_modified'], $username)	);}function set_syncjob($postarray, $action) {	global $lang;	global $pdo;  $username = $_SESSION['mailcow_cc_username'];  if (!filter_var($username, FILTER_VALIDATE_EMAIL)) {    $_SESSION['return'] = array(      'type' => 'danger',      'msg' => sprintf($lang['danger']['access_denied'])    );    return false;  }  if ($_SESSION['mailcow_cc_role'] != "user") {    $_SESSION['return'] = array(      'type' => 'danger',      'msg' => sprintf($lang['danger']['access_denied'])    );    return false;  }  // DELETE  if ($action == "delete") {    $id = $postarray['id'];    if (!is_numeric($id)) {      $_SESSION['return'] = array(        'type' => 'danger',        'msg' => sprintf($lang['danger']['access_denied'])      );      return false;    }    try {      $stmt = $pdo->prepare("DELETE FROM `imapsync` WHERE `user2` = :username AND `id`= :id");      $stmt->execute(array(        ':username' => $username,        ':id' => $id,      ));    }    catch (PDOException $e) {      $_SESSION['return'] = array(        'type' => 'danger',        'msg' => 'MySQL: '.$e      );      return false;    }    $_SESSION['return'] = array(      'type' => 'success',      'msg' => sprintf($lang['success']['mailbox_modified'], htmlspecialchars($username))    );    return true;  }  elseif ($action == "add") {    isset($postarray['active']) ? $active = '1' : $active = '0';    isset($postarray['delete2duplicates']) ? $delete2duplicates = '1' : $delete2duplicates = '0';    $port1            = $postarray['port1'];    $host1            = $postarray['host1'];    $password1        = $postarray['password1'];    $exclude          = $postarray['exclude'];    $user1            = $postarray['user1'];    $mins_interval    = $postarray['mins_interval'];    $enc1             = $postarray['enc1'];    if (!filter_var($port1, FILTER_VALIDATE_INT, array('options' => array('min_range' => 1, 'max_range' => 65535)))) {      $_SESSION['return'] = array(        'type' => 'danger',        'msg' => sprintf($lang['danger']['access_denied'])      );      return false;    }    if (!filter_var($mins_interval, FILTER_VALIDATE_INT, array('options' => array('min_range' => 10, 'max_range' => 3600)))) {      $_SESSION['return'] = array(        'type' => 'danger',        'msg' => sprintf($lang['danger']['access_denied'])      );      return false;    }    if (!is_valid_domain_name($host1)) {      $_SESSION['return'] = array(        'type' => 'danger',        'msg' => sprintf($lang['danger']['access_denied'])      );      return false;    }    if ($enc1 != "TLS" && $enc1 != "SSL" && $enc1 != "PLAIN") {      $_SESSION['return'] = array(        'type' => 'danger',        'msg' => sprintf($lang['danger']['access_denied'])      );      return false;    }    if (@preg_match("/" . $exclude . "/", null) === false) {      $_SESSION['return'] = array(        'type' => 'danger',        'msg' => sprintf($lang['danger']['access_denied'])      );      return false;    }    try {      $stmt = $pdo->prepare("SELECT `user2`, `user1` FROM `imapsync`        WHERE `user2` = :user2 AND `user1` = :user1");      $stmt->execute(array(':user1' => $user1, ':user2' => $username));      $num_results = count($stmt->fetchAll(PDO::FETCH_ASSOC));    }    catch(PDOException $e) {      $_SESSION['return'] = array(        'type' => 'danger',        'msg' => 'MySQL: '.$e      );      return false;    }    if ($num_results != 0) {      $_SESSION['return'] = array(        'type' => 'danger',        'msg' => sprintf($lang['danger']['object_exists'], htmlspecialchars($host1 . ' / ' . $user1))      );      return false;    }    try {      $stmt = $pdo->prepare("INSERT INTO `imapsync` (`user2`, `exclude`, `host1`, `authmech1`, `user1`, `password1`, `mins_interval`, `port1`, `enc1`, `delete2duplicates`, `active`)        VALUES (:user2, :exclude, :host1, :authmech1, :user1, :password1, :mins_interval, :port1, :enc1, :delete2duplicates, :active)");      $stmt->execute(array(        ':user2' => $username,        ':exclude' => $exclude,        ':host1' => $host1,        ':authmech1' => 'PLAIN',        ':user1' => $user1,        ':password1' => $password1,        ':mins_interval' => $mins_interval,        ':port1' => $port1,        ':enc1' => $enc1,        ':delete2duplicates' => $delete2duplicates,        ':active' => $active,      ));    }    catch(PDOException $e) {      $_SESSION['return'] = array(        'type' => 'danger',        'msg' => 'MySQL: '.$e      );      return false;    }    $_SESSION['return'] = array(      'type' => 'success',      'msg' => sprintf($lang['success']['mailbox_modified'], $username)    );    return true;  }  elseif ($action == "edit") {    isset($postarray['active']) ? $active = '1' : $active = '0';    isset($postarray['delete2duplicates']) ? $delete2duplicates = '1' : $delete2duplicates = '0';    $id               = $postarray['id'];    $port1            = $postarray['port1'];    $host1            = $postarray['host1'];    $password1        = $postarray['password1'];    $exclude          = $postarray['exclude'];    $user1            = $postarray['user1'];    $mins_interval    = $postarray['mins_interval'];    $enc1             = $postarray['enc1'];    if (!filter_var($port1, FILTER_VALIDATE_INT, array('options' => array('min_range' => 1, 'max_range' => 65535)))) {      $_SESSION['return'] = array(        'type' => 'danger',        'msg' => sprintf($lang['danger']['access_denied'])      );      return false;    }    if (!filter_var($mins_interval, FILTER_VALIDATE_INT, array('options' => array('min_range' => 10, 'max_range' => 3600)))) {      $_SESSION['return'] = array(        'type' => 'danger',        'msg' => sprintf($lang['danger']['access_denied'])      );      return false;    }    if (!is_valid_domain_name($host1)) {      $_SESSION['return'] = array(        'type' => 'danger',        'msg' => sprintf($lang['danger']['access_denied'])      );      return false;    }    if ($enc1 != "TLS" && $enc1 != "SSL" && $enc1 != "PLAIN") {      $_SESSION['return'] = array(        'type' => 'danger',        'msg' => sprintf($lang['danger']['access_denied'])      );      return false;    }    if (@preg_match("/" . $exclude . "/", null) === false) {      $_SESSION['return'] = array(        'type' => 'danger',        'msg' => sprintf($lang['danger']['access_denied'])      );      return false;    }    try {      $stmt = $pdo->prepare("SELECT `user2` FROM `imapsync`        WHERE `user2` = :user2 AND `id` = :id");      $stmt->execute(array(':user2' => $username, ':id' => $id));      $num_results = count($stmt->fetchAll(PDO::FETCH_ASSOC));    }    catch(PDOException $e) {      $_SESSION['return'] = array(        'type' => 'danger',        'msg' => 'MySQL: '.$e      );      return false;    }    if (empty($num_results)) {      $_SESSION['return'] = array(        'type' => 'danger',        'msg' => sprintf($lang['danger']['access_denied'])      );      return false;    }    try {      $stmt = $pdo->prepare("UPDATE `imapsync` set `exclude` = :exclude, `host1` = :host1, `user1` = :user1, `password1` = :password1, `mins_interval` = :mins_interval, `port1` = :port1, `enc1` = :enc1, `delete2duplicates` = :delete2duplicates, `active` = :active        WHERE `user2` = :user2 AND `id` = :id");      $stmt->execute(array(        ':user2' => $username,        ':id' => $id,        ':exclude' => $exclude,        ':host1' => $host1,        ':user1' => $user1,        ':password1' => $password1,        ':mins_interval' => $mins_interval,        ':port1' => $port1,        ':enc1' => $enc1,        ':delete2duplicates' => $delete2duplicates,        ':active' => $active,      ));    }    catch(PDOException $e) {      $_SESSION['return'] = array(        'type' => 'danger',        'msg' => 'MySQL: '.$e      );      return false;    }    $_SESSION['return'] = array(      'type' => 'success',      'msg' => sprintf($lang['success']['mailbox_modified'], $username)    );    return true;  }}function get_tls_policy($username) {	global $lang;	global $pdo;	if ($_SESSION['mailcow_cc_role'] != "user") {		return false;	}	if (!filter_var($username, FILTER_VALIDATE_EMAIL)) {		$_SESSION['return'] = array(			'type' => 'danger',			'msg' => sprintf($lang['danger']['username_invalid'])		);		return false;	}	try {		$stmt = $pdo->prepare("SELECT `tls_enforce_out`, `tls_enforce_in` FROM `mailbox` WHERE `username` = :username");		$stmt->execute(array(':username' => $username));		$TLSData = $stmt->fetch(PDO::FETCH_ASSOC);	}	catch(PDOException $e) {		$_SESSION['return'] = array(			'type' => 'danger',			'msg' => 'MySQL: '.$e		);		return false;	}	return $TLSData;}function remaining_specs($domain, $object = null, $js = null) {	// left_m	without object given	= MiB left in domain	// left_m	with object given		= Max. MiB we can assign to given object	// limit_m							= Domain limit in MiB	// left_c							= Mailboxes we can create depending on domain quota	global $pdo;	if (!hasDomainAccess($_SESSION['mailcow_cc_username'], $_SESSION['mailcow_cc_role'], $domain)) {		return false;	}	try {		$stmt = $pdo->prepare("SELECT `mailboxes`, `maxquota`, `quota` FROM `domain` WHERE `domain` = :domain");		$stmt->execute(array(':domain' => $domain));		$DomainData			= $stmt->fetch(PDO::FETCH_ASSOC);		$stmt = $pdo->prepare("SELECT COUNT(*) AS `count`, COALESCE(ROUND(SUM(`quota`)/1048576), 0) as `in_use_m` FROM `mailbox` WHERE `domain` = :domain AND `username` != :object");		$stmt->execute(array(':domain' => $domain, ':object' => $object));		$MailboxDataDomain	= $stmt->fetch(PDO::FETCH_ASSOC);		$quota_left_m	= $DomainData['quota']		- $MailboxDataDomain['in_use_m'];		$mboxs_left		= $DomainData['mailboxes']	- $MailboxDataDomain['count'];		if ($quota_left_m > $DomainData['maxquota']) {			$quota_left_m = $DomainData['maxquota'];		}	}	catch (PDOException $e) {		return false;	}	if (is_numeric($quota_left_m)) {		$spec['left_m']		= $quota_left_m;		$spec['limit_m']	= $DomainData['maxquota'];	}	if (is_numeric($mboxs_left)) {		$spec['left_c']		= $mboxs_left;	}	if (!empty($js)) {		echo $quota_left_m;		exit;	}	return $spec;}function get_sender_acl_handles($mailbox, $which) {	global $pdo;	if ($_SESSION['mailcow_cc_role'] != "admin" && $_SESSION['mailcow_cc_role'] != "domainadmin") {		return false;	}	switch ($which) {		case "preselected":			try {				$stmt = $pdo->prepare("SELECT `address` FROM `alias` WHERE `goto` = :goto AND `address` NOT LIKE '@%'");				$stmt->execute(array(':goto' => $mailbox));				$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);				return $rows;			}			catch(PDOException $e) {				$_SESSION['return'] = array(					'type' => 'danger',					'msg' => 'MySQL: '.$e				);				return false;			}			break;		case "selected":			try {				$stmt = $pdo->prepare("SELECT `send_as` FROM `sender_acl` WHERE `logged_in_as` = :logged_in_as");				$stmt->execute(array(':logged_in_as' => $mailbox));				$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);				return $rows;			}			catch(PDOException $e) {				$_SESSION['return'] = array(					'type' => 'danger',					'msg' => 'MySQL: '.$e				);				return false;			}			break;		case "unselected-domains":			try {				if ($_SESSION['mailcow_cc_role'] == "admin"  ) {					$stmt = $pdo->prepare("SELECT DISTINCT `domain` FROM `domain`						WHERE `domain` NOT IN (							SELECT REPLACE(`send_as`, '@', '') FROM `sender_acl` 								WHERE `logged_in_as` = :logged_in_as)						AND	`domain` NOT IN (								SELECT REPLACE(`address`, '@', '') FROM `alias` 									WHERE `goto` = :goto)");					$stmt->execute(array(						':logged_in_as' => $mailbox,						':goto' => $mailbox,					));				}				else {					$stmt = $pdo->prepare("SELECT DISTINCT `domain` FROM `domain_admins`						WHERE `username` = :username							AND `domain` != 'ALL'							AND	`domain` NOT IN (								SELECT REPLACE(`send_as`, '@', '') FROM `sender_acl` 									WHERE `logged_in_as` = :logged_in_as)");					$stmt->execute(array(						':logged_in_as' => $mailbox,						':username' => $_SESSION['mailcow_cc_username']					));				}				$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);				return $rows;			}			catch(PDOException $e) {				$_SESSION['return'] = array(					'type' => 'danger',					'msg' => 'MySQL: '.$e				);				return false;			}			break;		case "unselected-addresses":			try {				if ($_SESSION['mailcow_cc_role'] == "admin"  ) {					$stmt = $pdo->prepare("SELECT `address` FROM `alias`						WHERE `goto` != :goto							AND `address` NOT IN (								SELECT `send_as` FROM `sender_acl` 									WHERE `logged_in_as` = :logged_in_as)");					$stmt->execute(array(						':logged_in_as' => $mailbox,						':goto' => $mailbox					));				}				else {					$stmt = $pdo->prepare("SELECT `address` FROM `alias`						WHERE `goto` != :goto							AND `domain` IN (								SELECT `domain` FROM `domain_admins`									WHERE `username` = :username)							AND `address` NOT IN (								SELECT `send_as` FROM `sender_acl` 									WHERE `logged_in_as` = :logged_in_as)");					$stmt->execute(array(						':logged_in_as' => $mailbox,						':goto' => $mailbox,						':username' => $_SESSION['mailcow_cc_username']					));				}				$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);				return $rows;			}			catch(PDOException $e) {				$_SESSION['return'] = array(					'type' => 'danger',					'msg' => 'MySQL: '.$e				);				return false;			}			break;	}	return false;}function tagging_options($action, $data = null) {	global $lang;	global $pdo;  $username	= $_SESSION['mailcow_cc_username'];  if ($action == "get") {    if (!filter_var($username, FILTER_VALIDATE_EMAIL)) {      return false;    }    try {      $stmt = $pdo->prepare("SELECT `wants_tagged_subject` FROM `mailbox` WHERE `username` = :username");      $stmt->execute(array(':username' => $username));      $SelectData = $stmt->fetch(PDO::FETCH_ASSOC);    }    catch(PDOException $e) {      $_SESSION['return'] = array(        'type' => 'danger',        'msg' => 'MySQL: '.$e      );      return false;    }    return $SelectData['wants_tagged_subject'];  }  elseif ($action == "set") {    ($data['tagged_mail_handler'] == "subject") ? $wants_tagged_subject = '1' : $wants_tagged_subject = '0';    if (!filter_var($username, FILTER_VALIDATE_EMAIL)) {      $_SESSION['return'] = array(        'type' => 'danger',        'msg' => sprintf($lang['danger']['username_invalid'])      );      return false;    }    try {      $stmt = $pdo->prepare("UPDATE `mailbox` SET `wants_tagged_subject` = :wants_tagged_subject WHERE `username` = :username");      $stmt->execute(array(':username' => $username, ':wants_tagged_subject' => $wants_tagged_subject));      $SelectData = $stmt->fetch(PDO::FETCH_ASSOC);    }    catch(PDOException $e) {      $_SESSION['return'] = array(        'type' => 'danger',        'msg' => 'MySQL: '.$e      );      return false;    }    $_SESSION['return'] = array(      'type' => 'success',      'msg' => sprintf($lang['success']['mailbox_modified'], $username)    );  }  return false;}function user_object_info($action, $data = null) {	global $lang;	global $pdo;  $username	= $_SESSION['mailcow_cc_username'];  if ($action == "get") {    if (!filter_var($username, FILTER_VALIDATE_EMAIL)) {      return false;    }    try {      $stmt = $pdo->prepare("SELECT IFNULL(GROUP_CONCAT(`address` SEPARATOR ', '), '✘') AS `aliases` FROM `alias` WHERE `goto` = :username_goto AND `address` NOT LIKE '@%' AND `address` != :username_address");      $stmt->execute(array(':username_goto' => $username, ':username_address' => $username));      $run = $stmt->fetchAll(PDO::FETCH_ASSOC);      while ($row = array_shift($run)) {        $data['aliases'] = $row['aliases'];      }      $stmt = $pdo->prepare("SELECT IFNULL(GROUP_CONCAT(`send_as` SEPARATOR ', '), '✘') AS `send_as` FROM `sender_acl` WHERE `logged_in_as` = :username AND `send_as` NOT LIKE '@%';");      $stmt->execute(array(':username' => $username));      $run = $stmt->fetchAll(PDO::FETCH_ASSOC);      while ($row = array_shift($run)) {        $data['aliases_also_send_as'] = $row['send_as'];      }      $stmt = $pdo->prepare("SELECT IFNULL(GROUP_CONCAT(`send_as` SEPARATOR ', '), '✘') AS `send_as` FROM `sender_acl` WHERE `logged_in_as` = :username AND `send_as` LIKE '@%';");      $stmt->execute(array(':username' => $username));      $run = $stmt->fetchAll(PDO::FETCH_ASSOC);      while ($row = array_shift($run)) {        $data['aliases_send_as_all'] = $row['send_as'];      }      $stmt = $pdo->prepare("SELECT IFNULL(GROUP_CONCAT(`address` SEPARATOR ', '), '✘') as `address` FROM `alias` WHERE `goto` = :username AND `address` LIKE '@%';");      $stmt->execute(array(':username' => $username));      $run = $stmt->fetchAll(PDO::FETCH_ASSOC);      while ($row = array_shift($run)) {        $data['is_catch_all'] = $row['address'];      }      return $data;    }    catch(PDOException $e) {      $_SESSION['return'] = array(        'type' => 'danger',        'msg' => 'MySQL: '.$e      );      return false;    }  }  return false;}function is_valid_domain_name($domain_name) { 	if (empty($domain_name)) {		return false;	}	$domain_name = idn_to_ascii($domain_name);	return (preg_match("/^([a-z\d](-*[a-z\d])*)(\.([a-z\d](-*[a-z\d])*))*$/i", $domain_name)		   && preg_match("/^.{1,253}$/", $domain_name)		   && preg_match("/^[^\.]{1,63}(\.[^\.]{1,63})*$/", $domain_name));}?>
 |