xref: /dokuwiki/inc/farm.php (revision 090f83d33e04d9dfa5a75e6229b19bfab29b7b51)
113054fbfSAnika Henke<?php
213054fbfSAnika Henke/**
313054fbfSAnika Henke * This overwrites DOKU_CONF. Each animal gets its own configuration and data directory.
413054fbfSAnika Henke * This can be used together with preload.php. See preload.php.dist for an example setup.
513054fbfSAnika Henke * For more information see http://www.dokuwiki.org/farms.
613054fbfSAnika Henke *
713054fbfSAnika Henke * The farm directory (constant DOKU_FARMDIR) can be any directory and needs to be set.
813054fbfSAnika Henke * Animals are direct subdirectories of the farm directory.
913054fbfSAnika Henke * There are two different approaches:
1013054fbfSAnika Henke *  * An .htaccess based setup can use any animal directory name:
1113054fbfSAnika Henke *    http://example.org/<path_to_farm>/subdir/ will need the subdirectory '$farm/subdir/'.
1213054fbfSAnika Henke *  * A virtual host based setup needs animal directory names which have to reflect
1313054fbfSAnika Henke *    the domain name: If an animal resides in http://www.example.org:8080/mysite/test/,
1413054fbfSAnika Henke *    directories that will match range from '$farm/8080.www.example.org.mysite.test/'
1513054fbfSAnika Henke *    to a simple '$farm/domain/'.
1613054fbfSAnika Henke *
1713054fbfSAnika Henke * @author Anika Henke <anika@selfthinker.org>
1813054fbfSAnika Henke * @author Michael Klier <chi@chimeric.de>
1913054fbfSAnika Henke * @author Christopher Smith <chris@jalakai.co.uk>
2013054fbfSAnika Henke * @author virtual host part of farm_confpath() based on conf_path() from Drupal.org's /includes/bootstrap.inc
2113054fbfSAnika Henke *   (see https://github.com/drupal/drupal/blob/7.x/includes/bootstrap.inc#L537)
2213054fbfSAnika Henke * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
2313054fbfSAnika Henke */
2413054fbfSAnika Henke
2513054fbfSAnika Henke// DOKU_FARMDIR needs to be set in preload.php, here the fallback is the same as DOKU_INC would be (if it was set already)
2613054fbfSAnika Henkeif(!defined('DOKU_FARMDIR')) define('DOKU_FARMDIR', fullpath(dirname(__FILE__).'/../').'/');
2713054fbfSAnika Henkeif(!defined('DOKU_CONF')) define('DOKU_CONF', farm_confpath(DOKU_FARMDIR));
2813054fbfSAnika Henkeif(!defined('DOKU_FARM')) define('DOKU_FARM', false);
2913054fbfSAnika Henke
3013054fbfSAnika Henke
3113054fbfSAnika Henke/**
3213054fbfSAnika Henke * Find the appropriate configuration directory.
3313054fbfSAnika Henke *
3413054fbfSAnika Henke * If the .htaccess based setup is used, the configuration directory can be
3513054fbfSAnika Henke * any subdirectory of the farm directory.
3613054fbfSAnika Henke *
3713054fbfSAnika Henke * Otherwise try finding a matching configuration directory by stripping the
3813054fbfSAnika Henke * website's hostname from left to right and pathname from right to left. The
3913054fbfSAnika Henke * first configuration file found will be used; the remaining will ignored.
4013054fbfSAnika Henke * If no configuration file is found, return the default confdir './conf'.
4113054fbfSAnika Henke */
4213054fbfSAnika Henkefunction farm_confpath($farm) {
4313054fbfSAnika Henke
4413054fbfSAnika Henke    // htaccess based or cli
4513054fbfSAnika Henke    // cli usage example: animal=your_animal bin/indexer.php
4613054fbfSAnika Henke    if(isset($_REQUEST['animal']) || ('cli' == php_sapi_name() && isset($_SERVER['animal']))) {
4713054fbfSAnika Henke        $mode = isset($_REQUEST['animal']) ? 'htaccess' : 'cli';
4813054fbfSAnika Henke        $animal = $mode == 'htaccess' ? $_REQUEST['animal'] : $_SERVER['animal'];
4913054fbfSAnika Henke        // check that $animal is a string and just a directory name and not a path
5013054fbfSAnika Henke        if (!is_string($animal) || strpbrk($animal, '\\/') !== false)
5113054fbfSAnika Henke            nice_die('Sorry! Invalid animal name!');
5213054fbfSAnika Henke        if(!is_dir($farm.'/'.$animal))
5313054fbfSAnika Henke            nice_die("Sorry! This Wiki doesn't exist!");
5413054fbfSAnika Henke        if(!defined('DOKU_FARM')) define('DOKU_FARM', $mode);
5513054fbfSAnika Henke        return $farm.'/'.$animal.'/conf/';
5613054fbfSAnika Henke    }
5713054fbfSAnika Henke
5813054fbfSAnika Henke    // virtual host based
5913054fbfSAnika Henke    $uri = explode('/', $_SERVER['SCRIPT_NAME'] ? $_SERVER['SCRIPT_NAME'] : $_SERVER['SCRIPT_FILENAME']);
6013054fbfSAnika Henke    $server = explode('.', implode('.', array_reverse(explode(':', rtrim($_SERVER['HTTP_HOST'], '.')))));
6113054fbfSAnika Henke    for ($i = count($uri) - 1; $i > 0; $i--) {
6213054fbfSAnika Henke        for ($j = count($server); $j > 0; $j--) {
6313054fbfSAnika Henke            $dir = implode('.', array_slice($server, -$j)) . implode('.', array_slice($uri, 0, $i));
6413054fbfSAnika Henke            if(is_dir("$farm/$dir/conf/")) {
6513054fbfSAnika Henke                if(!defined('DOKU_FARM')) define('DOKU_FARM', 'virtual');
6613054fbfSAnika Henke                return "$farm/$dir/conf/";
6713054fbfSAnika Henke            }
6813054fbfSAnika Henke        }
6913054fbfSAnika Henke    }
7013054fbfSAnika Henke
7113054fbfSAnika Henke    // default conf directory in farm
7213054fbfSAnika Henke    if(is_dir("$farm/default/conf/")) {
7313054fbfSAnika Henke        if(!defined('DOKU_FARM')) define('DOKU_FARM', 'default');
7413054fbfSAnika Henke        return "$farm/default/conf/";
7513054fbfSAnika Henke    }
7613054fbfSAnika Henke    // farmer
7713054fbfSAnika Henke    return DOKU_INC.'conf/';
7813054fbfSAnika Henke}
7913054fbfSAnika Henke
8013054fbfSAnika Henke/* Use default config files and local animal config files */
8113054fbfSAnika Henke$config_cascade = array(
8213054fbfSAnika Henke    'main' => array(
8313054fbfSAnika Henke        'default'   => array(DOKU_INC.'conf/dokuwiki.php'),
8413054fbfSAnika Henke        'local'     => array(DOKU_CONF.'local.php'),
8513054fbfSAnika Henke        'protected' => array(DOKU_CONF.'local.protected.php'),
8613054fbfSAnika Henke    ),
8713054fbfSAnika Henke    'acronyms'  => array(
8813054fbfSAnika Henke        'default'   => array(DOKU_INC.'conf/acronyms.conf'),
8913054fbfSAnika Henke        'local'     => array(DOKU_CONF.'acronyms.local.conf'),
9013054fbfSAnika Henke    ),
9113054fbfSAnika Henke    'entities'  => array(
9213054fbfSAnika Henke        'default'   => array(DOKU_INC.'conf/entities.conf'),
9313054fbfSAnika Henke        'local'     => array(DOKU_CONF.'entities.local.conf'),
9413054fbfSAnika Henke    ),
9513054fbfSAnika Henke    'interwiki' => array(
9613054fbfSAnika Henke        'default'   => array(DOKU_INC.'conf/interwiki.conf'),
9713054fbfSAnika Henke        'local'     => array(DOKU_CONF.'interwiki.local.conf'),
9813054fbfSAnika Henke    ),
9913054fbfSAnika Henke    'license' => array(
10013054fbfSAnika Henke        'default'   => array(DOKU_INC.'conf/license.php'),
10113054fbfSAnika Henke        'local'     => array(DOKU_CONF.'license.local.php'),
10213054fbfSAnika Henke    ),
10313054fbfSAnika Henke    'mediameta' => array(
10413054fbfSAnika Henke        'default'   => array(DOKU_INC.'conf/mediameta.php'),
10513054fbfSAnika Henke        'local'     => array(DOKU_CONF.'mediameta.local.php'),
10613054fbfSAnika Henke    ),
10713054fbfSAnika Henke    'mime'      => array(
10813054fbfSAnika Henke        'default'   => array(DOKU_INC.'conf/mime.conf'),
10913054fbfSAnika Henke        'local'     => array(DOKU_CONF.'mime.local.conf'),
11013054fbfSAnika Henke    ),
11113054fbfSAnika Henke    'scheme'    => array(
11213054fbfSAnika Henke        'default'   => array(DOKU_INC.'conf/scheme.conf'),
11313054fbfSAnika Henke        'local'     => array(DOKU_CONF.'scheme.local.conf'),
11413054fbfSAnika Henke    ),
11513054fbfSAnika Henke    'smileys'   => array(
11613054fbfSAnika Henke        'default'   => array(DOKU_INC.'conf/smileys.conf'),
11713054fbfSAnika Henke        'local'     => array(DOKU_CONF.'smileys.local.conf'),
11813054fbfSAnika Henke    ),
11913054fbfSAnika Henke    'wordblock' => array(
12013054fbfSAnika Henke        'default'   => array(DOKU_INC.'conf/wordblock.conf'),
12113054fbfSAnika Henke        'local'     => array(DOKU_CONF.'wordblock.local.conf'),
12213054fbfSAnika Henke    ),
12313054fbfSAnika Henke    'acl'       => array(
12413054fbfSAnika Henke        'default'   => DOKU_CONF.'acl.auth.php',
12513054fbfSAnika Henke    ),
12613054fbfSAnika Henke    'plainauth.users' => array(
12713054fbfSAnika Henke        'default'   => DOKU_CONF.'users.auth.php',
12813054fbfSAnika Henke    ),
12913054fbfSAnika Henke    'plugins' => array( // needed since Angua
13013054fbfSAnika Henke        'default'   => array(DOKU_INC.'conf/plugins.php'),
13113054fbfSAnika Henke        'local'     => array(DOKU_CONF.'plugins.local.php'),
13213054fbfSAnika Henke        'protected' => array(
13313054fbfSAnika Henke            DOKU_INC.'conf/plugins.required.php',
13413054fbfSAnika Henke            DOKU_CONF.'plugins.protected.php',
13513054fbfSAnika Henke        ),
13613054fbfSAnika Henke    ),
13713054fbfSAnika Henke    'userstyle' => array(
138*090f83d3SMichael Hamann        'screen'    => array(DOKU_CONF . 'userstyle.css', DOKU_CONF . 'userstyle.less'),
139*090f83d3SMichael Hamann        'print'     => array(DOKU_CONF . 'userprint.css', DOKU_CONF . 'userprint.less'),
140*090f83d3SMichael Hamann        'feed'      => array(DOKU_CONF . 'userfeed.css', DOKU_CONF . 'userfeed.less'),
141*090f83d3SMichael Hamann        'all'       => array(DOKU_CONF . 'userall.css', DOKU_CONF . 'userall.less')
14213054fbfSAnika Henke    ),
14313054fbfSAnika Henke    'userscript' => array(
144*090f83d3SMichael Hamann        'default'   => array(DOKU_CONF . 'userscript.js')
14513054fbfSAnika Henke    ),
14613054fbfSAnika Henke);
147