'; $template->footer(); break; }
- echo PageUtils::pagediff($paths->cpage['urlname_nons'], $paths->namespace, $id1, $id2);
+ echo PageUtils::pagediff($paths->page_id, $paths->namespace, $id1, $id2);
break;
case "jsres":
die('// ERROR: this section is deprecated and has moved to includes/clientside/static/enano-lib-basic.js.');
@@ -277,10 +288,10 @@
$json = new Services_JSON(SERVICES_JSON_LOOSE_TYPE);
$ret = array('tags' => array(), 'user_level' => $session->user_level, 'can_add' => $session->get_permissions('tag_create'));
- $q = $db->sql_query('SELECT t.tag_id, t.tag_name, pg.pg_target IS NOT NULL AS used_in_acl, t.user FROM '.table_prefix.'tags AS t
+ $q = $db->sql_query('SELECT t.tag_id, t.tag_name, pg.pg_target IS NOT NULL AS used_in_acl, t.user_id FROM '.table_prefix.'tags AS t
LEFT JOIN '.table_prefix.'page_groups AS pg
ON ( ( pg.pg_type = ' . PAGE_GRP_TAGGED . ' AND pg.pg_target=t.tag_name ) OR ( pg.pg_type IS NULL AND pg.pg_target IS NULL ) )
- WHERE t.page_id=\'' . $db->escape($paths->cpage['urlname_nons']) . '\' AND t.namespace=\'' . $db->escape($paths->namespace) . '\';');
+ WHERE t.page_id=\'' . $db->escape($paths->page_id) . '\' AND t.namespace=\'' . $db->escape($paths->namespace) . '\';');
if ( !$q )
$db->_die();
@@ -288,11 +299,11 @@
{
$can_del = true;
- $perm = ( $row['user'] != $session->user_id ) ?
+ $perm = ( $row['user_id'] != $session->user_id ) ?
'tag_delete_other' :
'tag_delete_own';
- if ( $row['user'] == 1 && !$session->user_logged_in )
+ if ( $row['user_id'] == 1 && !$session->user_logged_in )
// anonymous user trying to delete tag (hardcode blacklisted)
$can_del = false;
@@ -340,7 +351,7 @@
}
// check if tag is already on page
- $q = $db->sql_query('SELECT 1 FROM '.table_prefix.'tags WHERE page_id=\'' . $db->escape($paths->cpage['urlname_nons']) . '\' AND namespace=\'' . $db->escape($paths->namespace) . '\' AND tag_name=\'' . $tag . '\';');
+ $q = $db->sql_query('SELECT 1 FROM '.table_prefix.'tags WHERE page_id=\'' . $db->escape($paths->page_id) . '\' AND namespace=\'' . $db->escape($paths->namespace) . '\' AND tag_name=\'' . $tag . '\';');
if ( !$q )
$db->_die();
if ( $db->numrows() > 0 )
@@ -364,7 +375,7 @@
$db->free_result();
// we're good
- $q = $db->sql_query('INSERT INTO '.table_prefix.'tags(tag_name,page_id,namespace,user) VALUES(\'' . $tag . '\', \'' . $db->escape($paths->cpage['urlname_nons']) . '\', \'' . $db->escape($paths->namespace) . '\', ' . $session->user_id . ');');
+ $q = $db->sql_query('INSERT INTO '.table_prefix.'tags(tag_name,page_id,namespace,user_id) VALUES(\'' . $tag . '\', \'' . $db->escape($paths->page_id) . '\', \'' . $db->escape($paths->namespace) . '\', ' . $session->user_id . ');');
if ( !$q )
$db->_die();
@@ -380,7 +391,7 @@
if ( empty($tag_id) )
die('Invalid tag ID');
- $q = $db->sql_query('SELECT t.tag_id, t.user, t.page_id, t.namespace, pg.pg_target IS NOT NULL AS used_in_acl FROM '.table_prefix.'tags AS t
+ $q = $db->sql_query('SELECT t.tag_id, t.user_id, t.page_id, t.namespace, pg.pg_target IS NOT NULL AS used_in_acl FROM '.table_prefix.'tags AS t
LEFT JOIN '.table_prefix.'page_groups AS pg
ON ( pg.pg_id IS NULL OR ( pg.pg_target = t.tag_name AND pg.pg_type = ' . PAGE_GRP_TAGGED . ' ) )
WHERE t.tag_id=' . $tag_id . ';');
@@ -394,16 +405,16 @@
$row = $db->fetchrow();
$db->free_result();
- if ( $row['page_id'] == $paths->cpage['urlname_nons'] && $row['namespace'] == $paths->namespace )
+ if ( $row['page_id'] == $paths->page_id && $row['namespace'] == $paths->namespace )
$perms =& $session;
else
$perms = $session->fetch_page_acl($row['page_id'], $row['namespace']);
- $perm = ( $row['user'] != $session->user_id ) ?
+ $perm = ( $row['user_id'] != $session->user_id ) ?
'tag_delete_other' :
'tag_delete_own';
- if ( $row['user'] == 1 && !$session->user_logged_in )
+ if ( $row['user_id'] == 1 && !$session->user_logged_in )
// anonymous user trying to delete tag (hardcode blacklisted)
die('You are not authorized to delete this tag.');
diff -r 474f8be55943 -r ab66d6d1f1f4 cron.php
--- a/cron.php Fri Dec 07 18:47:37 2007 -0500
+++ b/cron.php Wed Dec 19 22:55:40 2007 -0500
@@ -2,7 +2,7 @@
/*
* Enano - an open-source CMS capable of wiki functions, Drupal-like sidebar blocks, and everything in between
- * Version 1.0.2 (Coblynau)
+ * Version 1.0.3 (Dyrad)
* Copyright (C) 2006-2007 Dan Fuhry
*
* This program is Free Software; you can redistribute and/or modify it under the terms of the GNU General Public License
diff -r 474f8be55943 -r ab66d6d1f1f4 includes/captcha.php
--- a/includes/captcha.php Fri Dec 07 18:47:37 2007 -0500
+++ b/includes/captcha.php Wed Dec 19 22:55:40 2007 -0500
@@ -2,7 +2,7 @@
/*
* Enano - an open-source CMS capable of wiki functions, Drupal-like sidebar blocks, and everything in between
- * Version 1.1.1
+ * Version 1.0.3 (Dyrad)
* Copyright (C) 2006-2007 Dan Fuhry
* captcha.php - visual confirmation system used during registration
*
diff -r 474f8be55943 -r ab66d6d1f1f4 includes/clientside/jsres.php
--- a/includes/clientside/jsres.php Fri Dec 07 18:47:37 2007 -0500
+++ b/includes/clientside/jsres.php Wed Dec 19 22:55:40 2007 -0500
@@ -2,7 +2,7 @@
/*
* Enano - an open-source CMS capable of wiki functions, Drupal-like sidebar blocks, and everything in between
- * Version 1.1.1
+ * Version 1.0.3 (Dyrad)
* Copyright (C) 2006-2007 Dan Fuhry
* jsres.php - the Enano client-side runtime, a.k.a. AJAX on steroids
*
@@ -40,7 +40,7 @@
{
echo "/*
* Enano - an open-source CMS capable of wiki functions, Drupal-like sidebar blocks, and everything in between
- * Version 1.1.1
+ * Version 1.0.3 (Dyrad)
* [Aggressively compressed] Javascript client code
* Copyright (C) 2006-2007 Dan Fuhry
* Enano is Free Software, licensed under the GNU General Public License; see http://enanocms.org/ for details.
diff -r 474f8be55943 -r ab66d6d1f1f4 includes/clientside/static/acl.js
diff -r 474f8be55943 -r ab66d6d1f1f4 includes/clientside/static/ajax.js
--- a/includes/clientside/static/ajax.js Fri Dec 07 18:47:37 2007 -0500
+++ b/includes/clientside/static/ajax.js Wed Dec 19 22:55:40 2007 -0500
@@ -42,6 +42,81 @@
ajax.send(parms);
}
+/**
+ * Show a friendly error message depicting an AJAX response that is not valid JSON
+ * @param string Response text
+ * @param string Custom error message. If omitted, the default will be shown.
+ */
+
+function handle_invalid_json(response, customerror)
+{
+ var mainwin = $('ajaxEditContainer').object;
+ mainwin.innerHTML = '';
+
+ // Title
+ var h3 = document.createElement('h3');
+ h3.appendChild(document.createTextNode('The site encountered an error while processing your request.'));
+ mainwin.appendChild(h3);
+
+ if ( typeof(customerror) == 'string' )
+ {
+ var el = document.createElement('p');
+ el.appendChild(document.createTextNode(customerror));
+ mainwin.appendChild(el);
+ }
+ else
+ {
+ customerror = 'We unexpectedly received the following response from the server. The response should have been in the JSON ';
+ customerror += 'serialization format, but the response wasn\'t composed only of the JSON response. There are three possible triggers';
+ customerror += 'for this problem:';
+ var el = document.createElement('p');
+ el.appendChild(document.createTextNode(customerror));
+ mainwin.appendChild(el);
+ var ul = document.createElement('ul');
+ var li1 = document.createElement('li');
+ var li2 = document.createElement('li');
+ var li3 = document.createElement('li');
+ li1.appendChild(document.createTextNode('The server sent back a bad HTTP response code and thus sent an error page instead of running Enano. This indicates a possible problem with your server, and is not likely to be a bug with Enano.'));
+ var osc_exception = ( window.location.hostname == 'demo.opensourcecms.com' ) ? ' This is KNOWN to be the case with the OpenSourceCMS.com demo version of Enano.' : '';
+ li2.appendChild(document.createTextNode('The server sent back the expected JSON response, but also injected some code into the response that should not be there. Typically this consists of advertisement code. In this case, the administrator of this site will have to contact their web host to have advertisements disabled.' + osc_exception));
+ li3.appendChild(document.createTextNode('It\'s possible that Enano triggered a PHP error or warning. In this case, you may be looking at a bug in Enano.'));
+
+ ul.appendChild(li1);
+ ul.appendChild(li2);
+ ul.appendChild(li3);
+ mainwin.appendChild(ul);
+ }
+
+ var p2 = document.createElement('p');
+ p2.appendChild(document.createTextNode('The response received from the server is as follows:'));
+ mainwin.appendChild(p2);
+
+ var pre = document.createElement('pre');
+ pre.appendChild(document.createTextNode(response));
+ mainwin.appendChild(pre);
+
+ var p3 = document.createElement('p');
+ p3.appendChild(document.createTextNode('You may also choose to view the response as HTML. '));
+ var a = document.createElement('a');
+ a.appendChild(document.createTextNode('View as HTML...'));
+ a._resp = response;
+ a.id = 'invalidjson_link';
+ a.onclick = function()
+ {
+ var mb = new messagebox(MB_YESNO | MB_ICONEXCLAMATION, 'Do you really want to view this response as HTML?', 'If the response was changed during transmission to include malicious code, you may be allowing that malicious code to run by viewing the response as HTML. Only do this if you have reviewed the response text and have found no suspicious code in it.');
+ mb.onclick['Yes'] = function()
+ {
+ var html = $('invalidjson_link').object._resp;
+ var win = window.open('about:blank', 'invalidjson_htmlwin', 'width=550,height=400,status=no,toolbars=no,toolbar=no,address=no,scroll=yes');
+ win.document.write(html);
+ }
+ return false;
+ }
+ a.href = '#';
+ p3.appendChild(a);
+ mainwin.appendChild(p3);
+}
+
function ajaxEscape(text)
{
/*
@@ -925,7 +1000,7 @@
resptext = resptext.substr(0, resptext.length-1);
if ( resptext.substr(0, 1) != '{' )
{
- alert('Invalid JSON response from server:\n' + resptext);
+ handle_invalid_json(resptext);
return false;
}
var json = parseJSON(resptext);
@@ -1025,7 +1100,7 @@
resptext = resptext.substr(0, resptext.length-1);
if ( resptext.substr(0, 1) != '{' )
{
- alert('Invalid JSON response from server:\n' + resptext);
+ handle_invalid_json(resptext);
return false;
}
var json = parseJSON(resptext);
diff -r 474f8be55943 -r ab66d6d1f1f4 includes/clientside/static/faders.js
--- a/includes/clientside/static/faders.js Fri Dec 07 18:47:37 2007 -0500
+++ b/includes/clientside/static/faders.js Wed Dec 19 22:55:40 2007 -0500
@@ -74,6 +74,8 @@
* onclick - an array of functions to be called on button click events
* NOTE: key names are to be strings, and they must be the value of the input, CaSe-SeNsItIvE
* onbeforeclick - same as onclick but called before the messagebox div is destroyed
+ * Methods:
+ * destroy: kills the running message box
* Example:
* var my_message = new messagebox(MB_OK|MB_ICONSTOP, 'Error logging in', 'The username and/or password is incorrect. Please check the username and retype your password');
* my_message.onclick['OK'] = function() {
@@ -275,6 +277,14 @@
{
this.text_area.innerHTML = text;
};
+
+ this.destroy = function()
+ {
+ var mbdiv = document.getElementById('messageBox');
+ mbdiv.parentNode.removeChild(mbdiv.nextSibling);
+ mbdiv.parentNode.removeChild(mbdiv);
+ enlighten(true);
+ };
//domObjChangeOpac(0, mydiv);
//domObjChangeOpac(0, master_div);
diff -r 474f8be55943 -r ab66d6d1f1f4 includes/clientside/static/misc.js
--- a/includes/clientside/static/misc.js Fri Dec 07 18:47:37 2007 -0500
+++ b/includes/clientside/static/misc.js Wed Dec 19 22:55:40 2007 -0500
@@ -402,7 +402,8 @@
var response = String(ajax.responseText);
if ( response.substr(0,1) != '{' )
{
- alert('Invalid JSON response from server: ' + response);
+ handle_invalid_json(response);
+ ajax_auth_mb_cache.destroy();
return false;
}
response = parseJSON(response);
@@ -447,56 +448,77 @@
}
var disableme = ( disable_controls ) ? 'disabled="disabled" ' : '';
form_html += ' \
-
\
-
\
-
' + $lang.get('user_login_field_username') + ':
\
-
\
-
\
-
' + $lang.get('user_login_field_password') + ':
\
-
\
- ' + captcha_html + ' \
-
\
-
\
+ ';
+
\
+
\
+
\
+ \
+ \
+ ';
ajax_auth_mb_cache.updateContent(form_html);
$('messageBox').object.nextSibling.firstChild.tabindex = '3';
if ( typeof(response.username) == 'string' )
{
$('ajaxlogin_user').object.value = response.username;
- $('ajaxlogin_pass').object.focus();
+ if ( IE )
+ {
+ setTimeout("document.forms['ajax_login_form'].password.focus();", 200);
+ }
+ else
+ {
+ $('ajaxlogin_pass').object.focus();
+ }
}
else
{
- $('ajaxlogin_user').object.focus();
+ if ( IE )
+ {
+ setTimeout("document.forms['ajax_login_form'].username.focus();", 200);
+ }
+ else
+ {
+ $('ajaxlogin_user').object.focus();
+ }
}
- if ( ajax_auth_show_captcha )
- {
- $('ajaxlogin_captcha_code').object.onblur = function(e) { if ( !shift ) $('messageBox').object.nextSibling.firstChild.focus(); };
- $('ajaxlogin_captcha_code').object.onkeypress = function(e) { if ( !e && IE ) return true; if ( e.keyCode == 13 ) $('messageBox').object.nextSibling.firstChild.click(); };
- }
- else
+ var enter_obj = ( ajax_auth_show_captcha ) ? 'ajaxlogin_captcha_code' : 'ajaxlogin_pass';
+ $(enter_obj).object.onblur = function(e) { if ( !shift ) $('messageBox').object.nextSibling.firstChild.focus(); };
+ $(enter_obj).object.onkeypress = function(e)
{
- $('ajaxlogin_pass').object.onblur = function(e) { if ( !shift ) $('messageBox').object.nextSibling.firstChild.focus(); };
- $('ajaxlogin_pass').object.onkeypress = function(e) { if ( !e && IE ) return true; if ( e.keyCode == 13 ) $('messageBox').object.nextSibling.firstChild.click(); };
- }
- if ( disable_controls )
- {
- var panel = document.getElementById('messageBoxButtons');
- panel.firstChild.disabled = true;
- }
+ // Trigger a form submit when the password field is focused and the user presses enter
+
+ // IE doesn't give us an event object when it should - check window.event. If that
+ // still fails, give up.
+ if ( !e )
+ {
+ e = window.event;
+ }
+ if ( !e && IE )
+ {
+ return true;
+ }
+ if ( e.keyCode == 13 )
+ {
+ ajaxValidateLogin();
+ }
+ };
/*
## This causes the background image to disappear under Fx 2
if ( shown_error )
diff -r 474f8be55943 -r ab66d6d1f1f4 includes/comment.php
--- a/includes/comment.php Fri Dec 07 18:47:37 2007 -0500
+++ b/includes/comment.php Wed Dec 19 22:55:40 2007 -0500
@@ -2,7 +2,7 @@
/*
* Enano - an open-source CMS capable of wiki functions, Drupal-like sidebar blocks, and everything in between
- * Version 1.1.1
+ * Version 1.0.3 (Dyrad)
* Copyright (C) 2006-2007 Dan Fuhry
*
* This program is Free Software; you can redistribute and/or modify it under the terms of the GNU General Public License
@@ -54,7 +54,7 @@
global $db, $session, $paths, $template, $plugins; // Common objects
// Initialize permissions
- if ( $page_id == $paths->cpage['urlname_nons'] && $namespace == $paths->namespace )
+ if ( $page_id == $paths->page_id && $namespace == $paths->namespace )
$this->perms =& $GLOBALS['session'];
else
$this->perms = $session->fetch_page_acl($page_id, $namespace);
@@ -113,7 +113,7 @@
ON ( ( b.user_id=' . $session->user_id.' AND b.buddy_user_id=c.user_id ) OR b.user_id IS NULL)
WHERE page_id=\'' . $this->page_id . '\'
AND namespace=\'' . $this->namespace . '\'
- GROUP BY c.comment_id
+ GROUP BY c.comment_id,c.name,c.subject,c.comment_data,c.time,c.approved,u.user_level,u.user_id,u.signature,b.buddy_id,b.is_friend
ORDER BY c.time ASC;');
$count_appr = 0;
$count_total = 0;
diff -r 474f8be55943 -r ab66d6d1f1f4 includes/common.php
--- a/includes/common.php Fri Dec 07 18:47:37 2007 -0500
+++ b/includes/common.php Wed Dec 19 22:55:40 2007 -0500
@@ -155,7 +155,13 @@
// The first thing we need to do is start the database connection. At this point, for all we know, Enano might not
// even be installed. If this connection attempt fails and it's because of a missing or corrupt config file, the
// user will be redirected (intelligently) to install.php.
-$db = new mysql();
+
+@include(ENANO_ROOT . '/config.php');
+unset($dbuser, $dbpasswd);
+if ( !isset($dbdriver) )
+ $dbdriver = 'mysql';
+
+$db = new $dbdriver();
$db->connect();
// The URL separator is the character appended to contentPath + url_title type strings.
@@ -347,7 +353,7 @@
// If the site is disabled, bail out, unless we're trying to log in or administer the site
if(getConfig('site_disabled') == '1' && $session->user_level < USER_LEVEL_ADMIN)
{
- if ( $paths->namespace == 'Admin' || ( $paths->namespace == 'Special' && ( $paths->cpage['urlname_nons'] == 'CSS' || $paths->cpage['urlname_nons'] == 'Administration' || $paths->cpage['urlname_nons'] == 'Login' ) ) )
+ if ( $paths->namespace == 'Admin' || ( $paths->namespace == 'Special' && ( $paths->page_id == 'CSS' || $paths->page_id == 'Administration' || $paths->page_id == 'Login' ) ) )
{
// do nothing; allow execution to continue
}
diff -r 474f8be55943 -r ab66d6d1f1f4 includes/constants.php
--- a/includes/constants.php Fri Dec 07 18:47:37 2007 -0500
+++ b/includes/constants.php Wed Dec 19 22:55:40 2007 -0500
@@ -2,7 +2,7 @@
/*
* Enano - an open-source CMS capable of wiki functions, Drupal-like sidebar blocks, and everything in between
- * Version 1.1.1
+ * Version 1.0.3 (Dyrad)
* Copyright (C) 2006-2007 Dan Fuhry
* constants.php - important defines used Enano-wide
*
diff -r 474f8be55943 -r ab66d6d1f1f4 includes/dbal.php
--- a/includes/dbal.php Fri Dec 07 18:47:37 2007 -0500
+++ b/includes/dbal.php Wed Dec 19 22:55:40 2007 -0500
@@ -120,46 +120,56 @@
return $internal_text;
}
- function connect()
+ function connect($manual_credentials = false, $dbhost = false, $dbuser = false, $dbpasswd = false, $dbname = false)
{
$this->enable_errorhandler();
- if ( defined('IN_ENANO_INSTALL') && !defined('IN_ENANO_UPGRADE') )
- {
- @include(ENANO_ROOT.'/config.new.php');
- }
- else
+ define('ENANO_DBLAYER', 'MYSQL');
+ define('ENANO_SQLFUNC_LOWERCASE', 'lcase');
+ define('ENANO_SQL_MULTISTRING_PRFIX', '');
+ define('ENANO_SQL_BOOLEAN_TRUE', 'true');
+ define('ENANO_SQL_BOOLEAN_FALSE', 'false');
+
+ if ( !$manual_credentials )
{
- @include(ENANO_ROOT.'/config.php');
- }
+ if ( defined('IN_ENANO_INSTALL') && !defined('IN_ENANO_UPGRADE') )
+ {
+ @include(ENANO_ROOT.'/config.new.php');
+ }
+ else
+ {
+ @include(ENANO_ROOT.'/config.php');
+ }
+
+ if ( isset($crypto_key) )
+ unset($crypto_key); // Get this sucker out of memory fast
- if ( isset($crypto_key) )
- unset($crypto_key); // Get this sucker out of memory fast
-
- if ( !defined('ENANO_INSTALLED') && !defined('MIDGET_INSTALLED') && !defined('IN_ENANO_INSTALL') )
- {
- // scriptPath isn't set yet - we need to autodetect it to avoid infinite redirects
- if ( !defined('scriptPath') )
+ if ( !defined('ENANO_INSTALLED') && !defined('MIDGET_INSTALLED') && !defined('IN_ENANO_INSTALL') )
{
- if ( isset($_SERVER['PATH_INFO']) && !preg_match('/index\.php$/', $_SERVER['PATH_INFO']) )
+ // scriptPath isn't set yet - we need to autodetect it to avoid infinite redirects
+ if ( !defined('scriptPath') )
{
- $_SERVER['REQUEST_URI'] = preg_replace(';' . preg_quote($_SERVER['PATH_INFO']) . '$;', '', $_SERVER['REQUEST_URI']);
- }
- if ( !preg_match('/\.php$/', $_SERVER['REQUEST_URI']) )
- {
- // user requested http://foo/enano as opposed to http://foo/enano/index.php
- $_SERVER['REQUEST_URI'] .= '/index.php';
+ if ( isset($_SERVER['PATH_INFO']) && !preg_match('/index\.php$/', $_SERVER['PATH_INFO']) )
+ {
+ $_SERVER['REQUEST_URI'] = preg_replace(';' . preg_quote($_SERVER['PATH_INFO']) . '$;', '', $_SERVER['REQUEST_URI']);
+ }
+ if ( !preg_match('/\.php$/', $_SERVER['REQUEST_URI']) )
+ {
+ // user requested http://foo/enano as opposed to http://foo/enano/index.php
+ $_SERVER['REQUEST_URI'] .= '/index.php';
+ }
+ $sp = dirname($_SERVER['REQUEST_URI']);
+ if($sp == '/' || $sp == '\\') $sp = '';
+ define('scriptPath', $sp);
+ define('contentPath', "$sp/index.php?title=");
}
- $sp = dirname($_SERVER['REQUEST_URI']);
- if($sp == '/' || $sp == '\\') $sp = '';
- define('scriptPath', $sp);
- define('contentPath', "$sp/index.php?title=");
+ $loc = scriptPath . '/install.php';
+ // header("Location: $loc");
+ redirect($loc, 'Enano not installed', 'We can\'t seem to find an Enano installation (valid config file). You will be transferred to the installation wizard momentarily...', 3);
+ exit;
}
- $loc = scriptPath . '/install.php';
- // header("Location: $loc");
- redirect($loc, 'Enano not installed', 'We can\'t seem to find an Enano installation (valid config file). You will be transferred to the installation wizard momentarily...', 3);
- exit;
}
+
$this->_conn = @mysql_connect($dbhost, $dbuser, $dbpasswd);
unset($dbuser);
unset($dbpasswd); // Security
@@ -778,4 +788,750 @@
}
}
+class postgresql {
+ var $num_queries, $query_backtrace, $query_times, $query_sources, $latest_result, $latest_query, $_conn, $sql_stack_fields, $sql_stack_values, $debug;
+ var $row = array();
+ var $rowset = array();
+ var $errhandler;
+
+ function enable_errorhandler()
+ {
+ // echo "DBAL: enabling error handler ";
+ if ( function_exists('debug_backtrace') )
+ {
+ $this->errhandler = set_error_handler('db_error_handler');
+ }
+ }
+
+ function disable_errorhandler()
+ {
+ // echo "DBAL: disabling error handler ";
+ if ( $this->errhandler )
+ {
+ set_error_handler($this->errhandler);
+ }
+ else
+ {
+ restore_error_handler();
+ }
+ }
+
+ function sql_backtrace()
+ {
+ return implode("\n-------------------------------------------------------------------\n", $this->query_backtrace);
+ }
+
+ function ensure_connection()
+ {
+ if(!$this->_conn)
+ {
+ $this->connect();
+ }
+ }
+
+ function _die($t = '') {
+ if(defined('ENANO_HEADERS_SENT')) {
+ ob_clean();
+ }
+ header('HTTP/1.1 500 Internal Server Error');
+ $bt = $this->latest_query; // $this->sql_backtrace();
+ $e = htmlspecialchars(pg_last_error());
+ if($e=='') $e='<none>';
+ $t = ( !empty($t) ) ? $t : '<No error description provided>';
+ global $email;
+ $email_info = ( defined('ENANO_CONFIG_FETCHED') && is_object($email) ) ? ', at <' . $email->jscode() . $email->encryptEmail(getConfig('contact_email')) . '>' : '';
+ $internal_text = '
The site was unable to finish serving your request.
+
We apologize for the inconveience, but an error occurred in the Enano database layer. Please report the full text of this page to the administrator of this site' . $email_info . '.
+
Description or location of error: '.$t.'
+ Error returned by PostgreSQL extension: ' . $e . '
+ Most recent SQL query:
The site was unable to finish serving your request.
+
We apologize for the inconveience, but an error occurred in the Enano database layer. Please report the full text of this page to the administrator of this site' . $email_info . '.
+
Description or location of error: '.$t.'
+ Error returned by MySQL extension: ' . $e . '
+ Most recent SQL query:
+
'.$bt.'
';
+ return $internal_text;
+ }
+
+ function connect($manual_credentials = false, $dbhost = false, $dbuser = false, $dbpasswd = false, $dbname = false)
+ {
+ $this->enable_errorhandler();
+
+ define('ENANO_DBLAYER', 'PGSQL');
+ define('ENANO_SQLFUNC_LOWERCASE', 'lower');
+ define('ENANO_SQL_MULTISTRING_PRFIX', 'E');
+ define('ENANO_SQL_BOOLEAN_TRUE', '1');
+ define('ENANO_SQL_BOOLEAN_FALSE', '0');
+
+ if ( !$manual_credentials )
+ {
+ if ( defined('IN_ENANO_INSTALL') && !defined('IN_ENANO_UPGRADE') )
+ {
+ @include(ENANO_ROOT.'/config.new.php');
+ }
+ else
+ {
+ @include(ENANO_ROOT.'/config.php');
+ }
+
+ if ( isset($crypto_key) )
+ unset($crypto_key); // Get this sucker out of memory fast
+
+ if ( !defined('ENANO_INSTALLED') && !defined('MIDGET_INSTALLED') && !defined('IN_ENANO_INSTALL') )
+ {
+ // scriptPath isn't set yet - we need to autodetect it to avoid infinite redirects
+ if ( !defined('scriptPath') )
+ {
+ if ( isset($_SERVER['PATH_INFO']) && !preg_match('/index\.php$/', $_SERVER['PATH_INFO']) )
+ {
+ $_SERVER['REQUEST_URI'] = preg_replace(';' . preg_quote($_SERVER['PATH_INFO']) . '$;', '', $_SERVER['REQUEST_URI']);
+ }
+ if ( !preg_match('/\.php$/', $_SERVER['REQUEST_URI']) )
+ {
+ // user requested http://foo/enano as opposed to http://foo/enano/index.php
+ $_SERVER['REQUEST_URI'] .= '/index.php';
+ }
+ $sp = dirname($_SERVER['REQUEST_URI']);
+ if($sp == '/' || $sp == '\\') $sp = '';
+ define('scriptPath', $sp);
+ define('contentPath', "$sp/index.php?title=");
+ }
+ $loc = scriptPath . '/install.php';
+ // header("Location: $loc");
+ redirect($loc, 'Enano not installed', 'We can\'t seem to find an Enano installation (valid config file). You will be transferred to the installation wizard momentarily...', 3);
+ exit;
+ }
+ }
+ $this->_conn = @pg_connect("host=$dbhost port=5432 dbname=$dbname user=$dbuser password=$dbpasswd");
+ unset($dbuser);
+ unset($dbpasswd); // Security
+
+ if ( !$this->_conn )
+ {
+ grinding_halt('Enano is having a problem', '
Error: couldn\'t connect to PostgreSQL. '.pg_last_error().'
');
+ }
+
+ // Reset some variables
+ $this->query_backtrace = array();
+ $this->query_times = array();
+ $this->query_sources = array();
+ $this->num_queries = 0;
+
+ $this->debug = ( defined('ENANO_DEBUG') );
+
+ // We're in!
+ $this->disable_errorhandler();
+ return true;
+ }
+
+ function sql_query($q)
+ {
+ $this->enable_errorhandler();
+
+ if ( $this->debug && function_exists('debug_backtrace') )
+ {
+ $backtrace = @debug_backtrace();
+ if ( is_array($backtrace) )
+ {
+ $bt = $backtrace[0];
+ if ( isset($backtrace[1]['class']) )
+ {
+ if ( $backtrace[1]['class'] == 'sessionManager' )
+ {
+ $bt = $backtrace[1];
+ }
+ }
+ $this->query_sources[$q] = substr($bt['file'], strlen(ENANO_ROOT) + 1) . ', line ' . $bt['line'];
+ }
+ unset($backtrace);
+ }
+
+ $this->num_queries++;
+ $this->query_backtrace[] = $q;
+ $this->latest_query = $q;
+ // First make sure we have a connection
+ if ( !$this->_conn )
+ {
+ $this->_die('A database connection has not yet been established.');
+ }
+ // Does this query look malicious?
+ if ( !$this->check_query($q) )
+ {
+ $this->report_query($q);
+ grinding_halt('SQL Injection attempt', '
Enano has caught and prevented an SQL injection attempt. Your IP address has been recorded and the administrator has been notified.
Query was:
'.htmlspecialchars($q).'
');
+ }
+
+ $time_start = microtime_float();
+ $r = pg_query($q);
+ $this->query_times[$q] = microtime_float() - $time_start;
+ $this->latest_result = $r;
+ $this->disable_errorhandler();
+ return $r;
+ }
+
+ function sql_unbuffered_query($q)
+ {
+ $this->enable_errorhandler();
+
+ $this->num_queries++;
+ $this->query_backtrace[] = '(UNBUFFERED) ' . $q;
+ $this->latest_query = $q;
+ // First make sure we have a connection
+ if ( !$this->_conn )
+ {
+ $this->_die('A database connection has not yet been established.');
+ }
+ // Does this query look malicious?
+ if ( !$this->check_query($q) )
+ {
+ $this->report_query($q);
+ grinding_halt('SQL Injection attempt', '
Enano has caught and prevented an SQL injection attempt. Your IP address has been recorded and the administrator has been notified.
You are not authorized to generate a SQL backtrace.
');
+ }
+ // Create copies of variables that may be changed after header is called
+ $backtrace = $this->query_backtrace;
+ $times = $this->query_times;
+ $template->header();
+ echo '
+ Total time taken for SQL queries: ' . round( $query_time_total, 6 ) . ' seconds
+
+
';
+ }
+ echo '
+
';
+ $template->footer();
+ }
+}
+
?>
diff -r 474f8be55943 -r ab66d6d1f1f4 includes/email.php
--- a/includes/email.php Fri Dec 07 18:47:37 2007 -0500
+++ b/includes/email.php Wed Dec 19 22:55:40 2007 -0500
@@ -2,7 +2,7 @@
/*
* Enano - an open-source CMS capable of wiki functions, Drupal-like sidebar blocks, and everything in between
- * Version 1.1.1
+ * Version 1.0.3 (Dyrad)
* Copyright (C) 2006-2007 Dan Fuhry
*
* This program is Free Software; you can redistribute and/or modify it under the terms of the GNU General Public License
diff -r 474f8be55943 -r ab66d6d1f1f4 includes/functions.php
--- a/includes/functions.php Fri Dec 07 18:47:37 2007 -0500
+++ b/includes/functions.php Wed Dec 19 22:55:40 2007 -0500
@@ -2,7 +2,7 @@
/*
* Enano - an open-source CMS capable of wiki functions, Drupal-like sidebar blocks, and everything in between
- * Version 1.0.2 (Coblynau)
+ * Version 1.0.3 (Dyrad)
* Copyright (C) 2006-2007 Dan Fuhry
*
* This program is Free Software; you can redistribute and/or modify it under the terms of the GNU General Public License
@@ -260,7 +260,14 @@
global $db, $session, $paths, $template, $plugins; // Common objects
$page_id_key = $paths->nslist[ $namespace ] . $page_id;
- $page_data = $paths->pages[$page_id_key];
+ if ( isset($paths->pages[$page_id_key]) )
+ {
+ $page_data = $paths->pages[$page_id_key];
+ }
+ else
+ {
+ $page_data = array();
+ }
$title = ( isset($page_data['name']) ) ? $page_data['name'] : $paths->nslist[$namespace] . str_replace('_', ' ', dirtify_page_id( $page_id ) );
return $title;
}
@@ -567,7 +574,7 @@
$q = $db->sql_query('SELECT p.urlname, p.namespace, p.name, p.namespace=\'Category\' AS is_category FROM '.table_prefix.'categories AS c
LEFT JOIN '.table_prefix.'pages AS p
ON ( p.urlname = c.page_id AND p.namespace = c.namespace )
- WHERE c.category_id=\'' . $db->escape($paths->cpage['urlname_nons']) . '\'
+ WHERE c.category_id=\'' . $db->escape($paths->page_id) . '\'
ORDER BY is_category DESC, p.name ASC;');
if ( !$q )
{
@@ -679,7 +686,7 @@
echo '';
echo '
user_logged_in ) ? $session->username : false;
$response = Array(
'username' => $username,
@@ -1504,12 +1505,15 @@
array('%', '_'),
$finduser);
$finduser = $db->escape($finduser);
- $username_where = 'u.username LIKE "' . $finduser . '"';
+ $username_where = ENANO_SQLFUNC_LOWERCASE . '(u.username) LIKE \'%' . strtolower($finduser) . '%\'';
$finduser_url = 'finduser=' . rawurlencode($_GET['finduser']) . '&';
}
else
{
- $username_where = 'u.username REGEXP "^' . $startletter_sql . '"';
+ if ( ENANO_DBLAYER == 'MYSQL' )
+ $username_where = 'lcase(u.username) REGEXP lcase("^' . $startletter_sql . '")';
+ else if ( ENANO_DBLAYER == 'PGSQL' )
+ $username_where = 'lower(u.username) ~ lower(\'^' . $startletter_sql . '\')';
$finduser_url = '';
}
@@ -1533,7 +1537,7 @@
';
// determine number of rows
- $q = $db->sql_query('SELECT u.user_id FROM '.table_prefix.'users AS u WHERE ' . $username_where . ' AND u.username != "Anonymous";');
+ $q = $db->sql_query('SELECT u.user_id FROM '.table_prefix.'users AS u WHERE ' . $username_where . ' AND u.username != \'Anonymous\';');
if ( !$q )
$db->_die();
@@ -1550,7 +1554,7 @@
$q = $db->sql_unbuffered_query('SELECT u.user_id, u.username, u.reg_time, u.email, u.user_level, u.reg_time, x.email_public FROM '.table_prefix.'users AS u
LEFT JOIN '.table_prefix.'users_extra AS x
ON ( u.user_id = x.user_id )
- WHERE ' . $username_where . ' AND u.username != "Anonymous"
+ WHERE ' . $username_where . ' AND u.username != \'Anonymous\'
ORDER BY ' . $sort_sqllet . ' ' . $target_order . ';');
if ( !$q )
$db->_die();
@@ -1580,7 +1584,7 @@
' .
'
diff -r 474f8be55943 -r ab66d6d1f1f4 plugins/SpecialUserPrefs.php
--- a/plugins/SpecialUserPrefs.php Fri Dec 07 18:47:37 2007 -0500
+++ b/plugins/SpecialUserPrefs.php Wed Dec 19 22:55:40 2007 -0500
@@ -4,13 +4,13 @@
Plugin URI: http://enanocms.org/
Description: Provides the page Special:Preferences.
Author: Dan Fuhry
-Version: 1.0.2
+Version: 1.0.3
Author URI: http://enanocms.org/
*/
/*
* Enano - an open-source CMS capable of wiki functions, Drupal-like sidebar blocks, and everything in between
- * Version 1.0.2
+ * Version 1.0.3
* Copyright (C) 2006-2007 Dan Fuhry
*
* This program is Free Software; you can redistribute it and/or modify it under the terms of the GNU General Public License
@@ -47,7 +47,7 @@
{
global $db, $session, $paths, $template, $plugins; // Common objects
- if ( $paths->namespace != 'Special' || $paths->cpage['urlname_nons'] != 'Preferences' )
+ if ( $paths->namespace != 'Special' || $paths->page_id != 'Preferences' )
return false;
$tb .= "
$template->toolbar_menu
";
@@ -599,7 +599,7 @@
$code = $plugins->setHook('userprefs_body');
foreach ( $code as $cmd )
{
- if ( eval($code) )
+ if ( eval($cmd) )
$good = true;
}
if ( !$good )
diff -r 474f8be55943 -r ab66d6d1f1f4 plugins/admin/PageGroups.php
--- a/plugins/admin/PageGroups.php Fri Dec 07 18:47:37 2007 -0500
+++ b/plugins/admin/PageGroups.php Wed Dec 19 22:55:40 2007 -0500
@@ -2,7 +2,7 @@
/*
* Enano - an open-source CMS capable of wiki functions, Drupal-like sidebar blocks, and everything in between
- * Version 1.0.2 (Coblynau)
+ * Version 1.0.3 (Dyrad)
* Copyright (C) 2006-2007 Dan Fuhry
*
* This program is Free Software; you can redistribute and/or modify it under the terms of the GNU General Public License
diff -r 474f8be55943 -r ab66d6d1f1f4 plugins/admin/SecurityLog.php
--- a/plugins/admin/SecurityLog.php Fri Dec 07 18:47:37 2007 -0500
+++ b/plugins/admin/SecurityLog.php Wed Dec 19 22:55:40 2007 -0500
@@ -2,7 +2,7 @@
/*
* Enano - an open-source CMS capable of wiki functions, Drupal-like sidebar blocks, and everything in between
- * Version 1.1.1
+ * Version 1.0.3 (Dyrad)
* Copyright (C) 2006-2007 Dan Fuhry
*
* This program is Free Software; you can redistribute and/or modify it under the terms of the GNU General Public License
@@ -62,7 +62,7 @@
global $db, $session, $paths, $template, $plugins; // Common objects
if ( $session->auth_level < USER_LEVEL_ADMIN )
{
- $q = $db->sql_query('INSERT INTO '.table_prefix.'logs(log_type,action,time_id,edit_summary,author) VALUES("security","seclog_unauth",UNIX_TIMESTAMP(),"' . $db->escape($_SERVER['REMOTE_ADDR']) . '","' . $db->escape($session->username) . '");');
+ $q = $db->sql_query('INSERT INTO '.table_prefix.'logs(log_type,action,time_id,edit_summary,author) VALUES(\'security\',\'seclog_unauth\',' . time() . ',"' . $db->escape($_SERVER['REMOTE_ADDR']) . '","' . $db->escape($session->username) . '");');
if ( !$q )
$db->_die();
die('Security log: unauthorized attempt to fetch. Call has been logged and reported to the administrators.');
diff -r 474f8be55943 -r ab66d6d1f1f4 plugins/admin/UserManager.php
--- a/plugins/admin/UserManager.php Fri Dec 07 18:47:37 2007 -0500
+++ b/plugins/admin/UserManager.php Wed Dec 19 22:55:40 2007 -0500
@@ -205,14 +205,14 @@
// We need to update group memberships
if ( $existing_level == USER_LEVEL_ADMIN )
{
- $q = $db->sql_query('INSERT INTO '.table_prefix.'logs(log_type,action,time_id,edit_summary,author,page_text) VALUES("security","u_from_admin",UNIX_TIMESTAMP(),"' . $db->escape($_SERVER['REMOTE_ADDR']) . '","' . $db->escape($session->username) . '","' . $db->escape($username) . '");');
+ $q = $db->sql_query('INSERT INTO '.table_prefix.'logs(log_type,action,time_id,edit_summary,author,page_text) VALUES(\'security\',\'u_from_admin\',' . time() . ',"' . $db->escape($_SERVER['REMOTE_ADDR']) . '","' . $db->escape($session->username) . '","' . $db->escape($username) . '");');
if ( !$q )
$db->_die();
$session->remove_user_from_group($user_id, GROUP_ID_ADMIN);
}
else if ( $existing_level == USER_LEVEL_MOD )
{
- $q = $db->sql_query('INSERT INTO '.table_prefix.'logs(log_type,action,time_id,edit_summary,author,page_text) VALUES("security","u_from_mod",UNIX_TIMESTAMP(),"' . $db->escape($_SERVER['REMOTE_ADDR']) . '","' . $db->escape($session->username) . '","' . $db->escape($username) . '");');
+ $q = $db->sql_query('INSERT INTO '.table_prefix.'logs(log_type,action,time_id,edit_summary,author,page_text) VALUES(\'security\',\'u_from_mod\',' . time() . ',"' . $db->escape($_SERVER['REMOTE_ADDR']) . '","' . $db->escape($session->username) . '","' . $db->escape($username) . '");');
if ( !$q )
$db->_die();
$session->remove_user_from_group($user_id, GROUP_ID_MOD);
@@ -220,14 +220,14 @@
if ( $user_level == USER_LEVEL_ADMIN )
{
- $q = $db->sql_query('INSERT INTO '.table_prefix.'logs(log_type,action,time_id,edit_summary,author,page_text) VALUES("security","u_to_admin",UNIX_TIMESTAMP(),"' . $db->escape($_SERVER['REMOTE_ADDR']) . '","' . $db->escape($session->username) . '","' . $db->escape($username) . '");');
+ $q = $db->sql_query('INSERT INTO '.table_prefix.'logs(log_type,action,time_id,edit_summary,author,page_text) VALUES(\'security\',\'u_to_admin\',' . time() . ',"' . $db->escape($_SERVER['REMOTE_ADDR']) . '","' . $db->escape($session->username) . '","' . $db->escape($username) . '");');
if ( !$q )
$db->_die();
$session->add_user_to_group($user_id, GROUP_ID_ADMIN, false);
}
else if ( $user_level == USER_LEVEL_MOD )
{
- $q = $db->sql_query('INSERT INTO '.table_prefix.'logs(log_type,action,time_id,edit_summary,author,page_text) VALUES("security","u_to_mod",UNIX_TIMESTAMP(),"' . $db->escape($_SERVER['REMOTE_ADDR']) . '","' . $db->escape($session->username) . '","' . $db->escape($username) . '");');
+ $q = $db->sql_query('INSERT INTO '.table_prefix.'logs(log_type,action,time_id,edit_summary,author,page_text) VALUES(\'security\',\'u_to_mod\',' . time() . ',"' . $db->escape($_SERVER['REMOTE_ADDR']) . '","' . $db->escape($session->username) . '","' . $db->escape($username) . '");');
if ( !$q )
$db->_die();
$session->add_user_to_group($user_id, GROUP_ID_MOD, false);
@@ -293,7 +293,7 @@
$q = $db->sql_query('SELECT u.user_id AS authoritative_uid, u.username, u.email, u.real_name, u.signature, u.account_active, u.user_level, x.* FROM '.table_prefix.'users AS u
LEFT JOIN '.table_prefix.'users_extra AS x
ON ( u.user_id = x.user_id OR x.user_id IS NULL )
- WHERE ( lcase(u.username) = \'' . $db->escape(strtolower($username)) . '\' OR u.username = \'' . $db->escape($username) . '\' ) AND u.user_id != 1;');
+ WHERE ( ' . ENANO_SQLFUNC_LOWERCASE . '(u.username) = \'' . $db->escape(strtolower($username)) . '\' OR u.username = \'' . $db->escape($username) . '\' ) AND u.user_id != 1;');
if ( !$q )
$db->_die();
diff -r 474f8be55943 -r ab66d6d1f1f4 themes/oxygen/css/bleu.css
--- a/themes/oxygen/css/bleu.css Fri Dec 07 18:47:37 2007 -0500
+++ b/themes/oxygen/css/bleu.css Wed Dec 19 22:55:40 2007 -0500
@@ -233,19 +233,24 @@
td.mdg-menu-btm { height: 12px; background: url(../images/bleu/border-btm.gif); }
/* Buttons and textboxes - these settings are used almost everywhere */
-input, textarea, select { border: 1px solid #406080; background-color: #F2F2F2; padding: 3px; font-family: arial, helvetica, sans-serif; font-size: 8pt; }
+input, textarea, select, button { border: 1px solid #406080; background-color: #F2F2F2; padding: 3px; font-family: arial, helvetica, sans-serif; font-size: 8pt; }
input:hover, textarea:hover, select:hover { border: 1px solid #6080A0; background-color: #F8F8F8; padding: 3px; }
input:focus, textarea:focus, select:focus { border: 1px solid #90B0D0; background-color: #FFFFFF; padding: 3px; }
label { padding: 3px; cursor: pointer; font-family: arial, helvetica, sans-serif; font-size: 8pt; }
label:hover { padding: 3px; cursor: pointer; background-color: #F0F0F0; }
input#pageheading { font-size: 14pt; border-bottom: 1px solid #90B0D0; margin-bottom: 0; }
-input[type ^="button"], input[type ^="submit"] {
+input[type ^="button"], input[type ^="submit"], button {
background-image: url(../images/buttonbg.gif);
background-repeat: repeat-x;
color: #202020;
}
+input[type ^="image"][disabled ^="disabled"] {
+ opacity: 0.5;
+ filter: alpha(opacity=50);
+}
+
/* JWS window theming */
div.jswindow { border: 2px solid #7090B0; border-top: 5px solid #7090B0; padding: 0px; font-family: Trebuchet MS, tahoma, verdana, arial, sans-serif; font-size: 9pt; display: none; position: absolute; background-color: #FFFFFF; }
div.titlebar { background-color: #7090B0; color: #FFFFFF; font-family: Trebuchet MS, tahoma, verdana, arial, sans-serif; font-size: 9pt; padding-bottom: 4px; cursor: default; }
diff -r 474f8be55943 -r ab66d6d1f1f4 upgrade.php
--- a/upgrade.php Fri Dec 07 18:47:37 2007 -0500
+++ b/upgrade.php Wed Dec 19 22:55:40 2007 -0500
@@ -2,7 +2,7 @@
/*
* Enano - an open-source CMS capable of wiki functions, Drupal-like sidebar blocks, and everything in between
- * Version 1.1.1
+ * Version 1.0.3 (Dyrad)
* upgrade.php - upgrade script
* Copyright (C) 2006-2007 Dan Fuhry
*
@@ -70,7 +70,7 @@
// Everything related to versions goes here!
// Valid versions to upgrade from
-$valid_versions = Array('1.0b1', '1.0b2', '1.0b3', '1.0b4', '1.0RC1', '1.0RC2', '1.0RC3', '1.0', '1.0.1', '1.0.1.1', '1.0.2b1', '1.0.2', 'Stable1.0ToUnstable1.1');
+$valid_versions = Array('1.0b1', '1.0b2', '1.0b3', '1.0b4', '1.0RC1', '1.0RC2', '1.0RC3', '1.0', '1.0.1', '1.0.1.1', '1.0.2b1', '1.0.2', '1.0.3', 'Stable1.0ToUnstable1.1');
// Basically a list of dependencies, which should be resolved automatically
// If, for example, upgrading from 1.0b1 to 1.0RC1 requires one extra query that would not
@@ -86,7 +86,8 @@
'1.0' => Array('1.0.1'),
'1.0.1' => Array('1.0.1.1'),
'1.0.1.1' => Array('1.0.2b1'),
- '1.0.2b1' => Array('Stable1.0ToUnstable1.1'),
+ '1.0.2b1' => Array('1.0.2'),
+ '1.0.2' => Array('Stable1.0ToUnstable1.1'),
'Stable1.0ToUnstable1.1' => Array('1.1.1')
);
$this_version = '1.1.1';
diff -r 474f8be55943 -r ab66d6d1f1f4 upgrade.sql
--- a/upgrade.sql Fri Dec 07 18:47:37 2007 -0500
+++ b/upgrade.sql Wed Dec 19 22:55:40 2007 -0500
@@ -14,6 +14,7 @@
ALTER TABLE {{TABLE_PREFIX}}users ADD COLUMN user_lang smallint(5) NOT NULL;
---END Stable1.0ToUnstable1.1---
---BEGIN 1.0.2---
+-- No DB changes in this release
---END 1.0.2---
---BEGIN 1.0.2b1---
-- This is really optional, but could reduce confusion if regex page groups get truncated for no apparent reason.
Uploaded file
There are no files uploaded with this name yet. Upload a file...