Project

General

Profile

« Previous | Next » 

Revision 1680

Added by darkviper about 12 years ago

renamed file class.database.php to Database.php
renamed class database into Database
classes SecurityException and SecDirectoryTraversalException added in globalExceptionHandler.php
CoreAutoloader() added in initialize.php
new Constants 'WB_REL' and 'DOCUMENT_ROOT' in initialize.php
class Database is able now to create multiple connections at same time
class ModLanguage added for easy handle of languages from modules

View differences:

branches/2.8.x/CHANGELOG
11 11
! = Update/Change
12 12
===============================================================================
13 13

  
14

  
14
03 May-2012 Build 1680 Werner v.d.Decken(DarkViper)
15
! renamed file class.database.php to Database.php
16
! renamed class database into Database
17
+ classes SecurityException and SecDirectoryTraversalException added in globalExceptionHandler.php
18
+ CoreAutoloader() added in initialize.php
19
+ new Constants 'WB_REL' and 'DOCUMENT_ROOT' in initialize.php
20
! class Database is able now to create multiple connections at same time
21
+ class ModLanguage added for easy handle of languages from modules
15 22
28 Apr-2012 Build 1679 Dietmar Woellbrink (Luisehahne)
16 23
+ add tool_icon.png to admintools
17 24
27 Apr-2012 Build 1678 Dietmar Woellbrink (Luisehahne)
branches/2.8.x/wb/admin/interface/version.php
51 51

  
52 52
// check if defined to avoid errors during installation (redirect to admin panel fails if PHP error/warnings are enabled)
53 53
if(!defined('VERSION')) define('VERSION', '2.8.3');
54
if(!defined('REVISION')) define('REVISION', '1679');
54
if(!defined('REVISION')) define('REVISION', '1680');
55 55
if(!defined('SP')) define('SP', '');
branches/2.8.x/wb/framework/class.database.php
1
<?php
2
/**
3
 *
4
 * @category        framework
5
 * @package         database
6
 * @author          WebsiteBaker Project
7
 * @copyright       2004-2009, Ryan Djurovich
8
 * @copyright       2009-2011, Website Baker Org. e.V.
9
 * @link            http://www.websitebaker2.org/
10
 * @license         http://www.gnu.org/licenses/gpl.html
11
 * @platform        WebsiteBaker 2.8.x
12
 * @requirements    PHP 5.2.2 and higher
13
 * @version         $Id$
14
 * @filesource      $HeadURL$
15
 * @lastmodified    $Date$
16
 *
17
 */
18
/*
19
Database class
20
This class will be used to interface between the database
21
and the Website Baker code
22
*/
23
/* -------------------------------------------------------- */
24
// Must include code to stop this file being accessed directly
25
if(!defined('WB_PATH')) {
26
	require_once(dirname(__FILE__).'/globalExceptionHandler.php');
27
	throw new IllegalFileException();
28
}
29
/* -------------------------------------------------------- */
30
if(!defined('DB_URL')) {
31
	//define('DB_URL', DB_TYPE.'://'.DB_USERNAME.':'.DB_PASSWORD.'@'.DB_HOST.'/'.DB_NAME);
32
}
33

  
34
define('DATABASE_CLASS_LOADED', true);
35

  
36
class database {
37

  
38
	private $db_handle  = null; // readonly from outside
39
	private $db_name    = '';
40
	private $connected  = false;
41

  
42
	private $error      = '';
43
	private $error_type = '';
44
	private $message    = array();
45
	private $iQueryCount= 0;
46

  
47

  
48
	// Set DB_URL
49
	function database($url = '') {
50
		// Connect to database
51
		$this->connect();
52
		// Check for database connection error
53
		if($this->is_error()) {
54
			die($this->get_error());
55
		}
56
	}
57
	
58
	// Connect to the database
59
	function connect() {
60
		$status = $this->db_handle = mysql_connect(DB_HOST, DB_USERNAME, DB_PASSWORD);
61
		if(mysql_error()) {
62
			$this->connected = false;
63
			$this->error = mysql_error();
64
		} else {
65
			if(!mysql_select_db(DB_NAME)) {
66
				$this->connected = false;
67
				$this->error = mysql_error();
68
			} else {
69
				$this->db_name = DB_NAME;
70
				$this->connected = true;
71
			}
72
		}
73
		return $this->connected;
74
	}
75
	
76
	// Disconnect from the database
77
	function disconnect() {
78
		if($this->connected==true) {
79
			mysql_close();
80
			return true;
81
		} else {
82
			return false;
83
		}
84
	}
85
	
86
	// Run a query
87
	function query($statement) {
88
		$this->iQueryCount++;
89
		$mysql = new mysql();
90
		$mysql->query($statement);
91
		$this->set_error($mysql->error());
92
		if($mysql->error()) {
93
			return null;
94
		} else {
95
			return $mysql;
96
		}
97
	}
98

  
99
	// Gets the first column of the first row
100
	function get_one( $statement )
101
	{
102
		$this->iQueryCount++;
103
		$fetch_row = mysql_fetch_array(mysql_query($statement) );
104
		$result = $fetch_row[0];
105
		$this->set_error(mysql_error());
106
		if(mysql_error()) {
107
			return null;
108
		} else {
109
			return $result;
110
		}
111
	}
112
	
113
	// Set the DB error
114
	function set_error($message = null) {
115
		global $TABLE_DOES_NOT_EXIST, $TABLE_UNKNOWN;
116
		$this->error = $message;
117
		if(strpos($message, 'no such table')) {
118
			$this->error_type = $TABLE_DOES_NOT_EXIST;
119
		} else {
120
			$this->error_type = $TABLE_UNKNOWN;
121
		}
122
	}
123
	
124
	// Return true if there was an error
125
	function is_error() {
126
		return (!empty($this->error)) ? true : false;
127
	}
128
	
129
	// Return the error
130
	function get_error() {
131
		return $this->error;
132
	}
133

  
134
/**
135
 * default Getter for some properties
136
 * @param string $sPropertyName
137
 * @return mixed NULL on error or missing property
138
 */
139
	public function __get($sPropertyName)
140
	{
141
		switch ($sPropertyName):
142
			case 'db_handle':
143
			case 'DbHandle':
144
			case 'getDbHandle':
145
				$retval = $this->db_handle;
146
				break;
147
			case 'db_name':
148
			case 'DbName':
149
			case 'getDbName':
150
				$retval = $this->db_name;
151
				break;
152
			case 'getQueryCount':
153
				$retval = $this->iQueryCount;
154
				break;
155
			default:
156
				$retval = null;
157
				break;
158
		endswitch;
159
		return $retval;
160
	} // __get()
161

  
162
/*
163
 * @param string $table_name: full name of the table (incl. TABLE_PREFIX)
164
 * @param string $field_name: name of the field to seek for
165
 * @return bool: true if field exists
166
 */
167
	public function field_exists($table_name, $field_name)
168
	{
169
		$sql = 'DESCRIBE `'.$table_name.'` `'.$field_name.'` ';
170
		$query = $this->query($sql);
171
		return ($query->numRows() != 0);
172
	}
173

  
174
/*
175
 * @param string $table_name: full name of the table (incl. TABLE_PREFIX)
176
 * @param string $index_name: name of the index to seek for
177
 * @return bool: true if field exists
178
 */
179
	public function index_exists($table_name, $index_name, $number_fields = 0)
180
	{
181
		$number_fields = intval($number_fields);
182
		$keys = 0;
183
		$sql = 'SHOW INDEX FROM `'.$table_name.'`';
184
		if( ($res_keys = $this->query($sql)) )
185
		{
186
			while(($rec_key = $res_keys->fetchRow()))
187
			{
188
				if( $rec_key['Key_name'] == $index_name )
189
				{
190
					$keys++;
191
				}
192
			}
193

  
194
		}
195
		if( $number_fields == 0 )
196
		{
197
			return ($keys != $number_fields);
198
		}else
199
		{
200
			return ($keys == $number_fields);
201
		}
202
	}
203
/*
204
 * @param string $table_name: full name of the table (incl. TABLE_PREFIX)
205
 * @param string $field_name: name of the field to add
206
 * @param string $description: describes the new field like ( INT NOT NULL DEFAULT '0')
207
 * @return bool: true if successful, otherwise false and error will be set
208
 */
209
	public function field_add($table_name, $field_name, $description)
210
	{
211
		if( !$this->field_exists($table_name, $field_name) )
212
		{ // add new field into a table
213
			$sql = 'ALTER TABLE `'.$table_name.'` ADD '.$field_name.' '.$description.' ';
214
			$query = $this->query($sql);
215
			$this->set_error(mysql_error());
216
			if( !$this->is_error() )
217
			{
218
				return ( $this->field_exists($table_name, $field_name) ) ? true : false;
219
			}
220
		}else
221
		{
222
			$this->set_error('field \''.$field_name.'\' already exists');
223
		}
224
		return false;
225
	}
226

  
227
/*
228
 * @param string $table_name: full name of the table (incl. TABLE_PREFIX)
229
 * @param string $field_name: name of the field to add
230
 * @param string $description: describes the new field like ( INT NOT NULL DEFAULT '0')
231
 * @return bool: true if successful, otherwise false and error will be set
232
 */
233
	public function field_modify($table_name, $field_name, $description)
234
	{
235
		$retval = false;
236
		if( $this->field_exists($table_name, $field_name) )
237
		{ // modify a existing field in a table
238
			$sql  = 'ALTER TABLE `'.$table_name.'` MODIFY `'.$field_name.'` '.$description;
239
			$retval = ( $this->query($sql) ? true : false);
240
			$this->set_error(mysql_error());
241
		}
242
		return $retval;
243
	}
244

  
245
/*
246
 * @param string $table_name: full name of the table (incl. TABLE_PREFIX)
247
 * @param string $field_name: name of the field to remove
248
 * @return bool: true if successful, otherwise false and error will be set
249
 */
250
	public function field_remove($table_name, $field_name)
251
	{
252
		$retval = false;
253
		if( $this->field_exists($table_name, $field_name) )
254
		{ // modify a existing field in a table
255
			$sql  = 'ALTER TABLE `'.$table_name.'` DROP `'.$field_name.'`';
256
			$retval = ( $this->query($sql) ? true : false );
257
		}
258
		return $retval;
259
	}
260

  
261
/*
262
 * @param string $table_name: full name of the table (incl. TABLE_PREFIX)
263
 * @param string $index_name: name of the new index
264
 * @param string $field_list: comma seperated list of fields for this index
265
 * @param string $index_type: kind of index (UNIQUE, PRIMARY, '')
266
 * @return bool: true if successful, otherwise false and error will be set
267
 */
268
	public function index_add($table_name, $index_name, $field_list, $index_type = '')
269
	{
270
		$retval = false;
271
		$field_list = str_replace(' ', '', $field_list);
272
		$field_list = explode(',', $field_list);
273
		$number_fields = sizeof($field_list);
274
		$field_list = '`'.implode('`,`', $field_list).'`';
275
		if( $this->index_exists($table_name, $index_name, $number_fields) ||
276
		    $this->index_exists($table_name, $index_name))
277
		{
278
			$sql  = 'ALTER TABLE `'.$table_name.'` ';
279
			$sql .= 'DROP INDEX `'.$index_name.'`';
280
			if( $this->query($sql))
281
			{
282
				$sql  = 'ALTER TABLE `'.$table_name.'` ';
283
				$sql .= 'ADD '.$index_type.' `'.$index_name.'` ( '.$field_list.' ); ';
284
				if( $this->query($sql)) { $retval = true; }
285
			}
286
		}
287
		return $retval;
288
	}
289

  
290
/*
291
 * @param string $table_name: full name of the table (incl. TABLE_PREFIX)
292
 * @param string $field_name: name of the field to remove
293
 * @return bool: true if successful, otherwise false and error will be set
294
 */
295
	public function index_remove($table_name, $index_name)
296
	{
297
		$retval = false;
298
		if( $this->index_exists($table_name, $index_name) )
299
		{ // modify a existing field in a table
300
			$sql  = 'ALTER TABLE `'.$table_name.'` DROP INDEX `'.$index_name.'`';
301
			$retval = ( $this->query($sql) ? true : false );
302
		}
303
		return $retval;
304
	}
305
/**
306
 * Import a standard *.sql dump file
307
 * @param string $sSqlDump link to the sql-dumpfile
308
 * @param string $sTablePrefix
309
 * @param bool $bPreserve set to true will ignore all DROP TABLE statements
310
 * @param string $sTblEngine
311
 * @param string $sTblCollation
312
 * @return boolean true if import successful
313
 */
314
	public function SqlImport($sSqlDump,
315
	                          $sTablePrefix = '',
316
	                          $bPreserve = true,
317
	                          $sTblEngine = 'ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci',
318
	                          $sTblCollation = ' collate utf8_unicode_ci')
319
	{
320
		$retval = true;
321
		$this->error = '';
322
		$aSearch  = array('{TABLE_PREFIX}','{TABLE_ENGINE}', '{TABLE_COLLATION}');
323
		$aReplace = array($sTablePrefix, $sTblEngine, $sTblCollation);
324
		$sql = '';
325
		$aSql = file($sSqlDump);
326
		while ( sizeof($aSql) > 0 ) {
327
			$sSqlLine = trim(array_shift($aSql));
328
			if (!preg_match('/^[-\/]+.*/', $sSqlLine)) {
329
				$sql = $sql.' '.$sSqlLine;
330
				if ((substr($sql,-1,1) == ';')) {
331
					$sql = trim(str_replace( $aSearch, $aReplace, $sql));
332
					if (!($bPreserve && preg_match('/^\s*DROP TABLE IF EXISTS/siU', $sql))) {
333
						if(!mysql_query($sql, $this->db_handle)) {
334
							$retval = false;
335
							$this->error = mysql_error($this->db_handle);
336
							unset($aSql);
337
							break;
338
						}
339
					}
340
					$sql = '';
341
				}
342
			}
343
		}
344
		return $retval;
345
	}
346

  
347
/**
348
 * retuns the type of the engine used for requested table
349
 * @param string $table name of the table, including prefix
350
 * @return boolean/string false on error, or name of the engine (myIsam/InnoDb)
351
 */
352
	public function getTableEngine($table)
353
	{
354
		$retVal = false;
355
		$mysqlVersion = mysql_get_server_info($this->db_handle);
356
		$engineValue = (version_compare($mysqlVersion, '5.0') < 0) ? 'Type' : 'Engine';
357
		$sql = "SHOW TABLE STATUS FROM " . $this->db_name . " LIKE '" . $table . "'";
358
		if(($result = $this->query($sql))) {
359
			if(($row = $result->fetchRow(MYSQL_ASSOC))) {
360
				$retVal = $row[$engineValue];
361
			}
362
		}
363
		return $retVal;
364
	}
365

  
366

  
367
} /// end of class database
368

  
369
define('MYSQL_SEEK_FIRST', 0);
370
define('MYSQL_SEEK_LAST', -1);
371

  
372
class mysql {
373

  
374
	// Run a query
375
	function query($statement) {
376
		$this->result = mysql_query($statement);
377
		$this->error = mysql_error();
378
		return $this->result;
379
	}
380
	
381
	// Fetch num rows
382
	function numRows() {
383
		return mysql_num_rows($this->result);
384
	}
385

  
386
	// Fetch row  $typ = MYSQL_ASSOC, MYSQL_NUM, MYSQL_BOTH
387
	function fetchRow($typ = MYSQL_BOTH) {
388
		return mysql_fetch_array($this->result, $typ);
389
	}
390

  
391
	function rewind()
392
	{
393
		return $this->seekRow();
394
	}
395

  
396
	function seekRow( $position = MYSQL_SEEK_FIRST )
397
	{
398
		$pmax = $this->numRows() - 1;
399
		$p = (($position < 0 || $position > $pmax) ? $pmax : $position);
400
		return mysql_data_seek($this->result, $p);
401
	}
402

  
403
	// Get error
404
	function error() {
405
		if(isset($this->error)) {
406
			return $this->error;
407
		} else {
408
			return null;
409
		}
410
	}
411

  
412
}
413
/* this function is placed inside this file temporarely until a better place is found */
414
/*  function to update a var/value-pair(s) in table ****************************
415
 *  nonexisting keys are inserted
416
 *  @param string $table: name of table to use (without prefix)
417
 *  @param mixed $key:    a array of key->value pairs to update
418
 *                        or a string with name of the key to update
419
 *  @param string $value: a sting with needed value, if $key is a string too
420
 *  @return bool:  true if any keys are updated, otherwise false
421
 */
422
	function db_update_key_value($table, $key, $value = '')
423
	{
424
		global $database;
425
		if( !is_array($key))
426
		{
427
			if( trim($key) != '' )
428
			{
429
				$key = array( trim($key) => trim($value) );
430
			} else {
431
				$key = array();
432
			}
433
		}
434
		$retval = true;
435
		foreach( $key as $index=>$val)
436
		{
437
			$index = strtolower($index);
438
			$sql = 'SELECT COUNT(`setting_id`) FROM `'.TABLE_PREFIX.$table.'` WHERE `name` = \''.$index.'\' ';
439
			if($database->get_one($sql))
440
			{
441
				$sql = 'UPDATE ';
442
				$sql_where = 'WHERE `name` = \''.$index.'\'';
443
			}else {
444
				$sql = 'INSERT INTO ';
445
				$sql_where = '';
446
			}
447
			$sql .= '`'.TABLE_PREFIX.$table.'` ';
448
			$sql .= 'SET `name` = \''.$index.'\', ';
449
			$sql .= '`value` = \''.$val.'\' '.$sql_where;
450
			if( !$database->query($sql) )
451
			{
452
				$retval = false;
453
			}
454
		}
455
		return $retval;
456
	}
457 0

  
branches/2.8.x/wb/framework/initialize.php
49 49
		}
50 50
		$_SERVER['HTTP_REFERER'] = $sTmpReferer;
51 51
	}
52

  
53
$starttime = array_sum(explode(" ",microtime()));
54
if(!defined('DEBUG')){ define('DEBUG', false); }// Include config file
55
if( !defined('ADMIN_DIRECTORY')) { define('ADMIN_DIRECTORY', 'admin'); }
56
if(!preg_match('/xx[a-z0-9_][a-z0-9_\-\.]+/i', 'xx'.ADMIN_DIRECTORY)) {
57
	throw new RuntimeException('Invalid admin-directory: ' . ADMIN_DIRECTORY);
58
}
59

  
60
if( !defined('ADMIN_URL')) { define('ADMIN_URL', WB_URL.'/'.ADMIN_DIRECTORY); }
61
if( !defined('WB_PATH')) { define('WB_PATH', dirname(dirname(__FILE__))); }
62
if( !defined('ADMIN_PATH')) { define('ADMIN_PATH', WB_PATH.'/'.ADMIN_DIRECTORY); }
63

  
64
if (file_exists(WB_PATH.'/framework/class.database.php')) {
65
	// sanitize $_SERVER['HTTP_REFERER']
66
	SanitizeHttpReferer(WB_URL);
52
/* -------------------------------------------------------- */
53
/**
54
 * Autoloader to load classes according to the new WB-2.9 standard
55
 * @param string $sClassName name of the requested class
56
 */
57
	function CoreAutoloader($sClassName) {
58
		$iCount = 0;
59
		$aSearch = array('/^m_/i', '/^a_/i');
60
		$aReplace = array('modules_', ADMIN_DIRECTORY.'_' );
61
		$sClassName = preg_replace($aSearch, $aReplace, $sClassName, 1, $iCount);
62
		if(!$iCount) { $sClassName = 'framework_'.$sClassName; }
63
		$sFileName = WB_PATH.'/'.str_replace('_', '/', $sClassName).'.php';
64
		if(file_exists($sFileName)) {
65
			include($sFileName);
66
		}
67
	}
68
/* -------------------------------------------------------- */
69
	function SetInstallPathConstants() {
70
		if(!defined('DEBUG')){ define('DEBUG', false); }// Include config file
71
		if(!defined('ADMIN_DIRECTORY')){ define('ADMIN_DIRECTORY', 'admin'); }
72
		if(!preg_match('/xx[a-z0-9_][a-z0-9_\-\.]+/i', 'xx'.ADMIN_DIRECTORY)) {
73
			throw new RuntimeException('Invalid admin-directory: ' . ADMIN_DIRECTORY);
74
		}
75
		if(!defined('WB_PATH')){ define('WB_PATH', dirname(dirname(__FILE__))); }
76
		if(!defined('ADMIN_URL')){ define('ADMIN_URL', WB_URL.'/'.ADMIN_DIRECTORY); }
77
		if(!defined('ADMIN_PATH')){ define('ADMIN_PATH', WB_PATH.'/'.ADMIN_DIRECTORY); }
78
		if(!defined('WB_REL')){
79
			$x1 = parse_url(WB_URL);
80
			define('WB_REL', (isset($x1['path']) ? $x1['path'] : ''));
81
		}
82
		if(!defined('DOCUMENT_ROOT')) {
83
			define('DOCUMENT_ROOT', preg_replace('/'.preg_quote(WB_REL, '/').'$/', '', WB_PATH));
84
		}
85
	}
86
/* -------------------------------------------------------- */
87
	$starttime = array_sum(explode(" ",microtime()));
88
	SetInstallPathConstants();
89
	SanitizeHttpReferer(WB_URL); // sanitize $_SERVER['HTTP_REFERER']
90
	spl_autoload_register('CoreAutoloader'); // activate core autoloader
67 91
	date_default_timezone_set('UTC');
68
	require_once(WB_PATH.'/framework/class.database.php');
69

  
70 92
	// Create database class
71
	$database = new database();
72

  
73
    if(version_compare(PHP_VERSION, '5.3.0', '<'))
74
    {
75
        set_magic_quotes_runtime(0); // Disable magic_quotes_runtime
76
    }
93
	$database = new Database();
94
	// disable all kind of magic_quotes
95
	if(get_magic_quotes_gpc() || get_magic_quotes_runtime()) {
96
		@ini_set('magic_quotes_sybase', 0);
97
		@ini_set('magic_quotes_gpc', 0);
98
		@ini_set('magic_quotes_runtime', 0);
99
	}
77 100
	// Get website settings (title, keywords, description, header, and footer)
78 101
	$query_settings = "SELECT name,value FROM ".TABLE_PREFIX."settings";
79 102
	$get_settings = $database->query($query_settings);
......
133 156

  
134 157
	// Get users language
135 158
	if(isset($_GET['lang']) AND $_GET['lang'] != '' AND !is_numeric($_GET['lang']) AND strlen($_GET['lang']) == 2) {
136
	  	define('LANGUAGE', strtoupper($_GET['lang']));
159
		define('LANGUAGE', strtoupper($_GET['lang']));
137 160
		$_SESSION['LANGUAGE']=LANGUAGE;
138 161
	} else {
139 162
		if(isset($_SESSION['LANGUAGE']) AND $_SESSION['LANGUAGE'] != '') {
......
142 165
			define('LANGUAGE', DEFAULT_LANGUAGE);
143 166
		}
144 167
	}
145
	
168

  
146 169
	// Load Language file
147 170
	if(!defined('LANGUAGE_LOADED')) {
148 171
		if(!file_exists(WB_PATH.'/languages/'.LANGUAGE.'.php')) {
......
151 174
			require_once(WB_PATH.'/languages/'.LANGUAGE.'.php');
152 175
		}
153 176
	}
154
	
177

  
155 178
	// Get users timezone
156 179
	if(isset($_SESSION['TIMEZONE'])) {
157 180
		define('TIMEZONE', $_SESSION['TIMEZONE']);
......
175 198
	define('THEME_URL', WB_URL.'/templates/'.DEFAULT_THEME);
176 199
	define('THEME_PATH', WB_PATH.'/templates/'.DEFAULT_THEME);
177 200

  
178
    // extended wb_settings
201
	// extended wb_settings
179 202
	define('EDIT_ONE_SECTION', false);
180 203

  
181 204
	define('EDITOR_WIDTH', 0);
182

  
183
}
branches/2.8.x/wb/framework/Database.php
1
<?php
2
/**
3
 *
4
 * @category        framework
5
 * @package         database
6
 * @author          WebsiteBaker Project
7
 * @copyright       2004-2009, Ryan Djurovich
8
 * @copyright       2009-2011, Website Baker Org. e.V.
9
 * @link            http://www.websitebaker2.org/
10
 * @license         http://www.gnu.org/licenses/gpl.html
11
 * @platform        WebsiteBaker 2.8.x
12
 * @requirements    PHP 5.2.2 and higher
13
 * @version         $Id$
14
 * @filesource      $HeadURL$
15
 * @lastmodified    $Date$
16
 *
17
 */
18
/*
19
Database class
20
This class will be used to interface between the database
21
and the Website Baker code
22
*/
23
/* -------------------------------------------------------- */
24
// Must include code to stop this file being accessed directly
25
if(!defined('WB_PATH')) {
26
	require_once(dirname(__FILE__).'/globalExceptionHandler.php');
27
	throw new IllegalFileException();
28
}
29
/* -------------------------------------------------------- */
30
define('DATABASE_CLASS_LOADED', true);
31

  
32
class Database {
33

  
34
//	$sdb = 'mysql://user:password@demo.de:3604/datenbank';
35

  
36
	private $_db_handle = null; // readonly from outside
37
	private $_scheme    = 'mysql';
38
	private $_hostname  = 'localhost';
39
	private $_username  = '';
40
	private $_password  = '';
41
	private $_hostport  = '3406';
42
	private $_db_name   = '';
43

  
44
	private $connected  = false;
45

  
46
	private $error      = '';
47
	private $error_type = '';
48
	private $message    = array();
49
	private $iQueryCount= 0;
50

  
51

  
52
	// Set DB_URL
53
	function __construct($url = '') {
54
		if($url != '') {
55
			$aIni = parse_url($url);
56
			$this->_scheme   = isset($aIni['scheme']) ? $aIni['scheme'] : 'mysql';
57
			$this->_hostname = isset($aIni['host']) ? $aIni['host'] : '';
58
			$this->_username = isset($aIni['user']) ? $aIni['user'] : '';
59
			$this->_password = isset($aIni['pass']) ? $aIni['pass'] : '';
60
			$this->_hostport = isset($aIni['port']) ? $aIni['port'] : '3306';
61
			$this->_hostport = $this->_hostport == '3306' ? '' : ':'.$this->_hostport;
62
			$this->_db_name  = ltrim(isset($aIni['path']) ? $aIni['path'] : '', '/\\');
63
		}else {
64
			$this->_hostname = DB_HOST;
65
			$this->_username = DB_USERNAME;
66
			$this->_password = DB_PASSWORD;
67
			$this->_hostport = '';
68
			$this->_db_name  = DB_NAME;
69
		}
70
		// Connect to database
71
		$this->connect();
72
	}
73
	
74
	// Connect to the database
75
	function connect() {
76
		$this->_db_handle = mysql_connect($this->_hostname.$this->_hostport,
77
		                                  $this->_username,
78
		                                  $this->_password);
79
		if(!$this->_db_handle) {
80
			throw new RuntimeException('unable to connect \''.$this->_scheme.'://'.
81
			                           $this->_hostname.$this->_hostport.'\'');
82
		} else {
83
			if(!mysql_select_db($this->_db_name)) {
84
				throw new RuntimeException('unable to select database \''.$this->_db_name.
85
				                           '\' on \''.$this->_scheme.'://'.
86
				                           $this->_hostname.$this->_hostport.'\'');
87
			} else {
88
				$this->connected = true;
89
			}
90
		}
91
		return $this->connected;
92
	}
93
	
94
	// Disconnect from the database
95
	function disconnect() {
96
		if($this->connected==true) {
97
			mysql_close($this->_db_handle);
98
			return true;
99
		} else {
100
			return false;
101
		}
102
	}
103
	
104
	// Run a query
105
	function query($statement) {
106
		$this->iQueryCount++;
107
		$mysql = new mysql();
108
		$mysql->query($statement, $this->_db_handle);
109
		$this->set_error($mysql->error($this->_db_handle));
110
		if($mysql->error($this->_db_handle)) {
111
			return null;
112
		} else {
113
			return $mysql;
114
		}
115
	}
116

  
117
	// Gets the first column of the first row
118
	function get_one( $statement )
119
	{
120
		$this->iQueryCount++;
121
		$fetch_row = mysql_fetch_array(mysql_query($statement, $this->_db_handle));
122
		$result = $fetch_row[0];
123
		$this->set_error(mysql_error($this->_db_handle));
124
		if(mysql_error($this->_db_handle)) {
125
			return null;
126
		} else {
127
			return $result;
128
		}
129
	}
130
	
131
	// Set the DB error
132
	function set_error($message = null) {
133
		global $TABLE_DOES_NOT_EXIST, $TABLE_UNKNOWN;
134
		$this->error = $message;
135
		if(strpos($message, 'no such table')) {
136
			$this->error_type = $TABLE_DOES_NOT_EXIST;
137
		} else {
138
			$this->error_type = $TABLE_UNKNOWN;
139
		}
140
	}
141
	
142
	// Return true if there was an error
143
	function is_error() {
144
		return (!empty($this->error)) ? true : false;
145
	}
146
	
147
	// Return the error
148
	function get_error() {
149
		return $this->error;
150
	}
151

  
152
/**
153
 * default Getter for some properties
154
 * @param string $sPropertyName
155
 * @return mixed NULL on error or missing property
156
 */
157
	public function __get($sPropertyName)
158
	{
159
		switch ($sPropertyName):
160
			case 'db_handle':
161
			case 'DbHandle':
162
			case 'getDbHandle':
163
				$retval = $this->_db_handle;
164
				break;
165
			case 'db_name':
166
			case 'DbName':
167
			case 'getDbName':
168
				$retval = $this->_db_name;
169
				break;
170
			case 'getQueryCount':
171
				$retval = $this->iQueryCount;
172
				break;
173
			default:
174
				$retval = null;
175
				break;
176
		endswitch;
177
		return $retval;
178
	} // __get()
179

  
180
/*
181
 * @param string $table_name: full name of the table (incl. TABLE_PREFIX)
182
 * @param string $field_name: name of the field to seek for
183
 * @return bool: true if field exists
184
 */
185
	public function field_exists($table_name, $field_name)
186
	{
187
		$sql = 'DESCRIBE `'.$table_name.'` `'.$field_name.'` ';
188
		$query = $this->query($sql, $this->_db_handle);
189
		return ($query->numRows() != 0);
190
	}
191

  
192
/*
193
 * @param string $table_name: full name of the table (incl. TABLE_PREFIX)
194
 * @param string $index_name: name of the index to seek for
195
 * @return bool: true if field exists
196
 */
197
	public function index_exists($table_name, $index_name, $number_fields = 0)
198
	{
199
		$number_fields = intval($number_fields);
200
		$keys = 0;
201
		$sql = 'SHOW INDEX FROM `'.$table_name.'`';
202
		if( ($res_keys = $this->query($sql, $this->_db_handle)) )
203
		{
204
			while(($rec_key = $res_keys->fetchRow()))
205
			{
206
				if( $rec_key['Key_name'] == $index_name )
207
				{
208
					$keys++;
209
				}
210
			}
211

  
212
		}
213
		if( $number_fields == 0 )
214
		{
215
			return ($keys != $number_fields);
216
		}else
217
		{
218
			return ($keys == $number_fields);
219
		}
220
	}
221
/*
222
 * @param string $table_name: full name of the table (incl. TABLE_PREFIX)
223
 * @param string $field_name: name of the field to add
224
 * @param string $description: describes the new field like ( INT NOT NULL DEFAULT '0')
225
 * @return bool: true if successful, otherwise false and error will be set
226
 */
227
	public function field_add($table_name, $field_name, $description)
228
	{
229
		if( !$this->field_exists($table_name, $field_name) )
230
		{ // add new field into a table
231
			$sql = 'ALTER TABLE `'.$table_name.'` ADD '.$field_name.' '.$description.' ';
232
			$query = $this->query($sql, $this->_db_handle);
233
			$this->set_error(mysql_error($this->_db_handle));
234
			if( !$this->is_error() )
235
			{
236
				return ( $this->field_exists($table_name, $field_name) ) ? true : false;
237
			}
238
		}else
239
		{
240
			$this->set_error('field \''.$field_name.'\' already exists');
241
		}
242
		return false;
243
	}
244

  
245
/*
246
 * @param string $table_name: full name of the table (incl. TABLE_PREFIX)
247
 * @param string $field_name: name of the field to add
248
 * @param string $description: describes the new field like ( INT NOT NULL DEFAULT '0')
249
 * @return bool: true if successful, otherwise false and error will be set
250
 */
251
	public function field_modify($table_name, $field_name, $description)
252
	{
253
		$retval = false;
254
		if( $this->field_exists($table_name, $field_name) )
255
		{ // modify a existing field in a table
256
			$sql  = 'ALTER TABLE `'.$table_name.'` MODIFY `'.$field_name.'` '.$description;
257
			$retval = ( $this->query($sql, $this->_db_handle) ? true : false);
258
			$this->set_error(mysql_error());
259
		}
260
		return $retval;
261
	}
262

  
263
/*
264
 * @param string $table_name: full name of the table (incl. TABLE_PREFIX)
265
 * @param string $field_name: name of the field to remove
266
 * @return bool: true if successful, otherwise false and error will be set
267
 */
268
	public function field_remove($table_name, $field_name)
269
	{
270
		$retval = false;
271
		if( $this->field_exists($table_name, $field_name) )
272
		{ // modify a existing field in a table
273
			$sql  = 'ALTER TABLE `'.$table_name.'` DROP `'.$field_name.'`';
274
			$retval = ( $this->query($sql, $this->_db_handle) ? true : false );
275
		}
276
		return $retval;
277
	}
278

  
279
/*
280
 * @param string $table_name: full name of the table (incl. TABLE_PREFIX)
281
 * @param string $index_name: name of the new index
282
 * @param string $field_list: comma seperated list of fields for this index
283
 * @param string $index_type: kind of index (UNIQUE, PRIMARY, '')
284
 * @return bool: true if successful, otherwise false and error will be set
285
 */
286
	public function index_add($table_name, $index_name, $field_list, $index_type = '')
287
	{
288
		$retval = false;
289
		$field_list = str_replace(' ', '', $field_list);
290
		$field_list = explode(',', $field_list);
291
		$number_fields = sizeof($field_list);
292
		$field_list = '`'.implode('`,`', $field_list).'`';
293
		if( $this->index_exists($table_name, $index_name, $number_fields) ||
294
		    $this->index_exists($table_name, $index_name))
295
		{
296
			$sql  = 'ALTER TABLE `'.$table_name.'` ';
297
			$sql .= 'DROP INDEX `'.$index_name.'`';
298
			if( $this->query($sql, $this->_db_handle))
299
			{
300
				$sql  = 'ALTER TABLE `'.$table_name.'` ';
301
				$sql .= 'ADD '.$index_type.' `'.$index_name.'` ( '.$field_list.' ); ';
302
				if( $this->query($sql, $this->_db_handle)) { $retval = true; }
303
			}
304
		}
305
		return $retval;
306
	}
307

  
308
/*
309
 * @param string $table_name: full name of the table (incl. TABLE_PREFIX)
310
 * @param string $field_name: name of the field to remove
311
 * @return bool: true if successful, otherwise false and error will be set
312
 */
313
	public function index_remove($table_name, $index_name)
314
	{
315
		$retval = false;
316
		if( $this->index_exists($table_name, $index_name) )
317
		{ // modify a existing field in a table
318
			$sql  = 'ALTER TABLE `'.$table_name.'` DROP INDEX `'.$index_name.'`';
319
			$retval = ( $this->query($sql, $this->_db_handle) ? true : false );
320
		}
321
		return $retval;
322
	}
323
/**
324
 * Import a standard *.sql dump file
325
 * @param string $sSqlDump link to the sql-dumpfile
326
 * @param string $sTablePrefix
327
 * @param bool $bPreserve set to true will ignore all DROP TABLE statements
328
 * @param string $sTblEngine
329
 * @param string $sTblCollation
330
 * @return boolean true if import successful
331
 */
332
	public function SqlImport($sSqlDump,
333
	                          $sTablePrefix = '',
334
	                          $bPreserve = true,
335
	                          $sTblEngine = 'ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci',
336
	                          $sTblCollation = ' collate utf8_unicode_ci')
337
	{
338
		$retval = true;
339
		$this->error = '';
340
		$aSearch  = array('{TABLE_PREFIX}','{TABLE_ENGINE}', '{TABLE_COLLATION}');
341
		$aReplace = array($sTablePrefix, $sTblEngine, $sTblCollation);
342
		$sql = '';
343
		$aSql = file($sSqlDump);
344
		while ( sizeof($aSql) > 0 ) {
345
			$sSqlLine = trim(array_shift($aSql));
346
			if (!preg_match('/^[-\/]+.*/', $sSqlLine)) {
347
				$sql = $sql.' '.$sSqlLine;
348
				if ((substr($sql,-1,1) == ';')) {
349
					$sql = trim(str_replace( $aSearch, $aReplace, $sql));
350
					if (!($bPreserve && preg_match('/^\s*DROP TABLE IF EXISTS/siU', $sql))) {
351
						if(!mysql_query($sql, $this->_db_handle)) {
352
							$retval = false;
353
							$this->error = mysql_error($this->_db_handle);
354
							unset($aSql);
355
							break;
356
						}
357
					}
358
					$sql = '';
359
				}
360
			}
361
		}
362
		return $retval;
363
	}
364

  
365
/**
366
 * retuns the type of the engine used for requested table
367
 * @param string $table name of the table, including prefix
368
 * @return boolean/string false on error, or name of the engine (myIsam/InnoDb)
369
 */
370
	public function getTableEngine($table)
371
	{
372
		$retVal = false;
373
		$mysqlVersion = mysql_get_server_info($this->_db_handle);
374
		$engineValue = (version_compare($mysqlVersion, '5.0') < 0) ? 'Type' : 'Engine';
375
		$sql = "SHOW TABLE STATUS FROM " . $this->_db_name . " LIKE '" . $table . "'";
376
		if(($result = $this->query($sql, $this->_db_handle))) {
377
			if(($row = $result->fetchRow(MYSQL_ASSOC))) {
378
				$retVal = $row[$engineValue];
379
			}
380
		}
381
		return $retVal;
382
	}
383

  
384

  
385
} /// end of class database
386

  
387
define('MYSQL_SEEK_FIRST', 0);
388
define('MYSQL_SEEK_LAST', -1);
389

  
390
class mysql {
391

  
392
	private $result = null;
393
	private $_db_handle = null;
394
	// Run a query
395
	function query($statement, $dbHandle) {
396
		$this->_db_handle = $dbHandle;
397
		$this->result = mysql_query($statement, $this->_db_handle);
398
		$this->error = mysql_error($this->_db_handle);
399
		return $this->result;
400
	}
401
	
402
	// Fetch num rows
403
	function numRows() {
404
		return mysql_num_rows($this->result);
405
	}
406

  
407
	// Fetch row  $typ = MYSQL_ASSOC, MYSQL_NUM, MYSQL_BOTH
408
	function fetchRow($typ = MYSQL_BOTH) {
409
		return mysql_fetch_array($this->result, $typ);
410
	}
411

  
412
	function rewind()
413
	{
414
		return $this->seekRow();
415
	}
416

  
417
	function seekRow( $position = MYSQL_SEEK_FIRST )
418
	{
419
		$pmax = $this->numRows() - 1;
420
		$p = (($position < 0 || $position > $pmax) ? $pmax : $position);
421
		return mysql_data_seek($this->result, $p);
422
	}
423

  
424
	// Get error
425
	function error() {
426
		if(isset($this->error)) {
427
			return $this->error;
428
		} else {
429
			return null;
430
		}
431
	}
432

  
433
}
434
/* this function is placed inside this file temporarely until a better place is found */
435
/*  function to update a var/value-pair(s) in table ****************************
436
 *  nonexisting keys are inserted
437
 *  @param string $table: name of table to use (without prefix)
438
 *  @param mixed $key:    a array of key->value pairs to update
439
 *                        or a string with name of the key to update
440
 *  @param string $value: a sting with needed value, if $key is a string too
441
 *  @return bool:  true if any keys are updated, otherwise false
442
 */
443
	function db_update_key_value($table, $key, $value = '')
444
	{
445
		global $database;
446
		if( !is_array($key))
447
		{
448
			if( trim($key) != '' )
449
			{
450
				$key = array( trim($key) => trim($value) );
451
			} else {
452
				$key = array();
453
			}
454
		}
455
		$retval = true;
456
		foreach( $key as $index=>$val)
457
		{
458
			$index = strtolower($index);
459
			$sql = 'SELECT COUNT(`setting_id`) '
460
			     . 'FROM `'.TABLE_PREFIX.$table.'` '
461
			     . 'WHERE `name` = \''.$index.'\' ';
462
			if($database->get_one($sql))
463
			{
464
				$sql = 'UPDATE ';
465
				$sql_where = 'WHERE `name` = \''.$index.'\'';
466
			}else {
467
				$sql = 'INSERT INTO ';
468
				$sql_where = '';
469
			}
470
			$sql .= '`'.TABLE_PREFIX.$table.'` ';
471
			$sql .= 'SET `name` = \''.$index.'\', ';
472
			$sql .= '`value` = \''.$val.'\' '.$sql_where;
473
			if( !$database->query($sql) )
474
			{
475
				$retval = false;
476
			}
477
		}
478
		return $retval;
479
	}
0 480

  
branches/2.8.x/wb/framework/class.wb.php
23 23
/* -------------------------------------------------------- */
24 24
// Include PHPLIB template class
25 25
require_once(WB_PATH."/include/phplib/template.inc");
26

  
27
require_once(WB_PATH.'/framework/class.database.php');
28

  
29 26
// Include new wbmailer class (subclass of PHPmailer)
30 27
require_once(WB_PATH."/framework/class.wbmailer.php");
31

  
32 28
//require_once(WB_PATH."/framework/SecureForm.php");
33 29

  
34 30
class wb extends SecureForm
branches/2.8.x/wb/framework/globalExceptionHandler.php
51 51
		}
52 52
	} // end of class
53 53

  
54
/* -- several security exceptions ----------------------------------------------------- */
55
	class SecurityException extends RuntimeException { 	}
56

  
57
	class SecDirectoryTraversalException extends SecurityException {
58
		public function __toString() {
59
			return 'possible directory traversal attack';
60
		}
61
	}
62
/* ------------------------------------------------------------------------------------ */
54 63
/**
55 64
 *
56 65
 * @param Exception $e
......
59 68
		// hide server internals from filename where the exception was thrown
60 69
		$file = str_replace(dirname(dirname(__FILE__)), '', $e->getFile());
61 70
		// select some exceptions for special handling
62
		if ($e instanceof IllegalFileException) {
71
		if ($e instanceof SecurityException) {
72
			$out = 'Exception: "'.(string)$e.'" @ ';
73
		    $trace = $e->getTrace();
74
			if($trace[0]['class'] != '') {
75
				$out .= $trace[0]['class'].'->';
76
			}
77
			$out .= $trace[0]['function'].'();<br />';
78
			$out .= 'in "'.$file.'"'."\n";
79
			echo $out;
80
		}elseif ($e instanceof IllegalFileException) {
63 81
			$sResponse  = $_SERVER['SERVER_PROTOCOL'].' 403 Forbidden';
64 82
			header($sResponse);
65 83
			echo $e;
66 84
		}elseif($e instanceof RuntimeException) {
67
			$out  ='There was a serious runtime error:'."\n";
85
			$out  = 'There was a serious runtime error:'."\n";
68 86
			$out .= $e->getMessage()."\n";
69 87
			$out .= 'in line ('.$e->getLine().') of ('.$file.')'."\n";
70 88
			echo $out;
branches/2.8.x/wb/framework/ModLanguage.php
1
<?php
2
/**
3
 * @category     Core
4
 * @package      Core_security
5
 * @author       Werner v.d.Decken
6
 * @copyright    ISTeasy-project(http://isteasy.de/)
7
 * @license      Creative Commons BY-SA 3.0 http://creativecommons.org/licenses/by-sa/3.0/
8
 * @version      $Id$
9
 * @filesource   $HeadURL$
10
 * @since        Datei vorhanden seit Release 2.8.2
11
 * @lastmodified $Date$
12
 */
13
class ModLanguage {
14

  
15
	private $_sCurrentLanguage   = '';
16
	private $_sDefaultLanguage   = '';
17
	private $_sLanguageDirectory = '';
18
	private $_sLanguageFile      = '';
19
	private $_LanguageTable      = array();
20
	private $_bLoaded            = false;
21

  
22
	private static $_oInstance   = null;
23
/* prevent from public instancing */
24
	protected function  __construct() { }
25
/* prevent from cloning */
26
	private function __clone() {}
27
/**
28
 * get a valid instance of this class
29
 * @return object
30
 */
31
	public function getInstance() {
32
		if( is_null(self::$_oInstance) ) {
33
            $c = __CLASS__;
34
            self::$_oInstance = new $c;
35
		}
36
		return self::$_oInstance;
37
	}
38
/**
39
 * set language and load needed language file
40
 * @param string $sDirectory full path to the language files
41
 * @param string $sLanguage 2-letters language code
42
 * @param string $sDefault 2-letters default-language code
43
 */
44
	public function setLanguage($sDirectory, $sLanguage, $sDefault = 'EN')
45
	{
46
		$sBasePath = realpath(dirname(dirname(__FILE__)));
47
		$sLangDir = realpath($sDirectory);
48
		if(!preg_match('/^'.preg_quote($sBasePath, '/').'/', $sLangDir)) {
49
			throw new SecDirectoryTraversalException();
50
		}
51
		$sLangDir = str_replace('\\', '/', $sLangDir);
52
		$sLangDir = rtrim($sLangDir, '/').'/';
53
		$sLanguage = strtoupper($sLanguage);
54
		$sLanguage = strtoupper($sDefault);
55
		if($this->_sLanguageDirectory != $sLangDir ||
56
		   $this->_sCurrentLanguage != $sLanguage ||
57
		   $this->_sDefaultLanguage != $sDefault)
58
		{
59
			$this->_sLanguageDirectory = rtrim($sLangDir, '/').'/';
60
			$this->_sCurrentLanguage = $sLanguage;
61
			$this->_sDefaultLanguage = $sDefault;
62

  
63
			if(!$this->_findLanguageFile()) {
64
				$msg  = 'unable to find valid language definition file in<br />';
65
				$msg .= '"'.str_replace($sBasePath, '', $this->_sLanguageDirectory).'"';
66
				throw new TranslationException($msg);
67
			}
68
			$this->_importArrays();
69
		}
70
		$this->_bLoaded = (sizeof($this->_LanguageTable) > 0);
71
	}
72
/**
73
 * return requested translation for a key
74
 * @param string $sLanguageKey 2-uppercase letters language code
75
 * @return string found translation or empty string 
76
 */
77
	public function __get($sLanguageKey)
78
	{
79
		$sRetval = (isset($this->_LanguageTable[$sLanguageKey])
80
		            ? $this->_LanguageTable[$sLanguageKey] : '{missing: '.$sLanguageKey.'}');
81
		return $sRetval;
82
	}
83
/**
84
 * returns the whoole language array for use in templateengine
85
 * @return array
86
 */
87
	public function getLangArray()
88
	{
89
		return $this->_LanguageTable;
90
	}
91
/**
92
 * search language file in order: LANGUAGE - DEFAULT_LANGUAGE - FIRST_FOUND
93
 * @return boolean
94
 */
95
	private function _findLanguageFile()
96
	{
97
		$bMatch = false;
98
		$dir = $this->_sLanguageDirectory;
99
		if(is_readable($dir.$this->_sCurrentLanguage.'.php')) {
100
		// check actual language
101
			$this->_sLanguageFile = $dir.$this->_sCurrentLanguage.'.php';
102
			$bMatch = true;
103
		}else {
104
			if(is_readable($dir.$this->_sDefaultLanguage.'.php')) {
105
			// check default language
106
				$this->_sLanguageFile = $dir.$this->_sDefaultLanguage.'.php';
107
				$bMatch = true;
108
			}else {
109
			// search for first available and readable language file
110
				if(is_readable($dir)) {
111
					$iterator = new DirectoryIterator($dir);
112
					foreach ($iterator as $fileinfo) {
113
						if(!preg_match('/^[A-Z]{2}\.php$/', $fileinfo->getBasename())) { continue; }
114
						$sLanguageFile = str_replace('\\', '/', $fileinfo->getPathname());
115
						if(is_readable($sLanguageFile)) {
116
							$this->_sLanguageFile = $sLanguageFile;
117
							$bMatch = true;
118
							break;
119
						}
120
					}
121
				}
122
			}
123
		}
124
		return $bMatch;
125
	}
126
/**
127
 * import key-values from language file
128
 */
129
	private function _importArrays()
130
	{
131
		include($this->_sLanguageFile);
132
		$aLangSections = array('HEADING', 'TEXT', 'MESSAGE', 'MENU', 'OVERVIEW', 'GENERIC');
133
		foreach($aLangSections as $sSection) {
134
			if(isset(${$sSection}) && is_array(${$sSection})) {
135
				foreach(${$sSection} as $key => $value) {
136
					$this->_LanguageTable[$sSection.'_'.$key] = $value;
137
				}
138
			}
139
		}
140
	}
141
} // end class Translate
142
/**
143
 *  Exception class for Translation
144
 */
145
class TranslationException extends AppException {}
146

  
0 147

  

Also available in: Unified diff