2014-08-30 13:23:38 +02:00
< ? php
2014-08-31 03:29:56 +02:00
/**
* Userhomepage plugin main file
* Previous authors : James GuanFeng Lin , Mikhail I . Izmestev , Daniel Stonier
* @ author : Simon Delage < simon . geekitude @ gmail . com >
* @ license : CC Attribution - Share Alike 3.0 Unported < http :// creativecommons . org / licenses / by - sa / 3.0 />
*/
2014-08-30 17:07:19 +02:00
2014-08-31 04:10:39 +02:00
// must be run within Dokuwiki
2014-08-30 13:23:38 +02:00
if ( ! defined ( 'DOKU_INC' )) die ();
if ( ! defined ( 'DOKU_PLUGIN' )) define ( 'DOKU_PLUGIN' , DOKU_INC . 'lib/plugins/' );
2014-08-31 04:10:39 +02:00
2014-08-30 13:23:38 +02:00
require_once ( DOKU_PLUGIN . 'action.php' );
require_once ( DOKU_PLUGIN . '/acl/admin.php' );
2014-09-02 02:55:38 +02:00
2014-08-31 04:10:39 +02:00
class action_plugin_userhomepage extends DokuWiki_Action_Plugin {
function register ( & $controller ) {
$controller -> register_hook ( 'ACTION_ACT_PREPROCESS' , 'BEFORE' , $this , 'redirect' , array ());
2014-09-03 01:45:56 +02:00
$controller -> register_hook ( 'AUTH_LOGIN_CHECK' , 'AFTER' , $this , 'templates' , array ());
}
function templates ( & $event , $param ) {
2014-09-03 02:52:22 +02:00
if ( ! file_exists ( DOKU_INC . $this -> getConf ( 'templates_path' ) . '/userhomepage_private.txt' )) {
2014-09-03 03:29:33 +02:00
if ( file_exists ( DOKU_INC . $this -> getConf ( 'templatepath' ))) {
if ( ! copy ( DOKU_INC . $this -> getConf ( 'templatepath' ), DOKU_INC . $this -> getConf ( 'templates_path' ) . '/userhomepage_private.txt' )) {
// echo ' An error occured while attempting to copy old template to '.DOKU_INC.$this->getConf('templates_path').'/userhomepage_private.txt';
// } else {
// echo ' Successfully copied private template.';
}
} elseif ( ! copy ( DOKU_INC . 'lib/plugins/userhomepage/userhomepage_private.default' , DOKU_INC . $this -> getConf ( 'templates_path' ) . '/userhomepage_private.txt' )) {
2014-09-03 03:05:30 +02:00
// echo ' An error occured while attempting to copy userhomepage_private.default to '.DOKU_INC.$this->getConf('templates_path').'/userhomepage_private.txt';
2014-09-03 02:52:22 +02:00
// } else {
// echo ' Successfully copied private template.';
2014-09-03 01:45:56 +02:00
}
}
2014-09-03 02:52:22 +02:00
if ( ! file_exists ( DOKU_INC . $this -> getConf ( 'templates_path' ) . '/userhomepage_public.txt' )) {
2014-09-03 02:57:52 +02:00
if ( ! copy ( DOKU_INC . 'lib/plugins/userhomepage/userhomepage_public.default' , DOKU_INC . $this -> getConf ( 'templates_path' ) . '/userhomepage_public.txt' )) {
2014-09-03 03:05:30 +02:00
// echo ' An error occured while attempting to copy userhomepage_public.default to '.DOKU_INC.$this->getConf('templates_path').'/userhomepage_public.txt';
2014-09-03 02:52:22 +02:00
// } else {
// echo ' Successfully copied public template.';
2014-09-03 01:45:56 +02:00
}
}
2014-08-31 04:10:39 +02:00
}
function redirect ( & $event , $param ) {
global $conf ;
global $INFO ;
2014-09-02 02:05:54 +02:00
$created = array ();
// If user just logged in
2014-08-31 04:10:39 +02:00
if (( $_SERVER [ 'REMOTE_USER' ] != null ) && ( $_REQUEST [ 'do' ] == 'login' )) {
2014-09-02 02:05:54 +02:00
// Determine targets
if ( $this -> getConf ( 'group_by_name' )) {
// private:s:simon
$this -> private_ns = cleanID ( $this -> getConf ( 'users_namespace' ) . ':' . strtolower ( substr ( $this -> privateNamespace (), 0 , 1 )) . ':' . $this -> privateNamespace ());
} else {
// private:simon
$this -> private_ns = cleanID ( $this -> getConf ( 'users_namespace' ) . ':' . $this -> privateNamespace ());
}
// private:simon:start.txt
2014-09-03 03:50:59 +02:00
$this -> private_page = cleanID ( $this -> private_ns . ':' . $this -> privatePage ());
2014-09-02 02:05:54 +02:00
// user:simon.txt
2014-09-03 03:50:59 +02:00
$this -> public_page = cleanID ( $this -> getConf ( 'public_pages_ns' ) . ':' . $_SERVER [ 'REMOTE_USER' ]);
2014-09-02 02:05:54 +02:00
// if private page doesn't exists, create it (from template)
if ( $this -> getConf ( 'create_private_ns' ) && ! page_exists ( $this -> private_page ) && ! checklock ( $this -> private_page ) && ! checkwordblock ()) {
2014-08-31 04:10:39 +02:00
// set acl's if requested
if ( $this -> getConf ( 'set_permissions' ) == 1 ) {
$acl = new admin_plugin_acl ();
// Old user-page ACL (version 3.0.4):
2014-09-01 18:37:07 +02:00
// $ns = cleanID($this->private_ns.':'.$this->privatePage());
2014-09-02 02:05:54 +02:00
// New user-namespace ACL (based on Luitzen van Gorkum and Harmen P. (Murf) de Ruiter suggestions):
2014-09-01 18:37:07 +02:00
$ns = cleanID ( $this -> private_ns ) . ':*' ;
2014-08-31 04:10:39 +02:00
$acl -> _acl_add ( $this -> getConf ( 'users_namespace' ) . ':*' , '@ALL' , ( int ) $this -> getConf ( 'set_permissions_others' ));
$acl -> _acl_add ( $this -> getConf ( 'users_namespace' ) . ':*' , '@user' , ( int ) $this -> getConf ( 'set_permissions_others' ));
$acl -> _acl_add ( $ns , strtolower ( $_SERVER [ 'REMOTE_USER' ]), AUTH_DELETE );
}
// If the 2 lines concerning set_permissions_others above allready existed in conf/acl.auth.php file they've been duplicated so let's read the file
$lines = file ( DOKU_INC . 'conf/acl.auth.php' );
// Only keep unique lines (OK, we loose an empty comment line...)
$lines = array_unique ( $lines );
// Write things back to conf/acl.auth.php
file_put_contents ( DOKU_INC . 'conf/acl.auth.php' , implode ( $lines ));
2014-09-02 02:05:54 +02:00
// Read private start page template
2014-09-03 02:52:22 +02:00
$this -> private_page_template = DOKU_INC . $this -> getConf ( 'templates_path' ) . '/userhomepage_private.txt' ;
2014-09-02 02:05:54 +02:00
// Create private page
lock ( $this -> private_page );
saveWikiText ( $this -> private_page , $this -> _template_private (), $lang [ 'created' ]);
unlock ( $this -> private_page );
// Note that we created private page
$created [ 'private' ] = true ;
2014-08-31 04:10:39 +02:00
}
2014-09-02 02:05:54 +02:00
// Public page?
// If public page doesn't exists, create it (from template)
if ( $this -> getConf ( 'create_public_page' ) && ! page_exists ( $this -> public_page ) && ! checklock ( $this -> public_page ) && ! checkwordblock ()) {
// Read public page template
2014-09-03 02:52:22 +02:00
$this -> public_page_template = DOKU_INC . $this -> getConf ( 'templates_path' ) . '/userhomepage_public.txt' ;
2014-09-02 02:55:38 +02:00
// Create public page
lock ( $this -> public_page );
saveWikiText ( $this -> public_page , $this -> _template_public (), $lang [ 'created' ]);
unlock ( $this -> public_page );
2014-09-02 02:05:54 +02:00
// Note that we created public page
$created [ 'public' ] = true ;
2014-09-02 02:55:38 +02:00
}
2014-08-31 05:33:25 +02:00
// If Translation plugin is active, determine if we're at wikistart
if ( ! plugin_isdisabled ( 'translation' )) {
foreach ( explode ( ' ' , $conf [ 'plugin' ][ 'translation' ][ 'translations' ]) as $lang ){
if ( getID () === $lang . ':' . $conf [ 'start' ]) {
$wikistart = true ;
break ;
}
}
}
2014-09-02 02:05:54 +02:00
// If Public page was just created, redirect to it and edit
if ( $created [ 'public' ]) {
send_redirect ( wl ( $this -> public_page , 'do=edit' , false , '&' ));
// Else if private start page was just created and edit option is set, redirect to it and edit
} elseif (( $created [ 'private' ]) && ( $this -> getConf ( 'edit_before_create' ))) {
send_redirect ( wl ( $this -> private_page , 'do=edit' , false , '&' ));
// Else if the user was not at a specific page (beside wiki start) and private page exists, redirect to it.
} elseif ((( $_REQUEST [ 'id' ] == $conf [ 'start' ]) || ( ! isset ( $_REQUEST [ 'id' ])) || ( $wikistart )) && ( page_exists ( $this -> private_page ))) {
send_redirect ( wl ( $this -> private_page ));
2014-08-30 13:23:38 +02:00
}
}
2014-08-31 04:10:39 +02:00
}
2014-09-01 18:37:07 +02:00
function privateNamespace () {
2014-08-31 04:10:39 +02:00
if ( $this -> getConf ( 'use_name_string' )) {
global $INFO ;
$raw_string = $INFO [ 'userinfo' ][ 'name' ];
// simon_delage
return $raw_string ;
} else {
// simon
return strtolower ( $_SERVER [ 'REMOTE_USER' ]);
2014-08-30 13:23:38 +02:00
}
2014-08-31 04:10:39 +02:00
}
2014-09-02 02:55:38 +02:00
function privatePage () {
if ( $this -> getConf ( 'use_start_page' )) {
global $conf ;
return $conf [ 'start' ];
} else {
return $this -> homeNamespace ();
2014-09-03 03:50:59 +02:00
}
2014-09-02 02:55:38 +02:00
}
2014-09-01 15:57:34 +02:00
function _template_private () {
2014-08-31 04:10:39 +02:00
global $INFO ;
2014-09-01 15:57:34 +02:00
$content = io_readFile ( $this -> private_page_template , false );
2014-09-06 19:45:24 +02:00
// Improved template process to use any replacement patterns from https://www.dokuwiki.org/namespace_templates
// Code by Christian Nancy
// Build a fake data structure for the parser
$data = array ( 'tpl' => $content , 'id' => $this -> private_page );
// Use the built-in parser
$content = parsePageTemplate ( $data );
2014-08-31 04:10:39 +02:00
return $content ;
}
2014-09-01 18:37:07 +02:00
function _template_public () {
global $INFO ;
$content = io_readFile ( $this -> public_page_template , false );
2014-09-06 19:45:24 +02:00
// Improved template process to use any replacement patterns from https://www.dokuwiki.org/namespace_templates
// Code by Christian Nancy
// Build a fake data structure for the parser
$data = array ( 'tpl' => $content , 'id' => $this -> public_page );
// Use the built-in parser
$content = parsePageTemplate ( $data );
2014-09-01 18:37:07 +02:00
return $content ;
}
2014-08-30 13:23:38 +02:00
}