<?php
/**
 * 
 * Generate a XML file for Thunderbird mail account autoconfiguration functionality. 
 * @author Paul van der Vlis <paul@vandervlis.nl>
 * @author Arthur Bauman <arhur@bauman.nu>
 * @version 1.0
 */

# test with: https://autoconfig.linuxmail.nl/mail/config-v1.1.xml?emailaddress=test%40r95.nl

# For debugging enable error reporting in .htaccess.

##### Config ##############
$host   = '127.0.0.1';
$db     = 'sogo';
$userDb = 'autoconfig';
$pass   = 'xu7tTGqgv';
#### End config ###########

/**
 * Get username from database by e-mail address.
 *
 * @param object $conn
 * @param string $email
 * @return object
 */
function getUsername($conn, $email) {
    # Prepare and bind.
    $stmt = $conn->prepare('SELECT c_name FROM sogo_users WHERE mail = ?');
    $stmt->bind_param('s', $email);
    $stmt->execute();
    $result = $stmt->get_result();
    $stmt->close();
    return($result);
}


if (isset($_GET['emailaddress'])) {
    $email = $_GET['emailaddress'];
    # Check user input.
    if (!(filter_var($email, FILTER_VALIDATE_EMAIL))) {
        die('Not a valid e-mail address.');
    }
}
else {
    die('Wrong parameter.');
}

# Create database connection.
$conn = new mysqli($host, $userDb, $pass, $db);

# Check database connection.
if ($conn->connect_error) {
    die('Connection failed: ' . $conn->connect_error);
}

$result = getUsername($conn, $email);
# E-mail addres not found in database, check with wildcard address
if($result->num_rows === 0) {
    $emailArray = explode ('@', $email);
    $localPartEmail = $emailArray[0];
    $domainPartEmail = $emailArray[1];
    $result = getUsername($conn, '@' . $domainPartEmail);
    # Wildcard address not found in database, use local part of the e-mail address.
    if($result->num_rows === 0) {
        $userMail = $localPartEmail;
    }
    else {
      # Use first match.
      $userMail = $result->fetch_row()[0];
    }
}
else {
    # Use first match.
    $userMail = $result->fetch_row()[0];
}

$conn->close();

# speciaal voor klanten met eigen mailserver:
# if("$domainPartEmail" == "vandervlis.nl") {
#    $imapServer = "server.vandervlis.nl";
#    $smtpServer = "smtp.vandervlis.nl";
#    $sogoServer = "server.vandervlis.nl";
#}

if("$domainPartEmail" == "kuipers2.nl") {
    $imapServer = "kuipers2.nl";
    $smtpServer = "kuipers2.nl";
    $sogoServer = "kuipers2.nl";
}
if("$domainPartEmail" == "grejapi.nl") {
    $imapServer = "kuipers2.nl";
    $smtpServer = "kuipers2.nl";
    $sogoServer = "kuipers2.nl";
}
if("$domainPartEmail" == "grejapi2.nl") {
    $imapServer = "kuipers2.nl";
    $smtpServer = "kuipers2.nl";
    $sogoServer = "kuipers2.nl";
}

if($imapServer == "") {
    $imapServer = "imap.vandervlis.nl";
}
if($smtpServer == "") {
    $smtpServer = "smtp.vandervlis.nl";
}
if($sogoServer == "") {
    $sogoServer = "sogo.vandervlis.nl";
}


# Generate output.
header('Content-type: text/xml');
echo '<?xml version="1.0"?>
<clientConfig version="1.1">
    <emailProvider id="vandervlis.nl">
      <domain>vandervlis.nl</domain>
      <displayName>Van der Vlis</displayName>
      <displayShortName>vandervlis</displayShortName>
      <incomingServer type="imap">
         <hostname>' . $imapServer . '</hostname>
         <port>993</port>
         <socketType>SSL</socketType>
         <username>' . $userMail . '</username>
         <authentication>password-cleartext</authentication>
         <specialUse>
           <Sent>INBOX.Sent</Sent>
           <Drafts>INBOX.Drafts</Drafts>
           <Trash>INBOX.Trash</Trash>
         </specialUse>
      </incomingServer>
      <outgoingServer type="smtp">
         <hostname>' . $smtpServer . '</hostname>
         <port>465</port>
         <socketType>SSL</socketType>
         <username>' . $userMail . '</username>
         <authentication>password-cleartext</authentication>
      </outgoingServer>
    </emailProvider>
    <addressBook type="carddav">
       <username>' . $userMail .'</username>
       <authentication>http-basic</authentication>
       <serverURL>https://' . $sogoServer . '/SOGo/dav/' . $userMail . '/Contacts/personal/</serverURL>
    </addressBook>
    <calendar type="caldav">
       <username>' . $userMail . '</username>
       <authentication>http-basic</authentication>
       <serverURL>https://' . $sogoServer . '/SOGo/dav/' . $userMail . '/Calendar/personal/</serverURL>
    </calendar>
</clientConfig>';
