1
+ − 1
<?php
+ − 2
+ − 3
/*
+ − 4
* Enano - an open-source CMS capable of wiki functions, Drupal-like sidebar blocks, and everything in between
73
0a74676a2f2f
Made the move to Loch Ness, and got some basic page grouping functionality working. TODO: fix some UI issues in Javascript ACL editor and change non-JS ACL editor to work with page groups too
Dan
diff
changeset
+ − 5
* Version 1.0.1 (Loch Ness)
1
+ − 6
* Copyright (C) 2006-2007 Dan Fuhry
+ − 7
*
+ − 8
* This program is Free Software; you can redistribute and/or modify it under the terms of the GNU General Public License
+ − 9
* as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.
+ − 10
*
+ − 11
* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied
+ − 12
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for details.
+ − 13
*/
22
+ − 14
+ − 15
/**
+ − 16
* Fetch a value from the site configuration.
+ − 17
* @param string The identifier of the value ("site_name" etc.)
+ − 18
* @return string Configuration value, or bool(false) if the value is not set
+ − 19
*/
+ − 20
+ − 21
function getConfig($n)
+ − 22
{
1
+ − 23
global $enano_config;
22
+ − 24
if ( isset( $enano_config[ $n ] ) )
+ − 25
{
+ − 26
return $enano_config[$n];
+ − 27
}
+ − 28
else
+ − 29
{
+ − 30
return false;
+ − 31
}
1
+ − 32
}
+ − 33
22
+ − 34
/**
+ − 35
* Update or change a configuration value.
+ − 36
* @param string The identifier of the value ("site_name" etc.)
+ − 37
* @param string The new value
+ − 38
* @return null
+ − 39
*/
+ − 40
+ − 41
function setConfig($n, $v)
+ − 42
{
76
+ − 43
1
+ − 44
global $enano_config, $db;
+ − 45
$enano_config[$n] = $v;
+ − 46
$v = $db->escape($v);
76
+ − 47
22
+ − 48
$e = $db->sql_query('DELETE FROM '.table_prefix.'config WHERE config_name=\''.$n.'\';');
+ − 49
if ( !$e )
+ − 50
{
+ − 51
$db->_die('Error during generic setConfig() call row deletion.');
+ − 52
}
76
+ − 53
22
+ − 54
$e = $db->sql_query('INSERT INTO '.table_prefix.'config(config_name, config_value) VALUES(\''.$n.'\', \''.$v.'\')');
+ − 55
if ( !$e )
+ − 56
{
+ − 57
$db->_die('Error during generic setConfig() call row insertion.');
+ − 58
}
1
+ − 59
}
+ − 60
22
+ − 61
/**
+ − 62
* Create a URI for an internal link.
+ − 63
* @param string The full identifier of the page to link to (Special:Administration)
+ − 64
* @param string The GET query string to append
+ − 65
* @param bool If true, perform htmlspecialchars() on the return value to make it HTML-safe
+ − 66
* @return string
+ − 67
*/
+ − 68
1
+ − 69
function makeUrl($t, $query = false, $escape = false)
+ − 70
{
+ − 71
global $db, $session, $paths, $template, $plugins; // Common objects
+ − 72
$flags = '';
+ − 73
$sep = urlSeparator;
22
+ − 74
if ( isset($_GET['printable'] ) )
+ − 75
{
+ − 76
$flags .= $sep . 'printable=yes';
+ − 77
$sep = '&';
+ − 78
}
+ − 79
if ( isset($_GET['theme'] ) )
+ − 80
{
+ − 81
$flags .= $sep . 'theme='.$session->theme;
+ − 82
$sep = '&';
+ − 83
}
+ − 84
if ( isset($_GET['style'] ) ) {
76
+ − 85
$flags .= $sep . 'style='.$session->style;
22
+ − 86
$sep = '&';
+ − 87
}
76
+ − 88
1
+ − 89
$url = $session->append_sid(contentPath.$t.$flags);
+ − 90
if($query)
+ − 91
{
+ − 92
$sep = strstr($url, '?') ? '&' : '?';
+ − 93
$url = $url . $sep . $query;
+ − 94
}
76
+ − 95
1
+ − 96
return ($escape) ? htmlspecialchars($url) : $url;
+ − 97
}
+ − 98
22
+ − 99
/**
+ − 100
* Create a URI for an internal link, and be namespace-friendly. Watch out for this one because it's different from most other Enano functions, in that the namespace is the first parameter.
+ − 101
* @param string The namespace ID
+ − 102
* @param string The page ID
+ − 103
* @param string The GET query string to append
+ − 104
* @param bool If true, perform htmlspecialchars() on the return value to make it HTML-safe
+ − 105
* @return string
+ − 106
*/
+ − 107
1
+ − 108
function makeUrlNS($n, $t, $query = false, $escape = false)
+ − 109
{
+ − 110
global $db, $session, $paths, $template, $plugins; // Common objects
+ − 111
$flags = '';
76
+ − 112
1
+ − 113
if(defined('ENANO_BASE_CLASSES_INITIALIZED'))
+ − 114
{
22
+ − 115
$sep = urlSeparator;
1
+ − 116
}
+ − 117
else
+ − 118
{
22
+ − 119
$sep = (strstr($_SERVER['REQUEST_URI'], '?')) ? '&' : '?';
+ − 120
}
+ − 121
if ( isset( $_GET['printable'] ) ) {
+ − 122
$flags .= $sep . 'printable';
+ − 123
$sep = '&';
+ − 124
}
76
+ − 125
if ( isset( $_GET['theme'] ) )
22
+ − 126
{
+ − 127
$flags .= $sep . 'theme='.$session->theme;
+ − 128
$sep = '&';
+ − 129
}
+ − 130
if ( isset( $_GET['style'] ) )
+ − 131
{
+ − 132
$flags .= $sep . 'style='.$session->style;
+ − 133
$sep = '&';
+ − 134
}
76
+ − 135
22
+ − 136
if(defined('ENANO_BASE_CLASSES_INITIALIZED'))
+ − 137
{
+ − 138
$url = contentPath . $paths->nslist[$n] . $t . $flags;
+ − 139
}
+ − 140
else
+ − 141
{
+ − 142
// If the path manager hasn't been initted yet, take an educated guess at what the URI should be
+ − 143
$url = contentPath . $n . ':' . $t . $flags;
1
+ − 144
}
76
+ − 145
1
+ − 146
if($query)
+ − 147
{
76
+ − 148
if(strstr($url, '?'))
22
+ − 149
{
+ − 150
$sep = '&';
+ − 151
}
+ − 152
else
+ − 153
{
+ − 154
$sep = '?';
+ − 155
}
1
+ − 156
$url = $url . $sep . $query . $flags;
+ − 157
}
76
+ − 158
1
+ − 159
if(defined('ENANO_BASE_CLASSES_INITIALIZED'))
+ − 160
{
+ − 161
$url = $session->append_sid($url);
+ − 162
}
76
+ − 163
1
+ − 164
return ($escape) ? htmlspecialchars($url) : $url;
+ − 165
}
+ − 166
22
+ − 167
/**
+ − 168
* Create a URI for an internal link, be namespace-friendly, and add http://hostname/scriptpath to the beginning if possible. Watch out for this one because it's different from most other Enano functions, in that the namespace is the first parameter.
+ − 169
* @param string The namespace ID
+ − 170
* @param string The page ID
+ − 171
* @param string The GET query string to append
+ − 172
* @param bool If true, perform htmlspecialchars() on the return value to make it HTML-safe
+ − 173
* @return string
+ − 174
*/
+ − 175
1
+ − 176
function makeUrlComplete($n, $t, $query = false, $escape = false)
+ − 177
{
+ − 178
global $db, $session, $paths, $template, $plugins; // Common objects
+ − 179
$flags = '';
76
+ − 180
22
+ − 181
if(defined('ENANO_BASE_CLASSES_INITIALIZED'))
+ − 182
{
+ − 183
$sep = urlSeparator;
+ − 184
}
+ − 185
else
+ − 186
{
+ − 187
$sep = (strstr($_SERVER['REQUEST_URI'], '?')) ? '&' : '?';
+ − 188
}
+ − 189
if ( isset( $_GET['printable'] ) ) {
+ − 190
$flags .= $sep . 'printable';
+ − 191
$sep = '&';
+ − 192
}
76
+ − 193
if ( isset( $_GET['theme'] ) )
22
+ − 194
{
+ − 195
$flags .= $sep . 'theme='.$session->theme;
+ − 196
$sep = '&';
+ − 197
}
+ − 198
if ( isset( $_GET['style'] ) )
+ − 199
{
+ − 200
$flags .= $sep . 'style='.$session->style;
+ − 201
$sep = '&';
+ − 202
}
76
+ − 203
22
+ − 204
if(defined('ENANO_BASE_CLASSES_INITIALIZED'))
+ − 205
{
+ − 206
$url = $session->append_sid(contentPath . $paths->nslist[$n] . $t . $flags);
+ − 207
}
+ − 208
else
+ − 209
{
+ − 210
// If the path manager hasn't been initted yet, take an educated guess at what the URI should be
+ − 211
$url = contentPath . $n . ':' . $t . $flags;
+ − 212
}
1
+ − 213
if($query)
+ − 214
{
+ − 215
if(strstr($url, '?')) $sep = '&';
+ − 216
else $sep = '?';
+ − 217
$url = $url . $sep . $query . $flags;
+ − 218
}
76
+ − 219
1
+ − 220
$baseprot = 'http' . ( isset($_SERVER['HTTPS']) ? 's' : '' ) . '://' . $_SERVER['HTTP_HOST'];
+ − 221
$url = $baseprot . $url;
76
+ − 222
1
+ − 223
return ($escape) ? htmlspecialchars($url) : $url;
+ − 224
}
+ − 225
+ − 226
/**
62
9dc4fded30e6
Redirect pages actually work stable-ish now; critical extraneous debug message removed (oops!)
Dan
diff
changeset
+ − 227
* Tells you the title for the given page ID string
9dc4fded30e6
Redirect pages actually work stable-ish now; critical extraneous debug message removed (oops!)
Dan
diff
changeset
+ − 228
* @param string Page ID string (ex: Special:Administration)
9dc4fded30e6
Redirect pages actually work stable-ish now; critical extraneous debug message removed (oops!)
Dan
diff
changeset
+ − 229
* @return string
9dc4fded30e6
Redirect pages actually work stable-ish now; critical extraneous debug message removed (oops!)
Dan
diff
changeset
+ − 230
*/
9dc4fded30e6
Redirect pages actually work stable-ish now; critical extraneous debug message removed (oops!)
Dan
diff
changeset
+ − 231
9dc4fded30e6
Redirect pages actually work stable-ish now; critical extraneous debug message removed (oops!)
Dan
diff
changeset
+ − 232
function get_page_title($page_id)
9dc4fded30e6
Redirect pages actually work stable-ish now; critical extraneous debug message removed (oops!)
Dan
diff
changeset
+ − 233
{
9dc4fded30e6
Redirect pages actually work stable-ish now; critical extraneous debug message removed (oops!)
Dan
diff
changeset
+ − 234
global $db, $session, $paths, $template, $plugins; // Common objects
76
+ − 235
62
9dc4fded30e6
Redirect pages actually work stable-ish now; critical extraneous debug message removed (oops!)
Dan
diff
changeset
+ − 236
$idata = RenderMan::strToPageID($page_id);
9dc4fded30e6
Redirect pages actually work stable-ish now; critical extraneous debug message removed (oops!)
Dan
diff
changeset
+ − 237
$page_id_key = $paths->nslist[ $idata[1] ] . $idata[0];
9dc4fded30e6
Redirect pages actually work stable-ish now; critical extraneous debug message removed (oops!)
Dan
diff
changeset
+ − 238
$page_data = $paths->pages[$page_id_key];
76
+ − 239
$title = ( isset($page_data['name']) ) ? ( $page_data['namespace'] == 'Article' ? '' : $paths->nslist[ $idata[1] ] ) . $page_data['name'] : $paths->nslist[$idata[1]] . str_replace('_', ' ', dirtify_page_id( $idata[0] ) );
62
9dc4fded30e6
Redirect pages actually work stable-ish now; critical extraneous debug message removed (oops!)
Dan
diff
changeset
+ − 240
return $title;
9dc4fded30e6
Redirect pages actually work stable-ish now; critical extraneous debug message removed (oops!)
Dan
diff
changeset
+ − 241
}
9dc4fded30e6
Redirect pages actually work stable-ish now; critical extraneous debug message removed (oops!)
Dan
diff
changeset
+ − 242
9dc4fded30e6
Redirect pages actually work stable-ish now; critical extraneous debug message removed (oops!)
Dan
diff
changeset
+ − 243
/**
9dc4fded30e6
Redirect pages actually work stable-ish now; critical extraneous debug message removed (oops!)
Dan
diff
changeset
+ − 244
* Tells you the title for the given page ID and namespace
9dc4fded30e6
Redirect pages actually work stable-ish now; critical extraneous debug message removed (oops!)
Dan
diff
changeset
+ − 245
* @param string Page ID
9dc4fded30e6
Redirect pages actually work stable-ish now; critical extraneous debug message removed (oops!)
Dan
diff
changeset
+ − 246
* @param string Namespace
9dc4fded30e6
Redirect pages actually work stable-ish now; critical extraneous debug message removed (oops!)
Dan
diff
changeset
+ − 247
* @return string
9dc4fded30e6
Redirect pages actually work stable-ish now; critical extraneous debug message removed (oops!)
Dan
diff
changeset
+ − 248
*/
9dc4fded30e6
Redirect pages actually work stable-ish now; critical extraneous debug message removed (oops!)
Dan
diff
changeset
+ − 249
9dc4fded30e6
Redirect pages actually work stable-ish now; critical extraneous debug message removed (oops!)
Dan
diff
changeset
+ − 250
function get_page_title_ns($page_id, $namespace)
9dc4fded30e6
Redirect pages actually work stable-ish now; critical extraneous debug message removed (oops!)
Dan
diff
changeset
+ − 251
{
9dc4fded30e6
Redirect pages actually work stable-ish now; critical extraneous debug message removed (oops!)
Dan
diff
changeset
+ − 252
global $db, $session, $paths, $template, $plugins; // Common objects
76
+ − 253
62
9dc4fded30e6
Redirect pages actually work stable-ish now; critical extraneous debug message removed (oops!)
Dan
diff
changeset
+ − 254
$page_id_key = $paths->nslist[ $namespace ] . $page_id;
9dc4fded30e6
Redirect pages actually work stable-ish now; critical extraneous debug message removed (oops!)
Dan
diff
changeset
+ − 255
$page_data = $paths->pages[$page_id_key];
9dc4fded30e6
Redirect pages actually work stable-ish now; critical extraneous debug message removed (oops!)
Dan
diff
changeset
+ − 256
$title = ( isset($page_data['name']) ) ? $page_data['name'] : $paths->nslist[$namespace] . str_replace('_', ' ', dirtify_page_id( $page_id ) );
9dc4fded30e6
Redirect pages actually work stable-ish now; critical extraneous debug message removed (oops!)
Dan
diff
changeset
+ − 257
return $title;
9dc4fded30e6
Redirect pages actually work stable-ish now; critical extraneous debug message removed (oops!)
Dan
diff
changeset
+ − 258
}
9dc4fded30e6
Redirect pages actually work stable-ish now; critical extraneous debug message removed (oops!)
Dan
diff
changeset
+ − 259
9dc4fded30e6
Redirect pages actually work stable-ish now; critical extraneous debug message removed (oops!)
Dan
diff
changeset
+ − 260
/**
1
+ − 261
* Redirect the user to the specified URL.
+ − 262
* @param string $url The URL, either relative or absolute.
+ − 263
* @param string $title The title of the message
+ − 264
* @param string $message A short message to show to the user
+ − 265
* @param string $timeout Timeout, in seconds, to delay the redirect. Defaults to 3.
+ − 266
*/
76
+ − 267
1
+ − 268
function redirect($url, $title = 'Redirecting...', $message = 'Please wait while you are redirected.', $timeout = 3)
+ − 269
{
+ − 270
global $db, $session, $paths, $template, $plugins; // Common objects
76
+ − 271
1
+ − 272
if ( $timeout == 0 )
+ − 273
{
+ − 274
header('Location: ' . $url);
+ − 275
header('HTTP/1.1 307 Temporary Redirect');
+ − 276
}
76
+ − 277
1
+ − 278
$template->add_header('<meta http-equiv="refresh" content="' . $timeout . '; url=' . str_replace('"', '\\"', $url) . '" />');
+ − 279
$template->add_header('<script type="text/javascript">
+ − 280
function __r() {
+ − 281
// FUNCTION AUTOMATICALLY GENERATED
+ − 282
window.location="' . str_replace('"', '\\"', $url) . '";
+ − 283
}
+ − 284
setTimeout(\'__r();\', ' . $timeout . '000);
+ − 285
</script>
+ − 286
');
76
+ − 287
1
+ − 288
$template->tpl_strings['PAGE_NAME'] = $title;
+ − 289
$template->header(true);
+ − 290
echo '<p>' . $message . '</p><p>If you are not redirected within ' . ( $timeout + 1 ) . ' seconds, <a href="' . str_replace('"', '\\"', $url) . '">please click here</a>.</p>';
+ − 291
$template->footer(true);
76
+ − 292
1
+ − 293
$db->close();
+ − 294
exit(0);
76
+ − 295
1
+ − 296
}
+ − 297
+ − 298
// Removed wikiFormat() from here, replaced with RenderMan::render
+ − 299
22
+ − 300
/**
+ − 301
* Tell me if the page exists or not.
+ − 302
* @param string the full page ID (Special:Administration) of the page to check for
+ − 303
* @return bool True if the page exists, false otherwise
+ − 304
*/
+ − 305
1
+ − 306
function isPage($p) {
+ − 307
global $db, $session, $paths, $template, $plugins; // Common objects
76
+ − 308
22
+ − 309
// Try the easy way first ;-)
+ − 310
if ( isset( $paths->pages[ $p ] ) )
+ − 311
{
+ − 312
return true;
+ − 313
}
76
+ − 314
22
+ − 315
// Special case for Special, Template, and Admin pages that can't have slashes in their URIs
+ − 316
$ns_test = RenderMan::strToPageID( $p );
76
+ − 317
22
+ − 318
if($ns_test[1] != 'Special' && $ns_test[1] != 'Template' && $ns_test[1] != 'Admin')
+ − 319
{
+ − 320
return false;
+ − 321
}
76
+ − 322
22
+ − 323
$particles = explode('/', $p);
+ − 324
if ( isset ( $paths->pages[ $particles[ 0 ] ] ) )
+ − 325
{
+ − 326
return true;
+ − 327
}
+ − 328
else
+ − 329
{
+ − 330
return false;
+ − 331
}
1
+ − 332
}
+ − 333
76
+ − 334
/**
+ − 335
* These are some old functions that were used with the Midget codebase. They are deprecated and should not be used any more.
+ − 336
*/
+ − 337
1
+ − 338
function arrayItemUp($arr, $keyname) {
+ − 339
$keylist = array_keys($arr);
+ − 340
$keyflop = array_flip($keylist);
+ − 341
$idx = $keyflop[$keyname];
+ − 342
$idxm = $idx - 1;
+ − 343
$temp = $arr[$keylist[$idxm]];
+ − 344
if($arr[$keylist[0]] == $arr[$keyname]) return $arr;
+ − 345
$arr[$keylist[$idxm]] = $arr[$keylist[$idx]];
+ − 346
$arr[$keylist[$idx]] = $temp;
+ − 347
return $arr;
+ − 348
}
+ − 349
+ − 350
function arrayItemDown($arr, $keyname) {
+ − 351
$keylist = array_keys($arr);
+ − 352
$keyflop = array_flip($keylist);
+ − 353
$idx = $keyflop[$keyname];
+ − 354
$idxm = $idx + 1;
+ − 355
$temp = $arr[$keylist[$idxm]];
+ − 356
$sz = sizeof($arr); $sz--;
+ − 357
if($arr[$keylist[$sz]] == $arr[$keyname]) return $arr;
+ − 358
$arr[$keylist[$idxm]] = $arr[$keylist[$idx]];
+ − 359
$arr[$keylist[$idx]] = $temp;
+ − 360
return $arr;
+ − 361
}
+ − 362
+ − 363
function arrayItemTop($arr, $keyname) {
+ − 364
$keylist = array_keys($arr);
+ − 365
$keyflop = array_flip($keylist);
+ − 366
$idx = $keyflop[$keyname];
+ − 367
while( $orig != $arr[$keylist[0]] ) {
+ − 368
// echo 'Keyname: '.$keylist[$idx] . '<br />'; flush(); ob_flush(); // Debugger
+ − 369
if($idx < 0) return $arr;
+ − 370
if($keylist[$idx] == '' || $keylist[$idx] < 0 || !$keylist[$idx]) {
+ − 371
/* echo 'Infinite loop caught in arrayItemTop(<br /><pre>';
+ − 372
print_r($arr);
+ − 373
echo '</pre><br />, '.$keyname.');<br /><br />EnanoCMS: Critical error during function call, exiting to prevent excessive server load.';
+ − 374
exit; */
+ − 375
return $arr;
+ − 376
}
+ − 377
$arr = arrayItemUp($arr, $keylist[$idx]);
+ − 378
$idx--;
+ − 379
}
+ − 380
return $arr;
+ − 381
}
+ − 382
+ − 383
function arrayItemBottom($arr, $keyname) {
+ − 384
$keylist = array_keys($arr);
+ − 385
$keyflop = array_flip($keylist);
+ − 386
$idx = $keyflop[$keyname];
+ − 387
$sz = sizeof($arr); $sz--;
+ − 388
while( $orig != $arr[$keylist[$sz]] ) {
+ − 389
// echo 'Keyname: '.$keylist[$idx] . '<br />'; flush(); ob_flush(); // Debugger
+ − 390
if($idx > $sz) return $arr;
+ − 391
if($keylist[$idx] == '' || $keylist[$idx] < 0 || !$keylist[$idx]) {
+ − 392
echo 'Infinite loop caught in arrayItemBottom(<br /><pre>';
+ − 393
print_r($arr);
+ − 394
echo '</pre><br />, '.$keyname.');<br /><br />EnanoCMS: Critical error during function call, exiting to prevent excessive server load.';
+ − 395
exit;
+ − 396
}
+ − 397
$arr = arrayItemDown($arr, $keylist[$idx]);
+ − 398
$idx++;
+ − 399
}
+ − 400
return $arr;
+ − 401
}
+ − 402
+ − 403
// Convert IP address to hex string
+ − 404
// Input: 127.0.0.1 (string)
+ − 405
// Output: 0x7f000001 (string)
+ − 406
// Updated 12/8/06 to work with PHP4 and not use eval() (blech)
+ − 407
function ip2hex($ip) {
+ − 408
if ( preg_match('/^([0-9a-f:]+)$/', $ip) )
+ − 409
{
+ − 410
// this is an ipv6 address
+ − 411
return str_replace(':', '', $ip);
+ − 412
}
+ − 413
$nums = explode('.', $ip);
+ − 414
if(sizeof($nums) != 4) return false;
+ − 415
$str = '0x';
+ − 416
foreach($nums as $n)
+ − 417
{
+ − 418
$str .= (string)dechex($n);
+ − 419
}
+ − 420
return $str;
+ − 421
}
+ − 422
+ − 423
// Convert DWord to IP address
+ − 424
// Input: 0x7f000001
+ − 425
// Output: 127.0.0.1
+ − 426
// Updated 12/8/06 to work with PHP4 and not use eval() (blech)
+ − 427
function hex2ip($in) {
+ − 428
if(substr($in, 0, 2) == '0x') $ip = substr($in, 2, 8);
+ − 429
else $ip = substr($in, 0, 8);
+ − 430
$octets = enano_str_split($ip, 2);
+ − 431
$str = '';
+ − 432
$newoct = Array();
+ − 433
foreach($octets as $o)
+ − 434
{
+ − 435
$o = (int)hexdec($o);
+ − 436
$newoct[] = $o;
+ − 437
}
+ − 438
return implode('.', $newoct);
+ − 439
}
+ − 440
+ − 441
// Function strip_php moved to RenderMan class
+ − 442
76
+ − 443
/**
+ − 444
* Immediately brings the site to a halt with an error message. Unlike grinding_halt() this can only be called after the config has been
+ − 445
* fetched (plugin developers don't even need to worry since plugins are always loaded after the config) and shows the site name and
+ − 446
* description.
+ − 447
* @param string The title of the error message
+ − 448
* @param string The body of the message, this can be HTML, and should be separated into paragraphs using the <p> tag
+ − 449
*/
+ − 450
1
+ − 451
function die_semicritical($t, $p)
+ − 452
{
+ − 453
global $db, $session, $paths, $template, $plugins; // Common objects
+ − 454
$db->close();
76
+ − 455
1
+ − 456
if ( ob_get_status() )
+ − 457
ob_end_clean();
76
+ − 458
1
+ − 459
dc_here('functions: <span style="color: red">calling die_semicritical</span>');
76
+ − 460
1
+ − 461
$tpl = new template_nodb();
+ − 462
$tpl->load_theme('oxygen', 'bleu');
+ − 463
$tpl->tpl_strings['SITE_NAME'] = getConfig('site_name');
+ − 464
$tpl->tpl_strings['SITE_DESC'] = getConfig('site_desc');
+ − 465
$tpl->tpl_strings['COPYRIGHT'] = getConfig('copyright_notice');
+ − 466
$tpl->tpl_strings['PAGE_NAME'] = $t;
+ − 467
$tpl->header();
+ − 468
echo $p;
+ − 469
$tpl->footer();
76
+ − 470
1
+ − 471
exit;
+ − 472
}
+ − 473
76
+ − 474
/**
+ − 475
* Halts Enano execution with a message. This doesn't have to be an error message, it's sometimes used to indicate success at an operation.
+ − 476
* @param string The title of the message
+ − 477
* @param string The body of the message, this can be HTML, and should be separated into paragraphs using the <p> tag
+ − 478
*/
+ − 479
1
+ − 480
function die_friendly($t, $p)
+ − 481
{
+ − 482
global $db, $session, $paths, $template, $plugins; // Common objects
76
+ − 483
1
+ − 484
if ( ob_get_status() )
+ − 485
ob_end_clean();
76
+ − 486
1
+ − 487
dc_here('functions: <span style="color: red">calling die_friendly</span>');
+ − 488
$paths->cpage['name'] = $t;
+ − 489
$template->tpl_strings['PAGE_NAME'] = $t;
+ − 490
$template->header();
+ − 491
echo $p;
+ − 492
$template->footer();
+ − 493
$db->close();
76
+ − 494
1
+ − 495
exit;
+ − 496
}
+ − 497
76
+ − 498
/**
+ − 499
* Immediately brings the site to a halt with an error message, and focuses on immediately closing the database connection and shutting down Enano in the event that an attack may happen. This should only be used very early on to indicate very severe errors, or if the site may be under attack (like if the DBAL detects a malicious query). In the vast majority of cases, die_semicritical() is more appropriate.
+ − 500
* @param string The title of the error message
+ − 501
* @param string The body of the message, this can be HTML, and should be separated into paragraphs using the <p> tag
+ − 502
*/
+ − 503
1
+ − 504
function grinding_halt($t, $p)
+ − 505
{
+ − 506
global $db, $session, $paths, $template, $plugins; // Common objects
76
+ − 507
1
+ − 508
$db->close();
76
+ − 509
1
+ − 510
if ( ob_get_status() )
+ − 511
ob_end_clean();
76
+ − 512
1
+ − 513
dc_here('functions: <span style="color: red">calling grinding_halt</span>');
+ − 514
$tpl = new template_nodb();
+ − 515
$tpl->load_theme('oxygen', 'bleu');
+ − 516
$tpl->tpl_strings['SITE_NAME'] = 'Critical error';
+ − 517
$tpl->tpl_strings['SITE_DESC'] = 'This website is experiencing a serious error and cannot load.';
+ − 518
$tpl->tpl_strings['COPYRIGHT'] = 'Unable to retrieve copyright information';
+ − 519
$tpl->tpl_strings['PAGE_NAME'] = $t;
+ − 520
$tpl->header();
+ − 521
echo $p;
+ − 522
$tpl->footer();
+ − 523
exit;
+ − 524
}
+ − 525
76
+ − 526
/**
+ − 527
* Prints out the categorization box found on most regular pages. Doesn't take or return anything, but assumes that the page information is already set in $paths.
+ − 528
*/
+ − 529
+ − 530
/*
+ − 531
function show_category_info()
+ − 532
{
1
+ − 533
global $db, $session, $paths, $template, $plugins; // Common objects
+ − 534
dc_here('functions: showing category info');
76
+ − 535
// if($template->no_headers && !strpos($_SERVER['REQUEST_URI'], 'ajax.php')) return '';
+ − 536
if ( $paths->namespace == 'Category' )
1
+ − 537
{
+ − 538
$q = $db->sql_query('SELECT page_id,namespace FROM '.table_prefix.'categories WHERE category_id=\''.$paths->cpage['urlname_nons'].'\' AND namespace=\'Category\' ORDER BY page_id;');
+ − 539
if(!$q) $db->_die('The category information could not be selected.');
+ − 540
$ticker = -1;
+ − 541
echo '<h3>Subcategories</h3>';
+ − 542
if($db->numrows() < 1) echo '<p>There are no subcategories in this category.</p>';
+ − 543
echo '<table border="0" cellspacing="1" cellpadding="4">';
+ − 544
while($row = $db->fetchrow())
+ − 545
{
76
+ − 546
$ticker++;
+ − 547
if ( $ticker == 3 )
+ − 548
{
+ − 549
$ticker = 0;
+ − 550
}
+ − 551
if ( $ticker == 0 )
+ − 552
{
+ − 553
echo '<tr>';
+ − 554
}
+ − 555
echo '<td style="width: 200px;"><a href="' . makeUrlNS($row['namespace'], $row['page_id']) . '">' . htmlspecialchars($paths->pages[$paths->nslist[$row['namespace']].$row['page_id']]['name']) . '</a></td>';
+ − 556
if ( $ticker == 2 )
+ − 557
{
+ − 558
echo '</tr>';
+ − 559
}
1
+ − 560
}
+ − 561
$db->free_result();
+ − 562
if($ticker) echo '</tr>';
+ − 563
echo '</table>';
76
+ − 564
1
+ − 565
$q = $db->sql_query('SELECT page_id,namespace FROM '.table_prefix.'categories WHERE category_id=\''.$paths->cpage['urlname_nons'].'\' AND namespace!=\'Category\' ORDER BY page_id;');
76
+ − 566
if ( !$q )
+ − 567
{
+ − 568
$db->_die('The category information could not be selected.');
+ − 569
}
1
+ − 570
$ticker = -1;
+ − 571
echo '<h3>Pages</h3>';
76
+ − 572
if ( $db->numrows() < 1 )
+ − 573
{
+ − 574
echo '<p>There are no pages in this category.</p>';
+ − 575
}
1
+ − 576
echo '<table border="0" cellspacing="1" cellpadding="4">';
+ − 577
while($row = $db->fetchrow())
+ − 578
{
76
+ − 579
$ticker += ( $ticker == 3 ) ? -3 : 1;
+ − 580
if ( $ticker == 0 )
+ − 581
{
+ − 582
echo '<tr>';
+ − 583
}
+ − 584
echo '<td style="width: 200px;"><a href="'.makeUrlNS($row['namespace'], $row['page_id']).'">'.htmlspecialchars($paths->pages[$paths->nslist[$row['namespace']].$row['page_id']]['name']).'</a></td>';
+ − 585
if ( $ticker == 2 )
+ − 586
{
+ − 587
echo '</tr>';
+ − 588
}
1
+ − 589
}
+ − 590
$db->free_result();
+ − 591
if($ticker) echo '</tr>';
+ − 592
echo '</table><br /><br />';
+ − 593
}
+ − 594
$q = $db->sql_query('SELECT category_id FROM '.table_prefix.'categories WHERE page_id=\''.$paths->cpage['urlname_nons'].'\' AND namespace=\''.$paths->namespace.'\'');
+ − 595
if(!$q) $db->_die('The error seems to have occurred during selection of category data.');
+ − 596
if($db->numrows() > 0) {
+ − 597
echo '<div class="mdg-comment" style="margin-left: 0;">Categories: ';
+ − 598
$i=0;
+ − 599
while($r = $db->fetchrow())
+ − 600
{
+ − 601
if($i>0) echo ', ';
+ − 602
$i++;
+ − 603
echo '<a href="'.makeUrlNS('Category', $r['category_id']).'">'.$paths->pages[$paths->nslist['Category'].$r['category_id']]['name'].'</a>';
+ − 604
}
+ − 605
if( ( $paths->wiki_mode && !$paths->page_protected ) || ( $session->get_permissions('edit_cat') && $session->get_permissions('even_when_protected') ) ) echo ' [ <a href="'.makeUrl($paths->page, 'do=catedit', true).'" onclick="ajaxCatEdit(); return false;">edit categorization</a> ]</div>';
76
+ − 606
}
+ − 607
else
+ − 608
{
1
+ − 609
echo '<div class="mdg-comment" style="margin-left: 0;">Categories: ';
+ − 610
echo '(Uncategorized)';
+ − 611
if( ( $paths->wiki_mode && !$paths->page_protected ) || ( $session->get_permissions('edit_cat') && $session->get_permissions('even_when_protected') ) ) echo ' [ <a href="'.makeUrl($paths->page, 'do=catedit', true).'" onclick="ajaxCatEdit(); return false;">edit categorization</a> ]</div>';
+ − 612
else echo '</div>';
+ − 613
}
+ − 614
$db->free_result();
+ − 615
}
76
+ − 616
*/
+ − 617
+ − 618
function show_category_info()
+ − 619
{
+ − 620
global $db, $session, $paths, $template, $plugins; // Common objects
+ − 621
+ − 622
if ( $paths->namespace == 'Category' )
+ − 623
{
+ − 624
// Show member pages and subcategories
+ − 625
$q = $db->sql_query('SELECT p.urlname, p.namespace, p.name, p.namespace=\'Category\' AS is_category FROM '.table_prefix.'categories AS c
+ − 626
LEFT JOIN '.table_prefix.'pages AS p
+ − 627
ON ( p.urlname = c.page_id AND p.namespace = c.namespace )
+ − 628
WHERE c.category_id=\'' . $db->escape($paths->cpage['urlname_nons']) . '\'
+ − 629
ORDER BY is_category DESC, p.name ASC;');
+ − 630
if ( !$q )
+ − 631
{
+ − 632
$db->_die();
+ − 633
}
+ − 634
echo '<h3>Subcategories</h3>';
+ − 635
echo '<div class="tblholder">';
+ − 636
echo '<table border="0" cellspacing="1" cellpadding="4">';
+ − 637
echo '<tr>';
+ − 638
$ticker = 0;
+ − 639
$counter = 0;
+ − 640
$switched = false;
+ − 641
$class = 'row1';
+ − 642
while ( $row = $db->fetchrow() )
+ − 643
{
+ − 644
if ( $row['is_category'] == 0 && !$switched )
+ − 645
{
+ − 646
if ( $counter > 0 )
+ − 647
{
+ − 648
// Fill-in
+ − 649
while ( $ticker < 3 )
+ − 650
{
+ − 651
$ticker++;
+ − 652
echo '<td class="' . $class . '" style="width: 33.3%;"></td>';
+ − 653
}
+ − 654
}
+ − 655
else
+ − 656
{
+ − 657
echo '<td class="' . $class . '">No subcategories.</td>';
+ − 658
}
+ − 659
echo '</tr></table></div>' . "\n\n";
+ − 660
echo '<h3>Pages</h3>';
+ − 661
echo '<div class="tblholder">';
+ − 662
echo '<table border="0" cellspacing="1" cellpadding="4">';
+ − 663
echo '<tr>';
+ − 664
$counter = 0;
+ − 665
$ticker = 0;
+ − 666
$switched = true;
+ − 667
}
+ − 668
$counter++;
+ − 669
$ticker++;
+ − 670
if ( $ticker == 3 )
+ − 671
{
+ − 672
echo '</tr><tr>';
+ − 673
$ticker = 0;
+ − 674
$class = ( $class == 'row3' ) ? 'row1' : 'row3';
+ − 675
}
+ − 676
echo "<td class=\"{$class}\" style=\"width: 33.3%;\">"; // " to workaround stupid jEdit bug
+ − 677
+ − 678
$link = makeUrlNS($row['namespace'], sanitize_page_id($row['urlname']));
+ − 679
echo '<a href="' . $link . '"';
+ − 680
$key = $paths->nslist[$row['namespace']] . sanitize_page_id($row['urlname']);
+ − 681
if ( !isPage( $key ) )
+ − 682
{
+ − 683
echo ' class="wikilink-nonexistent"';
+ − 684
}
+ − 685
echo '>';
+ − 686
$title = get_page_title_ns($row['urlname'], $row['namespace']);
+ − 687
echo htmlspecialchars($title);
+ − 688
echo '</a>';
+ − 689
+ − 690
echo "</td>";
+ − 691
}
+ − 692
if ( !$switched )
+ − 693
{
+ − 694
if ( $counter > 0 )
+ − 695
{
+ − 696
// Fill-in
+ − 697
while ( $ticker < 3 )
+ − 698
{
+ − 699
$ticker++;
+ − 700
echo '<td class="' . $class . '" style="width: 33.3%;"></td>';
+ − 701
}
+ − 702
}
+ − 703
else
+ − 704
{
+ − 705
echo '<td class="' . $class . '">No subcategories.</td>';
+ − 706
}
+ − 707
echo '</tr></table></div>' . "\n\n";
+ − 708
echo '<h3>Pages</h3>';
+ − 709
echo '<div class="tblholder">';
+ − 710
echo '<table border="0" cellspacing="1" cellpadding="4">';
+ − 711
echo '<tr>';
+ − 712
$counter = 0;
+ − 713
$ticker = 0;
+ − 714
$switched = true;
+ − 715
}
+ − 716
if ( $counter > 0 )
+ − 717
{
+ − 718
// Fill-in
+ − 719
while ( $ticker < 3 )
+ − 720
{
+ − 721
$ticker++;
+ − 722
echo '<td class="' . $class . '" style="width: 33.3%;"></td>';
+ − 723
}
+ − 724
}
+ − 725
else
+ − 726
{
+ − 727
echo '<td class="' . $class . '">No pages in this category.</td>';
+ − 728
}
+ − 729
echo '</tr></table></div>' . "\n\n";
+ − 730
}
+ − 731
+ − 732
if ( $paths->namespace != 'Special' && $paths->namespace != 'Admin' )
+ − 733
{
+ − 734
echo '<div class="mdg-comment" style="margin: 10px 0 0 0;">';
80
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 735
echo '<div style="float: right;">';
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 736
echo '(<a href="#" onclick="ajaxCatToTag(); return false;">show page tags</a>)';
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 737
echo '</div>';
76
+ − 738
echo '<div id="mdgCatBox">Categories: ';
+ − 739
+ − 740
$where = '( c.page_id=\'' . $db->escape($paths->cpage['urlname_nons']) . '\' AND c.namespace=\'' . $db->escape($paths->namespace) . '\' )';
+ − 741
$prefix = table_prefix;
+ − 742
$sql = <<<EOF
+ − 743
SELECT c.category_id FROM {$prefix}categories AS c
+ − 744
LEFT JOIN {$prefix}pages AS p
+ − 745
ON ( ( p.urlname = c.page_id AND p.namespace = c.namespace ) OR ( p.urlname IS NULL AND p.namespace IS NULL ) )
+ − 746
WHERE $where
+ − 747
ORDER BY p.name ASC, c.page_id ASC;
+ − 748
EOF;
+ − 749
$q = $db->sql_query($sql);
+ − 750
if ( !$q )
+ − 751
$db->_die();
+ − 752
+ − 753
if ( $row = $db->fetchrow() )
+ − 754
{
+ − 755
$list = array();
+ − 756
do
+ − 757
{
+ − 758
$cid = sanitize_page_id($row['category_id']);
+ − 759
$title = get_page_title_ns($cid, 'Category');
+ − 760
$link = makeUrlNS('Category', $cid);
+ − 761
$list[] = '<a href="' . $link . '">' . htmlspecialchars($title) . '</a>';
+ − 762
}
+ − 763
while ( $row = $db->fetchrow() );
+ − 764
echo implode(', ', $list);
+ − 765
}
+ − 766
else
+ − 767
{
+ − 768
echo '(Uncategorized)';
+ − 769
}
+ − 770
+ − 771
$can_edit = ( $session->get_permissions('edit_cat') && ( !$paths->page_protected || $session->get_permissions('even_when_protected') ) );
+ − 772
if ( $can_edit )
+ − 773
{
+ − 774
$edit_link = '<a href="' . makeUrl($paths->page, 'do=catedit', true) . '" onclick="ajaxCatEdit(); return false;">edit categorization</a>';
+ − 775
echo ' [ ' . $edit_link . ' ]';
+ − 776
}
+ − 777
+ − 778
echo '</div></div>';
+ − 779
+ − 780
}
+ − 781
+ − 782
}
+ − 783
+ − 784
/**
+ − 785
* Prints out the file information box seen on File: pages. Doesn't take or return anything, but assumes that the page information is already set in $paths, and expects $paths->namespace to be File.
+ − 786
*/
1
+ − 787
+ − 788
function show_file_info()
+ − 789
{
+ − 790
global $db, $session, $paths, $template, $plugins; // Common objects
+ − 791
if($paths->namespace != 'File') return null; // Prevent unnecessary work
+ − 792
$selfn = $paths->cpage['urlname_nons']; // substr($paths->page, strlen($paths->nslist['File']), strlen($paths->cpage));
+ − 793
if(substr($paths->cpage['name'], 0, strlen($paths->nslist['File']))==$paths->nslist['File']) $selfn = substr($paths->cpage['urlname_nons'], strlen($paths->nslist['File']), strlen($paths->cpage['urlname_nons']));
+ − 794
$q = $db->sql_query('SELECT mimetype,time_id,size FROM '.table_prefix.'files WHERE page_id=\''.$selfn.'\' ORDER BY time_id DESC;');
+ − 795
if(!$q) $db->_die('The file type could not be fetched.');
+ − 796
if($db->numrows() < 1) { echo '<div class="mdg-comment" style="margin-left: 0;"><h3>Uploaded file</h3><p>There are no files uploaded with this name yet. <a href="'.makeUrlNS('Special', 'UploadFile/'.$paths->cpage['urlname_nons']).'">Upload a file...</a></p></div><br />'; return; }
+ − 797
$r = $db->fetchrow();
+ − 798
$mimetype = $r['mimetype'];
+ − 799
$datestring = date('F d, Y h:i a', (int)$r['time_id']);
+ − 800
echo '<div class="mdg-comment" style="margin-left: 0;"><p><h3>Uploaded file</h3></p><p>Type: '.$r['mimetype'].'<br />Size: ';
+ − 801
$fs = $r['size'];
+ − 802
echo $fs.' bytes';
+ − 803
$fs = (int)$fs;
+ − 804
if($fs >= 1048576)
+ − 805
{
+ − 806
$fs = round($fs / 1048576, 1);
+ − 807
echo ' ('.$fs.' MB)';
+ − 808
} elseif($fs >= 1024) {
+ − 809
$fs = round($fs / 1024, 1);
+ − 810
echo ' ('.$fs.' KB)';
+ − 811
}
+ − 812
echo '<br />Uploaded: '.$datestring.'</p>';
+ − 813
if(substr($mimetype, 0, 6)!='image/' && ( substr($mimetype, 0, 5) != 'text/' || $mimetype == 'text/html' || $mimetype == 'text/javascript' ))
+ − 814
{
+ − 815
echo '<div class="warning-box">This file type may contain viruses or other code that could harm your computer. You should exercise caution if you download it.</div>';
+ − 816
}
+ − 817
if(substr($mimetype, 0, 6)=='image/')
+ − 818
{
+ − 819
echo '<p><a href="'.makeUrlNS('Special', 'DownloadFile'.'/'.$selfn).'"><img style="border: 0;" alt="'.$paths->page.'" src="'.makeUrlNS('Special', 'DownloadFile'.'/'.$selfn.htmlspecialchars(urlSeparator).'preview').'" /></a></p>';
+ − 820
}
+ − 821
echo '<p><a href="'.makeUrlNS('Special', 'DownloadFile'.'/'.$selfn.'/'.$r['time_id'].htmlspecialchars(urlSeparator).'download').'">Download this file</a>';
+ − 822
if(!$paths->page_protected && ( $paths->wiki_mode || $session->get_permissions('upload_new_version') ))
+ − 823
{
+ − 824
echo ' | <a href="'.makeUrlNS('Special', 'UploadFile'.'/'.$selfn).'">Upload new version</a>';
+ − 825
}
+ − 826
echo '</p>';
+ − 827
if($db->numrows() > 1)
+ − 828
{
+ − 829
echo '<h3>File history</h3><p>';
+ − 830
while($r = $db->fetchrow())
+ − 831
{
+ − 832
echo '(<a href="'.makeUrlNS('Special', 'DownloadFile'.'/'.$selfn.'/'.$r['time_id'].htmlspecialchars(urlSeparator).'download').'">this ver</a>) ';
+ − 833
if($session->get_permissions('history_rollback'))
+ − 834
echo ' (<a href="#" onclick="ajaxRollback(\''.$r['time_id'].'\'); return false;">revert</a>) ';
+ − 835
$mimetype = $r['mimetype'];
+ − 836
$datestring = date('F d, Y h:i a', (int)$r['time_id']);
+ − 837
echo $datestring.': '.$r['mimetype'].', ';
+ − 838
$fs = $r['size'];
+ − 839
$fs = (int)$fs;
+ − 840
if($fs >= 1048576)
+ − 841
{
+ − 842
$fs = round($fs / 1048576, 1);
+ − 843
echo ' '.$fs.' MB';
+ − 844
} elseif($fs >= 1024) {
+ − 845
$fs = round($fs / 1024, 1);
+ − 846
echo ' '.$fs.' KB';
+ − 847
} else {
+ − 848
echo ' '.$fs.' bytes';
+ − 849
}
+ − 850
echo '<br />';
+ − 851
}
+ − 852
echo '</p>';
+ − 853
}
+ − 854
$db->free_result();
+ − 855
echo '</div><br />';
+ − 856
}
+ − 857
76
+ − 858
/**
+ − 859
* Shows header information on the current page. Currently this is only the delete-vote feature. Doesn't take or return anything, but assumes that the page information is already set in $paths.
+ − 860
*/
+ − 861
1
+ − 862
function display_page_headers()
+ − 863
{
+ − 864
global $db, $session, $paths, $template, $plugins; // Common objects
+ − 865
if($session->get_permissions('vote_reset') && $paths->cpage['delvotes'] > 0)
+ − 866
{
+ − 867
$hr = implode(', ', explode('|', $paths->cpage['delvote_ips']));
+ − 868
$is = 'is';
+ − 869
$s = '';
+ − 870
$s2 = 's';
+ − 871
if ( $paths->cpage['delvotes'] > 1)
+ − 872
{
+ − 873
$is = 'are';
+ − 874
$s = 's';
+ − 875
$s2 = '';
+ − 876
}
+ − 877
echo '<div class="info-box" style="margin-left: 0; margin-top: 5px;" id="mdgDeleteVoteNoticeBox">
+ − 878
<b>Notice:</b> There '.$is.' '.$paths->cpage['delvotes'].' user'.$s.' that think'.$s2.' this page should be deleted.<br />
+ − 879
<b>Users that voted:</b> ' . $hr . '<br />
+ − 880
<a href="'.makeUrl($paths->page, 'do=deletepage').'" onclick="ajaxDeletePage(); return false;">Delete page</a> | <a href="'.makeUrl($paths->page, 'do=resetvotes').'" onclick="ajaxResetDelVotes(); return false;">Reset votes</a>
+ − 881
</div>';
+ − 882
}
+ − 883
}
+ − 884
76
+ − 885
/**
+ − 886
* Displays page footer information including file and category info. This also has the send_page_footers hook. Doesn't take or return anything, but assumes that the page information is already set in $paths.
+ − 887
*/
+ − 888
1
+ − 889
function display_page_footers()
+ − 890
{
+ − 891
global $db, $session, $paths, $template, $plugins; // Common objects
+ − 892
if(isset($_GET['nofooters'])) return;
+ − 893
$code = $plugins->setHook('send_page_footers');
+ − 894
foreach ( $code as $cmd )
+ − 895
{
+ − 896
eval($cmd);
+ − 897
}
+ − 898
show_file_info();
+ − 899
show_category_info();
+ − 900
}
+ − 901
76
+ − 902
/**
+ − 903
* Deprecated, do not use.
+ − 904
*/
+ − 905
1
+ − 906
function password_prompt($id = false)
+ − 907
{
+ − 908
global $db, $session, $paths, $template, $plugins; // Common objects
+ − 909
if(!$id) $id = $paths->page;
+ − 910
if(isset($paths->pages[$id]['password']) && strlen($paths->pages[$id]['password']) == 40 && !isset($_REQUEST['pagepass']))
+ − 911
{
+ − 912
die_friendly('Password required', '<p>You must supply a password to access this page.</p><form action="'.makeUrl($paths->pages[$id]['urlname']).'" method="post"><p>Password: <input name="pagepass" type="password" /></p><p><input type="submit" value="Submit" /></p>');
+ − 913
} elseif(isset($_REQUEST['pagepass'])) {
+ − 914
$p = (preg_match('#^([a-f0-9]*){40}$#', $_REQUEST['pagepass'])) ? $_REQUEST['pagepass'] : sha1($_REQUEST['pagepass']);
+ − 915
if($p != $paths->pages[$id]['password']) die_friendly('Password required', '<p style="color: red;">The password you entered is incorrect.</p><form action="'.makeUrl($paths->page).'" method="post"><p>Password: <input name="pagepass" type="password" /></p><p><input type="submit" value="Submit" /></p>');
+ − 916
}
+ − 917
}
+ − 918
76
+ − 919
/**
+ − 920
* Some sort of primitive hex converter from back in the day. Deprecated, do not use.
+ − 921
* @param string Text to encode
+ − 922
* @return string
+ − 923
*/
+ − 924
1
+ − 925
function str_hex($string){
+ − 926
$hex='';
+ − 927
for ($i=0; $i < strlen($string); $i++){
+ − 928
$hex .= ' '.dechex(ord($string[$i]));
+ − 929
}
+ − 930
return substr($hex, 1, strlen($hex));
+ − 931
}
+ − 932
76
+ − 933
/**
+ − 934
* Essentially an return code reader for a socket. Don't use this unless you're writing mail code and smtp_send_email doesn't cut it. Ported from phpBB's smtp.php.
+ − 935
* @param socket A socket resource
+ − 936
* @param string The expected response from the server, this needs to be exactly three characters.
+ − 937
*/
+ − 938
+ − 939
function smtp_get_response($socket, $response, $line = __LINE__)
1
+ − 940
{
76
+ − 941
$server_response = '';
+ − 942
while (substr($server_response, 3, 1) != ' ')
+ − 943
{
+ − 944
if (!($server_response = fgets($socket, 256)))
+ − 945
{
1
+ − 946
die_friendly('SMTP Error', "<p>Couldn't get mail server response codes</p>");
76
+ − 947
}
+ − 948
}
1
+ − 949
76
+ − 950
if (!(substr($server_response, 0, 3) == $response))
+ − 951
{
1
+ − 952
die_friendly('SMTP Error', "<p>Ran into problems sending mail. Response: $server_response</p>");
76
+ − 953
}
1
+ − 954
}
+ − 955
76
+ − 956
/**
+ − 957
* Wrapper for smtp_send_email_core that takes the sender as the fourth parameter instead of additional headers.
+ − 958
* @param string E-mail address to send to
+ − 959
* @param string Subject line
+ − 960
* @param string The body of the message
+ − 961
* @param string Address of the sender
+ − 962
*/
+ − 963
1
+ − 964
function smtp_send_email($to, $subject, $message, $from)
+ − 965
{
+ − 966
return smtp_send_email_core($to, $subject, $message, "From: <$from>\n");
+ − 967
}
+ − 968
76
+ − 969
/**
+ − 970
* Replacement or substitute for PHP's mail() builtin function.
+ − 971
* @param string E-mail address to send to
+ − 972
* @param string Subject line
+ − 973
* @param string The body of the message
+ − 974
* @param string Message headers, separated by a single newline ("\n")
+ − 975
* @copyright (C) phpBB Group
+ − 976
* @license GPL
+ − 977
*/
+ − 978
1
+ − 979
function smtp_send_email_core($mail_to, $subject, $message, $headers = '')
+ − 980
{
76
+ − 981
// Fix any bare linefeeds in the message to make it RFC821 Compliant.
+ − 982
$message = preg_replace("#(?<!\r)\n#si", "\r\n", $message);
1
+ − 983
76
+ − 984
if ($headers != '')
+ − 985
{
+ − 986
if (is_array($headers))
+ − 987
{
+ − 988
if (sizeof($headers) > 1)
+ − 989
{
+ − 990
$headers = join("\n", $headers);
+ − 991
}
+ − 992
else
+ − 993
{
+ − 994
$headers = $headers[0];
+ − 995
}
+ − 996
}
+ − 997
$headers = chop($headers);
1
+ − 998
76
+ − 999
// Make sure there are no bare linefeeds in the headers
+ − 1000
$headers = preg_replace('#(?<!\r)\n#si', "\r\n", $headers);
1
+ − 1001
76
+ − 1002
// Ok this is rather confusing all things considered,
+ − 1003
// but we have to grab bcc and cc headers and treat them differently
+ − 1004
// Something we really didn't take into consideration originally
+ − 1005
$header_array = explode("\r\n", $headers);
+ − 1006
@reset($header_array);
1
+ − 1007
76
+ − 1008
$headers = '';
+ − 1009
while(list(, $header) = each($header_array))
+ − 1010
{
+ − 1011
if (preg_match('#^cc:#si', $header))
+ − 1012
{
+ − 1013
$cc = preg_replace('#^cc:(.*)#si', '\1', $header);
+ − 1014
}
+ − 1015
else if (preg_match('#^bcc:#si', $header))
+ − 1016
{
+ − 1017
$bcc = preg_replace('#^bcc:(.*)#si', '\1', $header);
+ − 1018
$header = '';
+ − 1019
}
+ − 1020
$headers .= ($header != '') ? $header . "\r\n" : '';
+ − 1021
}
1
+ − 1022
76
+ − 1023
$headers = chop($headers);
+ − 1024
$cc = explode(', ', $cc);
+ − 1025
$bcc = explode(', ', $bcc);
+ − 1026
}
1
+ − 1027
76
+ − 1028
if (trim($subject) == '')
+ − 1029
{
+ − 1030
die_friendly(GENERAL_ERROR, "No email Subject specified");
+ − 1031
}
1
+ − 1032
76
+ − 1033
if (trim($message) == '')
+ − 1034
{
+ − 1035
die_friendly(GENERAL_ERROR, "Email message was blank");
+ − 1036
}
+ − 1037
1
+ − 1038
// setup SMTP
+ − 1039
$host = getConfig('smtp_server');
+ − 1040
if ( empty($host) )
+ − 1041
return 'No smtp_host in config';
+ − 1042
if ( strstr($host, ':' ) )
+ − 1043
{
+ − 1044
$n = explode(':', $host);
+ − 1045
$smtp_host = $n[0];
+ − 1046
$port = intval($n[1]);
+ − 1047
}
+ − 1048
else
+ − 1049
{
+ − 1050
$smtp_host = $host;
+ − 1051
$port = 25;
+ − 1052
}
76
+ − 1053
1
+ − 1054
$smtp_user = getConfig('smtp_user');
+ − 1055
$smtp_pass = getConfig('smtp_password');
+ − 1056
76
+ − 1057
// Ok we have error checked as much as we can to this point let's get on
+ − 1058
// it already.
+ − 1059
if( !$socket = @fsockopen($smtp_host, $port, $errno, $errstr, 20) )
+ − 1060
{
+ − 1061
die_friendly(GENERAL_ERROR, "Could not connect to smtp host : $errno : $errstr");
+ − 1062
}
+ − 1063
+ − 1064
// Wait for reply
+ − 1065
smtp_get_response($socket, "220", __LINE__);
1
+ − 1066
76
+ − 1067
// Do we want to use AUTH?, send RFC2554 EHLO, else send RFC821 HELO
+ − 1068
// This improved as provided by SirSir to accomodate
+ − 1069
if( !empty($smtp_user) && !empty($smtp_pass) )
+ − 1070
{
+ − 1071
enano_fputs($socket, "EHLO " . $smtp_host . "\r\n");
+ − 1072
smtp_get_response($socket, "250", __LINE__);
1
+ − 1073
76
+ − 1074
enano_fputs($socket, "AUTH LOGIN\r\n");
+ − 1075
smtp_get_response($socket, "334", __LINE__);
1
+ − 1076
76
+ − 1077
enano_fputs($socket, base64_encode($smtp_user) . "\r\n");
+ − 1078
smtp_get_response($socket, "334", __LINE__);
1
+ − 1079
76
+ − 1080
enano_fputs($socket, base64_encode($smtp_pass) . "\r\n");
+ − 1081
smtp_get_response($socket, "235", __LINE__);
+ − 1082
}
+ − 1083
else
+ − 1084
{
+ − 1085
enano_fputs($socket, "HELO " . $smtp_host . "\r\n");
+ − 1086
smtp_get_response($socket, "250", __LINE__);
+ − 1087
}
1
+ − 1088
76
+ − 1089
// From this point onward most server response codes should be 250
+ − 1090
// Specify who the mail is from....
+ − 1091
enano_fputs($socket, "MAIL FROM: <" . getConfig('contact_email') . ">\r\n");
+ − 1092
smtp_get_response($socket, "250", __LINE__);
1
+ − 1093
76
+ − 1094
// Specify each user to send to and build to header.
+ − 1095
$to_header = '';
1
+ − 1096
76
+ − 1097
// Add an additional bit of error checking to the To field.
+ − 1098
$mail_to = (trim($mail_to) == '') ? 'Undisclosed-recipients:;' : trim($mail_to);
+ − 1099
if (preg_match('#[^ ]+\@[^ ]+#', $mail_to))
+ − 1100
{
+ − 1101
enano_fputs($socket, "RCPT TO: <$mail_to>\r\n");
+ − 1102
smtp_get_response($socket, "250", __LINE__);
+ − 1103
}
1
+ − 1104
76
+ − 1105
// Ok now do the CC and BCC fields...
+ − 1106
@reset($bcc);
+ − 1107
while(list(, $bcc_address) = each($bcc))
+ − 1108
{
+ − 1109
// Add an additional bit of error checking to bcc header...
+ − 1110
$bcc_address = trim($bcc_address);
+ − 1111
if (preg_match('#[^ ]+\@[^ ]+#', $bcc_address))
+ − 1112
{
+ − 1113
enano_fputs($socket, "RCPT TO: <$bcc_address>\r\n");
+ − 1114
smtp_get_response($socket, "250", __LINE__);
+ − 1115
}
+ − 1116
}
1
+ − 1117
76
+ − 1118
@reset($cc);
+ − 1119
while(list(, $cc_address) = each($cc))
+ − 1120
{
+ − 1121
// Add an additional bit of error checking to cc header
+ − 1122
$cc_address = trim($cc_address);
+ − 1123
if (preg_match('#[^ ]+\@[^ ]+#', $cc_address))
+ − 1124
{
+ − 1125
enano_fputs($socket, "RCPT TO: <$cc_address>\r\n");
+ − 1126
smtp_get_response($socket, "250", __LINE__);
+ − 1127
}
+ − 1128
}
1
+ − 1129
76
+ − 1130
// Ok now we tell the server we are ready to start sending data
+ − 1131
enano_fputs($socket, "DATA\r\n");
1
+ − 1132
76
+ − 1133
// This is the last response code we look for until the end of the message.
+ − 1134
smtp_get_response($socket, "354", __LINE__);
1
+ − 1135
76
+ − 1136
// Send the Subject Line...
+ − 1137
enano_fputs($socket, "Subject: $subject\r\n");
1
+ − 1138
76
+ − 1139
// Now the To Header.
+ − 1140
enano_fputs($socket, "To: $mail_to\r\n");
1
+ − 1141
76
+ − 1142
// Now any custom headers....
+ − 1143
enano_fputs($socket, "$headers\r\n\r\n");
1
+ − 1144
76
+ − 1145
// Ok now we are ready for the message...
+ − 1146
enano_fputs($socket, "$message\r\n");
1
+ − 1147
76
+ − 1148
// Ok the all the ingredients are mixed in let's cook this puppy...
+ − 1149
enano_fputs($socket, ".\r\n");
+ − 1150
smtp_get_response($socket, "250", __LINE__);
1
+ − 1151
76
+ − 1152
// Now tell the server we are done and close the socket...
+ − 1153
enano_fputs($socket, "QUIT\r\n");
+ − 1154
fclose($socket);
1
+ − 1155
76
+ − 1156
return TRUE;
1
+ − 1157
}
+ − 1158
+ − 1159
/**
+ − 1160
* Tell which version of Enano we're running.
+ − 1161
* @param bool $long if true, uses English version names (e.g. alpha, beta, release candidate). If false (default) uses abbreviations (1.0a1, 1.0b3, 1.0RC2, etc.)
+ − 1162
* @return string
+ − 1163
*/
+ − 1164
+ − 1165
function enano_version($long = false, $no_nightly = false)
+ − 1166
{
+ − 1167
$r = getConfig('enano_version');
+ − 1168
$rc = ( $long ) ? ' release candidate ' : 'RC';
+ − 1169
$b = ( $long ) ? ' beta ' : 'b';
+ − 1170
$a = ( $long ) ? ' alpha ' : 'a';
+ − 1171
if($v = getConfig('enano_rc_version')) $r .= $rc.$v;
+ − 1172
if($v = getConfig('enano_beta_version')) $r .= $b.$v;
+ − 1173
if($v = getConfig('enano_alpha_version')) $r .= $a.$v;
+ − 1174
if ( defined('ENANO_NIGHTLY') && !$no_nightly )
+ − 1175
{
+ − 1176
$nightlytag = ENANO_NIGHTLY_MONTH . '-' . ENANO_NIGHTLY_DAY . '-' . ENANO_NIGHTLY_YEAR;
+ − 1177
$nightlylong = ' nightly; build date: ' . ENANO_NIGHTLY_MONTH . '-' . ENANO_NIGHTLY_DAY . '-' . ENANO_NIGHTLY_YEAR;
+ − 1178
$r = ( $long ) ? $r . $nightlylong : $r . '-nightly-' . $nightlytag;
+ − 1179
}
+ − 1180
return $r;
+ − 1181
}
+ − 1182
76
+ − 1183
/**
+ − 1184
* What kinda sh** was I thinking when I wrote this. Deprecated.
+ − 1185
*/
+ − 1186
1
+ − 1187
function _dualurlenc($t) {
+ − 1188
return rawurlencode(rawurlencode($t));
+ − 1189
}
76
+ − 1190
+ − 1191
/**
+ − 1192
* Badly named function to send back eval'able Javascript code with an error message. Deprecated, use JSON instead.
+ − 1193
* @param string Message to send
+ − 1194
*/
+ − 1195
1
+ − 1196
function _die($t) {
+ − 1197
$_ob = 'document.getElementById("ajaxEditContainer").innerHTML = unescape(\'' . rawurlencode('' . $t . '') . '\')';
+ − 1198
die($_ob);
+ − 1199
}
+ − 1200
76
+ − 1201
/**
+ − 1202
* Same as _die(), but sends an SQL backtrace with the error message, and doesn't halt execution.
+ − 1203
* @param string Message to send
+ − 1204
*/
+ − 1205
1
+ − 1206
function jsdie($text) {
+ − 1207
global $db, $session, $paths, $template, $plugins; // Common objects
+ − 1208
$text = rawurlencode($text . "\n\nSQL Backtrace:\n" . $db->sql_backtrace());
+ − 1209
echo 'document.getElementById("ajaxEditContainer").innerHTML = unescape(\''.$text.'\');';
+ − 1210
}
+ − 1211
+ − 1212
/**
+ − 1213
* Capitalizes the first letter of a string
+ − 1214
* @param $text string the text to be transformed
+ − 1215
* @return string
+ − 1216
*/
76
+ − 1217
1
+ − 1218
function capitalize_first_letter($text)
+ − 1219
{
+ − 1220
return strtoupper(substr($text, 0, 1)) . substr($text, 1);
+ − 1221
}
+ − 1222
+ − 1223
/**
+ − 1224
* Checks if a value in a bitfield is on or off
+ − 1225
* @param $bitfield int the bit-field value
+ − 1226
* @param $value int the value to switch off
+ − 1227
* @return bool
+ − 1228
*/
76
+ − 1229
1
+ − 1230
function is_bit($bitfield, $value)
+ − 1231
{
+ − 1232
return ( $bitfield & $value ) ? true : false;
+ − 1233
}
+ − 1234
+ − 1235
/**
+ − 1236
* Trims spaces/newlines from the beginning and end of a string
+ − 1237
* @param $text the text to process
+ − 1238
* @return string
+ − 1239
*/
76
+ − 1240
1
+ − 1241
function trim_spaces($text)
+ − 1242
{
+ − 1243
$d = true;
+ − 1244
while($d)
+ − 1245
{
+ − 1246
$c = substr($text, 0, 1);
+ − 1247
$a = substr($text, strlen($text)-1, strlen($text));
+ − 1248
if($c == "\n" || $c == "\r" || $c == "\t" || $c == ' ') $text = substr($text, 1, strlen($text));
+ − 1249
elseif($a == "\n" || $a == "\r" || $a == "\t" || $a == ' ') $text = substr($text, 0, strlen($text)-1);
+ − 1250
else $d = false;
+ − 1251
}
+ − 1252
return $text;
+ − 1253
}
+ − 1254
+ − 1255
/**
+ − 1256
* Enano-ese equivalent of str_split() which is only found in PHP5
+ − 1257
* @param $text string the text to split
+ − 1258
* @param $inc int size of each block
+ − 1259
* @return array
+ − 1260
*/
76
+ − 1261
1
+ − 1262
function enano_str_split($text, $inc = 1)
+ − 1263
{
76
+ − 1264
if($inc < 1)
14
ce6053bb48d8
Security: NUL characters are now stripped from GPC; several code readability standards changes
Dan
diff
changeset
+ − 1265
{
ce6053bb48d8
Security: NUL characters are now stripped from GPC; several code readability standards changes
Dan
diff
changeset
+ − 1266
return false;
ce6053bb48d8
Security: NUL characters are now stripped from GPC; several code readability standards changes
Dan
diff
changeset
+ − 1267
}
ce6053bb48d8
Security: NUL characters are now stripped from GPC; several code readability standards changes
Dan
diff
changeset
+ − 1268
if($inc >= strlen($text))
ce6053bb48d8
Security: NUL characters are now stripped from GPC; several code readability standards changes
Dan
diff
changeset
+ − 1269
{
ce6053bb48d8
Security: NUL characters are now stripped from GPC; several code readability standards changes
Dan
diff
changeset
+ − 1270
return Array($text);
ce6053bb48d8
Security: NUL characters are now stripped from GPC; several code readability standards changes
Dan
diff
changeset
+ − 1271
}
1
+ − 1272
$len = ceil(strlen($text) / $inc);
+ − 1273
$ret = Array();
14
ce6053bb48d8
Security: NUL characters are now stripped from GPC; several code readability standards changes
Dan
diff
changeset
+ − 1274
for ( $i = 0; $i < strlen($text); $i = $i + $inc )
1
+ − 1275
{
+ − 1276
$ret[] = substr($text, $i, $inc);
+ − 1277
}
+ − 1278
return $ret;
+ − 1279
}
+ − 1280
+ − 1281
/**
+ − 1282
* Converts a hexadecimal number to a binary string.
+ − 1283
* @param text string hexadecimal number
+ − 1284
* @return string
+ − 1285
*/
+ − 1286
function hex2bin($text)
+ − 1287
{
+ − 1288
$arr = enano_str_split($text, 2);
+ − 1289
$ret = '';
+ − 1290
for ($i=0; $i<sizeof($arr); $i++)
+ − 1291
{
+ − 1292
$ret .= chr(hexdec($arr[$i]));
+ − 1293
}
+ − 1294
return $ret;
+ − 1295
}
+ − 1296
+ − 1297
/**
+ − 1298
* Generates and/or prints a human-readable backtrace
76
+ − 1299
* @param bool $return - if true, this function returns a string, otherwise returns null and prints the backtrace
1
+ − 1300
* @return mixed
+ − 1301
*/
76
+ − 1302
1
+ − 1303
function enano_debug_print_backtrace($return = false)
+ − 1304
{
+ − 1305
ob_start();
+ − 1306
echo '<pre>';
19
5d003b6c9e89
Added demo mode functionality to various parts of Enano (unlocked only with a plugin) and fixed groups table
Dan
diff
changeset
+ − 1307
if ( function_exists('debug_print_backtrace') )
5d003b6c9e89
Added demo mode functionality to various parts of Enano (unlocked only with a plugin) and fixed groups table
Dan
diff
changeset
+ − 1308
{
5d003b6c9e89
Added demo mode functionality to various parts of Enano (unlocked only with a plugin) and fixed groups table
Dan
diff
changeset
+ − 1309
debug_print_backtrace();
5d003b6c9e89
Added demo mode functionality to various parts of Enano (unlocked only with a plugin) and fixed groups table
Dan
diff
changeset
+ − 1310
}
5d003b6c9e89
Added demo mode functionality to various parts of Enano (unlocked only with a plugin) and fixed groups table
Dan
diff
changeset
+ − 1311
else
5d003b6c9e89
Added demo mode functionality to various parts of Enano (unlocked only with a plugin) and fixed groups table
Dan
diff
changeset
+ − 1312
{
5d003b6c9e89
Added demo mode functionality to various parts of Enano (unlocked only with a plugin) and fixed groups table
Dan
diff
changeset
+ − 1313
echo '<b>Warning:</b> No debug_print_backtrace() support!';
5d003b6c9e89
Added demo mode functionality to various parts of Enano (unlocked only with a plugin) and fixed groups table
Dan
diff
changeset
+ − 1314
}
1
+ − 1315
echo '</pre>';
+ − 1316
$c = ob_get_contents();
+ − 1317
ob_end_clean();
+ − 1318
if($return) return $c;
+ − 1319
else echo $c;
+ − 1320
return null;
+ − 1321
}
+ − 1322
+ − 1323
/**
+ − 1324
* Like rawurlencode(), but encodes all characters
+ − 1325
* @param string $text the text to encode
+ − 1326
* @param optional string $prefix text before each hex character
+ − 1327
* @param optional string $suffix text after each hex character
+ − 1328
* @return string
+ − 1329
*/
76
+ − 1330
1
+ − 1331
function hexencode($text, $prefix = '%', $suffix = '')
+ − 1332
{
+ − 1333
$arr = enano_str_split($text);
+ − 1334
$r = '';
+ − 1335
foreach($arr as $a)
+ − 1336
{
+ − 1337
$nibble = (string)dechex(ord($a));
+ − 1338
if(strlen($nibble) == 1) $nibble = '0' . $nibble;
+ − 1339
$r .= $prefix . $nibble . $suffix;
+ − 1340
}
+ − 1341
return $r;
+ − 1342
}
+ − 1343
+ − 1344
/**
+ − 1345
* Enano-ese equivalent of get_magic_quotes_gpc()
+ − 1346
* @return bool
+ − 1347
*/
76
+ − 1348
1
+ − 1349
function enano_get_magic_quotes_gpc()
+ − 1350
{
+ − 1351
if(function_exists('get_magic_quotes_gpc'))
+ − 1352
{
+ − 1353
return ( get_magic_quotes_gpc() == 1 );
+ − 1354
}
+ − 1355
else
+ − 1356
{
+ − 1357
return ( strtolower(@ini_get('magic_quotes_gpc')) == '1' );
+ − 1358
}
+ − 1359
}
+ − 1360
+ − 1361
/**
+ − 1362
* Recursive stripslashes()
+ − 1363
* @param array
+ − 1364
* @return array
+ − 1365
*/
76
+ − 1366
1
+ − 1367
function stripslashes_recurse($arr)
+ − 1368
{
+ − 1369
foreach($arr as $k => $xxxx)
+ − 1370
{
+ − 1371
$val =& $arr[$k];
+ − 1372
if(is_string($val))
+ − 1373
$val = stripslashes($val);
+ − 1374
elseif(is_array($val))
+ − 1375
$val = stripslashes_recurse($val);
+ − 1376
}
+ − 1377
return $arr;
+ − 1378
}
+ − 1379
+ − 1380
/**
14
ce6053bb48d8
Security: NUL characters are now stripped from GPC; several code readability standards changes
Dan
diff
changeset
+ − 1381
* Recursive function to remove all NUL bytes from a string
ce6053bb48d8
Security: NUL characters are now stripped from GPC; several code readability standards changes
Dan
diff
changeset
+ − 1382
* @param array
ce6053bb48d8
Security: NUL characters are now stripped from GPC; several code readability standards changes
Dan
diff
changeset
+ − 1383
* @return array
ce6053bb48d8
Security: NUL characters are now stripped from GPC; several code readability standards changes
Dan
diff
changeset
+ − 1384
*/
76
+ − 1385
14
ce6053bb48d8
Security: NUL characters are now stripped from GPC; several code readability standards changes
Dan
diff
changeset
+ − 1386
function strip_nul_chars($arr)
ce6053bb48d8
Security: NUL characters are now stripped from GPC; several code readability standards changes
Dan
diff
changeset
+ − 1387
{
ce6053bb48d8
Security: NUL characters are now stripped from GPC; several code readability standards changes
Dan
diff
changeset
+ − 1388
foreach($arr as $k => $xxxx_unused)
ce6053bb48d8
Security: NUL characters are now stripped from GPC; several code readability standards changes
Dan
diff
changeset
+ − 1389
{
ce6053bb48d8
Security: NUL characters are now stripped from GPC; several code readability standards changes
Dan
diff
changeset
+ − 1390
$val =& $arr[$k];
ce6053bb48d8
Security: NUL characters are now stripped from GPC; several code readability standards changes
Dan
diff
changeset
+ − 1391
if(is_string($val))
ce6053bb48d8
Security: NUL characters are now stripped from GPC; several code readability standards changes
Dan
diff
changeset
+ − 1392
$val = str_replace("\000", '', $val);
ce6053bb48d8
Security: NUL characters are now stripped from GPC; several code readability standards changes
Dan
diff
changeset
+ − 1393
elseif(is_array($val))
ce6053bb48d8
Security: NUL characters are now stripped from GPC; several code readability standards changes
Dan
diff
changeset
+ − 1394
$val = strip_nul_chars($val);
ce6053bb48d8
Security: NUL characters are now stripped from GPC; several code readability standards changes
Dan
diff
changeset
+ − 1395
}
ce6053bb48d8
Security: NUL characters are now stripped from GPC; several code readability standards changes
Dan
diff
changeset
+ − 1396
return $arr;
ce6053bb48d8
Security: NUL characters are now stripped from GPC; several code readability standards changes
Dan
diff
changeset
+ − 1397
}
ce6053bb48d8
Security: NUL characters are now stripped from GPC; several code readability standards changes
Dan
diff
changeset
+ − 1398
ce6053bb48d8
Security: NUL characters are now stripped from GPC; several code readability standards changes
Dan
diff
changeset
+ − 1399
/**
76
+ − 1400
* If magic_quotes_gpc is on, calls stripslashes() on everything in $_GET/$_POST/$_COOKIE. Also strips any NUL characters from incoming requests, as these are typically malicious.
14
ce6053bb48d8
Security: NUL characters are now stripped from GPC; several code readability standards changes
Dan
diff
changeset
+ − 1401
* @ignore - this doesn't work too well in my tests
1
+ − 1402
* @todo port version from the PHP manual
+ − 1403
* @return void
+ − 1404
*/
+ − 1405
function strip_magic_quotes_gpc()
+ − 1406
{
+ − 1407
if(enano_get_magic_quotes_gpc())
+ − 1408
{
40
+ − 1409
$_POST = stripslashes_recurse($_POST);
+ − 1410
$_GET = stripslashes_recurse($_GET);
+ − 1411
$_COOKIE = stripslashes_recurse($_COOKIE);
+ − 1412
$_REQUEST = stripslashes_recurse($_REQUEST);
1
+ − 1413
}
40
+ − 1414
$_POST = strip_nul_chars($_POST);
+ − 1415
$_GET = strip_nul_chars($_GET);
+ − 1416
$_COOKIE = strip_nul_chars($_COOKIE);
+ − 1417
$_REQUEST = strip_nul_chars($_REQUEST);
78
4df25dfdde63
Modified Text_Wiki parser to fully support UTF-8 strings; several other UTF-8 fixes, international characters seem to work reasonably well now
Dan
diff
changeset
+ − 1418
$_POST = decode_unicode_array($_POST);
4df25dfdde63
Modified Text_Wiki parser to fully support UTF-8 strings; several other UTF-8 fixes, international characters seem to work reasonably well now
Dan
diff
changeset
+ − 1419
$_GET = decode_unicode_array($_GET);
4df25dfdde63
Modified Text_Wiki parser to fully support UTF-8 strings; several other UTF-8 fixes, international characters seem to work reasonably well now
Dan
diff
changeset
+ − 1420
$_COOKIE = decode_unicode_array($_COOKIE);
4df25dfdde63
Modified Text_Wiki parser to fully support UTF-8 strings; several other UTF-8 fixes, international characters seem to work reasonably well now
Dan
diff
changeset
+ − 1421
$_REQUEST = decode_unicode_array($_REQUEST);
1
+ − 1422
}
+ − 1423
+ − 1424
/**
+ − 1425
* A very basic single-character compression algorithm for binary strings/bitfields
76
+ − 1426
* @param string $bits the text to compress, should be only 1s and 0s
1
+ − 1427
* @return string
+ − 1428
*/
76
+ − 1429
1
+ − 1430
function compress_bitfield($bits)
+ − 1431
{
+ − 1432
$crc32 = crc32($bits);
+ − 1433
$bits .= '0';
+ − 1434
$start_pos = 0;
+ − 1435
$current = substr($bits, 1, 1);
+ − 1436
$last = substr($bits, 0, 1);
+ − 1437
$chunk_size = 1;
+ − 1438
$len = strlen($bits);
+ − 1439
$crc = $len;
+ − 1440
$crcval = 0;
+ − 1441
for ( $i = 1; $i < $len; $i++ )
+ − 1442
{
+ − 1443
$current = substr($bits, $i, 1);
+ − 1444
$last = substr($bits, $i - 1, 1);
+ − 1445
$next = substr($bits, $i + 1, 1);
+ − 1446
// Are we on the last character?
+ − 1447
if($current == $last && $i+1 < $len)
+ − 1448
$chunk_size++;
+ − 1449
else
+ − 1450
{
+ − 1451
if($i+1 == $len && $current == $next)
+ − 1452
{
+ − 1453
// This character completes a chunk
+ − 1454
$chunk_size++;
+ − 1455
$i++;
+ − 1456
$chunk = substr($bits, $start_pos, $chunk_size);
+ − 1457
$chunklen = strlen($chunk);
+ − 1458
$newchunk = $last . '[' . $chunklen . ']';
+ − 1459
$newlen = strlen($newchunk);
+ − 1460
$bits = substr($bits, 0, $start_pos) . $newchunk . substr($bits, $i, $len);
+ − 1461
$chunk_size = 1;
+ − 1462
$i = $start_pos + $newlen;
+ − 1463
$start_pos = $i;
+ − 1464
$len = strlen($bits);
+ − 1465
$crcval = $crcval + $chunklen;
+ − 1466
}
+ − 1467
else
+ − 1468
{
+ − 1469
// Last character completed a chunk
+ − 1470
$chunk = substr($bits, $start_pos, $chunk_size);
+ − 1471
$chunklen = strlen($chunk);
+ − 1472
$newchunk = $last . '[' . $chunklen . '],';
+ − 1473
$newlen = strlen($newchunk);
+ − 1474
$bits = substr($bits, 0, $start_pos) . $newchunk . substr($bits, $i, $len);
+ − 1475
$chunk_size = 1;
+ − 1476
$i = $start_pos + $newlen;
+ − 1477
$start_pos = $i;
+ − 1478
$len = strlen($bits);
+ − 1479
$crcval = $crcval + $chunklen;
+ − 1480
}
+ − 1481
}
+ − 1482
}
+ − 1483
if($crc != $crcval)
+ − 1484
{
+ − 1485
echo __FUNCTION__.'(): ERROR: length check failed, this is a bug in the algorithm<br />Debug info: aiming for a CRC val of '.$crc.', got '.$crcval;
+ − 1486
return false;
+ − 1487
}
+ − 1488
$compressed = 'cbf:len='.$crc.';crc='.dechex($crc32).';data='.$bits.'|end';
+ − 1489
return $compressed;
+ − 1490
}
+ − 1491
+ − 1492
/**
+ − 1493
* Uncompresses a bitfield compressed with compress_bitfield()
+ − 1494
* @param string $bits the compressed bitfield
+ − 1495
* @return string the uncompressed, original (we hope) bitfield OR bool false on error
+ − 1496
*/
76
+ − 1497
1
+ − 1498
function uncompress_bitfield($bits)
+ − 1499
{
+ − 1500
if(substr($bits, 0, 4) != 'cbf:')
+ − 1501
{
+ − 1502
echo __FUNCTION__.'(): ERROR: Invalid stream';
+ − 1503
return false;
+ − 1504
}
+ − 1505
$len = intval(substr($bits, strpos($bits, 'len=')+4, strpos($bits, ';')-strpos($bits, 'len=')-4));
+ − 1506
$crc = substr($bits, strpos($bits, 'crc=')+4, 8);
+ − 1507
$data = substr($bits, strpos($bits, 'data=')+5, strpos($bits, '|end')-strpos($bits, 'data=')-5);
+ − 1508
$data = explode(',', $data);
+ − 1509
foreach($data as $a => $b)
+ − 1510
{
+ − 1511
$d =& $data[$a];
+ − 1512
$char = substr($d, 0, 1);
+ − 1513
$dlen = intval(substr($d, 2, strlen($d)-1));
+ − 1514
$s = '';
+ − 1515
for($i=0;$i<$dlen;$i++,$s.=$char);
+ − 1516
$d = $s;
+ − 1517
unset($s, $dlen, $char);
+ − 1518
}
+ − 1519
$decompressed = implode('', $data);
+ − 1520
$decompressed = substr($decompressed, 0, -1);
+ − 1521
$dcrc = (string)dechex(crc32($decompressed));
+ − 1522
if($dcrc != $crc)
+ − 1523
{
+ − 1524
echo __FUNCTION__.'(): ERROR: CRC check failed<br />debug info:<br />original crc: '.$crc.'<br />decomp\'ed crc: '.$dcrc.'<br />';
+ − 1525
return false;
+ − 1526
}
+ − 1527
return $decompressed;
+ − 1528
}
+ − 1529
+ − 1530
/**
+ − 1531
* Exports a MySQL table into a SQL string.
+ − 1532
* @param string $table The name of the table to export
+ − 1533
* @param bool $structure If true, include a CREATE TABLE command
+ − 1534
* @param bool $data If true, include the contents of the table
+ − 1535
* @param bool $compact If true, omits newlines between parts of SQL statements, use in Enano database exporter
+ − 1536
* @return string
+ − 1537
*/
+ − 1538
+ − 1539
function export_table($table, $structure = true, $data = true, $compact = false)
+ − 1540
{
+ − 1541
global $db, $session, $paths, $template, $plugins; // Common objects
+ − 1542
$struct_keys = '';
+ − 1543
$divider = (!$compact) ? "\n" : "\n";
+ − 1544
$spacer1 = (!$compact) ? "\n" : " ";
+ − 1545
$spacer2 = (!$compact) ? " " : " ";
+ − 1546
$rowspacer = (!$compact) ? "\n " : " ";
+ − 1547
$index_list = Array();
+ − 1548
$cols = $db->sql_query('SHOW COLUMNS IN '.$table.';');
+ − 1549
if(!$cols)
+ − 1550
{
+ − 1551
echo 'export_table(): Error getting column list: '.$db->get_error_text().'<br />';
+ − 1552
return false;
+ − 1553
}
+ − 1554
$col = Array();
+ − 1555
$sqlcol = Array();
+ − 1556
$collist = Array();
+ − 1557
$pri_keys = Array();
+ − 1558
// Using fetchrow_num() here to compensate for MySQL l10n
+ − 1559
while( $row = $db->fetchrow_num() )
+ − 1560
{
+ − 1561
$field =& $row[0];
+ − 1562
$type =& $row[1];
+ − 1563
$null =& $row[2];
+ − 1564
$key =& $row[3];
+ − 1565
$def =& $row[4];
+ − 1566
$extra =& $row[5];
+ − 1567
$col[] = Array(
+ − 1568
'name'=>$field,
+ − 1569
'type'=>$type,
+ − 1570
'null'=>$null,
+ − 1571
'key'=>$key,
+ − 1572
'default'=>$def,
+ − 1573
'extra'=>$extra,
+ − 1574
);
+ − 1575
$collist[] = $field;
+ − 1576
}
76
+ − 1577
1
+ − 1578
if ( $structure )
+ − 1579
{
+ − 1580
$db->sql_query('SET SQL_QUOTE_SHOW_CREATE = 0;');
+ − 1581
$struct = $db->sql_query('SHOW CREATE TABLE '.$table.';');
+ − 1582
if ( !$struct )
+ − 1583
$db->_die();
+ − 1584
$row = $db->fetchrow_num();
+ − 1585
$db->free_result();
+ − 1586
$struct = $row[1];
+ − 1587
$struct = preg_replace("/\n\) ENGINE=(.+)$/", "\n);", $struct);
+ − 1588
unset($row);
+ − 1589
if ( $compact )
+ − 1590
{
+ − 1591
$struct_arr = explode("\n", $struct);
+ − 1592
foreach ( $struct_arr as $i => $leg )
+ − 1593
{
+ − 1594
if ( $i == 0 )
+ − 1595
continue;
+ − 1596
$test = trim($leg);
+ − 1597
if ( empty($test) )
+ − 1598
{
+ − 1599
unset($struct_arr[$i]);
+ − 1600
continue;
+ − 1601
}
+ − 1602
$struct_arr[$i] = preg_replace('/^([\s]*)/', ' ', $leg);
+ − 1603
}
+ − 1604
$struct = implode("", $struct_arr);
+ − 1605
}
+ − 1606
}
76
+ − 1607
1
+ − 1608
// Structuring complete
+ − 1609
if($data)
+ − 1610
{
+ − 1611
$datq = $db->sql_query('SELECT * FROM '.$table.';');
+ − 1612
if(!$datq)
+ − 1613
{
+ − 1614
echo 'export_table(): Error getting column list: '.$db->get_error_text().'<br />';
+ − 1615
return false;
+ − 1616
}
+ − 1617
if($db->numrows() < 1)
+ − 1618
{
+ − 1619
if($structure) return $struct;
+ − 1620
else return '';
+ − 1621
}
+ − 1622
$rowdata = Array();
+ − 1623
$dataqs = Array();
+ − 1624
$insert_strings = Array();
+ − 1625
$z = false;
+ − 1626
while($row = $db->fetchrow_num())
+ − 1627
{
+ − 1628
$z = false;
+ − 1629
foreach($row as $i => $cell)
+ − 1630
{
+ − 1631
$str = mysql_encode_column($cell, $col[$i]['type']);
+ − 1632
$rowdata[] = $str;
+ − 1633
}
+ − 1634
$dataqs2 = implode(",$rowspacer", $dataqs) . ",$rowspacer" . '( ' . implode(', ', $rowdata) . ' )';
+ − 1635
$ins = 'INSERT INTO '.$table.'( '.implode(',', $collist).' ) VALUES' . $dataqs2 . ";";
+ − 1636
if ( strlen( $ins ) > MYSQL_MAX_PACKET_SIZE )
+ − 1637
{
+ − 1638
// We've exceeded the maximum allowed packet size for MySQL - separate this into a different query
+ − 1639
$insert_strings[] = 'INSERT INTO '.$table.'( '.implode(',', $collist).' ) VALUES' . implode(",$rowspacer", $dataqs) . ";";;
+ − 1640
$dataqs = Array('( ' . implode(', ', $rowdata) . ' )');
+ − 1641
$z = true;
+ − 1642
}
+ − 1643
else
+ − 1644
{
+ − 1645
$dataqs[] = '( ' . implode(', ', $rowdata) . ' )';
+ − 1646
}
+ − 1647
$rowdata = Array();
+ − 1648
}
+ − 1649
if ( !$z )
+ − 1650
{
+ − 1651
$insert_strings[] = 'INSERT INTO '.$table.'( '.implode(',', $collist).' ) VALUES' . implode(",$rowspacer", $dataqs) . ";";;
+ − 1652
$dataqs = Array();
+ − 1653
}
+ − 1654
$datstring = implode($divider, $insert_strings);
+ − 1655
}
+ − 1656
if($structure && !$data) return $struct;
+ − 1657
elseif(!$structure && $data) return $datstring;
+ − 1658
elseif($structure && $data) return $struct . $divider . $datstring;
+ − 1659
elseif(!$structure && !$data) return '';
+ − 1660
}
+ − 1661
+ − 1662
/**
+ − 1663
* Encodes a string value for use in an INSERT statement for given column type $type.
+ − 1664
* @access private
+ − 1665
*/
76
+ − 1666
1
+ − 1667
function mysql_encode_column($input, $type)
+ − 1668
{
+ − 1669
global $db, $session, $paths, $template, $plugins; // Common objects
+ − 1670
// Decide whether to quote the string or not
+ − 1671
if(substr($type, 0, 7) == 'varchar' || $type == 'datetime' || $type == 'text' || $type == 'tinytext' || $type == 'smalltext' || $type == 'longtext' || substr($type, 0, 4) == 'char')
+ − 1672
{
+ − 1673
$str = "'" . $db->escape($input) . "'";
+ − 1674
}
+ − 1675
elseif(in_array($type, Array('blob', 'longblob', 'mediumblob', 'smallblob')) || substr($type, 0, 6) == 'binary' || substr($type, 0, 9) == 'varbinary')
+ − 1676
{
+ − 1677
$str = '0x' . hexencode($input, '', '');
+ − 1678
}
+ − 1679
elseif(is_null($input))
+ − 1680
{
+ − 1681
$str = 'NULL';
+ − 1682
}
+ − 1683
else
+ − 1684
{
+ − 1685
$str = (string)$input;
+ − 1686
}
+ − 1687
return $str;
+ − 1688
}
+ − 1689
+ − 1690
/**
+ − 1691
* Creates an associative array defining which file extensions are allowed and which ones aren't
+ − 1692
* @return array keyname will be a file extension, value will be true or false
+ − 1693
*/
+ − 1694
+ − 1695
function fetch_allowed_extensions()
+ − 1696
{
+ − 1697
global $mime_types;
+ − 1698
$bits = getConfig('allowed_mime_types');
+ − 1699
if(!$bits) return Array(false);
+ − 1700
$bits = uncompress_bitfield($bits);
+ − 1701
if(!$bits) return Array(false);
+ − 1702
$bits = enano_str_split($bits, 1);
+ − 1703
$ret = Array();
+ − 1704
$mt = array_keys($mime_types);
+ − 1705
foreach($bits as $i => $b)
+ − 1706
{
+ − 1707
$ret[$mt[$i]] = ( $b == '1' ) ? true : false;
+ − 1708
}
+ − 1709
return $ret;
+ − 1710
}
+ − 1711
+ − 1712
/**
+ − 1713
* Generates a random key suitable for encryption
+ − 1714
* @param int $len the length of the key
+ − 1715
* @return string a BINARY key
+ − 1716
*/
+ − 1717
+ − 1718
function randkey($len = 32)
+ − 1719
{
+ − 1720
$key = '';
+ − 1721
for($i=0;$i<$len;$i++)
+ − 1722
{
+ − 1723
$key .= chr(mt_rand(0, 255));
+ − 1724
}
+ − 1725
return $key;
+ − 1726
}
+ − 1727
+ − 1728
/**
+ − 1729
* Decodes a hex string.
+ − 1730
* @param string $hex The hex code to decode
+ − 1731
* @return string
+ − 1732
*/
+ − 1733
+ − 1734
function hexdecode($hex)
+ − 1735
{
+ − 1736
$hex = enano_str_split($hex, 2);
+ − 1737
$bin_key = '';
+ − 1738
foreach($hex as $nibble)
+ − 1739
{
+ − 1740
$byte = chr(hexdec($nibble));
+ − 1741
$bin_key .= $byte;
+ − 1742
}
+ − 1743
return $bin_key;
+ − 1744
}
+ − 1745
+ − 1746
/**
+ − 1747
* Enano's own (almost) bulletproof HTML sanitizer.
+ − 1748
* @param string $html The input HTML
+ − 1749
* @return string cleaned HTML
+ − 1750
*/
+ − 1751
+ − 1752
function sanitize_html($html, $filter_php = true)
+ − 1753
{
76
+ − 1754
1
+ − 1755
$html = preg_replace('#<([a-z]+)([\s]+)([^>]+?)'.htmlalternatives('javascript:').'(.+?)>(.*?)</\\1>#is', '<\\1\\2\\3javascript:\\59>\\60</\\1>', $html);
+ − 1756
$html = preg_replace('#<([a-z]+)([\s]+)([^>]+?)'.htmlalternatives('javascript:').'(.+?)>#is', '<\\1\\2\\3javascript:\\59>', $html);
76
+ − 1757
1
+ − 1758
if($filter_php)
+ − 1759
$html = str_replace(
+ − 1760
Array('<?php', '<?', '<%', '?>', '%>'),
+ − 1761
Array('<?php', '<?', '<%', '?>', '%>'),
+ − 1762
$html);
76
+ − 1763
1
+ − 1764
$tag_whitelist = array_keys ( setupAttributeWhitelist() );
+ − 1765
if ( !$filter_php )
+ − 1766
$tag_whitelist[] = '?php';
+ − 1767
$len = strlen($html);
+ − 1768
$in_quote = false;
+ − 1769
$quote_char = '';
+ − 1770
$tag_start = 0;
+ − 1771
$tag_name = '';
+ − 1772
$in_tag = false;
+ − 1773
$trk_name = false;
+ − 1774
for ( $i = 0; $i < $len; $i++ )
+ − 1775
{
+ − 1776
$chr = $html{$i};
+ − 1777
$prev = ( $i == 0 ) ? '' : $html{ $i - 1 };
+ − 1778
$next = ( ( $i + 1 ) == $len ) ? '' : $html { $i + 1 };
+ − 1779
if ( $in_quote && $in_tag )
+ − 1780
{
+ − 1781
if ( $quote_char == $chr && $prev != '\\' )
+ − 1782
$in_quote = false;
+ − 1783
}
+ − 1784
elseif ( ( $chr == '"' || $chr == "'" ) && $prev != '\\' && $in_tag )
+ − 1785
{
+ − 1786
$in_quote = true;
+ − 1787
$quote_char = $chr;
+ − 1788
}
+ − 1789
if ( $chr == '<' && !$in_tag && $next != '/' )
76
+ − 1790
{
1
+ − 1791
// start of a tag
+ − 1792
$tag_start = $i;
+ − 1793
$in_tag = true;
+ − 1794
$trk_name = true;
+ − 1795
}
+ − 1796
elseif ( !$in_quote && $in_tag && $chr == '>' )
+ − 1797
{
+ − 1798
$full_tag = substr($html, $tag_start, ( $i - $tag_start ) + 1 );
+ − 1799
$l = strlen($tag_name) + 2;
+ − 1800
$attribs_only = trim( substr($full_tag, $l, ( strlen($full_tag) - $l - 1 ) ) );
76
+ − 1801
1
+ − 1802
// Debugging message
+ − 1803
// echo htmlspecialchars($full_tag) . '<br />';
76
+ − 1804
1
+ − 1805
if ( !in_array($tag_name, $tag_whitelist) )
+ − 1806
{
+ − 1807
// Illegal tag
+ − 1808
//echo $tag_name . ' ';
76
+ − 1809
1
+ − 1810
$s = ( empty($attribs_only) ) ? '' : ' ';
76
+ − 1811
1
+ − 1812
$sanitized = '<' . $tag_name . $s . $attribs_only . '>';
76
+ − 1813
1
+ − 1814
$html = substr($html, 0, $tag_start) . $sanitized . substr($html, $i + 1);
+ − 1815
$html = str_replace('</' . $tag_name . '>', '</' . $tag_name . '>', $html);
+ − 1816
$new_i = $tag_start + strlen($sanitized);
76
+ − 1817
1
+ − 1818
$len = strlen($html);
+ − 1819
$i = $new_i;
76
+ − 1820
1
+ − 1821
$in_tag = false;
+ − 1822
$tag_name = '';
+ − 1823
continue;
+ − 1824
}
+ − 1825
else
+ − 1826
{
+ − 1827
if ( $tag_name == '?php' && !$filter_php )
+ − 1828
continue;
+ − 1829
$f = fixTagAttributes( $attribs_only, $tag_name );
+ − 1830
$s = ( empty($f) ) ? '' : ' ';
76
+ − 1831
1
+ − 1832
$sanitized = '<' . $tag_name . $f . '>';
+ − 1833
$new_i = $tag_start + strlen($sanitized);
76
+ − 1834
1
+ − 1835
$html = substr($html, 0, $tag_start) . $sanitized . substr($html, $i + 1);
+ − 1836
$len = strlen($html);
+ − 1837
$i = $new_i;
76
+ − 1838
1
+ − 1839
$in_tag = false;
+ − 1840
$tag_name = '';
+ − 1841
continue;
+ − 1842
}
+ − 1843
}
+ − 1844
elseif ( $in_tag && $trk_name )
+ − 1845
{
21
663fcf528726
Updated all version numbers back to Banshee; a few preliminary steps towards full UTF-8 support in page URLs
Dan
diff
changeset
+ − 1846
$is_alphabetical = ( strtolower($chr) != strtoupper($chr) || in_array($chr, array('0', '1', '2', '3', '4', '5', '6', '7', '8', '9')) || $chr == '?' || $chr == '!' || $chr == '-' );
1
+ − 1847
if ( $is_alphabetical )
+ − 1848
$tag_name .= $chr;
+ − 1849
else
+ − 1850
{
+ − 1851
$trk_name = false;
+ − 1852
}
+ − 1853
}
76
+ − 1854
1
+ − 1855
}
76
+ − 1856
15
ad5986a53197
Fixed complicated SQL injection vulnerability in URL handler, updated license info for Tigra Tree Menu, and killed one XSS vulnerability
Dan
diff
changeset
+ − 1857
// Vulnerability from ha.ckers.org/xss.html:
ad5986a53197
Fixed complicated SQL injection vulnerability in URL handler, updated license info for Tigra Tree Menu, and killed one XSS vulnerability
Dan
diff
changeset
+ − 1858
// <script src="http://foo.com/xss.js"
ad5986a53197
Fixed complicated SQL injection vulnerability in URL handler, updated license info for Tigra Tree Menu, and killed one XSS vulnerability
Dan
diff
changeset
+ − 1859
// <
ad5986a53197
Fixed complicated SQL injection vulnerability in URL handler, updated license info for Tigra Tree Menu, and killed one XSS vulnerability
Dan
diff
changeset
+ − 1860
// The rule is so specific because everything else will have been filtered by now
ad5986a53197
Fixed complicated SQL injection vulnerability in URL handler, updated license info for Tigra Tree Menu, and killed one XSS vulnerability
Dan
diff
changeset
+ − 1861
$html = preg_replace('/<(script|iframe)(.+?)src=([^>]*)</i', '<\\1\\2src=\\3<', $html);
76
+ − 1862
21
663fcf528726
Updated all version numbers back to Banshee; a few preliminary steps towards full UTF-8 support in page URLs
Dan
diff
changeset
+ − 1863
// Unstrip comments
663fcf528726
Updated all version numbers back to Banshee; a few preliminary steps towards full UTF-8 support in page URLs
Dan
diff
changeset
+ − 1864
$html = preg_replace('/<!--([^>]*?)-->/i', '', $html);
76
+ − 1865
1
+ − 1866
return $html;
76
+ − 1867
1
+ − 1868
}
+ − 1869
32
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1870
/**
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1871
* Using the same parsing code as sanitize_html(), this function adds <litewiki> tags around certain block-level elements
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1872
* @param string $html The input HTML
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1873
* @return string formatted HTML
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1874
*/
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1875
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1876
function wikiformat_process_block($html)
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1877
{
76
+ − 1878
32
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1879
$tok1 = "<litewiki>";
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1880
$tok2 = "</litewiki>";
76
+ − 1881
32
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1882
$block_tags = array('div', 'p', 'table', 'blockquote', 'pre');
76
+ − 1883
32
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1884
$len = strlen($html);
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1885
$in_quote = false;
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1886
$quote_char = '';
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1887
$tag_start = 0;
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1888
$tag_name = '';
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1889
$in_tag = false;
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1890
$trk_name = false;
76
+ − 1891
32
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1892
$diag = 0;
76
+ − 1893
32
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1894
$block_tagname = '';
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1895
$in_blocksec = 0;
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1896
$block_start = 0;
76
+ − 1897
32
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1898
for ( $i = 0; $i < $len; $i++ )
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1899
{
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1900
$chr = $html{$i};
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1901
$prev = ( $i == 0 ) ? '' : $html{ $i - 1 };
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1902
$next = ( ( $i + 1 ) == $len ) ? '' : $html { $i + 1 };
76
+ − 1903
32
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1904
// Are we inside of a quoted section?
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1905
if ( $in_quote && $in_tag )
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1906
{
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1907
if ( $quote_char == $chr && $prev != '\\' )
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1908
$in_quote = false;
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1909
}
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1910
elseif ( ( $chr == '"' || $chr == "'" ) && $prev != '\\' && $in_tag )
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1911
{
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1912
$in_quote = true;
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1913
$quote_char = $chr;
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1914
}
76
+ − 1915
32
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1916
if ( $chr == '<' && !$in_tag && $next == '/' )
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1917
{
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1918
// Iterate through until we've got a tag name
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1919
$tag_name = '';
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1920
$i++;
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1921
while(true)
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1922
{
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1923
$i++;
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1924
// echo $i . ' ';
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1925
$chr = $html{$i};
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1926
$prev = ( $i == 0 ) ? '' : $html{ $i - 1 };
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1927
$next = ( ( $i + 1 ) == $len ) ? '' : $html { $i + 1 };
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1928
$tag_name .= $chr;
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1929
if ( $next == '>' )
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1930
break;
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1931
}
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1932
// echo '<br />';
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1933
if ( in_array($tag_name, $block_tags) )
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1934
{
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1935
if ( $block_tagname == $tag_name )
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1936
{
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1937
$in_blocksec -= 1;
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1938
if ( $in_blocksec == 0 )
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1939
{
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1940
$block_tagname = '';
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1941
$i += 2;
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1942
// echo 'Finished wiki litewiki wraparound calc at pos: ' . $i;
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1943
$full_litewiki = substr($html, $block_start, ( $i - $block_start ));
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1944
$new_text = "{$tok1}{$full_litewiki}{$tok2}";
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1945
$html = substr($html, 0, $block_start) . $new_text . substr($html, $i);
76
+ − 1946
32
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1947
$i += ( strlen($tok1) + strlen($tok2) ) - 1;
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1948
$len = strlen($html);
76
+ − 1949
32
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1950
//die('<pre>' . htmlspecialchars($html) . '</pre>');
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1951
}
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1952
}
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1953
}
76
+ − 1954
32
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1955
$in_tag = false;
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1956
$in_quote = false;
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1957
$tag_name = '';
76
+ − 1958
32
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1959
continue;
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1960
}
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1961
else if ( $chr == '<' && !$in_tag && $next != '/' )
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1962
{
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1963
// start of a tag
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1964
$tag_start = $i;
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1965
$in_tag = true;
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1966
$trk_name = true;
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1967
}
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1968
else if ( !$in_quote && $in_tag && $chr == '>' )
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1969
{
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1970
if ( !in_array($tag_name, $block_tags) )
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1971
{
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1972
// Inline tag - reset and go to the next one
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1973
// echo '<inline ' . $tag_name . '> ';
76
+ − 1974
32
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1975
$in_tag = false;
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1976
$tag_name = '';
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1977
continue;
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1978
}
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1979
else
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1980
{
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1981
// echo '<block: ' . $tag_name . ' @ ' . $i . '><br/>';
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1982
if ( $in_blocksec == 0 )
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1983
{
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1984
//die('Found a starting tag for a block element: ' . $tag_name . ' at pos ' . $tag_start);
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1985
$block_tagname = $tag_name;
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1986
$block_start = $tag_start;
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1987
$in_blocksec++;
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1988
}
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1989
else if ( $block_tagname == $tag_name )
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1990
{
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1991
$in_blocksec++;
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1992
}
76
+ − 1993
32
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1994
$in_tag = false;
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1995
$tag_name = '';
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1996
continue;
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1997
}
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1998
}
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 1999
elseif ( $in_tag && $trk_name )
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 2000
{
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 2001
$is_alphabetical = ( strtolower($chr) != strtoupper($chr) || in_array($chr, array('0', '1', '2', '3', '4', '5', '6', '7', '8', '9')) || $chr == '?' || $chr == '!' || $chr == '-' );
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 2002
if ( $is_alphabetical )
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 2003
$tag_name .= $chr;
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 2004
else
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 2005
{
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 2006
$trk_name = false;
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 2007
}
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 2008
}
76
+ − 2009
32
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 2010
// Tokenization complete
76
+ − 2011
32
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 2012
}
76
+ − 2013
32
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 2014
$regex = '/' . str_replace('/', '\\/', preg_quote($tok2)) . '([\s]*)' . preg_quote($tok1) . '/is';
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 2015
// die(htmlspecialchars($regex));
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 2016
$html = preg_replace($regex, '\\1', $html);
76
+ − 2017
32
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 2018
return $html;
76
+ − 2019
32
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 2020
}
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 2021
1
+ − 2022
function htmlalternatives($string)
+ − 2023
{
+ − 2024
$ret = '';
+ − 2025
for ( $i = 0; $i < strlen($string); $i++ )
+ − 2026
{
+ − 2027
$chr = $string{$i};
+ − 2028
$ch1 = ord($chr);
+ − 2029
$ch2 = dechex($ch1);
+ − 2030
$byte = '(&\\#([0]*){0,7}' . $ch1 . ';|\\\\([0]*){0,7}' . $ch1 . ';|\\\\([0]*){0,7}' . $ch2 . ';|&\\#x([0]*){0,7}' . $ch2 . ';|%([0]*){0,7}' . $ch2 . '|' . preg_quote($chr) . ')';
+ − 2031
$ret .= $byte;
+ − 2032
$ret .= '([\s]){0,2}';
+ − 2033
}
+ − 2034
return $ret;
+ − 2035
}
+ − 2036
+ − 2037
/**
+ − 2038
* Paginates (breaks into multiple pages) a MySQL result resource, which is treated as unbuffered.
+ − 2039
* @param resource The MySQL result resource. This should preferably be an unbuffered query.
+ − 2040
* @param string A template, with variables being named after the column name
+ − 2041
* @param int The number of total results. This should be determined by a second query.
+ − 2042
* @param string sprintf-style formatting string for URLs for result pages. First parameter will be start offset.
+ − 2043
* @param int Optional. Start offset in individual results. Defaults to 0.
+ − 2044
* @param int Optional. The number of results per page. Defualts to 10.
+ − 2045
* @param int Optional. An associative array of functions to call, with key names being column names, and values being function names. Values can also be an array with key 0 being either an object or a string(class name) and key 1 being a [static] method.
+ − 2046
* @param string Optional. The text to be sent before the result list, only if there are any results. Possibly the start of a table.
+ − 2047
* @param string Optional. The text to be sent after the result list, only if there are any results. Possibly the end of a table.
+ − 2048
* @return string
+ − 2049
*/
+ − 2050
+ − 2051
function paginate($q, $tpl_text, $num_results, $result_url, $start = 0, $perpage = 10, $callers = Array(), $header = '', $footer = '')
+ − 2052
{
+ − 2053
global $db, $session, $paths, $template, $plugins; // Common objects
+ − 2054
$parser = $template->makeParserText($tpl_text);
+ − 2055
$num_pages = ceil ( $num_results / $perpage );
+ − 2056
$out = '';
+ − 2057
$i = 0;
+ − 2058
$this_page = ceil ( $start / $perpage );
76
+ − 2059
1
+ − 2060
// Build paginator
+ − 2061
$begin = '<div class="tblholder" style="display: table; margin: 10px 0 0 auto;">
+ − 2062
<table border="0" cellspacing="1" cellpadding="4">
+ − 2063
<tr><th>Page:</th>';
+ − 2064
$block = '<td class="row1" style="text-align: center;">{LINK}</td>';
+ − 2065
$end = '</tr></table></div>';
+ − 2066
$blk = $template->makeParserText($block);
+ − 2067
$inner = '';
+ − 2068
$cls = 'row2';
+ − 2069
if ( $num_pages < 5 )
+ − 2070
{
+ − 2071
for ( $i = 0; $i < $num_pages; $i++ )
+ − 2072
{
+ − 2073
$cls = ( $cls == 'row1' ) ? 'row2' : 'row1';
+ − 2074
$offset = strval($i * $perpage);
76
+ − 2075
$url = htmlspecialchars(sprintf($result_url, $offset));
1
+ − 2076
$j = $i + 1;
+ − 2077
$link = ( $offset == strval($start) ) ? "<b>$j</b>" : "<a href=".'"'."$url".'"'." style='text-decoration: none;'>$j</a>";
+ − 2078
$blk->assign_vars(array(
+ − 2079
'CLASS'=>$cls,
+ − 2080
'LINK'=>$link
+ − 2081
));
+ − 2082
$inner .= $blk->run();
+ − 2083
}
+ − 2084
}
+ − 2085
else
+ − 2086
{
+ − 2087
if ( $this_page + 5 > $num_pages )
+ − 2088
{
+ − 2089
$list = Array();
+ − 2090
$tp = $this_page;
+ − 2091
if ( $this_page + 0 == $num_pages ) $tp = $tp - 3;
+ − 2092
if ( $this_page + 1 == $num_pages ) $tp = $tp - 2;
+ − 2093
if ( $this_page + 2 == $num_pages ) $tp = $tp - 1;
+ − 2094
for ( $i = $tp - 1; $i <= $tp + 1; $i++ )
+ − 2095
{
+ − 2096
$list[] = $i;
+ − 2097
}
+ − 2098
}
+ − 2099
else
+ − 2100
{
+ − 2101
$list = Array();
+ − 2102
$current = $this_page;
+ − 2103
$lower = ( $current < 3 ) ? 1 : $current - 1;
+ − 2104
for ( $i = 0; $i < 3; $i++ )
+ − 2105
{
+ − 2106
$list[] = $lower + $i;
+ − 2107
}
+ − 2108
}
+ − 2109
$url = sprintf($result_url, '0');
+ − 2110
$link = ( 0 == $start ) ? "<b>First</b>" : "<a href=".'"'."$url".'"'." style='text-decoration: none;'>« First</a>";
+ − 2111
$blk->assign_vars(array(
+ − 2112
'CLASS'=>$cls,
+ − 2113
'LINK'=>$link
+ − 2114
));
+ − 2115
$inner .= $blk->run();
76
+ − 2116
1
+ − 2117
// if ( !in_array(1, $list) )
+ − 2118
// {
+ − 2119
// $cls = ( $cls == 'row1' ) ? 'row2' : 'row1';
+ − 2120
// $blk->assign_vars(array('CLASS'=>$cls,'LINK'=>'...'));
+ − 2121
// $inner .= $blk->run();
+ − 2122
// }
76
+ − 2123
1
+ − 2124
foreach ( $list as $i )
+ − 2125
{
+ − 2126
if ( $i == $num_pages )
+ − 2127
break;
+ − 2128
$cls = ( $cls == 'row1' ) ? 'row2' : 'row1';
+ − 2129
$offset = strval($i * $perpage);
+ − 2130
$url = sprintf($result_url, $offset);
+ − 2131
$j = $i + 1;
+ − 2132
$link = ( $offset == strval($start) ) ? "<b>$j</b>" : "<a href=".'"'."$url".'"'." style='text-decoration: none;'>$j</a>";
+ − 2133
$blk->assign_vars(array(
+ − 2134
'CLASS'=>$cls,
+ − 2135
'LINK'=>$link
+ − 2136
));
+ − 2137
$inner .= $blk->run();
+ − 2138
}
76
+ − 2139
1
+ − 2140
$total = $num_pages * $perpage - $perpage;
76
+ − 2141
1
+ − 2142
if ( $this_page < $num_pages )
+ − 2143
{
+ − 2144
// $cls = ( $cls == 'row1' ) ? 'row2' : 'row1';
+ − 2145
// $blk->assign_vars(array('CLASS'=>$cls,'LINK'=>'...'));
+ − 2146
// $inner .= $blk->run();
76
+ − 2147
1
+ − 2148
$cls = ( $cls == 'row1' ) ? 'row2' : 'row1';
+ − 2149
$offset = strval($total);
+ − 2150
$url = sprintf($result_url, $offset);
+ − 2151
$j = $i + 1;
+ − 2152
$link = ( $offset == strval($start) ) ? "<b>Last</b>" : "<a href=".'"'."$url".'"'." style='text-decoration: none;'>Last »</a>";
+ − 2153
$blk->assign_vars(array(
+ − 2154
'CLASS'=>$cls,
+ − 2155
'LINK'=>$link
+ − 2156
));
+ − 2157
$inner .= $blk->run();
+ − 2158
}
76
+ − 2159
1
+ − 2160
}
76
+ − 2161
1
+ − 2162
$inner .= '<td class="row2" style="cursor: pointer;" onclick="paginator_goto(this, '.$this_page.', '.$num_pages.', '.$perpage.', unescape(\'' . rawurlencode($result_url) . '\'));">↓</td>';
76
+ − 2163
1
+ − 2164
$paginator = "\n$begin$inner$end\n";
+ − 2165
$out .= $paginator;
76
+ − 2166
1
+ − 2167
$cls = 'row2';
76
+ − 2168
1
+ − 2169
if ( $row = $db->fetchrow($q) )
+ − 2170
{
+ − 2171
$i = 0;
+ − 2172
$out .= $header;
+ − 2173
do {
+ − 2174
$i++;
+ − 2175
if ( $i <= $start )
+ − 2176
{
+ − 2177
continue;
+ − 2178
}
+ − 2179
if ( ( $i - $start ) > $perpage )
+ − 2180
{
+ − 2181
break;
+ − 2182
}
+ − 2183
$cls = ( $cls == 'row1' ) ? 'row2' : 'row1';
+ − 2184
foreach ( $row as $j => $val )
+ − 2185
{
+ − 2186
if ( isset($callers[$j]) )
+ − 2187
{
74
68469a95658d
Various bugfixes and cleanups, too much to remember... see the diffs for what got changed :-)
Dan
diff
changeset
+ − 2188
$tmp = ( is_callable($callers[$j]) ) ? @call_user_func($callers[$j], $val, $row) : $val;
76
+ − 2189
1
+ − 2190
if ( $tmp )
+ − 2191
{
+ − 2192
$row[$j] = $tmp;
+ − 2193
}
+ − 2194
}
+ − 2195
}
+ − 2196
$parser->assign_vars($row);
+ − 2197
$parser->assign_vars(array('_css_class' => $cls));
+ − 2198
$out .= $parser->run();
+ − 2199
} while ( $row = $db->fetchrow($q) );
+ − 2200
$out .= $footer;
+ − 2201
}
76
+ − 2202
1
+ − 2203
$out .= $paginator;
76
+ − 2204
1
+ − 2205
return $out;
+ − 2206
}
+ − 2207
+ − 2208
/**
+ − 2209
* This is the same as paginate(), but it processes an array instead of a MySQL result resource.
+ − 2210
* @param array The results. Each value is simply echoed.
+ − 2211
* @param int The number of total results. This should be determined by a second query.
+ − 2212
* @param string sprintf-style formatting string for URLs for result pages. First parameter will be start offset.
+ − 2213
* @param int Optional. Start offset in individual results. Defaults to 0.
+ − 2214
* @param int Optional. The number of results per page. Defualts to 10.
+ − 2215
* @param string Optional. The text to be sent before the result list, only if there are any results. Possibly the start of a table.
+ − 2216
* @param string Optional. The text to be sent after the result list, only if there are any results. Possibly the end of a table.
+ − 2217
* @return string
+ − 2218
*/
+ − 2219
+ − 2220
function paginate_array($q, $num_results, $result_url, $start = 0, $perpage = 10, $header = '', $footer = '')
+ − 2221
{
+ − 2222
global $db, $session, $paths, $template, $plugins; // Common objects
+ − 2223
$parser = $template->makeParserText($tpl_text);
+ − 2224
$num_pages = ceil ( $num_results / $perpage );
+ − 2225
$out = '';
+ − 2226
$i = 0;
+ − 2227
$this_page = ceil ( $start / $perpage );
76
+ − 2228
1
+ − 2229
// Build paginator
+ − 2230
$begin = '<div class="tblholder" style="display: table; margin: 10px 0 0 auto;">
+ − 2231
<table border="0" cellspacing="1" cellpadding="4">
+ − 2232
<tr><th>Page:</th>';
+ − 2233
$block = '<td class="row1" style="text-align: center;">{LINK}</td>';
+ − 2234
$end = '</tr></table></div>';
+ − 2235
$blk = $template->makeParserText($block);
+ − 2236
$inner = '';
+ − 2237
$cls = 'row2';
+ − 2238
if ( $start > 0 )
+ − 2239
{
+ − 2240
$url = sprintf($result_url, abs($start - $perpage));
+ − 2241
$link = "<a href=".'"'."$url".'"'." style='text-decoration: none;'>« Prev</a>";
+ − 2242
$cls = ( $cls == 'row1' ) ? 'row2' : 'row1';
+ − 2243
$blk->assign_vars(array(
+ − 2244
'CLASS'=>$cls,
+ − 2245
'LINK'=>$link
+ − 2246
));
+ − 2247
$inner .= $blk->run();
+ − 2248
}
+ − 2249
if ( $num_pages < 5 )
+ − 2250
{
+ − 2251
for ( $i = 0; $i < $num_pages; $i++ )
+ − 2252
{
+ − 2253
$cls = ( $cls == 'row1' ) ? 'row2' : 'row1';
+ − 2254
$offset = strval($i * $perpage);
76
+ − 2255
$url = htmlspecialchars(sprintf($result_url, $offset));
1
+ − 2256
$j = $i + 1;
+ − 2257
$link = ( $offset == strval($start) ) ? "<b>$j</b>" : "<a href=".'"'."$url".'"'." style='text-decoration: none;'>$j</a>";
+ − 2258
$blk->assign_vars(array(
+ − 2259
'CLASS'=>$cls,
+ − 2260
'LINK'=>$link
+ − 2261
));
+ − 2262
$inner .= $blk->run();
+ − 2263
}
+ − 2264
}
+ − 2265
else
+ − 2266
{
+ − 2267
if ( $this_page + 5 > $num_pages )
+ − 2268
{
+ − 2269
$list = Array();
+ − 2270
$tp = $this_page;
+ − 2271
if ( $this_page + 0 == $num_pages ) $tp = $tp - 3;
+ − 2272
if ( $this_page + 1 == $num_pages ) $tp = $tp - 2;
+ − 2273
if ( $this_page + 2 == $num_pages ) $tp = $tp - 1;
+ − 2274
for ( $i = $tp - 1; $i <= $tp + 1; $i++ )
+ − 2275
{
+ − 2276
$list[] = $i;
+ − 2277
}
+ − 2278
}
+ − 2279
else
+ − 2280
{
+ − 2281
$list = Array();
+ − 2282
$current = $this_page;
+ − 2283
$lower = ( $current < 3 ) ? 1 : $current - 1;
+ − 2284
for ( $i = 0; $i < 3; $i++ )
+ − 2285
{
+ − 2286
$list[] = $lower + $i;
+ − 2287
}
+ − 2288
}
+ − 2289
$url = sprintf($result_url, '0');
+ − 2290
$link = ( 0 == $start ) ? "<b>First</b>" : "<a href=".'"'."$url".'"'." style='text-decoration: none;'>« First</a>";
+ − 2291
$blk->assign_vars(array(
+ − 2292
'CLASS'=>$cls,
+ − 2293
'LINK'=>$link
+ − 2294
));
+ − 2295
$inner .= $blk->run();
76
+ − 2296
1
+ − 2297
// if ( !in_array(1, $list) )
+ − 2298
// {
+ − 2299
// $cls = ( $cls == 'row1' ) ? 'row2' : 'row1';
+ − 2300
// $blk->assign_vars(array('CLASS'=>$cls,'LINK'=>'...'));
+ − 2301
// $inner .= $blk->run();
+ − 2302
// }
76
+ − 2303
1
+ − 2304
foreach ( $list as $i )
+ − 2305
{
+ − 2306
if ( $i == $num_pages )
+ − 2307
break;
+ − 2308
$cls = ( $cls == 'row1' ) ? 'row2' : 'row1';
+ − 2309
$offset = strval($i * $perpage);
+ − 2310
$url = sprintf($result_url, $offset);
+ − 2311
$j = $i + 1;
+ − 2312
$link = ( $offset == strval($start) ) ? "<b>$j</b>" : "<a href=".'"'."$url".'"'." style='text-decoration: none;'>$j</a>";
+ − 2313
$blk->assign_vars(array(
+ − 2314
'CLASS'=>$cls,
+ − 2315
'LINK'=>$link
+ − 2316
));
+ − 2317
$inner .= $blk->run();
+ − 2318
}
76
+ − 2319
1
+ − 2320
$total = $num_pages * $perpage - $perpage;
76
+ − 2321
1
+ − 2322
if ( $this_page < $num_pages )
+ − 2323
{
+ − 2324
// $cls = ( $cls == 'row1' ) ? 'row2' : 'row1';
+ − 2325
// $blk->assign_vars(array('CLASS'=>$cls,'LINK'=>'...'));
+ − 2326
// $inner .= $blk->run();
76
+ − 2327
1
+ − 2328
$cls = ( $cls == 'row1' ) ? 'row2' : 'row1';
+ − 2329
$offset = strval($total);
+ − 2330
$url = sprintf($result_url, $offset);
+ − 2331
$j = $i + 1;
+ − 2332
$link = ( $offset == strval($start) ) ? "<b>Last</b>" : "<a href=".'"'."$url".'"'." style='text-decoration: none;'>Last »</a>";
+ − 2333
$blk->assign_vars(array(
+ − 2334
'CLASS'=>$cls,
+ − 2335
'LINK'=>$link
+ − 2336
));
+ − 2337
$inner .= $blk->run();
+ − 2338
}
76
+ − 2339
1
+ − 2340
}
76
+ − 2341
1
+ − 2342
if ( $start < $total )
+ − 2343
{
+ − 2344
$url = sprintf($result_url, abs($start + $perpage));
+ − 2345
$link = "<a href=".'"'."$url".'"'." style='text-decoration: none;'>Next »</a>";
+ − 2346
$cls = ( $cls == 'row1' ) ? 'row2' : 'row1';
+ − 2347
$blk->assign_vars(array(
+ − 2348
'CLASS'=>$cls,
+ − 2349
'LINK'=>$link
+ − 2350
));
+ − 2351
$inner .= $blk->run();
+ − 2352
}
76
+ − 2353
1
+ − 2354
$inner .= '<td class="row2" style="cursor: pointer;" onclick="paginator_goto(this, '.$this_page.', '.$num_pages.', '.$perpage.', unescape(\'' . rawurlencode($result_url) . '\'));">↓</td>';
76
+ − 2355
1
+ − 2356
$paginator = "\n$begin$inner$end\n";
+ − 2357
if ( $total > 1 )
+ − 2358
$out .= $paginator;
76
+ − 2359
1
+ − 2360
$cls = 'row2';
76
+ − 2361
1
+ − 2362
if ( sizeof($q) > 0 )
+ − 2363
{
+ − 2364
$i = 0;
+ − 2365
$out .= $header;
+ − 2366
foreach ( $q as $val ) {
+ − 2367
$i++;
+ − 2368
if ( $i <= $start )
+ − 2369
{
+ − 2370
continue;
+ − 2371
}
+ − 2372
if ( ( $i - $start ) > $perpage )
+ − 2373
{
+ − 2374
break;
+ − 2375
}
+ − 2376
$out .= $val;
+ − 2377
}
+ − 2378
$out .= $footer;
+ − 2379
}
76
+ − 2380
1
+ − 2381
if ( $total > 1 )
+ − 2382
$out .= $paginator;
76
+ − 2383
1
+ − 2384
return $out;
+ − 2385
}
+ − 2386
76
+ − 2387
/**
1
+ − 2388
* Enano version of fputs for debugging
+ − 2389
*/
+ − 2390
+ − 2391
function enano_fputs($socket, $data)
+ − 2392
{
+ − 2393
// echo '<pre>' . htmlspecialchars($data) . '</pre>';
+ − 2394
// flush();
+ − 2395
// ob_flush();
+ − 2396
// ob_end_flush();
+ − 2397
return fputs($socket, $data);
+ − 2398
}
+ − 2399
+ − 2400
/**
+ − 2401
* Sanitizes a page URL string so that it can safely be stored in the database.
+ − 2402
* @param string Page ID to sanitize
+ − 2403
* @return string Cleaned text
+ − 2404
*/
+ − 2405
+ − 2406
function sanitize_page_id($page_id)
+ − 2407
{
76
+ − 2408
15
ad5986a53197
Fixed complicated SQL injection vulnerability in URL handler, updated license info for Tigra Tree Menu, and killed one XSS vulnerability
Dan
diff
changeset
+ − 2409
// Remove character escapes
ad5986a53197
Fixed complicated SQL injection vulnerability in URL handler, updated license info for Tigra Tree Menu, and killed one XSS vulnerability
Dan
diff
changeset
+ − 2410
$page_id = dirtify_page_id($page_id);
76
+ − 2411
21
663fcf528726
Updated all version numbers back to Banshee; a few preliminary steps towards full UTF-8 support in page URLs
Dan
diff
changeset
+ − 2412
$pid_clean = preg_replace('/[\w\.\/:;\(\)@\[\]_-]/', 'X', $page_id);
1
+ − 2413
$pid_dirty = enano_str_split($pid_clean, 1);
76
+ − 2414
1
+ − 2415
foreach ( $pid_dirty as $id => $char )
+ − 2416
{
+ − 2417
if ( $char == 'X' )
+ − 2418
continue;
+ − 2419
$cid = ord($char);
+ − 2420
$cid = dechex($cid);
+ − 2421
$cid = strval($cid);
+ − 2422
if ( strlen($cid) < 2 )
+ − 2423
{
+ − 2424
$cid = strtoupper("0$cid");
+ − 2425
}
+ − 2426
$pid_dirty[$id] = ".$cid";
+ − 2427
}
76
+ − 2428
1
+ − 2429
$pid_chars = enano_str_split($page_id, 1);
+ − 2430
$page_id_cleaned = '';
76
+ − 2431
1
+ − 2432
foreach ( $pid_chars as $id => $char )
+ − 2433
{
+ − 2434
if ( $pid_dirty[$id] == 'X' )
+ − 2435
$page_id_cleaned .= $char;
+ − 2436
else
+ − 2437
$page_id_cleaned .= $pid_dirty[$id];
+ − 2438
}
76
+ − 2439
21
663fcf528726
Updated all version numbers back to Banshee; a few preliminary steps towards full UTF-8 support in page URLs
Dan
diff
changeset
+ − 2440
// global $mime_types;
76
+ − 2441
21
663fcf528726
Updated all version numbers back to Banshee; a few preliminary steps towards full UTF-8 support in page URLs
Dan
diff
changeset
+ − 2442
// $exts = array_keys($mime_types);
663fcf528726
Updated all version numbers back to Banshee; a few preliminary steps towards full UTF-8 support in page URLs
Dan
diff
changeset
+ − 2443
// $exts = '(' . implode('|', $exts) . ')';
76
+ − 2444
21
663fcf528726
Updated all version numbers back to Banshee; a few preliminary steps towards full UTF-8 support in page URLs
Dan
diff
changeset
+ − 2445
// $page_id_cleaned = preg_replace('/\.2e' . $exts . '$/', '.\\1', $page_id_cleaned);
76
+ − 2446
1
+ − 2447
return $page_id_cleaned;
+ − 2448
}
+ − 2449
+ − 2450
/**
15
ad5986a53197
Fixed complicated SQL injection vulnerability in URL handler, updated license info for Tigra Tree Menu, and killed one XSS vulnerability
Dan
diff
changeset
+ − 2451
* Removes character escapes in a page ID string
ad5986a53197
Fixed complicated SQL injection vulnerability in URL handler, updated license info for Tigra Tree Menu, and killed one XSS vulnerability
Dan
diff
changeset
+ − 2452
* @param string Page ID string to dirty up
ad5986a53197
Fixed complicated SQL injection vulnerability in URL handler, updated license info for Tigra Tree Menu, and killed one XSS vulnerability
Dan
diff
changeset
+ − 2453
* @return string
ad5986a53197
Fixed complicated SQL injection vulnerability in URL handler, updated license info for Tigra Tree Menu, and killed one XSS vulnerability
Dan
diff
changeset
+ − 2454
*/
ad5986a53197
Fixed complicated SQL injection vulnerability in URL handler, updated license info for Tigra Tree Menu, and killed one XSS vulnerability
Dan
diff
changeset
+ − 2455
ad5986a53197
Fixed complicated SQL injection vulnerability in URL handler, updated license info for Tigra Tree Menu, and killed one XSS vulnerability
Dan
diff
changeset
+ − 2456
function dirtify_page_id($page_id)
ad5986a53197
Fixed complicated SQL injection vulnerability in URL handler, updated license info for Tigra Tree Menu, and killed one XSS vulnerability
Dan
diff
changeset
+ − 2457
{
38
+ − 2458
global $db, $session, $paths, $template, $plugins; // Common objects
76
+ − 2459
// First, replace spaces with underscores
15
ad5986a53197
Fixed complicated SQL injection vulnerability in URL handler, updated license info for Tigra Tree Menu, and killed one XSS vulnerability
Dan
diff
changeset
+ − 2460
$page_id = str_replace(' ', '_', $page_id);
76
+ − 2461
38
+ − 2462
// Exception for userpages for IP addresses
+ − 2463
if ( preg_match('/^' . preg_quote($paths->nslist['User']) . '/', $page_id) )
+ − 2464
{
+ − 2465
$ip = preg_replace('/^' . preg_quote($paths->nslist['User']) . '/', '', $page_id);
+ − 2466
if ( is_valid_ip($ip) )
+ − 2467
return $page_id;
+ − 2468
}
76
+ − 2469
15
ad5986a53197
Fixed complicated SQL injection vulnerability in URL handler, updated license info for Tigra Tree Menu, and killed one XSS vulnerability
Dan
diff
changeset
+ − 2470
preg_match_all('/\.[A-Fa-f0-9][A-Fa-f0-9]/', $page_id, $matches);
76
+ − 2471
15
ad5986a53197
Fixed complicated SQL injection vulnerability in URL handler, updated license info for Tigra Tree Menu, and killed one XSS vulnerability
Dan
diff
changeset
+ − 2472
foreach ( $matches[0] as $id => $char )
ad5986a53197
Fixed complicated SQL injection vulnerability in URL handler, updated license info for Tigra Tree Menu, and killed one XSS vulnerability
Dan
diff
changeset
+ − 2473
{
ad5986a53197
Fixed complicated SQL injection vulnerability in URL handler, updated license info for Tigra Tree Menu, and killed one XSS vulnerability
Dan
diff
changeset
+ − 2474
$char = substr($char, 1);
ad5986a53197
Fixed complicated SQL injection vulnerability in URL handler, updated license info for Tigra Tree Menu, and killed one XSS vulnerability
Dan
diff
changeset
+ − 2475
$char = strtolower($char);
ad5986a53197
Fixed complicated SQL injection vulnerability in URL handler, updated license info for Tigra Tree Menu, and killed one XSS vulnerability
Dan
diff
changeset
+ − 2476
$char = intval(hexdec($char));
ad5986a53197
Fixed complicated SQL injection vulnerability in URL handler, updated license info for Tigra Tree Menu, and killed one XSS vulnerability
Dan
diff
changeset
+ − 2477
$char = chr($char);
ad5986a53197
Fixed complicated SQL injection vulnerability in URL handler, updated license info for Tigra Tree Menu, and killed one XSS vulnerability
Dan
diff
changeset
+ − 2478
$page_id = str_replace($matches[0][$id], $char, $page_id);
ad5986a53197
Fixed complicated SQL injection vulnerability in URL handler, updated license info for Tigra Tree Menu, and killed one XSS vulnerability
Dan
diff
changeset
+ − 2479
}
76
+ − 2480
15
ad5986a53197
Fixed complicated SQL injection vulnerability in URL handler, updated license info for Tigra Tree Menu, and killed one XSS vulnerability
Dan
diff
changeset
+ − 2481
return $page_id;
ad5986a53197
Fixed complicated SQL injection vulnerability in URL handler, updated license info for Tigra Tree Menu, and killed one XSS vulnerability
Dan
diff
changeset
+ − 2482
}
ad5986a53197
Fixed complicated SQL injection vulnerability in URL handler, updated license info for Tigra Tree Menu, and killed one XSS vulnerability
Dan
diff
changeset
+ − 2483
ad5986a53197
Fixed complicated SQL injection vulnerability in URL handler, updated license info for Tigra Tree Menu, and killed one XSS vulnerability
Dan
diff
changeset
+ − 2484
/**
76
+ − 2485
* Inserts commas into a number to make it more human-readable. Floating point-safe and doesn't flirt with the number like number_format() does.
1
+ − 2486
* @param int The number to process
+ − 2487
* @return string Input number with commas added
+ − 2488
*/
+ − 2489
+ − 2490
function commatize($num)
+ − 2491
{
+ − 2492
$num = (string)$num;
+ − 2493
if ( strpos($num, '.') )
+ − 2494
{
+ − 2495
$whole = explode('.', $num);
+ − 2496
$num = $whole[0];
+ − 2497
$dec = $whole[1];
+ − 2498
}
+ − 2499
else
+ − 2500
{
+ − 2501
$whole = $num;
+ − 2502
}
+ − 2503
$offset = ( strlen($num) ) % 3;
+ − 2504
$len = strlen($num);
+ − 2505
$offset = ( $offset == 0 )
+ − 2506
? 3
+ − 2507
: $offset;
+ − 2508
for ( $i = $offset; $i < $len; $i=$i+3 )
+ − 2509
{
+ − 2510
$num = substr($num, 0, $i) . ',' . substr($num, $i, $len);
+ − 2511
$len = strlen($num);
+ − 2512
$i++;
+ − 2513
}
+ − 2514
if ( isset($dec) )
+ − 2515
{
+ − 2516
return $num . '.' . $dec;
+ − 2517
}
+ − 2518
else
+ − 2519
{
+ − 2520
return $num;
+ − 2521
}
+ − 2522
}
+ − 2523
32
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 2524
/**
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 2525
* Injects a string into another string at the specified position.
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 2526
* @param string The haystack
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 2527
* @param string The needle
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 2528
* @param int Position at which to insert the needle
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 2529
*/
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 2530
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 2531
function inject_substr($haystack, $needle, $pos)
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 2532
{
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 2533
$str1 = substr($haystack, 0, $pos);
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 2534
$pos++;
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 2535
$str2 = substr($haystack, $pos);
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 2536
return "{$str1}{$needle}{$str2}";
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 2537
}
4d87aad3c4c0
Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details
Dan
diff
changeset
+ − 2538
38
+ − 2539
/**
+ − 2540
* Tells if a given IP address is valid.
+ − 2541
* @param string suspected IP address
+ − 2542
* @return bool true if valid, false otherwise
+ − 2543
*/
76
+ − 2544
38
+ − 2545
function is_valid_ip($ip)
+ − 2546
{
+ − 2547
// These came from phpBB3.
+ − 2548
$ipv4 = '(?:(?:\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.){3}(?:\d{1,2}|1\d\d|2[0-4]\d|25[0-5])';
+ − 2549
$ipv6 = '(?:(?:(?:[\dA-F]{1,4}:){6}(?:[\dA-F]{1,4}:[\dA-F]{1,4}|(?:(?:\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.){3}(?:\d{1,2}|1\d\d|2[0-4]\d|25[0-5])))|(?:::(?:[\dA-F]{1,4}:){5}(?:[\dA-F]{1,4}:[\dA-F]{1,4}|(?:(?:\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.){3}(?:\d{1,2}|1\d\d|2[0-4]\d|25[0-5])))|(?:(?:[\dA-F]{1,4}:):(?:[\dA-F]{1,4}:){4}(?:[\dA-F]{1,4}:[\dA-F]{1,4}|(?:(?:\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.){3}(?:\d{1,2}|1\d\d|2[0-4]\d|25[0-5])))|(?:(?:[\dA-F]{1,4}:){1,2}:(?:[\dA-F]{1,4}:){3}(?:[\dA-F]{1,4}:[\dA-F]{1,4}|(?:(?:\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.){3}(?:\d{1,2}|1\d\d|2[0-4]\d|25[0-5])))|(?:(?:[\dA-F]{1,4}:){1,3}:(?:[\dA-F]{1,4}:){2}(?:[\dA-F]{1,4}:[\dA-F]{1,4}|(?:(?:\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.){3}(?:\d{1,2}|1\d\d|2[0-4]\d|25[0-5])))|(?:(?:[\dA-F]{1,4}:){1,4}:(?:[\dA-F]{1,4}:)(?:[\dA-F]{1,4}:[\dA-F]{1,4}|(?:(?:\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.){3}(?:\d{1,2}|1\d\d|2[0-4]\d|25[0-5])))|(?:(?:[\dA-F]{1,4}:){1,5}:(?:[\dA-F]{1,4}:[\dA-F]{1,4}|(?:(?:\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.){3}(?:\d{1,2}|1\d\d|2[0-4]\d|25[0-5])))|(?:(?:[\dA-F]{1,4}:){1,6}:[\dA-F]{1,4})|(?:(?:[\dA-F]{1,4}:){1,7}:))';
76
+ − 2550
38
+ − 2551
if ( preg_match("/^{$ipv4}$/", $ip) || preg_match("/^{$ipv6}$/", $ip) )
+ − 2552
return true;
+ − 2553
else
+ − 2554
return false;
+ − 2555
}
+ − 2556
48
fc9762553a3c
E-mail address mask engine non-Javascript fallback now picks random substitutions for @ and . to make address more unreadable by bots
Dan
diff
changeset
+ − 2557
/**
fc9762553a3c
E-mail address mask engine non-Javascript fallback now picks random substitutions for @ and . to make address more unreadable by bots
Dan
diff
changeset
+ − 2558
* Replaces the FIRST given occurrence of needle within haystack with thread
fc9762553a3c
E-mail address mask engine non-Javascript fallback now picks random substitutions for @ and . to make address more unreadable by bots
Dan
diff
changeset
+ − 2559
* @param string Needle
fc9762553a3c
E-mail address mask engine non-Javascript fallback now picks random substitutions for @ and . to make address more unreadable by bots
Dan
diff
changeset
+ − 2560
* @param string Thread
fc9762553a3c
E-mail address mask engine non-Javascript fallback now picks random substitutions for @ and . to make address more unreadable by bots
Dan
diff
changeset
+ − 2561
* @param string Haystack
fc9762553a3c
E-mail address mask engine non-Javascript fallback now picks random substitutions for @ and . to make address more unreadable by bots
Dan
diff
changeset
+ − 2562
*/
fc9762553a3c
E-mail address mask engine non-Javascript fallback now picks random substitutions for @ and . to make address more unreadable by bots
Dan
diff
changeset
+ − 2563
fc9762553a3c
E-mail address mask engine non-Javascript fallback now picks random substitutions for @ and . to make address more unreadable by bots
Dan
diff
changeset
+ − 2564
function str_replace_once($needle, $thread, $haystack)
fc9762553a3c
E-mail address mask engine non-Javascript fallback now picks random substitutions for @ and . to make address more unreadable by bots
Dan
diff
changeset
+ − 2565
{
fc9762553a3c
E-mail address mask engine non-Javascript fallback now picks random substitutions for @ and . to make address more unreadable by bots
Dan
diff
changeset
+ − 2566
$needle_len = strlen($needle);
fc9762553a3c
E-mail address mask engine non-Javascript fallback now picks random substitutions for @ and . to make address more unreadable by bots
Dan
diff
changeset
+ − 2567
for ( $i = 0; $i < strlen($haystack); $i++ )
fc9762553a3c
E-mail address mask engine non-Javascript fallback now picks random substitutions for @ and . to make address more unreadable by bots
Dan
diff
changeset
+ − 2568
{
fc9762553a3c
E-mail address mask engine non-Javascript fallback now picks random substitutions for @ and . to make address more unreadable by bots
Dan
diff
changeset
+ − 2569
$test = substr($haystack, $i, $needle_len);
fc9762553a3c
E-mail address mask engine non-Javascript fallback now picks random substitutions for @ and . to make address more unreadable by bots
Dan
diff
changeset
+ − 2570
if ( $test == $needle )
fc9762553a3c
E-mail address mask engine non-Javascript fallback now picks random substitutions for @ and . to make address more unreadable by bots
Dan
diff
changeset
+ − 2571
{
fc9762553a3c
E-mail address mask engine non-Javascript fallback now picks random substitutions for @ and . to make address more unreadable by bots
Dan
diff
changeset
+ − 2572
// Got it!
fc9762553a3c
E-mail address mask engine non-Javascript fallback now picks random substitutions for @ and . to make address more unreadable by bots
Dan
diff
changeset
+ − 2573
$upto = substr($haystack, 0, $i);
fc9762553a3c
E-mail address mask engine non-Javascript fallback now picks random substitutions for @ and . to make address more unreadable by bots
Dan
diff
changeset
+ − 2574
$from = substr($haystack, ( $i + $needle_len ));
fc9762553a3c
E-mail address mask engine non-Javascript fallback now picks random substitutions for @ and . to make address more unreadable by bots
Dan
diff
changeset
+ − 2575
$new_haystack = "{$upto}{$thread}{$from}";
fc9762553a3c
E-mail address mask engine non-Javascript fallback now picks random substitutions for @ and . to make address more unreadable by bots
Dan
diff
changeset
+ − 2576
return $new_haystack;
fc9762553a3c
E-mail address mask engine non-Javascript fallback now picks random substitutions for @ and . to make address more unreadable by bots
Dan
diff
changeset
+ − 2577
}
fc9762553a3c
E-mail address mask engine non-Javascript fallback now picks random substitutions for @ and . to make address more unreadable by bots
Dan
diff
changeset
+ − 2578
}
fc9762553a3c
E-mail address mask engine non-Javascript fallback now picks random substitutions for @ and . to make address more unreadable by bots
Dan
diff
changeset
+ − 2579
return $haystack;
fc9762553a3c
E-mail address mask engine non-Javascript fallback now picks random substitutions for @ and . to make address more unreadable by bots
Dan
diff
changeset
+ − 2580
}
fc9762553a3c
E-mail address mask engine non-Javascript fallback now picks random substitutions for @ and . to make address more unreadable by bots
Dan
diff
changeset
+ − 2581
78
4df25dfdde63
Modified Text_Wiki parser to fully support UTF-8 strings; several other UTF-8 fixes, international characters seem to work reasonably well now
Dan
diff
changeset
+ − 2582
/**
4df25dfdde63
Modified Text_Wiki parser to fully support UTF-8 strings; several other UTF-8 fixes, international characters seem to work reasonably well now
Dan
diff
changeset
+ − 2583
* From http://us2.php.net/urldecode - decode %uXXXX
4df25dfdde63
Modified Text_Wiki parser to fully support UTF-8 strings; several other UTF-8 fixes, international characters seem to work reasonably well now
Dan
diff
changeset
+ − 2584
* @param string The urlencoded string
4df25dfdde63
Modified Text_Wiki parser to fully support UTF-8 strings; several other UTF-8 fixes, international characters seem to work reasonably well now
Dan
diff
changeset
+ − 2585
* @return string
4df25dfdde63
Modified Text_Wiki parser to fully support UTF-8 strings; several other UTF-8 fixes, international characters seem to work reasonably well now
Dan
diff
changeset
+ − 2586
*/
4df25dfdde63
Modified Text_Wiki parser to fully support UTF-8 strings; several other UTF-8 fixes, international characters seem to work reasonably well now
Dan
diff
changeset
+ − 2587
4df25dfdde63
Modified Text_Wiki parser to fully support UTF-8 strings; several other UTF-8 fixes, international characters seem to work reasonably well now
Dan
diff
changeset
+ − 2588
function decode_unicode_url($str)
4df25dfdde63
Modified Text_Wiki parser to fully support UTF-8 strings; several other UTF-8 fixes, international characters seem to work reasonably well now
Dan
diff
changeset
+ − 2589
{
4df25dfdde63
Modified Text_Wiki parser to fully support UTF-8 strings; several other UTF-8 fixes, international characters seem to work reasonably well now
Dan
diff
changeset
+ − 2590
$res = '';
4df25dfdde63
Modified Text_Wiki parser to fully support UTF-8 strings; several other UTF-8 fixes, international characters seem to work reasonably well now
Dan
diff
changeset
+ − 2591
4df25dfdde63
Modified Text_Wiki parser to fully support UTF-8 strings; several other UTF-8 fixes, international characters seem to work reasonably well now
Dan
diff
changeset
+ − 2592
$i = 0;
4df25dfdde63
Modified Text_Wiki parser to fully support UTF-8 strings; several other UTF-8 fixes, international characters seem to work reasonably well now
Dan
diff
changeset
+ − 2593
$max = strlen($str) - 6;
4df25dfdde63
Modified Text_Wiki parser to fully support UTF-8 strings; several other UTF-8 fixes, international characters seem to work reasonably well now
Dan
diff
changeset
+ − 2594
while ($i <= $max)
4df25dfdde63
Modified Text_Wiki parser to fully support UTF-8 strings; several other UTF-8 fixes, international characters seem to work reasonably well now
Dan
diff
changeset
+ − 2595
{
4df25dfdde63
Modified Text_Wiki parser to fully support UTF-8 strings; several other UTF-8 fixes, international characters seem to work reasonably well now
Dan
diff
changeset
+ − 2596
$character = $str[$i];
4df25dfdde63
Modified Text_Wiki parser to fully support UTF-8 strings; several other UTF-8 fixes, international characters seem to work reasonably well now
Dan
diff
changeset
+ − 2597
if ($character == '%' && $str[$i + 1] == 'u')
4df25dfdde63
Modified Text_Wiki parser to fully support UTF-8 strings; several other UTF-8 fixes, international characters seem to work reasonably well now
Dan
diff
changeset
+ − 2598
{
4df25dfdde63
Modified Text_Wiki parser to fully support UTF-8 strings; several other UTF-8 fixes, international characters seem to work reasonably well now
Dan
diff
changeset
+ − 2599
$value = hexdec(substr($str, $i + 2, 4));
4df25dfdde63
Modified Text_Wiki parser to fully support UTF-8 strings; several other UTF-8 fixes, international characters seem to work reasonably well now
Dan
diff
changeset
+ − 2600
$i += 6;
4df25dfdde63
Modified Text_Wiki parser to fully support UTF-8 strings; several other UTF-8 fixes, international characters seem to work reasonably well now
Dan
diff
changeset
+ − 2601
4df25dfdde63
Modified Text_Wiki parser to fully support UTF-8 strings; several other UTF-8 fixes, international characters seem to work reasonably well now
Dan
diff
changeset
+ − 2602
if ($value < 0x0080)
4df25dfdde63
Modified Text_Wiki parser to fully support UTF-8 strings; several other UTF-8 fixes, international characters seem to work reasonably well now
Dan
diff
changeset
+ − 2603
{
4df25dfdde63
Modified Text_Wiki parser to fully support UTF-8 strings; several other UTF-8 fixes, international characters seem to work reasonably well now
Dan
diff
changeset
+ − 2604
// 1 byte: 0xxxxxxx
4df25dfdde63
Modified Text_Wiki parser to fully support UTF-8 strings; several other UTF-8 fixes, international characters seem to work reasonably well now
Dan
diff
changeset
+ − 2605
$character = chr($value);
4df25dfdde63
Modified Text_Wiki parser to fully support UTF-8 strings; several other UTF-8 fixes, international characters seem to work reasonably well now
Dan
diff
changeset
+ − 2606
}
4df25dfdde63
Modified Text_Wiki parser to fully support UTF-8 strings; several other UTF-8 fixes, international characters seem to work reasonably well now
Dan
diff
changeset
+ − 2607
else if ($value < 0x0800)
4df25dfdde63
Modified Text_Wiki parser to fully support UTF-8 strings; several other UTF-8 fixes, international characters seem to work reasonably well now
Dan
diff
changeset
+ − 2608
{
4df25dfdde63
Modified Text_Wiki parser to fully support UTF-8 strings; several other UTF-8 fixes, international characters seem to work reasonably well now
Dan
diff
changeset
+ − 2609
// 2 bytes: 110xxxxx 10xxxxxx
4df25dfdde63
Modified Text_Wiki parser to fully support UTF-8 strings; several other UTF-8 fixes, international characters seem to work reasonably well now
Dan
diff
changeset
+ − 2610
$character =
4df25dfdde63
Modified Text_Wiki parser to fully support UTF-8 strings; several other UTF-8 fixes, international characters seem to work reasonably well now
Dan
diff
changeset
+ − 2611
chr((($value & 0x07c0) >> 6) | 0xc0)
4df25dfdde63
Modified Text_Wiki parser to fully support UTF-8 strings; several other UTF-8 fixes, international characters seem to work reasonably well now
Dan
diff
changeset
+ − 2612
. chr(($value & 0x3f) | 0x80);
4df25dfdde63
Modified Text_Wiki parser to fully support UTF-8 strings; several other UTF-8 fixes, international characters seem to work reasonably well now
Dan
diff
changeset
+ − 2613
}
4df25dfdde63
Modified Text_Wiki parser to fully support UTF-8 strings; several other UTF-8 fixes, international characters seem to work reasonably well now
Dan
diff
changeset
+ − 2614
else
4df25dfdde63
Modified Text_Wiki parser to fully support UTF-8 strings; several other UTF-8 fixes, international characters seem to work reasonably well now
Dan
diff
changeset
+ − 2615
{
4df25dfdde63
Modified Text_Wiki parser to fully support UTF-8 strings; several other UTF-8 fixes, international characters seem to work reasonably well now
Dan
diff
changeset
+ − 2616
// 3 bytes: 1110xxxx 10xxxxxx 10xxxxxx
4df25dfdde63
Modified Text_Wiki parser to fully support UTF-8 strings; several other UTF-8 fixes, international characters seem to work reasonably well now
Dan
diff
changeset
+ − 2617
$character =
4df25dfdde63
Modified Text_Wiki parser to fully support UTF-8 strings; several other UTF-8 fixes, international characters seem to work reasonably well now
Dan
diff
changeset
+ − 2618
chr((($value & 0xf000) >> 12) | 0xe0)
4df25dfdde63
Modified Text_Wiki parser to fully support UTF-8 strings; several other UTF-8 fixes, international characters seem to work reasonably well now
Dan
diff
changeset
+ − 2619
. chr((($value & 0x0fc0) >> 6) | 0x80)
4df25dfdde63
Modified Text_Wiki parser to fully support UTF-8 strings; several other UTF-8 fixes, international characters seem to work reasonably well now
Dan
diff
changeset
+ − 2620
. chr(($value & 0x3f) | 0x80);
4df25dfdde63
Modified Text_Wiki parser to fully support UTF-8 strings; several other UTF-8 fixes, international characters seem to work reasonably well now
Dan
diff
changeset
+ − 2621
}
4df25dfdde63
Modified Text_Wiki parser to fully support UTF-8 strings; several other UTF-8 fixes, international characters seem to work reasonably well now
Dan
diff
changeset
+ − 2622
}
4df25dfdde63
Modified Text_Wiki parser to fully support UTF-8 strings; several other UTF-8 fixes, international characters seem to work reasonably well now
Dan
diff
changeset
+ − 2623
else
4df25dfdde63
Modified Text_Wiki parser to fully support UTF-8 strings; several other UTF-8 fixes, international characters seem to work reasonably well now
Dan
diff
changeset
+ − 2624
{
4df25dfdde63
Modified Text_Wiki parser to fully support UTF-8 strings; several other UTF-8 fixes, international characters seem to work reasonably well now
Dan
diff
changeset
+ − 2625
$i++;
4df25dfdde63
Modified Text_Wiki parser to fully support UTF-8 strings; several other UTF-8 fixes, international characters seem to work reasonably well now
Dan
diff
changeset
+ − 2626
}
4df25dfdde63
Modified Text_Wiki parser to fully support UTF-8 strings; several other UTF-8 fixes, international characters seem to work reasonably well now
Dan
diff
changeset
+ − 2627
4df25dfdde63
Modified Text_Wiki parser to fully support UTF-8 strings; several other UTF-8 fixes, international characters seem to work reasonably well now
Dan
diff
changeset
+ − 2628
$res .= $character;
4df25dfdde63
Modified Text_Wiki parser to fully support UTF-8 strings; several other UTF-8 fixes, international characters seem to work reasonably well now
Dan
diff
changeset
+ − 2629
}
4df25dfdde63
Modified Text_Wiki parser to fully support UTF-8 strings; several other UTF-8 fixes, international characters seem to work reasonably well now
Dan
diff
changeset
+ − 2630
4df25dfdde63
Modified Text_Wiki parser to fully support UTF-8 strings; several other UTF-8 fixes, international characters seem to work reasonably well now
Dan
diff
changeset
+ − 2631
return $res . substr($str, $i);
4df25dfdde63
Modified Text_Wiki parser to fully support UTF-8 strings; several other UTF-8 fixes, international characters seem to work reasonably well now
Dan
diff
changeset
+ − 2632
}
4df25dfdde63
Modified Text_Wiki parser to fully support UTF-8 strings; several other UTF-8 fixes, international characters seem to work reasonably well now
Dan
diff
changeset
+ − 2633
4df25dfdde63
Modified Text_Wiki parser to fully support UTF-8 strings; several other UTF-8 fixes, international characters seem to work reasonably well now
Dan
diff
changeset
+ − 2634
/**
4df25dfdde63
Modified Text_Wiki parser to fully support UTF-8 strings; several other UTF-8 fixes, international characters seem to work reasonably well now
Dan
diff
changeset
+ − 2635
* Recursively decodes an array with UTF-8 characters in its strings
4df25dfdde63
Modified Text_Wiki parser to fully support UTF-8 strings; several other UTF-8 fixes, international characters seem to work reasonably well now
Dan
diff
changeset
+ − 2636
* @param array Can be multi-depth
4df25dfdde63
Modified Text_Wiki parser to fully support UTF-8 strings; several other UTF-8 fixes, international characters seem to work reasonably well now
Dan
diff
changeset
+ − 2637
* @return array
4df25dfdde63
Modified Text_Wiki parser to fully support UTF-8 strings; several other UTF-8 fixes, international characters seem to work reasonably well now
Dan
diff
changeset
+ − 2638
*/
4df25dfdde63
Modified Text_Wiki parser to fully support UTF-8 strings; several other UTF-8 fixes, international characters seem to work reasonably well now
Dan
diff
changeset
+ − 2639
4df25dfdde63
Modified Text_Wiki parser to fully support UTF-8 strings; several other UTF-8 fixes, international characters seem to work reasonably well now
Dan
diff
changeset
+ − 2640
function decode_unicode_array($array)
4df25dfdde63
Modified Text_Wiki parser to fully support UTF-8 strings; several other UTF-8 fixes, international characters seem to work reasonably well now
Dan
diff
changeset
+ − 2641
{
4df25dfdde63
Modified Text_Wiki parser to fully support UTF-8 strings; several other UTF-8 fixes, international characters seem to work reasonably well now
Dan
diff
changeset
+ − 2642
foreach ( $array as $i => $val )
4df25dfdde63
Modified Text_Wiki parser to fully support UTF-8 strings; several other UTF-8 fixes, international characters seem to work reasonably well now
Dan
diff
changeset
+ − 2643
{
4df25dfdde63
Modified Text_Wiki parser to fully support UTF-8 strings; several other UTF-8 fixes, international characters seem to work reasonably well now
Dan
diff
changeset
+ − 2644
if ( is_string($val) )
4df25dfdde63
Modified Text_Wiki parser to fully support UTF-8 strings; several other UTF-8 fixes, international characters seem to work reasonably well now
Dan
diff
changeset
+ − 2645
{
4df25dfdde63
Modified Text_Wiki parser to fully support UTF-8 strings; several other UTF-8 fixes, international characters seem to work reasonably well now
Dan
diff
changeset
+ − 2646
$array[$i] = decode_unicode_url($val);
4df25dfdde63
Modified Text_Wiki parser to fully support UTF-8 strings; several other UTF-8 fixes, international characters seem to work reasonably well now
Dan
diff
changeset
+ − 2647
}
4df25dfdde63
Modified Text_Wiki parser to fully support UTF-8 strings; several other UTF-8 fixes, international characters seem to work reasonably well now
Dan
diff
changeset
+ − 2648
else
4df25dfdde63
Modified Text_Wiki parser to fully support UTF-8 strings; several other UTF-8 fixes, international characters seem to work reasonably well now
Dan
diff
changeset
+ − 2649
{
4df25dfdde63
Modified Text_Wiki parser to fully support UTF-8 strings; several other UTF-8 fixes, international characters seem to work reasonably well now
Dan
diff
changeset
+ − 2650
$array[$i] = decode_unicode_array($val);
4df25dfdde63
Modified Text_Wiki parser to fully support UTF-8 strings; several other UTF-8 fixes, international characters seem to work reasonably well now
Dan
diff
changeset
+ − 2651
}
4df25dfdde63
Modified Text_Wiki parser to fully support UTF-8 strings; several other UTF-8 fixes, international characters seem to work reasonably well now
Dan
diff
changeset
+ − 2652
}
4df25dfdde63
Modified Text_Wiki parser to fully support UTF-8 strings; several other UTF-8 fixes, international characters seem to work reasonably well now
Dan
diff
changeset
+ − 2653
return $array;
4df25dfdde63
Modified Text_Wiki parser to fully support UTF-8 strings; several other UTF-8 fixes, international characters seem to work reasonably well now
Dan
diff
changeset
+ − 2654
}
4df25dfdde63
Modified Text_Wiki parser to fully support UTF-8 strings; several other UTF-8 fixes, international characters seem to work reasonably well now
Dan
diff
changeset
+ − 2655
80
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2656
/**
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2657
* Sanitizes a page tag.
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2658
* @param string
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2659
* @return string
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2660
*/
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2661
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2662
function sanitize_tag($tag)
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2663
{
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2664
$tag = strtolower($tag);
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2665
$tag = preg_replace('/[^\w _-]+/', '', $tag);
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2666
$tag = trim($tag);
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2667
return $tag;
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2668
}
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2669
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2670
/**
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2671
* Gzips the output buffer.
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2672
*/
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2673
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2674
function gzip_output()
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2675
{
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2676
global $do_gzip;
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2677
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2678
//
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2679
// Compress buffered output if required and send to browser
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2680
//
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2681
if ( $do_gzip && function_exists('ob_gzhandler') )
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2682
{
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2683
//
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2684
// Copied from phpBB, which was in turn borrowed from php.net
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2685
//
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2686
$gzip_contents = ob_get_contents();
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2687
ob_end_clean();
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2688
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2689
header('Content-encoding: gzip');
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2690
$gzip_contents = ob_gzhandler($gzip_contents);
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2691
echo $gzip_contents;
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2692
}
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2693
}
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2694
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2695
/**
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2696
* Aggressively and hopefully non-destructively optimizes a blob of HTML.
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2697
* @param string HTML to process
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2698
* @return string much snaller HTML
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2699
*/
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2700
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2701
function aggressive_optimize_html($html)
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2702
{
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2703
$size_before = strlen($html);
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2704
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2705
// kill carriage returns
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2706
$html = str_replace("\r", "", $html);
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2707
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2708
// Optimize (but don't obfuscate) Javascript
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2709
preg_match_all('/<script(.*?)>(.+?)<\/script>/is', $html, $jscript);
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2710
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2711
// list of Javascript reserved words - from about.com
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2712
$reserved_words = array('abstract', 'as', 'boolean', 'break', 'byte', 'case', 'catch', 'char', 'class', 'continue', 'const', 'debugger', 'default', 'delete', 'do',
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2713
'double', 'else', 'enum', 'export', 'extends', 'false', 'final', 'finally', 'float', 'for', 'function', 'goto', 'if', 'implements', 'import',
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2714
'in', 'instanceof', 'int', 'interface', 'is', 'long', 'namespace', 'native', 'new', 'null', 'package', 'private', 'protected', 'public',
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2715
'return', 'short', 'static', 'super', 'switch', 'synchronized', 'this', 'throw', 'throws', 'transient', 'true', 'try', 'typeof', 'use', 'var',
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2716
'void', 'volatile', 'while', 'with');
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2717
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2718
$reserved_words = '(' . implode('|', $reserved_words) . ')';
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2719
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2720
for ( $i = 0; $i < count($jscript[0]); $i++ )
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2721
{
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2722
$js =& $jscript[2][$i];
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2723
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2724
// for line optimization, explode it
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2725
$particles = explode("\n", $js);
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2726
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2727
foreach ( $particles as $j => $atom )
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2728
{
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2729
// Remove comments
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2730
$atom = preg_replace('#\/\/(.+)#i', '', $atom);
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2731
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2732
$atom = trim($atom);
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2733
if ( empty($atom) )
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2734
unset($particles[$j]);
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2735
else
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2736
$particles[$j] = $atom;
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2737
}
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2738
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2739
$js = implode("\n", $particles);
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2740
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2741
$js = preg_replace('#/\*(.*?)\*/#s', '', $js);
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2742
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2743
// find all semicolons and then linebreaks, and replace with a single semicolon
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2744
$js = str_replace(";\n", ';', $js);
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2745
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2746
// starting braces
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2747
$js = preg_replace('/\{([\s]+)/m', '{', $js);
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2748
$js = str_replace(")\n{", '){', $js);
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2749
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2750
// ending braces (tricky)
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2751
$js = preg_replace('/\}([^;])/m', '};\\1', $js);
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2752
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2753
// other rules
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2754
$js = str_replace("};\n", "};", $js);
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2755
$js = str_replace(",\n", ',', $js);
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2756
$js = str_replace("[\n", '[', $js);
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2757
$js = str_replace("]\n", ']', $js);
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2758
$js = str_replace("\n}", '}', $js);
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2759
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2760
// newlines immediately before reserved words
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2761
$js = preg_replace("/(\)|;)\n$reserved_words/is", '\\1\\2', $js);
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2762
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2763
// fix for firefox issue
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2764
$js = preg_replace('/\};([\s]*)(else|\))/i', '}\\2', $js);
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2765
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2766
// apply changes
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2767
$html = str_replace($jscript[0][$i], "<script{$jscript[1][$i]}>$js</script>", $html);
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2768
}
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2769
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2770
// Which tags to strip - you can change this if needed
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2771
$strip_tags = Array('pre', 'script', 'style', 'enano:no-opt');
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2772
$strip_tags = implode('|', $strip_tags);
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2773
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2774
// Strip out the tags and replace with placeholders
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2775
preg_match_all("#<($strip_tags)(.*?)>(.*?)</($strip_tags)>#is", $html, $matches);
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2776
$seed = md5(microtime() . mt_rand()); // Random value used for placeholders
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2777
for ($i = 0;$i < sizeof($matches[1]); $i++)
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2778
{
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2779
$html = str_replace($matches[0][$i], "{DONT_STRIP_ME_NAKED:$seed:$i}", $html);
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2780
}
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2781
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2782
// Finally, process the HTML
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2783
$html = preg_replace("#\n([ ]*)#", " ", $html);
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2784
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2785
// Remove annoying spaces between tags
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2786
$html = preg_replace("#>([ ][ ]+)<#", "> <", $html);
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2787
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2788
// Re-insert untouchable tags
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2789
for ($i = 0;$i < sizeof($matches[1]); $i++)
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2790
{
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2791
$html = str_replace("{DONT_STRIP_ME_NAKED:$seed:$i}", "<{$matches[1][$i]}{$matches[2][$i]}>{$matches[3][$i]}</{$matches[4][$i]}>", $html);
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2792
}
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2793
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2794
// Remove <enano:no-opt> blocks (can be used by themes that don't want their HTML optimized)
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2795
$html = preg_replace('#<(\/|)enano:no-opt(.*?)>#', '', $html);
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2796
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2797
$size_after = strlen($html);
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2798
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2799
// Tell snoopish users what's going on
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2800
$html = str_replace('<html>', "\n".'<!-- NOTE: Enano has performed an HTML optimization routine on the HTML you see here. This is to enhance page loading speeds.
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2801
To view the uncompressed source of this page, add the "nocompress" parameter to the URI of this page: index.php?title=Main_Page&nocompress or Main_Page?nocompress'."
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2802
Size before compression: $size_before bytes
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2803
Size after compression: $size_after bytes
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2804
-->\n<html>", $html);
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2805
return $html;
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2806
}
cb7dde69c301
Improved and enabled HTML optimization algorithm; enabled gzip compression; added but did not test at all the tag cloud class in includes/tagcloud.php, this is still very preliminary and not ready for any type of production use
Dan
diff
changeset
+ − 2807
1
+ − 2808
//die('<pre>Original: 01010101010100101010100101010101011010'."\nProcessed: ".uncompress_bitfield(compress_bitfield('01010101010100101010100101010101011010')).'</pre>');
+ − 2809
+ − 2810
?>