xref: /dokuwiki/install.php (revision a672ef756673fe699e0bacd528ef2a880da4c20b)
15cfb8815Schris<?php
2ac251797SAndreas Gohr/*><div style="width:60%; margin: auto; background-color: #fcc;
3ac251797SAndreas Gohr                border: 1px solid #faa; padding: 0.5em 1em;">
4ac251797SAndreas Gohr    <h1 style="font-size: 120%">No PHP Support</h1>
5ac251797SAndreas Gohr
6ac251797SAndreas Gohr    It seems this server has no PHP support enabled. You will need to
7ac251797SAndreas Gohr    enable PHP before you can install and run DokuWiki. Contact your hosting
8ac251797SAndreas Gohr    provider if you're unsure what this means.
9ac251797SAndreas Gohr
10ac251797SAndreas Gohr</div>*/
115cfb8815Schris/**
125cfb8815Schris * Dokuwiki installation assistance
135cfb8815Schris *
145cfb8815Schris * @author      Chris Smith <chris@jalakai.co.uk>
155cfb8815Schris */
165cfb8815Schris
17d0a27cb0SAndreas Gohrif(!defined('DOKU_INC')) define('DOKU_INC',dirname(__FILE__).'/');
185cfb8815Schrisif(!defined('DOKU_CONF')) define('DOKU_CONF',DOKU_INC.'conf/');
195cfb8815Schrisif(!defined('DOKU_LOCAL')) define('DOKU_LOCAL',DOKU_INC.'conf/');
205cfb8815Schris
2102bca5d4SYousong Zhou// load and initialize the core system
2202bca5d4SYousong Zhourequire_once(DOKU_INC.'inc/init.php');
233791b589SAndreas Gohr
243545b2e0Schris// check for error reporting override or set error reporting to sane values
253545b2e0Schrisif (!defined('DOKU_E_LEVEL')) { error_reporting(E_ALL ^ E_NOTICE); }
263545b2e0Schriselse { error_reporting(DOKU_E_LEVEL); }
273545b2e0Schris
2847248316SAndreas Gohr// language strings
2947248316SAndreas Gohrrequire_once(DOKU_INC.'inc/lang/en/lang.php');
304b530faaSTom N Harrisif(isset($_REQUEST['l']) && !is_array($_REQUEST['l'])) {
3147248316SAndreas Gohr    $LC = preg_replace('/[^a-z\-]+/','',$_REQUEST['l']);
324b530faaSTom N Harris}
334b530faaSTom N Harrisif(empty($LC)) $LC = 'en';
3447248316SAndreas Gohrif($LC && $LC != 'en' ) {
3547248316SAndreas Gohr    require_once(DOKU_INC.'inc/lang/'.$LC.'/lang.php');
3647248316SAndreas Gohr}
3747248316SAndreas Gohr
3847248316SAndreas Gohr// initialise variables ...
3947248316SAndreas Gohr$error = array();
4047248316SAndreas Gohr
4147248316SAndreas Gohr// begin output
4247248316SAndreas Gohrheader('Content-Type: text/html; charset=utf-8');
4347248316SAndreas Gohr?>
44c8839c22SAnika Henke<!DOCTYPE html>
45c8839c22SAnika Henke<html lang="<?php echo $LC?>" dir="<?php echo $lang['direction']?>">
4647248316SAndreas Gohr<head>
47c8839c22SAnika Henke    <meta charset="utf-8" />
484208c142SAndreas Gohr    <title><?php echo $lang['i_installer']?></title>
4947248316SAndreas Gohr    <style type="text/css">
5047248316SAndreas Gohr        body { width: 90%; margin: 0 auto; font: 84% Verdana, Helvetica, Arial, sans-serif; }
5147248316SAndreas Gohr        img { border: none }
5247248316SAndreas Gohr        br.cl { clear:both; }
5370a6aa16Schris        code { font-size: 110%; color: #800000; }
5447248316SAndreas Gohr        fieldset { border: none }
559c70688aSchris        label { display: block; margin-top: 0.5em; }
568af2e4bbSAndreas Gohr        select.text, input.text { width: 30em; margin: 0 0.5em; }
5706361442SAndreas Gohr        a {text-decoration: none}
5847248316SAndreas Gohr    </style>
59e260f93bSAnika Henke    <script type="text/javascript">
6047248316SAndreas Gohr        function acltoggle(){
6147248316SAndreas Gohr            var cb = document.getElementById('acl');
6247248316SAndreas Gohr            var fs = document.getElementById('acldep');
6347248316SAndreas Gohr            if(!cb || !fs) return;
6447248316SAndreas Gohr            if(cb.checked){
6547248316SAndreas Gohr                fs.style.display = '';
6647248316SAndreas Gohr            }else{
6747248316SAndreas Gohr                fs.style.display = 'none';
6847248316SAndreas Gohr            }
6947248316SAndreas Gohr        }
7047248316SAndreas Gohr        window.onload = function(){
7147248316SAndreas Gohr            acltoggle();
7247248316SAndreas Gohr            var cb = document.getElementById('acl');
7347248316SAndreas Gohr            if(cb) cb.onchange = acltoggle;
7447248316SAndreas Gohr        };
7547248316SAndreas Gohr    </script>
7647248316SAndreas Gohr</head>
7747248316SAndreas Gohr<body style="">
7847248316SAndreas Gohr    <h1 style="float:left">
79c5270434SAndreas Gohr        <img src="lib/exe/fetch.php?media=wiki:dokuwiki-128.png"
80c5270434SAndreas Gohr             style="vertical-align: middle;" alt="" height="64" width="64" />
8147248316SAndreas Gohr        <?php echo $lang['i_installer']?>
8247248316SAndreas Gohr    </h1>
8347248316SAndreas Gohr    <div style="float:right; margin: 1em;">
8447248316SAndreas Gohr        <?php langsel()?>
8547248316SAndreas Gohr    </div>
8647248316SAndreas Gohr    <br class="cl" />
8747248316SAndreas Gohr
8847248316SAndreas Gohr    <div style="float: right; width: 34%;">
8947248316SAndreas Gohr        <?php
9079e79377SAndreas Gohr            if(file_exists(DOKU_INC.'inc/lang/'.$LC.'/install.html')){
9147248316SAndreas Gohr                include(DOKU_INC.'inc/lang/'.$LC.'/install.html');
9247248316SAndreas Gohr            }else{
93ca64d724Schris                print "<div lang=\"en\" dir=\"ltr\">\n";
9447248316SAndreas Gohr                include(DOKU_INC.'inc/lang/en/install.html');
95ca64d724Schris                print "</div>\n";
9647248316SAndreas Gohr            }
9747248316SAndreas Gohr        ?>
983cd83762SDeathCamel57        <a style="background: transparent url(data/dont-panic-if-you-see-this-in-your-logs-it-means-your-directory-permissions-are-correct.png) left top no-repeat;
99c8b43921SAndreas Gohr                  display: block; width:380px; height:73px; border:none; clear:both;"
100c8b43921SAndreas Gohr           target="_blank"
101c8b43921SAndreas Gohr           href="http://www.dokuwiki.org/security#web_access_security"></a>
10247248316SAndreas Gohr    </div>
10347248316SAndreas Gohr
10447248316SAndreas Gohr    <div style="float: left; width: 58%;">
10547248316SAndreas Gohr        <?php
1067ac1baa0SL. Ivanovich Harrison            try {
10747248316SAndreas Gohr                if(! (check_functions() && check_permissions()) ){
10847248316SAndreas Gohr                    echo '<p>'.$lang['i_problems'].'</p>';
10947248316SAndreas Gohr                    print_errors();
11070a6aa16Schris                    print_retry();
11147248316SAndreas Gohr                }elseif(!check_configs()){
11247248316SAndreas Gohr                    echo '<p>'.$lang['i_modified'].'</p>';
11347248316SAndreas Gohr                    print_errors();
1144b530faaSTom N Harris                }elseif(check_data($_REQUEST['d'])){
1154b530faaSTom N Harris                    // check_data has sanitized all input parameters
1164b530faaSTom N Harris                    if(!store_data($_REQUEST['d'])){
11747248316SAndreas Gohr                        echo '<p>'.$lang['i_failure'].'</p>';
11847248316SAndreas Gohr                        print_errors();
11947248316SAndreas Gohr                    }else{
12047248316SAndreas Gohr                        echo '<p>'.$lang['i_success'].'</p>';
12147248316SAndreas Gohr                    }
12247248316SAndreas Gohr                }else{
1234b530faaSTom N Harris                    print_errors();
12447248316SAndreas Gohr                    print_form($_REQUEST['d']);
12547248316SAndreas Gohr                }
1267ac1baa0SL. Ivanovich Harrison            } catch (Exception $e) {
1277ac1baa0SL. Ivanovich Harrison                echo 'Caught exception: ',  $e->getMessage(), "\n";
1287ac1baa0SL. Ivanovich Harrison            }
12947248316SAndreas Gohr        ?>
13047248316SAndreas Gohr    </div>
13147248316SAndreas Gohr
132c8b43921SAndreas Gohr
13347248316SAndreas Gohr<div style="clear: both">
134654436fbSAnika Henke  <a href="http://dokuwiki.org/"><img src="lib/tpl/dokuwiki/images/button-dw.png" alt="driven by DokuWiki" /></a>
13559752844SAnders Sandblad  <a href="http://php.net"><img src="lib/tpl/dokuwiki/images/button-php.gif" alt="powered by PHP" /></a>
13647248316SAndreas Gohr</div>
13747248316SAndreas Gohr</body>
13847248316SAndreas Gohr</html>
13947248316SAndreas Gohr<?php
14047248316SAndreas Gohr
14147248316SAndreas Gohr/**
14247248316SAndreas Gohr * Print the input form
143253d4b48SGerrit Uitslag *
144253d4b48SGerrit Uitslag * @param array $d submitted entry 'd' of request data
14547248316SAndreas Gohr */
14647248316SAndreas Gohrfunction print_form($d){
14747248316SAndreas Gohr    global $lang;
14847248316SAndreas Gohr    global $LC;
14947248316SAndreas Gohr
15006361442SAndreas Gohr    include(DOKU_CONF.'license.php');
15106361442SAndreas Gohr
15247248316SAndreas Gohr    if(!is_array($d)) $d = array();
15365cc1598SPhy    $d = array_map('hsc',$d);
15447248316SAndreas Gohr
15547248316SAndreas Gohr    if(!isset($d['acl'])) $d['acl']=1;
1563a0852d9SAndreas Gohr    if(!isset($d['pop'])) $d['pop']=1;
15747248316SAndreas Gohr
15847248316SAndreas Gohr    ?>
15947248316SAndreas Gohr    <form action="" method="post">
16047248316SAndreas Gohr    <input type="hidden" name="l" value="<?php echo $LC ?>" />
16147248316SAndreas Gohr    <fieldset>
16247248316SAndreas Gohr        <label for="title"><?php echo $lang['i_wikiname']?>
16347248316SAndreas Gohr        <input type="text" name="d[title]" id="title" value="<?php echo $d['title'] ?>" style="width: 20em;" />
16447248316SAndreas Gohr        </label>
16547248316SAndreas Gohr
16647248316SAndreas Gohr        <fieldset style="margin-top: 1em;">
16747248316SAndreas Gohr            <label for="acl">
16847248316SAndreas Gohr            <input type="checkbox" name="d[acl]" id="acl" <?php echo(($d['acl'] ? ' checked="checked"' : ''));?> />
16947248316SAndreas Gohr            <?php echo $lang['i_enableacl']?></label>
17047248316SAndreas Gohr
17147248316SAndreas Gohr            <fieldset id="acldep">
17247248316SAndreas Gohr                <label for="superuser"><?php echo $lang['i_superuser']?></label>
17347248316SAndreas Gohr                <input class="text" type="text" name="d[superuser]" id="superuser" value="<?php echo $d['superuser'] ?>" />
17447248316SAndreas Gohr
17547248316SAndreas Gohr                <label for="fullname"><?php echo $lang['fullname']?></label>
17647248316SAndreas Gohr                <input class="text" type="text" name="d[fullname]" id="fullname" value="<?php echo $d['fullname'] ?>" />
17747248316SAndreas Gohr
17847248316SAndreas Gohr                <label for="email"><?php echo $lang['email']?></label>
17947248316SAndreas Gohr                <input class="text" type="text" name="d[email]" id="email" value="<?php echo $d['email'] ?>" />
18047248316SAndreas Gohr
18147248316SAndreas Gohr                <label for="password"><?php echo $lang['pass']?></label>
18247248316SAndreas Gohr                <input class="text" type="password" name="d[password]" id="password" />
18347248316SAndreas Gohr
18447248316SAndreas Gohr                <label for="confirm"><?php echo $lang['passchk']?></label>
18547248316SAndreas Gohr                <input class="text" type="password" name="d[confirm]" id="confirm" />
1868af2e4bbSAndreas Gohr
1878af2e4bbSAndreas Gohr                <label for="policy"><?php echo $lang['i_policy']?></label>
1888af2e4bbSAndreas Gohr                <select class="text" name="d[policy]" id="policy">
1898af2e4bbSAndreas Gohr                    <option value="0" <?php echo ($d['policy'] == 0)?'selected="selected"':'' ?>><?php echo $lang['i_pol0']?></option>
1908af2e4bbSAndreas Gohr                    <option value="1" <?php echo ($d['policy'] == 1)?'selected="selected"':'' ?>><?php echo $lang['i_pol1']?></option>
1918af2e4bbSAndreas Gohr                    <option value="2" <?php echo ($d['policy'] == 2)?'selected="selected"':'' ?>><?php echo $lang['i_pol2']?></option>
1928af2e4bbSAndreas Gohr                </select>
19306361442SAndreas Gohr
194ab9346edSAnika Henke                <label for="allowreg">
195ab9346edSAnika Henke                    <input type="checkbox" name="d[allowreg]" id="allowreg" <?php echo(($d['allowreg'] ? ' checked="checked"' : ''));?> />
196ab9346edSAnika Henke                    <?php echo $lang['i_allowreg']?>
19774850f29SAnika Henke                </label>
19847248316SAndreas Gohr            </fieldset>
19947248316SAndreas Gohr        </fieldset>
20047248316SAndreas Gohr
20106361442SAndreas Gohr        <fieldset>
20206361442SAndreas Gohr            <p><?php echo $lang['i_license']?></p>
20306361442SAndreas Gohr            <?php
204b1730bd2STom N Harris            array_push($license,array('name' => $lang['i_license_none'], 'url'=>''));
205ed856534STom N Harris            if(empty($d['license'])) $d['license'] = 'cc-by-sa';
20606361442SAndreas Gohr            foreach($license as $key => $lic){
20706361442SAndreas Gohr                echo '<label for="lic_'.$key.'">';
20865cc1598SPhy                echo '<input type="radio" name="d[license]" value="'.hsc($key).'" id="lic_'.$key.'"'.
209b1730bd2STom N Harris                     (($d['license'] === $key)?' checked="checked"':'').'>';
21065cc1598SPhy                echo hsc($lic['name']);
21106361442SAndreas Gohr                if($lic['url']) echo ' <a href="'.$lic['url'].'" target="_blank"><sup>[?]</sup></a>';
21206361442SAndreas Gohr                echo '</label>';
21306361442SAndreas Gohr            }
21406361442SAndreas Gohr            ?>
21506361442SAndreas Gohr        </fieldset>
21606361442SAndreas Gohr
2173a0852d9SAndreas Gohr        <fieldset>
2183a0852d9SAndreas Gohr            <p><?php echo $lang['i_pop_field']?></p>
2193a0852d9SAndreas Gohr            <label for="pop">
2203a0852d9SAndreas Gohr                <input type="checkbox" name="d[pop]" id="pop" <?php echo(($d['pop'] ? ' checked="checked"' : ''));?> />
221e93f702bSAndreas Gohr                <?php echo $lang['i_pop_label']?> <a href="http://www.dokuwiki.org/popularity" target="_blank"><sup>[?]</sup></a>
2223a0852d9SAndreas Gohr            </label>
2233a0852d9SAndreas Gohr        </fieldset>
2243a0852d9SAndreas Gohr
22547248316SAndreas Gohr    </fieldset>
22647248316SAndreas Gohr    <fieldset id="process">
227ae614416SAnika Henke        <button type="submit" name="submit"><?php echo $lang['btn_save']?></button>
22847248316SAndreas Gohr    </fieldset>
22947248316SAndreas Gohr    </form>
23047248316SAndreas Gohr    <?php
23147248316SAndreas Gohr}
23247248316SAndreas Gohr
23370a6aa16Schrisfunction print_retry() {
23470a6aa16Schris    global $lang;
2359ad6da3dSAndreas Gohr    global $LC;
23670a6aa16Schris    ?>
23770a6aa16Schris    <form action="" method="get">
23870a6aa16Schris      <fieldset>
2399ad6da3dSAndreas Gohr        <input type="hidden" name="l" value="<?php echo $LC ?>" />
240ae614416SAnika Henke        <button type="submit"><?php echo $lang['i_retry'];?></button>
24170a6aa16Schris      </fieldset>
24270a6aa16Schris    </form>
24370a6aa16Schris    <?php
24470a6aa16Schris}
24570a6aa16Schris
24647248316SAndreas Gohr/**
24747248316SAndreas Gohr * Check validity of data
24847248316SAndreas Gohr *
24947248316SAndreas Gohr * @author Andreas Gohr
250253d4b48SGerrit Uitslag *
251253d4b48SGerrit Uitslag * @param array $d
252253d4b48SGerrit Uitslag * @return bool ok?
25347248316SAndreas Gohr */
254e2386079SAndreas Gohrfunction check_data(&$d){
2554b530faaSTom N Harris    static $form_default = array(
2564b530faaSTom N Harris        'title'     => '',
257ed856534STom N Harris        'acl'       => '1',
2584b530faaSTom N Harris        'superuser' => '',
2594b530faaSTom N Harris        'fullname'  => '',
2604b530faaSTom N Harris        'email'     => '',
2614b530faaSTom N Harris        'password'  => '',
2624b530faaSTom N Harris        'confirm'   => '',
2634b530faaSTom N Harris        'policy'    => '0',
264ab9346edSAnika Henke        'allowreg'  => '0',
2654b530faaSTom N Harris        'license'   => 'cc-by-sa'
2664b530faaSTom N Harris    );
26747248316SAndreas Gohr    global $lang;
26847248316SAndreas Gohr    global $error;
26947248316SAndreas Gohr
2704b530faaSTom N Harris    if(!is_array($d)) $d = array();
2714b530faaSTom N Harris    foreach($d as $k => $v) {
2724b530faaSTom N Harris        if(is_array($v))
2734b530faaSTom N Harris            unset($d[$k]);
2744b530faaSTom N Harris        else
2754b530faaSTom N Harris            $d[$k] = (string)$v;
2764b530faaSTom N Harris    }
277e2386079SAndreas Gohr
2784b530faaSTom N Harris    //autolowercase the username
2794b530faaSTom N Harris    $d['superuser'] = isset($d['superuser']) ? strtolower($d['superuser']) : "";
2804b530faaSTom N Harris
2814b530faaSTom N Harris    $ok = false;
2824b530faaSTom N Harris
2834b530faaSTom N Harris    if(isset($_REQUEST['submit'])) {
28447248316SAndreas Gohr        $ok = true;
28547248316SAndreas Gohr
28647248316SAndreas Gohr        // check input
28747248316SAndreas Gohr        if(empty($d['title'])){
28847248316SAndreas Gohr            $error[] = sprintf($lang['i_badval'],$lang['i_wikiname']);
28947248316SAndreas Gohr            $ok      = false;
29047248316SAndreas Gohr        }
2914b530faaSTom N Harris        if(isset($d['acl'])){
292d60813a2SGina Haeussge            if(!preg_match('/^[a-z0-9_]+$/',$d['superuser'])){
29347248316SAndreas Gohr                $error[] = sprintf($lang['i_badval'],$lang['i_superuser']);
29447248316SAndreas Gohr                $ok      = false;
29547248316SAndreas Gohr            }
29647248316SAndreas Gohr            if(empty($d['password'])){
29747248316SAndreas Gohr                $error[] = sprintf($lang['i_badval'],$lang['pass']);
29847248316SAndreas Gohr                $ok      = false;
29947248316SAndreas Gohr            }
3004b530faaSTom N Harris            elseif(!isset($d['confirm']) || $d['confirm'] != $d['password']){
30147248316SAndreas Gohr                $error[] = sprintf($lang['i_badval'],$lang['passchk']);
30247248316SAndreas Gohr                $ok      = false;
30347248316SAndreas Gohr            }
30447248316SAndreas Gohr            if(empty($d['fullname']) || strstr($d['fullname'],':')){
30547248316SAndreas Gohr                $error[] = sprintf($lang['i_badval'],$lang['fullname']);
30647248316SAndreas Gohr                $ok      = false;
30747248316SAndreas Gohr            }
308e2386079SAndreas Gohr            if(empty($d['email']) || strstr($d['email'],':') || !strstr($d['email'],'@')){
30947248316SAndreas Gohr                $error[] = sprintf($lang['i_badval'],$lang['email']);
31047248316SAndreas Gohr                $ok      = false;
31147248316SAndreas Gohr            }
312b9ab8e4fSPhy        }else{
313b9ab8e4fSPhy            // Since default = 1, browser won't send acl=0 when user untick acl
314b9ab8e4fSPhy            $d['acl'] = '0';
31547248316SAndreas Gohr        }
3164b530faaSTom N Harris    }
3174b530faaSTom N Harris    $d = array_merge($form_default, $d);
31847248316SAndreas Gohr    return $ok;
31947248316SAndreas Gohr}
32047248316SAndreas Gohr
32147248316SAndreas Gohr/**
32247248316SAndreas Gohr * Writes the data to the config files
32347248316SAndreas Gohr *
32447248316SAndreas Gohr * @author  Chris Smith <chris@jalakai.co.uk>
325253d4b48SGerrit Uitslag *
326253d4b48SGerrit Uitslag * @param array $d
327253d4b48SGerrit Uitslag * @return bool
32847248316SAndreas Gohr */
32947248316SAndreas Gohrfunction store_data($d){
3300036aa89SAndreas Gohr    global $LC;
33147248316SAndreas Gohr    $ok = true;
3328af2e4bbSAndreas Gohr    $d['policy'] = (int) $d['policy'];
33347248316SAndreas Gohr
33447248316SAndreas Gohr    // create local.php
33524650a19SAndreas Gohr    $now    = gmdate('r');
33647248316SAndreas Gohr    $output = <<<EOT
33747248316SAndreas Gohr<?php
33847248316SAndreas Gohr/**
33947248316SAndreas Gohr * Dokuwiki's Main Configuration File - Local Settings
34047248316SAndreas Gohr * Auto-generated by install script
34147248316SAndreas Gohr * Date: $now
34247248316SAndreas Gohr */
34347248316SAndreas Gohr
34447248316SAndreas GohrEOT;
3452613efa1SAndreas Gohr    // add any config options set by a previous installer
3462613efa1SAndreas Gohr    $preset = __DIR__.'/install.conf';
3472613efa1SAndreas Gohr    if(file_exists($preset)){
3482613efa1SAndreas Gohr        $output .= "# preset config options\n";
3492613efa1SAndreas Gohr        $output .= file_get_contents($preset);
3502613efa1SAndreas Gohr        $output .= "\n\n";
3512613efa1SAndreas Gohr        $output .= "# options selected in installer\n";
3522613efa1SAndreas Gohr        @unlink($preset);
3532613efa1SAndreas Gohr    }
3542613efa1SAndreas Gohr
35547248316SAndreas Gohr    $output .= '$conf[\'title\'] = \''.addslashes($d['title'])."';\n";
3560036aa89SAndreas Gohr    $output .= '$conf[\'lang\'] = \''.addslashes($LC)."';\n";
35706361442SAndreas Gohr    $output .= '$conf[\'license\'] = \''.addslashes($d['license'])."';\n";
35847248316SAndreas Gohr    if($d['acl']){
35947248316SAndreas Gohr        $output .= '$conf[\'useacl\'] = 1'.";\n";
360523d7ea6Schris        $output .= "\$conf['superuser'] = '@admin';\n";
36147248316SAndreas Gohr    }
362ab9346edSAnika Henke    if(!$d['allowreg']){
36343c137edSAnika Henke        $output .= '$conf[\'disableactions\'] = \'register\''.";\n";
364d2ea6dc1SAnika Henke    }
36547248316SAndreas Gohr    $ok = $ok && fileWrite(DOKU_LOCAL.'local.php',$output);
36647248316SAndreas Gohr
36747248316SAndreas Gohr    if ($d['acl']) {
3683791b589SAndreas Gohr        // hash the password
3693791b589SAndreas Gohr        $phash = new PassHash();
3703791b589SAndreas Gohr        $pass = $phash->hash_smd5($d['password']);
3713791b589SAndreas Gohr
37247248316SAndreas Gohr        // create users.auth.php
373*a672ef75SPhy        $output = <<<EOT
374*a672ef75SPhy# users.auth.php
375*a672ef75SPhy# <?php exit()?>
376*a672ef75SPhy# Don't modify the lines above
377*a672ef75SPhy#
378*a672ef75SPhy# Userfile
379*a672ef75SPhy#
380*a672ef75SPhy# Auto-generated by install script
381*a672ef75SPhy# Date: $now
382*a672ef75SPhy#
383*a672ef75SPhy# Format:
384*a672ef75SPhy# login:passwordhash:Real Name:email:groups,comma,separated
385*a672ef75SPhy
386*a672ef75SPhyEOT;
3873791b589SAndreas Gohr        // --- user:SMD5password:Real Name:email:groups,comma,seperated
388*a672ef75SPhy        $output = $output."\n".join(":",array($d['superuser'], $pass, $d['fullname'], $d['email'], 'admin,user'))."\n";
38947248316SAndreas Gohr        $ok = $ok && fileWrite(DOKU_LOCAL.'users.auth.php', $output);
39047248316SAndreas Gohr
39147248316SAndreas Gohr        // create acl.auth.php
3928af2e4bbSAndreas Gohr        $output = <<<EOT
3938af2e4bbSAndreas Gohr# acl.auth.php
3948af2e4bbSAndreas Gohr# <?php exit()?>
3958af2e4bbSAndreas Gohr# Don't modify the lines above
3968af2e4bbSAndreas Gohr#
3978af2e4bbSAndreas Gohr# Access Control Lists
3988af2e4bbSAndreas Gohr#
3998af2e4bbSAndreas Gohr# Auto-generated by install script
4008af2e4bbSAndreas Gohr# Date: $now
4018af2e4bbSAndreas Gohr
4028af2e4bbSAndreas GohrEOT;
4038af2e4bbSAndreas Gohr        if($d['policy'] == 2){
4048af2e4bbSAndreas Gohr            $output .=  "*               @ALL          0\n";
405d2ea6dc1SAnika Henke            $output .=  "*               @user         8\n";
4069c70688aSchris        }elseif($d['policy'] == 1){
4078af2e4bbSAndreas Gohr            $output .=  "*               @ALL          1\n";
408d2ea6dc1SAnika Henke            $output .=  "*               @user         8\n";
4098af2e4bbSAndreas Gohr        }else{
4108af2e4bbSAndreas Gohr            $output .=  "*               @ALL          8\n";
4118af2e4bbSAndreas Gohr        }
41247248316SAndreas Gohr        $ok = $ok && fileWrite(DOKU_LOCAL.'acl.auth.php', $output);
41347248316SAndreas Gohr    }
4143a0852d9SAndreas Gohr
4153a0852d9SAndreas Gohr    // enable popularity submission
4163a0852d9SAndreas Gohr    if($d['pop']){
4173a0852d9SAndreas Gohr        @touch(DOKU_INC.'data/cache/autosubmit.txt');
4183a0852d9SAndreas Gohr    }
4193a0852d9SAndreas Gohr
420c70d6ceeSAndreas Gohr    // disable auth plugins til needed
421c70d6ceeSAndreas Gohr    $output = <<<EOT
422c70d6ceeSAndreas Gohr<?php
423c70d6ceeSAndreas Gohr/*
424c70d6ceeSAndreas Gohr * Local plugin enable/disable settings
425c70d6ceeSAndreas Gohr *
426c70d6ceeSAndreas Gohr * Auto-generated by install script
427c70d6ceeSAndreas Gohr * Date: $now
428c70d6ceeSAndreas Gohr */
429c70d6ceeSAndreas Gohr
430c70d6ceeSAndreas Gohr\$plugins['authad']    = 0;
431c70d6ceeSAndreas Gohr\$plugins['authldap']  = 0;
432c70d6ceeSAndreas Gohr\$plugins['authmysql'] = 0;
433c70d6ceeSAndreas Gohr\$plugins['authpgsql'] = 0;
434c70d6ceeSAndreas Gohr
435c70d6ceeSAndreas GohrEOT;
436c70d6ceeSAndreas Gohr    $ok = $ok && fileWrite(DOKU_LOCAL.'plugins.local.php', $output);
437c70d6ceeSAndreas Gohr
43847248316SAndreas Gohr    return $ok;
43947248316SAndreas Gohr}
44047248316SAndreas Gohr
44147248316SAndreas Gohr/**
44247248316SAndreas Gohr * Write the given content to a file
44347248316SAndreas Gohr *
44447248316SAndreas Gohr * @author  Chris Smith <chris@jalakai.co.uk>
445253d4b48SGerrit Uitslag *
446253d4b48SGerrit Uitslag * @param string $filename
447253d4b48SGerrit Uitslag * @param string $data
448253d4b48SGerrit Uitslag * @return bool
44947248316SAndreas Gohr */
45047248316SAndreas Gohrfunction fileWrite($filename, $data) {
45147248316SAndreas Gohr    global $error;
45247248316SAndreas Gohr    global $lang;
45347248316SAndreas Gohr
45447248316SAndreas Gohr    if (($fp = @fopen($filename, 'wb')) === false) {
45547248316SAndreas Gohr        $filename = str_replace($_SERVER['DOCUMENT_ROOT'],'{DOCUMENT_ROOT}/', $filename);
45647248316SAndreas Gohr        $error[]  = sprintf($lang['i_writeerr'],$filename);
45747248316SAndreas Gohr        return false;
45847248316SAndreas Gohr    }
45947248316SAndreas Gohr
46047248316SAndreas Gohr    if (!empty($data)) { fwrite($fp, $data);  }
46147248316SAndreas Gohr    fclose($fp);
46247248316SAndreas Gohr    return true;
46347248316SAndreas Gohr}
46447248316SAndreas Gohr
46547248316SAndreas Gohr
46647248316SAndreas Gohr/**
46747248316SAndreas Gohr * check installation dependent local config files and tests for a known
46847248316SAndreas Gohr * unmodified main config file
46947248316SAndreas Gohr *
47047248316SAndreas Gohr * @author      Chris Smith <chris@jalakai.co.uk>
471253d4b48SGerrit Uitslag *
472253d4b48SGerrit Uitslag * @return bool
47347248316SAndreas Gohr */
47447248316SAndreas Gohrfunction check_configs(){
47547248316SAndreas Gohr    global $error;
47647248316SAndreas Gohr    global $lang;
47747248316SAndreas Gohr
47847248316SAndreas Gohr    $ok = true;
47947248316SAndreas Gohr
4805cfb8815Schris    $config_files = array(
4815cfb8815Schris        'local' => DOKU_LOCAL.'local.php',
4825cfb8815Schris        'users' => DOKU_LOCAL.'users.auth.php',
4835cfb8815Schris        'auth'  => DOKU_LOCAL.'acl.auth.php'
4845cfb8815Schris    );
4855cfb8815Schris
48647248316SAndreas Gohr    // configs shouldn't exist
48747248316SAndreas Gohr    foreach ($config_files as $file) {
48879e79377SAndreas Gohr        if (file_exists($file) && filesize($file)) {
48947248316SAndreas Gohr            $file    = str_replace($_SERVER['DOCUMENT_ROOT'],'{DOCUMENT_ROOT}/', $file);
49047248316SAndreas Gohr            $error[] = sprintf($lang['i_confexists'],$file);
49147248316SAndreas Gohr            $ok      = false;
49247248316SAndreas Gohr        }
49347248316SAndreas Gohr    }
49447248316SAndreas Gohr    return $ok;
49547248316SAndreas Gohr}
49647248316SAndreas Gohr
49747248316SAndreas Gohr
49847248316SAndreas Gohr/**
49947248316SAndreas Gohr * Check other installation dir/file permission requirements
50047248316SAndreas Gohr *
50147248316SAndreas Gohr * @author      Chris Smith <chris@jalakai.co.uk>
502253d4b48SGerrit Uitslag *
503253d4b48SGerrit Uitslag * @return bool
50447248316SAndreas Gohr */
50547248316SAndreas Gohrfunction check_permissions(){
50647248316SAndreas Gohr    global $error;
50747248316SAndreas Gohr    global $lang;
50847248316SAndreas Gohr
50947248316SAndreas Gohr    $dirs = array(
51047248316SAndreas Gohr        'conf'        => DOKU_LOCAL,
51147248316SAndreas Gohr        'data'        => DOKU_INC.'data',
51247248316SAndreas Gohr        'pages'       => DOKU_INC.'data/pages',
51347248316SAndreas Gohr        'attic'       => DOKU_INC.'data/attic',
51447248316SAndreas Gohr        'media'       => DOKU_INC.'data/media',
51549b78edaSAndreas Gohr        'media_attic' => DOKU_INC.'data/media_attic',
51649b78edaSAndreas Gohr        'media_meta'  => DOKU_INC.'data/media_meta',
51747248316SAndreas Gohr        'meta'        => DOKU_INC.'data/meta',
51847248316SAndreas Gohr        'cache'       => DOKU_INC.'data/cache',
51947248316SAndreas Gohr        'locks'       => DOKU_INC.'data/locks',
5209711045aSAndreas Gohr        'index'       => DOKU_INC.'data/index',
521de33a58fSMichael Klier        'tmp'         => DOKU_INC.'data/tmp'
52247248316SAndreas Gohr    );
52347248316SAndreas Gohr
52447248316SAndreas Gohr    $ok = true;
52547248316SAndreas Gohr    foreach($dirs as $dir){
52679e79377SAndreas Gohr        if(!file_exists("$dir/.") || !is_writable($dir)){
52770a6aa16Schris            $dir     = str_replace($_SERVER['DOCUMENT_ROOT'],'{DOCUMENT_ROOT}', $dir);
52847248316SAndreas Gohr            $error[] = sprintf($lang['i_permfail'],$dir);
52947248316SAndreas Gohr            $ok      = false;
53047248316SAndreas Gohr        }
53147248316SAndreas Gohr    }
53247248316SAndreas Gohr    return $ok;
53347248316SAndreas Gohr}
53447248316SAndreas Gohr
53547248316SAndreas Gohr/**
5363afe5d1cSAndreas Gohr * Check the availability of functions used in DokuWiki and the PHP version
53747248316SAndreas Gohr *
53847248316SAndreas Gohr * @author Andreas Gohr <andi@splitbrain.org>
539253d4b48SGerrit Uitslag *
540253d4b48SGerrit Uitslag * @return bool
54147248316SAndreas Gohr */
54247248316SAndreas Gohrfunction check_functions(){
54347248316SAndreas Gohr    global $error;
54447248316SAndreas Gohr    global $lang;
5453afe5d1cSAndreas Gohr    $ok = true;
5463afe5d1cSAndreas Gohr
5473476bb81SAndreas Gohr    if(version_compare(phpversion(),'5.6.0','<')){
5483476bb81SAndreas Gohr        $error[] = sprintf($lang['i_phpver'],phpversion(),'5.6.0');
5493afe5d1cSAndreas Gohr        $ok = false;
5503afe5d1cSAndreas Gohr    }
5513afe5d1cSAndreas Gohr
5527f413440SAndreas Gohr    if(ini_get('mbstring.func_overload') != 0){
5537f413440SAndreas Gohr        $error[] = $lang['i_mbfuncoverload'];
5547f413440SAndreas Gohr        $ok = false;
5557f413440SAndreas Gohr    }
5567f413440SAndreas Gohr
5573009a773SAndreas Gohr    $funcs = explode(' ','addslashes call_user_func chmod copy fgets '.
55847248316SAndreas Gohr                         'file file_exists fseek flush filesize ftell fopen '.
55947248316SAndreas Gohr                         'glob header ignore_user_abort ini_get mail mkdir '.
56047248316SAndreas Gohr                         'ob_start opendir parse_ini_file readfile realpath '.
561bab4a8bdSAndreas Gohr                         'rename rmdir serialize session_start unlink usleep '.
562d1d99bb9SAndreas Gohr                         'preg_replace file_get_contents htmlspecialchars_decode '.
563ab38a322Slupo49                         'spl_autoload_register stream_select fsockopen pack');
56447248316SAndreas Gohr
56570a6aa16Schris    if (!function_exists('mb_substr')) {
56670a6aa16Schris        $funcs[] = 'utf8_encode';
56770a6aa16Schris        $funcs[] = 'utf8_decode';
56870a6aa16Schris    }
56970a6aa16Schris
57047248316SAndreas Gohr    foreach($funcs as $func){
57147248316SAndreas Gohr        if(!function_exists($func)){
57247248316SAndreas Gohr            $error[] = sprintf($lang['i_funcna'],$func);
57347248316SAndreas Gohr            $ok = false;
57447248316SAndreas Gohr        }
57547248316SAndreas Gohr    }
57647248316SAndreas Gohr    return $ok;
57747248316SAndreas Gohr}
57847248316SAndreas Gohr
57947248316SAndreas Gohr/**
58047248316SAndreas Gohr * Print language selection
58147248316SAndreas Gohr *
58247248316SAndreas Gohr * @author Andreas Gohr <andi@splitbrain.org>
58347248316SAndreas Gohr */
58447248316SAndreas Gohrfunction langsel(){
58547248316SAndreas Gohr    global $lang;
58647248316SAndreas Gohr    global $LC;
58747248316SAndreas Gohr
58847248316SAndreas Gohr    $dir = DOKU_INC.'inc/lang';
58947248316SAndreas Gohr    $dh  = opendir($dir);
59047248316SAndreas Gohr    if(!$dh) return;
59147248316SAndreas Gohr
59247248316SAndreas Gohr    $langs = array();
59347248316SAndreas Gohr    while (($file = readdir($dh)) !== false) {
59447248316SAndreas Gohr        if(preg_match('/^[\._]/',$file)) continue;
59579e79377SAndreas Gohr        if(is_dir($dir.'/'.$file) && file_exists($dir.'/'.$file.'/lang.php')){
59647248316SAndreas Gohr            $langs[] = $file;
59747248316SAndreas Gohr        }
59847248316SAndreas Gohr    }
59947248316SAndreas Gohr    closedir($dh);
60047248316SAndreas Gohr    sort($langs);
60147248316SAndreas Gohr
60247248316SAndreas Gohr    echo '<form action="">';
60347248316SAndreas Gohr    echo $lang['i_chooselang'];
60447248316SAndreas Gohr    echo ': <select name="l" onchange="submit()">';
60547248316SAndreas Gohr    foreach($langs as $l){
60647248316SAndreas Gohr        $sel = ($l == $LC) ? 'selected="selected"' : '';
60747248316SAndreas Gohr        echo '<option value="'.$l.'" '.$sel.'>'.$l.'</option>';
60847248316SAndreas Gohr    }
60947248316SAndreas Gohr    echo '</select> ';
610ae614416SAnika Henke    echo '<button type="submit">'.$lang['btn_update'].'</button>';
61147248316SAndreas Gohr    echo '</form>';
61247248316SAndreas Gohr}
61347248316SAndreas Gohr
61447248316SAndreas Gohr/**
615c66972f2SAdrian Lang * Print global error array
61647248316SAndreas Gohr *
61747248316SAndreas Gohr * @author Andreas Gohr <andi@splitbrain.org>
61847248316SAndreas Gohr */
61947248316SAndreas Gohrfunction print_errors(){
62047248316SAndreas Gohr    global $error;
6214b530faaSTom N Harris    if(!empty($error)) {
62247248316SAndreas Gohr        echo '<ul>';
62347248316SAndreas Gohr        foreach ($error as $err){
62447248316SAndreas Gohr            echo "<li>$err</li>";
62547248316SAndreas Gohr        }
62647248316SAndreas Gohr        echo '</ul>';
62747248316SAndreas Gohr    }
6284b530faaSTom N Harris}
629