#!/usr/local/bin/php
<?php
/**
 * This script will set the permissions on your Horde tree so that the files
 * will be accessible by the web server.
 *
 * Copyright 2011-2013 Horde LLC (http://www.horde.org/)
 *
 * See the enclosed file COPYING for license information (LGPL-2). If you
 * did not receive this file, see http://www.horde.org/licenses/lgpl.
 *
 * @author   Michael Slusarz <slusarz@horde.org>
 * @category Horde
 * @license  http://www.horde.org/licenses/lgpl LGPL-2
 * @package  Horde
 */

$baseFile = __DIR__ . '/../lib/Application.php';
if (file_exists($baseFile)) {
    require_once $baseFile;
} else {
    require_once 'PEAR/Config.php';
    require_once PEAR_Config::singleton()
        ->get('horde_dir', null, 'pear.horde.org') . '/lib/Application.php';
}
Horde_Registry::appInit('horde', array(
    'authentication' => 'none',
    'cli' => true
));

$cli->message('Horde directory: ' . realpath(HORDE_BASE), 'cli.message');

$owner = $cli->prompt(
    'Owner of Horde files?',
    null,
    'root'
);

$ownerpars = posix_getpwnam($owner);
$owner = $ownerpars['uid'];

$group = $cli->prompt(
    'Group under which web server/PHP runs?',
    null,
    'nobody'
);

$grouppars = posix_getgrnam($group);
$group = $grouppars['gid'];

$cli->writeln();

if (!$cli->prompt($cli->red('Are you sure you want to alter permissions?'), array('y' => 'Yes', 'n' => 'No'), 'n') == 'y') {
    exit(0);
}

$it = new RecursiveIteratorIterator(
    new RecursiveDirectoryIterator(realpath(HORDE_BASE)),
    RecursiveIteratorIterator::SELF_FIRST);

foreach ($it as $key => $val) {
    if ($val->getFilename() == '..' ) {
        continue;
    }

    if ($val->getOwner() != $owner) {
        $cli->message('Changing owner for ' . $key, 'cli.message');
        chown($key, $owner);
    }

    if ($val->getGroup() != $group) {
        $cli->message('Changing group for ' . $key, 'cli.message');
        chgrp($key, $group);
    }

    $octal_perms = substr(sprintf('%o', $val->getPerms()), -4);
    if ($val->isDir()) {
        if (basename($key) == 'static') {
            if ($octal_perms != '0770') {
                $cli->message('Changing permissions for ' . $key, 'cli.message');
                chmod($key, 0770);
            }
        } elseif ($octal_perms != '0750') {
            $cli->message('Changing permissions for ' . $key, 'cli.message');
            chmod($key, 0750);
        }
    } elseif ($val->isFile()) {
        if ($octal_perms != '0640') {
            $cli->message('Changing permissions for ' . $key, 'cli.message');
            chmod($key, 0640);
        }
    }
}
