210 lines
		
	
	
		
			6.0 KiB
		
	
	
	
		
			PHP
		
	
	
	
			
		
		
	
	
			210 lines
		
	
	
		
			6.0 KiB
		
	
	
	
		
			PHP
		
	
	
	
<?php
 | 
						|
/*
 | 
						|
$Id:
 | 
						|
 | 
						|
  This code is part of LDAP Account Manager (http://www.ldap-account-manager.org/)
 | 
						|
  Copyright (C) 2012  Christian Kropp
 | 
						|
                2012 - 2016  Roland Gruber
 | 
						|
 | 
						|
  This program is free software; you can redistribute it and/or modify
 | 
						|
  it under the terms of the GNU General Public License as published by
 | 
						|
  the Free Software Foundation; either version 2 of the License, or
 | 
						|
  (at your option) any later version.
 | 
						|
 | 
						|
  This program is distributed in the hope that it will be useful,
 | 
						|
  but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
						|
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
						|
  GNU General Public License for more details.
 | 
						|
 | 
						|
  You should have received a copy of the GNU General Public License
 | 
						|
  along with this program; if not, write to the Free Software
 | 
						|
  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 | 
						|
 | 
						|
*/
 | 
						|
 | 
						|
 | 
						|
/**
 | 
						|
* This file includes functions to upgrade the pdf/profiles configuration files.
 | 
						|
*
 | 
						|
* @package main
 | 
						|
* @author Christian Kropp
 | 
						|
* @author Roland Gruber
 | 
						|
*/
 | 
						|
 | 
						|
 | 
						|
/**
 | 
						|
 * check the write/read permission for the upgrade
 | 
						|
 *
 | 
						|
 * @return array - permission messages
 | 
						|
 */
 | 
						|
function testPermissions() {
 | 
						|
	$result = array();
 | 
						|
	if (!is_writable('../config')) {
 | 
						|
		$result[] = htmlspecialchars(realpath('../config'));
 | 
						|
	}
 | 
						|
	$result = array_merge($result, testPermissionRecursive('../config/profiles/'));
 | 
						|
    $result = array_merge($result, testPermissionRecursive('../config/pdf/'));
 | 
						|
    return $result;
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
 * Recursively checks the permissions in a directory.
 | 
						|
 *
 | 
						|
 * @param String $dir directory
 | 
						|
 * @return array list of files/directories with wrong permission
 | 
						|
 */
 | 
						|
function testPermissionRecursive($dir) {
 | 
						|
	$result = array();
 | 
						|
	if (!is_writable($dir)) {
 | 
						|
		$result[] = htmlspecialchars(realpath($dir));
 | 
						|
	}
 | 
						|
	$dirHandle = @opendir($dir);
 | 
						|
	if ($dirHandle != null) {
 | 
						|
		$file = @readdir($dirHandle);
 | 
						|
		while ($file !== false) {
 | 
						|
			if (($file != '.') && ($file != '..')) {
 | 
						|
				if (is_dir($dir . '/' . $file)) {
 | 
						|
					$result = array_merge($result, testPermissionRecursive($dir . '/' . $file));
 | 
						|
				}
 | 
						|
				elseif (!is_writable($dir . '/' . $file)) {
 | 
						|
					$result[] = htmlspecialchars(realpath($dir . '/' . $file));
 | 
						|
				}
 | 
						|
			}
 | 
						|
			$file = @readdir($dirHandle);
 | 
						|
		}
 | 
						|
	}
 | 
						|
	@closedir($dirHandle);
 | 
						|
	return $result;
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
 * Checks if the given directory contains files.
 | 
						|
 * This is used to check if config files need to be migrated.
 | 
						|
 *
 | 
						|
 * @param String $dir directory path
 | 
						|
 */
 | 
						|
function containsFiles($dir) {
 | 
						|
	$return = false;
 | 
						|
	$dirHandle = @opendir($dir);
 | 
						|
	if ($dirHandle != null) {
 | 
						|
		$file = @readdir($dirHandle);
 | 
						|
		while ($file !== false) {
 | 
						|
			if (is_file($dir . '/' . $file) && ($file != '.htaccess')) {
 | 
						|
				$return = true;
 | 
						|
				break;
 | 
						|
			}
 | 
						|
			$file = @readdir($dirHandle);
 | 
						|
		}
 | 
						|
	}
 | 
						|
	@closedir($dirHandle);
 | 
						|
	return $return;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
/**
 | 
						|
 * Saves an hash array (attribute => value) to an account profile
 | 
						|
 *
 | 
						|
 * @param array $profiles server profiles
 | 
						|
 */
 | 
						|
function upgradeConfigToServerProfileFolders($profiles) {
 | 
						|
	if (!is_writable('../config')) {
 | 
						|
		StatusMessage('ERROR', 'Upgrade failed.', 'The directory \'/config\' has missing write permissions.');
 | 
						|
		return;
 | 
						|
	}
 | 
						|
 | 
						|
	foreach ($profiles as $profile) {
 | 
						|
		// upgrade PDF configs
 | 
						|
		$dir = '../config/pdf/' . $profile;
 | 
						|
		if (!file_exists($dir)) {
 | 
						|
			recursiveCopy('../config/pdf/', $dir, $profiles);
 | 
						|
		}
 | 
						|
 | 
						|
		// upgrade profiles configs
 | 
						|
		$dir = '../config/profiles/' . $profile;
 | 
						|
		if (!file_exists($dir)) {
 | 
						|
			recursiveCopy('../config/profiles/', $dir, $profiles);
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	// delete old files
 | 
						|
	recursiveDelete('../config/pdf', $profiles);
 | 
						|
	recursiveDelete('../config/profiles', $profiles);
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
 * Copy a file or recursively copy a directory
 | 
						|
 *
 | 
						|
 * @param string $src - source path to file or directory
 | 
						|
 * @param string $dst - destination path to file or directory
 | 
						|
 * @param array $profiles - server profiles (used to avoid copying of newly created folders)
 | 
						|
 * @param string $fileFilter copy only files that start with the given filter
 | 
						|
 * @param boolean $overwrite overwrite existing files
 | 
						|
 */
 | 
						|
function recursiveCopy($src, $dst, $profiles, $fileFilter = null, $overwrite = true) {
 | 
						|
	$dir = @opendir($src);
 | 
						|
	if (!file_exists($dst)) {
 | 
						|
		$tmpState = @mkdir($dst, 0700, true);
 | 
						|
		if ($tmpState === false) {
 | 
						|
			StatusMessage('ERROR', 'Upgrade failed.', 'The directory \'' . $dst . '\' could not be created.');
 | 
						|
		}
 | 
						|
	}
 | 
						|
	while (false !== ($file = @readdir($dir))) {
 | 
						|
		if ($file != '.'  && $file != '..'  && !in_array($file, $profiles)) {
 | 
						|
			if (is_dir($src . '/' . $file) && ($file == 'logos')) {
 | 
						|
				recursiveCopy($src . '/' . $file, $dst . '/' . $file, $profiles, $fileFilter, $overwrite);
 | 
						|
			}
 | 
						|
			elseif ((isset($fileFilter) && (strpos($file, $fileFilter) === 0 || $file == '.htaccess'))
 | 
						|
						|| (!isset($fileFilter))) {
 | 
						|
				if (!is_file($src . '/' . $file) || ($file == '.gitignore')) {
 | 
						|
					continue;
 | 
						|
				}
 | 
						|
				if ($overwrite || !file_exists($dst . '/' . $file)) {
 | 
						|
					$tmpState = @copy($src . '/' . $file, $dst . '/' . $file);
 | 
						|
					if ($tmpState === false) {
 | 
						|
						StatusMessage('ERROR', 'Upgrade failed.', 'The file ' . $file . ' could not be copied.');
 | 
						|
					}
 | 
						|
				}
 | 
						|
			}
 | 
						|
		}
 | 
						|
	}
 | 
						|
	closedir($dir);
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
/**
 | 
						|
 * Delete a file or recursively delete a directory
 | 
						|
 *
 | 
						|
 * @param string $src - path to file or directory
 | 
						|
 * @param array $profiles - server profiles (used to avoid copying of newly created folders)
 | 
						|
 */
 | 
						|
function recursiveDelete($src, $profiles) {
 | 
						|
	if (is_file($src)) {
 | 
						|
		$tmpState = @unlink($src);
 | 
						|
		if ($tmpState === false) {
 | 
						|
			StatusMessage('ERROR', 'Upgrade failed.', 'The file ' . $src . ' could not be deleted.');
 | 
						|
		}
 | 
						|
		return;
 | 
						|
	} else if (is_dir($src) && is_writable($src)) {
 | 
						|
		$dir = @opendir($src);
 | 
						|
		while (false !== ($path = readdir($dir))) {
 | 
						|
			if ($path != '.'  && $path != '..' && !in_array($path, $profiles)) {
 | 
						|
				recursiveDelete($src . '/' . $path, $profiles);
 | 
						|
			}
 | 
						|
		}
 | 
						|
		@closedir($dir);
 | 
						|
 | 
						|
		if ($src != '../config/pdf' && $src != '../config/profiles') {
 | 
						|
			$tmpState = @rmdir($src);
 | 
						|
			if ($tmpState === false) {
 | 
						|
				StatusMessage('ERROR', 'Upgrade failed.', 'The directory ' . $src . ' could not be deleted.');
 | 
						|
			}
 | 
						|
		}
 | 
						|
		return;
 | 
						|
	} else {
 | 
						|
		StatusMessage('ERROR', 'Upgrade failed.', 'The directory ' . $src . ' has missing write permissions.');
 | 
						|
		return;
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
?>
 |