summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--conf/dokuwiki.php5
-rw-r--r--doku.php3
-rw-r--r--inc/common.php218
-rw-r--r--inc/infoutils.php250
-rw-r--r--lib/images/notify.pngbin0 -> 789 bytes
-rw-r--r--lib/plugins/config/lang/en/lang.php1
-rw-r--r--lib/plugins/config/settings/config.metadata.php1
-rw-r--r--lib/styles/style.css11
8 files changed, 279 insertions, 210 deletions
diff --git a/conf/dokuwiki.php b/conf/dokuwiki.php
index 542431029..972c4f57e 100644
--- a/conf/dokuwiki.php
+++ b/conf/dokuwiki.php
@@ -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)
diff --git a/doku.php b/doku.php
index d2be871b2..48ac56682 100644
--- a/doku.php
+++ b/doku.php
@@ -63,6 +63,9 @@
//prepare breadcrumbs (initialize a static var)
breadcrumbs();
+ // check upstream
+ checkUpdateMessages();
+
trigger_event('DOKUWIKI_STARTED',$tmp=array());
//close session
diff --git a/inc/common.php b/inc/common.php
index 016c7922d..271446f55 100644
--- a/inc/common.php
+++ b/inc/common.php
@@ -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
@@ -169,45 +170,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
*
* @author Andreas Gohr <andi@splitbrain.org>
@@ -696,34 +658,6 @@ function con($pre,$text,$suf,$pretty=false){
}
/**
- * 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
*
* @author Andreas Gohr <andi@splitbrain.org>
@@ -969,142 +903,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
*
* @author Andreas Gohr <andi@splitbrain.org>
diff --git a/inc/infoutils.php b/inc/infoutils.php
new file mode 100644
index 000000000..fcaba23cf
--- /dev/null
+++ b/inc/infoutils.php
@@ -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);
+ }
+}
+
+
diff --git a/lib/images/notify.png b/lib/images/notify.png
new file mode 100644
index 000000000..6e0015df4
--- /dev/null
+++ b/lib/images/notify.png
Binary files differ
diff --git a/lib/plugins/config/lang/en/lang.php b/lib/plugins/config/lang/en/lang.php
index d92e930f2..db8c270b9 100644
--- a/lib/plugins/config/lang/en/lang.php
+++ b/lib/plugins/config/lang/en/lang.php
@@ -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';
diff --git a/lib/plugins/config/settings/config.metadata.php b/lib/plugins/config/settings/config.metadata.php
index b55c0e930..09d3736f3 100644
--- a/lib/plugins/config/settings/config.metadata.php
+++ b/lib/plugins/config/settings/config.metadata.php
@@ -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');
diff --git a/lib/styles/style.css b/lib/styles/style.css
index cb39516c4..209e5654c 100644
--- a/lib/styles/style.css
+++ b/lib/styles/style.css
@@ -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;