function addLocalForward($username, $domainId, $destination, $active, $printErrors = TRUE)
{
    if (!isSiteAdmin()) {
        if ($printErrors) {
            print json_encode(array('success' => false, 'errors' => array('username' => 'Permission denied')));
        }
        return FALSE;
    }
    if ($active) {
        $active = 't';
    } else {
        $active = 'f';
    }
    $errors = array();
    $foundError = FALSE;
    if (!$username) {
        $foundError = TRUE;
        $errors['username'] = '******';
    }
    if (!$domainId) {
        $foundError = TRUE;
        $errors['domain'] = 'This field is required';
    }
    if (!$destination) {
        $foundError = TRUE;
        $errors['destination'] = 'This field is required';
    }
    if (!$active) {
        $foundError = TRUE;
        $errors['active'] = 'This field is required';
    }
    if ($foundError) {
        if ($printErrors) {
            print json_encode(array('success' => false, 'errors' => $errors));
        }
        return FALSE;
    }
    $username = strtolower($username);
    if (!validUserName($username)) {
        $foundError = TRUE;
        $errors['username'] = '******';
    }
    $domain = getDomain($domainId);
    if (!$domain) {
        $foundError = TRUE;
        $errors['domain'] = 'Invalid domain';
    }
    if (!validUserName($destination)) {
        $foundError = TRUE;
        $errors['destination'] = 'Invalid destination';
    }
    if ($foundError) {
        if ($printErrors) {
            print json_encode(array('success' => false, 'errors' => $errors));
        }
        return FALSE;
    }
    $email = $username . '@' . $domain;
    if (userExists($email) || localForwardExists($email)) {
        if ($printErrors) {
            print json_encode(array('success' => false, 'errors' => array('username' => 'Username already exists')));
        }
        return FALSE;
    }
    $params = array('username' => $username, 'domain_id' => $domainId, 'destination' => $destination, 'active' => $active);
    return db_insert('virtual_aliases', $params, 'alias_id');
}
function addUser($newUser)
{
    $username = $newUser['username'];
    $domainId = $newUser['domainId'];
    $pass = $newUser['pass'];
    $repPass = $newUser['repPass'];
    $name = $newUser['name'];
    $active = $newUser['active'];
    $errors = array();
    $foundError = FALSE;
    if (!$username) {
        $foundError = TRUE;
        $errors['username'] = '******';
    }
    if (!$domainId) {
        $foundError = TRUE;
        $errors['domain'] = 'This field is required';
    }
    if (!$pass) {
        $foundError = TRUE;
        $errors['password'] = '******';
    }
    if (!$repPass) {
        $foundError = TRUE;
        $errors['reppassword'] = '******';
    }
    if (!$active) {
        $foundError = TRUE;
        $errors['active'] = 'This field is required';
    }
    if ($foundError) {
        print json_encode(array('success' => false, 'errors' => $errors));
        return;
    }
    $username = strtolower($username);
    if (!validUserName($username)) {
        $foundError = TRUE;
        $errors['username'] = '******';
    }
    $domain = getDomain($domainId);
    if (!$domain) {
        $foundError = TRUE;
        $errors['domain'] = 'Invalid domain';
    }
    if ($foundError) {
        print json_encode(array('success' => false, 'errors' => $errors));
        return;
    }
    $email = $username . '@' . $domain;
    $errors = array();
    $foundError = FALSE;
    if (userExists($email) || localForwardExists($email)) {
        $foundError = TRUE;
        $errors['username'] = '******';
    }
    if (strlen($pass) < 8) {
        $foundError = TRUE;
        $errors['password'] = '******';
    }
    if ($pass != $repPass) {
        $foundError = TRUE;
        $errors['reppassword'] = '******';
    }
    $adminDomains = getAdminDomains();
    if (!in_array($domain, $adminDomains)) {
        $foundError = TRUE;
        $errors['domain'] = 'Permission denied on domain: ' . $domain;
    }
    // TODO add password complexity requirements here
    if ($foundError) {
        print json_encode(array('success' => false, 'errors' => $errors));
        return;
    }
    if (!$name) {
        $name = '';
    }
    if ($active == 'true') {
        $active = 't';
    } else {
        $active = 'f';
    }
    $sql = 'INSERT INTO virtual_users (' . '    username,' . '    domain_id,' . '    password,' . '    role_id,' . '    description,' . '    active' . '  ) VALUES (?, ?, CRYPT(?, GEN_SALT(\'bf\', 8)), ?, ?, ?)';
    $params = array($username, $domainId, $pass, getRoleId('user'), $name, $active);
    beginTransaction();
    $rs = db_do($sql, $params);
    if (!$rs) {
        cancelTransaction();
        print json_encode(array('success' => false, 'errors' => array('username' => 'Unknown Error')));
        return;
    }
    $userId = getUserId($email);
    if (!$userId) {
        cancelTransaction();
        print json_encode(array('success' => false, 'errors' => array('username' => 'Unknown Error')));
        return;
    }
    $alias = array('username' => $username, 'domain_id' => $domainId, 'destination' => $email, 'active' => $active);
    $aliasId = db_insert('virtual_aliases', $alias, 'alias_id');
    if (!$aliasId) {
        cancelTransaction();
        print json_encode(array('success' => false, 'errors' => array('username' => 'Unknown Error')));
        return;
    }
    $alias['active'] = $active;
    $alias['destination'] = $email . '@autoreply.' . $domain;
    $aliasId = db_insert('virtual_aliases', $alias, 'alias_id');
    if (!$aliasId) {
        cancelTransaction();
        print json_encode(array('success' => false, 'errors' => array('username' => 'Unknown Error')));
        return;
    }
    endTransaction();
    print json_encode(array('success' => true));
}
function addAlias($username, $domainId, $destinationId, $active)
{
    if ($active) {
        $active = 't';
    } else {
        $active = 'f';
    }
    $foundError = FALSE;
    $errors = array();
    if (!$username) {
        $errors['username'] = '******';
        $foundError = TRUE;
    }
    if (!$domainId) {
        $errors['domain'] = 'This field is required';
        $foundError = TRUE;
    }
    if (!$destinationId) {
        $errors['destination'] = 'This field is required';
        $foundError = TRUE;
    }
    if ($foundError) {
        print json_encode(array('success' => false, 'errors' => $errors));
        return FALSE;
    }
    $username = strtolower($username);
    if (!validUserName($username)) {
        $errors['username'] = '******';
        print json_encode(array('success' => false, 'errors' => $errors));
        return FALSE;
    }
    $domain = getDomain($domainId);
    if (!$domain) {
        $errors['domain'] = 'Invalid domain';
        $foundError = TRUE;
    }
    $email = $username . '@' . $domain;
    if (userExists($email) || localForwardExists($email)) {
        $errors['username'] = '******';
        $foundError = TRUE;
    }
    $destination = getUserEmail($destinationId);
    if (!$destination) {
        $errors['destination'] = 'Invalid destination';
        $foundError = TRUE;
    }
    if ($foundError) {
        print json_encode(array('success' => false, 'errors' => $errors));
        return FALSE;
    }
    if (aliasExists($email, $destination)) {
        $errors['username'] = '******';
        $foundError = TRUE;
    }
    $adminDomains = getAdminDomains();
    if (!in_array($domain, $adminDomains)) {
        $errors['domain'] = 'Permission denied on domain: ' . $domain;
        $foundError = TRUE;
    }
    $destinationParts = split('@', $destination);
    $destinationDomain = $destinationParts[1];
    if (!in_array($destinationDomain, $adminDomains)) {
        $errors['destination'] = 'Permission denied on domain: ' . $destinationDomain;
        $foundError = TRUE;
    }
    if ($foundError) {
        print json_encode(array('success' => false, 'errors' => $errors));
        return FALSE;
    }
    $params = array('username' => $username, 'domain_id' => $domainId, 'destination' => $destination, 'active' => $active);
    $ret = db_insert('virtual_aliases', $params, 'alias_id');
    if ($ret) {
        print json_encode(array('success' => TRUE));
        return;
    }
    print json_encode(array('success' => FALSE, 'msg' => 'Unknown error'));
}