<?php
/*
+--------------------------------------------------------------------+
- | CiviCRM version 4.3 |
+ | CiviCRM version 4.4 |
+--------------------------------------------------------------------+
| Copyright CiviCRM LLC (c) 2004-2013 |
+--------------------------------------------------------------------+
*
* @param string $dir the directory to be secured
*/
- static function restrictAccess($dir) {
+ static function restrictAccess($dir, $overwrite = FALSE) {
// note: empty value for $dir can play havoc, since that might result in putting '.htaccess' to root dir
// of site, causing site to stop functioning.
// FIXME: we should do more checks here -
- if (!empty($dir)) {
+ if (!empty($dir) && is_dir($dir)) {
$htaccess = <<<HTACCESS
<Files "*">
Order allow,deny
HTACCESS;
$file = $dir . '.htaccess';
- if (file_put_contents($file, $htaccess) === FALSE) {
- CRM_Core_Error::movedSiteError($file);
+ if ($overwrite || !file_exists($file)) {
+ if (file_put_contents($file, $htaccess) === FALSE) {
+ CRM_Core_Error::movedSiteError($file);
+ }
+ }
+ }
+ }
+
+ /**
+ * Restrict remote users from browsing the given directory.
+ *
+ * @param $publicDir
+ */
+ static function restrictBrowsing($publicDir) {
+ if (!is_dir($publicDir) || !is_writable($publicDir)) {
+ return;
+ }
+
+ // base dir
+ $nobrowse = realpath($publicDir) . '/index.html';
+ if (!file_exists($nobrowse)) {
+ @file_put_contents($nobrowse, '');
+ }
+
+ // child dirs
+ $dir = new RecursiveDirectoryIterator($publicDir);
+ foreach ($dir as $name => $object) {
+ if (is_dir($name) && $name != '..') {
+ $nobrowse = realpath($name) . '/index.html';
+ if (!file_exists($nobrowse)) {
+ @file_put_contents($nobrowse, '');
+ }
}
}
}
}
/**
- * Search directory tree for files which match a glob pattern
+ * Search directory tree for files which match a glob pattern.
+ *
+ * Note: Dot-directories (like "..", ".git", or ".svn") will be ignored.
*
* @param $dir string, base dir
* @param $pattern string, glob pattern, eg "*.txt"
$result = array();
while (!empty($todos)) {
$subdir = array_shift($todos);
- foreach (glob("$subdir/$pattern") as $match) {
- if (!is_dir($match)) {
- $result[] = $match;
+ $matches = glob("$subdir/$pattern");
+ if (is_array($matches)) {
+ foreach ($matches as $match) {
+ if (!is_dir($match)) {
+ $result[] = $match;
+ }
}
}
$dh = opendir($subdir);
if ($dh) {
while (FALSE !== ($entry = readdir($dh))) {
$path = $subdir . DIRECTORY_SEPARATOR . $entry;
- if ($entry == '.' || $entry == '..' || $entry == '.svn') {
+ if ($entry{0} == '.') {
+ // ignore
} elseif (is_dir($path)) {
$todos[] = $path;
}