diff --git a/data/web/autodiscover.php b/data/web/autodiscover.php index 9526313ae..1b6813ce1 100644 --- a/data/web/autodiscover.php +++ b/data/web/autodiscover.php @@ -1,15 +1,139 @@ + + + + $error_code + $message + + + + +EOD; +} + +function autodiscover_xml($type, $email, $displayname, $autodiscover_config) { + $displayname = htmlspecialchars($displayname, ENT_XML1 | ENT_QUOTES, 'UTF-8'); + $caldav_port = $autodiscover_config['caldav']['port'] != 443 ? ':' . $autodiscover_config['caldav']['port'] : ''; + $carddav_port = $autodiscover_config['carddav']['port'] != 443 ? ':' . $autodiscover_config['carddav']['port'] : ''; + $xml = ''; + $calcardav_xml = ''; + + if (getenv('SKIP_SOGO') != "y") { + $calcardav_xml .= << + CalDAV + https://{$autodiscover_config['caldav']['server']}{$caldav_port}/SOGo/dav/{$email}/ + off + {$email} + + + CardDAV + https://{$autodiscover_config['carddav']['server']}{$carddav_port}/SOGo/dav/{$email}/ + off + {$email} + +EOD; + } + + if ($type == 'imap') { + $xml .= << + + {$displayname} + + + email + settings + + IMAP + {$autodiscover_config['imap']['server']} + {$autodiscover_config['imap']['port']} + off + {$email} + off + on + on + + + SMTP + {$autodiscover_config['smtp']['server']} + {$autodiscover_config['smtp']['port']} + off + {$email} + off + on + on + on + off + + {$calcardav_xml} + + +EOD; + } + else if ($type == 'activesync') { + $xml .= << + en:en + + {$displayname} + {$email} + + + + + MobileSync + {$autodiscover_config['activesync']['url']} + {$autodiscover_config['activesync']['url']} + + + + +EOD; + } + + + return << + +$xml + +EOD; +} + $default_autodiscover_config = $autodiscover_config; $autodiscover_config = array_merge($default_autodiscover_config, $autodiscover_config); +// SQL +//$dsn = $database_type . ":host=" . $database_host . ";dbname=" . $database_name; +$dsn = $database_type . ":unix_socket=" . $database_sock . ";dbname=" . $database_name; +$opt = [ + PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, + PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, + PDO::ATTR_EMULATE_PREPARES => false, +]; +$pdo = new PDO($dsn, $database_user, $database_pass, $opt); + // Redis $redis = new Redis(); try { @@ -22,10 +146,15 @@ try { $redis->auth(getenv("REDISPASS")); } catch (Exception $e) { - exit; + $_SESSION['return'][] = array( + 'type' => 'danger', + 'msg' => 'Redis: '.$e + ); + + echo error_xml("2477272013", "600", "Server Error"); + exit(0); } -error_reporting(0); $data = trim(file_get_contents("php://input")); @@ -45,102 +174,8 @@ if (getenv('SKIP_SOGO') == "y") { $autodiscover_config['autodiscoverType'] = 'imap'; } -//$dsn = $database_type . ":host=" . $database_host . ";dbname=" . $database_name; -$dsn = $database_type . ":unix_socket=" . $database_sock . ";dbname=" . $database_name; -$opt = [ - PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, - PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, - PDO::ATTR_EMULATE_PREPARES => false, -]; -$pdo = new PDO($dsn, $database_user, $database_pass, $opt); -// Init Identity Provider -$iam_provider = identity_provider('init'); -$iam_settings = identity_provider('get'); - -$login_user = strtolower(trim($_SERVER['PHP_AUTH_USER'])); -$login_pass = trim(htmlspecialchars_decode($_SERVER['PHP_AUTH_PW'])); - -if (empty($_SERVER['PHP_AUTH_USER']) || empty($_SERVER['PHP_AUTH_PW'])) { - $json = json_encode( - array( - "time" => time(), - "ua" => $_SERVER['HTTP_USER_AGENT'], - "user" => "none", - "ip" => $_SERVER['REMOTE_ADDR'], - "service" => "Error: must be authenticated" - ) - ); - $redis->lPush('AUTODISCOVER_LOG', $json); - header('WWW-Authenticate: Basic realm="' . $_SERVER['HTTP_HOST'] . '"'); - header('HTTP/1.0 401 Unauthorized'); - exit(0); -} - -$login_role = check_login($login_user, $login_pass, array('eas' => TRUE)); - -if ($login_role === "user") { - header("Content-Type: application/xml"); - echo '' . PHP_EOL; -?> - - time(), - "ua" => $_SERVER['HTTP_USER_AGENT'], - "user" => $_SERVER['PHP_AUTH_USER'], - "ip" => $_SERVER['REMOTE_ADDR'], - "service" => "Error: invalid or missing request data" - ) - ); - $redis->lPush('AUTODISCOVER_LOG', $json); - $redis->lTrim('AUTODISCOVER_LOG', 0, 100); - } - catch (RedisException $e) { - $_SESSION['return'][] = array( - 'type' => 'danger', - 'msg' => 'Redis: '.$e - ); - return false; - } - list($usec, $sec) = explode(' ', microtime()); -?> - - - 600 - Invalid Request - - - - -Request->EMailAddress; - } catch (Exception $e) { - $email = $_SERVER['PHP_AUTH_USER']; - } - - $username = trim($email); - try { - $stmt = $pdo->prepare("SELECT `name` FROM `mailbox` WHERE `username`= :username"); - $stmt->execute(array(':username' => $username)); - $MailboxData = $stmt->fetch(PDO::FETCH_ASSOC); - } - catch(PDOException $e) { - die("Failed to determine name from SQL"); - } - if (!empty($MailboxData['name'])) { - $displayname = $MailboxData['name']; - } - else { - $displayname = $email; - } +if(!$data) { try { $json = json_encode( array( @@ -148,7 +183,7 @@ if ($login_role === "user") { "ua" => $_SERVER['HTTP_USER_AGENT'], "user" => $_SERVER['PHP_AUTH_USER'], "ip" => $_SERVER['REMOTE_ADDR'], - "service" => $autodiscover_config['autodiscoverType'] + "service" => "Error: invalid or missing request data" ) ); $redis->lPush('AUTODISCOVER_LOG', $json); @@ -159,83 +194,77 @@ if ($login_role === "user") { 'type' => 'danger', 'msg' => 'Redis: '.$e ); - return false; } - if ($autodiscover_config['autodiscoverType'] == 'imap') { -?> - - - - - - email - settings - - IMAP - - - off - - off - on - on - - - SMTP - - - off - - off - on - on - on - off - - - - CalDAV - https:///SOGo/dav// - off - - - - CardDAV - https:///SOGo/dav// - off - - - - - - - - en:en - - - - - - - - MobileSync - - - - - - - - - + +try { + $discover = new SimpleXMLElement($data); + $email = $discover->Request->EMailAddress; +} catch (Exception $e) { + // could not parse email address + try { + $json = json_encode( + array( + "time" => time(), + "ua" => $_SERVER['HTTP_USER_AGENT'], + "user" => $_SERVER['PHP_AUTH_USER'], + "ip" => $_SERVER['REMOTE_ADDR'], + "service" => "Error: missing email address in request data" + ) + ); + $redis->lPush('AUTODISCOVER_LOG', $json); + $redis->lTrim('AUTODISCOVER_LOG', 0, 100); + } + catch (RedisException $e) { + $_SESSION['return'][] = array( + 'type' => 'danger', + 'msg' => 'Redis: '.$e + ); + } + + echo error_xml("2477272013", "600", "Invalid Request"); + exit(0); +} + +$username = trim($email); +$displayname = $username; +try { + $stmt = $pdo->prepare("SELECT `name` FROM `mailbox` WHERE `username`= :username"); + $stmt->execute(array(':username' => $username)); + $MailboxData = $stmt->fetch(PDO::FETCH_ASSOC); +} +catch(PDOException $e) { + $MailboxData = array("name" => ""); +} +if (!empty($MailboxData['name'])) { + $displayname = $MailboxData['name']; +} + +try { + $json = json_encode( + array( + "time" => time(), + "ua" => $_SERVER['HTTP_USER_AGENT'], + "user" => $_SERVER['PHP_AUTH_USER'], + "ip" => $_SERVER['REMOTE_ADDR'], + "service" => $autodiscover_config['autodiscoverType'] + ) + ); + $redis->lPush('AUTODISCOVER_LOG', $json); + $redis->lTrim('AUTODISCOVER_LOG', 0, 100); +} +catch (RedisException $e) { + $_SESSION['return'][] = array( + 'type' => 'danger', + 'msg' => 'Redis: '.$e + ); + + echo error_xml("2477272013", "600", "Server Error"); + exit(0); +} + +echo autodiscover_xml($autodiscover_config['autodiscoverType'], $email, $displayname, $autodiscover_config); +exit(0);