1<?php 2/** 3 * Dokuwiki Action Plugin Subconfhelper 4 * 5 * @license GPLv3(http://www.gnu.org/licenses/gpl.html) 6 * @author sf@notomorrow.de 7 */ 8 9if( !defined( 'DOKU_INC' )) die( ); 10if( !defined( 'DOKU_PLUGIN' )) define( 'DOKU_PLUGIN',DOKU_INC.'lib/plugins/' ); 11require_once( DOKU_PLUGIN.'action.php' ); 12 13class action_plugin_subconfhelper extends DokuWiki_Action_Plugin { 14 15 var $sconf = array( ); 16 17 function getInfo( ){ 18 return array( 19 'author' => 'ai', 20 'email' => 'ai', 21 'date' => '2013-09-30', 22 'name' => 'subconfhelper', 23 'desc' => 'override various configuration settings per subdomain', 24 'url' => 'https://www.dokuwiki.org/plugin:subconfhelper' ); 25 } 26 function register( &$controller) { 27 $controller->register_hook('ACTION_ACT_PREPROCESS', 'BEFORE', $this, 'check_vhost' ); 28 $controller->register_hook('TPL_ACT_RENDER', 'BEFORE', $this, 'check_act' ); 29 } 30 function read_config( $domain ) { 31 if( !$domain ) { return false; } 32 if( isset( $this->sconf[$domain] )) { 33 return $this->sconf[$domain]; } 34 else { 35 $this->sconf[$domain] = array( ); 36 $conf = &$this->sconf[$domain]; } 37 $this->config_path = DOKU_CONF; 38 $this->config_prefix = 'subconfhelper_'; 39 while( $domain && !$subdomain ) { 40 $conf_file = $this->config_path.$this->config_prefix.$domain.'.php'; 41 if( !file_exists( $conf_file )) { 42 if( strpos( $domain, '.' )) { 43 $domain = substr( $domain, 0, strrpos( $domain, '.' )); } 44 else { 45 $subdomain = $domain; }} 46 else { 47 $subdomain = $domain; }} 48 if( file_exists( $conf_file )) { 49 require_once( $conf_file ); } 50 return $conf; 51 } 52 function check_vhost( &$event, $param ) { 53 global $ACT, $INFO; 54 $domain = $_SERVER['HTTP_HOST']; 55 $sconf = $this->read_config( $domain ); 56 if( is_array( $sconf )) { 57 if( $ACT == 'register' && $_POST['save'] ) { 58 if( $this->override_register( $sconf )) { 59 $ACT = 'login'; } 60 else { 61 $_POST['save'] = false; }} 62 $this->override_defaultpage( $sconf ); 63 $this->override_template( $sconf ); 64 $this->override_namespace( $sconf ); 65 $this->override_conf( $sconf ); 66 } 67 } 68 function check_act( &$event, $param ) { 69 global $conf, $ACT, $INFO; 70 $domain = $_SERVER['HTTP_HOST']; 71 $sconf = $this->read_config( $domain ); 72 if( $ACT == 'index' && $sconf['ns'] ) { 73 $dir = $conf['datadir']; 74 $ns = cleanID($ns); 75 $ns = utf8_encodeFN( str_replace( ':', '/', $ns)); 76 echo p_locale_xhtml('index'); 77 echo '<div id="index__tree">'; 78 $data = array(); 79 search($data,$conf['datadir'],'search_index',array( 'ns' => $ns ), $sconf['ns'] ); 80 echo html_buildlist( $data,'idx','html_list_index','html_li_index' ); 81 echo '</div>'; 82 $event->preventDefault(); 83 } 84 } 85 function override_conf( $conf_override ) { 86 global $conf; 87 foreach( array( 'disableactions' ) as $key ) { 88 if( isset( $conf_override[$key] )) { 89 $conf[$key] = $conf_override[$key]; }} 90 } 91 function override_register( $conf_override ) { 92 global $lang; 93 global $conf; 94 global $auth; 95 global $INPUT; 96 97 if(!$INPUT->post->bool('save')) return false; 98 if(!actionOK('register')) return false; 99 100 $default_groups = isset( $conf_override['default_groups'] ) ? $conf_override['default_groups'] : $conf['default_groups']; 101 if(!$auth) return false; 102 103 // gather input 104 $login = trim($auth->cleanUser($INPUT->post->str('login'))); 105 $fullname = trim(preg_replace('/[\x00-\x1f:<>&%,;]+/', '', $INPUT->post->str('fullname'))); 106 $email = trim(preg_replace('/[\x00-\x1f:<>&%,;]+/', '', $INPUT->post->str('email'))); 107 $pass = $INPUT->post->str('pass'); 108 $passchk = $INPUT->post->str('passchk'); 109 110 if(empty($login) || empty($fullname) || empty($email)) { 111 msg($lang['regmissing'], -1); 112 return false; 113 } 114 115 if($conf['autopasswd']) { 116 $pass = auth_pwgen($login); // automatically generate password 117 } elseif(empty($pass) || empty($passchk)) { 118 msg($lang['regmissing'], -1); // complain about missing passwords 119 return false; 120 } elseif($pass != $passchk) { 121 msg($lang['regbadpass'], -1); // complain about misspelled passwords 122 return false; 123 } 124 125 //check mail 126 if(!mail_isvalid($email)) { 127 msg($lang['regbadmail'], -1); 128 return false; 129 } 130 131 //okay try to create the user 132 if(!$auth->triggerUserMod('create', array($login, $pass, $fullname, $email, $default_group ))) { 133 msg($lang['reguexists'], -1); 134 return false; 135 } 136 137 // send notification about the new user 138 $subscription = new Subscription(); 139 $subscription->send_register($login, $fullname, $email); 140 141 // are we done? 142 if(!$conf['autopasswd']) { 143 msg($lang['regsuccess2'], 1); 144 return true; 145 } 146 147 // autogenerated password? then send password to user 148 if(auth_sendPassword($login, $pass)) { 149 msg($lang['regsuccess'], 1); 150 return true; 151 } else { 152 msg($lang['regmailfail'], -1); 153 return false; 154 } 155 } 156 function override_template( $conf_override ) { 157 $t = plugin_load( 'action', 'templateconfhelper_templateaction' ); 158 if( $t ) { 159 $t->tpl_switch( $conf_override['template'] ); } 160 } 161 function override_defaultpage( $conf_override ) { 162 global $ID,$INFO,$conf; 163 if( $defaultpage = $conf_override['default_startpage'] ) { 164 if( $ID == $conf['start'] ) { 165 $ID = $defaultpage; 166 $NS = getNS( $ID ); 167 $INFO = pageinfo( ); 168 $JSINFO['id'] = $ID; 169 $INFO['namespace'] = (string) $INFO['namespace']; 170 if( $conf['breadcrumbs'] ) breadcrumbs( ); }} 171 } 172 function override_namespace( $conf_override ) { 173 global $ID,$INFO,$conf; 174 if( !$conf_override['ns'] ) { return ''; } 175 $path = explode( ':', $ID ); 176 if( strpos( $ID, $conf_override['ns'] ) === 0 ) { return ''; } 177 if( strpos( ':'.$ID, str_replace( '/', ':', 178 $conf_override['ns'] )) === 0 ) { return ''; } 179 if( $conf_override['ns_inherit'] ) { 180 $newfile = wikiFN( $conf_override['ns'].':'.$ID ); 181 if( !file_exists( wikiFN( $conf_override['ns'].':'.$ID )) 182 && file_exists( wikiFN($ID))) { return ''; }} 183 $ID = $conf_override['ns'].':'.$ID; 184 if( strpos( $ID, ':' ) === 0 ) { 185 $ID = substr( $ID, 1 ); } 186 $NS = getNS( $ID ); 187 $INFO = pageinfo( ); 188 $JSINFO['id'] = $ID; 189 $INFO['namespace'] = (string) $INFO['namespace']; 190 if( $conf['breadcrumbs'] ) breadcrumbs(); 191 } 192} 193