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 ) {
2014-09-07 09:20:39 +02:00
$controller -> register_hook ( 'AUTH_LOGIN_CHECK' , 'AFTER' , $this , 'init' , array ());
2014-08-31 04:10:39 +02:00
$controller -> register_hook ( 'ACTION_ACT_PREPROCESS' , 'BEFORE' , $this , 'redirect' , array ());
2014-09-03 01:45:56 +02:00
}
2014-09-07 09:20:39 +02:00
function init ( & $event , $param ) {
global $conf ;
global $INFO ;
// COPY TEMPLATES IF NEEDED
2014-09-03 02:52:22 +02:00
if ( ! file_exists ( DOKU_INC . $this -> getConf ( 'templates_path' ) . '/userhomepage_private.txt' )) {
2014-09-07 09:20:39 +02:00
// If version 3.0.4 was installed, 'templatepath' option isn't empty and points to former template
2014-09-07 10:15:14 +02:00
if (( $this -> getConf ( 'templatepath' ) != null ) && ( file_exists ( DOKU_INC . $this -> getConf ( 'templatepath' )))) {
2014-09-03 03:29:33 +02:00
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-09-07 09:20:39 +02:00
// TARGETS
if ( $this -> getConf ( 'group_by_name' )) {
// private:s:simon or private:s:simon_delage
$this -> private_ns = cleanID ( $this -> getConf ( 'users_namespace' ) . ':' . substr ( $this -> privateNamespace (), 0 , 1 ) . ':' . $this -> privateNamespace ());
} else {
// private:simon or private:simon_delage
$this -> private_ns = cleanID ( $this -> getConf ( 'users_namespace' ) . ':' . $this -> privateNamespace ());
}
// private:simon:start.txt
$this -> private_page = $this -> private_ns . ':' . $this -> privatePage ();
// user:simon.txt
$this -> public_page = cleanID ( $this -> getConf ( 'public_pages_ns' ) . ':' . $_SERVER [ 'REMOTE_USER' ]);
// ACL
2014-09-07 11:14:20 +02:00
$acl = new admin_plugin_acl ();
2014-09-07 11:36:44 +02:00
// For private namespace
if (( $this -> getConf ( 'create_private_ns' )) && ( $this -> getConf ( 'set_permissions' ))) {
2014-09-07 09:20:39 +02:00
// If use_name_string is enabled, we can't use ACL wildcard
if ( $this -> getConf ( 'use_name_string' )) {
$ns = $this -> private_ns . ':*' ;
$acl -> _acl_add ( $ns , $INFO [ 'userinfo' ][ 'name' ], AUTH_DELETE );
} else {
$acl -> _acl_add ( cleanID ( $this -> getConf ( 'users_namespace' )) . ':%USER%:*' , '%USER%' , AUTH_DELETE );
}
2014-09-07 11:14:20 +02:00
$acl -> _acl_add ( cleanID ( $this -> getConf ( 'users_namespace' )) . ':*' , '@ALL' , ( int ) $this -> getConf ( 'set_permissions_others' ));
$acl -> _acl_add ( cleanID ( $this -> getConf ( 'users_namespace' )) . ':*' , '@user' , ( int ) $this -> getConf ( 'set_permissions_others' ));
2014-09-07 09:20:39 +02:00
}
// For public user pages
2014-09-07 11:14:20 +02:00
if (( $this -> getConf ( 'create_public_page' )) && ( $this -> getConf ( 'set_permissions_public' ))) {
$acl -> _acl_add ( cleanID ( $this -> getConf ( 'public_pages_ns' )) . ':%USER%' , '%USER%' , AUTH_EDIT );
2014-09-07 09:20:39 +02:00
$acl -> _acl_add ( cleanID ( $this -> getConf ( 'public_pages_ns' )) . ':*' , '@ALL' , AUTH_READ );
$acl -> _acl_add ( cleanID ( $this -> getConf ( 'public_pages_ns' )) . ':*' , '@user' , AUTH_READ );
}
// Some lines in conf/acl.auth.php file have probably been duplicated so let's read the file
$lines = file ( DOKU_INC . 'conf/acl.auth.php' );
// And 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-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
// 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 ()) {
// 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 );
2014-09-07 09:20:39 +02:00
saveWikiText ( $this -> private_page , $this -> apply_template ( 'private' ), $lang [ 'created' ]);
2014-09-02 02:05:54 +02:00
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 );
2014-09-07 09:20:39 +02:00
saveWikiText ( $this -> public_page , $this -> apply_template ( 'public' ), $lang [ 'created' ]);
2014-09-02 02:55:38 +02:00
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 ;
2014-09-07 09:20:39 +02:00
$raw_string = cleanID ( $INFO [ 'userinfo' ][ 'name' ]);
2014-08-31 04:10:39 +02:00
// 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 () {
2014-09-07 09:20:39 +02:00
if ( $this -> getConf ( 'use_start_page' )) {
2014-09-02 02:55:38 +02:00
global $conf ;
2014-09-07 09:20:39 +02:00
return cleanID ( $conf [ 'start' ]);
2014-09-02 02:55:38 +02:00
} else {
2014-09-07 09:20:39 +02:00
return $this -> privateNamespace ();
2014-09-03 03:50:59 +02:00
}
2014-09-02 02:55:38 +02:00
}
2014-09-07 09:20:39 +02:00
// function _template_private() {
// global $INFO;
// global $lang;
// $content = io_readFile($this->private_page_template, false);
// $content = str_replace('@PRIVATENAMESPACE@',$this->getLang('privatenamespace'),$content);
// // 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);
// return $content;
// }
// function _template_public() {
// global $INFO;
// global $lang;
// $content = io_readFile($this->public_page_template, false);
// $content = str_replace('@PUBLICPAGE@',$this->getLang('publicpage'),$content);
// // 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);
// return $content;
// }
function apply_template ( $type ) {
2014-09-01 18:37:07 +02:00
global $INFO ;
2014-09-06 20:39:56 +02:00
global $lang ;
2014-09-07 09:20:39 +02:00
// Improved template process to use any replacement patterns from https://www.dokuwiki.org/namespace_templates based on code proposed by Christian Nancy
if ( $type == 'private' ) {
$content = io_readFile ( $this -> private_page_template , false );
$content = str_replace ( '@PRIVATENAMESPACE@' , $this -> getLang ( 'privatenamespace' ), $content );
$data = array ( 'tpl' => $content , 'id' => $this -> private_page );
} elseif ( $type == 'public' ) {
$content = io_readFile ( $this -> public_page_template , false );
$content = str_replace ( '@PUBLICPAGE@' , $this -> getLang ( 'publicpage' ), $content );
$data = array ( 'tpl' => $content , 'id' => $this -> public_page );
}
2014-09-06 19:45:24 +02:00
// 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
}