updatecheck feature

This patch adds a feature to let DokuWiki automatically check if updates are
available or any other important messages (like security warnings) and then
display this info to the admin user.

DokuWiki will contact the URL http://www.splitbrain.org/lib/exe/msg.php
with a parameter telling it which messages it already know (read from
conf/msg) - the server side script then will return all new messages.

The messages will be displayed until DokuWiki was upgraded or conf/msg
was updated manually. Messages are cached and only checked once a day.

The messenger URL will probably change before the next release.

darcs-hash:20060916210229-7ad00-7ac592650e171ae4144b0eb47a751a4ca480f031.gz
This commit is contained in:
Andreas Gohr 2006-09-16 23:02:29 +02:00
parent 036b9e65c9
commit c29dc6e421
8 changed files with 279 additions and 210 deletions

View File

@ -1,6 +1,10 @@
<?php
/**
* This is DokuWiki's Main Configuration file
*
* All the default values are kept here, you should not modify it but use
* a local.conf.php file instaed to override the settings from here.
*
* This is a piece of PHP code so PHP syntax applies!
*
* For help with the configuration see http://www.splitbrain.org/dokuwiki/wiki:config
@ -62,6 +66,7 @@ $conf['profileconfirm'] = '1'; //Require current password to confirm c
$conf['disableactions'] = ''; //comma separated list of actions to disable
/* Advanced Options */
$conf['updatecheck'] = 1; //automatically check for new releases?
$conf['userewrite'] = 0; //this makes nice URLs: 0: off 1: .htaccess 2: internal
$conf['useslash'] = 0; //use slash instead of colon? only when rewrite is on
$conf['usedraft'] = 1; //automatically save a draft while editing (0|1)

View File

@ -63,6 +63,9 @@
//prepare breadcrumbs (initialize a static var)
breadcrumbs();
// check upstream
checkUpdateMessages();
trigger_event('DOKUWIKI_STARTED',$tmp=array());
//close session

View File

@ -6,13 +6,14 @@
* @author Andreas Gohr <andi@splitbrain.org>
*/
if(!defined('DOKU_INC')) define('DOKU_INC',realpath(dirname(__FILE__).'/../').'/');
require_once(DOKU_CONF.'dokuwiki.php');
require_once(DOKU_INC.'inc/io.php');
require_once(DOKU_INC.'inc/changelog.php');
require_once(DOKU_INC.'inc/utf8.php');
require_once(DOKU_INC.'inc/mail.php');
require_once(DOKU_INC.'inc/parserutils.php');
if(!defined('DOKU_INC')) define('DOKU_INC',realpath(dirname(__FILE__).'/../').'/');
require_once(DOKU_CONF.'dokuwiki.php');
require_once(DOKU_INC.'inc/io.php');
require_once(DOKU_INC.'inc/changelog.php');
require_once(DOKU_INC.'inc/utf8.php');
require_once(DOKU_INC.'inc/mail.php');
require_once(DOKU_INC.'inc/parserutils.php');
require_once(DOKU_INC.'inc/infoutils.php');
/**
* These constants are used with the recents function
@ -168,45 +169,6 @@ function buildAttributes($params){
}
/**
* print a message
*
* If HTTP headers were not sent yet the message is added
* to the global message array else it's printed directly
* using html_msgarea()
*
*
* Levels can be:
*
* -1 error
* 0 info
* 1 success
*
* @author Andreas Gohr <andi@splitbrain.org>
* @see html_msgarea
*/
function msg($message,$lvl=0,$line='',$file=''){
global $MSG;
$errors[-1] = 'error';
$errors[0] = 'info';
$errors[1] = 'success';
if($line || $file) $message.=' ['.basename($file).':'.$line.']';
if(!headers_sent()){
if(!isset($MSG)) $MSG = array();
$MSG[]=array('lvl' => $errors[$lvl], 'msg' => $message);
}else{
$MSG = array();
$MSG[]=array('lvl' => $errors[$lvl], 'msg' => $message);
if(function_exists('html_msgarea')){
html_msgarea();
}else{
print "ERROR($lvl) $message";
}
}
}
/**
* This builds the breadcrumb trail and returns it as array
*
@ -695,34 +657,6 @@ function con($pre,$text,$suf,$pretty=false){
return $pre.$text.$suf;
}
/**
* print debug messages
*
* little function to print the content of a var
*
* @author Andreas Gohr <andi@splitbrain.org>
*/
function dbg($msg,$hidden=false){
(!$hidden) ? print '<pre class="dbg">' : print "<!--\n";
print_r($msg);
(!$hidden) ? print '</pre>' : print "\n-->";
}
/**
* Print info to a log file
*
* @author Andreas Gohr <andi@splitbrain.org>
*/
function dbglog($msg){
global $conf;
$file = $conf['cachedir'].'/debug.log';
$fh = fopen($file,'a');
if($fh){
fwrite($fh,date('H:i:s ').$_SERVER['REMOTE_ADDR'].': '.$msg."\n");
fclose($fh);
}
}
/**
* Saves a wikitext by calling io_writeWikiPage
*
@ -968,142 +902,6 @@ function obfuscate($email) {
}
}
/**
* Return DokuWikis version
*
* @author Andreas Gohr <andi@splitbrain.org>
*/
function getVersion(){
//import version string
if(@file_exists('VERSION')){
//official release
return 'Release '.trim(io_readfile(DOKU_INC.'/VERSION'));
}elseif(is_dir('_darcs')){
//darcs checkout - read last 2000 bytes of inventory
$sz = filesize('_darcs/inventory');
$seek = max(0,$sz-2000);
$fh = fopen('_darcs/inventory','rb');
fseek($fh,$seek);
$chunk = fread($fh,2000);
fclose($fh);
$inv = preg_grep('#\*\*\d{14}[\]$]#',explode("\n",$chunk));
$cur = array_pop($inv);
preg_match('#\*\*(\d{4})(\d{2})(\d{2})#',$cur,$matches);
return 'Darcs '.$matches[1].'-'.$matches[2].'-'.$matches[3];
}else{
return 'snapshot?';
}
}
/**
* Run a few sanity checks
*
* @author Andreas Gohr <andi@splitbrain.org>
*/
function check(){
global $conf;
global $INFO;
msg('DokuWiki version: '.getVersion(),1);
if(version_compare(phpversion(),'4.3.0','<')){
msg('Your PHP version is too old ('.phpversion().' vs. 4.3.+ recommended)',-1);
}elseif(version_compare(phpversion(),'4.3.10','<')){
msg('Consider upgrading PHP to 4.3.10 or higher for security reasons (your version: '.phpversion().')',0);
}else{
msg('PHP version '.phpversion(),1);
}
if(is_writable($conf['changelog'])){
msg('Changelog is writable',1);
}else{
if (@file_exists($conf['changelog'])) {
msg('Changelog is not writable',-1);
}
}
if (isset($conf['changelog_old']) && @file_exists($conf['changelog_old'])) {
msg('Old changelog exists.', 0);
}
if (@file_exists($conf['changelog'].'_failed')) {
msg('Importing old changelog failed.', -1);
} else if (@file_exists($conf['changelog'].'_importing')) {
msg('Importing old changelog now.', 0);
} else if (@file_exists($conf['changelog'].'_import_ok')) {
msg('Old changelog imported.', 1);
if (!plugin_isdisabled('importoldchangelog')) {
msg('Importoldchangelog plugin not disabled after import.', -1);
}
}
if(is_writable($conf['datadir'])){
msg('Datadir is writable',1);
}else{
msg('Datadir is not writable',-1);
}
if(is_writable($conf['olddir'])){
msg('Attic is writable',1);
}else{
msg('Attic is not writable',-1);
}
if(is_writable($conf['mediadir'])){
msg('Mediadir is writable',1);
}else{
msg('Mediadir is not writable',-1);
}
if(is_writable($conf['cachedir'])){
msg('Cachedir is writable',1);
}else{
msg('Cachedir is not writable',-1);
}
if(is_writable($conf['lockdir'])){
msg('Lockdir is writable',1);
}else{
msg('Lockdir is not writable',-1);
}
if(is_writable(DOKU_CONF.'users.auth.php')){
msg('conf/users.auth.php is writable',1);
}else{
msg('conf/users.auth.php is not writable',0);
}
if(function_exists('mb_strpos')){
if(defined('UTF8_NOMBSTRING')){
msg('mb_string extension is available but will not be used',0);
}else{
msg('mb_string extension is available and will be used',1);
}
}else{
msg('mb_string extension not available - PHP only replacements will be used',0);
}
if($conf['allowdebug']){
msg('Debugging support is enabled. If you don\'t need it you should set $conf[\'allowdebug\'] = 0',-1);
}else{
msg('Debugging support is disabled',1);
}
msg('Your current permission for this page is '.$INFO['perm'],0);
if(is_writable($INFO['filepath'])){
msg('The current page is writable by the webserver',0);
}else{
msg('The current page is not writable by the webserver',0);
}
if($INFO['writable']){
msg('The current page is writable by you',0);
}else{
msg('The current page is not writable you',0);
}
}
/**
* Let us know if a user is tracking a page
*

250
inc/infoutils.php Normal file
View File

@ -0,0 +1,250 @@
<?php
/**
* Information and debugging functions
*
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
* @author Andreas Gohr <andi@splitbrain.org>
*/
if(!defined('DOKU_INC')) define('DOKU_INC',realpath(dirname(__FILE__).'/../').'/');
if(!defined('DOKU_MESSAGEURL')) define('DOKU_MESSAGEURL','http://www.splitbrain.org/lib/exe/msg.php?msg=');
require_once(DOKU_INC.'inc/HTTPClient.php');
/**
* Check for new messages from upstream
*
* @author Andreas Gohr <andi@splitbrain.org>
*/
function checkUpdateMessages(){
global $conf;
global $INFO;
if(!$conf['updatecheck']) return;
if($INFO['perm'] < AUTH_ADMIN) return;
$cf = $conf['cachedir'].'/messages.txt';
$lm = @filemtime($cf);
// check if new messages needs to be fetched
if($lm < time()-(60*60*24) || $lm < @filemtime(DOKU_CONF.'msg')){
$num = file(DOKU_CONF.'msg');
$num = (int) $num[0];
$http = new DokuHTTPClient();
$http->timeout = 8;
$data = $http->get(DOKU_MESSAGEURL.$num);
io_saveFile($cf,$data);
}else{
$data = io_readFile($cf);
}
// show messages through the usual message mechanism
$msgs = explode("\n%\n",$data);
foreach($msgs as $msg){
if($msg) msg($msg,2);
}
}
/**
* Return DokuWikis version
*
* @author Andreas Gohr <andi@splitbrain.org>
*/
function getVersion(){
//import version string
if(@file_exists('VERSION')){
//official release
return 'Release '.trim(io_readfile(DOKU_INC.'/VERSION'));
}elseif(is_dir('_darcs')){
//darcs checkout - read last 2000 bytes of inventory
$sz = filesize('_darcs/inventory');
$seek = max(0,$sz-2000);
$fh = fopen('_darcs/inventory','rb');
fseek($fh,$seek);
$chunk = fread($fh,2000);
fclose($fh);
$inv = preg_grep('#\*\*\d{14}[\]$]#',explode("\n",$chunk));
$cur = array_pop($inv);
preg_match('#\*\*(\d{4})(\d{2})(\d{2})#',$cur,$matches);
return 'Darcs '.$matches[1].'-'.$matches[2].'-'.$matches[3];
}else{
return 'snapshot?';
}
}
/**
* Run a few sanity checks
*
* @author Andreas Gohr <andi@splitbrain.org>
*/
function check(){
global $conf;
global $INFO;
msg('DokuWiki version: '.getVersion(),1);
if(version_compare(phpversion(),'4.3.0','<')){
msg('Your PHP version is too old ('.phpversion().' vs. 4.3.+ recommended)',-1);
}elseif(version_compare(phpversion(),'4.3.10','<')){
msg('Consider upgrading PHP to 4.3.10 or higher for security reasons (your version: '.phpversion().')',0);
}else{
msg('PHP version '.phpversion(),1);
}
if(is_writable($conf['changelog'])){
msg('Changelog is writable',1);
}else{
if (@file_exists($conf['changelog'])) {
msg('Changelog is not writable',-1);
}
}
if (isset($conf['changelog_old']) && @file_exists($conf['changelog_old'])) {
msg('Old changelog exists.', 0);
}
if (@file_exists($conf['changelog'].'_failed')) {
msg('Importing old changelog failed.', -1);
} else if (@file_exists($conf['changelog'].'_importing')) {
msg('Importing old changelog now.', 0);
} else if (@file_exists($conf['changelog'].'_import_ok')) {
msg('Old changelog imported.', 1);
if (!plugin_isdisabled('importoldchangelog')) {
msg('Importoldchangelog plugin not disabled after import.', -1);
}
}
if(is_writable($conf['datadir'])){
msg('Datadir is writable',1);
}else{
msg('Datadir is not writable',-1);
}
if(is_writable($conf['olddir'])){
msg('Attic is writable',1);
}else{
msg('Attic is not writable',-1);
}
if(is_writable($conf['mediadir'])){
msg('Mediadir is writable',1);
}else{
msg('Mediadir is not writable',-1);
}
if(is_writable($conf['cachedir'])){
msg('Cachedir is writable',1);
}else{
msg('Cachedir is not writable',-1);
}
if(is_writable($conf['lockdir'])){
msg('Lockdir is writable',1);
}else{
msg('Lockdir is not writable',-1);
}
if(is_writable(DOKU_CONF.'users.auth.php')){
msg('conf/users.auth.php is writable',1);
}else{
msg('conf/users.auth.php is not writable',0);
}
if(function_exists('mb_strpos')){
if(defined('UTF8_NOMBSTRING')){
msg('mb_string extension is available but will not be used',0);
}else{
msg('mb_string extension is available and will be used',1);
}
}else{
msg('mb_string extension not available - PHP only replacements will be used',0);
}
if($conf['allowdebug']){
msg('Debugging support is enabled. If you don\'t need it you should set $conf[\'allowdebug\'] = 0',-1);
}else{
msg('Debugging support is disabled',1);
}
msg('Your current permission for this page is '.$INFO['perm'],0);
if(is_writable($INFO['filepath'])){
msg('The current page is writable by the webserver',0);
}else{
msg('The current page is not writable by the webserver',0);
}
if($INFO['writable']){
msg('The current page is writable by you',0);
}else{
msg('The current page is not writable you',0);
}
}
/**
* print a message
*
* If HTTP headers were not sent yet the message is added
* to the global message array else it's printed directly
* using html_msgarea()
*
*
* Levels can be:
*
* -1 error
* 0 info
* 1 success
*
* @author Andreas Gohr <andi@splitbrain.org>
* @see html_msgarea
*/
function msg($message,$lvl=0,$line='',$file=''){
global $MSG;
$errors[-1] = 'error';
$errors[0] = 'info';
$errors[1] = 'success';
$errors[2] = 'notify';
if($line || $file) $message.=' ['.basename($file).':'.$line.']';
if(!headers_sent()){
if(!isset($MSG)) $MSG = array();
$MSG[]=array('lvl' => $errors[$lvl], 'msg' => $message);
}else{
$MSG = array();
$MSG[]=array('lvl' => $errors[$lvl], 'msg' => $message);
if(function_exists('html_msgarea')){
html_msgarea();
}else{
print "ERROR($lvl) $message";
}
}
}
/**
* print debug messages
*
* little function to print the content of a var
*
* @author Andreas Gohr <andi@splitbrain.org>
*/
function dbg($msg,$hidden=false){
(!$hidden) ? print '<pre class="dbg">' : print "<!--\n";
print_r($msg);
(!$hidden) ? print '</pre>' : print "\n-->";
}
/**
* Print info to a log file
*
* @author Andreas Gohr <andi@splitbrain.org>
*/
function dbglog($msg){
global $conf;
$file = $conf['cachedir'].'/debug.log';
$fh = fopen($file,'a');
if($fh){
fwrite($fh,date('H:i:s ').$_SERVER['REMOTE_ADDR'].': '.$msg."\n");
fclose($fh);
}
}

BIN
lib/images/notify.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 789 B

View File

@ -96,6 +96,7 @@ $lang['disableactions_wikicode'] = 'View source/Export Raw';
$lang['disableactions_other'] = 'Other actions (comma separated)';
/* Advanced Options */
$lang['updatecheck'] = 'Check for updates and security warnings? DokuWiki needs to contact splitbrain.org for this feature.';
$lang['userewrite'] = 'Use nice URLs';
$lang['useslash'] = 'Use slash as namespace separator in URLs';
$lang['usedraft'] = 'Automatically save a draft while editing';

View File

@ -147,6 +147,7 @@ $meta['jpg_quality'] = array('numeric','_pattern' => '/^100$|^[1-9]?[0-9]$/');
$meta['fetchsize'] = array('numeric');
$meta['_advanced'] = array('fieldset');
$meta['updatecheck'] = array('onoff');
$meta['userewrite'] = array('multichoice','_choices' => array(0,1,2));
$meta['useslash'] = array('onoff');
$meta['sepchar'] = array('sepchar');

View File

@ -46,6 +46,17 @@ div.success {
overflow: hidden;
}
div.notify {
background: #ffc url(../images/notify.png) 0.5em 0px no-repeat;
color: #000;
border-bottom: 1px solid #ffa;
font-size: 90%;
margin: 0;
padding-left: 3em;
overflow: hidden;
}
/* image alignment */
.medialeft {
float: left;