<?php

require_once('inc/debug.php');
require_once('inc/db_connect.php');

function mailaccounts($uid)
{
  $uid = (int) $uid;
  $query = "SELECT m.id,concat_ws('@',`m`.`local`,if(isnull(`m`.`domain`),_utf8'schokokeks.org',`d`.`domainname`)) AS `account`, `m`.`password` AS `cryptpass`,`m`.`maildir` AS `maildir`,aktiv from (`mail`.`mailaccounts` `m` left join `mail`.`v_domains` `d` on((`d`.`id` = `m`.`domain`))) WHERE m.uid=$uid";
  DEBUG("SQL-Query: {$query}");
  $result = @mysql_query($query);
  if (mysql_error())
    system_failure(mysql_error());
  DEBUG("Found ".@mysql_num_rows($result)." rows!");
  $accounts = array();
  if (@mysql_num_rows($result) > 0)
    while ($acc = @mysql_fetch_object($result))
      array_push($accounts, array('id'=> $acc->id, 'account' => $acc->account, 'mailbox' => $acc->maildir, 'cryptpass' => $acc->cryptpass, 'enabled' => ($acc->aktiv == 1)));
  return $accounts;
}

function get_mailaccount($id)
{
  $uid = (int) $uid;
  $query = "SELECT concat_ws('@',`m`.`local`,if(isnull(`m`.`domain`),_utf8'schokokeks.org',`d`.`domainname`)) AS `account`, `m`.`password` AS `cryptpass`,`m`.`maildir` AS `maildir`,aktiv from (`mail`.`mailaccounts` `m` left join `mail`.`v_domains` `d` on((`d`.`id` = `m`.`domain`))) WHERE m.id=$id";
  $result = mysql_query($query);
  DEBUG("Found ".mysql_num_rows($result)." rows!");
  $acc = mysql_fetch_object($result);
  $ret = array('account' => $acc->account, 'mailbox' => $acc->maildir,  'enabled' => ($acc->aktiv == 1));
  DEBUG(print_r($ret, true));
  return $ret;
}

/*
  FIXME: Hier auch die crypt-Funktion nehmen wie beim systemuser-Passwort
*/
function encrypt_mail_password($pw)
{
  DEBUG("unencrypted PW: ".$pw);
  $descriptorspec = array(
    0 => array("pipe", "r"),
    1 => array("pipe", "w")
    );
  $process = proc_open("/usr/local/bin/exec/userdbpw -md5", $descriptorspec, $pipes);
  fwrite($pipes[0], $pw);
  fclose($pipes[0]);
  $encpw = fgets($pipes[1]);
  DEBUG("encrypted PW: ".$encpw);
  fclose($pipes[1]);
  proc_close($process);
  return chop($encpw);

}

function get_domain_id($domain) 
{
  $domain = mysql_real_escape_string($domain);
  $result = mysql_query("SELECT id FROM mail.v_domains WHERE domainname = '{$domain}';");
  if (mysql_num_rows($result) == 0)
    return NULL;
  return mysql_fetch_object($result)->id;
}


function change_mailaccount($id, $arr)
{
  $id = (int) $id;
  $conditions = array();

  if (isset($arr['account']))
  {
    list($local, $domain) = explode('@', $arr['account'], 2);
    $domainid = get_domain_id($domain);
    if ($domainid == NULL)
      $domainid='NULL';
    array_push($conditions, "local='".mysql_real_escape_string($local)."', domain=$domainid");
  }
  if (isset($arr['mailbox']))
    if ($arr['mailbox'] == '')
      array_push($conditions, "`maildir`=NULL");
    else
      array_push($conditions, "`maildir`='".mysql_real_escape_string($arr['mailbox'])."'");

  if (isset($arr['password']))
  {
    $encpw = encrypt_mail_password($arr['password']);
    array_push($conditions, "`password`='$encpw'");
  }

  if (isset($arr['enabled']))
    array_push($conditions, "`aktiv`=".($arr['enabled'] == 'Y' ? "1" : "0"));


  $query = "UPDATE mail.mailaccounts SET ".implode(",", $conditions)." WHERE id='$id' LIMIT 1";
  DEBUG("Query: ".$query);

  mysql_query($query);
  if (mysql_error())
    system_failure('Beim &Auml;ndern der Account-Daten ist ein Fehler aufgetreten. Sollte dies wiederholt vorkommen, senden Sie bitte die Fehlermeldung ('.mysql_error().') an einen Administrator.');

}

function create_mailaccount($arr)
{
  $values = array();

  if (($arr['account']) == '')
    system_failure('empty account name!');

  $values['uid'] = (int) $_SESSION['userinfo']['uid'];

  list($local, $domain) = explode('@', $arr['account'], 2);
  $domainid = get_domain_id($domain);
  if ($domainid == NULL)
    $domainid='NULL';
  $values['local'] = "'".mysql_real_escape_string($local)."'";
  $values['domain'] = $domainid;

  if (isset($arr['mailbox']))
    if ($arr['mailbox'] == '')
      $values['maildir'] = 'NULL';
    else
      $values['maildir']= "'".mysql_real_escape_string($arr['mailbox'])."'";


  if (isset($arr['password']))
  {
    $values['password'] = "'".encrypt_mail_password($arr['password'])."'";
  }

  if (isset($arr['enabled']))
    $values['aktiv'] = ($arr['enabled'] == 'Y' ? "1" : "0" );


  $query = "INSERT INTO mail.mailaccounts (".implode(',', array_keys($values)).") VALUES (".implode(",", array_values($values)).")";
  DEBUG("Query: ".$query);

  mysql_query($query);
  if (mysql_error())
    system_failure('Beim Anlegen des Kontos ist ein Fehler aufgetreten. Sollte dies wiederholt vorkommen, senden Sie bitte die Fehlermeldung ('.mysql_error().') an einen Administrator.');

}


function delete_mailaccount($id)
{
  $id = (int) $id;
  $query = "DELETE FROM mail.mailaccounts WHERE id=".$id." LIMIT 1";
  mysql_query($query);
  if (mysql_error())
    system_failure('Beim L&ouml;schen des Kontos ist ein Fehler aufgetreten. Sollte dies wiederholt vorkommen, senden Sie bitte die Fehlermeldung ('.mysql_error().') an einen Administrator.');
}


function check_valid($acc)
{
  $user = $_SESSION['userinfo'];
  DEBUG("Account-data: ".print_r($acc, true));
  DEBUG("User-data: ".print_r($user, true));
  if ($acc['mailbox'] != '')
  {
    if (substr($acc['mailbox'], 0, strlen($user['homedir'])+1) != $user['homedir'].'/')
      return "Die Mailbox muss innerhalb des Home-Verzeichnisses liegen. Sie haben \"".$acc['mailbox']."\" als Mailbox angegeben, Ihre Home-Verzeichnis ist \"".$user['homedir']."/\".";
    if (strstr($acc['mailbox'], '..') or ! preg_match('/^[a-z0-9.\/_-]*$/', $acc['mailbox']))
      return "Sie verwenden ungültige Zeichen in Ihrem Mailbox-Pfad.";
  }

  if ($acc['account'] == '' || strpos($acc['account'], '@') == 0)
    return "Es wurde kein Benutzername angegeben!";
  if (strpos($acc['account'], '@') === false)
    return "Es wurde kein Domain-Teil im Account-Name angegeben. Account-Namen m&uuml;ssen einen Domain-Teil enthalten. Im Zweifel versuchen Sie &quot;@schokokeks.org&quot;.";

  list($local, $domain) = explode('@', $acc['account'], 2);
  require_once('domains.php');
  $tmpdomains = get_domain_names($user['customerno'], $user['uid']);
  $domains = array();
  foreach ($tmpdomains as $dom)
    array_push($domains, $dom['domainname']);

  if (array_search($domain, $domains) === false)
  {
    if ($domain == "schokokeks.org")
    {
      if (substr($local, 0, strlen($user['username'])) != $user['username'] || ($acc['account'][strlen($user['username'])] != '-' && $acc['account'][strlen($user['username'])] != '@'))
      {
        return "Sie haben &quot;@schokokeks.org&quot; als Domain-Teil angegeben, aber der Benutzer-Teil beginnt nicht mit Ihrem Benutzername!";
      }
    }
    else
      return "Der angegebene Domain-Teil (".htmlentities($domain, ENT_QUOTES, "UTF-8").") ist nicht f&uuml;r Ihren Account eingetragen. Sollte dies ein Fehler sein, wenden sie sich bitte an einen Administrator!";
  }

  return '';
}



?>