xref: /dokuwiki/inc/farm.php (revision 13054fbf5e7e9dd2c2544a358603cd8f195f9996)
1*13054fbfSAnika Henke<?php
2*13054fbfSAnika Henke/**
3*13054fbfSAnika Henke * This overwrites DOKU_CONF. Each animal gets its own configuration and data directory.
4*13054fbfSAnika Henke * This can be used together with preload.php. See preload.php.dist for an example setup.
5*13054fbfSAnika Henke * For more information see http://www.dokuwiki.org/farms.
6*13054fbfSAnika Henke *
7*13054fbfSAnika Henke * The farm directory (constant DOKU_FARMDIR) can be any directory and needs to be set.
8*13054fbfSAnika Henke * Animals are direct subdirectories of the farm directory.
9*13054fbfSAnika Henke * There are two different approaches:
10*13054fbfSAnika Henke *  * An .htaccess based setup can use any animal directory name:
11*13054fbfSAnika Henke *    http://example.org/<path_to_farm>/subdir/ will need the subdirectory '$farm/subdir/'.
12*13054fbfSAnika Henke *  * A virtual host based setup needs animal directory names which have to reflect
13*13054fbfSAnika Henke *    the domain name: If an animal resides in http://www.example.org:8080/mysite/test/,
14*13054fbfSAnika Henke *    directories that will match range from '$farm/8080.www.example.org.mysite.test/'
15*13054fbfSAnika Henke *    to a simple '$farm/domain/'.
16*13054fbfSAnika Henke *
17*13054fbfSAnika Henke * @author Anika Henke <anika@selfthinker.org>
18*13054fbfSAnika Henke * @author Michael Klier <chi@chimeric.de>
19*13054fbfSAnika Henke * @author Christopher Smith <chris@jalakai.co.uk>
20*13054fbfSAnika Henke * @author virtual host part of farm_confpath() based on conf_path() from Drupal.org's /includes/bootstrap.inc
21*13054fbfSAnika Henke *   (see https://github.com/drupal/drupal/blob/7.x/includes/bootstrap.inc#L537)
22*13054fbfSAnika Henke * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
23*13054fbfSAnika Henke */
24*13054fbfSAnika Henke
25*13054fbfSAnika 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)
26*13054fbfSAnika Henkeif(!defined('DOKU_FARMDIR')) define('DOKU_FARMDIR', fullpath(dirname(__FILE__).'/../').'/');
27*13054fbfSAnika Henkeif(!defined('DOKU_CONF')) define('DOKU_CONF', farm_confpath(DOKU_FARMDIR));
28*13054fbfSAnika Henkeif(!defined('DOKU_FARM')) define('DOKU_FARM', false);
29*13054fbfSAnika Henke
30*13054fbfSAnika Henke
31*13054fbfSAnika Henke/**
32*13054fbfSAnika Henke * Find the appropriate configuration directory.
33*13054fbfSAnika Henke *
34*13054fbfSAnika Henke * If the .htaccess based setup is used, the configuration directory can be
35*13054fbfSAnika Henke * any subdirectory of the farm directory.
36*13054fbfSAnika Henke *
37*13054fbfSAnika Henke * Otherwise try finding a matching configuration directory by stripping the
38*13054fbfSAnika Henke * website's hostname from left to right and pathname from right to left. The
39*13054fbfSAnika Henke * first configuration file found will be used; the remaining will ignored.
40*13054fbfSAnika Henke * If no configuration file is found, return the default confdir './conf'.
41*13054fbfSAnika Henke */
42*13054fbfSAnika Henkefunction farm_confpath($farm) {
43*13054fbfSAnika Henke
44*13054fbfSAnika Henke    // htaccess based or cli
45*13054fbfSAnika Henke    // cli usage example: animal=your_animal bin/indexer.php
46*13054fbfSAnika Henke    if(isset($_REQUEST['animal']) || ('cli' == php_sapi_name() && isset($_SERVER['animal']))) {
47*13054fbfSAnika Henke        $mode = isset($_REQUEST['animal']) ? 'htaccess' : 'cli';
48*13054fbfSAnika Henke        $animal = $mode == 'htaccess' ? $_REQUEST['animal'] : $_SERVER['animal'];
49*13054fbfSAnika Henke        // check that $animal is a string and just a directory name and not a path
50*13054fbfSAnika Henke        if (!is_string($animal) || strpbrk($animal, '\\/') !== false)
51*13054fbfSAnika Henke            nice_die('Sorry! Invalid animal name!');
52*13054fbfSAnika Henke        if(!is_dir($farm.'/'.$animal))
53*13054fbfSAnika Henke            nice_die("Sorry! This Wiki doesn't exist!");
54*13054fbfSAnika Henke        if(!defined('DOKU_FARM')) define('DOKU_FARM', $mode);
55*13054fbfSAnika Henke        return $farm.'/'.$animal.'/conf/';
56*13054fbfSAnika Henke    }
57*13054fbfSAnika Henke
58*13054fbfSAnika Henke    // virtual host based
59*13054fbfSAnika Henke    $uri = explode('/', $_SERVER['SCRIPT_NAME'] ? $_SERVER['SCRIPT_NAME'] : $_SERVER['SCRIPT_FILENAME']);
60*13054fbfSAnika Henke    $server = explode('.', implode('.', array_reverse(explode(':', rtrim($_SERVER['HTTP_HOST'], '.')))));
61*13054fbfSAnika Henke    for ($i = count($uri) - 1; $i > 0; $i--) {
62*13054fbfSAnika Henke        for ($j = count($server); $j > 0; $j--) {
63*13054fbfSAnika Henke            $dir = implode('.', array_slice($server, -$j)) . implode('.', array_slice($uri, 0, $i));
64*13054fbfSAnika Henke            if(is_dir("$farm/$dir/conf/")) {
65*13054fbfSAnika Henke                if(!defined('DOKU_FARM')) define('DOKU_FARM', 'virtual');
66*13054fbfSAnika Henke                return "$farm/$dir/conf/";
67*13054fbfSAnika Henke            }
68*13054fbfSAnika Henke        }
69*13054fbfSAnika Henke    }
70*13054fbfSAnika Henke
71*13054fbfSAnika Henke    // default conf directory in farm
72*13054fbfSAnika Henke    if(is_dir("$farm/default/conf/")) {
73*13054fbfSAnika Henke        if(!defined('DOKU_FARM')) define('DOKU_FARM', 'default');
74*13054fbfSAnika Henke        return "$farm/default/conf/";
75*13054fbfSAnika Henke    }
76*13054fbfSAnika Henke    // farmer
77*13054fbfSAnika Henke    return DOKU_INC.'conf/';
78*13054fbfSAnika Henke}
79*13054fbfSAnika Henke
80*13054fbfSAnika Henke/* Use default config files and local animal config files */
81*13054fbfSAnika Henke$config_cascade = array(
82*13054fbfSAnika Henke    'main' => array(
83*13054fbfSAnika Henke        'default'   => array(DOKU_INC.'conf/dokuwiki.php'),
84*13054fbfSAnika Henke        'local'     => array(DOKU_CONF.'local.php'),
85*13054fbfSAnika Henke        'protected' => array(DOKU_CONF.'local.protected.php'),
86*13054fbfSAnika Henke    ),
87*13054fbfSAnika Henke    'acronyms'  => array(
88*13054fbfSAnika Henke        'default'   => array(DOKU_INC.'conf/acronyms.conf'),
89*13054fbfSAnika Henke        'local'     => array(DOKU_CONF.'acronyms.local.conf'),
90*13054fbfSAnika Henke    ),
91*13054fbfSAnika Henke    'entities'  => array(
92*13054fbfSAnika Henke        'default'   => array(DOKU_INC.'conf/entities.conf'),
93*13054fbfSAnika Henke        'local'     => array(DOKU_CONF.'entities.local.conf'),
94*13054fbfSAnika Henke    ),
95*13054fbfSAnika Henke    'interwiki' => array(
96*13054fbfSAnika Henke        'default'   => array(DOKU_INC.'conf/interwiki.conf'),
97*13054fbfSAnika Henke        'local'     => array(DOKU_CONF.'interwiki.local.conf'),
98*13054fbfSAnika Henke    ),
99*13054fbfSAnika Henke    'license' => array(
100*13054fbfSAnika Henke        'default'   => array(DOKU_INC.'conf/license.php'),
101*13054fbfSAnika Henke        'local'     => array(DOKU_CONF.'license.local.php'),
102*13054fbfSAnika Henke    ),
103*13054fbfSAnika Henke    'mediameta' => array(
104*13054fbfSAnika Henke        'default'   => array(DOKU_INC.'conf/mediameta.php'),
105*13054fbfSAnika Henke        'local'     => array(DOKU_CONF.'mediameta.local.php'),
106*13054fbfSAnika Henke    ),
107*13054fbfSAnika Henke    'mime'      => array(
108*13054fbfSAnika Henke        'default'   => array(DOKU_INC.'conf/mime.conf'),
109*13054fbfSAnika Henke        'local'     => array(DOKU_CONF.'mime.local.conf'),
110*13054fbfSAnika Henke    ),
111*13054fbfSAnika Henke    'scheme'    => array(
112*13054fbfSAnika Henke        'default'   => array(DOKU_INC.'conf/scheme.conf'),
113*13054fbfSAnika Henke        'local'     => array(DOKU_CONF.'scheme.local.conf'),
114*13054fbfSAnika Henke    ),
115*13054fbfSAnika Henke    'smileys'   => array(
116*13054fbfSAnika Henke        'default'   => array(DOKU_INC.'conf/smileys.conf'),
117*13054fbfSAnika Henke        'local'     => array(DOKU_CONF.'smileys.local.conf'),
118*13054fbfSAnika Henke    ),
119*13054fbfSAnika Henke    'wordblock' => array(
120*13054fbfSAnika Henke        'default'   => array(DOKU_INC.'conf/wordblock.conf'),
121*13054fbfSAnika Henke        'local'     => array(DOKU_CONF.'wordblock.local.conf'),
122*13054fbfSAnika Henke    ),
123*13054fbfSAnika Henke    'acl'       => array(
124*13054fbfSAnika Henke        'default'   => DOKU_CONF.'acl.auth.php',
125*13054fbfSAnika Henke    ),
126*13054fbfSAnika Henke    'plainauth.users' => array(
127*13054fbfSAnika Henke        'default'   => DOKU_CONF.'users.auth.php',
128*13054fbfSAnika Henke    ),
129*13054fbfSAnika Henke    'plugins' => array( // needed since Angua
130*13054fbfSAnika Henke        'default'   => array(DOKU_INC.'conf/plugins.php'),
131*13054fbfSAnika Henke        'local'     => array(DOKU_CONF.'plugins.local.php'),
132*13054fbfSAnika Henke        'protected' => array(
133*13054fbfSAnika Henke            DOKU_INC.'conf/plugins.required.php',
134*13054fbfSAnika Henke            DOKU_CONF.'plugins.protected.php',
135*13054fbfSAnika Henke        ),
136*13054fbfSAnika Henke    ),
137*13054fbfSAnika Henke    'userstyle' => array(
138*13054fbfSAnika Henke        'screen'  => DOKU_CONF.'userstyle.css',
139*13054fbfSAnika Henke        'print'   => DOKU_CONF.'userprint.css',
140*13054fbfSAnika Henke        'feed'    => DOKU_CONF.'userfeed.css',
141*13054fbfSAnika Henke        'all'     => DOKU_CONF.'userall.css',
142*13054fbfSAnika Henke    ),
143*13054fbfSAnika Henke    'userscript' => array(
144*13054fbfSAnika Henke        'default' => DOKU_CONF.'userscript.js'
145*13054fbfSAnika Henke    ),
146*13054fbfSAnika Henke);
147